happo 2.7.7 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/bin/happo +1 -1
  3. data/lib/happo/public/0144a92667ed2e8a8b13.worker.js +56 -0
  4. data/lib/happo/public/0622a1eb2a5b4dab0d7d.worker.js +62 -0
  5. data/lib/happo/public/088cc9d4615d51d37661.worker.js +68 -0
  6. data/lib/happo/public/11b439cedd6aa6a01e71.worker.js +68 -0
  7. data/lib/happo/public/15b1495833b5b13f5f51.worker.js +62 -0
  8. data/lib/happo/public/167f0a5b59a8c27815fe.worker.js +62 -0
  9. data/lib/happo/public/19f5f7403fb4a2ba42e2.worker.js +62 -0
  10. data/lib/happo/public/1a86029ce53b1aa81f68.worker.js +62 -0
  11. data/lib/happo/public/1b6803fbc7b07f61cba2.worker.js +74 -0
  12. data/lib/happo/public/1d3dc560f1f39393dafe.worker.js +62 -0
  13. data/lib/happo/public/203272bf00c349325c60.worker.js +62 -0
  14. data/lib/happo/public/220e711d4abdbc4bd32f.worker.js +62 -0
  15. data/lib/happo/public/25ad7a1e52bd424ca81d.worker.js +62 -0
  16. data/lib/happo/public/26d95a76207ba0fe6c25.worker.js +74 -0
  17. data/lib/happo/public/28237f0668f12dfb456c.worker.js +62 -0
  18. data/lib/happo/public/2a7a935f3b9526c6f7ab.worker.js +74 -0
  19. data/lib/happo/public/2c00cb8d0a2eb5dd4078.worker.js +68 -0
  20. data/lib/happo/public/2c71ddb5b15a755d4644.worker.js +68 -0
  21. data/lib/happo/public/32648d3dfb22995f4066.worker.js +68 -0
  22. data/lib/happo/public/3452650686a8096b2bb7.worker.js +68 -0
  23. data/lib/happo/public/346cefcc1572890455b8.worker.js +68 -0
  24. data/lib/happo/public/35bd63f58bb69ac267ea.worker.js +68 -0
  25. data/lib/happo/public/360e0acb872760f43b07.worker.js +68 -0
  26. data/lib/happo/public/3818f1c91ce4d4d8b724.worker.js +62 -0
  27. data/lib/happo/public/3cc2e649d9b6ff62f4ab.worker.js +62 -0
  28. data/lib/happo/public/3deccedc8fbb96bb1aa7.worker.js +68 -0
  29. data/lib/happo/public/3e672be26a7a8864a342.worker.js +68 -0
  30. data/lib/happo/public/41aa7471344a79ff98f2.worker.js +68 -0
  31. data/lib/happo/public/423ba9f549f3829873e6.worker.js +62 -0
  32. data/lib/happo/public/463eb0ecadbb11365ca4.worker.js +62 -0
  33. data/lib/happo/public/47c52ff0e060fedb841f.worker.js +62 -0
  34. data/lib/happo/public/4e685162de1d8a9b102d.worker.js +56 -0
  35. data/lib/happo/public/4eea1b4008ed68e41f82.worker.js +62 -0
  36. data/lib/happo/public/4f6b0faf1b43e93a1404.worker.js +62 -0
  37. data/lib/happo/public/54ba8bc7a595358209d2.worker.js +68 -0
  38. data/lib/happo/public/589c2f9547d240ac8a57.worker.js +68 -0
  39. data/lib/happo/public/5a8c0588ca745d7904f7.worker.js +68 -0
  40. data/lib/happo/public/5b3cabd81f7d8688f7a5.worker.js +62 -0
  41. data/lib/happo/public/5f5c9f07cb5117c523a2.worker.js +68 -0
  42. data/lib/happo/public/5fb8c7066659ea1b57e2.worker.js +62 -0
  43. data/lib/happo/public/5fb962cc191a60b42af0.worker.js +68 -0
  44. data/lib/happo/public/62c7585d1d23297b316f.worker.js +62 -0
  45. data/lib/happo/public/62e676d31cbf8aaa9359.worker.js +68 -0
  46. data/lib/happo/public/65efcf6aee5e3ef33539.worker.js +68 -0
  47. data/lib/happo/public/693d4918a5dae465c134.worker.js +68 -0
  48. data/lib/happo/public/69d106b071dd31ad86de.worker.js +68 -0
  49. data/lib/happo/public/730c035f5c2b404ff225.worker.js +62 -0
  50. data/lib/happo/public/7609088c49b73ee2e3e1.worker.js +68 -0
  51. data/lib/happo/public/76161d401db5bb36980a.worker.js +62 -0
  52. data/lib/happo/public/7d9febb46b37ddffa2d5.worker.js +62 -0
  53. data/lib/happo/public/7f29af56bd0ea82d77d9.worker.js +68 -0
  54. data/lib/happo/public/80009e8bc0ffd29d3390.worker.js +62 -0
  55. data/lib/happo/public/830db6cc9c99c2e8e9c1.worker.js +62 -0
  56. data/lib/happo/public/85ad69599657de02d20d.worker.js +68 -0
  57. data/lib/happo/public/875e790f3e64476b3aa0.worker.js +68 -0
  58. data/lib/happo/public/8fa9a7b2a5f19075eedc.worker.js +74 -0
  59. data/lib/happo/public/906ce908877052838b8e.worker.js +62 -0
  60. data/lib/happo/public/9472102d9a6d2577f988.worker.js +62 -0
  61. data/lib/happo/public/9ac309ab34f48e7af07c.worker.js +68 -0
  62. data/lib/happo/public/9cdd6f0763fd866a5118.worker.js +62 -0
  63. data/lib/happo/public/HappoApp.bundle.js +2 -0
  64. data/lib/happo/public/a8bfebcafc4935d15b00.worker.js +1 -0
  65. data/lib/happo/public/aa7ae8013f9780eb8acb.worker.js +68 -0
  66. data/lib/happo/public/b20a32590dfe259f4fe3.worker.js +62 -0
  67. data/lib/happo/public/b25ebdd4e2d2dee8c7b1.worker.js +68 -0
  68. data/lib/happo/public/b7a49d603b1d50f535b2.worker.js +68 -0
  69. data/lib/happo/public/b8e667564ad96f5c77f4.worker.js +68 -0
  70. data/lib/happo/public/b913c562805ec9a01635.worker.js +68 -0
  71. data/lib/happo/public/bab832c7110d15a5f43b.worker.js +62 -0
  72. data/lib/happo/public/bfcf99c9b2bf3d58ec7f.worker.js +62 -0
  73. data/lib/happo/public/c0aeff8b32c9911c8547.worker.js +68 -0
  74. data/lib/happo/public/c2297ce40f0d071ec173.worker.js +1 -0
  75. data/lib/happo/public/c3d7b17359c21ff82281.worker.js +68 -0
  76. data/lib/happo/public/c9f7adcce3de80eb759a.worker.js +68 -0
  77. data/lib/happo/public/card-current.png +0 -0
  78. data/lib/happo/public/card-previous.png +0 -0
  79. data/lib/happo/public/d7b87aec5f1e4f2a7a5d.worker.js +68 -0
  80. data/lib/happo/public/d8fefa1bd98baa4e38da.worker.js +62 -0
  81. data/lib/happo/public/db617ae6458966f4acae.worker.js +68 -0
  82. data/lib/happo/public/dialog-current.png +0 -0
  83. data/lib/happo/public/dialog-previous.png +0 -0
  84. data/lib/happo/public/e247eaa7506f44b5b847.worker.js +62 -0
  85. data/lib/happo/public/e92bb4e1e06843fa771e.worker.js +62 -0
  86. data/lib/happo/public/e9e2d97848e0059e15c5.worker.js +62 -0
  87. data/lib/happo/public/ea87c48552c960ed7a1c.worker.js +74 -0
  88. data/lib/happo/public/eb5aafba8d16a397517a.worker.js +68 -0
  89. data/lib/happo/public/edc218b655b9ef694b3e.worker.js +74 -0
  90. data/lib/happo/public/eea64a6efa0620a576d7.worker.js +68 -0
  91. data/lib/happo/public/f269a8e7ffca13e9366a.worker.js +68 -0
  92. data/lib/happo/public/f81ed0eec7edfa2dfadb.worker.js +62 -0
  93. data/lib/happo/public/fcd20ee3e5a10e8667bb.worker.js +68 -0
  94. data/lib/happo/public/full-page-large-current.png +0 -0
  95. data/lib/happo/public/full-page-large-previous.png +0 -0
  96. data/lib/happo/public/full-page-small-current.png +0 -0
  97. data/lib/happo/public/full-page-small-previous.png +0 -0
  98. data/lib/happo/public/happo-styles.css +28 -3
  99. data/lib/happo/public/major-diff-large-current.png +0 -0
  100. data/lib/happo/public/major-diff-large-previous.png +0 -0
  101. data/lib/happo/public/major-diff-small-current.png +0 -0
  102. data/lib/happo/public/major-diff-small-previous.png +0 -0
  103. data/lib/happo/public/modal-current.png +0 -0
  104. data/lib/happo/public/modal-previous.png +0 -0
  105. data/lib/happo/public/small-current.png +0 -0
  106. data/lib/happo/public/small-previous.png +0 -0
  107. data/lib/happo/public/wide-current.png +0 -0
  108. data/lib/happo/public/wide-previous.png +0 -0
  109. data/lib/happo/runner.rb +25 -31
  110. data/lib/happo/server.rb +81 -12
  111. data/lib/happo/uploader.rb +1 -2
  112. data/lib/happo/utils.rb +1 -1
  113. data/lib/happo/version.rb +1 -1
  114. data/lib/happo/views/diffs.erb +9 -14
  115. data/lib/happo.rb +0 -1
  116. metadata +107 -21
  117. data/lib/happo/public/HappoDiffs.jsx +0 -391
  118. data/lib/happo/snapshot_comparer.rb +0 -81
  119. data/lib/happo/snapshot_comparison_image/base.rb +0 -108
  120. data/lib/happo/snapshot_comparison_image/gutter.rb +0 -34
  121. data/lib/happo/snapshot_comparison_image/overlayed.rb +0 -88
