UNPKG

matrix-react-sdk

Version:
205 lines (202 loc) 31 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 _cryptoApi = require("matrix-js-sdk/src/crypto-api"); var _logger = require("matrix-js-sdk/src/logger"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _languageHandler = require("../../../languageHandler"); var _Media = require("../../../customisations/Media"); var _VerificationComplete = _interopRequireDefault(require("../verification/VerificationComplete")); var _VerificationCancelled = _interopRequireDefault(require("../verification/VerificationCancelled")); var _BaseAvatar = _interopRequireDefault(require("../avatars/BaseAvatar")); var _Spinner = _interopRequireDefault(require("../elements/Spinner")); var _VerificationShowSas = _interopRequireDefault(require("../verification/VerificationShowSas")); var _BaseDialog = _interopRequireDefault(require("./BaseDialog")); var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons")); /* Copyright 2019-2024 New Vector Ltd. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const PHASE_START = 0; const PHASE_SHOW_SAS = 1; const PHASE_WAIT_FOR_PARTNER_TO_CONFIRM = 2; const PHASE_VERIFIED = 3; const PHASE_CANCELLED = 4; class IncomingSasDialog extends _react.default.Component { constructor(props) { super(props); (0, _defineProperty2.default)(this, "showSasEvent", void 0); (0, _defineProperty2.default)(this, "onFinished", () => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); }); (0, _defineProperty2.default)(this, "onCancelClick", () => { this.props.onFinished(this.state.phase === PHASE_VERIFIED); }); (0, _defineProperty2.default)(this, "onContinueClick", () => { this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM }); this.props.verifier.verify().then(() => { this.setState({ phase: PHASE_VERIFIED }); }).catch(e => { _logger.logger.log("Verification failed", e); }); }); (0, _defineProperty2.default)(this, "onVerifierShowSas", e => { this.showSasEvent = e; this.setState({ phase: PHASE_SHOW_SAS, sas: e.sas }); }); (0, _defineProperty2.default)(this, "onVerifierCancel", () => { this.setState({ phase: PHASE_CANCELLED }); }); (0, _defineProperty2.default)(this, "onSasMatchesClick", () => { this.showSasEvent?.confirm(); this.setState({ phase: PHASE_WAIT_FOR_PARTNER_TO_CONFIRM }); }); (0, _defineProperty2.default)(this, "onVerifiedDoneClick", () => { this.props.onFinished(true); }); let phase = PHASE_START; if (this.props.verifier.hasBeenCancelled) { _logger.logger.log("Verifier was cancelled in the background."); phase = PHASE_CANCELLED; } this.showSasEvent = null; this.state = { phase: phase, sasVerified: false, opponentProfile: null, opponentProfileError: null, sas: null }; this.props.verifier.on(_cryptoApi.VerifierEvent.ShowSas, this.onVerifierShowSas); this.props.verifier.on(_cryptoApi.VerifierEvent.Cancel, this.onVerifierCancel); this.fetchOpponentProfile(); } componentWillUnmount() { if (this.state.phase !== PHASE_CANCELLED && this.state.phase !== PHASE_VERIFIED) { this.props.verifier.cancel(new Error("User cancel")); } this.props.verifier.removeListener(_cryptoApi.VerifierEvent.ShowSas, this.onVerifierShowSas); } async fetchOpponentProfile() { try { const prof = await _MatrixClientPeg.MatrixClientPeg.safeGet().getProfileInfo(this.props.verifier.userId); this.setState({ opponentProfile: prof }); } catch (e) { this.setState({ opponentProfileError: e }); } } renderPhaseStart() { const isSelf = this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId(); let profile; const oppProfile = this.state.opponentProfile; if (oppProfile) { const url = oppProfile.avatar_url ? (0, _Media.mediaFromMxc)(oppProfile.avatar_url).getSquareThumbnailHttp(48) : null; profile = /*#__PURE__*/_react.default.createElement("div", { className: "mx_IncomingSasDialog_opponentProfile" }, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, { name: oppProfile.displayname, idName: this.props.verifier.userId, url: url, size: "48px" }), /*#__PURE__*/_react.default.createElement("h2", null, oppProfile.displayname)); } else if (this.state.opponentProfileError) { profile = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, { name: this.props.verifier.userId.slice(1), idName: this.props.verifier.userId, size: "48px" }), /*#__PURE__*/_react.default.createElement("h2", null, this.props.verifier.userId)); } else { profile = /*#__PURE__*/_react.default.createElement(_Spinner.default, null); } const userDetailText = [/*#__PURE__*/_react.default.createElement("p", { key: "p1" }, (0, _languageHandler._t)("encryption|verification|incoming_sas_user_dialog_text_1")), /*#__PURE__*/_react.default.createElement("p", { key: "p2" }, (0, _languageHandler._t)( // NB. Below wording adjusted to singular 'session' until we have // cross-signing "encryption|verification|incoming_sas_user_dialog_text_2"))]; const selfDetailText = [/*#__PURE__*/_react.default.createElement("p", { key: "p1" }, (0, _languageHandler._t)("encryption|verification|incoming_sas_device_dialog_text_1")), /*#__PURE__*/_react.default.createElement("p", { key: "p2" }, (0, _languageHandler._t)("encryption|verification|incoming_sas_device_dialog_text_2"))]; return /*#__PURE__*/_react.default.createElement("div", null, profile, isSelf ? selfDetailText : userDetailText, /*#__PURE__*/_react.default.createElement(_DialogButtons.default, { primaryButton: (0, _languageHandler._t)("action|continue"), hasCancel: true, onPrimaryButtonClick: this.onContinueClick, onCancel: this.onCancelClick })); } renderPhaseShowSas() { if (!this.showSasEvent) return null; return /*#__PURE__*/_react.default.createElement(_VerificationShowSas.default, { sas: this.showSasEvent.sas, onCancel: this.onCancelClick, onDone: this.onSasMatchesClick, isSelf: this.props.verifier.userId === _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId(), inDialog: true }); } renderPhaseWaitForPartnerToConfirm() { return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Spinner.default, null), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("encryption|verification|incoming_sas_dialog_waiting"))); } renderPhaseVerified() { return /*#__PURE__*/_react.default.createElement(_VerificationComplete.default, { onDone: this.onVerifiedDoneClick }); } renderPhaseCancelled() { return /*#__PURE__*/_react.default.createElement(_VerificationCancelled.default, { onDone: this.onCancelClick }); } render() { let body; switch (this.state.phase) { case PHASE_START: body = this.renderPhaseStart(); break; case PHASE_SHOW_SAS: body = this.renderPhaseShowSas(); break; case PHASE_WAIT_FOR_PARTNER_TO_CONFIRM: body = this.renderPhaseWaitForPartnerToConfirm(); break; case PHASE_VERIFIED: body = this.renderPhaseVerified(); break; case PHASE_CANCELLED: body = this.renderPhaseCancelled(); break; } return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, { title: (0, _languageHandler._t)("encryption|verification|incoming_sas_dialog_title"), onFinished: this.onFinished, fixedWidth: false }, body); } } exports.default = IncomingSasDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9jcnlwdG9BcGkiLCJfbG9nZ2VyIiwiX01hdHJpeENsaWVudFBlZyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTWVkaWEiLCJfVmVyaWZpY2F0aW9uQ29tcGxldGUiLCJfVmVyaWZpY2F0aW9uQ2FuY2VsbGVkIiwiX0Jhc2VBdmF0YXIiLCJfU3Bpbm5lciIsIl9WZXJpZmljYXRpb25TaG93U2FzIiwiX0Jhc2VEaWFsb2ciLCJfRGlhbG9nQnV0dG9ucyIsIlBIQVNFX1NUQVJUIiwiUEhBU0VfU0hPV19TQVMiLCJQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0iLCJQSEFTRV9WRVJJRklFRCIsIlBIQVNFX0NBTkNFTExFRCIsIkluY29taW5nU2FzRGlhbG9nIiwiUmVhY3QiLCJDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJvbkZpbmlzaGVkIiwic3RhdGUiLCJwaGFzZSIsInNldFN0YXRlIiwidmVyaWZpZXIiLCJ2ZXJpZnkiLCJ0aGVuIiwiY2F0Y2giLCJlIiwibG9nZ2VyIiwibG9nIiwic2hvd1Nhc0V2ZW50Iiwic2FzIiwiY29uZmlybSIsImhhc0JlZW5DYW5jZWxsZWQiLCJzYXNWZXJpZmllZCIsIm9wcG9uZW50UHJvZmlsZSIsIm9wcG9uZW50UHJvZmlsZUVycm9yIiwib24iLCJWZXJpZmllckV2ZW50IiwiU2hvd1NhcyIsIm9uVmVyaWZpZXJTaG93U2FzIiwiQ2FuY2VsIiwib25WZXJpZmllckNhbmNlbCIsImZldGNoT3Bwb25lbnRQcm9maWxlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJjYW5jZWwiLCJFcnJvciIsInJlbW92ZUxpc3RlbmVyIiwicHJvZiIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRQcm9maWxlSW5mbyIsInVzZXJJZCIsInJlbmRlclBoYXNlU3RhcnQiLCJpc1NlbGYiLCJnZXRVc2VySWQiLCJwcm9maWxlIiwib3BwUHJvZmlsZSIsInVybCIsImF2YXRhcl91cmwiLCJtZWRpYUZyb21NeGMiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIm5hbWUiLCJkaXNwbGF5bmFtZSIsImlkTmFtZSIsInNpemUiLCJzbGljZSIsInVzZXJEZXRhaWxUZXh0Iiwia2V5IiwiX3QiLCJzZWxmRGV0YWlsVGV4dCIsInByaW1hcnlCdXR0b24iLCJoYXNDYW5jZWwiLCJvblByaW1hcnlCdXR0b25DbGljayIsIm9uQ29udGludWVDbGljayIsIm9uQ2FuY2VsIiwib25DYW5jZWxDbGljayIsInJlbmRlclBoYXNlU2hvd1NhcyIsIm9uRG9uZSIsIm9uU2FzTWF0Y2hlc0NsaWNrIiwiaW5EaWFsb2ciLCJyZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtIiwicmVuZGVyUGhhc2VWZXJpZmllZCIsIm9uVmVyaWZpZWREb25lQ2xpY2siLCJyZW5kZXJQaGFzZUNhbmNlbGxlZCIsInJlbmRlciIsImJvZHkiLCJ0aXRsZSIsImZpeGVkV2lkdGgiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlhbG9ncy9JbmNvbWluZ1Nhc0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5LTIwMjQgTmV3IFZlY3RvciBMdGQuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBSZWFjdE5vZGUgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IEdlbmVyYXRlZFNhcywgU2hvd1Nhc0NhbGxiYWNrcywgVmVyaWZpZXIsIFZlcmlmaWVyRXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvY3J5cHRvLWFwaVwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IG1lZGlhRnJvbU14YyB9IGZyb20gXCIuLi8uLi8uLi9jdXN0b21pc2F0aW9ucy9NZWRpYVwiO1xuaW1wb3J0IFZlcmlmaWNhdGlvbkNvbXBsZXRlIGZyb20gXCIuLi92ZXJpZmljYXRpb24vVmVyaWZpY2F0aW9uQ29tcGxldGVcIjtcbmltcG9ydCBWZXJpZmljYXRpb25DYW5jZWxsZWQgZnJvbSBcIi4uL3ZlcmlmaWNhdGlvbi9WZXJpZmljYXRpb25DYW5jZWxsZWRcIjtcbmltcG9ydCBCYXNlQXZhdGFyIGZyb20gXCIuLi9hdmF0YXJzL0Jhc2VBdmF0YXJcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgVmVyaWZpY2F0aW9uU2hvd1NhcyBmcm9tIFwiLi4vdmVyaWZpY2F0aW9uL1ZlcmlmaWNhdGlvblNob3dTYXNcIjtcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi9lbGVtZW50cy9EaWFsb2dCdXR0b25zXCI7XG5cbmNvbnN0IFBIQVNFX1NUQVJUID0gMDtcbmNvbnN0IFBIQVNFX1NIT1dfU0FTID0gMTtcbmNvbnN0IFBIQVNFX1dBSVRfRk9SX1BBUlRORVJfVE9fQ09ORklSTSA9IDI7XG5jb25zdCBQSEFTRV9WRVJJRklFRCA9IDM7XG5jb25zdCBQSEFTRV9DQU5DRUxMRUQgPSA0O1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICB2ZXJpZmllcjogVmVyaWZpZXI7XG4gICAgb25GaW5pc2hlZCh2ZXJpZmllZD86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBwaGFzZTogbnVtYmVyO1xuICAgIHNhc1ZlcmlmaWVkOiBib29sZWFuO1xuICAgIG9wcG9uZW50UHJvZmlsZToge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2FtZWxjYXNlXG4gICAgICAgIGF2YXRhcl91cmw/OiBzdHJpbmc7XG4gICAgICAgIGRpc3BsYXluYW1lPzogc3RyaW5nO1xuICAgIH0gfCBudWxsO1xuICAgIG9wcG9uZW50UHJvZmlsZUVycm9yOiBFcnJvciB8IG51bGw7XG4gICAgc2FzOiBHZW5lcmF0ZWRTYXMgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbmNvbWluZ1Nhc0RpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgc2hvd1Nhc0V2ZW50OiBTaG93U2FzQ2FsbGJhY2tzIHwgbnVsbDtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICBsZXQgcGhhc2UgPSBQSEFTRV9TVEFSVDtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMudmVyaWZpZXIuaGFzQmVlbkNhbmNlbGxlZCkge1xuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIlZlcmlmaWVyIHdhcyBjYW5jZWxsZWQgaW4gdGhlIGJhY2tncm91bmQuXCIpO1xuICAgICAgICAgICAgcGhhc2UgPSBQSEFTRV9DQU5DRUxMRUQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNob3dTYXNFdmVudCA9IG51bGw7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBwaGFzZTogcGhhc2UsXG4gICAgICAgICAgICBzYXNWZXJpZmllZDogZmFsc2UsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGU6IG51bGwsXG4gICAgICAgICAgICBvcHBvbmVudFByb2ZpbGVFcnJvcjogbnVsbCxcbiAgICAgICAgICAgIHNhczogbnVsbCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcm9wcy52ZXJpZmllci5vbihWZXJpZmllckV2ZW50LlNob3dTYXMsIHRoaXMub25WZXJpZmllclNob3dTYXMpO1xuICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLm9uKFZlcmlmaWVyRXZlbnQuQ2FuY2VsLCB0aGlzLm9uVmVyaWZpZXJDYW5jZWwpO1xuICAgICAgICB0aGlzLmZldGNoT3Bwb25lbnRQcm9maWxlKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5waGFzZSAhPT0gUEhBU0VfQ0FOQ0VMTEVEICYmIHRoaXMuc3RhdGUucGhhc2UgIT09IFBIQVNFX1ZFUklGSUVEKSB7XG4gICAgICAgICAgICB0aGlzLnByb3BzLnZlcmlmaWVyLmNhbmNlbChuZXcgRXJyb3IoXCJVc2VyIGNhbmNlbFwiKSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcm9wcy52ZXJpZmllci5yZW1vdmVMaXN0ZW5lcihWZXJpZmllckV2ZW50LlNob3dTYXMsIHRoaXMub25WZXJpZmllclNob3dTYXMpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmV0Y2hPcHBvbmVudFByb2ZpbGUoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBwcm9mID0gYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRQcm9maWxlSW5mbyh0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZCk7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICBvcHBvbmVudFByb2ZpbGU6IHByb2YsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICAgICAgb3Bwb25lbnRQcm9maWxlRXJyb3I6IGUgYXMgRXJyb3IsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25GaW5pc2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRoaXMuc3RhdGUucGhhc2UgPT09IFBIQVNFX1ZFUklGSUVEKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbENsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodGhpcy5zdGF0ZS5waGFzZSA9PT0gUEhBU0VfVkVSSUZJRUQpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ29udGludWVDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHBoYXNlOiBQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0gfSk7XG4gICAgICAgIHRoaXMucHJvcHMudmVyaWZpZXJcbiAgICAgICAgICAgIC52ZXJpZnkoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBwaGFzZTogUEhBU0VfVkVSSUZJRUQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcIlZlcmlmaWNhdGlvbiBmYWlsZWRcIiwgZSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblZlcmlmaWVyU2hvd1NhcyA9IChlOiBTaG93U2FzQ2FsbGJhY2tzKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuc2hvd1Nhc0V2ZW50ID0gZTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBwaGFzZTogUEhBU0VfU0hPV19TQVMsXG4gICAgICAgICAgICBzYXM6IGUuc2FzLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblZlcmlmaWVyQ2FuY2VsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBQSEFTRV9DQU5DRUxMRUQsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uU2FzTWF0Y2hlc0NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNob3dTYXNFdmVudD8uY29uZmlybSgpO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHBoYXNlOiBQSEFTRV9XQUlUX0ZPUl9QQVJUTkVSX1RPX0NPTkZJUk0sXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmVyaWZpZWREb25lQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0cnVlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSByZW5kZXJQaGFzZVN0YXJ0KCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGlzU2VsZiA9IHRoaXMucHJvcHMudmVyaWZpZXIudXNlcklkID09PSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFVzZXJJZCgpO1xuXG4gICAgICAgIGxldCBwcm9maWxlO1xuICAgICAgICBjb25zdCBvcHBQcm9maWxlID0gdGhpcy5zdGF0ZS5vcHBvbmVudFByb2ZpbGU7XG4gICAgICAgIGlmIChvcHBQcm9maWxlKSB7XG4gICAgICAgICAgICBjb25zdCB1cmwgPSBvcHBQcm9maWxlLmF2YXRhcl91cmwgPyBtZWRpYUZyb21NeGMob3BwUHJvZmlsZS5hdmF0YXJfdXJsKS5nZXRTcXVhcmVUaHVtYm5haWxIdHRwKDQ4KSA6IG51bGw7XG4gICAgICAgICAgICBwcm9maWxlID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfSW5jb21pbmdTYXNEaWFsb2dfb3Bwb25lbnRQcm9maWxlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxCYXNlQXZhdGFyXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lPXtvcHBQcm9maWxlLmRpc3BsYXluYW1lfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWROYW1lPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHVybD17dXJsfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjQ4cHhcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8aDI+e29wcFByb2ZpbGUuZGlzcGxheW5hbWV9PC9oMj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5vcHBvbmVudFByb2ZpbGVFcnJvcikge1xuICAgICAgICAgICAgcHJvZmlsZSA9IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8QmFzZUF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT17dGhpcy5wcm9wcy52ZXJpZmllci51c2VySWQuc2xpY2UoMSl9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZE5hbWU9e3RoaXMucHJvcHMudmVyaWZpZXIudXNlcklkfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIjQ4cHhcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8aDI+e3RoaXMucHJvcHMudmVyaWZpZXIudXNlcklkfTwvaDI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcHJvZmlsZSA9IDxTcGlubmVyIC8+O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdXNlckRldGFpbFRleHQgPSBbXG4gICAgICAgICAgICA8cCBrZXk9XCJwMVwiPntfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGluY29taW5nX3Nhc191c2VyX2RpYWxvZ190ZXh0XzFcIil9PC9wPixcbiAgICAgICAgICAgIDxwIGtleT1cInAyXCI+XG4gICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAvLyBOQi4gQmVsb3cgd29yZGluZyBhZGp1c3RlZCB0byBzaW5ndWxhciAnc2Vzc2lvbicgdW50aWwgd2UgaGF2ZVxuICAgICAgICAgICAgICAgICAgICAvLyBjcm9zcy1zaWduaW5nXG4gICAgICAgICAgICAgICAgICAgIFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX3VzZXJfZGlhbG9nX3RleHRfMlwiLFxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L3A+LFxuICAgICAgICBdO1xuXG4gICAgICAgIGNvbnN0IHNlbGZEZXRhaWxUZXh0ID0gW1xuICAgICAgICAgICAgPHAga2V5PVwicDFcIj57X3QoXCJlbmNyeXB0aW9ufHZlcmlmaWNhdGlvbnxpbmNvbWluZ19zYXNfZGV2aWNlX2RpYWxvZ190ZXh0XzFcIil9PC9wPixcbiAgICAgICAgICAgIDxwIGtleT1cInAyXCI+e190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX2RldmljZV9kaWFsb2dfdGV4dF8yXCIpfTwvcD4sXG4gICAgICAgIF07XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAge3Byb2ZpbGV9XG4gICAgICAgICAgICAgICAge2lzU2VsZiA/IHNlbGZEZXRhaWxUZXh0IDogdXNlckRldGFpbFRleHR9XG4gICAgICAgICAgICAgICAgPERpYWxvZ0J1dHRvbnNcbiAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJhY3Rpb258Y29udGludWVcIil9XG4gICAgICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMub25Db250aW51ZUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkNhbmNlbENsaWNrfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBoYXNlU2hvd1NhcygpOiBSZWFjdE5vZGUge1xuICAgICAgICBpZiAoIXRoaXMuc2hvd1Nhc0V2ZW50KSByZXR1cm4gbnVsbDtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxWZXJpZmljYXRpb25TaG93U2FzXG4gICAgICAgICAgICAgICAgc2FzPXt0aGlzLnNob3dTYXNFdmVudC5zYXN9XG4gICAgICAgICAgICAgICAgb25DYW5jZWw9e3RoaXMub25DYW5jZWxDbGlja31cbiAgICAgICAgICAgICAgICBvbkRvbmU9e3RoaXMub25TYXNNYXRjaGVzQ2xpY2t9XG4gICAgICAgICAgICAgICAgaXNTZWxmPXt0aGlzLnByb3BzLnZlcmlmaWVyLnVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRVc2VySWQoKX1cbiAgICAgICAgICAgICAgICBpbkRpYWxvZz17dHJ1ZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJQaGFzZVdhaXRGb3JQYXJ0bmVyVG9Db25maXJtKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIDxTcGlubmVyIC8+XG4gICAgICAgICAgICAgICAgPHA+e190KFwiZW5jcnlwdGlvbnx2ZXJpZmljYXRpb258aW5jb21pbmdfc2FzX2RpYWxvZ193YWl0aW5nXCIpfTwvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyUGhhc2VWZXJpZmllZCgpOiBSZWFjdE5vZGUge1xuICAgICAgICByZXR1cm4gPFZlcmlmaWNhdGlvbkNvbXBsZXRlIG9uRG9uZT17dGhpcy5vblZlcmlmaWVkRG9uZUNsaWNrfSAvPjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlclBoYXNlQ2FuY2VsbGVkKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIHJldHVybiA8VmVyaWZpY2F0aW9uQ2FuY2VsbGVkIG9uRG9uZT17dGhpcy5vbkNhbmNlbENsaWNrfSAvPjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0Tm9kZSB7XG4gICAgICAgIGxldCBib2R5O1xuICAgICAgICBzd2l0Y2ggKHRoaXMuc3RhdGUucGhhc2UpIHtcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfU1RBUlQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VTdGFydCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSEFTRV9TSE9XX1NBUzpcbiAgICAgICAgICAgICAgICBib2R5ID0gdGhpcy5yZW5kZXJQaGFzZVNob3dTYXMoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfV0FJVF9GT1JfUEFSVE5FUl9UT19DT05GSVJNOlxuICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLnJlbmRlclBoYXNlV2FpdEZvclBhcnRuZXJUb0NvbmZpcm0oKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUEhBU0VfVkVSSUZJRUQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VWZXJpZmllZCgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQSEFTRV9DQU5DRUxMRUQ6XG4gICAgICAgICAgICAgICAgYm9keSA9IHRoaXMucmVuZGVyUGhhc2VDYW5jZWxsZWQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImVuY3J5cHRpb258dmVyaWZpY2F0aW9ufGluY29taW5nX3Nhc19kaWFsb2dfdGl0bGVcIil9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIGZpeGVkV2lkdGg9e2ZhbHNlfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHtib2R5fVxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxVQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFFQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLE1BQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLHFCQUFBLEdBQUFQLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTyxzQkFBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsUUFBQSxHQUFBVixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVUsb0JBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVosc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFZLGNBQUEsR0FBQWIsc0JBQUEsQ0FBQUMsT0FBQTtBQXBCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBaUJBLE1BQU1hLFdBQVcsR0FBRyxDQUFDO0FBQ3JCLE1BQU1DLGNBQWMsR0FBRyxDQUFDO0FBQ3hCLE1BQU1D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