text: 'use strict';
  
  var CreditCardDetector = {
      blocks: {
          uatp:          [4, 5, 6],
          amex:          [4, 6, 5],
          diners:        [4, 6, 4],
          discover:      [4, 4, 4, 4],
          mastercard:    [4, 4, 4, 4],
          dankort:       [4, 4, 4, 4],
          instapayment:  [4, 4, 4, 4],
          jcb15:         [4, 6, 5],
          jcb:           [4, 4, 4, 4],
          maestro:       [4, 4, 4, 4],
          visa:          [4, 4, 4, 4],
          mir:           [4, 4, 4, 4],
          unionPay:      [4, 4, 4, 4],
          verve:         [4, 4, 4, 4, 3],
          general:       [4, 4, 4, 4]
      },
  
      re: {
          // starts with 1; 15 digits, not starts with 1800 (jcb card)
          uatp: /^(?!1800)1\d{0,14}/,
  
          // starts with 34/37; 15 digits
          amex: /^3[47]\d{0,13}/,
  
          // starts with 6011/65/644-649; 16 digits
          discover: /^(?:6011|65\d{0,2}|64[4-9]\d?)\d{0,12}/,
  
          // starts with 300-305/309 or 36/38/39; 14 digits
          diners: /^3(?:0([0-5]|9)|[689]\d?)\d{0,11}/,
  
          // starts with 51-55/2221–2720; 16 digits
          mastercard: /^(5[1-5]\d{0,2}|22[2-9]\d{0,1}|2[3-7]\d{0,2})\d{0,12}/,
  
          // starts with 5019/4175/4571; 16 digits
          dankort: /^(5019|4175|4571)\d{0,12}/,
  
          // starts with 637-639; 16 digits
          instapayment: /^63[7-9]\d{0,13}/,
  
          // starts with 2131/1800; 15 digits
          jcb15: /^(?:2131|1800)\d{0,11}/,
  
          // starts with 2131/1800/35; 16 digits
          jcb: /^(?:35\d{0,2})\d{0,12}/,
  
          // starts with 50/56-58/6304/67; 16 digits
          maestro: /^(?:5[0678]\d{0,2}|6304|67\d{0,2})\d{0,12}/,
  
          // starts with 22; 16 digits
          mir: /^220[0-4]\d{0,12}/,
  
          // starts with 4; 16 digits
          visa: /^4\d{0,15}/,
  
          // starts with 62/81; 16 digits
          unionPay: /^(62|81)\d{0,14}/,
          
          // starts with 506099–506198, 650002–650027; 16-19 digits
          verve: /^(?:(506099|5061[0-9][0-8]|6500[0-2][0-7])\d{0,10}|d{0,13}/,
          // starts with 506099–506198, 650002–650027; 16-19 digits
      },
  
      getStrictBlocks: function (block) {
        var total = block.reduce(function (prev, current) {
          return prev + current;
        }, 0);
  
        return block.concat(19 - total);
      },
  
      getInfo: function (value, strictMode) {
          var blocks = CreditCardDetector.blocks,
              re = CreditCardDetector.re;
  
          // Some credit card can have up to 19 digits number.
          // Set strictMode to true will remove the 16 max-length restrain,
          // however, I never found any website validate card number like
          // this, hence probably you don't want to enable this option.
          strictMode = !!strictMode;
  
          for (var key in re) {
              if (re[key].test(value)) {
                  var matchedBlocks = blocks[key];
                  return {
                      type: key,
                      blocks: strictMode ? this.getStrictBlocks(matchedBlocks) : matchedBlocks
                  };
              }
          }
  
          return {
              type: 'unknown',
              blocks: strictMode ? this.getStrictBlocks(blocks.general) : blocks.general
          };
      }
  };
  
  module.exports = CreditCardDetector;
  