happo 2.8.2 → 2.8.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/lib/happo/public/7c91087e37a93a8cfc20.worker.js +1 -0
  3. data/lib/happo/public/HappoApp.bundle.js +1 -1
  4. data/lib/happo/public/a0de80bb919d7982b92a.worker.js +1 -0
  5. data/lib/happo/version.rb +1 -1
  6. metadata +4 -205
  7. data/lib/happo/public/0144a92667ed2e8a8b13.worker.js +0 -56
  8. data/lib/happo/public/026c001beac0620bb23a.worker.js +0 -50
  9. data/lib/happo/public/05ad45a945afc6882286.worker.js +0 -56
  10. data/lib/happo/public/05bf9fb3d7f0192e7194.worker.js +0 -56
  11. data/lib/happo/public/06bf22e3fa348f77a82f.worker.js +0 -56
  12. data/lib/happo/public/08ccdc92f4d8ed3cff76.worker.js +0 -62
  13. data/lib/happo/public/0b94c9757c981bfc9fd7.worker.js +0 -62
  14. data/lib/happo/public/0d036738a62c01299743.worker.js +0 -56
  15. data/lib/happo/public/0dd329b74ed90a207896.worker.js +0 -56
  16. data/lib/happo/public/0e32a5b5219342a9aa1e.worker.js +0 -62
  17. data/lib/happo/public/105bb978b49beac37583.worker.js +0 -62
  18. data/lib/happo/public/1172b74983f510409e2d.worker.js +0 -62
  19. data/lib/happo/public/13d0677d081eefd8c8bb.worker.js +0 -62
  20. data/lib/happo/public/15b1495833b5b13f5f51.worker.js +0 -62
  21. data/lib/happo/public/1635684653e1a1979bea.worker.js +0 -56
  22. data/lib/happo/public/174b944ab9e9053c766d.worker.js +0 -56
  23. data/lib/happo/public/196b75660e2791fda25a.worker.js +0 -56
  24. data/lib/happo/public/1bb6a3a6bba3c02df491.worker.js +0 -62
  25. data/lib/happo/public/1c48c5a95c9c5331c65f.worker.js +0 -56
  26. data/lib/happo/public/1d1049629f51e72af69f.worker.js +0 -62
  27. data/lib/happo/public/1d5c0eb9c479f44f0ec2.worker.js +0 -56
  28. data/lib/happo/public/1d6c41b4828b191ae315.worker.js +0 -56
  29. data/lib/happo/public/1fd046493403de128de1.worker.js +0 -62
  30. data/lib/happo/public/20c34bdb9a226c485df8.worker.js +0 -56
  31. data/lib/happo/public/212269d558f1f8b1bc63.worker.js +0 -56
  32. data/lib/happo/public/220e711d4abdbc4bd32f.worker.js +0 -62
  33. data/lib/happo/public/23686d1b2fc3f4f86d12.worker.js +0 -56
  34. data/lib/happo/public/238307cd4525e692bc79.worker.js +0 -56
  35. data/lib/happo/public/25426637d793045ccb77.worker.js +0 -56
  36. data/lib/happo/public/28537ac53e64479763ba.worker.js +0 -56
  37. data/lib/happo/public/2c643331ceb20b73e255.worker.js +0 -56
  38. data/lib/happo/public/2db6b1d7219028bac961.worker.js +0 -62
  39. data/lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js +0 -62
  40. data/lib/happo/public/30e3af0e8f974da2885c.worker.js +0 -56
  41. data/lib/happo/public/30ee387dd21d6b20a927.worker.js +0 -62
  42. data/lib/happo/public/32fc2a09f98d30cb2a06.worker.js +0 -56
  43. data/lib/happo/public/33c43f9f1296a6c3b236.worker.js +0 -56
  44. data/lib/happo/public/34c08770d9dc4981b2a2.worker.js +0 -62
  45. data/lib/happo/public/35d8e219a4200e27adf9.worker.js +0 -62
  46. data/lib/happo/public/360e0acb872760f43b07.worker.js +0 -68
  47. data/lib/happo/public/385cc56a00d991287244.worker.js +0 -62
  48. data/lib/happo/public/38e90e6329f74e2d681a.worker.js +0 -56
  49. data/lib/happo/public/3a1ce5368a835b999d55.worker.js +0 -62
  50. data/lib/happo/public/3a6592504d8ee1810017.worker.js +0 -56
  51. data/lib/happo/public/3a7567174ad2bd91c107.worker.js +0 -56
  52. data/lib/happo/public/3a8bedd3121a2cdacb6d.worker.js +0 -56
  53. data/lib/happo/public/3b63d7abc667a23e0a2b.worker.js +0 -56
  54. data/lib/happo/public/3bdf5dcbba8864a7dcae.worker.js +0 -62
  55. data/lib/happo/public/3d9ed68ca315896c8ec7.worker.js +0 -56
  56. data/lib/happo/public/3da88471c60703398f95.worker.js +0 -56
  57. data/lib/happo/public/3ee7268990c5d4183ad1.worker.js +0 -62
  58. data/lib/happo/public/40c1aadf458bda245630.worker.js +0 -1
  59. data/lib/happo/public/41749e1ff9db63f87a1e.worker.js +0 -56
  60. data/lib/happo/public/41d90eebc5449581b92a.worker.js +0 -56
  61. data/lib/happo/public/42bc2c20d61979a23a2f.worker.js +0 -56
  62. data/lib/happo/public/447f3bfe79be8a67b9cc.worker.js +0 -56
  63. data/lib/happo/public/4580dd75ba5a064f4366.worker.js +0 -56
  64. data/lib/happo/public/46a8fcf803fae37aa259.worker.js +0 -62
  65. data/lib/happo/public/46ef1d4f416d92b92cab.worker.js +0 -62
  66. data/lib/happo/public/4960a52eba13a73eb069.worker.js +0 -56
  67. data/lib/happo/public/4975b25fe791d85e9827.worker.js +0 -56
  68. data/lib/happo/public/49c762dec74fb3e7c638.worker.js +0 -62
  69. data/lib/happo/public/4b23fa5d7875a8fba618.worker.js +0 -56
  70. data/lib/happo/public/4ecbb720788698ce7a9b.worker.js +0 -56
  71. data/lib/happo/public/4ef2e26b666b08b7411a.worker.js +0 -56
  72. data/lib/happo/public/507ef3ea49332d42f582.worker.js +0 -62
  73. data/lib/happo/public/511d7e03fd683c618a22.worker.js +0 -56
  74. data/lib/happo/public/51ac7ca571ae07cd9d7a.worker.js +0 -56
  75. data/lib/happo/public/527516eb649429b011f7.worker.js +0 -68
  76. data/lib/happo/public/52e42bbfa68714fd1b26.worker.js +0 -62
  77. data/lib/happo/public/531d99f56a3343cee5f8.worker.js +0 -56
  78. data/lib/happo/public/53e6a60c2cf0558157a7.worker.js +0 -56
  79. data/lib/happo/public/53e970da89474270e914.worker.js +0 -56
  80. data/lib/happo/public/54ba8bc7a595358209d2.worker.js +0 -68
  81. data/lib/happo/public/55d488167040d5350534.worker.js +0 -56
  82. data/lib/happo/public/572846c1173405e57d7d.worker.js +0 -62
  83. data/lib/happo/public/578cb8199b43c9f746ec.worker.js +0 -62
  84. data/lib/happo/public/588f7a6b784ef2b87932.worker.js +0 -56
  85. data/lib/happo/public/58ae755db5700fc141d3.worker.js +0 -62
  86. data/lib/happo/public/59d03b8990473ae492e0.worker.js +0 -56
  87. data/lib/happo/public/5aded6f9af816e819a2b.worker.js +0 -56
  88. data/lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js +0 -56
  89. data/lib/happo/public/5cbf9957eb776724a5b6.worker.js +0 -62
  90. data/lib/happo/public/5e6771e4a41f597c26a9.worker.js +0 -56
  91. data/lib/happo/public/612cb8b078897547b091.worker.js +0 -62
  92. data/lib/happo/public/61e924aed1761ec05ca0.worker.js +0 -56
  93. data/lib/happo/public/6368c448d11a203d506b.worker.js +0 -62
  94. data/lib/happo/public/65e7608bb10d0f2250d1.worker.js +0 -56
  95. data/lib/happo/public/69d16a4997e4170af4ee.worker.js +0 -1
  96. data/lib/happo/public/69fdd0bf1915b19115d6.worker.js +0 -62
  97. data/lib/happo/public/6a71a1273a0cf4065e1e.worker.js +0 -56
  98. data/lib/happo/public/727ca4589d56ddcb9c7f.worker.js +0 -56
  99. data/lib/happo/public/74309d94f574207e4e79.worker.js +0 -62
  100. data/lib/happo/public/74882ef02b7b28391aac.worker.js +0 -62
  101. data/lib/happo/public/769883a4d5abfa7384d4.worker.js +0 -56
  102. data/lib/happo/public/785285eac660735ef3e0.worker.js +0 -56
  103. data/lib/happo/public/78fea81d29830297df57.worker.js +0 -56
  104. data/lib/happo/public/7bf45d52cf57b1949851.worker.js +0 -56
  105. data/lib/happo/public/7d4a4086de8530abe101.worker.js +0 -56
  106. data/lib/happo/public/7d7551366f97adda7b5b.worker.js +0 -62
  107. data/lib/happo/public/7e330bc3ee246ab39910.worker.js +0 -56
  108. data/lib/happo/public/7e53176d18c890a5424c.worker.js +0 -56
  109. data/lib/happo/public/818ac008a4a7d62aa55c.worker.js +0 -62
  110. data/lib/happo/public/823340592678aeab5317.worker.js +0 -56
  111. data/lib/happo/public/84f3a66517b77798456d.worker.js +0 -56
  112. data/lib/happo/public/856dbe98c40d8f4bd452.worker.js +0 -56
  113. data/lib/happo/public/8cc13e3a447ea341f962.worker.js +0 -56
  114. data/lib/happo/public/8d0d79f0c81652bfb3f1.worker.js +0 -1
  115. data/lib/happo/public/9037f52c590941a75440.worker.js +0 -62
  116. data/lib/happo/public/90a4b81e4d7c2da63973.worker.js +0 -56
  117. data/lib/happo/public/92dd03e7cbe827a2df45.worker.js +0 -56
  118. data/lib/happo/public/935b279f09cf3c4046ec.worker.js +0 -62
  119. data/lib/happo/public/945f54dcc60d8b7abc9d.worker.js +0 -56
  120. data/lib/happo/public/94976fe48214f2bc68d6.worker.js +0 -56
  121. data/lib/happo/public/94ff43f0e47ff2759712.worker.js +0 -62
  122. data/lib/happo/public/95a6641585f90432e282.worker.js +0 -1
  123. data/lib/happo/public/95ae334beb5125d1b4ce.worker.js +0 -62
  124. data/lib/happo/public/95b52fcff8f5732b1902.worker.js +0 -62
  125. data/lib/happo/public/95f3e6e7eec59c0af3e5.worker.js +0 -56
  126. data/lib/happo/public/96c4c2f5df8175649a67.worker.js +0 -56
  127. data/lib/happo/public/973a6ae106ac4e664858.worker.js +0 -56
  128. data/lib/happo/public/984f0e2d0e896c2f4048.worker.js +0 -62
  129. data/lib/happo/public/988f633191766eef664a.worker.js +0 -56
  130. data/lib/happo/public/989e9ba236891bdfcf46.worker.js +0 -56
  131. data/lib/happo/public/99af2b663636fee65291.worker.js +0 -62
  132. data/lib/happo/public/9c8f5ee8dfa77750be8c.worker.js +0 -62
  133. data/lib/happo/public/9d57ea9c2af229a03119.worker.js +0 -56
  134. data/lib/happo/public/9d7be8cf3aadb0b77624.worker.js +0 -62
  135. data/lib/happo/public/9e6b804a33c6799809cf.worker.js +0 -62
  136. data/lib/happo/public/HappoApp.bundle.js.map +0 -1
  137. data/lib/happo/public/a3574ff725014ef26602.worker.js +0 -56
  138. data/lib/happo/public/a50e9af74a422839a15c.worker.js +0 -56
  139. data/lib/happo/public/a5564ec6a5def9e7a95a.worker.js +0 -1
  140. data/lib/happo/public/a59e639dbf2bc03792c2.worker.js +0 -56
  141. data/lib/happo/public/a6de7e3f4866c4d4af09.worker.js +0 -62
  142. data/lib/happo/public/a79d520c7469920c10a2.worker.js +0 -62
  143. data/lib/happo/public/a7da9c5111db811b9535.worker.js +0 -62
  144. data/lib/happo/public/a8bfebcafc4935d15b00.worker.js +0 -1
  145. data/lib/happo/public/a8d9429cf3dd094aa190.worker.js +0 -62
  146. data/lib/happo/public/ab952692e7c4df03d3b8.worker.js +0 -56
  147. data/lib/happo/public/aca1442707a8e088ec9e.worker.js +0 -62
  148. data/lib/happo/public/ad4fdfa82741585ce164.worker.js +0 -56
  149. data/lib/happo/public/adc1f6a613d0d2eda4b8.worker.js +0 -56
  150. data/lib/happo/public/ae0622a81101951ac112.worker.js +0 -56
  151. data/lib/happo/public/ae223678cdbfac88d9be.worker.js +0 -56
  152. data/lib/happo/public/b2a65c76321af7bc6d89.worker.js +0 -62
  153. data/lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js +0 -62
  154. data/lib/happo/public/b41bd9a6b659bfe3096f.worker.js +0 -62
  155. data/lib/happo/public/b441a6c1393a5d39b5ff.worker.js +0 -56
  156. data/lib/happo/public/b4c84506199d5745d950.worker.js +0 -56
  157. data/lib/happo/public/b5176c936b696653a407.worker.js +0 -56
  158. data/lib/happo/public/b66da676446fdda1a58c.worker.js +0 -56
  159. data/lib/happo/public/b86b963a72892d8f0fd1.worker.js +0 -56
  160. data/lib/happo/public/ba50214d2b6ac001493b.worker.js +0 -56
  161. data/lib/happo/public/bb6413d1cea030ba7a1e.worker.js +0 -56
  162. data/lib/happo/public/bc084ad60fb7dbbe0818.worker.js +0 -56
  163. data/lib/happo/public/c15e6b44ae496af6af9b.worker.js +0 -56
  164. data/lib/happo/public/c1dd7c953827ff9578f0.worker.js +0 -68
  165. data/lib/happo/public/c2297ce40f0d071ec173.worker.js +0 -1
  166. data/lib/happo/public/c4393394848f5242932e.worker.js +0 -56
  167. data/lib/happo/public/c556b6ede3bbd230cebd.worker.js +0 -62
  168. data/lib/happo/public/c60ceaff7849b394e27a.worker.js +0 -56
  169. data/lib/happo/public/c67c76de1e4def5019d5.worker.js +0 -56
  170. data/lib/happo/public/c7969739b50b79043b86.worker.js +0 -56
  171. data/lib/happo/public/ca172f55a8f34b526853.worker.js +0 -62
  172. data/lib/happo/public/cbc31c846bebca5538bf.worker.js +0 -62
  173. data/lib/happo/public/cc82d7609935eb1d2738.worker.js +0 -56
  174. data/lib/happo/public/ce2440f84aa6708e51d4.worker.js +0 -56
  175. data/lib/happo/public/d135dda9b0318be75e3c.worker.js +0 -56
  176. data/lib/happo/public/d2aded5d63912f5b7e1b.worker.js +0 -56
  177. data/lib/happo/public/d2be644581f8f67b207d.worker.js +0 -56
  178. data/lib/happo/public/d4d18f5ac12fd3309c03.worker.js +0 -56
  179. data/lib/happo/public/d5ec9230a58d0929fe2d.worker.js +0 -62
  180. data/lib/happo/public/d650ec5f5ee0203de80a.worker.js +0 -1
  181. data/lib/happo/public/d6dbbb2aeed75685efa1.worker.js +0 -62
  182. data/lib/happo/public/d6e037d3891cfb95fbca.worker.js +0 -50
  183. data/lib/happo/public/d7403b48b365a76148a2.worker.js +0 -56
  184. data/lib/happo/public/d7440908d264133044bb.worker.js +0 -56
  185. data/lib/happo/public/d75350c7043f58e46d0c.worker.js +0 -62
  186. data/lib/happo/public/d899e9318500e6115f21.worker.js +0 -62
  187. data/lib/happo/public/d8fefa1bd98baa4e38da.worker.js +0 -62
  188. data/lib/happo/public/da071c51e9a641ed805c.worker.js +0 -56
  189. data/lib/happo/public/dbe8eef9555ef0d43469.worker.js +0 -56
  190. data/lib/happo/public/df0d03d918e87308e3e3.worker.js +0 -62
  191. data/lib/happo/public/e1cbbfd7a3d705049eb0.worker.js +0 -56
  192. data/lib/happo/public/e3882591e6710cf03ed4.worker.js +0 -56
  193. data/lib/happo/public/e39e8636909998d394e8.worker.js +0 -56
  194. data/lib/happo/public/e414c768d66b9bcf86bb.worker.js +0 -56
  195. data/lib/happo/public/e5c91be22eaad28e7e82.worker.js +0 -56
  196. data/lib/happo/public/e65a11af21a63b0c66df.worker.js +0 -62
  197. data/lib/happo/public/e85bc4bb461158f5561d.worker.js +0 -56
  198. data/lib/happo/public/e8d18bed99776d3eabfd.worker.js +0 -62
  199. data/lib/happo/public/ed6256235d0a2b11aaf6.worker.js +0 -56
  200. data/lib/happo/public/edcc84bf4483670ba23e.worker.js +0 -56
  201. data/lib/happo/public/f0a047027dca5832b680.worker.js +0 -62
  202. data/lib/happo/public/f18c5838c7ec92d4a291.worker.js +0 -62
  203. data/lib/happo/public/f1b8838f395f31ff14a0.worker.js +0 -62
  204. data/lib/happo/public/f3d33d482a4326121c45.worker.js +0 -56
  205. data/lib/happo/public/f67e23a954230ea878be.worker.js +0 -56
  206. data/lib/happo/public/f800c3a1d9200926bde6.worker.js +0 -56
  207. data/lib/happo/public/f8954fa2849952175e2c.worker.js +0 -56
  208. data/lib/happo/public/fb955bccd11761291311.worker.js +0 -62
  209. data/lib/happo/public/fde5a206ff86c3d7ab10.worker.js +0 -56
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a0e079e420913be58c44843046e00ecc434191bd
4
- data.tar.gz: 4526ab4fec6170bfe4699d8b332e4fbfdabd0914
3
+ metadata.gz: 6ac64075c5b56146868419cb6568f1e0d7c2e9f6
4
+ data.tar.gz: 2fd5cbf68808a8db9f52f45f4104bcc141e7035d
5
5
  SHA512:
6
- metadata.gz: 0fc7dcbb7859678770e9068c2ad1d9a70192276d3af72a3337a3d131aaca762e83aee783fee6ef80470857838c4e1a4df7457cefab6a8d5f81fb76898d15108d
7
- data.tar.gz: 6ff97c3b64ba5f8030dbd04f2c2c0e539d9369d8fc871402e0cfd1e89cbcb92d20bdab4ebf051013f7c3b82c26b2cafdfae66cf4a022705cf1ca5d1b0e7a0e6c
6
+ metadata.gz: d688b6ffbfeb15523d78849f3c8d8fac7314f2f7374dee53187503760cc62e88cdde7e17c0bf100fc8d6edf5c60791e0b87690d7a6463c61cb4b1eac274576b2
7
+ data.tar.gz: c7216dd8a02287d08c7f5357f7619153b5519dadb36d4ac955e6b0c55330936391d6336abb4e56edf6ad5afc7d1fb0a2a7ad81a0646829ea19c8d007dd8faa26
@@ -0,0 +1 @@
1
+ !function(t){function e(a){if(r[a])return r[a].exports;var n=r[a]={exports:{},id:a,loaded:!1};return t[a].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){for(var r=t.data,a=t.width,n=t.height,o=4*a,s=[],i=0;i<n;i++){for(var u=new Uint8ClampedArray(o+4*e),f=0;f<o;f++)u[f]=r[i*o+f];s.push(u)}return s}function o(){try{return btoa(new Uint8ClampedArray([0]))===btoa(new Uint8ClampedArray([1]))?JSON.stringify:btoa}catch(t){return JSON.stringify}}function s(t){var e=t.previousImageData,r=t.currentImageData,a=t.maxWidth,n=e.map(l);self.postMessage({progress:40});var o=r.map(l);self.postMessage({progress:60}),(0,f["default"])(n,o);var s=new Uint8ClampedArray(4*a);n.forEach(function(t,r){t===u.PLACEHOLDER&&e.splice(r,0,s)}),o.forEach(function(t,e){t===u.PLACEHOLDER&&r.splice(e,0,s)})}function i(t){var e=t.previousData,r=t.currentData,a=Math.max(e.width,r.width),o=n(e,a-e.width),i=n(r,a-r.width);return self.postMessage({progress:20}),s({previousImageData:o,currentImageData:i,maxWidth:a}),self.postMessage({progress:85}),{currentData:{data:i,height:i.length,width:a},previousData:{data:o,height:o.length,width:a}}}var u=r(1),f=a(u),l=o();self.addEventListener("message",function(t){var e=t.data,r=e.previousData,a=e.currentData,n=i({previousData:r,currentData:a});self.postMessage(n),self.close()})},function(t,e){"use strict";function r(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.length;e++)r[e]=t[e];return r}return Array.from(t)}function a(t,e){for(var r=new Array(t),a=0;a<r.length;a++)r[a]=new Int32Array(e);return r}function n(t,e){for(var r=t.length,n=e.length,o=a(r+1,n+1),s=a(r+1,n+1),i=1;i<=r;i++)for(var f=Math.max(1,i-l/2);f<=Math.min(n,i+l/2);f++)t[i-1]===e[f-1]?(o[i][f]=o[i-1][f-1]+1,s[i][f]=u.upLeft):(o[i][f]=Math.max(o[i-1][f],o[i][f-1]),o[i][f]===o[i-1][f]?s[i][f]=u.up:s[i][f]=u.left);return s}function o(t){return new Array(t).fill(f)}function s(t,e,a){for(var n=e.length,s=a.length,i=0,f=t[n][s];f!==u.none;)f===u.upLeft?(i<0?a.splice.apply(a,[s,0].concat(r(o(Math.abs(i))))):i>0&&e.splice.apply(e,[n,0].concat(r(o(i)))),n--,s--,i=0):f===u.left?(s--,i++):f===u.up&&(n--,i--),f=t[n][s];var l=e.length,p=a.length,c=l>p?a:e;c.splice.apply(c,[0,0].concat(r(o(Math.abs(l-p)))))}function i(t,e){var r=n(t,e);s(r,t,e)}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=i;var u={none:0,upLeft:1,up:2,left:3},f=e.PLACEHOLDER="+",l=200}]);
@@ -1 +1 @@
1
- !function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}var o=r(1),i=n(o),a=r(24),u=n(a),s=r(10),l=n(s);document.addEventListener("DOMContentLoaded",function(){u["default"].render(i["default"].createElement(l["default"],window.APP_PROPS),document.getElementById("react-root"))})},function(e,t){e.exports=React},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1);t["default"]={description:n.PropTypes.string.isRequired,viewport:n.PropTypes.string.isRequired,previous:n.PropTypes.string,current:n.PropTypes.string.isRequired,height:n.PropTypes.number.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.children,r=e.to;return a["default"].createElement("a",{className:"InlineLink",href:"#"+r},t)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i);o.propTypes={children:i.PropTypes.node.isRequired,to:i.PropTypes.string.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image;return a["default"].createElement("h3",{id:(0,p["default"])(t)},a["default"].createElement(s["default"],{to:(0,p["default"])(t)},t.description," @ ",t.viewport))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(3),s=n(u),l=r(2),c=n(l),f=r(19),p=n(f);o.propTypes={image:i.PropTypes.shape(c["default"]).isRequired}},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t["default"]={DIFF:"Diff",SIDE_BY_SIDE:"Side-by-side",SWIPE:"Swipe"}},function(e,t){var r=window.URL||window.webkitURL;e.exports=function(e,t){try{try{var n;try{var o=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;n=new o,n.append(e),n=n.getBlob()}catch(i){n=new Blob([e])}return new Worker(r.createObjectURL(n))}catch(i){return new Worker("data:application/javascript,"+encodeURIComponent(e))}}catch(i){return new Worker(t)}}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),c=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={keepMounted:e.visible},r}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){e.visible!==this.props.visible&&this.setState({keepMounted:!0})}},{key:"render",value:function(){var e=this.props.visible,t=this.state.keepMounted;return e||t?l["default"].createElement("div",{style:{display:e?"block":"none"}},this.props.children):null}}]),t}(l["default"].Component);t["default"]=c,c.propTypes={children:s.PropTypes.node.isRequired,visible:s.PropTypes.bool}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(e){var t=e.image,r=e.selectedView,n=e.onClick,o=t.height+t.height/10;return c["default"].createElement("div",null,c["default"].createElement(p["default"],{image:t}),c["default"].createElement("div",{className:"Diff__buttons"},Object.keys(y["default"]).map(function(e){return y["default"][e]}).map(function(e,t){var o=["Diff__button"];return 0===t?o.push("Diff__button--first"):t===Object.keys(y["default"]).length-1&&o.push("Diff__button--last"),c["default"].createElement("button",{key:e,className:o.join(" "),"aria-pressed":e===r,onClick:function(){n(e)}},e)})),c["default"].createElement("div",{className:"Diff__images",style:{minHeight:o}},c["default"].createElement(h["default"],{image:t,selectedView:r})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=t.DiffController=void 0;var s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),l=r(1),c=n(l),f=r(4),p=n(f),d=r(14),h=n(d),v=r(5),y=n(v),m=r(2),g=n(m),b=t.DiffController=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={selectedView:y["default"].DIFF},r.handleClick=r.handleClick.bind(r),r}return a(t,e),s(t,[{key:"handleClick",value:function(e){this.setState({selectedView:e})}},{key:"render",value:function(){return c["default"].createElement(u,{image:this.props.image,selectedView:this.state.selectedView,onClick:this.handleClick})}}]),t}(c["default"].Component);b.propTypes={image:l.PropTypes.shape(g["default"]).isRequired},t["default"]=u,u.propTypes={image:l.PropTypes.shape(g["default"]).isRequired,onClick:l.PropTypes.func.isRequired,selectedView:l.PropTypes.oneOf(Object.keys(y["default"]).map(function(e){return y["default"][e]})).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.images;return t.length?a["default"].createElement("div",null,a["default"].createElement("h2",{id:"diffs"},a["default"].createElement(l["default"],{to:"diffs"},"Diffs (",t.length,")")),t.map(function(e){return a["default"].createElement(u.DiffController,{key:e.current,image:e})})):null}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(8),s=r(3),l=n(s),c=r(2),f=n(c);o.propTypes={images:i.PropTypes.arrayOf(i.PropTypes.shape(f["default"])).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.pageTitle,r=e.generatedAt,n=e.diffImages,o=e.newImages,i=e.triggeredByUrl;return a["default"].createElement("div",null,a["default"].createElement("header",{className:"HappoDiffs__header"},a["default"].createElement("h1",{className:"HappoDiffs__headerTitle"},t),a["default"].createElement("div",null,"Generated: ",r),i&&a["default"].createElement("div",null,"Triggered by:"," ",a["default"].createElement("a",{href:i},i))),a["default"].createElement("main",{className:"HappoDiffs__main"},a["default"].createElement(s["default"],{images:n}),a["default"].createElement(c["default"],{images:o})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(9),s=n(u),l=r(13),c=n(l),f=r(2),p=n(f);o.propTypes={pageTitle:i.PropTypes.string.isRequired,diffImages:i.PropTypes.arrayOf(p["default"]).isRequired,newImages:i.PropTypes.arrayOf(p["default"]).isRequired,generatedAt:i.PropTypes.string.isRequired,triggeredByUrl:i.PropTypes.string}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){var r=[],n=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(n=(a=u.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(s){o=!0,i=s}finally{try{!n&&u["return"]&&u["return"]()}finally{if(o)throw i}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),l=r(1),c=n(l),f=r(21),p=n(f),d=r(16),h=n(d),v=r(18),y=n(v),m=r(23),g=r(22),b=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={progress:0,width:0,height:0},r.initialize=r.initialize.bind(r),r}return a(t,e),s(t,[{key:"initialize",value:function(){var e=this,t=this.props,r=t.previous,n=t.current;Promise.all([(0,y["default"])(r),(0,y["default"])(n)]).then(function(t){var r=u(t,2),n=r[0],o=r[1];e.setState({progress:10,width:n.width,height:n.height}),e.computeDiffs({previousData:n,currentData:o})})}},{key:"computeDiffs",value:function(e){var t=this,r=e.previousData,n=e.currentData,o=new g;o.addEventListener("message",function(e){var r=e.data,n=r.previousData,o=r.currentData,i=r.progress;return n?(t.setState({width:n.width,height:n.height}),void t.constructDiffImage({previousData:n,currentData:o})):void t.setState({progress:i})}),o.postMessage({previousData:r,currentData:n})}},{key:"constructDiffImage",value:function(e){var t=this,r=e.previousData,n=e.currentData,o=new m;o.addEventListener("message",function(e){var r=e.data,n=r.data,o=r.width,i=r.height;t.setState({progress:99,width:o,height:i});var a=t.canvas.getContext("2d"),u=a.createImageData(o,i);u.data.set(n),a.putImageData(u,0,0),t.setState({progress:100})}),o.postMessage({previousImageData:r.data,currentImageData:n.data})}},{key:"render",value:function(){var e=this,t=this.state,r=t.width,n=t.height,o=t.progress;return c["default"].createElement("div",{style:{height:n,width:r}},o>0&&o<100&&c["default"].createElement(h["default"],{value:o}),0===o&&c["default"].createElement(p["default"],{onEnter:this.initialize,scrollableAncestor:window,bottomOffset:"-50%",topOffset:"-70%"}),c["default"].createElement("canvas",{ref:function(t){e.canvas=t},width:r,height:n}))}}]),t}(c["default"].Component);t["default"]=b,b.propTypes={previous:l.PropTypes.string.isRequired,current:l.PropTypes.string.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image;return a["default"].createElement("div",null,a["default"].createElement(s["default"],{image:t}),a["default"].createElement("div",{className:"NewImage__image",style:{minHeight:t.height}},a["default"].createElement("img",{role:"presentation",src:t.current})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(4),s=n(u),l=r(2),c=n(l);o.propTypes={image:i.PropTypes.shape(c["default"]).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.images;return t.length?a["default"].createElement("div",null,a["default"].createElement("h2",{id:"new"},a["default"].createElement(s["default"],{to:"new"},"New examples (",t.length,")")),t.map(function(e){return a["default"].createElement(c["default"],{key:e.current,image:e})})):null}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(3),s=n(u),l=r(12),c=n(l),f=r(2),p=n(f);o.propTypes={images:i.PropTypes.arrayOf(i.PropTypes.shape(p["default"])).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image,r=e.selectedView;return a["default"].createElement("div",null,a["default"].createElement(s["default"],{visible:r===y["default"].SIDE_BY_SIDE},a["default"].createElement(p["default"],{previous:t.previous,current:t.current})),a["default"].createElement(s["default"],{visible:r===y["default"].DIFF},a["default"].createElement(c["default"],{previous:t.previous,current:t.current})),a["default"].createElement(s["default"],{visible:r===y["default"].SWIPE},a["default"].createElement(h["default"],{previous:t.previous,current:t.current})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(7),s=n(u),l=r(11),c=n(l),f=r(15),p=n(f),d=r(17),h=n(d),v=r(5),y=n(v),m=r(2),g=n(m);o.propTypes={image:i.PropTypes.shape(g["default"]).isRequired,selectedView:i.PropTypes.oneOf(Object.keys(y["default"]).map(function(e){return y["default"][e]})).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.previous,r=e.current;return a["default"].createElement("div",{className:"SideBySide"},a["default"].createElement("img",{className:"SideBySide__image",role:"presentation",src:t,title:"Before"})," ",a["default"].createElement("img",{className:"SideBySide__image",role:"presentation",src:r,title:"After"}))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i);o.propTypes={previous:i.PropTypes.string.isRequired,current:i.PropTypes.string.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),c=500,f=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={currentValue:0,visible:!1},r.tick=r.tick.bind(r),r.tick(0),setTimeout(function(){r.setState({visible:!0})},c),r}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){clearTimeout(this.timeout),this.tick(e.value)}},{key:"tick",value:function(e){var t=this,r=this.state.currentValue,n=e-r;this.setState({currentValue:r+.8*n}),this.timeout=setTimeout(function(){t.tick(e)},1e3)}},{key:"render",value:function(){var e=this.state,t=e.currentValue,r=e.visible;return l["default"].createElement("div",{style:{opacity:r?1:0},className:"SmoothProgress"},l["default"].createElement("div",{style:{transform:"translateX(-"+(100-t)+"%)"},className:"SmoothProgress__bar"}))}}]),t}(l["default"].PureComponent);t["default"]=f,f.propTypes={value:s.PropTypes.number.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),c=r(20),f=n(c),p=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={cursorLeft:0,height:"auto",width:"auto"},r.handleMouseMove=r.handleMouseMove.bind(r),r}return a(t,e),u(t,[{key:"componentWillMount",value:function(){var e=this;this.updateSize(this.props).then(function(t){var r=t.width;e.setState({cursorLeft:r/2})})}},{key:"componentWillReceiveProps",value:function(e){this.updateSize(e)}},{key:"updateSize",value:function(e){var t=this,r=e.current,n=e.previous,o=(0,f["default"])(r,n).then(function(e){var r=e.width,n=e.height;return t.setState({width:r,height:n}),{width:r,height:n}});return Promise.resolve(o)}},{key:"handleMouseMove",value:function(e){this.setState({cursorLeft:e.pageX-e.target.offsetLeft})}},{key:"render",value:function(){var e=this.props,t=e.previous,r=e.current,n=this.state,o=n.cursorLeft,i=n.height,a=n.width;return l["default"].createElement("div",{className:"Swiper",style:{height:i,width:a},onMouseMove:this.handleMouseMove},l["default"].createElement("div",{className:"Swiper__image",style:{width:o}},l["default"].createElement("img",{src:t,role:"presentation"})),l["default"].createElement("div",{className:"Swiper__image",style:{transform:"translateX("+o+"px)",width:a-o}},l["default"].createElement("img",{src:r,style:{transform:"translateX(-"+o+"px)"},role:"presentation"})),l["default"].createElement("div",{className:"Swiper__cursor",style:{transform:"translateX("+o+"px)"}}))}}]),t}(l["default"].Component);t["default"]=p,p.propTypes={previous:s.PropTypes.string.isRequired,current:s.PropTypes.string.isRequired}},function(e,t){"use strict";function r(e){return new Promise(function(t){var r=new Image;r.onload=function(){var e=r.width,n=r.height,o=document.createElement("canvas");o.width=e,o.height=n;var i=o.getContext("2d");i.drawImage(r,0,0);var a=i.getImageData(0,0,e,n).data;t({width:e,height:n,data:a})},r.src=e})}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r},function(e,t){"use strict";function r(e){return btoa(e.description+e.viewport)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r},function(e,t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function n(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var o={};return new Promise(function(e,n){function i(e){n(e)}function a(n){var i=this.width,a=this.height;if(o[n]={width:i,height:a},Object.keys(o).length>=t.length){var u=Object.keys(o).map(function(e){return o[e]}),s=Math.max.apply(Math,r(u.map(function(e){return e.width}))),l=Math.max.apply(Math,r(u.map(function(e){return e.height})));e({width:s,height:l})}}t.forEach(function(e,t){var r=new Image;r.onerror=i,r.onload=a.bind(r,t),r.src=e})})}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=n},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(){console.log(arguments)}var s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}();Object.defineProperty(t,"__esModule",{value:!0});var l=r(1),c=n(l),f={above:"above",inside:"inside",below:"below",invisible:"invisible"},p={debug:l.PropTypes.bool,onEnter:l.PropTypes.func,onLeave:l.PropTypes.func,onPositionChange:l.PropTypes.func,fireOnRapidScroll:l.PropTypes.bool,scrollableAncestor:l.PropTypes.any,throttleHandler:l.PropTypes.func,topOffset:l.PropTypes.oneOfType([l.PropTypes.string,l.PropTypes.number]),bottomOffset:l.PropTypes.oneOfType([l.PropTypes.string,l.PropTypes.number])},d={topOffset:"0px",bottomOffset:"0px",onEnter:function(){},onLeave:function(){},onPositionChange:function(){},fireOnRapidScroll:!0,throttleHandler:function(e){return e}},h=function(e){function t(e){o(this,t);var r=i(this,Object.getPrototypeOf(t).call(this,e));return r.refElement=function(e){return r._ref=e},r}return a(t,e),s(t,[{key:"componentWillMount",value:function(){if(this.props.scrollableParent)throw new Error("The `scrollableParent` prop has changed name to `scrollableAncestor`.")}},{key:"componentDidMount",value:function(){t.getWindow()&&(this._handleScroll=this.props.throttleHandler(this._handleScroll.bind(this)),this.scrollableAncestor=this._findScrollableAncestor(),this.props.debug&&u("scrollableAncestor",this.scrollableAncestor),this.scrollableAncestor.addEventListener("scroll",this._handleScroll),window.addEventListener("resize",this._handleScroll),this._handleScroll(null))}},{key:"componentDidUpdate",value:function(){t.getWindow()&&this._handleScroll(null)}},{key:"componentWillUnmount",value:function(){t.getWindow()&&(this.scrollableAncestor&&this.scrollableAncestor.removeEventListener("scroll",this._handleScroll),window.removeEventListener("resize",this._handleScroll))}},{key:"_findScrollableAncestor",value:function(){if(this.props.scrollableAncestor)return this.props.scrollableAncestor;for(var e=this._ref;e.parentNode;)if(e=e.parentNode,e!==document&&e!==document.documentElement){var t=window.getComputedStyle(e),r=t.getPropertyValue("overflow-y")||t.getPropertyValue("overflow");if("auto"===r||"scroll"===r)return e}return window}},{key:"_handleScroll",value:function(e){if(this._ref){var t=this._getBounds(),r=this._currentPosition(t),n=this._previousPosition||null;if(this.props.debug&&(u("currentPosition",r),u("previousPosition",n)),this._previousPosition=r,n!==r){var o={currentPosition:r,previousPosition:n,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom};this.props.onPositionChange.call(this,o),r===f.inside?this.props.onEnter.call(this,o):n===f.inside&&this.props.onLeave.call(this,o);var i=n===f.below&&r===f.above,a=n===f.above&&r===f.below;this.props.fireOnRapidScroll&&(i||a)&&(this.props.onEnter.call(this,{currentPosition:f.inside,previousPosition:n,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom}),this.props.onLeave.call(this,{currentPosition:r,previousPosition:f.inside,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom}))}}}},{key:"_computeOffsetPixels",value:function(e,t){var r=this._parseOffsetAsPixels(e);if("number"==typeof r)return r;var n=this._parseOffsetAsPercentage(e);return"number"==typeof n?n*t:void 0}},{key:"_parseOffsetAsPixels",value:function(e){return!isNaN(parseFloat(e))&&isFinite(e)?parseFloat(e):"px"===e.slice(-2)?parseFloat(e.slice(0,-2)):void 0}},{key:"_parseOffsetAsPercentage",value:function(e){if("%"===e.slice(-1))return parseFloat(e.slice(0,-1))/100}},{key:"_getBounds",value:function(){var e=this._ref.getBoundingClientRect().top,t=void 0,r=void 0;this.scrollableAncestor===window?(t=window.innerHeight,r=0):(t=this.scrollableAncestor.offsetHeight,r=this.scrollableAncestor.getBoundingClientRect().top),this.props.debug&&(u("waypoint top",e),u("scrollableAncestor height",t),u("scrollableAncestor scrollTop",r));var n=this.props,o=n.bottomOffset,i=n.topOffset,a=this._computeOffsetPixels(i,t),s=this._computeOffsetPixels(o,t),l=r+t;return{waypointTop:e,viewportTop:r+a,viewportBottom:l-s}}},{key:"_currentPosition",value:function(e){return e.viewportBottom-e.viewportTop===0?t.invisible:e.viewportTop<=e.waypointTop&&e.waypointTop<=e.viewportBottom?t.inside:e.viewportBottom<e.waypointTop?t.below:e.waypointTop<e.viewportTop?t.above:t.invisible}},{key:"render",value:function(){return c["default"].createElement("span",{ref:this.refElement,style:{fontSize:0}})}}]),t}(c["default"].Component);t["default"]=h,h.propTypes=p,h.above=f.above,h.below=f.below,h.inside=f.inside,h.invisible=f.invisible,h.getWindow=function(){if("undefined"!=typeof window)return window},h.defaultProps=d,h.displayName="Waypoint",e.exports=t["default"]},function(e,t,r){e.exports=function(){return r(6)('!function(t){function r(e){if(a[e])return a[e].exports;var n=a[e]={exports:{},id:e,loaded:!1};return t[e].call(n.exports,n,n.exports,r),n.loaded=!0,n.exports}var a={};return r.m=t,r.c=a,r.p="",r(0)}([function(t,r,a){"use strict";function e(t){return t&&t.__esModule?t:{"default":t}}function n(t,r){for(var a=t.data,e=t.width,n=t.height,o=4*e,i=[],s=0;s<n;s++){for(var l=new Uint8ClampedArray(o+4*r),u=0;u<o;u++)l[u]=a[s*o+u];i.push(l)}return i}function o(t){var r=t.previousImageData,a=t.currentImageData,e=t.maxWidth,n=r.map(JSON.stringify);self.postMessage({progress:40});var o=a.map(JSON.stringify);self.postMessage({progress:60}),(0,l["default"])(n,o);var i=new Uint8ClampedArray(4*e);n.forEach(function(t,a){"+"===t&&r.splice(a,0,i)}),o.forEach(function(t,r){"+"===t&&a.splice(r,0,i)})}function i(t){var r=t.previousData,a=t.currentData,e=Math.max(r.width,a.width),i=n(r,e-r.width),s=n(a,e-a.width);return self.postMessage({progress:20}),o({previousImageData:i,currentImageData:s,maxWidth:e}),self.postMessage({progress:85}),{currentData:{data:s,height:s.length,width:e},previousData:{data:i,height:i.length,width:e}}}var s=a(1),l=e(s);self.addEventListener("message",function(t){var r=t.data,a=r.previousData,e=r.currentData,n=i({previousData:a,currentData:e});self.postMessage(n),self.close()})},function(t,r){"use strict";function a(t){if(Array.isArray(t)){for(var r=0,a=Array(t.length);r<t.length;r++)a[r]=t[r];return a}return Array.from(t)}function e(t,r){for(var a=new Array(t),e=0;e<a.length;e++)a[e]=new Int32Array(r);return a}function n(t,r){for(var a=t.length,n=r.length,o=e(a+1,n+1),i=e(a+1,n+1),s=1;s<=a;s++)for(var u=1;u<=n;u++)t[s-1]===r[u-1]?(o[s][u]=o[s-1][u-1]+1,i[s][u]=l.diagonal):(o[s][u]=Math.max(o[s-1][u],o[s][u-1]),o[s][u]===o[s-1][u]?i[s][u]=l.vertical:i[s][u]=l.horizontal);return i}function o(t){return new Array(t).fill(u)}function i(t,r,e){for(var n=t[r.length][e.length],i=r.length,s=e.length,u=0;n!==l.none;)n===l.diagonal?(u<0?e.splice.apply(e,[s,0].concat(a(o(Math.abs(u))))):u>0&&r.splice.apply(r,[i,0].concat(a(o(u)))),i--,s--,u=0):n===l.horizontal?(s--,u++):n===l.vertical&&(i--,u--),n=t[i][s];var c=r.length,f=e.length,h=c>f?e:r;h.splice.apply(h,[0,0].concat(a(o(Math.abs(c-f)))))}function s(t,r){var a=n(t,r);i(a,t,r)}Object.defineProperty(r,"__esModule",{value:!0}),r["default"]=s;var l={none:0,diagonal:1,vertical:2,horizontal:3},u="+"}]);',r.p+"40c1aadf458bda245630.worker.js")}},function(e,t,r){e.exports=function(){return r(6)('!function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return e[n].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t,r){return d*(e+1)+t*e+r}var a=r(3),f=n(a),o=[100,100,100,255],i=[0,200,0,255],l=[255,0,0,255],d=80,s=16;self.addEventListener("message",function(e){for(var t=e.data,r=t.previousImageData,n=t.currentImageData,a=r[0].length,c=r.length,p=(d+a)*c,v=new Uint8ClampedArray(p),M=0;M<c;M++){for(var _=!1,h=0;h<a;h+=4){var x=(0,f["default"])([r[M][h],r[M][h+1],r[M][h+2],r[M][h+3]],[n[M][h],n[M][h+1],n[M][h+2],n[M][h+3]]),g=x.diff,w=x.pixel;g>0&&(_=!0);var A=u(M,a,h);v[A+0]=w[0],v[A+1]=w[1],v[A+2]=w[2],v[A+3]=w[3]}var E=void 0;E=0===r[M][3]?i:0===n[M][3]?l:_?o:null;for(var m=0;m<d-s;m+=4)if(null!==E){var D=u(M,a,m)-d;v[D+0]=E[0],v[D+1]=E[1],v[D+2]=E[2],v[D+3]=E[3]}}self.postMessage({data:v,width:(d+a)/4,height:c}),self.close()})},function(e,t){"use strict";function r(e){return 255===e[3]}function n(e){return 0===e[3]}function u(e,t){var r=e*t+128;return(r>>8)+r>>8}function a(e,t){if(r(e)||n(t))return e;if(n(e))return t;var a=u(255-e[3],t[3]);return[u(e[3],e[0])+u(a,t[0]),u(e[3],e[1])+u(a,t[1]),u(e[3],e[2])+u(a,t[2]),e[3]+a]}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a},function(e,t){"use strict";function r(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2)+Math.pow(e[2]-t[2],2)+Math.pow(e[3]-t[3],2))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r;t.MAX_EUCLIDEAN_DISTANCE=Math.sqrt(4*Math.pow(255,2))},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t){var r=(0,i["default"])(e,t)/o.MAX_EUCLIDEAN_DISTANCE;return 0===r?{diff:r,pixel:(0,f["default"])([t[0],t[1],t[2],40],l)}:{diff:r,pixel:(0,f["default"])([179,54,130,255*Math.max(.2,r)],l)}}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=u;var a=r(1),f=n(a),o=r(2),i=n(o),l=[255,255,255,255]}]);',r.p+"c2297ce40f0d071ec173.worker.js")}},function(e,t){e.exports=ReactDOM}]);
1
+ !function(e){function t(n){if(r[n])return r[n].exports;var o=r[n]={exports:{},id:n,loaded:!1};return e[n].call(o.exports,o,o.exports,t),o.loaded=!0,o.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}var o=r(1),i=n(o),a=r(2),u=n(a),s=r(3),l=n(s);document.addEventListener("DOMContentLoaded",function(){u["default"].render(i["default"].createElement(l["default"],window.APP_PROPS),document.getElementById("react-root"))})},function(e,t){e.exports=React},function(e,t){e.exports=ReactDOM},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.pageTitle,r=e.generatedAt,n=e.diffImages,o=e.newImages,i=e.triggeredByUrl;return a["default"].createElement("div",null,a["default"].createElement("header",{className:"HappoDiffs__header"},a["default"].createElement("h1",{className:"HappoDiffs__headerTitle"},t),a["default"].createElement("div",null,"Generated: ",r),i&&a["default"].createElement("div",null,"Triggered by:"," ",a["default"].createElement("a",{href:i},i))),a["default"].createElement("main",{className:"HappoDiffs__main"},a["default"].createElement(s["default"],{images:n}),a["default"].createElement(f["default"],{images:o})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(4),s=n(u),l=r(23),f=n(l),c=r(8),p=n(c);o.propTypes={pageTitle:i.PropTypes.string.isRequired,diffImages:i.PropTypes.arrayOf(p["default"]).isRequired,newImages:i.PropTypes.arrayOf(p["default"]).isRequired,generatedAt:i.PropTypes.string.isRequired,triggeredByUrl:i.PropTypes.string}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.images;return t.length?a["default"].createElement("div",null,a["default"].createElement("h2",{id:"diffs"},a["default"].createElement(l["default"],{to:"diffs"},"Diffs (",t.length,")")),t.map(function(e){return a["default"].createElement(u.DiffController,{key:e.current,image:e})})):null}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(5),s=r(7),l=n(s),f=r(8),c=n(f);o.propTypes={images:i.PropTypes.arrayOf(i.PropTypes.shape(c["default"])).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(e){var t=e.image,r=e.selectedView,n=e.onClick,o=t.height+t.height/10;return f["default"].createElement("div",null,f["default"].createElement(p["default"],{image:t}),f["default"].createElement("div",{className:"Diff__buttons"},Object.keys(y["default"]).map(function(e){return y["default"][e]}).map(function(e,t){var o=["Diff__button"];return 0===t?o.push("Diff__button--first"):t===Object.keys(y["default"]).length-1&&o.push("Diff__button--last"),f["default"].createElement("button",{key:e,className:o.join(" "),"aria-pressed":e===r,onClick:function(){n(e)}},e)})),f["default"].createElement("div",{className:"Diff__images",style:{minHeight:o}},f["default"].createElement(h["default"],{image:t,selectedView:r})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=t.DiffController=void 0;var s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),l=r(1),f=n(l),c=r(6),p=n(c),d=r(10),h=n(d),v=r(22),y=n(v),m=r(8),b=n(m),g=t.DiffController=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={selectedView:y["default"].DIFF},r.handleClick=r.handleClick.bind(r),r}return a(t,e),s(t,[{key:"handleClick",value:function(e){this.setState({selectedView:e})}},{key:"render",value:function(){return f["default"].createElement(u,{image:this.props.image,selectedView:this.state.selectedView,onClick:this.handleClick})}}]),t}(f["default"].Component);g.propTypes={image:l.PropTypes.shape(b["default"]).isRequired},t["default"]=u,u.propTypes={image:l.PropTypes.shape(b["default"]).isRequired,onClick:l.PropTypes.func.isRequired,selectedView:l.PropTypes.oneOf(Object.keys(y["default"]).map(function(e){return y["default"][e]})).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image;return a["default"].createElement("h3",{id:(0,p["default"])(t)},a["default"].createElement(s["default"],{to:(0,p["default"])(t)},t.description," @ ",t.viewport))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(7),s=n(u),l=r(8),f=n(l),c=r(9),p=n(c);o.propTypes={image:i.PropTypes.shape(f["default"]).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.children,r=e.to;return a["default"].createElement("a",{className:"InlineLink",href:"#"+r},t)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i);o.propTypes={children:i.PropTypes.node.isRequired,to:i.PropTypes.string.isRequired}},function(e,t,r){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=r(1);t["default"]={description:n.PropTypes.string.isRequired,viewport:n.PropTypes.string.isRequired,previous:n.PropTypes.string,current:n.PropTypes.string.isRequired,height:n.PropTypes.number.isRequired}},function(e,t){"use strict";function r(e){return btoa(e.description+e.viewport)}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image,r=e.selectedView;return a["default"].createElement("div",null,a["default"].createElement(s["default"],{visible:r===y["default"].SIDE_BY_SIDE},a["default"].createElement(p["default"],{previous:t.previous,current:t.current})),a["default"].createElement(s["default"],{visible:r===y["default"].DIFF},a["default"].createElement(f["default"],{previous:t.previous,current:t.current})),a["default"].createElement(s["default"],{visible:r===y["default"].SWIPE},a["default"].createElement(h["default"],{previous:t.previous,current:t.current})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(11),s=n(u),l=r(12),f=n(l),c=r(19),p=n(c),d=r(20),h=n(d),v=r(22),y=n(v),m=r(8),b=n(m);o.propTypes={image:i.PropTypes.shape(b["default"]).isRequired,selectedView:i.PropTypes.oneOf(Object.keys(y["default"]).map(function(e){return y["default"][e]})).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),f=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={keepMounted:e.visible},r}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){e.visible!==this.props.visible&&this.setState({keepMounted:!0})}},{key:"render",value:function(){var e=this.props.visible,t=this.state.keepMounted;return e||t?l["default"].createElement("div",{style:{display:e?"block":"none"}},this.props.children):null}}]),t}(l["default"].Component);t["default"]=f,f.propTypes={children:s.PropTypes.node.isRequired,visible:s.PropTypes.bool}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){var r=[],n=!0,o=!1,i=void 0;try{for(var a,u=e[Symbol.iterator]();!(n=(a=u.next()).done)&&(r.push(a.value),!t||r.length!==t);n=!0);}catch(s){o=!0,i=s}finally{try{!n&&u["return"]&&u["return"]()}finally{if(o)throw i}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),l=r(1),f=n(l),c=r(13),p=n(c),d=r(14),h=n(d),v=r(15),y=n(v),m=r(16),b=r(18),g=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={progress:0,width:0,height:0},r.initialize=r.initialize.bind(r),r}return a(t,e),s(t,[{key:"initialize",value:function(){var e=this,t=this.props,r=t.previous,n=t.current;Promise.all([(0,y["default"])(r),(0,y["default"])(n)]).then(function(t){var r=u(t,2),n=r[0],o=r[1];e.setState({progress:10,width:n.width,height:n.height}),e.computeDiffs({previousData:n,currentData:o})})}},{key:"computeDiffs",value:function(e){var t=this,r=e.previousData,n=e.currentData,o=new b;o.addEventListener("message",function(e){var r=e.data,n=r.previousData,o=r.currentData,i=r.progress;return n?(t.setState({width:n.width,height:n.height}),void t.constructDiffImage({previousData:n,currentData:o})):void t.setState({progress:i})}),o.postMessage({previousData:r,currentData:n})}},{key:"constructDiffImage",value:function(e){var t=this,r=e.previousData,n=e.currentData,o=new m;o.addEventListener("message",function(e){var r=e.data,n=r.data,o=r.width,i=r.height;t.setState({progress:99,width:o,height:i});var a=t.canvas.getContext("2d"),u=a.createImageData(o,i);u.data.set(n),a.putImageData(u,0,0),t.setState({progress:100})}),o.postMessage({previousImageData:r.data,currentImageData:n.data})}},{key:"render",value:function(){var e=this,t=this.state,r=t.width,n=t.height,o=t.progress;return f["default"].createElement("div",{style:{height:n,width:r}},o>0&&o<100&&f["default"].createElement(h["default"],{value:o}),0===o&&f["default"].createElement(p["default"],{onEnter:this.initialize,scrollableAncestor:window,bottomOffset:"-50%",topOffset:"-70%"}),f["default"].createElement("canvas",{ref:function(t){e.canvas=t},width:r,height:n}))}}]),t}(f["default"].Component);t["default"]=g,g.propTypes={previous:l.PropTypes.string.isRequired,current:l.PropTypes.string.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}function u(){console.log(arguments)}var s=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}();Object.defineProperty(t,"__esModule",{value:!0});var l=r(1),f=n(l),c={above:"above",inside:"inside",below:"below",invisible:"invisible"},p={debug:l.PropTypes.bool,onEnter:l.PropTypes.func,onLeave:l.PropTypes.func,onPositionChange:l.PropTypes.func,fireOnRapidScroll:l.PropTypes.bool,scrollableAncestor:l.PropTypes.any,throttleHandler:l.PropTypes.func,topOffset:l.PropTypes.oneOfType([l.PropTypes.string,l.PropTypes.number]),bottomOffset:l.PropTypes.oneOfType([l.PropTypes.string,l.PropTypes.number])},d={topOffset:"0px",bottomOffset:"0px",onEnter:function(){},onLeave:function(){},onPositionChange:function(){},fireOnRapidScroll:!0,throttleHandler:function(e){return e}},h=function(e){function t(e){o(this,t);var r=i(this,Object.getPrototypeOf(t).call(this,e));return r.refElement=function(e){return r._ref=e},r}return a(t,e),s(t,[{key:"componentWillMount",value:function(){if(this.props.scrollableParent)throw new Error("The `scrollableParent` prop has changed name to `scrollableAncestor`.")}},{key:"componentDidMount",value:function(){t.getWindow()&&(this._handleScroll=this.props.throttleHandler(this._handleScroll.bind(this)),this.scrollableAncestor=this._findScrollableAncestor(),this.props.debug&&u("scrollableAncestor",this.scrollableAncestor),this.scrollableAncestor.addEventListener("scroll",this._handleScroll),window.addEventListener("resize",this._handleScroll),this._handleScroll(null))}},{key:"componentDidUpdate",value:function(){t.getWindow()&&this._handleScroll(null)}},{key:"componentWillUnmount",value:function(){t.getWindow()&&(this.scrollableAncestor&&this.scrollableAncestor.removeEventListener("scroll",this._handleScroll),window.removeEventListener("resize",this._handleScroll))}},{key:"_findScrollableAncestor",value:function(){if(this.props.scrollableAncestor)return this.props.scrollableAncestor;for(var e=this._ref;e.parentNode;)if(e=e.parentNode,e!==document&&e!==document.documentElement){var t=window.getComputedStyle(e),r=t.getPropertyValue("overflow-y")||t.getPropertyValue("overflow");if("auto"===r||"scroll"===r)return e}return window}},{key:"_handleScroll",value:function(e){if(this._ref){var t=this._getBounds(),r=this._currentPosition(t),n=this._previousPosition||null;if(this.props.debug&&(u("currentPosition",r),u("previousPosition",n)),this._previousPosition=r,n!==r){var o={currentPosition:r,previousPosition:n,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom};this.props.onPositionChange.call(this,o),r===c.inside?this.props.onEnter.call(this,o):n===c.inside&&this.props.onLeave.call(this,o);var i=n===c.below&&r===c.above,a=n===c.above&&r===c.below;this.props.fireOnRapidScroll&&(i||a)&&(this.props.onEnter.call(this,{currentPosition:c.inside,previousPosition:n,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom}),this.props.onLeave.call(this,{currentPosition:r,previousPosition:c.inside,event:e,waypointTop:t.waypointTop,viewportTop:t.viewportTop,viewportBottom:t.viewportBottom}))}}}},{key:"_computeOffsetPixels",value:function(e,t){var r=this._parseOffsetAsPixels(e);if("number"==typeof r)return r;var n=this._parseOffsetAsPercentage(e);return"number"==typeof n?n*t:void 0}},{key:"_parseOffsetAsPixels",value:function(e){return!isNaN(parseFloat(e))&&isFinite(e)?parseFloat(e):"px"===e.slice(-2)?parseFloat(e.slice(0,-2)):void 0}},{key:"_parseOffsetAsPercentage",value:function(e){if("%"===e.slice(-1))return parseFloat(e.slice(0,-1))/100}},{key:"_getBounds",value:function(){var e=this._ref.getBoundingClientRect().top,t=void 0,r=void 0;this.scrollableAncestor===window?(t=window.innerHeight,r=0):(t=this.scrollableAncestor.offsetHeight,r=this.scrollableAncestor.getBoundingClientRect().top),this.props.debug&&(u("waypoint top",e),u("scrollableAncestor height",t),u("scrollableAncestor scrollTop",r));var n=this.props,o=n.bottomOffset,i=n.topOffset,a=this._computeOffsetPixels(i,t),s=this._computeOffsetPixels(o,t),l=r+t;return{waypointTop:e,viewportTop:r+a,viewportBottom:l-s}}},{key:"_currentPosition",value:function(e){return e.viewportBottom-e.viewportTop===0?t.invisible:e.viewportTop<=e.waypointTop&&e.waypointTop<=e.viewportBottom?t.inside:e.viewportBottom<e.waypointTop?t.below:e.waypointTop<e.viewportTop?t.above:t.invisible}},{key:"render",value:function(){return f["default"].createElement("span",{ref:this.refElement,style:{fontSize:0}})}}]),t}(f["default"].Component);t["default"]=h,h.propTypes=p,h.above=c.above,h.below=c.below,h.inside=c.inside,h.invisible=c.invisible,h.getWindow=function(){if("undefined"!=typeof window)return window},h.defaultProps=d,h.displayName="Waypoint",e.exports=t["default"]},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),f=500,c=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={currentValue:0,visible:!1},r.tick=r.tick.bind(r),r.tick(0),setTimeout(function(){r.setState({visible:!0})},f),r}return a(t,e),u(t,[{key:"componentWillReceiveProps",value:function(e){clearTimeout(this.timeout),this.tick(e.value)}},{key:"tick",value:function(e){var t=this,r=this.state.currentValue,n=e-r;this.setState({currentValue:r+.8*n}),this.timeout=setTimeout(function(){t.tick(e)},1e3)}},{key:"render",value:function(){var e=this.state,t=e.currentValue,r=e.visible;return l["default"].createElement("div",{style:{opacity:r?1:0},className:"SmoothProgress"},l["default"].createElement("div",{style:{transform:"translateX(-"+(100-t)+"%)"},className:"SmoothProgress__bar"}))}}]),t}(l["default"].PureComponent);t["default"]=c,c.propTypes={value:s.PropTypes.number.isRequired}},function(e,t){"use strict";function r(e){return new Promise(function(t){var r=new Image;r.onload=function(){var e=r.width,n=r.height,o=document.createElement("canvas");o.width=e,o.height=n;var i=o.getContext("2d");i.drawImage(r,0,0);var a=i.getImageData(0,0,e,n).data;t({width:e,height:n,data:a})},r.src=e})}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r},function(e,t,r){e.exports=function(){return r(17)('!function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return e[n].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t,r){return d*(e+1)+t*e+r}var a=r(1),f=n(a),o=[100,100,100,255],i=[0,200,0,255],l=[255,0,0,255],d=80,s=16;self.addEventListener("message",function(e){for(var t=e.data,r=t.previousImageData,n=t.currentImageData,a=r[0].length,c=r.length,p=(d+a)*c,v=new Uint8ClampedArray(p),M=0;M<c;M++){for(var _=!1,h=0;h<a;h+=4){var x=(0,f["default"])([r[M][h],r[M][h+1],r[M][h+2],r[M][h+3]],[n[M][h],n[M][h+1],n[M][h+2],n[M][h+3]]),g=x.diff,w=x.pixel;g>0&&(_=!0);var A=u(M,a,h);v[A+0]=w[0],v[A+1]=w[1],v[A+2]=w[2],v[A+3]=w[3]}var E=void 0;E=0===r[M][3]?i:0===n[M][3]?l:_?o:null;for(var m=0;m<d-s;m+=4)if(null!==E){var D=u(M,a,m)-d;v[D+0]=E[0],v[D+1]=E[1],v[D+2]=E[2],v[D+3]=E[3]}}self.postMessage({data:v,width:(d+a)/4,height:c}),self.close()})},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t){var r=(0,i["default"])(e,t)/o.MAX_EUCLIDEAN_DISTANCE;return 0===r?{diff:r,pixel:(0,f["default"])([t[0],t[1],t[2],40],l)}:{diff:r,pixel:(0,f["default"])([179,54,130,255*Math.max(.2,r)],l)}}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=u;var a=r(2),f=n(a),o=r(3),i=n(o),l=[255,255,255,255]},function(e,t){"use strict";function r(e){return 255===e[3]}function n(e){return 0===e[3]}function u(e,t){var r=e*t+128;return(r>>8)+r>>8}function a(e,t){if(r(e)||n(t))return e;if(n(e))return t;var a=u(255-e[3],t[3]);return[u(e[3],e[0])+u(a,t[0]),u(e[3],e[1])+u(a,t[1]),u(e[3],e[2])+u(a,t[2]),e[3]+a]}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a},function(e,t){"use strict";function r(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2)+Math.pow(e[2]-t[2],2)+Math.pow(e[3]-t[3],2))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r;t.MAX_EUCLIDEAN_DISTANCE=Math.sqrt(4*Math.pow(255,2))}]);',r.p+"a0de80bb919d7982b92a.worker.js")}},function(e,t){var r=window.URL||window.webkitURL;e.exports=function(e,t){try{try{var n;try{var o=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder;n=new o,n.append(e),n=n.getBlob()}catch(i){n=new Blob([e])}return new Worker(r.createObjectURL(n))}catch(i){return new Worker("data:application/javascript,"+encodeURIComponent(e))}}catch(i){return new Worker(t)}}},function(e,t,r){e.exports=function(){return r(17)('!function(t){function e(a){if(r[a])return r[a].exports;var n=r[a]={exports:{},id:a,loaded:!1};return t[a].call(n.exports,n,n.exports,e),n.loaded=!0,n.exports}var r={};return e.m=t,e.c=r,e.p="",e(0)}([function(t,e,r){"use strict";function a(t){return t&&t.__esModule?t:{"default":t}}function n(t,e){for(var r=t.data,a=t.width,n=t.height,o=4*a,s=[],i=0;i<n;i++){for(var u=new Uint8ClampedArray(o+4*e),f=0;f<o;f++)u[f]=r[i*o+f];s.push(u)}return s}function o(){try{return btoa(new Uint8ClampedArray([0]))===btoa(new Uint8ClampedArray([1]))?JSON.stringify:btoa}catch(t){return JSON.stringify}}function s(t){var e=t.previousImageData,r=t.currentImageData,a=t.maxWidth,n=e.map(l);self.postMessage({progress:40});var o=r.map(l);self.postMessage({progress:60}),(0,f["default"])(n,o);var s=new Uint8ClampedArray(4*a);n.forEach(function(t,r){t===u.PLACEHOLDER&&e.splice(r,0,s)}),o.forEach(function(t,e){t===u.PLACEHOLDER&&r.splice(e,0,s)})}function i(t){var e=t.previousData,r=t.currentData,a=Math.max(e.width,r.width),o=n(e,a-e.width),i=n(r,a-r.width);return self.postMessage({progress:20}),s({previousImageData:o,currentImageData:i,maxWidth:a}),self.postMessage({progress:85}),{currentData:{data:i,height:i.length,width:a},previousData:{data:o,height:o.length,width:a}}}var u=r(1),f=a(u),l=o();self.addEventListener("message",function(t){var e=t.data,r=e.previousData,a=e.currentData,n=i({previousData:r,currentData:a});self.postMessage(n),self.close()})},function(t,e){"use strict";function r(t){if(Array.isArray(t)){for(var e=0,r=Array(t.length);e<t.length;e++)r[e]=t[e];return r}return Array.from(t)}function a(t,e){for(var r=new Array(t),a=0;a<r.length;a++)r[a]=new Int32Array(e);return r}function n(t,e){for(var r=t.length,n=e.length,o=a(r+1,n+1),s=a(r+1,n+1),i=1;i<=r;i++)for(var f=Math.max(1,i-l/2);f<=Math.min(n,i+l/2);f++)t[i-1]===e[f-1]?(o[i][f]=o[i-1][f-1]+1,s[i][f]=u.upLeft):(o[i][f]=Math.max(o[i-1][f],o[i][f-1]),o[i][f]===o[i-1][f]?s[i][f]=u.up:s[i][f]=u.left);return s}function o(t){return new Array(t).fill(f)}function s(t,e,a){for(var n=e.length,s=a.length,i=0,f=t[n][s];f!==u.none;)f===u.upLeft?(i<0?a.splice.apply(a,[s,0].concat(r(o(Math.abs(i))))):i>0&&e.splice.apply(e,[n,0].concat(r(o(i)))),n--,s--,i=0):f===u.left?(s--,i++):f===u.up&&(n--,i--),f=t[n][s];var l=e.length,p=a.length,c=l>p?a:e;c.splice.apply(c,[0,0].concat(r(o(Math.abs(l-p)))))}function i(t,e){var r=n(t,e);s(r,t,e)}Object.defineProperty(e,"__esModule",{value:!0}),e["default"]=i;var u={none:0,upLeft:1,up:2,left:3},f=e.PLACEHOLDER="+",l=200}]);',r.p+"7c91087e37a93a8cfc20.worker.js")}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.previous,r=e.current;return a["default"].createElement("div",{className:"SideBySide"},a["default"].createElement("img",{className:"SideBySide__image",role:"presentation",src:t,title:"Before"})," ",a["default"].createElement("img",{className:"SideBySide__image",role:"presentation",src:r,title:"After"}))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i);o.propTypes={previous:i.PropTypes.string.isRequired,current:i.PropTypes.string.isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}function a(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}Object.defineProperty(t,"__esModule",{value:!0});var u=function(){function e(e,t){for(var r=0;r<t.length;r++){var n=t[r];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(e,n.key,n)}}return function(t,r,n){return r&&e(t.prototype,r),n&&e(t,n),t}}(),s=r(1),l=n(s),f=r(21),c=n(f),p=function(e){function t(e){o(this,t);var r=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e));return r.state={cursorLeft:0,height:"auto",width:"auto"},r.handleMouseMove=r.handleMouseMove.bind(r),r}return a(t,e),u(t,[{key:"componentWillMount",value:function(){var e=this;this.updateSize(this.props).then(function(t){var r=t.width;e.setState({cursorLeft:r/2})})}},{key:"componentWillReceiveProps",value:function(e){this.updateSize(e)}},{key:"updateSize",value:function(e){var t=this,r=e.current,n=e.previous,o=(0,c["default"])(r,n).then(function(e){var r=e.width,n=e.height;return t.setState({width:r,height:n}),{width:r,height:n}});return Promise.resolve(o)}},{key:"handleMouseMove",value:function(e){this.setState({cursorLeft:e.pageX-e.target.offsetLeft})}},{key:"render",value:function(){var e=this.props,t=e.previous,r=e.current,n=this.state,o=n.cursorLeft,i=n.height,a=n.width;return l["default"].createElement("div",{className:"Swiper",style:{height:i,width:a},onMouseMove:this.handleMouseMove},l["default"].createElement("div",{className:"Swiper__image",style:{width:o}},l["default"].createElement("img",{src:t,role:"presentation"})),l["default"].createElement("div",{className:"Swiper__image",style:{transform:"translateX("+o+"px)",width:a-o}},l["default"].createElement("img",{src:r,style:{transform:"translateX(-"+o+"px)"},role:"presentation"})),l["default"].createElement("div",{className:"Swiper__cursor",style:{transform:"translateX("+o+"px)"}}))}}]),t}(l["default"].Component);t["default"]=p,p.propTypes={previous:s.PropTypes.string.isRequired,current:s.PropTypes.string.isRequired}},function(e,t){"use strict";function r(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t<e.length;t++)r[t]=e[t];return r}return Array.from(e)}function n(){for(var e=arguments.length,t=Array(e),n=0;n<e;n++)t[n]=arguments[n];var o={};return new Promise(function(e,n){function i(e){n(e)}function a(n){var i=this.width,a=this.height;if(o[n]={width:i,height:a},Object.keys(o).length>=t.length){var u=Object.keys(o).map(function(e){return o[e]}),s=Math.max.apply(Math,r(u.map(function(e){return e.width}))),l=Math.max.apply(Math,r(u.map(function(e){return e.height})));e({width:s,height:l})}}t.forEach(function(e,t){var r=new Image;r.onerror=i,r.onload=a.bind(r,t),r.src=e})})}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t["default"]={DIFF:"Diff",SIDE_BY_SIDE:"Side-by-side",SWIPE:"Swipe"}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.images;return t.length?a["default"].createElement("div",null,a["default"].createElement("h2",{id:"new"},a["default"].createElement(s["default"],{to:"new"},"New examples (",t.length,")")),t.map(function(e){return a["default"].createElement(f["default"],{key:e.current,image:e})})):null}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(7),s=n(u),l=r(24),f=n(l),c=r(8),p=n(c);o.propTypes={images:i.PropTypes.arrayOf(i.PropTypes.shape(p["default"])).isRequired}},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function o(e){var t=e.image;return a["default"].createElement("div",null,a["default"].createElement(s["default"],{image:t}),a["default"].createElement("div",{className:"NewImage__image",style:{minHeight:t.height}},a["default"].createElement("img",{role:"presentation",src:t.current})))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=o;var i=r(1),a=n(i),u=r(6),s=n(u),l=r(8),f=n(l);o.propTypes={image:i.PropTypes.shape(f["default"]).isRequired}}]);
@@ -0,0 +1 @@
1
+ !function(e){function t(n){if(r[n])return r[n].exports;var u=r[n]={exports:{},id:n,loaded:!1};return e[n].call(u.exports,u,u.exports,t),u.loaded=!0,u.exports}var r={};return t.m=e,t.c=r,t.p="",t(0)}([function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t,r){return d*(e+1)+t*e+r}var a=r(1),f=n(a),o=[100,100,100,255],i=[0,200,0,255],l=[255,0,0,255],d=80,s=16;self.addEventListener("message",function(e){for(var t=e.data,r=t.previousImageData,n=t.currentImageData,a=r[0].length,c=r.length,p=(d+a)*c,v=new Uint8ClampedArray(p),M=0;M<c;M++){for(var _=!1,h=0;h<a;h+=4){var x=(0,f["default"])([r[M][h],r[M][h+1],r[M][h+2],r[M][h+3]],[n[M][h],n[M][h+1],n[M][h+2],n[M][h+3]]),g=x.diff,w=x.pixel;g>0&&(_=!0);var A=u(M,a,h);v[A+0]=w[0],v[A+1]=w[1],v[A+2]=w[2],v[A+3]=w[3]}var E=void 0;E=0===r[M][3]?i:0===n[M][3]?l:_?o:null;for(var m=0;m<d-s;m+=4)if(null!==E){var D=u(M,a,m)-d;v[D+0]=E[0],v[D+1]=E[1],v[D+2]=E[2],v[D+3]=E[3]}}self.postMessage({data:v,width:(d+a)/4,height:c}),self.close()})},function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function u(e,t){var r=(0,i["default"])(e,t)/o.MAX_EUCLIDEAN_DISTANCE;return 0===r?{diff:r,pixel:(0,f["default"])([t[0],t[1],t[2],40],l)}:{diff:r,pixel:(0,f["default"])([179,54,130,255*Math.max(.2,r)],l)}}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=u;var a=r(2),f=n(a),o=r(3),i=n(o),l=[255,255,255,255]},function(e,t){"use strict";function r(e){return 255===e[3]}function n(e){return 0===e[3]}function u(e,t){var r=e*t+128;return(r>>8)+r>>8}function a(e,t){if(r(e)||n(t))return e;if(n(e))return t;var a=u(255-e[3],t[3]);return[u(e[3],e[0])+u(a,t[0]),u(e[3],e[1])+u(a,t[1]),u(e[3],e[2])+u(a,t[2]),e[3]+a]}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=a},function(e,t){"use strict";function r(e,t){return Math.sqrt(Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2)+Math.pow(e[2]-t[2],2)+Math.pow(e[3]-t[3],2))}Object.defineProperty(t,"__esModule",{value:!0}),t["default"]=r;t.MAX_EUCLIDEAN_DISTANCE=Math.sqrt(4*Math.pow(255,2))}]);
@@ -1,4 +1,4 @@
1
1
  # Defines the gem version.
