happo 2.8.0 → 2.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (175) hide show
  1. checksums.yaml +4 -4
  2. data/lib/happo/public/05bf9fb3d7f0192e7194.worker.js +56 -0
  3. data/lib/happo/public/06bf22e3fa348f77a82f.worker.js +56 -0
  4. data/lib/happo/public/08ccdc92f4d8ed3cff76.worker.js +62 -0
  5. data/lib/happo/public/0b94c9757c981bfc9fd7.worker.js +62 -0
  6. data/lib/happo/public/0d036738a62c01299743.worker.js +56 -0
  7. data/lib/happo/public/{203272bf00c349325c60.worker.js → 0e32a5b5219342a9aa1e.worker.js} +1 -1
  8. data/lib/happo/public/105bb978b49beac37583.worker.js +62 -0
  9. data/lib/happo/public/1172b74983f510409e2d.worker.js +62 -0
  10. data/lib/happo/public/13d0677d081eefd8c8bb.worker.js +62 -0
  11. data/lib/happo/public/1635684653e1a1979bea.worker.js +56 -0
  12. data/lib/happo/public/{4f6b0faf1b43e93a1404.worker.js → 1bb6a3a6bba3c02df491.worker.js} +1 -1
  13. data/lib/happo/public/1c48c5a95c9c5331c65f.worker.js +56 -0
  14. data/lib/happo/public/{1a86029ce53b1aa81f68.worker.js → 1d1049629f51e72af69f.worker.js} +1 -1
  15. data/lib/happo/public/{423ba9f549f3829873e6.worker.js → 1fd046493403de128de1.worker.js} +1 -1
  16. data/lib/happo/public/20c34bdb9a226c485df8.worker.js +56 -0
  17. data/lib/happo/public/23686d1b2fc3f4f86d12.worker.js +56 -0
  18. data/lib/happo/public/238307cd4525e692bc79.worker.js +56 -0
  19. data/lib/happo/public/2c643331ceb20b73e255.worker.js +56 -0
  20. data/lib/happo/public/2db6b1d7219028bac961.worker.js +62 -0
  21. data/lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js +62 -0
  22. data/lib/happo/public/30ee387dd21d6b20a927.worker.js +62 -0
  23. data/lib/happo/public/34c08770d9dc4981b2a2.worker.js +62 -0
  24. data/lib/happo/public/35d8e219a4200e27adf9.worker.js +62 -0
  25. data/lib/happo/public/360e0acb872760f43b07.worker.js +1 -1
  26. data/lib/happo/public/385cc56a00d991287244.worker.js +62 -0
  27. data/lib/happo/public/38e90e6329f74e2d681a.worker.js +56 -0
  28. data/lib/happo/public/3a1ce5368a835b999d55.worker.js +62 -0
  29. data/lib/happo/public/3a7567174ad2bd91c107.worker.js +56 -0
  30. data/lib/happo/public/3b63d7abc667a23e0a2b.worker.js +56 -0
  31. data/lib/happo/public/3bdf5dcbba8864a7dcae.worker.js +62 -0
  32. data/lib/happo/public/{463eb0ecadbb11365ca4.worker.js → 3ee7268990c5d4183ad1.worker.js} +1 -1
  33. data/lib/happo/public/41d90eebc5449581b92a.worker.js +56 -0
  34. data/lib/happo/public/46a8fcf803fae37aa259.worker.js +62 -0
  35. data/lib/happo/public/46ef1d4f416d92b92cab.worker.js +62 -0
  36. data/lib/happo/public/4960a52eba13a73eb069.worker.js +56 -0
  37. data/lib/happo/public/49c762dec74fb3e7c638.worker.js +62 -0
  38. data/lib/happo/public/507ef3ea49332d42f582.worker.js +62 -0
  39. data/lib/happo/public/511d7e03fd683c618a22.worker.js +56 -0
  40. data/lib/happo/public/527516eb649429b011f7.worker.js +68 -0
  41. data/lib/happo/public/52e42bbfa68714fd1b26.worker.js +62 -0
  42. data/lib/happo/public/53e970da89474270e914.worker.js +56 -0
  43. data/lib/happo/public/572846c1173405e57d7d.worker.js +62 -0
  44. data/lib/happo/public/578cb8199b43c9f746ec.worker.js +62 -0
  45. data/lib/happo/public/58ae755db5700fc141d3.worker.js +62 -0
  46. data/lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js +56 -0
  47. data/lib/happo/public/{62c7585d1d23297b316f.worker.js → 5cbf9957eb776724a5b6.worker.js} +1 -1
  48. data/lib/happo/public/612cb8b078897547b091.worker.js +62 -0
  49. data/lib/happo/public/{9cdd6f0763fd866a5118.worker.js → 6368c448d11a203d506b.worker.js} +1 -1
  50. data/lib/happo/public/69d16a4997e4170af4ee.worker.js +1 -0
  51. data/lib/happo/public/69fdd0bf1915b19115d6.worker.js +62 -0
  52. data/lib/happo/public/74309d94f574207e4e79.worker.js +62 -0
  53. data/lib/happo/public/74882ef02b7b28391aac.worker.js +62 -0
  54. data/lib/happo/public/785285eac660735ef3e0.worker.js +56 -0
  55. data/lib/happo/public/{730c035f5c2b404ff225.worker.js → 7d7551366f97adda7b5b.worker.js} +2 -2
  56. data/lib/happo/public/7e53176d18c890a5424c.worker.js +56 -0
  57. data/lib/happo/public/{b20a32590dfe259f4fe3.worker.js → 818ac008a4a7d62aa55c.worker.js} +2 -2
  58. data/lib/happo/public/823340592678aeab5317.worker.js +56 -0
  59. data/lib/happo/public/8cc13e3a447ea341f962.worker.js +56 -0
  60. data/lib/happo/public/8d0d79f0c81652bfb3f1.worker.js +1 -0
  61. data/lib/happo/public/9037f52c590941a75440.worker.js +62 -0
  62. data/lib/happo/public/{9472102d9a6d2577f988.worker.js → 935b279f09cf3c4046ec.worker.js} +1 -1
  63. data/lib/happo/public/{4e685162de1d8a9b102d.worker.js → 945f54dcc60d8b7abc9d.worker.js} +1 -1
  64. data/lib/happo/public/{f81ed0eec7edfa2dfadb.worker.js → 94ff43f0e47ff2759712.worker.js} +1 -1
  65. data/lib/happo/public/95a6641585f90432e282.worker.js +1 -0
  66. data/lib/happo/public/95ae334beb5125d1b4ce.worker.js +62 -0
  67. data/lib/happo/public/95b52fcff8f5732b1902.worker.js +62 -0
  68. data/lib/happo/public/984f0e2d0e896c2f4048.worker.js +62 -0
  69. data/lib/happo/public/988f633191766eef664a.worker.js +56 -0
  70. data/lib/happo/public/99af2b663636fee65291.worker.js +62 -0
  71. data/lib/happo/public/9c8f5ee8dfa77750be8c.worker.js +62 -0
  72. data/lib/happo/public/9d57ea9c2af229a03119.worker.js +56 -0
  73. data/lib/happo/public/9d7be8cf3aadb0b77624.worker.js +62 -0
  74. data/lib/happo/public/9e6b804a33c6799809cf.worker.js +62 -0
  75. data/lib/happo/public/HappoApp.bundle.js.map +1 -0
  76. data/lib/happo/public/a3574ff725014ef26602.worker.js +56 -0
  77. data/lib/happo/public/a5564ec6a5def9e7a95a.worker.js +1 -0
  78. data/lib/happo/public/a59e639dbf2bc03792c2.worker.js +56 -0
  79. data/lib/happo/public/a6de7e3f4866c4d4af09.worker.js +62 -0
  80. data/lib/happo/public/a79d520c7469920c10a2.worker.js +62 -0
  81. data/lib/happo/public/a7da9c5111db811b9535.worker.js +62 -0
  82. data/lib/happo/public/a8d9429cf3dd094aa190.worker.js +62 -0
  83. data/lib/happo/public/ab952692e7c4df03d3b8.worker.js +56 -0
  84. data/lib/happo/public/{80009e8bc0ffd29d3390.worker.js → aca1442707a8e088ec9e.worker.js} +1 -1
  85. data/lib/happo/public/{28237f0668f12dfb456c.worker.js → adc1f6a613d0d2eda4b8.worker.js} +1 -7
  86. data/lib/happo/public/b2a65c76321af7bc6d89.worker.js +62 -0
  87. data/lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js +62 -0
  88. data/lib/happo/public/{e247eaa7506f44b5b847.worker.js → b41bd9a6b659bfe3096f.worker.js} +2 -2
  89. data/lib/happo/public/b66da676446fdda1a58c.worker.js +56 -0
  90. data/lib/happo/public/c1dd7c953827ff9578f0.worker.js +68 -0
  91. data/lib/happo/public/{3818f1c91ce4d4d8b724.worker.js → c556b6ede3bbd230cebd.worker.js} +1 -1
  92. data/lib/happo/public/ca172f55a8f34b526853.worker.js +62 -0
  93. data/lib/happo/public/{830db6cc9c99c2e8e9c1.worker.js → cbc31c846bebca5538bf.worker.js} +1 -1
  94. data/lib/happo/public/ce2440f84aa6708e51d4.worker.js +56 -0
  95. data/lib/happo/public/d4d18f5ac12fd3309c03.worker.js +56 -0
  96. data/lib/happo/public/d5ec9230a58d0929fe2d.worker.js +62 -0
  97. data/lib/happo/public/d650ec5f5ee0203de80a.worker.js +1 -0
  98. data/lib/happo/public/d6dbbb2aeed75685efa1.worker.js +62 -0
  99. data/lib/happo/public/d7403b48b365a76148a2.worker.js +56 -0
  100. data/lib/happo/public/d75350c7043f58e46d0c.worker.js +62 -0
  101. data/lib/happo/public/d899e9318500e6115f21.worker.js +62 -0
  102. data/lib/happo/public/df0d03d918e87308e3e3.worker.js +62 -0
  103. data/lib/happo/public/e39e8636909998d394e8.worker.js +56 -0
  104. data/lib/happo/public/e5c91be22eaad28e7e82.worker.js +56 -0
  105. data/lib/happo/public/e65a11af21a63b0c66df.worker.js +62 -0
  106. data/lib/happo/public/e8d18bed99776d3eabfd.worker.js +62 -0
  107. data/lib/happo/public/f0a047027dca5832b680.worker.js +62 -0
  108. data/lib/happo/public/f18c5838c7ec92d4a291.worker.js +62 -0
  109. data/lib/happo/public/f1b8838f395f31ff14a0.worker.js +62 -0
  110. data/lib/happo/public/fb955bccd11761291311.worker.js +62 -0
  111. data/lib/happo/public/happo-logo.svg +1 -0
  112. data/lib/happo/uploader.rb +3 -1
  113. data/lib/happo/version.rb +1 -1
  114. metadata +111 -80
  115. data/lib/happo/public/0622a1eb2a5b4dab0d7d.worker.js +0 -62
  116. data/lib/happo/public/088cc9d4615d51d37661.worker.js +0 -68
  117. data/lib/happo/public/11b439cedd6aa6a01e71.worker.js +0 -68
  118. data/lib/happo/public/167f0a5b59a8c27815fe.worker.js +0 -62
  119. data/lib/happo/public/19f5f7403fb4a2ba42e2.worker.js +0 -62
  120. data/lib/happo/public/1b6803fbc7b07f61cba2.worker.js +0 -74
  121. data/lib/happo/public/1d3dc560f1f39393dafe.worker.js +0 -62
  122. data/lib/happo/public/25ad7a1e52bd424ca81d.worker.js +0 -62
  123. data/lib/happo/public/26d95a76207ba0fe6c25.worker.js +0 -74
  124. data/lib/happo/public/2a7a935f3b9526c6f7ab.worker.js +0 -74
  125. data/lib/happo/public/2c00cb8d0a2eb5dd4078.worker.js +0 -68
  126. data/lib/happo/public/2c71ddb5b15a755d4644.worker.js +0 -68
  127. data/lib/happo/public/32648d3dfb22995f4066.worker.js +0 -68
  128. data/lib/happo/public/3452650686a8096b2bb7.worker.js +0 -68
  129. data/lib/happo/public/346cefcc1572890455b8.worker.js +0 -68
  130. data/lib/happo/public/35bd63f58bb69ac267ea.worker.js +0 -68
  131. data/lib/happo/public/3cc2e649d9b6ff62f4ab.worker.js +0 -62
  132. data/lib/happo/public/3deccedc8fbb96bb1aa7.worker.js +0 -68
  133. data/lib/happo/public/3e672be26a7a8864a342.worker.js +0 -68
  134. data/lib/happo/public/41aa7471344a79ff98f2.worker.js +0 -68
  135. data/lib/happo/public/47c52ff0e060fedb841f.worker.js +0 -62
  136. data/lib/happo/public/4eea1b4008ed68e41f82.worker.js +0 -62
  137. data/lib/happo/public/589c2f9547d240ac8a57.worker.js +0 -68
  138. data/lib/happo/public/5a8c0588ca745d7904f7.worker.js +0 -68
  139. data/lib/happo/public/5b3cabd81f7d8688f7a5.worker.js +0 -62
  140. data/lib/happo/public/5f5c9f07cb5117c523a2.worker.js +0 -68
  141. data/lib/happo/public/5fb8c7066659ea1b57e2.worker.js +0 -62
  142. data/lib/happo/public/5fb962cc191a60b42af0.worker.js +0 -68
  143. data/lib/happo/public/62e676d31cbf8aaa9359.worker.js +0 -68
  144. data/lib/happo/public/65efcf6aee5e3ef33539.worker.js +0 -68
  145. data/lib/happo/public/693d4918a5dae465c134.worker.js +0 -68
  146. data/lib/happo/public/69d106b071dd31ad86de.worker.js +0 -68
  147. data/lib/happo/public/7609088c49b73ee2e3e1.worker.js +0 -68
  148. data/lib/happo/public/76161d401db5bb36980a.worker.js +0 -62
  149. data/lib/happo/public/7d9febb46b37ddffa2d5.worker.js +0 -62
  150. data/lib/happo/public/7f29af56bd0ea82d77d9.worker.js +0 -68
  151. data/lib/happo/public/85ad69599657de02d20d.worker.js +0 -68
  152. data/lib/happo/public/875e790f3e64476b3aa0.worker.js +0 -68
  153. data/lib/happo/public/8fa9a7b2a5f19075eedc.worker.js +0 -74
  154. data/lib/happo/public/906ce908877052838b8e.worker.js +0 -62
  155. data/lib/happo/public/9ac309ab34f48e7af07c.worker.js +0 -68
  156. data/lib/happo/public/aa7ae8013f9780eb8acb.worker.js +0 -68
  157. data/lib/happo/public/b25ebdd4e2d2dee8c7b1.worker.js +0 -68
  158. data/lib/happo/public/b7a49d603b1d50f535b2.worker.js +0 -68
  159. data/lib/happo/public/b8e667564ad96f5c77f4.worker.js +0 -68
  160. data/lib/happo/public/b913c562805ec9a01635.worker.js +0 -68
  161. data/lib/happo/public/bab832c7110d15a5f43b.worker.js +0 -62
  162. data/lib/happo/public/bfcf99c9b2bf3d58ec7f.worker.js +0 -62
  163. data/lib/happo/public/c0aeff8b32c9911c8547.worker.js +0 -68
  164. data/lib/happo/public/c3d7b17359c21ff82281.worker.js +0 -68
  165. data/lib/happo/public/c9f7adcce3de80eb759a.worker.js +0 -68
  166. data/lib/happo/public/d7b87aec5f1e4f2a7a5d.worker.js +0 -68
  167. data/lib/happo/public/db617ae6458966f4acae.worker.js +0 -68
  168. data/lib/happo/public/e92bb4e1e06843fa771e.worker.js +0 -62
  169. data/lib/happo/public/e9e2d97848e0059e15c5.worker.js +0 -62
  170. data/lib/happo/public/ea87c48552c960ed7a1c.worker.js +0 -74
  171. data/lib/happo/public/eb5aafba8d16a397517a.worker.js +0 -68
  172. data/lib/happo/public/edc218b655b9ef694b3e.worker.js +0 -74
  173. data/lib/happo/public/eea64a6efa0620a576d7.worker.js +0 -68
  174. data/lib/happo/public/f269a8e7ffca13e9366a.worker.js +0 -68
  175. data/lib/happo/public/fcd20ee3e5a10e8667bb.worker.js +0 -68
