4 <meta charset=
"utf-8" />
5 <title>BIP39 - Mnemonic Code
</title>
8 * Bootstrap v3.2
.0 (http://getbootstrap.com)
9 * Copyright
2011-
2014 Twitter, Inc.
10 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
13 /*! normalize.css v3.0
.1 | MIT License | git.io/normalize */
15 font-family: sans-serif;
16 -webkit-text-size-adjust:
100%;
17 -ms-text-size-adjust:
100%;
40 display: inline-block;
41 vertical-align: baseline;
43 audio:not([controls]) {
52 background: transparent;
59 border-bottom:
1px dotted;
84 vertical-align: baseline;
103 -webkit-box-sizing: content-box;
104 -moz-box-sizing: content-box;
105 box-sizing: content-box;
114 font-family: monospace, monospace;
131 text-transform: none;
134 html input[
type="button"],
136 input[
type="submit"] {
137 -webkit-appearance: button;
141 html input[disabled] {
144 button::-moz-focus-inner,
145 input::-moz-focus-inner {
152 input[
type="checkbox"],
153 input[
type="radio"] {
154 -webkit-box-sizing: border-box;
155 -moz-box-sizing: border-box;
156 box-sizing: border-box;
159 input[
type="number"]::-webkit-inner-spin-button,
160 input[
type="number"]::-webkit-outer-spin-button {
163 input[
type="search"] {
164 -webkit-box-sizing: content-box;
165 -moz-box-sizing: content-box;
166 box-sizing: content-box;
167 -webkit-appearance: textfield;
169 input[
type="search"]::-webkit-search-cancel-button,
170 input[
type="search"]::-webkit-search-decoration {
171 -webkit-appearance: none;
174 padding:
.35em
.625em
.75em;
176 border:
1px solid #c0c0c0;
190 border-collapse: collapse;
198 color: #
000 !important;
199 text-shadow: none !important;
200 background: transparent !important;
201 -webkit-box-shadow: none !important;
202 box-shadow: none !important;
206 text-decoration: underline;
209 content: " (" attr(href) ")";
212 content: " (" attr(title) ")";
214 a[href^="javascript:"]:after,
220 border:
1px solid #
999;
222 page-break-inside: avoid;
225 display: table-header-group;
229 page-break-inside: avoid;
232 max-width:
100% !important;
242 page-break-after: avoid;
245 background: #fff !important;
252 background-color: #fff !important;
255 .dropup
> .btn
> .caret {
256 border-top-color: #
000 !important;
259 border:
1px solid #
000;
262 border-collapse: collapse !important;
266 border:
1px solid #ddd !important;
270 font-family: 'Glyphicons Halflings';
272 src: url('../fonts/glyphicons-halflings-regular.eot');
273 src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');
278 display: inline-block;
279 font-family: 'Glyphicons Halflings';
284 -webkit-font-smoothing: antialiased;
285 -moz-osx-font-smoothing: grayscale;
287 .glyphicon-asterisk:before {
290 .glyphicon-plus:before {
293 .glyphicon-euro:before {
296 .glyphicon-minus:before {
299 .glyphicon-cloud:before {
302 .glyphicon-envelope:before {
305 .glyphicon-pencil:before {
308 .glyphicon-glass:before {
311 .glyphicon-music:before {
314 .glyphicon-search:before {
317 .glyphicon-heart:before {
320 .glyphicon-star:before {
323 .glyphicon-star-empty:before {
326 .glyphicon-user:before {
329 .glyphicon-film:before {
332 .glyphicon-th-large:before {
335 .glyphicon-th:before {
338 .glyphicon-th-list:before {
341 .glyphicon-ok:before {
344 .glyphicon-remove:before {
347 .glyphicon-zoom-in:before {
350 .glyphicon-zoom-out:before {
353 .glyphicon-off:before {
356 .glyphicon-signal:before {
359 .glyphicon-cog:before {
362 .glyphicon-trash:before {
365 .glyphicon-home:before {
368 .glyphicon-file:before {
371 .glyphicon-time:before {
374 .glyphicon-road:before {
377 .glyphicon-download-alt:before {
380 .glyphicon-download:before {
383 .glyphicon-upload:before {
386 .glyphicon-inbox:before {
389 .glyphicon-play-circle:before {
392 .glyphicon-repeat:before {
395 .glyphicon-refresh:before {
398 .glyphicon-list-alt:before {
401 .glyphicon-lock:before {
404 .glyphicon-flag:before {
407 .glyphicon-headphones:before {
410 .glyphicon-volume-off:before {
413 .glyphicon-volume-down:before {
416 .glyphicon-volume-up:before {
419 .glyphicon-qrcode:before {
422 .glyphicon-barcode:before {
425 .glyphicon-tag:before {
428 .glyphicon-tags:before {
431 .glyphicon-book:before {
434 .glyphicon-bookmark:before {
437 .glyphicon-print:before {
440 .glyphicon-camera:before {
443 .glyphicon-font:before {
446 .glyphicon-bold:before {
449 .glyphicon-italic:before {
452 .glyphicon-text-height:before {
455 .glyphicon-text-width:before {
458 .glyphicon-align-left:before {
461 .glyphicon-align-center:before {
464 .glyphicon-align-right:before {
467 .glyphicon-align-justify:before {
470 .glyphicon-list:before {
473 .glyphicon-indent-left:before {
476 .glyphicon-indent-right:before {
479 .glyphicon-facetime-video:before {
482 .glyphicon-picture:before {
485 .glyphicon-map-marker:before {
488 .glyphicon-adjust:before {
491 .glyphicon-tint:before {
494 .glyphicon-edit:before {
497 .glyphicon-share:before {
500 .glyphicon-check:before {
503 .glyphicon-move:before {
506 .glyphicon-step-backward:before {
509 .glyphicon-fast-backward:before {
512 .glyphicon-backward:before {
515 .glyphicon-play:before {
518 .glyphicon-pause:before {
521 .glyphicon-stop:before {
524 .glyphicon-forward:before {
527 .glyphicon-fast-forward:before {
530 .glyphicon-step-forward:before {
533 .glyphicon-eject:before {
536 .glyphicon-chevron-left:before {
539 .glyphicon-chevron-right:before {
542 .glyphicon-plus-sign:before {
545 .glyphicon-minus-sign:before {
548 .glyphicon-remove-sign:before {
551 .glyphicon-ok-sign:before {
554 .glyphicon-question-sign:before {
557 .glyphicon-info-sign:before {
560 .glyphicon-screenshot:before {
563 .glyphicon-remove-circle:before {
566 .glyphicon-ok-circle:before {
569 .glyphicon-ban-circle:before {
572 .glyphicon-arrow-left:before {
575 .glyphicon-arrow-right:before {
578 .glyphicon-arrow-up:before {
581 .glyphicon-arrow-down:before {
584 .glyphicon-share-alt:before {
587 .glyphicon-resize-full:before {
590 .glyphicon-resize-small:before {
593 .glyphicon-exclamation-sign:before {
596 .glyphicon-gift:before {
599 .glyphicon-leaf:before {
602 .glyphicon-fire:before {
605 .glyphicon-eye-open:before {
608 .glyphicon-eye-close:before {
611 .glyphicon-warning-sign:before {
614 .glyphicon-plane:before {
617 .glyphicon-calendar:before {
620 .glyphicon-random:before {
623 .glyphicon-comment:before {
626 .glyphicon-magnet:before {
629 .glyphicon-chevron-up:before {
632 .glyphicon-chevron-down:before {
635 .glyphicon-retweet:before {
638 .glyphicon-shopping-cart:before {
641 .glyphicon-folder-close:before {
644 .glyphicon-folder-open:before {
647 .glyphicon-resize-vertical:before {
650 .glyphicon-resize-horizontal:before {
653 .glyphicon-hdd:before {
656 .glyphicon-bullhorn:before {
659 .glyphicon-bell:before {
662 .glyphicon-certificate:before {
665 .glyphicon-thumbs-up:before {
668 .glyphicon-thumbs-down:before {
671 .glyphicon-hand-right:before {
674 .glyphicon-hand-left:before {
677 .glyphicon-hand-up:before {
680 .glyphicon-hand-down:before {
683 .glyphicon-circle-arrow-right:before {
686 .glyphicon-circle-arrow-left:before {
689 .glyphicon-circle-arrow-up:before {
692 .glyphicon-circle-arrow-down:before {
695 .glyphicon-globe:before {
698 .glyphicon-wrench:before {
701 .glyphicon-tasks:before {
704 .glyphicon-filter:before {
707 .glyphicon-briefcase:before {
710 .glyphicon-fullscreen:before {
713 .glyphicon-dashboard:before {
716 .glyphicon-paperclip:before {
719 .glyphicon-heart-empty:before {
722 .glyphicon-link:before {
725 .glyphicon-phone:before {
728 .glyphicon-pushpin:before {
731 .glyphicon-usd:before {
734 .glyphicon-gbp:before {
737 .glyphicon-sort:before {
740 .glyphicon-sort-by-alphabet:before {
743 .glyphicon-sort-by-alphabet-alt:before {
746 .glyphicon-sort-by-order:before {
749 .glyphicon-sort-by-order-alt:before {
752 .glyphicon-sort-by-attributes:before {
755 .glyphicon-sort-by-attributes-alt:before {
758 .glyphicon-unchecked:before {
761 .glyphicon-expand:before {
764 .glyphicon-collapse-down:before {
767 .glyphicon-collapse-up:before {
770 .glyphicon-log-in:before {
773 .glyphicon-flash:before {
776 .glyphicon-log-out:before {
779 .glyphicon-new-window:before {
782 .glyphicon-record:before {
785 .glyphicon-save:before {
788 .glyphicon-open:before {
791 .glyphicon-saved:before {
794 .glyphicon-import:before {
797 .glyphicon-export:before {
800 .glyphicon-send:before {
803 .glyphicon-floppy-disk:before {
806 .glyphicon-floppy-saved:before {
809 .glyphicon-floppy-remove:before {
812 .glyphicon-floppy-save:before {
815 .glyphicon-floppy-open:before {
818 .glyphicon-credit-card:before {
821 .glyphicon-transfer:before {
824 .glyphicon-cutlery:before {
827 .glyphicon-header:before {
830 .glyphicon-compressed:before {
833 .glyphicon-earphone:before {
836 .glyphicon-phone-alt:before {
839 .glyphicon-tower:before {
842 .glyphicon-stats:before {
845 .glyphicon-sd-video:before {
848 .glyphicon-hd-video:before {
851 .glyphicon-subtitles:before {
854 .glyphicon-sound-stereo:before {
857 .glyphicon-sound-dolby:before {
860 .glyphicon-sound-
5-
1:before {
863 .glyphicon-sound-
6-
1:before {
866 .glyphicon-sound-
7-
1:before {
869 .glyphicon-copyright-mark:before {
872 .glyphicon-registration-mark:before {
875 .glyphicon-cloud-download:before {
878 .glyphicon-cloud-upload:before {
881 .glyphicon-tree-conifer:before {
884 .glyphicon-tree-deciduous:before {
888 -webkit-box-sizing: border-box;
889 -moz-box-sizing: border-box;
890 box-sizing: border-box;
894 -webkit-box-sizing: border-box;
895 -moz-box-sizing: border-box;
896 box-sizing: border-box;
901 -webkit-tap-highlight-color: rgba(
0,
0,
0,
0);
904 font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
906 line-height:
1.42857143;
908 background-color: #fff;
914 font-family: inherit;
916 line-height: inherit;
920 text-decoration: none;
925 text-decoration: underline;
928 outline: thin dotted;
929 outline:
5px auto -webkit-focus-ring-color;
930 outline-offset: -
2px;
936 vertical-align: middle;
941 .carousel-inner
> .item
> img,
942 .carousel-inner
> .item
> a
> img {
952 display: inline-block;
957 line-height:
1.42857143;
958 background-color: #fff;
959 border:
1px solid #ddd;
961 -webkit-transition: all
.2s ease-in-out;
962 -o-transition: all
.2s ease-in-out;
963 transition: all
.2s ease-in-out;
972 border-top:
1px solid #eee;
981 clip: rect(
0,
0,
0,
0);
984 .sr-only-focusable:active,
985 .sr-only-focusable:focus {
1005 font-family: inherit;
1034 font-weight: normal;
1045 margin-bottom:
10px;
1068 margin-bottom:
10px;
1112 margin-bottom:
20px;
1117 @media (min-width:
768px) {
1132 background-color: #fcf8e3;
1144 text-align: justify;
1147 white-space: nowrap;
1150 text-transform: lowercase;
1153 text-transform: uppercase;
1156 text-transform: capitalize;
1164 a.text-primary:hover {
1170 a.text-success:hover {
1182 a.text-warning:hover {
1188 a.text-danger:hover {
1193 background-color: #
428bca;
1195 a.bg-primary:hover {
1196 background-color: #
3071a9;
1199 background-color: #dff0d8;
1201 a.bg-success:hover {
1202 background-color: #c1e2b3;
1205 background-color: #d9edf7;
1208 background-color: #afd9ee;
1211 background-color: #fcf8e3;
1213 a.bg-warning:hover {
1214 background-color: #f7ecb5;
1217 background-color: #f2dede;
1220 background-color: #e4b9b9;
1223 padding-bottom:
9px;
1224 margin:
40px
0 20px;
1225 border-bottom:
1px solid #eee;
1230 margin-bottom:
10px;
1248 display: inline-block;
1254 margin-bottom:
20px;
1258 line-height:
1.42857143;
1266 @media (min-width:
768px) {
1273 text-overflow: ellipsis;
1274 white-space: nowrap;
1281 abbr[data-original-title] {
1283 border-bottom:
1px dotted #
777;
1287 text-transform: uppercase;
1293 border-left:
5px solid #eee;
1295 blockquote p:last-child,
1296 blockquote ul:last-child,
1297 blockquote ol:last-child {
1305 line-height:
1.42857143;
1308 blockquote footer:before,
1309 blockquote small:before,
1310 blockquote .small:before {
1311 content: '\
2014 \
00A0';
1313 .blockquote-reverse,
1314 blockquote.pull-right {
1315 padding-right:
15px;
1318 border-right:
5px solid #eee;
1321 .blockquote-reverse footer:before,
1322 blockquote.pull-right footer:before,
1323 .blockquote-reverse small:before,
1324 blockquote.pull-right small:before,
1325 .blockquote-reverse .small:before,
1326 blockquote.pull-right .small:before {
1329 .blockquote-reverse footer:after,
1330 blockquote.pull-right footer:after,
1331 .blockquote-reverse small:after,
1332 blockquote.pull-right small:after,
1333 .blockquote-reverse .small:after,
1334 blockquote.pull-right .small:after {
1335 content: '\
00A0 \
2014';
1342 margin-bottom:
20px;
1344 line-height:
1.42857143;
1350 font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
1356 background-color: #f9f2f4;
1363 background-color: #
333;
1365 -webkit-box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.25);
1366 box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.25);
1371 -webkit-box-shadow: none;
1379 line-height:
1.42857143;
1381 word-break: break-all;
1382 word-wrap: break-word;
1383 background-color: #f5f5f5;
1384 border:
1px solid #ccc;
1391 white-space: pre-wrap;
1392 background-color: transparent;
1400 padding-right:
15px;
1405 @media (min-width:
768px) {
1410 @media (min-width:
992px) {
1415 @media (min-width:
1200px) {
1421 padding-right:
15px;
1427 margin-right: -
15px;
1430 .col-xs-
1, .col-sm-
1, .col-md-
1, .col-lg-
1, .col-xs-
2, .col-sm-
2, .col-md-
2, .col-lg-
2, .col-xs-
3, .col-sm-
3, .col-md-
3, .col-lg-
3, .col-xs-
4, .col-sm-
4, .col-md-
4, .col-lg-
4, .col-xs-
5, .col-sm-
5, .col-md-
5, .col-lg-
5, .col-xs-
6, .col-sm-
6, .col-md-
6, .col-lg-
6, .col-xs-
7, .col-sm-
7, .col-md-
7, .col-lg-
7, .col-xs-
8, .col-sm-
8, .col-md-
8, .col-lg-
8, .col-xs-
9, .col-sm-
9, .col-md-
9, .col-lg-
9, .col-xs-
10, .col-sm-
10, .col-md-
10, .col-lg-
10, .col-xs-
11, .col-sm-
11, .col-md-
11, .col-lg-
11, .col-xs-
12, .col-sm-
12, .col-md-
12, .col-lg-
12 {
1433 padding-right:
15px;
1436 .col-xs-
1, .col-xs-
2, .col-xs-
3, .col-xs-
4, .col-xs-
5, .col-xs-
6, .col-xs-
7, .col-xs-
8, .col-xs-
9, .col-xs-
10, .col-xs-
11, .col-xs-
12 {
1443 width:
91.66666667%;
1446 width:
83.33333333%;
1452 width:
66.66666667%;
1455 width:
58.33333333%;
1461 width:
41.66666667%;
1464 width:
33.33333333%;
1470 width:
16.66666667%;
1479 right:
91.66666667%;
1482 right:
83.33333333%;
1488 right:
66.66666667%;
1491 right:
58.33333333%;
1497 right:
41.66666667%;
1500 right:
33.33333333%;
1506 right:
16.66666667%;
1557 margin-left:
91.66666667%;
1560 margin-left:
83.33333333%;
1566 margin-left:
66.66666667%;
1569 margin-left:
58.33333333%;
1575 margin-left:
41.66666667%;
1578 margin-left:
33.33333333%;
1584 margin-left:
16.66666667%;
1587 margin-left:
8.33333333%;
1592 @media (min-width:
768px) {
1593 .col-sm-
1, .col-sm-
2, .col-sm-
3, .col-sm-
4, .col-sm-
5, .col-sm-
6, .col-sm-
7, .col-sm-
8, .col-sm-
9, .col-sm-
10, .col-sm-
11, .col-sm-
12 {
1600 width:
91.66666667%;
1603 width:
83.33333333%;
1609 width:
66.66666667%;
1612 width:
58.33333333%;
1618 width:
41.66666667%;
1621 width:
33.33333333%;
1627 width:
16.66666667%;
1636 right:
91.66666667%;
1639 right:
83.33333333%;
1645 right:
66.66666667%;
1648 right:
58.33333333%;
1654 right:
41.66666667%;
1657 right:
33.33333333%;
1663 right:
16.66666667%;
1714 margin-left:
91.66666667%;
1717 margin-left:
83.33333333%;
1723 margin-left:
66.66666667%;
1726 margin-left:
58.33333333%;
1732 margin-left:
41.66666667%;
1735 margin-left:
33.33333333%;
1741 margin-left:
16.66666667%;
1744 margin-left:
8.33333333%;
1750 @media (min-width:
992px) {
1751 .col-md-
1, .col-md-
2, .col-md-
3, .col-md-
4, .col-md-
5, .col-md-
6, .col-md-
7, .col-md-
8, .col-md-
9, .col-md-
10, .col-md-
11, .col-md-
12 {
1758 width:
91.66666667%;
1761 width:
83.33333333%;
1767 width:
66.66666667%;
1770 width:
58.33333333%;
1776 width:
41.66666667%;
1779 width:
33.33333333%;
1785 width:
16.66666667%;
1794 right:
91.66666667%;
1797 right:
83.33333333%;
1803 right:
66.66666667%;
1806 right:
58.33333333%;
1812 right:
41.66666667%;
1815 right:
33.33333333%;
1821 right:
16.66666667%;
1872 margin-left:
91.66666667%;
1875 margin-left:
83.33333333%;
1881 margin-left:
66.66666667%;
1884 margin-left:
58.33333333%;
1890 margin-left:
41.66666667%;
1893 margin-left:
33.33333333%;
1899 margin-left:
16.66666667%;
1902 margin-left:
8.33333333%;
1908 @media (min-width:
1200px) {
1909 .col-lg-
1, .col-lg-
2, .col-lg-
3, .col-lg-
4, .col-lg-
5, .col-lg-
6, .col-lg-
7, .col-lg-
8, .col-lg-
9, .col-lg-
10, .col-lg-
11, .col-lg-
12 {
1916 width:
91.66666667%;
1919 width:
83.33333333%;
1925 width:
66.66666667%;
1928 width:
58.33333333%;
1934 width:
41.66666667%;
1937 width:
33.33333333%;
1943 width:
16.66666667%;
1952 right:
91.66666667%;
1955 right:
83.33333333%;
1961 right:
66.66666667%;
1964 right:
58.33333333%;
1970 right:
41.66666667%;
1973 right:
33.33333333%;
1979 right:
16.66666667%;
2030 margin-left:
91.66666667%;
2033 margin-left:
83.33333333%;
2039 margin-left:
66.66666667%;
2042 margin-left:
58.33333333%;
2048 margin-left:
41.66666667%;
2051 margin-left:
33.33333333%;
2057 margin-left:
16.66666667%;
2060 margin-left:
8.33333333%;
2067 background-color: transparent;
2075 margin-bottom:
20px;
2077 .table
> thead
> tr
> th,
2078 .table
> tbody
> tr
> th,
2079 .table
> tfoot
> tr
> th,
2080 .table
> thead
> tr
> td,
2081 .table
> tbody
> tr
> td,
2082 .table
> tfoot
> tr
> td {
2084 line-height:
1.42857143;
2085 vertical-align: top;
2086 border-top:
1px solid #ddd;
2088 .table
> thead
> tr
> th {
2089 vertical-align: bottom;
2090 border-bottom:
2px solid #ddd;
2092 .table
> caption + thead
> tr:first-child
> th,
2093 .table
> colgroup + thead
> tr:first-child
> th,
2094 .table
> thead:first-child
> tr:first-child
> th,
2095 .table
> caption + thead
> tr:first-child
> td,
2096 .table
> colgroup + thead
> tr:first-child
> td,
2097 .table
> thead:first-child
> tr:first-child
> td {
2100 .table
> tbody + tbody {
2101 border-top:
2px solid #ddd;
2104 background-color: #fff;
2106 .table-condensed
> thead
> tr
> th,
2107 .table-condensed
> tbody
> tr
> th,
2108 .table-condensed
> tfoot
> tr
> th,
2109 .table-condensed
> thead
> tr
> td,
2110 .table-condensed
> tbody
> tr
> td,
2111 .table-condensed
> tfoot
> tr
> td {
2115 border:
1px solid #ddd;
2117 .table-bordered
> thead
> tr
> th,
2118 .table-bordered
> tbody
> tr
> th,
2119 .table-bordered
> tfoot
> tr
> th,
2120 .table-bordered
> thead
> tr
> td,
2121 .table-bordered
> tbody
> tr
> td,
2122 .table-bordered
> tfoot
> tr
> td {
2123 border:
1px solid #ddd;
2125 .table-bordered
> thead
> tr
> th,
2126 .table-bordered
> thead
> tr
> td {
2127 border-bottom-width:
2px;
2129 .table-striped
> tbody
> tr:nth-child(odd)
> td,
2130 .table-striped
> tbody
> tr:nth-child(odd)
> th {
2131 background-color: #f9f9f9;
2133 .table-hover
> tbody
> tr:hover
> td,
2134 .table-hover
> tbody
> tr:hover
> th {
2135 background-color: #f5f5f5;
2137 table col[class*="col-"] {
2139 display: table-column;
2142 table td[class*="col-"],
2143 table th[class*="col-"] {
2145 display: table-cell;
2148 .table
> thead
> tr
> td.active,
2149 .table
> tbody
> tr
> td.active,
2150 .table
> tfoot
> tr
> td.active,
2151 .table
> thead
> tr
> th.active,
2152 .table
> tbody
> tr
> th.active,
2153 .table
> tfoot
> tr
> th.active,
2154 .table
> thead
> tr.active
> td,
2155 .table
> tbody
> tr.active
> td,
2156 .table
> tfoot
> tr.active
> td,
2157 .table
> thead
> tr.active
> th,
2158 .table
> tbody
> tr.active
> th,
2159 .table
> tfoot
> tr.active
> th {
2160 background-color: #f5f5f5;
2162 .table-hover
> tbody
> tr
> td.active:hover,
2163 .table-hover
> tbody
> tr
> th.active:hover,
2164 .table-hover
> tbody
> tr.active:hover
> td,
2165 .table-hover
> tbody
> tr:hover
> .active,
2166 .table-hover
> tbody
> tr.active:hover
> th {
2167 background-color: #e8e8e8;
2169 .table
> thead
> tr
> td.success,
2170 .table
> tbody
> tr
> td.success,
2171 .table
> tfoot
> tr
> td.success,
2172 .table
> thead
> tr
> th.success,
2173 .table
> tbody
> tr
> th.success,
2174 .table
> tfoot
> tr
> th.success,
2175 .table
> thead
> tr.success
> td,
2176 .table
> tbody
> tr.success
> td,
2177 .table
> tfoot
> tr.success
> td,
2178 .table
> thead
> tr.success
> th,
2179 .table
> tbody
> tr.success
> th,
2180 .table
> tfoot
> tr.success
> th {
2181 background-color: #dff0d8;
2183 .table-hover
> tbody
> tr
> td.success:hover,
2184 .table-hover
> tbody
> tr
> th.success:hover,
2185 .table-hover
> tbody
> tr.success:hover
> td,
2186 .table-hover
> tbody
> tr:hover
> .success,
2187 .table-hover
> tbody
> tr.success:hover
> th {
2188 background-color: #d0e9c6;
2190 .table
> thead
> tr
> td.info,
2191 .table
> tbody
> tr
> td.info,
2192 .table
> tfoot
> tr
> td.info,
2193 .table
> thead
> tr
> th.info,
2194 .table
> tbody
> tr
> th.info,
2195 .table
> tfoot
> tr
> th.info,
2196 .table
> thead
> tr.info
> td,
2197 .table
> tbody
> tr.info
> td,
2198 .table
> tfoot
> tr.info
> td,
2199 .table
> thead
> tr.info
> th,
2200 .table
> tbody
> tr.info
> th,
2201 .table
> tfoot
> tr.info
> th {
2202 background-color: #d9edf7;
2204 .table-hover
> tbody
> tr
> td.info:hover,
2205 .table-hover
> tbody
> tr
> th.info:hover,
2206 .table-hover
> tbody
> tr.info:hover
> td,
2207 .table-hover
> tbody
> tr:hover
> .info,
2208 .table-hover
> tbody
> tr.info:hover
> th {
2209 background-color: #c4e3f3;
2211 .table
> thead
> tr
> td.warning,
2212 .table
> tbody
> tr
> td.warning,
2213 .table
> tfoot
> tr
> td.warning,
2214 .table
> thead
> tr
> th.warning,
2215 .table
> tbody
> tr
> th.warning,
2216 .table
> tfoot
> tr
> th.warning,
2217 .table
> thead
> tr.warning
> td,
2218 .table
> tbody
> tr.warning
> td,
2219 .table
> tfoot
> tr.warning
> td,
2220 .table
> thead
> tr.warning
> th,
2221 .table
> tbody
> tr.warning
> th,
2222 .table
> tfoot
> tr.warning
> th {
2223 background-color: #fcf8e3;
2225 .table-hover
> tbody
> tr
> td.warning:hover,
2226 .table-hover
> tbody
> tr
> th.warning:hover,
2227 .table-hover
> tbody
> tr.warning:hover
> td,
2228 .table-hover
> tbody
> tr:hover
> .warning,
2229 .table-hover
> tbody
> tr.warning:hover
> th {
2230 background-color: #faf2cc;
2232 .table
> thead
> tr
> td.danger,
2233 .table
> tbody
> tr
> td.danger,
2234 .table
> tfoot
> tr
> td.danger,
2235 .table
> thead
> tr
> th.danger,
2236 .table
> tbody
> tr
> th.danger,
2237 .table
> tfoot
> tr
> th.danger,
2238 .table
> thead
> tr.danger
> td,
2239 .table
> tbody
> tr.danger
> td,
2240 .table
> tfoot
> tr.danger
> td,
2241 .table
> thead
> tr.danger
> th,
2242 .table
> tbody
> tr.danger
> th,
2243 .table
> tfoot
> tr.danger
> th {
2244 background-color: #f2dede;
2246 .table-hover
> tbody
> tr
> td.danger:hover,
2247 .table-hover
> tbody
> tr
> th.danger:hover,
2248 .table-hover
> tbody
> tr.danger:hover
> td,
2249 .table-hover
> tbody
> tr:hover
> .danger,
2250 .table-hover
> tbody
> tr.danger:hover
> th {
2251 background-color: #ebcccc;
2253 @media screen and (max-width:
767px) {
2256 margin-bottom:
15px;
2259 -webkit-overflow-scrolling: touch;
2260 -ms-overflow-style: -ms-autohiding-scrollbar;
2261 border:
1px solid #ddd;
2263 .table-responsive
> .table {
2266 .table-responsive
> .table
> thead
> tr
> th,
2267 .table-responsive
> .table
> tbody
> tr
> th,
2268 .table-responsive
> .table
> tfoot
> tr
> th,
2269 .table-responsive
> .table
> thead
> tr
> td,
2270 .table-responsive
> .table
> tbody
> tr
> td,
2271 .table-responsive
> .table
> tfoot
> tr
> td {
2272 white-space: nowrap;
2274 .table-responsive
> .table-bordered {
2277 .table-responsive
> .table-bordered
> thead
> tr
> th:first-child,
2278 .table-responsive
> .table-bordered
> tbody
> tr
> th:first-child,
2279 .table-responsive
> .table-bordered
> tfoot
> tr
> th:first-child,
2280 .table-responsive
> .table-bordered
> thead
> tr
> td:first-child,
2281 .table-responsive
> .table-bordered
> tbody
> tr
> td:first-child,
2282 .table-responsive
> .table-bordered
> tfoot
> tr
> td:first-child {
2285 .table-responsive
> .table-bordered
> thead
> tr
> th:last-child,
2286 .table-responsive
> .table-bordered
> tbody
> tr
> th:last-child,
2287 .table-responsive
> .table-bordered
> tfoot
> tr
> th:last-child,
2288 .table-responsive
> .table-bordered
> thead
> tr
> td:last-child,
2289 .table-responsive
> .table-bordered
> tbody
> tr
> td:last-child,
2290 .table-responsive
> .table-bordered
> tfoot
> tr
> td:last-child {
2293 .table-responsive
> .table-bordered
> tbody
> tr:last-child
> th,
2294 .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> th,
2295 .table-responsive
> .table-bordered
> tbody
> tr:last-child
> td,
2296 .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> td {
2310 margin-bottom:
20px;
2312 line-height: inherit;
2315 border-bottom:
1px solid #e5e5e5;
2318 display: inline-block;
2323 input[
type="search"] {
2324 -webkit-box-sizing: border-box;
2325 -moz-box-sizing: border-box;
2326 box-sizing: border-box;
2328 input[
type="radio"],
2329 input[
type="checkbox"] {
2332 line-height: normal;
2334 input[
type="file"] {
2337 input[
type="range"] {
2345 input[
type="file"]:focus,
2346 input[
type="radio"]:focus,
2347 input[
type="checkbox"]:focus {
2348 outline: thin dotted;
2349 outline:
5px auto -webkit-focus-ring-color;
2350 outline-offset: -
2px;
2356 line-height:
1.42857143;
2365 line-height:
1.42857143;
2367 background-color: #fff;
2368 background-image: none;
2369 border:
1px solid #ccc;
2371 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2372 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2373 -webkit-transition: border-color ease-in-out
.15s, -webkit-box-shadow ease-in-out
.15s;
2374 -o-transition: border-color ease-in-out
.15s, box-shadow ease-in-out
.15s;
2375 transition: border-color ease-in-out
.15s, box-shadow ease-in-out
.15s;
2377 .form-control:focus {
2378 border-color: #
66afe9;
2380 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 8px rgba(
102,
175,
233,
.6);
2381 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 8px rgba(
102,
175,
233,
.6);
2383 .form-control::-moz-placeholder {
2387 .form-control:-ms-input-placeholder {
2390 .form-control::-webkit-input-placeholder {
2393 .form-control[disabled],
2394 .form-control[readonly],
2395 fieldset[disabled] .form-control {
2396 cursor: not-allowed;
2397 background-color: #eee;
2400 textarea.form-control {
2403 input[
type="search"] {
2404 -webkit-appearance: none;
2408 input[
type="datetime-local"],
2409 input[
type="month"] {
2411 line-height:
1.42857143 \
0;
2413 input[
type="date"].input-sm,
2414 input[
type="time"].input-sm,
2415 input[
type="datetime-local"].input-sm,
2416 input[
type="month"].input-sm {
2419 input[
type="date"].input-lg,
2420 input[
type="time"].input-lg,
2421 input[
type="datetime-local"].input-lg,
2422 input[
type="month"].input-lg {
2426 margin-bottom:
15px;
2434 margin-bottom:
10px;
2440 font-weight: normal;
2443 .radio input[
type="radio"],
2444 .radio-inline input[
type="radio"],
2445 .checkbox input[
type="checkbox"],
2446 .checkbox-inline input[
type="checkbox"] {
2452 .checkbox + .checkbox {
2457 display: inline-block;
2460 font-weight: normal;
2461 vertical-align: middle;
2464 .radio-inline + .radio-inline,
2465 .checkbox-inline + .checkbox-inline {
2469 input[
type="radio"][disabled],
2470 input[
type="checkbox"][disabled],
2471 input[
type="radio"].disabled,
2472 input[
type="checkbox"].disabled,
2473 fieldset[disabled] input[
type="radio"],
2474 fieldset[disabled] input[
type="checkbox"] {
2475 cursor: not-allowed;
2477 .radio-inline.disabled,
2478 .checkbox-inline.disabled,
2479 fieldset[disabled] .radio-inline,
2480 fieldset[disabled] .checkbox-inline {
2481 cursor: not-allowed;
2483 .radio.disabled label,
2484 .checkbox.disabled label,
2485 fieldset[disabled] .radio label,
2486 fieldset[disabled] .checkbox label {
2487 cursor: not-allowed;
2489 .form-control-static {
2491 padding-bottom:
7px;
2494 .form-control-static.input-lg,
2495 .form-control-static.input-sm {
2500 .form-horizontal .form-group-sm .form-control {
2512 select[multiple].input-sm {
2516 .form-horizontal .form-group-lg .form-control {
2528 select[multiple].input-lg {
2534 .has-feedback .form-control {
2535 padding-right:
42.5px;
2537 .form-control-feedback {
2548 .input-lg + .form-control-feedback {
2553 .input-sm + .form-control-feedback {
2558 .has-success .help-block,
2559 .has-success .control-label,
2560 .has-success .radio,
2561 .has-success .checkbox,
2562 .has-success .radio-inline,
2563 .has-success .checkbox-inline {
2566 .has-success .form-control {
2567 border-color: #
3c763d;
2568 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2569 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2571 .has-success .form-control:focus {
2572 border-color: #
2b542c;
2573 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #
67b168;
2574 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #
67b168;
2576 .has-success .input-group-addon {
2578 background-color: #dff0d8;
2579 border-color: #
3c763d;
2581 .has-success .form-control-feedback {
2584 .has-warning .help-block,
2585 .has-warning .control-label,
2586 .has-warning .radio,
2587 .has-warning .checkbox,
2588 .has-warning .radio-inline,
2589 .has-warning .checkbox-inline {
2592 .has-warning .form-control {
2593 border-color: #
8a6d3b;
2594 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2595 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2597 .has-warning .form-control:focus {
2598 border-color: #
66512c;
2599 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #c0a16b;
2600 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #c0a16b;
2602 .has-warning .input-group-addon {
2604 background-color: #fcf8e3;
2605 border-color: #
8a6d3b;
2607 .has-warning .form-control-feedback {
2610 .has-error .help-block,
2611 .has-error .control-label,
2613 .has-error .checkbox,
2614 .has-error .radio-inline,
2615 .has-error .checkbox-inline {
2618 .has-error .form-control {
2619 border-color: #a94442;
2620 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2621 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075);
2623 .has-error .form-control:focus {
2624 border-color: #
843534;
2625 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #ce8483;
2626 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.075),
0 0 6px #ce8483;
2628 .has-error .input-group-addon {
2630 background-color: #f2dede;
2631 border-color: #a94442;
2633 .has-error .form-control-feedback {
2636 .has-feedback label.sr-only ~ .form-control-feedback {
2642 margin-bottom:
10px;
2645 @media (min-width:
768px) {
2646 .form-inline .form-group {
2647 display: inline-block;
2649 vertical-align: middle;
2651 .form-inline .form-control {
2652 display: inline-block;
2654 vertical-align: middle;
2656 .form-inline .input-group {
2657 display: inline-table;
2658 vertical-align: middle;
2660 .form-inline .input-group .input-group-addon,
2661 .form-inline .input-group .input-group-btn,
2662 .form-inline .input-group .form-control {
2665 .form-inline .input-group
> .form-control {
2668 .form-inline .control-label {
2670 vertical-align: middle;
2672 .form-inline .radio,
2673 .form-inline .checkbox {
2674 display: inline-block;
2677 vertical-align: middle;
2679 .form-inline .radio label,
2680 .form-inline .checkbox label {
2683 .form-inline .radio input[
type="radio"],
2684 .form-inline .checkbox input[
type="checkbox"] {
2688 .form-inline .has-feedback .form-control-feedback {
2692 .form-horizontal .radio,
2693 .form-horizontal .checkbox,
2694 .form-horizontal .radio-inline,
2695 .form-horizontal .checkbox-inline {
2700 .form-horizontal .radio,
2701 .form-horizontal .checkbox {
2704 .form-horizontal .form-group {
2705 margin-right: -
15px;
2708 @media (min-width:
768px) {
2709 .form-horizontal .control-label {
2715 .form-horizontal .has-feedback .form-control-feedback {
2719 @media (min-width:
768px) {
2720 .form-horizontal .form-group-lg .control-label {
2721 padding-top:
14.3px;
2724 @media (min-width:
768px) {
2725 .form-horizontal .form-group-sm .control-label {
2730 display: inline-block;
2734 font-weight: normal;
2735 line-height:
1.42857143;
2737 white-space: nowrap;
2738 vertical-align: middle;
2740 -webkit-user-select: none;
2741 -moz-user-select: none;
2742 -ms-user-select: none;
2744 background-image: none;
2745 border:
1px solid transparent;
2751 outline: thin dotted;
2752 outline:
5px auto -webkit-focus-ring-color;
2753 outline-offset: -
2px;
2758 text-decoration: none;
2762 background-image: none;
2764 -webkit-box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
2765 box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
2769 fieldset[disabled] .btn {
2770 pointer-events: none;
2771 cursor: not-allowed;
2772 filter: alpha(opacity=
65);
2773 -webkit-box-shadow: none;
2779 background-color: #fff;
2784 .btn-default:active,
2785 .btn-default.active,
2786 .open
> .dropdown-toggle.btn-default {
2788 background-color: #e6e6e6;
2789 border-color: #adadad;
2791 .btn-default:active,
2792 .btn-default.active,
2793 .open
> .dropdown-toggle.btn-default {
2794 background-image: none;
2796 .btn-default.disabled,
2797 .btn-default[disabled],
2798 fieldset[disabled] .btn-default,
2799 .btn-default.disabled:hover,
2800 .btn-default[disabled]:hover,
2801 fieldset[disabled] .btn-default:hover,
2802 .btn-default.disabled:focus,
2803 .btn-default[disabled]:focus,
2804 fieldset[disabled] .btn-default:focus,
2805 .btn-default.disabled:active,
2806 .btn-default[disabled]:active,
2807 fieldset[disabled] .btn-default:active,
2808 .btn-default.disabled.active,
2809 .btn-default[disabled].active,
2810 fieldset[disabled] .btn-default.active {
2811 background-color: #fff;
2814 .btn-default .badge {
2816 background-color: #
333;
2820 background-color: #
428bca;
2821 border-color: #
357ebd;
2825 .btn-primary:active,
2826 .btn-primary.active,
2827 .open
> .dropdown-toggle.btn-primary {
2829 background-color: #
3071a9;
2830 border-color: #
285e8e;
2832 .btn-primary:active,
2833 .btn-primary.active,
2834 .open
> .dropdown-toggle.btn-primary {
2835 background-image: none;
2837 .btn-primary.disabled,
2838 .btn-primary[disabled],
2839 fieldset[disabled] .btn-primary,
2840 .btn-primary.disabled:hover,
2841 .btn-primary[disabled]:hover,
2842 fieldset[disabled] .btn-primary:hover,
2843 .btn-primary.disabled:focus,
2844 .btn-primary[disabled]:focus,
2845 fieldset[disabled] .btn-primary:focus,
2846 .btn-primary.disabled:active,
2847 .btn-primary[disabled]:active,
2848 fieldset[disabled] .btn-primary:active,
2849 .btn-primary.disabled.active,
2850 .btn-primary[disabled].active,
2851 fieldset[disabled] .btn-primary.active {
2852 background-color: #
428bca;
2853 border-color: #
357ebd;
2855 .btn-primary .badge {
2857 background-color: #fff;
2861 background-color: #
5cb85c;
2862 border-color: #
4cae4c;
2866 .btn-success:active,
2867 .btn-success.active,
2868 .open
> .dropdown-toggle.btn-success {
2870 background-color: #
449d44;
2871 border-color: #
398439;
2873 .btn-success:active,
2874 .btn-success.active,
2875 .open
> .dropdown-toggle.btn-success {
2876 background-image: none;
2878 .btn-success.disabled,
2879 .btn-success[disabled],
2880 fieldset[disabled] .btn-success,
2881 .btn-success.disabled:hover,
2882 .btn-success[disabled]:hover,
2883 fieldset[disabled] .btn-success:hover,
2884 .btn-success.disabled:focus,
2885 .btn-success[disabled]:focus,
2886 fieldset[disabled] .btn-success:focus,
2887 .btn-success.disabled:active,
2888 .btn-success[disabled]:active,
2889 fieldset[disabled] .btn-success:active,
2890 .btn-success.disabled.active,
2891 .btn-success[disabled].active,
2892 fieldset[disabled] .btn-success.active {
2893 background-color: #
5cb85c;
2894 border-color: #
4cae4c;
2896 .btn-success .badge {
2898 background-color: #fff;
2902 background-color: #
5bc0de;
2903 border-color: #
46b8da;
2909 .open
> .dropdown-toggle.btn-info {
2911 background-color: #
31b0d5;
2912 border-color: #
269abc;
2916 .open
> .dropdown-toggle.btn-info {
2917 background-image: none;
2920 .btn-info[disabled],
2921 fieldset[disabled] .btn-info,
2922 .btn-info.disabled:hover,
2923 .btn-info[disabled]:hover,
2924 fieldset[disabled] .btn-info:hover,
2925 .btn-info.disabled:focus,
2926 .btn-info[disabled]:focus,
2927 fieldset[disabled] .btn-info:focus,
2928 .btn-info.disabled:active,
2929 .btn-info[disabled]:active,
2930 fieldset[disabled] .btn-info:active,
2931 .btn-info.disabled.active,
2932 .btn-info[disabled].active,
2933 fieldset[disabled] .btn-info.active {
2934 background-color: #
5bc0de;
2935 border-color: #
46b8da;
2939 background-color: #fff;
2943 background-color: #f0ad4e;
2944 border-color: #eea236;
2948 .btn-warning:active,
2949 .btn-warning.active,
2950 .open
> .dropdown-toggle.btn-warning {
2952 background-color: #ec971f;
2953 border-color: #d58512;
2955 .btn-warning:active,
2956 .btn-warning.active,
2957 .open
> .dropdown-toggle.btn-warning {
2958 background-image: none;
2960 .btn-warning.disabled,
2961 .btn-warning[disabled],
2962 fieldset[disabled] .btn-warning,
2963 .btn-warning.disabled:hover,
2964 .btn-warning[disabled]:hover,
2965 fieldset[disabled] .btn-warning:hover,
2966 .btn-warning.disabled:focus,
2967 .btn-warning[disabled]:focus,
2968 fieldset[disabled] .btn-warning:focus,
2969 .btn-warning.disabled:active,
2970 .btn-warning[disabled]:active,
2971 fieldset[disabled] .btn-warning:active,
2972 .btn-warning.disabled.active,
2973 .btn-warning[disabled].active,
2974 fieldset[disabled] .btn-warning.active {
2975 background-color: #f0ad4e;
2976 border-color: #eea236;
2978 .btn-warning .badge {
2980 background-color: #fff;
2984 background-color: #d9534f;
2985 border-color: #d43f3a;
2991 .open
> .dropdown-toggle.btn-danger {
2993 background-color: #c9302c;
2994 border-color: #ac2925;
2998 .open
> .dropdown-toggle.btn-danger {
2999 background-image: none;
3001 .btn-danger.disabled,
3002 .btn-danger[disabled],
3003 fieldset[disabled] .btn-danger,
3004 .btn-danger.disabled:hover,
3005 .btn-danger[disabled]:hover,
3006 fieldset[disabled] .btn-danger:hover,
3007 .btn-danger.disabled:focus,
3008 .btn-danger[disabled]:focus,
3009 fieldset[disabled] .btn-danger:focus,
3010 .btn-danger.disabled:active,
3011 .btn-danger[disabled]:active,
3012 fieldset[disabled] .btn-danger:active,
3013 .btn-danger.disabled.active,
3014 .btn-danger[disabled].active,
3015 fieldset[disabled] .btn-danger.active {
3016 background-color: #d9534f;
3017 border-color: #d43f3a;
3019 .btn-danger .badge {
3021 background-color: #fff;
3024 font-weight: normal;
3031 .btn-link[disabled],
3032 fieldset[disabled] .btn-link {
3033 background-color: transparent;
3034 -webkit-box-shadow: none;
3041 border-color: transparent;
3046 text-decoration: underline;
3047 background-color: transparent;
3049 .btn-link[disabled]:hover,
3050 fieldset[disabled] .btn-link:hover,
3051 .btn-link[disabled]:focus,
3052 fieldset[disabled] .btn-link:focus {
3054 text-decoration: none;
3057 .btn-group-lg
> .btn {
3064 .btn-group-sm
> .btn {
3071 .btn-group-xs
> .btn {
3081 .btn-block + .btn-block {
3084 input[
type="submit"].btn-block,
3085 input[
type="reset"].btn-block,
3086 input[
type="button"].btn-block {
3091 -webkit-transition: opacity
.15s linear;
3092 -o-transition: opacity
.15s linear;
3093 transition: opacity
.15s linear;
3108 display: table-row-group;
3114 -webkit-transition: height
.35s ease;
3115 -o-transition: height
.35s ease;
3116 transition: height
.35s ease;
3119 display: inline-block;
3123 vertical-align: middle;
3124 border-top:
4px solid;
3125 border-right:
4px solid transparent;
3126 border-left:
4px solid transparent;
3131 .dropdown-toggle:focus {
3147 background-color: #fff;
3148 -webkit-background-clip: padding-box;
3149 background-clip: padding-box;
3150 border:
1px solid #ccc;
3151 border:
1px solid rgba(
0,
0,
0,
.15);
3153 -webkit-box-shadow:
0 6px
12px rgba(
0,
0,
0,
.175);
3154 box-shadow:
0 6px
12px rgba(
0,
0,
0,
.175);
3156 .dropdown-menu.pull-right {
3160 .dropdown-menu .divider {
3164 background-color: #e5e5e5;
3166 .dropdown-menu
> li
> a {
3170 font-weight: normal;
3171 line-height:
1.42857143;
3173 white-space: nowrap;
3175 .dropdown-menu
> li
> a:hover,
3176 .dropdown-menu
> li
> a:focus {
3178 text-decoration: none;
3179 background-color: #f5f5f5;
3181 .dropdown-menu
> .active
> a,
3182 .dropdown-menu
> .active
> a:hover,
3183 .dropdown-menu
> .active
> a:focus {
3185 text-decoration: none;
3186 background-color: #
428bca;
3189 .dropdown-menu
> .disabled
> a,
3190 .dropdown-menu
> .disabled
> a:hover,
3191 .dropdown-menu
> .disabled
> a:focus {
3194 .dropdown-menu
> .disabled
> a:hover,
3195 .dropdown-menu
> .disabled
> a:focus {
3196 text-decoration: none;
3197 cursor: not-allowed;
3198 background-color: transparent;
3199 background-image: none;
3200 filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
3202 .open
> .dropdown-menu {
3208 .dropdown-menu-right {
3212 .dropdown-menu-left {
3220 line-height:
1.42857143;
3222 white-space: nowrap;
3224 .dropdown-backdrop {
3232 .pull-right
> .dropdown-menu {
3237 .navbar-fixed-bottom .dropdown .caret {
3240 border-bottom:
4px solid;
3242 .dropup .dropdown-menu,
3243 .navbar-fixed-bottom .dropdown .dropdown-menu {
3248 @media (min-width:
768px) {
3249 .navbar-right .dropdown-menu {
3253 .navbar-right .dropdown-menu-left {
3259 .btn-group-vertical {
3261 display: inline-block;
3262 vertical-align: middle;
3265 .btn-group-vertical
> .btn {
3269 .btn-group
> .btn:hover,
3270 .btn-group-vertical
> .btn:hover,
3271 .btn-group
> .btn:focus,
3272 .btn-group-vertical
> .btn:focus,
3273 .btn-group
> .btn:active,
3274 .btn-group-vertical
> .btn:active,
3275 .btn-group
> .btn.active,
3276 .btn-group-vertical
> .btn.active {
3279 .btn-group
> .btn:focus,
3280 .btn-group-vertical
> .btn:focus {
3283 .btn-group .btn + .btn,
3284 .btn-group .btn + .btn-group,
3285 .btn-group .btn-group + .btn,
3286 .btn-group .btn-group + .btn-group {
3292 .btn-toolbar .btn-group,
3293 .btn-toolbar .input-group {
3296 .btn-toolbar
> .btn,
3297 .btn-toolbar
> .btn-group,
3298 .btn-toolbar
> .input-group {
3301 .btn-group
> .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {
3304 .btn-group
> .btn:first-child {
3307 .btn-group
> .btn:first-child:not(:last-child):not(.dropdown-toggle) {
3308 border-top-right-radius:
0;
3309 border-bottom-right-radius:
0;
3311 .btn-group
> .btn:last-child:not(:first-child),
3312 .btn-group
> .dropdown-toggle:not(:first-child) {
3313 border-top-left-radius:
0;
3314 border-bottom-left-radius:
0;
3316 .btn-group
> .btn-group {
3319 .btn-group
> .btn-group:not(:first-child):not(:last-child)
> .btn {
3322 .btn-group
> .btn-group:first-child
> .btn:last-child,
3323 .btn-group
> .btn-group:first-child
> .dropdown-toggle {
3324 border-top-right-radius:
0;
3325 border-bottom-right-radius:
0;
3327 .btn-group
> .btn-group:last-child
> .btn:first-child {
3328 border-top-left-radius:
0;
3329 border-bottom-left-radius:
0;
3331 .btn-group .dropdown-toggle:active,
3332 .btn-group.open .dropdown-toggle {
3335 .btn-group
> .btn + .dropdown-toggle {
3339 .btn-group
> .btn-lg + .dropdown-toggle {
3340 padding-right:
12px;
3343 .btn-group.open .dropdown-toggle {
3344 -webkit-box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
3345 box-shadow: inset
0 3px
5px rgba(
0,
0,
0,
.125);
3347 .btn-group.open .dropdown-toggle.btn-link {
3348 -webkit-box-shadow: none;
3355 border-width:
5px
5px
0;
3356 border-bottom-width:
0;
3358 .dropup .btn-lg .caret {
3359 border-width:
0 5px
5px;
3361 .btn-group-vertical
> .btn,
3362 .btn-group-vertical
> .btn-group,
3363 .btn-group-vertical
> .btn-group
> .btn {
3369 .btn-group-vertical
> .btn-group
> .btn {
3372 .btn-group-vertical
> .btn + .btn,
3373 .btn-group-vertical
> .btn + .btn-group,
3374 .btn-group-vertical
> .btn-group + .btn,
3375 .btn-group-vertical
> .btn-group + .btn-group {
3379 .btn-group-vertical
> .btn:not(:first-child):not(:last-child) {
3382 .btn-group-vertical
> .btn:first-child:not(:last-child) {
3383 border-top-right-radius:
4px;
3384 border-bottom-right-radius:
0;
3385 border-bottom-left-radius:
0;
3387 .btn-group-vertical
> .btn:last-child:not(:first-child) {
3388 border-top-left-radius:
0;
3389 border-top-right-radius:
0;
3390 border-bottom-left-radius:
4px;
3392 .btn-group-vertical
> .btn-group:not(:first-child):not(:last-child)
> .btn {
3395 .btn-group-vertical
> .btn-group:first-child:not(:last-child)
> .btn:last-child,
3396 .btn-group-vertical
> .btn-group:first-child:not(:last-child)
> .dropdown-toggle {
3397 border-bottom-right-radius:
0;
3398 border-bottom-left-radius:
0;
3400 .btn-group-vertical
> .btn-group:last-child:not(:first-child)
> .btn:first-child {
3401 border-top-left-radius:
0;
3402 border-top-right-radius:
0;
3404 .btn-group-justified {
3407 table-layout: fixed;
3408 border-collapse: separate;
3410 .btn-group-justified
> .btn,
3411 .btn-group-justified
> .btn-group {
3412 display: table-cell;
3416 .btn-group-justified
> .btn-group .btn {
3419 .btn-group-justified
> .btn-group .dropdown-menu {
3422 [
data-toggle="buttons"]
> .btn
> input[
type="radio"],
3423 [
data-toggle="buttons"]
> .btn
> input[
type="checkbox"] {
3426 filter: alpha(opacity=
0);
3432 border-collapse: separate;
3434 .input-group[class*="col-"] {
3439 .input-group .form-control {
3446 .input-group-lg
> .form-control,
3447 .input-group-lg
> .input-group-addon,
3448 .input-group-lg
> .input-group-btn
> .btn {
3455 select.input-group-lg
> .form-control,
3456 select.input-group-lg
> .input-group-addon,
3457 select.input-group-lg
> .input-group-btn
> .btn {
3461 textarea.input-group-lg
> .form-control,
3462 textarea.input-group-lg
> .input-group-addon,
3463 textarea.input-group-lg
> .input-group-btn
> .btn,
3464 select[multiple].input-group-lg
> .form-control,
3465 select[multiple].input-group-lg
> .input-group-addon,
3466 select[multiple].input-group-lg
> .input-group-btn
> .btn {
3469 .input-group-sm
> .form-control,
3470 .input-group-sm
> .input-group-addon,
3471 .input-group-sm
> .input-group-btn
> .btn {
3478 select.input-group-sm
> .form-control,
3479 select.input-group-sm
> .input-group-addon,
3480 select.input-group-sm
> .input-group-btn
> .btn {
3484 textarea.input-group-sm
> .form-control,
3485 textarea.input-group-sm
> .input-group-addon,
3486 textarea.input-group-sm
> .input-group-btn
> .btn,
3487 select[multiple].input-group-sm
> .form-control,
3488 select[multiple].input-group-sm
> .input-group-addon,
3489 select[multiple].input-group-sm
> .input-group-btn
> .btn {
3494 .input-group .form-control {
3495 display: table-cell;
3497 .input-group-addon:not(:first-child):not(:last-child),
3498 .input-group-btn:not(:first-child):not(:last-child),
3499 .input-group .form-control:not(:first-child):not(:last-child) {
3505 white-space: nowrap;
3506 vertical-align: middle;
3508 .input-group-addon {
3511 font-weight: normal;
3515 background-color: #eee;
3516 border:
1px solid #ccc;
3519 .input-group-addon.input-sm {
3524 .input-group-addon.input-lg {
3529 .input-group-addon input[
type="radio"],
3530 .input-group-addon input[
type="checkbox"] {
3533 .input-group .form-control:first-child,
3534 .input-group-addon:first-child,
3535 .input-group-btn:first-child
> .btn,
3536 .input-group-btn:first-child
> .btn-group
> .btn,
3537 .input-group-btn:first-child
> .dropdown-toggle,
3538 .input-group-btn:last-child
> .btn:not(:last-child):not(.dropdown-toggle),
3539 .input-group-btn:last-child
> .btn-group:not(:last-child)
> .btn {
3540 border-top-right-radius:
0;
3541 border-bottom-right-radius:
0;
3543 .input-group-addon:first-child {
3546 .input-group .form-control:last-child,
3547 .input-group-addon:last-child,
3548 .input-group-btn:last-child
> .btn,
3549 .input-group-btn:last-child
> .btn-group
> .btn,
3550 .input-group-btn:last-child
> .dropdown-toggle,
3551 .input-group-btn:first-child
> .btn:not(:first-child),
3552 .input-group-btn:first-child
> .btn-group:not(:first-child)
> .btn {
3553 border-top-left-radius:
0;
3554 border-bottom-left-radius:
0;
3556 .input-group-addon:last-child {
3562 white-space: nowrap;
3564 .input-group-btn
> .btn {
3567 .input-group-btn
> .btn + .btn {
3570 .input-group-btn
> .btn:hover,
3571 .input-group-btn
> .btn:focus,
3572 .input-group-btn
> .btn:active {
3575 .input-group-btn:first-child
> .btn,
3576 .input-group-btn:first-child
> .btn-group {
3579 .input-group-btn:last-child
> .btn,
3580 .input-group-btn:last-child
> .btn-group {
3597 .nav
> li
> a:hover,
3598 .nav
> li
> a:focus {
3599 text-decoration: none;
3600 background-color: #eee;
3602 .nav
> li.disabled
> a {
3605 .nav
> li.disabled
> a:hover,
3606 .nav
> li.disabled
> a:focus {
3608 text-decoration: none;
3609 cursor: not-allowed;
3610 background-color: transparent;
3613 .nav .open
> a:hover,
3614 .nav .open
> a:focus {
3615 background-color: #eee;
3616 border-color: #
428bca;
3622 background-color: #e5e5e5;
3624 .nav
> li
> a
> img {
3628 border-bottom:
1px solid #ddd;
3632 margin-bottom: -
1px;
3634 .nav-tabs
> li
> a {
3636 line-height:
1.42857143;
3637 border:
1px solid transparent;
3638 border-radius:
4px
4px
0 0;
3640 .nav-tabs
> li
> a:hover {
3641 border-color: #eee #eee #ddd;
3643 .nav-tabs
> li.active
> a,
3644 .nav-tabs
> li.active
> a:hover,
3645 .nav-tabs
> li.active
> a:focus {
3648 background-color: #fff;
3649 border:
1px solid #ddd;
3650 border-bottom-color: transparent;
3652 .nav-tabs.nav-justified {
3656 .nav-tabs.nav-justified
> li {
3659 .nav-tabs.nav-justified
> li
> a {
3663 .nav-tabs.nav-justified
> .dropdown .dropdown-menu {
3667 @media (min-width:
768px) {
3668 .nav-tabs.nav-justified
> li {
3669 display: table-cell;
3672 .nav-tabs.nav-justified
> li
> a {
3676 .nav-tabs.nav-justified
> li
> a {
3680 .nav-tabs.nav-justified
> .active
> a,
3681 .nav-tabs.nav-justified
> .active
> a:hover,
3682 .nav-tabs.nav-justified
> .active
> a:focus {
3683 border:
1px solid #ddd;
3685 @media (min-width:
768px) {
3686 .nav-tabs.nav-justified
> li
> a {
3687 border-bottom:
1px solid #ddd;
3688 border-radius:
4px
4px
0 0;
3690 .nav-tabs.nav-justified
> .active
> a,
3691 .nav-tabs.nav-justified
> .active
> a:hover,
3692 .nav-tabs.nav-justified
> .active
> a:focus {
3693 border-bottom-color: #fff;
3699 .nav-pills
> li
> a {
3702 .nav-pills
> li + li {
3705 .nav-pills
> li.active
> a,
3706 .nav-pills
> li.active
> a:hover,
3707 .nav-pills
> li.active
> a:focus {
3709 background-color: #
428bca;
3714 .nav-stacked
> li + li {
3721 .nav-justified
> li {
3724 .nav-justified
> li
> a {
3728 .nav-justified
> .dropdown .dropdown-menu {
3732 @media (min-width:
768px) {
3733 .nav-justified
> li {
3734 display: table-cell;
3737 .nav-justified
> li
> a {
3741 .nav-tabs-justified {
3744 .nav-tabs-justified
> li
> a {
3748 .nav-tabs-justified
> .active
> a,
3749 .nav-tabs-justified
> .active
> a:hover,
3750 .nav-tabs-justified
> .active
> a:focus {
3751 border:
1px solid #ddd;
3753 @media (min-width:
768px) {
3754 .nav-tabs-justified
> li
> a {
3755 border-bottom:
1px solid #ddd;
3756 border-radius:
4px
4px
0 0;
3758 .nav-tabs-justified
> .active
> a,
3759 .nav-tabs-justified
> .active
> a:hover,
3760 .nav-tabs-justified
> .active
> a:focus {
3761 border-bottom-color: #fff;
3764 .tab-content
> .tab-pane {
3767 .tab-content
> .active {
3770 .nav-tabs .dropdown-menu {
3772 border-top-left-radius:
0;
3773 border-top-right-radius:
0;
3778 margin-bottom:
20px;
3779 border:
1px solid transparent;
3781 @media (min-width:
768px) {
3786 @media (min-width:
768px) {
3792 padding-right:
15px;
3794 overflow-x: visible;
3795 -webkit-overflow-scrolling: touch;
3796 border-top:
1px solid transparent;
3797 -webkit-box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1);
3798 box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1);
3800 .navbar-collapse.in {
3803 @media (min-width:
768px) {
3807 -webkit-box-shadow: none;
3810 .navbar-collapse.collapse {
3811 display: block !important;
3812 height: auto !important;
3814 overflow: visible !important;
3816 .navbar-collapse.in {
3817 overflow-y: visible;
3819 .navbar-fixed-top .navbar-collapse,
3820 .navbar-static-top .navbar-collapse,
3821 .navbar-fixed-bottom .navbar-collapse {
3826 .navbar-fixed-top .navbar-collapse,
3827 .navbar-fixed-bottom .navbar-collapse {
3830 @media (max-width:
480px) and (orientation: landscape) {
3831 .navbar-fixed-top .navbar-collapse,
3832 .navbar-fixed-bottom .navbar-collapse {
3836 .container
> .navbar-header,
3837 .container-fluid
> .navbar-header,
3838 .container
> .navbar-collapse,
3839 .container-fluid
> .navbar-collapse {
3840 margin-right: -
15px;
3843 @media (min-width:
768px) {
3844 .container
> .navbar-header,
3845 .container-fluid
> .navbar-header,
3846 .container
> .navbar-collapse,
3847 .container-fluid
> .navbar-collapse {
3852 .navbar-static-top {
3854 border-width:
0 0 1px;
3856 @media (min-width:
768px) {
3857 .navbar-static-top {
3862 .navbar-fixed-bottom {
3867 -webkit-transform: translate3d(
0,
0,
0);
3868 -o-transform: translate3d(
0,
0,
0);
3869 transform: translate3d(
0,
0,
0);
3871 @media (min-width:
768px) {
3873 .navbar-fixed-bottom {
3879 border-width:
0 0 1px;
3881 .navbar-fixed-bottom {
3884 border-width:
1px
0 0;
3893 .navbar-brand:hover,
3894 .navbar-brand:focus {
3895 text-decoration: none;
3897 @media (min-width:
768px) {
3898 .navbar
> .container .navbar-brand,
3899 .navbar
> .container-fluid .navbar-brand {
3910 background-color: transparent;
3911 background-image: none;
3912 border:
1px solid transparent;
3915 .navbar-toggle:focus {
3918 .navbar-toggle .icon-bar {
3924 .navbar-toggle .icon-bar + .icon-bar {
3927 @media (min-width:
768px) {
3933 margin:
7.5px -
15px;
3935 .navbar-nav
> li
> a {
3937 padding-bottom:
10px;
3940 @media (max-width:
767px) {
3941 .navbar-nav .open .dropdown-menu {
3946 background-color: transparent;
3948 -webkit-box-shadow: none;
3951 .navbar-nav .open .dropdown-menu
> li
> a,
3952 .navbar-nav .open .dropdown-menu .dropdown-header {
3953 padding:
5px
15px
5px
25px;
3955 .navbar-nav .open .dropdown-menu
> li
> a {
3958 .navbar-nav .open .dropdown-menu
> li
> a:hover,
3959 .navbar-nav .open .dropdown-menu
> li
> a:focus {
3960 background-image: none;
3963 @media (min-width:
768px) {
3971 .navbar-nav
> li
> a {
3973 padding-bottom:
15px;
3975 .navbar-nav.navbar-right:last-child {
3976 margin-right: -
15px;
3979 @media (min-width:
768px) {
3981 float: left !important;
3984 float: right !important;
3990 margin-right: -
15px;
3993 border-top:
1px solid transparent;
3994 border-bottom:
1px solid transparent;
3995 -webkit-box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1),
0 1px
0 rgba(
255,
255,
255,
.1);
3996 box-shadow: inset
0 1px
0 rgba(
255,
255,
255,
.1),
0 1px
0 rgba(
255,
255,
255,
.1);
3998 @media (min-width:
768px) {
3999 .navbar-form .form-group {
4000 display: inline-block;
4002 vertical-align: middle;
4004 .navbar-form .form-control {
4005 display: inline-block;
4007 vertical-align: middle;
4009 .navbar-form .input-group {
4010 display: inline-table;
4011 vertical-align: middle;
4013 .navbar-form .input-group .input-group-addon,
4014 .navbar-form .input-group .input-group-btn,
4015 .navbar-form .input-group .form-control {
4018 .navbar-form .input-group
> .form-control {
4021 .navbar-form .control-label {
4023 vertical-align: middle;
4025 .navbar-form .radio,
4026 .navbar-form .checkbox {
4027 display: inline-block;
4030 vertical-align: middle;
4032 .navbar-form .radio label,
4033 .navbar-form .checkbox label {
4036 .navbar-form .radio input[
type="radio"],
4037 .navbar-form .checkbox input[
type="checkbox"] {
4041 .navbar-form .has-feedback .form-control-feedback {
4045 @media (max-width:
767px) {
4046 .navbar-form .form-group {
4050 @media (min-width:
768px) {
4058 -webkit-box-shadow: none;
4061 .navbar-form.navbar-right:last-child {
4062 margin-right: -
15px;
4065 .navbar-nav
> li
> .dropdown-menu {
4067 border-top-left-radius:
0;
4068 border-top-right-radius:
0;
4070 .navbar-fixed-bottom .navbar-nav
> li
> .dropdown-menu {
4071 border-bottom-right-radius:
0;
4072 border-bottom-left-radius:
0;
4078 .navbar-btn.btn-sm {
4080 margin-bottom:
10px;
4082 .navbar-btn.btn-xs {
4084 margin-bottom:
14px;
4088 margin-bottom:
15px;
4090 @media (min-width:
768px) {
4096 .navbar-text.navbar-right:last-child {
4101 background-color: #f8f8f8;
4102 border-color: #e7e7e7;
4104 .navbar-default .navbar-brand {
4107 .navbar-default .navbar-brand:hover,
4108 .navbar-default .navbar-brand:focus {
4110 background-color: transparent;
4112 .navbar-default .navbar-text {
4115 .navbar-default .navbar-nav
> li
> a {
4118 .navbar-default .navbar-nav
> li
> a:hover,
4119 .navbar-default .navbar-nav
> li
> a:focus {
4121 background-color: transparent;
4123 .navbar-default .navbar-nav
> .active
> a,
4124 .navbar-default .navbar-nav
> .active
> a:hover,
4125 .navbar-default .navbar-nav
> .active
> a:focus {
4127 background-color: #e7e7e7;
4129 .navbar-default .navbar-nav
> .disabled
> a,
4130 .navbar-default .navbar-nav
> .disabled
> a:hover,
4131 .navbar-default .navbar-nav
> .disabled
> a:focus {
4133 background-color: transparent;
4135 .navbar-default .navbar-toggle {
4138 .navbar-default .navbar-toggle:hover,
4139 .navbar-default .navbar-toggle:focus {
4140 background-color: #ddd;
4142 .navbar-default .navbar-toggle .icon-bar {
4143 background-color: #
888;
4145 .navbar-default .navbar-collapse,
4146 .navbar-default .navbar-form {
4147 border-color: #e7e7e7;
4149 .navbar-default .navbar-nav
> .open
> a,
4150 .navbar-default .navbar-nav
> .open
> a:hover,
4151 .navbar-default .navbar-nav
> .open
> a:focus {
4153 background-color: #e7e7e7;
4155 @media (max-width:
767px) {
4156 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a {
4159 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a:hover,
4160 .navbar-default .navbar-nav .open .dropdown-menu
> li
> a:focus {
4162 background-color: transparent;
4164 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a,
4165 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a:hover,
4166 .navbar-default .navbar-nav .open .dropdown-menu
> .active
> a:focus {
4168 background-color: #e7e7e7;
4170 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a,
4171 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a:hover,
4172 .navbar-default .navbar-nav .open .dropdown-menu
> .disabled
> a:focus {
4174 background-color: transparent;
4177 .navbar-default .navbar-link {
4180 .navbar-default .navbar-link:hover {
4183 .navbar-default .btn-link {
4186 .navbar-default .btn-link:hover,
4187 .navbar-default .btn-link:focus {
4190 .navbar-default .btn-link[disabled]:hover,
4191 fieldset[disabled] .navbar-default .btn-link:hover,
4192 .navbar-default .btn-link[disabled]:focus,
4193 fieldset[disabled] .navbar-default .btn-link:focus {
4197 background-color: #
222;
4198 border-color: #
080808;
4200 .navbar-inverse .navbar-brand {
4203 .navbar-inverse .navbar-brand:hover,
4204 .navbar-inverse .navbar-brand:focus {
4206 background-color: transparent;
4208 .navbar-inverse .navbar-text {
4211 .navbar-inverse .navbar-nav
> li
> a {
4214 .navbar-inverse .navbar-nav
> li
> a:hover,
4215 .navbar-inverse .navbar-nav
> li
> a:focus {
4217 background-color: transparent;
4219 .navbar-inverse .navbar-nav
> .active
> a,
4220 .navbar-inverse .navbar-nav
> .active
> a:hover,
4221 .navbar-inverse .navbar-nav
> .active
> a:focus {
4223 background-color: #
080808;
4225 .navbar-inverse .navbar-nav
> .disabled
> a,
4226 .navbar-inverse .navbar-nav
> .disabled
> a:hover,
4227 .navbar-inverse .navbar-nav
> .disabled
> a:focus {
4229 background-color: transparent;
4231 .navbar-inverse .navbar-toggle {
4234 .navbar-inverse .navbar-toggle:hover,
4235 .navbar-inverse .navbar-toggle:focus {
4236 background-color: #
333;
4238 .navbar-inverse .navbar-toggle .icon-bar {
4239 background-color: #fff;
4241 .navbar-inverse .navbar-collapse,
4242 .navbar-inverse .navbar-form {
4243 border-color: #
101010;
4245 .navbar-inverse .navbar-nav
> .open
> a,
4246 .navbar-inverse .navbar-nav
> .open
> a:hover,
4247 .navbar-inverse .navbar-nav
> .open
> a:focus {
4249 background-color: #
080808;
4251 @media (max-width:
767px) {
4252 .navbar-inverse .navbar-nav .open .dropdown-menu
> .dropdown-header {
4253 border-color: #
080808;
4255 .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
4256 background-color: #
080808;
4258 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a {
4261 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a:hover,
4262 .navbar-inverse .navbar-nav .open .dropdown-menu
> li
> a:focus {
4264 background-color: transparent;
4266 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a,
4267 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a:hover,
4268 .navbar-inverse .navbar-nav .open .dropdown-menu
> .active
> a:focus {
4270 background-color: #
080808;
4272 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a,
4273 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a:hover,
4274 .navbar-inverse .navbar-nav .open .dropdown-menu
> .disabled
> a:focus {
4276 background-color: transparent;
4279 .navbar-inverse .navbar-link {
4282 .navbar-inverse .navbar-link:hover {
4285 .navbar-inverse .btn-link {
4288 .navbar-inverse .btn-link:hover,
4289 .navbar-inverse .btn-link:focus {
4292 .navbar-inverse .btn-link[disabled]:hover,
4293 fieldset[disabled] .navbar-inverse .btn-link:hover,
4294 .navbar-inverse .btn-link[disabled]:focus,
4295 fieldset[disabled] .navbar-inverse .btn-link:focus {
4300 margin-bottom:
20px;
4302 background-color: #f5f5f5;
4306 display: inline-block;
4308 .breadcrumb
> li + li:before {
4313 .breadcrumb
> .active {
4317 display: inline-block;
4325 .pagination
> li
> a,
4326 .pagination
> li
> span {
4331 line-height:
1.42857143;
4333 text-decoration: none;
4334 background-color: #fff;
4335 border:
1px solid #ddd;
4337 .pagination
> li:first-child
> a,
4338 .pagination
> li:first-child
> span {
4340 border-top-left-radius:
4px;
4341 border-bottom-left-radius:
4px;
4343 .pagination
> li:last-child
> a,
4344 .pagination
> li:last-child
> span {
4345 border-top-right-radius:
4px;
4346 border-bottom-right-radius:
4px;
4348 .pagination
> li
> a:hover,
4349 .pagination
> li
> span:hover,
4350 .pagination
> li
> a:focus,
4351 .pagination
> li
> span:focus {
4353 background-color: #eee;
4356 .pagination
> .active
> a,
4357 .pagination
> .active
> span,
4358 .pagination
> .active
> a:hover,
4359 .pagination
> .active
> span:hover,
4360 .pagination
> .active
> a:focus,
4361 .pagination
> .active
> span:focus {
4365 background-color: #
428bca;
4366 border-color: #
428bca;
4368 .pagination
> .disabled
> span,
4369 .pagination
> .disabled
> span:hover,
4370 .pagination
> .disabled
> span:focus,
4371 .pagination
> .disabled
> a,
4372 .pagination
> .disabled
> a:hover,
4373 .pagination
> .disabled
> a:focus {
4375 cursor: not-allowed;
4376 background-color: #fff;
4379 .pagination-lg
> li
> a,
4380 .pagination-lg
> li
> span {
4384 .pagination-lg
> li:first-child
> a,
4385 .pagination-lg
> li:first-child
> span {
4386 border-top-left-radius:
6px;
4387 border-bottom-left-radius:
6px;
4389 .pagination-lg
> li:last-child
> a,
4390 .pagination-lg
> li:last-child
> span {
4391 border-top-right-radius:
6px;
4392 border-bottom-right-radius:
6px;
4394 .pagination-sm
> li
> a,
4395 .pagination-sm
> li
> span {
4399 .pagination-sm
> li:first-child
> a,
4400 .pagination-sm
> li:first-child
> span {
4401 border-top-left-radius:
3px;
4402 border-bottom-left-radius:
3px;
4404 .pagination-sm
> li:last-child
> a,
4405 .pagination-sm
> li:last-child
> span {
4406 border-top-right-radius:
3px;
4407 border-bottom-right-radius:
3px;
4420 display: inline-block;
4422 background-color: #fff;
4423 border:
1px solid #ddd;
4424 border-radius:
15px;
4426 .pager li
> a:hover,
4427 .pager li
> a:focus {
4428 text-decoration: none;
4429 background-color: #eee;
4432 .pager .next
> span {
4435 .pager .previous
> a,
4436 .pager .previous
> span {
4439 .pager .disabled
> a,
4440 .pager .disabled
> a:hover,
4441 .pager .disabled
> a:focus,
4442 .pager .disabled
> span {
4444 cursor: not-allowed;
4445 background-color: #fff;
4449 padding:
.2em
.6em
.3em;
4455 white-space: nowrap;
4456 vertical-align: baseline;
4457 border-radius:
.25em;
4462 text-decoration: none;
4473 background-color: #
777;
4475 .label-default[href]:hover,
4476 .label-default[href]:focus {
4477 background-color: #
5e5e5e;
4480 background-color: #
428bca;
4482 .label-primary[href]:hover,
4483 .label-primary[href]:focus {
4484 background-color: #
3071a9;
4487 background-color: #
5cb85c;
4489 .label-success[href]:hover,
4490 .label-success[href]:focus {
4491 background-color: #
449d44;
4494 background-color: #
5bc0de;
4496 .label-info[href]:hover,
4497 .label-info[href]:focus {
4498 background-color: #
31b0d5;
4501 background-color: #f0ad4e;
4503 .label-warning[href]:hover,
4504 .label-warning[href]:focus {
4505 background-color: #ec971f;
4508 background-color: #d9534f;
4510 .label-danger[href]:hover,
4511 .label-danger[href]:focus {
4512 background-color: #c9302c;
4515 display: inline-block;
4523 white-space: nowrap;
4524 vertical-align: baseline;
4525 background-color: #
777;
4526 border-radius:
10px;
4542 text-decoration: none;
4545 a.list-group-item.active
> .badge,
4546 .nav-pills
> .active
> a
> .badge {
4548 background-color: #fff;
4550 .nav-pills
> li
> a
> .badge {
4555 margin-bottom:
30px;
4557 background-color: #eee;
4564 margin-bottom:
15px;
4569 border-top-color: #d5d5d5;
4571 .container .jumbotron {
4574 .jumbotron .container {
4577 @media screen and (min-width:
768px) {
4580 padding-bottom:
48px;
4582 .container .jumbotron {
4583 padding-right:
60px;
4594 margin-bottom:
20px;
4595 line-height:
1.42857143;
4596 background-color: #fff;
4597 border:
1px solid #ddd;
4599 -webkit-transition: all
.2s ease-in-out;
4600 -o-transition: all
.2s ease-in-out;
4601 transition: all
.2s ease-in-out;
4604 .thumbnail a
> img {
4610 a.thumbnail.active {
4611 border-color: #
428bca;
4613 .thumbnail .caption {
4619 margin-bottom:
20px;
4620 border:
1px solid transparent;
4627 .alert .alert-link {
4638 .alert-dismissible {
4639 padding-right:
35px;
4641 .alert-dismissable .close,
4642 .alert-dismissible .close {
4650 background-color: #dff0d8;
4651 border-color: #d6e9c6;
4654 border-top-color: #c9e2b3;
4656 .alert-success .alert-link {
4661 background-color: #d9edf7;
4662 border-color: #bce8f1;
4665 border-top-color: #a6e1ec;
4667 .alert-info .alert-link {
4672 background-color: #fcf8e3;
4673 border-color: #faebcc;
4676 border-top-color: #f7e1b5;
4678 .alert-warning .alert-link {
4683 background-color: #f2dede;
4684 border-color: #ebccd1;
4687 border-top-color: #e4b9c0;
4689 .alert-danger .alert-link {
4692 @-webkit-keyframes progress-bar-stripes {
4694 background-position:
40px
0;
4697 background-position:
0 0;
4700 @-o-keyframes progress-bar-stripes {
4702 background-position:
40px
0;
4705 background-position:
0 0;
4708 @keyframes progress-bar-stripes {
4710 background-position:
40px
0;
4713 background-position:
0 0;
4718 margin-bottom:
20px;
4720 background-color: #f5f5f5;
4722 -webkit-box-shadow: inset
0 1px
2px rgba(
0,
0,
0,
.1);
4723 box-shadow: inset
0 1px
2px rgba(
0,
0,
0,
.1);
4733 background-color: #
428bca;
4734 -webkit-box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.15);
4735 box-shadow: inset
0 -
1px
0 rgba(
0,
0,
0,
.15);
4736 -webkit-transition: width
.6s ease;
4737 -o-transition: width
.6s ease;
4738 transition: width
.6s ease;
4740 .progress-striped .progress-bar,
4741 .progress-bar-striped {
4742 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4743 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4744 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4745 -webkit-background-size:
40px
40px;
4746 background-size:
40px
40px;
4748 .progress.active .progress-bar,
4749 .progress-bar.active {
4750 -webkit-animation: progress-bar-stripes
2s linear infinite;
4751 -o-animation: progress-bar-stripes
2s linear infinite;
4752 animation: progress-bar-stripes
2s linear infinite;
4754 .progress-bar[
aria-valuenow="
1"],
4755 .progress-bar[
aria-valuenow="
2"] {
4758 .progress-bar[
aria-valuenow="
0"] {
4761 background-color: transparent;
4762 background-image: none;
4763 -webkit-box-shadow: none;
4766 .progress-bar-success {
4767 background-color: #
5cb85c;
4769 .progress-striped .progress-bar-success {
4770 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4771 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4772 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4774 .progress-bar-info {
4775 background-color: #
5bc0de;
4777 .progress-striped .progress-bar-info {
4778 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4779 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4780 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4782 .progress-bar-warning {
4783 background-color: #f0ad4e;
4785 .progress-striped .progress-bar-warning {
4786 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4787 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4788 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4790 .progress-bar-danger {
4791 background-color: #d9534f;
4793 .progress-striped .progress-bar-danger {
4794 background-image: -webkit-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4795 background-image: -o-linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4796 background-image: linear-gradient(
45deg, rgba(
255,
255,
255,
.15)
25%, transparent
25%, transparent
50%, rgba(
255,
255,
255,
.15)
50%, rgba(
255,
255,
255,
.15)
75%, transparent
75%, transparent);
4807 .media:first-child {
4816 .media
> .pull-left {
4819 .media
> .pull-right {
4828 margin-bottom:
20px;
4834 margin-bottom: -
1px;
4835 background-color: #fff;
4836 border:
1px solid #ddd;
4838 .list-group-item:first-child {
4839 border-top-left-radius:
4px;
4840 border-top-right-radius:
4px;
4842 .list-group-item:last-child {
4844 border-bottom-right-radius:
4px;
4845 border-bottom-left-radius:
4px;
4847 .list-group-item
> .badge {
4850 .list-group-item
> .badge + .badge {
4856 a.list-group-item .list-group-item-heading {
4859 a.list-group-item:hover,
4860 a.list-group-item:focus {
4862 text-decoration: none;
4863 background-color: #f5f5f5;
4865 .list-group-item.disabled,
4866 .list-group-item.disabled:hover,
4867 .list-group-item.disabled:focus {
4869 background-color: #eee;
4871 .list-group-item.disabled .list-group-item-heading,
4872 .list-group-item.disabled:hover .list-group-item-heading,
4873 .list-group-item.disabled:focus .list-group-item-heading {
4876 .list-group-item.disabled .list-group-item-text,
4877 .list-group-item.disabled:hover .list-group-item-text,
4878 .list-group-item.disabled:focus .list-group-item-text {
4881 .list-group-item.active,
4882 .list-group-item.active:hover,
4883 .list-group-item.active:focus {
4886 background-color: #
428bca;
4887 border-color: #
428bca;
4889 .list-group-item.active .list-group-item-heading,
4890 .list-group-item.active:hover .list-group-item-heading,
4891 .list-group-item.active:focus .list-group-item-heading,
4892 .list-group-item.active .list-group-item-heading
> small,
4893 .list-group-item.active:hover .list-group-item-heading
> small,
4894 .list-group-item.active:focus .list-group-item-heading
> small,
4895 .list-group-item.active .list-group-item-heading
> .small,
4896 .list-group-item.active:hover .list-group-item-heading
> .small,
4897 .list-group-item.active:focus .list-group-item-heading
> .small {
4900 .list-group-item.active .list-group-item-text,
4901 .list-group-item.active:hover .list-group-item-text,
4902 .list-group-item.active:focus .list-group-item-text {
4905 .list-group-item-success {
4907 background-color: #dff0d8;
4909 a.list-group-item-success {
4912 a.list-group-item-success .list-group-item-heading {
4915 a.list-group-item-success:hover,
4916 a.list-group-item-success:focus {
4918 background-color: #d0e9c6;
4920 a.list-group-item-success.active,
4921 a.list-group-item-success.active:hover,
4922 a.list-group-item-success.active:focus {
4924 background-color: #
3c763d;
4925 border-color: #
3c763d;
4927 .list-group-item-info {
4929 background-color: #d9edf7;
4931 a.list-group-item-info {
4934 a.list-group-item-info .list-group-item-heading {
4937 a.list-group-item-info:hover,
4938 a.list-group-item-info:focus {
4940 background-color: #c4e3f3;
4942 a.list-group-item-info.active,
4943 a.list-group-item-info.active:hover,
4944 a.list-group-item-info.active:focus {
4946 background-color: #
31708f;
4947 border-color: #
31708f;
4949 .list-group-item-warning {
4951 background-color: #fcf8e3;
4953 a.list-group-item-warning {
4956 a.list-group-item-warning .list-group-item-heading {
4959 a.list-group-item-warning:hover,
4960 a.list-group-item-warning:focus {
4962 background-color: #faf2cc;
4964 a.list-group-item-warning.active,
4965 a.list-group-item-warning.active:hover,
4966 a.list-group-item-warning.active:focus {
4968 background-color: #
8a6d3b;
4969 border-color: #
8a6d3b;
4971 .list-group-item-danger {
4973 background-color: #f2dede;
4975 a.list-group-item-danger {
4978 a.list-group-item-danger .list-group-item-heading {
4981 a.list-group-item-danger:hover,
4982 a.list-group-item-danger:focus {
4984 background-color: #ebcccc;
4986 a.list-group-item-danger.active,
4987 a.list-group-item-danger.active:hover,
4988 a.list-group-item-danger.active:focus {
4990 background-color: #a94442;
4991 border-color: #a94442;
4993 .list-group-item-heading {
4997 .list-group-item-text {
5002 margin-bottom:
20px;
5003 background-color: #fff;
5004 border:
1px solid transparent;
5006 -webkit-box-shadow:
0 1px
1px rgba(
0,
0,
0,
.05);
5007 box-shadow:
0 1px
1px rgba(
0,
0,
0,
.05);
5014 border-bottom:
1px solid transparent;
5015 border-top-left-radius:
3px;
5016 border-top-right-radius:
3px;
5018 .panel-heading
> .dropdown .dropdown-toggle {
5032 background-color: #f5f5f5;
5033 border-top:
1px solid #ddd;
5034 border-bottom-right-radius:
3px;
5035 border-bottom-left-radius:
3px;
5037 .panel
> .list-group {
5040 .panel
> .list-group .list-group-item {
5041 border-width:
1px
0;
5044 .panel
> .list-group:first-child .list-group-item:first-child {
5046 border-top-left-radius:
3px;
5047 border-top-right-radius:
3px;
5049 .panel
> .list-group:last-child .list-group-item:last-child {
5051 border-bottom-right-radius:
3px;
5052 border-bottom-left-radius:
3px;
5054 .panel-heading + .list-group .list-group-item:first-child {
5055 border-top-width:
0;
5057 .list-group + .panel-footer {
5058 border-top-width:
0;
5061 .panel
> .table-responsive
> .table,
5062 .panel
> .panel-collapse
> .table {
5065 .panel
> .table:first-child,
5066 .panel
> .table-responsive:first-child
> .table:first-child {
5067 border-top-left-radius:
3px;
5068 border-top-right-radius:
3px;
5070 .panel
> .table:first-child
> thead:first-child
> tr:first-child td:first-child,
5071 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child td:first-child,
5072 .panel
> .table:first-child
> tbody:first-child
> tr:first-child td:first-child,
5073 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child td:first-child,
5074 .panel
> .table:first-child
> thead:first-child
> tr:first-child th:first-child,
5075 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child th:first-child,
5076 .panel
> .table:first-child
> tbody:first-child
> tr:first-child th:first-child,
5077 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child th:first-child {
5078 border-top-left-radius:
3px;
5080 .panel
> .table:first-child
> thead:first-child
> tr:first-child td:last-child,
5081 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child td:last-child,
5082 .panel
> .table:first-child
> tbody:first-child
> tr:first-child td:last-child,
5083 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child td:last-child,
5084 .panel
> .table:first-child
> thead:first-child
> tr:first-child th:last-child,
5085 .panel
> .table-responsive:first-child
> .table:first-child
> thead:first-child
> tr:first-child th:last-child,
5086 .panel
> .table:first-child
> tbody:first-child
> tr:first-child th:last-child,
5087 .panel
> .table-responsive:first-child
> .table:first-child
> tbody:first-child
> tr:first-child th:last-child {
5088 border-top-right-radius:
3px;
5090 .panel
> .table:last-child,
5091 .panel
> .table-responsive:last-child
> .table:last-child {
5092 border-bottom-right-radius:
3px;
5093 border-bottom-left-radius:
3px;
5095 .panel
> .table:last-child
> tbody:last-child
> tr:last-child td:first-child,
5096 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child td:first-child,
5097 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child td:first-child,
5098 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child td:first-child,
5099 .panel
> .table:last-child
> tbody:last-child
> tr:last-child th:first-child,
5100 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child th:first-child,
5101 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child th:first-child,
5102 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child th:first-child {
5103 border-bottom-left-radius:
3px;
5105 .panel
> .table:last-child
> tbody:last-child
> tr:last-child td:last-child,
5106 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child td:last-child,
5107 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child td:last-child,
5108 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child td:last-child,
5109 .panel
> .table:last-child
> tbody:last-child
> tr:last-child th:last-child,
5110 .panel
> .table-responsive:last-child
> .table:last-child
> tbody:last-child
> tr:last-child th:last-child,
5111 .panel
> .table:last-child
> tfoot:last-child
> tr:last-child th:last-child,
5112 .panel
> .table-responsive:last-child
> .table:last-child
> tfoot:last-child
> tr:last-child th:last-child {
5113 border-bottom-right-radius:
3px;
5115 .panel
> .panel-body + .table,
5116 .panel
> .panel-body + .table-responsive {
5117 border-top:
1px solid #ddd;
5119 .panel
> .table
> tbody:first-child
> tr:first-child th,
5120 .panel
> .table
> tbody:first-child
> tr:first-child td {
5123 .panel
> .table-bordered,
5124 .panel
> .table-responsive
> .table-bordered {
5127 .panel
> .table-bordered
> thead
> tr
> th:first-child,
5128 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> th:first-child,
5129 .panel
> .table-bordered
> tbody
> tr
> th:first-child,
5130 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> th:first-child,
5131 .panel
> .table-bordered
> tfoot
> tr
> th:first-child,
5132 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> th:first-child,
5133 .panel
> .table-bordered
> thead
> tr
> td:first-child,
5134 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> td:first-child,
5135 .panel
> .table-bordered
> tbody
> tr
> td:first-child,
5136 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> td:first-child,
5137 .panel
> .table-bordered
> tfoot
> tr
> td:first-child,
5138 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> td:first-child {
5141 .panel
> .table-bordered
> thead
> tr
> th:last-child,
5142 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> th:last-child,
5143 .panel
> .table-bordered
> tbody
> tr
> th:last-child,
5144 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> th:last-child,
5145 .panel
> .table-bordered
> tfoot
> tr
> th:last-child,
5146 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> th:last-child,
5147 .panel
> .table-bordered
> thead
> tr
> td:last-child,
5148 .panel
> .table-responsive
> .table-bordered
> thead
> tr
> td:last-child,
5149 .panel
> .table-bordered
> tbody
> tr
> td:last-child,
5150 .panel
> .table-responsive
> .table-bordered
> tbody
> tr
> td:last-child,
5151 .panel
> .table-bordered
> tfoot
> tr
> td:last-child,
5152 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr
> td:last-child {
5155 .panel
> .table-bordered
> thead
> tr:first-child
> td,
5156 .panel
> .table-responsive
> .table-bordered
> thead
> tr:first-child
> td,
5157 .panel
> .table-bordered
> tbody
> tr:first-child
> td,
5158 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:first-child
> td,
5159 .panel
> .table-bordered
> thead
> tr:first-child
> th,
5160 .panel
> .table-responsive
> .table-bordered
> thead
> tr:first-child
> th,
5161 .panel
> .table-bordered
> tbody
> tr:first-child
> th,
5162 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:first-child
> th {
5165 .panel
> .table-bordered
> tbody
> tr:last-child
> td,
5166 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:last-child
> td,
5167 .panel
> .table-bordered
> tfoot
> tr:last-child
> td,
5168 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> td,
5169 .panel
> .table-bordered
> tbody
> tr:last-child
> th,
5170 .panel
> .table-responsive
> .table-bordered
> tbody
> tr:last-child
> th,
5171 .panel
> .table-bordered
> tfoot
> tr:last-child
> th,
5172 .panel
> .table-responsive
> .table-bordered
> tfoot
> tr:last-child
> th {
5175 .panel
> .table-responsive {
5180 margin-bottom:
20px;
5182 .panel-group .panel {
5186 .panel-group .panel + .panel {
5189 .panel-group .panel-heading {
5192 .panel-group .panel-heading + .panel-collapse
> .panel-body {
5193 border-top:
1px solid #ddd;
5195 .panel-group .panel-footer {
5198 .panel-group .panel-footer + .panel-collapse .panel-body {
5199 border-bottom:
1px solid #ddd;
5204 .panel-default
> .panel-heading {
5206 background-color: #f5f5f5;
5209 .panel-default
> .panel-heading + .panel-collapse
> .panel-body {
5210 border-top-color: #ddd;
5212 .panel-default
> .panel-heading .badge {
5214 background-color: #
333;
5216 .panel-default
> .panel-footer + .panel-collapse
> .panel-body {
5217 border-bottom-color: #ddd;
5220 border-color: #
428bca;
5222 .panel-primary
> .panel-heading {
5224 background-color: #
428bca;
5225 border-color: #
428bca;
5227 .panel-primary
> .panel-heading + .panel-collapse
> .panel-body {
5228 border-top-color: #
428bca;
5230 .panel-primary
> .panel-heading .badge {
5232 background-color: #fff;
5234 .panel-primary
> .panel-footer + .panel-collapse
> .panel-body {
5235 border-bottom-color: #
428bca;
5238 border-color: #d6e9c6;
5240 .panel-success
> .panel-heading {
5242 background-color: #dff0d8;
5243 border-color: #d6e9c6;
5245 .panel-success
> .panel-heading + .panel-collapse
> .panel-body {
5246 border-top-color: #d6e9c6;
5248 .panel-success
> .panel-heading .badge {
5250 background-color: #
3c763d;
5252 .panel-success
> .panel-footer + .panel-collapse
> .panel-body {
5253 border-bottom-color: #d6e9c6;
5256 border-color: #bce8f1;
5258 .panel-info
> .panel-heading {
5260 background-color: #d9edf7;
5261 border-color: #bce8f1;
5263 .panel-info
> .panel-heading + .panel-collapse
> .panel-body {
5264 border-top-color: #bce8f1;
5266 .panel-info
> .panel-heading .badge {
5268 background-color: #
31708f;
5270 .panel-info
> .panel-footer + .panel-collapse
> .panel-body {
5271 border-bottom-color: #bce8f1;
5274 border-color: #faebcc;
5276 .panel-warning
> .panel-heading {
5278 background-color: #fcf8e3;
5279 border-color: #faebcc;
5281 .panel-warning
> .panel-heading + .panel-collapse
> .panel-body {
5282 border-top-color: #faebcc;
5284 .panel-warning
> .panel-heading .badge {
5286 background-color: #
8a6d3b;
5288 .panel-warning
> .panel-footer + .panel-collapse
> .panel-body {
5289 border-bottom-color: #faebcc;
5292 border-color: #ebccd1;
5294 .panel-danger
> .panel-heading {
5296 background-color: #f2dede;
5297 border-color: #ebccd1;
5299 .panel-danger
> .panel-heading + .panel-collapse
> .panel-body {
5300 border-top-color: #ebccd1;
5302 .panel-danger
> .panel-heading .badge {
5304 background-color: #a94442;
5306 .panel-danger
> .panel-footer + .panel-collapse
> .panel-body {
5307 border-bottom-color: #ebccd1;
5316 .embed-responsive .embed-responsive-item,
5317 .embed-responsive iframe,
5318 .embed-responsive embed,
5319 .embed-responsive object {
5328 .embed-responsive.embed-responsive-
16by9 {
5329 padding-bottom:
56.25%;
5331 .embed-responsive.embed-responsive-
4by3 {
5332 padding-bottom:
75%;
5337 margin-bottom:
20px;
5338 background-color: #f5f5f5;
5339 border:
1px solid #e3e3e3;
5341 -webkit-box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.05);
5342 box-shadow: inset
0 1px
1px rgba(
0,
0,
0,
.05);
5346 border-color: rgba(
0,
0,
0,
.15);
5362 text-shadow:
0 1px
0 #fff;
5363 filter: alpha(opacity=
20);
5369 text-decoration: none;
5371 filter: alpha(opacity=
50);
5375 -webkit-appearance: none;
5378 background: transparent;
5393 -webkit-overflow-scrolling: touch;
5396 .modal.fade .modal-dialog {
5397 -webkit-transition: -webkit-transform
.3s ease-out;
5398 -o-transition: -o-transform
.3s ease-out;
5399 transition: transform
.3s ease-out;
5400 -webkit-transform: translate3d(
0, -
25%,
0);
5401 -o-transform: translate3d(
0, -
25%,
0);
5402 transform: translate3d(
0, -
25%,
0);
5404 .modal.in .modal-dialog {
5405 -webkit-transform: translate3d(
0,
0,
0);
5406 -o-transform: translate3d(
0,
0,
0);
5407 transform: translate3d(
0,
0,
0);
5409 .modal-open .modal {
5420 background-color: #fff;
5421 -webkit-background-clip: padding-box;
5422 background-clip: padding-box;
5423 border:
1px solid #
999;
5424 border:
1px solid rgba(
0,
0,
0,
.2);
5427 -webkit-box-shadow:
0 3px
9px rgba(
0,
0,
0,
.5);
5428 box-shadow:
0 3px
9px rgba(
0,
0,
0,
.5);
5437 background-color: #
000;
5439 .modal-backdrop.fade {
5440 filter: alpha(opacity=
0);
5443 .modal-backdrop.in {
5444 filter: alpha(opacity=
50);
5448 min-height:
16.42857143px;
5450 border-bottom:
1px solid #e5e5e5;
5452 .modal-header .close {
5457 line-height:
1.42857143;
5466 border-top:
1px solid #e5e5e5;
5468 .modal-footer .btn + .btn {
5472 .modal-footer .btn-group .btn + .btn {
5475 .modal-footer .btn-block + .btn-block {
5478 .modal-scrollbar-measure {
5485 @media (min-width:
768px) {
5491 -webkit-box-shadow:
0 5px
15px rgba(
0,
0,
0,
.5);
5492 box-shadow:
0 5px
15px rgba(
0,
0,
0,
.5);
5498 @media (min-width:
992px) {
5509 visibility: visible;
5510 filter: alpha(opacity=
0);
5514 filter: alpha(opacity=
90);
5538 text-decoration: none;
5539 background-color: #
000;
5546 border-color: transparent;
5547 border-style: solid;
5549 .tooltip.top .tooltip-arrow {
5553 border-width:
5px
5px
0;
5554 border-top-color: #
000;
5556 .tooltip.top-left .tooltip-arrow {
5559 border-width:
5px
5px
0;
5560 border-top-color: #
000;
5562 .tooltip.top-right .tooltip-arrow {
5565 border-width:
5px
5px
0;
5566 border-top-color: #
000;
5568 .tooltip.right .tooltip-arrow {
5572 border-width:
5px
5px
5px
0;
5573 border-right-color: #
000;
5575 .tooltip.left .tooltip-arrow {
5579 border-width:
5px
0 5px
5px;
5580 border-left-color: #
000;
5582 .tooltip.bottom .tooltip-arrow {
5586 border-width:
0 5px
5px;
5587 border-bottom-color: #
000;
5589 .tooltip.bottom-left .tooltip-arrow {
5592 border-width:
0 5px
5px;
5593 border-bottom-color: #
000;
5595 .tooltip.bottom-right .tooltip-arrow {
5598 border-width:
0 5px
5px;
5599 border-bottom-color: #
000;
5610 white-space: normal;
5611 background-color: #fff;
5612 -webkit-background-clip: padding-box;
5613 background-clip: padding-box;
5614 border:
1px solid #ccc;
5615 border:
1px solid rgba(
0,
0,
0,
.2);
5617 -webkit-box-shadow:
0 5px
10px rgba(
0,
0,
0,
.2);
5618 box-shadow:
0 5px
10px rgba(
0,
0,
0,
.2);
5636 font-weight: normal;
5638 background-color: #f7f7f7;
5639 border-bottom:
1px solid #ebebeb;
5640 border-radius:
5px
5px
0 0;
5646 .popover
> .arrow:after {
5651 border-color: transparent;
5652 border-style: solid;
5657 .popover
> .arrow:after {
5661 .popover.top
> .arrow {
5665 border-top-color: #
999;
5666 border-top-color: rgba(
0,
0,
0,
.25);
5667 border-bottom-width:
0;
5669 .popover.top
> .arrow:after {
5673 border-top-color: #fff;
5674 border-bottom-width:
0;
5676 .popover.right
> .arrow {
5680 border-right-color: #
999;
5681 border-right-color: rgba(
0,
0,
0,
.25);
5682 border-left-width:
0;
5684 .popover.right
> .arrow:after {
5688 border-right-color: #fff;
5689 border-left-width:
0;
5691 .popover.bottom
> .arrow {
5695 border-top-width:
0;
5696 border-bottom-color: #
999;
5697 border-bottom-color: rgba(
0,
0,
0,
.25);
5699 .popover.bottom
> .arrow:after {
5703 border-top-width:
0;
5704 border-bottom-color: #fff;
5706 .popover.left
> .arrow {
5710 border-right-width:
0;
5711 border-left-color: #
999;
5712 border-left-color: rgba(
0,
0,
0,
.25);
5714 .popover.left
> .arrow:after {
5718 border-right-width:
0;
5719 border-left-color: #fff;
5729 .carousel-inner
> .item {
5732 -webkit-transition:
.6s ease-in-out left;
5733 -o-transition:
.6s ease-in-out left;
5734 transition:
.6s ease-in-out left;
5736 .carousel-inner
> .item
> img,
5737 .carousel-inner
> .item
> a
> img {
5740 .carousel-inner
> .active,
5741 .carousel-inner
> .next,
5742 .carousel-inner
> .prev {
5745 .carousel-inner
> .active {
5748 .carousel-inner
> .next,
5749 .carousel-inner
> .prev {
5754 .carousel-inner
> .next {
5757 .carousel-inner
> .prev {
5760 .carousel-inner
> .next.left,
5761 .carousel-inner
> .prev.right {
5764 .carousel-inner
> .active.left {
5767 .carousel-inner
> .active.right {
5779 text-shadow:
0 1px
2px rgba(
0,
0,
0,
.6);
5780 filter: alpha(opacity=
50);
5783 .carousel-control.left {
5784 background-image: -webkit-linear-gradient(left, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5785 background-image: -o-linear-gradient(left, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5786 background-image: -webkit-gradient(linear, left top, right top, from(rgba(
0,
0,
0,
.5)), to(rgba(
0,
0,
0,
.0001)));
5787 background-image: linear-gradient(to right, rgba(
0,
0,
0,
.5)
0%, rgba(
0,
0,
0,
.0001)
100%);
5788 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#
80000000', endColorstr='#
00000000', GradientType=
1);
5789 background-repeat: repeat-x;
5791 .carousel-control.right {
5794 background-image: -webkit-linear-gradient(left, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5795 background-image: -o-linear-gradient(left, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5796 background-image: -webkit-gradient(linear, left top, right top, from(rgba(
0,
0,
0,
.0001)), to(rgba(
0,
0,
0,
.5)));
5797 background-image: linear-gradient(to right, rgba(
0,
0,
0,
.0001)
0%, rgba(
0,
0,
0,
.5)
100%);
5798 filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#
00000000', endColorstr='#
80000000', GradientType=
1);
5799 background-repeat: repeat-x;
5801 .carousel-control:hover,
5802 .carousel-control:focus {
5804 text-decoration: none;
5805 filter: alpha(opacity=
90);
5809 .carousel-control .icon-prev,
5810 .carousel-control .icon-next,
5811 .carousel-control .glyphicon-chevron-left,
5812 .carousel-control .glyphicon-chevron-right {
5816 display: inline-block;
5818 .carousel-control .icon-prev,
5819 .carousel-control .glyphicon-chevron-left {
5823 .carousel-control .icon-next,
5824 .carousel-control .glyphicon-chevron-right {
5826 margin-right: -
10px;
5828 .carousel-control .icon-prev,
5829 .carousel-control .icon-next {
5835 .carousel-control .icon-prev:before {
5838 .carousel-control .icon-next:before {
5841 .carousel-indicators {
5852 .carousel-indicators li {
5853 display: inline-block;
5857 text-indent: -
999px;
5859 background-color: #
000 \
9;
5860 background-color: rgba(
0,
0,
0,
0);
5861 border:
1px solid #fff;
5862 border-radius:
10px;
5864 .carousel-indicators .active {
5868 background-color: #fff;
5877 padding-bottom:
20px;
5880 text-shadow:
0 1px
2px rgba(
0,
0,
0,
.6);
5882 .carousel-caption .btn {
5885 @media screen and (min-width:
768px) {
5886 .carousel-control .glyphicon-chevron-left,
5887 .carousel-control .glyphicon-chevron-right,
5888 .carousel-control .icon-prev,
5889 .carousel-control .icon-next {
5895 .carousel-control .glyphicon-chevron-left,
5896 .carousel-control .icon-prev {
5899 .carousel-control .glyphicon-chevron-right,
5900 .carousel-control .icon-next {
5901 margin-right: -
15px;
5906 padding-bottom:
30px;
5908 .carousel-indicators {
5914 .dl-horizontal dd:before,
5915 .dl-horizontal dd:after,
5918 .container-fluid:before,
5919 .container-fluid:after,
5922 .form-horizontal .form-group:before,
5923 .form-horizontal .form-group:after,
5924 .btn-toolbar:before,
5926 .btn-group-vertical
> .btn-group:before,
5927 .btn-group-vertical
> .btn-group:after,
5932 .navbar-header:before,
5933 .navbar-header:after,
5934 .navbar-collapse:before,
5935 .navbar-collapse:after,
5940 .modal-footer:before,
5941 .modal-footer:after {
5946 .dl-horizontal dd:after,
5948 .container-fluid:after,
5950 .form-horizontal .form-group:after,
5952 .btn-group-vertical
> .btn-group:after,
5955 .navbar-header:after,
5956 .navbar-collapse:after,
5959 .modal-footer:after {
5968 float: right !important;
5971 float: left !important;
5974 display: none !important;
5977 display: block !important;
5986 background-color: transparent;
5990 display: none !important;
5991 visibility: hidden !important;
5995 -webkit-transform: translate3d(
0,
0,
0);
5996 -o-transform: translate3d(
0,
0,
0);
5997 transform: translate3d(
0,
0,
0);
6000 width: device-width;
6006 display: none !important;
6010 .visible-xs-inline-block,
6013 .visible-sm-inline-block,
6016 .visible-md-inline-block,
6019 .visible-lg-inline-block {
6020 display: none !important;
6022 @media (max-width:
767px) {
6024 display: block !important;
6030 display: table-row !important;
6034 display: table-cell !important;
6037 @media (max-width:
767px) {
6039 display: block !important;
6042 @media (max-width:
767px) {
6043 .visible-xs-inline {
6044 display: inline !important;
6047 @media (max-width:
767px) {
6048 .visible-xs-inline-block {
6049 display: inline-block !important;
6052 @media (min-width:
768px) and (max-width:
991px) {
6054 display: block !important;
6060 display: table-row !important;
6064 display: table-cell !important;
6067 @media (min-width:
768px) and (max-width:
991px) {
6069 display: block !important;
6072 @media (min-width:
768px) and (max-width:
991px) {
6073 .visible-sm-inline {
6074 display: inline !important;
6077 @media (min-width:
768px) and (max-width:
991px) {
6078 .visible-sm-inline-block {
6079 display: inline-block !important;
6082 @media (min-width:
992px) and (max-width:
1199px) {
6084 display: block !important;
6090 display: table-row !important;
6094 display: table-cell !important;
6097 @media (min-width:
992px) and (max-width:
1199px) {
6099 display: block !important;
6102 @media (min-width:
992px) and (max-width:
1199px) {
6103 .visible-md-inline {
6104 display: inline !important;
6107 @media (min-width:
992px) and (max-width:
1199px) {
6108 .visible-md-inline-block {
6109 display: inline-block !important;
6112 @media (min-width:
1200px) {
6114 display: block !important;
6120 display: table-row !important;
6124 display: table-cell !important;
6127 @media (min-width:
1200px) {
6129 display: block !important;
6132 @media (min-width:
1200px) {
6133 .visible-lg-inline {
6134 display: inline !important;
6137 @media (min-width:
1200px) {
6138 .visible-lg-inline-block {
6139 display: inline-block !important;
6142 @media (max-width:
767px) {
6144 display: none !important;
6147 @media (min-width:
768px) and (max-width:
991px) {
6149 display: none !important;
6152 @media (min-width:
992px) and (max-width:
1199px) {
6154 display: none !important;
6157 @media (min-width:
1200px) {
6159 display: none !important;
6163 display: none !important;
6167 display: block !important;
6169 table.visible-print {
6173 display: table-row !important;
6177 display: table-cell !important;
6180 .visible-print-block {
6181 display: none !important;
6184 .visible-print-block {
6185 display: block !important;
6188 .visible-print-inline {
6189 display: none !important;
6192 .visible-print-inline {
6193 display: inline !important;
6196 .visible-print-inline-block {
6197 display: none !important;
6200 .visible-print-inline-block {
6201 display: inline-block !important;
6206 display: none !important;
6209 /*# sourceMappingURL=bootstrap.css.map */
6211 <meta content=
"Mnemonic code for generating deterministic keys" name=
"description"/>
6212 <meta content=
"width=device-width, initial-scale=1.0" name=
"viewport" />
6213 <meta content=
"bitcoin mnemonic converter" name=
"description" />
6214 <meta content=
"DC POS" name=
"author" />
6218 padding-bottom:
32px;
6220 .form-control[readonly] {
6223 .feedback-container {
6233 background-color: orange;
6237 border:
2px solid #
555;
6239 border-bottom-left-radius:
20px
20px;
6240 border-bottom-right-radius:
20px
20px;
6245 <div class=
"container">
6247 <h1 class=
"text-center">Mnemonic Code Converter
</h1>
6250 <div class=
"col-md-12">
6252 <form class=
"form-horizontal" role=
"form">
6253 <div class=
"col-sm-2"></div>
6254 <div class=
"col-sm-10">
6255 <p>You can enter an existing BIP39 mnemonic, or generate a new random one. Typing your own twelve words will probably not work how you expect, since the words require a particular structure (the last word is a checksum)
</p>
6256 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki" target=
"_blank">BIP39 spec
</a></p>
6258 <div class=
"form-group">
6259 <label for=
"phrase" class=
"col-sm-2 control-label">BIP39 Mnemonic
</label>
6260 <div class=
"col-sm-10">
6261 <textarea id=
"phrase" class=
"phrase form-control"></textarea>
6264 <div class=
"form-group">
6265 <label for=
"strength" class=
"col-sm-2 control-label">Number of words
</label>
6266 <div class=
"col-sm-10">
6267 <div class=
"input-group">
6268 <input type=
"number" class=
"strength form-control" id=
"strength" value=
"12">
6269 <span class=
"input-group-btn">
6270 <button class=
"btn generate">Generate Random Mnemonic
</button>
6275 <div class=
"form-group">
6276 <label for=
"passphrase" class=
"col-sm-2 control-label">BIP39 Passphrase (optional)
</label>
6277 <div class=
"col-sm-10">
6278 <textarea id=
"passphrase" class=
"passphrase form-control"></textarea>
6281 <div class=
"form-group">
6282 <label for=
"network-phrase" class=
"col-sm-2 control-label">Coin
</label>
6283 <div class=
"col-sm-10">
6284 <select id=
"network-phrase" class=
"network form-control">
6285 <option value=
"bitcoin">Bitcoin
</option>
6286 <option value=
"bitcoin-testnet">Bitcoin Testnet
</option>
6287 <option value=
"litecoin">Litecoin
</option>
6288 <option value=
"dogecoin">Dogecoin
</option>
6289 <option value=
"shadow">ShadowCash
</option>
6290 <option value=
"shadowtn">ShadowCash Testnet
</option>
6294 <div class=
"form-group">
6295 <label for=
"root-key" class=
"col-sm-2 control-label">BIP32 Root Key
</label>
6296 <div class=
"col-sm-10">
6297 <textarea id=
"root-key" class=
"root-key form-control" readonly=
"readonly"></textarea>
6307 <div class=
"col-md-12">
6308 <h2>Derivation Path
</h2>
6309 <ul class=
"derivation-type nav nav-tabs" role=
"tablist">
6310 <li id=
"hive-tab" class=
"active">
6311 <a href=
"#hive" role=
"tab" data-toggle=
"tab">Hive Wallet
</a>
6313 <li id=
"mycelium-tab">
6314 <a href=
"#mycelium" role=
"tab" data-toggle=
"tab">Mycelium Wallet
</a>
6317 <a href=
"#bip44" role=
"tab" data-toggle=
"tab">BIP44
</a>
6320 <a href=
"#bip32" role=
"tab" data-toggle=
"tab">BIP32
</a>
6323 <div class=
"derivation-type tab-content">
6324 <div id=
"hive" class=
"tab-pane active">
6325 <form class=
"form-horizontal" role=
"form">
6327 <div class=
"col-sm-2"></div>
6328 <div class=
"col-sm-10">
6329 <p>For more info see the
<a href=
"https://www.hivewallet.com/" target=
"_blank">Hive Wallet homepage
</a></p>
6331 <div class=
"form-group">
6332 <label for=
"hive-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6333 <div class=
"col-sm-10">
6334 <input id=
"hive-path" type=
"text" class=
"path form-control" value=
"m/0'/0" readonly=
"readonly">
6339 <div id=
"mycelium" class=
"tab-pane">
6340 <form class=
"form-horizontal" role=
"form">
6342 <div class=
"col-sm-2"></div>
6343 <div class=
"col-sm-10">
6344 <p>For more info see the
<a href=
"http://www.mycelium.com/" target=
"_blank">Mycelium Wallet homepage
</a></p>
6346 <div class=
"form-group">
6347 <label for=
"mycelium-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6348 <div class=
"col-sm-10">
6349 <input id=
"mycelium-path" type=
"text" class=
"path form-control" value=
"m/44'/0'/0'/0" readonly=
"readonly">
6354 <div id=
"bip44" class=
"tab-pane">
6355 <form class=
"form-horizontal" role=
"form">
6357 <div class=
"col-sm-2"></div>
6358 <div class=
"col-sm-10">
6359 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target=
"_blank">BIP44 spec
</a></p>
6361 <div class=
"form-group">
6362 <label for=
"purpose" class=
"col-sm-2 control-label">
6363 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#purpose" target=
"_blank">Purpose
</a>
6365 <div class=
"col-sm-10">
6366 <input id=
"purpose" type=
"text" class=
"purpose form-control" value=
"44">
6369 <div class=
"form-group">
6370 <label for=
"coin" class=
"col-sm-2 control-label">
6371 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#registered-coin-types" target=
"_blank">Coin
</a>
6373 <div class=
"col-sm-10">
6374 <input id=
"coin" type=
"text" class=
"coin form-control" value=
"0">
6377 <div class=
"form-group">
6378 <label for=
"account" class=
"col-sm-2 control-label">
6379 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#account" target=
"_blank">Account
</a>
6381 <div class=
"col-sm-10">
6382 <input id=
"account" type=
"text" class=
"account form-control" value=
"0">
6385 <div class=
"form-group">
6386 <label for=
"change" class=
"col-sm-2 control-label">
6387 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki#change" target=
"_blank">External / Internal
</a>
6389 <div class=
"col-sm-10">
6390 <input id=
"change" type=
"text" class=
"change form-control" value=
"0">
6393 <div class=
"form-group">
6394 <label for=
"bip44-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6395 <div class=
"col-sm-10">
6396 <input id=
"bip44-path" type=
"text" class=
"path form-control" value=
"m/44'/0'/0'/0" readonly=
"readonly">
6401 <div id=
"bip32" class=
"tab-pane">
6402 <form class=
"form-horizontal" role=
"form">
6404 <div class=
"col-sm-2"></div>
6405 <div class=
"col-sm-10">
6406 <p>For more info see the
<a href=
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target=
"_blank">BIP32 spec
</a></p>
6408 <div class=
"form-group">
6409 <label for=
"bip32-path" class=
"col-sm-2 control-label">BIP32 Derivation Path
</label>
6410 <div class=
"col-sm-10">
6411 <input id=
"bip32-path" type=
"text" class=
"path form-control" value=
"m/0">
6417 <form class=
"form-horizontal" role=
"form">
6418 <div class=
"form-group">
6419 <label for=
"extended-priv-key" class=
"col-sm-2 control-label">BIP32 Extended Key
</label>
6420 <div class=
"col-sm-10">
6421 <textarea id=
"extended-priv-key" class=
"extended-priv-key form-control" readonly=
"readonly"></textarea>
6424 <div class=
"form-group">
6425 <label for=
"extended-pub-key" class=
"col-sm-2 control-label">BIP32 Extended Key (addresses only)
</label>
6426 <div class=
"col-sm-10">
6427 <textarea id=
"extended-pub-key" class=
"extended-pub-key form-control" readonly=
"readonly"></textarea>
6437 <div class=
"col-md-12">
6438 <h2>Derived Addresses
</h2>
6439 <p>Note these addreses are derived from the
<strong>BIP32 Extended Key
</strong></p>
6440 <table class=
"table table-striped">
6443 <div class=
"input-group">
6445 <button class=
"index-toggle">Toggle
</button>
6449 <div class=
"input-group">
6451 <button class=
"address-toggle">Toggle
</button>
6455 <div class=
"input-group">
6456 Private Key
6457 <button class=
"private-key-toggle">Toggle
</button>
6461 <tbody class=
"addresses">
6462 <tr><td> </td><td> </td><td> </td></tr>
6463 <tr><td> </td><td> </td><td> </td></tr>
6464 <tr><td> </td><td> </td><td> </td></tr>
6465 <tr><td> </td><td> </td><td> </td></tr>
6466 <tr><td> </td><td> </td><td> </td></tr>
6471 <span>Show next
</button>
6472 <input type=
"number" class=
"rows-to-add" value=
"20">
6473 <button class=
"more">Show
</button>
6478 <div class=
"col-md-12">
6480 <h3>BIP39
<span class=
"small">Mnemonic code for generating deterministic keys
</span></h3>
6483 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki">official BIP39 spec
</a>
6485 <h3>BIP32
<span class=
"small">Hierarchical Deterministic Wallets
</span></h3>
6488 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki" target=
"_blank">official BIP32 spec
</a>
6490 <a href=
"http://bip32.org/" target=
"_blank">bip32.org
</a>
6492 <h3>BIP44
<span class=
"small">Multi-Account Hierarchy for Deterministic Wallets
</span></h3>
6495 <a href=
"https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki" target=
"_blank">official BIP44 spec
</a>
6497 <h3>Private Keys
</h3>
6500 <a href=
"https://brainwallet.github.io/" target=
"_blank">brainwallet.org
</a>,
6501 but be careful - it can be easy to make mistakes if you
6502 don't know what you're doing
6510 <div class=
"col-md-12">
6512 <h2>Offline Usage
</h2>
6515 You can use this tool without having to be online.
6518 In your browser, select file save-as, and save this page
6522 Double-click that file to open it in a browser
6523 on any offline computer.
6526 Alternatively, download it from
6527 <a href=
"https://github.com/dcpos/bip39">
6528 https://github.com/dcpos/bip39
6537 <div class=
"col-md-12">
6539 <h2>This project is
100% open-source code
</h2>
6542 <span>Get the source code at -
</span>
6543 <a href=
"https://github.com/dcpos/bip39" target=
"_blank">
6544 https://github.com/dcpos/bip39
6551 <span>BitcoinJS -
</span>
6552 <a href=
"https://github.com/bitcoinjs/bitcoinjs-lib" target=
"_blank">
6553 https://github.com/bitcoinjs/bitcoinjs-lib
6558 <span>jsBIP39 -
</span>
6559 <a href=
"https://github.com/iancoleman/jsbip39" target=
"_blank">
6560 https://github.com/iancoleman/jsbip39
6565 <span>sjcl -
</span>
6566 <a href=
"https://github.com/bitwiseshiftleft/sjcl" target=
"_blank">
6567 https://github.com/bitwiseshiftleft/sjcl
6572 <span>jQuery -
</span>
6573 <a href=
"https://jquery.com/" target=
"_blank">
6579 <span>Twitter Bootstrap -
</span>
6580 <a href=
"http://getbootstrap.com/" target=
"_blank">
6581 http://getbootstrap.com/
6590 <div class=
"feedback-container">
6591 <div class=
"feedback">Loading...
</div>
6594 <script type=
"text/template" id=
"address-row-template">
6596 <td class=
"index"><span></span></td>
6597 <td class=
"address"><span></span></td>
6598 <td class=
"privkey"><span></span></td>
6603 * jQuery JavaScript Library v2.1
.1
6604 * http://jquery.com/
6606 * Includes Sizzle.js
6607 * http://sizzlejs.com/
6609 * Copyright
2005,
2014 jQuery Foundation, Inc. and other contributors
6610 * Released under the MIT license
6611 * http://jquery.org/license
6613 * Date:
2014-
05-
01T17:
11Z
6616 (function( global, factory ) {
6618 if ( typeof module === "object" && typeof module.exports === "object" ) {
6619 // For CommonJS and CommonJS-like environments where a proper window is present,
6620 // execute the factory and get jQuery
6621 // For environments that do not inherently posses a window with a document
6622 // (such as Node.js), expose a jQuery-making factory as module.exports
6623 // This accentuates the need for the creation of a real window
6624 // e.g. var jQuery = require("jquery")(window);
6625 // See ticket #
14549 for more info
6626 module.exports = global.document ?
6627 factory( global, true ) :
6629 if ( !w.document ) {
6630 throw new Error( "jQuery requires a window with a document" );
6632 return factory( w );
6638 // Pass this if window is not defined yet
6639 }(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
6641 // Can't do this because several apps including ASP.NET trace
6642 // the stack via arguments.caller.callee and Firefox dies if
6643 // you try to trace through "use strict" call chains. (#
13335)
6644 // Support: Firefox
18+
6649 var slice = arr.slice;
6651 var concat = arr.concat;
6653 var push = arr.push;
6655 var indexOf = arr.indexOf;
6657 var class2type = {};
6659 var toString = class2type.toString;
6661 var hasOwn = class2type.hasOwnProperty;
6668 // Use the correct document accordingly with window argument (sandbox)
6669 document = window.document,
6673 // Define a local copy of jQuery
6674 jQuery = function( selector, context ) {
6675 // The jQuery object is actually just the init constructor 'enhanced'
6676 // Need init if jQuery is called (just allow error to be thrown if not included)
6677 return new jQuery.fn.init( selector, context );
6680 // Support: Android
<4.1
6681 // Make sure we trim BOM and NBSP
6682 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
6684 // Matches dashed string for camelizing
6685 rmsPrefix = /^-ms-/,
6686 rdashAlpha = /-([\da-z])/gi,
6688 // Used by jQuery.camelCase as callback to replace()
6689 fcamelCase = function( all, letter ) {
6690 return letter.toUpperCase();
6693 jQuery.fn = jQuery.prototype = {
6694 // The current version of jQuery being used
6697 constructor: jQuery,
6699 // Start with an empty selector
6702 // The default length of a jQuery object is
0
6705 toArray: function() {
6706 return slice.call( this );
6709 // Get the Nth element in the matched element set OR
6710 // Get the whole matched element set as a clean array
6711 get: function( num ) {
6712 return num != null ?
6714 // Return just the one element from the set
6715 ( num <
0 ? this[ num + this.length ] : this[ num ] ) :
6717 // Return all the elements in a clean array
6721 // Take an array of elements and push it onto the stack
6722 // (returning the new matched element set)
6723 pushStack: function( elems ) {
6725 // Build a new jQuery matched element set
6726 var ret = jQuery.merge( this.constructor(), elems );
6728 // Add the old object onto the stack (as a reference)
6729 ret.prevObject = this;
6730 ret.context = this.context;
6732 // Return the newly-formed element set
6736 // Execute a callback for every element in the matched set.
6737 // (You can seed the arguments with an array of args, but this is
6738 // only used internally.)
6739 each: function( callback, args ) {
6740 return jQuery.each( this, callback, args );
6743 map: function( callback ) {
6744 return this.pushStack( jQuery.map(this, function( elem, i ) {
6745 return callback.call( elem, i, elem );
6750 return this.pushStack( slice.apply( this, arguments ) );
6754 return this.eq(
0 );
6758 return this.eq( -
1 );
6762 var len = this.length,
6763 j = +i + ( i <
0 ? len :
0 );
6764 return this.pushStack( j
>=
0 && j < len ? [ this[j] ] : [] );
6768 return this.prevObject || this.constructor(null);
6771 // For internal use only.
6772 // Behaves like an Array's method, not like a jQuery method.
6778 jQuery.extend = jQuery.fn.extend = function() {
6779 var options, name, src, copy, copyIsArray, clone,
6780 target = arguments[
0] || {},
6782 length = arguments.length,
6785 // Handle a deep copy situation
6786 if ( typeof target === "boolean" ) {
6789 // skip the boolean and the target
6790 target = arguments[ i ] || {};
6794 // Handle case when target is a string or something (possible in deep copy)
6795 if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
6799 // extend jQuery itself if only one argument is passed
6800 if ( i === length ) {
6805 for ( ; i < length; i++ ) {
6806 // Only deal with non-null/undefined values
6807 if ( (options = arguments[ i ]) != null ) {
6808 // Extend the base object
6809 for ( name in options ) {
6810 src = target[ name ];
6811 copy = options[ name ];
6813 // Prevent never-ending loop
6814 if ( target === copy ) {
6818 // Recurse if we're merging plain objects or arrays
6819 if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
6820 if ( copyIsArray ) {
6821 copyIsArray = false;
6822 clone = src && jQuery.isArray(src) ? src : [];
6825 clone = src && jQuery.isPlainObject(src) ? src : {};
6828 // Never move original objects, clone them
6829 target[ name ] = jQuery.extend( deep, clone, copy );
6831 // Don't bring in undefined values
6832 } else if ( copy !== undefined ) {
6833 target[ name ] = copy;
6839 // Return the modified object
6844 // Unique for each copy of jQuery on the page
6845 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),
6847 // Assume jQuery is ready without the ready module
6850 error: function( msg ) {
6851 throw new Error( msg );
6854 noop: function() {},
6856 // See test/unit/core.js for details concerning isFunction.
6857 // Since version
1.3, DOM methods and functions like alert
6858 // aren't supported. They return false on IE (#
2968).
6859 isFunction: function( obj ) {
6860 return jQuery.type(obj) === "function";
6863 isArray: Array.isArray,
6865 isWindow: function( obj ) {
6866 return obj != null && obj === obj.window;
6869 isNumeric: function( obj ) {
6870 // parseFloat NaNs numeric-cast false positives (null|true|false|"")
6871 // ...but misinterprets leading-number strings, particularly hex literals ("
0x...")
6872 // subtraction forces infinities to NaN
6873 return !jQuery.isArray( obj ) && obj - parseFloat( obj )
>=
0;
6876 isPlainObject: function( obj ) {
6877 // Not plain objects:
6878 // - Any object or value whose internal [[Class]] property is not "[object Object]"
6881 if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
6885 if ( obj.constructor &&
6886 !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {
6890 // If the function hasn't returned already, we're confident that
6891 // |obj| is a plain object, created by {} or constructed with new Object
6895 isEmptyObject: function( obj ) {
6897 for ( name in obj ) {
6903 type: function( obj ) {
6904 if ( obj == null ) {
6907 // Support: Android <
4.0, iOS <
6 (functionish RegExp)
6908 return typeof obj === "object" || typeof obj === "function" ?
6909 class2type[ toString.call(obj) ] || "object" :
6913 // Evaluates a script in a global context
6914 globalEval: function( code ) {
6918 code = jQuery.trim( code );
6921 // If the code includes a valid, prologue position
6922 // strict mode pragma, execute code by injecting a
6923 // script tag into the document.
6924 if ( code.indexOf("use strict") ===
1 ) {
6925 script = document.createElement("script");
6927 document.head.appendChild( script ).parentNode.removeChild( script );
6929 // Otherwise, avoid the DOM node creation, insertion
6930 // and removal by using an indirect global eval
6936 // Convert dashed to camelCase; used by the css and data modules
6937 // Microsoft forgot to hump their vendor prefix (#
9572)
6938 camelCase: function( string ) {
6939 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
6942 nodeName: function( elem, name ) {
6943 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
6946 // args is for internal usage only
6947 each: function( obj, callback, args ) {
6950 length = obj.length,
6951 isArray = isArraylike( obj );
6955 for ( ; i < length; i++ ) {
6956 value = callback.apply( obj[ i ], args );
6958 if ( value === false ) {
6964 value = callback.apply( obj[ i ], args );
6966 if ( value === false ) {
6972 // A special, fast, case for the most common use of each
6975 for ( ; i < length; i++ ) {
6976 value = callback.call( obj[ i ], i, obj[ i ] );
6978 if ( value === false ) {
6984 value = callback.call( obj[ i ], i, obj[ i ] );
6986 if ( value === false ) {
6996 // Support: Android
<4.1
6997 trim: function( text ) {
6998 return text == null ?
7000 ( text +
"" ).replace( rtrim,
"" );
7003 // results is for internal usage only
7004 makeArray: function( arr, results ) {
7005 var ret = results || [];
7007 if ( arr != null ) {
7008 if ( isArraylike( Object(arr) ) ) {
7010 typeof arr ===
"string" ?
7014 push.call( ret, arr );
7021 inArray: function( elem, arr, i ) {
7022 return arr == null ? -
1 : indexOf.call( arr, elem, i );
7025 merge: function( first, second ) {
7026 var len = +second.length,
7030 for ( ; j < len; j++ ) {
7031 first[ i++ ] = second[ j ];
7039 grep: function( elems, callback, invert ) {
7040 var callbackInverse,
7043 length = elems.length,
7044 callbackExpect = !invert;
7046 // Go through the array, only saving the items
7047 // that pass the validator function
7048 for ( ; i < length; i++ ) {
7049 callbackInverse = !callback( elems[ i ], i );
7050 if ( callbackInverse !== callbackExpect ) {
7051 matches.push( elems[ i ] );
7058 // arg is for internal usage only
7059 map: function( elems, callback, arg ) {
7062 length = elems.length,
7063 isArray = isArraylike( elems ),
7066 // Go through the array, translating each of the items to their new values
7068 for ( ; i < length; i++ ) {
7069 value = callback( elems[ i ], i, arg );
7071 if ( value != null ) {
7076 // Go through every key on the object,
7078 for ( i in elems ) {
7079 value = callback( elems[ i ], i, arg );
7081 if ( value != null ) {
7087 // Flatten any nested arrays
7088 return concat.apply( [], ret );
7091 // A global GUID counter for objects
7094 // Bind a function to a context, optionally partially applying any
7096 proxy: function( fn, context ) {
7097 var tmp, args, proxy;
7099 if ( typeof context ===
"string" ) {
7100 tmp = fn[ context ];
7105 // Quick check to determine if target is callable, in the spec
7106 // this throws a TypeError, but we will just return undefined.
7107 if ( !jQuery.isFunction( fn ) ) {
7112 args = slice.call( arguments,
2 );
7113 proxy = function() {
7114 return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
7117 // Set the guid of unique handler to the same of original handler, so it can be removed
7118 proxy.guid = fn.guid = fn.guid || jQuery.guid++;
7125 // jQuery.support is not used in Core but other projects attach their
7126 // properties to it so it needs to exist.
7130 // Populate the class2type map
7131 jQuery.each(
"Boolean Number String Function Array Date RegExp Object Error".split(
" "), function(i, name) {
7132 class2type[
"[object " + name +
"]" ] = name.toLowerCase();
7135 function isArraylike( obj ) {
7136 var length = obj.length,
7137 type = jQuery.type( obj );
7139 if ( type ===
"function" || jQuery.isWindow( obj ) ) {
7143 if ( obj.nodeType ===
1 && length ) {
7147 return type ===
"array" || length ===
0 ||
7148 typeof length ===
"number" && length
> 0 && ( length -
1 ) in obj;
7152 * Sizzle CSS Selector Engine v1.10
.19
7153 * http://sizzlejs.com/
7155 * Copyright
2013 jQuery Foundation, Inc. and other contributors
7156 * Released under the MIT license
7157 * http://jquery.org/license
7161 (function( window ) {
7175 // Local document vars
7185 // Instance-specific data
7186 expando =
"sizzle" + -(new Date()),
7187 preferredDoc = window.document,
7190 classCache = createCache(),
7191 tokenCache = createCache(),
7192 compilerCache = createCache(),
7193 sortOrder = function( a, b ) {
7195 hasDuplicate = true;
7200 // General-purpose constants
7201 strundefined = typeof undefined,
7202 MAX_NEGATIVE =
1 <<
31,
7205 hasOwn = ({}).hasOwnProperty,
7208 push_native = arr.push,
7211 // Use a stripped-down indexOf if we can't use a native one
7212 indexOf = arr.indexOf || function( elem ) {
7215 for ( ; i < len; i++ ) {
7216 if ( this[i] === elem ) {
7223 booleans =
"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
7225 // Regular expressions
7227 // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
7228 whitespace =
"[\\x20\\t\\r\\n\\f]",
7229 // http://www.w3.org/TR/css3-syntax/#characters
7230 characterEncoding =
"(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
7232 // Loosely modeled on CSS identifier characters
7233 // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
7234 // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
7235 identifier = characterEncoding.replace(
"w",
"w#" ),
7237 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
7238 attributes =
"\\[" + whitespace +
"*(" + characterEncoding +
")(?:" + whitespace +
7239 // Operator (capture
2)
7240 "*([*^$|!~]?=)" + whitespace +
7241 //
"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
7242 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\
"])*)\"|(
" + identifier + "))|)
" + whitespace +
7245 pseudos = ":(
" + characterEncoding + ")(?:\\((
" +
7246 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
7247 // 1. quoted (capture 3; capture 4 or capture 5)
7248 "('((?:\\\\.|[^\\\\'])*)'|\
"((?:\\\\.|[^\\\\\"])*)\
")|" +
7249 //
2. simple (capture
6)
7250 "((?:\\\\.|[^\\\\()[\\]]|" + attributes +
")*)|" +
7251 //
3. anything else (capture
2)
7255 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
7256 rtrim = new RegExp(
"^" + whitespace +
"+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace +
"+$",
"g" ),
7258 rcomma = new RegExp(
"^" + whitespace +
"*," + whitespace +
"*" ),
7259 rcombinators = new RegExp(
"^" + whitespace +
"*([>+~]|" + whitespace +
")" + whitespace +
"*" ),
7261 rattributeQuotes = new RegExp(
"=" + whitespace +
"*([^\\]'\"]*?)
" + whitespace + "*\\]
", "g
" ),
7263 rpseudo = new RegExp( pseudos ),
7264 ridentifier = new RegExp( "^
" + identifier + "$
" ),
7267 "ID
": new RegExp( "^#(
" + characterEncoding + ")
" ),
7268 "CLASS
": new RegExp( "^\\.(
" + characterEncoding + ")
" ),
7269 "TAG
": new RegExp( "^(
" + characterEncoding.replace( "w
", "w*
" ) + ")
" ),
7270 "ATTR
": new RegExp( "^
" + attributes ),
7271 "PSEUDO
": new RegExp( "^
" + pseudos ),
7272 "CHILD
": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(
" + whitespace +
7273 "*(even|odd|(([+-]|)(\\d*)n|)
" + whitespace + "*(?:([+-]|)
" + whitespace +
7274 "*(\\d+)|))
" + whitespace + "*\\)|)
", "i
" ),
7275 "bool
": new RegExp( "^(?:
" + booleans + ")$
", "i
" ),
7276 // For use in libraries implementing .is()
7277 // We use this for POS matching in `select`
7278 "needsContext
": new RegExp( "^
" + whitespace + "*[
>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
7279 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
7282 rinputs = /^(?:input|select|textarea|button)$/i,
7285 rnative = /^[^{]+\{\s*\[native \w/,
7287 // Easily-parseable/retrievable ID or TAG or CLASS selectors
7288 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
7293 // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
7294 runescape = new RegExp( "\\\\([\\da-f]{
1,
6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
7295 funescape = function( _, escaped, escapedWhitespace ) {
7296 var high = "
0x" + escaped -
0x10000;
7297 // NaN means non-codepoint
7298 // Support: Firefox
<24
7299 // Workaround erroneous numeric interpretation of +
"0x"
7300 return high !== high || escapedWhitespace ?
7304 String.fromCharCode( high +
0x10000 ) :
7305 // Supplemental Plane codepoint (surrogate pair)
7306 String.fromCharCode( high
>> 10 |
0xD800, high &
0x3FF |
0xDC00 );
7309 // Optimize for push.apply( _, NodeList )
7312 (arr = slice.call( preferredDoc.childNodes )),
7313 preferredDoc.childNodes
7315 // Support: Android
<4.0
7316 // Detect silently failing push.apply
7317 arr[ preferredDoc.childNodes.length ].nodeType;
7319 push = { apply: arr.length ?
7321 // Leverage slice if possible
7322 function( target, els ) {
7323 push_native.apply( target, slice.call(els) );
7327 // Otherwise append directly
7328 function( target, els ) {
7329 var j = target.length,
7331 // Can't trust NodeList.length
7332 while ( (target[j++] = els[i++]) ) {}
7333 target.length = j -
1;
7338 function Sizzle( selector, context, results, seed ) {
7339 var match, elem, m, nodeType,
7341 i, groups, old, nid, newContext, newSelector;
7343 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
7344 setDocument( context );
7347 context = context || document;
7348 results = results || [];
7350 if ( !selector || typeof selector !==
"string" ) {
7354 if ( (nodeType = context.nodeType) !==
1 && nodeType !==
9 ) {
7358 if ( documentIsHTML && !seed ) {
7361 if ( (match = rquickExpr.exec( selector )) ) {
7362 // Speed-up: Sizzle(
"#ID")
7363 if ( (m = match[
1]) ) {
7364 if ( nodeType ===
9 ) {
7365 elem = context.getElementById( m );
7366 // Check parentNode to catch when Blackberry
4.6 returns
7367 // nodes that are no longer in the document (jQuery #
6963)
7368 if ( elem && elem.parentNode ) {
7369 // Handle the case where IE, Opera, and Webkit return items
7370 // by name instead of ID
7371 if ( elem.id === m ) {
7372 results.push( elem );
7379 // Context is not a document
7380 if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
7381 contains( context, elem ) && elem.id === m ) {
7382 results.push( elem );
7387 // Speed-up: Sizzle(
"TAG")
7388 } else if ( match[
2] ) {
7389 push.apply( results, context.getElementsByTagName( selector ) );
7392 // Speed-up: Sizzle(
".CLASS")
7393 } else if ( (m = match[
3]) && support.getElementsByClassName && context.getElementsByClassName ) {
7394 push.apply( results, context.getElementsByClassName( m ) );
7400 if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {
7401 nid = old = expando;
7402 newContext = context;
7403 newSelector = nodeType ===
9 && selector;
7405 // qSA works strangely on Element-rooted queries
7406 // We can work around this by specifying an extra ID on the root
7407 // and working up from there (Thanks to Andrew Dupont for the technique)
7408 // IE
8 doesn't work on object elements
7409 if ( nodeType ===
1 && context.nodeName.toLowerCase() !==
"object" ) {
7410 groups = tokenize( selector );
7412 if ( (old = context.getAttribute(
"id")) ) {
7413 nid = old.replace( rescape,
"\\$&" );
7415 context.setAttribute(
"id", nid );
7417 nid =
"[id='" + nid +
"'] ";
7421 groups[i] = nid + toSelector( groups[i] );
7423 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;
7424 newSelector = groups.join(
",");
7427 if ( newSelector ) {
7429 push.apply( results,
7430 newContext.querySelectorAll( newSelector )
7436 context.removeAttribute(
"id");
7444 return select( selector.replace( rtrim,
"$1" ), context, results, seed );
7448 * Create key-value caches of limited size
7449 * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
7450 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
7451 * deleting the oldest entry
7453 function createCache() {
7456 function cache( key, value ) {
7457 // Use (key +
" ") to avoid collision with native prototype properties (see Issue #
157)
7458 if ( keys.push( key +
" " )
> Expr.cacheLength ) {
7459 // Only keep the most recent entries
7460 delete cache[ keys.shift() ];
7462 return (cache[ key + " " ] = value);
7468 * Mark a function for special use by Sizzle
7469 * @param {Function} fn The function to mark
7471 function markFunction( fn ) {
7472 fn[ expando ] = true;
7477 * Support testing using an element
7478 * @param {Function} fn Passed the created div and expects a boolean result
7480 function assert( fn ) {
7481 var div = document.createElement("div");
7488 // Remove from its parent by default
7489 if ( div.parentNode ) {
7490 div.parentNode.removeChild( div );
7492 // release memory in IE
7498 * Adds the same handler for all of the specified attrs
7499 * @param {String} attrs Pipe-separated list of attributes
7500 * @param {Function} handler The method that will be applied
7502 function addHandle( attrs, handler ) {
7503 var arr = attrs.split("|"),
7507 Expr.attrHandle[ arr[i] ] = handler;
7512 * Checks document order of two siblings
7513 * @param {Element} a
7514 * @param {Element} b
7515 * @returns {Number} Returns less than
0 if a precedes b, greater than
0 if a follows b
7517 function siblingCheck( a, b ) {
7519 diff = cur && a.nodeType ===
1 && b.nodeType ===
1 &&
7520 ( ~b.sourceIndex || MAX_NEGATIVE ) -
7521 ( ~a.sourceIndex || MAX_NEGATIVE );
7523 // Use IE sourceIndex if available on both nodes
7528 // Check if b follows a
7530 while ( (cur = cur.nextSibling) ) {
7541 * Returns a function to use in pseudos for input types
7542 * @param {String} type
7544 function createInputPseudo( type ) {
7545 return function( elem ) {
7546 var name = elem.nodeName.toLowerCase();
7547 return name === "input" && elem.type === type;
7552 * Returns a function to use in pseudos for buttons
7553 * @param {String} type
7555 function createButtonPseudo( type ) {
7556 return function( elem ) {
7557 var name = elem.nodeName.toLowerCase();
7558 return (name === "input" || name === "button") && elem.type === type;
7563 * Returns a function to use in pseudos for positionals
7564 * @param {Function} fn
7566 function createPositionalPseudo( fn ) {
7567 return markFunction(function( argument ) {
7568 argument = +argument;
7569 return markFunction(function( seed, matches ) {
7571 matchIndexes = fn( [], seed.length, argument ),
7572 i = matchIndexes.length;
7574 // Match elements found at the specified indexes
7576 if ( seed[ (j = matchIndexes[i]) ] ) {
7577 seed[j] = !(matches[j] = seed[j]);
7585 * Checks a node for validity as a Sizzle context
7586 * @param {Element|Object=} context
7587 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
7589 function testContext( context ) {
7590 return context && typeof context.getElementsByTagName !== strundefined && context;
7593 // Expose support vars for convenience
7594 support = Sizzle.support = {};
7598 * @param {Element|Object} elem An element or a document
7599 * @returns {Boolean} True iff elem is a non-HTML XML node
7601 isXML = Sizzle.isXML = function( elem ) {
7602 // documentElement is verified for cases where it doesn't yet exist
7603 // (such as loading iframes in IE - #
4833)
7604 var documentElement = elem && (elem.ownerDocument || elem).documentElement;
7605 return documentElement ? documentElement.nodeName !== "HTML" : false;
7609 * Sets document-related variables once based on the current document
7610 * @param {Element|Object} [doc] An element or document object to use to set the document
7611 * @returns {Object} Returns the current document
7613 setDocument = Sizzle.setDocument = function( node ) {
7615 doc = node ? node.ownerDocument || node : preferredDoc,
7616 parent = doc.defaultView;
7618 // If no document and documentElement is available, return
7619 if ( doc === document || doc.nodeType !==
9 || !doc.documentElement ) {
7625 docElem = doc.documentElement;
7628 documentIsHTML = !isXML( doc );
7631 // If iframe document is assigned to
"document" variable and if iframe has been reloaded,
7632 // IE will throw
"permission denied" error when accessing
"document" variable, see jQuery #
13936
7633 // IE6-
8 do not support the defaultView property so parent will be undefined
7634 if ( parent && parent !== parent.top ) {
7635 // IE11 does not have attachEvent, so all must suffer
7636 if ( parent.addEventListener ) {
7637 parent.addEventListener(
"unload", function() {
7640 } else if ( parent.attachEvent ) {
7641 parent.attachEvent(
"onunload", function() {
7648 ---------------------------------------------------------------------- */
7651 // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)
7652 support.attributes = assert(function( div ) {
7653 div.className =
"i";
7654 return !div.getAttribute(
"className");
7658 ---------------------------------------------------------------------- */
7660 // Check if getElementsByTagName(
"*") returns only elements
7661 support.getElementsByTagName = assert(function( div ) {
7662 div.appendChild( doc.createComment(
"") );
7663 return !div.getElementsByTagName(
"*").length;
7666 // Check if getElementsByClassName can be trusted
7667 support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {
7668 div.innerHTML =
"<div class='a'></div><div class='a i'></div>";
7670 // Support: Safari
<4
7671 // Catch class over-caching
7672 div.firstChild.className =
"i";
7673 // Support: Opera
<10
7674 // Catch gEBCN failure to find non-leading classes
7675 return div.getElementsByClassName(
"i").length ===
2;
7679 // Check if getElementById returns elements by name
7680 // The broken getElementById methods don't pick up programatically-set names,
7681 // so use a roundabout getElementsByName test
7682 support.getById = assert(function( div ) {
7683 docElem.appendChild( div ).id = expando;
7684 return !doc.getElementsByName || !doc.getElementsByName( expando ).length;
7687 // ID find and filter
7688 if ( support.getById ) {
7689 Expr.find[
"ID"] = function( id, context ) {
7690 if ( typeof context.getElementById !== strundefined && documentIsHTML ) {
7691 var m = context.getElementById( id );
7692 // Check parentNode to catch when Blackberry
4.6 returns
7693 // nodes that are no longer in the document #
6963
7694 return m && m.parentNode ? [ m ] : [];
7697 Expr.filter[
"ID"] = function( id ) {
7698 var attrId = id.replace( runescape, funescape );
7699 return function( elem ) {
7700 return elem.getAttribute(
"id") === attrId;
7705 // getElementById is not reliable as a find shortcut
7706 delete Expr.find[
"ID"];
7708 Expr.filter[
"ID"] = function( id ) {
7709 var attrId = id.replace( runescape, funescape );
7710 return function( elem ) {
7711 var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode(
"id");
7712 return node && node.value === attrId;
7718 Expr.find[
"TAG"] = support.getElementsByTagName ?
7719 function( tag, context ) {
7720 if ( typeof context.getElementsByTagName !== strundefined ) {
7721 return context.getElementsByTagName( tag );
7724 function( tag, context ) {
7728 results = context.getElementsByTagName( tag );
7730 // Filter out possible comments
7731 if ( tag ===
"*" ) {
7732 while ( (elem = results[i++]) ) {
7733 if ( elem.nodeType ===
1 ) {
7744 Expr.find[
"CLASS"] = support.getElementsByClassName && function( className, context ) {
7745 if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {
7746 return context.getElementsByClassName( className );
7750 /* QSA/matchesSelector
7751 ---------------------------------------------------------------------- */
7753 // QSA and matchesSelector support
7755 // matchesSelector(:active) reports false when true (IE9/Opera
11.5)
7758 // qSa(:focus) reports false when true (Chrome
21)
7759 // We allow this because of a bug in IE8/
9 that throws an error
7760 // whenever `document.activeElement` is accessed on an iframe
7761 // So, we allow :focus to pass through QSA all the time to avoid the IE error
7762 // See http://bugs.jquery.com/ticket/
13378
7765 if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {
7767 // Regex strategy adopted from Diego Perini
7768 assert(function( div ) {
7769 // Select is set to empty string on purpose
7770 // This is to test IE's treatment of not explicitly
7771 // setting a boolean content attribute,
7772 // since its presence should be enough
7773 // http://bugs.jquery.com/ticket/
12359
7774 div.innerHTML =
"<select msallowclip=''><option selected=''></option></select>";
7776 // Support: IE8, Opera
11-
12.16
7777 // Nothing should be selected when empty strings follow ^= or $= or *=
7778 // The test attribute must be unknown in Opera but
"safe" for WinRT
7779 // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
7780 if ( div.querySelectorAll(
"[msallowclip^='']").length ) {
7781 rbuggyQSA.push(
"[*^$]=" + whitespace +
"*(?:''|\"\
")" );
7785 // Boolean attributes and
"value" are not treated correctly
7786 if ( !div.querySelectorAll(
"[selected]").length ) {
7787 rbuggyQSA.push(
"\\[" + whitespace +
"*(?:value|" + booleans +
")" );
7790 // Webkit/Opera - :checked should return selected option elements
7791 // http://www.w3.org/TR/
2011/REC-css3-selectors-
20110929/#checked
7792 // IE8 throws error here and will not see later tests
7793 if ( !div.querySelectorAll(
":checked").length ) {
7794 rbuggyQSA.push(
":checked");
7798 assert(function( div ) {
7799 // Support: Windows
8 Native Apps
7800 // The type and name attributes are restricted during .innerHTML assignment
7801 var input = doc.createElement(
"input");
7802 input.setAttribute(
"type",
"hidden" );
7803 div.appendChild( input ).setAttribute(
"name",
"D" );
7806 // Enforce case-sensitivity of name attribute
7807 if ( div.querySelectorAll(
"[name=d]").length ) {
7808 rbuggyQSA.push(
"name" + whitespace +
"*[*^$|!~]?=" );
7811 // FF
3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
7812 // IE8 throws error here and will not see later tests
7813 if ( !div.querySelectorAll(
":enabled").length ) {
7814 rbuggyQSA.push(
":enabled",
":disabled" );
7817 // Opera
10-
11 does not throw on post-comma invalid pseudos
7818 div.querySelectorAll(
"*,:x");
7819 rbuggyQSA.push(
",.*:");
7823 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
7824 docElem.webkitMatchesSelector ||
7825 docElem.mozMatchesSelector ||
7826 docElem.oMatchesSelector ||
7827 docElem.msMatchesSelector) )) ) {
7829 assert(function( div ) {
7830 // Check to see if it's possible to do matchesSelector
7831 // on a disconnected node (IE
9)
7832 support.disconnectedMatch = matches.call( div,
"div" );
7834 // This should fail with an exception
7835 // Gecko does not error, returns false instead
7836 matches.call( div,
"[s!='']:x" );
7837 rbuggyMatches.push(
"!=", pseudos );
7841 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(
"|") );
7842 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(
"|") );
7845 ---------------------------------------------------------------------- */
7846 hasCompare = rnative.test( docElem.compareDocumentPosition );
7848 // Element contains another
7849 // Purposefully does not implement inclusive descendent
7850 // As in, an element does not contain itself
7851 contains = hasCompare || rnative.test( docElem.contains ) ?
7853 var adown = a.nodeType ===
9 ? a.documentElement : a,
7854 bup = b && b.parentNode;
7855 return a === bup || !!( bup && bup.nodeType ===
1 && (
7857 adown.contains( bup ) :
7858 a.compareDocumentPosition && a.compareDocumentPosition( bup ) &
16
7863 while ( (b = b.parentNode) ) {
7873 ---------------------------------------------------------------------- */
7875 // Document order sorting
7876 sortOrder = hasCompare ?
7879 // Flag for duplicate removal
7881 hasDuplicate = true;
7885 // Sort on method existence if only one input has compareDocumentPosition
7886 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
7891 // Calculate position if both inputs belong to the same document
7892 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
7893 a.compareDocumentPosition( b ) :
7895 // Otherwise we know they are disconnected
7898 // Disconnected nodes
7900 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {
7902 // Choose the first element that is related to our preferred document
7903 if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
7906 if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
7910 // Maintain original order
7912 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
7916 return compare &
4 ? -
1 :
1;
7919 // Exit early if the nodes are identical
7921 hasDuplicate = true;
7932 // Parentless nodes are either documents or disconnected
7933 if ( !aup || !bup ) {
7934 return a === doc ? -
1 :
7939 ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :
7942 // If the nodes are siblings, we can do a quick check
7943 } else if ( aup === bup ) {
7944 return siblingCheck( a, b );
7947 // Otherwise we need full lists of their ancestors for comparison
7949 while ( (cur = cur.parentNode) ) {
7953 while ( (cur = cur.parentNode) ) {
7957 // Walk down the tree looking for a discrepancy
7958 while ( ap[i] === bp[i] ) {
7963 // Do a sibling check if the nodes have a common ancestor
7964 siblingCheck( ap[i], bp[i] ) :
7966 // Otherwise nodes in our document sort first
7967 ap[i] === preferredDoc ? -
1 :
7968 bp[i] === preferredDoc ?
1 :
7975 Sizzle.matches = function( expr, elements ) {
7976 return Sizzle( expr, null, null, elements );
7979 Sizzle.matchesSelector = function( elem, expr ) {
7980 // Set document vars if needed
7981 if ( ( elem.ownerDocument || elem ) !== document ) {
7982 setDocument( elem );
7985 // Make sure that attribute selectors are quoted
7986 expr = expr.replace( rattributeQuotes,
"='$1']" );
7988 if ( support.matchesSelector && documentIsHTML &&
7989 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
7990 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {
7993 var ret = matches.call( elem, expr );
7995 // IE
9's matchesSelector returns false on disconnected nodes
7996 if ( ret || support.disconnectedMatch ||
7997 // As well, disconnected nodes are said to be in a document
7999 elem.document && elem.document.nodeType !==
11 ) {
8005 return Sizzle( expr, document, null, [ elem ] ).length
> 0;
8008 Sizzle.contains = function( context, elem ) {
8009 // Set document vars if needed
8010 if ( ( context.ownerDocument || context ) !== document ) {
8011 setDocument( context );
8013 return contains( context, elem );
8016 Sizzle.attr = function( elem, name ) {
8017 // Set document vars if needed
8018 if ( ( elem.ownerDocument || elem ) !== document ) {
8019 setDocument( elem );
8022 var fn = Expr.attrHandle[ name.toLowerCase() ],
8023 // Don't get fooled by Object.prototype properties (jQuery #
13807)
8024 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
8025 fn( elem, name, !documentIsHTML ) :
8028 return val !== undefined ?
8030 support.attributes || !documentIsHTML ?
8031 elem.getAttribute( name ) :
8032 (val = elem.getAttributeNode(name)) && val.specified ?
8037 Sizzle.error = function( msg ) {
8038 throw new Error(
"Syntax error, unrecognized expression: " + msg );
8042 * Document sorting and removing duplicates
8043 * @param {ArrayLike} results
8045 Sizzle.uniqueSort = function( results ) {
8051 // Unless we *know* we can detect duplicates, assume their presence
8052 hasDuplicate = !support.detectDuplicates;
8053 sortInput = !support.sortStable && results.slice(
0 );
8054 results.sort( sortOrder );
8056 if ( hasDuplicate ) {
8057 while ( (elem = results[i++]) ) {
8058 if ( elem === results[ i ] ) {
8059 j = duplicates.push( i );
8063 results.splice( duplicates[ j ],
1 );
8067 // Clear input after sorting to release objects
8068 // See https://github.com/jquery/sizzle/pull/
225
8075 * Utility function for retrieving the text value of an array of DOM nodes
8076 * @param {Array|Element} elem
8078 getText = Sizzle.getText = function( elem ) {
8082 nodeType = elem.nodeType;
8085 // If no nodeType, this is expected to be an array
8086 while ( (node = elem[i++]) ) {
8087 // Do not traverse comment nodes
8088 ret += getText( node );
8090 } else if ( nodeType ===
1 || nodeType ===
9 || nodeType ===
11 ) {
8091 // Use textContent for elements
8092 // innerText usage removed for consistency of new lines (jQuery #
11153)
8093 if ( typeof elem.textContent ===
"string" ) {
8094 return elem.textContent;
8096 // Traverse its children
8097 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8098 ret += getText( elem );
8101 } else if ( nodeType ===
3 || nodeType ===
4 ) {
8102 return elem.nodeValue;
8104 // Do not include comment or processing instruction nodes
8109 Expr = Sizzle.selectors = {
8111 // Can be adjusted by the user
8114 createPseudo: markFunction,
8123 ">": { dir:
"parentNode", first: true },
8124 " ": { dir:
"parentNode" },
8125 "+": { dir:
"previousSibling", first: true },
8126 "~": { dir:
"previousSibling" }
8130 "ATTR": function( match ) {
8131 match[
1] = match[
1].replace( runescape, funescape );
8133 // Move the given value to match[
3] whether quoted or unquoted
8134 match[
3] = ( match[
3] || match[
4] || match[
5] ||
"" ).replace( runescape, funescape );
8136 if ( match[
2] ===
"~=" ) {
8137 match[
3] =
" " + match[
3] +
" ";
8140 return match.slice(
0,
4 );
8143 "CHILD": function( match ) {
8144 /* matches from matchExpr[
"CHILD"]
8145 1 type (only|nth|...)
8146 2 what (child|of-type)
8147 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
8148 4 xn-component of xn+y argument ([+-]?\d*n|)
8149 5 sign of xn-component
8151 7 sign of y-component
8154 match[
1] = match[
1].toLowerCase();
8156 if ( match[
1].slice(
0,
3 ) ===
"nth" ) {
8157 // nth-* requires argument
8159 Sizzle.error( match[
0] );
8162 // numeric x and y parameters for Expr.filter.CHILD
8163 // remember that false/true cast respectively to
0/
1
8164 match[
4] = +( match[
4] ? match[
5] + (match[
6] ||
1) :
2 * ( match[
3] ===
"even" || match[
3] ===
"odd" ) );
8165 match[
5] = +( ( match[
7] + match[
8] ) || match[
3] ===
"odd" );
8167 // other types prohibit arguments
8168 } else if ( match[
3] ) {
8169 Sizzle.error( match[
0] );
8175 "PSEUDO": function( match ) {
8177 unquoted = !match[
6] && match[
2];
8179 if ( matchExpr[
"CHILD"].test( match[
0] ) ) {
8183 // Accept quoted arguments as-is
8185 match[
2] = match[
4] || match[
5] ||
"";
8187 // Strip excess characters from unquoted arguments
8188 } else if ( unquoted && rpseudo.test( unquoted ) &&
8189 // Get excess from tokenize (recursively)
8190 (excess = tokenize( unquoted, true )) &&
8191 // advance to the next closing parenthesis
8192 (excess = unquoted.indexOf(
")", unquoted.length - excess ) - unquoted.length) ) {
8194 // excess is a negative index
8195 match[
0] = match[
0].slice(
0, excess );
8196 match[
2] = unquoted.slice(
0, excess );
8199 // Return only captures needed by the pseudo filter method (type and argument)
8200 return match.slice(
0,
3 );
8206 "TAG": function( nodeNameSelector ) {
8207 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
8208 return nodeNameSelector ===
"*" ?
8209 function() { return true; } :
8211 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
8215 "CLASS": function( className ) {
8216 var pattern = classCache[ className +
" " ];
8219 (pattern = new RegExp(
"(^|" + whitespace +
")" + className +
"(" + whitespace +
"|$)" )) &&
8220 classCache( className, function( elem ) {
8221 return pattern.test( typeof elem.className ===
"string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute(
"class") ||
"" );
8225 "ATTR": function( name, operator, check ) {
8226 return function( elem ) {
8227 var result = Sizzle.attr( elem, name );
8229 if ( result == null ) {
8230 return operator ===
"!=";
8238 return operator ===
"=" ? result === check :
8239 operator ===
"!=" ? result !== check :
8240 operator ===
"^=" ? check && result.indexOf( check ) ===
0 :
8241 operator ===
"*=" ? check && result.indexOf( check )
> -
1 :
8242 operator === "$=" ? check && result.slice( -check.length ) === check :
8243 operator === "~=" ? ( " " + result + " " ).indexOf( check )
> -
1 :
8244 operator === "|=" ? result === check || result.slice(
0, check.length +
1 ) === check + "-" :
8249 "CHILD": function( type, what, argument, first, last ) {
8250 var simple = type.slice(
0,
3 ) !== "nth",
8251 forward = type.slice( -
4 ) !== "last",
8252 ofType = what === "of-type";
8254 return first ===
1 && last ===
0 ?
8256 // Shortcut for :nth-*(n)
8258 return !!elem.parentNode;
8261 function( elem, context, xml ) {
8262 var cache, outerCache, node, diff, nodeIndex, start,
8263 dir = simple !== forward ? "nextSibling" : "previousSibling",
8264 parent = elem.parentNode,
8265 name = ofType && elem.nodeName.toLowerCase(),
8266 useCache = !xml && !ofType;
8270 // :(first|last|only)-(child|of-type)
8274 while ( (node = node[ dir ]) ) {
8275 if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType ===
1 ) {
8279 // Reverse direction for :only-* (if we haven't yet done so)
8280 start = dir = type === "only" && !start && "nextSibling";
8285 start = [ forward ? parent.firstChild : parent.lastChild ];
8287 // non-xml :nth-child(...) stores cache data on `parent`
8288 if ( forward && useCache ) {
8289 // Seek `elem` from a previously-cached index
8290 outerCache = parent[ expando ] || (parent[ expando ] = {});
8291 cache = outerCache[ type ] || [];
8292 nodeIndex = cache[
0] === dirruns && cache[
1];
8293 diff = cache[
0] === dirruns && cache[
2];
8294 node = nodeIndex && parent.childNodes[ nodeIndex ];
8296 while ( (node = ++nodeIndex && node && node[ dir ] ||
8298 // Fallback to seeking `elem` from the start
8299 (diff = nodeIndex =
0) || start.pop()) ) {
8301 // When found, cache indexes on `parent` and break
8302 if ( node.nodeType ===
1 && ++diff && node === elem ) {
8303 outerCache[ type ] = [ dirruns, nodeIndex, diff ];
8308 // Use previously-cached element index if available
8309 } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[
0] === dirruns ) {
8312 // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
8314 // Use the same loop as above to seek `elem` from the start
8315 while ( (node = ++nodeIndex && node && node[ dir ] ||
8316 (diff = nodeIndex =
0) || start.pop()) ) {
8318 if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType ===
1 ) && ++diff ) {
8319 // Cache the index of each encountered element
8321 (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
8324 if ( node === elem ) {
8331 // Incorporate the offset, then check against cycle size
8333 return diff === first || ( diff % first ===
0 && diff / first
>=
0 );
8338 "PSEUDO": function( pseudo, argument ) {
8339 // pseudo-class names are case-insensitive
8340 // http://www.w3.org/TR/selectors/#pseudo-classes
8341 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
8342 // Remember that setFilters inherits from pseudos
8344 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
8345 Sizzle.error( "unsupported pseudo: " + pseudo );
8347 // The user may use createPseudo to indicate that
8348 // arguments are needed to create the filter function
8349 // just as Sizzle does
8350 if ( fn[ expando ] ) {
8351 return fn( argument );
8354 // But maintain support for old signatures
8355 if ( fn.length
> 1 ) {
8356 args = [ pseudo, pseudo,
"", argument ];
8357 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
8358 markFunction(function( seed, matches ) {
8360 matched = fn( seed, argument ),
8363 idx = indexOf.call( seed, matched[i] );
8364 seed[ idx ] = !( matches[ idx ] = matched[i] );
8368 return fn( elem,
0, args );
8377 // Potentially complex pseudos
8378 "not": markFunction(function( selector ) {
8379 // Trim the selector passed to compile
8380 // to avoid treating leading and trailing
8381 // spaces as combinators
8384 matcher = compile( selector.replace( rtrim,
"$1" ) );
8386 return matcher[ expando ] ?
8387 markFunction(function( seed, matches, context, xml ) {
8389 unmatched = matcher( seed, null, xml, [] ),
8392 // Match elements unmatched by `matcher`
8394 if ( (elem = unmatched[i]) ) {
8395 seed[i] = !(matches[i] = elem);
8399 function( elem, context, xml ) {
8401 matcher( input, null, xml, results );
8402 return !results.pop();
8406 "has": markFunction(function( selector ) {
8407 return function( elem ) {
8408 return Sizzle( selector, elem ).length
> 0;
8412 "contains": markFunction(function( text ) {
8413 return function( elem ) {
8414 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text )
> -
1;
8418 // "Whether an element is represented by a :lang() selector
8419 // is based solely on the element's language value
8420 // being equal to the identifier C,
8421 // or beginning with the identifier C immediately followed by "-".
8422 // The matching of C against the element's language value is performed case-insensitively.
8423 // The identifier C does not have to be a valid language name."
8424 // http://www.w3.org/TR/selectors/#lang-pseudo
8425 "lang": markFunction( function( lang ) {
8426 // lang value must be a valid identifier
8427 if ( !ridentifier.test(lang || "") ) {
8428 Sizzle.error( "unsupported lang: " + lang );
8430 lang = lang.replace( runescape, funescape ).toLowerCase();
8431 return function( elem ) {
8434 if ( (elemLang = documentIsHTML ?
8436 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {
8438 elemLang = elemLang.toLowerCase();
8439 return elemLang === lang || elemLang.indexOf( lang + "-" ) ===
0;
8441 } while ( (elem = elem.parentNode) && elem.nodeType ===
1 );
8447 "target": function( elem ) {
8448 var hash = window.location && window.location.hash;
8449 return hash && hash.slice(
1 ) === elem.id;
8452 "root": function( elem ) {
8453 return elem === docElem;
8456 "focus": function( elem ) {
8457 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
8460 // Boolean properties
8461 "enabled": function( elem ) {
8462 return elem.disabled === false;
8465 "disabled": function( elem ) {
8466 return elem.disabled === true;
8469 "checked": function( elem ) {
8470 // In CSS3, :checked should return both checked and selected elements
8471 // http://www.w3.org/TR/
2011/REC-css3-selectors-
20110929/#checked
8472 var nodeName = elem.nodeName.toLowerCase();
8473 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
8476 "selected": function( elem ) {
8477 // Accessing this property makes selected-by-default
8478 // options in Safari work properly
8479 if ( elem.parentNode ) {
8480 elem.parentNode.selectedIndex;
8483 return elem.selected === true;
8487 "empty": function( elem ) {
8488 // http://www.w3.org/TR/selectors/#empty-pseudo
8489 // :empty is negated by element (
1) or content nodes (text:
3; cdata:
4; entity ref:
5),
8490 // but not by others (comment:
8; processing instruction:
7; etc.)
8491 // nodeType <
6 works because attributes (
2) do not appear as children
8492 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
8493 if ( elem.nodeType <
6 ) {
8500 "parent": function( elem ) {
8501 return !Expr.pseudos["empty"]( elem );
8504 // Element/input types
8505 "header": function( elem ) {
8506 return rheader.test( elem.nodeName );
8509 "input": function( elem ) {
8510 return rinputs.test( elem.nodeName );
8513 "button": function( elem ) {
8514 var name = elem.nodeName.toLowerCase();
8515 return name === "input" && elem.type === "button" || name === "button";
8518 "text": function( elem ) {
8520 return elem.nodeName.toLowerCase() === "input" &&
8521 elem.type === "text" &&
8524 // New HTML5 attribute values (e.g.,
"search") appear with elem.type ===
"text"
8525 ( (attr = elem.getAttribute(
"type")) == null || attr.toLowerCase() ===
"text" );
8528 // Position-in-collection
8529 "first": createPositionalPseudo(function() {
8533 "last": createPositionalPseudo(function( matchIndexes, length ) {
8534 return [ length -
1 ];
8537 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
8538 return [ argument <
0 ? argument + length : argument ];
8541 "even": createPositionalPseudo(function( matchIndexes, length ) {
8543 for ( ; i < length; i +=
2 ) {
8544 matchIndexes.push( i );
8546 return matchIndexes;
8549 "odd": createPositionalPseudo(function( matchIndexes, length ) {
8551 for ( ; i < length; i +=
2 ) {
8552 matchIndexes.push( i );
8554 return matchIndexes;
8557 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
8558 var i = argument <
0 ? argument + length : argument;
8559 for ( ; --i
>=
0; ) {
8560 matchIndexes.push( i );
8562 return matchIndexes;
8565 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
8566 var i = argument <
0 ? argument + length : argument;
8567 for ( ; ++i < length; ) {
8568 matchIndexes.push( i );
8570 return matchIndexes;
8575 Expr.pseudos["nth"] = Expr.pseudos["eq"];
8577 // Add button/input type pseudos
8578 for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
8579 Expr.pseudos[ i ] = createInputPseudo( i );
8581 for ( i in { submit: true, reset: true } ) {
8582 Expr.pseudos[ i ] = createButtonPseudo( i );
8585 // Easy API for creating new setFilters
8586 function setFilters() {}
8587 setFilters.prototype = Expr.filters = Expr.pseudos;
8588 Expr.setFilters = new setFilters();
8590 tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
8591 var matched, match, tokens, type,
8592 soFar, groups, preFilters,
8593 cached = tokenCache[ selector + " " ];
8596 return parseOnly ?
0 : cached.slice(
0 );
8601 preFilters = Expr.preFilter;
8605 // Comma and first run
8606 if ( !matched || (match = rcomma.exec( soFar )) ) {
8608 // Don't consume trailing commas as valid
8609 soFar = soFar.slice( match[
0].length ) || soFar;
8611 groups.push( (tokens = []) );
8617 if ( (match = rcombinators.exec( soFar )) ) {
8618 matched = match.shift();
8621 // Cast descendant combinators to space
8622 type: match[
0].replace( rtrim, " " )
8624 soFar = soFar.slice( matched.length );
8628 for ( type in Expr.filter ) {
8629 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
8630 (match = preFilters[ type ]( match ))) ) {
8631 matched = match.shift();
8637 soFar = soFar.slice( matched.length );
8646 // Return the length of the invalid excess
8647 // if we're just parsing
8648 // Otherwise, throw an error or return tokens
8652 Sizzle.error( selector ) :
8654 tokenCache( selector, groups ).slice(
0 );
8657 function toSelector( tokens ) {
8659 len = tokens.length,
8661 for ( ; i < len; i++ ) {
8662 selector += tokens[i].value;
8667 function addCombinator( matcher, combinator, base ) {
8668 var dir = combinator.dir,
8669 checkNonElements = base && dir === "parentNode",
8672 return combinator.first ?
8673 // Check against closest ancestor/preceding element
8674 function( elem, context, xml ) {
8675 while ( (elem = elem[ dir ]) ) {
8676 if ( elem.nodeType ===
1 || checkNonElements ) {
8677 return matcher( elem, context, xml );
8682 // Check against all ancestor/preceding elements
8683 function( elem, context, xml ) {
8684 var oldCache, outerCache,
8685 newCache = [ dirruns, doneName ];
8687 // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
8689 while ( (elem = elem[ dir ]) ) {
8690 if ( elem.nodeType ===
1 || checkNonElements ) {
8691 if ( matcher( elem, context, xml ) ) {
8697 while ( (elem = elem[ dir ]) ) {
8698 if ( elem.nodeType ===
1 || checkNonElements ) {
8699 outerCache = elem[ expando ] || (elem[ expando ] = {});
8700 if ( (oldCache = outerCache[ dir ]) &&
8701 oldCache[
0 ] === dirruns && oldCache[
1 ] === doneName ) {
8703 // Assign to newCache so results back-propagate to previous elements
8704 return (newCache[
2 ] = oldCache[
2 ]);
8706 // Reuse newcache so results back-propagate to previous elements
8707 outerCache[ dir ] = newCache;
8709 // A match means we're done; a fail means we have to keep checking
8710 if ( (newCache[
2 ] = matcher( elem, context, xml )) ) {
8720 function elementMatcher( matchers ) {
8721 return matchers.length
> 1 ?
8722 function( elem, context, xml ) {
8723 var i = matchers.length;
8725 if ( !matchers[i]( elem, context, xml ) ) {
8734 function multipleContexts( selector, contexts, results ) {
8736 len = contexts.length;
8737 for ( ; i < len; i++ ) {
8738 Sizzle( selector, contexts[i], results );
8743 function condense( unmatched, map, filter, context, xml ) {
8747 len = unmatched.length,
8748 mapped = map != null;
8750 for ( ; i < len; i++ ) {
8751 if ( (elem = unmatched[i]) ) {
8752 if ( !filter || filter( elem, context, xml ) ) {
8753 newUnmatched.push( elem );
8761 return newUnmatched;
8764 function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
8765 if ( postFilter && !postFilter[ expando ] ) {
8766 postFilter = setMatcher( postFilter );
8768 if ( postFinder && !postFinder[ expando ] ) {
8769 postFinder = setMatcher( postFinder, postSelector );
8771 return markFunction(function( seed, results, context, xml ) {
8775 preexisting = results.length,
8777 // Get initial elements from seed or context
8778 elems = seed || multipleContexts( selector ||
"*", context.nodeType ? [ context ] : context, [] ),
8780 // Prefilter to get matcher input, preserving a map for seed-results synchronization
8781 matcherIn = preFilter && ( seed || !selector ) ?
8782 condense( elems, preMap, preFilter, context, xml ) :
8785 matcherOut = matcher ?
8786 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
8787 postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
8789 // ...intermediate processing is necessary
8792 // ...otherwise use results directly
8796 // Find primary matches
8798 matcher( matcherIn, matcherOut, context, xml );
8803 temp = condense( matcherOut, postMap );
8804 postFilter( temp, [], context, xml );
8806 // Un-match failing elements by moving them back to matcherIn
8809 if ( (elem = temp[i]) ) {
8810 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
8816 if ( postFinder || preFilter ) {
8818 // Get the final matcherOut by condensing this intermediate into postFinder contexts
8820 i = matcherOut.length;
8822 if ( (elem = matcherOut[i]) ) {
8823 // Restore matcherIn since elem is not yet a final match
8824 temp.push( (matcherIn[i] = elem) );
8827 postFinder( null, (matcherOut = []), temp, xml );
8830 // Move matched elements from seed to results to keep them synchronized
8831 i = matcherOut.length;
8833 if ( (elem = matcherOut[i]) &&
8834 (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i])
> -
1 ) {
8836 seed[temp] = !(results[temp] = elem);
8841 // Add elements to results, through postFinder if defined
8843 matcherOut = condense(
8844 matcherOut === results ?
8845 matcherOut.splice( preexisting, matcherOut.length ) :
8849 postFinder( null, results, matcherOut, xml );
8851 push.apply( results, matcherOut );
8857 function matcherFromTokens( tokens ) {
8858 var checkContext, matcher, j,
8859 len = tokens.length,
8860 leadingRelative = Expr.relative[ tokens[
0].type ],
8861 implicitRelative = leadingRelative || Expr.relative[" "],
8862 i = leadingRelative ?
1 :
0,
8864 // The foundational matcher ensures that elements are reachable from top-level context(s)
8865 matchContext = addCombinator( function( elem ) {
8866 return elem === checkContext;
8867 }, implicitRelative, true ),
8868 matchAnyContext = addCombinator( function( elem ) {
8869 return indexOf.call( checkContext, elem )
> -
1;
8870 }, implicitRelative, true ),
8871 matchers = [ function( elem, context, xml ) {
8872 return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
8873 (checkContext = context).nodeType ?
8874 matchContext( elem, context, xml ) :
8875 matchAnyContext( elem, context, xml ) );
8878 for ( ; i < len; i++ ) {
8879 if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
8880 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
8882 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
8884 // Return special upon seeing a positional matcher
8885 if ( matcher[ expando ] ) {
8886 // Find the next relative operator (if any) for proper handling
8888 for ( ; j < len; j++ ) {
8889 if ( Expr.relative[ tokens[j].type ] ) {
8894 i
> 1 && elementMatcher( matchers ),
8895 i
> 1 && toSelector(
8896 // If the preceding token was a descendant combinator, insert an implicit any-element `*`
8897 tokens.slice(
0, i -
1 ).concat({ value: tokens[ i -
2 ].type ===
" " ?
"*" :
"" })
8898 ).replace( rtrim,
"$1" ),
8900 i < j && matcherFromTokens( tokens.slice( i, j ) ),
8901 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
8902 j < len && toSelector( tokens )
8905 matchers.push( matcher );
8909 return elementMatcher( matchers );
8912 function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
8913 var bySet = setMatchers.length
> 0,
8914 byElement = elementMatchers.length
> 0,
8915 superMatcher = function( seed, context, xml, results, outermost ) {
8916 var elem, j, matcher,
8919 unmatched = seed && [],
8921 contextBackup = outermostContext,
8922 // We must always have either seed elements or outermost context
8923 elems = seed || byElement && Expr.find[
"TAG"](
"*", outermost ),
8924 // Use integer dirruns iff this is the outermost matcher
8925 dirrunsUnique = (dirruns += contextBackup == null ?
1 : Math.random() ||
0.1),
8929 outermostContext = context !== document && context;
8932 // Add elements passing elementMatchers directly to results
8933 // Keep `i` a string if there are no elements so `matchedCount` will be
"00" below
8934 // Support: IE
<9, Safari
8935 // Tolerate NodeList properties (IE:
"length"; Safari:
<number>) matching elements by id
8936 for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
8937 if ( byElement && elem ) {
8939 while ( (matcher = elementMatchers[j++]) ) {
8940 if ( matcher( elem, context, xml ) ) {
8941 results.push( elem );
8946 dirruns = dirrunsUnique;
8950 // Track unmatched elements for set filters
8952 // They will have gone through all possible matchers
8953 if ( (elem = !matcher && elem) ) {
8957 // Lengthen the array for every element, matched or not
8959 unmatched.push( elem );
8964 // Apply set filters to unmatched elements
8966 if ( bySet && i !== matchedCount ) {
8968 while ( (matcher = setMatchers[j++]) ) {
8969 matcher( unmatched, setMatched, context, xml );
8973 // Reintegrate element matches to eliminate the need for sorting
8974 if ( matchedCount
> 0 ) {
8976 if ( !(unmatched[i] || setMatched[i]) ) {
8977 setMatched[i] = pop.call( results );
8982 // Discard index placeholder values to get only actual matches
8983 setMatched = condense( setMatched );
8986 // Add matches to results
8987 push.apply( results, setMatched );
8989 // Seedless set matches succeeding multiple successful matchers stipulate sorting
8990 if ( outermost && !seed && setMatched.length
> 0 &&
8991 ( matchedCount + setMatchers.length )
> 1 ) {
8993 Sizzle.uniqueSort( results );
8997 // Override manipulation of globals by nested matchers
8999 dirruns = dirrunsUnique;
9000 outermostContext = contextBackup;
9007 markFunction( superMatcher ) :
9011 compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
9014 elementMatchers = [],
9015 cached = compilerCache[ selector +
" " ];
9018 // Generate a function of recursive functions that can be used to check each element
9020 match = tokenize( selector );
9024 cached = matcherFromTokens( match[i] );
9025 if ( cached[ expando ] ) {
9026 setMatchers.push( cached );
9028 elementMatchers.push( cached );
9032 // Cache the compiled function
9033 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
9035 // Save selector and tokenization
9036 cached.selector = selector;
9042 * A low-level selection function that works with Sizzle's compiled
9043 * selector functions
9044 * @param {String|Function} selector A selector or a pre-compiled
9045 * selector function built with Sizzle.compile
9046 * @param {Element} context
9047 * @param {Array} [results]
9048 * @param {Array} [seed] A set of elements to match against
9050 select = Sizzle.select = function( selector, context, results, seed ) {
9051 var i, tokens, token, type, find,
9052 compiled = typeof selector ===
"function" && selector,
9053 match = !seed && tokenize( (selector = compiled.selector || selector) );
9055 results = results || [];
9057 // Try to minimize operations if there is no seed and only one group
9058 if ( match.length ===
1 ) {
9060 // Take a shortcut and set the context if the root selector is an ID
9061 tokens = match[
0] = match[
0].slice(
0 );
9062 if ( tokens.length
> 2 && (token = tokens[
0]).type ===
"ID" &&
9063 support.getById && context.nodeType ===
9 && documentIsHTML &&
9064 Expr.relative[ tokens[
1].type ] ) {
9066 context = ( Expr.find[
"ID"]( token.matches[
0].replace(runescape, funescape), context ) || [] )[
0];
9070 // Precompiled matchers will still verify ancestry, so step up a level
9071 } else if ( compiled ) {
9072 context = context.parentNode;
9075 selector = selector.slice( tokens.shift().value.length );
9078 // Fetch a seed set for right-to-left matching
9079 i = matchExpr[
"needsContext"].test( selector ) ?
0 : tokens.length;
9083 // Abort if we hit a combinator
9084 if ( Expr.relative[ (type = token.type) ] ) {
9087 if ( (find = Expr.find[ type ]) ) {
9088 // Search, expanding context for leading sibling combinators
9090 token.matches[
0].replace( runescape, funescape ),
9091 rsibling.test( tokens[
0].type ) && testContext( context.parentNode ) || context
9094 // If seed is empty or no tokens remain, we can return early
9095 tokens.splice( i,
1 );
9096 selector = seed.length && toSelector( tokens );
9098 push.apply( results, seed );
9108 // Compile and execute a filtering function if one is not provided
9109 // Provide `match` to avoid retokenization if we modified the selector above
9110 ( compiled || compile( selector, match ) )(
9115 rsibling.test( selector ) && testContext( context.parentNode ) || context
9120 // One-time assignments
9123 support.sortStable = expando.split(
"").sort( sortOrder ).join(
"") === expando;
9125 // Support: Chrome
<14
9126 // Always assume duplicates if they aren't passed to the comparison function
9127 support.detectDuplicates = !!hasDuplicate;
9129 // Initialize against the default document
9132 // Support: Webkit
<537.32 - Safari
6.0.3/Chrome
25 (fixed in Chrome
27)
9133 // Detached nodes confoundingly follow *each other*
9134 support.sortDetached = assert(function( div1 ) {
9135 // Should return
1, but returns
4 (following)
9136 return div1.compareDocumentPosition( document.createElement(
"div") ) &
1;
9140 // Prevent attribute/property
"interpolation"
9141 // http://msdn.microsoft.com/en-us/library/ms536429%
28VS
.85%
29.aspx
9142 if ( !assert(function( div ) {
9143 div.innerHTML =
"<a href='#'></a>";
9144 return div.firstChild.getAttribute(
"href") ===
"#" ;
9146 addHandle(
"type|href|height|width", function( elem, name, isXML ) {
9148 return elem.getAttribute( name, name.toLowerCase() ===
"type" ?
1 :
2 );
9154 // Use defaultValue in place of getAttribute(
"value")
9155 if ( !support.attributes || !assert(function( div ) {
9156 div.innerHTML =
"<input/>";
9157 div.firstChild.setAttribute(
"value",
"" );
9158 return div.firstChild.getAttribute(
"value" ) ===
"";
9160 addHandle(
"value", function( elem, name, isXML ) {
9161 if ( !isXML && elem.nodeName.toLowerCase() ===
"input" ) {
9162 return elem.defaultValue;
9168 // Use getAttributeNode to fetch booleans when getAttribute lies
9169 if ( !assert(function( div ) {
9170 return div.getAttribute(
"disabled") == null;
9172 addHandle( booleans, function( elem, name, isXML ) {
9175 return elem[ name ] === true ? name.toLowerCase() :
9176 (val = elem.getAttributeNode( name )) && val.specified ?
9189 jQuery.find = Sizzle;
9190 jQuery.expr = Sizzle.selectors;
9191 jQuery.expr[
":"] = jQuery.expr.pseudos;
9192 jQuery.unique = Sizzle.uniqueSort;
9193 jQuery.text = Sizzle.getText;
9194 jQuery.isXMLDoc = Sizzle.isXML;
9195 jQuery.contains = Sizzle.contains;
9199 var rneedsContext = jQuery.expr.match.needsContext;
9201 var rsingleTag = (/^<(\w+)\s*\/
?>(?:<\/\
1>|)$/);
9205 var risSimple = /^.[^:#\[\.,]*$/;
9207 // Implement the identical functionality for filter and not
9208 function winnow( elements, qualifier, not ) {
9209 if ( jQuery.isFunction( qualifier ) ) {
9210 return jQuery.grep( elements, function( elem, i ) {
9212 return !!qualifier.call( elem, i, elem ) !== not;
9217 if ( qualifier.nodeType ) {
9218 return jQuery.grep( elements, function( elem ) {
9219 return ( elem === qualifier ) !== not;
9224 if ( typeof qualifier === "string" ) {
9225 if ( risSimple.test( qualifier ) ) {
9226 return jQuery.filter( qualifier, elements, not );
9229 qualifier = jQuery.filter( qualifier, elements );
9232 return jQuery.grep( elements, function( elem ) {
9233 return ( indexOf.call( qualifier, elem )
>=
0 ) !== not;
9237 jQuery.filter = function( expr, elems, not ) {
9238 var elem = elems[
0 ];
9241 expr = ":not(" + expr + ")";
9244 return elems.length ===
1 && elem.nodeType ===
1 ?
9245 jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
9246 jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
9247 return elem.nodeType ===
1;
9252 find: function( selector ) {
9258 if ( typeof selector !== "string" ) {
9259 return this.pushStack( jQuery( selector ).filter(function() {
9260 for ( i =
0; i < len; i++ ) {
9261 if ( jQuery.contains( self[ i ], this ) ) {
9268 for ( i =
0; i < len; i++ ) {
9269 jQuery.find( selector, self[ i ], ret );
9272 // Needed because $( selector, context ) becomes $( context ).find( selector )
9273 ret = this.pushStack( len
> 1 ? jQuery.unique( ret ) : ret );
9274 ret.selector = this.selector ? this.selector +
" " + selector : selector;
9277 filter: function( selector ) {
9278 return this.pushStack( winnow(this, selector || [], false) );
9280 not: function( selector ) {
9281 return this.pushStack( winnow(this, selector || [], true) );
9283 is: function( selector ) {
9287 // If this is a positional/relative selector, check membership in the returned set
9288 // so $(
"p:first").is(
"p:last") won't return true for a doc with two
"p".
9289 typeof selector ===
"string" && rneedsContext.test( selector ) ?
9290 jQuery( selector ) :
9298 // Initialize a jQuery object
9301 // A central reference to the root jQuery(document)
9304 // A simple way to check for HTML strings
9305 // Prioritize #id over
<tag> to avoid XSS via location.hash (#
9521)
9306 // Strict HTML recognition (#
11290: must start with <)
9307 rquickExpr = /^(?:\s*(<[\w\W]+
>)[^
>]*|#([\w-]*))$/,
9309 init = jQuery.fn.init = function( selector, context ) {
9312 // HANDLE: $(""), $(null), $(undefined), $(false)
9317 // Handle HTML strings
9318 if ( typeof selector === "string" ) {
9319 if ( selector[
0] === "<" && selector[ selector.length -
1 ] === "
>" && selector.length >= 3 ) {
9320 // Assume that strings that start and end with <> are HTML and skip the regex check
9321 match = [ null, selector, null ];
9324 match = rquickExpr.exec( selector );
9327 // Match html or make sure no context is specified for #id
9328 if ( match && (match[1] || !context) ) {
9330 // HANDLE: $(html) -> $(array)
9332 context = context instanceof jQuery ? context[0] : context;
9334 // scripts is true for back-compat
9335 // Intentionally let the error be thrown if parseHTML is not present
9336 jQuery.merge( this, jQuery.parseHTML(
9338 context && context.nodeType ? context.ownerDocument || context : document,
9342 // HANDLE: $(html, props)
9343 if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
9344 for ( match in context ) {
9345 // Properties of context are called as methods if possible
9346 if ( jQuery.isFunction( this[ match ] ) ) {
9347 this[ match ]( context[ match ] );
9349 // ...and otherwise set as attributes
9351 this.attr( match, context[ match ] );
9360 elem = document.getElementById( match[2] );
9362 // Check parentNode to catch when Blackberry 4.6 returns
9363 // nodes that are no longer in the document #6963
9364 if ( elem && elem.parentNode ) {
9365 // Inject the element directly into the jQuery object
9370 this.context = document;
9371 this.selector = selector;
9375 // HANDLE: $(expr, $(...))
9376 } else if ( !context || context.jquery ) {
9377 return ( context || rootjQuery ).find( selector );
9379 // HANDLE: $(expr, context)
9380 // (which is just equivalent to: $(context).find(expr)
9382 return this.constructor( context ).find( selector );
9385 // HANDLE: $(DOMElement)
9386 } else if ( selector.nodeType ) {
9387 this.context = this[0] = selector;
9391 // HANDLE: $(function)
9392 // Shortcut for document ready
9393 } else if ( jQuery.isFunction( selector ) ) {
9394 return typeof rootjQuery.ready !== "undefined" ?
9395 rootjQuery.ready( selector ) :
9396 // Execute immediately if ready is not present
9400 if ( selector.selector !== undefined ) {
9401 this.selector = selector.selector;
9402 this.context = selector.context;
9405 return jQuery.makeArray( selector, this );
9408 // Give the init function the jQuery prototype for later instantiation
9409 init.prototype = jQuery.fn;
9411 // Initialize central reference
9412 rootjQuery = jQuery( document );
9415 var rparentsprev = /^(?:parents|prev(?:Until|All))/,
9416 // methods guaranteed to produce a unique set when starting from a unique set
9417 guaranteedUnique = {
9425 dir: function( elem, dir, until ) {
9427 truncate = until !== undefined;
9429 while ( (elem = elem[ dir ]) && elem.nodeType !==
9 ) {
9430 if ( elem.nodeType ===
1 ) {
9431 if ( truncate && jQuery( elem ).is( until ) ) {
9434 matched.push( elem );
9440 sibling: function( n, elem ) {
9443 for ( ; n; n = n.nextSibling ) {
9444 if ( n.nodeType ===
1 && n !== elem ) {
9454 has: function( target ) {
9455 var targets = jQuery( target, this ),
9458 return this.filter(function() {
9460 for ( ; i < l; i++ ) {
9461 if ( jQuery.contains( this, targets[i] ) ) {
9468 closest: function( selectors, context ) {
9473 pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
9474 jQuery( selectors, context || this.context ) :
9477 for ( ; i < l; i++ ) {
9478 for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {
9479 // Always skip document fragments
9480 if ( cur.nodeType <
11 && (pos ?
9481 pos.index(cur)
> -
1 :
9483 // Don't pass non-elements to Sizzle
9484 cur.nodeType ===
1 &&
9485 jQuery.find.matchesSelector(cur, selectors)) ) {
9487 matched.push( cur );
9493 return this.pushStack( matched.length
> 1 ? jQuery.unique( matched ) : matched );
9496 // Determine the position of an element within
9497 // the matched set of elements
9498 index: function( elem ) {
9500 // No argument, return index in parent
9502 return ( this[
0 ] && this[
0 ].parentNode ) ? this.first().prevAll().length : -
1;
9505 // index in selector
9506 if ( typeof elem ===
"string" ) {
9507 return indexOf.call( jQuery( elem ), this[
0 ] );
9510 // Locate the position of the desired element
9511 return indexOf.call( this,
9513 // If it receives a jQuery object, the first element is used
9514 elem.jquery ? elem[
0 ] : elem
9518 add: function( selector, context ) {
9519 return this.pushStack(
9521 jQuery.merge( this.get(), jQuery( selector, context ) )
9526 addBack: function( selector ) {
9527 return this.add( selector == null ?
9528 this.prevObject : this.prevObject.filter(selector)
9533 function sibling( cur, dir ) {
9534 while ( (cur = cur[dir]) && cur.nodeType !==
1 ) {}
9539 parent: function( elem ) {
9540 var parent = elem.parentNode;
9541 return parent && parent.nodeType !==
11 ? parent : null;
9543 parents: function( elem ) {
9544 return jQuery.dir( elem,
"parentNode" );
9546 parentsUntil: function( elem, i, until ) {
9547 return jQuery.dir( elem,
"parentNode", until );
9549 next: function( elem ) {
9550 return sibling( elem,
"nextSibling" );
9552 prev: function( elem ) {
9553 return sibling( elem,
"previousSibling" );
9555 nextAll: function( elem ) {
9556 return jQuery.dir( elem,
"nextSibling" );
9558 prevAll: function( elem ) {
9559 return jQuery.dir( elem,
"previousSibling" );
9561 nextUntil: function( elem, i, until ) {
9562 return jQuery.dir( elem,
"nextSibling", until );
9564 prevUntil: function( elem, i, until ) {
9565 return jQuery.dir( elem,
"previousSibling", until );
9567 siblings: function( elem ) {
9568 return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
9570 children: function( elem ) {
9571 return jQuery.sibling( elem.firstChild );
9573 contents: function( elem ) {
9574 return elem.contentDocument || jQuery.merge( [], elem.childNodes );
9576 }, function( name, fn ) {
9577 jQuery.fn[ name ] = function( until, selector ) {
9578 var matched = jQuery.map( this, fn, until );
9580 if ( name.slice( -
5 ) !==
"Until" ) {
9584 if ( selector && typeof selector ===
"string" ) {
9585 matched = jQuery.filter( selector, matched );
9588 if ( this.length
> 1 ) {
9589 // Remove duplicates
9590 if ( !guaranteedUnique[ name ] ) {
9591 jQuery.unique( matched );
9594 // Reverse order for parents* and prev-derivatives
9595 if ( rparentsprev.test( name ) ) {
9600 return this.pushStack( matched );
9603 var rnotwhite = (/\S+/g);
9607 // String to Object options format cache
9608 var optionsCache = {};
9610 // Convert String-formatted options into Object-formatted ones and store in cache
9611 function createOptions( options ) {
9612 var object = optionsCache[ options ] = {};
9613 jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
9614 object[ flag ] = true;
9620 * Create a callback list using the following parameters:
9622 * options: an optional list of space-separated options that will change how
9623 * the callback list behaves or a more traditional option object
9625 * By default a callback list will act like an event callback list and can be
9626 *
"fired" multiple times.
9630 * once: will ensure the callback list can only be fired once (like a Deferred)
9632 * memory: will keep track of previous values and will call any callback added
9633 * after the list has been fired right away with the latest
"memorized"
9634 * values (like a Deferred)
9636 * unique: will ensure a callback can only be added once (no duplicate in the list)
9638 * stopOnFalse: interrupt callings when a callback returns false
9641 jQuery.Callbacks = function( options ) {
9643 // Convert options from String-formatted to Object-formatted if needed
9644 // (we check in cache first)
9645 options = typeof options ===
"string" ?
9646 ( optionsCache[ options ] || createOptions( options ) ) :
9647 jQuery.extend( {}, options );
9649 var // Last fire value (for non-forgettable lists)
9651 // Flag to know if list was already fired
9653 // Flag to know if list is currently firing
9655 // First callback to fire (used internally by add and fireWith)
9657 // End of the loop when firing
9659 // Index of currently firing callback (modified by remove if needed)
9661 // Actual callback list
9663 // Stack of fire calls for repeatable lists
9664 stack = !options.once && [],
9666 fire = function( data ) {
9667 memory = options.memory && data;
9669 firingIndex = firingStart ||
0;
9671 firingLength = list.length;
9673 for ( ; list && firingIndex < firingLength; firingIndex++ ) {
9674 if ( list[ firingIndex ].apply( data[
0 ], data[
1 ] ) === false && options.stopOnFalse ) {
9675 memory = false; // To prevent further calls using add
9682 if ( stack.length ) {
9683 fire( stack.shift() );
9685 } else if ( memory ) {
9692 // Actual Callbacks object
9694 // Add a callback or a collection of callbacks to the list
9697 // First, we save the current length
9698 var start = list.length;
9699 (function add( args ) {
9700 jQuery.each( args, function( _, arg ) {
9701 var type = jQuery.type( arg );
9702 if ( type ===
"function" ) {
9703 if ( !options.unique || !self.has( arg ) ) {
9706 } else if ( arg && arg.length && type !==
"string" ) {
9707 // Inspect recursively
9712 // Do we need to add the callbacks to the
9713 // current firing batch?
9715 firingLength = list.length;
9716 // With memory, if we're not firing then
9717 // we should call right away
9718 } else if ( memory ) {
9719 firingStart = start;
9725 // Remove a callback from the list
9726 remove: function() {
9728 jQuery.each( arguments, function( _, arg ) {
9730 while ( ( index = jQuery.inArray( arg, list, index ) )
> -
1 ) {
9731 list.splice( index,
1 );
9732 // Handle firing indexes
9734 if ( index <= firingLength ) {
9737 if ( index <= firingIndex ) {
9746 // Check if a given callback is in the list.
9747 // If no argument is given, return whether or not list has callbacks attached.
9748 has: function( fn ) {
9749 return fn ? jQuery.inArray( fn, list )
> -
1 : !!( list && list.length );
9751 // Remove all callbacks from the list
9757 // Have the list do nothing anymore
9758 disable: function() {
9759 list = stack = memory = undefined;
9763 disabled: function() {
9766 // Lock the list in its current state
9775 locked: function() {
9778 // Call all callbacks with the given context and arguments
9779 fireWith: function( context, args ) {
9780 if ( list && ( !fired || stack ) ) {
9782 args = [ context, args.slice ? args.slice() : args ];
9791 // Call all the callbacks with the given arguments
9793 self.fireWith( this, arguments );
9796 // To know if the callbacks have already been called at least once
9808 Deferred: function( func ) {
9810 // action, add listener, listener list, final state
9811 [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
9812 [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
9813 [ "notify", "progress", jQuery.Callbacks("memory") ]
9820 always: function() {
9821 deferred.done( arguments ).fail( arguments );
9824 then: function( /* fnDone, fnFail, fnProgress */ ) {
9825 var fns = arguments;
9826 return jQuery.Deferred(function( newDefer ) {
9827 jQuery.each( tuples, function( i, tuple ) {
9828 var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
9829 // deferred[ done | fail | progress ] for forwarding actions to newDefer
9830 deferred[ tuple[
1] ](function() {
9831 var returned = fn && fn.apply( this, arguments );
9832 if ( returned && jQuery.isFunction( returned.promise ) ) {
9834 .done( newDefer.resolve )
9835 .fail( newDefer.reject )
9836 .progress( newDefer.notify );
9838 newDefer[ tuple[
0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
9845 // Get a promise for this deferred
9846 // If obj is provided, the promise aspect is added to the object
9847 promise: function( obj ) {
9848 return obj != null ? jQuery.extend( obj, promise ) : promise;
9853 // Keep pipe for back-compat
9854 promise.pipe = promise.then;
9856 // Add list-specific methods
9857 jQuery.each( tuples, function( i, tuple ) {
9858 var list = tuple[
2 ],
9859 stateString = tuple[
3 ];
9861 // promise[ done | fail | progress ] = list.add
9862 promise[ tuple[
1] ] = list.add;
9865 if ( stateString ) {
9866 list.add(function() {
9867 // state = [ resolved | rejected ]
9868 state = stateString;
9870 // [ reject_list | resolve_list ].disable; progress_list.lock
9871 }, tuples[ i ^
1 ][
2 ].disable, tuples[
2 ][
2 ].lock );
9874 // deferred[ resolve | reject | notify ]
9875 deferred[ tuple[
0] ] = function() {
9876 deferred[ tuple[
0] + "With" ]( this === deferred ? promise : this, arguments );
9879 deferred[ tuple[
0] + "With" ] = list.fireWith;
9882 // Make the deferred a promise
9883 promise.promise( deferred );
9885 // Call given func if any
9887 func.call( deferred, deferred );
9895 when: function( subordinate /* , ..., subordinateN */ ) {
9897 resolveValues = slice.call( arguments ),
9898 length = resolveValues.length,
9900 // the count of uncompleted subordinates
9901 remaining = length !==
1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length :
0,
9903 // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
9904 deferred = remaining ===
1 ? subordinate : jQuery.Deferred(),
9906 // Update function for both resolve and progress values
9907 updateFunc = function( i, contexts, values ) {
9908 return function( value ) {
9909 contexts[ i ] = this;
9910 values[ i ] = arguments.length
> 1 ? slice.call( arguments ) : value;
9911 if ( values === progressValues ) {
9912 deferred.notifyWith( contexts, values );
9913 } else if ( !( --remaining ) ) {
9914 deferred.resolveWith( contexts, values );
9919 progressValues, progressContexts, resolveContexts;
9921 // add listeners to Deferred subordinates; treat others as resolved
9923 progressValues = new Array( length );
9924 progressContexts = new Array( length );
9925 resolveContexts = new Array( length );
9926 for ( ; i < length; i++ ) {
9927 if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
9928 resolveValues[ i ].promise()
9929 .done( updateFunc( i, resolveContexts, resolveValues ) )
9930 .fail( deferred.reject )
9931 .progress( updateFunc( i, progressContexts, progressValues ) );
9938 // if we're not waiting on anything, resolve the master
9940 deferred.resolveWith( resolveContexts, resolveValues );
9943 return deferred.promise();
9948 // The deferred used on DOM ready
9951 jQuery.fn.ready = function( fn ) {
9953 jQuery.ready.promise().done( fn );
9959 // Is the DOM ready to be used? Set to true once it occurs.
9962 // A counter to track how many items to wait for before
9963 // the ready event fires. See #
6781
9966 // Hold (or release) the ready event
9967 holdReady: function( hold ) {
9971 jQuery.ready( true );
9975 // Handle when the DOM is ready
9976 ready: function( wait ) {
9978 // Abort if there are pending holds or we're already ready
9979 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
9983 // Remember that the DOM is ready
9984 jQuery.isReady = true;
9986 // If a normal DOM Ready event fired, decrement, and wait if need be
9987 if ( wait !== true && --jQuery.readyWait
> 0 ) {
9991 // If there are functions bound, to execute
9992 readyList.resolveWith( document, [ jQuery ] );
9994 // Trigger any bound ready events
9995 if ( jQuery.fn.triggerHandler ) {
9996 jQuery( document ).triggerHandler(
"ready" );
9997 jQuery( document ).off(
"ready" );
10003 * The ready event handler and self cleanup method
10005 function completed() {
10006 document.removeEventListener(
"DOMContentLoaded", completed, false );
10007 window.removeEventListener(
"load", completed, false );
10011 jQuery.ready.promise = function( obj ) {
10012 if ( !readyList ) {
10014 readyList = jQuery.Deferred();
10016 // Catch cases where $(document).ready() is called after the browser event has already occurred.
10017 // we once tried to use readyState
"interactive" here, but it caused issues like the one
10018 // discovered by ChrisS here: http://bugs.jquery.com/ticket/
12282#comment:
15
10019 if ( document.readyState ===
"complete" ) {
10020 // Handle it asynchronously to allow scripts the opportunity to delay ready
10021 setTimeout( jQuery.ready );
10025 // Use the handy event callback
10026 document.addEventListener(
"DOMContentLoaded", completed, false );
10028 // A fallback to window.onload, that will always work
10029 window.addEventListener(
"load", completed, false );
10032 return readyList.promise( obj );
10035 // Kick off the DOM ready check even if the user does not
10036 jQuery.ready.promise();
10041 // Multifunctional method to get and set values of a collection
10042 // The value/s can optionally be executed if it's a function
10043 var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
10045 len = elems.length,
10046 bulk = key == null;
10048 // Sets many values
10049 if ( jQuery.type( key ) ===
"object" ) {
10052 jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
10056 } else if ( value !== undefined ) {
10059 if ( !jQuery.isFunction( value ) ) {
10064 // Bulk operations run against the entire set
10066 fn.call( elems, value );
10069 // ...except when executing function values
10072 fn = function( elem, key, value ) {
10073 return bulk.call( jQuery( elem ), value );
10079 for ( ; i < len; i++ ) {
10080 fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
10091 len ? fn( elems[
0], key ) : emptyGet;
10096 * Determines whether an object can have data
10098 jQuery.acceptData = function( owner ) {
10101 // - Node.ELEMENT_NODE
10102 // - Node.DOCUMENT_NODE
10106 return owner.nodeType ===
1 || owner.nodeType ===
9 || !( +owner.nodeType );
10111 // Support: Android <
4,
10112 // Old WebKit does not have Object.preventExtensions/freeze method,
10113 // return new empty object instead with no [[set]] accessor
10114 Object.defineProperty( this.cache = {},
0, {
10120 this.expando = jQuery.expando + Math.random();
10124 Data.accepts = jQuery.acceptData;
10127 key: function( owner ) {
10128 // We can accept data for non-element nodes in modern browsers,
10129 // but we should not, see #
8335.
10130 // Always return the key for a frozen object.
10131 if ( !Data.accepts( owner ) ) {
10135 var descriptor = {},
10136 // Check if the owner object already has a cache key
10137 unlock = owner[ this.expando ];
10139 // If not, create one
10141 unlock = Data.uid++;
10143 // Secure it in a non-enumerable, non-writable property
10145 descriptor[ this.expando ] = { value: unlock };
10146 Object.defineProperties( owner, descriptor );
10148 // Support: Android <
4
10149 // Fallback to a less secure definition
10151 descriptor[ this.expando ] = unlock;
10152 jQuery.extend( owner, descriptor );
10156 // Ensure the cache object
10157 if ( !this.cache[ unlock ] ) {
10158 this.cache[ unlock ] = {};
10163 set: function( owner, data, value ) {
10165 // There may be an unlock assigned to this node,
10166 // if there is no entry for this
"owner", create one inline
10167 // and set the unlock as though an owner entry had always existed
10168 unlock = this.key( owner ),
10169 cache = this.cache[ unlock ];
10171 // Handle: [ owner, key, value ] args
10172 if ( typeof data ===
"string" ) {
10173 cache[ data ] = value;
10175 // Handle: [ owner, { properties } ] args
10177 // Fresh assignments by object are shallow copied
10178 if ( jQuery.isEmptyObject( cache ) ) {
10179 jQuery.extend( this.cache[ unlock ], data );
10180 // Otherwise, copy the properties one-by-one to the cache object
10182 for ( prop in data ) {
10183 cache[ prop ] = data[ prop ];
10189 get: function( owner, key ) {
10190 // Either a valid cache is found, or will be created.
10191 // New caches will be created and the unlock returned,
10192 // allowing direct access to the newly created
10193 // empty data object. A valid owner object must be provided.
10194 var cache = this.cache[ this.key( owner ) ];
10196 return key === undefined ?
10197 cache : cache[ key ];
10199 access: function( owner, key, value ) {
10201 // In cases where either:
10203 //
1. No key was specified
10204 //
2. A string key was specified, but no value provided
10206 // Take the
"read" path and allow the get method to determine
10207 // which value to return, respectively either:
10209 //
1. The entire cache object
10210 //
2. The data stored at the key
10212 if ( key === undefined ||
10213 ((key && typeof key ===
"string") && value === undefined) ) {
10215 stored = this.get( owner, key );
10217 return stored !== undefined ?
10218 stored : this.get( owner, jQuery.camelCase(key) );
10221 // [*]When the key is not a string, or both a key and value
10222 // are specified, set or extend (existing objects) with either:
10224 //
1. An object of properties
10225 //
2. A key and value
10227 this.set( owner, key, value );
10229 // Since the
"set" path can have two possible entry points
10230 // return the expected data based on which path was taken[*]
10231 return value !== undefined ? value : key;
10233 remove: function( owner, key ) {
10234 var i, name, camel,
10235 unlock = this.key( owner ),
10236 cache = this.cache[ unlock ];
10238 if ( key === undefined ) {
10239 this.cache[ unlock ] = {};
10242 // Support array or space separated string of keys
10243 if ( jQuery.isArray( key ) ) {
10244 // If
"name" is an array of keys...
10245 // When data is initially created, via (
"key",
"val") signature,
10246 // keys will be converted to camelCase.
10247 // Since there is no way to tell _how_ a key was added, remove
10248 // both plain key and camelCase key. #
12786
10249 // This will only penalize the array argument path.
10250 name = key.concat( key.map( jQuery.camelCase ) );
10252 camel = jQuery.camelCase( key );
10253 // Try the string as a key before any manipulation
10254 if ( key in cache ) {
10255 name = [ key, camel ];
10257 // If a key with the spaces exists, use it.
10258 // Otherwise, create an array by matching non-whitespace
10260 name = name in cache ?
10261 [ name ] : ( name.match( rnotwhite ) || [] );
10267 delete cache[ name[ i ] ];
10271 hasData: function( owner ) {
10272 return !jQuery.isEmptyObject(
10273 this.cache[ owner[ this.expando ] ] || {}
10276 discard: function( owner ) {
10277 if ( owner[ this.expando ] ) {
10278 delete this.cache[ owner[ this.expando ] ];
10282 var data_priv = new Data();
10284 var data_user = new Data();
10289 Implementation Summary
10291 1. Enforce API surface and semantic compatibility with
1.9.x branch
10292 2. Improve the module's maintainability by reducing the storage
10293 paths to a single mechanism.
10294 3. Use the same single mechanism to support
"private" and
"user" data.
10295 4. _Never_ expose
"private" data to user code (TODO: Drop _data, _removeData)
10296 5. Avoid exposing implementation details on user objects (eg. expando properties)
10297 6. Provide a clear path for implementation upgrade to WeakMap in
2014
10299 var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
10300 rmultiDash = /([A-Z])/g;
10302 function dataAttr( elem, key, data ) {
10305 // If nothing was found internally, try to fetch any
10306 // data from the HTML5 data-* attribute
10307 if ( data === undefined && elem.nodeType ===
1 ) {
10308 name =
"data-" + key.replace( rmultiDash,
"-$1" ).toLowerCase();
10309 data = elem.getAttribute( name );
10311 if ( typeof data ===
"string" ) {
10313 data = data ===
"true" ? true :
10314 data ===
"false" ? false :
10315 data ===
"null" ? null :
10316 // Only convert to a number if it doesn't change the string
10317 +data +
"" === data ? +data :
10318 rbrace.test( data ) ? jQuery.parseJSON( data ) :
10322 // Make sure we set the data so it isn't changed later
10323 data_user.set( elem, key, data );
10332 hasData: function( elem ) {
10333 return data_user.hasData( elem ) || data_priv.hasData( elem );
10336 data: function( elem, name, data ) {
10337 return data_user.access( elem, name, data );
10340 removeData: function( elem, name ) {
10341 data_user.remove( elem, name );
10344 // TODO: Now that all calls to _data and _removeData have been replaced
10345 // with direct calls to data_priv methods, these can be deprecated.
10346 _data: function( elem, name, data ) {
10347 return data_priv.access( elem, name, data );
10350 _removeData: function( elem, name ) {
10351 data_priv.remove( elem, name );
10356 data: function( key, value ) {
10359 attrs = elem && elem.attributes;
10362 if ( key === undefined ) {
10363 if ( this.length ) {
10364 data = data_user.get( elem );
10366 if ( elem.nodeType ===
1 && !data_priv.get( elem,
"hasDataAttrs" ) ) {
10371 // The attrs elements can be null (#
14894)
10372 if ( attrs[ i ] ) {
10373 name = attrs[ i ].name;
10374 if ( name.indexOf(
"data-" ) ===
0 ) {
10375 name = jQuery.camelCase( name.slice(
5) );
10376 dataAttr( elem, name, data[ name ] );
10380 data_priv.set( elem,
"hasDataAttrs", true );
10387 // Sets multiple values
10388 if ( typeof key ===
"object" ) {
10389 return this.each(function() {
10390 data_user.set( this, key );
10394 return access( this, function( value ) {
10396 camelKey = jQuery.camelCase( key );
10398 // The calling jQuery object (element matches) is not empty
10399 // (and therefore has an element appears at this[
0 ]) and the
10400 // `value` parameter was not undefined. An empty jQuery object
10401 // will result in `undefined` for elem = this[
0 ] which will
10402 // throw an exception if an attempt to read a data cache is made.
10403 if ( elem && value === undefined ) {
10404 // Attempt to get data from the cache
10405 // with the key as-is
10406 data = data_user.get( elem, key );
10407 if ( data !== undefined ) {
10411 // Attempt to get data from the cache
10412 // with the key camelized
10413 data = data_user.get( elem, camelKey );
10414 if ( data !== undefined ) {
10418 // Attempt to
"discover" the data in
10419 // HTML5 custom data-* attrs
10420 data = dataAttr( elem, camelKey, undefined );
10421 if ( data !== undefined ) {
10425 // We tried really hard, but the data doesn't exist.
10430 this.each(function() {
10431 // First, attempt to store a copy or reference of any
10432 // data that might've been store with a camelCased key.
10433 var data = data_user.get( this, camelKey );
10435 // For HTML5 data-* attribute interop, we have to
10436 // store property names with dashes in a camelCase form.
10437 // This might not apply to all properties...*
10438 data_user.set( this, camelKey, value );
10440 // *... In the case of properties that might _actually_
10441 // have dashes, we need to also store a copy of that
10442 // unchanged property.
10443 if ( key.indexOf(
"-") !== -
1 && data !== undefined ) {
10444 data_user.set( this, key, value );
10447 }, null, value, arguments.length
> 1, null, true );
10450 removeData: function( key ) {
10451 return this.each(function() {
10452 data_user.remove( this, key );
10459 queue: function( elem, type, data ) {
10463 type = ( type ||
"fx" ) +
"queue";
10464 queue = data_priv.get( elem, type );
10466 // Speed up dequeue by getting out quickly if this is just a lookup
10468 if ( !queue || jQuery.isArray( data ) ) {
10469 queue = data_priv.access( elem, type, jQuery.makeArray(data) );
10471 queue.push( data );
10474 return queue || [];
10478 dequeue: function( elem, type ) {
10479 type = type ||
"fx";
10481 var queue = jQuery.queue( elem, type ),
10482 startLength = queue.length,
10483 fn = queue.shift(),
10484 hooks = jQuery._queueHooks( elem, type ),
10485 next = function() {
10486 jQuery.dequeue( elem, type );
10489 // If the fx queue is dequeued, always remove the progress sentinel
10490 if ( fn ===
"inprogress" ) {
10491 fn = queue.shift();
10497 // Add a progress sentinel to prevent the fx queue from being
10498 // automatically dequeued
10499 if ( type ===
"fx" ) {
10500 queue.unshift(
"inprogress" );
10503 // clear up the last queue stop function
10505 fn.call( elem, next, hooks );
10508 if ( !startLength && hooks ) {
10509 hooks.empty.fire();
10513 // not intended for public consumption - generates a queueHooks object, or returns the current one
10514 _queueHooks: function( elem, type ) {
10515 var key = type +
"queueHooks";
10516 return data_priv.get( elem, key ) || data_priv.access( elem, key, {
10517 empty: jQuery.Callbacks(
"once memory").add(function() {
10518 data_priv.remove( elem, [ type +
"queue", key ] );
10525 queue: function( type, data ) {
10528 if ( typeof type !==
"string" ) {
10534 if ( arguments.length < setter ) {
10535 return jQuery.queue( this[
0], type );
10538 return data === undefined ?
10540 this.each(function() {
10541 var queue = jQuery.queue( this, type, data );
10543 // ensure a hooks for this queue
10544 jQuery._queueHooks( this, type );
10546 if ( type ===
"fx" && queue[
0] !==
"inprogress" ) {
10547 jQuery.dequeue( this, type );
10551 dequeue: function( type ) {
10552 return this.each(function() {
10553 jQuery.dequeue( this, type );
10556 clearQueue: function( type ) {
10557 return this.queue( type ||
"fx", [] );
10559 // Get a promise resolved when queues of a certain type
10560 // are emptied (fx is the type by default)
10561 promise: function( type, obj ) {
10564 defer = jQuery.Deferred(),
10567 resolve = function() {
10568 if ( !( --count ) ) {
10569 defer.resolveWith( elements, [ elements ] );
10573 if ( typeof type !==
"string" ) {
10577 type = type ||
"fx";
10580 tmp = data_priv.get( elements[ i ], type +
"queueHooks" );
10581 if ( tmp && tmp.empty ) {
10583 tmp.empty.add( resolve );
10587 return defer.promise( obj );
10590 var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
10592 var cssExpand = [
"Top",
"Right",
"Bottom",
"Left" ];
10594 var isHidden = function( elem, el ) {
10595 // isHidden might be called from jQuery#filter function;
10596 // in that case, element will be second argument
10598 return jQuery.css( elem,
"display" ) ===
"none" || !jQuery.contains( elem.ownerDocument, elem );
10601 var rcheckableType = (/^(?:checkbox|radio)$/i);
10606 var fragment = document.createDocumentFragment(),
10607 div = fragment.appendChild( document.createElement(
"div" ) ),
10608 input = document.createElement(
"input" );
10610 // #
11217 - WebKit loses check when the name is after the checked attribute
10611 // Support: Windows Web Apps (WWA)
10612 // `name` and `type` need .setAttribute for WWA
10613 input.setAttribute(
"type",
"radio" );
10614 input.setAttribute(
"checked",
"checked" );
10615 input.setAttribute(
"name",
"t" );
10617 div.appendChild( input );
10619 // Support: Safari
5.1, iOS
5.1, Android
4.x, Android
2.3
10620 // old WebKit doesn't clone checked state correctly in fragments
10621 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;
10623 // Make sure textarea (and checkbox) defaultValue is properly cloned
10624 // Support: IE9-IE11+
10625 div.innerHTML =
"<textarea>x</textarea>";
10626 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
10628 var strundefined = typeof undefined;
10632 support.focusinBubbles =
"onfocusin" in window;
10636 rkeyEvent = /^key/,
10637 rmouseEvent = /^(?:mouse|pointer|contextmenu)|click/,
10638 rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
10639 rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
10641 function returnTrue() {
10645 function returnFalse() {
10649 function safeActiveElement() {
10651 return document.activeElement;
10652 } catch ( err ) { }
10656 * Helper functions for managing events -- not part of the public interface.
10657 * Props to Dean Edwards' addEvent library for many of the ideas.
10663 add: function( elem, types, handler, data, selector ) {
10665 var handleObjIn, eventHandle, tmp,
10666 events, t, handleObj,
10667 special, handlers, type, namespaces, origType,
10668 elemData = data_priv.get( elem );
10670 // Don't attach events to noData or text/comment nodes (but allow plain objects)
10675 // Caller can pass in an object of custom data in lieu of the handler
10676 if ( handler.handler ) {
10677 handleObjIn = handler;
10678 handler = handleObjIn.handler;
10679 selector = handleObjIn.selector;
10682 // Make sure that the handler has a unique ID, used to find/remove it later
10683 if ( !handler.guid ) {
10684 handler.guid = jQuery.guid++;
10687 // Init the element's event structure and main handler, if this is the first
10688 if ( !(events = elemData.events) ) {
10689 events = elemData.events = {};
10691 if ( !(eventHandle = elemData.handle) ) {
10692 eventHandle = elemData.handle = function( e ) {
10693 // Discard the second event of a jQuery.event.trigger() and
10694 // when an event is called after a page has unloaded
10695 return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?
10696 jQuery.event.dispatch.apply( elem, arguments ) : undefined;
10700 // Handle multiple events separated by a space
10701 types = ( types ||
"" ).match( rnotwhite ) || [
"" ];
10704 tmp = rtypenamespace.exec( types[t] ) || [];
10705 type = origType = tmp[
1];
10706 namespaces = ( tmp[
2] ||
"" ).split(
"." ).sort();
10708 // There *must* be a type, no attaching namespace-only handlers
10713 // If event changes its type, use the special event handlers for the changed type
10714 special = jQuery.event.special[ type ] || {};
10716 // If selector defined, determine special event api type, otherwise given type
10717 type = ( selector ? special.delegateType : special.bindType ) || type;
10719 // Update special based on newly reset type
10720 special = jQuery.event.special[ type ] || {};
10722 // handleObj is passed to all event handlers
10723 handleObj = jQuery.extend({
10725 origType: origType,
10728 guid: handler.guid,
10729 selector: selector,
10730 needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
10731 namespace: namespaces.join(
".")
10734 // Init the event handler queue if we're the first
10735 if ( !(handlers = events[ type ]) ) {
10736 handlers = events[ type ] = [];
10737 handlers.delegateCount =
0;
10739 // Only use addEventListener if the special events handler returns false
10740 if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
10741 if ( elem.addEventListener ) {
10742 elem.addEventListener( type, eventHandle, false );
10747 if ( special.add ) {
10748 special.add.call( elem, handleObj );
10750 if ( !handleObj.handler.guid ) {
10751 handleObj.handler.guid = handler.guid;
10755 // Add to the element's handler list, delegates in front
10757 handlers.splice( handlers.delegateCount++,
0, handleObj );
10759 handlers.push( handleObj );
10762 // Keep track of which events have ever been used, for event optimization
10763 jQuery.event.global[ type ] = true;
10768 // Detach an event or set of events from an element
10769 remove: function( elem, types, handler, selector, mappedTypes ) {
10771 var j, origCount, tmp,
10772 events, t, handleObj,
10773 special, handlers, type, namespaces, origType,
10774 elemData = data_priv.hasData( elem ) && data_priv.get( elem );
10776 if ( !elemData || !(events = elemData.events) ) {
10780 // Once for each type.namespace in types; type may be omitted
10781 types = ( types ||
"" ).match( rnotwhite ) || [
"" ];
10784 tmp = rtypenamespace.exec( types[t] ) || [];
10785 type = origType = tmp[
1];
10786 namespaces = ( tmp[
2] ||
"" ).split(
"." ).sort();
10788 // Unbind all events (on this namespace, if provided) for the element
10790 for ( type in events ) {
10791 jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
10796 special = jQuery.event.special[ type ] || {};
10797 type = ( selector ? special.delegateType : special.bindType ) || type;
10798 handlers = events[ type ] || [];
10799 tmp = tmp[
2] && new RegExp(
"(^|\\.)" + namespaces.join(
"\\.(?:.*\\.|)") +
"(\\.|$)" );
10801 // Remove matching events
10802 origCount = j = handlers.length;
10804 handleObj = handlers[ j ];
10806 if ( ( mappedTypes || origType === handleObj.origType ) &&
10807 ( !handler || handler.guid === handleObj.guid ) &&
10808 ( !tmp || tmp.test( handleObj.namespace ) ) &&
10809 ( !selector || selector === handleObj.selector || selector ===
"**" && handleObj.selector ) ) {
10810 handlers.splice( j,
1 );
10812 if ( handleObj.selector ) {
10813 handlers.delegateCount--;
10815 if ( special.remove ) {
10816 special.remove.call( elem, handleObj );
10821 // Remove generic event handler if we removed something and no more handlers exist
10822 // (avoids potential for endless recursion during removal of special event handlers)
10823 if ( origCount && !handlers.length ) {
10824 if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
10825 jQuery.removeEvent( elem, type, elemData.handle );
10828 delete events[ type ];
10832 // Remove the expando if it's no longer used
10833 if ( jQuery.isEmptyObject( events ) ) {
10834 delete elemData.handle;
10835 data_priv.remove( elem,
"events" );
10839 trigger: function( event, data, elem, onlyHandlers ) {
10841 var i, cur, tmp, bubbleType, ontype, handle, special,
10842 eventPath = [ elem || document ],
10843 type = hasOwn.call( event,
"type" ) ? event.type : event,
10844 namespaces = hasOwn.call( event,
"namespace" ) ? event.namespace.split(
".") : [];
10846 cur = tmp = elem = elem || document;
10848 // Don't do events on text and comment nodes
10849 if ( elem.nodeType ===
3 || elem.nodeType ===
8 ) {
10853 // focus/blur morphs to focusin/out; ensure we're not firing them right now
10854 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
10858 if ( type.indexOf(
".")
>=
0 ) {
10859 // Namespaced trigger; create a regexp to match event type in handle()
10860 namespaces = type.split(".");
10861 type = namespaces.shift();
10864 ontype = type.indexOf(":") <
0 && "on" + type;
10866 // Caller can pass in a jQuery.Event object, Object, or just an event type string
10867 event = event[ jQuery.expando ] ?
10869 new jQuery.Event( type, typeof event === "object" && event );
10871 // Trigger bitmask: &
1 for native handlers; &
2 for jQuery (always true)
10872 event.isTrigger = onlyHandlers ?
2 :
3;
10873 event.namespace = namespaces.join(".");
10874 event.namespace_re = event.namespace ?
10875 new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
10878 // Clean up the event in case it is being reused
10879 event.result = undefined;
10880 if ( !event.target ) {
10881 event.target = elem;
10884 // Clone any incoming data and prepend the event, creating the handler arg list
10885 data = data == null ?
10887 jQuery.makeArray( data, [ event ] );
10889 // Allow special events to draw outside the lines
10890 special = jQuery.event.special[ type ] || {};
10891 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
10895 // Determine event propagation path in advance, per W3C events spec (#
9951)
10896 // Bubble up to document, then to window; watch for a global ownerDocument var (#
9724)
10897 if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
10899 bubbleType = special.delegateType || type;
10900 if ( !rfocusMorph.test( bubbleType + type ) ) {
10901 cur = cur.parentNode;
10903 for ( ; cur; cur = cur.parentNode ) {
10904 eventPath.push( cur );
10908 // Only add window if we got to document (e.g., not plain obj or detached DOM)
10909 if ( tmp === (elem.ownerDocument || document) ) {
10910 eventPath.push( tmp.defaultView || tmp.parentWindow || window );
10914 // Fire handlers on the event path
10916 while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
10918 event.type = i
> 1 ?
10920 special.bindType || type;
10923 handle = ( data_priv.get( cur,
"events" ) || {} )[ event.type ] && data_priv.get( cur,
"handle" );
10925 handle.apply( cur, data );
10929 handle = ontype && cur[ ontype ];
10930 if ( handle && handle.apply && jQuery.acceptData( cur ) ) {
10931 event.result = handle.apply( cur, data );
10932 if ( event.result === false ) {
10933 event.preventDefault();
10939 // If nobody prevented the default action, do it now
10940 if ( !onlyHandlers && !event.isDefaultPrevented() ) {
10942 if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&
10943 jQuery.acceptData( elem ) ) {
10945 // Call a native DOM method on the target with the same name name as the event.
10946 // Don't do default actions on window, that's where global variables be (#
6170)
10947 if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {
10949 // Don't re-trigger an onFOO event when we call its FOO() method
10950 tmp = elem[ ontype ];
10953 elem[ ontype ] = null;
10956 // Prevent re-triggering of the same event, since we already bubbled it above
10957 jQuery.event.triggered = type;
10959 jQuery.event.triggered = undefined;
10962 elem[ ontype ] = tmp;
10968 return event.result;
10971 dispatch: function( event ) {
10973 // Make a writable jQuery.Event from the native event object
10974 event = jQuery.event.fix( event );
10976 var i, j, ret, matched, handleObj,
10978 args = slice.call( arguments ),
10979 handlers = ( data_priv.get( this,
"events" ) || {} )[ event.type ] || [],
10980 special = jQuery.event.special[ event.type ] || {};
10982 // Use the fix-ed jQuery.Event rather than the (read-only) native event
10984 event.delegateTarget = this;
10986 // Call the preDispatch hook for the mapped type, and let it bail if desired
10987 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
10991 // Determine handlers
10992 handlerQueue = jQuery.event.handlers.call( this, event, handlers );
10994 // Run delegates first; they may want to stop propagation beneath us
10996 while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
10997 event.currentTarget = matched.elem;
11000 while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
11002 // Triggered event must either
1) have no namespace, or
11003 //
2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
11004 if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
11006 event.handleObj = handleObj;
11007 event.data = handleObj.data;
11009 ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
11010 .apply( matched.elem, args );
11012 if ( ret !== undefined ) {
11013 if ( (event.result = ret) === false ) {
11014 event.preventDefault();
11015 event.stopPropagation();
11022 // Call the postDispatch hook for the mapped type
11023 if ( special.postDispatch ) {
11024 special.postDispatch.call( this, event );
11027 return event.result;
11030 handlers: function( event, handlers ) {
11031 var i, matches, sel, handleObj,
11033 delegateCount = handlers.delegateCount,
11034 cur = event.target;
11036 // Find delegate handlers
11037 // Black-hole SVG
<use> instance trees (#
13180)
11038 // Avoid non-left-click bubbling in Firefox (#
3861)
11039 if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
11041 for ( ; cur !== this; cur = cur.parentNode || this ) {
11043 // Don't process clicks on disabled elements (#
6911, #
8165, #
11382, #
11764)
11044 if ( cur.disabled !== true || event.type !== "click" ) {
11046 for ( i =
0; i < delegateCount; i++ ) {
11047 handleObj = handlers[ i ];
11049 // Don't conflict with Object.prototype properties (#
13203)
11050 sel = handleObj.selector + " ";
11052 if ( matches[ sel ] === undefined ) {
11053 matches[ sel ] = handleObj.needsContext ?
11054 jQuery( sel, this ).index( cur )
>=
0 :
11055 jQuery.find( sel, this, null, [ cur ] ).length;
11057 if ( matches[ sel ] ) {
11058 matches.push( handleObj );
11061 if ( matches.length ) {
11062 handlerQueue.push({ elem: cur, handlers: matches });
11068 // Add the remaining (directly-bound) handlers
11069 if ( delegateCount < handlers.length ) {
11070 handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
11073 return handlerQueue;
11076 // Includes some event props shared by KeyEvent and MouseEvent
11077 props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
11082 props: "char charCode key keyCode".split(" "),
11083 filter: function( event, original ) {
11085 // Add which for key events
11086 if ( event.which == null ) {
11087 event.which = original.charCode != null ? original.charCode : original.keyCode;
11095 props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
11096 filter: function( event, original ) {
11097 var eventDoc, doc, body,
11098 button = original.button;
11100 // Calculate pageX/Y if missing and clientX/Y available
11101 if ( event.pageX == null && original.clientX != null ) {
11102 eventDoc = event.target.ownerDocument || document;
11103 doc = eventDoc.documentElement;
11104 body = eventDoc.body;
11106 event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft ||
0 ) - ( doc && doc.clientLeft || body && body.clientLeft ||
0 );
11107 event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop ||
0 ) - ( doc && doc.clientTop || body && body.clientTop ||
0 );
11110 // Add which for click:
1 === left;
2 === middle;
3 === right
11111 // Note: button is not normalized, so don't use it
11112 if ( !event.which && button !== undefined ) {
11113 event.which = ( button &
1 ?
1 : ( button &
2 ?
3 : ( button &
4 ?
2 :
0 ) ) );
11120 fix: function( event ) {
11121 if ( event[ jQuery.expando ] ) {
11125 // Create a writable copy of the event object and normalize some properties
11128 originalEvent = event,
11129 fixHook = this.fixHooks[ type ];
11132 this.fixHooks[ type ] = fixHook =
11133 rmouseEvent.test( type ) ? this.mouseHooks :
11134 rkeyEvent.test( type ) ? this.keyHooks :
11137 copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
11139 event = new jQuery.Event( originalEvent );
11144 event[ prop ] = originalEvent[ prop ];
11147 // Support: Cordova
2.5 (WebKit) (#
13255)
11148 // All events should have a target; Cordova deviceready doesn't
11149 if ( !event.target ) {
11150 event.target = document;
11153 // Support: Safari
6.0+, Chrome <
28
11154 // Target should not be a text node (#
504, #
13143)
11155 if ( event.target.nodeType ===
3 ) {
11156 event.target = event.target.parentNode;
11159 return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
11164 // Prevent triggered image.load events from bubbling to window.load
11168 // Fire native event if possible so blur/focus sequence is correct
11169 trigger: function() {
11170 if ( this !== safeActiveElement() && this.focus ) {
11175 delegateType: "focusin"
11178 trigger: function() {
11179 if ( this === safeActiveElement() && this.blur ) {
11184 delegateType: "focusout"
11187 // For checkbox, fire native event so checked state will be right
11188 trigger: function() {
11189 if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
11195 // For cross-browser consistency, don't fire native .click() on links
11196 _default: function( event ) {
11197 return jQuery.nodeName( event.target, "a" );
11202 postDispatch: function( event ) {
11204 // Support: Firefox
20+
11205 // Firefox doesn't alert if the returnValue field is not set.
11206 if ( event.result !== undefined && event.originalEvent ) {
11207 event.originalEvent.returnValue = event.result;
11213 simulate: function( type, elem, event, bubble ) {
11214 // Piggyback on a donor event to simulate a different one.
11215 // Fake originalEvent to avoid donor's stopPropagation, but if the
11216 // simulated event prevents default then we do the same on the donor.
11217 var e = jQuery.extend(
11218 new jQuery.Event(),
11227 jQuery.event.trigger( e, null, elem );
11229 jQuery.event.dispatch.call( elem, e );
11231 if ( e.isDefaultPrevented() ) {
11232 event.preventDefault();
11237 jQuery.removeEvent = function( elem, type, handle ) {
11238 if ( elem.removeEventListener ) {
11239 elem.removeEventListener( type, handle, false );
11243 jQuery.Event = function( src, props ) {
11244 // Allow instantiation without the 'new' keyword
11245 if ( !(this instanceof jQuery.Event) ) {
11246 return new jQuery.Event( src, props );
11250 if ( src && src.type ) {
11251 this.originalEvent = src;
11252 this.type = src.type;
11254 // Events bubbling up the document may have been marked as prevented
11255 // by a handler lower down the tree; reflect the correct value.
11256 this.isDefaultPrevented = src.defaultPrevented ||
11257 src.defaultPrevented === undefined &&
11258 // Support: Android <
4.0
11259 src.returnValue === false ?
11268 // Put explicitly provided properties onto the event object
11270 jQuery.extend( this, props );
11273 // Create a timestamp if incoming event doesn't have one
11274 this.timeStamp = src && src.timeStamp || jQuery.now();
11276 // Mark it as fixed
11277 this[ jQuery.expando ] = true;
11280 // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
11281 // http://www.w3.org/TR/
2003/WD-DOM-Level-
3-Events-
20030331/ecma-script-binding.html
11282 jQuery.Event.prototype = {
11283 isDefaultPrevented: returnFalse,
11284 isPropagationStopped: returnFalse,
11285 isImmediatePropagationStopped: returnFalse,
11287 preventDefault: function() {
11288 var e = this.originalEvent;
11290 this.isDefaultPrevented = returnTrue;
11292 if ( e && e.preventDefault ) {
11293 e.preventDefault();
11296 stopPropagation: function() {
11297 var e = this.originalEvent;
11299 this.isPropagationStopped = returnTrue;
11301 if ( e && e.stopPropagation ) {
11302 e.stopPropagation();
11305 stopImmediatePropagation: function() {
11306 var e = this.originalEvent;
11308 this.isImmediatePropagationStopped = returnTrue;
11310 if ( e && e.stopImmediatePropagation ) {
11311 e.stopImmediatePropagation();
11314 this.stopPropagation();
11318 // Create mouseenter/leave events using mouseover/out and event-time checks
11319 // Support: Chrome
15+
11321 mouseenter: "mouseover",
11322 mouseleave: "mouseout",
11323 pointerenter: "pointerover",
11324 pointerleave: "pointerout"
11325 }, function( orig, fix ) {
11326 jQuery.event.special[ orig ] = {
11330 handle: function( event ) {
11333 related = event.relatedTarget,
11334 handleObj = event.handleObj;
11336 // For mousenter/leave call the handler if related is outside the target.
11337 // NB: No relatedTarget if the mouse left/entered the browser window
11338 if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
11339 event.type = handleObj.origType;
11340 ret = handleObj.handler.apply( this, arguments );
11348 // Create "bubbling" focus and blur events
11349 // Support: Firefox, Chrome, Safari
11350 if ( !support.focusinBubbles ) {
11351 jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
11353 // Attach a single capturing handler on the document while someone wants focusin/focusout
11354 var handler = function( event ) {
11355 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
11358 jQuery.event.special[ fix ] = {
11359 setup: function() {
11360 var doc = this.ownerDocument || this,
11361 attaches = data_priv.access( doc, fix );
11364 doc.addEventListener( orig, handler, true );
11366 data_priv.access( doc, fix, ( attaches ||
0 ) +
1 );
11368 teardown: function() {
11369 var doc = this.ownerDocument || this,
11370 attaches = data_priv.access( doc, fix ) -
1;
11373 doc.removeEventListener( orig, handler, true );
11374 data_priv.remove( doc, fix );
11377 data_priv.access( doc, fix, attaches );
11386 on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
11389 // Types can be a map of types/handlers
11390 if ( typeof types === "object" ) {
11391 // ( types-Object, selector, data )
11392 if ( typeof selector !== "string" ) {
11393 // ( types-Object, data )
11394 data = data || selector;
11395 selector = undefined;
11397 for ( type in types ) {
11398 this.on( type, selector, data, types[ type ], one );
11403 if ( data == null && fn == null ) {
11406 data = selector = undefined;
11407 } else if ( fn == null ) {
11408 if ( typeof selector === "string" ) {
11409 // ( types, selector, fn )
11413 // ( types, data, fn )
11416 selector = undefined;
11419 if ( fn === false ) {
11421 } else if ( !fn ) {
11427 fn = function( event ) {
11428 // Can use an empty set, since event contains the info
11429 jQuery().off( event );
11430 return origFn.apply( this, arguments );
11432 // Use same guid so caller can remove using origFn
11433 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
11435 return this.each( function() {
11436 jQuery.event.add( this, types, fn, data, selector );
11439 one: function( types, selector, data, fn ) {
11440 return this.on( types, selector, data, fn,
1 );
11442 off: function( types, selector, fn ) {
11443 var handleObj, type;
11444 if ( types && types.preventDefault && types.handleObj ) {
11445 // ( event ) dispatched jQuery.Event
11446 handleObj = types.handleObj;
11447 jQuery( types.delegateTarget ).off(
11448 handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
11449 handleObj.selector,
11454 if ( typeof types === "object" ) {
11455 // ( types-object [, selector] )
11456 for ( type in types ) {
11457 this.off( type, selector, types[ type ] );
11461 if ( selector === false || typeof selector === "function" ) {
11462 // ( types [, fn] )
11464 selector = undefined;
11466 if ( fn === false ) {
11469 return this.each(function() {
11470 jQuery.event.remove( this, types, fn, selector );
11474 trigger: function( type, data ) {
11475 return this.each(function() {
11476 jQuery.event.trigger( type, data, this );
11479 triggerHandler: function( type, data ) {
11480 var elem = this[
0];
11482 return jQuery.event.trigger( type, data, elem, true );
11489 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^
>]*)\
/>/gi,
11490 rtagName = /<([\w:]+)/,
11491 rhtml = /<|&#?\w+;/,
11492 rnoInnerhtml = /<(?:script|style|link)/i,
11493 //
checked="checked" or checked
11494 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
11495 rscriptType = /^$|\/(?:java|ecma)script/i,
11496 rscriptTypeMasked = /^true\/(.*)/,
11497 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)
>\s*$/g,
11499 // We have to close these tags to support XHTML (#
13200)
11503 option: [
1, "
<select multiple='multiple'
>", "</select>" ],
11505 thead: [ 1, "<table>", "</table>" ],
11506 col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
11507 tr: [ 2, "<table><tbody>", "</tbody></table>" ],
11508 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
11510 _default: [ 0, "", "" ]
11514 wrapMap.optgroup = wrapMap.option;
11516 wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
11517 wrapMap.th = wrapMap.td;
11519 // Support: 1.x compatibility
11520 // Manipulating tables requires a tbody
11521 function manipulationTarget( elem, content ) {
11522 return jQuery.nodeName( elem, "table
" ) &&
11523 jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr
" ) ?
11525 elem.getElementsByTagName("tbody
")[0] ||
11526 elem.appendChild( elem.ownerDocument.createElement("tbody
") ) :
11530 // Replace/restore the type attribute of script elements for safe DOM manipulation
11531 function disableScript( elem ) {
11532 elem.type = (elem.getAttribute("type
") !== null) + "/
" + elem.type;
11535 function restoreScript( elem ) {
11536 var match = rscriptTypeMasked.exec( elem.type );
11539 elem.type = match[ 1 ];
11541 elem.removeAttribute("type
");
11547 // Mark scripts as having already been evaluated
11548 function setGlobalEval( elems, refElements ) {
11552 for ( ; i < l; i++ ) {
11554 elems[ i ], "globalEval
", !refElements || data_priv.get( refElements[ i ], "globalEval
" )
11559 function cloneCopyEvent( src, dest ) {
11560 var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
11562 if ( dest.nodeType !== 1 ) {
11566 // 1. Copy private data: events, handlers, etc.
11567 if ( data_priv.hasData( src ) ) {
11568 pdataOld = data_priv.access( src );
11569 pdataCur = data_priv.set( dest, pdataOld );
11570 events = pdataOld.events;
11573 delete pdataCur.handle;
11574 pdataCur.events = {};
11576 for ( type in events ) {
11577 for ( i = 0, l = events[ type ].length; i < l; i++ ) {
11578 jQuery.event.add( dest, type, events[ type ][ i ] );
11584 // 2. Copy user data
11585 if ( data_user.hasData( src ) ) {
11586 udataOld = data_user.access( src );
11587 udataCur = jQuery.extend( {}, udataOld );
11589 data_user.set( dest, udataCur );
11593 function getAll( context, tag ) {
11594 var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*
" ) :
11595 context.querySelectorAll ? context.querySelectorAll( tag || "*
" ) :
11598 return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
11599 jQuery.merge( [ context ], ret ) :
11603 // Support: IE >= 9
11604 function fixInput( src, dest ) {
11605 var nodeName = dest.nodeName.toLowerCase();
11607 // Fails to persist the checked state of a cloned checkbox or radio button.
11608 if ( nodeName === "input
" && rcheckableType.test( src.type ) ) {
11609 dest.checked = src.checked;
11611 // Fails to return the selected option to the default selected state when cloning options
11612 } else if ( nodeName === "input
" || nodeName === "textarea
" ) {
11613 dest.defaultValue = src.defaultValue;
11618 clone: function( elem, dataAndEvents, deepDataAndEvents ) {
11619 var i, l, srcElements, destElements,
11620 clone = elem.cloneNode( true ),
11621 inPage = jQuery.contains( elem.ownerDocument, elem );
11623 // Support: IE >= 9
11624 // Fix Cloning issues
11625 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
11626 !jQuery.isXMLDoc( elem ) ) {
11628 // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
11629 destElements = getAll( clone );
11630 srcElements = getAll( elem );
11632 for ( i = 0, l = srcElements.length; i < l; i++ ) {
11633 fixInput( srcElements[ i ], destElements[ i ] );
11637 // Copy the events from the original to the clone
11638 if ( dataAndEvents ) {
11639 if ( deepDataAndEvents ) {
11640 srcElements = srcElements || getAll( elem );
11641 destElements = destElements || getAll( clone );
11643 for ( i = 0, l = srcElements.length; i < l; i++ ) {
11644 cloneCopyEvent( srcElements[ i ], destElements[ i ] );
11647 cloneCopyEvent( elem, clone );
11651 // Preserve script evaluation history
11652 destElements = getAll( clone, "script
" );
11653 if ( destElements.length > 0 ) {
11654 setGlobalEval( destElements, !inPage && getAll( elem, "script
" ) );
11657 // Return the cloned set
11661 buildFragment: function( elems, context, scripts, selection ) {
11662 var elem, tmp, tag, wrap, contains, j,
11663 fragment = context.createDocumentFragment(),
11668 for ( ; i < l; i++ ) {
11671 if ( elem || elem === 0 ) {
11673 // Add nodes directly
11674 if ( jQuery.type( elem ) === "object
" ) {
11675 // Support: QtWebKit
11676 // jQuery.merge because push.apply(_, arraylike) throws
11677 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
11679 // Convert non-html into a text node
11680 } else if ( !rhtml.test( elem ) ) {
11681 nodes.push( context.createTextNode( elem ) );
11683 // Convert html into DOM nodes
11685 tmp = tmp || fragment.appendChild( context.createElement("div
") );
11687 // Deserialize a standard representation
11688 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
11689 wrap = wrapMap[ tag ] || wrapMap._default;
11690 tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$
1></$
2>" ) + wrap[ 2 ];
11692 // Descend through wrappers to the right content
11695 tmp = tmp.lastChild;
11698 // Support: QtWebKit
11699 // jQuery.merge because push.apply(_, arraylike) throws
11700 jQuery.merge( nodes, tmp.childNodes );
11702 // Remember the top-level container
11703 tmp = fragment.firstChild;
11706 // Support: Webkit, IE
11707 tmp.textContent = "";
11712 // Remove wrapper from fragment
11713 fragment.textContent = "";
11716 while ( (elem = nodes[ i++ ]) ) {
11718 // #4087 - If origin and destination elements are the same, and this is
11719 // that element, do not do anything
11720 if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
11724 contains = jQuery.contains( elem.ownerDocument, elem );
11726 // Append to fragment
11727 tmp = getAll( fragment.appendChild( elem ), "script
" );
11729 // Preserve script evaluation history
11731 setGlobalEval( tmp );
11734 // Capture executables
11737 while ( (elem = tmp[ j++ ]) ) {
11738 if ( rscriptType.test( elem.type || "" ) ) {
11739 scripts.push( elem );
11748 cleanData: function( elems ) {
11749 var data, elem, type, key,
11750 special = jQuery.event.special,
11753 for ( ; (elem = elems[ i ]) !== undefined; i++ ) {
11754 if ( jQuery.acceptData( elem ) ) {
11755 key = elem[ data_priv.expando ];
11757 if ( key && (data = data_priv.cache[ key ]) ) {
11758 if ( data.events ) {
11759 for ( type in data.events ) {
11760 if ( special[ type ] ) {
11761 jQuery.event.remove( elem, type );
11763 // This is a shortcut to avoid jQuery.event.remove's overhead
11765 jQuery.removeEvent( elem, type, data.handle );
11769 if ( data_priv.cache[ key ] ) {
11770 // Discard any remaining `private` data
11771 delete data_priv.cache[ key ];
11775 // Discard any remaining `user` data
11776 delete data_user.cache[ elem[ data_user.expando ] ];
11782 text: function( value ) {
11783 return access( this, function( value ) {
11784 return value === undefined ?
11785 jQuery.text( this ) :
11786 this.empty().each(function() {
11787 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11788 this.textContent = value;
11791 }, null, value, arguments.length );
11794 append: function() {
11795 return this.domManip( arguments, function( elem ) {
11796 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11797 var target = manipulationTarget( this, elem );
11798 target.appendChild( elem );
11803 prepend: function() {
11804 return this.domManip( arguments, function( elem ) {
11805 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
11806 var target = manipulationTarget( this, elem );
11807 target.insertBefore( elem, target.firstChild );
11812 before: function() {
11813 return this.domManip( arguments, function( elem ) {
11814 if ( this.parentNode ) {
11815 this.parentNode.insertBefore( elem, this );
11820 after: function() {
11821 return this.domManip( arguments, function( elem ) {
11822 if ( this.parentNode ) {
11823 this.parentNode.insertBefore( elem, this.nextSibling );
11828 remove: function( selector, keepData /* Internal Use Only */ ) {
11830 elems = selector ? jQuery.filter( selector, this ) : this,
11833 for ( ; (elem = elems[i]) != null; i++ ) {
11834 if ( !keepData && elem.nodeType === 1 ) {
11835 jQuery.cleanData( getAll( elem ) );
11838 if ( elem.parentNode ) {
11839 if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
11840 setGlobalEval( getAll( elem, "script
" ) );
11842 elem.parentNode.removeChild( elem );
11849 empty: function() {
11853 for ( ; (elem = this[i]) != null; i++ ) {
11854 if ( elem.nodeType === 1 ) {
11856 // Prevent memory leaks
11857 jQuery.cleanData( getAll( elem, false ) );
11859 // Remove any remaining nodes
11860 elem.textContent = "";
11867 clone: function( dataAndEvents, deepDataAndEvents ) {
11868 dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
11869 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
11871 return this.map(function() {
11872 return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
11876 html: function( value ) {
11877 return access( this, function( value ) {
11878 var elem = this[ 0 ] || {},
11882 if ( value === undefined && elem.nodeType === 1 ) {
11883 return elem.innerHTML;
11886 // See if we can take a shortcut and just use innerHTML
11887 if ( typeof value === "string
" && !rnoInnerhtml.test( value ) &&
11888 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {
11890 value = value.replace( rxhtmlTag, "<$
1></$
2>" );
11893 for ( ; i < l; i++ ) {
11894 elem = this[ i ] || {};
11896 // Remove element nodes and prevent memory leaks
11897 if ( elem.nodeType === 1 ) {
11898 jQuery.cleanData( getAll( elem, false ) );
11899 elem.innerHTML = value;
11905 // If using innerHTML throws an exception, use the fallback method
11910 this.empty().append( value );
11912 }, null, value, arguments.length );
11915 replaceWith: function() {
11916 var arg = arguments[ 0 ];
11918 // Make the changes, replacing each context element with the new content
11919 this.domManip( arguments, function( elem ) {
11920 arg = this.parentNode;
11922 jQuery.cleanData( getAll( this ) );
11925 arg.replaceChild( elem, this );
11929 // Force removal if there was no new content (e.g., from empty arguments)
11930 return arg && (arg.length || arg.nodeType) ? this : this.remove();
11933 detach: function( selector ) {
11934 return this.remove( selector, true );
11937 domManip: function( args, callback ) {
11939 // Flatten any nested arrays
11940 args = concat.apply( [], args );
11942 var fragment, first, scripts, hasScripts, node, doc,
11948 isFunction = jQuery.isFunction( value );
11950 // We can't cloneNode fragments that contain checked, in WebKit
11952 ( l > 1 && typeof value === "string
" &&
11953 !support.checkClone && rchecked.test( value ) ) ) {
11954 return this.each(function( index ) {
11955 var self = set.eq( index );
11956 if ( isFunction ) {
11957 args[ 0 ] = value.call( this, index, self.html() );
11959 self.domManip( args, callback );
11964 fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
11965 first = fragment.firstChild;
11967 if ( fragment.childNodes.length === 1 ) {
11972 scripts = jQuery.map( getAll( fragment, "script
" ), disableScript );
11973 hasScripts = scripts.length;
11975 // Use the original fragment for the last item instead of the first because it can end up
11976 // being emptied incorrectly in certain situations (#8070).
11977 for ( ; i < l; i++ ) {
11980 if ( i !== iNoClone ) {
11981 node = jQuery.clone( node, true, true );
11983 // Keep references to cloned scripts for later restoration
11984 if ( hasScripts ) {
11985 // Support: QtWebKit
11986 // jQuery.merge because push.apply(_, arraylike) throws
11987 jQuery.merge( scripts, getAll( node, "script
" ) );
11991 callback.call( this[ i ], node, i );
11994 if ( hasScripts ) {
11995 doc = scripts[ scripts.length - 1 ].ownerDocument;
11997 // Reenable scripts
11998 jQuery.map( scripts, restoreScript );
12000 // Evaluate executable scripts on first document insertion
12001 for ( i = 0; i < hasScripts; i++ ) {
12002 node = scripts[ i ];
12003 if ( rscriptType.test( node.type || "" ) &&
12004 !data_priv.access( node, "globalEval
" ) && jQuery.contains( doc, node ) ) {
12007 // Optional AJAX dependency, but won't run scripts if not present
12008 if ( jQuery._evalUrl ) {
12009 jQuery._evalUrl( node.src );
12012 jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
12025 appendTo: "append
",
12026 prependTo: "prepend
",
12027 insertBefore: "before
",
12028 insertAfter: "after
",
12029 replaceAll: "replaceWith
"
12030 }, function( name, original ) {
12031 jQuery.fn[ name ] = function( selector ) {
12034 insert = jQuery( selector ),
12035 last = insert.length - 1,
12038 for ( ; i <= last; i++ ) {
12039 elems = i === last ? this : this.clone( true );
12040 jQuery( insert[ i ] )[ original ]( elems );
12042 // Support: QtWebKit
12043 // .get() because push.apply(_, arraylike) throws
12044 push.apply( ret, elems.get() );
12047 return this.pushStack( ret );
12056 * Retrieve the actual display of a element
12057 * @param {String} name nodeName of the element
12058 * @param {Object} doc Document object
12060 // Called only from within defaultDisplay
12061 function actualDisplay( name, doc ) {
12063 elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
12065 // getDefaultComputedStyle might be reliably used only on attached element
12066 display = window.getDefaultComputedStyle && ( style = window.getDefaultComputedStyle( elem[ 0 ] ) ) ?
12068 // Use of this method is a temporary fix (more like optmization) until something better comes along,
12069 // since it was removed from specification and supported only in FF
12070 style.display : jQuery.css( elem[ 0 ], "display
" );
12072 // We don't have any data stored on the element,
12073 // so use "detach
" method as fast way to get rid of the element
12080 * Try to determine the default display value of an element
12081 * @param {String} nodeName
12083 function defaultDisplay( nodeName ) {
12084 var doc = document,
12085 display = elemdisplay[ nodeName ];
12088 display = actualDisplay( nodeName, doc );
12090 // If the simple way fails, read from inside an iframe
12091 if ( display === "none
" || !display ) {
12093 // Use the already-created iframe if possible
12094 iframe = (iframe || jQuery( "<iframe frameborder='
0' width='
0' height='
0'
/>" )).appendTo( doc.documentElement );
12096 // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
12097 doc = iframe[ 0 ].contentDocument;
12103 display = actualDisplay( nodeName, doc );
12107 // Store the correct default display
12108 elemdisplay[ nodeName ] = display;
12113 var rmargin = (/^margin/);
12115 var rnumnonpx = new RegExp( "^(
" + pnum + ")(?!px)[a-z%]+$
", "i
" );
12117 var getStyles = function( elem ) {
12118 return elem.ownerDocument.defaultView.getComputedStyle( elem, null );
12123 function curCSS( elem, name, computed ) {
12124 var width, minWidth, maxWidth, ret,
12125 style = elem.style;
12127 computed = computed || getStyles( elem );
12130 // getPropertyValue is only needed for .css('filter') in IE9, see #12537
12132 ret = computed.getPropertyValue( name ) || computed[ name ];
12137 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
12138 ret = jQuery.style( elem, name );
12141 // Support: iOS < 6
12142 // A tribute to the "awesome hack by Dean Edwards
"
12143 // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
12144 // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
12145 if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
12147 // Remember the original values
12148 width = style.width;
12149 minWidth = style.minWidth;
12150 maxWidth = style.maxWidth;
12152 // Put in the new values to get a computed value out
12153 style.minWidth = style.maxWidth = style.width = ret;
12154 ret = computed.width;
12156 // Revert the changed values
12157 style.width = width;
12158 style.minWidth = minWidth;
12159 style.maxWidth = maxWidth;
12163 return ret !== undefined ?
12165 // IE returns zIndex value as an integer.
12171 function addGetHookIf( conditionFn, hookFn ) {
12172 // Define the hook, we'll check on the first run if it's really needed.
12175 if ( conditionFn() ) {
12176 // Hook not needed (or it's not possible to use it due to missing dependency),
12178 // Since there are no other hooks for marginRight, remove the whole object.
12183 // Hook needed; redefine it so that the support test is not executed again.
12185 return (this.get = hookFn).apply( this, arguments );
12192 var pixelPositionVal, boxSizingReliableVal,
12193 docElem = document.documentElement,
12194 container = document.createElement( "div
" ),
12195 div = document.createElement( "div
" );
12197 if ( !div.style ) {
12201 div.style.backgroundClip = "content-box
";
12202 div.cloneNode( true ).style.backgroundClip = "";
12203 support.clearCloneStyle = div.style.backgroundClip === "content-box
";
12205 container.style.cssText = "border:
0;width:
0;height:
0;top:
0;left:-
9999px;margin-top:
1px;
" +
12206 "position:absolute
";
12207 container.appendChild( div );
12209 // Executing both pixelPosition & boxSizingReliable tests require only one layout
12210 // so they're executed at the same time to save the second computation.
12211 function computePixelPositionAndBoxSizingReliable() {
12212 div.style.cssText =
12213 // Support: Firefox<29, Android 2.3
12214 // Vendor-prefix box-sizing
12215 "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;
" +
12216 "box-sizing:border-box;display:block;margin-top:
1%;top:
1%;
" +
12217 "border:
1px;padding:
1px;width:
4px;position:absolute
";
12218 div.innerHTML = "";
12219 docElem.appendChild( container );
12221 var divStyle = window.getComputedStyle( div, null );
12222 pixelPositionVal = divStyle.top !== "1%
";
12223 boxSizingReliableVal = divStyle.width === "4px
";
12225 docElem.removeChild( container );
12228 // Support: node.js jsdom
12229 // Don't assume that getComputedStyle is a property of the global object
12230 if ( window.getComputedStyle ) {
12231 jQuery.extend( support, {
12232 pixelPosition: function() {
12233 // This test is executed only once but we still do memoizing
12234 // since we can use the boxSizingReliable pre-computing.
12235 // No need to check if the test was already performed, though.
12236 computePixelPositionAndBoxSizingReliable();
12237 return pixelPositionVal;
12239 boxSizingReliable: function() {
12240 if ( boxSizingReliableVal == null ) {
12241 computePixelPositionAndBoxSizingReliable();
12243 return boxSizingReliableVal;
12245 reliableMarginRight: function() {
12246 // Support: Android 2.3
12247 // Check if div with explicit width and no margin-right incorrectly
12248 // gets computed margin-right based on width of container. (#3333)
12249 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
12250 // This support function is only executed once so no memoizing is needed.
12252 marginDiv = div.appendChild( document.createElement( "div
" ) );
12254 // Reset CSS: box-sizing; display; margin; border; padding
12255 marginDiv.style.cssText = div.style.cssText =
12256 // Support: Firefox<29, Android 2.3
12257 // Vendor-prefix box-sizing
12258 "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;
" +
12259 "box-sizing:content-box;display:block;margin:
0;border:
0;padding:
0";
12260 marginDiv.style.marginRight = marginDiv.style.width = "0";
12261 div.style.width = "1px
";
12262 docElem.appendChild( container );
12264 ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );
12266 docElem.removeChild( container );
12275 // A method for quickly swapping in/out CSS properties to get correct calculations.
12276 jQuery.swap = function( elem, options, callback, args ) {
12280 // Remember the old values, and insert the new ones
12281 for ( name in options ) {
12282 old[ name ] = elem.style[ name ];
12283 elem.style[ name ] = options[ name ];
12286 ret = callback.apply( elem, args || [] );
12288 // Revert the old values
12289 for ( name in options ) {
12290 elem.style[ name ] = old[ name ];
12298 // swappable if display is none or starts with table except "table
", "table-cell
", or "table-caption
"
12299 // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
12300 rdisplayswap = /^(none|table(?!-c[ea]).+)/,
12301 rnumsplit = new RegExp( "^(
" + pnum + ")(.*)$
", "i
" ),
12302 rrelNum = new RegExp( "^([+-])=(
" + pnum + ")
", "i
" ),
12304 cssShow = { position: "absolute
", visibility: "hidden
", display: "block
" },
12305 cssNormalTransform = {
12306 letterSpacing: "0",
12310 cssPrefixes = [ "Webkit
", "O
", "Moz
", "ms
" ];
12312 // return a css property mapped to a potentially vendor prefixed property
12313 function vendorPropName( style, name ) {
12315 // shortcut for names that are not vendor prefixed
12316 if ( name in style ) {
12320 // check for vendor prefixed names
12321 var capName = name[0].toUpperCase() + name.slice(1),
12323 i = cssPrefixes.length;
12326 name = cssPrefixes[ i ] + capName;
12327 if ( name in style ) {
12335 function setPositiveNumber( elem, value, subtract ) {
12336 var matches = rnumsplit.exec( value );
12338 // Guard against undefined "subtract
", e.g., when used as in cssHooks
12339 Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px
" ) :
12343 function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
12344 var i = extra === ( isBorderBox ? "border
" : "content
" ) ?
12345 // If we already have the right measurement, avoid augmentation
12347 // Otherwise initialize for horizontal or vertical properties
12348 name === "width
" ? 1 : 0,
12352 for ( ; i < 4; i += 2 ) {
12353 // both box models exclude margin, so add it if we want it
12354 if ( extra === "margin
" ) {
12355 val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
12358 if ( isBorderBox ) {
12359 // border-box includes padding, so remove it if we want content
12360 if ( extra === "content
" ) {
12361 val -= jQuery.css( elem, "padding
" + cssExpand[ i ], true, styles );
12364 // at this point, extra isn't border nor margin, so remove border
12365 if ( extra !== "margin
" ) {
12366 val -= jQuery.css( elem, "border
" + cssExpand[ i ] + "Width
", true, styles );
12369 // at this point, extra isn't content, so add padding
12370 val += jQuery.css( elem, "padding
" + cssExpand[ i ], true, styles );
12372 // at this point, extra isn't content nor padding, so add border
12373 if ( extra !== "padding
" ) {
12374 val += jQuery.css( elem, "border
" + cssExpand[ i ] + "Width
", true, styles );
12382 function getWidthOrHeight( elem, name, extra ) {
12384 // Start with offset property, which is equivalent to the border-box value
12385 var valueIsBorderBox = true,
12386 val = name === "width
" ? elem.offsetWidth : elem.offsetHeight,
12387 styles = getStyles( elem ),
12388 isBorderBox = jQuery.css( elem, "boxSizing
", false, styles ) === "border-box
";
12390 // some non-html elements return undefined for offsetWidth, so check for null/undefined
12391 // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
12392 // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
12393 if ( val <= 0 || val == null ) {
12394 // Fall back to computed then uncomputed css if necessary
12395 val = curCSS( elem, name, styles );
12396 if ( val < 0 || val == null ) {
12397 val = elem.style[ name ];
12400 // Computed unit is not pixels. Stop here and return.
12401 if ( rnumnonpx.test(val) ) {
12405 // we need the check for style in case a browser which returns unreliable values
12406 // for getComputedStyle silently falls back to the reliable elem.style
12407 valueIsBorderBox = isBorderBox &&
12408 ( support.boxSizingReliable() || val === elem.style[ name ] );
12410 // Normalize "", auto, and prepare for extra
12411 val = parseFloat( val ) || 0;
12414 // use the active box-sizing model to add/subtract irrelevant styles
12416 augmentWidthOrHeight(
12419 extra || ( isBorderBox ? "border
" : "content
" ),
12426 function showHide( elements, show ) {
12427 var display, elem, hidden,
12430 length = elements.length;
12432 for ( ; index < length; index++ ) {
12433 elem = elements[ index ];
12434 if ( !elem.style ) {
12438 values[ index ] = data_priv.get( elem, "olddisplay
" );
12439 display = elem.style.display;
12441 // Reset the inline display of this element to learn if it is
12442 // being hidden by cascaded rules or not
12443 if ( !values[ index ] && display === "none
" ) {
12444 elem.style.display = "";
12447 // Set elements which have been overridden with display: none
12448 // in a stylesheet to whatever the default browser style is
12449 // for such an element
12450 if ( elem.style.display === "" && isHidden( elem ) ) {
12451 values[ index ] = data_priv.access( elem, "olddisplay
", defaultDisplay(elem.nodeName) );
12454 hidden = isHidden( elem );
12456 if ( display !== "none
" || !hidden ) {
12457 data_priv.set( elem, "olddisplay
", hidden ? display : jQuery.css( elem, "display
" ) );
12462 // Set the display of most of the elements in a second loop
12463 // to avoid the constant reflow
12464 for ( index = 0; index < length; index++ ) {
12465 elem = elements[ index ];
12466 if ( !elem.style ) {
12469 if ( !show || elem.style.display === "none
" || elem.style.display === "" ) {
12470 elem.style.display = show ? values[ index ] || "" : "none
";
12478 // Add in style property hooks for overriding the default
12479 // behavior of getting and setting a style property
12482 get: function( elem, computed ) {
12484 // We should always get a number back from opacity
12485 var ret = curCSS( elem, "opacity
" );
12486 return ret === "" ? "1" : ret;
12492 // Don't automatically add "px
" to these possibly-unitless properties
12494 "columnCount
": true,
12495 "fillOpacity
": true,
12497 "flexShrink
": true,
12498 "fontWeight
": true,
12499 "lineHeight
": true,
12508 // Add in properties whose names you wish to fix before
12509 // setting or getting the value
12511 // normalize float css property
12512 "float
": "cssFloat
"
12515 // Get and set the style property on a DOM Node
12516 style: function( elem, name, value, extra ) {
12517 // Don't set styles on text and comment nodes
12518 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
12522 // Make sure that we're working with the right name
12523 var ret, type, hooks,
12524 origName = jQuery.camelCase( name ),
12525 style = elem.style;
12527 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
12529 // gets hook for the prefixed version
12530 // followed by the unprefixed version
12531 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
12533 // Check if we're setting a value
12534 if ( value !== undefined ) {
12535 type = typeof value;
12537 // convert relative number strings (+= or -=) to relative numbers. #7345
12538 if ( type === "string
" && (ret = rrelNum.exec( value )) ) {
12539 value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
12544 // Make sure that null and NaN values aren't set. See: #7116
12545 if ( value == null || value !== value ) {
12549 // If a number was passed in, add 'px' to the (except for certain CSS properties)
12550 if ( type === "number
" && !jQuery.cssNumber[ origName ] ) {
12554 // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,
12555 // but it would mean to define eight (for every problematic property) identical functions
12556 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background
" ) === 0 ) {
12557 style[ name ] = "inherit
";
12560 // If a hook was provided, use that value, otherwise just set the specified value
12561 if ( !hooks || !("set
" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
12562 style[ name ] = value;
12566 // If a hook was provided get the non-computed value from there
12567 if ( hooks && "get
" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
12571 // Otherwise just get the value from the style object
12572 return style[ name ];
12576 css: function( elem, name, extra, styles ) {
12577 var val, num, hooks,
12578 origName = jQuery.camelCase( name );
12580 // Make sure that we're working with the right name
12581 name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
12583 // gets hook for the prefixed version
12584 // followed by the unprefixed version
12585 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
12587 // If a hook was provided get the computed value from there
12588 if ( hooks && "get
" in hooks ) {
12589 val = hooks.get( elem, true, extra );
12592 // Otherwise, if a way to get the computed value exists, use that
12593 if ( val === undefined ) {
12594 val = curCSS( elem, name, styles );
12597 //convert "normal
" to computed value
12598 if ( val === "normal
" && name in cssNormalTransform ) {
12599 val = cssNormalTransform[ name ];
12602 // Return, converting to number if forced or a qualifier was provided and val looks numeric
12603 if ( extra === "" || extra ) {
12604 num = parseFloat( val );
12605 return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
12611 jQuery.each([ "height
", "width
" ], function( i, name ) {
12612 jQuery.cssHooks[ name ] = {
12613 get: function( elem, computed, extra ) {
12615 // certain elements can have dimension info if we invisibly show them
12616 // however, it must have a current display style that would benefit from this
12617 return rdisplayswap.test( jQuery.css( elem, "display
" ) ) && elem.offsetWidth === 0 ?
12618 jQuery.swap( elem, cssShow, function() {
12619 return getWidthOrHeight( elem, name, extra );
12621 getWidthOrHeight( elem, name, extra );
12625 set: function( elem, value, extra ) {
12626 var styles = extra && getStyles( elem );
12627 return setPositiveNumber( elem, value, extra ?
12628 augmentWidthOrHeight(
12632 jQuery.css( elem, "boxSizing
", false, styles ) === "border-box
",
12640 // Support: Android 2.3
12641 jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
12642 function( elem, computed ) {
12644 // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
12645 // Work around by temporarily setting element display to inline-block
12646 return jQuery.swap( elem, { "display
": "inline-block
" },
12647 curCSS, [ elem, "marginRight
" ] );
12652 // These hooks are used by animate to expand properties
12657 }, function( prefix, suffix ) {
12658 jQuery.cssHooks[ prefix + suffix ] = {
12659 expand: function( value ) {
12663 // assumes a single number if not a string
12664 parts = typeof value === "string
" ? value.split(" ") : [ value ];
12666 for ( ; i < 4; i++ ) {
12667 expanded[ prefix + cssExpand[ i ] + suffix ] =
12668 parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
12675 if ( !rmargin.test( prefix ) ) {
12676 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
12681 css: function( name, value ) {
12682 return access( this, function( elem, name, value ) {
12687 if ( jQuery.isArray( name ) ) {
12688 styles = getStyles( elem );
12691 for ( ; i < len; i++ ) {
12692 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
12698 return value !== undefined ?
12699 jQuery.style( elem, name, value ) :
12700 jQuery.css( elem, name );
12701 }, name, value, arguments.length > 1 );
12704 return showHide( this, true );
12707 return showHide( this );
12709 toggle: function( state ) {
12710 if ( typeof state === "boolean
" ) {
12711 return state ? this.show() : this.hide();
12714 return this.each(function() {
12715 if ( isHidden( this ) ) {
12716 jQuery( this ).show();
12718 jQuery( this ).hide();
12725 function Tween( elem, options, prop, end, easing ) {
12726 return new Tween.prototype.init( elem, options, prop, end, easing );
12728 jQuery.Tween = Tween;
12730 Tween.prototype = {
12731 constructor: Tween,
12732 init: function( elem, options, prop, end, easing, unit ) {
12735 this.easing = easing || "swing
";
12736 this.options = options;
12737 this.start = this.now = this.cur();
12739 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px
" );
12742 var hooks = Tween.propHooks[ this.prop ];
12744 return hooks && hooks.get ?
12745 hooks.get( this ) :
12746 Tween.propHooks._default.get( this );
12748 run: function( percent ) {
12750 hooks = Tween.propHooks[ this.prop ];
12752 if ( this.options.duration ) {
12753 this.pos = eased = jQuery.easing[ this.easing ](
12754 percent, this.options.duration * percent, 0, 1, this.options.duration
12757 this.pos = eased = percent;
12759 this.now = ( this.end - this.start ) * eased + this.start;
12761 if ( this.options.step ) {
12762 this.options.step.call( this.elem, this.now, this );
12765 if ( hooks && hooks.set ) {
12768 Tween.propHooks._default.set( this );
12774 Tween.prototype.init.prototype = Tween.prototype;
12776 Tween.propHooks = {
12778 get: function( tween ) {
12781 if ( tween.elem[ tween.prop ] != null &&
12782 (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
12783 return tween.elem[ tween.prop ];
12786 // passing an empty string as a 3rd parameter to .css will automatically
12787 // attempt a parseFloat and fallback to a string if the parse fails
12788 // so, simple values such as "10px
" are parsed to Float.
12789 // complex values such as "rotate(
1rad)
" are returned as is.
12790 result = jQuery.css( tween.elem, tween.prop, "" );
12791 // Empty strings, null, undefined and "auto
" are converted to 0.
12792 return !result || result === "auto
" ? 0 : result;
12794 set: function( tween ) {
12795 // use step hook for back compat - use cssHook if its there - use .style if its
12796 // available and use plain properties where available
12797 if ( jQuery.fx.step[ tween.prop ] ) {
12798 jQuery.fx.step[ tween.prop ]( tween );
12799 } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
12800 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
12802 tween.elem[ tween.prop ] = tween.now;
12809 // Panic based approach to setting things on disconnected nodes
12811 Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
12812 set: function( tween ) {
12813 if ( tween.elem.nodeType && tween.elem.parentNode ) {
12814 tween.elem[ tween.prop ] = tween.now;
12820 linear: function( p ) {
12823 swing: function( p ) {
12824 return 0.5 - Math.cos( p * Math.PI ) / 2;
12828 jQuery.fx = Tween.prototype.init;
12830 // Back Compat <1.8 extension point
12831 jQuery.fx.step = {};
12838 rfxtypes = /^(?:toggle|show|hide)$/,
12839 rfxnum = new RegExp( "^(?:([+-])=|)(
" + pnum + ")([a-z%]*)$
", "i
" ),
12840 rrun = /queueHooks$/,
12841 animationPrefilters = [ defaultPrefilter ],
12843 "*
": [ function( prop, value ) {
12844 var tween = this.createTween( prop, value ),
12845 target = tween.cur(),
12846 parts = rfxnum.exec( value ),
12847 unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px
" ),
12849 // Starting value computation is required for potential unit mismatches
12850 start = ( jQuery.cssNumber[ prop ] || unit !== "px
" && +target ) &&
12851 rfxnum.exec( jQuery.css( tween.elem, prop ) ),
12853 maxIterations = 20;
12855 if ( start && start[ 3 ] !== unit ) {
12856 // Trust units reported by jQuery.css
12857 unit = unit || start[ 3 ];
12859 // Make sure we update the tween properties later on
12860 parts = parts || [];
12862 // Iteratively approximate from a nonzero starting point
12863 start = +target || 1;
12866 // If previous iteration zeroed out, double until we get *something*
12867 // Use a string for doubling factor so we don't accidentally see scale as unchanged below
12868 scale = scale || ".5";
12870 // Adjust and apply
12871 start = start / scale;
12872 jQuery.style( tween.elem, prop, start + unit );
12874 // Update scale, tolerating zero or NaN from tween.cur()
12875 // And breaking the loop if scale is unchanged or perfect, or if we've just had enough
12876 } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
12879 // Update tween properties
12881 start = tween.start = +start || +target || 0;
12883 // If a +=/-= token was provided, we're doing a relative animation
12884 tween.end = parts[ 1 ] ?
12885 start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :
12893 // Animations created synchronously will run synchronously
12894 function createFxNow() {
12895 setTimeout(function() {
12898 return ( fxNow = jQuery.now() );
12901 // Generate parameters to create a standard animation
12902 function genFx( type, includeWidth ) {
12905 attrs = { height: type };
12907 // if we include width, step value is 1 to do all cssExpand values,
12908 // if we don't include width, step value is 2 to skip over Left and Right
12909 includeWidth = includeWidth ? 1 : 0;
12910 for ( ; i < 4 ; i += 2 - includeWidth ) {
12911 which = cssExpand[ i ];
12912 attrs[ "margin
" + which ] = attrs[ "padding
" + which ] = type;
12915 if ( includeWidth ) {
12916 attrs.opacity = attrs.width = type;
12922 function createTween( value, prop, animation ) {
12924 collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*
" ] ),
12926 length = collection.length;
12927 for ( ; index < length; index++ ) {
12928 if ( (tween = collection[ index ].call( animation, prop, value )) ) {
12930 // we're done with this property
12936 function defaultPrefilter( elem, props, opts ) {
12937 /* jshint validthis: true */
12938 var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
12941 style = elem.style,
12942 hidden = elem.nodeType && isHidden( elem ),
12943 dataShow = data_priv.get( elem, "fxshow
" );
12945 // handle queue: false promises
12946 if ( !opts.queue ) {
12947 hooks = jQuery._queueHooks( elem, "fx
" );
12948 if ( hooks.unqueued == null ) {
12949 hooks.unqueued = 0;
12950 oldfire = hooks.empty.fire;
12951 hooks.empty.fire = function() {
12952 if ( !hooks.unqueued ) {
12959 anim.always(function() {
12960 // doing this makes sure that the complete handler will be called
12961 // before this completes
12962 anim.always(function() {
12964 if ( !jQuery.queue( elem, "fx
" ).length ) {
12965 hooks.empty.fire();
12971 // height/width overflow pass
12972 if ( elem.nodeType === 1 && ( "height
" in props || "width
" in props ) ) {
12973 // Make sure that nothing sneaks out
12974 // Record all 3 overflow attributes because IE9-10 do not
12975 // change the overflow attribute when overflowX and
12976 // overflowY are set to the same value
12977 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
12979 // Set display property to inline-block for height/width
12980 // animations on inline elements that are having width/height animated
12981 display = jQuery.css( elem, "display
" );
12983 // Test default display if display is currently "none
"
12984 checkDisplay = display === "none
" ?
12985 data_priv.get( elem, "olddisplay
" ) || defaultDisplay( elem.nodeName ) : display;
12987 if ( checkDisplay === "inline
" && jQuery.css( elem, "float
" ) === "none
" ) {
12988 style.display = "inline-block
";
12992 if ( opts.overflow ) {
12993 style.overflow = "hidden
";
12994 anim.always(function() {
12995 style.overflow = opts.overflow[ 0 ];
12996 style.overflowX = opts.overflow[ 1 ];
12997 style.overflowY = opts.overflow[ 2 ];
13002 for ( prop in props ) {
13003 value = props[ prop ];
13004 if ( rfxtypes.exec( value ) ) {
13005 delete props[ prop ];
13006 toggle = toggle || value === "toggle
";
13007 if ( value === ( hidden ? "hide
" : "show
" ) ) {
13009 // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden
13010 if ( value === "show
" && dataShow && dataShow[ prop ] !== undefined ) {
13016 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );
13018 // Any non-fx value stops us from restoring the original display value
13020 display = undefined;
13024 if ( !jQuery.isEmptyObject( orig ) ) {
13026 if ( "hidden
" in dataShow ) {
13027 hidden = dataShow.hidden;
13030 dataShow = data_priv.access( elem, "fxshow
", {} );
13033 // store state if its toggle - enables .stop().toggle() to "reverse
"
13035 dataShow.hidden = !hidden;
13038 jQuery( elem ).show();
13040 anim.done(function() {
13041 jQuery( elem ).hide();
13044 anim.done(function() {
13047 data_priv.remove( elem, "fxshow
" );
13048 for ( prop in orig ) {
13049 jQuery.style( elem, prop, orig[ prop ] );
13052 for ( prop in orig ) {
13053 tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );
13055 if ( !( prop in dataShow ) ) {
13056 dataShow[ prop ] = tween.start;
13058 tween.end = tween.start;
13059 tween.start = prop === "width
" || prop === "height
" ? 1 : 0;
13064 // If this is a noop like .hide().hide(), restore an overwritten display value
13065 } else if ( (display === "none
" ? defaultDisplay( elem.nodeName ) : display) === "inline
" ) {
13066 style.display = display;
13070 function propFilter( props, specialEasing ) {
13071 var index, name, easing, value, hooks;
13073 // camelCase, specialEasing and expand cssHook pass
13074 for ( index in props ) {
13075 name = jQuery.camelCase( index );
13076 easing = specialEasing[ name ];
13077 value = props[ index ];
13078 if ( jQuery.isArray( value ) ) {
13079 easing = value[ 1 ];
13080 value = props[ index ] = value[ 0 ];
13083 if ( index !== name ) {
13084 props[ name ] = value;
13085 delete props[ index ];
13088 hooks = jQuery.cssHooks[ name ];
13089 if ( hooks && "expand
" in hooks ) {
13090 value = hooks.expand( value );
13091 delete props[ name ];
13093 // not quite $.extend, this wont overwrite keys already present.
13094 // also - reusing 'index' from above because we have the correct "name
"
13095 for ( index in value ) {
13096 if ( !( index in props ) ) {
13097 props[ index ] = value[ index ];
13098 specialEasing[ index ] = easing;
13102 specialEasing[ name ] = easing;
13107 function Animation( elem, properties, options ) {
13111 length = animationPrefilters.length,
13112 deferred = jQuery.Deferred().always( function() {
13113 // don't match elem in the :animated selector
13116 tick = function() {
13120 var currentTime = fxNow || createFxNow(),
13121 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
13122 // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
13123 temp = remaining / animation.duration || 0,
13124 percent = 1 - temp,
13126 length = animation.tweens.length;
13128 for ( ; index < length ; index++ ) {
13129 animation.tweens[ index ].run( percent );
13132 deferred.notifyWith( elem, [ animation, percent, remaining ]);
13134 if ( percent < 1 && length ) {
13137 deferred.resolveWith( elem, [ animation ] );
13141 animation = deferred.promise({
13143 props: jQuery.extend( {}, properties ),
13144 opts: jQuery.extend( true, { specialEasing: {} }, options ),
13145 originalProperties: properties,
13146 originalOptions: options,
13147 startTime: fxNow || createFxNow(),
13148 duration: options.duration,
13150 createTween: function( prop, end ) {
13151 var tween = jQuery.Tween( elem, animation.opts, prop, end,
13152 animation.opts.specialEasing[ prop ] || animation.opts.easing );
13153 animation.tweens.push( tween );
13156 stop: function( gotoEnd ) {
13158 // if we are going to the end, we want to run all the tweens
13159 // otherwise we skip this part
13160 length = gotoEnd ? animation.tweens.length : 0;
13165 for ( ; index < length ; index++ ) {
13166 animation.tweens[ index ].run( 1 );
13169 // resolve when we played the last frame
13170 // otherwise, reject
13172 deferred.resolveWith( elem, [ animation, gotoEnd ] );
13174 deferred.rejectWith( elem, [ animation, gotoEnd ] );
13179 props = animation.props;
13181 propFilter( props, animation.opts.specialEasing );
13183 for ( ; index < length ; index++ ) {
13184 result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
13190 jQuery.map( props, createTween, animation );
13192 if ( jQuery.isFunction( animation.opts.start ) ) {
13193 animation.opts.start.call( elem, animation );
13197 jQuery.extend( tick, {
13200 queue: animation.opts.queue
13204 // attach callbacks from options
13205 return animation.progress( animation.opts.progress )
13206 .done( animation.opts.done, animation.opts.complete )
13207 .fail( animation.opts.fail )
13208 .always( animation.opts.always );
13211 jQuery.Animation = jQuery.extend( Animation, {
13213 tweener: function( props, callback ) {
13214 if ( jQuery.isFunction( props ) ) {
13218 props = props.split(" ");
13223 length = props.length;
13225 for ( ; index < length ; index++ ) {
13226 prop = props[ index ];
13227 tweeners[ prop ] = tweeners[ prop ] || [];
13228 tweeners[ prop ].unshift( callback );
13232 prefilter: function( callback, prepend ) {
13234 animationPrefilters.unshift( callback );
13236 animationPrefilters.push( callback );
13241 jQuery.speed = function( speed, easing, fn ) {
13242 var opt = speed && typeof speed === "object
" ? jQuery.extend( {}, speed ) : {
13243 complete: fn || !fn && easing ||
13244 jQuery.isFunction( speed ) && speed,
13246 easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
13249 opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number
" ? opt.duration :
13250 opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
13252 // normalize opt.queue - true/undefined/null -> "fx
"
13253 if ( opt.queue == null || opt.queue === true ) {
13258 opt.old = opt.complete;
13260 opt.complete = function() {
13261 if ( jQuery.isFunction( opt.old ) ) {
13262 opt.old.call( this );
13266 jQuery.dequeue( this, opt.queue );
13274 fadeTo: function( speed, to, easing, callback ) {
13276 // show any hidden elements after setting opacity to 0
13277 return this.filter( isHidden ).css( "opacity
", 0 ).show()
13279 // animate to the value specified
13280 .end().animate({ opacity: to }, speed, easing, callback );
13282 animate: function( prop, speed, easing, callback ) {
13283 var empty = jQuery.isEmptyObject( prop ),
13284 optall = jQuery.speed( speed, easing, callback ),
13285 doAnimation = function() {
13286 // Operate on a copy of prop so per-property easing won't be lost
13287 var anim = Animation( this, jQuery.extend( {}, prop ), optall );
13289 // Empty animations, or finishing resolves immediately
13290 if ( empty || data_priv.get( this, "finish
" ) ) {
13294 doAnimation.finish = doAnimation;
13296 return empty || optall.queue === false ?
13297 this.each( doAnimation ) :
13298 this.queue( optall.queue, doAnimation );
13300 stop: function( type, clearQueue, gotoEnd ) {
13301 var stopQueue = function( hooks ) {
13302 var stop = hooks.stop;
13307 if ( typeof type !== "string
" ) {
13308 gotoEnd = clearQueue;
13312 if ( clearQueue && type !== false ) {
13313 this.queue( type || "fx
", [] );
13316 return this.each(function() {
13317 var dequeue = true,
13318 index = type != null && type + "queueHooks
",
13319 timers = jQuery.timers,
13320 data = data_priv.get( this );
13323 if ( data[ index ] && data[ index ].stop ) {
13324 stopQueue( data[ index ] );
13327 for ( index in data ) {
13328 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
13329 stopQueue( data[ index ] );
13334 for ( index = timers.length; index--; ) {
13335 if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
13336 timers[ index ].anim.stop( gotoEnd );
13338 timers.splice( index, 1 );
13342 // start the next in the queue if the last step wasn't forced
13343 // timers currently will call their complete callbacks, which will dequeue
13344 // but only if they were gotoEnd
13345 if ( dequeue || !gotoEnd ) {
13346 jQuery.dequeue( this, type );
13350 finish: function( type ) {
13351 if ( type !== false ) {
13352 type = type || "fx
";
13354 return this.each(function() {
13356 data = data_priv.get( this ),
13357 queue = data[ type + "queue
" ],
13358 hooks = data[ type + "queueHooks
" ],
13359 timers = jQuery.timers,
13360 length = queue ? queue.length : 0;
13362 // enable finishing flag on private data
13363 data.finish = true;
13365 // empty the queue first
13366 jQuery.queue( this, type, [] );
13368 if ( hooks && hooks.stop ) {
13369 hooks.stop.call( this, true );
13372 // look for any active animations, and finish them
13373 for ( index = timers.length; index--; ) {
13374 if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
13375 timers[ index ].anim.stop( true );
13376 timers.splice( index, 1 );
13380 // look for any animations in the old queue and finish them
13381 for ( index = 0; index < length; index++ ) {
13382 if ( queue[ index ] && queue[ index ].finish ) {
13383 queue[ index ].finish.call( this );
13387 // turn off finishing flag
13388 delete data.finish;
13393 jQuery.each([ "toggle
", "show
", "hide
" ], function( i, name ) {
13394 var cssFn = jQuery.fn[ name ];
13395 jQuery.fn[ name ] = function( speed, easing, callback ) {
13396 return speed == null || typeof speed === "boolean
" ?
13397 cssFn.apply( this, arguments ) :
13398 this.animate( genFx( name, true ), speed, easing, callback );
13402 // Generate shortcuts for custom animations
13404 slideDown: genFx("show
"),
13405 slideUp: genFx("hide
"),
13406 slideToggle: genFx("toggle
"),
13407 fadeIn: { opacity: "show
" },
13408 fadeOut: { opacity: "hide
" },
13409 fadeToggle: { opacity: "toggle
" }
13410 }, function( name, props ) {
13411 jQuery.fn[ name ] = function( speed, easing, callback ) {
13412 return this.animate( props, speed, easing, callback );
13416 jQuery.timers = [];
13417 jQuery.fx.tick = function() {
13420 timers = jQuery.timers;
13422 fxNow = jQuery.now();
13424 for ( ; i < timers.length; i++ ) {
13425 timer = timers[ i ];
13426 // Checks the timer has not already been removed
13427 if ( !timer() && timers[ i ] === timer ) {
13428 timers.splice( i--, 1 );
13432 if ( !timers.length ) {
13438 jQuery.fx.timer = function( timer ) {
13439 jQuery.timers.push( timer );
13443 jQuery.timers.pop();
13447 jQuery.fx.interval = 13;
13449 jQuery.fx.start = function() {
13451 timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
13455 jQuery.fx.stop = function() {
13456 clearInterval( timerId );
13460 jQuery.fx.speeds = {
13468 // Based off of the plugin by Clint Helfers, with permission.
13469 // http://blindsignals.com/index.php/2009/07/jquery-delay/
13470 jQuery.fn.delay = function( time, type ) {
13471 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
13472 type = type || "fx
";
13474 return this.queue( type, function( next, hooks ) {
13475 var timeout = setTimeout( next, time );
13476 hooks.stop = function() {
13477 clearTimeout( timeout );
13484 var input = document.createElement( "input
" ),
13485 select = document.createElement( "select
" ),
13486 opt = select.appendChild( document.createElement( "option
" ) );
13488 input.type = "checkbox
";
13490 // Support: iOS 5.1, Android 4.x, Android 2.3
13491 // Check the default checkbox/radio value ("" on old WebKit; "on
" elsewhere)
13492 support.checkOn = input.value !== "";
13494 // Must access the parent to make an option select properly
13495 // Support: IE9, IE10
13496 support.optSelected = opt.selected;
13498 // Make sure that the options inside disabled selects aren't marked as disabled
13499 // (WebKit marks them as disabled)
13500 select.disabled = true;
13501 support.optDisabled = !opt.disabled;
13503 // Check if an input maintains its value after becoming a radio
13504 // Support: IE9, IE10
13505 input = document.createElement( "input
" );
13507 input.type = "radio
";
13508 support.radioValue = input.value === "t
";
13512 var nodeHook, boolHook,
13513 attrHandle = jQuery.expr.attrHandle;
13516 attr: function( name, value ) {
13517 return access( this, jQuery.attr, name, value, arguments.length > 1 );
13520 removeAttr: function( name ) {
13521 return this.each(function() {
13522 jQuery.removeAttr( this, name );
13528 attr: function( elem, name, value ) {
13530 nType = elem.nodeType;
13532 // don't get/set attributes on text, comment and attribute nodes
13533 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
13537 // Fallback to prop when attributes are not supported
13538 if ( typeof elem.getAttribute === strundefined ) {
13539 return jQuery.prop( elem, name, value );
13542 // All attributes are lowercase
13543 // Grab necessary hook if one is defined
13544 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
13545 name = name.toLowerCase();
13546 hooks = jQuery.attrHooks[ name ] ||
13547 ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );
13550 if ( value !== undefined ) {
13552 if ( value === null ) {
13553 jQuery.removeAttr( elem, name );
13555 } else if ( hooks && "set
" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
13559 elem.setAttribute( name, value + "" );
13563 } else if ( hooks && "get
" in hooks && (ret = hooks.get( elem, name )) !== null ) {
13567 ret = jQuery.find.attr( elem, name );
13569 // Non-existent attributes return null, we normalize to undefined
13570 return ret == null ?
13576 removeAttr: function( elem, value ) {
13577 var name, propName,
13579 attrNames = value && value.match( rnotwhite );
13581 if ( attrNames && elem.nodeType === 1 ) {
13582 while ( (name = attrNames[i++]) ) {
13583 propName = jQuery.propFix[ name ] || name;
13585 // Boolean attributes get special treatment (#10870)
13586 if ( jQuery.expr.match.bool.test( name ) ) {
13587 // Set corresponding property to false
13588 elem[ propName ] = false;
13591 elem.removeAttribute( name );
13598 set: function( elem, value ) {
13599 if ( !support.radioValue && value === "radio
" &&
13600 jQuery.nodeName( elem, "input
" ) ) {
13601 // Setting the type on a radio button after the value resets the value in IE6-9
13602 // Reset value to default in case type is set after value during creation
13603 var val = elem.value;
13604 elem.setAttribute( "type
", value );
13615 // Hooks for boolean attributes
13617 set: function( elem, value, name ) {
13618 if ( value === false ) {
13619 // Remove boolean attributes when set to false
13620 jQuery.removeAttr( elem, name );
13622 elem.setAttribute( name, name );
13627 jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
13628 var getter = attrHandle[ name ] || jQuery.find.attr;
13630 attrHandle[ name ] = function( elem, name, isXML ) {
13633 // Avoid an infinite loop by temporarily removing this function from the getter
13634 handle = attrHandle[ name ];
13635 attrHandle[ name ] = ret;
13636 ret = getter( elem, name, isXML ) != null ?
13637 name.toLowerCase() :
13639 attrHandle[ name ] = handle;
13648 var rfocusable = /^(?:input|select|textarea|button)$/i;
13651 prop: function( name, value ) {
13652 return access( this, jQuery.prop, name, value, arguments.length > 1 );
13655 removeProp: function( name ) {
13656 return this.each(function() {
13657 delete this[ jQuery.propFix[ name ] || name ];
13665 "class
": "className
"
13668 prop: function( elem, name, value ) {
13669 var ret, hooks, notxml,
13670 nType = elem.nodeType;
13672 // don't get/set properties on text, comment and attribute nodes
13673 if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
13677 notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
13680 // Fix name and attach hooks
13681 name = jQuery.propFix[ name ] || name;
13682 hooks = jQuery.propHooks[ name ];
13685 if ( value !== undefined ) {
13686 return hooks && "set
" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?
13688 ( elem[ name ] = value );
13691 return hooks && "get
" in hooks && (ret = hooks.get( elem, name )) !== null ?
13699 get: function( elem ) {
13700 return elem.hasAttribute( "tabindex
" ) || rfocusable.test( elem.nodeName ) || elem.href ?
13709 // Selectedness for an option in an optgroup can be inaccurate
13710 if ( !support.optSelected ) {
13711 jQuery.propHooks.selected = {
13712 get: function( elem ) {
13713 var parent = elem.parentNode;
13714 if ( parent && parent.parentNode ) {
13715 parent.parentNode.selectedIndex;
13734 jQuery.propFix[ this.toLowerCase() ] = this;
13740 var rclass = /[\t\r\n\f]/g;
13743 addClass: function( value ) {
13744 var classes, elem, cur, clazz, j, finalValue,
13745 proceed = typeof value === "string
" && value,
13749 if ( jQuery.isFunction( value ) ) {
13750 return this.each(function( j ) {
13751 jQuery( this ).addClass( value.call( this, j, this.className ) );
13756 // The disjunction here is for better compressibility (see removeClass)
13757 classes = ( value || "" ).match( rnotwhite ) || [];
13759 for ( ; i < len; i++ ) {
13761 cur = elem.nodeType === 1 && ( elem.className ?
13762 ( " " + elem.className + " " ).replace( rclass, " " ) :
13768 while ( (clazz = classes[j++]) ) {
13769 if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
13770 cur += clazz + " ";
13774 // only assign if different to avoid unneeded rendering.
13775 finalValue = jQuery.trim( cur );
13776 if ( elem.className !== finalValue ) {
13777 elem.className = finalValue;
13786 removeClass: function( value ) {
13787 var classes, elem, cur, clazz, j, finalValue,
13788 proceed = arguments.length === 0 || typeof value === "string
" && value,
13792 if ( jQuery.isFunction( value ) ) {
13793 return this.each(function( j ) {
13794 jQuery( this ).removeClass( value.call( this, j, this.className ) );
13798 classes = ( value || "" ).match( rnotwhite ) || [];
13800 for ( ; i < len; i++ ) {
13802 // This expression is here for better compressibility (see addClass)
13803 cur = elem.nodeType === 1 && ( elem.className ?
13804 ( " " + elem.className + " " ).replace( rclass, " " ) :
13810 while ( (clazz = classes[j++]) ) {
13811 // Remove *all* instances
13812 while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
13813 cur = cur.replace( " " + clazz + " ", " " );
13817 // only assign if different to avoid unneeded rendering.
13818 finalValue = value ? jQuery.trim( cur ) : "";
13819 if ( elem.className !== finalValue ) {
13820 elem.className = finalValue;
13829 toggleClass: function( value, stateVal ) {
13830 var type = typeof value;
13832 if ( typeof stateVal === "boolean
" && type === "string
" ) {
13833 return stateVal ? this.addClass( value ) : this.removeClass( value );
13836 if ( jQuery.isFunction( value ) ) {
13837 return this.each(function( i ) {
13838 jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
13842 return this.each(function() {
13843 if ( type === "string
" ) {
13844 // toggle individual class names
13847 self = jQuery( this ),
13848 classNames = value.match( rnotwhite ) || [];
13850 while ( (className = classNames[ i++ ]) ) {
13851 // check each className given, space separated list
13852 if ( self.hasClass( className ) ) {
13853 self.removeClass( className );
13855 self.addClass( className );
13859 // Toggle whole class name
13860 } else if ( type === strundefined || type === "boolean
" ) {
13861 if ( this.className ) {
13862 // store className if set
13863 data_priv.set( this, "__className__
", this.className );
13866 // If the element has a class name or if we're passed "false
",
13867 // then remove the whole classname (if there was one, the above saved it).
13868 // Otherwise bring back whatever was previously saved (if anything),
13869 // falling back to the empty string if nothing was stored.
13870 this.className = this.className || value === false ? "" : data_priv.get( this, "__className__
" ) || "";
13875 hasClass: function( selector ) {
13876 var className = " " + selector + " ",
13879 for ( ; i < l; i++ ) {
13880 if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
13892 var rreturn = /\r/g;
13895 val: function( value ) {
13896 var hooks, ret, isFunction,
13899 if ( !arguments.length ) {
13901 hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
13903 if ( hooks && "get
" in hooks && (ret = hooks.get( elem, "value
" )) !== undefined ) {
13909 return typeof ret === "string
" ?
13910 // handle most common string cases
13911 ret.replace(rreturn, "") :
13912 // handle cases where value is null/undef or number
13913 ret == null ? "" : ret;
13919 isFunction = jQuery.isFunction( value );
13921 return this.each(function( i ) {
13924 if ( this.nodeType !== 1 ) {
13928 if ( isFunction ) {
13929 val = value.call( this, i, jQuery( this ).val() );
13934 // Treat null/undefined as ""; convert numbers to string
13935 if ( val == null ) {
13938 } else if ( typeof val === "number
" ) {
13941 } else if ( jQuery.isArray( val ) ) {
13942 val = jQuery.map( val, function( value ) {
13943 return value == null ? "" : value + "";
13947 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
13949 // If set returns undefined, fall back to normal setting
13950 if ( !hooks || !("set
" in hooks) || hooks.set( this, val, "value
" ) === undefined ) {
13960 get: function( elem ) {
13961 var val = jQuery.find.attr( elem, "value
" );
13962 return val != null ?
13964 // Support: IE10-11+
13965 // option.text throws exceptions (#14686, #14858)
13966 jQuery.trim( jQuery.text( elem ) );
13970 get: function( elem ) {
13972 options = elem.options,
13973 index = elem.selectedIndex,
13974 one = elem.type === "select-one
" || index < 0,
13975 values = one ? null : [],
13976 max = one ? index + 1 : options.length,
13981 // Loop through all the selected options
13982 for ( ; i < max; i++ ) {
13983 option = options[ i ];
13985 // IE6-9 doesn't update selected after form reset (#2551)
13986 if ( ( option.selected || i === index ) &&
13987 // Don't return options that are disabled or in a disabled optgroup
13988 ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled
" ) === null ) &&
13989 ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup
" ) ) ) {
13991 // Get the specific value for the option
13992 value = jQuery( option ).val();
13994 // We don't need an array for one selects
13999 // Multi-Selects return an array
14000 values.push( value );
14007 set: function( elem, value ) {
14008 var optionSet, option,
14009 options = elem.options,
14010 values = jQuery.makeArray( value ),
14011 i = options.length;
14014 option = options[ i ];
14015 if ( (option.selected = jQuery.inArray( option.value, values ) >= 0) ) {
14020 // force browsers to behave consistently when non-matching value is set
14021 if ( !optionSet ) {
14022 elem.selectedIndex = -1;
14030 // Radios and checkboxes getter/setter
14031 jQuery.each([ "radio
", "checkbox
" ], function() {
14032 jQuery.valHooks[ this ] = {
14033 set: function( elem, value ) {
14034 if ( jQuery.isArray( value ) ) {
14035 return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
14039 if ( !support.checkOn ) {
14040 jQuery.valHooks[ this ].get = function( elem ) {
14042 // "" is returned instead of "on
" if a value isn't specified
14043 return elem.getAttribute("value
") === null ? "on
" : elem.value;
14051 // Return jQuery for attributes-only inclusion
14054 jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick
" +
14055 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave
" +
14056 "change select submit keydown keypress keyup error contextmenu
").split(" "), function( i, name ) {
14058 // Handle event binding
14059 jQuery.fn[ name ] = function( data, fn ) {
14060 return arguments.length > 0 ?
14061 this.on( name, null, data, fn ) :
14062 this.trigger( name );
14067 hover: function( fnOver, fnOut ) {
14068 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
14071 bind: function( types, data, fn ) {
14072 return this.on( types, null, data, fn );
14074 unbind: function( types, fn ) {
14075 return this.off( types, null, fn );
14078 delegate: function( selector, types, data, fn ) {
14079 return this.on( types, selector, data, fn );
14081 undelegate: function( selector, types, fn ) {
14082 // ( namespace ) or ( selector, types [, fn] )
14083 return arguments.length === 1 ? this.off( selector, "**
" ) : this.off( types, selector || "**
", fn );
14088 var nonce = jQuery.now();
14090 var rquery = (/\?/);
14094 // Support: Android 2.3
14095 // Workaround failure to string-cast null input
14096 jQuery.parseJSON = function( data ) {
14097 return JSON.parse( data + "" );
14101 // Cross-browser xml parsing
14102 jQuery.parseXML = function( data ) {
14104 if ( !data || typeof data !== "string
" ) {
14110 tmp = new DOMParser();
14111 xml = tmp.parseFromString( data, "text/xml
" );
14116 if ( !xml || xml.getElementsByTagName( "parsererror
" ).length ) {
14117 jQuery.error( "Invalid XML:
" + data );
14124 // Document location
14129 rts = /([?&])_=[^&]*/,
14130 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
14131 // #7653, #8125, #8152: local protocol detection
14132 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
14133 rnoContent = /^(?:GET|HEAD)$/,
14134 rprotocol = /^\/\//,
14135 rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,
14138 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
14139 * 2) These are called:
14140 * - BEFORE asking for a transport
14141 * - AFTER param serialization (s.data is a string if s.processData is true)
14142 * 3) key is the dataType
14143 * 4) the catchall symbol "*
" can be used
14144 * 5) execution will start with transport dataType and THEN continue down to "*
" if needed
14148 /* Transports bindings
14149 * 1) key is the dataType
14150 * 2) the catchall symbol "*
" can be used
14151 * 3) selection will start with transport dataType and THEN go to "*
" if needed
14155 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
14156 allTypes = "*/
".concat("*
");
14158 // #8138, IE may throw an exception when accessing
14159 // a field from window.location if document.domain has been set
14161 ajaxLocation = location.href;
14163 // Use the href attribute of an A element
14164 // since IE will modify it given document.location
14165 ajaxLocation = document.createElement( "a
" );
14166 ajaxLocation.href = "";
14167 ajaxLocation = ajaxLocation.href;
14170 // Segment location into parts
14171 ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
14173 // Base "constructor
" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
14174 function addToPrefiltersOrTransports( structure ) {
14176 // dataTypeExpression is optional and defaults to "*
"
14177 return function( dataTypeExpression, func ) {
14179 if ( typeof dataTypeExpression !== "string
" ) {
14180 func = dataTypeExpression;
14181 dataTypeExpression = "*
";
14186 dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];
14188 if ( jQuery.isFunction( func ) ) {
14189 // For each dataType in the dataTypeExpression
14190 while ( (dataType = dataTypes[i++]) ) {
14191 // Prepend if requested
14192 if ( dataType[0] === "+
" ) {
14193 dataType = dataType.slice( 1 ) || "*
";
14194 (structure[ dataType ] = structure[ dataType ] || []).unshift( func );
14196 // Otherwise append
14198 (structure[ dataType ] = structure[ dataType ] || []).push( func );
14205 // Base inspection function for prefilters and transports
14206 function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
14208 var inspected = {},
14209 seekingTransport = ( structure === transports );
14211 function inspect( dataType ) {
14213 inspected[ dataType ] = true;
14214 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
14215 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
14216 if ( typeof dataTypeOrTransport === "string
" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
14217 options.dataTypes.unshift( dataTypeOrTransport );
14218 inspect( dataTypeOrTransport );
14220 } else if ( seekingTransport ) {
14221 return !( selected = dataTypeOrTransport );
14227 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*
" ] && inspect( "*
" );
14230 // A special extend for ajax options
14231 // that takes "flat
" options (not to be deep extended)
14233 function ajaxExtend( target, src ) {
14235 flatOptions = jQuery.ajaxSettings.flatOptions || {};
14237 for ( key in src ) {
14238 if ( src[ key ] !== undefined ) {
14239 ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
14243 jQuery.extend( true, target, deep );
14249 /* Handles responses to an ajax request:
14250 * - finds the right dataType (mediates between content-type and expected dataType)
14251 * - returns the corresponding response
14253 function ajaxHandleResponses( s, jqXHR, responses ) {
14255 var ct, type, finalDataType, firstDataType,
14256 contents = s.contents,
14257 dataTypes = s.dataTypes;
14259 // Remove auto dataType and get content-type in the process
14260 while ( dataTypes[ 0 ] === "*
" ) {
14262 if ( ct === undefined ) {
14263 ct = s.mimeType || jqXHR.getResponseHeader("Content-Type
");
14267 // Check if we're dealing with a known content-type
14269 for ( type in contents ) {
14270 if ( contents[ type ] && contents[ type ].test( ct ) ) {
14271 dataTypes.unshift( type );
14277 // Check to see if we have a response for the expected dataType
14278 if ( dataTypes[ 0 ] in responses ) {
14279 finalDataType = dataTypes[ 0 ];
14281 // Try convertible dataTypes
14282 for ( type in responses ) {
14283 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
14284 finalDataType = type;
14287 if ( !firstDataType ) {
14288 firstDataType = type;
14291 // Or just use first one
14292 finalDataType = finalDataType || firstDataType;
14295 // If we found a dataType
14296 // We add the dataType to the list if needed
14297 // and return the corresponding response
14298 if ( finalDataType ) {
14299 if ( finalDataType !== dataTypes[ 0 ] ) {
14300 dataTypes.unshift( finalDataType );
14302 return responses[ finalDataType ];
14306 /* Chain conversions given the request and the original response
14307 * Also sets the responseXXX fields on the jqXHR instance
14309 function ajaxConvert( s, response, jqXHR, isSuccess ) {
14310 var conv2, current, conv, tmp, prev,
14312 // Work with a copy of dataTypes in case we need to modify it for conversion
14313 dataTypes = s.dataTypes.slice();
14315 // Create converters map with lowercased keys
14316 if ( dataTypes[ 1 ] ) {
14317 for ( conv in s.converters ) {
14318 converters[ conv.toLowerCase() ] = s.converters[ conv ];
14322 current = dataTypes.shift();
14324 // Convert to each sequential dataType
14325 while ( current ) {
14327 if ( s.responseFields[ current ] ) {
14328 jqXHR[ s.responseFields[ current ] ] = response;
14331 // Apply the dataFilter if provided
14332 if ( !prev && isSuccess && s.dataFilter ) {
14333 response = s.dataFilter( response, s.dataType );
14337 current = dataTypes.shift();
14341 // There's only work to do if current dataType is non-auto
14342 if ( current === "*
" ) {
14346 // Convert response if prev dataType is non-auto and differs from current
14347 } else if ( prev !== "*
" && prev !== current ) {
14349 // Seek a direct converter
14350 conv = converters[ prev + " " + current ] || converters[ "*
" + current ];
14352 // If none found, seek a pair
14354 for ( conv2 in converters ) {
14356 // If conv2 outputs current
14357 tmp = conv2.split( " " );
14358 if ( tmp[ 1 ] === current ) {
14360 // If prev can be converted to accepted input
14361 conv = converters[ prev + " " + tmp[ 0 ] ] ||
14362 converters[ "*
" + tmp[ 0 ] ];
14364 // Condense equivalence converters
14365 if ( conv === true ) {
14366 conv = converters[ conv2 ];
14368 // Otherwise, insert the intermediate dataType
14369 } else if ( converters[ conv2 ] !== true ) {
14370 current = tmp[ 0 ];
14371 dataTypes.unshift( tmp[ 1 ] );
14379 // Apply converter (if not an equivalence)
14380 if ( conv !== true ) {
14382 // Unless errors are allowed to bubble, catch and return them
14383 if ( conv && s[ "throws
" ] ) {
14384 response = conv( response );
14387 response = conv( response );
14389 return { state: "parsererror
", error: conv ? e : "No conversion from
" + prev + " to
" + current };
14397 return { state: "success
", data: response };
14402 // Counter for holding the number of active queries
14405 // Last-Modified header cache for next request
14412 isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
14416 contentType: "application/x-www-form-urlencoded; charset=UTF-
8",
14425 traditional: false,
14431 text: "text/plain
",
14433 xml: "application/xml, text/xml
",
14434 json: "application/json, text/javascript
"
14444 xml: "responseXML
",
14445 text: "responseText
",
14446 json: "responseJSON
"
14450 // Keys separate source (or catchall "*
") and destination types with a single space
14453 // Convert anything to text
14456 // Text to html (true = no transformation)
14459 // Evaluate text as a json expression
14460 "text json
": jQuery.parseJSON,
14462 // Parse text as xml
14463 "text xml
": jQuery.parseXML
14466 // For options that shouldn't be deep extended:
14467 // you can add your own custom options here if
14468 // and when you create one that shouldn't be
14469 // deep extended (see ajaxExtend)
14476 // Creates a full fledged settings object into target
14477 // with both ajaxSettings and settings fields.
14478 // If target is omitted, writes into ajaxSettings.
14479 ajaxSetup: function( target, settings ) {
14482 // Building a settings object
14483 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
14485 // Extending ajaxSettings
14486 ajaxExtend( jQuery.ajaxSettings, target );
14489 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
14490 ajaxTransport: addToPrefiltersOrTransports( transports ),
14493 ajax: function( url, options ) {
14495 // If url is an object, simulate pre-1.5 signature
14496 if ( typeof url === "object
" ) {
14501 // Force options to be an object
14502 options = options || {};
14505 // URL without anti-cache param
14507 // Response headers
14508 responseHeadersString,
14512 // Cross-domain detection vars
14514 // To know if global events are to be dispatched
14518 // Create the final options object
14519 s = jQuery.ajaxSetup( {}, options ),
14520 // Callbacks context
14521 callbackContext = s.context || s,
14522 // Context for global events is callbackContext if it is a DOM node or jQuery collection
14523 globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
14524 jQuery( callbackContext ) :
14527 deferred = jQuery.Deferred(),
14528 completeDeferred = jQuery.Callbacks("once memory
"),
14529 // Status-dependent callbacks
14530 statusCode = s.statusCode || {},
14531 // Headers (they are sent all at once)
14532 requestHeaders = {},
14533 requestHeadersNames = {},
14536 // Default abort message
14537 strAbort = "canceled
",
14542 // Builds headers hashtable if needed
14543 getResponseHeader: function( key ) {
14545 if ( state === 2 ) {
14546 if ( !responseHeaders ) {
14547 responseHeaders = {};
14548 while ( (match = rheaders.exec( responseHeadersString )) ) {
14549 responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
14552 match = responseHeaders[ key.toLowerCase() ];
14554 return match == null ? null : match;
14558 getAllResponseHeaders: function() {
14559 return state === 2 ? responseHeadersString : null;
14562 // Caches the header
14563 setRequestHeader: function( name, value ) {
14564 var lname = name.toLowerCase();
14566 name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
14567 requestHeaders[ name ] = value;
14572 // Overrides response content-type header
14573 overrideMimeType: function( type ) {
14580 // Status-dependent callbacks
14581 statusCode: function( map ) {
14585 for ( code in map ) {
14586 // Lazy-add the new callback in a way that preserves old ones
14587 statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
14590 // Execute the appropriate callbacks
14591 jqXHR.always( map[ jqXHR.status ] );
14597 // Cancel the request
14598 abort: function( statusText ) {
14599 var finalText = statusText || strAbort;
14601 transport.abort( finalText );
14603 done( 0, finalText );
14608 // Attach deferreds
14609 deferred.promise( jqXHR ).complete = completeDeferred.add;
14610 jqXHR.success = jqXHR.done;
14611 jqXHR.error = jqXHR.fail;
14613 // Remove hash character (#7531: and string promotion)
14614 // Add protocol if not provided (prefilters might expect it)
14615 // Handle falsy url in the settings object (#10093: consistency with old signature)
14616 // We also use the url parameter if available
14617 s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )
14618 .replace( rprotocol, ajaxLocParts[ 1 ] + "//
" );
14620 // Alias method option to type as per ticket #12004
14621 s.type = options.method || options.type || s.method || s.type;
14623 // Extract dataTypes list
14624 s.dataTypes = jQuery.trim( s.dataType || "*
" ).toLowerCase().match( rnotwhite ) || [ "" ];
14626 // A cross-domain request is in order when we have a protocol:host:port mismatch
14627 if ( s.crossDomain == null ) {
14628 parts = rurl.exec( s.url.toLowerCase() );
14629 s.crossDomain = !!( parts &&
14630 ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
14631 ( parts[ 3 ] || ( parts[ 1 ] === "http:
" ? "80" : "443" ) ) !==
14632 ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:
" ? "80" : "443" ) ) )
14636 // Convert data if not already a string
14637 if ( s.data && s.processData && typeof s.data !== "string
" ) {
14638 s.data = jQuery.param( s.data, s.traditional );
14641 // Apply prefilters
14642 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
14644 // If request was aborted inside a prefilter, stop there
14645 if ( state === 2 ) {
14649 // We can fire global events as of now if asked to
14650 fireGlobals = s.global;
14652 // Watch for a new set of requests
14653 if ( fireGlobals && jQuery.active++ === 0 ) {
14654 jQuery.event.trigger("ajaxStart
");
14657 // Uppercase the type
14658 s.type = s.type.toUpperCase();
14660 // Determine if request has content
14661 s.hasContent = !rnoContent.test( s.type );
14663 // Save the URL in case we're toying with the If-Modified-Since
14664 // and/or If-None-Match header later on
14667 // More options handling for requests with no content
14668 if ( !s.hasContent ) {
14670 // If data is available, append data to url
14672 cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&
" : "?
" ) + s.data );
14673 // #9682: remove data so that it's not used in an eventual retry
14677 // Add anti-cache in url if needed
14678 if ( s.cache === false ) {
14679 s.url = rts.test( cacheURL ) ?
14681 // If there is already a '_' parameter, set its value
14682 cacheURL.replace( rts, "$
1_=
" + nonce++ ) :
14684 // Otherwise add one to the end
14685 cacheURL + ( rquery.test( cacheURL ) ? "&
" : "?
" ) + "_=
" + nonce++;
14689 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
14690 if ( s.ifModified ) {
14691 if ( jQuery.lastModified[ cacheURL ] ) {
14692 jqXHR.setRequestHeader( "If-Modified-Since
", jQuery.lastModified[ cacheURL ] );
14694 if ( jQuery.etag[ cacheURL ] ) {
14695 jqXHR.setRequestHeader( "If-None-Match
", jQuery.etag[ cacheURL ] );
14699 // Set the correct header, if data is being sent
14700 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
14701 jqXHR.setRequestHeader( "Content-Type
", s.contentType );
14704 // Set the Accepts header for the server, depending on the dataType
14705 jqXHR.setRequestHeader(
14707 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
14708 s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*
" ? ",
" + allTypes + "; q=
0.01" : "" ) :
14712 // Check for headers option
14713 for ( i in s.headers ) {
14714 jqXHR.setRequestHeader( i, s.headers[ i ] );
14717 // Allow custom headers/mimetypes and early abort
14718 if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
14719 // Abort if not done already and return
14720 return jqXHR.abort();
14723 // aborting is no longer a cancellation
14724 strAbort = "abort
";
14726 // Install callbacks on deferreds
14727 for ( i in { success: 1, error: 1, complete: 1 } ) {
14728 jqXHR[ i ]( s[ i ] );
14732 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
14734 // If no transport, we auto-abort
14735 if ( !transport ) {
14736 done( -1, "No Transport
" );
14738 jqXHR.readyState = 1;
14740 // Send global event
14741 if ( fireGlobals ) {
14742 globalEventContext.trigger( "ajaxSend
", [ jqXHR, s ] );
14745 if ( s.async && s.timeout > 0 ) {
14746 timeoutTimer = setTimeout(function() {
14747 jqXHR.abort("timeout
");
14753 transport.send( requestHeaders, done );
14755 // Propagate exception as error if not done
14758 // Simply rethrow otherwise
14765 // Callback for when everything is done
14766 function done( status, nativeStatusText, responses, headers ) {
14767 var isSuccess, success, error, response, modified,
14768 statusText = nativeStatusText;
14771 if ( state === 2 ) {
14775 // State is "done
" now
14778 // Clear timeout if it exists
14779 if ( timeoutTimer ) {
14780 clearTimeout( timeoutTimer );
14783 // Dereference transport for early garbage collection
14784 // (no matter how long the jqXHR object will be used)
14785 transport = undefined;
14787 // Cache response headers
14788 responseHeadersString = headers || "";
14791 jqXHR.readyState = status > 0 ? 4 : 0;
14793 // Determine if successful
14794 isSuccess = status >= 200 && status < 300 || status === 304;
14796 // Get response data
14798 response = ajaxHandleResponses( s, jqXHR, responses );
14801 // Convert no matter what (that way responseXXX fields are always set)
14802 response = ajaxConvert( s, response, jqXHR, isSuccess );
14804 // If successful, handle type chaining
14807 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
14808 if ( s.ifModified ) {
14809 modified = jqXHR.getResponseHeader("Last-Modified
");
14811 jQuery.lastModified[ cacheURL ] = modified;
14813 modified = jqXHR.getResponseHeader("etag
");
14815 jQuery.etag[ cacheURL ] = modified;
14820 if ( status === 204 || s.type === "HEAD
" ) {
14821 statusText = "nocontent
";
14824 } else if ( status === 304 ) {
14825 statusText = "notmodified
";
14827 // If we have data, let's convert it
14829 statusText = response.state;
14830 success = response.data;
14831 error = response.error;
14832 isSuccess = !error;
14835 // We extract error from statusText
14836 // then normalize statusText and status for non-aborts
14837 error = statusText;
14838 if ( status || !statusText ) {
14839 statusText = "error
";
14840 if ( status < 0 ) {
14846 // Set data for the fake xhr object
14847 jqXHR.status = status;
14848 jqXHR.statusText = ( nativeStatusText || statusText ) + "";
14852 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
14854 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
14857 // Status-dependent callbacks
14858 jqXHR.statusCode( statusCode );
14859 statusCode = undefined;
14861 if ( fireGlobals ) {
14862 globalEventContext.trigger( isSuccess ? "ajaxSuccess
" : "ajaxError
",
14863 [ jqXHR, s, isSuccess ? success : error ] );
14867 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
14869 if ( fireGlobals ) {
14870 globalEventContext.trigger( "ajaxComplete
", [ jqXHR, s ] );
14871 // Handle the global AJAX counter
14872 if ( !( --jQuery.active ) ) {
14873 jQuery.event.trigger("ajaxStop
");
14881 getJSON: function( url, data, callback ) {
14882 return jQuery.get( url, data, callback, "json
" );
14885 getScript: function( url, callback ) {
14886 return jQuery.get( url, undefined, callback, "script
" );
14890 jQuery.each( [ "get
", "post
" ], function( i, method ) {
14891 jQuery[ method ] = function( url, data, callback, type ) {
14892 // shift arguments if data argument was omitted
14893 if ( jQuery.isFunction( data ) ) {
14894 type = type || callback;
14899 return jQuery.ajax({
14909 // Attach a bunch of functions for handling common AJAX events
14910 jQuery.each( [ "ajaxStart
", "ajaxStop
", "ajaxComplete
", "ajaxError
", "ajaxSuccess
", "ajaxSend
" ], function( i, type ) {
14911 jQuery.fn[ type ] = function( fn ) {
14912 return this.on( type, fn );
14917 jQuery._evalUrl = function( url ) {
14918 return jQuery.ajax({
14921 dataType: "script
",
14930 wrapAll: function( html ) {
14933 if ( jQuery.isFunction( html ) ) {
14934 return this.each(function( i ) {
14935 jQuery( this ).wrapAll( html.call(this, i) );
14941 // The elements to wrap the target around
14942 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );
14944 if ( this[ 0 ].parentNode ) {
14945 wrap.insertBefore( this[ 0 ] );
14948 wrap.map(function() {
14951 while ( elem.firstElementChild ) {
14952 elem = elem.firstElementChild;
14962 wrapInner: function( html ) {
14963 if ( jQuery.isFunction( html ) ) {
14964 return this.each(function( i ) {
14965 jQuery( this ).wrapInner( html.call(this, i) );
14969 return this.each(function() {
14970 var self = jQuery( this ),
14971 contents = self.contents();
14973 if ( contents.length ) {
14974 contents.wrapAll( html );
14977 self.append( html );
14982 wrap: function( html ) {
14983 var isFunction = jQuery.isFunction( html );
14985 return this.each(function( i ) {
14986 jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
14990 unwrap: function() {
14991 return this.parent().each(function() {
14992 if ( !jQuery.nodeName( this, "body
" ) ) {
14993 jQuery( this ).replaceWith( this.childNodes );
15000 jQuery.expr.filters.hidden = function( elem ) {
15001 // Support: Opera <= 12.12
15002 // Opera reports offsetWidths and offsetHeights less than zero on some elements
15003 return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;
15005 jQuery.expr.filters.visible = function( elem ) {
15006 return !jQuery.expr.filters.hidden( elem );
15013 rbracket = /\[\]$/,
15015 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
15016 rsubmittable = /^(?:input|select|textarea|keygen)/i;
15018 function buildParams( prefix, obj, traditional, add ) {
15021 if ( jQuery.isArray( obj ) ) {
15022 // Serialize array item.
15023 jQuery.each( obj, function( i, v ) {
15024 if ( traditional || rbracket.test( prefix ) ) {
15025 // Treat each array item as a scalar.
15029 // Item is non-scalar (array or object), encode its numeric index.
15030 buildParams( prefix + "[
" + ( typeof v === "object
" ? i : "" ) + "]
", v, traditional, add );
15034 } else if ( !traditional && jQuery.type( obj ) === "object
" ) {
15035 // Serialize object item.
15036 for ( name in obj ) {
15037 buildParams( prefix + "[
" + name + "]
", obj[ name ], traditional, add );
15041 // Serialize scalar item.
15042 add( prefix, obj );
15046 // Serialize an array of form elements or a set of
15047 // key/values into a query string
15048 jQuery.param = function( a, traditional ) {
15051 add = function( key, value ) {
15052 // If value is a function, invoke it and return its value
15053 value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
15054 s[ s.length ] = encodeURIComponent( key ) + "=
" + encodeURIComponent( value );
15057 // Set traditional to true for jQuery <= 1.3.2 behavior.
15058 if ( traditional === undefined ) {
15059 traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
15062 // If an array was passed in, assume that it is an array of form elements.
15063 if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
15064 // Serialize the form elements
15065 jQuery.each( a, function() {
15066 add( this.name, this.value );
15070 // If traditional, encode the "old
" way (the way 1.3.2 or older
15071 // did it), otherwise encode params recursively.
15072 for ( prefix in a ) {
15073 buildParams( prefix, a[ prefix ], traditional, add );
15077 // Return the resulting serialization
15078 return s.join( "&
" ).replace( r20, "+
" );
15082 serialize: function() {
15083 return jQuery.param( this.serializeArray() );
15085 serializeArray: function() {
15086 return this.map(function() {
15087 // Can add propHook for "elements
" to filter or add form elements
15088 var elements = jQuery.prop( this, "elements
" );
15089 return elements ? jQuery.makeArray( elements ) : this;
15091 .filter(function() {
15092 var type = this.type;
15094 // Use .is( ":disabled
" ) so that fieldset[disabled] works
15095 return this.name && !jQuery( this ).is( ":disabled
" ) &&
15096 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
15097 ( this.checked || !rcheckableType.test( type ) );
15099 .map(function( i, elem ) {
15100 var val = jQuery( this ).val();
15102 return val == null ?
15104 jQuery.isArray( val ) ?
15105 jQuery.map( val, function( val ) {
15106 return { name: elem.name, value: val.replace( rCRLF, "\r\n
" ) };
15108 { name: elem.name, value: val.replace( rCRLF, "\r\n
" ) };
15114 jQuery.ajaxSettings.xhr = function() {
15116 return new XMLHttpRequest();
15122 xhrSuccessStatus = {
15123 // file protocol always yields status code 0, assume 200
15126 // #1450: sometimes IE returns 1223 when it should be 204
15129 xhrSupported = jQuery.ajaxSettings.xhr();
15132 // Open requests must be manually aborted on unload (#5280)
15133 if ( window.ActiveXObject ) {
15134 jQuery( window ).on( "unload
", function() {
15135 for ( var key in xhrCallbacks ) {
15136 xhrCallbacks[ key ]();
15141 support.cors = !!xhrSupported && ( "withCredentials
" in xhrSupported );
15142 support.ajax = xhrSupported = !!xhrSupported;
15144 jQuery.ajaxTransport(function( options ) {
15147 // Cross domain only allowed if supported through XMLHttpRequest
15148 if ( support.cors || xhrSupported && !options.crossDomain ) {
15150 send: function( headers, complete ) {
15152 xhr = options.xhr(),
15155 xhr.open( options.type, options.url, options.async, options.username, options.password );
15157 // Apply custom fields if provided
15158 if ( options.xhrFields ) {
15159 for ( i in options.xhrFields ) {
15160 xhr[ i ] = options.xhrFields[ i ];
15164 // Override mime type if needed
15165 if ( options.mimeType && xhr.overrideMimeType ) {
15166 xhr.overrideMimeType( options.mimeType );
15169 // X-Requested-With header
15170 // For cross-domain requests, seeing as conditions for a preflight are
15171 // akin to a jigsaw puzzle, we simply never set it to be sure.
15172 // (it can always be set on a per-request basis or even using ajaxSetup)
15173 // For same-domain requests, won't change header if already provided.
15174 if ( !options.crossDomain && !headers["X-Requested-With
"] ) {
15175 headers["X-Requested-With
"] = "XMLHttpRequest
";
15179 for ( i in headers ) {
15180 xhr.setRequestHeader( i, headers[ i ] );
15184 callback = function( type ) {
15185 return function() {
15187 delete xhrCallbacks[ id ];
15188 callback = xhr.onload = xhr.onerror = null;
15190 if ( type === "abort
" ) {
15192 } else if ( type === "error
" ) {
15194 // file: protocol always yields status 0; see #8605, #14207
15200 xhrSuccessStatus[ xhr.status ] || xhr.status,
15203 // Accessing binary-data responseText throws an exception
15205 typeof xhr.responseText === "string
" ? {
15206 text: xhr.responseText
15208 xhr.getAllResponseHeaders()
15215 // Listen to events
15216 xhr.onload = callback();
15217 xhr.onerror = callback("error
");
15219 // Create the abort callback
15220 callback = xhrCallbacks[ id ] = callback("abort
");
15223 // Do send the request (this may raise an exception)
15224 xhr.send( options.hasContent && options.data || null );
15226 // #14683: Only rethrow if this hasn't been notified as an error yet
15233 abort: function() {
15245 // Install script dataType
15248 script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript
"
15251 script: /(?:java|ecma)script/
15254 "text script
": function( text ) {
15255 jQuery.globalEval( text );
15261 // Handle cache's special case and crossDomain
15262 jQuery.ajaxPrefilter( "script
", function( s ) {
15263 if ( s.cache === undefined ) {
15266 if ( s.crossDomain ) {
15271 // Bind script tag hack transport
15272 jQuery.ajaxTransport( "script
", function( s ) {
15273 // This transport only deals with cross domain requests
15274 if ( s.crossDomain ) {
15275 var script, callback;
15277 send: function( _, complete ) {
15278 script = jQuery("<script>").prop({
15280 charset: s.scriptCharset,
15284 callback = function( evt ) {
15288 complete( evt.type === "error
" ? 404 : 200, evt.type );
15292 document.head.appendChild( script[ 0 ] );
15294 abort: function() {
15306 var oldCallbacks = [],
15307 rjsonp = /(=)\?(?=&|$)|\?\?/;
15309 // Default jsonp settings
15312 jsonpCallback: function() {
15313 var callback = oldCallbacks.pop() || ( jQuery.expando + "_
" + ( nonce++ ) );
15314 this[ callback ] = true;
15319 // Detect, normalize options and install callbacks for jsonp requests
15320 jQuery.ajaxPrefilter( "json jsonp
", function( s, originalSettings, jqXHR ) {
15322 var callbackName, overwritten, responseContainer,
15323 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
15325 typeof s.data === "string
" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded
") && rjsonp.test( s.data ) && "data
"
15328 // Handle iff the expected data type is "jsonp
" or we have a parameter to set
15329 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp
" ) {
15331 // Get callback name, remembering preexisting value associated with it
15332 callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
15333 s.jsonpCallback() :
15336 // Insert callback into url or form data
15338 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$
1" + callbackName );
15339 } else if ( s.jsonp !== false ) {
15340 s.url += ( rquery.test( s.url ) ? "&
" : "?
" ) + s.jsonp + "=
" + callbackName;
15343 // Use data converter to retrieve json after script execution
15344 s.converters["script json
"] = function() {
15345 if ( !responseContainer ) {
15346 jQuery.error( callbackName + " was not called
" );
15348 return responseContainer[ 0 ];
15351 // force json dataType
15352 s.dataTypes[ 0 ] = "json
";
15354 // Install callback
15355 overwritten = window[ callbackName ];
15356 window[ callbackName ] = function() {
15357 responseContainer = arguments;
15360 // Clean-up function (fires after converters)
15361 jqXHR.always(function() {
15362 // Restore preexisting value
15363 window[ callbackName ] = overwritten;
15365 // Save back as free
15366 if ( s[ callbackName ] ) {
15367 // make sure that re-using the options doesn't screw things around
15368 s.jsonpCallback = originalSettings.jsonpCallback;
15370 // save the callback name for future use
15371 oldCallbacks.push( callbackName );
15374 // Call if it was a function and we have a response
15375 if ( responseContainer && jQuery.isFunction( overwritten ) ) {
15376 overwritten( responseContainer[ 0 ] );
15379 responseContainer = overwritten = undefined;
15382 // Delegate to script
15390 // data: string of html
15391 // context (optional): If specified, the fragment will be created in this context, defaults to document
15392 // keepScripts (optional): If true, will include scripts passed in the html string
15393 jQuery.parseHTML = function( data, context, keepScripts ) {
15394 if ( !data || typeof data !== "string
" ) {
15397 if ( typeof context === "boolean
" ) {
15398 keepScripts = context;
15401 context = context || document;
15403 var parsed = rsingleTag.exec( data ),
15404 scripts = !keepScripts && [];
15408 return [ context.createElement( parsed[1] ) ];
15411 parsed = jQuery.buildFragment( [ data ], context, scripts );
15413 if ( scripts && scripts.length ) {
15414 jQuery( scripts ).remove();
15417 return jQuery.merge( [], parsed.childNodes );
15421 // Keep a copy of the old load method
15422 var _load = jQuery.fn.load;
15425 * Load a url into a page
15427 jQuery.fn.load = function( url, params, callback ) {
15428 if ( typeof url !== "string
" && _load ) {
15429 return _load.apply( this, arguments );
15432 var selector, type, response,
15434 off = url.indexOf(" ");
15437 selector = jQuery.trim( url.slice( off ) );
15438 url = url.slice( 0, off );
15441 // If it's a function
15442 if ( jQuery.isFunction( params ) ) {
15444 // We assume that it's the callback
15446 params = undefined;
15448 // Otherwise, build a param string
15449 } else if ( params && typeof params === "object
" ) {
15453 // If we have elements to modify, make the request
15454 if ( self.length > 0 ) {
15458 // if "type
" variable is undefined, then "GET
" method will be used
15462 }).done(function( responseText ) {
15464 // Save response for use in complete callback
15465 response = arguments;
15467 self.html( selector ?
15469 // If a selector was specified, locate the right elements in a dummy div
15470 // Exclude scripts to avoid IE 'Permission Denied' errors
15471 jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
15473 // Otherwise use the full result
15476 }).complete( callback && function( jqXHR, status ) {
15477 self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
15487 jQuery.expr.filters.animated = function( elem ) {
15488 return jQuery.grep(jQuery.timers, function( fn ) {
15489 return elem === fn.elem;
15496 var docElem = window.document.documentElement;
15499 * Gets a window from an element
15501 function getWindow( elem ) {
15502 return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
15506 setOffset: function( elem, options, i ) {
15507 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
15508 position = jQuery.css( elem, "position
" ),
15509 curElem = jQuery( elem ),
15512 // Set position first, in-case top/left are set even on static elem
15513 if ( position === "static
" ) {
15514 elem.style.position = "relative
";
15517 curOffset = curElem.offset();
15518 curCSSTop = jQuery.css( elem, "top
" );
15519 curCSSLeft = jQuery.css( elem, "left
" );
15520 calculatePosition = ( position === "absolute
" || position === "fixed
" ) &&
15521 ( curCSSTop + curCSSLeft ).indexOf("auto
") > -1;
15523 // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed
15524 if ( calculatePosition ) {
15525 curPosition = curElem.position();
15526 curTop = curPosition.top;
15527 curLeft = curPosition.left;
15530 curTop = parseFloat( curCSSTop ) || 0;
15531 curLeft = parseFloat( curCSSLeft ) || 0;
15534 if ( jQuery.isFunction( options ) ) {
15535 options = options.call( elem, i, curOffset );
15538 if ( options.top != null ) {
15539 props.top = ( options.top - curOffset.top ) + curTop;
15541 if ( options.left != null ) {
15542 props.left = ( options.left - curOffset.left ) + curLeft;
15545 if ( "using
" in options ) {
15546 options.using.call( elem, props );
15549 curElem.css( props );
15555 offset: function( options ) {
15556 if ( arguments.length ) {
15557 return options === undefined ?
15559 this.each(function( i ) {
15560 jQuery.offset.setOffset( this, options, i );
15566 box = { top: 0, left: 0 },
15567 doc = elem && elem.ownerDocument;
15573 docElem = doc.documentElement;
15575 // Make sure it's not a disconnected DOM node
15576 if ( !jQuery.contains( docElem, elem ) ) {
15580 // If we don't have gBCR, just use 0,0 rather than error
15581 // BlackBerry 5, iOS 3 (original iPhone)
15582 if ( typeof elem.getBoundingClientRect !== strundefined ) {
15583 box = elem.getBoundingClientRect();
15585 win = getWindow( doc );
15587 top: box.top + win.pageYOffset - docElem.clientTop,
15588 left: box.left + win.pageXOffset - docElem.clientLeft
15592 position: function() {
15593 if ( !this[ 0 ] ) {
15597 var offsetParent, offset,
15599 parentOffset = { top: 0, left: 0 };
15601 // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent
15602 if ( jQuery.css( elem, "position
" ) === "fixed
" ) {
15603 // We assume that getBoundingClientRect is available when computed position is fixed
15604 offset = elem.getBoundingClientRect();
15607 // Get *real* offsetParent
15608 offsetParent = this.offsetParent();
15610 // Get correct offsets
15611 offset = this.offset();
15612 if ( !jQuery.nodeName( offsetParent[ 0 ], "html
" ) ) {
15613 parentOffset = offsetParent.offset();
15616 // Add offsetParent borders
15617 parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth
", true );
15618 parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth
", true );
15621 // Subtract parent offsets and element margins
15623 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop
", true ),
15624 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft
", true )
15628 offsetParent: function() {
15629 return this.map(function() {
15630 var offsetParent = this.offsetParent || docElem;
15632 while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html
" ) && jQuery.css( offsetParent, "position
" ) === "static
" ) ) {
15633 offsetParent = offsetParent.offsetParent;
15636 return offsetParent || docElem;
15641 // Create scrollLeft and scrollTop methods
15642 jQuery.each( { scrollLeft: "pageXOffset
", scrollTop: "pageYOffset
" }, function( method, prop ) {
15643 var top = "pageYOffset
" === prop;
15645 jQuery.fn[ method ] = function( val ) {
15646 return access( this, function( elem, method, val ) {
15647 var win = getWindow( elem );
15649 if ( val === undefined ) {
15650 return win ? win[ prop ] : elem[ method ];
15655 !top ? val : window.pageXOffset,
15656 top ? val : window.pageYOffset
15660 elem[ method ] = val;
15662 }, method, val, arguments.length, null );
15666 // Add the top/left cssHooks using jQuery.fn.position
15667 // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
15668 // getComputedStyle returns percent when specified for top/left/bottom/right
15669 // rather than make the css module depend on the offset module, we just check for it here
15670 jQuery.each( [ "top
", "left
" ], function( i, prop ) {
15671 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
15672 function( elem, computed ) {
15674 computed = curCSS( elem, prop );
15675 // if curCSS returns percentage, fallback to offset
15676 return rnumnonpx.test( computed ) ?
15677 jQuery( elem ).position()[ prop ] + "px
" :
15685 // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
15686 jQuery.each( { Height: "height
", Width: "width
" }, function( name, type ) {
15687 jQuery.each( { padding: "inner
" + name, content: type, "": "outer
" + name }, function( defaultExtra, funcName ) {
15688 // margin is only for outerHeight, outerWidth
15689 jQuery.fn[ funcName ] = function( margin, value ) {
15690 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean
" ),
15691 extra = defaultExtra || ( margin === true || value === true ? "margin
" : "border
" );
15693 return access( this, function( elem, type, value ) {
15696 if ( jQuery.isWindow( elem ) ) {
15697 // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
15698 // isn't a whole lot we can do. See pull request at this URL for discussion:
15699 // https://github.com/jquery/jquery/pull/764
15700 return elem.document.documentElement[ "client
" + name ];
15703 // Get document width or height
15704 if ( elem.nodeType === 9 ) {
15705 doc = elem.documentElement;
15707 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
15708 // whichever is greatest
15710 elem.body[ "scroll
" + name ], doc[ "scroll
" + name ],
15711 elem.body[ "offset
" + name ], doc[ "offset
" + name ],
15712 doc[ "client
" + name ]
15716 return value === undefined ?
15717 // Get width or height on the element, requesting but not forcing parseFloat
15718 jQuery.css( elem, type, extra ) :
15720 // Set width or height on the element
15721 jQuery.style( elem, type, value, extra );
15722 }, type, chainable ? margin : undefined, chainable, null );
15728 // The number of elements contained in the matched element set
15729 jQuery.fn.size = function() {
15730 return this.length;
15733 jQuery.fn.andSelf = jQuery.fn.addBack;
15738 // Register as a named AMD module, since jQuery can be concatenated with other
15739 // files that may use define, but not via a proper concatenation script that
15740 // understands anonymous AMD modules. A named AMD is safest and most robust
15741 // way to register. Lowercase jquery is used because AMD module names are
15742 // derived from file names, and jQuery is normally delivered in a lowercase
15743 // file name. Do this after creating the global so that if an AMD module wants
15744 // to call noConflict to hide this version of jQuery, it will work.
15746 // Note that for maximum portability, libraries that are not jQuery should
15747 // declare themselves as anonymous modules, and avoid setting a global if an
15748 // AMD loader is present. jQuery is a special case. For more information, see
15749 // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
15751 if ( typeof define === "function
" && define.amd ) {
15752 define( "jquery
", [], function() {
15761 // Map over jQuery in case of overwrite
15762 _jQuery = window.jQuery,
15764 // Map over the $ in case of overwrite
15767 jQuery.noConflict = function( deep ) {
15768 if ( window.$ === jQuery ) {
15772 if ( deep && window.jQuery === jQuery ) {
15773 window.jQuery = _jQuery;
15779 // Expose jQuery and $ identifiers, even in
15780 // AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
15781 // and CommonJS for browser emulators (#13566)
15782 if ( typeof noGlobal === strundefined ) {
15783 window.jQuery = window.$ = jQuery;
15795 * Bootstrap v3.2.0 (http://getbootstrap.com)
15796 * Copyright 2011-2014 Twitter, Inc.
15797 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15800 if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }
15802 /* ========================================================================
15803 * Bootstrap: transition.js v3.2.0
15804 * http://getbootstrap.com/javascript/#transitions
15805 * ========================================================================
15806 * Copyright 2011-2014 Twitter, Inc.
15807 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15808 * ======================================================================== */
15814 // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
15815 // ============================================================
15817 function transitionEnd() {
15818 var el = document.createElement('bootstrap')
15820 var transEndEventNames = {
15821 WebkitTransition : 'webkitTransitionEnd',
15822 MozTransition : 'transitionend',
15823 OTransition : 'oTransitionEnd otransitionend',
15824 transition : 'transitionend'
15827 for (var name in transEndEventNames) {
15828 if (el.style[name] !== undefined) {
15829 return { end: transEndEventNames[name] }
15833 return false // explicit for ie8 ( ._.)
15836 // http://blog.alexmaccaw.com/css-transitions
15837 $.fn.emulateTransitionEnd = function (duration) {
15840 $(this).one('bsTransitionEnd', function () { called = true })
15841 var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
15842 setTimeout(callback, duration)
15847 $.support.transition = transitionEnd()
15849 if (!$.support.transition) return
15851 $.event.special.bsTransitionEnd = {
15852 bindType: $.support.transition.end,
15853 delegateType: $.support.transition.end,
15854 handle: function (e) {
15855 if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
15862 /* ========================================================================
15863 * Bootstrap: alert.js v3.2.0
15864 * http://getbootstrap.com/javascript/#alerts
15865 * ========================================================================
15866 * Copyright 2011-2014 Twitter, Inc.
15867 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15868 * ======================================================================== */
15874 // ALERT CLASS DEFINITION
15875 // ======================
15877 var dismiss = '[data-dismiss="alert"]'
15878 var Alert = function (el) {
15879 $(el).on('click', dismiss, this.close)
15882 Alert.VERSION = '
3.2.0'
15884 Alert.prototype.close = function (e) {
15885 var $this = $(this)
15886 var selector = $this.attr('data-target')
15889 selector = $this.attr('href')
15890 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
15893 var $parent = $(selector)
15895 if (e) e.preventDefault()
15897 if (!$parent.length) {
15898 $parent = $this.hasClass('alert') ? $this : $this.parent()
15901 $parent.trigger(e = $.Event('close.bs.alert'))
15903 if (e.isDefaultPrevented()) return
15905 $parent.removeClass('in')
15907 function removeElement() {
15908 // detach from parent, fire event then clean up data
15909 $parent.detach().trigger('closed.bs.alert').remove()
15912 $.support.transition && $parent.hasClass('fade') ?
15914 .one('bsTransitionEnd', removeElement)
15915 .emulateTransitionEnd(
150) :
15920 // ALERT PLUGIN DEFINITION
15921 // =======================
15923 function Plugin(option) {
15924 return this.each(function () {
15925 var $this = $(this)
15926 var data = $this.data('bs.alert')
15928 if (!data) $this.data('bs.alert', (data = new Alert(this)))
15929 if (typeof option == 'string') data[option].call($this)
15933 var old = $.fn.alert
15935 $.fn.alert = Plugin
15936 $.fn.alert.Constructor = Alert
15939 // ALERT NO CONFLICT
15940 // =================
15942 $.fn.alert.noConflict = function () {
15951 $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
15955 /* ========================================================================
15956 * Bootstrap: button.js v3.2
.0
15957 * http://getbootstrap.com/javascript/#buttons
15958 * ========================================================================
15959 * Copyright
2011-
2014 Twitter, Inc.
15960 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
15961 * ======================================================================== */
15967 // BUTTON PUBLIC CLASS DEFINITION
15968 // ==============================
15970 var Button = function (element, options) {
15971 this.$element = $(element)
15972 this.options = $.extend({}, Button.DEFAULTS, options)
15973 this.isLoading = false
15976 Button.VERSION = '
3.2.0'
15978 Button.DEFAULTS = {
15979 loadingText: 'loading...'
15982 Button.prototype.setState = function (state) {
15984 var $el = this.$element
15985 var val = $el.is('input') ? 'val' : 'html'
15986 var data = $el.data()
15988 state = state + 'Text'
15990 if (data.resetText == null) $el.data('resetText', $el[val]())
15992 $el[val](data[state] == null ? this.options[state] : data[state])
15994 // push to event loop to allow forms to submit
15995 setTimeout($.proxy(function () {
15996 if (state == 'loadingText') {
15997 this.isLoading = true
15998 $el.addClass(d).attr(d, d)
15999 } else if (this.isLoading) {
16000 this.isLoading = false
16001 $el.removeClass(d).removeAttr(d)
16006 Button.prototype.toggle = function () {
16008 var $parent = this.$element.closest('[
data-toggle="buttons"]')
16010 if ($parent.length) {
16011 var $input = this.$element.find('input')
16012 if ($input.prop('type') == 'radio') {
16013 if ($input.prop('checked') && this.$element.hasClass('active')) changed = false
16014 else $parent.find('.active').removeClass('active')
16016 if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')
16019 if (changed) this.$element.toggleClass('active')
16023 // BUTTON PLUGIN DEFINITION
16024 // ========================
16026 function Plugin(option) {
16027 return this.each(function () {
16028 var $this = $(this)
16029 var data = $this.data('bs.button')
16030 var options = typeof option == 'object' && option
16032 if (!data) $this.data('bs.button', (data = new Button(this, options)))
16034 if (option == 'toggle') data.toggle()
16035 else if (option) data.setState(option)
16039 var old = $.fn.button
16041 $.fn.button = Plugin
16042 $.fn.button.Constructor = Button
16045 // BUTTON NO CONFLICT
16046 // ==================
16048 $.fn.button.noConflict = function () {
16057 $(document).on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
16058 var $btn = $(e.target)
16059 if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
16060 Plugin.call($btn, 'toggle')
16066 /* ========================================================================
16067 * Bootstrap: carousel.js v3.2
.0
16068 * http://getbootstrap.com/javascript/#carousel
16069 * ========================================================================
16070 * Copyright
2011-
2014 Twitter, Inc.
16071 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16072 * ======================================================================== */
16078 // CAROUSEL CLASS DEFINITION
16079 // =========================
16081 var Carousel = function (element, options) {
16082 this.$element = $(element).on('keydown.bs.carousel', $.proxy(this.keydown, this))
16083 this.$indicators = this.$element.find('.carousel-indicators')
16084 this.options = options
16091 this.options.pause == 'hover' && this.$element
16092 .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
16093 .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
16096 Carousel.VERSION = '
3.2.0'
16098 Carousel.DEFAULTS = {
16104 Carousel.prototype.keydown = function (e) {
16106 case
37: this.prev(); break
16107 case
39: this.next(); break
16114 Carousel.prototype.cycle = function (e) {
16115 e || (this.paused = false)
16117 this.interval && clearInterval(this.interval)
16119 this.options.interval
16121 && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
16126 Carousel.prototype.getItemIndex = function (item) {
16127 this.$items = item.parent().children('.item')
16128 return this.$items.index(item || this.$active)
16131 Carousel.prototype.to = function (pos) {
16133 var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
16135 if (pos
> (this.$items.length -
1) || pos <
0) return
16137 if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
16138 if (activeIndex == pos) return this.pause().cycle()
16140 return this.slide(pos
> activeIndex ? 'next' : 'prev', $(this.$items[pos]))
16143 Carousel.prototype.pause = function (e) {
16144 e || (this.paused = true)
16146 if (this.$element.find('.next, .prev').length && $.support.transition) {
16147 this.$element.trigger($.support.transition.end)
16151 this.interval = clearInterval(this.interval)
16156 Carousel.prototype.next = function () {
16157 if (this.sliding) return
16158 return this.slide('next')
16161 Carousel.prototype.prev = function () {
16162 if (this.sliding) return
16163 return this.slide('prev')
16166 Carousel.prototype.slide = function (type, next) {
16167 var $active = this.$element.find('.item.active')
16168 var $next = next || $active[type]()
16169 var isCycling = this.interval
16170 var direction = type == 'next' ? 'left' : 'right'
16171 var fallback = type == 'next' ? 'first' : 'last'
16174 if (!$next.length) {
16175 if (!this.options.wrap) return
16176 $next = this.$element.find('.item')[fallback]()
16179 if ($next.hasClass('active')) return (this.sliding = false)
16181 var relatedTarget = $next[
0]
16182 var slideEvent = $.Event('slide.bs.carousel', {
16183 relatedTarget: relatedTarget,
16184 direction: direction
16186 this.$element.trigger(slideEvent)
16187 if (slideEvent.isDefaultPrevented()) return
16189 this.sliding = true
16191 isCycling && this.pause()
16193 if (this.$indicators.length) {
16194 this.$indicators.find('.active').removeClass('active')
16195 var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
16196 $nextIndicator && $nextIndicator.addClass('active')
16199 var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
16200 if ($.support.transition && this.$element.hasClass('slide')) {
16201 $next.addClass(type)
16202 $next[
0].offsetWidth // force reflow
16203 $active.addClass(direction)
16204 $next.addClass(direction)
16206 .one('bsTransitionEnd', function () {
16207 $next.removeClass([type, direction].join(' ')).addClass('active')
16208 $active.removeClass(['active', direction].join(' '))
16209 that.sliding = false
16210 setTimeout(function () {
16211 that.$element.trigger(slidEvent)
16214 .emulateTransitionEnd($active.css('transition-duration').slice(
0, -
1) *
1000)
16216 $active.removeClass('active')
16217 $next.addClass('active')
16218 this.sliding = false
16219 this.$element.trigger(slidEvent)
16222 isCycling && this.cycle()
16228 // CAROUSEL PLUGIN DEFINITION
16229 // ==========================
16231 function Plugin(option) {
16232 return this.each(function () {
16233 var $this = $(this)
16234 var data = $this.data('bs.carousel')
16235 var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
16236 var action = typeof option == 'string' ? option : options.slide
16238 if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
16239 if (typeof option == 'number') data.to(option)
16240 else if (action) data[action]()
16241 else if (options.interval) data.pause().cycle()
16245 var old = $.fn.carousel
16247 $.fn.carousel = Plugin
16248 $.fn.carousel.Constructor = Carousel
16251 // CAROUSEL NO CONFLICT
16252 // ====================
16254 $.fn.carousel.noConflict = function () {
16255 $.fn.carousel = old
16260 // CAROUSEL DATA-API
16261 // =================
16263 $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {
16265 var $this = $(this)
16266 var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
16267 if (!$target.hasClass('carousel')) return
16268 var options = $.extend({}, $target.data(), $this.data())
16269 var slideIndex = $this.attr('data-slide-to')
16270 if (slideIndex) options.interval = false
16272 Plugin.call($target, options)
16275 $target.data('bs.carousel').to(slideIndex)
16281 $(window).on('load', function () {
16282 $('[
data-ride="carousel"]').each(function () {
16283 var $carousel = $(this)
16284 Plugin.call($carousel, $carousel.data())
16290 /* ========================================================================
16291 * Bootstrap: collapse.js v3.2
.0
16292 * http://getbootstrap.com/javascript/#collapse
16293 * ========================================================================
16294 * Copyright
2011-
2014 Twitter, Inc.
16295 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16296 * ======================================================================== */
16302 // COLLAPSE PUBLIC CLASS DEFINITION
16303 // ================================
16305 var Collapse = function (element, options) {
16306 this.$element = $(element)
16307 this.options = $.extend({}, Collapse.DEFAULTS, options)
16308 this.transitioning = null
16310 if (this.options.parent) this.$parent = $(this.options.parent)
16311 if (this.options.toggle) this.toggle()
16314 Collapse.VERSION = '
3.2.0'
16316 Collapse.DEFAULTS = {
16320 Collapse.prototype.dimension = function () {
16321 var hasWidth = this.$element.hasClass('width')
16322 return hasWidth ? 'width' : 'height'
16325 Collapse.prototype.show = function () {
16326 if (this.transitioning || this.$element.hasClass('in')) return
16328 var startEvent = $.Event('show.bs.collapse')
16329 this.$element.trigger(startEvent)
16330 if (startEvent.isDefaultPrevented()) return
16332 var actives = this.$parent && this.$parent.find('
> .panel
> .in')
16334 if (actives && actives.length) {
16335 var hasData = actives.data('bs.collapse')
16336 if (hasData && hasData.transitioning) return
16337 Plugin.call(actives, 'hide')
16338 hasData || actives.data('bs.collapse', null)
16341 var dimension = this.dimension()
16344 .removeClass('collapse')
16345 .addClass('collapsing')[dimension](
0)
16347 this.transitioning =
1
16349 var complete = function () {
16351 .removeClass('collapsing')
16352 .addClass('collapse in')[dimension]('')
16353 this.transitioning =
0
16355 .trigger('shown.bs.collapse')
16358 if (!$.support.transition) return complete.call(this)
16360 var scrollSize = $.camelCase(['scroll', dimension].join('-'))
16363 .one('bsTransitionEnd', $.proxy(complete, this))
16364 .emulateTransitionEnd(
350)[dimension](this.$element[
0][scrollSize])
16367 Collapse.prototype.hide = function () {
16368 if (this.transitioning || !this.$element.hasClass('in')) return
16370 var startEvent = $.Event('hide.bs.collapse')
16371 this.$element.trigger(startEvent)
16372 if (startEvent.isDefaultPrevented()) return
16374 var dimension = this.dimension()
16376 this.$element[dimension](this.$element[dimension]())[
0].offsetHeight
16379 .addClass('collapsing')
16380 .removeClass('collapse')
16383 this.transitioning =
1
16385 var complete = function () {
16386 this.transitioning =
0
16388 .trigger('hidden.bs.collapse')
16389 .removeClass('collapsing')
16390 .addClass('collapse')
16393 if (!$.support.transition) return complete.call(this)
16397 .one('bsTransitionEnd', $.proxy(complete, this))
16398 .emulateTransitionEnd(
350)
16401 Collapse.prototype.toggle = function () {
16402 this[this.$element.hasClass('in') ? 'hide' : 'show']()
16406 // COLLAPSE PLUGIN DEFINITION
16407 // ==========================
16409 function Plugin(option) {
16410 return this.each(function () {
16411 var $this = $(this)
16412 var data = $this.data('bs.collapse')
16413 var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
16415 if (!data && options.toggle && option == 'show') option = !option
16416 if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
16417 if (typeof option == 'string') data[option]()
16421 var old = $.fn.collapse
16423 $.fn.collapse = Plugin
16424 $.fn.collapse.Constructor = Collapse
16427 // COLLAPSE NO CONFLICT
16428 // ====================
16430 $.fn.collapse.noConflict = function () {
16431 $.fn.collapse = old
16436 // COLLAPSE DATA-API
16437 // =================
16439 $(document).on('click.bs.collapse.data-api', '[
data-toggle="collapse"]', function (e) {
16441 var $this = $(this)
16442 var target = $this.attr('data-target')
16443 || e.preventDefault()
16444 || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
16445 var $target = $(target)
16446 var data = $target.data('bs.collapse')
16447 var option = data ? 'toggle' : $this.data()
16448 var parent = $this.attr('data-parent')
16449 var $parent = parent && $(parent)
16451 if (!data || !data.transitioning) {
16452 if ($parent) $parent.find('[
data-toggle="collapse"][
data-parent="' + parent + '"]').not($this).addClass('collapsed')
16453 $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')
16456 Plugin.call($target, option)
16461 /* ========================================================================
16462 * Bootstrap: dropdown.js v3.2
.0
16463 * http://getbootstrap.com/javascript/#dropdowns
16464 * ========================================================================
16465 * Copyright
2011-
2014 Twitter, Inc.
16466 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16467 * ======================================================================== */
16473 // DROPDOWN CLASS DEFINITION
16474 // =========================
16476 var backdrop = '.dropdown-backdrop'
16477 var toggle = '[
data-toggle="dropdown"]'
16478 var Dropdown = function (element) {
16479 $(element).on('click.bs.dropdown', this.toggle)
16482 Dropdown.VERSION = '
3.2.0'
16484 Dropdown.prototype.toggle = function (e) {
16485 var $this = $(this)
16487 if ($this.is('.disabled, :disabled')) return
16489 var $parent = getParent($this)
16490 var isActive = $parent.hasClass('open')
16495 if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
16496 // if mobile we use a backdrop because click events don't delegate
16497 $('
<div class=
"dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)
16500 var relatedTarget = { relatedTarget: this }
16501 $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
16503 if (e.isDefaultPrevented()) return
16505 $this.trigger('focus')
16508 .toggleClass('open')
16509 .trigger('shown.bs.dropdown', relatedTarget)
16515 Dropdown.prototype.keydown = function (e) {
16516 if (!/(
38|
40|
27)/.test(e.keyCode)) return
16518 var $this = $(this)
16521 e.stopPropagation()
16523 if ($this.is('.disabled, :disabled')) return
16525 var $parent = getParent($this)
16526 var isActive = $parent.hasClass('open')
16528 if (!isActive || (isActive && e.keyCode ==
27)) {
16529 if (e.which ==
27) $parent.find(toggle).trigger('focus')
16530 return $this.trigger('click')
16533 var desc = ' li:not(.divider):visible a'
16534 var $items = $parent.find('[
role="menu"]' + desc + ', [
role="listbox"]' + desc)
16536 if (!$items.length) return
16538 var index = $items.index($items.filter(':focus'))
16540 if (e.keyCode ==
38 && index
> 0) index-- // up
16541 if (e.keyCode ==
40 && index < $items.length -
1) index++ // down
16542 if (!~index) index =
0
16544 $items.eq(index).trigger('focus')
16547 function clearMenus(e) {
16548 if (e && e.which ===
3) return
16549 $(backdrop).remove()
16550 $(toggle).each(function () {
16551 var $parent = getParent($(this))
16552 var relatedTarget = { relatedTarget: this }
16553 if (!$parent.hasClass('open')) return
16554 $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
16555 if (e.isDefaultPrevented()) return
16556 $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)
16560 function getParent($this) {
16561 var selector = $this.attr('data-target')
16564 selector = $this.attr('href')
16565 selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
16568 var $parent = selector && $(selector)
16570 return $parent && $parent.length ? $parent : $this.parent()
16574 // DROPDOWN PLUGIN DEFINITION
16575 // ==========================
16577 function Plugin(option) {
16578 return this.each(function () {
16579 var $this = $(this)
16580 var data = $this.data('bs.dropdown')
16582 if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
16583 if (typeof option == 'string') data[option].call($this)
16587 var old = $.fn.dropdown
16589 $.fn.dropdown = Plugin
16590 $.fn.dropdown.Constructor = Dropdown
16593 // DROPDOWN NO CONFLICT
16594 // ====================
16596 $.fn.dropdown.noConflict = function () {
16597 $.fn.dropdown = old
16602 // APPLY TO STANDARD DROPDOWN ELEMENTS
16603 // ===================================
16606 .on('click.bs.dropdown.data-api', clearMenus)
16607 .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
16608 .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
16609 .on('keydown.bs.dropdown.data-api', toggle + ', [
role=
"menu"], [
role=
"listbox"]', Dropdown.prototype.keydown)
16613 /* ========================================================================
16614 * Bootstrap: modal.js v3.2
.0
16615 * http://getbootstrap.com/javascript/#modals
16616 * ========================================================================
16617 * Copyright
2011-
2014 Twitter, Inc.
16618 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16619 * ======================================================================== */
16625 // MODAL CLASS DEFINITION
16626 // ======================
16628 var Modal = function (element, options) {
16629 this.options = options
16630 this.$body = $(document.body)
16631 this.$element = $(element)
16633 this.isShown = null
16634 this.scrollbarWidth =
0
16636 if (this.options.remote) {
16638 .find('.modal-content')
16639 .load(this.options.remote, $.proxy(function () {
16640 this.$element.trigger('loaded.bs.modal')
16645 Modal.VERSION = '
3.2.0'
16653 Modal.prototype.toggle = function (_relatedTarget) {
16654 return this.isShown ? this.hide() : this.show(_relatedTarget)
16657 Modal.prototype.show = function (_relatedTarget) {
16659 var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
16661 this.$element.trigger(e)
16663 if (this.isShown || e.isDefaultPrevented()) return
16665 this.isShown = true
16667 this.checkScrollbar()
16668 this.$body.addClass('modal-open')
16670 this.setScrollbar()
16673 this.$element.on('click.dismiss.bs.modal', '[
data-dismiss=
"modal"]', $.proxy(this.hide, this))
16675 this.backdrop(function () {
16676 var transition = $.support.transition && that.$element.hasClass('fade')
16678 if (!that.$element.parent().length) {
16679 that.$element.appendTo(that.$body) // don't move modals dom position
16687 that.$element[
0].offsetWidth // force reflow
16692 .attr('aria-hidden', false)
16694 that.enforceFocus()
16696 var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
16699 that.$element.find('.modal-dialog') // wait for modal to slide in
16700 .one('bsTransitionEnd', function () {
16701 that.$element.trigger('focus').trigger(e)
16703 .emulateTransitionEnd(
300) :
16704 that.$element.trigger('focus').trigger(e)
16708 Modal.prototype.hide = function (e) {
16709 if (e) e.preventDefault()
16711 e = $.Event('hide.bs.modal')
16713 this.$element.trigger(e)
16715 if (!this.isShown || e.isDefaultPrevented()) return
16717 this.isShown = false
16719 this.$body.removeClass('modal-open')
16721 this.resetScrollbar()
16724 $(document).off('focusin.bs.modal')
16728 .attr('aria-hidden', true)
16729 .off('click.dismiss.bs.modal')
16731 $.support.transition && this.$element.hasClass('fade') ?
16733 .one('bsTransitionEnd', $.proxy(this.hideModal, this))
16734 .emulateTransitionEnd(
300) :
16738 Modal.prototype.enforceFocus = function () {
16740 .off('focusin.bs.modal') // guard against infinite focus loop
16741 .on('focusin.bs.modal', $.proxy(function (e) {
16742 if (this.$element[
0] !== e.target && !this.$element.has(e.target).length) {
16743 this.$element.trigger('focus')
16748 Modal.prototype.escape = function () {
16749 if (this.isShown && this.options.keyboard) {
16750 this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {
16751 e.which ==
27 && this.hide()
16753 } else if (!this.isShown) {
16754 this.$element.off('keyup.dismiss.bs.modal')
16758 Modal.prototype.hideModal = function () {
16760 this.$element.hide()
16761 this.backdrop(function () {
16762 that.$element.trigger('hidden.bs.modal')
16766 Modal.prototype.removeBackdrop = function () {
16767 this.$backdrop && this.$backdrop.remove()
16768 this.$backdrop = null
16771 Modal.prototype.backdrop = function (callback) {
16773 var animate = this.$element.hasClass('fade') ? 'fade' : ''
16775 if (this.isShown && this.options.backdrop) {
16776 var doAnimate = $.support.transition && animate
16778 this.$backdrop = $('
<div class=
"modal-backdrop ' + animate + '" />')
16779 .appendTo(this.$body)
16781 this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
16782 if (e.target !== e.currentTarget) return
16783 this.options.backdrop == 'static'
16784 ? this.$element[
0].focus.call(this.$element[
0])
16785 : this.hide.call(this)
16788 if (doAnimate) this.$backdrop[
0].offsetWidth // force reflow
16790 this.$backdrop.addClass('in')
16792 if (!callback) return
16796 .one('bsTransitionEnd', callback)
16797 .emulateTransitionEnd(
150) :
16800 } else if (!this.isShown && this.$backdrop) {
16801 this.$backdrop.removeClass('in')
16803 var callbackRemove = function () {
16804 that.removeBackdrop()
16805 callback && callback()
16807 $.support.transition && this.$element.hasClass('fade') ?
16809 .one('bsTransitionEnd', callbackRemove)
16810 .emulateTransitionEnd(
150) :
16813 } else if (callback) {
16818 Modal.prototype.checkScrollbar = function () {
16819 if (document.body.clientWidth
>= window.innerWidth) return
16820 this.scrollbarWidth = this.scrollbarWidth || this.measureScrollbar()
16823 Modal.prototype.setScrollbar = function () {
16824 var bodyPad = parseInt((this.$body.css('padding-right') ||
0),
10)
16825 if (this.scrollbarWidth) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
16828 Modal.prototype.resetScrollbar = function () {
16829 this.$body.css('padding-right', '')
16832 Modal.prototype.measureScrollbar = function () { // thx walsh
16833 var scrollDiv = document.createElement('div')
16834 scrollDiv.className = 'modal-scrollbar-measure'
16835 this.$body.append(scrollDiv)
16836 var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
16837 this.$body[
0].removeChild(scrollDiv)
16838 return scrollbarWidth
16842 // MODAL PLUGIN DEFINITION
16843 // =======================
16845 function Plugin(option, _relatedTarget) {
16846 return this.each(function () {
16847 var $this = $(this)
16848 var data = $this.data('bs.modal')
16849 var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
16851 if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
16852 if (typeof option == 'string') data[option](_relatedTarget)
16853 else if (options.show) data.show(_relatedTarget)
16857 var old = $.fn.modal
16859 $.fn.modal = Plugin
16860 $.fn.modal.Constructor = Modal
16863 // MODAL NO CONFLICT
16864 // =================
16866 $.fn.modal.noConflict = function () {
16875 $(document).on('click.bs.modal.data-api', '[
data-toggle="modal"]', function (e) {
16876 var $this = $(this)
16877 var href = $this.attr('href')
16878 var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
16879 var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
16881 if ($this.is('a')) e.preventDefault()
16883 $target.one('show.bs.modal', function (showEvent) {
16884 if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
16885 $target.one('hidden.bs.modal', function () {
16886 $this.is(':visible') && $this.trigger('focus')
16889 Plugin.call($target, option, this)
16894 /* ========================================================================
16895 * Bootstrap: tooltip.js v3.2
.0
16896 * http://getbootstrap.com/javascript/#tooltip
16897 * Inspired by the original jQuery.tipsy by Jason Frame
16898 * ========================================================================
16899 * Copyright
2011-
2014 Twitter, Inc.
16900 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
16901 * ======================================================================== */
16907 // TOOLTIP PUBLIC CLASS DEFINITION
16908 // ===============================
16910 var Tooltip = function (element, options) {
16916 this.$element = null
16918 this.init('tooltip', element, options)
16921 Tooltip.VERSION = '
3.2.0'
16923 Tooltip.DEFAULTS = {
16927 template: '
<div class=
"tooltip" role=
"tooltip"><div class=
"tooltip-arrow"></div><div class=
"tooltip-inner"></div></div>',
16928 trigger: 'hover focus',
16939 Tooltip.prototype.init = function (type, element, options) {
16940 this.enabled = true
16942 this.$element = $(element)
16943 this.options = this.getOptions(options)
16944 this.$viewport = this.options.viewport && $(this.options.viewport.selector || this.options.viewport)
16946 var triggers = this.options.trigger.split(' ')
16948 for (var i = triggers.length; i--;) {
16949 var trigger = triggers[i]
16951 if (trigger == 'click') {
16952 this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
16953 } else if (trigger != 'manual') {
16954 var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
16955 var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
16957 this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
16958 this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
16962 this.options.selector ?
16963 (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
16967 Tooltip.prototype.getDefaults = function () {
16968 return Tooltip.DEFAULTS
16971 Tooltip.prototype.getOptions = function (options) {
16972 options = $.extend({}, this.getDefaults(), this.$element.data(), options)
16974 if (options.delay && typeof options.delay == 'number') {
16976 show: options.delay,
16977 hide: options.delay
16984 Tooltip.prototype.getDelegateOptions = function () {
16986 var defaults = this.getDefaults()
16988 this._options && $.each(this._options, function (key, value) {
16989 if (defaults[key] != value) options[key] = value
16995 Tooltip.prototype.enter = function (obj) {
16996 var self = obj instanceof this.constructor ?
16997 obj : $(obj.currentTarget).data('bs.' + this.type)
17000 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
17001 $(obj.currentTarget).data('bs.' + this.type, self)
17004 clearTimeout(self.timeout)
17006 self.hoverState = 'in'
17008 if (!self.options.delay || !self.options.delay.show) return self.show()
17010 self.timeout = setTimeout(function () {
17011 if (self.hoverState == 'in') self.show()
17012 }, self.options.delay.show)
17015 Tooltip.prototype.leave = function (obj) {
17016 var self = obj instanceof this.constructor ?
17017 obj : $(obj.currentTarget).data('bs.' + this.type)
17020 self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
17021 $(obj.currentTarget).data('bs.' + this.type, self)
17024 clearTimeout(self.timeout)
17026 self.hoverState = 'out'
17028 if (!self.options.delay || !self.options.delay.hide) return self.hide()
17030 self.timeout = setTimeout(function () {
17031 if (self.hoverState == 'out') self.hide()
17032 }, self.options.delay.hide)
17035 Tooltip.prototype.show = function () {
17036 var e = $.Event('show.bs.' + this.type)
17038 if (this.hasContent() && this.enabled) {
17039 this.$element.trigger(e)
17041 var inDom = $.contains(document.documentElement, this.$element[
0])
17042 if (e.isDefaultPrevented() || !inDom) return
17045 var $tip = this.tip()
17047 var tipId = this.getUID(this.type)
17050 $tip.attr('id', tipId)
17051 this.$element.attr('aria-describedby', tipId)
17053 if (this.options.animation) $tip.addClass('fade')
17055 var placement = typeof this.options.placement == 'function' ?
17056 this.options.placement.call(this, $tip[
0], this.$element[
0]) :
17057 this.options.placement
17059 var autoToken = /\s?auto?\s?/i
17060 var autoPlace = autoToken.test(placement)
17061 if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
17065 .css({ top:
0, left:
0, display: 'block' })
17066 .addClass(placement)
17067 .data('bs.' + this.type, this)
17069 this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
17071 var pos = this.getPosition()
17072 var actualWidth = $tip[
0].offsetWidth
17073 var actualHeight = $tip[
0].offsetHeight
17076 var orgPlacement = placement
17077 var $parent = this.$element.parent()
17078 var parentDim = this.getPosition($parent)
17080 placement = placement == 'bottom' && pos.top + pos.height + actualHeight - parentDim.scroll
> parentDim.height ? 'top' :
17081 placement == 'top' && pos.top - parentDim.scroll - actualHeight <
0 ? 'bottom' :
17082 placement == 'right' && pos.right + actualWidth
> parentDim.width ? 'left' :
17083 placement == 'left' && pos.left - actualWidth < parentDim.left ? 'right' :
17087 .removeClass(orgPlacement)
17088 .addClass(placement)
17091 var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
17093 this.applyPlacement(calculatedOffset, placement)
17095 var complete = function () {
17096 that.$element.trigger('shown.bs.' + that.type)
17097 that.hoverState = null
17100 $.support.transition && this.$tip.hasClass('fade') ?
17102 .one('bsTransitionEnd', complete)
17103 .emulateTransitionEnd(
150) :
17108 Tooltip.prototype.applyPlacement = function (offset, placement) {
17109 var $tip = this.tip()
17110 var width = $tip[
0].offsetWidth
17111 var height = $tip[
0].offsetHeight
17113 // manually read margins because getBoundingClientRect includes difference
17114 var marginTop = parseInt($tip.css('margin-top'),
10)
17115 var marginLeft = parseInt($tip.css('margin-left'),
10)
17117 // we must check for NaN for ie
8/
9
17118 if (isNaN(marginTop)) marginTop =
0
17119 if (isNaN(marginLeft)) marginLeft =
0
17121 offset.top = offset.top + marginTop
17122 offset.left = offset.left + marginLeft
17124 // $.fn.offset doesn't round pixel values
17125 // so we use setOffset directly with our own function B-
0
17126 $.offset.setOffset($tip[
0], $.extend({
17127 using: function (props) {
17129 top: Math.round(props.top),
17130 left: Math.round(props.left)
17135 $tip.addClass('in')
17137 // check to see if placing tip in new offset caused the tip to resize itself
17138 var actualWidth = $tip[
0].offsetWidth
17139 var actualHeight = $tip[
0].offsetHeight
17141 if (placement == 'top' && actualHeight != height) {
17142 offset.top = offset.top + height - actualHeight
17145 var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
17147 if (delta.left) offset.left += delta.left
17148 else offset.top += delta.top
17150 var arrowDelta = delta.left ? delta.left *
2 - width + actualWidth : delta.top *
2 - height + actualHeight
17151 var arrowPosition = delta.left ? 'left' : 'top'
17152 var arrowOffsetPosition = delta.left ? 'offsetWidth' : 'offsetHeight'
17154 $tip.offset(offset)
17155 this.replaceArrow(arrowDelta, $tip[
0][arrowOffsetPosition], arrowPosition)
17158 Tooltip.prototype.replaceArrow = function (delta, dimension, position) {
17159 this.arrow().css(position, delta ? (
50 * (
1 - delta / dimension) + '%') : '')
17162 Tooltip.prototype.setContent = function () {
17163 var $tip = this.tip()
17164 var title = this.getTitle()
17166 $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
17167 $tip.removeClass('fade in top bottom left right')
17170 Tooltip.prototype.hide = function () {
17172 var $tip = this.tip()
17173 var e = $.Event('hide.bs.' + this.type)
17175 this.$element.removeAttr('aria-describedby')
17177 function complete() {
17178 if (that.hoverState != 'in') $tip.detach()
17179 that.$element.trigger('hidden.bs.' + that.type)
17182 this.$element.trigger(e)
17184 if (e.isDefaultPrevented()) return
17186 $tip.removeClass('in')
17188 $.support.transition && this.$tip.hasClass('fade') ?
17190 .one('bsTransitionEnd', complete)
17191 .emulateTransitionEnd(
150) :
17194 this.hoverState = null
17199 Tooltip.prototype.fixTitle = function () {
17200 var $e = this.$element
17201 if ($e.attr('title') || typeof ($e.attr('data-original-title')) != 'string') {
17202 $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
17206 Tooltip.prototype.hasContent = function () {
17207 return this.getTitle()
17210 Tooltip.prototype.getPosition = function ($element) {
17211 $element = $element || this.$element
17212 var el = $element[
0]
17213 var isBody = el.tagName == 'BODY'
17214 return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : null, {
17215 scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop(),
17216 width: isBody ? $(window).width() : $element.outerWidth(),
17217 height: isBody ? $(window).height() : $element.outerHeight()
17218 }, isBody ? { top:
0, left:
0 } : $element.offset())
17221 Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
17222 return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width /
2 - actualWidth /
2 } :
17223 placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width /
2 - actualWidth /
2 } :
17224 placement == 'left' ? { top: pos.top + pos.height /
2 - actualHeight /
2, left: pos.left - actualWidth } :
17225 /* placement == 'right' */ { top: pos.top + pos.height /
2 - actualHeight /
2, left: pos.left + pos.width }
17229 Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
17230 var delta = { top:
0, left:
0 }
17231 if (!this.$viewport) return delta
17233 var viewportPadding = this.options.viewport && this.options.viewport.padding ||
0
17234 var viewportDimensions = this.getPosition(this.$viewport)
17236 if (/right|left/.test(placement)) {
17237 var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
17238 var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
17239 if (topEdgeOffset < viewportDimensions.top) { // top overflow
17240 delta.top = viewportDimensions.top - topEdgeOffset
17241 } else if (bottomEdgeOffset
> viewportDimensions.top + viewportDimensions.height) { // bottom overflow
17242 delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
17245 var leftEdgeOffset = pos.left - viewportPadding
17246 var rightEdgeOffset = pos.left + viewportPadding + actualWidth
17247 if (leftEdgeOffset < viewportDimensions.left) { // left overflow
17248 delta.left = viewportDimensions.left - leftEdgeOffset
17249 } else if (rightEdgeOffset
> viewportDimensions.width) { // right overflow
17250 delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
17257 Tooltip.prototype.getTitle = function () {
17259 var $e = this.$element
17260 var o = this.options
17262 title = $e.attr('data-original-title')
17263 || (typeof o.title == 'function' ? o.title.call($e[
0]) : o.title)
17268 Tooltip.prototype.getUID = function (prefix) {
17269 do prefix += ~~(Math.random() *
1000000)
17270 while (document.getElementById(prefix))
17274 Tooltip.prototype.tip = function () {
17275 return (this.$tip = this.$tip || $(this.options.template))
17278 Tooltip.prototype.arrow = function () {
17279 return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
17282 Tooltip.prototype.validate = function () {
17283 if (!this.$element[
0].parentNode) {
17285 this.$element = null
17286 this.options = null
17290 Tooltip.prototype.enable = function () {
17291 this.enabled = true
17294 Tooltip.prototype.disable = function () {
17295 this.enabled = false
17298 Tooltip.prototype.toggleEnabled = function () {
17299 this.enabled = !this.enabled
17302 Tooltip.prototype.toggle = function (e) {
17305 self = $(e.currentTarget).data('bs.' + this.type)
17307 self = new this.constructor(e.currentTarget, this.getDelegateOptions())
17308 $(e.currentTarget).data('bs.' + this.type, self)
17312 self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
17315 Tooltip.prototype.destroy = function () {
17316 clearTimeout(this.timeout)
17317 this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)
17321 // TOOLTIP PLUGIN DEFINITION
17322 // =========================
17324 function Plugin(option) {
17325 return this.each(function () {
17326 var $this = $(this)
17327 var data = $this.data('bs.tooltip')
17328 var options = typeof option == 'object' && option
17330 if (!data && option == 'destroy') return
17331 if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
17332 if (typeof option == 'string') data[option]()
17336 var old = $.fn.tooltip
17338 $.fn.tooltip = Plugin
17339 $.fn.tooltip.Constructor = Tooltip
17342 // TOOLTIP NO CONFLICT
17343 // ===================
17345 $.fn.tooltip.noConflict = function () {
17352 /* ========================================================================
17353 * Bootstrap: popover.js v3.2
.0
17354 * http://getbootstrap.com/javascript/#popovers
17355 * ========================================================================
17356 * Copyright
2011-
2014 Twitter, Inc.
17357 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17358 * ======================================================================== */
17364 // POPOVER PUBLIC CLASS DEFINITION
17365 // ===============================
17367 var Popover = function (element, options) {
17368 this.init('popover', element, options)
17371 if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
17373 Popover.VERSION = '
3.2.0'
17375 Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
17376 placement: 'right',
17379 template: '
<div class=
"popover" role=
"tooltip"><div class=
"arrow"></div><h3 class=
"popover-title"></h3><div class=
"popover-content"></div></div>'
17383 // NOTE: POPOVER EXTENDS tooltip.js
17384 // ================================
17386 Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)
17388 Popover.prototype.constructor = Popover
17390 Popover.prototype.getDefaults = function () {
17391 return Popover.DEFAULTS
17394 Popover.prototype.setContent = function () {
17395 var $tip = this.tip()
17396 var title = this.getTitle()
17397 var content = this.getContent()
17399 $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)
17400 $tip.find('.popover-content').empty()[ // we use append for html objects to maintain js events
17401 this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'
17404 $tip.removeClass('fade top bottom left right in')
17406 // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do
17407 // this manually by checking the contents.
17408 if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()
17411 Popover.prototype.hasContent = function () {
17412 return this.getTitle() || this.getContent()
17415 Popover.prototype.getContent = function () {
17416 var $e = this.$element
17417 var o = this.options
17419 return $e.attr('data-content')
17420 || (typeof o.content == 'function' ?
17421 o.content.call($e[
0]) :
17425 Popover.prototype.arrow = function () {
17426 return (this.$arrow = this.$arrow || this.tip().find('.arrow'))
17429 Popover.prototype.tip = function () {
17430 if (!this.$tip) this.$tip = $(this.options.template)
17435 // POPOVER PLUGIN DEFINITION
17436 // =========================
17438 function Plugin(option) {
17439 return this.each(function () {
17440 var $this = $(this)
17441 var data = $this.data('bs.popover')
17442 var options = typeof option == 'object' && option
17444 if (!data && option == 'destroy') return
17445 if (!data) $this.data('bs.popover', (data = new Popover(this, options)))
17446 if (typeof option == 'string') data[option]()
17450 var old = $.fn.popover
17452 $.fn.popover = Plugin
17453 $.fn.popover.Constructor = Popover
17456 // POPOVER NO CONFLICT
17457 // ===================
17459 $.fn.popover.noConflict = function () {
17466 /* ========================================================================
17467 * Bootstrap: scrollspy.js v3.2
.0
17468 * http://getbootstrap.com/javascript/#scrollspy
17469 * ========================================================================
17470 * Copyright
2011-
2014 Twitter, Inc.
17471 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17472 * ======================================================================== */
17478 // SCROLLSPY CLASS DEFINITION
17479 // ==========================
17481 function ScrollSpy(element, options) {
17482 var process = $.proxy(this.process, this)
17484 this.$body = $('body')
17485 this.$scrollElement = $(element).is('body') ? $(window) : $(element)
17486 this.options = $.extend({}, ScrollSpy.DEFAULTS, options)
17487 this.selector = (this.options.target || '') + ' .nav li
> a'
17490 this.activeTarget = null
17491 this.scrollHeight =
0
17493 this.$scrollElement.on('scroll.bs.scrollspy', process)
17498 ScrollSpy.VERSION = '
3.2.0'
17500 ScrollSpy.DEFAULTS = {
17504 ScrollSpy.prototype.getScrollHeight = function () {
17505 return this.$scrollElement[
0].scrollHeight || Math.max(this.$body[
0].scrollHeight, document.documentElement.scrollHeight)
17508 ScrollSpy.prototype.refresh = function () {
17509 var offsetMethod = 'offset'
17512 if (!$.isWindow(this.$scrollElement[
0])) {
17513 offsetMethod = 'position'
17514 offsetBase = this.$scrollElement.scrollTop()
17519 this.scrollHeight = this.getScrollHeight()
17524 .find(this.selector)
17527 var href = $el.data('target') || $el.attr('href')
17528 var $href = /^#./.test(href) && $(href)
17532 && $href.is(':visible')
17533 && [[$href[offsetMethod]().top + offsetBase, href]]) || null
17535 .sort(function (a, b) { return a[
0] - b[
0] })
17536 .each(function () {
17537 self.offsets.push(this[
0])
17538 self.targets.push(this[
1])
17542 ScrollSpy.prototype.process = function () {
17543 var scrollTop = this.$scrollElement.scrollTop() + this.options.offset
17544 var scrollHeight = this.getScrollHeight()
17545 var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height()
17546 var offsets = this.offsets
17547 var targets = this.targets
17548 var activeTarget = this.activeTarget
17551 if (this.scrollHeight != scrollHeight) {
17555 if (scrollTop
>= maxScroll) {
17556 return activeTarget != (i = targets[targets.length -
1]) && this.activate(i)
17559 if (activeTarget && scrollTop <= offsets[
0]) {
17560 return activeTarget != (i = targets[
0]) && this.activate(i)
17563 for (i = offsets.length; i--;) {
17564 activeTarget != targets[i]
17565 && scrollTop
>= offsets[i]
17566 && (!offsets[i +
1] || scrollTop <= offsets[i +
1])
17567 && this.activate(targets[i])
17571 ScrollSpy.prototype.activate = function (target) {
17572 this.activeTarget = target
17575 .parentsUntil(this.options.target, '.active')
17576 .removeClass('active')
17578 var selector = this.selector +
17579 '[
data-target="' + target + '"],' +
17580 this.selector + '[
href="' + target + '"]'
17582 var active = $(selector)
17584 .addClass('active')
17586 if (active.parent('.dropdown-menu').length) {
17588 .closest('li.dropdown')
17589 .addClass('active')
17592 active.trigger('activate.bs.scrollspy')
17596 // SCROLLSPY PLUGIN DEFINITION
17597 // ===========================
17599 function Plugin(option) {
17600 return this.each(function () {
17601 var $this = $(this)
17602 var data = $this.data('bs.scrollspy')
17603 var options = typeof option == 'object' && option
17605 if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))
17606 if (typeof option == 'string') data[option]()
17610 var old = $.fn.scrollspy
17612 $.fn.scrollspy = Plugin
17613 $.fn.scrollspy.Constructor = ScrollSpy
17616 // SCROLLSPY NO CONFLICT
17617 // =====================
17619 $.fn.scrollspy.noConflict = function () {
17620 $.fn.scrollspy = old
17625 // SCROLLSPY DATA-API
17626 // ==================
17628 $(window).on('load.bs.scrollspy.data-api', function () {
17629 $('[
data-spy="scroll"]').each(function () {
17631 Plugin.call($spy, $spy.data())
17637 /* ========================================================================
17638 * Bootstrap: tab.js v3.2
.0
17639 * http://getbootstrap.com/javascript/#tabs
17640 * ========================================================================
17641 * Copyright
2011-
2014 Twitter, Inc.
17642 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17643 * ======================================================================== */
17649 // TAB CLASS DEFINITION
17650 // ====================
17652 var Tab = function (element) {
17653 this.element = $(element)
17656 Tab.VERSION = '
3.2.0'
17658 Tab.prototype.show = function () {
17659 var $this = this.element
17660 var $ul = $this.closest('ul:not(.dropdown-menu)')
17661 var selector = $this.data('target')
17664 selector = $this.attr('href')
17665 selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
17668 if ($this.parent('li').hasClass('active')) return
17670 var previous = $ul.find('.active:last a')[
0]
17671 var e = $.Event('show.bs.tab', {
17672 relatedTarget: previous
17677 if (e.isDefaultPrevented()) return
17679 var $target = $(selector)
17681 this.activate($this.closest('li'), $ul)
17682 this.activate($target, $target.parent(), function () {
17684 type: 'shown.bs.tab',
17685 relatedTarget: previous
17690 Tab.prototype.activate = function (element, container, callback) {
17691 var $active = container.find('
> .active')
17692 var transition = callback
17693 && $.support.transition
17694 && $active.hasClass('fade')
17698 .removeClass('active')
17699 .find('
> .dropdown-menu
> .active')
17700 .removeClass('active')
17702 element.addClass('active')
17705 element[
0].offsetWidth // reflow for transition
17706 element.addClass('in')
17708 element.removeClass('fade')
17711 if (element.parent('.dropdown-menu')) {
17712 element.closest('li.dropdown').addClass('active')
17715 callback && callback()
17720 .one('bsTransitionEnd', next)
17721 .emulateTransitionEnd(
150) :
17724 $active.removeClass('in')
17728 // TAB PLUGIN DEFINITION
17729 // =====================
17731 function Plugin(option) {
17732 return this.each(function () {
17733 var $this = $(this)
17734 var data = $this.data('bs.tab')
17736 if (!data) $this.data('bs.tab', (data = new Tab(this)))
17737 if (typeof option == 'string') data[option]()
17744 $.fn.tab.Constructor = Tab
17750 $.fn.tab.noConflict = function () {
17759 $(document).on('click.bs.tab.data-api', '[
data-toggle="tab"], [
data-toggle="pill"]', function (e) {
17761 Plugin.call($(this), 'show')
17766 /* ========================================================================
17767 * Bootstrap: affix.js v3.2
.0
17768 * http://getbootstrap.com/javascript/#affix
17769 * ========================================================================
17770 * Copyright
2011-
2014 Twitter, Inc.
17771 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
17772 * ======================================================================== */
17778 // AFFIX CLASS DEFINITION
17779 // ======================
17781 var Affix = function (element, options) {
17782 this.options = $.extend({}, Affix.DEFAULTS, options)
17784 this.$target = $(this.options.target)
17785 .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
17786 .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
17788 this.$element = $(element)
17791 this.pinnedOffset = null
17793 this.checkPosition()
17796 Affix.VERSION = '
3.2.0'
17798 Affix.RESET = 'affix affix-top affix-bottom'
17805 Affix.prototype.getPinnedOffset = function () {
17806 if (this.pinnedOffset) return this.pinnedOffset
17807 this.$element.removeClass(Affix.RESET).addClass('affix')
17808 var scrollTop = this.$target.scrollTop()
17809 var position = this.$element.offset()
17810 return (this.pinnedOffset = position.top - scrollTop)
17813 Affix.prototype.checkPositionWithEventLoop = function () {
17814 setTimeout($.proxy(this.checkPosition, this),
1)
17817 Affix.prototype.checkPosition = function () {
17818 if (!this.$element.is(':visible')) return
17820 var scrollHeight = $(document).height()
17821 var scrollTop = this.$target.scrollTop()
17822 var position = this.$element.offset()
17823 var offset = this.options.offset
17824 var offsetTop = offset.top
17825 var offsetBottom = offset.bottom
17827 if (typeof offset != 'object') offsetBottom = offsetTop = offset
17828 if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
17829 if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
17831 var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :
17832 offsetBottom != null && (position.top + this.$element.height()
>= scrollHeight - offsetBottom) ? 'bottom' :
17833 offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false
17835 if (this.affixed === affix) return
17836 if (this.unpin != null) this.$element.css('top', '')
17838 var affixType = 'affix' + (affix ? '-' + affix : '')
17839 var e = $.Event(affixType + '.bs.affix')
17841 this.$element.trigger(e)
17843 if (e.isDefaultPrevented()) return
17845 this.affixed = affix
17846 this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
17849 .removeClass(Affix.RESET)
17850 .addClass(affixType)
17851 .trigger($.Event(affixType.replace('affix', 'affixed')))
17853 if (affix == 'bottom') {
17854 this.$element.offset({
17855 top: scrollHeight - this.$element.height() - offsetBottom
17861 // AFFIX PLUGIN DEFINITION
17862 // =======================
17864 function Plugin(option) {
17865 return this.each(function () {
17866 var $this = $(this)
17867 var data = $this.data('bs.affix')
17868 var options = typeof option == 'object' && option
17870 if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
17871 if (typeof option == 'string') data[option]()
17875 var old = $.fn.affix
17877 $.fn.affix = Plugin
17878 $.fn.affix.Constructor = Affix
17881 // AFFIX NO CONFLICT
17882 // =================
17884 $.fn.affix.noConflict = function () {
17893 $(window).on('load', function () {
17894 $('[
data-spy="affix"]').each(function () {
17896 var data = $spy.data()
17898 data.offset = data.offset || {}
17900 if (data.offsetBottom) data.offset.bottom = data.offsetBottom
17901 if (data.offsetTop) data.offset.top = data.offsetTop
17903 Plugin.call($spy, data)
17910 (function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Bitcoin=e()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&
&require;if(!u&&a)return a(o,!
0);if(i)return i(o,!
0);throw new Error("Cannot find module '"+o+"'")}var f=n[o]={exports:{}};t[o][
0].call(f.exports,function(e){var n=t[o][
1][e];return s(n?n:e)},f,f.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&
&require;for(var o=
0;o
<r.length;o++)s(r[o]);return s})({
1:[function(_dereq_,module,exports){
17911 var assert = _dereq_('assert')
17913 module.exports = BigInteger
17915 // JavaScript engine analysis
17916 var canary =
0xdeadbeefcafe;
17917 var j_lm = ((canary&
0xffffff)==
0xefcafe);
17919 // (public) Constructor
17920 function BigInteger(a,b,c) {
17921 if (!(this instanceof BigInteger)) {
17922 return new BigInteger(a, b, c);
17926 if(
"number" == typeof a) this.fromNumber(a,b,c);
17927 else if(b == null &&
"string" != typeof a) this.fromString(a,
256);
17928 else this.fromString(a,b);
17932 var proto = BigInteger.prototype;
17934 // return new, unset BigInteger
17935 function nbi() { return new BigInteger(null); }
17940 // am: Compute w_j += (x*this_i), propagate carries,
17941 // c is initial carry, returns final carry.
17942 // c <
3*dvalue, x <
2*dvalue, this_i < dvalue
17943 // We need to select the fastest one that works in this environment.
17945 // am1: use a single mult and divide to get the high bits,
17946 // max digit bits should be
26 because
17947 // max internal value =
2*dvalue^
2-
2*dvalue (<
2^
53)
17948 function am1(i,x,w,j,c,n) {
17950 var v = x*this[i++]+w[j]+c;
17951 c = Math.floor(v/
0x4000000);
17952 w[j++] = v
&0x3ffffff;
17956 // am2 avoids a big mult-and-extract completely.
17957 // Max digit bits should be <=
30 because we do bitwise ops
17958 // on values up to
2*hdvalue^
2-hdvalue-
1 (<
2^
31)
17959 function am2(i,x,w,j,c,n) {
17960 var xl = x&
0x7fff, xh = x
>>15;
17962 var l = this[i]
&0x7fff;
17963 var h = this[i++]
>>15;
17965 l = xl*l+((m&
0x7fff)<
<15)+w[j]+(c&
0x3fffffff);
17966 c = (l
>>>30)+(m
>>>15)+xh*h+(c
>>>30);
17967 w[j++] = l
&0x3fffffff;
17971 // Alternately, set max digit bits to
28 since some
17972 // browsers slow down when dealing with
32-bit numbers.
17973 function am3(i,x,w,j,c,n) {
17974 var xl = x&
0x3fff, xh = x
>>14;
17976 var l = this[i]
&0x3fff;
17977 var h = this[i++]
>>14;
17979 l = xl*l+((m&
0x3fff)<
<14)+w[j]+c;
17980 c = (l
>>28)+(m
>>14)+xh*h;
17981 w[j++] = l
&0xfffffff;
17987 BigInteger.prototype.am = am1;
17991 if(j_lm && (navigator.appName ==
"Microsoft Internet Explorer")) {
17992 BigInteger.prototype.am = am2;
17995 else if(j_lm && (navigator.appName !=
"Netscape")) {
17996 BigInteger.prototype.am = am1;
17999 else { // Mozilla/Netscape seems to prefer am3
18000 BigInteger.prototype.am = am3;
18005 BigInteger.prototype.DB = dbits;
18006 BigInteger.prototype.DM = ((
1<
<dbits)-
1);
18007 var DV = BigInteger.prototype.DV = (
1<
<dbits);
18010 BigInteger.prototype.FV = Math.pow(
2,BI_FP);
18011 BigInteger.prototype.F1 = BI_FP-dbits;
18012 BigInteger.prototype.F2 =
2*dbits-BI_FP;
18014 // Digit conversions
18015 var BI_RM =
"0123456789abcdefghijklmnopqrstuvwxyz";
18016 var BI_RC = new Array();
18018 rr =
"0".charCodeAt(
0);
18019 for(vv =
0; vv <=
9; ++vv) BI_RC[rr++] = vv;
18020 rr =
"a".charCodeAt(
0);
18021 for(vv =
10; vv <
36; ++vv) BI_RC[rr++] = vv;
18022 rr =
"A".charCodeAt(
0);
18023 for(vv =
10; vv <
36; ++vv) BI_RC[rr++] = vv;
18025 function int2char(n) { return BI_RM.charAt(n); }
18026 function intAt(s,i) {
18027 var c = BI_RC[s.charCodeAt(i)];
18028 return (c==null)?-
1:c;
18031 // (protected) copy this to r
18032 function bnpCopyTo(r) {
18033 for(var i = this.t-
1; i
>=
0; --i) r[i] = this[i];
18038 // (protected) set from integer value x, -DV <= x < DV
18039 function bnpFromInt(x) {
18041 this.s = (x
<0)?-
1:
0;
18042 if(x
> 0) this[
0] = x;
18043 else if(x < -
1) this[
0] = x+DV;
18047 // return bigint initialized to value
18048 function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
18050 // (protected) set from string and radix
18051 function bnpFromString(s,b) {
18056 else if(b ==
8) k =
3;
18057 else if(b ==
256) k =
8; // byte array
18058 else if(b ==
2) k =
1;
18059 else if(b ==
32) k =
5;
18060 else if(b ==
4) k =
2;
18061 else { self.fromRadix(s,b); return; }
18064 var i = s.length, mi = false, sh =
0;
18066 var x = (k==
8)?s[i]&
0xff:intAt(s,i);
18068 if(s.charAt(i) == "-") mi = true;
18073 self[self.t++] = x;
18074 else if(sh+k
> self.DB) {
18075 self[self.t-
1] |= (x&((
1<<(self.DB-sh))-
1))<
<sh;
18076 self[self.t++] = (x
>>(self.DB-sh));
18079 self[self.t-
1] |= x<
<sh;
18081 if(sh
>= self.DB) sh -= self.DB;
18083 if(k ==
8 && (s[
0]&
0x80) !=
0) {
18085 if(sh
> 0) self[self.t-
1] |= ((
1<<(self.DB-sh))-
1)<
<sh;
18088 if(mi) BigInteger.ZERO.subTo(self,self);
18091 // (protected) clamp off excess high words
18092 function bnpClamp() {
18093 var c = this.s&this.DM;
18094 while(this.t
> 0 && this[this.t-
1] == c) --this.t;
18097 // (public) return string representation in given radix
18098 function bnToString(b) {
18100 if(self.s <
0) return
"-"+self.negate().toString(b);
18103 else if(b ==
8) k =
3;
18104 else if(b ==
2) k =
1;
18105 else if(b ==
32) k =
5;
18106 else if(b ==
4) k =
2;
18107 else return self.toRadix(b);
18108 var km = (
1<
<k)-
1, d, m = false, r =
"", i = self.t;
18109 var p = self.DB-(i*self.DB)%k;
18111 if(p < self.DB && (d = self[i]
>>p)
> 0) { m = true; r = int2char(d); }
18114 d = (self[i]&((
1<
<p)-
1))<<(k-p);
18115 d |= self[--i]
>>(p+=self.DB-k);
18118 d = (self[i]
>>(p-=k))
&km;
18119 if(p <=
0) { p += self.DB; --i; }
18121 if(d
> 0) m = true;
18122 if(m) r += int2char(d);
18129 function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
18132 function bnAbs() { return (this.s
<0)?this.negate():this; }
18134 // (public) return + if this
> a, - if this < a,
0 if equal
18135 function bnCompareTo(a) {
18136 var r = this.s-a.s;
18137 if(r !=
0) return r;
18140 if(r !=
0) return (this.s
<0)?-r:r;
18141 while(--i
>=
0) if((r=this[i]-a[i]) !=
0) return r;
18145 // returns bit length of the integer x
18146 function nbits(x) {
18148 if((t=x
>>>16) !=
0) { x = t; r +=
16; }
18149 if((t=x
>>8) !=
0) { x = t; r +=
8; }
18150 if((t=x
>>4) !=
0) { x = t; r +=
4; }
18151 if((t=x
>>2) !=
0) { x = t; r +=
2; }
18152 if((t=x
>>1) !=
0) { x = t; r +=
1; }
18156 // (public) return the number of bits in
"this"
18157 function bnBitLength() {
18158 if(this.t <=
0) return
0;
18159 return this.DB*(this.t-
1)+nbits(this[this.t-
1]^(this.s&this.DM));
18162 // (protected) r = this << n*DB
18163 function bnpDLShiftTo(n,r) {
18165 for(i = this.t-
1; i
>=
0; --i) r[i+n] = this[i];
18166 for(i = n-
1; i
>=
0; --i) r[i] =
0;
18171 // (protected) r = this
>> n*DB
18172 function bnpDRShiftTo(n,r) {
18173 for(var i = n; i < this.t; ++i) r[i-n] = this[i];
18174 r.t = Math.max(this.t-n,
0);
18178 // (protected) r = this << n
18179 function bnpLShiftTo(n,r) {
18181 var bs = n%self.DB;
18182 var cbs = self.DB-bs;
18183 var bm = (
1<
<cbs)-
1;
18184 var ds = Math.floor(n/self.DB), c = (self.s<
<bs)&self.DM, i;
18185 for(i = self.t-
1; i
>=
0; --i) {
18186 r[i+ds+
1] = (self[i]
>>cbs)|c;
18187 c = (self[i]&bm)<
<bs;
18189 for(i = ds-
1; i
>=
0; --i) r[i] =
0;
18196 // (protected) r = this
>> n
18197 function bnpRShiftTo(n,r) {
18200 var ds = Math.floor(n/self.DB);
18201 if(ds
>= self.t) { r.t =
0; return; }
18202 var bs = n%self.DB;
18203 var cbs = self.DB-bs;
18204 var bm = (
1<
<bs)-
1;
18205 r[
0] = self[ds]
>>bs;
18206 for(var i = ds+
1; i < self.t; ++i) {
18207 r[i-ds-
1] |= (self[i]&bm)<
<cbs;
18208 r[i-ds] = self[i]
>>bs;
18210 if(bs
> 0) r[self.t-ds-
1] |= (self.s&bm)<
<cbs;
18215 // (protected) r = this - a
18216 function bnpSubTo(a,r) {
18218 var i =
0, c =
0, m = Math.min(a.t,self.t);
18221 r[i++] = c&self.DM;
18226 while(i < self.t) {
18228 r[i++] = c&self.DM;
18237 r[i++] = c&self.DM;
18243 if(c < -
1) r[i++] = self.DV+c;
18244 else if(c
> 0) r[i++] = c;
18249 // (protected) r = this * a, r != this,a (HAC
14.12)
18250 //
"this" should be the larger one if appropriate.
18251 function bnpMultiplyTo(a,r) {
18252 var x = this.abs(), y = a.abs();
18255 while(--i
>=
0) r[i] =
0;
18256 for(i =
0; i < y.t; ++i) r[i+x.t] = x.am(
0,y[i],r,i,
0,x.t);
18259 if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
18262 // (protected) r = this^
2, r != this (HAC
14.16)
18263 function bnpSquareTo(r) {
18264 var x = this.abs();
18265 var i = r.t =
2*x.t;
18266 while(--i
>=
0) r[i] =
0;
18267 for(i =
0; i < x.t-
1; ++i) {
18268 var c = x.am(i,x[i],r,
2*i,
0,
1);
18269 if((r[i+x.t]+=x.am(i+
1,
2*x[i],r,
2*i+
1,c,x.t-i-
1))
>= x.DV) {
18274 if(r.t
> 0) r[r.t-
1] += x.am(i,x[i],r,
2*i,
0,
1);
18279 // (protected) divide this by m, quotient and remainder to q, r (HAC
14.20)
18280 // r != q, this != m. q or r may be null.
18281 function bnpDivRemTo(m,q,r) {
18284 if(pm.t <=
0) return;
18285 var pt = self.abs();
18287 if(q != null) q.fromInt(
0);
18288 if(r != null) self.copyTo(r);
18291 if(r == null) r = nbi();
18292 var y = nbi(), ts = self.s, ms = m.s;
18293 var nsh = self.DB-nbits(pm[pm.t-
1]); // normalize modulus
18294 if(nsh
> 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
18295 else { pm.copyTo(y); pt.copyTo(r); }
18298 if(y0 ==
0) return;
18299 var yt = y0*(
1<
<self.F1)+((ys
>1)?y[ys-
2]
>>self.F2:
0);
18300 var d1 = self.FV/yt, d2 = (
1<
<self.F1)/yt, e =
1<
<self.F2;
18301 var i = r.t, j = i-ys, t = (q==null)?nbi():q;
18303 if(r.compareTo(t)
>=
0) {
18307 BigInteger.ONE.dlShiftTo(ys,t);
18308 t.subTo(y,y); // "negative" y so we can replace sub with am later
18309 while(y.t < ys) y[y.t++] =
0;
18311 // Estimate quotient digit
18312 var qd = (r[--i]==y0)?self.DM:Math.floor(r[i]*d1+(r[i-
1]+e)*d2);
18313 if((r[i]+=y.am(
0,qd,r,j,
0,ys)) < qd) { // Try it out
18316 while(r[i] < --qd) r.subTo(t,r);
18321 if(ts != ms) BigInteger.ZERO.subTo(q,q);
18325 if(nsh
> 0) r.rShiftTo(nsh,r); // Denormalize remainder
18326 if(ts <
0) BigInteger.ZERO.subTo(r,r);
18329 // (public) this mod a
18330 function bnMod(a) {
18332 this.abs().divRemTo(a,null,r);
18333 if(this.s <
0 && r.compareTo(BigInteger.ZERO)
> 0) a.subTo(r,r);
18337 // Modular reduction using
"classic" algorithm
18338 function Classic(m) { this.m = m; }
18339 function cConvert(x) {
18340 if(x.s <
0 || x.compareTo(this.m)
>=
0) return x.mod(this.m);
18343 function cRevert(x) { return x; }
18344 function cReduce(x) { x.divRemTo(this.m,null,x); }
18345 function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18346 function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18348 Classic.prototype.convert = cConvert;
18349 Classic.prototype.revert = cRevert;
18350 Classic.prototype.reduce = cReduce;
18351 Classic.prototype.mulTo = cMulTo;
18352 Classic.prototype.sqrTo = cSqrTo;
18354 // (protected) return "-
1/this %
2^DB"; useful for Mont. reduction
18358 // xy(
2-xy) = (
1+km)(
1-km)
18359 // x[y(
2-xy)] =
1-k^
2m^
2
18360 // x[y(
2-xy)] ==
1 (mod m^
2)
18361 // if y is
1/x mod m, then y(
2-xy) is
1/x mod m^
2
18362 // should reduce x and y(
2-xy) by m^
2 at each step to keep size bounded.
18363 // JS multiply "overflows" differently from C/C++, so care is needed here.
18364 function bnpInvDigit() {
18365 if(this.t <
1) return
0;
18367 if((x&
1) ==
0) return
0;
18368 var y = x
&3; // y ==
1/x mod
2^
2
18369 y = (y*(
2-(x&
0xf)*y))
&0xf; // y ==
1/x mod
2^
4
18370 y = (y*(
2-(x&
0xff)*y))
&0xff; // y ==
1/x mod
2^
8
18371 y = (y*(
2-(((x&
0xffff)*y)&
0xffff)))
&0xffff; // y ==
1/x mod
2^
16
18372 // last step - calculate inverse mod DV directly;
18373 // assumes
16 < DB <=
32 and assumes ability to handle
48-bit ints
18374 y = (y*(
2-x*y%this.DV))%this.DV; // y ==
1/x mod
2^dbits
18375 // we really want the negative inverse, and -DV < y < DV
18376 return (y
>0)?this.DV-y:-y;
18379 // Montgomery reduction
18380 function Montgomery(m) {
18382 this.mp = m.invDigit();
18383 this.mpl = this.mp
&0x7fff;
18384 this.mph = this.mp
>>15;
18385 this.um = (
1<<(m.DB-
15))-
1;
18390 function montConvert(x) {
18392 x.abs().dlShiftTo(this.m.t,r);
18393 r.divRemTo(this.m,null,r);
18394 if(x.s <
0 && r.compareTo(BigInteger.ZERO)
> 0) this.m.subTo(r,r);
18399 function montRevert(x) {
18406 // x = x/R mod m (HAC
14.32)
18407 function montReduce(x) {
18408 while(x.t <= this.mt2) // pad x so am has enough room later
18410 for(var i =
0; i < this.m.t; ++i) {
18411 // faster way of calculating u0 = x[i]*mp mod DV
18412 var j = x[i]
&0x7fff;
18413 var u0 = (j*this.mpl+(((j*this.mph+(x[i]
>>15)*this.mpl)&this.um)<
<15))&x.DM;
18414 // use am to combine the multiply-shift-add into one call
18416 x[j] += this.m.am(
0,u0,x,i,
0,this.m.t);
18418 while(x[j]
>= x.DV) { x[j] -= x.DV; x[++j]++; }
18421 x.drShiftTo(this.m.t,x);
18422 if(x.compareTo(this.m)
>=
0) x.subTo(this.m,x);
18425 // r = "x^
2/R mod m"; x != r
18426 function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18428 // r = "xy/R mod m"; x,y != r
18429 function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18431 Montgomery.prototype.convert = montConvert;
18432 Montgomery.prototype.revert = montRevert;
18433 Montgomery.prototype.reduce = montReduce;
18434 Montgomery.prototype.mulTo = montMulTo;
18435 Montgomery.prototype.sqrTo = montSqrTo;
18437 // (protected) true iff this is even
18438 function bnpIsEven() { return ((this.t
>0)?(this[
0]&
1):this.s) ==
0; }
18440 // (protected) this^e, e <
2^
32, doing sqr and mul with
"r" (HAC
14.79)
18441 function bnpExp(e,z) {
18442 if(e
> 0xffffffff || e <
1) return BigInteger.ONE;
18443 var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-
1;
18447 if((e&(
1<
<i))
> 0) z.mulTo(r2,g,r);
18448 else { var t = r; r = r2; r2 = t; }
18450 return z.revert(r);
18453 // (public) this^e % m,
0 <= e <
2^
32
18454 function bnModPowInt(e,m) {
18456 if(e <
256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
18457 return this.exp(e,z);
18461 proto.copyTo = bnpCopyTo;
18462 proto.fromInt = bnpFromInt;
18463 proto.fromString = bnpFromString;
18464 proto.clamp = bnpClamp;
18465 proto.dlShiftTo = bnpDLShiftTo;
18466 proto.drShiftTo = bnpDRShiftTo;
18467 proto.lShiftTo = bnpLShiftTo;
18468 proto.rShiftTo = bnpRShiftTo;
18469 proto.subTo = bnpSubTo;
18470 proto.multiplyTo = bnpMultiplyTo;
18471 proto.squareTo = bnpSquareTo;
18472 proto.divRemTo = bnpDivRemTo;
18473 proto.invDigit = bnpInvDigit;
18474 proto.isEven = bnpIsEven;
18475 proto.exp = bnpExp;
18478 proto.toString = bnToString;
18479 proto.negate = bnNegate;
18481 proto.compareTo = bnCompareTo;
18482 proto.bitLength = bnBitLength;
18484 proto.modPowInt = bnModPowInt;
18488 function nbi() { return new BigInteger(null); }
18491 function bnClone() { var r = nbi(); this.copyTo(r); return r; }
18493 // (public) return value as integer
18494 function bnIntValue() {
18496 if(this.t ==
1) return this[
0]-this.DV;
18497 else if(this.t ==
0) return -
1;
18499 else if(this.t ==
1) return this[
0];
18500 else if(this.t ==
0) return
0;
18501 // assumes
16 < DB <
32
18502 return ((this[
1]&((
1<<(
32-this.DB))-
1))<
<this.DB)|this[
0];
18505 // (public) return value as byte
18506 function bnByteValue() { return (this.t==
0)?this.s:(this[
0]<
<24)
>>24; }
18508 // (public) return value as short (assumes DB
>=
16)
18509 function bnShortValue() { return (this.t==
0)?this.s:(this[
0]<
<16)
>>16; }
18511 // (protected) return x s.t. r^x < DV
18512 function bnpChunkSize(r) { return Math.floor(Math.LN2*this.DB/Math.log(r)); }
18514 // (public)
0 if this ==
0,
1 if this
> 0
18515 function bnSigNum() {
18516 if(this.s <
0) return -
1;
18517 else if(this.t <=
0 || (this.t ==
1 && this[
0] <=
0)) return
0;
18521 // (protected) convert to radix string
18522 function bnpToRadix(b) {
18523 if(b == null) b =
10;
18524 if(this.signum() ==
0 || b <
2 || b
> 36) return
"0";
18525 var cs = this.chunkSize(b);
18526 var a = Math.pow(b,cs);
18527 var d = nbv(a), y = nbi(), z = nbi(), r =
"";
18528 this.divRemTo(d,y,z);
18529 while(y.signum()
> 0) {
18530 r = (a+z.intValue()).toString(b).substr(
1) + r;
18533 return z.intValue().toString(b) + r;
18536 // (protected) convert from radix string
18537 function bnpFromRadix(s,b) {
18540 if(b == null) b =
10;
18541 var cs = self.chunkSize(b);
18542 var d = Math.pow(b,cs), mi = false, j =
0, w =
0;
18543 for(var i =
0; i < s.length; ++i) {
18544 var x = intAt(s,i);
18546 if(s.charAt(i) ==
"-" && self.signum() ==
0) mi = true;
18552 self.dAddOffset(w,
0);
18558 self.dMultiply(Math.pow(b,j));
18559 self.dAddOffset(w,
0);
18561 if(mi) BigInteger.ZERO.subTo(self,self);
18564 // (protected) alternate constructor
18565 function bnpFromNumber(a,b,c) {
18567 if(
"number" == typeof b) {
18568 // new BigInteger(int,int,RNG)
18569 if(a <
2) self.fromInt(
1);
18571 self.fromNumber(a,c);
18572 if(!self.testBit(a-
1)) // force MSB set
18573 self.bitwiseTo(BigInteger.ONE.shiftLeft(a-
1),op_or,self);
18574 if(self.isEven()) self.dAddOffset(
1,
0); // force odd
18575 while(!self.isProbablePrime(b)) {
18576 self.dAddOffset(
2,
0);
18577 if(self.bitLength()
> a) self.subTo(BigInteger.ONE.shiftLeft(a-
1),self);
18582 // new BigInteger(int,RNG)
18583 var x = new Array(), t = a
&7;
18584 x.length = (a
>>3)+
1;
18586 if(t
> 0) x[
0] &= ((
1<
<t)-
1); else x[
0] =
0;
18587 self.fromString(x,
256);
18591 // (public) convert to bigendian byte array
18592 function bnToByteArray() {
18594 var i = self.t, r = new Array();
18596 var p = self.DB-(i*self.DB)%
8, d, k =
0;
18598 if(p < self.DB && (d = self[i]
>>p) != (self.s&self.DM)
>>p)
18599 r[k++] = d|(self.s<<(self.DB-p));
18602 d = (self[i]&((
1<
<p)-
1))<<(
8-p);
18603 d |= self[--i]
>>(p+=self.DB-
8);
18606 d = (self[i]
>>(p-=
8))
&0xff;
18607 if(p <=
0) { p += self.DB; --i; }
18609 if((d&
0x80) !=
0) d |= -
256;
18610 if(k ===
0 && (self.s&
0x80) != (d&
0x80)) ++k;
18611 if(k
> 0 || d != self.s) r[k++] = d;
18617 function bnEquals(a) { return(this.compareTo(a)==
0); }
18618 function bnMin(a) { return(this.compareTo(a)
<0)?this:a; }
18619 function bnMax(a) { return(this.compareTo(a)
>0)?this:a; }
18621 // (protected) r = this op a (bitwise)
18622 function bnpBitwiseTo(a,op,r) {
18624 var i, f, m = Math.min(a.t,self.t);
18625 for(i =
0; i < m; ++i) r[i] = op(self[i],a[i]);
18628 for(i = m; i < self.t; ++i) r[i] = op(self[i],f);
18632 f = self.s&self.DM;
18633 for(i = m; i < a.t; ++i) r[i] = op(f,a[i]);
18636 r.s = op(self.s,a.s);
18640 // (public) this & a
18641 function op_and(x,y) { return x
&y; }
18642 function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
18644 // (public) this | a
18645 function op_or(x,y) { return x|y; }
18646 function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
18648 // (public) this ^ a
18649 function op_xor(x,y) { return x^y; }
18650 function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
18652 // (public) this & ~a
18653 function op_andnot(x,y) { return x&~y; }
18654 function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
18659 for(var i =
0; i < this.t; ++i) r[i] = this.DM&~this[i];
18665 // (public) this << n
18666 function bnShiftLeft(n) {
18668 if(n <
0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
18672 // (public) this
>> n
18673 function bnShiftRight(n) {
18675 if(n <
0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
18679 // return index of lowest
1-bit in x, x <
2^
31
18681 if(x ==
0) return -
1;
18683 if((x&
0xffff) ==
0) { x
>>=
16; r +=
16; }
18684 if((x&
0xff) ==
0) { x
>>=
8; r +=
8; }
18685 if((x&
0xf) ==
0) { x
>>=
4; r +=
4; }
18686 if((x&
3) ==
0) { x
>>=
2; r +=
2; }
18687 if((x&
1) ==
0) ++r;
18691 // (public) returns index of lowest
1-bit (or -
1 if none)
18692 function bnGetLowestSetBit() {
18693 for(var i =
0; i < this.t; ++i)
18694 if(this[i] !=
0) return i*this.DB+lbit(this[i]);
18695 if(this.s <
0) return this.t*this.DB;
18699 // return number of
1 bits in x
18702 while(x !=
0) { x &= x-
1; ++r; }
18706 // (public) return number of set bits
18707 function bnBitCount() {
18708 var r =
0, x = this.s&this.DM;
18709 for(var i =
0; i < this.t; ++i) r += cbit(this[i]^x);
18713 // (public) true iff nth bit is set
18714 function bnTestBit(n) {
18715 var j = Math.floor(n/this.DB);
18716 if(j
>= this.t) return(this.s!=
0);
18717 return((this[j]&(
1<<(n%this.DB)))!=
0);
18720 // (protected) this op (
1<
<n)
18721 function bnpChangeBit(n,op) {
18722 var r = BigInteger.ONE.shiftLeft(n);
18723 this.bitwiseTo(r,op,r);
18727 // (public) this | (
1<
<n)
18728 function bnSetBit(n) { return this.changeBit(n,op_or); }
18730 // (public) this & ~(
1<
<n)
18731 function bnClearBit(n) { return this.changeBit(n,op_andnot); }
18733 // (public) this ^ (
1<
<n)
18734 function bnFlipBit(n) { return this.changeBit(n,op_xor); }
18736 // (protected) r = this + a
18737 function bnpAddTo(a,r) {
18740 var i =
0, c =
0, m = Math.min(a.t,self.t);
18743 r[i++] = c&self.DM;
18748 while(i < self.t) {
18750 r[i++] = c&self.DM;
18759 r[i++] = c&self.DM;
18765 if(c
> 0) r[i++] = c;
18766 else if(c < -
1) r[i++] = self.DV+c;
18771 // (public) this + a
18772 function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
18774 // (public) this - a
18775 function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
18777 // (public) this * a
18778 function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
18781 function bnSquare() { var r = nbi(); this.squareTo(r); return r; }
18783 // (public) this / a
18784 function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
18786 // (public) this % a
18787 function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
18789 // (public) [this/a,this%a]
18790 function bnDivideAndRemainder(a) {
18791 var q = nbi(), r = nbi();
18792 this.divRemTo(a,q,r);
18793 return new Array(q,r);
18796 // (protected) this *= n, this
>=
0,
1 < n < DV
18797 function bnpDMultiply(n) {
18798 this[this.t] = this.am(
0,n-
1,this,
0,
0,this.t);
18803 // (protected) this += n << w words, this
>=
0
18804 function bnpDAddOffset(n,w) {
18806 while(this.t <= w) this[this.t++] =
0;
18808 while(this[w]
>= this.DV) {
18809 this[w] -= this.DV;
18810 if(++w
>= this.t) this[this.t++] =
0;
18815 // A "null" reducer
18816 function NullExp() {}
18817 function nNop(x) { return x; }
18818 function nMulTo(x,y,r) { x.multiplyTo(y,r); }
18819 function nSqrTo(x,r) { x.squareTo(r); }
18821 NullExp.prototype.convert = nNop;
18822 NullExp.prototype.revert = nNop;
18823 NullExp.prototype.mulTo = nMulTo;
18824 NullExp.prototype.sqrTo = nSqrTo;
18827 function bnPow(e) { return this.exp(e,new NullExp()); }
18829 // (protected) r = lower n words of "this * a", a.t <= n
18830 // "this" should be the larger one if appropriate.
18831 function bnpMultiplyLowerTo(a,n,r) {
18832 var i = Math.min(this.t+a.t,n);
18833 r.s =
0; // assumes a,this
>=
0
18835 while(i
> 0) r[--i] =
0;
18837 for(j = r.t-this.t; i < j; ++i) r[i+this.t] = this.am(
0,a[i],r,i,
0,this.t);
18838 for(j = Math.min(a.t,n); i < j; ++i) this.am(
0,a[i],r,i,
0,n-i);
18842 // (protected) r =
"this * a" without lower n words, n
> 0
18843 //
"this" should be the larger one if appropriate.
18844 function bnpMultiplyUpperTo(a,n,r) {
18846 var i = r.t = this.t+a.t-n;
18847 r.s =
0; // assumes a,this
>=
0
18848 while(--i
>=
0) r[i] =
0;
18849 for(i = Math.max(n-this.t,
0); i < a.t; ++i)
18850 r[this.t+i-n] = this.am(n-i,a[i],r,
0,
0,this.t+i-n);
18855 // Barrett modular reduction
18856 function Barrett(m) {
18860 BigInteger.ONE.dlShiftTo(
2*m.t,this.r2);
18861 this.mu = this.r2.divide(m);
18865 function barrettConvert(x) {
18866 if(x.s <
0 || x.t
> 2*this.m.t) return x.mod(this.m);
18867 else if(x.compareTo(this.m) <
0) return x;
18868 else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
18871 function barrettRevert(x) { return x; }
18873 // x = x mod m (HAC
14.42)
18874 function barrettReduce(x) {
18876 x.drShiftTo(self.m.t-
1,self.r2);
18877 if(x.t
> self.m.t+
1) { x.t = self.m.t+
1; x.clamp(); }
18878 self.mu.multiplyUpperTo(self.r2,self.m.t+
1,self.q3);
18879 self.m.multiplyLowerTo(self.q3,self.m.t+
1,self.r2);
18880 while(x.compareTo(self.r2) <
0) x.dAddOffset(
1,self.m.t+
1);
18881 x.subTo(self.r2,x);
18882 while(x.compareTo(self.m)
>=
0) x.subTo(self.m,x);
18885 // r = x^
2 mod m; x != r
18886 function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
18888 // r = x*y mod m; x,y != r
18889 function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
18891 Barrett.prototype.convert = barrettConvert;
18892 Barrett.prototype.revert = barrettRevert;
18893 Barrett.prototype.reduce = barrettReduce;
18894 Barrett.prototype.mulTo = barrettMulTo;
18895 Barrett.prototype.sqrTo = barrettSqrTo;
18897 // (public) this^e % m (HAC
14.85)
18898 function bnModPow(e,m) {
18899 var i = e.bitLength(), k, r = nbv(
1), z;
18900 if(i <=
0) return r;
18901 else if(i <
18) k =
1;
18902 else if(i <
48) k =
3;
18903 else if(i <
144) k =
4;
18904 else if(i <
768) k =
5;
18907 z = new Classic(m);
18908 else if(m.isEven())
18909 z = new Barrett(m);
18911 z = new Montgomery(m);
18914 var g = new Array(), n =
3, k1 = k-
1, km = (
1<
<k)-
1;
18915 g[
1] = z.convert(this);
18921 z.mulTo(g2,g[n-
2],g[n]);
18926 var j = e.t-
1, w, is1 = true, r2 = nbi(), t;
18929 if(i
>= k1) w = (e[j]
>>(i-k1))
&km;
18931 w = (e[j]&((
1<<(i+
1))-
1))<<(k1-i);
18932 if(j
> 0) w |= e[j-
1]
>>(this.DB+i-k1);
18936 while((w&
1) ==
0) { w
>>=
1; --n; }
18937 if((i -= n) <
0) { i += this.DB; --j; }
18938 if(is1) { // ret ==
1, don't bother squaring or multiplying it
18943 while(n
> 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -=
2; }
18944 if(n
> 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
18945 z.mulTo(r2,g[w],r);
18948 while(j
>=
0 && (e[j]&(
1<
<i)) ==
0) {
18949 z.sqrTo(r,r2); t = r; r = r2; r2 = t;
18950 if(--i <
0) { i = this.DB-
1; --j; }
18953 return z.revert(r);
18956 // (public) gcd(this,a) (HAC
14.54)
18957 function bnGCD(a) {
18958 var x = (this.s
<0)?this.negate():this.clone();
18959 var y = (a.s
<0)?a.negate():a.clone();
18960 if(x.compareTo(y) <
0) { var t = x; x = y; y = t; }
18961 var i = x.getLowestSetBit(), g = y.getLowestSetBit();
18962 if(g <
0) return x;
18968 while(x.signum()
> 0) {
18969 if((i = x.getLowestSetBit())
> 0) x.rShiftTo(i,x);
18970 if((i = y.getLowestSetBit())
> 0) y.rShiftTo(i,y);
18971 if(x.compareTo(y)
>=
0) {
18980 if(g
> 0) y.lShiftTo(g,y);
18984 // (protected) this % n, n <
2^
26
18985 function bnpModInt(n) {
18986 if(n <=
0) return
0;
18987 var d = this.DV%n, r = (this.s
<0)?n-
1:
0;
18989 if(d ==
0) r = this[
0]%n;
18990 else for(var i = this.t-
1; i
>=
0; --i) r = (d*r+this[i])%n;
18994 // (public)
1/this % m (HAC
14.61)
18995 function bnModInverse(m) {
18996 var ac = m.isEven();
18997 if((this.isEven() && ac) || m.signum() ==
0) return BigInteger.ZERO;
18998 var u = m.clone(), v = this.clone();
18999 var a = nbv(
1), b = nbv(
0), c = nbv(
0), d = nbv(
1);
19000 while(u.signum() !=
0) {
19001 while(u.isEven()) {
19004 if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
19007 else if(!b.isEven()) b.subTo(m,b);
19010 while(v.isEven()) {
19013 if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
19016 else if(!d.isEven()) d.subTo(m,d);
19019 if(u.compareTo(v)
>=
0) {
19021 if(ac) a.subTo(c,a);
19026 if(ac) c.subTo(a,c);
19030 if(v.compareTo(BigInteger.ONE) !=
0) return BigInteger.ZERO;
19031 if(d.compareTo(m)
>=
0) return d.subtract(m);
19032 if(d.signum() <
0) d.addTo(m,d); else return d;
19033 if(d.signum() <
0) return d.add(m); else return d;
19037 proto.chunkSize = bnpChunkSize;
19038 proto.toRadix = bnpToRadix;
19039 proto.fromRadix = bnpFromRadix;
19040 proto.fromNumber = bnpFromNumber;
19041 proto.bitwiseTo = bnpBitwiseTo;
19042 proto.changeBit = bnpChangeBit;
19043 proto.addTo = bnpAddTo;
19044 proto.dMultiply = bnpDMultiply;
19045 proto.dAddOffset = bnpDAddOffset;
19046 proto.multiplyLowerTo = bnpMultiplyLowerTo;
19047 proto.multiplyUpperTo = bnpMultiplyUpperTo;
19048 proto.modInt = bnpModInt;
19051 proto.clone = bnClone;
19052 proto.intValue = bnIntValue;
19053 proto.byteValue = bnByteValue;
19054 proto.shortValue = bnShortValue;
19055 proto.signum = bnSigNum;
19056 proto.toByteArray = bnToByteArray;
19057 proto.equals = bnEquals;
19063 proto.andNot = bnAndNot;
19065 proto.shiftLeft = bnShiftLeft;
19066 proto.shiftRight = bnShiftRight;
19067 proto.getLowestSetBit = bnGetLowestSetBit;
19068 proto.bitCount = bnBitCount;
19069 proto.testBit = bnTestBit;
19070 proto.setBit = bnSetBit;
19071 proto.clearBit = bnClearBit;
19072 proto.flipBit = bnFlipBit;
19074 proto.subtract = bnSubtract;
19075 proto.multiply = bnMultiply;
19076 proto.divide = bnDivide;
19077 proto.remainder = bnRemainder;
19078 proto.divideAndRemainder = bnDivideAndRemainder;
19079 proto.modPow = bnModPow;
19080 proto.modInverse = bnModInverse;
19084 // JSBN-specific extension
19085 proto.square = bnSquare;
19087 // BigInteger interfaces not implemented in jsbn:
19089 // BigInteger(int signum, byte[] magnitude)
19090 // double doubleValue()
19091 // float floatValue()
19093 // long longValue()
19094 // static BigInteger valueOf(long val)
19097 BigInteger.ZERO = nbv(
0);
19098 BigInteger.ONE = nbv(
1);
19099 BigInteger.valueOf = nbv;
19101 },{"assert":
4}],
2:[function(_dereq_,module,exports){
19102 (function (Buffer){
19103 // FIXME: Kind of a weird way to throw exceptions, consider removing
19104 var assert = _dereq_('assert')
19105 var BigInteger = _dereq_('./bigi')
19108 * Turns a byte array into a big integer.
19110 * This function will interpret a byte array as a big integer in big
19113 BigInteger.fromByteArrayUnsigned = function(byteArray) {
19114 // BigInteger expects a DER integer conformant byte array
19115 if (byteArray[
0] &
0x80) {
19116 return new BigInteger([
0].concat(byteArray))
19119 return new BigInteger(byteArray)
19123 * Returns a byte array representation of the big integer.
19125 * This returns the absolute of the contained value in big endian
19126 * form. A value of zero results in an empty array.
19128 BigInteger.prototype.toByteArrayUnsigned = function() {
19129 var byteArray = this.toByteArray()
19130 return byteArray[
0] ===
0 ? byteArray.slice(
1) : byteArray
19133 BigInteger.fromDERInteger = function(byteArray) {
19134 return new BigInteger(byteArray)
19138 * Converts BigInteger to a DER integer representation.
19140 * The format for this value uses the most significant bit as a sign
19141 * bit. If the most significant bit is already set and the integer is
19142 * positive, a
0x00 is prepended.
19157 *
62300 =
> 0x00f35c
19160 BigInteger.prototype.toDERInteger = BigInteger.prototype.toByteArray
19162 BigInteger.fromBuffer = function(buffer) {
19163 // BigInteger expects a DER integer conformant byte array
19164 if (buffer[
0] &
0x80) {
19165 var byteArray = Array.prototype.slice.call(buffer)
19167 return new BigInteger([
0].concat(byteArray))
19170 return new BigInteger(buffer)
19173 BigInteger.fromHex = function(hex) {
19174 if (hex === '') return BigInteger.ZERO
19176 assert.equal(hex, hex.match(/^[A-Fa-f0-
9]+/), 'Invalid hex string')
19177 assert.equal(hex.length %
2,
0, 'Incomplete hex')
19178 return new BigInteger(hex,
16)
19181 BigInteger.prototype.toBuffer = function(size) {
19182 var byteArray = this.toByteArrayUnsigned()
19185 var padding = size - byteArray.length
19186 while (zeros.length < padding) zeros.push(
0)
19188 return new Buffer(zeros.concat(byteArray))
19191 BigInteger.prototype.toHex = function(size) {
19192 return this.toBuffer(size).toString('hex')
19195 }).call(this,_dereq_(
"buffer").Buffer)
19196 },{
"./bigi":
1,
"assert":
4,
"buffer":
8}],
3:[function(_dereq_,module,exports){
19197 var BigInteger = _dereq_('./bigi')
19200 _dereq_('./convert')
19202 module.exports = BigInteger
19203 },{
"./bigi":
1,
"./convert":
2}],
4:[function(_dereq_,module,exports){
19204 // http://wiki.commonjs.org/wiki/Unit_Testing/
1.0
19206 // THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
19208 // Originally from narwhal.js (http://narwhaljs.org)
19209 // Copyright (c)
2009 Thomas Robinson
<280north.com
>
19211 // Permission is hereby granted, free of charge, to any person obtaining a copy
19212 // of this software and associated documentation files (the 'Software'), to
19213 // deal in the Software without restriction, including without limitation the
19214 // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
19215 // sell copies of the Software, and to permit persons to whom the Software is
19216 // furnished to do so, subject to the following conditions:
19218 // The above copyright notice and this permission notice shall be included in
19219 // all copies or substantial portions of the Software.
19221 // THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19222 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19223 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19224 // AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
19225 // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
19226 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
19228 // when used in node, this will actually load the util module we depend on
19229 // versus loading the builtin util module as happens otherwise
19230 // this is a bug in node module loading as far as I am concerned
19231 var util = _dereq_('util/');
19233 var pSlice = Array.prototype.slice;
19234 var hasOwn = Object.prototype.hasOwnProperty;
19236 //
1. The assert module provides functions that throw
19237 // AssertionError's when particular conditions are not met. The
19238 // assert module must conform to the following interface.
19240 var assert = module.exports = ok;
19242 //
2. The AssertionError is defined in assert.
19243 // new assert.AssertionError({ message: message,
19245 // expected: expected })
19247 assert.AssertionError = function AssertionError(options) {
19248 this.name = 'AssertionError';
19249 this.actual = options.actual;
19250 this.expected = options.expected;
19251 this.operator = options.operator;
19252 if (options.message) {
19253 this.message = options.message;
19254 this.generatedMessage = false;
19256 this.message = getMessage(this);
19257 this.generatedMessage = true;
19259 var stackStartFunction = options.stackStartFunction || fail;
19261 if (Error.captureStackTrace) {
19262 Error.captureStackTrace(this, stackStartFunction);
19265 // non v8 browsers so we can have a stacktrace
19266 var err = new Error();
19268 var out = err.stack;
19270 // try to strip useless frames
19271 var fn_name = stackStartFunction.name;
19272 var idx = out.indexOf('\n' + fn_name);
19274 // once we have located the function frame
19275 // we need to strip out everything before it (and its line)
19276 var next_line = out.indexOf('\n', idx +
1);
19277 out = out.substring(next_line +
1);
19285 // assert.AssertionError instanceof Error
19286 util.inherits(assert.AssertionError, Error);
19288 function replacer(key, value) {
19289 if (util.isUndefined(value)) {
19292 if (util.isNumber(value) && (isNaN(value) || !isFinite(value))) {
19293 return value.toString();
19295 if (util.isFunction(value) || util.isRegExp(value)) {
19296 return value.toString();
19301 function truncate(s, n) {
19302 if (util.isString(s)) {
19303 return s.length < n ? s : s.slice(
0, n);
19309 function getMessage(self) {
19310 return truncate(JSON.stringify(self.actual, replacer),
128) + ' ' +
19311 self.operator + ' ' +
19312 truncate(JSON.stringify(self.expected, replacer),
128);
19315 // At present only the three keys mentioned above are used and
19316 // understood by the spec. Implementations or sub modules can pass
19317 // other keys to the AssertionError's constructor - they will be
19320 //
3. All of the following functions must throw an AssertionError
19321 // when a corresponding condition is not met, with a message that
19322 // may be undefined if not provided. All assertion methods provide
19323 // both the actual and expected values to the assertion error for
19324 // display purposes.
19326 function fail(actual, expected, message, operator, stackStartFunction) {
19327 throw new assert.AssertionError({
19330 expected: expected,
19331 operator: operator,
19332 stackStartFunction: stackStartFunction
19336 // EXTENSION! allows for well behaved errors defined elsewhere.
19337 assert.fail = fail;
19339 //
4. Pure assertion tests whether a value is truthy, as determined
19341 // assert.ok(guard, message_opt);
19342 // This statement is equivalent to assert.equal(true, !!guard,
19343 // message_opt);. To test strictly for the value true, use
19344 // assert.strictEqual(true, guard, message_opt);.
19346 function ok(value, message) {
19347 if (!value) fail(value, true, message, '==', assert.ok);
19351 //
5. The equality assertion tests shallow, coercive equality with
19353 // assert.equal(actual, expected, message_opt);
19355 assert.equal = function equal(actual, expected, message) {
19356 if (actual != expected) fail(actual, expected, message, '==', assert.equal);
19359 //
6. The non-equality assertion tests for whether two objects are not equal
19360 // with != assert.notEqual(actual, expected, message_opt);
19362 assert.notEqual = function notEqual(actual, expected, message) {
19363 if (actual == expected) {
19364 fail(actual, expected, message, '!=', assert.notEqual);
19368 //
7. The equivalence assertion tests a deep equality relation.
19369 // assert.deepEqual(actual, expected, message_opt);
19371 assert.deepEqual = function deepEqual(actual, expected, message) {
19372 if (!_deepEqual(actual, expected)) {
19373 fail(actual, expected, message, 'deepEqual', assert.deepEqual);
19377 function _deepEqual(actual, expected) {
19378 //
7.1. All identical values are equivalent, as determined by ===.
19379 if (actual === expected) {
19382 } else if (util.isBuffer(actual) && util.isBuffer(expected)) {
19383 if (actual.length != expected.length) return false;
19385 for (var i =
0; i < actual.length; i++) {
19386 if (actual[i] !== expected[i]) return false;
19391 //
7.2. If the expected value is a Date object, the actual value is
19392 // equivalent if it is also a Date object that refers to the same time.
19393 } else if (util.isDate(actual) && util.isDate(expected)) {
19394 return actual.getTime() === expected.getTime();
19396 //
7.3 If the expected value is a RegExp object, the actual value is
19397 // equivalent if it is also a RegExp object with the same source and
19398 // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
19399 } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
19400 return actual.source === expected.source &&
19401 actual.global === expected.global &&
19402 actual.multiline === expected.multiline &&
19403 actual.lastIndex === expected.lastIndex &&
19404 actual.ignoreCase === expected.ignoreCase;
19406 //
7.4. Other pairs that do not both pass typeof value == 'object',
19407 // equivalence is determined by ==.
19408 } else if (!util.isObject(actual) && !util.isObject(expected)) {
19409 return actual == expected;
19411 //
7.5 For all other Object pairs, including Array objects, equivalence is
19412 // determined by having the same number of owned properties (as verified
19413 // with Object.prototype.hasOwnProperty.call), the same set of keys
19414 // (although not necessarily the same order), equivalent values for every
19415 // corresponding key, and an identical 'prototype' property. Note: this
19416 // accounts for both named and indexed properties on Arrays.
19418 return objEquiv(actual, expected);
19422 function isArguments(object) {
19423 return Object.prototype.toString.call(object) == '[object Arguments]';
19426 function objEquiv(a, b) {
19427 if (util.isNullOrUndefined(a) || util.isNullOrUndefined(b))
19429 // an identical 'prototype' property.
19430 if (a.prototype !== b.prototype) return false;
19431 //~~~I've managed to break Object.keys through screwy arguments passing.
19432 // Converting to array solves the problem.
19433 if (isArguments(a)) {
19434 if (!isArguments(b)) {
19437 a = pSlice.call(a);
19438 b = pSlice.call(b);
19439 return _deepEqual(a, b);
19442 var ka = objectKeys(a),
19443 kb = objectKeys(b),
19445 } catch (e) {//happens when one is a string literal and the other isn't
19448 // having the same number of owned properties (keys incorporates
19450 if (ka.length != kb.length)
19452 //the same set of keys (although not necessarily the same order),
19455 //~~~cheap key test
19456 for (i = ka.length -
1; i
>=
0; i--) {
19457 if (ka[i] != kb[i])
19460 //equivalent values for every corresponding key, and
19461 //~~~possibly expensive deep test
19462 for (i = ka.length -
1; i
>=
0; i--) {
19464 if (!_deepEqual(a[key], b[key])) return false;
19469 //
8. The non-equivalence assertion tests for any deep inequality.
19470 // assert.notDeepEqual(actual, expected, message_opt);
19472 assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
19473 if (_deepEqual(actual, expected)) {
19474 fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
19478 //
9. The strict equality assertion tests strict equality, as determined by ===.
19479 // assert.strictEqual(actual, expected, message_opt);
19481 assert.strictEqual = function strictEqual(actual, expected, message) {
19482 if (actual !== expected) {
19483 fail(actual, expected, message, '===', assert.strictEqual);
19487 //
10. The strict non-equality assertion tests for strict inequality, as
19488 // determined by !==. assert.notStrictEqual(actual, expected, message_opt);
19490 assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
19491 if (actual === expected) {
19492 fail(actual, expected, message, '!==', assert.notStrictEqual);
19496 function expectedException(actual, expected) {
19497 if (!actual || !expected) {
19501 if (Object.prototype.toString.call(expected) == '[object RegExp]') {
19502 return expected.test(actual);
19503 } else if (actual instanceof expected) {
19505 } else if (expected.call({}, actual) === true) {
19512 function _throws(shouldThrow, block, expected, message) {
19515 if (util.isString(expected)) {
19516 message = expected;
19526 message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
19527 (message ? ' ' + message : '.');
19529 if (shouldThrow && !actual) {
19530 fail(actual, expected, 'Missing expected exception' + message);
19533 if (!shouldThrow && expectedException(actual, expected)) {
19534 fail(actual, expected, 'Got unwanted exception' + message);
19537 if ((shouldThrow && actual && expected &&
19538 !expectedException(actual, expected)) || (!shouldThrow && actual)) {
19543 //
11. Expected to throw an error:
19544 // assert.throws(block, Error_opt, message_opt);
19546 assert.throws = function(block, /*optional*/error, /*optional*/message) {
19547 _throws.apply(this, [true].concat(pSlice.call(arguments)));
19550 // EXTENSION! This is annoying to write outside this module.
19551 assert.doesNotThrow = function(block, /*optional*/message) {
19552 _throws.apply(this, [false].concat(pSlice.call(arguments)));
19555 assert.ifError = function(err) { if (err) {throw err;}};
19557 var objectKeys = Object.keys || function (obj) {
19559 for (var key in obj) {
19560 if (hasOwn.call(obj, key)) keys.push(key);
19565 },{"util/":
6}],
5:[function(_dereq_,module,exports){
19566 module.exports = function isBuffer(arg) {
19567 return arg && typeof arg === 'object'
19568 && typeof arg.copy === 'function'
19569 && typeof arg.fill === 'function'
19570 && typeof arg.readUInt8 === 'function';
19572 },{}],
6:[function(_dereq_,module,exports){
19573 (function (process,global){
19574 // Copyright Joyent, Inc. and other Node contributors.
19576 // Permission is hereby granted, free of charge, to any person obtaining a
19577 // copy of this software and associated documentation files (the
19578 // "Software"), to deal in the Software without restriction, including
19579 // without limitation the rights to use, copy, modify, merge, publish,
19580 // distribute, sublicense, and/or sell copies of the Software, and to permit
19581 // persons to whom the Software is furnished to do so, subject to the
19582 // following conditions:
19584 // The above copyright notice and this permission notice shall be included
19585 // in all copies or substantial portions of the Software.
19587 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19588 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19589 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
19590 // NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
19591 // DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19592 // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
19593 // USE OR OTHER DEALINGS IN THE SOFTWARE.
19595 var formatRegExp = /%[sdj%]/g;
19596 exports.format = function(f) {
19597 if (!isString(f)) {
19599 for (var i =
0; i < arguments.length; i++) {
19600 objects.push(inspect(arguments[i]));
19602 return objects.join(' ');
19606 var args = arguments;
19607 var len = args.length;
19608 var str = String(f).replace(formatRegExp, function(x) {
19609 if (x === '%%') return '%';
19610 if (i
>= len) return x;
19612 case '%s': return String(args[i++]);
19613 case '%d': return Number(args[i++]);
19616 return JSON.stringify(args[i++]);
19618 return '[Circular]';
19624 for (var x = args[i]; i < len; x = args[++i]) {
19625 if (isNull(x) || !isObject(x)) {
19628 str += ' ' + inspect(x);
19635 // Mark that a method should not be used.
19636 // Returns a modified function which warns once by default.
19637 // If --no-deprecation is set, then it is a no-op.
19638 exports.deprecate = function(fn, msg) {
19639 // Allow for deprecating things in the process of starting up.
19640 if (isUndefined(global.process)) {
19641 return function() {
19642 return exports.deprecate(fn, msg).apply(this, arguments);
19646 if (process.noDeprecation === true) {
19650 var warned = false;
19651 function deprecated() {
19653 if (process.throwDeprecation) {
19654 throw new Error(msg);
19655 } else if (process.traceDeprecation) {
19656 console.trace(msg);
19658 console.error(msg);
19662 return fn.apply(this, arguments);
19671 exports.debuglog = function(set) {
19672 if (isUndefined(debugEnviron))
19673 debugEnviron = process.env.NODE_DEBUG || '';
19674 set = set.toUpperCase();
19675 if (!debugs[set]) {
19676 if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
19677 var pid = process.pid;
19678 debugs[set] = function() {
19679 var msg = exports.format.apply(exports, arguments);
19680 console.error('%s %d: %s', set, pid, msg);
19683 debugs[set] = function() {};
19686 return debugs[set];
19691 * Echos the value of a value. Trys to print the value out
19692 * in the best way possible given the different types.
19694 * @param {Object} obj The object to print out.
19695 * @param {Object} opts Optional options object that alters the output.
19697 /* legacy: obj, showHidden, depth, colors*/
19698 function inspect(obj, opts) {
19702 stylize: stylizeNoColor
19705 if (arguments.length
>=
3) ctx.depth = arguments[
2];
19706 if (arguments.length
>=
4) ctx.colors = arguments[
3];
19707 if (isBoolean(opts)) {
19709 ctx.showHidden = opts;
19711 // got an "options" object
19712 exports._extend(ctx, opts);
19714 // set default options
19715 if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
19716 if (isUndefined(ctx.depth)) ctx.depth =
2;
19717 if (isUndefined(ctx.colors)) ctx.colors = false;
19718 if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
19719 if (ctx.colors) ctx.stylize = stylizeWithColor;
19720 return formatValue(ctx, obj, ctx.depth);
19722 exports.inspect = inspect;
19725 // http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
19728 'italic' : [
3,
23],
19729 'underline' : [
4,
24],
19730 'inverse' : [
7,
27],
19731 'white' : [
37,
39],
19733 'black' : [
30,
39],
19736 'green' : [
32,
39],
19737 'magenta' : [
35,
39],
19739 'yellow' : [
33,
39]
19742 // Don't use 'blue' not visible on cmd.exe
19745 'number': 'yellow',
19746 'boolean': 'yellow',
19747 'undefined': 'grey',
19751 // "name": intentionally not styling
19756 function stylizeWithColor(str, styleType) {
19757 var style = inspect.styles[styleType];
19760 return '\u001b[' + inspect.colors[style][
0] + 'm' + str +
19761 '\u001b[' + inspect.colors[style][
1] + 'm';
19768 function stylizeNoColor(str, styleType) {
19773 function arrayToHash(array) {
19776 array.forEach(function(val, idx) {
19784 function formatValue(ctx, value, recurseTimes) {
19785 // Provide a hook for user-specified inspect functions.
19786 // Check that value is an object with an inspect function on it
19787 if (ctx.customInspect &&
19789 isFunction(value.inspect) &&
19790 // Filter out the util module, it's inspect function is special
19791 value.inspect !== exports.inspect &&
19792 // Also filter out any prototype objects using the circular check.
19793 !(value.constructor && value.constructor.prototype === value)) {
19794 var ret = value.inspect(recurseTimes, ctx);
19795 if (!isString(ret)) {
19796 ret = formatValue(ctx, ret, recurseTimes);
19801 // Primitive types cannot have properties
19802 var primitive = formatPrimitive(ctx, value);
19807 // Look up the keys of the object.
19808 var keys = Object.keys(value);
19809 var visibleKeys = arrayToHash(keys);
19811 if (ctx.showHidden) {
19812 keys = Object.getOwnPropertyNames(value);
19815 // IE doesn't make error fields non-enumerable
19816 // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs
.94).aspx
19818 && (keys.indexOf('message')
>=
0 || keys.indexOf('description')
>=
0)) {
19819 return formatError(value);
19822 // Some type of object without properties can be shortcutted.
19823 if (keys.length ===
0) {
19824 if (isFunction(value)) {
19825 var name = value.name ? ': ' + value.name : '';
19826 return ctx.stylize('[Function' + name + ']', 'special');
19828 if (isRegExp(value)) {
19829 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
19831 if (isDate(value)) {
19832 return ctx.stylize(Date.prototype.toString.call(value), 'date');
19834 if (isError(value)) {
19835 return formatError(value);
19839 var base = '', array = false, braces = ['{', '}'];
19841 // Make Array say that they are Array
19842 if (isArray(value)) {
19844 braces = ['[', ']'];
19847 // Make functions say that they are functions
19848 if (isFunction(value)) {
19849 var n = value.name ? ': ' + value.name : '';
19850 base = ' [Function' + n + ']';
19853 // Make RegExps say that they are RegExps
19854 if (isRegExp(value)) {
19855 base = ' ' + RegExp.prototype.toString.call(value);
19858 // Make dates with properties first say the date
19859 if (isDate(value)) {
19860 base = ' ' + Date.prototype.toUTCString.call(value);
19863 // Make error with message first say the error
19864 if (isError(value)) {
19865 base = ' ' + formatError(value);
19868 if (keys.length ===
0 && (!array || value.length ==
0)) {
19869 return braces[
0] + base + braces[
1];
19872 if (recurseTimes <
0) {
19873 if (isRegExp(value)) {
19874 return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
19876 return ctx.stylize('[Object]', 'special');
19880 ctx.seen.push(value);
19884 output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
19886 output = keys.map(function(key) {
19887 return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
19893 return reduceToSingleString(output, base, braces);
19897 function formatPrimitive(ctx, value) {
19898 if (isUndefined(value))
19899 return ctx.stylize('undefined', 'undefined');
19900 if (isString(value)) {
19901 var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
19902 .replace(/'/g, "\\'")
19903 .replace(/\\"/g, '"') + '\'';
19904 return ctx.stylize(simple, 'string');
19906 if (isNumber(value))
19907 return ctx.stylize('' + value, 'number');
19908 if (isBoolean(value))
19909 return ctx.stylize('' + value, 'boolean');
19910 // For some reason typeof null is "object", so special case here.
19912 return ctx.stylize('null', 'null');
19916 function formatError(value) {
19917 return '[' + Error.prototype.toString.call(value) + ']';
19921 function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
19923 for (var i =
0, l = value.length; i < l; ++i) {
19924 if (hasOwnProperty(value, String(i))) {
19925 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
19931 keys.forEach(function(key) {
19932 if (!key.match(/^\d+$/)) {
19933 output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
19941 function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
19942 var name, str, desc;
19943 desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
19946 str = ctx.stylize('[Getter/Setter]', 'special');
19948 str = ctx.stylize('[Getter]', 'special');
19952 str = ctx.stylize('[Setter]', 'special');
19955 if (!hasOwnProperty(visibleKeys, key)) {
19956 name = '[' + key + ']';
19959 if (ctx.seen.indexOf(desc.value) <
0) {
19960 if (isNull(recurseTimes)) {
19961 str = formatValue(ctx, desc.value, null);
19963 str = formatValue(ctx, desc.value, recurseTimes -
1);
19965 if (str.indexOf('\n')
> -
1) {
19967 str = str.split('\n').map(function(line) {
19969 }).join('\n').substr(
2);
19971 str = '\n' + str.split('\n').map(function(line) {
19977 str = ctx.stylize('[Circular]', 'special');
19980 if (isUndefined(name)) {
19981 if (array && key.match(/^\d+$/)) {
19984 name = JSON.stringify('' + key);
19985 if (name.match(/^"([a-zA-Z_][a-zA-Z_0-
9]*)"$/)) {
19986 name = name.substr(
1, name.length -
2);
19987 name = ctx.stylize(name, 'name');
19989 name = name.replace(/'/g, "\\'")
19990 .replace(/\\"/g, '"')
19991 .replace(/(^"|"$)/g, "'");
19992 name = ctx.stylize(name, 'string');
19996 return name + ': ' + str;
20000 function reduceToSingleString(output, base, braces) {
20001 var numLinesEst =
0;
20002 var length = output.reduce(function(prev, cur) {
20004 if (cur.indexOf('\n')
>=
0) numLinesEst++;
20005 return prev + cur.replace(/\u001b\[\d\d?m/g, '').length +
1;
20010 (base === '' ? '' : base + '\n ') +
20012 output.join(',\n ') +
20017 return braces[
0] + base + ' ' + output.join(', ') + ' ' + braces[
1];
20021 // NOTE: These type checking functions intentionally don't use `instanceof`
20022 // because it is fragile and can be easily faked with `Object.create()`.
20023 function isArray(ar) {
20024 return Array.isArray(ar);
20026 exports.isArray = isArray;
20028 function isBoolean(arg) {
20029 return typeof arg === 'boolean';
20031 exports.isBoolean = isBoolean;
20033 function isNull(arg) {
20034 return arg === null;
20036 exports.isNull = isNull;
20038 function isNullOrUndefined(arg) {
20039 return arg == null;
20041 exports.isNullOrUndefined = isNullOrUndefined;
20043 function isNumber(arg) {
20044 return typeof arg === 'number';
20046 exports.isNumber = isNumber;
20048 function isString(arg) {
20049 return typeof arg === 'string';
20051 exports.isString = isString;
20053 function isSymbol(arg) {
20054 return typeof arg === 'symbol';
20056 exports.isSymbol = isSymbol;
20058 function isUndefined(arg) {
20059 return arg === void
0;
20061 exports.isUndefined = isUndefined;
20063 function isRegExp(re) {
20064 return isObject(re) && objectToString(re) === '[object RegExp]';
20066 exports.isRegExp = isRegExp;
20068 function isObject(arg) {
20069 return typeof arg === 'object' && arg !== null;
20071 exports.isObject = isObject;
20073 function isDate(d) {
20074 return isObject(d) && objectToString(d) === '[object Date]';
20076 exports.isDate = isDate;
20078 function isError(e) {
20079 return isObject(e) &&
20080 (objectToString(e) === '[object Error]' || e instanceof Error);
20082 exports.isError = isError;
20084 function isFunction(arg) {
20085 return typeof arg === 'function';
20087 exports.isFunction = isFunction;
20089 function isPrimitive(arg) {
20090 return arg === null ||
20091 typeof arg === 'boolean' ||
20092 typeof arg === 'number' ||
20093 typeof arg === 'string' ||
20094 typeof arg === 'symbol' || // ES6 symbol
20095 typeof arg === 'undefined';
20097 exports.isPrimitive = isPrimitive;
20099 exports.isBuffer = _dereq_('./support/isBuffer');
20101 function objectToString(o) {
20102 return Object.prototype.toString.call(o);
20107 return n <
10 ? '
0' + n.toString(
10) : n.toString(
10);
20111 var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
20112 'Oct', 'Nov', 'Dec'];
20115 function timestamp() {
20116 var d = new Date();
20117 var time = [pad(d.getHours()),
20118 pad(d.getMinutes()),
20119 pad(d.getSeconds())].join(':');
20120 return [d.getDate(), months[d.getMonth()], time].join(' ');
20124 // log is just a thin wrapper to console.log that prepends a timestamp
20125 exports.log = function() {
20126 console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
20131 * Inherit the prototype methods from one constructor into another.
20133 * The Function.prototype.inherits from lang.js rewritten as a standalone
20134 * function (not on Function.prototype). NOTE: If this file is to be loaded
20135 * during bootstrapping this function needs to be rewritten using some native
20136 * functions as prototype setup using normal JavaScript does not work as
20137 * expected during bootstrapping (see mirror.js in r114903).
20139 * @param {function} ctor Constructor function which needs to inherit the
20141 * @param {function} superCtor Constructor function to inherit prototype from.
20143 exports.inherits = _dereq_('inherits');
20145 exports._extend = function(origin, add) {
20146 // Don't do anything if add isn't an object
20147 if (!add || !isObject(add)) return origin;
20149 var keys = Object.keys(add);
20150 var i = keys.length;
20152 origin[keys[i]] = add[keys[i]];
20157 function hasOwnProperty(obj, prop) {
20158 return Object.prototype.hasOwnProperty.call(obj, prop);
20161 }).call(this,_dereq_(
"FWaASH"),typeof self !==
"undefined" ? self : typeof window !==
"undefined" ? window : {})
20162 },{
"./support/isBuffer":
5,
"FWaASH":
12,
"inherits":
11}],
7:[function(_dereq_,module,exports){
20164 },{}],
8:[function(_dereq_,module,exports){
20166 * The buffer module from node.js, for the browser.
20168 * at author Feross Aboukhadijeh
<feross@feross.org
> <http://feross.org
>
20172 var base64 = _dereq_('base64-js')
20173 var ieee754 = _dereq_('ieee754')
20175 exports.Buffer = Buffer
20176 exports.SlowBuffer = Buffer
20177 exports.INSPECT_MAX_BYTES =
50
20178 Buffer.poolSize =
8192
20181 * If `Buffer._useTypedArrays`:
20182 * === true Use Uint8Array implementation (fastest)
20183 * === false Use Object implementation (compatible down to IE6)
20185 Buffer._useTypedArrays = (function () {
20186 // Detect if browser supports Typed Arrays. Supported browsers are IE
10+, Firefox
4+,
20187 // Chrome
7+, Safari
5.1+, Opera
11.6+, iOS
4.2+. If the browser does not support adding
20188 // properties to `Uint8Array` instances, then that's the same as no `Uint8Array` support
20189 // because we need to be able to add all the node Buffer API methods. This is an issue
20190 // in Firefox
4-
29. Now fixed: https://bugzilla.mozilla.org/show_bug.cgi?id=
695438
20192 var buf = new ArrayBuffer(
0)
20193 var arr = new Uint8Array(buf)
20194 arr.foo = function () { return
42 }
20195 return
42 === arr.foo() &&
20196 typeof arr.subarray === 'function' // Chrome
9-
10 lack `subarray`
20206 * The Buffer constructor returns instances of `Uint8Array` that are augmented
20207 * with function properties for all the node `Buffer` API functions. We use
20208 * `Uint8Array` so that square bracket notation works as expected -- it returns
20211 * By augmenting the instances, we can avoid modifying the `Uint8Array`
20214 function Buffer (subject, encoding, noZero) {
20215 if (!(this instanceof Buffer))
20216 return new Buffer(subject, encoding, noZero)
20218 var type = typeof subject
20220 if (encoding === 'base64' && type === 'string') {
20221 subject = base64clean(subject)
20226 if (type === 'number')
20227 length = coerce(subject)
20228 else if (type === 'string')
20229 length = Buffer.byteLength(subject, encoding)
20230 else if (type === 'object')
20231 length = coerce(subject.length) // assume that object is array-like
20233 throw new Error('First argument needs to be a number, array or string.')
20236 if (Buffer._useTypedArrays) {
20237 // Preferred: Return an augmented `Uint8Array` instance for best performance
20238 buf = Buffer._augment(new Uint8Array(length))
20240 // Fallback: Return THIS instance of Buffer (created by `new`)
20242 buf.length = length
20243 buf._isBuffer = true
20247 if (Buffer._useTypedArrays && typeof subject.byteLength === 'number') {
20248 // Speed optimization -- use set if we're copying from a typed array
20250 } else if (isArrayish(subject)) {
20251 // Treat array-ish objects as a byte array
20252 if (Buffer.isBuffer(subject)) {
20253 for (i =
0; i < length; i++)
20254 buf[i] = subject.readUInt8(i)
20256 for (i =
0; i < length; i++)
20257 buf[i] = ((subject[i] %
256) +
256) %
256
20259 } else if (type === 'string') {
20260 buf.write(subject,
0, encoding)
20261 } else if (type === 'number' && !Buffer._useTypedArrays && !noZero) {
20262 for (i =
0; i < length; i++) {
20273 Buffer.isEncoding = function (encoding) {
20274 switch (String(encoding).toLowerCase()) {
20292 Buffer.isBuffer = function (b) {
20293 return !!(b !== null && b !== undefined && b._isBuffer)
20296 Buffer.byteLength = function (str, encoding) {
20298 str = str.toString()
20299 switch (encoding || 'utf8') {
20301 ret = str.length /
2
20305 ret = utf8ToBytes(str).length
20313 ret = base64ToBytes(str).length
20319 ret = str.length *
2
20322 throw new Error('Unknown encoding')
20327 Buffer.concat = function (list, totalLength) {
20328 assert(isArray(list), 'Usage: Buffer.concat(list[, length])')
20330 if (list.length ===
0) {
20331 return new Buffer(
0)
20332 } else if (list.length ===
1) {
20337 if (totalLength === undefined) {
20339 for (i =
0; i < list.length; i++) {
20340 totalLength += list[i].length
20344 var buf = new Buffer(totalLength)
20346 for (i =
0; i < list.length; i++) {
20348 item.copy(buf, pos)
20354 Buffer.compare = function (a, b) {
20355 assert(Buffer.isBuffer(a) && Buffer.isBuffer(b), 'Arguments must be Buffers')
20358 for (var i =
0, len = Math.min(x, y); i < len && a[i] === b[i]; i++) {}
20372 // BUFFER INSTANCE METHODS
20373 // =======================
20375 function hexWrite (buf, string, offset, length) {
20376 offset = Number(offset) ||
0
20377 var remaining = buf.length - offset
20381 length = Number(length)
20382 if (length
> remaining) {
20387 // must be an even number of digits
20388 var strLen = string.length
20389 assert(strLen %
2 ===
0, 'Invalid hex string')
20391 if (length
> strLen /
2) {
20392 length = strLen /
2
20394 for (var i =
0; i < length; i++) {
20395 var byte = parseInt(string.substr(i *
2,
2),
16)
20396 assert(!isNaN(byte), 'Invalid hex string')
20397 buf[offset + i] = byte
20402 function utf8Write (buf, string, offset, length) {
20403 var charsWritten = blitBuffer(utf8ToBytes(string), buf, offset, length)
20404 return charsWritten
20407 function asciiWrite (buf, string, offset, length) {
20408 var charsWritten = blitBuffer(asciiToBytes(string), buf, offset, length)
20409 return charsWritten
20412 function binaryWrite (buf, string, offset, length) {
20413 return asciiWrite(buf, string, offset, length)
20416 function base64Write (buf, string, offset, length) {
20417 var charsWritten = blitBuffer(base64ToBytes(string), buf, offset, length)
20418 return charsWritten
20421 function utf16leWrite (buf, string, offset, length) {
20422 var charsWritten = blitBuffer(utf16leToBytes(string), buf, offset, length)
20423 return charsWritten
20426 Buffer.prototype.write = function (string, offset, length, encoding) {
20427 // Support both (string, offset, length, encoding)
20428 // and the legacy (string, encoding, offset, length)
20429 if (isFinite(offset)) {
20430 if (!isFinite(length)) {
20435 var swap = encoding
20441 offset = Number(offset) ||
0
20442 var remaining = this.length - offset
20446 length = Number(length)
20447 if (length
> remaining) {
20451 encoding = String(encoding || 'utf8').toLowerCase()
20454 switch (encoding) {
20456 ret = hexWrite(this, string, offset, length)
20460 ret = utf8Write(this, string, offset, length)
20463 ret = asciiWrite(this, string, offset, length)
20466 ret = binaryWrite(this, string, offset, length)
20469 ret = base64Write(this, string, offset, length)
20475 ret = utf16leWrite(this, string, offset, length)
20478 throw new Error('Unknown encoding')
20483 Buffer.prototype.toString = function (encoding, start, end) {
20486 encoding = String(encoding || 'utf8').toLowerCase()
20487 start = Number(start) ||
0
20488 end = (end === undefined) ? self.length : Number(end)
20490 // Fastpath empty strings
20495 switch (encoding) {
20497 ret = hexSlice(self, start, end)
20501 ret = utf8Slice(self, start, end)
20504 ret = asciiSlice(self, start, end)
20507 ret = binarySlice(self, start, end)
20510 ret = base64Slice(self, start, end)
20516 ret = utf16leSlice(self, start, end)
20519 throw new Error('Unknown encoding')
20524 Buffer.prototype.toJSON = function () {
20527 data: Array.prototype.slice.call(this._arr || this,
0)
20531 Buffer.prototype.equals = function (b) {
20532 assert(Buffer.isBuffer(b), 'Argument must be a Buffer')
20533 return Buffer.compare(this, b) ===
0
20536 Buffer.prototype.compare = function (b) {
20537 assert(Buffer.isBuffer(b), 'Argument must be a Buffer')
20538 return Buffer.compare(this, b)
20541 // copy(targetBuffer, targetStart=
0, sourceStart=
0, sourceEnd=buffer.length)
20542 Buffer.prototype.copy = function (target, target_start, start, end) {
20545 if (!start) start =
0
20546 if (!end && end !==
0) end = this.length
20547 if (!target_start) target_start =
0
20549 // Copy
0 bytes; we're done
20550 if (end === start) return
20551 if (target.length ===
0 || source.length ===
0) return
20553 // Fatal error conditions
20554 assert(end
>= start, 'sourceEnd < sourceStart')
20555 assert(target_start
>=
0 && target_start < target.length,
20556 'targetStart out of bounds')
20557 assert(start
>=
0 && start < source.length, 'sourceStart out of bounds')
20558 assert(end
>=
0 && end <= source.length, 'sourceEnd out of bounds')
20561 if (end
> this.length)
20563 if (target.length - target_start < end - start)
20564 end = target.length - target_start + start
20566 var len = end - start
20568 if (len <
100 || !Buffer._useTypedArrays) {
20569 for (var i =
0; i < len; i++) {
20570 target[i + target_start] = this[i + start]
20573 target._set(this.subarray(start, start + len), target_start)
20577 function base64Slice (buf, start, end) {
20578 if (start ===
0 && end === buf.length) {
20579 return base64.fromByteArray(buf)
20581 return base64.fromByteArray(buf.slice(start, end))
20585 function utf8Slice (buf, start, end) {
20588 end = Math.min(buf.length, end)
20590 for (var i = start; i < end; i++) {
20591 if (buf[i] <=
0x7F) {
20592 res += decodeUtf8Char(tmp) + String.fromCharCode(buf[i])
20595 tmp += '%' + buf[i].toString(
16)
20599 return res + decodeUtf8Char(tmp)
20602 function asciiSlice (buf, start, end) {
20604 end = Math.min(buf.length, end)
20606 for (var i = start; i < end; i++) {
20607 ret += String.fromCharCode(buf[i])
20612 function binarySlice (buf, start, end) {
20613 return asciiSlice(buf, start, end)
20616 function hexSlice (buf, start, end) {
20617 var len = buf.length
20619 if (!start || start <
0) start =
0
20620 if (!end || end <
0 || end
> len) end = len
20623 for (var i = start; i < end; i++) {
20624 out += toHex(buf[i])
20629 function utf16leSlice (buf, start, end) {
20630 var bytes = buf.slice(start, end)
20632 for (var i =
0; i < bytes.length; i +=
2) {
20633 res += String.fromCharCode(bytes[i] + bytes[i +
1] *
256)
20638 Buffer.prototype.slice = function (start, end) {
20639 var len = this.length
20640 start = clamp(start, len,
0)
20641 end = clamp(end, len, len)
20643 if (Buffer._useTypedArrays) {
20644 return Buffer._augment(this.subarray(start, end))
20646 var sliceLen = end - start
20647 var newBuf = new Buffer(sliceLen, undefined, true)
20648 for (var i =
0; i < sliceLen; i++) {
20649 newBuf[i] = this[i + start]
20655 // `get` will be removed in Node
0.13+
20656 Buffer.prototype.get = function (offset) {
20657 console.log('.get() is deprecated. Access using array indexes instead.')
20658 return this.readUInt8(offset)
20661 // `set` will be removed in Node
0.13+
20662 Buffer.prototype.set = function (v, offset) {
20663 console.log('.set() is deprecated. Access using array indexes instead.')
20664 return this.writeUInt8(v, offset)
20667 Buffer.prototype.readUInt8 = function (offset, noAssert) {
20669 assert(offset !== undefined && offset !== null, 'missing offset')
20670 assert(offset < this.length, 'Trying to read beyond buffer length')
20673 if (offset
>= this.length)
20676 return this[offset]
20679 function readUInt16 (buf, offset, littleEndian, noAssert) {
20681 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20682 assert(offset !== undefined && offset !== null, 'missing offset')
20683 assert(offset +
1 < buf.length, 'Trying to read beyond buffer length')
20686 var len = buf.length
20691 if (littleEndian) {
20693 if (offset +
1 < len)
20694 val |= buf[offset +
1] <<
8
20696 val = buf[offset] <<
8
20697 if (offset +
1 < len)
20698 val |= buf[offset +
1]
20703 Buffer.prototype.readUInt16LE = function (offset, noAssert) {
20704 return readUInt16(this, offset, true, noAssert)
20707 Buffer.prototype.readUInt16BE = function (offset, noAssert) {
20708 return readUInt16(this, offset, false, noAssert)
20711 function readUInt32 (buf, offset, littleEndian, noAssert) {
20713 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20714 assert(offset !== undefined && offset !== null, 'missing offset')
20715 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20718 var len = buf.length
20723 if (littleEndian) {
20724 if (offset +
2 < len)
20725 val = buf[offset +
2] <<
16
20726 if (offset +
1 < len)
20727 val |= buf[offset +
1] <<
8
20729 if (offset +
3 < len)
20730 val = val + (buf[offset +
3] <<
24 >>> 0)
20732 if (offset +
1 < len)
20733 val = buf[offset +
1] <<
16
20734 if (offset +
2 < len)
20735 val |= buf[offset +
2] <<
8
20736 if (offset +
3 < len)
20737 val |= buf[offset +
3]
20738 val = val + (buf[offset] <<
24 >>> 0)
20743 Buffer.prototype.readUInt32LE = function (offset, noAssert) {
20744 return readUInt32(this, offset, true, noAssert)
20747 Buffer.prototype.readUInt32BE = function (offset, noAssert) {
20748 return readUInt32(this, offset, false, noAssert)
20751 Buffer.prototype.readInt8 = function (offset, noAssert) {
20753 assert(offset !== undefined && offset !== null,
20755 assert(offset < this.length, 'Trying to read beyond buffer length')
20758 if (offset
>= this.length)
20761 var neg = this[offset] &
0x80
20763 return (
0xff - this[offset] +
1) * -
1
20765 return this[offset]
20768 function readInt16 (buf, offset, littleEndian, noAssert) {
20770 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20771 assert(offset !== undefined && offset !== null, 'missing offset')
20772 assert(offset +
1 < buf.length, 'Trying to read beyond buffer length')
20775 var len = buf.length
20779 var val = readUInt16(buf, offset, littleEndian, true)
20780 var neg = val &
0x8000
20782 return (
0xffff - val +
1) * -
1
20787 Buffer.prototype.readInt16LE = function (offset, noAssert) {
20788 return readInt16(this, offset, true, noAssert)
20791 Buffer.prototype.readInt16BE = function (offset, noAssert) {
20792 return readInt16(this, offset, false, noAssert)
20795 function readInt32 (buf, offset, littleEndian, noAssert) {
20797 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20798 assert(offset !== undefined && offset !== null, 'missing offset')
20799 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20802 var len = buf.length
20806 var val = readUInt32(buf, offset, littleEndian, true)
20807 var neg = val &
0x80000000
20809 return (
0xffffffff - val +
1) * -
1
20814 Buffer.prototype.readInt32LE = function (offset, noAssert) {
20815 return readInt32(this, offset, true, noAssert)
20818 Buffer.prototype.readInt32BE = function (offset, noAssert) {
20819 return readInt32(this, offset, false, noAssert)
20822 function readFloat (buf, offset, littleEndian, noAssert) {
20824 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20825 assert(offset +
3 < buf.length, 'Trying to read beyond buffer length')
20828 return ieee754.read(buf, offset, littleEndian,
23,
4)
20831 Buffer.prototype.readFloatLE = function (offset, noAssert) {
20832 return readFloat(this, offset, true, noAssert)
20835 Buffer.prototype.readFloatBE = function (offset, noAssert) {
20836 return readFloat(this, offset, false, noAssert)
20839 function readDouble (buf, offset, littleEndian, noAssert) {
20841 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20842 assert(offset +
7 < buf.length, 'Trying to read beyond buffer length')
20845 return ieee754.read(buf, offset, littleEndian,
52,
8)
20848 Buffer.prototype.readDoubleLE = function (offset, noAssert) {
20849 return readDouble(this, offset, true, noAssert)
20852 Buffer.prototype.readDoubleBE = function (offset, noAssert) {
20853 return readDouble(this, offset, false, noAssert)
20856 Buffer.prototype.writeUInt8 = function (value, offset, noAssert) {
20858 assert(value !== undefined && value !== null, 'missing value')
20859 assert(offset !== undefined && offset !== null, 'missing offset')
20860 assert(offset < this.length, 'trying to write beyond buffer length')
20861 verifuint(value,
0xff)
20864 if (offset
>= this.length) return
20866 this[offset] = value
20870 function writeUInt16 (buf, value, offset, littleEndian, noAssert) {
20872 assert(value !== undefined && value !== null, 'missing value')
20873 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20874 assert(offset !== undefined && offset !== null, 'missing offset')
20875 assert(offset +
1 < buf.length, 'trying to write beyond buffer length')
20876 verifuint(value,
0xffff)
20879 var len = buf.length
20883 for (var i =
0, j = Math.min(len - offset,
2); i < j; i++) {
20885 (value & (
0xff << (
8 * (littleEndian ? i :
1 - i))))
>>>
20886 (littleEndian ? i :
1 - i) *
8
20891 Buffer.prototype.writeUInt16LE = function (value, offset, noAssert) {
20892 return writeUInt16(this, value, offset, true, noAssert)
20895 Buffer.prototype.writeUInt16BE = function (value, offset, noAssert) {
20896 return writeUInt16(this, value, offset, false, noAssert)
20899 function writeUInt32 (buf, value, offset, littleEndian, noAssert) {
20901 assert(value !== undefined && value !== null, 'missing value')
20902 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20903 assert(offset !== undefined && offset !== null, 'missing offset')
20904 assert(offset +
3 < buf.length, 'trying to write beyond buffer length')
20905 verifuint(value,
0xffffffff)
20908 var len = buf.length
20912 for (var i =
0, j = Math.min(len - offset,
4); i < j; i++) {
20914 (value
>>> (littleEndian ? i :
3 - i) *
8) &
0xff
20919 Buffer.prototype.writeUInt32LE = function (value, offset, noAssert) {
20920 return writeUInt32(this, value, offset, true, noAssert)
20923 Buffer.prototype.writeUInt32BE = function (value, offset, noAssert) {
20924 return writeUInt32(this, value, offset, false, noAssert)
20927 Buffer.prototype.writeInt8 = function (value, offset, noAssert) {
20929 assert(value !== undefined && value !== null, 'missing value')
20930 assert(offset !== undefined && offset !== null, 'missing offset')
20931 assert(offset < this.length, 'Trying to write beyond buffer length')
20932 verifsint(value,
0x7f, -
0x80)
20935 if (offset
>= this.length)
20939 this.writeUInt8(value, offset, noAssert)
20941 this.writeUInt8(
0xff + value +
1, offset, noAssert)
20945 function writeInt16 (buf, value, offset, littleEndian, noAssert) {
20947 assert(value !== undefined && value !== null, 'missing value')
20948 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20949 assert(offset !== undefined && offset !== null, 'missing offset')
20950 assert(offset +
1 < buf.length, 'Trying to write beyond buffer length')
20951 verifsint(value,
0x7fff, -
0x8000)
20954 var len = buf.length
20959 writeUInt16(buf, value, offset, littleEndian, noAssert)
20961 writeUInt16(buf,
0xffff + value +
1, offset, littleEndian, noAssert)
20965 Buffer.prototype.writeInt16LE = function (value, offset, noAssert) {
20966 return writeInt16(this, value, offset, true, noAssert)
20969 Buffer.prototype.writeInt16BE = function (value, offset, noAssert) {
20970 return writeInt16(this, value, offset, false, noAssert)
20973 function writeInt32 (buf, value, offset, littleEndian, noAssert) {
20975 assert(value !== undefined && value !== null, 'missing value')
20976 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
20977 assert(offset !== undefined && offset !== null, 'missing offset')
20978 assert(offset +
3 < buf.length, 'Trying to write beyond buffer length')
20979 verifsint(value,
0x7fffffff, -
0x80000000)
20982 var len = buf.length
20987 writeUInt32(buf, value, offset, littleEndian, noAssert)
20989 writeUInt32(buf,
0xffffffff + value +
1, offset, littleEndian, noAssert)
20993 Buffer.prototype.writeInt32LE = function (value, offset, noAssert) {
20994 return writeInt32(this, value, offset, true, noAssert)
20997 Buffer.prototype.writeInt32BE = function (value, offset, noAssert) {
20998 return writeInt32(this, value, offset, false, noAssert)
21001 function writeFloat (buf, value, offset, littleEndian, noAssert) {
21003 assert(value !== undefined && value !== null, 'missing value')
21004 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
21005 assert(offset !== undefined && offset !== null, 'missing offset')
21006 assert(offset +
3 < buf.length, 'Trying to write beyond buffer length')
21007 verifIEEE754(value,
3.4028234663852886e+38, -
3.4028234663852886e+38)
21010 var len = buf.length
21014 ieee754.write(buf, value, offset, littleEndian,
23,
4)
21018 Buffer.prototype.writeFloatLE = function (value, offset, noAssert) {
21019 return writeFloat(this, value, offset, true, noAssert)
21022 Buffer.prototype.writeFloatBE = function (value, offset, noAssert) {
21023 return writeFloat(this, value, offset, false, noAssert)
21026 function writeDouble (buf, value, offset, littleEndian, noAssert) {
21028 assert(value !== undefined && value !== null, 'missing value')
21029 assert(typeof littleEndian === 'boolean', 'missing or invalid endian')
21030 assert(offset !== undefined && offset !== null, 'missing offset')
21031 assert(offset +
7 < buf.length,
21032 'Trying to write beyond buffer length')
21033 verifIEEE754(value,
1.7976931348623157E+308, -
1.7976931348623157E+308)
21036 var len = buf.length
21040 ieee754.write(buf, value, offset, littleEndian,
52,
8)
21044 Buffer.prototype.writeDoubleLE = function (value, offset, noAssert) {
21045 return writeDouble(this, value, offset, true, noAssert)
21048 Buffer.prototype.writeDoubleBE = function (value, offset, noAssert) {
21049 return writeDouble(this, value, offset, false, noAssert)
21052 // fill(value, start=
0, end=buffer.length)
21053 Buffer.prototype.fill = function (value, start, end) {
21054 if (!value) value =
0
21055 if (!start) start =
0
21056 if (!end) end = this.length
21058 assert(end
>= start, 'end < start')
21060 // Fill
0 bytes; we're done
21061 if (end === start) return
21062 if (this.length ===
0) return
21064 assert(start
>=
0 && start < this.length, 'start out of bounds')
21065 assert(end
>=
0 && end <= this.length, 'end out of bounds')
21068 if (typeof value === 'number') {
21069 for (i = start; i < end; i++) {
21073 var bytes = utf8ToBytes(value.toString())
21074 var len = bytes.length
21075 for (i = start; i < end; i++) {
21076 this[i] = bytes[i % len]
21083 Buffer.prototype.inspect = function () {
21085 var len = this.length
21086 for (var i =
0; i < len; i++) {
21087 out[i] = toHex(this[i])
21088 if (i === exports.INSPECT_MAX_BYTES) {
21093 return '
<Buffer ' + out.join(' ') + '
>'
21097 * Creates a new `ArrayBuffer` with the *copied* memory of the buffer instance.
21098 * Added in Node
0.12. Only available in browsers that support ArrayBuffer.
21100 Buffer.prototype.toArrayBuffer = function () {
21101 if (typeof Uint8Array !== 'undefined') {
21102 if (Buffer._useTypedArrays) {
21103 return (new Buffer(this)).buffer
21105 var buf = new Uint8Array(this.length)
21106 for (var i =
0, len = buf.length; i < len; i +=
1) {
21112 throw new Error('Buffer.toArrayBuffer not supported in this browser')
21116 // HELPER FUNCTIONS
21117 // ================
21119 var BP = Buffer.prototype
21122 * Augment a Uint8Array *instance* (not the Uint8Array class!) with Buffer methods
21124 Buffer._augment = function (arr) {
21125 arr._isBuffer = true
21127 // save reference to original Uint8Array get/set methods before overwriting
21131 // deprecated, will be removed in node
0.13+
21135 arr.write = BP.write
21136 arr.toString = BP.toString
21137 arr.toLocaleString = BP.toString
21138 arr.toJSON = BP.toJSON
21139 arr.equals = BP.equals
21140 arr.compare = BP.compare
21142 arr.slice = BP.slice
21143 arr.readUInt8 = BP.readUInt8
21144 arr.readUInt16LE = BP.readUInt16LE
21145 arr.readUInt16BE = BP.readUInt16BE
21146 arr.readUInt32LE = BP.readUInt32LE
21147 arr.readUInt32BE = BP.readUInt32BE
21148 arr.readInt8 = BP.readInt8
21149 arr.readInt16LE = BP.readInt16LE
21150 arr.readInt16BE = BP.readInt16BE
21151 arr.readInt32LE = BP.readInt32LE
21152 arr.readInt32BE = BP.readInt32BE
21153 arr.readFloatLE = BP.readFloatLE
21154 arr.readFloatBE = BP.readFloatBE
21155 arr.readDoubleLE = BP.readDoubleLE
21156 arr.readDoubleBE = BP.readDoubleBE
21157 arr.writeUInt8 = BP.writeUInt8
21158 arr.writeUInt16LE = BP.writeUInt16LE
21159 arr.writeUInt16BE = BP.writeUInt16BE
21160 arr.writeUInt32LE = BP.writeUInt32LE
21161 arr.writeUInt32BE = BP.writeUInt32BE
21162 arr.writeInt8 = BP.writeInt8
21163 arr.writeInt16LE = BP.writeInt16LE
21164 arr.writeInt16BE = BP.writeInt16BE
21165 arr.writeInt32LE = BP.writeInt32LE
21166 arr.writeInt32BE = BP.writeInt32BE
21167 arr.writeFloatLE = BP.writeFloatLE
21168 arr.writeFloatBE = BP.writeFloatBE
21169 arr.writeDoubleLE = BP.writeDoubleLE
21170 arr.writeDoubleBE = BP.writeDoubleBE
21172 arr.inspect = BP.inspect
21173 arr.toArrayBuffer = BP.toArrayBuffer
21178 var INVALID_BASE64_RE = /[^+\/
0-
9A-z]/g
21180 function base64clean (str) {
21181 // Node strips out invalid characters like \n and \t from the string, base64-js does not
21182 str = stringtrim(str).replace(INVALID_BASE64_RE, '')
21183 // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
21184 while (str.length %
4 !==
0) {
21190 function stringtrim (str) {
21191 if (str.trim) return str.trim()
21192 return str.replace(/^\s+|\s+$/g, '')
21195 // slice(start, end)
21196 function clamp (index, len, defaultValue) {
21197 if (typeof index !== 'number') return defaultValue
21198 index = ~~index; // Coerce to integer.
21199 if (index
>= len) return len
21200 if (index
>=
0) return index
21202 if (index
>=
0) return index
21206 function coerce (length) {
21207 // Coerce length to a number (possibly NaN), round up
21208 // in case it's fractional (e.g.
123.456) then do a
21209 // double negate to coerce a NaN to
0. Easy, right?
21210 length = ~~Math.ceil(+length)
21211 return length <
0 ?
0 : length
21214 function isArray (subject) {
21215 return (Array.isArray || function (subject) {
21216 return Object.prototype.toString.call(subject) === '[object Array]'
21220 function isArrayish (subject) {
21221 return isArray(subject) || Buffer.isBuffer(subject) ||
21222 subject && typeof subject === 'object' &&
21223 typeof subject.length === 'number'
21226 function toHex (n) {
21227 if (n <
16) return '
0' + n.toString(
16)
21228 return n.toString(
16)
21231 function utf8ToBytes (str) {
21233 for (var i =
0; i < str.length; i++) {
21234 var b = str.charCodeAt(i)
21239 if (b
>=
0xD800 && b <=
0xDFFF) i++
21240 var h = encodeURIComponent(str.slice(start, i+
1)).substr(
1).split('%')
21241 for (var j =
0; j < h.length; j++) {
21242 byteArray.push(parseInt(h[j],
16))
21249 function asciiToBytes (str) {
21251 for (var i =
0; i < str.length; i++) {
21252 // Node's code seems to be doing this and not &
0x7F..
21253 byteArray.push(str.charCodeAt(i) &
0xFF)
21258 function utf16leToBytes (str) {
21261 for (var i =
0; i < str.length; i++) {
21262 c = str.charCodeAt(i)
21272 function base64ToBytes (str) {
21273 return base64.toByteArray(str)
21276 function blitBuffer (src, dst, offset, length) {
21277 for (var i =
0; i < length; i++) {
21278 if ((i + offset
>= dst.length) || (i
>= src.length))
21280 dst[i + offset] = src[i]
21285 function decodeUtf8Char (str) {
21287 return decodeURIComponent(str)
21289 return String.fromCharCode(
0xFFFD) // UTF
8 invalid char
21294 * We have to make sure that the value is a valid integer. This means that it
21295 * is non-negative. It has no fractional component and that it does not
21296 * exceed the maximum allowed value.
21298 function verifuint (value, max) {
21299 assert(typeof value === 'number', 'cannot write a non-number as a number')
21300 assert(value
>=
0, 'specified a negative value for writing an unsigned value')
21301 assert(value <= max, 'value is larger than maximum value for type')
21302 assert(Math.floor(value) === value, 'value has a fractional component')
21305 function verifsint (value, max, min) {
21306 assert(typeof value === 'number', 'cannot write a non-number as a number')
21307 assert(value <= max, 'value larger than maximum allowed value')
21308 assert(value
>= min, 'value smaller than minimum allowed value')
21309 assert(Math.floor(value) === value, 'value has a fractional component')
21312 function verifIEEE754 (value, max, min) {
21313 assert(typeof value === 'number', 'cannot write a non-number as a number')
21314 assert(value <= max, 'value larger than maximum allowed value')
21315 assert(value
>= min, 'value smaller than minimum allowed value')
21318 function assert (test, message) {
21319 if (!test) throw new Error(message || 'Failed assertion')
21322 },{"base64-js":
9,"ieee754":
10}],
9:[function(_dereq_,module,exports){
21323 var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
21325 ;(function (exports) {
21328 var Arr = (typeof Uint8Array !== 'undefined')
21332 var PLUS = '+'.charCodeAt(
0)
21333 var SLASH = '/'.charCodeAt(
0)
21334 var NUMBER = '
0'.charCodeAt(
0)
21335 var LOWER = 'a'.charCodeAt(
0)
21336 var UPPER = 'A'.charCodeAt(
0)
21338 function decode (elt) {
21339 var code = elt.charCodeAt(
0)
21342 if (code === SLASH)
21345 return -
1 //no match
21346 if (code < NUMBER +
10)
21347 return code - NUMBER +
26 +
26
21348 if (code < UPPER +
26)
21349 return code - UPPER
21350 if (code < LOWER +
26)
21351 return code - LOWER +
26
21354 function b64ToByteArray (b64) {
21355 var i, j, l, tmp, placeHolders, arr
21357 if (b64.length %
4 > 0) {
21358 throw new Error('Invalid string. Length must be a multiple of
4')
21361 // the number of equal signs (place holders)
21362 // if there are two placeholders, than the two characters before it
21363 // represent one byte
21364 // if there is only one, then the three characters before it represent
2 bytes
21365 // this is just a cheap hack to not do indexOf twice
21366 var len = b64.length
21367 placeHolders = '=' === b64.charAt(len -
2) ?
2 : '=' === b64.charAt(len -
1) ?
1 :
0
21369 // base64 is
4/
3 + up to two characters of the original data
21370 arr = new Arr(b64.length *
3 /
4 - placeHolders)
21372 // if there are placeholders, only get up to the last complete
4 chars
21373 l = placeHolders
> 0 ? b64.length -
4 : b64.length
21377 function push (v) {
21381 for (i =
0, j =
0; i < l; i +=
4, j +=
3) {
21382 tmp = (decode(b64.charAt(i)) <<
18) | (decode(b64.charAt(i +
1)) <<
12) | (decode(b64.charAt(i +
2)) <<
6) | decode(b64.charAt(i +
3))
21383 push((tmp &
0xFF0000)
>> 16)
21384 push((tmp &
0xFF00)
>> 8)
21388 if (placeHolders ===
2) {
21389 tmp = (decode(b64.charAt(i)) <<
2) | (decode(b64.charAt(i +
1))
>> 4)
21391 } else if (placeHolders ===
1) {
21392 tmp = (decode(b64.charAt(i)) <<
10) | (decode(b64.charAt(i +
1)) <<
4) | (decode(b64.charAt(i +
2))
>> 2)
21393 push((tmp
>> 8) &
0xFF)
21400 function uint8ToBase64 (uint8) {
21402 extraBytes = uint8.length %
3, // if we have
1 byte left, pad
2 bytes
21406 function encode (num) {
21407 return lookup.charAt(num)
21410 function tripletToBase64 (num) {
21411 return encode(num
>> 18 &
0x3F) + encode(num
>> 12 &
0x3F) + encode(num
>> 6 &
0x3F) + encode(num &
0x3F)
21414 // go through the array every three bytes, we'll deal with trailing stuff later
21415 for (i =
0, length = uint8.length - extraBytes; i < length; i +=
3) {
21416 temp = (uint8[i] <<
16) + (uint8[i +
1] <<
8) + (uint8[i +
2])
21417 output += tripletToBase64(temp)
21420 // pad the end with zeros, but make sure to not forget the extra bytes
21421 switch (extraBytes) {
21423 temp = uint8[uint8.length -
1]
21424 output += encode(temp
>> 2)
21425 output += encode((temp <<
4) &
0x3F)
21429 temp = (uint8[uint8.length -
2] <<
8) + (uint8[uint8.length -
1])
21430 output += encode(temp
>> 10)
21431 output += encode((temp
>> 4) &
0x3F)
21432 output += encode((temp <<
2) &
0x3F)
21440 exports.toByteArray = b64ToByteArray
21441 exports.fromByteArray = uint8ToBase64
21442 }(typeof exports === 'undefined' ? (this.base64js = {}) : exports))
21444 },{}],
10:[function(_dereq_,module,exports){
21445 exports.read = function(buffer, offset, isLE, mLen, nBytes) {
21447 eLen = nBytes *
8 - mLen -
1,
21448 eMax = (
1 << eLen) -
1,
21451 i = isLE ? (nBytes -
1) :
0,
21453 s = buffer[offset + i];
21457 e = s & ((
1 << (-nBits)) -
1);
21460 for (; nBits
> 0; e = e *
256 + buffer[offset + i], i += d, nBits -=
8){};
21462 m = e & ((
1 << (-nBits)) -
1);
21465 for (; nBits
> 0; m = m *
256 + buffer[offset + i], i += d, nBits -=
8){};
21469 } else if (e === eMax) {
21470 return m ? NaN : ((s ? -
1 :
1) * Infinity);
21472 m = m + Math.pow(
2, mLen);
21475 return (s ? -
1 :
1) * m * Math.pow(
2, e - mLen);
21478 exports.write = function(buffer, value, offset, isLE, mLen, nBytes) {
21480 eLen = nBytes *
8 - mLen -
1,
21481 eMax = (
1 << eLen) -
1,
21483 rt = (mLen ===
23 ? Math.pow(
2, -
24) - Math.pow(
2, -
77) :
0),
21484 i = isLE ?
0 : (nBytes -
1),
21486 s = value <
0 || (value ===
0 &&
1 / value <
0) ?
1 :
0;
21488 value = Math.abs(value);
21490 if (isNaN(value) || value === Infinity) {
21491 m = isNaN(value) ?
1 :
0;
21494 e = Math.floor(Math.log(value) / Math.LN2);
21495 if (value * (c = Math.pow(
2, -e)) <
1) {
21499 if (e + eBias
>=
1) {
21502 value += rt * Math.pow(
2,
1 - eBias);
21504 if (value * c
>=
2) {
21509 if (e + eBias
>= eMax) {
21512 } else if (e + eBias
>=
1) {
21513 m = (value * c -
1) * Math.pow(
2, mLen);
21516 m = value * Math.pow(
2, eBias -
1) * Math.pow(
2, mLen);
21521 for (; mLen
>=
8; buffer[offset + i] = m &
0xff, i += d, m /=
256, mLen -=
8){};
21523 e = (e << mLen) | m;
21525 for (; eLen
> 0; buffer[offset + i] = e &
0xff, i += d, e /=
256, eLen -=
8){};
21527 buffer[offset + i - d] |= s *
128;
21530 },{}],
11:[function(_dereq_,module,exports){
21531 if (typeof Object.create === 'function') {
21532 // implementation from standard node.js 'util' module
21533 module.exports = function inherits(ctor, superCtor) {
21534 ctor.super_ = superCtor
21535 ctor.prototype = Object.create(superCtor.prototype, {
21545 // old school shim for old browsers
21546 module.exports = function inherits(ctor, superCtor) {
21547 ctor.super_ = superCtor
21548 var TempCtor = function () {}
21549 TempCtor.prototype = superCtor.prototype
21550 ctor.prototype = new TempCtor()
21551 ctor.prototype.constructor = ctor
21555 },{}],
12:[function(_dereq_,module,exports){
21556 // shim for using process in browser
21558 var process = module.exports = {};
21560 process.nextTick = (function () {
21561 var canSetImmediate = typeof window !== 'undefined'
21562 && window.setImmediate;
21563 var canPost = typeof window !== 'undefined'
21564 && window.postMessage && window.addEventListener
21567 if (canSetImmediate) {
21568 return function (f) { return window.setImmediate(f) };
21573 window.addEventListener('message', function (ev) {
21574 var source = ev.source;
21575 if ((source === window || source === null) && ev.data === 'process-tick') {
21576 ev.stopPropagation();
21577 if (queue.length
> 0) {
21578 var fn = queue.shift();
21584 return function nextTick(fn) {
21586 window.postMessage('process-tick', '*');
21590 return function nextTick(fn) {
21595 process.title = 'browser';
21596 process.browser = true;
21603 process.addListener = noop;
21604 process.once = noop;
21605 process.off = noop;
21606 process.removeListener = noop;
21607 process.removeAllListeners = noop;
21608 process.emit = noop;
21610 process.binding = function (name) {
21611 throw new Error('process.binding is not supported');
21615 process.cwd = function () { return '/' };
21616 process.chdir = function (dir) {
21617 throw new Error('process.chdir is not supported');
21620 },{}],
13:[function(_dereq_,module,exports){
21621 module.exports=_dereq_(
5)
21622 },{}],
14:[function(_dereq_,module,exports){
21623 module.exports=_dereq_(
6)
21624 },{
"./support/isBuffer":
13,
"FWaASH":
12,
"inherits":
11}],
15:[function(_dereq_,module,exports){
21625 (function (Buffer){
21626 // Base58 encoding/decoding
21627 // Originally written by Mike Hearn for BitcoinJ
21628 // Copyright (c)
2011 Google Inc
21629 // Ported to JavaScript by Stefan Thomas
21630 // Merged Buffer refactorings from base58-native by Stephen Pair
21631 // Copyright (c)
2013 BitPay Inc
21633 var assert = _dereq_('assert')
21634 var BigInteger = _dereq_('bigi')
21636 var ALPHABET = '
123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz'
21637 var ALPHABET_BUF = new Buffer(ALPHABET, 'ascii')
21638 var ALPHABET_MAP = {}
21639 for(var i =
0; i < ALPHABET.length; i++) {
21640 ALPHABET_MAP[ALPHABET.charAt(i)] = BigInteger.valueOf(i)
21642 var BASE = new BigInteger('
58')
21644 function encode(buffer) {
21645 var bi = BigInteger.fromBuffer(buffer)
21646 var result = new Buffer(buffer.length <<
1)
21648 var i = result.length -
1
21649 while (bi.signum()
> 0) {
21650 var remainder = bi.mod(BASE)
21651 bi = bi.divide(BASE)
21653 result[i] = ALPHABET_BUF[remainder.intValue()]
21657 // deal with leading zeros
21659 while (buffer[j] ===
0) {
21660 result[i] = ALPHABET_BUF[
0]
21665 return result.slice(i +
1, result.length).toString('ascii')
21668 function decode(string) {
21669 if (string.length ===
0) return new Buffer(
0)
21671 var num = BigInteger.ZERO
21673 for (var i =
0; i < string.length; i++) {
21674 num = num.multiply(BASE)
21676 var figure = ALPHABET_MAP[string.charAt(i)]
21677 assert.notEqual(figure, undefined, 'Non-base58 character')
21679 num = num.add(figure)
21682 // deal with leading zeros
21684 while ((j < string.length) && (string[j] === ALPHABET[
0])) {
21688 var buffer = num.toBuffer()
21689 var leadingZeros = new Buffer(j)
21690 leadingZeros.fill(
0)
21692 return Buffer.concat([leadingZeros, buffer])
21700 }).call(this,_dereq_(
"buffer").Buffer)
21701 },{
"assert":
4,
"bigi":
3,
"buffer":
8}],
16:[function(_dereq_,module,exports){
21702 (function (Buffer){
21703 var createHash = _dereq_('sha.js')
21705 var md5 = toConstructor(_dereq_('./md5'))
21706 var rmd160 = toConstructor(_dereq_('ripemd160'))
21708 function toConstructor (fn) {
21709 return function () {
21712 update: function (data, enc) {
21713 if(!Buffer.isBuffer(data)) data = new Buffer(data, enc)
21717 digest: function (enc) {
21718 var buf = Buffer.concat(buffers)
21721 return enc ? r.toString(enc) : r
21728 module.exports = function (alg) {
21729 if('md5' === alg) return new md5()
21730 if('rmd160' === alg) return new rmd160()
21731 return createHash(alg)
21734 }).call(this,_dereq_(
"buffer").Buffer)
21735 },{
"./md5":
20,
"buffer":
8,
"ripemd160":
21,
"sha.js":
23}],
17:[function(_dereq_,module,exports){
21736 (function (Buffer){
21737 var createHash = _dereq_('./create-hash')
21740 var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(
0)
21742 module.exports = Hmac
21744 function Hmac (alg, key) {
21745 if(!(this instanceof Hmac)) return new Hmac(alg, key)
21749 key = this._key = !Buffer.isBuffer(key) ? new Buffer(key) : key
21751 if(key.length
> blocksize) {
21752 key = createHash(alg).update(key).digest()
21753 } else if(key.length < blocksize) {
21754 key = Buffer.concat([key, zeroBuffer], blocksize)
21757 var ipad = this._ipad = new Buffer(blocksize)
21758 var opad = this._opad = new Buffer(blocksize)
21760 for(var i =
0; i < blocksize; i++) {
21761 ipad[i] = key[i] ^
0x36
21762 opad[i] = key[i] ^
0x5C
21765 this._hash = createHash(alg).update(ipad)
21768 Hmac.prototype.update = function (data, enc) {
21769 this._hash.update(data, enc)
21773 Hmac.prototype.digest = function (enc) {
21774 var h = this._hash.digest()
21775 return createHash(this._alg).update(this._opad).update(h).digest(enc)
21779 }).call(this,_dereq_("buffer").Buffer)
21780 },{"./create-hash":
16,"buffer":
8}],
18:[function(_dereq_,module,exports){
21781 (function (Buffer){
21783 var zeroBuffer = new Buffer(intSize); zeroBuffer.fill(
0);
21786 function toArray(buf, bigEndian) {
21787 if ((buf.length % intSize) !==
0) {
21788 var len = buf.length + (intSize - (buf.length % intSize));
21789 buf = Buffer.concat([buf, zeroBuffer], len);
21793 var fn = bigEndian ? buf.readInt32BE : buf.readInt32LE;
21794 for (var i =
0; i < buf.length; i += intSize) {
21795 arr.push(fn.call(buf, i));
21800 function toBuffer(arr, size, bigEndian) {
21801 var buf = new Buffer(size);
21802 var fn = bigEndian ? buf.writeInt32BE : buf.writeInt32LE;
21803 for (var i =
0; i < arr.length; i++) {
21804 fn.call(buf, arr[i], i *
4, true);
21809 function hash(buf, fn, hashSize, bigEndian) {
21810 if (!Buffer.isBuffer(buf)) buf = new Buffer(buf);
21811 var arr = fn(toArray(buf, bigEndian), buf.length * chrsz);
21812 return toBuffer(arr, hashSize, bigEndian);
21815 module.exports = { hash: hash };
21817 }).call(this,_dereq_("buffer").Buffer)
21818 },{"buffer":
8}],
19:[function(_dereq_,module,exports){
21819 (function (Buffer){
21820 var rng = _dereq_('./rng')
21822 function error () {
21823 var m = [].slice.call(arguments).join(' ')
21826 'we accept pull requests',
21827 'http://github.com/dominictarr/crypto-browserify'
21831 exports.createHash = _dereq_('./create-hash')
21833 exports.createHmac = _dereq_('./create-hmac')
21835 exports.randomBytes = function(size, callback) {
21836 if (callback && callback.call) {
21838 callback.call(this, undefined, new Buffer(rng(size)))
21839 } catch (err) { callback(err) }
21841 return new Buffer(rng(size))
21845 function each(a, f) {
21850 exports.getHashes = function () {
21851 return ['sha1', 'sha256', 'md5', 'rmd160']
21855 var p = _dereq_('./pbkdf2')(exports.createHmac)
21856 exports.pbkdf2 = p.pbkdf2
21857 exports.pbkdf2Sync = p.pbkdf2Sync
21860 // the least I can do is make error messages for the rest of the node.js/crypto api.
21861 each(['createCredentials'
21865 , 'createDecipheriv'
21868 , 'createDiffieHellman'
21869 ], function (name) {
21870 exports[name] = function () {
21871 error('sorry,', name, 'is not implemented yet')
21875 }).call(this,_dereq_("buffer").Buffer)
21876 },{"./create-hash":
16,"./create-hmac":
17,"./pbkdf2":
27,"./rng":
28,"buffer":
8}],
20:[function(_dereq_,module,exports){
21878 * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
21879 * Digest Algorithm, as defined in RFC
1321.
21880 * Version
2.1 Copyright (C) Paul Johnston
1999 -
2002.
21881 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
21882 * Distributed under the BSD License
21883 * See http://pajhome.org.uk/crypt/md5 for more info.
21886 var helpers = _dereq_('./helpers');
21889 * Calculate the MD5 of an array of little-endian words, and a bit length
21891 function core_md5(x, len)
21893 /* append padding */
21894 x[len
>> 5] |=
0x80 << ((len) %
32);
21895 x[(((len +
64)
>>> 9) <<
4) +
14] = len;
21897 var a =
1732584193;
21898 var b = -
271733879;
21899 var c = -
1732584194;
21902 for(var i =
0; i < x.length; i +=
16)
21909 a = md5_ff(a, b, c, d, x[i+
0],
7 , -
680876936);
21910 d = md5_ff(d, a, b, c, x[i+
1],
12, -
389564586);
21911 c = md5_ff(c, d, a, b, x[i+
2],
17,
606105819);
21912 b = md5_ff(b, c, d, a, x[i+
3],
22, -
1044525330);
21913 a = md5_ff(a, b, c, d, x[i+
4],
7 , -
176418897);
21914 d = md5_ff(d, a, b, c, x[i+
5],
12,
1200080426);
21915 c = md5_ff(c, d, a, b, x[i+
6],
17, -
1473231341);
21916 b = md5_ff(b, c, d, a, x[i+
7],
22, -
45705983);
21917 a = md5_ff(a, b, c, d, x[i+
8],
7 ,
1770035416);
21918 d = md5_ff(d, a, b, c, x[i+
9],
12, -
1958414417);
21919 c = md5_ff(c, d, a, b, x[i+
10],
17, -
42063);
21920 b = md5_ff(b, c, d, a, x[i+
11],
22, -
1990404162);
21921 a = md5_ff(a, b, c, d, x[i+
12],
7 ,
1804603682);
21922 d = md5_ff(d, a, b, c, x[i+
13],
12, -
40341101);
21923 c = md5_ff(c, d, a, b, x[i+
14],
17, -
1502002290);
21924 b = md5_ff(b, c, d, a, x[i+
15],
22,
1236535329);
21926 a = md5_gg(a, b, c, d, x[i+
1],
5 , -
165796510);
21927 d = md5_gg(d, a, b, c, x[i+
6],
9 , -
1069501632);
21928 c = md5_gg(c, d, a, b, x[i+
11],
14,
643717713);
21929 b = md5_gg(b, c, d, a, x[i+
0],
20, -
373897302);
21930 a = md5_gg(a, b, c, d, x[i+
5],
5 , -
701558691);
21931 d = md5_gg(d, a, b, c, x[i+
10],
9 ,
38016083);
21932 c = md5_gg(c, d, a, b, x[i+
15],
14, -
660478335);
21933 b = md5_gg(b, c, d, a, x[i+
4],
20, -
405537848);
21934 a = md5_gg(a, b, c, d, x[i+
9],
5 ,
568446438);
21935 d = md5_gg(d, a, b, c, x[i+
14],
9 , -
1019803690);
21936 c = md5_gg(c, d, a, b, x[i+
3],
14, -
187363961);
21937 b = md5_gg(b, c, d, a, x[i+
8],
20,
1163531501);
21938 a = md5_gg(a, b, c, d, x[i+
13],
5 , -
1444681467);
21939 d = md5_gg(d, a, b, c, x[i+
2],
9 , -
51403784);
21940 c = md5_gg(c, d, a, b, x[i+
7],
14,
1735328473);
21941 b = md5_gg(b, c, d, a, x[i+
12],
20, -
1926607734);
21943 a = md5_hh(a, b, c, d, x[i+
5],
4 , -
378558);
21944 d = md5_hh(d, a, b, c, x[i+
8],
11, -
2022574463);
21945 c = md5_hh(c, d, a, b, x[i+
11],
16,
1839030562);
21946 b = md5_hh(b, c, d, a, x[i+
14],
23, -
35309556);
21947 a = md5_hh(a, b, c, d, x[i+
1],
4 , -
1530992060);
21948 d = md5_hh(d, a, b, c, x[i+
4],
11,
1272893353);
21949 c = md5_hh(c, d, a, b, x[i+
7],
16, -
155497632);
21950 b = md5_hh(b, c, d, a, x[i+
10],
23, -
1094730640);
21951 a = md5_hh(a, b, c, d, x[i+
13],
4 ,
681279174);
21952 d = md5_hh(d, a, b, c, x[i+
0],
11, -
358537222);
21953 c = md5_hh(c, d, a, b, x[i+
3],
16, -
722521979);
21954 b = md5_hh(b, c, d, a, x[i+
6],
23,
76029189);
21955 a = md5_hh(a, b, c, d, x[i+
9],
4 , -
640364487);
21956 d = md5_hh(d, a, b, c, x[i+
12],
11, -
421815835);
21957 c = md5_hh(c, d, a, b, x[i+
15],
16,
530742520);
21958 b = md5_hh(b, c, d, a, x[i+
2],
23, -
995338651);
21960 a = md5_ii(a, b, c, d, x[i+
0],
6 , -
198630844);
21961 d = md5_ii(d, a, b, c, x[i+
7],
10,
1126891415);
21962 c = md5_ii(c, d, a, b, x[i+
14],
15, -
1416354905);
21963 b = md5_ii(b, c, d, a, x[i+
5],
21, -
57434055);
21964 a = md5_ii(a, b, c, d, x[i+
12],
6 ,
1700485571);
21965 d = md5_ii(d, a, b, c, x[i+
3],
10, -
1894986606);
21966 c = md5_ii(c, d, a, b, x[i+
10],
15, -
1051523);
21967 b = md5_ii(b, c, d, a, x[i+
1],
21, -
2054922799);
21968 a = md5_ii(a, b, c, d, x[i+
8],
6 ,
1873313359);
21969 d = md5_ii(d, a, b, c, x[i+
15],
10, -
30611744);
21970 c = md5_ii(c, d, a, b, x[i+
6],
15, -
1560198380);
21971 b = md5_ii(b, c, d, a, x[i+
13],
21,
1309151649);
21972 a = md5_ii(a, b, c, d, x[i+
4],
6 , -
145523070);
21973 d = md5_ii(d, a, b, c, x[i+
11],
10, -
1120210379);
21974 c = md5_ii(c, d, a, b, x[i+
2],
15,
718787259);
21975 b = md5_ii(b, c, d, a, x[i+
9],
21, -
343485551);
21977 a = safe_add(a, olda);
21978 b = safe_add(b, oldb);
21979 c = safe_add(c, oldc);
21980 d = safe_add(d, oldd);
21982 return Array(a, b, c, d);
21987 * These functions implement the four basic operations the algorithm uses.
21989 function md5_cmn(q, a, b, x, s, t)
21991 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b);
21993 function md5_ff(a, b, c, d, x, s, t)
21995 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
21997 function md5_gg(a, b, c, d, x, s, t)
21999 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
22001 function md5_hh(a, b, c, d, x, s, t)
22003 return md5_cmn(b ^ c ^ d, a, b, x, s, t);
22005 function md5_ii(a, b, c, d, x, s, t)
22007 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
22011 * Add integers, wrapping at
2^
32. This uses
16-bit operations internally
22012 * to work around bugs in some JS interpreters.
22014 function safe_add(x, y)
22016 var lsw = (x &
0xFFFF) + (y &
0xFFFF);
22017 var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22018 return (msw <<
16) | (lsw &
0xFFFF);
22022 * Bitwise rotate a
32-bit number to the left.
22024 function bit_rol(num, cnt)
22026 return (num << cnt) | (num
>>> (
32 - cnt));
22029 module.exports = function md5(buf) {
22030 return helpers.hash(buf, core_md5,
16);
22033 },{"./helpers":
18}],
21:[function(_dereq_,module,exports){
22034 (function (Buffer){
22036 module.exports = ripemd160
22042 code.google.com/p/crypto-js
22043 (c)
2009-
2013 by Jeff Mott. All rights reserved.
22044 code.google.com/p/crypto-js/wiki/License
22047 (c)
2012 by Cédric Mesnil. All rights reserved.
22049 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
22051 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
22052 - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
22054 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
22059 0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
22060 7,
4,
13,
1,
10,
6,
15,
3,
12,
0,
9,
5,
2,
14,
11,
8,
22061 3,
10,
14,
4,
9,
15,
8,
1,
2,
7,
0,
6,
13,
11,
5,
12,
22062 1,
9,
11,
10,
0,
8,
12,
4,
13,
3,
7,
15,
14,
5,
6,
2,
22063 4,
0,
5,
9,
7,
12,
2,
10,
14,
1,
3,
8,
11,
6,
15,
13];
22065 5,
14,
7,
0,
9,
2,
11,
4,
13,
6,
15,
8,
1,
10,
3,
12,
22066 6,
11,
3,
7,
0,
13,
5,
10,
14,
15,
8,
12,
4,
9,
1,
2,
22067 15,
5,
1,
3,
7,
14,
6,
9,
11,
8,
12,
2,
10,
0,
4,
13,
22068 8,
6,
4,
1,
3,
11,
15,
0,
5,
12,
2,
13,
9,
7,
10,
14,
22069 12,
15,
10,
4,
1,
5,
8,
7,
6,
2,
13,
14,
0,
3,
9,
11];
22071 11,
14,
15,
12,
5,
8,
7,
9,
11,
13,
14,
15,
6,
7,
9,
8,
22072 7,
6,
8,
13,
11,
9,
7,
15,
7,
12,
15,
9,
11,
7,
13,
12,
22073 11,
13,
6,
7,
14,
9,
13,
15,
14,
8,
13,
6,
5,
12,
7,
5,
22074 11,
12,
14,
15,
14,
15,
9,
8,
9,
14,
5,
6,
8,
6,
5,
12,
22075 9,
15,
5,
11,
6,
8,
13,
12,
5,
12,
13,
14,
11,
8,
5,
6 ];
22077 8,
9,
9,
11,
13,
15,
15,
5,
7,
7,
8,
11,
14,
14,
12,
6,
22078 9,
13,
15,
7,
12,
8,
9,
11,
7,
7,
12,
7,
6,
15,
13,
11,
22079 9,
7,
15,
11,
8,
6,
6,
14,
12,
13,
5,
14,
13,
13,
7,
5,
22080 15,
5,
8,
11,
14,
14,
6,
14,
6,
9,
12,
9,
12,
5,
15,
8,
22081 8,
5,
12,
9,
12,
5,
14,
6,
8,
13,
6,
5,
15,
13,
11,
11 ];
22083 var hl = [
0x00000000,
0x5A827999,
0x6ED9EBA1,
0x8F1BBCDC,
0xA953FD4E];
22084 var hr = [
0x50A28BE6,
0x5C4DD124,
0x6D703EF3,
0x7A6D76E9,
0x00000000];
22086 var bytesToWords = function (bytes) {
22088 for (var i =
0, b =
0; i < bytes.length; i++, b +=
8) {
22089 words[b
>>> 5] |= bytes[i] << (
24 - b %
32);
22094 var wordsToBytes = function (words) {
22096 for (var b =
0; b < words.length *
32; b +=
8) {
22097 bytes.push((words[b
>>> 5]
>>> (
24 - b %
32)) &
0xFF);
22102 var processBlock = function (H, M, offset) {
22105 for (var i =
0; i <
16; i++) {
22106 var offset_i = offset + i;
22107 var M_offset_i = M[offset_i];
22111 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
22112 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
22116 // Working variables
22117 var al, bl, cl, dl, el;
22118 var ar, br, cr, dr, er;
22127 for (var i =
0; i <
80; i +=
1) {
22128 t = (al + M[offset+zl[i]])|
0;
22130 t += f1(bl,cl,dl) + hl[
0];
22132 t += f2(bl,cl,dl) + hl[
1];
22134 t += f3(bl,cl,dl) + hl[
2];
22136 t += f4(bl,cl,dl) + hl[
3];
22137 } else {// if (i
<80) {
22138 t += f5(bl,cl,dl) + hl[
4];
22149 t = (ar + M[offset+zr[i]])|
0;
22151 t += f5(br,cr,dr) + hr[
0];
22153 t += f4(br,cr,dr) + hr[
1];
22155 t += f3(br,cr,dr) + hr[
2];
22157 t += f2(br,cr,dr) + hr[
3];
22158 } else {// if (i
<80) {
22159 t += f1(br,cr,dr) + hr[
4];
22162 t = rotl(t,sr[i]) ;
22170 // Intermediate hash value
22171 t = (H[
1] + cl + dr)|
0;
22172 H[
1] = (H[
2] + dl + er)|
0;
22173 H[
2] = (H[
3] + el + ar)|
0;
22174 H[
3] = (H[
4] + al + br)|
0;
22175 H[
4] = (H[
0] + bl + cr)|
0;
22179 function f1(x, y, z) {
22180 return ((x) ^ (y) ^ (z));
22183 function f2(x, y, z) {
22184 return (((x)&(y)) | ((~x)&(z)));
22187 function f3(x, y, z) {
22188 return (((x) | (~(y))) ^ (z));
22191 function f4(x, y, z) {
22192 return (((x) & (z)) | ((y)&(~(z))));
22195 function f5(x, y, z) {
22196 return ((x) ^ ((y) |(~(z))));
22199 function rotl(x,n) {
22200 return (x<
<n) | (x
>>>(
32-n));
22203 function ripemd160(message) {
22204 var H = [
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0];
22206 if (typeof message == 'string')
22207 message = new Buffer(message, 'utf8');
22209 var m = bytesToWords(message);
22211 var nBitsLeft = message.length *
8;
22212 var nBitsTotal = message.length *
8;
22215 m[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
22216 m[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
22217 (((nBitsTotal <<
8) | (nBitsTotal
>>> 24)) &
0x00ff00ff) |
22218 (((nBitsTotal <<
24) | (nBitsTotal
>>> 8)) &
0xff00ff00)
22221 for (var i=
0 ; i
<m.length; i +=
16) {
22222 processBlock(H, m, i);
22226 for (var i =
0; i <
5; i++) {
22231 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
22232 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
22235 var digestbytes = wordsToBytes(H);
22236 return new Buffer(digestbytes);
22241 }).call(this,_dereq_(
"buffer").Buffer)
22242 },{
"buffer":
8}],
22:[function(_dereq_,module,exports){
22243 var u = _dereq_('./util')
22244 var write = u.write
22245 var fill = u.zeroFill
22247 module.exports = function (Buffer) {
22249 //prototype class for hash functions
22250 function Hash (blockSize, finalSize) {
22251 this._block = new Buffer(blockSize) //new Uint32Array(blockSize/
4)
22252 this._finalSize = finalSize
22253 this._blockSize = blockSize
22258 Hash.prototype.init = function () {
22263 function lengthOf(data, enc) {
22264 if(enc == null) return data.byteLength || data.length
22265 if(enc == 'ascii' || enc == 'binary') return data.length
22266 if(enc == 'hex') return data.length/
2
22267 if(enc == 'base64') return data.length/
3
22270 Hash.prototype.update = function (data, enc) {
22271 var bl = this._blockSize
22273 //I'd rather do this with a streaming encoder, like the opposite of
22274 //http://nodejs.org/api/string_decoder.html
22276 if(!enc && 'string' === typeof data)
22280 if(enc === 'utf-
8')
22283 if(enc === 'base64' || enc === 'utf8')
22284 data = new Buffer(data, enc), enc = null
22286 length = lengthOf(data, enc)
22288 length = data.byteLength || data.length
22290 var l = this._len += length
22291 var s = this._s = (this._s ||
0)
22293 var buffer = this._block
22295 var t = Math.min(length, f + bl)
22296 write(buffer, data, enc, s%bl, f, t)
22301 this._update(buffer)
22309 Hash.prototype.digest = function (enc) {
22310 var bl = this._blockSize
22311 var fl = this._finalSize
22312 var len = this._len*
8
22314 var x = this._block
22316 var bits = len % (bl*
8)
22318 //add end marker, so that appending
0's creats a different hash.
22319 x[this._len % bl] =
0x80
22320 fill(this._block, this._len % bl +
1)
22323 this._update(this._block)
22324 u.zeroFill(this._block,
0)
22327 //TODO: handle case where the bit length is
> Math.pow(
2,
29)
22328 x.writeInt32BE(len, fl +
4) //big endian
22330 var hash = this._update(this._block) || this._hash()
22331 if(enc == null) return hash
22332 return hash.toString(enc)
22335 Hash.prototype._update = function () {
22336 throw new Error('_update must be implemented by subclass')
22342 },{"./util":
26}],
23:[function(_dereq_,module,exports){
22343 var exports = module.exports = function (alg) {
22344 var Alg = exports[alg]
22345 if(!Alg) throw new Error(alg + ' is not supported (we accept pull requests)')
22349 var Buffer = _dereq_('buffer').Buffer
22350 var Hash = _dereq_('./hash')(Buffer)
22353 exports.sha1 = _dereq_('./sha1')(Buffer, Hash)
22354 exports.sha256 = _dereq_('./sha256')(Buffer, Hash)
22356 },{"./hash":
22,"./sha1":
24,"./sha256":
25,"buffer":
8}],
24:[function(_dereq_,module,exports){
22358 * A JavaScript implementation of the Secure Hash Algorithm, SHA-
1, as defined
22359 * in FIPS PUB
180-
1
22360 * Version
2.1a Copyright Paul Johnston
2000 -
2002.
22361 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
22362 * Distributed under the BSD License
22363 * See http://pajhome.org.uk/crypt/md5 for details.
22365 module.exports = function (Buffer, Hash) {
22367 var inherits = _dereq_('util').inherits
22369 inherits(Sha1, Hash)
22380 var W = new Int32Array(
80)
22386 return POOL.pop().init()
22388 if(!(this instanceof Sha1)) return new Sha1()
22390 Hash.call(this,
16*
4,
14*
4)
22396 Sha1.prototype.init = function () {
22397 this._a =
0x67452301
22398 this._b =
0xefcdab89
22399 this._c =
0x98badcfe
22400 this._d =
0x10325476
22401 this._e =
0xc3d2e1f0
22403 Hash.prototype.init.call(this)
22407 Sha1.prototype._POOL = POOL
22409 // assume that array is a Uint32Array with length=
16,
22410 // and that if it is the last block, it already has the length and the
1 bit appended.
22413 var isDV = new Buffer(
1) instanceof DataView
22414 function readInt32BE (X, i) {
22416 ? X.getInt32(i, false)
22420 Sha1.prototype._update = function (array) {
22422 var X = this._block
22424 var a, b, c, d, e, _a, _b, _c, _d, _e
22434 for(var j =
0; j <
80; j++) {
22437 //? X.getInt32(j*
4, false)
22438 //? readInt32BE(X, j*
4) //*/ X.readInt32BE(j*
4) //*/
22439 ? X.readInt32BE(j*
4)
22440 : rol(w[j -
3] ^ w[j -
8] ^ w[j -
14] ^ w[j -
16],
1)
22444 add(rol(a,
5), sha1_ft(j, b, c, d)),
22445 add(add(e, W), sha1_kt(j))
22455 this._a = add(a, _a)
22456 this._b = add(b, _b)
22457 this._c = add(c, _c)
22458 this._d = add(d, _d)
22459 this._e = add(e, _e)
22462 Sha1.prototype._hash = function () {
22463 if(POOL.length <
100) POOL.push(this)
22464 var H = new Buffer(
20)
22465 //console.log(this._a|
0, this._b|
0, this._c|
0, this._d|
0, this._e|
0)
22466 H.writeInt32BE(this._a|
0, A)
22467 H.writeInt32BE(this._b|
0, B)
22468 H.writeInt32BE(this._c|
0, C)
22469 H.writeInt32BE(this._d|
0, D)
22470 H.writeInt32BE(this._e|
0, E)
22475 * Perform the appropriate triplet combination function for the current
22478 function sha1_ft(t, b, c, d) {
22479 if(t <
20) return (b & c) | ((~b) & d);
22480 if(t <
40) return b ^ c ^ d;
22481 if(t <
60) return (b & c) | (b & d) | (c & d);
22486 * Determine the appropriate additive constant for the current iteration
22488 function sha1_kt(t) {
22489 return (t <
20) ?
1518500249 : (t <
40) ?
1859775393 :
22490 (t <
60) ? -
1894007588 : -
899497514;
22494 * Add integers, wrapping at
2^
32. This uses
16-bit operations internally
22495 * to work around bugs in some JS interpreters.
22496 * //dominictarr: this is
10 years old, so maybe this can be dropped?)
22499 function add(x, y) {
22500 return (x + y ) |
0
22501 //lets see how this goes on testling.
22502 // var lsw = (x &
0xFFFF) + (y &
0xFFFF);
22503 // var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22504 // return (msw <<
16) | (lsw &
0xFFFF);
22508 * Bitwise rotate a
32-bit number to the left.
22510 function rol(num, cnt) {
22511 return (num << cnt) | (num
>>> (
32 - cnt));
22517 },{"util":
14}],
25:[function(_dereq_,module,exports){
22520 * A JavaScript implementation of the Secure Hash Algorithm, SHA-
256, as defined
22522 * Version
2.2-beta Copyright Angel Marin, Paul Johnston
2000 -
2009.
22523 * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
22527 var inherits = _dereq_('util').inherits
22530 var u = _dereq_('./util')
22532 module.exports = function (Buffer, Hash) {
22535 0x428A2F98,
0x71374491,
0xB5C0FBCF,
0xE9B5DBA5,
22536 0x3956C25B,
0x59F111F1,
0x923F82A4,
0xAB1C5ED5,
22537 0xD807AA98,
0x12835B01,
0x243185BE,
0x550C7DC3,
22538 0x72BE5D74,
0x80DEB1FE,
0x9BDC06A7,
0xC19BF174,
22539 0xE49B69C1,
0xEFBE4786,
0x0FC19DC6,
0x240CA1CC,
22540 0x2DE92C6F,
0x4A7484AA,
0x5CB0A9DC,
0x76F988DA,
22541 0x983E5152,
0xA831C66D,
0xB00327C8,
0xBF597FC7,
22542 0xC6E00BF3,
0xD5A79147,
0x06CA6351,
0x14292967,
22543 0x27B70A85,
0x2E1B2138,
0x4D2C6DFC,
0x53380D13,
22544 0x650A7354,
0x766A0ABB,
0x81C2C92E,
0x92722C85,
22545 0xA2BFE8A1,
0xA81A664B,
0xC24B8B70,
0xC76C51A3,
22546 0xD192E819,
0xD6990624,
0xF40E3585,
0x106AA070,
22547 0x19A4C116,
0x1E376C08,
0x2748774C,
0x34B0BCB5,
22548 0x391C0CB3,
0x4ED8AA4A,
0x5B9CCA4F,
0x682E6FF3,
22549 0x748F82EE,
0x78A5636F,
0x84C87814,
0x8CC70208,
22550 0x90BEFFFA,
0xA4506CEB,
0xBEF9A3F7,
0xC67178F2
22553 inherits(Sha256, Hash)
22554 var W = new Array(
64)
22556 function Sha256() {
22557 // Closure compiler warning - this code lacks side effects - thus commented out
22558 // if(POOL.length) {
22559 // return POOL.shift().init()
22561 //this._data = new Buffer(
32)
22565 this._w = W //new Array(
64)
22567 Hash.call(this,
16*
4,
14*
4)
22570 Sha256.prototype.init = function () {
22572 this._a =
0x6a09e667|
0
22573 this._b =
0xbb67ae85|
0
22574 this._c =
0x3c6ef372|
0
22575 this._d =
0xa54ff53a|
0
22576 this._e =
0x510e527f|
0
22577 this._f =
0x9b05688c|
0
22578 this._g =
0x1f83d9ab|
0
22579 this._h =
0x5be0cd19|
0
22581 this._len = this._s =
0
22586 var safe_add = function(x, y) {
22587 var lsw = (x &
0xFFFF) + (y &
0xFFFF);
22588 var msw = (x
>> 16) + (y
>> 16) + (lsw
>> 16);
22589 return (msw <<
16) | (lsw &
0xFFFF);
22592 function S (X, n) {
22593 return (X
>>> n) | (X << (
32 - n));
22596 function R (X, n) {
22600 function Ch (x, y, z) {
22601 return ((x & y) ^ ((~x) & z));
22604 function Maj (x, y, z) {
22605 return ((x & y) ^ (x & z) ^ (y & z));
22608 function Sigma0256 (x) {
22609 return (S(x,
2) ^ S(x,
13) ^ S(x,
22));
22612 function Sigma1256 (x) {
22613 return (S(x,
6) ^ S(x,
11) ^ S(x,
25));
22616 function Gamma0256 (x) {
22617 return (S(x,
7) ^ S(x,
18) ^ R(x,
3));
22620 function Gamma1256 (x) {
22621 return (S(x,
17) ^ S(x,
19) ^ R(x,
10));
22624 Sha256.prototype._update = function(m) {
22625 var M = this._block
22627 var a, b, c, d, e, f, g, h
22639 for (var j =
0; j <
64; j++) {
22640 var w = W[j] = j <
16
22641 ? M.readInt32BE(j *
4)
22642 : Gamma1256(W[j -
2]) + W[j -
7] + Gamma0256(W[j -
15]) + W[j -
16]
22644 T1 = h + Sigma1256(e) + Ch(e, f, g) + K[j] + w
22646 T2 = Sigma0256(a) + Maj(a, b, c);
22647 h = g; g = f; f = e; e = d + T1; d = c; c = b; b = a; a = T1 + T2;
22650 this._a = (a + this._a) |
0
22651 this._b = (b + this._b) |
0
22652 this._c = (c + this._c) |
0
22653 this._d = (d + this._d) |
0
22654 this._e = (e + this._e) |
0
22655 this._f = (f + this._f) |
0
22656 this._g = (g + this._g) |
0
22657 this._h = (h + this._h) |
0
22661 Sha256.prototype._hash = function () {
22662 if(POOL.length <
10)
22665 var H = new Buffer(
32)
22667 H.writeInt32BE(this._a,
0)
22668 H.writeInt32BE(this._b,
4)
22669 H.writeInt32BE(this._c,
8)
22670 H.writeInt32BE(this._d,
12)
22671 H.writeInt32BE(this._e,
16)
22672 H.writeInt32BE(this._f,
20)
22673 H.writeInt32BE(this._g,
24)
22674 H.writeInt32BE(this._h,
28)
22683 },{"./util":
26,"util":
14}],
26:[function(_dereq_,module,exports){
22684 exports.write = write
22685 exports.zeroFill = zeroFill
22687 exports.toString = toString
22689 function write (buffer, string, enc, start, from, to, LE) {
22690 var l = (to - from)
22691 if(enc === 'ascii' || enc === 'binary') {
22692 for( var i =
0; i < l; i++) {
22693 buffer[start + i] = string.charCodeAt(i + from)
22696 else if(enc == null) {
22697 for( var i =
0; i < l; i++) {
22698 buffer[start + i] = string[i + from]
22701 else if(enc === 'hex') {
22702 for(var i =
0; i < l; i++) {
22704 buffer[start + i] = parseInt(string[j*
2] + string[(j*
2)+
1],
16)
22707 else if(enc === 'base64') {
22708 throw new Error('base64 encoding not yet supported')
22711 throw new Error(enc +' encoding not yet supported')
22714 //always fill to the end!
22715 function zeroFill(buf, from) {
22716 for(var i = from; i < buf.length; i++)
22721 },{}],
27:[function(_dereq_,module,exports){
22722 (function (Buffer){
22723 // JavaScript PBKDF2 Implementation
22724 // Based on http://git.io/qsv2zw
22725 // Licensed under LGPL v3
22726 // Copyright (c)
2013 jduncanator
22729 var zeroBuffer = new Buffer(blocksize); zeroBuffer.fill(
0)
22731 module.exports = function (createHmac, exports) {
22732 exports = exports || {}
22734 exports.pbkdf2 = function(password, salt, iterations, keylen, cb) {
22735 if('function' !== typeof cb)
22736 throw new Error('No callback provided to pbkdf2');
22737 setTimeout(function () {
22738 cb(null, exports.pbkdf2Sync(password, salt, iterations, keylen))
22742 exports.pbkdf2Sync = function(key, salt, iterations, keylen) {
22743 if('number' !== typeof iterations)
22744 throw new TypeError('Iterations not a number')
22746 throw new TypeError('Bad iterations')
22747 if('number' !== typeof keylen)
22748 throw new TypeError('Key length not a number')
22750 throw new TypeError('Bad key length')
22752 //stretch key to the correct length that hmac wants it,
22753 //otherwise this will happen every time hmac is called
22754 //twice per iteration.
22755 var key = !Buffer.isBuffer(key) ? new Buffer(key) : key
22757 if(key.length
> blocksize) {
22758 key = createHash(alg).update(key).digest()
22759 } else if(key.length < blocksize) {
22760 key = Buffer.concat([key, zeroBuffer], blocksize)
22764 var cplen, p =
0, i =
1, itmp = new Buffer(
4), digtmp;
22765 var out = new Buffer(keylen);
22773 /* We are unlikely to ever use more than
256 blocks (
5120 bits!)
22774 * but just in case...
22776 itmp[
0] = (i
>> 24) &
0xff;
22777 itmp[
1] = (i
>> 16) &
0xff;
22778 itmp[
2] = (i
>> 8) &
0xff;
22779 itmp[
3] = i &
0xff;
22781 HMAC = createHmac('sha1', key);
22784 digtmp = HMAC.digest();
22785 digtmp.copy(out, p,
0, cplen);
22787 for(var j =
1; j < iterations; j++) {
22788 HMAC = createHmac('sha1', key);
22789 HMAC.update(digtmp);
22790 digtmp = HMAC.digest();
22791 for(var k =
0; k < cplen; k++) {
22792 out[k] ^= digtmp[k];
22806 }).call(this,_dereq_(
"buffer").Buffer)
22807 },{
"buffer":
8}],
28:[function(_dereq_,module,exports){
22808 (function (Buffer){
22809 // Original code adapted from Robert Kieffer.
22810 // details at https://github.com/broofa/node-uuid
22814 var _global = this;
22816 var mathRNG, whatwgRNG;
22818 // NOTE: Math.random() does not guarantee
"cryptographic quality"
22819 mathRNG = function(size) {
22820 var bytes = new Buffer(size);
22823 for (var i =
0, r; i < size; i++) {
22824 if ((i &
0x03) ==
0) r = Math.random() *
0x100000000;
22825 bytes[i] = r
>>> ((i &
0x03) <<
3) &
0xff;
22831 if (_global.crypto && crypto.getRandomValues) {
22832 whatwgRNG = function(size) {
22833 var bytes = new Buffer(size); //in browserify, this is an extended Uint8Array
22834 crypto.getRandomValues(bytes);
22839 module.exports = whatwgRNG || mathRNG;
22843 }).call(this,_dereq_("buffer").Buffer)
22844 },{"buffer":
8}],
29:[function(_dereq_,module,exports){
22845 ;(function (root, factory, undef) {
22846 if (typeof exports === "object") {
22848 module.exports = exports = factory(_dereq_("./core"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./evpkdf"), _dereq_("./cipher-core"));
22850 else if (typeof define === "function" && define.amd) {
22852 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
22855 // Global (browser)
22856 factory(root.CryptoJS);
22858 }(this, function (CryptoJS) {
22864 var BlockCipher = C_lib.BlockCipher;
22865 var C_algo = C.algo;
22870 var SUB_MIX_0 = [];
22871 var SUB_MIX_1 = [];
22872 var SUB_MIX_2 = [];
22873 var SUB_MIX_3 = [];
22874 var INV_SUB_MIX_0 = [];
22875 var INV_SUB_MIX_1 = [];
22876 var INV_SUB_MIX_2 = [];
22877 var INV_SUB_MIX_3 = [];
22879 // Compute lookup tables
22881 // Compute double table
22883 for (var i =
0; i <
256; i++) {
22887 d[i] = (i <<
1) ^
0x11b;
22894 for (var i =
0; i <
256; i++) {
22896 var sx = xi ^ (xi <<
1) ^ (xi <<
2) ^ (xi <<
3) ^ (xi <<
4);
22897 sx = (sx
>>> 8) ^ (sx &
0xff) ^
0x63;
22901 // Compute multiplication
22906 // Compute sub bytes, mix columns tables
22907 var t = (d[sx] *
0x101) ^ (sx *
0x1010100);
22908 SUB_MIX_0[x] = (t <<
24) | (t
>>> 8);
22909 SUB_MIX_1[x] = (t <<
16) | (t
>>> 16);
22910 SUB_MIX_2[x] = (t <<
8) | (t
>>> 24);
22913 // Compute inv sub bytes, inv mix columns tables
22914 var t = (x8 *
0x1010101) ^ (x4 *
0x10001) ^ (x2 *
0x101) ^ (x *
0x1010100);
22915 INV_SUB_MIX_0[sx] = (t <<
24) | (t
>>> 8);
22916 INV_SUB_MIX_1[sx] = (t <<
16) | (t
>>> 16);
22917 INV_SUB_MIX_2[sx] = (t <<
8) | (t
>>> 24);
22918 INV_SUB_MIX_3[sx] = t;
22920 // Compute next counter
22924 x = x2 ^ d[d[d[x8 ^ x2]]];
22930 // Precomputed Rcon lookup
22931 var RCON = [
0x00,
0x01,
0x02,
0x04,
0x08,
0x10,
0x20,
0x40,
0x80,
0x1b,
0x36];
22934 * AES block cipher algorithm.
22936 var AES = C_algo.AES = BlockCipher.extend({
22937 _doReset: function () {
22939 var key = this._key;
22940 var keyWords = key.words;
22941 var keySize = key.sigBytes /
4;
22943 // Compute number of rounds
22944 var nRounds = this._nRounds = keySize +
6
22946 // Compute number of key schedule rows
22947 var ksRows = (nRounds +
1) *
4;
22949 // Compute key schedule
22950 var keySchedule = this._keySchedule = [];
22951 for (var ksRow =
0; ksRow < ksRows; ksRow++) {
22952 if (ksRow < keySize) {
22953 keySchedule[ksRow] = keyWords[ksRow];
22955 var t = keySchedule[ksRow -
1];
22957 if (!(ksRow % keySize)) {
22959 t = (t <<
8) | (t
>>> 24);
22962 t = (SBOX[t
>>> 24] <<
24) | (SBOX[(t
>>> 16) &
0xff] <<
16) | (SBOX[(t
>>> 8) &
0xff] <<
8) | SBOX[t &
0xff];
22965 t ^= RCON[(ksRow / keySize) |
0] <<
24;
22966 } else if (keySize
> 6 && ksRow % keySize ==
4) {
22968 t = (SBOX[t
>>> 24] <<
24) | (SBOX[(t
>>> 16) &
0xff] <<
16) | (SBOX[(t
>>> 8) &
0xff] <<
8) | SBOX[t &
0xff];
22971 keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
22975 // Compute inv key schedule
22976 var invKeySchedule = this._invKeySchedule = [];
22977 for (var invKsRow =
0; invKsRow < ksRows; invKsRow++) {
22978 var ksRow = ksRows - invKsRow;
22980 if (invKsRow %
4) {
22981 var t = keySchedule[ksRow];
22983 var t = keySchedule[ksRow -
4];
22986 if (invKsRow <
4 || ksRow <=
4) {
22987 invKeySchedule[invKsRow] = t;
22989 invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t
>>> 24]] ^ INV_SUB_MIX_1[SBOX[(t
>>> 16) &
0xff]] ^
22990 INV_SUB_MIX_2[SBOX[(t
>>> 8) &
0xff]] ^ INV_SUB_MIX_3[SBOX[t &
0xff]];
22995 encryptBlock: function (M, offset) {
22996 this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
22999 decryptBlock: function (M, offset) {
23000 // Swap
2nd and
4th rows
23001 var t = M[offset +
1];
23002 M[offset +
1] = M[offset +
3];
23005 this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
23007 // Inv swap
2nd and
4th rows
23008 var t = M[offset +
1];
23009 M[offset +
1] = M[offset +
3];
23013 _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
23015 var nRounds = this._nRounds;
23017 // Get input, add round key
23018 var s0 = M[offset] ^ keySchedule[
0];
23019 var s1 = M[offset +
1] ^ keySchedule[
1];
23020 var s2 = M[offset +
2] ^ keySchedule[
2];
23021 var s3 = M[offset +
3] ^ keySchedule[
3];
23023 // Key schedule row counter
23027 for (var round =
1; round < nRounds; round++) {
23028 // Shift rows, sub bytes, mix columns, add round key
23029 var t0 = SUB_MIX_0[s0
>>> 24] ^ SUB_MIX_1[(s1
>>> 16) &
0xff] ^ SUB_MIX_2[(s2
>>> 8) &
0xff] ^ SUB_MIX_3[s3 &
0xff] ^ keySchedule[ksRow++];
23030 var t1 = SUB_MIX_0[s1
>>> 24] ^ SUB_MIX_1[(s2
>>> 16) &
0xff] ^ SUB_MIX_2[(s3
>>> 8) &
0xff] ^ SUB_MIX_3[s0 &
0xff] ^ keySchedule[ksRow++];
23031 var t2 = SUB_MIX_0[s2
>>> 24] ^ SUB_MIX_1[(s3
>>> 16) &
0xff] ^ SUB_MIX_2[(s0
>>> 8) &
0xff] ^ SUB_MIX_3[s1 &
0xff] ^ keySchedule[ksRow++];
23032 var t3 = SUB_MIX_0[s3
>>> 24] ^ SUB_MIX_1[(s0
>>> 16) &
0xff] ^ SUB_MIX_2[(s1
>>> 8) &
0xff] ^ SUB_MIX_3[s2 &
0xff] ^ keySchedule[ksRow++];
23041 // Shift rows, sub bytes, add round key
23042 var t0 = ((SBOX[s0
>>> 24] <<
24) | (SBOX[(s1
>>> 16) &
0xff] <<
16) | (SBOX[(s2
>>> 8) &
0xff] <<
8) | SBOX[s3 &
0xff]) ^ keySchedule[ksRow++];
23043 var t1 = ((SBOX[s1
>>> 24] <<
24) | (SBOX[(s2
>>> 16) &
0xff] <<
16) | (SBOX[(s3
>>> 8) &
0xff] <<
8) | SBOX[s0 &
0xff]) ^ keySchedule[ksRow++];
23044 var t2 = ((SBOX[s2
>>> 24] <<
24) | (SBOX[(s3
>>> 16) &
0xff] <<
16) | (SBOX[(s0
>>> 8) &
0xff] <<
8) | SBOX[s1 &
0xff]) ^ keySchedule[ksRow++];
23045 var t3 = ((SBOX[s3
>>> 24] <<
24) | (SBOX[(s0
>>> 16) &
0xff] <<
16) | (SBOX[(s1
>>> 8) &
0xff] <<
8) | SBOX[s2 &
0xff]) ^ keySchedule[ksRow++];
23049 M[offset +
1] = t1;
23050 M[offset +
2] = t2;
23051 M[offset +
3] = t3;
23058 * Shortcut functions to the cipher's object interface.
23062 * var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
23063 * var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
23065 C.AES = BlockCipher._createHelper(AES);
23069 return CryptoJS.AES;
23072 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
30:[function(_dereq_,module,exports){
23073 ;(function (root, factory) {
23074 if (typeof exports ===
"object") {
23076 module.exports = exports = factory(_dereq_(
"./core"));
23078 else if (typeof define ===
"function" && define.amd) {
23080 define([
"./core"], factory);
23083 // Global (browser)
23084 factory(root.CryptoJS);
23086 }(this, function (CryptoJS) {
23089 * Cipher core components.
23091 CryptoJS.lib.Cipher || (function (undefined) {
23095 var Base = C_lib.Base;
23096 var WordArray = C_lib.WordArray;
23097 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
23099 var Utf8 = C_enc.Utf8;
23100 var Base64 = C_enc.Base64;
23101 var C_algo = C.algo;
23102 var EvpKDF = C_algo.EvpKDF;
23105 * Abstract base cipher template.
23107 * @property {number} keySize This cipher's key size. Default:
4 (
128 bits)
23108 * @property {number} ivSize This cipher's IV size. Default:
4 (
128 bits)
23109 * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
23110 * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
23112 var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
23114 * Configuration options.
23116 * @property {WordArray} iv The IV to use for this operation.
23118 cfg: Base.extend(),
23121 * Creates this cipher in encryption mode.
23123 * @param {WordArray} key The key.
23124 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23126 * @return {Cipher} A cipher instance.
23132 * var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
23134 createEncryptor: function (key, cfg) {
23135 return this.create(this._ENC_XFORM_MODE, key, cfg);
23139 * Creates this cipher in decryption mode.
23141 * @param {WordArray} key The key.
23142 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23144 * @return {Cipher} A cipher instance.
23150 * var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
23152 createDecryptor: function (key, cfg) {
23153 return this.create(this._DEC_XFORM_MODE, key, cfg);
23157 * Initializes a newly created cipher.
23159 * @param {number} xformMode Either the encryption or decryption transormation mode constant.
23160 * @param {WordArray} key The key.
23161 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23165 * var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
23167 init: function (xformMode, key, cfg) {
23168 // Apply config defaults
23169 this.cfg = this.cfg.extend(cfg);
23171 // Store transform mode and key
23172 this._xformMode = xformMode;
23175 // Set initial values
23180 * Resets this cipher to its initial state.
23186 reset: function () {
23187 // Reset data buffer
23188 BufferedBlockAlgorithm.reset.call(this);
23190 // Perform concrete-cipher logic
23195 * Adds data to be encrypted or decrypted.
23197 * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
23199 * @return {WordArray} The data after processing.
23203 * var encrypted = cipher.process('data');
23204 * var encrypted = cipher.process(wordArray);
23206 process: function (dataUpdate) {
23208 this._append(dataUpdate);
23210 // Process available blocks
23211 return this._process();
23215 * Finalizes the encryption or decryption process.
23216 * Note that the finalize operation is effectively a destructive, read-once operation.
23218 * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
23220 * @return {WordArray} The data after final processing.
23224 * var encrypted = cipher.finalize();
23225 * var encrypted = cipher.finalize('data');
23226 * var encrypted = cipher.finalize(wordArray);
23228 finalize: function (dataUpdate) {
23229 // Final data update
23231 this._append(dataUpdate);
23234 // Perform concrete-cipher logic
23235 var finalProcessedData = this._doFinalize();
23237 return finalProcessedData;
23244 _ENC_XFORM_MODE:
1,
23246 _DEC_XFORM_MODE:
2,
23249 * Creates shortcut functions to a cipher's object interface.
23251 * @param {Cipher} cipher The cipher to create a helper for.
23253 * @return {Object} An object with encrypt and decrypt shortcut functions.
23259 * var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
23261 _createHelper: (function () {
23262 function selectCipherStrategy(key) {
23263 if (typeof key == 'string') {
23264 return PasswordBasedCipher;
23266 return SerializableCipher;
23270 return function (cipher) {
23272 encrypt: function (message, key, cfg) {
23273 return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
23276 decrypt: function (ciphertext, key, cfg) {
23277 return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
23285 * Abstract base stream cipher template.
23287 * @property {number} blockSize The number of
32-bit words this cipher operates on. Default:
1 (
32 bits)
23289 var StreamCipher = C_lib.StreamCipher = Cipher.extend({
23290 _doFinalize: function () {
23291 // Process partial blocks
23292 var finalProcessedBlocks = this._process(!!'flush');
23294 return finalProcessedBlocks;
23303 var C_mode = C.mode = {};
23306 * Abstract base block cipher mode template.
23308 var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
23310 * Creates this mode for encryption.
23312 * @param {Cipher} cipher A block cipher instance.
23313 * @param {Array} iv The IV words.
23319 * var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
23321 createEncryptor: function (cipher, iv) {
23322 return this.Encryptor.create(cipher, iv);
23326 * Creates this mode for decryption.
23328 * @param {Cipher} cipher A block cipher instance.
23329 * @param {Array} iv The IV words.
23335 * var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
23337 createDecryptor: function (cipher, iv) {
23338 return this.Decryptor.create(cipher, iv);
23342 * Initializes a newly created mode.
23344 * @param {Cipher} cipher A block cipher instance.
23345 * @param {Array} iv The IV words.
23349 * var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
23351 init: function (cipher, iv) {
23352 this._cipher = cipher;
23358 * Cipher Block Chaining mode.
23360 var CBC = C_mode.CBC = (function () {
23362 * Abstract base CBC mode.
23364 var CBC = BlockCipherMode.extend();
23369 CBC.Encryptor = CBC.extend({
23371 * Processes the data block at offset.
23373 * @param {Array} words The data words to operate on.
23374 * @param {number} offset The offset where the block starts.
23378 * mode.processBlock(data.words, offset);
23380 processBlock: function (words, offset) {
23382 var cipher = this._cipher;
23383 var blockSize = cipher.blockSize;
23386 xorBlock.call(this, words, offset, blockSize);
23387 cipher.encryptBlock(words, offset);
23389 // Remember this block to use with next block
23390 this._prevBlock = words.slice(offset, offset + blockSize);
23397 CBC.Decryptor = CBC.extend({
23399 * Processes the data block at offset.
23401 * @param {Array} words The data words to operate on.
23402 * @param {number} offset The offset where the block starts.
23406 * mode.processBlock(data.words, offset);
23408 processBlock: function (words, offset) {
23410 var cipher = this._cipher;
23411 var blockSize = cipher.blockSize;
23413 // Remember this block to use with next block
23414 var thisBlock = words.slice(offset, offset + blockSize);
23417 cipher.decryptBlock(words, offset);
23418 xorBlock.call(this, words, offset, blockSize);
23420 // This block becomes the previous block
23421 this._prevBlock = thisBlock;
23425 function xorBlock(words, offset, blockSize) {
23429 // Choose mixing block
23433 // Remove IV for subsequent blocks
23434 this._iv = undefined;
23436 var block = this._prevBlock;
23440 for (var i =
0; i < blockSize; i++) {
23441 words[offset + i] ^= block[i];
23449 * Padding namespace.
23451 var C_pad = C.pad = {};
23454 * PKCS #
5/
7 padding strategy.
23456 var Pkcs7 = C_pad.Pkcs7 = {
23458 * Pads data using the algorithm defined in PKCS #
5/
7.
23460 * @param {WordArray} data The data to pad.
23461 * @param {number} blockSize The multiple that the data should be padded to.
23467 * CryptoJS.pad.Pkcs7.pad(wordArray,
4);
23469 pad: function (data, blockSize) {
23471 var blockSizeBytes = blockSize *
4;
23473 // Count padding bytes
23474 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
23476 // Create padding word
23477 var paddingWord = (nPaddingBytes <<
24) | (nPaddingBytes <<
16) | (nPaddingBytes <<
8) | nPaddingBytes;
23480 var paddingWords = [];
23481 for (var i =
0; i < nPaddingBytes; i +=
4) {
23482 paddingWords.push(paddingWord);
23484 var padding = WordArray.create(paddingWords, nPaddingBytes);
23487 data.concat(padding);
23491 * Unpads data that had been padded using the algorithm defined in PKCS #
5/
7.
23493 * @param {WordArray} data The data to unpad.
23499 * CryptoJS.pad.Pkcs7.unpad(wordArray);
23501 unpad: function (data) {
23502 // Get number of padding bytes from last byte
23503 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
23506 data.sigBytes -= nPaddingBytes;
23511 * Abstract base block cipher template.
23513 * @property {number} blockSize The number of
32-bit words this cipher operates on. Default:
4 (
128 bits)
23515 var BlockCipher = C_lib.BlockCipher = Cipher.extend({
23517 * Configuration options.
23519 * @property {Mode} mode The block mode to use. Default: CBC
23520 * @property {Padding} padding The padding strategy to use. Default: Pkcs7
23522 cfg: Cipher.cfg.extend({
23527 reset: function () {
23529 Cipher.reset.call(this);
23532 var cfg = this.cfg;
23534 var mode = cfg.mode;
23536 // Reset block mode
23537 if (this._xformMode == this._ENC_XFORM_MODE) {
23538 var modeCreator = mode.createEncryptor;
23539 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
23540 var modeCreator = mode.createDecryptor;
23542 // Keep at least one block in the buffer for unpadding
23543 this._minBufferSize =
1;
23545 this._mode = modeCreator.call(mode, this, iv && iv.words);
23548 _doProcessBlock: function (words, offset) {
23549 this._mode.processBlock(words, offset);
23552 _doFinalize: function () {
23554 var padding = this.cfg.padding;
23557 if (this._xformMode == this._ENC_XFORM_MODE) {
23559 padding.pad(this._data, this.blockSize);
23561 // Process final blocks
23562 var finalProcessedBlocks = this._process(!!'flush');
23563 } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
23564 // Process final blocks
23565 var finalProcessedBlocks = this._process(!!'flush');
23568 padding.unpad(finalProcessedBlocks);
23571 return finalProcessedBlocks;
23578 * A collection of cipher parameters.
23580 * @property {WordArray} ciphertext The raw ciphertext.
23581 * @property {WordArray} key The key to this ciphertext.
23582 * @property {WordArray} iv The IV used in the ciphering operation.
23583 * @property {WordArray} salt The salt used with a key derivation function.
23584 * @property {Cipher} algorithm The cipher algorithm.
23585 * @property {Mode} mode The block mode used in the ciphering operation.
23586 * @property {Padding} padding The padding scheme used in the ciphering operation.
23587 * @property {number} blockSize The block size of the cipher.
23588 * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
23590 var CipherParams = C_lib.CipherParams = Base.extend({
23592 * Initializes a newly created cipher params object.
23594 * @param {Object} cipherParams An object with any of the possible cipher parameters.
23598 * var cipherParams = CryptoJS.lib.CipherParams.create({
23599 * ciphertext: ciphertextWordArray,
23600 * key: keyWordArray,
23602 * salt: saltWordArray,
23603 * algorithm: CryptoJS.algo.AES,
23604 * mode: CryptoJS.mode.CBC,
23605 * padding: CryptoJS.pad.PKCS7,
23607 * formatter: CryptoJS.format.OpenSSL
23610 init: function (cipherParams) {
23611 this.mixIn(cipherParams);
23615 * Converts this cipher params object to a string.
23617 * @param {Format} formatter (Optional) The formatting strategy to use.
23619 * @return {string} The stringified cipher params.
23621 * @throws Error If neither the formatter nor the default formatter is set.
23625 * var string = cipherParams + '';
23626 * var string = cipherParams.toString();
23627 * var string = cipherParams.toString(CryptoJS.format.OpenSSL);
23629 toString: function (formatter) {
23630 return (formatter || this.formatter).stringify(this);
23635 * Format namespace.
23637 var C_format = C.format = {};
23640 * OpenSSL formatting strategy.
23642 var OpenSSLFormatter = C_format.OpenSSL = {
23644 * Converts a cipher params object to an OpenSSL-compatible string.
23646 * @param {CipherParams} cipherParams The cipher params object.
23648 * @return {string} The OpenSSL-compatible string.
23654 * var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
23656 stringify: function (cipherParams) {
23658 var ciphertext = cipherParams.ciphertext;
23659 var salt = cipherParams.salt;
23663 var wordArray = WordArray.create([
0x53616c74,
0x65645f5f]).concat(salt).concat(ciphertext);
23665 var wordArray = ciphertext;
23668 return wordArray.toString(Base64);
23672 * Converts an OpenSSL-compatible string to a cipher params object.
23674 * @param {string} openSSLStr The OpenSSL-compatible string.
23676 * @return {CipherParams} The cipher params object.
23682 * var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
23684 parse: function (openSSLStr) {
23686 var ciphertext = Base64.parse(openSSLStr);
23689 var ciphertextWords = ciphertext.words;
23692 if (ciphertextWords[
0] ==
0x53616c74 && ciphertextWords[
1] ==
0x65645f5f) {
23694 var salt = WordArray.create(ciphertextWords.slice(
2,
4));
23696 // Remove salt from ciphertext
23697 ciphertextWords.splice(
0,
4);
23698 ciphertext.sigBytes -=
16;
23701 return CipherParams.create({ ciphertext: ciphertext, salt: salt });
23706 * A cipher wrapper that returns ciphertext as a serializable cipher params object.
23708 var SerializableCipher = C_lib.SerializableCipher = Base.extend({
23710 * Configuration options.
23712 * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
23715 format: OpenSSLFormatter
23719 * Encrypts a message.
23721 * @param {Cipher} cipher The cipher algorithm to use.
23722 * @param {WordArray|string} message The message to encrypt.
23723 * @param {WordArray} key The key.
23724 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23726 * @return {CipherParams} A cipher params object.
23732 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
23733 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
23734 * var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23736 encrypt: function (cipher, message, key, cfg) {
23737 // Apply config defaults
23738 cfg = this.cfg.extend(cfg);
23741 var encryptor = cipher.createEncryptor(key, cfg);
23742 var ciphertext = encryptor.finalize(message);
23745 var cipherCfg = encryptor.cfg;
23747 // Create and return serializable cipher params
23748 return CipherParams.create({
23749 ciphertext: ciphertext,
23753 mode: cipherCfg.mode,
23754 padding: cipherCfg.padding,
23755 blockSize: cipher.blockSize,
23756 formatter: cfg.format
23761 * Decrypts serialized ciphertext.
23763 * @param {Cipher} cipher The cipher algorithm to use.
23764 * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
23765 * @param {WordArray} key The key.
23766 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23768 * @return {WordArray} The plaintext.
23774 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23775 * var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
23777 decrypt: function (cipher, ciphertext, key, cfg) {
23778 // Apply config defaults
23779 cfg = this.cfg.extend(cfg);
23781 // Convert string to CipherParams
23782 ciphertext = this._parse(ciphertext, cfg.format);
23785 var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
23791 * Converts serialized ciphertext to CipherParams,
23792 * else assumed CipherParams already and returns ciphertext unchanged.
23794 * @param {CipherParams|string} ciphertext The ciphertext.
23795 * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
23797 * @return {CipherParams} The unserialized ciphertext.
23803 * var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
23805 _parse: function (ciphertext, format) {
23806 if (typeof ciphertext == 'string') {
23807 return format.parse(ciphertext, this);
23815 * Key derivation function namespace.
23817 var C_kdf = C.kdf = {};
23820 * OpenSSL key derivation function.
23822 var OpenSSLKdf = C_kdf.OpenSSL = {
23824 * Derives a key and IV from a password.
23826 * @param {string} password The password to derive from.
23827 * @param {number} keySize The size in words of the key to generate.
23828 * @param {number} ivSize The size in words of the IV to generate.
23829 * @param {WordArray|string} salt (Optional) A
64-bit salt to use. If omitted, a salt will be generated randomly.
23831 * @return {CipherParams} A cipher params object with the key, IV, and salt.
23837 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password',
256/
32,
128/
32);
23838 * var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password',
256/
32,
128/
32, 'saltsalt');
23840 execute: function (password, keySize, ivSize, salt) {
23841 // Generate random salt
23843 salt = WordArray.random(
64/
8);
23846 // Derive key and IV
23847 var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
23849 // Separate key and IV
23850 var iv = WordArray.create(key.words.slice(keySize), ivSize *
4);
23851 key.sigBytes = keySize *
4;
23854 return CipherParams.create({ key: key, iv: iv, salt: salt });
23859 * A serializable cipher wrapper that derives the key from a password,
23860 * and returns ciphertext as a serializable cipher params object.
23862 var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
23864 * Configuration options.
23866 * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
23868 cfg: SerializableCipher.cfg.extend({
23873 * Encrypts a message using a password.
23875 * @param {Cipher} cipher The cipher algorithm to use.
23876 * @param {WordArray|string} message The message to encrypt.
23877 * @param {string} password The password.
23878 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23880 * @return {CipherParams} A cipher params object.
23886 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
23887 * var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
23889 encrypt: function (cipher, message, password, cfg) {
23890 // Apply config defaults
23891 cfg = this.cfg.extend(cfg);
23893 // Derive key and other params
23894 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
23896 // Add IV to config
23897 cfg.iv = derivedParams.iv;
23900 var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
23902 // Mix in derived params
23903 ciphertext.mixIn(derivedParams);
23909 * Decrypts serialized ciphertext using a password.
23911 * @param {Cipher} cipher The cipher algorithm to use.
23912 * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
23913 * @param {string} password The password.
23914 * @param {Object} cfg (Optional) The configuration options to use for this operation.
23916 * @return {WordArray} The plaintext.
23922 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
23923 * var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
23925 decrypt: function (cipher, ciphertext, password, cfg) {
23926 // Apply config defaults
23927 cfg = this.cfg.extend(cfg);
23929 // Convert string to CipherParams
23930 ciphertext = this._parse(ciphertext, cfg.format);
23932 // Derive key and other params
23933 var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
23935 // Add IV to config
23936 cfg.iv = derivedParams.iv;
23939 var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
23948 },{
"./core":
31}],
31:[function(_dereq_,module,exports){
23949 ;(function (root, factory) {
23950 if (typeof exports ===
"object") {
23952 module.exports = exports = factory();
23954 else if (typeof define ===
"function" && define.amd) {
23956 define([], factory);
23959 // Global (browser)
23960 root.CryptoJS = factory();
23962 }(this, function () {
23965 * CryptoJS core components.
23967 var CryptoJS = CryptoJS || (function (Math, undefined) {
23969 * CryptoJS namespace.
23974 * Library namespace.
23976 var C_lib = C.lib = {};
23979 * Base object for prototypal inheritance.
23981 var Base = C_lib.Base = (function () {
23986 * Creates a new object that inherits from this object.
23988 * @param {Object} overrides Properties to copy into the new object.
23990 * @return {Object} The new object.
23996 * var MyType = CryptoJS.lib.Base.extend({
23999 * method: function () {
24003 extend: function (overrides) {
24005 F.prototype = this;
24006 var subtype = new F();
24010 subtype.mixIn(overrides);
24013 // Create default initializer
24014 if (!subtype.hasOwnProperty('init')) {
24015 subtype.init = function () {
24016 subtype.$super.init.apply(this, arguments);
24020 // Initializer's prototype is the subtype object
24021 subtype.init.prototype = subtype;
24023 // Reference supertype
24024 subtype.$super = this;
24030 * Extends this object and runs the init method.
24031 * Arguments to create() will be passed to init().
24033 * @return {Object} The new object.
24039 * var instance = MyType.create();
24041 create: function () {
24042 var instance = this.extend();
24043 instance.init.apply(instance, arguments);
24049 * Initializes a newly created object.
24050 * Override this method to add some logic when your objects are created.
24054 * var MyType = CryptoJS.lib.Base.extend({
24055 * init: function () {
24060 init: function () {
24064 * Copies properties into this object.
24066 * @param {Object} properties The properties to mix in.
24074 mixIn: function (properties) {
24075 for (var propertyName in properties) {
24076 if (properties.hasOwnProperty(propertyName)) {
24077 this[propertyName] = properties[propertyName];
24081 // IE won't copy toString using the loop above
24082 if (properties.hasOwnProperty('toString')) {
24083 this.toString = properties.toString;
24088 * Creates a copy of this object.
24090 * @return {Object} The clone.
24094 * var clone = instance.clone();
24096 clone: function () {
24097 return this.init.prototype.extend(this);
24103 * An array of
32-bit words.
24105 * @property {Array} words The array of
32-bit words.
24106 * @property {number} sigBytes The number of significant bytes in this word array.
24108 var WordArray = C_lib.WordArray = Base.extend({
24110 * Initializes a newly created word array.
24112 * @param {Array} words (Optional) An array of
32-bit words.
24113 * @param {number} sigBytes (Optional) The number of significant bytes in the words.
24117 * var wordArray = CryptoJS.lib.WordArray.create();
24118 * var wordArray = CryptoJS.lib.WordArray.create([
0x00010203,
0x04050607]);
24119 * var wordArray = CryptoJS.lib.WordArray.create([
0x00010203,
0x04050607],
6);
24121 init: function (words, sigBytes) {
24122 words = this.words = words || [];
24124 if (sigBytes != undefined) {
24125 this.sigBytes = sigBytes;
24127 this.sigBytes = words.length *
4;
24132 * Converts this word array to a string.
24134 * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
24136 * @return {string} The stringified word array.
24140 * var string = wordArray + '';
24141 * var string = wordArray.toString();
24142 * var string = wordArray.toString(CryptoJS.enc.Utf8);
24144 toString: function (encoder) {
24145 return (encoder || Hex).stringify(this);
24149 * Concatenates a word array to this word array.
24151 * @param {WordArray} wordArray The word array to append.
24153 * @return {WordArray} This word array.
24157 * wordArray1.concat(wordArray2);
24159 concat: function (wordArray) {
24161 var thisWords = this.words;
24162 var thatWords = wordArray.words;
24163 var thisSigBytes = this.sigBytes;
24164 var thatSigBytes = wordArray.sigBytes;
24166 // Clamp excess bits
24170 if (thisSigBytes %
4) {
24171 // Copy one byte at a time
24172 for (var i =
0; i < thatSigBytes; i++) {
24173 var thatByte = (thatWords[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24174 thisWords[(thisSigBytes + i)
>>> 2] |= thatByte << (
24 - ((thisSigBytes + i) %
4) *
8);
24176 } else if (thatWords.length
> 0xffff) {
24177 // Copy one word at a time
24178 for (var i =
0; i < thatSigBytes; i +=
4) {
24179 thisWords[(thisSigBytes + i)
>>> 2] = thatWords[i
>>> 2];
24182 // Copy all words at once
24183 thisWords.push.apply(thisWords, thatWords);
24185 this.sigBytes += thatSigBytes;
24192 * Removes insignificant bits.
24196 * wordArray.clamp();
24198 clamp: function () {
24200 var words = this.words;
24201 var sigBytes = this.sigBytes;
24204 words[sigBytes
>>> 2] &=
0xffffffff << (
32 - (sigBytes %
4) *
8);
24205 words.length = Math.ceil(sigBytes /
4);
24209 * Creates a copy of this word array.
24211 * @return {WordArray} The clone.
24215 * var clone = wordArray.clone();
24217 clone: function () {
24218 var clone = Base.clone.call(this);
24219 clone.words = this.words.slice(
0);
24225 * Creates a word array filled with random bytes.
24227 * @param {number} nBytes The number of random bytes to generate.
24229 * @return {WordArray} The random word array.
24235 * var wordArray = CryptoJS.lib.WordArray.random(
16);
24237 random: function (nBytes) {
24239 for (var i =
0; i < nBytes; i +=
4) {
24240 words.push((Math.random() *
0x100000000) |
0);
24243 return new WordArray.init(words, nBytes);
24248 * Encoder namespace.
24250 var C_enc = C.enc = {};
24253 * Hex encoding strategy.
24255 var Hex = C_enc.Hex = {
24257 * Converts a word array to a hex string.
24259 * @param {WordArray} wordArray The word array.
24261 * @return {string} The hex string.
24267 * var hexString = CryptoJS.enc.Hex.stringify(wordArray);
24269 stringify: function (wordArray) {
24271 var words = wordArray.words;
24272 var sigBytes = wordArray.sigBytes;
24276 for (var i =
0; i < sigBytes; i++) {
24277 var bite = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24278 hexChars.push((bite
>>> 4).toString(
16));
24279 hexChars.push((bite &
0x0f).toString(
16));
24282 return hexChars.join('');
24286 * Converts a hex string to a word array.
24288 * @param {string} hexStr The hex string.
24290 * @return {WordArray} The word array.
24296 * var wordArray = CryptoJS.enc.Hex.parse(hexString);
24298 parse: function (hexStr) {
24300 var hexStrLength = hexStr.length;
24304 for (var i =
0; i < hexStrLength; i +=
2) {
24305 words[i
>>> 3] |= parseInt(hexStr.substr(i,
2),
16) << (
24 - (i %
8) *
4);
24308 return new WordArray.init(words, hexStrLength /
2);
24313 * Latin1 encoding strategy.
24315 var Latin1 = C_enc.Latin1 = {
24317 * Converts a word array to a Latin1 string.
24319 * @param {WordArray} wordArray The word array.
24321 * @return {string} The Latin1 string.
24327 * var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
24329 stringify: function (wordArray) {
24331 var words = wordArray.words;
24332 var sigBytes = wordArray.sigBytes;
24335 var latin1Chars = [];
24336 for (var i =
0; i < sigBytes; i++) {
24337 var bite = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24338 latin1Chars.push(String.fromCharCode(bite));
24341 return latin1Chars.join('');
24345 * Converts a Latin1 string to a word array.
24347 * @param {string} latin1Str The Latin1 string.
24349 * @return {WordArray} The word array.
24355 * var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
24357 parse: function (latin1Str) {
24359 var latin1StrLength = latin1Str.length;
24363 for (var i =
0; i < latin1StrLength; i++) {
24364 words[i
>>> 2] |= (latin1Str.charCodeAt(i) &
0xff) << (
24 - (i %
4) *
8);
24367 return new WordArray.init(words, latin1StrLength);
24372 * UTF-
8 encoding strategy.
24374 var Utf8 = C_enc.Utf8 = {
24376 * Converts a word array to a UTF-
8 string.
24378 * @param {WordArray} wordArray The word array.
24380 * @return {string} The UTF-
8 string.
24386 * var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
24388 stringify: function (wordArray) {
24390 return decodeURIComponent(escape(Latin1.stringify(wordArray)));
24392 throw new Error('Malformed UTF-
8 data');
24397 * Converts a UTF-
8 string to a word array.
24399 * @param {string} utf8Str The UTF-
8 string.
24401 * @return {WordArray} The word array.
24407 * var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
24409 parse: function (utf8Str) {
24410 return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
24415 * Abstract buffered block algorithm template.
24417 * The property blockSize must be implemented in a concrete subtype.
24419 * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default:
0
24421 var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
24423 * Resets this block algorithm's data buffer to its initial state.
24427 * bufferedBlockAlgorithm.reset();
24429 reset: function () {
24431 this._data = new WordArray.init();
24432 this._nDataBytes =
0;
24436 * Adds new data to this block algorithm's buffer.
24438 * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-
8.
24442 * bufferedBlockAlgorithm._append('data');
24443 * bufferedBlockAlgorithm._append(wordArray);
24445 _append: function (data) {
24446 // Convert string to WordArray, else assume WordArray already
24447 if (typeof data == 'string') {
24448 data = Utf8.parse(data);
24452 this._data.concat(data);
24453 this._nDataBytes += data.sigBytes;
24457 * Processes available data blocks.
24459 * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
24461 * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
24463 * @return {WordArray} The processed data.
24467 * var processedData = bufferedBlockAlgorithm._process();
24468 * var processedData = bufferedBlockAlgorithm._process(!!'flush');
24470 _process: function (doFlush) {
24472 var data = this._data;
24473 var dataWords = data.words;
24474 var dataSigBytes = data.sigBytes;
24475 var blockSize = this.blockSize;
24476 var blockSizeBytes = blockSize *
4;
24478 // Count blocks ready
24479 var nBlocksReady = dataSigBytes / blockSizeBytes;
24481 // Round up to include partial blocks
24482 nBlocksReady = Math.ceil(nBlocksReady);
24484 // Round down to include only full blocks,
24485 // less the number of blocks that must remain in the buffer
24486 nBlocksReady = Math.max((nBlocksReady |
0) - this._minBufferSize,
0);
24489 // Count words ready
24490 var nWordsReady = nBlocksReady * blockSize;
24492 // Count bytes ready
24493 var nBytesReady = Math.min(nWordsReady *
4, dataSigBytes);
24497 for (var offset =
0; offset < nWordsReady; offset += blockSize) {
24498 // Perform concrete-algorithm logic
24499 this._doProcessBlock(dataWords, offset);
24502 // Remove processed words
24503 var processedWords = dataWords.splice(
0, nWordsReady);
24504 data.sigBytes -= nBytesReady;
24507 // Return processed words
24508 return new WordArray.init(processedWords, nBytesReady);
24512 * Creates a copy of this object.
24514 * @return {Object} The clone.
24518 * var clone = bufferedBlockAlgorithm.clone();
24520 clone: function () {
24521 var clone = Base.clone.call(this);
24522 clone._data = this._data.clone();
24531 * Abstract hasher template.
24533 * @property {number} blockSize The number of
32-bit words this hasher operates on. Default:
16 (
512 bits)
24535 var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
24537 * Configuration options.
24539 cfg: Base.extend(),
24542 * Initializes a newly created hasher.
24544 * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
24548 * var hasher = CryptoJS.algo.SHA256.create();
24550 init: function (cfg) {
24551 // Apply config defaults
24552 this.cfg = this.cfg.extend(cfg);
24554 // Set initial values
24559 * Resets this hasher to its initial state.
24565 reset: function () {
24566 // Reset data buffer
24567 BufferedBlockAlgorithm.reset.call(this);
24569 // Perform concrete-hasher logic
24574 * Updates this hasher with a message.
24576 * @param {WordArray|string} messageUpdate The message to append.
24578 * @return {Hasher} This hasher.
24582 * hasher.update('message');
24583 * hasher.update(wordArray);
24585 update: function (messageUpdate) {
24587 this._append(messageUpdate);
24597 * Finalizes the hash computation.
24598 * Note that the finalize operation is effectively a destructive, read-once operation.
24600 * @param {WordArray|string} messageUpdate (Optional) A final message update.
24602 * @return {WordArray} The hash.
24606 * var hash = hasher.finalize();
24607 * var hash = hasher.finalize('message');
24608 * var hash = hasher.finalize(wordArray);
24610 finalize: function (messageUpdate) {
24611 // Final message update
24612 if (messageUpdate) {
24613 this._append(messageUpdate);
24616 // Perform concrete-hasher logic
24617 var hash = this._doFinalize();
24625 * Creates a shortcut function to a hasher's object interface.
24627 * @param {Hasher} hasher The hasher to create a helper for.
24629 * @return {Function} The shortcut function.
24635 * var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
24637 _createHelper: function (hasher) {
24638 return function (message, cfg) {
24639 return new hasher.init(cfg).finalize(message);
24644 * Creates a shortcut function to the HMAC's object interface.
24646 * @param {Hasher} hasher The hasher to use in this HMAC helper.
24648 * @return {Function} The shortcut function.
24654 * var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
24656 _createHmacHelper: function (hasher) {
24657 return function (message, key) {
24658 return new C_algo.HMAC.init(hasher, key).finalize(message);
24664 * Algorithm namespace.
24666 var C_algo = C.algo = {};
24675 },{}],
32:[function(_dereq_,module,exports){
24676 ;(function (root, factory) {
24677 if (typeof exports ===
"object") {
24679 module.exports = exports = factory(_dereq_(
"./core"));
24681 else if (typeof define ===
"function" && define.amd) {
24683 define([
"./core"], factory);
24686 // Global (browser)
24687 factory(root.CryptoJS);
24689 }(this, function (CryptoJS) {
24695 var WordArray = C_lib.WordArray;
24699 * Base64 encoding strategy.
24701 var Base64 = C_enc.Base64 = {
24703 * Converts a word array to a Base64 string.
24705 * @param {WordArray} wordArray The word array.
24707 * @return {string} The Base64 string.
24713 * var base64String = CryptoJS.enc.Base64.stringify(wordArray);
24715 stringify: function (wordArray) {
24717 var words = wordArray.words;
24718 var sigBytes = wordArray.sigBytes;
24719 var map = this._map;
24721 // Clamp excess bits
24725 var base64Chars = [];
24726 for (var i =
0; i < sigBytes; i +=
3) {
24727 var byte1 = (words[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff;
24728 var byte2 = (words[(i +
1)
>>> 2]
>>> (
24 - ((i +
1) %
4) *
8)) &
0xff;
24729 var byte3 = (words[(i +
2)
>>> 2]
>>> (
24 - ((i +
2) %
4) *
8)) &
0xff;
24731 var triplet = (byte1 <<
16) | (byte2 <<
8) | byte3;
24733 for (var j =
0; (j <
4) && (i + j *
0.75 < sigBytes); j++) {
24734 base64Chars.push(map.charAt((triplet
>>> (
6 * (
3 - j))) &
0x3f));
24739 var paddingChar = map.charAt(
64);
24741 while (base64Chars.length %
4) {
24742 base64Chars.push(paddingChar);
24746 return base64Chars.join('');
24750 * Converts a Base64 string to a word array.
24752 * @param {string} base64Str The Base64 string.
24754 * @return {WordArray} The word array.
24760 * var wordArray = CryptoJS.enc.Base64.parse(base64String);
24762 parse: function (base64Str) {
24764 var base64StrLength = base64Str.length;
24765 var map = this._map;
24768 var paddingChar = map.charAt(
64);
24770 var paddingIndex = base64Str.indexOf(paddingChar);
24771 if (paddingIndex != -
1) {
24772 base64StrLength = paddingIndex;
24779 for (var i =
0; i < base64StrLength; i++) {
24781 var bits1 = map.indexOf(base64Str.charAt(i -
1)) << ((i %
4) *
2);
24782 var bits2 = map.indexOf(base64Str.charAt(i))
>>> (
6 - (i %
4) *
2);
24783 words[nBytes
>>> 2] |= (bits1 | bits2) << (
24 - (nBytes %
4) *
8);
24788 return WordArray.create(words, nBytes);
24791 _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
24796 return CryptoJS.enc.Base64;
24799 },{
"./core":
31}],
33:[function(_dereq_,module,exports){
24800 ;(function (root, factory) {
24801 if (typeof exports ===
"object") {
24803 module.exports = exports = factory(_dereq_(
"./core"));
24805 else if (typeof define ===
"function" && define.amd) {
24807 define([
"./core"], factory);
24810 // Global (browser)
24811 factory(root.CryptoJS);
24813 }(this, function (CryptoJS) {
24819 var WordArray = C_lib.WordArray;
24823 * UTF-
16 BE encoding strategy.
24825 var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
24827 * Converts a word array to a UTF-
16 BE string.
24829 * @param {WordArray} wordArray The word array.
24831 * @return {string} The UTF-
16 BE string.
24837 * var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
24839 stringify: function (wordArray) {
24841 var words = wordArray.words;
24842 var sigBytes = wordArray.sigBytes;
24845 var utf16Chars = [];
24846 for (var i =
0; i < sigBytes; i +=
2) {
24847 var codePoint = (words[i
>>> 2]
>>> (
16 - (i %
4) *
8)) &
0xffff;
24848 utf16Chars.push(String.fromCharCode(codePoint));
24851 return utf16Chars.join('');
24855 * Converts a UTF-
16 BE string to a word array.
24857 * @param {string} utf16Str The UTF-
16 BE string.
24859 * @return {WordArray} The word array.
24865 * var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
24867 parse: function (utf16Str) {
24869 var utf16StrLength = utf16Str.length;
24873 for (var i =
0; i < utf16StrLength; i++) {
24874 words[i
>>> 1] |= utf16Str.charCodeAt(i) << (
16 - (i %
2) *
16);
24877 return WordArray.create(words, utf16StrLength *
2);
24882 * UTF-
16 LE encoding strategy.
24886 * Converts a word array to a UTF-
16 LE string.
24888 * @param {WordArray} wordArray The word array.
24890 * @return {string} The UTF-
16 LE string.
24896 * var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
24898 stringify: function (wordArray) {
24900 var words = wordArray.words;
24901 var sigBytes = wordArray.sigBytes;
24904 var utf16Chars = [];
24905 for (var i =
0; i < sigBytes; i +=
2) {
24906 var codePoint = swapEndian((words[i
>>> 2]
>>> (
16 - (i %
4) *
8)) &
0xffff);
24907 utf16Chars.push(String.fromCharCode(codePoint));
24910 return utf16Chars.join('');
24914 * Converts a UTF-
16 LE string to a word array.
24916 * @param {string} utf16Str The UTF-
16 LE string.
24918 * @return {WordArray} The word array.
24924 * var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
24926 parse: function (utf16Str) {
24928 var utf16StrLength = utf16Str.length;
24932 for (var i =
0; i < utf16StrLength; i++) {
24933 words[i
>>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (
16 - (i %
2) *
16));
24936 return WordArray.create(words, utf16StrLength *
2);
24940 function swapEndian(word) {
24941 return ((word <<
8) &
0xff00ff00) | ((word
>>> 8) &
0x00ff00ff);
24946 return CryptoJS.enc.Utf16;
24949 },{
"./core":
31}],
34:[function(_dereq_,module,exports){
24950 ;(function (root, factory, undef) {
24951 if (typeof exports ===
"object") {
24953 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./sha1"), _dereq_(
"./hmac"));
24955 else if (typeof define ===
"function" && define.amd) {
24957 define([
"./core",
"./sha1",
"./hmac"], factory);
24960 // Global (browser)
24961 factory(root.CryptoJS);
24963 }(this, function (CryptoJS) {
24969 var Base = C_lib.Base;
24970 var WordArray = C_lib.WordArray;
24971 var C_algo = C.algo;
24972 var MD5 = C_algo.MD5;
24975 * This key derivation function is meant to conform with EVP_BytesToKey.
24976 * www.openssl.org/docs/crypto/EVP_BytesToKey.html
24978 var EvpKDF = C_algo.EvpKDF = Base.extend({
24980 * Configuration options.
24982 * @property {number} keySize The key size in words to generate. Default:
4 (
128 bits)
24983 * @property {Hasher} hasher The hash algorithm to use. Default: MD5
24984 * @property {number} iterations The number of iterations to perform. Default:
1
24993 * Initializes a newly created key derivation function.
24995 * @param {Object} cfg (Optional) The configuration options to use for the derivation.
24999 * var kdf = CryptoJS.algo.EvpKDF.create();
25000 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize:
8 });
25001 * var kdf = CryptoJS.algo.EvpKDF.create({ keySize:
8, iterations:
1000 });
25003 init: function (cfg) {
25004 this.cfg = this.cfg.extend(cfg);
25008 * Derives a key from a password.
25010 * @param {WordArray|string} password The password.
25011 * @param {WordArray|string} salt A salt.
25013 * @return {WordArray} The derived key.
25017 * var key = kdf.compute(password, salt);
25019 compute: function (password, salt) {
25021 var cfg = this.cfg;
25024 var hasher = cfg.hasher.create();
25027 var derivedKey = WordArray.create();
25030 var derivedKeyWords = derivedKey.words;
25031 var keySize = cfg.keySize;
25032 var iterations = cfg.iterations;
25035 while (derivedKeyWords.length < keySize) {
25037 hasher.update(block);
25039 var block = hasher.update(password).finalize(salt);
25043 for (var i =
1; i < iterations; i++) {
25044 block = hasher.finalize(block);
25048 derivedKey.concat(block);
25050 derivedKey.sigBytes = keySize *
4;
25057 * Derives a key from a password.
25059 * @param {WordArray|string} password The password.
25060 * @param {WordArray|string} salt A salt.
25061 * @param {Object} cfg (Optional) The configuration options to use for this computation.
25063 * @return {WordArray} The derived key.
25069 * var key = CryptoJS.EvpKDF(password, salt);
25070 * var key = CryptoJS.EvpKDF(password, salt, { keySize:
8 });
25071 * var key = CryptoJS.EvpKDF(password, salt, { keySize:
8, iterations:
1000 });
25073 C.EvpKDF = function (password, salt, cfg) {
25074 return EvpKDF.create(cfg).compute(password, salt);
25079 return CryptoJS.EvpKDF;
25082 },{
"./core":
31,
"./hmac":
36,
"./sha1":
55}],
35:[function(_dereq_,module,exports){
25083 ;(function (root, factory, undef) {
25084 if (typeof exports ===
"object") {
25086 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25088 else if (typeof define ===
"function" && define.amd) {
25090 define([
"./core",
"./cipher-core"], factory);
25093 // Global (browser)
25094 factory(root.CryptoJS);
25096 }(this, function (CryptoJS) {
25098 (function (undefined) {
25102 var CipherParams = C_lib.CipherParams;
25104 var Hex = C_enc.Hex;
25105 var C_format = C.format;
25107 var HexFormatter = C_format.Hex = {
25109 * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
25111 * @param {CipherParams} cipherParams The cipher params object.
25113 * @return {string} The hexadecimally encoded string.
25119 * var hexString = CryptoJS.format.Hex.stringify(cipherParams);
25121 stringify: function (cipherParams) {
25122 return cipherParams.ciphertext.toString(Hex);
25126 * Converts a hexadecimally encoded ciphertext string to a cipher params object.
25128 * @param {string} input The hexadecimally encoded string.
25130 * @return {CipherParams} The cipher params object.
25136 * var cipherParams = CryptoJS.format.Hex.parse(hexString);
25138 parse: function (input) {
25139 var ciphertext = Hex.parse(input);
25140 return CipherParams.create({ ciphertext: ciphertext });
25146 return CryptoJS.format.Hex;
25149 },{
"./cipher-core":
30,
"./core":
31}],
36:[function(_dereq_,module,exports){
25150 ;(function (root, factory) {
25151 if (typeof exports ===
"object") {
25153 module.exports = exports = factory(_dereq_(
"./core"));
25155 else if (typeof define ===
"function" && define.amd) {
25157 define([
"./core"], factory);
25160 // Global (browser)
25161 factory(root.CryptoJS);
25163 }(this, function (CryptoJS) {
25169 var Base = C_lib.Base;
25171 var Utf8 = C_enc.Utf8;
25172 var C_algo = C.algo;
25177 var HMAC = C_algo.HMAC = Base.extend({
25179 * Initializes a newly created HMAC.
25181 * @param {Hasher} hasher The hash algorithm to use.
25182 * @param {WordArray|string} key The secret key.
25186 * var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
25188 init: function (hasher, key) {
25190 hasher = this._hasher = new hasher.init();
25192 // Convert string to WordArray, else assume WordArray already
25193 if (typeof key == 'string') {
25194 key = Utf8.parse(key);
25198 var hasherBlockSize = hasher.blockSize;
25199 var hasherBlockSizeBytes = hasherBlockSize *
4;
25201 // Allow arbitrary length keys
25202 if (key.sigBytes
> hasherBlockSizeBytes) {
25203 key = hasher.finalize(key);
25206 // Clamp excess bits
25209 // Clone key for inner and outer pads
25210 var oKey = this._oKey = key.clone();
25211 var iKey = this._iKey = key.clone();
25214 var oKeyWords = oKey.words;
25215 var iKeyWords = iKey.words;
25217 // XOR keys with pad constants
25218 for (var i =
0; i < hasherBlockSize; i++) {
25219 oKeyWords[i] ^=
0x5c5c5c5c;
25220 iKeyWords[i] ^=
0x36363636;
25222 oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
25224 // Set initial values
25229 * Resets this HMAC to its initial state.
25233 * hmacHasher.reset();
25235 reset: function () {
25237 var hasher = this._hasher;
25241 hasher.update(this._iKey);
25245 * Updates this HMAC with a message.
25247 * @param {WordArray|string} messageUpdate The message to append.
25249 * @return {HMAC} This HMAC instance.
25253 * hmacHasher.update('message');
25254 * hmacHasher.update(wordArray);
25256 update: function (messageUpdate) {
25257 this._hasher.update(messageUpdate);
25264 * Finalizes the HMAC computation.
25265 * Note that the finalize operation is effectively a destructive, read-once operation.
25267 * @param {WordArray|string} messageUpdate (Optional) A final message update.
25269 * @return {WordArray} The HMAC.
25273 * var hmac = hmacHasher.finalize();
25274 * var hmac = hmacHasher.finalize('message');
25275 * var hmac = hmacHasher.finalize(wordArray);
25277 finalize: function (messageUpdate) {
25279 var hasher = this._hasher;
25282 var innerHash = hasher.finalize(messageUpdate);
25284 var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
25293 },{"./core":
31}],
37:[function(_dereq_,module,exports){
25294 ;(function (root, factory, undef) {
25295 if (typeof exports === "object") {
25297 module.exports = exports = factory(_dereq_("./core"), _dereq_("./x64-core"), _dereq_("./lib-typedarrays"), _dereq_("./enc-utf16"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./sha1"), _dereq_("./sha256"), _dereq_("./sha224"), _dereq_("./sha512"), _dereq_("./sha384"), _dereq_("./sha3"), _dereq_("./ripemd160"), _dereq_("./hmac"), _dereq_("./pbkdf2"), _dereq_("./evpkdf"), _dereq_("./cipher-core"), _dereq_("./mode-cfb"), _dereq_("./mode-ctr"), _dereq_("./mode-ctr-gladman"), _dereq_("./mode-ofb"), _dereq_("./mode-ecb"), _dereq_("./pad-ansix923"), _dereq_("./pad-iso10126"), _dereq_("./pad-iso97971"), _dereq_("./pad-zeropadding"), _dereq_("./pad-nopadding"), _dereq_("./format-hex"), _dereq_("./aes"), _dereq_("./tripledes"), _dereq_("./rc4"), _dereq_("./rabbit"), _dereq_("./rabbit-legacy"));
25299 else if (typeof define === "function" && define.amd) {
25301 define(["./core", "./x64-core", "./lib-typedarrays", "./enc-utf16", "./enc-base64", "./md5", "./sha1", "./sha256", "./sha224", "./sha512", "./sha384", "./sha3", "./ripemd160", "./hmac", "./pbkdf2", "./evpkdf", "./cipher-core", "./mode-cfb", "./mode-ctr", "./mode-ctr-gladman", "./mode-ofb", "./mode-ecb", "./pad-ansix923", "./pad-iso10126", "./pad-iso97971", "./pad-zeropadding", "./pad-nopadding", "./format-hex", "./aes", "./tripledes", "./rc4", "./rabbit", "./rabbit-legacy"], factory);
25304 // Global (browser)
25305 factory(root.CryptoJS);
25307 }(this, function (CryptoJS) {
25312 },{"./aes":
29,"./cipher-core":
30,"./core":
31,"./enc-base64":
32,"./enc-utf16":
33,"./evpkdf":
34,"./format-hex":
35,"./hmac":
36,"./lib-typedarrays":
38,"./md5":
39,"./mode-cfb":
40,"./mode-ctr":
42,"./mode-ctr-gladman":
41,"./mode-ecb":
43,"./mode-ofb":
44,"./pad-ansix923":
45,"./pad-iso10126":
46,"./pad-iso97971":
47,"./pad-nopadding":
48,"./pad-zeropadding":
49,"./pbkdf2":
50,"./rabbit":
52,"./rabbit-legacy":
51,"./rc4":
53,"./ripemd160":
54,"./sha1":
55,"./sha224":
56,"./sha256":
57,"./sha3":
58,"./sha384":
59,"./sha512":
60,"./tripledes":
61,"./x64-core":
62}],
38:[function(_dereq_,module,exports){
25313 ;(function (root, factory) {
25314 if (typeof exports === "object") {
25316 module.exports = exports = factory(_dereq_("./core"));
25318 else if (typeof define === "function" && define.amd) {
25320 define(["./core"], factory);
25323 // Global (browser)
25324 factory(root.CryptoJS);
25326 }(this, function (CryptoJS) {
25329 // Check if typed arrays are supported
25330 if (typeof ArrayBuffer != 'function') {
25337 var WordArray = C_lib.WordArray;
25339 // Reference original init
25340 var superInit = WordArray.init;
25342 // Augment WordArray.init to handle typed arrays
25343 var subInit = WordArray.init = function (typedArray) {
25344 // Convert buffers to uint8
25345 if (typedArray instanceof ArrayBuffer) {
25346 typedArray = new Uint8Array(typedArray);
25349 // Convert other array views to uint8
25351 typedArray instanceof Int8Array ||
25352 typedArray instanceof Uint8ClampedArray ||
25353 typedArray instanceof Int16Array ||
25354 typedArray instanceof Uint16Array ||
25355 typedArray instanceof Int32Array ||
25356 typedArray instanceof Uint32Array ||
25357 typedArray instanceof Float32Array ||
25358 typedArray instanceof Float64Array
25360 typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
25363 // Handle Uint8Array
25364 if (typedArray instanceof Uint8Array) {
25366 var typedArrayByteLength = typedArray.byteLength;
25370 for (var i =
0; i < typedArrayByteLength; i++) {
25371 words[i
>>> 2] |= typedArray[i] << (
24 - (i %
4) *
8);
25374 // Initialize this word array
25375 superInit.call(this, words, typedArrayByteLength);
25377 // Else call normal init
25378 superInit.apply(this, arguments);
25382 subInit.prototype = WordArray;
25386 return CryptoJS.lib.WordArray;
25389 },{
"./core":
31}],
39:[function(_dereq_,module,exports){
25390 ;(function (root, factory) {
25391 if (typeof exports ===
"object") {
25393 module.exports = exports = factory(_dereq_(
"./core"));
25395 else if (typeof define ===
"function" && define.amd) {
25397 define([
"./core"], factory);
25400 // Global (browser)
25401 factory(root.CryptoJS);
25403 }(this, function (CryptoJS) {
25409 var WordArray = C_lib.WordArray;
25410 var Hasher = C_lib.Hasher;
25411 var C_algo = C.algo;
25416 // Compute constants
25418 for (var i =
0; i <
64; i++) {
25419 T[i] = (Math.abs(Math.sin(i +
1)) *
0x100000000) |
0;
25424 * MD5 hash algorithm.
25426 var MD5 = C_algo.MD5 = Hasher.extend({
25427 _doReset: function () {
25428 this._hash = new WordArray.init([
25429 0x67452301,
0xefcdab89,
25430 0x98badcfe,
0x10325476
25434 _doProcessBlock: function (M, offset) {
25436 for (var i =
0; i <
16; i++) {
25438 var offset_i = offset + i;
25439 var M_offset_i = M[offset_i];
25442 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
25443 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
25448 var H = this._hash.words;
25450 var M_offset_0 = M[offset +
0];
25451 var M_offset_1 = M[offset +
1];
25452 var M_offset_2 = M[offset +
2];
25453 var M_offset_3 = M[offset +
3];
25454 var M_offset_4 = M[offset +
4];
25455 var M_offset_5 = M[offset +
5];
25456 var M_offset_6 = M[offset +
6];
25457 var M_offset_7 = M[offset +
7];
25458 var M_offset_8 = M[offset +
8];
25459 var M_offset_9 = M[offset +
9];
25460 var M_offset_10 = M[offset +
10];
25461 var M_offset_11 = M[offset +
11];
25462 var M_offset_12 = M[offset +
12];
25463 var M_offset_13 = M[offset +
13];
25464 var M_offset_14 = M[offset +
14];
25465 var M_offset_15 = M[offset +
15];
25467 // Working varialbes
25474 a = FF(a, b, c, d, M_offset_0,
7, T[
0]);
25475 d = FF(d, a, b, c, M_offset_1,
12, T[
1]);
25476 c = FF(c, d, a, b, M_offset_2,
17, T[
2]);
25477 b = FF(b, c, d, a, M_offset_3,
22, T[
3]);
25478 a = FF(a, b, c, d, M_offset_4,
7, T[
4]);
25479 d = FF(d, a, b, c, M_offset_5,
12, T[
5]);
25480 c = FF(c, d, a, b, M_offset_6,
17, T[
6]);
25481 b = FF(b, c, d, a, M_offset_7,
22, T[
7]);
25482 a = FF(a, b, c, d, M_offset_8,
7, T[
8]);
25483 d = FF(d, a, b, c, M_offset_9,
12, T[
9]);
25484 c = FF(c, d, a, b, M_offset_10,
17, T[
10]);
25485 b = FF(b, c, d, a, M_offset_11,
22, T[
11]);
25486 a = FF(a, b, c, d, M_offset_12,
7, T[
12]);
25487 d = FF(d, a, b, c, M_offset_13,
12, T[
13]);
25488 c = FF(c, d, a, b, M_offset_14,
17, T[
14]);
25489 b = FF(b, c, d, a, M_offset_15,
22, T[
15]);
25491 a = GG(a, b, c, d, M_offset_1,
5, T[
16]);
25492 d = GG(d, a, b, c, M_offset_6,
9, T[
17]);
25493 c = GG(c, d, a, b, M_offset_11,
14, T[
18]);
25494 b = GG(b, c, d, a, M_offset_0,
20, T[
19]);
25495 a = GG(a, b, c, d, M_offset_5,
5, T[
20]);
25496 d = GG(d, a, b, c, M_offset_10,
9, T[
21]);
25497 c = GG(c, d, a, b, M_offset_15,
14, T[
22]);
25498 b = GG(b, c, d, a, M_offset_4,
20, T[
23]);
25499 a = GG(a, b, c, d, M_offset_9,
5, T[
24]);
25500 d = GG(d, a, b, c, M_offset_14,
9, T[
25]);
25501 c = GG(c, d, a, b, M_offset_3,
14, T[
26]);
25502 b = GG(b, c, d, a, M_offset_8,
20, T[
27]);
25503 a = GG(a, b, c, d, M_offset_13,
5, T[
28]);
25504 d = GG(d, a, b, c, M_offset_2,
9, T[
29]);
25505 c = GG(c, d, a, b, M_offset_7,
14, T[
30]);
25506 b = GG(b, c, d, a, M_offset_12,
20, T[
31]);
25508 a = HH(a, b, c, d, M_offset_5,
4, T[
32]);
25509 d = HH(d, a, b, c, M_offset_8,
11, T[
33]);
25510 c = HH(c, d, a, b, M_offset_11,
16, T[
34]);
25511 b = HH(b, c, d, a, M_offset_14,
23, T[
35]);
25512 a = HH(a, b, c, d, M_offset_1,
4, T[
36]);
25513 d = HH(d, a, b, c, M_offset_4,
11, T[
37]);
25514 c = HH(c, d, a, b, M_offset_7,
16, T[
38]);
25515 b = HH(b, c, d, a, M_offset_10,
23, T[
39]);
25516 a = HH(a, b, c, d, M_offset_13,
4, T[
40]);
25517 d = HH(d, a, b, c, M_offset_0,
11, T[
41]);
25518 c = HH(c, d, a, b, M_offset_3,
16, T[
42]);
25519 b = HH(b, c, d, a, M_offset_6,
23, T[
43]);
25520 a = HH(a, b, c, d, M_offset_9,
4, T[
44]);
25521 d = HH(d, a, b, c, M_offset_12,
11, T[
45]);
25522 c = HH(c, d, a, b, M_offset_15,
16, T[
46]);
25523 b = HH(b, c, d, a, M_offset_2,
23, T[
47]);
25525 a = II(a, b, c, d, M_offset_0,
6, T[
48]);
25526 d = II(d, a, b, c, M_offset_7,
10, T[
49]);
25527 c = II(c, d, a, b, M_offset_14,
15, T[
50]);
25528 b = II(b, c, d, a, M_offset_5,
21, T[
51]);
25529 a = II(a, b, c, d, M_offset_12,
6, T[
52]);
25530 d = II(d, a, b, c, M_offset_3,
10, T[
53]);
25531 c = II(c, d, a, b, M_offset_10,
15, T[
54]);
25532 b = II(b, c, d, a, M_offset_1,
21, T[
55]);
25533 a = II(a, b, c, d, M_offset_8,
6, T[
56]);
25534 d = II(d, a, b, c, M_offset_15,
10, T[
57]);
25535 c = II(c, d, a, b, M_offset_6,
15, T[
58]);
25536 b = II(b, c, d, a, M_offset_13,
21, T[
59]);
25537 a = II(a, b, c, d, M_offset_4,
6, T[
60]);
25538 d = II(d, a, b, c, M_offset_11,
10, T[
61]);
25539 c = II(c, d, a, b, M_offset_2,
15, T[
62]);
25540 b = II(b, c, d, a, M_offset_9,
21, T[
63]);
25542 // Intermediate hash value
25543 H[
0] = (H[
0] + a) |
0;
25544 H[
1] = (H[
1] + b) |
0;
25545 H[
2] = (H[
2] + c) |
0;
25546 H[
3] = (H[
3] + d) |
0;
25549 _doFinalize: function () {
25551 var data = this._data;
25552 var dataWords = data.words;
25554 var nBitsTotal = this._nDataBytes *
8;
25555 var nBitsLeft = data.sigBytes *
8;
25558 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
25560 var nBitsTotalH = Math.floor(nBitsTotal /
0x100000000);
25561 var nBitsTotalL = nBitsTotal;
25562 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = (
25563 (((nBitsTotalH <<
8) | (nBitsTotalH
>>> 24)) &
0x00ff00ff) |
25564 (((nBitsTotalH <<
24) | (nBitsTotalH
>>> 8)) &
0xff00ff00)
25566 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
25567 (((nBitsTotalL <<
8) | (nBitsTotalL
>>> 24)) &
0x00ff00ff) |
25568 (((nBitsTotalL <<
24) | (nBitsTotalL
>>> 8)) &
0xff00ff00)
25571 data.sigBytes = (dataWords.length +
1) *
4;
25573 // Hash final blocks
25577 var hash = this._hash;
25578 var H = hash.words;
25581 for (var i =
0; i <
4; i++) {
25585 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
25586 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
25589 // Return final computed hash
25593 clone: function () {
25594 var clone = Hasher.clone.call(this);
25595 clone._hash = this._hash.clone();
25601 function FF(a, b, c, d, x, s, t) {
25602 var n = a + ((b & c) | (~b & d)) + x + t;
25603 return ((n << s) | (n
>>> (
32 - s))) + b;
25606 function GG(a, b, c, d, x, s, t) {
25607 var n = a + ((b & d) | (c & ~d)) + x + t;
25608 return ((n << s) | (n
>>> (
32 - s))) + b;
25611 function HH(a, b, c, d, x, s, t) {
25612 var n = a + (b ^ c ^ d) + x + t;
25613 return ((n << s) | (n
>>> (
32 - s))) + b;
25616 function II(a, b, c, d, x, s, t) {
25617 var n = a + (c ^ (b | ~d)) + x + t;
25618 return ((n << s) | (n
>>> (
32 - s))) + b;
25622 * Shortcut function to the hasher's object interface.
25624 * @param {WordArray|string} message The message to hash.
25626 * @return {WordArray} The hash.
25632 * var hash = CryptoJS.MD5('message');
25633 * var hash = CryptoJS.MD5(wordArray);
25635 C.MD5 = Hasher._createHelper(MD5);
25638 * Shortcut function to the HMAC's object interface.
25640 * @param {WordArray|string} message The message to hash.
25641 * @param {WordArray|string} key The secret key.
25643 * @return {WordArray} The HMAC.
25649 * var hmac = CryptoJS.HmacMD5(message, key);
25651 C.HmacMD5 = Hasher._createHmacHelper(MD5);
25655 return CryptoJS.MD5;
25658 },{"./core":
31}],
40:[function(_dereq_,module,exports){
25659 ;(function (root, factory, undef) {
25660 if (typeof exports === "object") {
25662 module.exports = exports = factory(_dereq_("./core"), _dereq_("./cipher-core"));
25664 else if (typeof define === "function" && define.amd) {
25666 define(["./core", "./cipher-core"], factory);
25669 // Global (browser)
25670 factory(root.CryptoJS);
25672 }(this, function (CryptoJS) {
25675 * Cipher Feedback block mode.
25677 CryptoJS.mode.CFB = (function () {
25678 var CFB = CryptoJS.lib.BlockCipherMode.extend();
25680 CFB.Encryptor = CFB.extend({
25681 processBlock: function (words, offset) {
25683 var cipher = this._cipher;
25684 var blockSize = cipher.blockSize;
25686 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
25688 // Remember this block to use with next block
25689 this._prevBlock = words.slice(offset, offset + blockSize);
25693 CFB.Decryptor = CFB.extend({
25694 processBlock: function (words, offset) {
25696 var cipher = this._cipher;
25697 var blockSize = cipher.blockSize;
25699 // Remember this block to use with next block
25700 var thisBlock = words.slice(offset, offset + blockSize);
25702 generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
25704 // This block becomes the previous block
25705 this._prevBlock = thisBlock;
25709 function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
25713 // Generate keystream
25715 var keystream = iv.slice(
0);
25717 // Remove IV for subsequent blocks
25718 this._iv = undefined;
25720 var keystream = this._prevBlock;
25722 cipher.encryptBlock(keystream,
0);
25725 for (var i =
0; i < blockSize; i++) {
25726 words[offset + i] ^= keystream[i];
25734 return CryptoJS.mode.CFB;
25737 },{"./cipher-core":
30,"./core":
31}],
41:[function(_dereq_,module,exports){
25738 ;(function (root, factory, undef) {
25739 if (typeof exports === "object") {
25741 module.exports = exports = factory(_dereq_("./core"), _dereq_("./cipher-core"));
25743 else if (typeof define === "function" && define.amd) {
25745 define(["./core", "./cipher-core"], factory);
25748 // Global (browser)
25749 factory(root.CryptoJS);
25751 }(this, function (CryptoJS) {
25754 * Counter block mode compatible with Dr Brian Gladman fileenc.c
25755 * derived from CryptoJS.mode.CTR
25756 * Jan Hruby jhruby.web@gmail.com
25758 CryptoJS.mode.CTRGladman = (function () {
25759 var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
25761 function incWord(word)
25763 if (((word
>> 24) &
0xff) ===
0xff) { //overflow
25764 var b1 = (word
>> 16)
&0xff;
25765 var b2 = (word
>> 8)
&0xff;
25766 var b3 = word &
0xff;
25768 if (b1 ===
0xff) // overflow b1
25794 word += (b1 <<
16);
25800 word += (
0x01 <<
24);
25805 function incCounter(counter)
25807 if ((counter[
0] = incWord(counter[
0])) ===
0)
25809 // encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j <
8
25810 counter[
1] = incWord(counter[
1]);
25815 var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
25816 processBlock: function (words, offset) {
25818 var cipher = this._cipher
25819 var blockSize = cipher.blockSize;
25821 var counter = this._counter;
25823 // Generate keystream
25825 counter = this._counter = iv.slice(
0);
25827 // Remove IV for subsequent blocks
25828 this._iv = undefined;
25831 incCounter(counter);
25833 var keystream = counter.slice(
0);
25834 cipher.encryptBlock(keystream,
0);
25837 for (var i =
0; i < blockSize; i++) {
25838 words[offset + i] ^= keystream[i];
25843 CTRGladman.Decryptor = Encryptor;
25851 return CryptoJS.mode.CTRGladman;
25854 },{
"./cipher-core":
30,
"./core":
31}],
42:[function(_dereq_,module,exports){
25855 ;(function (root, factory, undef) {
25856 if (typeof exports ===
"object") {
25858 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25860 else if (typeof define ===
"function" && define.amd) {
25862 define([
"./core",
"./cipher-core"], factory);
25865 // Global (browser)
25866 factory(root.CryptoJS);
25868 }(this, function (CryptoJS) {
25871 * Counter block mode.
25873 CryptoJS.mode.CTR = (function () {
25874 var CTR = CryptoJS.lib.BlockCipherMode.extend();
25876 var Encryptor = CTR.Encryptor = CTR.extend({
25877 processBlock: function (words, offset) {
25879 var cipher = this._cipher
25880 var blockSize = cipher.blockSize;
25882 var counter = this._counter;
25884 // Generate keystream
25886 counter = this._counter = iv.slice(
0);
25888 // Remove IV for subsequent blocks
25889 this._iv = undefined;
25891 var keystream = counter.slice(
0);
25892 cipher.encryptBlock(keystream,
0);
25894 // Increment counter
25895 counter[blockSize -
1] = (counter[blockSize -
1] +
1) |
0
25898 for (var i =
0; i < blockSize; i++) {
25899 words[offset + i] ^= keystream[i];
25904 CTR.Decryptor = Encryptor;
25910 return CryptoJS.mode.CTR;
25913 },{
"./cipher-core":
30,
"./core":
31}],
43:[function(_dereq_,module,exports){
25914 ;(function (root, factory, undef) {
25915 if (typeof exports ===
"object") {
25917 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25919 else if (typeof define ===
"function" && define.amd) {
25921 define([
"./core",
"./cipher-core"], factory);
25924 // Global (browser)
25925 factory(root.CryptoJS);
25927 }(this, function (CryptoJS) {
25930 * Electronic Codebook block mode.
25932 CryptoJS.mode.ECB = (function () {
25933 var ECB = CryptoJS.lib.BlockCipherMode.extend();
25935 ECB.Encryptor = ECB.extend({
25936 processBlock: function (words, offset) {
25937 this._cipher.encryptBlock(words, offset);
25941 ECB.Decryptor = ECB.extend({
25942 processBlock: function (words, offset) {
25943 this._cipher.decryptBlock(words, offset);
25951 return CryptoJS.mode.ECB;
25954 },{
"./cipher-core":
30,
"./core":
31}],
44:[function(_dereq_,module,exports){
25955 ;(function (root, factory, undef) {
25956 if (typeof exports ===
"object") {
25958 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
25960 else if (typeof define ===
"function" && define.amd) {
25962 define([
"./core",
"./cipher-core"], factory);
25965 // Global (browser)
25966 factory(root.CryptoJS);
25968 }(this, function (CryptoJS) {
25971 * Output Feedback block mode.
25973 CryptoJS.mode.OFB = (function () {
25974 var OFB = CryptoJS.lib.BlockCipherMode.extend();
25976 var Encryptor = OFB.Encryptor = OFB.extend({
25977 processBlock: function (words, offset) {
25979 var cipher = this._cipher
25980 var blockSize = cipher.blockSize;
25982 var keystream = this._keystream;
25984 // Generate keystream
25986 keystream = this._keystream = iv.slice(
0);
25988 // Remove IV for subsequent blocks
25989 this._iv = undefined;
25991 cipher.encryptBlock(keystream,
0);
25994 for (var i =
0; i < blockSize; i++) {
25995 words[offset + i] ^= keystream[i];
26000 OFB.Decryptor = Encryptor;
26006 return CryptoJS.mode.OFB;
26009 },{
"./cipher-core":
30,
"./core":
31}],
45:[function(_dereq_,module,exports){
26010 ;(function (root, factory, undef) {
26011 if (typeof exports ===
"object") {
26013 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26015 else if (typeof define ===
"function" && define.amd) {
26017 define([
"./core",
"./cipher-core"], factory);
26020 // Global (browser)
26021 factory(root.CryptoJS);
26023 }(this, function (CryptoJS) {
26026 * ANSI X
.923 padding strategy.
26028 CryptoJS.pad.AnsiX923 = {
26029 pad: function (data, blockSize) {
26031 var dataSigBytes = data.sigBytes;
26032 var blockSizeBytes = blockSize *
4;
26034 // Count padding bytes
26035 var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
26037 // Compute last byte position
26038 var lastBytePos = dataSigBytes + nPaddingBytes -
1;
26042 data.words[lastBytePos
>>> 2] |= nPaddingBytes << (
24 - (lastBytePos %
4) *
8);
26043 data.sigBytes += nPaddingBytes;
26046 unpad: function (data) {
26047 // Get number of padding bytes from last byte
26048 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
26051 data.sigBytes -= nPaddingBytes;
26056 return CryptoJS.pad.Ansix923;
26059 },{
"./cipher-core":
30,
"./core":
31}],
46:[function(_dereq_,module,exports){
26060 ;(function (root, factory, undef) {
26061 if (typeof exports ===
"object") {
26063 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26065 else if (typeof define ===
"function" && define.amd) {
26067 define([
"./core",
"./cipher-core"], factory);
26070 // Global (browser)
26071 factory(root.CryptoJS);
26073 }(this, function (CryptoJS) {
26076 * ISO
10126 padding strategy.
26078 CryptoJS.pad.Iso10126 = {
26079 pad: function (data, blockSize) {
26081 var blockSizeBytes = blockSize *
4;
26083 // Count padding bytes
26084 var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
26087 data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes -
1)).
26088 concat(CryptoJS.lib.WordArray.create([nPaddingBytes <<
24],
1));
26091 unpad: function (data) {
26092 // Get number of padding bytes from last byte
26093 var nPaddingBytes = data.words[(data.sigBytes -
1)
>>> 2] &
0xff;
26096 data.sigBytes -= nPaddingBytes;
26101 return CryptoJS.pad.Iso10126;
26104 },{
"./cipher-core":
30,
"./core":
31}],
47:[function(_dereq_,module,exports){
26105 ;(function (root, factory, undef) {
26106 if (typeof exports ===
"object") {
26108 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26110 else if (typeof define ===
"function" && define.amd) {
26112 define([
"./core",
"./cipher-core"], factory);
26115 // Global (browser)
26116 factory(root.CryptoJS);
26118 }(this, function (CryptoJS) {
26121 * ISO/IEC
9797-
1 Padding Method
2.
26123 CryptoJS.pad.Iso97971 = {
26124 pad: function (data, blockSize) {
26126 data.concat(CryptoJS.lib.WordArray.create([
0x80000000],
1));
26128 // Zero pad the rest
26129 CryptoJS.pad.ZeroPadding.pad(data, blockSize);
26132 unpad: function (data) {
26133 // Remove zero padding
26134 CryptoJS.pad.ZeroPadding.unpad(data);
26136 // Remove one more byte -- the
0x80 byte
26142 return CryptoJS.pad.Iso97971;
26145 },{
"./cipher-core":
30,
"./core":
31}],
48:[function(_dereq_,module,exports){
26146 ;(function (root, factory, undef) {
26147 if (typeof exports ===
"object") {
26149 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26151 else if (typeof define ===
"function" && define.amd) {
26153 define([
"./core",
"./cipher-core"], factory);
26156 // Global (browser)
26157 factory(root.CryptoJS);
26159 }(this, function (CryptoJS) {
26162 * A noop padding strategy.
26164 CryptoJS.pad.NoPadding = {
26168 unpad: function () {
26173 return CryptoJS.pad.NoPadding;
26176 },{
"./cipher-core":
30,
"./core":
31}],
49:[function(_dereq_,module,exports){
26177 ;(function (root, factory, undef) {
26178 if (typeof exports ===
"object") {
26180 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./cipher-core"));
26182 else if (typeof define ===
"function" && define.amd) {
26184 define([
"./core",
"./cipher-core"], factory);
26187 // Global (browser)
26188 factory(root.CryptoJS);
26190 }(this, function (CryptoJS) {
26193 * Zero padding strategy.
26195 CryptoJS.pad.ZeroPadding = {
26196 pad: function (data, blockSize) {
26198 var blockSizeBytes = blockSize *
4;
26202 data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
26205 unpad: function (data) {
26207 var dataWords = data.words;
26210 var i = data.sigBytes -
1;
26211 while (!((dataWords[i
>>> 2]
>>> (
24 - (i %
4) *
8)) &
0xff)) {
26214 data.sigBytes = i +
1;
26219 return CryptoJS.pad.ZeroPadding;
26222 },{"./cipher-core":
30,"./core":
31}],
50:[function(_dereq_,module,exports){
26223 ;(function (root, factory, undef) {
26224 if (typeof exports === "object") {
26226 module.exports = exports = factory(_dereq_("./core"), _dereq_("./sha1"), _dereq_("./hmac"));
26228 else if (typeof define === "function" && define.amd) {
26230 define(["./core", "./sha1", "./hmac"], factory);
26233 // Global (browser)
26234 factory(root.CryptoJS);
26236 }(this, function (CryptoJS) {
26242 var Base = C_lib.Base;
26243 var WordArray = C_lib.WordArray;
26244 var C_algo = C.algo;
26245 var SHA1 = C_algo.SHA1;
26246 var HMAC = C_algo.HMAC;
26249 * Password-Based Key Derivation Function
2 algorithm.
26251 var PBKDF2 = C_algo.PBKDF2 = Base.extend({
26253 * Configuration options.
26255 * @property {number} keySize The key size in words to generate. Default:
4 (
128 bits)
26256 * @property {Hasher} hasher The hasher to use. Default: SHA1
26257 * @property {number} iterations The number of iterations to perform. Default:
1
26266 * Initializes a newly created key derivation function.
26268 * @param {Object} cfg (Optional) The configuration options to use for the derivation.
26272 * var kdf = CryptoJS.algo.PBKDF2.create();
26273 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize:
8 });
26274 * var kdf = CryptoJS.algo.PBKDF2.create({ keySize:
8, iterations:
1000 });
26276 init: function (cfg) {
26277 this.cfg = this.cfg.extend(cfg);
26281 * Computes the Password-Based Key Derivation Function
2.
26283 * @param {WordArray|string} password The password.
26284 * @param {WordArray|string} salt A salt.
26286 * @return {WordArray} The derived key.
26290 * var key = kdf.compute(password, salt);
26292 compute: function (password, salt) {
26294 var cfg = this.cfg;
26297 var hmac = HMAC.create(cfg.hasher, password);
26300 var derivedKey = WordArray.create();
26301 var blockIndex = WordArray.create([
0x00000001]);
26304 var derivedKeyWords = derivedKey.words;
26305 var blockIndexWords = blockIndex.words;
26306 var keySize = cfg.keySize;
26307 var iterations = cfg.iterations;
26310 while (derivedKeyWords.length < keySize) {
26311 var block = hmac.update(salt).finalize(blockIndex);
26315 var blockWords = block.words;
26316 var blockWordsLength = blockWords.length;
26319 var intermediate = block;
26320 for (var i =
1; i < iterations; i++) {
26321 intermediate = hmac.finalize(intermediate);
26325 var intermediateWords = intermediate.words;
26327 // XOR intermediate with block
26328 for (var j =
0; j < blockWordsLength; j++) {
26329 blockWords[j] ^= intermediateWords[j];
26333 derivedKey.concat(block);
26334 blockIndexWords[
0]++;
26336 derivedKey.sigBytes = keySize *
4;
26343 * Computes the Password-Based Key Derivation Function
2.
26345 * @param {WordArray|string} password The password.
26346 * @param {WordArray|string} salt A salt.
26347 * @param {Object} cfg (Optional) The configuration options to use for this computation.
26349 * @return {WordArray} The derived key.
26355 * var key = CryptoJS.PBKDF2(password, salt);
26356 * var key = CryptoJS.PBKDF2(password, salt, { keySize:
8 });
26357 * var key = CryptoJS.PBKDF2(password, salt, { keySize:
8, iterations:
1000 });
26359 C.PBKDF2 = function (password, salt, cfg) {
26360 return PBKDF2.create(cfg).compute(password, salt);
26365 return CryptoJS.PBKDF2;
26368 },{"./core":
31,"./hmac":
36,"./sha1":
55}],
51:[function(_dereq_,module,exports){
26369 ;(function (root, factory, undef) {
26370 if (typeof exports === "object") {
26372 module.exports = exports = factory(_dereq_("./core"), _dereq_("./enc-base64"), _dereq_("./md5"), _dereq_("./evpkdf"), _dereq_("./cipher-core"));
26374 else if (typeof define === "function" && define.amd) {
26376 define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
26379 // Global (browser)
26380 factory(root.CryptoJS);
26382 }(this, function (CryptoJS) {
26388 var StreamCipher = C_lib.StreamCipher;
26389 var C_algo = C.algo;
26391 // Reusable objects
26397 * Rabbit stream cipher algorithm.
26399 * This is a legacy version that neglected to convert the key to little-endian.
26400 * This error doesn't affect the cipher's security,
26401 * but it does affect its compatibility with other implementations.
26403 var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
26404 _doReset: function () {
26406 var K = this._key.words;
26407 var iv = this.cfg.iv;
26409 // Generate initial state values
26410 var X = this._X = [
26411 K[
0], (K[
3] <<
16) | (K[
2]
>>> 16),
26412 K[
1], (K[
0] <<
16) | (K[
3]
>>> 16),
26413 K[
2], (K[
1] <<
16) | (K[
0]
>>> 16),
26414 K[
3], (K[
2] <<
16) | (K[
1]
>>> 16)
26417 // Generate initial counter values
26418 var C = this._C = [
26419 (K[
2] <<
16) | (K[
2]
>>> 16), (K[
0] &
0xffff0000) | (K[
1] &
0x0000ffff),
26420 (K[
3] <<
16) | (K[
3]
>>> 16), (K[
1] &
0xffff0000) | (K[
2] &
0x0000ffff),
26421 (K[
0] <<
16) | (K[
0]
>>> 16), (K[
2] &
0xffff0000) | (K[
3] &
0x0000ffff),
26422 (K[
1] <<
16) | (K[
1]
>>> 16), (K[
3] &
0xffff0000) | (K[
0] &
0x0000ffff)
26428 // Iterate the system four times
26429 for (var i =
0; i <
4; i++) {
26430 nextState.call(this);
26433 // Modify the counters
26434 for (var i =
0; i <
8; i++) {
26435 C[i] ^= X[(i +
4) &
7];
26445 // Generate four subvectors
26446 var i0 = (((IV_0 <<
8) | (IV_0
>>> 24)) &
0x00ff00ff) | (((IV_0 <<
24) | (IV_0
>>> 8)) &
0xff00ff00);
26447 var i2 = (((IV_1 <<
8) | (IV_1
>>> 24)) &
0x00ff00ff) | (((IV_1 <<
24) | (IV_1
>>> 8)) &
0xff00ff00);
26448 var i1 = (i0
>>> 16) | (i2 &
0xffff0000);
26449 var i3 = (i2 <<
16) | (i0 &
0x0000ffff);
26451 // Modify counter values
26461 // Iterate the system four times
26462 for (var i =
0; i <
4; i++) {
26463 nextState.call(this);
26468 _doProcessBlock: function (M, offset) {
26472 // Iterate the system
26473 nextState.call(this);
26475 // Generate four keystream words
26476 S[
0] = X[
0] ^ (X[
5]
>>> 16) ^ (X[
3] <<
16);
26477 S[
1] = X[
2] ^ (X[
7]
>>> 16) ^ (X[
5] <<
16);
26478 S[
2] = X[
4] ^ (X[
1]
>>> 16) ^ (X[
7] <<
16);
26479 S[
3] = X[
6] ^ (X[
3]
>>> 16) ^ (X[
1] <<
16);
26481 for (var i =
0; i <
4; i++) {
26483 S[i] = (((S[i] <<
8) | (S[i]
>>> 24)) &
0x00ff00ff) |
26484 (((S[i] <<
24) | (S[i]
>>> 8)) &
0xff00ff00);
26487 M[offset + i] ^= S[i];
26496 function nextState() {
26501 // Save old counter values
26502 for (var i =
0; i <
8; i++) {
26506 // Calculate new counter values
26507 C[
0] = (C[
0] +
0x4d34d34d + this._b) |
0;
26508 C[
1] = (C[
1] +
0xd34d34d3 + ((C[
0]
>>> 0) < (C_[
0]
>>> 0) ?
1 :
0)) |
0;
26509 C[
2] = (C[
2] +
0x34d34d34 + ((C[
1]
>>> 0) < (C_[
1]
>>> 0) ?
1 :
0)) |
0;
26510 C[
3] = (C[
3] +
0x4d34d34d + ((C[
2]
>>> 0) < (C_[
2]
>>> 0) ?
1 :
0)) |
0;
26511 C[
4] = (C[
4] +
0xd34d34d3 + ((C[
3]
>>> 0) < (C_[
3]
>>> 0) ?
1 :
0)) |
0;
26512 C[
5] = (C[
5] +
0x34d34d34 + ((C[
4]
>>> 0) < (C_[
4]
>>> 0) ?
1 :
0)) |
0;
26513 C[
6] = (C[
6] +
0x4d34d34d + ((C[
5]
>>> 0) < (C_[
5]
>>> 0) ?
1 :
0)) |
0;
26514 C[
7] = (C[
7] +
0xd34d34d3 + ((C[
6]
>>> 0) < (C_[
6]
>>> 0) ?
1 :
0)) |
0;
26515 this._b = (C[
7]
>>> 0) < (C_[
7]
>>> 0) ?
1 :
0;
26517 // Calculate the g-values
26518 for (var i =
0; i <
8; i++) {
26519 var gx = X[i] + C[i];
26521 // Construct high and low argument for squaring
26522 var ga = gx &
0xffff;
26523 var gb = gx
>>> 16;
26525 // Calculate high and low result of squaring
26526 var gh = ((((ga * ga)
>>> 17) + ga * gb)
>>> 15) + gb * gb;
26527 var gl = (((gx &
0xffff0000) * gx) |
0) + (((gx &
0x0000ffff) * gx) |
0);
26533 // Calculate new state values
26534 X[
0] = (G[
0] + ((G[
7] <<
16) | (G[
7]
>>> 16)) + ((G[
6] <<
16) | (G[
6]
>>> 16))) |
0;
26535 X[
1] = (G[
1] + ((G[
0] <<
8) | (G[
0]
>>> 24)) + G[
7]) |
0;
26536 X[
2] = (G[
2] + ((G[
1] <<
16) | (G[
1]
>>> 16)) + ((G[
0] <<
16) | (G[
0]
>>> 16))) |
0;
26537 X[
3] = (G[
3] + ((G[
2] <<
8) | (G[
2]
>>> 24)) + G[
1]) |
0;
26538 X[
4] = (G[
4] + ((G[
3] <<
16) | (G[
3]
>>> 16)) + ((G[
2] <<
16) | (G[
2]
>>> 16))) |
0;
26539 X[
5] = (G[
5] + ((G[
4] <<
8) | (G[
4]
>>> 24)) + G[
3]) |
0;
26540 X[
6] = (G[
6] + ((G[
5] <<
16) | (G[
5]
>>> 16)) + ((G[
4] <<
16) | (G[
4]
>>> 16))) |
0;
26541 X[
7] = (G[
7] + ((G[
6] <<
8) | (G[
6]
>>> 24)) + G[
5]) |
0;
26545 * Shortcut functions to the cipher's object interface.
26549 * var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
26550 * var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
26552 C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
26556 return CryptoJS.RabbitLegacy;
26559 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
52:[function(_dereq_,module,exports){
26560 ;(function (root, factory, undef) {
26561 if (typeof exports ===
"object") {
26563 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
26565 else if (typeof define ===
"function" && define.amd) {
26567 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
26570 // Global (browser)
26571 factory(root.CryptoJS);
26573 }(this, function (CryptoJS) {
26579 var StreamCipher = C_lib.StreamCipher;
26580 var C_algo = C.algo;
26582 // Reusable objects
26588 * Rabbit stream cipher algorithm
26590 var Rabbit = C_algo.Rabbit = StreamCipher.extend({
26591 _doReset: function () {
26593 var K = this._key.words;
26594 var iv = this.cfg.iv;
26597 for (var i =
0; i <
4; i++) {
26598 K[i] = (((K[i] <<
8) | (K[i]
>>> 24)) &
0x00ff00ff) |
26599 (((K[i] <<
24) | (K[i]
>>> 8)) &
0xff00ff00);
26602 // Generate initial state values
26603 var X = this._X = [
26604 K[
0], (K[
3] <<
16) | (K[
2]
>>> 16),
26605 K[
1], (K[
0] <<
16) | (K[
3]
>>> 16),
26606 K[
2], (K[
1] <<
16) | (K[
0]
>>> 16),
26607 K[
3], (K[
2] <<
16) | (K[
1]
>>> 16)
26610 // Generate initial counter values
26611 var C = this._C = [
26612 (K[
2] <<
16) | (K[
2]
>>> 16), (K[
0] &
0xffff0000) | (K[
1] &
0x0000ffff),
26613 (K[
3] <<
16) | (K[
3]
>>> 16), (K[
1] &
0xffff0000) | (K[
2] &
0x0000ffff),
26614 (K[
0] <<
16) | (K[
0]
>>> 16), (K[
2] &
0xffff0000) | (K[
3] &
0x0000ffff),
26615 (K[
1] <<
16) | (K[
1]
>>> 16), (K[
3] &
0xffff0000) | (K[
0] &
0x0000ffff)
26621 // Iterate the system four times
26622 for (var i =
0; i <
4; i++) {
26623 nextState.call(this);
26626 // Modify the counters
26627 for (var i =
0; i <
8; i++) {
26628 C[i] ^= X[(i +
4) &
7];
26638 // Generate four subvectors
26639 var i0 = (((IV_0 <<
8) | (IV_0
>>> 24)) &
0x00ff00ff) | (((IV_0 <<
24) | (IV_0
>>> 8)) &
0xff00ff00);
26640 var i2 = (((IV_1 <<
8) | (IV_1
>>> 24)) &
0x00ff00ff) | (((IV_1 <<
24) | (IV_1
>>> 8)) &
0xff00ff00);
26641 var i1 = (i0
>>> 16) | (i2 &
0xffff0000);
26642 var i3 = (i2 <<
16) | (i0 &
0x0000ffff);
26644 // Modify counter values
26654 // Iterate the system four times
26655 for (var i =
0; i <
4; i++) {
26656 nextState.call(this);
26661 _doProcessBlock: function (M, offset) {
26665 // Iterate the system
26666 nextState.call(this);
26668 // Generate four keystream words
26669 S[
0] = X[
0] ^ (X[
5]
>>> 16) ^ (X[
3] <<
16);
26670 S[
1] = X[
2] ^ (X[
7]
>>> 16) ^ (X[
5] <<
16);
26671 S[
2] = X[
4] ^ (X[
1]
>>> 16) ^ (X[
7] <<
16);
26672 S[
3] = X[
6] ^ (X[
3]
>>> 16) ^ (X[
1] <<
16);
26674 for (var i =
0; i <
4; i++) {
26676 S[i] = (((S[i] <<
8) | (S[i]
>>> 24)) &
0x00ff00ff) |
26677 (((S[i] <<
24) | (S[i]
>>> 8)) &
0xff00ff00);
26680 M[offset + i] ^= S[i];
26689 function nextState() {
26694 // Save old counter values
26695 for (var i =
0; i <
8; i++) {
26699 // Calculate new counter values
26700 C[
0] = (C[
0] +
0x4d34d34d + this._b) |
0;
26701 C[
1] = (C[
1] +
0xd34d34d3 + ((C[
0]
>>> 0) < (C_[
0]
>>> 0) ?
1 :
0)) |
0;
26702 C[
2] = (C[
2] +
0x34d34d34 + ((C[
1]
>>> 0) < (C_[
1]
>>> 0) ?
1 :
0)) |
0;
26703 C[
3] = (C[
3] +
0x4d34d34d + ((C[
2]
>>> 0) < (C_[
2]
>>> 0) ?
1 :
0)) |
0;
26704 C[
4] = (C[
4] +
0xd34d34d3 + ((C[
3]
>>> 0) < (C_[
3]
>>> 0) ?
1 :
0)) |
0;
26705 C[
5] = (C[
5] +
0x34d34d34 + ((C[
4]
>>> 0) < (C_[
4]
>>> 0) ?
1 :
0)) |
0;
26706 C[
6] = (C[
6] +
0x4d34d34d + ((C[
5]
>>> 0) < (C_[
5]
>>> 0) ?
1 :
0)) |
0;
26707 C[
7] = (C[
7] +
0xd34d34d3 + ((C[
6]
>>> 0) < (C_[
6]
>>> 0) ?
1 :
0)) |
0;
26708 this._b = (C[
7]
>>> 0) < (C_[
7]
>>> 0) ?
1 :
0;
26710 // Calculate the g-values
26711 for (var i =
0; i <
8; i++) {
26712 var gx = X[i] + C[i];
26714 // Construct high and low argument for squaring
26715 var ga = gx &
0xffff;
26716 var gb = gx
>>> 16;
26718 // Calculate high and low result of squaring
26719 var gh = ((((ga * ga)
>>> 17) + ga * gb)
>>> 15) + gb * gb;
26720 var gl = (((gx &
0xffff0000) * gx) |
0) + (((gx &
0x0000ffff) * gx) |
0);
26726 // Calculate new state values
26727 X[
0] = (G[
0] + ((G[
7] <<
16) | (G[
7]
>>> 16)) + ((G[
6] <<
16) | (G[
6]
>>> 16))) |
0;
26728 X[
1] = (G[
1] + ((G[
0] <<
8) | (G[
0]
>>> 24)) + G[
7]) |
0;
26729 X[
2] = (G[
2] + ((G[
1] <<
16) | (G[
1]
>>> 16)) + ((G[
0] <<
16) | (G[
0]
>>> 16))) |
0;
26730 X[
3] = (G[
3] + ((G[
2] <<
8) | (G[
2]
>>> 24)) + G[
1]) |
0;
26731 X[
4] = (G[
4] + ((G[
3] <<
16) | (G[
3]
>>> 16)) + ((G[
2] <<
16) | (G[
2]
>>> 16))) |
0;
26732 X[
5] = (G[
5] + ((G[
4] <<
8) | (G[
4]
>>> 24)) + G[
3]) |
0;
26733 X[
6] = (G[
6] + ((G[
5] <<
16) | (G[
5]
>>> 16)) + ((G[
4] <<
16) | (G[
4]
>>> 16))) |
0;
26734 X[
7] = (G[
7] + ((G[
6] <<
8) | (G[
6]
>>> 24)) + G[
5]) |
0;
26738 * Shortcut functions to the cipher's object interface.
26742 * var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
26743 * var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
26745 C.Rabbit = StreamCipher._createHelper(Rabbit);
26749 return CryptoJS.Rabbit;
26752 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
53:[function(_dereq_,module,exports){
26753 ;(function (root, factory, undef) {
26754 if (typeof exports ===
"object") {
26756 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
26758 else if (typeof define ===
"function" && define.amd) {
26760 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
26763 // Global (browser)
26764 factory(root.CryptoJS);
26766 }(this, function (CryptoJS) {
26772 var StreamCipher = C_lib.StreamCipher;
26773 var C_algo = C.algo;
26776 * RC4 stream cipher algorithm.
26778 var RC4 = C_algo.RC4 = StreamCipher.extend({
26779 _doReset: function () {
26781 var key = this._key;
26782 var keyWords = key.words;
26783 var keySigBytes = key.sigBytes;
26786 var S = this._S = [];
26787 for (var i =
0; i <
256; i++) {
26792 for (var i =
0, j =
0; i <
256; i++) {
26793 var keyByteIndex = i % keySigBytes;
26794 var keyByte = (keyWords[keyByteIndex
>>> 2]
>>> (
24 - (keyByteIndex %
4) *
8)) &
0xff;
26796 j = (j + S[i] + keyByte) %
256;
26805 this._i = this._j =
0;
26808 _doProcessBlock: function (M, offset) {
26809 M[offset] ^= generateKeystreamWord.call(this);
26817 function generateKeystreamWord() {
26823 // Generate keystream word
26824 var keystreamWord =
0;
26825 for (var n =
0; n <
4; n++) {
26827 j = (j + S[i]) %
256;
26834 keystreamWord |= S[(S[i] + S[j]) %
256] << (
24 - n *
8);
26841 return keystreamWord;
26845 * Shortcut functions to the cipher's object interface.
26849 * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
26850 * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
26852 C.RC4 = StreamCipher._createHelper(RC4);
26855 * Modified RC4 stream cipher algorithm.
26857 var RC4Drop = C_algo.RC4Drop = RC4.extend({
26859 * Configuration options.
26861 * @property {number} drop The number of keystream words to drop. Default
192
26863 cfg: RC4.cfg.extend({
26867 _doReset: function () {
26868 RC4._doReset.call(this);
26871 for (var i = this.cfg.drop; i
> 0; i--) {
26872 generateKeystreamWord.call(this);
26878 * Shortcut functions to the cipher's object interface.
26882 * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
26883 * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
26885 C.RC4Drop = StreamCipher._createHelper(RC4Drop);
26889 return CryptoJS.RC4;
26892 },{
"./cipher-core":
30,
"./core":
31,
"./enc-base64":
32,
"./evpkdf":
34,
"./md5":
39}],
54:[function(_dereq_,module,exports){
26893 ;(function (root, factory) {
26894 if (typeof exports ===
"object") {
26896 module.exports = exports = factory(_dereq_(
"./core"));
26898 else if (typeof define ===
"function" && define.amd) {
26900 define([
"./core"], factory);
26903 // Global (browser)
26904 factory(root.CryptoJS);
26906 }(this, function (CryptoJS) {
26909 (c)
2012 by Cédric Mesnil. All rights reserved.
26911 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
26913 - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
26914 - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
26916 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26923 var WordArray = C_lib.WordArray;
26924 var Hasher = C_lib.Hasher;
26925 var C_algo = C.algo;
26928 var _zl = WordArray.create([
26929 0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
26930 7,
4,
13,
1,
10,
6,
15,
3,
12,
0,
9,
5,
2,
14,
11,
8,
26931 3,
10,
14,
4,
9,
15,
8,
1,
2,
7,
0,
6,
13,
11,
5,
12,
26932 1,
9,
11,
10,
0,
8,
12,
4,
13,
3,
7,
15,
14,
5,
6,
2,
26933 4,
0,
5,
9,
7,
12,
2,
10,
14,
1,
3,
8,
11,
6,
15,
13]);
26934 var _zr = WordArray.create([
26935 5,
14,
7,
0,
9,
2,
11,
4,
13,
6,
15,
8,
1,
10,
3,
12,
26936 6,
11,
3,
7,
0,
13,
5,
10,
14,
15,
8,
12,
4,
9,
1,
2,
26937 15,
5,
1,
3,
7,
14,
6,
9,
11,
8,
12,
2,
10,
0,
4,
13,
26938 8,
6,
4,
1,
3,
11,
15,
0,
5,
12,
2,
13,
9,
7,
10,
14,
26939 12,
15,
10,
4,
1,
5,
8,
7,
6,
2,
13,
14,
0,
3,
9,
11]);
26940 var _sl = WordArray.create([
26941 11,
14,
15,
12,
5,
8,
7,
9,
11,
13,
14,
15,
6,
7,
9,
8,
26942 7,
6,
8,
13,
11,
9,
7,
15,
7,
12,
15,
9,
11,
7,
13,
12,
26943 11,
13,
6,
7,
14,
9,
13,
15,
14,
8,
13,
6,
5,
12,
7,
5,
26944 11,
12,
14,
15,
14,
15,
9,
8,
9,
14,
5,
6,
8,
6,
5,
12,
26945 9,
15,
5,
11,
6,
8,
13,
12,
5,
12,
13,
14,
11,
8,
5,
6 ]);
26946 var _sr = WordArray.create([
26947 8,
9,
9,
11,
13,
15,
15,
5,
7,
7,
8,
11,
14,
14,
12,
6,
26948 9,
13,
15,
7,
12,
8,
9,
11,
7,
7,
12,
7,
6,
15,
13,
11,
26949 9,
7,
15,
11,
8,
6,
6,
14,
12,
13,
5,
14,
13,
13,
7,
5,
26950 15,
5,
8,
11,
14,
14,
6,
14,
6,
9,
12,
9,
12,
5,
15,
8,
26951 8,
5,
12,
9,
12,
5,
14,
6,
8,
13,
6,
5,
15,
13,
11,
11 ]);
26953 var _hl = WordArray.create([
0x00000000,
0x5A827999,
0x6ED9EBA1,
0x8F1BBCDC,
0xA953FD4E]);
26954 var _hr = WordArray.create([
0x50A28BE6,
0x5C4DD124,
0x6D703EF3,
0x7A6D76E9,
0x00000000]);
26957 * RIPEMD160 hash algorithm.
26959 var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
26960 _doReset: function () {
26961 this._hash = WordArray.create([
0x67452301,
0xEFCDAB89,
0x98BADCFE,
0x10325476,
0xC3D2E1F0]);
26964 _doProcessBlock: function (M, offset) {
26967 for (var i =
0; i <
16; i++) {
26969 var offset_i = offset + i;
26970 var M_offset_i = M[offset_i];
26974 (((M_offset_i <<
8) | (M_offset_i
>>> 24)) &
0x00ff00ff) |
26975 (((M_offset_i <<
24) | (M_offset_i
>>> 8)) &
0xff00ff00)
26979 var H = this._hash.words;
26980 var hl = _hl.words;
26981 var hr = _hr.words;
26982 var zl = _zl.words;
26983 var zr = _zr.words;
26984 var sl = _sl.words;
26985 var sr = _sr.words;
26987 // Working variables
26988 var al, bl, cl, dl, el;
26989 var ar, br, cr, dr, er;
26998 for (var i =
0; i <
80; i +=
1) {
26999 t = (al + M[offset+zl[i]])|
0;
27001 t += f1(bl,cl,dl) + hl[
0];
27003 t += f2(bl,cl,dl) + hl[
1];
27005 t += f3(bl,cl,dl) + hl[
2];
27007 t += f4(bl,cl,dl) + hl[
3];
27008 } else {// if (i
<80) {
27009 t += f5(bl,cl,dl) + hl[
4];
27020 t = (ar + M[offset+zr[i]])|
0;
27022 t += f5(br,cr,dr) + hr[
0];
27024 t += f4(br,cr,dr) + hr[
1];
27026 t += f3(br,cr,dr) + hr[
2];
27028 t += f2(br,cr,dr) + hr[
3];
27029 } else {// if (i
<80) {
27030 t += f1(br,cr,dr) + hr[
4];
27033 t = rotl(t,sr[i]) ;
27041 // Intermediate hash value
27042 t = (H[
1] + cl + dr)|
0;
27043 H[
1] = (H[
2] + dl + er)|
0;
27044 H[
2] = (H[
3] + el + ar)|
0;
27045 H[
3] = (H[
4] + al + br)|
0;
27046 H[
4] = (H[
0] + bl + cr)|
0;
27050 _doFinalize: function () {
27052 var data = this._data;
27053 var dataWords = data.words;
27055 var nBitsTotal = this._nDataBytes *
8;
27056 var nBitsLeft = data.sigBytes *
8;
27059 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27060 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = (
27061 (((nBitsTotal <<
8) | (nBitsTotal
>>> 24)) &
0x00ff00ff) |
27062 (((nBitsTotal <<
24) | (nBitsTotal
>>> 8)) &
0xff00ff00)
27064 data.sigBytes = (dataWords.length +
1) *
4;
27066 // Hash final blocks
27070 var hash = this._hash;
27071 var H = hash.words;
27074 for (var i =
0; i <
5; i++) {
27079 H[i] = (((H_i <<
8) | (H_i
>>> 24)) &
0x00ff00ff) |
27080 (((H_i <<
24) | (H_i
>>> 8)) &
0xff00ff00);
27083 // Return final computed hash
27087 clone: function () {
27088 var clone = Hasher.clone.call(this);
27089 clone._hash = this._hash.clone();
27096 function f1(x, y, z) {
27097 return ((x) ^ (y) ^ (z));
27101 function f2(x, y, z) {
27102 return (((x)&(y)) | ((~x)&(z)));
27105 function f3(x, y, z) {
27106 return (((x) | (~(y))) ^ (z));
27109 function f4(x, y, z) {
27110 return (((x) & (z)) | ((y)&(~(z))));
27113 function f5(x, y, z) {
27114 return ((x) ^ ((y) |(~(z))));
27118 function rotl(x,n) {
27119 return (x<
<n) | (x
>>>(
32-n));
27124 * Shortcut function to the hasher's object interface.
27126 * @param {WordArray|string} message The message to hash.
27128 * @return {WordArray} The hash.
27134 * var hash = CryptoJS.RIPEMD160('message');
27135 * var hash = CryptoJS.RIPEMD160(wordArray);
27137 C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
27140 * Shortcut function to the HMAC's object interface.
27142 * @param {WordArray|string} message The message to hash.
27143 * @param {WordArray|string} key The secret key.
27145 * @return {WordArray} The HMAC.
27151 * var hmac = CryptoJS.HmacRIPEMD160(message, key);
27153 C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
27157 return CryptoJS.RIPEMD160;
27160 },{"./core":
31}],
55:[function(_dereq_,module,exports){
27161 ;(function (root, factory) {
27162 if (typeof exports === "object") {
27164 module.exports = exports = factory(_dereq_("./core"));
27166 else if (typeof define === "function" && define.amd) {
27168 define(["./core"], factory);
27171 // Global (browser)
27172 factory(root.CryptoJS);
27174 }(this, function (CryptoJS) {
27180 var WordArray = C_lib.WordArray;
27181 var Hasher = C_lib.Hasher;
27182 var C_algo = C.algo;
27188 * SHA-
1 hash algorithm.
27190 var SHA1 = C_algo.SHA1 = Hasher.extend({
27191 _doReset: function () {
27192 this._hash = new WordArray.init([
27193 0x67452301,
0xefcdab89,
27194 0x98badcfe,
0x10325476,
27199 _doProcessBlock: function (M, offset) {
27201 var H = this._hash.words;
27203 // Working variables
27211 for (var i =
0; i <
80; i++) {
27213 W[i] = M[offset + i] |
0;
27215 var n = W[i -
3] ^ W[i -
8] ^ W[i -
14] ^ W[i -
16];
27216 W[i] = (n <<
1) | (n
>>> 31);
27219 var t = ((a <<
5) | (a
>>> 27)) + e + W[i];
27221 t += ((b & c) | (~b & d)) +
0x5a827999;
27222 } else if (i <
40) {
27223 t += (b ^ c ^ d) +
0x6ed9eba1;
27224 } else if (i <
60) {
27225 t += ((b & c) | (b & d) | (c & d)) -
0x70e44324;
27226 } else /* if (i <
80) */ {
27227 t += (b ^ c ^ d) -
0x359d3e2a;
27232 c = (b <<
30) | (b
>>> 2);
27237 // Intermediate hash value
27238 H[
0] = (H[
0] + a) |
0;
27239 H[
1] = (H[
1] + b) |
0;
27240 H[
2] = (H[
2] + c) |
0;
27241 H[
3] = (H[
3] + d) |
0;
27242 H[
4] = (H[
4] + e) |
0;
27245 _doFinalize: function () {
27247 var data = this._data;
27248 var dataWords = data.words;
27250 var nBitsTotal = this._nDataBytes *
8;
27251 var nBitsLeft = data.sigBytes *
8;
27254 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27255 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = Math.floor(nBitsTotal /
0x100000000);
27256 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = nBitsTotal;
27257 data.sigBytes = dataWords.length *
4;
27259 // Hash final blocks
27262 // Return final computed hash
27266 clone: function () {
27267 var clone = Hasher.clone.call(this);
27268 clone._hash = this._hash.clone();
27275 * Shortcut function to the hasher's object interface.
27277 * @param {WordArray|string} message The message to hash.
27279 * @return {WordArray} The hash.
27285 * var hash = CryptoJS.SHA1('message');
27286 * var hash = CryptoJS.SHA1(wordArray);
27288 C.SHA1 = Hasher._createHelper(SHA1);
27291 * Shortcut function to the HMAC's object interface.
27293 * @param {WordArray|string} message The message to hash.
27294 * @param {WordArray|string} key The secret key.
27296 * @return {WordArray} The HMAC.
27302 * var hmac = CryptoJS.HmacSHA1(message, key);
27304 C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
27308 return CryptoJS.SHA1;
27311 },{
"./core":
31}],
56:[function(_dereq_,module,exports){
27312 ;(function (root, factory, undef) {
27313 if (typeof exports ===
"object") {
27315 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./sha256"));
27317 else if (typeof define ===
"function" && define.amd) {
27319 define([
"./core",
"./sha256"], factory);
27322 // Global (browser)
27323 factory(root.CryptoJS);
27325 }(this, function (CryptoJS) {
27331 var WordArray = C_lib.WordArray;
27332 var C_algo = C.algo;
27333 var SHA256 = C_algo.SHA256;
27336 * SHA-
224 hash algorithm.
27338 var SHA224 = C_algo.SHA224 = SHA256.extend({
27339 _doReset: function () {
27340 this._hash = new WordArray.init([
27341 0xc1059ed8,
0x367cd507,
0x3070dd17,
0xf70e5939,
27342 0xffc00b31,
0x68581511,
0x64f98fa7,
0xbefa4fa4
27346 _doFinalize: function () {
27347 var hash = SHA256._doFinalize.call(this);
27349 hash.sigBytes -=
4;
27356 * Shortcut function to the hasher's object interface.
27358 * @param {WordArray|string} message The message to hash.
27360 * @return {WordArray} The hash.
27366 * var hash = CryptoJS.SHA224('message');
27367 * var hash = CryptoJS.SHA224(wordArray);
27369 C.SHA224 = SHA256._createHelper(SHA224);
27372 * Shortcut function to the HMAC's object interface.
27374 * @param {WordArray|string} message The message to hash.
27375 * @param {WordArray|string} key The secret key.
27377 * @return {WordArray} The HMAC.
27383 * var hmac = CryptoJS.HmacSHA224(message, key);
27385 C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
27389 return CryptoJS.SHA224;
27392 },{
"./core":
31,
"./sha256":
57}],
57:[function(_dereq_,module,exports){
27393 ;(function (root, factory) {
27394 if (typeof exports ===
"object") {
27396 module.exports = exports = factory(_dereq_(
"./core"));
27398 else if (typeof define ===
"function" && define.amd) {
27400 define([
"./core"], factory);
27403 // Global (browser)
27404 factory(root.CryptoJS);
27406 }(this, function (CryptoJS) {
27412 var WordArray = C_lib.WordArray;
27413 var Hasher = C_lib.Hasher;
27414 var C_algo = C.algo;
27416 // Initialization and round constants tables
27420 // Compute constants
27422 function isPrime(n) {
27423 var sqrtN = Math.sqrt(n);
27424 for (var factor =
2; factor <= sqrtN; factor++) {
27425 if (!(n % factor)) {
27433 function getFractionalBits(n) {
27434 return ((n - (n |
0)) *
0x100000000) |
0;
27439 while (nPrime <
64) {
27442 H[nPrime] = getFractionalBits(Math.pow(n,
1 /
2));
27444 K[nPrime] = getFractionalBits(Math.pow(n,
1 /
3));
27457 * SHA-
256 hash algorithm.
27459 var SHA256 = C_algo.SHA256 = Hasher.extend({
27460 _doReset: function () {
27461 this._hash = new WordArray.init(H.slice(
0));
27464 _doProcessBlock: function (M, offset) {
27466 var H = this._hash.words;
27468 // Working variables
27479 for (var i =
0; i <
64; i++) {
27481 W[i] = M[offset + i] |
0;
27483 var gamma0x = W[i -
15];
27484 var gamma0 = ((gamma0x <<
25) | (gamma0x
>>> 7)) ^
27485 ((gamma0x <<
14) | (gamma0x
>>> 18)) ^
27488 var gamma1x = W[i -
2];
27489 var gamma1 = ((gamma1x <<
15) | (gamma1x
>>> 17)) ^
27490 ((gamma1x <<
13) | (gamma1x
>>> 19)) ^
27493 W[i] = gamma0 + W[i -
7] + gamma1 + W[i -
16];
27496 var ch = (e & f) ^ (~e & g);
27497 var maj = (a & b) ^ (a & c) ^ (b & c);
27499 var sigma0 = ((a <<
30) | (a
>>> 2)) ^ ((a <<
19) | (a
>>> 13)) ^ ((a <<
10) | (a
>>> 22));
27500 var sigma1 = ((e <<
26) | (e
>>> 6)) ^ ((e <<
21) | (e
>>> 11)) ^ ((e <<
7) | (e
>>> 25));
27502 var t1 = h + sigma1 + ch + K[i] + W[i];
27503 var t2 = sigma0 + maj;
27515 // Intermediate hash value
27516 H[
0] = (H[
0] + a) |
0;
27517 H[
1] = (H[
1] + b) |
0;
27518 H[
2] = (H[
2] + c) |
0;
27519 H[
3] = (H[
3] + d) |
0;
27520 H[
4] = (H[
4] + e) |
0;
27521 H[
5] = (H[
5] + f) |
0;
27522 H[
6] = (H[
6] + g) |
0;
27523 H[
7] = (H[
7] + h) |
0;
27526 _doFinalize: function () {
27528 var data = this._data;
27529 var dataWords = data.words;
27531 var nBitsTotal = this._nDataBytes *
8;
27532 var nBitsLeft = data.sigBytes *
8;
27535 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
27536 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
14] = Math.floor(nBitsTotal /
0x100000000);
27537 dataWords[(((nBitsLeft +
64)
>>> 9) <<
4) +
15] = nBitsTotal;
27538 data.sigBytes = dataWords.length *
4;
27540 // Hash final blocks
27543 // Return final computed hash
27547 clone: function () {
27548 var clone = Hasher.clone.call(this);
27549 clone._hash = this._hash.clone();
27556 * Shortcut function to the hasher's object interface.
27558 * @param {WordArray|string} message The message to hash.
27560 * @return {WordArray} The hash.
27566 * var hash = CryptoJS.SHA256('message');
27567 * var hash = CryptoJS.SHA256(wordArray);
27569 C.SHA256 = Hasher._createHelper(SHA256);
27572 * Shortcut function to the HMAC's object interface.
27574 * @param {WordArray|string} message The message to hash.
27575 * @param {WordArray|string} key The secret key.
27577 * @return {WordArray} The HMAC.
27583 * var hmac = CryptoJS.HmacSHA256(message, key);
27585 C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
27589 return CryptoJS.SHA256;
27592 },{
"./core":
31}],
58:[function(_dereq_,module,exports){
27593 ;(function (root, factory, undef) {
27594 if (typeof exports ===
"object") {
27596 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"));
27598 else if (typeof define ===
"function" && define.amd) {
27600 define([
"./core",
"./x64-core"], factory);
27603 // Global (browser)
27604 factory(root.CryptoJS);
27606 }(this, function (CryptoJS) {
27612 var WordArray = C_lib.WordArray;
27613 var Hasher = C_lib.Hasher;
27615 var X64Word = C_x64.Word;
27616 var C_algo = C.algo;
27618 // Constants tables
27619 var RHO_OFFSETS = [];
27620 var PI_INDEXES = [];
27621 var ROUND_CONSTANTS = [];
27623 // Compute Constants
27625 // Compute rho offset constants
27627 for (var t =
0; t <
24; t++) {
27628 RHO_OFFSETS[x +
5 * y] = ((t +
1) * (t +
2) /
2) %
64;
27631 var newY = (
2 * x +
3 * y) %
5;
27636 // Compute pi index constants
27637 for (var x =
0; x <
5; x++) {
27638 for (var y =
0; y <
5; y++) {
27639 PI_INDEXES[x +
5 * y] = y + ((
2 * x +
3 * y) %
5) *
5;
27643 // Compute round constants
27645 for (var i =
0; i <
24; i++) {
27646 var roundConstantMsw =
0;
27647 var roundConstantLsw =
0;
27649 for (var j =
0; j <
7; j++) {
27651 var bitPosition = (
1 << j) -
1;
27652 if (bitPosition <
32) {
27653 roundConstantLsw ^=
1 << bitPosition;
27654 } else /* if (bitPosition
>=
32) */ {
27655 roundConstantMsw ^=
1 << (bitPosition -
32);
27659 // Compute next LFSR
27661 // Primitive polynomial over GF(
2): x^
8 + x^
6 + x^
5 + x^
4 +
1
27662 LFSR = (LFSR <<
1) ^
0x71;
27668 ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
27672 // Reusable objects for temporary values
27675 for (var i =
0; i <
25; i++) {
27676 T[i] = X64Word.create();
27681 * SHA-
3 hash algorithm.
27683 var SHA3 = C_algo.SHA3 = Hasher.extend({
27685 * Configuration options.
27687 * @property {number} outputLength
27688 * The desired number of bits in the output hash.
27689 * Only values permitted are:
224,
256,
384,
512.
27692 cfg: Hasher.cfg.extend({
27696 _doReset: function () {
27697 var state = this._state = []
27698 for (var i =
0; i <
25; i++) {
27699 state[i] = new X64Word.init();
27702 this.blockSize = (
1600 -
2 * this.cfg.outputLength) /
32;
27705 _doProcessBlock: function (M, offset) {
27707 var state = this._state;
27708 var nBlockSizeLanes = this.blockSize /
2;
27711 for (var i =
0; i < nBlockSizeLanes; i++) {
27713 var M2i = M[offset +
2 * i];
27714 var M2i1 = M[offset +
2 * i +
1];
27718 (((M2i <<
8) | (M2i
>>> 24)) &
0x00ff00ff) |
27719 (((M2i <<
24) | (M2i
>>> 8)) &
0xff00ff00)
27722 (((M2i1 <<
8) | (M2i1
>>> 24)) &
0x00ff00ff) |
27723 (((M2i1 <<
24) | (M2i1
>>> 8)) &
0xff00ff00)
27726 // Absorb message into state
27727 var lane = state[i];
27733 for (var round =
0; round <
24; round++) {
27735 for (var x =
0; x <
5; x++) {
27736 // Mix column lanes
27737 var tMsw =
0, tLsw =
0;
27738 for (var y =
0; y <
5; y++) {
27739 var lane = state[x +
5 * y];
27744 // Temporary values
27749 for (var x =
0; x <
5; x++) {
27751 var Tx4 = T[(x +
4) %
5];
27752 var Tx1 = T[(x +
1) %
5];
27753 var Tx1Msw = Tx1.high;
27754 var Tx1Lsw = Tx1.low;
27756 // Mix surrounding columns
27757 var tMsw = Tx4.high ^ ((Tx1Msw <<
1) | (Tx1Lsw
>>> 31));
27758 var tLsw = Tx4.low ^ ((Tx1Lsw <<
1) | (Tx1Msw
>>> 31));
27759 for (var y =
0; y <
5; y++) {
27760 var lane = state[x +
5 * y];
27767 for (var laneIndex =
1; laneIndex <
25; laneIndex++) {
27769 var lane = state[laneIndex];
27770 var laneMsw = lane.high;
27771 var laneLsw = lane.low;
27772 var rhoOffset = RHO_OFFSETS[laneIndex];
27775 if (rhoOffset <
32) {
27776 var tMsw = (laneMsw << rhoOffset) | (laneLsw
>>> (
32 - rhoOffset));
27777 var tLsw = (laneLsw << rhoOffset) | (laneMsw
>>> (
32 - rhoOffset));
27778 } else /* if (rhoOffset
>=
32) */ {
27779 var tMsw = (laneLsw << (rhoOffset -
32)) | (laneMsw
>>> (
64 - rhoOffset));
27780 var tLsw = (laneMsw << (rhoOffset -
32)) | (laneLsw
>>> (
64 - rhoOffset));
27784 var TPiLane = T[PI_INDEXES[laneIndex]];
27785 TPiLane.high = tMsw;
27786 TPiLane.low = tLsw;
27789 // Rho pi at x = y =
0
27791 var state0 = state[
0];
27792 T0.high = state0.high;
27793 T0.low = state0.low;
27796 for (var x =
0; x <
5; x++) {
27797 for (var y =
0; y <
5; y++) {
27799 var laneIndex = x +
5 * y;
27800 var lane = state[laneIndex];
27801 var TLane = T[laneIndex];
27802 var Tx1Lane = T[((x +
1) %
5) +
5 * y];
27803 var Tx2Lane = T[((x +
2) %
5) +
5 * y];
27806 lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
27807 lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
27812 var lane = state[
0];
27813 var roundConstant = ROUND_CONSTANTS[round];
27814 lane.high ^= roundConstant.high;
27815 lane.low ^= roundConstant.low;;
27819 _doFinalize: function () {
27821 var data = this._data;
27822 var dataWords = data.words;
27823 var nBitsTotal = this._nDataBytes *
8;
27824 var nBitsLeft = data.sigBytes *
8;
27825 var blockSizeBits = this.blockSize *
32;
27828 dataWords[nBitsLeft
>>> 5] |=
0x1 << (
24 - nBitsLeft %
32);
27829 dataWords[((Math.ceil((nBitsLeft +
1) / blockSizeBits) * blockSizeBits)
>>> 5) -
1] |=
0x80;
27830 data.sigBytes = dataWords.length *
4;
27832 // Hash final blocks
27836 var state = this._state;
27837 var outputLengthBytes = this.cfg.outputLength /
8;
27838 var outputLengthLanes = outputLengthBytes /
8;
27841 var hashWords = [];
27842 for (var i =
0; i < outputLengthLanes; i++) {
27844 var lane = state[i];
27845 var laneMsw = lane.high;
27846 var laneLsw = lane.low;
27850 (((laneMsw <<
8) | (laneMsw
>>> 24)) &
0x00ff00ff) |
27851 (((laneMsw <<
24) | (laneMsw
>>> 8)) &
0xff00ff00)
27854 (((laneLsw <<
8) | (laneLsw
>>> 24)) &
0x00ff00ff) |
27855 (((laneLsw <<
24) | (laneLsw
>>> 8)) &
0xff00ff00)
27858 // Squeeze state to retrieve hash
27859 hashWords.push(laneLsw);
27860 hashWords.push(laneMsw);
27863 // Return final computed hash
27864 return new WordArray.init(hashWords, outputLengthBytes);
27867 clone: function () {
27868 var clone = Hasher.clone.call(this);
27870 var state = clone._state = this._state.slice(
0);
27871 for (var i =
0; i <
25; i++) {
27872 state[i] = state[i].clone();
27880 * Shortcut function to the hasher's object interface.
27882 * @param {WordArray|string} message The message to hash.
27884 * @return {WordArray} The hash.
27890 * var hash = CryptoJS.SHA3('message');
27891 * var hash = CryptoJS.SHA3(wordArray);
27893 C.SHA3 = Hasher._createHelper(SHA3);
27896 * Shortcut function to the HMAC's object interface.
27898 * @param {WordArray|string} message The message to hash.
27899 * @param {WordArray|string} key The secret key.
27901 * @return {WordArray} The HMAC.
27907 * var hmac = CryptoJS.HmacSHA3(message, key);
27909 C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
27913 return CryptoJS.SHA3;
27916 },{
"./core":
31,
"./x64-core":
62}],
59:[function(_dereq_,module,exports){
27917 ;(function (root, factory, undef) {
27918 if (typeof exports ===
"object") {
27920 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"), _dereq_(
"./sha512"));
27922 else if (typeof define ===
"function" && define.amd) {
27924 define([
"./core",
"./x64-core",
"./sha512"], factory);
27927 // Global (browser)
27928 factory(root.CryptoJS);
27930 }(this, function (CryptoJS) {
27936 var X64Word = C_x64.Word;
27937 var X64WordArray = C_x64.WordArray;
27938 var C_algo = C.algo;
27939 var SHA512 = C_algo.SHA512;
27942 * SHA-
384 hash algorithm.
27944 var SHA384 = C_algo.SHA384 = SHA512.extend({
27945 _doReset: function () {
27946 this._hash = new X64WordArray.init([
27947 new X64Word.init(
0xcbbb9d5d,
0xc1059ed8), new X64Word.init(
0x629a292a,
0x367cd507),
27948 new X64Word.init(
0x9159015a,
0x3070dd17), new X64Word.init(
0x152fecd8,
0xf70e5939),
27949 new X64Word.init(
0x67332667,
0xffc00b31), new X64Word.init(
0x8eb44a87,
0x68581511),
27950 new X64Word.init(
0xdb0c2e0d,
0x64f98fa7), new X64Word.init(
0x47b5481d,
0xbefa4fa4)
27954 _doFinalize: function () {
27955 var hash = SHA512._doFinalize.call(this);
27957 hash.sigBytes -=
16;
27964 * Shortcut function to the hasher's object interface.
27966 * @param {WordArray|string} message The message to hash.
27968 * @return {WordArray} The hash.
27974 * var hash = CryptoJS.SHA384('message');
27975 * var hash = CryptoJS.SHA384(wordArray);
27977 C.SHA384 = SHA512._createHelper(SHA384);
27980 * Shortcut function to the HMAC's object interface.
27982 * @param {WordArray|string} message The message to hash.
27983 * @param {WordArray|string} key The secret key.
27985 * @return {WordArray} The HMAC.
27991 * var hmac = CryptoJS.HmacSHA384(message, key);
27993 C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
27997 return CryptoJS.SHA384;
28000 },{
"./core":
31,
"./sha512":
60,
"./x64-core":
62}],
60:[function(_dereq_,module,exports){
28001 ;(function (root, factory, undef) {
28002 if (typeof exports ===
"object") {
28004 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./x64-core"));
28006 else if (typeof define ===
"function" && define.amd) {
28008 define([
"./core",
"./x64-core"], factory);
28011 // Global (browser)
28012 factory(root.CryptoJS);
28014 }(this, function (CryptoJS) {
28020 var Hasher = C_lib.Hasher;
28022 var X64Word = C_x64.Word;
28023 var X64WordArray = C_x64.WordArray;
28024 var C_algo = C.algo;
28026 function X64Word_create() {
28027 return X64Word.create.apply(X64Word, arguments);
28032 X64Word_create(
0x428a2f98,
0xd728ae22), X64Word_create(
0x71374491,
0x23ef65cd),
28033 X64Word_create(
0xb5c0fbcf,
0xec4d3b2f), X64Word_create(
0xe9b5dba5,
0x8189dbbc),
28034 X64Word_create(
0x3956c25b,
0xf348b538), X64Word_create(
0x59f111f1,
0xb605d019),
28035 X64Word_create(
0x923f82a4,
0xaf194f9b), X64Word_create(
0xab1c5ed5,
0xda6d8118),
28036 X64Word_create(
0xd807aa98,
0xa3030242), X64Word_create(
0x12835b01,
0x45706fbe),
28037 X64Word_create(
0x243185be,
0x4ee4b28c), X64Word_create(
0x550c7dc3,
0xd5ffb4e2),
28038 X64Word_create(
0x72be5d74,
0xf27b896f), X64Word_create(
0x80deb1fe,
0x3b1696b1),
28039 X64Word_create(
0x9bdc06a7,
0x25c71235), X64Word_create(
0xc19bf174,
0xcf692694),
28040 X64Word_create(
0xe49b69c1,
0x9ef14ad2), X64Word_create(
0xefbe4786,
0x384f25e3),
28041 X64Word_create(
0x0fc19dc6,
0x8b8cd5b5), X64Word_create(
0x240ca1cc,
0x77ac9c65),
28042 X64Word_create(
0x2de92c6f,
0x592b0275), X64Word_create(
0x4a7484aa,
0x6ea6e483),
28043 X64Word_create(
0x5cb0a9dc,
0xbd41fbd4), X64Word_create(
0x76f988da,
0x831153b5),
28044 X64Word_create(
0x983e5152,
0xee66dfab), X64Word_create(
0xa831c66d,
0x2db43210),
28045 X64Word_create(
0xb00327c8,
0x98fb213f), X64Word_create(
0xbf597fc7,
0xbeef0ee4),
28046 X64Word_create(
0xc6e00bf3,
0x3da88fc2), X64Word_create(
0xd5a79147,
0x930aa725),
28047 X64Word_create(
0x06ca6351,
0xe003826f), X64Word_create(
0x14292967,
0x0a0e6e70),
28048 X64Word_create(
0x27b70a85,
0x46d22ffc), X64Word_create(
0x2e1b2138,
0x5c26c926),
28049 X64Word_create(
0x4d2c6dfc,
0x5ac42aed), X64Word_create(
0x53380d13,
0x9d95b3df),
28050 X64Word_create(
0x650a7354,
0x8baf63de), X64Word_create(
0x766a0abb,
0x3c77b2a8),
28051 X64Word_create(
0x81c2c92e,
0x47edaee6), X64Word_create(
0x92722c85,
0x1482353b),
28052 X64Word_create(
0xa2bfe8a1,
0x4cf10364), X64Word_create(
0xa81a664b,
0xbc423001),
28053 X64Word_create(
0xc24b8b70,
0xd0f89791), X64Word_create(
0xc76c51a3,
0x0654be30),
28054 X64Word_create(
0xd192e819,
0xd6ef5218), X64Word_create(
0xd6990624,
0x5565a910),
28055 X64Word_create(
0xf40e3585,
0x5771202a), X64Word_create(
0x106aa070,
0x32bbd1b8),
28056 X64Word_create(
0x19a4c116,
0xb8d2d0c8), X64Word_create(
0x1e376c08,
0x5141ab53),
28057 X64Word_create(
0x2748774c,
0xdf8eeb99), X64Word_create(
0x34b0bcb5,
0xe19b48a8),
28058 X64Word_create(
0x391c0cb3,
0xc5c95a63), X64Word_create(
0x4ed8aa4a,
0xe3418acb),
28059 X64Word_create(
0x5b9cca4f,
0x7763e373), X64Word_create(
0x682e6ff3,
0xd6b2b8a3),
28060 X64Word_create(
0x748f82ee,
0x5defb2fc), X64Word_create(
0x78a5636f,
0x43172f60),
28061 X64Word_create(
0x84c87814,
0xa1f0ab72), X64Word_create(
0x8cc70208,
0x1a6439ec),
28062 X64Word_create(
0x90befffa,
0x23631e28), X64Word_create(
0xa4506ceb,
0xde82bde9),
28063 X64Word_create(
0xbef9a3f7,
0xb2c67915), X64Word_create(
0xc67178f2,
0xe372532b),
28064 X64Word_create(
0xca273ece,
0xea26619c), X64Word_create(
0xd186b8c7,
0x21c0c207),
28065 X64Word_create(
0xeada7dd6,
0xcde0eb1e), X64Word_create(
0xf57d4f7f,
0xee6ed178),
28066 X64Word_create(
0x06f067aa,
0x72176fba), X64Word_create(
0x0a637dc5,
0xa2c898a6),
28067 X64Word_create(
0x113f9804,
0xbef90dae), X64Word_create(
0x1b710b35,
0x131c471b),
28068 X64Word_create(
0x28db77f5,
0x23047d84), X64Word_create(
0x32caab7b,
0x40c72493),
28069 X64Word_create(
0x3c9ebe0a,
0x15c9bebc), X64Word_create(
0x431d67c4,
0x9c100d4c),
28070 X64Word_create(
0x4cc5d4be,
0xcb3e42b6), X64Word_create(
0x597f299c,
0xfc657e2a),
28071 X64Word_create(
0x5fcb6fab,
0x3ad6faec), X64Word_create(
0x6c44198c,
0x4a475817)
28074 // Reusable objects
28077 for (var i =
0; i <
80; i++) {
28078 W[i] = X64Word_create();
28083 * SHA-
512 hash algorithm.
28085 var SHA512 = C_algo.SHA512 = Hasher.extend({
28086 _doReset: function () {
28087 this._hash = new X64WordArray.init([
28088 new X64Word.init(
0x6a09e667,
0xf3bcc908), new X64Word.init(
0xbb67ae85,
0x84caa73b),
28089 new X64Word.init(
0x3c6ef372,
0xfe94f82b), new X64Word.init(
0xa54ff53a,
0x5f1d36f1),
28090 new X64Word.init(
0x510e527f,
0xade682d1), new X64Word.init(
0x9b05688c,
0x2b3e6c1f),
28091 new X64Word.init(
0x1f83d9ab,
0xfb41bd6b), new X64Word.init(
0x5be0cd19,
0x137e2179)
28095 _doProcessBlock: function (M, offset) {
28097 var H = this._hash.words;
28125 // Working variables
28144 for (var i =
0; i <
80; i++) {
28150 var Wih = Wi.high = M[offset + i *
2] |
0;
28151 var Wil = Wi.low = M[offset + i *
2 +
1] |
0;
28154 var gamma0x = W[i -
15];
28155 var gamma0xh = gamma0x.high;
28156 var gamma0xl = gamma0x.low;
28157 var gamma0h = ((gamma0xh
>>> 1) | (gamma0xl <<
31)) ^ ((gamma0xh
>>> 8) | (gamma0xl <<
24)) ^ (gamma0xh
>>> 7);
28158 var gamma0l = ((gamma0xl
>>> 1) | (gamma0xh <<
31)) ^ ((gamma0xl
>>> 8) | (gamma0xh <<
24)) ^ ((gamma0xl
>>> 7) | (gamma0xh <<
25));
28161 var gamma1x = W[i -
2];
28162 var gamma1xh = gamma1x.high;
28163 var gamma1xl = gamma1x.low;
28164 var gamma1h = ((gamma1xh
>>> 19) | (gamma1xl <<
13)) ^ ((gamma1xh <<
3) | (gamma1xl
>>> 29)) ^ (gamma1xh
>>> 6);
28165 var gamma1l = ((gamma1xl
>>> 19) | (gamma1xh <<
13)) ^ ((gamma1xl <<
3) | (gamma1xh
>>> 29)) ^ ((gamma1xl
>>> 6) | (gamma1xh <<
26));
28167 // W[i] = gamma0 + W[i -
7] + gamma1 + W[i -
16]
28168 var Wi7 = W[i -
7];
28169 var Wi7h = Wi7.high;
28170 var Wi7l = Wi7.low;
28172 var Wi16 = W[i -
16];
28173 var Wi16h = Wi16.high;
28174 var Wi16l = Wi16.low;
28176 var Wil = gamma0l + Wi7l;
28177 var Wih = gamma0h + Wi7h + ((Wil
>>> 0) < (gamma0l
>>> 0) ?
1 :
0);
28178 var Wil = Wil + gamma1l;
28179 var Wih = Wih + gamma1h + ((Wil
>>> 0) < (gamma1l
>>> 0) ?
1 :
0);
28180 var Wil = Wil + Wi16l;
28181 var Wih = Wih + Wi16h + ((Wil
>>> 0) < (Wi16l
>>> 0) ?
1 :
0);
28187 var chh = (eh & fh) ^ (~eh & gh);
28188 var chl = (el & fl) ^ (~el & gl);
28189 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
28190 var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
28192 var sigma0h = ((ah
>>> 28) | (al <<
4)) ^ ((ah <<
30) | (al
>>> 2)) ^ ((ah <<
25) | (al
>>> 7));
28193 var sigma0l = ((al
>>> 28) | (ah <<
4)) ^ ((al <<
30) | (ah
>>> 2)) ^ ((al <<
25) | (ah
>>> 7));
28194 var sigma1h = ((eh
>>> 14) | (el <<
18)) ^ ((eh
>>> 18) | (el <<
14)) ^ ((eh <<
23) | (el
>>> 9));
28195 var sigma1l = ((el
>>> 14) | (eh <<
18)) ^ ((el
>>> 18) | (eh <<
14)) ^ ((el <<
23) | (eh
>>> 9));
28197 // t1 = h + sigma1 + ch + K[i] + W[i]
28202 var t1l = hl + sigma1l;
28203 var t1h = hh + sigma1h + ((t1l
>>> 0) < (hl
>>> 0) ?
1 :
0);
28204 var t1l = t1l + chl;
28205 var t1h = t1h + chh + ((t1l
>>> 0) < (chl
>>> 0) ?
1 :
0);
28206 var t1l = t1l + Kil;
28207 var t1h = t1h + Kih + ((t1l
>>> 0) < (Kil
>>> 0) ?
1 :
0);
28208 var t1l = t1l + Wil;
28209 var t1h = t1h + Wih + ((t1l
>>> 0) < (Wil
>>> 0) ?
1 :
0);
28211 // t2 = sigma0 + maj
28212 var t2l = sigma0l + majl;
28213 var t2h = sigma0h + majh + ((t2l
>>> 0) < (sigma0l
>>> 0) ?
1 :
0);
28215 // Update working variables
28222 el = (dl + t1l) |
0;
28223 eh = (dh + t1h + ((el
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
28230 al = (t1l + t2l) |
0;
28231 ah = (t1h + t2h + ((al
>>> 0) < (t1l
>>> 0) ?
1 :
0)) |
0;
28234 // Intermediate hash value
28235 H0l = H0.low = (H0l + al);
28236 H0.high = (H0h + ah + ((H0l
>>> 0) < (al
>>> 0) ?
1 :
0));
28237 H1l = H1.low = (H1l + bl);
28238 H1.high = (H1h + bh + ((H1l
>>> 0) < (bl
>>> 0) ?
1 :
0));
28239 H2l = H2.low = (H2l + cl);
28240 H2.high = (H2h + ch + ((H2l
>>> 0) < (cl
>>> 0) ?
1 :
0));
28241 H3l = H3.low = (H3l + dl);
28242 H3.high = (H3h + dh + ((H3l
>>> 0) < (dl
>>> 0) ?
1 :
0));
28243 H4l = H4.low = (H4l + el);
28244 H4.high = (H4h + eh + ((H4l
>>> 0) < (el
>>> 0) ?
1 :
0));
28245 H5l = H5.low = (H5l + fl);
28246 H5.high = (H5h + fh + ((H5l
>>> 0) < (fl
>>> 0) ?
1 :
0));
28247 H6l = H6.low = (H6l + gl);
28248 H6.high = (H6h + gh + ((H6l
>>> 0) < (gl
>>> 0) ?
1 :
0));
28249 H7l = H7.low = (H7l + hl);
28250 H7.high = (H7h + hh + ((H7l
>>> 0) < (hl
>>> 0) ?
1 :
0));
28253 _doFinalize: function () {
28255 var data = this._data;
28256 var dataWords = data.words;
28258 var nBitsTotal = this._nDataBytes *
8;
28259 var nBitsLeft = data.sigBytes *
8;
28262 dataWords[nBitsLeft
>>> 5] |=
0x80 << (
24 - nBitsLeft %
32);
28263 dataWords[(((nBitsLeft +
128)
>>> 10) <<
5) +
30] = Math.floor(nBitsTotal /
0x100000000);
28264 dataWords[(((nBitsLeft +
128)
>>> 10) <<
5) +
31] = nBitsTotal;
28265 data.sigBytes = dataWords.length *
4;
28267 // Hash final blocks
28270 // Convert hash to
32-bit word array before returning
28271 var hash = this._hash.toX32();
28273 // Return final computed hash
28277 clone: function () {
28278 var clone = Hasher.clone.call(this);
28279 clone._hash = this._hash.clone();
28288 * Shortcut function to the hasher's object interface.
28290 * @param {WordArray|string} message The message to hash.
28292 * @return {WordArray} The hash.
28298 * var hash = CryptoJS.SHA512('message');
28299 * var hash = CryptoJS.SHA512(wordArray);
28301 C.SHA512 = Hasher._createHelper(SHA512);
28304 * Shortcut function to the HMAC's object interface.
28306 * @param {WordArray|string} message The message to hash.
28307 * @param {WordArray|string} key The secret key.
28309 * @return {WordArray} The HMAC.
28315 * var hmac = CryptoJS.HmacSHA512(message, key);
28317 C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
28321 return CryptoJS.SHA512;
28324 },{
"./core":
31,
"./x64-core":
62}],
61:[function(_dereq_,module,exports){
28325 ;(function (root, factory, undef) {
28326 if (typeof exports ===
"object") {
28328 module.exports = exports = factory(_dereq_(
"./core"), _dereq_(
"./enc-base64"), _dereq_(
"./md5"), _dereq_(
"./evpkdf"), _dereq_(
"./cipher-core"));
28330 else if (typeof define ===
"function" && define.amd) {
28332 define([
"./core",
"./enc-base64",
"./md5",
"./evpkdf",
"./cipher-core"], factory);
28335 // Global (browser)
28336 factory(root.CryptoJS);
28338 }(this, function (CryptoJS) {
28344 var WordArray = C_lib.WordArray;
28345 var BlockCipher = C_lib.BlockCipher;
28346 var C_algo = C.algo;
28348 // Permuted Choice
1 constants
28350 57,
49,
41,
33,
25,
17,
9,
1,
28351 58,
50,
42,
34,
26,
18,
10,
2,
28352 59,
51,
43,
35,
27,
19,
11,
3,
28353 60,
52,
44,
36,
63,
55,
47,
39,
28354 31,
23,
15,
7,
62,
54,
46,
38,
28355 30,
22,
14,
6,
61,
53,
45,
37,
28356 29,
21,
13,
5,
28,
20,
12,
4
28359 // Permuted Choice
2 constants
28361 14,
17,
11,
24,
1,
5,
28362 3,
28,
15,
6,
21,
10,
28363 23,
19,
12,
4,
26,
8,
28364 16,
7,
27,
20,
13,
2,
28365 41,
52,
31,
37,
47,
55,
28366 30,
40,
51,
45,
33,
48,
28367 44,
49,
39,
56,
34,
53,
28368 46,
42,
50,
36,
29,
32
28371 // Cumulative bit shift constants
28372 var BIT_SHIFTS = [
1,
2,
4,
6,
8,
10,
12,
14,
15,
17,
19,
21,
23,
25,
27,
28];
28374 // SBOXes and round permutation constants
28378 0x10000000:
0x8000,
28379 0x20000000:
0x808002,
28382 0x50000000:
0x808202,
28383 0x60000000:
0x800202,
28384 0x70000000:
0x800000,
28386 0x90000000:
0x800200,
28387 0xa0000000:
0x8200,
28388 0xb0000000:
0x808000,
28389 0xc0000000:
0x8002,
28390 0xd0000000:
0x800002,
28392 0xf0000000:
0x8202,
28394 0x18000000:
0x808202,
28395 0x28000000:
0x8202,
28396 0x38000000:
0x8000,
28397 0x48000000:
0x808200,
28399 0x68000000:
0x808002,
28401 0x88000000:
0x800200,
28402 0x98000000:
0x8200,
28403 0xa8000000:
0x808000,
28404 0xb8000000:
0x800202,
28405 0xc8000000:
0x800002,
28406 0xd8000000:
0x8002,
28408 0xf8000000:
0x800000,
28411 0x20000001:
0x808200,
28412 0x30000001:
0x800000,
28413 0x40000001:
0x808002,
28414 0x50000001:
0x8200,
28416 0x70000001:
0x800202,
28417 0x80000001:
0x808202,
28418 0x90000001:
0x808000,
28419 0xa0000001:
0x800002,
28420 0xb0000001:
0x8202,
28422 0xd0000001:
0x800200,
28423 0xe0000001:
0x8002,
28425 0x8000001:
0x808202,
28426 0x18000001:
0x808000,
28427 0x28000001:
0x800000,
28429 0x48000001:
0x8000,
28430 0x58000001:
0x800002,
28432 0x78000001:
0x8202,
28433 0x88000001:
0x8002,
28434 0x98000001:
0x800202,
28436 0xb8000001:
0x808200,
28437 0xc8000001:
0x800200,
28439 0xe8000001:
0x8200,
28440 0xf8000001:
0x808002
28445 0x2000000:
0x80000,
28446 0x3000000:
0x40080010,
28447 0x4000000:
0x40000010,
28448 0x5000000:
0x40084000,
28449 0x6000000:
0x40004000,
28451 0x8000000:
0x84000,
28452 0x9000000:
0x40004010,
28453 0xa000000:
0x40000000,
28454 0xb000000:
0x84010,
28455 0xc000000:
0x80010,
28458 0xf000000:
0x40080000,
28459 0x800000:
0x40004000,
28460 0x1800000:
0x84010,
28462 0x3800000:
0x40004010,
28463 0x4800000:
0x40084010,
28464 0x5800000:
0x40000000,
28465 0x6800000:
0x80000,
28466 0x7800000:
0x40080010,
28467 0x8800000:
0x80010,
28470 0xb800000:
0x40080000,
28471 0xc800000:
0x40000010,
28472 0xd800000:
0x84000,
28473 0xe800000:
0x40084000,
28476 0x11000000:
0x40080010,
28477 0x12000000:
0x40004010,
28478 0x13000000:
0x40084000,
28479 0x14000000:
0x40080000,
28481 0x16000000:
0x84010,
28482 0x17000000:
0x4000,
28483 0x18000000:
0x4010,
28484 0x19000000:
0x80000,
28485 0x1a000000:
0x80010,
28486 0x1b000000:
0x40000010,
28487 0x1c000000:
0x84000,
28488 0x1d000000:
0x40004000,
28489 0x1e000000:
0x40000000,
28490 0x1f000000:
0x40084010,
28491 0x10800000:
0x84010,
28492 0x11800000:
0x80000,
28493 0x12800000:
0x40080000,
28494 0x13800000:
0x4000,
28495 0x14800000:
0x40004000,
28496 0x15800000:
0x40084010,
28498 0x17800000:
0x40000000,
28499 0x18800000:
0x40084000,
28500 0x19800000:
0x40000010,
28501 0x1a800000:
0x40004010,
28502 0x1b800000:
0x80010,
28504 0x1d800000:
0x4010,
28505 0x1e800000:
0x40080010,
28506 0x1f800000:
0x84000
28511 0x200000:
0x4000100,
28514 0x500000:
0x4000004,
28515 0x600000:
0x4010104,
28516 0x700000:
0x4010000,
28517 0x800000:
0x4000000,
28518 0x900000:
0x4010100,
28520 0xb00000:
0x4010004,
28521 0xc00000:
0x4000104,
28525 0x80000:
0x4010100,
28526 0x180000:
0x4010004,
28528 0x380000:
0x4000100,
28529 0x480000:
0x4000004,
28535 0xa80000:
0x4010000,
28538 0xd80000:
0x4000104,
28539 0xe80000:
0x4010104,
28540 0xf80000:
0x4000000,
28541 0x1000000:
0x4010100,
28542 0x1100000:
0x10004,
28543 0x1200000:
0x10000,
28544 0x1300000:
0x4000100,
28546 0x1500000:
0x4010104,
28547 0x1600000:
0x4000004,
28549 0x1800000:
0x4000104,
28550 0x1900000:
0x4000000,
28552 0x1b00000:
0x10100,
28553 0x1c00000:
0x4010000,
28555 0x1e00000:
0x10104,
28556 0x1f00000:
0x4010004,
28557 0x1080000:
0x4000000,
28559 0x1280000:
0x4010100,
28561 0x1480000:
0x10004,
28562 0x1580000:
0x4000100,
28564 0x1780000:
0x4010004,
28565 0x1880000:
0x10000,
28566 0x1980000:
0x4010104,
28567 0x1a80000:
0x10104,
28568 0x1b80000:
0x4000004,
28569 0x1c80000:
0x4000104,
28570 0x1d80000:
0x4010000,
28576 0x10000:
0x80001040,
28578 0x30000:
0x80400000,
28581 0x60000:
0x80000040,
28583 0x80000:
0x80000000,
28586 0xb0000:
0x80001000,
28587 0xc0000:
0x80400040,
28590 0xf0000:
0x80401040,
28591 0x8000:
0x80001040,
28593 0x28000:
0x80400040,
28594 0x38000:
0x80001000,
28596 0x58000:
0x80401040,
28598 0x78000:
0x80400000,
28600 0x98000:
0x80401000,
28603 0xc8000:
0x80000000,
28606 0xf8000:
0x80000040,
28607 0x100000:
0x400040,
28608 0x110000:
0x401000,
28609 0x120000:
0x80000040,
28612 0x150000:
0x80400040,
28613 0x160000:
0x80401000,
28614 0x170000:
0x80001040,
28615 0x180000:
0x80401040,
28616 0x190000:
0x80000000,
28617 0x1a0000:
0x80400000,
28618 0x1b0000:
0x401040,
28619 0x1c0000:
0x80001000,
28620 0x1d0000:
0x400000,
28623 0x108000:
0x80400000,
28624 0x118000:
0x80401040,
28626 0x138000:
0x401000,
28627 0x148000:
0x400040,
28628 0x158000:
0x80000000,
28629 0x168000:
0x80001040,
28631 0x188000:
0x80000040,
28633 0x1a8000:
0x80001000,
28634 0x1b8000:
0x80400040,
28636 0x1d8000:
0x80401000,
28637 0x1e8000:
0x400000,
28644 0x3000:
0x20000000,
28645 0x4000:
0x20040080,
28647 0x6000:
0x21000080,
28650 0x9000:
0x20040000,
28651 0xa000:
0x20000080,
28652 0xb000:
0x21040080,
28653 0xc000:
0x21040000,
28656 0xf000:
0x21000000,
28658 0x1800:
0x21000080,
28662 0x5800:
0x20040080,
28663 0x6800:
0x21040000,
28664 0x7800:
0x20000000,
28665 0x8800:
0x20040000,
28667 0xa800:
0x21040080,
28669 0xc800:
0x20000080,
28670 0xd800:
0x21000000,
28675 0x12000:
0x20000000,
28676 0x13000:
0x21000080,
28677 0x14000:
0x1000080,
28678 0x15000:
0x21040000,
28679 0x16000:
0x20040080,
28680 0x17000:
0x1000000,
28681 0x18000:
0x21040080,
28682 0x19000:
0x21000000,
28683 0x1a000:
0x1040000,
28684 0x1b000:
0x20040000,
28686 0x1d000:
0x20000080,
28688 0x1f000:
0x1040080,
28689 0x10800:
0x21000080,
28690 0x11800:
0x1000000,
28691 0x12800:
0x1040000,
28692 0x13800:
0x20040080,
28693 0x14800:
0x20000000,
28694 0x15800:
0x1040080,
28696 0x17800:
0x21040000,
28698 0x19800:
0x21040080,
28700 0x1b800:
0x21000000,
28701 0x1c800:
0x1000080,
28703 0x1e800:
0x20040000,
28704 0x1f800:
0x20000080
28739 0x1000:
0x10002000,
28740 0x1100:
0x10200008,
28741 0x1200:
0x10202008,
28744 0x1500:
0x10000000,
28745 0x1600:
0x10000008,
28750 0x1b00:
0x10200000,
28752 0x1d00:
0x10002008,
28753 0x1e00:
0x10202000,
28758 0x1380:
0x10000008,
28759 0x1480:
0x10002000,
28761 0x1680:
0x10202008,
28762 0x1780:
0x10200000,
28763 0x1880:
0x10202000,
28764 0x1980:
0x10200008,
28769 0x1e80:
0x10000000,
28856 0x80000001:
0x8020820,
28857 0x80000002:
0x8000820,
28858 0x80000003:
0x8000000,
28859 0x80000004:
0x8020000,
28860 0x80000005:
0x20800,
28861 0x80000006:
0x20820,
28863 0x80000008:
0x8000020,
28865 0x8000000a:
0x20020,
28866 0x8000000b:
0x8020800,
28868 0x8000000d:
0x8020020,
28869 0x8000000e:
0x8000800,
28870 0x8000000f:
0x20000,
28887 0x80000010:
0x20000,
28889 0x80000012:
0x8020020,
28890 0x80000013:
0x20820,
28892 0x80000015:
0x8020000,
28893 0x80000016:
0x8000000,
28894 0x80000017:
0x8000820,
28895 0x80000018:
0x8020820,
28896 0x80000019:
0x8000020,
28897 0x8000001a:
0x8000800,
28899 0x8000001c:
0x20800,
28901 0x8000001e:
0x20020,
28902 0x8000001f:
0x8020800
28906 // Masks that select the SBOX input
28908 0xf8000001,
0x1f800000,
0x01f80000,
0x001f8000,
28909 0x0001f800,
0x00001f80,
0x000001f8,
0x8000001f
28913 * DES block cipher algorithm.
28915 var DES = C_algo.DES = BlockCipher.extend({
28916 _doReset: function () {
28918 var key = this._key;
28919 var keyWords = key.words;
28921 // Select
56 bits according to PC1
28923 for (var i =
0; i <
56; i++) {
28924 var keyBitPos = PC1[i] -
1;
28925 keyBits[i] = (keyWords[keyBitPos
>>> 5]
>>> (
31 - keyBitPos %
32)) &
1;
28928 // Assemble
16 subkeys
28929 var subKeys = this._subKeys = [];
28930 for (var nSubKey =
0; nSubKey <
16; nSubKey++) {
28932 var subKey = subKeys[nSubKey] = [];
28935 var bitShift = BIT_SHIFTS[nSubKey];
28937 // Select
48 bits according to PC2
28938 for (var i =
0; i <
24; i++) {
28939 // Select from the left
28 key bits
28940 subKey[(i /
6) |
0] |= keyBits[((PC2[i] -
1) + bitShift) %
28] << (
31 - i %
6);
28942 // Select from the right
28 key bits
28943 subKey[
4 + ((i /
6) |
0)] |= keyBits[
28 + (((PC2[i +
24] -
1) + bitShift) %
28)] << (
31 - i %
6);
28946 // Since each subkey is applied to an expanded
32-bit input,
28947 // the subkey can be broken into
8 values scaled to
32-bits,
28948 // which allows the key to be used without expansion
28949 subKey[
0] = (subKey[
0] <<
1) | (subKey[
0]
>>> 31);
28950 for (var i =
1; i <
7; i++) {
28951 subKey[i] = subKey[i]
>>> ((i -
1) *
4 +
3);
28953 subKey[
7] = (subKey[
7] <<
5) | (subKey[
7]
>>> 27);
28956 // Compute inverse subkeys
28957 var invSubKeys = this._invSubKeys = [];
28958 for (var i =
0; i <
16; i++) {
28959 invSubKeys[i] = subKeys[
15 - i];
28963 encryptBlock: function (M, offset) {
28964 this._doCryptBlock(M, offset, this._subKeys);
28967 decryptBlock: function (M, offset) {
28968 this._doCryptBlock(M, offset, this._invSubKeys);
28971 _doCryptBlock: function (M, offset, subKeys) {
28973 this._lBlock = M[offset];
28974 this._rBlock = M[offset +
1];
28976 // Initial permutation
28977 exchangeLR.call(this,
4,
0x0f0f0f0f);
28978 exchangeLR.call(this,
16,
0x0000ffff);
28979 exchangeRL.call(this,
2,
0x33333333);
28980 exchangeRL.call(this,
8,
0x00ff00ff);
28981 exchangeLR.call(this,
1,
0x55555555);
28984 for (var round =
0; round <
16; round++) {
28986 var subKey = subKeys[round];
28987 var lBlock = this._lBlock;
28988 var rBlock = this._rBlock;
28990 // Feistel function
28992 for (var i =
0; i <
8; i++) {
28993 f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i])
>>> 0];
28995 this._lBlock = rBlock;
28996 this._rBlock = lBlock ^ f;
28999 // Undo swap from last round
29000 var t = this._lBlock;
29001 this._lBlock = this._rBlock;
29004 // Final permutation
29005 exchangeLR.call(this,
1,
0x55555555);
29006 exchangeRL.call(this,
8,
0x00ff00ff);
29007 exchangeRL.call(this,
2,
0x33333333);
29008 exchangeLR.call(this,
16,
0x0000ffff);
29009 exchangeLR.call(this,
4,
0x0f0f0f0f);
29012 M[offset] = this._lBlock;
29013 M[offset +
1] = this._rBlock;
29023 // Swap bits across the left and right words
29024 function exchangeLR(offset, mask) {
29025 var t = ((this._lBlock
>>> offset) ^ this._rBlock) & mask;
29027 this._lBlock ^= t << offset;
29030 function exchangeRL(offset, mask) {
29031 var t = ((this._rBlock
>>> offset) ^ this._lBlock) & mask;
29033 this._rBlock ^= t << offset;
29037 * Shortcut functions to the cipher's object interface.
29041 * var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
29042 * var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
29044 C.DES = BlockCipher._createHelper(DES);
29047 * Triple-DES block cipher algorithm.
29049 var TripleDES = C_algo.TripleDES = BlockCipher.extend({
29050 _doReset: function () {
29052 var key = this._key;
29053 var keyWords = key.words;
29055 // Create DES instances
29056 this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(
0,
2)));
29057 this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(
2,
4)));
29058 this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(
4,
6)));
29061 encryptBlock: function (M, offset) {
29062 this._des1.encryptBlock(M, offset);
29063 this._des2.decryptBlock(M, offset);
29064 this._des3.encryptBlock(M, offset);
29067 decryptBlock: function (M, offset) {
29068 this._des3.decryptBlock(M, offset);
29069 this._des2.encryptBlock(M, offset);
29070 this._des1.decryptBlock(M, offset);
29081 * Shortcut functions to the cipher's object interface.
29085 * var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
29086 * var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
29088 C.TripleDES = BlockCipher._createHelper(TripleDES);
29092 return CryptoJS.TripleDES;
29095 },{"./cipher-core":
30,"./core":
31,"./enc-base64":
32,"./evpkdf":
34,"./md5":
39}],
62:[function(_dereq_,module,exports){
29096 ;(function (root, factory) {
29097 if (typeof exports === "object") {
29099 module.exports = exports = factory(_dereq_("./core"));
29101 else if (typeof define === "function" && define.amd) {
29103 define(["./core"], factory);
29106 // Global (browser)
29107 factory(root.CryptoJS);
29109 }(this, function (CryptoJS) {
29111 (function (undefined) {
29115 var Base = C_lib.Base;
29116 var X32WordArray = C_lib.WordArray;
29121 var C_x64 = C.x64 = {};
29126 var X64Word = C_x64.Word = Base.extend({
29128 * Initializes a newly created
64-bit word.
29130 * @param {number} high The high
32 bits.
29131 * @param {number} low The low
32 bits.
29135 * var x64Word = CryptoJS.x64.Word.create(
0x00010203,
0x04050607);
29137 init: function (high, low) {
29143 * Bitwise NOTs this word.
29145 * @return {X64Word} A new x64-Word object after negating.
29149 * var negated = x64Word.not();
29151 // not: function () {
29152 // var high = ~this.high;
29153 // var low = ~this.low;
29155 // return X64Word.create(high, low);
29159 * Bitwise ANDs this word with the passed word.
29161 * @param {X64Word} word The x64-Word to AND with this word.
29163 * @return {X64Word} A new x64-Word object after ANDing.
29167 * var anded = x64Word.and(anotherX64Word);
29169 // and: function (word) {
29170 // var high = this.high & word.high;
29171 // var low = this.low & word.low;
29173 // return X64Word.create(high, low);
29177 * Bitwise ORs this word with the passed word.
29179 * @param {X64Word} word The x64-Word to OR with this word.
29181 * @return {X64Word} A new x64-Word object after ORing.
29185 * var ored = x64Word.or(anotherX64Word);
29187 // or: function (word) {
29188 // var high = this.high | word.high;
29189 // var low = this.low | word.low;
29191 // return X64Word.create(high, low);
29195 * Bitwise XORs this word with the passed word.
29197 * @param {X64Word} word The x64-Word to XOR with this word.
29199 * @return {X64Word} A new x64-Word object after XORing.
29203 * var xored = x64Word.xor(anotherX64Word);
29205 // xor: function (word) {
29206 // var high = this.high ^ word.high;
29207 // var low = this.low ^ word.low;
29209 // return X64Word.create(high, low);
29213 * Shifts this word n bits to the left.
29215 * @param {number} n The number of bits to shift.
29217 * @return {X64Word} A new x64-Word object after shifting.
29221 * var shifted = x64Word.shiftL(
25);
29223 // shiftL: function (n) {
29225 // var high = (this.high << n) | (this.low
>>> (
32 - n));
29226 // var low = this.low << n;
29228 // var high = this.low << (n -
32);
29232 // return X64Word.create(high, low);
29236 * Shifts this word n bits to the right.
29238 * @param {number} n The number of bits to shift.
29240 * @return {X64Word} A new x64-Word object after shifting.
29244 * var shifted = x64Word.shiftR(
7);
29246 // shiftR: function (n) {
29248 // var low = (this.low
>>> n) | (this.high << (
32 - n));
29249 // var high = this.high
>>> n;
29251 // var low = this.high
>>> (n -
32);
29255 // return X64Word.create(high, low);
29259 * Rotates this word n bits to the left.
29261 * @param {number} n The number of bits to rotate.
29263 * @return {X64Word} A new x64-Word object after rotating.
29267 * var rotated = x64Word.rotL(
25);
29269 // rotL: function (n) {
29270 // return this.shiftL(n).or(this.shiftR(
64 - n));
29274 * Rotates this word n bits to the right.
29276 * @param {number} n The number of bits to rotate.
29278 * @return {X64Word} A new x64-Word object after rotating.
29282 * var rotated = x64Word.rotR(
7);
29284 // rotR: function (n) {
29285 // return this.shiftR(n).or(this.shiftL(
64 - n));
29289 * Adds this word with the passed word.
29291 * @param {X64Word} word The x64-Word to add with this word.
29293 * @return {X64Word} A new x64-Word object after adding.
29297 * var added = x64Word.add(anotherX64Word);
29299 // add: function (word) {
29300 // var low = (this.low + word.low) |
0;
29301 // var carry = (low
>>> 0) < (this.low
>>> 0) ?
1 :
0;
29302 // var high = (this.high + word.high + carry) |
0;
29304 // return X64Word.create(high, low);
29309 * An array of
64-bit words.
29311 * @property {Array} words The array of CryptoJS.x64.Word objects.
29312 * @property {number} sigBytes The number of significant bytes in this word array.
29314 var X64WordArray = C_x64.WordArray = Base.extend({
29316 * Initializes a newly created word array.
29318 * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
29319 * @param {number} sigBytes (Optional) The number of significant bytes in the words.
29323 * var wordArray = CryptoJS.x64.WordArray.create();
29325 * var wordArray = CryptoJS.x64.WordArray.create([
29326 * CryptoJS.x64.Word.create(
0x00010203,
0x04050607),
29327 * CryptoJS.x64.Word.create(
0x18191a1b,
0x1c1d1e1f)
29330 * var wordArray = CryptoJS.x64.WordArray.create([
29331 * CryptoJS.x64.Word.create(
0x00010203,
0x04050607),
29332 * CryptoJS.x64.Word.create(
0x18191a1b,
0x1c1d1e1f)
29335 init: function (words, sigBytes) {
29336 words = this.words = words || [];
29338 if (sigBytes != undefined) {
29339 this.sigBytes = sigBytes;
29341 this.sigBytes = words.length *
8;
29346 * Converts this
64-bit word array to a
32-bit word array.
29348 * @return {CryptoJS.lib.WordArray} This word array's data as a
32-bit word array.
29352 * var x32WordArray = x64WordArray.toX32();
29354 toX32: function () {
29356 var x64Words = this.words;
29357 var x64WordsLength = x64Words.length;
29361 for (var i =
0; i < x64WordsLength; i++) {
29362 var x64Word = x64Words[i];
29363 x32Words.push(x64Word.high);
29364 x32Words.push(x64Word.low);
29367 return X32WordArray.create(x32Words, this.sigBytes);
29371 * Creates a copy of this word array.
29373 * @return {X64WordArray} The clone.
29377 * var clone = x64WordArray.clone();
29379 clone: function () {
29380 var clone = Base.clone.call(this);
29382 // Clone
"words" array
29383 var words = clone.words = this.words.slice(
0);
29385 // Clone each X64Word object
29386 var wordsLength = words.length;
29387 for (var i =
0; i < wordsLength; i++) {
29388 words[i] = words[i].clone();
29400 },{
"./core":
31}],
63:[function(_dereq_,module,exports){
29401 var assert = _dereq_('assert')
29402 var BigInteger = _dereq_('bigi')
29404 var Point = _dereq_('./point')
29406 function Curve(p, a, b, Gx, Gy, n, h) {
29410 this.G = Point.fromAffine(this, Gx, Gy)
29414 this.infinity = new Point(this, null, null, BigInteger.ZERO)
29417 this.pOverFour = p.add(BigInteger.ONE).shiftRight(
2)
29420 Curve.prototype.pointFromX = function(isOdd, x) {
29421 var alpha = x.pow(
3).add(this.a.multiply(x)).add(this.b).mod(this.p)
29422 var beta = alpha.modPow(this.pOverFour, this.p)
29425 if (beta.isEven() ^ !isOdd) {
29426 y = this.p.subtract(y) // -y % p
29429 return Point.fromAffine(this, x, y)
29432 Curve.prototype.isInfinity = function(Q) {
29433 if (Q === this.infinity) return true
29435 return Q.z.signum() ===
0 && Q.y.signum() !==
0
29438 Curve.prototype.isOnCurve = function(Q) {
29439 if (this.isInfinity(Q)) return true
29447 // Check that xQ and yQ are integers in the interval [
0, p -
1]
29448 if (x.signum() <
0 || x.compareTo(p)
>=
0) return false
29449 if (y.signum() <
0 || y.compareTo(p)
>=
0) return false
29451 // and check that y^
2 = x^
3 + ax + b (mod p)
29452 var lhs = y.square().mod(p)
29453 var rhs = x.pow(
3).add(a.multiply(x)).add(b).mod(p)
29454 return lhs.equals(rhs)
29458 * Validate an elliptic curve point.
29460 * See SEC
1, section
3.2.2.1: Elliptic Curve Public Key Validation Primitive
29462 Curve.prototype.validate = function(Q) {
29464 assert(!this.isInfinity(Q), 'Point is at infinity')
29465 assert(this.isOnCurve(Q), 'Point is not on the curve')
29467 // Check nQ = O (where Q is a scalar multiple of G)
29468 var nQ = Q.multiply(this.n)
29469 assert(this.isInfinity(nQ), 'Point is not a scalar multiple of G')
29474 module.exports = Curve
29476 },{"./point":
67,"assert":
4,"bigi":
3}],
64:[function(_dereq_,module,exports){
29479 "p": "fffffffdffffffffffffffffffffffff",
29480 "a": "fffffffdfffffffffffffffffffffffc",
29481 "b": "e87579c11079f43dd824993c2cee5ed3",
29482 "n": "fffffffe0000000075a30d1b9038a115",
29484 "Gx": "
161ff7528b899b2d0c28607ca52c5b86",
29485 "Gy": "cf5ac8395bafeb13c02da292dded7a83"
29488 "p": "fffffffffffffffffffffffffffffffeffffac73",
29491 "n": "
0100000000000000000001b8fa16dfab9aca16b6b3",
29493 "Gx": "
3b4c382ce37aa192a4019e763036f4f5dd4d7ebb",
29494 "Gy": "
938cf935318fdced6bc28286531733c3f03c4fee"
29497 "p": "ffffffffffffffffffffffffffffffff7fffffff",
29498 "a": "ffffffffffffffffffffffffffffffff7ffffffc",
29499 "b": "
1c97befc54bd7a8b65acf89f81d4d4adc565fa45",
29500 "n": "
0100000000000000000001f4c8f927aed3ca752257",
29502 "Gx": "
4a96b5688ef573284664698968c38bb913cbfc82",
29503 "Gy": "
23a628553168947d59dcc912042351377ac5fb32"
29506 "p": "fffffffffffffffffffffffffffffffffffffffeffffee37",
29509 "n": "fffffffffffffffffffffffe26f2fc170f69466a74defd8d",
29511 "Gx": "db4ff10ec057e9ae26b07d0280b7f4341da5d1b1eae06c7d",
29512 "Gy": "
9b2f2f6d9c5628a7844163d015be86344082aa88d95e2f9d"
29515 "p": "fffffffffffffffffffffffffffffffeffffffffffffffff",
29516 "a": "fffffffffffffffffffffffffffffffefffffffffffffffc",
29517 "b": "
64210519e59c80e70fa7e9ab72243049feb8deecc146b9b1",
29518 "n": "ffffffffffffffffffffffff99def836146bc9b1b4d22831",
29520 "Gx": "
188da80eb03090f67cbf20eb43a18800f4ff0afd82ff1012",
29521 "Gy": "
07192b95ffc8da78631011ed6b24cdd573f977a11e794811"
29524 "p": "ffffffffffffffffffffffffffffffff000000000000000000000001",
29525 "a": "fffffffffffffffffffffffffffffffefffffffffffffffffffffffe",
29526 "b": "b4050a850c04b3abf54132565044b0b7d7bfd8ba270b39432355ffb4",
29527 "n": "ffffffffffffffffffffffffffff16a2e0b8f03e13dd29455c5c2a3d",
29529 "Gx": "b70e0cbd6bb4bf7f321390b94a03c1d356c21122343280d6115c1d21",
29530 "Gy": "bd376388b5f723fb4c22dfe6cd4375a05a07476444d5819985007e34"
29533 "p": "fffffffffffffffffffffffffffffffffffffffffffffffffffffffefffffc2f",
29536 "n": "fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364141",
29538 "Gx": "
79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
29539 "Gy": "
483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
29542 "p": "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
29543 "a": "ffffffff00000001000000000000000000000000fffffffffffffffffffffffc",
29544 "b": "
5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b",
29545 "n": "ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551",
29547 "Gx": "
6b17d1f2e12c4247f8bce6e563a440f277037d812deb33a0f4a13945d898c296",
29548 "Gy": "
4fe342e2fe1a7f9b8ee7eb4a7c0f9e162bce33576b315ececbb6406837bf51f5"
29552 },{}],
65:[function(_dereq_,module,exports){
29553 var Point = _dereq_('./point')
29554 var Curve = _dereq_('./curve')
29556 var getCurveByName = _dereq_('./names')
29561 getCurveByName: getCurveByName
29564 },{"./curve":
63,"./names":
66,"./point":
67}],
66:[function(_dereq_,module,exports){
29565 var BigInteger = _dereq_('bigi')
29567 var curves = _dereq_('./curves')
29568 var Curve = _dereq_('./curve')
29570 function getCurveByName(name) {
29571 var curve = curves[name]
29572 if (!curve) return null
29574 var p = new BigInteger(curve.p,
16)
29575 var a = new BigInteger(curve.a,
16)
29576 var b = new BigInteger(curve.b,
16)
29577 var n = new BigInteger(curve.n,
16)
29578 var h = new BigInteger(curve.h,
16)
29579 var Gx = new BigInteger(curve.Gx,
16)
29580 var Gy = new BigInteger(curve.Gy,
16)
29582 return new Curve(p, a, b, Gx, Gy, n, h)
29585 module.exports = getCurveByName
29587 },{"./curve":
63,"./curves":
64,"bigi":
3}],
67:[function(_dereq_,module,exports){
29588 (function (Buffer){
29589 var assert = _dereq_('assert')
29590 var BigInteger = _dereq_('bigi')
29592 var THREE = BigInteger.valueOf(
3)
29594 function Point(curve, x, y, z) {
29595 assert.notStrictEqual(z, undefined, 'Missing Z coordinate')
29603 this.compressed = true
29606 Object.defineProperty(Point.prototype, 'zInv', {
29608 if (this._zInv === null) {
29609 this._zInv = this.z.modInverse(this.curve.p)
29616 Object.defineProperty(Point.prototype, 'affineX', {
29618 return this.x.multiply(this.zInv).mod(this.curve.p)
29622 Object.defineProperty(Point.prototype, 'affineY', {
29624 return this.y.multiply(this.zInv).mod(this.curve.p)
29628 Point.fromAffine = function(curve, x, y) {
29629 return new Point(curve, x, y, BigInteger.ONE)
29632 Point.prototype.equals = function(other) {
29633 if (other === this) return true
29634 if (this.curve.isInfinity(this)) return this.curve.isInfinity(other)
29635 if (this.curve.isInfinity(other)) return this.curve.isInfinity(this)
29637 // u = Y2 * Z1 - Y1 * Z2
29638 var u = other.y.multiply(this.z).subtract(this.y.multiply(other.z)).mod(this.curve.p)
29640 if (u.signum() !==
0) return false
29642 // v = X2 * Z1 - X1 * Z2
29643 var v = other.x.multiply(this.z).subtract(this.x.multiply(other.z)).mod(this.curve.p)
29645 return v.signum() ===
0
29648 Point.prototype.negate = function() {
29649 var y = this.curve.p.subtract(this.y)
29651 return new Point(this.curve, this.x, y, this.z)
29654 Point.prototype.add = function(b) {
29655 if (this.curve.isInfinity(this)) return b
29656 if (this.curve.isInfinity(b)) return this
29663 // u = Y2 * Z1 - Y1 * Z2
29664 var u = y2.multiply(this.z).subtract(y1.multiply(b.z)).mod(this.curve.p)
29665 // v = X2 * Z1 - X1 * Z2
29666 var v = x2.multiply(this.z).subtract(x1.multiply(b.z)).mod(this.curve.p)
29668 if (v.signum() ===
0) {
29669 if (u.signum() ===
0) {
29670 return this.twice() // this == b, so double
29673 return this.curve.infinity // this = -b, so infinity
29676 var v2 = v.square()
29677 var v3 = v2.multiply(v)
29678 var x1v2 = x1.multiply(v2)
29679 var zu2 = u.square().multiply(this.z)
29681 // x3 = v * (z2 * (z1 * u^
2 -
2 * x1 * v^
2) - v^
3)
29682 var x3 = zu2.subtract(x1v2.shiftLeft(
1)).multiply(b.z).subtract(v3).multiply(v).mod(this.curve.p)
29683 // y3 = z2 * (
3 * x1 * u * v^
2 - y1 * v^
3 - z1 * u^
3) + u * v^
3
29684 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.p)
29685 // z3 = v^
3 * z1 * z2
29686 var z3 = v3.multiply(this.z).multiply(b.z).mod(this.curve.p)
29688 return new Point(this.curve, x3, y3, z3)
29691 Point.prototype.twice = function() {
29692 if (this.curve.isInfinity(this)) return this
29693 if (this.y.signum() ===
0) return this.curve.infinity
29698 var y1z1 = y1.multiply(this.z)
29699 var y1sqz1 = y1z1.multiply(y1).mod(this.curve.p)
29700 var a = this.curve.a
29702 // w =
3 * x1^
2 + a * z1^
2
29703 var w = x1.square().multiply(THREE)
29705 if (a.signum() !==
0) {
29706 w = w.add(this.z.square().multiply(a))
29709 w = w.mod(this.curve.p)
29710 // x3 =
2 * y1 * z1 * (w^
2 -
8 * x1 * y1^
2 * z1)
29711 var x3 = w.square().subtract(x1.shiftLeft(
3).multiply(y1sqz1)).shiftLeft(
1).multiply(y1z1).mod(this.curve.p)
29712 // y3 =
4 * y1^
2 * z1 * (
3 * w * x1 -
2 * y1^
2 * z1) - w^
3
29713 var y3 = w.multiply(THREE).multiply(x1).subtract(y1sqz1.shiftLeft(
1)).shiftLeft(
2).multiply(y1sqz1).subtract(w.pow(
3)).mod(this.curve.p)
29714 // z3 =
8 * (y1 * z1)^
3
29715 var z3 = y1z1.pow(
3).shiftLeft(
3).mod(this.curve.p)
29717 return new Point(this.curve, x3, y3, z3)
29720 // Simple NAF (Non-Adjacent Form) multiplication algorithm
29721 // TODO: modularize the multiplication algorithm
29722 Point.prototype.multiply = function(k) {
29723 if (this.curve.isInfinity(this)) return this
29724 if (k.signum() ===
0) return this.curve.infinity
29727 var h = e.multiply(THREE)
29729 var neg = this.negate()
29732 for (var i = h.bitLength() -
2; i
> 0; --i) {
29735 var hBit = h.testBit(i)
29736 var eBit = e.testBit(i)
29738 if (hBit != eBit) {
29739 R = R.add(hBit ? this : neg)
29746 // Compute this*j + x*k (simultaneous multiplication)
29747 Point.prototype.multiplyTwo = function(j, x, k) {
29750 if (j.bitLength()
> k.bitLength())
29751 i = j.bitLength() -
1
29753 i = k.bitLength() -
1
29755 var R = this.curve.infinity
29756 var both = this.add(x)
29761 var jBit = j.testBit(i)
29762 var kBit = k.testBit(i)
29783 Point.prototype.getEncoded = function(compressed) {
29784 if (compressed == undefined) compressed = this.compressed
29785 if (this.curve.isInfinity(this)) return new Buffer('
00', 'hex') // Infinity point encoded is simply '
00'
29787 var x = this.affineX
29788 var y = this.affineY
29792 // Determine size of q in bytes
29793 var byteLength = Math.floor((this.curve.p.bitLength() +
7) /
8)
29797 buffer = new Buffer(
1 + byteLength)
29798 buffer.writeUInt8(y.isEven() ?
0x02 :
0x03,
0)
29802 buffer = new Buffer(
1 + byteLength + byteLength)
29803 buffer.writeUInt8(
0x04,
0)
29805 y.toBuffer(byteLength).copy(buffer,
1 + byteLength)
29808 x.toBuffer(byteLength).copy(buffer,
1)
29813 Point.decodeFrom = function(curve, buffer) {
29814 var type = buffer.readUInt8(
0)
29815 var compressed = (type !==
4)
29817 var x = BigInteger.fromBuffer(buffer.slice(
1,
33))
29818 var byteLength = Math.floor((curve.p.bitLength() +
7) /
8)
29822 assert.equal(buffer.length, byteLength +
1, 'Invalid sequence length')
29823 assert(type ===
0x02 || type ===
0x03, 'Invalid sequence tag')
29825 var isOdd = (type ===
0x03)
29826 Q = curve.pointFromX(isOdd, x)
29829 assert.equal(buffer.length,
1 + byteLength + byteLength, 'Invalid sequence length')
29831 var y = BigInteger.fromBuffer(buffer.slice(
1 + byteLength))
29832 Q = Point.fromAffine(curve, x, y)
29835 Q.compressed = compressed
29839 Point.prototype.toString = function () {
29840 if (this.curve.isInfinity(this)) return '(INFINITY)'
29842 return '(' + this.affineX.toString() + ',' + this.affineY.toString() + ')'
29845 module.exports = Point
29847 }).call(this,_dereq_("buffer").Buffer)
29848 },{"assert":
4,"bigi":
3,"buffer":
8}],
68:[function(_dereq_,module,exports){
29849 (function (process,Buffer){
29850 // Closure compiler error - result of 'not' operator not being used
29851 //!function(globals){
29852 (function(globals){
29856 if (typeof define !== 'undefined' && define.amd) { //require.js / AMD
29857 define([], function() {
29858 return secureRandom
29860 } else if (typeof module !== 'undefined' && module.exports) { //CommonJS
29861 module.exports = secureRandom
29862 } else { //script / browser
29863 globals.secureRandom = secureRandom
29867 //options.type is the only valid option
29868 function secureRandom(count, options) {
29869 options = options || {type: 'Array'}
29870 //we check for process.pid to prevent browserify from tricking us
29871 if (typeof process != 'undefined' && typeof process.pid == 'number') {
29872 return nodeRandom(count, options)
29874 var crypto = window.crypto || window.msCrypto
29875 if (!crypto) throw new Error("Your browser does not support window.crypto.")
29876 return browserRandom(count, options)
29880 function nodeRandom(count, options) {
29881 var crypto = _dereq_('crypto')
29882 var buf = crypto.randomBytes(count)
29884 switch (options.type) {
29886 return [].slice.call(buf)
29890 var arr = new Uint8Array(count)
29891 for (var i =
0; i < count; ++i) { arr[i] = buf.readUInt8(i) }
29894 throw new Error(options.type + " is unsupported.")
29898 function browserRandom(count, options) {
29899 var nativeArr = new Uint8Array(count)
29900 var crypto = window.crypto || window.msCrypto
29901 crypto.getRandomValues(nativeArr)
29903 switch (options.type) {
29905 return [].slice.call(nativeArr)
29907 try { var b = new Buffer(
1) } catch(e) { throw new Error('Buffer not supported in this environment. Use Node.js or Browserify for browser support.')}
29908 return new Buffer(nativeArr)
29912 throw new Error(options.type + " is unsupported.")
29916 secureRandom.randomArray = function(byteCount) {
29917 return secureRandom(byteCount, {type: 'Array'})
29920 secureRandom.randomUint8Array = function(byteCount) {
29921 return secureRandom(byteCount, {type: 'Uint8Array'})
29924 secureRandom.randomBuffer = function(byteCount) {
29925 return secureRandom(byteCount, {type: 'Buffer'})
29931 }).call(this,_dereq_("FWaASH"),_dereq_("buffer").Buffer)
29932 },{"FWaASH":
12,"buffer":
8,"crypto":
7}],
69:[function(_dereq_,module,exports){
29933 (function (Buffer){
29934 var assert = _dereq_('assert')
29935 var base58check = _dereq_('./base58check')
29936 var networks = _dereq_('./networks')
29937 var scripts = _dereq_('./scripts')
29939 function findScriptTypeByVersion(version) {
29940 for (var networkName in networks) {
29941 var network = networks[networkName]
29943 if (version === network.pubKeyHash) return 'pubkeyhash'
29944 if (version === network.scriptHash) return 'scripthash'
29948 function Address(hash, version) {
29949 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
29950 assert.strictEqual(hash.length,
20, 'Invalid hash length')
29951 assert.strictEqual(version &
0xff, version, 'Invalid version byte')
29954 this.version = version
29957 // Import functions
29958 Address.fromBase58Check = function(string) {
29959 var payload = base58check.decode(string)
29960 var version = payload.readUInt8(
0)
29961 var hash = payload.slice(
1)
29963 return new Address(hash, version)
29966 Address.fromOutputScript = function(script, network) {
29967 network = network || networks.bitcoin
29969 var type = scripts.classifyOutput(script)
29971 if (type === 'pubkeyhash') return new Address(script.chunks[
2], network.pubKeyHash)
29972 if (type === 'scripthash') return new Address(script.chunks[
1], network.scriptHash)
29974 assert(false, type + ' has no matching Address')
29977 // Export functions
29978 Address.prototype.toBase58Check = function () {
29979 var payload = new Buffer(
21)
29980 payload.writeUInt8(this.version,
0)
29981 this.hash.copy(payload,
1)
29983 return base58check.encode(payload)
29986 Address.prototype.toOutputScript = function() {
29987 var scriptType = findScriptTypeByVersion(this.version)
29989 if (scriptType === 'pubkeyhash') return scripts.pubKeyHashOutput(this.hash)
29990 if (scriptType === 'scripthash') return scripts.scriptHashOutput(this.hash)
29992 assert(false, this.toString() + ' has no matching Script')
29995 Address.prototype.toString = Address.prototype.toBase58Check
29997 module.exports = Address
29999 }).call(this,_dereq_("buffer").Buffer)
30000 },{"./base58check":
70,"./networks":
81,"./scripts":
84,"assert":
4,"buffer":
8}],
70:[function(_dereq_,module,exports){
30001 (function (Buffer){
30002 // https://en.bitcoin.it/wiki/Base58Check_encoding
30003 var assert = _dereq_('assert')
30004 var base58 = _dereq_('bs58')
30005 var crypto = _dereq_('./crypto')
30007 // Encode a buffer as a base58-check-encoded string
30008 function encode(payload) {
30009 var checksum = crypto.hash256(payload).slice(
0,
4)
30011 return base58.encode(Buffer.concat([
30017 // Decode a base58-check-encoded string to a buffer
30018 function decode(string) {
30019 var buffer = base58.decode(string)
30021 var payload = buffer.slice(
0, -
4)
30022 var checksum = buffer.slice(-
4)
30023 var newChecksum = crypto.hash256(payload).slice(
0,
4)
30025 assert.deepEqual(newChecksum, checksum, 'Invalid checksum')
30035 }).call(this,_dereq_("buffer").Buffer)
30036 },{"./crypto":
73,"assert":
4,"bs58":
15,"buffer":
8}],
71:[function(_dereq_,module,exports){
30037 var assert = _dereq_('assert')
30038 var opcodes = _dereq_('./opcodes')
30040 // https://github.com/feross/buffer/blob/master/index.js#L1127
30041 function verifuint(value, max) {
30042 assert(typeof value === 'number', 'cannot write a non-number as a number')
30043 assert(value
>=
0, 'specified a negative value for writing an unsigned value')
30044 assert(value <= max, 'value is larger than maximum value for type')
30045 assert(Math.floor(value) === value, 'value has a fractional component')
30048 function pushDataSize(i) {
30049 return i < opcodes.OP_PUSHDATA1 ?
1
30055 function readPushDataInt(buffer, offset) {
30056 var opcode = buffer.readUInt8(offset)
30060 if (opcode < opcodes.OP_PUSHDATA1) {
30065 } else if (opcode === opcodes.OP_PUSHDATA1) {
30066 number = buffer.readUInt8(offset +
1)
30070 } else if (opcode === opcodes.OP_PUSHDATA2) {
30071 number = buffer.readUInt16LE(offset +
1)
30076 assert.equal(opcode, opcodes.OP_PUSHDATA4, 'Unexpected opcode')
30078 number = buffer.readUInt32LE(offset +
1)
30090 function readUInt64LE(buffer, offset) {
30091 var a = buffer.readUInt32LE(offset)
30092 var b = buffer.readUInt32LE(offset +
4)
30095 verifuint(b + a,
0x001fffffffffffff)
30100 function readVarInt(buffer, offset) {
30101 var t = buffer.readUInt8(offset)
30110 } else if (t <
254) {
30111 number = buffer.readUInt16LE(offset +
1)
30115 } else if (t <
255) {
30116 number = buffer.readUInt32LE(offset +
1)
30121 number = readUInt64LE(buffer, offset +
1)
30131 function writePushDataInt(buffer, number, offset) {
30132 var size = pushDataSize(number)
30136 buffer.writeUInt8(number, offset)
30139 } else if (size ===
2) {
30140 buffer.writeUInt8(opcodes.OP_PUSHDATA1, offset)
30141 buffer.writeUInt8(number, offset +
1)
30144 } else if (size ===
3) {
30145 buffer.writeUInt8(opcodes.OP_PUSHDATA2, offset)
30146 buffer.writeUInt16LE(number, offset +
1)
30150 buffer.writeUInt8(opcodes.OP_PUSHDATA4, offset)
30151 buffer.writeUInt32LE(number, offset +
1)
30158 function writeUInt64LE(buffer, value, offset) {
30159 verifuint(value,
0x001fffffffffffff)
30161 buffer.writeInt32LE(value & -
1, offset)
30162 buffer.writeUInt32LE(Math.floor(value /
0x100000000), offset +
4)
30165 function varIntSize(i) {
30168 : i <
0x100000000 ?
5
30172 function writeVarInt(buffer, number, offset) {
30173 var size = varIntSize(number)
30177 buffer.writeUInt8(number, offset)
30180 } else if (size ===
3) {
30181 buffer.writeUInt8(
253, offset)
30182 buffer.writeUInt16LE(number, offset +
1)
30185 } else if (size ===
5) {
30186 buffer.writeUInt8(
254, offset)
30187 buffer.writeUInt32LE(number, offset +
1)
30191 buffer.writeUInt8(
255, offset)
30192 writeUInt64LE(buffer, number, offset +
1)
30199 pushDataSize: pushDataSize,
30200 readPushDataInt: readPushDataInt,
30201 readUInt64LE: readUInt64LE,
30202 readVarInt: readVarInt,
30203 varIntSize: varIntSize,
30204 writePushDataInt: writePushDataInt,
30205 writeUInt64LE: writeUInt64LE,
30206 writeVarInt: writeVarInt
30209 },{"./opcodes":
82,"assert":
4}],
72:[function(_dereq_,module,exports){
30210 (function (Buffer){
30211 var assert = _dereq_('assert')
30212 var Crypto = _dereq_('crypto-js')
30213 var WordArray = Crypto.lib.WordArray
30215 function bufferToWordArray(buffer) {
30216 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got', buffer)
30219 for (var i =
0, b =
0; i < buffer.length; i++, b +=
8) {
30220 words[b
>>> 5] |= buffer[i] << (
24 - b %
32)
30223 return new WordArray.init(words, buffer.length)
30226 function wordArrayToBuffer(wordArray) {
30227 assert(Array.isArray(wordArray.words), 'Expected WordArray, got' + wordArray)
30229 var words = wordArray.words
30230 var buffer = new Buffer(words.length *
4)
30232 words.forEach(function(value, i) {
30233 buffer.writeInt32BE(value & -
1, i *
4)
30240 bufferToWordArray: bufferToWordArray,
30241 wordArrayToBuffer: wordArrayToBuffer
30244 }).call(this,_dereq_(
"buffer").Buffer)
30245 },{
"assert":
4,
"buffer":
8,
"crypto-js":
37}],
73:[function(_dereq_,module,exports){
30246 (function (Buffer){
30247 // Crypto, crypto, where art thou crypto
30248 var assert = _dereq_('assert')
30249 var CryptoJS = _dereq_('crypto-js')
30250 var crypto = _dereq_('crypto')
30251 var convert = _dereq_('./convert')
30253 function hash160(buffer) {
30254 return ripemd160(sha256(buffer))
30257 function hash256(buffer) {
30258 return sha256(sha256(buffer))
30261 function ripemd160(buffer) {
30262 return crypto.createHash('rmd160').update(buffer).digest()
30265 function sha1(buffer) {
30266 return crypto.createHash('sha1').update(buffer).digest()
30269 function sha256(buffer) {
30270 return crypto.createHash('sha256').update(buffer).digest()
30273 // FIXME: Name not consistent with others
30274 function HmacSHA256(buffer, secret) {
30275 return crypto.createHmac('sha256', secret).update(buffer).digest()
30278 function HmacSHA512(data, secret) {
30279 assert(Buffer.isBuffer(data), 'Expected Buffer for data, got ' + data)
30280 assert(Buffer.isBuffer(secret), 'Expected Buffer for secret, got ' + secret)
30282 var dataWords = convert.bufferToWordArray(data)
30283 var secretWords = convert.bufferToWordArray(secret)
30285 var hash = CryptoJS.HmacSHA512(dataWords, secretWords)
30287 return convert.wordArrayToBuffer(hash)
30291 ripemd160: ripemd160,
30296 HmacSHA256: HmacSHA256,
30297 HmacSHA512: HmacSHA512
30300 }).call(this,_dereq_(
"buffer").Buffer)
30301 },{
"./convert":
72,
"assert":
4,
"buffer":
8,
"crypto":
19,
"crypto-js":
37}],
74:[function(_dereq_,module,exports){
30302 (function (Buffer){
30303 var assert = _dereq_('assert')
30304 var crypto = _dereq_('./crypto')
30306 var BigInteger = _dereq_('bigi')
30307 var ECSignature = _dereq_('./ecsignature')
30308 var Point = _dereq_('ecurve').Point
30310 // https://tools.ietf.org/html/rfc6979#section-
3.2
30311 function deterministicGenerateK(curve, hash, d) {
30312 assert(Buffer.isBuffer(hash), 'Hash must be a Buffer, not ' + hash)
30313 assert.equal(hash.length,
32, 'Hash must be
256 bit')
30314 assert(d instanceof BigInteger, 'Private key must be a BigInteger')
30316 var x = d.toBuffer(
32)
30317 var k = new Buffer(
32)
30318 var v = new Buffer(
32)
30327 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
0]), x, hash]), k)
30330 v = crypto.HmacSHA256(v, k)
30333 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
1]), x, hash]), k)
30336 v = crypto.HmacSHA256(v, k)
30338 // Step H1/H2a, ignored as tlen === qlen (
256 bit)
30340 v = crypto.HmacSHA256(v, k)
30342 var T = BigInteger.fromBuffer(v)
30344 // Step H3, repeat until T is within the interval [
1, n -
1]
30345 while ((T.signum() <=
0) || (T.compareTo(curve.n)
>=
0)) {
30346 k = crypto.HmacSHA256(Buffer.concat([v, new Buffer([
0])]), k)
30347 v = crypto.HmacSHA256(v, k)
30349 T = BigInteger.fromBuffer(v)
30355 function sign(curve, hash, d) {
30356 var k = deterministicGenerateK(curve, hash, d)
30360 var Q = G.multiply(k)
30361 var e = BigInteger.fromBuffer(hash)
30363 var r = Q.affineX.mod(n)
30364 assert.notEqual(r.signum(),
0, 'Invalid R value')
30366 var s = k.modInverse(n).multiply(e.add(d.multiply(r))).mod(n)
30367 assert.notEqual(s.signum(),
0, 'Invalid S value')
30369 var N_OVER_TWO = n.shiftRight(
1)
30371 // enforce low S values, see bip62: 'low s values in signatures'
30372 if (s.compareTo(N_OVER_TWO)
> 0) {
30376 return new ECSignature(r, s)
30379 function verify(curve, hash, signature, Q) {
30380 var e = BigInteger.fromBuffer(hash)
30382 return verifyRaw(curve, e, signature, Q)
30385 function verifyRaw(curve, e, signature, Q) {
30389 var r = signature.r
30390 var s = signature.s
30392 if (r.signum() ===
0 || r.compareTo(n)
>=
0) return false
30393 if (s.signum() ===
0 || s.compareTo(n)
>=
0) return false
30395 var c = s.modInverse(n)
30397 var u1 = e.multiply(c).mod(n)
30398 var u2 = r.multiply(c).mod(n)
30400 var point = G.multiplyTwo(u1, Q, u2)
30401 var v = point.affineX.mod(n)
30407 * Recover a public key from a signature.
30409 * See SEC
1: Elliptic Curve Cryptography, section
4.1.6, "Public
30410 * Key Recovery Operation".
30412 * http://www.secg.org/download/aid-
780/sec1-v2.pdf
30414 function recoverPubKey(curve, e, signature, i) {
30415 assert.strictEqual(i &
3, i, 'Recovery param is more than two bits')
30417 var r = signature.r
30418 var s = signature.s
30420 // A set LSB signifies that the y-coordinate is odd
30423 // The more significant bit specifies whether we should use the
30424 // first or second candidate key.
30425 var isSecondKey = i
>> 1
30430 //
1.1 Let x = r + jn
30431 var x = isSecondKey ? r.add(n) : r
30432 var R = curve.pointFromX(isYOdd, x)
30434 //
1.4 Check that nR is at infinity
30435 var nR = R.multiply(n)
30436 assert(curve.isInfinity(nR), 'nR is not a valid curve point')
30438 // Compute -e from e
30439 var eNeg = e.negate().mod(n)
30441 //
1.6.1 Compute Q = r^-
1 (sR - eG)
30442 // Q = r^-
1 (sR + -eG)
30443 var rInv = r.modInverse(n)
30445 var Q = R.multiplyTwo(s, G, eNeg).multiply(rInv)
30452 * Calculate pubkey extraction parameter.
30454 * When extracting a pubkey from a signature, we have to
30455 * distinguish four different cases. Rather than putting this
30456 * burden on the verifier, Bitcoin includes a
2-bit value with the
30459 * This function simply tries all four cases and returns the value
30460 * that resulted in a successful pubkey recovery.
30462 function calcPubKeyRecoveryParam(curve, e, signature, Q) {
30463 for (var i =
0; i <
4; i++) {
30464 var Qprime = recoverPubKey(curve, e, signature, i)
30467 if (Qprime.equals(Q)) {
30472 throw new Error('Unable to find valid recovery factor')
30476 calcPubKeyRecoveryParam: calcPubKeyRecoveryParam,
30477 deterministicGenerateK: deterministicGenerateK,
30478 recoverPubKey: recoverPubKey,
30481 verifyRaw: verifyRaw
30484 }).call(this,_dereq_(
"buffer").Buffer)
30485 },{
"./crypto":
73,
"./ecsignature":
77,
"assert":
4,
"bigi":
3,
"buffer":
8,
"ecurve":
65}],
75:[function(_dereq_,module,exports){
30486 (function (Buffer){
30487 var assert = _dereq_('assert')
30488 var base58check = _dereq_('./base58check')
30489 var ecdsa = _dereq_('./ecdsa')
30490 var networks = _dereq_('./networks')
30491 var secureRandom = _dereq_('secure-random')
30493 var BigInteger = _dereq_('bigi')
30494 var ECPubKey = _dereq_('./ecpubkey')
30496 var ecurve = _dereq_('ecurve')
30497 var curve = ecurve.getCurveByName('secp256k1')
30499 function ECKey(d, compressed) {
30500 assert(d.signum()
> 0, 'Private key must be greater than
0')
30501 assert(d.compareTo(curve.n) <
0, 'Private key must be less than the curve order')
30503 var Q = curve.G.multiply(d)
30506 this.pub = new ECPubKey(Q, compressed)
30509 // Static constructors
30510 ECKey.fromWIF = function(string) {
30511 var payload = base58check.decode(string)
30512 var compressed = false
30514 // Ignore the version byte
30515 payload = payload.slice(
1)
30517 if (payload.length ===
33) {
30518 assert.strictEqual(payload[
32],
0x01, 'Invalid compression flag')
30520 // Truncate the compression flag
30521 payload = payload.slice(
0, -
1)
30525 assert.equal(payload.length,
32, 'Invalid WIF payload length')
30527 var d = BigInteger.fromBuffer(payload)
30528 return new ECKey(d, compressed)
30531 ECKey.makeRandom = function(compressed, rng) {
30532 rng = rng || secureRandom.randomBuffer
30534 var buffer = rng(
32)
30535 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got ' + buffer)
30537 var d = BigInteger.fromBuffer(buffer)
30540 return new ECKey(d, compressed)
30543 // Export functions
30544 ECKey.prototype.toWIF = function(network) {
30545 network = network || networks.bitcoin
30547 var bufferLen = this.pub.compressed ?
34 :
33
30548 var buffer = new Buffer(bufferLen)
30550 buffer.writeUInt8(network.wif,
0)
30551 this.d.toBuffer(
32).copy(buffer,
1)
30553 if (this.pub.compressed) {
30554 buffer.writeUInt8(
0x01,
33)
30557 return base58check.encode(buffer)
30561 ECKey.prototype.sign = function(hash) {
30562 return ecdsa.sign(curve, hash, this.d)
30565 module.exports = ECKey
30567 }).call(this,_dereq_(
"buffer").Buffer)
30568 },{
"./base58check":
70,
"./ecdsa":
74,
"./ecpubkey":
76,
"./networks":
81,
"assert":
4,
"bigi":
3,
"buffer":
8,
"ecurve":
65,
"secure-random":
68}],
76:[function(_dereq_,module,exports){
30569 (function (Buffer){
30570 var assert = _dereq_('assert')
30571 var crypto = _dereq_('./crypto')
30572 var ecdsa = _dereq_('./ecdsa')
30573 var networks = _dereq_('./networks')
30575 var Address = _dereq_('./address')
30577 var ecurve = _dereq_('ecurve')
30578 var curve = ecurve.getCurveByName('secp256k1')
30580 function ECPubKey(Q, compressed) {
30581 assert(Q instanceof ecurve.Point, 'Expected Point, got ' + Q)
30583 if (compressed == undefined) compressed = true
30584 assert.strictEqual(typeof compressed, 'boolean', 'Expected boolean, got ' + compressed)
30586 this.compressed = compressed
30590 // Static constructors
30591 ECPubKey.fromBuffer = function(buffer) {
30592 var Q = ecurve.Point.decodeFrom(curve, buffer)
30593 return new ECPubKey(Q, Q.compressed)
30596 ECPubKey.fromHex = function(hex) {
30597 return ECPubKey.fromBuffer(new Buffer(hex, 'hex'))
30601 ECPubKey.prototype.getAddress = function(network) {
30602 network = network || networks.bitcoin
30604 return new Address(crypto.hash160(this.toBuffer()), network.pubKeyHash)
30607 ECPubKey.prototype.verify = function(hash, signature) {
30608 return ecdsa.verify(curve, hash, signature, this.Q)
30611 // Export functions
30612 ECPubKey.prototype.toBuffer = function() {
30613 return this.Q.getEncoded(this.compressed)
30616 ECPubKey.prototype.toHex = function() {
30617 return this.toBuffer().toString('hex')
30620 module.exports = ECPubKey
30622 }).call(this,_dereq_(
"buffer").Buffer)
30623 },{
"./address":
69,
"./crypto":
73,
"./ecdsa":
74,
"./networks":
81,
"assert":
4,
"buffer":
8,
"ecurve":
65}],
77:[function(_dereq_,module,exports){
30624 (function (Buffer){
30625 var assert = _dereq_('assert')
30626 var BigInteger = _dereq_('bigi')
30628 function ECSignature(r, s) {
30629 assert(r instanceof BigInteger, 'Expected BigInteger, got ' + r)
30630 assert(s instanceof BigInteger, 'Expected BigInteger, got ' + s)
30635 // Import operations
30636 ECSignature.parseCompact = function(buffer) {
30637 assert.equal(buffer.length,
65, 'Invalid signature length')
30638 var i = buffer.readUInt8(
0) -
27
30641 assert.equal(i, i &
7, 'Invalid signature parameter')
30642 var compressed = !!(i &
4)
30644 // Recovery param only
30647 var r = BigInteger.fromBuffer(buffer.slice(
1,
33))
30648 var s = BigInteger.fromBuffer(buffer.slice(
33))
30651 compressed: compressed,
30653 signature: new ECSignature(r, s)
30657 ECSignature.fromDER = function(buffer) {
30658 assert.equal(buffer.readUInt8(
0),
0x30, 'Not a DER sequence')
30659 assert.equal(buffer.readUInt8(
1), buffer.length -
2, 'Invalid sequence length')
30660 assert.equal(buffer.readUInt8(
2),
0x02, 'Expected a DER integer')
30662 var rLen = buffer.readUInt8(
3)
30663 assert(rLen
> 0, 'R length is zero')
30665 var offset =
4 + rLen
30666 assert.equal(buffer.readUInt8(offset),
0x02, 'Expected a DER integer (
2)')
30668 var sLen = buffer.readUInt8(offset +
1)
30669 assert(sLen
> 0, 'S length is zero')
30671 var rB = buffer.slice(
4, offset)
30672 var sB = buffer.slice(offset +
2)
30675 if (rLen
> 1 && rB.readUInt8(
0) ===
0x00) {
30676 assert(rB.readUInt8(
1) &
0x80, 'R value excessively padded')
30679 if (sLen
> 1 && sB.readUInt8(
0) ===
0x00) {
30680 assert(sB.readUInt8(
1) &
0x80, 'S value excessively padded')
30683 assert.equal(offset, buffer.length, 'Invalid DER encoding')
30684 var r = BigInteger.fromDERInteger(rB)
30685 var s = BigInteger.fromDERInteger(sB)
30687 assert(r.signum()
>=
0, 'R value is negative')
30688 assert(s.signum()
>=
0, 'S value is negative')
30690 return new ECSignature(r, s)
30693 // FIXME:
0x00,
0x04,
0x80 are SIGHASH_* boundary constants, importing Transaction causes a circular dependency
30694 ECSignature.parseScriptSignature = function(buffer) {
30695 var hashType = buffer.readUInt8(buffer.length -
1)
30696 var hashTypeMod = hashType & ~
0x80
30698 assert(hashTypeMod
> 0x00 && hashTypeMod <
0x04, 'Invalid hashType')
30701 signature: ECSignature.fromDER(buffer.slice(
0, -
1)),
30706 // Export operations
30707 ECSignature.prototype.toCompact = function(i, compressed) {
30708 if (compressed) i +=
4
30711 var buffer = new Buffer(
65)
30712 buffer.writeUInt8(i,
0)
30714 this.r.toBuffer(
32).copy(buffer,
1)
30715 this.s.toBuffer(
32).copy(buffer,
33)
30720 ECSignature.prototype.toDER = function() {
30721 var rBa = this.r.toDERInteger()
30722 var sBa = this.s.toDERInteger()
30725 sequence.push(
0x02) // INTEGER
30726 sequence.push(rBa.length)
30727 sequence = sequence.concat(rBa)
30729 sequence.push(
0x02) // INTEGER
30730 sequence.push(sBa.length)
30731 sequence = sequence.concat(sBa)
30733 sequence.unshift(sequence.length)
30734 sequence.unshift(
0x30) // SEQUENCE
30736 return new Buffer(sequence)
30739 ECSignature.prototype.toScriptSignature = function(hashType) {
30740 var hashTypeBuffer = new Buffer(
1)
30741 hashTypeBuffer.writeUInt8(hashType,
0)
30743 return Buffer.concat([this.toDER(), hashTypeBuffer])
30746 module.exports = ECSignature
30748 }).call(this,_dereq_(
"buffer").Buffer)
30749 },{
"assert":
4,
"bigi":
3,
"buffer":
8}],
78:[function(_dereq_,module,exports){
30750 (function (Buffer){
30751 var assert = _dereq_('assert')
30752 var base58check = _dereq_('./base58check')
30753 var crypto = _dereq_('./crypto')
30754 var networks = _dereq_('./networks')
30756 var BigInteger = _dereq_('bigi')
30757 var ECKey = _dereq_('./eckey')
30758 var ECPubKey = _dereq_('./ecpubkey')
30760 var ecurve = _dereq_('ecurve')
30761 var curve = ecurve.getCurveByName('secp256k1')
30763 function findBIP32ParamsByVersion(version) {
30764 for (var name in networks) {
30765 var network = networks[name]
30767 for (var type in network.bip32) {
30768 if (version != network.bip32[type]) continue
30771 isPrivate: (type === 'private'),
30777 assert(false, 'Could not find version ' + version.toString(
16))
30780 function HDNode(K, chainCode, network) {
30781 network = network || networks.bitcoin
30783 assert(Buffer.isBuffer(chainCode), 'Expected Buffer, got ' + chainCode)
30784 assert(network.bip32, 'Unknown BIP32 constants for network')
30786 this.chainCode = chainCode
30789 this.network = network
30791 if (K instanceof BigInteger) {
30792 this.privKey = new ECKey(K, true)
30793 this.pubKey = this.privKey.pub
30795 this.pubKey = new ECPubKey(K, true)
30799 HDNode.MASTER_SECRET = new Buffer('Bitcoin seed')
30800 HDNode.HIGHEST_BIT =
0x80000000
30803 HDNode.fromSeedBuffer = function(seed, network) {
30804 var I = crypto.HmacSHA512(seed, HDNode.MASTER_SECRET)
30805 var IL = I.slice(
0,
32)
30806 var IR = I.slice(
32)
30808 // In case IL is
0 or
>= n, the master key is invalid
30809 // This is handled by `new ECKey` in the HDNode constructor
30810 var pIL = BigInteger.fromBuffer(IL)
30812 return new HDNode(pIL, IR, network)
30815 HDNode.fromSeedHex = function(hex, network) {
30816 return HDNode.fromSeedBuffer(new Buffer(hex, 'hex'), network)
30819 HDNode.fromBase58 = function(string) {
30820 return HDNode.fromBuffer(base58check.decode(string))
30823 HDNode.fromBuffer = function(buffer) {
30824 assert.strictEqual(buffer.length, HDNode.LENGTH, 'Invalid buffer length')
30826 //
4 byte: version bytes
30827 var version = buffer.readUInt32BE(
0)
30828 var params = findBIP32ParamsByVersion(version)
30830 //
1 byte: depth:
0x00 for master nodes,
0x01 for level-
1 descendants, ...
30831 var depth = buffer.readUInt8(
4)
30833 //
4 bytes: the fingerprint of the parent's key (
0x00000000 if master key)
30834 var parentFingerprint = buffer.readUInt32BE(
5)
30836 assert.strictEqual(parentFingerprint,
0x00000000, 'Invalid parent fingerprint')
30839 //
4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
30840 // This is encoded in MSB order. (
0x00000000 if master key)
30841 var index = buffer.readUInt32BE(
9)
30842 assert(depth
> 0 || index ===
0, 'Invalid index')
30844 //
32 bytes: the chain code
30845 var chainCode = buffer.slice(
13,
45)
30848 //
33 bytes: private key data (
0x00 + k)
30849 if (params.isPrivate) {
30850 assert.strictEqual(buffer.readUInt8(
45),
0x00, 'Invalid private key')
30851 var data = buffer.slice(
46,
78)
30852 var d = BigInteger.fromBuffer(data)
30853 hd = new HDNode(d, chainCode, params.network)
30855 //
33 bytes: public key data (
0x02 + X or
0x03 + X)
30857 var data = buffer.slice(
45,
78)
30858 var Q = ecurve.Point.decodeFrom(curve, data)
30859 assert.equal(Q.compressed, true, 'Invalid public key')
30861 // Verify that the X coordinate in the public point corresponds to a point on the curve.
30862 // If not, the extended public key is invalid.
30865 hd = new HDNode(Q, chainCode, params.network)
30870 hd.parentFingerprint = parentFingerprint
30875 HDNode.fromHex = function(hex) {
30876 return HDNode.fromBuffer(new Buffer(hex, 'hex'))
30879 HDNode.prototype.getIdentifier = function() {
30880 return crypto.hash160(this.pubKey.toBuffer())
30883 HDNode.prototype.getFingerprint = function() {
30884 return this.getIdentifier().slice(
0,
4)
30887 HDNode.prototype.getAddress = function() {
30888 return this.pubKey.getAddress(this.network)
30891 HDNode.prototype.toBase58 = function(isPrivate) {
30892 return base58check.encode(this.toBuffer(isPrivate))
30895 HDNode.prototype.toBuffer = function(isPrivate) {
30896 if (isPrivate == undefined) isPrivate = !!this.privKey
30899 var version = isPrivate ? this.network.bip32.private : this.network.bip32.public
30900 var buffer = new Buffer(HDNode.LENGTH)
30902 //
4 bytes: version bytes
30903 buffer.writeUInt32BE(version,
0)
30906 //
1 byte: depth:
0x00 for master nodes,
0x01 for level-
1 descendants, ....
30907 buffer.writeUInt8(this.depth,
4)
30909 //
4 bytes: the fingerprint of the parent's key (
0x00000000 if master key)
30910 var fingerprint = (this.depth ===
0) ?
0x00000000 : this.parentFingerprint
30911 buffer.writeUInt32BE(fingerprint,
5)
30913 //
4 bytes: child number. This is the number i in xi = xpar/i, with xi the key being serialized.
30914 // This is encoded in Big endian. (
0x00000000 if master key)
30915 buffer.writeUInt32BE(this.index,
9)
30917 //
32 bytes: the chain code
30918 this.chainCode.copy(buffer,
13)
30920 //
33 bytes: the public key or private key data
30922 assert(this.privKey, 'Missing private key')
30924 //
0x00 + k for private keys
30925 buffer.writeUInt8(
0,
45)
30926 this.privKey.d.toBuffer(
32).copy(buffer,
46)
30929 // X9.62 encoding for public keys
30930 this.pubKey.toBuffer().copy(buffer,
45)
30936 HDNode.prototype.toHex = function(isPrivate) {
30937 return this.toBuffer(isPrivate).toString('hex')
30940 // https://github.com/bitcoin/bips/blob/master/bip-
0032.mediawiki#child-key-derivation-ckd-functions
30941 HDNode.prototype.derive = function(index) {
30942 var isHardened = index
>= HDNode.HIGHEST_BIT
30943 var indexBuffer = new Buffer(
4)
30944 indexBuffer.writeUInt32BE(index,
0)
30950 assert(this.privKey, 'Could not derive hardened child key')
30952 // data =
0x00 || ser256(kpar) || ser32(index)
30953 data = Buffer.concat([
30954 this.privKey.d.toBuffer(
33),
30960 // data = serP(point(kpar)) || ser32(index)
30961 // = serP(Kpar) || ser32(index)
30962 data = Buffer.concat([
30963 this.pubKey.toBuffer(),
30968 var I = crypto.HmacSHA512(data, this.chainCode)
30969 var IL = I.slice(
0,
32)
30970 var IR = I.slice(
32)
30972 var pIL = BigInteger.fromBuffer(IL)
30974 // In case parse256(IL)
>= n, proceed with the next value for i
30975 if (pIL.compareTo(curve.n)
>=
0) {
30976 return this.derive(index +
1)
30979 // Private parent key -
> private child key
30981 if (this.privKey) {
30982 // ki = parse256(IL) + kpar (mod n)
30983 var ki = pIL.add(this.privKey.d).mod(curve.n)
30985 // In case ki ==
0, proceed with the next value for i
30986 if (ki.signum() ===
0) {
30987 return this.derive(index +
1)
30990 hd = new HDNode(ki, IR, this.network)
30992 // Public parent key -
> public child key
30994 // Ki = point(parse256(IL)) + Kpar
30996 var Ki = curve.G.multiply(pIL).add(this.pubKey.Q)
30998 // In case Ki is the point at infinity, proceed with the next value for i
30999 if (curve.isInfinity(Ki)) {
31000 return this.derive(index +
1)
31003 hd = new HDNode(Ki, IR, this.network)
31006 hd.depth = this.depth +
1
31008 hd.parentFingerprint = this.getFingerprint().readUInt32BE(
0)
31013 HDNode.prototype.deriveHardened = function(index) {
31014 // Only derives hardened private keys by default
31015 return this.derive(index + HDNode.HIGHEST_BIT)
31018 HDNode.prototype.toString = HDNode.prototype.toBase58
31020 module.exports = HDNode
31022 }).call(this,_dereq_("buffer").Buffer)
31023 },{"./base58check":
70,"./crypto":
73,"./eckey":
75,"./ecpubkey":
76,"./networks":
81,"assert":
4,"bigi":
3,"buffer":
8,"ecurve":
65}],
79:[function(_dereq_,module,exports){
31025 Address: _dereq_('./address'),
31026 base58check: _dereq_('./base58check'),
31027 bufferutils: _dereq_('./bufferutils'),
31028 convert: _dereq_('./convert'),
31029 crypto: _dereq_('./crypto'),
31030 ecdsa: _dereq_('./ecdsa'),
31031 ECKey: _dereq_('./eckey'),
31032 ECPubKey: _dereq_('./ecpubkey'),
31033 ECSignature: _dereq_('./ecsignature'),
31034 Message: _dereq_('./message'),
31035 opcodes: _dereq_('./opcodes'),
31036 HDNode: _dereq_('./hdnode'),
31037 Script: _dereq_('./script'),
31038 scripts: _dereq_('./scripts'),
31039 Transaction: _dereq_('./transaction'),
31040 networks: _dereq_('./networks'),
31041 Wallet: _dereq_('./wallet')
31044 },{"./address":
69,"./base58check":
70,"./bufferutils":
71,"./convert":
72,"./crypto":
73,"./ecdsa":
74,"./eckey":
75,"./ecpubkey":
76,"./ecsignature":
77,"./hdnode":
78,"./message":
80,"./networks":
81,"./opcodes":
82,"./script":
83,"./scripts":
84,"./transaction":
85,"./wallet":
86}],
80:[function(_dereq_,module,exports){
31045 (function (Buffer){
31046 /// Implements Bitcoin's feature for signing arbitrary messages.
31047 var Address = _dereq_('./address')
31048 var BigInteger = _dereq_('bigi')
31049 var bufferutils = _dereq_('./bufferutils')
31050 var crypto = _dereq_('./crypto')
31051 var ecdsa = _dereq_('./ecdsa')
31052 var networks = _dereq_('./networks')
31054 var Address = _dereq_('./address')
31055 var ECPubKey = _dereq_('./ecpubkey')
31056 var ECSignature = _dereq_('./ecsignature')
31058 var ecurve = _dereq_('ecurve')
31059 var ecparams = ecurve.getCurveByName('secp256k1')
31061 function magicHash(message, network) {
31062 var magicPrefix = new Buffer(network.magicPrefix)
31063 var messageBuffer = new Buffer(message)
31064 var lengthBuffer = new Buffer(bufferutils.varIntSize(messageBuffer.length))
31065 bufferutils.writeVarInt(lengthBuffer, messageBuffer.length,
0)
31067 var buffer = Buffer.concat([magicPrefix, lengthBuffer, messageBuffer])
31068 return crypto.hash256(buffer)
31071 function sign(privKey, message, network) {
31072 network = network || networks.bitcoin
31074 var hash = magicHash(message, network)
31075 var signature = privKey.sign(hash)
31076 var e = BigInteger.fromBuffer(hash)
31077 var i = ecdsa.calcPubKeyRecoveryParam(ecparams, e, signature, privKey.pub.Q)
31079 return signature.toCompact(i, privKey.pub.compressed)
31082 // TODO: network could be implied from address
31083 function verify(address, signatureBuffer, message, network) {
31084 if (address instanceof Address) {
31085 address = address.toString()
31087 network = network || networks.bitcoin
31089 var hash = magicHash(message, network)
31090 var parsed = ECSignature.parseCompact(signatureBuffer)
31091 var e = BigInteger.fromBuffer(hash)
31092 var Q = ecdsa.recoverPubKey(ecparams, e, parsed.signature, parsed.i)
31094 var pubKey = new ECPubKey(Q, parsed.compressed)
31095 return pubKey.getAddress(network).toString() === address
31099 magicHash: magicHash,
31104 }).call(this,_dereq_("buffer").Buffer)
31105 },{"./address":
69,"./bufferutils":
71,"./crypto":
73,"./ecdsa":
74,"./ecpubkey":
76,"./ecsignature":
77,"./networks":
81,"bigi":
3,"buffer":
8,"ecurve":
65}],
81:[function(_dereq_,module,exports){
31106 // https://en.bitcoin.it/wiki/List_of_address_prefixes
31107 // Dogecoin BIP32 is a proposed standard: https://bitcointalk.org/index.php?topic=
409731
31111 magicPrefix: '\x18Bitcoin Signed Message:\n',
31113 public:
0x0488b21e,
31114 private:
0x0488ade4
31119 dustThreshold:
546, // https://github.com/bitcoin/bitcoin/blob/v0.9
.2/src/core.h#L151-L162
31120 feePerKb:
10000, // https://github.com/bitcoin/bitcoin/blob/v0.9
.2/src/main.cpp#L53
31121 estimateFee: estimateFee('bitcoin')
31124 magicPrefix: '\x19ShadowCash Signed Message:\n',
31126 public:
0xEE80286A,
31127 private:
0xEE8031E8
31132 dustThreshold:
0, // CHECK
31133 feePerKb:
100000000, // CHECK
31134 estimateFee: estimateFee('shadow')
31137 magicPrefix: '\x19ShadowCash Signed Message:\n',
31139 public:
0x76C0FDFB,
31140 private:
0x76C1077A
31145 dustThreshold:
0, // CHECK
31146 feePerKb:
100000000, // CHECK
31147 estimateFee: estimateFee('shadowtn')
31150 magicPrefix: '\x19Dogecoin Signed Message:\n',
31152 public:
0x02facafd,
31153 private:
0x02fac398
31158 dustThreshold:
0, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/core.h#L155-L160
31159 dustSoftThreshold:
100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/main.h#L62
31160 feePerKb:
100000000, // https://github.com/dogecoin/dogecoin/blob/v1.7
.1/src/main.cpp#L58
31161 estimateFee: estimateFee('dogecoin')
31164 magicPrefix: '\x19Litecoin Signed Message:\n',
31166 public:
0x019da462,
31167 private:
0x019d9cfe
31172 dustThreshold:
0, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.cpp#L360-L365
31173 dustSoftThreshold:
100000, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.h#L53
31174 feePerKb:
100000, // https://github.com/litecoin-project/litecoin/blob/v0.8
.7.2/src/main.cpp#L56
31175 estimateFee: estimateFee('litecoin')
31178 magicPrefix: '\x18Bitcoin Signed Message:\n',
31180 public:
0x043587cf,
31181 private:
0x04358394
31186 dustThreshold:
546,
31188 estimateFee: estimateFee('testnet')
31192 function estimateFee(type) {
31193 return function(tx) {
31194 var network = networks[type]
31195 var baseFee = network.feePerKb
31196 var byteSize = tx.toBuffer().length
31198 var fee = baseFee * Math.ceil(byteSize /
1000)
31199 if (network.dustSoftThreshold == undefined) return fee
31201 tx.outs.forEach(function(e){
31202 if (e.value < network.dustSoftThreshold) {
31211 module.exports = networks
31213 },{}],
82:[function(_dereq_,module,exports){
31254 OP_TOALTSTACK :
107,
31255 OP_FROMALTSTACK :
108,
31287 OP_EQUALVERIFY :
136,
31288 OP_RESERVED1 :
137,
31289 OP_RESERVED2 :
138,
31299 OP_0NOTEQUAL :
146,
31312 OP_NUMEQUALVERIFY :
157,
31313 OP_NUMNOTEQUAL :
158,
31315 OP_GREATERTHAN :
160,
31316 OP_LESSTHANOREQUAL :
161,
31317 OP_GREATERTHANOREQUAL :
162,
31324 OP_RIPEMD160 :
166,
31329 OP_CODESEPARATOR :
171,
31331 OP_CHECKSIGVERIFY :
173,
31332 OP_CHECKMULTISIG :
174,
31333 OP_CHECKMULTISIGVERIFY :
175,
31347 // template matching params
31348 OP_PUBKEYHASH :
253,
31350 OP_INVALIDOPCODE :
255
31353 },{}],
83:[function(_dereq_,module,exports){
31354 (function (Buffer){
31355 var assert = _dereq_('assert')
31356 var bufferutils = _dereq_('./bufferutils')
31357 var crypto = _dereq_('./crypto')
31358 var opcodes = _dereq_('./opcodes')
31360 function Script(buffer, chunks) {
31361 assert(Buffer.isBuffer(buffer), 'Expected Buffer, got ' + buffer)
31362 assert(Array.isArray(chunks), 'Expected Array, got ' + chunks)
31364 this.buffer = buffer
31365 this.chunks = chunks
31368 // Import operations
31369 Script.fromASM = function(asm) {
31370 var strChunks = asm.split(' ')
31372 var chunks = strChunks.map(function(strChunk) {
31373 if (strChunk in opcodes) {
31374 return opcodes[strChunk]
31377 return new Buffer(strChunk, 'hex')
31381 return Script.fromChunks(chunks)
31384 Script.fromBuffer = function(buffer) {
31389 while (i < buffer.length) {
31390 var opcode = buffer.readUInt8(i)
31392 if ((opcode
> opcodes.OP_0) && (opcode <= opcodes.OP_PUSHDATA4)) {
31393 var d = bufferutils.readPushDataInt(buffer, i)
31396 var data = buffer.slice(i, i + d.number)
31402 chunks.push(opcode)
31408 return new Script(buffer, chunks)
31411 Script.fromChunks = function(chunks) {
31412 assert(Array.isArray(chunks), 'Expected Array, got ' + chunks)
31414 var bufferSize = chunks.reduce(function(accum, chunk) {
31415 if (Buffer.isBuffer(chunk)) {
31416 return accum + bufferutils.pushDataSize(chunk.length) + chunk.length
31422 var buffer = new Buffer(bufferSize)
31425 chunks.forEach(function(chunk) {
31426 if (Buffer.isBuffer(chunk)) {
31427 offset += bufferutils.writePushDataInt(buffer, chunk.length, offset)
31429 chunk.copy(buffer, offset)
31430 offset += chunk.length
31433 buffer.writeUInt8(chunk, offset)
31438 assert.equal(offset, buffer.length, 'Could not decode chunks')
31439 return new Script(buffer, chunks)
31442 Script.fromHex = function(hex) {
31443 return Script.fromBuffer(new Buffer(hex, 'hex'))
31447 Script.EMPTY = Script.fromChunks([])
31450 Script.prototype.getHash = function() {
31451 return crypto.hash160(this.buffer)
31454 // FIXME: doesn't work for data chunks, maybe time to use buffertools.compare...
31455 Script.prototype.without = function(needle) {
31456 return Script.fromChunks(this.chunks.filter(function(op) {
31457 return op !== needle
31461 // Export operations
31462 var reverseOps = []
31463 for (var op in opcodes) {
31464 var code = opcodes[op]
31465 reverseOps[code] = op
31468 Script.prototype.toASM = function() {
31469 return this.chunks.map(function(chunk) {
31470 if (Buffer.isBuffer(chunk)) {
31471 return chunk.toString('hex')
31474 return reverseOps[chunk]
31479 Script.prototype.toBuffer = function() {
31483 Script.prototype.toHex = function() {
31484 return this.toBuffer().toString('hex')
31487 module.exports = Script
31489 }).call(this,_dereq_("buffer").Buffer)
31490 },{"./bufferutils":
71,"./crypto":
73,"./opcodes":
82,"assert":
4,"buffer":
8}],
84:[function(_dereq_,module,exports){
31491 (function (Buffer){
31492 var assert = _dereq_('assert')
31493 var opcodes = _dereq_('./opcodes')
31495 // FIXME: use ECPubKey, currently the circular dependency breaks everything.
31498 // * Remove ECPubKey.getAddress
31499 // - Minimal change, but likely unpopular
31500 // * Move all script related functionality out of Address
31501 // - Means a lot of changes to Transaction/Wallet
31502 // * Ignore it (existing solution)
31503 // * Some form of hackery with commonjs
31505 var ecurve = _dereq_('ecurve')
31506 var curve = ecurve.getCurveByName('secp256k1')
31508 var ECSignature = _dereq_('./ecsignature')
31509 var Script = _dereq_('./script')
31511 function classifyOutput(script) {
31512 assert(script instanceof Script, 'Expected Script, got ', script)
31514 if (isPubKeyHashOutput.call(script)) {
31515 return 'pubkeyhash'
31516 } else if (isScriptHashOutput.call(script)) {
31517 return 'scripthash'
31518 } else if (isMultisigOutput.call(script)) {
31520 } else if (isPubKeyOutput.call(script)) {
31522 } else if (isNulldataOutput.call(script)) {
31525 return 'nonstandard'
31529 function classifyInput(script) {
31530 assert(script instanceof Script, 'Expected Script, got ', script)
31532 if (isPubKeyHashInput.call(script)) {
31533 return 'pubkeyhash'
31534 } else if (isScriptHashInput.call(script)) {
31535 return 'scripthash'
31536 } else if (isMultisigInput.call(script)) {
31538 } else if (isPubKeyInput.call(script)) {
31541 return 'nonstandard'
31545 function isCanonicalPubKey(buffer) {
31546 if (!Buffer.isBuffer(buffer)) return false
31550 ecurve.Point.decodeFrom(curve, buffer)
31552 if (!(e.message.match(/Invalid sequence (length|tag)/))) throw e
31560 function isCanonicalSignature(buffer) {
31561 if (!Buffer.isBuffer(buffer)) return false
31564 ECSignature.parseScriptSignature(buffer)
31566 if (!(e.message.match(/Not a DER sequence|Invalid sequence length|Expected a DER integer|R length is zero|S length is zero|R value excessively padded|S value excessively padded|R value is negative|S value is negative|Invalid hashType/))) throw e
31574 function isPubKeyHashInput() {
31575 return this.chunks.length ===
2 &&
31576 isCanonicalSignature(this.chunks[
0]) &&
31577 isCanonicalPubKey(this.chunks[
1])
31580 function isPubKeyHashOutput() {
31581 return this.chunks.length ===
5 &&
31582 this.chunks[
0] === opcodes.OP_DUP &&
31583 this.chunks[
1] === opcodes.OP_HASH160 &&
31584 Buffer.isBuffer(this.chunks[
2]) &&
31585 this.chunks[
2].length ===
20 &&
31586 this.chunks[
3] === opcodes.OP_EQUALVERIFY &&
31587 this.chunks[
4] === opcodes.OP_CHECKSIG
31590 function isPubKeyInput() {
31591 return this.chunks.length ===
1 &&
31592 isCanonicalSignature(this.chunks[
0])
31595 function isPubKeyOutput() {
31596 return this.chunks.length ===
2 &&
31597 isCanonicalPubKey(this.chunks[
0]) &&
31598 this.chunks[
1] === opcodes.OP_CHECKSIG
31601 function isScriptHashInput() {
31602 if (this.chunks.length <
2) return false
31603 var lastChunk = this.chunks[this.chunks.length -
1]
31605 if (!Buffer.isBuffer(lastChunk)) return false
31607 var scriptSig = Script.fromChunks(this.chunks.slice(
0, -
1))
31608 var scriptPubKey = Script.fromBuffer(lastChunk)
31610 return classifyInput(scriptSig) === classifyOutput(scriptPubKey)
31613 function isScriptHashOutput() {
31614 return this.chunks.length ===
3 &&
31615 this.chunks[
0] === opcodes.OP_HASH160 &&
31616 Buffer.isBuffer(this.chunks[
1]) &&
31617 this.chunks[
1].length ===
20 &&
31618 this.chunks[
2] === opcodes.OP_EQUAL
31621 function isMultisigInput() {
31622 return this.chunks[
0] === opcodes.OP_0 &&
31623 this.chunks.slice(
1).every(isCanonicalSignature)
31626 function isMultisigOutput() {
31627 if (this.chunks <
4) return false
31628 if (this.chunks[this.chunks.length -
1] !== opcodes.OP_CHECKMULTISIG) return false
31630 var mOp = this.chunks[
0]
31631 if (mOp === opcodes.OP_0) return false
31632 if (mOp < opcodes.OP_1) return false
31633 if (mOp
> opcodes.OP_16) return false
31635 var nOp = this.chunks[this.chunks.length -
2]
31636 if (nOp === opcodes.OP_0) return false
31637 if (nOp < opcodes.OP_1) return false
31638 if (nOp
> opcodes.OP_16) return false
31640 var m = mOp - (opcodes.OP_1 -
1)
31641 var n = nOp - (opcodes.OP_1 -
1)
31642 if (n < m) return false
31644 var pubKeys = this.chunks.slice(
1, -
2)
31645 if (n < pubKeys.length) return false
31647 return pubKeys.every(isCanonicalPubKey)
31650 function isNulldataOutput() {
31651 return this.chunks[
0] === opcodes.OP_RETURN
31654 // Standard Script Templates
31655 // {pubKey} OP_CHECKSIG
31656 function pubKeyOutput(pubKey) {
31657 return Script.fromChunks([
31659 opcodes.OP_CHECKSIG
31663 // OP_DUP OP_HASH160 {pubKeyHash} OP_EQUALVERIFY OP_CHECKSIG
31664 function pubKeyHashOutput(hash) {
31665 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
31667 return Script.fromChunks([
31669 opcodes.OP_HASH160,
31671 opcodes.OP_EQUALVERIFY,
31672 opcodes.OP_CHECKSIG
31676 // OP_HASH160 {scriptHash} OP_EQUAL
31677 function scriptHashOutput(hash) {
31678 assert(Buffer.isBuffer(hash), 'Expected Buffer, got ' + hash)
31680 return Script.fromChunks([
31681 opcodes.OP_HASH160,
31687 // m [pubKeys ...] n OP_CHECKMULTISIG
31688 function multisigOutput(m, pubKeys) {
31689 assert(Array.isArray(pubKeys), 'Expected Array, got ' + pubKeys)
31690 assert(pubKeys.length
>= m, 'Not enough pubKeys provided')
31692 var pubKeyBuffers = pubKeys.map(function(pubKey) {
31693 return pubKey.toBuffer()
31695 var n = pubKeys.length
31697 return Script.fromChunks([].concat(
31698 (opcodes.OP_1 -
1) + m,
31700 (opcodes.OP_1 -
1) + n,
31701 opcodes.OP_CHECKMULTISIG
31706 function pubKeyInput(signature) {
31707 assert(Buffer.isBuffer(signature), 'Expected Buffer, got ' + signature)
31709 return Script.fromChunks([signature])
31712 // {signature} {pubKey}
31713 function pubKeyHashInput(signature, pubKey) {
31714 assert(Buffer.isBuffer(signature), 'Expected Buffer, got ' + signature)
31716 return Script.fromChunks([signature, pubKey.toBuffer()])
31719 //
<scriptSig> {serialized scriptPubKey script}
31720 function scriptHashInput(scriptSig, scriptPubKey) {
31721 return Script.fromChunks([].concat(
31723 scriptPubKey.toBuffer()
31727 // OP_0 [signatures ...]
31728 function multisigInput(signatures, scriptPubKey) {
31729 if (scriptPubKey) {
31730 assert(isMultisigOutput.call(scriptPubKey))
31732 var m = scriptPubKey.chunks[
0]
31733 var k = m - (opcodes.OP_1 -
1)
31734 assert(k <= signatures.length, 'Not enough signatures provided')
31737 return Script.fromChunks([].concat(opcodes.OP_0, signatures))
31741 classifyInput: classifyInput,
31742 classifyOutput: classifyOutput,
31743 multisigInput: multisigInput,
31744 multisigOutput: multisigOutput,
31745 pubKeyHashInput: pubKeyHashInput,
31746 pubKeyHashOutput: pubKeyHashOutput,
31747 pubKeyInput: pubKeyInput,
31748 pubKeyOutput: pubKeyOutput,
31749 scriptHashInput: scriptHashInput,
31750 scriptHashOutput: scriptHashOutput
31753 }).call(this,_dereq_("buffer").Buffer)
31754 },{"./ecsignature":
77,"./opcodes":
82,"./script":
83,"assert":
4,"buffer":
8,"ecurve":
65}],
85:[function(_dereq_,module,exports){
31755 (function (Buffer){
31756 var assert = _dereq_('assert')
31757 var bufferutils = _dereq_('./bufferutils')
31758 var crypto = _dereq_('./crypto')
31759 var opcodes = _dereq_('./opcodes')
31760 var scripts = _dereq_('./scripts')
31762 var Address = _dereq_('./address')
31763 var ECKey = _dereq_('./eckey')
31764 var ECSignature = _dereq_('./ecsignature')
31765 var Script = _dereq_('./script')
31767 Transaction.DEFAULT_SEQUENCE =
0xffffffff
31768 Transaction.SIGHASH_ALL =
0x01
31769 Transaction.SIGHASH_NONE =
0x02
31770 Transaction.SIGHASH_SINGLE =
0x03
31771 Transaction.SIGHASH_ANYONECANPAY =
0x80
31773 function Transaction() {
31781 * Create a new txin.
31783 * Can be called with any of:
31785 * - A transaction and an index
31786 * - A transaction hash and an index
31788 * Note that this method does not sign the created input.
31790 Transaction.prototype.addInput = function(tx, index, sequence) {
31791 if (sequence == undefined) sequence = Transaction.DEFAULT_SEQUENCE
31795 if (typeof tx === 'string') {
31796 hash = new Buffer(tx, 'hex')
31798 // TxId hex is big-endian, we need little-endian
31799 Array.prototype.reverse.call(hash)
31801 } else if (tx instanceof Transaction) {
31802 hash = tx.getHash()
31808 assert(Buffer.isBuffer(hash), 'Expected Transaction, txId or txHash, got ' + tx)
31809 assert.equal(hash.length,
32, 'Expected hash length of
32, got ' + hash.length)
31810 assert.equal(typeof index, 'number', 'Expected number index, got ' + index)
31812 return (this.ins.push({
31815 script: Script.EMPTY,
31821 * Create a new txout.
31823 * Can be called with:
31825 * - A base58 address string and a value
31826 * - An Address object and a value
31827 * - A scriptPubKey Script and a value
31829 Transaction.prototype.addOutput = function(scriptPubKey, value) {
31830 // Attempt to get a valid address if it's a base58 address string
31831 if (typeof scriptPubKey === 'string') {
31832 scriptPubKey = Address.fromBase58Check(scriptPubKey)
31835 // Attempt to get a valid script if it's an Address object
31836 if (scriptPubKey instanceof Address) {
31837 var address = scriptPubKey
31839 scriptPubKey = address.toOutputScript()
31842 return (this.outs.push({
31843 script: scriptPubKey,
31848 Transaction.prototype.toBuffer = function () {
31849 var txInSize = this.ins.reduce(function(a, x) {
31850 return a + (
40 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
31853 var txOutSize = this.outs.reduce(function(a, x) {
31854 return a + (
8 + bufferutils.varIntSize(x.script.buffer.length) + x.script.buffer.length)
31857 var buffer = new Buffer(
31859 bufferutils.varIntSize(this.ins.length) +
31860 bufferutils.varIntSize(this.outs.length) +
31866 function writeSlice(slice) {
31867 slice.copy(buffer, offset)
31868 offset += slice.length
31870 function writeUInt32(i) {
31871 buffer.writeUInt32LE(i, offset)
31874 function writeUInt64(i) {
31875 bufferutils.writeUInt64LE(buffer, i, offset)
31878 function writeVarInt(i) {
31879 var n = bufferutils.writeVarInt(buffer, i, offset)
31883 writeUInt32(this.version)
31884 writeVarInt(this.ins.length)
31886 this.ins.forEach(function(txin) {
31887 writeSlice(txin.hash)
31888 writeUInt32(txin.index)
31889 writeVarInt(txin.script.buffer.length)
31890 writeSlice(txin.script.buffer)
31891 writeUInt32(txin.sequence)
31894 writeVarInt(this.outs.length)
31895 this.outs.forEach(function(txout) {
31896 writeUInt64(txout.value)
31897 writeVarInt(txout.script.buffer.length)
31898 writeSlice(txout.script.buffer)
31901 writeUInt32(this.locktime)
31906 Transaction.prototype.toHex = function() {
31907 return this.toBuffer().toString('hex')
31911 * Hash transaction for signing a specific input.
31913 * Bitcoin uses a different hash for each signed transaction input. This
31914 * method copies the transaction, makes the necessary changes based on the
31915 * hashType, serializes and finally hashes the result. This hash can then be
31916 * used to sign the transaction input in question.
31918 Transaction.prototype.hashForSignature = function(prevOutScript, inIndex, hashType) {
31919 assert(inIndex
>=
0, 'Invalid vin index')
31920 assert(inIndex < this.ins.length, 'Invalid vin index')
31921 assert(prevOutScript instanceof Script, 'Invalid Script object')
31923 var txTmp = this.clone()
31924 var hashScript = prevOutScript.without(opcodes.OP_CODESEPARATOR)
31926 // Blank out other inputs' signatures
31927 txTmp.ins.forEach(function(txin) {
31928 txin.script = Script.EMPTY
31930 txTmp.ins[inIndex].script = hashScript
31932 var hashTypeModifier = hashType &
0x1f
31933 if (hashTypeModifier === Transaction.SIGHASH_NONE) {
31934 assert(false, 'SIGHASH_NONE not yet supported')
31936 } else if (hashTypeModifier === Transaction.SIGHASH_SINGLE) {
31937 assert(false, 'SIGHASH_SINGLE not yet supported')
31941 if (hashType & Transaction.SIGHASH_ANYONECANPAY) {
31942 assert(false, 'SIGHASH_ANYONECANPAY not yet supported')
31945 var hashTypeBuffer = new Buffer(
4)
31946 hashTypeBuffer.writeInt32LE(hashType,
0)
31948 var buffer = Buffer.concat([txTmp.toBuffer(), hashTypeBuffer])
31949 return crypto.hash256(buffer)
31952 Transaction.prototype.getHash = function () {
31953 return crypto.hash256(this.toBuffer())
31956 Transaction.prototype.getId = function () {
31957 var buffer = this.getHash()
31959 // Big-endian is used for TxHash
31960 Array.prototype.reverse.call(buffer)
31962 return buffer.toString('hex')
31965 Transaction.prototype.clone = function () {
31966 var newTx = new Transaction()
31967 newTx.version = this.version
31968 newTx.locktime = this.locktime
31970 newTx.ins = this.ins.map(function(txin) {
31974 script: txin.script,
31975 sequence: txin.sequence
31979 newTx.outs = this.outs.map(function(txout) {
31981 script: txout.script,
31989 Transaction.fromBuffer = function(buffer) {
31991 function readSlice(n) {
31993 return buffer.slice(offset - n, offset)
31995 function readUInt32() {
31996 var i = buffer.readUInt32LE(offset)
32000 function readUInt64() {
32001 var i = bufferutils.readUInt64LE(buffer, offset)
32005 function readVarInt() {
32006 var vi = bufferutils.readVarInt(buffer, offset)
32011 var tx = new Transaction()
32012 tx.version = readUInt32()
32014 var vinLen = readVarInt()
32015 for (var i =
0; i < vinLen; ++i) {
32016 var hash = readSlice(
32)
32017 var vout = readUInt32()
32018 var scriptLen = readVarInt()
32019 var script = readSlice(scriptLen)
32020 var sequence = readUInt32()
32025 script: Script.fromBuffer(script),
32030 var voutLen = readVarInt()
32031 for (i =
0; i < voutLen; ++i) {
32032 var value = readUInt64()
32033 var scriptLen = readVarInt()
32034 var script = readSlice(scriptLen)
32038 script: Script.fromBuffer(script)
32042 tx.locktime = readUInt32()
32043 assert.equal(offset, buffer.length, 'Transaction has unexpected data')
32048 Transaction.fromHex = function(hex) {
32049 return Transaction.fromBuffer(new Buffer(hex, 'hex'))
32053 * Signs a pubKeyHash output at some index with the given key
32055 Transaction.prototype.sign = function(index, privKey, hashType) {
32056 var prevOutScript = privKey.pub.getAddress().toOutputScript()
32057 var signature = this.signInput(index, prevOutScript, privKey, hashType)
32059 // FIXME: Assumed prior TX was pay-to-pubkey-hash
32060 var scriptSig = scripts.pubKeyHashInput(signature, privKey.pub)
32061 this.setInputScript(index, scriptSig)
32064 Transaction.prototype.signInput = function(index, prevOutScript, privKey, hashType) {
32065 hashType = hashType || Transaction.SIGHASH_ALL
32067 var hash = this.hashForSignature(prevOutScript, index, hashType)
32068 var signature = privKey.sign(hash)
32070 return signature.toScriptSignature(hashType)
32073 Transaction.prototype.setInputScript = function(index, script) {
32074 this.ins[index].script = script
32077 // FIXME: could be validateInput(index, prevTxOut, pub)
32078 Transaction.prototype.validateInput = function(index, prevOutScript, pubKey, buffer) {
32079 var parsed = ECSignature.parseScriptSignature(buffer)
32080 var hash = this.hashForSignature(prevOutScript, index, parsed.hashType)
32082 return pubKey.verify(hash, parsed.signature)
32085 module.exports = Transaction
32087 }).call(this,_dereq_("buffer").Buffer)
32088 },{"./address":
69,"./bufferutils":
71,"./crypto":
73,"./eckey":
75,"./ecsignature":
77,"./opcodes":
82,"./script":
83,"./scripts":
84,"assert":
4,"buffer":
8}],
86:[function(_dereq_,module,exports){
32089 (function (Buffer){
32090 var assert = _dereq_('assert')
32091 var networks = _dereq_('./networks')
32092 var rng = _dereq_('secure-random')
32094 var Address = _dereq_('./address')
32095 var HDNode = _dereq_('./hdnode')
32096 var Transaction = _dereq_('./transaction')
32098 function Wallet(seed, network) {
32099 network = network || networks.bitcoin
32101 // Stored in a closure to make accidental serialization less likely
32102 var masterkey = null
32104 var accountZero = null
32105 var internalAccount = null
32106 var externalAccount = null
32109 this.addresses = []
32110 this.changeAddresses = []
32112 // Transaction output data
32115 // Make a new master key
32116 this.newMasterKey = function(seed) {
32117 seed = seed || new Buffer(rng(
32))
32118 masterkey = HDNode.fromSeedBuffer(seed, network)
32120 // HD first-level child derivation method should be hardened
32121 // See https://bitcointalk.org/index.php?topic=
405179.msg4415254#msg4415254
32122 accountZero = masterkey.deriveHardened(
0)
32123 externalAccount = accountZero.derive(
0)
32124 internalAccount = accountZero.derive(
1)
32127 me.changeAddresses = []
32132 this.newMasterKey(seed)
32134 this.generateAddress = function() {
32135 var key = externalAccount.derive(this.addresses.length)
32136 this.addresses.push(key.getAddress().toString())
32137 return this.addresses[this.addresses.length -
1]
32140 this.generateChangeAddress = function() {
32141 var key = internalAccount.derive(this.changeAddresses.length)
32142 this.changeAddresses.push(key.getAddress().toString())
32143 return this.changeAddresses[this.changeAddresses.length -
1]
32146 this.getBalance = function() {
32147 return this.getUnspentOutputs().reduce(function(memo, output){
32148 return memo + output.value
32152 this.getUnspentOutputs = function() {
32155 for(var key in this.outputs){
32156 var output = this.outputs[key]
32157 if(!output.to) utxo.push(outputToUnspentOutput(output))
32163 this.setUnspentOutputs = function(utxo) {
32166 utxo.forEach(function(uo){
32167 validateUnspentOutput(uo)
32168 var o = unspentOutputToOutput(uo)
32169 outputs[o.from] = o
32172 this.outputs = outputs
32175 function outputToUnspentOutput(output){
32176 var hashAndIndex = output.from.split(":")
32179 hash: hashAndIndex[
0],
32180 outputIndex: parseInt(hashAndIndex[
1]),
32181 address: output.address,
32182 value: output.value,
32183 pending: output.pending
32187 function unspentOutputToOutput(o) {
32189 var key = hash + ":" + o.outputIndex
32192 address: o.address,
32198 function validateUnspentOutput(uo) {
32201 if (isNullOrUndefined(uo.hash)) {
32202 missingField = "hash"
32205 var requiredKeys = ['outputIndex', 'address', 'value']
32206 requiredKeys.forEach(function (key) {
32207 if (isNullOrUndefined(uo[key])){
32212 if (missingField) {
32214 'Invalid unspent output: key', missingField, 'is missing.',
32215 'A valid unspent output must contain'
32217 message.push(requiredKeys.join(', '))
32218 message.push("and hash")
32219 throw new Error(message.join(' '))
32223 function isNullOrUndefined(value) {
32224 return value == undefined
32227 this.processPendingTx = function(tx){
32228 processTx(tx, true)
32231 this.processConfirmedTx = function(tx){
32232 processTx(tx, false)
32235 function processTx(tx, isPending) {
32236 var txid = tx.getId()
32238 tx.outs.forEach(function(txOut, i) {
32242 address = Address.fromOutputScript(txOut.script, network).toString()
32244 if (!(e.message.match(/has no matching Address/))) throw e
32247 if (isMyAddress(address)) {
32248 var output = txid + ':' + i
32250 me.outputs[output] = {
32252 value: txOut.value,
32259 tx.ins.forEach(function(txIn, i) {
32260 // copy and convert to big-endian hex
32261 var txinId = new Buffer(txIn.hash)
32262 Array.prototype.reverse.call(txinId)
32263 txinId = txinId.toString('hex')
32265 var output = txinId + ':' + txIn.index
32267 if (!(output in me.outputs)) return
32270 me.outputs[output].to = txid + ':' + i
32271 me.outputs[output].pending = true
32273 delete me.outputs[output]
32278 this.createTx = function(to, value, fixedFee, changeAddress) {
32279 assert(value
> network.dustThreshold, value + ' must be above dust threshold (' + network.dustThreshold + ' Satoshis)')
32281 var utxos = getCandidateOutputs(value)
32283 var subTotal = value
32286 var tx = new Transaction()
32287 tx.addOutput(to, value)
32289 for (var i =
0; i < utxos.length; ++i) {
32290 var utxo = utxos[i]
32291 addresses.push(utxo.address)
32293 var outpoint = utxo.from.split(':')
32294 tx.addInput(outpoint[
0], parseInt(outpoint[
1]))
32296 var fee = fixedFee == undefined ? estimateFeePadChangeOutput(tx) : fixedFee
32298 accum += utxo.value
32299 subTotal = value + fee
32300 if (accum
>= subTotal) {
32301 var change = accum - subTotal
32303 if (change
> network.dustThreshold) {
32304 tx.addOutput(changeAddress || getChangeAddress(), change)
32311 assert(accum
>= subTotal, 'Not enough funds (incl. fee): ' + accum + ' < ' + subTotal)
32313 this.signWith(tx, addresses)
32317 function getCandidateOutputs() {
32320 for (var key in me.outputs) {
32321 var output = me.outputs[key]
32322 if (!output.pending) unspent.push(output)
32325 var sortByValueDesc = unspent.sort(function(o1, o2){
32326 return o2.value - o1.value
32329 return sortByValueDesc
32332 function estimateFeePadChangeOutput(tx) {
32333 var tmpTx = tx.clone()
32334 tmpTx.addOutput(getChangeAddress(), network.dustSoftThreshold ||
0)
32336 return network.estimateFee(tmpTx)
32339 function getChangeAddress() {
32340 if(me.changeAddresses.length ===
0) me.generateChangeAddress();
32341 return me.changeAddresses[me.changeAddresses.length -
1]
32344 this.signWith = function(tx, addresses) {
32345 assert.equal(tx.ins.length, addresses.length, 'Number of addresses must match number of transaction inputs')
32347 addresses.forEach(function(address, i) {
32348 var key = me.getPrivateKeyForAddress(address)
32356 this.getMasterKey = function() { return masterkey }
32357 this.getAccountZero = function() { return accountZero }
32358 this.getInternalAccount = function() { return internalAccount }
32359 this.getExternalAccount = function() { return externalAccount }
32361 this.getPrivateKey = function(index) {
32362 return externalAccount.derive(index).privKey
32365 this.getInternalPrivateKey = function(index) {
32366 return internalAccount.derive(index).privKey
32369 this.getPrivateKeyForAddress = function(address) {
32371 if((index = this.addresses.indexOf(address))
> -
1) {
32372 return this.getPrivateKey(index)
32373 } else if((index = this.changeAddresses.indexOf(address))
> -
1) {
32374 return this.getInternalPrivateKey(index)
32376 throw new Error('Unknown address. Make sure the address is from the keychain and has been generated.')
32380 function isReceiveAddress(address){
32381 return me.addresses.indexOf(address)
> -
1
32384 function isChangeAddress(address){
32385 return me.changeAddresses.indexOf(address)
> -
1
32388 function isMyAddress(address) {
32389 return isReceiveAddress(address) || isChangeAddress(address)
32393 module.exports = Wallet
32395 }).call(this,_dereq_("buffer").Buffer)
32396 },{"./address":
69,"./hdnode":
78,"./networks":
81,"./transaction":
85,"assert":
4,"buffer":
8,"secure-random":
68}]},{},[
79])
32401 // Select components from sjcl to suit the crypto operations bip39 requires.
32405 /** @fileOverview Javascript cryptography implementation.
32407 * Crush to remove comments, shorten variable names and
32408 * generally reduce transmission size.
32410 * @author Emily Stark
32411 * @author Mike Hamburg
32412 * @author Dan Boneh
32416 /*jslint indent:
2, bitwise: false, nomen: false, plusplus: false, white: false, regexp: false */
32417 /*global document, window, escape, unescape, module, require, Uint32Array */
32419 /** @namespace The Stanford Javascript Crypto Library, top-level namespace. */
32421 /** @namespace Symmetric ciphers. */
32424 /** @namespace Hash functions. Right now only SHA256 is implemented. */
32427 /** @namespace Key exchange functions. Right now only SRP is implemented. */
32430 /** @namespace Block cipher modes of operation. */
32433 /** @namespace Miscellaneous. HMAC and PBKDF2. */
32437 * @namespace Bit array encoders and decoders.
32440 * The members of this namespace are functions which translate between
32441 * SJCL's bitArrays and other objects (usually strings). Because it
32442 * isn't always clear which direction is encoding and which is decoding,
32443 * the method names are "fromBits" and "toBits".
32447 /** @namespace Exceptions. */
32449 /** @constructor Ciphertext is corrupt. */
32450 corrupt: function(message) {
32451 this.toString = function() { return "CORRUPT: "+this.message; };
32452 this.message = message;
32455 /** @constructor Invalid parameter. */
32456 invalid: function(message) {
32457 this.toString = function() { return "INVALID: "+this.message; };
32458 this.message = message;
32461 /** @constructor Bug or missing feature in SJCL. @constructor */
32462 bug: function(message) {
32463 this.toString = function() { return "BUG: "+this.message; };
32464 this.message = message;
32467 /** @constructor Something isn't ready. */
32468 notReady: function(message) {
32469 this.toString = function() { return "NOT READY: "+this.message; };
32470 this.message = message;
32475 if(typeof module !== 'undefined' && module.exports){
32476 module.exports = sjcl;
32478 if (typeof define === "function") {
32479 define([], function () {
32487 /** @fileOverview Arrays of bits, encoded as arrays of Numbers.
32489 * @author Emily Stark
32490 * @author Mike Hamburg
32491 * @author Dan Boneh
32494 /** @namespace Arrays of bits, encoded as arrays of Numbers.
32498 * These objects are the currency accepted by SJCL's crypto functions.
32502 * Most of our crypto primitives operate on arrays of
4-byte words internally,
32503 * but many of them can take arguments that are not a multiple of
4 bytes.
32504 * This library encodes arrays of bits (whose size need not be a multiple of
8
32505 * bits) as arrays of
32-bit words. The bits are packed, big-endian, into an
32506 * array of words,
32 bits at a time. Since the words are double-precision
32507 * floating point numbers, they fit some extra data. We use this (in a private,
32508 * possibly-changing manner) to encode the number of bits actually present
32509 * in the last word of the array.
32513 * Because bitwise ops clear this out-of-band data, these arrays can be passed
32514 * to ciphers like AES which want arrays of words.
32519 * Array slices in units of bits.
32520 * @param {bitArray} a The array to slice.
32521 * @param {Number} bstart The offset to the start of the slice, in bits.
32522 * @param {Number} bend The offset to the end of the slice, in bits. If this is undefined,
32523 * slice until the end of the array.
32524 * @return {bitArray} The requested slice.
32526 bitSlice: function (a, bstart, bend) {
32527 a = sjcl.bitArray._shiftRight(a.slice(bstart/
32),
32 - (bstart &
31)).slice(
1);
32528 return (bend === undefined) ? a : sjcl.bitArray.clamp(a, bend-bstart);
32532 * Extract a number packed into a bit array.
32533 * @param {bitArray} a The array to slice.
32534 * @param {Number} bstart The offset to the start of the slice, in bits.
32535 * @param {Number} length The length of the number to extract.
32536 * @return {Number} The requested slice.
32538 extract: function(a, bstart, blength) {
32539 // FIXME: this Math.floor is not necessary at all, but for some reason
32540 // seems to suppress a bug in the Chromium JIT.
32541 var x, sh = Math.floor((-bstart-blength) &
31);
32542 if ((bstart + blength -
1 ^ bstart) & -
32) {
32543 // it crosses a boundary
32544 x = (a[bstart/
32|
0] << (
32 - sh)) ^ (a[bstart/
32+
1|
0]
>>> sh);
32546 // within a single word
32547 x = a[bstart/
32|
0]
>>> sh;
32549 return x & ((
1<
<blength) -
1);
32553 * Concatenate two bit arrays.
32554 * @param {bitArray} a1 The first array.
32555 * @param {bitArray} a2 The second array.
32556 * @return {bitArray} The concatenation of a1 and a2.
32558 concat: function (a1, a2) {
32559 if (a1.length ===
0 || a2.length ===
0) {
32560 return a1.concat(a2);
32563 var last = a1[a1.length-
1], shift = sjcl.bitArray.getPartial(last);
32564 if (shift ===
32) {
32565 return a1.concat(a2);
32567 return sjcl.bitArray._shiftRight(a2, shift, last|
0, a1.slice(
0,a1.length-
1));
32572 * Find the length of an array of bits.
32573 * @param {bitArray} a The array.
32574 * @return {Number} The length of a, in bits.
32576 bitLength: function (a) {
32577 var l = a.length, x;
32578 if (l ===
0) { return
0; }
32580 return (l-
1) *
32 + sjcl.bitArray.getPartial(x);
32584 * Truncate an array.
32585 * @param {bitArray} a The array.
32586 * @param {Number} len The length to truncate to, in bits.
32587 * @return {bitArray} A new array, truncated to len bits.
32589 clamp: function (a, len) {
32590 if (a.length *
32 < len) { return a; }
32591 a = a.slice(
0, Math.ceil(len /
32));
32594 if (l
> 0 && len) {
32595 a[l-
1] = sjcl.bitArray.partial(len, a[l-
1] &
0x80000000 >> (len-
1),
1);
32601 * Make a partial word for a bit array.
32602 * @param {Number} len The number of bits in the word.
32603 * @param {Number} x The bits.
32604 * @param {Number} [
0] _end Pass
1 if x has already been shifted to the high side.
32605 * @return {Number} The partial word.
32607 partial: function (len, x, _end) {
32608 if (len ===
32) { return x; }
32609 return (_end ? x|
0 : x << (
32-len)) + len *
0x10000000000;
32613 * Get the number of bits used by a partial word.
32614 * @param {Number} x The partial word.
32615 * @return {Number} The number of bits used by the partial word.
32617 getPartial: function (x) {
32618 return Math.round(x/
0x10000000000) ||
32;
32622 * Compare two arrays for equality in a predictable amount of time.
32623 * @param {bitArray} a The first array.
32624 * @param {bitArray} b The second array.
32625 * @return {boolean} true if a == b; false otherwise.
32627 equal: function (a, b) {
32628 if (sjcl.bitArray.bitLength(a) !== sjcl.bitArray.bitLength(b)) {
32632 for (i=
0; i
<a.length; i++) {
32638 /** Shift an array right.
32639 * @param {bitArray} a The array to shift.
32640 * @param {Number} shift The number of bits to shift.
32641 * @param {Number} [carry=
0] A byte to carry in
32642 * @param {bitArray} [out=[]] An array to prepend to the output.
32645 _shiftRight: function (a, shift, carry, out) {
32646 var i, last2=
0, shift2;
32647 if (out === undefined) { out = []; }
32649 for (; shift
>=
32; shift -=
32) {
32654 return out.concat(a);
32657 for (i=
0; i
<a.length; i++) {
32658 out.push(carry | a[i]
>>>shift);
32659 carry = a[i] << (
32-shift);
32661 last2 = a.length ? a[a.length-
1] :
0;
32662 shift2 = sjcl.bitArray.getPartial(last2);
32663 out.push(sjcl.bitArray.partial(shift+shift2 &
31, (shift + shift2
> 32) ? carry : out.pop(),
1));
32667 /** xor a block of
4 words together.
32670 _xor4: function(x,y) {
32671 return [x[
0]^y[
0],x[
1]^y[
1],x[
2]^y[
2],x[
3]^y[
3]];
32674 /** byteswap a word array inplace.
32675 * (does not handle partial words)
32676 * @param {sjcl.bitArray} a word array
32677 * @return {sjcl.bitArray} byteswapped array
32679 byteswapM: function(a) {
32680 var i, v, m =
0xff00;
32681 for (i =
0; i < a.length; ++i) {
32683 a[i] = (v
>>> 24) | ((v
>>> 8) & m) | ((v & m) <<
8) | (v <<
24);
32690 //// codecString.js
32692 /** @fileOverview Bit array codec implementations.
32694 * @author Emily Stark
32695 * @author Mike Hamburg
32696 * @author Dan Boneh
32699 /** @namespace UTF-
8 strings */
32700 sjcl.codec.utf8String = {
32701 /** Convert from a bitArray to a UTF-
8 string. */
32702 fromBits: function (arr) {
32703 var out =
"", bl = sjcl.bitArray.bitLength(arr), i, tmp;
32704 for (i=
0; i
<bl/
8; i++) {
32708 out += String.fromCharCode(tmp
>>> 24);
32711 return decodeURIComponent(escape(out));
32714 /** Convert from a UTF-
8 string to a bitArray. */
32715 toBits: function (str) {
32716 str = unescape(encodeURIComponent(str));
32717 var out = [], i, tmp=
0;
32718 for (i=
0; i
<str.length; i++) {
32719 tmp = tmp <<
8 | str.charCodeAt(i);
32726 out.push(sjcl.bitArray.partial(
8*(i&
3), tmp));
32735 /** @fileOverview Bit array codec implementations.
32737 * @author Emily Stark
32738 * @author Mike Hamburg
32739 * @author Dan Boneh
32742 /** @namespace Hexadecimal */
32744 /** Convert from a bitArray to a hex string. */
32745 fromBits: function (arr) {
32747 for (i=
0; i
<arr.length; i++) {
32748 out += ((arr[i]|
0)+
0xF00000000000).toString(
16).substr(
4);
32750 return out.substr(
0, sjcl.bitArray.bitLength(arr)/
4);//.replace(/(.{
8})/g,
"$1 ");
32752 /** Convert from a hex string to a bitArray. */
32753 toBits: function (str) {
32754 var i, out=[], len;
32755 str = str.replace(/\s|
0x/g,
"");
32757 str = str +
"00000000";
32758 for (i=
0; i
<str.length; i+=
8) {
32759 out.push(parseInt(str.substr(i,
8),
16)^
0);
32761 return sjcl.bitArray.clamp(out, len*
4);
32768 /** @fileOverview Javascript SHA-
512 implementation.
32770 * This implementation was written for CryptoJS by Jeff Mott and adapted for
32771 * SJCL by Stefan Thomas.
32773 * CryptoJS (c)
2009–
2012 by Jeff Mott. All rights reserved.
32774 * Released with New BSD License
32776 * @author Emily Stark
32777 * @author Mike Hamburg
32778 * @author Dan Boneh
32779 * @author Jeff Mott
32780 * @author Stefan Thomas
32784 * Context for a SHA-
512 operation in progress.
32786 * @class Secure Hash Algorithm,
512 bits.
32788 sjcl.hash.sha512 = function (hash) {
32789 if (!this._key[
0]) { this._precompute(); }
32791 this._h = hash._h.slice(
0);
32792 this._buffer = hash._buffer.slice(
0);
32793 this._length = hash._length;
32800 * Hash a string or an array of words.
32802 * @param {bitArray|String} data the data to hash.
32803 * @return {bitArray} The hash value, an array of
16 big-endian words.
32805 sjcl.hash.sha512.hash = function (data) {
32806 return (new sjcl.hash.sha512()).update(data).finalize();
32809 sjcl.hash.sha512.prototype = {
32811 * The hash's block size, in bits.
32817 * Reset the hash state.
32820 reset:function () {
32821 this._h = this._init.slice(
0);
32828 * Input several words to the hash.
32829 * @param {bitArray|String} data the data to hash.
32832 update: function (data) {
32833 if (typeof data ===
"string") {
32834 data = sjcl.codec.utf8String.toBits(data);
32836 var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data),
32838 nl = this._length = ol + sjcl.bitArray.bitLength(data);
32839 for (i =
1024+ol & -
1024; i <= nl; i+=
1024) {
32840 this._block(b.splice(
0,
32));
32846 * Complete hashing and output the hash value.
32847 * @return {bitArray} The hash value, an array of
16 big-endian words.
32849 finalize:function () {
32850 var i, b = this._buffer, h = this._h;
32852 // Round out and push the buffer
32853 b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(
1,
1)]);
32855 // Round out the buffer to a multiple of
32 words, less the
4 length words.
32856 for (i = b.length +
4; i &
31; i++) {
32860 // append the length
32863 b.push(Math.floor(this._length /
0x100000000));
32864 b.push(this._length |
0);
32867 this._block(b.splice(
0,
32));
32875 * The SHA-
512 initialization vector, to be precomputed.
32881 * Least significant
24 bits of SHA512 initialization values.
32883 * Javascript only has
53 bits of precision, so we compute the
40 most
32884 * significant bits and add the remaining
24 bits as constants.
32888 _initr: [
0xbcc908,
0xcaa73b,
0x94f82b,
0x1d36f1,
0xe682d1,
0x3e6c1f,
0x41bd6b,
0x7e2179 ],
32892 [
0x6a09e667,
0xf3bcc908,
0xbb67ae85,
0x84caa73b,
0x3c6ef372,
0xfe94f82b,
0xa54ff53a,
0x5f1d36f1,
32893 0x510e527f,
0xade682d1,
0x9b05688c,
0x2b3e6c1f,
0x1f83d9ab,
0xfb41bd6b,
0x5be0cd19,
0x137e2179],
32897 * The SHA-
512 hash key, to be precomputed.
32903 * Least significant
24 bits of SHA512 key values.
32907 [
0x28ae22,
0xef65cd,
0x4d3b2f,
0x89dbbc,
0x48b538,
0x05d019,
0x194f9b,
0x6d8118,
32908 0x030242,
0x706fbe,
0xe4b28c,
0xffb4e2,
0x7b896f,
0x1696b1,
0xc71235,
0x692694,
32909 0xf14ad2,
0x4f25e3,
0x8cd5b5,
0xac9c65,
0x2b0275,
0xa6e483,
0x41fbd4,
0x1153b5,
32910 0x66dfab,
0xb43210,
0xfb213f,
0xef0ee4,
0xa88fc2,
0x0aa725,
0x03826f,
0x0e6e70,
32911 0xd22ffc,
0x26c926,
0xc42aed,
0x95b3df,
0xaf63de,
0x77b2a8,
0xedaee6,
0x82353b,
32912 0xf10364,
0x423001,
0xf89791,
0x54be30,
0xef5218,
0x65a910,
0x71202a,
0xbbd1b8,
32913 0xd2d0c8,
0x41ab53,
0x8eeb99,
0x9b48a8,
0xc95a63,
0x418acb,
0x63e373,
0xb2b8a3,
32914 0xefb2fc,
0x172f60,
0xf0ab72,
0x6439ec,
0x631e28,
0x82bde9,
0xc67915,
0x72532b,
32915 0x26619c,
0xc0c207,
0xe0eb1e,
0x6ed178,
0x176fba,
0xc898a6,
0xf90dae,
0x1c471b,
32916 0x047d84,
0xc72493,
0xc9bebc,
0x100d4c,
0x3e42b6,
0x657e2a,
0xd6faec,
0x475817],
32920 [
0x428a2f98,
0xd728ae22,
0x71374491,
0x23ef65cd,
0xb5c0fbcf,
0xec4d3b2f,
0xe9b5dba5,
0x8189dbbc,
32921 0x3956c25b,
0xf348b538,
0x59f111f1,
0xb605d019,
0x923f82a4,
0xaf194f9b,
0xab1c5ed5,
0xda6d8118,
32922 0xd807aa98,
0xa3030242,
0x12835b01,
0x45706fbe,
0x243185be,
0x4ee4b28c,
0x550c7dc3,
0xd5ffb4e2,
32923 0x72be5d74,
0xf27b896f,
0x80deb1fe,
0x3b1696b1,
0x9bdc06a7,
0x25c71235,
0xc19bf174,
0xcf692694,
32924 0xe49b69c1,
0x9ef14ad2,
0xefbe4786,
0x384f25e3,
0x0fc19dc6,
0x8b8cd5b5,
0x240ca1cc,
0x77ac9c65,
32925 0x2de92c6f,
0x592b0275,
0x4a7484aa,
0x6ea6e483,
0x5cb0a9dc,
0xbd41fbd4,
0x76f988da,
0x831153b5,
32926 0x983e5152,
0xee66dfab,
0xa831c66d,
0x2db43210,
0xb00327c8,
0x98fb213f,
0xbf597fc7,
0xbeef0ee4,
32927 0xc6e00bf3,
0x3da88fc2,
0xd5a79147,
0x930aa725,
0x06ca6351,
0xe003826f,
0x14292967,
0x0a0e6e70,
32928 0x27b70a85,
0x46d22ffc,
0x2e1b2138,
0x5c26c926,
0x4d2c6dfc,
0x5ac42aed,
0x53380d13,
0x9d95b3df,
32929 0x650a7354,
0x8baf63de,
0x766a0abb,
0x3c77b2a8,
0x81c2c92e,
0x47edaee6,
0x92722c85,
0x1482353b,
32930 0xa2bfe8a1,
0x4cf10364,
0xa81a664b,
0xbc423001,
0xc24b8b70,
0xd0f89791,
0xc76c51a3,
0x0654be30,
32931 0xd192e819,
0xd6ef5218,
0xd6990624,
0x5565a910,
0xf40e3585,
0x5771202a,
0x106aa070,
0x32bbd1b8,
32932 0x19a4c116,
0xb8d2d0c8,
0x1e376c08,
0x5141ab53,
0x2748774c,
0xdf8eeb99,
0x34b0bcb5,
0xe19b48a8,
32933 0x391c0cb3,
0xc5c95a63,
0x4ed8aa4a,
0xe3418acb,
0x5b9cca4f,
0x7763e373,
0x682e6ff3,
0xd6b2b8a3,
32934 0x748f82ee,
0x5defb2fc,
0x78a5636f,
0x43172f60,
0x84c87814,
0xa1f0ab72,
0x8cc70208,
0x1a6439ec,
32935 0x90befffa,
0x23631e28,
0xa4506ceb,
0xde82bde9,
0xbef9a3f7,
0xb2c67915,
0xc67178f2,
0xe372532b,
32936 0xca273ece,
0xea26619c,
0xd186b8c7,
0x21c0c207,
0xeada7dd6,
0xcde0eb1e,
0xf57d4f7f,
0xee6ed178,
32937 0x06f067aa,
0x72176fba,
0x0a637dc5,
0xa2c898a6,
0x113f9804,
0xbef90dae,
0x1b710b35,
0x131c471b,
32938 0x28db77f5,
0x23047d84,
0x32caab7b,
0x40c72493,
0x3c9ebe0a,
0x15c9bebc,
0x431d67c4,
0x9c100d4c,
32939 0x4cc5d4be,
0xcb3e42b6,
0x597f299c,
0xfc657e2a,
0x5fcb6fab,
0x3ad6faec,
0x6c44198c,
0x4a475817],
32943 * Function to precompute _init and _key.
32946 _precompute: function () {
32947 // XXX: This code is for precomputing the SHA256 constants, change for
32948 // SHA512 and re-enable.
32949 var i =
0, prime =
2, factor;
32951 function frac(x) { return (x-Math.floor(x)) *
0x100000000 |
0; }
32952 function frac2(x) { return (x-Math.floor(x)) *
0x10000000000 &
0xff; }
32954 outer: for (; i
<80; prime++) {
32955 for (factor=
2; factor*factor <= prime; factor++) {
32956 if (prime % factor ===
0) {
32963 this._init[i*
2] = frac(Math.pow(prime,
1/
2));
32964 this._init[i*
2+
1] = (frac2(Math.pow(prime,
1/
2)) <<
24) | this._initr[i];
32966 this._key[i*
2] = frac(Math.pow(prime,
1/
3));
32967 this._key[i*
2+
1] = (frac2(Math.pow(prime,
1/
3)) <<
24) | this._keyr[i];
32973 * Perform one cycle of SHA-
512.
32974 * @param {bitArray} words one block of words.
32977 _block:function (words) {
32979 w = words.slice(
0),
32982 h0h = h[
0], h0l = h[
1], h1h = h[
2], h1l = h[
3],
32983 h2h = h[
4], h2l = h[
5], h3h = h[
6], h3l = h[
7],
32984 h4h = h[
8], h4l = h[
9], h5h = h[
10], h5l = h[
11],
32985 h6h = h[
12], h6l = h[
13], h7h = h[
14], h7l = h[
15];
32987 // Working variables
32988 var ah = h0h, al = h0l, bh = h1h, bl = h1l,
32989 ch = h2h, cl = h2l, dh = h3h, dl = h3l,
32990 eh = h4h, el = h4l, fh = h5h, fl = h5l,
32991 gh = h6h, gl = h6l, hh = h7h, hl = h7l;
32993 for (i=
0; i
<80; i++) {
32994 // load up the input word for this round
32997 wrl = w[i *
2 +
1];
33000 var gamma0xh = w[(i-
15) *
2];
33001 var gamma0xl = w[(i-
15) *
2 +
1];
33003 ((gamma0xl <<
31) | (gamma0xh
>>> 1)) ^
33004 ((gamma0xl <<
24) | (gamma0xh
>>> 8)) ^
33007 ((gamma0xh <<
31) | (gamma0xl
>>> 1)) ^
33008 ((gamma0xh <<
24) | (gamma0xl
>>> 8)) ^
33009 ((gamma0xh <<
25) | (gamma0xl
>>> 7));
33012 var gamma1xh = w[(i-
2) *
2];
33013 var gamma1xl = w[(i-
2) *
2 +
1];
33015 ((gamma1xl <<
13) | (gamma1xh
>>> 19)) ^
33016 ((gamma1xh <<
3) | (gamma1xl
>>> 29)) ^
33019 ((gamma1xh <<
13) | (gamma1xl
>>> 19)) ^
33020 ((gamma1xl <<
3) | (gamma1xh
>>> 29)) ^
33021 ((gamma1xh <<
26) | (gamma1xl
>>> 6));
33024 var wr7h = w[(i-
7) *
2];
33025 var wr7l = w[(i-
7) *
2 +
1];
33027 var wr16h = w[(i-
16) *
2];
33028 var wr16l = w[(i-
16) *
2 +
1];
33030 // W(round) = gamma0 + W(round -
7) + gamma1 + W(round -
16)
33031 wrl = gamma0l + wr7l;
33032 wrh = gamma0h + wr7h + ((wrl
>>> 0) < (gamma0l
>>> 0) ?
1 :
0);
33034 wrh += gamma1h + ((wrl
>>> 0) < (gamma1l
>>> 0) ?
1 :
0);
33036 wrh += wr16h + ((wrl
>>> 0) < (wr16l
>>> 0) ?
1 :
0);
33040 w[i*
2 +
1] = wrl |=
0;
33043 var chh = (eh & fh) ^ (~eh & gh);
33044 var chl = (el & fl) ^ (~el & gl);
33047 var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
33048 var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
33051 var sigma0h = ((al <<
4) | (ah
>>> 28)) ^ ((ah <<
30) | (al
>>> 2)) ^ ((ah <<
25) | (al
>>> 7));
33052 var sigma0l = ((ah <<
4) | (al
>>> 28)) ^ ((al <<
30) | (ah
>>> 2)) ^ ((al <<
25) | (ah
>>> 7));
33055 var sigma1h = ((el <<
18) | (eh
>>> 14)) ^ ((el <<
14) | (eh
>>> 18)) ^ ((eh <<
23) | (el
>>> 9));
33056 var sigma1l = ((eh <<
18) | (el
>>> 14)) ^ ((eh <<
14) | (el
>>> 18)) ^ ((el <<
23) | (eh
>>> 9));
33060 var krl = k[i*
2+
1];
33062 // t1 = h + sigma1 + ch + K(round) + W(round)
33063 var t1l = hl + sigma1l;
33064 var t1h = hh + sigma1h + ((t1l
>>> 0) < (hl
>>> 0) ?
1 :
0);
33066 t1h += chh + ((t1l
>>> 0) < (chl
>>> 0) ?
1 :
0);
33068 t1h += krh + ((t1l
>>> 0) < (krl
>>> 0) ?
1 :
0);
33069 t1l = t1l + wrl|
0; // FF32..FF34 perf issue https://bugzilla.mozilla.org/show_bug.cgi?id=
1054972
33070 t1h += wrh + ((t1l
>>> 0) < (wrl
>>> 0) ?
1 :
0);
33072 // t2 = sigma0 + maj
33073 var t2l = sigma0l + majl;
33074 var t2h = sigma0h + majh + ((t2l
>>> 0) < (sigma0l
>>> 0) ?
1 :
0);
33076 // Update working variables
33083 el = (dl + t1l) |
0;
33084 eh = (dh + t1h + ((el
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
33091 al = (t1l + t2l) |
0;
33092 ah = (t1h + t2h + ((al
>>> 0) < (t1l
>>> 0) ?
1 :
0)) |
0;
33095 // Intermediate hash
33096 h0l = h[
1] = (h0l + al) |
0;
33097 h[
0] = (h0h + ah + ((h0l
>>> 0) < (al
>>> 0) ?
1 :
0)) |
0;
33098 h1l = h[
3] = (h1l + bl) |
0;
33099 h[
2] = (h1h + bh + ((h1l
>>> 0) < (bl
>>> 0) ?
1 :
0)) |
0;
33100 h2l = h[
5] = (h2l + cl) |
0;
33101 h[
4] = (h2h + ch + ((h2l
>>> 0) < (cl
>>> 0) ?
1 :
0)) |
0;
33102 h3l = h[
7] = (h3l + dl) |
0;
33103 h[
6] = (h3h + dh + ((h3l
>>> 0) < (dl
>>> 0) ?
1 :
0)) |
0;
33104 h4l = h[
9] = (h4l + el) |
0;
33105 h[
8] = (h4h + eh + ((h4l
>>> 0) < (el
>>> 0) ?
1 :
0)) |
0;
33106 h5l = h[
11] = (h5l + fl) |
0;
33107 h[
10] = (h5h + fh + ((h5l
>>> 0) < (fl
>>> 0) ?
1 :
0)) |
0;
33108 h6l = h[
13] = (h6l + gl) |
0;
33109 h[
12] = (h6h + gh + ((h6l
>>> 0) < (gl
>>> 0) ?
1 :
0)) |
0;
33110 h7l = h[
15] = (h7l + hl) |
0;
33111 h[
14] = (h7h + hh + ((h7l
>>> 0) < (hl
>>> 0) ?
1 :
0)) |
0;
33118 /** @fileOverview HMAC implementation.
33120 * @author Emily Stark
33121 * @author Mike Hamburg
33122 * @author Dan Boneh
33125 /** HMAC with the specified hash function.
33127 * @param {bitArray} key the key for HMAC.
33128 * @param {Object} [hash=sjcl.hash.sha256] The hash function to use.
33130 sjcl.misc.hmac = function (key, Hash) {
33131 this._hash = Hash = Hash || sjcl.hash.sha256;
33132 var exKey = [[],[]], i,
33133 bs = Hash.prototype.blockSize /
32;
33134 this._baseHash = [new Hash(), new Hash()];
33136 if (key.length
> bs) {
33137 key = Hash.hash(key);
33140 for (i=
0; i
<bs; i++) {
33141 exKey[
0][i] = key[i]^
0x36363636;
33142 exKey[
1][i] = key[i]^
0x5C5C5C5C;
33145 this._baseHash[
0].update(exKey[
0]);
33146 this._baseHash[
1].update(exKey[
1]);
33147 this._resultHash = new Hash(this._baseHash[
0]);
33150 /** HMAC with the specified hash function. Also called encrypt since it's a prf.
33151 * @param {bitArray|String} data The data to mac.
33153 sjcl.misc.hmac.prototype.encrypt = sjcl.misc.hmac.prototype.mac = function (data) {
33154 if (!this._updated) {
33156 return this.digest(data);
33158 throw new sjcl.exception.invalid(
"encrypt on already updated hmac called!");
33162 sjcl.misc.hmac.prototype.reset = function () {
33163 this._resultHash = new this._hash(this._baseHash[
0]);
33164 this._updated = false;
33167 sjcl.misc.hmac.prototype.update = function (data) {
33168 this._updated = true;
33169 this._resultHash.update(data);
33172 sjcl.misc.hmac.prototype.digest = function () {
33173 var w = this._resultHash.finalize(), result = new (this._hash)(this._baseHash[
1]).update(w).finalize();
33184 /** @fileOverview Password-based key-derivation function, version
2.0.
33186 * @author Emily Stark
33187 * @author Mike Hamburg
33188 * @author Dan Boneh
33191 /** Password-Based Key-Derivation Function, version
2.0.
33193 * Generate keys from passwords using PBKDF2-HMAC-SHA256.
33195 * This is the method specified by RSA's PKCS #
5 standard.
33197 * @param {bitArray|String} password The password.
33198 * @param {bitArray|String} salt The salt. Should have lots of entropy.
33199 * @param {Number} [count=
1000] The number of iterations. Higher numbers make the function slower but more secure.
33200 * @param {Number} [length] The length of the derived key. Defaults to the
33201 output size of the hash function.
33202 * @param {Object} [Prff=sjcl.misc.hmac] The pseudorandom function family.
33203 * @return {bitArray} the derived key.
33205 sjcl.misc.pbkdf2 = function (password, salt, count, length, Prff) {
33206 count = count ||
1000;
33208 if (length <
0 || count <
0) {
33209 throw sjcl.exception.invalid(
"invalid params to pbkdf2");
33212 if (typeof password ===
"string") {
33213 password = sjcl.codec.utf8String.toBits(password);
33216 if (typeof salt ===
"string") {
33217 salt = sjcl.codec.utf8String.toBits(salt);
33220 Prff = Prff || sjcl.misc.hmac;
33222 var prf = new Prff(password),
33223 u, ui, i, j, k, out = [], b = sjcl.bitArray;
33225 for (k =
1;
32 * out.length < (length ||
1); k++) {
33226 u = ui = prf.encrypt(b.concat(salt,[k]));
33228 for (i=
1; i
<count; i++) {
33229 ui = prf.encrypt(ui);
33230 for (j=
0; j
<ui.length; j++) {
33235 out = out.concat(u);
33238 if (length) { out = b.clamp(out, length); }
33246 /** @fileOverview Javascript SHA-
256 implementation.
33248 * An older version of this implementation is available in the public
33249 * domain, but this one is (c) Emily Stark, Mike Hamburg, Dan Boneh,
33250 * Stanford University
2008-
2010 and BSD-licensed for liability
33253 * Special thanks to Aldo Cortesi for pointing out several bugs in
33256 * @author Emily Stark
33257 * @author Mike Hamburg
33258 * @author Dan Boneh
33262 * Context for a SHA-
256 operation in progress.
33264 * @class Secure Hash Algorithm,
256 bits.
33266 sjcl.hash.sha256 = function (hash) {
33267 if (!this._key[
0]) { this._precompute(); }
33269 this._h = hash._h.slice(
0);
33270 this._buffer = hash._buffer.slice(
0);
33271 this._length = hash._length;
33278 * Hash a string or an array of words.
33280 * @param {bitArray|String} data the data to hash.
33281 * @return {bitArray} The hash value, an array of
16 big-endian words.
33283 sjcl.hash.sha256.hash = function (data) {
33284 return (new sjcl.hash.sha256()).update(data).finalize();
33287 sjcl.hash.sha256.prototype = {
33289 * The hash's block size, in bits.
33295 * Reset the hash state.
33298 reset:function () {
33299 this._h = this._init.slice(
0);
33306 * Input several words to the hash.
33307 * @param {bitArray|String} data the data to hash.
33310 update: function (data) {
33311 if (typeof data ===
"string") {
33312 data = sjcl.codec.utf8String.toBits(data);
33314 var i, b = this._buffer = sjcl.bitArray.concat(this._buffer, data),
33316 nl = this._length = ol + sjcl.bitArray.bitLength(data);
33317 for (i =
512+ol & -
512; i <= nl; i+=
512) {
33318 this._block(b.splice(
0,
16));
33324 * Complete hashing and output the hash value.
33325 * @return {bitArray} The hash value, an array of
8 big-endian words.
33327 finalize:function () {
33328 var i, b = this._buffer, h = this._h;
33330 // Round out and push the buffer
33331 b = sjcl.bitArray.concat(b, [sjcl.bitArray.partial(
1,
1)]);
33333 // Round out the buffer to a multiple of
16 words, less the
2 length words.
33334 for (i = b.length +
2; i &
15; i++) {
33338 // append the length
33339 b.push(Math.floor(this._length /
0x100000000));
33340 b.push(this._length |
0);
33343 this._block(b.splice(
0,
16));
33351 * The SHA-
256 initialization vector, to be precomputed.
33356 _init:[
0x6a09e667,
0xbb67ae85,
0x3c6ef372,
0xa54ff53a,
0x510e527f,
0x9b05688c,
0x1f83d9ab,
0x5be0cd19],
33360 * The SHA-
256 hash key, to be precomputed.
33366 [
0x428a2f98,
0x71374491,
0xb5c0fbcf,
0xe9b5dba5,
0x3956c25b,
0x59f111f1,
0x923f82a4,
0xab1c5ed5,
33367 0xd807aa98,
0x12835b01,
0x243185be,
0x550c7dc3,
0x72be5d74,
0x80deb1fe,
0x9bdc06a7,
0xc19bf174,
33368 0xe49b69c1,
0xefbe4786,
0x0fc19dc6,
0x240ca1cc,
0x2de92c6f,
0x4a7484aa,
0x5cb0a9dc,
0x76f988da,
33369 0x983e5152,
0xa831c66d,
0xb00327c8,
0xbf597fc7,
0xc6e00bf3,
0xd5a79147,
0x06ca6351,
0x14292967,
33370 0x27b70a85,
0x2e1b2138,
0x4d2c6dfc,
0x53380d13,
0x650a7354,
0x766a0abb,
0x81c2c92e,
0x92722c85,
33371 0xa2bfe8a1,
0xa81a664b,
0xc24b8b70,
0xc76c51a3,
0xd192e819,
0xd6990624,
0xf40e3585,
0x106aa070,
33372 0x19a4c116,
0x1e376c08,
0x2748774c,
0x34b0bcb5,
0x391c0cb3,
0x4ed8aa4a,
0x5b9cca4f,
0x682e6ff3,
33373 0x748f82ee,
0x78a5636f,
0x84c87814,
0x8cc70208,
0x90befffa,
0xa4506ceb,
0xbef9a3f7,
0xc67178f2],
33378 * Function to precompute _init and _key.
33381 _precompute: function () {
33382 var i =
0, prime =
2, factor;
33384 function frac(x) { return (x-Math.floor(x)) *
0x100000000 |
0; }
33386 outer: for (; i
<64; prime++) {
33387 for (factor=
2; factor*factor <= prime; factor++) {
33388 if (prime % factor ===
0) {
33395 this._init[i] = frac(Math.pow(prime,
1/
2));
33397 this._key[i] = frac(Math.pow(prime,
1/
3));
33403 * Perform one cycle of SHA-
256.
33404 * @param {bitArray} words one block of words.
33407 _block:function (words) {
33409 w = words.slice(
0),
33412 h0 = h[
0], h1 = h[
1], h2 = h[
2], h3 = h[
3],
33413 h4 = h[
4], h5 = h[
5], h6 = h[
6], h7 = h[
7];
33415 /* Rationale for placement of |
0 :
33416 * If a value can overflow is original
32 bits by a factor of more than a few
33417 * million (
2^
23 ish), there is a possibility that it might overflow the
33418 *
53-bit mantissa and lose precision.
33420 * To avoid this, we clamp back to
32 bits by |'ing with
0 on any value that
33421 * propagates around the loop, and on the hash state h[]. I don't believe
33422 * that the clamps on h4 and on h0 are strictly necessary, but it's close
33423 * (for h4 anyway), and better safe than sorry.
33425 * The clamps on h[] are necessary for the output to be correct even in the
33426 * common case and for short inputs.
33428 for (i=
0; i
<64; i++) {
33429 // load up the input word for this round
33433 a = w[(i+
1 ) &
15];
33434 b = w[(i+
14) &
15];
33435 tmp = w[i&
15] = ((a
>>>7 ^ a
>>>18 ^ a
>>>3 ^ a<
<25 ^ a<
<14) +
33436 (b
>>>17 ^ b
>>>19 ^ b
>>>10 ^ b<
<15 ^ b<
<13) +
33437 w[i&
15] + w[(i+
9) &
15]) |
0;
33440 tmp = (tmp + h7 + (h4
>>>6 ^ h4
>>>11 ^ h4
>>>25 ^ h4<
<26 ^ h4<
<21 ^ h4<
<7) + (h6 ^ h4&(h5^h6)) + k[i]); // |
0;
33443 h7 = h6; h6 = h5; h5 = h4;
33445 h3 = h2; h2 = h1; h1 = h0;
33447 h0 = (tmp + ((h1&h2) ^ (h3&(h1^h2))) + (h1
>>>2 ^ h1
>>>13 ^ h1
>>>22 ^ h1<
<30 ^ h1<
<19 ^ h1<
<10)) |
0;
33450 h[
0] = h[
0]+h0 |
0;
33451 h[
1] = h[
1]+h1 |
0;
33452 h[
2] = h[
2]+h2 |
0;
33453 h[
3] = h[
3]+h3 |
0;
33454 h[
4] = h[
4]+h4 |
0;
33455 h[
5] = h[
5]+h5 |
0;
33456 h[
6] = h[
6]+h6 |
0;
33457 h[
7] = h[
7]+h7 |
0;
33462 WORDLISTS = typeof WORDLISTS == "undefined" ? {} : WORDLISTS;
33463 WORDLISTS["english"] = [
33464 "abandon","ability","able","about","above","absent","absorb","abstract","absurd","abuse",
33465 "access","accident","account","accuse","achieve","acid","acoustic","acquire","across","act",
33466 "action","actor","actress","actual","adapt","add","addict","address","adjust","admit",
33467 "adult","advance","advice","aerobic","affair","afford","afraid","again","age","agent",
33468 "agree","ahead","aim","air","airport","aisle","alarm","album","alcohol","alert",
33469 "alien","all","alley","allow","almost","alone","alpha","already","also","alter",
33470 "always","amateur","amazing","among","amount","amused","analyst","anchor","ancient","anger",
33471 "angle","angry","animal","ankle","announce","annual","another","answer","antenna","antique",
33472 "anxiety","any","apart","apology","appear","apple","approve","april","arch","arctic",
33473 "area","arena","argue","arm","armed","armor","army","around","arrange","arrest",
33474 "arrive","arrow","art","artefact","artist","artwork","ask","aspect","assault","asset",
33475 "assist","assume","asthma","athlete","atom","attack","attend","attitude","attract","auction",
33476 "audit","august","aunt","author","auto","autumn","average","avocado","avoid","awake",
33477 "aware","away","awesome","awful","awkward","axis","baby","bachelor","bacon","badge",
33478 "bag","balance","balcony","ball","bamboo","banana","banner","bar","barely","bargain",
33479 "barrel","base","basic","basket","battle","beach","bean","beauty","because","become",
33480 "beef","before","begin","behave","behind","believe","below","belt","bench","benefit",
33481 "best","betray","better","between","beyond","bicycle","bid","bike","bind","biology",
33482 "bird","birth","bitter","black","blade","blame","blanket","blast","bleak","bless",
33483 "blind","blood","blossom","blouse","blue","blur","blush","board","boat","body",
33484 "boil","bomb","bone","bonus","book","boost","border","boring","borrow","boss",
33485 "bottom","bounce","box","boy","bracket","brain","brand","brass","brave","bread",
33486 "breeze","brick","bridge","brief","bright","bring","brisk","broccoli","broken","bronze",
33487 "broom","brother","brown","brush","bubble","buddy","budget","buffalo","build","bulb",
33488 "bulk","bullet","bundle","bunker","burden","burger","burst","bus","business","busy",
33489 "butter","buyer","buzz","cabbage","cabin","cable","cactus","cage","cake","call",
33490 "calm","camera","camp","can","canal","cancel","candy","cannon","canoe","canvas",
33491 "canyon","capable","capital","captain","car","carbon","card","cargo","carpet","carry",
33492 "cart","case","cash","casino","castle","casual","cat","catalog","catch","category",
33493 "cattle","caught","cause","caution","cave","ceiling","celery","cement","census","century",
33494 "cereal","certain","chair","chalk","champion","change","chaos","chapter","charge","chase",
33495 "chat","cheap","check","cheese","chef","cherry","chest","chicken","chief","child",
33496 "chimney","choice","choose","chronic","chuckle","chunk","churn","cigar","cinnamon","circle",
33497 "citizen","city","civil","claim","clap","clarify","claw","clay","clean","clerk",
33498 "clever","click","client","cliff","climb","clinic","clip","clock","clog","close",
33499 "cloth","cloud","clown","club","clump","cluster","clutch","coach","coast","coconut",
33500 "code","coffee","coil","coin","collect","color","column","combine","come","comfort",
33501 "comic","common","company","concert","conduct","confirm","congress","connect","consider","control",
33502 "convince","cook","cool","copper","copy","coral","core","corn","correct","cost",
33503 "cotton","couch","country","couple","course","cousin","cover","coyote","crack","cradle",
33504 "craft","cram","crane","crash","crater","crawl","crazy","cream","credit","creek",
33505 "crew","cricket","crime","crisp","critic","crop","cross","crouch","crowd","crucial",
33506 "cruel","cruise","crumble","crunch","crush","cry","crystal","cube","culture","cup",
33507 "cupboard","curious","current","curtain","curve","cushion","custom","cute","cycle","dad",
33508 "damage","damp","dance","danger","daring","dash","daughter","dawn","day","deal",
33509 "debate","debris","decade","december","decide","decline","decorate","decrease","deer","defense",
33510 "define","defy","degree","delay","deliver","demand","demise","denial","dentist","deny",
33511 "depart","depend","deposit","depth","deputy","derive","describe","desert","design","desk",
33512 "despair","destroy","detail","detect","develop","device","devote","diagram","dial","diamond",
33513 "diary","dice","diesel","diet","differ","digital","dignity","dilemma","dinner","dinosaur",
33514 "direct","dirt","disagree","discover","disease","dish","dismiss","disorder","display","distance",
33515 "divert","divide","divorce","dizzy","doctor","document","dog","doll","dolphin","domain",
33516 "donate","donkey","donor","door","dose","double","dove","draft","dragon","drama",
33517 "drastic","draw","dream","dress","drift","drill","drink","drip","drive","drop",
33518 "drum","dry","duck","dumb","dune","during","dust","dutch","duty","dwarf",
33519 "dynamic","eager","eagle","early","earn","earth","easily","east","easy","echo",
33520 "ecology","economy","edge","edit","educate","effort","egg","eight","either","elbow",
33521 "elder","electric","elegant","element","elephant","elevator","elite","else","embark","embody",
33522 "embrace","emerge","emotion","employ","empower","empty","enable","enact","end","endless",
33523 "endorse","enemy","energy","enforce","engage","engine","enhance","enjoy","enlist","enough",
33524 "enrich","enroll","ensure","enter","entire","entry","envelope","episode","equal","equip",
33525 "era","erase","erode","erosion","error","erupt","escape","essay","essence","estate",
33526 "eternal","ethics","evidence","evil","evoke","evolve","exact","example","excess","exchange",
33527 "excite","exclude","excuse","execute","exercise","exhaust","exhibit","exile","exist","exit",
33528 "exotic","expand","expect","expire","explain","expose","express","extend","extra","eye",
33529 "eyebrow","fabric","face","faculty","fade","faint","faith","fall","false","fame",
33530 "family","famous","fan","fancy","fantasy","farm","fashion","fat","fatal","father",
33531 "fatigue","fault","favorite","feature","february","federal","fee","feed","feel","female",
33532 "fence","festival","fetch","fever","few","fiber","fiction","field","figure","file",
33533 "film","filter","final","find","fine","finger","finish","fire","firm","first",
33534 "fiscal","fish","fit","fitness","fix","flag","flame","flash","flat","flavor",
33535 "flee","flight","flip","float","flock","floor","flower","fluid","flush","fly",
33536 "foam","focus","fog","foil","fold","follow","food","foot","force","forest",
33537 "forget","fork","fortune","forum","forward","fossil","foster","found","fox","fragile",
33538 "frame","frequent","fresh","friend","fringe","frog","front","frost","frown","frozen",
33539 "fruit","fuel","fun","funny","furnace","fury","future","gadget","gain","galaxy",
33540 "gallery","game","gap","garage","garbage","garden","garlic","garment","gas","gasp",
33541 "gate","gather","gauge","gaze","general","genius","genre","gentle","genuine","gesture",
33542 "ghost","giant","gift","giggle","ginger","giraffe","girl","give","glad","glance",
33543 "glare","glass","glide","glimpse","globe","gloom","glory","glove","glow","glue",
33544 "goat","goddess","gold","good","goose","gorilla","gospel","gossip","govern","gown",
33545 "grab","grace","grain","grant","grape","grass","gravity","great","green","grid",
33546 "grief","grit","grocery","group","grow","grunt","guard","guess","guide","guilt",
33547 "guitar","gun","gym","habit","hair","half","hammer","hamster","hand","happy",
33548 "harbor","hard","harsh","harvest","hat","have","hawk","hazard","head","health",
33549 "heart","heavy","hedgehog","height","hello","helmet","help","hen","hero","hidden",
33550 "high","hill","hint","hip","hire","history","hobby","hockey","hold","hole",
33551 "holiday","hollow","home","honey","hood","hope","horn","horror","horse","hospital",
33552 "host","hotel","hour","hover","hub","huge","human","humble","humor","hundred",
33553 "hungry","hunt","hurdle","hurry","hurt","husband","hybrid","ice","icon","idea",
33554 "identify","idle","ignore","ill","illegal","illness","image","imitate","immense","immune",
33555 "impact","impose","improve","impulse","inch","include","income","increase","index","indicate",
33556 "indoor","industry","infant","inflict","inform","inhale","inherit","initial","inject","injury",
33557 "inmate","inner","innocent","input","inquiry","insane","insect","inside","inspire","install",
33558 "intact","interest","into","invest","invite","involve","iron","island","isolate","issue",
33559 "item","ivory","jacket","jaguar","jar","jazz","jealous","jeans","jelly","jewel",
33560 "job","join","joke","journey","joy","judge","juice","jump","jungle","junior",
33561 "junk","just","kangaroo","keen","keep","ketchup","key","kick","kid","kidney",
33562 "kind","kingdom","kiss","kit","kitchen","kite","kitten","kiwi","knee","knife",
33563 "knock","know","lab","label","labor","ladder","lady","lake","lamp","language",
33564 "laptop","large","later","latin","laugh","laundry","lava","law","lawn","lawsuit",
33565 "layer","lazy","leader","leaf","learn","leave","lecture","left","leg","legal",
33566 "legend","leisure","lemon","lend","length","lens","leopard","lesson","letter","level",
33567 "liar","liberty","library","license","life","lift","light","like","limb","limit",
33568 "link","lion","liquid","list","little","live","lizard","load","loan","lobster",
33569 "local","lock","logic","lonely","long","loop","lottery","loud","lounge","love",
33570 "loyal","lucky","luggage","lumber","lunar","lunch","luxury","lyrics","machine","mad",
33571 "magic","magnet","maid","mail","main","major","make","mammal","man","manage",
33572 "mandate","mango","mansion","manual","maple","marble","march","margin","marine","market",
33573 "marriage","mask","mass","master","match","material","math","matrix","matter","maximum",
33574 "maze","meadow","mean","measure","meat","mechanic","medal","media","melody","melt",
33575 "member","memory","mention","menu","mercy","merge","merit","merry","mesh","message",
33576 "metal","method","middle","midnight","milk","million","mimic","mind","minimum","minor",
33577 "minute","miracle","mirror","misery","miss","mistake","mix","mixed","mixture","mobile",
33578 "model","modify","mom","moment","monitor","monkey","monster","month","moon","moral",
33579 "more","morning","mosquito","mother","motion","motor","mountain","mouse","move","movie",
33580 "much","muffin","mule","multiply","muscle","museum","mushroom","music","must","mutual",
33581 "myself","mystery","myth","naive","name","napkin","narrow","nasty","nation","nature",
33582 "near","neck","need","negative","neglect","neither","nephew","nerve","nest","net",
33583 "network","neutral","never","news","next","nice","night","noble","noise","nominee",
33584 "noodle","normal","north","nose","notable","note","nothing","notice","novel","now",
33585 "nuclear","number","nurse","nut","oak","obey","object","oblige","obscure","observe",
33586 "obtain","obvious","occur","ocean","october","odor","off","offer","office","often",
33587 "oil","okay","old","olive","olympic","omit","once","one","onion","online",
33588 "only","open","opera","opinion","oppose","option","orange","orbit","orchard","order",
33589 "ordinary","organ","orient","original","orphan","ostrich","other","outdoor","outer","output",
33590 "outside","oval","oven","over","own","owner","oxygen","oyster","ozone","pact",
33591 "paddle","page","pair","palace","palm","panda","panel","panic","panther","paper",
33592 "parade","parent","park","parrot","party","pass","patch","path","patient","patrol",
33593 "pattern","pause","pave","payment","peace","peanut","pear","peasant","pelican","pen",
33594 "penalty","pencil","people","pepper","perfect","permit","person","pet","phone","photo",
33595 "phrase","physical","piano","picnic","picture","piece","pig","pigeon","pill","pilot",
33596 "pink","pioneer","pipe","pistol","pitch","pizza","place","planet","plastic","plate",
33597 "play","please","pledge","pluck","plug","plunge","poem","poet","point","polar",
33598 "pole","police","pond","pony","pool","popular","portion","position","possible","post",
33599 "potato","pottery","poverty","powder","power","practice","praise","predict","prefer","prepare",
33600 "present","pretty","prevent","price","pride","primary","print","priority","prison","private",
33601 "prize","problem","process","produce","profit","program","project","promote","proof","property",
33602 "prosper","protect","proud","provide","public","pudding","pull","pulp","pulse","pumpkin",
33603 "punch","pupil","puppy","purchase","purity","purpose","purse","push","put","puzzle",
33604 "pyramid","quality","quantum","quarter","question","quick","quit","quiz","quote","rabbit",
33605 "raccoon","race","rack","radar","radio","rail","rain","raise","rally","ramp",
33606 "ranch","random","range","rapid","rare","rate","rather","raven","raw","razor",
33607 "ready","real","reason","rebel","rebuild","recall","receive","recipe","record","recycle",
33608 "reduce","reflect","reform","refuse","region","regret","regular","reject","relax","release",
33609 "relief","rely","remain","remember","remind","remove","render","renew","rent","reopen",
33610 "repair","repeat","replace","report","require","rescue","resemble","resist","resource","response",
33611 "result","retire","retreat","return","reunion","reveal","review","reward","rhythm","rib",
33612 "ribbon","rice","rich","ride","ridge","rifle","right","rigid","ring","riot",
33613 "ripple","risk","ritual","rival","river","road","roast","robot","robust","rocket",
33614 "romance","roof","rookie","room","rose","rotate","rough","round","route","royal",
33615 "rubber","rude","rug","rule","run","runway","rural","sad","saddle","sadness",
33616 "safe","sail","salad","salmon","salon","salt","salute","same","sample","sand",
33617 "satisfy","satoshi","sauce","sausage","save","say","scale","scan","scare","scatter",
33618 "scene","scheme","school","science","scissors","scorpion","scout","scrap","screen","script",
33619 "scrub","sea","search","season","seat","second","secret","section","security","seed",
33620 "seek","segment","select","sell","seminar","senior","sense","sentence","series","service",
33621 "session","settle","setup","seven","shadow","shaft","shallow","share","shed","shell",
33622 "sheriff","shield","shift","shine","ship","shiver","shock","shoe","shoot","shop",
33623 "short","shoulder","shove","shrimp","shrug","shuffle","shy","sibling","sick","side",
33624 "siege","sight","sign","silent","silk","silly","silver","similar","simple","since",
33625 "sing","siren","sister","situate","six","size","skate","sketch","ski","skill",
33626 "skin","skirt","skull","slab","slam","sleep","slender","slice","slide","slight",
33627 "slim","slogan","slot","slow","slush","small","smart","smile","smoke","smooth",
33628 "snack","snake","snap","sniff","snow","soap","soccer","social","sock","soda",
33629 "soft","solar","soldier","solid","solution","solve","someone","song","soon","sorry",
33630 "sort","soul","sound","soup","source","south","space","spare","spatial","spawn",
33631 "speak","special","speed","spell","spend","sphere","spice","spider","spike","spin",
33632 "spirit","split","spoil","sponsor","spoon","sport","spot","spray","spread","spring",
33633 "spy","square","squeeze","squirrel","stable","stadium","staff","stage","stairs","stamp",
33634 "stand","start","state","stay","steak","steel","stem","step","stereo","stick",
33635 "still","sting","stock","stomach","stone","stool","story","stove","strategy","street",
33636 "strike","strong","struggle","student","stuff","stumble","style","subject","submit","subway",
33637 "success","such","sudden","suffer","sugar","suggest","suit","summer","sun","sunny",
33638 "sunset","super","supply","supreme","sure","surface","surge","surprise","surround","survey",
33639 "suspect","sustain","swallow","swamp","swap","swarm","swear","sweet","swift","swim",
33640 "swing","switch","sword","symbol","symptom","syrup","system","table","tackle","tag",
33641 "tail","talent","talk","tank","tape","target","task","taste","tattoo","taxi",
33642 "teach","team","tell","ten","tenant","tennis","tent","term","test","text",
33643 "thank","that","theme","then","theory","there","they","thing","this","thought",
33644 "three","thrive","throw","thumb","thunder","ticket","tide","tiger","tilt","timber",
33645 "time","tiny","tip","tired","tissue","title","toast","tobacco","today","toddler",
33646 "toe","together","toilet","token","tomato","tomorrow","tone","tongue","tonight","tool",
33647 "tooth","top","topic","topple","torch","tornado","tortoise","toss","total","tourist",
33648 "toward","tower","town","toy","track","trade","traffic","tragic","train","transfer",
33649 "trap","trash","travel","tray","treat","tree","trend","trial","tribe","trick",
33650 "trigger","trim","trip","trophy","trouble","truck","true","truly","trumpet","trust",
33651 "truth","try","tube","tuition","tumble","tuna","tunnel","turkey","turn","turtle",
33652 "twelve","twenty","twice","twin","twist","two","type","typical","ugly","umbrella",
33653 "unable","unaware","uncle","uncover","under","undo","unfair","unfold","unhappy","uniform",
33654 "unique","unit","universe","unknown","unlock","until","unusual","unveil","update","upgrade",
33655 "uphold","upon","upper","upset","urban","urge","usage","use","used","useful",
33656 "useless","usual","utility","vacant","vacuum","vague","valid","valley","valve","van",
33657 "vanish","vapor","various","vast","vault","vehicle","velvet","vendor","venture","venue",
33658 "verb","verify","version","very","vessel","veteran","viable","vibrant","vicious","victory",
33659 "video","view","village","vintage","violin","virtual","virus","visa","visit","visual",
33660 "vital","vivid","vocal","voice","void","volcano","volume","vote","voyage","wage",
33661 "wagon","wait","walk","wall","walnut","want","warfare","warm","warrior","wash",
33662 "wasp","waste","water","wave","way","wealth","weapon","wear","weasel","weather",
33663 "web","wedding","weekend","weird","welcome","west","wet","whale","what","wheat",
33664 "wheel","when","where","whip","whisper","wide","width","wife","wild","will",
33665 "win","window","wine","wing","wink","winner","winter","wire","wisdom","wise",
33666 "wish","witness","wolf","woman","wonder","wood","wool","word","work","world",
33667 "worry","worth","wrap","wreck","wrestle","wrist","write","wrong","yard","year",
33668 "yellow","you","young","youth","zebra","zero","zone","zoo"]
33672 * Copyright (c)
2013 Pavol Rusnak
33674 * Permission is hereby granted, free of charge, to any person obtaining a copy of
33675 * this software and associated documentation files (the "Software"), to deal in
33676 * the Software without restriction, including without limitation the rights to
33677 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
33678 * of the Software, and to permit persons to whom the Software is furnished to do
33679 * so, subject to the following conditions:
33681 * The above copyright notice and this permission notice shall be included in all
33682 * copies or substantial portions of the Software.
33684 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33685 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
33686 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
33687 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
33688 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
33689 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33693 * Javascript port from python by Ian Coleman
33695 * Requires code from sjcl
33696 * https://github.com/bitwiseshiftleft/sjcl
33699 var Mnemonic = function(language) {
33701 var PBKDF2_ROUNDS =
2048;
33707 var hmacSHA512 = function(key) {
33708 var hasher = new sjcl.misc.hmac(key, sjcl.hash.sha512);
33709 this.encrypt = function() {
33710 return hasher.encrypt.apply(hasher, arguments);
33715 wordlist = WORDLISTS[language];
33716 if (wordlist.length != RADIX) {
33717 err = 'Wordlist should contain ' + RADIX + ' words, but it contains ' + wordlist.length + ' words.';
33722 self.generate = function(strength) {
33723 strength = strength ||
128;
33724 var r = strength %
32;
33726 throw 'Strength should be divisible by
32, but it is not (' + r + ').';
33728 var hasStrongCrypto = 'crypto' in window && window['crypto'] !== null;
33729 if (!hasStrongCrypto) {
33730 throw 'Mnemonic should be generated with strong randomness, but crypto.getRandomValues is unavailable';
33732 var buffer = new Uint8Array(strength /
8);
33733 var data = crypto.getRandomValues(buffer);
33734 return self.toMnemonic(data);
33737 self.toMnemonic = function(byteArray) {
33738 if (byteArray.length %
4 > 0) {
33739 throw 'Data length in bits should be divisible by
32, but it is not (' + byteArray.length + ' bytes = ' + byteArray.length*
8 + ' bits).'
33742 //h = hashlib.sha256(data).hexdigest()
33743 var data = byteArrayToWordArray(byteArray);
33744 var hash = sjcl.hash.sha256.hash(data);
33745 var h = sjcl.codec.hex.fromBits(hash);
33747 // b is a binary string, eg '
00111010101100...'
33748 //b = bin(int(binascii.hexlify(data),
16))[
2:].zfill(len(data) *
8) + \
33749 // bin(int(h,
16))[
2:].zfill(
256)[:len(data) *
8 /
32]
33751 // a = bin(int(binascii.hexlify(data),
16))[
2:].zfill(len(data) *
8)
33752 // c = bin(int(h,
16))[
2:].zfill(
256)
33753 // d = c[:len(data) *
8 /
32]
33754 var a = byteArrayToBinaryString(byteArray);
33755 var c = zfill(hexStringToBinaryString(h),
256);
33756 var d = c.substring(
0, byteArray.length *
8 /
32);
33757 // b = line1 + line2
33761 var blen = b.length /
11;
33762 for (var i=
0; i
<blen; i++) {
33763 var idx = parseInt(b.substring(i *
11, (i +
1) *
11),
2);
33764 result.push(wordlist[idx]);
33766 return result.join(' ');
33769 self.check = function(mnemonic) {
33770 var mnemonic = mnemonic.split(' ')
33771 if (mnemonic.length %
3 > 0) {
33774 // idx = map(lambda x: bin(self.wordlist.index(x))[
2:].zfill(
11), mnemonic)
33776 for (var i=
0; i
<mnemonic.length; i++) {
33777 var word = mnemonic[i];
33778 var wordIndex = wordlist.indexOf(word);
33779 if (wordIndex == -
1) {
33782 var binaryIndex = zfill(wordIndex.toString(
2),
11);
33783 idx.push(binaryIndex);
33785 var b = idx.join('');
33787 //d = b[:l /
33 *
32]
33789 var d = b.substring(
0, l /
33 *
32);
33790 var h = b.substring(l - l /
33, l);
33791 //nd = binascii.unhexlify(hex(int(d,
2))[
2:].rstrip('L').zfill(l /
33 *
8))
33792 var nd = binaryStringToWordArray(d);
33793 //nh = bin(int(hashlib.sha256(nd).hexdigest(),
16))[
2:].zfill(
256)[:l /
33]
33794 var ndHash = sjcl.hash.sha256.hash(nd);
33795 var ndHex = sjcl.codec.hex.fromBits(ndHash);
33796 var ndBstr = zfill(hexStringToBinaryString(ndHex),
256);
33797 var nh = ndBstr.substring(
0,l/
33);
33801 self.toSeed = function(mnemonic, passphrase) {
33802 passphrase = passphrase || '';
33803 mnemonic = self.normalizeString(mnemonic)
33804 passphrase = self.normalizeString(passphrase)
33805 passphrase =
"mnemonic" + passphrase;
33806 var mnemonicBits = sjcl.codec.utf8String.toBits(mnemonic);
33807 var passphraseBits = sjcl.codec.utf8String.toBits(passphrase);
33808 var result = sjcl.misc.pbkdf2(mnemonicBits, passphraseBits, PBKDF2_ROUNDS,
512, hmacSHA512);
33809 var hashHex = sjcl.codec.hex.fromBits(result);
33813 self.normalizeString = function(str) {
33814 if (typeof str.normalize ==
"function") {
33815 return str.normalize(
"NFKD");
33818 // TODO decide how to handle this in the future.
33819 // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/normalize
33824 function byteArrayToWordArray(data) {
33826 for (var i=
0; i
<data.length/
4; i++) {
33828 v += data[i*
4 +
0] <<
8 *
3;
33829 v += data[i*
4 +
1] <<
8 *
2;
33830 v += data[i*
4 +
2] <<
8 *
1;
33831 v += data[i*
4 +
3] <<
8 *
0;
33837 function byteArrayToBinaryString(data) {
33839 for (var i=
0; i
<data.length; i++) {
33840 bin += zfill(data[i].toString(
2),
8);
33845 function hexStringToBinaryString(hexString) {
33847 for (var i=
0; i
<hexString.length; i++) {
33848 binaryString += zfill(parseInt(hexString[i],
16).toString(
2),
4);
33850 return binaryString;
33853 function binaryStringToWordArray(binary) {
33854 var aLen = binary.length /
32;
33856 for (var i=
0; i
<aLen; i++) {
33857 var valueStr = binary.substring(
0,
32);
33858 var value = parseInt(valueStr,
2);
33860 binary = binary.slice(
32);
33865 // Pad a numeric string on the left with zero digits until the given width
33867 // Note this differs to the python implementation because it does not
33868 // handle numbers starting with a sign.
33869 function zfill(source, length) {
33870 source = source.toString();
33871 while (source.length < length) {
33872 source = '
0' + source;
33884 var mnemonic = new Mnemonic("english");
33885 var bip32RootKey = null;
33886 var bip32ExtendedKey = null;
33887 var network = Bitcoin.networks.bitcoin;
33888 var addressRowTemplate = $("#address-row-template");
33890 var showIndex = true;
33891 var showAddress = true;
33892 var showPrivKey = true;
33894 var phraseChangeTimeoutEvent = null;
33897 DOM.network = $(".network");
33898 DOM.phraseNetwork = $("#network-phrase");
33899 DOM.phrase = $(".phrase");
33900 DOM.passphrase = $(".passphrase");
33901 DOM.generate = $(".generate");
33902 DOM.rootKey = $(".root-key");
33903 DOM.extendedPrivKey = $(".extended-priv-key");
33904 DOM.extendedPubKey = $(".extended-pub-key");
33905 DOM.bip32tab = $("#bip32-tab");
33906 DOM.bip44tab = $("#bip44-tab");
33907 DOM.bip32panel = $("#bip32");
33908 DOM.bip44panel = $("#bip44");
33909 DOM.bip32path = $("#bip32-path");
33910 DOM.bip44path = $("#bip44-path");
33911 DOM.bip44purpose = $("#bip44 .purpose");
33912 DOM.bip44coin = $("#bip44 .coin");
33913 DOM.bip44account = $("#bip44 .account");
33914 DOM.bip44change = $("#bip44 .change");
33915 DOM.strength = $(".strength");
33916 DOM.addresses = $(".addresses");
33917 DOM.rowsToAdd = $(".rows-to-add");
33918 DOM.more = $(".more");
33919 DOM.feedback = $(".feedback");
33920 DOM.tab = $(".derivation-type a");
33921 DOM.indexToggle = $(".index-toggle");
33922 DOM.addressToggle = $(".address-toggle");
33923 DOM.privateKeyToggle = $(".private-key-toggle");
33924 DOM.myceliumPath = $("#mycelium-path");
33926 var derivationPath = $(".tab-pane.active .path").val();
33930 DOM.network.on("change", networkChanged);
33931 DOM.phrase.on("input", delayedPhraseChanged);
33932 DOM.passphrase.on("input", delayedPhraseChanged);
33933 DOM.generate.on("click", generateClicked);
33934 DOM.more.on("click", showMore);
33935 DOM.bip32path.on("input", bip32Changed);
33936 DOM.bip44purpose.on("input", bip44Changed);
33937 DOM.bip44coin.on("input", bip44Changed);
33938 DOM.bip44account.on("input", bip44Changed);
33939 DOM.bip44change.on("input", bip44Changed);
33940 DOM.tab.on("click", tabClicked);
33941 DOM.indexToggle.on("click", toggleIndexes);
33942 DOM.addressToggle.on("click", toggleAddresses);
33943 DOM.privateKeyToggle.on("click", togglePrivateKeys);
33946 hideValidationError();
33951 function networkChanged(e) {
33952 var n = e.target.value;
33953 if (n == "bitcoin") {
33954 network = Bitcoin.networks.bitcoin;
33955 DOM.bip44coin.val(
0);
33956 DOM.myceliumPath.val("m/
44'/
0'/
0'/
0");
33958 else if (n == "bitcoin-testnet") {
33959 network = Bitcoin.networks.testnet;
33960 DOM.bip44coin.val(
1);
33961 DOM.myceliumPath.val("m/
44'/
1'/
0'/
0");
33963 else if (n == "litecoin") {
33964 network = Bitcoin.networks.litecoin;
33965 DOM.bip44coin.val(
2);
33967 else if (n == "shadow") {
33968 network = Bitcoin.networks.shadow;
33969 DOM.bip44coin.val(
35);
33971 else if (n == "shadowtn") {
33972 network = Bitcoin.networks.shadowtn;
33973 DOM.bip44coin.val(
1);
33975 else if (n == "dogecoin") {
33976 network = Bitcoin.networks.dogecoin;
33977 DOM.bip44coin.val(
3);
33979 setBip44DerivationPath();
33980 delayedPhraseChanged();
33983 function delayedPhraseChanged() {
33984 hideValidationError();
33986 if (phraseChangeTimeoutEvent != null) {
33987 clearTimeout(phraseChangeTimeoutEvent);
33989 phraseChangeTimeoutEvent = setTimeout(phraseChanged,
400);
33992 function phraseChanged() {
33994 hideValidationError();
33995 // Get the mnemonic phrase
33996 var phrase = DOM.phrase.val();
33997 var passphrase = DOM.passphrase.val();
33998 var errorText = findPhraseErrors(phrase);
34000 showValidationError(errorText);
34003 // Get the derivation path
34004 var errorText = findDerivationPathErrors();
34006 showValidationError(errorText);
34009 // Calculate and display
34010 calcBip32Seed(phrase, passphrase, derivationPath);
34011 displayBip32Info();
34015 function generateClicked() {
34018 setTimeout(function() {
34019 var phrase = generateRandomPhrase();
34027 function tabClicked(e) {
34028 var activePath = $(e.target.getAttribute("href") + " .path");
34029 derivationPath = activePath.val();
34030 derivationChanged();
34033 function derivationChanged() {
34034 delayedPhraseChanged();
34037 function bip32Changed() {
34038 derivationPath = DOM.bip32path.val();
34039 derivationChanged();
34042 function bip44Changed() {
34043 setBip44DerivationPath();
34044 derivationPath = DOM.bip44path.val();
34045 derivationChanged();
34048 function toggleIndexes() {
34049 showIndex = !showIndex;
34050 $("td.index span").toggleClass("invisible");
34053 function toggleAddresses() {
34054 showAddress = !showAddress;
34055 $("td.address span").toggleClass("invisible");
34058 function togglePrivateKeys() {
34059 showPrivKey = !showPrivKey;
34060 $("td.privkey span").toggleClass("invisible");
34065 function generateRandomPhrase() {
34066 if (!hasStrongRandom()) {
34067 var errorText = "This browser does not support strong randomness";
34068 showValidationError(errorText);
34071 var numWords = parseInt(DOM.strength.val());
34072 // Check strength is an integer
34073 if (isNaN(numWords)) {
34074 DOM.strength.val("
12");
34077 // Check strength is a multiple of
32, if not round it down
34078 if (numWords %
3 !=
0) {
34079 numWords = Math.floor(numWords /
3) *
3;
34080 DOM.strength.val(numWords);
34082 // Check strength is at least
32
34083 if (numWords ==
0) {
34085 DOM.strength.val(numWords);
34087 var strength = numWords /
3 *
32;
34088 var words = mnemonic.generate(strength);
34089 DOM.phrase.val(words);
34093 function calcBip32Seed(phrase, passphrase, path) {
34094 var seed = mnemonic.toSeed(phrase, passphrase);
34095 bip32RootKey = Bitcoin.HDNode.fromSeedHex(seed, network);
34096 bip32ExtendedKey = bip32RootKey;
34097 // Derive the key from the path
34098 var pathBits = path.split("/");
34099 for (var i=
0; i
<pathBits.length; i++) {
34100 var bit = pathBits[i];
34101 var index = parseInt(bit);
34102 if (isNaN(index)) {
34105 var hardened = bit[bit.length-
1] ==
"'";
34107 bip32ExtendedKey = bip32ExtendedKey.deriveHardened(index);
34110 bip32ExtendedKey = bip32ExtendedKey.derive(index);
34115 function showValidationError(errorText) {
34121 function hideValidationError() {
34127 function findPhraseErrors(phrase) {
34128 // TODO make this right
34129 // Preprocess the words
34130 phrase = mnemonic.normalizeString(phrase);
34131 var parts = phrase.split(
" ");
34133 for (var i=
0; i
<parts.length; i++) {
34134 var part = parts[i];
34135 if (part.length
> 0) {
34136 // TODO check that lowercasing is always valid to do
34137 proper.push(part.toLowerCase());
34140 // TODO some levenstein on the words
34141 var properPhrase = proper.join(' ');
34142 // Check the words are valid
34143 var isValid = mnemonic.check(properPhrase);
34145 return
"Invalid mnemonic";
34150 function findDerivationPathErrors(path) {
34155 function displayBip32Info() {
34157 var rootKey = bip32RootKey.toBase58();
34158 DOM.rootKey.val(rootKey);
34159 var extendedPrivKey = bip32ExtendedKey.toBase58();
34160 DOM.extendedPrivKey.val(extendedPrivKey);
34161 var extendedPubKey = bip32ExtendedKey.toBase58(false);
34162 DOM.extendedPubKey.val(extendedPubKey);
34163 // Display the addresses and privkeys
34164 clearAddressesList();
34165 displayAddresses(
0,
20);
34168 function displayAddresses(start, total) {
34169 for (var i=
0; i
<total; i++) {
34170 var index = i + start;
34171 new TableRow(index);
34175 function TableRow(index) {
34181 function calculateValues() {
34182 setTimeout(function() {
34183 var key = bip32ExtendedKey.derive(index);
34184 var address = key.getAddress().toString();
34185 var privkey = key.privKey.toWIF(network);
34186 addAddressToList(index, address, privkey);
34194 function showMore() {
34195 var start = DOM.addresses.children().length;
34196 var rowsToAdd = parseInt(DOM.rowsToAdd.val());
34197 if (isNaN(rowsToAdd)) {
34199 DOM.rowsToAdd.val(
"20");
34201 if (rowsToAdd
> 200) {
34202 var msg =
"Generating " + rowsToAdd +
" rows could take a while. ";
34203 msg +=
"Do you want to continue?";
34204 if (!confirm(msg)) {
34208 displayAddresses(start, rowsToAdd);
34211 function clearDisplay() {
34212 clearAddressesList();
34214 hideValidationError();
34217 function clearAddressesList() {
34218 DOM.addresses.empty();
34221 function clearKey() {
34222 DOM.rootKey.val(
"");
34223 DOM.extendedPrivKey.val(
"");
34224 DOM.extendedPubKey.val(
"");
34227 function addAddressToList(index, address, privkey) {
34228 var row = $(addressRowTemplate.html());
34230 var indexCell = row.find(
".index span");
34231 var addressCell = row.find(
".address span");
34232 var privkeyCell = row.find(
".privkey span");
34234 indexCell.text(index);
34235 addressCell.text(address);
34236 privkeyCell.text(privkey);
34239 indexCell.addClass(
"invisible");
34241 if (!showAddress) {
34242 addressCell.addClass(
"invisible");
34244 if (!showPrivKey) {
34245 privkeCell.addClass(
"invisible");
34247 DOM.addresses.append(row);
34250 function hasStrongRandom() {
34251 return 'crypto' in window && window['crypto'] !== null;
34254 function disableForms() {
34255 $(
"form").on(
"submit", function(e) {
34256 e.preventDefault();
34260 function setBip44DerivationPath() {
34261 var purpose = parseIntNoNaN(DOM.bip44purpose.val(),
44);
34262 var coin = parseIntNoNaN(DOM.bip44coin.val(),
0);
34263 var account = parseIntNoNaN(DOM.bip44account.val(),
0);
34264 var change = parseIntNoNaN(DOM.bip44change.val(),
0);
34266 path += purpose +
"'/";
34267 path += coin +
"'/";
34268 path += account +
"'/";
34270 DOM.bip44path.val(path);
34273 function parseIntNoNaN(val, defaultVal) {
34274 var v = parseInt(val);
34281 function showPending() {
34283 .text(
"Calculating...")
34287 function hidePending() {