2
2
  module Happo
3
- VERSION = '2.8.2'
3
+ VERSION = '2.8.3'
4
4
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: happo
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.8.2
4
+ version: 2.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Henric Trotzig
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2016-09-27 00:00:00.000000000 Z
12
+ date: 2016-09-28 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chunky_png
@@ -131,215 +131,14 @@ files:
131
131
  - bin/happo
132
132
  - lib/happo.rb
133
133
  - lib/happo/logger.rb
134
- - lib/happo/public/0144a92667ed2e8a8b13.worker.js
135
- - lib/happo/public/026c001beac0620bb23a.worker.js
136
- - lib/happo/public/05ad45a945afc6882286.worker.js
137
- - lib/happo/public/05bf9fb3d7f0192e7194.worker.js
138
- - lib/happo/public/06bf22e3fa348f77a82f.worker.js
139
- - lib/happo/public/08ccdc92f4d8ed3cff76.worker.js
140
- - lib/happo/public/0b94c9757c981bfc9fd7.worker.js
141
- - lib/happo/public/0d036738a62c01299743.worker.js
142
- - lib/happo/public/0dd329b74ed90a207896.worker.js
143
- - lib/happo/public/0e32a5b5219342a9aa1e.worker.js
144
- - lib/happo/public/105bb978b49beac37583.worker.js
145
- - lib/happo/public/1172b74983f510409e2d.worker.js
146
- - lib/happo/public/13d0677d081eefd8c8bb.worker.js
147
- - lib/happo/public/15b1495833b5b13f5f51.worker.js
148
- - lib/happo/public/1635684653e1a1979bea.worker.js
149
- - lib/happo/public/174b944ab9e9053c766d.worker.js
150
- - lib/happo/public/196b75660e2791fda25a.worker.js
151
- - lib/happo/public/1bb6a3a6bba3c02df491.worker.js
152
- - lib/happo/public/1c48c5a95c9c5331c65f.worker.js
153
- - lib/happo/public/1d1049629f51e72af69f.worker.js
154
- - lib/happo/public/1d5c0eb9c479f44f0ec2.worker.js
155
- - lib/happo/public/1d6c41b4828b191ae315.worker.js
156
- - lib/happo/public/1fd046493403de128de1.worker.js
157
- - lib/happo/public/20c34bdb9a226c485df8.worker.js
158
- - lib/happo/public/212269d558f1f8b1bc63.worker.js
159
- - lib/happo/public/220e711d4abdbc4bd32f.worker.js
160
- - lib/happo/public/23686d1b2fc3f4f86d12.worker.js
161
- - lib/happo/public/238307cd4525e692bc79.worker.js
162
- - lib/happo/public/25426637d793045ccb77.worker.js
163
- - lib/happo/public/28537ac53e64479763ba.worker.js
164
- - lib/happo/public/2c643331ceb20b73e255.worker.js
165
- - lib/happo/public/2db6b1d7219028bac961.worker.js
166
- - lib/happo/public/2fbe9cf56ab2c3ab9a4a.worker.js
167
- - lib/happo/public/30e3af0e8f974da2885c.worker.js
168
- - lib/happo/public/30ee387dd21d6b20a927.worker.js
169
- - lib/happo/public/32fc2a09f98d30cb2a06.worker.js
170
- - lib/happo/public/33c43f9f1296a6c3b236.worker.js
171
- - lib/happo/public/34c08770d9dc4981b2a2.worker.js
172
- - lib/happo/public/35d8e219a4200e27adf9.worker.js
173
- - lib/happo/public/360e0acb872760f43b07.worker.js
174
- - lib/happo/public/385cc56a00d991287244.worker.js
175
- - lib/happo/public/38e90e6329f74e2d681a.worker.js
176
- - lib/happo/public/3a1ce5368a835b999d55.worker.js
177
- - lib/happo/public/3a6592504d8ee1810017.worker.js
178
- - lib/happo/public/3a7567174ad2bd91c107.worker.js
179
- - lib/happo/public/3a8bedd3121a2cdacb6d.worker.js
180
- - lib/happo/public/3b63d7abc667a23e0a2b.worker.js
181
- - lib/happo/public/3bdf5dcbba8864a7dcae.worker.js
182
- - lib/happo/public/3d9ed68ca315896c8ec7.worker.js
183
- - lib/happo/public/3da88471c60703398f95.worker.js
184
- - lib/happo/public/3ee7268990c5d4183ad1.worker.js
185
- - lib/happo/public/40c1aadf458bda245630.worker.js
186
- - lib/happo/public/41749e1ff9db63f87a1e.worker.js
187
- - lib/happo/public/41d90eebc5449581b92a.worker.js
188
- - lib/happo/public/42bc2c20d61979a23a2f.worker.js
189
- - lib/happo/public/447f3bfe79be8a67b9cc.worker.js
190
- - lib/happo/public/4580dd75ba5a064f4366.worker.js
191
- - lib/happo/public/46a8fcf803fae37aa259.worker.js
192
- - lib/happo/public/46ef1d4f416d92b92cab.worker.js
193
- - lib/happo/public/4960a52eba13a73eb069.worker.js
194
- - lib/happo/public/4975b25fe791d85e9827.worker.js
195
- - lib/happo/public/49c762dec74fb3e7c638.worker.js
196
- - lib/happo/public/4b23fa5d7875a8fba618.worker.js
197
- - lib/happo/public/4ecbb720788698ce7a9b.worker.js
198
- - lib/happo/public/4ef2e26b666b08b7411a.worker.js
199
- - lib/happo/public/507ef3ea49332d42f582.worker.js
200
- - lib/happo/public/511d7e03fd683c618a22.worker.js
201
- - lib/happo/public/51ac7ca571ae07cd9d7a.worker.js
202
- - lib/happo/public/527516eb649429b011f7.worker.js
203
- - lib/happo/public/52e42bbfa68714fd1b26.worker.js
204
- - lib/happo/public/531d99f56a3343cee5f8.worker.js
205
- - lib/happo/public/53e6a60c2cf0558157a7.worker.js
206
- - lib/happo/public/53e970da89474270e914.worker.js
207
- - lib/happo/public/54ba8bc7a595358209d2.worker.js
208
- - lib/happo/public/55d488167040d5350534.worker.js
209
- - lib/happo/public/572846c1173405e57d7d.worker.js
210
- - lib/happo/public/578cb8199b43c9f746ec.worker.js
211
- - lib/happo/public/588f7a6b784ef2b87932.worker.js
212
- - lib/happo/public/58ae755db5700fc141d3.worker.js
213
- - lib/happo/public/59d03b8990473ae492e0.worker.js
214
- - lib/happo/public/5aded6f9af816e819a2b.worker.js
215
- - lib/happo/public/5b7ffa7e0cfb69ac4952.worker.js
216
- - lib/happo/public/5cbf9957eb776724a5b6.worker.js
217
- - lib/happo/public/5e6771e4a41f597c26a9.worker.js
218
- - lib/happo/public/612cb8b078897547b091.worker.js
219
- - lib/happo/public/61e924aed1761ec05ca0.worker.js
220
- - lib/happo/public/6368c448d11a203d506b.worker.js
221
- - lib/happo/public/65e7608bb10d0f2250d1.worker.js
222
- - lib/happo/public/69d16a4997e4170af4ee.worker.js
223
- - lib/happo/public/69fdd0bf1915b19115d6.worker.js
224
- - lib/happo/public/6a71a1273a0cf4065e1e.worker.js
225
- - lib/happo/public/727ca4589d56ddcb9c7f.worker.js
226
- - lib/happo/public/74309d94f574207e4e79.worker.js
227
- - lib/happo/public/74882ef02b7b28391aac.worker.js
228
- - lib/happo/public/769883a4d5abfa7384d4.worker.js
229
- - lib/happo/public/785285eac660735ef3e0.worker.js
230
- - lib/happo/public/78fea81d29830297df57.worker.js
231
- - lib/happo/public/7bf45d52cf57b1949851.worker.js
232
- - lib/happo/public/7d4a4086de8530abe101.worker.js
233
- - lib/happo/public/7d7551366f97adda7b5b.worker.js
234
- - lib/happo/public/7e330bc3ee246ab39910.worker.js
235
- - lib/happo/public/7e53176d18c890a5424c.worker.js
236
- - lib/happo/public/818ac008a4a7d62aa55c.worker.js
237
- - lib/happo/public/823340592678aeab5317.worker.js
238
- - lib/happo/public/84f3a66517b77798456d.worker.js
239
- - lib/happo/public/856dbe98c40d8f4bd452.worker.js
240
- - lib/happo/public/8cc13e3a447ea341f962.worker.js
241
- - lib/happo/public/8d0d79f0c81652bfb3f1.worker.js
242
- - lib/happo/public/9037f52c590941a75440.worker.js
243
- - lib/happo/public/90a4b81e4d7c2da63973.worker.js
244
- - lib/happo/public/92dd03e7cbe827a2df45.worker.js
245
- - lib/happo/public/935b279f09cf3c4046ec.worker.js
246
- - lib/happo/public/945f54dcc60d8b7abc9d.worker.js
247
- - lib/happo/public/94976fe48214f2bc68d6.worker.js
248
- - lib/happo/public/94ff43f0e47ff2759712.worker.js
249
- - lib/happo/public/95a6641585f90432e282.worker.js
250
- - lib/happo/public/95ae334beb5125d1b4ce.worker.js
251
- - lib/happo/public/95b52fcff8f5732b1902.worker.js
252
- - lib/happo/public/95f3e6e7eec59c0af3e5.worker.js
253
- - lib/happo/public/96c4c2f5df8175649a67.worker.js
254
- - lib/happo/public/973a6ae106ac4e664858.worker.js
255
- - lib/happo/public/984f0e2d0e896c2f4048.worker.js
256
- - lib/happo/public/988f633191766eef664a.worker.js
257
- - lib/happo/public/989e9ba236891bdfcf46.worker.js
258
- - lib/happo/public/99af2b663636fee65291.worker.js
259
- - lib/happo/public/9c8f5ee8dfa77750be8c.worker.js
260
- - lib/happo/public/9d57ea9c2af229a03119.worker.js
261
- - lib/happo/public/9d7be8cf3aadb0b77624.worker.js
262
- - lib/happo/public/9e6b804a33c6799809cf.worker.js
134
+ - lib/happo/public/7c91087e37a93a8cfc20.worker.js
263
135
  - lib/happo/public/HappoApp.bundle.js
