happo 2.8.2 → 2.8.3

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 (209) hide show
  1. checksums.yaml +4 -4
  2. data/lib/happo/public/7c91087e37a93a8cfc20.worker.js +1 -0
  3. data/lib/happo/public/HappoApp.bundle.js +1 -1
  4. data/lib/happo/public/a0de80bb919d7982b92a.worker.js +1 -0
  5. data/lib/happo/version.rb +1 -1
  6. metadata +4 -205
  7. data/lib/happo/public/0144a92667ed2e8a8b13.worker.js +0 -56
  8. data/lib/happo/public/026c001beac0620bb23a.worker.js +0 -50
  9. data/lib/happo/public/05ad45a945afc6882286.worker.js +0 -56
  10. data/lib/happo/public/05bf9fb3d7f0192e7194.worker.js +0 -56
  11. data/lib/happo/public/06bf22e3fa348f77a82f.worker.js +0 -56
  12. data/lib/happo/public/08ccdc92f4d8ed3cff76.worker.js +0 -62
  13. data/lib/happo/public/0b94c9757c981bfc9fd7.worker.js +0 -62
  14. data/lib/happo/public/0d036738a62c01299743.worker.js +0 -56
  15. data/lib/happo/public/0dd329b74ed90a207896.worker.js +0 -56
  16. data/lib/happo/public/0e32a5b5219342a9aa1e.worker.js +0 -62
  17. data/lib/happo/public/105bb978b49beac37583.worker.js +0 -62
  18. data/lib/happo/public/1172b74983f510409e2d.worker.js +0 -62
  19. data/lib/happo/public/13d0677d081eefd8c8bb.worker.js +0 -62
  20. data/lib/happo/public/15b1495833b5b13f5f51.worker.js +0 -62
  21. data/lib/happo/public/1635684653e1a1979bea.worker.js +0 -56
  22. data/lib/happo/public/174b944ab9e9053c766d.worker.js +0 -56
  23. data/lib/happo/public/196b75660e2791fda25a.worker.js +0 -56
  24. data/lib/happo/public/1bb6a3a6bba3c02df491.worker.js +0 -62
  25. data/lib/happo/public/1c48c5a95c9c5331c65f.worker.js +0 -56
  26. data/lib/happo/public/1d1049629f51e72af69f.worker.js +0 -62
  27. data/lib/happo/public/1d5c0eb9c479f44f0ec2.worker.js +0 -56
  28. data/lib/happo/public/1d6c41b4828b191ae315.worker.js +0 -56
  29. data/lib/happo/public/1fd046493403de128de1.worker.js +0 -62
  30. data/lib/happo/public/20c34bdb9a226c485df8.worker.js +0 -56
  31. data/lib/happo/public/212269d558f1f8b1bc63.worker.js +0 -56
  32. data/lib/happo/public/220e711d4abdbc4bd32f.worker.js +0 -62
  33. data/lib/happo/public/23686d1b2fc3f4f86d12.worker.js +0 -56
  34. data/lib/happo/public/238307cd4525e692bc79.worker.js +0 -56
  35. data/lib/happo/public/25426637d793045ccb77.worker.js +0 -56
  36. data/lib/happo/public/28537ac53e64479763ba.worker.js +0 -56
  37. data/lib/happo/public/2c643331ceb20b73e255.worker.js +0 -56
  38. data/lib/happo/public/2db6b1d7219028bac961.worker.js +0 -62
  39. data/lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js +0 -62
  40. data/lib/happo/public/30e3af0e8f974da2885c.worker.js +0 -56
  41. data/lib/happo/public/30ee387dd21d6b20a927.worker.js +0 -62
  42. data/lib/happo/public/32fc2a09f98d30cb2a06.worker.js +0 -56
  43. data/lib/happo/public/33c43f9f1296a6c3b236.worker.js +0 -56
  44. data/lib/happo/public/34c08770d9dc4981b2a2.worker.js +0 -62
  45. data/lib/happo/public/35d8e219a4200e27adf9.worker.js +0 -62
  46. data/lib/happo/public/360e0acb872760f43b07.worker.js +0 -68
  47. data/lib/happo/public/385cc56a00d991287244.worker.js +0 -62
  48. data/lib/happo/public/38e90e6329f74e2d681a.worker.js +0 -56
  49. data/lib/happo/public/3a1ce5368a835b999d55.worker.js +0 -62
  50. data/lib/happo/public/3a6592504d8ee1810017.worker.js +0 -56
  51. data/lib/happo/public/3a7567174ad2bd91c107.worker.js +0 -56
  52. data/lib/happo/public/3a8bedd3121a2cdacb6d.worker.js +0 -56
  53. data/lib/happo/public/3b63d7abc667a23e0a2b.worker.js +0 -56
  54. data/lib/happo/public/3bdf5dcbba8864a7dcae.worker.js +0 -62
  55. data/lib/happo/public/3d9ed68ca315896c8ec7.worker.js +0 -56
  56. data/lib/happo/public/3da88471c60703398f95.worker.js +0 -56
  57. data/lib/happo/public/3ee7268990c5d4183ad1.worker.js +0 -62
  58. data/lib/happo/public/40c1aadf458bda245630.worker.js +0 -1
  59. data/lib/happo/public/41749e1ff9db63f87a1e.worker.js +0 -56
  60. data/lib/happo/public/41d90eebc5449581b92a.worker.js +0 -56
  61. data/lib/happo/public/42bc2c20d61979a23a2f.worker.js +0 -56
  62. data/lib/happo/public/447f3bfe79be8a67b9cc.worker.js +0 -56
  63. data/lib/happo/public/4580dd75ba5a064f4366.worker.js +0 -56
  64. data/lib/happo/public/46a8fcf803fae37aa259.worker.js +0 -62
  65. data/lib/happo/public/46ef1d4f416d92b92cab.worker.js +0 -62
  66. data/lib/happo/public/4960a52eba13a73eb069.worker.js +0 -56
  67. data/lib/happo/public/4975b25fe791d85e9827.worker.js +0 -56
  68. data/lib/happo/public/49c762dec74fb3e7c638.worker.js +0 -62
  69. data/lib/happo/public/4b23fa5d7875a8fba618.worker.js +0 -56
  70. data/lib/happo/public/4ecbb720788698ce7a9b.worker.js +0 -56
  71. data/lib/happo/public/4ef2e26b666b08b7411a.worker.js +0 -56
  72. data/lib/happo/public/507ef3ea49332d42f582.worker.js +0 -62
  73. data/lib/happo/public/511d7e03fd683c618a22.worker.js +0 -56
  74. data/lib/happo/public/51ac7ca571ae07cd9d7a.worker.js +0 -56
  75. data/lib/happo/public/527516eb649429b011f7.worker.js +0 -68
  76. data/lib/happo/public/52e42bbfa68714fd1b26.worker.js +0 -62
  77. data/lib/happo/public/531d99f56a3343cee5f8.worker.js +0 -56
  78. data/lib/happo/public/53e6a60c2cf0558157a7.worker.js +0 -56
  79. data/lib/happo/public/53e970da89474270e914.worker.js +0 -56
  80. data/lib/happo/public/54ba8bc7a595358209d2.worker.js +0 -68
  81. data/lib/happo/public/55d488167040d5350534.worker.js +0 -56
  82. data/lib/happo/public/572846c1173405e57d7d.worker.js +0 -62
  83. data/lib/happo/public/578cb8199b43c9f746ec.worker.js +0 -62
  84. data/lib/happo/public/588f7a6b784ef2b87932.worker.js +0 -56
  85. data/lib/happo/public/58ae755db5700fc141d3.worker.js +0 -62
  86. data/lib/happo/public/59d03b8990473ae492e0.worker.js +0 -56
  87. data/lib/happo/public/5aded6f9af816e819a2b.worker.js +0 -56
  88. data/lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js +0 -56
  89. data/lib/happo/public/5cbf9957eb776724a5b6.worker.js +0 -62
  90. data/lib/happo/public/5e6771e4a41f597c26a9.worker.js +0 -56
  91. data/lib/happo/public/612cb8b078897547b091.worker.js +0 -62
  92. data/lib/happo/public/61e924aed1761ec05ca0.worker.js +0 -56
  93. data/lib/happo/public/6368c448d11a203d506b.worker.js +0 -62
  94. data/lib/happo/public/65e7608bb10d0f2250d1.worker.js +0 -56
  95. data/lib/happo/public/69d16a4997e4170af4ee.worker.js +0 -1
  96. data/lib/happo/public/69fdd0bf1915b19115d6.worker.js +0 -62
  97. data/lib/happo/public/6a71a1273a0cf4065e1e.worker.js +0 -56
  98. data/lib/happo/public/727ca4589d56ddcb9c7f.worker.js +0 -56
  99. data/lib/happo/public/74309d94f574207e4e79.worker.js +0 -62
  100. data/lib/happo/public/74882ef02b7b28391aac.worker.js +0 -62
  101. data/lib/happo/public/769883a4d5abfa7384d4.worker.js +0 -56
  102. data/lib/happo/public/785285eac660735ef3e0.worker.js +0 -56
  103. data/lib/happo/public/78fea81d29830297df57.worker.js +0 -56
  104. data/lib/happo/public/7bf45d52cf57b1949851.worker.js +0 -56
  105. data/lib/happo/public/7d4a4086de8530abe101.worker.js +0 -56
  106. data/lib/happo/public/7d7551366f97adda7b5b.worker.js +0 -62
  107. data/lib/happo/public/7e330bc3ee246ab39910.worker.js +0 -56
  108. data/lib/happo/public/7e53176d18c890a5424c.worker.js +0 -56
  109. data/lib/happo/public/818ac008a4a7d62aa55c.worker.js +0 -62
  110. data/lib/happo/public/823340592678aeab5317.worker.js +0 -56
  111. data/lib/happo/public/84f3a66517b77798456d.worker.js +0 -56
  112. data/lib/happo/public/856dbe98c40d8f4bd452.worker.js +0 -56
  113. data/lib/happo/public/8cc13e3a447ea341f962.worker.js +0 -56
  114. data/lib/happo/public/8d0d79f0c81652bfb3f1.worker.js +0 -1
  115. data/lib/happo/public/9037f52c590941a75440.worker.js +0 -62
  116. data/lib/happo/public/90a4b81e4d7c2da63973.worker.js +0 -56
  117. data/lib/happo/public/92dd03e7cbe827a2df45.worker.js +0 -56
  118. data/lib/happo/public/935b279f09cf3c4046ec.worker.js +0 -62
  119. data/lib/happo/public/945f54dcc60d8b7abc9d.worker.js +0 -56
  120. data/lib/happo/public/94976fe48214f2bc68d6.worker.js +0 -56
  121. data/lib/happo/public/94ff43f0e47ff2759712.worker.js +0 -62
  122. data/lib/happo/public/95a6641585f90432e282.worker.js +0 -1
  123. data/lib/happo/public/95ae334beb5125d1b4ce.worker.js +0 -62
  124. data/lib/happo/public/95b52fcff8f5732b1902.worker.js +0 -62
  125. data/lib/happo/public/95f3e6e7eec59c0af3e5.worker.js +0 -56
  126. data/lib/happo/public/96c4c2f5df8175649a67.worker.js +0 -56
  127. data/lib/happo/public/973a6ae106ac4e664858.worker.js +0 -56
  128. data/lib/happo/public/984f0e2d0e896c2f4048.worker.js +0 -62
  129. data/lib/happo/public/988f633191766eef664a.worker.js +0 -56
  130. data/lib/happo/public/989e9ba236891bdfcf46.worker.js +0 -56
  131. data/lib/happo/public/99af2b663636fee65291.worker.js +0 -62
  132. data/lib/happo/public/9c8f5ee8dfa77750be8c.worker.js +0 -62
  133. data/lib/happo/public/9d57ea9c2af229a03119.worker.js +0 -56
  134. data/lib/happo/public/9d7be8cf3aadb0b77624.worker.js +0 -62
  135. data/lib/happo/public/9e6b804a33c6799809cf.worker.js +0 -62
  136. data/lib/happo/public/HappoApp.bundle.js.map +0 -1
  137. data/lib/happo/public/a3574ff725014ef26602.worker.js +0 -56
  138. data/lib/happo/public/a50e9af74a422839a15c.worker.js +0 -56
  139. data/lib/happo/public/a5564ec6a5def9e7a95a.worker.js +0 -1
  140. data/lib/happo/public/a59e639dbf2bc03792c2.worker.js +0 -56
  141. data/lib/happo/public/a6de7e3f4866c4d4af09.worker.js +0 -62
  142. data/lib/happo/public/a79d520c7469920c10a2.worker.js +0 -62
  143. data/lib/happo/public/a7da9c5111db811b9535.worker.js +0 -62
  144. data/lib/happo/public/a8bfebcafc4935d15b00.worker.js +0 -1
  145. data/lib/happo/public/a8d9429cf3dd094aa190.worker.js +0 -62
  146. data/lib/happo/public/ab952692e7c4df03d3b8.worker.js +0 -56
  147. data/lib/happo/public/aca1442707a8e088ec9e.worker.js +0 -62
  148. data/lib/happo/public/ad4fdfa82741585ce164.worker.js +0 -56
  149. data/lib/happo/public/adc1f6a613d0d2eda4b8.worker.js +0 -56
  150. data/lib/happo/public/ae0622a81101951ac112.worker.js +0 -56
  151. data/lib/happo/public/ae223678cdbfac88d9be.worker.js +0 -56
  152. data/lib/happo/public/b2a65c76321af7bc6d89.worker.js +0 -62
  153. data/lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js +0 -62
  154. data/lib/happo/public/b41bd9a6b659bfe3096f.worker.js +0 -62
  155. data/lib/happo/public/b441a6c1393a5d39b5ff.worker.js +0 -56
  156. data/lib/happo/public/b4c84506199d5745d950.worker.js +0 -56
  157. data/lib/happo/public/b5176c936b696653a407.worker.js +0 -56
  158. data/lib/happo/public/b66da676446fdda1a58c.worker.js +0 -56
  159. data/lib/happo/public/b86b963a72892d8f0fd1.worker.js +0 -56
  160. data/lib/happo/public/ba50214d2b6ac001493b.worker.js +0 -56
  161. data/lib/happo/public/bb6413d1cea030ba7a1e.worker.js +0 -56
  162. data/lib/happo/public/bc084ad60fb7dbbe0818.worker.js +0 -56
  163. data/lib/happo/public/c15e6b44ae496af6af9b.worker.js +0 -56
  164. data/lib/happo/public/c1dd7c953827ff9578f0.worker.js +0 -68
  165. data/lib/happo/public/c2297ce40f0d071ec173.worker.js +0 -1
  166. data/lib/happo/public/c4393394848f5242932e.worker.js +0 -56
  167. data/lib/happo/public/c556b6ede3bbd230cebd.worker.js +0 -62
  168. data/lib/happo/public/c60ceaff7849b394e27a.worker.js +0 -56
  169. data/lib/happo/public/c67c76de1e4def5019d5.worker.js +0 -56
  170. data/lib/happo/public/c7969739b50b79043b86.worker.js +0 -56
  171. data/lib/happo/public/ca172f55a8f34b526853.worker.js +0 -62
  172. data/lib/happo/public/cbc31c846bebca5538bf.worker.js +0 -62
  173. data/lib/happo/public/cc82d7609935eb1d2738.worker.js +0 -56
  174. data/lib/happo/public/ce2440f84aa6708e51d4.worker.js +0 -56
  175. data/lib/happo/public/d135dda9b0318be75e3c.worker.js +0 -56
  176. data/lib/happo/public/d2aded5d63912f5b7e1b.worker.js +0 -56
  177. data/lib/happo/public/d2be644581f8f67b207d.worker.js +0 -56
  178. data/lib/happo/public/d4d18f5ac12fd3309c03.worker.js +0 -56
  179. data/lib/happo/public/d5ec9230a58d0929fe2d.worker.js +0 -62
  180. data/lib/happo/public/d650ec5f5ee0203de80a.worker.js +0 -1
  181. data/lib/happo/public/d6dbbb2aeed75685efa1.worker.js +0 -62
  182. data/lib/happo/public/d6e037d3891cfb95fbca.worker.js +0 -50
  183. data/lib/happo/public/d7403b48b365a76148a2.worker.js +0 -56
  184. data/lib/happo/public/d7440908d264133044bb.worker.js +0 -56
  185. data/lib/happo/public/d75350c7043f58e46d0c.worker.js +0 -62
  186. data/lib/happo/public/d899e9318500e6115f21.worker.js +0 -62
  187. data/lib/happo/public/d8fefa1bd98baa4e38da.worker.js +0 -62
  188. data/lib/happo/public/da071c51e9a641ed805c.worker.js +0 -56
  189. data/lib/happo/public/dbe8eef9555ef0d43469.worker.js +0 -56
  190. data/lib/happo/public/df0d03d918e87308e3e3.worker.js +0 -62
  191. data/lib/happo/public/e1cbbfd7a3d705049eb0.worker.js +0 -56
  192. data/lib/happo/public/e3882591e6710cf03ed4.worker.js +0 -56
  193. data/lib/happo/public/e39e8636909998d394e8.worker.js +0 -56
  194. data/lib/happo/public/e414c768d66b9bcf86bb.worker.js +0 -56
  195. data/lib/happo/public/e5c91be22eaad28e7e82.worker.js +0 -56
  196. data/lib/happo/public/e65a11af21a63b0c66df.worker.js +0 -62
  197. data/lib/happo/public/e85bc4bb461158f5561d.worker.js +0 -56
  198. data/lib/happo/public/e8d18bed99776d3eabfd.worker.js +0 -62
  199. data/lib/happo/public/ed6256235d0a2b11aaf6.worker.js +0 -56
  200. data/lib/happo/public/edcc84bf4483670ba23e.worker.js +0 -56
  201. data/lib/happo/public/f0a047027dca5832b680.worker.js +0 -62
  202. data/lib/happo/public/f18c5838c7ec92d4a291.worker.js +0 -62
  203. data/lib/happo/public/f1b8838f395f31ff14a0.worker.js +0 -62
  204. data/lib/happo/public/f3d33d482a4326121c45.worker.js +0 -56
  205. data/lib/happo/public/f67e23a954230ea878be.worker.js +0 -56
  206. data/lib/happo/public/f800c3a1d9200926bde6.worker.js +0 -56
  207. data/lib/happo/public/f8954fa2849952175e2c.worker.js +0 -56
  208. data/lib/happo/public/fb955bccd11761291311.worker.js +0 -62
  209. data/lib/happo/public/fde5a206ff86c3d7ab10.worker.js +0 -56
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n var changes = 0;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n ai--;\n bi--;\n changes = 0;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwic3BsaWNlIiwiYWJzIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQThGd0JBLFc7Ozs7QUE5RnhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU1P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QixjQUFjcEIseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVcsZ0JBQWNPLFdBQWQsRUFBMkJuQixDQUEzQixFQUE4QkMsQ0FBOUI7QUFDRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTU9WRU1FTlQgPSB7XG4gIG5vbmU6IDAsXG4gIGRpYWdvbmFsOiAxLFxuICB2ZXJ0aWNhbDogMixcbiAgaG9yaXpvbnRhbDogMyxcbn07XG5cbmZ1bmN0aW9uIGluaXRNYXRyaXgoaGVpZ2h0LCB3aWR0aCkge1xuICBjb25zdCByb3dzID0gbmV3IEFycmF5KGhlaWdodCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIHJvd3NbaV0gPSBuZXcgSW50MzJBcnJheSh3aWR0aCk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKSB7XG4gIC8vIGFkYXB0ZWQgZnJvbVxuICAvLyBodHRwOi8vYWxnb3JpdGhtcy50dXRvcmlhbGhvcml6b24uY29tL2R5bmFtaWMtcHJvZ3JhbW1pbmctbG9uZ2VzdC1jb21tb24tc3Vic2VxdWVuY2UvXG4gIGNvbnN0IGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgY29uc3QgYkxlbmd0aCA9IGIubGVuZ3RoO1xuICBjb25zdCBtZW1vID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuICBjb25zdCBzb2x1dGlvbiA9IGluaXRNYXRyaXgoYUxlbmd0aCArIDEsIGJMZW5ndGggKyAxKTtcblxuICAvLyBMb29wIGFuZCBmaW5kIHRoZSBzb2x1dGlvblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhTGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBiTGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgLy8gZGlhZ29uYWxcbiAgICAgICAgbWVtb1tpXVtqXSA9IG1lbW9baSAtIDFdW2ogLSAxXSArIDE7XG4gICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuZGlhZ29uYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZW1vW2ldW2pdID0gTWF0aC5tYXgobWVtb1tpIC0gMV1bal0sIG1lbW9baV1baiAtIDFdKTtcbiAgICAgICAgaWYgKG1lbW9baV1bal0gPT09IG1lbW9baSAtIDFdW2pdKSB7XG4gICAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC52ZXJ0aWNhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULmhvcml6b250YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvbHV0aW9uO1xufVxuXG5mdW5jdGlvbiBwbGFjZWhvbGRlcnMoY291bnQpIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gJysnO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcblxuICBsZXQgY2hhbmdlcyA9IDA7XG5cbiAgd2hpbGUgKG1vdmVtZW50ICE9PSBNT1ZFTUVOVC5ub25lKSB7XG4gICAgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5kaWFnb25hbCkge1xuICAgICAgaWYgKGNoYW5nZXMgPCAwKSB7XG4gICAgICAgIGIuc3BsaWNlKGJpLCAwLCAuLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoY2hhbmdlcykpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcyA+IDApIHtcbiAgICAgICAgYS5zcGxpY2UoYWksIDAsIC4uLnBsYWNlaG9sZGVycyhjaGFuZ2VzKSk7XG4gICAgICB9XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICAgIGNoYW5nZXMgPSAwO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGJpLS07XG4gICAgICBjaGFuZ2VzKys7XG4gICAgfSBlbHNlIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQudmVydGljYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBjaGFuZ2VzLS07XG4gICAgfVxuICAgIG1vdmVtZW50ID0gc29sdXRpb25bYWldW2JpXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgY29uc3QgbGNzU29sdXRpb24gPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYik7XG4gIGFwcGx5U29sdXRpb24obGNzU29sdXRpb24sIGEsIGIpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvYWxpZ25BcnJheXMuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
-
55
- /***/ }
56
- /******/ ]);
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\n/**\n * Creates a 2d matrix of a certain size.\n *\n * @param {number} height\n * @param {number} width\n * @return {Array<Array>}\n */\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\n/**\n * Compute a solution matrix to find the longest common subsequence between two\n * arrays. Adapted from\n * http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n *\n * @param {Array} a\n * @param {Array} b\n * @return {Array<Array>} a matrix containing MOVEMENT markers\n */\nfunction longestCommonSubsequence(a, b) {\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\n/**\n * Constructs an array of placeholder strings, e.g.\n * ['x', 'x', 'x'].\n *\n * @param {number} count\n * @return Array<String>\n */\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n\n/**\n * To be called for arrays that share nothing in common.\n *\n * Note that this will MUTATE the arrays,\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction applyPadding(a, b) {\n var aLength = a.length;\n var bLength = b.length;\n var shorterArray = aLength > bLength ? b : a;\n shorterArray.splice.apply(shorterArray, [0, 0].concat(_toConsumableArray(placeholders(Math.abs(aLength - bLength)))));\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n var changes = 0;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n ai--;\n bi--;\n changes = 0;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n applyPadding(a, b);\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n if (lcsSolution) {\n applySolution(lcsSolution, a, b);\n } else {\n applyPadding(a, b);\n }\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5UGFkZGluZyIsInNob3J0ZXJBcnJheSIsInNwbGljZSIsImFicyIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQW9Jd0JBLFc7Ozs7QUFwSXhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQVFBOzs7Ozs7O0FBT0EsU0FBU0MsVUFBVCxDQUFvQkMsTUFBcEIsRUFBNEJDLEtBQTVCLEVBQW1DO0FBQ2pDLE1BQU1DLE9BQU8sSUFBSUMsS0FBSixDQUFVSCxNQUFWLENBQWI7QUFDQSxPQUFLLElBQUlJLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBS0csTUFBekIsRUFBaUNELEdBQWpDLEVBQXNDO0FBQ3BDRixTQUFLRSxDQUFMLElBQVUsSUFBSUUsVUFBSixDQUFlTCxLQUFmLENBQVY7QUFDRDtBQUNELFNBQU9DLElBQVA7QUFDRDs7QUFFRDs7Ozs7Ozs7O0FBU0EsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QyxNQUFNQyxVQUFVRixFQUFFSCxN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LE1BQUYsV0FBU0ksRUFBVCxFQUFhLENBQWIsNEJBQW1CVCxhQUFhVyxPQUFiLENBQW5CO0FBQ0Q7QUFDREY7QUFDQUM7QUFDQUMsZ0JBQVUsQ0FBVjtBQUNELEtBVEQsTUFTTyxJQUFJSCxhQUFhL0IsU0FBU0ksVUFBMUIsRUFBc0M7QUFDM0M2QjtBQUNBQztBQUNELEtBSE0sTUFHQSxJQUFJSCxhQUFhL0IsU0FBU0csUUFBMUIsRUFBb0M7QUFDekM2QjtBQUNBRTtBQUNEO0FBQ0RILGVBQVdaLFNBQVNhLEVBQVQsRUFBYUMsRUFBYixDQUFYO0FBQ0Q7QUFDRFAsZUFBYVosQ0FBYixFQUFnQkMsQ0FBaEI7QUFDRDs7QUFFRDs7Ozs7Ozs7QUFRZSxTQUFTaEIsV0FBVCxDQUFxQmUsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ3hDLE1BQU1vQixjQUFjdEIseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQSxNQUFJb0IsV0FBSixFQUFpQjtBQUNmTCxrQkFBY0ssV0FBZCxFQUEyQnJCLENBQTNCLEVBQThCQyxDQUE5QjtBQUNELEdBRkQsTUFFTztBQUNMVyxpQkFBYVosQ0FBYixFQUFnQkMsQ0FBaEI7QUFDRDtBQUNGIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuXG4vKipcbiAqIENyZWF0ZXMgYSAyZCBtYXRyaXggb2YgYSBjZXJ0YWluIHNpemUuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGhlaWdodFxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtBcnJheTxBcnJheT59XG4gKi9cbmZ1bmN0aW9uIGluaXRNYXRyaXgoaGVpZ2h0LCB3aWR0aCkge1xuICBjb25zdCByb3dzID0gbmV3IEFycmF5KGhlaWdodCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIHJvd3NbaV0gPSBuZXcgSW50MzJBcnJheSh3aWR0aCk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBhIHNvbHV0aW9uIG1hdHJpeCB0byBmaW5kIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBiZXR3ZWVuIHR3b1xuICogYXJyYXlzLiBBZGFwdGVkIGZyb21cbiAqIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKiBAcmV0dXJuIHtBcnJheTxBcnJheT59IGEgbWF0cml4IGNvbnRhaW5pbmcgTU9WRU1FTlQgbWFya2Vyc1xuICovXG5mdW5jdGlvbiBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYikge1xuICBjb25zdCBhTGVuZ3RoID0gYS5sZW5ndGg7XG4gIGNvbnN0IGJMZW5ndGggPSBiLmxlbmd0aDtcbiAgY29uc3QgbWVtbyA9IGluaXRNYXRyaXgoYUxlbmd0aCArIDEsIGJMZW5ndGggKyAxKTtcbiAgY29uc3Qgc29sdXRpb24gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG5cbiAgLy8gTG9vcCBhbmQgZmluZCB0aGUgc29sdXRpb25cbiAgZm9yIChsZXQgaSA9IDE7IGkgPD0gYUxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDE7IGogPD0gYkxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAoYVtpIC0gMV0gPT09IGJbaiAtIDFdKSB7XG4gICAgICAgIC8vIGRpYWdvbmFsXG4gICAgICAgIG1lbW9baV1bal0gPSBtZW1vW2kgLSAxXVtqIC0gMV0gKyAxO1xuICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULmRpYWdvbmFsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVtb1tpXVtqXSA9IE1hdGgubWF4KG1lbW9baSAtIDFdW2pdLCBtZW1vW2ldW2ogLSAxXSk7XG4gICAgICAgIGlmIChtZW1vW2ldW2pdID09PSBtZW1vW2kgLSAxXVtqXSkge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQudmVydGljYWw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5ob3Jpem9udGFsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBzb2x1dGlvbjtcbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3RzIGFuIGFycmF5IG9mIHBsYWNlaG9sZGVyIHN0cmluZ3MsIGUuZy5cbiAqIFsneCcsICd4JywgJ3gnXS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gY291bnRcbiAqIEByZXR1cm4gQXJyYXk8U3RyaW5nPlxuICovXG5mdW5jdGlvbiBwbGFjZWhvbGRlcnMoY291bnQpIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gJysnO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogVG8gYmUgY2FsbGVkIGZvciBhcnJheXMgdGhhdCBzaGFyZSBub3RoaW5nIGluIGNvbW1vbi5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyB3aWxsIE1VVEFURSB0aGUgYXJyYXlzLFxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZnVuY3Rpb24gYXBwbHlQYWRkaW5nKGEsIGIpIHtcbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IHNob3J0ZXJBcnJheSA9IGFMZW5ndGggPiBiTGVuZ3RoID8gYiA6IGE7XG4gIHNob3J0ZXJBcnJheS5zcGxpY2UoMCwgMCwgLi4ucGxhY2Vob2xkZXJzKE1hdGguYWJzKGFMZW5ndGggLSBiTGVuZ3RoKSkpO1xufVxuXG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcbiAgbGV0IGNoYW5nZXMgPSAwO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGlmIChjaGFuZ2VzIDwgMCkge1xuICAgICAgICBiLnNwbGljZShiaSwgMCwgLi4ucGxhY2Vob2xkZXJzKE1hdGguYWJzKGNoYW5nZXMpKSk7XG4gICAgICB9IGVsc2UgaWYgKGNoYW5nZXMgPiAwKSB7XG4gICAgICAgIGEuc3BsaWNlKGFpLCAwLCAuLi5wbGFjZWhvbGRlcnMoY2hhbmdlcykpO1xuICAgICAgfVxuICAgICAgYWktLTtcbiAgICAgIGJpLS07XG4gICAgICBjaGFuZ2VzID0gMDtcbiAgICB9IGVsc2UgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5ob3Jpem9udGFsKSB7XG4gICAgICBiaS0tO1xuICAgICAgY2hhbmdlcysrO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBhaS0tO1xuICAgICAgY2hhbmdlcy0tO1xuICAgIH1cbiAgICBtb3ZlbWVudCA9IHNvbHV0aW9uW2FpXVtiaV07XG4gIH1cbiAgYXBwbHlQYWRkaW5nKGEsIGIpO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgY29uc3QgbGNzU29sdXRpb24gPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYik7XG4gIGlmIChsY3NTb2x1dGlvbikge1xuICAgIGFwcGx5U29sdXRpb24obGNzU29sdXRpb24sIGEsIGIpO1xuICB9IGVsc2Uge1xuICAgIGFwcGx5UGFkZGluZyhhLCBiKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvYWxpZ25BcnJheXMuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
-
55
- /***/ }
56
- /******/ ]);
@@ -1,68 +0,0 @@
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 data = new Uint8ClampedArray(previousImageData.length);\n\n for (var i = 0; i < previousImageData.length; i += 4) {\n var pixel = (0, _getDiffPixel2.default)([previousImageData[i], previousImageData[i + 1], previousImageData[i + 2], previousImageData[i + 3]], [currentImageData[i], currentImageData[i + 1], currentImageData[i + 2], currentImageData[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/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJVaW50OENsYW1wZWRBcnJheSIsImxlbmd0aCIsImkiLCJwaXhlbCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxnQkFLM0I7QUFBQSx1QkFKSkMsSUFJSTtBQUFBLE1BSEZDLGlCQUdFLGFBSEZBLGlCQUdFO0FBQUEsTUFGRkMsZ0JBRUUsYUFGRkEsZ0JBRUU7O0FBQ0osTUFBTUYsT0FBTyxJQUFJRyxpQkFBSixDQUFzQkYsa0JBQWtCRyxNQUF4QyxDQUFiOztBQUVBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJSixrQkFBa0JHLE1BQXRDLEVBQThDQyxLQUFLLENBQW5ELEVBQXNEO0FBQ3BELFFBQU1DLFFBQVEsNEJBQ1osQ0FDRUwsa0JBQWtCSSxDQUFsQixDQURGLEVBRUVKLGtCQUFrQkksSUFBSSxDQUF0QixDQUZGLEVBR0VKLGtCQUFrQkksSUFBSSxDQUF0QixDQUhGLEVBSUVKLGtCQUFrQkksSUFBSSxDQUF0QixDQUpGLENBRFksRUFPWixDQUNFSCxpQkFBaUJHLENBQWpCLENBREYsRUFFRUgsaUJBQWlCRyxJQUFJLENBQXJCLENBRkYsRUFHRUgsaUJBQWlCRyxJQUFJLENBQXJCLENBSEYsRUFJRUgsaUJBQWlCRyxJQUFJLENBQXJCLENBSkYsQ0FQWSxDQUFkO0FBY0FMLFNBQUtLLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQWZvRCxDQWU1QjtBQUN4Qk4sU0FBS0ssSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBaEJvRCxDQWdCNUI7QUFDeEJOLFNBQUtLLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQWpCb0QsQ0FpQjVCO0FBQ3hCTixTQUFLSyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FsQm9ELENBa0I1QjtBQUN6QjtBQUNEUixPQUFLUyxXQUFMLENBQWlCUCxJQUFqQjtBQUNBRixPQUFLVSxLQUFMO0FBQ0QsQ0E5QkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXREaWZmUGl4ZWwgZnJvbSAnLi4vZ2V0RGlmZlBpeGVsJztcblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHtcbiAgZGF0YToge1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0sXG59KSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocHJldmlvdXNJbWFnZURhdGEubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgY29uc3QgcGl4ZWwgPSBnZXREaWZmUGl4ZWwoXG4gICAgICBbXG4gICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW2ldLFxuICAgICAgICBwcmV2aW91c0ltYWdlRGF0YVtpICsgMV0sXG4gICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhW2kgKyAyXSxcbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGFbaSArIDNdLFxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgY3VycmVudEltYWdlRGF0YVtpXSxcbiAgICAgICAgY3VycmVudEltYWdlRGF0YVtpICsgMV0sXG4gICAgICAgIGN1cnJlbnRJbWFnZURhdGFbaSArIDJdLFxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhW2kgKyAzXSxcbiAgICAgIF1cbiAgICApO1xuICAgIGRhdGFbaSArIDBdID0gcGl4ZWxbMF07IC8vIHJcbiAgICBkYXRhW2kgKyAxXSA9IHBpeGVsWzFdOyAvLyBnXG4gICAgZGF0YVtpICsgMl0gPSBwaXhlbFsyXTsgLy8gYlxuICAgIGRhdGFbaSArIDNdID0gcGl4ZWxbM107IC8vIGFcbiAgfVxuICBzZWxmLnBvc3RNZXNzYWdlKGRhdGEpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvSW1hZ2VEaWZmV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
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 var diff = (0, _euclideanDistance2.default)(previousPixel, currentPixel) / _euclideanDistance.MAX_EUCLIDEAN_DISTANCE;\n if (diff === 0) {\n return (0, _compose2.default)([currentPixel[0], currentPixel[1], currentPixel[2], 50], 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwiV0hJVEUiLCJwcmV2aW91c1BpeGVsIiwiY3VycmVudFBpeGVsIiwiZGlmZiIsIk1hdGgiLCJtYXgiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUt3QkEsWTs7QUFMeEI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTUMsUUFBUSxDQUFDLEdBQUQsRUFBTSxHQUFOLEVBQVcsR0FBWCxFQUFnQixHQUFoQixDQUFkOztBQUVlLFNBQVNELFlBQVQsQ0FBc0JFLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBTUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyw2Q0FBYjtBQUNBLE1BQUlDLFNBQVMsQ0FBYixFQUFnQjtBQUNkLFdBQU8sdUJBQ0wsQ0FBQ0QsYUFBYSxDQUFiLENBQUQsRUFBa0JBLGFBQWEsQ0FBYixDQUFsQixFQUFtQ0EsYUFBYSxDQUFiLENBQW5DLEVBQW9ELEVBQXBELENBREssRUFFTEYsS0FGSyxDQUFQO0FBSUQ7O0FBRUQsU0FBTyx1QkFDTCxDQUFDLEdBQUQsRUFBTSxFQUFOLEVBQVUsR0FBVixFQUFlLE1BQU1JLEtBQUtDLEdBQUwsQ0FBUyxHQUFULEVBQWNGLElBQWQsQ0FBckIsQ0FESyxFQUVMSCxLQUZLLENBQVA7QUFJRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNvbXBvc2UgZnJvbSAnLi9jb21wb3NlJztcbmltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSwgeyBNQVhfRVVDTElERUFOX0RJU1RBTkNFIH0gZnJvbSAnLi9ldWNsaWRlYW5EaXN0YW5jZSc7XG5cbmNvbnN0IFdISVRFID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldERpZmZQaXhlbChwcmV2aW91c1BpeGVsLCBjdXJyZW50UGl4ZWwpIHtcbiAgaWYgKCFwcmV2aW91c1BpeGVsKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQaXhlbDtcbiAgfVxuXG4gIGlmICghY3VycmVudFBpeGVsKSB7XG4gICAgcmV0dXJuIHByZXZpb3VzUGl4ZWw7XG4gIH1cblxuICBjb25zdCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKSAvIE1BWF9FVUNMSURFQU5fRElTVEFOQ0U7XG4gIGlmIChkaWZmID09PSAwKSB7XG4gICAgcmV0dXJuIGNvbXBvc2UoXG4gICAgICBbY3VycmVudFBpeGVsWzBdLCBjdXJyZW50UGl4ZWxbMV0sIGN1cnJlbnRQaXhlbFsyXSwgNTBdLFxuICAgICAgV0hJVEVcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXBvc2UoXG4gICAgWzE3OSwgNTQsIDEzMCwgMjU1ICogTWF0aC5tYXgoMC4yLCBkaWZmKV0sXG4gICAgV0hJVEVcbiAgKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2dldERpZmZQaXhlbC5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
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;\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 */\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/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJNYXRoIiwic3FydCIsInBvdyIsIk1BWF9FVUNMSURFQU5fRElTVEFOQ0UiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQVl3QkEsaUI7QUFaeEI7Ozs7Ozs7Ozs7OztBQVllLFNBQVNBLGlCQUFULENBQTJCQyxLQUEzQixFQUFrQ0MsS0FBbEMsRUFBeUM7QUFDdEQsU0FBT0MsS0FBS0MsSUFBTCxDQUNMRCxLQUFLRSxHQUFMLENBQVNKLE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEIsRUFBOEIsQ0FBOUIsSUFDRUMsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLENBREYsR0FFRUMsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLENBRkYsR0FHRUMsS0FBS0UsR0FBTCxDQUFTSixNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBCLEVBQThCLENBQTlCLENBSkcsQ0FBUDtBQU1EOztBQUVNLElBQU1JLDBEQUF5QkgsS0FBS0MsSUFBTCxDQUFVRCxLQUFLRSxHQUFMLENBQVMsR0FBVCxFQUFjLENBQWQsSUFBbUIsQ0FBN0IsQ0FBL0IiLCJmaWxlIjoiMy5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29tcHV0ZSBhIHNjb3JlIHRoYXQgcmVwcmVzZW50cyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDIgcGl4ZWxzXG4gKlxuICogVGhpcyBtZXRob2Qgc2ltcGx5IHRha2VzIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0aGUgUkdCQSBjaGFubmVsc1xuICogb2YgMiBjb2xvcnMgb3ZlciB0aGUgbWF4aW11bSBwb3NzaWJsZSBFdWNsaWRlYW4gZGlzdGFuY2UuIFRoaXMgZ2l2ZXMgdXMgYVxuICogcGVyY2VudGFnZSBvZiBob3cgZGlmZmVyZW50IHRoZSB0d28gY29sb3JzIGFyZS5cbiAqXG4gKiBBbHRob3VnaCBpdCB3b3VsZCBiZSBtb3JlIHBlcmNlcHR1YWxseSBhY2N1cmF0ZSB0byBjYWxjdWxhdGUgYSBwcm9wZXJcbiAqIERlbHRhIEUgaW4gTGFiIGNvbG9yc3BhY2UsIHdlIHByb2JhYmx5IGRvbid0IG5lZWQgcGVyY2VwdHVhbCBhY2N1cmFjeSBmb3JcbiAqIHRoaXMgYXBwbGljYXRpb24sIGFuZCBpdCBpcyBuaWNlIHRvIGF2b2lkIHRoZSBvdmVyaGVhZCBvZiBjb252ZXJ0aW5nIFJHQkFcbiAqIHRvIExhYi5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZXVjbGlkZWFuRGlzdGFuY2UocmdiYTEsIHJnYmEyKSB7XG4gIHJldHVybiBNYXRoLnNxcnQoXG4gICAgTWF0aC5wb3cocmdiYTFbMF0gLSByZ2JhMlswXSwgMilcbiAgICArIE1hdGgucG93KHJnYmExWzFdIC0gcmdiYTJbMV0sIDIpXG4gICAgKyBNYXRoLnBvdyhyZ2JhMVsyXSAtIHJnYmEyWzJdLCAyKVxuICAgICsgTWF0aC5wb3cocmdiYTFbM10gLSByZ2JhMlszXSwgMilcbiAgKTtcbn1cblxuZXhwb3J0IGNvbnN0IE1BWF9FVUNMSURFQU5fRElTVEFOQ0UgPSBNYXRoLnNxcnQoTWF0aC5wb3coMjU1LCAyKSAqIDQpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
66
-
67
- /***/ }
68
- /******/ ]);
@@ -1 +0,0 @@
1
- !function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return e[n].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t,r){return d*(e+1)+t*e+r}var a=r(3),f=n(a),o=[100,100,100,255],i=[0,200,0,255],l=[255,0,0,255],d=80,s=16;self.addEventListener("message",function(e){for(var t=e.data,r=t.previousImageData,n=t.currentImageData,a=r[0].length,c=r.length,p=(d+a)*c,v=new Uint8ClampedArray(p),M=0;M<c;M++){for(var _=!1,h=0;h<a;h+=4){var x=(0,f["default"])([r[M][h],r[M][h+1],r[M][h+2],r[M][h+3]],[n[M][h],n[M][h+1],n[M][h+2],n[M][h+3]]),g=x.diff,w=x.pixel;g>0&&(_=!0);var A=u(M,a,h);v[A+0]=w[0],v[A+1]=w[1],v[A+2]=w[2],v[A+3]=w[3]}var E=void 0;E=0===r[M][3]?i:0===n[M][3]?l:_?o:null;for(var m=0;m<d-s;m+=4)if(null!==E){var D=u(M,a,m)-d;v[D+0]=E[0],v[D+1]=E[1],v[D+2]=E[2],v[D+3]=E[3]}}self.postMessage({data:v,width:(d+a)/4,height:c}),self.close()})},function(e,t){"use strict";function r(e){return 255===e[3]}function n(e){return 0===e[3]}function u(e,t){var r=e*t+128;return(r>>8)+r>>8}function a(e,t){if(r(e)||n(t))return e;if(n(e))return t;var a=u(255-e[3],t[3]);return[u(e[3],e[0])+u(a,t[0]),u(e[3],e[1])+u(a,t[1]),u(e[3],e[2])+u(a,t[2]),e[3]+a]}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a},function(e,t){"use strict";function r(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2)+Math.pow(e[2]-t[2],2)+Math.pow(e[3]-t[3],2))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r;t.MAX_EUCLIDEAN_DISTANCE=Math.sqrt(4*Math.pow(255,2))},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t){var r=(0,i["default"])(e,t)/o.MAX_EUCLIDEAN_DISTANCE;return 0===r?{diff:r,pixel:(0,f["default"])([t[0],t[1],t[2],40],l)}:{diff:r,pixel:(0,f["default"])([179,54,130,255*Math.max(.2,r)],l)}}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=u;var a=r(1),f=n(a),o=r(2),i=n(o),l=[255,255,255,255]}]);
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiaGFzaGVkQ3VycmVudERhdGEiLCJ0cmFuc3BhcmVudExpbmUiLCJtYXhXaWR0aCIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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ImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxufSkge1xuICBjb25zdCBoYXNoZWRQcmV2aW91c0RhdGEgPSBwcmV2aW91c0ltYWdlRGF0YS5tYXAoSlNPTi5zdHJpbmdpZnkpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDQwIH0pO1xuICBjb25zdCBoYXNoZWRDdXJyZW50RGF0YSA9IGN1cnJlbnRJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA2MCB9KTtcblxuICBhbGlnbkFycmF5cyhcbiAgICBoYXNoZWRQcmV2aW91c0RhdGEsXG4gICAgaGFzaGVkQ3VycmVudERhdGFcbiAgKTtcblxuICBjb25zdCB0cmFuc3BhcmVudExpbmUgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobWF4V2lkdGggKiA0KTtcblxuICBoYXNoZWRQcmV2aW91c0RhdGEuZm9yRWFjaCgoaGFzaGVkTGluZSwgaSkgPT4ge1xuICAgIGlmIChoYXNoZWRMaW5lID09PSAnKycpICB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSAge1xuICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMjAgfSk7XG5cbiAgYWxpZ24oe1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gICAgbWF4V2lkdGgsXG4gIH0pO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogODUgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTggfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogY3VycmVudEltYWdlRGF0YSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n a.splice([ai], 0, '+');\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n b.splice([bi], 0, '+');\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJhcHBseVNvbHV0aW9uIiwibW92ZW1lbnQiLCJhaSIsImJpIiwic3BsaWNlIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQStFd0JBLFc7QUEvRXhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU1PLE9BQU9iLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBYjtBQUNBLE1BQU1FLFdBQVdkLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBakI7O0FBRUE7QUFDQSxPQUFLLElBQUlQLElBQUksQ0FBYixFQUFnQkEsS0FBS00sT0FBckIsRUFBOEJOLEdBQTlCLEVBQW1DO0FBQ2pDLFNBQUssSUFBSVUsSUFBSSxDQUFiLEVBQWdCQSxLQUFLSCxPQUFyQixFQUE4QkcsR0FBOUIsRUFBbUM7QUFDakMsVUFBSU4sRUFBRUosSUFBSSxDQUFOLE1BQWFLLEVBQUVLLElBQUksQ0FBTixDQUFqQixFQUEyQjtBQUN6QjtBQUNBRixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUYsS0FBS1IsSUFBSSxDQUFULEVBQVlVLElBQUksQ0FBaEIsSUFBcUIsQ0FBbEM7QUFDQUQsaUJBQVNULENBQVQsRUFBWVUsQ0FBWixJQUFpQnBCLFNBQVNFLFFBQTFCO0FBQ0QsT0FKRCxNQUlPO0FBQ0xnQixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUMsS0FBS0MsR0FBTCxDQUFTSixLQUFLUixJQUFJLENBQVQsRUFBWVUsQ0FBWixDQUFULEVBQXlCRixLQUFLUixDQUFMLEVBQVFVLElBQUksQ0FBWixDQUF6QixDQUFiO0FBQ0EsWUFBSUYsS0FBS1IsQ0FBTCxFQUFRVSxDQUFSLE1BQWVGLEtBQUtSLElBQUksQ0FBVCxFQUFZVSxDQUFaLENBQW5CLEVBQW1DO0FBQ2pDRCxtQkFBU1QsQ0FBVCxFQUFZVSxDQUFaLElBQWlCcEIsU0FBU0csUUFBMUI7QUFDRCxTQUZELE1BRU87QUFDTGdCLG1CQUFTVCxDQUFULEVBQVlVLENBQVosSUFBaUJwQixTQUFTSSxVQUExQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsU0FBT2UsUUFBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNJLGFBQVQsQ0FBdUJKLFFBQXZCLEVBQWlDTCxDQUFqQyxFQUFvQ0MsQ0FBcEMsRUFBdUM7QUFDckMsTUFBSVMsV0FBV0wsU0FBU0wsRUFBRUgsTUFBWCxFQUFtQkksRUFBRUosTUFBckIsQ0FBZjtBQUNBLE1BQUljLEtBQUtYLEVBQUVILE1BQVg7QUFDQSxNQUFJZSxLQUFLWCxFQUFFSixNQUFYOztBQUVBLFNBQU9hLGFBQWF4QixTQUFTQyxJQUE3QixFQUFtQztBQUNqQyxRQUFJdUIsYUFBYXhCLFNBQVNFLFFBQTFCLEVBQW9DO0FBQ2xDdUI7QUFDQUM7QUFDRCxLQUhELE1BR08sSUFBSUYsYUFBYXhCLFNBQVNJLFVBQTFCLEVBQXNDO0FBQzNDVSxRQUFFYSxNQUFGLENBQVMsQ0FBQ0YsRUFBRCxDQUFULEVBQWUsQ0FBZixFQUFrQixHQUFsQjtBQUNBQztBQUNELEtBSE0sTUFHQSxJQUFJRixhQUFheEIsU0FBU0csUUFBMUIsRUFBb0M7QUFDekNZLFFBQUVZLE1BQUYsQ0FBUyxDQUFDRCxFQUFELENBQVQsRUFBZSxDQUFmLEVBQWtCLEdBQWxCO0FBQ0FEO0FBQ0Q7QUFDREQsZUFBV0wsU0FBU00sRUFBVCxFQUFhQyxFQUFiLENBQVg7QUFDRDtBQUNGOztBQUVEOzs7Ozs7OztBQVFlLFNBQVMzQixXQUFULENBQXFCZSxDQUFyQixFQUF3QkMsQ0FBeEIsRUFBMkI7QUFDeEMsTUFBTWEsY0FBY2YseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVEsZ0JBQWNLLFdBQWQsRUFBMkJkLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGEuc3BsaWNlKFthaV0sIDAsICcrJyk7XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBiLnNwbGljZShbYmldLCAwLCAnKycpO1xuICAgICAgYWktLTtcbiAgICB9XG4gICAgbW92ZW1lbnQgPSBzb2x1dGlvblthaV1bYmldO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHR3byBhcnJheXMsIHRoZW4gdXNlcyB0aGF0XG4gKiBzb2x1dGlvbiB0byBpbmplY3QgZ2FwcyBpbnRvIHRoZSBhcnJheXMsIG1ha2luZyB0aGVtIGFsaWduIG9uIGNvbW1vblxuICogc3Vic2VxdWVuY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWxpZ25BcnJheXMoYSwgYikge1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9hbGlnbkFycmF5cy5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
-
55
- /***/ }
56
- /******/ ]);
@@ -1,62 +0,0 @@
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 _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nvar _flattenImageData = __webpack_require__(2);\n\nvar _flattenImageData2 = _interopRequireDefault(_flattenImageData);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * Construct a line of pixels of a certain rgba color\n *\n * @param {Array} rgba\n * @param {Number} width\n * @return {Array}\n */\nfunction constructColoredLine(rgba, width) {\n var line = [];\n for (var i = 0; i < width; i++) {\n line.push(rgba);\n }\n return line;\n}\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n var getPixelAt = function getPixelAt(x, y) {\n var startIndex = y * rowSize + x * 4;\n return [data[startIndex], data[startIndex + 1], data[startIndex + 2], data[startIndex + 3]];\n };\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = [];\n for (var col = 0; col < width; col++) {\n pixelsInRow.push(getPixelAt(col, row));\n }\n for (var pad = 0; pad < paddingRight; pad++) {\n pixelsInRow.push([0, 0, 0, 0]);\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction getAdiffResults(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.currentData;\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n if (previousData.width !== currentData.width) {\n // we know that all rows will be different here, so we can take a shortcut\n var diff = [0, // diff starts at index 0\n previousData.height];\n diff.length = currentData.height + 2; // number of additions\n return [diff];\n }\n var start = performance.now();\n var p = previousImageData.map(btoa);\n var c = currentImageData.map(btoa);\n console.log('hashing', performance.now() - start);\n\n var r = _adiff2.default.diff(p, c);\n console.log('total', performance.now() - start);\n return r;\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n // iterate and apply changes to previous data\n adiffResults.forEach(function (instruction) {\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < deletedItems) {\n // ignore, we just keep the old line\n } else {\n // add a green line to signal an addition\n previousImageData.splice(atIndex + y, 0, greenLine);\n }\n }\n });\n\n // iterate backwards and apply changes to current data\n for (var i = adiffResults.length - 1; i >= 0; i--) {\n var instruction = adiffResults[i];\n var atIndex = instruction[0];\n var deletedItems = instruction[1];\n var addedItems = instruction.length - 2;\n\n for (var y = 0; y < Math.max(deletedItems, addedItems); y++) {\n if (y < addedItems) {\n // ignore, we just keep the old line\n } else {\n // add a red line to signal a deletion\n currentImageData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n\n return {\n currentData: {\n data: (0, _flattenImageData2.default)(currentImageData),\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: (0, _flattenImageData2.default)(previousImageData),\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZ2V0QWRpZmZSZXN1bHRzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJkaWZmIiwibGVuZ3RoIiwic3RhcnQiLCJwZXJmb3JtYW5jZSIsIm5vdyIsInAiLCJtYXAiLCJidG9hIiwiYyIsImNvbnNvbGUiLCJsb2ciLCJyIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsImFkaWZmUmVzdWx0cyIsImZvckVhY2giLCJpbnN0cnVjdGlvbiIsImF0SW5kZXgiLCJkZWxldGVkSXRlbXMiLCJhZGRlZEl0ZW1zIiwic3BsaWNlIiwic2VsZiIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJwb3N0TWVzc2FnZSIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7O0FBRUE7Ozs7OztBQUVBOzs7Ozs7O0FBT0EsU0FBU0Esb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DQyxLQUFwQyxFQUEyQztBQUN6QyxNQUFNQyxPQUFPLEVBQWI7QUFDQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBcEIsRUFBMkJFLEdBQTNCLEVBQWdDO0FBQzlCRCxTQUFLRSxJQUFMLENBQVVKLElBQVY7QUFDRDtBQUNELFNBQU9FLElB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YUgsWUFBWW5CLE1BQVosR0FBcUIsQ0FBeEM7O0FBRUEsU0FBSyxJQUFJYixJQUFJLENBQWIsRUFBZ0JBLElBQUkwQixLQUFLQyxHQUFMLENBQVNPLFlBQVQsRUFBdUJDLFVBQXZCLENBQXBCLEVBQXdEbkMsR0FBeEQsRUFBNkQ7QUFDM0QsVUFBSUEsSUFBSW1DLFVBQVIsRUFBb0I7QUFDbEI7QUFDRCxPQUZELE1BRU87QUFDTDtBQUNBeEIseUJBQWlCeUIsTUFBakIsQ0FBd0JILFVBQVVqQyxDQUFsQyxFQUFxQyxDQUFyQyxFQUF3QzRCLE9BQXhDO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU87QUFDTG5CLGlCQUFhO0FBQ1hkLFlBQU0sZ0NBQWlCZ0IsZ0JBQWpCLENBREs7QUFFWGYsY0FBUWUsaUJBQWlCRSxNQUZkO0FBR1h4QixhQUFPb0M7QUFISSxLQURSO0FBTUxqQixrQkFBYztBQUNaYixZQUFNLGdDQUFpQmUsaUJBQWpCLENBRE07QUFFWmQsY0FBUWMsa0JBQWtCRyxNQUZkO0FBR1p4QixhQUFPb0M7QUFISztBQU5ULEdBQVA7QUFZRDs7QUFFRFksS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsaUJBQTZDO0FBQUEseUJBQTFDM0MsSUFBMEM7QUFBQSxNQUFsQ2EsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTThCLFNBQVNmLHNCQUFzQixFQUFFaEIsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QixDQUFmO0FBQ0E0QixPQUFLRyxXQUFMLENBQWlCRCxNQUFqQjtBQUNBRixPQUFLSSxLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRBZGlmZlJlc3VsdHMoe1xuICBwcmV2aW91c0RhdGEsXG4gIGN1cnJlbnREYXRhLFxuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgaWYgKHByZXZpb3VzRGF0YS53aWR0aCAhPT0gY3VycmVudERhdGEud2lkdGgpIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgYWxsIHJvd3Mgd2lsbCBiZSBkaWZmZXJlbnQgaGVyZSwgc28gd2UgY2FuIHRha2UgYSBzaG9ydGN1dFxuICAgIGNvbnN0IGRpZmYgPSBbXG4gICAgICAwLCAvLyBkaWZmIHN0YXJ0cyBhdCBpbmRleCAwXG4gICAgICBwcmV2aW91c0RhdGEuaGVpZ2h0LCAvLyBudW1iZXIgb2YgZGVsZXRpb25zXG4gICAgXTtcbiAgICBkaWZmLmxlbmd0aCA9IGN1cnJlbnREYXRhLmhlaWdodCArIDI7IC8vIG51bWJlciBvZiBhZGRpdGlvbnNcbiAgICByZXR1cm4gW2RpZmZdO1xuICB9XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IHAgPSBwcmV2aW91c0ltYWdlRGF0YS5tYXAoYnRvYSk7XG4gIGNvbnN0IGMgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChidG9hKTtcbiAgY29uc29sZS5sb2coJ2hhc2hpbmcnLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcblxuICBjb25zdCByID0gYWRpZmYuZGlmZihwLCBjKTtcbiAgY29uc29sZS5sb2coJ3RvdGFsJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG4gIHJldHVybiByO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBnZXRBZGlmZlJlc3VsdHMoe1xuICAgIHByZXZpb3VzRGF0YSxcbiAgICBjdXJyZW50RGF0YSxcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgcmVkIGxpbmUgdG8gc2lnbmFsIGEgZGVsZXRpb25cbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY3VycmVudERhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEoY3VycmVudEltYWdlRGF0YSksXG4gICAgICBoZWlnaHQ6IGN1cnJlbnRJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gICAgcHJldmlvdXNEYXRhOiB7XG4gICAgICBkYXRhOiBmbGF0dGVuSW1hZ2VEYXRhKHByZXZpb3VzSW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogcHJldmlvdXNJbWFnZURhdGEubGVuZ3RoLFxuICAgICAgd2lkdGg6IG1heFdpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZShyZXN1bHQpO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("function head (a) {\n return a[0]\n}\n\nfunction last (a) {\n return a[a.length - 1]\n}\n\nfunction tail(a) {\n return a.slice(1)\n}\n\nfunction retreat (e) {\n return e.pop()\n}\n\nfunction hasLength (e) {\n return e.length\n}\n\nfunction any(ary, test) {\n for(var i=0;i<ary.length;i++)\n if(test(ary[i]))\n return true\n return false\n}\n\nfunction score (a) {\n return a.reduce(function (s, a) {\n return s + a.length + a[1] + 1\n }, 0)\n}\n\nfunction best (a, b) {\n return score(a) <= score(b) ? a : b\n}\n\n\nvar _rules // set at the bottom \n\n// note, naive implementation. will break on circular objects.\n\nfunction _equal(a, b) {\n if(a && !b) return false\n if(Array.isArray(a))\n if(a.length != b.length) return false\n if(a && 'object' == typeof a) {\n for(var i in a)\n if(!_equal(a[i], b[i])) return false\n for(var i in b)\n if(!_equal(a[i], b[i])) return false\n return true\n }\n return a == b\n}\n\nfunction getArgs(args) {\n return args.length == 1 ? args[0] : [].slice.call(args)\n}\n\n// return the index of the element not like the others, or -1\nfunction oddElement(ary, cmp) {\n var c\n function guess(a) {\n var odd = -1\n c = 0\n for (var i = a; i < ary.length; i ++) {\n if(!cmp(ary[a], ary[i])) {\n odd = i, c++\n }\n }\n return c > 1 ? -1 : odd\n }\n //assume that it is the first element.\n var g = guess(0)\n if(-1 != g) return g\n //0 was the odd one, then all the other elements are equal\n //else there more than one different element\n guess(1)\n return c == 0 ? 0 : -1\n}\nvar exports = module.exports = function (deps, exports) {\n var equal = (deps && deps.equal) || _equal\n exports = exports || {} \n exports.lcs = \n function lcs() {\n var cache = {}\n var args = getArgs(arguments)\n var a = args[0], b = args[1]\n\n function key (a,b){\n return a.length + ':' + b.length\n }\n\n //find length that matches at the head\n\n if(args.length > 2) {\n //if called with multiple sequences\n //recurse, since lcs(a, b, c, d) == lcs(lcs(a,b), lcs(c,d))\n args.push(lcs(args.shift(), args.shift()))\n return lcs(args)\n }\n \n //this would be improved by truncating input first\n //and not returning an lcs as an intermediate step.\n //untill that is a performance problem.\n\n var start = 0, end = 0\n for(var i = 0; i < a.length && i < b.length \n && equal(a[i], b[i])\n ; i ++\n )\n start = i + 1\n\n if(a.length === start)\n return a.slice()\n\n for(var i = 0; i < a.length - start && i < b.length - start\n && equal(a[a.length - 1 - i], b[b.length - 1 - i])\n ; i ++\n )\n end = i\n\n function recurse (a, b) {\n if(!a.length || !b.length) return []\n //avoid exponential time by caching the results\n if(cache[key(a, b)]) return cache[key(a, b)]\n\n if(equal(a[0], b[0]))\n return [head(a)].concat(recurse(tail(a), tail(b)))\n else { \n var _a = recurse(tail(a), b)\n var _b = recurse(a, tail(b))\n return cache[key(a,b)] = _a.length > _b.length ? _a : _b \n }\n }\n \n var middleA = a.slice(start, a.length - end)\n var middleB = b.slice(start, b.length - end)\n\n return (\n a.slice(0, start).concat(\n recurse(middleA, middleB)\n ).concat(a.slice(a.length - end))\n )\n }\n\n // given n sequences, calc the lcs, and then chunk strings into stable and unstable sections.\n // unstable chunks are passed to build\n exports.chunk =\n function (q, build) {\n var q = q.map(function (e) { return e.slice() })\n var lcs = exports.lcs.apply(null, q)\n var all = [lcs].concat(q)\n\n function matchLcs (e) {\n if(e.length && !lcs.length || !e.length && lcs.length)\n return false //incase the last item is null\n return equal(last(e), last(lcs)) || ((e.length + lcs.length) === 0)\n }\n\n while(any(q, hasLength)) {\n //if each element is at the lcs then this chunk is stable.\n while(q.every(matchLcs) && q.every(hasLength))\n all.forEach(retreat)\n //collect the changes in each array upto the next match with the lcs\n var c = false\n var unstable = q.map(function (e) {\n var change = []\n while(!matchLcs(e)) {\n change.unshift(retreat(e))\n c = true\n }\n return change\n })\n if(c) build(q[0].length, unstable)\n }\n }\n\n //calculate a diff this is only updates\n exports.optimisticDiff =\n function (a, b) {\n var M = Math.max(a.length, b.length)\n var m = Math.min(a.length, b.length)\n var patch = []\n for(var i = 0; i < M; i++)\n if(a[i] !== b[i]) {\n var cur = [i,0], deletes = 0\n while(a[i] !== b[i] && i < m) {\n cur[1] = ++deletes\n cur.push(b[i++])\n }\n //the rest are deletes or inserts\n if(i >= m) {\n //the rest are deletes\n if(a.length > b.length)\n cur[1] += a.length - b.length\n //the rest are inserts\n else if(a.length < b.length)\n cur = cur.concat(b.slice(a.length))\n }\n patch.push(cur)\n }\n\n return patch\n }\n\n exports.diff =\n function (a, b) {\n var optimistic = exports.optimisticDiff(a, b)\n var changes = []\n exports.chunk([a, b], function (index, unstable) {\n var del = unstable.shift().length\n var insert = unstable.shift()\n changes.push([index, del].concat(insert))\n })\n return best(optimistic, changes)\n }\n\n exports.patch = function (a, changes, mutate) {\n if(mutate !== true) a = a.slice(a)//copy a\n changes.forEach(function (change) {\n [].splice.apply(a, change)\n })\n return a\n }\n\n // http://en.wikipedia.org/wiki/Concestor\n // me, concestor, you...\n exports.merge = function () {\n var args = getArgs(arguments)\n var patch = exports.diff3(args)\n return exports.patch(args[0], patch)\n }\n\n exports.diff3 = function () {\n var args = getArgs(arguments)\n var r = []\n exports.chunk(args, function (index, unstable) {\n var mine = unstable[0]\n var insert = resolve(unstable)\n if(equal(mine, insert)) return \n r.push([index, mine.length].concat(insert)) \n })\n return r\n }\n exports.oddOneOut =\n function oddOneOut (changes) {\n changes = changes.slice()\n //put the concestor first\n changes.unshift(changes.splice(1,1)[0])\n var i = oddElement(changes, equal)\n if(i == 0) // concestor was different, 'false conflict'\n return changes[1]\n if (~i)\n return changes[i] \n }\n exports.insertMergeOverDelete = \n //i've implemented this as a seperate rule,\n //because I had second thoughts about this.\n function insertMergeOverDelete (changes) {\n changes = changes.slice()\n changes.splice(1,1)// remove concestor\n \n //if there is only one non empty change thats okay.\n //else full confilct\n for (var i = 0, nonempty; i < changes.length; i++)\n if(changes[i].length) \n if(!nonempty) nonempty = changes[i]\n else return // full conflict\n return nonempty\n }\n\n var rules = (deps && deps.rules) || [exports.oddOneOut, exports.insertMergeOverDelete]\n\n function resolve (changes) {\n var l = rules.length\n for (var i in rules) { // first\n \n var c = rules[i] && rules[i](changes)\n if(c) return c\n }\n changes.splice(1,1) // remove concestor\n //returning the conflicts as an object is a really bad idea,\n // because == will not detect they are the same. and conflicts build.\n // better to use\n // '<<<<<<<<<<<<<'\n // of course, i wrote this before i started on snob, so i didn't know that then.\n /*var conflict = ['>>>>>>>>>>>>>>>>']\n while(changes.length)\n conflict = conflict.concat(changes.shift()).concat('============')\n conflict.pop()\n conflict.push ('<<<<<<<<<<<<<<<')\n changes.unshift ('>>>>>>>>>>>>>>>')\n return conflict*/\n //nah, better is just to use an equal can handle objects\n return {'?': changes}\n }\n return exports\n}\nexports(null, exports)\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9+L2FkaWZmL2luZGV4LmpzPzA0ZDYiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGNBQWMsYUFBYTtBQUMzQjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHO0FBQ0g7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLGdCQUFnQjtBQUNuQztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHlCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLGtCQUFrQjtBQUNsQjtBQUNBLE9BQU87QUFDUDtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsa0JBQWtCO0FBQ2xCO0FBQ0EsT0FBTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLFk7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDLG1CQUFtQjtBQUNuRDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxPQUFPO0FBQ1A7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixPQUFPO0FBQ3pCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSwrQkFBK0Isb0JBQW9CO0FBQ25EO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBLDBCQUEwQjs7QUFFMUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLFlBQVk7QUFDWjtBQUNBO0FBQ0E7QUFDQSIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiZnVuY3Rpb24gaGVhZCAoYSkge1xuICByZXR1cm4gYVswXVxufVxuXG5mdW5jdGlvbiBsYXN0IChhKSB7XG4gIHJldHVybiBhW2EubGVuZ3RoIC0gMV1cbn1cblxuZnVuY3Rpb24gdGFpbChhKSB7XG4gIHJldHVybiBhLnNsaWNlKDEpXG59XG5cbmZ1bmN0aW9uIHJldHJlYXQgKGUpIHtcbiAgcmV0dXJuIGUucG9wKClcbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChlKSB7XG4gIHJldHVybiBlLmxlbmd0aFxufVxuXG5mdW5jdGlvbiBhbnkoYXJ5LCB0ZXN0KSB7XG4gIGZvcih2YXIgaT0wO2k8YXJ5Lmxlbmd0aDtpKyspXG4gICAgaWYodGVzdChhcnlbaV0pKVxuICAgICAgcmV0dXJuIHRydWVcbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHNjb3JlIChhKSB7XG4gIHJldHVybiBhLnJlZHVjZShmdW5jdGlvbiAocywgYSkge1xuICAgICAgcmV0dXJuIHMgKyBhLmxlbmd0aCArIGFbMV0gKyAxXG4gIH0sIDApXG59XG5cbmZ1bmN0aW9uIGJlc3QgKGEsIGIpIHtcbiAgcmV0dXJuIHNjb3JlKGEpIDw9IHNjb3JlKGIpID8gYSA6IGJcbn1cblxuXG52YXIgX3J1bGVzIC8vIHNldCBhdCB0aGUgYm90dG9tICBcblxuLy8gbm90ZSwgbmFpdmUgaW1wbGVtZW50YXRpb24uIHdpbGwgYnJlYWsgb24gY2lyY3VsYXIgb2JqZWN0cy5cblxuZnVuY3Rpb24gX2VxdWFsKGEsIGIpIHtcbiAgaWYoYSAmJiAhYikgcmV0dXJuIGZhbHNlXG4gIGlmKEFycmF5LmlzQXJyYXkoYSkpXG4gICAgaWYoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZVxuICBpZihhICYmICdvYmplY3QnID09IHR5cGVvZiBhKSB7XG4gICAgZm9yKHZhciBpIGluIGEpXG4gICAgICBpZighX2VxdWFsKGFbaV0sIGJbaV0pKSByZXR1cm4gZmFsc2VcbiAgICBmb3IodmFyIGkgaW4gYilcbiAgICAgIGlmKCFfZXF1YWwoYVtpXSwgYltpXSkpIHJldHVybiBmYWxzZVxuICAgIHJldHVybiB0cnVlXG4gIH1cbiAgcmV0dXJuIGEgPT0gYlxufVxuXG5mdW5jdGlvbiBnZXRBcmdzKGFyZ3MpIHtcbiAgcmV0dXJuIGFyZ3MubGVuZ3RoID09IDEgPyBhcmdzWzBdIDogW10uc2xpY2UuY2FsbChhcmdzKVxufVxuXG4vLyByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBlbGVtZW50IG5vdCBsaWtlIHRoZSBvdGhlcnMsIG9yIC0xXG5mdW5jdGlvbiBvZGRFbGVtZW50KGFyeSwgY21wKSB7XG4gIHZhciBjXG4gIGZ1bmN0aW9uIGd1ZXNzKGEpIHtcbiAgICB2YXIgb2RkID0gLTFcbiAgICBjID0gMFxuICAgIGZvciAodmFyIGkgPSBhOyBpIDwgYXJ5Lmxlbmd0aDsgaSArKykge1xuICAgICAgaWYoIWNtcChhcnlbYV0sIGFyeVtpXSkpIHtcbiAgICAgICAgb2RkID0gaSwgYysrXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjID4gMSA/IC0xIDogb2RkXG4gIH1cbiAgLy9hc3N1bWUgdGhhdCBpdCBpcyB0aGUgZmlyc3QgZWxlbWVudC5cbiAgdmFyIGcgPSBndWVzcygwKVxuICBpZigtMSAhPSBnKSByZXR1cm4gZ1xuICAvLzAgd2FzIHRoZSBvZGQgb25lLCB0aGVuIGFsbCB0aGUgb3RoZXIgZWxlbWVudHMgYXJlIGVxdWFsXG4gIC8vZWxzZSB0aGVyZSBtb3JlIHRoYW4gb25lIGRpZmZlcmVudCBlbGVtZW50XG4gIGd1ZXNzKDEpXG4gIHJldHVybiBjID09IDAgPyAwIDogLTFcbn1cbnZhciBleHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZGVwcywgZXhwb3J0cykge1xuICB2YXIgZXF1YWwgPSAoZGVwcyAmJiBkZXBzLmVxdWFsKSB8fCBfZXF1YWxcbiAgZXhwb3J0cyA9IGV4cG9ydHMgfHwge30gXG4gIGV4cG9ydHMubGNzID0gXG4gIGZ1bmN0aW9uIGxjcygpIHtcbiAgICB2YXIgY2FjaGUgPSB7fVxuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIGEgPSBhcmdzWzBdLCBiID0gYXJnc1sxXVxuXG4gICAgZnVuY3Rpb24ga2V5IChhLGIpe1xuICAgICAgcmV0dXJuIGEubGVuZ3RoICsgJzonICsgYi5sZW5ndGhcbiAgICB9XG5cbiAgICAvL2ZpbmQgbGVuZ3RoIHRoYXQgbWF0Y2hlcyBhdCB0aGUgaGVhZFxuXG4gICAgaWYoYXJncy5sZW5ndGggPiAyKSB7XG4gICAgICAvL2lmIGNhbGxlZCB3aXRoIG11bHRpcGxlIHNlcXVlbmNlc1xuICAgICAgLy9yZWN1cnNlLCBzaW5jZSBsY3MoYSwgYiwgYywgZCkgPT0gbGNzKGxjcyhhLGIpLCBsY3MoYyxkKSlcbiAgICAgIGFyZ3MucHVzaChsY3MoYXJncy5zaGlmdCgpLCBhcmdzLnNoaWZ0KCkpKVxuICAgICAgcmV0dXJuIGxjcyhhcmdzKVxuICAgIH1cbiAgICBcbiAgICAvL3RoaXMgd291bGQgYmUgaW1wcm92ZWQgYnkgdHJ1bmNhdGluZyBpbnB1dCBmaXJzdFxuICAgIC8vYW5kIG5vdCByZXR1cm5pbmcgYW4gbGNzIGFzIGFuIGludGVybWVkaWF0ZSBzdGVwLlxuICAgIC8vdW50aWxsIHRoYXQgaXMgYSBwZXJmb3JtYW5jZSBwcm9ibGVtLlxuXG4gICAgdmFyIHN0YXJ0ID0gMCwgZW5kID0gMFxuICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhLmxlbmd0aCAmJiBpIDwgYi5sZW5ndGggXG4gICAgICAmJiBlcXVhbChhW2ldLCBiW2ldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgc3RhcnQgPSBpICsgMVxuXG4gICAgaWYoYS5sZW5ndGggPT09IHN0YXJ0KVxuICAgICAgcmV0dXJuIGEuc2xpY2UoKVxuXG4gICAgZm9yKHZhciBpID0gMDsgIGkgPCBhLmxlbmd0aCAtIHN0YXJ0ICYmIGkgPCBiLmxlbmd0aCAtIHN0YXJ0XG4gICAgICAmJiBlcXVhbChhW2EubGVuZ3RoIC0gMSAtIGldLCBiW2IubGVuZ3RoIC0gMSAtIGldKVxuICAgICAgOyBpICsrXG4gICAgKVxuICAgICAgZW5kID0gaVxuXG4gICAgZnVuY3Rpb24gcmVjdXJzZSAoYSwgYikge1xuICAgICAgaWYoIWEubGVuZ3RoIHx8ICFiLmxlbmd0aCkgcmV0dXJuIFtdXG4gICAgICAvL2F2b2lkIGV4cG9uZW50aWFsIHRpbWUgYnkgY2FjaGluZyB0aGUgcmVzdWx0c1xuICAgICAgaWYoY2FjaGVba2V5KGEsIGIpXSkgcmV0dXJuIGNhY2hlW2tleShhLCBiKV1cblxuICAgICAgaWYoZXF1YWwoYVswXSwgYlswXSkpXG4gICAgICAgIHJldHVybiBbaGVhZChhKV0uY29uY2F0KHJlY3Vyc2UodGFpbChhKSwgdGFpbChiKSkpXG4gICAgICBlbHNlIHsgXG4gICAgICAgIHZhciBfYSA9IHJlY3Vyc2UodGFpbChhKSwgYilcbiAgICAgICAgdmFyIF9iID0gcmVjdXJzZShhLCB0YWlsKGIpKVxuICAgICAgICByZXR1cm4gY2FjaGVba2V5KGEsYildID0gX2EubGVuZ3RoID4gX2IubGVuZ3RoID8gX2EgOiBfYiAgXG4gICAgICB9XG4gICAgfVxuICAgIFxuICAgIHZhciBtaWRkbGVBID0gYS5zbGljZShzdGFydCwgYS5sZW5ndGggLSBlbmQpXG4gICAgdmFyIG1pZGRsZUIgPSBiLnNsaWNlKHN0YXJ0LCBiLmxlbmd0aCAtIGVuZClcblxuICAgIHJldHVybiAoXG4gICAgICBhLnNsaWNlKDAsIHN0YXJ0KS5jb25jYXQoXG4gICAgICAgIHJlY3Vyc2UobWlkZGxlQSwgbWlkZGxlQilcbiAgICAgICkuY29uY2F0KGEuc2xpY2UoYS5sZW5ndGggLSBlbmQpKVxuICAgIClcbiAgfVxuXG4gIC8vIGdpdmVuIG4gc2VxdWVuY2VzLCBjYWxjIHRoZSBsY3MsIGFuZCB0aGVuIGNodW5rIHN0cmluZ3MgaW50byBzdGFibGUgYW5kIHVuc3RhYmxlIHNlY3Rpb25zLlxuICAvLyB1bnN0YWJsZSBjaHVua3MgYXJlIHBhc3NlZCB0byBidWlsZFxuICBleHBvcnRzLmNodW5rID1cbiAgZnVuY3Rpb24gKHEsIGJ1aWxkKSB7XG4gICAgdmFyIHEgPSBxLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5zbGljZSgpIH0pXG4gICAgdmFyIGxjcyA9IGV4cG9ydHMubGNzLmFwcGx5KG51bGwsIHEpXG4gICAgdmFyIGFsbCA9IFtsY3NdLmNvbmNhdChxKVxuXG4gICAgZnVuY3Rpb24gbWF0Y2hMY3MgKGUpIHtcbiAgICAgIGlmKGUubGVuZ3RoICYmICFsY3MubGVuZ3RoIHx8ICFlLmxlbmd0aCAmJiBsY3MubGVuZ3RoKVxuICAgICAgICByZXR1cm4gZmFsc2UgLy9pbmNhc2UgdGhlIGxhc3QgaXRlbSBpcyBudWxsXG4gICAgICByZXR1cm4gZXF1YWwobGFzdChlKSwgbGFzdChsY3MpKSB8fCAoKGUubGVuZ3RoICsgbGNzLmxlbmd0aCkgPT09IDApXG4gICAgfVxuXG4gICAgd2hpbGUoYW55KHEsIGhhc0xlbmd0aCkpIHtcbiAgICAgIC8vaWYgZWFjaCBlbGVtZW50IGlzIGF0IHRoZSBsY3MgdGhlbiB0aGlzIGNodW5rIGlzIHN0YWJsZS5cbiAgICAgIHdoaWxlKHEuZXZlcnkobWF0Y2hMY3MpICYmIHEuZXZlcnkoaGFzTGVuZ3RoKSlcbiAgICAgICAgYWxsLmZvckVhY2gocmV0cmVhdClcbiAgICAgIC8vY29sbGVjdCB0aGUgY2hhbmdlcyBpbiBlYWNoIGFycmF5IHVwdG8gdGhlIG5leHQgbWF0Y2ggd2l0aCB0aGUgbGNzXG4gICAgICB2YXIgYyA9IGZhbHNlXG4gICAgICB2YXIgdW5zdGFibGUgPSBxLm1hcChmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgY2hhbmdlID0gW11cbiAgICAgICAgd2hpbGUoIW1hdGNoTGNzKGUpKSB7XG4gICAgICAgICAgY2hhbmdlLnVuc2hpZnQocmV0cmVhdChlKSlcbiAgICAgICAgICBjID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VcbiAgICAgIH0pXG4gICAgICBpZihjKSBidWlsZChxWzBdLmxlbmd0aCwgdW5zdGFibGUpXG4gICAgfVxuICB9XG5cbiAgLy9jYWxjdWxhdGUgYSBkaWZmIHRoaXMgaXMgb25seSB1cGRhdGVzXG4gIGV4cG9ydHMub3B0aW1pc3RpY0RpZmYgPVxuICBmdW5jdGlvbiAoYSwgYikge1xuICAgIHZhciBNID0gTWF0aC5tYXgoYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBtID0gTWF0aC5taW4oYS5sZW5ndGgsIGIubGVuZ3RoKVxuICAgIHZhciBwYXRjaCA9IFtdXG4gICAgZm9yKHZhciBpID0gMDsgaSA8IE07IGkrKylcbiAgICAgIGlmKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgICAgdmFyIGN1ciA9IFtpLDBdLCBkZWxldGVzID0gMFxuICAgICAgICB3aGlsZShhW2ldICE9PSBiW2ldICYmIGkgPCBtKSB7XG4gICAgICAgICAgY3VyWzFdID0gKytkZWxldGVzXG4gICAgICAgICAgY3VyLnB1c2goYltpKytdKVxuICAgICAgICB9XG4gICAgICAgIC8vdGhlIHJlc3QgYXJlIGRlbGV0ZXMgb3IgaW5zZXJ0c1xuICAgICAgICBpZihpID49IG0pIHtcbiAgICAgICAgICAvL3RoZSByZXN0IGFyZSBkZWxldGVzXG4gICAgICAgICAgaWYoYS5sZW5ndGggPiBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1clsxXSArPSBhLmxlbmd0aCAtIGIubGVuZ3RoXG4gICAgICAgICAgLy90aGUgcmVzdCBhcmUgaW5zZXJ0c1xuICAgICAgICAgIGVsc2UgaWYoYS5sZW5ndGggPCBiLmxlbmd0aClcbiAgICAgICAgICAgIGN1ciA9IGN1ci5jb25jYXQoYi5zbGljZShhLmxlbmd0aCkpXG4gICAgICAgIH1cbiAgICAgICAgcGF0Y2gucHVzaChjdXIpXG4gICAgICB9XG5cbiAgICByZXR1cm4gcGF0Y2hcbiAgfVxuXG4gIGV4cG9ydHMuZGlmZiA9XG4gIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgdmFyIG9wdGltaXN0aWMgPSBleHBvcnRzLm9wdGltaXN0aWNEaWZmKGEsIGIpXG4gICAgdmFyIGNoYW5nZXMgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoW2EsIGJdLCBmdW5jdGlvbiAoaW5kZXgsIHVuc3RhYmxlKSB7XG4gICAgICB2YXIgZGVsID0gdW5zdGFibGUuc2hpZnQoKS5sZW5ndGhcbiAgICAgIHZhciBpbnNlcnQgPSB1bnN0YWJsZS5zaGlmdCgpXG4gICAgICBjaGFuZ2VzLnB1c2goW2luZGV4LCBkZWxdLmNvbmNhdChpbnNlcnQpKVxuICAgIH0pXG4gICAgcmV0dXJuIGJlc3Qob3B0aW1pc3RpYywgY2hhbmdlcylcbiAgfVxuXG4gIGV4cG9ydHMucGF0Y2ggPSBmdW5jdGlvbiAoYSwgY2hhbmdlcywgbXV0YXRlKSB7XG4gICAgaWYobXV0YXRlICE9PSB0cnVlKSBhID0gYS5zbGljZShhKS8vY29weSBhXG4gICAgY2hhbmdlcy5mb3JFYWNoKGZ1bmN0aW9uIChjaGFuZ2UpIHtcbiAgICAgIFtdLnNwbGljZS5hcHBseShhLCBjaGFuZ2UpXG4gICAgfSlcbiAgICByZXR1cm4gYVxuICB9XG5cbiAgLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Db25jZXN0b3JcbiAgLy8gbWUsIGNvbmNlc3RvciwgeW91Li4uXG4gIGV4cG9ydHMubWVyZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBnZXRBcmdzKGFyZ3VtZW50cylcbiAgICB2YXIgcGF0Y2ggPSBleHBvcnRzLmRpZmYzKGFyZ3MpXG4gICAgcmV0dXJuIGV4cG9ydHMucGF0Y2goYXJnc1swXSwgcGF0Y2gpXG4gIH1cblxuICBleHBvcnRzLmRpZmYzID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBhcmdzID0gZ2V0QXJncyhhcmd1bWVudHMpXG4gICAgdmFyIHIgPSBbXVxuICAgIGV4cG9ydHMuY2h1bmsoYXJncywgZnVuY3Rpb24gKGluZGV4LCB1bnN0YWJsZSkge1xuICAgICAgdmFyIG1pbmUgPSB1bnN0YWJsZVswXVxuICAgICAgdmFyIGluc2VydCA9IHJlc29sdmUodW5zdGFibGUpXG4gICAgICBpZihlcXVhbChtaW5lLCBpbnNlcnQpKSByZXR1cm4gXG4gICAgICByLnB1c2goW2luZGV4LCBtaW5lLmxlbmd0aF0uY29uY2F0KGluc2VydCkpIFxuICAgIH0pXG4gICAgcmV0dXJuIHJcbiAgfVxuICBleHBvcnRzLm9kZE9uZU91dCA9XG4gICAgZnVuY3Rpb24gb2RkT25lT3V0IChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICAvL3B1dCB0aGUgY29uY2VzdG9yIGZpcnN0XG4gICAgICBjaGFuZ2VzLnVuc2hpZnQoY2hhbmdlcy5zcGxpY2UoMSwxKVswXSlcbiAgICAgIHZhciBpID0gb2RkRWxlbWVudChjaGFuZ2VzLCBlcXVhbClcbiAgICAgIGlmKGkgPT0gMCkgLy8gY29uY2VzdG9yIHdhcyBkaWZmZXJlbnQsICdmYWxzZSBjb25mbGljdCdcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbMV1cbiAgICAgIGlmICh+aSlcbiAgICAgICAgcmV0dXJuIGNoYW5nZXNbaV0gXG4gICAgfVxuICBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZSA9IFxuICAgIC8vaSd2ZSBpbXBsZW1lbnRlZCB0aGlzIGFzIGEgc2VwZXJhdGUgcnVsZSxcbiAgICAvL2JlY2F1c2UgSSBoYWQgc2Vjb25kIHRob3VnaHRzIGFib3V0IHRoaXMuXG4gICAgZnVuY3Rpb24gaW5zZXJ0TWVyZ2VPdmVyRGVsZXRlIChjaGFuZ2VzKSB7XG4gICAgICBjaGFuZ2VzID0gY2hhbmdlcy5zbGljZSgpXG4gICAgICBjaGFuZ2VzLnNwbGljZSgxLDEpLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgICAgXG4gICAgICAvL2lmIHRoZXJlIGlzIG9ubHkgb25lIG5vbiBlbXB0eSBjaGFuZ2UgdGhhdHMgb2theS5cbiAgICAgIC8vZWxzZSBmdWxsIGNvbmZpbGN0XG4gICAgICBmb3IgKHZhciBpID0gMCwgbm9uZW1wdHk7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKVxuICAgICAgICBpZihjaGFuZ2VzW2ldLmxlbmd0aCkgXG4gICAgICAgICAgaWYoIW5vbmVtcHR5KSBub25lbXB0eSA9IGNoYW5nZXNbaV1cbiAgICAgICAgICBlbHNlIHJldHVybiAvLyBmdWxsIGNvbmZsaWN0XG4gICAgICByZXR1cm4gbm9uZW1wdHlcbiAgICB9XG5cbiAgdmFyIHJ1bGVzID0gKGRlcHMgJiYgZGVwcy5ydWxlcykgfHwgW2V4cG9ydHMub2RkT25lT3V0LCBleHBvcnRzLmluc2VydE1lcmdlT3ZlckRlbGV0ZV1cblxuICBmdW5jdGlvbiByZXNvbHZlIChjaGFuZ2VzKSB7XG4gICAgdmFyIGwgPSBydWxlcy5sZW5ndGhcbiAgICBmb3IgKHZhciBpIGluIHJ1bGVzKSB7IC8vIGZpcnN0XG4gICAgICBcbiAgICAgIHZhciBjID0gcnVsZXNbaV0gJiYgcnVsZXNbaV0oY2hhbmdlcylcbiAgICAgIGlmKGMpIHJldHVybiBjXG4gICAgfVxuICAgIGNoYW5nZXMuc3BsaWNlKDEsMSkgLy8gcmVtb3ZlIGNvbmNlc3RvclxuICAgIC8vcmV0dXJuaW5nIHRoZSBjb25mbGljdHMgYXMgYW4gb2JqZWN0IGlzIGEgcmVhbGx5IGJhZCBpZGVhLFxuICAgIC8vIGJlY2F1c2UgPT0gd2lsbCBub3QgZGV0ZWN0IHRoZXkgYXJlIHRoZSBzYW1lLiBhbmQgY29uZmxpY3RzIGJ1aWxkLlxuICAgIC8vIGJldHRlciB0byB1c2VcbiAgICAvLyAnPDw8PDw8PDw8PDw8PCdcbiAgICAvLyBvZiBjb3Vyc2UsIGkgd3JvdGUgdGhpcyBiZWZvcmUgaSBzdGFydGVkIG9uIHNub2IsIHNvIGkgZGlkbid0IGtub3cgdGhhdCB0aGVuLlxuICAgIC8qdmFyIGNvbmZsaWN0ID0gWyc+Pj4+Pj4+Pj4+Pj4+Pj4+J11cbiAgICB3aGlsZShjaGFuZ2VzLmxlbmd0aClcbiAgICAgIGNvbmZsaWN0ID0gY29uZmxpY3QuY29uY2F0KGNoYW5nZXMuc2hpZnQoKSkuY29uY2F0KCc9PT09PT09PT09PT0nKVxuICAgIGNvbmZsaWN0LnBvcCgpXG4gICAgY29uZmxpY3QucHVzaCAgICAgICAgICAoJzw8PDw8PDw8PDw8PDw8PCcpXG4gICAgY2hhbmdlcy51bnNoaWZ0ICAgICAgICgnPj4+Pj4+Pj4+Pj4+Pj4+JylcbiAgICByZXR1cm4gY29uZmxpY3QqL1xuICAgIC8vbmFoLCBiZXR0ZXIgaXMganVzdCB0byB1c2UgYW4gZXF1YWwgY2FuIGhhbmRsZSBvYmplY3RzXG4gICAgcmV0dXJuIHsnPyc6IGNoYW5nZXN9XG4gIH1cbiAgcmV0dXJuIGV4cG9ydHNcbn1cbmV4cG9ydHMobnVsbCwgZXhwb3J0cylcblxuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogLi9+L2FkaWZmL2luZGV4LmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
-
55
- /***/ },
56
- /* 2 */
57
- /***/ function(module, exports) {
58
-
59
- 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 * 4);\n imageData.forEach(function (row, y) {\n row.forEach(function (pixel, x) {\n var index = y * width * 4 + x * 4;\n result[index] = pixel[0];\n result[index + 1] = pixel[1];\n result[index + 2] = pixel[2];\n result[index + 3] = pixel[3];\n });\n });\n return result;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJ3aWR0aCIsImxlbmd0aCIsInJlc3VsdCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZm9yRWFjaCIsInJvdyIsInkiLCJwaXhlbCIsIngiLCJpbmRleCJdLCJtYXBwaW5ncyI6Ijs7Ozs7a0JBSXdCQSxnQjtBQUp4Qjs7OztBQUllLFNBQVNBLGdCQUFULENBQTBCQyxTQUExQixFQUFxQztBQUNsRCxNQUFNQyxRQUFRRCxVQUFVLENBQVYsRUFBYUUsTUFBM0I7QUFDQSxNQUFNQyxTQUFTLElBQUlDLGlCQUFKLENBQXNCSixVQUFVRSxNQUFWLEdBQW1CRCxLQUFuQixHQUEyQixDQUFqRCxDQUFmO0FBQ0FELFlBQVVLLE9BQVYsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFNQyxDQUFOLEVBQVk7QUFDNUJELFFBQUlELE9BQUosQ0FBWSxVQUFDRyxLQUFELEVBQVFDLENBQVIsRUFBYztBQUN4QixVQUFNQyxRQUFTSCxJQUFJTixLQUFKLEdBQVksQ0FBYixHQUFtQlEsSUFBSSxDQUFyQztBQUNBTixhQUFPTyxLQUFQLElBQWdCRixNQUFNLENBQU4sQ0FBaEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDQUwsYUFBT08sUUFBUSxDQUFmLElBQW9CRixNQUFNLENBQU4sQ0FBcEI7QUFDRCxLQU5EO0FBT0QsR0FSRDtBQVNBLFNBQU9MLE1BQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZURhdGEgYSAyZCBhcnJheVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5JbWFnZURhdGEoaW1hZ2VEYXRhKSB7XG4gIGNvbnN0IHdpZHRoID0gaW1hZ2VEYXRhWzBdLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGltYWdlRGF0YS5sZW5ndGggKiB3aWR0aCAqIDQpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93LCB5KSA9PiB7XG4gICAgcm93LmZvckVhY2goKHBpeGVsLCB4KSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9ICh5ICogd2lkdGggKiA0KSArICh4ICogNCk7XG4gICAgICByZXN1bHRbaW5kZXhdID0gcGl4ZWxbMF07XG4gICAgICByZXN1bHRbaW5kZXggKyAxXSA9IHBpeGVsWzFdO1xuICAgICAgcmVzdWx0W2luZGV4ICsgMl0gPSBwaXhlbFsyXTtcbiAgICAgIHJlc3VsdFtpbmRleCArIDNdID0gcGl4ZWxbM107XG4gICAgfSk7XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
60
-
61
- /***/ }
62
- /******/ ]);
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxTQUFLLElBQUlTLFdBQVcsQ0FBcEIsRUFBdUJBLFdBQVdMLE9BQWxDLEVBQTJDSyxVQUEzQyxFQUF1RDtBQUNyREYsa0JBQVlFLFFBQVosSUFBd0JSLEtBQU1LLE1BQU1GLE9BQVAsR0FBa0JLLFFBQXZCLENBQXhCO0FBQ0Q7QUFDREosWUFBUUssSUFBUixDQUFhSCxXQUFiO0FBQ0Q7QUFDRCxTQUFPRixPQUFQO0FBQ0Q7O0FBRUQsU0FBU00sS0FBVCxRQUlHO0FBQUEsTUFIREMsaUJBR0MsU0FIREEsaUJBR0M7QUFBQSxNQUZEQyxnQkFFQyxTQUZEQSxnQkFFQztBQUFBLE1BRERDLFFBQ0MsU0FEREEsUUFDQzs7QUFDRCxNQUFNQyxxQkFBcUJILGtCQUFrQkksR0FBbEIsQ0FBc0JDLEtBQUtDLFNBQTNCLENBQTNCO0FBQ0FDLE9BQUtDLFdBQUwsQ0FBaUIsRUFBRUMsVUFBVSxFQUFaLEVBQWpCO0FBQ0EsTUFBTUMsb0JBQW9CVCxpQkFBaUJHLEdBQWpCLENBQXFCQyxLQUFLQyxTQUExQixDQUExQjtBQUNBQyxPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjs7QUFFQSw2QkFDRU4sa0JBREYsRUFFRU8saUJBRkY7O0FBS0EsTUFBTUMsa0JBQWtCLElBQUlmLGlCQUFKLENBQXNCTSxXQUFXLENBQWpDLENBQXhCOztBQUVBQyxxQkFBbUJTLE9BQW5CLENBQTJCLFVBQUNDLFVBQUQsRUFBYUMsQ0FBYixFQUFtQjtBQUM1QyxRQUFJRCxlQUFlLEdBQW5CLEVBQXdCO0FBQ3RCYix3QkFBa0JlLE1BQWxCLENBQXlCRCxDQUF6QixFQUE0QixDQUE1QixFQUErQkgsZUFBL0I7QUFDRDtBQUNGLEdBSkQ7O0FBTUFELG9CQUFrQkUsT0FBbEIsQ0FBMEIsVUFBQ0MsVUFBRCxFQUFhQyxDQUFiLEVBQW1CO0FBQzNDLFFBQUlELGVBQWUsR0FBbkIsRUFBd0I7QUFDdEJaLHVCQUFpQmMsTUFBakIsQ0FBd0JELENBQXhCLEVBQTJCLENBQTNCLEVBQThCSCxlQUE5QjtBQUNEO0FBQ0YsR0FKRDtBQUtEOztBQUVEOzs7Ozs7Ozs7OztBQVdBLFNBQVNLLHFCQUFULFFBQThEO0FBQUEsTUFBN0JDLFlBQTZCLFNBQTdCQSxZQUE2QjtBQUFBLE1BQWZDLFdBQWUsU0FBZkEsV0FBZTs7QUFDNUQsTUFBTWhCLFdBQVdpQixLQUFLQyxHQUFMLENBQVNILGFBQWEzQixLQUF0QixFQUE2QjRCLFlBQVk1QixLQUF6QyxDQUFqQjs7QUFFQSxNQUFNVSxvQkFBb0JiLGVBQ3hCOEIsWUFEd0IsRUFDVmYsV0FBV2UsYUFBYTNCLEtBRGQsQ0FBMUI7O0FBR0EsTUFBTVcsbUJBQW1CZCxlQUN2QitCLFdBRHVCLEVBQ1ZoQixXQUFXZ0IsWUFBWTVCLEtBRGIsQ0FBekI7O0FBR0FpQixPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjs7QUFFQVYsUUFBTTtBQUNKQyx3Q0FESTtBQUVKQyxzQ0FGSTtBQUdKQztBQUhJLEdBQU47O0FBTUFLLE9BQUtDLFdBQUwsQ0FBaUIsRUFBRUMsVUFBVSxFQUFaLEVBQWpCOztBQUVBLFNBQU87QUFDTFMsaUJBQWE7QUFDWDdCLFlBQU1ZLGdCQURLO0FBRVhWLGNBQVFVLGlCQUFpQm9CLE1BRmQ7QUFHWC9CLGFBQU9ZO0FBSEksS0FEUjtBQU1MZSxrQkFBYztBQUNaNUIsWUFBTVcsaUJBRE07QUFFWlQsY0FBUVMsa0JBQWtCcUIsTUFGZDtBQUdaL0IsYUFBT1k7QUFISztBQU5ULEdBQVA7QUFZRDs7QUFFREssS0FBS2UsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsaUJBQTZDO0FBQUEseUJBQTFDakMsSUFBMEM7QUFBQSxNQUFsQzRCLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFLE1BQU1LLFNBQVNQLHNCQUFzQixFQUFFQywwQkFBRixFQUFnQkMsd0JBQWhCLEVBQXRCLENBQWY7QUFDQVgsT0FBS0MsV0FBTCxDQUFpQmUsTUFBakI7QUFDQWhCLE9BQUtpQixLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n var changes = 0;\n\n function applyChanges() {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n changes = 0;\n }\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n applyChanges();\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwiYXBwbHlDaGFuZ2VzIiwic3BsaWNlIiwiYWJzIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQWlHd0JBLFc7Ozs7QUFqR3hCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixN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V0FBVCxDQUFxQmUsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ3hDLE1BQU1tQixjQUFjckIseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVcsZ0JBQWNRLFdBQWQsRUFBMkJwQixDQUEzQixFQUE4QkMsQ0FBOUI7QUFDRCIsImZpbGUiOiIxLmpzIiwic291cmNlc0NvbnRlbnQiOlsiY29uc3QgTU9WRU1FTlQgPSB7XG4gIG5vbmU6IDAsXG4gIGRpYWdvbmFsOiAxLFxuICB2ZXJ0aWNhbDogMixcbiAgaG9yaXpvbnRhbDogMyxcbn07XG5cbmZ1bmN0aW9uIGluaXRNYXRyaXgoaGVpZ2h0LCB3aWR0aCkge1xuICBjb25zdCByb3dzID0gbmV3IEFycmF5KGhlaWdodCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcm93cy5sZW5ndGg7IGkrKykge1xuICAgIHJvd3NbaV0gPSBuZXcgSW50MzJBcnJheSh3aWR0aCk7XG4gIH1cbiAgcmV0dXJuIHJvd3M7XG59XG5cbmZ1bmN0aW9uIGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKSB7XG4gIC8vIGFkYXB0ZWQgZnJvbVxuICAvLyBodHRwOi8vYWxnb3JpdGhtcy50dXRvcmlhbGhvcml6b24uY29tL2R5bmFtaWMtcHJvZ3JhbW1pbmctbG9uZ2VzdC1jb21tb24tc3Vic2VxdWVuY2UvXG4gIGNvbnN0IGFMZW5ndGggPSBhLmxlbmd0aDtcbiAgY29uc3QgYkxlbmd0aCA9IGIubGVuZ3RoO1xuICBjb25zdCBtZW1vID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuICBjb25zdCBzb2x1dGlvbiA9IGluaXRNYXRyaXgoYUxlbmd0aCArIDEsIGJMZW5ndGggKyAxKTtcblxuICAvLyBMb29wIGFuZCBmaW5kIHRoZSBzb2x1dGlvblxuICBmb3IgKGxldCBpID0gMTsgaSA8PSBhTGVuZ3RoOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMTsgaiA8PSBiTGVuZ3RoOyBqKyspIHtcbiAgICAgIGlmIChhW2kgLSAxXSA9PT0gYltqIC0gMV0pIHtcbiAgICAgICAgLy8gZGlhZ29uYWxcbiAgICAgICAgbWVtb1tpXVtqXSA9IG1lbW9baSAtIDFdW2ogLSAxXSArIDE7XG4gICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuZGlhZ29uYWw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZW1vW2ldW2pdID0gTWF0aC5tYXgobWVtb1tpIC0gMV1bal0sIG1lbW9baV1baiAtIDFdKTtcbiAgICAgICAgaWYgKG1lbW9baV1bal0gPT09IG1lbW9baSAtIDFdW2pdKSB7XG4gICAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC52ZXJ0aWNhbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULmhvcml6b250YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvbHV0aW9uO1xufVxuXG5mdW5jdGlvbiBwbGFjZWhvbGRlcnMoY291bnQpIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gJysnO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcbiAgbGV0IGNoYW5nZXMgPSAwO1xuXG4gIGZ1bmN0aW9uIGFwcGx5Q2hhbmdlcygpIHtcbiAgICBpZiAoY2hhbmdlcyA8IDApIHtcbiAgICAgIGIuc3BsaWNlKGJpLCAwLCAuLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoY2hhbmdlcykpKTtcbiAgICB9IGVsc2UgaWYgKGNoYW5nZXMgPiAwKSB7XG4gICAgICBhLnNwbGljZShhaSwgMCwgLi4ucGxhY2Vob2xkZXJzKGNoYW5nZXMpKTtcbiAgICB9XG4gICAgY2hhbmdlcyA9IDA7XG4gIH1cblxuICB3aGlsZSAobW92ZW1lbnQgIT09IE1PVkVNRU5ULm5vbmUpIHtcbiAgICBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmRpYWdvbmFsKSB7XG4gICAgICBhcHBseUNoYW5nZXMoKTtcbiAgICAgIGFpLS07XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGJpLS07XG4gICAgICBjaGFuZ2VzKys7XG4gICAgfSBlbHNlIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQudmVydGljYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBjaGFuZ2VzLS07XG4gICAgfVxuICAgIG1vdmVtZW50ID0gc29sdXRpb25bYWldW2JpXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgY29uc3QgbGNzU29sdXRpb24gPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYik7XG4gIGFwcGx5U29sdXRpb24obGNzU29sdXRpb24sIGEsIGIpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvYWxpZ25BcnJheXMuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
-
55
- /***/ }
56
- /******/ ]);
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 85 });\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiaGFzaGVkQ3VycmVudERhdGEiLCJjb21wdXRlQW5kSW5qZWN0RGlmZnMiLCJwcmV2aW91c0RhdGEiLCJjdXJyZW50RGF0YSIsIm1heFdpZHRoIiwiTWF0aCIsIm1heCIsInRyYW5zcGFyZW50TGluZSIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxTQUFLLElBQUlTLFdBQVcsQ0FBcEIsRUFBdUJBLFdBQVdMLE9BQWxDLEVBQTJDSyxVQUEzQyxFQUF1RDtBQUNyREYsa0JBQVlFLFFBQVosSUFBd0JSLEtBQU1LLE1BQU1GLE9BQVAsR0FBa0JLLFFBQXZCLENBQXhCO0FBQ0Q7QUFDREosWUFBUUssSUFBUixDQUFhSCxXQUFiO0FBQ0Q7QUFDRCxTQUFPRixPQUFQO0FBQ0Q7O0FBRUQsU0FBU00sS0FBVCxRQUdHO0FBQUEsTUFGREMsaUJBRUMsU0FGREEsaUJBRUM7QUFBQSxNQUREQyxnQkFDQyxTQUREQSxnQkFDQzs7QUFDRCxNQUFNQyxxQkFBcUJGLGtCQUFrQkcsR0FBbEIsQ0FBc0JDLEtBQUtDLFNBQTNCLENBQTNCO0FBQ0FDLE9BQUtDLFdBQUwsQ0FBaUIsRUFBRUMsVUFBVSxFQUFaLEVBQWpCO0FBQ0EsTUFBTUMsb0JBQW9CUixpQkFBaUJFLEdBQWpCLENBQXFCQyxLQUFLQyxTQUExQixDQUExQjtBQUNBQyxPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjs7QUFFQSw2QkFDRU4sa0JBREYsRUFFRU8saUJBRkY7QUFNRDs7QUFFRDs7Ozs7Ozs7Ozs7QUFXQSxTQUFTQyxxQkFBVCxRQUE4RDtBQUFBLE1BQTdCQyxZQUE2QixTQUE3QkEsWUFBNkI7QUFBQSxNQUFmQyxXQUFlLFNBQWZBLFdBQWU7O0FBQzVELE1BQU1DLFdBQVdDLEtBQUtDLEdBQUwsQ0FBU0osYUFBYXJCLEtBQXRCLEVBQTZCc0IsWUFBWXRCLEtBQXpDLENBQWpCOztBQUVBLE1BQU0wQixrQkFBa0IsSUFBSXBCLGlCQUFKLENBQXNCaUIsV0FBVyxDQUFqQyxDQUF4Qjs7QUFFQSxNQUFNYixvQkFBb0JiLGVBQ3hCd0IsWUFEd0IsRUFDVkUsV0FBV0YsYUFBYXJCLEtBRGQsQ0FBMUI7O0FBR0EsTUFBTVcsbUJBQW1CZCxlQUN2QnlCLFdBRHVCLEVBQ1ZDLFdBQVdELFlBQVl0QixLQURiLENBQXpCOztBQUdBZ0IsT0FBS0MsV0FBTCxDQUFpQixFQUFFQyxVQUFVLEVBQVosRUFBakI7O0FBRUFULFFBQU07QUFDSkMsd0NBREk7QUFFSkM7QUFGSSxHQUFOOztBQUtBSyxPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjtBQUNBRixPQUFLQyxXQUFMLENBQWlCLEVBQUVDLFVBQVUsRUFBWixFQUFqQjs7QUFFQSxTQUFPO0FBQ0xJLGlCQUFhO0FBQ1h2QixZQUFNWSxnQkFESztBQUVYVixjQUFRVSxpQkFBaUJnQixNQUZkO0FBR1gzQixhQUFPdUI7QUFISSxLQURSO0FBTUxGLGtCQUFjO0FBQ1p0QixZQUFNVyxpQkFETTtBQUVaVCxjQUFRUyxrQkFBa0JpQixNQUZkO0FBR1ozQixhQUFPdUI7QUFISztBQU5ULEdBQVA7QUFZRDs7QUFFRFAsS0FBS1ksZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsaUJBQTZDO0FBQUEseUJBQTFDN0IsSUFBMEM7QUFBQSxNQUFsQ3NCLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFLE1BQU1PLFNBQVNULHNCQUFzQixFQUFFQywwQkFBRixFQUFnQkMsd0JBQWhCLEVBQXRCLENBQWY7QUFDQU4sT0FBS0MsV0FBTCxDQUFpQlksTUFBakI7QUFDQWIsT0FBS2MsS0FBTDtBQUNELENBSkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhbGlnbkFycmF5cyBmcm9tICcuLi9hbGlnbkFycmF5cyc7XG5cbmZ1bmN0aW9uIGltYWdlVG8yREFycmF5KHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9LCBwYWRkaW5nUmlnaHQpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHJvd1NpemUgKyAocGFkZGluZ1JpZ2h0ICogNCkpO1xuICAgIGZvciAobGV0IGxvY2F0aW9uID0gMDsgbG9jYXRpb24gPCByb3dTaXplOyBsb2NhdGlvbisrKSB7XG4gICAgICBwaXhlbHNJblJvd1tsb2NhdGlvbl0gPSBkYXRhWyhyb3cgKiByb3dTaXplKSArIGxvY2F0aW9uXTtcbiAgICB9XG4gICAgbmV3RGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gbmV3RGF0YTtcbn1cblxuZnVuY3Rpb24gYWxpZ24oe1xuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cblxufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMjAgfSk7XG5cbiAgYWxpZ24oe1xuICAgIHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgIGN1cnJlbnRJbWFnZURhdGEsXG4gIH0pO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogODUgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTggfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogY3VycmVudEltYWdlRGF0YSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n return solution;\n}\n\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n ai--;\n bi--;\n } else if (movement === MOVEMENT.horizontal) {\n a.splice([ai], 0, '+');\n bi--;\n } else if (movement === MOVEMENT.vertical) {\n b.splice([bi], 0, '+');\n ai--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJhcHBseVNvbHV0aW9uIiwibW92ZW1lbnQiLCJhaSIsImJpIiwic3BsaWNlIiwibGNzU29sdXRpb24iXSwibWFwcGluZ3MiOiI7Ozs7O2tCQStFd0JBLFc7QUEvRXhCLElBQU1DLFdBQVc7QUFDZkMsUUFBTSxDQURTO0FBRWZDLFlBQVUsQ0FGSztBQUdmQyxZQUFVLENBSEs7QUFJZkMsY0FBWTtBQUpHLENBQWpCOztBQU9BLFNBQVNDLFVBQVQsQ0FBb0JDLE1BQXBCLEVBQTRCQyxLQUE1QixFQUFtQztBQUNqQyxNQUFNQyxPQUFPLElBQUlDLEtBQUosQ0FBVUgsTUFBVixDQUFiO0FBQ0EsT0FBSyxJQUFJSSxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQUtHLE1BQXpCLEVBQWlDRCxHQUFqQyxFQUFzQztBQUNwQ0YsU0FBS0UsQ0FBTCxJQUFVLElBQUlFLFVBQUosQ0FBZUwsS0FBZixDQUFWO0FBQ0Q7QUFDRCxTQUFPQyxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0ssd0JBQVQsQ0FBa0NDLENBQWxDLEVBQXFDQyxDQUFyQyxFQUF3QztBQUN0QztBQUNBO0FBQ0EsTUFBTUMsVUFBVUYsRUFBRUgsTUFBbEI7QUFDQSxNQUFNTSxVQUFVRixFQUFFSixNQUFsQjtBQUNBLE1BQU1PLE9BQU9iLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBYjtBQUNBLE1BQU1FLFdBQVdkLFdBQVdXLFVBQVUsQ0FBckIsRUFBd0JDLFVBQVUsQ0FBbEMsQ0FBakI7O0FBRUE7QUFDQSxPQUFLLElBQUlQLElBQUksQ0FBYixFQUFnQkEsS0FBS00sT0FBckIsRUFBOEJOLEdBQTlCLEVBQW1DO0FBQ2pDLFNBQUssSUFBSVUsSUFBSSxDQUFiLEVBQWdCQSxLQUFLSCxPQUFyQixFQUE4QkcsR0FBOUIsRUFBbUM7QUFDakMsVUFBSU4sRUFBRUosSUFBSSxDQUFOLE1BQWFLLEVBQUVLLElBQUksQ0FBTixDQUFqQixFQUEyQjtBQUN6QjtBQUNBRixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUYsS0FBS1IsSUFBSSxDQUFULEVBQVlVLElBQUksQ0FBaEIsSUFBcUIsQ0FBbEM7QUFDQUQsaUJBQVNULENBQVQsRUFBWVUsQ0FBWixJQUFpQnBCLFNBQVNFLFFBQTFCO0FBQ0QsT0FKRCxNQUlPO0FBQ0xnQixhQUFLUixDQUFMLEVBQVFVLENBQVIsSUFBYUMsS0FBS0MsR0FBTCxDQUFTSixLQUFLUixJQUFJLENBQVQsRUFBWVUsQ0FBWixDQUFULEVBQXlCRixLQUFLUixDQUFMLEVBQVFVLElBQUksQ0FBWixDQUF6QixDQUFiO0FBQ0EsWUFBSUYsS0FBS1IsQ0FBTCxFQUFRVSxDQUFSLE1BQWVGLEtBQUtSLElBQUksQ0FBVCxFQUFZVSxDQUFaLENBQW5CLEVBQW1DO0FBQ2pDRCxtQkFBU1QsQ0FBVCxFQUFZVSxDQUFaLElBQWlCcEIsU0FBU0csUUFBMUI7QUFDRCxTQUZELE1BRU87QUFDTGdCLG1CQUFTVCxDQUFULEVBQVlVLENBQVosSUFBaUJwQixTQUFTSSxVQUExQjtBQUNEO0FBQ0Y7QUFDRjtBQUNGO0FBQ0QsU0FBT2UsUUFBUDtBQUNEOztBQUVEOzs7Ozs7OztBQVFBLFNBQVNJLGFBQVQsQ0FBdUJKLFFBQXZCLEVBQWlDTCxDQUFqQyxFQUFvQ0MsQ0FBcEMsRUFBdUM7QUFDckMsTUFBSVMsV0FBV0wsU0FBU0wsRUFBRUgsTUFBWCxFQUFtQkksRUFBRUosTUFBckIsQ0FBZjtBQUNBLE1BQUljLEtBQUtYLEVBQUVILE1BQVg7QUFDQSxNQUFJZSxLQUFLWCxFQUFFSixNQUFYOztBQUVBLFNBQU9hLGFBQWF4QixTQUFTQyxJQUE3QixFQUFtQztBQUNqQyxRQUFJdUIsYUFBYXhCLFNBQVNFLFFBQTFCLEVBQW9DO0FBQ2xDdUI7QUFDQUM7QUFDRCxLQUhELE1BR08sSUFBSUYsYUFBYXhCLFNBQVNJLFVBQTFCLEVBQXNDO0FBQzNDVSxRQUFFYSxNQUFGLENBQVMsQ0FBQ0YsRUFBRCxDQUFULEVBQWUsQ0FBZixFQUFrQixHQUFsQjtBQUNBQztBQUNELEtBSE0sTUFHQSxJQUFJRixhQUFheEIsU0FBU0csUUFBMUIsRUFBb0M7QUFDekNZLFFBQUVZLE1BQUYsQ0FBUyxDQUFDRCxFQUFELENBQVQsRUFBZSxDQUFmLEVBQWtCLEdBQWxCO0FBQ0FEO0FBQ0Q7QUFDREQsZUFBV0wsU0FBU00sRUFBVCxFQUFhQyxFQUFiLENBQVg7QUFDRDtBQUNGOztBQUVEOzs7Ozs7OztBQVFlLFNBQVMzQixXQUFULENBQXFCZSxDQUFyQixFQUF3QkMsQ0FBeEIsRUFBMkI7QUFDeEMsTUFBTWEsY0FBY2YseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQVEsZ0JBQWNLLFdBQWQsRUFBMkJkLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc29sdXRpb247XG59XG5cbi8qKlxuICogQXBwbHkgYW4gbGNzIHNvbHV0aW9uIHRvIGFycmF5cy4gTm90ZSB0aGF0IHRoaXMgd2lsbCBNVVRBVEUgdGhlIGFycmF5cyxcbiAqIGluamVjdGluZyBcIitcIiB3aGVyZSBnYXBzIGFyZSBuZWVkZWQuXG4gKlxuICogQHBhcmFtIHtBcnJheTxBcnJheT59IHNvbHV0aW9uIGFzIGNvbXB1dGVkIGJ5IGBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2VgXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmZ1bmN0aW9uIGFwcGx5U29sdXRpb24oc29sdXRpb24sIGEsIGIpIHtcbiAgbGV0IG1vdmVtZW50ID0gc29sdXRpb25bYS5sZW5ndGhdW2IubGVuZ3RoXTtcbiAgbGV0IGFpID0gYS5sZW5ndGg7XG4gIGxldCBiaSA9IGIubGVuZ3RoO1xuXG4gIHdoaWxlIChtb3ZlbWVudCAhPT0gTU9WRU1FTlQubm9uZSkge1xuICAgIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQuZGlhZ29uYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGEuc3BsaWNlKFthaV0sIDAsICcrJyk7XG4gICAgICBiaS0tO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULnZlcnRpY2FsKSB7XG4gICAgICBiLnNwbGljZShbYmldLCAwLCAnKycpO1xuICAgICAgYWktLTtcbiAgICB9XG4gICAgbW92ZW1lbnQgPSBzb2x1dGlvblthaV1bYmldO1xuICB9XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHN1YnNlcXVlbmNlIG9mIHR3byBhcnJheXMsIHRoZW4gdXNlcyB0aGF0XG4gKiBzb2x1dGlvbiB0byBpbmplY3QgZ2FwcyBpbnRvIHRoZSBhcnJheXMsIG1ha2luZyB0aGVtIGFsaWduIG9uIGNvbW1vblxuICogc3Vic2VxdWVuY2VzLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IGFcbiAqIEBwYXJhbSB7QXJyYXl9IGJcbiAqL1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYWxpZ25BcnJheXMoYSwgYikge1xuICBjb25zdCBsY3NTb2x1dGlvbiA9IGxvbmdlc3RDb21tb25TdWJzZXF1ZW5jZShhLCBiKTtcbiAgYXBwbHlTb2x1dGlvbihsY3NTb2x1dGlvbiwgYSwgYik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9hbGlnbkFycmF5cy5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
54
-
55
- /***/ }
56
- /******/ ]);
@@ -1,56 +0,0 @@
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 _alignArrays = __webpack_require__(1);\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
-
49
- /***/ },
50
- /* 1 */
51
- /***/ function(module, exports) {
52
-
53
- eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = alignArrays;\n\nfunction _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }\n\nvar MOVEMENT = {\n none: 0,\n diagonal: 1,\n vertical: 2,\n horizontal: 3\n};\n\nfunction initMatrix(height, width) {\n var rows = new Array(height);\n for (var i = 0; i < rows.length; i++) {\n rows[i] = new Int32Array(width);\n }\n return rows;\n}\n\nfunction longestCommonSubsequence(a, b) {\n // adapted from\n // http://algorithms.tutorialhorizon.com/dynamic-programming-longest-common-subsequence/\n var aLength = a.length;\n var bLength = b.length;\n var memo = initMatrix(aLength + 1, bLength + 1);\n var solution = initMatrix(aLength + 1, bLength + 1);\n\n // Loop and find the solution\n for (var i = 1; i <= aLength; i++) {\n for (var j = 1; j <= bLength; j++) {\n if (a[i - 1] === b[j - 1]) {\n // diagonal\n memo[i][j] = memo[i - 1][j - 1] + 1;\n solution[i][j] = MOVEMENT.diagonal;\n } else {\n memo[i][j] = Math.max(memo[i - 1][j], memo[i][j - 1]);\n if (memo[i][j] === memo[i - 1][j]) {\n solution[i][j] = MOVEMENT.vertical;\n } else {\n solution[i][j] = MOVEMENT.horizontal;\n }\n }\n }\n }\n if (memo[aLength][bLength] === 0) {\n // No soltuion found\n return null;\n }\n return solution;\n}\n\nfunction placeholders(count) {\n var result = new Array(count);\n for (var i = 0; i < count; i++) {\n result[i] = '+';\n }\n return result;\n}\n/**\n * Apply an lcs solution to arrays. Note that this will MUTATE the arrays,\n * injecting \"+\" where gaps are needed.\n *\n * @param {Array<Array>} solution as computed by `longestCommonSubsequence`\n * @param {Array} a\n * @param {Array} b\n */\nfunction applySolution(solution, a, b) {\n var movement = solution[a.length][b.length];\n var ai = a.length;\n var bi = b.length;\n\n var changes = 0;\n\n while (movement !== MOVEMENT.none) {\n if (movement === MOVEMENT.diagonal) {\n if (changes < 0) {\n b.splice.apply(b, [bi, 0].concat(_toConsumableArray(placeholders(Math.abs(changes)))));\n } else if (changes > 0) {\n a.splice.apply(a, [ai, 0].concat(_toConsumableArray(placeholders(changes))));\n }\n ai--;\n bi--;\n changes = 0;\n } else if (movement === MOVEMENT.horizontal) {\n bi--;\n changes++;\n } else if (movement === MOVEMENT.vertical) {\n ai--;\n changes--;\n }\n movement = solution[ai][bi];\n }\n}\n\n/**\n * Computes the longest common subsequence of two arrays, then uses that\n * solution to inject gaps into the arrays, making them align on common\n * subsequences.\n *\n * @param {Array} a\n * @param {Array} b\n */\nfunction alignArrays(a, b) {\n var lcsSolution = longestCommonSubsequence(a, b);\n if (!lcSolution) {\n applyPadding(a, b);\n }\n applySolution(lcsSolution, a, b);\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvYWxpZ25BcnJheXMuanM/MDFiNyJdLCJuYW1lcyI6WyJhbGlnbkFycmF5cyIsIk1PVkVNRU5UIiwibm9uZSIsImRpYWdvbmFsIiwidmVydGljYWwiLCJob3Jpem9udGFsIiwiaW5pdE1hdHJpeCIsImhlaWdodCIsIndpZHRoIiwicm93cyIsIkFycmF5IiwiaSIsImxlbmd0aCIsIkludDMyQXJyYXkiLCJsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UiLCJhIiwiYiIsImFMZW5ndGgiLCJiTGVuZ3RoIiwibWVtbyIsInNvbHV0aW9uIiwiaiIsIk1hdGgiLCJtYXgiLCJwbGFjZWhvbGRlcnMiLCJjb3VudCIsInJlc3VsdCIsImFwcGx5U29sdXRpb24iLCJtb3ZlbWVudCIsImFpIiwiYmkiLCJjaGFuZ2VzIiwic3BsaWNlIiwiYWJzIiwibGNzU29sdXRpb24iLCJsY1NvbHV0aW9uIiwiYXBwbHlQYWRkaW5nIl0sIm1hcHBpbmdzIjoiOzs7OztrQkFrR3dCQSxXOzs7O0FBbEd4QixJQUFNQyxXQUFXO0FBQ2ZDLFFBQU0sQ0FEUztBQUVmQyxZQUFVLENBRks7QUFHZkMsWUFBVSxDQUhLO0FBSWZDLGNBQVk7QUFKRyxDQUFqQjs7QUFPQSxTQUFTQyxVQUFULENBQW9CQyxNQUFwQixFQUE0QkMsS0FBNUIsRUFBbUM7QUFDakMsTUFBTUMsT0FBTyxJQUFJQyxLQUFKLENBQVVILE1BQVYsQ0FBYjtBQUNBLE9BQUssSUFBSUksSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFLRyxNQUF6QixFQUFpQ0QsR0FBakMsRUFBc0M7QUFDcENGLFNBQUtFLENBQUwsSUFBVSxJQUFJRSxVQUFKLENBQWVMLEtBQWYsQ0FBVjtBQUNEO0FBQ0QsU0FBT0MsSUFBUDtBQUNEOztBQUVELFNBQVNLLHdCQUFULENBQWtDQyxDQUFsQyxFQUFxQ0MsQ0FBckMsRUFBd0M7QUFDdEM7QUFDQTtBQUNBLE1BQU1DLFVBQVVGLEVBQUVILE1BQWxCO0FBQ0EsTUFBTU0s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LEVBQVQsRUFBYUMsRUFBYixDQUFYO0FBQ0Q7QUFDRjs7QUFFRDs7Ozs7Ozs7QUFRZSxTQUFTOUIsV0FBVCxDQUFxQmUsQ0FBckIsRUFBd0JDLENBQXhCLEVBQTJCO0FBQ3hDLE1BQU1rQixjQUFjcEIseUJBQXlCQyxDQUF6QixFQUE0QkMsQ0FBNUIsQ0FBcEI7QUFDQSxNQUFJLENBQUNtQixVQUFMLEVBQWlCO0FBQ2ZDLGlCQUFhckIsQ0FBYixFQUFnQkMsQ0FBaEI7QUFDRDtBQUNEVyxnQkFBY08sV0FBZCxFQUEyQm5CLENBQTNCLEVBQThCQyxDQUE5QjtBQUNEIiwiZmlsZSI6IjEuanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCBNT1ZFTUVOVCA9IHtcbiAgbm9uZTogMCxcbiAgZGlhZ29uYWw6IDEsXG4gIHZlcnRpY2FsOiAyLFxuICBob3Jpem9udGFsOiAzLFxufTtcblxuZnVuY3Rpb24gaW5pdE1hdHJpeChoZWlnaHQsIHdpZHRoKSB7XG4gIGNvbnN0IHJvd3MgPSBuZXcgQXJyYXkoaGVpZ2h0KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSsrKSB7XG4gICAgcm93c1tpXSA9IG5ldyBJbnQzMkFycmF5KHdpZHRoKTtcbiAgfVxuICByZXR1cm4gcm93cztcbn1cblxuZnVuY3Rpb24gbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlKGEsIGIpIHtcbiAgLy8gYWRhcHRlZCBmcm9tXG4gIC8vIGh0dHA6Ly9hbGdvcml0aG1zLnR1dG9yaWFsaG9yaXpvbi5jb20vZHluYW1pYy1wcm9ncmFtbWluZy1sb25nZXN0LWNvbW1vbi1zdWJzZXF1ZW5jZS9cbiAgY29uc3QgYUxlbmd0aCA9IGEubGVuZ3RoO1xuICBjb25zdCBiTGVuZ3RoID0gYi5sZW5ndGg7XG4gIGNvbnN0IG1lbW8gPSBpbml0TWF0cml4KGFMZW5ndGggKyAxLCBiTGVuZ3RoICsgMSk7XG4gIGNvbnN0IHNvbHV0aW9uID0gaW5pdE1hdHJpeChhTGVuZ3RoICsgMSwgYkxlbmd0aCArIDEpO1xuXG4gIC8vIExvb3AgYW5kIGZpbmQgdGhlIHNvbHV0aW9uXG4gIGZvciAobGV0IGkgPSAxOyBpIDw9IGFMZW5ndGg7IGkrKykge1xuICAgIGZvciAobGV0IGogPSAxOyBqIDw9IGJMZW5ndGg7IGorKykge1xuICAgICAgaWYgKGFbaSAtIDFdID09PSBiW2ogLSAxXSkge1xuICAgICAgICAvLyBkaWFnb25hbFxuICAgICAgICBtZW1vW2ldW2pdID0gbWVtb1tpIC0gMV1baiAtIDFdICsgMTtcbiAgICAgICAgc29sdXRpb25baV1bal0gPSBNT1ZFTUVOVC5kaWFnb25hbDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lbW9baV1bal0gPSBNYXRoLm1heChtZW1vW2kgLSAxXVtqXSwgbWVtb1tpXVtqIC0gMV0pO1xuICAgICAgICBpZiAobWVtb1tpXVtqXSA9PT0gbWVtb1tpIC0gMV1bal0pIHtcbiAgICAgICAgICBzb2x1dGlvbltpXVtqXSA9IE1PVkVNRU5ULnZlcnRpY2FsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNvbHV0aW9uW2ldW2pdID0gTU9WRU1FTlQuaG9yaXpvbnRhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICBpZiAobWVtb1thTGVuZ3RoXVtiTGVuZ3RoXSA9PT0gMCkge1xuICAgIC8vIE5vIHNvbHR1aW9uIGZvdW5kXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIHNvbHV0aW9uO1xufVxuXG5mdW5jdGlvbiBwbGFjZWhvbGRlcnMoY291bnQpIHtcbiAgY29uc3QgcmVzdWx0ID0gbmV3IEFycmF5KGNvdW50KTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7XG4gICAgcmVzdWx0W2ldID0gJysnO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG4vKipcbiAqIEFwcGx5IGFuIGxjcyBzb2x1dGlvbiB0byBhcnJheXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgTVVUQVRFIHRoZSBhcnJheXMsXG4gKiBpbmplY3RpbmcgXCIrXCIgd2hlcmUgZ2FwcyBhcmUgbmVlZGVkLlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8QXJyYXk+fSBzb2x1dGlvbiBhcyBjb21wdXRlZCBieSBgbG9uZ2VzdENvbW1vblN1YnNlcXVlbmNlYFxuICogQHBhcmFtIHtBcnJheX0gYVxuICogQHBhcmFtIHtBcnJheX0gYlxuICovXG5mdW5jdGlvbiBhcHBseVNvbHV0aW9uKHNvbHV0aW9uLCBhLCBiKSB7XG4gIGxldCBtb3ZlbWVudCA9IHNvbHV0aW9uW2EubGVuZ3RoXVtiLmxlbmd0aF07XG4gIGxldCBhaSA9IGEubGVuZ3RoO1xuICBsZXQgYmkgPSBiLmxlbmd0aDtcblxuICBsZXQgY2hhbmdlcyA9IDA7XG5cbiAgd2hpbGUgKG1vdmVtZW50ICE9PSBNT1ZFTUVOVC5ub25lKSB7XG4gICAgaWYgKG1vdmVtZW50ID09PSBNT1ZFTUVOVC5kaWFnb25hbCkge1xuICAgICAgaWYgKGNoYW5nZXMgPCAwKSB7XG4gICAgICAgIGIuc3BsaWNlKGJpLCAwLCAuLi5wbGFjZWhvbGRlcnMoTWF0aC5hYnMoY2hhbmdlcykpKTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhbmdlcyA+IDApIHtcbiAgICAgICAgYS5zcGxpY2UoYWksIDAsIC4uLnBsYWNlaG9sZGVycyhjaGFuZ2VzKSk7XG4gICAgICB9XG4gICAgICBhaS0tO1xuICAgICAgYmktLTtcbiAgICAgIGNoYW5nZXMgPSAwO1xuICAgIH0gZWxzZSBpZiAobW92ZW1lbnQgPT09IE1PVkVNRU5ULmhvcml6b250YWwpIHtcbiAgICAgIGJpLS07XG4gICAgICBjaGFuZ2VzKys7XG4gICAgfSBlbHNlIGlmIChtb3ZlbWVudCA9PT0gTU9WRU1FTlQudmVydGljYWwpIHtcbiAgICAgIGFpLS07XG4gICAgICBjaGFuZ2VzLS07XG4gICAgfVxuICAgIG1vdmVtZW50ID0gc29sdXRpb25bYWldW2JpXTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb25nZXN0IGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiB0d28gYXJyYXlzLCB0aGVuIHVzZXMgdGhhdFxuICogc29sdXRpb24gdG8gaW5qZWN0IGdhcHMgaW50byB0aGUgYXJyYXlzLCBtYWtpbmcgdGhlbSBhbGlnbiBvbiBjb21tb25cbiAqIHN1YnNlcXVlbmNlcy5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBhXG4gKiBAcGFyYW0ge0FycmF5fSBiXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFsaWduQXJyYXlzKGEsIGIpIHtcbiAgY29uc3QgbGNzU29sdXRpb24gPSBsb25nZXN0Q29tbW9uU3Vic2VxdWVuY2UoYSwgYik7XG4gIGlmICghbGNTb2x1dGlvbikge1xuICAgIGFwcGx5UGFkZGluZyhhLCBiKTtcbiAgfVxuICBhcHBseVNvbHV0aW9uKGxjc1NvbHV0aW9uLCBhLCBiKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2FsaWduQXJyYXlzLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
54
-
55
- /***/ }
56
- /******/ ]);