scrollscene
Version:
ScrollScene is an extra layer on top of ScrollMagic as well as using IntersectionObserver to achieve similar effects.
232 lines (187 loc) • 28.2 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.ScrollScene = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _scrollmagicWithSsr = _interopRequireDefault(require("./scrollmagic-with-ssr"));
var _lodash = _interopRequireDefault(require("lodash.throttle"));
var _helpers = require("./helpers");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var nameSpace = 'ScrollScene';
var updateTweenProgress = function updateTweenProgress(Scene, Tween, gsapForwardSpeed, gsapReverseSpeed) {
if (Tween) {
var progress = Scene.progress();
var state = Scene.state();
if (Tween.repeat && Tween.repeat() === -1) {
if (state === 'DURING' && Tween.paused()) {
Tween.timeScale(gsapForwardSpeed).play();
} else if (state !== 'DURING' && !Tween.paused()) {
Tween.pause();
}
} else if (progress != Tween.progress()) {
if (Scene.duration() === 0) {
if (progress > 0) {
Tween.timeScale(gsapForwardSpeed).play();
} else {
Tween.timeScale(gsapReverseSpeed).reverse();
}
} else {
Tween.progress(progress).pause();
}
}
}
};
var removeTween = function removeTween(Tween) {
if (Tween) {
Tween.pause(0);
Tween.kill();
}
};
var setDuration = function setDuration(Scene, duration) {
if (duration instanceof HTMLElement) {
var previousHeight;
var currentHeight;
var getHeight = function getHeight() {
return duration.offsetHeight;
};
var update = function update() {
Scene.duration(getHeight());
previousHeight = getHeight();
};
var fn = function fn() {
currentHeight = getHeight();
if (currentHeight !== previousHeight) {
update();
}
};
fn();
window.addEventListener('resize', (0, _lodash["default"])(fn, 700));
currentHeight = getHeight();
update();
} else if ((0, _helpers.isObject)(duration)) {
var keys = Object.keys(duration).reverse();
var _fn = function _fn() {
for (var index = 0; index < keys.length; index++) {
var breakpoint = parseFloat(keys[index]);
if (breakpoint <= window.innerWidth) {
Scene.duration(duration[breakpoint]);
break;
}
}
};
_fn();
window.addEventListener('resize', (0, _lodash["default"])(_fn, 700));
} else {
Scene.duration(duration);
}
};
var setClassName = function setClassName(Scene, options, duration) {
var toggle = _objectSpread({
className: null,
element: null,
reverse: false
}, options);
if (!toggle.className) {
(0, _helpers.errorLog)(nameSpace, "Be sure to set a className in the new ".concat(nameSpace, "({ toggle: { className: \"my-class\" } })"));
}
if (!toggle.element) {
(0, _helpers.errorLog)(nameSpace, "Be sure to set a const toggleElement = (reactRef.current or document.querySelector) in the new ".concat(nameSpace, "({ toggle: { element: toggleElement } })"));
}
var addClassName = function addClassName() {
return !toggle.element.classList.contains(toggle.className) && toggle.element.classList.add(toggle.className);
};
var removeClassName = function removeClassName() {
return toggle.element.classList.contains(toggle.className) && toggle.element.classList.remove(toggle.className);
};
Scene.on('enter', function () {
addClassName();
});
Scene.on('add', function () {
if (Scene.state() === 'DURING') {
addClassName();
}
});
Scene.on('leave', function (event) {
if (!toggle.reverse && duration) {
event.scrollDirection === 'REVERSE' && removeClassName();
} else {
removeClassName();
}
});
Scene.on('remove', function () {
removeClassName();
});
};
var setTween = function setTween(Scene, options) {
var gsap = _objectSpread({
forwardSpeed: 1,
reverseSpeed: 1,
timeline: null
}, options);
if (!gsap.timeline) {
(0, _helpers.errorLog)(nameSpace, "Be sure to set a const tl = gsap.timeline({ paused: true }) in the new ".concat(nameSpace, "({ gsap: { timeline: tl } })"));
}
Scene.on('progress', function () {
updateTweenProgress(Scene, gsap.timeline, gsap.forwardSpeed, gsap.reverseSpeed);
});
Scene.on('remove', function () {
removeTween(gsap.timeline);
});
};
var globalController;
var ScrollScene = function ScrollScene(_ref) {
var breakpoints = _ref.breakpoints,
_ref$controller = _ref.controller,
controller = _ref$controller === void 0 ? {} : _ref$controller,
duration = _ref.duration,
gsap = _ref.gsap,
_ref$offset = _ref.offset,
offset = _ref$offset === void 0 ? 0 : _ref$offset,
_ref$scene = _ref.scene,
scene = _ref$scene === void 0 ? {} : _ref$scene,
toggle = _ref.toggle,
triggerElement = _ref.triggerElement,
_ref$triggerHook = _ref.triggerHook,
triggerHook = _ref$triggerHook === void 0 ? 'onEnter' : _ref$triggerHook,
_ref$useGlobalControl = _ref.useGlobalController,
useGlobalController = _ref$useGlobalControl === void 0 ? true : _ref$useGlobalControl;
var localController;
if (!useGlobalController) {
localController = new _scrollmagicWithSsr["default"].Controller(controller);
}
if (!globalController && useGlobalController) {
globalController = new _scrollmagicWithSsr["default"].Controller(controller);
}
var controllerIsUse = localController ? localController : globalController;
if (!triggerElement) {
(0, _helpers.errorLog)(nameSpace, "Be sure to set a const triggerElement = (reactRef.current or document.querySelector) in the new ".concat(nameSpace, "({ triggerElement: triggerElement })."));
}
var Scene = new _scrollmagicWithSsr["default"].Scene(_objectSpread({
triggerElement: triggerElement,
triggerHook: triggerHook,
offset: offset
}, scene));
if (duration) {
setDuration(Scene, duration);
}
if (toggle && (0, _helpers.isObject)(toggle)) {
setClassName(Scene, toggle, duration);
}
if (gsap && (0, _helpers.isObject)(gsap)) {
setTween(Scene, gsap);
}
this.init = function () {
controllerIsUse && Scene.addTo(controllerIsUse);
};
this.destroy = function () {
Scene.remove();
};
this.Scene = Scene;
this.Controller = controllerIsUse;
(0, _helpers.scrollAnimationInit)(breakpoints, this.init, this.destroy);
};
exports.ScrollScene = ScrollScene;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9TY3JvbGxTY2VuZS50cyJdLCJuYW1lcyI6WyJuYW1lU3BhY2UiLCJ1cGRhdGVUd2VlblByb2dyZXNzIiwiU2NlbmUiLCJUd2VlbiIsImdzYXBGb3J3YXJkU3BlZWQiLCJnc2FwUmV2ZXJzZVNwZWVkIiwicHJvZ3Jlc3MiLCJzdGF0ZSIsInJlcGVhdCIsInBhdXNlZCIsInRpbWVTY2FsZSIsInBsYXkiLCJwYXVzZSIsImR1cmF0aW9uIiwicmV2ZXJzZSIsInJlbW92ZVR3ZWVuIiwia2lsbCIsInNldER1cmF0aW9uIiwiSFRNTEVsZW1lbnQiLCJwcmV2aW91c0hlaWdodCIsImN1cnJlbnRIZWlnaHQiLCJnZXRIZWlnaHQiLCJvZmZzZXRIZWlnaHQiLCJ1cGRhdGUiLCJmbiIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJrZXlzIiwiT2JqZWN0IiwiaW5kZXgiLCJsZW5ndGgiLCJicmVha3BvaW50IiwicGFyc2VGbG9hdCIsImlubmVyV2lkdGgiLCJzZXRDbGFzc05hbWUiLCJvcHRpb25zIiwidG9nZ2xlIiwiY2xhc3NOYW1lIiwiZWxlbWVudCIsImFkZENsYXNzTmFtZSIsImNsYXNzTGlzdCIsImNvbnRhaW5zIiwiYWRkIiwicmVtb3ZlQ2xhc3NOYW1lIiwicmVtb3ZlIiwib24iLCJldmVudCIsInNjcm9sbERpcmVjdGlvbiIsInNldFR3ZWVuIiwiZ3NhcCIsImZvcndhcmRTcGVlZCIsInJldmVyc2VTcGVlZCIsInRpbWVsaW5lIiwiZ2xvYmFsQ29udHJvbGxlciIsIlNjcm9sbFNjZW5lIiwiYnJlYWtwb2ludHMiLCJjb250cm9sbGVyIiwib2Zmc2V0Iiwic2NlbmUiLCJ0cmlnZ2VyRWxlbWVudCIsInRyaWdnZXJIb29rIiwidXNlR2xvYmFsQ29udHJvbGxlciIsImxvY2FsQ29udHJvbGxlciIsIlNjcm9sbE1hZ2ljIiwiQ29udHJvbGxlciIsImNvbnRyb2xsZXJJc1VzZSIsImluaXQiLCJhZGRUbyIsImRlc3Ryb3kiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7Ozs7OztBQUdBLElBQU1BLFNBQVMsR0FBRyxhQUFsQjs7QUFFQSxJQUFNQyxtQkFBbUIsR0FBRyxTQUF0QkEsbUJBQXNCLENBQVNDLEtBQVQsRUFBZ0JDLEtBQWhCLEVBQXVCQyxnQkFBdkIsRUFBeUNDLGdCQUF6QyxFQUEyRDtBQUNyRixNQUFJRixLQUFKLEVBQVc7QUFDVCxRQUFNRyxRQUFRLEdBQUdKLEtBQUssQ0FBQ0ksUUFBTixFQUFqQjtBQUNBLFFBQU1DLEtBQUssR0FBR0wsS0FBSyxDQUFDSyxLQUFOLEVBQWQ7O0FBQ0EsUUFBSUosS0FBSyxDQUFDSyxNQUFOLElBQWdCTCxLQUFLLENBQUNLLE1BQU4sT0FBbUIsQ0FBQyxDQUF4QyxFQUEyQztBQUV6QyxVQUFJRCxLQUFLLEtBQUssUUFBVixJQUFzQkosS0FBSyxDQUFDTSxNQUFOLEVBQTFCLEVBQTBDO0FBQ3hDTixRQUFBQSxLQUFLLENBQUNPLFNBQU4sQ0FBZ0JOLGdCQUFoQixFQUFrQ08sSUFBbEM7QUFDRCxPQUZELE1BRU8sSUFBSUosS0FBSyxLQUFLLFFBQVYsSUFBc0IsQ0FBQ0osS0FBSyxDQUFDTSxNQUFOLEVBQTNCLEVBQTJDO0FBQ2hETixRQUFBQSxLQUFLLENBQUNTLEtBQU47QUFDRDtBQUNGLEtBUEQsTUFPTyxJQUFJTixRQUFRLElBQUlILEtBQUssQ0FBQ0csUUFBTixFQUFoQixFQUFrQztBQUd2QyxVQUFJSixLQUFLLENBQUNXLFFBQU4sT0FBcUIsQ0FBekIsRUFBNEI7QUFFMUIsWUFBSVAsUUFBUSxHQUFHLENBQWYsRUFBa0I7QUFFaEJILFVBQUFBLEtBQUssQ0FBQ08sU0FBTixDQUFnQk4sZ0JBQWhCLEVBQWtDTyxJQUFsQztBQUNELFNBSEQsTUFHTztBQUVMUixVQUFBQSxLQUFLLENBQUNPLFNBQU4sQ0FBZ0JMLGdCQUFoQixFQUFrQ1MsT0FBbEM7QUFDRDtBQUNGLE9BVEQsTUFTTztBQUdMWCxRQUFBQSxLQUFLLENBQUNHLFFBQU4sQ0FBZUEsUUFBZixFQUF5Qk0sS0FBekI7QUFDRDtBQUNGO0FBQ0Y7QUFDRixDQTlCRDs7QUFnQ0EsSUFBTUcsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBU1osS0FBVCxFQUFnQjtBQUNsQyxNQUFJQSxLQUFKLEVBQVc7QUFDVEEsSUFBQUEsS0FBSyxDQUFDUyxLQUFOLENBQVksQ0FBWjtBQUNBVCxJQUFBQSxLQUFLLENBQUNhLElBQU47QUFDRDtBQUNGLENBTEQ7O0FBT0EsSUFBTUMsV0FBVyxHQUFHLFNBQWRBLFdBQWMsQ0FBQ2YsS0FBRCxFQUFRVyxRQUFSLEVBQXFCO0FBRXZDLE1BQUlBLFFBQVEsWUFBWUssV0FBeEIsRUFBcUM7QUFDbkMsUUFBSUMsY0FBSjtBQUNBLFFBQUlDLGFBQUo7O0FBRUEsUUFBTUMsU0FBUyxHQUFHLFNBQVpBLFNBQVk7QUFBQSxhQUFNUixRQUFRLENBQUNTLFlBQWY7QUFBQSxLQUFsQjs7QUFFQSxRQUFNQyxNQUFNLEdBQUcsU0FBVEEsTUFBUyxHQUFNO0FBQ25CckIsTUFBQUEsS0FBSyxDQUFDVyxRQUFOLENBQWVRLFNBQVMsRUFBeEI7QUFDQUYsTUFBQUEsY0FBYyxHQUFHRSxTQUFTLEVBQTFCO0FBQ0QsS0FIRDs7QUFLQSxRQUFNRyxFQUFFLEdBQUcsU0FBTEEsRUFBSyxHQUFNO0FBRWZKLE1BQUFBLGFBQWEsR0FBR0MsU0FBUyxFQUF6Qjs7QUFFQSxVQUFJRCxhQUFhLEtBQUtELGNBQXRCLEVBQXNDO0FBQ3BDSSxRQUFBQSxNQUFNO0FBQ1A7QUFDRixLQVBEOztBQVNBQyxJQUFBQSxFQUFFO0FBRUZDLElBQUFBLE1BQU0sQ0FBQ0MsZ0JBQVAsQ0FBd0IsUUFBeEIsRUFBa0Msd0JBQVNGLEVBQVQsRUFBYSxHQUFiLENBQWxDO0FBRUFKLElBQUFBLGFBQWEsR0FBR0MsU0FBUyxFQUF6QjtBQUVBRSxJQUFBQSxNQUFNO0FBQ1AsR0EzQkQsTUEyQk8sSUFBSSx1QkFBU1YsUUFBVCxDQUFKLEVBQXdCO0FBRTdCLFFBQU1jLElBQUksR0FBR0MsTUFBTSxDQUFDRCxJQUFQLENBQVlkLFFBQVosRUFBc0JDLE9BQXRCLEVBQWI7O0FBRUEsUUFBTVUsR0FBRSxHQUFHLFNBQUxBLEdBQUssR0FBTTtBQUNmLFdBQUssSUFBSUssS0FBSyxHQUFHLENBQWpCLEVBQW9CQSxLQUFLLEdBQUdGLElBQUksQ0FBQ0csTUFBakMsRUFBeUNELEtBQUssRUFBOUMsRUFBa0Q7QUFDaEQsWUFBTUUsVUFBVSxHQUFHQyxVQUFVLENBQUNMLElBQUksQ0FBQ0UsS0FBRCxDQUFMLENBQTdCOztBQUVBLFlBQUlFLFVBQVUsSUFBSU4sTUFBTSxDQUFDUSxVQUF6QixFQUFxQztBQUNuQy9CLFVBQUFBLEtBQUssQ0FBQ1csUUFBTixDQUFlQSxRQUFRLENBQUNrQixVQUFELENBQXZCO0FBQ0E7QUFDRDtBQUNGO0FBQ0YsS0FURDs7QUFXQVAsSUFBQUEsR0FBRTs7QUFFRkMsSUFBQUEsTUFBTSxDQUFDQyxnQkFBUCxDQUF3QixRQUF4QixFQUFrQyx3QkFBU0YsR0FBVCxFQUFhLEdBQWIsQ0FBbEM7QUFDRCxHQWxCTSxNQWtCQTtBQUVMdEIsSUFBQUEsS0FBSyxDQUFDVyxRQUFOLENBQWVBLFFBQWY7QUFDRDtBQUNGLENBbkREOztBQXFEQSxJQUFNcUIsWUFBWSxHQUFHLFNBQWZBLFlBQWUsQ0FBQ2hDLEtBQUQsRUFBUWlDLE9BQVIsRUFBaUJ0QixRQUFqQixFQUE4QjtBQUNqRCxNQUFNdUIsTUFBTTtBQUNWQyxJQUFBQSxTQUFTLEVBQUUsSUFERDtBQUVWQyxJQUFBQSxPQUFPLEVBQUUsSUFGQztBQUdWeEIsSUFBQUEsT0FBTyxFQUFFO0FBSEMsS0FJUHFCLE9BSk8sQ0FBWjs7QUFPQSxNQUFJLENBQUNDLE1BQU0sQ0FBQ0MsU0FBWixFQUF1QjtBQUNyQiwyQkFBU3JDLFNBQVQsa0RBQTZEQSxTQUE3RDtBQUNEOztBQUVELE1BQUksQ0FBQ29DLE1BQU0sQ0FBQ0UsT0FBWixFQUFxQjtBQUNuQiwyQkFDRXRDLFNBREYsMkdBRW9HQSxTQUZwRztBQUlEOztBQUVELE1BQU11QyxZQUFZLEdBQUcsU0FBZkEsWUFBZTtBQUFBLFdBQ25CLENBQUNILE1BQU0sQ0FBQ0UsT0FBUCxDQUFlRSxTQUFmLENBQXlCQyxRQUF6QixDQUFrQ0wsTUFBTSxDQUFDQyxTQUF6QyxDQUFELElBQXdERCxNQUFNLENBQUNFLE9BQVAsQ0FBZUUsU0FBZixDQUF5QkUsR0FBekIsQ0FBNkJOLE1BQU0sQ0FBQ0MsU0FBcEMsQ0FEckM7QUFBQSxHQUFyQjs7QUFHQSxNQUFNTSxlQUFlLEdBQUcsU0FBbEJBLGVBQWtCO0FBQUEsV0FDdEJQLE1BQU0sQ0FBQ0UsT0FBUCxDQUFlRSxTQUFmLENBQXlCQyxRQUF6QixDQUFrQ0wsTUFBTSxDQUFDQyxTQUF6QyxLQUF1REQsTUFBTSxDQUFDRSxPQUFQLENBQWVFLFNBQWYsQ0FBeUJJLE1BQXpCLENBQWdDUixNQUFNLENBQUNDLFNBQXZDLENBRGpDO0FBQUEsR0FBeEI7O0FBR0FuQyxFQUFBQSxLQUFLLENBQUMyQyxFQUFOLENBQVMsT0FBVCxFQUFrQixZQUFXO0FBQzNCTixJQUFBQSxZQUFZO0FBQ2IsR0FGRDtBQUlBckMsRUFBQUEsS0FBSyxDQUFDMkMsRUFBTixDQUFTLEtBQVQsRUFBZ0IsWUFBVztBQUN6QixRQUFJM0MsS0FBSyxDQUFDSyxLQUFOLE9BQWtCLFFBQXRCLEVBQWdDO0FBQzlCZ0MsTUFBQUEsWUFBWTtBQUNiO0FBQ0YsR0FKRDtBQU1BckMsRUFBQUEsS0FBSyxDQUFDMkMsRUFBTixDQUFTLE9BQVQsRUFBa0IsVUFBU0MsS0FBVCxFQUFnQjtBQUNoQyxRQUFJLENBQUNWLE1BQU0sQ0FBQ3RCLE9BQVIsSUFBbUJELFFBQXZCLEVBQWlDO0FBRS9CaUMsTUFBQUEsS0FBSyxDQUFDQyxlQUFOLEtBQTBCLFNBQTFCLElBQXVDSixlQUFlLEVBQXREO0FBQ0QsS0FIRCxNQUdPO0FBQ0xBLE1BQUFBLGVBQWU7QUFDaEI7QUFDRixHQVBEO0FBU0F6QyxFQUFBQSxLQUFLLENBQUMyQyxFQUFOLENBQVMsUUFBVCxFQUFtQixZQUFXO0FBQzVCRixJQUFBQSxlQUFlO0FBQ2hCLEdBRkQ7QUFHRCxDQS9DRDs7QUFpREEsSUFBTUssUUFBUSxHQUFHLFNBQVhBLFFBQVcsQ0FBQzlDLEtBQUQsRUFBUWlDLE9BQVIsRUFBb0I7QUFDbkMsTUFBTWMsSUFBSTtBQUNSQyxJQUFBQSxZQUFZLEVBQUUsQ0FETjtBQUVSQyxJQUFBQSxZQUFZLEVBQUUsQ0FGTjtBQUdSQyxJQUFBQSxRQUFRLEVBQUU7QUFIRixLQUlMakIsT0FKSyxDQUFWOztBQU9BLE1BQUksQ0FBQ2MsSUFBSSxDQUFDRyxRQUFWLEVBQW9CO0FBQ2xCLDJCQUNFcEQsU0FERixtRkFFNEVBLFNBRjVFO0FBSUQ7O0FBRURFLEVBQUFBLEtBQUssQ0FBQzJDLEVBQU4sQ0FBUyxVQUFULEVBQXFCLFlBQVc7QUFDOUI1QyxJQUFBQSxtQkFBbUIsQ0FBQ0MsS0FBRCxFQUFRK0MsSUFBSSxDQUFDRyxRQUFiLEVBQXVCSCxJQUFJLENBQUNDLFlBQTVCLEVBQTBDRCxJQUFJLENBQUNFLFlBQS9DLENBQW5CO0FBQ0QsR0FGRDtBQUlBakQsRUFBQUEsS0FBSyxDQUFDMkMsRUFBTixDQUFTLFFBQVQsRUFBbUIsWUFBVztBQUM1QjlCLElBQUFBLFdBQVcsQ0FBQ2tDLElBQUksQ0FBQ0csUUFBTixDQUFYO0FBQ0QsR0FGRDtBQUdELENBdEJEOztBQXdJQSxJQUFJQyxnQkFBSjs7QUFFQSxJQUFNQyxXQUFXLEdBQUcsU0FBZEEsV0FBYyxPQWNsQjtBQUFBLE1BWEVDLFdBV0YsUUFYRUEsV0FXRjtBQUFBLDZCQVZFQyxVQVVGO0FBQUEsTUFWRUEsVUFVRixnQ0FWZSxFQVVmO0FBQUEsTUFURTNDLFFBU0YsUUFURUEsUUFTRjtBQUFBLE1BUkVvQyxJQVFGLFFBUkVBLElBUUY7QUFBQSx5QkFQRVEsTUFPRjtBQUFBLE1BUEVBLE1BT0YsNEJBUFcsQ0FPWDtBQUFBLHdCQU5FQyxLQU1GO0FBQUEsTUFORUEsS0FNRiwyQkFOVSxFQU1WO0FBQUEsTUFMRXRCLE1BS0YsUUFMRUEsTUFLRjtBQUFBLE1BSkV1QixjQUlGLFFBSkVBLGNBSUY7QUFBQSw4QkFIRUMsV0FHRjtBQUFBLE1BSEVBLFdBR0YsaUNBSGdCLFNBR2hCO0FBQUEsbUNBRkVDLG1CQUVGO0FBQUEsTUFGRUEsbUJBRUYsc0NBRndCLElBRXhCO0FBQ0EsTUFBSUMsZUFBSjs7QUFHQSxNQUFJLENBQUNELG1CQUFMLEVBQTBCO0FBQ3hCQyxJQUFBQSxlQUFlLEdBQUcsSUFBSUMsK0JBQVlDLFVBQWhCLENBQTJCUixVQUEzQixDQUFsQjtBQUNEOztBQUdELE1BQUksQ0FBQ0gsZ0JBQUQsSUFBcUJRLG1CQUF6QixFQUE4QztBQUM1Q1IsSUFBQUEsZ0JBQWdCLEdBQUcsSUFBSVUsK0JBQVlDLFVBQWhCLENBQTJCUixVQUEzQixDQUFuQjtBQUNEOztBQUVELE1BQU1TLGVBQWUsR0FBR0gsZUFBZSxHQUFHQSxlQUFILEdBQXFCVCxnQkFBNUQ7O0FBRUEsTUFBSSxDQUFDTSxjQUFMLEVBQXFCO0FBQ25CLDJCQUNFM0QsU0FERiw0R0FFcUdBLFNBRnJHO0FBSUQ7O0FBRUQsTUFBTUUsS0FBSyxHQUFHLElBQUk2RCwrQkFBWTdELEtBQWhCO0FBQ1p5RCxJQUFBQSxjQUFjLEVBQWRBLGNBRFk7QUFFWkMsSUFBQUEsV0FBVyxFQUFYQSxXQUZZO0FBR1pILElBQUFBLE1BQU0sRUFBTkE7QUFIWSxLQUlUQyxLQUpTLEVBQWQ7O0FBT0EsTUFBSTdDLFFBQUosRUFBYztBQUNaSSxJQUFBQSxXQUFXLENBQUNmLEtBQUQsRUFBUVcsUUFBUixDQUFYO0FBQ0Q7O0FBRUQsTUFBSXVCLE1BQU0sSUFBSSx1QkFBU0EsTUFBVCxDQUFkLEVBQWdDO0FBQzlCRixJQUFBQSxZQUFZLENBQUNoQyxLQUFELEVBQVFrQyxNQUFSLEVBQWdCdkIsUUFBaEIsQ0FBWjtBQUNEOztBQUVELE1BQUlvQyxJQUFJLElBQUksdUJBQVNBLElBQVQsQ0FBWixFQUE0QjtBQUMxQkQsSUFBQUEsUUFBUSxDQUFDOUMsS0FBRCxFQUFRK0MsSUFBUixDQUFSO0FBQ0Q7O0FBRUQsT0FBS2lCLElBQUwsR0FBWSxZQUFXO0FBQ3JCRCxJQUFBQSxlQUFlLElBQUkvRCxLQUFLLENBQUNpRSxLQUFOLENBQVlGLGVBQVosQ0FBbkI7QUFDRCxHQUZEOztBQUlBLE9BQUtHLE9BQUwsR0FBZSxZQUFXO0FBQ3hCbEUsSUFBQUEsS0FBSyxDQUFDMEMsTUFBTjtBQUNELEdBRkQ7O0FBSUEsT0FBSzFDLEtBQUwsR0FBYUEsS0FBYjtBQUNBLE9BQUs4RCxVQUFMLEdBQWtCQyxlQUFsQjtBQUVBLG9DQUFvQlYsV0FBcEIsRUFBaUMsS0FBS1csSUFBdEMsRUFBNEMsS0FBS0UsT0FBakQ7QUFDRCxDQW5FRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTY3JvbGxNYWdpYyBmcm9tICcuL3Njcm9sbG1hZ2ljLXdpdGgtc3NyJ1xuaW1wb3J0IHRocm90dGxlIGZyb20gJ2xvZGFzaC50aHJvdHRsZSdcbmltcG9ydCB7IGVycm9yTG9nLCBpc09iamVjdCwgc2Nyb2xsQW5pbWF0aW9uSW5pdCB9IGZyb20gJy4vaGVscGVycydcbmltcG9ydCB7IElTY3JvbGxPYnNlcnZlclRvZ2dsZSwgSVNjcm9sbE9ic2VydmVyR3NhcCB9IGZyb20gJy4vU2Nyb2xsT2JzZXJ2ZXInXG5cbmNvbnN0IG5hbWVTcGFjZSA9ICdTY3JvbGxTY2VuZSdcblxuY29uc3QgdXBkYXRlVHdlZW5Qcm9ncmVzcyA9IGZ1bmN0aW9uKFNjZW5lLCBUd2VlbiwgZ3NhcEZvcndhcmRTcGVlZCwgZ3NhcFJldmVyc2VTcGVlZCkge1xuICBpZiAoVHdlZW4pIHtcbiAgICBjb25zdCBwcm9ncmVzcyA9IFNjZW5lLnByb2dyZXNzKClcbiAgICBjb25zdCBzdGF0ZSA9IFNjZW5lLnN0YXRlKClcbiAgICBpZiAoVHdlZW4ucmVwZWF0ICYmIFR3ZWVuLnJlcGVhdCgpID09PSAtMSkge1xuICAgICAgLy8gaW5maW5pdGUgbG9vcCwgc28gbm90IGluIHJlbGF0aW9uIHRvIHByb2dyZXNzXG4gICAgICBpZiAoc3RhdGUgPT09ICdEVVJJTkcnICYmIFR3ZWVuLnBhdXNlZCgpKSB7XG4gICAgICAgIFR3ZWVuLnRpbWVTY2FsZShnc2FwRm9yd2FyZFNwZWVkKS5wbGF5KClcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUgIT09ICdEVVJJTkcnICYmICFUd2Vlbi5wYXVzZWQoKSkge1xuICAgICAgICBUd2Vlbi5wYXVzZSgpXG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChwcm9ncmVzcyAhPSBUd2Vlbi5wcm9ncmVzcygpKSB7XG4gICAgICAvLyBkbyB3ZSBldmVuIG5lZWQgdG8gdXBkYXRlIHRoZSBwcm9ncmVzcz9cbiAgICAgIC8vIG5vIGluZmluaXRlIGxvb3AgLSBzbyBzaG91bGQgd2UganVzdCBwbGF5IG9yIGdvIHRvIGEgc3BlY2lmaWMgcG9pbnQgaW4gdGltZT9cbiAgICAgIGlmIChTY2VuZS5kdXJhdGlvbigpID09PSAwKSB7XG4gICAgICAgIC8vIHBsYXkgdGhlIGFuaW1hdGlvblxuICAgICAgICBpZiAocHJvZ3Jlc3MgPiAwKSB7XG4gICAgICAgICAgLy8gcGxheSBmcm9tIDAgdG8gMVxuICAgICAgICAgIFR3ZWVuLnRpbWVTY2FsZShnc2FwRm9yd2FyZFNwZWVkKS5wbGF5KClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBwbGF5IGZyb20gMSB0byAwXG4gICAgICAgICAgVHdlZW4udGltZVNjYWxlKGdzYXBSZXZlcnNlU3BlZWQpLnJldmVyc2UoKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBnbyB0byBhIHNwZWNpZmljIHBvaW50IGluIHRpbWVcbiAgICAgICAgLy8ganVzdCBoYXJkIHNldCBpdFxuICAgICAgICBUd2Vlbi5wcm9ncmVzcyhwcm9ncmVzcykucGF1c2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5jb25zdCByZW1vdmVUd2VlbiA9IGZ1bmN0aW9uKFR3ZWVuKSB7XG4gIGlmIChUd2Vlbikge1xuICAgIFR3ZWVuLnBhdXNlKDApXG4gICAgVHdlZW4ua2lsbCgpXG4gIH1cbn1cblxuY29uc3Qgc2V0RHVyYXRpb24gPSAoU2NlbmUsIGR1cmF0aW9uKSA9PiB7XG4gIC8qIGNoZWNrIGlmIGR1cmF0aW9uIGlzIHNldCBhcyBhbiBIVE1MRWxlbWVudCAqL1xuICBpZiAoZHVyYXRpb24gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgIGxldCBwcmV2aW91c0hlaWdodFxuICAgIGxldCBjdXJyZW50SGVpZ2h0XG5cbiAgICBjb25zdCBnZXRIZWlnaHQgPSAoKSA9PiBkdXJhdGlvbi5vZmZzZXRIZWlnaHRcblxuICAgIGNvbnN0IHVwZGF0ZSA9ICgpID0+IHtcbiAgICAgIFNjZW5lLmR1cmF0aW9uKGdldEhlaWdodCgpKVxuICAgICAgcHJldmlvdXNIZWlnaHQgPSBnZXRIZWlnaHQoKVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gKCkgPT4ge1xuICAgICAgLyogc2V0IGR1cmF0aW9uIHRvIG1hdGNoIGhlaWdodCBvZiBlbGVtZW50ICovXG4gICAgICBjdXJyZW50SGVpZ2h0ID0gZ2V0SGVpZ2h0KClcblxuICAgICAgaWYgKGN1cnJlbnRIZWlnaHQgIT09IHByZXZpb3VzSGVpZ2h0KSB7XG4gICAgICAgIHVwZGF0ZSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgZm4oKVxuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRocm90dGxlKGZuLCA3MDApKVxuXG4gICAgY3VycmVudEhlaWdodCA9IGdldEhlaWdodCgpXG5cbiAgICB1cGRhdGUoKVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGR1cmF0aW9uKSkge1xuICAgIC8qIGlmIGFuIG9iamVjdCwgbWFrZSBicmVha3BvaW50cyAqL1xuICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhkdXJhdGlvbikucmV2ZXJzZSgpXG5cbiAgICBjb25zdCBmbiA9ICgpID0+IHtcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBrZXlzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBjb25zdCBicmVha3BvaW50ID0gcGFyc2VGbG9hdChrZXlzW2luZGV4XSlcblxuICAgICAgICBpZiAoYnJlYWtwb2ludCA8PSB3aW5kb3cuaW5uZXJXaWR0aCkge1xuICAgICAgICAgIFNjZW5lLmR1cmF0aW9uKGR1cmF0aW9uW2JyZWFrcG9pbnRdKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBmbigpXG5cbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhyb3R0bGUoZm4sIDcwMCkpXG4gIH0gZWxzZSB7XG4gICAgLyogbm90aGluZyBvZiB0aGUgYWJvdmU/IGp1c3Qgc2V0IGl0ICovXG4gICAgU2NlbmUuZHVyYXRpb24oZHVyYXRpb24pXG4gIH1cbn1cblxuY29uc3Qgc2V0Q2xhc3NOYW1lID0gKFNjZW5lLCBvcHRpb25zLCBkdXJhdGlvbikgPT4ge1xuICBjb25zdCB0b2dnbGUgPSB7XG4gICAgY2xhc3NOYW1lOiBudWxsLFxuICAgIGVsZW1lbnQ6IG51bGwsXG4gICAgcmV2ZXJzZTogZmFsc2UsXG4gICAgLi4ub3B0aW9ucyxcbiAgfVxuXG4gIGlmICghdG9nZ2xlLmNsYXNzTmFtZSkge1xuICAgIGVycm9yTG9nKG5hbWVTcGFjZSwgYEJlIHN1cmUgdG8gc2V0IGEgY2xhc3NOYW1lIGluIHRoZSBuZXcgJHtuYW1lU3BhY2V9KHsgdG9nZ2xlOiB7IGNsYXNzTmFtZTogXCJteS1jbGFzc1wiIH0gfSlgKVxuICB9XG5cbiAgaWYgKCF0b2dnbGUuZWxlbWVudCkge1xuICAgIGVycm9yTG9nKFxuICAgICAgbmFtZVNwYWNlLFxuICAgICAgYEJlIHN1cmUgdG8gc2V0IGEgY29uc3QgdG9nZ2xlRWxlbWVudCA9IChyZWFjdFJlZi5jdXJyZW50IG9yIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IpIGluIHRoZSBuZXcgJHtuYW1lU3BhY2V9KHsgdG9nZ2xlOiB7IGVsZW1lbnQ6IHRvZ2dsZUVsZW1lbnQgfSB9KWAsXG4gICAgKVxuICB9XG5cbiAgY29uc3QgYWRkQ2xhc3NOYW1lID0gKCkgPT5cbiAgICAhdG9nZ2xlLmVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKHRvZ2dsZS5jbGFzc05hbWUpICYmIHRvZ2dsZS5lbGVtZW50LmNsYXNzTGlzdC5hZGQodG9nZ2xlLmNsYXNzTmFtZSlcblxuICBjb25zdCByZW1vdmVDbGFzc05hbWUgPSAoKSA9PlxuICAgIHRvZ2dsZS5lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyh0b2dnbGUuY2xhc3NOYW1lKSAmJiB0b2dnbGUuZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRvZ2dsZS5jbGFzc05hbWUpXG5cbiAgU2NlbmUub24oJ2VudGVyJywgZnVuY3Rpb24oKSB7XG4gICAgYWRkQ2xhc3NOYW1lKClcbiAgfSlcblxuICBTY2VuZS5vbignYWRkJywgZnVuY3Rpb24oKSB7XG4gICAgaWYgKFNjZW5lLnN0YXRlKCkgPT09ICdEVVJJTkcnKSB7XG4gICAgICBhZGRDbGFzc05hbWUoKVxuICAgIH1cbiAgfSlcblxuICBTY2VuZS5vbignbGVhdmUnLCBmdW5jdGlvbihldmVudCkge1xuICAgIGlmICghdG9nZ2xlLnJldmVyc2UgJiYgZHVyYXRpb24pIHtcbiAgICAgIC8vIG5lZWRzIHRvIGJlIGJhc2VkIG9uIHdoZXRoZXIgb3Igbm90IHdlIGhhdmUgYSBkdXJhdGlvblxuICAgICAgZXZlbnQuc2Nyb2xsRGlyZWN0aW9uID09PSAnUkVWRVJTRScgJiYgcmVtb3ZlQ2xhc3NOYW1lKClcbiAgICB9IGVsc2Uge1xuICAgICAgcmVtb3ZlQ2xhc3NOYW1lKClcbiAgICB9XG4gIH0pXG5cbiAgU2NlbmUub24oJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgIHJlbW92ZUNsYXNzTmFtZSgpXG4gIH0pXG59XG5cbmNvbnN0IHNldFR3ZWVuID0gKFNjZW5lLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGdzYXAgPSB7XG4gICAgZm9yd2FyZFNwZWVkOiAxLFxuICAgIHJldmVyc2VTcGVlZDogMSxcbiAgICB0aW1lbGluZTogbnVsbCxcbiAgICAuLi5vcHRpb25zLFxuICB9XG5cbiAgaWYgKCFnc2FwLnRpbWVsaW5lKSB7XG4gICAgZXJyb3JMb2coXG4gICAgICBuYW1lU3BhY2UsXG4gICAgICBgQmUgc3VyZSB0byBzZXQgYSBjb25zdCB0bCA9IGdzYXAudGltZWxpbmUoeyBwYXVzZWQ6IHRydWUgfSkgaW4gdGhlIG5ldyAke25hbWVTcGFjZX0oeyBnc2FwOiB7IHRpbWVsaW5lOiB0bCB9IH0pYCxcbiAgICApXG4gIH1cblxuICBTY2VuZS5vbigncHJvZ3Jlc3MnLCBmdW5jdGlvbigpIHtcbiAgICB1cGRhdGVUd2VlblByb2dyZXNzKFNjZW5lLCBnc2FwLnRpbWVsaW5lLCBnc2FwLmZvcndhcmRTcGVlZCwgZ3NhcC5yZXZlcnNlU3BlZWQpXG4gIH0pXG5cbiAgU2NlbmUub24oJ3JlbW92ZScsIGZ1bmN0aW9uKCkge1xuICAgIHJlbW92ZVR3ZWVuKGdzYXAudGltZWxpbmUpXG4gIH0pXG59XG5cbmludGVyZmFjZSBJU2Nyb2xsU2NlbmVUb2dnbGUgZXh0ZW5kcyBJU2Nyb2xsT2JzZXJ2ZXJUb2dnbGUge1xuICAvKipcbiAgICogcmV2ZXJzZVxuICAgKiBAZGVzYyBTcGVjaWZ5IHRoZSBjbGFzc05hbWUgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgdGhlIGR1cmF0aW9uIG9mIHNjZW5lIGlzIG1ldC4gT25seSBhcHBsaWVzIGlmIHNjZW5lIGhhcyBkdXJhdGlvbi5cbiAgICogQHR5cGUgYm9vbGVhblxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKiBAZXhhbXBsZVxuICAgKiB0b2dnbGU6IHsgcmV2ZXJzZTogdHJ1ZSB9XG4gICAqL1xuICByZXZlcnNlPzogYm9vbGVhblxufVxuXG5pbnRlcmZhY2UgSVNjcm9sbFNjZW5lIHtcbiAgLyoqXG4gICAqIGJyZWFrcG9pbnRzXG4gICAqIEBkZXNjIFVzZSB0byBzZXQgcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIG5ldyBTY3JvbGxNYWdpYy5TY2VuZSwgbW9iaWxlLWZpcnN0XG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiBicmVha3BvaW50czogeyAwOiBmYWxzZSwgNzY4OiB0cnVlIH1cbiAgICovXG4gIGJyZWFrcG9pbnRzPzogb2JqZWN0XG5cbiAgLyoqXG4gICAqIGNvbnRyb2xsZXJcbiAgICogQGRlc2MgRXh0cmEgb3B0aW9ucyB0byBwYXNzIHRoZSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlciwgbGlrZSB2ZXJ0aWNhbCwgZXRjLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogY29udHJvbGxlcjogeyB2ZXJ0aWNhbDogZmFsc2UgfVxuICAgKi9cbiAgY29udHJvbGxlcj86IG9iamVjdFxuXG4gIC8qKlxuICAgKiBkdXJhdGlvblxuICAgKiBAZGVzYyBVc2UgdG8gc2V0IHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBuZXcgU2Nyb2xsTWFnaWMuU2NlbmUsIG1vYmlsZS1maXJzdCAoaWYgc2V0dGluZyBicmVha3BvaW50cylcbiAgICogTXVzdCBiZSBzdHJpbmcgZm9yIHBlcmNlbnRhZ2UsIGFuZCBudW1iZXIgZm9yIHBpeGVsLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogZHVyYXRpb246ICcxMDAlJyA9IDEwMHZoXG4gICAqIGR1cmF0aW9uOiAxMDAgPSAxMDBweFxuICAgKiBkdXJhdGlvbjogeyAwOiAnNTAlJywgNzY4OiAnMTAwJSB9IC8vID0gU2Nyb2xsU2NlbmUgbGFzdHMgNTB2aCBvbiBtb2JpbGUsIDEwMCUgYWZ0ZXJcbiAgICovXG4gIGR1cmF0aW9uPzogc3RyaW5nIHwgbnVtYmVyIHwgb2JqZWN0XG5cbiAgLyoqXG4gICAqIGdzYXBcbiAgICogQGRlc2MgVXNlIHRvIHNldCBvcHRpb25zIGZvciB0aGUgZ3NhcCBhbmltYXRpb24gb2YgdGhlIFNjcm9sbE9ic2VydmVyLlxuICAgKiBAdHlwZSBvYmplY3RcbiAgICogQGV4YW1wbGVcbiAgICogZ3NhcDogeyB0aW1lbGluZTogbXlUaW1lbGluZSwgeW95bzogdHJ1ZSwgcmV2ZXJzZVNwZWVkOiAyIH1cbiAgICovXG4gIGdzYXA/OiBJU2Nyb2xsT2JzZXJ2ZXJHc2FwXG5cbiAgLyoqXG4gICAqIHRyaWdnZXJIb29rXG4gICAqIEBkZXNjIFNldCB0aGUgb2Zmc2V0IG9mIHRoZSBTY3JvbGxNYWdpYyBzY2VuZS5cbiAgICogQHR5cGUgIG51bWJlciB8IHN0cmluZ1xuICAgKiBAZGVmYXVsdHZhbHVlIDBcbiAgICogQGV4YW1wbGVcbiAgICogb2Zmc2V0OiAxMDBcbiAgICogb2Zmc2V0OiAnMTAlJ1xuICAgKi9cbiAgb2Zmc2V0PzogbnVtYmVyIHwgc3RyaW5nXG5cbiAgLyoqXG4gICAqIHNjZW5lXG4gICAqIEBkZXNjIEV4dHJhIG9wdGlvbnMgdG8gcGFzcyB0aGUgbmV3IFNjcm9sbE1hZ2ljLlNjZW5lLCBsaWtlIGxvZ0xldmVsLCBldGMuXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiBzY2VuZTogeyBsb2dMZXZlbDogMiB9XG4gICAqL1xuICBzY2VuZT86IG9iamVjdFxuXG4gIC8qKlxuICAgKiB0b2dnbGVcbiAgICogQGRlc2MgVXNlIHRvIHNldCB0aGUgb3B0aW9ucyBmb3IgdGhlIHRvZ2dsaW5nIG9mIGEgY2xhc3NOYW1lXG4gICAqIEB0eXBlIG9iamVjdFxuICAgKiBAZXhhbXBsZVxuICAgKiB0b2dnbGU6IHsgZWxlbWVudDogY29udGFpbmVyUmVmLmN1cnJlbnQsIGNsYXNzTmFtZTogJ2xldHMtZG8tdGhpcycgfVxuICAgKi9cbiAgdG9nZ2xlPzogSVNjcm9sbFNjZW5lVG9nZ2xlXG5cbiAgLyoqXG4gICAqIHRyaWdnZXJFbGVtZW50XG4gICAqIEBkZXNjIFNldCB0aGUgZWxlbWVudCB5b3Ugd2lzaCB0byB0cmlnZ2VyIGV2ZW50cyBiYXNlZCB1cG9uLCB0aGUgb2JzZXJ2ZWQgZWxlbWVudC5cbiAgICogQHR5cGUgIEhUTUxFbGVtZW50IHwgYW55XG4gICAqIEBleGFtcGxlXG4gICAqIHRyaWdnZXJFbGVtZW50OiB0cmlnZ2VyUmVmLmN1cnJlbnRcbiAgICovXG4gIHRyaWdnZXJFbGVtZW50OiBIVE1MRWxlbWVudCB8IGFueVxuXG4gIC8qKlxuICAgKiB0cmlnZ2VySG9va1xuICAgKiBAZGVzYyBTZXQgdGhlIHRyaWdnZXJIb29rIG9mIHRoZSBTY3JvbGxNYWdpYyBzY2VuZS5cbiAgICogQHR5cGUgIG51bWJlclxuICAgKiBAZGVmYXVsdHZhbHVlICdvbkVudGVyJ1xuICAgKiBAZXhhbXBsZVxuICAgKiB0cmlnZ2VySG9vazogMC41XG4gICAqL1xuICB0cmlnZ2VySG9vaz86IG51bWJlciB8IHN0cmluZ1xuXG4gIC8qKlxuICAgKiB1c2VHbG9iYWxDb250cm9sbGVyXG4gICAqIEBkZXNjIENob3NlIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgZ2xvYmFsQ29udHJvbGxlciBwcm92aWRlZCBmb3IgeW91LCBvciBhIGZyZXNoIG5ldyBTY3JvbGxNYWdpYy5Db250cm9sbGVyIGluc3RhbmNlLlxuICAgKiBAdHlwZSBib29sZWFuXG4gICAqIEBkZWZhdWx0VmFsdWUgdHJ1ZVxuICAgKiBAZXhhbXBsZVxuICAgKiB1c2VHbG9iYWxDb250cm9sbGVyOiBmYWxzZVxuICAgKi9cbiAgdXNlR2xvYmFsQ29udHJvbGxlcj86IGJvb2xlYW5cbn1cblxuLy8gYWRkIGNvbnRyb2xsZXIgdmFyXG5sZXQgZ2xvYmFsQ29udHJvbGxlclxuXG5jb25zdCBTY3JvbGxTY2VuZSA9IGZ1bmN0aW9uKFxuICB0aGlzOiBhbnksXG4gIHtcbiAgICBicmVha3BvaW50cyxcbiAgICBjb250cm9sbGVyID0ge30sXG4gICAgZHVyYXRpb24sXG4gICAgZ3NhcCxcbiAgICBvZmZzZXQgPSAwLFxuICAgIHNjZW5lID0ge30sXG4gICAgdG9nZ2xlLFxuICAgIHRyaWdnZXJFbGVtZW50LFxuICAgIHRyaWdnZXJIb29rID0gJ29uRW50ZXInLFxuICAgIHVzZUdsb2JhbENvbnRyb2xsZXIgPSB0cnVlLFxuICB9OiBJU2Nyb2xsU2NlbmUsXG4pIHtcbiAgbGV0IGxvY2FsQ29udHJvbGxlclxuXG4gIC8vIGNoZWNrIGlmIHVzaW5nIGEgbG9jYWwgY29udHJvbGxlclxuICBpZiAoIXVzZUdsb2JhbENvbnRyb2xsZXIpIHtcbiAgICBsb2NhbENvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcihjb250cm9sbGVyKVxuICB9XG5cbiAgLy8gbW91bnQgY29udHJvbGxlclxuICBpZiAoIWdsb2JhbENvbnRyb2xsZXIgJiYgdXNlR2xvYmFsQ29udHJvbGxlcikge1xuICAgIGdsb2JhbENvbnRyb2xsZXIgPSBuZXcgU2Nyb2xsTWFnaWMuQ29udHJvbGxlcihjb250cm9sbGVyKVxuICB9XG5cbiAgY29uc3QgY29udHJvbGxlcklzVXNlID0gbG9jYWxDb250cm9sbGVyID8gbG9jYWxDb250cm9sbGVyIDogZ2xvYmFsQ29udHJvbGxlclxuXG4gIGlmICghdHJpZ2dlckVsZW1lbnQpIHtcbiAgICBlcnJvckxvZyhcbiAgICAgIG5hbWVTcGFjZSxcbiAgICAgIGBCZSBzdXJlIHRvIHNldCBhIGNvbnN0IHRyaWdnZXJFbGVtZW50ID0gKHJlYWN0UmVmLmN1cnJlbnQgb3IgZG9jdW1lbnQucXVlcnlTZWxlY3RvcikgaW4gdGhlIG5ldyAke25hbWVTcGFjZX0oeyB0cmlnZ2VyRWxlbWVudDogdHJpZ2dlckVsZW1lbnQgfSkuYCxcbiAgICApXG4gIH1cblxuICBjb25zdCBTY2VuZSA9IG5ldyBTY3JvbGxNYWdpYy5TY2VuZSh7XG4gICAgdHJpZ2dlckVsZW1lbnQsXG4gICAgdHJpZ2dlckhvb2ssXG4gICAgb2Zmc2V0LFxuICAgIC4uLnNjZW5lLFxuICB9KVxuXG4gIGlmIChkdXJhdGlvbikge1xuICAgIHNldER1cmF0aW9uKFNjZW5lLCBkdXJhdGlvbilcbiAgfVxuXG4gIGlmICh0b2dnbGUgJiYgaXNPYmplY3QodG9nZ2xlKSkge1xuICAgIHNldENsYXNzTmFtZShTY2VuZSwgdG9nZ2xlLCBkdXJhdGlvbilcbiAgfVxuXG4gIGlmIChnc2FwICYmIGlzT2JqZWN0KGdzYXApKSB7XG4gICAgc2V0VHdlZW4oU2NlbmUsIGdzYXApXG4gIH1cblxuICB0aGlzLmluaXQgPSBmdW5jdGlvbigpIHtcbiAgICBjb250cm9sbGVySXNVc2UgJiYgU2NlbmUuYWRkVG8oY29udHJvbGxlcklzVXNlKVxuICB9XG5cbiAgdGhpcy5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gICAgU2NlbmUucmVtb3ZlKClcbiAgfVxuXG4gIHRoaXMuU2NlbmUgPSBTY2VuZVxuICB0aGlzLkNvbnRyb2xsZXIgPSBjb250cm9sbGVySXNVc2VcblxuICBzY3JvbGxBbmltYXRpb25Jbml0KGJyZWFrcG9pbnRzLCB0aGlzLmluaXQsIHRoaXMuZGVzdHJveSlcbn1cblxuZXhwb3J0IHsgU2Nyb2xsU2NlbmUgfVxuIl19