matrix-react-sdk
Version:
SDK for matrix.org using React
157 lines (125 loc) • 19.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = exports.Alignment = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _reactDom = _interopRequireDefault(require("react-dom"));
var _classnames = _interopRequireDefault(require("classnames"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _class2, _temp;
const MIN_TOOLTIP_HEIGHT = 25;
let Alignment;
exports.Alignment = Alignment;
(function (Alignment) {
Alignment[Alignment["Natural"] = 0] = "Natural";
Alignment[Alignment["Left"] = 1] = "Left";
Alignment[Alignment["Right"] = 2] = "Right";
Alignment[Alignment["Top"] = 3] = "Top";
Alignment[Alignment["Bottom"] = 4] = "Bottom";
})(Alignment || (exports.Alignment = Alignment = {}));
let Tooltip = (_dec = (0, _replaceableComponent.replaceableComponent)("views.elements.Tooltip"), _dec(_class = (_temp = _class2 = class Tooltip extends _react.default.Component
/*:: <IProps>*/
{
constructor(...args) {
super(...args);
(0, _defineProperty2.default)(this, "tooltipContainer", void 0);
(0, _defineProperty2.default)(this, "tooltip", void 0);
(0, _defineProperty2.default)(this, "parent", void 0);
(0, _defineProperty2.default)(this, "renderTooltip", () => {
// Add the parent's position to the tooltips, so it's correctly
// positioned, also taking into account any window zoom
// NOTE: The additional 6 pixels for the left position, is to take account of the
// tooltips chevron
const style = this.updatePosition({}); // Hide the entire container when not visible. This prevents flashing of the tooltip
// if it is not meant to be visible on first mount.
style.display = this.props.visible ? "block" : "none";
const tooltipClasses = (0, _classnames.default)("mx_Tooltip", this.props.tooltipClassName, {
"mx_Tooltip_visible": this.props.visible,
"mx_Tooltip_invisible": !this.props.visible
});
const tooltip = /*#__PURE__*/_react.default.createElement("div", {
className: tooltipClasses,
style: style
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Tooltip_chevron"
}), this.props.label); // Render the tooltip manually, as we wish it not to be rendered within the parent
this.tooltip = _reactDom.default.render(tooltip, this.tooltipContainer);
});
}
// Create a wrapper for the tooltip outside the parent and attach it to the body element
componentDidMount() {
this.tooltipContainer = document.createElement("div");
this.tooltipContainer.className = "mx_Tooltip_wrapper";
document.body.appendChild(this.tooltipContainer);
window.addEventListener('scroll', this.renderTooltip, true);
this.parent = _reactDom.default.findDOMNode(this).parentNode;
this.renderTooltip();
}
componentDidUpdate() {
this.renderTooltip();
} // Remove the wrapper element, as the tooltip has finished using it
componentWillUnmount() {
_reactDom.default.unmountComponentAtNode(this.tooltipContainer);
document.body.removeChild(this.tooltipContainer);
window.removeEventListener('scroll', this.renderTooltip, true);
}
updatePosition(style
/*: CSSProperties*/
) {
const parentBox = this.parent.getBoundingClientRect();
let offset = 0;
if (parentBox.height > MIN_TOOLTIP_HEIGHT) {
offset = Math.floor((parentBox.height - MIN_TOOLTIP_HEIGHT) / 2);
} else {
// The tooltip is larger than the parent height: figure out what offset
// we need so that we're still centered.
offset = Math.floor(parentBox.height - MIN_TOOLTIP_HEIGHT);
}
const baseTop = parentBox.top - 2 + this.props.yOffset + window.pageYOffset;
const top = baseTop + offset;
const right = window.innerWidth - parentBox.right - window.pageXOffset - 16;
const left = parentBox.right + window.pageXOffset + 6;
const horizontalCenter = parentBox.right - window.pageXOffset - parentBox.width / 2;
switch (this.props.alignment) {
case Alignment.Natural:
if (parentBox.right > window.innerWidth / 2) {
style.right = right;
style.top = top;
break;
}
// fall through to Right
case Alignment.Right:
style.left = left;
style.top = top;
break;
case Alignment.Left:
style.right = right;
style.top = top;
break;
case Alignment.Top:
style.top = baseTop - 16;
style.left = horizontalCenter;
break;
case Alignment.Bottom:
style.top = baseTop + parentBox.height;
style.left = horizontalCenter;
break;
}
return style;
}
render() {
// Render a placeholder
return /*#__PURE__*/_react.default.createElement("div", {
className: this.props.className
});
}
}, (0, _defineProperty2.default)(_class2, "Alignment", Alignment), (0, _defineProperty2.default)(_class2, "defaultProps", {
visible: true,
yOffset: 0,
alignment: Alignment.Natural
}), _temp)) || _class);
exports.default = Tooltip;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL1Rvb2x0aXAudHN4Il0sIm5hbWVzIjpbIk1JTl9UT09MVElQX0hFSUdIVCIsIkFsaWdubWVudCIsIlRvb2x0aXAiLCJSZWFjdCIsIkNvbXBvbmVudCIsInN0eWxlIiwidXBkYXRlUG9zaXRpb24iLCJkaXNwbGF5IiwicHJvcHMiLCJ2aXNpYmxlIiwidG9vbHRpcENsYXNzZXMiLCJ0b29sdGlwQ2xhc3NOYW1lIiwidG9vbHRpcCIsImxhYmVsIiwiUmVhY3RET00iLCJyZW5kZXIiLCJ0b29sdGlwQ29udGFpbmVyIiwiY29tcG9uZW50RGlkTW91bnQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJ3aW5kb3ciLCJhZGRFdmVudExpc3RlbmVyIiwicmVuZGVyVG9vbHRpcCIsInBhcmVudCIsImZpbmRET01Ob2RlIiwicGFyZW50Tm9kZSIsImNvbXBvbmVudERpZFVwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudENvbXBvbmVudEF0Tm9kZSIsInJlbW92ZUNoaWxkIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInBhcmVudEJveCIsImdldEJvdW5kaW5nQ2xpZW50UmVjdCIsIm9mZnNldCIsImhlaWdodCIsIk1hdGgiLCJmbG9vciIsImJhc2VUb3AiLCJ0b3AiLCJ5T2Zmc2V0IiwicGFnZVlPZmZzZXQiLCJyaWdodCIsImlubmVyV2lkdGgiLCJwYWdlWE9mZnNldCIsImxlZnQiLCJob3Jpem9udGFsQ2VudGVyIiwid2lkdGgiLCJhbGlnbm1lbnQiLCJOYXR1cmFsIiwiUmlnaHQiLCJMZWZ0IiwiVG9wIiwiQm90dG9tIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztBQUVBLE1BQU1BLGtCQUFrQixHQUFHLEVBQTNCO0lBRVlDLFM7OztXQUFBQSxTO0FBQUFBLEVBQUFBLFMsQ0FBQUEsUztBQUFBQSxFQUFBQSxTLENBQUFBLFM7QUFBQUEsRUFBQUEsUyxDQUFBQSxTO0FBQUFBLEVBQUFBLFMsQ0FBQUEsUztBQUFBQSxFQUFBQSxTLENBQUFBLFM7R0FBQUEsUyx5QkFBQUEsUzs7SUF3QlNDLE8sV0FEcEIsZ0RBQXFCLHdCQUFyQixDLG1DQUFELE1BQ3FCQSxPQURyQixTQUNxQ0MsZUFBTUM7QUFEM0M7QUFDNkQ7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEseURBbUZqQyxNQUFNO0FBQzFCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsWUFBTUMsS0FBSyxHQUFHLEtBQUtDLGNBQUwsQ0FBb0IsRUFBcEIsQ0FBZCxDQUwwQixDQU0xQjtBQUNBOztBQUNBRCxNQUFBQSxLQUFLLENBQUNFLE9BQU4sR0FBZ0IsS0FBS0MsS0FBTCxDQUFXQyxPQUFYLEdBQXFCLE9BQXJCLEdBQStCLE1BQS9DO0FBRUEsWUFBTUMsY0FBYyxHQUFHLHlCQUFXLFlBQVgsRUFBeUIsS0FBS0YsS0FBTCxDQUFXRyxnQkFBcEMsRUFBc0Q7QUFDekUsOEJBQXNCLEtBQUtILEtBQUwsQ0FBV0MsT0FEd0M7QUFFekUsZ0NBQXdCLENBQUMsS0FBS0QsS0FBTCxDQUFXQztBQUZxQyxPQUF0RCxDQUF2Qjs7QUFLQSxZQUFNRyxPQUFPLGdCQUNUO0FBQUssUUFBQSxTQUFTLEVBQUVGLGNBQWhCO0FBQWdDLFFBQUEsS0FBSyxFQUFFTDtBQUF2QyxzQkFDSTtBQUFLLFFBQUEsU0FBUyxFQUFDO0FBQWYsUUFESixFQUVNLEtBQUtHLEtBQUwsQ0FBV0ssS0FGakIsQ0FESixDQWYwQixDQXNCMUI7OztBQUNBLFdBQUtELE9BQUwsR0FBZUUsa0JBQVNDLE1BQVQsQ0FBeUJILE9BQXpCLEVBQWtDLEtBQUtJLGdCQUF2QyxDQUFmO0FBQ0gsS0EzR3dEO0FBQUE7O0FBZXpEO0FBQ09DLEVBQUFBLGlCQUFQLEdBQTJCO0FBQ3ZCLFNBQUtELGdCQUFMLEdBQXdCRSxRQUFRLENBQUNDLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBeEI7QUFDQSxTQUFLSCxnQkFBTCxDQUFzQkksU0FBdEIsR0FBa0Msb0JBQWxDO0FBQ0FGLElBQUFBLFFBQVEsQ0FBQ0csSUFBVCxDQUFjQyxXQUFkLENBQTBCLEtBQUtOLGdCQUEvQjtBQUNBTyxJQUFBQSxNQUFNLENBQUNDLGdCQUFQLENBQXdCLFFBQXhCLEVBQWtDLEtBQUtDLGFBQXZDLEVBQXNELElBQXREO0FBRUEsU0FBS0MsTUFBTCxHQUFjWixrQkFBU2EsV0FBVCxDQUFxQixJQUFyQixFQUEyQkMsVUFBekM7QUFFQSxTQUFLSCxhQUFMO0FBQ0g7O0FBRU1JLEVBQUFBLGtCQUFQLEdBQTRCO0FBQ3hCLFNBQUtKLGFBQUw7QUFDSCxHQTdCd0QsQ0ErQnpEOzs7QUFDT0ssRUFBQUEsb0JBQVAsR0FBOEI7QUFDMUJoQixzQkFBU2lCLHNCQUFULENBQWdDLEtBQUtmLGdCQUFyQzs7QUFDQUUsSUFBQUEsUUFBUSxDQUFDRyxJQUFULENBQWNXLFdBQWQsQ0FBMEIsS0FBS2hCLGdCQUEvQjtBQUNBTyxJQUFBQSxNQUFNLENBQUNVLG1CQUFQLENBQTJCLFFBQTNCLEVBQXFDLEtBQUtSLGFBQTFDLEVBQXlELElBQXpEO0FBQ0g7O0FBRU9uQixFQUFBQSxjQUFSLENBQXVCRDtBQUF2QjtBQUFBLElBQTZDO0FBQ3pDLFVBQU02QixTQUFTLEdBQUcsS0FBS1IsTUFBTCxDQUFZUyxxQkFBWixFQUFsQjtBQUNBLFFBQUlDLE1BQU0sR0FBRyxDQUFiOztBQUNBLFFBQUlGLFNBQVMsQ0FBQ0csTUFBVixHQUFtQnJDLGtCQUF2QixFQUEyQztBQUN2Q29DLE1BQUFBLE1BQU0sR0FBR0UsSUFBSSxDQUFDQyxLQUFMLENBQVcsQ0FBQ0wsU0FBUyxDQUFDRyxNQUFWLEdBQW1CckMsa0JBQXBCLElBQTBDLENBQXJELENBQVQ7QUFDSCxLQUZELE1BRU87QUFDSDtBQUNBO0FBQ0FvQyxNQUFBQSxNQUFNLEdBQUdFLElBQUksQ0FBQ0MsS0FBTCxDQUFXTCxTQUFTLENBQUNHLE1BQVYsR0FBbUJyQyxrQkFBOUIsQ0FBVDtBQUNIOztBQUVELFVBQU13QyxPQUFPLEdBQUlOLFNBQVMsQ0FBQ08sR0FBVixHQUFnQixDQUFoQixHQUFvQixLQUFLakMsS0FBTCxDQUFXa0MsT0FBaEMsR0FBMkNuQixNQUFNLENBQUNvQixXQUFsRTtBQUNBLFVBQU1GLEdBQUcsR0FBR0QsT0FBTyxHQUFHSixNQUF0QjtBQUNBLFVBQU1RLEtBQUssR0FBR3JCLE1BQU0sQ0FBQ3NCLFVBQVAsR0FBb0JYLFNBQVMsQ0FBQ1UsS0FBOUIsR0FBc0NyQixNQUFNLENBQUN1QixXQUE3QyxHQUEyRCxFQUF6RTtBQUNBLFVBQU1DLElBQUksR0FBR2IsU0FBUyxDQUFDVSxLQUFWLEdBQWtCckIsTUFBTSxDQUFDdUIsV0FBekIsR0FBdUMsQ0FBcEQ7QUFDQSxVQUFNRSxnQkFBZ0IsR0FBR2QsU0FBUyxDQUFDVSxLQUFWLEdBQWtCckIsTUFBTSxDQUFDdUIsV0FBekIsR0FBd0NaLFNBQVMsQ0FBQ2UsS0FBVixHQUFrQixDQUFuRjs7QUFDQSxZQUFRLEtBQUt6QyxLQUFMLENBQVcwQyxTQUFuQjtBQUNJLFdBQUtqRCxTQUFTLENBQUNrRCxPQUFmO0FBQ0ksWUFBSWpCLFNBQVMsQ0FBQ1UsS0FBVixHQUFrQnJCLE1BQU0sQ0FBQ3NCLFVBQVAsR0FBb0IsQ0FBMUMsRUFBNkM7QUFDekN4QyxVQUFBQSxLQUFLLENBQUN1QyxLQUFOLEdBQWNBLEtBQWQ7QUFDQXZDLFVBQUFBLEtBQUssQ0FBQ29DLEdBQU4sR0FBWUEsR0FBWjtBQUNBO0FBQ0g7O0FBQ0Q7O0FBQ0osV0FBS3hDLFNBQVMsQ0FBQ21ELEtBQWY7QUFDSS9DLFFBQUFBLEtBQUssQ0FBQzBDLElBQU4sR0FBYUEsSUFBYjtBQUNBMUMsUUFBQUEsS0FBSyxDQUFDb0MsR0FBTixHQUFZQSxHQUFaO0FBQ0E7O0FBQ0osV0FBS3hDLFNBQVMsQ0FBQ29ELElBQWY7QUFDSWhELFFBQUFBLEtBQUssQ0FBQ3VDLEtBQU4sR0FBY0EsS0FBZDtBQUNBdkMsUUFBQUEsS0FBSyxDQUFDb0MsR0FBTixHQUFZQSxHQUFaO0FBQ0E7O0FBQ0osV0FBS3hDLFNBQVMsQ0FBQ3FELEdBQWY7QUFDSWpELFFBQUFBLEtBQUssQ0FBQ29DLEdBQU4sR0FBWUQsT0FBTyxHQUFHLEVBQXRCO0FBQ0FuQyxRQUFBQSxLQUFLLENBQUMwQyxJQUFOLEdBQWFDLGdCQUFiO0FBQ0E7O0FBQ0osV0FBSy9DLFNBQVMsQ0FBQ3NELE1BQWY7QUFDSWxELFFBQUFBLEtBQUssQ0FBQ29DLEdBQU4sR0FBWUQsT0FBTyxHQUFHTixTQUFTLENBQUNHLE1BQWhDO0FBQ0FoQyxRQUFBQSxLQUFLLENBQUMwQyxJQUFOLEdBQWFDLGdCQUFiO0FBQ0E7QUF2QlI7O0FBMEJBLFdBQU8zQyxLQUFQO0FBQ0g7O0FBNEJNVSxFQUFBQSxNQUFQLEdBQWdCO0FBQ1o7QUFDQSx3QkFDSTtBQUFLLE1BQUEsU0FBUyxFQUFFLEtBQUtQLEtBQUwsQ0FBV1k7QUFBM0IsTUFESjtBQUlIOztBQW5Id0QsQyxzREFPdEJuQixTLDBEQUVHO0FBQ2xDUSxFQUFBQSxPQUFPLEVBQUUsSUFEeUI7QUFFbENpQyxFQUFBQSxPQUFPLEVBQUUsQ0FGeUI7QUFHbENRLEVBQUFBLFNBQVMsRUFBRWpELFNBQVMsQ0FBQ2tEO0FBSGEsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuQ29weXJpZ2h0IDIwMTkgTmV3IFZlY3RvciBMdGRcbkNvcHlyaWdodCAyMDE5IE1pY2hhZWwgVGVsYXR5bnNraSA8N3QzY2hndXlAZ21haWwuY29tPlxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5cbmltcG9ydCBSZWFjdCwge0NvbXBvbmVudCwgQ1NTUHJvcGVydGllc30gZnJvbSAncmVhY3QnO1xuaW1wb3J0IFJlYWN0RE9NIGZyb20gJ3JlYWN0LWRvbSc7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tICdjbGFzc25hbWVzJztcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5jb25zdCBNSU5fVE9PTFRJUF9IRUlHSFQgPSAyNTtcblxuZXhwb3J0IGVudW0gQWxpZ25tZW50IHtcbiAgICBOYXR1cmFsLCAvLyBQaWNrIGxlZnQgb3IgcmlnaHRcbiAgICBMZWZ0LFxuICAgIFJpZ2h0LFxuICAgIFRvcCwgLy8gQ2VudGVyZWRcbiAgICBCb3R0b20sIC8vIENlbnRlcmVkXG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgICAgICAvLyBDbGFzcyBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IHVzZWQgdG8gcG9zaXRpb24gdGhlIHRvb2x0aXBcbiAgICAgICAgY2xhc3NOYW1lPzogc3RyaW5nO1xuICAgICAgICAvLyBDbGFzcyBhcHBsaWVkIHRvIHRoZSB0b29sdGlwIGl0c2VsZlxuICAgICAgICB0b29sdGlwQ2xhc3NOYW1lPzogc3RyaW5nO1xuICAgICAgICAvLyBXaGV0aGVyIHRoZSB0b29sdGlwIGlzIHZpc2libGUgb3IgaGlkZGVuLlxuICAgICAgICAvLyBUaGUgaGlkZGVuIHN0YXRlIGFsbG93cyBhbmltYXRpbmcgdGhlIHRvb2x0aXAgYXdheSB2aWEgQ1NTLlxuICAgICAgICAvLyBEZWZhdWx0cyB0byB2aXNpYmxlIGlmIHVuc2V0LlxuICAgICAgICB2aXNpYmxlPzogYm9vbGVhbjtcbiAgICAgICAgLy8gdGhlIHJlYWN0IGVsZW1lbnQgdG8gcHV0IGludG8gdGhlIHRvb2x0aXBcbiAgICAgICAgbGFiZWw6IFJlYWN0LlJlYWN0Tm9kZTtcbiAgICAgICAgYWxpZ25tZW50PzogQWxpZ25tZW50OyAvLyBkZWZhdWx0cyB0byBOYXR1cmFsXG4gICAgICAgIHlPZmZzZXQ/OiBudW1iZXI7XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmVsZW1lbnRzLlRvb2x0aXBcIilcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRvb2x0aXAgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzPiB7XG4gICAgcHJpdmF0ZSB0b29sdGlwQ29udGFpbmVyOiBIVE1MRWxlbWVudDtcbiAgICBwcml2YXRlIHRvb2x0aXA6IHZvaWQgfCBFbGVtZW50IHwgQ29tcG9uZW50PEVsZW1lbnQsIGFueSwgYW55PjtcbiAgICBwcml2YXRlIHBhcmVudDogRWxlbWVudDtcblxuICAgIC8vIFhYWDogVGhpcyBpcyBiZWNhdXNlIHNvbWUgY29tcG9uZW50cyAoRmllbGQpIGFyZSB1bmFibGUgdG8gYGltcG9ydGAgdGhlIFRvb2x0aXAgY2xhc3MsXG4gICAgLy8gc28gd2UgZXhwb3NlIHRoZSBBbGlnbm1lbnQgb3B0aW9ucyBvZmYgb2YgdXMgc3RhdGljYWxseS5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFsaWdubWVudCA9IEFsaWdubWVudDtcblxuICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlLFxuICAgICAgICB5T2Zmc2V0OiAwLFxuICAgICAgICBhbGlnbm1lbnQ6IEFsaWdubWVudC5OYXR1cmFsLFxuICAgIH07XG5cbiAgICAvLyBDcmVhdGUgYSB3cmFwcGVyIGZvciB0aGUgdG9vbHRpcCBvdXRzaWRlIHRoZSBwYXJlbnQgYW5kIGF0dGFjaCBpdCB0byB0aGUgYm9keSBlbGVtZW50XG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCkge1xuICAgICAgICB0aGlzLnRvb2x0aXBDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuICAgICAgICB0aGlzLnRvb2x0aXBDb250YWluZXIuY2xhc3NOYW1lID0gXCJteF9Ub29sdGlwX3dyYXBwZXJcIjtcbiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0aGlzLnRvb2x0aXBDb250YWluZXIpO1xuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5yZW5kZXJUb29sdGlwLCB0cnVlKTtcblxuICAgICAgICB0aGlzLnBhcmVudCA9IFJlYWN0RE9NLmZpbmRET01Ob2RlKHRoaXMpLnBhcmVudE5vZGUgYXMgRWxlbWVudDtcblxuICAgICAgICB0aGlzLnJlbmRlclRvb2x0aXAoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkVXBkYXRlKCkge1xuICAgICAgICB0aGlzLnJlbmRlclRvb2x0aXAoKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGhlIHdyYXBwZXIgZWxlbWVudCwgYXMgdGhlIHRvb2x0aXAgaGFzIGZpbmlzaGVkIHVzaW5nIGl0XG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICBSZWFjdERPTS51bm1vdW50Q29tcG9uZW50QXROb2RlKHRoaXMudG9vbHRpcENvbnRhaW5lcik7XG4gICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGhpcy50b29sdGlwQ29udGFpbmVyKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMucmVuZGVyVG9vbHRpcCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVQb3NpdGlvbihzdHlsZTogQ1NTUHJvcGVydGllcykge1xuICAgICAgICBjb25zdCBwYXJlbnRCb3ggPSB0aGlzLnBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgICAgbGV0IG9mZnNldCA9IDA7XG4gICAgICAgIGlmIChwYXJlbnRCb3guaGVpZ2h0ID4gTUlOX1RPT0xUSVBfSEVJR0hUKSB7XG4gICAgICAgICAgICBvZmZzZXQgPSBNYXRoLmZsb29yKChwYXJlbnRCb3guaGVpZ2h0IC0gTUlOX1RPT0xUSVBfSEVJR0hUKSAvIDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGhlIHRvb2x0aXAgaXMgbGFyZ2VyIHRoYW4gdGhlIHBhcmVudCBoZWlnaHQ6IGZpZ3VyZSBvdXQgd2hhdCBvZmZzZXRcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgc28gdGhhdCB3ZSdyZSBzdGlsbCBjZW50ZXJlZC5cbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGguZmxvb3IocGFyZW50Qm94LmhlaWdodCAtIE1JTl9UT09MVElQX0hFSUdIVCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXNlVG9wID0gKHBhcmVudEJveC50b3AgLSAyICsgdGhpcy5wcm9wcy55T2Zmc2V0KSArIHdpbmRvdy5wYWdlWU9mZnNldDtcbiAgICAgICAgY29uc3QgdG9wID0gYmFzZVRvcCArIG9mZnNldDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSB3aW5kb3cuaW5uZXJXaWR0aCAtIHBhcmVudEJveC5yaWdodCAtIHdpbmRvdy5wYWdlWE9mZnNldCAtIDE2O1xuICAgICAgICBjb25zdCBsZWZ0ID0gcGFyZW50Qm94LnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0ICsgNjtcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbENlbnRlciA9IHBhcmVudEJveC5yaWdodCAtIHdpbmRvdy5wYWdlWE9mZnNldCAtIChwYXJlbnRCb3gud2lkdGggLyAyKTtcbiAgICAgICAgc3dpdGNoICh0aGlzLnByb3BzLmFsaWdubWVudCkge1xuICAgICAgICAgICAgY2FzZSBBbGlnbm1lbnQuTmF0dXJhbDpcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50Qm94LnJpZ2h0ID4gd2luZG93LmlubmVyV2lkdGggLyAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnJpZ2h0ID0gcmlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnRvcCA9IHRvcDtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCB0byBSaWdodFxuICAgICAgICAgICAgY2FzZSBBbGlnbm1lbnQuUmlnaHQ6XG4gICAgICAgICAgICAgICAgc3R5bGUubGVmdCA9IGxlZnQ7XG4gICAgICAgICAgICAgICAgc3R5bGUudG9wID0gdG9wO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBBbGlnbm1lbnQuTGVmdDpcbiAgICAgICAgICAgICAgICBzdHlsZS5yaWdodCA9IHJpZ2h0O1xuICAgICAgICAgICAgICAgIHN0eWxlLnRvcCA9IHRvcDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgQWxpZ25tZW50LlRvcDpcbiAgICAgICAgICAgICAgICBzdHlsZS50b3AgPSBiYXNlVG9wIC0gMTY7XG4gICAgICAgICAgICAgICAgc3R5bGUubGVmdCA9IGhvcml6b250YWxDZW50ZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIEFsaWdubWVudC5Cb3R0b206XG4gICAgICAgICAgICAgICAgc3R5bGUudG9wID0gYmFzZVRvcCArIHBhcmVudEJveC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgc3R5bGUubGVmdCA9IGhvcml6b250YWxDZW50ZXI7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJUb29sdGlwID0gKCkgPT4ge1xuICAgICAgICAvLyBBZGQgdGhlIHBhcmVudCdzIHBvc2l0aW9uIHRvIHRoZSB0b29sdGlwcywgc28gaXQncyBjb3JyZWN0bHlcbiAgICAgICAgLy8gcG9zaXRpb25lZCwgYWxzbyB0YWtpbmcgaW50byBhY2NvdW50IGFueSB3aW5kb3cgem9vbVxuICAgICAgICAvLyBOT1RFOiBUaGUgYWRkaXRpb25hbCA2IHBpeGVscyBmb3IgdGhlIGxlZnQgcG9zaXRpb24sIGlzIHRvIHRha2UgYWNjb3VudCBvZiB0aGVcbiAgICAgICAgLy8gdG9vbHRpcHMgY2hldnJvblxuICAgICAgICBjb25zdCBzdHlsZSA9IHRoaXMudXBkYXRlUG9zaXRpb24oe30pO1xuICAgICAgICAvLyBIaWRlIHRoZSBlbnRpcmUgY29udGFpbmVyIHdoZW4gbm90IHZpc2libGUuIFRoaXMgcHJldmVudHMgZmxhc2hpbmcgb2YgdGhlIHRvb2x0aXBcbiAgICAgICAgLy8gaWYgaXQgaXMgbm90IG1lYW50IHRvIGJlIHZpc2libGUgb24gZmlyc3QgbW91bnQuXG4gICAgICAgIHN0eWxlLmRpc3BsYXkgPSB0aGlzLnByb3BzLnZpc2libGUgPyBcImJsb2NrXCIgOiBcIm5vbmVcIjtcblxuICAgICAgICBjb25zdCB0b29sdGlwQ2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9Ub29sdGlwXCIsIHRoaXMucHJvcHMudG9vbHRpcENsYXNzTmFtZSwge1xuICAgICAgICAgICAgXCJteF9Ub29sdGlwX3Zpc2libGVcIjogdGhpcy5wcm9wcy52aXNpYmxlLFxuICAgICAgICAgICAgXCJteF9Ub29sdGlwX2ludmlzaWJsZVwiOiAhdGhpcy5wcm9wcy52aXNpYmxlLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0b29sdGlwID0gKFxuICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9e3Rvb2x0aXBDbGFzc2VzfSBzdHlsZT17c3R5bGV9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVG9vbHRpcF9jaGV2cm9uXCIgLz5cbiAgICAgICAgICAgICAgICB7IHRoaXMucHJvcHMubGFiZWwgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVuZGVyIHRoZSB0b29sdGlwIG1hbnVhbGx5LCBhcyB3ZSB3aXNoIGl0IG5vdCB0byBiZSByZW5kZXJlZCB3aXRoaW4gdGhlIHBhcmVudFxuICAgICAgICB0aGlzLnRvb2x0aXAgPSBSZWFjdERPTS5yZW5kZXI8RWxlbWVudD4odG9vbHRpcCwgdGhpcy50b29sdGlwQ29udGFpbmVyKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpIHtcbiAgICAgICAgLy8gUmVuZGVyIGEgcGxhY2Vob2xkZXJcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPXt0aGlzLnByb3BzLmNsYXNzTmFtZX0+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXX0=