matrix-react-sdk
Version:
SDK for matrix.org using React
156 lines (154 loc) • 28.1 kB
JavaScript
;
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 _languageHandler = require("../../../../languageHandler");
var _SdkConfig = _interopRequireDefault(require("../../../../SdkConfig"));
var _SettingsStore = _interopRequireDefault(require("../../../../settings/SettingsStore"));
var _Modal = _interopRequireDefault(require("../../../../Modal"));
var _FormattingUtils = require("../../../../utils/FormattingUtils");
var _EventIndexPeg = _interopRequireDefault(require("../../../../indexing/EventIndexPeg"));
var _SettingLevel = require("../../../../settings/SettingLevel");
var _Field = _interopRequireDefault(require("../../../../components/views/elements/Field"));
var _BaseDialog = _interopRequireDefault(require("../../../../components/views/dialogs/BaseDialog"));
var _DialogButtons = _interopRequireDefault(require("../../../../components/views/elements/DialogButtons"));
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 2020, 2021 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.
*/
/*
* Allows the user to introspect the event index state and disable it.
*/
class ManageEventIndexDialog extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "updateCurrentRoom", async room => {
const eventIndex = _EventIndexPeg.default.get();
if (!eventIndex) return;
let stats;
try {
stats = await eventIndex.getStats();
} catch {
// This call may fail if sporadically, not a huge issue as we will
// try later again and probably succeed.
return;
}
let currentRoom = null;
if (room) currentRoom = room.name;
const roomStats = eventIndex.crawlingRooms();
const crawlingRoomsCount = roomStats.crawlingRooms.size;
const roomCount = roomStats.totalRooms.size;
this.setState({
eventIndexSize: stats?.size ?? 0,
eventCount: stats?.eventCount ?? 0,
crawlingRoomsCount: crawlingRoomsCount,
roomCount: roomCount,
currentRoom: currentRoom
});
});
(0, _defineProperty2.default)(this, "onDisable", async () => {
const DisableEventIndexDialog = (await Promise.resolve().then(() => _interopRequireWildcard(require("./DisableEventIndexDialog")))).default;
_Modal.default.createDialog(DisableEventIndexDialog, undefined, undefined, /* priority = */false, /* static = */true);
});
(0, _defineProperty2.default)(this, "onCrawlerSleepTimeChange", e => {
this.setState({
crawlerSleepTime: parseInt(e.target.value, 10)
});
_SettingsStore.default.setValue("crawlerSleepTime", null, _SettingLevel.SettingLevel.DEVICE, e.target.value);
});
this.state = {
eventIndexSize: 0,
eventCount: 0,
crawlingRoomsCount: 0,
roomCount: 0,
currentRoom: null,
crawlerSleepTime: _SettingsStore.default.getValueAt(_SettingLevel.SettingLevel.DEVICE, "crawlerSleepTime")
};
}
componentWillUnmount() {
const eventIndex = _EventIndexPeg.default.get();
if (eventIndex !== null) {
eventIndex.removeListener("changedCheckpoint", this.updateCurrentRoom);
}
}
async componentDidMount() {
let eventIndexSize = 0;
let crawlingRoomsCount = 0;
let roomCount = 0;
let eventCount = 0;
let currentRoom = null;
const eventIndex = _EventIndexPeg.default.get();
if (eventIndex !== null) {
eventIndex.on("changedCheckpoint", this.updateCurrentRoom);
try {
const stats = await eventIndex.getStats();
if (stats) {
eventIndexSize = stats.size;
eventCount = stats.eventCount;
}
} catch {
// This call may fail if sporadically, not a huge issue as we
// will try later again in the updateCurrentRoom call and
// probably succeed.
}
const roomStats = eventIndex.crawlingRooms();
crawlingRoomsCount = roomStats.crawlingRooms.size;
roomCount = roomStats.totalRooms.size;
const room = eventIndex.currentRoom();
if (room) currentRoom = room.name;
}
this.setState({
eventIndexSize,
eventCount,
crawlingRoomsCount,
roomCount,
currentRoom
});
}
render() {
const brand = _SdkConfig.default.get().brand;
let crawlerState;
if (this.state.currentRoom === null) {
crawlerState = (0, _languageHandler._t)("settings|security|message_search_indexing_idle");
} else {
crawlerState = (0, _languageHandler._t)("settings|security|message_search_indexing", {
currentRoom: this.state.currentRoom
});
}
const doneRooms = Math.max(0, this.state.roomCount - this.state.crawlingRoomsCount);
const eventIndexingSettings = /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("settings|security|message_search_intro", {
brand
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_SettingsTab_subsectionText"
}, crawlerState, /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_space_used"), " ", (0, _FormattingUtils.formatBytes)(this.state.eventIndexSize, 0), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_indexed_messages"), " ", (0, _FormattingUtils.formatCountLong)(this.state.eventCount), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("settings|security|message_search_indexed_rooms"), " ", (0, _languageHandler._t)("settings|security|message_search_room_progress", {
doneRooms: (0, _FormattingUtils.formatCountLong)(doneRooms),
totalRooms: (0, _FormattingUtils.formatCountLong)(this.state.roomCount)
}), " ", /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement(_Field.default, {
label: (0, _languageHandler._t)("settings|security|message_search_sleep_time"),
type: "number",
value: this.state.crawlerSleepTime.toString(),
onChange: this.onCrawlerSleepTimeChange
})));
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_ManageEventIndexDialog",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("settings|security|message_search_section")
}, eventIndexingSettings, /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|done"),
onPrimaryButtonClick: this.props.onFinished,
primaryButtonClass: "primary",
cancelButton: (0, _languageHandler._t)("action|disable"),
onCancel: this.onDisable,
cancelButtonClass: "danger"
}));
}
}
exports.default = ManageEventIndexDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfU2RrQ29uZmlnIiwiX1NldHRpbmdzU3RvcmUiLCJfTW9kYWwiLCJfRm9ybWF0dGluZ1V0aWxzIiwiX0V2ZW50SW5kZXhQZWciLCJfU2V0dGluZ0xldmVsIiwiX0ZpZWxkIiwiX0Jhc2VEaWFsb2ciLCJfRGlhbG9nQnV0dG9ucyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiTWFuYWdlRXZlbnRJbmRleERpYWxvZyIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJyb29tIiwiZXZlbnRJbmRleCIsIkV2ZW50SW5kZXhQZWciLCJzdGF0cyIsImdldFN0YXRzIiwiY3VycmVudFJvb20iLCJuYW1lIiwicm9vbVN0YXRzIiwiY3Jhd2xpbmdSb29tcyIsImNyYXdsaW5nUm9vbXNDb3VudCIsInNpemUiLCJyb29tQ291bnQiLCJ0b3RhbFJvb21zIiwic2V0U3RhdGUiLCJldmVudEluZGV4U2l6ZSIsImV2ZW50Q291bnQiLCJEaXNhYmxlRXZlbnRJbmRleERpYWxvZyIsIlByb21pc2UiLCJyZXNvbHZlIiwidGhlbiIsIk1vZGFsIiwiY3JlYXRlRGlhbG9nIiwidW5kZWZpbmVkIiwiY3Jhd2xlclNsZWVwVGltZSIsInBhcnNlSW50IiwidGFyZ2V0IiwidmFsdWUiLCJTZXR0aW5nc1N0b3JlIiwic2V0VmFsdWUiLCJTZXR0aW5nTGV2ZWwiLCJERVZJQ0UiLCJzdGF0ZSIsImdldFZhbHVlQXQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUxpc3RlbmVyIiwidXBkYXRlQ3VycmVudFJvb20iLCJjb21wb25lbnREaWRNb3VudCIsIm9uIiwicmVuZGVyIiwiYnJhbmQiLCJTZGtDb25maWciLCJjcmF3bGVyU3RhdGUiLCJfdCIsImRvbmVSb29tcyIsIk1hdGgiLCJtYXgiLCJldmVudEluZGV4aW5nU2V0dGluZ3MiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwiZm9ybWF0Qnl0ZXMiLCJmb3JtYXRDb3VudExvbmciLCJsYWJlbCIsInR5cGUiLCJ0b1N0cmluZyIsIm9uQ2hhbmdlIiwib25DcmF3bGVyU2xlZXBUaW1lQ2hhbmdlIiwib25GaW5pc2hlZCIsInRpdGxlIiwicHJpbWFyeUJ1dHRvbiIsIm9uUHJpbWFyeUJ1dHRvbkNsaWNrIiwicHJpbWFyeUJ1dHRvbkNsYXNzIiwiY2FuY2VsQnV0dG9uIiwib25DYW5jZWwiLCJvbkRpc2FibGUiLCJjYW5jZWxCdXR0b25DbGFzcyIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvYXN5bmMtY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL2V2ZW50aW5kZXgvTWFuYWdlRXZlbnRJbmRleERpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAsIDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IENoYW5nZUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBSb29tIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBTZGtDb25maWcgZnJvbSBcIi4uLy4uLy4uLy4uL1Nka0NvbmZpZ1wiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCB7IGZvcm1hdEJ5dGVzLCBmb3JtYXRDb3VudExvbmcgfSBmcm9tIFwiLi4vLi4vLi4vLi4vdXRpbHMvRm9ybWF0dGluZ1V0aWxzXCI7XG5pbXBvcnQgRXZlbnRJbmRleFBlZyBmcm9tIFwiLi4vLi4vLi4vLi4vaW5kZXhpbmcvRXZlbnRJbmRleFBlZ1wiO1xuaW1wb3J0IHsgU2V0dGluZ0xldmVsIH0gZnJvbSBcIi4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdMZXZlbFwiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0ZpZWxkXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi4vLi4vLi4vLi4vY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCBEaWFsb2dCdXR0b25zIGZyb20gXCIuLi8uLi8uLi8uLi9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL0RpYWxvZ0J1dHRvbnNcIjtcbmltcG9ydCB7IElJbmRleFN0YXRzIH0gZnJvbSBcIi4uLy4uLy4uLy4uL2luZGV4aW5nL0Jhc2VFdmVudEluZGV4TWFuYWdlclwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICBvbkZpbmlzaGVkKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGV2ZW50SW5kZXhTaXplOiBudW1iZXI7XG4gICAgZXZlbnRDb3VudDogbnVtYmVyO1xuICAgIGNyYXdsaW5nUm9vbXNDb3VudDogbnVtYmVyO1xuICAgIHJvb21Db3VudDogbnVtYmVyO1xuICAgIGN1cnJlbnRSb29tOiBzdHJpbmcgfCBudWxsO1xuICAgIGNyYXdsZXJTbGVlcFRpbWU6IG51bWJlcjtcbn1cblxuLypcbiAqIEFsbG93cyB0aGUgdXNlciB0byBpbnRyb3NwZWN0IHRoZSBldmVudCBpbmRleCBzdGF0ZSBhbmQgZGlzYWJsZSBpdC5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWFuYWdlRXZlbnRJbmRleERpYWxvZyBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZXZlbnRJbmRleFNpemU6IDAsXG4gICAgICAgICAgICBldmVudENvdW50OiAwLFxuICAgICAgICAgICAgY3Jhd2xpbmdSb29tc0NvdW50OiAwLFxuICAgICAgICAgICAgcm9vbUNvdW50OiAwLFxuICAgICAgICAgICAgY3VycmVudFJvb206IG51bGwsXG4gICAgICAgICAgICBjcmF3bGVyU2xlZXBUaW1lOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlQXQoU2V0dGluZ0xldmVsLkRFVklDRSwgXCJjcmF3bGVyU2xlZXBUaW1lXCIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHB1YmxpYyB1cGRhdGVDdXJyZW50Um9vbSA9IGFzeW5jIChyb29tOiBSb29tKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IGV2ZW50SW5kZXggPSBFdmVudEluZGV4UGVnLmdldCgpO1xuICAgICAgICBpZiAoIWV2ZW50SW5kZXgpIHJldHVybjtcbiAgICAgICAgbGV0IHN0YXRzOiBJSW5kZXhTdGF0cyB8IHVuZGVmaW5lZDtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgc3RhdHMgPSBhd2FpdCBldmVudEluZGV4LmdldFN0YXRzKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gVGhpcyBjYWxsIG1heSBmYWlsIGlmIHNwb3JhZGljYWxseSwgbm90IGEgaHVnZSBpc3N1ZSBhcyB3ZSB3aWxsXG4gICAgICAgICAgICAvLyB0cnkgbGF0ZXIgYWdhaW4gYW5kIHByb2JhYmx5IHN1Y2NlZWQuXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3VycmVudFJvb206IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgICAgIGlmIChyb29tKSBjdXJyZW50Um9vbSA9IHJvb20ubmFtZTtcbiAgICAgICAgY29uc3Qgcm9vbVN0YXRzID0gZXZlbnRJbmRleC5jcmF3bGluZ1Jvb21zKCk7XG4gICAgICAgIGNvbnN0IGNyYXdsaW5nUm9vbXNDb3VudCA9IHJvb21TdGF0cy5jcmF3bGluZ1Jvb21zLnNpemU7XG4gICAgICAgIGNvbnN0IHJvb21Db3VudCA9IHJvb21TdGF0cy50b3RhbFJvb21zLnNpemU7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZTogc3RhdHM/LnNpemUgPz8gMCxcbiAgICAgICAgICAgIGV2ZW50Q291bnQ6IHN0YXRzPy5ldmVudENvdW50ID8/IDAsXG4gICAgICAgICAgICBjcmF3bGluZ1Jvb21zQ291bnQ6IGNyYXdsaW5nUm9vbXNDb3VudCxcbiAgICAgICAgICAgIHJvb21Db3VudDogcm9vbUNvdW50LFxuICAgICAgICAgICAgY3VycmVudFJvb206IGN1cnJlbnRSb29tLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gRXZlbnRJbmRleFBlZy5nZXQoKTtcblxuICAgICAgICBpZiAoZXZlbnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbmRleC5yZW1vdmVMaXN0ZW5lcihcImNoYW5nZWRDaGVja3BvaW50XCIsIHRoaXMudXBkYXRlQ3VycmVudFJvb20pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGFzeW5jIGNvbXBvbmVudERpZE1vdW50KCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsZXQgZXZlbnRJbmRleFNpemUgPSAwO1xuICAgICAgICBsZXQgY3Jhd2xpbmdSb29tc0NvdW50ID0gMDtcbiAgICAgICAgbGV0IHJvb21Db3VudCA9IDA7XG4gICAgICAgIGxldCBldmVudENvdW50ID0gMDtcbiAgICAgICAgbGV0IGN1cnJlbnRSb29tOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAgICAgICBjb25zdCBldmVudEluZGV4ID0gRXZlbnRJbmRleFBlZy5nZXQoKTtcblxuICAgICAgICBpZiAoZXZlbnRJbmRleCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZXZlbnRJbmRleC5vbihcImNoYW5nZWRDaGVja3BvaW50XCIsIHRoaXMudXBkYXRlQ3VycmVudFJvb20pO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgZXZlbnRJbmRleC5nZXRTdGF0cygpO1xuICAgICAgICAgICAgICAgIGlmIChzdGF0cykge1xuICAgICAgICAgICAgICAgICAgICBldmVudEluZGV4U2l6ZSA9IHN0YXRzLnNpemU7XG4gICAgICAgICAgICAgICAgICAgIGV2ZW50Q291bnQgPSBzdGF0cy5ldmVudENvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FsbCBtYXkgZmFpbCBpZiBzcG9yYWRpY2FsbHksIG5vdCBhIGh1Z2UgaXNzdWUgYXMgd2VcbiAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSBsYXRlciBhZ2FpbiBpbiB0aGUgdXBkYXRlQ3VycmVudFJvb20gY2FsbCBhbmRcbiAgICAgICAgICAgICAgICAvLyBwcm9iYWJseSBzdWNjZWVkLlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb29tU3RhdHMgPSBldmVudEluZGV4LmNyYXdsaW5nUm9vbXMoKTtcbiAgICAgICAgICAgIGNyYXdsaW5nUm9vbXNDb3VudCA9IHJvb21TdGF0cy5jcmF3bGluZ1Jvb21zLnNpemU7XG4gICAgICAgICAgICByb29tQ291bnQgPSByb29tU3RhdHMudG90YWxSb29tcy5zaXplO1xuXG4gICAgICAgICAgICBjb25zdCByb29tID0gZXZlbnRJbmRleC5jdXJyZW50Um9vbSgpO1xuICAgICAgICAgICAgaWYgKHJvb20pIGN1cnJlbnRSb29tID0gcm9vbS5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBldmVudEluZGV4U2l6ZSxcbiAgICAgICAgICAgIGV2ZW50Q291bnQsXG4gICAgICAgICAgICBjcmF3bGluZ1Jvb21zQ291bnQsXG4gICAgICAgICAgICByb29tQ291bnQsXG4gICAgICAgICAgICBjdXJyZW50Um9vbSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRpc2FibGUgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IERpc2FibGVFdmVudEluZGV4RGlhbG9nID0gKGF3YWl0IGltcG9ydChcIi4vRGlzYWJsZUV2ZW50SW5kZXhEaWFsb2dcIikpLmRlZmF1bHQ7XG4gICAgICAgIE1vZGFsLmNyZWF0ZURpYWxvZyhEaXNhYmxlRXZlbnRJbmRleERpYWxvZywgdW5kZWZpbmVkLCB1bmRlZmluZWQsIC8qIHByaW9yaXR5ID0gKi8gZmFsc2UsIC8qIHN0YXRpYyA9ICovIHRydWUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ3Jhd2xlclNsZWVwVGltZUNoYW5nZSA9IChlOiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50Pik6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgY3Jhd2xlclNsZWVwVGltZTogcGFyc2VJbnQoZS50YXJnZXQudmFsdWUsIDEwKSB9KTtcbiAgICAgICAgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcImNyYXdsZXJTbGVlcFRpbWVcIiwgbnVsbCwgU2V0dGluZ0xldmVsLkRFVklDRSwgZS50YXJnZXQudmFsdWUpO1xuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IGJyYW5kID0gU2RrQ29uZmlnLmdldCgpLmJyYW5kO1xuXG4gICAgICAgIGxldCBjcmF3bGVyU3RhdGU7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlLmN1cnJlbnRSb29tID09PSBudWxsKSB7XG4gICAgICAgICAgICBjcmF3bGVyU3RhdGUgPSBfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2luZGV4aW5nX2lkbGVcIik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjcmF3bGVyU3RhdGUgPSBfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2luZGV4aW5nXCIsIHsgY3VycmVudFJvb206IHRoaXMuc3RhdGUuY3VycmVudFJvb20gfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkb25lUm9vbXMgPSBNYXRoLm1heCgwLCB0aGlzLnN0YXRlLnJvb21Db3VudCAtIHRoaXMuc3RhdGUuY3Jhd2xpbmdSb29tc0NvdW50KTtcblxuICAgICAgICBjb25zdCBldmVudEluZGV4aW5nU2V0dGluZ3MgPSAoXG4gICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX2ludHJvXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TZXR0aW5nc1RhYl9zdWJzZWN0aW9uVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICB7Y3Jhd2xlclN0YXRlfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfc3BhY2VfdXNlZFwiKX0ge2Zvcm1hdEJ5dGVzKHRoaXMuc3RhdGUuZXZlbnRJbmRleFNpemUsIDApfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfaW5kZXhlZF9tZXNzYWdlc1wiKX0ge2Zvcm1hdENvdW50TG9uZyh0aGlzLnN0YXRlLmV2ZW50Q291bnQpfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfaW5kZXhlZF9yb29tc1wiKX17XCIgXCJ9XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX3Jvb21fcHJvZ3Jlc3NcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9uZVJvb21zOiBmb3JtYXRDb3VudExvbmcoZG9uZVJvb21zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUm9vbXM6IGZvcm1hdENvdW50TG9uZyh0aGlzLnN0YXRlLnJvb21Db3VudCksXG4gICAgICAgICAgICAgICAgICAgIH0pfXtcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgPGJyIC8+XG4gICAgICAgICAgICAgICAgICAgIDxGaWVsZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwic2V0dGluZ3N8c2VjdXJpdHl8bWVzc2FnZV9zZWFyY2hfc2xlZXBfdGltZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9e3RoaXMuc3RhdGUuY3Jhd2xlclNsZWVwVGltZS50b1N0cmluZygpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25DcmF3bGVyU2xlZXBUaW1lQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTWFuYWdlRXZlbnRJbmRleERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcInNldHRpbmdzfHNlY3VyaXR5fG1lc3NhZ2Vfc2VhcmNoX3NlY3Rpb25cIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2V2ZW50SW5kZXhpbmdTZXR0aW5nc31cbiAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uPXtfdChcImFjdGlvbnxkb25lXCIpfVxuICAgICAgICAgICAgICAgICAgICBvblByaW1hcnlCdXR0b25DbGljaz17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgICAgICBwcmltYXJ5QnV0dG9uQ2xhc3M9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPXtfdChcImFjdGlvbnxkaXNhYmxlXCIpfVxuICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17dGhpcy5vbkRpc2FibGV9XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEJ1dHRvbkNsYXNzPVwiZGFuZ2VyXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAg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