github.com/shrimpyuk/bor@v0.2.15-0.20220224151350-fb4ec6020bae/internal/jsre/deps/web3.js (about)

     1  require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){
     2  module.exports=[
     3    {
     4      "constant": true,
     5      "inputs": [
     6        {
     7          "name": "_owner",
     8          "type": "address"
     9        }
    10      ],
    11      "name": "name",
    12      "outputs": [
    13        {
    14          "name": "o_name",
    15          "type": "bytes32"
    16        }
    17      ],
    18      "type": "function"
    19    },
    20    {
    21      "constant": true,
    22      "inputs": [
    23        {
    24          "name": "_name",
    25          "type": "bytes32"
    26        }
    27      ],
    28      "name": "owner",
    29      "outputs": [
    30        {
    31          "name": "",
    32          "type": "address"
    33        }
    34      ],
    35      "type": "function"
    36    },
    37    {
    38      "constant": true,
    39      "inputs": [
    40        {
    41          "name": "_name",
    42          "type": "bytes32"
    43        }
    44      ],
    45      "name": "content",
    46      "outputs": [
    47        {
    48          "name": "",
    49          "type": "bytes32"
    50        }
    51      ],
    52      "type": "function"
    53    },
    54    {
    55      "constant": true,
    56      "inputs": [
    57        {
    58          "name": "_name",
    59          "type": "bytes32"
    60        }
    61      ],
    62      "name": "addr",
    63      "outputs": [
    64        {
    65          "name": "",
    66          "type": "address"
    67        }
    68      ],
    69      "type": "function"
    70    },
    71    {
    72      "constant": false,
    73      "inputs": [
    74        {
    75          "name": "_name",
    76          "type": "bytes32"
    77        }
    78      ],
    79      "name": "reserve",
    80      "outputs": [],
    81      "type": "function"
    82    },
    83    {
    84      "constant": true,
    85      "inputs": [
    86        {
    87          "name": "_name",
    88          "type": "bytes32"
    89        }
    90      ],
    91      "name": "subRegistrar",
    92      "outputs": [
    93        {
    94          "name": "",
    95          "type": "address"
    96        }
    97      ],
    98      "type": "function"
    99    },
   100    {
   101      "constant": false,
   102      "inputs": [
   103        {
   104          "name": "_name",
   105          "type": "bytes32"
   106        },
   107        {
   108          "name": "_newOwner",
   109          "type": "address"
   110        }
   111      ],
   112      "name": "transfer",
   113      "outputs": [],
   114      "type": "function"
   115    },
   116    {
   117      "constant": false,
   118      "inputs": [
   119        {
   120          "name": "_name",
   121          "type": "bytes32"
   122        },
   123        {
   124          "name": "_registrar",
   125          "type": "address"
   126        }
   127      ],
   128      "name": "setSubRegistrar",
   129      "outputs": [],
   130      "type": "function"
   131    },
   132    {
   133      "constant": false,
   134      "inputs": [],
   135      "name": "Registrar",
   136      "outputs": [],
   137      "type": "function"
   138    },
   139    {
   140      "constant": false,
   141      "inputs": [
   142        {
   143          "name": "_name",
   144          "type": "bytes32"
   145        },
   146        {
   147          "name": "_a",
   148          "type": "address"
   149        },
   150        {
   151          "name": "_primary",
   152          "type": "bool"
   153        }
   154      ],
   155      "name": "setAddress",
   156      "outputs": [],
   157      "type": "function"
   158    },
   159    {
   160      "constant": false,
   161      "inputs": [
   162        {
   163          "name": "_name",
   164          "type": "bytes32"
   165        },
   166        {
   167          "name": "_content",
   168          "type": "bytes32"
   169        }
   170      ],
   171      "name": "setContent",
   172      "outputs": [],
   173      "type": "function"
   174    },
   175    {
   176      "constant": false,
   177      "inputs": [
   178        {
   179          "name": "_name",
   180          "type": "bytes32"
   181        }
   182      ],
   183      "name": "disown",
   184      "outputs": [],
   185      "type": "function"
   186    },
   187    {
   188      "anonymous": false,
   189      "inputs": [
   190        {
   191          "indexed": true,
   192          "name": "_name",
   193          "type": "bytes32"
   194        },
   195        {
   196          "indexed": false,
   197          "name": "_winner",
   198          "type": "address"
   199        }
   200      ],
   201      "name": "AuctionEnded",
   202      "type": "event"
   203    },
   204    {
   205      "anonymous": false,
   206      "inputs": [
   207        {
   208          "indexed": true,
   209          "name": "_name",
   210          "type": "bytes32"
   211        },
   212        {
   213          "indexed": false,
   214          "name": "_bidder",
   215          "type": "address"
   216        },
   217        {
   218          "indexed": false,
   219          "name": "_value",
   220          "type": "uint256"
   221        }
   222      ],
   223      "name": "NewBid",
   224      "type": "event"
   225    },
   226    {
   227      "anonymous": false,
   228      "inputs": [
   229        {
   230          "indexed": true,
   231          "name": "name",
   232          "type": "bytes32"
   233        }
   234      ],
   235      "name": "Changed",
   236      "type": "event"
   237    },
   238    {
   239      "anonymous": false,
   240      "inputs": [
   241        {
   242          "indexed": true,
   243          "name": "name",
   244          "type": "bytes32"
   245        },
   246        {
   247          "indexed": true,
   248          "name": "addr",
   249          "type": "address"
   250        }
   251      ],
   252      "name": "PrimaryChanged",
   253      "type": "event"
   254    }
   255  ]
   256  
   257  },{}],2:[function(require,module,exports){
   258  module.exports=[
   259    {
   260      "constant": true,
   261      "inputs": [
   262        {
   263          "name": "_name",
   264          "type": "bytes32"
   265        }
   266      ],
   267      "name": "owner",
   268      "outputs": [
   269        {
   270          "name": "",
   271          "type": "address"
   272        }
   273      ],
   274      "type": "function"
   275    },
   276    {
   277      "constant": false,
   278      "inputs": [
   279        {
   280          "name": "_name",
   281          "type": "bytes32"
   282        },
   283        {
   284          "name": "_refund",
   285          "type": "address"
   286        }
   287      ],
   288      "name": "disown",
   289      "outputs": [],
   290      "type": "function"
   291    },
   292    {
   293      "constant": true,
   294      "inputs": [
   295        {
   296          "name": "_name",
   297          "type": "bytes32"
   298        }
   299      ],
   300      "name": "addr",
   301      "outputs": [
   302        {
   303          "name": "",
   304          "type": "address"
   305        }
   306      ],
   307      "type": "function"
   308    },
   309    {
   310      "constant": false,
   311      "inputs": [
   312        {
   313          "name": "_name",
   314          "type": "bytes32"
   315        }
   316      ],
   317      "name": "reserve",
   318      "outputs": [],
   319      "type": "function"
   320    },
   321    {
   322      "constant": false,
   323      "inputs": [
   324        {
   325          "name": "_name",
   326          "type": "bytes32"
   327        },
   328        {
   329          "name": "_newOwner",
   330          "type": "address"
   331        }
   332      ],
   333      "name": "transfer",
   334      "outputs": [],
   335      "type": "function"
   336    },
   337    {
   338      "constant": false,
   339      "inputs": [
   340        {
   341          "name": "_name",
   342          "type": "bytes32"
   343        },
   344        {
   345          "name": "_a",
   346          "type": "address"
   347        }
   348      ],
   349      "name": "setAddr",
   350      "outputs": [],
   351      "type": "function"
   352    },
   353    {
   354      "anonymous": false,
   355      "inputs": [
   356        {
   357          "indexed": true,
   358          "name": "name",
   359          "type": "bytes32"
   360        }
   361      ],
   362      "name": "Changed",
   363      "type": "event"
   364    }
   365  ]
   366  
   367  },{}],3:[function(require,module,exports){
   368  module.exports=[
   369    {
   370      "constant": false,
   371      "inputs": [
   372        {
   373          "name": "from",
   374          "type": "bytes32"
   375        },
   376        {
   377          "name": "to",
   378          "type": "address"
   379        },
   380        {
   381          "name": "value",
   382          "type": "uint256"
   383        }
   384      ],
   385      "name": "transfer",
   386      "outputs": [],
   387      "type": "function"
   388    },
   389    {
   390      "constant": false,
   391      "inputs": [
   392        {
   393          "name": "from",
   394          "type": "bytes32"
   395        },
   396        {
   397          "name": "to",
   398          "type": "address"
   399        },
   400        {
   401          "name": "indirectId",
   402          "type": "bytes32"
   403        },
   404        {
   405          "name": "value",
   406          "type": "uint256"
   407        }
   408      ],
   409      "name": "icapTransfer",
   410      "outputs": [],
   411      "type": "function"
   412    },
   413    {
   414      "constant": false,
   415      "inputs": [
   416        {
   417          "name": "to",
   418          "type": "bytes32"
   419        }
   420      ],
   421      "name": "deposit",
   422      "outputs": [],
   423      "payable": true,
   424      "type": "function"
   425    },
   426    {
   427      "anonymous": false,
   428      "inputs": [
   429        {
   430          "indexed": true,
   431          "name": "from",
   432          "type": "address"
   433        },
   434        {
   435          "indexed": false,
   436          "name": "value",
   437          "type": "uint256"
   438        }
   439      ],
   440      "name": "AnonymousDeposit",
   441      "type": "event"
   442    },
   443    {
   444      "anonymous": false,
   445      "inputs": [
   446        {
   447          "indexed": true,
   448          "name": "from",
   449          "type": "address"
   450        },
   451        {
   452          "indexed": true,
   453          "name": "to",
   454          "type": "bytes32"
   455        },
   456        {
   457          "indexed": false,
   458          "name": "value",
   459          "type": "uint256"
   460        }
   461      ],
   462      "name": "Deposit",
   463      "type": "event"
   464    },
   465    {
   466      "anonymous": false,
   467      "inputs": [
   468        {
   469          "indexed": true,
   470          "name": "from",
   471          "type": "bytes32"
   472        },
   473        {
   474          "indexed": true,
   475          "name": "to",
   476          "type": "address"
   477        },
   478        {
   479          "indexed": false,
   480          "name": "value",
   481          "type": "uint256"
   482        }
   483      ],
   484      "name": "Transfer",
   485      "type": "event"
   486    },
   487    {
   488      "anonymous": false,
   489      "inputs": [
   490        {
   491          "indexed": true,
   492          "name": "from",
   493          "type": "bytes32"
   494        },
   495        {
   496          "indexed": true,
   497          "name": "to",
   498          "type": "address"
   499        },
   500        {
   501          "indexed": false,
   502          "name": "indirectId",
   503          "type": "bytes32"
   504        },
   505        {
   506          "indexed": false,
   507          "name": "value",
   508          "type": "uint256"
   509        }
   510      ],
   511      "name": "IcapTransfer",
   512      "type": "event"
   513    }
   514  ]
   515  
   516  },{}],4:[function(require,module,exports){
   517  var f = require('./formatters');
   518  var SolidityType = require('./type');
   519  
   520  /**
   521   * SolidityTypeAddress is a prootype that represents address type
   522   * It matches:
   523   * address
   524   * address[]
   525   * address[4]
   526   * address[][]
   527   * address[3][]
   528   * address[][6][], ...
   529   */
   530  var SolidityTypeAddress = function () {
   531      this._inputFormatter = f.formatInputInt;
   532      this._outputFormatter = f.formatOutputAddress;
   533  };
   534  
   535  SolidityTypeAddress.prototype = new SolidityType({});
   536  SolidityTypeAddress.prototype.constructor = SolidityTypeAddress;
   537  
   538  SolidityTypeAddress.prototype.isType = function (name) {
   539      return !!name.match(/address(\[([0-9]*)\])?/);
   540  };
   541  
   542  module.exports = SolidityTypeAddress;
   543  
   544  },{"./formatters":9,"./type":14}],5:[function(require,module,exports){
   545  var f = require('./formatters');
   546  var SolidityType = require('./type');
   547  
   548  /**
   549   * SolidityTypeBool is a prootype that represents bool type
   550   * It matches:
   551   * bool
   552   * bool[]
   553   * bool[4]
   554   * bool[][]
   555   * bool[3][]
   556   * bool[][6][], ...
   557   */
   558  var SolidityTypeBool = function () {
   559      this._inputFormatter = f.formatInputBool;
   560      this._outputFormatter = f.formatOutputBool;
   561  };
   562  
   563  SolidityTypeBool.prototype = new SolidityType({});
   564  SolidityTypeBool.prototype.constructor = SolidityTypeBool;
   565  
   566  SolidityTypeBool.prototype.isType = function (name) {
   567      return !!name.match(/^bool(\[([0-9]*)\])*$/);
   568  };
   569  
   570  module.exports = SolidityTypeBool;
   571  
   572  },{"./formatters":9,"./type":14}],6:[function(require,module,exports){
   573  var f = require('./formatters');
   574  var SolidityType = require('./type');
   575  
   576  /**
   577   * SolidityTypeBytes is a prototype that represents the bytes type.
   578   * It matches:
   579   * bytes
   580   * bytes[]
   581   * bytes[4]
   582   * bytes[][]
   583   * bytes[3][]
   584   * bytes[][6][], ...
   585   * bytes32
   586   * bytes8[4]
   587   * bytes[3][]
   588   */
   589  var SolidityTypeBytes = function () {
   590      this._inputFormatter = f.formatInputBytes;
   591      this._outputFormatter = f.formatOutputBytes;
   592  };
   593  
   594  SolidityTypeBytes.prototype = new SolidityType({});
   595  SolidityTypeBytes.prototype.constructor = SolidityTypeBytes;
   596  
   597  SolidityTypeBytes.prototype.isType = function (name) {
   598      return !!name.match(/^bytes([0-9]{1,})(\[([0-9]*)\])*$/);
   599  };
   600  
   601  module.exports = SolidityTypeBytes;
   602  
   603  },{"./formatters":9,"./type":14}],7:[function(require,module,exports){
   604  /*
   605      This file is part of web3.js.
   606  
   607      web3.js is free software: you can redistribute it and/or modify
   608      it under the terms of the GNU Lesser General Public License as published by
   609      the Free Software Foundation, either version 3 of the License, or
   610      (at your option) any later version.
   611  
   612      web3.js is distributed in the hope that it will be useful,
   613      but WITHOUT ANY WARRANTY; without even the implied warranty of
   614      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   615      GNU Lesser General Public License for more details.
   616  
   617      You should have received a copy of the GNU Lesser General Public License
   618      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   619  */
   620  /**
   621   * @file coder.js
   622   * @author Marek Kotewicz <marek@ethdev.com>
   623   * @date 2015
   624   */
   625  
   626  var f = require('./formatters');
   627  
   628  var SolidityTypeAddress = require('./address');
   629  var SolidityTypeBool = require('./bool');
   630  var SolidityTypeInt = require('./int');
   631  var SolidityTypeUInt = require('./uint');
   632  var SolidityTypeDynamicBytes = require('./dynamicbytes');
   633  var SolidityTypeString = require('./string');
   634  var SolidityTypeReal = require('./real');
   635  var SolidityTypeUReal = require('./ureal');
   636  var SolidityTypeBytes = require('./bytes');
   637  
   638  var isDynamic = function (solidityType, type) {
   639     return solidityType.isDynamicType(type) ||
   640            solidityType.isDynamicArray(type);
   641  };
   642  
   643  /**
   644   * SolidityCoder prototype should be used to encode/decode solidity params of any type
   645   */
   646  var SolidityCoder = function (types) {
   647      this._types = types;
   648  };
   649  
   650  /**
   651   * This method should be used to transform type to SolidityType
   652   *
   653   * @method _requireType
   654   * @param {String} type
   655   * @returns {SolidityType}
   656   * @throws {Error} throws if no matching type is found
   657   */
   658  SolidityCoder.prototype._requireType = function (type) {
   659      var solidityType = this._types.filter(function (t) {
   660          return t.isType(type);
   661      })[0];
   662  
   663      if (!solidityType) {
   664          throw Error('invalid solidity type!: ' + type);
   665      }
   666  
   667      return solidityType;
   668  };
   669  
   670  /**
   671   * Should be used to encode plain param
   672   *
   673   * @method encodeParam
   674   * @param {String} type
   675   * @param {Object} plain param
   676   * @return {String} encoded plain param
   677   */
   678  SolidityCoder.prototype.encodeParam = function (type, param) {
   679      return this.encodeParams([type], [param]);
   680  };
   681  
   682  /**
   683   * Should be used to encode list of params
   684   *
   685   * @method encodeParams
   686   * @param {Array} types
   687   * @param {Array} params
   688   * @return {String} encoded list of params
   689   */
   690  SolidityCoder.prototype.encodeParams = function (types, params) {
   691      var solidityTypes = this.getSolidityTypes(types);
   692  
   693      var encodeds = solidityTypes.map(function (solidityType, index) {
   694          return solidityType.encode(params[index], types[index]);
   695      });
   696  
   697      var dynamicOffset = solidityTypes.reduce(function (acc, solidityType, index) {
   698          var staticPartLength = solidityType.staticPartLength(types[index]);
   699          var roundedStaticPartLength = Math.floor((staticPartLength + 31) / 32) * 32;
   700  
   701          return acc + (isDynamic(solidityTypes[index], types[index]) ?
   702              32 :
   703              roundedStaticPartLength);
   704      }, 0);
   705  
   706      var result = this.encodeMultiWithOffset(types, solidityTypes, encodeds, dynamicOffset);
   707  
   708      return result;
   709  };
   710  
   711  SolidityCoder.prototype.encodeMultiWithOffset = function (types, solidityTypes, encodeds, dynamicOffset) {
   712      var result = "";
   713      var self = this;
   714  
   715      types.forEach(function (type, i) {
   716          if (isDynamic(solidityTypes[i], types[i])) {
   717              result += f.formatInputInt(dynamicOffset).encode();
   718              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   719              dynamicOffset += e.length / 2;
   720          } else {
   721              // don't add length to dynamicOffset. it's already counted
   722              result += self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   723          }
   724  
   725          // TODO: figure out nested arrays
   726      });
   727  
   728      types.forEach(function (type, i) {
   729          if (isDynamic(solidityTypes[i], types[i])) {
   730              var e = self.encodeWithOffset(types[i], solidityTypes[i], encodeds[i], dynamicOffset);
   731              dynamicOffset += e.length / 2;
   732              result += e;
   733          }
   734      });
   735      return result;
   736  };
   737  
   738  // TODO: refactor whole encoding!
   739  SolidityCoder.prototype.encodeWithOffset = function (type, solidityType, encoded, offset) {
   740      var self = this;
   741      if (solidityType.isDynamicArray(type)) {
   742          return (function () {
   743              // offset was already set
   744              var nestedName = solidityType.nestedName(type);
   745              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   746              var result = encoded[0];
   747  
   748              (function () {
   749                  var previousLength = 2; // in int
   750                  if (solidityType.isDynamicArray(nestedName)) {
   751                      for (var i = 1; i < encoded.length; i++) {
   752                          previousLength += +(encoded[i - 1])[0] || 0;
   753                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   754                      }
   755                  }
   756              })();
   757  
   758              // first element is length, skip it
   759              (function () {
   760                  for (var i = 0; i < encoded.length - 1; i++) {
   761                      var additionalOffset = result / 2;
   762                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i + 1], offset +  additionalOffset);
   763                  }
   764              })();
   765  
   766              return result;
   767          })();
   768  
   769      } else if (solidityType.isStaticArray(type)) {
   770          return (function () {
   771              var nestedName = solidityType.nestedName(type);
   772              var nestedStaticPartLength = solidityType.staticPartLength(nestedName);
   773              var result = "";
   774  
   775  
   776              if (solidityType.isDynamicArray(nestedName)) {
   777                  (function () {
   778                      var previousLength = 0; // in int
   779                      for (var i = 0; i < encoded.length; i++) {
   780                          // calculate length of previous item
   781                          previousLength += +(encoded[i - 1] || [])[0] || 0;
   782                          result += f.formatInputInt(offset + i * nestedStaticPartLength + previousLength * 32).encode();
   783                      }
   784                  })();
   785              }
   786  
   787              (function () {
   788                  for (var i = 0; i < encoded.length; i++) {
   789                      var additionalOffset = result / 2;
   790                      result += self.encodeWithOffset(nestedName, solidityType, encoded[i], offset + additionalOffset);
   791                  }
   792              })();
   793  
   794              return result;
   795          })();
   796      }
   797  
   798      return encoded;
   799  };
   800  
   801  /**
   802   * Should be used to decode bytes to plain param
   803   *
   804   * @method decodeParam
   805   * @param {String} type
   806   * @param {String} bytes
   807   * @return {Object} plain param
   808   */
   809  SolidityCoder.prototype.decodeParam = function (type, bytes) {
   810      return this.decodeParams([type], bytes)[0];
   811  };
   812  
   813  /**
   814   * Should be used to decode list of params
   815   *
   816   * @method decodeParam
   817   * @param {Array} types
   818   * @param {String} bytes
   819   * @return {Array} array of plain params
   820   */
   821  SolidityCoder.prototype.decodeParams = function (types, bytes) {
   822      var solidityTypes = this.getSolidityTypes(types);
   823      var offsets = this.getOffsets(types, solidityTypes);
   824  
   825      return solidityTypes.map(function (solidityType, index) {
   826          return solidityType.decode(bytes, offsets[index],  types[index], index);
   827      });
   828  };
   829  
   830  SolidityCoder.prototype.getOffsets = function (types, solidityTypes) {
   831      var lengths =  solidityTypes.map(function (solidityType, index) {
   832          return solidityType.staticPartLength(types[index]);
   833      });
   834  
   835      for (var i = 1; i < lengths.length; i++) {
   836           // sum with length of previous element
   837          lengths[i] += lengths[i - 1];
   838      }
   839  
   840      return lengths.map(function (length, index) {
   841          // remove the current length, so the length is sum of previous elements
   842          var staticPartLength = solidityTypes[index].staticPartLength(types[index]);
   843          return length - staticPartLength;
   844      });
   845  };
   846  
   847  SolidityCoder.prototype.getSolidityTypes = function (types) {
   848      var self = this;
   849      return types.map(function (type) {
   850          return self._requireType(type);
   851      });
   852  };
   853  
   854  var coder = new SolidityCoder([
   855      new SolidityTypeAddress(),
   856      new SolidityTypeBool(),
   857      new SolidityTypeInt(),
   858      new SolidityTypeUInt(),
   859      new SolidityTypeDynamicBytes(),
   860      new SolidityTypeBytes(),
   861      new SolidityTypeString(),
   862      new SolidityTypeReal(),
   863      new SolidityTypeUReal()
   864  ]);
   865  
   866  module.exports = coder;
   867  
   868  },{"./address":4,"./bool":5,"./bytes":6,"./dynamicbytes":8,"./formatters":9,"./int":10,"./real":12,"./string":13,"./uint":15,"./ureal":16}],8:[function(require,module,exports){
   869  var f = require('./formatters');
   870  var SolidityType = require('./type');
   871  
   872  var SolidityTypeDynamicBytes = function () {
   873      this._inputFormatter = f.formatInputDynamicBytes;
   874      this._outputFormatter = f.formatOutputDynamicBytes;
   875  };
   876  
   877  SolidityTypeDynamicBytes.prototype = new SolidityType({});
   878  SolidityTypeDynamicBytes.prototype.constructor = SolidityTypeDynamicBytes;
   879  
   880  SolidityTypeDynamicBytes.prototype.isType = function (name) {
   881      return !!name.match(/^bytes(\[([0-9]*)\])*$/);
   882  };
   883  
   884  SolidityTypeDynamicBytes.prototype.isDynamicType = function () {
   885      return true;
   886  };
   887  
   888  module.exports = SolidityTypeDynamicBytes;
   889  
   890  },{"./formatters":9,"./type":14}],9:[function(require,module,exports){
   891  /*
   892      This file is part of web3.js.
   893  
   894      web3.js is free software: you can redistribute it and/or modify
   895      it under the terms of the GNU Lesser General Public License as published by
   896      the Free Software Foundation, either version 3 of the License, or
   897      (at your option) any later version.
   898  
   899      web3.js is distributed in the hope that it will be useful,
   900      but WITHOUT ANY WARRANTY; without even the implied warranty of
   901      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   902      GNU Lesser General Public License for more details.
   903  
   904      You should have received a copy of the GNU Lesser General Public License
   905      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
   906  */
   907  /**
   908   * @file formatters.js
   909   * @author Marek Kotewicz <marek@ethdev.com>
   910   * @date 2015
   911   */
   912  
   913  var BigNumber = require('bignumber.js');
   914  var utils = require('../utils/utils');
   915  var c = require('../utils/config');
   916  var SolidityParam = require('./param');
   917  
   918  
   919  /**
   920   * Formats input value to byte representation of int
   921   * If value is negative, return it's two's complement
   922   * If the value is floating point, round it down
   923   *
   924   * @method formatInputInt
   925   * @param {String|Number|BigNumber} value that needs to be formatted
   926   * @returns {SolidityParam}
   927   */
   928  var formatInputInt = function (value) {
   929      BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);
   930      var result = utils.padLeft(utils.toTwosComplement(value).toString(16), 64);
   931      return new SolidityParam(result);
   932  };
   933  
   934  /**
   935   * Formats input bytes
   936   *
   937   * @method formatInputBytes
   938   * @param {String}
   939   * @returns {SolidityParam}
   940   */
   941  var formatInputBytes = function (value) {
   942      var result = utils.toHex(value).substr(2);
   943      var l = Math.floor((result.length + 63) / 64);
   944      result = utils.padRight(result, l * 64);
   945      return new SolidityParam(result);
   946  };
   947  
   948  /**
   949   * Formats input bytes
   950   *
   951   * @method formatDynamicInputBytes
   952   * @param {String}
   953   * @returns {SolidityParam}
   954   */
   955  var formatInputDynamicBytes = function (value) {
   956      var result = utils.toHex(value).substr(2);
   957      var length = result.length / 2;
   958      var l = Math.floor((result.length + 63) / 64);
   959      result = utils.padRight(result, l * 64);
   960      return new SolidityParam(formatInputInt(length).value + result);
   961  };
   962  
   963  /**
   964   * Formats input value to byte representation of string
   965   *
   966   * @method formatInputString
   967   * @param {String}
   968   * @returns {SolidityParam}
   969   */
   970  var formatInputString = function (value) {
   971      var result = utils.fromUtf8(value).substr(2);
   972      var length = result.length / 2;
   973      var l = Math.floor((result.length + 63) / 64);
   974      result = utils.padRight(result, l * 64);
   975      return new SolidityParam(formatInputInt(length).value + result);
   976  };
   977  
   978  /**
   979   * Formats input value to byte representation of bool
   980   *
   981   * @method formatInputBool
   982   * @param {Boolean}
   983   * @returns {SolidityParam}
   984   */
   985  var formatInputBool = function (value) {
   986      var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ?  '1' : '0');
   987      return new SolidityParam(result);
   988  };
   989  
   990  /**
   991   * Formats input value to byte representation of real
   992   * Values are multiplied by 2^m and encoded as integers
   993   *
   994   * @method formatInputReal
   995   * @param {String|Number|BigNumber}
   996   * @returns {SolidityParam}
   997   */
   998  var formatInputReal = function (value) {
   999      return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
  1000  };
  1001  
  1002  /**
  1003   * Check if input value is negative
  1004   *
  1005   * @method signedIsNegative
  1006   * @param {String} value is hex format
  1007   * @returns {Boolean} true if it is negative, otherwise false
  1008   */
  1009  var signedIsNegative = function (value) {
  1010      return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';
  1011  };
  1012  
  1013  /**
  1014   * Formats right-aligned output bytes to int
  1015   *
  1016   * @method formatOutputInt
  1017   * @param {SolidityParam} param
  1018   * @returns {BigNumber} right-aligned output bytes formatted to big number
  1019   */
  1020  var formatOutputInt = function (param) {
  1021      var value = param.staticPart() || "0";
  1022  
  1023      // check if it's negative number
  1024      // it is, return two's complement
  1025      if (signedIsNegative(value)) {
  1026          return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
  1027      }
  1028      return new BigNumber(value, 16);
  1029  };
  1030  
  1031  /**
  1032   * Formats right-aligned output bytes to uint
  1033   *
  1034   * @method formatOutputUInt
  1035   * @param {SolidityParam}
  1036   * @returns {BigNumeber} right-aligned output bytes formatted to uint
  1037   */
  1038  var formatOutputUInt = function (param) {
  1039      var value = param.staticPart() || "0";
  1040      return new BigNumber(value, 16);
  1041  };
  1042  
  1043  /**
  1044   * Formats right-aligned output bytes to real
  1045   *
  1046   * @method formatOutputReal
  1047   * @param {SolidityParam}
  1048   * @returns {BigNumber} input bytes formatted to real
  1049   */
  1050  var formatOutputReal = function (param) {
  1051      return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));
  1052  };
  1053  
  1054  /**
  1055   * Formats right-aligned output bytes to ureal
  1056   *
  1057   * @method formatOutputUReal
  1058   * @param {SolidityParam}
  1059   * @returns {BigNumber} input bytes formatted to ureal
  1060   */
  1061  var formatOutputUReal = function (param) {
  1062      return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));
  1063  };
  1064  
  1065  /**
  1066   * Should be used to format output bool
  1067   *
  1068   * @method formatOutputBool
  1069   * @param {SolidityParam}
  1070   * @returns {Boolean} right-aligned input bytes formatted to bool
  1071   */
  1072  var formatOutputBool = function (param) {
  1073      return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;
  1074  };
  1075  
  1076  /**
  1077   * Should be used to format output bytes
  1078   *
  1079   * @method formatOutputBytes
  1080   * @param {SolidityParam} left-aligned hex representation of string
  1081   * @param {String} name type name
  1082   * @returns {String} hex string
  1083   */
  1084  var formatOutputBytes = function (param, name) {
  1085      var matches = name.match(/^bytes([0-9]*)/);
  1086      var size = parseInt(matches[1]);
  1087      return '0x' + param.staticPart().slice(0, 2 * size);
  1088  };
  1089  
  1090  /**
  1091   * Should be used to format output bytes
  1092   *
  1093   * @method formatOutputDynamicBytes
  1094   * @param {SolidityParam} left-aligned hex representation of string
  1095   * @returns {String} hex string
  1096   */
  1097  var formatOutputDynamicBytes = function (param) {
  1098      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1099      return '0x' + param.dynamicPart().substr(64, length);
  1100  };
  1101  
  1102  /**
  1103   * Should be used to format output string
  1104   *
  1105   * @method formatOutputString
  1106   * @param {SolidityParam} left-aligned hex representation of string
  1107   * @returns {String} ascii string
  1108   */
  1109  var formatOutputString = function (param) {
  1110      var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
  1111      return utils.toUtf8(param.dynamicPart().substr(64, length));
  1112  };
  1113  
  1114  /**
  1115   * Should be used to format output address
  1116   *
  1117   * @method formatOutputAddress
  1118   * @param {SolidityParam} right-aligned input bytes
  1119   * @returns {String} address
  1120   */
  1121  var formatOutputAddress = function (param) {
  1122      var value = param.staticPart();
  1123      return "0x" + value.slice(value.length - 40, value.length);
  1124  };
  1125  
  1126  module.exports = {
  1127      formatInputInt: formatInputInt,
  1128      formatInputBytes: formatInputBytes,
  1129      formatInputDynamicBytes: formatInputDynamicBytes,
  1130      formatInputString: formatInputString,
  1131      formatInputBool: formatInputBool,
  1132      formatInputReal: formatInputReal,
  1133      formatOutputInt: formatOutputInt,
  1134      formatOutputUInt: formatOutputUInt,
  1135      formatOutputReal: formatOutputReal,
  1136      formatOutputUReal: formatOutputUReal,
  1137      formatOutputBool: formatOutputBool,
  1138      formatOutputBytes: formatOutputBytes,
  1139      formatOutputDynamicBytes: formatOutputDynamicBytes,
  1140      formatOutputString: formatOutputString,
  1141      formatOutputAddress: formatOutputAddress
  1142  };
  1143  
  1144  },{"../utils/config":18,"../utils/utils":20,"./param":11,"bignumber.js":"bignumber.js"}],10:[function(require,module,exports){
  1145  var f = require('./formatters');
  1146  var SolidityType = require('./type');
  1147  
  1148  /**
  1149   * SolidityTypeInt is a prootype that represents int type
  1150   * It matches:
  1151   * int
  1152   * int[]
  1153   * int[4]
  1154   * int[][]
  1155   * int[3][]
  1156   * int[][6][], ...
  1157   * int32
  1158   * int64[]
  1159   * int8[4]
  1160   * int256[][]
  1161   * int[3][]
  1162   * int64[][6][], ...
  1163   */
  1164  var SolidityTypeInt = function () {
  1165      this._inputFormatter = f.formatInputInt;
  1166      this._outputFormatter = f.formatOutputInt;
  1167  };
  1168  
  1169  SolidityTypeInt.prototype = new SolidityType({});
  1170  SolidityTypeInt.prototype.constructor = SolidityTypeInt;
  1171  
  1172  SolidityTypeInt.prototype.isType = function (name) {
  1173      return !!name.match(/^int([0-9]*)?(\[([0-9]*)\])*$/);
  1174  };
  1175  
  1176  module.exports = SolidityTypeInt;
  1177  
  1178  },{"./formatters":9,"./type":14}],11:[function(require,module,exports){
  1179  /*
  1180      This file is part of web3.js.
  1181  
  1182      web3.js is free software: you can redistribute it and/or modify
  1183      it under the terms of the GNU Lesser General Public License as published by
  1184      the Free Software Foundation, either version 3 of the License, or
  1185      (at your option) any later version.
  1186  
  1187      web3.js is distributed in the hope that it will be useful,
  1188      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1189      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1190      GNU Lesser General Public License for more details.
  1191  
  1192      You should have received a copy of the GNU Lesser General Public License
  1193      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1194  */
  1195  /** 
  1196   * @file param.js
  1197   * @author Marek Kotewicz <marek@ethdev.com>
  1198   * @date 2015
  1199   */
  1200  
  1201  var utils = require('../utils/utils');
  1202  
  1203  /**
  1204   * SolidityParam object prototype.
  1205   * Should be used when encoding, decoding solidity bytes
  1206   */
  1207  var SolidityParam = function (value, offset) {
  1208      this.value = value || '';
  1209      this.offset = offset; // offset in bytes
  1210  };
  1211  
  1212  /**
  1213   * This method should be used to get length of params's dynamic part
  1214   * 
  1215   * @method dynamicPartLength
  1216   * @returns {Number} length of dynamic part (in bytes)
  1217   */
  1218  SolidityParam.prototype.dynamicPartLength = function () {
  1219      return this.dynamicPart().length / 2;
  1220  };
  1221  
  1222  /**
  1223   * This method should be used to create copy of solidity param with different offset
  1224   *
  1225   * @method withOffset
  1226   * @param {Number} offset length in bytes
  1227   * @returns {SolidityParam} new solidity param with applied offset
  1228   */
  1229  SolidityParam.prototype.withOffset = function (offset) {
  1230      return new SolidityParam(this.value, offset);
  1231  };
  1232  
  1233  /**
  1234   * This method should be used to combine solidity params together
  1235   * eg. when appending an array
  1236   *
  1237   * @method combine
  1238   * @param {SolidityParam} param with which we should combine
  1239   * @param {SolidityParam} result of combination
  1240   */
  1241  SolidityParam.prototype.combine = function (param) {
  1242      return new SolidityParam(this.value + param.value); 
  1243  };
  1244  
  1245  /**
  1246   * This method should be called to check if param has dynamic size.
  1247   * If it has, it returns true, otherwise false
  1248   *
  1249   * @method isDynamic
  1250   * @returns {Boolean}
  1251   */
  1252  SolidityParam.prototype.isDynamic = function () {
  1253      return this.offset !== undefined;
  1254  };
  1255  
  1256  /**
  1257   * This method should be called to transform offset to bytes
  1258   *
  1259   * @method offsetAsBytes
  1260   * @returns {String} bytes representation of offset
  1261   */
  1262  SolidityParam.prototype.offsetAsBytes = function () {
  1263      return !this.isDynamic() ? '' : utils.padLeft(utils.toTwosComplement(this.offset).toString(16), 64);
  1264  };
  1265  
  1266  /**
  1267   * This method should be called to get static part of param
  1268   *
  1269   * @method staticPart
  1270   * @returns {String} offset if it is a dynamic param, otherwise value
  1271   */
  1272  SolidityParam.prototype.staticPart = function () {
  1273      if (!this.isDynamic()) {
  1274          return this.value; 
  1275      } 
  1276      return this.offsetAsBytes();
  1277  };
  1278  
  1279  /**
  1280   * This method should be called to get dynamic part of param
  1281   *
  1282   * @method dynamicPart
  1283   * @returns {String} returns a value if it is a dynamic param, otherwise empty string
  1284   */
  1285  SolidityParam.prototype.dynamicPart = function () {
  1286      return this.isDynamic() ? this.value : '';
  1287  };
  1288  
  1289  /**
  1290   * This method should be called to encode param
  1291   *
  1292   * @method encode
  1293   * @returns {String}
  1294   */
  1295  SolidityParam.prototype.encode = function () {
  1296      return this.staticPart() + this.dynamicPart();
  1297  };
  1298  
  1299  /**
  1300   * This method should be called to encode array of params
  1301   *
  1302   * @method encodeList
  1303   * @param {Array[SolidityParam]} params
  1304   * @returns {String}
  1305   */
  1306  SolidityParam.encodeList = function (params) {
  1307      
  1308      // updating offsets
  1309      var totalOffset = params.length * 32;
  1310      var offsetParams = params.map(function (param) {
  1311          if (!param.isDynamic()) {
  1312              return param;
  1313          }
  1314          var offset = totalOffset;
  1315          totalOffset += param.dynamicPartLength();
  1316          return param.withOffset(offset);
  1317      });
  1318  
  1319      // encode everything!
  1320      return offsetParams.reduce(function (result, param) {
  1321          return result + param.dynamicPart();
  1322      }, offsetParams.reduce(function (result, param) {
  1323          return result + param.staticPart();
  1324      }, ''));
  1325  };
  1326  
  1327  
  1328  
  1329  module.exports = SolidityParam;
  1330  
  1331  
  1332  },{"../utils/utils":20}],12:[function(require,module,exports){
  1333  var f = require('./formatters');
  1334  var SolidityType = require('./type');
  1335  
  1336  /**
  1337   * SolidityTypeReal is a prootype that represents real type
  1338   * It matches:
  1339   * real
  1340   * real[]
  1341   * real[4]
  1342   * real[][]
  1343   * real[3][]
  1344   * real[][6][], ...
  1345   * real32
  1346   * real64[]
  1347   * real8[4]
  1348   * real256[][]
  1349   * real[3][]
  1350   * real64[][6][], ...
  1351   */
  1352  var SolidityTypeReal = function () {
  1353      this._inputFormatter = f.formatInputReal;
  1354      this._outputFormatter = f.formatOutputReal;
  1355  };
  1356  
  1357  SolidityTypeReal.prototype = new SolidityType({});
  1358  SolidityTypeReal.prototype.constructor = SolidityTypeReal;
  1359  
  1360  SolidityTypeReal.prototype.isType = function (name) {
  1361      return !!name.match(/real([0-9]*)?(\[([0-9]*)\])?/);
  1362  };
  1363  
  1364  module.exports = SolidityTypeReal;
  1365  
  1366  },{"./formatters":9,"./type":14}],13:[function(require,module,exports){
  1367  var f = require('./formatters');
  1368  var SolidityType = require('./type');
  1369  
  1370  var SolidityTypeString = function () {
  1371      this._inputFormatter = f.formatInputString;
  1372      this._outputFormatter = f.formatOutputString;
  1373  };
  1374  
  1375  SolidityTypeString.prototype = new SolidityType({});
  1376  SolidityTypeString.prototype.constructor = SolidityTypeString;
  1377  
  1378  SolidityTypeString.prototype.isType = function (name) {
  1379      return !!name.match(/^string(\[([0-9]*)\])*$/);
  1380  };
  1381  
  1382  SolidityTypeString.prototype.isDynamicType = function () {
  1383      return true;
  1384  };
  1385  
  1386  module.exports = SolidityTypeString;
  1387  
  1388  },{"./formatters":9,"./type":14}],14:[function(require,module,exports){
  1389  var f = require('./formatters');
  1390  var SolidityParam = require('./param');
  1391  
  1392  /**
  1393   * SolidityType prototype is used to encode/decode solidity params of certain type
  1394   */
  1395  var SolidityType = function (config) {
  1396      this._inputFormatter = config.inputFormatter;
  1397      this._outputFormatter = config.outputFormatter;
  1398  };
  1399  
  1400  /**
  1401   * Should be used to determine if this SolidityType do match given name
  1402   *
  1403   * @method isType
  1404   * @param {String} name
  1405   * @return {Bool} true if type match this SolidityType, otherwise false
  1406   */
  1407  SolidityType.prototype.isType = function (name) {
  1408      throw "this method should be overrwritten for type " + name;
  1409  };
  1410  
  1411  /**
  1412   * Should be used to determine what is the length of static part in given type
  1413   *
  1414   * @method staticPartLength
  1415   * @param {String} name
  1416   * @return {Number} length of static part in bytes
  1417   */
  1418  SolidityType.prototype.staticPartLength = function (name) {
  1419      // If name isn't an array then treat it like a single element array.
  1420      return (this.nestedTypes(name) || ['[1]'])
  1421          .map(function (type) {
  1422              // the length of the nested array
  1423              return parseInt(type.slice(1, -1), 10) || 1;
  1424          })
  1425          .reduce(function (previous, current) {
  1426              return previous * current;
  1427          // all basic types are 32 bytes long
  1428          }, 32);
  1429  };
  1430  
  1431  /**
  1432   * Should be used to determine if type is dynamic array
  1433   * eg:
  1434   * "type[]" => true
  1435   * "type[4]" => false
  1436   *
  1437   * @method isDynamicArray
  1438   * @param {String} name
  1439   * @return {Bool} true if the type is dynamic array
  1440   */
  1441  SolidityType.prototype.isDynamicArray = function (name) {
  1442      var nestedTypes = this.nestedTypes(name);
  1443      return !!nestedTypes && !nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1444  };
  1445  
  1446  /**
  1447   * Should be used to determine if type is static array
  1448   * eg:
  1449   * "type[]" => false
  1450   * "type[4]" => true
  1451   *
  1452   * @method isStaticArray
  1453   * @param {String} name
  1454   * @return {Bool} true if the type is static array
  1455   */
  1456  SolidityType.prototype.isStaticArray = function (name) {
  1457      var nestedTypes = this.nestedTypes(name);
  1458      return !!nestedTypes && !!nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g);
  1459  };
  1460  
  1461  /**
  1462   * Should return length of static array
  1463   * eg.
  1464   * "int[32]" => 32
  1465   * "int256[14]" => 14
  1466   * "int[2][3]" => 3
  1467   * "int" => 1
  1468   * "int[1]" => 1
  1469   * "int[]" => 1
  1470   *
  1471   * @method staticArrayLength
  1472   * @param {String} name
  1473   * @return {Number} static array length
  1474   */
  1475  SolidityType.prototype.staticArrayLength = function (name) {
  1476      var nestedTypes = this.nestedTypes(name);
  1477      if (nestedTypes) {
  1478         return parseInt(nestedTypes[nestedTypes.length - 1].match(/[0-9]{1,}/g) || 1);
  1479      }
  1480      return 1;
  1481  };
  1482  
  1483  /**
  1484   * Should return nested type
  1485   * eg.
  1486   * "int[32]" => "int"
  1487   * "int256[14]" => "int256"
  1488   * "int[2][3]" => "int[2]"
  1489   * "int" => "int"
  1490   * "int[]" => "int"
  1491   *
  1492   * @method nestedName
  1493   * @param {String} name
  1494   * @return {String} nested name
  1495   */
  1496  SolidityType.prototype.nestedName = function (name) {
  1497      // remove last [] in name
  1498      var nestedTypes = this.nestedTypes(name);
  1499      if (!nestedTypes) {
  1500          return name;
  1501      }
  1502  
  1503      return name.substr(0, name.length - nestedTypes[nestedTypes.length - 1].length);
  1504  };
  1505  
  1506  /**
  1507   * Should return true if type has dynamic size by default
  1508   * such types are "string", "bytes"
  1509   *
  1510   * @method isDynamicType
  1511   * @param {String} name
  1512   * @return {Bool} true if is dynamic, otherwise false
  1513   */
  1514  SolidityType.prototype.isDynamicType = function () {
  1515      return false;
  1516  };
  1517  
  1518  /**
  1519   * Should return array of nested types
  1520   * eg.
  1521   * "int[2][3][]" => ["[2]", "[3]", "[]"]
  1522   * "int[] => ["[]"]
  1523   * "int" => null
  1524   *
  1525   * @method nestedTypes
  1526   * @param {String} name
  1527   * @return {Array} array of nested types
  1528   */
  1529  SolidityType.prototype.nestedTypes = function (name) {
  1530      // return list of strings eg. "[]", "[3]", "[]", "[2]"
  1531      return name.match(/(\[[0-9]*\])/g);
  1532  };
  1533  
  1534  /**
  1535   * Should be used to encode the value
  1536   *
  1537   * @method encode
  1538   * @param {Object} value
  1539   * @param {String} name
  1540   * @return {String} encoded value
  1541   */
  1542  SolidityType.prototype.encode = function (value, name) {
  1543      var self = this;
  1544      if (this.isDynamicArray(name)) {
  1545  
  1546          return (function () {
  1547              var length = value.length;                          // in int
  1548              var nestedName = self.nestedName(name);
  1549  
  1550              var result = [];
  1551              result.push(f.formatInputInt(length).encode());
  1552  
  1553              value.forEach(function (v) {
  1554                  result.push(self.encode(v, nestedName));
  1555              });
  1556  
  1557              return result;
  1558          })();
  1559  
  1560      } else if (this.isStaticArray(name)) {
  1561  
  1562          return (function () {
  1563              var length = self.staticArrayLength(name);          // in int
  1564              var nestedName = self.nestedName(name);
  1565  
  1566              var result = [];
  1567              for (var i = 0; i < length; i++) {
  1568                  result.push(self.encode(value[i], nestedName));
  1569              }
  1570  
  1571              return result;
  1572          })();
  1573  
  1574      }
  1575  
  1576      return this._inputFormatter(value, name).encode();
  1577  };
  1578  
  1579  /**
  1580   * Should be used to decode value from bytes
  1581   *
  1582   * @method decode
  1583   * @param {String} bytes
  1584   * @param {Number} offset in bytes
  1585   * @param {String} name type name
  1586   * @returns {Object} decoded value
  1587   */
  1588  SolidityType.prototype.decode = function (bytes, offset, name) {
  1589      var self = this;
  1590  
  1591      if (this.isDynamicArray(name)) {
  1592  
  1593          return (function () {
  1594              var arrayOffset = parseInt('0x' + bytes.substr(offset * 2, 64)); // in bytes
  1595              var length = parseInt('0x' + bytes.substr(arrayOffset * 2, 64)); // in int
  1596              var arrayStart = arrayOffset + 32; // array starts after length; // in bytes
  1597  
  1598              var nestedName = self.nestedName(name);
  1599              var nestedStaticPartLength = self.staticPartLength(nestedName);  // in bytes
  1600              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1601              var result = [];
  1602  
  1603              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1604                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1605              }
  1606  
  1607              return result;
  1608          })();
  1609  
  1610      } else if (this.isStaticArray(name)) {
  1611  
  1612          return (function () {
  1613              var length = self.staticArrayLength(name);                      // in int
  1614              var arrayStart = offset;                                        // in bytes
  1615  
  1616              var nestedName = self.nestedName(name);
  1617              var nestedStaticPartLength = self.staticPartLength(nestedName); // in bytes
  1618              var roundedNestedStaticPartLength = Math.floor((nestedStaticPartLength + 31) / 32) * 32;
  1619              var result = [];
  1620  
  1621              for (var i = 0; i < length * roundedNestedStaticPartLength; i += roundedNestedStaticPartLength) {
  1622                  result.push(self.decode(bytes, arrayStart + i, nestedName));
  1623              }
  1624  
  1625              return result;
  1626          })();
  1627      } else if (this.isDynamicType(name)) {
  1628  
  1629          return (function () {
  1630              var dynamicOffset = parseInt('0x' + bytes.substr(offset * 2, 64));      // in bytes
  1631              var length = parseInt('0x' + bytes.substr(dynamicOffset * 2, 64));      // in bytes
  1632              var roundedLength = Math.floor((length + 31) / 32);                     // in int
  1633              var param = new SolidityParam(bytes.substr(dynamicOffset * 2, ( 1 + roundedLength) * 64), 0);
  1634              return self._outputFormatter(param, name);
  1635          })();
  1636      }
  1637  
  1638      var length = this.staticPartLength(name);
  1639      var param = new SolidityParam(bytes.substr(offset * 2, length * 2));
  1640      return this._outputFormatter(param, name);
  1641  };
  1642  
  1643  module.exports = SolidityType;
  1644  
  1645  },{"./formatters":9,"./param":11}],15:[function(require,module,exports){
  1646  var f = require('./formatters');
  1647  var SolidityType = require('./type');
  1648  
  1649  /**
  1650   * SolidityTypeUInt is a prootype that represents uint type
  1651   * It matches:
  1652   * uint
  1653   * uint[]
  1654   * uint[4]
  1655   * uint[][]
  1656   * uint[3][]
  1657   * uint[][6][], ...
  1658   * uint32
  1659   * uint64[]
  1660   * uint8[4]
  1661   * uint256[][]
  1662   * uint[3][]
  1663   * uint64[][6][], ...
  1664   */
  1665  var SolidityTypeUInt = function () {
  1666      this._inputFormatter = f.formatInputInt;
  1667      this._outputFormatter = f.formatOutputUInt;
  1668  };
  1669  
  1670  SolidityTypeUInt.prototype = new SolidityType({});
  1671  SolidityTypeUInt.prototype.constructor = SolidityTypeUInt;
  1672  
  1673  SolidityTypeUInt.prototype.isType = function (name) {
  1674      return !!name.match(/^uint([0-9]*)?(\[([0-9]*)\])*$/);
  1675  };
  1676  
  1677  module.exports = SolidityTypeUInt;
  1678  
  1679  },{"./formatters":9,"./type":14}],16:[function(require,module,exports){
  1680  var f = require('./formatters');
  1681  var SolidityType = require('./type');
  1682  
  1683  /**
  1684   * SolidityTypeUReal is a prootype that represents ureal type
  1685   * It matches:
  1686   * ureal
  1687   * ureal[]
  1688   * ureal[4]
  1689   * ureal[][]
  1690   * ureal[3][]
  1691   * ureal[][6][], ...
  1692   * ureal32
  1693   * ureal64[]
  1694   * ureal8[4]
  1695   * ureal256[][]
  1696   * ureal[3][]
  1697   * ureal64[][6][], ...
  1698   */
  1699  var SolidityTypeUReal = function () {
  1700      this._inputFormatter = f.formatInputReal;
  1701      this._outputFormatter = f.formatOutputUReal;
  1702  };
  1703  
  1704  SolidityTypeUReal.prototype = new SolidityType({});
  1705  SolidityTypeUReal.prototype.constructor = SolidityTypeUReal;
  1706  
  1707  SolidityTypeUReal.prototype.isType = function (name) {
  1708      return !!name.match(/^ureal([0-9]*)?(\[([0-9]*)\])*$/);
  1709  };
  1710  
  1711  module.exports = SolidityTypeUReal;
  1712  
  1713  },{"./formatters":9,"./type":14}],17:[function(require,module,exports){
  1714  'use strict';
  1715  
  1716  // go env doesn't have and need XMLHttpRequest
  1717  if (typeof XMLHttpRequest === 'undefined') {
  1718      exports.XMLHttpRequest = {};
  1719  } else {
  1720      exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
  1721  }
  1722  
  1723  
  1724  },{}],18:[function(require,module,exports){
  1725  /*
  1726      This file is part of web3.js.
  1727  
  1728      web3.js is free software: you can redistribute it and/or modify
  1729      it under the terms of the GNU Lesser General Public License as published by
  1730      the Free Software Foundation, either version 3 of the License, or
  1731      (at your option) any later version.
  1732  
  1733      web3.js is distributed in the hope that it will be useful,
  1734      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1735      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1736      GNU Lesser General Public License for more details.
  1737  
  1738      You should have received a copy of the GNU Lesser General Public License
  1739      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1740  */
  1741  /** @file config.js
  1742   * @authors:
  1743   *   Marek Kotewicz <marek@ethdev.com>
  1744   * @date 2015
  1745   */
  1746  
  1747  /**
  1748   * Utils
  1749   * 
  1750   * @module utils
  1751   */
  1752  
  1753  /**
  1754   * Utility functions
  1755   * 
  1756   * @class [utils] config
  1757   * @constructor
  1758   */
  1759  
  1760  
  1761  /// required to define ETH_BIGNUMBER_ROUNDING_MODE
  1762  var BigNumber = require('bignumber.js');
  1763  
  1764  var ETH_UNITS = [
  1765      'wei',
  1766      'kwei',
  1767      'Mwei',
  1768      'Gwei',
  1769      'szabo',
  1770      'finney',
  1771      'femtoether',
  1772      'picoether',
  1773      'nanoether',
  1774      'microether',
  1775      'milliether',
  1776      'nano',
  1777      'micro',
  1778      'milli',
  1779      'ether',
  1780      'grand',
  1781      'Mether',
  1782      'Gether',
  1783      'Tether',
  1784      'Pether',
  1785      'Eether',
  1786      'Zether',
  1787      'Yether',
  1788      'Nether',
  1789      'Dether',
  1790      'Vether',
  1791      'Uether'
  1792  ];
  1793  
  1794  module.exports = {
  1795      ETH_PADDING: 32,
  1796      ETH_SIGNATURE_LENGTH: 4,
  1797      ETH_UNITS: ETH_UNITS,
  1798      ETH_BIGNUMBER_ROUNDING_MODE: { ROUNDING_MODE: BigNumber.ROUND_DOWN },
  1799      ETH_POLLING_TIMEOUT: 1000/2,
  1800      defaultBlock: 'latest',
  1801      defaultAccount: undefined
  1802  };
  1803  
  1804  
  1805  },{"bignumber.js":"bignumber.js"}],19:[function(require,module,exports){
  1806  /*
  1807      This file is part of web3.js.
  1808  
  1809      web3.js is free software: you can redistribute it and/or modify
  1810      it under the terms of the GNU Lesser General Public License as published by
  1811      the Free Software Foundation, either version 3 of the License, or
  1812      (at your option) any later version.
  1813  
  1814      web3.js is distributed in the hope that it will be useful,
  1815      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1816      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1817      GNU Lesser General Public License for more details.
  1818  
  1819      You should have received a copy of the GNU Lesser General Public License
  1820      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1821  */
  1822  /** 
  1823   * @file sha3.js
  1824   * @author Marek Kotewicz <marek@ethdev.com>
  1825   * @date 2015
  1826   */
  1827  
  1828  var CryptoJS = require('crypto-js');
  1829  var sha3 = require('crypto-js/sha3');
  1830  
  1831  module.exports = function (value, options) {
  1832      if (options && options.encoding === 'hex') {
  1833          if (value.length > 2 && value.substr(0, 2) === '0x') {
  1834              value = value.substr(2);
  1835          }
  1836          value = CryptoJS.enc.Hex.parse(value);
  1837      }
  1838  
  1839      return sha3(value, {
  1840          outputLength: 256
  1841      }).toString();
  1842  };
  1843  
  1844  
  1845  },{"crypto-js":59,"crypto-js/sha3":80}],20:[function(require,module,exports){
  1846  /*
  1847      This file is part of web3.js.
  1848  
  1849      web3.js is free software: you can redistribute it and/or modify
  1850      it under the terms of the GNU Lesser General Public License as published by
  1851      the Free Software Foundation, either version 3 of the License, or
  1852      (at your option) any later version.
  1853  
  1854      web3.js is distributed in the hope that it will be useful,
  1855      but WITHOUT ANY WARRANTY; without even the implied warranty of
  1856      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1857      GNU Lesser General Public License for more details.
  1858  
  1859      You should have received a copy of the GNU Lesser General Public License
  1860      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  1861  */
  1862  /**
  1863   * @file utils.js
  1864   * @author Marek Kotewicz <marek@ethdev.com>
  1865   * @date 2015
  1866   */
  1867  
  1868  /**
  1869   * Utils
  1870   *
  1871   * @module utils
  1872   */
  1873  
  1874  /**
  1875   * Utility functions
  1876   *
  1877   * @class [utils] utils
  1878   * @constructor
  1879   */
  1880  
  1881  
  1882  var BigNumber = require('bignumber.js');
  1883  var sha3 = require('./sha3.js');
  1884  var utf8 = require('utf8');
  1885  
  1886  var unitMap = {
  1887      'noether':      '0',
  1888      'wei':          '1',
  1889      'kwei':         '1000',
  1890      'Kwei':         '1000',
  1891      'babbage':      '1000',
  1892      'femtoether':   '1000',
  1893      'mwei':         '1000000',
  1894      'Mwei':         '1000000',
  1895      'lovelace':     '1000000',
  1896      'picoether':    '1000000',
  1897      'gwei':         '1000000000',
  1898      'Gwei':         '1000000000',
  1899      'shannon':      '1000000000',
  1900      'nanoether':    '1000000000',
  1901      'nano':         '1000000000',
  1902      'szabo':        '1000000000000',
  1903      'microether':   '1000000000000',
  1904      'micro':        '1000000000000',
  1905      'finney':       '1000000000000000',
  1906      'milliether':    '1000000000000000',
  1907      'milli':         '1000000000000000',
  1908      'ether':        '1000000000000000000',
  1909      'kether':       '1000000000000000000000',
  1910      'grand':        '1000000000000000000000',
  1911      'mether':       '1000000000000000000000000',
  1912      'gether':       '1000000000000000000000000000',
  1913      'tether':       '1000000000000000000000000000000'
  1914  };
  1915  
  1916  /**
  1917   * Should be called to pad string to expected length
  1918   *
  1919   * @method padLeft
  1920   * @param {String} string to be padded
  1921   * @param {Number} characters that result string should have
  1922   * @param {String} sign, by default 0
  1923   * @returns {String} right aligned string
  1924   */
  1925  var padLeft = function (string, chars, sign) {
  1926      return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
  1927  };
  1928  
  1929  /**
  1930   * Should be called to pad string to expected length
  1931   *
  1932   * @method padRight
  1933   * @param {String} string to be padded
  1934   * @param {Number} characters that result string should have
  1935   * @param {String} sign, by default 0
  1936   * @returns {String} right aligned string
  1937   */
  1938  var padRight = function (string, chars, sign) {
  1939      return string + (new Array(chars - string.length + 1).join(sign ? sign : "0"));
  1940  };
  1941  
  1942  /**
  1943   * Should be called to get utf8 from it's hex representation
  1944   *
  1945   * @method toUtf8
  1946   * @param {String} string in hex
  1947   * @returns {String} ascii string representation of hex value
  1948   */
  1949  var toUtf8 = function(hex) {
  1950  // Find termination
  1951      var str = "";
  1952      var i = 0, l = hex.length;
  1953      if (hex.substring(0, 2) === '0x') {
  1954          i = 2;
  1955      }
  1956      for (; i < l; i+=2) {
  1957          var code = parseInt(hex.substr(i, 2), 16);
  1958          if (code === 0)
  1959              break;
  1960          str += String.fromCharCode(code);
  1961      }
  1962  
  1963      return utf8.decode(str);
  1964  };
  1965  
  1966  /**
  1967   * Should be called to get ascii from it's hex representation
  1968   *
  1969   * @method toAscii
  1970   * @param {String} string in hex
  1971   * @returns {String} ascii string representation of hex value
  1972   */
  1973  var toAscii = function(hex) {
  1974  // Find termination
  1975      var str = "";
  1976      var i = 0, l = hex.length;
  1977      if (hex.substring(0, 2) === '0x') {
  1978          i = 2;
  1979      }
  1980      for (; i < l; i+=2) {
  1981          var code = parseInt(hex.substr(i, 2), 16);
  1982          str += String.fromCharCode(code);
  1983      }
  1984  
  1985      return str;
  1986  };
  1987  
  1988  /**
  1989   * Should be called to get hex representation (prefixed by 0x) of utf8 string
  1990   *
  1991   * @method fromUtf8
  1992   * @param {String} string
  1993   * @param {Number} optional padding
  1994   * @returns {String} hex representation of input string
  1995   */
  1996  var fromUtf8 = function(str) {
  1997      str = utf8.encode(str);
  1998      var hex = "";
  1999      for(var i = 0; i < str.length; i++) {
  2000          var code = str.charCodeAt(i);
  2001          if (code === 0)
  2002              break;
  2003          var n = code.toString(16);
  2004          hex += n.length < 2 ? '0' + n : n;
  2005      }
  2006  
  2007      return "0x" + hex;
  2008  };
  2009  
  2010  /**
  2011   * Should be called to get hex representation (prefixed by 0x) of ascii string
  2012   *
  2013   * @method fromAscii
  2014   * @param {String} string
  2015   * @param {Number} optional padding
  2016   * @returns {String} hex representation of input string
  2017   */
  2018  var fromAscii = function(str) {
  2019      var hex = "";
  2020      for(var i = 0; i < str.length; i++) {
  2021          var code = str.charCodeAt(i);
  2022          var n = code.toString(16);
  2023          hex += n.length < 2 ? '0' + n : n;
  2024      }
  2025  
  2026      return "0x" + hex;
  2027  };
  2028  
  2029  /**
  2030   * Should be used to create full function/event name from json abi
  2031   *
  2032   * @method transformToFullName
  2033   * @param {Object} json-abi
  2034   * @return {String} full fnction/event name
  2035   */
  2036  var transformToFullName = function (json) {
  2037      if (json.name.indexOf('(') !== -1) {
  2038          return json.name;
  2039      }
  2040  
  2041      var typeName = json.inputs.map(function(i){return i.type; }).join();
  2042      return json.name + '(' + typeName + ')';
  2043  };
  2044  
  2045  /**
  2046   * Should be called to get display name of contract function
  2047   *
  2048   * @method extractDisplayName
  2049   * @param {String} name of function/event
  2050   * @returns {String} display name for function/event eg. multiply(uint256) -> multiply
  2051   */
  2052  var extractDisplayName = function (name) {
  2053      var length = name.indexOf('(');
  2054      return length !== -1 ? name.substr(0, length) : name;
  2055  };
  2056  
  2057  /// @returns overloaded part of function/event name
  2058  var extractTypeName = function (name) {
  2059      /// TODO: make it invulnerable
  2060      var length = name.indexOf('(');
  2061      return length !== -1 ? name.substr(length + 1, name.length - 1 - (length + 1)).replace(' ', '') : "";
  2062  };
  2063  
  2064  /**
  2065   * Converts value to it's decimal representation in string
  2066   *
  2067   * @method toDecimal
  2068   * @param {String|Number|BigNumber}
  2069   * @return {String}
  2070   */
  2071  var toDecimal = function (value) {
  2072      return toBigNumber(value).toNumber();
  2073  };
  2074  
  2075  /**
  2076   * Converts value to it's hex representation
  2077   *
  2078   * @method fromDecimal
  2079   * @param {String|Number|BigNumber}
  2080   * @return {String}
  2081   */
  2082  var fromDecimal = function (value) {
  2083      var number = toBigNumber(value);
  2084      var result = number.toString(16);
  2085  
  2086      return number.lessThan(0) ? '-0x' + result.substr(1) : '0x' + result;
  2087  };
  2088  
  2089  /**
  2090   * Auto converts any given value into it's hex representation.
  2091   *
  2092   * And even stringifys objects before.
  2093   *
  2094   * @method toHex
  2095   * @param {String|Number|BigNumber|Object}
  2096   * @return {String}
  2097   */
  2098  var toHex = function (val) {
  2099      /*jshint maxcomplexity: 8 */
  2100  
  2101      if (isBoolean(val))
  2102          return fromDecimal(+val);
  2103  
  2104      if (isBigNumber(val))
  2105          return fromDecimal(val);
  2106  
  2107      if (typeof val === 'object')
  2108          return fromUtf8(JSON.stringify(val));
  2109  
  2110      // if its a negative number, pass it through fromDecimal
  2111      if (isString(val)) {
  2112          if (val.indexOf('-0x') === 0)
  2113              return fromDecimal(val);
  2114          else if(val.indexOf('0x') === 0)
  2115              return val;
  2116          else if (!isFinite(val))
  2117              return fromAscii(val);
  2118      }
  2119  
  2120      return fromDecimal(val);
  2121  };
  2122  
  2123  /**
  2124   * Returns value of unit in Wei
  2125   *
  2126   * @method getValueOfUnit
  2127   * @param {String} unit the unit to convert to, default ether
  2128   * @returns {BigNumber} value of the unit (in Wei)
  2129   * @throws error if the unit is not correct:w
  2130   */
  2131  var getValueOfUnit = function (unit) {
  2132      unit = unit ? unit.toLowerCase() : 'ether';
  2133      var unitValue = unitMap[unit];
  2134      if (unitValue === undefined) {
  2135          throw new Error('This unit doesn\'t exists, please use the one of the following units' + JSON.stringify(unitMap, null, 2));
  2136      }
  2137      return new BigNumber(unitValue, 10);
  2138  };
  2139  
  2140  /**
  2141   * Takes a number of wei and converts it to any other ether unit.
  2142   *
  2143   * Possible units are:
  2144   *   SI Short   SI Full        Effigy       Other
  2145   * - kwei       femtoether     babbage
  2146   * - mwei       picoether      lovelace
  2147   * - gwei       nanoether      shannon      nano
  2148   * - --         microether     szabo        micro
  2149   * - --         milliether     finney       milli
  2150   * - ether      --             --
  2151   * - kether                    --           grand
  2152   * - mether
  2153   * - gether
  2154   * - tether
  2155   *
  2156   * @method fromWei
  2157   * @param {Number|String} number can be a number, number string or a HEX of a decimal
  2158   * @param {String} unit the unit to convert to, default ether
  2159   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2160  */
  2161  var fromWei = function(number, unit) {
  2162      var returnValue = toBigNumber(number).dividedBy(getValueOfUnit(unit));
  2163  
  2164      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2165  };
  2166  
  2167  /**
  2168   * Takes a number of a unit and converts it to wei.
  2169   *
  2170   * Possible units are:
  2171   *   SI Short   SI Full        Effigy       Other
  2172   * - kwei       femtoether     babbage
  2173   * - mwei       picoether      lovelace
  2174   * - gwei       nanoether      shannon      nano
  2175   * - --         microether     szabo        micro
  2176   * - --         microether     szabo        micro
  2177   * - --         milliether     finney       milli
  2178   * - ether      --             --
  2179   * - kether                    --           grand
  2180   * - mether
  2181   * - gether
  2182   * - tether
  2183   *
  2184   * @method toWei
  2185   * @param {Number|String|BigNumber} number can be a number, number string or a HEX of a decimal
  2186   * @param {String} unit the unit to convert from, default ether
  2187   * @return {String|Object} When given a BigNumber object it returns one as well, otherwise a number
  2188  */
  2189  var toWei = function(number, unit) {
  2190      var returnValue = toBigNumber(number).times(getValueOfUnit(unit));
  2191  
  2192      return isBigNumber(number) ? returnValue : returnValue.toString(10);
  2193  };
  2194  
  2195  /**
  2196   * Takes an input and transforms it into a bignumber
  2197   *
  2198   * @method toBigNumber
  2199   * @param {Number|String|BigNumber} a number, string, HEX string or BigNumber
  2200   * @return {BigNumber} BigNumber
  2201  */
  2202  var toBigNumber = function(number) {
  2203      /*jshint maxcomplexity:5 */
  2204      number = number || 0;
  2205      if (isBigNumber(number))
  2206          return number;
  2207  
  2208      if (isString(number) && (number.indexOf('0x') === 0 || number.indexOf('-0x') === 0)) {
  2209          return new BigNumber(number.replace('0x',''), 16);
  2210      }
  2211  
  2212      return new BigNumber(number.toString(10), 10);
  2213  };
  2214  
  2215  /**
  2216   * Takes and input transforms it into bignumber and if it is negative value, into two's complement
  2217   *
  2218   * @method toTwosComplement
  2219   * @param {Number|String|BigNumber}
  2220   * @return {BigNumber}
  2221   */
  2222  var toTwosComplement = function (number) {
  2223      var bigNumber = toBigNumber(number).round();
  2224      if (bigNumber.lessThan(0)) {
  2225          return new BigNumber("ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", 16).plus(bigNumber).plus(1);
  2226      }
  2227      return bigNumber;
  2228  };
  2229  
  2230  /**
  2231   * Checks if the given string is strictly an address
  2232   *
  2233   * @method isStrictAddress
  2234   * @param {String} address the given HEX address
  2235   * @return {Boolean}
  2236  */
  2237  var isStrictAddress = function (address) {
  2238      return /^0x[0-9a-f]{40}$/i.test(address);
  2239  };
  2240  
  2241  /**
  2242   * Checks if the given string is an address
  2243   *
  2244   * @method isAddress
  2245   * @param {String} address the given HEX address
  2246   * @return {Boolean}
  2247  */
  2248  var isAddress = function (address) {
  2249      if (!/^(0x)?[0-9a-f]{40}$/i.test(address)) {
  2250          // check if it has the basic requirements of an address
  2251          return false;
  2252      } else if (/^(0x)?[0-9a-f]{40}$/.test(address) || /^(0x)?[0-9A-F]{40}$/.test(address)) {
  2253          // If it's all small caps or all caps, return true
  2254          return true;
  2255      } else {
  2256          // Otherwise check each case
  2257          return isChecksumAddress(address);
  2258      }
  2259  };
  2260  
  2261  /**
  2262   * Checks if the given string is a checksummed address
  2263   *
  2264   * @method isChecksumAddress
  2265   * @param {String} address the given HEX address
  2266   * @return {Boolean}
  2267  */
  2268  var isChecksumAddress = function (address) {
  2269      // Check each case
  2270      address = address.replace('0x','');
  2271      var addressHash = sha3(address.toLowerCase());
  2272  
  2273      for (var i = 0; i < 40; i++ ) {
  2274          // the nth letter should be uppercase if the nth digit of casemap is 1
  2275          if ((parseInt(addressHash[i], 16) > 7 && address[i].toUpperCase() !== address[i]) || (parseInt(addressHash[i], 16) <= 7 && address[i].toLowerCase() !== address[i])) {
  2276              return false;
  2277          }
  2278      }
  2279      return true;
  2280  };
  2281  
  2282  
  2283  
  2284  /**
  2285   * Makes a checksum address
  2286   *
  2287   * @method toChecksumAddress
  2288   * @param {String} address the given HEX address
  2289   * @return {String}
  2290  */
  2291  var toChecksumAddress = function (address) {
  2292      if (typeof address === 'undefined') return '';
  2293  
  2294      address = address.toLowerCase().replace('0x','');
  2295      var addressHash = sha3(address);
  2296      var checksumAddress = '0x';
  2297  
  2298      for (var i = 0; i < address.length; i++ ) {
  2299          // If ith character is 9 to f then make it uppercase
  2300          if (parseInt(addressHash[i], 16) > 7) {
  2301            checksumAddress += address[i].toUpperCase();
  2302          } else {
  2303              checksumAddress += address[i];
  2304          }
  2305      }
  2306      return checksumAddress;
  2307  };
  2308  
  2309  /**
  2310   * Transforms given string to valid 20 bytes-length addres with 0x prefix
  2311   *
  2312   * @method toAddress
  2313   * @param {String} address
  2314   * @return {String} formatted address
  2315   */
  2316  var toAddress = function (address) {
  2317      if (isStrictAddress(address)) {
  2318          return address;
  2319      }
  2320  
  2321      if (/^[0-9a-f]{40}$/.test(address)) {
  2322          return '0x' + address;
  2323      }
  2324  
  2325      return '0x' + padLeft(toHex(address).substr(2), 40);
  2326  };
  2327  
  2328  /**
  2329   * Returns true if object is BigNumber, otherwise false
  2330   *
  2331   * @method isBigNumber
  2332   * @param {Object}
  2333   * @return {Boolean}
  2334   */
  2335  var isBigNumber = function (object) {
  2336      return object instanceof BigNumber ||
  2337          (object && object.constructor && object.constructor.name === 'BigNumber');
  2338  };
  2339  
  2340  /**
  2341   * Returns true if object is string, otherwise false
  2342   *
  2343   * @method isString
  2344   * @param {Object}
  2345   * @return {Boolean}
  2346   */
  2347  var isString = function (object) {
  2348      return typeof object === 'string' ||
  2349          (object && object.constructor && object.constructor.name === 'String');
  2350  };
  2351  
  2352  /**
  2353   * Returns true if object is function, otherwise false
  2354   *
  2355   * @method isFunction
  2356   * @param {Object}
  2357   * @return {Boolean}
  2358   */
  2359  var isFunction = function (object) {
  2360      return typeof object === 'function';
  2361  };
  2362  
  2363  /**
  2364   * Returns true if object is Objet, otherwise false
  2365   *
  2366   * @method isObject
  2367   * @param {Object}
  2368   * @return {Boolean}
  2369   */
  2370  var isObject = function (object) {
  2371      return object !== null && !(object instanceof Array) && typeof object === 'object';
  2372  };
  2373  
  2374  /**
  2375   * Returns true if object is boolean, otherwise false
  2376   *
  2377   * @method isBoolean
  2378   * @param {Object}
  2379   * @return {Boolean}
  2380   */
  2381  var isBoolean = function (object) {
  2382      return typeof object === 'boolean';
  2383  };
  2384  
  2385  /**
  2386   * Returns true if object is array, otherwise false
  2387   *
  2388   * @method isArray
  2389   * @param {Object}
  2390   * @return {Boolean}
  2391   */
  2392  var isArray = function (object) {
  2393      return object instanceof Array;
  2394  };
  2395  
  2396  /**
  2397   * Returns true if given string is valid json object
  2398   *
  2399   * @method isJson
  2400   * @param {String}
  2401   * @return {Boolean}
  2402   */
  2403  var isJson = function (str) {
  2404      try {
  2405          return !!JSON.parse(str);
  2406      } catch (e) {
  2407          return false;
  2408      }
  2409  };
  2410  
  2411  /**
  2412   * Returns true if given string is a valid Ethereum block header bloom.
  2413   *
  2414   * @method isBloom
  2415   * @param {String} hex encoded bloom filter
  2416   * @return {Boolean}
  2417   */
  2418  var isBloom = function (bloom) {
  2419      if (!/^(0x)?[0-9a-f]{512}$/i.test(bloom)) {
  2420          return false;
  2421      } else if (/^(0x)?[0-9a-f]{512}$/.test(bloom) || /^(0x)?[0-9A-F]{512}$/.test(bloom)) {
  2422          return true;
  2423      }
  2424      return false;
  2425  };
  2426  
  2427  /**
  2428   * Returns true if given string is a valid log topic.
  2429   *
  2430   * @method isTopic
  2431   * @param {String} hex encoded topic
  2432   * @return {Boolean}
  2433   */
  2434  var isTopic = function (topic) {
  2435      if (!/^(0x)?[0-9a-f]{64}$/i.test(topic)) {
  2436          return false;
  2437      } else if (/^(0x)?[0-9a-f]{64}$/.test(topic) || /^(0x)?[0-9A-F]{64}$/.test(topic)) {
  2438          return true;
  2439      }
  2440      return false;
  2441  };
  2442  
  2443  module.exports = {
  2444      padLeft: padLeft,
  2445      padRight: padRight,
  2446      toHex: toHex,
  2447      toDecimal: toDecimal,
  2448      fromDecimal: fromDecimal,
  2449      toUtf8: toUtf8,
  2450      toAscii: toAscii,
  2451      fromUtf8: fromUtf8,
  2452      fromAscii: fromAscii,
  2453      transformToFullName: transformToFullName,
  2454      extractDisplayName: extractDisplayName,
  2455      extractTypeName: extractTypeName,
  2456      toWei: toWei,
  2457      fromWei: fromWei,
  2458      toBigNumber: toBigNumber,
  2459      toTwosComplement: toTwosComplement,
  2460      toAddress: toAddress,
  2461      isBigNumber: isBigNumber,
  2462      isStrictAddress: isStrictAddress,
  2463      isAddress: isAddress,
  2464      isChecksumAddress: isChecksumAddress,
  2465      toChecksumAddress: toChecksumAddress,
  2466      isFunction: isFunction,
  2467      isString: isString,
  2468      isObject: isObject,
  2469      isBoolean: isBoolean,
  2470      isArray: isArray,
  2471      isJson: isJson,
  2472      isBloom: isBloom,
  2473      isTopic: isTopic,
  2474  };
  2475  
  2476  },{"./sha3.js":19,"bignumber.js":"bignumber.js","utf8":85}],21:[function(require,module,exports){
  2477  module.exports={
  2478      "version": "0.20.1"
  2479  }
  2480  
  2481  },{}],22:[function(require,module,exports){
  2482  /*
  2483      This file is part of web3.js.
  2484  
  2485      web3.js is free software: you can redistribute it and/or modify
  2486      it under the terms of the GNU Lesser General Public License as published by
  2487      the Free Software Foundation, either version 3 of the License, or
  2488      (at your option) any later version.
  2489  
  2490      web3.js is distributed in the hope that it will be useful,
  2491      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2492      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2493      GNU Lesser General Public License for more details.
  2494  
  2495      You should have received a copy of the GNU Lesser General Public License
  2496      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2497  */
  2498  /**
  2499   * @file web3.js
  2500   * @authors:
  2501   *   Jeffrey Wilcke <jeff@ethdev.com>
  2502   *   Marek Kotewicz <marek@ethdev.com>
  2503   *   Marian Oancea <marian@ethdev.com>
  2504   *   Fabian Vogelsteller <fabian@ethdev.com>
  2505   *   Gav Wood <g@ethdev.com>
  2506   * @date 2014
  2507   */
  2508  
  2509  var RequestManager = require('./web3/requestmanager');
  2510  var Iban = require('./web3/iban');
  2511  var Eth = require('./web3/methods/eth');
  2512  var DB = require('./web3/methods/db');
  2513  var Shh = require('./web3/methods/shh');
  2514  var Net = require('./web3/methods/net');
  2515  var Personal = require('./web3/methods/personal');
  2516  var Swarm = require('./web3/methods/swarm');
  2517  var Settings = require('./web3/settings');
  2518  var version = require('./version.json');
  2519  var utils = require('./utils/utils');
  2520  var sha3 = require('./utils/sha3');
  2521  var extend = require('./web3/extend');
  2522  var Batch = require('./web3/batch');
  2523  var Property = require('./web3/property');
  2524  var HttpProvider = require('./web3/httpprovider');
  2525  var IpcProvider = require('./web3/ipcprovider');
  2526  var BigNumber = require('bignumber.js');
  2527  
  2528  
  2529  
  2530  function Web3 (provider) {
  2531      this._requestManager = new RequestManager(provider);
  2532      this.currentProvider = provider;
  2533      this.eth = new Eth(this);
  2534      this.db = new DB(this);
  2535      this.shh = new Shh(this);
  2536      this.net = new Net(this);
  2537      this.personal = new Personal(this);
  2538      this.bzz = new Swarm(this);
  2539      this.settings = new Settings();
  2540      this.version = {
  2541          api: version.version
  2542      };
  2543      this.providers = {
  2544          HttpProvider: HttpProvider,
  2545          IpcProvider: IpcProvider
  2546      };
  2547      this._extend = extend(this);
  2548      this._extend({
  2549          properties: properties()
  2550      });
  2551  }
  2552  
  2553  // expose providers on the class
  2554  Web3.providers = {
  2555      HttpProvider: HttpProvider,
  2556      IpcProvider: IpcProvider
  2557  };
  2558  
  2559  Web3.prototype.setProvider = function (provider) {
  2560      this._requestManager.setProvider(provider);
  2561      this.currentProvider = provider;
  2562  };
  2563  
  2564  Web3.prototype.reset = function (keepIsSyncing) {
  2565      this._requestManager.reset(keepIsSyncing);
  2566      this.settings = new Settings();
  2567  };
  2568  
  2569  Web3.prototype.BigNumber = BigNumber;
  2570  Web3.prototype.toHex = utils.toHex;
  2571  Web3.prototype.toAscii = utils.toAscii;
  2572  Web3.prototype.toUtf8 = utils.toUtf8;
  2573  Web3.prototype.fromAscii = utils.fromAscii;
  2574  Web3.prototype.fromUtf8 = utils.fromUtf8;
  2575  Web3.prototype.toDecimal = utils.toDecimal;
  2576  Web3.prototype.fromDecimal = utils.fromDecimal;
  2577  Web3.prototype.toBigNumber = utils.toBigNumber;
  2578  Web3.prototype.toWei = utils.toWei;
  2579  Web3.prototype.fromWei = utils.fromWei;
  2580  Web3.prototype.isAddress = utils.isAddress;
  2581  Web3.prototype.isChecksumAddress = utils.isChecksumAddress;
  2582  Web3.prototype.toChecksumAddress = utils.toChecksumAddress;
  2583  Web3.prototype.isIBAN = utils.isIBAN;
  2584  Web3.prototype.padLeft = utils.padLeft;
  2585  Web3.prototype.padRight = utils.padRight;
  2586  
  2587  
  2588  Web3.prototype.sha3 = function(string, options) {
  2589      return '0x' + sha3(string, options);
  2590  };
  2591  
  2592  /**
  2593   * Transforms direct icap to address
  2594   */
  2595  Web3.prototype.fromICAP = function (icap) {
  2596      var iban = new Iban(icap);
  2597      return iban.address();
  2598  };
  2599  
  2600  var properties = function () {
  2601      return [
  2602          new Property({
  2603              name: 'version.node',
  2604              getter: 'web3_clientVersion'
  2605          }),
  2606          new Property({
  2607              name: 'version.network',
  2608              getter: 'net_version',
  2609              inputFormatter: utils.toDecimal
  2610          }),
  2611          new Property({
  2612              name: 'version.ethereum',
  2613              getter: 'eth_protocolVersion',
  2614              inputFormatter: utils.toDecimal
  2615          }),
  2616          new Property({
  2617              name: 'version.whisper',
  2618              getter: 'shh_version',
  2619              inputFormatter: utils.toDecimal
  2620          })
  2621      ];
  2622  };
  2623  
  2624  Web3.prototype.isConnected = function(){
  2625      return (this.currentProvider && this.currentProvider.isConnected());
  2626  };
  2627  
  2628  Web3.prototype.createBatch = function () {
  2629      return new Batch(this);
  2630  };
  2631  
  2632  module.exports = Web3;
  2633  
  2634  
  2635  },{"./utils/sha3":19,"./utils/utils":20,"./version.json":21,"./web3/batch":24,"./web3/extend":28,"./web3/httpprovider":32,"./web3/iban":33,"./web3/ipcprovider":34,"./web3/methods/db":37,"./web3/methods/eth":38,"./web3/methods/net":39,"./web3/methods/personal":40,"./web3/methods/shh":41,"./web3/methods/swarm":42,"./web3/property":45,"./web3/requestmanager":46,"./web3/settings":47,"bignumber.js":"bignumber.js"}],23:[function(require,module,exports){
  2636  /*
  2637      This file is part of web3.js.
  2638  
  2639      web3.js is free software: you can redistribute it and/or modify
  2640      it under the terms of the GNU Lesser General Public License as published by
  2641      the Free Software Foundation, either version 3 of the License, or
  2642      (at your option) any later version.
  2643  
  2644      web3.js is distributed in the hope that it will be useful,
  2645      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2646      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2647      GNU Lesser General Public License for more details.
  2648  
  2649      You should have received a copy of the GNU Lesser General Public License
  2650      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2651  */
  2652  /**
  2653   * @file allevents.js
  2654   * @author Marek Kotewicz <marek@ethdev.com>
  2655   * @date 2014
  2656   */
  2657  
  2658  var sha3 = require('../utils/sha3');
  2659  var SolidityEvent = require('./event');
  2660  var formatters = require('./formatters');
  2661  var utils = require('../utils/utils');
  2662  var Filter = require('./filter');
  2663  var watches = require('./methods/watches');
  2664  
  2665  var AllSolidityEvents = function (requestManager, json, address) {
  2666      this._requestManager = requestManager;
  2667      this._json = json;
  2668      this._address = address;
  2669  };
  2670  
  2671  AllSolidityEvents.prototype.encode = function (options) {
  2672      options = options || {};
  2673      var result = {};
  2674  
  2675      ['fromBlock', 'toBlock'].filter(function (f) {
  2676          return options[f] !== undefined;
  2677      }).forEach(function (f) {
  2678          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  2679      });
  2680  
  2681      result.address = this._address;
  2682  
  2683      return result;
  2684  };
  2685  
  2686  AllSolidityEvents.prototype.decode = function (data) {
  2687      data.data = data.data || '';
  2688      data.topics = data.topics || [];
  2689  
  2690      var eventTopic = data.topics[0].slice(2);
  2691      var match = this._json.filter(function (j) {
  2692          return eventTopic === sha3(utils.transformToFullName(j));
  2693      })[0];
  2694  
  2695      if (!match) { // cannot find matching event?
  2696          console.warn('cannot find event for log');
  2697          return data;
  2698      }
  2699  
  2700      var event = new SolidityEvent(this._requestManager, match, this._address);
  2701      return event.decode(data);
  2702  };
  2703  
  2704  AllSolidityEvents.prototype.execute = function (options, callback) {
  2705  
  2706      if (utils.isFunction(arguments[arguments.length - 1])) {
  2707          callback = arguments[arguments.length - 1];
  2708          if(arguments.length === 1)
  2709              options = null;
  2710      }
  2711  
  2712      var o = this.encode(options);
  2713      var formatter = this.decode.bind(this);
  2714      return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback);
  2715  };
  2716  
  2717  AllSolidityEvents.prototype.attachToContract = function (contract) {
  2718      var execute = this.execute.bind(this);
  2719      contract.allEvents = execute;
  2720  };
  2721  
  2722  module.exports = AllSolidityEvents;
  2723  
  2724  
  2725  },{"../utils/sha3":19,"../utils/utils":20,"./event":27,"./filter":29,"./formatters":30,"./methods/watches":43}],24:[function(require,module,exports){
  2726  /*
  2727      This file is part of web3.js.
  2728  
  2729      web3.js is free software: you can redistribute it and/or modify
  2730      it under the terms of the GNU Lesser General Public License as published by
  2731      the Free Software Foundation, either version 3 of the License, or
  2732      (at your option) any later version.
  2733  
  2734      web3.js is distributed in the hope that it will be useful,
  2735      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2736      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2737      GNU Lesser General Public License for more details.
  2738  
  2739      You should have received a copy of the GNU Lesser General Public License
  2740      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2741  */
  2742  /** 
  2743   * @file batch.js
  2744   * @author Marek Kotewicz <marek@ethdev.com>
  2745   * @date 2015
  2746   */
  2747  
  2748  var Jsonrpc = require('./jsonrpc');
  2749  var errors = require('./errors');
  2750  
  2751  var Batch = function (web3) {
  2752      this.requestManager = web3._requestManager;
  2753      this.requests = [];
  2754  };
  2755  
  2756  /**
  2757   * Should be called to add create new request to batch request
  2758   *
  2759   * @method add
  2760   * @param {Object} jsonrpc requet object
  2761   */
  2762  Batch.prototype.add = function (request) {
  2763      this.requests.push(request);
  2764  };
  2765  
  2766  /**
  2767   * Should be called to execute batch request
  2768   *
  2769   * @method execute
  2770   */
  2771  Batch.prototype.execute = function () {
  2772      var requests = this.requests;
  2773      this.requestManager.sendBatch(requests, function (err, results) {
  2774          results = results || [];
  2775          requests.map(function (request, index) {
  2776              return results[index] || {};
  2777          }).forEach(function (result, index) {
  2778              if (requests[index].callback) {
  2779  
  2780                  if (!Jsonrpc.isValidResponse(result)) {
  2781                      return requests[index].callback(errors.InvalidResponse(result));
  2782                  }
  2783  
  2784                  requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));
  2785              }
  2786          });
  2787      }); 
  2788  };
  2789  
  2790  module.exports = Batch;
  2791  
  2792  
  2793  },{"./errors":26,"./jsonrpc":35}],25:[function(require,module,exports){
  2794  /*
  2795      This file is part of web3.js.
  2796  
  2797      web3.js is free software: you can redistribute it and/or modify
  2798      it under the terms of the GNU Lesser General Public License as published by
  2799      the Free Software Foundation, either version 3 of the License, or
  2800      (at your option) any later version.
  2801  
  2802      web3.js is distributed in the hope that it will be useful,
  2803      but WITHOUT ANY WARRANTY; without even the implied warranty of
  2804      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  2805      GNU Lesser General Public License for more details.
  2806  
  2807      You should have received a copy of the GNU Lesser General Public License
  2808      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  2809  */
  2810  /**
  2811   * @file contract.js
  2812   * @author Marek Kotewicz <marek@ethdev.com>
  2813   * @date 2014
  2814   */
  2815  
  2816  var utils = require('../utils/utils');
  2817  var coder = require('../solidity/coder');
  2818  var SolidityEvent = require('./event');
  2819  var SolidityFunction = require('./function');
  2820  var AllEvents = require('./allevents');
  2821  
  2822  /**
  2823   * Should be called to encode constructor params
  2824   *
  2825   * @method encodeConstructorParams
  2826   * @param {Array} abi
  2827   * @param {Array} constructor params
  2828   */
  2829  var encodeConstructorParams = function (abi, params) {
  2830      return abi.filter(function (json) {
  2831          return json.type === 'constructor' && json.inputs.length === params.length;
  2832      }).map(function (json) {
  2833          return json.inputs.map(function (input) {
  2834              return input.type;
  2835          });
  2836      }).map(function (types) {
  2837          return coder.encodeParams(types, params);
  2838      })[0] || '';
  2839  };
  2840  
  2841  /**
  2842   * Should be called to add functions to contract object
  2843   *
  2844   * @method addFunctionsToContract
  2845   * @param {Contract} contract
  2846   * @param {Array} abi
  2847   */
  2848  var addFunctionsToContract = function (contract) {
  2849      contract.abi.filter(function (json) {
  2850          return json.type === 'function';
  2851      }).map(function (json) {
  2852          return new SolidityFunction(contract._eth, json, contract.address);
  2853      }).forEach(function (f) {
  2854          f.attachToContract(contract);
  2855      });
  2856  };
  2857  
  2858  /**
  2859   * Should be called to add events to contract object
  2860   *
  2861   * @method addEventsToContract
  2862   * @param {Contract} contract
  2863   * @param {Array} abi
  2864   */
  2865  var addEventsToContract = function (contract) {
  2866      var events = contract.abi.filter(function (json) {
  2867          return json.type === 'event';
  2868      });
  2869  
  2870      var All = new AllEvents(contract._eth._requestManager, events, contract.address);
  2871      All.attachToContract(contract);
  2872  
  2873      events.map(function (json) {
  2874          return new SolidityEvent(contract._eth._requestManager, json, contract.address);
  2875      }).forEach(function (e) {
  2876          e.attachToContract(contract);
  2877      });
  2878  };
  2879  
  2880  
  2881  /**
  2882   * Should be called to check if the contract gets properly deployed on the blockchain.
  2883   *
  2884   * @method checkForContractAddress
  2885   * @param {Object} contract
  2886   * @param {Function} callback
  2887   * @returns {Undefined}
  2888   */
  2889  var checkForContractAddress = function(contract, callback){
  2890      var count = 0,
  2891          callbackFired = false;
  2892  
  2893      // wait for receipt
  2894      var filter = contract._eth.filter('latest', function(e){
  2895          if (!e && !callbackFired) {
  2896              count++;
  2897  
  2898              // stop watching after 50 blocks (timeout)
  2899              if (count > 50) {
  2900  
  2901                  filter.stopWatching(function() {});
  2902                  callbackFired = true;
  2903  
  2904                  if (callback)
  2905                      callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
  2906                  else
  2907                      throw new Error('Contract transaction couldn\'t be found after 50 blocks');
  2908  
  2909  
  2910              } else {
  2911  
  2912                  contract._eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
  2913                      if(receipt && !callbackFired) {
  2914  
  2915                          contract._eth.getCode(receipt.contractAddress, function(e, code){
  2916                              /*jshint maxcomplexity: 6 */
  2917  
  2918                              if(callbackFired || !code)
  2919                                  return;
  2920  
  2921                              filter.stopWatching(function() {});
  2922                              callbackFired = true;
  2923  
  2924                              if(code.length > 3) {
  2925  
  2926                                  // console.log('Contract code deployed!');
  2927  
  2928                                  contract.address = receipt.contractAddress;
  2929  
  2930                                  // attach events and methods again after we have
  2931                                  addFunctionsToContract(contract);
  2932                                  addEventsToContract(contract);
  2933  
  2934                                  // call callback for the second time
  2935                                  if(callback)
  2936                                      callback(null, contract);
  2937  
  2938                              } else {
  2939                                  if(callback)
  2940                                      callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
  2941                                  else
  2942                                      throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
  2943                              }
  2944                          });
  2945                      }
  2946                  });
  2947              }
  2948          }
  2949      });
  2950  };
  2951  
  2952  /**
  2953   * Should be called to create new ContractFactory instance
  2954   *
  2955   * @method ContractFactory
  2956   * @param {Array} abi
  2957   */
  2958  var ContractFactory = function (eth, abi) {
  2959      this.eth = eth;
  2960      this.abi = abi;
  2961  
  2962      /**
  2963       * Should be called to create new contract on a blockchain
  2964       *
  2965       * @method new
  2966       * @param {Any} contract constructor param1 (optional)
  2967       * @param {Any} contract constructor param2 (optional)
  2968       * @param {Object} contract transaction object (required)
  2969       * @param {Function} callback
  2970       * @returns {Contract} returns contract instance
  2971       */
  2972      this.new = function () {
  2973          /*jshint maxcomplexity: 7 */
  2974          
  2975          var contract = new Contract(this.eth, this.abi);
  2976  
  2977          // parse arguments
  2978          var options = {}; // required!
  2979          var callback;
  2980  
  2981          var args = Array.prototype.slice.call(arguments);
  2982          if (utils.isFunction(args[args.length - 1])) {
  2983              callback = args.pop();
  2984          }
  2985  
  2986          var last = args[args.length - 1];
  2987          if (utils.isObject(last) && !utils.isArray(last)) {
  2988              options = args.pop();
  2989          }
  2990  
  2991          if (options.value > 0) {
  2992              var constructorAbi = abi.filter(function (json) {
  2993                  return json.type === 'constructor' && json.inputs.length === args.length;
  2994              })[0] || {};
  2995  
  2996              if (!constructorAbi.payable) {
  2997                  throw new Error('Cannot send value to non-payable constructor');
  2998              }
  2999          }
  3000  
  3001          var bytes = encodeConstructorParams(this.abi, args);
  3002          options.data += bytes;
  3003  
  3004          if (callback) {
  3005  
  3006              // wait for the contract address and check if the code was deployed
  3007              this.eth.sendTransaction(options, function (err, hash) {
  3008                  if (err) {
  3009                      callback(err);
  3010                  } else {
  3011                      // add the transaction hash
  3012                      contract.transactionHash = hash;
  3013  
  3014                      // call callback for the first time
  3015                      callback(null, contract);
  3016  
  3017                      checkForContractAddress(contract, callback);
  3018                  }
  3019              });
  3020          } else {
  3021              var hash = this.eth.sendTransaction(options);
  3022              // add the transaction hash
  3023              contract.transactionHash = hash;
  3024              checkForContractAddress(contract);
  3025          }
  3026  
  3027          return contract;
  3028      };
  3029  
  3030      this.new.getData = this.getData.bind(this);
  3031  };
  3032  
  3033  /**
  3034   * Should be called to create new ContractFactory
  3035   *
  3036   * @method contract
  3037   * @param {Array} abi
  3038   * @returns {ContractFactory} new contract factory
  3039   */
  3040  //var contract = function (abi) {
  3041      //return new ContractFactory(abi);
  3042  //};
  3043  
  3044  
  3045  
  3046  /**
  3047   * Should be called to get access to existing contract on a blockchain
  3048   *
  3049   * @method at
  3050   * @param {Address} contract address (required)
  3051   * @param {Function} callback {optional)
  3052   * @returns {Contract} returns contract if no callback was passed,
  3053   * otherwise calls callback function (err, contract)
  3054   */
  3055  ContractFactory.prototype.at = function (address, callback) {
  3056      var contract = new Contract(this.eth, this.abi, address);
  3057  
  3058      // this functions are not part of prototype,
  3059      // because we don't want to spoil the interface
  3060      addFunctionsToContract(contract);
  3061      addEventsToContract(contract);
  3062  
  3063      if (callback) {
  3064          callback(null, contract);
  3065      }
  3066      return contract;
  3067  };
  3068  
  3069  /**
  3070   * Gets the data, which is data to deploy plus constructor params
  3071   *
  3072   * @method getData
  3073   */
  3074  ContractFactory.prototype.getData = function () {
  3075      var options = {}; // required!
  3076      var args = Array.prototype.slice.call(arguments);
  3077  
  3078      var last = args[args.length - 1];
  3079      if (utils.isObject(last) && !utils.isArray(last)) {
  3080          options = args.pop();
  3081      }
  3082  
  3083      var bytes = encodeConstructorParams(this.abi, args);
  3084      options.data += bytes;
  3085  
  3086      return options.data;
  3087  };
  3088  
  3089  /**
  3090   * Should be called to create new contract instance
  3091   *
  3092   * @method Contract
  3093   * @param {Array} abi
  3094   * @param {Address} contract address
  3095   */
  3096  var Contract = function (eth, abi, address) {
  3097      this._eth = eth;
  3098      this.transactionHash = null;
  3099      this.address = address;
  3100      this.abi = abi;
  3101  };
  3102  
  3103  module.exports = ContractFactory;
  3104  
  3105  },{"../solidity/coder":7,"../utils/utils":20,"./allevents":23,"./event":27,"./function":31}],26:[function(require,module,exports){
  3106  /*
  3107      This file is part of web3.js.
  3108  
  3109      web3.js is free software: you can redistribute it and/or modify
  3110      it under the terms of the GNU Lesser General Public License as published by
  3111      the Free Software Foundation, either version 3 of the License, or
  3112      (at your option) any later version.
  3113  
  3114      web3.js is distributed in the hope that it will be useful,
  3115      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3116      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3117      GNU Lesser General Public License for more details.
  3118  
  3119      You should have received a copy of the GNU Lesser General Public License
  3120      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3121  */
  3122  /** 
  3123   * @file errors.js
  3124   * @author Marek Kotewicz <marek@ethdev.com>
  3125   * @date 2015
  3126   */
  3127  
  3128  module.exports = {
  3129      InvalidNumberOfSolidityArgs: function () {
  3130          return new Error('Invalid number of arguments to Solidity function');
  3131      },
  3132      InvalidNumberOfRPCParams: function () {
  3133          return new Error('Invalid number of input parameters to RPC method');
  3134      },
  3135      InvalidConnection: function (host){
  3136          return new Error('CONNECTION ERROR: Couldn\'t connect to node '+ host +'.');
  3137      },
  3138      InvalidProvider: function () {
  3139          return new Error('Provider not set or invalid');
  3140      },
  3141      InvalidResponse: function (result){
  3142          var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: ' + JSON.stringify(result);
  3143          return new Error(message);
  3144      },
  3145      ConnectionTimeout: function (ms){
  3146          return new Error('CONNECTION TIMEOUT: timeout of ' + ms + ' ms achived');
  3147      }
  3148  };
  3149  
  3150  },{}],27:[function(require,module,exports){
  3151  /*
  3152      This file is part of web3.js.
  3153  
  3154      web3.js is free software: you can redistribute it and/or modify
  3155      it under the terms of the GNU Lesser General Public License as published by
  3156      the Free Software Foundation, either version 3 of the License, or
  3157      (at your option) any later version.
  3158  
  3159      web3.js is distributed in the hope that it will be useful,
  3160      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3161      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3162      GNU Lesser General Public License for more details.
  3163  
  3164      You should have received a copy of the GNU Lesser General Public License
  3165      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3166  */
  3167  /**
  3168   * @file event.js
  3169   * @author Marek Kotewicz <marek@ethdev.com>
  3170   * @date 2014
  3171   */
  3172  
  3173  var utils = require('../utils/utils');
  3174  var coder = require('../solidity/coder');
  3175  var formatters = require('./formatters');
  3176  var sha3 = require('../utils/sha3');
  3177  var Filter = require('./filter');
  3178  var watches = require('./methods/watches');
  3179  
  3180  /**
  3181   * This prototype should be used to create event filters
  3182   */
  3183  var SolidityEvent = function (requestManager, json, address) {
  3184      this._requestManager = requestManager;
  3185      this._params = json.inputs;
  3186      this._name = utils.transformToFullName(json);
  3187      this._address = address;
  3188      this._anonymous = json.anonymous;
  3189  };
  3190  
  3191  /**
  3192   * Should be used to get filtered param types
  3193   *
  3194   * @method types
  3195   * @param {Bool} decide if returned typed should be indexed
  3196   * @return {Array} array of types
  3197   */
  3198  SolidityEvent.prototype.types = function (indexed) {
  3199      return this._params.filter(function (i) {
  3200          return i.indexed === indexed;
  3201      }).map(function (i) {
  3202          return i.type;
  3203      });
  3204  };
  3205  
  3206  /**
  3207   * Should be used to get event display name
  3208   *
  3209   * @method displayName
  3210   * @return {String} event display name
  3211   */
  3212  SolidityEvent.prototype.displayName = function () {
  3213      return utils.extractDisplayName(this._name);
  3214  };
  3215  
  3216  /**
  3217   * Should be used to get event type name
  3218   *
  3219   * @method typeName
  3220   * @return {String} event type name
  3221   */
  3222  SolidityEvent.prototype.typeName = function () {
  3223      return utils.extractTypeName(this._name);
  3224  };
  3225  
  3226  /**
  3227   * Should be used to get event signature
  3228   *
  3229   * @method signature
  3230   * @return {String} event signature
  3231   */
  3232  SolidityEvent.prototype.signature = function () {
  3233      return sha3(this._name);
  3234  };
  3235  
  3236  /**
  3237   * Should be used to encode indexed params and options to one final object
  3238   *
  3239   * @method encode
  3240   * @param {Object} indexed
  3241   * @param {Object} options
  3242   * @return {Object} everything combined together and encoded
  3243   */
  3244  SolidityEvent.prototype.encode = function (indexed, options) {
  3245      indexed = indexed || {};
  3246      options = options || {};
  3247      var result = {};
  3248  
  3249      ['fromBlock', 'toBlock'].filter(function (f) {
  3250          return options[f] !== undefined;
  3251      }).forEach(function (f) {
  3252          result[f] = formatters.inputBlockNumberFormatter(options[f]);
  3253      });
  3254  
  3255      result.topics = [];
  3256  
  3257      result.address = this._address;
  3258      if (!this._anonymous) {
  3259          result.topics.push('0x' + this.signature());
  3260      }
  3261  
  3262      var indexedTopics = this._params.filter(function (i) {
  3263          return i.indexed === true;
  3264      }).map(function (i) {
  3265          var value = indexed[i.name];
  3266          if (value === undefined || value === null) {
  3267              return null;
  3268          }
  3269  
  3270          if (utils.isArray(value)) {
  3271              return value.map(function (v) {
  3272                  return '0x' + coder.encodeParam(i.type, v);
  3273              });
  3274          }
  3275          return '0x' + coder.encodeParam(i.type, value);
  3276      });
  3277  
  3278      result.topics = result.topics.concat(indexedTopics);
  3279  
  3280      return result;
  3281  };
  3282  
  3283  /**
  3284   * Should be used to decode indexed params and options
  3285   *
  3286   * @method decode
  3287   * @param {Object} data
  3288   * @return {Object} result object with decoded indexed && not indexed params
  3289   */
  3290  SolidityEvent.prototype.decode = function (data) {
  3291  
  3292      data.data = data.data || '';
  3293      data.topics = data.topics || [];
  3294  
  3295      var argTopics = this._anonymous ? data.topics : data.topics.slice(1);
  3296      var indexedData = argTopics.map(function (topics) { return topics.slice(2); }).join("");
  3297      var indexedParams = coder.decodeParams(this.types(true), indexedData);
  3298  
  3299      var notIndexedData = data.data.slice(2);
  3300      var notIndexedParams = coder.decodeParams(this.types(false), notIndexedData);
  3301  
  3302      var result = formatters.outputLogFormatter(data);
  3303      result.event = this.displayName();
  3304      result.address = data.address;
  3305  
  3306      result.args = this._params.reduce(function (acc, current) {
  3307          acc[current.name] = current.indexed ? indexedParams.shift() : notIndexedParams.shift();
  3308          return acc;
  3309      }, {});
  3310  
  3311      delete result.data;
  3312      delete result.topics;
  3313  
  3314      return result;
  3315  };
  3316  
  3317  /**
  3318   * Should be used to create new filter object from event
  3319   *
  3320   * @method execute
  3321   * @param {Object} indexed
  3322   * @param {Object} options
  3323   * @return {Object} filter object
  3324   */
  3325  SolidityEvent.prototype.execute = function (indexed, options, callback) {
  3326  
  3327      if (utils.isFunction(arguments[arguments.length - 1])) {
  3328          callback = arguments[arguments.length - 1];
  3329          if(arguments.length === 2)
  3330              options = null;
  3331          if(arguments.length === 1) {
  3332              options = null;
  3333              indexed = {};
  3334          }
  3335      }
  3336  
  3337      var o = this.encode(indexed, options);
  3338      var formatter = this.decode.bind(this);
  3339      return new Filter(o, 'eth', this._requestManager, watches.eth(), formatter, callback);
  3340  };
  3341  
  3342  /**
  3343   * Should be used to attach event to contract object
  3344   *
  3345   * @method attachToContract
  3346   * @param {Contract}
  3347   */
  3348  SolidityEvent.prototype.attachToContract = function (contract) {
  3349      var execute = this.execute.bind(this);
  3350      var displayName = this.displayName();
  3351      if (!contract[displayName]) {
  3352          contract[displayName] = execute;
  3353      }
  3354      contract[displayName][this.typeName()] = this.execute.bind(this, contract);
  3355  };
  3356  
  3357  module.exports = SolidityEvent;
  3358  
  3359  
  3360  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./filter":29,"./formatters":30,"./methods/watches":43}],28:[function(require,module,exports){
  3361  var formatters = require('./formatters');
  3362  var utils = require('./../utils/utils');
  3363  var Method = require('./method');
  3364  var Property = require('./property');
  3365  
  3366  // TODO: refactor, so the input params are not altered.
  3367  // it's necessary to make same 'extension' work with multiple providers
  3368  var extend = function (web3) {
  3369      /* jshint maxcomplexity:5 */
  3370      var ex = function (extension) {
  3371  
  3372          var extendedObject;
  3373          if (extension.property) {
  3374              if (!web3[extension.property]) {
  3375                  web3[extension.property] = {};
  3376              }
  3377              extendedObject = web3[extension.property];
  3378          } else {
  3379              extendedObject = web3;
  3380          }
  3381  
  3382          if (extension.methods) {
  3383              extension.methods.forEach(function (method) {
  3384                  method.attachToObject(extendedObject);
  3385                  method.setRequestManager(web3._requestManager);
  3386              });
  3387          }
  3388  
  3389          if (extension.properties) {
  3390              extension.properties.forEach(function (property) {
  3391                  property.attachToObject(extendedObject);
  3392                  property.setRequestManager(web3._requestManager);
  3393              });
  3394          }
  3395      };
  3396  
  3397      ex.formatters = formatters; 
  3398      ex.utils = utils;
  3399      ex.Method = Method;
  3400      ex.Property = Property;
  3401  
  3402      return ex;
  3403  };
  3404  
  3405  
  3406  
  3407  module.exports = extend;
  3408  
  3409  
  3410  },{"./../utils/utils":20,"./formatters":30,"./method":36,"./property":45}],29:[function(require,module,exports){
  3411  /*
  3412      This file is part of web3.js.
  3413  
  3414      web3.js is free software: you can redistribute it and/or modify
  3415      it under the terms of the GNU Lesser General Public License as published by
  3416      the Free Software Foundation, either version 3 of the License, or
  3417      (at your option) any later version.
  3418  
  3419      web3.js is distributed in the hope that it will be useful,
  3420      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3421      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3422      GNU Lesser General Public License for more details.
  3423  
  3424      You should have received a copy of the GNU Lesser General Public License
  3425      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3426  */
  3427  /** @file filter.js
  3428   * @authors:
  3429   *   Jeffrey Wilcke <jeff@ethdev.com>
  3430   *   Marek Kotewicz <marek@ethdev.com>
  3431   *   Marian Oancea <marian@ethdev.com>
  3432   *   Fabian Vogelsteller <fabian@ethdev.com>
  3433   *   Gav Wood <g@ethdev.com>
  3434   * @date 2014
  3435   */
  3436  
  3437  var formatters = require('./formatters');
  3438  var utils = require('../utils/utils');
  3439  
  3440  /**
  3441  * Converts a given topic to a hex string, but also allows null values.
  3442  *
  3443  * @param {Mixed} value
  3444  * @return {String}
  3445  */
  3446  var toTopic = function(value){
  3447  
  3448      if(value === null || typeof value === 'undefined')
  3449          return null;
  3450  
  3451      value = String(value);
  3452  
  3453      if(value.indexOf('0x') === 0)
  3454          return value;
  3455      else
  3456          return utils.fromUtf8(value);
  3457  };
  3458  
  3459  /// This method should be called on options object, to verify deprecated properties && lazy load dynamic ones
  3460  /// @param should be string or object
  3461  /// @returns options string or object
  3462  var getOptions = function (options, type) {
  3463      /*jshint maxcomplexity: 6 */
  3464  
  3465      if (utils.isString(options)) {
  3466          return options;
  3467      }
  3468  
  3469      options = options || {};
  3470  
  3471  
  3472      switch(type) {
  3473          case 'eth':
  3474  
  3475              // make sure topics, get converted to hex
  3476              options.topics = options.topics || [];
  3477              options.topics = options.topics.map(function(topic){
  3478                  return (utils.isArray(topic)) ? topic.map(toTopic) : toTopic(topic);
  3479              });
  3480  
  3481              return {
  3482                  topics: options.topics,
  3483                  from: options.from,
  3484                  to: options.to,
  3485                  address: options.address,
  3486                  fromBlock: formatters.inputBlockNumberFormatter(options.fromBlock),
  3487                  toBlock: formatters.inputBlockNumberFormatter(options.toBlock)
  3488              };
  3489          case 'shh':
  3490              return options;
  3491      }
  3492  };
  3493  
  3494  /**
  3495  Adds the callback and sets up the methods, to iterate over the results.
  3496  
  3497  @method getLogsAtStart
  3498  @param {Object} self
  3499  @param {function} callback
  3500  */
  3501  var getLogsAtStart = function(self, callback){
  3502      // call getFilterLogs for the first watch callback start
  3503      if (!utils.isString(self.options)) {
  3504          self.get(function (err, messages) {
  3505              // don't send all the responses to all the watches again... just to self one
  3506              if (err) {
  3507                  callback(err);
  3508              }
  3509  
  3510              if(utils.isArray(messages)) {
  3511                  messages.forEach(function (message) {
  3512                      callback(null, message);
  3513                  });
  3514              }
  3515          });
  3516      }
  3517  };
  3518  
  3519  /**
  3520  Adds the callback and sets up the methods, to iterate over the results.
  3521  
  3522  @method pollFilter
  3523  @param {Object} self
  3524  */
  3525  var pollFilter = function(self) {
  3526  
  3527      var onMessage = function (error, messages) {
  3528          if (error) {
  3529              return self.callbacks.forEach(function (callback) {
  3530                  callback(error);
  3531              });
  3532          }
  3533  
  3534          if(utils.isArray(messages)) {
  3535              messages.forEach(function (message) {
  3536                  message = self.formatter ? self.formatter(message) : message;
  3537                  self.callbacks.forEach(function (callback) {
  3538                      callback(null, message);
  3539                  });
  3540              });
  3541          }
  3542      };
  3543  
  3544      self.requestManager.startPolling({
  3545          method: self.implementation.poll.call,
  3546          params: [self.filterId],
  3547      }, self.filterId, onMessage, self.stopWatching.bind(self));
  3548  
  3549  };
  3550  
  3551  var Filter = function (options, type, requestManager, methods, formatter, callback, filterCreationErrorCallback) {
  3552      var self = this;
  3553      var implementation = {};
  3554      methods.forEach(function (method) {
  3555          method.setRequestManager(requestManager);
  3556          method.attachToObject(implementation);
  3557      });
  3558      this.requestManager = requestManager;
  3559      this.options = getOptions(options, type);
  3560      this.implementation = implementation;
  3561      this.filterId = null;
  3562      this.callbacks = [];
  3563      this.getLogsCallbacks = [];
  3564      this.pollFilters = [];
  3565      this.formatter = formatter;
  3566      this.implementation.newFilter(this.options, function(error, id){
  3567          if(error) {
  3568              self.callbacks.forEach(function(cb){
  3569                  cb(error);
  3570              });
  3571              if (typeof filterCreationErrorCallback === 'function') {
  3572                filterCreationErrorCallback(error);
  3573              }
  3574          } else {
  3575              self.filterId = id;
  3576  
  3577              // check if there are get pending callbacks as a consequence
  3578              // of calling get() with filterId unassigned.
  3579              self.getLogsCallbacks.forEach(function (cb){
  3580                  self.get(cb);
  3581              });
  3582              self.getLogsCallbacks = [];
  3583  
  3584              // get filter logs for the already existing watch calls
  3585              self.callbacks.forEach(function(cb){
  3586                  getLogsAtStart(self, cb);
  3587              });
  3588              if(self.callbacks.length > 0)
  3589                  pollFilter(self);
  3590  
  3591              // start to watch immediately
  3592              if(typeof callback === 'function') {
  3593                  return self.watch(callback);
  3594              }
  3595          }
  3596      });
  3597  
  3598      return this;
  3599  };
  3600  
  3601  Filter.prototype.watch = function (callback) {
  3602      this.callbacks.push(callback);
  3603  
  3604      if(this.filterId) {
  3605          getLogsAtStart(this, callback);
  3606          pollFilter(this);
  3607      }
  3608  
  3609      return this;
  3610  };
  3611  
  3612  Filter.prototype.stopWatching = function (callback) {
  3613      this.requestManager.stopPolling(this.filterId);
  3614      this.callbacks = [];
  3615      // remove filter async
  3616      if (callback) {
  3617          this.implementation.uninstallFilter(this.filterId, callback);
  3618      } else {
  3619          return this.implementation.uninstallFilter(this.filterId);
  3620      }
  3621  };
  3622  
  3623  Filter.prototype.get = function (callback) {
  3624      var self = this;
  3625      if (utils.isFunction(callback)) {
  3626          if (this.filterId === null) {
  3627              // If filterId is not set yet, call it back
  3628              // when newFilter() assigns it.
  3629              this.getLogsCallbacks.push(callback);
  3630          } else {
  3631              this.implementation.getLogs(this.filterId, function(err, res){
  3632                  if (err) {
  3633                      callback(err);
  3634                  } else {
  3635                      callback(null, res.map(function (log) {
  3636                          return self.formatter ? self.formatter(log) : log;
  3637                      }));
  3638                  }
  3639              });
  3640          }
  3641      } else {
  3642          if (this.filterId === null) {
  3643              throw new Error('Filter ID Error: filter().get() can\'t be chained synchronous, please provide a callback for the get() method.');
  3644          }
  3645          var logs = this.implementation.getLogs(this.filterId);
  3646          return logs.map(function (log) {
  3647              return self.formatter ? self.formatter(log) : log;
  3648          });
  3649      }
  3650  
  3651      return this;
  3652  };
  3653  
  3654  module.exports = Filter;
  3655  
  3656  
  3657  },{"../utils/utils":20,"./formatters":30}],30:[function(require,module,exports){
  3658  'use strict'
  3659  
  3660  /*
  3661      This file is part of web3.js.
  3662  
  3663      web3.js is free software: you can redistribute it and/or modify
  3664      it under the terms of the GNU Lesser General Public License as published by
  3665      the Free Software Foundation, either version 3 of the License, or
  3666      (at your option) any later version.
  3667  
  3668      web3.js is distributed in the hope that it will be useful,
  3669      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3670      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3671      GNU Lesser General Public License for more details.
  3672  
  3673      You should have received a copy of the GNU Lesser General Public License
  3674      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3675  */
  3676  /**
  3677   * @file formatters.js
  3678   * @author Marek Kotewicz <marek@ethdev.com>
  3679   * @author Fabian Vogelsteller <fabian@ethdev.com>
  3680   * @date 2015
  3681   */
  3682  
  3683  var utils = require('../utils/utils');
  3684  var config = require('../utils/config');
  3685  var Iban = require('./iban');
  3686  
  3687  /**
  3688   * Should the format output to a big number
  3689   *
  3690   * @method outputBigNumberFormatter
  3691   * @param {String|Number|BigNumber}
  3692   * @returns {BigNumber} object
  3693   */
  3694  var outputBigNumberFormatter = function (number) {
  3695      return utils.toBigNumber(number);
  3696  };
  3697  
  3698  var isPredefinedBlockNumber = function (blockNumber) {
  3699      return blockNumber === 'latest' || blockNumber === 'pending' || blockNumber === 'earliest';
  3700  };
  3701  
  3702  var inputDefaultBlockNumberFormatter = function (blockNumber) {
  3703      if (blockNumber === undefined) {
  3704          return config.defaultBlock;
  3705      }
  3706      return inputBlockNumberFormatter(blockNumber);
  3707  };
  3708  
  3709  var inputBlockNumberFormatter = function (blockNumber) {
  3710      if (blockNumber === undefined) {
  3711          return undefined;
  3712      } else if (isPredefinedBlockNumber(blockNumber)) {
  3713          return blockNumber;
  3714      }
  3715      return utils.toHex(blockNumber);
  3716  };
  3717  
  3718  /**
  3719   * Formats the input of a transaction and converts all values to HEX
  3720   *
  3721   * @method inputCallFormatter
  3722   * @param {Object} transaction options
  3723   * @returns object
  3724  */
  3725  var inputCallFormatter = function (options){
  3726  
  3727      options.from = options.from || config.defaultAccount;
  3728  
  3729      if (options.from) {
  3730          options.from = inputAddressFormatter(options.from);
  3731      }
  3732  
  3733      if (options.to) { // it might be contract creation
  3734          options.to = inputAddressFormatter(options.to);
  3735      }
  3736  
  3737      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3738          return options[key] !== undefined;
  3739      }).forEach(function(key){
  3740          options[key] = utils.fromDecimal(options[key]);
  3741      });
  3742  
  3743      return options;
  3744  };
  3745  
  3746  /**
  3747   * Formats the input of a transaction and converts all values to HEX
  3748   *
  3749   * @method inputTransactionFormatter
  3750   * @param {Object} transaction options
  3751   * @returns object
  3752  */
  3753  var inputTransactionFormatter = function (options){
  3754  
  3755      options.from = options.from || config.defaultAccount;
  3756      options.from = inputAddressFormatter(options.from);
  3757  
  3758      if (options.to) { // it might be contract creation
  3759          options.to = inputAddressFormatter(options.to);
  3760      }
  3761  
  3762      ['maxFeePerGas', 'maxPriorityFeePerGas', 'gasPrice', 'gas', 'value', 'nonce'].filter(function (key) {
  3763          return options[key] !== undefined;
  3764      }).forEach(function(key){
  3765          options[key] = utils.fromDecimal(options[key]);
  3766      });
  3767  
  3768      return options;
  3769  };
  3770  
  3771  /**
  3772   * Formats the output of a transaction to its proper values
  3773   *
  3774   * @method outputTransactionFormatter
  3775   * @param {Object} tx
  3776   * @returns {Object}
  3777  */
  3778  var outputTransactionFormatter = function (tx){
  3779      if(tx.blockNumber !== null)
  3780          tx.blockNumber = utils.toDecimal(tx.blockNumber);
  3781      if(tx.transactionIndex !== null)
  3782          tx.transactionIndex = utils.toDecimal(tx.transactionIndex);
  3783      tx.nonce = utils.toDecimal(tx.nonce);
  3784      tx.gas = utils.toDecimal(tx.gas);
  3785      tx.gasPrice = utils.toBigNumber(tx.gasPrice);
  3786      if(tx.maxFeePerGas !== undefined) {
  3787        tx.maxFeePerGas = utils.toBigNumber(tx.maxFeePerGas);
  3788      }
  3789      if(tx.maxPriorityFeePerGas !== undefined) {
  3790        tx.maxPriorityFeePerGas = utils.toBigNumber(tx.maxPriorityFeePerGas);
  3791      }
  3792      tx.value = utils.toBigNumber(tx.value);
  3793      return tx;
  3794  };
  3795  
  3796  /**
  3797   * Formats the output of a transaction receipt to its proper values
  3798   *
  3799   * @method outputTransactionReceiptFormatter
  3800   * @param {Object} receipt
  3801   * @returns {Object}
  3802  */
  3803  var outputTransactionReceiptFormatter = function (receipt){
  3804      if(receipt.blockNumber !== null)
  3805          receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
  3806      if(receipt.transactionIndex !== null)
  3807          receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
  3808      receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
  3809      receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
  3810      if(receipt.effectiveGasPrice !== undefined) {
  3811        receipt.effectiveGasPrice = utils.toBigNumber(receipt.effectiveGasPrice);
  3812      }
  3813      if(utils.isArray(receipt.logs)) {
  3814          receipt.logs = receipt.logs.map(function(log){
  3815              return outputLogFormatter(log);
  3816          });
  3817      }
  3818  
  3819      return receipt;
  3820  };
  3821  
  3822  /**
  3823   * Formats the output of a block to its proper values
  3824   *
  3825   * @method outputBlockFormatter
  3826   * @param {Object} block
  3827   * @returns {Object}
  3828  */
  3829  var outputBlockFormatter = function(block) {
  3830      // transform to number
  3831      if (block.baseFeePerGas !== undefined) {
  3832        block.baseFeePerGas = utils.toBigNumber(block.baseFeePerGas);
  3833      }
  3834      block.gasLimit = utils.toDecimal(block.gasLimit);
  3835      block.gasUsed = utils.toDecimal(block.gasUsed);
  3836      block.size = utils.toDecimal(block.size);
  3837      block.timestamp = utils.toDecimal(block.timestamp);
  3838      if(block.number !== null)
  3839          block.number = utils.toDecimal(block.number);
  3840  
  3841      block.difficulty = utils.toBigNumber(block.difficulty);
  3842      block.totalDifficulty = utils.toBigNumber(block.totalDifficulty);
  3843  
  3844      if (utils.isArray(block.transactions)) {
  3845          block.transactions.forEach(function(item){
  3846              if(!utils.isString(item))
  3847                  return outputTransactionFormatter(item);
  3848          });
  3849      }
  3850  
  3851      return block;
  3852  };
  3853  
  3854  /**
  3855   * Formats the output of a log
  3856   *
  3857   * @method outputLogFormatter
  3858   * @param {Object} log object
  3859   * @returns {Object} log
  3860  */
  3861  var outputLogFormatter = function(log) {
  3862      if(log.blockNumber)
  3863          log.blockNumber = utils.toDecimal(log.blockNumber);
  3864      if(log.transactionIndex)
  3865          log.transactionIndex = utils.toDecimal(log.transactionIndex);
  3866      if(log.logIndex)
  3867          log.logIndex = utils.toDecimal(log.logIndex);
  3868  
  3869      return log;
  3870  };
  3871  
  3872  /**
  3873   * Formats the input of a whisper post and converts all values to HEX
  3874   *
  3875   * @method inputPostFormatter
  3876   * @param {Object} transaction object
  3877   * @returns {Object}
  3878  */
  3879  var inputPostFormatter = function(post) {
  3880  
  3881      // post.payload = utils.toHex(post.payload);
  3882      post.ttl = utils.fromDecimal(post.ttl);
  3883      post.workToProve = utils.fromDecimal(post.workToProve);
  3884      post.priority = utils.fromDecimal(post.priority);
  3885  
  3886      // fallback
  3887      if (!utils.isArray(post.topics)) {
  3888          post.topics = post.topics ? [post.topics] : [];
  3889      }
  3890  
  3891      // format the following options
  3892      post.topics = post.topics.map(function(topic){
  3893          // convert only if not hex
  3894          return (topic.indexOf('0x') === 0) ? topic : utils.fromUtf8(topic);
  3895      });
  3896  
  3897      return post;
  3898  };
  3899  
  3900  /**
  3901   * Formats the output of a received post message
  3902   *
  3903   * @method outputPostFormatter
  3904   * @param {Object}
  3905   * @returns {Object}
  3906   */
  3907  var outputPostFormatter = function(post){
  3908  
  3909      post.expiry = utils.toDecimal(post.expiry);
  3910      post.sent = utils.toDecimal(post.sent);
  3911      post.ttl = utils.toDecimal(post.ttl);
  3912      post.workProved = utils.toDecimal(post.workProved);
  3913      // post.payloadRaw = post.payload;
  3914      // post.payload = utils.toAscii(post.payload);
  3915  
  3916      // if (utils.isJson(post.payload)) {
  3917      //     post.payload = JSON.parse(post.payload);
  3918      // }
  3919  
  3920      // format the following options
  3921      if (!post.topics) {
  3922          post.topics = [];
  3923      }
  3924      post.topics = post.topics.map(function(topic){
  3925          return utils.toAscii(topic);
  3926      });
  3927  
  3928      return post;
  3929  };
  3930  
  3931  var inputAddressFormatter = function (address) {
  3932      var iban = new Iban(address);
  3933      if (iban.isValid() && iban.isDirect()) {
  3934          return '0x' + iban.address();
  3935      } else if (utils.isStrictAddress(address)) {
  3936          return address;
  3937      } else if (utils.isAddress(address)) {
  3938          return '0x' + address;
  3939      }
  3940      throw new Error('invalid address');
  3941  };
  3942  
  3943  
  3944  var outputSyncingFormatter = function(result) {
  3945      if (!result) {
  3946          return result;
  3947      }
  3948  
  3949      result.startingBlock = utils.toDecimal(result.startingBlock);
  3950      result.currentBlock = utils.toDecimal(result.currentBlock);
  3951      result.highestBlock = utils.toDecimal(result.highestBlock);
  3952      if (result.knownStates) {
  3953          result.knownStates = utils.toDecimal(result.knownStates);
  3954          result.pulledStates = utils.toDecimal(result.pulledStates);
  3955      }
  3956  
  3957      return result;
  3958  };
  3959  
  3960  module.exports = {
  3961      inputDefaultBlockNumberFormatter: inputDefaultBlockNumberFormatter,
  3962      inputBlockNumberFormatter: inputBlockNumberFormatter,
  3963      inputCallFormatter: inputCallFormatter,
  3964      inputTransactionFormatter: inputTransactionFormatter,
  3965      inputAddressFormatter: inputAddressFormatter,
  3966      inputPostFormatter: inputPostFormatter,
  3967      outputBigNumberFormatter: outputBigNumberFormatter,
  3968      outputTransactionFormatter: outputTransactionFormatter,
  3969      outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
  3970      outputBlockFormatter: outputBlockFormatter,
  3971      outputLogFormatter: outputLogFormatter,
  3972      outputPostFormatter: outputPostFormatter,
  3973      outputSyncingFormatter: outputSyncingFormatter
  3974  };
  3975  
  3976  
  3977  },{"../utils/config":18,"../utils/utils":20,"./iban":33}],31:[function(require,module,exports){
  3978  /*
  3979      This file is part of web3.js.
  3980  
  3981      web3.js is free software: you can redistribute it and/or modify
  3982      it under the terms of the GNU Lesser General Public License as published by
  3983      the Free Software Foundation, either version 3 of the License, or
  3984      (at your option) any later version.
  3985  
  3986      web3.js is distributed in the hope that it will be useful,
  3987      but WITHOUT ANY WARRANTY; without even the implied warranty of
  3988      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  3989      GNU Lesser General Public License for more details.
  3990  
  3991      You should have received a copy of the GNU Lesser General Public License
  3992      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  3993  */
  3994  /**
  3995   * @file function.js
  3996   * @author Marek Kotewicz <marek@ethdev.com>
  3997   * @date 2015
  3998   */
  3999  
  4000  var coder = require('../solidity/coder');
  4001  var utils = require('../utils/utils');
  4002  var errors = require('./errors');
  4003  var formatters = require('./formatters');
  4004  var sha3 = require('../utils/sha3');
  4005  
  4006  /**
  4007   * This prototype should be used to call/sendTransaction to solidity functions
  4008   */
  4009  var SolidityFunction = function (eth, json, address) {
  4010      this._eth = eth;
  4011      this._inputTypes = json.inputs.map(function (i) {
  4012          return i.type;
  4013      });
  4014      this._outputTypes = json.outputs.map(function (i) {
  4015          return i.type;
  4016      });
  4017      this._constant = json.constant;
  4018      this._payable = json.payable;
  4019      this._name = utils.transformToFullName(json);
  4020      this._address = address;
  4021  };
  4022  
  4023  SolidityFunction.prototype.extractCallback = function (args) {
  4024      if (utils.isFunction(args[args.length - 1])) {
  4025          return args.pop(); // modify the args array!
  4026      }
  4027  };
  4028  
  4029  SolidityFunction.prototype.extractDefaultBlock = function (args) {
  4030      if (args.length > this._inputTypes.length && !utils.isObject(args[args.length -1])) {
  4031          return formatters.inputDefaultBlockNumberFormatter(args.pop()); // modify the args array!
  4032      }
  4033  };
  4034  
  4035  /**
  4036   * Should be called to check if the number of arguments is correct
  4037   *
  4038   * @method validateArgs
  4039   * @param {Array} arguments
  4040   * @throws {Error} if it is not
  4041   */
  4042  SolidityFunction.prototype.validateArgs = function (args) {
  4043      var inputArgs = args.filter(function (a) {
  4044        // filter the options object but not arguments that are arrays
  4045        return !( (utils.isObject(a) === true) &&
  4046                  (utils.isArray(a) === false) &&
  4047                  (utils.isBigNumber(a) === false)
  4048                );
  4049      });
  4050      if (inputArgs.length !== this._inputTypes.length) {
  4051          throw errors.InvalidNumberOfSolidityArgs();
  4052      }
  4053  };
  4054  
  4055  /**
  4056   * Should be used to create payload from arguments
  4057   *
  4058   * @method toPayload
  4059   * @param {Array} solidity function params
  4060   * @param {Object} optional payload options
  4061   */
  4062  SolidityFunction.prototype.toPayload = function (args) {
  4063      var options = {};
  4064      if (args.length > this._inputTypes.length && utils.isObject(args[args.length -1])) {
  4065          options = args[args.length - 1];
  4066      }
  4067      this.validateArgs(args);
  4068      options.to = this._address;
  4069      options.data = '0x' + this.signature() + coder.encodeParams(this._inputTypes, args);
  4070      return options;
  4071  };
  4072  
  4073  /**
  4074   * Should be used to get function signature
  4075   *
  4076   * @method signature
  4077   * @return {String} function signature
  4078   */
  4079  SolidityFunction.prototype.signature = function () {
  4080      return sha3(this._name).slice(0, 8);
  4081  };
  4082  
  4083  
  4084  SolidityFunction.prototype.unpackOutput = function (output) {
  4085      if (!output) {
  4086          return;
  4087      }
  4088  
  4089      output = output.length >= 2 ? output.slice(2) : output;
  4090      var result = coder.decodeParams(this._outputTypes, output);
  4091      return result.length === 1 ? result[0] : result;
  4092  };
  4093  
  4094  /**
  4095   * Calls a contract function.
  4096   *
  4097   * @method call
  4098   * @param {...Object} Contract function arguments
  4099   * @param {function} If the last argument is a function, the contract function
  4100   *   call will be asynchronous, and the callback will be passed the
  4101   *   error and result.
  4102   * @return {String} output bytes
  4103   */
  4104  SolidityFunction.prototype.call = function () {
  4105      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4106      var callback = this.extractCallback(args);
  4107      var defaultBlock = this.extractDefaultBlock(args);
  4108      var payload = this.toPayload(args);
  4109  
  4110  
  4111      if (!callback) {
  4112          var output = this._eth.call(payload, defaultBlock);
  4113          return this.unpackOutput(output);
  4114      }
  4115  
  4116      var self = this;
  4117      this._eth.call(payload, defaultBlock, function (error, output) {
  4118          if (error) return callback(error, null);
  4119  
  4120          var unpacked = null;
  4121          try {
  4122              unpacked = self.unpackOutput(output);
  4123          }
  4124          catch (e) {
  4125              error = e;
  4126          }
  4127  
  4128          callback(error, unpacked);
  4129      });
  4130  };
  4131  
  4132  /**
  4133   * Should be used to sendTransaction to solidity function
  4134   *
  4135   * @method sendTransaction
  4136   */
  4137  SolidityFunction.prototype.sendTransaction = function () {
  4138      var args = Array.prototype.slice.call(arguments).filter(function (a) {return a !== undefined; });
  4139      var callback = this.extractCallback(args);
  4140      var payload = this.toPayload(args);
  4141  
  4142      if (payload.value > 0 && !this._payable) {
  4143          throw new Error('Cannot send value to non-payable function');
  4144      }
  4145  
  4146      if (!callback) {
  4147          return this._eth.sendTransaction(payload);
  4148      }
  4149  
  4150      this._eth.sendTransaction(payload, callback);
  4151  };
  4152  
  4153  /**
  4154   * Should be used to estimateGas of solidity function
  4155   *
  4156   * @method estimateGas
  4157   */
  4158  SolidityFunction.prototype.estimateGas = function () {
  4159      var args = Array.prototype.slice.call(arguments);
  4160      var callback = this.extractCallback(args);
  4161      var payload = this.toPayload(args);
  4162  
  4163      if (!callback) {
  4164          return this._eth.estimateGas(payload);
  4165      }
  4166  
  4167      this._eth.estimateGas(payload, callback);
  4168  };
  4169  
  4170  /**
  4171   * Return the encoded data of the call
  4172   *
  4173   * @method getData
  4174   * @return {String} the encoded data
  4175   */
  4176  SolidityFunction.prototype.getData = function () {
  4177      var args = Array.prototype.slice.call(arguments);
  4178      var payload = this.toPayload(args);
  4179  
  4180      return payload.data;
  4181  };
  4182  
  4183  /**
  4184   * Should be used to get function display name
  4185   *
  4186   * @method displayName
  4187   * @return {String} display name of the function
  4188   */
  4189  SolidityFunction.prototype.displayName = function () {
  4190      return utils.extractDisplayName(this._name);
  4191  };
  4192  
  4193  /**
  4194   * Should be used to get function type name
  4195   *
  4196   * @method typeName
  4197   * @return {String} type name of the function
  4198   */
  4199  SolidityFunction.prototype.typeName = function () {
  4200      return utils.extractTypeName(this._name);
  4201  };
  4202  
  4203  /**
  4204   * Should be called to get rpc requests from solidity function
  4205   *
  4206   * @method request
  4207   * @returns {Object}
  4208   */
  4209  SolidityFunction.prototype.request = function () {
  4210      var args = Array.prototype.slice.call(arguments);
  4211      var callback = this.extractCallback(args);
  4212      var payload = this.toPayload(args);
  4213      var format = this.unpackOutput.bind(this);
  4214  
  4215      return {
  4216          method: this._constant ? 'eth_call' : 'eth_sendTransaction',
  4217          callback: callback,
  4218          params: [payload],
  4219          format: format
  4220      };
  4221  };
  4222  
  4223  /**
  4224   * Should be called to execute function
  4225   *
  4226   * @method execute
  4227   */
  4228  SolidityFunction.prototype.execute = function () {
  4229      var transaction = !this._constant;
  4230  
  4231      // send transaction
  4232      if (transaction) {
  4233          return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));
  4234      }
  4235  
  4236      // call
  4237      return this.call.apply(this, Array.prototype.slice.call(arguments));
  4238  };
  4239  
  4240  /**
  4241   * Should be called to attach function to contract
  4242   *
  4243   * @method attachToContract
  4244   * @param {Contract}
  4245   */
  4246  SolidityFunction.prototype.attachToContract = function (contract) {
  4247      var execute = this.execute.bind(this);
  4248      execute.request = this.request.bind(this);
  4249      execute.call = this.call.bind(this);
  4250      execute.sendTransaction = this.sendTransaction.bind(this);
  4251      execute.estimateGas = this.estimateGas.bind(this);
  4252      execute.getData = this.getData.bind(this);
  4253      var displayName = this.displayName();
  4254      if (!contract[displayName]) {
  4255          contract[displayName] = execute;
  4256      }
  4257      contract[displayName][this.typeName()] = execute; // circular!!!!
  4258  };
  4259  
  4260  module.exports = SolidityFunction;
  4261  
  4262  },{"../solidity/coder":7,"../utils/sha3":19,"../utils/utils":20,"./errors":26,"./formatters":30}],32:[function(require,module,exports){
  4263  /*
  4264      This file is part of web3.js.
  4265  
  4266      web3.js is free software: you can redistribute it and/or modify
  4267      it under the terms of the GNU Lesser General Public License as published by
  4268      the Free Software Foundation, either version 3 of the License, or
  4269      (at your option) any later version.
  4270  
  4271      web3.js is distributed in the hope that it will be useful,
  4272      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4273      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4274      GNU Lesser General Public License for more details.
  4275  
  4276      You should have received a copy of the GNU Lesser General Public License
  4277      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4278  */
  4279  /** @file httpprovider.js
  4280   * @authors:
  4281   *   Marek Kotewicz <marek@ethdev.com>
  4282   *   Marian Oancea <marian@ethdev.com>
  4283   *   Fabian Vogelsteller <fabian@ethdev.com>
  4284   * @date 2015
  4285   */
  4286  
  4287  var errors = require('./errors');
  4288  
  4289  // workaround to use httpprovider in different envs
  4290  
  4291  // browser
  4292  if (typeof window !== 'undefined' && window.XMLHttpRequest) {
  4293    XMLHttpRequest = window.XMLHttpRequest; // jshint ignore: line
  4294  // node
  4295  } else {
  4296    XMLHttpRequest = require('xmlhttprequest').XMLHttpRequest; // jshint ignore: line
  4297  }
  4298  
  4299  var XHR2 = require('xhr2'); // jshint ignore: line
  4300  
  4301  /**
  4302   * HttpProvider should be used to send rpc calls over http
  4303   */
  4304  var HttpProvider = function (host, timeout, user, password) {
  4305    this.host = host || 'http://localhost:8545';
  4306    this.timeout = timeout || 0;
  4307    this.user = user;
  4308    this.password = password;
  4309  };
  4310  
  4311  /**
  4312   * Should be called to prepare new XMLHttpRequest
  4313   *
  4314   * @method prepareRequest
  4315   * @param {Boolean} true if request should be async
  4316   * @return {XMLHttpRequest} object
  4317   */
  4318  HttpProvider.prototype.prepareRequest = function (async) {
  4319    var request;
  4320  
  4321    if (async) {
  4322      request = new XHR2();
  4323      request.timeout = this.timeout;
  4324    } else {
  4325      request = new XMLHttpRequest();
  4326    }
  4327  
  4328    request.open('POST', this.host, async);
  4329    if (this.user && this.password) {
  4330      var auth = 'Basic ' + new Buffer(this.user + ':' + this.password).toString('base64');
  4331      request.setRequestHeader('Authorization', auth);
  4332    } request.setRequestHeader('Content-Type', 'application/json');
  4333    return request;
  4334  };
  4335  
  4336  /**
  4337   * Should be called to make sync request
  4338   *
  4339   * @method send
  4340   * @param {Object} payload
  4341   * @return {Object} result
  4342   */
  4343  HttpProvider.prototype.send = function (payload) {
  4344    var request = this.prepareRequest(false);
  4345  
  4346    try {
  4347      request.send(JSON.stringify(payload));
  4348    } catch (error) {
  4349      throw errors.InvalidConnection(this.host);
  4350    }
  4351  
  4352    var result = request.responseText;
  4353  
  4354    try {
  4355      result = JSON.parse(result);
  4356    } catch (e) {
  4357      throw errors.InvalidResponse(request.responseText);
  4358    }
  4359  
  4360    return result;
  4361  };
  4362  
  4363  /**
  4364   * Should be used to make async request
  4365   *
  4366   * @method sendAsync
  4367   * @param {Object} payload
  4368   * @param {Function} callback triggered on end with (err, result)
  4369   */
  4370  HttpProvider.prototype.sendAsync = function (payload, callback) {
  4371    var request = this.prepareRequest(true);
  4372  
  4373    request.onreadystatechange = function () {
  4374      if (request.readyState === 4 && request.timeout !== 1) {
  4375        var result = request.responseText;
  4376        var error = null;
  4377  
  4378        try {
  4379          result = JSON.parse(result);
  4380        } catch (e) {
  4381          error = errors.InvalidResponse(request.responseText);
  4382        }
  4383  
  4384        callback(error, result);
  4385      }
  4386    };
  4387  
  4388    request.ontimeout = function () {
  4389      callback(errors.ConnectionTimeout(this.timeout));
  4390    };
  4391  
  4392    try {
  4393      request.send(JSON.stringify(payload));
  4394    } catch (error) {
  4395      callback(errors.InvalidConnection(this.host));
  4396    }
  4397  };
  4398  
  4399  /**
  4400   * Synchronously tries to make Http request
  4401   *
  4402   * @method isConnected
  4403   * @return {Boolean} returns true if request haven't failed. Otherwise false
  4404   */
  4405  HttpProvider.prototype.isConnected = function () {
  4406    try {
  4407      this.send({
  4408        id: 9999999999,
  4409        jsonrpc: '2.0',
  4410        method: 'net_listening',
  4411        params: []
  4412      });
  4413      return true;
  4414    } catch (e) {
  4415      return false;
  4416    }
  4417  };
  4418  
  4419  module.exports = HttpProvider;
  4420  
  4421  },{"./errors":26,"xhr2":86,"xmlhttprequest":17}],33:[function(require,module,exports){
  4422  /*
  4423      This file is part of web3.js.
  4424  
  4425      web3.js is free software: you can redistribute it and/or modify
  4426      it under the terms of the GNU Lesser General Public License as published by
  4427      the Free Software Foundation, either version 3 of the License, or
  4428      (at your option) any later version.
  4429  
  4430      web3.js is distributed in the hope that it will be useful,
  4431      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4432      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4433      GNU Lesser General Public License for more details.
  4434  
  4435      You should have received a copy of the GNU Lesser General Public License
  4436      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4437  */
  4438  /** 
  4439   * @file iban.js
  4440   * @author Marek Kotewicz <marek@ethdev.com>
  4441   * @date 2015
  4442   */
  4443  
  4444  var BigNumber = require('bignumber.js');
  4445  
  4446  var padLeft = function (string, bytes) {
  4447      var result = string;
  4448      while (result.length < bytes * 2) {
  4449          result = '0' + result;
  4450      }
  4451      return result;
  4452  };
  4453  
  4454  /**
  4455   * Prepare an IBAN for mod 97 computation by moving the first 4 chars to the end and transforming the letters to
  4456   * numbers (A = 10, B = 11, ..., Z = 35), as specified in ISO13616.
  4457   *
  4458   * @method iso13616Prepare
  4459   * @param {String} iban the IBAN
  4460   * @returns {String} the prepared IBAN
  4461   */
  4462  var iso13616Prepare = function (iban) {
  4463      var A = 'A'.charCodeAt(0);
  4464      var Z = 'Z'.charCodeAt(0);
  4465  
  4466      iban = iban.toUpperCase();
  4467      iban = iban.substr(4) + iban.substr(0,4);
  4468  
  4469      return iban.split('').map(function(n){
  4470          var code = n.charCodeAt(0);
  4471          if (code >= A && code <= Z){
  4472              // A = 10, B = 11, ... Z = 35
  4473              return code - A + 10;
  4474          } else {
  4475              return n;
  4476          }
  4477      }).join('');
  4478  };
  4479  
  4480  /**
  4481   * Calculates the MOD 97 10 of the passed IBAN as specified in ISO7064.
  4482   *
  4483   * @method mod9710
  4484   * @param {String} iban
  4485   * @returns {Number}
  4486   */
  4487  var mod9710 = function (iban) {
  4488      var remainder = iban,
  4489          block;
  4490  
  4491      while (remainder.length > 2){
  4492          block = remainder.slice(0, 9);
  4493          remainder = parseInt(block, 10) % 97 + remainder.slice(block.length);
  4494      }
  4495  
  4496      return parseInt(remainder, 10) % 97;
  4497  };
  4498  
  4499  /**
  4500   * This prototype should be used to create iban object from iban correct string
  4501   *
  4502   * @param {String} iban
  4503   */
  4504  var Iban = function (iban) {
  4505      this._iban = iban;
  4506  };
  4507  
  4508  /**
  4509   * This method should be used to create iban object from ethereum address
  4510   *
  4511   * @method fromAddress
  4512   * @param {String} address
  4513   * @return {Iban} the IBAN object
  4514   */
  4515  Iban.fromAddress = function (address) {
  4516      var asBn = new BigNumber(address, 16);
  4517      var base36 = asBn.toString(36);
  4518      var padded = padLeft(base36, 15);
  4519      return Iban.fromBban(padded.toUpperCase());
  4520  };
  4521  
  4522  /**
  4523   * Convert the passed BBAN to an IBAN for this country specification.
  4524   * Please note that <i>"generation of the IBAN shall be the exclusive responsibility of the bank/branch servicing the account"</i>.
  4525   * This method implements the preferred algorithm described in http://en.wikipedia.org/wiki/International_Bank_Account_Number#Generating_IBAN_check_digits
  4526   *
  4527   * @method fromBban
  4528   * @param {String} bban the BBAN to convert to IBAN
  4529   * @returns {Iban} the IBAN object
  4530   */
  4531  Iban.fromBban = function (bban) {
  4532      var countryCode = 'XE';
  4533  
  4534      var remainder = mod9710(iso13616Prepare(countryCode + '00' + bban));
  4535      var checkDigit = ('0' + (98 - remainder)).slice(-2);
  4536  
  4537      return new Iban(countryCode + checkDigit + bban);
  4538  };
  4539  
  4540  /**
  4541   * Should be used to create IBAN object for given institution and identifier
  4542   *
  4543   * @method createIndirect
  4544   * @param {Object} options, required options are "institution" and "identifier"
  4545   * @return {Iban} the IBAN object
  4546   */
  4547  Iban.createIndirect = function (options) {
  4548      return Iban.fromBban('ETH' + options.institution + options.identifier);
  4549  };
  4550  
  4551  /**
  4552   * Thos method should be used to check if given string is valid iban object
  4553   *
  4554   * @method isValid
  4555   * @param {String} iban string
  4556   * @return {Boolean} true if it is valid IBAN
  4557   */
  4558  Iban.isValid = function (iban) {
  4559      var i = new Iban(iban);
  4560      return i.isValid();
  4561  };
  4562  
  4563  /**
  4564   * Should be called to check if iban is correct
  4565   *
  4566   * @method isValid
  4567   * @returns {Boolean} true if it is, otherwise false
  4568   */
  4569  Iban.prototype.isValid = function () {
  4570      return /^XE[0-9]{2}(ETH[0-9A-Z]{13}|[0-9A-Z]{30,31})$/.test(this._iban) &&
  4571          mod9710(iso13616Prepare(this._iban)) === 1;
  4572  };
  4573  
  4574  /**
  4575   * Should be called to check if iban number is direct
  4576   *
  4577   * @method isDirect
  4578   * @returns {Boolean} true if it is, otherwise false
  4579   */
  4580  Iban.prototype.isDirect = function () {
  4581      return this._iban.length === 34 || this._iban.length === 35;
  4582  };
  4583  
  4584  /**
  4585   * Should be called to check if iban number if indirect
  4586   *
  4587   * @method isIndirect
  4588   * @returns {Boolean} true if it is, otherwise false
  4589   */
  4590  Iban.prototype.isIndirect = function () {
  4591      return this._iban.length === 20;
  4592  };
  4593  
  4594  /**
  4595   * Should be called to get iban checksum
  4596   * Uses the mod-97-10 checksumming protocol (ISO/IEC 7064:2003)
  4597   *
  4598   * @method checksum
  4599   * @returns {String} checksum
  4600   */
  4601  Iban.prototype.checksum = function () {
  4602      return this._iban.substr(2, 2);
  4603  };
  4604  
  4605  /**
  4606   * Should be called to get institution identifier
  4607   * eg. XREG
  4608   *
  4609   * @method institution
  4610   * @returns {String} institution identifier
  4611   */
  4612  Iban.prototype.institution = function () {
  4613      return this.isIndirect() ? this._iban.substr(7, 4) : '';
  4614  };
  4615  
  4616  /**
  4617   * Should be called to get client identifier within institution
  4618   * eg. GAVOFYORK
  4619   *
  4620   * @method client
  4621   * @returns {String} client identifier
  4622   */
  4623  Iban.prototype.client = function () {
  4624      return this.isIndirect() ? this._iban.substr(11) : '';
  4625  };
  4626  
  4627  /**
  4628   * Should be called to get client direct address
  4629   *
  4630   * @method address
  4631   * @returns {String} client direct address
  4632   */
  4633  Iban.prototype.address = function () {
  4634      if (this.isDirect()) {
  4635          var base36 = this._iban.substr(4);
  4636          var asBn = new BigNumber(base36, 36);
  4637          return padLeft(asBn.toString(16), 20);
  4638      } 
  4639  
  4640      return '';
  4641  };
  4642  
  4643  Iban.prototype.toString = function () {
  4644      return this._iban;
  4645  };
  4646  
  4647  module.exports = Iban;
  4648  
  4649  
  4650  },{"bignumber.js":"bignumber.js"}],34:[function(require,module,exports){
  4651  /*
  4652      This file is part of web3.js.
  4653  
  4654      web3.js is free software: you can redistribute it and/or modify
  4655      it under the terms of the GNU Lesser General Public License as published by
  4656      the Free Software Foundation, either version 3 of the License, or
  4657      (at your option) any later version.
  4658  
  4659      web3.js is distributed in the hope that it will be useful,
  4660      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4661      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4662      GNU Lesser General Public License for more details.
  4663  
  4664      You should have received a copy of the GNU Lesser General Public License
  4665      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4666  */
  4667  /** @file ipcprovider.js
  4668   * @authors:
  4669   *   Fabian Vogelsteller <fabian@ethdev.com>
  4670   * @date 2015
  4671   */
  4672  
  4673  "use strict";
  4674  
  4675  var utils = require('../utils/utils');
  4676  var errors = require('./errors');
  4677  
  4678  
  4679  var IpcProvider = function (path, net) {
  4680      var _this = this;
  4681      this.responseCallbacks = {};
  4682      this.path = path;
  4683      
  4684      this.connection = net.connect({path: this.path});
  4685  
  4686      this.connection.on('error', function(e){
  4687          console.error('IPC Connection Error', e);
  4688          _this._timeout();
  4689      });
  4690  
  4691      this.connection.on('end', function(){
  4692          _this._timeout();
  4693      }); 
  4694  
  4695  
  4696      // LISTEN FOR CONNECTION RESPONSES
  4697      this.connection.on('data', function(data) {
  4698          /*jshint maxcomplexity: 6 */
  4699  
  4700          _this._parseResponse(data.toString()).forEach(function(result){
  4701  
  4702              var id = null;
  4703  
  4704              // get the id which matches the returned id
  4705              if(utils.isArray(result)) {
  4706                  result.forEach(function(load){
  4707                      if(_this.responseCallbacks[load.id])
  4708                          id = load.id;
  4709                  });
  4710              } else {
  4711                  id = result.id;
  4712              }
  4713  
  4714              // fire the callback
  4715              if(_this.responseCallbacks[id]) {
  4716                  _this.responseCallbacks[id](null, result);
  4717                  delete _this.responseCallbacks[id];
  4718              }
  4719          });
  4720      });
  4721  };
  4722  
  4723  /**
  4724  Will parse the response and make an array out of it.
  4725  
  4726  @method _parseResponse
  4727  @param {String} data
  4728  */
  4729  IpcProvider.prototype._parseResponse = function(data) {
  4730      var _this = this,
  4731          returnValues = [];
  4732      
  4733      // DE-CHUNKER
  4734      var dechunkedData = data
  4735          .replace(/\}[\n\r]?\{/g,'}|--|{') // }{
  4736          .replace(/\}\][\n\r]?\[\{/g,'}]|--|[{') // }][{
  4737          .replace(/\}[\n\r]?\[\{/g,'}|--|[{') // }[{
  4738          .replace(/\}\][\n\r]?\{/g,'}]|--|{') // }]{
  4739          .split('|--|');
  4740  
  4741      dechunkedData.forEach(function(data){
  4742  
  4743          // prepend the last chunk
  4744          if(_this.lastChunk)
  4745              data = _this.lastChunk + data;
  4746  
  4747          var result = null;
  4748  
  4749          try {
  4750              result = JSON.parse(data);
  4751  
  4752          } catch(e) {
  4753  
  4754              _this.lastChunk = data;
  4755  
  4756              // start timeout to cancel all requests
  4757              clearTimeout(_this.lastChunkTimeout);
  4758              _this.lastChunkTimeout = setTimeout(function(){
  4759                  _this._timeout();
  4760                  throw errors.InvalidResponse(data);
  4761              }, 1000 * 15);
  4762  
  4763              return;
  4764          }
  4765  
  4766          // cancel timeout and set chunk to null
  4767          clearTimeout(_this.lastChunkTimeout);
  4768          _this.lastChunk = null;
  4769  
  4770          if(result)
  4771              returnValues.push(result);
  4772      });
  4773  
  4774      return returnValues;
  4775  };
  4776  
  4777  
  4778  /**
  4779  Get the adds a callback to the responseCallbacks object,
  4780  which will be called if a response matching the response Id will arrive.
  4781  
  4782  @method _addResponseCallback
  4783  */
  4784  IpcProvider.prototype._addResponseCallback = function(payload, callback) {
  4785      var id = payload.id || payload[0].id;
  4786      var method = payload.method || payload[0].method;
  4787  
  4788      this.responseCallbacks[id] = callback;
  4789      this.responseCallbacks[id].method = method;
  4790  };
  4791  
  4792  /**
  4793  Timeout all requests when the end/error event is fired
  4794  
  4795  @method _timeout
  4796  */
  4797  IpcProvider.prototype._timeout = function() {
  4798      for(var key in this.responseCallbacks) {
  4799          if(this.responseCallbacks.hasOwnProperty(key)){
  4800              this.responseCallbacks[key](errors.InvalidConnection('on IPC'));
  4801              delete this.responseCallbacks[key];
  4802          }
  4803      }
  4804  };
  4805  
  4806  
  4807  /**
  4808  Check if the current connection is still valid.
  4809  
  4810  @method isConnected
  4811  */
  4812  IpcProvider.prototype.isConnected = function() {
  4813      var _this = this;
  4814  
  4815      // try reconnect, when connection is gone
  4816      if(!_this.connection.writable)
  4817          _this.connection.connect({path: _this.path});
  4818  
  4819      return !!this.connection.writable;
  4820  };
  4821  
  4822  IpcProvider.prototype.send = function (payload) {
  4823  
  4824      if(this.connection.writeSync) {
  4825          var result;
  4826  
  4827          // try reconnect, when connection is gone
  4828          if(!this.connection.writable)
  4829              this.connection.connect({path: this.path});
  4830  
  4831          var data = this.connection.writeSync(JSON.stringify(payload));
  4832  
  4833          try {
  4834              result = JSON.parse(data);
  4835          } catch(e) {
  4836              throw errors.InvalidResponse(data);                
  4837          }
  4838  
  4839          return result;
  4840  
  4841      } else {
  4842          throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
  4843      }
  4844  };
  4845  
  4846  IpcProvider.prototype.sendAsync = function (payload, callback) {
  4847      // try reconnect, when connection is gone
  4848      if(!this.connection.writable)
  4849          this.connection.connect({path: this.path});
  4850  
  4851  
  4852      this.connection.write(JSON.stringify(payload));
  4853      this._addResponseCallback(payload, callback);
  4854  };
  4855  
  4856  module.exports = IpcProvider;
  4857  
  4858  
  4859  },{"../utils/utils":20,"./errors":26}],35:[function(require,module,exports){
  4860  /*
  4861      This file is part of web3.js.
  4862  
  4863      web3.js is free software: you can redistribute it and/or modify
  4864      it under the terms of the GNU Lesser General Public License as published by
  4865      the Free Software Foundation, either version 3 of the License, or
  4866      (at your option) any later version.
  4867  
  4868      web3.js is distributed in the hope that it will be useful,
  4869      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4870      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4871      GNU Lesser General Public License for more details.
  4872  
  4873      You should have received a copy of the GNU Lesser General Public License
  4874      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4875  */
  4876  /** @file jsonrpc.js
  4877   * @authors:
  4878   *   Marek Kotewicz <marek@ethdev.com>
  4879   *   Aaron Kumavis <aaron@kumavis.me>
  4880   * @date 2015
  4881   */
  4882  
  4883  // Initialize Jsonrpc as a simple object with utility functions.
  4884  var Jsonrpc = {
  4885      messageId: 0
  4886  };
  4887  
  4888  /**
  4889   * Should be called to valid json create payload object
  4890   *
  4891   * @method toPayload
  4892   * @param {Function} method of jsonrpc call, required
  4893   * @param {Array} params, an array of method params, optional
  4894   * @returns {Object} valid jsonrpc payload object
  4895   */
  4896  Jsonrpc.toPayload = function (method, params) {
  4897      if (!method)
  4898          console.error('jsonrpc method should be specified!');
  4899  
  4900      // advance message ID
  4901      Jsonrpc.messageId++;
  4902  
  4903      return {
  4904          jsonrpc: '2.0',
  4905          id: Jsonrpc.messageId,
  4906          method: method,
  4907          params: params || []
  4908      };
  4909  };
  4910  
  4911  /**
  4912   * Should be called to check if jsonrpc response is valid
  4913   *
  4914   * @method isValidResponse
  4915   * @param {Object}
  4916   * @returns {Boolean} true if response is valid, otherwise false
  4917   */
  4918  Jsonrpc.isValidResponse = function (response) {
  4919      return Array.isArray(response) ? response.every(validateSingleMessage) : validateSingleMessage(response);
  4920  
  4921      function validateSingleMessage(message){
  4922        return !!message &&
  4923          !message.error &&
  4924          message.jsonrpc === '2.0' &&
  4925          typeof message.id === 'number' &&
  4926          message.result !== undefined; // only undefined is not valid json object
  4927      }
  4928  };
  4929  
  4930  /**
  4931   * Should be called to create batch payload object
  4932   *
  4933   * @method toBatchPayload
  4934   * @param {Array} messages, an array of objects with method (required) and params (optional) fields
  4935   * @returns {Array} batch payload
  4936   */
  4937  Jsonrpc.toBatchPayload = function (messages) {
  4938      return messages.map(function (message) {
  4939          return Jsonrpc.toPayload(message.method, message.params);
  4940      });
  4941  };
  4942  
  4943  module.exports = Jsonrpc;
  4944  
  4945  
  4946  },{}],36:[function(require,module,exports){
  4947  /*
  4948      This file is part of web3.js.
  4949  
  4950      web3.js is free software: you can redistribute it and/or modify
  4951      it under the terms of the GNU Lesser General Public License as published by
  4952      the Free Software Foundation, either version 3 of the License, or
  4953      (at your option) any later version.
  4954  
  4955      web3.js is distributed in the hope that it will be useful,
  4956      but WITHOUT ANY WARRANTY; without even the implied warranty of
  4957      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  4958      GNU Lesser General Public License for more details.
  4959  
  4960      You should have received a copy of the GNU Lesser General Public License
  4961      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  4962  */
  4963  /**
  4964   * @file method.js
  4965   * @author Marek Kotewicz <marek@ethdev.com>
  4966   * @date 2015
  4967   */
  4968  
  4969  var utils = require('../utils/utils');
  4970  var errors = require('./errors');
  4971  
  4972  var Method = function (options) {
  4973      this.name = options.name;
  4974      this.call = options.call;
  4975      this.params = options.params || 0;
  4976      this.inputFormatter = options.inputFormatter;
  4977      this.outputFormatter = options.outputFormatter;
  4978      this.requestManager = null;
  4979  };
  4980  
  4981  Method.prototype.setRequestManager = function (rm) {
  4982      this.requestManager = rm;
  4983  };
  4984  
  4985  /**
  4986   * Should be used to determine name of the jsonrpc method based on arguments
  4987   *
  4988   * @method getCall
  4989   * @param {Array} arguments
  4990   * @return {String} name of jsonrpc method
  4991   */
  4992  Method.prototype.getCall = function (args) {
  4993      return utils.isFunction(this.call) ? this.call(args) : this.call;
  4994  };
  4995  
  4996  /**
  4997   * Should be used to extract callback from array of arguments. Modifies input param
  4998   *
  4999   * @method extractCallback
  5000   * @param {Array} arguments
  5001   * @return {Function|Null} callback, if exists
  5002   */
  5003  Method.prototype.extractCallback = function (args) {
  5004      if (utils.isFunction(args[args.length - 1])) {
  5005          return args.pop(); // modify the args array!
  5006      }
  5007  };
  5008  
  5009  /**
  5010   * Should be called to check if the number of arguments is correct
  5011   * 
  5012   * @method validateArgs
  5013   * @param {Array} arguments
  5014   * @throws {Error} if it is not
  5015   */
  5016  Method.prototype.validateArgs = function (args) {
  5017      if (args.length !== this.params) {
  5018          throw errors.InvalidNumberOfRPCParams();
  5019      }
  5020  };
  5021  
  5022  /**
  5023   * Should be called to format input args of method
  5024   * 
  5025   * @method formatInput
  5026   * @param {Array}
  5027   * @return {Array}
  5028   */
  5029  Method.prototype.formatInput = function (args) {
  5030      if (!this.inputFormatter) {
  5031          return args;
  5032      }
  5033  
  5034      return this.inputFormatter.map(function (formatter, index) {
  5035          return formatter ? formatter(args[index]) : args[index];
  5036      });
  5037  };
  5038  
  5039  /**
  5040   * Should be called to format output(result) of method
  5041   *
  5042   * @method formatOutput
  5043   * @param {Object}
  5044   * @return {Object}
  5045   */
  5046  Method.prototype.formatOutput = function (result) {
  5047      return this.outputFormatter && result ? this.outputFormatter(result) : result;
  5048  };
  5049  
  5050  /**
  5051   * Should create payload from given input args
  5052   *
  5053   * @method toPayload
  5054   * @param {Array} args
  5055   * @return {Object}
  5056   */
  5057  Method.prototype.toPayload = function (args) {
  5058      var call = this.getCall(args);
  5059      var callback = this.extractCallback(args);
  5060      var params = this.formatInput(args);
  5061      this.validateArgs(params);
  5062  
  5063      return {
  5064          method: call,
  5065          params: params,
  5066          callback: callback
  5067      };
  5068  };
  5069  
  5070  Method.prototype.attachToObject = function (obj) {
  5071      var func = this.buildCall();
  5072      func.call = this.call; // TODO!!! that's ugly. filter.js uses it
  5073      var name = this.name.split('.');
  5074      if (name.length > 1) {
  5075          obj[name[0]] = obj[name[0]] || {};
  5076          obj[name[0]][name[1]] = func;
  5077      } else {
  5078          obj[name[0]] = func; 
  5079      }
  5080  };
  5081  
  5082  Method.prototype.buildCall = function() {
  5083      var method = this;
  5084      var send = function () {
  5085          var payload = method.toPayload(Array.prototype.slice.call(arguments));
  5086          if (payload.callback) {
  5087              return method.requestManager.sendAsync(payload, function (err, result) {
  5088                  payload.callback(err, method.formatOutput(result));
  5089              });
  5090          }
  5091          return method.formatOutput(method.requestManager.send(payload));
  5092      };
  5093      send.request = this.request.bind(this);
  5094      return send;
  5095  };
  5096  
  5097  /**
  5098   * Should be called to create pure JSONRPC request which can be used in batch request
  5099   *
  5100   * @method request
  5101   * @param {...} params
  5102   * @return {Object} jsonrpc request
  5103   */
  5104  Method.prototype.request = function () {
  5105      var payload = this.toPayload(Array.prototype.slice.call(arguments));
  5106      payload.format = this.formatOutput.bind(this);
  5107      return payload;
  5108  };
  5109  
  5110  module.exports = Method;
  5111  
  5112  },{"../utils/utils":20,"./errors":26}],37:[function(require,module,exports){
  5113  /*
  5114      This file is part of web3.js.
  5115  
  5116      web3.js is free software: you can redistribute it and/or modify
  5117      it under the terms of the GNU Lesser General Public License as published by
  5118      the Free Software Foundation, either version 3 of the License, or
  5119      (at your option) any later version.
  5120  
  5121      web3.js is distributed in the hope that it will be useful,
  5122      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5123      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5124      GNU Lesser General Public License for more details.
  5125  
  5126      You should have received a copy of the GNU Lesser General Public License
  5127      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5128  */
  5129  /** @file db.js
  5130   * @authors:
  5131   *   Marek Kotewicz <marek@ethdev.com>
  5132   * @date 2015
  5133   */
  5134  
  5135  var Method = require('../method');
  5136  
  5137  var DB = function (web3) {
  5138      this._requestManager = web3._requestManager;
  5139  
  5140      var self = this;
  5141      
  5142      methods().forEach(function(method) { 
  5143          method.attachToObject(self);
  5144          method.setRequestManager(web3._requestManager);
  5145      });
  5146  };
  5147  
  5148  var methods = function () {
  5149      var putString = new Method({
  5150          name: 'putString',
  5151          call: 'db_putString',
  5152          params: 3
  5153      });
  5154  
  5155      var getString = new Method({
  5156          name: 'getString',
  5157          call: 'db_getString',
  5158          params: 2
  5159      });
  5160  
  5161      var putHex = new Method({
  5162          name: 'putHex',
  5163          call: 'db_putHex',
  5164          params: 3
  5165      });
  5166  
  5167      var getHex = new Method({
  5168          name: 'getHex',
  5169          call: 'db_getHex',
  5170          params: 2
  5171      });
  5172  
  5173      return [
  5174          putString, getString, putHex, getHex
  5175      ];
  5176  };
  5177  
  5178  module.exports = DB;
  5179  
  5180  },{"../method":36}],38:[function(require,module,exports){
  5181  /*
  5182      This file is part of web3.js.
  5183  
  5184      web3.js is free software: you can redistribute it and/or modify
  5185      it under the terms of the GNU Lesser General Public License as published by
  5186      the Free Software Foundation, either version 3 of the License, or
  5187      (at your option) any later version.
  5188  
  5189      web3.js is distributed in the hope that it will be useful,
  5190      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5191      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5192      GNU Lesser General Public License for more details.
  5193  
  5194      You should have received a copy of the GNU Lesser General Public License
  5195      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5196  */
  5197  /**
  5198   * @file eth.js
  5199   * @author Marek Kotewicz <marek@ethdev.com>
  5200   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5201   * @date 2015
  5202   */
  5203  
  5204  "use strict";
  5205  
  5206  var formatters = require('../formatters');
  5207  var utils = require('../../utils/utils');
  5208  var Method = require('../method');
  5209  var Property = require('../property');
  5210  var c = require('../../utils/config');
  5211  var Contract = require('../contract');
  5212  var watches = require('./watches');
  5213  var Filter = require('../filter');
  5214  var IsSyncing = require('../syncing');
  5215  var namereg = require('../namereg');
  5216  var Iban = require('../iban');
  5217  var transfer = require('../transfer');
  5218  
  5219  var blockCall = function (args) {
  5220      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? "eth_getBlockByHash" : "eth_getBlockByNumber";
  5221  };
  5222  
  5223  var transactionFromBlockCall = function (args) {
  5224      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getTransactionByBlockHashAndIndex' : 'eth_getTransactionByBlockNumberAndIndex';
  5225  };
  5226  
  5227  var uncleCall = function (args) {
  5228      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleByBlockHashAndIndex' : 'eth_getUncleByBlockNumberAndIndex';
  5229  };
  5230  
  5231  var getBlockTransactionCountCall = function (args) {
  5232      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getBlockTransactionCountByHash' : 'eth_getBlockTransactionCountByNumber';
  5233  };
  5234  
  5235  var uncleCountCall = function (args) {
  5236      return (utils.isString(args[0]) && args[0].indexOf('0x') === 0) ? 'eth_getUncleCountByBlockHash' : 'eth_getUncleCountByBlockNumber';
  5237  };
  5238  
  5239  function Eth(web3) {
  5240      this._requestManager = web3._requestManager;
  5241  
  5242      var self = this;
  5243  
  5244      methods().forEach(function(method) {
  5245          method.attachToObject(self);
  5246          method.setRequestManager(self._requestManager);
  5247      });
  5248  
  5249      properties().forEach(function(p) {
  5250          p.attachToObject(self);
  5251          p.setRequestManager(self._requestManager);
  5252      });
  5253  
  5254  
  5255      this.iban = Iban;
  5256      this.sendIBANTransaction = transfer.bind(null, this);
  5257  }
  5258  
  5259  Object.defineProperty(Eth.prototype, 'defaultBlock', {
  5260      get: function () {
  5261          return c.defaultBlock;
  5262      },
  5263      set: function (val) {
  5264          c.defaultBlock = val;
  5265          return val;
  5266      }
  5267  });
  5268  
  5269  Object.defineProperty(Eth.prototype, 'defaultAccount', {
  5270      get: function () {
  5271          return c.defaultAccount;
  5272      },
  5273      set: function (val) {
  5274          c.defaultAccount = val;
  5275          return val;
  5276      }
  5277  });
  5278  
  5279  var methods = function () {
  5280      var getBalance = new Method({
  5281          name: 'getBalance',
  5282          call: 'eth_getBalance',
  5283          params: 2,
  5284          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter],
  5285          outputFormatter: formatters.outputBigNumberFormatter
  5286      });
  5287  
  5288      var getStorageAt = new Method({
  5289          name: 'getStorageAt',
  5290          call: 'eth_getStorageAt',
  5291          params: 3,
  5292          inputFormatter: [null, utils.toHex, formatters.inputDefaultBlockNumberFormatter]
  5293      });
  5294  
  5295      var getCode = new Method({
  5296          name: 'getCode',
  5297          call: 'eth_getCode',
  5298          params: 2,
  5299          inputFormatter: [formatters.inputAddressFormatter, formatters.inputDefaultBlockNumberFormatter]
  5300      });
  5301  
  5302      var getBlock = new Method({
  5303          name: 'getBlock',
  5304          call: blockCall,
  5305          params: 2,
  5306          inputFormatter: [formatters.inputBlockNumberFormatter, function (val) { return !!val; }],
  5307          outputFormatter: formatters.outputBlockFormatter
  5308      });
  5309  
  5310      var getUncle = new Method({
  5311          name: 'getUncle',
  5312          call: uncleCall,
  5313          params: 2,
  5314          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5315          outputFormatter: formatters.outputBlockFormatter,
  5316  
  5317      });
  5318  
  5319      var getCompilers = new Method({
  5320          name: 'getCompilers',
  5321          call: 'eth_getCompilers',
  5322          params: 0
  5323      });
  5324  
  5325      var getBlockTransactionCount = new Method({
  5326          name: 'getBlockTransactionCount',
  5327          call: getBlockTransactionCountCall,
  5328          params: 1,
  5329          inputFormatter: [formatters.inputBlockNumberFormatter],
  5330          outputFormatter: utils.toDecimal
  5331      });
  5332  
  5333      var getBlockUncleCount = new Method({
  5334          name: 'getBlockUncleCount',
  5335          call: uncleCountCall,
  5336          params: 1,
  5337          inputFormatter: [formatters.inputBlockNumberFormatter],
  5338          outputFormatter: utils.toDecimal
  5339      });
  5340  
  5341      var getTransaction = new Method({
  5342          name: 'getTransaction',
  5343          call: 'eth_getTransactionByHash',
  5344          params: 1,
  5345          outputFormatter: formatters.outputTransactionFormatter
  5346      });
  5347  
  5348      var getTransactionFromBlock = new Method({
  5349          name: 'getTransactionFromBlock',
  5350          call: transactionFromBlockCall,
  5351          params: 2,
  5352          inputFormatter: [formatters.inputBlockNumberFormatter, utils.toHex],
  5353          outputFormatter: formatters.outputTransactionFormatter
  5354      });
  5355  
  5356      var getTransactionReceipt = new Method({
  5357          name: 'getTransactionReceipt',
  5358          call: 'eth_getTransactionReceipt',
  5359          params: 1,
  5360          outputFormatter: formatters.outputTransactionReceiptFormatter
  5361      });
  5362  
  5363      var getTransactionCount = new Method({
  5364          name: 'getTransactionCount',
  5365          call: 'eth_getTransactionCount',
  5366          params: 2,
  5367          inputFormatter: [null, formatters.inputDefaultBlockNumberFormatter],
  5368          outputFormatter: utils.toDecimal
  5369      });
  5370  
  5371      var sendRawTransaction = new Method({
  5372          name: 'sendRawTransaction',
  5373          call: 'eth_sendRawTransaction',
  5374          params: 1,
  5375          inputFormatter: [null]
  5376      });
  5377  
  5378      var sendTransaction = new Method({
  5379          name: 'sendTransaction',
  5380          call: 'eth_sendTransaction',
  5381          params: 1,
  5382          inputFormatter: [formatters.inputTransactionFormatter]
  5383      });
  5384  
  5385      var signTransaction = new Method({
  5386          name: 'signTransaction',
  5387          call: 'eth_signTransaction',
  5388          params: 1,
  5389          inputFormatter: [formatters.inputTransactionFormatter]
  5390      });
  5391  
  5392      var sign = new Method({
  5393          name: 'sign',
  5394          call: 'eth_sign',
  5395          params: 2,
  5396          inputFormatter: [formatters.inputAddressFormatter, null]
  5397      });
  5398  
  5399      var call = new Method({
  5400          name: 'call',
  5401          call: 'eth_call',
  5402          params: 2,
  5403          inputFormatter: [formatters.inputCallFormatter, formatters.inputDefaultBlockNumberFormatter]
  5404      });
  5405  
  5406      var getTransactionReceiptsByBlock = new Method({
  5407          name: 'getTransactionReceiptsByBlock',
  5408          call: 'eth_getTransactionReceiptsByBlock',
  5409          params: 1
  5410      });
  5411  
  5412      var estimateGas = new Method({
  5413          name: 'estimateGas',
  5414          call: 'eth_estimateGas',
  5415          params: 1,
  5416          inputFormatter: [formatters.inputCallFormatter],
  5417          outputFormatter: utils.toDecimal
  5418      });
  5419  
  5420      var compileSolidity = new Method({
  5421          name: 'compile.solidity',
  5422          call: 'eth_compileSolidity',
  5423          params: 1
  5424      });
  5425  
  5426      var compileLLL = new Method({
  5427          name: 'compile.lll',
  5428          call: 'eth_compileLLL',
  5429          params: 1
  5430      });
  5431  
  5432      var compileSerpent = new Method({
  5433          name: 'compile.serpent',
  5434          call: 'eth_compileSerpent',
  5435          params: 1
  5436      });
  5437  
  5438      var submitWork = new Method({
  5439          name: 'submitWork',
  5440          call: 'eth_submitWork',
  5441          params: 3
  5442      });
  5443  
  5444      var getWork = new Method({
  5445          name: 'getWork',
  5446          call: 'eth_getWork',
  5447          params: 0
  5448      });
  5449  
  5450      return [
  5451          getBalance,
  5452          getStorageAt,
  5453          getCode,
  5454          getBlock,
  5455          getUncle,
  5456          getCompilers,
  5457          getBlockTransactionCount,
  5458          getBlockUncleCount,
  5459          getTransaction,
  5460          getTransactionFromBlock,
  5461          getTransactionReceipt,
  5462          getTransactionCount,
  5463          call,
  5464          estimateGas,
  5465          sendRawTransaction,
  5466          signTransaction,
  5467          sendTransaction,
  5468          sign,
  5469          compileSolidity,
  5470          compileLLL,
  5471          compileSerpent,
  5472          submitWork,
  5473          getWork,
  5474          getTransactionReceiptsByBlock
  5475      ];
  5476  };
  5477  
  5478  
  5479  var properties = function () {
  5480      return [
  5481          new Property({
  5482              name: 'coinbase',
  5483              getter: 'eth_coinbase'
  5484          }),
  5485          new Property({
  5486              name: 'mining',
  5487              getter: 'eth_mining'
  5488          }),
  5489          new Property({
  5490              name: 'hashrate',
  5491              getter: 'eth_hashrate',
  5492              outputFormatter: utils.toDecimal
  5493          }),
  5494          new Property({
  5495              name: 'syncing',
  5496              getter: 'eth_syncing',
  5497              outputFormatter: formatters.outputSyncingFormatter
  5498          }),
  5499          new Property({
  5500              name: 'gasPrice',
  5501              getter: 'eth_gasPrice',
  5502              outputFormatter: formatters.outputBigNumberFormatter
  5503          }),
  5504          new Property({
  5505              name: 'accounts',
  5506              getter: 'eth_accounts'
  5507          }),
  5508          new Property({
  5509              name: 'blockNumber',
  5510              getter: 'eth_blockNumber',
  5511              outputFormatter: utils.toDecimal
  5512          }),
  5513          new Property({
  5514              name: 'protocolVersion',
  5515              getter: 'eth_protocolVersion'
  5516          })
  5517      ];
  5518  };
  5519  
  5520  Eth.prototype.contract = function (abi) {
  5521      var factory = new Contract(this, abi);
  5522      return factory;
  5523  };
  5524  
  5525  Eth.prototype.filter = function (options, callback, filterCreationErrorCallback) {
  5526      return new Filter(options, 'eth', this._requestManager, watches.eth(), formatters.outputLogFormatter, callback, filterCreationErrorCallback);
  5527  };
  5528  
  5529  Eth.prototype.namereg = function () {
  5530      return this.contract(namereg.global.abi).at(namereg.global.address);
  5531  };
  5532  
  5533  Eth.prototype.icapNamereg = function () {
  5534      return this.contract(namereg.icap.abi).at(namereg.icap.address);
  5535  };
  5536  
  5537  Eth.prototype.isSyncing = function (callback) {
  5538      return new IsSyncing(this._requestManager, callback);
  5539  };
  5540  
  5541  module.exports = Eth;
  5542  
  5543  },{"../../utils/config":18,"../../utils/utils":20,"../contract":25,"../filter":29,"../formatters":30,"../iban":33,"../method":36,"../namereg":44,"../property":45,"../syncing":48,"../transfer":49,"./watches":43}],39:[function(require,module,exports){
  5544  /*
  5545      This file is part of web3.js.
  5546  
  5547      web3.js is free software: you can redistribute it and/or modify
  5548      it under the terms of the GNU Lesser General Public License as published by
  5549      the Free Software Foundation, either version 3 of the License, or
  5550      (at your option) any later version.
  5551  
  5552      web3.js is distributed in the hope that it will be useful,
  5553      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5554      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5555      GNU Lesser General Public License for more details.
  5556  
  5557      You should have received a copy of the GNU Lesser General Public License
  5558      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5559  */
  5560  /** @file eth.js
  5561   * @authors:
  5562   *   Marek Kotewicz <marek@ethdev.com>
  5563   * @date 2015
  5564   */
  5565  
  5566  var utils = require('../../utils/utils');
  5567  var Property = require('../property');
  5568  
  5569  var Net = function (web3) {
  5570      this._requestManager = web3._requestManager;
  5571  
  5572      var self = this;
  5573  
  5574      properties().forEach(function(p) { 
  5575          p.attachToObject(self);
  5576          p.setRequestManager(web3._requestManager);
  5577      });
  5578  };
  5579  
  5580  /// @returns an array of objects describing web3.eth api properties
  5581  var properties = function () {
  5582      return [
  5583          new Property({
  5584              name: 'listening',
  5585              getter: 'net_listening'
  5586          }),
  5587          new Property({
  5588              name: 'peerCount',
  5589              getter: 'net_peerCount',
  5590              outputFormatter: utils.toDecimal
  5591          })
  5592      ];
  5593  };
  5594  
  5595  module.exports = Net;
  5596  
  5597  },{"../../utils/utils":20,"../property":45}],40:[function(require,module,exports){
  5598  /*
  5599      This file is part of web3.js.
  5600  
  5601      web3.js is free software: you can redistribute it and/or modify
  5602      it under the terms of the GNU Lesser General Public License as published by
  5603      the Free Software Foundation, either version 3 of the License, or
  5604      (at your option) any later version.
  5605  
  5606      web3.js is distributed in the hope that it will be useful,
  5607      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5608      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5609      GNU Lesser General Public License for more details.
  5610  
  5611      You should have received a copy of the GNU Lesser General Public License
  5612      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5613  */
  5614  /**
  5615   * @file eth.js
  5616   * @author Marek Kotewicz <marek@ethdev.com>
  5617   * @author Fabian Vogelsteller <fabian@ethdev.com>
  5618   * @date 2015
  5619   */
  5620  
  5621  "use strict";
  5622  
  5623  var Method = require('../method');
  5624  var Property = require('../property');
  5625  var formatters = require('../formatters');
  5626  
  5627  function Personal(web3) {
  5628      this._requestManager = web3._requestManager;
  5629  
  5630      var self = this;
  5631  
  5632      methods().forEach(function(method) {
  5633          method.attachToObject(self);
  5634          method.setRequestManager(self._requestManager);
  5635      });
  5636  
  5637      properties().forEach(function(p) {
  5638          p.attachToObject(self);
  5639          p.setRequestManager(self._requestManager);
  5640      });
  5641  }
  5642  
  5643  var methods = function () {
  5644      var newAccount = new Method({
  5645          name: 'newAccount',
  5646          call: 'personal_newAccount',
  5647          params: 1,
  5648          inputFormatter: [null]
  5649      });
  5650  
  5651      var importRawKey = new Method({
  5652          name: 'importRawKey',
  5653  		call: 'personal_importRawKey',
  5654  		params: 2
  5655      });
  5656  
  5657      var sign = new Method({
  5658          name: 'sign',
  5659  		call: 'personal_sign',
  5660  		params: 3,
  5661  		inputFormatter: [null, formatters.inputAddressFormatter, null]
  5662      });
  5663  
  5664      var ecRecover = new Method({
  5665          name: 'ecRecover',
  5666  		call: 'personal_ecRecover',
  5667  		params: 2
  5668      });
  5669  
  5670      var unlockAccount = new Method({
  5671          name: 'unlockAccount',
  5672          call: 'personal_unlockAccount',
  5673          params: 3,
  5674          inputFormatter: [formatters.inputAddressFormatter, null, null]
  5675      });
  5676  
  5677      var sendTransaction = new Method({
  5678          name: 'sendTransaction',
  5679          call: 'personal_sendTransaction',
  5680          params: 2,
  5681          inputFormatter: [formatters.inputTransactionFormatter, null]
  5682      });
  5683  
  5684      var lockAccount = new Method({
  5685          name: 'lockAccount',
  5686          call: 'personal_lockAccount',
  5687          params: 1,
  5688          inputFormatter: [formatters.inputAddressFormatter]
  5689      });
  5690  
  5691      return [
  5692          newAccount,
  5693          importRawKey,
  5694          unlockAccount,
  5695          ecRecover,
  5696          sign,
  5697          sendTransaction,
  5698          lockAccount
  5699      ];
  5700  };
  5701  
  5702  var properties = function () {
  5703      return [
  5704          new Property({
  5705              name: 'listAccounts',
  5706              getter: 'personal_listAccounts'
  5707          })
  5708      ];
  5709  };
  5710  
  5711  
  5712  module.exports = Personal;
  5713  
  5714  },{"../formatters":30,"../method":36,"../property":45}],41:[function(require,module,exports){
  5715  /*
  5716      This file is part of web3.js.
  5717  
  5718      web3.js is free software: you can redistribute it and/or modify
  5719      it under the terms of the GNU Lesser General Public License as published by
  5720      the Free Software Foundation, either version 3 of the License, or
  5721      (at your option) any later version.
  5722  
  5723      web3.js is distributed in the hope that it will be useful,
  5724      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5725      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5726      GNU Lesser General Public License for more details.
  5727  
  5728      You should have received a copy of the GNU Lesser General Public License
  5729      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5730  */
  5731  /** @file shh.js
  5732   * @authors:
  5733   *   Fabian Vogelsteller <fabian@ethereum.org>
  5734   *   Marek Kotewicz <marek@ethcore.io>
  5735   * @date 2017
  5736   */
  5737  
  5738  var Method = require('../method');
  5739  var Filter = require('../filter');
  5740  var watches = require('./watches');
  5741  
  5742  var Shh = function (web3) {
  5743      this._requestManager = web3._requestManager;
  5744  
  5745      var self = this;
  5746  
  5747      methods().forEach(function(method) {
  5748          method.attachToObject(self);
  5749          method.setRequestManager(self._requestManager);
  5750      });
  5751  };
  5752  
  5753  Shh.prototype.newMessageFilter = function (options, callback, filterCreationErrorCallback) {
  5754      return new Filter(options, 'shh', this._requestManager, watches.shh(), null, callback, filterCreationErrorCallback);
  5755  };
  5756  
  5757  var methods = function () {
  5758  
  5759      return [
  5760          new Method({
  5761              name: 'version',
  5762              call: 'shh_version',
  5763              params: 0
  5764          }),
  5765          new Method({
  5766              name: 'info',
  5767              call: 'shh_info',
  5768              params: 0
  5769          }),
  5770          new Method({
  5771              name: 'setMaxMessageSize',
  5772              call: 'shh_setMaxMessageSize',
  5773              params: 1
  5774          }),
  5775          new Method({
  5776              name: 'setMinPoW',
  5777              call: 'shh_setMinPoW',
  5778              params: 1
  5779          }),
  5780          new Method({
  5781              name: 'markTrustedPeer',
  5782              call: 'shh_markTrustedPeer',
  5783              params: 1
  5784          }),
  5785          new Method({
  5786              name: 'newKeyPair',
  5787              call: 'shh_newKeyPair',
  5788              params: 0
  5789          }),
  5790          new Method({
  5791              name: 'addPrivateKey',
  5792              call: 'shh_addPrivateKey',
  5793              params: 1
  5794          }),
  5795          new Method({
  5796              name: 'deleteKeyPair',
  5797              call: 'shh_deleteKeyPair',
  5798              params: 1
  5799          }),
  5800          new Method({
  5801              name: 'hasKeyPair',
  5802              call: 'shh_hasKeyPair',
  5803              params: 1
  5804          }),
  5805          new Method({
  5806              name: 'getPublicKey',
  5807              call: 'shh_getPublicKey',
  5808              params: 1
  5809          }),
  5810          new Method({
  5811              name: 'getPrivateKey',
  5812              call: 'shh_getPrivateKey',
  5813              params: 1
  5814          }),
  5815          new Method({
  5816              name: 'newSymKey',
  5817              call: 'shh_newSymKey',
  5818              params: 0
  5819          }),
  5820          new Method({
  5821              name: 'addSymKey',
  5822              call: 'shh_addSymKey',
  5823              params: 1
  5824          }),
  5825          new Method({
  5826              name: 'generateSymKeyFromPassword',
  5827              call: 'shh_generateSymKeyFromPassword',
  5828              params: 1
  5829          }),
  5830          new Method({
  5831              name: 'hasSymKey',
  5832              call: 'shh_hasSymKey',
  5833              params: 1
  5834          }),
  5835          new Method({
  5836              name: 'getSymKey',
  5837              call: 'shh_getSymKey',
  5838              params: 1
  5839          }),
  5840          new Method({
  5841              name: 'deleteSymKey',
  5842              call: 'shh_deleteSymKey',
  5843              params: 1
  5844          }),
  5845  
  5846          // subscribe and unsubscribe missing
  5847  
  5848          new Method({
  5849              name: 'post',
  5850              call: 'shh_post',
  5851              params: 1,
  5852              inputFormatter: [null]
  5853          })
  5854      ];
  5855  };
  5856  
  5857  module.exports = Shh;
  5858  
  5859  
  5860  },{"../filter":29,"../method":36,"./watches":43}],42:[function(require,module,exports){
  5861  /*
  5862      This file is part of web3.js.
  5863  
  5864      web3.js is free software: you can redistribute it and/or modify
  5865      it under the terms of the GNU Lesser General Public License as published by
  5866      the Free Software Foundation, either version 3 of the License, or
  5867      (at your option) any later version.
  5868  
  5869      web3.js is distributed in the hope that it will be useful,
  5870      but WITHOUT ANY WARRANTY; without even the implied warranty of
  5871      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  5872      GNU Lesser General Public License for more details.
  5873  
  5874      You should have received a copy of the GNU Lesser General Public License
  5875      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  5876  */
  5877  /**
  5878   * @file bzz.js
  5879   * @author Alex Beregszaszi <alex@rtfs.hu>
  5880   * @date 2016
  5881   *
  5882   * Reference: https://github.com/ethereum/go-ethereum/blob/swarm/internal/web3ext/web3ext.go#L33
  5883   */
  5884  
  5885  "use strict";
  5886  
  5887  var Method = require('../method');
  5888  var Property = require('../property');
  5889  
  5890  function Swarm(web3) {
  5891      this._requestManager = web3._requestManager;
  5892  
  5893      var self = this;
  5894  
  5895      methods().forEach(function(method) {
  5896          method.attachToObject(self);
  5897          method.setRequestManager(self._requestManager);
  5898      });
  5899  
  5900      properties().forEach(function(p) {
  5901          p.attachToObject(self);
  5902          p.setRequestManager(self._requestManager);
  5903      });
  5904  }
  5905  
  5906  var methods = function () {
  5907      var blockNetworkRead = new Method({
  5908          name: 'blockNetworkRead',
  5909          call: 'bzz_blockNetworkRead',
  5910          params: 1,
  5911          inputFormatter: [null]
  5912      });
  5913  
  5914      var syncEnabled = new Method({
  5915          name: 'syncEnabled',
  5916          call: 'bzz_syncEnabled',
  5917          params: 1,
  5918          inputFormatter: [null]
  5919      });
  5920  
  5921      var swapEnabled = new Method({
  5922          name: 'swapEnabled',
  5923          call: 'bzz_swapEnabled',
  5924          params: 1,
  5925          inputFormatter: [null]
  5926      });
  5927  
  5928      var download = new Method({
  5929          name: 'download',
  5930          call: 'bzz_download',
  5931          params: 2,
  5932          inputFormatter: [null, null]
  5933      });
  5934  
  5935      var upload = new Method({
  5936          name: 'upload',
  5937          call: 'bzz_upload',
  5938          params: 2,
  5939          inputFormatter: [null, null]
  5940      });
  5941  
  5942      var retrieve = new Method({
  5943          name: 'retrieve',
  5944          call: 'bzz_retrieve',
  5945          params: 1,
  5946          inputFormatter: [null]
  5947      });
  5948  
  5949      var store = new Method({
  5950          name: 'store',
  5951          call: 'bzz_store',
  5952          params: 2,
  5953          inputFormatter: [null, null]
  5954      });
  5955  
  5956      var get = new Method({
  5957          name: 'get',
  5958          call: 'bzz_get',
  5959          params: 1,
  5960          inputFormatter: [null]
  5961      });
  5962  
  5963      var put = new Method({
  5964          name: 'put',
  5965          call: 'bzz_put',
  5966          params: 2,
  5967          inputFormatter: [null, null]
  5968      });
  5969  
  5970      var modify = new Method({
  5971          name: 'modify',
  5972          call: 'bzz_modify',
  5973          params: 4,
  5974          inputFormatter: [null, null, null, null]
  5975      });
  5976  
  5977      return [
  5978          blockNetworkRead,
  5979          syncEnabled,
  5980          swapEnabled,
  5981          download,
  5982          upload,
  5983          retrieve,
  5984          store,
  5985          get,
  5986          put,
  5987          modify
  5988      ];
  5989  };
  5990  
  5991  var properties = function () {
  5992      return [
  5993          new Property({
  5994              name: 'hive',
  5995              getter: 'bzz_hive'
  5996          }),
  5997          new Property({
  5998              name: 'info',
  5999              getter: 'bzz_info'
  6000          })
  6001      ];
  6002  };
  6003  
  6004  
  6005  module.exports = Swarm;
  6006  
  6007  },{"../method":36,"../property":45}],43:[function(require,module,exports){
  6008  /*
  6009      This file is part of web3.js.
  6010  
  6011      web3.js is free software: you can redistribute it and/or modify
  6012      it under the terms of the GNU Lesser General Public License as published by
  6013      the Free Software Foundation, either version 3 of the License, or
  6014      (at your option) any later version.
  6015  
  6016      web3.js is distributed in the hope that it will be useful,
  6017      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6018      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6019      GNU Lesser General Public License for more details.
  6020  
  6021      You should have received a copy of the GNU Lesser General Public License
  6022      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6023  */
  6024  /** @file watches.js
  6025   * @authors:
  6026   *   Marek Kotewicz <marek@ethdev.com>
  6027   * @date 2015
  6028   */
  6029  
  6030  var Method = require('../method');
  6031  
  6032  /// @returns an array of objects describing web3.eth.filter api methods
  6033  var eth = function () {
  6034      var newFilterCall = function (args) {
  6035          var type = args[0];
  6036  
  6037          switch(type) {
  6038              case 'latest':
  6039                  args.shift();
  6040                  this.params = 0;
  6041                  return 'eth_newBlockFilter';
  6042              case 'pending':
  6043                  args.shift();
  6044                  this.params = 0;
  6045                  return 'eth_newPendingTransactionFilter';
  6046              default:
  6047                  return 'eth_newFilter';
  6048          }
  6049      };
  6050  
  6051      var newFilter = new Method({
  6052          name: 'newFilter',
  6053          call: newFilterCall,
  6054          params: 1
  6055      });
  6056  
  6057      var uninstallFilter = new Method({
  6058          name: 'uninstallFilter',
  6059          call: 'eth_uninstallFilter',
  6060          params: 1
  6061      });
  6062  
  6063      var getLogs = new Method({
  6064          name: 'getLogs',
  6065          call: 'eth_getFilterLogs',
  6066          params: 1
  6067      });
  6068  
  6069      var poll = new Method({
  6070          name: 'poll',
  6071          call: 'eth_getFilterChanges',
  6072          params: 1
  6073      });
  6074  
  6075      return [
  6076          newFilter,
  6077          uninstallFilter,
  6078          getLogs,
  6079          poll
  6080      ];
  6081  };
  6082  
  6083  /// @returns an array of objects describing web3.shh.watch api methods
  6084  var shh = function () {
  6085  
  6086      return [
  6087          new Method({
  6088              name: 'newFilter',
  6089              call: 'shh_newMessageFilter',
  6090              params: 1
  6091          }),
  6092          new Method({
  6093              name: 'uninstallFilter',
  6094              call: 'shh_deleteMessageFilter',
  6095              params: 1
  6096          }),
  6097          new Method({
  6098              name: 'getLogs',
  6099              call: 'shh_getFilterMessages',
  6100              params: 1
  6101          }),
  6102          new Method({
  6103              name: 'poll',
  6104              call: 'shh_getFilterMessages',
  6105              params: 1
  6106          })
  6107      ];
  6108  };
  6109  
  6110  module.exports = {
  6111      eth: eth,
  6112      shh: shh
  6113  };
  6114  
  6115  
  6116  },{"../method":36}],44:[function(require,module,exports){
  6117  /*
  6118      This file is part of web3.js.
  6119  
  6120      web3.js is free software: you can redistribute it and/or modify
  6121      it under the terms of the GNU Lesser General Public License as published by
  6122      the Free Software Foundation, either version 3 of the License, or
  6123      (at your option) any later version.
  6124  
  6125      web3.js is distributed in the hope that it will be useful,
  6126      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6127      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6128      GNU Lesser General Public License for more details.
  6129  
  6130      You should have received a copy of the GNU Lesser General Public License
  6131      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6132  */
  6133  /** 
  6134   * @file namereg.js
  6135   * @author Marek Kotewicz <marek@ethdev.com>
  6136   * @date 2015
  6137   */
  6138  
  6139  var globalRegistrarAbi = require('../contracts/GlobalRegistrar.json');
  6140  var icapRegistrarAbi= require('../contracts/ICAPRegistrar.json');
  6141  
  6142  var globalNameregAddress = '0xc6d9d2cd449a754c494264e1809c50e34d64562b';
  6143  var icapNameregAddress = '0xa1a111bc074c9cfa781f0c38e63bd51c91b8af00';
  6144  
  6145  module.exports = {
  6146      global: {
  6147          abi: globalRegistrarAbi,
  6148          address: globalNameregAddress
  6149      },
  6150      icap: {
  6151          abi: icapRegistrarAbi,
  6152          address: icapNameregAddress
  6153      }
  6154  };
  6155  
  6156  
  6157  },{"../contracts/GlobalRegistrar.json":1,"../contracts/ICAPRegistrar.json":2}],45:[function(require,module,exports){
  6158  /*
  6159      This file is part of web3.js.
  6160  
  6161      web3.js is free software: you can redistribute it and/or modify
  6162      it under the terms of the GNU Lesser General Public License as published by
  6163      the Free Software Foundation, either version 3 of the License, or
  6164      (at your option) any later version.
  6165  
  6166      web3.js is distributed in the hope that it will be useful,
  6167      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6168      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6169      GNU Lesser General Public License for more details.
  6170  
  6171      You should have received a copy of the GNU Lesser General Public License
  6172      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6173  */
  6174  /**
  6175   * @file property.js
  6176   * @author Fabian Vogelsteller <fabian@frozeman.de>
  6177   * @author Marek Kotewicz <marek@ethdev.com>
  6178   * @date 2015
  6179   */
  6180  
  6181  var utils = require('../utils/utils');
  6182  
  6183  var Property = function (options) {
  6184      this.name = options.name;
  6185      this.getter = options.getter;
  6186      this.setter = options.setter;
  6187      this.outputFormatter = options.outputFormatter;
  6188      this.inputFormatter = options.inputFormatter;
  6189      this.requestManager = null;
  6190  };
  6191  
  6192  Property.prototype.setRequestManager = function (rm) {
  6193      this.requestManager = rm;
  6194  };
  6195  
  6196  /**
  6197   * Should be called to format input args of method
  6198   *
  6199   * @method formatInput
  6200   * @param {Array}
  6201   * @return {Array}
  6202   */
  6203  Property.prototype.formatInput = function (arg) {
  6204      return this.inputFormatter ? this.inputFormatter(arg) : arg;
  6205  };
  6206  
  6207  /**
  6208   * Should be called to format output(result) of method
  6209   *
  6210   * @method formatOutput
  6211   * @param {Object}
  6212   * @return {Object}
  6213   */
  6214  Property.prototype.formatOutput = function (result) {
  6215      return this.outputFormatter && result !== null && result !== undefined ? this.outputFormatter(result) : result;
  6216  };
  6217  
  6218  /**
  6219   * Should be used to extract callback from array of arguments. Modifies input param
  6220   *
  6221   * @method extractCallback
  6222   * @param {Array} arguments
  6223   * @return {Function|Null} callback, if exists
  6224   */
  6225  Property.prototype.extractCallback = function (args) {
  6226      if (utils.isFunction(args[args.length - 1])) {
  6227          return args.pop(); // modify the args array!
  6228      }
  6229  };
  6230  
  6231  
  6232  /**
  6233   * Should attach function to method
  6234   *
  6235   * @method attachToObject
  6236   * @param {Object}
  6237   * @param {Function}
  6238   */
  6239  Property.prototype.attachToObject = function (obj) {
  6240      var proto = {
  6241          get: this.buildGet(),
  6242          enumerable: true
  6243      };
  6244  
  6245      var names = this.name.split('.');
  6246      var name = names[0];
  6247      if (names.length > 1) {
  6248          obj[names[0]] = obj[names[0]] || {};
  6249          obj = obj[names[0]];
  6250          name = names[1];
  6251      }
  6252  
  6253      Object.defineProperty(obj, name, proto);
  6254      obj[asyncGetterName(name)] = this.buildAsyncGet();
  6255  };
  6256  
  6257  var asyncGetterName = function (name) {
  6258      return 'get' + name.charAt(0).toUpperCase() + name.slice(1);
  6259  };
  6260  
  6261  Property.prototype.buildGet = function () {
  6262      var property = this;
  6263      return function get() {
  6264          return property.formatOutput(property.requestManager.send({
  6265              method: property.getter
  6266          }));
  6267      };
  6268  };
  6269  
  6270  Property.prototype.buildAsyncGet = function () {
  6271      var property = this;
  6272      var get = function (callback) {
  6273          property.requestManager.sendAsync({
  6274              method: property.getter
  6275          }, function (err, result) {
  6276              callback(err, property.formatOutput(result));
  6277          });
  6278      };
  6279      get.request = this.request.bind(this);
  6280      return get;
  6281  };
  6282  
  6283  /**
  6284   * Should be called to create pure JSONRPC request which can be used in batch request
  6285   *
  6286   * @method request
  6287   * @param {...} params
  6288   * @return {Object} jsonrpc request
  6289   */
  6290  Property.prototype.request = function () {
  6291      var payload = {
  6292          method: this.getter,
  6293          params: [],
  6294          callback: this.extractCallback(Array.prototype.slice.call(arguments))
  6295      };
  6296      payload.format = this.formatOutput.bind(this);
  6297      return payload;
  6298  };
  6299  
  6300  module.exports = Property;
  6301  
  6302  
  6303  },{"../utils/utils":20}],46:[function(require,module,exports){
  6304  /*
  6305      This file is part of web3.js.
  6306  
  6307      web3.js is free software: you can redistribute it and/or modify
  6308      it under the terms of the GNU Lesser General Public License as published by
  6309      the Free Software Foundation, either version 3 of the License, or
  6310      (at your option) any later version.
  6311  
  6312      web3.js is distributed in the hope that it will be useful,
  6313      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6314      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6315      GNU Lesser General Public License for more details.
  6316  
  6317      You should have received a copy of the GNU Lesser General Public License
  6318      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6319  */
  6320  /** 
  6321   * @file requestmanager.js
  6322   * @author Jeffrey Wilcke <jeff@ethdev.com>
  6323   * @author Marek Kotewicz <marek@ethdev.com>
  6324   * @author Marian Oancea <marian@ethdev.com>
  6325   * @author Fabian Vogelsteller <fabian@ethdev.com>
  6326   * @author Gav Wood <g@ethdev.com>
  6327   * @date 2014
  6328   */
  6329  
  6330  var Jsonrpc = require('./jsonrpc');
  6331  var utils = require('../utils/utils');
  6332  var c = require('../utils/config');
  6333  var errors = require('./errors');
  6334  
  6335  /**
  6336   * It's responsible for passing messages to providers
  6337   * It's also responsible for polling the ethereum node for incoming messages
  6338   * Default poll timeout is 1 second
  6339   * Singleton
  6340   */
  6341  var RequestManager = function (provider) {
  6342      this.provider = provider;
  6343      this.polls = {};
  6344      this.timeout = null;
  6345  };
  6346  
  6347  /**
  6348   * Should be used to synchronously send request
  6349   *
  6350   * @method send
  6351   * @param {Object} data
  6352   * @return {Object}
  6353   */
  6354  RequestManager.prototype.send = function (data) {
  6355      if (!this.provider) {
  6356          console.error(errors.InvalidProvider());
  6357          return null;
  6358      }
  6359  
  6360      var payload = Jsonrpc.toPayload(data.method, data.params);
  6361      var result = this.provider.send(payload);
  6362  
  6363      if (!Jsonrpc.isValidResponse(result)) {
  6364          throw errors.InvalidResponse(result);
  6365      }
  6366  
  6367      return result.result;
  6368  };
  6369  
  6370  /**
  6371   * Should be used to asynchronously send request
  6372   *
  6373   * @method sendAsync
  6374   * @param {Object} data
  6375   * @param {Function} callback
  6376   */
  6377  RequestManager.prototype.sendAsync = function (data, callback) {
  6378      if (!this.provider) {
  6379          return callback(errors.InvalidProvider());
  6380      }
  6381  
  6382      var payload = Jsonrpc.toPayload(data.method, data.params);
  6383      this.provider.sendAsync(payload, function (err, result) {
  6384          if (err) {
  6385              return callback(err);
  6386          }
  6387          
  6388          if (!Jsonrpc.isValidResponse(result)) {
  6389              return callback(errors.InvalidResponse(result));
  6390          }
  6391  
  6392          callback(null, result.result);
  6393      });
  6394  };
  6395  
  6396  /**
  6397   * Should be called to asynchronously send batch request
  6398   *
  6399   * @method sendBatch
  6400   * @param {Array} batch data
  6401   * @param {Function} callback
  6402   */
  6403  RequestManager.prototype.sendBatch = function (data, callback) {
  6404      if (!this.provider) {
  6405          return callback(errors.InvalidProvider());
  6406      }
  6407  
  6408      var payload = Jsonrpc.toBatchPayload(data);
  6409  
  6410      this.provider.sendAsync(payload, function (err, results) {
  6411          if (err) {
  6412              return callback(err);
  6413          }
  6414  
  6415          if (!utils.isArray(results)) {
  6416              return callback(errors.InvalidResponse(results));
  6417          }
  6418  
  6419          callback(err, results);
  6420      }); 
  6421  };
  6422  
  6423  /**
  6424   * Should be used to set provider of request manager
  6425   *
  6426   * @method setProvider
  6427   * @param {Object}
  6428   */
  6429  RequestManager.prototype.setProvider = function (p) {
  6430      this.provider = p;
  6431  };
  6432  
  6433  /**
  6434   * Should be used to start polling
  6435   *
  6436   * @method startPolling
  6437   * @param {Object} data
  6438   * @param {Number} pollId
  6439   * @param {Function} callback
  6440   * @param {Function} uninstall
  6441   *
  6442   * @todo cleanup number of params
  6443   */
  6444  RequestManager.prototype.startPolling = function (data, pollId, callback, uninstall) {
  6445      this.polls[pollId] = {data: data, id: pollId, callback: callback, uninstall: uninstall};
  6446  
  6447  
  6448      // start polling
  6449      if (!this.timeout) {
  6450          this.poll();
  6451      }
  6452  };
  6453  
  6454  /**
  6455   * Should be used to stop polling for filter with given id
  6456   *
  6457   * @method stopPolling
  6458   * @param {Number} pollId
  6459   */
  6460  RequestManager.prototype.stopPolling = function (pollId) {
  6461      delete this.polls[pollId];
  6462  
  6463      // stop polling
  6464      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6465          clearTimeout(this.timeout);
  6466          this.timeout = null;
  6467      }
  6468  };
  6469  
  6470  /**
  6471   * Should be called to reset the polling mechanism of the request manager
  6472   *
  6473   * @method reset
  6474   */
  6475  RequestManager.prototype.reset = function (keepIsSyncing) {
  6476      /*jshint maxcomplexity:5 */
  6477  
  6478      for (var key in this.polls) {
  6479          // remove all polls, except sync polls,
  6480          // they need to be removed manually by calling syncing.stopWatching()
  6481          if(!keepIsSyncing || key.indexOf('syncPoll_') === -1) {
  6482              this.polls[key].uninstall();
  6483              delete this.polls[key];
  6484          }
  6485      }
  6486  
  6487      // stop polling
  6488      if(Object.keys(this.polls).length === 0 && this.timeout) {
  6489          clearTimeout(this.timeout);
  6490          this.timeout = null;
  6491      }
  6492  };
  6493  
  6494  /**
  6495   * Should be called to poll for changes on filter with given id
  6496   *
  6497   * @method poll
  6498   */
  6499  RequestManager.prototype.poll = function () {
  6500      /*jshint maxcomplexity: 6 */
  6501      this.timeout = setTimeout(this.poll.bind(this), c.ETH_POLLING_TIMEOUT);
  6502  
  6503      if (Object.keys(this.polls).length === 0) {
  6504          return;
  6505      }
  6506  
  6507      if (!this.provider) {
  6508          console.error(errors.InvalidProvider());
  6509          return;
  6510      }
  6511  
  6512      var pollsData = [];
  6513      var pollsIds = [];
  6514      for (var key in this.polls) {
  6515          pollsData.push(this.polls[key].data);
  6516          pollsIds.push(key);
  6517      }
  6518  
  6519      if (pollsData.length === 0) {
  6520          return;
  6521      }
  6522  
  6523      var payload = Jsonrpc.toBatchPayload(pollsData);
  6524      
  6525      // map the request id to they poll id
  6526      var pollsIdMap = {};
  6527      payload.forEach(function(load, index){
  6528          pollsIdMap[load.id] = pollsIds[index];
  6529      });
  6530  
  6531  
  6532      var self = this;
  6533      this.provider.sendAsync(payload, function (error, results) {
  6534  
  6535  
  6536          // TODO: console log?
  6537          if (error) {
  6538              return;
  6539          }
  6540  
  6541          if (!utils.isArray(results)) {
  6542              throw errors.InvalidResponse(results);
  6543          }
  6544          results.map(function (result) {
  6545              var id = pollsIdMap[result.id];
  6546  
  6547              // make sure the filter is still installed after arrival of the request
  6548              if (self.polls[id]) {
  6549                  result.callback = self.polls[id].callback;
  6550                  return result;
  6551              } else
  6552                  return false;
  6553          }).filter(function (result) {
  6554              return !!result; 
  6555          }).filter(function (result) {
  6556              var valid = Jsonrpc.isValidResponse(result);
  6557              if (!valid) {
  6558                  result.callback(errors.InvalidResponse(result));
  6559              }
  6560              return valid;
  6561          }).forEach(function (result) {
  6562              result.callback(null, result.result);
  6563          });
  6564      });
  6565  };
  6566  
  6567  module.exports = RequestManager;
  6568  
  6569  
  6570  },{"../utils/config":18,"../utils/utils":20,"./errors":26,"./jsonrpc":35}],47:[function(require,module,exports){
  6571  
  6572  
  6573  var Settings = function () {
  6574      this.defaultBlock = 'latest';
  6575      this.defaultAccount = undefined;
  6576  };
  6577  
  6578  module.exports = Settings;
  6579  
  6580  
  6581  },{}],48:[function(require,module,exports){
  6582  /*
  6583      This file is part of web3.js.
  6584  
  6585      web3.js is free software: you can redistribute it and/or modify
  6586      it under the terms of the GNU Lesser General Public License as published by
  6587      the Free Software Foundation, either version 3 of the License, or
  6588      (at your option) any later version.
  6589  
  6590      web3.js is distributed in the hope that it will be useful,
  6591      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6592      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6593      GNU Lesser General Public License for more details.
  6594  
  6595      You should have received a copy of the GNU Lesser General Public License
  6596      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6597  */
  6598  /** @file syncing.js
  6599   * @authors:
  6600   *   Fabian Vogelsteller <fabian@ethdev.com>
  6601   * @date 2015
  6602   */
  6603  
  6604  var formatters = require('./formatters');
  6605  var utils = require('../utils/utils');
  6606  
  6607  var count = 1;
  6608  
  6609  /**
  6610  Adds the callback and sets up the methods, to iterate over the results.
  6611  
  6612  @method pollSyncing
  6613  @param {Object} self
  6614  */
  6615  var pollSyncing = function(self) {
  6616  
  6617      var onMessage = function (error, sync) {
  6618          if (error) {
  6619              return self.callbacks.forEach(function (callback) {
  6620                  callback(error);
  6621              });
  6622          }
  6623  
  6624          if(utils.isObject(sync) && sync.startingBlock)
  6625              sync = formatters.outputSyncingFormatter(sync);
  6626  
  6627          self.callbacks.forEach(function (callback) {
  6628              if (self.lastSyncState !== sync) {
  6629                  
  6630                  // call the callback with true first so the app can stop anything, before receiving the sync data
  6631                  if(!self.lastSyncState && utils.isObject(sync))
  6632                      callback(null, true);
  6633                  
  6634                  // call on the next CPU cycle, so the actions of the sync stop can be processes first
  6635                  setTimeout(function() {
  6636                      callback(null, sync);
  6637                  }, 0);
  6638                  
  6639                  self.lastSyncState = sync;
  6640              }
  6641          });
  6642      };
  6643  
  6644      self.requestManager.startPolling({
  6645          method: 'eth_syncing',
  6646          params: [],
  6647      }, self.pollId, onMessage, self.stopWatching.bind(self));
  6648  
  6649  };
  6650  
  6651  var IsSyncing = function (requestManager, callback) {
  6652      this.requestManager = requestManager;
  6653      this.pollId = 'syncPoll_'+ count++;
  6654      this.callbacks = [];
  6655      this.addCallback(callback);
  6656      this.lastSyncState = false;
  6657      pollSyncing(this);
  6658  
  6659      return this;
  6660  };
  6661  
  6662  IsSyncing.prototype.addCallback = function (callback) {
  6663      if(callback)
  6664          this.callbacks.push(callback);
  6665      return this;
  6666  };
  6667  
  6668  IsSyncing.prototype.stopWatching = function () {
  6669      this.requestManager.stopPolling(this.pollId);
  6670      this.callbacks = [];
  6671  };
  6672  
  6673  module.exports = IsSyncing;
  6674  
  6675  
  6676  },{"../utils/utils":20,"./formatters":30}],49:[function(require,module,exports){
  6677  /*
  6678      This file is part of web3.js.
  6679  
  6680      web3.js is free software: you can redistribute it and/or modify
  6681      it under the terms of the GNU Lesser General Public License as published by
  6682      the Free Software Foundation, either version 3 of the License, or
  6683      (at your option) any later version.
  6684  
  6685      web3.js is distributed in the hope that it will be useful,
  6686      but WITHOUT ANY WARRANTY; without even the implied warranty of
  6687      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  6688      GNU Lesser General Public License for more details.
  6689  
  6690      You should have received a copy of the GNU Lesser General Public License
  6691      along with web3.js.  If not, see <http://www.gnu.org/licenses/>.
  6692  */
  6693  /** 
  6694   * @file transfer.js
  6695   * @author Marek Kotewicz <marek@ethdev.com>
  6696   * @date 2015
  6697   */
  6698  
  6699  var Iban = require('./iban');
  6700  var exchangeAbi = require('../contracts/SmartExchange.json');
  6701  
  6702  /**
  6703   * Should be used to make Iban transfer
  6704   *
  6705   * @method transfer
  6706   * @param {String} from
  6707   * @param {String} to iban
  6708   * @param {Value} value to be tranfered
  6709   * @param {Function} callback, callback
  6710   */
  6711  var transfer = function (eth, from, to, value, callback) {
  6712      var iban = new Iban(to); 
  6713      if (!iban.isValid()) {
  6714          throw new Error('invalid iban address');
  6715      }
  6716  
  6717      if (iban.isDirect()) {
  6718          return transferToAddress(eth, from, iban.address(), value, callback);
  6719      }
  6720      
  6721      if (!callback) {
  6722          var address = eth.icapNamereg().addr(iban.institution());
  6723          return deposit(eth, from, address, value, iban.client());
  6724      }
  6725  
  6726      eth.icapNamereg().addr(iban.institution(), function (err, address) {
  6727          return deposit(eth, from, address, value, iban.client(), callback);
  6728      });
  6729      
  6730  };
  6731  
  6732  /**
  6733   * Should be used to transfer funds to certain address
  6734   *
  6735   * @method transferToAddress
  6736   * @param {String} from
  6737   * @param {String} to
  6738   * @param {Value} value to be tranfered
  6739   * @param {Function} callback, callback
  6740   */
  6741  var transferToAddress = function (eth, from, to, value, callback) {
  6742      return eth.sendTransaction({
  6743          address: to,
  6744          from: from,
  6745          value: value
  6746      }, callback);
  6747  };
  6748  
  6749  /**
  6750   * Should be used to deposit funds to generic Exchange contract (must implement deposit(bytes32) method!)
  6751   *
  6752   * @method deposit
  6753   * @param {String} from
  6754   * @param {String} to
  6755   * @param {Value} value to be transferred
  6756   * @param {String} client unique identifier
  6757   * @param {Function} callback, callback
  6758   */
  6759  var deposit = function (eth, from, to, value, client, callback) {
  6760      var abi = exchangeAbi;
  6761      return eth.contract(abi).at(to).deposit(client, {
  6762          from: from,
  6763          value: value
  6764      }, callback);
  6765  };
  6766  
  6767  module.exports = transfer;
  6768  
  6769  
  6770  },{"../contracts/SmartExchange.json":3,"./iban":33}],50:[function(require,module,exports){
  6771  
  6772  },{}],51:[function(require,module,exports){
  6773  ;(function (root, factory, undef) {
  6774  	if (typeof exports === "object") {
  6775  		// CommonJS
  6776  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
  6777  	}
  6778  	else if (typeof define === "function" && define.amd) {
  6779  		// AMD
  6780  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
  6781  	}
  6782  	else {
  6783  		// Global (browser)
  6784  		factory(root.CryptoJS);
  6785  	}
  6786  }(this, function (CryptoJS) {
  6787  
  6788  	(function () {
  6789  	    // Shortcuts
  6790  	    var C = CryptoJS;
  6791  	    var C_lib = C.lib;
  6792  	    var BlockCipher = C_lib.BlockCipher;
  6793  	    var C_algo = C.algo;
  6794  
  6795  	    // Lookup tables
  6796  	    var SBOX = [];
  6797  	    var INV_SBOX = [];
  6798  	    var SUB_MIX_0 = [];
  6799  	    var SUB_MIX_1 = [];
  6800  	    var SUB_MIX_2 = [];
  6801  	    var SUB_MIX_3 = [];
  6802  	    var INV_SUB_MIX_0 = [];
  6803  	    var INV_SUB_MIX_1 = [];
  6804  	    var INV_SUB_MIX_2 = [];
  6805  	    var INV_SUB_MIX_3 = [];
  6806  
  6807  	    // Compute lookup tables
  6808  	    (function () {
  6809  	        // Compute double table
  6810  	        var d = [];
  6811  	        for (var i = 0; i < 256; i++) {
  6812  	            if (i < 128) {
  6813  	                d[i] = i << 1;
  6814  	            } else {
  6815  	                d[i] = (i << 1) ^ 0x11b;
  6816  	            }
  6817  	        }
  6818  
  6819  	        // Walk GF(2^8)
  6820  	        var x = 0;
  6821  	        var xi = 0;
  6822  	        for (var i = 0; i < 256; i++) {
  6823  	            // Compute sbox
  6824  	            var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
  6825  	            sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
  6826  	            SBOX[x] = sx;
  6827  	            INV_SBOX[sx] = x;
  6828  
  6829  	            // Compute multiplication
  6830  	            var x2 = d[x];
  6831  	            var x4 = d[x2];
  6832  	            var x8 = d[x4];
  6833  
  6834  	            // Compute sub bytes, mix columns tables
  6835  	            var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
  6836  	            SUB_MIX_0[x] = (t << 24) | (t >>> 8);
  6837  	            SUB_MIX_1[x] = (t << 16) | (t >>> 16);
  6838  	            SUB_MIX_2[x] = (t << 8)  | (t >>> 24);
  6839  	            SUB_MIX_3[x] = t;
  6840  
  6841  	            // Compute inv sub bytes, inv mix columns tables
  6842  	            var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
  6843  	            INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
  6844  	            INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
  6845  	            INV_SUB_MIX_2[sx] = (t << 8)  | (t >>> 24);
  6846  	            INV_SUB_MIX_3[sx] = t;
  6847  
  6848  	            // Compute next counter
  6849  	            if (!x) {
  6850  	                x = xi = 1;
  6851  	            } else {
  6852  	                x = x2 ^ d[d[d[x8 ^ x2]]];
  6853  	                xi ^= d[d[xi]];
  6854  	            }
  6855  	        }
  6856  	    }());
  6857  
  6858  	    // Precomputed Rcon lookup
  6859  	    var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
  6860  
  6861  	    /**
  6862  	     * AES block cipher algorithm.
  6863  	     */
  6864  	    var AES = C_algo.AES = BlockCipher.extend({
  6865  	        _doReset: function () {
  6866  	            // Skip reset of nRounds has been set before and key did not change
  6867  	            if (this._nRounds && this._keyPriorReset === this._key) {
  6868  	                return;
  6869  	            }
  6870  
  6871  	            // Shortcuts
  6872  	            var key = this._keyPriorReset = this._key;
  6873  	            var keyWords = key.words;
  6874  	            var keySize = key.sigBytes / 4;
  6875  
  6876  	            // Compute number of rounds
  6877  	            var nRounds = this._nRounds = keySize + 6;
  6878  
  6879  	            // Compute number of key schedule rows
  6880  	            var ksRows = (nRounds + 1) * 4;
  6881  
  6882  	            // Compute key schedule
  6883  	            var keySchedule = this._keySchedule = [];
  6884  	            for (var ksRow = 0; ksRow < ksRows; ksRow++) {
  6885  	                if (ksRow < keySize) {
  6886  	                    keySchedule[ksRow] = keyWords[ksRow];
  6887  	                } else {
  6888  	                    var t = keySchedule[ksRow - 1];
  6889  
  6890  	                    if (!(ksRow % keySize)) {
  6891  	                        // Rot word
  6892  	                        t = (t << 8) | (t >>> 24);
  6893  
  6894  	                        // Sub word
  6895  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6896  
  6897  	                        // Mix Rcon
  6898  	                        t ^= RCON[(ksRow / keySize) | 0] << 24;
  6899  	                    } else if (keySize > 6 && ksRow % keySize == 4) {
  6900  	                        // Sub word
  6901  	                        t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
  6902  	                    }
  6903  
  6904  	                    keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
  6905  	                }
  6906  	            }
  6907  
  6908  	            // Compute inv key schedule
  6909  	            var invKeySchedule = this._invKeySchedule = [];
  6910  	            for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
  6911  	                var ksRow = ksRows - invKsRow;
  6912  
  6913  	                if (invKsRow % 4) {
  6914  	                    var t = keySchedule[ksRow];
  6915  	                } else {
  6916  	                    var t = keySchedule[ksRow - 4];
  6917  	                }
  6918  
  6919  	                if (invKsRow < 4 || ksRow <= 4) {
  6920  	                    invKeySchedule[invKsRow] = t;
  6921  	                } else {
  6922  	                    invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
  6923  	                                               INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
  6924  	                }
  6925  	            }
  6926  	        },
  6927  
  6928  	        encryptBlock: function (M, offset) {
  6929  	            this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
  6930  	        },
  6931  
  6932  	        decryptBlock: function (M, offset) {
  6933  	            // Swap 2nd and 4th rows
  6934  	            var t = M[offset + 1];
  6935  	            M[offset + 1] = M[offset + 3];
  6936  	            M[offset + 3] = t;
  6937  
  6938  	            this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
  6939  
  6940  	            // Inv swap 2nd and 4th rows
  6941  	            var t = M[offset + 1];
  6942  	            M[offset + 1] = M[offset + 3];
  6943  	            M[offset + 3] = t;
  6944  	        },
  6945  
  6946  	        _doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
  6947  	            // Shortcut
  6948  	            var nRounds = this._nRounds;
  6949  
  6950  	            // Get input, add round key
  6951  	            var s0 = M[offset]     ^ keySchedule[0];
  6952  	            var s1 = M[offset + 1] ^ keySchedule[1];
  6953  	            var s2 = M[offset + 2] ^ keySchedule[2];
  6954  	            var s3 = M[offset + 3] ^ keySchedule[3];
  6955  
  6956  	            // Key schedule row counter
  6957  	            var ksRow = 4;
  6958  
  6959  	            // Rounds
  6960  	            for (var round = 1; round < nRounds; round++) {
  6961  	                // Shift rows, sub bytes, mix columns, add round key
  6962  	                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++];
  6963  	                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++];
  6964  	                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++];
  6965  	                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++];
  6966  
  6967  	                // Update state
  6968  	                s0 = t0;
  6969  	                s1 = t1;
  6970  	                s2 = t2;
  6971  	                s3 = t3;
  6972  	            }
  6973  
  6974  	            // Shift rows, sub bytes, add round key
  6975  	            var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
  6976  	            var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
  6977  	            var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
  6978  	            var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
  6979  
  6980  	            // Set output
  6981  	            M[offset]     = t0;
  6982  	            M[offset + 1] = t1;
  6983  	            M[offset + 2] = t2;
  6984  	            M[offset + 3] = t3;
  6985  	        },
  6986  
  6987  	        keySize: 256/32
  6988  	    });
  6989  
  6990  	    /**
  6991  	     * Shortcut functions to the cipher's object interface.
  6992  	     *
  6993  	     * @example
  6994  	     *
  6995  	     *     var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
  6996  	     *     var plaintext  = CryptoJS.AES.decrypt(ciphertext, key, cfg);
  6997  	     */
  6998  	    C.AES = BlockCipher._createHelper(AES);
  6999  	}());
  7000  
  7001  
  7002  	return CryptoJS.AES;
  7003  
  7004  }));
  7005  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],52:[function(require,module,exports){
  7006  ;(function (root, factory) {
  7007  	if (typeof exports === "object") {
  7008  		// CommonJS
  7009  		module.exports = exports = factory(require("./core"));
  7010  	}
  7011  	else if (typeof define === "function" && define.amd) {
  7012  		// AMD
  7013  		define(["./core"], factory);
  7014  	}
  7015  	else {
  7016  		// Global (browser)
  7017  		factory(root.CryptoJS);
  7018  	}
  7019  }(this, function (CryptoJS) {
  7020  
  7021  	/**
  7022  	 * Cipher core components.
  7023  	 */
  7024  	CryptoJS.lib.Cipher || (function (undefined) {
  7025  	    // Shortcuts
  7026  	    var C = CryptoJS;
  7027  	    var C_lib = C.lib;
  7028  	    var Base = C_lib.Base;
  7029  	    var WordArray = C_lib.WordArray;
  7030  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
  7031  	    var C_enc = C.enc;
  7032  	    var Utf8 = C_enc.Utf8;
  7033  	    var Base64 = C_enc.Base64;
  7034  	    var C_algo = C.algo;
  7035  	    var EvpKDF = C_algo.EvpKDF;
  7036  
  7037  	    /**
  7038  	     * Abstract base cipher template.
  7039  	     *
  7040  	     * @property {number} keySize This cipher's key size. Default: 4 (128 bits)
  7041  	     * @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
  7042  	     * @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
  7043  	     * @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
  7044  	     */
  7045  	    var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
  7046  	        /**
  7047  	         * Configuration options.
  7048  	         *
  7049  	         * @property {WordArray} iv The IV to use for this operation.
  7050  	         */
  7051  	        cfg: Base.extend(),
  7052  
  7053  	        /**
  7054  	         * Creates this cipher in encryption mode.
  7055  	         *
  7056  	         * @param {WordArray} key The key.
  7057  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7058  	         *
  7059  	         * @return {Cipher} A cipher instance.
  7060  	         *
  7061  	         * @static
  7062  	         *
  7063  	         * @example
  7064  	         *
  7065  	         *     var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
  7066  	         */
  7067  	        createEncryptor: function (key, cfg) {
  7068  	            return this.create(this._ENC_XFORM_MODE, key, cfg);
  7069  	        },
  7070  
  7071  	        /**
  7072  	         * Creates this cipher in decryption mode.
  7073  	         *
  7074  	         * @param {WordArray} key The key.
  7075  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7076  	         *
  7077  	         * @return {Cipher} A cipher instance.
  7078  	         *
  7079  	         * @static
  7080  	         *
  7081  	         * @example
  7082  	         *
  7083  	         *     var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
  7084  	         */
  7085  	        createDecryptor: function (key, cfg) {
  7086  	            return this.create(this._DEC_XFORM_MODE, key, cfg);
  7087  	        },
  7088  
  7089  	        /**
  7090  	         * Initializes a newly created cipher.
  7091  	         *
  7092  	         * @param {number} xformMode Either the encryption or decryption transormation mode constant.
  7093  	         * @param {WordArray} key The key.
  7094  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7095  	         *
  7096  	         * @example
  7097  	         *
  7098  	         *     var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
  7099  	         */
  7100  	        init: function (xformMode, key, cfg) {
  7101  	            // Apply config defaults
  7102  	            this.cfg = this.cfg.extend(cfg);
  7103  
  7104  	            // Store transform mode and key
  7105  	            this._xformMode = xformMode;
  7106  	            this._key = key;
  7107  
  7108  	            // Set initial values
  7109  	            this.reset();
  7110  	        },
  7111  
  7112  	        /**
  7113  	         * Resets this cipher to its initial state.
  7114  	         *
  7115  	         * @example
  7116  	         *
  7117  	         *     cipher.reset();
  7118  	         */
  7119  	        reset: function () {
  7120  	            // Reset data buffer
  7121  	            BufferedBlockAlgorithm.reset.call(this);
  7122  
  7123  	            // Perform concrete-cipher logic
  7124  	            this._doReset();
  7125  	        },
  7126  
  7127  	        /**
  7128  	         * Adds data to be encrypted or decrypted.
  7129  	         *
  7130  	         * @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
  7131  	         *
  7132  	         * @return {WordArray} The data after processing.
  7133  	         *
  7134  	         * @example
  7135  	         *
  7136  	         *     var encrypted = cipher.process('data');
  7137  	         *     var encrypted = cipher.process(wordArray);
  7138  	         */
  7139  	        process: function (dataUpdate) {
  7140  	            // Append
  7141  	            this._append(dataUpdate);
  7142  
  7143  	            // Process available blocks
  7144  	            return this._process();
  7145  	        },
  7146  
  7147  	        /**
  7148  	         * Finalizes the encryption or decryption process.
  7149  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  7150  	         *
  7151  	         * @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
  7152  	         *
  7153  	         * @return {WordArray} The data after final processing.
  7154  	         *
  7155  	         * @example
  7156  	         *
  7157  	         *     var encrypted = cipher.finalize();
  7158  	         *     var encrypted = cipher.finalize('data');
  7159  	         *     var encrypted = cipher.finalize(wordArray);
  7160  	         */
  7161  	        finalize: function (dataUpdate) {
  7162  	            // Final data update
  7163  	            if (dataUpdate) {
  7164  	                this._append(dataUpdate);
  7165  	            }
  7166  
  7167  	            // Perform concrete-cipher logic
  7168  	            var finalProcessedData = this._doFinalize();
  7169  
  7170  	            return finalProcessedData;
  7171  	        },
  7172  
  7173  	        keySize: 128/32,
  7174  
  7175  	        ivSize: 128/32,
  7176  
  7177  	        _ENC_XFORM_MODE: 1,
  7178  
  7179  	        _DEC_XFORM_MODE: 2,
  7180  
  7181  	        /**
  7182  	         * Creates shortcut functions to a cipher's object interface.
  7183  	         *
  7184  	         * @param {Cipher} cipher The cipher to create a helper for.
  7185  	         *
  7186  	         * @return {Object} An object with encrypt and decrypt shortcut functions.
  7187  	         *
  7188  	         * @static
  7189  	         *
  7190  	         * @example
  7191  	         *
  7192  	         *     var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
  7193  	         */
  7194  	        _createHelper: (function () {
  7195  	            function selectCipherStrategy(key) {
  7196  	                if (typeof key == 'string') {
  7197  	                    return PasswordBasedCipher;
  7198  	                } else {
  7199  	                    return SerializableCipher;
  7200  	                }
  7201  	            }
  7202  
  7203  	            return function (cipher) {
  7204  	                return {
  7205  	                    encrypt: function (message, key, cfg) {
  7206  	                        return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
  7207  	                    },
  7208  
  7209  	                    decrypt: function (ciphertext, key, cfg) {
  7210  	                        return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
  7211  	                    }
  7212  	                };
  7213  	            };
  7214  	        }())
  7215  	    });
  7216  
  7217  	    /**
  7218  	     * Abstract base stream cipher template.
  7219  	     *
  7220  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
  7221  	     */
  7222  	    var StreamCipher = C_lib.StreamCipher = Cipher.extend({
  7223  	        _doFinalize: function () {
  7224  	            // Process partial blocks
  7225  	            var finalProcessedBlocks = this._process(!!'flush');
  7226  
  7227  	            return finalProcessedBlocks;
  7228  	        },
  7229  
  7230  	        blockSize: 1
  7231  	    });
  7232  
  7233  	    /**
  7234  	     * Mode namespace.
  7235  	     */
  7236  	    var C_mode = C.mode = {};
  7237  
  7238  	    /**
  7239  	     * Abstract base block cipher mode template.
  7240  	     */
  7241  	    var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
  7242  	        /**
  7243  	         * Creates this mode for encryption.
  7244  	         *
  7245  	         * @param {Cipher} cipher A block cipher instance.
  7246  	         * @param {Array} iv The IV words.
  7247  	         *
  7248  	         * @static
  7249  	         *
  7250  	         * @example
  7251  	         *
  7252  	         *     var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
  7253  	         */
  7254  	        createEncryptor: function (cipher, iv) {
  7255  	            return this.Encryptor.create(cipher, iv);
  7256  	        },
  7257  
  7258  	        /**
  7259  	         * Creates this mode for decryption.
  7260  	         *
  7261  	         * @param {Cipher} cipher A block cipher instance.
  7262  	         * @param {Array} iv The IV words.
  7263  	         *
  7264  	         * @static
  7265  	         *
  7266  	         * @example
  7267  	         *
  7268  	         *     var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
  7269  	         */
  7270  	        createDecryptor: function (cipher, iv) {
  7271  	            return this.Decryptor.create(cipher, iv);
  7272  	        },
  7273  
  7274  	        /**
  7275  	         * Initializes a newly created mode.
  7276  	         *
  7277  	         * @param {Cipher} cipher A block cipher instance.
  7278  	         * @param {Array} iv The IV words.
  7279  	         *
  7280  	         * @example
  7281  	         *
  7282  	         *     var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
  7283  	         */
  7284  	        init: function (cipher, iv) {
  7285  	            this._cipher = cipher;
  7286  	            this._iv = iv;
  7287  	        }
  7288  	    });
  7289  
  7290  	    /**
  7291  	     * Cipher Block Chaining mode.
  7292  	     */
  7293  	    var CBC = C_mode.CBC = (function () {
  7294  	        /**
  7295  	         * Abstract base CBC mode.
  7296  	         */
  7297  	        var CBC = BlockCipherMode.extend();
  7298  
  7299  	        /**
  7300  	         * CBC encryptor.
  7301  	         */
  7302  	        CBC.Encryptor = CBC.extend({
  7303  	            /**
  7304  	             * Processes the data block at offset.
  7305  	             *
  7306  	             * @param {Array} words The data words to operate on.
  7307  	             * @param {number} offset The offset where the block starts.
  7308  	             *
  7309  	             * @example
  7310  	             *
  7311  	             *     mode.processBlock(data.words, offset);
  7312  	             */
  7313  	            processBlock: function (words, offset) {
  7314  	                // Shortcuts
  7315  	                var cipher = this._cipher;
  7316  	                var blockSize = cipher.blockSize;
  7317  
  7318  	                // XOR and encrypt
  7319  	                xorBlock.call(this, words, offset, blockSize);
  7320  	                cipher.encryptBlock(words, offset);
  7321  
  7322  	                // Remember this block to use with next block
  7323  	                this._prevBlock = words.slice(offset, offset + blockSize);
  7324  	            }
  7325  	        });
  7326  
  7327  	        /**
  7328  	         * CBC decryptor.
  7329  	         */
  7330  	        CBC.Decryptor = CBC.extend({
  7331  	            /**
  7332  	             * Processes the data block at offset.
  7333  	             *
  7334  	             * @param {Array} words The data words to operate on.
  7335  	             * @param {number} offset The offset where the block starts.
  7336  	             *
  7337  	             * @example
  7338  	             *
  7339  	             *     mode.processBlock(data.words, offset);
  7340  	             */
  7341  	            processBlock: function (words, offset) {
  7342  	                // Shortcuts
  7343  	                var cipher = this._cipher;
  7344  	                var blockSize = cipher.blockSize;
  7345  
  7346  	                // Remember this block to use with next block
  7347  	                var thisBlock = words.slice(offset, offset + blockSize);
  7348  
  7349  	                // Decrypt and XOR
  7350  	                cipher.decryptBlock(words, offset);
  7351  	                xorBlock.call(this, words, offset, blockSize);
  7352  
  7353  	                // This block becomes the previous block
  7354  	                this._prevBlock = thisBlock;
  7355  	            }
  7356  	        });
  7357  
  7358  	        function xorBlock(words, offset, blockSize) {
  7359  	            // Shortcut
  7360  	            var iv = this._iv;
  7361  
  7362  	            // Choose mixing block
  7363  	            if (iv) {
  7364  	                var block = iv;
  7365  
  7366  	                // Remove IV for subsequent blocks
  7367  	                this._iv = undefined;
  7368  	            } else {
  7369  	                var block = this._prevBlock;
  7370  	            }
  7371  
  7372  	            // XOR blocks
  7373  	            for (var i = 0; i < blockSize; i++) {
  7374  	                words[offset + i] ^= block[i];
  7375  	            }
  7376  	        }
  7377  
  7378  	        return CBC;
  7379  	    }());
  7380  
  7381  	    /**
  7382  	     * Padding namespace.
  7383  	     */
  7384  	    var C_pad = C.pad = {};
  7385  
  7386  	    /**
  7387  	     * PKCS #5/7 padding strategy.
  7388  	     */
  7389  	    var Pkcs7 = C_pad.Pkcs7 = {
  7390  	        /**
  7391  	         * Pads data using the algorithm defined in PKCS #5/7.
  7392  	         *
  7393  	         * @param {WordArray} data The data to pad.
  7394  	         * @param {number} blockSize The multiple that the data should be padded to.
  7395  	         *
  7396  	         * @static
  7397  	         *
  7398  	         * @example
  7399  	         *
  7400  	         *     CryptoJS.pad.Pkcs7.pad(wordArray, 4);
  7401  	         */
  7402  	        pad: function (data, blockSize) {
  7403  	            // Shortcut
  7404  	            var blockSizeBytes = blockSize * 4;
  7405  
  7406  	            // Count padding bytes
  7407  	            var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
  7408  
  7409  	            // Create padding word
  7410  	            var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
  7411  
  7412  	            // Create padding
  7413  	            var paddingWords = [];
  7414  	            for (var i = 0; i < nPaddingBytes; i += 4) {
  7415  	                paddingWords.push(paddingWord);
  7416  	            }
  7417  	            var padding = WordArray.create(paddingWords, nPaddingBytes);
  7418  
  7419  	            // Add padding
  7420  	            data.concat(padding);
  7421  	        },
  7422  
  7423  	        /**
  7424  	         * Unpads data that had been padded using the algorithm defined in PKCS #5/7.
  7425  	         *
  7426  	         * @param {WordArray} data The data to unpad.
  7427  	         *
  7428  	         * @static
  7429  	         *
  7430  	         * @example
  7431  	         *
  7432  	         *     CryptoJS.pad.Pkcs7.unpad(wordArray);
  7433  	         */
  7434  	        unpad: function (data) {
  7435  	            // Get number of padding bytes from last byte
  7436  	            var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
  7437  
  7438  	            // Remove padding
  7439  	            data.sigBytes -= nPaddingBytes;
  7440  	        }
  7441  	    };
  7442  
  7443  	    /**
  7444  	     * Abstract base block cipher template.
  7445  	     *
  7446  	     * @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
  7447  	     */
  7448  	    var BlockCipher = C_lib.BlockCipher = Cipher.extend({
  7449  	        /**
  7450  	         * Configuration options.
  7451  	         *
  7452  	         * @property {Mode} mode The block mode to use. Default: CBC
  7453  	         * @property {Padding} padding The padding strategy to use. Default: Pkcs7
  7454  	         */
  7455  	        cfg: Cipher.cfg.extend({
  7456  	            mode: CBC,
  7457  	            padding: Pkcs7
  7458  	        }),
  7459  
  7460  	        reset: function () {
  7461  	            // Reset cipher
  7462  	            Cipher.reset.call(this);
  7463  
  7464  	            // Shortcuts
  7465  	            var cfg = this.cfg;
  7466  	            var iv = cfg.iv;
  7467  	            var mode = cfg.mode;
  7468  
  7469  	            // Reset block mode
  7470  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7471  	                var modeCreator = mode.createEncryptor;
  7472  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7473  	                var modeCreator = mode.createDecryptor;
  7474  
  7475  	                // Keep at least one block in the buffer for unpadding
  7476  	                this._minBufferSize = 1;
  7477  	            }
  7478  	            this._mode = modeCreator.call(mode, this, iv && iv.words);
  7479  	        },
  7480  
  7481  	        _doProcessBlock: function (words, offset) {
  7482  	            this._mode.processBlock(words, offset);
  7483  	        },
  7484  
  7485  	        _doFinalize: function () {
  7486  	            // Shortcut
  7487  	            var padding = this.cfg.padding;
  7488  
  7489  	            // Finalize
  7490  	            if (this._xformMode == this._ENC_XFORM_MODE) {
  7491  	                // Pad data
  7492  	                padding.pad(this._data, this.blockSize);
  7493  
  7494  	                // Process final blocks
  7495  	                var finalProcessedBlocks = this._process(!!'flush');
  7496  	            } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
  7497  	                // Process final blocks
  7498  	                var finalProcessedBlocks = this._process(!!'flush');
  7499  
  7500  	                // Unpad data
  7501  	                padding.unpad(finalProcessedBlocks);
  7502  	            }
  7503  
  7504  	            return finalProcessedBlocks;
  7505  	        },
  7506  
  7507  	        blockSize: 128/32
  7508  	    });
  7509  
  7510  	    /**
  7511  	     * A collection of cipher parameters.
  7512  	     *
  7513  	     * @property {WordArray} ciphertext The raw ciphertext.
  7514  	     * @property {WordArray} key The key to this ciphertext.
  7515  	     * @property {WordArray} iv The IV used in the ciphering operation.
  7516  	     * @property {WordArray} salt The salt used with a key derivation function.
  7517  	     * @property {Cipher} algorithm The cipher algorithm.
  7518  	     * @property {Mode} mode The block mode used in the ciphering operation.
  7519  	     * @property {Padding} padding The padding scheme used in the ciphering operation.
  7520  	     * @property {number} blockSize The block size of the cipher.
  7521  	     * @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
  7522  	     */
  7523  	    var CipherParams = C_lib.CipherParams = Base.extend({
  7524  	        /**
  7525  	         * Initializes a newly created cipher params object.
  7526  	         *
  7527  	         * @param {Object} cipherParams An object with any of the possible cipher parameters.
  7528  	         *
  7529  	         * @example
  7530  	         *
  7531  	         *     var cipherParams = CryptoJS.lib.CipherParams.create({
  7532  	         *         ciphertext: ciphertextWordArray,
  7533  	         *         key: keyWordArray,
  7534  	         *         iv: ivWordArray,
  7535  	         *         salt: saltWordArray,
  7536  	         *         algorithm: CryptoJS.algo.AES,
  7537  	         *         mode: CryptoJS.mode.CBC,
  7538  	         *         padding: CryptoJS.pad.PKCS7,
  7539  	         *         blockSize: 4,
  7540  	         *         formatter: CryptoJS.format.OpenSSL
  7541  	         *     });
  7542  	         */
  7543  	        init: function (cipherParams) {
  7544  	            this.mixIn(cipherParams);
  7545  	        },
  7546  
  7547  	        /**
  7548  	         * Converts this cipher params object to a string.
  7549  	         *
  7550  	         * @param {Format} formatter (Optional) The formatting strategy to use.
  7551  	         *
  7552  	         * @return {string} The stringified cipher params.
  7553  	         *
  7554  	         * @throws Error If neither the formatter nor the default formatter is set.
  7555  	         *
  7556  	         * @example
  7557  	         *
  7558  	         *     var string = cipherParams + '';
  7559  	         *     var string = cipherParams.toString();
  7560  	         *     var string = cipherParams.toString(CryptoJS.format.OpenSSL);
  7561  	         */
  7562  	        toString: function (formatter) {
  7563  	            return (formatter || this.formatter).stringify(this);
  7564  	        }
  7565  	    });
  7566  
  7567  	    /**
  7568  	     * Format namespace.
  7569  	     */
  7570  	    var C_format = C.format = {};
  7571  
  7572  	    /**
  7573  	     * OpenSSL formatting strategy.
  7574  	     */
  7575  	    var OpenSSLFormatter = C_format.OpenSSL = {
  7576  	        /**
  7577  	         * Converts a cipher params object to an OpenSSL-compatible string.
  7578  	         *
  7579  	         * @param {CipherParams} cipherParams The cipher params object.
  7580  	         *
  7581  	         * @return {string} The OpenSSL-compatible string.
  7582  	         *
  7583  	         * @static
  7584  	         *
  7585  	         * @example
  7586  	         *
  7587  	         *     var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
  7588  	         */
  7589  	        stringify: function (cipherParams) {
  7590  	            // Shortcuts
  7591  	            var ciphertext = cipherParams.ciphertext;
  7592  	            var salt = cipherParams.salt;
  7593  
  7594  	            // Format
  7595  	            if (salt) {
  7596  	                var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
  7597  	            } else {
  7598  	                var wordArray = ciphertext;
  7599  	            }
  7600  
  7601  	            return wordArray.toString(Base64);
  7602  	        },
  7603  
  7604  	        /**
  7605  	         * Converts an OpenSSL-compatible string to a cipher params object.
  7606  	         *
  7607  	         * @param {string} openSSLStr The OpenSSL-compatible string.
  7608  	         *
  7609  	         * @return {CipherParams} The cipher params object.
  7610  	         *
  7611  	         * @static
  7612  	         *
  7613  	         * @example
  7614  	         *
  7615  	         *     var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
  7616  	         */
  7617  	        parse: function (openSSLStr) {
  7618  	            // Parse base64
  7619  	            var ciphertext = Base64.parse(openSSLStr);
  7620  
  7621  	            // Shortcut
  7622  	            var ciphertextWords = ciphertext.words;
  7623  
  7624  	            // Test for salt
  7625  	            if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
  7626  	                // Extract salt
  7627  	                var salt = WordArray.create(ciphertextWords.slice(2, 4));
  7628  
  7629  	                // Remove salt from ciphertext
  7630  	                ciphertextWords.splice(0, 4);
  7631  	                ciphertext.sigBytes -= 16;
  7632  	            }
  7633  
  7634  	            return CipherParams.create({ ciphertext: ciphertext, salt: salt });
  7635  	        }
  7636  	    };
  7637  
  7638  	    /**
  7639  	     * A cipher wrapper that returns ciphertext as a serializable cipher params object.
  7640  	     */
  7641  	    var SerializableCipher = C_lib.SerializableCipher = Base.extend({
  7642  	        /**
  7643  	         * Configuration options.
  7644  	         *
  7645  	         * @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
  7646  	         */
  7647  	        cfg: Base.extend({
  7648  	            format: OpenSSLFormatter
  7649  	        }),
  7650  
  7651  	        /**
  7652  	         * Encrypts a message.
  7653  	         *
  7654  	         * @param {Cipher} cipher The cipher algorithm to use.
  7655  	         * @param {WordArray|string} message The message to encrypt.
  7656  	         * @param {WordArray} key The key.
  7657  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7658  	         *
  7659  	         * @return {CipherParams} A cipher params object.
  7660  	         *
  7661  	         * @static
  7662  	         *
  7663  	         * @example
  7664  	         *
  7665  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
  7666  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
  7667  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7668  	         */
  7669  	        encrypt: function (cipher, message, key, cfg) {
  7670  	            // Apply config defaults
  7671  	            cfg = this.cfg.extend(cfg);
  7672  
  7673  	            // Encrypt
  7674  	            var encryptor = cipher.createEncryptor(key, cfg);
  7675  	            var ciphertext = encryptor.finalize(message);
  7676  
  7677  	            // Shortcut
  7678  	            var cipherCfg = encryptor.cfg;
  7679  
  7680  	            // Create and return serializable cipher params
  7681  	            return CipherParams.create({
  7682  	                ciphertext: ciphertext,
  7683  	                key: key,
  7684  	                iv: cipherCfg.iv,
  7685  	                algorithm: cipher,
  7686  	                mode: cipherCfg.mode,
  7687  	                padding: cipherCfg.padding,
  7688  	                blockSize: cipher.blockSize,
  7689  	                formatter: cfg.format
  7690  	            });
  7691  	        },
  7692  
  7693  	        /**
  7694  	         * Decrypts serialized ciphertext.
  7695  	         *
  7696  	         * @param {Cipher} cipher The cipher algorithm to use.
  7697  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7698  	         * @param {WordArray} key The key.
  7699  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7700  	         *
  7701  	         * @return {WordArray} The plaintext.
  7702  	         *
  7703  	         * @static
  7704  	         *
  7705  	         * @example
  7706  	         *
  7707  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7708  	         *     var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
  7709  	         */
  7710  	        decrypt: function (cipher, ciphertext, key, cfg) {
  7711  	            // Apply config defaults
  7712  	            cfg = this.cfg.extend(cfg);
  7713  
  7714  	            // Convert string to CipherParams
  7715  	            ciphertext = this._parse(ciphertext, cfg.format);
  7716  
  7717  	            // Decrypt
  7718  	            var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
  7719  
  7720  	            return plaintext;
  7721  	        },
  7722  
  7723  	        /**
  7724  	         * Converts serialized ciphertext to CipherParams,
  7725  	         * else assumed CipherParams already and returns ciphertext unchanged.
  7726  	         *
  7727  	         * @param {CipherParams|string} ciphertext The ciphertext.
  7728  	         * @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
  7729  	         *
  7730  	         * @return {CipherParams} The unserialized ciphertext.
  7731  	         *
  7732  	         * @static
  7733  	         *
  7734  	         * @example
  7735  	         *
  7736  	         *     var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
  7737  	         */
  7738  	        _parse: function (ciphertext, format) {
  7739  	            if (typeof ciphertext == 'string') {
  7740  	                return format.parse(ciphertext, this);
  7741  	            } else {
  7742  	                return ciphertext;
  7743  	            }
  7744  	        }
  7745  	    });
  7746  
  7747  	    /**
  7748  	     * Key derivation function namespace.
  7749  	     */
  7750  	    var C_kdf = C.kdf = {};
  7751  
  7752  	    /**
  7753  	     * OpenSSL key derivation function.
  7754  	     */
  7755  	    var OpenSSLKdf = C_kdf.OpenSSL = {
  7756  	        /**
  7757  	         * Derives a key and IV from a password.
  7758  	         *
  7759  	         * @param {string} password The password to derive from.
  7760  	         * @param {number} keySize The size in words of the key to generate.
  7761  	         * @param {number} ivSize The size in words of the IV to generate.
  7762  	         * @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
  7763  	         *
  7764  	         * @return {CipherParams} A cipher params object with the key, IV, and salt.
  7765  	         *
  7766  	         * @static
  7767  	         *
  7768  	         * @example
  7769  	         *
  7770  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
  7771  	         *     var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
  7772  	         */
  7773  	        execute: function (password, keySize, ivSize, salt) {
  7774  	            // Generate random salt
  7775  	            if (!salt) {
  7776  	                salt = WordArray.random(64/8);
  7777  	            }
  7778  
  7779  	            // Derive key and IV
  7780  	            var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
  7781  
  7782  	            // Separate key and IV
  7783  	            var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
  7784  	            key.sigBytes = keySize * 4;
  7785  
  7786  	            // Return params
  7787  	            return CipherParams.create({ key: key, iv: iv, salt: salt });
  7788  	        }
  7789  	    };
  7790  
  7791  	    /**
  7792  	     * A serializable cipher wrapper that derives the key from a password,
  7793  	     * and returns ciphertext as a serializable cipher params object.
  7794  	     */
  7795  	    var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
  7796  	        /**
  7797  	         * Configuration options.
  7798  	         *
  7799  	         * @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
  7800  	         */
  7801  	        cfg: SerializableCipher.cfg.extend({
  7802  	            kdf: OpenSSLKdf
  7803  	        }),
  7804  
  7805  	        /**
  7806  	         * Encrypts a message using a password.
  7807  	         *
  7808  	         * @param {Cipher} cipher The cipher algorithm to use.
  7809  	         * @param {WordArray|string} message The message to encrypt.
  7810  	         * @param {string} password The password.
  7811  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7812  	         *
  7813  	         * @return {CipherParams} A cipher params object.
  7814  	         *
  7815  	         * @static
  7816  	         *
  7817  	         * @example
  7818  	         *
  7819  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
  7820  	         *     var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
  7821  	         */
  7822  	        encrypt: function (cipher, message, password, cfg) {
  7823  	            // Apply config defaults
  7824  	            cfg = this.cfg.extend(cfg);
  7825  
  7826  	            // Derive key and other params
  7827  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
  7828  
  7829  	            // Add IV to config
  7830  	            cfg.iv = derivedParams.iv;
  7831  
  7832  	            // Encrypt
  7833  	            var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
  7834  
  7835  	            // Mix in derived params
  7836  	            ciphertext.mixIn(derivedParams);
  7837  
  7838  	            return ciphertext;
  7839  	        },
  7840  
  7841  	        /**
  7842  	         * Decrypts serialized ciphertext using a password.
  7843  	         *
  7844  	         * @param {Cipher} cipher The cipher algorithm to use.
  7845  	         * @param {CipherParams|string} ciphertext The ciphertext to decrypt.
  7846  	         * @param {string} password The password.
  7847  	         * @param {Object} cfg (Optional) The configuration options to use for this operation.
  7848  	         *
  7849  	         * @return {WordArray} The plaintext.
  7850  	         *
  7851  	         * @static
  7852  	         *
  7853  	         * @example
  7854  	         *
  7855  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
  7856  	         *     var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
  7857  	         */
  7858  	        decrypt: function (cipher, ciphertext, password, cfg) {
  7859  	            // Apply config defaults
  7860  	            cfg = this.cfg.extend(cfg);
  7861  
  7862  	            // Convert string to CipherParams
  7863  	            ciphertext = this._parse(ciphertext, cfg.format);
  7864  
  7865  	            // Derive key and other params
  7866  	            var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
  7867  
  7868  	            // Add IV to config
  7869  	            cfg.iv = derivedParams.iv;
  7870  
  7871  	            // Decrypt
  7872  	            var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
  7873  
  7874  	            return plaintext;
  7875  	        }
  7876  	    });
  7877  	}());
  7878  
  7879  
  7880  }));
  7881  },{"./core":53}],53:[function(require,module,exports){
  7882  ;(function (root, factory) {
  7883  	if (typeof exports === "object") {
  7884  		// CommonJS
  7885  		module.exports = exports = factory();
  7886  	}
  7887  	else if (typeof define === "function" && define.amd) {
  7888  		// AMD
  7889  		define([], factory);
  7890  	}
  7891  	else {
  7892  		// Global (browser)
  7893  		root.CryptoJS = factory();
  7894  	}
  7895  }(this, function () {
  7896  
  7897  	/**
  7898  	 * CryptoJS core components.
  7899  	 */
  7900  	var CryptoJS = CryptoJS || (function (Math, undefined) {
  7901  	    /*
  7902  	     * Local polyfil of Object.create
  7903  	     */
  7904  	    var create = Object.create || (function () {
  7905  	        function F() {};
  7906  
  7907  	        return function (obj) {
  7908  	            var subtype;
  7909  
  7910  	            F.prototype = obj;
  7911  
  7912  	            subtype = new F();
  7913  
  7914  	            F.prototype = null;
  7915  
  7916  	            return subtype;
  7917  	        };
  7918  	    }())
  7919  
  7920  	    /**
  7921  	     * CryptoJS namespace.
  7922  	     */
  7923  	    var C = {};
  7924  
  7925  	    /**
  7926  	     * Library namespace.
  7927  	     */
  7928  	    var C_lib = C.lib = {};
  7929  
  7930  	    /**
  7931  	     * Base object for prototypal inheritance.
  7932  	     */
  7933  	    var Base = C_lib.Base = (function () {
  7934  
  7935  
  7936  	        return {
  7937  	            /**
  7938  	             * Creates a new object that inherits from this object.
  7939  	             *
  7940  	             * @param {Object} overrides Properties to copy into the new object.
  7941  	             *
  7942  	             * @return {Object} The new object.
  7943  	             *
  7944  	             * @static
  7945  	             *
  7946  	             * @example
  7947  	             *
  7948  	             *     var MyType = CryptoJS.lib.Base.extend({
  7949  	             *         field: 'value',
  7950  	             *
  7951  	             *         method: function () {
  7952  	             *         }
  7953  	             *     });
  7954  	             */
  7955  	            extend: function (overrides) {
  7956  	                // Spawn
  7957  	                var subtype = create(this);
  7958  
  7959  	                // Augment
  7960  	                if (overrides) {
  7961  	                    subtype.mixIn(overrides);
  7962  	                }
  7963  
  7964  	                // Create default initializer
  7965  	                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
  7966  	                    subtype.init = function () {
  7967  	                        subtype.$super.init.apply(this, arguments);
  7968  	                    };
  7969  	                }
  7970  
  7971  	                // Initializer's prototype is the subtype object
  7972  	                subtype.init.prototype = subtype;
  7973  
  7974  	                // Reference supertype
  7975  	                subtype.$super = this;
  7976  
  7977  	                return subtype;
  7978  	            },
  7979  
  7980  	            /**
  7981  	             * Extends this object and runs the init method.
  7982  	             * Arguments to create() will be passed to init().
  7983  	             *
  7984  	             * @return {Object} The new object.
  7985  	             *
  7986  	             * @static
  7987  	             *
  7988  	             * @example
  7989  	             *
  7990  	             *     var instance = MyType.create();
  7991  	             */
  7992  	            create: function () {
  7993  	                var instance = this.extend();
  7994  	                instance.init.apply(instance, arguments);
  7995  
  7996  	                return instance;
  7997  	            },
  7998  
  7999  	            /**
  8000  	             * Initializes a newly created object.
  8001  	             * Override this method to add some logic when your objects are created.
  8002  	             *
  8003  	             * @example
  8004  	             *
  8005  	             *     var MyType = CryptoJS.lib.Base.extend({
  8006  	             *         init: function () {
  8007  	             *             // ...
  8008  	             *         }
  8009  	             *     });
  8010  	             */
  8011  	            init: function () {
  8012  	            },
  8013  
  8014  	            /**
  8015  	             * Copies properties into this object.
  8016  	             *
  8017  	             * @param {Object} properties The properties to mix in.
  8018  	             *
  8019  	             * @example
  8020  	             *
  8021  	             *     MyType.mixIn({
  8022  	             *         field: 'value'
  8023  	             *     });
  8024  	             */
  8025  	            mixIn: function (properties) {
  8026  	                for (var propertyName in properties) {
  8027  	                    if (properties.hasOwnProperty(propertyName)) {
  8028  	                        this[propertyName] = properties[propertyName];
  8029  	                    }
  8030  	                }
  8031  
  8032  	                // IE won't copy toString using the loop above
  8033  	                if (properties.hasOwnProperty('toString')) {
  8034  	                    this.toString = properties.toString;
  8035  	                }
  8036  	            },
  8037  
  8038  	            /**
  8039  	             * Creates a copy of this object.
  8040  	             *
  8041  	             * @return {Object} The clone.
  8042  	             *
  8043  	             * @example
  8044  	             *
  8045  	             *     var clone = instance.clone();
  8046  	             */
  8047  	            clone: function () {
  8048  	                return this.init.prototype.extend(this);
  8049  	            }
  8050  	        };
  8051  	    }());
  8052  
  8053  	    /**
  8054  	     * An array of 32-bit words.
  8055  	     *
  8056  	     * @property {Array} words The array of 32-bit words.
  8057  	     * @property {number} sigBytes The number of significant bytes in this word array.
  8058  	     */
  8059  	    var WordArray = C_lib.WordArray = Base.extend({
  8060  	        /**
  8061  	         * Initializes a newly created word array.
  8062  	         *
  8063  	         * @param {Array} words (Optional) An array of 32-bit words.
  8064  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
  8065  	         *
  8066  	         * @example
  8067  	         *
  8068  	         *     var wordArray = CryptoJS.lib.WordArray.create();
  8069  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
  8070  	         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
  8071  	         */
  8072  	        init: function (words, sigBytes) {
  8073  	            words = this.words = words || [];
  8074  
  8075  	            if (sigBytes != undefined) {
  8076  	                this.sigBytes = sigBytes;
  8077  	            } else {
  8078  	                this.sigBytes = words.length * 4;
  8079  	            }
  8080  	        },
  8081  
  8082  	        /**
  8083  	         * Converts this word array to a string.
  8084  	         *
  8085  	         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
  8086  	         *
  8087  	         * @return {string} The stringified word array.
  8088  	         *
  8089  	         * @example
  8090  	         *
  8091  	         *     var string = wordArray + '';
  8092  	         *     var string = wordArray.toString();
  8093  	         *     var string = wordArray.toString(CryptoJS.enc.Utf8);
  8094  	         */
  8095  	        toString: function (encoder) {
  8096  	            return (encoder || Hex).stringify(this);
  8097  	        },
  8098  
  8099  	        /**
  8100  	         * Concatenates a word array to this word array.
  8101  	         *
  8102  	         * @param {WordArray} wordArray The word array to append.
  8103  	         *
  8104  	         * @return {WordArray} This word array.
  8105  	         *
  8106  	         * @example
  8107  	         *
  8108  	         *     wordArray1.concat(wordArray2);
  8109  	         */
  8110  	        concat: function (wordArray) {
  8111  	            // Shortcuts
  8112  	            var thisWords = this.words;
  8113  	            var thatWords = wordArray.words;
  8114  	            var thisSigBytes = this.sigBytes;
  8115  	            var thatSigBytes = wordArray.sigBytes;
  8116  
  8117  	            // Clamp excess bits
  8118  	            this.clamp();
  8119  
  8120  	            // Concat
  8121  	            if (thisSigBytes % 4) {
  8122  	                // Copy one byte at a time
  8123  	                for (var i = 0; i < thatSigBytes; i++) {
  8124  	                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8125  	                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
  8126  	                }
  8127  	            } else {
  8128  	                // Copy one word at a time
  8129  	                for (var i = 0; i < thatSigBytes; i += 4) {
  8130  	                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
  8131  	                }
  8132  	            }
  8133  	            this.sigBytes += thatSigBytes;
  8134  
  8135  	            // Chainable
  8136  	            return this;
  8137  	        },
  8138  
  8139  	        /**
  8140  	         * Removes insignificant bits.
  8141  	         *
  8142  	         * @example
  8143  	         *
  8144  	         *     wordArray.clamp();
  8145  	         */
  8146  	        clamp: function () {
  8147  	            // Shortcuts
  8148  	            var words = this.words;
  8149  	            var sigBytes = this.sigBytes;
  8150  
  8151  	            // Clamp
  8152  	            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
  8153  	            words.length = Math.ceil(sigBytes / 4);
  8154  	        },
  8155  
  8156  	        /**
  8157  	         * Creates a copy of this word array.
  8158  	         *
  8159  	         * @return {WordArray} The clone.
  8160  	         *
  8161  	         * @example
  8162  	         *
  8163  	         *     var clone = wordArray.clone();
  8164  	         */
  8165  	        clone: function () {
  8166  	            var clone = Base.clone.call(this);
  8167  	            clone.words = this.words.slice(0);
  8168  
  8169  	            return clone;
  8170  	        },
  8171  
  8172  	        /**
  8173  	         * Creates a word array filled with random bytes.
  8174  	         *
  8175  	         * @param {number} nBytes The number of random bytes to generate.
  8176  	         *
  8177  	         * @return {WordArray} The random word array.
  8178  	         *
  8179  	         * @static
  8180  	         *
  8181  	         * @example
  8182  	         *
  8183  	         *     var wordArray = CryptoJS.lib.WordArray.random(16);
  8184  	         */
  8185  	        random: function (nBytes) {
  8186  	            var words = [];
  8187  
  8188  	            var r = (function (m_w) {
  8189  	                var m_w = m_w;
  8190  	                var m_z = 0x3ade68b1;
  8191  	                var mask = 0xffffffff;
  8192  
  8193  	                return function () {
  8194  	                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
  8195  	                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
  8196  	                    var result = ((m_z << 0x10) + m_w) & mask;
  8197  	                    result /= 0x100000000;
  8198  	                    result += 0.5;
  8199  	                    return result * (Math.random() > .5 ? 1 : -1);
  8200  	                }
  8201  	            });
  8202  
  8203  	            for (var i = 0, rcache; i < nBytes; i += 4) {
  8204  	                var _r = r((rcache || Math.random()) * 0x100000000);
  8205  
  8206  	                rcache = _r() * 0x3ade67b7;
  8207  	                words.push((_r() * 0x100000000) | 0);
  8208  	            }
  8209  
  8210  	            return new WordArray.init(words, nBytes);
  8211  	        }
  8212  	    });
  8213  
  8214  	    /**
  8215  	     * Encoder namespace.
  8216  	     */
  8217  	    var C_enc = C.enc = {};
  8218  
  8219  	    /**
  8220  	     * Hex encoding strategy.
  8221  	     */
  8222  	    var Hex = C_enc.Hex = {
  8223  	        /**
  8224  	         * Converts a word array to a hex string.
  8225  	         *
  8226  	         * @param {WordArray} wordArray The word array.
  8227  	         *
  8228  	         * @return {string} The hex string.
  8229  	         *
  8230  	         * @static
  8231  	         *
  8232  	         * @example
  8233  	         *
  8234  	         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);
  8235  	         */
  8236  	        stringify: function (wordArray) {
  8237  	            // Shortcuts
  8238  	            var words = wordArray.words;
  8239  	            var sigBytes = wordArray.sigBytes;
  8240  
  8241  	            // Convert
  8242  	            var hexChars = [];
  8243  	            for (var i = 0; i < sigBytes; i++) {
  8244  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8245  	                hexChars.push((bite >>> 4).toString(16));
  8246  	                hexChars.push((bite & 0x0f).toString(16));
  8247  	            }
  8248  
  8249  	            return hexChars.join('');
  8250  	        },
  8251  
  8252  	        /**
  8253  	         * Converts a hex string to a word array.
  8254  	         *
  8255  	         * @param {string} hexStr The hex string.
  8256  	         *
  8257  	         * @return {WordArray} The word array.
  8258  	         *
  8259  	         * @static
  8260  	         *
  8261  	         * @example
  8262  	         *
  8263  	         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);
  8264  	         */
  8265  	        parse: function (hexStr) {
  8266  	            // Shortcut
  8267  	            var hexStrLength = hexStr.length;
  8268  
  8269  	            // Convert
  8270  	            var words = [];
  8271  	            for (var i = 0; i < hexStrLength; i += 2) {
  8272  	                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
  8273  	            }
  8274  
  8275  	            return new WordArray.init(words, hexStrLength / 2);
  8276  	        }
  8277  	    };
  8278  
  8279  	    /**
  8280  	     * Latin1 encoding strategy.
  8281  	     */
  8282  	    var Latin1 = C_enc.Latin1 = {
  8283  	        /**
  8284  	         * Converts a word array to a Latin1 string.
  8285  	         *
  8286  	         * @param {WordArray} wordArray The word array.
  8287  	         *
  8288  	         * @return {string} The Latin1 string.
  8289  	         *
  8290  	         * @static
  8291  	         *
  8292  	         * @example
  8293  	         *
  8294  	         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
  8295  	         */
  8296  	        stringify: function (wordArray) {
  8297  	            // Shortcuts
  8298  	            var words = wordArray.words;
  8299  	            var sigBytes = wordArray.sigBytes;
  8300  
  8301  	            // Convert
  8302  	            var latin1Chars = [];
  8303  	            for (var i = 0; i < sigBytes; i++) {
  8304  	                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
  8305  	                latin1Chars.push(String.fromCharCode(bite));
  8306  	            }
  8307  
  8308  	            return latin1Chars.join('');
  8309  	        },
  8310  
  8311  	        /**
  8312  	         * Converts a Latin1 string to a word array.
  8313  	         *
  8314  	         * @param {string} latin1Str The Latin1 string.
  8315  	         *
  8316  	         * @return {WordArray} The word array.
  8317  	         *
  8318  	         * @static
  8319  	         *
  8320  	         * @example
  8321  	         *
  8322  	         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
  8323  	         */
  8324  	        parse: function (latin1Str) {
  8325  	            // Shortcut
  8326  	            var latin1StrLength = latin1Str.length;
  8327  
  8328  	            // Convert
  8329  	            var words = [];
  8330  	            for (var i = 0; i < latin1StrLength; i++) {
  8331  	                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
  8332  	            }
  8333  
  8334  	            return new WordArray.init(words, latin1StrLength);
  8335  	        }
  8336  	    };
  8337  
  8338  	    /**
  8339  	     * UTF-8 encoding strategy.
  8340  	     */
  8341  	    var Utf8 = C_enc.Utf8 = {
  8342  	        /**
  8343  	         * Converts a word array to a UTF-8 string.
  8344  	         *
  8345  	         * @param {WordArray} wordArray The word array.
  8346  	         *
  8347  	         * @return {string} The UTF-8 string.
  8348  	         *
  8349  	         * @static
  8350  	         *
  8351  	         * @example
  8352  	         *
  8353  	         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
  8354  	         */
  8355  	        stringify: function (wordArray) {
  8356  	            try {
  8357  	                return decodeURIComponent(escape(Latin1.stringify(wordArray)));
  8358  	            } catch (e) {
  8359  	                throw new Error('Malformed UTF-8 data');
  8360  	            }
  8361  	        },
  8362  
  8363  	        /**
  8364  	         * Converts a UTF-8 string to a word array.
  8365  	         *
  8366  	         * @param {string} utf8Str The UTF-8 string.
  8367  	         *
  8368  	         * @return {WordArray} The word array.
  8369  	         *
  8370  	         * @static
  8371  	         *
  8372  	         * @example
  8373  	         *
  8374  	         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
  8375  	         */
  8376  	        parse: function (utf8Str) {
  8377  	            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
  8378  	        }
  8379  	    };
  8380  
  8381  	    /**
  8382  	     * Abstract buffered block algorithm template.
  8383  	     *
  8384  	     * The property blockSize must be implemented in a concrete subtype.
  8385  	     *
  8386  	     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
  8387  	     */
  8388  	    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
  8389  	        /**
  8390  	         * Resets this block algorithm's data buffer to its initial state.
  8391  	         *
  8392  	         * @example
  8393  	         *
  8394  	         *     bufferedBlockAlgorithm.reset();
  8395  	         */
  8396  	        reset: function () {
  8397  	            // Initial values
  8398  	            this._data = new WordArray.init();
  8399  	            this._nDataBytes = 0;
  8400  	        },
  8401  
  8402  	        /**
  8403  	         * Adds new data to this block algorithm's buffer.
  8404  	         *
  8405  	         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
  8406  	         *
  8407  	         * @example
  8408  	         *
  8409  	         *     bufferedBlockAlgorithm._append('data');
  8410  	         *     bufferedBlockAlgorithm._append(wordArray);
  8411  	         */
  8412  	        _append: function (data) {
  8413  	            // Convert string to WordArray, else assume WordArray already
  8414  	            if (typeof data == 'string') {
  8415  	                data = Utf8.parse(data);
  8416  	            }
  8417  
  8418  	            // Append
  8419  	            this._data.concat(data);
  8420  	            this._nDataBytes += data.sigBytes;
  8421  	        },
  8422  
  8423  	        /**
  8424  	         * Processes available data blocks.
  8425  	         *
  8426  	         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
  8427  	         *
  8428  	         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
  8429  	         *
  8430  	         * @return {WordArray} The processed data.
  8431  	         *
  8432  	         * @example
  8433  	         *
  8434  	         *     var processedData = bufferedBlockAlgorithm._process();
  8435  	         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');
  8436  	         */
  8437  	        _process: function (doFlush) {
  8438  	            // Shortcuts
  8439  	            var data = this._data;
  8440  	            var dataWords = data.words;
  8441  	            var dataSigBytes = data.sigBytes;
  8442  	            var blockSize = this.blockSize;
  8443  	            var blockSizeBytes = blockSize * 4;
  8444  
  8445  	            // Count blocks ready
  8446  	            var nBlocksReady = dataSigBytes / blockSizeBytes;
  8447  	            if (doFlush) {
  8448  	                // Round up to include partial blocks
  8449  	                nBlocksReady = Math.ceil(nBlocksReady);
  8450  	            } else {
  8451  	                // Round down to include only full blocks,
  8452  	                // less the number of blocks that must remain in the buffer
  8453  	                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
  8454  	            }
  8455  
  8456  	            // Count words ready
  8457  	            var nWordsReady = nBlocksReady * blockSize;
  8458  
  8459  	            // Count bytes ready
  8460  	            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
  8461  
  8462  	            // Process blocks
  8463  	            if (nWordsReady) {
  8464  	                for (var offset = 0; offset < nWordsReady; offset += blockSize) {
  8465  	                    // Perform concrete-algorithm logic
  8466  	                    this._doProcessBlock(dataWords, offset);
  8467  	                }
  8468  
  8469  	                // Remove processed words
  8470  	                var processedWords = dataWords.splice(0, nWordsReady);
  8471  	                data.sigBytes -= nBytesReady;
  8472  	            }
  8473  
  8474  	            // Return processed words
  8475  	            return new WordArray.init(processedWords, nBytesReady);
  8476  	        },
  8477  
  8478  	        /**
  8479  	         * Creates a copy of this object.
  8480  	         *
  8481  	         * @return {Object} The clone.
  8482  	         *
  8483  	         * @example
  8484  	         *
  8485  	         *     var clone = bufferedBlockAlgorithm.clone();
  8486  	         */
  8487  	        clone: function () {
  8488  	            var clone = Base.clone.call(this);
  8489  	            clone._data = this._data.clone();
  8490  
  8491  	            return clone;
  8492  	        },
  8493  
  8494  	        _minBufferSize: 0
  8495  	    });
  8496  
  8497  	    /**
  8498  	     * Abstract hasher template.
  8499  	     *
  8500  	     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
  8501  	     */
  8502  	    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
  8503  	        /**
  8504  	         * Configuration options.
  8505  	         */
  8506  	        cfg: Base.extend(),
  8507  
  8508  	        /**
  8509  	         * Initializes a newly created hasher.
  8510  	         *
  8511  	         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.
  8512  	         *
  8513  	         * @example
  8514  	         *
  8515  	         *     var hasher = CryptoJS.algo.SHA256.create();
  8516  	         */
  8517  	        init: function (cfg) {
  8518  	            // Apply config defaults
  8519  	            this.cfg = this.cfg.extend(cfg);
  8520  
  8521  	            // Set initial values
  8522  	            this.reset();
  8523  	        },
  8524  
  8525  	        /**
  8526  	         * Resets this hasher to its initial state.
  8527  	         *
  8528  	         * @example
  8529  	         *
  8530  	         *     hasher.reset();
  8531  	         */
  8532  	        reset: function () {
  8533  	            // Reset data buffer
  8534  	            BufferedBlockAlgorithm.reset.call(this);
  8535  
  8536  	            // Perform concrete-hasher logic
  8537  	            this._doReset();
  8538  	        },
  8539  
  8540  	        /**
  8541  	         * Updates this hasher with a message.
  8542  	         *
  8543  	         * @param {WordArray|string} messageUpdate The message to append.
  8544  	         *
  8545  	         * @return {Hasher} This hasher.
  8546  	         *
  8547  	         * @example
  8548  	         *
  8549  	         *     hasher.update('message');
  8550  	         *     hasher.update(wordArray);
  8551  	         */
  8552  	        update: function (messageUpdate) {
  8553  	            // Append
  8554  	            this._append(messageUpdate);
  8555  
  8556  	            // Update the hash
  8557  	            this._process();
  8558  
  8559  	            // Chainable
  8560  	            return this;
  8561  	        },
  8562  
  8563  	        /**
  8564  	         * Finalizes the hash computation.
  8565  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  8566  	         *
  8567  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  8568  	         *
  8569  	         * @return {WordArray} The hash.
  8570  	         *
  8571  	         * @example
  8572  	         *
  8573  	         *     var hash = hasher.finalize();
  8574  	         *     var hash = hasher.finalize('message');
  8575  	         *     var hash = hasher.finalize(wordArray);
  8576  	         */
  8577  	        finalize: function (messageUpdate) {
  8578  	            // Final message update
  8579  	            if (messageUpdate) {
  8580  	                this._append(messageUpdate);
  8581  	            }
  8582  
  8583  	            // Perform concrete-hasher logic
  8584  	            var hash = this._doFinalize();
  8585  
  8586  	            return hash;
  8587  	        },
  8588  
  8589  	        blockSize: 512/32,
  8590  
  8591  	        /**
  8592  	         * Creates a shortcut function to a hasher's object interface.
  8593  	         *
  8594  	         * @param {Hasher} hasher The hasher to create a helper for.
  8595  	         *
  8596  	         * @return {Function} The shortcut function.
  8597  	         *
  8598  	         * @static
  8599  	         *
  8600  	         * @example
  8601  	         *
  8602  	         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
  8603  	         */
  8604  	        _createHelper: function (hasher) {
  8605  	            return function (message, cfg) {
  8606  	                return new hasher.init(cfg).finalize(message);
  8607  	            };
  8608  	        },
  8609  
  8610  	        /**
  8611  	         * Creates a shortcut function to the HMAC's object interface.
  8612  	         *
  8613  	         * @param {Hasher} hasher The hasher to use in this HMAC helper.
  8614  	         *
  8615  	         * @return {Function} The shortcut function.
  8616  	         *
  8617  	         * @static
  8618  	         *
  8619  	         * @example
  8620  	         *
  8621  	         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
  8622  	         */
  8623  	        _createHmacHelper: function (hasher) {
  8624  	            return function (message, key) {
  8625  	                return new C_algo.HMAC.init(hasher, key).finalize(message);
  8626  	            };
  8627  	        }
  8628  	    });
  8629  
  8630  	    /**
  8631  	     * Algorithm namespace.
  8632  	     */
  8633  	    var C_algo = C.algo = {};
  8634  
  8635  	    return C;
  8636  	}(Math));
  8637  
  8638  
  8639  	return CryptoJS;
  8640  
  8641  }));
  8642  },{}],54:[function(require,module,exports){
  8643  ;(function (root, factory) {
  8644  	if (typeof exports === "object") {
  8645  		// CommonJS
  8646  		module.exports = exports = factory(require("./core"));
  8647  	}
  8648  	else if (typeof define === "function" && define.amd) {
  8649  		// AMD
  8650  		define(["./core"], factory);
  8651  	}
  8652  	else {
  8653  		// Global (browser)
  8654  		factory(root.CryptoJS);
  8655  	}
  8656  }(this, function (CryptoJS) {
  8657  
  8658  	(function () {
  8659  	    // Shortcuts
  8660  	    var C = CryptoJS;
  8661  	    var C_lib = C.lib;
  8662  	    var WordArray = C_lib.WordArray;
  8663  	    var C_enc = C.enc;
  8664  
  8665  	    /**
  8666  	     * Base64 encoding strategy.
  8667  	     */
  8668  	    var Base64 = C_enc.Base64 = {
  8669  	        /**
  8670  	         * Converts a word array to a Base64 string.
  8671  	         *
  8672  	         * @param {WordArray} wordArray The word array.
  8673  	         *
  8674  	         * @return {string} The Base64 string.
  8675  	         *
  8676  	         * @static
  8677  	         *
  8678  	         * @example
  8679  	         *
  8680  	         *     var base64String = CryptoJS.enc.Base64.stringify(wordArray);
  8681  	         */
  8682  	        stringify: function (wordArray) {
  8683  	            // Shortcuts
  8684  	            var words = wordArray.words;
  8685  	            var sigBytes = wordArray.sigBytes;
  8686  	            var map = this._map;
  8687  
  8688  	            // Clamp excess bits
  8689  	            wordArray.clamp();
  8690  
  8691  	            // Convert
  8692  	            var base64Chars = [];
  8693  	            for (var i = 0; i < sigBytes; i += 3) {
  8694  	                var byte1 = (words[i >>> 2]       >>> (24 - (i % 4) * 8))       & 0xff;
  8695  	                var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
  8696  	                var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
  8697  
  8698  	                var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
  8699  
  8700  	                for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
  8701  	                    base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
  8702  	                }
  8703  	            }
  8704  
  8705  	            // Add padding
  8706  	            var paddingChar = map.charAt(64);
  8707  	            if (paddingChar) {
  8708  	                while (base64Chars.length % 4) {
  8709  	                    base64Chars.push(paddingChar);
  8710  	                }
  8711  	            }
  8712  
  8713  	            return base64Chars.join('');
  8714  	        },
  8715  
  8716  	        /**
  8717  	         * Converts a Base64 string to a word array.
  8718  	         *
  8719  	         * @param {string} base64Str The Base64 string.
  8720  	         *
  8721  	         * @return {WordArray} The word array.
  8722  	         *
  8723  	         * @static
  8724  	         *
  8725  	         * @example
  8726  	         *
  8727  	         *     var wordArray = CryptoJS.enc.Base64.parse(base64String);
  8728  	         */
  8729  	        parse: function (base64Str) {
  8730  	            // Shortcuts
  8731  	            var base64StrLength = base64Str.length;
  8732  	            var map = this._map;
  8733  	            var reverseMap = this._reverseMap;
  8734  
  8735  	            if (!reverseMap) {
  8736  	                    reverseMap = this._reverseMap = [];
  8737  	                    for (var j = 0; j < map.length; j++) {
  8738  	                        reverseMap[map.charCodeAt(j)] = j;
  8739  	                    }
  8740  	            }
  8741  
  8742  	            // Ignore padding
  8743  	            var paddingChar = map.charAt(64);
  8744  	            if (paddingChar) {
  8745  	                var paddingIndex = base64Str.indexOf(paddingChar);
  8746  	                if (paddingIndex !== -1) {
  8747  	                    base64StrLength = paddingIndex;
  8748  	                }
  8749  	            }
  8750  
  8751  	            // Convert
  8752  	            return parseLoop(base64Str, base64StrLength, reverseMap);
  8753  
  8754  	        },
  8755  
  8756  	        _map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
  8757  	    };
  8758  
  8759  	    function parseLoop(base64Str, base64StrLength, reverseMap) {
  8760  	      var words = [];
  8761  	      var nBytes = 0;
  8762  	      for (var i = 0; i < base64StrLength; i++) {
  8763  	          if (i % 4) {
  8764  	              var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
  8765  	              var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
  8766  	              words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
  8767  	              nBytes++;
  8768  	          }
  8769  	      }
  8770  	      return WordArray.create(words, nBytes);
  8771  	    }
  8772  	}());
  8773  
  8774  
  8775  	return CryptoJS.enc.Base64;
  8776  
  8777  }));
  8778  },{"./core":53}],55:[function(require,module,exports){
  8779  ;(function (root, factory) {
  8780  	if (typeof exports === "object") {
  8781  		// CommonJS
  8782  		module.exports = exports = factory(require("./core"));
  8783  	}
  8784  	else if (typeof define === "function" && define.amd) {
  8785  		// AMD
  8786  		define(["./core"], factory);
  8787  	}
  8788  	else {
  8789  		// Global (browser)
  8790  		factory(root.CryptoJS);
  8791  	}
  8792  }(this, function (CryptoJS) {
  8793  
  8794  	(function () {
  8795  	    // Shortcuts
  8796  	    var C = CryptoJS;
  8797  	    var C_lib = C.lib;
  8798  	    var WordArray = C_lib.WordArray;
  8799  	    var C_enc = C.enc;
  8800  
  8801  	    /**
  8802  	     * UTF-16 BE encoding strategy.
  8803  	     */
  8804  	    var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
  8805  	        /**
  8806  	         * Converts a word array to a UTF-16 BE string.
  8807  	         *
  8808  	         * @param {WordArray} wordArray The word array.
  8809  	         *
  8810  	         * @return {string} The UTF-16 BE string.
  8811  	         *
  8812  	         * @static
  8813  	         *
  8814  	         * @example
  8815  	         *
  8816  	         *     var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
  8817  	         */
  8818  	        stringify: function (wordArray) {
  8819  	            // Shortcuts
  8820  	            var words = wordArray.words;
  8821  	            var sigBytes = wordArray.sigBytes;
  8822  
  8823  	            // Convert
  8824  	            var utf16Chars = [];
  8825  	            for (var i = 0; i < sigBytes; i += 2) {
  8826  	                var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
  8827  	                utf16Chars.push(String.fromCharCode(codePoint));
  8828  	            }
  8829  
  8830  	            return utf16Chars.join('');
  8831  	        },
  8832  
  8833  	        /**
  8834  	         * Converts a UTF-16 BE string to a word array.
  8835  	         *
  8836  	         * @param {string} utf16Str The UTF-16 BE string.
  8837  	         *
  8838  	         * @return {WordArray} The word array.
  8839  	         *
  8840  	         * @static
  8841  	         *
  8842  	         * @example
  8843  	         *
  8844  	         *     var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
  8845  	         */
  8846  	        parse: function (utf16Str) {
  8847  	            // Shortcut
  8848  	            var utf16StrLength = utf16Str.length;
  8849  
  8850  	            // Convert
  8851  	            var words = [];
  8852  	            for (var i = 0; i < utf16StrLength; i++) {
  8853  	                words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
  8854  	            }
  8855  
  8856  	            return WordArray.create(words, utf16StrLength * 2);
  8857  	        }
  8858  	    };
  8859  
  8860  	    /**
  8861  	     * UTF-16 LE encoding strategy.
  8862  	     */
  8863  	    C_enc.Utf16LE = {
  8864  	        /**
  8865  	         * Converts a word array to a UTF-16 LE string.
  8866  	         *
  8867  	         * @param {WordArray} wordArray The word array.
  8868  	         *
  8869  	         * @return {string} The UTF-16 LE string.
  8870  	         *
  8871  	         * @static
  8872  	         *
  8873  	         * @example
  8874  	         *
  8875  	         *     var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
  8876  	         */
  8877  	        stringify: function (wordArray) {
  8878  	            // Shortcuts
  8879  	            var words = wordArray.words;
  8880  	            var sigBytes = wordArray.sigBytes;
  8881  
  8882  	            // Convert
  8883  	            var utf16Chars = [];
  8884  	            for (var i = 0; i < sigBytes; i += 2) {
  8885  	                var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
  8886  	                utf16Chars.push(String.fromCharCode(codePoint));
  8887  	            }
  8888  
  8889  	            return utf16Chars.join('');
  8890  	        },
  8891  
  8892  	        /**
  8893  	         * Converts a UTF-16 LE string to a word array.
  8894  	         *
  8895  	         * @param {string} utf16Str The UTF-16 LE string.
  8896  	         *
  8897  	         * @return {WordArray} The word array.
  8898  	         *
  8899  	         * @static
  8900  	         *
  8901  	         * @example
  8902  	         *
  8903  	         *     var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
  8904  	         */
  8905  	        parse: function (utf16Str) {
  8906  	            // Shortcut
  8907  	            var utf16StrLength = utf16Str.length;
  8908  
  8909  	            // Convert
  8910  	            var words = [];
  8911  	            for (var i = 0; i < utf16StrLength; i++) {
  8912  	                words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
  8913  	            }
  8914  
  8915  	            return WordArray.create(words, utf16StrLength * 2);
  8916  	        }
  8917  	    };
  8918  
  8919  	    function swapEndian(word) {
  8920  	        return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
  8921  	    }
  8922  	}());
  8923  
  8924  
  8925  	return CryptoJS.enc.Utf16;
  8926  
  8927  }));
  8928  },{"./core":53}],56:[function(require,module,exports){
  8929  ;(function (root, factory, undef) {
  8930  	if (typeof exports === "object") {
  8931  		// CommonJS
  8932  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
  8933  	}
  8934  	else if (typeof define === "function" && define.amd) {
  8935  		// AMD
  8936  		define(["./core", "./sha1", "./hmac"], factory);
  8937  	}
  8938  	else {
  8939  		// Global (browser)
  8940  		factory(root.CryptoJS);
  8941  	}
  8942  }(this, function (CryptoJS) {
  8943  
  8944  	(function () {
  8945  	    // Shortcuts
  8946  	    var C = CryptoJS;
  8947  	    var C_lib = C.lib;
  8948  	    var Base = C_lib.Base;
  8949  	    var WordArray = C_lib.WordArray;
  8950  	    var C_algo = C.algo;
  8951  	    var MD5 = C_algo.MD5;
  8952  
  8953  	    /**
  8954  	     * This key derivation function is meant to conform with EVP_BytesToKey.
  8955  	     * www.openssl.org/docs/crypto/EVP_BytesToKey.html
  8956  	     */
  8957  	    var EvpKDF = C_algo.EvpKDF = Base.extend({
  8958  	        /**
  8959  	         * Configuration options.
  8960  	         *
  8961  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
  8962  	         * @property {Hasher} hasher The hash algorithm to use. Default: MD5
  8963  	         * @property {number} iterations The number of iterations to perform. Default: 1
  8964  	         */
  8965  	        cfg: Base.extend({
  8966  	            keySize: 128/32,
  8967  	            hasher: MD5,
  8968  	            iterations: 1
  8969  	        }),
  8970  
  8971  	        /**
  8972  	         * Initializes a newly created key derivation function.
  8973  	         *
  8974  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
  8975  	         *
  8976  	         * @example
  8977  	         *
  8978  	         *     var kdf = CryptoJS.algo.EvpKDF.create();
  8979  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
  8980  	         *     var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
  8981  	         */
  8982  	        init: function (cfg) {
  8983  	            this.cfg = this.cfg.extend(cfg);
  8984  	        },
  8985  
  8986  	        /**
  8987  	         * Derives a key from a password.
  8988  	         *
  8989  	         * @param {WordArray|string} password The password.
  8990  	         * @param {WordArray|string} salt A salt.
  8991  	         *
  8992  	         * @return {WordArray} The derived key.
  8993  	         *
  8994  	         * @example
  8995  	         *
  8996  	         *     var key = kdf.compute(password, salt);
  8997  	         */
  8998  	        compute: function (password, salt) {
  8999  	            // Shortcut
  9000  	            var cfg = this.cfg;
  9001  
  9002  	            // Init hasher
  9003  	            var hasher = cfg.hasher.create();
  9004  
  9005  	            // Initial values
  9006  	            var derivedKey = WordArray.create();
  9007  
  9008  	            // Shortcuts
  9009  	            var derivedKeyWords = derivedKey.words;
  9010  	            var keySize = cfg.keySize;
  9011  	            var iterations = cfg.iterations;
  9012  
  9013  	            // Generate key
  9014  	            while (derivedKeyWords.length < keySize) {
  9015  	                if (block) {
  9016  	                    hasher.update(block);
  9017  	                }
  9018  	                var block = hasher.update(password).finalize(salt);
  9019  	                hasher.reset();
  9020  
  9021  	                // Iterations
  9022  	                for (var i = 1; i < iterations; i++) {
  9023  	                    block = hasher.finalize(block);
  9024  	                    hasher.reset();
  9025  	                }
  9026  
  9027  	                derivedKey.concat(block);
  9028  	            }
  9029  	            derivedKey.sigBytes = keySize * 4;
  9030  
  9031  	            return derivedKey;
  9032  	        }
  9033  	    });
  9034  
  9035  	    /**
  9036  	     * Derives a key from a password.
  9037  	     *
  9038  	     * @param {WordArray|string} password The password.
  9039  	     * @param {WordArray|string} salt A salt.
  9040  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
  9041  	     *
  9042  	     * @return {WordArray} The derived key.
  9043  	     *
  9044  	     * @static
  9045  	     *
  9046  	     * @example
  9047  	     *
  9048  	     *     var key = CryptoJS.EvpKDF(password, salt);
  9049  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
  9050  	     *     var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
  9051  	     */
  9052  	    C.EvpKDF = function (password, salt, cfg) {
  9053  	        return EvpKDF.create(cfg).compute(password, salt);
  9054  	    };
  9055  	}());
  9056  
  9057  
  9058  	return CryptoJS.EvpKDF;
  9059  
  9060  }));
  9061  },{"./core":53,"./hmac":58,"./sha1":77}],57:[function(require,module,exports){
  9062  ;(function (root, factory, undef) {
  9063  	if (typeof exports === "object") {
  9064  		// CommonJS
  9065  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9066  	}
  9067  	else if (typeof define === "function" && define.amd) {
  9068  		// AMD
  9069  		define(["./core", "./cipher-core"], factory);
  9070  	}
  9071  	else {
  9072  		// Global (browser)
  9073  		factory(root.CryptoJS);
  9074  	}
  9075  }(this, function (CryptoJS) {
  9076  
  9077  	(function (undefined) {
  9078  	    // Shortcuts
  9079  	    var C = CryptoJS;
  9080  	    var C_lib = C.lib;
  9081  	    var CipherParams = C_lib.CipherParams;
  9082  	    var C_enc = C.enc;
  9083  	    var Hex = C_enc.Hex;
  9084  	    var C_format = C.format;
  9085  
  9086  	    var HexFormatter = C_format.Hex = {
  9087  	        /**
  9088  	         * Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
  9089  	         *
  9090  	         * @param {CipherParams} cipherParams The cipher params object.
  9091  	         *
  9092  	         * @return {string} The hexadecimally encoded string.
  9093  	         *
  9094  	         * @static
  9095  	         *
  9096  	         * @example
  9097  	         *
  9098  	         *     var hexString = CryptoJS.format.Hex.stringify(cipherParams);
  9099  	         */
  9100  	        stringify: function (cipherParams) {
  9101  	            return cipherParams.ciphertext.toString(Hex);
  9102  	        },
  9103  
  9104  	        /**
  9105  	         * Converts a hexadecimally encoded ciphertext string to a cipher params object.
  9106  	         *
  9107  	         * @param {string} input The hexadecimally encoded string.
  9108  	         *
  9109  	         * @return {CipherParams} The cipher params object.
  9110  	         *
  9111  	         * @static
  9112  	         *
  9113  	         * @example
  9114  	         *
  9115  	         *     var cipherParams = CryptoJS.format.Hex.parse(hexString);
  9116  	         */
  9117  	        parse: function (input) {
  9118  	            var ciphertext = Hex.parse(input);
  9119  	            return CipherParams.create({ ciphertext: ciphertext });
  9120  	        }
  9121  	    };
  9122  	}());
  9123  
  9124  
  9125  	return CryptoJS.format.Hex;
  9126  
  9127  }));
  9128  },{"./cipher-core":52,"./core":53}],58:[function(require,module,exports){
  9129  ;(function (root, factory) {
  9130  	if (typeof exports === "object") {
  9131  		// CommonJS
  9132  		module.exports = exports = factory(require("./core"));
  9133  	}
  9134  	else if (typeof define === "function" && define.amd) {
  9135  		// AMD
  9136  		define(["./core"], factory);
  9137  	}
  9138  	else {
  9139  		// Global (browser)
  9140  		factory(root.CryptoJS);
  9141  	}
  9142  }(this, function (CryptoJS) {
  9143  
  9144  	(function () {
  9145  	    // Shortcuts
  9146  	    var C = CryptoJS;
  9147  	    var C_lib = C.lib;
  9148  	    var Base = C_lib.Base;
  9149  	    var C_enc = C.enc;
  9150  	    var Utf8 = C_enc.Utf8;
  9151  	    var C_algo = C.algo;
  9152  
  9153  	    /**
  9154  	     * HMAC algorithm.
  9155  	     */
  9156  	    var HMAC = C_algo.HMAC = Base.extend({
  9157  	        /**
  9158  	         * Initializes a newly created HMAC.
  9159  	         *
  9160  	         * @param {Hasher} hasher The hash algorithm to use.
  9161  	         * @param {WordArray|string} key The secret key.
  9162  	         *
  9163  	         * @example
  9164  	         *
  9165  	         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
  9166  	         */
  9167  	        init: function (hasher, key) {
  9168  	            // Init hasher
  9169  	            hasher = this._hasher = new hasher.init();
  9170  
  9171  	            // Convert string to WordArray, else assume WordArray already
  9172  	            if (typeof key == 'string') {
  9173  	                key = Utf8.parse(key);
  9174  	            }
  9175  
  9176  	            // Shortcuts
  9177  	            var hasherBlockSize = hasher.blockSize;
  9178  	            var hasherBlockSizeBytes = hasherBlockSize * 4;
  9179  
  9180  	            // Allow arbitrary length keys
  9181  	            if (key.sigBytes > hasherBlockSizeBytes) {
  9182  	                key = hasher.finalize(key);
  9183  	            }
  9184  
  9185  	            // Clamp excess bits
  9186  	            key.clamp();
  9187  
  9188  	            // Clone key for inner and outer pads
  9189  	            var oKey = this._oKey = key.clone();
  9190  	            var iKey = this._iKey = key.clone();
  9191  
  9192  	            // Shortcuts
  9193  	            var oKeyWords = oKey.words;
  9194  	            var iKeyWords = iKey.words;
  9195  
  9196  	            // XOR keys with pad constants
  9197  	            for (var i = 0; i < hasherBlockSize; i++) {
  9198  	                oKeyWords[i] ^= 0x5c5c5c5c;
  9199  	                iKeyWords[i] ^= 0x36363636;
  9200  	            }
  9201  	            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
  9202  
  9203  	            // Set initial values
  9204  	            this.reset();
  9205  	        },
  9206  
  9207  	        /**
  9208  	         * Resets this HMAC to its initial state.
  9209  	         *
  9210  	         * @example
  9211  	         *
  9212  	         *     hmacHasher.reset();
  9213  	         */
  9214  	        reset: function () {
  9215  	            // Shortcut
  9216  	            var hasher = this._hasher;
  9217  
  9218  	            // Reset
  9219  	            hasher.reset();
  9220  	            hasher.update(this._iKey);
  9221  	        },
  9222  
  9223  	        /**
  9224  	         * Updates this HMAC with a message.
  9225  	         *
  9226  	         * @param {WordArray|string} messageUpdate The message to append.
  9227  	         *
  9228  	         * @return {HMAC} This HMAC instance.
  9229  	         *
  9230  	         * @example
  9231  	         *
  9232  	         *     hmacHasher.update('message');
  9233  	         *     hmacHasher.update(wordArray);
  9234  	         */
  9235  	        update: function (messageUpdate) {
  9236  	            this._hasher.update(messageUpdate);
  9237  
  9238  	            // Chainable
  9239  	            return this;
  9240  	        },
  9241  
  9242  	        /**
  9243  	         * Finalizes the HMAC computation.
  9244  	         * Note that the finalize operation is effectively a destructive, read-once operation.
  9245  	         *
  9246  	         * @param {WordArray|string} messageUpdate (Optional) A final message update.
  9247  	         *
  9248  	         * @return {WordArray} The HMAC.
  9249  	         *
  9250  	         * @example
  9251  	         *
  9252  	         *     var hmac = hmacHasher.finalize();
  9253  	         *     var hmac = hmacHasher.finalize('message');
  9254  	         *     var hmac = hmacHasher.finalize(wordArray);
  9255  	         */
  9256  	        finalize: function (messageUpdate) {
  9257  	            // Shortcut
  9258  	            var hasher = this._hasher;
  9259  
  9260  	            // Compute HMAC
  9261  	            var innerHash = hasher.finalize(messageUpdate);
  9262  	            hasher.reset();
  9263  	            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
  9264  
  9265  	            return hmac;
  9266  	        }
  9267  	    });
  9268  	}());
  9269  
  9270  
  9271  }));
  9272  },{"./core":53}],59:[function(require,module,exports){
  9273  ;(function (root, factory, undef) {
  9274  	if (typeof exports === "object") {
  9275  		// CommonJS
  9276  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./lib-typedarrays"), require("./enc-utf16"), require("./enc-base64"), require("./md5"), require("./sha1"), require("./sha256"), require("./sha224"), require("./sha512"), require("./sha384"), require("./sha3"), require("./ripemd160"), require("./hmac"), require("./pbkdf2"), require("./evpkdf"), require("./cipher-core"), require("./mode-cfb"), require("./mode-ctr"), require("./mode-ctr-gladman"), require("./mode-ofb"), require("./mode-ecb"), require("./pad-ansix923"), require("./pad-iso10126"), require("./pad-iso97971"), require("./pad-zeropadding"), require("./pad-nopadding"), require("./format-hex"), require("./aes"), require("./tripledes"), require("./rc4"), require("./rabbit"), require("./rabbit-legacy"));
  9277  	}
  9278  	else if (typeof define === "function" && define.amd) {
  9279  		// AMD
  9280  		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);
  9281  	}
  9282  	else {
  9283  		// Global (browser)
  9284  		root.CryptoJS = factory(root.CryptoJS);
  9285  	}
  9286  }(this, function (CryptoJS) {
  9287  
  9288  	return CryptoJS;
  9289  
  9290  }));
  9291  },{"./aes":51,"./cipher-core":52,"./core":53,"./enc-base64":54,"./enc-utf16":55,"./evpkdf":56,"./format-hex":57,"./hmac":58,"./lib-typedarrays":60,"./md5":61,"./mode-cfb":62,"./mode-ctr":64,"./mode-ctr-gladman":63,"./mode-ecb":65,"./mode-ofb":66,"./pad-ansix923":67,"./pad-iso10126":68,"./pad-iso97971":69,"./pad-nopadding":70,"./pad-zeropadding":71,"./pbkdf2":72,"./rabbit":74,"./rabbit-legacy":73,"./rc4":75,"./ripemd160":76,"./sha1":77,"./sha224":78,"./sha256":79,"./sha3":80,"./sha384":81,"./sha512":82,"./tripledes":83,"./x64-core":84}],60:[function(require,module,exports){
  9292  ;(function (root, factory) {
  9293  	if (typeof exports === "object") {
  9294  		// CommonJS
  9295  		module.exports = exports = factory(require("./core"));
  9296  	}
  9297  	else if (typeof define === "function" && define.amd) {
  9298  		// AMD
  9299  		define(["./core"], factory);
  9300  	}
  9301  	else {
  9302  		// Global (browser)
  9303  		factory(root.CryptoJS);
  9304  	}
  9305  }(this, function (CryptoJS) {
  9306  
  9307  	(function () {
  9308  	    // Check if typed arrays are supported
  9309  	    if (typeof ArrayBuffer != 'function') {
  9310  	        return;
  9311  	    }
  9312  
  9313  	    // Shortcuts
  9314  	    var C = CryptoJS;
  9315  	    var C_lib = C.lib;
  9316  	    var WordArray = C_lib.WordArray;
  9317  
  9318  	    // Reference original init
  9319  	    var superInit = WordArray.init;
  9320  
  9321  	    // Augment WordArray.init to handle typed arrays
  9322  	    var subInit = WordArray.init = function (typedArray) {
  9323  	        // Convert buffers to uint8
  9324  	        if (typedArray instanceof ArrayBuffer) {
  9325  	            typedArray = new Uint8Array(typedArray);
  9326  	        }
  9327  
  9328  	        // Convert other array views to uint8
  9329  	        if (
  9330  	            typedArray instanceof Int8Array ||
  9331  	            (typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
  9332  	            typedArray instanceof Int16Array ||
  9333  	            typedArray instanceof Uint16Array ||
  9334  	            typedArray instanceof Int32Array ||
  9335  	            typedArray instanceof Uint32Array ||
  9336  	            typedArray instanceof Float32Array ||
  9337  	            typedArray instanceof Float64Array
  9338  	        ) {
  9339  	            typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
  9340  	        }
  9341  
  9342  	        // Handle Uint8Array
  9343  	        if (typedArray instanceof Uint8Array) {
  9344  	            // Shortcut
  9345  	            var typedArrayByteLength = typedArray.byteLength;
  9346  
  9347  	            // Extract bytes
  9348  	            var words = [];
  9349  	            for (var i = 0; i < typedArrayByteLength; i++) {
  9350  	                words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
  9351  	            }
  9352  
  9353  	            // Initialize this word array
  9354  	            superInit.call(this, words, typedArrayByteLength);
  9355  	        } else {
  9356  	            // Else call normal init
  9357  	            superInit.apply(this, arguments);
  9358  	        }
  9359  	    };
  9360  
  9361  	    subInit.prototype = WordArray;
  9362  	}());
  9363  
  9364  
  9365  	return CryptoJS.lib.WordArray;
  9366  
  9367  }));
  9368  },{"./core":53}],61:[function(require,module,exports){
  9369  ;(function (root, factory) {
  9370  	if (typeof exports === "object") {
  9371  		// CommonJS
  9372  		module.exports = exports = factory(require("./core"));
  9373  	}
  9374  	else if (typeof define === "function" && define.amd) {
  9375  		// AMD
  9376  		define(["./core"], factory);
  9377  	}
  9378  	else {
  9379  		// Global (browser)
  9380  		factory(root.CryptoJS);
  9381  	}
  9382  }(this, function (CryptoJS) {
  9383  
  9384  	(function (Math) {
  9385  	    // Shortcuts
  9386  	    var C = CryptoJS;
  9387  	    var C_lib = C.lib;
  9388  	    var WordArray = C_lib.WordArray;
  9389  	    var Hasher = C_lib.Hasher;
  9390  	    var C_algo = C.algo;
  9391  
  9392  	    // Constants table
  9393  	    var T = [];
  9394  
  9395  	    // Compute constants
  9396  	    (function () {
  9397  	        for (var i = 0; i < 64; i++) {
  9398  	            T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
  9399  	        }
  9400  	    }());
  9401  
  9402  	    /**
  9403  	     * MD5 hash algorithm.
  9404  	     */
  9405  	    var MD5 = C_algo.MD5 = Hasher.extend({
  9406  	        _doReset: function () {
  9407  	            this._hash = new WordArray.init([
  9408  	                0x67452301, 0xefcdab89,
  9409  	                0x98badcfe, 0x10325476
  9410  	            ]);
  9411  	        },
  9412  
  9413  	        _doProcessBlock: function (M, offset) {
  9414  	            // Swap endian
  9415  	            for (var i = 0; i < 16; i++) {
  9416  	                // Shortcuts
  9417  	                var offset_i = offset + i;
  9418  	                var M_offset_i = M[offset_i];
  9419  
  9420  	                M[offset_i] = (
  9421  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
  9422  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
  9423  	                );
  9424  	            }
  9425  
  9426  	            // Shortcuts
  9427  	            var H = this._hash.words;
  9428  
  9429  	            var M_offset_0  = M[offset + 0];
  9430  	            var M_offset_1  = M[offset + 1];
  9431  	            var M_offset_2  = M[offset + 2];
  9432  	            var M_offset_3  = M[offset + 3];
  9433  	            var M_offset_4  = M[offset + 4];
  9434  	            var M_offset_5  = M[offset + 5];
  9435  	            var M_offset_6  = M[offset + 6];
  9436  	            var M_offset_7  = M[offset + 7];
  9437  	            var M_offset_8  = M[offset + 8];
  9438  	            var M_offset_9  = M[offset + 9];
  9439  	            var M_offset_10 = M[offset + 10];
  9440  	            var M_offset_11 = M[offset + 11];
  9441  	            var M_offset_12 = M[offset + 12];
  9442  	            var M_offset_13 = M[offset + 13];
  9443  	            var M_offset_14 = M[offset + 14];
  9444  	            var M_offset_15 = M[offset + 15];
  9445  
  9446  	            // Working varialbes
  9447  	            var a = H[0];
  9448  	            var b = H[1];
  9449  	            var c = H[2];
  9450  	            var d = H[3];
  9451  
  9452  	            // Computation
  9453  	            a = FF(a, b, c, d, M_offset_0,  7,  T[0]);
  9454  	            d = FF(d, a, b, c, M_offset_1,  12, T[1]);
  9455  	            c = FF(c, d, a, b, M_offset_2,  17, T[2]);
  9456  	            b = FF(b, c, d, a, M_offset_3,  22, T[3]);
  9457  	            a = FF(a, b, c, d, M_offset_4,  7,  T[4]);
  9458  	            d = FF(d, a, b, c, M_offset_5,  12, T[5]);
  9459  	            c = FF(c, d, a, b, M_offset_6,  17, T[6]);
  9460  	            b = FF(b, c, d, a, M_offset_7,  22, T[7]);
  9461  	            a = FF(a, b, c, d, M_offset_8,  7,  T[8]);
  9462  	            d = FF(d, a, b, c, M_offset_9,  12, T[9]);
  9463  	            c = FF(c, d, a, b, M_offset_10, 17, T[10]);
  9464  	            b = FF(b, c, d, a, M_offset_11, 22, T[11]);
  9465  	            a = FF(a, b, c, d, M_offset_12, 7,  T[12]);
  9466  	            d = FF(d, a, b, c, M_offset_13, 12, T[13]);
  9467  	            c = FF(c, d, a, b, M_offset_14, 17, T[14]);
  9468  	            b = FF(b, c, d, a, M_offset_15, 22, T[15]);
  9469  
  9470  	            a = GG(a, b, c, d, M_offset_1,  5,  T[16]);
  9471  	            d = GG(d, a, b, c, M_offset_6,  9,  T[17]);
  9472  	            c = GG(c, d, a, b, M_offset_11, 14, T[18]);
  9473  	            b = GG(b, c, d, a, M_offset_0,  20, T[19]);
  9474  	            a = GG(a, b, c, d, M_offset_5,  5,  T[20]);
  9475  	            d = GG(d, a, b, c, M_offset_10, 9,  T[21]);
  9476  	            c = GG(c, d, a, b, M_offset_15, 14, T[22]);
  9477  	            b = GG(b, c, d, a, M_offset_4,  20, T[23]);
  9478  	            a = GG(a, b, c, d, M_offset_9,  5,  T[24]);
  9479  	            d = GG(d, a, b, c, M_offset_14, 9,  T[25]);
  9480  	            c = GG(c, d, a, b, M_offset_3,  14, T[26]);
  9481  	            b = GG(b, c, d, a, M_offset_8,  20, T[27]);
  9482  	            a = GG(a, b, c, d, M_offset_13, 5,  T[28]);
  9483  	            d = GG(d, a, b, c, M_offset_2,  9,  T[29]);
  9484  	            c = GG(c, d, a, b, M_offset_7,  14, T[30]);
  9485  	            b = GG(b, c, d, a, M_offset_12, 20, T[31]);
  9486  
  9487  	            a = HH(a, b, c, d, M_offset_5,  4,  T[32]);
  9488  	            d = HH(d, a, b, c, M_offset_8,  11, T[33]);
  9489  	            c = HH(c, d, a, b, M_offset_11, 16, T[34]);
  9490  	            b = HH(b, c, d, a, M_offset_14, 23, T[35]);
  9491  	            a = HH(a, b, c, d, M_offset_1,  4,  T[36]);
  9492  	            d = HH(d, a, b, c, M_offset_4,  11, T[37]);
  9493  	            c = HH(c, d, a, b, M_offset_7,  16, T[38]);
  9494  	            b = HH(b, c, d, a, M_offset_10, 23, T[39]);
  9495  	            a = HH(a, b, c, d, M_offset_13, 4,  T[40]);
  9496  	            d = HH(d, a, b, c, M_offset_0,  11, T[41]);
  9497  	            c = HH(c, d, a, b, M_offset_3,  16, T[42]);
  9498  	            b = HH(b, c, d, a, M_offset_6,  23, T[43]);
  9499  	            a = HH(a, b, c, d, M_offset_9,  4,  T[44]);
  9500  	            d = HH(d, a, b, c, M_offset_12, 11, T[45]);
  9501  	            c = HH(c, d, a, b, M_offset_15, 16, T[46]);
  9502  	            b = HH(b, c, d, a, M_offset_2,  23, T[47]);
  9503  
  9504  	            a = II(a, b, c, d, M_offset_0,  6,  T[48]);
  9505  	            d = II(d, a, b, c, M_offset_7,  10, T[49]);
  9506  	            c = II(c, d, a, b, M_offset_14, 15, T[50]);
  9507  	            b = II(b, c, d, a, M_offset_5,  21, T[51]);
  9508  	            a = II(a, b, c, d, M_offset_12, 6,  T[52]);
  9509  	            d = II(d, a, b, c, M_offset_3,  10, T[53]);
  9510  	            c = II(c, d, a, b, M_offset_10, 15, T[54]);
  9511  	            b = II(b, c, d, a, M_offset_1,  21, T[55]);
  9512  	            a = II(a, b, c, d, M_offset_8,  6,  T[56]);
  9513  	            d = II(d, a, b, c, M_offset_15, 10, T[57]);
  9514  	            c = II(c, d, a, b, M_offset_6,  15, T[58]);
  9515  	            b = II(b, c, d, a, M_offset_13, 21, T[59]);
  9516  	            a = II(a, b, c, d, M_offset_4,  6,  T[60]);
  9517  	            d = II(d, a, b, c, M_offset_11, 10, T[61]);
  9518  	            c = II(c, d, a, b, M_offset_2,  15, T[62]);
  9519  	            b = II(b, c, d, a, M_offset_9,  21, T[63]);
  9520  
  9521  	            // Intermediate hash value
  9522  	            H[0] = (H[0] + a) | 0;
  9523  	            H[1] = (H[1] + b) | 0;
  9524  	            H[2] = (H[2] + c) | 0;
  9525  	            H[3] = (H[3] + d) | 0;
  9526  	        },
  9527  
  9528  	        _doFinalize: function () {
  9529  	            // Shortcuts
  9530  	            var data = this._data;
  9531  	            var dataWords = data.words;
  9532  
  9533  	            var nBitsTotal = this._nDataBytes * 8;
  9534  	            var nBitsLeft = data.sigBytes * 8;
  9535  
  9536  	            // Add padding
  9537  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
  9538  
  9539  	            var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
  9540  	            var nBitsTotalL = nBitsTotal;
  9541  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
  9542  	                (((nBitsTotalH << 8)  | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
  9543  	                (((nBitsTotalH << 24) | (nBitsTotalH >>> 8))  & 0xff00ff00)
  9544  	            );
  9545  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
  9546  	                (((nBitsTotalL << 8)  | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
  9547  	                (((nBitsTotalL << 24) | (nBitsTotalL >>> 8))  & 0xff00ff00)
  9548  	            );
  9549  
  9550  	            data.sigBytes = (dataWords.length + 1) * 4;
  9551  
  9552  	            // Hash final blocks
  9553  	            this._process();
  9554  
  9555  	            // Shortcuts
  9556  	            var hash = this._hash;
  9557  	            var H = hash.words;
  9558  
  9559  	            // Swap endian
  9560  	            for (var i = 0; i < 4; i++) {
  9561  	                // Shortcut
  9562  	                var H_i = H[i];
  9563  
  9564  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
  9565  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
  9566  	            }
  9567  
  9568  	            // Return final computed hash
  9569  	            return hash;
  9570  	        },
  9571  
  9572  	        clone: function () {
  9573  	            var clone = Hasher.clone.call(this);
  9574  	            clone._hash = this._hash.clone();
  9575  
  9576  	            return clone;
  9577  	        }
  9578  	    });
  9579  
  9580  	    function FF(a, b, c, d, x, s, t) {
  9581  	        var n = a + ((b & c) | (~b & d)) + x + t;
  9582  	        return ((n << s) | (n >>> (32 - s))) + b;
  9583  	    }
  9584  
  9585  	    function GG(a, b, c, d, x, s, t) {
  9586  	        var n = a + ((b & d) | (c & ~d)) + x + t;
  9587  	        return ((n << s) | (n >>> (32 - s))) + b;
  9588  	    }
  9589  
  9590  	    function HH(a, b, c, d, x, s, t) {
  9591  	        var n = a + (b ^ c ^ d) + x + t;
  9592  	        return ((n << s) | (n >>> (32 - s))) + b;
  9593  	    }
  9594  
  9595  	    function II(a, b, c, d, x, s, t) {
  9596  	        var n = a + (c ^ (b | ~d)) + x + t;
  9597  	        return ((n << s) | (n >>> (32 - s))) + b;
  9598  	    }
  9599  
  9600  	    /**
  9601  	     * Shortcut function to the hasher's object interface.
  9602  	     *
  9603  	     * @param {WordArray|string} message The message to hash.
  9604  	     *
  9605  	     * @return {WordArray} The hash.
  9606  	     *
  9607  	     * @static
  9608  	     *
  9609  	     * @example
  9610  	     *
  9611  	     *     var hash = CryptoJS.MD5('message');
  9612  	     *     var hash = CryptoJS.MD5(wordArray);
  9613  	     */
  9614  	    C.MD5 = Hasher._createHelper(MD5);
  9615  
  9616  	    /**
  9617  	     * Shortcut function to the HMAC's object interface.
  9618  	     *
  9619  	     * @param {WordArray|string} message The message to hash.
  9620  	     * @param {WordArray|string} key The secret key.
  9621  	     *
  9622  	     * @return {WordArray} The HMAC.
  9623  	     *
  9624  	     * @static
  9625  	     *
  9626  	     * @example
  9627  	     *
  9628  	     *     var hmac = CryptoJS.HmacMD5(message, key);
  9629  	     */
  9630  	    C.HmacMD5 = Hasher._createHmacHelper(MD5);
  9631  	}(Math));
  9632  
  9633  
  9634  	return CryptoJS.MD5;
  9635  
  9636  }));
  9637  },{"./core":53}],62:[function(require,module,exports){
  9638  ;(function (root, factory, undef) {
  9639  	if (typeof exports === "object") {
  9640  		// CommonJS
  9641  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9642  	}
  9643  	else if (typeof define === "function" && define.amd) {
  9644  		// AMD
  9645  		define(["./core", "./cipher-core"], factory);
  9646  	}
  9647  	else {
  9648  		// Global (browser)
  9649  		factory(root.CryptoJS);
  9650  	}
  9651  }(this, function (CryptoJS) {
  9652  
  9653  	/**
  9654  	 * Cipher Feedback block mode.
  9655  	 */
  9656  	CryptoJS.mode.CFB = (function () {
  9657  	    var CFB = CryptoJS.lib.BlockCipherMode.extend();
  9658  
  9659  	    CFB.Encryptor = CFB.extend({
  9660  	        processBlock: function (words, offset) {
  9661  	            // Shortcuts
  9662  	            var cipher = this._cipher;
  9663  	            var blockSize = cipher.blockSize;
  9664  
  9665  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9666  
  9667  	            // Remember this block to use with next block
  9668  	            this._prevBlock = words.slice(offset, offset + blockSize);
  9669  	        }
  9670  	    });
  9671  
  9672  	    CFB.Decryptor = CFB.extend({
  9673  	        processBlock: function (words, offset) {
  9674  	            // Shortcuts
  9675  	            var cipher = this._cipher;
  9676  	            var blockSize = cipher.blockSize;
  9677  
  9678  	            // Remember this block to use with next block
  9679  	            var thisBlock = words.slice(offset, offset + blockSize);
  9680  
  9681  	            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
  9682  
  9683  	            // This block becomes the previous block
  9684  	            this._prevBlock = thisBlock;
  9685  	        }
  9686  	    });
  9687  
  9688  	    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
  9689  	        // Shortcut
  9690  	        var iv = this._iv;
  9691  
  9692  	        // Generate keystream
  9693  	        if (iv) {
  9694  	            var keystream = iv.slice(0);
  9695  
  9696  	            // Remove IV for subsequent blocks
  9697  	            this._iv = undefined;
  9698  	        } else {
  9699  	            var keystream = this._prevBlock;
  9700  	        }
  9701  	        cipher.encryptBlock(keystream, 0);
  9702  
  9703  	        // Encrypt
  9704  	        for (var i = 0; i < blockSize; i++) {
  9705  	            words[offset + i] ^= keystream[i];
  9706  	        }
  9707  	    }
  9708  
  9709  	    return CFB;
  9710  	}());
  9711  
  9712  
  9713  	return CryptoJS.mode.CFB;
  9714  
  9715  }));
  9716  },{"./cipher-core":52,"./core":53}],63:[function(require,module,exports){
  9717  ;(function (root, factory, undef) {
  9718  	if (typeof exports === "object") {
  9719  		// CommonJS
  9720  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9721  	}
  9722  	else if (typeof define === "function" && define.amd) {
  9723  		// AMD
  9724  		define(["./core", "./cipher-core"], factory);
  9725  	}
  9726  	else {
  9727  		// Global (browser)
  9728  		factory(root.CryptoJS);
  9729  	}
  9730  }(this, function (CryptoJS) {
  9731  
  9732  	/** @preserve
  9733  	 * Counter block mode compatible with  Dr Brian Gladman fileenc.c
  9734  	 * derived from CryptoJS.mode.CTR
  9735  	 * Jan Hruby jhruby.web@gmail.com
  9736  	 */
  9737  	CryptoJS.mode.CTRGladman = (function () {
  9738  	    var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
  9739  
  9740  		function incWord(word)
  9741  		{
  9742  			if (((word >> 24) & 0xff) === 0xff) { //overflow
  9743  			var b1 = (word >> 16)&0xff;
  9744  			var b2 = (word >> 8)&0xff;
  9745  			var b3 = word & 0xff;
  9746  
  9747  			if (b1 === 0xff) // overflow b1
  9748  			{
  9749  			b1 = 0;
  9750  			if (b2 === 0xff)
  9751  			{
  9752  				b2 = 0;
  9753  				if (b3 === 0xff)
  9754  				{
  9755  					b3 = 0;
  9756  				}
  9757  				else
  9758  				{
  9759  					++b3;
  9760  				}
  9761  			}
  9762  			else
  9763  			{
  9764  				++b2;
  9765  			}
  9766  			}
  9767  			else
  9768  			{
  9769  			++b1;
  9770  			}
  9771  
  9772  			word = 0;
  9773  			word += (b1 << 16);
  9774  			word += (b2 << 8);
  9775  			word += b3;
  9776  			}
  9777  			else
  9778  			{
  9779  			word += (0x01 << 24);
  9780  			}
  9781  			return word;
  9782  		}
  9783  
  9784  		function incCounter(counter)
  9785  		{
  9786  			if ((counter[0] = incWord(counter[0])) === 0)
  9787  			{
  9788  				// encr_data in fileenc.c from  Dr Brian Gladman's counts only with DWORD j < 8
  9789  				counter[1] = incWord(counter[1]);
  9790  			}
  9791  			return counter;
  9792  		}
  9793  
  9794  	    var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
  9795  	        processBlock: function (words, offset) {
  9796  	            // Shortcuts
  9797  	            var cipher = this._cipher
  9798  	            var blockSize = cipher.blockSize;
  9799  	            var iv = this._iv;
  9800  	            var counter = this._counter;
  9801  
  9802  	            // Generate keystream
  9803  	            if (iv) {
  9804  	                counter = this._counter = iv.slice(0);
  9805  
  9806  	                // Remove IV for subsequent blocks
  9807  	                this._iv = undefined;
  9808  	            }
  9809  
  9810  				incCounter(counter);
  9811  
  9812  				var keystream = counter.slice(0);
  9813  	            cipher.encryptBlock(keystream, 0);
  9814  
  9815  	            // Encrypt
  9816  	            for (var i = 0; i < blockSize; i++) {
  9817  	                words[offset + i] ^= keystream[i];
  9818  	            }
  9819  	        }
  9820  	    });
  9821  
  9822  	    CTRGladman.Decryptor = Encryptor;
  9823  
  9824  	    return CTRGladman;
  9825  	}());
  9826  
  9827  
  9828  
  9829  
  9830  	return CryptoJS.mode.CTRGladman;
  9831  
  9832  }));
  9833  },{"./cipher-core":52,"./core":53}],64:[function(require,module,exports){
  9834  ;(function (root, factory, undef) {
  9835  	if (typeof exports === "object") {
  9836  		// CommonJS
  9837  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9838  	}
  9839  	else if (typeof define === "function" && define.amd) {
  9840  		// AMD
  9841  		define(["./core", "./cipher-core"], factory);
  9842  	}
  9843  	else {
  9844  		// Global (browser)
  9845  		factory(root.CryptoJS);
  9846  	}
  9847  }(this, function (CryptoJS) {
  9848  
  9849  	/**
  9850  	 * Counter block mode.
  9851  	 */
  9852  	CryptoJS.mode.CTR = (function () {
  9853  	    var CTR = CryptoJS.lib.BlockCipherMode.extend();
  9854  
  9855  	    var Encryptor = CTR.Encryptor = CTR.extend({
  9856  	        processBlock: function (words, offset) {
  9857  	            // Shortcuts
  9858  	            var cipher = this._cipher
  9859  	            var blockSize = cipher.blockSize;
  9860  	            var iv = this._iv;
  9861  	            var counter = this._counter;
  9862  
  9863  	            // Generate keystream
  9864  	            if (iv) {
  9865  	                counter = this._counter = iv.slice(0);
  9866  
  9867  	                // Remove IV for subsequent blocks
  9868  	                this._iv = undefined;
  9869  	            }
  9870  	            var keystream = counter.slice(0);
  9871  	            cipher.encryptBlock(keystream, 0);
  9872  
  9873  	            // Increment counter
  9874  	            counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
  9875  
  9876  	            // Encrypt
  9877  	            for (var i = 0; i < blockSize; i++) {
  9878  	                words[offset + i] ^= keystream[i];
  9879  	            }
  9880  	        }
  9881  	    });
  9882  
  9883  	    CTR.Decryptor = Encryptor;
  9884  
  9885  	    return CTR;
  9886  	}());
  9887  
  9888  
  9889  	return CryptoJS.mode.CTR;
  9890  
  9891  }));
  9892  },{"./cipher-core":52,"./core":53}],65:[function(require,module,exports){
  9893  ;(function (root, factory, undef) {
  9894  	if (typeof exports === "object") {
  9895  		// CommonJS
  9896  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9897  	}
  9898  	else if (typeof define === "function" && define.amd) {
  9899  		// AMD
  9900  		define(["./core", "./cipher-core"], factory);
  9901  	}
  9902  	else {
  9903  		// Global (browser)
  9904  		factory(root.CryptoJS);
  9905  	}
  9906  }(this, function (CryptoJS) {
  9907  
  9908  	/**
  9909  	 * Electronic Codebook block mode.
  9910  	 */
  9911  	CryptoJS.mode.ECB = (function () {
  9912  	    var ECB = CryptoJS.lib.BlockCipherMode.extend();
  9913  
  9914  	    ECB.Encryptor = ECB.extend({
  9915  	        processBlock: function (words, offset) {
  9916  	            this._cipher.encryptBlock(words, offset);
  9917  	        }
  9918  	    });
  9919  
  9920  	    ECB.Decryptor = ECB.extend({
  9921  	        processBlock: function (words, offset) {
  9922  	            this._cipher.decryptBlock(words, offset);
  9923  	        }
  9924  	    });
  9925  
  9926  	    return ECB;
  9927  	}());
  9928  
  9929  
  9930  	return CryptoJS.mode.ECB;
  9931  
  9932  }));
  9933  },{"./cipher-core":52,"./core":53}],66:[function(require,module,exports){
  9934  ;(function (root, factory, undef) {
  9935  	if (typeof exports === "object") {
  9936  		// CommonJS
  9937  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9938  	}
  9939  	else if (typeof define === "function" && define.amd) {
  9940  		// AMD
  9941  		define(["./core", "./cipher-core"], factory);
  9942  	}
  9943  	else {
  9944  		// Global (browser)
  9945  		factory(root.CryptoJS);
  9946  	}
  9947  }(this, function (CryptoJS) {
  9948  
  9949  	/**
  9950  	 * Output Feedback block mode.
  9951  	 */
  9952  	CryptoJS.mode.OFB = (function () {
  9953  	    var OFB = CryptoJS.lib.BlockCipherMode.extend();
  9954  
  9955  	    var Encryptor = OFB.Encryptor = OFB.extend({
  9956  	        processBlock: function (words, offset) {
  9957  	            // Shortcuts
  9958  	            var cipher = this._cipher
  9959  	            var blockSize = cipher.blockSize;
  9960  	            var iv = this._iv;
  9961  	            var keystream = this._keystream;
  9962  
  9963  	            // Generate keystream
  9964  	            if (iv) {
  9965  	                keystream = this._keystream = iv.slice(0);
  9966  
  9967  	                // Remove IV for subsequent blocks
  9968  	                this._iv = undefined;
  9969  	            }
  9970  	            cipher.encryptBlock(keystream, 0);
  9971  
  9972  	            // Encrypt
  9973  	            for (var i = 0; i < blockSize; i++) {
  9974  	                words[offset + i] ^= keystream[i];
  9975  	            }
  9976  	        }
  9977  	    });
  9978  
  9979  	    OFB.Decryptor = Encryptor;
  9980  
  9981  	    return OFB;
  9982  	}());
  9983  
  9984  
  9985  	return CryptoJS.mode.OFB;
  9986  
  9987  }));
  9988  },{"./cipher-core":52,"./core":53}],67:[function(require,module,exports){
  9989  ;(function (root, factory, undef) {
  9990  	if (typeof exports === "object") {
  9991  		// CommonJS
  9992  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
  9993  	}
  9994  	else if (typeof define === "function" && define.amd) {
  9995  		// AMD
  9996  		define(["./core", "./cipher-core"], factory);
  9997  	}
  9998  	else {
  9999  		// Global (browser)
 10000  		factory(root.CryptoJS);
 10001  	}
 10002  }(this, function (CryptoJS) {
 10003  
 10004  	/**
 10005  	 * ANSI X.923 padding strategy.
 10006  	 */
 10007  	CryptoJS.pad.AnsiX923 = {
 10008  	    pad: function (data, blockSize) {
 10009  	        // Shortcuts
 10010  	        var dataSigBytes = data.sigBytes;
 10011  	        var blockSizeBytes = blockSize * 4;
 10012  
 10013  	        // Count padding bytes
 10014  	        var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
 10015  
 10016  	        // Compute last byte position
 10017  	        var lastBytePos = dataSigBytes + nPaddingBytes - 1;
 10018  
 10019  	        // Pad
 10020  	        data.clamp();
 10021  	        data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
 10022  	        data.sigBytes += nPaddingBytes;
 10023  	    },
 10024  
 10025  	    unpad: function (data) {
 10026  	        // Get number of padding bytes from last byte
 10027  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10028  
 10029  	        // Remove padding
 10030  	        data.sigBytes -= nPaddingBytes;
 10031  	    }
 10032  	};
 10033  
 10034  
 10035  	return CryptoJS.pad.Ansix923;
 10036  
 10037  }));
 10038  },{"./cipher-core":52,"./core":53}],68:[function(require,module,exports){
 10039  ;(function (root, factory, undef) {
 10040  	if (typeof exports === "object") {
 10041  		// CommonJS
 10042  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10043  	}
 10044  	else if (typeof define === "function" && define.amd) {
 10045  		// AMD
 10046  		define(["./core", "./cipher-core"], factory);
 10047  	}
 10048  	else {
 10049  		// Global (browser)
 10050  		factory(root.CryptoJS);
 10051  	}
 10052  }(this, function (CryptoJS) {
 10053  
 10054  	/**
 10055  	 * ISO 10126 padding strategy.
 10056  	 */
 10057  	CryptoJS.pad.Iso10126 = {
 10058  	    pad: function (data, blockSize) {
 10059  	        // Shortcut
 10060  	        var blockSizeBytes = blockSize * 4;
 10061  
 10062  	        // Count padding bytes
 10063  	        var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
 10064  
 10065  	        // Pad
 10066  	        data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
 10067  	             concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
 10068  	    },
 10069  
 10070  	    unpad: function (data) {
 10071  	        // Get number of padding bytes from last byte
 10072  	        var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
 10073  
 10074  	        // Remove padding
 10075  	        data.sigBytes -= nPaddingBytes;
 10076  	    }
 10077  	};
 10078  
 10079  
 10080  	return CryptoJS.pad.Iso10126;
 10081  
 10082  }));
 10083  },{"./cipher-core":52,"./core":53}],69:[function(require,module,exports){
 10084  ;(function (root, factory, undef) {
 10085  	if (typeof exports === "object") {
 10086  		// CommonJS
 10087  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10088  	}
 10089  	else if (typeof define === "function" && define.amd) {
 10090  		// AMD
 10091  		define(["./core", "./cipher-core"], factory);
 10092  	}
 10093  	else {
 10094  		// Global (browser)
 10095  		factory(root.CryptoJS);
 10096  	}
 10097  }(this, function (CryptoJS) {
 10098  
 10099  	/**
 10100  	 * ISO/IEC 9797-1 Padding Method 2.
 10101  	 */
 10102  	CryptoJS.pad.Iso97971 = {
 10103  	    pad: function (data, blockSize) {
 10104  	        // Add 0x80 byte
 10105  	        data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
 10106  
 10107  	        // Zero pad the rest
 10108  	        CryptoJS.pad.ZeroPadding.pad(data, blockSize);
 10109  	    },
 10110  
 10111  	    unpad: function (data) {
 10112  	        // Remove zero padding
 10113  	        CryptoJS.pad.ZeroPadding.unpad(data);
 10114  
 10115  	        // Remove one more byte -- the 0x80 byte
 10116  	        data.sigBytes--;
 10117  	    }
 10118  	};
 10119  
 10120  
 10121  	return CryptoJS.pad.Iso97971;
 10122  
 10123  }));
 10124  },{"./cipher-core":52,"./core":53}],70:[function(require,module,exports){
 10125  ;(function (root, factory, undef) {
 10126  	if (typeof exports === "object") {
 10127  		// CommonJS
 10128  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10129  	}
 10130  	else if (typeof define === "function" && define.amd) {
 10131  		// AMD
 10132  		define(["./core", "./cipher-core"], factory);
 10133  	}
 10134  	else {
 10135  		// Global (browser)
 10136  		factory(root.CryptoJS);
 10137  	}
 10138  }(this, function (CryptoJS) {
 10139  
 10140  	/**
 10141  	 * A noop padding strategy.
 10142  	 */
 10143  	CryptoJS.pad.NoPadding = {
 10144  	    pad: function () {
 10145  	    },
 10146  
 10147  	    unpad: function () {
 10148  	    }
 10149  	};
 10150  
 10151  
 10152  	return CryptoJS.pad.NoPadding;
 10153  
 10154  }));
 10155  },{"./cipher-core":52,"./core":53}],71:[function(require,module,exports){
 10156  ;(function (root, factory, undef) {
 10157  	if (typeof exports === "object") {
 10158  		// CommonJS
 10159  		module.exports = exports = factory(require("./core"), require("./cipher-core"));
 10160  	}
 10161  	else if (typeof define === "function" && define.amd) {
 10162  		// AMD
 10163  		define(["./core", "./cipher-core"], factory);
 10164  	}
 10165  	else {
 10166  		// Global (browser)
 10167  		factory(root.CryptoJS);
 10168  	}
 10169  }(this, function (CryptoJS) {
 10170  
 10171  	/**
 10172  	 * Zero padding strategy.
 10173  	 */
 10174  	CryptoJS.pad.ZeroPadding = {
 10175  	    pad: function (data, blockSize) {
 10176  	        // Shortcut
 10177  	        var blockSizeBytes = blockSize * 4;
 10178  
 10179  	        // Pad
 10180  	        data.clamp();
 10181  	        data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
 10182  	    },
 10183  
 10184  	    unpad: function (data) {
 10185  	        // Shortcut
 10186  	        var dataWords = data.words;
 10187  
 10188  	        // Unpad
 10189  	        var i = data.sigBytes - 1;
 10190  	        while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
 10191  	            i--;
 10192  	        }
 10193  	        data.sigBytes = i + 1;
 10194  	    }
 10195  	};
 10196  
 10197  
 10198  	return CryptoJS.pad.ZeroPadding;
 10199  
 10200  }));
 10201  },{"./cipher-core":52,"./core":53}],72:[function(require,module,exports){
 10202  ;(function (root, factory, undef) {
 10203  	if (typeof exports === "object") {
 10204  		// CommonJS
 10205  		module.exports = exports = factory(require("./core"), require("./sha1"), require("./hmac"));
 10206  	}
 10207  	else if (typeof define === "function" && define.amd) {
 10208  		// AMD
 10209  		define(["./core", "./sha1", "./hmac"], factory);
 10210  	}
 10211  	else {
 10212  		// Global (browser)
 10213  		factory(root.CryptoJS);
 10214  	}
 10215  }(this, function (CryptoJS) {
 10216  
 10217  	(function () {
 10218  	    // Shortcuts
 10219  	    var C = CryptoJS;
 10220  	    var C_lib = C.lib;
 10221  	    var Base = C_lib.Base;
 10222  	    var WordArray = C_lib.WordArray;
 10223  	    var C_algo = C.algo;
 10224  	    var SHA1 = C_algo.SHA1;
 10225  	    var HMAC = C_algo.HMAC;
 10226  
 10227  	    /**
 10228  	     * Password-Based Key Derivation Function 2 algorithm.
 10229  	     */
 10230  	    var PBKDF2 = C_algo.PBKDF2 = Base.extend({
 10231  	        /**
 10232  	         * Configuration options.
 10233  	         *
 10234  	         * @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
 10235  	         * @property {Hasher} hasher The hasher to use. Default: SHA1
 10236  	         * @property {number} iterations The number of iterations to perform. Default: 1
 10237  	         */
 10238  	        cfg: Base.extend({
 10239  	            keySize: 128/32,
 10240  	            hasher: SHA1,
 10241  	            iterations: 1
 10242  	        }),
 10243  
 10244  	        /**
 10245  	         * Initializes a newly created key derivation function.
 10246  	         *
 10247  	         * @param {Object} cfg (Optional) The configuration options to use for the derivation.
 10248  	         *
 10249  	         * @example
 10250  	         *
 10251  	         *     var kdf = CryptoJS.algo.PBKDF2.create();
 10252  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
 10253  	         *     var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
 10254  	         */
 10255  	        init: function (cfg) {
 10256  	            this.cfg = this.cfg.extend(cfg);
 10257  	        },
 10258  
 10259  	        /**
 10260  	         * Computes the Password-Based Key Derivation Function 2.
 10261  	         *
 10262  	         * @param {WordArray|string} password The password.
 10263  	         * @param {WordArray|string} salt A salt.
 10264  	         *
 10265  	         * @return {WordArray} The derived key.
 10266  	         *
 10267  	         * @example
 10268  	         *
 10269  	         *     var key = kdf.compute(password, salt);
 10270  	         */
 10271  	        compute: function (password, salt) {
 10272  	            // Shortcut
 10273  	            var cfg = this.cfg;
 10274  
 10275  	            // Init HMAC
 10276  	            var hmac = HMAC.create(cfg.hasher, password);
 10277  
 10278  	            // Initial values
 10279  	            var derivedKey = WordArray.create();
 10280  	            var blockIndex = WordArray.create([0x00000001]);
 10281  
 10282  	            // Shortcuts
 10283  	            var derivedKeyWords = derivedKey.words;
 10284  	            var blockIndexWords = blockIndex.words;
 10285  	            var keySize = cfg.keySize;
 10286  	            var iterations = cfg.iterations;
 10287  
 10288  	            // Generate key
 10289  	            while (derivedKeyWords.length < keySize) {
 10290  	                var block = hmac.update(salt).finalize(blockIndex);
 10291  	                hmac.reset();
 10292  
 10293  	                // Shortcuts
 10294  	                var blockWords = block.words;
 10295  	                var blockWordsLength = blockWords.length;
 10296  
 10297  	                // Iterations
 10298  	                var intermediate = block;
 10299  	                for (var i = 1; i < iterations; i++) {
 10300  	                    intermediate = hmac.finalize(intermediate);
 10301  	                    hmac.reset();
 10302  
 10303  	                    // Shortcut
 10304  	                    var intermediateWords = intermediate.words;
 10305  
 10306  	                    // XOR intermediate with block
 10307  	                    for (var j = 0; j < blockWordsLength; j++) {
 10308  	                        blockWords[j] ^= intermediateWords[j];
 10309  	                    }
 10310  	                }
 10311  
 10312  	                derivedKey.concat(block);
 10313  	                blockIndexWords[0]++;
 10314  	            }
 10315  	            derivedKey.sigBytes = keySize * 4;
 10316  
 10317  	            return derivedKey;
 10318  	        }
 10319  	    });
 10320  
 10321  	    /**
 10322  	     * Computes the Password-Based Key Derivation Function 2.
 10323  	     *
 10324  	     * @param {WordArray|string} password The password.
 10325  	     * @param {WordArray|string} salt A salt.
 10326  	     * @param {Object} cfg (Optional) The configuration options to use for this computation.
 10327  	     *
 10328  	     * @return {WordArray} The derived key.
 10329  	     *
 10330  	     * @static
 10331  	     *
 10332  	     * @example
 10333  	     *
 10334  	     *     var key = CryptoJS.PBKDF2(password, salt);
 10335  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
 10336  	     *     var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
 10337  	     */
 10338  	    C.PBKDF2 = function (password, salt, cfg) {
 10339  	        return PBKDF2.create(cfg).compute(password, salt);
 10340  	    };
 10341  	}());
 10342  
 10343  
 10344  	return CryptoJS.PBKDF2;
 10345  
 10346  }));
 10347  },{"./core":53,"./hmac":58,"./sha1":77}],73:[function(require,module,exports){
 10348  ;(function (root, factory, undef) {
 10349  	if (typeof exports === "object") {
 10350  		// CommonJS
 10351  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10352  	}
 10353  	else if (typeof define === "function" && define.amd) {
 10354  		// AMD
 10355  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10356  	}
 10357  	else {
 10358  		// Global (browser)
 10359  		factory(root.CryptoJS);
 10360  	}
 10361  }(this, function (CryptoJS) {
 10362  
 10363  	(function () {
 10364  	    // Shortcuts
 10365  	    var C = CryptoJS;
 10366  	    var C_lib = C.lib;
 10367  	    var StreamCipher = C_lib.StreamCipher;
 10368  	    var C_algo = C.algo;
 10369  
 10370  	    // Reusable objects
 10371  	    var S  = [];
 10372  	    var C_ = [];
 10373  	    var G  = [];
 10374  
 10375  	    /**
 10376  	     * Rabbit stream cipher algorithm.
 10377  	     *
 10378  	     * This is a legacy version that neglected to convert the key to little-endian.
 10379  	     * This error doesn't affect the cipher's security,
 10380  	     * but it does affect its compatibility with other implementations.
 10381  	     */
 10382  	    var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
 10383  	        _doReset: function () {
 10384  	            // Shortcuts
 10385  	            var K = this._key.words;
 10386  	            var iv = this.cfg.iv;
 10387  
 10388  	            // Generate initial state values
 10389  	            var X = this._X = [
 10390  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10391  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10392  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10393  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10394  	            ];
 10395  
 10396  	            // Generate initial counter values
 10397  	            var C = this._C = [
 10398  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10399  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10400  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10401  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10402  	            ];
 10403  
 10404  	            // Carry bit
 10405  	            this._b = 0;
 10406  
 10407  	            // Iterate the system four times
 10408  	            for (var i = 0; i < 4; i++) {
 10409  	                nextState.call(this);
 10410  	            }
 10411  
 10412  	            // Modify the counters
 10413  	            for (var i = 0; i < 8; i++) {
 10414  	                C[i] ^= X[(i + 4) & 7];
 10415  	            }
 10416  
 10417  	            // IV setup
 10418  	            if (iv) {
 10419  	                // Shortcuts
 10420  	                var IV = iv.words;
 10421  	                var IV_0 = IV[0];
 10422  	                var IV_1 = IV[1];
 10423  
 10424  	                // Generate four subvectors
 10425  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10426  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10427  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10428  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10429  
 10430  	                // Modify counter values
 10431  	                C[0] ^= i0;
 10432  	                C[1] ^= i1;
 10433  	                C[2] ^= i2;
 10434  	                C[3] ^= i3;
 10435  	                C[4] ^= i0;
 10436  	                C[5] ^= i1;
 10437  	                C[6] ^= i2;
 10438  	                C[7] ^= i3;
 10439  
 10440  	                // Iterate the system four times
 10441  	                for (var i = 0; i < 4; i++) {
 10442  	                    nextState.call(this);
 10443  	                }
 10444  	            }
 10445  	        },
 10446  
 10447  	        _doProcessBlock: function (M, offset) {
 10448  	            // Shortcut
 10449  	            var X = this._X;
 10450  
 10451  	            // Iterate the system
 10452  	            nextState.call(this);
 10453  
 10454  	            // Generate four keystream words
 10455  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10456  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10457  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10458  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10459  
 10460  	            for (var i = 0; i < 4; i++) {
 10461  	                // Swap endian
 10462  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10463  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10464  
 10465  	                // Encrypt
 10466  	                M[offset + i] ^= S[i];
 10467  	            }
 10468  	        },
 10469  
 10470  	        blockSize: 128/32,
 10471  
 10472  	        ivSize: 64/32
 10473  	    });
 10474  
 10475  	    function nextState() {
 10476  	        // Shortcuts
 10477  	        var X = this._X;
 10478  	        var C = this._C;
 10479  
 10480  	        // Save old counter values
 10481  	        for (var i = 0; i < 8; i++) {
 10482  	            C_[i] = C[i];
 10483  	        }
 10484  
 10485  	        // Calculate new counter values
 10486  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10487  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10488  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10489  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10490  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10491  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10492  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10493  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10494  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10495  
 10496  	        // Calculate the g-values
 10497  	        for (var i = 0; i < 8; i++) {
 10498  	            var gx = X[i] + C[i];
 10499  
 10500  	            // Construct high and low argument for squaring
 10501  	            var ga = gx & 0xffff;
 10502  	            var gb = gx >>> 16;
 10503  
 10504  	            // Calculate high and low result of squaring
 10505  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10506  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10507  
 10508  	            // High XOR low
 10509  	            G[i] = gh ^ gl;
 10510  	        }
 10511  
 10512  	        // Calculate new state values
 10513  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10514  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10515  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10516  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10517  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10518  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10519  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10520  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10521  	    }
 10522  
 10523  	    /**
 10524  	     * Shortcut functions to the cipher's object interface.
 10525  	     *
 10526  	     * @example
 10527  	     *
 10528  	     *     var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
 10529  	     *     var plaintext  = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
 10530  	     */
 10531  	    C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
 10532  	}());
 10533  
 10534  
 10535  	return CryptoJS.RabbitLegacy;
 10536  
 10537  }));
 10538  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],74:[function(require,module,exports){
 10539  ;(function (root, factory, undef) {
 10540  	if (typeof exports === "object") {
 10541  		// CommonJS
 10542  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10543  	}
 10544  	else if (typeof define === "function" && define.amd) {
 10545  		// AMD
 10546  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10547  	}
 10548  	else {
 10549  		// Global (browser)
 10550  		factory(root.CryptoJS);
 10551  	}
 10552  }(this, function (CryptoJS) {
 10553  
 10554  	(function () {
 10555  	    // Shortcuts
 10556  	    var C = CryptoJS;
 10557  	    var C_lib = C.lib;
 10558  	    var StreamCipher = C_lib.StreamCipher;
 10559  	    var C_algo = C.algo;
 10560  
 10561  	    // Reusable objects
 10562  	    var S  = [];
 10563  	    var C_ = [];
 10564  	    var G  = [];
 10565  
 10566  	    /**
 10567  	     * Rabbit stream cipher algorithm
 10568  	     */
 10569  	    var Rabbit = C_algo.Rabbit = StreamCipher.extend({
 10570  	        _doReset: function () {
 10571  	            // Shortcuts
 10572  	            var K = this._key.words;
 10573  	            var iv = this.cfg.iv;
 10574  
 10575  	            // Swap endian
 10576  	            for (var i = 0; i < 4; i++) {
 10577  	                K[i] = (((K[i] << 8)  | (K[i] >>> 24)) & 0x00ff00ff) |
 10578  	                       (((K[i] << 24) | (K[i] >>> 8))  & 0xff00ff00);
 10579  	            }
 10580  
 10581  	            // Generate initial state values
 10582  	            var X = this._X = [
 10583  	                K[0], (K[3] << 16) | (K[2] >>> 16),
 10584  	                K[1], (K[0] << 16) | (K[3] >>> 16),
 10585  	                K[2], (K[1] << 16) | (K[0] >>> 16),
 10586  	                K[3], (K[2] << 16) | (K[1] >>> 16)
 10587  	            ];
 10588  
 10589  	            // Generate initial counter values
 10590  	            var C = this._C = [
 10591  	                (K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
 10592  	                (K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
 10593  	                (K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
 10594  	                (K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
 10595  	            ];
 10596  
 10597  	            // Carry bit
 10598  	            this._b = 0;
 10599  
 10600  	            // Iterate the system four times
 10601  	            for (var i = 0; i < 4; i++) {
 10602  	                nextState.call(this);
 10603  	            }
 10604  
 10605  	            // Modify the counters
 10606  	            for (var i = 0; i < 8; i++) {
 10607  	                C[i] ^= X[(i + 4) & 7];
 10608  	            }
 10609  
 10610  	            // IV setup
 10611  	            if (iv) {
 10612  	                // Shortcuts
 10613  	                var IV = iv.words;
 10614  	                var IV_0 = IV[0];
 10615  	                var IV_1 = IV[1];
 10616  
 10617  	                // Generate four subvectors
 10618  	                var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
 10619  	                var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
 10620  	                var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
 10621  	                var i3 = (i2 << 16)  | (i0 & 0x0000ffff);
 10622  
 10623  	                // Modify counter values
 10624  	                C[0] ^= i0;
 10625  	                C[1] ^= i1;
 10626  	                C[2] ^= i2;
 10627  	                C[3] ^= i3;
 10628  	                C[4] ^= i0;
 10629  	                C[5] ^= i1;
 10630  	                C[6] ^= i2;
 10631  	                C[7] ^= i3;
 10632  
 10633  	                // Iterate the system four times
 10634  	                for (var i = 0; i < 4; i++) {
 10635  	                    nextState.call(this);
 10636  	                }
 10637  	            }
 10638  	        },
 10639  
 10640  	        _doProcessBlock: function (M, offset) {
 10641  	            // Shortcut
 10642  	            var X = this._X;
 10643  
 10644  	            // Iterate the system
 10645  	            nextState.call(this);
 10646  
 10647  	            // Generate four keystream words
 10648  	            S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
 10649  	            S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
 10650  	            S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
 10651  	            S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
 10652  
 10653  	            for (var i = 0; i < 4; i++) {
 10654  	                // Swap endian
 10655  	                S[i] = (((S[i] << 8)  | (S[i] >>> 24)) & 0x00ff00ff) |
 10656  	                       (((S[i] << 24) | (S[i] >>> 8))  & 0xff00ff00);
 10657  
 10658  	                // Encrypt
 10659  	                M[offset + i] ^= S[i];
 10660  	            }
 10661  	        },
 10662  
 10663  	        blockSize: 128/32,
 10664  
 10665  	        ivSize: 64/32
 10666  	    });
 10667  
 10668  	    function nextState() {
 10669  	        // Shortcuts
 10670  	        var X = this._X;
 10671  	        var C = this._C;
 10672  
 10673  	        // Save old counter values
 10674  	        for (var i = 0; i < 8; i++) {
 10675  	            C_[i] = C[i];
 10676  	        }
 10677  
 10678  	        // Calculate new counter values
 10679  	        C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
 10680  	        C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
 10681  	        C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
 10682  	        C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
 10683  	        C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
 10684  	        C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
 10685  	        C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
 10686  	        C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
 10687  	        this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
 10688  
 10689  	        // Calculate the g-values
 10690  	        for (var i = 0; i < 8; i++) {
 10691  	            var gx = X[i] + C[i];
 10692  
 10693  	            // Construct high and low argument for squaring
 10694  	            var ga = gx & 0xffff;
 10695  	            var gb = gx >>> 16;
 10696  
 10697  	            // Calculate high and low result of squaring
 10698  	            var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
 10699  	            var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
 10700  
 10701  	            // High XOR low
 10702  	            G[i] = gh ^ gl;
 10703  	        }
 10704  
 10705  	        // Calculate new state values
 10706  	        X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
 10707  	        X[1] = (G[1] + ((G[0] << 8)  | (G[0] >>> 24)) + G[7]) | 0;
 10708  	        X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
 10709  	        X[3] = (G[3] + ((G[2] << 8)  | (G[2] >>> 24)) + G[1]) | 0;
 10710  	        X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
 10711  	        X[5] = (G[5] + ((G[4] << 8)  | (G[4] >>> 24)) + G[3]) | 0;
 10712  	        X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
 10713  	        X[7] = (G[7] + ((G[6] << 8)  | (G[6] >>> 24)) + G[5]) | 0;
 10714  	    }
 10715  
 10716  	    /**
 10717  	     * Shortcut functions to the cipher's object interface.
 10718  	     *
 10719  	     * @example
 10720  	     *
 10721  	     *     var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
 10722  	     *     var plaintext  = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
 10723  	     */
 10724  	    C.Rabbit = StreamCipher._createHelper(Rabbit);
 10725  	}());
 10726  
 10727  
 10728  	return CryptoJS.Rabbit;
 10729  
 10730  }));
 10731  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],75:[function(require,module,exports){
 10732  ;(function (root, factory, undef) {
 10733  	if (typeof exports === "object") {
 10734  		// CommonJS
 10735  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 10736  	}
 10737  	else if (typeof define === "function" && define.amd) {
 10738  		// AMD
 10739  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 10740  	}
 10741  	else {
 10742  		// Global (browser)
 10743  		factory(root.CryptoJS);
 10744  	}
 10745  }(this, function (CryptoJS) {
 10746  
 10747  	(function () {
 10748  	    // Shortcuts
 10749  	    var C = CryptoJS;
 10750  	    var C_lib = C.lib;
 10751  	    var StreamCipher = C_lib.StreamCipher;
 10752  	    var C_algo = C.algo;
 10753  
 10754  	    /**
 10755  	     * RC4 stream cipher algorithm.
 10756  	     */
 10757  	    var RC4 = C_algo.RC4 = StreamCipher.extend({
 10758  	        _doReset: function () {
 10759  	            // Shortcuts
 10760  	            var key = this._key;
 10761  	            var keyWords = key.words;
 10762  	            var keySigBytes = key.sigBytes;
 10763  
 10764  	            // Init sbox
 10765  	            var S = this._S = [];
 10766  	            for (var i = 0; i < 256; i++) {
 10767  	                S[i] = i;
 10768  	            }
 10769  
 10770  	            // Key setup
 10771  	            for (var i = 0, j = 0; i < 256; i++) {
 10772  	                var keyByteIndex = i % keySigBytes;
 10773  	                var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
 10774  
 10775  	                j = (j + S[i] + keyByte) % 256;
 10776  
 10777  	                // Swap
 10778  	                var t = S[i];
 10779  	                S[i] = S[j];
 10780  	                S[j] = t;
 10781  	            }
 10782  
 10783  	            // Counters
 10784  	            this._i = this._j = 0;
 10785  	        },
 10786  
 10787  	        _doProcessBlock: function (M, offset) {
 10788  	            M[offset] ^= generateKeystreamWord.call(this);
 10789  	        },
 10790  
 10791  	        keySize: 256/32,
 10792  
 10793  	        ivSize: 0
 10794  	    });
 10795  
 10796  	    function generateKeystreamWord() {
 10797  	        // Shortcuts
 10798  	        var S = this._S;
 10799  	        var i = this._i;
 10800  	        var j = this._j;
 10801  
 10802  	        // Generate keystream word
 10803  	        var keystreamWord = 0;
 10804  	        for (var n = 0; n < 4; n++) {
 10805  	            i = (i + 1) % 256;
 10806  	            j = (j + S[i]) % 256;
 10807  
 10808  	            // Swap
 10809  	            var t = S[i];
 10810  	            S[i] = S[j];
 10811  	            S[j] = t;
 10812  
 10813  	            keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
 10814  	        }
 10815  
 10816  	        // Update counters
 10817  	        this._i = i;
 10818  	        this._j = j;
 10819  
 10820  	        return keystreamWord;
 10821  	    }
 10822  
 10823  	    /**
 10824  	     * Shortcut functions to the cipher's object interface.
 10825  	     *
 10826  	     * @example
 10827  	     *
 10828  	     *     var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
 10829  	     *     var plaintext  = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
 10830  	     */
 10831  	    C.RC4 = StreamCipher._createHelper(RC4);
 10832  
 10833  	    /**
 10834  	     * Modified RC4 stream cipher algorithm.
 10835  	     */
 10836  	    var RC4Drop = C_algo.RC4Drop = RC4.extend({
 10837  	        /**
 10838  	         * Configuration options.
 10839  	         *
 10840  	         * @property {number} drop The number of keystream words to drop. Default 192
 10841  	         */
 10842  	        cfg: RC4.cfg.extend({
 10843  	            drop: 192
 10844  	        }),
 10845  
 10846  	        _doReset: function () {
 10847  	            RC4._doReset.call(this);
 10848  
 10849  	            // Drop
 10850  	            for (var i = this.cfg.drop; i > 0; i--) {
 10851  	                generateKeystreamWord.call(this);
 10852  	            }
 10853  	        }
 10854  	    });
 10855  
 10856  	    /**
 10857  	     * Shortcut functions to the cipher's object interface.
 10858  	     *
 10859  	     * @example
 10860  	     *
 10861  	     *     var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
 10862  	     *     var plaintext  = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
 10863  	     */
 10864  	    C.RC4Drop = StreamCipher._createHelper(RC4Drop);
 10865  	}());
 10866  
 10867  
 10868  	return CryptoJS.RC4;
 10869  
 10870  }));
 10871  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],76:[function(require,module,exports){
 10872  ;(function (root, factory) {
 10873  	if (typeof exports === "object") {
 10874  		// CommonJS
 10875  		module.exports = exports = factory(require("./core"));
 10876  	}
 10877  	else if (typeof define === "function" && define.amd) {
 10878  		// AMD
 10879  		define(["./core"], factory);
 10880  	}
 10881  	else {
 10882  		// Global (browser)
 10883  		factory(root.CryptoJS);
 10884  	}
 10885  }(this, function (CryptoJS) {
 10886  
 10887  	/** @preserve
 10888  	(c) 2012 by Cédric Mesnil. All rights reserved.
 10889  
 10890  	Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
 10891  
 10892  	    - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
 10893  	    - 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.
 10894  
 10895  	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.
 10896  	*/
 10897  
 10898  	(function (Math) {
 10899  	    // Shortcuts
 10900  	    var C = CryptoJS;
 10901  	    var C_lib = C.lib;
 10902  	    var WordArray = C_lib.WordArray;
 10903  	    var Hasher = C_lib.Hasher;
 10904  	    var C_algo = C.algo;
 10905  
 10906  	    // Constants table
 10907  	    var _zl = WordArray.create([
 10908  	        0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,
 10909  	        7,  4, 13,  1, 10,  6, 15,  3, 12,  0,  9,  5,  2, 14, 11,  8,
 10910  	        3, 10, 14,  4,  9, 15,  8,  1,  2,  7,  0,  6, 13, 11,  5, 12,
 10911  	        1,  9, 11, 10,  0,  8, 12,  4, 13,  3,  7, 15, 14,  5,  6,  2,
 10912  	        4,  0,  5,  9,  7, 12,  2, 10, 14,  1,  3,  8, 11,  6, 15, 13]);
 10913  	    var _zr = WordArray.create([
 10914  	        5, 14,  7,  0,  9,  2, 11,  4, 13,  6, 15,  8,  1, 10,  3, 12,
 10915  	        6, 11,  3,  7,  0, 13,  5, 10, 14, 15,  8, 12,  4,  9,  1,  2,
 10916  	        15,  5,  1,  3,  7, 14,  6,  9, 11,  8, 12,  2, 10,  0,  4, 13,
 10917  	        8,  6,  4,  1,  3, 11, 15,  0,  5, 12,  2, 13,  9,  7, 10, 14,
 10918  	        12, 15, 10,  4,  1,  5,  8,  7,  6,  2, 13, 14,  0,  3,  9, 11]);
 10919  	    var _sl = WordArray.create([
 10920  	         11, 14, 15, 12,  5,  8,  7,  9, 11, 13, 14, 15,  6,  7,  9,  8,
 10921  	        7, 6,   8, 13, 11,  9,  7, 15,  7, 12, 15,  9, 11,  7, 13, 12,
 10922  	        11, 13,  6,  7, 14,  9, 13, 15, 14,  8, 13,  6,  5, 12,  7,  5,
 10923  	          11, 12, 14, 15, 14, 15,  9,  8,  9, 14,  5,  6,  8,  6,  5, 12,
 10924  	        9, 15,  5, 11,  6,  8, 13, 12,  5, 12, 13, 14, 11,  8,  5,  6 ]);
 10925  	    var _sr = WordArray.create([
 10926  	        8,  9,  9, 11, 13, 15, 15,  5,  7,  7,  8, 11, 14, 14, 12,  6,
 10927  	        9, 13, 15,  7, 12,  8,  9, 11,  7,  7, 12,  7,  6, 15, 13, 11,
 10928  	        9,  7, 15, 11,  8,  6,  6, 14, 12, 13,  5, 14, 13, 13,  7,  5,
 10929  	        15,  5,  8, 11, 14, 14,  6, 14,  6,  9, 12,  9, 12,  5, 15,  8,
 10930  	        8,  5, 12,  9, 12,  5, 14,  6,  8, 13,  6,  5, 15, 13, 11, 11 ]);
 10931  
 10932  	    var _hl =  WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
 10933  	    var _hr =  WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
 10934  
 10935  	    /**
 10936  	     * RIPEMD160 hash algorithm.
 10937  	     */
 10938  	    var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
 10939  	        _doReset: function () {
 10940  	            this._hash  = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
 10941  	        },
 10942  
 10943  	        _doProcessBlock: function (M, offset) {
 10944  
 10945  	            // Swap endian
 10946  	            for (var i = 0; i < 16; i++) {
 10947  	                // Shortcuts
 10948  	                var offset_i = offset + i;
 10949  	                var M_offset_i = M[offset_i];
 10950  
 10951  	                // Swap
 10952  	                M[offset_i] = (
 10953  	                    (((M_offset_i << 8)  | (M_offset_i >>> 24)) & 0x00ff00ff) |
 10954  	                    (((M_offset_i << 24) | (M_offset_i >>> 8))  & 0xff00ff00)
 10955  	                );
 10956  	            }
 10957  	            // Shortcut
 10958  	            var H  = this._hash.words;
 10959  	            var hl = _hl.words;
 10960  	            var hr = _hr.words;
 10961  	            var zl = _zl.words;
 10962  	            var zr = _zr.words;
 10963  	            var sl = _sl.words;
 10964  	            var sr = _sr.words;
 10965  
 10966  	            // Working variables
 10967  	            var al, bl, cl, dl, el;
 10968  	            var ar, br, cr, dr, er;
 10969  
 10970  	            ar = al = H[0];
 10971  	            br = bl = H[1];
 10972  	            cr = cl = H[2];
 10973  	            dr = dl = H[3];
 10974  	            er = el = H[4];
 10975  	            // Computation
 10976  	            var t;
 10977  	            for (var i = 0; i < 80; i += 1) {
 10978  	                t = (al +  M[offset+zl[i]])|0;
 10979  	                if (i<16){
 10980  		            t +=  f1(bl,cl,dl) + hl[0];
 10981  	                } else if (i<32) {
 10982  		            t +=  f2(bl,cl,dl) + hl[1];
 10983  	                } else if (i<48) {
 10984  		            t +=  f3(bl,cl,dl) + hl[2];
 10985  	                } else if (i<64) {
 10986  		            t +=  f4(bl,cl,dl) + hl[3];
 10987  	                } else {// if (i<80) {
 10988  		            t +=  f5(bl,cl,dl) + hl[4];
 10989  	                }
 10990  	                t = t|0;
 10991  	                t =  rotl(t,sl[i]);
 10992  	                t = (t+el)|0;
 10993  	                al = el;
 10994  	                el = dl;
 10995  	                dl = rotl(cl, 10);
 10996  	                cl = bl;
 10997  	                bl = t;
 10998  
 10999  	                t = (ar + M[offset+zr[i]])|0;
 11000  	                if (i<16){
 11001  		            t +=  f5(br,cr,dr) + hr[0];
 11002  	                } else if (i<32) {
 11003  		            t +=  f4(br,cr,dr) + hr[1];
 11004  	                } else if (i<48) {
 11005  		            t +=  f3(br,cr,dr) + hr[2];
 11006  	                } else if (i<64) {
 11007  		            t +=  f2(br,cr,dr) + hr[3];
 11008  	                } else {// if (i<80) {
 11009  		            t +=  f1(br,cr,dr) + hr[4];
 11010  	                }
 11011  	                t = t|0;
 11012  	                t =  rotl(t,sr[i]) ;
 11013  	                t = (t+er)|0;
 11014  	                ar = er;
 11015  	                er = dr;
 11016  	                dr = rotl(cr, 10);
 11017  	                cr = br;
 11018  	                br = t;
 11019  	            }
 11020  	            // Intermediate hash value
 11021  	            t    = (H[1] + cl + dr)|0;
 11022  	            H[1] = (H[2] + dl + er)|0;
 11023  	            H[2] = (H[3] + el + ar)|0;
 11024  	            H[3] = (H[4] + al + br)|0;
 11025  	            H[4] = (H[0] + bl + cr)|0;
 11026  	            H[0] =  t;
 11027  	        },
 11028  
 11029  	        _doFinalize: function () {
 11030  	            // Shortcuts
 11031  	            var data = this._data;
 11032  	            var dataWords = data.words;
 11033  
 11034  	            var nBitsTotal = this._nDataBytes * 8;
 11035  	            var nBitsLeft = data.sigBytes * 8;
 11036  
 11037  	            // Add padding
 11038  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11039  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
 11040  	                (((nBitsTotal << 8)  | (nBitsTotal >>> 24)) & 0x00ff00ff) |
 11041  	                (((nBitsTotal << 24) | (nBitsTotal >>> 8))  & 0xff00ff00)
 11042  	            );
 11043  	            data.sigBytes = (dataWords.length + 1) * 4;
 11044  
 11045  	            // Hash final blocks
 11046  	            this._process();
 11047  
 11048  	            // Shortcuts
 11049  	            var hash = this._hash;
 11050  	            var H = hash.words;
 11051  
 11052  	            // Swap endian
 11053  	            for (var i = 0; i < 5; i++) {
 11054  	                // Shortcut
 11055  	                var H_i = H[i];
 11056  
 11057  	                // Swap
 11058  	                H[i] = (((H_i << 8)  | (H_i >>> 24)) & 0x00ff00ff) |
 11059  	                       (((H_i << 24) | (H_i >>> 8))  & 0xff00ff00);
 11060  	            }
 11061  
 11062  	            // Return final computed hash
 11063  	            return hash;
 11064  	        },
 11065  
 11066  	        clone: function () {
 11067  	            var clone = Hasher.clone.call(this);
 11068  	            clone._hash = this._hash.clone();
 11069  
 11070  	            return clone;
 11071  	        }
 11072  	    });
 11073  
 11074  
 11075  	    function f1(x, y, z) {
 11076  	        return ((x) ^ (y) ^ (z));
 11077  
 11078  	    }
 11079  
 11080  	    function f2(x, y, z) {
 11081  	        return (((x)&(y)) | ((~x)&(z)));
 11082  	    }
 11083  
 11084  	    function f3(x, y, z) {
 11085  	        return (((x) | (~(y))) ^ (z));
 11086  	    }
 11087  
 11088  	    function f4(x, y, z) {
 11089  	        return (((x) & (z)) | ((y)&(~(z))));
 11090  	    }
 11091  
 11092  	    function f5(x, y, z) {
 11093  	        return ((x) ^ ((y) |(~(z))));
 11094  
 11095  	    }
 11096  
 11097  	    function rotl(x,n) {
 11098  	        return (x<<n) | (x>>>(32-n));
 11099  	    }
 11100  
 11101  
 11102  	    /**
 11103  	     * Shortcut function to the hasher's object interface.
 11104  	     *
 11105  	     * @param {WordArray|string} message The message to hash.
 11106  	     *
 11107  	     * @return {WordArray} The hash.
 11108  	     *
 11109  	     * @static
 11110  	     *
 11111  	     * @example
 11112  	     *
 11113  	     *     var hash = CryptoJS.RIPEMD160('message');
 11114  	     *     var hash = CryptoJS.RIPEMD160(wordArray);
 11115  	     */
 11116  	    C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
 11117  
 11118  	    /**
 11119  	     * Shortcut function to the HMAC's object interface.
 11120  	     *
 11121  	     * @param {WordArray|string} message The message to hash.
 11122  	     * @param {WordArray|string} key The secret key.
 11123  	     *
 11124  	     * @return {WordArray} The HMAC.
 11125  	     *
 11126  	     * @static
 11127  	     *
 11128  	     * @example
 11129  	     *
 11130  	     *     var hmac = CryptoJS.HmacRIPEMD160(message, key);
 11131  	     */
 11132  	    C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
 11133  	}(Math));
 11134  
 11135  
 11136  	return CryptoJS.RIPEMD160;
 11137  
 11138  }));
 11139  },{"./core":53}],77:[function(require,module,exports){
 11140  ;(function (root, factory) {
 11141  	if (typeof exports === "object") {
 11142  		// CommonJS
 11143  		module.exports = exports = factory(require("./core"));
 11144  	}
 11145  	else if (typeof define === "function" && define.amd) {
 11146  		// AMD
 11147  		define(["./core"], factory);
 11148  	}
 11149  	else {
 11150  		// Global (browser)
 11151  		factory(root.CryptoJS);
 11152  	}
 11153  }(this, function (CryptoJS) {
 11154  
 11155  	(function () {
 11156  	    // Shortcuts
 11157  	    var C = CryptoJS;
 11158  	    var C_lib = C.lib;
 11159  	    var WordArray = C_lib.WordArray;
 11160  	    var Hasher = C_lib.Hasher;
 11161  	    var C_algo = C.algo;
 11162  
 11163  	    // Reusable object
 11164  	    var W = [];
 11165  
 11166  	    /**
 11167  	     * SHA-1 hash algorithm.
 11168  	     */
 11169  	    var SHA1 = C_algo.SHA1 = Hasher.extend({
 11170  	        _doReset: function () {
 11171  	            this._hash = new WordArray.init([
 11172  	                0x67452301, 0xefcdab89,
 11173  	                0x98badcfe, 0x10325476,
 11174  	                0xc3d2e1f0
 11175  	            ]);
 11176  	        },
 11177  
 11178  	        _doProcessBlock: function (M, offset) {
 11179  	            // Shortcut
 11180  	            var H = this._hash.words;
 11181  
 11182  	            // Working variables
 11183  	            var a = H[0];
 11184  	            var b = H[1];
 11185  	            var c = H[2];
 11186  	            var d = H[3];
 11187  	            var e = H[4];
 11188  
 11189  	            // Computation
 11190  	            for (var i = 0; i < 80; i++) {
 11191  	                if (i < 16) {
 11192  	                    W[i] = M[offset + i] | 0;
 11193  	                } else {
 11194  	                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
 11195  	                    W[i] = (n << 1) | (n >>> 31);
 11196  	                }
 11197  
 11198  	                var t = ((a << 5) | (a >>> 27)) + e + W[i];
 11199  	                if (i < 20) {
 11200  	                    t += ((b & c) | (~b & d)) + 0x5a827999;
 11201  	                } else if (i < 40) {
 11202  	                    t += (b ^ c ^ d) + 0x6ed9eba1;
 11203  	                } else if (i < 60) {
 11204  	                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
 11205  	                } else /* if (i < 80) */ {
 11206  	                    t += (b ^ c ^ d) - 0x359d3e2a;
 11207  	                }
 11208  
 11209  	                e = d;
 11210  	                d = c;
 11211  	                c = (b << 30) | (b >>> 2);
 11212  	                b = a;
 11213  	                a = t;
 11214  	            }
 11215  
 11216  	            // Intermediate hash value
 11217  	            H[0] = (H[0] + a) | 0;
 11218  	            H[1] = (H[1] + b) | 0;
 11219  	            H[2] = (H[2] + c) | 0;
 11220  	            H[3] = (H[3] + d) | 0;
 11221  	            H[4] = (H[4] + e) | 0;
 11222  	        },
 11223  
 11224  	        _doFinalize: function () {
 11225  	            // Shortcuts
 11226  	            var data = this._data;
 11227  	            var dataWords = data.words;
 11228  
 11229  	            var nBitsTotal = this._nDataBytes * 8;
 11230  	            var nBitsLeft = data.sigBytes * 8;
 11231  
 11232  	            // Add padding
 11233  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11234  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11235  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11236  	            data.sigBytes = dataWords.length * 4;
 11237  
 11238  	            // Hash final blocks
 11239  	            this._process();
 11240  
 11241  	            // Return final computed hash
 11242  	            return this._hash;
 11243  	        },
 11244  
 11245  	        clone: function () {
 11246  	            var clone = Hasher.clone.call(this);
 11247  	            clone._hash = this._hash.clone();
 11248  
 11249  	            return clone;
 11250  	        }
 11251  	    });
 11252  
 11253  	    /**
 11254  	     * Shortcut function to the hasher's object interface.
 11255  	     *
 11256  	     * @param {WordArray|string} message The message to hash.
 11257  	     *
 11258  	     * @return {WordArray} The hash.
 11259  	     *
 11260  	     * @static
 11261  	     *
 11262  	     * @example
 11263  	     *
 11264  	     *     var hash = CryptoJS.SHA1('message');
 11265  	     *     var hash = CryptoJS.SHA1(wordArray);
 11266  	     */
 11267  	    C.SHA1 = Hasher._createHelper(SHA1);
 11268  
 11269  	    /**
 11270  	     * Shortcut function to the HMAC's object interface.
 11271  	     *
 11272  	     * @param {WordArray|string} message The message to hash.
 11273  	     * @param {WordArray|string} key The secret key.
 11274  	     *
 11275  	     * @return {WordArray} The HMAC.
 11276  	     *
 11277  	     * @static
 11278  	     *
 11279  	     * @example
 11280  	     *
 11281  	     *     var hmac = CryptoJS.HmacSHA1(message, key);
 11282  	     */
 11283  	    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
 11284  	}());
 11285  
 11286  
 11287  	return CryptoJS.SHA1;
 11288  
 11289  }));
 11290  },{"./core":53}],78:[function(require,module,exports){
 11291  ;(function (root, factory, undef) {
 11292  	if (typeof exports === "object") {
 11293  		// CommonJS
 11294  		module.exports = exports = factory(require("./core"), require("./sha256"));
 11295  	}
 11296  	else if (typeof define === "function" && define.amd) {
 11297  		// AMD
 11298  		define(["./core", "./sha256"], factory);
 11299  	}
 11300  	else {
 11301  		// Global (browser)
 11302  		factory(root.CryptoJS);
 11303  	}
 11304  }(this, function (CryptoJS) {
 11305  
 11306  	(function () {
 11307  	    // Shortcuts
 11308  	    var C = CryptoJS;
 11309  	    var C_lib = C.lib;
 11310  	    var WordArray = C_lib.WordArray;
 11311  	    var C_algo = C.algo;
 11312  	    var SHA256 = C_algo.SHA256;
 11313  
 11314  	    /**
 11315  	     * SHA-224 hash algorithm.
 11316  	     */
 11317  	    var SHA224 = C_algo.SHA224 = SHA256.extend({
 11318  	        _doReset: function () {
 11319  	            this._hash = new WordArray.init([
 11320  	                0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
 11321  	                0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
 11322  	            ]);
 11323  	        },
 11324  
 11325  	        _doFinalize: function () {
 11326  	            var hash = SHA256._doFinalize.call(this);
 11327  
 11328  	            hash.sigBytes -= 4;
 11329  
 11330  	            return hash;
 11331  	        }
 11332  	    });
 11333  
 11334  	    /**
 11335  	     * Shortcut function to the hasher's object interface.
 11336  	     *
 11337  	     * @param {WordArray|string} message The message to hash.
 11338  	     *
 11339  	     * @return {WordArray} The hash.
 11340  	     *
 11341  	     * @static
 11342  	     *
 11343  	     * @example
 11344  	     *
 11345  	     *     var hash = CryptoJS.SHA224('message');
 11346  	     *     var hash = CryptoJS.SHA224(wordArray);
 11347  	     */
 11348  	    C.SHA224 = SHA256._createHelper(SHA224);
 11349  
 11350  	    /**
 11351  	     * Shortcut function to the HMAC's object interface.
 11352  	     *
 11353  	     * @param {WordArray|string} message The message to hash.
 11354  	     * @param {WordArray|string} key The secret key.
 11355  	     *
 11356  	     * @return {WordArray} The HMAC.
 11357  	     *
 11358  	     * @static
 11359  	     *
 11360  	     * @example
 11361  	     *
 11362  	     *     var hmac = CryptoJS.HmacSHA224(message, key);
 11363  	     */
 11364  	    C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
 11365  	}());
 11366  
 11367  
 11368  	return CryptoJS.SHA224;
 11369  
 11370  }));
 11371  },{"./core":53,"./sha256":79}],79:[function(require,module,exports){
 11372  ;(function (root, factory) {
 11373  	if (typeof exports === "object") {
 11374  		// CommonJS
 11375  		module.exports = exports = factory(require("./core"));
 11376  	}
 11377  	else if (typeof define === "function" && define.amd) {
 11378  		// AMD
 11379  		define(["./core"], factory);
 11380  	}
 11381  	else {
 11382  		// Global (browser)
 11383  		factory(root.CryptoJS);
 11384  	}
 11385  }(this, function (CryptoJS) {
 11386  
 11387  	(function (Math) {
 11388  	    // Shortcuts
 11389  	    var C = CryptoJS;
 11390  	    var C_lib = C.lib;
 11391  	    var WordArray = C_lib.WordArray;
 11392  	    var Hasher = C_lib.Hasher;
 11393  	    var C_algo = C.algo;
 11394  
 11395  	    // Initialization and round constants tables
 11396  	    var H = [];
 11397  	    var K = [];
 11398  
 11399  	    // Compute constants
 11400  	    (function () {
 11401  	        function isPrime(n) {
 11402  	            var sqrtN = Math.sqrt(n);
 11403  	            for (var factor = 2; factor <= sqrtN; factor++) {
 11404  	                if (!(n % factor)) {
 11405  	                    return false;
 11406  	                }
 11407  	            }
 11408  
 11409  	            return true;
 11410  	        }
 11411  
 11412  	        function getFractionalBits(n) {
 11413  	            return ((n - (n | 0)) * 0x100000000) | 0;
 11414  	        }
 11415  
 11416  	        var n = 2;
 11417  	        var nPrime = 0;
 11418  	        while (nPrime < 64) {
 11419  	            if (isPrime(n)) {
 11420  	                if (nPrime < 8) {
 11421  	                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
 11422  	                }
 11423  	                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
 11424  
 11425  	                nPrime++;
 11426  	            }
 11427  
 11428  	            n++;
 11429  	        }
 11430  	    }());
 11431  
 11432  	    // Reusable object
 11433  	    var W = [];
 11434  
 11435  	    /**
 11436  	     * SHA-256 hash algorithm.
 11437  	     */
 11438  	    var SHA256 = C_algo.SHA256 = Hasher.extend({
 11439  	        _doReset: function () {
 11440  	            this._hash = new WordArray.init(H.slice(0));
 11441  	        },
 11442  
 11443  	        _doProcessBlock: function (M, offset) {
 11444  	            // Shortcut
 11445  	            var H = this._hash.words;
 11446  
 11447  	            // Working variables
 11448  	            var a = H[0];
 11449  	            var b = H[1];
 11450  	            var c = H[2];
 11451  	            var d = H[3];
 11452  	            var e = H[4];
 11453  	            var f = H[5];
 11454  	            var g = H[6];
 11455  	            var h = H[7];
 11456  
 11457  	            // Computation
 11458  	            for (var i = 0; i < 64; i++) {
 11459  	                if (i < 16) {
 11460  	                    W[i] = M[offset + i] | 0;
 11461  	                } else {
 11462  	                    var gamma0x = W[i - 15];
 11463  	                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^
 11464  	                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^
 11465  	                                   (gamma0x >>> 3);
 11466  
 11467  	                    var gamma1x = W[i - 2];
 11468  	                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^
 11469  	                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^
 11470  	                                   (gamma1x >>> 10);
 11471  
 11472  	                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
 11473  	                }
 11474  
 11475  	                var ch  = (e & f) ^ (~e & g);
 11476  	                var maj = (a & b) ^ (a & c) ^ (b & c);
 11477  
 11478  	                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
 11479  	                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));
 11480  
 11481  	                var t1 = h + sigma1 + ch + K[i] + W[i];
 11482  	                var t2 = sigma0 + maj;
 11483  
 11484  	                h = g;
 11485  	                g = f;
 11486  	                f = e;
 11487  	                e = (d + t1) | 0;
 11488  	                d = c;
 11489  	                c = b;
 11490  	                b = a;
 11491  	                a = (t1 + t2) | 0;
 11492  	            }
 11493  
 11494  	            // Intermediate hash value
 11495  	            H[0] = (H[0] + a) | 0;
 11496  	            H[1] = (H[1] + b) | 0;
 11497  	            H[2] = (H[2] + c) | 0;
 11498  	            H[3] = (H[3] + d) | 0;
 11499  	            H[4] = (H[4] + e) | 0;
 11500  	            H[5] = (H[5] + f) | 0;
 11501  	            H[6] = (H[6] + g) | 0;
 11502  	            H[7] = (H[7] + h) | 0;
 11503  	        },
 11504  
 11505  	        _doFinalize: function () {
 11506  	            // Shortcuts
 11507  	            var data = this._data;
 11508  	            var dataWords = data.words;
 11509  
 11510  	            var nBitsTotal = this._nDataBytes * 8;
 11511  	            var nBitsLeft = data.sigBytes * 8;
 11512  
 11513  	            // Add padding
 11514  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 11515  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
 11516  	            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
 11517  	            data.sigBytes = dataWords.length * 4;
 11518  
 11519  	            // Hash final blocks
 11520  	            this._process();
 11521  
 11522  	            // Return final computed hash
 11523  	            return this._hash;
 11524  	        },
 11525  
 11526  	        clone: function () {
 11527  	            var clone = Hasher.clone.call(this);
 11528  	            clone._hash = this._hash.clone();
 11529  
 11530  	            return clone;
 11531  	        }
 11532  	    });
 11533  
 11534  	    /**
 11535  	     * Shortcut function to the hasher's object interface.
 11536  	     *
 11537  	     * @param {WordArray|string} message The message to hash.
 11538  	     *
 11539  	     * @return {WordArray} The hash.
 11540  	     *
 11541  	     * @static
 11542  	     *
 11543  	     * @example
 11544  	     *
 11545  	     *     var hash = CryptoJS.SHA256('message');
 11546  	     *     var hash = CryptoJS.SHA256(wordArray);
 11547  	     */
 11548  	    C.SHA256 = Hasher._createHelper(SHA256);
 11549  
 11550  	    /**
 11551  	     * Shortcut function to the HMAC's object interface.
 11552  	     *
 11553  	     * @param {WordArray|string} message The message to hash.
 11554  	     * @param {WordArray|string} key The secret key.
 11555  	     *
 11556  	     * @return {WordArray} The HMAC.
 11557  	     *
 11558  	     * @static
 11559  	     *
 11560  	     * @example
 11561  	     *
 11562  	     *     var hmac = CryptoJS.HmacSHA256(message, key);
 11563  	     */
 11564  	    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
 11565  	}(Math));
 11566  
 11567  
 11568  	return CryptoJS.SHA256;
 11569  
 11570  }));
 11571  },{"./core":53}],80:[function(require,module,exports){
 11572  ;(function (root, factory, undef) {
 11573  	if (typeof exports === "object") {
 11574  		// CommonJS
 11575  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11576  	}
 11577  	else if (typeof define === "function" && define.amd) {
 11578  		// AMD
 11579  		define(["./core", "./x64-core"], factory);
 11580  	}
 11581  	else {
 11582  		// Global (browser)
 11583  		factory(root.CryptoJS);
 11584  	}
 11585  }(this, function (CryptoJS) {
 11586  
 11587  	(function (Math) {
 11588  	    // Shortcuts
 11589  	    var C = CryptoJS;
 11590  	    var C_lib = C.lib;
 11591  	    var WordArray = C_lib.WordArray;
 11592  	    var Hasher = C_lib.Hasher;
 11593  	    var C_x64 = C.x64;
 11594  	    var X64Word = C_x64.Word;
 11595  	    var C_algo = C.algo;
 11596  
 11597  	    // Constants tables
 11598  	    var RHO_OFFSETS = [];
 11599  	    var PI_INDEXES  = [];
 11600  	    var ROUND_CONSTANTS = [];
 11601  
 11602  	    // Compute Constants
 11603  	    (function () {
 11604  	        // Compute rho offset constants
 11605  	        var x = 1, y = 0;
 11606  	        for (var t = 0; t < 24; t++) {
 11607  	            RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
 11608  
 11609  	            var newX = y % 5;
 11610  	            var newY = (2 * x + 3 * y) % 5;
 11611  	            x = newX;
 11612  	            y = newY;
 11613  	        }
 11614  
 11615  	        // Compute pi index constants
 11616  	        for (var x = 0; x < 5; x++) {
 11617  	            for (var y = 0; y < 5; y++) {
 11618  	                PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
 11619  	            }
 11620  	        }
 11621  
 11622  	        // Compute round constants
 11623  	        var LFSR = 0x01;
 11624  	        for (var i = 0; i < 24; i++) {
 11625  	            var roundConstantMsw = 0;
 11626  	            var roundConstantLsw = 0;
 11627  
 11628  	            for (var j = 0; j < 7; j++) {
 11629  	                if (LFSR & 0x01) {
 11630  	                    var bitPosition = (1 << j) - 1;
 11631  	                    if (bitPosition < 32) {
 11632  	                        roundConstantLsw ^= 1 << bitPosition;
 11633  	                    } else /* if (bitPosition >= 32) */ {
 11634  	                        roundConstantMsw ^= 1 << (bitPosition - 32);
 11635  	                    }
 11636  	                }
 11637  
 11638  	                // Compute next LFSR
 11639  	                if (LFSR & 0x80) {
 11640  	                    // Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
 11641  	                    LFSR = (LFSR << 1) ^ 0x71;
 11642  	                } else {
 11643  	                    LFSR <<= 1;
 11644  	                }
 11645  	            }
 11646  
 11647  	            ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
 11648  	        }
 11649  	    }());
 11650  
 11651  	    // Reusable objects for temporary values
 11652  	    var T = [];
 11653  	    (function () {
 11654  	        for (var i = 0; i < 25; i++) {
 11655  	            T[i] = X64Word.create();
 11656  	        }
 11657  	    }());
 11658  
 11659  	    /**
 11660  	     * SHA-3 hash algorithm.
 11661  	     */
 11662  	    var SHA3 = C_algo.SHA3 = Hasher.extend({
 11663  	        /**
 11664  	         * Configuration options.
 11665  	         *
 11666  	         * @property {number} outputLength
 11667  	         *   The desired number of bits in the output hash.
 11668  	         *   Only values permitted are: 224, 256, 384, 512.
 11669  	         *   Default: 512
 11670  	         */
 11671  	        cfg: Hasher.cfg.extend({
 11672  	            outputLength: 512
 11673  	        }),
 11674  
 11675  	        _doReset: function () {
 11676  	            var state = this._state = []
 11677  	            for (var i = 0; i < 25; i++) {
 11678  	                state[i] = new X64Word.init();
 11679  	            }
 11680  
 11681  	            this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
 11682  	        },
 11683  
 11684  	        _doProcessBlock: function (M, offset) {
 11685  	            // Shortcuts
 11686  	            var state = this._state;
 11687  	            var nBlockSizeLanes = this.blockSize / 2;
 11688  
 11689  	            // Absorb
 11690  	            for (var i = 0; i < nBlockSizeLanes; i++) {
 11691  	                // Shortcuts
 11692  	                var M2i  = M[offset + 2 * i];
 11693  	                var M2i1 = M[offset + 2 * i + 1];
 11694  
 11695  	                // Swap endian
 11696  	                M2i = (
 11697  	                    (((M2i << 8)  | (M2i >>> 24)) & 0x00ff00ff) |
 11698  	                    (((M2i << 24) | (M2i >>> 8))  & 0xff00ff00)
 11699  	                );
 11700  	                M2i1 = (
 11701  	                    (((M2i1 << 8)  | (M2i1 >>> 24)) & 0x00ff00ff) |
 11702  	                    (((M2i1 << 24) | (M2i1 >>> 8))  & 0xff00ff00)
 11703  	                );
 11704  
 11705  	                // Absorb message into state
 11706  	                var lane = state[i];
 11707  	                lane.high ^= M2i1;
 11708  	                lane.low  ^= M2i;
 11709  	            }
 11710  
 11711  	            // Rounds
 11712  	            for (var round = 0; round < 24; round++) {
 11713  	                // Theta
 11714  	                for (var x = 0; x < 5; x++) {
 11715  	                    // Mix column lanes
 11716  	                    var tMsw = 0, tLsw = 0;
 11717  	                    for (var y = 0; y < 5; y++) {
 11718  	                        var lane = state[x + 5 * y];
 11719  	                        tMsw ^= lane.high;
 11720  	                        tLsw ^= lane.low;
 11721  	                    }
 11722  
 11723  	                    // Temporary values
 11724  	                    var Tx = T[x];
 11725  	                    Tx.high = tMsw;
 11726  	                    Tx.low  = tLsw;
 11727  	                }
 11728  	                for (var x = 0; x < 5; x++) {
 11729  	                    // Shortcuts
 11730  	                    var Tx4 = T[(x + 4) % 5];
 11731  	                    var Tx1 = T[(x + 1) % 5];
 11732  	                    var Tx1Msw = Tx1.high;
 11733  	                    var Tx1Lsw = Tx1.low;
 11734  
 11735  	                    // Mix surrounding columns
 11736  	                    var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
 11737  	                    var tLsw = Tx4.low  ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
 11738  	                    for (var y = 0; y < 5; y++) {
 11739  	                        var lane = state[x + 5 * y];
 11740  	                        lane.high ^= tMsw;
 11741  	                        lane.low  ^= tLsw;
 11742  	                    }
 11743  	                }
 11744  
 11745  	                // Rho Pi
 11746  	                for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
 11747  	                    // Shortcuts
 11748  	                    var lane = state[laneIndex];
 11749  	                    var laneMsw = lane.high;
 11750  	                    var laneLsw = lane.low;
 11751  	                    var rhoOffset = RHO_OFFSETS[laneIndex];
 11752  
 11753  	                    // Rotate lanes
 11754  	                    if (rhoOffset < 32) {
 11755  	                        var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
 11756  	                        var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
 11757  	                    } else /* if (rhoOffset >= 32) */ {
 11758  	                        var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
 11759  	                        var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
 11760  	                    }
 11761  
 11762  	                    // Transpose lanes
 11763  	                    var TPiLane = T[PI_INDEXES[laneIndex]];
 11764  	                    TPiLane.high = tMsw;
 11765  	                    TPiLane.low  = tLsw;
 11766  	                }
 11767  
 11768  	                // Rho pi at x = y = 0
 11769  	                var T0 = T[0];
 11770  	                var state0 = state[0];
 11771  	                T0.high = state0.high;
 11772  	                T0.low  = state0.low;
 11773  
 11774  	                // Chi
 11775  	                for (var x = 0; x < 5; x++) {
 11776  	                    for (var y = 0; y < 5; y++) {
 11777  	                        // Shortcuts
 11778  	                        var laneIndex = x + 5 * y;
 11779  	                        var lane = state[laneIndex];
 11780  	                        var TLane = T[laneIndex];
 11781  	                        var Tx1Lane = T[((x + 1) % 5) + 5 * y];
 11782  	                        var Tx2Lane = T[((x + 2) % 5) + 5 * y];
 11783  
 11784  	                        // Mix rows
 11785  	                        lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
 11786  	                        lane.low  = TLane.low  ^ (~Tx1Lane.low  & Tx2Lane.low);
 11787  	                    }
 11788  	                }
 11789  
 11790  	                // Iota
 11791  	                var lane = state[0];
 11792  	                var roundConstant = ROUND_CONSTANTS[round];
 11793  	                lane.high ^= roundConstant.high;
 11794  	                lane.low  ^= roundConstant.low;;
 11795  	            }
 11796  	        },
 11797  
 11798  	        _doFinalize: function () {
 11799  	            // Shortcuts
 11800  	            var data = this._data;
 11801  	            var dataWords = data.words;
 11802  	            var nBitsTotal = this._nDataBytes * 8;
 11803  	            var nBitsLeft = data.sigBytes * 8;
 11804  	            var blockSizeBits = this.blockSize * 32;
 11805  
 11806  	            // Add padding
 11807  	            dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
 11808  	            dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
 11809  	            data.sigBytes = dataWords.length * 4;
 11810  
 11811  	            // Hash final blocks
 11812  	            this._process();
 11813  
 11814  	            // Shortcuts
 11815  	            var state = this._state;
 11816  	            var outputLengthBytes = this.cfg.outputLength / 8;
 11817  	            var outputLengthLanes = outputLengthBytes / 8;
 11818  
 11819  	            // Squeeze
 11820  	            var hashWords = [];
 11821  	            for (var i = 0; i < outputLengthLanes; i++) {
 11822  	                // Shortcuts
 11823  	                var lane = state[i];
 11824  	                var laneMsw = lane.high;
 11825  	                var laneLsw = lane.low;
 11826  
 11827  	                // Swap endian
 11828  	                laneMsw = (
 11829  	                    (((laneMsw << 8)  | (laneMsw >>> 24)) & 0x00ff00ff) |
 11830  	                    (((laneMsw << 24) | (laneMsw >>> 8))  & 0xff00ff00)
 11831  	                );
 11832  	                laneLsw = (
 11833  	                    (((laneLsw << 8)  | (laneLsw >>> 24)) & 0x00ff00ff) |
 11834  	                    (((laneLsw << 24) | (laneLsw >>> 8))  & 0xff00ff00)
 11835  	                );
 11836  
 11837  	                // Squeeze state to retrieve hash
 11838  	                hashWords.push(laneLsw);
 11839  	                hashWords.push(laneMsw);
 11840  	            }
 11841  
 11842  	            // Return final computed hash
 11843  	            return new WordArray.init(hashWords, outputLengthBytes);
 11844  	        },
 11845  
 11846  	        clone: function () {
 11847  	            var clone = Hasher.clone.call(this);
 11848  
 11849  	            var state = clone._state = this._state.slice(0);
 11850  	            for (var i = 0; i < 25; i++) {
 11851  	                state[i] = state[i].clone();
 11852  	            }
 11853  
 11854  	            return clone;
 11855  	        }
 11856  	    });
 11857  
 11858  	    /**
 11859  	     * Shortcut function to the hasher's object interface.
 11860  	     *
 11861  	     * @param {WordArray|string} message The message to hash.
 11862  	     *
 11863  	     * @return {WordArray} The hash.
 11864  	     *
 11865  	     * @static
 11866  	     *
 11867  	     * @example
 11868  	     *
 11869  	     *     var hash = CryptoJS.SHA3('message');
 11870  	     *     var hash = CryptoJS.SHA3(wordArray);
 11871  	     */
 11872  	    C.SHA3 = Hasher._createHelper(SHA3);
 11873  
 11874  	    /**
 11875  	     * Shortcut function to the HMAC's object interface.
 11876  	     *
 11877  	     * @param {WordArray|string} message The message to hash.
 11878  	     * @param {WordArray|string} key The secret key.
 11879  	     *
 11880  	     * @return {WordArray} The HMAC.
 11881  	     *
 11882  	     * @static
 11883  	     *
 11884  	     * @example
 11885  	     *
 11886  	     *     var hmac = CryptoJS.HmacSHA3(message, key);
 11887  	     */
 11888  	    C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
 11889  	}(Math));
 11890  
 11891  
 11892  	return CryptoJS.SHA3;
 11893  
 11894  }));
 11895  },{"./core":53,"./x64-core":84}],81:[function(require,module,exports){
 11896  ;(function (root, factory, undef) {
 11897  	if (typeof exports === "object") {
 11898  		// CommonJS
 11899  		module.exports = exports = factory(require("./core"), require("./x64-core"), require("./sha512"));
 11900  	}
 11901  	else if (typeof define === "function" && define.amd) {
 11902  		// AMD
 11903  		define(["./core", "./x64-core", "./sha512"], factory);
 11904  	}
 11905  	else {
 11906  		// Global (browser)
 11907  		factory(root.CryptoJS);
 11908  	}
 11909  }(this, function (CryptoJS) {
 11910  
 11911  	(function () {
 11912  	    // Shortcuts
 11913  	    var C = CryptoJS;
 11914  	    var C_x64 = C.x64;
 11915  	    var X64Word = C_x64.Word;
 11916  	    var X64WordArray = C_x64.WordArray;
 11917  	    var C_algo = C.algo;
 11918  	    var SHA512 = C_algo.SHA512;
 11919  
 11920  	    /**
 11921  	     * SHA-384 hash algorithm.
 11922  	     */
 11923  	    var SHA384 = C_algo.SHA384 = SHA512.extend({
 11924  	        _doReset: function () {
 11925  	            this._hash = new X64WordArray.init([
 11926  	                new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
 11927  	                new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
 11928  	                new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
 11929  	                new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
 11930  	            ]);
 11931  	        },
 11932  
 11933  	        _doFinalize: function () {
 11934  	            var hash = SHA512._doFinalize.call(this);
 11935  
 11936  	            hash.sigBytes -= 16;
 11937  
 11938  	            return hash;
 11939  	        }
 11940  	    });
 11941  
 11942  	    /**
 11943  	     * Shortcut function to the hasher's object interface.
 11944  	     *
 11945  	     * @param {WordArray|string} message The message to hash.
 11946  	     *
 11947  	     * @return {WordArray} The hash.
 11948  	     *
 11949  	     * @static
 11950  	     *
 11951  	     * @example
 11952  	     *
 11953  	     *     var hash = CryptoJS.SHA384('message');
 11954  	     *     var hash = CryptoJS.SHA384(wordArray);
 11955  	     */
 11956  	    C.SHA384 = SHA512._createHelper(SHA384);
 11957  
 11958  	    /**
 11959  	     * Shortcut function to the HMAC's object interface.
 11960  	     *
 11961  	     * @param {WordArray|string} message The message to hash.
 11962  	     * @param {WordArray|string} key The secret key.
 11963  	     *
 11964  	     * @return {WordArray} The HMAC.
 11965  	     *
 11966  	     * @static
 11967  	     *
 11968  	     * @example
 11969  	     *
 11970  	     *     var hmac = CryptoJS.HmacSHA384(message, key);
 11971  	     */
 11972  	    C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
 11973  	}());
 11974  
 11975  
 11976  	return CryptoJS.SHA384;
 11977  
 11978  }));
 11979  },{"./core":53,"./sha512":82,"./x64-core":84}],82:[function(require,module,exports){
 11980  ;(function (root, factory, undef) {
 11981  	if (typeof exports === "object") {
 11982  		// CommonJS
 11983  		module.exports = exports = factory(require("./core"), require("./x64-core"));
 11984  	}
 11985  	else if (typeof define === "function" && define.amd) {
 11986  		// AMD
 11987  		define(["./core", "./x64-core"], factory);
 11988  	}
 11989  	else {
 11990  		// Global (browser)
 11991  		factory(root.CryptoJS);
 11992  	}
 11993  }(this, function (CryptoJS) {
 11994  
 11995  	(function () {
 11996  	    // Shortcuts
 11997  	    var C = CryptoJS;
 11998  	    var C_lib = C.lib;
 11999  	    var Hasher = C_lib.Hasher;
 12000  	    var C_x64 = C.x64;
 12001  	    var X64Word = C_x64.Word;
 12002  	    var X64WordArray = C_x64.WordArray;
 12003  	    var C_algo = C.algo;
 12004  
 12005  	    function X64Word_create() {
 12006  	        return X64Word.create.apply(X64Word, arguments);
 12007  	    }
 12008  
 12009  	    // Constants
 12010  	    var K = [
 12011  	        X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
 12012  	        X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
 12013  	        X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
 12014  	        X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
 12015  	        X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
 12016  	        X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
 12017  	        X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
 12018  	        X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
 12019  	        X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
 12020  	        X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
 12021  	        X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
 12022  	        X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
 12023  	        X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
 12024  	        X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
 12025  	        X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
 12026  	        X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
 12027  	        X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
 12028  	        X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
 12029  	        X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
 12030  	        X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
 12031  	        X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
 12032  	        X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
 12033  	        X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
 12034  	        X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
 12035  	        X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
 12036  	        X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
 12037  	        X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
 12038  	        X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
 12039  	        X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
 12040  	        X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
 12041  	        X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
 12042  	        X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
 12043  	        X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
 12044  	        X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
 12045  	        X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
 12046  	        X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
 12047  	        X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
 12048  	        X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
 12049  	        X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
 12050  	        X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
 12051  	    ];
 12052  
 12053  	    // Reusable objects
 12054  	    var W = [];
 12055  	    (function () {
 12056  	        for (var i = 0; i < 80; i++) {
 12057  	            W[i] = X64Word_create();
 12058  	        }
 12059  	    }());
 12060  
 12061  	    /**
 12062  	     * SHA-512 hash algorithm.
 12063  	     */
 12064  	    var SHA512 = C_algo.SHA512 = Hasher.extend({
 12065  	        _doReset: function () {
 12066  	            this._hash = new X64WordArray.init([
 12067  	                new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
 12068  	                new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
 12069  	                new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
 12070  	                new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
 12071  	            ]);
 12072  	        },
 12073  
 12074  	        _doProcessBlock: function (M, offset) {
 12075  	            // Shortcuts
 12076  	            var H = this._hash.words;
 12077  
 12078  	            var H0 = H[0];
 12079  	            var H1 = H[1];
 12080  	            var H2 = H[2];
 12081  	            var H3 = H[3];
 12082  	            var H4 = H[4];
 12083  	            var H5 = H[5];
 12084  	            var H6 = H[6];
 12085  	            var H7 = H[7];
 12086  
 12087  	            var H0h = H0.high;
 12088  	            var H0l = H0.low;
 12089  	            var H1h = H1.high;
 12090  	            var H1l = H1.low;
 12091  	            var H2h = H2.high;
 12092  	            var H2l = H2.low;
 12093  	            var H3h = H3.high;
 12094  	            var H3l = H3.low;
 12095  	            var H4h = H4.high;
 12096  	            var H4l = H4.low;
 12097  	            var H5h = H5.high;
 12098  	            var H5l = H5.low;
 12099  	            var H6h = H6.high;
 12100  	            var H6l = H6.low;
 12101  	            var H7h = H7.high;
 12102  	            var H7l = H7.low;
 12103  
 12104  	            // Working variables
 12105  	            var ah = H0h;
 12106  	            var al = H0l;
 12107  	            var bh = H1h;
 12108  	            var bl = H1l;
 12109  	            var ch = H2h;
 12110  	            var cl = H2l;
 12111  	            var dh = H3h;
 12112  	            var dl = H3l;
 12113  	            var eh = H4h;
 12114  	            var el = H4l;
 12115  	            var fh = H5h;
 12116  	            var fl = H5l;
 12117  	            var gh = H6h;
 12118  	            var gl = H6l;
 12119  	            var hh = H7h;
 12120  	            var hl = H7l;
 12121  
 12122  	            // Rounds
 12123  	            for (var i = 0; i < 80; i++) {
 12124  	                // Shortcut
 12125  	                var Wi = W[i];
 12126  
 12127  	                // Extend message
 12128  	                if (i < 16) {
 12129  	                    var Wih = Wi.high = M[offset + i * 2]     | 0;
 12130  	                    var Wil = Wi.low  = M[offset + i * 2 + 1] | 0;
 12131  	                } else {
 12132  	                    // Gamma0
 12133  	                    var gamma0x  = W[i - 15];
 12134  	                    var gamma0xh = gamma0x.high;
 12135  	                    var gamma0xl = gamma0x.low;
 12136  	                    var gamma0h  = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
 12137  	                    var gamma0l  = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
 12138  
 12139  	                    // Gamma1
 12140  	                    var gamma1x  = W[i - 2];
 12141  	                    var gamma1xh = gamma1x.high;
 12142  	                    var gamma1xl = gamma1x.low;
 12143  	                    var gamma1h  = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
 12144  	                    var gamma1l  = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
 12145  
 12146  	                    // W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
 12147  	                    var Wi7  = W[i - 7];
 12148  	                    var Wi7h = Wi7.high;
 12149  	                    var Wi7l = Wi7.low;
 12150  
 12151  	                    var Wi16  = W[i - 16];
 12152  	                    var Wi16h = Wi16.high;
 12153  	                    var Wi16l = Wi16.low;
 12154  
 12155  	                    var Wil = gamma0l + Wi7l;
 12156  	                    var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
 12157  	                    var Wil = Wil + gamma1l;
 12158  	                    var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
 12159  	                    var Wil = Wil + Wi16l;
 12160  	                    var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
 12161  
 12162  	                    Wi.high = Wih;
 12163  	                    Wi.low  = Wil;
 12164  	                }
 12165  
 12166  	                var chh  = (eh & fh) ^ (~eh & gh);
 12167  	                var chl  = (el & fl) ^ (~el & gl);
 12168  	                var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
 12169  	                var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
 12170  
 12171  	                var sigma0h = ((ah >>> 28) | (al << 4))  ^ ((ah << 30)  | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
 12172  	                var sigma0l = ((al >>> 28) | (ah << 4))  ^ ((al << 30)  | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
 12173  	                var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
 12174  	                var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
 12175  
 12176  	                // t1 = h + sigma1 + ch + K[i] + W[i]
 12177  	                var Ki  = K[i];
 12178  	                var Kih = Ki.high;
 12179  	                var Kil = Ki.low;
 12180  
 12181  	                var t1l = hl + sigma1l;
 12182  	                var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
 12183  	                var t1l = t1l + chl;
 12184  	                var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
 12185  	                var t1l = t1l + Kil;
 12186  	                var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
 12187  	                var t1l = t1l + Wil;
 12188  	                var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
 12189  
 12190  	                // t2 = sigma0 + maj
 12191  	                var t2l = sigma0l + majl;
 12192  	                var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
 12193  
 12194  	                // Update working variables
 12195  	                hh = gh;
 12196  	                hl = gl;
 12197  	                gh = fh;
 12198  	                gl = fl;
 12199  	                fh = eh;
 12200  	                fl = el;
 12201  	                el = (dl + t1l) | 0;
 12202  	                eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
 12203  	                dh = ch;
 12204  	                dl = cl;
 12205  	                ch = bh;
 12206  	                cl = bl;
 12207  	                bh = ah;
 12208  	                bl = al;
 12209  	                al = (t1l + t2l) | 0;
 12210  	                ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
 12211  	            }
 12212  
 12213  	            // Intermediate hash value
 12214  	            H0l = H0.low  = (H0l + al);
 12215  	            H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
 12216  	            H1l = H1.low  = (H1l + bl);
 12217  	            H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
 12218  	            H2l = H2.low  = (H2l + cl);
 12219  	            H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
 12220  	            H3l = H3.low  = (H3l + dl);
 12221  	            H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
 12222  	            H4l = H4.low  = (H4l + el);
 12223  	            H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
 12224  	            H5l = H5.low  = (H5l + fl);
 12225  	            H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
 12226  	            H6l = H6.low  = (H6l + gl);
 12227  	            H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
 12228  	            H7l = H7.low  = (H7l + hl);
 12229  	            H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
 12230  	        },
 12231  
 12232  	        _doFinalize: function () {
 12233  	            // Shortcuts
 12234  	            var data = this._data;
 12235  	            var dataWords = data.words;
 12236  
 12237  	            var nBitsTotal = this._nDataBytes * 8;
 12238  	            var nBitsLeft = data.sigBytes * 8;
 12239  
 12240  	            // Add padding
 12241  	            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
 12242  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
 12243  	            dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
 12244  	            data.sigBytes = dataWords.length * 4;
 12245  
 12246  	            // Hash final blocks
 12247  	            this._process();
 12248  
 12249  	            // Convert hash to 32-bit word array before returning
 12250  	            var hash = this._hash.toX32();
 12251  
 12252  	            // Return final computed hash
 12253  	            return hash;
 12254  	        },
 12255  
 12256  	        clone: function () {
 12257  	            var clone = Hasher.clone.call(this);
 12258  	            clone._hash = this._hash.clone();
 12259  
 12260  	            return clone;
 12261  	        },
 12262  
 12263  	        blockSize: 1024/32
 12264  	    });
 12265  
 12266  	    /**
 12267  	     * Shortcut function to the hasher's object interface.
 12268  	     *
 12269  	     * @param {WordArray|string} message The message to hash.
 12270  	     *
 12271  	     * @return {WordArray} The hash.
 12272  	     *
 12273  	     * @static
 12274  	     *
 12275  	     * @example
 12276  	     *
 12277  	     *     var hash = CryptoJS.SHA512('message');
 12278  	     *     var hash = CryptoJS.SHA512(wordArray);
 12279  	     */
 12280  	    C.SHA512 = Hasher._createHelper(SHA512);
 12281  
 12282  	    /**
 12283  	     * Shortcut function to the HMAC's object interface.
 12284  	     *
 12285  	     * @param {WordArray|string} message The message to hash.
 12286  	     * @param {WordArray|string} key The secret key.
 12287  	     *
 12288  	     * @return {WordArray} The HMAC.
 12289  	     *
 12290  	     * @static
 12291  	     *
 12292  	     * @example
 12293  	     *
 12294  	     *     var hmac = CryptoJS.HmacSHA512(message, key);
 12295  	     */
 12296  	    C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
 12297  	}());
 12298  
 12299  
 12300  	return CryptoJS.SHA512;
 12301  
 12302  }));
 12303  },{"./core":53,"./x64-core":84}],83:[function(require,module,exports){
 12304  ;(function (root, factory, undef) {
 12305  	if (typeof exports === "object") {
 12306  		// CommonJS
 12307  		module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
 12308  	}
 12309  	else if (typeof define === "function" && define.amd) {
 12310  		// AMD
 12311  		define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
 12312  	}
 12313  	else {
 12314  		// Global (browser)
 12315  		factory(root.CryptoJS);
 12316  	}
 12317  }(this, function (CryptoJS) {
 12318  
 12319  	(function () {
 12320  	    // Shortcuts
 12321  	    var C = CryptoJS;
 12322  	    var C_lib = C.lib;
 12323  	    var WordArray = C_lib.WordArray;
 12324  	    var BlockCipher = C_lib.BlockCipher;
 12325  	    var C_algo = C.algo;
 12326  
 12327  	    // Permuted Choice 1 constants
 12328  	    var PC1 = [
 12329  	        57, 49, 41, 33, 25, 17, 9,  1,
 12330  	        58, 50, 42, 34, 26, 18, 10, 2,
 12331  	        59, 51, 43, 35, 27, 19, 11, 3,
 12332  	        60, 52, 44, 36, 63, 55, 47, 39,
 12333  	        31, 23, 15, 7,  62, 54, 46, 38,
 12334  	        30, 22, 14, 6,  61, 53, 45, 37,
 12335  	        29, 21, 13, 5,  28, 20, 12, 4
 12336  	    ];
 12337  
 12338  	    // Permuted Choice 2 constants
 12339  	    var PC2 = [
 12340  	        14, 17, 11, 24, 1,  5,
 12341  	        3,  28, 15, 6,  21, 10,
 12342  	        23, 19, 12, 4,  26, 8,
 12343  	        16, 7,  27, 20, 13, 2,
 12344  	        41, 52, 31, 37, 47, 55,
 12345  	        30, 40, 51, 45, 33, 48,
 12346  	        44, 49, 39, 56, 34, 53,
 12347  	        46, 42, 50, 36, 29, 32
 12348  	    ];
 12349  
 12350  	    // Cumulative bit shift constants
 12351  	    var BIT_SHIFTS = [1,  2,  4,  6,  8,  10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
 12352  
 12353  	    // SBOXes and round permutation constants
 12354  	    var SBOX_P = [
 12355  	        {
 12356  	            0x0: 0x808200,
 12357  	            0x10000000: 0x8000,
 12358  	            0x20000000: 0x808002,
 12359  	            0x30000000: 0x2,
 12360  	            0x40000000: 0x200,
 12361  	            0x50000000: 0x808202,
 12362  	            0x60000000: 0x800202,
 12363  	            0x70000000: 0x800000,
 12364  	            0x80000000: 0x202,
 12365  	            0x90000000: 0x800200,
 12366  	            0xa0000000: 0x8200,
 12367  	            0xb0000000: 0x808000,
 12368  	            0xc0000000: 0x8002,
 12369  	            0xd0000000: 0x800002,
 12370  	            0xe0000000: 0x0,
 12371  	            0xf0000000: 0x8202,
 12372  	            0x8000000: 0x0,
 12373  	            0x18000000: 0x808202,
 12374  	            0x28000000: 0x8202,
 12375  	            0x38000000: 0x8000,
 12376  	            0x48000000: 0x808200,
 12377  	            0x58000000: 0x200,
 12378  	            0x68000000: 0x808002,
 12379  	            0x78000000: 0x2,
 12380  	            0x88000000: 0x800200,
 12381  	            0x98000000: 0x8200,
 12382  	            0xa8000000: 0x808000,
 12383  	            0xb8000000: 0x800202,
 12384  	            0xc8000000: 0x800002,
 12385  	            0xd8000000: 0x8002,
 12386  	            0xe8000000: 0x202,
 12387  	            0xf8000000: 0x800000,
 12388  	            0x1: 0x8000,
 12389  	            0x10000001: 0x2,
 12390  	            0x20000001: 0x808200,
 12391  	            0x30000001: 0x800000,
 12392  	            0x40000001: 0x808002,
 12393  	            0x50000001: 0x8200,
 12394  	            0x60000001: 0x200,
 12395  	            0x70000001: 0x800202,
 12396  	            0x80000001: 0x808202,
 12397  	            0x90000001: 0x808000,
 12398  	            0xa0000001: 0x800002,
 12399  	            0xb0000001: 0x8202,
 12400  	            0xc0000001: 0x202,
 12401  	            0xd0000001: 0x800200,
 12402  	            0xe0000001: 0x8002,
 12403  	            0xf0000001: 0x0,
 12404  	            0x8000001: 0x808202,
 12405  	            0x18000001: 0x808000,
 12406  	            0x28000001: 0x800000,
 12407  	            0x38000001: 0x200,
 12408  	            0x48000001: 0x8000,
 12409  	            0x58000001: 0x800002,
 12410  	            0x68000001: 0x2,
 12411  	            0x78000001: 0x8202,
 12412  	            0x88000001: 0x8002,
 12413  	            0x98000001: 0x800202,
 12414  	            0xa8000001: 0x202,
 12415  	            0xb8000001: 0x808200,
 12416  	            0xc8000001: 0x800200,
 12417  	            0xd8000001: 0x0,
 12418  	            0xe8000001: 0x8200,
 12419  	            0xf8000001: 0x808002
 12420  	        },
 12421  	        {
 12422  	            0x0: 0x40084010,
 12423  	            0x1000000: 0x4000,
 12424  	            0x2000000: 0x80000,
 12425  	            0x3000000: 0x40080010,
 12426  	            0x4000000: 0x40000010,
 12427  	            0x5000000: 0x40084000,
 12428  	            0x6000000: 0x40004000,
 12429  	            0x7000000: 0x10,
 12430  	            0x8000000: 0x84000,
 12431  	            0x9000000: 0x40004010,
 12432  	            0xa000000: 0x40000000,
 12433  	            0xb000000: 0x84010,
 12434  	            0xc000000: 0x80010,
 12435  	            0xd000000: 0x0,
 12436  	            0xe000000: 0x4010,
 12437  	            0xf000000: 0x40080000,
 12438  	            0x800000: 0x40004000,
 12439  	            0x1800000: 0x84010,
 12440  	            0x2800000: 0x10,
 12441  	            0x3800000: 0x40004010,
 12442  	            0x4800000: 0x40084010,
 12443  	            0x5800000: 0x40000000,
 12444  	            0x6800000: 0x80000,
 12445  	            0x7800000: 0x40080010,
 12446  	            0x8800000: 0x80010,
 12447  	            0x9800000: 0x0,
 12448  	            0xa800000: 0x4000,
 12449  	            0xb800000: 0x40080000,
 12450  	            0xc800000: 0x40000010,
 12451  	            0xd800000: 0x84000,
 12452  	            0xe800000: 0x40084000,
 12453  	            0xf800000: 0x4010,
 12454  	            0x10000000: 0x0,
 12455  	            0x11000000: 0x40080010,
 12456  	            0x12000000: 0x40004010,
 12457  	            0x13000000: 0x40084000,
 12458  	            0x14000000: 0x40080000,
 12459  	            0x15000000: 0x10,
 12460  	            0x16000000: 0x84010,
 12461  	            0x17000000: 0x4000,
 12462  	            0x18000000: 0x4010,
 12463  	            0x19000000: 0x80000,
 12464  	            0x1a000000: 0x80010,
 12465  	            0x1b000000: 0x40000010,
 12466  	            0x1c000000: 0x84000,
 12467  	            0x1d000000: 0x40004000,
 12468  	            0x1e000000: 0x40000000,
 12469  	            0x1f000000: 0x40084010,
 12470  	            0x10800000: 0x84010,
 12471  	            0x11800000: 0x80000,
 12472  	            0x12800000: 0x40080000,
 12473  	            0x13800000: 0x4000,
 12474  	            0x14800000: 0x40004000,
 12475  	            0x15800000: 0x40084010,
 12476  	            0x16800000: 0x10,
 12477  	            0x17800000: 0x40000000,
 12478  	            0x18800000: 0x40084000,
 12479  	            0x19800000: 0x40000010,
 12480  	            0x1a800000: 0x40004010,
 12481  	            0x1b800000: 0x80010,
 12482  	            0x1c800000: 0x0,
 12483  	            0x1d800000: 0x4010,
 12484  	            0x1e800000: 0x40080010,
 12485  	            0x1f800000: 0x84000
 12486  	        },
 12487  	        {
 12488  	            0x0: 0x104,
 12489  	            0x100000: 0x0,
 12490  	            0x200000: 0x4000100,
 12491  	            0x300000: 0x10104,
 12492  	            0x400000: 0x10004,
 12493  	            0x500000: 0x4000004,
 12494  	            0x600000: 0x4010104,
 12495  	            0x700000: 0x4010000,
 12496  	            0x800000: 0x4000000,
 12497  	            0x900000: 0x4010100,
 12498  	            0xa00000: 0x10100,
 12499  	            0xb00000: 0x4010004,
 12500  	            0xc00000: 0x4000104,
 12501  	            0xd00000: 0x10000,
 12502  	            0xe00000: 0x4,
 12503  	            0xf00000: 0x100,
 12504  	            0x80000: 0x4010100,
 12505  	            0x180000: 0x4010004,
 12506  	            0x280000: 0x0,
 12507  	            0x380000: 0x4000100,
 12508  	            0x480000: 0x4000004,
 12509  	            0x580000: 0x10000,
 12510  	            0x680000: 0x10004,
 12511  	            0x780000: 0x104,
 12512  	            0x880000: 0x4,
 12513  	            0x980000: 0x100,
 12514  	            0xa80000: 0x4010000,
 12515  	            0xb80000: 0x10104,
 12516  	            0xc80000: 0x10100,
 12517  	            0xd80000: 0x4000104,
 12518  	            0xe80000: 0x4010104,
 12519  	            0xf80000: 0x4000000,
 12520  	            0x1000000: 0x4010100,
 12521  	            0x1100000: 0x10004,
 12522  	            0x1200000: 0x10000,
 12523  	            0x1300000: 0x4000100,
 12524  	            0x1400000: 0x100,
 12525  	            0x1500000: 0x4010104,
 12526  	            0x1600000: 0x4000004,
 12527  	            0x1700000: 0x0,
 12528  	            0x1800000: 0x4000104,
 12529  	            0x1900000: 0x4000000,
 12530  	            0x1a00000: 0x4,
 12531  	            0x1b00000: 0x10100,
 12532  	            0x1c00000: 0x4010000,
 12533  	            0x1d00000: 0x104,
 12534  	            0x1e00000: 0x10104,
 12535  	            0x1f00000: 0x4010004,
 12536  	            0x1080000: 0x4000000,
 12537  	            0x1180000: 0x104,
 12538  	            0x1280000: 0x4010100,
 12539  	            0x1380000: 0x0,
 12540  	            0x1480000: 0x10004,
 12541  	            0x1580000: 0x4000100,
 12542  	            0x1680000: 0x100,
 12543  	            0x1780000: 0x4010004,
 12544  	            0x1880000: 0x10000,
 12545  	            0x1980000: 0x4010104,
 12546  	            0x1a80000: 0x10104,
 12547  	            0x1b80000: 0x4000004,
 12548  	            0x1c80000: 0x4000104,
 12549  	            0x1d80000: 0x4010000,
 12550  	            0x1e80000: 0x4,
 12551  	            0x1f80000: 0x10100
 12552  	        },
 12553  	        {
 12554  	            0x0: 0x80401000,
 12555  	            0x10000: 0x80001040,
 12556  	            0x20000: 0x401040,
 12557  	            0x30000: 0x80400000,
 12558  	            0x40000: 0x0,
 12559  	            0x50000: 0x401000,
 12560  	            0x60000: 0x80000040,
 12561  	            0x70000: 0x400040,
 12562  	            0x80000: 0x80000000,
 12563  	            0x90000: 0x400000,
 12564  	            0xa0000: 0x40,
 12565  	            0xb0000: 0x80001000,
 12566  	            0xc0000: 0x80400040,
 12567  	            0xd0000: 0x1040,
 12568  	            0xe0000: 0x1000,
 12569  	            0xf0000: 0x80401040,
 12570  	            0x8000: 0x80001040,
 12571  	            0x18000: 0x40,
 12572  	            0x28000: 0x80400040,
 12573  	            0x38000: 0x80001000,
 12574  	            0x48000: 0x401000,
 12575  	            0x58000: 0x80401040,
 12576  	            0x68000: 0x0,
 12577  	            0x78000: 0x80400000,
 12578  	            0x88000: 0x1000,
 12579  	            0x98000: 0x80401000,
 12580  	            0xa8000: 0x400000,
 12581  	            0xb8000: 0x1040,
 12582  	            0xc8000: 0x80000000,
 12583  	            0xd8000: 0x400040,
 12584  	            0xe8000: 0x401040,
 12585  	            0xf8000: 0x80000040,
 12586  	            0x100000: 0x400040,
 12587  	            0x110000: 0x401000,
 12588  	            0x120000: 0x80000040,
 12589  	            0x130000: 0x0,
 12590  	            0x140000: 0x1040,
 12591  	            0x150000: 0x80400040,
 12592  	            0x160000: 0x80401000,
 12593  	            0x170000: 0x80001040,
 12594  	            0x180000: 0x80401040,
 12595  	            0x190000: 0x80000000,
 12596  	            0x1a0000: 0x80400000,
 12597  	            0x1b0000: 0x401040,
 12598  	            0x1c0000: 0x80001000,
 12599  	            0x1d0000: 0x400000,
 12600  	            0x1e0000: 0x40,
 12601  	            0x1f0000: 0x1000,
 12602  	            0x108000: 0x80400000,
 12603  	            0x118000: 0x80401040,
 12604  	            0x128000: 0x0,
 12605  	            0x138000: 0x401000,
 12606  	            0x148000: 0x400040,
 12607  	            0x158000: 0x80000000,
 12608  	            0x168000: 0x80001040,
 12609  	            0x178000: 0x40,
 12610  	            0x188000: 0x80000040,
 12611  	            0x198000: 0x1000,
 12612  	            0x1a8000: 0x80001000,
 12613  	            0x1b8000: 0x80400040,
 12614  	            0x1c8000: 0x1040,
 12615  	            0x1d8000: 0x80401000,
 12616  	            0x1e8000: 0x400000,
 12617  	            0x1f8000: 0x401040
 12618  	        },
 12619  	        {
 12620  	            0x0: 0x80,
 12621  	            0x1000: 0x1040000,
 12622  	            0x2000: 0x40000,
 12623  	            0x3000: 0x20000000,
 12624  	            0x4000: 0x20040080,
 12625  	            0x5000: 0x1000080,
 12626  	            0x6000: 0x21000080,
 12627  	            0x7000: 0x40080,
 12628  	            0x8000: 0x1000000,
 12629  	            0x9000: 0x20040000,
 12630  	            0xa000: 0x20000080,
 12631  	            0xb000: 0x21040080,
 12632  	            0xc000: 0x21040000,
 12633  	            0xd000: 0x0,
 12634  	            0xe000: 0x1040080,
 12635  	            0xf000: 0x21000000,
 12636  	            0x800: 0x1040080,
 12637  	            0x1800: 0x21000080,
 12638  	            0x2800: 0x80,
 12639  	            0x3800: 0x1040000,
 12640  	            0x4800: 0x40000,
 12641  	            0x5800: 0x20040080,
 12642  	            0x6800: 0x21040000,
 12643  	            0x7800: 0x20000000,
 12644  	            0x8800: 0x20040000,
 12645  	            0x9800: 0x0,
 12646  	            0xa800: 0x21040080,
 12647  	            0xb800: 0x1000080,
 12648  	            0xc800: 0x20000080,
 12649  	            0xd800: 0x21000000,
 12650  	            0xe800: 0x1000000,
 12651  	            0xf800: 0x40080,
 12652  	            0x10000: 0x40000,
 12653  	            0x11000: 0x80,
 12654  	            0x12000: 0x20000000,
 12655  	            0x13000: 0x21000080,
 12656  	            0x14000: 0x1000080,
 12657  	            0x15000: 0x21040000,
 12658  	            0x16000: 0x20040080,
 12659  	            0x17000: 0x1000000,
 12660  	            0x18000: 0x21040080,
 12661  	            0x19000: 0x21000000,
 12662  	            0x1a000: 0x1040000,
 12663  	            0x1b000: 0x20040000,
 12664  	            0x1c000: 0x40080,
 12665  	            0x1d000: 0x20000080,
 12666  	            0x1e000: 0x0,
 12667  	            0x1f000: 0x1040080,
 12668  	            0x10800: 0x21000080,
 12669  	            0x11800: 0x1000000,
 12670  	            0x12800: 0x1040000,
 12671  	            0x13800: 0x20040080,
 12672  	            0x14800: 0x20000000,
 12673  	            0x15800: 0x1040080,
 12674  	            0x16800: 0x80,
 12675  	            0x17800: 0x21040000,
 12676  	            0x18800: 0x40080,
 12677  	            0x19800: 0x21040080,
 12678  	            0x1a800: 0x0,
 12679  	            0x1b800: 0x21000000,
 12680  	            0x1c800: 0x1000080,
 12681  	            0x1d800: 0x40000,
 12682  	            0x1e800: 0x20040000,
 12683  	            0x1f800: 0x20000080
 12684  	        },
 12685  	        {
 12686  	            0x0: 0x10000008,
 12687  	            0x100: 0x2000,
 12688  	            0x200: 0x10200000,
 12689  	            0x300: 0x10202008,
 12690  	            0x400: 0x10002000,
 12691  	            0x500: 0x200000,
 12692  	            0x600: 0x200008,
 12693  	            0x700: 0x10000000,
 12694  	            0x800: 0x0,
 12695  	            0x900: 0x10002008,
 12696  	            0xa00: 0x202000,
 12697  	            0xb00: 0x8,
 12698  	            0xc00: 0x10200008,
 12699  	            0xd00: 0x202008,
 12700  	            0xe00: 0x2008,
 12701  	            0xf00: 0x10202000,
 12702  	            0x80: 0x10200000,
 12703  	            0x180: 0x10202008,
 12704  	            0x280: 0x8,
 12705  	            0x380: 0x200000,
 12706  	            0x480: 0x202008,
 12707  	            0x580: 0x10000008,
 12708  	            0x680: 0x10002000,
 12709  	            0x780: 0x2008,
 12710  	            0x880: 0x200008,
 12711  	            0x980: 0x2000,
 12712  	            0xa80: 0x10002008,
 12713  	            0xb80: 0x10200008,
 12714  	            0xc80: 0x0,
 12715  	            0xd80: 0x10202000,
 12716  	            0xe80: 0x202000,
 12717  	            0xf80: 0x10000000,
 12718  	            0x1000: 0x10002000,
 12719  	            0x1100: 0x10200008,
 12720  	            0x1200: 0x10202008,
 12721  	            0x1300: 0x2008,
 12722  	            0x1400: 0x200000,
 12723  	            0x1500: 0x10000000,
 12724  	            0x1600: 0x10000008,
 12725  	            0x1700: 0x202000,
 12726  	            0x1800: 0x202008,
 12727  	            0x1900: 0x0,
 12728  	            0x1a00: 0x8,
 12729  	            0x1b00: 0x10200000,
 12730  	            0x1c00: 0x2000,
 12731  	            0x1d00: 0x10002008,
 12732  	            0x1e00: 0x10202000,
 12733  	            0x1f00: 0x200008,
 12734  	            0x1080: 0x8,
 12735  	            0x1180: 0x202000,
 12736  	            0x1280: 0x200000,
 12737  	            0x1380: 0x10000008,
 12738  	            0x1480: 0x10002000,
 12739  	            0x1580: 0x2008,
 12740  	            0x1680: 0x10202008,
 12741  	            0x1780: 0x10200000,
 12742  	            0x1880: 0x10202000,
 12743  	            0x1980: 0x10200008,
 12744  	            0x1a80: 0x2000,
 12745  	            0x1b80: 0x202008,
 12746  	            0x1c80: 0x200008,
 12747  	            0x1d80: 0x0,
 12748  	            0x1e80: 0x10000000,
 12749  	            0x1f80: 0x10002008
 12750  	        },
 12751  	        {
 12752  	            0x0: 0x100000,
 12753  	            0x10: 0x2000401,
 12754  	            0x20: 0x400,
 12755  	            0x30: 0x100401,
 12756  	            0x40: 0x2100401,
 12757  	            0x50: 0x0,
 12758  	            0x60: 0x1,
 12759  	            0x70: 0x2100001,
 12760  	            0x80: 0x2000400,
 12761  	            0x90: 0x100001,
 12762  	            0xa0: 0x2000001,
 12763  	            0xb0: 0x2100400,
 12764  	            0xc0: 0x2100000,
 12765  	            0xd0: 0x401,
 12766  	            0xe0: 0x100400,
 12767  	            0xf0: 0x2000000,
 12768  	            0x8: 0x2100001,
 12769  	            0x18: 0x0,
 12770  	            0x28: 0x2000401,
 12771  	            0x38: 0x2100400,
 12772  	            0x48: 0x100000,
 12773  	            0x58: 0x2000001,
 12774  	            0x68: 0x2000000,
 12775  	            0x78: 0x401,
 12776  	            0x88: 0x100401,
 12777  	            0x98: 0x2000400,
 12778  	            0xa8: 0x2100000,
 12779  	            0xb8: 0x100001,
 12780  	            0xc8: 0x400,
 12781  	            0xd8: 0x2100401,
 12782  	            0xe8: 0x1,
 12783  	            0xf8: 0x100400,
 12784  	            0x100: 0x2000000,
 12785  	            0x110: 0x100000,
 12786  	            0x120: 0x2000401,
 12787  	            0x130: 0x2100001,
 12788  	            0x140: 0x100001,
 12789  	            0x150: 0x2000400,
 12790  	            0x160: 0x2100400,
 12791  	            0x170: 0x100401,
 12792  	            0x180: 0x401,
 12793  	            0x190: 0x2100401,
 12794  	            0x1a0: 0x100400,
 12795  	            0x1b0: 0x1,
 12796  	            0x1c0: 0x0,
 12797  	            0x1d0: 0x2100000,
 12798  	            0x1e0: 0x2000001,
 12799  	            0x1f0: 0x400,
 12800  	            0x108: 0x100400,
 12801  	            0x118: 0x2000401,
 12802  	            0x128: 0x2100001,
 12803  	            0x138: 0x1,
 12804  	            0x148: 0x2000000,
 12805  	            0x158: 0x100000,
 12806  	            0x168: 0x401,
 12807  	            0x178: 0x2100400,
 12808  	            0x188: 0x2000001,
 12809  	            0x198: 0x2100000,
 12810  	            0x1a8: 0x0,
 12811  	            0x1b8: 0x2100401,
 12812  	            0x1c8: 0x100401,
 12813  	            0x1d8: 0x400,
 12814  	            0x1e8: 0x2000400,
 12815  	            0x1f8: 0x100001
 12816  	        },
 12817  	        {
 12818  	            0x0: 0x8000820,
 12819  	            0x1: 0x20000,
 12820  	            0x2: 0x8000000,
 12821  	            0x3: 0x20,
 12822  	            0x4: 0x20020,
 12823  	            0x5: 0x8020820,
 12824  	            0x6: 0x8020800,
 12825  	            0x7: 0x800,
 12826  	            0x8: 0x8020000,
 12827  	            0x9: 0x8000800,
 12828  	            0xa: 0x20800,
 12829  	            0xb: 0x8020020,
 12830  	            0xc: 0x820,
 12831  	            0xd: 0x0,
 12832  	            0xe: 0x8000020,
 12833  	            0xf: 0x20820,
 12834  	            0x80000000: 0x800,
 12835  	            0x80000001: 0x8020820,
 12836  	            0x80000002: 0x8000820,
 12837  	            0x80000003: 0x8000000,
 12838  	            0x80000004: 0x8020000,
 12839  	            0x80000005: 0x20800,
 12840  	            0x80000006: 0x20820,
 12841  	            0x80000007: 0x20,
 12842  	            0x80000008: 0x8000020,
 12843  	            0x80000009: 0x820,
 12844  	            0x8000000a: 0x20020,
 12845  	            0x8000000b: 0x8020800,
 12846  	            0x8000000c: 0x0,
 12847  	            0x8000000d: 0x8020020,
 12848  	            0x8000000e: 0x8000800,
 12849  	            0x8000000f: 0x20000,
 12850  	            0x10: 0x20820,
 12851  	            0x11: 0x8020800,
 12852  	            0x12: 0x20,
 12853  	            0x13: 0x800,
 12854  	            0x14: 0x8000800,
 12855  	            0x15: 0x8000020,
 12856  	            0x16: 0x8020020,
 12857  	            0x17: 0x20000,
 12858  	            0x18: 0x0,
 12859  	            0x19: 0x20020,
 12860  	            0x1a: 0x8020000,
 12861  	            0x1b: 0x8000820,
 12862  	            0x1c: 0x8020820,
 12863  	            0x1d: 0x20800,
 12864  	            0x1e: 0x820,
 12865  	            0x1f: 0x8000000,
 12866  	            0x80000010: 0x20000,
 12867  	            0x80000011: 0x800,
 12868  	            0x80000012: 0x8020020,
 12869  	            0x80000013: 0x20820,
 12870  	            0x80000014: 0x20,
 12871  	            0x80000015: 0x8020000,
 12872  	            0x80000016: 0x8000000,
 12873  	            0x80000017: 0x8000820,
 12874  	            0x80000018: 0x8020820,
 12875  	            0x80000019: 0x8000020,
 12876  	            0x8000001a: 0x8000800,
 12877  	            0x8000001b: 0x0,
 12878  	            0x8000001c: 0x20800,
 12879  	            0x8000001d: 0x820,
 12880  	            0x8000001e: 0x20020,
 12881  	            0x8000001f: 0x8020800
 12882  	        }
 12883  	    ];
 12884  
 12885  	    // Masks that select the SBOX input
 12886  	    var SBOX_MASK = [
 12887  	        0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
 12888  	        0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
 12889  	    ];
 12890  
 12891  	    /**
 12892  	     * DES block cipher algorithm.
 12893  	     */
 12894  	    var DES = C_algo.DES = BlockCipher.extend({
 12895  	        _doReset: function () {
 12896  	            // Shortcuts
 12897  	            var key = this._key;
 12898  	            var keyWords = key.words;
 12899  
 12900  	            // Select 56 bits according to PC1
 12901  	            var keyBits = [];
 12902  	            for (var i = 0; i < 56; i++) {
 12903  	                var keyBitPos = PC1[i] - 1;
 12904  	                keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
 12905  	            }
 12906  
 12907  	            // Assemble 16 subkeys
 12908  	            var subKeys = this._subKeys = [];
 12909  	            for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
 12910  	                // Create subkey
 12911  	                var subKey = subKeys[nSubKey] = [];
 12912  
 12913  	                // Shortcut
 12914  	                var bitShift = BIT_SHIFTS[nSubKey];
 12915  
 12916  	                // Select 48 bits according to PC2
 12917  	                for (var i = 0; i < 24; i++) {
 12918  	                    // Select from the left 28 key bits
 12919  	                    subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
 12920  
 12921  	                    // Select from the right 28 key bits
 12922  	                    subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
 12923  	                }
 12924  
 12925  	                // Since each subkey is applied to an expanded 32-bit input,
 12926  	                // the subkey can be broken into 8 values scaled to 32-bits,
 12927  	                // which allows the key to be used without expansion
 12928  	                subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
 12929  	                for (var i = 1; i < 7; i++) {
 12930  	                    subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
 12931  	                }
 12932  	                subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
 12933  	            }
 12934  
 12935  	            // Compute inverse subkeys
 12936  	            var invSubKeys = this._invSubKeys = [];
 12937  	            for (var i = 0; i < 16; i++) {
 12938  	                invSubKeys[i] = subKeys[15 - i];
 12939  	            }
 12940  	        },
 12941  
 12942  	        encryptBlock: function (M, offset) {
 12943  	            this._doCryptBlock(M, offset, this._subKeys);
 12944  	        },
 12945  
 12946  	        decryptBlock: function (M, offset) {
 12947  	            this._doCryptBlock(M, offset, this._invSubKeys);
 12948  	        },
 12949  
 12950  	        _doCryptBlock: function (M, offset, subKeys) {
 12951  	            // Get input
 12952  	            this._lBlock = M[offset];
 12953  	            this._rBlock = M[offset + 1];
 12954  
 12955  	            // Initial permutation
 12956  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12957  	            exchangeLR.call(this, 16, 0x0000ffff);
 12958  	            exchangeRL.call(this, 2,  0x33333333);
 12959  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12960  	            exchangeLR.call(this, 1,  0x55555555);
 12961  
 12962  	            // Rounds
 12963  	            for (var round = 0; round < 16; round++) {
 12964  	                // Shortcuts
 12965  	                var subKey = subKeys[round];
 12966  	                var lBlock = this._lBlock;
 12967  	                var rBlock = this._rBlock;
 12968  
 12969  	                // Feistel function
 12970  	                var f = 0;
 12971  	                for (var i = 0; i < 8; i++) {
 12972  	                    f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
 12973  	                }
 12974  	                this._lBlock = rBlock;
 12975  	                this._rBlock = lBlock ^ f;
 12976  	            }
 12977  
 12978  	            // Undo swap from last round
 12979  	            var t = this._lBlock;
 12980  	            this._lBlock = this._rBlock;
 12981  	            this._rBlock = t;
 12982  
 12983  	            // Final permutation
 12984  	            exchangeLR.call(this, 1,  0x55555555);
 12985  	            exchangeRL.call(this, 8,  0x00ff00ff);
 12986  	            exchangeRL.call(this, 2,  0x33333333);
 12987  	            exchangeLR.call(this, 16, 0x0000ffff);
 12988  	            exchangeLR.call(this, 4,  0x0f0f0f0f);
 12989  
 12990  	            // Set output
 12991  	            M[offset] = this._lBlock;
 12992  	            M[offset + 1] = this._rBlock;
 12993  	        },
 12994  
 12995  	        keySize: 64/32,
 12996  
 12997  	        ivSize: 64/32,
 12998  
 12999  	        blockSize: 64/32
 13000  	    });
 13001  
 13002  	    // Swap bits across the left and right words
 13003  	    function exchangeLR(offset, mask) {
 13004  	        var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
 13005  	        this._rBlock ^= t;
 13006  	        this._lBlock ^= t << offset;
 13007  	    }
 13008  
 13009  	    function exchangeRL(offset, mask) {
 13010  	        var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
 13011  	        this._lBlock ^= t;
 13012  	        this._rBlock ^= t << offset;
 13013  	    }
 13014  
 13015  	    /**
 13016  	     * Shortcut functions to the cipher's object interface.
 13017  	     *
 13018  	     * @example
 13019  	     *
 13020  	     *     var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
 13021  	     *     var plaintext  = CryptoJS.DES.decrypt(ciphertext, key, cfg);
 13022  	     */
 13023  	    C.DES = BlockCipher._createHelper(DES);
 13024  
 13025  	    /**
 13026  	     * Triple-DES block cipher algorithm.
 13027  	     */
 13028  	    var TripleDES = C_algo.TripleDES = BlockCipher.extend({
 13029  	        _doReset: function () {
 13030  	            // Shortcuts
 13031  	            var key = this._key;
 13032  	            var keyWords = key.words;
 13033  
 13034  	            // Create DES instances
 13035  	            this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
 13036  	            this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
 13037  	            this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
 13038  	        },
 13039  
 13040  	        encryptBlock: function (M, offset) {
 13041  	            this._des1.encryptBlock(M, offset);
 13042  	            this._des2.decryptBlock(M, offset);
 13043  	            this._des3.encryptBlock(M, offset);
 13044  	        },
 13045  
 13046  	        decryptBlock: function (M, offset) {
 13047  	            this._des3.decryptBlock(M, offset);
 13048  	            this._des2.encryptBlock(M, offset);
 13049  	            this._des1.decryptBlock(M, offset);
 13050  	        },
 13051  
 13052  	        keySize: 192/32,
 13053  
 13054  	        ivSize: 64/32,
 13055  
 13056  	        blockSize: 64/32
 13057  	    });
 13058  
 13059  	    /**
 13060  	     * Shortcut functions to the cipher's object interface.
 13061  	     *
 13062  	     * @example
 13063  	     *
 13064  	     *     var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
 13065  	     *     var plaintext  = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
 13066  	     */
 13067  	    C.TripleDES = BlockCipher._createHelper(TripleDES);
 13068  	}());
 13069  
 13070  
 13071  	return CryptoJS.TripleDES;
 13072  
 13073  }));
 13074  },{"./cipher-core":52,"./core":53,"./enc-base64":54,"./evpkdf":56,"./md5":61}],84:[function(require,module,exports){
 13075  ;(function (root, factory) {
 13076  	if (typeof exports === "object") {
 13077  		// CommonJS
 13078  		module.exports = exports = factory(require("./core"));
 13079  	}
 13080  	else if (typeof define === "function" && define.amd) {
 13081  		// AMD
 13082  		define(["./core"], factory);
 13083  	}
 13084  	else {
 13085  		// Global (browser)
 13086  		factory(root.CryptoJS);
 13087  	}
 13088  }(this, function (CryptoJS) {
 13089  
 13090  	(function (undefined) {
 13091  	    // Shortcuts
 13092  	    var C = CryptoJS;
 13093  	    var C_lib = C.lib;
 13094  	    var Base = C_lib.Base;
 13095  	    var X32WordArray = C_lib.WordArray;
 13096  
 13097  	    /**
 13098  	     * x64 namespace.
 13099  	     */
 13100  	    var C_x64 = C.x64 = {};
 13101  
 13102  	    /**
 13103  	     * A 64-bit word.
 13104  	     */
 13105  	    var X64Word = C_x64.Word = Base.extend({
 13106  	        /**
 13107  	         * Initializes a newly created 64-bit word.
 13108  	         *
 13109  	         * @param {number} high The high 32 bits.
 13110  	         * @param {number} low The low 32 bits.
 13111  	         *
 13112  	         * @example
 13113  	         *
 13114  	         *     var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
 13115  	         */
 13116  	        init: function (high, low) {
 13117  	            this.high = high;
 13118  	            this.low = low;
 13119  	        }
 13120  
 13121  	        /**
 13122  	         * Bitwise NOTs this word.
 13123  	         *
 13124  	         * @return {X64Word} A new x64-Word object after negating.
 13125  	         *
 13126  	         * @example
 13127  	         *
 13128  	         *     var negated = x64Word.not();
 13129  	         */
 13130  	        // not: function () {
 13131  	            // var high = ~this.high;
 13132  	            // var low = ~this.low;
 13133  
 13134  	            // return X64Word.create(high, low);
 13135  	        // },
 13136  
 13137  	        /**
 13138  	         * Bitwise ANDs this word with the passed word.
 13139  	         *
 13140  	         * @param {X64Word} word The x64-Word to AND with this word.
 13141  	         *
 13142  	         * @return {X64Word} A new x64-Word object after ANDing.
 13143  	         *
 13144  	         * @example
 13145  	         *
 13146  	         *     var anded = x64Word.and(anotherX64Word);
 13147  	         */
 13148  	        // and: function (word) {
 13149  	            // var high = this.high & word.high;
 13150  	            // var low = this.low & word.low;
 13151  
 13152  	            // return X64Word.create(high, low);
 13153  	        // },
 13154  
 13155  	        /**
 13156  	         * Bitwise ORs this word with the passed word.
 13157  	         *
 13158  	         * @param {X64Word} word The x64-Word to OR with this word.
 13159  	         *
 13160  	         * @return {X64Word} A new x64-Word object after ORing.
 13161  	         *
 13162  	         * @example
 13163  	         *
 13164  	         *     var ored = x64Word.or(anotherX64Word);
 13165  	         */
 13166  	        // or: function (word) {
 13167  	            // var high = this.high | word.high;
 13168  	            // var low = this.low | word.low;
 13169  
 13170  	            // return X64Word.create(high, low);
 13171  	        // },
 13172  
 13173  	        /**
 13174  	         * Bitwise XORs this word with the passed word.
 13175  	         *
 13176  	         * @param {X64Word} word The x64-Word to XOR with this word.
 13177  	         *
 13178  	         * @return {X64Word} A new x64-Word object after XORing.
 13179  	         *
 13180  	         * @example
 13181  	         *
 13182  	         *     var xored = x64Word.xor(anotherX64Word);
 13183  	         */
 13184  	        // xor: function (word) {
 13185  	            // var high = this.high ^ word.high;
 13186  	            // var low = this.low ^ word.low;
 13187  
 13188  	            // return X64Word.create(high, low);
 13189  	        // },
 13190  
 13191  	        /**
 13192  	         * Shifts this word n bits to the left.
 13193  	         *
 13194  	         * @param {number} n The number of bits to shift.
 13195  	         *
 13196  	         * @return {X64Word} A new x64-Word object after shifting.
 13197  	         *
 13198  	         * @example
 13199  	         *
 13200  	         *     var shifted = x64Word.shiftL(25);
 13201  	         */
 13202  	        // shiftL: function (n) {
 13203  	            // if (n < 32) {
 13204  	                // var high = (this.high << n) | (this.low >>> (32 - n));
 13205  	                // var low = this.low << n;
 13206  	            // } else {
 13207  	                // var high = this.low << (n - 32);
 13208  	                // var low = 0;
 13209  	            // }
 13210  
 13211  	            // return X64Word.create(high, low);
 13212  	        // },
 13213  
 13214  	        /**
 13215  	         * Shifts this word n bits to the right.
 13216  	         *
 13217  	         * @param {number} n The number of bits to shift.
 13218  	         *
 13219  	         * @return {X64Word} A new x64-Word object after shifting.
 13220  	         *
 13221  	         * @example
 13222  	         *
 13223  	         *     var shifted = x64Word.shiftR(7);
 13224  	         */
 13225  	        // shiftR: function (n) {
 13226  	            // if (n < 32) {
 13227  	                // var low = (this.low >>> n) | (this.high << (32 - n));
 13228  	                // var high = this.high >>> n;
 13229  	            // } else {
 13230  	                // var low = this.high >>> (n - 32);
 13231  	                // var high = 0;
 13232  	            // }
 13233  
 13234  	            // return X64Word.create(high, low);
 13235  	        // },
 13236  
 13237  	        /**
 13238  	         * Rotates this word n bits to the left.
 13239  	         *
 13240  	         * @param {number} n The number of bits to rotate.
 13241  	         *
 13242  	         * @return {X64Word} A new x64-Word object after rotating.
 13243  	         *
 13244  	         * @example
 13245  	         *
 13246  	         *     var rotated = x64Word.rotL(25);
 13247  	         */
 13248  	        // rotL: function (n) {
 13249  	            // return this.shiftL(n).or(this.shiftR(64 - n));
 13250  	        // },
 13251  
 13252  	        /**
 13253  	         * Rotates this word n bits to the right.
 13254  	         *
 13255  	         * @param {number} n The number of bits to rotate.
 13256  	         *
 13257  	         * @return {X64Word} A new x64-Word object after rotating.
 13258  	         *
 13259  	         * @example
 13260  	         *
 13261  	         *     var rotated = x64Word.rotR(7);
 13262  	         */
 13263  	        // rotR: function (n) {
 13264  	            // return this.shiftR(n).or(this.shiftL(64 - n));
 13265  	        // },
 13266  
 13267  	        /**
 13268  	         * Adds this word with the passed word.
 13269  	         *
 13270  	         * @param {X64Word} word The x64-Word to add with this word.
 13271  	         *
 13272  	         * @return {X64Word} A new x64-Word object after adding.
 13273  	         *
 13274  	         * @example
 13275  	         *
 13276  	         *     var added = x64Word.add(anotherX64Word);
 13277  	         */
 13278  	        // add: function (word) {
 13279  	            // var low = (this.low + word.low) | 0;
 13280  	            // var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
 13281  	            // var high = (this.high + word.high + carry) | 0;
 13282  
 13283  	            // return X64Word.create(high, low);
 13284  	        // }
 13285  	    });
 13286  
 13287  	    /**
 13288  	     * An array of 64-bit words.
 13289  	     *
 13290  	     * @property {Array} words The array of CryptoJS.x64.Word objects.
 13291  	     * @property {number} sigBytes The number of significant bytes in this word array.
 13292  	     */
 13293  	    var X64WordArray = C_x64.WordArray = Base.extend({
 13294  	        /**
 13295  	         * Initializes a newly created word array.
 13296  	         *
 13297  	         * @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
 13298  	         * @param {number} sigBytes (Optional) The number of significant bytes in the words.
 13299  	         *
 13300  	         * @example
 13301  	         *
 13302  	         *     var wordArray = CryptoJS.x64.WordArray.create();
 13303  	         *
 13304  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13305  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13306  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13307  	         *     ]);
 13308  	         *
 13309  	         *     var wordArray = CryptoJS.x64.WordArray.create([
 13310  	         *         CryptoJS.x64.Word.create(0x00010203, 0x04050607),
 13311  	         *         CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
 13312  	         *     ], 10);
 13313  	         */
 13314  	        init: function (words, sigBytes) {
 13315  	            words = this.words = words || [];
 13316  
 13317  	            if (sigBytes != undefined) {
 13318  	                this.sigBytes = sigBytes;
 13319  	            } else {
 13320  	                this.sigBytes = words.length * 8;
 13321  	            }
 13322  	        },
 13323  
 13324  	        /**
 13325  	         * Converts this 64-bit word array to a 32-bit word array.
 13326  	         *
 13327  	         * @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
 13328  	         *
 13329  	         * @example
 13330  	         *
 13331  	         *     var x32WordArray = x64WordArray.toX32();
 13332  	         */
 13333  	        toX32: function () {
 13334  	            // Shortcuts
 13335  	            var x64Words = this.words;
 13336  	            var x64WordsLength = x64Words.length;
 13337  
 13338  	            // Convert
 13339  	            var x32Words = [];
 13340  	            for (var i = 0; i < x64WordsLength; i++) {
 13341  	                var x64Word = x64Words[i];
 13342  	                x32Words.push(x64Word.high);
 13343  	                x32Words.push(x64Word.low);
 13344  	            }
 13345  
 13346  	            return X32WordArray.create(x32Words, this.sigBytes);
 13347  	        },
 13348  
 13349  	        /**
 13350  	         * Creates a copy of this word array.
 13351  	         *
 13352  	         * @return {X64WordArray} The clone.
 13353  	         *
 13354  	         * @example
 13355  	         *
 13356  	         *     var clone = x64WordArray.clone();
 13357  	         */
 13358  	        clone: function () {
 13359  	            var clone = Base.clone.call(this);
 13360  
 13361  	            // Clone "words" array
 13362  	            var words = clone.words = this.words.slice(0);
 13363  
 13364  	            // Clone each X64Word object
 13365  	            var wordsLength = words.length;
 13366  	            for (var i = 0; i < wordsLength; i++) {
 13367  	                words[i] = words[i].clone();
 13368  	            }
 13369  
 13370  	            return clone;
 13371  	        }
 13372  	    });
 13373  	}());
 13374  
 13375  
 13376  	return CryptoJS;
 13377  
 13378  }));
 13379  },{"./core":53}],85:[function(require,module,exports){
 13380  /*! https://mths.be/utf8js v2.1.2 by @mathias */
 13381  ;(function(root) {
 13382  
 13383  	// Detect free variables `exports`
 13384  	var freeExports = typeof exports == 'object' && exports;
 13385  
 13386  	// Detect free variable `module`
 13387  	var freeModule = typeof module == 'object' && module &&
 13388  		module.exports == freeExports && module;
 13389  
 13390  	// Detect free variable `global`, from Node.js or Browserified code,
 13391  	// and use it as `root`
 13392  	var freeGlobal = typeof global == 'object' && global;
 13393  	if (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {
 13394  		root = freeGlobal;
 13395  	}
 13396  
 13397  	/*--------------------------------------------------------------------------*/
 13398  
 13399  	var stringFromCharCode = String.fromCharCode;
 13400  
 13401  	// Taken from https://mths.be/punycode
 13402  	function ucs2decode(string) {
 13403  		var output = [];
 13404  		var counter = 0;
 13405  		var length = string.length;
 13406  		var value;
 13407  		var extra;
 13408  		while (counter < length) {
 13409  			value = string.charCodeAt(counter++);
 13410  			if (value >= 0xD800 && value <= 0xDBFF && counter < length) {
 13411  				// high surrogate, and there is a next character
 13412  				extra = string.charCodeAt(counter++);
 13413  				if ((extra & 0xFC00) == 0xDC00) { // low surrogate
 13414  					output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);
 13415  				} else {
 13416  					// unmatched surrogate; only append this code unit, in case the next
 13417  					// code unit is the high surrogate of a surrogate pair
 13418  					output.push(value);
 13419  					counter--;
 13420  				}
 13421  			} else {
 13422  				output.push(value);
 13423  			}
 13424  		}
 13425  		return output;
 13426  	}
 13427  
 13428  	// Taken from https://mths.be/punycode
 13429  	function ucs2encode(array) {
 13430  		var length = array.length;
 13431  		var index = -1;
 13432  		var value;
 13433  		var output = '';
 13434  		while (++index < length) {
 13435  			value = array[index];
 13436  			if (value > 0xFFFF) {
 13437  				value -= 0x10000;
 13438  				output += stringFromCharCode(value >>> 10 & 0x3FF | 0xD800);
 13439  				value = 0xDC00 | value & 0x3FF;
 13440  			}
 13441  			output += stringFromCharCode(value);
 13442  		}
 13443  		return output;
 13444  	}
 13445  
 13446  	function checkScalarValue(codePoint) {
 13447  		if (codePoint >= 0xD800 && codePoint <= 0xDFFF) {
 13448  			throw Error(
 13449  				'Lone surrogate U+' + codePoint.toString(16).toUpperCase() +
 13450  				' is not a scalar value'
 13451  			);
 13452  		}
 13453  	}
 13454  	/*--------------------------------------------------------------------------*/
 13455  
 13456  	function createByte(codePoint, shift) {
 13457  		return stringFromCharCode(((codePoint >> shift) & 0x3F) | 0x80);
 13458  	}
 13459  
 13460  	function encodeCodePoint(codePoint) {
 13461  		if ((codePoint & 0xFFFFFF80) == 0) { // 1-byte sequence
 13462  			return stringFromCharCode(codePoint);
 13463  		}
 13464  		var symbol = '';
 13465  		if ((codePoint & 0xFFFFF800) == 0) { // 2-byte sequence
 13466  			symbol = stringFromCharCode(((codePoint >> 6) & 0x1F) | 0xC0);
 13467  		}
 13468  		else if ((codePoint & 0xFFFF0000) == 0) { // 3-byte sequence
 13469  			checkScalarValue(codePoint);
 13470  			symbol = stringFromCharCode(((codePoint >> 12) & 0x0F) | 0xE0);
 13471  			symbol += createByte(codePoint, 6);
 13472  		}
 13473  		else if ((codePoint & 0xFFE00000) == 0) { // 4-byte sequence
 13474  			symbol = stringFromCharCode(((codePoint >> 18) & 0x07) | 0xF0);
 13475  			symbol += createByte(codePoint, 12);
 13476  			symbol += createByte(codePoint, 6);
 13477  		}
 13478  		symbol += stringFromCharCode((codePoint & 0x3F) | 0x80);
 13479  		return symbol;
 13480  	}
 13481  
 13482  	function utf8encode(string) {
 13483  		var codePoints = ucs2decode(string);
 13484  		var length = codePoints.length;
 13485  		var index = -1;
 13486  		var codePoint;
 13487  		var byteString = '';
 13488  		while (++index < length) {
 13489  			codePoint = codePoints[index];
 13490  			byteString += encodeCodePoint(codePoint);
 13491  		}
 13492  		return byteString;
 13493  	}
 13494  
 13495  	/*--------------------------------------------------------------------------*/
 13496  
 13497  	function readContinuationByte() {
 13498  		if (byteIndex >= byteCount) {
 13499  			throw Error('Invalid byte index');
 13500  		}
 13501  
 13502  		var continuationByte = byteArray[byteIndex] & 0xFF;
 13503  		byteIndex++;
 13504  
 13505  		if ((continuationByte & 0xC0) == 0x80) {
 13506  			return continuationByte & 0x3F;
 13507  		}
 13508  
 13509  		// If we end up here, it’s not a continuation byte
 13510  		throw Error('Invalid continuation byte');
 13511  	}
 13512  
 13513  	function decodeSymbol() {
 13514  		var byte1;
 13515  		var byte2;
 13516  		var byte3;
 13517  		var byte4;
 13518  		var codePoint;
 13519  
 13520  		if (byteIndex > byteCount) {
 13521  			throw Error('Invalid byte index');
 13522  		}
 13523  
 13524  		if (byteIndex == byteCount) {
 13525  			return false;
 13526  		}
 13527  
 13528  		// Read first byte
 13529  		byte1 = byteArray[byteIndex] & 0xFF;
 13530  		byteIndex++;
 13531  
 13532  		// 1-byte sequence (no continuation bytes)
 13533  		if ((byte1 & 0x80) == 0) {
 13534  			return byte1;
 13535  		}
 13536  
 13537  		// 2-byte sequence
 13538  		if ((byte1 & 0xE0) == 0xC0) {
 13539  			byte2 = readContinuationByte();
 13540  			codePoint = ((byte1 & 0x1F) << 6) | byte2;
 13541  			if (codePoint >= 0x80) {
 13542  				return codePoint;
 13543  			} else {
 13544  				throw Error('Invalid continuation byte');
 13545  			}
 13546  		}
 13547  
 13548  		// 3-byte sequence (may include unpaired surrogates)
 13549  		if ((byte1 & 0xF0) == 0xE0) {
 13550  			byte2 = readContinuationByte();
 13551  			byte3 = readContinuationByte();
 13552  			codePoint = ((byte1 & 0x0F) << 12) | (byte2 << 6) | byte3;
 13553  			if (codePoint >= 0x0800) {
 13554  				checkScalarValue(codePoint);
 13555  				return codePoint;
 13556  			} else {
 13557  				throw Error('Invalid continuation byte');
 13558  			}
 13559  		}
 13560  
 13561  		// 4-byte sequence
 13562  		if ((byte1 & 0xF8) == 0xF0) {
 13563  			byte2 = readContinuationByte();
 13564  			byte3 = readContinuationByte();
 13565  			byte4 = readContinuationByte();
 13566  			codePoint = ((byte1 & 0x07) << 0x12) | (byte2 << 0x0C) |
 13567  				(byte3 << 0x06) | byte4;
 13568  			if (codePoint >= 0x010000 && codePoint <= 0x10FFFF) {
 13569  				return codePoint;
 13570  			}
 13571  		}
 13572  
 13573  		throw Error('Invalid UTF-8 detected');
 13574  	}
 13575  
 13576  	var byteArray;
 13577  	var byteCount;
 13578  	var byteIndex;
 13579  	function utf8decode(byteString) {
 13580  		byteArray = ucs2decode(byteString);
 13581  		byteCount = byteArray.length;
 13582  		byteIndex = 0;
 13583  		var codePoints = [];
 13584  		var tmp;
 13585  		while ((tmp = decodeSymbol()) !== false) {
 13586  			codePoints.push(tmp);
 13587  		}
 13588  		return ucs2encode(codePoints);
 13589  	}
 13590  
 13591  	/*--------------------------------------------------------------------------*/
 13592  
 13593  	var utf8 = {
 13594  		'version': '2.1.2',
 13595  		'encode': utf8encode,
 13596  		'decode': utf8decode
 13597  	};
 13598  
 13599  	// Some AMD build optimizers, like r.js, check for specific condition patterns
 13600  	// like the following:
 13601  	if (
 13602  		typeof define == 'function' &&
 13603  		typeof define.amd == 'object' &&
 13604  		define.amd
 13605  	) {
 13606  		define(function() {
 13607  			return utf8;
 13608  		});
 13609  	}	else if (freeExports && !freeExports.nodeType) {
 13610  		if (freeModule) { // in Node.js or RingoJS v0.8.0+
 13611  			freeModule.exports = utf8;
 13612  		} else { // in Narwhal or RingoJS v0.7.0-
 13613  			var object = {};
 13614  			var hasOwnProperty = object.hasOwnProperty;
 13615  			for (var key in utf8) {
 13616  				hasOwnProperty.call(utf8, key) && (freeExports[key] = utf8[key]);
 13617  			}
 13618  		}
 13619  	} else { // in Rhino or a web browser
 13620  		root.utf8 = utf8;
 13621  	}
 13622  
 13623  }(this));
 13624  
 13625  },{}],86:[function(require,module,exports){
 13626  module.exports = XMLHttpRequest;
 13627  
 13628  },{}],"bignumber.js":[function(require,module,exports){
 13629  'use strict';
 13630  
 13631  module.exports = BigNumber; // jshint ignore:line
 13632  
 13633  
 13634  },{}],"web3":[function(require,module,exports){
 13635  var Web3 = require('./lib/web3');
 13636  
 13637  // don't override global variable
 13638  if (typeof window !== 'undefined' && typeof window.Web3 === 'undefined') {
 13639      window.Web3 = Web3;
 13640  }
 13641  
 13642  module.exports = Web3;
 13643  
 13644  },{"./lib/web3":22}]},{},["web3"])
 13645