UNPKG

matrix-react-sdk

Version:
203 lines (166 loc) 24.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _languageHandler = require("../../../languageHandler"); var sdk = _interopRequireWildcard(require("../../../index")); var _DateUtils = require("../../../DateUtils"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp; let MessageEditHistoryDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.MessageEditHistoryDialog"), _dec(_class = (_temp = _class2 = class MessageEditHistoryDialog extends _react.default.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "loadMoreEdits", async backwards => { if (backwards || !this.state.nextBatch && !this.state.isLoading) { // bail out on backwards as we only paginate in one direction return false; } const opts = { from: this.state.nextBatch }; const roomId = this.props.mxEvent.getRoomId(); const eventId = this.props.mxEvent.getId(); const client = _MatrixClientPeg.MatrixClientPeg.get(); let result; let resolve; let reject; const promise = new Promise((_resolve, _reject) => { resolve = _resolve; reject = _reject; }); try { result = await client.relations(roomId, eventId, "m.replace", "m.room.message", opts); } catch (error) { // log if the server returned an error if (error.errcode) { console.error("fetching /relations failed with error", error); } this.setState({ error }, () => reject(error)); return promise; } const newEvents = result.events; this._locallyRedactEventsIfNeeded(newEvents); this.setState({ originalEvent: this.state.originalEvent || result.originalEvent, events: this.state.events.concat(newEvents), nextBatch: result.nextBatch, isLoading: false }, () => { const hasMoreResults = !!this.state.nextBatch; resolve(hasMoreResults); }); return promise; }); this.state = { originalEvent: null, error: null, events: [], nextBatch: null, isLoading: true, isTwelveHour: _SettingsStore.default.getValue("showTwelveHourTimestamps") }; } _locallyRedactEventsIfNeeded(newEvents) { const roomId = this.props.mxEvent.getRoomId(); const client = _MatrixClientPeg.MatrixClientPeg.get(); const room = client.getRoom(roomId); const pendingEvents = room.getPendingEvents(); for (const e of newEvents) { const pendingRedaction = pendingEvents.find(pe => { return pe.getType() === "m.room.redaction" && pe.getAssociatedId() === e.getId(); }); if (pendingRedaction) { e.markLocallyRedacted(pendingRedaction); } } } componentDidMount() { this.loadMoreEdits(); } _renderEdits() { const EditHistoryMessage = sdk.getComponent('messages.EditHistoryMessage'); const DateSeparator = sdk.getComponent('messages.DateSeparator'); const nodes = []; let lastEvent; let allEvents = this.state.events; // append original event when we've done last pagination if (this.state.originalEvent && !this.state.nextBatch) { allEvents = allEvents.concat(this.state.originalEvent); } const baseEventId = this.props.mxEvent.getId(); allEvents.forEach((e, i) => { if (!lastEvent || (0, _DateUtils.wantsDateSeparator)(lastEvent.getDate(), e.getDate())) { nodes.push( /*#__PURE__*/_react.default.createElement("li", { key: e.getTs() + "~" }, /*#__PURE__*/_react.default.createElement(DateSeparator, { ts: e.getTs() }))); } const isBaseEvent = e.getId() === baseEventId; nodes.push( /*#__PURE__*/_react.default.createElement(EditHistoryMessage, { key: e.getId(), previousEdit: !isBaseEvent ? allEvents[i + 1] : null, isBaseEvent: isBaseEvent, mxEvent: e, isTwelveHour: this.state.isTwelveHour })); lastEvent = e; }); return nodes; } render() { let content; if (this.state.error) { const { error } = this.state; if (error.errcode === "M_UNRECOGNIZED") { content = /*#__PURE__*/_react.default.createElement("p", { className: "mx_MessageEditHistoryDialog_error" }, (0, _languageHandler._t)("Your homeserver doesn't seem to support this feature.")); } else if (error.errcode) { // some kind of error from the homeserver content = /*#__PURE__*/_react.default.createElement("p", { className: "mx_MessageEditHistoryDialog_error" }, (0, _languageHandler._t)("Something went wrong!")); } else { content = /*#__PURE__*/_react.default.createElement("p", { className: "mx_MessageEditHistoryDialog_error" }, (0, _languageHandler._t)("Cannot reach homeserver"), /*#__PURE__*/_react.default.createElement("br", null), (0, _languageHandler._t)("Ensure you have a stable internet connection, or get in touch with the server admin")); } } else if (this.state.isLoading) { const Spinner = sdk.getComponent("elements.Spinner"); content = /*#__PURE__*/_react.default.createElement(Spinner, null); } else { const ScrollPanel = sdk.getComponent("structures.ScrollPanel"); content = /*#__PURE__*/_react.default.createElement(ScrollPanel, { className: "mx_MessageEditHistoryDialog_scrollPanel", onFillRequest: this.loadMoreEdits, stickyBottom: false, startAtBottom: false }, /*#__PURE__*/_react.default.createElement("ul", { className: "mx_MessageEditHistoryDialog_edits mx_MessagePanel_alwaysShowTimestamps" }, this._renderEdits())); } const BaseDialog = sdk.getComponent('views.dialogs.BaseDialog'); return /*#__PURE__*/_react.default.createElement(BaseDialog, { className: "mx_MessageEditHistoryDialog", hasCancel: true, onFinished: this.props.onFinished, title: (0, _languageHandler._t)("Message edits") }, content); } }, (0, _defineProperty2.default)(_class2, "propTypes", { mxEvent: _propTypes.default.object.isRequired }), _temp)) || _class); exports.default = MessageEditHistoryDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvTWVzc2FnZUVkaXRIaXN0b3J5RGlhbG9nLmpzIl0sIm5hbWVzIjpbIk1lc3NhZ2VFZGl0SGlzdG9yeURpYWxvZyIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJiYWNrd2FyZHMiLCJzdGF0ZSIsIm5leHRCYXRjaCIsImlzTG9hZGluZyIsIm9wdHMiLCJmcm9tIiwicm9vbUlkIiwibXhFdmVudCIsImdldFJvb21JZCIsImV2ZW50SWQiLCJnZXRJZCIsImNsaWVudCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsInJlc3VsdCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiUHJvbWlzZSIsIl9yZXNvbHZlIiwiX3JlamVjdCIsInJlbGF0aW9ucyIsImVycm9yIiwiZXJyY29kZSIsImNvbnNvbGUiLCJzZXRTdGF0ZSIsIm5ld0V2ZW50cyIsImV2ZW50cyIsIl9sb2NhbGx5UmVkYWN0RXZlbnRzSWZOZWVkZWQiLCJvcmlnaW5hbEV2ZW50IiwiY29uY2F0IiwiaGFzTW9yZVJlc3VsdHMiLCJpc1R3ZWx2ZUhvdXIiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJyb29tIiwiZ2V0Um9vbSIsInBlbmRpbmdFdmVudHMiLCJnZXRQZW5kaW5nRXZlbnRzIiwiZSIsInBlbmRpbmdSZWRhY3Rpb24iLCJmaW5kIiwicGUiLCJnZXRUeXBlIiwiZ2V0QXNzb2NpYXRlZElkIiwibWFya0xvY2FsbHlSZWRhY3RlZCIsImNvbXBvbmVudERpZE1vdW50IiwibG9hZE1vcmVFZGl0cyIsIl9yZW5kZXJFZGl0cyIsIkVkaXRIaXN0b3J5TWVzc2FnZSIsInNkayIsImdldENvbXBvbmVudCIsIkRhdGVTZXBhcmF0b3IiLCJub2RlcyIsImxhc3RFdmVudCIsImFsbEV2ZW50cyIsImJhc2VFdmVudElkIiwiZm9yRWFjaCIsImkiLCJnZXREYXRlIiwicHVzaCIsImdldFRzIiwiaXNCYXNlRXZlbnQiLCJyZW5kZXIiLCJjb250ZW50IiwiU3Bpbm5lciIsIlNjcm9sbFBhbmVsIiwiQmFzZURpYWxvZyIsIm9uRmluaXNoZWQiLCJQcm9wVHlwZXMiLCJvYmplY3QiLCJpc1JlcXVpcmVkIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBR3FCQSx3QixXQURwQixnREFBcUIsd0NBQXJCLEMsbUNBQUQsTUFDcUJBLHdCQURyQixTQUNzREMsZUFBTUMsYUFENUQsQ0FDMEU7QUFLdEVDLEVBQUFBLFdBQVcsQ0FBQ0MsS0FBRCxFQUFRO0FBQ2YsVUFBTUEsS0FBTjtBQURlLHlEQVlILE1BQU9DLFNBQVAsSUFBcUI7QUFDakMsVUFBSUEsU0FBUyxJQUFLLENBQUMsS0FBS0MsS0FBTCxDQUFXQyxTQUFaLElBQXlCLENBQUMsS0FBS0QsS0FBTCxDQUFXRSxTQUF2RCxFQUFtRTtBQUMvRDtBQUNBLGVBQU8sS0FBUDtBQUNIOztBQUNELFlBQU1DLElBQUksR0FBRztBQUFDQyxRQUFBQSxJQUFJLEVBQUUsS0FBS0osS0FBTCxDQUFXQztBQUFsQixPQUFiO0FBQ0EsWUFBTUksTUFBTSxHQUFHLEtBQUtQLEtBQUwsQ0FBV1EsT0FBWCxDQUFtQkMsU0FBbkIsRUFBZjtBQUNBLFlBQU1DLE9BQU8sR0FBRyxLQUFLVixLQUFMLENBQVdRLE9BQVgsQ0FBbUJHLEtBQW5CLEVBQWhCOztBQUNBLFlBQU1DLE1BQU0sR0FBR0MsaUNBQWdCQyxHQUFoQixFQUFmOztBQUNBLFVBQUlDLE1BQUo7QUFDQSxVQUFJQyxPQUFKO0FBQ0EsVUFBSUMsTUFBSjtBQUNBLFlBQU1DLE9BQU8sR0FBRyxJQUFJQyxPQUFKLENBQVksQ0FBQ0MsUUFBRCxFQUFXQyxPQUFYLEtBQXVCO0FBQUNMLFFBQUFBLE9BQU8sR0FBR0ksUUFBVjtBQUFvQkgsUUFBQUEsTUFBTSxHQUFHSSxPQUFUO0FBQWtCLE9BQTFFLENBQWhCOztBQUNB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LFFBQUEsWUFBWSxFQUFFLEtBSFA7QUFJUCxRQUFBLGFBQWEsRUFBRTtBQUpSLHNCQU1QO0FBQUksUUFBQSxTQUFTLEVBQUM7QUFBZCxTQUF3RixLQUFLQyxZQUFMLEVBQXhGLENBTk8sQ0FBWDtBQVFIOztBQUNELFVBQU1tQixVQUFVLEdBQUdqQixHQUFHLENBQUNDLFlBQUosQ0FBaUIsMEJBQWpCLENBQW5CO0FBQ0Esd0JBQ0ksNkJBQUMsVUFBRDtBQUNJLE1BQUEsU0FBUyxFQUFDLDZCQURkO0FBRUksTUFBQSxTQUFTLEVBQUUsSUFGZjtBQUdJLE1BQUEsVUFBVSxFQUFFLEtBQUtwRCxLQUFMLENBQVdxRSxVQUgzQjtBQUlJLE1BQUEsS0FBSyxFQUFFLHlCQUFHLGVBQUg7QUFKWCxPQU1LSixPQU5MLENBREo7QUFVSDs7QUFySnFFLEMsc0RBQ25EO0FBQ2Z6RCxFQUFBQSxPQUFPLEVBQUU4RCxtQkFBVUMsTUFBVixDQUFpQkM7QUFEWCxDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE5IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cbkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG55b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG5Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcblxuICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuXG5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG5kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG5XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cblNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCBQcm9wVHlwZXMgZnJvbSAncHJvcC10eXBlcyc7XG5pbXBvcnQge01hdHJpeENsaWVudFBlZ30gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgX3QgfSBmcm9tICcuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXInO1xuaW1wb3J0ICogYXMgc2RrIGZyb20gXCIuLi8uLi8uLi9pbmRleFwiO1xuaW1wb3J0IHt3YW50c0RhdGVTZXBhcmF0b3J9IGZyb20gJy4uLy4uLy4uL0RhdGVVdGlscyc7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tICcuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlJztcbmltcG9ydCB7cmVwbGFjZWFibGVDb21wb25lbnR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yZXBsYWNlYWJsZUNvbXBvbmVudFwiO1xuXG5AcmVwbGFjZWFibGVDb21wb25lbnQoXCJ2aWV3cy5kaWFsb2dzLk1lc3NhZ2VFZGl0SGlzdG9yeURpYWxvZ1wiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVzc2FnZUVkaXRIaXN0b3J5RGlhbG9nIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudCB7XG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgbXhFdmVudDogUHJvcFR5cGVzLm9iamVjdC5pc1JlcXVpcmVkLFxuICAgIH07XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiBudWxsLFxuICAgICAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICAgICAgICBldmVudHM6IFtdLFxuICAgICAgICAgICAgbmV4dEJhdGNoOiBudWxsLFxuICAgICAgICAgICAgaXNMb2FkaW5nOiB0cnVlLFxuICAgICAgICAgICAgaXNUd2VsdmVIb3VyOiBTZXR0aW5nc1N0b3JlLmdldFZhbHVlKFwic2hvd1R3ZWx2ZUhvdXJUaW1lc3RhbXBzXCIpLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGxvYWRNb3JlRWRpdHMgPSBhc3luYyAoYmFja3dhcmRzKSA9PiB7XG4gICAgICAgIGlmIChiYWNrd2FyZHMgfHwgKCF0aGlzLnN0YXRlLm5leHRCYXRjaCAmJiAhdGhpcy5zdGF0ZS5pc0xvYWRpbmcpKSB7XG4gICAgICAgICAgICAvLyBiYWlsIG91dCBvbiBiYWNrd2FyZHMgYXMgd2Ugb25seSBwYWdpbmF0ZSBpbiBvbmUgZGlyZWN0aW9uXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0cyA9IHtmcm9tOiB0aGlzLnN0YXRlLm5leHRCYXRjaH07XG4gICAgICAgIGNvbnN0IHJvb21JZCA9IHRoaXMucHJvcHMubXhFdmVudC5nZXRSb29tSWQoKTtcbiAgICAgICAgY29uc3QgZXZlbnRJZCA9IHRoaXMucHJvcHMubXhFdmVudC5nZXRJZCgpO1xuICAgICAgICBjb25zdCBjbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCByZXNvbHZlO1xuICAgICAgICBsZXQgcmVqZWN0O1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKF9yZXNvbHZlLCBfcmVqZWN0KSA9PiB7cmVzb2x2ZSA9IF9yZXNvbHZlOyByZWplY3QgPSBfcmVqZWN0O30pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzdWx0ID0gYXdhaXQgY2xpZW50LnJlbGF0aW9ucyhcbiAgICAgICAgICAgICAgICByb29tSWQsIGV2ZW50SWQsIFwibS5yZXBsYWNlXCIsIFwibS5yb29tLm1lc3NhZ2VcIiwgb3B0cyk7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICAvLyBsb2cgaWYgdGhlIHNlcnZlciByZXR1cm5lZCBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKGVycm9yLmVycmNvZGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiZmV0Y2hpbmcgL3JlbGF0aW9ucyBmYWlsZWQgd2l0aCBlcnJvclwiLCBlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtlcnJvcn0sICgpID0+IHJlamVjdChlcnJvcikpO1xuICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBuZXdFdmVudHMgPSByZXN1bHQuZXZlbnRzO1xuICAgICAgICB0aGlzLl9sb2NhbGx5UmVkYWN0RXZlbnRzSWZOZWVkZWQobmV3RXZlbnRzKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBvcmlnaW5hbEV2ZW50OiB0aGlzLnN0YXRlLm9yaWdpbmFsRXZlbnQgfHwgcmVzdWx0Lm9yaWdpbmFsRXZlbnQsXG4gICAgICAgICAgICBldmVudHM6IHRoaXMuc3RhdGUuZXZlbnRzLmNvbmNhdChuZXdFdmVudHMpLFxuICAgICAgICAgICAgbmV4dEJhdGNoOiByZXN1bHQubmV4dEJhdGNoLFxuICAgICAgICAgICAgaXNMb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgfSwgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgaGFzTW9yZVJlc3VsdHMgPSAhIXRoaXMuc3RhdGUubmV4dEJhdGNoO1xuICAgICAgICAgICAgcmVzb2x2ZShoYXNNb3JlUmVzdWx0cyk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9XG5cbiAgICBfbG9jYWxseVJlZGFjdEV2ZW50c0lmTmVlZGVkKG5ld0V2ZW50cykge1xuICAgICAgICBjb25zdCByb29tSWQgPSB0aGlzLnByb3BzLm14RXZlbnQuZ2V0Um9vbUlkKCk7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcbiAgICAgICAgY29uc3Qgcm9vbSA9IGNsaWVudC5nZXRSb29tKHJvb21JZCk7XG4gICAgICAgIGNvbnN0IHBlbmRpbmdFdmVudHMgPSByb29tLmdldFBlbmRpbmdFdmVudHMoKTtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIG5ld0V2ZW50cykge1xuICAgICAgICAgICAgY29uc3QgcGVuZGluZ1JlZGFjdGlvbiA9IHBlbmRpbmdFdmVudHMuZmluZChwZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBlLmdldFR5cGUoKSA9PT0gXCJtLnJvb20ucmVkYWN0aW9uXCIgJiYgcGUuZ2V0QXNzb2NpYXRlZElkKCkgPT09IGUuZ2V0SWQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHBlbmRpbmdSZWRhY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBlLm1hcmtMb2NhbGx5UmVkYWN0ZWQocGVuZGluZ1JlZGFjdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wb25lbnREaWRNb3VudCgpIHtcbiAgICAgICAgdGhpcy5sb2FkTW9yZUVkaXRzKCk7XG4gICAgfVxuXG4gICAgX3JlbmRlckVkaXRzKCkge1xuICAgICAgICBjb25zdCBFZGl0SGlzdG9yeU1lc3NhZ2UgPSBzZGsuZ2V0Q29tcG9uZW50KCdtZXNzYWdlcy5FZGl0SGlzdG9yeU1lc3NhZ2UnKTtcbiAgICAgICAgY29uc3QgRGF0ZVNlcGFyYXRvciA9IHNkay5nZXRDb21wb25lbnQoJ21lc3NhZ2VzLkRhdGVTZXBhcmF0b3InKTtcbiAgICAgICAgY29uc3Qgbm9kZXMgPSBbXTtcbiAgICAgICAgbGV0IGxhc3RFdmVudDtcbiAgICAgICAgbGV0IGFsbEV2ZW50cyA9IHRoaXMuc3RhdGUuZXZlbnRzO1xuICAgICAgICAvLyBhcHBlbmQgb3JpZ2luYWwgZXZlbnQgd2hlbiB3ZSd2ZSBkb25lIGxhc3QgcGFnaW5hdGlvblxuICAgICAgICBpZiAodGhpcy5zdGF0ZS5vcmlnaW5hbEV2ZW50ICYmICF0aGlzLnN0YXRlLm5leHRCYXRjaCkge1xuICAgICAgICAgICAgYWxsRXZlbnRzID0gYWxsRXZlbnRzLmNvbmNhdCh0aGlzLnN0YXRlLm9yaWdpbmFsRXZlbnQpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJhc2VFdmVudElkID0gdGhpcy5wcm9wcy5teEV2ZW50LmdldElkKCk7XG4gICAgICAgIGFsbEV2ZW50cy5mb3JFYWNoKChlLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWxhc3RFdmVudCB8fCB3YW50c0RhdGVTZXBhcmF0b3IobGFzdEV2ZW50LmdldERhdGUoKSwgZS5nZXREYXRlKCkpKSB7XG4gICAgICAgICAgICAgICAgbm9kZXMucHVzaCg8bGkga2V5PXtlLmdldFRzKCkgKyBcIn5cIn0+PERhdGVTZXBhcmF0b3IgdHM9e2UuZ2V0VHMoKX0gLz48L2xpPik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBpc0Jhc2VFdmVudCA9IGUuZ2V0SWQoKSA9PT0gYmFzZUV2ZW50SWQ7XG4gICAgICAgICAgICBub2Rlcy5wdXNoKChcbiAgICAgICAgICAgICAgICA8RWRpdEhpc3RvcnlNZXNzYWdlXG4gICAgICAgICAgICAgICAgICAgIGtleT17ZS5nZXRJZCgpfVxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0VkaXQ9eyFpc0Jhc2VFdmVudCA/IGFsbEV2ZW50c1tpICsgMV0gOiBudWxsfVxuICAgICAgICAgICAgICAgICAgICBpc0Jhc2VFdmVudD17aXNCYXNlRXZlbnR9XG4gICAgICAgICAgICAgICAgICAgIG14RXZlbnQ9e2V9XG4gICAgICAgICAgICAgICAgICAgIGlzVHdlbHZlSG91cj17dGhpcy5zdGF0ZS5pc1R3ZWx2ZUhvdXJ9XG4gICAgICAgICAgICAgICAgLz4pKTtcbiAgICAgICAgICAgIGxhc3RFdmVudCA9IGU7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbm9kZXM7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgY29udGVudDtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHtlcnJvcn0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgaWYgKGVycm9yLmVycmNvZGUgPT09IFwiTV9VTlJFQ09HTklaRURcIikge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoPHAgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUVkaXRIaXN0b3J5RGlhbG9nX2Vycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcIllvdXIgaG9tZXNlcnZlciBkb2Vzbid0IHNlZW0gdG8gc3VwcG9ydCB0aGlzIGZlYXR1cmUuXCIpfVxuICAgICAgICAgICAgICAgIDwvcD4pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlcnJvci5lcnJjb2RlKSB7XG4gICAgICAgICAgICAgICAgLy8gc29tZSBraW5kIG9mIGVycm9yIGZyb20gdGhlIGhvbWVzZXJ2ZXJcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gKDxwIGNsYXNzTmFtZT1cIm14X01lc3NhZ2VFZGl0SGlzdG9yeURpYWxvZ19lcnJvclwiPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJTb21ldGhpbmcgd2VudCB3cm9uZyFcIil9XG4gICAgICAgICAgICAgICAgPC9wPik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSAoPHAgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUVkaXRIaXN0b3J5RGlhbG9nX2Vycm9yXCI+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcIkNhbm5vdCByZWFjaCBob21lc2VydmVyXCIpfVxuICAgICAgICAgICAgICAgICAgICA8YnIgLz5cbiAgICAgICAgICAgICAgICAgICAge190KFwiRW5zdXJlIHlvdSBoYXZlIGEgc3RhYmxlIGludGVybmV0IGNvbm5lY3Rpb24sIG9yIGdldCBpbiB0b3VjaCB3aXRoIHRoZSBzZXJ2ZXIgYWRtaW5cIil9XG4gICAgICAgICAgICAgICAgPC9wPik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZS5pc0xvYWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IFNwaW5uZXIgPSBzZGsuZ2V0Q29tcG9uZW50KFwiZWxlbWVudHMuU3Bpbm5lclwiKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSA8U3Bpbm5lciAvPjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IFNjcm9sbFBhbmVsID0gc2RrLmdldENvbXBvbmVudChcInN0cnVjdHVyZXMuU2Nyb2xsUGFuZWxcIik7XG4gICAgICAgICAgICBjb250ZW50ID0gKDxTY3JvbGxQYW5lbFxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X01lc3NhZ2VFZGl0SGlzdG9yeURpYWxvZ19zY3JvbGxQYW5lbFwiXG4gICAgICAgICAgICAgICAgb25GaWxsUmVxdWVzdD17IHRoaXMubG9hZE1vcmVFZGl0cyB9XG4gICAgICAgICAgICAgICAgc3RpY2t5Qm90dG9tPXtmYWxzZX1cbiAgICAgICAgICAgICAgICBzdGFydEF0Qm90dG9tPXtmYWxzZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8dWwgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUVkaXRIaXN0b3J5RGlhbG9nX2VkaXRzIG14X01lc3NhZ2VQYW5lbF9hbHdheXNTaG93VGltZXN0YW1wc1wiPnt0aGlzLl9yZW5kZXJFZGl0cygpfTwvdWw+XG4gICAgICAgICAgICA8L1Njcm9sbFBhbmVsPik7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgQmFzZURpYWxvZyA9IHNkay5nZXRDb21wb25lbnQoJ3ZpZXdzLmRpYWxvZ3MuQmFzZURpYWxvZycpO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9J214X01lc3NhZ2VFZGl0SGlzdG9yeURpYWxvZydcbiAgICAgICAgICAgICAgICBoYXNDYW5jZWw9e3RydWV9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfVxuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcIk1lc3NhZ2UgZWRpdHNcIil9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2NvbnRlbnR9XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl19