matrix-react-sdk
Version:
SDK for matrix.org using React
189 lines (182 loc) • 33.8 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 _logger = require("matrix-js-sdk/src/logger");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _languageHandler = require("../../../languageHandler");
var _InteractiveAuth = _interopRequireWildcard(require("../../structures/InteractiveAuth"));
var _InteractiveAuthEntryComponents = require("../auth/InteractiveAuthEntryComponents");
var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox"));
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
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 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 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)("settings|general|deactivate_confirm_body_sso"),
continueText: (0, _languageHandler._t)("auth|sso"),
continueKind: "danger"
},
[_InteractiveAuthEntryComponents.SSOAuthEntry.PHASE_POSTAUTH]: {
body: (0, _languageHandler._t)("settings|general|deactivate_confirm_body"),
continueText: (0, _languageHandler._t)("settings|general|deactivate_confirm_continue"),
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
};
const aesthetics = DEACTIVATE_AESTHETICS[stage];
let bodyText;
let continueText;
let continueKind;
if (aesthetics) {
const phaseAesthetics = aesthetics[phase];
if (phaseAesthetics) {
if (phaseAesthetics.body) bodyText = phaseAesthetics.body;
if (phaseAesthetics.continueText) continueText = phaseAesthetics.continueText;
if (phaseAesthetics.continueKind) continueKind = phaseAesthetics.continueKind;
}
}
this.setState({
bodyText,
continueText,
continueKind
});
});
(0, _defineProperty2.default)(this, "onUIAuthFinished", async (success, result) => {
if (success) return; // great! makeRequest() will be called too.
if (result === _InteractiveAuth.ERROR_USER_CANCELLED) {
this.onCancel();
return;
}
_logger.logger.error("Error during UI Auth:", {
result
});
this.setState({
errStr: (0, _languageHandler._t)("settings|general|error_deactivate_communication")
});
});
(0, _defineProperty2.default)(this, "onUIAuthComplete", auth => {
// XXX: this should be returning a promise to maintain the state inside the state machine correct
// but given that a deactivation is followed by a local logout and all object instances being thrown away
// this isn't done.
_MatrixClientPeg.MatrixClientPeg.safeGet().deactivateAccount(auth ?? undefined, this.state.shouldErase).then(r => {
// Deactivation worked - logout & close this dialog
_dispatcher.default.fire(_actions.Action.TriggerLogout);
this.props.onFinished(true);
}).catch(e => {
_logger.logger.error(e);
this.setState({
errStr: (0, _languageHandler._t)("settings|general|error_deactivate_communication")
});
});
});
(0, _defineProperty2.default)(this, "onEraseFieldChange", ev => {
this.setState({
shouldErase: ev.currentTarget.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.currentTarget.checked);
});
this.state = {
shouldErase: false,
errStr: null,
authData: null,
// for UIA
authEnabled: true // see usages for information
};
this.initAuth( /* shouldErase= */false);
}
onCancel() {
this.props.onFinished(false);
}
initAuth(shouldErase) {
_MatrixClientPeg.MatrixClientPeg.safeGet().deactivateAccount(undefined, 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).
_logger.logger.warn("User's account got deactivated without confirmation: Server had no auth");
this.setState({
errStr: (0, _languageHandler._t)("settings|general|error_deactivate_no_auth")
});
}).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)("settings|general|error_deactivate_invalid_auth")
});
}
});
}
render() {
let error;
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)("common|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.safeGet(),
authData: this.state.authData
// XXX: onUIAuthComplete breaches the expected method contract, it gets away with it because it
// knows the entire app is about to die as a result of the account deactivation.
,
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.default, {
className: "mx_DeactivateAccountDialog",
onFinished: this.props.onFinished,
titleClass: "danger",
title: (0, _languageHandler._t)("settings|general|deactivate_section"),
screenName: "DeactivateAccount"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content")), /*#__PURE__*/_react.default.createElement("ul", null, /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_1")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_2")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_3")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_4")), /*#__PURE__*/_react.default.createElement("li", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_5"))), /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("settings|general|deactivate_confirm_content_6")), /*#__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)("settings|general|deactivate_confirm_erase_label"))), error, auth)));
}
}
exports.default = DeactivateAccountDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfTWF0cml4Q2xpZW50UGVnIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9JbnRlcmFjdGl2ZUF1dGgiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHMiLCJfU3R5bGVkQ2hlY2tib3giLCJfQmFzZURpYWxvZyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJEZWFjdGl2YXRlQWNjb3VudERpYWxvZyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJzdGFnZSIsInBoYXNlIiwiZGlhbG9nQWVzdGhldGljcyIsIlNTT0F1dGhFbnRyeSIsIlBIQVNFX1BSRUFVVEgiLCJib2R5IiwiX3QiLCJjb250aW51ZVRleHQiLCJjb250aW51ZUtpbmQiLCJQSEFTRV9QT1NUQVVUSCIsIkRFQUNUSVZBVEVfQUVTVEhFVElDUyIsIkxPR0lOX1RZUEUiLCJVTlNUQUJMRV9MT0dJTl9UWVBFIiwiYWVzdGhldGljcyIsImJvZHlUZXh0IiwicGhhc2VBZXN0aGV0aWNzIiwic2V0U3RhdGUiLCJzdWNjZXNzIiwicmVzdWx0IiwiRVJST1JfVVNFUl9DQU5DRUxMRUQiLCJvbkNhbmNlbCIsImxvZ2dlciIsImVycm9yIiwiZXJyU3RyIiwiYXV0aCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJkZWFjdGl2YXRlQWNjb3VudCIsInVuZGVmaW5lZCIsInN0YXRlIiwic2hvdWxkRXJhc2UiLCJ0aGVuIiwiZGVmYXVsdERpc3BhdGNoZXIiLCJmaXJlIiwiQWN0aW9uIiwiVHJpZ2dlckxvZ291dCIsIm9uRmluaXNoZWQiLCJjYXRjaCIsImV2IiwiY3VycmVudFRhcmdldCIsImNoZWNrZWQiLCJhdXRoRW5hYmxlZCIsImluaXRBdXRoIiwiYXV0aERhdGEiLCJ3YXJuIiwiaHR0cFN0YXR1cyIsImRhdGEiLCJyZW5kZXIiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwibWF0cml4Q2xpZW50IiwibWFrZVJlcXVlc3QiLCJvblVJQXV0aENvbXBsZXRlIiwib25BdXRoRmluaXNoZWQiLCJvblVJQXV0aEZpbmlzaGVkIiwib25TdGFnZVBoYXNlQ2hhbmdlIiwidGl0bGVDbGFzcyIsInRpdGxlIiwic2NyZWVuTmFtZSIsIm9uQ2hhbmdlIiwib25FcmFzZUZpZWxkQ2hhbmdlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvRGVhY3RpdmF0ZUFjY291bnREaWFsb2cudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDE5LCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5Db3B5cmlnaHQgMjAxNiBPcGVuTWFya2V0IEx0ZFxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBBdXRoVHlwZSwgSUF1dGhEYXRhIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2ludGVyYWN0aXZlLWF1dGhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgSW50ZXJhY3RpdmVBdXRoLCB7IEVSUk9SX1VTRVJfQ0FOQ0VMTEVELCBJbnRlcmFjdGl2ZUF1dGhDYWxsYmFjayB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0ludGVyYWN0aXZlQXV0aFwiO1xuaW1wb3J0IHsgQ29udGludWVLaW5kLCBTU09BdXRoRW50cnkgfSBmcm9tIFwiLi4vYXV0aC9JbnRlcmFjdGl2ZUF1dGhFbnRyeUNvbXBvbmVudHNcIjtcbmltcG9ydCBTdHlsZWRDaGVja2JveCBmcm9tIFwiLi4vZWxlbWVudHMvU3R5bGVkQ2hlY2tib3hcIjtcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5cbnR5cGUgRGlhbG9nQWVzdGhldGljcyA9IFBhcnRpYWw8e1xuICAgIFt4IGluIEF1dGhUeXBlXToge1xuICAgICAgICBbeDogbnVtYmVyXToge1xuICAgICAgICAgICAgYm9keTogc3RyaW5nO1xuICAgICAgICAgICAgY29udGludWVUZXh0Pzogc3RyaW5nO1xuICAgICAgICAgICAgY29udGludWVLaW5kPzogQ29udGludWVLaW5kO1xuICAgICAgICB9O1xuICAgIH07XG59PjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgb25GaW5pc2hlZDogKHN1Y2Nlc3M/OiBib29sZWFuKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBzaG91bGRFcmFzZTogYm9vbGVhbjtcbiAgICBlcnJTdHI6IHN0cmluZyB8IG51bGw7XG4gICAgYXV0aERhdGE6IGFueTsgLy8gZm9yIFVJQVxuICAgIGF1dGhFbmFibGVkOiBib29sZWFuOyAvLyBzZWUgdXNhZ2VzIGZvciBpbmZvcm1hdGlvblxuXG4gICAgLy8gQSBmZXcgc3RyaW5ncyB0aGF0IGFyZSBwYXNzZWQgdG8gSW50ZXJhY3RpdmVBdXRoIGZvciBkZXNpZ24gb3IgYXJlIGRpc3BsYXllZFxuICAgIC8vIG5leHQgdG8gdGhlIEludGVyYWN0aXZlQXV0aCBjb21wb25lbnQuXG4gICAgYm9keVRleHQ/OiBzdHJpbmc7XG4gICAgY29udGludWVUZXh0Pzogc3RyaW5nO1xuICAgIGNvbnRpbnVlS2luZD86IENvbnRpbnVlS2luZDtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVhY3RpdmF0ZUFjY291bnREaWFsb2cgZXh0ZW5kcyBSZWFjdC5Db21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIHNob3VsZEVyYXNlOiBmYWxzZSxcbiAgICAgICAgICAgIGVyclN0cjogbnVsbCxcbiAgICAgICAgICAgIGF1dGhEYXRhOiBudWxsLCAvLyBmb3IgVUlBXG4gICAgICAgICAgICBhdXRoRW5hYmxlZDogdHJ1ZSwgLy8gc2VlIHVzYWdlcyBmb3IgaW5mb3JtYXRpb25cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmluaXRBdXRoKC8qIHNob3VsZEVyYXNlPSAqLyBmYWxzZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvblN0YWdlUGhhc2VDaGFuZ2UgPSAoc3RhZ2U6IEF1dGhUeXBlLCBwaGFzZTogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IGRpYWxvZ0Flc3RoZXRpY3MgPSB7XG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LlBIQVNFX1BSRUFVVEhdOiB7XG4gICAgICAgICAgICAgICAgYm9keTogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9ib2R5X3Nzb1wiKSxcbiAgICAgICAgICAgICAgICBjb250aW51ZVRleHQ6IF90KFwiYXV0aHxzc29cIiksXG4gICAgICAgICAgICAgICAgY29udGludWVLaW5kOiBcImRhbmdlclwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIFtTU09BdXRoRW50cnkuUEhBU0VfUE9TVEFVVEhdOiB7XG4gICAgICAgICAgICAgICAgYm9keTogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9ib2R5XCIpLFxuICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dDogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250aW51ZVwiKSxcbiAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ6IFwiZGFuZ2VyXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgYWVzdGhldGljc0ZvclN0YWdlUGhhc2VzIGluIEludGVyYWN0aXZlQXV0aERpYWxvZyBtaW51cyB0aGUgYHRpdGxlYFxuICAgICAgICBjb25zdCBERUFDVElWQVRFX0FFU1RIRVRJQ1M6IERpYWxvZ0Flc3RoZXRpY3MgPSB7XG4gICAgICAgICAgICBbU1NPQXV0aEVudHJ5LkxPR0lOX1RZUEVdOiBkaWFsb2dBZXN0aGV0aWNzLFxuICAgICAgICAgICAgW1NTT0F1dGhFbnRyeS5VTlNUQUJMRV9MT0dJTl9UWVBFXTogZGlhbG9nQWVzdGhldGljcyxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBhZXN0aGV0aWNzID0gREVBQ1RJVkFURV9BRVNUSEVUSUNTW3N0YWdlXTtcbiAgICAgICAgbGV0IGJvZHlUZXh0OiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGxldCBjb250aW51ZVRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IGNvbnRpbnVlS2luZDogQ29udGludWVLaW5kIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAoYWVzdGhldGljcykge1xuICAgICAgICAgICAgY29uc3QgcGhhc2VBZXN0aGV0aWNzID0gYWVzdGhldGljc1twaGFzZV07XG4gICAgICAgICAgICBpZiAocGhhc2VBZXN0aGV0aWNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBoYXNlQWVzdGhldGljcy5ib2R5KSBib2R5VGV4dCA9IHBoYXNlQWVzdGhldGljcy5ib2R5O1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZUFlc3RoZXRpY3MuY29udGludWVUZXh0KSBjb250aW51ZVRleHQgPSBwaGFzZUFlc3RoZXRpY3MuY29udGludWVUZXh0O1xuICAgICAgICAgICAgICAgIGlmIChwaGFzZUFlc3RoZXRpY3MuY29udGludWVLaW5kKSBjb250aW51ZUtpbmQgPSBwaGFzZUFlc3RoZXRpY3MuY29udGludWVLaW5kO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBib2R5VGV4dCwgY29udGludWVUZXh0LCBjb250aW51ZUtpbmQgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25VSUF1dGhGaW5pc2hlZDogSW50ZXJhY3RpdmVBdXRoQ2FsbGJhY2s8QXdhaXRlZDxSZXR1cm5UeXBlPE1hdHJpeENsaWVudFtcImRlYWN0aXZhdGVBY2NvdW50XCJdPj4+ID0gYXN5bmMgKFxuICAgICAgICBzdWNjZXNzLFxuICAgICAgICByZXN1bHQsXG4gICAgKSA9PiB7XG4gICAgICAgIGlmIChzdWNjZXNzKSByZXR1cm47IC8vIGdyZWF0ISBtYWtlUmVxdWVzdCgpIHdpbGwgYmUgY2FsbGVkIHRvby5cblxuICAgICAgICBpZiAocmVzdWx0ID09PSBFUlJPUl9VU0VSX0NBTkNFTExFRCkge1xuICAgICAgICAgICAgdGhpcy5vbkNhbmNlbCgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgZHVyaW5nIFVJIEF1dGg6XCIsIHsgcmVzdWx0IH0pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9jb21tdW5pY2F0aW9uXCIpIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVUlBdXRoQ29tcGxldGUgPSAoYXV0aDogSUF1dGhEYXRhIHwgbnVsbCk6IHZvaWQgPT4ge1xuICAgICAgICAvLyBYWFg6IHRoaXMgc2hvdWxkIGJlIHJldHVybmluZyBhIHByb21pc2UgdG8gbWFpbnRhaW4gdGhlIHN0YXRlIGluc2lkZSB0aGUgc3RhdGUgbWFjaGluZSBjb3JyZWN0XG4gICAgICAgIC8vIGJ1dCBnaXZlbiB0aGF0IGEgZGVhY3RpdmF0aW9uIGlzIGZvbGxvd2VkIGJ5IGEgbG9jYWwgbG9nb3V0IGFuZCBhbGwgb2JqZWN0IGluc3RhbmNlcyBiZWluZyB0aHJvd24gYXdheVxuICAgICAgICAvLyB0aGlzIGlzbid0IGRvbmUuXG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KClcbiAgICAgICAgICAgIC5kZWFjdGl2YXRlQWNjb3VudChhdXRoID8/IHVuZGVmaW5lZCwgdGhpcy5zdGF0ZS5zaG91bGRFcmFzZSlcbiAgICAgICAgICAgIC50aGVuKChyKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gRGVhY3RpdmF0aW9uIHdvcmtlZCAtIGxvZ291dCAmIGNsb3NlIHRoaXMgZGlhbG9nXG4gICAgICAgICAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZmlyZShBY3Rpb24uVHJpZ2dlckxvZ291dCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9jb21tdW5pY2F0aW9uXCIpIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25FcmFzZUZpZWxkQ2hhbmdlID0gKGV2OiBSZWFjdC5Gb3JtRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBzaG91bGRFcmFzZTogZXYuY3VycmVudFRhcmdldC5jaGVja2VkLFxuXG4gICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBhdXRoIGZvcm0gYmVjYXVzZSB3ZSdyZSBnb2luZyB0byBoYXZlIHRvIHJlaW5pdGlhbGl6ZSB0aGUgYXV0aFxuICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24uIFdlIGRvIHRoaXMgYmVjYXVzZSB3ZSBjYW4ndCBtb2RpZnkgdGhlIHBhcmFtZXRlcnMgaW4gdGhlIFVJQVxuICAgICAgICAgICAgLy8gc2Vzc2lvbiwgYW5kIHRoZSB1c2VyIHdpbGwgaGF2ZSBzZWxlY3RlZCBzb21ldGhpbmcgd2hpY2ggY2hhbmdlcyB0aGUgcmVxdWVzdC5cbiAgICAgICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgdGhyb3cgYXdheSB0aGUgbGFzdCBhdXRoIHNlc3Npb24gYW5kIHRyeSBhIG5ldyBvbmUuXG4gICAgICAgICAgICBhdXRoRW5hYmxlZDogZmFsc2UsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEFzIG1lbnRpb25lZCBhYm92ZSwgc2V0IHVwIGZvciBhdXRoIGFnYWluIHRvIGdldCB1cGRhdGVkIFVJQSBzZXNzaW9uIGluZm9cbiAgICAgICAgdGhpcy5pbml0QXV0aCgvKiBzaG91bGRFcmFzZT0gKi8gZXYuY3VycmVudFRhcmdldC5jaGVja2VkKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNhbmNlbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGluaXRBdXRoKHNob3VsZEVyYXNlOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KClcbiAgICAgICAgICAgIC5kZWFjdGl2YXRlQWNjb3VudCh1bmRlZmluZWQsIHNob3VsZEVyYXNlKVxuICAgICAgICAgICAgLnRoZW4oKHIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnb3QgaGVyZSwgb29wcy4gVGhlIHNlcnZlciBkaWRuJ3QgcmVxdWlyZSBhbnkgYXV0aC5cbiAgICAgICAgICAgICAgICAvLyBPdXIgYXBwbGljYXRpb24gbGlmZWN5Y2xlIHdpbGwgY2F0Y2ggdGhlIGVycm9yIGFuZCBkbyB0aGUgbG9nb3V0IGJpdHMuXG4gICAgICAgICAgICAgICAgLy8gV2UnbGwgdHJ5IHRvIGxvZyBzb21ldGhpbmcgaW4gYW4gdmFpbiBhdHRlbXB0IHRvIHJlY29yZCB3aGF0IGhhcHBlbmVkIChzdG9yYWdlXG4gICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBvYmxpdGVyYXRlZCBvbiBsb2dvdXQpLlxuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKFwiVXNlcidzIGFjY291bnQgZ290IGRlYWN0aXZhdGVkIHdpdGhvdXQgY29uZmlybWF0aW9uOiBTZXJ2ZXIgaGFkIG5vIGF1dGhcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGVyclN0cjogX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGVycm9yX2RlYWN0aXZhdGVfbm9fYXV0aFwiKSB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGUpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSAmJiBlLmh0dHBTdGF0dXMgPT09IDQwMSAmJiBlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVmFsaWQgVUlBIHJlc3BvbnNlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBhdXRoRGF0YTogZS5kYXRhLCBhdXRoRW5hYmxlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKHsgZXJyU3RyOiBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfZGVhY3RpdmF0ZV9pbnZhbGlkX2F1dGhcIikgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBsZXQgZXJyb3I6IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5lcnJTdHIpIHtcbiAgICAgICAgICAgIGVycm9yID0gPGRpdiBjbGFzc05hbWU9XCJlcnJvclwiPnt0aGlzLnN0YXRlLmVyclN0cn08L2Rpdj47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYXV0aCA9IDxkaXY+e190KFwiY29tbW9ufGxvYWRpbmdcIil9PC9kaXY+O1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5hdXRoRGF0YSAmJiB0aGlzLnN0YXRlLmF1dGhFbmFibGVkKSB7XG4gICAgICAgICAgICBhdXRoID0gKFxuICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLmJvZHlUZXh0fVxuICAgICAgICAgICAgICAgICAgICA8SW50ZXJhY3RpdmVBdXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRyaXhDbGllbnQ9e01hdHJpeENsaWVudFBlZy5zYWZlR2V0KCl9XG4gICAgICAgICAgICAgICAgICAgICAgICBhdXRoRGF0YT17dGhpcy5zdGF0ZS5hdXRoRGF0YX1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFhYWDogb25VSUF1dGhDb21wbGV0ZSBicmVhY2hlcyB0aGUgZXhwZWN0ZWQgbWV0aG9kIGNvbnRyYWN0LCBpdCBnZXRzIGF3YXkgd2l0aCBpdCBiZWNhdXNlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBrbm93cyB0aGUgZW50aXJlIGFwcCBpcyBhYm91dCB0byBkaWUgYXMgYSByZXN1bHQgb2YgdGhlIGFjY291bnQgZGVhY3RpdmF0aW9uLlxuICAgICAgICAgICAgICAgICAgICAgICAgbWFrZVJlcXVlc3Q9e3RoaXMub25VSUF1dGhDb21wbGV0ZSBhcyBhbnl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkF1dGhGaW5pc2hlZD17dGhpcy5vblVJQXV0aEZpbmlzaGVkfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25TdGFnZVBoYXNlQ2hhbmdlPXt0aGlzLm9uU3RhZ2VQaGFzZUNoYW5nZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlVGV4dD17dGhpcy5zdGF0ZS5jb250aW51ZVRleHR9XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZUtpbmQ9e3RoaXMuc3RhdGUuY29udGludWVLaW5kfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRoaXMgaXMgb24gcHVycG9zZSBub3QgYSA8Zm9ybSAvPiB0byBwcmV2ZW50IEVudGVyIHRyaWdnZXJpbmcgc3VibWlzc2lvbiwgdG8gZnVydGhlciBwcmV2ZW50IGFjY2lkZW50c1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9EZWFjdGl2YXRlQWNjb3VudERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlQ2xhc3M9XCJkYW5nZXJcIlxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9zZWN0aW9uXCIpfVxuICAgICAgICAgICAgICAgIHNjcmVlbk5hbWU9XCJEZWFjdGl2YXRlQWNjb3VudFwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250ZW50XCIpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfMVwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfMlwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfM1wiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfNFwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpPntfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2NvbnRlbnRfNVwiKX08L2xpPlxuICAgICAgICAgICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgICAgICAgICA8cD57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfY29uZmlybV9jb250ZW50XzZcIil9PC9wPlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGVhY3RpdmF0ZUFjY291bnREaWFsb2dfaW5wdXRfc2VjdGlvblwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZENoZWNrYm94IGNoZWNrZWQ9e3RoaXMuc3RhdGUuc2hvdWxkRXJhc2V9IG9uQ2hhbmdlPXt0aGlzLm9uRXJhc2VGaWVsZENoYW5nZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9jb25maXJtX2VyYXNlX2xhYmVsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU3R5bGVkQ2hlY2tib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZXJyb3J9XG4gICAgICAgICAgICAgICAgICAgICAgICB7YXV0aH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUVBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUdBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUMsdUJBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLCtCQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxlQUFBLEdBQUFSLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUSxXQUFBLEdBQUFULHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBUyxXQUFBLEdBQUFWLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBVSxRQUFBLEdBQUFWLE9BQUE7QUFBcUQsU0FBQVcseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxLQUFBRixDQUFBO0FBQUEsU0FBQVAsd0JBQUFPLENBQUEsRUFBQUUsQ0FBQSxTQUFBQSxDQUFBLElBQUFGLENBQUEsSUFBQUEsQ0FBQSxDQUFBSSxVQUFBLFNBQUFKLENBQUEsZUFBQUEsQ0FBQSx1QkFBQUEsQ0FBQSx5QkFBQUEsQ0FBQSxXQUFBSyxPQUFBLEVBQUFMLENBQUEsUUFBQUcsQ0FBQSxHQUFBSix3QkFBQSxDQUFBRyxDQUFBLE9BQUFDLENBQUEsSUFBQUEsQ0FBQSxDQUFBRyxHQUFBLENBQUFOLENBQUEsVUFBQUcsQ0FBQSxDQUFBSSxHQUFBLENBQUFQLENBQUEsT0FBQVEsQ0FBQSxLQUFBQyxTQUFBLFVBQUFDLENBQUEsR0FBQUMsTUFBQSxDQUFBQyxjQUFBLElBQUFELE1BQUEsQ0FBQUUsd0JBQUEsV0FBQUMsQ0FBQSxJQUFBZCxDQUFBLG9CQUFBYyxDQUFBLE9BQUFDLGNBQUEsQ0FBQUMsSUFBQSxDQUFBaEIsQ0FBQSxFQUFBYyxDQUFBLFNBQUFHLENBQUEsR0FBQVAsQ0FBQSxHQUFBQyxNQUFBLENBQUFFLHdCQUFBLENBQUFiLENBQUEsRUFBQWMsQ0FBQSxVQUFBRyxDQUFBLEtBQUFBLENBQUEsQ0FBQVYsR0FBQSxJQUFBVSxDQUFBLENBQUFDLEdBQUEsSUFBQVAsTUFBQSxDQUFBQyxjQUFBLENBQUFKLENBQUEsRUFBQU0sQ0FBQSxFQUFBRyxDQUFBLElBQUFULENBQUEsQ0FBQU0sQ0FBQSxJQUFBZCxDQUFBLENBQUFjLENBQUEsWUFBQU4sQ0FBQSxDQUFBSCxPQUFBLEdBQUFMLENBQUEsRUFBQUcsQ0FBQSxJQUFBQSxDQUFBLENBQUFlLEdBQUEsQ0FBQWxCLENBQUEsRUFBQVEsQ0FBQSxHQUFBQSxDQUFBO0FBckJyRDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQTJDZSxNQUFNVyx1QkFBdUIsU0FBU0MsY0FBSyxDQUFDQyxTQUFTLENBQWlCO0VBQzFFQyxXQUFXQSxDQUFDQyxLQUFhLEVBQUU7SUFDOUIsS0FBSyxDQUFDQSxLQUFLLENBQUM7SUFBQyxJQUFBQyxnQkFBQSxDQUFBbkIsT0FBQSw4QkFZWSxDQUFDb0IsS0FBZSxFQUFFQyxLQUFhLEtBQVc7TUFDbkUsTUFBTUMsZ0JBQWdCLEdBQUc7UUFDckIsQ0FBQ0MsNENBQVksQ0FBQ0MsYUFBYSxHQUFHO1VBQzFCQyxJQUFJLEVBQUUsSUFBQUMsbUJBQUUsRUFBQyw4Q0FBOEMsQ0FBQztVQUN4REMsWUFBWSxFQUFFLElBQUFELG1CQUFFLEVBQUMsVUFBVSxDQUFDO1VBQzVCRSxZQUFZLEVBQUU7UUFDbEIsQ0FBQztRQUNELENBQUNMLDRDQUFZLENBQUNNLGNBQWMsR0FBRztVQUMzQkosSUFBSSxFQUFFLElBQUFDLG1CQUFFLEVBQUMsMENBQTBDLENBQUM7VUFDcERDLFlBQVksRUFBRSxJQUFBRCxtQkFBRSxFQUFDLDhDQUE4QyxDQUFDO1VBQ2hFRSxZQUFZLEVBQUU7UUFDbEI7TUFDSixDQUFDOztNQUVEO01BQ0EsTUFBTUUscUJBQXVDLEdBQUc7UUFDNUMsQ0FBQ1AsNENBQVksQ0FBQ1EsVUFBVSxHQUFHVCxnQkFBZ0I7UUFDM0MsQ0FBQ0MsNENBQVksQ0FBQ1MsbUJBQW1CLEdBQUdWO01BQ3hDLENBQUM7TUFFRCxNQUFNVyxVQUFVLEdBQUdILHFCQUFxQixDQUFDVixLQUFLLENBQUM7TUFDL0MsSUFBSWMsUUFBNEI7TUFDaEMsSUFBSVAsWUFBZ0M7TUFDcEMsSUFBSUMsWUFBc0M7TUFDMUMsSUFBSUssVUFBVSxFQUFFO1FBQ1osTUFBTUUsZUFBZSxHQUFHRixVQUFVLENBQUNaLEtBQUssQ0FBQztRQUN6QyxJQUFJYyxlQUFlLEVBQUU7VUFDakIsSUFBSUEsZUFBZSxDQUFDVixJQUFJLEVBQUVTLFFBQVEsR0FBR0MsZUFBZSxDQUFDVixJQUFJO1VBQ3pELElBQUlVLGVBQWUsQ0FBQ1IsWUFBWSxFQUFFQSxZQUFZLEdBQUdRLGVBQWUsQ0FBQ1IsWUFBWTtVQUM3RSxJQUFJUSxlQUFlLENBQUNQLFlBQVksRUFBRUEsWUFBWSxHQUFHTyxlQUFlLENBQUNQLFlBQVk7UUFDakY7TUFDSjtNQUNBLElBQUksQ0FBQ1EsUUFBUSxDQUFDO1FBQUVGLFFBQVE7UUFBRVAsWUFBWTtRQUFFQztNQUFhLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBQUEsSUFBQVQsZ0JBQUEsQ0FBQW5CLE9BQUEsNEJBRTJHLE9BQ3hHcUMsT0FBTyxFQUNQQyxNQUFNLEtBQ0w7TUFDRCxJQUFJRCxPQUFPLEVBQUUsT0FBTyxDQUFDOztNQUVyQixJQUFJQyxNQUFNLEtBQUtDLHFDQUFvQixFQUFFO1FBQ2pDLElBQUksQ0FBQ0MsUUFBUSxDQUFDLENBQUM7UUFDZjtNQUNKO01BRUFDLGNBQU0sQ0FBQ0MsS0FBSyxDQUFDLHVCQUF1QixFQUFFO1FBQUVKO01BQU8sQ0FBQyxDQUFDO01BQ2pELElBQUksQ0FBQ0YsUUFBUSxDQUFDO1FBQUVPLE1BQU0sRUFBRSxJQUFBakIsbUJBQUUsRUFBQyxpREFBaUQ7TUFBRSxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUFBLElBQUFQLGdCQUFBLENBQUFuQixPQUFBLDRCQUUyQjRDLElBQXNCLElBQVc7TUFDekQ7TUFDQTtNQUNBO01BQ0FDLGdDQUFlLENBQUNDLE9BQU8sQ0FBQyxDQUFDLENBQ3BCQyxpQkFBaUIsQ0FBQ0gsSUFBSSxJQUFJSSxTQUFTLEVBQUUsSUFBSSxDQUFDQyxLQUFLLENBQUNDLFdBQVcsQ0FBQyxDQUM1REMsSUFBSSxDQUFFdEQsQ0FBQyxJQUFLO1FBQ1Q7UUFDQXVELG1CQUFpQixDQUFDQyxJQUFJLENBQUNDLGVBQU0sQ0FBQ0MsYUFBYSxDQUFDO1FBQzVDLElBQUksQ0FBQ3JDLEtBQUssQ0FBQ3NDLFVBQVUsQ0FBQyxJQUFJLENBQUM7TUFDL0IsQ0FBQyxDQUFDLENBQ0RDLEtBQUssQ0FBRTlELENBQUMsSUFBSztRQUNWOEMsY0FBTSxDQUFDQyxLQUFLLENBQUMvQyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUN5QyxRQUFRLENBQUM7VUFBRU8sTUFBTSxFQUFFLElBQUFqQixtQkFBRSxFQUFDLGlEQUFpRDtRQUFFLENBQUMsQ0FBQztNQUNwRixDQUFDLENBQUM7SUFDVixDQUFDO0lBQUEsSUFBQVAsZ0JBQUEsQ0FBQW5CLE9BQUEsOEJBRTZCMEQsRUFBcUMsSUFBVztNQUMxRSxJQUFJLENBQUN0QixRQUFRLENBQUM7UUFDVmMsV0FBVyxFQUFFUSxFQUFFLENBQUNDLGFBQWEsQ0FBQ0MsT0FBTztRQUVyQztRQUNBO1FBQ0E7UUFDQTtRQUNBQyxXQUFXLEVBQUU7TUFDakIsQ0FBQyxDQUFDOztNQUVGO01BQ0EsSUFBSSxDQUFDQyxRQUFRLEVBQUMsa0JBQW1CSixFQUFFLENBQUNDLGFBQWEsQ0FBQ0MsT0FBTyxDQUFDO0lBQzlELENBQUM7SUExRkcsSUFBSSxDQUFDWCxLQUFLLEdBQUc7TUFDVEMsV0FBVyxFQUFFLEtBQUs7TUFDbEJQLE1BQU0sRUFBRSxJQUFJO01BQ1pvQixRQUFRLEVBQUUsSUFBSTtNQUFFO01BQ2hCRixXQUFXLEVBQUUsSUFBSSxDQUFFO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLENBQUNDLFFBQVEsRUFBQyxrQkFBbUIsS0FBSyxDQUFDO0VBQzNDO0VBb0ZRdEIsUUFBUUEsQ0FBQSxFQUFTO0lBQ3JCLElBQUksQ0FBQ3RCLEtBQUssQ0FBQ3NDLFVBQVUsQ0FBQyxLQUFLLENBQUM7RUFDaEM7RUFFUU0sUUFBUUEsQ0FBQ1osV0FBb0IsRUFBUTtJQUN6Q0wsZ0NBQWUsQ0FBQ0MsT0FBTyxDQUFDLENBQUMsQ0FDcEJDLGlCQUFpQixDQUFDQyxTQUFTLEVBQUVFLFdBQVcsQ0FBQyxDQUN6Q0MsSUFBSSxDQUFFdEQsQ0FBQyxJQUFLO01BQ1Q7TUFDQTtNQUNBO01BQ0E7TUFDQTRDLGNBQU0sQ0FBQ3VCLElBQUksQ0FBQyx5RUFBeUUsQ0FBQztNQUN0RixJQUFJLENBQUM1QixRQUFRLENBQUM7UUFBRU8sTUFBTSxFQUFFLElBQUFqQixtQkFBRSxFQUFDLDJDQUEyQztNQUFFLENBQUMsQ0FBQztJQUM5RSxDQUFDLENBQUMsQ0FDRCtCLEtBQUssQ0FBRTlELENBQUMsSUFBSztNQUNWLElBQUlBLENBQUMsSUFBSUEsQ0FBQyxDQUFDc0UsVUFBVSxLQUFLLEdBQUcsSUFBSXRFLENBQUMsQ0FBQ3VFLElBQUksRUFBRTtRQUNyQztRQUNBLElBQUksQ0FBQzlCLFFBQVEsQ0FBQztVQUFFMkIsUUFBUSxFQUFFcEUsQ0FBQyxDQUFDdUUsSUFBSTtVQUFFTCxXQUFXLEVBQUU7UUFBSyxDQUFDLENBQUM7TUFDMUQsQ0FBQyxNQUFNO1FBQ0gsSUFBSSxDQUFDekIsUUFBUSxDQUFDO1VBQUVPLE1BQU0sRUFBRSxJQUFBakIsbUJBQUUsRUFBQyxnREFBZ0Q7UUFBRSxDQUFDLENBQUM7TUFDbkY7SUFDSixDQUFDLENBQUM7RUFDVjtFQUVPeUMsTUFBTUEsQ0FBQSxFQUFvQjtJQUM3QixJQUFJekIsS0FBOEI7SUFDbEMsSUFBSSxJQUFJLENBQUNPLEtBQUssQ0FBQ04sTUFBTSxFQUFFO01BQ25CRCxLQUFLLGdCQUFHN0QsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQTtRQUFLQyxTQUFTLEVBQUM7TUFBTyxHQUFFLElBQUksQ0FBQ3BCLEtBQUssQ0FBQ04sTUFBWSxDQUFDO0lBQzVEO0lBRUEsSUFBSUMsSUFBSSxnQkFBRy9ELE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsY0FBTSxJQUFBMUMsbUJBQUUsRUFBQyxnQkFBZ0IsQ0FBTyxDQUFDO0lBQzVDLElBQUksSUFBSSxDQUFDdUIsS0FBSyxDQUFDYyxRQUFRLElBQUksSUFBSSxDQUFDZCxLQUFLLENBQUNZLFdBQVcsRUFBRTtNQUMvQ2pCLElBQUksZ0JBQ0EvRCxNQUFBLENBQUFtQixPQUFBLENBQUFvRSxhQUFBLGNBQ0ssSUFBSSxDQUFDbkIsS0FBSyxDQUFDZixRQUFRLGVBQ3BCckQsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQSxDQUFDakYsZ0JBQUEsQ0FBQWEsT0FBZTtRQUNac0UsWUFBWSxFQUFFekIsZ0NBQWUsQ0FBQ0MsT0FBTyxDQUFDLENBQUU7UUFDeENpQixRQUFRLEVBQUUsSUFBSSxDQUFDZCxLQUFLLENBQUNjO1FBQ3JCO1FBQ0E7UUFBQTtRQUNBUSxXQUFXLEVBQUUsSUFBSSxDQUFDQyxnQkFBd0I7UUFDMUNDLGNBQWMsRUFBRSxJQUFJLENBQUNDLGdCQUFpQjtRQUN0Q0Msa0JBQWtCLEVBQUUsSUFBSSxDQUFDQSxrQkFBbUI7UUFDNUNoRCxZQUFZLEVBQUUsSUFBSSxDQUFDc0IsS0FBSyxDQUFDdEIsWUFBYTtRQUN0Q0MsWUFBWSxFQUFFLElBQUksQ0FBQ3FCLEtBQUssQ0FBQ3JCO01BQWEsQ0FDekMsQ0FDQSxDQUNSO0lBQ0w7O0lBRUE7SUFDQSxvQkFDSS9DLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsQ0FBQzdFLFdBQUEsQ0FBQVMsT0FBVTtNQUNQcUUsU0FBUyxFQUFDLDRCQUE0QjtNQUN0Q2IsVUFBVSxFQUFFLElBQUksQ0FBQ3RDLEtBQUssQ0FBQ3NDLFVBQVc7TUFDbENvQixVQUFVLEVBQUMsUUFBUTtNQUNuQkMsS0FBSyxFQUFFLElBQUFuRCxtQkFBRSxFQUFDLHFDQUFxQyxDQUFFO01BQ2pEb0QsVUFBVSxFQUFDO0lBQW1CLGdCQUU5QmpHLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUE7TUFBS0MsU0FBUyxFQUFDO0lBQW1CLGdCQUM5QnhGLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsWUFBSSxJQUFBMUMsbUJBQUUsRUFBQyw2Q0FBNkMsQ0FBSyxDQUFDLGVBQzFEN0MsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQSwwQkFDSXZGLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsYUFBSyxJQUFBMUMsbUJBQUUsRUFBQywrQ0FBK0MsQ0FBTSxDQUFDLGVBQzlEN0MsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQSxhQUFLLElBQUExQyxtQkFBRSxFQUFDLCtDQUErQyxDQUFNLENBQUMsZUFDOUQ3QyxNQUFBLENBQUFtQixPQUFBLENBQUFvRSxhQUFBLGFBQUssSUFBQTFDLG1CQUFFLEVBQUMsK0NBQStDLENBQU0sQ0FBQyxlQUM5RDdDLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsYUFBSyxJQUFBMUMsbUJBQUUsRUFBQywrQ0FBK0MsQ0FBTSxDQUFDLGVBQzlEN0MsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQSxhQUFLLElBQUExQyxtQkFBRSxFQUFDLCtDQUErQyxDQUFNLENBQzdELENBQUMsZUFDTDdDLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsWUFBSSxJQUFBMUMsbUJBQUUsRUFBQywrQ0FBK0MsQ0FBSyxDQUFDLGVBRTVEN0MsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQTtNQUFLQyxTQUFTLEVBQUM7SUFBMEMsZ0JBQ3JEeEYsTUFBQSxDQUFBbUIsT0FBQSxDQUFBb0UsYUFBQSx5QkFDSXZGLE1BQUEsQ0FBQW1CLE9BQUEsQ0FBQW9FLGFBQUEsQ0FBQzlFLGVBQUEsQ0FBQVUsT0FBYztNQUFDNEQsT0FBTyxFQUFFLElBQUksQ0FBQ1gsS0FBSyxDQUFDQyxXQUFZO01BQUM2QixRQUFRLEVBQUUsSUFBSSxDQUFDQztJQUFtQixHQUM5RSxJQUFBdEQsbUJBQUUsRUFBQyxpREFBaUQsQ0FDekMsQ0FDakIsQ0FBQyxFQUNIZ0IsS0FBSyxFQUNMRSxJQUNBLENBQ0osQ0FDRyxDQUFDO0VBRXJCO0FBQ0o7QUFBQ3FDLE9BQUEsQ0FBQWpGLE9BQUEsR0FBQWMsdUJBQUEiLCJpZ25vcmVMaXN0IjpbXX0=