matrix-react-sdk
Version:
SDK for matrix.org using React
168 lines (165 loc) • 24.7 kB
JavaScript
"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 _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientPeg = require("../../../../MatrixClientPeg");
var _languageHandler = require("../../../../languageHandler");
var _Modal = _interopRequireDefault(require("../../../../Modal"));
var _InteractiveAuthEntryComponents = require("../../auth/InteractiveAuthEntryComponents");
var _DialogButtons = _interopRequireDefault(require("../../elements/DialogButtons"));
var _BaseDialog = _interopRequireDefault(require("../BaseDialog"));
var _Spinner = _interopRequireDefault(require("../../elements/Spinner"));
var _InteractiveAuthDialog = _interopRequireDefault(require("../InteractiveAuthDialog"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2019, 2020 The Matrix.org Foundation C.I.C.
Copyright 2018, 2019 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.
*/
/*
* Walks the user through the process of creating a cross-signing keys. In most
* cases, only a spinner is shown, but for more complex auth like SSO, the user
* may need to complete some steps to proceed.
*/
class CreateCrossSigningDialog extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "doBootstrapUIAuth", async makeRequest => {
if (this.state.canUploadKeysWithPasswordOnly && this.state.accountPassword) {
await makeRequest({
type: "m.login.password",
identifier: {
type: "m.id.user",
user: _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId()
},
password: this.state.accountPassword
});
} else if (this.props.tokenLogin) {
// We are hoping the grace period is active
await makeRequest({});
} else {
const dialogAesthetics = {
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_PREAUTH]: {
title: (0, _languageHandler._t)("auth|uia|sso_title"),
body: (0, _languageHandler._t)("auth|uia|sso_preauth_body"),
continueText: (0, _languageHandler._t)("auth|sso"),
continueKind: "primary"
},
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: {
title: (0, _languageHandler._t)("encryption|confirm_encryption_setup_title"),
body: (0, _languageHandler._t)("encryption|confirm_encryption_setup_body"),
continueText: (0, _languageHandler._t)("action|confirm"),
continueKind: "primary"
}
};
const {
finished
} = _Modal.default.createDialog(_InteractiveAuthDialog.default, {
title: (0, _languageHandler._t)("encryption|bootstrap_title"),
matrixClient: _MatrixClientPeg.MatrixClientPeg.safeGet(),
makeRequest,
aestheticsForStagePhases: {
[_InteractiveAuthEntryComponents.SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics,
[_InteractiveAuthEntryComponents.SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics
}
});
const [confirmed] = await finished;
if (!confirmed) {
throw new Error("Cross-signing key upload auth canceled");
}
}
});
(0, _defineProperty2.default)(this, "bootstrapCrossSigning", async () => {
this.setState({
error: false
});
try {
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
await cli.bootstrapCrossSigning({
authUploadDeviceSigningKeys: this.doBootstrapUIAuth
});
this.props.onFinished(true);
} catch (e) {
if (this.props.tokenLogin) {
// ignore any failures, we are relying on grace period here
this.props.onFinished(false);
return;
}
this.setState({
error: true
});
_logger.logger.error("Error bootstrapping cross-signing", e);
}
});
(0, _defineProperty2.default)(this, "onCancel", () => {
this.props.onFinished(false);
});
this.state = {
error: false,
// Does the server offer a UI auth flow with just m.login.password
// for /keys/device_signing/upload?
// If we have an account password in memory, let's simplify and
// assume it means password auth is also supported for device
// signing key upload as well. This avoids hitting the server to
// test auth flows, which may be slow under high load.
canUploadKeysWithPasswordOnly: props.accountPassword ? true : null,
accountPassword: props.accountPassword || ""
};
if (!this.state.accountPassword) {
this.queryKeyUploadAuth();
}
}
componentDidMount() {
this.bootstrapCrossSigning();
}
async queryKeyUploadAuth() {
try {
await _MatrixClientPeg.MatrixClientPeg.safeGet().uploadDeviceSigningKeys(undefined, {});
// We should never get here: the server should always require
// UI auth to upload device signing keys. If we do, we upload
// no keys which would be a no-op.
_logger.logger.log("uploadDeviceSigningKeys unexpectedly succeeded without UI auth!");
} catch (error) {
if (!(error instanceof _matrix.MatrixError) || !error.data || !error.data.flows) {
_logger.logger.log("uploadDeviceSigningKeys advertised no flows!");
return;
}
const canUploadKeysWithPasswordOnly = error.data.flows.some(f => {
return f.stages.length === 1 && f.stages[0] === "m.login.password";
});
this.setState({
canUploadKeysWithPasswordOnly
});
}
}
render() {
let content;
if (this.state.error) {
content = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("encryption|unable_to_setup_keys_error")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_buttons"
}, /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|retry"),
onPrimaryButtonClick: this.bootstrapCrossSigning,
onCancel: this.onCancel
})));
} else {
content = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_Spinner.default, null));
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_CreateCrossSigningDialog",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("encryption|bootstrap_title"),
hasCancel: false,
fixedWidth: false
}, /*#__PURE__*/_react.default.createElement("div", null, content));
}
}
exports.default = CreateCrossSigningDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbG9nZ2VyIiwiX01hdHJpeENsaWVudFBlZyIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTW9kYWwiLCJfSW50ZXJhY3RpdmVBdXRoRW50cnlDb21wb25lbnRzIiwiX0RpYWxvZ0J1dHRvbnMiLCJfQmFzZURpYWxvZyIsIl9TcGlubmVyIiwiX0ludGVyYWN0aXZlQXV0aERpYWxvZyIsIkNyZWF0ZUNyb3NzU2lnbmluZ0RpYWxvZyIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIm1ha2VSZXF1ZXN0Iiwic3RhdGUiLCJjYW5VcGxvYWRLZXlzV2l0aFBhc3N3b3JkT25seSIsImFjY291bnRQYXNzd29yZCIsInR5cGUiLCJpZGVudGlmaWVyIiwidXNlciIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRVc2VySWQiLCJwYXNzd29yZCIsInRva2VuTG9naW4iLCJkaWFsb2dBZXN0aGV0aWNzIiwiU1NPQXV0aEVudHJ5IiwiUEhBU0VfUFJFQVVUSCIsInRpdGxlIiwiX3QiLCJib2R5IiwiY29udGludWVUZXh0IiwiY29udGludWVLaW5kIiwiUEhBU0VfUE9TVEFVVEgiLCJmaW5pc2hlZCIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiSW50ZXJhY3RpdmVBdXRoRGlhbG9nIiwibWF0cml4Q2xpZW50IiwiYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzIiwiTE9HSU5fVFlQRSIsIlVOU1RBQkxFX0xPR0lOX1RZUEUiLCJjb25maXJtZWQiLCJFcnJvciIsInNldFN0YXRlIiwiZXJyb3IiLCJjbGkiLCJib290c3RyYXBDcm9zc1NpZ25pbmciLCJhdXRoVXBsb2FkRGV2aWNlU2lnbmluZ0tleXMiLCJkb0Jvb3RzdHJhcFVJQXV0aCIsIm9uRmluaXNoZWQiLCJlIiwibG9nZ2VyIiwicXVlcnlLZXlVcGxvYWRBdXRoIiwiY29tcG9uZW50RGlkTW91bnQiLCJ1cGxvYWREZXZpY2VTaWduaW5nS2V5cyIsInVuZGVmaW5lZCIsImxvZyIsIk1hdHJpeEVycm9yIiwiZGF0YSIsImZsb3dzIiwic29tZSIsImYiLCJzdGFnZXMiLCJsZW5ndGgiLCJyZW5kZXIiLCJjb250ZW50IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsInByaW1hcnlCdXR0b24iLCJvblByaW1hcnlCdXR0b25DbGljayIsIm9uQ2FuY2VsIiwiaGFzQ2FuY2VsIiwiZml4ZWRXaWR0aCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL3NlY3VyaXR5L0NyZWF0ZUNyb3NzU2lnbmluZ0RpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTksIDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cbkNvcHlyaWdodCAyMDE4LCAyMDE5IE5ldyBWZWN0b3IgTHRkXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IENyb3NzU2lnbmluZ0tleXMsIEF1dGhEaWN0LCBNYXRyaXhFcnJvciwgVUlBRmxvdywgVUlBUmVzcG9uc2UgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi8uLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IHsgU1NPQXV0aEVudHJ5IH0gZnJvbSBcIi4uLy4uL2F1dGgvSW50ZXJhY3RpdmVBdXRoRW50cnlDb21wb25lbnRzXCI7XG5pbXBvcnQgRGlhbG9nQnV0dG9ucyBmcm9tIFwiLi4vLi4vZWxlbWVudHMvRGlhbG9nQnV0dG9uc1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi8uLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgSW50ZXJhY3RpdmVBdXRoRGlhbG9nIGZyb20gXCIuLi9JbnRlcmFjdGl2ZUF1dGhEaWFsb2dcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgYWNjb3VudFBhc3N3b3JkPzogc3RyaW5nO1xuICAgIHRva2VuTG9naW4/OiBib29sZWFuO1xuICAgIG9uRmluaXNoZWQ6IChzdWNjZXNzPzogYm9vbGVhbikgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgZXJyb3I6IGJvb2xlYW47XG4gICAgY2FuVXBsb2FkS2V5c1dpdGhQYXNzd29yZE9ubHk6IGJvb2xlYW4gfCBudWxsO1xuICAgIGFjY291bnRQYXNzd29yZDogc3RyaW5nO1xufVxuXG4vKlxuICogV2Fsa3MgdGhlIHVzZXIgdGhyb3VnaCB0aGUgcHJvY2VzcyBvZiBjcmVhdGluZyBhIGNyb3NzLXNpZ25pbmcga2V5cy4gSW4gbW9zdFxuICogY2FzZXMsIG9ubHkgYSBzcGlubmVyIGlzIHNob3duLCBidXQgZm9yIG1vcmUgY29tcGxleCBhdXRoIGxpa2UgU1NPLCB0aGUgdXNlclxuICogbWF5IG5lZWQgdG8gY29tcGxldGUgc29tZSBzdGVwcyB0byBwcm9jZWVkLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDcmVhdGVDcm9zc1NpZ25pbmdEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBlcnJvcjogZmFsc2UsXG4gICAgICAgICAgICAvLyBEb2VzIHRoZSBzZXJ2ZXIgb2ZmZXIgYSBVSSBhdXRoIGZsb3cgd2l0aCBqdXN0IG0ubG9naW4ucGFzc3dvcmRcbiAgICAgICAgICAgIC8vIGZvciAva2V5cy9kZXZpY2Vfc2lnbmluZy91cGxvYWQ/XG4gICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGFuIGFjY291bnQgcGFzc3dvcmQgaW4gbWVtb3J5LCBsZXQncyBzaW1wbGlmeSBhbmRcbiAgICAgICAgICAgIC8vIGFzc3VtZSBpdCBtZWFucyBwYXNzd29yZCBhdXRoIGlzIGFsc28gc3VwcG9ydGVkIGZvciBkZXZpY2VcbiAgICAgICAgICAgIC8vIHNpZ25pbmcga2V5IHVwbG9hZCBhcyB3ZWxsLiBUaGlzIGF2b2lkcyBoaXR0aW5nIHRoZSBzZXJ2ZXIgdG9cbiAgICAgICAgICAgIC8vIHRlc3QgYXV0aCBmbG93cywgd2hpY2ggbWF5IGJlIHNsb3cgdW5kZXIgaGlnaCBsb2FkLlxuICAgICAgICAgICAgY2FuVXBsb2FkS2V5c1dpdGhQYXNzd29yZE9ubHk6IHByb3BzLmFjY291bnRQYXNzd29yZCA/IHRydWUgOiBudWxsLFxuICAgICAgICAgICAgYWNjb3VudFBhc3N3b3JkOiBwcm9wcy5hY2NvdW50UGFzc3dvcmQgfHwgXCJcIixcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoIXRoaXMuc3RhdGUuYWNjb3VudFBhc3N3b3JkKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5S2V5VXBsb2FkQXV0aCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmJvb3RzdHJhcENyb3NzU2lnbmluZygpO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgcXVlcnlLZXlVcGxvYWRBdXRoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS51cGxvYWREZXZpY2VTaWduaW5nS2V5cyh1bmRlZmluZWQsIHt9IGFzIENyb3NzU2lnbmluZ0tleXMpO1xuICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlOiB0aGUgc2VydmVyIHNob3VsZCBhbHdheXMgcmVxdWlyZVxuICAgICAgICAgICAgLy8gVUkgYXV0aCB0byB1cGxvYWQgZGV2aWNlIHNpZ25pbmcga2V5cy4gSWYgd2UgZG8sIHdlIHVwbG9hZFxuICAgICAgICAgICAgLy8gbm8ga2V5cyB3aGljaCB3b3VsZCBiZSBhIG5vLW9wLlxuICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInVwbG9hZERldmljZVNpZ25pbmdLZXlzIHVuZXhwZWN0ZWRseSBzdWNjZWVkZWQgd2l0aG91dCBVSSBhdXRoIVwiKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghKGVycm9yIGluc3RhbmNlb2YgTWF0cml4RXJyb3IpIHx8ICFlcnJvci5kYXRhIHx8ICFlcnJvci5kYXRhLmZsb3dzKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhcInVwbG9hZERldmljZVNpZ25pbmdLZXlzIGFkdmVydGlzZWQgbm8gZmxvd3MhXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGNhblVwbG9hZEtleXNXaXRoUGFzc3dvcmRPbmx5ID0gZXJyb3IuZGF0YS5mbG93cy5zb21lKChmOiBVSUFGbG93KSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGYuc3RhZ2VzLmxlbmd0aCA9PT0gMSAmJiBmLnN0YWdlc1swXSA9PT0gXCJtLmxvZ2luLnBhc3N3b3JkXCI7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgICAgIGNhblVwbG9hZEtleXNXaXRoUGFzc3dvcmRPbmx5LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGRvQm9vdHN0cmFwVUlBdXRoID0gYXN5bmMgKFxuICAgICAgICBtYWtlUmVxdWVzdDogKGF1dGhEYXRhOiBBdXRoRGljdCkgPT4gUHJvbWlzZTxVSUFSZXNwb25zZTx2b2lkPj4sXG4gICAgKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmNhblVwbG9hZEtleXNXaXRoUGFzc3dvcmRPbmx5ICYmIHRoaXMuc3RhdGUuYWNjb3VudFBhc3N3b3JkKSB7XG4gICAgICAgICAgICBhd2FpdCBtYWtlUmVxdWVzdCh7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJtLmxvZ2luLnBhc3N3b3JkXCIsXG4gICAgICAgICAgICAgICAgaWRlbnRpZmllcjoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcIm0uaWQudXNlclwiLFxuICAgICAgICAgICAgICAgICAgICB1c2VyOiBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFzc3dvcmQ6IHRoaXMuc3RhdGUuYWNjb3VudFBhc3N3b3JkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcm9wcy50b2tlbkxvZ2luKSB7XG4gICAgICAgICAgICAvLyBXZSBhcmUgaG9waW5nIHRoZSBncmFjZSBwZXJpb2QgaXMgYWN0aXZlXG4gICAgICAgICAgICBhd2FpdCBtYWtlUmVxdWVzdCh7fSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBkaWFsb2dBZXN0aGV0aWNzID0ge1xuICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuUEhBU0VfUFJFQVVUSF06IHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IF90KFwiYXV0aHx1aWF8c3NvX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBfdChcImF1dGh8dWlhfHNzb19wcmVhdXRoX2JvZHlcIiksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dDogX3QoXCJhdXRofHNzb1wiKSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcInByaW1hcnlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFtTU09BdXRoRW50cnkuUEhBU0VfUE9TVEFVVEhdOiB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImVuY3J5cHRpb258Y29uZmlybV9lbmNyeXB0aW9uX3NldHVwX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICBib2R5OiBfdChcImVuY3J5cHRpb258Y29uZmlybV9lbmNyeXB0aW9uX3NldHVwX2JvZHlcIiksXG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dDogX3QoXCJhY3Rpb258Y29uZmlybVwiKSxcbiAgICAgICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcInByaW1hcnlcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgeyBmaW5pc2hlZCB9ID0gTW9kYWwuY3JlYXRlRGlhbG9nKEludGVyYWN0aXZlQXV0aERpYWxvZywge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcImVuY3J5cHRpb258Ym9vdHN0cmFwX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgIG1hdHJpeENsaWVudDogTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKSxcbiAgICAgICAgICAgICAgICBtYWtlUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBhZXN0aGV0aWNzRm9yU3RhZ2VQaGFzZXM6IHtcbiAgICAgICAgICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5MT0dJTl9UWVBFXTogZGlhbG9nQWVzdGhldGljcyxcbiAgICAgICAgICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5VTlNUQUJMRV9MT0dJTl9UWVBFXTogZGlhbG9nQWVzdGhldGljcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBbY29uZmlybWVkXSA9IGF3YWl0IGZpbmlzaGVkO1xuICAgICAgICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDcm9zcy1zaWduaW5nIGtleSB1cGxvYWQgYXV0aCBjYW5jZWxlZFwiKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGJvb3RzdHJhcENyb3NzU2lnbmluZyA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBlcnJvcjogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICAgICAgYXdhaXQgY2xpLmJvb3RzdHJhcENyb3NzU2lnbmluZyh7XG4gICAgICAgICAgICAgICAgYXV0aFVwbG9hZERldmljZVNpZ25pbmdLZXlzOiB0aGlzLmRvQm9vdHN0cmFwVUlBdXRoLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnRva2VuTG9naW4pIHtcbiAgICAgICAgICAgICAgICAvLyBpZ25vcmUgYW55IGZhaWx1cmVzLCB3ZSBhcmUgcmVseWluZyBvbiBncmFjZSBwZXJpb2QgaGVyZVxuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZChmYWxzZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyb3I6IHRydWUgfSk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJFcnJvciBib290c3RyYXBwaW5nIGNyb3NzLXNpZ25pbmdcIiwgZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnRlbnQgPSAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHA+e190KFwiZW5jcnlwdGlvbnx1bmFibGVfdG9fc2V0dXBfa2V5c19lcnJvclwiKX08L3A+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEaWFsb2dCdXR0b25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJhY3Rpb258cmV0cnlcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e3RoaXMuYm9vdHN0cmFwQ3Jvc3NTaWduaW5nfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2FuY2VsPXt0aGlzLm9uQ2FuY2VsfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8U3Bpbm5lciAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0NyZWF0ZUNyb3NzU2lnbmluZ0RpYWxvZ1wiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImVuY3J5cHRpb258Ym9vdHN0cmFwX3RpdGxlXCIpfVxuICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgZml4ZWRXaWR0aD17ZmFsc2V9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdj57Y29udGVudH08L2Rpdj5cbiAgICAgICAgICAgIDwvQmFzZURpYWxvZz5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBU0EsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsT0FBQSxHQUFBRixPQUFBO0FBRUEsSUFBQUcsZ0JBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLGdCQUFBLEdBQUFKLE9BQUE7QUFDQSxJQUFBSyxNQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSwrQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sY0FBQSxHQUFBUixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVEsV0FBQSxHQUFBVCxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQVMsUUFB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