264
- - lib/happo/public/HappoApp.bundle.js.map
265
- - lib/happo/public/a3574ff725014ef26602.worker.js
266
- - lib/happo/public/a50e9af74a422839a15c.worker.js
267
- - lib/happo/public/a5564ec6a5def9e7a95a.worker.js
268
- - lib/happo/public/a59e639dbf2bc03792c2.worker.js
269
- - lib/happo/public/a6de7e3f4866c4d4af09.worker.js
270
- - lib/happo/public/a79d520c7469920c10a2.worker.js
271
- - lib/happo/public/a7da9c5111db811b9535.worker.js
272
- - lib/happo/public/a8bfebcafc4935d15b00.worker.js
273
- - lib/happo/public/a8d9429cf3dd094aa190.worker.js
274
- - lib/happo/public/ab952692e7c4df03d3b8.worker.js
275
- - lib/happo/public/aca1442707a8e088ec9e.worker.js
276
- - lib/happo/public/ad4fdfa82741585ce164.worker.js
277
- - lib/happo/public/adc1f6a613d0d2eda4b8.worker.js
278
- - lib/happo/public/ae0622a81101951ac112.worker.js
279
- - lib/happo/public/ae223678cdbfac88d9be.worker.js
280
- - lib/happo/public/b2a65c76321af7bc6d89.worker.js
281
- - lib/happo/public/b2a81bbc8e6f0ddb3432.worker.js
282
- - lib/happo/public/b41bd9a6b659bfe3096f.worker.js
283
- - lib/happo/public/b441a6c1393a5d39b5ff.worker.js
284
- - lib/happo/public/b4c84506199d5745d950.worker.js
285
- - lib/happo/public/b5176c936b696653a407.worker.js
286
- - lib/happo/public/b66da676446fdda1a58c.worker.js
287
- - lib/happo/public/b86b963a72892d8f0fd1.worker.js
288
- - lib/happo/public/ba50214d2b6ac001493b.worker.js
289
- - lib/happo/public/bb6413d1cea030ba7a1e.worker.js
290
- - lib/happo/public/bc084ad60fb7dbbe0818.worker.js
291
- - lib/happo/public/c15e6b44ae496af6af9b.worker.js
292
- - lib/happo/public/c1dd7c953827ff9578f0.worker.js
293
- - lib/happo/public/c2297ce40f0d071ec173.worker.js
294
- - lib/happo/public/c4393394848f5242932e.worker.js
295
- - lib/happo/public/c556b6ede3bbd230cebd.worker.js
296
- - lib/happo/public/c60ceaff7849b394e27a.worker.js
297
- - lib/happo/public/c67c76de1e4def5019d5.worker.js
298
- - lib/happo/public/c7969739b50b79043b86.worker.js
299
- - lib/happo/public/ca172f55a8f34b526853.worker.js
136
+ - lib/happo/public/a0de80bb919d7982b92a.worker.js
300
137
  - lib/happo/public/card-current.png
