matrix-react-sdk
Version:
SDK for matrix.org using React
143 lines (140 loc) • 21.8 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.usePublicRoomDirectory = exports.ALL_ROOMS = void 0;
var _react = require("react");
var _MatrixClientPeg = require("../MatrixClientPeg");
var _SdkConfig = _interopRequireDefault(require("../SdkConfig"));
var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore"));
var _useLatestResult = require("./useLatestResult");
var _useSettings = require("./useSettings");
/*
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 ALL_ROOMS = exports.ALL_ROOMS = "ALL_ROOMS";
const LAST_SERVER_KEY = "mx_last_room_directory_server";
const LAST_INSTANCE_KEY = "mx_last_room_directory_instance";
let thirdParty;
const NSFW_KEYWORD = "nsfw";
const cheapNsfwFilter = room => !room.name?.toLocaleLowerCase().includes(NSFW_KEYWORD) && !room.topic?.toLocaleLowerCase().includes(NSFW_KEYWORD);
const usePublicRoomDirectory = () => {
const [publicRooms, setPublicRooms] = (0, _react.useState)([]);
const [config, setConfigInternal] = (0, _react.useState)(undefined);
const [protocols, setProtocols] = (0, _react.useState)(null);
const [ready, setReady] = (0, _react.useState)(false);
const [loading, setLoading] = (0, _react.useState)(false);
const [error, setError] = (0, _react.useState)();
const [updateQuery, updateResult] = (0, _useLatestResult.useLatestResult)(setPublicRooms);
const showNsfwPublicRooms = (0, _useSettings.useSettingValue)("SpotlightSearch.showNsfwPublicRooms");
async function initProtocols() {
if (!_MatrixClientPeg.MatrixClientPeg.get()) {
// We may not have a client yet when invoked from welcome page
setReady(true);
} else if (thirdParty) {
setProtocols(thirdParty);
} else {
const response = await _MatrixClientPeg.MatrixClientPeg.safeGet().getThirdpartyProtocols();
thirdParty = response;
setProtocols(response);
}
}
function setConfig(config) {
if (!ready) {
throw new Error("public room configuration not initialised yet");
} else {
setConfigInternal(config);
}
}
const search = (0, _react.useCallback)(async ({
limit = 20,
query,
roomTypes
}) => {
const opts = {
limit
};
if (config?.roomServer != _MatrixClientPeg.MatrixClientPeg.safeGet().getDomain()) {
opts.server = config?.roomServer;
}
if (config?.instanceId === ALL_ROOMS) {
opts.include_all_networks = true;
} else if (config?.instanceId) {
opts.third_party_instance_id = config.instanceId;
}
if (query || roomTypes) {
opts.filter = {
generic_search_term: query,
room_types: roomTypes && (await _MatrixClientPeg.MatrixClientPeg.safeGet().doesServerSupportUnstableFeature("org.matrix.msc3827.stable")) ? Array.from(roomTypes) : undefined
};
}
updateQuery(opts);
setLoading(true);
setError(undefined);
try {
const {
chunk
} = await _MatrixClientPeg.MatrixClientPeg.safeGet().publicRooms(opts);
updateResult(opts, showNsfwPublicRooms ? chunk : chunk.filter(cheapNsfwFilter));
return true;
} catch (e) {
setError(e instanceof Error ? e : true);
console.error("Could not fetch public rooms for params", opts, e);
updateResult(opts, []);
return false;
} finally {
setLoading(false);
}
}, [config, updateQuery, updateResult, showNsfwPublicRooms]);
(0, _react.useEffect)(() => {
initProtocols();
}, []);
(0, _react.useEffect)(() => {
if (protocols === null) {
return;
}
const myHomeserver = _MatrixClientPeg.MatrixClientPeg.safeGet().getDomain();
const lsRoomServer = localStorage.getItem(LAST_SERVER_KEY);
const lsInstanceId = localStorage.getItem(LAST_INSTANCE_KEY) ?? undefined;
let roomServer = myHomeserver;
if (lsRoomServer && (_SdkConfig.default.getObject("room_directory")?.get("servers")?.includes(lsRoomServer) || _SettingsStore.default.getValue("room_directory_servers")?.includes(lsRoomServer))) {
roomServer = lsRoomServer;
}
let instanceId = undefined;
if (roomServer === myHomeserver && (lsInstanceId === ALL_ROOMS || Object.values(protocols).some(p => {
p.instances.some(i => i.instance_id === lsInstanceId);
}))) {
instanceId = lsInstanceId;
}
setReady(true);
setConfigInternal({
roomServer,
instanceId
});
}, [protocols]);
(0, _react.useEffect)(() => {
if (!config) return;
localStorage.setItem(LAST_SERVER_KEY, config.roomServer);
if (config.instanceId) {
localStorage.setItem(LAST_INSTANCE_KEY, config.instanceId);
} else {
localStorage.removeItem(LAST_INSTANCE_KEY);
}
}, [config]);
return {
ready,
loading,
publicRooms,
protocols,
config,
search,
setConfig,
error
};
};
exports.usePublicRoomDirectory = usePublicRoomDirectory;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJyZXF1aXJlIiwiX01hdHJpeENsaWVudFBlZyIsIl9TZGtDb25maWciLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX1NldHRpbmdzU3RvcmUiLCJfdXNlTGF0ZXN0UmVzdWx0IiwiX3VzZVNldHRpbmdzIiwiQUxMX1JPT01TIiwiZXhwb3J0cyIsIkxBU1RfU0VSVkVSX0tFWSIsIkxBU1RfSU5TVEFOQ0VfS0VZIiwidGhpcmRQYXJ0eSIsIk5TRldfS0VZV09SRCIsImNoZWFwTnNmd0ZpbHRlciIsInJvb20iLCJuYW1lIiwidG9Mb2NhbGVMb3dlckNhc2UiLCJpbmNsdWRlcyIsInRvcGljIiwidXNlUHVibGljUm9vbURpcmVjdG9yeSIsInB1YmxpY1Jvb21zIiwic2V0UHVibGljUm9vbXMiLCJ1c2VTdGF0ZSIsImNvbmZpZyIsInNldENvbmZpZ0ludGVybmFsIiwidW5kZWZpbmVkIiwicHJvdG9jb2xzIiwic2V0UHJvdG9jb2xzIiwicmVhZHkiLCJzZXRSZWFkeSIsImxvYWRpbmciLCJzZXRMb2FkaW5nIiwiZXJyb3IiLCJzZXRFcnJvciIsInVwZGF0ZVF1ZXJ5IiwidXBkYXRlUmVzdWx0IiwidXNlTGF0ZXN0UmVzdWx0Iiwic2hvd05zZndQdWJsaWNSb29tcyIsInVzZVNldHRpbmdWYWx1ZSIsImluaXRQcm90b2NvbHMiLCJNYXRyaXhDbGllbnRQZWciLCJnZXQiLCJyZXNwb25zZSIsInNhZmVHZXQiLCJnZXRUaGlyZHBhcnR5UHJvdG9jb2xzIiwic2V0Q29uZmlnIiwiRXJyb3IiLCJzZWFyY2giLCJ1c2VDYWxsYmFjayIsImxpbWl0IiwicXVlcnkiLCJyb29tVHlwZXMiLCJvcHRzIiwicm9vbVNlcnZlciIsImdldERvbWFpbiIsInNlcnZlciIsImluc3RhbmNlSWQiLCJpbmNsdWRlX2FsbF9uZXR3b3JrcyIsInRoaXJkX3BhcnR5X2luc3RhbmNlX2lkIiwiZmlsdGVyIiwiZ2VuZXJpY19zZWFyY2hfdGVybSIsInJvb21fdHlwZXMiLCJkb2VzU2VydmVyU3VwcG9ydFVuc3RhYmxlRmVhdHVyZSIsIkFycmF5IiwiZnJvbSIsImNodW5rIiwiZSIsImNvbnNvbGUiLCJ1c2VFZmZlY3QiLCJteUhvbWVzZXJ2ZXIiLCJsc1Jvb21TZXJ2ZXIiLCJsb2NhbFN0b3JhZ2UiLCJnZXRJdGVtIiwibHNJbnN0YW5jZUlkIiwiU2RrQ29uZmlnIiwiZ2V0T2JqZWN0IiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiT2JqZWN0IiwidmFsdWVzIiwic29tZSIsInAiLCJpbnN0YW5jZXMiLCJpIiwiaW5zdGFuY2VfaWQiLCJzZXRJdGVtIiwicmVtb3ZlSXRlbSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ob29rcy91c2VQdWJsaWNSb29tRGlyZWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIyIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCB7IFJvb21UeXBlLCBJUHJvdG9jb2wsIElQdWJsaWNSb29tc0NodW5rUm9vbSwgSVJvb21EaXJlY3RvcnlPcHRpb25zIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHsgSVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfSBmcm9tIFwiLi4vY29tcG9uZW50cy92aWV3cy9kaXJlY3RvcnkvTmV0d29ya0Ryb3Bkb3duXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi9TZGtDb25maWdcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgeyBQcm90b2NvbHMgfSBmcm9tIFwiLi4vdXRpbHMvRGlyZWN0b3J5VXRpbHNcIjtcbmltcG9ydCB7IHVzZUxhdGVzdFJlc3VsdCB9IGZyb20gXCIuL3VzZUxhdGVzdFJlc3VsdFwiO1xuaW1wb3J0IHsgdXNlU2V0dGluZ1ZhbHVlIH0gZnJvbSBcIi4vdXNlU2V0dGluZ3NcIjtcblxuZXhwb3J0IGNvbnN0IEFMTF9ST09NUyA9IFwiQUxMX1JPT01TXCI7XG5jb25zdCBMQVNUX1NFUlZFUl9LRVkgPSBcIm14X2xhc3Rfcm9vbV9kaXJlY3Rvcnlfc2VydmVyXCI7XG5jb25zdCBMQVNUX0lOU1RBTkNFX0tFWSA9IFwibXhfbGFzdF9yb29tX2RpcmVjdG9yeV9pbnN0YW5jZVwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIElQdWJsaWNSb29tc09wdHMge1xuICAgIGxpbWl0OiBudW1iZXI7XG4gICAgcXVlcnk/OiBzdHJpbmc7XG4gICAgcm9vbVR5cGVzPzogU2V0PFJvb21UeXBlIHwgbnVsbD47XG59XG5cbmxldCB0aGlyZFBhcnR5OiBQcm90b2NvbHM7XG5cbmNvbnN0IE5TRldfS0VZV09SRCA9IFwibnNmd1wiO1xuY29uc3QgY2hlYXBOc2Z3RmlsdGVyID0gKHJvb206IElQdWJsaWNSb29tc0NodW5rUm9vbSk6IGJvb2xlYW4gPT5cbiAgICAhcm9vbS5uYW1lPy50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKE5TRldfS0VZV09SRCkgJiYgIXJvb20udG9waWM/LnRvTG9jYWxlTG93ZXJDYXNlKCkuaW5jbHVkZXMoTlNGV19LRVlXT1JEKTtcblxuZXhwb3J0IGNvbnN0IHVzZVB1YmxpY1Jvb21EaXJlY3RvcnkgPSAoKToge1xuICAgIHJlYWR5OiBib29sZWFuO1xuICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgcHVibGljUm9vbXM6IElQdWJsaWNSb29tc0NodW5rUm9vbVtdO1xuICAgIHByb3RvY29sczogUHJvdG9jb2xzIHwgbnVsbDtcbiAgICBjb25maWc/OiBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyB8IG51bGw7XG4gICAgc2V0Q29uZmlnKGNvbmZpZzogSVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsKTogdm9pZDtcbiAgICBzZWFyY2gob3B0czogSVB1YmxpY1Jvb21zT3B0cyk6IFByb21pc2U8Ym9vbGVhbj47XG4gICAgZXJyb3I/OiBFcnJvciB8IHRydWU7IC8vIHRydWUgaWYgYW4gdW5rbm93biBlcnJvciBpcyBlbmNvdW50ZXJlZFxufSA9PiB7XG4gICAgY29uc3QgW3B1YmxpY1Jvb21zLCBzZXRQdWJsaWNSb29tc10gPSB1c2VTdGF0ZTxJUHVibGljUm9vbXNDaHVua1Jvb21bXT4oW10pO1xuXG4gICAgY29uc3QgW2NvbmZpZywgc2V0Q29uZmlnSW50ZXJuYWxdID0gdXNlU3RhdGU8SVB1YmxpY1Jvb21EaXJlY3RvcnlDb25maWcgfCBudWxsIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpO1xuXG4gICAgY29uc3QgW3Byb3RvY29scywgc2V0UHJvdG9jb2xzXSA9IHVzZVN0YXRlPFByb3RvY29scyB8IG51bGw+KG51bGwpO1xuXG4gICAgY29uc3QgW3JlYWR5LCBzZXRSZWFkeV0gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmddID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8RXJyb3IgfCB0cnVlIHwgdW5kZWZpbmVkPigpO1xuXG4gICAgY29uc3QgW3VwZGF0ZVF1ZXJ5LCB1cGRhdGVSZXN1bHRdID0gdXNlTGF0ZXN0UmVzdWx0PElSb29tRGlyZWN0b3J5T3B0aW9ucywgSVB1YmxpY1Jvb21zQ2h1bmtSb29tW10+KHNldFB1YmxpY1Jvb21zKTtcblxuICAgIGNvbnN0IHNob3dOc2Z3UHVibGljUm9vbXMgPSB1c2VTZXR0aW5nVmFsdWU8Ym9vbGVhbj4oXCJTcG90bGlnaHRTZWFyY2guc2hvd05zZndQdWJsaWNSb29tc1wiKTtcblxuICAgIGFzeW5jIGZ1bmN0aW9uIGluaXRQcm90b2NvbHMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGlmICghTWF0cml4Q2xpZW50UGVnLmdldCgpKSB7XG4gICAgICAgICAgICAvLyBXZSBtYXkgbm90IGhhdmUgYSBjbGllbnQgeWV0IHdoZW4gaW52b2tlZCBmcm9tIHdlbGNvbWUgcGFnZVxuICAgICAgICAgICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcmRQYXJ0eSkge1xuICAgICAgICAgICAgc2V0UHJvdG9jb2xzKHRoaXJkUGFydHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmdldFRoaXJkcGFydHlQcm90b2NvbHMoKTtcbiAgICAgICAgICAgIHRoaXJkUGFydHkgPSByZXNwb25zZTtcbiAgICAgICAgICAgIHNldFByb3RvY29scyhyZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRDb25maWcoY29uZmlnOiBJUHVibGljUm9vbURpcmVjdG9yeUNvbmZpZyk6IHZvaWQge1xuICAgICAgICBpZiAoIXJlYWR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJwdWJsaWMgcm9vbSBjb25maWd1cmF0aW9uIG5vdCBpbml0aWFsaXNlZCB5ZXRcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRDb25maWdJbnRlcm5hbChjb25maWcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc2VhcmNoID0gdXNlQ2FsbGJhY2soXG4gICAgICAgIGFzeW5jICh7IGxpbWl0ID0gMjAsIHF1ZXJ5LCByb29tVHlwZXMgfTogSVB1YmxpY1Jvb21zT3B0cyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgb3B0czogSVJvb21EaXJlY3RvcnlPcHRpb25zID0geyBsaW1pdCB9O1xuXG4gICAgICAgICAgICBpZiAoY29uZmlnPy5yb29tU2VydmVyICE9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0RG9tYWluKCkpIHtcbiAgICAgICAgICAgICAgICBvcHRzLnNlcnZlciA9IGNvbmZpZz8ucm9vbVNlcnZlcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGNvbmZpZz8uaW5zdGFuY2VJZCA9PT0gQUxMX1JPT01TKSB7XG4gICAgICAgICAgICAgICAgb3B0cy5pbmNsdWRlX2FsbF9uZXR3b3JrcyA9IHRydWU7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbmZpZz8uaW5zdGFuY2VJZCkge1xuICAgICAgICAgICAgICAgIG9wdHMudGhpcmRfcGFydHlfaW5zdGFuY2VfaWQgPSBjb25maWcuaW5zdGFuY2VJZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHF1ZXJ5IHx8IHJvb21UeXBlcykge1xuICAgICAgICAgICAgICAgIG9wdHMuZmlsdGVyID0ge1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3NlYXJjaF90ZXJtOiBxdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgcm9vbV90eXBlczpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb21UeXBlcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKGF3YWl0IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZG9lc1NlcnZlclN1cHBvcnRVbnN0YWJsZUZlYXR1cmUoXCJvcmcubWF0cml4Lm1zYzM4Mjcuc3RhYmxlXCIpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbTxSb29tVHlwZSB8IG51bGw+KHJvb21UeXBlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB1cGRhdGVRdWVyeShvcHRzKTtcbiAgICAgICAgICAgIHNldExvYWRpbmcodHJ1ZSk7XG4gICAgICAgICAgICBzZXRFcnJvcih1bmRlZmluZWQpO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGNodW5rIH0gPSBhd2FpdCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLnB1YmxpY1Jvb21zKG9wdHMpO1xuICAgICAgICAgICAgICAgIHVwZGF0ZVJlc3VsdChvcHRzLCBzaG93TnNmd1B1YmxpY1Jvb21zID8gY2h1bmsgOiBjaHVuay5maWx0ZXIoY2hlYXBOc2Z3RmlsdGVyKSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgc2V0RXJyb3IoZSBpbnN0YW5jZW9mIEVycm9yID8gZSA6IHRydWUpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgZmV0Y2ggcHVibGljIHJvb21zIGZvciBwYXJhbXNcIiwgb3B0cywgZSk7XG4gICAgICAgICAgICAgICAgdXBkYXRlUmVzdWx0KG9wdHMsIFtdKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgIHNldExvYWRpbmcoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbY29uZmlnLCB1cGRhdGVRdWVyeSwgdXBkYXRlUmVzdWx0LCBzaG93TnNmd1B1YmxpY1Jvb21zXSxcbiAgICApO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgaW5pdFByb3RvY29scygpO1xuICAgIH0sIFtdKTtcblxuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChwcm90b2NvbHMgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG15SG9tZXNlcnZlciA9IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuZ2V0RG9tYWluKCkhO1xuICAgICAgICBjb25zdCBsc1Jvb21TZXJ2ZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShMQVNUX1NFUlZFUl9LRVkpO1xuICAgICAgICBjb25zdCBsc0luc3RhbmNlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKExBU1RfSU5TVEFOQ0VfS0VZKSA/PyB1bmRlZmluZWQ7XG5cbiAgICAgICAgbGV0IHJvb21TZXJ2ZXI6IHN0cmluZyA9IG15SG9tZXNlcnZlcjtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbHNSb29tU2VydmVyICYmXG4gICAgICAgICAgICAoU2RrQ29uZmlnLmdldE9iamVjdChcInJvb21fZGlyZWN0b3J5XCIpPy5nZXQoXCJzZXJ2ZXJzXCIpPy5pbmNsdWRlcyhsc1Jvb21TZXJ2ZXIpIHx8XG4gICAgICAgICAgICAgICAgU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInJvb21fZGlyZWN0b3J5X3NlcnZlcnNcIik/LmluY2x1ZGVzKGxzUm9vbVNlcnZlcikpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcm9vbVNlcnZlciA9IGxzUm9vbVNlcnZlciE7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaW5zdGFuY2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICByb29tU2VydmVyID09PSBteUhvbWVzZXJ2ZXIgJiZcbiAgICAgICAgICAgIChsc0luc3RhbmNlSWQgPT09IEFMTF9ST09NUyB8fFxuICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMocHJvdG9jb2xzKS5zb21lKChwOiBJUHJvdG9jb2wpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcC5pbnN0YW5jZXMuc29tZSgoaSkgPT4gaS5pbnN0YW5jZV9pZCA9PT0gbHNJbnN0YW5jZUlkKTtcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpbnN0YW5jZUlkID0gbHNJbnN0YW5jZUlkO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0UmVhZHkodHJ1ZSk7XG4gICAgICAgIHNldENvbmZpZ0ludGVybmFsKHsgcm9vbVNlcnZlciwgaW5zdGFuY2VJZCB9KTtcbiAgICB9LCBbcHJvdG9jb2xzXSk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAoIWNvbmZpZykgcmV0dXJuO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMQVNUX1NFUlZFUl9LRVksIGNvbmZpZy5yb29tU2VydmVyKTtcbiAgICAgICAgaWYgKGNvbmZpZy5pbnN0YW5jZUlkKSB7XG4gICAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShMQVNUX0lOU1RBTkNFX0tFWSwgY29uZmlnLmluc3RhbmNlSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oTEFTVF9JTlNUQU5DRV9LRVkpO1xuICAgICAgICB9XG4gICAgfSwgW2NvbmZpZ10pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmVhZHksXG4gICAgICAgIGxvYWRpbmcsXG4gICAgICAgIHB1YmxpY1Jvb21zLFxuICAgICAgICBwcm90b2NvbHMsXG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgc2VhcmNoLFxuICAgICAgICBzZXRDb25maWcsXG4gICAgICAgIGVycm9yLFxuICAgIH0gYXMgY29uc3Q7XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBU0EsSUFBQUEsTUFBQSxHQUFBQyxPQUFBO0FBR0EsSUFBQUMsZ0JBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQUNBLElBQUFJLGNBQUEsR0FBQUQsc0JBQUEsQ0FBQUgsT0FBQTtBQUVBLElB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