From adef9df7e6ae662dfd2ed3dec919d8fa9a636c5c Mon Sep 17 00:00:00 2001 From: Ben Burlingham Date: Sat, 11 Nov 2017 14:38:53 -0800 Subject: [PATCH] Debug count slider display. --- js/arc.js | 7 +------ js/bundle.js | 8 ++++---- js/controls.js | 12 +++++------- js/index.js | 3 --- js/particle.js | 8 ++------ 5 files changed, 12 insertions(+), 26 deletions(-) diff --git a/js/arc.js b/js/arc.js index 67875ae..d646711 100644 --- a/js/arc.js +++ b/js/arc.js @@ -7,7 +7,7 @@ const rigidity = 0.9; const sensitivity = 30; const Arc = { - create: function(bounds, grid) { + create: function(bounds) { let arc = { centerX: Random.num(0, bounds.width), centerY: Random.num(0, bounds.height), @@ -30,11 +30,6 @@ const Arc = { arc = Arc.overflow(arc, bounds); - // If starting in a hazard, recurse. - // if (grid.getPoint({ x: arc.endX, y: arc.endY, type: ENTITIES.HAZARD })) { - // arc = Arc.create(bounds, grid); - // } - return arc; }, diff --git a/js/bundle.js b/js/bundle.js index 5cd4342..5f49846 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -244,7 +244,7 @@ eval("\nvar __extends = (this && this.__extends) || function (d, b) {\n for ( /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (destroy$, _ref) {\n var _ref$count = _ref.count,\n count = _ref$count === undefined ? 1 : _ref$count,\n id = _ref.id,\n _ref$maxCount = _ref.maxCount,\n maxCount = _ref$maxCount === undefined ? 10 : _ref$maxCount,\n _ref$showCircleContro = _ref.showCircleControl,\n showCircleControl = _ref$showCircleContro === undefined ? false : _ref$showCircleContro,\n _ref$showRandomizeCon = _ref.showRandomizeControl,\n showRandomizeControl = _ref$showRandomizeCon === undefined ? false : _ref$showRandomizeCon,\n _ref$showVisionGridCo = _ref.showVisionGridControl,\n showVisionGridControl = _ref$showVisionGridCo === undefined ? false : _ref$showVisionGridCo;\n\n var container = document.createElement('div');\n container.className = 'controlsContainer';\n container.id = 'controls' + id;\n document.getElementById(id).appendChild(container);\n\n var observables = {\n fps$: new _rxjs2.default.Subject(),\n count$: createCountControl(container, 0, maxCount),\n speed$: createSpeedControl(container),\n circle$: showCircleControl && createCircleControl(container),\n randomize$: showRandomizeControl && createRandomizeControl(container),\n vision$: showVisionGridControl && createVisionGridControl(container),\n animating$: createAnimatingControl(container)\n };\n\n observables.animating$.subscribe(function (isAnimating) {\n if (isAnimating === true) {\n destroy$.next(id);\n\n if (observables.count$.getValue() === 0) {\n observables.count$.next(count);\n }\n }\n });\n\n destroy$.subscribe(function (sourceId) {\n if (id !== sourceId) {\n observables.animating$.next(false);\n observables.count$.next(0);\n }\n });\n\n return observables;\n};\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createAnimatingControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-label';\n label.className = 'controls-animating';\n\n var text = document.createElement('span');\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = false;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var animating$ = new _rxjs2.default.BehaviorSubject(false);\n\n label.addEventListener('change', function (evt) {\n animating$.next(evt.target.checked);\n });\n\n animating$.subscribe(function (isAnimating) {\n text.innerHTML = isAnimating ? '◼ Stop' : '▶ Start';\n checkbox.checked = isAnimating;\n });\n\n return animating$;\n}\n\nfunction createCountControl(container, initialValue, max) {\n var label = document.createElement('label');\n label.className = 'controls-range';\n\n var text = document.createElement('span');\n text.innerHTML = initialValue == 1 ? '1 particle' : initialValue + ' particles';\n text.className = 'controls-range-text';\n\n var slider = document.createElement('input');\n slider.type = 'range';\n slider.min = 1;\n slider.max = max;\n slider.value = initialValue;\n slider.className = 'controls-range-input';\n\n label.appendChild(text);\n label.appendChild(slider);\n\n container.appendChild(label);\n\n var count$ = new _rxjs2.default.BehaviorSubject(initialValue);\n\n label.addEventListener('input', function (evt) {\n count$.next(evt.target.value * 1);\n });\n\n count$.subscribe(function (value) {\n text.innerHTML = value == 1 ? '1 particle' : value + ' particles';\n });\n\n return count$;\n}\n\nfunction createSpeedControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-range';\n\n var text = document.createElement('span');\n text.className = 'controls-range-text';\n text.innerHTML = 'Speed: 0';\n\n var slider = document.createElement('input');\n slider.type = 'range';\n slider.min = 1;\n slider.max = 10;\n slider.value = 4;\n slider.className = 'controls-range-input';\n\n label.appendChild(text);\n label.appendChild(slider);\n\n container.appendChild(label);\n\n var speed$ = new _rxjs2.default.BehaviorSubject(slider.value);\n\n label.addEventListener('input', function (evt) {\n speed$.next(evt.target.value * 1);\n });\n\n speed$.subscribe(function (value) {\n text.innerHTML = 'Speed: ' + value;\n });\n\n return speed$;\n}\n\nfunction createCircleControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show movement circle';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var circle$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n circle$.next(evt.target.checked);\n });\n\n return circle$;\n}\n\nfunction createRandomizeControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Randomize movement';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var randomize$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n randomize$.next(evt.target.checked);\n });\n\n return randomize$;\n}\n\nfunction createVisionGridControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show vision grid';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var vision$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n vision$.next(evt.target.checked);\n });\n\n return vision$;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvY29udHJvbHMuanM/ZTk5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVzdHJveSQsIHtcbiAgICBjb3VudCA9IDEsXG4gICAgaWQsXG4gICAgbWF4Q291bnQgPSAxMCxcbiAgICBzaG93Q2lyY2xlQ29udHJvbCA9IGZhbHNlLFxuICAgIHNob3dSYW5kb21pemVDb250cm9sID0gZmFsc2UsXG4gICAgc2hvd1Zpc2lvbkdyaWRDb250cm9sID0gZmFsc2Vcbn0pIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2NvbnRyb2xzQ29udGFpbmVyJztcbiAgICBjb250YWluZXIuaWQgPSBgY29udHJvbHMke2lkfWA7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHtcbiAgICAgICAgZnBzJDogbmV3IFJ4LlN1YmplY3QoKSxcbiAgICAgICAgY291bnQkOiBjcmVhdGVDb3VudENvbnRyb2woY29udGFpbmVyLCAwLCBtYXhDb3VudCksXG4gICAgICAgIHNwZWVkJDogY3JlYXRlU3BlZWRDb250cm9sKGNvbnRhaW5lciksXG4gICAgICAgIGNpcmNsZSQ6IHNob3dDaXJjbGVDb250cm9sICYmIGNyZWF0ZUNpcmNsZUNvbnRyb2woY29udGFpbmVyKSxcbiAgICAgICAgcmFuZG9taXplJDogc2hvd1JhbmRvbWl6ZUNvbnRyb2wgJiYgY3JlYXRlUmFuZG9taXplQ29udHJvbChjb250YWluZXIpLFxuICAgICAgICB2aXNpb24kOiBzaG93VmlzaW9uR3JpZENvbnRyb2wgJiYgY3JlYXRlVmlzaW9uR3JpZENvbnRyb2woY29udGFpbmVyKSxcbiAgICAgICAgYW5pbWF0aW5nJDogY3JlYXRlQW5pbWF0aW5nQ29udHJvbChjb250YWluZXIpXG4gICAgfTtcblxuICAgIG9ic2VydmFibGVzLmFuaW1hdGluZyQuc3Vic2NyaWJlKChpc0FuaW1hdGluZykgPT4ge1xuICAgICAgICBpZiAoaXNBbmltYXRpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGRlc3Ryb3kkLm5leHQoaWQpO1xuXG4gICAgICAgICAgICBpZiAob2JzZXJ2YWJsZXMuY291bnQkLmdldFZhbHVlKCkgPT09IDApIHtcbiAgICAgICAgICAgICAgICBvYnNlcnZhYmxlcy5jb3VudCQubmV4dChjb3VudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGRlc3Ryb3kkLnN1YnNjcmliZSgoc291cmNlSWQpID0+IHtcbiAgICAgICAgaWYgKGlkICE9PSBzb3VyY2VJZCkge1xuICAgICAgICAgICAgb2JzZXJ2YWJsZXMuYW5pbWF0aW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgIG9ic2VydmFibGVzLmNvdW50JC5uZXh0KDApO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gb2JzZXJ2YWJsZXM7XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlQW5pbWF0aW5nQ29udHJvbChjb250YWluZXIpIHtcbiAgICBjb25zdCBsYWJlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xhYmVsJyk7XG4gICAgbGFiZWwuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWxhYmVsJztcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtYW5pbWF0aW5nJztcblxuICAgIGNvbnN0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG5cbiAgICBjb25zdCBjaGVja2JveCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgY2hlY2tib3gudHlwZSA9ICdjaGVja2JveCc7XG4gICAgY2hlY2tib3guY2hlY2tlZCA9IGZhbHNlO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgIGNvbnN0IGFuaW1hdGluZyQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAgIGxhYmVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChldnQpID0+IHtcbiAgICAgICAgYW5pbWF0aW5nJC5uZXh0KGV2dC50YXJnZXQuY2hlY2tlZCk7XG4gICAgfSk7XG5cbiAgICBhbmltYXRpbmckLnN1YnNjcmliZSgoaXNBbmltYXRpbmcpID0+IHtcbiAgICAgICAgdGV4dC5pbm5lckhUTUwgPSAoaXNBbmltYXRpbmcgPyAnJiM5NzI0OyBTdG9wJyA6ICcmIzk2NTQ7IFN0YXJ0Jyk7XG4gICAgICAgIGNoZWNrYm94LmNoZWNrZWQgPSBpc0FuaW1hdGluZztcbiAgICB9KTtcblxuICAgIHJldHVybiBhbmltYXRpbmckO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb3VudENvbnRyb2woY29udGFpbmVyLCBpbml0aWFsVmFsdWUsIG1heCkge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtcmFuZ2UnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVySFRNTCA9IChpbml0aWFsVmFsdWUgPT0gMSkgPyAnMSBwYXJ0aWNsZScgOiBgJHtpbml0aWFsVmFsdWV9IHBhcnRpY2xlc2A7XG4gICAgdGV4dC5jbGFzc05hbWUgPSAnY29udHJvbHMtcmFuZ2UtdGV4dCc7XG5cbiAgICBjb25zdCBzbGlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIHNsaWRlci50eXBlID0gJ3JhbmdlJztcbiAgICBzbGlkZXIubWluID0gMTtcbiAgICBzbGlkZXIubWF4ID0gbWF4O1xuICAgIHNsaWRlci52YWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICBzbGlkZXIuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLXJhbmdlLWlucHV0JztcblxuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHNsaWRlcik7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXG4gICAgY29uc3QgY291bnQkID0gbmV3IFJ4LkJlaGF2aW9yU3ViamVjdChpbml0aWFsVmFsdWUpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCAoZXZ0KSA9PiB7XG4gICAgICAgIGNvdW50JC5uZXh0KGV2dC50YXJnZXQudmFsdWUgKiAxKTtcbiAgICB9KTtcblxuICAgIGNvdW50JC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XG4gICAgICAgIHRleHQuaW5uZXJIVE1MID0gKHZhbHVlID09IDEpID8gJzEgcGFydGljbGUnIDogYCR7dmFsdWV9IHBhcnRpY2xlc2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnQkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTcGVlZENvbnRyb2woY29udGFpbmVyKSB7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1yYW5nZSc7XG5cbiAgICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLXJhbmdlLXRleHQnO1xuICAgIHRleHQuaW5uZXJIVE1MID0gJ1NwZWVkOiAwJztcblxuICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgc2xpZGVyLnR5cGUgPSAncmFuZ2UnO1xuICAgIHNsaWRlci5taW4gPSAxO1xuICAgIHNsaWRlci5tYXggPSAxMDtcbiAgICBzbGlkZXIudmFsdWUgPSA0O1xuICAgIHNsaWRlci5jbGFzc05hbWUgPSAnY29udHJvbHMtcmFuZ2UtaW5wdXQnO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoc2xpZGVyKTtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsYWJlbCk7XG5cbiAgICBjb25zdCBzcGVlZCQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHNsaWRlci52YWx1ZSk7XG5cbiAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldnQpID0+IHtcbiAgICAgICAgc3BlZWQkLm5leHQoZXZ0LnRhcmdldC52YWx1ZSAqIDEpO1xuICAgIH0pO1xuXG4gICAgc3BlZWQkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGV4dC5pbm5lckhUTUwgPSBgU3BlZWQ6ICR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzcGVlZCQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNpcmNsZUNvbnRyb2woY29udGFpbmVyKSB7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveCc7XG5cbiAgICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRleHQuaW5uZXJIVE1MID0gJ1Nob3cgbW92ZW1lbnQgY2lyY2xlJztcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC10ZXh0JztcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gtaW5wdXQnO1xuICAgIGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgIGNvbnN0IGNpcmNsZSQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2dCkgPT4ge1xuICAgICAgICBjaXJjbGUkLm5leHQoZXZ0LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjaXJjbGUkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSYW5kb21pemVDb250cm9sKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVySFRNTCA9ICdSYW5kb21pemUgbW92ZW1lbnQnO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94LXRleHQnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC1pbnB1dCc7XG4gICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXG4gICAgY29uc3QgcmFuZG9taXplJCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QodHJ1ZSk7XG5cbiAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXZ0KSA9PiB7XG4gICAgICAgIHJhbmRvbWl6ZSQubmV4dChldnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhbmRvbWl6ZSQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWRDb250cm9sKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVySFRNTCA9ICdTaG93IHZpc2lvbiBncmlkJztcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC10ZXh0JztcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gtaW5wdXQnO1xuICAgIGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgIGNvbnN0IHZpc2lvbiQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2dCkgPT4ge1xuICAgICAgICB2aXNpb24kLm5leHQoZXZ0LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB2aXNpb24kO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2NvbnRyb2xzLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQTtBQU9BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3Q0E7QUFDQTs7O0FBQUE7QUFDQTs7O0FBNkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nexports.default = function (destroy$, _ref) {\n var _ref$count = _ref.count,\n count = _ref$count === undefined ? 1 : _ref$count,\n id = _ref.id,\n _ref$maxCount = _ref.maxCount,\n maxCount = _ref$maxCount === undefined ? 10 : _ref$maxCount,\n _ref$showCircleContro = _ref.showCircleControl,\n showCircleControl = _ref$showCircleContro === undefined ? false : _ref$showCircleContro,\n _ref$showRandomizeCon = _ref.showRandomizeControl,\n showRandomizeControl = _ref$showRandomizeCon === undefined ? false : _ref$showRandomizeCon,\n _ref$showVisionGridCo = _ref.showVisionGridControl,\n showVisionGridControl = _ref$showVisionGridCo === undefined ? false : _ref$showVisionGridCo;\n\n var container = document.createElement('div');\n container.className = 'controlsContainer';\n container.id = 'controls' + id;\n document.getElementById(id).appendChild(container);\n\n var observables = {\n fps$: new _rxjs2.default.Subject(),\n count$: createCountControl(container, count, maxCount),\n speed$: createSpeedControl(container),\n circle$: showCircleControl && createCircleControl(container),\n randomize$: showRandomizeControl && createRandomizeControl(container),\n vision$: showVisionGridControl && createVisionGridControl(container),\n animating$: createAnimatingControl(container)\n };\n\n observables.animating$.subscribe(function (isAnimating) {\n if (isAnimating === true) {\n destroy$.next(id);\n observables.count$.next(count);\n }\n });\n\n destroy$.subscribe(function (sourceId) {\n if (id !== sourceId) {\n observables.animating$.next(false);\n observables.count$.next(0);\n }\n });\n\n return observables;\n};\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction createAnimatingControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-label';\n label.className = 'controls-animating';\n\n var text = document.createElement('span');\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.checked = false;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var animating$ = new _rxjs2.default.BehaviorSubject(false);\n\n label.addEventListener('change', function (evt) {\n animating$.next(evt.target.checked);\n });\n\n animating$.subscribe(function (isAnimating) {\n text.innerHTML = isAnimating ? '◼ Stop' : '▶ Start';\n checkbox.checked = isAnimating;\n });\n\n return animating$;\n}\n\nfunction createCountControl(container, initialValue, max) {\n var label = document.createElement('label');\n label.className = 'controls-range';\n\n var text = document.createElement('span');\n // text.innerHTML = (initialValue == 1) ? '1 particle' : `${initialValue} particles`;\n text.className = 'controls-range-text';\n\n var slider = document.createElement('input');\n slider.type = 'range';\n slider.min = 1;\n slider.max = max;\n slider.value = initialValue;\n slider.className = 'controls-range-input';\n\n label.appendChild(text);\n label.appendChild(slider);\n\n container.appendChild(label);\n\n var count$ = new _rxjs2.default.BehaviorSubject(initialValue);\n\n label.addEventListener('input', function (evt) {\n count$.next(evt.target.value * 1);\n });\n\n count$.subscribe(function (value) {\n console.warn('count changed! ', value);\n text.innerHTML = value === 1 ? '1 particle' : value + ' particles';\n });\n\n return count$;\n}\n\nfunction createSpeedControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-range';\n\n var text = document.createElement('span');\n text.className = 'controls-range-text';\n text.innerHTML = 'Speed: 0';\n\n var slider = document.createElement('input');\n slider.type = 'range';\n slider.min = 1;\n slider.max = 10;\n slider.value = 4;\n slider.className = 'controls-range-input';\n\n label.appendChild(text);\n label.appendChild(slider);\n\n container.appendChild(label);\n\n var speed$ = new _rxjs2.default.BehaviorSubject(slider.value);\n\n label.addEventListener('input', function (evt) {\n speed$.next(evt.target.value * 1);\n });\n\n speed$.subscribe(function (value) {\n text.innerHTML = 'Speed: ' + value;\n });\n\n return speed$;\n}\n\nfunction createCircleControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show movement circle';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var circle$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n circle$.next(evt.target.checked);\n });\n\n return circle$;\n}\n\nfunction createRandomizeControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Randomize movement';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var randomize$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n randomize$.next(evt.target.checked);\n });\n\n return randomize$;\n}\n\nfunction createVisionGridControl(container) {\n var label = document.createElement('label');\n label.className = 'controls-checkbox';\n\n var text = document.createElement('span');\n text.innerHTML = 'Show vision grid';\n text.className = 'controls-checkbox-text';\n\n var checkbox = document.createElement('input');\n checkbox.type = 'checkbox';\n checkbox.className = 'controls-checkbox-input';\n checkbox.checked = true;\n\n label.appendChild(checkbox);\n label.appendChild(text);\n\n container.appendChild(label);\n\n var vision$ = new _rxjs2.default.BehaviorSubject(true);\n\n label.addEventListener('change', function (evt) {\n vision$.next(evt.target.checked);\n });\n\n return vision$;\n}//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTQuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvY29udHJvbHMuanM/ZTk5YiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24oZGVzdHJveSQsIHtcbiAgICBjb3VudCA9IDEsXG4gICAgaWQsXG4gICAgbWF4Q291bnQgPSAxMCxcbiAgICBzaG93Q2lyY2xlQ29udHJvbCA9IGZhbHNlLFxuICAgIHNob3dSYW5kb21pemVDb250cm9sID0gZmFsc2UsXG4gICAgc2hvd1Zpc2lvbkdyaWRDb250cm9sID0gZmFsc2Vcbn0pIHtcbiAgICBjb25zdCBjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBjb250YWluZXIuY2xhc3NOYW1lID0gJ2NvbnRyb2xzQ29udGFpbmVyJztcbiAgICBjb250YWluZXIuaWQgPSBgY29udHJvbHMke2lkfWA7XG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLmFwcGVuZENoaWxkKGNvbnRhaW5lcik7XG5cbiAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHtcbiAgICAgICAgZnBzJDogbmV3IFJ4LlN1YmplY3QoKSxcbiAgICAgICAgY291bnQkOiBjcmVhdGVDb3VudENvbnRyb2woY29udGFpbmVyLCBjb3VudCwgbWF4Q291bnQpLFxuICAgICAgICBzcGVlZCQ6IGNyZWF0ZVNwZWVkQ29udHJvbChjb250YWluZXIpLFxuICAgICAgICBjaXJjbGUkOiBzaG93Q2lyY2xlQ29udHJvbCAmJiBjcmVhdGVDaXJjbGVDb250cm9sKGNvbnRhaW5lciksXG4gICAgICAgIHJhbmRvbWl6ZSQ6IHNob3dSYW5kb21pemVDb250cm9sICYmIGNyZWF0ZVJhbmRvbWl6ZUNvbnRyb2woY29udGFpbmVyKSxcbiAgICAgICAgdmlzaW9uJDogc2hvd1Zpc2lvbkdyaWRDb250cm9sICYmIGNyZWF0ZVZpc2lvbkdyaWRDb250cm9sKGNvbnRhaW5lciksXG4gICAgICAgIGFuaW1hdGluZyQ6IGNyZWF0ZUFuaW1hdGluZ0NvbnRyb2woY29udGFpbmVyKVxuICAgIH07XG5cbiAgICBvYnNlcnZhYmxlcy5hbmltYXRpbmckLnN1YnNjcmliZSgoaXNBbmltYXRpbmcpID0+IHtcbiAgICAgICAgaWYgKGlzQW5pbWF0aW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICBkZXN0cm95JC5uZXh0KGlkKTtcbiAgICAgICAgICAgIG9ic2VydmFibGVzLmNvdW50JC5uZXh0KGNvdW50KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgZGVzdHJveSQuc3Vic2NyaWJlKChzb3VyY2VJZCkgPT4ge1xuICAgICAgICBpZiAoaWQgIT09IHNvdXJjZUlkKSB7XG4gICAgICAgICAgICBvYnNlcnZhYmxlcy5hbmltYXRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgb2JzZXJ2YWJsZXMuY291bnQkLm5leHQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBvYnNlcnZhYmxlcztcbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVBbmltYXRpbmdDb250cm9sKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtbGFiZWwnO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1hbmltYXRpbmcnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jaGVja2VkID0gZmFsc2U7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXG4gICAgY29uc3QgYW5pbWF0aW5nJCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2dCkgPT4ge1xuICAgICAgICBhbmltYXRpbmckLm5leHQoZXZ0LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIGFuaW1hdGluZyQuc3Vic2NyaWJlKChpc0FuaW1hdGluZykgPT4ge1xuICAgICAgICB0ZXh0LmlubmVySFRNTCA9IChpc0FuaW1hdGluZyA/ICcmIzk3MjQ7IFN0b3AnIDogJyYjOTY1NDsgU3RhcnQnKTtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IGlzQW5pbWF0aW5nO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGFuaW1hdGluZyQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvdW50Q29udHJvbChjb250YWluZXIsIGluaXRpYWxWYWx1ZSwgbWF4KSB7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1yYW5nZSc7XG5cbiAgICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIC8vIHRleHQuaW5uZXJIVE1MID0gKGluaXRpYWxWYWx1ZSA9PSAxKSA/ICcxIHBhcnRpY2xlJyA6IGAke2luaXRpYWxWYWx1ZX0gcGFydGljbGVzYDtcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1yYW5nZS10ZXh0JztcblxuICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgc2xpZGVyLnR5cGUgPSAncmFuZ2UnO1xuICAgIHNsaWRlci5taW4gPSAxO1xuICAgIHNsaWRlci5tYXggPSBtYXg7XG4gICAgc2xpZGVyLnZhbHVlID0gaW5pdGlhbFZhbHVlO1xuICAgIHNsaWRlci5jbGFzc05hbWUgPSAnY29udHJvbHMtcmFuZ2UtaW5wdXQnO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoc2xpZGVyKTtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsYWJlbCk7XG5cbiAgICBjb25zdCBjb3VudCQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxWYWx1ZSk7XG5cbiAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldnQpID0+IHtcbiAgICAgICAgY291bnQkLm5leHQoZXZ0LnRhcmdldC52YWx1ZSAqIDEpO1xuICAgIH0pO1xuXG4gICAgY291bnQkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgY29uc29sZS53YXJuKCdjb3VudCBjaGFuZ2VkISAnLCB2YWx1ZSlcbiAgICAgICAgdGV4dC5pbm5lckhUTUwgPSAodmFsdWUgPT09IDEpID8gJzEgcGFydGljbGUnIDogYCR7dmFsdWV9IHBhcnRpY2xlc2A7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gY291bnQkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVTcGVlZENvbnRyb2woY29udGFpbmVyKSB7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1yYW5nZSc7XG5cbiAgICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLXJhbmdlLXRleHQnO1xuICAgIHRleHQuaW5uZXJIVE1MID0gJ1NwZWVkOiAwJztcblxuICAgIGNvbnN0IHNsaWRlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7XG4gICAgc2xpZGVyLnR5cGUgPSAncmFuZ2UnO1xuICAgIHNsaWRlci5taW4gPSAxO1xuICAgIHNsaWRlci5tYXggPSAxMDtcbiAgICBzbGlkZXIudmFsdWUgPSA0O1xuICAgIHNsaWRlci5jbGFzc05hbWUgPSAnY29udHJvbHMtcmFuZ2UtaW5wdXQnO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoc2xpZGVyKTtcblxuICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsYWJlbCk7XG5cbiAgICBjb25zdCBzcGVlZCQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHNsaWRlci52YWx1ZSk7XG5cbiAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsIChldnQpID0+IHtcbiAgICAgICAgc3BlZWQkLm5leHQoZXZ0LnRhcmdldC52YWx1ZSAqIDEpO1xuICAgIH0pO1xuXG4gICAgc3BlZWQkLnN1YnNjcmliZSgodmFsdWUpID0+IHtcbiAgICAgICAgdGV4dC5pbm5lckhUTUwgPSBgU3BlZWQ6ICR7dmFsdWV9YDtcbiAgICB9KTtcblxuICAgIHJldHVybiBzcGVlZCQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNpcmNsZUNvbnRyb2woY29udGFpbmVyKSB7XG4gICAgY29uc3QgbGFiZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsYWJlbCcpO1xuICAgIGxhYmVsLmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveCc7XG5cbiAgICBjb25zdCB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpO1xuICAgIHRleHQuaW5uZXJIVE1MID0gJ1Nob3cgbW92ZW1lbnQgY2lyY2xlJztcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC10ZXh0JztcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gtaW5wdXQnO1xuICAgIGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgIGNvbnN0IGNpcmNsZSQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2dCkgPT4ge1xuICAgICAgICBjaXJjbGUkLm5leHQoZXZ0LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiBjaXJjbGUkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSYW5kb21pemVDb250cm9sKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVySFRNTCA9ICdSYW5kb21pemUgbW92ZW1lbnQnO1xuICAgIHRleHQuY2xhc3NOYW1lID0gJ2NvbnRyb2xzLWNoZWNrYm94LXRleHQnO1xuXG4gICAgY29uc3QgY2hlY2tib3ggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpbnB1dCcpO1xuICAgIGNoZWNrYm94LnR5cGUgPSAnY2hlY2tib3gnO1xuICAgIGNoZWNrYm94LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC1pbnB1dCc7XG4gICAgY2hlY2tib3guY2hlY2tlZCA9IHRydWU7XG5cbiAgICBsYWJlbC5hcHBlbmRDaGlsZChjaGVja2JveCk7XG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQodGV4dCk7XG5cbiAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQobGFiZWwpO1xuXG4gICAgY29uc3QgcmFuZG9taXplJCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QodHJ1ZSk7XG5cbiAgICBsYWJlbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoZXZ0KSA9PiB7XG4gICAgICAgIHJhbmRvbWl6ZSQubmV4dChldnQudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHJhbmRvbWl6ZSQ7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWRDb250cm9sKGNvbnRhaW5lcikge1xuICAgIGNvbnN0IGxhYmVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGFiZWwnKTtcbiAgICBsYWJlbC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gnO1xuXG4gICAgY29uc3QgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTtcbiAgICB0ZXh0LmlubmVySFRNTCA9ICdTaG93IHZpc2lvbiBncmlkJztcbiAgICB0ZXh0LmNsYXNzTmFtZSA9ICdjb250cm9scy1jaGVja2JveC10ZXh0JztcblxuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW5wdXQnKTtcbiAgICBjaGVja2JveC50eXBlID0gJ2NoZWNrYm94JztcbiAgICBjaGVja2JveC5jbGFzc05hbWUgPSAnY29udHJvbHMtY2hlY2tib3gtaW5wdXQnO1xuICAgIGNoZWNrYm94LmNoZWNrZWQgPSB0cnVlO1xuXG4gICAgbGFiZWwuYXBwZW5kQ2hpbGQoY2hlY2tib3gpO1xuICAgIGxhYmVsLmFwcGVuZENoaWxkKHRleHQpO1xuXG4gICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGxhYmVsKTtcblxuICAgIGNvbnN0IHZpc2lvbiQgPSBuZXcgUnguQmVoYXZpb3JTdWJqZWN0KHRydWUpO1xuXG4gICAgbGFiZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKGV2dCkgPT4ge1xuICAgICAgICB2aXNpb24kLm5leHQoZXZ0LnRhcmdldC5jaGVja2VkKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB2aXNpb24kO1xufVxuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2NvbnRyb2xzLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFHQTtBQU9BO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBUEE7QUFDQTtBQVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUExQ0E7QUFDQTs7O0FBQUE7QUFDQTs7O0FBMENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 15 */ @@ -1066,7 +1066,7 @@ eval("// removed by extract-text-webpack-plugin//# sourceMappingURL=data:applica /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// \"How much of movement is in the correct direction\"\nvar rigidity = 0.9;\n// \"How close to the leader is enough\"\nvar sensitivity = 30;\n\nvar Arc = {\n create: function create(bounds, grid) {\n var arc = {\n centerX: _random2.default.num(0, bounds.width),\n centerY: _random2.default.num(0, bounds.height),\n clockwise: _random2.default.bool(),\n endX: 0,\n endY: 0,\n length: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360),\n prevEndX: 0,\n prevEndY: 0,\n radius: _random2.default.num(100, 200),\n speed: 0,\n theta: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n // If starting in a hazard, recurse.\n // if (grid.getPoint({ x: arc.endX, y: arc.endY, type: ENTITIES.HAZARD })) {\n // arc = Arc.create(bounds, grid);\n // }\n\n return arc;\n },\n\n step: function step(arc, bounds) {\n // Ensure constant velocity and theta between 0 and 2π.\n var delta = arc.speed / arc.radius;\n arc.length -= delta;\n\n arc.theta += arc.clockwise ? -delta : +delta;\n arc.theta = arc.theta > 0 ? arc.theta % _enums.RAD.t360 : _enums.RAD.t360 + arc.theta;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.prevEndX = arc.endX;\n arc.prevEndY = arc.endY;\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n return arc;\n },\n\n randomize: function randomize(arc) {\n arc.length = _random2.default.num(_enums.RAD.t90, _enums.RAD.t360);\n\n arc = Arc.changeRadius(arc, _random2.default.num(100, 200));\n\n if (_random2.default.bool(0.8)) {\n arc = Arc.reverse(arc);\n }\n\n return arc;\n },\n\n overflow: function overflow(arc, bounds) {\n if (arc.endX < 0) {\n arc.endX += bounds.width;\n arc.centerX += bounds.width;\n } else if (arc.endX > bounds.width) {\n arc.endX -= bounds.width;\n arc.centerX -= bounds.width;\n }\n\n if (arc.endY < 0) {\n arc.endY += bounds.height;\n arc.centerY += bounds.height;\n } else if (arc.endY > bounds.height) {\n arc.endY -= bounds.height;\n arc.centerY -= bounds.height;\n }\n\n return arc;\n },\n\n changeRadius: function changeRadius(arc, newRadius) {\n var r0 = arc.radius;\n var r1 = newRadius;\n\n // Moves arc center to new radius while keeping theta constant.\n arc.centerX -= (r1 - r0) * arc.cosTheta;\n arc.centerY += (r1 - r0) * arc.sinTheta;\n arc.radius = r1;\n\n return arc;\n },\n\n changeSpeed: function changeSpeed(arc, newSpeed) {\n arc.speed = newSpeed * 1;\n return arc;\n },\n\n reverse: function reverse(arc) {\n arc.clockwise = !arc.clockwise;\n\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.centerX -= 2 * arc.radius * arc.cosTheta;\n arc.centerY += 2 * arc.radius * arc.sinTheta;\n\n return arc;\n },\n\n follow: function follow(arc, arcToFollow) {\n var prevD = Math.pow(Math.pow(arcToFollow.endX - arc.prevEndX, 2) + Math.pow(arcToFollow.endY - arc.prevEndY, 2), 0.5);\n\n var currD = Math.pow(Math.pow(arcToFollow.endX - arc.endX, 2) + Math.pow(arcToFollow.endY - arc.endY, 2), 0.5);\n\n var rigidityCoeff = (prevD - currD) / arc.speed;\n\n if (currD < sensitivity) {\n arc = arc.clockwise !== arcToFollow.clockwise ? Arc.reverse(arc) : arc;\n arc = Arc.changeRadius(arc, arcToFollow.radius);\n\n if (arc.speed > arcToFollow.speed) {\n arc = Arc.changeSpeed(arc, arc.speed - 1);\n }if (arc.speed < arcToFollow.speed) {\n arc = Arc.changeSpeed(arc, arc.speed + 1);\n }\n } else if (rigidityCoeff < rigidity) {\n arc = Arc.changeRadius(arc, 20);\n\n if (arc.speed > arcToFollow.speed - 1) {\n arc = Arc.changeSpeed(arc, arc.speed - 1);\n }\n } else {\n arc = Arc.changeRadius(arc, 4000);\n\n if (arc.speed < arcToFollow.speed + 2) {\n arc = Arc.changeSpeed(arc, arc.speed + 1);\n }\n }\n\n return arc;\n },\n\n evade: function evade(arc) {\n arc = Arc.changeRadius(arc, 20);\n arc.length = 1;\n\n return arc;\n }\n};\n\nexports.default = Arc;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYXJjLmpzPzliNWYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5USVRJRVMsIFJBRCB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vIFwiSG93IG11Y2ggb2YgbW92ZW1lbnQgaXMgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uXCJcbmNvbnN0IHJpZ2lkaXR5ID0gMC45O1xuLy8gXCJIb3cgY2xvc2UgdG8gdGhlIGxlYWRlciBpcyBlbm91Z2hcIlxuY29uc3Qgc2Vuc2l0aXZpdHkgPSAzMDtcblxuY29uc3QgQXJjID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oYm91bmRzLCBncmlkKSB7XG4gICAgICAgIGxldCBhcmMgPSB7XG4gICAgICAgICAgICBjZW50ZXJYOiBSYW5kb20ubnVtKDAsIGJvdW5kcy53aWR0aCksXG4gICAgICAgICAgICBjZW50ZXJZOiBSYW5kb20ubnVtKDAsIGJvdW5kcy5oZWlnaHQpLFxuICAgICAgICAgICAgY2xvY2t3aXNlOiBSYW5kb20uYm9vbCgpLFxuICAgICAgICAgICAgZW5kWDogMCxcbiAgICAgICAgICAgIGVuZFk6IDAsXG4gICAgICAgICAgICBsZW5ndGg6IFJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApLFxuICAgICAgICAgICAgcHJldkVuZFg6IDAsXG4gICAgICAgICAgICBwcmV2RW5kWTogMCxcbiAgICAgICAgICAgIHJhZGl1czogUmFuZG9tLm51bSgxMDAsIDIwMCksXG4gICAgICAgICAgICBzcGVlZDogMCxcbiAgICAgICAgICAgIHRoZXRhOiBSYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKVxuICAgICAgICB9O1xuXG4gICAgICAgIGFyYy5jb3NUaGV0YSA9IE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgICAgIGFyYy5zaW5UaGV0YSA9IE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLmVuZFggPSBhcmMuY2VudGVyWCArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5lbmRZID0gYXJjLmNlbnRlclkgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIGFyYyA9IEFyYy5vdmVyZmxvdyhhcmMsIGJvdW5kcyk7XG5cbiAgICAgICAgLy8gSWYgc3RhcnRpbmcgaW4gYSBoYXphcmQsIHJlY3Vyc2UuXG4gICAgICAgIC8vIGlmIChncmlkLmdldFBvaW50KHsgeDogYXJjLmVuZFgsIHk6IGFyYy5lbmRZLCB0eXBlOiBFTlRJVElFUy5IQVpBUkQgfSkpIHtcbiAgICAgICAgLy8gICAgIGFyYyA9IEFyYy5jcmVhdGUoYm91bmRzLCBncmlkKTtcbiAgICAgICAgLy8gfVxuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIHN0ZXA6IGZ1bmN0aW9uKGFyYywgYm91bmRzKSB7XG4gICAgICAgIC8vIEVuc3VyZSBjb25zdGFudCB2ZWxvY2l0eSBhbmQgdGhldGEgYmV0d2VlbiAwIGFuZCAyz4AuXG4gICAgICAgIGNvbnN0IGRlbHRhID0gYXJjLnNwZWVkIC8gYXJjLnJhZGl1cztcbiAgICAgICAgYXJjLmxlbmd0aCAtPSBkZWx0YTtcblxuICAgICAgICBhcmMudGhldGEgKz0gKGFyYy5jbG9ja3dpc2UgPyAtZGVsdGEgOiArZGVsdGEpO1xuICAgICAgICBhcmMudGhldGEgPSAoYXJjLnRoZXRhID4gMCA/IGFyYy50aGV0YSAlIFJBRC50MzYwIDogUkFELnQzNjAgKyBhcmMudGhldGEpO1xuXG4gICAgICAgIGFyYy5jb3NUaGV0YSA9IE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgICAgIGFyYy5zaW5UaGV0YSA9IE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLnByZXZFbmRYID0gYXJjLmVuZFg7XG4gICAgICAgIGFyYy5wcmV2RW5kWSA9IGFyYy5lbmRZO1xuXG4gICAgICAgIGFyYy5lbmRYID0gYXJjLmNlbnRlclggKyBhcmMucmFkaXVzICogYXJjLmNvc1RoZXRhO1xuICAgICAgICBhcmMuZW5kWSA9IGFyYy5jZW50ZXJZIC0gYXJjLnJhZGl1cyAqIGFyYy5zaW5UaGV0YTtcblxuICAgICAgICBhcmMgPSBBcmMub3ZlcmZsb3coYXJjLCBib3VuZHMpO1xuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIHJhbmRvbWl6ZTogZnVuY3Rpb24oYXJjKSB7XG4gICAgICAgIGFyYy5sZW5ndGggPSBSYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKTtcblxuICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgUmFuZG9tLm51bSgxMDAsIDIwMCkpO1xuXG4gICAgICAgIGlmIChSYW5kb20uYm9vbCgwLjgpKSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMucmV2ZXJzZShhcmMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgb3ZlcmZsb3c6IGZ1bmN0aW9uKGFyYywgYm91bmRzKSB7XG4gICAgICAgIGlmIChhcmMuZW5kWCA8IDApIHtcbiAgICAgICAgICAgIGFyYy5lbmRYICs9IGJvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJYICs9IGJvdW5kcy53aWR0aFxuICAgICAgICB9IGVsc2UgaWYgKGFyYy5lbmRYID4gYm91bmRzLndpZHRoKSB7XG4gICAgICAgICAgICBhcmMuZW5kWCAtPSBib3VuZHMud2lkdGg7XG4gICAgICAgICAgICBhcmMuY2VudGVyWCAtPSBib3VuZHMud2lkdGhcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhcmMuZW5kWSA8IDApIHtcbiAgICAgICAgICAgIGFyYy5lbmRZICs9IGJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICBhcmMuY2VudGVyWSArPSBib3VuZHMuaGVpZ2h0XG4gICAgICAgIH0gZWxzZSBpZiAoYXJjLmVuZFkgPiBib3VuZHMuaGVpZ2h0KSB7XG4gICAgICAgICAgICBhcmMuZW5kWSAtPSBib3VuZHMuaGVpZ2h0O1xuICAgICAgICAgICAgYXJjLmNlbnRlclkgLT0gYm91bmRzLmhlaWdodFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgY2hhbmdlUmFkaXVzOiBmdW5jdGlvbihhcmMsIG5ld1JhZGl1cykge1xuICAgICAgICBjb25zdCByMCA9IGFyYy5yYWRpdXM7XG4gICAgICAgIGNvbnN0IHIxID0gbmV3UmFkaXVzO1xuXG4gICAgICAgIC8vIE1vdmVzIGFyYyBjZW50ZXIgdG8gbmV3IHJhZGl1cyB3aGlsZSBrZWVwaW5nIHRoZXRhIGNvbnN0YW50LlxuICAgICAgICBhcmMuY2VudGVyWCAtPSAocjEgLSByMCkgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5jZW50ZXJZICs9IChyMSAtIHIwKSAqIGFyYy5zaW5UaGV0YTtcbiAgICAgICAgYXJjLnJhZGl1cyA9IHIxO1xuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIGNoYW5nZVNwZWVkOiBmdW5jdGlvbihhcmMsIG5ld1NwZWVkKSB7XG4gICAgICAgIGFyYy5zcGVlZCA9IG5ld1NwZWVkICogMTtcbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24oYXJjKSB7XG4gICAgICAgIGFyYy5jbG9ja3dpc2UgPSAhYXJjLmNsb2Nrd2lzZTtcblxuICAgICAgICBhcmMudGhldGEgPSAoYXJjLnRoZXRhICsgUkFELnQxODApICUgUkFELnQzNjA7XG5cbiAgICAgICAgYXJjLmNvc1RoZXRhID0gTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICAgICAgYXJjLnNpblRoZXRhID0gTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgICAgICBhcmMuY2VudGVyWCAtPSAoMiAqIGFyYy5yYWRpdXMpICogYXJjLmNvc1RoZXRhO1xuICAgICAgICBhcmMuY2VudGVyWSArPSAoMiAqIGFyYy5yYWRpdXMpICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfSxcblxuICAgIGZvbGxvdzogZnVuY3Rpb24oYXJjLCBhcmNUb0ZvbGxvdykge1xuICAgICAgICBjb25zdCBwcmV2RCA9IE1hdGgucG93KFxuICAgICAgICAgICAgTWF0aC5wb3coYXJjVG9Gb2xsb3cuZW5kWCAtIGFyYy5wcmV2RW5kWCwgMikgK1xuICAgICAgICAgICAgTWF0aC5wb3coYXJjVG9Gb2xsb3cuZW5kWSAtIGFyYy5wcmV2RW5kWSwgMilcbiAgICAgICAgLCAwLjUpO1xuXG4gICAgICAgIGNvbnN0IGN1cnJEID0gTWF0aC5wb3coXG4gICAgICAgICAgICBNYXRoLnBvdyhhcmNUb0ZvbGxvdy5lbmRYIC0gYXJjLmVuZFgsIDIpICtcbiAgICAgICAgICAgICBNYXRoLnBvdyhhcmNUb0ZvbGxvdy5lbmRZIC0gYXJjLmVuZFksIDIpXG4gICAgICAgICwgMC41KTtcblxuICAgICAgICBjb25zdCByaWdpZGl0eUNvZWZmID0gKHByZXZEIC0gY3VyckQpIC8gYXJjLnNwZWVkO1xuXG4gICAgICAgIGlmIChjdXJyRCA8IHNlbnNpdGl2aXR5KSB7XG4gICAgICAgICAgICBhcmMgPSAoYXJjLmNsb2Nrd2lzZSAhPT0gYXJjVG9Gb2xsb3cuY2xvY2t3aXNlID8gQXJjLnJldmVyc2UoYXJjKSA6IGFyYyk7XG4gICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgYXJjVG9Gb2xsb3cucmFkaXVzKTtcblxuICAgICAgICAgICAgaWYgKGFyYy5zcGVlZCA+IGFyY1RvRm9sbG93LnNwZWVkKSB7XG4gICAgICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVNwZWVkKGFyYywgYXJjLnNwZWVkIC0gMSk7XG4gICAgICAgICAgICB9IGlmIChhcmMuc3BlZWQgPCBhcmNUb0ZvbGxvdy5zcGVlZCkge1xuICAgICAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VTcGVlZChhcmMsIGFyYy5zcGVlZCArIDEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSBpZiAocmlnaWRpdHlDb2VmZiA8IHJpZ2lkaXR5KSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgMjApO1xuXG4gICAgICAgICAgICBpZiAoYXJjLnNwZWVkID4gYXJjVG9Gb2xsb3cuc3BlZWQgLSAxKSB7XG4gICAgICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVNwZWVkKGFyYywgYXJjLnNwZWVkIC0gMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgNDAwMCk7XG5cbiAgICAgICAgICAgIGlmIChhcmMuc3BlZWQgPCAoYXJjVG9Gb2xsb3cuc3BlZWQgKyAyKSkge1xuICAgICAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VTcGVlZChhcmMsIGFyYy5zcGVlZCArIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgZXZhZGU6IGZ1bmN0aW9uKGFyYykge1xuICAgICAgICBhcmMgPSBBcmMuY2hhbmdlUmFkaXVzKGFyYywgMjApO1xuICAgICAgICBhcmMubGVuZ3RoID0gMTtcblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXJjO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL2FyYy5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTtBQUFBO0FBQ0E7Ozs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFYQTtBQUNBO0FBYUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQWxLQTtBQUNBO0FBb0tBIiwic291cmNlUm9vdCI6IiJ9"); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// \"How much of movement is in the correct direction\"\nvar rigidity = 0.9;\n// \"How close to the leader is enough\"\nvar sensitivity = 30;\n\nvar Arc = {\n create: function create(bounds) {\n var arc = {\n centerX: _random2.default.num(0, bounds.width),\n centerY: _random2.default.num(0, bounds.height),\n clockwise: _random2.default.bool(),\n endX: 0,\n endY: 0,\n length: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360),\n prevEndX: 0,\n prevEndY: 0,\n radius: _random2.default.num(100, 200),\n speed: 0,\n theta: _random2.default.num(_enums.RAD.t90, _enums.RAD.t360)\n };\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n return arc;\n },\n\n step: function step(arc, bounds) {\n // Ensure constant velocity and theta between 0 and 2π.\n var delta = arc.speed / arc.radius;\n arc.length -= delta;\n\n arc.theta += arc.clockwise ? -delta : +delta;\n arc.theta = arc.theta > 0 ? arc.theta % _enums.RAD.t360 : _enums.RAD.t360 + arc.theta;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.prevEndX = arc.endX;\n arc.prevEndY = arc.endY;\n\n arc.endX = arc.centerX + arc.radius * arc.cosTheta;\n arc.endY = arc.centerY - arc.radius * arc.sinTheta;\n\n arc = Arc.overflow(arc, bounds);\n\n return arc;\n },\n\n randomize: function randomize(arc) {\n arc.length = _random2.default.num(_enums.RAD.t90, _enums.RAD.t360);\n\n arc = Arc.changeRadius(arc, _random2.default.num(100, 200));\n\n if (_random2.default.bool(0.8)) {\n arc = Arc.reverse(arc);\n }\n\n return arc;\n },\n\n overflow: function overflow(arc, bounds) {\n if (arc.endX < 0) {\n arc.endX += bounds.width;\n arc.centerX += bounds.width;\n } else if (arc.endX > bounds.width) {\n arc.endX -= bounds.width;\n arc.centerX -= bounds.width;\n }\n\n if (arc.endY < 0) {\n arc.endY += bounds.height;\n arc.centerY += bounds.height;\n } else if (arc.endY > bounds.height) {\n arc.endY -= bounds.height;\n arc.centerY -= bounds.height;\n }\n\n return arc;\n },\n\n changeRadius: function changeRadius(arc, newRadius) {\n var r0 = arc.radius;\n var r1 = newRadius;\n\n // Moves arc center to new radius while keeping theta constant.\n arc.centerX -= (r1 - r0) * arc.cosTheta;\n arc.centerY += (r1 - r0) * arc.sinTheta;\n arc.radius = r1;\n\n return arc;\n },\n\n changeSpeed: function changeSpeed(arc, newSpeed) {\n arc.speed = newSpeed * 1;\n return arc;\n },\n\n reverse: function reverse(arc) {\n arc.clockwise = !arc.clockwise;\n\n arc.theta = (arc.theta + _enums.RAD.t180) % _enums.RAD.t360;\n\n arc.cosTheta = Math.cos(arc.theta);\n arc.sinTheta = Math.sin(arc.theta);\n\n arc.centerX -= 2 * arc.radius * arc.cosTheta;\n arc.centerY += 2 * arc.radius * arc.sinTheta;\n\n return arc;\n },\n\n follow: function follow(arc, arcToFollow) {\n var prevD = Math.pow(Math.pow(arcToFollow.endX - arc.prevEndX, 2) + Math.pow(arcToFollow.endY - arc.prevEndY, 2), 0.5);\n\n var currD = Math.pow(Math.pow(arcToFollow.endX - arc.endX, 2) + Math.pow(arcToFollow.endY - arc.endY, 2), 0.5);\n\n var rigidityCoeff = (prevD - currD) / arc.speed;\n\n if (currD < sensitivity) {\n arc = arc.clockwise !== arcToFollow.clockwise ? Arc.reverse(arc) : arc;\n arc = Arc.changeRadius(arc, arcToFollow.radius);\n\n if (arc.speed > arcToFollow.speed) {\n arc = Arc.changeSpeed(arc, arc.speed - 1);\n }if (arc.speed < arcToFollow.speed) {\n arc = Arc.changeSpeed(arc, arc.speed + 1);\n }\n } else if (rigidityCoeff < rigidity) {\n arc = Arc.changeRadius(arc, 20);\n\n if (arc.speed > arcToFollow.speed - 1) {\n arc = Arc.changeSpeed(arc, arc.speed - 1);\n }\n } else {\n arc = Arc.changeRadius(arc, 4000);\n\n if (arc.speed < arcToFollow.speed + 2) {\n arc = Arc.changeSpeed(arc, arc.speed + 1);\n }\n }\n\n return arc;\n },\n\n evade: function evade(arc) {\n arc = Arc.changeRadius(arc, 20);\n arc.length = 1;\n\n return arc;\n }\n};\n\nexports.default = Arc;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYXJjLmpzPzliNWYiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRU5USVRJRVMsIFJBRCB9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vIFwiSG93IG11Y2ggb2YgbW92ZW1lbnQgaXMgaW4gdGhlIGNvcnJlY3QgZGlyZWN0aW9uXCJcbmNvbnN0IHJpZ2lkaXR5ID0gMC45O1xuLy8gXCJIb3cgY2xvc2UgdG8gdGhlIGxlYWRlciBpcyBlbm91Z2hcIlxuY29uc3Qgc2Vuc2l0aXZpdHkgPSAzMDtcblxuY29uc3QgQXJjID0ge1xuICAgIGNyZWF0ZTogZnVuY3Rpb24oYm91bmRzKSB7XG4gICAgICAgIGxldCBhcmMgPSB7XG4gICAgICAgICAgICBjZW50ZXJYOiBSYW5kb20ubnVtKDAsIGJvdW5kcy53aWR0aCksXG4gICAgICAgICAgICBjZW50ZXJZOiBSYW5kb20ubnVtKDAsIGJvdW5kcy5oZWlnaHQpLFxuICAgICAgICAgICAgY2xvY2t3aXNlOiBSYW5kb20uYm9vbCgpLFxuICAgICAgICAgICAgZW5kWDogMCxcbiAgICAgICAgICAgIGVuZFk6IDAsXG4gICAgICAgICAgICBsZW5ndGg6IFJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApLFxuICAgICAgICAgICAgcHJldkVuZFg6IDAsXG4gICAgICAgICAgICBwcmV2RW5kWTogMCxcbiAgICAgICAgICAgIHJhZGl1czogUmFuZG9tLm51bSgxMDAsIDIwMCksXG4gICAgICAgICAgICBzcGVlZDogMCxcbiAgICAgICAgICAgIHRoZXRhOiBSYW5kb20ubnVtKFJBRC50OTAsIFJBRC50MzYwKVxuICAgICAgICB9O1xuXG4gICAgICAgIGFyYy5jb3NUaGV0YSA9IE1hdGguY29zKGFyYy50aGV0YSk7XG4gICAgICAgIGFyYy5zaW5UaGV0YSA9IE1hdGguc2luKGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLmVuZFggPSBhcmMuY2VudGVyWCArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5lbmRZID0gYXJjLmNlbnRlclkgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIGFyYyA9IEFyYy5vdmVyZmxvdyhhcmMsIGJvdW5kcyk7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgc3RlcDogZnVuY3Rpb24oYXJjLCBib3VuZHMpIHtcbiAgICAgICAgLy8gRW5zdXJlIGNvbnN0YW50IHZlbG9jaXR5IGFuZCB0aGV0YSBiZXR3ZWVuIDAgYW5kIDLPgC5cbiAgICAgICAgY29uc3QgZGVsdGEgPSBhcmMuc3BlZWQgLyBhcmMucmFkaXVzO1xuICAgICAgICBhcmMubGVuZ3RoIC09IGRlbHRhO1xuXG4gICAgICAgIGFyYy50aGV0YSArPSAoYXJjLmNsb2Nrd2lzZSA/IC1kZWx0YSA6ICtkZWx0YSk7XG4gICAgICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgPiAwID8gYXJjLnRoZXRhICUgUkFELnQzNjAgOiBSQUQudDM2MCArIGFyYy50aGV0YSk7XG5cbiAgICAgICAgYXJjLmNvc1RoZXRhID0gTWF0aC5jb3MoYXJjLnRoZXRhKTtcbiAgICAgICAgYXJjLnNpblRoZXRhID0gTWF0aC5zaW4oYXJjLnRoZXRhKTtcblxuICAgICAgICBhcmMucHJldkVuZFggPSBhcmMuZW5kWDtcbiAgICAgICAgYXJjLnByZXZFbmRZID0gYXJjLmVuZFk7XG5cbiAgICAgICAgYXJjLmVuZFggPSBhcmMuY2VudGVyWCArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5lbmRZID0gYXJjLmNlbnRlclkgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhO1xuXG4gICAgICAgIGFyYyA9IEFyYy5vdmVyZmxvdyhhcmMsIGJvdW5kcyk7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgcmFuZG9taXplOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgYXJjLmxlbmd0aCA9IFJhbmRvbS5udW0oUkFELnQ5MCwgUkFELnQzNjApO1xuXG4gICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCBSYW5kb20ubnVtKDEwMCwgMjAwKSk7XG5cbiAgICAgICAgaWYgKFJhbmRvbS5ib29sKDAuOCkpIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5yZXZlcnNlKGFyYyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBvdmVyZmxvdzogZnVuY3Rpb24oYXJjLCBib3VuZHMpIHtcbiAgICAgICAgaWYgKGFyYy5lbmRYIDwgMCkge1xuICAgICAgICAgICAgYXJjLmVuZFggKz0gYm91bmRzLndpZHRoO1xuICAgICAgICAgICAgYXJjLmNlbnRlclggKz0gYm91bmRzLndpZHRoXG4gICAgICAgIH0gZWxzZSBpZiAoYXJjLmVuZFggPiBib3VuZHMud2lkdGgpIHtcbiAgICAgICAgICAgIGFyYy5lbmRYIC09IGJvdW5kcy53aWR0aDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJYIC09IGJvdW5kcy53aWR0aFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFyYy5lbmRZIDwgMCkge1xuICAgICAgICAgICAgYXJjLmVuZFkgKz0gYm91bmRzLmhlaWdodDtcbiAgICAgICAgICAgIGFyYy5jZW50ZXJZICs9IGJvdW5kcy5oZWlnaHRcbiAgICAgICAgfSBlbHNlIGlmIChhcmMuZW5kWSA+IGJvdW5kcy5oZWlnaHQpIHtcbiAgICAgICAgICAgIGFyYy5lbmRZIC09IGJvdW5kcy5oZWlnaHQ7XG4gICAgICAgICAgICBhcmMuY2VudGVyWSAtPSBib3VuZHMuaGVpZ2h0XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VSYWRpdXM6IGZ1bmN0aW9uKGFyYywgbmV3UmFkaXVzKSB7XG4gICAgICAgIGNvbnN0IHIwID0gYXJjLnJhZGl1cztcbiAgICAgICAgY29uc3QgcjEgPSBuZXdSYWRpdXM7XG5cbiAgICAgICAgLy8gTW92ZXMgYXJjIGNlbnRlciB0byBuZXcgcmFkaXVzIHdoaWxlIGtlZXBpbmcgdGhldGEgY29uc3RhbnQuXG4gICAgICAgIGFyYy5jZW50ZXJYIC09IChyMSAtIHIwKSAqIGFyYy5jb3NUaGV0YTtcbiAgICAgICAgYXJjLmNlbnRlclkgKz0gKHIxIC0gcjApICogYXJjLnNpblRoZXRhO1xuICAgICAgICBhcmMucmFkaXVzID0gcjE7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgY2hhbmdlU3BlZWQ6IGZ1bmN0aW9uKGFyYywgbmV3U3BlZWQpIHtcbiAgICAgICAgYXJjLnNwZWVkID0gbmV3U3BlZWQgKiAxO1xuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICByZXZlcnNlOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgICAgYXJjLmNsb2Nrd2lzZSA9ICFhcmMuY2xvY2t3aXNlO1xuXG4gICAgICAgIGFyYy50aGV0YSA9IChhcmMudGhldGEgKyBSQUQudDE4MCkgJSBSQUQudDM2MDtcblxuICAgICAgICBhcmMuY29zVGhldGEgPSBNYXRoLmNvcyhhcmMudGhldGEpO1xuICAgICAgICBhcmMuc2luVGhldGEgPSBNYXRoLnNpbihhcmMudGhldGEpO1xuXG4gICAgICAgIGFyYy5jZW50ZXJYIC09ICgyICogYXJjLnJhZGl1cykgKiBhcmMuY29zVGhldGE7XG4gICAgICAgIGFyYy5jZW50ZXJZICs9ICgyICogYXJjLnJhZGl1cykgKiBhcmMuc2luVGhldGE7XG5cbiAgICAgICAgcmV0dXJuIGFyYztcbiAgICB9LFxuXG4gICAgZm9sbG93OiBmdW5jdGlvbihhcmMsIGFyY1RvRm9sbG93KSB7XG4gICAgICAgIGNvbnN0IHByZXZEID0gTWF0aC5wb3coXG4gICAgICAgICAgICBNYXRoLnBvdyhhcmNUb0ZvbGxvdy5lbmRYIC0gYXJjLnByZXZFbmRYLCAyKSArXG4gICAgICAgICAgICBNYXRoLnBvdyhhcmNUb0ZvbGxvdy5lbmRZIC0gYXJjLnByZXZFbmRZLCAyKVxuICAgICAgICAsIDAuNSk7XG5cbiAgICAgICAgY29uc3QgY3VyckQgPSBNYXRoLnBvdyhcbiAgICAgICAgICAgIE1hdGgucG93KGFyY1RvRm9sbG93LmVuZFggLSBhcmMuZW5kWCwgMikgK1xuICAgICAgICAgICAgIE1hdGgucG93KGFyY1RvRm9sbG93LmVuZFkgLSBhcmMuZW5kWSwgMilcbiAgICAgICAgLCAwLjUpO1xuXG4gICAgICAgIGNvbnN0IHJpZ2lkaXR5Q29lZmYgPSAocHJldkQgLSBjdXJyRCkgLyBhcmMuc3BlZWQ7XG5cbiAgICAgICAgaWYgKGN1cnJEIDwgc2Vuc2l0aXZpdHkpIHtcbiAgICAgICAgICAgIGFyYyA9IChhcmMuY2xvY2t3aXNlICE9PSBhcmNUb0ZvbGxvdy5jbG9ja3dpc2UgPyBBcmMucmV2ZXJzZShhcmMpIDogYXJjKTtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCBhcmNUb0ZvbGxvdy5yYWRpdXMpO1xuXG4gICAgICAgICAgICBpZiAoYXJjLnNwZWVkID4gYXJjVG9Gb2xsb3cuc3BlZWQpIHtcbiAgICAgICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlU3BlZWQoYXJjLCBhcmMuc3BlZWQgLSAxKTtcbiAgICAgICAgICAgIH0gaWYgKGFyYy5zcGVlZCA8IGFyY1RvRm9sbG93LnNwZWVkKSB7XG4gICAgICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVNwZWVkKGFyYywgYXJjLnNwZWVkICsgMSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChyaWdpZGl0eUNvZWZmIDwgcmlnaWRpdHkpIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCAyMCk7XG5cbiAgICAgICAgICAgIGlmIChhcmMuc3BlZWQgPiBhcmNUb0ZvbGxvdy5zcGVlZCAtIDEpIHtcbiAgICAgICAgICAgICAgICBhcmMgPSBBcmMuY2hhbmdlU3BlZWQoYXJjLCBhcmMuc3BlZWQgLSAxKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCA0MDAwKTtcblxuICAgICAgICAgICAgaWYgKGFyYy5zcGVlZCA8IChhcmNUb0ZvbGxvdy5zcGVlZCArIDIpKSB7XG4gICAgICAgICAgICAgICAgYXJjID0gQXJjLmNoYW5nZVNwZWVkKGFyYywgYXJjLnNwZWVkICsgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXJjO1xuICAgIH0sXG5cbiAgICBldmFkZTogZnVuY3Rpb24oYXJjKSB7XG4gICAgICAgIGFyYyA9IEFyYy5jaGFuZ2VSYWRpdXMoYXJjLCAyMCk7XG4gICAgICAgIGFyYy5sZW5ndGggPSAxO1xuXG4gICAgICAgIHJldHVybiBhcmM7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBBcmM7XG5cblxuXG4vLyBXRUJQQUNLIEZPT1RFUiAvL1xuLy8ganMvYXJjLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBO0FBQUE7QUFDQTs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQVhBO0FBQ0E7QUFhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFJQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUE3SkE7QUFDQTtBQStKQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 84 */ @@ -1090,7 +1090,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _animation1a = __webpack_require__(/*! ./animation1a */ 73);\n\nvar _animation1a2 = _interopRequireDefault(_animation1a);\n\nvar _animation1b = __webpack_require__(/*! ./animation1b */ 74);\n\nvar _animation1b2 = _interopRequireDefault(_animation1b);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nvar _animation3a = __webpack_require__(/*! ./animation3a */ 77);\n\nvar _animation3a2 = _interopRequireDefault(_animation3a);\n\nvar _animation3b = __webpack_require__(/*! ./animation3b */ 78);\n\nvar _animation3b2 = _interopRequireDefault(_animation3b);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(/*! ../css/reset.scss */ 82);\n__webpack_require__(/*! ../css/index.scss */ 80);\n__webpack_require__(/*! ../css/particle.scss */ 81);\n__webpack_require__(/*! ../css/controls.scss */ 79);\n\nwindow.addEventListener('load', function () {\n var destroy$ = new _rxjs2.default.BehaviorSubject(null);\n\n window.addEventListener('blur', function () {\n destroy$.next('all');\n });\n\n (0, _animation1a2.default)(destroy$);\n (0, _animation1b2.default)(destroy$);\n (0, _animation2a2.default)(destroy$);\n (0, _animation2b2.default)(destroy$);\n (0, _animation3a2.default)(destroy$);\n (0, _animation3b2.default)(destroy$);\n});\n\n// TODO remove bottom padding from Disqus\n// TODO sort out particle nextframe\n// TODO abs positioning on controls elements so order doesn't matter\n// TODO BehaviorSubject listener on bounds change\n// TODO are vision grid nodes removed properly\n// TODO grid touches\n// TODO start with n particles doesn't update slider\n// TODO leader not quite right, if 2 particles, sometimes ignored\n// TODO Randomize leaders every 30 sec\n\n// INTERESTING CONTROLS:\n// sensitivity\n// rigidity\n// show leaders\n\n// TURN THE CORRECT DIRECTION - HUGE EFFICIENCY INCREASE//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuaW1wb3J0IEFuaW1hdGlvbjNiIGZyb20gJy4vYW5pbWF0aW9uM2InO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICBjb25zdCBkZXN0cm95JCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgZGVzdHJveSQubmV4dCgnYWxsJyk7XG4gICAgfSk7XG5cbiAgICBBbmltYXRpb24xYShkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uMWIoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjJhKGRlc3Ryb3kkKTtcbiAgICBBbmltYXRpb24yYihkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uM2EoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjNiKGRlc3Ryb3kkKTtcbn0pO1xuXG4vLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuLy8gVE9ETyBzb3J0IG91dCBwYXJ0aWNsZSBuZXh0ZnJhbWVcbi8vIFRPRE8gYWJzIHBvc2l0aW9uaW5nIG9uIGNvbnRyb2xzIGVsZW1lbnRzIHNvIG9yZGVyIGRvZXNuJ3QgbWF0dGVyXG4vLyBUT0RPIEJlaGF2aW9yU3ViamVjdCBsaXN0ZW5lciBvbiBib3VuZHMgY2hhbmdlXG4vLyBUT0RPIGFyZSB2aXNpb24gZ3JpZCBub2RlcyByZW1vdmVkIHByb3Blcmx5XG4vLyBUT0RPIGdyaWQgdG91Y2hlc1xuLy8gVE9ETyBzdGFydCB3aXRoIG4gcGFydGljbGVzIGRvZXNuJ3QgdXBkYXRlIHNsaWRlclxuLy8gVE9ETyBsZWFkZXIgbm90IHF1aXRlIHJpZ2h0LCBpZiAyIHBhcnRpY2xlcywgc29tZXRpbWVzIGlnbm9yZWRcbi8vIFRPRE8gUmFuZG9taXplIGxlYWRlcnMgZXZlcnkgMzAgc2VjXG5cbi8vIElOVEVSRVNUSU5HIENPTlRST0xTOlxuLy8gc2Vuc2l0aXZpdHlcbi8vIHJpZ2lkaXR5XG4vLyBzaG93IGxlYWRlcnNcblxuLy8gVFVSTiBUSEUgQ09SUkVDVCBESVJFQ1RJT04gLSBIVUdFIEVGRklDSUVOQ1kgSU5DUkVBU0VcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9pbmRleC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _animation1a = __webpack_require__(/*! ./animation1a */ 73);\n\nvar _animation1a2 = _interopRequireDefault(_animation1a);\n\nvar _animation1b = __webpack_require__(/*! ./animation1b */ 74);\n\nvar _animation1b2 = _interopRequireDefault(_animation1b);\n\nvar _animation2a = __webpack_require__(/*! ./animation2a */ 75);\n\nvar _animation2a2 = _interopRequireDefault(_animation2a);\n\nvar _animation2b = __webpack_require__(/*! ./animation2b */ 76);\n\nvar _animation2b2 = _interopRequireDefault(_animation2b);\n\nvar _animation3a = __webpack_require__(/*! ./animation3a */ 77);\n\nvar _animation3a2 = _interopRequireDefault(_animation3a);\n\nvar _animation3b = __webpack_require__(/*! ./animation3b */ 78);\n\nvar _animation3b2 = _interopRequireDefault(_animation3b);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n__webpack_require__(/*! ../css/reset.scss */ 82);\n__webpack_require__(/*! ../css/index.scss */ 80);\n__webpack_require__(/*! ../css/particle.scss */ 81);\n__webpack_require__(/*! ../css/controls.scss */ 79);\n\nwindow.addEventListener('load', function () {\n var destroy$ = new _rxjs2.default.BehaviorSubject(null);\n\n window.addEventListener('blur', function () {\n destroy$.next('all');\n });\n\n (0, _animation1a2.default)(destroy$);\n (0, _animation1b2.default)(destroy$);\n (0, _animation2a2.default)(destroy$);\n (0, _animation2b2.default)(destroy$);\n (0, _animation3a2.default)(destroy$);\n (0, _animation3b2.default)(destroy$);\n});\n\n// TODO remove bottom padding from Disqus\n// TODO sort out particle nextframe\n// TODO abs positioning on controls elements so order doesn't matter\n// TODO grid touches\n// TODO leader not quite right, if 2 particles, sometimes ignored\n// TODO Randomize leaders every 30 sec\n\n// INTERESTING CONTROLS:\n// sensitivity\n// rigidity\n// show leaders\n\n// TURN THE CORRECT DIRECTION - HUGE EFFICIENCY INCREASE//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvaW5kZXguanM/NDJmNiJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IEFuaW1hdGlvbjFhIGZyb20gJy4vYW5pbWF0aW9uMWEnO1xuaW1wb3J0IEFuaW1hdGlvbjFiIGZyb20gJy4vYW5pbWF0aW9uMWInO1xuaW1wb3J0IEFuaW1hdGlvbjJhIGZyb20gJy4vYW5pbWF0aW9uMmEnO1xuaW1wb3J0IEFuaW1hdGlvbjJiIGZyb20gJy4vYW5pbWF0aW9uMmInO1xuaW1wb3J0IEFuaW1hdGlvbjNhIGZyb20gJy4vYW5pbWF0aW9uM2EnO1xuaW1wb3J0IEFuaW1hdGlvbjNiIGZyb20gJy4vYW5pbWF0aW9uM2InO1xuXG5yZXF1aXJlKCcuLi9jc3MvcmVzZXQuc2NzcycpO1xucmVxdWlyZSgnLi4vY3NzL2luZGV4LnNjc3MnKTtcbnJlcXVpcmUoJy4uL2Nzcy9wYXJ0aWNsZS5zY3NzJyk7XG5yZXF1aXJlKCcuLi9jc3MvY29udHJvbHMuc2NzcycpO1xuXG53aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsICgpID0+IHtcbiAgICBjb25zdCBkZXN0cm95JCA9IG5ldyBSeC5CZWhhdmlvclN1YmplY3QobnVsbCk7XG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsICgpID0+IHtcbiAgICAgICAgZGVzdHJveSQubmV4dCgnYWxsJyk7XG4gICAgfSk7XG5cbiAgICBBbmltYXRpb24xYShkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uMWIoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjJhKGRlc3Ryb3kkKTtcbiAgICBBbmltYXRpb24yYihkZXN0cm95JCk7XG4gICAgQW5pbWF0aW9uM2EoZGVzdHJveSQpO1xuICAgIEFuaW1hdGlvbjNiKGRlc3Ryb3kkKTtcbn0pO1xuXG4vLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuLy8gVE9ETyBzb3J0IG91dCBwYXJ0aWNsZSBuZXh0ZnJhbWVcbi8vIFRPRE8gYWJzIHBvc2l0aW9uaW5nIG9uIGNvbnRyb2xzIGVsZW1lbnRzIHNvIG9yZGVyIGRvZXNuJ3QgbWF0dGVyXG4vLyBUT0RPIGdyaWQgdG91Y2hlc1xuLy8gVE9ETyBsZWFkZXIgbm90IHF1aXRlIHJpZ2h0LCBpZiAyIHBhcnRpY2xlcywgc29tZXRpbWVzIGlnbm9yZWRcbi8vIFRPRE8gUmFuZG9taXplIGxlYWRlcnMgZXZlcnkgMzAgc2VjXG5cbi8vIElOVEVSRVNUSU5HIENPTlRST0xTOlxuLy8gc2Vuc2l0aXZpdHlcbi8vIHJpZ2lkaXR5XG4vLyBzaG93IGxlYWRlcnNcblxuLy8gVFVSTiBUSEUgQ09SUkVDVCBESVJFQ1RJT04gLSBIVUdFIEVGRklDSUVOQ1kgSU5DUkVBU0VcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9pbmRleC5qcyJdLCJtYXBwaW5ncyI6Ijs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBOzs7OztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); /***/ }), /* 86 */ @@ -1102,7 +1102,7 @@ eval("\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _inte /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nvar _arc = __webpack_require__(/*! ./arc */ 83);\n\nvar _arc2 = _interopRequireDefault(_arc);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, globalGrid, observables, behavior) {\n this.config = {\n behavior: behavior || _enums.BEHAVIOR.FREE,\n bounds: bounds,\n color: _random2.default.color(),\n gridSize: 5,\n randomize: true,\n showArc: false,\n showVision: false,\n visionRadius: 50\n };\n\n this.grids = {\n global: globalGrid || {},\n vision: createVisionGrid(this.config)\n };\n\n this.id = _random2.default.id(12);\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config, this.id),\n visionGrid: undefined\n };\n\n this.nodes.container.appendChild(this.nodes.body);\n parent.appendChild(this.nodes.container);\n\n this.leader = null;\n this.leaderTime = 0;\n\n this.arc = _arc2.default.create(bounds, this.grids.global);\n this.arc.length = 3;\n\n // If starting in a hazard, recurse.\n while (this.grids.global.getPoint({ x: this.arc.endX, y: this.arc.endY, type: _enums.ENTITIES.HAZARD }) !== undefined) {\n this.arc = _arc2.default.create(bounds, this.grids.global);\n }\n\n this.grids.global.setPoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n }, this);\n\n this.remove$ = new _rxjs2.default.Subject();\n\n observables.fps$.takeUntil(this.remove$).subscribe(this.subscribeNextFrame.bind(this));\n\n observables.speed$.takeUntil(this.remove$).subscribe(this.subscribeSpeed.bind(this));\n\n observables.randomize$ && observables.randomize$.takeUntil(this.remove$).subscribe(this.subscribeRandomize.bind(this));\n\n observables.circle$ && observables.circle$.takeUntil(this.remove$).subscribe(this.subscribeCircle.bind(this));\n\n observables.vision$ && observables.vision$.takeUntil(this.remove$).subscribe(this.subscribeVision.bind(this));\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n this.grids.global.deletePoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n });\n\n var parent = this.nodes.container.parentNode;\n parent.removeChild(this.nodes.container);\n this.remove$.next();\n delete this.nodes;\n};\n\nParticle.prototype.subscribeNextFrame = function (n) {\n this.grids.global.deletePoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n });\n\n if (this.leader !== null) {\n this.arc = _arc2.default.follow(this.arc, this.leader.arc);\n } else if (this.arc.length <= 0 && this.config.randomize) {\n this.arc = _arc2.default.randomize(this.arc);\n }\n\n this.arc = _arc2.default.step(this.arc, this.config.bounds);\n\n this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n\n var _look = look(this.arc, this.grids),\n hazards = _look.hazards,\n particles = _look.particles;\n\n if (hazards.length > 0) {\n this.arc = _arc2.default.evade(this.arc);\n }\n\n this.updateLeader(particles);\n\n this.grids.global.setPoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n }, this);\n\n repaintContainer(this.nodes.container, this.arc, this.leaderTime);\n repaintBody(this.nodes.body, this.arc, this.leaderTime);\n repaintCircle(this.nodes.circle, this.arc);\n repaintVisionGrid(this.nodes.visionGrid, this.arc, this.grids);\n};\n\nParticle.prototype.subscribeSpeed = function (value) {\n _arc2.default.changeSpeed(this.arc, value);\n};\n\nParticle.prototype.subscribeCircle = function (show) {\n if (show === false) {\n this.nodes.container.removeChild(this.nodes.circle);\n delete this.nodes.circle;\n } else {\n this.nodes.circle = createCircleNode(this.config);\n this.nodes.container.appendChild(this.nodes.circle);\n }\n};\n\nParticle.prototype.subscribeRandomize = function (value) {\n this.config.randomize = value;\n};\n\nParticle.prototype.subscribeVision = function (show) {\n if (show === false) {\n this.nodes.visionGrid.forEach(function (n) {\n return n.parentNode.removeChild(n);\n });\n delete this.nodes.visionGrid;\n } else {\n this.nodes.visionGrid = createVisionGridNodes(this.config, this.grids, this.nodes);\n }\n};\n\nParticle.prototype.updateLeader = function (particles) {\n var _this = this;\n\n if (this.config.behavior !== _enums.BEHAVIOR.COHESION) {\n return;\n }\n\n if (this.leader === null && particles.length > 0) {\n // Head-to-head: particles see eachother but shouldn't both lead.\n var candidates = particles.filter(function (v) {\n return v.leader ? v.leader.id !== _this.id : true;\n });\n\n var leader = candidates.find(function (v) {\n return v.leaderTime > 0;\n }) || candidates[0];\n\n if (leader !== undefined) {\n leader.leaderTime = 1;\n this.leader = leader;\n }\n }\n\n if (this.leader === null) {\n return;\n }\n\n if (this.leader.nodes === undefined) {\n this.leader = null;\n return;\n }\n\n if (this.leader.leader !== null) {\n this.leader = this.leader.leader;\n }\n\n if (this.leaderTime > 0) {\n this.leaderTime = 0;\n }\n\n // Beware of circular leadership, where a leader sees its tail.\n if (this.leader.id === this.id) {\n this.leader = null;\n }\n};\n\nfunction look(arc, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var x = arc.endX + point.x;\n var y = arc.endY + point.y;\n var p = global.getPoint({ x: x, y: y, type: _enums.ENTITIES.PARTICLE });\n\n if (p) {\n acc.particles.push(p);\n }\n\n if (global.getPoint({ x: x, y: y, type: _enums.ENTITIES.HAZARD })) {\n acc.hazards.push({ x: x, y: y });\n }\n\n return acc;\n }, { hazards: [], particles: [] });\n}\n\n// ===== DOM CREATION =====\n\nfunction createBodyNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-body';\n node.style.backgroundColor = config.color;\n return node;\n}\n\nfunction createCircleNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-movement-circle';\n node.style.borderColor = config.color;\n return node;\n}\n\nfunction createContainerNode(config, id) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n node.id = id;\n return node;\n}\n\nfunction createVisionGrid(config) {\n var side = config.gridSize,\n radius = config.visionRadius;\n\n var r0 = radius;\n var r1 = 45;\n\n var points = [];\n\n for (var x = -radius; x <= radius; x += side) {\n for (var y = -radius; y <= radius; y += side) {\n // Omit large slices of unused circle\n if (x > y || x < -y) {\n continue;\n }\n\n // Include vision band\n var r = Math.pow(Math.pow(x, 2) + Math.pow(y, 2), 0.5);\n if (r > r0 || r < r1) {\n continue;\n }\n\n var alpha = Math.atan(y / x);\n if (x < 0) {\n alpha += _enums.RAD.t180;\n }\n\n points.push({ x: x, y: y, r: r, alpha: alpha, touch: false });\n }\n }\n\n return points;\n}\n\nfunction createVisionGridNodes(config, grids, nodes) {\n return grids.vision.reduce(function (acc, _ref) {\n var x = _ref.x,\n y = _ref.y;\n\n var div = document.createElement('div');\n div.className = 'particle-vision-dot';\n div.style.backgroundColor = config.color;\n nodes.container.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\n}\n\nfunction updateVisionGrid(arc, config, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var rad = arc.clockwise ? point.alpha - arc.theta : point.alpha - arc.theta + _enums.RAD.t180;\n\n point.x = point.r * Math.cos(rad);\n point.y = point.r * Math.sin(rad);\n\n return acc.concat(point);\n }, []);\n}\n\n// ===== DOM RENDERING =====\nfunction repaintContainer(node, arc, leaderTime) {\n node.style.left = arc.endX + 'px';\n node.style.top = arc.endY + 'px';\n\n leaderTime > 0 ? node.style.zIndex = '2000' : node.style.zIndex = '2';\n}\n\nfunction repaintBody(node, arc, leaderTime) {\n var rad = arc.clockwise ? _enums.RAD.t180 - arc.theta : _enums.RAD.t360 - arc.theta;\n\n node.style.transform = 'rotate(' + (rad + _enums.RAD.t45) + 'rad)';\n\n leaderTime > 0 ? node.style.border = '3px dotted #fff' : node.style.border = '';\n}\n\nfunction repaintCircle(node, arc) {\n if (node === undefined) {\n return;\n }\n\n node.style.width = 2 * arc.radius + 'px';\n node.style.height = 2 * arc.radius + 'px';\n\n node.style.left = '-' + (arc.radius + arc.radius * arc.cosTheta) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * arc.sinTheta) + 'px';\n\n node.style.borderRadius = arc.radius + 'px';\n}\n\nfunction repaintVisionGrid(nodes, arc, grids) {\n if (nodes === undefined) {\n return;\n }\n\n grids.vision.forEach(function (_ref2, i) {\n var x = _ref2.x,\n y = _ref2.y,\n touch = _ref2.touch;\n\n nodes[i].style.left = x + 'px';\n nodes[i].style.top = y + 'px';\n\n nodes[i].style.border = touch ? '2px solid red' : '0';\n });\n}\n\nexports.default = Particle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQkVIQVZJT1IsIEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBBcmMgZnJvbSAnLi9hcmMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vID09PT09IENvbnN0cnVjdG9yID09PT09XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKHBhcmVudCwgYm91bmRzLCBnbG9iYWxHcmlkLCBvYnNlcnZhYmxlcywgYmVoYXZpb3IpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgYmVoYXZpb3I6IGJlaGF2aW9yIHx8IEJFSEFWSU9SLkZSRUUsXG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgY29sb3I6IFJhbmRvbS5jb2xvcigpLFxuICAgICAgICBncmlkU2l6ZTogNSxcbiAgICAgICAgcmFuZG9taXplOiB0cnVlLFxuICAgICAgICBzaG93QXJjOiBmYWxzZSxcbiAgICAgICAgc2hvd1Zpc2lvbjogZmFsc2UsXG4gICAgICAgIHZpc2lvblJhZGl1czogNTBcbiAgICB9O1xuXG4gICAgdGhpcy5ncmlkcyA9IHtcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxHcmlkIHx8IHt9LFxuICAgICAgICB2aXNpb246IGNyZWF0ZVZpc2lvbkdyaWQodGhpcy5jb25maWcpXG4gICAgfTtcblxuICAgIHRoaXMuaWQgPSBSYW5kb20uaWQoMTIpO1xuXG4gICAgdGhpcy5ub2RlcyA9IHtcbiAgICAgICAgYm9keTogY3JlYXRlQm9keU5vZGUodGhpcy5jb25maWcpLFxuICAgICAgICBjaXJjbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGFpbmVyOiBjcmVhdGVDb250YWluZXJOb2RlKHRoaXMuY29uZmlnLCB0aGlzLmlkKSxcbiAgICAgICAgdmlzaW9uR3JpZDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmJvZHkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG5cbiAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgdGhpcy5sZWFkZXJUaW1lID0gMDtcblxuICAgIHRoaXMuYXJjID0gQXJjLmNyZWF0ZShib3VuZHMsIHRoaXMuZ3JpZHMuZ2xvYmFsKTtcbiAgICB0aGlzLmFyYy5sZW5ndGggPSAzO1xuXG4gICAgLy8gSWYgc3RhcnRpbmcgaW4gYSBoYXphcmQsIHJlY3Vyc2UuXG4gICAgd2hpbGUgKHRoaXMuZ3JpZHMuZ2xvYmFsLmdldFBvaW50KHsgeDogdGhpcy5hcmMuZW5kWCwgeTogdGhpcy5hcmMuZW5kWSwgdHlwZTogRU5USVRJRVMuSEFaQVJEfSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFyYyA9IEFyYy5jcmVhdGUoYm91bmRzLCB0aGlzLmdyaWRzLmdsb2JhbCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuc2V0UG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0sIHRoaXMpO1xuXG4gICAgdGhpcy5yZW1vdmUkID0gbmV3IFJ4LlN1YmplY3QoKTtcblxuICAgIG9ic2VydmFibGVzLmZwcyRcbiAgICAgICAgLnRha2VVbnRpbCh0aGlzLnJlbW92ZSQpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVOZXh0RnJhbWUuYmluZCh0aGlzKSk7XG5cbiAgICBvYnNlcnZhYmxlcy5zcGVlZCRcbiAgICAgICAgLnRha2VVbnRpbCh0aGlzLnJlbW92ZSQpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVTcGVlZC5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLnJhbmRvbWl6ZSQgJiYgb2JzZXJ2YWJsZXMucmFuZG9taXplJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZVJhbmRvbWl6ZS5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLmNpcmNsZSQgJiYgb2JzZXJ2YWJsZXMuY2lyY2xlJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZUNpcmNsZS5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLnZpc2lvbiQgJiYgb2JzZXJ2YWJsZXMudmlzaW9uJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZVZpc2lvbi5iaW5kKHRoaXMpKTtcbn07XG5cbi8vID09PT09IFBST1RPVFlQRSA9PT09PVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuZGVsZXRlUG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5ub2Rlcy5jb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5jb250YWluZXIpO1xuICAgIHRoaXMucmVtb3ZlJC5uZXh0KCk7XG4gICAgZGVsZXRlIHRoaXMubm9kZXM7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVOZXh0RnJhbWUgPSBmdW5jdGlvbihuKSB7XG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuZGVsZXRlUG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXJjID0gQXJjLmZvbGxvdyh0aGlzLmFyYywgdGhpcy5sZWFkZXIuYXJjKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXJjLmxlbmd0aCA8PSAwICYmIHRoaXMuY29uZmlnLnJhbmRvbWl6ZSkge1xuICAgICAgICB0aGlzLmFyYyA9IEFyYy5yYW5kb21pemUodGhpcy5hcmMpO1xuICAgIH1cblxuICAgIHRoaXMuYXJjID0gQXJjLnN0ZXAodGhpcy5hcmMsIHRoaXMuY29uZmlnLmJvdW5kcyk7XG5cbiAgICB0aGlzLmdyaWRzLnZpc2lvbiA9IHVwZGF0ZVZpc2lvbkdyaWQodGhpcy5hcmMsIHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzKTtcbiAgICBjb25zdCB7IGhhemFyZHMsIHBhcnRpY2xlcyB9ID0gbG9vayh0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG5cbiAgICBpZiAoaGF6YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYXJjID0gQXJjLmV2YWRlKHRoaXMuYXJjKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxlYWRlcihwYXJ0aWNsZXMpO1xuXG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuc2V0UG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0sIHRoaXMpO1xuXG4gICAgcmVwYWludENvbnRhaW5lcih0aGlzLm5vZGVzLmNvbnRhaW5lciwgdGhpcy5hcmMsIHRoaXMubGVhZGVyVGltZSk7XG4gICAgcmVwYWludEJvZHkodGhpcy5ub2Rlcy5ib2R5LCB0aGlzLmFyYywgdGhpcy5sZWFkZXJUaW1lKTtcbiAgICByZXBhaW50Q2lyY2xlKHRoaXMubm9kZXMuY2lyY2xlLCB0aGlzLmFyYyk7XG4gICAgcmVwYWludFZpc2lvbkdyaWQodGhpcy5ub2Rlcy52aXNpb25HcmlkLCB0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgQXJjLmNoYW5nZVNwZWVkKHRoaXMuYXJjLCB2YWx1ZSk7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVDaXJjbGUgPSBmdW5jdGlvbihzaG93KSB7XG4gICAgaWYgKHNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMuY2lyY2xlKTtcbiAgICAgICAgZGVsZXRlIHRoaXMubm9kZXMuY2lyY2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2lyY2xlID0gY3JlYXRlQ2lyY2xlTm9kZSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHRoaXMubm9kZXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubm9kZXMuY2lyY2xlKTtcbiAgICB9XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVSYW5kb21pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMuY29uZmlnLnJhbmRvbWl6ZSA9IHZhbHVlO1xufVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUuc3Vic2NyaWJlVmlzaW9uID0gZnVuY3Rpb24oc2hvdykge1xuICAgIGlmIChzaG93ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5vZGVzLnZpc2lvbkdyaWQuZm9yRWFjaChuID0+IG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzLnZpc2lvbkdyaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2Rlcy52aXNpb25HcmlkID0gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzLCB0aGlzLm5vZGVzKTtcbiAgICB9XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS51cGRhdGVMZWFkZXIgPSBmdW5jdGlvbihwYXJ0aWNsZXMpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYmVoYXZpb3IgIT09IEJFSEFWSU9SLkNPSEVTSU9OKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIgPT09IG51bGwgJiYgcGFydGljbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gSGVhZC10by1oZWFkOiBwYXJ0aWNsZXMgc2VlIGVhY2hvdGhlciBidXQgc2hvdWxkbid0IGJvdGggbGVhZC5cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHBhcnRpY2xlc1xuICAgICAgICAgICAgLmZpbHRlcih2ID0+IHYubGVhZGVyID8gKHYubGVhZGVyLmlkICE9PSB0aGlzLmlkKSA6IHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGxlYWRlciA9IGNhbmRpZGF0ZXMuZmluZCh2ID0+ICh2LmxlYWRlclRpbWUgPiAwKSkgfHwgY2FuZGlkYXRlc1swXTtcblxuICAgICAgICBpZiAobGVhZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxlYWRlci5sZWFkZXJUaW1lID0gMTtcbiAgICAgICAgICAgIHRoaXMubGVhZGVyID0gbGVhZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gdGhpcy5sZWFkZXIubGVhZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlYWRlclRpbWUgPiAwKSB7XG4gICAgICAgIHRoaXMubGVhZGVyVGltZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gQmV3YXJlIG9mIGNpcmN1bGFyIGxlYWRlcnNoaXAsIHdoZXJlIGEgbGVhZGVyIHNlZXMgaXRzIHRhaWwuXG4gICAgaWYgKHRoaXMubGVhZGVyLmlkID09PSB0aGlzLmlkKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gbnVsbDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxvb2soYXJjLCBncmlkcykge1xuICAgIGNvbnN0IHsgZ2xvYmFsLCB2aXNpb24gfSA9IGdyaWRzO1xuXG4gICAgcmV0dXJuIHZpc2lvbi5yZWR1Y2UoKGFjYywgcG9pbnQpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGFyYy5lbmRYICsgcG9pbnQueDtcbiAgICAgICAgY29uc3QgeSA9IGFyYy5lbmRZICsgcG9pbnQueTtcbiAgICAgICAgY29uc3QgcCA9IGdsb2JhbC5nZXRQb2ludCh7IHgsIHksIHR5cGU6IEVOVElUSUVTLlBBUlRJQ0xFIH0pO1xuXG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBhY2MucGFydGljbGVzLnB1c2gocCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYmFsLmdldFBvaW50KHsgeCwgeSwgdHlwZTogRU5USVRJRVMuSEFaQVJEIH0pKSB7XG4gICAgICAgICAgICBhY2MuaGF6YXJkcy5wdXNoKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgeyBoYXphcmRzOiBbXSwgcGFydGljbGVzOiBbXSB9KTtcbn1cblxuLy8gPT09PT0gRE9NIENSRUFUSU9OID09PT09XG5cbmZ1bmN0aW9uIGNyZWF0ZUJvZHlOb2RlKGNvbmZpZykge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1ib2R5JztcbiAgICBub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbmZpZy5jb2xvcjtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lyY2xlTm9kZShjb25maWcpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSAncGFydGljbGUtbW92ZW1lbnQtY2lyY2xlJztcbiAgICBub2RlLnN0eWxlLmJvcmRlckNvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXJOb2RlKGNvbmZpZywgaWQpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSAncGFydGljbGUtY29udGFpbmVyJztcbiAgICBub2RlLmlkID0gaWQ7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWQoY29uZmlnKSB7XG4gICAgY29uc3QgeyBncmlkU2l6ZTogc2lkZSwgdmlzaW9uUmFkaXVzOiByYWRpdXMgfSA9IGNvbmZpZztcbiAgICBjb25zdCByMCA9IHJhZGl1cztcbiAgICBjb25zdCByMSA9IDQ1O1xuXG4gICAgY29uc3QgcG9pbnRzID0gW107XG5cbiAgICBmb3IgKGxldCB4ID0gLXJhZGl1czsgeCA8PSByYWRpdXM7IHggKz0gc2lkZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gLXJhZGl1czsgeSA8PSByYWRpdXM7IHkgKz0gc2lkZSkge1xuICAgICAgICAgICAgLy8gT21pdCBsYXJnZSBzbGljZXMgb2YgdW51c2VkIGNpcmNsZVxuICAgICAgICAgICAgaWYgKHggPiB5IHx8IHggPCAteSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHZpc2lvbiBiYW5kXG4gICAgICAgICAgICBjb25zdCByID0gTWF0aC5wb3coTWF0aC5wb3coeCwgMikgKyBNYXRoLnBvdyh5LCAyKSwgMC41KTtcbiAgICAgICAgICAgIGlmIChyID4gcjAgfHwgciA8IHIxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhbHBoYSA9IE1hdGguYXRhbih5IC8geCk7XG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICBhbHBoYSArPSBSQUQudDE4MDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9pbnRzLnB1c2goeyB4LCB5LCByLCBhbHBoYSwgdG91Y2g6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50cztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKGNvbmZpZywgZ3JpZHMsIG5vZGVzKSB7XG4gICAgcmV0dXJuIGdyaWRzLnZpc2lvbi5yZWR1Y2UoKGFjYywgeyB4LCB5IH0pID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAncGFydGljbGUtdmlzaW9uLWRvdCc7XG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgICAgIG5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGFjYy5wdXNoKGRpdik7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlVmlzaW9uR3JpZChhcmMsIGNvbmZpZywgZ3JpZHMpIHtcbiAgICBjb25zdCB7IGdsb2JhbCwgdmlzaW9uIH0gPSBncmlkcztcblxuICAgIHJldHVybiB2aXNpb24ucmVkdWNlKChhY2MsIHBvaW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhZCA9IGFyYy5jbG9ja3dpc2VcbiAgICAgICAgICAgID8gcG9pbnQuYWxwaGEgLSBhcmMudGhldGFcbiAgICAgICAgICAgIDogcG9pbnQuYWxwaGEgLSBhcmMudGhldGEgKyBSQUQudDE4MDtcblxuICAgICAgICBwb2ludC54ID0gcG9pbnQuciAqIE1hdGguY29zKHJhZCk7XG4gICAgICAgIHBvaW50LnkgPSBwb2ludC5yICogTWF0aC5zaW4ocmFkKTtcblxuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChwb2ludCk7XG4gICAgfSwgW10pO1xufVxuXG4vLyA9PT09PSBET00gUkVOREVSSU5HID09PT09XG5mdW5jdGlvbiByZXBhaW50Q29udGFpbmVyKG5vZGUsIGFyYywgbGVhZGVyVGltZSkge1xuICAgIG5vZGUuc3R5bGUubGVmdCA9IGAke2FyYy5lbmRYfXB4YDtcbiAgICBub2RlLnN0eWxlLnRvcCA9IGAke2FyYy5lbmRZfXB4YDtcblxuICAgIChsZWFkZXJUaW1lID4gMCkgPyBub2RlLnN0eWxlLnpJbmRleCA9ICcyMDAwJyA6IG5vZGUuc3R5bGUuekluZGV4ID0gJzInO1xufVxuXG5mdW5jdGlvbiByZXBhaW50Qm9keShub2RlLCBhcmMsIGxlYWRlclRpbWUpIHtcbiAgICBjb25zdCByYWQgPSBhcmMuY2xvY2t3aXNlXG4gICAgICAgID8gUkFELnQxODAgLSBhcmMudGhldGFcbiAgICAgICAgOiBSQUQudDM2MCAtIGFyYy50aGV0YTtcblxuICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gYHJvdGF0ZSgke3JhZCArIFJBRC50NDV9cmFkKWA7XG5cbiAgICAobGVhZGVyVGltZSA+IDApID8gbm9kZS5zdHlsZS5ib3JkZXIgPSAnM3B4IGRvdHRlZCAjZmZmJyA6IG5vZGUuc3R5bGUuYm9yZGVyID0gJyc7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRDaXJjbGUobm9kZSwgYXJjKSB7XG4gICAgaWYgKG5vZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbm9kZS5zdHlsZS53aWR0aCA9IGAkezIgKiBhcmMucmFkaXVzfXB4YDtcbiAgICBub2RlLnN0eWxlLmhlaWdodCA9IGAkezIgKiBhcmMucmFkaXVzfXB4YDtcblxuICAgIG5vZGUuc3R5bGUubGVmdCA9IGAtJHthcmMucmFkaXVzICsgYXJjLnJhZGl1cyAqIGFyYy5jb3NUaGV0YX1weGA7XG4gICAgbm9kZS5zdHlsZS50b3AgPSBgLSR7YXJjLnJhZGl1cyAtIGFyYy5yYWRpdXMgKiBhcmMuc2luVGhldGF9cHhgO1xuXG4gICAgbm9kZS5zdHlsZS5ib3JkZXJSYWRpdXMgPSBgJHthcmMucmFkaXVzfXB4YDtcbn1cblxuZnVuY3Rpb24gcmVwYWludFZpc2lvbkdyaWQobm9kZXMsIGFyYywgZ3JpZHMpIHtcbiAgICBpZiAobm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZ3JpZHMudmlzaW9uLmZvckVhY2goKHsgeCwgeSwgdG91Y2ggfSwgaSkgPT4ge1xuICAgICAgICBub2Rlc1tpXS5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICAgIG5vZGVzW2ldLnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuXG4gICAgICAgIG5vZGVzW2ldLnN0eWxlLmJvcmRlciA9ICh0b3VjaCA/ICcycHggc29saWQgcmVkJyA6ICcwJyk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnRpY2xlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL3BhcnRpY2xlLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoQkE7QUFBQTtBQUFBO0FBQ0E7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSIsInNvdXJjZVJvb3QiOiIifQ=="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 21);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _enums = __webpack_require__(/*! ./enums */ 22);\n\nvar _arc = __webpack_require__(/*! ./arc */ 83);\n\nvar _arc2 = _interopRequireDefault(_arc);\n\nvar _random = __webpack_require__(/*! ./random */ 33);\n\nvar _random2 = _interopRequireDefault(_random);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n// ===== Constructor =====\n\nfunction Particle(parent, bounds, globalGrid, observables, behavior) {\n this.config = {\n behavior: behavior || _enums.BEHAVIOR.FREE,\n bounds: bounds,\n color: _random2.default.color(),\n gridSize: 5,\n randomize: true,\n showArc: false,\n showVision: false,\n visionRadius: 50\n };\n\n this.grids = {\n global: globalGrid || {},\n vision: createVisionGrid(this.config)\n };\n\n this.id = _random2.default.id(12);\n\n this.nodes = {\n body: createBodyNode(this.config),\n circle: undefined,\n container: createContainerNode(this.config, this.id),\n visionGrid: undefined\n };\n\n this.nodes.container.appendChild(this.nodes.body);\n parent.appendChild(this.nodes.container);\n\n this.leader = null;\n this.leaderTime = 0;\n\n this.arc = _arc2.default.create(bounds, this.grids.global);\n this.arc.length = 3;\n\n // If starting in a hazard, recurse.\n while (this.grids.global.getPoint({ x: this.arc.endX, y: this.arc.endY, type: _enums.ENTITIES.HAZARD }) !== undefined) {\n this.arc = _arc2.default.create(bounds, this.grids.global);\n }\n\n this.grids.global.setPoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n }, this);\n\n this.remove$ = new _rxjs2.default.Subject();\n\n observables.fps$.takeUntil(this.remove$).subscribe(this.subscribeNextFrame.bind(this));\n\n observables.speed$.takeUntil(this.remove$).subscribe(this.subscribeSpeed.bind(this));\n\n observables.randomize$ && observables.randomize$.takeUntil(this.remove$).subscribe(this.subscribeRandomize.bind(this));\n\n observables.circle$ && observables.circle$.takeUntil(this.remove$).subscribe(this.subscribeCircle.bind(this));\n\n observables.vision$ && observables.vision$.takeUntil(this.remove$).subscribe(this.subscribeVision.bind(this));\n};\n\n// ===== PROTOTYPE =====\n\nParticle.prototype.remove = function () {\n this.grids.global.deletePoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n });\n\n var parent = this.nodes.container.parentNode;\n parent.removeChild(this.nodes.container);\n this.remove$.next();\n delete this.nodes;\n};\n\nParticle.prototype.subscribeNextFrame = function (n) {\n this.grids.global.deletePoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n });\n\n if (this.leader !== null) {\n this.arc = _arc2.default.follow(this.arc, this.leader.arc);\n } else if (this.arc.length <= 0 && this.config.randomize) {\n this.arc = _arc2.default.randomize(this.arc);\n }\n\n this.arc = _arc2.default.step(this.arc, this.config.bounds);\n\n this.grids.vision = updateVisionGrid(this.arc, this.config, this.grids);\n\n var _look = look(this.arc, this.grids),\n hazards = _look.hazards,\n particles = _look.particles;\n\n if (hazards.length > 0) {\n this.arc = _arc2.default.evade(this.arc);\n }\n\n this.updateLeader(particles);\n\n this.grids.global.setPoint({\n x: this.arc.endX,\n y: this.arc.endY,\n type: _enums.ENTITIES.PARTICLE\n }, this);\n\n repaintContainer(this.nodes.container, this.arc, this.leaderTime);\n repaintBody(this.nodes.body, this.arc, this.leaderTime);\n repaintCircle(this.nodes.circle, this.arc);\n repaintVisionGrid(this.nodes.visionGrid, this.arc, this.grids);\n};\n\nParticle.prototype.subscribeSpeed = function (value) {\n _arc2.default.changeSpeed(this.arc, value);\n};\n\nParticle.prototype.subscribeCircle = function (show) {\n if (show === false) {\n this.nodes.container.removeChild(this.nodes.circle);\n delete this.nodes.circle;\n } else {\n this.nodes.circle = createCircleNode(this.config);\n this.nodes.container.appendChild(this.nodes.circle);\n }\n};\n\nParticle.prototype.subscribeRandomize = function (value) {\n this.config.randomize = value;\n};\n\nParticle.prototype.subscribeVision = function (show) {\n if (show === false) {\n this.nodes.visionGrid.forEach(function (n) {\n return n.parentNode.removeChild(n);\n });\n delete this.nodes.visionGrid;\n } else {\n this.nodes.visionGrid = createVisionGridNodes(this.config, this.grids, this.nodes);\n }\n};\n\nParticle.prototype.updateLeader = function (particles) {\n var _this = this;\n\n if (this.config.behavior !== _enums.BEHAVIOR.COHESION) {\n return;\n }\n\n if (this.leader === null && particles.length > 0) {\n // Head-to-head: particles see eachother but shouldn't both lead.\n var candidates = particles.filter(function (v) {\n return v.leader ? v.leader.id !== _this.id : true;\n });\n\n var leader = candidates.find(function (v) {\n return v.leaderTime > 0;\n }) || candidates[0];\n\n if (leader !== undefined) {\n leader.leaderTime = 1;\n this.leader = leader;\n }\n }\n\n if (this.leader === null) {\n return;\n }\n\n if (this.leader.nodes === undefined) {\n this.leader = null;\n return;\n }\n\n if (this.leader.leader !== null) {\n this.leader = this.leader.leader;\n }\n\n if (this.leaderTime > 0) {\n this.leaderTime = 0;\n }\n\n // Beware of circular leadership, where a leader sees its tail.\n if (this.leader.id === this.id) {\n this.leader = null;\n }\n};\n\nfunction look(arc, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var x = arc.endX + point.x;\n var y = arc.endY + point.y;\n var p = global.getPoint({ x: x, y: y, type: _enums.ENTITIES.PARTICLE });\n\n if (p) {\n acc.particles.push(p);\n }\n\n if (global.getPoint({ x: x, y: y, type: _enums.ENTITIES.HAZARD })) {\n acc.hazards.push({ x: x, y: y });\n }\n\n return acc;\n }, { hazards: [], particles: [] });\n}\n\n// ===== DOM CREATION =====\n\nfunction createBodyNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-body';\n node.style.backgroundColor = config.color;\n return node;\n}\n\nfunction createCircleNode(config) {\n var node = document.createElement('div');\n node.className = 'particle-movement-circle';\n node.style.borderColor = config.color;\n return node;\n}\n\nfunction createContainerNode(config, id) {\n var node = document.createElement('div');\n node.className = 'particle-container';\n node.id = id;\n return node;\n}\n\nfunction createVisionGrid(config) {\n var side = config.gridSize,\n radius = config.visionRadius;\n\n var r0 = radius;\n var r1 = 45;\n\n var points = [];\n\n for (var x = -radius; x <= radius; x += side) {\n for (var y = -radius; y <= radius; y += side) {\n // Omit large slices of unused circle\n if (x > y || x < -y) {\n continue;\n }\n\n // Include vision band\n var r = Math.pow(Math.pow(x, 2) + Math.pow(y, 2), 0.5);\n if (r > r0 || r < r1) {\n continue;\n }\n\n var alpha = Math.atan(y / x);\n if (x < 0) {\n alpha += _enums.RAD.t180;\n }\n\n points.push({ x: x, y: y, r: r, alpha: alpha, touch: false });\n }\n }\n\n return points;\n}\n\nfunction createVisionGridNodes(config, grids, nodes) {\n return grids.vision.reduce(function (acc, _ref) {\n var x = _ref.x,\n y = _ref.y;\n\n var div = document.createElement('div');\n div.className = 'particle-vision-dot';\n div.style.backgroundColor = config.color;\n nodes.container.appendChild(div);\n\n acc.push(div);\n\n return acc;\n }, []);\n}\n\nfunction updateVisionGrid(arc, config, grids) {\n var global = grids.global,\n vision = grids.vision;\n\n\n return vision.reduce(function (acc, point) {\n var rad = arc.clockwise ? point.alpha - arc.theta : point.alpha - arc.theta + _enums.RAD.t180;\n\n point.x = point.r * Math.cos(rad);\n point.y = point.r * Math.sin(rad);\n\n return acc.concat(point);\n }, []);\n}\n\n// ===== DOM RENDERING =====\nfunction repaintContainer(node, arc, leaderTime) {\n node.style.left = arc.endX + 'px';\n node.style.top = arc.endY + 'px';\n}\n\nfunction repaintBody(node, arc, leaderTime) {\n var rad = arc.clockwise ? _enums.RAD.t180 - arc.theta : _enums.RAD.t360 - arc.theta;\n\n node.style.transform = 'rotate(' + (rad + _enums.RAD.t45) + 'rad)';\n}\n\nfunction repaintCircle(node, arc) {\n if (node === undefined) {\n return;\n }\n\n node.style.width = 2 * arc.radius + 'px';\n node.style.height = 2 * arc.radius + 'px';\n\n node.style.left = '-' + (arc.radius + arc.radius * arc.cosTheta) + 'px';\n node.style.top = '-' + (arc.radius - arc.radius * arc.sinTheta) + 'px';\n\n node.style.borderRadius = arc.radius + 'px';\n}\n\nfunction repaintVisionGrid(nodes, arc, grids) {\n if (nodes === undefined) {\n return;\n }\n\n grids.vision.forEach(function (_ref2, i) {\n var x = _ref2.x,\n y = _ref2.y;\n\n nodes[i].style.left = x + 'px';\n nodes[i].style.top = y + 'px';\n\n // nodes[i].style.border = (touch ? '2px solid red' : '0');\n });\n}\n\nexports.default = Particle;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODYuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvcGFydGljbGUuanM/M2JkZSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQkVIQVZJT1IsIEVOVElUSUVTLCBSQUQgfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCBBcmMgZnJvbSAnLi9hcmMnO1xuaW1wb3J0IFJhbmRvbSBmcm9tICcuL3JhbmRvbSc7XG5cbi8vID09PT09IENvbnN0cnVjdG9yID09PT09XG5cbmZ1bmN0aW9uIFBhcnRpY2xlKHBhcmVudCwgYm91bmRzLCBnbG9iYWxHcmlkLCBvYnNlcnZhYmxlcywgYmVoYXZpb3IpIHtcbiAgICB0aGlzLmNvbmZpZyA9IHtcbiAgICAgICAgYmVoYXZpb3I6IGJlaGF2aW9yIHx8IEJFSEFWSU9SLkZSRUUsXG4gICAgICAgIGJvdW5kcyxcbiAgICAgICAgY29sb3I6IFJhbmRvbS5jb2xvcigpLFxuICAgICAgICBncmlkU2l6ZTogNSxcbiAgICAgICAgcmFuZG9taXplOiB0cnVlLFxuICAgICAgICBzaG93QXJjOiBmYWxzZSxcbiAgICAgICAgc2hvd1Zpc2lvbjogZmFsc2UsXG4gICAgICAgIHZpc2lvblJhZGl1czogNTBcbiAgICB9O1xuXG4gICAgdGhpcy5ncmlkcyA9IHtcbiAgICAgICAgZ2xvYmFsOiBnbG9iYWxHcmlkIHx8IHt9LFxuICAgICAgICB2aXNpb246IGNyZWF0ZVZpc2lvbkdyaWQodGhpcy5jb25maWcpXG4gICAgfTtcblxuICAgIHRoaXMuaWQgPSBSYW5kb20uaWQoMTIpO1xuXG4gICAgdGhpcy5ub2RlcyA9IHtcbiAgICAgICAgYm9keTogY3JlYXRlQm9keU5vZGUodGhpcy5jb25maWcpLFxuICAgICAgICBjaXJjbGU6IHVuZGVmaW5lZCxcbiAgICAgICAgY29udGFpbmVyOiBjcmVhdGVDb250YWluZXJOb2RlKHRoaXMuY29uZmlnLCB0aGlzLmlkKSxcbiAgICAgICAgdmlzaW9uR3JpZDogdW5kZWZpbmVkLFxuICAgIH07XG5cbiAgICB0aGlzLm5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmJvZHkpO1xuICAgIHBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLm5vZGVzLmNvbnRhaW5lcik7XG5cbiAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgdGhpcy5sZWFkZXJUaW1lID0gMDtcblxuICAgIHRoaXMuYXJjID0gQXJjLmNyZWF0ZShib3VuZHMsIHRoaXMuZ3JpZHMuZ2xvYmFsKTtcbiAgICB0aGlzLmFyYy5sZW5ndGggPSAzO1xuXG4gICAgLy8gSWYgc3RhcnRpbmcgaW4gYSBoYXphcmQsIHJlY3Vyc2UuXG4gICAgd2hpbGUgKHRoaXMuZ3JpZHMuZ2xvYmFsLmdldFBvaW50KHsgeDogdGhpcy5hcmMuZW5kWCwgeTogdGhpcy5hcmMuZW5kWSwgdHlwZTogRU5USVRJRVMuSEFaQVJEfSkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmFyYyA9IEFyYy5jcmVhdGUoYm91bmRzLCB0aGlzLmdyaWRzLmdsb2JhbCk7XG4gICAgfVxuXG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuc2V0UG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0sIHRoaXMpO1xuXG4gICAgdGhpcy5yZW1vdmUkID0gbmV3IFJ4LlN1YmplY3QoKTtcblxuICAgIG9ic2VydmFibGVzLmZwcyRcbiAgICAgICAgLnRha2VVbnRpbCh0aGlzLnJlbW92ZSQpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVOZXh0RnJhbWUuYmluZCh0aGlzKSk7XG5cbiAgICBvYnNlcnZhYmxlcy5zcGVlZCRcbiAgICAgICAgLnRha2VVbnRpbCh0aGlzLnJlbW92ZSQpXG4gICAgICAgIC5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVTcGVlZC5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLnJhbmRvbWl6ZSQgJiYgb2JzZXJ2YWJsZXMucmFuZG9taXplJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZVJhbmRvbWl6ZS5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLmNpcmNsZSQgJiYgb2JzZXJ2YWJsZXMuY2lyY2xlJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZUNpcmNsZS5iaW5kKHRoaXMpKTtcblxuICAgIG9ic2VydmFibGVzLnZpc2lvbiQgJiYgb2JzZXJ2YWJsZXMudmlzaW9uJFxuICAgICAgICAudGFrZVVudGlsKHRoaXMucmVtb3ZlJClcbiAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZVZpc2lvbi5iaW5kKHRoaXMpKTtcbn07XG5cbi8vID09PT09IFBST1RPVFlQRSA9PT09PVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuZGVsZXRlUG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0pO1xuXG4gICAgY29uc3QgcGFyZW50ID0gdGhpcy5ub2Rlcy5jb250YWluZXIucGFyZW50Tm9kZTtcbiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ub2Rlcy5jb250YWluZXIpO1xuICAgIHRoaXMucmVtb3ZlJC5uZXh0KCk7XG4gICAgZGVsZXRlIHRoaXMubm9kZXM7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVOZXh0RnJhbWUgPSBmdW5jdGlvbihuKSB7XG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuZGVsZXRlUG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYXJjID0gQXJjLmZvbGxvdyh0aGlzLmFyYywgdGhpcy5sZWFkZXIuYXJjKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuYXJjLmxlbmd0aCA8PSAwICYmIHRoaXMuY29uZmlnLnJhbmRvbWl6ZSkge1xuICAgICAgICB0aGlzLmFyYyA9IEFyYy5yYW5kb21pemUodGhpcy5hcmMpO1xuICAgIH1cblxuICAgIHRoaXMuYXJjID0gQXJjLnN0ZXAodGhpcy5hcmMsIHRoaXMuY29uZmlnLmJvdW5kcyk7XG5cbiAgICB0aGlzLmdyaWRzLnZpc2lvbiA9IHVwZGF0ZVZpc2lvbkdyaWQodGhpcy5hcmMsIHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzKTtcbiAgICBjb25zdCB7IGhhemFyZHMsIHBhcnRpY2xlcyB9ID0gbG9vayh0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG5cbiAgICBpZiAoaGF6YXJkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRoaXMuYXJjID0gQXJjLmV2YWRlKHRoaXMuYXJjKTtcbiAgICB9XG5cbiAgICB0aGlzLnVwZGF0ZUxlYWRlcihwYXJ0aWNsZXMpO1xuXG4gICAgdGhpcy5ncmlkcy5nbG9iYWwuc2V0UG9pbnQoe1xuICAgICAgICB4OiB0aGlzLmFyYy5lbmRYLFxuICAgICAgICB5OiB0aGlzLmFyYy5lbmRZLFxuICAgICAgICB0eXBlOiBFTlRJVElFUy5QQVJUSUNMRVxuICAgIH0sIHRoaXMpO1xuXG4gICAgcmVwYWludENvbnRhaW5lcih0aGlzLm5vZGVzLmNvbnRhaW5lciwgdGhpcy5hcmMsIHRoaXMubGVhZGVyVGltZSk7XG4gICAgcmVwYWludEJvZHkodGhpcy5ub2Rlcy5ib2R5LCB0aGlzLmFyYywgdGhpcy5sZWFkZXJUaW1lKTtcbiAgICByZXBhaW50Q2lyY2xlKHRoaXMubm9kZXMuY2lyY2xlLCB0aGlzLmFyYyk7XG4gICAgcmVwYWludFZpc2lvbkdyaWQodGhpcy5ub2Rlcy52aXNpb25HcmlkLCB0aGlzLmFyYywgdGhpcy5ncmlkcyk7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVTcGVlZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgQXJjLmNoYW5nZVNwZWVkKHRoaXMuYXJjLCB2YWx1ZSk7XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVDaXJjbGUgPSBmdW5jdGlvbihzaG93KSB7XG4gICAgaWYgKHNob3cgPT09IGZhbHNlKSB7XG4gICAgICAgIHRoaXMubm9kZXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMubm9kZXMuY2lyY2xlKTtcbiAgICAgICAgZGVsZXRlIHRoaXMubm9kZXMuY2lyY2xlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubm9kZXMuY2lyY2xlID0gY3JlYXRlQ2lyY2xlTm9kZSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHRoaXMubm9kZXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMubm9kZXMuY2lyY2xlKTtcbiAgICB9XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS5zdWJzY3JpYmVSYW5kb21pemUgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMuY29uZmlnLnJhbmRvbWl6ZSA9IHZhbHVlO1xufVxuXG5QYXJ0aWNsZS5wcm90b3R5cGUuc3Vic2NyaWJlVmlzaW9uID0gZnVuY3Rpb24oc2hvdykge1xuICAgIGlmIChzaG93ID09PSBmYWxzZSkge1xuICAgICAgICB0aGlzLm5vZGVzLnZpc2lvbkdyaWQuZm9yRWFjaChuID0+IG4ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChuKSk7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm5vZGVzLnZpc2lvbkdyaWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5ub2Rlcy52aXNpb25HcmlkID0gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKHRoaXMuY29uZmlnLCB0aGlzLmdyaWRzLCB0aGlzLm5vZGVzKTtcbiAgICB9XG59XG5cblBhcnRpY2xlLnByb3RvdHlwZS51cGRhdGVMZWFkZXIgPSBmdW5jdGlvbihwYXJ0aWNsZXMpIHtcbiAgICBpZiAodGhpcy5jb25maWcuYmVoYXZpb3IgIT09IEJFSEFWSU9SLkNPSEVTSU9OKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIgPT09IG51bGwgJiYgcGFydGljbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgLy8gSGVhZC10by1oZWFkOiBwYXJ0aWNsZXMgc2VlIGVhY2hvdGhlciBidXQgc2hvdWxkbid0IGJvdGggbGVhZC5cbiAgICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IHBhcnRpY2xlc1xuICAgICAgICAgICAgLmZpbHRlcih2ID0+IHYubGVhZGVyID8gKHYubGVhZGVyLmlkICE9PSB0aGlzLmlkKSA6IHRydWUpO1xuXG4gICAgICAgIGNvbnN0IGxlYWRlciA9IGNhbmRpZGF0ZXMuZmluZCh2ID0+ICh2LmxlYWRlclRpbWUgPiAwKSkgfHwgY2FuZGlkYXRlc1swXTtcblxuICAgICAgICBpZiAobGVhZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxlYWRlci5sZWFkZXJUaW1lID0gMTtcbiAgICAgICAgICAgIHRoaXMubGVhZGVyID0gbGVhZGVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubGVhZGVyID09PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubm9kZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxlYWRlciA9IG51bGw7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5sZWFkZXIubGVhZGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gdGhpcy5sZWFkZXIubGVhZGVyO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmxlYWRlclRpbWUgPiAwKSB7XG4gICAgICAgIHRoaXMubGVhZGVyVGltZSA9IDA7XG4gICAgfVxuXG4gICAgLy8gQmV3YXJlIG9mIGNpcmN1bGFyIGxlYWRlcnNoaXAsIHdoZXJlIGEgbGVhZGVyIHNlZXMgaXRzIHRhaWwuXG4gICAgaWYgKHRoaXMubGVhZGVyLmlkID09PSB0aGlzLmlkKSB7XG4gICAgICAgIHRoaXMubGVhZGVyID0gbnVsbDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxvb2soYXJjLCBncmlkcykge1xuICAgIGNvbnN0IHsgZ2xvYmFsLCB2aXNpb24gfSA9IGdyaWRzO1xuXG4gICAgcmV0dXJuIHZpc2lvbi5yZWR1Y2UoKGFjYywgcG9pbnQpID0+IHtcbiAgICAgICAgY29uc3QgeCA9IGFyYy5lbmRYICsgcG9pbnQueDtcbiAgICAgICAgY29uc3QgeSA9IGFyYy5lbmRZICsgcG9pbnQueTtcbiAgICAgICAgY29uc3QgcCA9IGdsb2JhbC5nZXRQb2ludCh7IHgsIHksIHR5cGU6IEVOVElUSUVTLlBBUlRJQ0xFIH0pO1xuXG4gICAgICAgIGlmIChwKSB7XG4gICAgICAgICAgICBhY2MucGFydGljbGVzLnB1c2gocCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZ2xvYmFsLmdldFBvaW50KHsgeCwgeSwgdHlwZTogRU5USVRJRVMuSEFaQVJEIH0pKSB7XG4gICAgICAgICAgICBhY2MuaGF6YXJkcy5wdXNoKHsgeCwgeSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgeyBoYXphcmRzOiBbXSwgcGFydGljbGVzOiBbXSB9KTtcbn1cblxuLy8gPT09PT0gRE9NIENSRUFUSU9OID09PT09XG5cbmZ1bmN0aW9uIGNyZWF0ZUJvZHlOb2RlKGNvbmZpZykge1xuICAgIGNvbnN0IG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBub2RlLmNsYXNzTmFtZSA9ICdwYXJ0aWNsZS1ib2R5JztcbiAgICBub2RlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbmZpZy5jb2xvcjtcbiAgICByZXR1cm4gbm9kZTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2lyY2xlTm9kZShjb25maWcpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSAncGFydGljbGUtbW92ZW1lbnQtY2lyY2xlJztcbiAgICBub2RlLnN0eWxlLmJvcmRlckNvbG9yID0gY29uZmlnLmNvbG9yO1xuICAgIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDb250YWluZXJOb2RlKGNvbmZpZywgaWQpIHtcbiAgICBjb25zdCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgbm9kZS5jbGFzc05hbWUgPSAncGFydGljbGUtY29udGFpbmVyJztcbiAgICBub2RlLmlkID0gaWQ7XG4gICAgcmV0dXJuIG5vZGU7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVZpc2lvbkdyaWQoY29uZmlnKSB7XG4gICAgY29uc3QgeyBncmlkU2l6ZTogc2lkZSwgdmlzaW9uUmFkaXVzOiByYWRpdXMgfSA9IGNvbmZpZztcbiAgICBjb25zdCByMCA9IHJhZGl1cztcbiAgICBjb25zdCByMSA9IDQ1O1xuXG4gICAgY29uc3QgcG9pbnRzID0gW107XG5cbiAgICBmb3IgKGxldCB4ID0gLXJhZGl1czsgeCA8PSByYWRpdXM7IHggKz0gc2lkZSkge1xuICAgICAgICBmb3IgKGxldCB5ID0gLXJhZGl1czsgeSA8PSByYWRpdXM7IHkgKz0gc2lkZSkge1xuICAgICAgICAgICAgLy8gT21pdCBsYXJnZSBzbGljZXMgb2YgdW51c2VkIGNpcmNsZVxuICAgICAgICAgICAgaWYgKHggPiB5IHx8IHggPCAteSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmNsdWRlIHZpc2lvbiBiYW5kXG4gICAgICAgICAgICBjb25zdCByID0gTWF0aC5wb3coTWF0aC5wb3coeCwgMikgKyBNYXRoLnBvdyh5LCAyKSwgMC41KTtcbiAgICAgICAgICAgIGlmIChyID4gcjAgfHwgciA8IHIxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBhbHBoYSA9IE1hdGguYXRhbih5IC8geCk7XG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICBhbHBoYSArPSBSQUQudDE4MDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcG9pbnRzLnB1c2goeyB4LCB5LCByLCBhbHBoYSwgdG91Y2g6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHBvaW50cztcbn1cblxuZnVuY3Rpb24gY3JlYXRlVmlzaW9uR3JpZE5vZGVzKGNvbmZpZywgZ3JpZHMsIG5vZGVzKSB7XG4gICAgcmV0dXJuIGdyaWRzLnZpc2lvbi5yZWR1Y2UoKGFjYywgeyB4LCB5IH0pID0+IHtcbiAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgIGRpdi5jbGFzc05hbWUgPSAncGFydGljbGUtdmlzaW9uLWRvdCc7XG4gICAgICAgIGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb25maWcuY29sb3I7XG4gICAgICAgIG5vZGVzLmNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGFjYy5wdXNoKGRpdik7XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBbXSk7XG59XG5cblxuZnVuY3Rpb24gdXBkYXRlVmlzaW9uR3JpZChhcmMsIGNvbmZpZywgZ3JpZHMpIHtcbiAgICBjb25zdCB7IGdsb2JhbCwgdmlzaW9uIH0gPSBncmlkcztcblxuICAgIHJldHVybiB2aXNpb24ucmVkdWNlKChhY2MsIHBvaW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHJhZCA9IGFyYy5jbG9ja3dpc2VcbiAgICAgICAgICAgID8gcG9pbnQuYWxwaGEgLSBhcmMudGhldGFcbiAgICAgICAgICAgIDogcG9pbnQuYWxwaGEgLSBhcmMudGhldGEgKyBSQUQudDE4MDtcblxuICAgICAgICBwb2ludC54ID0gcG9pbnQuciAqIE1hdGguY29zKHJhZCk7XG4gICAgICAgIHBvaW50LnkgPSBwb2ludC5yICogTWF0aC5zaW4ocmFkKTtcblxuICAgICAgICByZXR1cm4gYWNjLmNvbmNhdChwb2ludCk7XG4gICAgfSwgW10pO1xufVxuXG4vLyA9PT09PSBET00gUkVOREVSSU5HID09PT09XG5mdW5jdGlvbiByZXBhaW50Q29udGFpbmVyKG5vZGUsIGFyYywgbGVhZGVyVGltZSkge1xuICAgIG5vZGUuc3R5bGUubGVmdCA9IGAke2FyYy5lbmRYfXB4YDtcbiAgICBub2RlLnN0eWxlLnRvcCA9IGAke2FyYy5lbmRZfXB4YDtcbn1cblxuZnVuY3Rpb24gcmVwYWludEJvZHkobm9kZSwgYXJjLCBsZWFkZXJUaW1lKSB7XG4gICAgY29uc3QgcmFkID0gYXJjLmNsb2Nrd2lzZVxuICAgICAgICA/IFJBRC50MTgwIC0gYXJjLnRoZXRhXG4gICAgICAgIDogUkFELnQzNjAgLSBhcmMudGhldGE7XG5cbiAgICBub2RlLnN0eWxlLnRyYW5zZm9ybSA9IGByb3RhdGUoJHtyYWQgKyBSQUQudDQ1fXJhZClgO1xufVxuXG5mdW5jdGlvbiByZXBhaW50Q2lyY2xlKG5vZGUsIGFyYykge1xuICAgIGlmIChub2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vZGUuc3R5bGUud2lkdGggPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG4gICAgbm9kZS5zdHlsZS5oZWlnaHQgPSBgJHsyICogYXJjLnJhZGl1c31weGA7XG5cbiAgICBub2RlLnN0eWxlLmxlZnQgPSBgLSR7YXJjLnJhZGl1cyArIGFyYy5yYWRpdXMgKiBhcmMuY29zVGhldGF9cHhgO1xuICAgIG5vZGUuc3R5bGUudG9wID0gYC0ke2FyYy5yYWRpdXMgLSBhcmMucmFkaXVzICogYXJjLnNpblRoZXRhfXB4YDtcblxuICAgIG5vZGUuc3R5bGUuYm9yZGVyUmFkaXVzID0gYCR7YXJjLnJhZGl1c31weGA7XG59XG5cbmZ1bmN0aW9uIHJlcGFpbnRWaXNpb25HcmlkKG5vZGVzLCBhcmMsIGdyaWRzKSB7XG4gICAgaWYgKG5vZGVzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGdyaWRzLnZpc2lvbi5mb3JFYWNoKCh7IHgsIHkgfSwgaSkgPT4ge1xuICAgICAgICBub2Rlc1tpXS5zdHlsZS5sZWZ0ID0gYCR7eH1weGA7XG4gICAgICAgIG5vZGVzW2ldLnN0eWxlLnRvcCA9IGAke3l9cHhgO1xuXG4gICAgICAgIC8vIG5vZGVzW2ldLnN0eWxlLmJvcmRlciA9ICh0b3VjaCA/ICcycHggc29saWQgcmVkJyA6ICcwJyk7XG4gICAgfSk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IFBhcnRpY2xlO1xuXG5cblxuLy8gV0VCUEFDSyBGT09URVIgLy9cbi8vIGpzL3BhcnRpY2xlLmpzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOzs7QUFBQTtBQUNBO0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7Ozs7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFSQTtBQUNBO0FBVUE7QUFDQTtBQUNBO0FBRkE7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSkE7QUFDQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUhBO0FBQ0E7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFHQTtBQUNBO0FBR0E7QUFDQTtBQUdBO0FBR0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSEE7QUFDQTtBQUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFoQkE7QUFBQTtBQUFBO0FBQ0E7QUFpQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFIQTtBQUNBO0FBS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlUm9vdCI6IiJ9"); /***/ }), /* 87 */ diff --git a/js/controls.js b/js/controls.js index e29e4dc..28eb235 100644 --- a/js/controls.js +++ b/js/controls.js @@ -16,7 +16,7 @@ export default function(destroy$, { const observables = { fps$: new Rx.Subject(), - count$: createCountControl(container, 0, maxCount), + count$: createCountControl(container, count, maxCount), speed$: createSpeedControl(container), circle$: showCircleControl && createCircleControl(container), randomize$: showRandomizeControl && createRandomizeControl(container), @@ -27,10 +27,7 @@ export default function(destroy$, { observables.animating$.subscribe((isAnimating) => { if (isAnimating === true) { destroy$.next(id); - - if (observables.count$.getValue() === 0) { - observables.count$.next(count); - } + observables.count$.next(count); } }); @@ -80,7 +77,7 @@ function createCountControl(container, initialValue, max) { label.className = 'controls-range'; const text = document.createElement('span'); - text.innerHTML = (initialValue == 1) ? '1 particle' : `${initialValue} particles`; + // text.innerHTML = (initialValue == 1) ? '1 particle' : `${initialValue} particles`; text.className = 'controls-range-text'; const slider = document.createElement('input'); @@ -102,7 +99,8 @@ function createCountControl(container, initialValue, max) { }); count$.subscribe((value) => { - text.innerHTML = (value == 1) ? '1 particle' : `${value} particles`; + console.warn('count changed! ', value) + text.innerHTML = (value === 1) ? '1 particle' : `${value} particles`; }); return count$; diff --git a/js/index.js b/js/index.js index a287b6b..19de3eb 100644 --- a/js/index.js +++ b/js/index.js @@ -29,10 +29,7 @@ window.addEventListener('load', () => { // TODO remove bottom padding from Disqus // TODO sort out particle nextframe // TODO abs positioning on controls elements so order doesn't matter -// TODO BehaviorSubject listener on bounds change -// TODO are vision grid nodes removed properly // TODO grid touches -// TODO start with n particles doesn't update slider // TODO leader not quite right, if 2 particles, sometimes ignored // TODO Randomize leaders every 30 sec diff --git a/js/particle.js b/js/particle.js index fb3c6ad..12ab707 100644 --- a/js/particle.js +++ b/js/particle.js @@ -301,8 +301,6 @@ function updateVisionGrid(arc, config, grids) { function repaintContainer(node, arc, leaderTime) { node.style.left = `${arc.endX}px`; node.style.top = `${arc.endY}px`; - - (leaderTime > 0) ? node.style.zIndex = '2000' : node.style.zIndex = '2'; } function repaintBody(node, arc, leaderTime) { @@ -311,8 +309,6 @@ function repaintBody(node, arc, leaderTime) { : RAD.t360 - arc.theta; node.style.transform = `rotate(${rad + RAD.t45}rad)`; - - (leaderTime > 0) ? node.style.border = '3px dotted #fff' : node.style.border = ''; } function repaintCircle(node, arc) { @@ -334,11 +330,11 @@ function repaintVisionGrid(nodes, arc, grids) { return; } - grids.vision.forEach(({ x, y, touch }, i) => { + grids.vision.forEach(({ x, y }, i) => { nodes[i].style.left = `${x}px`; nodes[i].style.top = `${y}px`; - nodes[i].style.border = (touch ? '2px solid red' : '0'); + // nodes[i].style.border = (touch ? '2px solid red' : '0'); }); }