PageSourceSearch

https://cuhk.edu.cn/themes/custom/cuhk_ui/bower_components/jquery.qrcode/dist/jquery-qrcode.js?tm4nm2

js cuhk.edu.cn collected 2026-10-01 10:25:00 UTC 72,174 bytes, 2,815 lines download raw bytes

vendor: 72,174 bytes, lines 1-2815
1/*! jquery-qrcode v0.17.0 - https://larsjung.de/jquery-qrcode/ */
2(function webpackUniversalModuleDefinition(root, factory) {
3	if(typeof exports === 'object' && typeof module === 'object')
4		module.exports = factory();
5	else if(typeof define === 'function' && define.amd)
6		define("jquery-qrcode", [], factory);
7	else if(typeof exports === 'object')
8		exports["jquery-qrcode"] = factory();
9	else
10		root["jquery-qrcode"] = factory();
11})((typeof self !== 'undefined' ? self : this), function() {
12return /******/ (function(modules) { // webpackBootstrap
13/******/ 	// The module cache
14/******/ 	var installedModules = {};
15/******/
16/******/ 	// The require function
17/******/ 	function __webpack_require__(moduleId) {
18/******/
19/******/ 		// Check if module is in cache
20/******/ 		if(installedModules[moduleId]) {
21/******/ 			return installedModules[moduleId].exports;
22/******/ 		}
23/******/ 		// Create a new module (and put it into the cache)
24/******/ 		var module = installedModules[moduleId] = {
25/******/ 			i: moduleId,
26/******/ 			l: false,
27/******/ 			exports: {}
28/******/ 		};
29/******/
30/******/ 		// Execute the module function
31/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
32/******/
33/******/ 		// Flag the module as loaded
34/******/ 		module.l = true;
35/******/
36/******/ 		// Return the exports of the module
37/******/ 		return module.exports;
38/******/ 	}
39/******/
40/******/
41/******/ 	// expose the modules object (__webpack_modules__)
42/******/ 	__webpack_require__.m = modules;
43/******/
44/******/ 	// expose the module cache
45/******/ 	__webpack_require__.c = installedModules;
46/******/
47/******/ 	// define getter function for harmony exports
48/******/ 	__webpack_require__.d = function(exports, name, getter) {
49/******/ 		if(!__webpack_require__.o(exports, name)) {
50/******/ 			Object.defineProperty(exports, name, { enumerable: true, get: getter });
51/******/ 		}
52/******/ 	};
53/******/
54/******/ 	// define __esModule on exports
55/******/ 	__webpack_require__.r = function(exports) {
56/******/ 		if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
57/******/ 			Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
58/******/ 		}
59/******/ 		Object.defineProperty(exports, '__esModule', { value: true });
60/******/ 	};
61/******/
62/******/ 	// create a fake namespace object
63/******/ 	// mode & 1: value is a module id, require it
64/******/ 	// mode & 2: merge all properties of value into the ns
65/******/ 	// mode & 4: return value when already ns object
66/******/ 	// mode & 8|1: behave like require
67/******/ 	__webpack_require__.t = function(value, mode) {
68/******/ 		if(mode & 1) value = __webpack_require__(value);
69/******/ 		if(mode & 8) return value;
70/******/ 		if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
71/******/ 		var ns = Object.create(null);
72/******/ 		__webpack_require__.r(ns);
73/******/ 		Object.defineProperty(ns, 'default', { enumerable: true, value: value });
74/******/ 		if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
75/******/ 		return ns;
76/******/ 	};
77/******/
78/******/ 	// getDefaultExport function for compatibility with non-harmony modules
79/******/ 	__webpack_require__.n = function(module) {
80/******/ 		var getter = module && module.__esModule ?
81/******/ 			function getDefault() { return module['default']; } :
82/******/ 			function getModuleExports() { return module; };
83/******/ 		__webpack_require__.d(getter, 'a', getter);
84/******/ 		return getter;
85/******/ 	};
86/******/
87/******/ 	// Object.prototype.hasOwnProperty.call
88/******/ 	__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
89/******/
90/******/ 	// __webpack_public_path__
91/******/ 	__webpack_require__.p = "";
92/******/
93/******/
94/******/ 	// Load entry module and return exports
95/******/ 	return __webpack_require__(__webpack_require__.s = 0);
96/******/ })
97/************************************************************************/
98/******/ ([
99/* 0 */
100/***/ (function(module, exports, __webpack_require__) {
101
102/* WEBPACK VAR INJECTION */(function(global) {var WIN = global.window;
103var JQ = WIN.jQuery; // Check if canvas is available in the browser (as Modernizr does)
104
105var HAS_CANVAS = function () {
106  var el = WIN.document.createElement('canvas');
107  return !!(el.getContext && el.getContext('2d'));
108}();
109
110var is_img_el = function is_img_el(x) {
111  return x && typeof x.tagName === 'string' && x.tagName.toUpperCase() === 'IMG';
112}; // Wrapper for the original QR code generator.
113
114
115var create_qrcode = function create_qrcode(text, level, version, quiet) {
116  var qr = {};
117
118  var qr_gen = __webpack_require__(2);
119
120  qr_gen.stringToBytes = qr_gen.stringToBytesFuncs['UTF-8'];
121  var vqr = qr_gen(version, level);
122  vqr.addData(text);
123  vqr.make();
124  quiet = quiet || 0;
125  var module_count = vqr.getModuleCount();
126  var quiet_module_count = module_count + 2 * quiet;
127
128  var is_dark = function is_dark(row, col) {
129    row -= quiet;
130    col -= quiet;
131    return row >= 0 && row < module_count && col >= 0 && col < module_count && vqr.isDark(row, col);
132  };
133
134  var add_blank = function add_blank(l, t, r, b) {
135    var prev_is_dark = qr.is_dark;
136    var module_size = 1 / quiet_module_count;
137
138    qr.is_dark = function (row, col) {
139      var ml = col * module_size;
140      var mt = row * module_size;
141      var mr = ml + module_size;
142      var mb = mt + module_size;
143      return prev_is_dark(row, col) && (l > mr || ml > r || t > mb || mt > b);
144    };
145  };
146
147  qr.text = text;
148  qr.level = level;
149  qr.version = version;
150  qr.module_count = quiet_module_count;
151  qr.is_dark = is_dark;
152  qr.add_blank = add_blank;
153  return qr;
154}; // Returns a minimal QR code for the given text starting with version `min_ver`.
155// Returns `undefined` if `text` is too long to be encoded in `max_ver`.
156
157
158var create_min_qrcode = function create_min_qrcode(text, level, min_ver, max_ver, quiet) {
159  min_ver = Math.max(1, min_ver || 1);
160  max_ver = Math.min(40, max_ver || 40);
161
162  for (var ver = min_ver; ver <= max_ver; ver += 1) {
163    try {
164      return create_qrcode(text, level, ver, quiet);
165    } catch (err) {
166      /* empty */
167    }
168  }
169
170  return undefined;
171};
172
173var draw_background_label = function draw_background_label(qr, context, settings) {
174  var size = settings.size;
175  var font = 'bold ' + settings.mSize * size + 'px ' + settings.fontname;
176  var ctx = JQ('<canvas/>')[0].getContext('2d');
177  ctx.font = font;
178  var w = ctx.measureText(settings.label).width;
179  var sh = settings.mSize;
180  var sw = w / size;
181  var sl = (1 - sw) * settings.mPosX;
182  var st = (1 - sh) * settings.mPosY;
183  var sr = sl + sw;
184  var sb = st + sh;
185  var pad = 0.01;
186
187  if (settings.mode === 1) {
188    // Strip
189    qr.add_blank(0, st - pad, size, sb + pad);
190  } else {
191    // Box
192    qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad);
193  }
194
195  context.fillStyle = settings.fontcolor;
196  context.font = font;
197  context.fillText(settings.label, sl * size, st * size + 0.75 * settings.mSize * size);
198};
199
200var draw_background_img = function draw_background_img(qr, context, settings) {
201  var size = settings.size;
202  var w = settings.image.naturalWidth || 1;
203  var h = settings.image.naturalHeight || 1;
204  var sh = settings.mSize;
205  var sw = sh * w / h;
206  var sl = (1 - sw) * settings.mPosX;
207  var st = (1 - sh) * settings.mPosY;
208  var sr = sl + sw;
209  var sb = st + sh;
210  var pad = 0.01;
211
212  if (settings.mode === 3) {
213    // Strip
214    qr.add_blank(0, st - pad, size, sb + pad);
215  } else {
216    // Box
217    qr.add_blank(sl - pad, st - pad, sr + pad, sb + pad);
218  }
219
220  context.drawImage(settings.image, sl * size, st * size, sw * size, sh * size);
221};
222
223var draw_background = function draw_background(qr, context, settings) {
224  if (is_img_el(settings.background)) {
225    context.drawImage(settings.background, 0, 0, settings.size, settings.size);
226  } else if (settings.background) {
227    context.fillStyle = settings.background;
228    context.fillRect(settings.left, settings.top, settings.size, settings.size);
229  }
230
231  var mode = settings.mode;
232
233  if (mode === 1 || mode === 2) {
234    draw_background_label(qr, context, settings);
235  } else if (is_img_el(settings.image) && (mode === 3 || mode === 4)) {
236    draw_background_img(qr, context, settings);
237  }
238};
239
240var draw_modules_default = function draw_modules_default(qr, context, settings, left, top, width, row, col) {
241  if (qr.is_dark(row, col)) {
242    context.rect(left, top, width, width);
243  }
244};
245
246var draw_modules_rounded_dark = function draw_modules_rounded_dark(ctx, l, t, r, b, rad, nw, ne, se, sw) {
247  if (nw) {
248    ctx.moveTo(l + rad, t);
249  } else {
250    ctx.moveTo(l, t);
251  }
252
253  if (ne) {
254    ctx.lineTo(r - rad, t);
255    ctx.arcTo(r, t, r, b, rad);
256  } else {
257    ctx.lineTo(r, t);
258  }
259
260  if (se) {
261    ctx.lineTo(r, b - rad);
262    ctx.arcTo(r, b, l, b, rad);
263  } else {
264    ctx.lineTo(r, b);
265  }
266
267  if (sw) {
268    ctx.lineTo(l + rad, b);
269    ctx.arcTo(l, b, l, t, rad);
270  } else {
271    ctx.lineTo(l, b);
272  }
273
274  if (nw) {
275    ctx.lineTo(l, t + rad);
276    ctx.arcTo(l, t, r, t, rad);
277  } else {
278    ctx.lineTo(l, t);
279  }
280};
281
282var draw_modules_rounded_light = function draw_modules_rounded_light(ctx, l, t, r, b, rad, nw, ne, se, sw) {
283  if (nw) {
284    ctx.moveTo(l + rad, t);
285    ctx.lineTo(l, t);
286    ctx.lineTo(l, t + rad);
287    ctx.arcTo(l, t, l + rad, t, rad);
288  }
289
290  if (ne) {
291    ctx.moveTo(r - rad, t);
292    ctx.lineTo(r, t);
293    ctx.lineTo(r, t + rad);
294    ctx.arcTo(r, t, r - rad, t, rad);
295  }
296
297  if (se) {
298    ctx.moveTo(r - rad, b);
299    ctx.lineTo(r, b);
300    ctx.lineTo(r, b - rad);
301    ctx.arcTo(r, b, r - rad, b, rad);
302  }
303
304  if (sw) {
305    ctx.moveTo(l + rad, b);
306    ctx.lineTo(l, b);
307    ctx.lineTo(l, b - rad);
308    ctx.arcTo(l, b, l + rad, b, rad);
309  }
310};
311
312var draw_modules_rounded = function draw_modules_rounded(qr, context, settings, left, top, width, row, col) {
313  var is_dark = qr.is_dark;
314  var right = left + width;
315  var bottom = top + width;
316  var radius = settings.radius * width;
317  var rowT = row - 1;
318  var rowB = row + 1;
319  var colL = col - 1;
320  var colR = col + 1;
321  var center = is_dark(row, col);
322  var northwest = is_dark(rowT, colL);
323  var north = is_dark(rowT, col);
324  var northeast = is_dark(rowT, colR);
325  var east = is_dark(row, colR);
326  var southeast = is_dark(rowB, colR);
327  var south = is_dark(rowB, col);
328  var southwest = is_dark(rowB, colL);
329  var west = is_dark(row, colL);
330
331  if (center) {
332    draw_modules_rounded_dark(context, left, top, right, bottom, radius, !north && !west, !north && !east, !south && !east, !south && !west);
333  } else {
334    draw_modules_rounded_light(context, left, top, right, bottom, radius, north && west && northwest, north && east && northeast, south && east && southeast, south && west && southwest);
335  }
336};
337
338var draw_modules = function draw_modules(qr, context, settings) {
339  var module_count = qr.module_count;
340  var module_size = settings.size / module_count;
341  var fn = draw_modules_default;
342  var row;
343  var col;
344
345  if (settings.radius > 0 && settings.radius <= 0.5) {
346    fn = draw_modules_rounded;
347  }
348
349  context.beginPath();
350
351  for (row = 0; row < module_count; row += 1) {
352    for (col = 0; col < module_count; col += 1) {
353      var l = settings.left + col * module_size;
354      var t = settings.top + row * module_size;
355      var w = module_size;
356      fn(qr, context, settings, l, t, w, row, col);
357    }
358  }
359
360  if (is_img_el(settings.fill)) {
361    context.strokeStyle = 'rgba(0,0,0,0.5)';
362    context.lineWidth = 2;
363    context.stroke();
364    var prev = context.globalCompositeOperation;
365    context.globalCompositeOperation = 'destination-out';
366    context.fill();
367    context.globalCompositeOperation = prev;
368    context.clip();
369    context.drawImage(settings.fill, 0, 0, settings.size, settings.size);
370    context.restore();
371  } else {
372    context.fillStyle = settings.fill;
373    context.fill();
374  }
375}; // Draws QR code to the given `canvas` and returns it.
376
377
378var draw_on_canvas = function draw_on_canvas(canvas, settings) {
379  var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet);
380
381  if (!qr) {
382    return null;
383  }
384
385  var $canvas = JQ(canvas).data('qrcode', qr);
386  var context = $canvas[0].getContext('2d');
387  draw_background(qr, context, settings);
388  draw_modules(qr, context, settings);
389  return $canvas;
390}; // Returns a `canvas` element representing the QR code for the given settings.
391
392
393var create_canvas = function create_canvas(settings) {
394  var $canvas = JQ('<canvas/>').attr('width', settings.size).attr('height', settings.size);
395  return draw_on_canvas($canvas, settings);
396}; // Returns an `image` element representing the QR code for the given settings.
397
398
399var create_img = function create_img(settings) {
400  return JQ('<img/>').attr('src', create_canvas(settings)[0].toDataURL('image/png'));
401}; // Returns a `div` element representing the QR code for the given settings.
402
403
404var create_div = function create_div(settings) {
405  var qr = create_min_qrcode(settings.text, settings.ecLevel, settings.minVersion, settings.maxVersion, settings.quiet);
406
407  if (!qr) {
408    return null;
409  } // some shortcuts to improve compression
410
411
412  var settings_size = settings.size;
413  var settings_bgColor = settings.background;
414  var math_floor = Math.floor;
415  var module_count = qr.module_count;
416  var module_size = math_floor(settings_size / module_count);
417  var offset = math_floor(0.5 * (settings_size - module_size * module_count));
418  var row;
419  var col;
420  var container_css = {
421    position: 'relative',
422    left: 0,
423    top: 0,
424    padding: 0,
425    margin: 0,
426    width: settings_size,
427    height: settings_size
428  };
429  var dark_css = {
430    position: 'absolute',
431    padding: 0,
432    margin: 0,
433    width: module_size,
434    height: module_size,
435    'background-color': settings.fill
436  };
437  var $div = JQ('<div/>').data('qrcode', qr).css(container_css);
438
439  if (settings_bgColor) {
440    $div.css('background-color', settings_bgColor);
441  }
442
443  for (row = 0; row < module_count; row += 1) {
444    for (col = 0; col < module_count; col += 1) {
445      if (qr.is_dark(row, col)) {
446        JQ('<div/>').css(dark_css).css({
447          left: offset + col * module_size,
448          top: offset + row * module_size
449        }).appendTo($div);
450      }
451    }
452  }
453
454  return $div;
455};
456
457var create_html = function create_html(settings) {
458  if (HAS_CANVAS && settings.render === 'canvas') {
459    return create_canvas(settings);
460  } else if (HAS_CANVAS && settings.render === 'image') {
461    return create_img(settings);
462  }
463
464  return create_div(settings);
465};
466
467var DEFAULTS = {
468  // render method: `'canvas'`, `'image'` or `'div'`
469  render: 'canvas',
470  // version range somewhere in 1 .. 40
471  minVersion: 1,
472  maxVersion: 40,
473  // error correction level: `'L'`, `'M'`, `'Q'` or `'H'`
474  ecLevel: 'L',
475  // offset in pixel if drawn onto existing canvas
476  left: 0,
477  top: 0,
478  // size in pixel
479  size: 200,
480  // code color or image element
481  fill: '#000',
482  // background color or image element, `null` for transparent background
483  background: '#fff',
484  // content
485  text: 'no text',
486  // corner radius relative to module width: 0.0 .. 0.5
487  radius: 0,
488  // quiet zone in modules
489  quiet: 0,
490  // modes
491  // 0: normal
492  // 1: label strip
493  // 2: label box
494  // 3: image strip
495  // 4: image box
496  mode: 0,
497  mSize: 0.1,
498  mPosX: 0.5,
499  mPosY: 0.5,
500  label: 'no label',
501  fontname: 'sans',
502  fontcolor: '#000',
503  image: null
504};
505
506JQ.fn.qrcode = module.exports = function main(options) {
507  var settings = JQ.extend({}, DEFAULTS, options);
508  return this.each(function (idx, el) {
509    if (el.nodeName.toLowerCase() === 'canvas') {
510      draw_on_canvas(el, settings);
511    } else {
512      JQ(el).append(create_html(settings));
513    }
514  });
515};
516/* WEBPACK VAR INJECTION */}.call(this, __webpack_require__(1)))
517
518/***/ }),
519/* 1 */
520/***/ (function(module, exports) {
521
522var g;
523
524// This works in non-strict mode
525g = (function() {
526	return this;
527})();
528
529try {
530	// This works if eval is allowed (see CSP)
531	g = g || new Function("return this")();
532} catch (e) {
533	// This works if the window reference is available
534	if (typeof window === "object") g = window;
535}
536
537// g can still be undefined, but nothing to do about it...
538// We return undefined, instead of nothing here, so it's
539// easier to handle this case. if(!global) { ...}
540
541module.exports = g;
542
543
544/***/ }),
545/* 2 */
546/***/ (function(module, exports, __webpack_require__) {
547
548var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;//---------------------------------------------------------------------
549//
550// QR Code Generator for JavaScript
551//
552// Copyright (c) 2009 Kazuhiko Arase
553//
554// URL: http://www.d-project.com/
555//
556// Licensed under the MIT license:
557//  http://www.opensource.org/licenses/mit-license.php
558//
559// The word 'QR Code' is registered trademark of
560// DENSO WAVE INCORPORATED
561//  http://www.denso-wave.com/qrcode/faqpatent-e.html
562//
563//---------------------------------------------------------------------
564
565var qrcode = function() {
566
567  //---------------------------------------------------------------------
568  // qrcode
569  //---------------------------------------------------------------------
570
571  /**
572   * qrcode
573   * @param typeNumber 1 to 40
574   * @param errorCorrectionLevel 'L','M','Q','H'
575   */
576  var qrcode = function(typeNumber, errorCorrectionLevel) {
577
578    var PAD0 = 0xEC;
579    var PAD1 = 0x11;
580
581    var _typeNumber = typeNumber;
582    var _errorCorrectionLevel = QRErrorCorrectionLevel[errorCorrectionLevel];
583    var _modules = null;
584    var _moduleCount = 0;
585    var _dataCache = null;
586    var _dataList = [];
587
588    var _this = {};
589
590    var makeImpl = function(test, maskPattern) {
591
592      _moduleCount = _typeNumber * 4 + 17;
593      _modules = function(moduleCount) {
594        var modules = new Array(moduleCount);
595        for (var row = 0; row < moduleCount; row += 1) {
596          modules[row] = new Array(moduleCount);
597          for (var col = 0; col < moduleCount; col += 1) {
598            modules[row][col] = null;
599          }
600        }
601        return modules;
602      }(_moduleCount);
603
604      setupPositionProbePattern(0, 0);
605      setupPositionProbePattern(_moduleCount - 7, 0);
606      setupPositionProbePattern(0, _moduleCount - 7);
607      setupPositionAdjustPattern();
608      setupTimingPattern();
609      setupTypeInfo(test, maskPattern);
610
611      if (_typeNumber >= 7) {
612        setupTypeNumber(test);
613      }
614
615      if (_dataCache == null) {
616        _dataCache = createData(_typeNumber, _errorCorrectionLevel, _dataList);
617      }
618
619      mapData(_dataCache, maskPattern);
620    };
621
622    var setupPositionProbePattern = function(row, col) {
623
624      for (var r = -1; r <= 7; r += 1) {
625
626        if (row + r <= -1 || _moduleCount <= row + r) continue;
627
628        for (var c = -1; c <= 7; c += 1) {
629
630          if (col + c <= -1 || _moduleCount <= col + c) continue;
631
632          if ( (0 <= r && r <= 6 && (c == 0 || c == 6) )
633              || (0 <= c && c <= 6 && (r == 0 || r == 6) )
634              || (2 <= r && r <= 4 && 2 <= c && c <= 4) ) {
635            _modules[row + r][col + c] = true;
636          } else {
637            _modules[row + r][col + c] = false;
638          }
639        }
640      }
641    };
642
643    var getBestMaskPattern = function() {
644
645      var minLostPoint = 0;
646      var pattern = 0;
647
648      for (var i = 0; i < 8; i += 1) {
649
650        makeImpl(true, i);
651
652        var lostPoint = QRUtil.getLostPoint(_this);
653
654        if (i == 0 || minLostPoint > lostPoint) {
655          minLostPoint = lostPoint;
656          pattern = i;
657        }
658      }
659
660      return pattern;
661    };
662
663    var setupTimingPattern = function() {
664
665      for (var r = 8; r < _moduleCount - 8; r += 1) {
666        if (_modules[r][6] != null) {
667          continue;
668        }
669        _modules[r][6] = (r % 2 == 0);
670      }
671
672      for (var c = 8; c < _moduleCount - 8; c += 1) {
673        if (_modules[6][c] != null) {
674          continue;
675        }
676        _modules[6][c] = (c % 2 == 0);
677      }
678    };
679
680    var setupPositionAdjustPattern = function() {
681
682      var pos = QRUtil.getPatternPosition(_typeNumber);
683
684      for (var i = 0; i < pos.length; i += 1) {
685
686        for (var j = 0; j < pos.length; j += 1) {
687
688          var row = pos[i];
689          var col = pos[j];
690
691          if (_modules[row][col] != null) {
692            continue;
693          }
694
695          for (var r = -2; r <= 2; r += 1) {
696
697            for (var c = -2; c <= 2; c += 1) {
698
699              if (r == -2 || r == 2 || c == -2 || c == 2
700                  || (r == 0 && c == 0) ) {
701                _modules[row + r][col + c] = true;
702              } else {
703                _modules[row + r][col + c] = false;
704              }
705            }
706          }
707        }
708      }
709    };
710
711    var setupTypeNumber = function(test) {
712
713      var bits = QRUtil.getBCHTypeNumber(_typeNumber);
714
715      for (var i = 0; i < 18; i += 1) {
716        var mod = (!test && ( (bits >> i) & 1) == 1);
717        _modules[Math.floor(i / 3)][i % 3 + _moduleCount - 8 - 3] = mod;
718      }
719
720      for (var i = 0; i < 18; i += 1) {
721        var mod = (!test && ( (bits >> i) & 1) == 1);
722        _modules[i % 3 + _moduleCount - 8 - 3][Math.floor(i / 3)] = mod;
723      }
724    };
725
726    var setupTypeInfo = function(test, maskPattern) {
727
728      var data = (_errorCorrectionLevel << 3) | maskPattern;
729      var bits = QRUtil.getBCHTypeInfo(data);
730
731      // vertical
732      for (var i = 0; i < 15; i += 1) {
733
734        var mod = (!test && ( (bits >> i) & 1) == 1);
735
736        if (i < 6) {
737          _modules[i][8] = mod;
738        } else if (i < 8) {
739          _modules[i + 1][8] = mod;
740        } else {
741          _modules[_moduleCount - 15 + i][8] = mod;
742        }
743      }
744
745      // horizontal
746      for (var i = 0; i < 15; i += 1) {
747
748        var mod = (!test && ( (bits >> i) & 1) == 1);
749
750        if (i < 8) {
751          _modules[8][_moduleCount - i - 1] = mod;
752        } else if (i < 9) {
753          _modules[8][15 - i - 1 + 1] = mod;
754        } else {
755          _modules[8][15 - i - 1] = mod;
756        }
757      }
758
759      // fixed module
760      _modules[_moduleCount - 8][8] = (!test);
761    };
762
763    var mapData = function(data, maskPattern) {
764
765      var inc = -1;
766      var row = _moduleCount - 1;
767      var bitIndex = 7;
768      var byteIndex = 0;
769      var maskFunc = QRUtil.getMaskFunction(maskPattern);
770
771      for (var col = _moduleCount - 1; col > 0; col -= 2) {
772
773        if (col == 6) col -= 1;
774
775        while (true) {
776
777          for (var c = 0; c < 2; c += 1) {
778
779            if (_modules[row][col - c] == null) {
780
781              var dark = false;
782
783              if (byteIndex < data.length) {
784                dark = ( ( (data[byteIndex] >>> bitIndex) & 1) == 1);
785              }
786
787              var mask = maskFunc(row, col - c);
788
789              if (mask) {
790                dark = !dark;
791              }
792
793              _modules[row][col - c] = dark;
794              bitIndex -= 1;
795
796              if (bitIndex == -1) {
797                byteIndex += 1;
798                bitIndex = 7;
799              }
800            }
801          }
802
803          row += inc;
804
805          if (row < 0 || _moduleCount <= row) {
806            row -= inc;
807            inc = -inc;
808            break;
809          }
810        }
811      }
812    };
813
814    var createBytes = function(buffer, rsBlocks) {
815
816      var offset = 0;
817
818      var maxDcCount = 0;
819      var maxEcCount = 0;
820
821      var dcdata = new Array(rsBlocks.length);
822      var ecdata = new Array(rsBlocks.length);
823
824      for (var r = 0; r < rsBlocks.length; r += 1) {
825
826        var dcCount = rsBlocks[r].dataCount;
827        var ecCount = rsBlocks[r].totalCount - dcCount;
828
829        maxDcCount = Math.max(maxDcCount, dcCount);
830        maxEcCount = Math.max(maxEcCount, ecCount);
831
832        dcdata[r] = new Array(dcCount);
833
834        for (var i = 0; i < dcdata[r].length; i += 1) {
835          dcdata[r][i] = 0xff & buffer.getBuffer()[i + offset];
836        }
837        offset += dcCount;
838
839        var rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount);
840        var rawPoly = qrPolynomial(dcdata[r], rsPoly.getLength() - 1);
841
842        var modPoly = rawPoly.mod(rsPoly);
843        ecdata[r] = new Array(rsPoly.getLength() - 1);
844        for (var i = 0; i < ecdata[r].length; i += 1) {
845          var modIndex = i + modPoly.getLength() - ecdata[r].length;
846          ecdata[r][i] = (modIndex >= 0)? modPoly.getAt(modIndex) : 0;
847        }
848      }
849
850      var totalCodeCount = 0;
851      for (var i = 0; i < rsBlocks.length; i += 1) {
852        totalCodeCount += rsBlocks[i].totalCount;
853      }
854
855      var data = new Array(totalCodeCount);
856      var index = 0;
857
858      for (var i = 0; i < maxDcCount; i += 1) {
859        for (var r = 0; r < rsBlocks.length; r += 1) {
860          if (i < dcdata[r].length) {
861            data[index] = dcdata[r][i];
862            index += 1;
863          }
864        }
865      }
866
867      for (var i = 0; i < maxEcCount; i += 1) {
868        for (var r = 0; r < rsBlocks.length; r += 1) {
869          if (i < ecdata[r].length) {
870            data[index] = ecdata[r][i];
871            index += 1;
872          }
873        }
874      }
875
876      return data;
877    };
878
879    var createData = function(typeNumber, errorCorrectionLevel, dataList) {
880
881      var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, errorCorrectionLevel);
882
883      var buffer = qrBitBuffer();
884
885      for (var i = 0; i < dataList.length; i += 1) {
886        var data = dataList[i];
887        buffer.put(data.getMode(), 4);
888        buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
889        data.write(buffer);
890      }
891
892      // calc num max data.
893      var totalDataCount = 0;
894      for (var i = 0; i < rsBlocks.length; i += 1) {
895        totalDataCount += rsBlocks[i].dataCount;
896      }
897
898      if (buffer.getLengthInBits() > totalDataCount * 8) {
899        throw 'code length overflow. ('
900          + buffer.getLengthInBits()
901          + '>'
902          + totalDataCount * 8
903          + ')';
904      }
905
906      // end code
907      if (buffer.getLengthInBits() + 4 <= totalDataCount * 8) {
908        buffer.put(0, 4);
909      }
910
911      // padding
912      while (buffer.getLengthInBits() % 8 != 0) {
913        buffer.putBit(false);
914      }
915
916      // padding
917      while (true) {
918
919        if (buffer.getLengthInBits() >= totalDataCount * 8) {
920          break;
921        }
922        buffer.put(PAD0, 8);
923
924        if (buffer.getLengthInBits() >= totalDataCount * 8) {
925          break;
926        }
927        buffer.put(PAD1, 8);
928      }
929
930      return createBytes(buffer, rsBlocks);
931    };
932
933    _this.addData = function(data, mode) {
934
935      mode = mode || 'Byte';
936
937      var newData = null;
938
939      switch(mode) {
940      case 'Numeric' :
941        newData = qrNumber(data);
942        break;
943      case 'Alphanumeric' :
944        newData = qrAlphaNum(data);
945        break;
946      case 'Byte' :
947        newData = qr8BitByte(data);
948        break;
949      case 'Kanji' :
950        newData = qrKanji(data);
951        break;
952      default :
953        throw 'mode:' + mode;
954      }
955
956      _dataList.push(newData);
957      _dataCache = null;
958    };
959
960    _this.isDark = function(row, col) {
961      if (row < 0 || _moduleCount <= row || col < 0 || _moduleCount <= col) {
962        throw row + ',' + col;
963      }
964      return _modules[row][col];
965    };
966
967    _this.getModuleCount = function() {
968      return _moduleCount;
969    };
970
971    _this.make = function() {
972      if (_typeNumber < 1) {
973        var typeNumber = 1;
974
975        for (; typeNumber < 40; typeNumber++) {
976          var rsBlocks = QRRSBlock.getRSBlocks(typeNumber, _errorCorrectionLevel);
977          var buffer = qrBitBuffer();
978
979          for (var i = 0; i < _dataList.length; i++) {
980            var data = _dataList[i];
981            buffer.put(data.getMode(), 4);
982            buffer.put(data.getLength(), QRUtil.getLengthInBits(data.getMode(), typeNumber) );
983            data.write(buffer);
984          }
985
986          var totalDataCount = 0;
987          for (var i = 0; i < rsBlocks.length; i++) {
988            totalDataCount += rsBlocks[i].dataCount;
989          }
990
991          if (buffer.getLengthInBits() <= totalDataCount * 8) {
992            break;
993          }
994        }
995
996        _typeNumber = typeNumber;
997      }
998
999      makeImpl(false, getBestMaskPattern() );
1000    };
1001
1002    _this.createTableTag = function(cellSize, margin) {
1003
1004      cellSize = cellSize || 2;
1005      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
1006
1007      var qrHtml = '';
1008
1009      qrHtml += '<table style="';
1010      qrHtml += ' border-width: 0px; border-style: none;';
1011      qrHtml += ' border-collapse: collapse;';
1012      qrHtml += ' padding: 0px; margin: ' + margin + 'px;';
1013      qrHtml += '">';
1014      qrHtml += '<tbody>';
1015
1016      for (var r = 0; r < _this.getModuleCount(); r += 1) {
1017
1018        qrHtml += '<tr>';
1019
1020        for (var c = 0; c < _this.getModuleCount(); c += 1) {
1021          qrHtml += '<td style="';
1022          qrHtml += ' border-width: 0px; border-style: none;';
1023          qrHtml += ' border-collapse: collapse;';
1024          qrHtml += ' padding: 0px; margin: 0px;';
1025          qrHtml += ' width: ' + cellSize + 'px;';
1026          qrHtml += ' height: ' + cellSize + 'px;';
1027          qrHtml += ' background-color: ';
1028          qrHtml += _this.isDark(r, c)? '#000000' : '#ffffff';
1029          qrHtml += ';';
1030          qrHtml += '"/>';
1031        }
1032
1033        qrHtml += '</tr>';
1034      }
1035
1036      qrHtml += '</tbody>';
1037      qrHtml += '</table>';
1038
1039      return qrHtml;
1040    };
1041
1042    _this.createSvgTag = function(cellSize, margin) {
1043
1044      var opts = {};
1045      if (typeof arguments[0] == 'object') {
1046        // Called by options.
1047        opts = arguments[0];
1048        // overwrite cellSize and margin.
1049        cellSize = opts.cellSize;
1050        margin = opts.margin;
1051      }
1052
1053      cellSize = cellSize || 2;
1054      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
1055      var size = _this.getModuleCount() * cellSize + margin * 2;
1056      var c, mc, r, mr, qrSvg='', rect;
1057
1058      rect = 'l' + cellSize + ',0 0,' + cellSize +
1059        ' -' + cellSize + ',0 0,-' + cellSize + 'z ';
1060
1061      qrSvg += '<svg version="1.1" xmlns="http://www.w3.org/2000/svg"';
1062      qrSvg += !opts.scalable ? ' width="' + size + 'px" height="' + size + 'px"' : '';
1063      qrSvg += ' viewBox="0 0 ' + size + ' ' + size + '" ';
1064      qrSvg += ' preserveAspectRatio="xMinYMin meet">';
1065      qrSvg += '<rect width="100%" height="100%" fill="white" cx="0" cy="0"/>';
1066      qrSvg += '<path d="';
1067
1068      for (r = 0; r < _this.getModuleCount(); r += 1) {
1069        mr = r * cellSize + margin;
1070        for (c = 0; c < _this.getModuleCount(); c += 1) {
1071          if (_this.isDark(r, c) ) {
1072            mc = c*cellSize+margin;
1073            qrSvg += 'M' + mc + ',' + mr + rect;
1074          }
1075        }
1076      }
1077
1078      qrSvg += '" stroke="transparent" fill="black"/>';
1079      qrSvg += '</svg>';
1080
1081      return qrSvg;
1082    };
1083
1084    _this.createDataURL = function(cellSize, margin) {
1085
1086      cellSize = cellSize || 2;
1087      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
1088
1089      var size = _this.getModuleCount() * cellSize + margin * 2;
1090      var min = margin;
1091      var max = size - margin;
1092
1093      return createDataURL(size, size, function(x, y) {
1094        if (min <= x && x < max && min <= y && y < max) {
1095          var c = Math.floor( (x - min) / cellSize);
1096          var r = Math.floor( (y - min) / cellSize);
1097          return _this.isDark(r, c)? 0 : 1;
1098        } else {
1099          return 1;
1100        }
1101      } );
1102    };
1103
1104    _this.createImgTag = function(cellSize, margin, alt) {
1105
1106      cellSize = cellSize || 2;
1107      margin = (typeof margin == 'undefined')? cellSize * 4 : margin;
1108
1109      var size = _this.getModuleCount() * cellSize + margin * 2;
1110
1111      var img = '';
1112      img += '<img';
1113      img += '\u0020src="';
1114      img += _this.createDataURL(cellSize, margin);
1115      img += '"';
1116      img += '\u0020width="';
1117      img += size;
1118      img += '"';
1119      img += '\u0020height="';
1120      img += size;
1121      img += '"';
1122      if (alt) {
1123        img += '\u0020alt="';
1124        img += alt;
1125        img += '"';
1126      }
1127      img += '/>';
1128
1129      return img;
1130    };
1131
1132    var _createHalfASCII = function(margin) {
1133      var cellSize = 1;
1134      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;
1135
1136      var size = _this.getModuleCount() * cellSize + margin * 2;
1137      var min = margin;
1138      var max = size - margin;
1139
1140      var y, x, r1, r2, p;
1141
1142      var blocks = {
1143        '██': '█',
1144        '█ ': '▀',
1145        ' █': '▄',
1146        '  ': ' '
1147      };
1148
1149      var blocksLastLineNoMargin = {
1150        '██': '▀',
1151        '█ ': '▀',
1152        ' █': ' ',
1153        '  ': ' '
1154      };
1155
1156      var ascii = '';
1157      for (y = 0; y < size; y += 2) {
1158        r1 = Math.floor((y - min) / cellSize);
1159        r2 = Math.floor((y + 1 - min) / cellSize);
1160        for (x = 0; x < size; x += 1) {
1161          p = '█';
1162
1163          if (min <= x && x < max && min <= y && y < max && _this.isDark(r1, Math.floor((x - min) / cellSize))) {
1164            p = ' ';
1165          }
1166
1167          if (min <= x && x < max && min <= y+1 && y+1 < max && _this.isDark(r2, Math.floor((x - min) / cellSize))) {
1168            p += ' ';
1169          }
1170          else {
1171            p += '█';
1172          }
1173
1174          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
1175          ascii += (margin < 1 && y+1 >= max) ? blocksLastLineNoMargin[p] : blocks[p];
1176        }
1177
1178        ascii += '\n';
1179      }
1180
1181      if (size % 2 && margin > 0) {
1182        return ascii.substring(0, ascii.length - size - 1) + Array(size+1).join('▀');
1183      }
1184
1185      return ascii.substring(0, ascii.length-1);
1186    };
1187
1188    _this.createASCII = function(cellSize, margin) {
1189      cellSize = cellSize || 1;
1190
1191      if (cellSize < 2) {
1192        return _createHalfASCII(margin);
1193      }
1194
1195      cellSize -= 1;
1196      margin = (typeof margin == 'undefined')? cellSize * 2 : margin;
1197
1198      var size = _this.getModuleCount() * cellSize + margin * 2;
1199      var min = margin;
1200      var max = size - margin;
1201
1202      var y, x, r, p;
1203
1204      var white = Array(cellSize+1).join('██');
1205      var black = Array(cellSize+1).join('  ');
1206
1207      var ascii = '';
1208      var line = '';
1209      for (y = 0; y < size; y += 1) {
1210        r = Math.floor( (y - min) / cellSize);
1211        line = '';
1212        for (x = 0; x < size; x += 1) {
1213          p = 1;
1214
1215          if (min <= x && x < max && min <= y && y < max && _this.isDark(r, Math.floor((x - min) / cellSize))) {
1216            p = 0;
1217          }
1218
1219          // Output 2 characters per pixel, to create full square. 1 character per pixels gives only half width of square.
1220          line += p ? white : black;
1221        }
1222
1223        for (r = 0; r < cellSize; r += 1) {
1224          ascii += line + '\n';
1225        }
1226      }
1227
1228      return ascii.substring(0, ascii.length-1);
1229    };
1230
1231    _this.renderTo2dContext = function(context, cellSize) {
1232      cellSize = cellSize || 2;
1233      var length = _this.getModuleCount();
1234      for (var row = 0; row < length; row++) {
1235        for (var col = 0; col < length; col++) {
1236          context.fillStyle = _this.isDark(row, col) ? 'black' : 'white';
1237          context.fillRect(row * cellSize, col * cellSize, cellSize, cellSize);
1238        }
1239      }
1240    }
1241
1242    return _this;
1243  };
1244
1245  //---------------------------------------------------------------------
1246  // qrcode.stringToBytes
1247  //---------------------------------------------------------------------
1248
1249  qrcode.stringToBytesFuncs = {
1250    'default' : function(s) {
1251      var bytes = [];
1252      for (var i = 0; i < s.length; i += 1) {
1253        var c = s.charCodeAt(i);
1254        bytes.push(c & 0xff);
1255      }
1256      return bytes;
1257    }
1258  };
1259
1260  qrcode.stringToBytes = qrcode.stringToBytesFuncs['default'];
1261
1262  //---------------------------------------------------------------------
1263  // qrcode.createStringToBytes
1264  //---------------------------------------------------------------------
1265
1266  /**
1267   * @param unicodeData base64 string of byte array.
1268   * [16bit Unicode],[16bit Bytes], ...
1269   * @param numChars
1270   */
1271  qrcode.createStringToBytes = function(unicodeData, numChars) {
1272
1273    // create conversion map.
1274
1275    var unicodeMap = function() {
1276
1277      var bin = base64DecodeInputStream(unicodeData);
1278      var read = function() {
1279        var b = bin.read();
1280        if (b == -1) throw 'eof';
1281        return b;
1282      };
1283
1284      var count = 0;
1285      var unicodeMap = {};
1286      while (true) {
1287        var b0 = bin.read();
1288        if (b0 == -1) break;
1289        var b1 = read();
1290        var b2 = read();
1291        var b3 = read();
1292        var k = String.fromCharCode( (b0 << 8) | b1);
1293        var v = (b2 << 8) | b3;
1294        unicodeMap[k] = v;
1295        count += 1;
1296      }
1297      if (count != numChars) {
1298        throw count + ' != ' + numChars;
1299      }
1300
1301      return unicodeMap;
1302    }();
1303
1304    var unknownChar = '?'.charCodeAt(0);
1305
1306    return function(s) {
1307      var bytes = [];
1308      for (var i = 0; i < s.length; i += 1) {
1309        var c = s.charCodeAt(i);
1310        if (c < 128) {
1311          bytes.push(c);
1312        } else {
1313          var b = unicodeMap[s.charAt(i)];
1314          if (typeof b == 'number') {
1315            if ( (b & 0xff) == b) {
1316              // 1byte
1317              bytes.push(b);
1318            } else {
1319              // 2bytes
1320              bytes.push(b >>> 8);
1321              bytes.push(b & 0xff);
1322            }
1323          } else {
1324            bytes.push(unknownChar);
1325          }
1326        }
1327      }
1328      return bytes;
1329    };
1330  };
1331
1332  //---------------------------------------------------------------------
1333  // QRMode
1334  //---------------------------------------------------------------------
1335
1336  var QRMode = {
1337    MODE_NUMBER :    1 << 0,
1338    MODE_ALPHA_NUM : 1 << 1,
1339    MODE_8BIT_BYTE : 1 << 2,
1340    MODE_KANJI :     1 << 3
1341  };
1342
1343  //---------------------------------------------------------------------
1344  // QRErrorCorrectionLevel
1345  //---------------------------------------------------------------------
1346
1347  var QRErrorCorrectionLevel = {
1348    L : 1,
1349    M : 0,
1350    Q : 3,
1351    H : 2
1352  };
1353
1354  //---------------------------------------------------------------------
1355  // QRMaskPattern
1356  //---------------------------------------------------------------------
1357
1358  var QRMaskPattern = {
1359    PATTERN000 : 0,
1360    PATTERN001 : 1,
1361    PATTERN010 : 2,
1362    PATTERN011 : 3,
1363    PATTERN100 : 4,
1364    PATTERN101 : 5,
1365    PATTERN110 : 6,
1366    PATTERN111 : 7
1367  };
1368
1369  //---------------------------------------------------------------------
1370  // QRUtil
1371  //---------------------------------------------------------------------
1372
1373  var QRUtil = function() {
1374
1375    var PATTERN_POSITION_TABLE = [
1376      [],
1377      [6, 18],
1378      [6, 22],
1379      [6, 26],
1380      [6, 30],
1381      [6, 34],
1382      [6, 22, 38],
1383      [6, 24, 42],
1384      [6, 26, 46],
1385      [6, 28, 50],
1386      [6, 30, 54],
1387      [6, 32, 58],
1388      [6, 34, 62],
1389      [6, 26, 46, 66],
1390      [6, 26, 48, 70],
1391      [6, 26, 50, 74],
1392      [6, 30, 54, 78],
1393      [6, 30, 56, 82],
1394      [6, 30, 58, 86],
1395      [6, 34, 62, 90],
1396      [6, 28, 50, 72, 94],
1397      [6, 26, 50, 74, 98],
1398      [6, 30, 54, 78, 102],
1399      [6, 28, 54, 80, 106],
1400      [6, 32, 58, 84, 110],
1401      [6, 30, 58, 86, 114],
1402      [6, 34, 62, 90, 118],
1403      [6, 26, 50, 74, 98, 122],
1404      [6, 30, 54, 78, 102, 126],
1405      [6, 26, 52, 78, 104, 130],
1406      [6, 30, 56, 82, 108, 134],
1407      [6, 34, 60, 86, 112, 138],
1408      [6, 30, 58, 86, 114, 142],
1409      [6, 34, 62, 90, 118, 146],
1410      [6, 30, 54, 78, 102, 126, 150],
1411      [6, 24, 50, 76, 102, 128, 154],
1412      [6, 28, 54, 80, 106, 132, 158],
1413      [6, 32, 58, 84, 110, 136, 162],
1414      [6, 26, 54, 82, 110, 138, 166],
1415      [6, 30, 58, 86, 114, 142, 170]
1416    ];
1417    var G15 = (1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | (1 << 0);
1418    var G18 = (1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | (1 << 5) | (1 << 2) | (1 << 0);
1419    var G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1);
1420
1421    var _this = {};
1422
1423    var getBCHDigit = function(data) {
1424      var digit = 0;
1425      while (data != 0) {
1426        digit += 1;
1427        data >>>= 1;
1428      }
1429      return digit;
1430    };
1431
1432    _this.getBCHTypeInfo = function(data) {
1433      var d = data << 10;
1434      while (getBCHDigit(d) - getBCHDigit(G15) >= 0) {
1435        d ^= (G15 << (getBCHDigit(d) - getBCHDigit(G15) ) );
1436      }
1437      return ( (data << 10) | d) ^ G15_MASK;
1438    };
1439
1440    _this.getBCHTypeNumber = function(data) {
1441      var d = data << 12;
1442      while (getBCHDigit(d) - getBCHDigit(G18) >= 0) {
1443        d ^= (G18 << (getBCHDigit(d) - getBCHDigit(G18) ) );
1444      }
1445      return (data << 12) | d;
1446    };
1447
1448    _this.getPatternPosition = function(typeNumber) {
1449      return PATTERN_POSITION_TABLE[typeNumber - 1];
1450    };
1451
1452    _this.getMaskFunction = function(maskPattern) {
1453
1454      switch (maskPattern) {
1455
1456      case QRMaskPattern.PATTERN000 :
1457        return function(i, j) { return (i + j) % 2 == 0; };
1458      case QRMaskPattern.PATTERN001 :
1459        return function(i, j) { return i % 2 == 0; };
1460      case QRMaskPattern.PATTERN010 :
1461        return function(i, j) { return j % 3 == 0; };
1462      case QRMaskPattern.PATTERN011 :
1463        return function(i, j) { return (i + j) % 3 == 0; };
1464      case QRMaskPattern.PATTERN100 :
1465        return function(i, j) { return (Math.floor(i / 2) + Math.floor(j / 3) ) % 2 == 0; };
1466      case QRMaskPattern.PATTERN101 :
1467        return function(i, j) { return (i * j) % 2 + (i * j) % 3 == 0; };
1468      case QRMaskPattern.PATTERN110 :
1469        return function(i, j) { return ( (i * j) % 2 + (i * j) % 3) % 2 == 0; };
1470      case QRMaskPattern.PATTERN111 :
1471        return function(i, j) { return ( (i * j) % 3 + (i + j) % 2) % 2 == 0; };
1472
1473      default :
1474        throw 'bad maskPattern:' + maskPattern;
1475      }
1476    };
1477
1478    _this.getErrorCorrectPolynomial = function(errorCorrectLength) {
1479      var a = qrPolynomial([1], 0);
1480      for (var i = 0; i < errorCorrectLength; i += 1) {
1481        a = a.multiply(qrPolynomial([1, QRMath.gexp(i)], 0) );
1482      }
1483      return a;
1484    };
1485
1486    _this.getLengthInBits = function(mode, type) {
1487
1488      if (1 <= type && type < 10) {
1489
1490        // 1 - 9
1491
1492        switch(mode) {
1493        case QRMode.MODE_NUMBER    : return 10;
1494        case QRMode.MODE_ALPHA_NUM : return 9;
1495        case QRMode.MODE_8BIT_BYTE : return 8;
1496        case QRMode.MODE_KANJI     : return 8;
1497        default :
1498          throw 'mode:' + mode;
1499        }
1500
1501      } else if (type < 27) {
1502
1503        // 10 - 26
1504
1505        switch(mode) {
1506        case QRMode.MODE_NUMBER    : return 12;
1507        case QRMode.MODE_ALPHA_NUM : return 11;
1508        case QRMode.MODE_8BIT_BYTE : return 16;
1509        case QRMode.MODE_KANJI     : return 10;
1510        default :
1511          throw 'mode:' + mode;
1512        }
1513
1514      } else if (type < 41) {
1515
1516        // 27 - 40
1517
1518        switch(mode) {
1519        case QRMode.MODE_NUMBER    : return 14;
1520        case QRMode.MODE_ALPHA_NUM : return 13;
1521        case QRMode.MODE_8BIT_BYTE : return 16;
1522        case QRMode.MODE_KANJI     : return 12;
1523        default :
1524          throw 'mode:' + mode;
1525        }
1526
1527      } else {
1528        throw 'type:' + type;
1529      }
1530    };
1531
1532    _this.getLostPoint = function(qrcode) {
1533
1534      var moduleCount = qrcode.getModuleCount();
1535
1536      var lostPoint = 0;
1537
1538      // LEVEL1
1539
1540      for (var row = 0; row < moduleCount; row += 1) {
1541        for (var col = 0; col < moduleCount; col += 1) {
1542
1543          var sameCount = 0;
1544          var dark = qrcode.isDark(row, col);
1545
1546          for (var r = -1; r <= 1; r += 1) {
1547
1548            if (row + r < 0 || moduleCount <= row + r) {
1549              continue;
1550            }
1551
1552            for (var c = -1; c <= 1; c += 1) {
1553
1554              if (col + c < 0 || moduleCount <= col + c) {
1555                continue;
1556              }
1557
1558              if (r == 0 && c == 0) {
1559                continue;
1560              }
1561
1562              if (dark == qrcode.isDark(row + r, col + c) ) {
1563                sameCount += 1;
1564              }
1565            }
1566          }
1567
1568          if (sameCount > 5) {
1569            lostPoint += (3 + sameCount - 5);
1570          }
1571        }
1572      };
1573
1574      // LEVEL2
1575
1576      for (var row = 0; row < moduleCount - 1; row += 1) {
1577        for (var col = 0; col < moduleCount - 1; col += 1) {
1578          var count = 0;
1579          if (qrcode.isDark(row, col) ) count += 1;
1580          if (qrcode.isDark(row + 1, col) ) count += 1;
1581          if (qrcode.isDark(row, col + 1) ) count += 1;
1582          if (qrcode.isDark(row + 1, col + 1) ) count += 1;
1583          if (count == 0 || count == 4) {
1584            lostPoint += 3;
1585          }
1586        }
1587      }
1588
1589      // LEVEL3
1590
1591      for (var row = 0; row < moduleCount; row += 1) {
1592        for (var col = 0; col < moduleCount - 6; col += 1) {
1593          if (qrcode.isDark(row, col)
1594              && !qrcode.isDark(row, col + 1)
1595              &&  qrcode.isDark(row, col + 2)
1596              &&  qrcode.isDark(row, col + 3)
1597              &&  qrcode.isDark(row, col + 4)
1598              && !qrcode.isDark(row, col + 5)
1599              &&  qrcode.isDark(row, col + 6) ) {
1600            lostPoint += 40;
1601          }
1602        }
1603      }
1604
1605      for (var col = 0; col < moduleCount; col += 1) {
1606        for (var row = 0; row < moduleCount - 6; row += 1) {
1607          if (qrcode.isDark(row, col)
1608              && !qrcode.isDark(row + 1, col)
1609              &&  qrcode.isDark(row + 2, col)
1610              &&  qrcode.isDark(row + 3, col)
1611              &&  qrcode.isDark(row + 4, col)
1612              && !qrcode.isDark(row + 5, col)
1613              &&  qrcode.isDark(row + 6, col) ) {
1614            lostPoint += 40;
1615          }
1616        }
1617      }
1618
1619      // LEVEL4
1620
1621      var darkCount = 0;
1622
1623      for (var col = 0; col < moduleCount; col += 1) {
1624        for (var row = 0; row < moduleCount; row += 1) {
1625          if (qrcode.isDark(row, col) ) {
1626            darkCount += 1;
1627          }
1628        }
1629      }
1630
1631      var ratio = Math.abs(100 * darkCount / moduleCount / moduleCount - 50) / 5;
1632      lostPoint += ratio * 10;
1633
1634      return lostPoint;
1635    };
1636
1637    return _this;
1638  }();
1639
1640  //---------------------------------------------------------------------
1641  // QRMath
1642  //---------------------------------------------------------------------
1643
1644  var QRMath = function() {
1645
1646    var EXP_TABLE = new Array(256);
1647    var LOG_TABLE = new Array(256);
1648
1649    // initialize tables
1650    for (var i = 0; i < 8; i += 1) {
1651      EXP_TABLE[i] = 1 << i;
1652    }
1653    for (var i = 8; i < 256; i += 1) {
1654      EXP_TABLE[i] = EXP_TABLE[i - 4]
1655        ^ EXP_TABLE[i - 5]
1656        ^ EXP_TABLE[i - 6]
1657        ^ EXP_TABLE[i - 8];
1658    }
1659    for (var i = 0; i < 255; i += 1) {
1660      LOG_TABLE[EXP_TABLE[i] ] = i;
1661    }
1662
1663    var _this = {};
1664
1665    _this.glog = function(n) {
1666
1667      if (n < 1) {
1668        throw 'glog(' + n + ')';
1669      }
1670
1671      return LOG_TABLE[n];
1672    };
1673
1674    _this.gexp = function(n) {
1675
1676      while (n < 0) {
1677        n += 255;
1678      }
1679
1680      while (n >= 256) {
1681        n -= 255;
1682      }
1683
1684      return EXP_TABLE[n];
1685    };
1686
1687    return _this;
1688  }();
1689
1690  //---------------------------------------------------------------------
1691  // qrPolynomial
1692  //---------------------------------------------------------------------
1693
1694  function qrPolynomial(num, shift) {
1695
1696    if (typeof num.length == 'undefined') {
1697      throw num.length + '/' + shift;
1698    }
1699
1700    var _num = function() {
1701      var offset = 0;
1702      while (offset < num.length && num[offset] == 0) {
1703        offset += 1;
1704      }
1705      var _num = new Array(num.length - offset + shift);
1706      for (var i = 0; i < num.length - offset; i += 1) {
1707        _num[i] = num[i + offset];
1708      }
1709      return _num;
1710    }();
1711
1712    var _this = {};
1713
1714    _this.getAt = function(index) {
1715      return _num[index];
1716    };
1717
1718    _this.getLength = function() {
1719      return _num.length;
1720    };
1721
1722    _this.multiply = function(e) {
1723
1724      var num = new Array(_this.getLength() + e.getLength() - 1);
1725
1726      for (var i = 0; i < _this.getLength(); i += 1) {
1727        for (var j = 0; j < e.getLength(); j += 1) {
1728          num[i + j] ^= QRMath.gexp(QRMath.glog(_this.getAt(i) ) + QRMath.glog(e.getAt(j) ) );
1729        }
1730      }
1731
1732      return qrPolynomial(num, 0);
1733    };
1734
1735    _this.mod = function(e) {
1736
1737      if (_this.getLength() - e.getLength() < 0) {
1738        return _this;
1739      }
1740
1741      var ratio = QRMath.glog(_this.getAt(0) ) - QRMath.glog(e.getAt(0) );
1742
1743      var num = new Array(_this.getLength() );
1744      for (var i = 0; i < _this.getLength(); i += 1) {
1745        num[i] = _this.getAt(i);
1746      }
1747
1748      for (var i = 0; i < e.getLength(); i += 1) {
1749        num[i] ^= QRMath.gexp(QRMath.glog(e.getAt(i) ) + ratio);
1750      }
1751
1752      // recursive call
1753      return qrPolynomial(num, 0).mod(e);
1754    };
1755
1756    return _this;
1757  };
1758
1759  //---------------------------------------------------------------------
1760  // QRRSBlock
1761  //---------------------------------------------------------------------
1762
1763  var QRRSBlock = function() {
1764
1765    var RS_BLOCK_TABLE = [
1766
1767      // L
1768      // M
1769      // Q
1770      // H
1771
1772      // 1
1773      [1, 26, 19],
1774      [1, 26, 16],
1775      [1, 26, 13],
1776      [1, 26, 9],
1777
1778      // 2
1779      [1, 44, 34],
1780      [1, 44, 28],
1781      [1, 44, 22],
1782      [1, 44, 16],
1783
1784      // 3
1785      [1, 70, 55],
1786      [1, 70, 44],
1787      [2, 35, 17],
1788      [2, 35, 13],
1789
1790      // 4
1791      [1, 100, 80],
1792      [2, 50, 32],
1793      [2, 50, 24],
1794      [4, 25, 9],
1795
1796      // 5
1797      [1, 134, 108],
1798      [2, 67, 43],
1799      [2, 33, 15, 2, 34, 16],
1800      [2, 33, 11, 2, 34, 12],
1801
1802      // 6
1803      [2, 86, 68],
1804      [4, 43, 27],
1805      [4, 43, 19],
1806      [4, 43, 15],
1807
1808      // 7
1809      [2, 98, 78],
1810      [4, 49, 31],
1811      [2, 32, 14, 4, 33, 15],
1812      [4, 39, 13, 1, 40, 14],
1813
1814      // 8
1815      [2, 121, 97],
1816      [2, 60, 38, 2, 61, 39],
1817      [4, 40, 18, 2, 41, 19],
1818      [4, 40, 14, 2, 41, 15],
1819
1820      // 9
1821      [2, 146, 116],
1822      [3, 58, 36, 2, 59, 37],
1823      [4, 36, 16, 4, 37, 17],
1824      [4, 36, 12, 4, 37, 13],
1825
1826      // 10
1827      [2, 86, 68, 2, 87, 69],
1828      [4, 69, 43, 1, 70, 44],
1829      [6, 43, 19, 2, 44, 20],
1830      [6, 43, 15, 2, 44, 16],
1831
1832      // 11
1833      [4, 101, 81],
1834      [1, 80, 50, 4, 81, 51],
1835      [4, 50, 22, 4, 51, 23],
1836      [3, 36, 12, 8, 37, 13],
1837
1838      // 12
1839      [2, 116, 92, 2, 117, 93],
1840      [6, 58, 36, 2, 59, 37],
1841      [4, 46, 20, 6, 47, 21],
1842      [7, 42, 14, 4, 43, 15],
1843
1844      // 13
1845      [4, 133, 107],
1846      [8, 59, 37, 1, 60, 38],
1847      [8, 44, 20, 4, 45, 21],
1848      [12, 33, 11, 4, 34, 12],
1849
1850      // 14
1851      [3, 145, 115, 1, 146, 116],
1852      [4, 64, 40, 5, 65, 41],
1853      [11, 36, 16, 5, 37, 17],
1854      [11, 36, 12, 5, 37, 13],
1855
1856      // 15
1857      [5, 109, 87, 1, 110, 88],
1858      [5, 65, 41, 5, 66, 42],
1859      [5, 54, 24, 7, 55, 25],
1860      [11, 36, 12, 7, 37, 13],
1861
1862      // 16
1863      [5, 122, 98, 1, 123, 99],
1864      [7, 73, 45, 3, 74, 46],
1865      [15, 43, 19, 2, 44, 20],
1866      [3, 45, 15, 13, 46, 16],
1867
1868      // 17
1869      [1, 135, 107, 5, 136, 108],
1870      [10, 74, 46, 1, 75, 47],
1871      [1, 50, 22, 15, 51, 23],
1872      [2, 42, 14, 17, 43, 15],
1873
1874      // 18
1875      [5, 150, 120, 1, 151, 121],
1876      [9, 69, 43, 4, 70, 44],
1877      [17, 50, 22, 1, 51, 23],
1878      [2, 42, 14, 19, 43, 15],
1879
1880      // 19
1881      [3, 141, 113, 4, 142, 114],
1882      [3, 70, 44, 11, 71, 45],
1883      [17, 47, 21, 4, 48, 22],
1884      [9, 39, 13, 16, 40, 14],
1885
1886      // 20
1887      [3, 135, 107, 5, 136, 108],
1888      [3, 67, 41, 13, 68, 42],
1889      [15, 54, 24, 5, 55, 25],
1890      [15, 43, 15, 10, 44, 16],
1891
1892      // 21
1893      [4, 144, 116, 4, 145, 117],
1894      [17, 68, 42],
1895      [17, 50, 22, 6, 51, 23],
1896      [19, 46, 16, 6, 47, 17],
1897
1898      // 22
1899      [2, 139, 111, 7, 140, 112],
1900      [17, 74, 46],
1901      [7, 54, 24, 16, 55, 25],
1902      [34, 37, 13],
1903
1904      // 23
1905      [4, 151, 121, 5, 152, 122],
1906      [4, 75, 47, 14, 76, 48],
1907      [11, 54, 24, 14, 55, 25],
1908      [16, 45, 15, 14, 46, 16],
1909
1910      // 24
1911      [6, 147, 117, 4, 148, 118],
1912      [6, 73, 45, 14, 74, 46],
1913      [11, 54, 24, 16, 55, 25],
1914      [30, 46, 16, 2, 47, 17],
1915
1916      // 25
1917      [8, 132, 106, 4, 133, 107],
1918      [8, 75, 47, 13, 76, 48],
1919      [7, 54, 24, 22, 55, 25],
1920      [22, 45, 15, 13, 46, 16],
1921
1922      // 26
1923      [10, 142, 114, 2, 143, 115],
1924      [19, 74, 46, 4, 75, 47],
1925      [28, 50, 22, 6, 51, 23],
1926      [33, 46, 16, 4, 47, 17],
1927
1928      // 27
1929      [8, 152, 122, 4, 153, 123],
1930      [22, 73, 45, 3, 74, 46],
1931      [8, 53, 23, 26, 54, 24],
1932      [12, 45, 15, 28, 46, 16],
1933
1934      // 28
1935      [3, 147, 117, 10, 148, 118],
1936      [3, 73, 45, 23, 74, 46],
1937      [4, 54, 24, 31, 55, 25],
1938      [11, 45, 15, 31, 46, 16],
1939
1940      // 29
1941      [7, 146, 116, 7, 147, 117],
1942      [21, 73, 45, 7, 74, 46],
1943      [1, 53, 23, 37, 54, 24],
1944      [19, 45, 15, 26, 46, 16],
1945
1946      // 30
1947      [5, 145, 115, 10, 146, 116],
1948      [19, 75, 47, 10, 76, 48],
1949      [15, 54, 24, 25, 55, 25],
1950      [23, 45, 15, 25, 46, 16],
1951
1952      // 31
1953      [13, 145, 115, 3, 146, 116],
1954      [2, 74, 46, 29, 75, 47],
1955      [42, 54, 24, 1, 55, 25],
1956      [23, 45, 15, 28, 46, 16],
1957
1958      // 32
1959      [17, 145, 115],
1960      [10, 74, 46, 23, 75, 47],
1961      [10, 54, 24, 35, 55, 25],
1962      [19, 45, 15, 35, 46, 16],
1963
1964      // 33
1965      [17, 145, 115, 1, 146, 116],
1966      [14, 74, 46, 21, 75, 47],
1967      [29, 54, 24, 19, 55, 25],
1968      [11, 45, 15, 46, 46, 16],
1969
1970      // 34
1971      [13, 145, 115, 6, 146, 116],
1972      [14, 74, 46, 23, 75, 47],
1973      [44, 54, 24, 7, 55, 25],
1974      [59, 46, 16, 1, 47, 17],
1975
1976      // 35
1977      [12, 151, 121, 7, 152, 122],
1978      [12, 75, 47, 26, 76, 48],
1979      [39, 54, 24, 14, 55, 25],
1980      [22, 45, 15, 41, 46, 16],
1981
1982      // 36
1983      [6, 151, 121, 14, 152, 122],
1984      [6, 75, 47, 34, 76, 48],
1985      [46, 54, 24, 10, 55, 25],
1986      [2, 45, 15, 64, 46, 16],
1987
1988      // 37
1989      [17, 152, 122, 4, 153, 123],
1990      [29, 74, 46, 14, 75, 47],
1991      [49, 54, 24, 10, 55, 25],
1992      [24, 45, 15, 46, 46, 16],
1993
1994      // 38
1995      [4, 152, 122, 18, 153, 123],
1996      [13, 74, 46, 32, 75, 47],
1997      [48, 54, 24, 14, 55, 25],
1998      [42, 45, 15, 32, 46, 16],
1999
2000      // 39
2001      [20, 147, 117, 4, 148, 118],
2002      [40, 75, 47, 7, 76, 48],
2003      [43, 54, 24, 22, 55, 25],
2004      [10, 45, 15, 67, 46, 16],
2005
2006      // 40
2007      [19, 148, 118, 6, 149, 119],
2008      [18, 75, 47, 31, 76, 48],
2009      [34, 54, 24, 34, 55, 25],
2010      [20, 45, 15, 61, 46, 16]
2011    ];
2012
2013    var qrRSBlock = function(totalCount, dataCount) {
2014      var _this = {};
2015      _this.totalCount = totalCount;
2016      _this.dataCount = dataCount;
2017      return _this;
2018    };
2019
2020    var _this = {};
2021
2022    var getRsBlockTable = function(typeNumber, errorCorrectionLevel) {
2023
2024      switch(errorCorrectionLevel) {
2025      case QRErrorCorrectionLevel.L :
2026        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 0];
2027      case QRErrorCorrectionLevel.M :
2028        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 1];
2029      case QRErrorCorrectionLevel.Q :
2030        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 2];
2031      case QRErrorCorrectionLevel.H :
2032        return RS_BLOCK_TABLE[(typeNumber - 1) * 4 + 3];
2033      default :
2034        return undefined;
2035      }
2036    };
2037
2038    _this.getRSBlocks = function(typeNumber, errorCorrectionLevel) {
2039
2040      var rsBlock = getRsBlockTable(typeNumber, errorCorrectionLevel);
2041
2042      if (typeof rsBlock == 'undefined') {
2043        throw 'bad rs block @ typeNumber:' + typeNumber +
2044            '/errorCorrectionLevel:' + errorCorrectionLevel;
2045      }
2046
2047      var length = rsBlock.length / 3;
2048
2049      var list = [];
2050
2051      for (var i = 0; i < length; i += 1) {
2052
2053        var count = rsBlock[i * 3 + 0];
2054        var totalCount = rsBlock[i * 3 + 1];
2055        var dataCount = rsBlock[i * 3 + 2];
2056
2057        for (var j = 0; j < count; j += 1) {
2058          list.push(qrRSBlock(totalCount, dataCount) );
2059        }
2060      }
2061
2062      return list;
2063    };
2064
2065    return _this;
2066  }();
2067
2068  //---------------------------------------------------------------------
2069  // qrBitBuffer
2070  //---------------------------------------------------------------------
2071
2072  var qrBitBuffer = function() {
2073
2074    var _buffer = [];
2075    var _length = 0;
2076
2077    var _this = {};
2078
2079    _this.getBuffer = function() {
2080      return _buffer;
2081    };
2082
2083    _this.getAt = function(index) {
2084      var bufIndex = Math.floor(index / 8);
2085      return ( (_buffer[bufIndex] >>> (7 - index % 8) ) & 1) == 1;
2086    };
2087
2088    _this.put = function(num, length) {
2089      for (var i = 0; i < length; i += 1) {
2090        _this.putBit( ( (num >>> (length - i - 1) ) & 1) == 1);
2091      }
2092    };
2093
2094    _this.getLengthInBits = function() {
2095      return _length;
2096    };
2097
2098    _this.putBit = function(bit) {
2099
2100      var bufIndex = Math.floor(_length / 8);
2101      if (_buffer.length <= bufIndex) {
2102        _buffer.push(0);
2103      }
2104
2105      if (bit) {
2106        _buffer[bufIndex] |= (0x80 >>> (_length % 8) );
2107      }
2108
2109      _length += 1;
2110    };
2111
2112    return _this;
2113  };
2114
2115  //---------------------------------------------------------------------
2116  // qrNumber
2117  //---------------------------------------------------------------------
2118
2119  var qrNumber = function(data) {
2120
2121    var _mode = QRMode.MODE_NUMBER;
2122    var _data = data;
2123
2124    var _this = {};
2125
2126    _this.getMode = function() {
2127      return _mode;
2128    };
2129
2130    _this.getLength = function(buffer) {
2131      return _data.length;
2132    };
2133
2134    _this.write = function(buffer) {
2135
2136      var data = _data;
2137
2138      var i = 0;
2139
2140      while (i + 2 < data.length) {
2141        buffer.put(strToNum(data.substring(i, i + 3) ), 10);
2142        i += 3;
2143      }
2144
2145      if (i < data.length) {
2146        if (data.length - i == 1) {
2147          buffer.put(strToNum(data.substring(i, i + 1) ), 4);
2148        } else if (data.length - i == 2) {
2149          buffer.put(strToNum(data.substring(i, i + 2) ), 7);
2150        }
2151      }
2152    };
2153
2154    var strToNum = function(s) {
2155      var num = 0;
2156      for (var i = 0; i < s.length; i += 1) {
2157        num = num * 10 + chatToNum(s.charAt(i) );
2158      }
2159      return num;
2160    };
2161
2162    var chatToNum = function(c) {
2163      if ('0' <= c && c <= '9') {
2164        return c.charCodeAt(0) - '0'.charCodeAt(0);
2165      }
2166      throw 'illegal char :' + c;
2167    };
2168
2169    return _this;
2170  };
2171
2172  //---------------------------------------------------------------------
2173  // qrAlphaNum
2174  //---------------------------------------------------------------------
2175
2176  var qrAlphaNum = function(data) {
2177
2178    var _mode = QRMode.MODE_ALPHA_NUM;
2179    var _data = data;
2180
2181    var _this = {};
2182
2183    _this.getMode = function() {
2184      return _mode;
2185    };
2186
2187    _this.getLength = function(buffer) {
2188      return _data.length;
2189    };
2190
2191    _this.write = function(buffer) {
2192
2193      var s = _data;
2194
2195      var i = 0;
2196
2197      while (i + 1 < s.length) {
2198        buffer.put(
2199          getCode(s.charAt(i) ) * 45 +
2200          getCode(s.charAt(i + 1) ), 11);
2201        i += 2;
2202      }
2203
2204      if (i < s.length) {
2205        buffer.put(getCode(s.charAt(i) ), 6);
2206      }
2207    };
2208
2209    var getCode = function(c) {
2210
2211      if ('0' <= c && c <= '9') {
2212        return c.charCodeAt(0) - '0'.charCodeAt(0);
2213      } else if ('A' <= c && c <= 'Z') {
2214        return c.charCodeAt(0) - 'A'.charCodeAt(0) + 10;
2215      } else {
2216        switch (c) {
2217        case ' ' : return 36;
2218        case '$' : return 37;
2219        case '%' : return 38;
2220        case '*' : return 39;
2221        case '+' : return 40;
2222        case '-' : return 41;
2223        case '.' : return 42;
2224        case '/' : return 43;
2225        case ':' : return 44;
2226        default :
2227          throw 'illegal char :' + c;
2228        }
2229      }
2230    };
2231
2232    return _this;
2233  };
2234
2235  //---------------------------------------------------------------------
2236  // qr8BitByte
2237  //---------------------------------------------------------------------
2238
2239  var qr8BitByte = function(data) {
2240
2241    var _mode = QRMode.MODE_8BIT_BYTE;
2242    var _data = data;
2243    var _bytes = qrcode.stringToBytes(data);
2244
2245    var _this = {};
2246
2247    _this.getMode = function() {
2248      return _mode;
2249    };
2250
2251    _this.getLength = function(buffer) {
2252      return _bytes.length;
2253    };
2254
2255    _this.write = function(buffer) {
2256      for (var i = 0; i < _bytes.length; i += 1) {
2257        buffer.put(_bytes[i], 8);
2258      }
2259    };
2260
2261    return _this;
2262  };
2263
2264  //---------------------------------------------------------------------
2265  // qrKanji
2266  //---------------------------------------------------------------------
2267
2268  var qrKanji = function(data) {
2269
2270    var _mode = QRMode.MODE_KANJI;
2271    var _data = data;
2272
2273    var stringToBytes = qrcode.stringToBytesFuncs['SJIS'];
2274    if (!stringToBytes) {
2275      throw 'sjis not supported.';
2276    }
2277    !function(c, code) {
2278      // self test for sjis support.
2279      var test = stringToBytes(c);
2280      if (test.length != 2 || ( (test[0] << 8) | test[1]) != code) {
2281        throw 'sjis not supported.';
2282      }
2283    }('\u53cb', 0x9746);
2284
2285    var _bytes = stringToBytes(data);
2286
2287    var _this = {};
2288
2289    _this.getMode = function() {
2290      return _mode;
2291    };
2292
2293    _this.getLength = function(buffer) {
2294      return ~~(_bytes.length / 2);
2295    };
2296
2297    _this.write = function(buffer) {
2298
2299      var data = _bytes;
2300
2301      var i = 0;
2302
2303      while (i + 1 < data.length) {
2304
2305        var c = ( (0xff & data[i]) << 8) | (0xff & data[i + 1]);
2306
2307        if (0x8140 <= c && c <= 0x9FFC) {
2308          c -= 0x8140;
2309        } else if (0xE040 <= c && c <= 0xEBBF) {
2310          c -= 0xC140;
2311        } else {
2312          throw 'illegal char at ' + (i + 1) + '/' + c;
2313        }
2314
2315        c = ( (c >>> 8) & 0xff) * 0xC0 + (c & 0xff);
2316
2317        buffer.put(c, 13);
2318
2319        i += 2;
2320      }
2321
2322      if (i < data.length) {
2323        throw 'illegal char at ' + (i + 1);
2324      }
2325    };
2326
2327    return _this;
2328  };
2329
2330  //=====================================================================
2331  // GIF Support etc.
2332  //
2333
2334  //---------------------------------------------------------------------
2335  // byteArrayOutputStream
2336  //---------------------------------------------------------------------
2337
2338  var byteArrayOutputStream = function() {
2339
2340    var _bytes = [];
2341
2342    var _this = {};
2343
2344    _this.writeByte = function(b) {
2345      _bytes.push(b & 0xff);
2346    };
2347
2348    _this.writeShort = function(i) {
2349      _this.writeByte(i);
2350      _this.writeByte(i >>> 8);
2351    };
2352
2353    _this.writeBytes = function(b, off, len) {
2354      off = off || 0;
2355      len = len || b.length;
2356      for (var i = 0; i < len; i += 1) {
2357        _this.writeByte(b[i + off]);
2358      }
2359    };
2360
2361    _this.writeString = function(s) {
2362      for (var i = 0; i < s.length; i += 1) {
2363        _this.writeByte(s.charCodeAt(i) );
2364      }
2365    };
2366
2367    _this.toByteArray = function() {
2368      return _bytes;
2369    };
2370
2371    _this.toString = function() {
2372      var s = '';
2373      s += '[';
2374      for (var i = 0; i < _bytes.length; i += 1) {
2375        if (i > 0) {
2376          s += ',';
2377        }
2378        s += _bytes[i];
2379      }
2380      s += ']';
2381      return s;
2382    };
2383
2384    return _this;
2385  };
2386
2387  //---------------------------------------------------------------------
2388  // base64EncodeOutputStream
2389  //---------------------------------------------------------------------
2390
2391  var base64EncodeOutputStream = function() {
2392
2393    var _buffer = 0;
2394    var _buflen = 0;
2395    var _length = 0;
2396    var _base64 = '';
2397
2398    var _this = {};
2399
2400    var writeEncoded = function(b) {
2401      _base64 += String.fromCharCode(encode(b & 0x3f) );
2402    };
2403
2404    var encode = function(n) {
2405      if (n < 0) {
2406        // error.
2407      } else if (n < 26) {
2408        return 0x41 + n;
2409      } else if (n < 52) {
2410        return 0x61 + (n - 26);
2411      } else if (n < 62) {
2412        return 0x30 + (n - 52);
2413      } else if (n == 62) {
2414        return 0x2b;
2415      } else if (n == 63) {
2416        return 0x2f;
2417      }
2418      throw 'n:' + n;
2419    };
2420
2421    _this.writeByte = function(n) {
2422
2423      _buffer = (_buffer << 8) | (n & 0xff);
2424      _buflen += 8;
2425      _length += 1;
2426
2427      while (_buflen >= 6) {
2428        writeEncoded(_buffer >>> (_buflen - 6) );
2429        _buflen -= 6;
2430      }
2431    };
2432
2433    _this.flush = function() {
2434
2435      if (_buflen > 0) {
2436        writeEncoded(_buffer << (6 - _buflen) );
2437        _buffer = 0;
2438        _buflen = 0;
2439      }
2440
2441      if (_length % 3 != 0) {
2442        // padding
2443        var padlen = 3 - _length % 3;
2444        for (var i = 0; i < padlen; i += 1) {
2445          _base64 += '=';
2446        }
2447      }
2448    };
2449
2450    _this.toString = function() {
2451      return _base64;
2452    };
2453
2454    return _this;
2455  };
2456
2457  //---------------------------------------------------------------------
2458  // base64DecodeInputStream
2459  //---------------------------------------------------------------------
2460
2461  var base64DecodeInputStream = function(str) {
2462
2463    var _str = str;
2464    var _pos = 0;
2465    var _buffer = 0;
2466    var _buflen = 0;
2467
2468    var _this = {};
2469
2470    _this.read = function() {
2471
2472      while (_buflen < 8) {
2473
2474        if (_pos >= _str.length) {
2475          if (_buflen == 0) {
2476            return -1;
2477          }
2478          throw 'unexpected end of file./' + _buflen;
2479        }
2480
2481        var c = _str.charAt(_pos);
2482        _pos += 1;
2483
2484        if (c == '=') {
2485          _buflen = 0;
2486          return -1;
2487        } else if (c.match(/^\s$/) ) {
2488          // ignore if whitespace.
2489          continue;
2490        }
2491
2492        _buffer = (_buffer << 6) | decode(c.charCodeAt(0) );
2493        _buflen += 6;
2494      }
2495
2496      var n = (_buffer >>> (_buflen - 8) ) & 0xff;
2497      _buflen -= 8;
2498      return n;
2499    };
2500
2501    var decode = function(c) {
2502      if (0x41 <= c && c <= 0x5a) {
2503        return c - 0x41;
2504      } else if (0x61 <= c && c <= 0x7a) {
2505        return c - 0x61 + 26;
2506      } else if (0x30 <= c && c <= 0x39) {
2507        return c - 0x30 + 52;
2508      } else if (c == 0x2b) {
2509        return 62;
2510      } else if (c == 0x2f) {
2511        return 63;
2512      } else {
2513        throw 'c:' + c;
2514      }
2515    };
2516
2517    return _this;
2518  };
2519
2520  //---------------------------------------------------------------------
2521  // gifImage (B/W)
2522  //---------------------------------------------------------------------
2523
2524  var gifImage = function(width, height) {
2525
2526    var _width = width;
2527    var _height = height;
2528    var _data = new Array(width * height);
2529
2530    var _this = {};
2531
2532    _this.setPixel = function(x, y, pixel) {
2533      _data[y * _width + x] = pixel;
2534    };
2535
2536    _this.write = function(out) {
2537
2538      //---------------------------------
2539      // GIF Signature
2540
2541      out.writeString('GIF87a');
2542
2543      //---------------------------------
2544      // Screen Descriptor
2545
2546      out.writeShort(_width);
2547      out.writeShort(_height);
2548
2549      out.writeByte(0x80); // 2bit
2550      out.writeByte(0);
2551      out.writeByte(0);
2552
2553      //---------------------------------
2554      // Global Color Map
2555
2556      // black
2557      out.writeByte(0x00);
2558      out.writeByte(0x00);
2559      out.writeByte(0x00);
2560
2561      // white
2562      out.writeByte(0xff);
2563      out.writeByte(0xff);
2564      out.writeByte(0xff);
2565
2566      //---------------------------------
2567      // Image Descriptor
2568
2569      out.writeString(',');
2570      out.writeShort(0);
2571      out.writeShort(0);
2572      out.writeShort(_width);
2573      out.writeShort(_height);
2574      out.writeByte(0);
2575
2576      //---------------------------------
2577      // Local Color Map
2578
2579      //---------------------------------
2580      // Raster Data
2581
2582      var lzwMinCodeSize = 2;
2583      var raster = getLZWRaster(lzwMinCodeSize);
2584
2585      out.writeByte(lzwMinCodeSize);
2586
2587      var offset = 0;
2588
2589      while (raster.length - offset > 255) {
2590        out.writeByte(255);
2591        out.writeBytes(raster, offset, 255);
2592        offset += 255;
2593      }
2594
2595      out.writeByte(raster.length - offset);
2596      out.writeBytes(raster, offset, raster.length - offset);
2597      out.writeByte(0x00);
2598
2599      //---------------------------------
2600      // GIF Terminator
2601      out.writeString(';');
2602    };
2603
2604    var bitOutputStream = function(out) {
2605
2606      var _out = out;
2607      var _bitLength = 0;
2608      var _bitBuffer = 0;
2609
2610      var _this = {};
2611
2612      _this.write = function(data, length) {
2613
2614        if ( (data >>> length) != 0) {
2615          throw 'length over';
2616        }
2617
2618        while (_bitLength + length >= 8) {
2619          _out.writeByte(0xff & ( (data << _bitLength) | _bitBuffer) );
2620          length -= (8 - _bitLength);
2621          data >>>= (8 - _bitLength);
2622          _bitBuffer = 0;
2623          _bitLength = 0;
2624        }
2625
2626        _bitBuffer = (data << _bitLength) | _bitBuffer;
2627        _bitLength = _bitLength + length;
2628      };
2629
2630      _this.flush = function() {
2631        if (_bitLength > 0) {
2632          _out.writeByte(_bitBuffer);
2633        }
2634      };
2635
2636      return _this;
2637    };
2638
2639    var getLZWRaster = function(lzwMinCodeSize) {
2640
2641      var clearCode = 1 << lzwMinCodeSize;
2642      var endCode = (1 << lzwMinCodeSize) + 1;
2643      var bitLength = lzwMinCodeSize + 1;
2644
2645      // Setup LZWTable
2646      var table = lzwTable();
2647
2648      for (var i = 0; i < clearCode; i += 1) {
2649        table.add(String.fromCharCode(i) );
2650      }
2651      table.add(String.fromCharCode(clearCode) );
2652      table.add(String.fromCharCode(endCode) );
2653
2654      var byteOut = byteArrayOutputStream();
2655      var bitOut = bitOutputStream(byteOut);
2656
2657      // clear code
2658      bitOut.write(clearCode, bitLength);
2659
2660      var dataIndex = 0;
2661
2662      var s = String.fromCharCode(_data[dataIndex]);
2663      dataIndex += 1;
2664
2665      while (dataIndex < _data.length) {
2666
2667        var c = String.fromCharCode(_data[dataIndex]);
2668        dataIndex += 1;
2669
2670        if (table.contains(s + c) ) {
2671
2672          s = s + c;
2673
2674        } else {
2675
2676          bitOut.write(table.indexOf(s), bitLength);
2677
2678          if (table.size() < 0xfff) {
2679
2680            if (table.size() == (1 << bitLength) ) {
2681              bitLength += 1;
2682            }
2683
2684            table.add(s + c);
2685          }
2686
2687          s = c;
2688        }
2689      }
2690
2691      bitOut.write(table.indexOf(s), bitLength);
2692
2693      // end code
2694      bitOut.write(endCode, bitLength);
2695
2696      bitOut.flush();
2697
2698      return byteOut.toByteArray();
2699    };
2700
2701    var lzwTable = function() {
2702
2703      var _map = {};
2704      var _size = 0;
2705
2706      var _this = {};
2707
2708      _this.add = function(key) {
2709        if (_this.contains(key) ) {
2710          throw 'dup key:' + key;
2711        }
2712        _map[key] = _size;
2713        _size += 1;
2714      };
2715
2716      _this.size = function() {
2717        return _size;
2718      };
2719
2720      _this.indexOf = function(key) {
2721        return _map[key];
2722      };
2723
2724      _this.contains = function(key) {
2725        return typeof _map[key] != 'undefined';
2726      };
2727
2728      return _this;
2729    };
2730
2731    return _this;
2732  };
2733
2734  var createDataURL = function(width, height, getPixel) {
2735    var gif = gifImage(width, height);
2736    for (var y = 0; y < height; y += 1) {
2737      for (var x = 0; x < width; x += 1) {
2738        gif.setPixel(x, y, getPixel(x, y) );
2739      }
2740    }
2741
2742    var b = byteArrayOutputStream();
2743    gif.write(b);
2744
2745    var base64 = base64EncodeOutputStream();
2746    var bytes = b.toByteArray();
2747    for (var i = 0; i < bytes.length; i += 1) {
2748      base64.writeByte(bytes[i]);
2749    }
2750    base64.flush();
2751
2752    return 'data:image/gif;base64,' + base64;
2753  };
2754
2755  //---------------------------------------------------------------------
2756  // returns qrcode function.
2757
2758  return qrcode;
2759}();
2760
2761// multibyte support
2762!function() {
2763
2764  qrcode.stringToBytesFuncs['UTF-8'] = function(s) {
2765    // http://stackoverflow.com/questions/18729405/how-to-convert-utf8-string-to-byte-array
2766    function toUTF8Array(str) {
2767      var utf8 = [];
2768      for (var i=0; i < str.length; i++) {
2769        var charcode = str.charCodeAt(i);
2770        if (charcode < 0x80) utf8.push(charcode);
2771        else if (charcode < 0x800) {
2772          utf8.push(0xc0 | (charcode >> 6),
2773              0x80 | (charcode & 0x3f));
2774        }
2775        else if (charcode < 0xd800 || charcode >= 0xe000) {
2776          utf8.push(0xe0 | (charcode >> 12),
2777              0x80 | ((charcode>>6) & 0x3f),
2778              0x80 | (charcode & 0x3f));
2779        }
2780        // surrogate pair
2781        else {
2782          i++;
2783          // UTF-16 encodes 0x10000-0x10FFFF by
2784          // subtracting 0x10000 and splitting the
2785          // 20 bits of 0x0-0xFFFFF into two halves
2786          charcode = 0x10000 + (((charcode & 0x3ff)<<10)
2787            | (str.charCodeAt(i) & 0x3ff));
2788          utf8.push(0xf0 | (charcode >>18),
2789              0x80 | ((charcode>>12) & 0x3f),
2790              0x80 | ((charcode>>6) & 0x3f),
2791              0x80 | (charcode & 0x3f));
2792        }
2793      }
2794      return utf8;
2795    }
2796    return toUTF8Array(s);
2797  };
2798
2799}();
2800
2801(function (factory) {
2802  if (true) {
2803      !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_FACTORY__ = (factory),
2804				__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?
2805				(__WEBPACK_AMD_DEFINE_FACTORY__.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__)) : __WEBPACK_AMD_DEFINE_FACTORY__),
2806				__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));
2807  } else {}
2808}(function () {
2809    return qrcode;
2810}));
2811
2812
2813/***/ })
2814/******/ ]);
2815});

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.