UNPKG

matrix-react-sdk

Version:
164 lines (159 loc) 32.5 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../../../languageHandler"); var _UserProfileSettings = _interopRequireDefault(require("../../UserProfileSettings")); var _SettingsStore = _interopRequireDefault(require("../../../../../settings/SettingsStore")); var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton")); var _DeactivateAccountDialog = _interopRequireDefault(require("../../../dialogs/DeactivateAccountDialog")); var _Modal = _interopRequireDefault(require("../../../../../Modal")); var _UIFeature = require("../../../../../settings/UIFeature"); var _ErrorDialog = _interopRequireWildcard(require("../../../dialogs/ErrorDialog")); var _ChangePassword = _interopRequireDefault(require("../../ChangePassword")); var _SettingsTab = _interopRequireDefault(require("../SettingsTab")); var _SettingsSection = require("../../shared/SettingsSection"); var _SettingsSubsection = _interopRequireWildcard(require("../../shared/SettingsSubsection")); var _SDKContext = require("../../../../../contexts/SDKContext"); var _UserPersonalInfoSettings = _interopRequireDefault(require("../../UserPersonalInfoSettings")); var _MatrixClientContext = require("../../../../../contexts/MatrixClientContext"); 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 2019-2024 New Vector Ltd. Copyright 2019 The Matrix.org Foundation C.I.C. Copyright 2019 Michael Telatynski <7t3chguy@gmail.com> SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const AccountSection = ({ canChangePassword, onPasswordChangeError, onPasswordChanged }) => { if (!canChangePassword) return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null); return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|general|account_section"), stretchContent: true, "data-testid": "accountSection" }, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.SettingsSubsectionText, null, (0, _languageHandler._t)("settings|general|password_change_section")), /*#__PURE__*/_react.default.createElement(_ChangePassword.default, { rowClassName: "", buttonKind: "primary", onError: onPasswordChangeError, onFinished: onPasswordChanged }))); }; const ManagementSection = ({ onDeactivateClicked }) => { return /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, { heading: (0, _languageHandler._t)("settings|general|deactivate_section") }, /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("settings|general|account_management_section"), "data-testid": "account-management-section", description: (0, _languageHandler._t)("settings|general|deactivate_warning") }, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { onClick: onDeactivateClicked, kind: "danger" }, (0, _languageHandler._t)("settings|general|deactivate_section")))); }; const AccountUserSettingsTab = ({ closeSettingsFn }) => { const [externalAccountManagementUrl, setExternalAccountManagementUrl] = _react.default.useState(); const [canMake3pidChanges, setCanMake3pidChanges] = _react.default.useState(false); const [canSetDisplayName, setCanSetDisplayName] = _react.default.useState(false); const [canSetAvatar, setCanSetAvatar] = _react.default.useState(false); const [canChangePassword, setCanChangePassword] = _react.default.useState(false); const cli = (0, _MatrixClientContext.useMatrixClientContext)(); const sdkContext = (0, _react.useContext)(_SDKContext.SDKContext); (0, _react.useEffect)(() => { (async () => { const capabilities = (await cli.getCapabilities()) ?? {}; const changePasswordCap = capabilities["m.change_password"]; // You can change your password so long as the capability isn't explicitly disabled. The implicit // behaviour is you can change your password when the capability is missing or has not-false as // the enabled flag value. const canChangePassword = !changePasswordCap || changePasswordCap["enabled"] !== false; await sdkContext.oidcClientStore.readyPromise; // wait for the store to be ready const externalAccountManagementUrl = sdkContext.oidcClientStore.accountManagementEndpoint; // https://spec.matrix.org/v1.7/client-server-api/#m3pid_changes-capability // We support as far back as v1.1 which doesn't have m.3pid_changes // so the behaviour for when it is missing has to be assume true const canMake3pidChanges = !capabilities["m.3pid_changes"] || capabilities["m.3pid_changes"].enabled === true; const canSetDisplayName = !capabilities["m.set_displayname"] || capabilities["m.set_displayname"].enabled === true; const canSetAvatar = !capabilities["m.set_avatar_url"] || capabilities["m.set_avatar_url"].enabled === true; setCanMake3pidChanges(canMake3pidChanges); setCanSetDisplayName(canSetDisplayName); setCanSetAvatar(canSetAvatar); setExternalAccountManagementUrl(externalAccountManagementUrl); setCanChangePassword(canChangePassword); })(); }, [cli, sdkContext.oidcClientStore]); const onPasswordChangeError = (0, _react.useCallback)(err => { _logger.logger.error("Failed to change password: " + err); let underlyingError = err; if (err instanceof _languageHandler.UserFriendlyError && err.cause instanceof Error) { underlyingError = err.cause; } const errorMessage = (0, _ErrorDialog.extractErrorMessageFromError)(err, (0, _languageHandler._t)("settings|general|error_password_change_unknown", { stringifiedError: String(err) })); let errorMessageToDisplay = errorMessage; if (underlyingError instanceof _matrix.HTTPError && underlyingError.httpStatus === 403) { errorMessageToDisplay = (0, _languageHandler._t)("settings|general|error_password_change_403"); } else if (underlyingError instanceof _matrix.HTTPError) { errorMessageToDisplay = (0, _languageHandler._t)("settings|general|error_password_change_http", { errorMessage, httpStatus: underlyingError.httpStatus }); } // TODO: Figure out a design that doesn't involve replacing the current dialog _Modal.default.createDialog(_ErrorDialog.default, { title: (0, _languageHandler._t)("settings|general|error_password_change_title"), description: errorMessageToDisplay }); }, []); const onPasswordChanged = (0, _react.useCallback)(() => { const description = (0, _languageHandler._t)("settings|general|password_change_success"); // TODO: Figure out a design that doesn't involve replacing the current dialog _Modal.default.createDialog(_ErrorDialog.default, { title: (0, _languageHandler._t)("common|success"), description }); }, []); const onDeactivateClicked = (0, _react.useCallback)(() => { _Modal.default.createDialog(_DeactivateAccountDialog.default, { onFinished: success => { if (success) closeSettingsFn(); } }); }, [closeSettingsFn]); let accountManagementSection; const isAccountManagedExternally = Boolean(externalAccountManagementUrl); if (_SettingsStore.default.getValue(_UIFeature.UIFeature.Deactivate) && !isAccountManagedExternally) { accountManagementSection = /*#__PURE__*/_react.default.createElement(ManagementSection, { onDeactivateClicked: onDeactivateClicked }); } return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, { "data-testid": "mx_AccountUserSettingsTab" }, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, null, /*#__PURE__*/_react.default.createElement(_UserProfileSettings.default, { externalAccountManagementUrl: externalAccountManagementUrl, canSetDisplayName: canSetDisplayName, canSetAvatar: canSetAvatar }), /*#__PURE__*/_react.default.createElement(_UserPersonalInfoSettings.default, { canMake3pidChanges: canMake3pidChanges }), /*#__PURE__*/_react.default.createElement(AccountSection, { canChangePassword: canChangePassword, onPasswordChanged: onPasswordChanged, onPasswordChangeError: onPasswordChangeError })), accountManagementSection); }; var _default = exports.default = AccountUserSettingsTab; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2xvZ2dlciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfVXNlclByb2ZpbGVTZXR0aW5ncyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfU2V0dGluZ3NTdG9yZSIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX0RlYWN0aXZhdGVBY2NvdW50RGlhbG9nIiwiX01vZGFsIiwiX1VJRmVhdHVyZSIsIl9FcnJvckRpYWxvZyIsIl9DaGFuZ2VQYXNzd29yZCIsIl9TZXR0aW5nc1RhYiIsIl9TZXR0aW5nc1NlY3Rpb24iLCJfU2V0dGluZ3NTdWJzZWN0aW9uIiwiX1NES0NvbnRleHQiLCJfVXNlclBlcnNvbmFsSW5mb1NldHRpbmdzIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJBY2NvdW50U2VjdGlvbiIsImNhbkNoYW5nZVBhc3N3b3JkIiwib25QYXNzd29yZENoYW5nZUVycm9yIiwib25QYXNzd29yZENoYW5nZWQiLCJjcmVhdGVFbGVtZW50IiwiRnJhZ21lbnQiLCJoZWFkaW5nIiwiX3QiLCJzdHJldGNoQ29udGVudCIsIlNldHRpbmdzU3Vic2VjdGlvblRleHQiLCJyb3dDbGFzc05hbWUiLCJidXR0b25LaW5kIiwib25FcnJvciIsIm9uRmluaXNoZWQiLCJNYW5hZ2VtZW50U2VjdGlvbiIsIm9uRGVhY3RpdmF0ZUNsaWNrZWQiLCJTZXR0aW5nc1NlY3Rpb24iLCJkZXNjcmlwdGlvbiIsIm9uQ2xpY2siLCJraW5kIiwiQWNjb3VudFVzZXJTZXR0aW5nc1RhYiIsImNsb3NlU2V0dGluZ3NGbiIsImV4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmwiLCJzZXRFeHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsIiwiUmVhY3QiLCJ1c2VTdGF0ZSIsImNhbk1ha2UzcGlkQ2hhbmdlcyIsInNldENhbk1ha2UzcGlkQ2hhbmdlcyIsImNhblNldERpc3BsYXlOYW1lIiwic2V0Q2FuU2V0RGlzcGxheU5hbWUiLCJjYW5TZXRBdmF0YXIiLCJzZXRDYW5TZXRBdmF0YXIiLCJzZXRDYW5DaGFuZ2VQYXNzd29yZCIsImNsaSIsInVzZU1hdHJpeENsaWVudENvbnRleHQiLCJzZGtDb250ZXh0IiwidXNlQ29udGV4dCIsIlNES0NvbnRleHQiLCJ1c2VFZmZlY3QiLCJjYXBhYmlsaXRpZXMiLCJnZXRDYXBhYmlsaXRpZXMiLCJjaGFuZ2VQYXNzd29yZENhcCIsIm9pZGNDbGllbnRTdG9yZSIsInJlYWR5UHJvbWlzZSIsImFjY291bnRNYW5hZ2VtZW50RW5kcG9pbnQiLCJlbmFibGVkIiwidXNlQ2FsbGJhY2siLCJlcnIiLCJsb2dnZXIiLCJlcnJvciIsInVuZGVybHlpbmdFcnJvciIsIlVzZXJGcmllbmRseUVycm9yIiwiY2F1c2UiLCJFcnJvciIsImVycm9yTWVzc2FnZSIsImV4dHJhY3RFcnJvck1lc3NhZ2VGcm9tRXJyb3IiLCJzdHJpbmdpZmllZEVycm9yIiwiU3RyaW5nIiwiZXJyb3JNZXNzYWdlVG9EaXNwbGF5IiwiSFRUUEVycm9yIiwiaHR0cFN0YXR1cyIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJ0aXRsZSIsIkRlYWN0aXZhdGVBY2NvdW50RGlhbG9nIiwic3VjY2VzcyIsImFjY291bnRNYW5hZ2VtZW50U2VjdGlvbiIsImlzQWNjb3VudE1hbmFnZWRFeHRlcm5hbGx5IiwiQm9vbGVhbiIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsIlVJRmVhdHVyZSIsIkRlYWN0aXZhdGUiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9zZXR0aW5ncy90YWJzL3VzZXIvQWNjb3VudFVzZXJTZXR0aW5nc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5LTIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBIVFRQRXJyb3IgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IFVzZXJGcmllbmRseUVycm9yLCBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBVc2VyUHJvZmlsZVNldHRpbmdzIGZyb20gXCIuLi8uLi9Vc2VyUHJvZmlsZVNldHRpbmdzXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBEZWFjdGl2YXRlQWNjb3VudERpYWxvZyBmcm9tIFwiLi4vLi4vLi4vZGlhbG9ncy9EZWFjdGl2YXRlQWNjb3VudERpYWxvZ1wiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IHsgVUlGZWF0dXJlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL1VJRmVhdHVyZVwiO1xuaW1wb3J0IEVycm9yRGlhbG9nLCB7IGV4dHJhY3RFcnJvck1lc3NhZ2VGcm9tRXJyb3IgfSBmcm9tIFwiLi4vLi4vLi4vZGlhbG9ncy9FcnJvckRpYWxvZ1wiO1xuaW1wb3J0IENoYW5nZVBhc3N3b3JkIGZyb20gXCIuLi8uLi9DaGFuZ2VQYXNzd29yZFwiO1xuaW1wb3J0IFNldHRpbmdzVGFiIGZyb20gXCIuLi9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBTZXR0aW5nc1N1YnNlY3Rpb24sIHsgU2V0dGluZ3NTdWJzZWN0aW9uVGV4dCB9IGZyb20gXCIuLi8uLi9zaGFyZWQvU2V0dGluZ3NTdWJzZWN0aW9uXCI7XG5pbXBvcnQgeyBTREtDb250ZXh0IH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2NvbnRleHRzL1NES0NvbnRleHRcIjtcbmltcG9ydCBVc2VyUGVyc29uYWxJbmZvU2V0dGluZ3MgZnJvbSBcIi4uLy4uL1VzZXJQZXJzb25hbEluZm9TZXR0aW5nc1wiO1xuaW1wb3J0IHsgdXNlTWF0cml4Q2xpZW50Q29udGV4dCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIGNsb3NlU2V0dGluZ3NGbjogKCkgPT4gdm9pZDtcbn1cblxuaW50ZXJmYWNlIEFjY291bnRTZWN0aW9uUHJvcHMge1xuICAgIGNhbkNoYW5nZVBhc3N3b3JkOiBib29sZWFuO1xuICAgIG9uUGFzc3dvcmRDaGFuZ2VFcnJvcjogKGU6IEVycm9yKSA9PiB2b2lkO1xuICAgIG9uUGFzc3dvcmRDaGFuZ2VkOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBBY2NvdW50U2VjdGlvbjogUmVhY3QuRkM8QWNjb3VudFNlY3Rpb25Qcm9wcz4gPSAoe1xuICAgIGNhbkNoYW5nZVBhc3N3b3JkLFxuICAgIG9uUGFzc3dvcmRDaGFuZ2VFcnJvcixcbiAgICBvblBhc3N3b3JkQ2hhbmdlZCxcbn0pID0+IHtcbiAgICBpZiAoIWNhbkNoYW5nZVBhc3N3b3JkKSByZXR1cm4gPD48Lz47XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8Z2VuZXJhbHxhY2NvdW50X3NlY3Rpb25cIil9XG4gICAgICAgICAgICAgICAgc3RyZXRjaENvbnRlbnRcbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFjY291bnRTZWN0aW9uXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uVGV4dD57X3QoXCJzZXR0aW5nc3xnZW5lcmFsfHBhc3N3b3JkX2NoYW5nZV9zZWN0aW9uXCIpfTwvU2V0dGluZ3NTdWJzZWN0aW9uVGV4dD5cbiAgICAgICAgICAgICAgICA8Q2hhbmdlUGFzc3dvcmRcbiAgICAgICAgICAgICAgICAgICAgcm93Q2xhc3NOYW1lPVwiXCJcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uS2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICBvbkVycm9yPXtvblBhc3N3b3JkQ2hhbmdlRXJyb3J9XG4gICAgICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e29uUGFzc3dvcmRDaGFuZ2VkfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L1NldHRpbmdzU3Vic2VjdGlvbj5cbiAgICAgICAgPC8+XG4gICAgKTtcbn07XG5cbmludGVyZmFjZSBNYW5hZ2VtZW50U2VjdGlvblByb3BzIHtcbiAgICBvbkRlYWN0aXZhdGVDbGlja2VkOiAoKSA9PiB2b2lkO1xufVxuXG5jb25zdCBNYW5hZ2VtZW50U2VjdGlvbjogUmVhY3QuRkM8TWFuYWdlbWVudFNlY3Rpb25Qcm9wcz4gPSAoeyBvbkRlYWN0aXZhdGVDbGlja2VkIH0pID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgICA8U2V0dGluZ3NTZWN0aW9uIGhlYWRpbmc9e190KFwic2V0dGluZ3N8Z2VuZXJhbHxkZWFjdGl2YXRlX3NlY3Rpb25cIil9PlxuICAgICAgICAgICAgPFNldHRpbmdzU3Vic2VjdGlvblxuICAgICAgICAgICAgICAgIGhlYWRpbmc9e190KFwic2V0dGluZ3N8Z2VuZXJhbHxhY2NvdW50X21hbmFnZW1lbnRfc2VjdGlvblwiKX1cbiAgICAgICAgICAgICAgICBkYXRhLXRlc3RpZD1cImFjY291bnQtbWFuYWdlbWVudC1zZWN0aW9uXCJcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj17X3QoXCJzZXR0aW5nc3xnZW5lcmFsfGRlYWN0aXZhdGVfd2FybmluZ1wiKX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXtvbkRlYWN0aXZhdGVDbGlja2VkfSBraW5kPVwiZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfGdlbmVyYWx8ZGVhY3RpdmF0ZV9zZWN0aW9uXCIpfVxuICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICA8L1NldHRpbmdzU2VjdGlvbj5cbiAgICApO1xufTtcblxuY29uc3QgQWNjb3VudFVzZXJTZXR0aW5nc1RhYjogUmVhY3QuRkM8SVByb3BzPiA9ICh7IGNsb3NlU2V0dGluZ3NGbiB9KSA9PiB7XG4gICAgY29uc3QgW2V4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmwsIHNldEV4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmxdID0gUmVhY3QudXNlU3RhdGU8c3RyaW5nIHwgdW5kZWZpbmVkPigpO1xuICAgIGNvbnN0IFtjYW5NYWtlM3BpZENoYW5nZXMsIHNldENhbk1ha2UzcGlkQ2hhbmdlc10gPSBSZWFjdC51c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gICAgY29uc3QgW2NhblNldERpc3BsYXlOYW1lLCBzZXRDYW5TZXREaXNwbGF5TmFtZV0gPSBSZWFjdC51c2VTdGF0ZTxib29sZWFuPihmYWxzZSk7XG4gICAgY29uc3QgW2NhblNldEF2YXRhciwgc2V0Q2FuU2V0QXZhdGFyXSA9IFJlYWN0LnVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcbiAgICBjb25zdCBbY2FuQ2hhbmdlUGFzc3dvcmQsIHNldENhbkNoYW5nZVBhc3N3b3JkXSA9IFJlYWN0LnVzZVN0YXRlPGJvb2xlYW4+KGZhbHNlKTtcblxuICAgIGNvbnN0IGNsaSA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcbiAgICBjb25zdCBzZGtDb250ZXh0ID0gdXNlQ29udGV4dChTREtDb250ZXh0KTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjYXBhYmlsaXRpZXMgPSAoYXdhaXQgY2xpLmdldENhcGFiaWxpdGllcygpKSA/PyB7fTtcbiAgICAgICAgICAgIGNvbnN0IGNoYW5nZVBhc3N3b3JkQ2FwID0gY2FwYWJpbGl0aWVzW1wibS5jaGFuZ2VfcGFzc3dvcmRcIl07XG5cbiAgICAgICAgICAgIC8vIFlvdSBjYW4gY2hhbmdlIHlvdXIgcGFzc3dvcmQgc28gbG9uZyBhcyB0aGUgY2FwYWJpbGl0eSBpc24ndCBleHBsaWNpdGx5IGRpc2FibGVkLiBUaGUgaW1wbGljaXRcbiAgICAgICAgICAgIC8vIGJlaGF2aW91ciBpcyB5b3UgY2FuIGNoYW5nZSB5b3VyIHBhc3N3b3JkIHdoZW4gdGhlIGNhcGFiaWxpdHkgaXMgbWlzc2luZyBvciBoYXMgbm90LWZhbHNlIGFzXG4gICAgICAgICAgICAvLyB0aGUgZW5hYmxlZCBmbGFnIHZhbHVlLlxuICAgICAgICAgICAgY29uc3QgY2FuQ2hhbmdlUGFzc3dvcmQgPSAhY2hhbmdlUGFzc3dvcmRDYXAgfHwgY2hhbmdlUGFzc3dvcmRDYXBbXCJlbmFibGVkXCJdICE9PSBmYWxzZTtcblxuICAgICAgICAgICAgYXdhaXQgc2RrQ29udGV4dC5vaWRjQ2xpZW50U3RvcmUucmVhZHlQcm9taXNlOyAvLyB3YWl0IGZvciB0aGUgc3RvcmUgdG8gYmUgcmVhZHlcbiAgICAgICAgICAgIGNvbnN0IGV4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmwgPSBzZGtDb250ZXh0Lm9pZGNDbGllbnRTdG9yZS5hY2NvdW50TWFuYWdlbWVudEVuZHBvaW50O1xuICAgICAgICAgICAgLy8gaHR0cHM6Ly9zcGVjLm1hdHJpeC5vcmcvdjEuNy9jbGllbnQtc2VydmVyLWFwaS8jbTNwaWRfY2hhbmdlcy1jYXBhYmlsaXR5XG4gICAgICAgICAgICAvLyBXZSBzdXBwb3J0IGFzIGZhciBiYWNrIGFzIHYxLjEgd2hpY2ggZG9lc24ndCBoYXZlIG0uM3BpZF9jaGFuZ2VzXG4gICAgICAgICAgICAvLyBzbyB0aGUgYmVoYXZpb3VyIGZvciB3aGVuIGl0IGlzIG1pc3NpbmcgaGFzIHRvIGJlIGFzc3VtZSB0cnVlXG4gICAgICAgICAgICBjb25zdCBjYW5NYWtlM3BpZENoYW5nZXMgPVxuICAgICAgICAgICAgICAgICFjYXBhYmlsaXRpZXNbXCJtLjNwaWRfY2hhbmdlc1wiXSB8fCBjYXBhYmlsaXRpZXNbXCJtLjNwaWRfY2hhbmdlc1wiXS5lbmFibGVkID09PSB0cnVlO1xuXG4gICAgICAgICAgICBjb25zdCBjYW5TZXREaXNwbGF5TmFtZSA9XG4gICAgICAgICAgICAgICAgIWNhcGFiaWxpdGllc1tcIm0uc2V0X2Rpc3BsYXluYW1lXCJdIHx8IGNhcGFiaWxpdGllc1tcIm0uc2V0X2Rpc3BsYXluYW1lXCJdLmVuYWJsZWQgPT09IHRydWU7XG4gICAgICAgICAgICBjb25zdCBjYW5TZXRBdmF0YXIgPSAhY2FwYWJpbGl0aWVzW1wibS5zZXRfYXZhdGFyX3VybFwiXSB8fCBjYXBhYmlsaXRpZXNbXCJtLnNldF9hdmF0YXJfdXJsXCJdLmVuYWJsZWQgPT09IHRydWU7XG5cbiAgICAgICAgICAgIHNldENhbk1ha2UzcGlkQ2hhbmdlcyhjYW5NYWtlM3BpZENoYW5nZXMpO1xuICAgICAgICAgICAgc2V0Q2FuU2V0RGlzcGxheU5hbWUoY2FuU2V0RGlzcGxheU5hbWUpO1xuICAgICAgICAgICAgc2V0Q2FuU2V0QXZhdGFyKGNhblNldEF2YXRhcik7XG4gICAgICAgICAgICBzZXRFeHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsKGV4dGVybmFsQWNjb3VudE1hbmFnZW1lbnRVcmwpO1xuICAgICAgICAgICAgc2V0Q2FuQ2hhbmdlUGFzc3dvcmQoY2FuQ2hhbmdlUGFzc3dvcmQpO1xuICAgICAgICB9KSgpO1xuICAgIH0sIFtjbGksIHNka0NvbnRleHQub2lkY0NsaWVudFN0b3JlXSk7XG5cbiAgICBjb25zdCBvblBhc3N3b3JkQ2hhbmdlRXJyb3IgPSB1c2VDYWxsYmFjaygoZXJyOiBFcnJvcik6IHZvaWQgPT4ge1xuICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gY2hhbmdlIHBhc3N3b3JkOiBcIiArIGVycik7XG5cbiAgICAgICAgbGV0IHVuZGVybHlpbmdFcnJvciA9IGVycjtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIFVzZXJGcmllbmRseUVycm9yICYmIGVyci5jYXVzZSBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB1bmRlcmx5aW5nRXJyb3IgPSBlcnIuY2F1c2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBleHRyYWN0RXJyb3JNZXNzYWdlRnJvbUVycm9yKFxuICAgICAgICAgICAgZXJyLFxuICAgICAgICAgICAgX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGVycm9yX3Bhc3N3b3JkX2NoYW5nZV91bmtub3duXCIsIHtcbiAgICAgICAgICAgICAgICBzdHJpbmdpZmllZEVycm9yOiBTdHJpbmcoZXJyKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2VUb0Rpc3BsYXkgPSBlcnJvck1lc3NhZ2U7XG4gICAgICAgIGlmICh1bmRlcmx5aW5nRXJyb3IgaW5zdGFuY2VvZiBIVFRQRXJyb3IgJiYgdW5kZXJseWluZ0Vycm9yLmh0dHBTdGF0dXMgPT09IDQwMykge1xuICAgICAgICAgICAgZXJyb3JNZXNzYWdlVG9EaXNwbGF5ID0gX3QoXCJzZXR0aW5nc3xnZW5lcmFsfGVycm9yX3Bhc3N3b3JkX2NoYW5nZV80MDNcIik7XG4gICAgICAgIH0gZWxzZSBpZiAodW5kZXJseWluZ0Vycm9yIGluc3RhbmNlb2YgSFRUUEVycm9yKSB7XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VUb0Rpc3BsYXkgPSBfdChcInNldHRpbmdzfGdlbmVyYWx8ZXJyb3JfcGFzc3dvcmRfY2hhbmdlX2h0dHBcIiwge1xuICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZSxcbiAgICAgICAgICAgICAgICBodHRwU3RhdHVzOiB1bmRlcmx5aW5nRXJyb3IuaHR0cFN0YXR1cyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVE9ETzogRmlndXJlIG91dCBhIGRlc2lnbiB0aGF0IGRvZXNuJ3QgaW52b2x2ZSByZXBsYWNpbmcgdGhlIGN1cnJlbnQgZGlhbG9nXG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgdGl0bGU6IF90KFwic2V0dGluZ3N8Z2VuZXJhbHxlcnJvcl9wYXNzd29yZF9jaGFuZ2VfdGl0bGVcIiksXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogZXJyb3JNZXNzYWdlVG9EaXNwbGF5LFxuICAgICAgICB9KTtcbiAgICB9LCBbXSk7XG5cbiAgICBjb25zdCBvblBhc3N3b3JkQ2hhbmdlZCA9IHVzZUNhbGxiYWNrKCgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBfdChcInNldHRpbmdzfGdlbmVyYWx8cGFzc3dvcmRfY2hhbmdlX3N1Y2Nlc3NcIik7XG4gICAgICAgIC8vIFRPRE86IEZpZ3VyZSBvdXQgYSBkZXNpZ24gdGhhdCBkb2Vzbid0IGludm9sdmUgcmVwbGFjaW5nIHRoZSBjdXJyZW50IGRpYWxvZ1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXJyb3JEaWFsb2csIHtcbiAgICAgICAgICAgIHRpdGxlOiBfdChcImNvbW1vbnxzdWNjZXNzXCIpLFxuICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgIH0pO1xuICAgIH0sIFtdKTtcblxuICAgIGNvbnN0IG9uRGVhY3RpdmF0ZUNsaWNrZWQgPSB1c2VDYWxsYmFjaygoKTogdm9pZCA9PiB7XG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhEZWFjdGl2YXRlQWNjb3VudERpYWxvZywge1xuICAgICAgICAgICAgb25GaW5pc2hlZDogKHN1Y2Nlc3MpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgY2xvc2VTZXR0aW5nc0ZuKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICB9LCBbY2xvc2VTZXR0aW5nc0ZuXSk7XG5cbiAgICBsZXQgYWNjb3VudE1hbmFnZW1lbnRTZWN0aW9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBpc0FjY291bnRNYW5hZ2VkRXh0ZXJuYWxseSA9IEJvb2xlYW4oZXh0ZXJuYWxBY2NvdW50TWFuYWdlbWVudFVybCk7XG4gICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoVUlGZWF0dXJlLkRlYWN0aXZhdGUpICYmICFpc0FjY291bnRNYW5hZ2VkRXh0ZXJuYWxseSkge1xuICAgICAgICBhY2NvdW50TWFuYWdlbWVudFNlY3Rpb24gPSA8TWFuYWdlbWVudFNlY3Rpb24gb25EZWFjdGl2YXRlQ2xpY2tlZD17b25EZWFjdGl2YXRlQ2xpY2tlZH0gLz47XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgICAgPFNldHRpbmdzVGFiIGRhdGEtdGVzdGlkPVwibXhfQWNjb3VudFVzZXJTZXR0aW5nc1RhYlwiPlxuICAgICAgICAgICAgPFNldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgICAgICA8VXNlclByb2ZpbGVTZXR0aW5nc1xuICAgICAgICAgICAgICAgICAgICBleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsPXtleHRlcm5hbEFjY291bnRNYW5hZ2VtZW50VXJsfVxuICAgICAgICAgICAgICAgICAgICBjYW5TZXREaXNwbGF5TmFtZT17Y2FuU2V0RGlzcGxheU5hbWV9XG4gICAgICAgICAgICAgICAgICAgIGNhblNldEF2YXRhcj17Y2FuU2V0QXZhdGFyfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPFVzZXJQZXJzb25hbEluZm9TZXR0aW5ncyBjYW5NYWtlM3BpZENoYW5nZXM9e2Nhbk1ha2UzcGlkQ2hhbmdlc30gLz5cbiAgICAgICAgICAgICAgICA8QWNjb3VudFNlY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgY2FuQ2hhbmdlUGFzc3dvcmQ9e2NhbkNoYW5nZVBhc3N3b3JkfVxuICAgICAgICAgICAgICAgICAgICBvblBhc3N3b3JkQ2hhbmdlZD17b25QYXNzd29yZENoYW5nZWR9XG4gICAgICAgICAgICAgICAgICAgIG9uUGFzc3dvcmRDaGFuZ2VFcnJvcj17b25QYXNzd29yZENoYW5nZUVycm9yfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L1NldHRpbmdzU2VjdGlvbj5cbiAgICAgICAgICAgIHthY2NvdW50TWFuYWdlbWVudFNlY3Rpb259XG4gICAgICAgIDwvU2V0dGluZ3NUYWI+XG4gICAgKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IEFjY291bnRVc2VyU2V0dGluZ3NUYWI7XG4iXSwi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