UNPKG

matrix-react-sdk

Version:
192 lines (188 loc) 31.2 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 = _interopRequireDefault(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var WhoIsTyping = _interopRequireWildcard(require("../../../WhoIsTyping")); var _Timer = _interopRequireDefault(require("../../../utils/Timer")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar")); 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 2017-2024 New Vector Ltd. Copyright 2015, 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. */ class WhoIsTypingTile extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { usersTyping: WhoIsTyping.usersTypingApartFromMe(this.props.room), delayedStopTypingTimers: {} }); (0, _defineProperty2.default)(this, "isVisible", () => { return WhoIsTypingTile.isVisible(this.state); }); (0, _defineProperty2.default)(this, "onRoomTimeline", (event, room) => { if (room?.roomId === this.props.room.roomId) { const userId = event.getSender(); // remove user from usersTyping const usersTyping = this.state.usersTyping.filter(m => m.userId !== userId); if (usersTyping.length !== this.state.usersTyping.length) { this.setState({ usersTyping }); } // abort timer if any this.abortUserTimer(userId); } }); (0, _defineProperty2.default)(this, "onRoomMemberTyping", () => { const usersTyping = WhoIsTyping.usersTypingApartFromMeAndIgnored(this.props.room); this.setState({ delayedStopTypingTimers: this.updateDelayedStopTypingTimers(usersTyping), usersTyping }); }); } componentDidMount() { _MatrixClientPeg.MatrixClientPeg.safeGet().on(_matrix.RoomMemberEvent.Typing, this.onRoomMemberTyping); _MatrixClientPeg.MatrixClientPeg.safeGet().on(_matrix.RoomEvent.Timeline, this.onRoomTimeline); } componentDidUpdate(prevProps, prevState) { const wasVisible = WhoIsTypingTile.isVisible(prevState); const isVisible = WhoIsTypingTile.isVisible(this.state); if (this.props.onShown && !wasVisible && isVisible) { this.props.onShown(); } else if (this.props.onHidden && wasVisible && !isVisible) { this.props.onHidden(); } } componentWillUnmount() { // we may have entirely lost our client as we're logging out before clicking login on the guest bar... const client = _MatrixClientPeg.MatrixClientPeg.get(); if (client) { client.removeListener(_matrix.RoomMemberEvent.Typing, this.onRoomMemberTyping); client.removeListener(_matrix.RoomEvent.Timeline, this.onRoomTimeline); } Object.values(this.state.delayedStopTypingTimers).forEach(t => t.abort()); } static isVisible(state) { return state.usersTyping.length !== 0 || Object.keys(state.delayedStopTypingTimers).length !== 0; } updateDelayedStopTypingTimers(usersTyping) { const usersThatStoppedTyping = this.state.usersTyping.filter(a => { return !usersTyping.some(b => a.userId === b.userId); }); const usersThatStartedTyping = usersTyping.filter(a => { return !this.state.usersTyping.some(b => a.userId === b.userId); }); // abort all the timers for the users that started typing again usersThatStartedTyping.forEach(m => { const timer = this.state.delayedStopTypingTimers[m.userId]; if (timer) { timer.abort(); } }); // prepare new delayedStopTypingTimers object to update state with let delayedStopTypingTimers = Object.assign({}, this.state.delayedStopTypingTimers); // remove members that started typing again delayedStopTypingTimers = usersThatStartedTyping.reduce((delayedStopTypingTimers, m) => { delete delayedStopTypingTimers[m.userId]; return delayedStopTypingTimers; }, delayedStopTypingTimers); // start timer for members that stopped typing delayedStopTypingTimers = usersThatStoppedTyping.reduce((delayedStopTypingTimers, m) => { if (!delayedStopTypingTimers[m.userId]) { const timer = new _Timer.default(5000); delayedStopTypingTimers[m.userId] = timer; timer.start(); timer.finished().then(() => this.removeUserTimer(m.userId), // on elapsed () => { /* aborted */ }); } return delayedStopTypingTimers; }, delayedStopTypingTimers); return delayedStopTypingTimers; } abortUserTimer(userId) { const timer = this.state.delayedStopTypingTimers[userId]; if (timer) { timer.abort(); this.removeUserTimer(userId); } } removeUserTimer(userId) { const timer = this.state.delayedStopTypingTimers[userId]; if (timer) { const delayedStopTypingTimers = Object.assign({}, this.state.delayedStopTypingTimers); delete delayedStopTypingTimers[userId]; this.setState({ delayedStopTypingTimers }); } } renderTypingIndicatorAvatars(users, limit) { let othersCount = 0; if (users.length > limit) { othersCount = users.length - limit + 1; users = users.slice(0, limit - 1); } const avatars = users.map(u => { return /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, { key: u.userId, member: u, size: "24px", resizeMethod: "crop", viewUserOnClick: true, "aria-live": "off" }); }); if (othersCount > 0) { avatars.push( /*#__PURE__*/_react.default.createElement("span", { className: "mx_WhoIsTypingTile_remainingAvatarPlaceholder", key: "others" }, "+", othersCount)); } return avatars; } render() { const usersTyping = [...this.state.usersTyping]; // append the users that have been reported not typing anymore // but have a timeout timer running so they can disappear // when a message comes in for (const userId in this.state.delayedStopTypingTimers) { const member = this.props.room.getMember(userId); if (member) usersTyping.push(member); } // sort them so the typing members don't change order when // moved to delayedStopTypingTimers const collator = new Intl.Collator(); usersTyping.sort((a, b) => collator.compare(a.name, b.name)); const typingString = WhoIsTyping.whoIsTypingString(usersTyping, this.props.whoIsTypingLimit); if (!typingString) { return null; } return /*#__PURE__*/_react.default.createElement("li", { className: "mx_WhoIsTypingTile", "aria-atomic": "true" }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_WhoIsTypingTile_avatars" }, this.renderTypingIndicatorAvatars(usersTyping, this.props.whoIsTypingLimit)), /*#__PURE__*/_react.default.createElement("div", { className: "mx_WhoIsTypingTile_label" }, typingString)); } } exports.default = WhoIsTypingTile; (0, _defineProperty2.default)(WhoIsTypingTile, "defaultProps", { whoIsTypingLimit: 3 }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJXaG9Jc1R5cGluZyIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX1RpbWVyIiwiX01hdHJpeENsaWVudFBlZyIsIl9NZW1iZXJBdmF0YXIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJXaG9Jc1R5cGluZ1RpbGUiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwiYXJncyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJ1c2Vyc1R5cGluZyIsInVzZXJzVHlwaW5nQXBhcnRGcm9tTWUiLCJwcm9wcyIsInJvb20iLCJkZWxheWVkU3RvcFR5cGluZ1RpbWVycyIsImlzVmlzaWJsZSIsInN0YXRlIiwiZXZlbnQiLCJyb29tSWQiLCJ1c2VySWQiLCJnZXRTZW5kZXIiLCJmaWx0ZXIiLCJtIiwibGVuZ3RoIiwic2V0U3RhdGUiLCJhYm9ydFVzZXJUaW1lciIsInVzZXJzVHlwaW5nQXBhcnRGcm9tTWVBbmRJZ25vcmVkIiwidXBkYXRlRGVsYXllZFN0b3BUeXBpbmdUaW1lcnMiLCJjb21wb25lbnREaWRNb3VudCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJvbiIsIlJvb21NZW1iZXJFdmVudCIsIlR5cGluZyIsIm9uUm9vbU1lbWJlclR5cGluZyIsIlJvb21FdmVudCIsIlRpbWVsaW5lIiwib25Sb29tVGltZWxpbmUiLCJjb21wb25lbnREaWRVcGRhdGUiLCJwcmV2UHJvcHMiLCJwcmV2U3RhdGUiLCJ3YXNWaXNpYmxlIiwib25TaG93biIsIm9uSGlkZGVuIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjbGllbnQiLCJyZW1vdmVMaXN0ZW5lciIsInZhbHVlcyIsImZvckVhY2giLCJhYm9ydCIsImtleXMiLCJ1c2Vyc1RoYXRTdG9wcGVkVHlwaW5nIiwic29tZSIsImIiLCJ1c2Vyc1RoYXRTdGFydGVkVHlwaW5nIiwidGltZXIiLCJhc3NpZ24iLCJyZWR1Y2UiLCJUaW1lciIsInN0YXJ0IiwiZmluaXNoZWQiLCJ0aGVuIiwicmVtb3ZlVXNlclRpbWVyIiwicmVuZGVyVHlwaW5nSW5kaWNhdG9yQXZhdGFycyIsInVzZXJzIiwibGltaXQiLCJvdGhlcnNDb3VudCIsInNsaWNlIiwiYXZhdGFycyIsIm1hcCIsImNyZWF0ZUVsZW1lbnQiLCJrZXkiLCJtZW1iZXIiLCJzaXplIiwicmVzaXplTWV0aG9kIiwidmlld1VzZXJPbkNsaWNrIiwicHVzaCIsImNsYXNzTmFtZSIsInJlbmRlciIsImdldE1lbWJlciIsImNvbGxhdG9yIiwiSW50bCIsIkNvbGxhdG9yIiwic29ydCIsImNvbXBhcmUiLCJuYW1lIiwidHlwaW5nU3RyaW5nIiwid2hvSXNUeXBpbmdTdHJpbmciLCJ3aG9Jc1R5cGluZ0xpbWl0IiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1dob0lzVHlwaW5nVGlsZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE3LTIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb29tLCBSb29tRXZlbnQsIFJvb21NZW1iZXIsIFJvb21NZW1iZXJFdmVudCwgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCAqIGFzIFdob0lzVHlwaW5nIGZyb20gXCIuLi8uLi8uLi9XaG9Jc1R5cGluZ1wiO1xuaW1wb3J0IFRpbWVyIGZyb20gXCIuLi8uLi8uLi91dGlscy9UaW1lclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IE1lbWJlckF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9NZW1iZXJBdmF0YXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgLy8gdGhlIHJvb20gdGhpcyBzdGF0dXNiYXIgaXMgcmVwcmVzZW50aW5nLlxuICAgIHJvb206IFJvb207XG4gICAgb25TaG93bj86ICgpID0+IHZvaWQ7XG4gICAgb25IaWRkZW4/OiAoKSA9PiB2b2lkO1xuICAgIC8vIE51bWJlciBvZiBuYW1lcyB0byBkaXNwbGF5IGluIHR5cGluZyBpbmRpY2F0aW9uLiBFLmcuIHNldCB0byAzLCB3aWxsXG4gICAgLy8gcmVzdWx0IGluIFwiWCwgWSwgWiBhbmQgMTAwIG90aGVycyBhcmUgdHlwaW5nLlwiXG4gICAgd2hvSXNUeXBpbmdMaW1pdDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICB1c2Vyc1R5cGluZzogUm9vbU1lbWJlcltdO1xuICAgIC8vIGEgbWFwIHdpdGggdXNlcmlkID0+IFRpbWVyIHRvIGRlbGF5XG4gICAgLy8gaGlkaW5nIHRoZSBcInggaXMgdHlwaW5nXCIgbWVzc2FnZSBmb3IgYVxuICAgIC8vIHVzZXIgc28gaGlkaW5nIGl0IGNhbiBjb2luY2lkZVxuICAgIC8vIHdpdGggdGhlIHNlbnQgbWVzc2FnZSBieSB0aGUgb3RoZXIgc2lkZVxuICAgIC8vIHJlc3VsdGluZyBpbiBsZXNzIHRpbWVsaW5lIGp1bXBpbmVzc1xuICAgIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzOiBSZWNvcmQ8c3RyaW5nLCBUaW1lcj47XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFdob0lzVHlwaW5nVGlsZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICB3aG9Jc1R5cGluZ0xpbWl0OiAzLFxuICAgIH07XG5cbiAgICBwdWJsaWMgc3RhdGU6IElTdGF0ZSA9IHtcbiAgICAgICAgdXNlcnNUeXBpbmc6IFdob0lzVHlwaW5nLnVzZXJzVHlwaW5nQXBhcnRGcm9tTWUodGhpcy5wcm9wcy5yb29tKSxcbiAgICAgICAgZGVsYXllZFN0b3BUeXBpbmdUaW1lcnM6IHt9LFxuICAgIH07XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkub24oUm9vbU1lbWJlckV2ZW50LlR5cGluZywgdGhpcy5vblJvb21NZW1iZXJUeXBpbmcpO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLm9uKFJvb21FdmVudC5UaW1lbGluZSwgdGhpcy5vblJvb21UaW1lbGluZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZShwcmV2UHJvcHM6IElQcm9wcywgcHJldlN0YXRlOiBJU3RhdGUpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd2FzVmlzaWJsZSA9IFdob0lzVHlwaW5nVGlsZS5pc1Zpc2libGUocHJldlN0YXRlKTtcbiAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gV2hvSXNUeXBpbmdUaWxlLmlzVmlzaWJsZSh0aGlzLnN0YXRlKTtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMub25TaG93biAmJiAhd2FzVmlzaWJsZSAmJiBpc1Zpc2libGUpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25TaG93bigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJvcHMub25IaWRkZW4gJiYgd2FzVmlzaWJsZSAmJiAhaXNWaXNpYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uSGlkZGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIC8vIHdlIG1heSBoYXZlIGVudGlyZWx5IGxvc3Qgb3VyIGNsaWVudCBhcyB3ZSdyZSBsb2dnaW5nIG91dCBiZWZvcmUgY2xpY2tpbmcgbG9naW4gb24gdGhlIGd1ZXN0IGJhci4uLlxuICAgICAgICBjb25zdCBjbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIGlmIChjbGllbnQpIHtcbiAgICAgICAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihSb29tTWVtYmVyRXZlbnQuVHlwaW5nLCB0aGlzLm9uUm9vbU1lbWJlclR5cGluZyk7XG4gICAgICAgICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoUm9vbUV2ZW50LlRpbWVsaW5lLCB0aGlzLm9uUm9vbVRpbWVsaW5lKTtcbiAgICAgICAgfVxuICAgICAgICBPYmplY3QudmFsdWVzKHRoaXMuc3RhdGUuZGVsYXllZFN0b3BUeXBpbmdUaW1lcnMpLmZvckVhY2goKHQpID0+ICh0IGFzIFRpbWVyKS5hYm9ydCgpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpc1Zpc2libGUoc3RhdGU6IElTdGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RhdGUudXNlcnNUeXBpbmcubGVuZ3RoICE9PSAwIHx8IE9iamVjdC5rZXlzKHN0YXRlLmRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzKS5sZW5ndGggIT09IDA7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmlzaWJsZSA9ICgpOiBib29sZWFuID0+IHtcbiAgICAgICAgcmV0dXJuIFdob0lzVHlwaW5nVGlsZS5pc1Zpc2libGUodGhpcy5zdGF0ZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Sb29tVGltZWxpbmUgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50LCByb29tPzogUm9vbSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocm9vbT8ucm9vbUlkID09PSB0aGlzLnByb3BzLnJvb20ucm9vbUlkKSB7XG4gICAgICAgICAgICBjb25zdCB1c2VySWQgPSBldmVudC5nZXRTZW5kZXIoKSE7XG4gICAgICAgICAgICAvLyByZW1vdmUgdXNlciBmcm9tIHVzZXJzVHlwaW5nXG4gICAgICAgICAgICBjb25zdCB1c2Vyc1R5cGluZyA9IHRoaXMuc3RhdGUudXNlcnNUeXBpbmcuZmlsdGVyKChtKSA9PiBtLnVzZXJJZCAhPT0gdXNlcklkKTtcbiAgICAgICAgICAgIGlmICh1c2Vyc1R5cGluZy5sZW5ndGggIT09IHRoaXMuc3RhdGUudXNlcnNUeXBpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHVzZXJzVHlwaW5nIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYWJvcnQgdGltZXIgaWYgYW55XG4gICAgICAgICAgICB0aGlzLmFib3J0VXNlclRpbWVyKHVzZXJJZCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJvb21NZW1iZXJUeXBpbmcgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHVzZXJzVHlwaW5nID0gV2hvSXNUeXBpbmcudXNlcnNUeXBpbmdBcGFydEZyb21NZUFuZElnbm9yZWQodGhpcy5wcm9wcy5yb29tKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBkZWxheWVkU3RvcFR5cGluZ1RpbWVyczogdGhpcy51cGRhdGVEZWxheWVkU3RvcFR5cGluZ1RpbWVycyh1c2Vyc1R5cGluZyksXG4gICAgICAgICAgICB1c2Vyc1R5cGluZyxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgdXBkYXRlRGVsYXllZFN0b3BUeXBpbmdUaW1lcnModXNlcnNUeXBpbmc6IFJvb21NZW1iZXJbXSk6IFJlY29yZDxzdHJpbmcsIFRpbWVyPiB7XG4gICAgICAgIGNvbnN0IHVzZXJzVGhhdFN0b3BwZWRUeXBpbmcgPSB0aGlzLnN0YXRlLnVzZXJzVHlwaW5nLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICF1c2Vyc1R5cGluZy5zb21lKChiKSA9PiBhLnVzZXJJZCA9PT0gYi51c2VySWQpO1xuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdXNlcnNUaGF0U3RhcnRlZFR5cGluZyA9IHVzZXJzVHlwaW5nLmZpbHRlcigoYSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICF0aGlzLnN0YXRlLnVzZXJzVHlwaW5nLnNvbWUoKGIpID0+IGEudXNlcklkID09PSBiLnVzZXJJZCk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhYm9ydCBhbGwgdGhlIHRpbWVycyBmb3IgdGhlIHVzZXJzIHRoYXQgc3RhcnRlZCB0eXBpbmcgYWdhaW5cbiAgICAgICAgdXNlcnNUaGF0U3RhcnRlZFR5cGluZy5mb3JFYWNoKChtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMuc3RhdGUuZGVsYXllZFN0b3BUeXBpbmdUaW1lcnNbbS51c2VySWRdO1xuICAgICAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICAgICAgdGltZXIuYWJvcnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHByZXBhcmUgbmV3IGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzIG9iamVjdCB0byB1cGRhdGUgc3RhdGUgd2l0aFxuICAgICAgICBsZXQgZGVsYXllZFN0b3BUeXBpbmdUaW1lcnMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLmRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzKTtcbiAgICAgICAgLy8gcmVtb3ZlIG1lbWJlcnMgdGhhdCBzdGFydGVkIHR5cGluZyBhZ2FpblxuICAgICAgICBkZWxheWVkU3RvcFR5cGluZ1RpbWVycyA9IHVzZXJzVGhhdFN0YXJ0ZWRUeXBpbmcucmVkdWNlKChkZWxheWVkU3RvcFR5cGluZ1RpbWVycywgbSkgPT4ge1xuICAgICAgICAgICAgZGVsZXRlIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzW20udXNlcklkXTtcbiAgICAgICAgICAgIHJldHVybiBkZWxheWVkU3RvcFR5cGluZ1RpbWVycztcbiAgICAgICAgfSwgZGVsYXllZFN0b3BUeXBpbmdUaW1lcnMpO1xuICAgICAgICAvLyBzdGFydCB0aW1lciBmb3IgbWVtYmVycyB0aGF0IHN0b3BwZWQgdHlwaW5nXG4gICAgICAgIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzID0gdXNlcnNUaGF0U3RvcHBlZFR5cGluZy5yZWR1Y2UoKGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzLCBtKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzW20udXNlcklkXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVyID0gbmV3IFRpbWVyKDUwMDApO1xuICAgICAgICAgICAgICAgIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzW20udXNlcklkXSA9IHRpbWVyO1xuICAgICAgICAgICAgICAgIHRpbWVyLnN0YXJ0KCk7XG4gICAgICAgICAgICAgICAgdGltZXIuZmluaXNoZWQoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZVVzZXJUaW1lcihtLnVzZXJJZCksIC8vIG9uIGVsYXBzZWRcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLyogYWJvcnRlZCAqL1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVsYXllZFN0b3BUeXBpbmdUaW1lcnM7XG4gICAgICAgIH0sIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzKTtcblxuICAgICAgICByZXR1cm4gZGVsYXllZFN0b3BUeXBpbmdUaW1lcnM7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhYm9ydFVzZXJUaW1lcih1c2VySWQ6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBjb25zdCB0aW1lciA9IHRoaXMuc3RhdGUuZGVsYXllZFN0b3BUeXBpbmdUaW1lcnNbdXNlcklkXTtcbiAgICAgICAgaWYgKHRpbWVyKSB7XG4gICAgICAgICAgICB0aW1lci5hYm9ydCgpO1xuICAgICAgICAgICAgdGhpcy5yZW1vdmVVc2VyVGltZXIodXNlcklkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlVXNlclRpbWVyKHVzZXJJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRpbWVyID0gdGhpcy5zdGF0ZS5kZWxheWVkU3RvcFR5cGluZ1RpbWVyc1t1c2VySWRdO1xuICAgICAgICBpZiAodGltZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kZWxheWVkU3RvcFR5cGluZ1RpbWVycyk7XG4gICAgICAgICAgICBkZWxldGUgZGVsYXllZFN0b3BUeXBpbmdUaW1lcnNbdXNlcklkXTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkZWxheWVkU3RvcFR5cGluZ1RpbWVycyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyVHlwaW5nSW5kaWNhdG9yQXZhdGFycyh1c2VyczogUm9vbU1lbWJlcltdLCBsaW1pdDogbnVtYmVyKTogSlNYLkVsZW1lbnRbXSB7XG4gICAgICAgIGxldCBvdGhlcnNDb3VudCA9IDA7XG4gICAgICAgIGlmICh1c2Vycy5sZW5ndGggPiBsaW1pdCkge1xuICAgICAgICAgICAgb3RoZXJzQ291bnQgPSB1c2Vycy5sZW5ndGggLSBsaW1pdCArIDE7XG4gICAgICAgICAgICB1c2VycyA9IHVzZXJzLnNsaWNlKDAsIGxpbWl0IC0gMSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhdmF0YXJzID0gdXNlcnMubWFwKCh1KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxNZW1iZXJBdmF0YXJcbiAgICAgICAgICAgICAgICAgICAga2V5PXt1LnVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyPXt1fVxuICAgICAgICAgICAgICAgICAgICBzaXplPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZU1ldGhvZD1cImNyb3BcIlxuICAgICAgICAgICAgICAgICAgICB2aWV3VXNlck9uQ2xpY2s9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgIGFyaWEtbGl2ZT1cIm9mZlwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChvdGhlcnNDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGF2YXRhcnMucHVzaChcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9XaG9Jc1R5cGluZ1RpbGVfcmVtYWluaW5nQXZhdGFyUGxhY2Vob2xkZXJcIiBrZXk9XCJvdGhlcnNcIj5cbiAgICAgICAgICAgICAgICAgICAgK3tvdGhlcnNDb3VudH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+LFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhdmF0YXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgY29uc3QgdXNlcnNUeXBpbmcgPSBbLi4udGhpcy5zdGF0ZS51c2Vyc1R5cGluZ107XG4gICAgICAgIC8vIGFwcGVuZCB0aGUgdXNlcnMgdGhhdCBoYXZlIGJlZW4gcmVwb3J0ZWQgbm90IHR5cGluZyBhbnltb3JlXG4gICAgICAgIC8vIGJ1dCBoYXZlIGEgdGltZW91dCB0aW1lciBydW5uaW5nIHNvIHRoZXkgY2FuIGRpc2FwcGVhclxuICAgICAgICAvLyB3aGVuIGEgbWVzc2FnZSBjb21lcyBpblxuICAgICAgICBmb3IgKGNvbnN0IHVzZXJJZCBpbiB0aGlzLnN0YXRlLmRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzKSB7XG4gICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnByb3BzLnJvb20uZ2V0TWVtYmVyKHVzZXJJZCk7XG4gICAgICAgICAgICBpZiAobWVtYmVyKSB1c2Vyc1R5cGluZy5wdXNoKG1lbWJlcik7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzb3J0IHRoZW0gc28gdGhlIHR5cGluZyBtZW1iZXJzIGRvbid0IGNoYW5nZSBvcmRlciB3aGVuXG4gICAgICAgIC8vIG1vdmVkIHRvIGRlbGF5ZWRTdG9wVHlwaW5nVGltZXJzXG4gICAgICAgIGNvbnN0IGNvbGxhdG9yID0gbmV3IEludGwuQ29sbGF0b3IoKTtcbiAgICAgICAgdXNlcnNUeXBpbmcuc29ydCgoYSwgYikgPT4gY29sbGF0b3IuY29tcGFyZShhLm5hbWUsIGIubmFtZSkpO1xuXG4gICAgICAgIGNvbnN0IHR5cGluZ1N0cmluZyA9IFdob0lzVHlwaW5nLndob0lzVHlwaW5nU3RyaW5nKHVzZXJzVHlwaW5nLCB0aGlzLnByb3BzLndob0lzVHlwaW5nTGltaXQpO1xuICAgICAgICBpZiAoIXR5cGluZ1N0cmluZykge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGxpIGNsYXNzTmFtZT1cIm14X1dob0lzVHlwaW5nVGlsZVwiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfV2hvSXNUeXBpbmdUaWxlX2F2YXRhcnNcIj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyVHlwaW5nSW5kaWNhdG9yQXZhdGFycyh1c2Vyc1R5cGluZywgdGhpcy5wcm9wcy53aG9Jc1R5cGluZ0xpbWl0KX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1dob0lzVHlwaW5nVGlsZV9sYWJlbFwiPnt0eXBpbmdTdHJpbmd9PC9kaXY+XG4gICAgICAgICAgICA8L2xpPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxXQUFBLEdBQUFDLHVCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBSSxNQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxnQkFBQSxHQUFBTCxPQUFBO0FBQ0EsSUFBQU0sYUFBQSxHQUFBUCxzQkFBQSxDQUFBQyxPQUFBO0FBQW1ELFNBQUFPLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFMLHdCQUFBSyxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFBSixDQUFBLGVBQUFBLENBQUEsdUJBQUFBLENBQUEseUJBQUFBLENBQUEsV0FBQUssT0FBQSxFQUFBTCxDQUFBLFFBQUFHLENBQUEsR0FBQUosd0JBQUEsQ0FBQUcsQ0FBQSxPQUFBQyxDQUFBLElBQUFBLENBQUEsQ0FBQUcsR0FBQSxDQUFBTixDQUFBLFVBQUFHLENBQUEsQ0FBQUksR0FBQSxDQUFBUCxDQUFBLE9BQUFRLENBQUEsS0FBQUMsU0FBQSxVQUFBQyxDQUFBLEdBQUFDLE1BQUEsQ0FBQUMsY0FBQSxJQUFBRCxNQUFBLENBQUFFLHdCQUFBLFdBQUFDLENBQUEsSUFBQWQsQ0FBQSxvQkFBQWMsQ0FBQSxPQUFB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