UNPKG

matrix-react-sdk

Version:
139 lines (134 loc) 21.4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _NodeAnimator = _interopRequireDefault(require("../../../NodeAnimator")); var _units = require("../../../utils/units"); var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar")); var _ReadReceiptGroup = require("./ReadReceiptGroup"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } /* Copyright 2024 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C. Copyright 2016 OpenMarket Ltd SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ // The top & right from the bounding client rect of each read receipt class ReadReceiptMarker extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "avatar", /*#__PURE__*/(0, _react.createRef)()); this.state = { // if we are going to animate the RR, we don't show it on first render, // and instead just add a placeholder to the DOM; once we've been // mounted, we start an animation which moves the RR from its old // position. suppressDisplay: !this.props.suppressAnimation }; } componentWillUnmount() { // before we remove the rr, store its location in the map, so that if // it reappears, it can be animated from the right place. const rrInfo = this.props.readReceiptPosition; if (!rrInfo) { return; } // checking the DOM properties can force a re-layout, which can be // quite expensive; so if the parent messagepanel is being unmounted, // then don't bother with this. if (this.props.checkUnmounting && this.props.checkUnmounting()) { return; } this.buildReadReceiptInfo(rrInfo); } componentDidMount() { if (!this.state.suppressDisplay) { // we've already done our display - nothing more to do. return; } this.animateMarker(); } componentDidUpdate(prevProps) { const differentOffset = prevProps.offset !== this.props.offset; const visibilityChanged = prevProps.hidden !== this.props.hidden; if (differentOffset || visibilityChanged) { this.animateMarker(); } } buildReadReceiptInfo(target = {}) { const element = this.avatar.current; // this is the mx_ReadReceiptsGroup_container const horizontalContainer = element?.offsetParent; if (!horizontalContainer || !horizontalContainer.getBoundingClientRect) { // this seems to happen sometimes for reasons I don't understand // the docs for `offsetParent` say it may be null if `display` is // `none`, but I can't see why that would happen. _logger.logger.warn(`ReadReceiptMarker for ${this.props.fallbackUserId} has no valid horizontalContainer`); target.top = 0; target.right = 0; return target; } const elementRect = element.getBoundingClientRect(); target.top = elementRect.top; target.right = elementRect.right - horizontalContainer.getBoundingClientRect().right; return target; } animateMarker() { const oldInfo = this.props.readReceiptPosition; const newInfo = this.buildReadReceiptInfo(); const newPosition = newInfo.top ?? 0; const oldPosition = oldInfo && oldInfo.top !== undefined ? // start at the old height and in the old h pos oldInfo.top : // treat new RRs as though they were off the top of the screen -_ReadReceiptGroup.READ_AVATAR_SIZE; const startStyles = []; if (oldInfo?.right) { startStyles.push({ top: oldPosition - newPosition, right: oldInfo.right }); } startStyles.push({ top: oldPosition - newPosition, right: 0 }); this.setState({ suppressDisplay: false, startStyles }); } render() { if (this.state.suppressDisplay) { return /*#__PURE__*/_react.default.createElement("div", { ref: this.avatar }); } const style = { right: (0, _units.toPx)(this.props.offset), top: "0px" }; return /*#__PURE__*/_react.default.createElement(_NodeAnimator.default, { startStyles: this.state.startStyles, innerRef: this.avatar }, /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, { member: this.props.member ?? null, fallbackUserId: this.props.fallbackUserId, "aria-hidden": "true", "aria-live": "off", size: "14px", style: style, hideTitle: true, tabIndex: -1 })); } } exports.default = ReadReceiptMarker; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX05vZGVBbmltYXRvciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfdW5pdHMiLCJfTWVtYmVyQXZhdGFyIiwiX1JlYWRSZWNlaXB0R3JvdXAiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJSZWFkUmVjZWlwdE1hcmtlciIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwic3RhdGUiLCJzdXBwcmVzc0Rpc3BsYXkiLCJzdXBwcmVzc0FuaW1hdGlvbiIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicnJJbmZvIiwicmVhZFJlY2VpcHRQb3NpdGlvbiIsImNoZWNrVW5tb3VudGluZyIsImJ1aWxkUmVhZFJlY2VpcHRJbmZvIiwiY29tcG9uZW50RGlkTW91bnQiLCJhbmltYXRlTWFya2VyIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicHJldlByb3BzIiwiZGlmZmVyZW50T2Zmc2V0Iiwib2Zmc2V0IiwidmlzaWJpbGl0eUNoYW5nZWQiLCJoaWRkZW4iLCJ0YXJnZXQiLCJlbGVtZW50IiwiYXZhdGFyIiwiY3VycmVudCIsImhvcml6b250YWxDb250YWluZXIiLCJvZmZzZXRQYXJlbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJsb2dnZXIiLCJ3YXJuIiwiZmFsbGJhY2tVc2VySWQiLCJ0b3AiLCJyaWdodCIsImVsZW1lbnRSZWN0Iiwib2xkSW5mbyIsIm5ld0luZm8iLCJuZXdQb3NpdGlvbiIsIm9sZFBvc2l0aW9uIiwidW5kZWZpbmVkIiwiUkVBRF9BVkFUQVJfU0laRSIsInN0YXJ0U3R5bGVzIiwicHVzaCIsInNldFN0YXRlIiwicmVuZGVyIiwiY3JlYXRlRWxlbWVudCIsInJlZiIsInN0eWxlIiwidG9QeCIsImlubmVyUmVmIiwibWVtYmVyIiwic2l6ZSIsImhpZGVUaXRsZSIsInRhYkluZGV4IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1JlYWRSZWNlaXB0TWFya2VyLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTYgT3Blbk1hcmtldCBMdGRcblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUm9vbU1lbWJlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IE5vZGVBbmltYXRvciBmcm9tIFwiLi4vLi4vLi4vTm9kZUFuaW1hdG9yXCI7XG5pbXBvcnQgeyB0b1B4IH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3VuaXRzXCI7XG5pbXBvcnQgTWVtYmVyQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL01lbWJlckF2YXRhclwiO1xuaW1wb3J0IHsgUkVBRF9BVkFUQVJfU0laRSB9IGZyb20gXCIuL1JlYWRSZWNlaXB0R3JvdXBcIjtcblxuLy8gVGhlIHRvcCAmIHJpZ2h0IGZyb20gdGhlIGJvdW5kaW5nIGNsaWVudCByZWN0IG9mIGVhY2ggcmVhZCByZWNlaXB0XG5leHBvcnQgaW50ZXJmYWNlIElSZWFkUmVjZWlwdFBvc2l0aW9uIHtcbiAgICB0b3A/OiBudW1iZXI7XG4gICAgcmlnaHQ/OiBudW1iZXI7XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIC8vIHRoZSBSb29tTWVtYmVyIHRvIHNob3cgdGhlIFJSIGZvclxuICAgIG1lbWJlcj86IFJvb21NZW1iZXIgfCBudWxsO1xuICAgIC8vIHVzZXJJZCB0byBmYWxsYmFjayB0aGUgYXZhdGFyIHRvXG4gICAgLy8gaWYgdGhlIG1lbWJlciBoYXNuJ3QgYmVlbiBsb2FkZWQgeWV0XG4gICAgZmFsbGJhY2tVc2VySWQ6IHN0cmluZztcblxuICAgIC8vIG51bWJlciBvZiBwaXhlbHMgdG8gb2Zmc2V0IHRoZSBhdmF0YXIgZnJvbSB0aGUgcmlnaHQgb2YgaXRzIHBhcmVudDtcbiAgICAvLyB0eXBpY2FsbHkgYSBuZWdhdGl2ZSB2YWx1ZS5cbiAgICBvZmZzZXQ6IG51bWJlcjtcblxuICAgIC8vIHRydWUgdG8gaGlkZSB0aGUgYXZhdGFyIChpdCB3aWxsIHN0aWxsIGJlIGFuaW1hdGVkKVxuICAgIGhpZGRlbj86IGJvb2xlYW47XG5cbiAgICAvLyBkb24ndCBhbmltYXRlIHRoaXMgUlIgaW50byBwb3NpdGlvblxuICAgIHN1cHByZXNzQW5pbWF0aW9uPzogYm9vbGVhbjtcblxuICAgIC8vIGFuIG9wYXF1ZSBvYmplY3QgZm9yIHN0b3JpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyB1c2VyJ3MgUlIgaW4gdGhpcyByb29tXG4gICAgcmVhZFJlY2VpcHRQb3NpdGlvbj86IElSZWFkUmVjZWlwdFBvc2l0aW9uO1xuXG4gICAgLy8gQSBmdW5jdGlvbiB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIGlmIHRoZSBwYXJlbnQgcGFuZWwgaXMgYmVpbmdcbiAgICAvLyB1bm1vdW50ZWQsIHRvIGF2b2lkIHVubmVjZXNzYXJ5IHdvcmsuIFNob3VsZCByZXR1cm4gdHJ1ZSBpZiB3ZVxuICAgIC8vIGFyZSBiZWluZyB1bm1vdW50ZWQuXG4gICAgY2hlY2tVbm1vdW50aW5nPzogKCkgPT4gYm9vbGVhbjtcblxuICAgIC8vIFRpbWVzdGFtcCB3aGVuIHRoZSByZWNlaXB0IHdhcyByZWFkXG4gICAgdGltZXN0YW1wPzogbnVtYmVyO1xuXG4gICAgLy8gVHJ1ZSB0byBzaG93IHR3ZWx2ZSBob3VyIGZvcm1hdCwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgc2hvd1R3ZWx2ZUhvdXI/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBzdXBwcmVzc0Rpc3BsYXk6IGJvb2xlYW47XG4gICAgc3RhcnRTdHlsZXM/OiBJUmVhZFJlY2VpcHRNYXJrZXJTdHlsZVtdO1xufVxuXG5pbnRlcmZhY2UgSVJlYWRSZWNlaXB0TWFya2VyU3R5bGUge1xuICAgIHRvcDogbnVtYmVyO1xuICAgIHJpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlYWRSZWNlaXB0TWFya2VyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgYXZhdGFyID0gY3JlYXRlUmVmPEhUTUxEaXZFbGVtZW50PigpO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICAvLyBpZiB3ZSBhcmUgZ29pbmcgdG8gYW5pbWF0ZSB0aGUgUlIsIHdlIGRvbid0IHNob3cgaXQgb24gZmlyc3QgcmVuZGVyLFxuICAgICAgICAgICAgLy8gYW5kIGluc3RlYWQganVzdCBhZGQgYSBwbGFjZWhvbGRlciB0byB0aGUgRE9NOyBvbmNlIHdlJ3ZlIGJlZW5cbiAgICAgICAgICAgIC8vIG1vdW50ZWQsIHdlIHN0YXJ0IGFuIGFuaW1hdGlvbiB3aGljaCBtb3ZlcyB0aGUgUlIgZnJvbSBpdHMgb2xkXG4gICAgICAgICAgICAvLyBwb3NpdGlvbi5cbiAgICAgICAgICAgIHN1cHByZXNzRGlzcGxheTogIXRoaXMucHJvcHMuc3VwcHJlc3NBbmltYXRpb24sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICAvLyBiZWZvcmUgd2UgcmVtb3ZlIHRoZSByciwgc3RvcmUgaXRzIGxvY2F0aW9uIGluIHRoZSBtYXAsIHNvIHRoYXQgaWZcbiAgICAgICAgLy8gaXQgcmVhcHBlYXJzLCBpdCBjYW4gYmUgYW5pbWF0ZWQgZnJvbSB0aGUgcmlnaHQgcGxhY2UuXG4gICAgICAgIGNvbnN0IHJySW5mbyA9IHRoaXMucHJvcHMucmVhZFJlY2VpcHRQb3NpdGlvbjtcbiAgICAgICAgaWYgKCFyckluZm8pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGNoZWNraW5nIHRoZSBET00gcHJvcGVydGllcyBjYW4gZm9yY2UgYSByZS1sYXlvdXQsIHdoaWNoIGNhbiBiZVxuICAgICAgICAvLyBxdWl0ZSBleHBlbnNpdmU7IHNvIGlmIHRoZSBwYXJlbnQgbWVzc2FnZXBhbmVsIGlzIGJlaW5nIHVubW91bnRlZCxcbiAgICAgICAgLy8gdGhlbiBkb24ndCBib3RoZXIgd2l0aCB0aGlzLlxuICAgICAgICBpZiAodGhpcy5wcm9wcy5jaGVja1VubW91bnRpbmcgJiYgdGhpcy5wcm9wcy5jaGVja1VubW91bnRpbmcoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsZFJlYWRSZWNlaXB0SW5mbyhyckluZm8pO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnN1cHByZXNzRGlzcGxheSkge1xuICAgICAgICAgICAgLy8gd2UndmUgYWxyZWFkeSBkb25lIG91ciBkaXNwbGF5IC0gbm90aGluZyBtb3JlIHRvIGRvLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYW5pbWF0ZU1hcmtlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUocHJldlByb3BzOiBJUHJvcHMpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGlmZmVyZW50T2Zmc2V0ID0gcHJldlByb3BzLm9mZnNldCAhPT0gdGhpcy5wcm9wcy5vZmZzZXQ7XG4gICAgICAgIGNvbnN0IHZpc2liaWxpdHlDaGFuZ2VkID0gcHJldlByb3BzLmhpZGRlbiAhPT0gdGhpcy5wcm9wcy5oaWRkZW47XG4gICAgICAgIGlmIChkaWZmZXJlbnRPZmZzZXQgfHwgdmlzaWJpbGl0eUNoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZU1hcmtlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBidWlsZFJlYWRSZWNlaXB0SW5mbyh0YXJnZXQ6IElSZWFkUmVjZWlwdFBvc2l0aW9uID0ge30pOiBJUmVhZFJlY2VpcHRQb3NpdGlvbiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmF2YXRhci5jdXJyZW50O1xuICAgICAgICAvLyB0aGlzIGlzIHRoZSBteF9SZWFkUmVjZWlwdHNHcm91cF9jb250YWluZXJcbiAgICAgICAgY29uc3QgaG9yaXpvbnRhbENvbnRhaW5lciA9IGVsZW1lbnQ/Lm9mZnNldFBhcmVudDtcbiAgICAgICAgaWYgKCFob3Jpem9udGFsQ29udGFpbmVyIHx8ICFob3Jpem9udGFsQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCkge1xuICAgICAgICAgICAgLy8gdGhpcyBzZWVtcyB0byBoYXBwZW4gc29tZXRpbWVzIGZvciByZWFzb25zIEkgZG9uJ3QgdW5kZXJzdGFuZFxuICAgICAgICAgICAgLy8gdGhlIGRvY3MgZm9yIGBvZmZzZXRQYXJlbnRgIHNheSBpdCBtYXkgYmUgbnVsbCBpZiBgZGlzcGxheWAgaXNcbiAgICAgICAgICAgIC8vIGBub25lYCwgYnV0IEkgY2FuJ3Qgc2VlIHdoeSB0aGF0IHdvdWxkIGhhcHBlbi5cbiAgICAgICAgICAgIGxvZ2dlci53YXJuKGBSZWFkUmVjZWlwdE1hcmtlciBmb3IgJHt0aGlzLnByb3BzLmZhbGxiYWNrVXNlcklkfSBoYXMgbm8gdmFsaWQgaG9yaXpvbnRhbENvbnRhaW5lcmApO1xuXG4gICAgICAgICAgICB0YXJnZXQudG9wID0gMDtcbiAgICAgICAgICAgIHRhcmdldC5yaWdodCA9IDA7XG4gICAgICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZWxlbWVudFJlY3QgPSBlbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG4gICAgICAgIHRhcmdldC50b3AgPSBlbGVtZW50UmVjdC50b3A7XG4gICAgICAgIHRhcmdldC5yaWdodCA9IGVsZW1lbnRSZWN0LnJpZ2h0IC0gaG9yaXpvbnRhbENvbnRhaW5lci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFuaW1hdGVNYXJrZXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG9sZEluZm8gPSB0aGlzLnByb3BzLnJlYWRSZWNlaXB0UG9zaXRpb247XG4gICAgICAgIGNvbnN0IG5ld0luZm8gPSB0aGlzLmJ1aWxkUmVhZFJlY2VpcHRJbmZvKCk7XG5cbiAgICAgICAgY29uc3QgbmV3UG9zaXRpb24gPSBuZXdJbmZvLnRvcCA/PyAwO1xuICAgICAgICBjb25zdCBvbGRQb3NpdGlvbiA9XG4gICAgICAgICAgICBvbGRJbmZvICYmIG9sZEluZm8udG9wICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IC8vIHN0YXJ0IGF0IHRoZSBvbGQgaGVpZ2h0IGFuZCBpbiB0aGUgb2xkIGggcG9zXG4gICAgICAgICAgICAgICAgICBvbGRJbmZvLnRvcFxuICAgICAgICAgICAgICAgIDogLy8gdHJlYXQgbmV3IFJScyBhcyB0aG91Z2ggdGhleSB3ZXJlIG9mZiB0aGUgdG9wIG9mIHRoZSBzY3JlZW5cbiAgICAgICAgICAgICAgICAgIC1SRUFEX0FWQVRBUl9TSVpFO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0U3R5bGVzOiBJUmVhZFJlY2VpcHRNYXJrZXJTdHlsZVtdID0gW107XG4gICAgICAgIGlmIChvbGRJbmZvPy5yaWdodCkge1xuICAgICAgICAgICAgc3RhcnRTdHlsZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgdG9wOiBvbGRQb3NpdGlvbiAtIG5ld1Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBvbGRJbmZvLnJpZ2h0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhcnRTdHlsZXMucHVzaCh7XG4gICAgICAgICAgICB0b3A6IG9sZFBvc2l0aW9uIC0gbmV3UG9zaXRpb24sXG4gICAgICAgICAgICByaWdodDogMCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzdXBwcmVzc0Rpc3BsYXk6IGZhbHNlLFxuICAgICAgICAgICAgc3RhcnRTdHlsZXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuc3VwcHJlc3NEaXNwbGF5KSB7XG4gICAgICAgICAgICByZXR1cm4gPGRpdiByZWY9e3RoaXMuYXZhdGFyfSAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHN0eWxlID0ge1xuICAgICAgICAgICAgcmlnaHQ6IHRvUHgodGhpcy5wcm9wcy5vZmZzZXQpLFxuICAgICAgICAgICAgdG9wOiBcIjBweFwiLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Tm9kZUFuaW1hdG9yIHN0YXJ0U3R5bGVzPXt0aGlzLnN0YXRlLnN0YXJ0U3R5bGVzfSBpbm5lclJlZj17dGhpcy5hdmF0YXJ9PlxuICAgICAgICAgICAgICAgIDxNZW1iZXJBdmF0YXJcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyPXt0aGlzLnByb3BzLm1lbWJlciA/PyBudWxsfVxuICAgICAgICAgICAgICAgICAgICBmYWxsYmFja1VzZXJJZD17dGhpcy5wcm9wcy5mYWxsYmFja1VzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwib2ZmXCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjE0cHhcIlxuICAgICAgICAgICAgICAgICAgICBzdHlsZT17c3R5bGV9XG4gICAgICAgICAgICAgICAgICAgIGhpZGVUaXRsZVxuICAgICAgICAgICAgICAgICAgICB0YWJJbmRleD17LTF9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIDwvTm9kZUFuaW1hdG9yPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxhQUFBLEdBQUFDLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxhQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxpQkFBQSxHQUFBTixPQUFBO0FBQXNELFNBQUFPLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFU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