301
138
  - lib/happo/public/card-previous.png
302
- - lib/happo/public/cbc31c846bebca5538bf.worker.js
303
- - lib/happo/public/cc82d7609935eb1d2738.worker.js
304
- - lib/happo/public/ce2440f84aa6708e51d4.worker.js
305
- - lib/happo/public/d135dda9b0318be75e3c.worker.js
306
- - lib/happo/public/d2aded5d63912f5b7e1b.worker.js
307
- - lib/happo/public/d2be644581f8f67b207d.worker.js
308
- - lib/happo/public/d4d18f5ac12fd3309c03.worker.js
309
- - lib/happo/public/d5ec9230a58d0929fe2d.worker.js
310
- - lib/happo/public/d650ec5f5ee0203de80a.worker.js
311
- - lib/happo/public/d6dbbb2aeed75685efa1.worker.js
312
- - lib/happo/public/d6e037d3891cfb95fbca.worker.js
313
- - lib/happo/public/d7403b48b365a76148a2.worker.js
314
- - lib/happo/public/d7440908d264133044bb.worker.js
315
- - lib/happo/public/d75350c7043f58e46d0c.worker.js
316
- - lib/happo/public/d899e9318500e6115f21.worker.js
317
- - lib/happo/public/d8fefa1bd98baa4e38da.worker.js
318
- - lib/happo/public/da071c51e9a641ed805c.worker.js
319
- - lib/happo/public/dbe8eef9555ef0d43469.worker.js
320
- - lib/happo/public/df0d03d918e87308e3e3.worker.js
321
139
  - lib/happo/public/dialog-current.png
