UNPKG

matrix-react-sdk

Version:
169 lines (162 loc) 24.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.Mjolnir = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _MatrixClientPeg = require("../MatrixClientPeg"); var _BanList = require("./BanList"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); var _languageHandler = require("../languageHandler"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _SettingLevel = require("../settings/SettingLevel"); var _actions = require("../dispatcher/actions"); /* Copyright 2024 New Vector Ltd. Copyright 2019 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. */ // TODO: Move this and related files to the js-sdk or something once finalized. class Mjolnir { constructor() { (0, _defineProperty2.default)(this, "_lists", []); // eslint-disable-line @typescript-eslint/naming-convention (0, _defineProperty2.default)(this, "_roomIds", []); // eslint-disable-line @typescript-eslint/naming-convention (0, _defineProperty2.default)(this, "mjolnirWatchRef", null); (0, _defineProperty2.default)(this, "dispatcherRef", null); (0, _defineProperty2.default)(this, "onAction", payload => { if (payload["action"] === "setup_mjolnir") { _logger.logger.log("Setting up Mjolnir: after sync"); this.setup(); } }); (0, _defineProperty2.default)(this, "onEvent", event => { if (!_MatrixClientPeg.MatrixClientPeg.get()) return; if (!this._roomIds.includes(event.getRoomId())) return; if (!_BanList.ALL_RULE_TYPES.includes(event.getType())) return; this.updateLists(this._roomIds); }); } get roomIds() { return this._roomIds; } get lists() { return this._lists; } start() { this.mjolnirWatchRef = _SettingsStore.default.watchSetting("mjolnirRooms", null, this.onListsChanged.bind(this)); this.dispatcherRef = _dispatcher.default.register(this.onAction); _dispatcher.default.dispatch({ action: _actions.Action.DoAfterSyncPrepared, deferred_action: { action: "setup_mjolnir" } }); } setup() { if (!_MatrixClientPeg.MatrixClientPeg.get()) return; this.updateLists(_SettingsStore.default.getValue("mjolnirRooms")); _MatrixClientPeg.MatrixClientPeg.get().on(_matrix.RoomStateEvent.Events, this.onEvent); } stop() { if (this.mjolnirWatchRef) { _SettingsStore.default.unwatchSetting(this.mjolnirWatchRef); this.mjolnirWatchRef = null; } if (this.dispatcherRef) { _dispatcher.default.unregister(this.dispatcherRef); this.dispatcherRef = null; } _MatrixClientPeg.MatrixClientPeg.get()?.removeListener(_matrix.RoomStateEvent.Events, this.onEvent); } async getOrCreatePersonalList() { let personalRoomId = _SettingsStore.default.getValue("mjolnirPersonalRoom"); if (!personalRoomId) { const resp = await _MatrixClientPeg.MatrixClientPeg.safeGet().createRoom({ name: (0, _languageHandler._t)("labs_mjolnir|room_name"), topic: (0, _languageHandler._t)("labs_mjolnir|room_topic"), preset: _matrix.Preset.PrivateChat }); personalRoomId = resp["room_id"]; await _SettingsStore.default.setValue("mjolnirPersonalRoom", null, _SettingLevel.SettingLevel.ACCOUNT, personalRoomId); await _SettingsStore.default.setValue("mjolnirRooms", null, _SettingLevel.SettingLevel.ACCOUNT, [personalRoomId, ...this._roomIds]); } if (!personalRoomId) { throw new Error("Error finding a room ID to use"); } let list = this._lists.find(b => b.roomId === personalRoomId); if (!list) list = new _BanList.BanList(personalRoomId); // we don't append the list to the tracked rooms because it should already be there. // we're just trying to get the caller some utility access to the list return list; } // get without creating the list getPersonalList() { const personalRoomId = _SettingsStore.default.getValue("mjolnirPersonalRoom"); if (!personalRoomId) return null; let list = this._lists.find(b => b.roomId === personalRoomId); if (!list) list = new _BanList.BanList(personalRoomId); // we don't append the list to the tracked rooms because it should already be there. // we're just trying to get the caller some utility access to the list return list; } async subscribeToList(roomId) { const roomIds = [...this._roomIds, roomId]; await _SettingsStore.default.setValue("mjolnirRooms", null, _SettingLevel.SettingLevel.ACCOUNT, roomIds); this._lists.push(new _BanList.BanList(roomId)); } async unsubscribeFromList(roomId) { const roomIds = this._roomIds.filter(r => r !== roomId); await _SettingsStore.default.setValue("mjolnirRooms", null, _SettingLevel.SettingLevel.ACCOUNT, roomIds); this._lists = this._lists.filter(b => b.roomId !== roomId); } onListsChanged(settingName, roomId, atLevel, newValue) { // We know that ban lists are only recorded at one level so we don't need to re-eval them this.updateLists(newValue); } updateLists(listRoomIds) { if (!_MatrixClientPeg.MatrixClientPeg.get()) return; _logger.logger.log("Updating Mjolnir ban lists to: " + listRoomIds); this._lists = []; this._roomIds = listRoomIds || []; if (!listRoomIds) return; for (const roomId of listRoomIds) { // Creating the list updates it this._lists.push(new _BanList.BanList(roomId)); } } isServerBanned(serverName) { for (const list of this._lists) { for (const rule of list.serverRules) { if (rule.isMatch(serverName)) { return true; } } } return false; } isUserBanned(userId) { for (const list of this._lists) { for (const rule of list.userRules) { if (rule.isMatch(userId)) { return true; } } } return false; } static sharedInstance() { if (!Mjolnir.instance) { Mjolnir.instance = new Mjolnir(); } return Mjolnir.instance; } } exports.Mjolnir = Mjolnir; (0, _defineProperty2.default)(Mjolnir, "instance", null); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfTWF0cml4Q2xpZW50UGVnIiwiX0Jhbkxpc3QiLCJfU2V0dGluZ3NTdG9yZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX2Rpc3BhdGNoZXIiLCJfU2V0dGluZ0xldmVsIiwiX2FjdGlvbnMiLCJNam9sbmlyIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsInBheWxvYWQiLCJsb2dnZXIiLCJsb2ciLCJzZXR1cCIsImV2ZW50IiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiX3Jvb21JZHMiLCJpbmNsdWRlcyIsImdldFJvb21JZCIsIkFMTF9SVUxFX1RZUEVTIiwiZ2V0VHlwZSIsInVwZGF0ZUxpc3RzIiwicm9vbUlkcyIsImxpc3RzIiwiX2xpc3RzIiwic3RhcnQiLCJtam9sbmlyV2F0Y2hSZWYiLCJTZXR0aW5nc1N0b3JlIiwid2F0Y2hTZXR0aW5nIiwib25MaXN0c0NoYW5nZWQiLCJiaW5kIiwiZGlzcGF0Y2hlclJlZiIsImRpcyIsInJlZ2lzdGVyIiwib25BY3Rpb24iLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIkRvQWZ0ZXJTeW5jUHJlcGFyZWQiLCJkZWZlcnJlZF9hY3Rpb24iLCJnZXRWYWx1ZSIsIm9uIiwiUm9vbVN0YXRlRXZlbnQiLCJFdmVudHMiLCJvbkV2ZW50Iiwic3RvcCIsInVud2F0Y2hTZXR0aW5nIiwidW5yZWdpc3RlciIsInJlbW92ZUxpc3RlbmVyIiwiZ2V0T3JDcmVhdGVQZXJzb25hbExpc3QiLCJwZXJzb25hbFJvb21JZCIsInJlc3AiLCJzYWZlR2V0IiwiY3JlYXRlUm9vbSIsIm5hbWUiLCJfdCIsInRvcGljIiwicHJlc2V0IiwiUHJlc2V0IiwiUHJpdmF0ZUNoYXQiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIkFDQ09VTlQiLCJFcnJvciIsImxpc3QiLCJmaW5kIiwiYiIsInJvb21JZCIsIkJhbkxpc3QiLCJnZXRQZXJzb25hbExpc3QiLCJzdWJzY3JpYmVUb0xpc3QiLCJwdXNoIiwidW5zdWJzY3JpYmVGcm9tTGlzdCIsImZpbHRlciIsInIiLCJzZXR0aW5nTmFtZSIsImF0TGV2ZWwiLCJuZXdWYWx1ZSIsImxpc3RSb29tSWRzIiwiaXNTZXJ2ZXJCYW5uZWQiLCJzZXJ2ZXJOYW1lIiwicnVsZSIsInNlcnZlclJ1bGVzIiwiaXNNYXRjaCIsImlzVXNlckJhbm5lZCIsInVzZXJJZCIsInVzZXJSdWxlcyIsInNoYXJlZEluc3RhbmNlIiwiaW5zdGFuY2UiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL21qb2xuaXIvTWpvbG5pci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAxOSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgUm9vbVN0YXRlRXZlbnQsIFByZXNldCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgQUxMX1JVTEVfVFlQRVMsIEJhbkxpc3QgfSBmcm9tIFwiLi9CYW5MaXN0XCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IHsgRG9BZnRlclN5bmNQcmVwYXJlZFBheWxvYWQgfSBmcm9tIFwiLi4vZGlzcGF0Y2hlci9wYXlsb2Fkcy9Eb0FmdGVyU3luY1ByZXBhcmVkUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuXG4vLyBUT0RPOiBNb3ZlIHRoaXMgYW5kIHJlbGF0ZWQgZmlsZXMgdG8gdGhlIGpzLXNkayBvciBzb21ldGhpbmcgb25jZSBmaW5hbGl6ZWQuXG5cbmV4cG9ydCBjbGFzcyBNam9sbmlyIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogTWpvbG5pciB8IG51bGwgPSBudWxsO1xuXG4gICAgcHJpdmF0ZSBfbGlzdHM6IEJhbkxpc3RbXSA9IFtdOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgIHByaXZhdGUgX3Jvb21JZHM6IHN0cmluZ1tdID0gW107IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25hbWluZy1jb252ZW50aW9uXG4gICAgcHJpdmF0ZSBtam9sbmlyV2F0Y2hSZWY6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAgIHByaXZhdGUgZGlzcGF0Y2hlclJlZjogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwdWJsaWMgZ2V0IHJvb21JZHMoKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5fcm9vbUlkcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGxpc3RzKCk6IEJhbkxpc3RbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saXN0cztcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhcnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubWpvbG5pcldhdGNoUmVmID0gU2V0dGluZ3NTdG9yZS53YXRjaFNldHRpbmcoXCJtam9sbmlyUm9vbXNcIiwgbnVsbCwgdGhpcy5vbkxpc3RzQ2hhbmdlZC5iaW5kKHRoaXMpKTtcblxuICAgICAgICB0aGlzLmRpc3BhdGNoZXJSZWYgPSBkaXMucmVnaXN0ZXIodGhpcy5vbkFjdGlvbik7XG4gICAgICAgIGRpcy5kaXNwYXRjaDxEb0FmdGVyU3luY1ByZXBhcmVkUGF5bG9hZDxBY3Rpb25QYXlsb2FkPj4oe1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uRG9BZnRlclN5bmNQcmVwYXJlZCxcbiAgICAgICAgICAgIGRlZmVycmVkX2FjdGlvbjogeyBhY3Rpb246IFwic2V0dXBfbWpvbG5pclwiIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25BY3Rpb24gPSAocGF5bG9hZDogQWN0aW9uUGF5bG9hZCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocGF5bG9hZFtcImFjdGlvblwiXSA9PT0gXCJzZXR1cF9tam9sbmlyXCIpIHtcbiAgICAgICAgICAgIGxvZ2dlci5sb2coXCJTZXR0aW5nIHVwIE1qb2xuaXI6IGFmdGVyIHN5bmNcIik7XG4gICAgICAgICAgICB0aGlzLnNldHVwKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHVibGljIHNldHVwKCk6IHZvaWQge1xuICAgICAgICBpZiAoIU1hdHJpeENsaWVudFBlZy5nZXQoKSkgcmV0dXJuO1xuICAgICAgICB0aGlzLnVwZGF0ZUxpc3RzKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJtam9sbmlyUm9vbXNcIikpO1xuICAgICAgICBNYXRyaXhDbGllbnRQZWcuZ2V0KCkhLm9uKFJvb21TdGF0ZUV2ZW50LkV2ZW50cywgdGhpcy5vbkV2ZW50KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RvcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMubWpvbG5pcldhdGNoUmVmKSB7XG4gICAgICAgICAgICBTZXR0aW5nc1N0b3JlLnVud2F0Y2hTZXR0aW5nKHRoaXMubWpvbG5pcldhdGNoUmVmKTtcbiAgICAgICAgICAgIHRoaXMubWpvbG5pcldhdGNoUmVmID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRpc3BhdGNoZXJSZWYpIHtcbiAgICAgICAgICAgIGRpcy51bnJlZ2lzdGVyKHRoaXMuZGlzcGF0Y2hlclJlZik7XG4gICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXJSZWYgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgTWF0cml4Q2xpZW50UGVnLmdldCgpPy5yZW1vdmVMaXN0ZW5lcihSb29tU3RhdGVFdmVudC5FdmVudHMsIHRoaXMub25FdmVudCk7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGdldE9yQ3JlYXRlUGVyc29uYWxMaXN0KCk6IFByb21pc2U8QmFuTGlzdD4ge1xuICAgICAgICBsZXQgcGVyc29uYWxSb29tSWQgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwibWpvbG5pclBlcnNvbmFsUm9vbVwiKTtcbiAgICAgICAgaWYgKCFwZXJzb25hbFJvb21JZCkge1xuICAgICAgICAgICAgY29uc3QgcmVzcCA9IGF3YWl0IE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuY3JlYXRlUm9vbSh7XG4gICAgICAgICAgICAgICAgbmFtZTogX3QoXCJsYWJzX21qb2xuaXJ8cm9vbV9uYW1lXCIpLFxuICAgICAgICAgICAgICAgIHRvcGljOiBfdChcImxhYnNfbWpvbG5pcnxyb29tX3RvcGljXCIpLFxuICAgICAgICAgICAgICAgIHByZXNldDogUHJlc2V0LlByaXZhdGVDaGF0LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBwZXJzb25hbFJvb21JZCA9IHJlc3BbXCJyb29tX2lkXCJdO1xuICAgICAgICAgICAgYXdhaXQgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcIm1qb2xuaXJQZXJzb25hbFJvb21cIiwgbnVsbCwgU2V0dGluZ0xldmVsLkFDQ09VTlQsIHBlcnNvbmFsUm9vbUlkKTtcbiAgICAgICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJtam9sbmlyUm9vbXNcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkFDQ09VTlQsIFtcbiAgICAgICAgICAgICAgICBwZXJzb25hbFJvb21JZCxcbiAgICAgICAgICAgICAgICAuLi50aGlzLl9yb29tSWRzLFxuICAgICAgICAgICAgXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwZXJzb25hbFJvb21JZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRXJyb3IgZmluZGluZyBhIHJvb20gSUQgdG8gdXNlXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9saXN0cy5maW5kKChiKSA9PiBiLnJvb21JZCA9PT0gcGVyc29uYWxSb29tSWQpO1xuICAgICAgICBpZiAoIWxpc3QpIGxpc3QgPSBuZXcgQmFuTGlzdChwZXJzb25hbFJvb21JZCk7XG4gICAgICAgIC8vIHdlIGRvbid0IGFwcGVuZCB0aGUgbGlzdCB0byB0aGUgdHJhY2tlZCByb29tcyBiZWNhdXNlIGl0IHNob3VsZCBhbHJlYWR5IGJlIHRoZXJlLlxuICAgICAgICAvLyB3ZSdyZSBqdXN0IHRyeWluZyB0byBnZXQgdGhlIGNhbGxlciBzb21lIHV0aWxpdHkgYWNjZXNzIHRvIHRoZSBsaXN0XG5cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgLy8gZ2V0IHdpdGhvdXQgY3JlYXRpbmcgdGhlIGxpc3RcbiAgICBwdWJsaWMgZ2V0UGVyc29uYWxMaXN0KCk6IEJhbkxpc3QgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcGVyc29uYWxSb29tSWQgPSBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwibWpvbG5pclBlcnNvbmFsUm9vbVwiKTtcbiAgICAgICAgaWYgKCFwZXJzb25hbFJvb21JZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgbGV0IGxpc3QgPSB0aGlzLl9saXN0cy5maW5kKChiKSA9PiBiLnJvb21JZCA9PT0gcGVyc29uYWxSb29tSWQpO1xuICAgICAgICBpZiAoIWxpc3QpIGxpc3QgPSBuZXcgQmFuTGlzdChwZXJzb25hbFJvb21JZCk7XG4gICAgICAgIC8vIHdlIGRvbid0IGFwcGVuZCB0aGUgbGlzdCB0byB0aGUgdHJhY2tlZCByb29tcyBiZWNhdXNlIGl0IHNob3VsZCBhbHJlYWR5IGJlIHRoZXJlLlxuICAgICAgICAvLyB3ZSdyZSBqdXN0IHRyeWluZyB0byBnZXQgdGhlIGNhbGxlciBzb21lIHV0aWxpdHkgYWNjZXNzIHRvIHRoZSBsaXN0XG5cbiAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIHN1YnNjcmliZVRvTGlzdChyb29tSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBjb25zdCByb29tSWRzID0gWy4uLnRoaXMuX3Jvb21JZHMsIHJvb21JZF07XG4gICAgICAgIGF3YWl0IFNldHRpbmdzU3RvcmUuc2V0VmFsdWUoXCJtam9sbmlyUm9vbXNcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkFDQ09VTlQsIHJvb21JZHMpO1xuICAgICAgICB0aGlzLl9saXN0cy5wdXNoKG5ldyBCYW5MaXN0KHJvb21JZCkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBhc3luYyB1bnN1YnNjcmliZUZyb21MaXN0KHJvb21JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJvb21JZHMgPSB0aGlzLl9yb29tSWRzLmZpbHRlcigocikgPT4gciAhPT0gcm9vbUlkKTtcbiAgICAgICAgYXdhaXQgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcIm1qb2xuaXJSb29tc1wiLCBudWxsLCBTZXR0aW5nTGV2ZWwuQUNDT1VOVCwgcm9vbUlkcyk7XG4gICAgICAgIHRoaXMuX2xpc3RzID0gdGhpcy5fbGlzdHMuZmlsdGVyKChiKSA9PiBiLnJvb21JZCAhPT0gcm9vbUlkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uRXZlbnQgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghTWF0cml4Q2xpZW50UGVnLmdldCgpKSByZXR1cm47XG4gICAgICAgIGlmICghdGhpcy5fcm9vbUlkcy5pbmNsdWRlcyhldmVudC5nZXRSb29tSWQoKSEpKSByZXR1cm47XG4gICAgICAgIGlmICghQUxMX1JVTEVfVFlQRVMuaW5jbHVkZXMoZXZlbnQuZ2V0VHlwZSgpKSkgcmV0dXJuO1xuXG4gICAgICAgIHRoaXMudXBkYXRlTGlzdHModGhpcy5fcm9vbUlkcyk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25MaXN0c0NoYW5nZWQoXG4gICAgICAgIHNldHRpbmdOYW1lOiBzdHJpbmcsXG4gICAgICAgIHJvb21JZDogc3RyaW5nIHwgbnVsbCxcbiAgICAgICAgYXRMZXZlbDogU2V0dGluZ0xldmVsLFxuICAgICAgICBuZXdWYWx1ZTogc3RyaW5nW10sXG4gICAgKTogdm9pZCB7XG4gICAgICAgIC8vIFdlIGtub3cgdGhhdCBiYW4gbGlzdHMgYXJlIG9ubHkgcmVjb3JkZWQgYXQgb25lIGxldmVsIHNvIHdlIGRvbid0IG5lZWQgdG8gcmUtZXZhbCB0aGVtXG4gICAgICAgIHRoaXMudXBkYXRlTGlzdHMobmV3VmFsdWUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTGlzdHMobGlzdFJvb21JZHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgICAgIGlmICghTWF0cml4Q2xpZW50UGVnLmdldCgpKSByZXR1cm47XG5cbiAgICAgICAgbG9nZ2VyLmxvZyhcIlVwZGF0aW5nIE1qb2xuaXIgYmFuIGxpc3RzIHRvOiBcIiArIGxpc3RSb29tSWRzKTtcbiAgICAgICAgdGhpcy5fbGlzdHMgPSBbXTtcbiAgICAgICAgdGhpcy5fcm9vbUlkcyA9IGxpc3RSb29tSWRzIHx8IFtdO1xuICAgICAgICBpZiAoIWxpc3RSb29tSWRzKSByZXR1cm47XG5cbiAgICAgICAgZm9yIChjb25zdCByb29tSWQgb2YgbGlzdFJvb21JZHMpIHtcbiAgICAgICAgICAgIC8vIENyZWF0aW5nIHRoZSBsaXN0IHVwZGF0ZXMgaXRcbiAgICAgICAgICAgIHRoaXMuX2xpc3RzLnB1c2gobmV3IEJhbkxpc3Qocm9vbUlkKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgaXNTZXJ2ZXJCYW5uZWQoc2VydmVyTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAoY29uc3QgbGlzdCBvZiB0aGlzLl9saXN0cykge1xuICAgICAgICAgICAgZm9yIChjb25zdCBydWxlIG9mIGxpc3Quc2VydmVyUnVsZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAocnVsZS5pc01hdGNoKHNlcnZlck5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVXNlckJhbm5lZCh1c2VySWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBmb3IgKGNvbnN0IGxpc3Qgb2YgdGhpcy5fbGlzdHMpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcnVsZSBvZiBsaXN0LnVzZXJSdWxlcykge1xuICAgICAgICAgICAgICAgIGlmIChydWxlLmlzTWF0Y2godXNlcklkKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgc2hhcmVkSW5zdGFuY2UoKTogTWpvbG5pciB7XG4gICAgICAgIGlmICghTWpvbG5pci5pbnN0YW5jZSkge1xuICAgICAgICAgICAgTWpvbG5pci5pbnN0YW5jZSA9IG5ldyBNam9sbmlyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIE1qb2xuaXIuaW5zdGFuY2U7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxjQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFDQSxJQUFBTSxnQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sV0FBQSxHQUFBRixzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxHQUFBUixPQUFBO0FBR0EsSUFBQVMsUUFBQSxHQUFBVCxPQUFBO0FBbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQWVBOztBQUVPLE1BQU1VLE9BQU8sQ0FBQztFQUFBQyxZQUFBO0lBQUEsSUFBQUMsZ0JBQUEsQ0FBQUMsT0FBQSxrQkFHVyxFQUFFO0lBQUU7SUFBQSxJQUFBRCxnQkFBQSxDQUFBQyxPQUFBLG9CQUNILEVBQUU7SUFBRTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUEsMkJBQ1EsSUFBSTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUEseUJBQ04sSUFBSTtJQUFBLElBQUFELGdCQUFBLENBQUFDLE9BQUEsb0JBb0J2QkMsT0FBc0IsSUFBVztNQUNqRCxJQUFJQSxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssZUFBZSxFQUFFO1FBQ3ZDQyxjQUFNLENBQUNDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQztRQUM1QyxJQUFJLENBQUNDLEtBQUssQ0FBQyxDQUFDO01BQ2hCO0lBQ0osQ0FBQztJQUFBLElBQUFMLGdCQUFBLENBQUFDLE9BQUEsbUJBMEVrQkssS0FBa0IsSUFBVztNQUM1QyxJQUFJLENBQUNDLGdDQUFlLENBQUNDLEdBQUcsQ0FBQyxDQUFD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