@@ -0,0 +1,56 @@
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\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 to2DArray(imageData, width) {\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 if (x > width || y > height) {\n return undefined;\n }\n\n var startIndex = y * rowSize + x * 4;\n return [imageData[startIndex], imageData[startIndex + 1], imageData[startIndex + 2], imageData[startIndex + 3]];\n };\n\n var data = [];\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 data.push(pixelsInRow);\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(_ref) {\n var previousData = _ref.previousData;\n var currentData = _ref.currentData;\n\n var maxWidth = Math.max(previousData[0].length, currentData[0].length);\n\n var redLine = constructColoredLine([255, 0, 0, 255], maxWidth);\n var greenLine = constructColoredLine([0, 255, 0, 255], maxWidth);\n\n var adiffResults = _adiff2.default.diff(previousData.map(function (d) {\n return btoa(d);\n }), currentData.map(function (d) {\n return btoa(d);\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 previousData.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 currentData.splice(atIndex + y, 0, redLine);\n }\n }\n }\n}\n\nself.addEventListener('message', function (_ref2) {\n var _ref2$data = _ref2.data;\n var previousData = _ref2$data.previousData;\n var currentData = _ref2$data.currentData;\n\n computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage({ previousData: previousData, currentData: currentData });\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsInRvMkRBcnJheSIsImltYWdlRGF0YSIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJoZWlnaHQiLCJ1bmRlZmluZWQiLCJzdGFydEluZGV4IiwiZGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJsZW5ndGgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJzcGxpY2UiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBOzs7Ozs7O0FBT0EsU0FBU0Esb0JBQVQsQ0FBOEJDLElBQTlCLEVBQW9DQyxLQUFwQyxFQUEyQztBQUN6QyxNQUFNQyxPQUFPLEVBQWI7QUFDQSxPQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSUYsS0FBcEIsRUFBMkJFLEdBQTNCLEVBQWdDO0FBQzlCRCxTQUFLRSxJQUFMLENBQVVKLElBQVY7QUFDRDtBQUNELFNBQU9FLElBQVA7QUFDRDs7QUFFRCxTQUFTRyxTQUFULENBQW1CQyxTQUFuQixFQUE4QkwsS0FBOUIsRUFBcUM7QUFDbkM7QUFDQTtBQUNBLE1BQU1NLFVBQVVOLFFBQVEsQ0FBeEI7QUFDQSxNQUFNTyxhQUFhLFNBQWJBLFVBQWEsQ0FBQ0MsQ0FBRCxFQUFJ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RUFBNkQ7QUFDM0QsVUFBSUEsSUFBSTBCLFVBQVIsRUFBb0I7QUFDbEI7QUFDRCxPQUZELE1BRU87QUFDTDtBQUNBaEIsb0JBQVlpQixNQUFaLENBQW1CSCxVQUFVeEIsQ0FBN0IsRUFBZ0MsQ0FBaEMsRUFBbUNlLE9BQW5DO0FBQ0Q7QUFDRjtBQUNGO0FBQ0Y7O0FBRURhLEtBQUtDLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGlCQUE2QztBQUFBLHlCQUExQ3pCLElBQTBDO0FBQUEsTUFBbENLLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFRix3QkFBc0IsRUFBRUMsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QjtBQUNBa0IsT0FBS0UsV0FBTCxDQUFpQixFQUFFckIsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUFqQjtBQUNBa0IsT0FBS0csS0FBTDtBQUNELENBSkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhZGlmZiBmcm9tICdhZGlmZic7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gdG8yREFycmF5KGltYWdlRGF0YSwgd2lkdGgpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuICBjb25zdCBnZXRQaXhlbEF0ID0gKHgsIHkpID0+IHtcbiAgICBpZiAoeCA+IHdpZHRoIHx8IHkgPiBoZWlnaHQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhcnRJbmRleCA9ICh5ICogcm93U2l6ZSkgKyAoeCAqIDQpO1xuICAgIHJldHVybiBbXG4gICAgICBpbWFnZURhdGFbc3RhcnRJbmRleF0sXG4gICAgICBpbWFnZURhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgaW1hZ2VEYXRhW3N0YXJ0SW5kZXggKyAyXSxcbiAgICAgIGltYWdlRGF0YVtzdGFydEluZGV4ICsgM10sXG4gICAgXTtcbiAgfTtcblxuICBjb25zdCBkYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IFtdO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChnZXRQaXhlbEF0KGNvbCwgcm93KSk7XG4gICAgfVxuICAgIGRhdGEucHVzaChwaXhlbHNJblJvdyk7XG4gIH1cbn1cblxuLyoqXG4gKiBUYWtlcyB0d28gMmQgaW1hZ2VzLCBjb21wdXRlcyB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28sIGFuZCBpbmplY3RzIHBpeGVscyB0b1xuICogYm90aCBpbiBvcmRlciB0bzpcbiAqIGEpIG1ha2UgYm90aCBpbWFnZXMgdGhlIHNhbWUgaGVpZ2h0XG4gKiBiKSBwcm9wZXJseSB2aXN1YWxpemUgZGlmZmVyZW5jZXNcbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIE1VVEFURVMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwcmV2aW91c0RhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnJlbnREYXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSkge1xuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KFxuICAgIHByZXZpb3VzRGF0YVswXS5sZW5ndGgsIGN1cnJlbnREYXRhWzBdLmxlbmd0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNEYXRhLm1hcChkID0+IGJ0b2EoZCkpLCBjdXJyZW50RGF0YS5tYXAoZCA9PiBidG9hKGQpKSk7XG5cbiAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgY2hhbmdlcyB0byBwcmV2aW91cyBkYXRhXG4gIGFkaWZmUmVzdWx0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGRlbGV0ZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIGdyZWVuIGxpbmUgdG8gc2lnbmFsIGFuIGFkZGl0aW9uXG4gICAgICAgIHByZXZpb3VzRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIGdyZWVuTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50RGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHJlZExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLmNsb3NlKCk7XG59KTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL3dvcmtlcnMvQ29tcHV0ZUFuZEluamVjdERpZmZzV29ya2VyLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
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
+ /******/ ]);
@@ -0,0 +1,56 @@
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\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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\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) {\n var imageData = _ref.imageData;\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 if (x > width || y > height) {\n return undefined;\n }\n\n var startIndex = y * rowSize + x * 4;\n return [imageData[startIndex], imageData[startIndex + 1], imageData[startIndex + 2], imageData[startIndex + 3]];\n };\n\n var data = [];\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 data.push(pixelsInRow);\n }\n return data;\n}\n\nfunction flattenImageData(imageData) {\n var result = [];\n imageData.forEach(function (row) {\n row.forEach(function (pixel) {\n result.push.apply(result, _toConsumableArray(pixel));\n });\n });\n return Uint8ClampedArray.from(result);\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.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.data);\n var currentImageData = imageTo2DArray(currentData.data);\n\n var adiffResults = _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\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: flattenImageData(currentImageData),\n height: currentImageData.length,\n width: currentData.width\n },\n previousData: {\n data: flattenImageData(previousImageData),\n height: previousImageData.length,\n width: previousData.width\n }\n };\n}\n\nself.addEventListener('message', function (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwiaW1hZ2VEYXRhIiwiaGVpZ2h0Iiwicm93U2l6ZSIsImdldFBpeGVsQXQiLCJ4IiwieSIsInVuZGVmaW5lZCIsInN0YXJ0SW5kZXgiLCJkYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJjb2wiLCJmbGF0dGVuSW1hZ2VEYXRhIiwicmVzdWx0IiwiZm9yRWFjaCIsInBpeGVsIiwiVWludDhDbGFtcGVkQXJyYXkiLCJmcm9tIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsImxlbmd0aCIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7QUFFQTs7Ozs7OztBQU9BLFNBQVNBLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDekMsTUFBTUMsT0FBTyxFQUFiO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQXBCLEVBQTJCRSxHQUEzQixFQUFnQztBQUM5QkQsU0FBS0UsSUFBTCxDQUFVSixJQUFWO0FBQ0Q7QUFDRCxTQUFPRSxJQUFQO0FBQ0Q7O0FBRUQsU0FBU0csY0FBVCxPQUFz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QkFBTCxDQUFzQixTQUF0QixFQUFpQyxpQkFBNkM7QUFBQSx5QkFBMUNoQyxJQUEwQztBQUFBLE1BQWxDVyxZQUFrQyxjQUFsQ0EsWUFBa0M7QUFBQSxNQUFwQkMsV0FBb0IsY0FBcEJBLFdBQW9COztBQUM1RSxNQUFNUCxTQUFTSyxzQkFBc0IsRUFBRUMsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QixDQUFmOztBQUVBbUIsT0FBS0UsV0FBTCxDQUFpQjVCLE1BQWpCO0FBQ0EwQixPQUFLRyxLQUFMO0FBQ0QsQ0FMRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSBsaW5lIG9mIHBpeGVscyBvZiBhIGNlcnRhaW4gcmdiYSBjb2xvclxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHJnYmFcbiAqIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogQHJldHVybiB7QXJyYXl9XG4gKi9cbmZ1bmN0aW9uIGNvbnN0cnVjdENvbG9yZWRMaW5lKHJnYmEsIHdpZHRoKSB7XG4gIGNvbnN0IGxpbmUgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB3aWR0aDsgaSsrKSB7XG4gICAgbGluZS5wdXNoKHJnYmEpO1xuICB9XG4gIHJldHVybiBsaW5lO1xufVxuXG5mdW5jdGlvbiBpbWFnZVRvMkRBcnJheSh7IGltYWdlRGF0YSwgd2lkdGgsIGhlaWdodCB9KSB7XG4gIC8vIFRoZSBpbWFnZURhdGEgaXMgYSAxRCBhcnJheS4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhXG4gIC8vIGRlY2ltYWwgdmFsdWUgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgUkdCQSBjaGFubmVscyBmb3IgdGhhdCBwaXhlbC5cbiAgY29uc3Qgcm93U2l6ZSA9IHdpZHRoICogNDtcbiAgY29uc3QgZ2V0UGl4ZWxBdCA9ICh4LCB5KSA9PiB7XG4gICAgaWYgKHggPiB3aWR0aCB8fCB5ID4gaGVpZ2h0KSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgaW1hZ2VEYXRhW3N0YXJ0SW5kZXhdLFxuICAgICAgaW1hZ2VEYXRhW3N0YXJ0SW5kZXggKyAxXSxcbiAgICAgIGltYWdlRGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBpbWFnZURhdGFbc3RhcnRJbmRleCArIDNdLFxuICAgIF07XG4gIH07XG5cbiAgY29uc3QgZGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBbXTtcbiAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCB3aWR0aDsgY29sKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goZ2V0UGl4ZWxBdChjb2wsIHJvdykpO1xuICAgIH1cbiAgICBkYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBmbGF0dGVuSW1hZ2VEYXRhKGltYWdlRGF0YSkge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaW1hZ2VEYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChwaXhlbCkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucGl4ZWwpO1xuICAgIH0pO1xuICB9KTtcbiAgcmV0dXJuIFVpbnQ4Q2xhbXBlZEFycmF5LmZyb20ocmVzdWx0KTtcbn1cblxuLyoqXG4gKiBUYWtlcyB0d28gMmQgaW1hZ2VzLCBjb21wdXRlcyB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28sIGFuZCBpbmplY3RzIHBpeGVscyB0b1xuICogYm90aCBpbiBvcmRlciB0bzpcbiAqIGEpIG1ha2UgYm90aCBpbWFnZXMgdGhlIHNhbWUgaGVpZ2h0XG4gKiBiKSBwcm9wZXJseSB2aXN1YWxpemUgZGlmZmVyZW5jZXNcbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIE1VVEFURVMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwcmV2aW91c0RhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnJlbnREYXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSkge1xuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KHByZXZpb3VzRGF0YS53aWR0aCwgY3VycmVudERhdGEud2lkdGgpO1xuXG4gIGNvbnN0IHJlZExpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMjU1LCAwLCAwLCAyNTVdLCBtYXhXaWR0aCk7XG4gIGNvbnN0IGdyZWVuTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFswLCAyNTUsIDAsIDI1NV0sIG1heFdpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KHByZXZpb3VzRGF0YS5kYXRhKTtcbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KGN1cnJlbnREYXRhLmRhdGEpO1xuXG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSksXG4gICAgY3VycmVudEltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKVxuICApO1xuXG4gIC8vIGl0ZXJhdGUgYW5kIGFwcGx5IGNoYW5nZXMgdG8gcHJldmlvdXMgZGF0YVxuICBhZGlmZlJlc3VsdHMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBkZWxldGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSBncmVlbiBsaW5lIHRvIHNpZ25hbCBhbiBhZGRpdGlvblxuICAgICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIGdyZWVuTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgcmVkTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogY3VycmVudERhdGEud2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogcHJldmlvdXNEYXRhLndpZHRoLFxuICAgIH0sXG4gIH07XG59XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
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
+ /******/ ]);
@@ -0,0 +1,62 @@
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 hashedPreviousData = previousImageData.map(JSON.stringify);\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n return _adiff2.default.diff(hashedPreviousData, hashedPreviousData);\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 self.postMessage({ progress: 30 });\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 75 });\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 self.postMessage({ progress: 80 });\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 self.postMessage({ progress: 85 });\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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZ2V0QWRpZmZSZXN1bHRzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJkaWZmIiwibGVuZ3RoIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsImhhc2hlZEN1cnJlbnREYXRhIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiYWRpZmZSZXN1bHRzIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJzcGxpY2UiLCJhZGRFdmVudExpc3RlbmVyIiwicmVzdWx0IiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0Qs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QUFxQixDQUF4Qzs7QUFFQSxTQUFLLElBQUliLElBQUksQ0FBYixFQUFnQkEsSUFBSXFCLEtBQUtDLEdBQUwsQ0FBU1UsWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RqQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJaUMsVUFBUixFQUFvQjtBQUNsQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0F0Qix5QkFBaUJ1QixNQUFqQixDQUF3QkgsVUFBVS9CLENBQWxDLEVBQXFDLENBQXJDLEVBQXdDdUIsT0FBeEM7QUFDRDtBQUNGO0FBQ0Y7QUFDREUsT0FBS0MsV0FBTCxDQUFpQixFQUFFQyxVQUFVLEVBQVosRUFBakI7O0FBRUEsU0FBTztBQUNMbEIsaUJBQWE7QUFDWGQsWUFBTSxnQ0FBaUJnQixnQkFBakIsQ0FESztBQUVYZixjQUFRZSxpQkFBaUJFLE1BRmQ7QUFHWHhCLGFBQU8rQjtBQUhJLEtBRFI7QUFNTFosa0JBQWM7QUFDWmIsWUFBTSxnQ0FBaUJlLGlCQUFqQixDQURNO0FBRVpkLGNBQVFjLGtCQUFrQkcsTUFGZDtBQUdaeEIsYUFBTytCO0FBSEs7QUFOVCxHQUFQO0FBWUQ7O0FBRURLLEtBQUtVLGdCQUFMLENBQXNCLFNBQXRCLEVBQWlDLGlCQUE2QztBQUFBLHlCQUExQ3hDLElBQTBDO0FBQUEsTUFBbENhLFlBQWtDLGNBQWxDQSxZQUFrQztBQUFBLE1BQXBCQyxXQUFvQixjQUFwQkEsV0FBb0I7O0FBQzVFLE1BQU0yQixTQUFTakIsc0JBQXNCLEVBQUVYLDBCQUFGLEVBQWdCQyx3QkFBaEIsRUFBdEIsQ0FBZjtBQUNBZ0IsT0FBS0MsV0FBTCxDQUFpQlUsTUFBakI7QUFDQVgsT0FBS1ksS0FBTDtBQUNELENBSkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhZGlmZiBmcm9tICdhZGlmZic7XG5cbmltcG9ydCBmbGF0dGVuSW1hZ2VEYXRhIGZyb20gJy4uL2ZsYXR0ZW5JbWFnZURhdGEnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIGxpbmUgb2YgcGl4ZWxzIG9mIGEgY2VydGFpbiByZ2JhIGNvbG9yXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmdiYVxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0Q29sb3JlZExpbmUocmdiYSwgd2lkdGgpIHtcbiAgY29uc3QgbGluZSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICBsaW5lLnB1c2gocmdiYSk7XG4gIH1cbiAgcmV0dXJuIGxpbmU7XG59XG5cbmZ1bmN0aW9uIGltYWdlVG8yREFycmF5KHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9LCBwYWRkaW5nUmlnaHQpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuICBjb25zdCBnZXRQaXhlbEF0ID0gKHgsIHkpID0+IHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHkgKiByb3dTaXplKSArICh4ICogNCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRhdGFbc3RhcnRJbmRleF0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAxXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDJdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgM10sXG4gICAgXTtcbiAgfTtcblxuICBjb25zdCBuZXdEYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IFtdO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChnZXRQaXhlbEF0KGNvbCwgcm93KSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBhZCA9IDA7IHBhZCA8IHBhZGRpbmdSaWdodDsgcGFkKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goWzAsIDAsIDAsIDBdKTtcbiAgICB9XG4gICAgbmV3RGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gbmV3RGF0YTtcbn1cblxuZnVuY3Rpb24gZ2V0QWRpZmZSZXN1bHRzKHtcbiAgcHJldmlvdXNEYXRhLFxuICBjdXJyZW50RGF0YSxcbiAgcHJldmlvdXNJbWFnZURhdGEsXG4gIGN1cnJlbnRJbWFnZURhdGEsXG59KSB7XG4gIGlmIChwcmV2aW91c0RhdGEud2lkdGggIT09IGN1cnJlbnREYXRhLndpZHRoKSB7XG4gICAgLy8gd2Uga25vdyB0aGF0IGFsbCByb3dzIHdpbGwgYmUgZGlmZmVyZW50IGhlcmUsIHNvIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXRcbiAgICBjb25zdCBkaWZmID0gW1xuICAgICAgMCwgLy8gZGlmZiBzdGFydHMgYXQgaW5kZXggMFxuICAgICAgcHJldmlvdXNEYXRhLmhlaWdodCwgLy8gbnVtYmVyIG9mIGRlbGV0aW9uc1xuICAgIF07XG4gICAgZGlmZi5sZW5ndGggPSBjdXJyZW50RGF0YS5oZWlnaHQgKyAyOyAvLyBudW1iZXIgb2YgYWRkaXRpb25zXG4gICAgcmV0dXJuIFtkaWZmXTtcbiAgfVxuICBjb25zdCBoYXNoZWRQcmV2aW91c0RhdGEgPSBwcmV2aW91c0ltYWdlRGF0YS5tYXAoSlNPTi5zdHJpbmdpZnkpO1xuICBjb25zdCBoYXNoZWRDdXJyZW50RGF0YSA9IGN1cnJlbnRJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgcmV0dXJuIGFkaWZmLmRpZmYoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZFByZXZpb3VzRGF0YSxcbiAgKTtcbn1cblxuLyoqXG4gKiBUYWtlcyB0d28gMmQgaW1hZ2VzLCBjb21wdXRlcyB0aGUgZGlmZiBiZXR3ZWVuIHRoZSB0d28sIGFuZCBpbmplY3RzIHBpeGVscyB0b1xuICogYm90aCBpbiBvcmRlciB0bzpcbiAqIGEpIG1ha2UgYm90aCBpbWFnZXMgdGhlIHNhbWUgaGVpZ2h0XG4gKiBiKSBwcm9wZXJseSB2aXN1YWxpemUgZGlmZmVyZW5jZXNcbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgbWV0aG9kIE1VVEFURVMgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge0FycmF5fSBwcmV2aW91c0RhdGFcbiAqIEBwYXJhbSB7QXJyYXl9IGN1cnJlbnREYXRhXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSkge1xuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KHByZXZpb3VzRGF0YS53aWR0aCwgY3VycmVudERhdGEud2lkdGgpO1xuXG4gIGNvbnN0IHJlZExpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMjU1LCAwLCAwLCAyNTVdLCBtYXhXaWR0aCk7XG4gIGNvbnN0IGdyZWVuTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFswLCAyNTUsIDAsIDI1NV0sIG1heFdpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAzMCB9KTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBnZXRBZGlmZlJlc3VsdHMoe1xuICAgIHByZXZpb3VzRGF0YSxcbiAgICBjdXJyZW50RGF0YSxcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDc1IH0pO1xuXG4gIC8vIGl0ZXJhdGUgYW5kIGFwcGx5IGNoYW5nZXMgdG8gcHJldmlvdXMgZGF0YVxuICBhZGlmZlJlc3VsdHMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBkZWxldGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSBncmVlbiBsaW5lIHRvIHNpZ25hbCBhbiBhZGRpdGlvblxuICAgICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIGdyZWVuTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4MCB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgcmVkTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogODUgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
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
+ /******/ ]);
@@ -0,0 +1,62 @@
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 previous = _ref$data.previous;\n var current = _ref$data.current;\n\n var data = new Uint8ClampedArray(previous.length);\n\n console.log('max', previous.length);\n for (var i = 0; i < previous.length; i += 4) {\n console.log(i);\n var pixel = (0, _getDiffPixel2.default)(previous.slice(i, i + 4), current.slice(i, i + 4));\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/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91cyIsImN1cnJlbnQiLCJVaW50OENsYW1wZWRBcnJheSIsImxlbmd0aCIsImNvbnNvbGUiLCJsb2ciLCJpIiwicGl4ZWwiLCJzbGljZSIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7OztBQUVBQSxLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxnQkFBcUM7QUFBQSx1QkFBbENDLElBQWtDO0FBQUEsTUFBMUJDLFFBQTBCLGFBQTFCQSxRQUEwQjtBQUFBLE1BQWhCQyxPQUFnQixhQUFoQkEsT0FBZ0I7O0FBQ3BFLE1BQU1GLE9BQU8sSUFBSUcsaUJBQUosQ0FBc0JGLFNBQVNHLE1BQS9CLENBQWI7O0FBRUFDLFVBQVFDLEdBQVIsQ0FBWSxLQUFaLEVBQW1CTCxTQUFTRyxNQUE1QjtBQUNBLE9BQUssSUFBSUcsSUFBSSxDQUFiLEVBQWdCQSxJQUFJTixTQUFTRyxNQUE3QixFQUFxQ0csS0FBSyxDQUExQyxFQUE2QztBQUMzQ0YsWUFBUUMsR0FBUixDQUFZQyxDQUFaO0FBQ0EsUUFBTUMsUUFBUSw0QkFDWlAsU0FBU1EsS0FBVCxDQUFlRixDQUFmLEVBQWtCQSxJQUFJLENBQXRCLENBRFksRUFFWkwsUUFBUU8sS0FBUixDQUFjRixDQUFkLEVBQWlCQSxJQUFJLENBQXJCLENBRlksQ0FBZDtBQUlBUCxTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FOMkMsQ0FNbkI7QUFDeEJSLFNBQUtPLElBQUksQ0FBVCxJQUFjQyxNQUFNLENBQU4sQ0FBZCxDQVAyQyxDQU9uQjtBQUN4QlIsU0FBS08sSUFBSSxDQUFULElBQWNDLE1BQU0sQ0FBTixDQUFkLENBUjJDLENBUW5CO0FBQ3hCUixTQUFLTyxJQUFJLENBQVQsSUFBY0MsTUFBTSxDQUFOLENBQWQsQ0FUMkMsQ0FTbkI7QUFDekI7QUFDRFYsT0FBS1ksV0FBTCxDQUFpQlYsSUFBakI7QUFDQUYsT0FBS2EsS0FBTDtBQUNELENBakJEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXMsIGN1cnJlbnQgfSB9KSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocHJldmlvdXMubGVuZ3RoKTtcblxuICBjb25zb2xlLmxvZygnbWF4JywgcHJldmlvdXMubGVuZ3RoKVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzLmxlbmd0aDsgaSArPSA0KSB7XG4gICAgY29uc29sZS5sb2coaSlcbiAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgIHByZXZpb3VzLnNsaWNlKGksIGkgKyA0KSxcbiAgICAgIGN1cnJlbnQuc2xpY2UoaSwgaSArIDQpXG4gICAgKTtcbiAgICBkYXRhW2kgKyAwXSA9IHBpeGVsWzBdOyAvLyByXG4gICAgZGF0YVtpICsgMV0gPSBwaXhlbFsxXTsgLy8gZ1xuICAgIGRhdGFbaSArIDJdID0gcGl4ZWxbMl07IC8vIGJcbiAgICBkYXRhW2kgKyAzXSA9IHBpeGVsWzNdOyAvLyBhXG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0ltYWdlRGlmZldvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
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 _euclideanDistance = __webpack_require__(2);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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);\n if (diff === 0) {\n return [currentPixel[0], currentPixel[1], currentPixel[2], 50];\n }\n\n if (diff < 0.2) {\n diff = 0.2;\n }\n return [255, 0, 0, 255 * diff]; // TODO don't use red here\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwicHJldmlvdXNQaXhlbCIsImN1cnJlbnRQaXhlbCIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUV3QkEsWTs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBSUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyxDQUFYO0FBQ0EsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyxDQUNMRCxhQUFhLENBQWIsQ0FESyxFQUVMQSxhQUFhLENBQWIsQ0FGSyxFQUdMQSxhQUFhLENBQWIsQ0FISyxFQUlMLEVBSkssQ0FBUDtBQU1EOztBQUVELE1BQUlDLE9BQU8sR0FBWCxFQUFnQjtBQUNkQSxXQUFPLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxNQUFNQSxJQUFsQixDQUFQLENBdEJnRSxDQXNCaEM7QUFDakMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIGxldCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFBpeGVsWzBdLFxuICAgICAgY3VycmVudFBpeGVsWzFdLFxuICAgICAgY3VycmVudFBpeGVsWzJdLFxuICAgICAgNTAsXG4gICAgXTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMC4yKSB7XG4gICAgZGlmZiA9IDAuMjtcbiAgfVxuICByZXR1cm4gWzI1NSwgMCwgMCwgMjU1ICogZGlmZl07IC8vIFRPRE8gZG9uJ3QgdXNlIHJlZCBoZXJlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9nZXREaWZmUGl4ZWwuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ 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 *\n * Returns a float number between 0 and 1 where 1 is completely different\n * and 0 is no difference\n */\nfunction euclideanDistance(rgba1, rgba2) {\n var distance = (rgba1[0] - rgba2[0]) * (rgba1[0] - rgba2[0]) + (rgba1[1] - rgba2[1]) * (rgba1[1] - rgba2[1]) + (rgba1[2] - rgba2[2]) * (rgba1[2] - rgba2[2]) + (rgba1[3] - rgba2[3]) * (rgba1[3] - rgba2[3]);\n\n return Math.sqrt(distance) / 4 / 255;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJkaXN0YW5jZSIsIk1hdGgiLCJzcXJ0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFld0JBLGlCO0FBZnhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlZSxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELE1BQU1DLFdBQVksQ0FBQ0YsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBQUQsR0FDQyxDQUFDRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQVosS0FBeUJELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEMsQ0FERCxHQUVDLENBQUNELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBWixLQUF5QkQsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQyxDQUZELEdBR0MsQ0FBQ0QsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBSGxCOztBQUtBLFNBQVFFLEtBQUtDLElBQUwsQ0FBVUYsUUFBVixJQUFzQixDQUF2QixHQUE0QixHQUFuQztBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICpcbiAqIFRoaXMgbWV0aG9kIHNpbXBseSB0YWtlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIFJHQkEgY2hhbm5lbHNcbiAqIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAqIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gKlxuICogQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gKiBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gKiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMgbmljZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZyBSR0JBXG4gKiB0byBMYWIuXG4gKlxuICogUmV0dXJucyBhIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgd2hlcmUgMSBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICogYW5kIDAgaXMgbm8gZGlmZmVyZW5jZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgY29uc3QgZGlzdGFuY2UgPSAoKHJnYmExWzBdIC0gcmdiYTJbMF0pICogKHJnYmExWzBdIC0gcmdiYTJbMF0pKVxuICAgICAgICAgICAgICAgICArICgocmdiYTFbMV0gLSByZ2JhMlsxXSkgKiAocmdiYTFbMV0gLSByZ2JhMlsxXSkpXG4gICAgICAgICAgICAgICAgICsgKChyZ2JhMVsyXSAtIHJnYmEyWzJdKSAqIChyZ2JhMVsyXSAtIHJnYmEyWzJdKSlcbiAgICAgICAgICAgICAgICAgKyAoKHJnYmExWzNdIC0gcmdiYTJbM10pICogKHJnYmExWzNdIC0gcmdiYTJbM10pKTtcblxuICByZXR1cm4gKE1hdGguc3FydChkaXN0YW5jZSkgLyA0KSAvIDI1NTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2V1Y2xpZGVhbkRpc3RhbmNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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 previousData = _ref$data.previousData;\n var currentData = _ref$data.currentData;\n\n var data = new Uint8ClampedArray(previousData.height * previousData.width * 4);\n\n for (var y = 0; y < previousData.height; y++) {\n for (var x = 0; x < previousData.width; x++) {\n var index = y * previousData.width * 4 + x * 4;\n console.log(index);\n\n var pixel = (0, _getDiffPixel2.default)(previousData.data.slice(index, 4), currentData.data.slice(index, 4));\n data[index + 0] = pixel[0]; // r\n data[index + 1] = pixel[1]; // g\n data[index + 2] = pixel[2]; // b\n data[index + 3] = pixel[3]; // a\n }\n }\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0RhdGEiLCJjdXJyZW50RGF0YSIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiaGVpZ2h0Iiwid2lkdGgiLCJ5IiwieCIsImluZGV4IiwiY29uc29sZSIsImxvZyIsInBpeGVsIiwic2xpY2UiLCJwb3N0TWVzc2FnZSIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQUEsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsZ0JBQTZDO0FBQUEsdUJBQTFDQyxJQUEwQztBQUFBLE1BQWxDQyxZQUFrQyxhQUFsQ0EsWUFBa0M7QUFBQSxNQUFwQkMsV0FBb0IsYUFBcEJBLFdBQW9COztBQUM1RSxNQUFNRixPQUFPLElBQUlHLGlCQUFKLENBQ1hGLGFBQWFHLE1BQWIsR0FBc0JILGFBQWFJLEtBQW5DLEdBQTJDLENBRGhDLENBQWI7O0FBR0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlMLGFBQWFHLE1BQWpDLEVBQXlDRSxHQUF6QyxFQUE4QztBQUM1QyxTQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSU4sYUFBYUksS0FBakMsRUFBd0NFLEdBQXhDLEVBQTZDO0FBQzNDLFVBQU1DLFFBQVNGLElBQUlMLGFBQWFJLEtBQWpCLEdBQXlCLENBQTFCLEdBQWdDRSxJQUFJLENBQWxEO0FBQ0FFLGNBQVFDLEdBQVIsQ0FBWUYsS0FBWjs7QUFFQSxVQUFNRyxRQUFRLDRCQUNaVixhQUFhRCxJQUFiLENBQWtCWSxLQUFsQixDQUF3QkosS0FBeEIsRUFBK0IsQ0FBL0IsQ0FEWSxFQUVaTixZQUFZRixJQUFaLENBQWlCWSxLQUFqQixDQUF1QkosS0FBdkIsRUFBOEIsQ0FBOUIsQ0FGWSxDQUFkO0FBSUFSLFdBQUtRLFFBQVEsQ0FBYixJQUFrQkcsTUFBTSxDQUFOLENBQWxCLENBUjJDLENBUWY7QUFDNUJYLFdBQUtRLFFBQVEsQ0FBYixJQUFrQkcsTUFBTSxDQUFOLENBQWxCLENBVDJDLENBU2Y7QUFDNUJYLFdBQUtRLFFBQVEsQ0FBYixJQUFrQkcsTUFBTSxDQUFOLENBQWxCLENBVjJDLENBVWY7QUFDNUJYLFdBQUtRLFFBQVEsQ0FBYixJQUFrQkcsTUFBTSxDQUFOLENBQWxCLENBWDJDLENBV2Y7QUFDN0I7QUFDRjtBQUNEYixPQUFLZSxXQUFMLENBQWlCYixJQUFqQjtBQUNBRixPQUFLZ0IsS0FBTDtBQUNELENBckJEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ2V0RGlmZlBpeGVsIGZyb20gJy4uL2dldERpZmZQaXhlbCc7XG5cbnNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsICh7IGRhdGE6IHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9IH0pID0+IHtcbiAgY29uc3QgZGF0YSA9IG5ldyBVaW50OENsYW1wZWRBcnJheShcbiAgICBwcmV2aW91c0RhdGEuaGVpZ2h0ICogcHJldmlvdXNEYXRhLndpZHRoICogNCk7XG5cbiAgZm9yIChsZXQgeSA9IDA7IHkgPCBwcmV2aW91c0RhdGEuaGVpZ2h0OyB5KyspIHtcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IHByZXZpb3VzRGF0YS53aWR0aDsgeCsrKSB7XG4gICAgICBjb25zdCBpbmRleCA9ICh5ICogcHJldmlvdXNEYXRhLndpZHRoICogNCkgKyAoeCAqIDQpO1xuICAgICAgY29uc29sZS5sb2coaW5kZXgpXG5cbiAgICAgIGNvbnN0IHBpeGVsID0gZ2V0RGlmZlBpeGVsKFxuICAgICAgICBwcmV2aW91c0RhdGEuZGF0YS5zbGljZShpbmRleCwgNCksXG4gICAgICAgIGN1cnJlbnREYXRhLmRhdGEuc2xpY2UoaW5kZXgsIDQpXG4gICAgICApO1xuICAgICAgZGF0YVtpbmRleCArIDBdID0gcGl4ZWxbMF07IC8vIHJcbiAgICAgIGRhdGFbaW5kZXggKyAxXSA9IHBpeGVsWzFdOyAvLyBnXG4gICAgICBkYXRhW2luZGV4ICsgMl0gPSBwaXhlbFsyXTsgLy8gYlxuICAgICAgZGF0YVtpbmRleCArIDNdID0gcGl4ZWxbM107IC8vIGFcbiAgICB9XG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZShkYXRhKTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0ltYWdlRGlmZldvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
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 _euclideanDistance = __webpack_require__(2);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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);\n if (diff === 0) {\n return [currentPixel[0], currentPixel[1], currentPixel[2], 50];\n }\n\n if (diff < 0.2) {\n diff = 0.2;\n }\n return [255, 0, 0, 255 * diff]; // TODO don't use red here\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwicHJldmlvdXNQaXhlbCIsImN1cnJlbnRQaXhlbCIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUV3QkEsWTs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBSUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyxDQUFYO0FBQ0EsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyxDQUNMRCxhQUFhLENBQWIsQ0FESyxFQUVMQSxhQUFhLENBQWIsQ0FGSyxFQUdMQSxhQUFhLENBQWIsQ0FISyxFQUlMLEVBSkssQ0FBUDtBQU1EOztBQUVELE1BQUlDLE9BQU8sR0FBWCxFQUFnQjtBQUNkQSxXQUFPLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxNQUFNQSxJQUFsQixDQUFQLENBdEJnRSxDQXNCaEM7QUFDakMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIGxldCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFBpeGVsWzBdLFxuICAgICAgY3VycmVudFBpeGVsWzFdLFxuICAgICAgY3VycmVudFBpeGVsWzJdLFxuICAgICAgNTAsXG4gICAgXTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMC4yKSB7XG4gICAgZGlmZiA9IDAuMjtcbiAgfVxuICByZXR1cm4gWzI1NSwgMCwgMCwgMjU1ICogZGlmZl07IC8vIFRPRE8gZG9uJ3QgdXNlIHJlZCBoZXJlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9nZXREaWZmUGl4ZWwuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ 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 *\n * Returns a float number between 0 and 1 where 1 is completely different\n * and 0 is no difference\n */\nfunction euclideanDistance(rgba1, rgba2) {\n var distance = (rgba1[0] - rgba2[0]) * (rgba1[0] - rgba2[0]) + (rgba1[1] - rgba2[1]) * (rgba1[1] - rgba2[1]) + (rgba1[2] - rgba2[2]) * (rgba1[2] - rgba2[2]) + (rgba1[3] - rgba2[3]) * (rgba1[3] - rgba2[3]);\n\n return Math.sqrt(distance) / 4 / 255;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJkaXN0YW5jZSIsIk1hdGgiLCJzcXJ0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFld0JBLGlCO0FBZnhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlZSxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELE1BQU1DLFdBQVksQ0FBQ0YsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBQUQsR0FDQyxDQUFDRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQVosS0FBeUJELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEMsQ0FERCxHQUVDLENBQUNELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBWixLQUF5QkQsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQyxDQUZELEdBR0MsQ0FBQ0QsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBSGxCOztBQUtBLFNBQVFFLEtBQUtDLElBQUwsQ0FBVUYsUUFBVixJQUFzQixDQUF2QixHQUE0QixHQUFuQztBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICpcbiAqIFRoaXMgbWV0aG9kIHNpbXBseSB0YWtlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIFJHQkEgY2hhbm5lbHNcbiAqIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAqIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gKlxuICogQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gKiBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gKiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMgbmljZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZyBSR0JBXG4gKiB0byBMYWIuXG4gKlxuICogUmV0dXJucyBhIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgd2hlcmUgMSBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICogYW5kIDAgaXMgbm8gZGlmZmVyZW5jZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgY29uc3QgZGlzdGFuY2UgPSAoKHJnYmExWzBdIC0gcmdiYTJbMF0pICogKHJnYmExWzBdIC0gcmdiYTJbMF0pKVxuICAgICAgICAgICAgICAgICArICgocmdiYTFbMV0gLSByZ2JhMlsxXSkgKiAocmdiYTFbMV0gLSByZ2JhMlsxXSkpXG4gICAgICAgICAgICAgICAgICsgKChyZ2JhMVsyXSAtIHJnYmEyWzJdKSAqIChyZ2JhMVsyXSAtIHJnYmEyWzJdKSlcbiAgICAgICAgICAgICAgICAgKyAoKHJnYmExWzNdIC0gcmdiYTJbM10pICogKHJnYmExWzNdIC0gcmdiYTJbM10pKTtcblxuICByZXR1cm4gKE1hdGguc3FydChkaXN0YW5jZSkgLyA0KSAvIDI1NTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2V1Y2xpZGVhbkRpc3RhbmNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.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 = _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\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 (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJsZW5ndGgiLCJzcGxpY2UiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0QsU0FBT0UsSUFBUDtBQUNEOztBQUVELFNBQVNHLGNBQVQsT0FBaURDLFlBQWpELEVBQStEO0FBQUEsTUFBckNDLElBQXFDLFFBQXJDQSxJ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QixDQUFmO0FBQ0FvQixPQUFLRyxXQUFMLENBQWlCRCxNQUFqQjtBQUNBRixPQUFLSSxLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBhZGlmZi5kaWZmKFxuICAgIHByZXZpb3VzSW1hZ2VEYXRhLm1hcChkID0+IGJ0b2EoZCkpLFxuICAgIGN1cnJlbnRJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSlcbiAgKTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+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\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\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var start = performance.now();\n var result = new Uint8ClampedArray(imageData.length * imageData[0].length * 4);\n imageData.forEach(function (row) {\n row.forEach(function (pixel) {\n result.push.apply(result, _toConsumableArray(pixel));\n });\n });\n var arr = Uint8ClampedArray.from(result);\n console.log(performance.now() - start);\n return arr;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJzdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwicmVzdWx0IiwiVWludDhDbGFtcGVkQXJyYXkiLCJsZW5ndGgiLCJmb3JFYWNoIiwicm93IiwicGl4ZWwiLCJwdXNoIiwiYXJyIiwiZnJvbSIsImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUl3QkEsZ0I7Ozs7QUFKeEI7Ozs7QUFJZSxTQUFTQSxnQkFBVCxDQUEwQkMsU0FBMUIsRUFBcUM7QUFDbEQsTUFBTUMsUUFBUUMsWUFBWUMsR0FBWixFQUFkO0FBQ0EsTUFBTUMsU0FBUyxJQUFJQyxpQkFBSixDQUFzQkwsVUFBVU0sTUFBVixHQUFtQk4sVUFBVSxDQUFWLEVBQWFNLE1BQWhDLEdBQXlDLENBQS9ELENBQWY7QUFDQU4sWUFBVU8sT0FBVixDQUFrQixVQUFDQyxHQUFELEVBQVM7QUFDekJBLFFBQUlELE9BQUosQ0FBWSxVQUFDRSxLQUFELEVBQVc7QUFDckJMLGFBQU9NLElBQVAsa0NBQWVELEtBQWY7QUFDRCxLQUZEO0FBR0QsR0FKRDtBQUtBLE1BQU1FLE1BQU1OLGtCQUFrQk8sSUFBbEIsQ0FBdUJSLE1BQXZCLENBQVo7QUFDQVMsVUFBUUMsR0FBUixDQUFZWixZQUFZQyxHQUFaLEtBQW9CRixLQUFoQztBQUNBLFNBQU9VLEdBQVA7QUFDRCIsImZpbGUiOiIyLmpzIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcGFyYW0ge0FycmF5fSBpbWFnZURhdGEgYSAyZCBhcnJheVxuICogQHJldHVybiB7VWludDhDbGFtcGVkQXJyYXl9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGZsYXR0ZW5JbWFnZURhdGEoaW1hZ2VEYXRhKSB7XG4gIGNvbnN0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBVaW50OENsYW1wZWRBcnJheShpbWFnZURhdGEubGVuZ3RoICogaW1hZ2VEYXRhWzBdLmxlbmd0aCAqIDQpO1xuICBpbWFnZURhdGEuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgcm93LmZvckVhY2goKHBpeGVsKSA9PiB7XG4gICAgICByZXN1bHQucHVzaCguLi5waXhlbCk7XG4gICAgfSk7XG4gIH0pO1xuICBjb25zdCBhcnIgPSBVaW50OENsYW1wZWRBcnJheS5mcm9tKHJlc3VsdCk7XG4gIGNvbnNvbGUubG9nKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpO1xuICByZXR1cm4gYXJyO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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\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(_ref2) {\n var previousData = _ref2.previousData;\n var currentData = _ref2.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 = _adiff2.default.diff(previousImageData.map(function (d) {\n return btoa(d);\n }), currentImageData.map(function (d) {\n return btoa(d);\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 (_ref3) {\n var _ref3$data = _ref3.data;\n var previousData = _ref3$data.previousData;\n var currentData = _ref3$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/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJyZWRMaW5lIiwiZ3JlZW5MaW5lIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJsZW5ndGgiLCJzcGxpY2UiLCJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsInBvc3RNZXNzYWdlIiwiY2xvc2UiXSwibWFwcGluZ3MiOiI7O0FBQUE7Ozs7QUFFQTs7Ozs7O0FBRUE7Ozs7Ozs7QUFPQSxTQUFTQSxvQkFBVCxDQUE4QkMsSUFBOUIsRUFBb0NDLEtBQXBDLEVBQTJDO0FBQ3pDLE1BQU1DLE9BQU8sRUFBYjtBQUNBLE9BQUssSUFBSUMsSUFBSSxDQUFiLEVBQWdCQSxJQUFJRixLQUFwQixFQUEyQkUsR0FBM0IsRUFBZ0M7QUFDOUJELFNBQUtFLElBQUwsQ0FBVUosSUFBVjtBQUNEO0FBQ0QsU0FBT0UsSUFBUDtBQUNEOztBQUVELFNBQVNHLGNBQVQsT0FBaURDLFlBQWpELEVBQStEO0FBQUEsTUFBckNDLElBQXFDLFFBQXJDQSxJ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QixDQUFmO0FBQ0FvQixPQUFLRyxXQUFMLENBQWlCRCxNQUFqQjtBQUNBRixPQUFLSSxLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuaW1wb3J0IGZsYXR0ZW5JbWFnZURhdGEgZnJvbSAnLi4vZmxhdHRlbkltYWdlRGF0YSc7XG5cbi8qKlxuICogQ29uc3RydWN0IGEgbGluZSBvZiBwaXhlbHMgb2YgYSBjZXJ0YWluIHJnYmEgY29sb3JcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSByZ2JhXG4gKiBAcGFyYW0ge051bWJlcn0gd2lkdGhcbiAqIEByZXR1cm4ge0FycmF5fVxuICovXG5mdW5jdGlvbiBjb25zdHJ1Y3RDb2xvcmVkTGluZShyZ2JhLCB3aWR0aCkge1xuICBjb25zdCBsaW5lID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkrKykge1xuICAgIGxpbmUucHVzaChyZ2JhKTtcbiAgfVxuICByZXR1cm4gbGluZTtcbn1cblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG4gIGNvbnN0IGdldFBpeGVsQXQgPSAoeCwgeSkgPT4ge1xuICAgIGNvbnN0IHN0YXJ0SW5kZXggPSAoeSAqIHJvd1NpemUpICsgKHggKiA0KTtcbiAgICByZXR1cm4gW1xuICAgICAgZGF0YVtzdGFydEluZGV4XSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDFdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgMl0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAzXSxcbiAgICBdO1xuICB9O1xuXG4gIGNvbnN0IG5ld0RhdGEgPSBbXTtcbiAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaGVpZ2h0OyByb3crKykge1xuICAgIGNvbnN0IHBpeGVsc0luUm93ID0gW107XG4gICAgZm9yIChsZXQgY29sID0gMDsgY29sIDwgd2lkdGg7IGNvbCsrKSB7XG4gICAgICBwaXhlbHNJblJvdy5wdXNoKGdldFBpeGVsQXQoY29sLCByb3cpKTtcbiAgICB9XG4gICAgZm9yIChsZXQgcGFkID0gMDsgcGFkIDwgcGFkZGluZ1JpZ2h0OyBwYWQrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChbMCwgMCwgMCwgMF0pO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgcmVkTGluZSA9IGNvbnN0cnVjdENvbG9yZWRMaW5lKFsyNTUsIDAsIDAsIDI1NV0sIG1heFdpZHRoKTtcbiAgY29uc3QgZ3JlZW5MaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzAsIDI1NSwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuXG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBhZGlmZi5kaWZmKFxuICAgIHByZXZpb3VzSW1hZ2VEYXRhLm1hcChkID0+IGJ0b2EoZCkpLFxuICAgIGN1cnJlbnRJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSlcbiAgKTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYWRkIGEgZ3JlZW4gbGluZSB0byBzaWduYWwgYW4gYWRkaXRpb25cbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCBncmVlbkxpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+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\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\n/**\n * @param {Array} imageData a 2d array\n * @return {Uint8ClampedArray}\n */\nfunction flattenImageData(imageData) {\n var start = performance.now();\n var result = [];\n imageData.forEach(function (row) {\n row.forEach(function (pixel) {\n result.push.apply(result, _toConsumableArray(pixel));\n });\n });\n var arr = Uint8ClampedArray.from(result);\n console.log(performance.now() - start);\n return arr;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZmxhdHRlbkltYWdlRGF0YS5qcz8yZGRiIl0sIm5hbWVzIjpbImZsYXR0ZW5JbWFnZURhdGEiLCJpbWFnZURhdGEiLCJzdGFydCIsInBlcmZvcm1hbmNlIiwibm93IiwicmVzdWx0IiwiZm9yRWFjaCIsInJvdyIsInBpeGVsIiwicHVzaCIsImFyciIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZnJvbSIsImNvbnNvbGUiLCJsb2ciXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUl3QkEsZ0I7Ozs7QUFKeEI7Ozs7QUFJZSxTQUFTQSxnQkFBVCxDQUEwQkMsU0FBMUIsRUFBcUM7QUFDbEQsTUFBTUMsUUFBUUMsWUFBWUMsR0FBWixFQUFkO0FBQ0EsTUFBTUMsU0FBUyxFQUFmO0FBQ0FKLFlBQVVLLE9BQVYsQ0FBa0IsVUFBQ0MsR0FBRCxFQUFTO0FBQ3pCQSxRQUFJRCxPQUFKLENBQVksVUFBQ0UsS0FBRCxFQUFXO0FBQ3JCSCxhQUFPSSxJQUFQLGtDQUFlRCxLQUFmO0FBQ0QsS0FGRDtBQUdELEdBSkQ7QUFLQSxNQUFNRSxNQUFNQyxrQkFBa0JDLElBQWxCLENBQXVCUCxNQUF2QixDQUFaO0FBQ0FRLFVBQVFDLEdBQVIsQ0FBWVgsWUFBWUMsR0FBWixLQUFvQkYsS0FBaEM7QUFDQSxTQUFPUSxHQUFQO0FBQ0QiLCJmaWxlIjoiMi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHBhcmFtIHtBcnJheX0gaW1hZ2VEYXRhIGEgMmQgYXJyYXlcbiAqIEByZXR1cm4ge1VpbnQ4Q2xhbXBlZEFycmF5fVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBmbGF0dGVuSW1hZ2VEYXRhKGltYWdlRGF0YSkge1xuICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgaW1hZ2VEYXRhLmZvckVhY2goKHJvdykgPT4ge1xuICAgIHJvdy5mb3JFYWNoKChwaXhlbCkgPT4ge1xuICAgICAgcmVzdWx0LnB1c2goLi4ucGl4ZWwpO1xuICAgIH0pO1xuICB9KTtcbiAgY29uc3QgYXJyID0gVWludDhDbGFtcGVkQXJyYXkuZnJvbShyZXN1bHQpO1xuICBjb25zb2xlLmxvZyhwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcbiAgcmV0dXJuIGFycjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2ZsYXR0ZW5JbWFnZURhdGEuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
60
+
61
+ /***/ }
62
+ /******/ ]);
@@ -0,0 +1,62 @@
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 previousData = _ref$data.previousData;\n var currentData = _ref$data.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n var data = new Uint8ClampedArray(previousData.height * maxWidth * 4);\n\n for (var _y = 0; _y < previousData.height; _y++) {\n for (var x = 0; x < previousData.width; x++) {}\n }\n previousData.data.forEach(function (value) {\n for (var _x = 0; _x < maxWidth; _x++) {\n var pixel = (0, _getDiffPixel2.default)(row[_x], currentData[y][_x]);\n\n var index = y * maxWidth * 4 + _x * 4;\n\n data[index + 0] = pixel[0]; // r\n data[index + 1] = pixel[1]; // g\n data[index + 2] = pixel[2]; // b\n data[index + 3] = pixel[3]; // a\n }\n });\n self.postMessage(data);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanM/ZjExYiJdLCJuYW1lcyI6WyJzZWxmIiwiYWRkRXZlbnRMaXN0ZW5lciIsImRhdGEiLCJwcmV2aW91c0RhdGEiLCJjdXJyZW50RGF0YSIsIm1heFdpZHRoIiwiTWF0aCIsIm1heCIsIndpZHRoIiwiVWludDhDbGFtcGVkQXJyYXkiLCJoZWlnaHQiLCJ5IiwieCIsImZvckVhY2giLCJ2YWx1ZSIsInBpeGVsIiwicm93IiwiaW5kZXgiLCJwb3N0TWVzc2FnZSIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQUEsS0FBS0MsZ0JBQUwsQ0FBc0IsU0FBdEIsRUFBaUMsZ0JBQTZDO0FBQUEsdUJBQTFDQyxJQUEwQztBQUFBLE1BQWxDQyxZQUFrQyxhQUFsQ0EsWUFBa0M7QUFBQSxNQUFwQkMsV0FBb0IsYUFBcEJBLFdBQW9COztBQUM1RSxNQUFNQyxXQUFXQyxLQUFLQyxHQUFMLENBQVNKLGFBQWFLLEtBQXRCLEVBQTZCSixZQUFZSSxLQUF6QyxDQUFqQjtBQUNBLE1BQU1OLE9BQU8sSUFBSU8saUJBQUosQ0FBc0JOLGFBQWFPLE1BQWIsR0FBc0JMLFFBQXRCLEdBQWlDLENBQXZELENBQWI7O0FBRUEsT0FBSyxJQUFJTSxLQUFJLENBQWIsRUFBZ0JBLEtBQUlSLGFBQWFPLE1BQWpDLEVBQXlDQyxJQUF6QyxFQUE4QztBQUM1QyxTQUFLLElBQUlDLElBQUksQ0FBYixFQUFnQkEsSUFBSVQsYUFBYUssS0FBakMsRUFBd0NJLEdBQXhDLEVBQTZDLENBRTVDO0FBQ0Y7QUFDRFQsZUFBYUQsSUFBYixDQUFrQlcsT0FBbEIsQ0FBMEIsVUFBQ0MsS0FBRCxFQUFXO0FBQ25DLFNBQUssSUFBSUYsS0FBSSxDQUFiLEVBQWdCQSxLQUFJUCxRQUFwQixFQUE4Qk8sSUFBOUIsRUFBbUM7QUFDakMsVUFBTUcsUUFBUSw0QkFDWkMsSUFBSUosRUFBSixDQURZLEVBRVpSLFlBQVlPLENBQVosRUFBZUMsRUFBZixDQUZZLENBQWQ7O0FBS0EsVUFBTUssUUFBU04sSUFBSU4sUUFBSixHQUFlLENBQWhCLEdBQXNCTyxLQUFJLENBQXhDOztBQUVBVixXQUFLZSxRQUFRLENBQWIsSUFBa0JGLE1BQU0sQ0FBTixDQUFsQixDQVJpQyxDQVFMO0FBQzVCYixXQUFLZSxRQUFRLENBQWIsSUFBa0JGLE1BQU0sQ0FBTixDQUFsQixDQVRpQyxDQVNMO0FBQzVCYixXQUFLZSxRQUFRLENBQWIsSUFBa0JGLE1BQU0sQ0FBTixDQUFsQixDQVZpQyxDQVVMO0FBQzVCYixXQUFLZSxRQUFRLENBQWIsSUFBa0JGLE1BQU0sQ0FBTixDQUFsQixDQVhpQyxDQVdMO0FBQzdCO0FBQ0YsR0FkRDtBQWVBZixPQUFLa0IsV0FBTCxDQUFpQmhCLElBQWpCO0FBQ0FGLE9BQUttQixLQUFMO0FBQ0QsQ0ExQkQiLCJmaWxlIjoiMC5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBnZXREaWZmUGl4ZWwgZnJvbSAnLi4vZ2V0RGlmZlBpeGVsJztcblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCBtYXhXaWR0aCA9IE1hdGgubWF4KHByZXZpb3VzRGF0YS53aWR0aCwgY3VycmVudERhdGEud2lkdGgpO1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHByZXZpb3VzRGF0YS5oZWlnaHQgKiBtYXhXaWR0aCAqIDQpO1xuXG4gIGZvciAobGV0IHkgPSAwOyB5IDwgcHJldmlvdXNEYXRhLmhlaWdodDsgeSsrKSB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBwcmV2aW91c0RhdGEud2lkdGg7IHgrKykge1xuXG4gICAgfVxuICB9XG4gIHByZXZpb3VzRGF0YS5kYXRhLmZvckVhY2goKHZhbHVlKSA9PiB7XG4gICAgZm9yIChsZXQgeCA9IDA7IHggPCBtYXhXaWR0aDsgeCsrKSB7XG4gICAgICBjb25zdCBwaXhlbCA9IGdldERpZmZQaXhlbChcbiAgICAgICAgcm93W3hdLFxuICAgICAgICBjdXJyZW50RGF0YVt5XVt4XVxuICAgICAgKTtcblxuICAgICAgY29uc3QgaW5kZXggPSAoeSAqIG1heFdpZHRoICogNCkgKyAoeCAqIDQpO1xuXG4gICAgICBkYXRhW2luZGV4ICsgMF0gPSBwaXhlbFswXTsgLy8gclxuICAgICAgZGF0YVtpbmRleCArIDFdID0gcGl4ZWxbMV07IC8vIGdcbiAgICAgIGRhdGFbaW5kZXggKyAyXSA9IHBpeGVsWzJdOyAvLyBiXG4gICAgICBkYXRhW2luZGV4ICsgM10gPSBwaXhlbFszXTsgLy8gYVxuICAgIH1cbiAgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoZGF0YSk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9JbWFnZURpZmZXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
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 _euclideanDistance = __webpack_require__(2);\n\nvar _euclideanDistance2 = _interopRequireDefault(_euclideanDistance);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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);\n if (diff === 0) {\n return [currentPixel[0], currentPixel[1], currentPixel[2], 50];\n }\n\n if (diff < 0.2) {\n diff = 0.2;\n }\n return [255, 0, 0, 255 * diff]; // TODO don't use red here\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZ2V0RGlmZlBpeGVsLmpzPzRiNjgiXSwibmFtZXMiOlsiZ2V0RGlmZlBpeGVsIiwicHJldmlvdXNQaXhlbCIsImN1cnJlbnRQaXhlbCIsImRpZmYiXSwibWFwcGluZ3MiOiI7Ozs7O2tCQUV3QkEsWTs7QUFGeEI7Ozs7OztBQUVlLFNBQVNBLFlBQVQsQ0FBc0JDLGFBQXRCLEVBQXFDQyxZQUFyQyxFQUFtRDtBQUNoRSxNQUFJLENBQUNELGFBQUwsRUFBb0I7QUFDbEIsV0FBT0MsWUFBUDtBQUNEOztBQUVELE1BQUksQ0FBQ0EsWUFBTCxFQUFtQjtBQUNqQixXQUFPRCxhQUFQO0FBQ0Q7O0FBRUQsTUFBSUUsT0FBTyxpQ0FBa0JGLGFBQWxCLEVBQWlDQyxZQUFqQyxDQUFYO0FBQ0EsTUFBSUMsU0FBUyxDQUFiLEVBQWdCO0FBQ2QsV0FBTyxDQUNMRCxhQUFhLENBQWIsQ0FESyxFQUVMQSxhQUFhLENBQWIsQ0FGSyxFQUdMQSxhQUFhLENBQWIsQ0FISyxFQUlMLEVBSkssQ0FBUDtBQU1EOztBQUVELE1BQUlDLE9BQU8sR0FBWCxFQUFnQjtBQUNkQSxXQUFPLEdBQVA7QUFDRDtBQUNELFNBQU8sQ0FBQyxHQUFELEVBQU0sQ0FBTixFQUFTLENBQVQsRUFBWSxNQUFNQSxJQUFsQixDQUFQLENBdEJnRSxDQXNCaEM7QUFDakMiLCJmaWxlIjoiMS5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBldWNsaWRlYW5EaXN0YW5jZSBmcm9tICcuL2V1Y2xpZGVhbkRpc3RhbmNlJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gZ2V0RGlmZlBpeGVsKHByZXZpb3VzUGl4ZWwsIGN1cnJlbnRQaXhlbCkge1xuICBpZiAoIXByZXZpb3VzUGl4ZWwpIHtcbiAgICByZXR1cm4gY3VycmVudFBpeGVsO1xuICB9XG5cbiAgaWYgKCFjdXJyZW50UGl4ZWwpIHtcbiAgICByZXR1cm4gcHJldmlvdXNQaXhlbDtcbiAgfVxuXG4gIGxldCBkaWZmID0gZXVjbGlkZWFuRGlzdGFuY2UocHJldmlvdXNQaXhlbCwgY3VycmVudFBpeGVsKTtcbiAgaWYgKGRpZmYgPT09IDApIHtcbiAgICByZXR1cm4gW1xuICAgICAgY3VycmVudFBpeGVsWzBdLFxuICAgICAgY3VycmVudFBpeGVsWzFdLFxuICAgICAgY3VycmVudFBpeGVsWzJdLFxuICAgICAgNTAsXG4gICAgXTtcbiAgfVxuXG4gIGlmIChkaWZmIDwgMC4yKSB7XG4gICAgZGlmZiA9IDAuMjtcbiAgfVxuICByZXR1cm4gWzI1NSwgMCwgMCwgMjU1ICogZGlmZl07IC8vIFRPRE8gZG9uJ3QgdXNlIHJlZCBoZXJlXG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy9nZXREaWZmUGl4ZWwuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
54
+
55
+ /***/ },
56
+ /* 2 */
57
+ /***/ function(module, exports) {
58
+
59
+ 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 *\n * Returns a float number between 0 and 1 where 1 is completely different\n * and 0 is no difference\n */\nfunction euclideanDistance(rgba1, rgba2) {\n var distance = (rgba1[0] - rgba2[0]) * (rgba1[0] - rgba2[0]) + (rgba1[1] - rgba2[1]) * (rgba1[1] - rgba2[1]) + (rgba1[2] - rgba2[2]) * (rgba1[2] - rgba2[2]) + (rgba1[3] - rgba2[3]) * (rgba1[3] - rgba2[3]);\n\n return Math.sqrt(distance) / 4 / 255;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvZXVjbGlkZWFuRGlzdGFuY2UuanM/ZDgzYiJdLCJuYW1lcyI6WyJldWNsaWRlYW5EaXN0YW5jZSIsInJnYmExIiwicmdiYTIiLCJkaXN0YW5jZSIsIk1hdGgiLCJzcXJ0Il0sIm1hcHBpbmdzIjoiOzs7OztrQkFld0JBLGlCO0FBZnhCOzs7Ozs7Ozs7Ozs7Ozs7QUFlZSxTQUFTQSxpQkFBVCxDQUEyQkMsS0FBM0IsRUFBa0NDLEtBQWxDLEVBQXlDO0FBQ3RELE1BQU1DLFdBQVksQ0FBQ0YsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBQUQsR0FDQyxDQUFDRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQVosS0FBeUJELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBcEMsQ0FERCxHQUVDLENBQUNELE1BQU0sQ0FBTixJQUFXQyxNQUFNLENBQU4sQ0FBWixLQUF5QkQsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFwQyxDQUZELEdBR0MsQ0FBQ0QsTUFBTSxDQUFOLElBQVdDLE1BQU0sQ0FBTixDQUFaLEtBQXlCRCxNQUFNLENBQU4sSUFBV0MsTUFBTSxDQUFOLENBQXBDLENBSGxCOztBQUtBLFNBQVFFLEtBQUtDLElBQUwsQ0FBVUYsUUFBVixJQUFzQixDQUF2QixHQUE0QixHQUFuQztBQUNEIiwiZmlsZSI6IjIuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIENvbXB1dGUgYSBzY29yZSB0aGF0IHJlcHJlc2VudHMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAyIHBpeGVsc1xuICpcbiAqIFRoaXMgbWV0aG9kIHNpbXBseSB0YWtlcyB0aGUgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdGhlIFJHQkEgY2hhbm5lbHNcbiAqIG9mIDIgY29sb3JzIG92ZXIgdGhlIG1heGltdW0gcG9zc2libGUgRXVjbGlkZWFuIGRpc3RhbmNlLiBUaGlzIGdpdmVzIHVzIGFcbiAqIHBlcmNlbnRhZ2Ugb2YgaG93IGRpZmZlcmVudCB0aGUgdHdvIGNvbG9ycyBhcmUuXG4gKlxuICogQWx0aG91Z2ggaXQgd291bGQgYmUgbW9yZSBwZXJjZXB0dWFsbHkgYWNjdXJhdGUgdG8gY2FsY3VsYXRlIGEgcHJvcGVyXG4gKiBEZWx0YSBFIGluIExhYiBjb2xvcnNwYWNlLCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIHBlcmNlcHR1YWwgYWNjdXJhY3kgZm9yXG4gKiB0aGlzIGFwcGxpY2F0aW9uLCBhbmQgaXQgaXMgbmljZSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY29udmVydGluZyBSR0JBXG4gKiB0byBMYWIuXG4gKlxuICogUmV0dXJucyBhIGZsb2F0IG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgd2hlcmUgMSBpcyBjb21wbGV0ZWx5IGRpZmZlcmVudFxuICogYW5kIDAgaXMgbm8gZGlmZmVyZW5jZVxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBldWNsaWRlYW5EaXN0YW5jZShyZ2JhMSwgcmdiYTIpIHtcbiAgY29uc3QgZGlzdGFuY2UgPSAoKHJnYmExWzBdIC0gcmdiYTJbMF0pICogKHJnYmExWzBdIC0gcmdiYTJbMF0pKVxuICAgICAgICAgICAgICAgICArICgocmdiYTFbMV0gLSByZ2JhMlsxXSkgKiAocmdiYTFbMV0gLSByZ2JhMlsxXSkpXG4gICAgICAgICAgICAgICAgICsgKChyZ2JhMVsyXSAtIHJnYmEyWzJdKSAqIChyZ2JhMVsyXSAtIHJnYmEyWzJdKSlcbiAgICAgICAgICAgICAgICAgKyAoKHJnYmExWzNdIC0gcmdiYTJbM10pICogKHJnYmExWzNdIC0gcmdiYTJbM10pKTtcblxuICByZXR1cm4gKE1hdGguc3FydChkaXN0YW5jZSkgLyA0KSAvIDI1NTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIC4vanMvc3JjL2V1Y2xpZGVhbkRpc3RhbmNlLmpzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==");
60
+
61
+ /***/ }
62
+ /******/ ]);