UNPKG

matrix-react-sdk

Version:
198 lines (193 loc) 31.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _crypto = require("matrix-js-sdk/src/crypto"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _languageHandler = require("../../../languageHandler"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _actions = require("../../../dispatcher/actions"); var _EntityTile = _interopRequireWildcard(require("./EntityTile")); var _MemberAvatar = _interopRequireDefault(require("./../avatars/MemberAvatar")); var _DisambiguatedProfile = _interopRequireDefault(require("../messages/DisambiguatedProfile")); var _UserIdentifier = _interopRequireDefault(require("../../../customisations/UserIdentifier")); var _E2EIcon = require("./E2EIcon"); var _arrays = require("../../../utils/arrays"); var _deviceInfo = require("../../../utils/crypto/deviceInfo"); 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, 2020 The Matrix.org Foundation C.I.C. 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 MemberTile extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "userLastModifiedTime", void 0); (0, _defineProperty2.default)(this, "memberLastModifiedTime", void 0); (0, _defineProperty2.default)(this, "onRoomStateEvents", ev => { if (ev.getType() !== _matrix.EventType.RoomEncryption) return; const { roomId } = this.props.member; if (ev.getRoomId() !== roomId) return; // The room is encrypted now. const cli = _MatrixClientPeg.MatrixClientPeg.safeGet(); cli.removeListener(_matrix.RoomStateEvent.Events, this.onRoomStateEvents); this.setState({ isRoomEncrypted: true }); this.updateE2EStatus(); }); (0, _defineProperty2.default)(this, "onUserTrustStatusChanged", (userId, trustStatus) => { if (userId !== this.props.member.userId) return; this.updateE2EStatus(); }); (0, _defineProperty2.default)(this, "onClick", () => { _dispatcher.default.dispatch({ action: _actions.Action.ViewUser, member: this.props.member, push: true }); }); this.state = { isRoomEncrypted: false }; } componentDidMount() { const cli = _MatrixClientPeg.MatrixClientPeg.safeGet(); const { roomId } = this.props.member; if (roomId) { const isRoomEncrypted = cli.isRoomEncrypted(roomId); this.setState({ isRoomEncrypted }); if (isRoomEncrypted) { cli.on(_crypto.CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); this.updateE2EStatus(); } else { // Listen for room to become encrypted cli.on(_matrix.RoomStateEvent.Events, this.onRoomStateEvents); } } } componentWillUnmount() { const cli = _MatrixClientPeg.MatrixClientPeg.get(); if (cli) { cli.removeListener(_matrix.RoomStateEvent.Events, this.onRoomStateEvents); cli.removeListener(_crypto.CryptoEvent.UserTrustStatusChanged, this.onUserTrustStatusChanged); } } async updateE2EStatus() { const cli = _MatrixClientPeg.MatrixClientPeg.safeGet(); const { userId } = this.props.member; const isMe = userId === cli.getUserId(); const userTrust = await cli.getCrypto()?.getUserVerificationStatus(userId); if (!userTrust?.isCrossSigningVerified()) { this.setState({ e2eStatus: userTrust?.wasCrossSigningVerified() ? _E2EIcon.E2EState.Warning : _E2EIcon.E2EState.Normal }); return; } const deviceIDs = await (0, _deviceInfo.getUserDeviceIds)(cli, userId); const anyDeviceUnverified = await (0, _arrays.asyncSome)(deviceIDs, async deviceId => { // For your own devices, we use the stricter check of cross-signing // verification to encourage everyone to trust their own devices via // cross-signing so that other users can then safely trust you. // For other people's devices, the more general verified check that // includes locally verified devices can be used. const deviceTrust = await cli.getCrypto()?.getDeviceVerificationStatus(userId, deviceId); return !deviceTrust || (isMe ? !deviceTrust.crossSigningVerified : !deviceTrust.isVerified()); }); this.setState({ e2eStatus: anyDeviceUnverified ? _E2EIcon.E2EState.Warning : _E2EIcon.E2EState.Verified }); } shouldComponentUpdate(nextProps, nextState) { if (this.memberLastModifiedTime === undefined || this.memberLastModifiedTime < nextProps.member.getLastModifiedTime()) { return true; } if (nextProps.member.user && (this.userLastModifiedTime === undefined || this.userLastModifiedTime < nextProps.member.user.getLastModifiedTime())) { return true; } if (nextState.isRoomEncrypted !== this.state.isRoomEncrypted || nextState.e2eStatus !== this.state.e2eStatus) { return true; } return false; } getDisplayName() { return this.props.member.name; } getPowerLabel() { return (0, _languageHandler._t)("member_list|power_label", { userName: _UserIdentifier.default.getDisplayUserIdentifier(this.props.member.userId, { roomId: this.props.member.roomId }), powerLevelNumber: this.props.member.powerLevel }).trim(); } render() { const member = this.props.member; const name = this.getDisplayName(); const presenceState = member.user?.presence; const av = /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, { member: member, size: "36px", "aria-hidden": "true" }); if (member.user) { this.userLastModifiedTime = member.user.getLastModifiedTime(); } this.memberLastModifiedTime = member.getLastModifiedTime(); const powerStatusMap = new Map([[100, _EntityTile.PowerStatus.Admin], [50, _EntityTile.PowerStatus.Moderator]]); // Find the nearest power level with a badge let powerLevel = this.props.member.powerLevel; for (const [pl] of powerStatusMap) { if (this.props.member.powerLevel >= pl) { powerLevel = pl; break; } } const powerStatus = powerStatusMap.get(powerLevel); let e2eStatus; if (this.state.isRoomEncrypted) { e2eStatus = this.state.e2eStatus; } const nameJSX = /*#__PURE__*/_react.default.createElement(_DisambiguatedProfile.default, { member: member, fallbackName: name || "" }); return /*#__PURE__*/_react.default.createElement(_EntityTile.default, (0, _extends2.default)({}, this.props, { presenceState: presenceState, presenceLastActiveAgo: member.user ? member.user.lastActiveAgo : 0, presenceLastTs: member.user ? member.user.lastPresenceTs : 0, presenceCurrentlyActive: member.user ? member.user.currentlyActive : false, avatarJsx: av, title: this.getPowerLabel(), name: name, nameJSX: nameJSX, powerStatus: powerStatus, showPresence: this.props.showPresence, e2eStatus: e2eStatus, onClick: this.onClick })); } } exports.default = MemberTile; (0, _defineProperty2.default)(MemberTile, "defaultProps", { showPresence: true }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfY3J5cHRvIiwiX2Rpc3BhdGNoZXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX01hdHJpeENsaWVudFBlZyIsIl9hY3Rpb25zIiwiX0VudGl0eVRpbGUiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9NZW1iZXJBdmF0YXIiLCJfRGlzYW1iaWd1YXRlZFByb2ZpbGUiLCJfVXNlcklkZW50aWZpZXIiLCJfRTJFSWNvbiIsIl9hcnJheXMiLCJfZGV2aWNlSW5mbyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIk1lbWJlclRpbGUiLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZXYiLCJnZXRUeXBlIiwiRXZlbnRUeXBlIiwiUm9vbUVuY3J5cHRpb24iLCJyb29tSWQiLCJtZW1iZXIiLCJnZXRSb29tSWQiLCJjbGkiLCJNYXRyaXhDbGllbnRQZWciLCJzYWZlR2V0IiwicmVtb3ZlTGlzdGVuZXIiLCJSb29tU3RhdGVFdmVudCIsIkV2ZW50cyIsIm9uUm9vbVN0YXRlRXZlbnRzIiwic2V0U3RhdGUiLCJpc1Jvb21FbmNyeXB0ZWQiLCJ1cGRhdGVFMkVTdGF0dXMiLCJ1c2VySWQiLCJ0cnVzdFN0YXR1cyIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1VzZXIiLCJwdXNoIiwic3RhdGUiLCJjb21wb25lbnREaWRNb3VudCIsIm9uIiwiQ3J5cHRvRXZlbnQiLCJVc2VyVHJ1c3RTdGF0dXNDaGFuZ2VkIiwib25Vc2VyVHJ1c3RTdGF0dXNDaGFuZ2VkIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJpc01lIiwiZ2V0VXNlcklkIiwidXNlclRydXN0IiwiZ2V0Q3J5cHRvIiwiZ2V0VXNlclZlcmlmaWNhdGlvblN0YXR1cyIsImlzQ3Jvc3NTaWduaW5nVmVyaWZpZWQiLCJlMmVTdGF0dXMiLCJ3YXNDcm9zc1NpZ25pbmdWZXJpZmllZCIsIkUyRVN0YXRlIiwiV2FybmluZyIsIk5vcm1hbCIsImRldmljZUlEcyIsImdldFVzZXJEZXZpY2VJZHMiLCJhbnlEZXZpY2VVbnZlcmlmaWVkIiwiYXN5bmNTb21lIiwiZGV2aWNlSWQiLCJkZXZpY2VUcnVzdCIsImdldERldmljZVZlcmlmaWNhdGlvblN0YXR1cyIsImNyb3NzU2lnbmluZ1ZlcmlmaWVkIiwiaXNWZXJpZmllZCIsIlZlcmlmaWVkIiwic2hvdWxkQ29tcG9uZW50VXBkYXRlIiwibmV4dFByb3BzIiwibmV4dFN0YXRlIiwibWVtYmVyTGFzdE1vZGlmaWVkVGltZSIsInVuZGVmaW5lZCIsImdldExhc3RNb2RpZmllZFRpbWUiLCJ1c2VyIiwidXNlckxhc3RNb2RpZmllZFRpbWUiLCJnZXREaXNwbGF5TmFtZSIsIm5hbWUiLCJnZXRQb3dlckxhYmVsIiwiX3QiLCJ1c2VyTmFtZSIsIlVzZXJJZGVudGlmaWVyQ3VzdG9taXNhdGlvbnMiLCJnZXREaXNwbGF5VXNlcklkZW50aWZpZXIiLCJwb3dlckxldmVsTnVtYmVyIiwicG93ZXJMZXZlbCIsInRyaW0iLCJyZW5kZXIiLCJwcmVzZW5jZVN0YXRlIiwicHJlc2VuY2UiLCJhdiIsImNyZWF0ZUVsZW1lbnQiLCJzaXplIiwicG93ZXJTdGF0dXNNYXAiLCJNYXAiLCJQb3dlclN0YXR1cyIsIkFkbWluIiwiTW9kZXJhdG9yIiwicGwiLCJwb3dlclN0YXR1cyIsIm5hbWVKU1giLCJmYWxsYmFja05hbWUiLCJfZXh0ZW5kczIiLCJwcmVzZW5jZUxhc3RBY3RpdmVBZ28iLCJsYXN0QWN0aXZlQWdvIiwicHJlc2VuY2VMYXN0VHMiLCJsYXN0UHJlc2VuY2VUcyIsInByZXNlbmNlQ3VycmVudGx5QWN0aXZlIiwiY3VycmVudGx5QWN0aXZlIiwiYXZhdGFySnN4IiwidGl0bGUiLCJzaG93UHJlc2VuY2UiLCJvbkNsaWNrIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL01lbWJlclRpbGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxNSwgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb29tTWVtYmVyLCBSb29tU3RhdGVFdmVudCwgTWF0cml4RXZlbnQsIEV2ZW50VHlwZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IENyeXB0b0V2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2NyeXB0b1wiO1xuaW1wb3J0IHsgVXNlclZlcmlmaWNhdGlvblN0YXR1cyB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9jcnlwdG8tYXBpXCI7XG5cbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgRW50aXR5VGlsZSwgeyBQb3dlclN0YXR1cywgUHJlc2VuY2VTdGF0ZSB9IGZyb20gXCIuL0VudGl0eVRpbGVcIjtcbmltcG9ydCBNZW1iZXJBdmF0YXIgZnJvbSBcIi4vLi4vYXZhdGFycy9NZW1iZXJBdmF0YXJcIjtcbmltcG9ydCBEaXNhbWJpZ3VhdGVkUHJvZmlsZSBmcm9tIFwiLi4vbWVzc2FnZXMvRGlzYW1iaWd1YXRlZFByb2ZpbGVcIjtcbmltcG9ydCBVc2VySWRlbnRpZmllckN1c3RvbWlzYXRpb25zIGZyb20gXCIuLi8uLi8uLi9jdXN0b21pc2F0aW9ucy9Vc2VySWRlbnRpZmllclwiO1xuaW1wb3J0IHsgRTJFU3RhdGUgfSBmcm9tIFwiLi9FMkVJY29uXCI7XG5pbXBvcnQgeyBhc3luY1NvbWUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYXJyYXlzXCI7XG5pbXBvcnQgeyBnZXRVc2VyRGV2aWNlSWRzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2NyeXB0by9kZXZpY2VJbmZvXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIG1lbWJlcjogUm9vbU1lbWJlcjtcbiAgICBzaG93UHJlc2VuY2U/OiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBpc1Jvb21FbmNyeXB0ZWQ6IGJvb2xlYW47XG4gICAgZTJlU3RhdHVzPzogRTJFU3RhdGU7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lbWJlclRpbGUgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIHVzZXJMYXN0TW9kaWZpZWRUaW1lPzogbnVtYmVyO1xuICAgIHByaXZhdGUgbWVtYmVyTGFzdE1vZGlmaWVkVGltZT86IG51bWJlcjtcblxuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBzaG93UHJlc2VuY2U6IHRydWUsXG4gICAgfTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaXNSb29tRW5jcnlwdGVkOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCk7XG5cbiAgICAgICAgY29uc3QgeyByb29tSWQgfSA9IHRoaXMucHJvcHMubWVtYmVyO1xuICAgICAgICBpZiAocm9vbUlkKSB7XG4gICAgICAgICAgICBjb25zdCBpc1Jvb21FbmNyeXB0ZWQgPSBjbGkuaXNSb29tRW5jcnlwdGVkKHJvb21JZCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBpc1Jvb21FbmNyeXB0ZWQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpc1Jvb21FbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgICAgICBjbGkub24oQ3J5cHRvRXZlbnQuVXNlclRydXN0U3RhdHVzQ2hhbmdlZCwgdGhpcy5vblVzZXJUcnVzdFN0YXR1c0NoYW5nZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRTJFU3RhdHVzKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIExpc3RlbiBmb3Igcm9vbSB0byBiZWNvbWUgZW5jcnlwdGVkXG4gICAgICAgICAgICAgICAgY2xpLm9uKFJvb21TdGF0ZUV2ZW50LkV2ZW50cywgdGhpcy5vblJvb21TdGF0ZUV2ZW50cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcblxuICAgICAgICBpZiAoY2xpKSB7XG4gICAgICAgICAgICBjbGkucmVtb3ZlTGlzdGVuZXIoUm9vbVN0YXRlRXZlbnQuRXZlbnRzLCB0aGlzLm9uUm9vbVN0YXRlRXZlbnRzKTtcbiAgICAgICAgICAgIGNsaS5yZW1vdmVMaXN0ZW5lcihDcnlwdG9FdmVudC5Vc2VyVHJ1c3RTdGF0dXNDaGFuZ2VkLCB0aGlzLm9uVXNlclRydXN0U3RhdHVzQ2hhbmdlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uUm9vbVN0YXRlRXZlbnRzID0gKGV2OiBNYXRyaXhFdmVudCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoZXYuZ2V0VHlwZSgpICE9PSBFdmVudFR5cGUuUm9vbUVuY3J5cHRpb24pIHJldHVybjtcbiAgICAgICAgY29uc3QgeyByb29tSWQgfSA9IHRoaXMucHJvcHMubWVtYmVyO1xuICAgICAgICBpZiAoZXYuZ2V0Um9vbUlkKCkgIT09IHJvb21JZCkgcmV0dXJuO1xuXG4gICAgICAgIC8vIFRoZSByb29tIGlzIGVuY3J5cHRlZCBub3cuXG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCk7XG4gICAgICAgIGNsaS5yZW1vdmVMaXN0ZW5lcihSb29tU3RhdGVFdmVudC5FdmVudHMsIHRoaXMub25Sb29tU3RhdGVFdmVudHMpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIGlzUm9vbUVuY3J5cHRlZDogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMudXBkYXRlRTJFU3RhdHVzKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Vc2VyVHJ1c3RTdGF0dXNDaGFuZ2VkID0gKHVzZXJJZDogc3RyaW5nLCB0cnVzdFN0YXR1czogVXNlclZlcmlmaWNhdGlvblN0YXR1cyk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAodXNlcklkICE9PSB0aGlzLnByb3BzLm1lbWJlci51c2VySWQpIHJldHVybjtcbiAgICAgICAgdGhpcy51cGRhdGVFMkVTdGF0dXMoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBhc3luYyB1cGRhdGVFMkVTdGF0dXMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCk7XG4gICAgICAgIGNvbnN0IHsgdXNlcklkIH0gPSB0aGlzLnByb3BzLm1lbWJlcjtcbiAgICAgICAgY29uc3QgaXNNZSA9IHVzZXJJZCA9PT0gY2xpLmdldFVzZXJJZCgpO1xuICAgICAgICBjb25zdCB1c2VyVHJ1c3QgPSBhd2FpdCBjbGkuZ2V0Q3J5cHRvKCk/LmdldFVzZXJWZXJpZmljYXRpb25TdGF0dXModXNlcklkKTtcbiAgICAgICAgaWYgKCF1c2VyVHJ1c3Q/LmlzQ3Jvc3NTaWduaW5nVmVyaWZpZWQoKSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgZTJlU3RhdHVzOiB1c2VyVHJ1c3Q/Lndhc0Nyb3NzU2lnbmluZ1ZlcmlmaWVkKCkgPyBFMkVTdGF0ZS5XYXJuaW5nIDogRTJFU3RhdGUuTm9ybWFsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZXZpY2VJRHMgPSBhd2FpdCBnZXRVc2VyRGV2aWNlSWRzKGNsaSwgdXNlcklkKTtcbiAgICAgICAgY29uc3QgYW55RGV2aWNlVW52ZXJpZmllZCA9IGF3YWl0IGFzeW5jU29tZShkZXZpY2VJRHMsIGFzeW5jIChkZXZpY2VJZCkgPT4ge1xuICAgICAgICAgICAgLy8gRm9yIHlvdXIgb3duIGRldmljZXMsIHdlIHVzZSB0aGUgc3RyaWN0ZXIgY2hlY2sgb2YgY3Jvc3Mtc2lnbmluZ1xuICAgICAgICAgICAgLy8gdmVyaWZpY2F0aW9uIHRvIGVuY291cmFnZSBldmVyeW9uZSB0byB0cnVzdCB0aGVpciBvd24gZGV2aWNlcyB2aWFcbiAgICAgICAgICAgIC8vIGNyb3NzLXNpZ25pbmcgc28gdGhhdCBvdGhlciB1c2VycyBjYW4gdGhlbiBzYWZlbHkgdHJ1c3QgeW91LlxuICAgICAgICAgICAgLy8gRm9yIG90aGVyIHBlb3BsZSdzIGRldmljZXMsIHRoZSBtb3JlIGdlbmVyYWwgdmVyaWZpZWQgY2hlY2sgdGhhdFxuICAgICAgICAgICAgLy8gaW5jbHVkZXMgbG9jYWxseSB2ZXJpZmllZCBkZXZpY2VzIGNhbiBiZSB1c2VkLlxuICAgICAgICAgICAgY29uc3QgZGV2aWNlVHJ1c3QgPSBhd2FpdCBjbGkuZ2V0Q3J5cHRvKCk/LmdldERldmljZVZlcmlmaWNhdGlvblN0YXR1cyh1c2VySWQsIGRldmljZUlkKTtcbiAgICAgICAgICAgIHJldHVybiAhZGV2aWNlVHJ1c3QgfHwgKGlzTWUgPyAhZGV2aWNlVHJ1c3QuY3Jvc3NTaWduaW5nVmVyaWZpZWQgOiAhZGV2aWNlVHJ1c3QuaXNWZXJpZmllZCgpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgZTJlU3RhdHVzOiBhbnlEZXZpY2VVbnZlcmlmaWVkID8gRTJFU3RhdGUuV2FybmluZyA6IEUyRVN0YXRlLlZlcmlmaWVkLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2hvdWxkQ29tcG9uZW50VXBkYXRlKG5leHRQcm9wczogSVByb3BzLCBuZXh0U3RhdGU6IElTdGF0ZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB0aGlzLm1lbWJlckxhc3RNb2RpZmllZFRpbWUgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgdGhpcy5tZW1iZXJMYXN0TW9kaWZpZWRUaW1lIDwgbmV4dFByb3BzLm1lbWJlci5nZXRMYXN0TW9kaWZpZWRUaW1lKClcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBuZXh0UHJvcHMubWVtYmVyLnVzZXIgJiZcbiAgICAgICAgICAgICh0aGlzLnVzZXJMYXN0TW9kaWZpZWRUaW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJMYXN0TW9kaWZpZWRUaW1lIDwgbmV4dFByb3BzLm1lbWJlci51c2VyLmdldExhc3RNb2RpZmllZFRpbWUoKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmV4dFN0YXRlLmlzUm9vbUVuY3J5cHRlZCAhPT0gdGhpcy5zdGF0ZS5pc1Jvb21FbmNyeXB0ZWQgfHwgbmV4dFN0YXRlLmUyZVN0YXR1cyAhPT0gdGhpcy5zdGF0ZS5lMmVTdGF0dXMpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlcixcbiAgICAgICAgICAgIG1lbWJlcjogdGhpcy5wcm9wcy5tZW1iZXIsXG4gICAgICAgICAgICBwdXNoOiB0cnVlLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXREaXNwbGF5TmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wcm9wcy5tZW1iZXIubmFtZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFBvd2VyTGFiZWwoKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIF90KFwibWVtYmVyX2xpc3R8cG93ZXJfbGFiZWxcIiwge1xuICAgICAgICAgICAgdXNlck5hbWU6IFVzZXJJZGVudGlmaWVyQ3VzdG9taXNhdGlvbnMuZ2V0RGlzcGxheVVzZXJJZGVudGlmaWVyKHRoaXMucHJvcHMubWVtYmVyLnVzZXJJZCwge1xuICAgICAgICAgICAgICAgIHJvb21JZDogdGhpcy5wcm9wcy5tZW1iZXIucm9vbUlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBwb3dlckxldmVsTnVtYmVyOiB0aGlzLnByb3BzLm1lbWJlci5wb3dlckxldmVsLFxuICAgICAgICB9KS50cmltKCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnByb3BzLm1lbWJlcjtcbiAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuZ2V0RGlzcGxheU5hbWUoKTtcbiAgICAgICAgY29uc3QgcHJlc2VuY2VTdGF0ZSA9IG1lbWJlci51c2VyPy5wcmVzZW5jZSBhcyBQcmVzZW5jZVN0YXRlIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGF2ID0gPE1lbWJlckF2YXRhciBtZW1iZXI9e21lbWJlcn0gc2l6ZT1cIjM2cHhcIiBhcmlhLWhpZGRlbj1cInRydWVcIiAvPjtcblxuICAgICAgICBpZiAobWVtYmVyLnVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMudXNlckxhc3RNb2RpZmllZFRpbWUgPSBtZW1iZXIudXNlci5nZXRMYXN0TW9kaWZpZWRUaW1lKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZW1iZXJMYXN0TW9kaWZpZWRUaW1lID0gbWVtYmVyLmdldExhc3RNb2RpZmllZFRpbWUoKTtcblxuICAgICAgICBjb25zdCBwb3dlclN0YXR1c01hcCA9IG5ldyBNYXAoW1xuICAgICAgICAgICAgWzEwMCwgUG93ZXJTdGF0dXMuQWRtaW5dLFxuICAgICAgICAgICAgWzUwLCBQb3dlclN0YXR1cy5Nb2RlcmF0b3JdLFxuICAgICAgICBdKTtcblxuICAgICAgICAvLyBGaW5kIHRoZSBuZWFyZXN0IHBvd2VyIGxldmVsIHdpdGggYSBiYWRnZVxuICAgICAgICBsZXQgcG93ZXJMZXZlbCA9IHRoaXMucHJvcHMubWVtYmVyLnBvd2VyTGV2ZWw7XG4gICAgICAgIGZvciAoY29uc3QgW3BsXSBvZiBwb3dlclN0YXR1c01hcCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMubWVtYmVyLnBvd2VyTGV2ZWwgPj0gcGwpIHtcbiAgICAgICAgICAgICAgICBwb3dlckxldmVsID0gcGw7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwb3dlclN0YXR1cyA9IHBvd2VyU3RhdHVzTWFwLmdldChwb3dlckxldmVsKTtcblxuICAgICAgICBsZXQgZTJlU3RhdHVzOiBFMkVTdGF0ZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNSb29tRW5jcnlwdGVkKSB7XG4gICAgICAgICAgICBlMmVTdGF0dXMgPSB0aGlzLnN0YXRlLmUyZVN0YXR1cztcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5hbWVKU1ggPSA8RGlzYW1iaWd1YXRlZFByb2ZpbGUgbWVtYmVyPXttZW1iZXJ9IGZhbGxiYWNrTmFtZT17bmFtZSB8fCBcIlwifSAvPjtcblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEVudGl0eVRpbGVcbiAgICAgICAgICAgICAgICB7Li4udGhpcy5wcm9wc31cbiAgICAgICAgICAgICAgICBwcmVzZW5jZVN0YXRlPXtwcmVzZW5jZVN0YXRlfVxuICAgICAgICAgICAgICAgIHByZXNlbmNlTGFzdEFjdGl2ZUFnbz17bWVtYmVyLnVzZXIgPyBtZW1iZXIudXNlci5sYXN0QWN0aXZlQWdvIDogMH1cbiAgICAgICAgICAgICAgICBwcmVzZW5jZUxhc3RUcz17bWVtYmVyLnVzZXIgPyBtZW1iZXIudXNlci5sYXN0UHJlc2VuY2VUcyA6IDB9XG4gICAgICAgICAgICAgICAgcHJlc2VuY2VDdXJyZW50bHlBY3RpdmU9e21lbWJlci51c2VyID8gbWVtYmVyLnVzZXIuY3VycmVudGx5QWN0aXZlIDogZmFsc2V9XG4gICAgICAgICAgICAgICAgYXZhdGFySnN4PXthdn1cbiAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy5nZXRQb3dlckxhYmVsKCl9XG4gICAgICAgICAgICAgICAgbmFtZT17bmFtZX1cbiAgICAgICAgICAgICAgICBuYW1lSlNYPXtuYW1lSlNYfVxuICAgICAgICAgICAgICAgIHBvd2VyU3RhdHVzPXtwb3dlclN0YXR1c31cbiAgICAgICAgICAgICAgICBzaG93UHJlc2VuY2U9e3RoaXMucHJvcHMuc2hvd1ByZXNlbmNlfVxuICAgICAgICAgICAgICAgIGUyZVN0YXR1cz17ZTJlU3RhdHVzfVxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25DbGlja31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFTQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFHQSxJQUFBRyxXQUFBLEdBQUFKLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSSxnQkFBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFFBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQUMsdUJBQUEsQ0FBQVIsT0FBQTtBQUNBLElBQUFTLGFBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLHFCQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVyxlQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSxRQUFBLEdBQUFaLE9BQUE7QUFDQSxJQUFBYSxPQUFBLEdBQUFiLE9BQUE7QUFDQSxJQUFBYyxXQUFBLEdBQUFkLE9BQUE7QUFBb0UsU0FBQWUseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENB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