UNPKG

matrix-react-sdk

Version:
198 lines (196 loc) 36.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.NetworkDropdown = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _lodash = require("lodash"); var _react = _interopRequireWildcard(require("react")); var _matrix = require("matrix-js-sdk/src/matrix"); var _MenuItemRadio = require("../../../accessibility/context_menu/MenuItemRadio"); var _languageHandler = require("../../../languageHandler"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig")); var _SettingLevel = require("../../../settings/SettingLevel"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _GenericDropdownMenu = require("../../structures/GenericDropdownMenu"); var _TextInputDialog = _interopRequireDefault(require("../dialogs/TextInputDialog")); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _Validation = _interopRequireDefault(require("../elements/Validation")); 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; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const SETTING_NAME = "room_directory_servers"; const validServer = (0, _Validation.default)({ deriveData: async ({ value }) => { try { // check if we can successfully load this server's room directory await _MatrixClientPeg.MatrixClientPeg.safeGet().publicRooms({ limit: 1, server: value ?? undefined }); return {}; } catch (error) { return { error }; } }, rules: [{ key: "required", test: async ({ value }) => !!value, invalid: () => (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_required_invalid") }, { key: "available", final: true, test: async (_, { error }) => !error, valid: () => (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_available_valid"), invalid: ({ error }) => error instanceof _matrix.MatrixError && error.errcode === "M_FORBIDDEN" ? (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_available_invalid_forbidden") : (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_available_invalid") }], memoize: true }); function useSettingsValueWithSetter(settingName, level, roomId = null, excludeDefault = false) { const [value, setValue] = (0, _react.useState)(_SettingsStore.default.getValue(settingName, roomId ?? undefined, excludeDefault)); const setter = (0, _react.useCallback)(async value => { setValue(value); _SettingsStore.default.setValue(settingName, roomId, level, value); }, [level, roomId, settingName]); (0, _react.useEffect)(() => { const ref = _SettingsStore.default.watchSetting(settingName, roomId, () => { setValue(_SettingsStore.default.getValue(settingName, roomId, excludeDefault)); }); // clean-up return () => { _SettingsStore.default.unwatchSetting(ref); }; }, [settingName, roomId, excludeDefault]); return [value, setter]; } function removeAll(target, ...toRemove) { for (const value of toRemove) { target.delete(value); } } function useServers() { const [userDefinedServers, setUserDefinedServers] = useSettingsValueWithSetter(SETTING_NAME, _SettingLevel.SettingLevel.ACCOUNT); const homeServer = _MatrixClientPeg.MatrixClientPeg.safeGet().getDomain(); const configServers = new Set(_SdkConfig.default.getObject("room_directory")?.get("servers") ?? []); removeAll(configServers, homeServer); // configured servers take preference over user-defined ones, if one occurs in both ignore the latter one. const removableServers = new Set(userDefinedServers); removeAll(removableServers, homeServer); removeAll(removableServers, ...configServers); return { allServers: [ // we always show our connected HS, this takes precedence over it being configured or user-defined homeServer, ...Array.from(configServers).sort(), ...Array.from(removableServers).sort()], homeServer, userDefinedServers: Array.from(removableServers).sort(), setUserDefinedServers }; } const NetworkDropdown = ({ protocols, config, setConfig }) => { const { allServers, homeServer, userDefinedServers, setUserDefinedServers } = useServers(); const options = allServers.map(roomServer => _objectSpread({ key: { roomServer, instanceId: undefined }, label: roomServer, description: roomServer === homeServer ? (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_your_server_description") : null, options: [{ key: { roomServer, instanceId: undefined }, label: (0, _languageHandler._t)("common|matrix") }, ...(roomServer === homeServer && protocols ? Object.values(protocols).flatMap(protocol => protocol.instances).map(instance => ({ key: { roomServer, instanceId: instance.instance_id }, label: instance.desc })) : [])] }, userDefinedServers.includes(roomServer) ? { adornment: /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_NetworkDropdown_removeServer", alt: (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_remove_server_adornment", { roomServer }), onClick: () => setUserDefinedServers((0, _lodash.without)(userDefinedServers, roomServer)) }) } : {})); const addNewServer = (0, _react.useCallback)(({ closeMenu }) => /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", { className: "mx_GenericDropdownMenu_divider" }), /*#__PURE__*/_react.default.createElement(_MenuItemRadio.MenuItemRadio, { active: false, className: "mx_GenericDropdownMenu_Option mx_GenericDropdownMenu_Option--item", onClick: async () => { closeMenu(); const { finished } = _Modal.default.createDialog(_TextInputDialog.default, { title: (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_add_dialog_title"), description: (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_add_dialog_description"), button: (0, _languageHandler._t)("action|add"), hasCancel: false, placeholder: (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_add_dialog_placeholder"), validator: validServer, fixedWidth: false }, "mx_NetworkDropdown_dialog"); const [ok, newServer] = await finished; if (!ok) return; if (!allServers.includes(newServer)) { setUserDefinedServers([...userDefinedServers, newServer]); setConfig({ roomServer: newServer }); } } }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_GenericDropdownMenu_Option--label" }, /*#__PURE__*/_react.default.createElement("span", { className: "mx_NetworkDropdown_addServer" }, (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_add_server_option"))))), [allServers, setConfig, setUserDefinedServers, userDefinedServers]); return /*#__PURE__*/_react.default.createElement(_GenericDropdownMenu.GenericDropdownMenu, { className: "mx_NetworkDropdown_wrapper", value: config, toKey: config => config ? `${config.roomServer}-${config.instanceId}` : "null", options: options, onChange: option => setConfig(option), selectedLabel: option => option?.key ? (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_selected_label_instance", { server: option.key.roomServer, instance: option.key.instanceId ? option.label : "Matrix" }) : (0, _languageHandler._t)("spotlight|public_rooms|network_dropdown_selected_label"), AdditionalOptions: addNewServer }); }; exports.NetworkDropdown = NetworkDropdown; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9kYXNoIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX21hdHJpeCIsIl9NZW51SXRlbVJhZGlvIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9NYXRyaXhDbGllbnRQZWciLCJfTW9kYWwiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1Nka0NvbmZpZyIsIl9TZXR0aW5nTGV2ZWwiLCJfU2V0dGluZ3NTdG9yZSIsIl9HZW5lcmljRHJvcGRvd25NZW51IiwiX1RleHRJbnB1dERpYWxvZyIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX1ZhbGlkYXRpb24iLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJTRVRUSU5HX05BTUUiLCJ2YWxpZFNlcnZlciIsIndpdGhWYWxpZGF0aW9uIiwiZGVyaXZlRGF0YSIsInZhbHVlIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsInB1YmxpY1Jvb21zIiwibGltaXQiLCJzZXJ2ZXIiLCJ1bmRlZmluZWQiLCJlcnJvciIsInJ1bGVzIiwia2V5IiwidGVzdCIsImludmFsaWQiLCJfdCIsImZpbmFsIiwiXyIsInZhbGlkIiwiTWF0cml4RXJyb3IiLCJlcnJjb2RlIiwibWVtb2l6ZSIsInVzZVNldHRpbmdzVmFsdWVXaXRoU2V0dGVyIiwic2V0dGluZ05hbWUiLCJsZXZlbCIsInJvb21JZCIsImV4Y2x1ZGVEZWZhdWx0Iiwic2V0VmFsdWUiLCJ1c2VTdGF0ZSIsIlNldHRpbmdzU3RvcmUiLCJnZXRWYWx1ZSIsInNldHRlciIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwicmVmIiwid2F0Y2hTZXR0aW5nIiwidW53YXRjaFNldHRpbmciLCJyZW1vdmVBbGwiLCJ0YXJnZXQiLCJ0b1JlbW92ZSIsImRlbGV0ZSIsInVzZVNlcnZlcnMiLCJ1c2VyRGVmaW5lZFNlcnZlcnMiLCJzZXRVc2VyRGVmaW5lZFNlcnZlcnMiLCJTZXR0aW5nTGV2ZWwiLCJBQ0NPVU5UIiwiaG9tZVNlcnZlciIsImdldERvbWFpbiIsImNvbmZpZ1NlcnZlcnMiLCJTZXQiLCJTZGtDb25maWciLCJnZXRPYmplY3QiLCJyZW1vdmFibGVTZXJ2ZXJzIiwiYWxsU2VydmVycyIsIkFycmF5IiwiZnJvbSIsInNvcnQiLCJOZXR3b3JrRHJvcGRvd24iLCJwcm90b2NvbHMiLCJjb25maWciLCJzZXRDb25maWciLCJvcHRpb25zIiwibWFwIiwicm9vbVNlcnZlciIsImluc3RhbmNlSWQiLCJsYWJlbCIsImRlc2NyaXB0aW9uIiwidmFsdWVzIiwiZmxhdE1hcCIsInByb3RvY29sIiwiaW5zdGFuY2VzIiwiaW5zdGFuY2UiLCJpbnN0YW5jZV9pZCIsImRlc2MiLCJpbmNsdWRlcyIsImFkb3JubWVudCIsImNyZWF0ZUVsZW1lbnQiLCJjbGFzc05hbWUiLCJhbHQiLCJvbkNsaWNrIiwid2l0aG91dCIsImFkZE5ld1NlcnZlciIsImNsb3NlTWVudSIsIkZyYWdtZW50IiwiTWVudUl0ZW1SYWRpbyIsImFjdGl2ZSIsImZpbmlzaGVkIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJUZXh0SW5wdXREaWFsb2ciLCJ0aXRsZSIsImJ1dHRvbiIsImhhc0NhbmNlbCIsInBsYWNlaG9sZGVyIiwidmFsaWRhdG9yIiwiZml4ZWRXaWR0aCIsIm9rIiwibmV3U2VydmVyIiwiR2VuZXJpY0Ryb3Bkb3duTWVudSIsInRvS2V5Iiwib25DaGFuZ2UiLCJvcHRpb24iLCJzZWxlY3RlZExhYmVsIiwiQWRkaXRpb25hbE9wdGlvbnMiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvZGlyZWN0b3J5L05ldHdvcmtEcm9wZG93bi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgd2l0aG91dCB9IGZyb20gXCJsb2Rhc2hcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4RXJyb3IgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IE1lbnVJdGVtUmFkaW8gfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9jb250ZXh0X21lbnUvTWVudUl0ZW1SYWRpb1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgTW9kYWwgZnJvbSBcIi4uLy4uLy4uL01vZGFsXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi9TZGtDb25maWdcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBQcm90b2NvbHMgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRGlyZWN0b3J5VXRpbHNcIjtcbmltcG9ydCB7XG4gICAgQWRkaXRpb25hbE9wdGlvbnNQcm9wcyxcbiAgICBHZW5lcmljRHJvcGRvd25NZW51LFxuICAgIEdlbmVyaWNEcm9wZG93bk1lbnVJdGVtLFxufSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9HZW5lcmljRHJvcGRvd25NZW51XCI7XG5pbXBvcnQgVGV4dElucHV0RGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL1RleHRJbnB1dERpYWxvZ1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB3aXRoVmFsaWRhdGlvbiBmcm9tIFwiLi4vZWxlbWVudHMvVmFsaWRhdGlvblwiO1xuXG5jb25zdCBTRVRUSU5HX05BTUUgPSBcInJvb21fZGlyZWN0b3J5X3NlcnZlcnNcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyB7XG4gICAgcm9vbVNlcnZlcjogc3RyaW5nO1xuICAgIGluc3RhbmNlSWQ/OiBzdHJpbmc7XG59XG5cbmNvbnN0IHZhbGlkU2VydmVyID0gd2l0aFZhbGlkYXRpb248dW5kZWZpbmVkLCB7IGVycm9yPzogdW5rbm93biB9Pih7XG4gICAgZGVyaXZlRGF0YTogYXN5bmMgKHsgdmFsdWUgfSk6IFByb21pc2U8eyBlcnJvcj86IHVua25vd24gfT4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgd2UgY2FuIHN1Y2Nlc3NmdWxseSBsb2FkIHRoaXMgc2VydmVyJ3Mgcm9vbSBkaXJlY3RvcnlcbiAgICAgICAgICAgIGF3YWl0IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkucHVibGljUm9vbXMoe1xuICAgICAgICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgICAgICAgIHNlcnZlcjogdmFsdWUgPz8gdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4geyBlcnJvciB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICBydWxlczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IFwicmVxdWlyZWRcIixcbiAgICAgICAgICAgIHRlc3Q6IGFzeW5jICh7IHZhbHVlIH0pID0+ICEhdmFsdWUsXG4gICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiBfdChcInNwb3RsaWdodHxwdWJsaWNfcm9vbXN8bmV0d29ya19kcm9wZG93bl9yZXF1aXJlZF9pbnZhbGlkXCIpLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBrZXk6IFwiYXZhaWxhYmxlXCIsXG4gICAgICAgICAgICBmaW5hbDogdHJ1ZSxcbiAgICAgICAgICAgIHRlc3Q6IGFzeW5jIChfLCB7IGVycm9yIH0pID0+ICFlcnJvcixcbiAgICAgICAgICAgIHZhbGlkOiAoKSA9PiBfdChcInNwb3RsaWdodHxwdWJsaWNfcm9vbXN8bmV0d29ya19kcm9wZG93bl9hdmFpbGFibGVfdmFsaWRcIiksXG4gICAgICAgICAgICBpbnZhbGlkOiAoeyBlcnJvciB9KSA9PlxuICAgICAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgTWF0cml4RXJyb3IgJiYgZXJyb3IuZXJyY29kZSA9PT0gXCJNX0ZPUkJJRERFTlwiXG4gICAgICAgICAgICAgICAgICAgID8gX3QoXCJzcG90bGlnaHR8cHVibGljX3Jvb21zfG5ldHdvcmtfZHJvcGRvd25fYXZhaWxhYmxlX2ludmFsaWRfZm9yYmlkZGVuXCIpXG4gICAgICAgICAgICAgICAgICAgIDogX3QoXCJzcG90bGlnaHR8cHVibGljX3Jvb21zfG5ldHdvcmtfZHJvcGRvd25fYXZhaWxhYmxlX2ludmFsaWRcIiksXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBtZW1vaXplOiB0cnVlLFxufSk7XG5cbmZ1bmN0aW9uIHVzZVNldHRpbmdzVmFsdWVXaXRoU2V0dGVyPFQ+KFxuICAgIHNldHRpbmdOYW1lOiBzdHJpbmcsXG4gICAgbGV2ZWw6IFNldHRpbmdMZXZlbCxcbiAgICByb29tSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsLFxuICAgIGV4Y2x1ZGVEZWZhdWx0ID0gZmFsc2UsXG4pOiBbVCwgKHZhbHVlOiBUKSA9PiBQcm9taXNlPHZvaWQ+XSB7XG4gICAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZShTZXR0aW5nc1N0b3JlLmdldFZhbHVlPFQ+KHNldHRpbmdOYW1lLCByb29tSWQgPz8gdW5kZWZpbmVkLCBleGNsdWRlRGVmYXVsdCkpO1xuICAgIGNvbnN0IHNldHRlciA9IHVzZUNhbGxiYWNrKFxuICAgICAgICBhc3luYyAodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIHNldFZhbHVlKHZhbHVlKTtcbiAgICAgICAgICAgIFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoc2V0dGluZ05hbWUsIHJvb21JZCwgbGV2ZWwsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgW2xldmVsLCByb29tSWQsIHNldHRpbmdOYW1lXSxcbiAgICApO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgcmVmID0gU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoc2V0dGluZ05hbWUsIHJvb21JZCwgKCkgPT4ge1xuICAgICAgICAgICAgc2V0VmFsdWUoU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZTxUPihzZXR0aW5nTmFtZSwgcm9vbUlkLCBleGNsdWRlRGVmYXVsdCkpO1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gY2xlYW4tdXBcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgIFNldHRpbmdzU3RvcmUudW53YXRjaFNldHRpbmcocmVmKTtcbiAgICAgICAgfTtcbiAgICB9LCBbc2V0dGluZ05hbWUsIHJvb21JZCwgZXhjbHVkZURlZmF1bHRdKTtcblxuICAgIHJldHVybiBbdmFsdWUsIHNldHRlcl07XG59XG5cbmludGVyZmFjZSBTZXJ2ZXJMaXN0IHtcbiAgICBhbGxTZXJ2ZXJzOiBzdHJpbmdbXTtcbiAgICBob21lU2VydmVyOiBzdHJpbmc7XG4gICAgdXNlckRlZmluZWRTZXJ2ZXJzOiBzdHJpbmdbXTtcbiAgICBzZXRVc2VyRGVmaW5lZFNlcnZlcnM6IChzZXJ2ZXJzOiBzdHJpbmdbXSkgPT4gdm9pZDtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlQWxsPFQ+KHRhcmdldDogU2V0PFQ+LCAuLi50b1JlbW92ZTogVFtdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0b1JlbW92ZSkge1xuICAgICAgICB0YXJnZXQuZGVsZXRlKHZhbHVlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVzZVNlcnZlcnMoKTogU2VydmVyTGlzdCB7XG4gICAgY29uc3QgW3VzZXJEZWZpbmVkU2VydmVycywgc2V0VXNlckRlZmluZWRTZXJ2ZXJzXSA9IHVzZVNldHRpbmdzVmFsdWVXaXRoU2V0dGVyPHN0cmluZ1tdPihcbiAgICAgICAgU0VUVElOR19OQU1FLFxuICAgICAgICBTZXR0aW5nTGV2ZWwuQUNDT1VOVCxcbiAgICApO1xuXG4gICAgY29uc3QgaG9tZVNlcnZlciA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0RG9tYWluKCkhO1xuICAgIGNvbnN0IGNvbmZpZ1NlcnZlcnMgPSBuZXcgU2V0PHN0cmluZz4oU2RrQ29uZmlnLmdldE9iamVjdChcInJvb21fZGlyZWN0b3J5XCIpPy5nZXQoXCJzZXJ2ZXJzXCIpID8/IFtdKTtcbiAgICByZW1vdmVBbGwoY29uZmlnU2VydmVycywgaG9tZVNlcnZlcik7XG4gICAgLy8gY29uZmlndXJlZCBzZXJ2ZXJzIHRha2UgcHJlZmVyZW5jZSBvdmVyIHVzZXItZGVmaW5lZCBvbmVzLCBpZiBvbmUgb2NjdXJzIGluIGJvdGggaWdub3JlIHRoZSBsYXR0ZXIgb25lLlxuICAgIGNvbnN0IHJlbW92YWJsZVNlcnZlcnMgPSBuZXcgU2V0KHVzZXJEZWZpbmVkU2VydmVycyk7XG4gICAgcmVtb3ZlQWxsKHJlbW92YWJsZVNlcnZlcnMsIGhvbWVTZXJ2ZXIpO1xuICAgIHJlbW92ZUFsbChyZW1vdmFibGVTZXJ2ZXJzLCAuLi5jb25maWdTZXJ2ZXJzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGFsbFNlcnZlcnM6IFtcbiAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBzaG93IG91ciBjb25uZWN0ZWQgSFMsIHRoaXMgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIGl0IGJlaW5nIGNvbmZpZ3VyZWQgb3IgdXNlci1kZWZpbmVkXG4gICAgICAgICAgICBob21lU2VydmVyLFxuICAgICAgICAgICAgLi4uQXJyYXkuZnJvbShjb25maWdTZXJ2ZXJzKS5zb3J0KCksXG4gICAgICAgICAgICAuLi5BcnJheS5mcm9tKHJlbW92YWJsZVNlcnZlcnMpLnNvcnQoKSxcbiAgICAgICAgXSxcbiAgICAgICAgaG9tZVNlcnZlcixcbiAgICAgICAgdXNlckRlZmluZWRTZXJ2ZXJzOiBBcnJheS5mcm9tKHJlbW92YWJsZVNlcnZlcnMpLnNvcnQoKSxcbiAgICAgICAgc2V0VXNlckRlZmluZWRTZXJ2ZXJzLFxuICAgIH07XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHByb3RvY29sczogUHJvdG9jb2xzIHwgbnVsbDtcbiAgICBjb25maWc6IElQdWJsaWNSb29tRGlyZWN0b3J5Q29uZmlnIHwgbnVsbDtcbiAgICBzZXRDb25maWc6ICh2YWx1ZTogSVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgY29uc3QgTmV0d29ya0Ryb3Bkb3duOiBSZWFjdC5GQzxJUHJvcHM+ID0gKHsgcHJvdG9jb2xzLCBjb25maWcsIHNldENvbmZpZyB9KSA9PiB7XG4gICAgY29uc3QgeyBhbGxTZXJ2ZXJzLCBob21lU2VydmVyLCB1c2VyRGVmaW5lZFNlcnZlcnMsIHNldFVzZXJEZWZpbmVkU2VydmVycyB9ID0gdXNlU2VydmVycygpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogR2VuZXJpY0Ryb3Bkb3duTWVudUl0ZW08SVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsPltdID0gYWxsU2VydmVycy5tYXAoKHJvb21TZXJ2ZXIpID0+ICh7XG4gICAgICAgIGtleTogeyByb29tU2VydmVyLCBpbnN0YW5jZUlkOiB1bmRlZmluZWQgfSxcbiAgICAgICAgbGFiZWw6IHJvb21TZXJ2ZXIsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgcm9vbVNlcnZlciA9PT0gaG9tZVNlcnZlciA/IF90KFwic3BvdGxpZ2h0fHB1YmxpY19yb29tc3xuZXR3b3JrX2Ryb3Bkb3duX3lvdXJfc2VydmVyX2Rlc2NyaXB0aW9uXCIpIDogbnVsbCxcbiAgICAgICAgb3B0aW9uczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogeyByb29tU2VydmVyLCBpbnN0YW5jZUlkOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgICAgICBsYWJlbDogX3QoXCJjb21tb258bWF0cml4XCIpLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLihyb29tU2VydmVyID09PSBob21lU2VydmVyICYmIHByb3RvY29sc1xuICAgICAgICAgICAgICAgID8gT2JqZWN0LnZhbHVlcyhwcm90b2NvbHMpXG4gICAgICAgICAgICAgICAgICAgICAgLmZsYXRNYXAoKHByb3RvY29sKSA9PiBwcm90b2NvbC5pbnN0YW5jZXMpXG4gICAgICAgICAgICAgICAgICAgICAgLm1hcCgoaW5zdGFuY2UpID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogeyByb29tU2VydmVyLCBpbnN0YW5jZUlkOiBpbnN0YW5jZS5pbnN0YW5jZV9pZCB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogaW5zdGFuY2UuZGVzYyxcbiAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICA6IFtdKSxcbiAgICAgICAgXSxcbiAgICAgICAgLi4uKHVzZXJEZWZpbmVkU2VydmVycy5pbmNsdWRlcyhyb29tU2VydmVyKVxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgICBhZG9ybm1lbnQ6IChcbiAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9OZXR3b3JrRHJvcGRvd25fcmVtb3ZlU2VydmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0PXtfdChcInNwb3RsaWdodHxwdWJsaWNfcm9vbXN8bmV0d29ya19kcm9wZG93bl9yZW1vdmVfc2VydmVyX2Fkb3JubWVudFwiLCB7IHJvb21TZXJ2ZXIgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldFVzZXJEZWZpbmVkU2VydmVycyh3aXRob3V0KHVzZXJEZWZpbmVkU2VydmVycywgcm9vbVNlcnZlcikpfVxuICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBhZGROZXdTZXJ2ZXIgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKHsgY2xvc2VNZW51IH06IEFkZGl0aW9uYWxPcHRpb25zUHJvcHMpID0+IChcbiAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfR2VuZXJpY0Ryb3Bkb3duTWVudV9kaXZpZGVyXCIgLz5cbiAgICAgICAgICAgICAgICA8TWVudUl0ZW1SYWRpb1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmU9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9HZW5lcmljRHJvcGRvd25NZW51X09wdGlvbiBteF9HZW5lcmljRHJvcGRvd25NZW51X09wdGlvbi0taXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e2FzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlTWVudSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBmaW5pc2hlZCB9ID0gTW9kYWwuY3JlYXRlRGlhbG9nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRJbnB1dERpYWxvZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcInNwb3RsaWdodHxwdWJsaWNfcm9vbXN8bmV0d29ya19kcm9wZG93bl9hZGRfZGlhbG9nX3RpdGxlXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogX3QoXCJzcG90bGlnaHR8cHVibGljX3Jvb21zfG5ldHdvcmtfZHJvcGRvd25fYWRkX2RpYWxvZ19kZXNjcmlwdGlvblwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uOiBfdChcImFjdGlvbnxhZGRcIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0NhbmNlbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyOiBfdChcInNwb3RsaWdodHxwdWJsaWNfcm9vbXN8bmV0d29ya19kcm9wZG93bl9hZGRfZGlhbG9nX3BsYWNlaG9sZGVyXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3I6IHZhbGlkU2VydmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZFdpZHRoOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibXhfTmV0d29ya0Ryb3Bkb3duX2RpYWxvZ1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW29rLCBuZXdTZXJ2ZXJdID0gYXdhaXQgZmluaXNoZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9rKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsU2VydmVycy5pbmNsdWRlcyhuZXdTZXJ2ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXNlckRlZmluZWRTZXJ2ZXJzKFsuLi51c2VyRGVmaW5lZFNlcnZlcnMsIG5ld1NlcnZlcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldENvbmZpZyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb21TZXJ2ZXI6IG5ld1NlcnZlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfR2VuZXJpY0Ryb3Bkb3duTWVudV9PcHRpb24tLWxhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9OZXR3b3JrRHJvcGRvd25fYWRkU2VydmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwic3BvdGxpZ2h0fHB1YmxpY19yb29tc3xuZXR3b3JrX2Ryb3Bkb3duX2FkZF9zZXJ2ZXJfb3B0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L01lbnVJdGVtUmFkaW8+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgKSxcbiAgICAgICAgW2FsbFNlcnZlcnMsIHNldENvbmZpZywgc2V0VXNlckRlZmluZWRTZXJ2ZXJzLCB1c2VyRGVmaW5lZFNlcnZlcnNdLFxuICAgICk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8R2VuZXJpY0Ryb3Bkb3duTWVudVxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTmV0d29ya0Ryb3Bkb3duX3dyYXBwZXJcIlxuICAgICAgICAgICAgdmFsdWU9e2NvbmZpZ31cbiAgICAgICAgICAgIHRvS2V5PXsoY29uZmlnOiBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyB8IG51bGwpID0+XG4gICAgICAgICAgICAgICAgY29uZmlnID8gYCR7Y29uZmlnLnJvb21TZXJ2ZXJ9LSR7Y29uZmlnLmluc3RhbmNlSWR9YCA6IFwibnVsbFwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvcHRpb25zPXtvcHRpb25zfVxuICAgICAgICAgICAgb25DaGFuZ2U9eyhvcHRpb24pID0+IHNldENvbmZpZyhvcHRpb24pfVxuICAgICAgICAgICAgc2VsZWN0ZWRMYWJlbD17KG9wdGlvbikgPT5cbiAgICAgICAgICAgICAgICBvcHRpb24/LmtleVxuICAgICAgICAgICAgICAgICAgICA/IF90KFwic3BvdGxpZ2h0fHB1YmxpY19yb29tc3xuZXR3b3JrX2Ryb3Bkb3duX3NlbGVjdGVkX2xhYmVsX2luc3RhbmNlXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyOiBvcHRpb24ua2V5LnJvb21TZXJ2ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlOiBvcHRpb24ua2V5Lmluc3RhbmNlSWQgPyBvcHRpb24ubGFiZWwgOiBcIk1hdHJpeFwiLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIDogX3QoXCJzcG90bGlnaHR8cHVibGljX3Jvb21zfG5ldHdvcmtfZHJvcGRvd25fc2VsZWN0ZWRfbGFiZWxcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEFkZGl0aW9uYWxPcHRpb25zPXthZGROZXdTZXJ2ZXJ9XG4gICAgICAgIC8+XG4gICAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBQyx1QkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsT0FBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksY0FBQSxHQUFBSixPQUFBO0FBQ0EsSUFBQUssZ0JBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLGdCQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxNQUFBLEdBQUFDLHNCQUFBLENBQUFSLE9BQUE7QUFDQSxJQUFBUyxVQUFBLEdBQUFELHNCQUFBLENBQUFSLE9BQUE7QUFDQSxJQUFBVSxhQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxjQUFBLEdBQUFILHNCQUFBLENBQUFSLE9BQUE7QUFFQSxJQUFBWSxvQkFBQSxHQUFBWixPQUFBO0FBS0EsSUFBQWEsZ0JBQUEsR0FBQUwsc0JBQUEsQ0FBQVIsT0FBQTtBQUNBLElBQUFjLGlCQUFBLEdBQUFOLHNCQUFBLENBQUFSLE9BQUE7QUFDQSxJQUFBZSxXQUFBLEdBQUFQLHNCQUFBLENBQUFSLE9BQUE7QUFBb0QsU0FBQWdCLHlCQUFBQyxDQUFBLDZCQUFBQyxPQUFBLG1CQUFBQyxDQUFBLE9BQUFELE9BQUEsSUFBQUUsQ0FBQSxPQUFBRixPQUFBLFlBQUFGLHdCQUFBLFlBQUFBLENBQUFDLENBQUEsV0FBQUEsQ0FBQSxHQUFBRyxDQUFBLEdBQUFELENBQUEsS0FBQUYsQ0FBQTtBQUFBLFNBQUFmLHdCQUFBZSxDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENB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