diff --git a/css/index.scss b/css/index.scss index 5ad0d79..9635728 100644 --- a/css/index.scss +++ b/css/index.scss @@ -28,14 +28,21 @@ z-index: 0; } -// .palette { -// background: url('../res/palette.svg'); -// background-size: 167px 100px; -// height: 100px; -// position: absolute; -// width: 167px; -// } -// +.hazard { + // background: url('../res/palette.svg'); + // background-size: 167px 100px; + background: red; + position: absolute; +} + +.hazard-dot { + background: yellow; + height: 2px; + margin: 1px 0 0 1px; + position: absolute; + width: 2px; +} + // .highlight { // $h: 30px; // animation: pulse 0.5s 1; diff --git a/css/style.css b/css/style.css index f71dc10..11c6d4d 100644 --- a/css/style.css +++ b/css/style.css @@ -30,6 +30,17 @@ body { position: relative; width: 100%; z-index: 0; } + +.hazard { + background: red; + position: absolute; } + +.hazard-dot { + background: yellow; + height: 2px; + margin: 1px 0 0 1px; + position: absolute; + width: 2px; } .particle-container { position: absolute; z-index: 1; } diff --git a/js/animation2a.js b/js/animation2a.js index 602b522..364f731 100644 --- a/js/animation2a.js +++ b/js/animation2a.js @@ -18,6 +18,7 @@ function Animation2a() { this.bounds = this.container.getBoundingClientRect(); this.particles = []; + this.globalGrid = createGlobalGrid(this.container, this.bounds); const controls = new Controls( document.getElementById('controls2a'), @@ -33,16 +34,16 @@ function Animation2a() { // TODO remove bottom padding from Disqus // TODO perf - cache trig or perform operations // TODO move animating into controls - // TODO particle evade + // TODO no randomize control except anim1 - // TODO ANIM2 put pallettes in animation - // TODO ANIM2a Show vision grid (including touches!) + // TODO ANIM2 put hazards in animation + // TODO ANIM2 particle evade + // TODO ANIM2 style hazards + // TODO ANIM2a randomize hazards + // TODO ANIM2a Vision grid touches // TODO ANIM2b Scale vision grid to 1000? particles - // TODO ANIM4 Pallet avoidance - // TODO ANIM4 Lots of particles - - // TODO ANIM5 Flocking + // TODO ANIM3 Flocking }; Animation2a.prototype.subscriber = function({ key, value }) { @@ -90,4 +91,48 @@ Animation2a.prototype.updateSpeed = function(value) { this.particles.forEach(p => p.updateOptions({ speed: value })); } +function createGlobalGrid(container, bounds) { + const grid = {}; + const gridSize = 5; + + const hazards = [ + { x: 100, y: 100, w: 100, h: 100 }, + { x: 200, y: 200, w: 100, h: 100 }, + { x: 600, y: 200, w: 100, h: 100 }, + ]; + + return hazards.reduce((acc, { x, y, w, h }) => { + const div = document.createElement('div'); + div.className = 'hazard'; + div.style.left = `${x}px`; + div.style.top = `${y}px`; + div.style.height = `${h}px`; + div.style.width = `${w}px`; + container.appendChild(div); + + for (let i = x; i <= (x + w); i += gridSize) { + for (let j = y; j <= (y + h); j += gridSize) { + if (acc[i] === undefined) { + acc[i] = {}; + } + + if (acc[i][j] !== undefined) { + continue; + } + + const dot = document.createElement('dot'); + dot.className = 'hazard-dot'; + dot.style.left = `${i - x}px`; + dot.style.top = `${j - y}px`; + div.appendChild(dot); + + acc[i][j] = true; + } + } + + + return acc; + }, {}); +} + export default Animation2a; diff --git a/js/bundle.js b/js/bundle.js index d944732..5522601 100644 --- a/js/bundle.js +++ b/js/bundle.js @@ -974,7 +974,7 @@ eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n}); /***/ (function(module, exports, __webpack_require__) { "use strict"; -eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 1,\n maxCount: 10,\n randomize: true,\n showVisionGrid: true,\n showMovementCircle: false,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n\n var controls = new _controls2.default(document.getElementById('controls2a'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateAnimating(this.options.animating);\n this.updateCount(this.options.count);\n\n // TODO X dimension modified by core UI\n // TODO remove bottom padding from Disqus\n // TODO perf - cache trig or perform operations\n // TODO move animating into controls\n // TODO particle evade\n\n // TODO ANIM2 put pallettes in animation\n // TODO ANIM2a Show vision grid (including touches!)\n // TODO ANIM2b Scale vision grid to 1000? particles\n\n // TODO ANIM4 Pallet avoidance\n // TODO ANIM4 Lots of particles\n\n // TODO ANIM5 Flocking\n};\n\nAnimation2a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation2a.prototype.updateCount = function (count) {\n while (this.particles.length >= count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation2a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateOptions({ randomize: value });\n });\n};\n\nAnimation2a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateOptions({ speed: value });\n });\n};\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMmEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwLFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dWaXNpb25HcmlkOiB0cnVlLFxuICAgICAgICBzaG93TW92ZW1lbnRDaXJjbGU6IGZhbHNlLFxuICAgICAgICBzcGVlZDogNFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24yYScpO1xuICAgIHRoaXMuYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuXG4gICAgY29uc3QgY29udHJvbHMgPSBuZXcgQ29udHJvbHMoXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb250cm9sczJhJyksXG4gICAgICAgIHRoaXMub3B0aW9uc1xuICAgICk7XG5cbiAgICBjb250cm9scy5tb3VudCgpLnN1YnNjcmliZSh0aGlzLnN1YnNjcmliZXIuYmluZCh0aGlzKSk7XG5cbiAgICB0aGlzLnVwZGF0ZUFuaW1hdGluZyh0aGlzLm9wdGlvbnMuYW5pbWF0aW5nKTtcbiAgICB0aGlzLnVwZGF0ZUNvdW50KHRoaXMub3B0aW9ucy5jb3VudCk7XG5cbiAgICAvLyBUT0RPIFggZGltZW5zaW9uIG1vZGlmaWVkIGJ5IGNvcmUgVUlcbiAgICAvLyBUT0RPIHJlbW92ZSBib3R0b20gcGFkZGluZyBmcm9tIERpc3F1c1xuICAgIC8vIFRPRE8gcGVyZiAtIGNhY2hlIHRyaWcgb3IgcGVyZm9ybSBvcGVyYXRpb25zXG4gICAgLy8gVE9ETyBtb3ZlIGFuaW1hdGluZyBpbnRvIGNvbnRyb2xzXG4gICAgLy8gVE9ETyBwYXJ0aWNsZSBldmFkZVxuXG4gICAgLy8gVE9ETyBBTklNMiBwdXQgcGFsbGV0dGVzIGluIGFuaW1hdGlvblxuICAgIC8vIFRPRE8gQU5JTTJhIFNob3cgdmlzaW9uIGdyaWQgKGluY2x1ZGluZyB0b3VjaGVzISlcbiAgICAvLyBUT0RPIEFOSU0yYiBTY2FsZSB2aXNpb24gZ3JpZCB0byAxMDAwPyBwYXJ0aWNsZXNcblxuICAgIC8vIFRPRE8gQU5JTTQgUGFsbGV0IGF2b2lkYW5jZVxuICAgIC8vIFRPRE8gQU5JTTQgTG90cyBvZiBwYXJ0aWNsZXNcblxuICAgIC8vIFRPRE8gQU5JTTUgRmxvY2tpbmdcbn07XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID49IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlUmFuZG9taXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMucmFuZG9taXplID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlT3B0aW9ucyh7IHJhbmRvbWl6ZTogdmFsdWUgfSkpO1xufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlU3BlZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZU9wdGlvbnMoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24yYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24yYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUlBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBSkE7QUFNQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); +eval("\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _rxjs = __webpack_require__(/*! rxjs */ 14);\n\nvar _rxjs2 = _interopRequireDefault(_rxjs);\n\nvar _particle = __webpack_require__(/*! ./particle */ 33);\n\nvar _particle2 = _interopRequireDefault(_particle);\n\nvar _store = __webpack_require__(/*! ./store */ 22);\n\nvar _store2 = _interopRequireDefault(_store);\n\nvar _controls = __webpack_require__(/*! ./controls */ 21);\n\nvar _controls2 = _interopRequireDefault(_controls);\n\nvar _enums = __webpack_require__(/*! ./enums */ 16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction Animation2a() {\n this.options = {\n count: 1,\n maxCount: 10,\n randomize: true,\n showVisionGrid: true,\n showMovementCircle: false,\n speed: 4\n };\n\n this.container = document.getElementById('animation2a');\n this.bounds = this.container.getBoundingClientRect();\n\n this.particles = [];\n this.globalGrid = createGlobalGrid(this.container, this.bounds);\n\n var controls = new _controls2.default(document.getElementById('controls2a'), this.options);\n\n controls.mount().subscribe(this.subscriber.bind(this));\n\n this.updateAnimating(this.options.animating);\n this.updateCount(this.options.count);\n\n // TODO X dimension modified by core UI\n // TODO remove bottom padding from Disqus\n // TODO perf - cache trig or perform operations\n // TODO move animating into controls\n // TODO no randomize control except anim1\n\n // TODO ANIM2 put hazards in animation\n // TODO ANIM2 particle evade\n // TODO ANIM2 style hazards\n // TODO ANIM2a randomize hazards\n // TODO ANIM2a Vision grid touches\n // TODO ANIM2b Scale vision grid to 1000? particles\n\n // TODO ANIM3 Flocking\n};\n\nAnimation2a.prototype.subscriber = function (_ref) {\n var key = _ref.key,\n value = _ref.value;\n\n switch (key) {\n case _enums.CONTROLS.ANIMATING:\n this.updateAnimating(value);break;\n case _enums.CONTROLS.COUNT:\n this.updateCount(value);break;\n case _enums.CONTROLS.RANDOMIZE:\n this.updateRandomize(value);break;\n case _enums.CONTROLS.SPEED:\n this.updateSpeed(value);break;\n }\n};\n\nAnimation2a.prototype.nextFrame = function () {\n this.particles.forEach(function (p) {\n return p.nextFrame();\n });\n};\n\nAnimation2a.prototype.updateAnimating = function (isAnimating) {\n var _this = this;\n\n this.options.animating = isAnimating;\n\n if (isAnimating) {\n var fps$ = _rxjs2.default.Observable.interval(1000 / 32).takeWhile(function (_) {\n return _this.options.animating;\n });\n\n fps$.subscribe(this.nextFrame.bind(this));\n }\n};\n\nAnimation2a.prototype.updateCount = function (count) {\n while (this.particles.length >= count) {\n delete this.particles.pop().remove();\n }\n\n while (this.particles.length < count) {\n var p = new _particle2.default(this.container, this.bounds, this.options);\n this.particles.push(p);\n }\n};\n\nAnimation2a.prototype.updateRandomize = function (value) {\n this.options.randomize = value;\n this.particles.forEach(function (p) {\n return p.updateOptions({ randomize: value });\n });\n};\n\nAnimation2a.prototype.updateSpeed = function (value) {\n this.options.speed = value;\n this.particles.forEach(function (p) {\n return p.updateOptions({ speed: value });\n });\n};\n\nfunction createGlobalGrid(container, bounds) {\n var grid = {};\n var gridSize = 5;\n\n var hazards = [{ x: 100, y: 100, w: 100, h: 100 }, { x: 200, y: 200, w: 100, h: 100 }, { x: 600, y: 200, w: 100, h: 100 }];\n\n return hazards.reduce(function (acc, _ref2) {\n var x = _ref2.x,\n y = _ref2.y,\n w = _ref2.w,\n h = _ref2.h;\n\n var div = document.createElement('div');\n div.className = 'hazard';\n div.style.left = x + 'px';\n div.style.top = y + 'px';\n div.style.height = h + 'px';\n div.style.width = w + 'px';\n container.appendChild(div);\n\n for (var i = x; i <= x + w; i += gridSize) {\n for (var j = y; j <= y + h; j += gridSize) {\n if (acc[i] === undefined) {\n acc[i] = {};\n }\n\n if (acc[i][j] !== undefined) {\n continue;\n }\n\n var dot = document.createElement('dot');\n dot.className = 'hazard-dot';\n dot.style.left = i - x + 'px';\n dot.style.top = j - y + 'px';\n div.appendChild(dot);\n\n acc[i][j] = true;\n }\n }\n\n return acc;\n }, {});\n}\n\nexports.default = Animation2a;//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNzUuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vanMvYW5pbWF0aW9uMmEuanM/YzJmNyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUngsIHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IFBhcnRpY2xlIGZyb20gJy4vcGFydGljbGUnO1xuaW1wb3J0IFN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IENvbnRyb2xzIGZyb20gJy4vY29udHJvbHMnO1xuaW1wb3J0IHsgQ09OVFJPTFMgfSBmcm9tICcuL2VudW1zJztcblxuZnVuY3Rpb24gQW5pbWF0aW9uMmEoKSB7XG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb3VudDogMSxcbiAgICAgICAgbWF4Q291bnQ6IDEwLFxuICAgICAgICByYW5kb21pemU6IHRydWUsXG4gICAgICAgIHNob3dWaXNpb25HcmlkOiB0cnVlLFxuICAgICAgICBzaG93TW92ZW1lbnRDaXJjbGU6IGZhbHNlLFxuICAgICAgICBzcGVlZDogNFxuICAgIH07XG5cbiAgICB0aGlzLmNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdhbmltYXRpb24yYScpO1xuICAgIHRoaXMuYm91bmRzID0gdGhpcy5jb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cbiAgICB0aGlzLnBhcnRpY2xlcyA9IFtdO1xuICAgIHRoaXMuZ2xvYmFsR3JpZCA9IGNyZWF0ZUdsb2JhbEdyaWQodGhpcy5jb250YWluZXIsIHRoaXMuYm91bmRzKTtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gbmV3IENvbnRyb2xzKFxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29udHJvbHMyYScpLFxuICAgICAgICB0aGlzLm9wdGlvbnNcbiAgICApO1xuXG4gICAgY29udHJvbHMubW91bnQoKS5zdWJzY3JpYmUodGhpcy5zdWJzY3JpYmVyLmJpbmQodGhpcykpO1xuXG4gICAgdGhpcy51cGRhdGVBbmltYXRpbmcodGhpcy5vcHRpb25zLmFuaW1hdGluZyk7XG4gICAgdGhpcy51cGRhdGVDb3VudCh0aGlzLm9wdGlvbnMuY291bnQpO1xuXG4gICAgLy8gVE9ETyBYIGRpbWVuc2lvbiBtb2RpZmllZCBieSBjb3JlIFVJXG4gICAgLy8gVE9ETyByZW1vdmUgYm90dG9tIHBhZGRpbmcgZnJvbSBEaXNxdXNcbiAgICAvLyBUT0RPIHBlcmYgLSBjYWNoZSB0cmlnIG9yIHBlcmZvcm0gb3BlcmF0aW9uc1xuICAgIC8vIFRPRE8gbW92ZSBhbmltYXRpbmcgaW50byBjb250cm9sc1xuICAgIC8vIFRPRE8gbm8gcmFuZG9taXplIGNvbnRyb2wgZXhjZXB0IGFuaW0xXG5cbiAgICAvLyBUT0RPIEFOSU0yIHB1dCBoYXphcmRzIGluIGFuaW1hdGlvblxuICAgIC8vIFRPRE8gQU5JTTIgcGFydGljbGUgZXZhZGVcbiAgICAvLyBUT0RPIEFOSU0yIHN0eWxlIGhhemFyZHNcbiAgICAvLyBUT0RPIEFOSU0yYSByYW5kb21pemUgaGF6YXJkc1xuICAgIC8vIFRPRE8gQU5JTTJhIFZpc2lvbiBncmlkIHRvdWNoZXNcbiAgICAvLyBUT0RPIEFOSU0yYiBTY2FsZSB2aXNpb24gZ3JpZCB0byAxMDAwPyBwYXJ0aWNsZXNcblxuICAgIC8vIFRPRE8gQU5JTTMgRmxvY2tpbmdcbn07XG5cbkFuaW1hdGlvbjJhLnByb3RvdHlwZS5zdWJzY3JpYmVyID0gZnVuY3Rpb24oeyBrZXksIHZhbHVlIH0pIHtcbiAgICBzd2l0Y2goa2V5KSB7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuQU5JTUFUSU5HOiB0aGlzLnVwZGF0ZUFuaW1hdGluZyh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLkNPVU5UOiB0aGlzLnVwZGF0ZUNvdW50KHZhbHVlKTsgYnJlYWs7XG4gICAgICAgIGNhc2UgQ09OVFJPTFMuUkFORE9NSVpFOiB0aGlzLnVwZGF0ZVJhbmRvbWl6ZSh2YWx1ZSk7IGJyZWFrO1xuICAgICAgICBjYXNlIENPTlRST0xTLlNQRUVEOiB0aGlzLnVwZGF0ZVNwZWVkKHZhbHVlKTsgYnJlYWs7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUubmV4dEZyYW1lID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAubmV4dEZyYW1lKCkpO1xufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlQW5pbWF0aW5nID0gZnVuY3Rpb24oaXNBbmltYXRpbmcpIHtcbiAgICB0aGlzLm9wdGlvbnMuYW5pbWF0aW5nID0gaXNBbmltYXRpbmc7XG5cbiAgICBpZiAoaXNBbmltYXRpbmcpIHtcbiAgICAgICAgY29uc3QgZnBzJCA9IFJ4Lk9ic2VydmFibGUuaW50ZXJ2YWwoMTAwMCAvIDMyKVxuICAgICAgICAgICAgLnRha2VXaGlsZShfID0+IHRoaXMub3B0aW9ucy5hbmltYXRpbmcpO1xuXG4gICAgICAgIGZwcyQuc3Vic2NyaWJlKHRoaXMubmV4dEZyYW1lLmJpbmQodGhpcykpO1xuICAgIH1cbn1cblxuQW5pbWF0aW9uMmEucHJvdG90eXBlLnVwZGF0ZUNvdW50ID0gZnVuY3Rpb24oY291bnQpIHtcbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoID49IGNvdW50KSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnBhcnRpY2xlcy5wb3AoKS5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAodGhpcy5wYXJ0aWNsZXMubGVuZ3RoIDwgY291bnQpIHtcbiAgICAgICAgY29uc3QgcCA9IG5ldyBQYXJ0aWNsZSh0aGlzLmNvbnRhaW5lciwgdGhpcy5ib3VuZHMsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgIHRoaXMucGFydGljbGVzLnB1c2gocCk7XG4gICAgfVxufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlUmFuZG9taXplID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICB0aGlzLm9wdGlvbnMucmFuZG9taXplID0gdmFsdWU7XG4gICAgdGhpcy5wYXJ0aWNsZXMuZm9yRWFjaChwID0+IHAudXBkYXRlT3B0aW9ucyh7IHJhbmRvbWl6ZTogdmFsdWUgfSkpO1xufVxuXG5BbmltYXRpb24yYS5wcm90b3R5cGUudXBkYXRlU3BlZWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHRoaXMub3B0aW9ucy5zcGVlZCA9IHZhbHVlO1xuICAgIHRoaXMucGFydGljbGVzLmZvckVhY2gocCA9PiBwLnVwZGF0ZU9wdGlvbnMoeyBzcGVlZDogdmFsdWUgfSkpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxHcmlkKGNvbnRhaW5lciwgYm91bmRzKSB7XG4gICAgY29uc3QgZ3JpZCA9IHt9O1xuICAgIGNvbnN0IGdyaWRTaXplID0gNTtcblxuICAgIGNvbnN0IGhhemFyZHMgPSBbXG4gICAgICAgIHsgeDogMTAwLCB5OiAxMDAsIHc6IDEwMCwgaDogMTAwIH0sXG4gICAgICAgIHsgeDogMjAwLCB5OiAyMDAsIHc6IDEwMCwgaDogMTAwIH0sXG4gICAgICAgIHsgeDogNjAwLCB5OiAyMDAsIHc6IDEwMCwgaDogMTAwIH0sXG4gICAgXTtcblxuICAgIHJldHVybiBoYXphcmRzLnJlZHVjZSgoYWNjLCB7IHgsIHksIHcsIGggfSkgPT4ge1xuICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgZGl2LmNsYXNzTmFtZSA9ICdoYXphcmQnO1xuICAgICAgICBkaXYuc3R5bGUubGVmdCA9IGAke3h9cHhgO1xuICAgICAgICBkaXYuc3R5bGUudG9wID0gYCR7eX1weGA7XG4gICAgICAgIGRpdi5zdHlsZS5oZWlnaHQgPSBgJHtofXB4YDtcbiAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gYCR7d31weGA7XG4gICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSB4OyBpIDw9ICh4ICsgdyk7IGkgKz0gZ3JpZFNpemUpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGogPSB5OyBqIDw9ICh5ICsgaCk7IGogKz0gZ3JpZFNpemUpIHtcbiAgICAgICAgICAgICAgICBpZiAoYWNjW2ldID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgYWNjW2ldID0ge307XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGFjY1tpXVtqXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGRvdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvdCcpO1xuICAgICAgICAgICAgICAgIGRvdC5jbGFzc05hbWUgPSAnaGF6YXJkLWRvdCc7XG4gICAgICAgICAgICAgICAgZG90LnN0eWxlLmxlZnQgPSBgJHtpIC0geH1weGA7XG4gICAgICAgICAgICAgICAgZG90LnN0eWxlLnRvcCA9IGAke2ogLSB5fXB4YDtcbiAgICAgICAgICAgICAgICBkaXYuYXBwZW5kQ2hpbGQoZG90KTtcblxuICAgICAgICAgICAgICAgIGFjY1tpXVtqXSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBBbmltYXRpb24yYTtcblxuXG5cbi8vIFdFQlBBQ0sgRk9PVEVSIC8vXG4vLyBqcy9hbmltYXRpb24yYS5qcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQUE7QUFDQTs7O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQU5BO0FBQ0E7QUFRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQUE7QUFKQTtBQU1BO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFLQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0="); /***/ }), /* 76 */