@@ -0,0 +1,74 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _flattenImageData = __webpack_require__(1);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nvar _getDiffPixel = __webpack_require__(2);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var flattenedPrevious = (0, _flattenImageData2.default)(previousImageData);\n var flattenedCurrent = (0, _flattenImageData2.default)(currentImageData);\n var data = new Uint8ClampedArray(flattenedPrevious.length);\n\n for (var i = 0; i < flattenedPrevious.length; i += 4) {\n var pixel = (0, _getDiffPixel2.default)([flattenedPrevious[i], flattenedPrevious[i + 1], flattenedPrevious[i + 2], flattenedPrevious[i + 3]], [flattenedCurrent[i], flattenedCurrent[i + 1], flattenedCurrent[i + 2], flattenedCurrent[i + 3]]);\n data[i + 0] = pixel[0]; // r\n data[i + 1] = pixel[1]; // g\n data[i + 2] = pixel[2]; // b\n data[i + 3] = pixel[3]; // a\n }\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJmbGF0dGVuZWRQcmV2aW91cyIsImZsYXR0ZW5lZEN1cnJlbnQiLCJVaW50OENsYW1wZWRBcnJheSIsImxlbmd0aCIsImkiLCJwaXhlbCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFDQTs7Ozs7O0FBRUFBLEtBQUtDLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGdCQUszQjtBQUFBLHVCQUpKQyxJQUlJO0FBQUEsTUFIRkMsaUJBR0UsYUFIRkEsaUJBR0U7QUFBQSxNQUZGQyxnQkFFRSxhQUZGQSxnQkFFRTs7QUFDSixNQUFNQyxvQkFBb0IsZ0NBQWlCRixpQkFBakIsQ0FBMUI7QUFDQSxNQUFNRyxtQkFBbUIsZ0NBQWlCRixnQkFBakIsQ0FBekI7QUFDQSxNQUFNRixPQUFPLElBQUlLLGlCQUFKLENBQXNCRixrQkFBa0JHLE1BQXhDLENBQWI7O0FBRUEsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlKLGtCQUFrQkcsTUFBdEMsRUFBOENDLEtBQUssQ0FBbkQsRUFBc0Q7QUFDcEQsUUFBTUMsUUFBUSw0QkFDWixDQUNFTCxrQkFBa0JJLENBQWxCLENBREYsRUFFRUosa0JBQWtCSSxJQUFJLENBQXRCLENBRkYsRUFHRUosa0JBQWtCSSxJQUFJLENBQXRCLENBSEYsRUFJRUosa0JBQWtCSSxJQUFJLENBQXRCLENBSkYsQ0FEWSxFQU9aLENBQ0VILGlCQUFpQkcsQ0FBakIsQ0FERixFQUVFSCxpQkFBaUJHLElBQUksQ0FBckIsQ0FGRixFQUdFSCxpQkFBaUJHLElBQUksQ0FBckIsQ0FIRixFQUlFSCxpQkFBaUJHLElBQUksQ0FBckIsQ0FKRixDQVBZLENBQWQ7QUFjQVAsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBZm9ELENBZTVCO0FBQ3hCUixTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FoQm9ELENBZ0I1QjtBQUN4QlIsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBakJvRCxDQWlCNUI7QUFDeEJSLFNBQUtPLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQWxCb0QsQ0FrQjVCO0FBQ3pCO0FBQ0RWLE9BQUtXLFdBQUwsQ0FBaUJULElBQWpCO0FBQ0FGLE9BQUtZLEtBQUw7QUFDRCxDQWhDRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5pbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7XG4gIGRhdGE6IHtcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9LFxufSkgPT4ge1xuICBjb25zdCBmbGF0dGVuZWRQcmV2aW91cyA9IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpO1xuICBjb25zdCBmbGF0dGVuZWRDdXJyZW50ID0gZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKTtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShmbGF0dGVuZWRQcmV2aW91cy5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZmxhdHRlbmVkUHJldmlvdXMubGVuZ3RoOyBpICs9IDQpIHtcbiAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgIFtcbiAgICAgICAgZmxhdHRlbmVkUHJldmlvdXNbaV0sXG4gICAgICAgIGZsYXR0ZW5lZFByZXZpb3VzW2kgKyAxXSxcbiAgICAgICAgZmxhdHRlbmVkUHJldmlvdXNbaSArIDJdLFxuICAgICAgICBmbGF0dGVuZWRQcmV2aW91c1tpICsgM10sXG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBmbGF0dGVuZWRDdXJyZW50W2ldLFxuICAgICAgICBmbGF0dGVuZWRDdXJyZW50W2kgKyAxXSxcbiAgICAgICAgZmxhdHRlbmVkQ3VycmVudFtpICsgMl0sXG4gICAgICAgIGZsYXR0ZW5lZEN1cnJlbnRbaSArIDNdLFxuICAgICAgXVxuICAgICk7XG4gICAgZGF0YVtpICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgIGRhdGFbaSArIDFdID0gcGl4ZWxbMV07IC8vIGdcbiAgICBkYXRhW2kgKyAyXSA9IHBpeGVsWzJdOyAvLyBiXG4gICAgZGF0YVtpICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports) {
52
+
53
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = flattenImageData;\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var width = imageData[0].length;\n var result = new Uint8ClampedArray(imageData.length * width);\n imageData.forEach(function (row, y) {\n row.forEach(function (channel, x) {\n var index = y * width + x;\n result[index] = channel;\n });\n });\n return result;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsInJlc3VsdCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZm9yRWFjaCIsInJvdyIsInkiLCJjaGFubmVsIiwieCIsImluZGV4Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFJd0JBLGdCO0FBSnhCOzs7O0FBSWUsU0FBU0EsZ0JBQVQsQ0FBMEJDLFNBQTFCLEVBQXFDO0FBQ2xELE1BQU1DLFFBQVFELFVBQVUsQ0FBVixFQUFhRSxNQUEzQjtBQUNBLE1BQU1DLFNBQVMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVVFLE1BQVYsR0FBbUJELEtBQXpDLENBQWY7QUFDQUQsWUFBVUssT0FBVixDQUFrQixVQUFDQyxHQUFELEVBQU1DLENBQU4sRUFBWTtBQUM1QkQsUUFBSUQsT0FBSixDQUFZLFVBQUNHLE9BQUQsRUFBVUMsQ0FBVixFQUFnQjtBQUMxQixVQUFNQyxRQUFTSCxJQUFJTixLQUFMLEdBQWNRLENBQTVCO0FBQ0FOLGFBQU9PLEtBQVAsSUFBZ0JGLE9BQWhCO0FBQ0QsS0FIRDtBQUlELEdBTEQ7QUFNQSxTQUFPTCxNQUFQO0FBQ0QiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhcmFtIHtBcnJheX0gaW1hZ2VEYXRhIGEgMmQgYXJyYXlcbiAqIEByZXR1cm4ge1VpbnQ4Q2xhbXBlZEFycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmbGF0dGVuSW1hZ2VEYXRhKGltYWdlRGF0YSkge1xuICBjb25zdCB3aWR0aCA9IGltYWdlRGF0YVswXS5sZW5ndGg7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWFnZURhdGEubGVuZ3RoICogd2lkdGgpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgcm93LmZvckVhY2goKGNoYW5uZWwsIHgpID0+IHtcbiAgICAgIGNvbnN0IGluZGV4ID0gKHkgKiB3aWR0aCkgKyB4O1xuICAgICAgcmVzdWx0W2luZGV4XSA9IGNoYW5uZWw7XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports, __webpack_require__) {
58
+
59
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(3);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(4);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRSxPQUFPLGlDQUFrQkYsYUFBbEIsRUFBaUNDLFlBQWpDLDZDQUFiOztBQUVBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQsU0FBTyx1QkFDTCxDQUFDLEdBQUQsRUFBTSxFQUFOLEVBQVUsR0FBVixFQUFlLE1BQU1JLEtBQUtDLEdBQUwsQ0FBUyxHQUFULEVBQWNGLElBQWQsQ0FBckIsQ0FESyxFQUVMSCxLQUZLLENBQVA7QUFJRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbXBvc2UgZnJvbSAnLi9jb21wb3NlJztcbmltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSwgeyBNQVhfRVVDTElERUFOX0RJU1RBTkNFIH0gZnJvbSAnLi9ldWNsaWRlYW5EaXN0YW5jZSc7XG5cbmNvbnN0IFdISVRFID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERpZmZQaXhlbChwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIHtcbiAgaWYgKCFwcmV2aW91c1BpeGVsKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQaXhlbDtcbiAgfVxuXG4gIGlmICghY3VycmVudFBpeGVsKSB7XG4gICAgcmV0dXJuIHByZXZpb3VzUGl4ZWw7XG4gIH1cblxuICAvLyBDb21wdXRlIGEgc2NvcmUgdGhhdCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBwaXhlbHNcbiAgLy9cbiAgLy8gVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICAvLyBvZiAyIGNvbG9ycyBvdmVyIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEV1Y2xpZGVhbiBkaXN0YW5jZS4gVGhpcyBnaXZlcyB1cyBhXG4gIC8vIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gIC8vXG4gIC8vIEFsdGhvdWdoIGl0IHdvdWxkIGJlIG1vcmUgcGVyY2VwdHVhbGx5IGFjY3VyYXRlIHRvIGNhbGN1bGF0ZSBhIHByb3BlclxuICAvLyBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gIC8vIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAgLy8gdG8gTGFiLlxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG5cbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gY29tcG9zZShcbiAgICAgIFtjdXJyZW50UGl4ZWxbMF0sIGN1cnJlbnRQaXhlbFsxXSwgY3VycmVudFBpeGVsWzJdLCA0MF0sXG4gICAgICBXSElURVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIzLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
66
+
67
+ /***/ },
68
+ /* 4 */
69
+ /***/ function(module, exports) {
70
+
71
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
72
+
73
+ /***/ }
74
+ /******/ ]);
@@ -0,0 +1,68 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar RED = [255, 0, 0, 255];\nvar GREEN = [0, 200, 0, 255];\n\nvar GUTTER_WIDTH = 20 * 4;\nvar GUTTER_GAP = 4 * 4;\n\nfunction getDataIndex(row, width, index) {\n return GUTTER_WIDTH * (row + 1) + width * row + index;\n}\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var width = previousImageData[0].length;\n var height = previousImageData.length;\n\n var diffImageSize = (GUTTER_WIDTH + width) * height;\n\n var data = new Uint8ClampedArray(diffImageSize);\n\n for (var row = 0; row < height; row++) {\n // Render gutter\n var gutterColor = void 0;\n if (previousImageData[row][3] === 0) {\n // Pixel is transparent in previous image, which means that a row was\n // added here.\n gutterColor = GREEN;\n } else if (currentImageData[row][3] === 0) {\n // Pixel is transparent in current image, which means that a row was\n // removed here.\n gutterColor = RED;\n } else {\n gutterColor = null;\n }\n\n for (var index = 0; index < GUTTER_WIDTH - GUTTER_GAP; index += 4) {\n if (gutterColor !== null) {\n var dataIndex = getDataIndex(row, width, index) - GUTTER_WIDTH;\n data[dataIndex + 0] = gutterColor[0];\n data[dataIndex + 1] = gutterColor[1];\n data[dataIndex + 2] = gutterColor[2];\n data[dataIndex + 3] = gutterColor[3];\n }\n }\n\n // Render image\n for (var _index = 0; _index < width; _index += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[row][_index], previousImageData[row][_index + 1], previousImageData[row][_index + 2], previousImageData[row][_index + 3]], [currentImageData[row][_index], currentImageData[row][_index + 1], currentImageData[row][_index + 2], currentImageData[row][_index + 3]]);\n\n var _dataIndex = getDataIndex(row, width, _index);\n data[_dataIndex + 0] = pixel[0]; // r\n data[_dataIndex + 1] = pixel[1]; // g\n data[_dataIndex + 2] = pixel[2]; // b\n data[_dataIndex + 3] = pixel[3]; // a\n }\n }\n\n self.postMessage({\n data: data,\n width: (GUTTER_WIDTH + width) / 4,\n height: height\n });\n\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJSRUQiLCJHUkVFTiIsIkdVVFRFUl9XSURUSCIsIkdVVFRFUl9HQVAiLCJnZXREYXRhSW5kZXgiLCJyb3ciLCJ3aWR0aCIsImluZGV4Iiwic2VsZiIsImFkZEV2ZW50TGlzdGVuZXIiLCJkYXRhIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibGVuZ3RoIiwiaGVpZ2h0IiwiZGlmZkltYWdlU2l6ZSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZ3V0dGVyQ29sb3IiLCJkYXRhSW5kZXgiLCJwaXhlbCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBLElBQU1BLE1BQU0sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxHQUFaLENBQVo7QUFDQSxJQUFNQyxRQUFRLENBQUMsQ0FBRCxFQUFJLEdBQUosRUFBUyxDQUFULEVBQVksR0FBWixDQUFkOztBQUVBLElBQU1DLGVBQWUsS0FBSyxDQUExQjtBQUNBLElBQU1DLGFBQWEsSUFBSSxDQUF2Qjs7QUFFQSxTQUFTQyxZQUFULENBQXNCQyxHQUF0QixFQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3ZDLFNBQVFMLGdCQUFnQkcsTUFBTSxDQUF0QixDQUFELEdBQThCQyxRQUFRRCxHQUF0QyxHQUE2Q0UsS0FBcEQ7QUFDRDs7QUFFREMsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsZ0JBSzNCO0FBQUEsdUJBSkpDLElBSUk7QUFBQSxNQUhGQyxpQkFHRSxhQUhGQSxpQkFHRTtBQUFBLE1BRkZDLGdCQUVFLGFBRkZBLGdCQUVFOztBQUNKLE1BQU1OLFFBQVFLLGtCQUFrQixDQUFsQixFQUFxQkUsTUFBbkM7QUFDQSxNQUFNQyxTQUFTSCxrQkFBa0JFLE1BQWpDOztBQUVBLE1BQU1FLGdCQUFnQixDQUFDYixlQUFlSSxLQUFoQixJQUF5QlEsTUFBL0M7O0FBRUEsTUFBTUosT0FBTyxJQUFJTSxpQkFBSixDQUFzQkQsYUFBdEIsQ0FBYjs7QUFFQSxPQUFLLElBQUlWLE1BQU0sQ0FBZixFQUFrQkEsTUFBTVMsTUFBeEIsRUFBZ0NULEtBQWhDLEVBQXVDO0FBQ3JDO0FBQ0EsUUFBSVksb0JBQUo7QUFDQSxRQUFJTixrQkFBa0JOLEdBQWxCLEVBQXVCLENBQXZCLE1BQThCLENBQWxDLEVBQXFDO0FBQ25DO0FBQ0E7QUFDQVksb0JBQWNoQixLQUFkO0FBQ0QsS0FKRCxNQUlPLElBQUlXLGlCQUFpQlAsR0FBakIsRUFBc0IsQ0FBdEIsTUFBNkIsQ0FBakMsRUFBb0M7QUFDekM7QUFDQTtBQUNBWSxvQkFBY2pCLEdBQWQ7QUFDRCxLQUpNLE1BSUE7QUFDTGlCLG9CQUFjLElBQWQ7QUFDRDs7QUFFRCxTQUFLLElBQUlWLFFBQVEsQ0FBakIsRUFBb0JBLFFBQVFMLGVBQWVDLFVBQTNDLEVBQXVESSxTQUFTLENBQWhFLEVBQW1FO0FBQ2pFLFVBQUlVLGdCQUFnQixJQUFwQixFQUEwQjtBQUN4QixZQUFNQyxZQUFZZCxhQUFhQyxHQUFiLEVBQWtCQyxLQUFsQixFQUF5QkMsS0FBekIsSUFBa0NMLFlBQXBEO0FBQ0FRLGFBQUtRLFlBQVksQ0FBakIsSUFBc0JELFlBQVksQ0FBWixDQUF0QjtBQUNBUCxhQUFLUSxZQUFZLENBQWpCLElBQXNCRCxZQUFZLENBQVosQ0FBdEI7QUFDQVAsYUFBS1EsWUFBWSxDQUFqQixJQUFzQkQsWUFBWSxDQUFaLENBQXRCO0FBQ0FQLGFBQUtRLFlBQVksQ0FBakIsSUFBc0JELFlBQVksQ0FBWixDQUF0QjtBQUNEO0FBQ0Y7O0FBRUQ7QUFDQSxTQUFLLElBQUlWLFNBQVEsQ0FBakIsRUFBb0JBLFNBQVFELEtBQTVCLEVBQW1DQyxVQUFTLENBQTVDLEVBQStDO0FBQzdDLFVBQU1ZLFFBQVEsNEJBQ1osQ0FDRVIsa0JBQWtCTixHQUFsQixFQUF1QkUsTUFBdkIsQ0FERixFQUVFSSxrQkFBa0JOLEdBQWxCLEVBQXVCRSxTQUFRLENBQS9CLENBRkYsRUFHRUksa0JBQWtCTixHQUFsQixFQUF1QkUsU0FBUSxDQUEvQixDQUhGLEVBSUVJLGtCQUFrQk4sR0FBbEIsRUFBdUJFLFNBQVEsQ0FBL0IsQ0FKRixDQURZLEVBT1osQ0FDRUssaUJBQWlCUCxHQUFqQixFQUFzQkUsTUFBdEIsQ0FERixFQUVFSyxpQkFBaUJQLEdBQWpCLEVBQXNCRSxTQUFRLENBQTlCLENBRkYsRUFHRUssaUJBQWlCUCxHQUFqQixFQUFzQkUsU0FBUSxDQUE5QixDQUhGLEVBSUVLLGlCQUFpQlAsR0FBakIsRUFBc0JFLFNBQVEsQ0FBOUIsQ0FKRixDQVBZLENBQWQ7O0FBZUEsVUFBTVcsYUFBWWQsYUFBYUMsR0FBYixFQUFrQkMsS0FBbEIsRUFBeUJDLE1BQXpCLENBQWxCO0FBQ0FHLFdBQUtRLGFBQVksQ0FBakIsSUFBc0JDLE1BQU0sQ0FBTixDQUF0QixDQWpCNkMsQ0FpQmI7QUFDaENULFdBQUtRLGFBQVksQ0FBakIsSUFBc0JDLE1BQU0sQ0FBTixDQUF0QixDQWxCNkMsQ0FrQmI7QUFDaENULFdBQUtRLGFBQVksQ0FBakIsSUFBc0JDLE1BQU0sQ0FBTixDQUF0QixDQW5CNkMsQ0FtQmI7QUFDaENULFdBQUtRLGFBQVksQ0FBakIsSUFBc0JDLE1BQU0sQ0FBTixDQUF0QixDQXBCNkMsQ0FvQmI7QUFDakM7QUFDRjs7QUFFRFgsT0FBS1ksV0FBTCxDQUFpQjtBQUNmVixjQURlO0FBRWZKLFdBQU8sQ0FBQ0osZUFBZUksS0FBaEIsSUFBeUIsQ0FGakI7QUFHZlE7QUFIZSxHQUFqQjs7QUFNQU4sT0FBS2EsS0FBTDtBQUNELENBdEVEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbmNvbnN0IFJFRCA9IFsyNTUsIDAsIDAsIDI1NV07XG5jb25zdCBHUkVFTiA9IFswLCAyMDAsIDAsIDI1NV07XG5cbmNvbnN0IEdVVFRFUl9XSURUSCA9IDIwICogNDtcbmNvbnN0IEdVVFRFUl9HQVAgPSA0ICogNDtcblxuZnVuY3Rpb24gZ2V0RGF0YUluZGV4KHJvdywgd2lkdGgsIGluZGV4KSB7XG4gIHJldHVybiAoR1VUVEVSX1dJRFRIICogKHJvdyArIDEpKSArICh3aWR0aCAqIHJvdykgKyBpbmRleDtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHtcbiAgZGF0YToge1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0sXG59KSA9PiB7XG4gIGNvbnN0IHdpZHRoID0gcHJldmlvdXNJbWFnZURhdGFbMF0ubGVuZ3RoO1xuICBjb25zdCBoZWlnaHQgPSBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGg7XG5cbiAgY29uc3QgZGlmZkltYWdlU2l6ZSA9IChHVVRURVJfV0lEVEggKyB3aWR0aCkgKiBoZWlnaHQ7XG5cbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkaWZmSW1hZ2VTaXplKTtcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgLy8gUmVuZGVyIGd1dHRlclxuICAgIGxldCBndXR0ZXJDb2xvcjtcbiAgICBpZiAocHJldmlvdXNJbWFnZURhdGFbcm93XVszXSA9PT0gMCkge1xuICAgICAgLy8gUGl4ZWwgaXMgdHJhbnNwYXJlbnQgaW4gcHJldmlvdXMgaW1hZ2UsIHdoaWNoIG1lYW5zIHRoYXQgYSByb3cgd2FzXG4gICAgICAvLyBhZGRlZCBoZXJlLlxuICAgICAgZ3V0dGVyQ29sb3IgPSBHUkVFTjtcbiAgICB9IGVsc2UgaWYgKGN1cnJlbnRJbWFnZURhdGFbcm93XVszXSA9PT0gMCkge1xuICAgICAgLy8gUGl4ZWwgaXMgdHJhbnNwYXJlbnQgaW4gY3VycmVudCBpbWFnZSwgd2hpY2ggbWVhbnMgdGhhdCBhIHJvdyB3YXNcbiAgICAgIC8vIHJlbW92ZWQgaGVyZS5cbiAgICAgIGd1dHRlckNvbG9yID0gUkVEO1xuICAgIH0gZWxzZSB7XG4gICAgICBndXR0ZXJDb2xvciA9IG51bGw7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IEdVVFRFUl9XSURUSCAtIEdVVFRFUl9HQVA7IGluZGV4ICs9IDQpIHtcbiAgICAgIGlmIChndXR0ZXJDb2xvciAhPT0gbnVsbCkge1xuICAgICAgICBjb25zdCBkYXRhSW5kZXggPSBnZXREYXRhSW5kZXgocm93LCB3aWR0aCwgaW5kZXgpIC0gR1VUVEVSX1dJRFRIO1xuICAgICAgICBkYXRhW2RhdGFJbmRleCArIDBdID0gZ3V0dGVyQ29sb3JbMF07XG4gICAgICAgIGRhdGFbZGF0YUluZGV4ICsgMV0gPSBndXR0ZXJDb2xvclsxXTtcbiAgICAgICAgZGF0YVtkYXRhSW5kZXggKyAyXSA9IGd1dHRlckNvbG9yWzJdO1xuICAgICAgICBkYXRhW2RhdGFJbmRleCArIDNdID0gZ3V0dGVyQ29sb3JbM107XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGltYWdlXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpZHRoOyBpbmRleCArPSA0KSB7XG4gICAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgICAgW1xuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXhdLFxuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4ICsgMl0sXG4gICAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbcm93XVtpbmRleCArIDNdLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4XSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAyXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAzXSxcbiAgICAgICAgXVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGF0YUluZGV4ID0gZ2V0RGF0YUluZGV4KHJvdywgd2lkdGgsIGluZGV4KTtcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgICAgZGF0YVtkYXRhSW5kZXggKyAxXSA9IHBpeGVsWzFdOyAvLyBnXG4gICAgICBkYXRhW2RhdGFJbmRleCArIDJdID0gcGl4ZWxbMl07IC8vIGJcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICAgIH1cbiAgfVxuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIGRhdGEsXG4gICAgd2lkdGg6IChHVVRURVJfV0lEVEggKyB3aWR0aCkgLyA0LFxuICAgIGhlaWdodCxcbiAgfSk7XG5cbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0ltYWdlRGlmZldvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(2);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(3);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRSxPQUFPLGlDQUFrQkYsYUFBbEIsRUFBaUNDLFlBQWpDLDZDQUFiOztBQUVBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQsU0FBTyx1QkFDTCxDQUFDLEdBQUQsRUFBTSxFQUFOLEVBQVUsR0FBVixFQUFlLE1BQU1JLEtBQUtDLEdBQUwsQ0FBUyxHQUFULEVBQWNGLElBQWQsQ0FBckIsQ0FESyxFQUVMSCxLQUZLLENBQVA7QUFJRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbXBvc2UgZnJvbSAnLi9jb21wb3NlJztcbmltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSwgeyBNQVhfRVVDTElERUFOX0RJU1RBTkNFIH0gZnJvbSAnLi9ldWNsaWRlYW5EaXN0YW5jZSc7XG5cbmNvbnN0IFdISVRFID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERpZmZQaXhlbChwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIHtcbiAgaWYgKCFwcmV2aW91c1BpeGVsKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQaXhlbDtcbiAgfVxuXG4gIGlmICghY3VycmVudFBpeGVsKSB7XG4gICAgcmV0dXJuIHByZXZpb3VzUGl4ZWw7XG4gIH1cblxuICAvLyBDb21wdXRlIGEgc2NvcmUgdGhhdCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBwaXhlbHNcbiAgLy9cbiAgLy8gVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICAvLyBvZiAyIGNvbG9ycyBvdmVyIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEV1Y2xpZGVhbiBkaXN0YW5jZS4gVGhpcyBnaXZlcyB1cyBhXG4gIC8vIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gIC8vXG4gIC8vIEFsdGhvdWdoIGl0IHdvdWxkIGJlIG1vcmUgcGVyY2VwdHVhbGx5IGFjY3VyYXRlIHRvIGNhbGN1bGF0ZSBhIHByb3BlclxuICAvLyBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gIC8vIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAgLy8gdG8gTGFiLlxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG5cbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gY29tcG9zZShcbiAgICAgIFtjdXJyZW50UGl4ZWxbMF0sIGN1cnJlbnRQaXhlbFsxXSwgY3VycmVudFBpeGVsWzJdLCA0MF0sXG4gICAgICBXSElURVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
66
+
67
+ /***/ }
68
+ /******/ ]);
@@ -0,0 +1,68 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var width = previousImageData[0].length;\n var height = previousImageData.length;\n\n var gutterWidth = 20 * 4;\n\n var diffImageSize = (gutterWidth + width) * height;\n\n var data = new Uint8ClampedArray(diffImageSize);\n\n for (var row = 0; row < height; row++) {\n for (var index = 0; index < width; index += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[row][index], previousImageData[row][index + 1], previousImageData[row][index + 2], previousImageData[row][index + 3]], [currentImageData[row][index], currentImageData[row][index + 1], currentImageData[row][index + 2], currentImageData[row][index + 3]]);\n\n var dataIndex = (gutterWidth + width) * row + index;\n data[dataIndex + 0] = pixel[0]; // r\n data[dataIndex + 1] = pixel[1]; // g\n data[dataIndex + 2] = pixel[2]; // b\n data[dataIndex + 3] = pixel[3]; // a\n }\n }\n\n self.postMessage({\n data: data,\n width: (gutterWidth + width) / 4,\n height: height\n });\n\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsImhlaWdodCIsImd1dHRlcldpZHRoIiwiZGlmZkltYWdlU2l6ZSIsIlVpbnQ4Q2xhbXBlZEFycmF5Iiwicm93IiwiaW5kZXgiLCJwaXhlbCIsImRhdGFJbmRleCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxnQkFLM0I7QUFBQSx1QkFKSkMsSUFJSTtBQUFBLE1BSEZDLGlCQUdFLGFBSEZBLGlCQUdFO0FBQUEsTUFGRkMsZ0JBRUUsYUFGRkEsZ0JBRUU7O0FBQ0osTUFBTUMsUUFBUUYsa0JBQWtCLENBQWxCLEVBQXFCRyxNQUFuQztBQUNBLE1BQU1DLFNBQVNKLGtCQUFrQkcsTUFBakM7O0FBRUEsTUFBTUUsY0FBYyxLQUFLLENBQXpCOztBQUVBLE1BQU1DLGdCQUFnQixDQUFDRCxjQUFjSCxLQUFmLElBQXdCRSxNQUE5Qzs7QUFFQSxNQUFNTCxPQUFPLElBQUlRLGlCQUFKLENBQXNCRCxhQUF0QixDQUFiOztBQUVBLE9BQUssSUFBSUUsTUFBTSxDQUFmLEVBQWtCQSxNQUFNSixNQUF4QixFQUFnQ0ksS0FBaEMsRUFBdUM7QUFDckMsU0FBSyxJQUFJQyxRQUFRLENBQWpCLEVBQW9CQSxRQUFRUCxLQUE1QixFQUFtQ08sU0FBUyxDQUE1QyxFQUErQztBQUM3QyxVQUFNQyxRQUFRLDRCQUNaLENBQ0VWLGtCQUFrQlEsR0FBbEIsRUFBdUJDLEtBQXZCLENBREYsRUFFRVQsa0JBQWtCUSxHQUFsQixFQUF1QkMsUUFBUSxDQUEvQixDQUZGLEVBR0VULGtCQUFrQlEsR0FBbEIsRUFBdUJDLFFBQVEsQ0FBL0IsQ0FIRixFQUlFVCxrQkFBa0JRLEdBQWxCLEVBQXVCQyxRQUFRLENBQS9CLENBSkYsQ0FEWSxFQU9aLENBQ0VSLGlCQUFpQk8sR0FBakIsRUFBc0JDLEtBQXRCLENBREYsRUFFRVIsaUJBQWlCTyxHQUFqQixFQUFzQkMsUUFBUSxDQUE5QixDQUZGLEVBR0VSLGlCQUFpQk8sR0FBakIsRUFBc0JDLFFBQVEsQ0FBOUIsQ0FIRixFQUlFUixpQkFBaUJPLEdBQWpCLEVBQXNCQyxRQUFRLENBQTlCLENBSkYsQ0FQWSxDQUFkOztBQWVBLFVBQU1FLFlBQWEsQ0FBQ04sY0FBY0gsS0FBZixJQUF3Qk0sR0FBekIsR0FBZ0NDLEtBQWxEO0FBQ0FWLFdBQUtZLFlBQVksQ0FBakIsSUFBc0JELE1BQU0sQ0FBTixDQUF0QixDQWpCNkMsQ0FpQmI7QUFDaENYLFdBQUtZLFlBQVksQ0FBakIsSUFBc0JELE1BQU0sQ0FBTixDQUF0QixDQWxCNkMsQ0FrQmI7QUFDaENYLFdBQUtZLFlBQVksQ0FBakIsSUFBc0JELE1BQU0sQ0FBTixDQUF0QixDQW5CNkMsQ0FtQmI7QUFDaENYLFdBQUtZLFlBQVksQ0FBakIsSUFBc0JELE1BQU0sQ0FBTixDQUF0QixDQXBCNkMsQ0FvQmI7QUFDakM7QUFDRjs7QUFFRGIsT0FBS2UsV0FBTCxDQUFpQjtBQUNmYixjQURlO0FBRWZHLFdBQU8sQ0FBQ0csY0FBY0gsS0FBZixJQUF3QixDQUZoQjtBQUdmRTtBQUhlLEdBQWpCOztBQU1BUCxPQUFLZ0IsS0FBTDtBQUNELENBL0NEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7XG4gIGRhdGE6IHtcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9LFxufSkgPT4ge1xuICBjb25zdCB3aWR0aCA9IHByZXZpb3VzSW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgaGVpZ2h0ID0gcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoO1xuXG4gIGNvbnN0IGd1dHRlcldpZHRoID0gMjAgKiA0O1xuXG4gIGNvbnN0IGRpZmZJbWFnZVNpemUgPSAoZ3V0dGVyV2lkdGggKyB3aWR0aCkgKiBoZWlnaHQ7XG5cbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkaWZmSW1hZ2VTaXplKTtcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpZHRoOyBpbmRleCArPSA0KSB7XG4gICAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgICAgW1xuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXhdLFxuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4ICsgMl0sXG4gICAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbcm93XVtpbmRleCArIDNdLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4XSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAyXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAzXSxcbiAgICAgICAgXVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGF0YUluZGV4ID0gKChndXR0ZXJXaWR0aCArIHdpZHRoKSAqIHJvdykgKyBpbmRleDtcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgICAgZGF0YVtkYXRhSW5kZXggKyAxXSA9IHBpeGVsWzFdOyAvLyBnXG4gICAgICBkYXRhW2RhdGFJbmRleCArIDJdID0gcGl4ZWxbMl07IC8vIGJcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICAgIH1cbiAgfVxuXG4gIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgIGRhdGEsXG4gICAgd2lkdGg6IChndXR0ZXJXaWR0aCArIHdpZHRoKSAvIDQsXG4gICAgaGVpZ2h0LFxuICB9KTtcblxuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvSW1hZ2VEaWZmV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(2);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(3);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRSxPQUFPLGlDQUFrQkYsYUFBbEIsRUFBaUNDLFlBQWpDLDZDQUFiOztBQUVBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQsU0FBTyx1QkFDTCxDQUFDLEdBQUQsRUFBTSxFQUFOLEVBQVUsR0FBVixFQUFlLE1BQU1JLEtBQUtDLEdBQUwsQ0FBUyxHQUFULEVBQWNGLElBQWQsQ0FBckIsQ0FESyxFQUVMSCxLQUZLLENBQVA7QUFJRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbXBvc2UgZnJvbSAnLi9jb21wb3NlJztcbmltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSwgeyBNQVhfRVVDTElERUFOX0RJU1RBTkNFIH0gZnJvbSAnLi9ldWNsaWRlYW5EaXN0YW5jZSc7XG5cbmNvbnN0IFdISVRFID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERpZmZQaXhlbChwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIHtcbiAgaWYgKCFwcmV2aW91c1BpeGVsKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQaXhlbDtcbiAgfVxuXG4gIGlmICghY3VycmVudFBpeGVsKSB7XG4gICAgcmV0dXJuIHByZXZpb3VzUGl4ZWw7XG4gIH1cblxuICAvLyBDb21wdXRlIGEgc2NvcmUgdGhhdCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBwaXhlbHNcbiAgLy9cbiAgLy8gVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICAvLyBvZiAyIGNvbG9ycyBvdmVyIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEV1Y2xpZGVhbiBkaXN0YW5jZS4gVGhpcyBnaXZlcyB1cyBhXG4gIC8vIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gIC8vXG4gIC8vIEFsdGhvdWdoIGl0IHdvdWxkIGJlIG1vcmUgcGVyY2VwdHVhbGx5IGFjY3VyYXRlIHRvIGNhbGN1bGF0ZSBhIHByb3BlclxuICAvLyBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gIC8vIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAgLy8gdG8gTGFiLlxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG5cbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gY29tcG9zZShcbiAgICAgIFtjdXJyZW50UGl4ZWxbMF0sIGN1cnJlbnRQaXhlbFsxXSwgY3VycmVudFBpeGVsWzJdLCA0MF0sXG4gICAgICBXSElURVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
66
+
67
+ /***/ }
68
+ /******/ ]);
@@ -0,0 +1,68 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var height = previousImageData.length;\n var width = previousImageData[0].length;\n var size = width * height;\n var data = new Uint8ClampedArray(size);\n\n for (var row = 0; row < height; row++) {\n for (var index = 0; index < width; index += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[row][index], previousImageData[row][index + 1], previousImageData[row][index + 2], previousImageData[row][index + 3]], [currentImageData[row][index], currentImageData[row][index + 1], currentImageData[row][index + 2], currentImageData[row][index + 3]]);\n\n data[row * height + index + 0] = pixel[0]; // r\n data[row * height + index + 1] = pixel[1]; // g\n data[row * height + index + 2] = pixel[2]; // b\n data[row * height + index + 3] = pixel[3]; // a\n }\n }\n\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJoZWlnaHQiLCJsZW5ndGgiLCJ3aWR0aCIsInNpemUiLCJVaW50OENsYW1wZWRBcnJheSIsInJvdyIsImluZGV4IiwicGl4ZWwiLCJwb3N0TWVzc2FnZSIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQUEsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsZ0JBSzNCO0FBQUEsdUJBSkpDLElBSUk7QUFBQSxNQUhGQyxpQkFHRSxhQUhGQSxpQkFHRTtBQUFBLE1BRkZDLGdCQUVFLGFBRkZBLGdCQUVFOztBQUNKLE1BQU1DLFNBQVNGLGtCQUFrQkcsTUFBakM7QUFDQSxNQUFNQyxRQUFRSixrQkFBa0IsQ0FBbEIsRUFBcUJHLE1BQW5DO0FBQ0EsTUFBTUUsT0FBT0QsUUFBUUYsTUFBckI7QUFDQSxNQUFNSCxPQUFPLElBQUlPLGlCQUFKLENBQXNCRCxJQUF0QixDQUFiOztBQUVBLE9BQUssSUFBSUUsTUFBTSxDQUFmLEVBQWtCQSxNQUFNTCxNQUF4QixFQUFnQ0ssS0FBaEMsRUFBdUM7QUFDckMsU0FBSyxJQUFJQyxRQUFRLENBQWpCLEVBQW9CQSxRQUFRSixLQUE1QixFQUFtQ0ksU0FBUyxDQUE1QyxFQUErQztBQUM3QyxVQUFNQyxRQUFRLDRCQUNaLENBQ0VULGtCQUFrQk8sR0FBbEIsRUFBdUJDLEtBQXZCLENBREYsRUFFRVIsa0JBQWtCTyxHQUFsQixFQUF1QkMsUUFBUSxDQUEvQixDQUZGLEVBR0VSLGtCQUFrQk8sR0FBbEIsRUFBdUJDLFFBQVEsQ0FBL0IsQ0FIRixFQUlFUixrQkFBa0JPLEdBQWxCLEVBQXVCQyxRQUFRLENBQS9CLENBSkYsQ0FEWSxFQU9aLENBQ0VQLGlCQUFpQk0sR0FBakIsRUFBc0JDLEtBQXRCLENBREYsRUFFRVAsaUJBQWlCTSxHQUFqQixFQUFzQkMsUUFBUSxDQUE5QixDQUZGLEVBR0VQLGlCQUFpQk0sR0FBakIsRUFBc0JDLFFBQVEsQ0FBOUIsQ0FIRixFQUlFUCxpQkFBaUJNLEdBQWpCLEVBQXNCQyxRQUFRLENBQTlCLENBSkYsQ0FQWSxDQUFkOztBQWVBVCxXQUFNUSxNQUFNTCxNQUFQLEdBQWlCTSxLQUFqQixHQUF5QixDQUE5QixJQUFtQ0MsTUFBTSxDQUFOLENBQW5DLENBaEI2QyxDQWdCQTtBQUM3Q1YsV0FBTVEsTUFBTUwsTUFBUCxHQUFpQk0sS0FBakIsR0FBeUIsQ0FBOUIsSUFBbUNDLE1BQU0sQ0FBTixDQUFuQyxDQWpCNkMsQ0FpQkE7QUFDN0NWLFdBQU1RLE1BQU1MLE1BQVAsR0FBaUJNLEtBQWpCLEdBQXlCLENBQTlCLElBQW1DQyxNQUFNLENBQU4sQ0FBbkMsQ0FsQjZDLENBa0JBO0FBQzdDVixXQUFNUSxNQUFNTCxNQUFQLEdBQWlCTSxLQUFqQixHQUF5QixDQUE5QixJQUFtQ0MsTUFBTSxDQUFOLENBQW5DLENBbkI2QyxDQW1CQTtBQUM5QztBQUNGOztBQUVEWixPQUFLYSxXQUFMLENBQWlCWCxJQUFqQjtBQUNBRixPQUFLYyxLQUFMO0FBQ0QsQ0FyQ0QiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXREaWZmUGl4ZWwgZnJvbSAnLi4vZ2V0RGlmZlBpeGVsJztcblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHtcbiAgZGF0YToge1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0sXG59KSA9PiB7XG4gIGNvbnN0IGhlaWdodCA9IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aDtcbiAgY29uc3Qgd2lkdGggPSBwcmV2aW91c0ltYWdlRGF0YVswXS5sZW5ndGg7XG4gIGNvbnN0IHNpemUgPSB3aWR0aCAqIGhlaWdodDtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShzaXplKTtcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpZHRoOyBpbmRleCArPSA0KSB7XG4gICAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgICAgW1xuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXhdLFxuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4ICsgMl0sXG4gICAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbcm93XVtpbmRleCArIDNdLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4XSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAyXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAzXSxcbiAgICAgICAgXVxuICAgICAgKTtcblxuICAgICAgZGF0YVsocm93ICogaGVpZ2h0KSArIGluZGV4ICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgICAgZGF0YVsocm93ICogaGVpZ2h0KSArIGluZGV4ICsgMV0gPSBwaXhlbFsxXTsgLy8gZ1xuICAgICAgZGF0YVsocm93ICogaGVpZ2h0KSArIGluZGV4ICsgMl0gPSBwaXhlbFsyXTsgLy8gYlxuICAgICAgZGF0YVsocm93ICogaGVpZ2h0KSArIGluZGV4ICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICAgIH1cbiAgfVxuXG4gIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(2);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(3);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n debugger;\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRSxPQUFPLGlDQUFrQkYsYUFBbEIsRUFBaUNDLFlBQWpDLDZDQUFiOztBQUVBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQ7QUFDQSxTQUFPLHVCQUNMLENBQUMsR0FBRCxFQUFNLEVBQU4sRUFBVSxHQUFWLEVBQWUsTUFBTUksS0FBS0MsR0FBTCxDQUFTLEdBQVQsRUFBY0YsSUFBZCxDQUFyQixDQURLLEVBRUxILEtBRkssQ0FBUDtBQUlEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuaW1wb3J0IGV1Y2xpZGVhbkRpc3RhbmNlLCB7IE1BWF9FVUNMSURFQU5fRElTVEFOQ0UgfSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuY29uc3QgV0hJVEUgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIC8vIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICAvL1xuICAvLyBUaGlzIG1ldGhvZCBzaW1wbHkgdGFrZXMgdGhlIEV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBSR0JBIGNoYW5uZWxzXG4gIC8vIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAgLy8gcGVyY2VudGFnZSBvZiBob3cgZGlmZmVyZW50IHRoZSB0d28gY29sb3JzIGFyZS5cbiAgLy9cbiAgLy8gQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gIC8vIERlbHRhIEUgaW4gTGFiIGNvbG9yc3BhY2UsIHdlIHByb2JhYmx5IGRvbid0IG5lZWQgcGVyY2VwdHVhbCBhY2N1cmFjeSBmb3JcbiAgLy8gdGhpcyBhcHBsaWNhdGlvbiwgYW5kIGl0IGlzIG5pY2UgdG8gYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGNvbnZlcnRpbmcgUkdCQVxuICAvLyB0byBMYWIuXG4gIGNvbnN0IGRpZmYgPSBldWNsaWRlYW5EaXN0YW5jZShwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIC8gTUFYX0VVQ0xJREVBTl9ESVNUQU5DRTtcblxuICBpZiAoZGlmZiA9PT0gMCkge1xuICAgIHJldHVybiBjb21wb3NlKFxuICAgICAgW2N1cnJlbnRQaXhlbFswXSwgY3VycmVudFBpeGVsWzFdLCBjdXJyZW50UGl4ZWxbMl0sIDQwXSxcbiAgICAgIFdISVRFXG4gICAgKTtcbiAgfVxuXG4gIGRlYnVnZ2VyO1xuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
66
+
67
+ /***/ }
68
+ /******/ ]);
@@ -0,0 +1,68 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var width = previousImageData[0].length;\n var height = previousImageData.length;\n\n var gutterWidth = 20 * 4;\n\n var diffImageSize = (gutterWidth + width) * height;\n\n var data = new Uint8ClampedArray(diffImageSize);\n\n for (var row = 0; row < height; row++) {\n for (var index = 0; index < width; index += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[row][index], previousImageData[row][index + 1], previousImageData[row][index + 2], previousImageData[row][index + 3]], [currentImageData[row][index], currentImageData[row][index + 1], currentImageData[row][index + 2], currentImageData[row][index + 3]]);\n\n var dataIndex = gutterWidth + row * width + index;\n data[dataIndex + 0] = pixel[0]; // r\n data[dataIndex + 1] = pixel[1]; // g\n data[dataIndex + 2] = pixel[2]; // b\n data[dataIndex + 3] = pixel[3]; // a\n }\n }\n\n self.postMessage({\n data: data,\n width: (gutterWidth + width) / 4,\n height: height\n });\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsImhlaWdodCIsImd1dHRlcldpZHRoIiwiZGlmZkltYWdlU2l6ZSIsIlVpbnQ4Q2xhbXBlZEFycmF5Iiwicm93IiwiaW5kZXgiLCJwaXhlbCIsImRhdGFJbmRleCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxnQkFLM0I7QUFBQSx1QkFKSkMsSUFJSTtBQUFBLE1BSEZDLGlCQUdFLGFBSEZBLGlCQUdFO0FBQUEsTUFGRkMsZ0JBRUUsYUFGRkEsZ0JBRUU7O0FBQ0osTUFBTUMsUUFBUUYsa0JBQWtCLENBQWxCLEVBQXFCRyxNQUFuQztBQUNBLE1BQU1DLFNBQVNKLGtCQUFrQkcsTUFBakM7O0FBRUEsTUFBTUUsY0FBYyxLQUFLLENBQXpCOztBQUVBLE1BQU1DLGdCQUFnQixDQUFDRCxjQUFjSCxLQUFmLElBQXdCRSxNQUE5Qzs7QUFFQSxNQUFNTCxPQUFPLElBQUlRLGlCQUFKLENBQXNCRCxhQUF0QixDQUFiOztBQUVBLE9BQUssSUFBSUUsTUFBTSxDQUFmLEVBQWtCQSxNQUFNSixNQUF4QixFQUFnQ0ksS0FBaEMsRUFBdUM7QUFDckMsU0FBSyxJQUFJQyxRQUFRLENBQWpCLEVBQW9CQSxRQUFRUCxLQUE1QixFQUFtQ08sU0FBUyxDQUE1QyxFQUErQztBQUM3QyxVQUFNQyxRQUFRLDRCQUNaLENBQ0VWLGtCQUFrQlEsR0FBbEIsRUFBdUJDLEtBQXZCLENBREYsRUFFRVQsa0JBQWtCUSxHQUFsQixFQUF1QkMsUUFBUSxDQUEvQixDQUZGLEVBR0VULGtCQUFrQlEsR0FBbEIsRUFBdUJDLFFBQVEsQ0FBL0IsQ0FIRixFQUlFVCxrQkFBa0JRLEdBQWxCLEVBQXVCQyxRQUFRLENBQS9CLENBSkYsQ0FEWSxFQU9aLENBQ0VSLGlCQUFpQk8sR0FBakIsRUFBc0JDLEtBQXRCLENBREYsRUFFRVIsaUJBQWlCTyxHQUFqQixFQUFzQkMsUUFBUSxDQUE5QixDQUZGLEVBR0VSLGlCQUFpQk8sR0FBakIsRUFBc0JDLFFBQVEsQ0FBOUIsQ0FIRixFQUlFUixpQkFBaUJPLEdBQWpCLEVBQXNCQyxRQUFRLENBQTlCLENBSkYsQ0FQWSxDQUFkOztBQWVBLFVBQU1FLFlBQVlOLGNBQWVHLE1BQU1OLEtBQXJCLEdBQThCTyxLQUFoRDtBQUNBVixXQUFLWSxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FqQjZDLENBaUJiO0FBQ2hDWCxXQUFLWSxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FsQjZDLENBa0JiO0FBQ2hDWCxXQUFLWSxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FuQjZDLENBbUJiO0FBQ2hDWCxXQUFLWSxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FwQjZDLENBb0JiO0FBQ2pDO0FBQ0Y7O0FBRURiLE9BQUtlLFdBQUwsQ0FBaUI7QUFDZmIsY0FEZTtBQUVmRyxXQUFPLENBQUNHLGNBQWNILEtBQWYsSUFBd0IsQ0FGaEI7QUFHZkU7QUFIZSxHQUFqQjtBQUtBUCxPQUFLZ0IsS0FBTDtBQUNELENBOUNEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7XG4gIGRhdGE6IHtcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9LFxufSkgPT4ge1xuICBjb25zdCB3aWR0aCA9IHByZXZpb3VzSW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgaGVpZ2h0ID0gcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoO1xuXG4gIGNvbnN0IGd1dHRlcldpZHRoID0gMjAgKiA0O1xuXG4gIGNvbnN0IGRpZmZJbWFnZVNpemUgPSAoZ3V0dGVyV2lkdGggKyB3aWR0aCkgKiBoZWlnaHQ7XG5cbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShkaWZmSW1hZ2VTaXplKTtcblxuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHdpZHRoOyBpbmRleCArPSA0KSB7XG4gICAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgICAgW1xuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXhdLFxuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4ICsgMl0sXG4gICAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbcm93XVtpbmRleCArIDNdLFxuICAgICAgICBdLFxuICAgICAgICBbXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4XSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAxXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAyXSxcbiAgICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW3Jvd11baW5kZXggKyAzXSxcbiAgICAgICAgXVxuICAgICAgKTtcblxuICAgICAgY29uc3QgZGF0YUluZGV4ID0gZ3V0dGVyV2lkdGggKyAocm93ICogd2lkdGgpICsgaW5kZXg7XG4gICAgICBkYXRhW2RhdGFJbmRleCArIDBdID0gcGl4ZWxbMF07IC8vIHJcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgMV0gPSBwaXhlbFsxXTsgLy8gZ1xuICAgICAgZGF0YVtkYXRhSW5kZXggKyAyXSA9IHBpeGVsWzJdOyAvLyBiXG4gICAgICBkYXRhW2RhdGFJbmRleCArIDNdID0gcGl4ZWxbM107IC8vIGFcbiAgICB9XG4gIH1cblxuICBzZWxmLnBvc3RNZXNzYWdlKHtcbiAgICBkYXRhLFxuICAgIHdpZHRoOiAoZ3V0dGVyV2lkdGggKyB3aWR0aCkgLyA0LFxuICAgIGhlaWdodCxcbiAgfSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(2);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(3);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n if (!previousPixel) {\n return currentPixel;\n }\n\n if (!currentPixel) {\n return previousPixel;\n }\n\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQ7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNRSxPQUFPLGlDQUFrQkYsYUFBbEIsRUFBaUNDLFlBQWpDLDZDQUFiOztBQUVBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQsU0FBTyx1QkFDTCxDQUFDLEdBQUQsRUFBTSxFQUFOLEVBQVUsR0FBVixFQUFlLE1BQU1JLEtBQUtDLEdBQUwsQ0FBUyxHQUFULEVBQWNGLElBQWQsQ0FBckIsQ0FESyxFQUVMSCxLQUZLLENBQVA7QUFJRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbXBvc2UgZnJvbSAnLi9jb21wb3NlJztcbmltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSwgeyBNQVhfRVVDTElERUFOX0RJU1RBTkNFIH0gZnJvbSAnLi9ldWNsaWRlYW5EaXN0YW5jZSc7XG5cbmNvbnN0IFdISVRFID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERpZmZQaXhlbChwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIHtcbiAgaWYgKCFwcmV2aW91c1BpeGVsKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQaXhlbDtcbiAgfVxuXG4gIGlmICghY3VycmVudFBpeGVsKSB7XG4gICAgcmV0dXJuIHByZXZpb3VzUGl4ZWw7XG4gIH1cblxuICAvLyBDb21wdXRlIGEgc2NvcmUgdGhhdCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBwaXhlbHNcbiAgLy9cbiAgLy8gVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICAvLyBvZiAyIGNvbG9ycyBvdmVyIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEV1Y2xpZGVhbiBkaXN0YW5jZS4gVGhpcyBnaXZlcyB1cyBhXG4gIC8vIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gIC8vXG4gIC8vIEFsdGhvdWdoIGl0IHdvdWxkIGJlIG1vcmUgcGVyY2VwdHVhbGx5IGFjY3VyYXRlIHRvIGNhbGN1bGF0ZSBhIHByb3BlclxuICAvLyBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gIC8vIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAgLy8gdG8gTGFiLlxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG5cbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gY29tcG9zZShcbiAgICAgIFtjdXJyZW50UGl4ZWxbMF0sIGN1cnJlbnRQaXhlbFsxXSwgY3VycmVudFBpeGVsWzJdLCA0MF0sXG4gICAgICBXSElURVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
66
+
67
+ /***/ }
68
+ /******/ ]);
@@ -0,0 +1,68 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId])
10
+ /******/ return installedModules[moduleId].exports;
11
+
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ exports: {},
15
+ /******/ id: moduleId,
16
+ /******/ loaded: false
17
+ /******/ };
18
+
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.loaded = true;
24
+
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+
29
+
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+
36
+ /******/ // __webpack_public_path__
37
+ /******/ __webpack_require__.p = "";
38
+
39
+ /******/ // Load entry module and return exports
40
+ /******/ return __webpack_require__(0);
41
+ /******/ })
42
+ /************************************************************************/
43
+ /******/ ([
44
+ /* 0 */
45
+ /***/ function(module, exports, __webpack_require__) {
46
+
47
+ eval("'use strict';\n\nvar _getDiffPixel = __webpack_require__(1);\n\nvar _getDiffPixel2 = _interopRequireDefault(_getDiffPixel);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nself.addEventListener('message', function (_ref) {\n var _ref$data = _ref.data;\n var previousImageData = _ref$data.previousImageData;\n var currentImageData = _ref$data.currentImageData;\n\n var width = previousImageData[0].length;\n var height = previousImageData.length;\n var size = width * height;\n\n var data = new Uint8ClampedArray(size);\n\n for (var row = 0; row < height; row++) {\n for (var index = 0; index < width; index += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[row][index], previousImageData[row][index + 1], previousImageData[row][index + 2], previousImageData[row][index + 3]], [currentImageData[row][index], currentImageData[row][index + 1], currentImageData[row][index + 2], currentImageData[row][index + 3]]);\n\n var dataIndex = row * width + index;\n data[dataIndex + 0] = pixel[0]; // r\n data[dataIndex + 1] = pixel[1]; // g\n data[dataIndex + 2] = pixel[2]; // b\n data[dataIndex + 3] = pixel[3]; // a\n }\n }\n\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsImhlaWdodCIsInNpemUiLCJVaW50OENsYW1wZWRBcnJheSIsInJvdyIsImluZGV4IiwicGl4ZWwiLCJkYXRhSW5kZXgiLCJwb3N0TWVzc2FnZSIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQUEsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsZ0JBSzNCO0FBQUEsdUJBSkpDLElBSUk7QUFBQSxNQUhGQyxpQkFHRSxhQUhGQSxpQkFHRTtBQUFBLE1BRkZDLGdCQUVFLGFBRkZBLGdCQUVFOztBQUNKLE1BQU1DLFFBQVFGLGtCQUFrQixDQUFsQixFQUFxQkcsTUFBbkM7QUFDQSxNQUFNQyxTQUFTSixrQkFBa0JHLE1BQWpDO0FBQ0EsTUFBTUUsT0FBT0gsUUFBUUUsTUFBckI7O0FBRUEsTUFBTUwsT0FBTyxJQUFJTyxpQkFBSixDQUFzQkQsSUFBdEIsQ0FBYjs7QUFFQSxPQUFLLElBQUlFLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFNBQUssSUFBSUMsUUFBUSxDQUFqQixFQUFvQkEsUUFBUU4sS0FBNUIsRUFBbUNNLFNBQVMsQ0FBNUMsRUFBK0M7QUFDN0MsVUFBTUMsUUFBUSw0QkFDWixDQUNFVCxrQkFBa0JPLEdBQWxCLEVBQXVCQyxLQUF2QixDQURGLEVBRUVSLGtCQUFrQk8sR0FBbEIsRUFBdUJDLFFBQVEsQ0FBL0IsQ0FGRixFQUdFUixrQkFBa0JPLEdBQWxCLEVBQXVCQyxRQUFRLENBQS9CLENBSEYsRUFJRVIsa0JBQWtCTyxHQUFsQixFQUF1QkMsUUFBUSxDQUEvQixDQUpGLENBRFksRUFPWixDQUNFUCxpQkFBaUJNLEdBQWpCLEVBQXNCQyxLQUF0QixDQURGLEVBRUVQLGlCQUFpQk0sR0FBakIsRUFBc0JDLFFBQVEsQ0FBOUIsQ0FGRixFQUdFUCxpQkFBaUJNLEdBQWpCLEVBQXNCQyxRQUFRLENBQTlCLENBSEYsRUFJRVAsaUJBQWlCTSxHQUFqQixFQUFzQkMsUUFBUSxDQUE5QixDQUpGLENBUFksQ0FBZDs7QUFlQSxVQUFNRSxZQUFhSCxNQUFNTCxLQUFQLEdBQWdCTSxLQUFsQztBQUNBVCxXQUFLVyxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FqQjZDLENBaUJiO0FBQ2hDVixXQUFLVyxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FsQjZDLENBa0JiO0FBQ2hDVixXQUFLVyxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FuQjZDLENBbUJiO0FBQ2hDVixXQUFLVyxZQUFZLENBQWpCLElBQXNCRCxNQUFNLENBQU4sQ0FBdEIsQ0FwQjZDLENBb0JiO0FBQ2pDO0FBQ0Y7O0FBRURaLE9BQUtjLFdBQUwsQ0FBaUJaLElBQWpCO0FBQ0FGLE9BQUtlLEtBQUw7QUFDRCxDQXZDRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGdldERpZmZQaXhlbCBmcm9tICcuLi9nZXREaWZmUGl4ZWwnO1xuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoe1xuICBkYXRhOiB7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgfSxcbn0pID0+IHtcbiAgY29uc3Qgd2lkdGggPSBwcmV2aW91c0ltYWdlRGF0YVswXS5sZW5ndGg7XG4gIGNvbnN0IGhlaWdodCA9IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aDtcbiAgY29uc3Qgc2l6ZSA9IHdpZHRoICogaGVpZ2h0O1xuXG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkoc2l6ZSk7XG5cbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB3aWR0aDsgaW5kZXggKz0gNCkge1xuICAgICAgY29uc3QgcGl4ZWwgPSBnZXREaWZmUGl4ZWwoXG4gICAgICAgIFtcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4XSxcbiAgICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtyb3ddW2luZGV4ICsgMV0sXG4gICAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbcm93XVtpbmRleCArIDJdLFxuICAgICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW3Jvd11baW5kZXggKyAzXSxcbiAgICAgICAgXSxcbiAgICAgICAgW1xuICAgICAgICAgIGN1cnJlbnRJbWFnZURhdGFbcm93XVtpbmRleF0sXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4ICsgMV0sXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4ICsgMl0sXG4gICAgICAgICAgY3VycmVudEltYWdlRGF0YVtyb3ddW2luZGV4ICsgM10sXG4gICAgICAgIF1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGRhdGFJbmRleCA9IChyb3cgKiB3aWR0aCkgKyBpbmRleDtcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgICAgZGF0YVtkYXRhSW5kZXggKyAxXSA9IHBpeGVsWzFdOyAvLyBnXG4gICAgICBkYXRhW2RhdGFJbmRleCArIDJdID0gcGl4ZWxbMl07IC8vIGJcbiAgICAgIGRhdGFbZGF0YUluZGV4ICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICAgIH1cbiAgfVxuXG4gIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
+
49
+ /***/ },
50
+ /* 1 */
51
+ /***/ function(module, exports, __webpack_require__) {
52
+
53
+ eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = getDiffPixel;\n\nvar _compose = __webpack_require__(2);\n\nvar _compose2 = _interopRequireDefault(_compose);\n\nvar _euclideanDistance = __webpack_require__(3);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar WHITE = [255, 255, 255, 255];\n\nfunction getDiffPixel(previousPixel, currentPixel) {\n // Compute a score that represents the difference between 2 pixels\n //\n // This method simply takes the Euclidean distance between the RGBA channels\n // of 2 colors over the maximum possible Euclidean distance. This gives us a\n // percentage of how different the two colors are.\n //\n // Although it would be more perceptually accurate to calculate a proper\n // Delta E in Lab colorspace, we probably don't need perceptual accuracy for\n // this application, and it is nice to avoid the overhead of converting RGBA\n // to Lab.\n var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 40], WHITE);\n }\n\n return (0, _compose2.default)([179, 54, 130, 255 * Math.max(0.2, diff)], WHITE);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE1BQU1DLE9BQU8saUNBQWtCRixhQUFsQixFQUFpQ0MsWUFBakMsNkNBQWI7O0FBRUEsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyx1QkFDTCxDQUFDRCxhQUFhLENBQWIsQ0FBRCxFQUFrQkEsYUFBYSxDQUFiLENBQWxCLEVBQW1DQSxhQUFhLENBQWIsQ0FBbkMsRUFBb0QsRUFBcEQsQ0FESyxFQUVMRixLQUZLLENBQVA7QUFJRDs7QUFFRCxTQUFPLHVCQUNMLENBQUMsR0FBRCxFQUFNLEVBQU4sRUFBVSxHQUFWLEVBQWUsTUFBTUksS0FBS0MsR0FBTCxDQUFTLEdBQVQsRUFBY0YsSUFBZCxDQUFyQixDQURLLEVBRUxILEtBRkssQ0FBUDtBQUlEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgY29tcG9zZSBmcm9tICcuL2NvbXBvc2UnO1xuaW1wb3J0IGV1Y2xpZGVhbkRpc3RhbmNlLCB7IE1BWF9FVUNMSURFQU5fRElTVEFOQ0UgfSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuY29uc3QgV0hJVEUgPSBbMjU1LCAyNTUsIDI1NSwgMjU1XTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICAvLyBDb21wdXRlIGEgc2NvcmUgdGhhdCByZXByZXNlbnRzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gMiBwaXhlbHNcbiAgLy9cbiAgLy8gVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICAvLyBvZiAyIGNvbG9ycyBvdmVyIHRoZSBtYXhpbXVtIHBvc3NpYmxlIEV1Y2xpZGVhbiBkaXN0YW5jZS4gVGhpcyBnaXZlcyB1cyBhXG4gIC8vIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gIC8vXG4gIC8vIEFsdGhvdWdoIGl0IHdvdWxkIGJlIG1vcmUgcGVyY2VwdHVhbGx5IGFjY3VyYXRlIHRvIGNhbGN1bGF0ZSBhIHByb3BlclxuICAvLyBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gIC8vIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAgLy8gdG8gTGFiLlxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG5cbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gY29tcG9zZShcbiAgICAgIFtjdXJyZW50UGl4ZWxbMF0sIGN1cnJlbnRQaXhlbFsxXSwgY3VycmVudFBpeGVsWzJdLCA0MF0sXG4gICAgICBXSElURVxuICAgICk7XG4gIH1cblxuICByZXR1cm4gY29tcG9zZShcbiAgICBbMTc5LCA1NCwgMTMwLCAyNTUgKiBNYXRoLm1heCgwLjIsIGRpZmYpXSxcbiAgICBXSElURVxuICApO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = compose;\nfunction isOpaque(color) {\n return color[3] === 255;\n}\n\nfunction isFullyTransparent(color) {\n return color[3] === 0;\n}\n\n/**\n * Multiplies two fractions using integer math, where the fractions are stored\n * using an integer between 0 and 255. This method is used as a helper method\n * for compositing colors using integer math.\n *\n * This is a quicker implementation of Math.round((a * b) / 255.0)\n */\nfunction int8Mult(a, b) {\n var t = a * b + 0x80;\n return (t >> 8) + t >> 8;\n}\n\n/**\n * Composes two colors with an alpha channel using integer math.\n *\n * This version is faster than a version based on floating point math.\n */\nfunction compose(foreground, background) {\n if (isOpaque(foreground) || isFullyTransparent(background)) {\n return foreground;\n }\n\n if (isFullyTransparent(foreground)) {\n return background;\n }\n\n var aCom = int8Mult(0xff - foreground[3], background[3]);\n return [int8Mult(foreground[3], foreground[0]) + int8Mult(aCom, background[0]), int8Mult(foreground[3], foreground[1]) + int8Mult(aCom, background[1]), int8Mult(foreground[3], foreground[2]) + int8Mult(aCom, background[2]), foreground[3] + aCom];\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvY29tcG9zZS5qcz8wZWM5Il0sIm5hbWVzIjpbImNvbXBvc2UiLCJpc09wYXF1ZSIsImNvbG9yIiwiaXNGdWxseVRyYW5zcGFyZW50IiwiaW50OE11bHQiLCJhIiwiYiIsInQiLCJmb3JlZ3JvdW5kIiwiYmFja2dyb3VuZCIsImFDb20iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQXlCd0JBLE87QUF6QnhCLFNBQVNDLFFBQVQsQ0FBa0JDLEtBQWxCLEVBQXlCO0FBQ3ZCLFNBQU9BLE1BQU0sQ0FBTixNQUFhLEdBQXBCO0FBQ0Q7O0FBRUQsU0FBU0Msa0JBQVQsQ0FBNEJELEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLE1BQU0sQ0FBTixNQUFhLENBQXBCO0FBQ0Q7O0FBRUQ7Ozs7Ozs7QUFPQSxTQUFTRSxRQUFULENBQWtCQyxDQUFsQixFQUFxQkMsQ0FBckIsRUFBd0I7QUFDdEIsTUFBTUMsSUFBS0YsSUFBSUMsQ0FBTCxHQUFVLElBQXBCO0FBQ0EsU0FBUSxDQUFDQyxLQUFLLENBQU4sSUFBV0EsQ0FBWixJQUFrQixDQUF6QjtBQUNEOztBQUVEOzs7OztBQUtlLFNBQVNQLE9BQVQsQ0FBaUJRLFVBQWpCLEVBQTZCQyxVQUE3QixFQUF5QztBQUN0RCxNQUFJUixTQUFTTyxVQUFULEtBQXdCTCxtQkFBbUJNLFVBQW5CLENBQTVCLEVBQTREO0FBQzFELFdBQU9ELFVBQVA7QUFDRDs7QUFFRCxNQUFJTCxtQkFBbUJLLFVBQW5CLENBQUosRUFBb0M7QUFDbEMsV0FBT0MsVUFBUDtBQUNEOztBQUVELE1BQU1DLE9BQU9OLFNBQVMsT0FBT0ksV0FBVyxDQUFYLENBQWhCLEVBQStCQyxXQUFXLENBQVgsQ0FBL0IsQ0FBYjtBQUNBLFNBQU8sQ0FDTEwsU0FBU0ksV0FBVyxDQUFYLENBQVQsRUFBd0JBLFdBQVcsQ0FBWCxDQUF4QixJQUF5Q0osU0FBU00sSUFBVCxFQUFlRCxXQUFXLENBQVgsQ0FBZixDQURwQyxFQUVMTCxTQUFTSSxXQUFXLENBQVgsQ0FBVCxFQUF3QkEsV0FBVyxDQUFYLENBQXhCLElBQXlDSixTQUFTTSxJQUFULEVBQWVELFdBQVcsQ0FBWCxDQUFmLENBRnBDLEVBR0xMLFNBQVNJLFdBQVcsQ0FBWCxDQUFULEVBQXdCQSxXQUFXLENBQVgsQ0FBeEIsSUFBeUNKLFNBQVNNLElBQVQsRUFBZUQsV0FBVyxDQUFYLENBQWYsQ0FIcEMsRUFJTEQsV0FBVyxDQUFYLElBQWdCRSxJQUpYLENBQVA7QUFNRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaXNPcGFxdWUoY29sb3IpIHtcbiAgcmV0dXJuIGNvbG9yWzNdID09PSAyNTU7XG59XG5cbmZ1bmN0aW9uIGlzRnVsbHlUcmFuc3BhcmVudChjb2xvcikge1xuICByZXR1cm4gY29sb3JbM10gPT09IDA7XG59XG5cbi8qKlxuICogTXVsdGlwbGllcyB0d28gZnJhY3Rpb25zIHVzaW5nIGludGVnZXIgbWF0aCwgd2hlcmUgdGhlIGZyYWN0aW9ucyBhcmUgc3RvcmVkXG4gKiB1c2luZyBhbiBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgMjU1LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGFzIGEgaGVscGVyIG1ldGhvZFxuICogZm9yIGNvbXBvc2l0aW5nIGNvbG9ycyB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyBpcyBhIHF1aWNrZXIgaW1wbGVtZW50YXRpb24gb2YgTWF0aC5yb3VuZCgoYSAqIGIpIC8gMjU1LjApXG4gKi9cbmZ1bmN0aW9uIGludDhNdWx0KGEsIGIpIHtcbiAgY29uc3QgdCA9IChhICogYikgKyAweDgwO1xuICByZXR1cm4gKCh0ID4+IDgpICsgdCkgPj4gODtcbn1cblxuLyoqXG4gKiBDb21wb3NlcyB0d28gY29sb3JzIHdpdGggYW4gYWxwaGEgY2hhbm5lbCB1c2luZyBpbnRlZ2VyIG1hdGguXG4gKlxuICogVGhpcyB2ZXJzaW9uIGlzIGZhc3RlciB0aGFuIGEgdmVyc2lvbiBiYXNlZCBvbiBmbG9hdGluZyBwb2ludCBtYXRoLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBjb21wb3NlKGZvcmVncm91bmQsIGJhY2tncm91bmQpIHtcbiAgaWYgKGlzT3BhcXVlKGZvcmVncm91bmQpIHx8IGlzRnVsbHlUcmFuc3BhcmVudChiYWNrZ3JvdW5kKSkge1xuICAgIHJldHVybiBmb3JlZ3JvdW5kO1xuICB9XG5cbiAgaWYgKGlzRnVsbHlUcmFuc3BhcmVudChmb3JlZ3JvdW5kKSkge1xuICAgIHJldHVybiBiYWNrZ3JvdW5kO1xuICB9XG5cbiAgY29uc3QgYUNvbSA9IGludDhNdWx0KDB4ZmYgLSBmb3JlZ3JvdW5kWzNdLCBiYWNrZ3JvdW5kWzNdKTtcbiAgcmV0dXJuIFtcbiAgICBpbnQ4TXVsdChmb3JlZ3JvdW5kWzNdLCBmb3JlZ3JvdW5kWzBdKSArIGludDhNdWx0KGFDb20sIGJhY2tncm91bmRbMF0pLFxuICAgIGludDhNdWx0KGZvcmVncm91bmRbM10sIGZvcmVncm91bmRbMV0pICsgaW50OE11bHQoYUNvbSwgYmFja2dyb3VuZFsxXSksXG4gICAgaW50OE11bHQoZm9yZWdyb3VuZFszXSwgZm9yZWdyb3VuZFsyXSkgKyBpbnQ4TXVsdChhQ29tLCBiYWNrZ3JvdW5kWzJdKSxcbiAgICBmb3JlZ3JvdW5kWzNdICsgYUNvbSxcbiAgXTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2NvbXBvc2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ },
62
+ /* 3 */
63
+ /***/ function(module, exports) {
64
+
65
+ eval("\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = euclideanDistance;\nfunction euclideanDistance(rgba1, rgba2) {\n return Math.sqrt(Math.pow(rgba1[0] - rgba2[0], 2) + Math.pow(rgba1[1] - rgba2[1], 2) + Math.pow(rgba1[2] - rgba2[2], 2) + Math.pow(rgba1[3] - rgba2[3], 2));\n}\n\nvar MAX_EUCLIDEAN_DISTANCE = exports.MAX_EUCLIDEAN_DISTANCE = Math.sqrt(Math.pow(255, 2) * 4);//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUF3QkEsaUI7QUFBVCxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELFNBQU9DLEtBQUtDLElBQUwsQ0FDTEQsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLElBQ0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQURGLEdBRUVDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUZGLEdBR0VDLEtBQUtFLEdBQUwsQ0FBU0osTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQixFQUE4QixDQUE5QixDQUpHLENBQVA7QUFNRDs7QUFFTSxJQUFNSSwwREFBeUJILEtBQUtDLElBQUwsQ0FBVUQsS0FBS0UsR0FBTCxDQUFTLEdBQVQsRUFBYyxDQUFkLElBQW1CLENBQTdCLENBQS9CIiwiZmlsZSI6IjMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgcmV0dXJuIE1hdGguc3FydChcbiAgICBNYXRoLnBvdyhyZ2JhMVswXSAtIHJnYmEyWzBdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbMV0gLSByZ2JhMlsxXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzJdIC0gcmdiYTJbMl0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVszXSAtIHJnYmEyWzNdLCAyKVxuICApO1xufVxuXG5leHBvcnQgY29uc3QgTUFYX0VVQ0xJREVBTl9ESVNUQU5DRSA9IE1hdGguc3FydChNYXRoLnBvdygyNTUsIDIpICogNCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9ldWNsaWRlYW5EaXN0YW5jZS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
66
+
67
+ /***/ }
68
+ /******/ ]);