322
140
  - lib/happo/public/dialog-previous.png
323
- - lib/happo/public/e1cbbfd7a3d705049eb0.worker.js
324
- - lib/happo/public/e3882591e6710cf03ed4.worker.js
325
- - lib/happo/public/e39e8636909998d394e8.worker.js
326
- - lib/happo/public/e414c768d66b9bcf86bb.worker.js
327
- - lib/happo/public/e5c91be22eaad28e7e82.worker.js
328
- - lib/happo/public/e65a11af21a63b0c66df.worker.js
329
- - lib/happo/public/e85bc4bb461158f5561d.worker.js
330
- - lib/happo/public/e8d18bed99776d3eabfd.worker.js
331
- - lib/happo/public/ed6256235d0a2b11aaf6.worker.js
332
- - lib/happo/public/edcc84bf4483670ba23e.worker.js
333
- - lib/happo/public/f0a047027dca5832b680.worker.js
334
- - lib/happo/public/f18c5838c7ec92d4a291.worker.js
335
- - lib/happo/public/f1b8838f395f31ff14a0.worker.js
336
- - lib/happo/public/f3d33d482a4326121c45.worker.js
337
- - lib/happo/public/f67e23a954230ea878be.worker.js
338
- - lib/happo/public/f800c3a1d9200926bde6.worker.js
339
- - lib/happo/public/f8954fa2849952175e2c.worker.js
340
141
  - lib/happo/public/favicon.ico
341
- - lib/happo/public/fb955bccd11761291311.worker.js
342
- - lib/happo/public/fde5a206ff86c3d7ab10.worker.js
343
142
  - lib/happo/public/full-page-large-current.png
344
143
  - lib/happo/public/full-page-large-previous.png
345
144
  - lib/happo/public/full-page-small-current.png
