matrix-react-sdk
Version:
SDK for matrix.org using React
226 lines (191 loc) • 32 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var sdk = _interopRequireWildcard(require("../../../index"));
var _Analytics = _interopRequireDefault(require("../../../Analytics"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var Lifecycle = _interopRequireWildcard(require("../../../Lifecycle"));
var _languageHandler = require("../../../languageHandler");
var _InteractiveAuth = _interopRequireWildcard(require("../../structures/InteractiveAuth"));
var _InteractiveAuthEntryComponents = require("../auth/InteractiveAuthEntryComponents");
var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _temp;
let DeactivateAccountDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.DeactivateAccountDialog"), _dec(_class = (_temp = class DeactivateAccountDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "_onStagePhaseChange", (stage, phase) => {
const dialogAesthetics = {
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_PREAUTH]: {
body: (0, _languageHandler._t)("Confirm your account deactivation by using Single Sign On to prove your identity."),
continueText: (0, _languageHandler._t)("Single Sign On"),
continueKind: "danger"
},
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: {
body: (0, _languageHandler._t)("Are you sure you want to deactivate your account? This is irreversible."),
continueText: (0, _languageHandler._t)("Confirm account deactivation"),
continueKind: "danger"
}
}; // This is the same as aestheticsForStagePhases in InteractiveAuthDialog minus the `title`
const DEACTIVATE_AESTHETICS = {
[_InteractiveAuthEntryComponents.SSOAuthEntry.LOGIN_TYPE]: dialogAesthetics,
[_InteractiveAuthEntryComponents.SSOAuthEntry.UNSTABLE_LOGIN_TYPE]: dialogAesthetics,
[_InteractiveAuthEntryComponents.PasswordAuthEntry.LOGIN_TYPE]: {
[_InteractiveAuthEntryComponents.DEFAULT_PHASE]: {
body: (0, _languageHandler._t)("To continue, please enter your password:")
}
}
};
const aesthetics = DEACTIVATE_AESTHETICS[stage];
let bodyText = null;
let continueText = null;
let continueKind = null;
if (aesthetics) {
const phaseAesthetics = aesthetics[phase];
if (phaseAesthetics && phaseAesthetics.body) bodyText = phaseAesthetics.body;
if (phaseAesthetics && phaseAesthetics.continueText) continueText = phaseAesthetics.continueText;
if (phaseAesthetics && phaseAesthetics.continueKind) continueKind = phaseAesthetics.continueKind;
}
this.setState({
bodyText,
continueText,
continueKind
});
});
(0, _defineProperty2.default)(this, "_onUIAuthFinished", (success, result, extra) => {
if (success) return; // great! makeRequest() will be called too.
if (result === _InteractiveAuth.ERROR_USER_CANCELLED) {
this._onCancel();
return;
}
console.error("Error during UI Auth:", {
result,
extra
});
this.setState({
errStr: (0, _languageHandler._t)("There was a problem communicating with the server. Please try again.")
});
});
(0, _defineProperty2.default)(this, "_onUIAuthComplete", auth => {
_MatrixClientPeg.MatrixClientPeg.get().deactivateAccount(auth, this.state.shouldErase).then(r => {
// Deactivation worked - logout & close this dialog
_Analytics.default.trackEvent('Account', 'Deactivate Account');
Lifecycle.onLoggedOut();
this.props.onFinished(true);
}).catch(e => {
console.error(e);
this.setState({
errStr: (0, _languageHandler._t)("There was a problem communicating with the server. Please try again.")
});
});
});
(0, _defineProperty2.default)(this, "_onEraseFieldChange", ev => {
this.setState({
shouldErase: ev.target.checked,
// Disable the auth form because we're going to have to reinitialize the auth
// information. We do this because we can't modify the parameters in the UIA
// session, and the user will have selected something which changes the request.
// Therefore, we throw away the last auth session and try a new one.
authEnabled: false
}); // As mentioned above, set up for auth again to get updated UIA session info
this._initAuth(
/* shouldErase= */
ev.target.checked);
});
this.state = {
shouldErase: false,
errStr: null,
authData: null,
// for UIA
authEnabled: true,
// see usages for information
// A few strings that are passed to InteractiveAuth for design or are displayed
// next to the InteractiveAuth component.
bodyText: null,
continueText: null,
continueKind: null
};
this._initAuth(
/* shouldErase= */
false);
}
_onCancel() {
this.props.onFinished(false);
}
_initAuth(shouldErase) {
_MatrixClientPeg.MatrixClientPeg.get().deactivateAccount(null, shouldErase).then(r => {
// If we got here, oops. The server didn't require any auth.
// Our application lifecycle will catch the error and do the logout bits.
// We'll try to log something in an vain attempt to record what happened (storage
// is also obliterated on logout).
console.warn("User's account got deactivated without confirmation: Server had no auth");
this.setState({
errStr: (0, _languageHandler._t)("Server did not require any authentication")
});
}).catch(e => {
if (e && e.httpStatus === 401 && e.data) {
// Valid UIA response
this.setState({
authData: e.data,
authEnabled: true
});
} else {
this.setState({
errStr: (0, _languageHandler._t)("Server did not return valid authentication information.")
});
}
});
}
render() {
const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog');
let error = null;
if (this.state.errStr) {
error = /*#__PURE__*/_react.default.createElement("div", {
className: "error"
}, this.state.errStr);
}
let auth = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("Loading..."));
if (this.state.authData && this.state.authEnabled) {
auth = /*#__PURE__*/_react.default.createElement("div", null, this.state.bodyText, /*#__PURE__*/_react.default.createElement(_InteractiveAuth.default, {
matrixClient: _MatrixClientPeg.MatrixClientPeg.get(),
authData: this.state.authData,
makeRequest: this._onUIAuthComplete,
onAuthFinished: this._onUIAuthFinished,
onStagePhaseChange: this._onStagePhaseChange,
continueText: this.state.continueText,
continueKind: this.state.continueKind
}));
} // this is on purpose not a <form /> to prevent Enter triggering submission, to further prevent accidents
return /*#__PURE__*/_react.default.createElement(BaseDialog, {
className: "mx_DeactivateAccountDialog",
onFinished: this.props.onFinished,
titleClass: "danger",
title: (0, _languageHandler._t)("Deactivate Account")
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("This will make your account permanently unusable. " + "You will not be able to log in, and no one will be able to re-register the same " + "user ID. " + "This will cause your account to leave all rooms it is participating in, and it " + "will remove your account details from your identity server. " + "<b>This action is irreversible.</b>", {}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, " ", sub, " ")
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Deactivating your account <b>does not by default cause us to forget messages you " + "have sent.</b> " + "If you would like us to forget your messages, please tick the box below.", {}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, " ", sub, " ")
})), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("Message visibility in Matrix is similar to email. " + "Our forgetting your messages means that messages you have sent will not be shared " + "with any new or unregistered users, but registered users who already have access " + "to these messages will still have access to their copy.")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_DeactivateAccountDialog_input_section"
}, /*#__PURE__*/_react.default.createElement("p", null, /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
checked: this.state.shouldErase,
onChange: this._onEraseFieldChange
}, (0, _languageHandler._t)("Please forget all messages I have sent when my account is deactivated " + "(<b>Warning:</b> this will cause future users to see an incomplete view " + "of conversations)", {}, {
b: sub => /*#__PURE__*/_react.default.createElement("b", null, sub)
}))), error, auth)));
}
}, _temp)) || _class);
exports.default = DeactivateAccountDialog;
DeactivateAccountDialog.propTypes = {
onFinished: _propTypes.default.func.isRequired
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvRGVhY3RpdmF0ZUFjY291bnREaWFsb2cuanMiXSwibmFtZXMiOlsiRGVhY3RpdmF0ZUFjY291bnREaWFsb2ciLCJSZWFjdCIsIkNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJzdGFnZSIsInBoYXNlIiwiZGlhbG9nQWVzdGhldGljcyIsIlNTT0F1dGhFbnRyeSIsIlBIQVNFX1BSRUFVVEgiLCJib2R5IiwiY29udGludWVUZXh0IiwiY29udGludWVLaW5kIiwiUEhBU0VfUE9TVEFVVEgiLCJERUFDVElWQVRFX0FFU1RIRVRJQ1MiLCJMT0dJTl9UWVBFIiwiVU5TVEFCTEVfTE9HSU5fVFlQRSIsIlBhc3N3b3JkQXV0aEVudHJ5IiwiREVGQVVMVF9QSEFTRSIsImFlc3RoZXRpY3MiLCJib2R5VGV4dCIsInBoYXNlQWVzdGhldGljcyIsInNldFN0YXRlIiwic3VjY2VzcyIsInJlc3VsdCIsImV4dHJhIiwiRVJST1JfVVNFUl9DQU5DRUxMRUQiLCJfb25DYW5jZWwiLCJjb25zb2xlIiwiZXJyb3IiLCJlcnJTdHIiLCJhdXRoIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZGVhY3RpdmF0ZUFjY291bnQiLCJzdGF0ZSIsInNob3VsZEVyYXNlIiwidGhlbiIsInIiLCJBbmFseXRpY3MiLCJ0cmFja0V2ZW50IiwiTGlmZWN5Y2xlIiwib25Mb2dnZWRPdXQiLCJvbkZpbmlzaGVkIiwiY2F0Y2giLCJlIiwiZXYiLCJ0YXJnZXQiLCJjaGVja2VkIiwiYXV0aEVuYWJsZWQiLCJfaW5pdEF1dGgiLCJhdXRoRGF0YSIsIndhcm4iLCJodHRwU3RhdHVzIiwiZGF0YSIsInJlbmRlciIsIkJhc2VEaWFsb2ciLCJzZGsiLCJnZXRDb21wb25lbnQiLCJfb25VSUF1dGhDb21wbGV0ZSIsIl9vblVJQXV0aEZpbmlzaGVkIiwiX29uU3RhZ2VQaGFzZUNoYW5nZSIsImIiLCJzdWIiLCJfb25FcmFz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QUpDLENBQUwsQ0FwQkosZUEyQkk7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLG9CQUNJLHFEQUNJLDZCQUFDLHVCQUFEO0FBQ0ksTUFBQSxPQUFPLEVBQUUsS0FBSzVCLEtBQUwsQ0FBV0MsV0FEeEI7QUFFSSxNQUFBLFFBQVEsRUFBRSxLQUFLNEI7QUFGbkIsT0FJSyx5QkFDRywyRUFDQSwwRUFEQSxHQUVBLG1CQUhILEVBSUcsRUFKSCxFQUtHO0FBQUVGLE1BQUFBLENBQUMsRUFBR0MsR0FBRCxpQkFBUyx3Q0FBS0EsR0FBTDtBQUFkLEtBTEgsQ0FKTCxDQURKLENBREosRUFnQktsQyxLQWhCTCxFQWlCS0UsSUFqQkwsQ0EzQkosQ0FMSixDQURKO0FBd0RIOztBQTVNZ0UsQzs7QUErTXJFL0IsdUJBQXVCLENBQUNpRSxTQUF4QixHQUFvQztBQUNoQ3RCLEVBQUFBLFVBQVUsRUFBRXVCLG1CQUFVQyxJQUFWLENBQWVDO0FBREssQ0FBcEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMTYgT3Blbk1hcmtldCBMdGRcbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5cbmltcG9ydCAqIGFzIHNkayBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgQW5hbHl0aWNzIGZyb20gJy4uLy4uLy4uL0FuYWx5dGljcyc7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSAnLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnJztcbmltcG9ydCAqIGFzIExpZmVjeWNsZSBmcm9tICcuLi8uLi8uLi9MaWZlY3ljbGUnO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0IEludGVyYWN0aXZlQXV0aCwge0VSUk9SX1VTRVJfQ0FOQ0VMTEVEfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9JbnRlcmFjdGl2ZUF1dGhcIjtcbmltcG9ydCB7REVGQVVMVF9QSEFTRSwgUGFzc3dvcmRBdXRoRW50cnksIFNTT0F1dGhFbnRyeX0gZnJvbSBcIi4uL2F1dGgvSW50ZXJhY3RpdmVBdXRoRW50cnlDb21wb25lbnRzXCI7XG5pbXBvcnQgU3R5bGVkQ2hlY2tib3ggZnJvbSBcIi4uL2VsZW1lbnRzL1N0eWxlZENoZWNrYm94XCI7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuQHJlcGxhY2VhYmxlQ29tcG9uZW50KFwidmlld3MuZGlhbG9ncy5EZWFjdGl2YXRlQWNjb3VudERpYWxvZ1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVhY3RpdmF0ZUFjY291bnREaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQge1xuICAgIGNvbnN0cnVjdG9yKHByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgc2hvdWxkRXJhc2U6IGZhbHNlLFxuICAgICAgICAgICAgZXJyU3RyOiBudWxsLFxuICAgICAgICAgICAgYXV0aERhdGE6IG51bGwsIC8vIGZvciBVSUFcbiAgICAgICAgICAgIGF1dGhFbmFibGVkOiB0cnVlLCAvLyBzZWUgdXNhZ2VzIGZvciBpbmZvcm1hdGlvblxuXG4gICAgICAgICAgICAvLyBBIGZldyBzdHJpbmdzIHRoYXQgYXJlIHBhc3NlZCB0byBJbnRlcmFjdGl2ZUF1dGggZm9yIGRlc2lnbiBvciBhcmUgZGlzcGxheWVkXG4gICAgICAgICAgICAvLyBuZXh0IHRvIHRoZSBJbnRlcmFjdGl2ZUF1dGggY29tcG9uZW50LlxuICAgICAgICAgICAgYm9keVRleHQ6IG51bGwsXG4gICAgICAgICAgICBjb250aW51ZVRleHQ6IG51bGwsXG4gICAgICAgICAgICBjb250aW51ZUtpbmQ6IG51bGwsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5faW5pdEF1dGgoLyogc2hvdWxkRXJhc2U9ICovZmFsc2UpO1xuICAgIH1cblxuICAgIF9vblN0YWdlUGhhc2VDaGFuZ2UgPSAoc3RhZ2UsIHBoYXNlKSA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0Flc3RoZXRpY3MgPSB7XG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BSRUFVVEhdOiB7XG4gICAgICAgICAgICAgICAgYm9keTogX3QoXCJDb25maXJtIHlvdXIgYWNjb3VudCBkZWFjdGl2YXRpb24gYnkgdXNpbmcgU2luZ2xlIFNpZ24gT24gdG8gcHJvdmUgeW91ciBpZGVudGl0eS5cIiksXG4gICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIlNpbmdsZSBTaWduIE9uXCIpLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlS2luZDogXCJkYW5nZXJcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BPU1RBVVRIXToge1xuICAgICAgICAgICAgICAgIGJvZHk6IF90KFwiQXJlIHlvdSBzdXJlIHlvdSB3YW50IHRvIGRlYWN0aXZhdGUgeW91ciBhY2NvdW50PyBUaGlzIGlzIGlycmV2ZXJzaWJsZS5cIiksXG4gICAgICAgICAgICAgICAgY29udGludWVUZXh0OiBfdChcIkNvbmZpcm0gYWNjb3VudCBkZWFjdGl2YXRpb25cIiksXG4gICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcImRhbmdlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIGFlc3RoZXRpY3NGb3JTdGFnZVBoYXNlcyBpbiBJbnRlcmFjdGl2ZUF1dGhEaWFsb2cgbWludXMgdGhlIGB0aXRsZWBcbiAgICAgICAgY29uc3QgREVBQ1RJVkFURV9BRVNUSEVUSUNTID0ge1xuICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5MT0dJTl9UWVBFXTogZGlhbG9nQWVzdGhldGljcyxcbiAgICAgICAgICAgIFtTU09BdXRoRW50cnkuVU5TVEFCTEVfTE9HSU5fVFlQRV06IGRpYWxvZ0Flc3RoZXRpY3MsXG4gICAgICAgICAgICBbUGFzc3dvcmRBdXRoRW50cnkuTE9HSU5fVFlQRV06IHtcbiAgICAgICAgICAgICAgICBbREVGQVVMVF9QSEFTRV06IHtcbiAgICAgICAgICAgICAgICAgICAgYm9keTogX3QoXCJUbyBjb250aW51ZSwgcGxlYXNlIGVudGVyIHlvdXIgcGFzc3dvcmQ6XCIpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGFlc3RoZXRpY3MgPSBERUFDVElWQVRFX0FFU1RIRVRJQ1Nbc3RhZ2VdO1xuICAgICAgICBsZXQgYm9keVRleHQgPSBudWxsO1xuICAgICAgICBsZXQgY29udGludWVUZXh0ID0gbnVsbDtcbiAgICAgICAgbGV0IGNvbnRpbnVlS2luZCA9IG51bGw7XG4gICAgICAgIGlmIChhZXN0aGV0aWNzKSB7XG4gICAgICAgICAgICBjb25zdCBwaGFzZUFlc3RoZXRpY3MgPSBhZXN0aGV0aWNzW3BoYXNlXTtcbiAgICAgICAgICAgIGlmIChwaGFzZUFlc3RoZXRpY3MgJiYgcGhhc2VBZXN0aGV0aWNzLmJvZHkpIGJvZHlUZXh0ID0gcGhhc2VBZXN0aGV0aWNzLmJvZHk7XG4gICAgICAgICAgICBpZiAocGhhc2VBZXN0aGV0aWNzICYmIHBoYXNlQWVzdGhldGljcy5jb250aW51ZVRleHQpIGNvbnRpbnVlVGV4dCA9IHBoYXNlQWVzdGhldGljcy5jb250aW51ZVRleHQ7XG4gICAgICAgICAgICBpZiAocGhhc2VBZXN0aGV0aWNzICYmIHBoYXNlQWVzdGhldGljcy5jb250aW51ZUtpbmQpIGNvbnRpbnVlS2luZCA9IHBoYXNlQWVzdGhldGljcy5jb250aW51ZUtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7Ym9keVRleHQsIGNvbnRpbnVlVGV4dCwgY29udGludWVLaW5kfSk7XG4gICAgfTtcblxuICAgIF9vblVJQXV0aEZpbmlzaGVkID0gKHN1Y2Nlc3MsIHJlc3VsdCwgZXh0cmEpID0+IHtcbiAgICAgICAgaWYgKHN1Y2Nlc3MpIHJldHVybjsgLy8gZ3JlYXQhIG1ha2VSZXF1ZXN0KCkgd2lsbCBiZSBjYWxsZWQgdG9vLlxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IEVSUk9SX1VTRVJfQ0FOQ0VMTEVEKSB7XG4gICAgICAgICAgICB0aGlzLl9vbkNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc29sZS5lcnJvcihcIkVycm9yIGR1cmluZyBVSSBBdXRoOlwiLCB7cmVzdWx0LCBleHRyYX0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtlcnJTdHI6IF90KFwiVGhlcmUgd2FzIGEgcHJvYmxlbSBjb21tdW5pY2F0aW5nIHdpdGggdGhlIHNlcnZlci4gUGxlYXNlIHRyeSBhZ2Fpbi5cIil9KTtcbiAgICB9O1xuXG4gICAgX29uVUlBdXRoQ29tcGxldGUgPSAoYXV0aCkgPT4ge1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZGVhY3RpdmF0ZUFjY291bnQoYXV0aCwgdGhpcy5zdGF0ZS5zaG91bGRFcmFzZSkudGhlbihyID0+IHtcbiAgICAgICAgICAgIC8vIERlYWN0aXZhdGlvbiB3b3JrZWQgLSBsb2dvdXQgJiBjbG9zZSB0aGlzIGRpYWxvZ1xuICAgICAgICAgICAgQW5hbHl0aWNzLnRyYWNrRXZlbnQoJ0FjY291bnQnLCAnRGVhY3RpdmF0ZSBBY2NvdW50Jyk7XG4gICAgICAgICAgICBMaWZlY3ljbGUub25Mb2dnZWRPdXQoKTtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZCh0cnVlKTtcbiAgICAgICAgfSkuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZXJyU3RyOiBfdChcIlRoZXJlIHdhcyBhIHByb2JsZW0gY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzZXJ2ZXIuIFBsZWFzZSB0cnkgYWdhaW4uXCIpfSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfb25FcmFzZUZpZWxkQ2hhbmdlID0gKGV2KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc2hvdWxkRXJhc2U6IGV2LnRhcmdldC5jaGVja2VkLFxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBhdXRoIGZvcm0gYmVjYXVzZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYXV0aFxuICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFVJQVxuICAgICAgICAgICAgLy8gc2Vzc2lvbiwgYW5kIHRoZSB1c2VyIHdpbGwgaGF2ZSBzZWxlY3RlZCBzb21ldGhpbmcgd2hpY2ggY2hhbmdlcyB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgdGhyb3cgYXdheSB0aGUgbGFzdCBhdXRoIHNlc3Npb24gYW5kIHRyeSBhIG5ldyBvbmUuXG4gICAgICAgICAgICBhdXRoRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzIG1lbnRpb25lZCBhYm92ZSwgc2V0IHVwIGZvciBhdXRoIGFnYWluIHRvIGdldCB1cGRhdGVkIFVJQSBzZXNzaW9uIGluZm9cbiAgICAgICAgdGhpcy5faW5pdEF1dGgoLyogc2hvdWxkRXJhc2U9ICovZXYudGFyZ2V0LmNoZWNrZWQpO1xuICAgIH07XG5cbiAgICBfb25DYW5jZWwoKSB7XG4gICAgICAgIHRoaXMucHJvcHMub25GaW5pc2hlZChmYWxzZSk7XG4gICAgfVxuXG4gICAgX2luaXRBdXRoKHNob3VsZEVyYXNlKSB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5kZWFjdGl2YXRlQWNjb3VudChudWxsLCBzaG91bGRFcmFzZSkudGhlbihyID0+IHtcbiAgICAgICAgICAgIC8vIElmIHdlIGdvdCBoZXJlLCBvb3BzLiBUaGUgc2VydmVyIGRpZG4ndCByZXF1aXJlIGFueSBhdXRoLlxuICAgICAgICAgICAgLy8gT3VyIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSB3aWxsIGNhdGNoIHRoZSBlcnJvciBhbmQgZG8gdGhlIGxvZ291dCBiaXRzLlxuICAgICAgICAgICAgLy8gV2UnbGwgdHJ5IHRvIGxvZyBzb21ldGhpbmcgaW4gYW4gdmFpbiBhdHRlbXB0IHRvIHJlY29yZCB3aGF0IGhhcHBlbmVkIChzdG9yYWdlXG4gICAgICAgICAgICAvLyBpcyBhbHNvIG9ibGl0ZXJhdGVkIG9uIGxvZ291dCkuXG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXCJVc2VyJ3MgYWNjb3VudCBnb3QgZGVhY3RpdmF0ZWQgd2l0aG91dCBjb25maXJtYXRpb246IFNlcnZlciBoYWQgbm8gYXV0aFwiKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2VyclN0cjogX3QoXCJTZXJ2ZXIgZGlkIG5vdCByZXF1aXJlIGFueSBhdXRoZW50aWNhdGlvblwiKX0pO1xuICAgICAgICB9KS5jYXRjaChlID0+IHtcbiAgICAgICAgICAgIGlmIChlICYmIGUuaHR0cFN0YXR1cyA9PT0gNDAxICYmIGUuZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFZhbGlkIFVJQSByZXNwb25zZVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2F1dGhEYXRhOiBlLmRhdGEsIGF1dGhFbmFibGVkOiB0cnVlfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2VyclN0cjogX3QoXCJTZXJ2ZXIgZGlkIG5vdCByZXR1cm4gdmFsaWQgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24uXCIpfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgQmFzZURpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoJ3ZpZXdzLmRpYWxvZ3MuQmFzZURpYWxvZycpO1xuXG4gICAgICAgIGxldCBlcnJvciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmVyclN0cikge1xuICAgICAgICAgICAgZXJyb3IgPSA8ZGl2IGNsYXNzTmFtZT1cImVycm9yXCI+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnN0YXRlLmVyclN0ciB9XG4gICAgICAgICAgICA8L2Rpdj47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXV0aCA9IDxkaXY+e190KFwiTG9hZGluZy4uLlwiKX08L2Rpdj47XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmF1dGhEYXRhICYmIHRoaXMuc3RhdGUuYXV0aEVuYWJsZWQpIHtcbiAgICAgICAgICAgIGF1dGggPSAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAge3RoaXMuc3RhdGUuYm9keVRleHR9XG4gICAgICAgICAgICAgICAgICAgIDxJbnRlcmFjdGl2ZUF1dGhcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdHJpeENsaWVudD17TWF0cml4Q2xpZW50UGVnLmdldCgpfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0aERhdGE9e3RoaXMuc3RhdGUuYXV0aERhdGF9XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWtlUmVxdWVzdD17dGhpcy5fb25VSUF1dGhDb21wbGV0ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQXV0aEZpbmlzaGVkPXt0aGlzLl9vblVJQXV0aEZpbmlzaGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFnZVBoYXNlQ2hhbmdlPXt0aGlzLl9vblN0YWdlUGhhc2VDaGFuZ2V9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZVRleHQ9e3RoaXMuc3RhdGUuY29udGludWVUZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWVLaW5kPXt0aGlzLnN0YXRlLmNvbnRpbnVlS2luZH1cbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0aGlzIGlzIG9uIHB1cnBvc2Ugbm90IGEgPGZvcm0gLz4gdG8gcHJldmVudCBFbnRlciB0cmlnZ2VyaW5nIHN1Ym1pc3Npb24sIHRvIGZ1cnRoZXIgcHJldmVudCBhY2NpZGVudHNcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nIGNsYXNzTmFtZT1cIm14X0RlYWN0aXZhdGVBY2NvdW50RGlhbG9nXCJcbiAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXt0aGlzLnByb3BzLm9uRmluaXNoZWR9XG4gICAgICAgICAgICAgICAgdGl0bGVDbGFzcz1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwiRGVhY3RpdmF0ZSBBY2NvdW50XCIpfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2NvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHA+eyBfdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiVGhpcyB3aWxsIG1ha2UgeW91ciBhY2NvdW50IHBlcm1hbmVudGx5IHVudXNhYmxlLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIllvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIGxvZyBpbiwgYW5kIG5vIG9uZSB3aWxsIGJlIGFibGUgdG8gcmUtcmVnaXN0ZXIgdGhlIHNhbWUgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ1c2VyIElELiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlRoaXMgd2lsbCBjYXVzZSB5b3VyIGFjY291bnQgdG8gbGVhdmUgYWxsIHJvb21zIGl0IGlzIHBhcnRpY2lwYXRpbmcgaW4sIGFuZCBpdCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIndpbGwgcmVtb3ZlIHlvdXIgYWNjb3VudCBkZXRhaWxzIGZyb20geW91ciBpZGVudGl0eSBzZXJ2ZXIuIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiPGI+VGhpcyBhY3Rpb24gaXMgaXJyZXZlcnNpYmxlLjwvYj5cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgeyBiOiAoc3ViKSA9PiA8Yj4geyBzdWIgfSA8L2I+IH0sXG4gICAgICAgICAgICAgICAgICAgICkgfTwvcD5cblxuICAgICAgICAgICAgICAgICAgICA8cD57IF90KFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJEZWFjdGl2YXRpbmcgeW91ciBhY2NvdW50IDxiPmRvZXMgbm90IGJ5IGRlZmF1bHQgY2F1c2UgdXMgdG8gZm9yZ2V0IG1lc3NhZ2VzIHlvdSBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcImhhdmUgc2VudC48L2I+IFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiSWYgeW91IHdvdWxkIGxpa2UgdXMgdG8gZm9yZ2V0IHlvdXIgbWVzc2FnZXMsIHBsZWFzZSB0aWNrIHRoZSBib3ggYmVsb3cuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYjogKHN1YikgPT4gPGI+IHsgc3ViIH0gPC9iPiB9LFxuICAgICAgICAgICAgICAgICAgICApIH08L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgPHA+eyBfdChcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiTWVzc2FnZSB2aXNpYmlsaXR5IGluIE1hdHJpeCBpcyBzaW1pbGFyIHRvIGVtYWlsLiBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk91ciBmb3JnZXR0aW5nIHlvdXIgbWVzc2FnZXMgbWVhbnMgdGhhdCBtZXNzYWdlcyB5b3UgaGF2ZSBzZW50IHdpbGwgbm90IGJlIHNoYXJlZCBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICBcIndpdGggYW55IG5ldyBvciB1bnJlZ2lzdGVyZWQgdXNlcnMsIGJ1dCByZWdpc3RlcmVkIHVzZXJzIHdobyBhbHJlYWR5IGhhdmUgYWNjZXNzIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidG8gdGhlc2UgbWVzc2FnZXMgd2lsbCBzdGlsbCBoYXZlIGFjY2VzcyB0byB0aGVpciBjb3B5LlwiLFxuICAgICAgICAgICAgICAgICAgICApIH08L3A+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EZWFjdGl2YXRlQWNjb3VudERpYWxvZ19pbnB1dF9zZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkQ2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17dGhpcy5zdGF0ZS5zaG91bGRFcmFzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMuX29uRXJhc2VGaWVsZENoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiUGxlYXNlIGZvcmdldCBhbGwgbWVzc2FnZXMgSSBoYXZlIHNlbnQgd2hlbiBteSBhY2NvdW50IGlzIGRlYWN0aXZhdGVkIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiKDxiPldhcm5pbmc6PC9iPiB0aGlzIHdpbGwgY2F1c2UgZnV0dXJlIHVzZXJzIHRvIHNlZSBhbiBpbmNvbXBsZXRlIHZpZXcgXCIgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJvZiBjb252ZXJzYXRpb25zKVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGI6IChzdWIpID0+IDxiPnsgc3ViIH08L2I+IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9TdHlsZWRDaGVja2JveD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvcD5cblxuICAgICAgICAgICAgICAgICAgICAgICAge2Vycm9yfVxuICAgICAgICAgICAgICAgICAgICAgICAge2F1dGh9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuXG5EZWFjdGl2YXRlQWNjb3VudERpYWxvZy5wcm9wVHlwZXMgPSB7XG4gICAgb25GaW5pc2hlZDogUHJvcFR5cGVzLmZ1bmMuaXNSZXF1aXJlZCxcbn07XG4iXX0=