@@ -1,56 +0,0 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
-
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
-
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId])
10
- /******/ return installedModules[moduleId].exports;
11
-
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ exports: {},
15
- /******/ id: moduleId,
16
- /******/ loaded: false
17
- /******/ };
18
-
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
-
22
- /******/ // Flag the module as loaded
23
- /******/ module.loaded = true;
24
-
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
-
29
-
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
-
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
-
36
- /******/ // __webpack_public_path__
37
- /******/ __webpack_require__.p = "";
38
-
39
- /******/ // Load entry module and return exports
40
- /******/ return __webpack_require__(0);
41
- /******/ })
42
- /************************************************************************/
43
- /******/ ([
44
- /* 0 */
45
- /***/ function(module, exports, __webpack_require__) {
46
-
47
- eval("'use strict';\n\nvar _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction 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\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n return _adiff2.default.diff(hashedPreviousData, hashedCurrentData);\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 85 });\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 previousImageData.splice(atIndex + y, 0, transparentLine);\n }\n }\n });\n self.postMessage({ progress: 95 });\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 currentImageData.splice(atIndex + y, 0, transparentLine);\n }\n }\n }\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImdldEFkaWZmUmVzdWx0cyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiZGlmZiIsImxlbmd0aCIsImhhc2hlZFByZXZpb3VzRGF0YSIsIm1hcCIsIkpTT04iLCJzdHJpbmdpZnkiLCJzZWxmIiwicG9zdE1lc3NhZ2UiLCJwcm9ncmVzcyIsImhhc2hlZEN1cnJlbnREYXRhIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwidHJhbnNwYXJlbnRMaW5lIiwiYWRpZmZSZXN1bHRzIiwiZm9yRWFjaCIsImluc3RydWN0aW9uIiwiYXRJbmRleCIsImRlbGV0ZWRJdGVtcyIsImFkZGVkSXRlbXMiLCJ5Iiwic3BsaWNlIiwiaSIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtB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ZjtBQUNBUyxPQUFLQyxXQUFMLENBQWlCa0IsTUFBakI7QUFDQW5CLE9BQUtvQixLQUFMO0FBQ0QsQ0FKRCIsImZpbGUiOiIwLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFkaWZmIGZyb20gJ2FkaWZmJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBnZXRBZGlmZlJlc3VsdHMoe1xuICBwcmV2aW91c0RhdGEsXG4gIGN1cnJlbnREYXRhLFxuICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgY3VycmVudEltYWdlRGF0YSxcbn0pIHtcbiAgaWYgKHByZXZpb3VzRGF0YS53aWR0aCAhPT0gY3VycmVudERhdGEud2lkdGgpIHtcbiAgICAvLyB3ZSBrbm93IHRoYXQgYWxsIHJvd3Mgd2lsbCBiZSBkaWZmZXJlbnQgaGVyZSwgc28gd2UgY2FuIHRha2UgYSBzaG9ydGN1dFxuICAgIGNvbnN0IGRpZmYgPSBbXG4gICAgICAwLCAvLyBkaWZmIHN0YXJ0cyBhdCBpbmRleCAwXG4gICAgICBwcmV2aW91c0RhdGEuaGVpZ2h0LCAvLyBudW1iZXIgb2YgZGVsZXRpb25zXG4gICAgXTtcbiAgICBkaWZmLmxlbmd0aCA9IGN1cnJlbnREYXRhLmhlaWdodCArIDI7IC8vIG51bWJlciBvZiBhZGRpdGlvbnNcbiAgICByZXR1cm4gW2RpZmZdO1xuICB9XG5cbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgcmV0dXJuIGFkaWZmLmRpZmYoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCB0cmFuc3BhcmVudExpbmUgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkobWF4V2lkdGggKiA0KTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBjb25zdCBhZGlmZlJlc3VsdHMgPSBnZXRBZGlmZlJlc3VsdHMoe1xuICAgIHByZXZpb3VzRGF0YSxcbiAgICBjdXJyZW50RGF0YSxcbiAgICBwcmV2aW91c0ltYWdlRGF0YSxcbiAgICBjdXJyZW50SW1hZ2VEYXRhLFxuICB9KTtcblxuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDg1IH0pO1xuXG4gIC8vIGl0ZXJhdGUgYW5kIGFwcGx5IGNoYW5nZXMgdG8gcHJldmlvdXMgZGF0YVxuICBhZGlmZlJlc3VsdHMuZm9yRWFjaCgoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBkZWxldGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHRyYW5zcGFyZW50TGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA5NSB9KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA5OCB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
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
- /******/ ]);
@@ -1,50 +0,0 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
-
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
-
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId])
10
- /******/ return installedModules[moduleId].exports;
11
-
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ exports: {},
15
- /******/ id: moduleId,
16
- /******/ loaded: false
17
- /******/ };
18
-
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
-
22
- /******/ // Flag the module as loaded
23
- /******/ module.loaded = true;
24
-
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
-
29
-
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
-
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
-
36
- /******/ // __webpack_public_path__
37
- /******/ __webpack_require__.p = "";
38
-
39
- /******/ // Load entry module and return exports
40
- /******/ return __webpack_require__(0);
41
- /******/ })
42
- /************************************************************************/
43
- /******/ ([
44
- /* 0 */
45
- /***/ function(module, exports, __webpack_require__) {
46
-
47
- eval("'use strict';\n\nvar _alignArrays = __webpack_require__(!(function webpackMissingModule() { var e = new Error(\"Cannot find module \\\"../alignArrays\\\"\"); e.code = 'MODULE_NOT_FOUND'; throw e; }()));\n\nvar _alignArrays2 = _interopRequireDefault(_alignArrays);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n var maxWidth = _ref2.maxWidth;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n (0, _alignArrays2.default)(hashedPreviousData, hashedCurrentData);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n hashedPreviousData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n previousImageData.splice(i, 0, transparentLine);\n }\n });\n\n hashedCurrentData.forEach(function (hashedLine, i) {\n if (hashedLine === '+') {\n currentImageData.splice(i, 0, transparentLine);\n }\n });\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n align({\n previousImageData: previousImageData,\n currentImageData: currentImageData,\n maxWidth: maxWidth\n });\n\n self.postMessage({ progress: 85 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwibWF4V2lkdGgiLCJoYXNoZWRQcmV2aW91c0RhdGEiLCJtYXAiLCJKU09OIiwic3RyaW5naWZ5Iiwic2VsZiIsInBvc3RNZXNzYWdlIiwicHJvZ3Jlc3MiLCJoYXNoZWRDdXJyZW50RGF0YSIsInRyYW5zcGFyZW50TGluZSIsImZvckVhY2giLCJoYXNoZWRMaW5lIiwiaSIsInNwbGljZSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwiTWF0aCIsIm1heCIsImxlbmd0aCIsImFkZEV2ZW50TGlzdGVuZXIiLCJyZXN1bHQiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7O0FBRUEsU0FBU0EsY0FBVCxPQUFpREMsWUFBakQsRUFBK0Q7QUFBQSxNQUFyQ0MsSUFBcUMsUUFBckNBLElBQXFDO0FBQUEsTUFBL0JDLEtBQStCLFFBQS9CQSxLQUErQjtBQUFBLE1BQXhCQyxNQUF3QixRQUF4QkEsTUFBd0I7O0FBQzdEO0FBQ0E7QUFDQSxNQUFNQyxVQUFVRixRQUFRLENBQXhCOztBQUVBLE1BQU1HLFVBQVUsRUFBaEI7QUFDQSxPQUFLLElBQUlDLE1BQU0sQ0FBZixFQUFrQkEsTUFBTUgsTUFBeEIsRUFBZ0NHLEtBQWhDLEVBQXVDO0FBQ3JDLFFBQU1DLGNBQWMsSUFBSUMsaUJBQUosQ0FBc0JKLFVBQVdKLGVBQWUsQ0FBaEQsQ0FBcEI7QUFDQSxT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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFsaWduQXJyYXlzIGZyb20gJy4uL2FsaWduQXJyYXlzJztcblxuZnVuY3Rpb24gaW1hZ2VUbzJEQXJyYXkoeyBkYXRhLCB3aWR0aCwgaGVpZ2h0IH0sIHBhZGRpbmdSaWdodCkge1xuICAvLyBUaGUgaW1hZ2VEYXRhIGlzIGEgMUQgYXJyYXkuIEVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkgY29ycmVzcG9uZHMgdG8gYVxuICAvLyBkZWNpbWFsIHZhbHVlIHRoYXQgcmVwcmVzZW50cyBvbmUgb2YgdGhlIFJHQkEgY2hhbm5lbHMgZm9yIHRoYXQgcGl4ZWwuXG4gIGNvbnN0IHJvd1NpemUgPSB3aWR0aCAqIDQ7XG5cbiAgY29uc3QgbmV3RGF0YSA9IFtdO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBoZWlnaHQ7IHJvdysrKSB7XG4gICAgY29uc3QgcGl4ZWxzSW5Sb3cgPSBuZXcgVWludDhDbGFtcGVkQXJyYXkocm93U2l6ZSArIChwYWRkaW5nUmlnaHQgKiA0KSk7XG4gICAgZm9yIChsZXQgbG9jYXRpb24gPSAwOyBsb2NhdGlvbiA8IHJvd1NpemU7IGxvY2F0aW9uKyspIHtcbiAgICAgIHBpeGVsc0luUm93W2xvY2F0aW9uXSA9IGRhdGFbKHJvdyAqIHJvd1NpemUpICsgbG9jYXRpb25dO1xuICAgIH1cbiAgICBuZXdEYXRhLnB1c2gocGl4ZWxzSW5Sb3cpO1xuICB9XG4gIHJldHVybiBuZXdEYXRhO1xufVxuXG5mdW5jdGlvbiBhbGlnbih7XG4gIHByZXZpb3VzSW1hZ2VEYXRhLFxuICBjdXJyZW50SW1hZ2VEYXRhLFxuICBtYXhXaWR0aCxcbn0pIHtcbiAgY29uc3QgaGFzaGVkUHJldmlvdXNEYXRhID0gcHJldmlvdXNJbWFnZURhdGEubWFwKEpTT04uc3RyaW5naWZ5KTtcbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA0MCB9KTtcbiAgY29uc3QgaGFzaGVkQ3VycmVudERhdGEgPSBjdXJyZW50SW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNjAgfSk7XG5cbiAgYWxpZ25BcnJheXMoXG4gICAgaGFzaGVkUHJldmlvdXNEYXRhLFxuICAgIGhhc2hlZEN1cnJlbnREYXRhXG4gICk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgaGFzaGVkUHJldmlvdXNEYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBwcmV2aW91c0ltYWdlRGF0YS5zcGxpY2UoaSwgMCwgdHJhbnNwYXJlbnRMaW5lKTtcbiAgICB9XG4gIH0pO1xuXG4gIGhhc2hlZEN1cnJlbnREYXRhLmZvckVhY2goKGhhc2hlZExpbmUsIGkpID0+IHtcbiAgICBpZiAoaGFzaGVkTGluZSA9PT0gJysnKSB7XG4gICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShpLCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCBwcmV2aW91c0ltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIHByZXZpb3VzRGF0YSwgbWF4V2lkdGggLSBwcmV2aW91c0RhdGEud2lkdGgpO1xuXG4gIGNvbnN0IGN1cnJlbnRJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBjdXJyZW50RGF0YSwgbWF4V2lkdGggLSBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiAyMCB9KTtcblxuICBhbGlnbih7XG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgICBtYXhXaWR0aCxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICByZXR1cm4ge1xuICAgIGN1cnJlbnREYXRhOiB7XG4gICAgICBkYXRhOiBjdXJyZW50SW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBjdXJyZW50SW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICAgIHByZXZpb3VzRGF0YToge1xuICAgICAgZGF0YTogcHJldmlvdXNJbWFnZURhdGEsXG4gICAgICBoZWlnaHQ6IHByZXZpb3VzSW1hZ2VEYXRhLmxlbmd0aCxcbiAgICAgIHdpZHRoOiBtYXhXaWR0aCxcbiAgICB9LFxuICB9O1xufVxuXG5zZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoeyBkYXRhOiB7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSB9KSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXB1dGVBbmRJbmplY3REaWZmcyh7IHByZXZpb3VzRGF0YSwgY3VycmVudERhdGEgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UocmVzdWx0KTtcbiAgc2VsZi5jbG9zZSgpO1xufSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiAuL2pzL3NyYy93b3JrZXJzL0NvbXB1dGVBbmRJbmplY3REaWZmc1dvcmtlci5qc1xuICoqLyJdLCJzb3VyY2VSb290IjoiIn0=");
48
-
49
- /***/ }
50
- /******/ ]);
@@ -1,56 +0,0 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
-
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
-
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId])
10
- /******/ return installedModules[moduleId].exports;
11
-
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ exports: {},
15
- /******/ id: moduleId,
16
- /******/ loaded: false
17
- /******/ };
18
-
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
-
22
- /******/ // Flag the module as loaded
23
- /******/ module.loaded = true;
24
-
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
-
29
-
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
-
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
-
36
- /******/ // __webpack_public_path__
37
- /******/ __webpack_require__.p = "";
38
-
39
- /******/ // Load entry module and return exports
40
- /******/ return __webpack_require__(0);
41
- /******/ })
42
- /************************************************************************/
43
- /******/ ([
44
- /* 0 */
45
- /***/ function(module, exports, __webpack_require__) {
46
-
47
- eval("'use strict';\n\nvar _adiff = __webpack_require__(1);\n\nvar _adiff2 = _interopRequireDefault(_adiff);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction imageTo2DArray(_ref, paddingRight) {\n var data = _ref.data;\n var width = _ref.width;\n var height = _ref.height;\n\n // The imageData is a 1D array. Each element in the array corresponds to a\n // decimal value that represents one of the RGBA channels for that pixel.\n var rowSize = width * 4;\n\n var newData = [];\n for (var row = 0; row < height; row++) {\n var pixelsInRow = new Uint8ClampedArray(rowSize + paddingRight * 4);\n for (var location = 0; location < rowSize; location++) {\n pixelsInRow[location] = data[row * rowSize + location];\n }\n newData.push(pixelsInRow);\n }\n return newData;\n}\n\nfunction align(_ref2) {\n var previousImageData = _ref2.previousImageData;\n var currentImageData = _ref2.currentImageData;\n\n var hashedPreviousData = previousImageData.map(JSON.stringify);\n self.postMessage({ progress: 40 });\n var hashedCurrentData = currentImageData.map(JSON.stringify);\n self.postMessage({ progress: 60 });\n\n return _adiff2.default.diff(hashedPreviousData, hashedCurrentData);\n}\n\n/**\n * Takes two 2d images, computes the diff between the two, and injects pixels to\n * both in order to:\n * a) make both images the same height\n * b) properly visualize differences\n *\n * Please note that this method MUTATES data.\n *\n * @param {Array} previousData\n * @param {Array} currentData\n */\nfunction computeAndInjectDiffs(_ref3) {\n var previousData = _ref3.previousData;\n var currentData = _ref3.currentData;\n\n var maxWidth = Math.max(previousData.width, currentData.width);\n\n var transparentLine = new Uint8ClampedArray(maxWidth * 4);\n\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n\n self.postMessage({ progress: 20 });\n\n var adiffResults = getAdiffResults({\n previousData: previousData,\n currentData: currentData,\n previousImageData: previousImageData,\n currentImageData: currentImageData\n });\n\n self.postMessage({ progress: 85 });\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 previousImageData.splice(atIndex + y, 0, transparentLine);\n }\n }\n });\n self.postMessage({ progress: 95 });\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 currentImageData.splice(atIndex + y, 0, transparentLine);\n }\n }\n }\n self.postMessage({ progress: 98 });\n\n return {\n currentData: {\n data: currentImageData,\n height: currentImageData.length,\n width: maxWidth\n },\n previousData: {\n data: previousImageData,\n height: previousImageData.length,\n width: maxWidth\n }\n };\n}\n\nself.addEventListener('message', function (_ref4) {\n var _ref4$data = _ref4.data;\n var previousData = _ref4$data.previousData;\n var currentData = _ref4$data.currentData;\n\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJpbWFnZVRvMkRBcnJheSIsInBhZGRpbmdSaWdodCIsImRhdGEiLCJ3aWR0aCIsImhlaWdodCIsInJvd1NpemUiLCJuZXdEYXRhIiwicm93IiwicGl4ZWxzSW5Sb3ciLCJVaW50OENsYW1wZWRBcnJheSIsImxvY2F0aW9uIiwicHVzaCIsImFsaWduIiwicHJldmlvdXNJbWFnZURhdGEiLCJjdXJyZW50SW1hZ2VEYXRhIiwiaGFzaGVkUHJldmlvdXNEYXRhIiwibWFwIiwiSlNPTiIsInN0cmluZ2lmeSIsInNlbGYiLCJwb3N0TWVzc2FnZSIsInByb2dyZXNzIiwiaGFzaGVkQ3VycmVudERhdGEiLCJkaWZmIiwiY29tcHV0ZUFuZEluamVjdERpZmZzIiwicHJldmlvdXNEYXRhIiwiY3VycmVudERhdGEiLCJtYXhXaWR0aCIsIk1hdGgiLCJtYXgiLCJ0cmFuc3BhcmVudExpbmUiLCJhZGlmZlJlc3VsdHMiLCJnZXRBZGlmZlJlc3VsdHMiLCJmb3JFYWNoIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsImxlbmd0aCIsInkiLCJzcGxpY2UiLCJpIiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlc3VsdCIsImNsb3NlIl0sIm1hcHBpbmdzIjoiOztBQUFBOzs7Ozs7QUFFQSxTQUFTQSxjQUFULE9BQWlEQyxZQUFqRCxFQUErRDtBQUFBLE1BQXJDQyxJQUFxQyxRQUFyQ0EsSUFBcUM7QUFBQSxNQUEvQkMsS0FBK0IsUUFBL0JBLEtBQStCO0FBQUEsTUFBeEJDLE1BQXdCLFFBQXhCQSxNQUF3Qjs7QUFDN0Q7QUFDQTtBQUNBLE1BQU1DLFVBQVVGLFFBQVEsQ0FBeEI7O0FBRUEsTUFBTUcsVUFBVSxFQUFoQjtBQUNBLE9BQUssSUFBSUMsTUFBTSxDQUFmLEVBQWtCQSxNQUFNSCxNQUF4QixF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QVosR0FBcUIsQ0FBeEM7O0FBRUEsU0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlYLEtBQUtDLEdBQUwsQ0FBU08sWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RFLEdBQXhELEVBQTZEO0FBQzNELFVBQUlBLElBQUlGLFVBQVIsRUFBb0I7QUFDbEI7QUFDRCxPQUZELE1BRU87QUFDTHZCLHlCQUFpQjBCLE1BQWpCLENBQXdCTCxVQUFVSSxDQUFsQyxFQUFxQyxDQUFyQyxFQUF3Q1QsZUFBeEM7QUFDRDtBQUNGO0FBQ0Y7QUFDRFgsT0FBS0MsV0FBTCxDQUFpQixFQUFFQyxVQUFVLEVBQVosRUFBakI7O0FBRUEsU0FBTztBQUNMSyxpQkFBYTtBQUNYeEIsWUFBTVksZ0JBREs7QUFFWFYsY0FBUVUsaUJBQWlCd0IsTUFGZDtBQUdYbkMsYUFBT3dCO0FBSEksS0FEUjtBQU1MRixrQkFBYztBQUNadkIsWUFBTVcsaUJBRE07QUFFWlQsY0FBUVMsa0JBQWtCeUIsTUFGZDtBQUdabkMsYUFBT3dCO0FBSEs7QUFOVCxHQUFQO0FBWUQ7O0FBRURSLEtBQUt1QixnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxpQkFBNkM7QUFBQSx5QkFBMUN4QyxJQUEwQztBQUFBLE1BQWxDdUIsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTWlCLFNBQVNuQixzQkFBc0IsRUFBRUMsMEJBQUYsRUFBZ0JDLHdCQUFoQixFQUF0QixDQUFmO0FBQ0FQLE9BQUtDLFdBQUwsQ0FBaUJ1QixNQUFqQjtBQUNBeEIsT0FBS3lCLEtBQUw7QUFDRCxDQUpEIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG5mdW5jdGlvbiBpbWFnZVRvMkRBcnJheSh7IGRhdGEsIHdpZHRoLCBoZWlnaHQgfSwgcGFkZGluZ1JpZ2h0KSB7XG4gIC8vIFRoZSBpbWFnZURhdGEgaXMgYSAxRCBhcnJheS4gRWFjaCBlbGVtZW50IGluIHRoZSBhcnJheSBjb3JyZXNwb25kcyB0byBhXG4gIC8vIGRlY2ltYWwgdmFsdWUgdGhhdCByZXByZXNlbnRzIG9uZSBvZiB0aGUgUkdCQSBjaGFubmVscyBmb3IgdGhhdCBwaXhlbC5cbiAgY29uc3Qgcm93U2l6ZSA9IHdpZHRoICogNDtcblxuICBjb25zdCBuZXdEYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IG5ldyBVaW50OENsYW1wZWRBcnJheShyb3dTaXplICsgKHBhZGRpbmdSaWdodCAqIDQpKTtcbiAgICBmb3IgKGxldCBsb2NhdGlvbiA9IDA7IGxvY2F0aW9uIDwgcm93U2l6ZTsgbG9jYXRpb24rKykge1xuICAgICAgcGl4ZWxzSW5Sb3dbbG9jYXRpb25dID0gZGF0YVsocm93ICogcm93U2l6ZSkgKyBsb2NhdGlvbl07XG4gICAgfVxuICAgIG5ld0RhdGEucHVzaChwaXhlbHNJblJvdyk7XG4gIH1cbiAgcmV0dXJuIG5ld0RhdGE7XG59XG5cbmZ1bmN0aW9uIGFsaWduKHtcbiAgcHJldmlvdXNJbWFnZURhdGEsXG4gIGN1cnJlbnRJbWFnZURhdGEsXG59KSB7XG4gIGNvbnN0IGhhc2hlZFByZXZpb3VzRGF0YSA9IHByZXZpb3VzSW1hZ2VEYXRhLm1hcChKU09OLnN0cmluZ2lmeSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogNDAgfSk7XG4gIGNvbnN0IGhhc2hlZEN1cnJlbnREYXRhID0gY3VycmVudEltYWdlRGF0YS5tYXAoSlNPTi5zdHJpbmdpZnkpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHsgcHJvZ3Jlc3M6IDYwIH0pO1xuXG4gIHJldHVybiBhZGlmZi5kaWZmKFxuICAgIGhhc2hlZFByZXZpb3VzRGF0YSxcbiAgICBoYXNoZWRDdXJyZW50RGF0YVxuICApO1xufVxuXG4vKipcbiAqIFRha2VzIHR3byAyZCBpbWFnZXMsIGNvbXB1dGVzIHRoZSBkaWZmIGJldHdlZW4gdGhlIHR3bywgYW5kIGluamVjdHMgcGl4ZWxzIHRvXG4gKiBib3RoIGluIG9yZGVyIHRvOlxuICogYSkgbWFrZSBib3RoIGltYWdlcyB0aGUgc2FtZSBoZWlnaHRcbiAqIGIpIHByb3Blcmx5IHZpc3VhbGl6ZSBkaWZmZXJlbmNlc1xuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBtZXRob2QgTVVUQVRFUyBkYXRhLlxuICpcbiAqIEBwYXJhbSB7QXJyYXl9IHByZXZpb3VzRGF0YVxuICogQHBhcmFtIHtBcnJheX0gY3VycmVudERhdGFcbiAqL1xuZnVuY3Rpb24gY29tcHV0ZUFuZEluamVjdERpZmZzKHsgcHJldmlvdXNEYXRhLCBjdXJyZW50RGF0YSB9KSB7XG4gIGNvbnN0IG1heFdpZHRoID0gTWF0aC5tYXgocHJldmlvdXNEYXRhLndpZHRoLCBjdXJyZW50RGF0YS53aWR0aCk7XG5cbiAgY29uc3QgdHJhbnNwYXJlbnRMaW5lID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KG1heFdpZHRoICogNCk7XG5cbiAgY29uc3QgcHJldmlvdXNJbWFnZURhdGEgPSBpbWFnZVRvMkRBcnJheShcbiAgICBwcmV2aW91c0RhdGEsIG1heFdpZHRoIC0gcHJldmlvdXNEYXRhLndpZHRoKTtcblxuICBjb25zdCBjdXJyZW50SW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgY3VycmVudERhdGEsIG1heFdpZHRoIC0gY3VycmVudERhdGEud2lkdGgpO1xuXG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogMjAgfSk7XG5cbiAgY29uc3QgYWRpZmZSZXN1bHRzID0gZ2V0QWRpZmZSZXN1bHRzKHtcbiAgICBwcmV2aW91c0RhdGEsXG4gICAgY3VycmVudERhdGEsXG4gICAgcHJldmlvdXNJbWFnZURhdGEsXG4gICAgY3VycmVudEltYWdlRGF0YSxcbiAgfSk7XG5cbiAgc2VsZi5wb3N0TWVzc2FnZSh7IHByb2dyZXNzOiA4NSB9KTtcblxuICAvLyBpdGVyYXRlIGFuZCBhcHBseSBjaGFuZ2VzIHRvIHByZXZpb3VzIGRhdGFcbiAgYWRpZmZSZXN1bHRzLmZvckVhY2goKGluc3RydWN0aW9uKSA9PiB7XG4gICAgY29uc3QgYXRJbmRleCA9IGluc3RydWN0aW9uWzBdO1xuICAgIGNvbnN0IGRlbGV0ZWRJdGVtcyA9IGluc3RydWN0aW9uWzFdO1xuICAgIGNvbnN0IGFkZGVkSXRlbXMgPSBpbnN0cnVjdGlvbi5sZW5ndGggLSAyO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBNYXRoLm1heChkZWxldGVkSXRlbXMsIGFkZGVkSXRlbXMpOyB5KyspIHtcbiAgICAgIGlmICh5IDwgZGVsZXRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJldmlvdXNJbWFnZURhdGEuc3BsaWNlKGF0SW5kZXggKyB5LCAwLCB0cmFuc3BhcmVudExpbmUpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTUgfSk7XG5cbiAgLy8gaXRlcmF0ZSBiYWNrd2FyZHMgYW5kIGFwcGx5IGNoYW5nZXMgdG8gY3VycmVudCBkYXRhXG4gIGZvciAobGV0IGkgPSBhZGlmZlJlc3VsdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IGFkaWZmUmVzdWx0c1tpXTtcbiAgICBjb25zdCBhdEluZGV4ID0gaW5zdHJ1Y3Rpb25bMF07XG4gICAgY29uc3QgZGVsZXRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb25bMV07XG4gICAgY29uc3QgYWRkZWRJdGVtcyA9IGluc3RydWN0aW9uLmxlbmd0aCAtIDI7XG5cbiAgICBmb3IgKGxldCB5ID0gMDsgeSA8IE1hdGgubWF4KGRlbGV0ZWRJdGVtcywgYWRkZWRJdGVtcyk7IHkrKykge1xuICAgICAgaWYgKHkgPCBhZGRlZEl0ZW1zKSB7XG4gICAgICAgIC8vIGlnbm9yZSwgd2UganVzdCBrZWVwIHRoZSBvbGQgbGluZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEltYWdlRGF0YS5zcGxpY2UoYXRJbmRleCArIHksIDAsIHRyYW5zcGFyZW50TGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHNlbGYucG9zdE1lc3NhZ2UoeyBwcm9ncmVzczogOTggfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogY3VycmVudEltYWdlRGF0YSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IHByZXZpb3VzSW1hZ2VEYXRhLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
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
- /******/ ]);
@@ -1,56 +0,0 @@
1
- /******/ (function(modules) { // webpackBootstrap
2
- /******/ // The module cache
3
- /******/ var installedModules = {};
4
-
5
- /******/ // The require function
6
- /******/ function __webpack_require__(moduleId) {
7
-
8
- /******/ // Check if module is in cache
9
- /******/ if(installedModules[moduleId])
10
- /******/ return installedModules[moduleId].exports;
11
-
12
- /******/ // Create a new module (and put it into the cache)
13
- /******/ var module = installedModules[moduleId] = {
14
- /******/ exports: {},
15
- /******/ id: moduleId,
16
- /******/ loaded: false
17
- /******/ };
18
-
19
- /******/ // Execute the module function
20
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
-
22
- /******/ // Flag the module as loaded
23
- /******/ module.loaded = true;
24
-
25
- /******/ // Return the exports of the module
26
- /******/ return module.exports;
27
- /******/ }
28
-
29
-
30
- /******/ // expose the modules object (__webpack_modules__)
31
- /******/ __webpack_require__.m = modules;
32
-
33
- /******/ // expose the module cache
34
- /******/ __webpack_require__.c = installedModules;
35
-
36
- /******/ // __webpack_public_path__
37
- /******/ __webpack_require__.p = "";
38
-
39
- /******/ // Load entry module and return exports
40
- /******/ return __webpack_require__(0);
41
- /******/ })
42
- /************************************************************************/
43
- /******/ ([
44
- /* 0 */
45
- /***/ function(module, exports, __webpack_require__) {
46
-
47
- eval("'use strict';\n\nvar _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, 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 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 start = performance.now();\n var previousImageData = imageTo2DArray(previousData, maxWidth - previousData.width);\n\n var currentImageData = imageTo2DArray(currentData, maxWidth - currentData.width);\n console.log('(internal) image creation took', performance.now() - start);\n\n start = performance.now();\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 console.log('(internal) adiffing took', performance.now() - start);\n\n start = performance.now();\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 console.log('(internal) image prep took', performance.now() - start);\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: maxWidth\n },\n previousData: {\n data: flattenImageData(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 start = performance.now();\n var result = computeAndInjectDiffs({ previousData: previousData, currentData: currentData });\n console.log('(internal) ComputeAndInjectDiffsWorker took', performance.now() - start);\n self.postMessage(result);\n self.close();\n});//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanM/ZGRiNSJdLCJuYW1lcyI6WyJjb25zdHJ1Y3RDb2xvcmVkTGluZSIsInJnYmEiLCJ3aWR0aCIsImxpbmUiLCJpIiwicHVzaCIsImltYWdlVG8yREFycmF5IiwicGFkZGluZ1JpZ2h0IiwiZGF0YSIsImhlaWdodCIsInJvd1NpemUiLCJnZXRQaXhlbEF0IiwieCIsInkiLCJzdGFydEluZGV4IiwibmV3RGF0YSIsInJvdyIsInBpeGVsc0luUm93IiwiY29sIiwicGFkIiwiZmxhdHRlbkltYWdlRGF0YSIsImltYWdlRGF0YSIsInJlc3VsdCIsImZvckVhY2giLCJwaXhlbCIsIlVpbnQ4Q2xhbXBlZEFycmF5IiwiZnJvbSIsImNvbXB1dGVBbmRJbmplY3REaWZmcyIsInByZXZpb3VzRGF0YSIsImN1cnJlbnREYXRhIiwibWF4V2lkdGgiLCJNYXRoIiwibWF4IiwicmVkTGluZSIsImdyZWVuTGluZSIsInN0YXJ0IiwicGVyZm9ybWFuY2UiLCJub3ciLCJwcmV2aW91c0ltYWdlRGF0YSIsImN1cnJlbnRJbWFnZURhdGEiLCJjb25zb2xlIiwibG9nIiwiYWRpZmZSZXN1bHRzIiwiZGlmZiIsIm1hcCIsImJ0b2EiLCJkIiwiaW5zdHJ1Y3Rpb24iLCJhdEluZGV4IiwiZGVsZXRlZEl0ZW1zIiwiYWRkZWRJdGVtcyIsImxlbmd0aCIsInNwbGljZSIsInNlbGYiLCJhZGRFdmVudExpc3RlbmVyIiwicG9zdE1lc3NhZ2UiLCJjbG9zZSJdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7Ozs7Ozs7QUFFQTs7Ozs7OztBQU9BLFNBQVNBLG9CQUFULENBQThCQyxJQUE5QixFQUFvQ0MsS0FBcEMsRUFBMkM7QUFDekMsTUFBTUMsT0FBTyxFQUFiO0FBQ0EsT0FBSyxJQUFJQyxJQUFJLENBQWIsRUFBZ0JBLElBQUlGLEtBQXBCLEVBQTJCRSxHQUEzQixFQUFnQztBQUM5QkQsU0FBS0Us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SSxDQUFiLEVBQWdCQSxJQUFJa0IsS0FBS0MsR0FBTCxDQUFTaUIsWUFBVCxFQUF1QkMsVUFBdkIsQ0FBcEIsRUFBd0RyQyxHQUF4RCxFQUE2RDtBQUMzRCxVQUFJQSxJQUFJcUMsVUFBUixFQUFvQjtBQUNsQjtBQUNELE9BRkQsTUFFTztBQUNMO0FBQ0FYLHlCQUFpQmEsTUFBakIsQ0FBd0JKLFVBQVVuQyxDQUFsQyxFQUFxQyxDQUFyQyxFQUF3Q29CLE9BQXhDO0FBQ0Q7QUFDRjtBQUNGOztBQUVELFNBQU87QUFDTEosaUJBQWE7QUFDWHJCLFlBQU1ZLGlCQUFpQm1CLGdCQUFqQixDQURLO0FBRVg5QixjQUFROEIsaUJBQWlCWSxNQUZkO0FBR1hqRCxhQUFPNEI7QUFISSxLQURSO0FBTUxGLGtCQUFjO0FBQ1pwQixZQUFNWSxpQkFBaUJrQixpQkFBakIsQ0FETTtBQUVaN0IsY0FBUTZCLGtCQUFrQmEsTUFGZDtBQUdaakQsYUFBTzRCO0FBSEs7QUFOVCxHQUFQO0FBWUQ7O0FBRUR1QixLQUFLQyxnQkFBTCxDQUFzQixTQUF0QixFQUFpQyxpQkFBNkM7QUFBQSx5QkFBMUM5QyxJQUEwQztBQUFBLE1BQWxDb0IsWUFBa0MsY0FBbENBLFlBQWtDO0FBQUEsTUFBcEJDLFdBQW9CLGNBQXBCQSxXQUFvQjs7QUFDNUUsTUFBTU0sUUFBUUMsWUFBWUMsR0FBWixFQUFkO0FBQ0EsTUFBTWYsU0FBU0ssc0JBQXNCLEVBQUVDLDBCQUFGLEVBQWdCQyx3QkFBaEIsRUFBdEIsQ0FBZjtBQUNBVyxVQUFRQyxHQUFSLENBQVksNkNBQVosRUFBMkRMLFlBQVlDLEdBQVosS0FBb0JGLEtBQS9FO0FBQ0FrQixPQUFLRSxXQUFMLENBQWlCakMsTUFBakI7QUFDQStCLE9BQUtHLEtBQUw7QUFDRCxDQU5EIiwiZmlsZSI6IjAuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYWRpZmYgZnJvbSAnYWRpZmYnO1xuXG4vKipcbiAqIENvbnN0cnVjdCBhIGxpbmUgb2YgcGl4ZWxzIG9mIGEgY2VydGFpbiByZ2JhIGNvbG9yXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcmdiYVxuICogQHBhcmFtIHtOdW1iZXJ9IHdpZHRoXG4gKiBAcmV0dXJuIHtBcnJheX1cbiAqL1xuZnVuY3Rpb24gY29uc3RydWN0Q29sb3JlZExpbmUocmdiYSwgd2lkdGgpIHtcbiAgY29uc3QgbGluZSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRoOyBpKyspIHtcbiAgICBsaW5lLnB1c2gocmdiYSk7XG4gIH1cbiAgcmV0dXJuIGxpbmU7XG59XG5cbmZ1bmN0aW9uIGltYWdlVG8yREFycmF5KHsgZGF0YSwgd2lkdGgsIGhlaWdodCB9LCBwYWRkaW5nUmlnaHQpIHtcbiAgLy8gVGhlIGltYWdlRGF0YSBpcyBhIDFEIGFycmF5LiBFYWNoIGVsZW1lbnQgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzIHRvIGFcbiAgLy8gZGVjaW1hbCB2YWx1ZSB0aGF0IHJlcHJlc2VudHMgb25lIG9mIHRoZSBSR0JBIGNoYW5uZWxzIGZvciB0aGF0IHBpeGVsLlxuICBjb25zdCByb3dTaXplID0gd2lkdGggKiA0O1xuICBjb25zdCBnZXRQaXhlbEF0ID0gKHgsIHkpID0+IHtcbiAgICBjb25zdCBzdGFydEluZGV4ID0gKHkgKiByb3dTaXplKSArICh4ICogNCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIGRhdGFbc3RhcnRJbmRleF0sXG4gICAgICBkYXRhW3N0YXJ0SW5kZXggKyAxXSxcbiAgICAgIGRhdGFbc3RhcnRJbmRleCArIDJdLFxuICAgICAgZGF0YVtzdGFydEluZGV4ICsgM10sXG4gICAgXTtcbiAgfTtcblxuICBjb25zdCBuZXdEYXRhID0gW107XG4gIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGhlaWdodDsgcm93KyspIHtcbiAgICBjb25zdCBwaXhlbHNJblJvdyA9IFtdO1xuICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IHdpZHRoOyBjb2wrKykge1xuICAgICAgcGl4ZWxzSW5Sb3cucHVzaChnZXRQaXhlbEF0KGNvbCwgcm93KSk7XG4gICAgfVxuICAgIGZvciAobGV0IHBhZCA9IDA7IHBhZCA8IHBhZGRpbmdSaWdodDsgcGFkKyspIHtcbiAgICAgIHBpeGVsc0luUm93LnB1c2goWzAsIDAsIDAsIDBdKTtcbiAgICB9XG4gICAgbmV3RGF0YS5wdXNoKHBpeGVsc0luUm93KTtcbiAgfVxuICByZXR1cm4gbmV3RGF0YTtcbn1cblxuZnVuY3Rpb24gZmxhdHRlbkltYWdlRGF0YShpbWFnZURhdGEpIHtcbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGltYWdlRGF0YS5mb3JFYWNoKChyb3cpID0+IHtcbiAgICByb3cuZm9yRWFjaCgocGl4ZWwpID0+IHtcbiAgICAgIHJlc3VsdC5wdXNoKC4uLnBpeGVsKTtcbiAgICB9KTtcbiAgfSk7XG4gIHJldHVybiBVaW50OENsYW1wZWRBcnJheS5mcm9tKHJlc3VsdCk7XG59XG5cbi8qKlxuICogVGFrZXMgdHdvIDJkIGltYWdlcywgY29tcHV0ZXMgdGhlIGRpZmYgYmV0d2VlbiB0aGUgdHdvLCBhbmQgaW5qZWN0cyBwaXhlbHMgdG9cbiAqIGJvdGggaW4gb3JkZXIgdG86XG4gKiBhKSBtYWtlIGJvdGggaW1hZ2VzIHRoZSBzYW1lIGhlaWdodFxuICogYikgcHJvcGVybHkgdmlzdWFsaXplIGRpZmZlcmVuY2VzXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCB0aGlzIG1ldGhvZCBNVVRBVEVTIGRhdGEuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHJldmlvdXNEYXRhXG4gKiBAcGFyYW0ge0FycmF5fSBjdXJyZW50RGF0YVxuICovXG5mdW5jdGlvbiBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pIHtcbiAgY29uc3QgbWF4V2lkdGggPSBNYXRoLm1heChwcmV2aW91c0RhdGEud2lkdGgsIGN1cnJlbnREYXRhLndpZHRoKTtcblxuICBjb25zdCByZWRMaW5lID0gY29uc3RydWN0Q29sb3JlZExpbmUoWzI1NSwgMCwgMCwgMjU1XSwgbWF4V2lkdGgpO1xuICBjb25zdCBncmVlbkxpbmUgPSBjb25zdHJ1Y3RDb2xvcmVkTGluZShbMCwgMjU1LCAwLCAyNTVdLCBtYXhXaWR0aCk7XG5cbiAgbGV0IHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IHByZXZpb3VzSW1hZ2VEYXRhID0gaW1hZ2VUbzJEQXJyYXkoXG4gICAgcHJldmlvdXNEYXRhLCBtYXhXaWR0aCAtIHByZXZpb3VzRGF0YS53aWR0aCk7XG5cbiAgY29uc3QgY3VycmVudEltYWdlRGF0YSA9IGltYWdlVG8yREFycmF5KFxuICAgIGN1cnJlbnREYXRhLCBtYXhXaWR0aCAtIGN1cnJlbnREYXRhLndpZHRoKTtcbiAgY29uc29sZS5sb2coJyhpbnRlcm5hbCkgaW1hZ2UgY3JlYXRpb24gdG9vaycsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpO1xuXG4gIHN0YXJ0ID0gcGVyZm9ybWFuY2Uubm93KCk7XG4gIGNvbnN0IGFkaWZmUmVzdWx0cyA9IGFkaWZmLmRpZmYoXG4gICAgcHJldmlvdXNJbWFnZURhdGEubWFwKGQgPT4gYnRvYShkKSksXG4gICAgY3VycmVudEltYWdlRGF0YS5tYXAoZCA9PiBidG9hKGQpKVxuICApO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBhZGlmZmluZyB0b29rJywgcGVyZm9ybWFuY2Uubm93KCkgLSBzdGFydCk7XG5cbiAgc3RhcnQgPSBwZXJmb3JtYW5jZS5ub3coKTtcbiAgLy8gaXRlcmF0ZSBhbmQgYXBwbHkgY2hhbmdlcyB0byBwcmV2aW91cyBkYXRhXG4gIGFkaWZmUmVzdWx0cy5mb3JFYWNoKChpbnN0cnVjdGlvbikgPT4ge1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGRlbGV0ZWRJdGVtcykge1xuICAgICAgICAvLyBpZ25vcmUsIHdlIGp1c3Qga2VlcCB0aGUgb2xkIGxpbmVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGFkZCBhIGdyZWVuIGxpbmUgdG8gc2lnbmFsIGFuIGFkZGl0aW9uXG4gICAgICAgIHByZXZpb3VzSW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgZ3JlZW5MaW5lKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBpbWFnZSBwcmVwIHRvb2snLCBwZXJmb3JtYW5jZS5ub3coKSAtIHN0YXJ0KTtcblxuICAvLyBpdGVyYXRlIGJhY2t3YXJkcyBhbmQgYXBwbHkgY2hhbmdlcyB0byBjdXJyZW50IGRhdGFcbiAgZm9yIChsZXQgaSA9IGFkaWZmUmVzdWx0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IGluc3RydWN0aW9uID0gYWRpZmZSZXN1bHRzW2ldO1xuICAgIGNvbnN0IGF0SW5kZXggPSBpbnN0cnVjdGlvblswXTtcbiAgICBjb25zdCBkZWxldGVkSXRlbXMgPSBpbnN0cnVjdGlvblsxXTtcbiAgICBjb25zdCBhZGRlZEl0ZW1zID0gaW5zdHJ1Y3Rpb24ubGVuZ3RoIC0gMjtcblxuICAgIGZvciAobGV0IHkgPSAwOyB5IDwgTWF0aC5tYXgoZGVsZXRlZEl0ZW1zLCBhZGRlZEl0ZW1zKTsgeSsrKSB7XG4gICAgICBpZiAoeSA8IGFkZGVkSXRlbXMpIHtcbiAgICAgICAgLy8gaWdub3JlLCB3ZSBqdXN0IGtlZXAgdGhlIG9sZCBsaW5lXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhZGQgYSByZWQgbGluZSB0byBzaWduYWwgYSBkZWxldGlvblxuICAgICAgICBjdXJyZW50SW1hZ2VEYXRhLnNwbGljZShhdEluZGV4ICsgeSwgMCwgcmVkTGluZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBjdXJyZW50RGF0YToge1xuICAgICAgZGF0YTogZmxhdHRlbkltYWdlRGF0YShjdXJyZW50SW1hZ2VEYXRhKSxcbiAgICAgIGhlaWdodDogY3VycmVudEltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgICBwcmV2aW91c0RhdGE6IHtcbiAgICAgIGRhdGE6IGZsYXR0ZW5JbWFnZURhdGEocHJldmlvdXNJbWFnZURhdGEpLFxuICAgICAgaGVpZ2h0OiBwcmV2aW91c0ltYWdlRGF0YS5sZW5ndGgsXG4gICAgICB3aWR0aDogbWF4V2lkdGgsXG4gICAgfSxcbiAgfTtcbn1cblxuc2VsZi5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKHsgZGF0YTogeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0gfSkgPT4ge1xuICBjb25zdCBzdGFydCA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICBjb25zdCByZXN1bHQgPSBjb21wdXRlQW5kSW5qZWN0RGlmZnMoeyBwcmV2aW91c0RhdGEsIGN1cnJlbnREYXRhIH0pO1xuICBjb25zb2xlLmxvZygnKGludGVybmFsKSBDb21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIgdG9vaycsIHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnQpO1xuICBzZWxmLnBvc3RNZXNzYWdlKHJlc3VsdCk7XG4gIHNlbGYuY2xvc2UoKTtcbn0pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogLi9qcy9zcmMvd29ya2Vycy9Db21wdXRlQW5kSW5qZWN0RGlmZnNXb3JrZXIuanNcbiAqKi8iXSwic291cmNlUm9vdCI6IiJ9");
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
- /******/ ]);