matrix-react-sdk
Version:
SDK for matrix.org using React
178 lines (175 loc) • 30 kB
JavaScript
"use strict";
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 = _interopRequireWildcard(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _classnames = _interopRequireDefault(require("classnames"));
var HtmlUtils = _interopRequireWildcard(require("../../../HtmlUtils"));
var _MessageDiffUtils = require("../../../utils/MessageDiffUtils");
var _DateUtils = require("../../../DateUtils");
var _pillify = require("../../../utils/pillify");
var _tooltipify = require("../../../utils/tooltipify");
var _languageHandler = require("../../../languageHandler");
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _RedactedBody = _interopRequireDefault(require("./RedactedBody"));
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _ConfirmAndWaitRedactDialog = _interopRequireDefault(require("../dialogs/ConfirmAndWaitRedactDialog"));
var _ViewSource = _interopRequireDefault(require("../../structures/ViewSource"));
var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
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 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.
*/
function getReplacedContent(event) {
const originalContent = event.getOriginalContent();
return originalContent["m.new_content"] || originalContent;
}
class EditHistoryMessage extends _react.default.PureComponent {
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "content", /*#__PURE__*/(0, _react.createRef)());
(0, _defineProperty2.default)(this, "pills", []);
(0, _defineProperty2.default)(this, "tooltips", []);
(0, _defineProperty2.default)(this, "onAssociatedStatusChanged", () => {
this.setState({
sendStatus: this.props.mxEvent.getAssociatedStatus()
});
});
(0, _defineProperty2.default)(this, "onRedactClick", async () => {
const event = this.props.mxEvent;
const cli = this.context;
_Modal.default.createDialog(_ConfirmAndWaitRedactDialog.default, {
event,
redact: async () => {
await cli.redactEvent(event.getRoomId(), event.getId());
}
}, "mx_Dialog_confirmredact");
});
(0, _defineProperty2.default)(this, "onViewSourceClick", () => {
_Modal.default.createDialog(_ViewSource.default, {
mxEvent: this.props.mxEvent,
ignoreEdits: true
}, "mx_Dialog_viewsource");
});
const _cli = this.context;
const userId = _cli.getSafeUserId();
const _event = this.props.mxEvent;
const room = _cli.getRoom(_event.getRoomId());
_event.localRedactionEvent()?.on(_matrix.MatrixEventEvent.Status, this.onAssociatedStatusChanged);
const canRedact = room?.currentState.maySendRedactionForEvent(_event, userId) ?? false;
this.state = {
canRedact,
sendStatus: _event.getAssociatedStatus()
};
}
pillifyLinks() {
// not present for redacted events
if (this.content.current) {
(0, _pillify.pillifyLinks)(this.context, this.content.current.children, this.props.mxEvent, this.pills);
}
}
tooltipifyLinks() {
// not present for redacted events
if (this.content.current) {
(0, _tooltipify.tooltipifyLinks)(this.content.current.children, this.pills, this.tooltips);
}
}
componentDidMount() {
this.pillifyLinks();
this.tooltipifyLinks();
}
componentWillUnmount() {
(0, _pillify.unmountPills)(this.pills);
(0, _tooltipify.unmountTooltips)(this.tooltips);
const event = this.props.mxEvent;
event.localRedactionEvent()?.off(_matrix.MatrixEventEvent.Status, this.onAssociatedStatusChanged);
}
componentDidUpdate() {
this.pillifyLinks();
this.tooltipifyLinks();
}
renderActionBar() {
// hide the button when already redacted
let redactButton;
if (!this.props.mxEvent.isRedacted() && !this.props.isBaseEvent && this.state.canRedact) {
redactButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onRedactClick
}, (0, _languageHandler._t)("action|remove"));
}
let viewSourceButton;
if (_SettingsStore.default.getValue("developerMode")) {
viewSourceButton = /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onViewSourceClick
}, (0, _languageHandler._t)("action|view_source"));
}
if (!redactButton && !viewSourceButton) {
// Hide the empty MessageActionBar
return null;
} else {
// disabled remove button when not allowed
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_MessageActionBar"
}, redactButton, viewSourceButton);
}
}
render() {
const {
mxEvent
} = this.props;
const content = getReplacedContent(mxEvent);
let contentContainer;
if (mxEvent.isRedacted()) {
contentContainer = /*#__PURE__*/_react.default.createElement(_RedactedBody.default, {
mxEvent: this.props.mxEvent
});
} else {
let contentElements;
if (this.props.previousEdit) {
contentElements = (0, _MessageDiffUtils.editBodyDiffToHtml)(getReplacedContent(this.props.previousEdit), content);
} else {
contentElements = HtmlUtils.bodyToSpan(content, null, {
stripReplyFallback: true
});
}
if (mxEvent.getContent().msgtype === _matrix.MsgType.Emote) {
const name = mxEvent.sender ? mxEvent.sender.name : mxEvent.getSender();
contentContainer = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_EventTile_content",
ref: this.content
}, "*\xA0", /*#__PURE__*/_react.default.createElement("span", {
className: "mx_MEmoteBody_sender"
}, name), "\xA0", contentElements);
} else {
contentContainer = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_EventTile_content",
ref: this.content
}, contentElements);
}
}
const timestamp = (0, _DateUtils.formatTime)(new Date(mxEvent.getTs()), this.props.isTwelveHour);
const isSending = ["sending", "queued", "encrypting"].includes(this.state.sendStatus);
const classes = (0, _classnames.default)("mx_EventTile", {
// Note: we keep the `sending` state class for tests, not for our styles
mx_EventTile_sending: isSending
});
return /*#__PURE__*/_react.default.createElement("li", null, /*#__PURE__*/_react.default.createElement("div", {
className: classes
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_EventTile_line"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_MessageTimestamp"
}, timestamp), contentContainer, this.renderActionBar())));
}
}
exports.default = EditHistoryMessage;
(0, _defineProperty2.default)(EditHistoryMessage, "contextType", _MatrixClientContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbWF0cml4IiwiX2NsYXNzbmFtZXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiSHRtbFV0aWxzIiwiX01lc3NhZ2VEaWZmVXRpbHMiLCJfRGF0ZVV0aWxzIiwiX3BpbGxpZnkiLCJfdG9vbHRpcGlmeSIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTW9kYWwiLCJfUmVkYWN0ZWRCb2R5IiwiX0FjY2Vzc2libGVCdXR0b24iLCJfQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2ciLCJfVmlld1NvdXJjZSIsIl9TZXR0aW5nc1N0b3JlIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJnZXRSZXBsYWNlZENvbnRlbnQiLCJldmVudCIsIm9yaWdpbmFsQ29udGVudCIsImdldE9yaWdpbmFsQ29udGVudCIsIkVkaXRIaXN0b3J5TWVzc2FnZSIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjb250ZXh0IiwiX2RlZmluZVByb3BlcnR5MiIsImNyZWF0ZVJlZiIsInNldFN0YXRlIiwic2VuZFN0YXR1cyIsIm14RXZlbnQiLCJnZXRBc3NvY2lhdGVkU3RhdHVzIiwiY2xpIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJDb25maXJtQW5kV2FpdFJlZGFjdERpYWxvZyIsInJlZGFjdCIsInJlZGFjdEV2ZW50IiwiZ2V0Um9vbUlkIiwiZ2V0SWQiLCJWaWV3U291cmNlIiwiaWdub3JlRWRpdHMiLCJ1c2VySWQiLCJnZXRTYWZlVXNlcklkIiwicm9vbSIsImdldFJvb20iLCJsb2NhbFJlZGFjdGlvbkV2ZW50Iiwib24iLCJNYXRyaXhFdmVudEV2ZW50IiwiU3RhdHVzIiwib25Bc3NvY2lhdGVkU3RhdHVzQ2hhbmdlZCIsImNhblJlZGFjdCIsImN1cnJlbnRTdGF0ZSIsIm1heVNlbmRSZWRhY3Rpb25Gb3JFdmVudCIsInN0YXRlIiwicGlsbGlmeUxpbmtzIiwiY29udGVudCIsImN1cnJlbnQiLCJjaGlsZHJlbiIsInBpbGxzIiwidG9vbHRpcGlmeUxpbmtzIiwidG9vbHRpcHMiLCJjb21wb25lbnREaWRNb3VudCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwidW5tb3VudFBpbGxzIiwidW5tb3VudFRvb2x0aXBzIiwib2ZmIiwiY29tcG9uZW50RGlkVXBkYXRlIiwicmVuZGVyQWN0aW9uQmFyIiwicmVkYWN0QnV0dG9uIiwiaXNSZWRhY3RlZCIsImlzQmFzZUV2ZW50IiwiY3JlYXRlRWxlbWVudCIsIm9uQ2xpY2siLCJvblJlZGFjdENsaWNrIiwiX3QiLCJ2aWV3U291cmNlQnV0dG9uIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwib25WaWV3U291cmNlQ2xpY2siLCJjbGFzc05hbWUiLCJyZW5kZXIiLCJjb250ZW50Q29udGFpbmVyIiwiY29udGVudEVsZW1lbnRzIiwicHJldmlvdXNFZGl0IiwiZWRpdEJvZHlEaWZmVG9IdG1sIiwiYm9keVRvU3BhbiIsInN0cmlwUmVwbHlGYWxsYmFjayIsImdldENvbnRlbnQiLCJtc2d0eXBlIiwiTXNnVHlwZSIsIkVtb3RlIiwibmFtZSIsInNlbmRlciIsImdldFNlbmRlciIsInJlZiIsInRpbWVzdGFtcCIsImZvcm1hdFRpbWUiLCJEYXRlIiwiZ2V0VHMiLCJpc1R3ZWx2ZUhvdXIiLCJpc1NlbmRpbmciLCJpbmNsdWRlcyIsImNsYXNzZXMiLCJjbGFzc05hbWVzIiwibXhfRXZlbnRUaWxlX3NlbmRpbmciLCJleHBvcnRzIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL21lc3NhZ2VzL0VkaXRIaXN0b3J5TWVzc2FnZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IGNyZWF0ZVJlZiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgRXZlbnRTdGF0dXMsIElDb250ZW50LCBNYXRyaXhFdmVudCwgTWF0cml4RXZlbnRFdmVudCwgTXNnVHlwZSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5cbmltcG9ydCAqIGFzIEh0bWxVdGlscyBmcm9tIFwiLi4vLi4vLi4vSHRtbFV0aWxzXCI7XG5pbXBvcnQgeyBlZGl0Qm9keURpZmZUb0h0bWwgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvTWVzc2FnZURpZmZVdGlsc1wiO1xuaW1wb3J0IHsgZm9ybWF0VGltZSB9IGZyb20gXCIuLi8uLi8uLi9EYXRlVXRpbHNcIjtcbmltcG9ydCB7IHBpbGxpZnlMaW5rcywgdW5tb3VudFBpbGxzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3BpbGxpZnlcIjtcbmltcG9ydCB7IHRvb2x0aXBpZnlMaW5rcywgdW5tb3VudFRvb2x0aXBzIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Rvb2x0aXBpZnlcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFJlZGFjdGVkQm9keSBmcm9tIFwiLi9SZWRhY3RlZEJvZHlcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2cgZnJvbSBcIi4uL2RpYWxvZ3MvQ29uZmlybUFuZFdhaXRSZWRhY3REaWFsb2dcIjtcbmltcG9ydCBWaWV3U291cmNlIGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL1ZpZXdTb3VyY2VcIjtcbmltcG9ydCBTZXR0aW5nc1N0b3JlIGZyb20gXCIuLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nc1N0b3JlXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuXG5mdW5jdGlvbiBnZXRSZXBsYWNlZENvbnRlbnQoZXZlbnQ6IE1hdHJpeEV2ZW50KTogSUNvbnRlbnQge1xuICAgIGNvbnN0IG9yaWdpbmFsQ29udGVudCA9IGV2ZW50LmdldE9yaWdpbmFsQ29udGVudCgpO1xuICAgIHJldHVybiBvcmlnaW5hbENvbnRlbnRbXCJtLm5ld19jb250ZW50XCJdIHx8IG9yaWdpbmFsQ29udGVudDtcbn1cblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgLy8gdGhlIG1lc3NhZ2UgZXZlbnQgYmVpbmcgZWRpdGVkXG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7XG4gICAgcHJldmlvdXNFZGl0PzogTWF0cml4RXZlbnQ7XG4gICAgaXNCYXNlRXZlbnQ/OiBib29sZWFuO1xuICAgIGlzVHdlbHZlSG91cj86IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGNhblJlZGFjdDogYm9vbGVhbjtcbiAgICBzZW5kU3RhdHVzOiBFdmVudFN0YXR1cyB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEVkaXRIaXN0b3J5TWVzc2FnZSBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwdWJsaWMgc3RhdGljIGNvbnRleHRUeXBlID0gTWF0cml4Q2xpZW50Q29udGV4dDtcbiAgICBwdWJsaWMgZGVjbGFyZSBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD47XG5cbiAgICBwcml2YXRlIGNvbnRlbnQgPSBjcmVhdGVSZWY8SFRNTERpdkVsZW1lbnQ+KCk7XG4gICAgcHJpdmF0ZSBwaWxsczogRWxlbWVudFtdID0gW107XG4gICAgcHJpdmF0ZSB0b29sdGlwczogRWxlbWVudFtdID0gW107XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcywgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+KSB7XG4gICAgICAgIHN1cGVyKHByb3BzLCBjb250ZXh0KTtcblxuICAgICAgICBjb25zdCBjbGkgPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGNvbnN0IHVzZXJJZCA9IGNsaS5nZXRTYWZlVXNlcklkKCk7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wcm9wcy5teEV2ZW50O1xuICAgICAgICBjb25zdCByb29tID0gY2xpLmdldFJvb20oZXZlbnQuZ2V0Um9vbUlkKCkpO1xuICAgICAgICBldmVudC5sb2NhbFJlZGFjdGlvbkV2ZW50KCk/Lm9uKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCB0aGlzLm9uQXNzb2NpYXRlZFN0YXR1c0NoYW5nZWQpO1xuICAgICAgICBjb25zdCBjYW5SZWRhY3QgPSByb29tPy5jdXJyZW50U3RhdGUubWF5U2VuZFJlZGFjdGlvbkZvckV2ZW50KGV2ZW50LCB1c2VySWQpID8/IGZhbHNlO1xuICAgICAgICB0aGlzLnN0YXRlID0geyBjYW5SZWRhY3QsIHNlbmRTdGF0dXM6IGV2ZW50LmdldEFzc29jaWF0ZWRTdGF0dXMoKSB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Bc3NvY2lhdGVkU3RhdHVzQ2hhbmdlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IHNlbmRTdGF0dXM6IHRoaXMucHJvcHMubXhFdmVudC5nZXRBc3NvY2lhdGVkU3RhdHVzKCkgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25SZWRhY3RDbGljayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG4gICAgICAgIGNvbnN0IGNsaSA9IHRoaXMuY29udGV4dDtcblxuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICBDb25maXJtQW5kV2FpdFJlZGFjdERpYWxvZyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICByZWRhY3Q6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgY2xpLnJlZGFjdEV2ZW50KGV2ZW50LmdldFJvb21JZCgpISwgZXZlbnQuZ2V0SWQoKSEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgXCJteF9EaWFsb2dfY29uZmlybXJlZGFjdFwiLFxuICAgICAgICApO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uVmlld1NvdXJjZUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coXG4gICAgICAgICAgICBWaWV3U291cmNlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG14RXZlbnQ6IHRoaXMucHJvcHMubXhFdmVudCxcbiAgICAgICAgICAgICAgICBpZ25vcmVFZGl0czogdHJ1ZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIm14X0RpYWxvZ192aWV3c291cmNlXCIsXG4gICAgICAgICk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcGlsbGlmeUxpbmtzKCk6IHZvaWQge1xuICAgICAgICAvLyBub3QgcHJlc2VudCBmb3IgcmVkYWN0ZWQgZXZlbnRzXG4gICAgICAgIGlmICh0aGlzLmNvbnRlbnQuY3VycmVudCkge1xuICAgICAgICAgICAgcGlsbGlmeUxpbmtzKHRoaXMuY29udGV4dCwgdGhpcy5jb250ZW50LmN1cnJlbnQuY2hpbGRyZW4sIHRoaXMucHJvcHMubXhFdmVudCwgdGhpcy5waWxscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRvb2x0aXBpZnlMaW5rcygpOiB2b2lkIHtcbiAgICAgICAgLy8gbm90IHByZXNlbnQgZm9yIHJlZGFjdGVkIGV2ZW50c1xuICAgICAgICBpZiAodGhpcy5jb250ZW50LmN1cnJlbnQpIHtcbiAgICAgICAgICAgIHRvb2x0aXBpZnlMaW5rcyh0aGlzLmNvbnRlbnQuY3VycmVudC5jaGlsZHJlbiwgdGhpcy5waWxscywgdGhpcy50b29sdGlwcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlsbGlmeUxpbmtzKCk7XG4gICAgICAgIHRoaXMudG9vbHRpcGlmeUxpbmtzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB1bm1vdW50UGlsbHModGhpcy5waWxscyk7XG4gICAgICAgIHVubW91bnRUb29sdGlwcyh0aGlzLnRvb2x0aXBzKTtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG4gICAgICAgIGV2ZW50LmxvY2FsUmVkYWN0aW9uRXZlbnQoKT8ub2ZmKE1hdHJpeEV2ZW50RXZlbnQuU3RhdHVzLCB0aGlzLm9uQXNzb2NpYXRlZFN0YXR1c0NoYW5nZWQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRVcGRhdGUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucGlsbGlmeUxpbmtzKCk7XG4gICAgICAgIHRoaXMudG9vbHRpcGlmeUxpbmtzKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZW5kZXJBY3Rpb25CYXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgLy8gaGlkZSB0aGUgYnV0dG9uIHdoZW4gYWxyZWFkeSByZWRhY3RlZFxuICAgICAgICBsZXQgcmVkYWN0QnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLm14RXZlbnQuaXNSZWRhY3RlZCgpICYmICF0aGlzLnByb3BzLmlzQmFzZUV2ZW50ICYmIHRoaXMuc3RhdGUuY2FuUmVkYWN0KSB7XG4gICAgICAgICAgICByZWRhY3RCdXR0b24gPSA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uUmVkYWN0Q2xpY2t9PntfdChcImFjdGlvbnxyZW1vdmVcIil9PC9BY2Nlc3NpYmxlQnV0dG9uPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aWV3U291cmNlQnV0dG9uOiBKU1guRWxlbWVudCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJkZXZlbG9wZXJNb2RlXCIpKSB7XG4gICAgICAgICAgICB2aWV3U291cmNlQnV0dG9uID0gKFxuICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uIG9uQ2xpY2s9e3RoaXMub25WaWV3U291cmNlQ2xpY2t9PntfdChcImFjdGlvbnx2aWV3X3NvdXJjZVwiKX08L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFyZWRhY3RCdXR0b24gJiYgIXZpZXdTb3VyY2VCdXR0b24pIHtcbiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGVtcHR5IE1lc3NhZ2VBY3Rpb25CYXJcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gZGlzYWJsZWQgcmVtb3ZlIGJ1dHRvbiB3aGVuIG5vdCBhbGxvd2VkXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTWVzc2FnZUFjdGlvbkJhclwiPlxuICAgICAgICAgICAgICAgICAgICB7cmVkYWN0QnV0dG9ufVxuICAgICAgICAgICAgICAgICAgICB7dmlld1NvdXJjZUJ1dHRvbn1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IHsgbXhFdmVudCB9ID0gdGhpcy5wcm9wcztcbiAgICAgICAgY29uc3QgY29udGVudCA9IGdldFJlcGxhY2VkQ29udGVudChteEV2ZW50KTtcbiAgICAgICAgbGV0IGNvbnRlbnRDb250YWluZXI7XG4gICAgICAgIGlmIChteEV2ZW50LmlzUmVkYWN0ZWQoKSkge1xuICAgICAgICAgICAgY29udGVudENvbnRhaW5lciA9IDxSZWRhY3RlZEJvZHkgbXhFdmVudD17dGhpcy5wcm9wcy5teEV2ZW50fSAvPjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjb250ZW50RWxlbWVudHM7XG4gICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5wcmV2aW91c0VkaXQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RWxlbWVudHMgPSBlZGl0Qm9keURpZmZUb0h0bWwoZ2V0UmVwbGFjZWRDb250ZW50KHRoaXMucHJvcHMucHJldmlvdXNFZGl0KSwgY29udGVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRFbGVtZW50cyA9IEh0bWxVdGlscy5ib2R5VG9TcGFuKGNvbnRlbnQsIG51bGwsIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaXBSZXBseUZhbGxiYWNrOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG14RXZlbnQuZ2V0Q29udGVudCgpLm1zZ3R5cGUgPT09IE1zZ1R5cGUuRW1vdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gbXhFdmVudC5zZW5kZXIgPyBteEV2ZW50LnNlbmRlci5uYW1lIDogbXhFdmVudC5nZXRTZW5kZXIoKTtcbiAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVyID0gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0V2ZW50VGlsZV9jb250ZW50XCIgcmVmPXt0aGlzLmNvbnRlbnR9PlxuICAgICAgICAgICAgICAgICAgICAgICAgKiZuYnNwO1xuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfTUVtb3RlQm9keV9zZW5kZXJcIj57bmFtZX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAmbmJzcDt7Y29udGVudEVsZW1lbnRzfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVyID0gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0V2ZW50VGlsZV9jb250ZW50XCIgcmVmPXt0aGlzLmNvbnRlbnR9PlxuICAgICAgICAgICAgICAgICAgICAgICAge2NvbnRlbnRFbGVtZW50c31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHRpbWVzdGFtcCA9IGZvcm1hdFRpbWUobmV3IERhdGUobXhFdmVudC5nZXRUcygpKSwgdGhpcy5wcm9wcy5pc1R3ZWx2ZUhvdXIpO1xuICAgICAgICBjb25zdCBpc1NlbmRpbmcgPSBbXCJzZW5kaW5nXCIsIFwicXVldWVkXCIsIFwiZW5jcnlwdGluZ1wiXS5pbmNsdWRlcyh0aGlzLnN0YXRlLnNlbmRTdGF0dXMhKTtcbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9FdmVudFRpbGVcIiwge1xuICAgICAgICAgICAgLy8gTm90ZTogd2Uga2VlcCB0aGUgYHNlbmRpbmdgIHN0YXRlIGNsYXNzIGZvciB0ZXN0cywgbm90IGZvciBvdXIgc3R5bGVzXG4gICAgICAgICAgICBteF9FdmVudFRpbGVfc2VuZGluZzogaXNTZW5kaW5nLFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxsaT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRXZlbnRUaWxlX2xpbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14X01lc3NhZ2VUaW1lc3RhbXBcIj57dGltZXN0YW1wfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtjb250ZW50Q29udGFpbmVyfVxuICAgICAgICAgICAgICAgICAgICAgICAge3RoaXMucmVuZGVyQWN0aW9uQmFyKCl9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9saT5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksU0FBQSxHQUFBTCx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUssaUJBQUEsR0FBQUwsT0FBQTtBQUNBLElBQUFNLFVBQUEsR0FBQU4sT0FBQTtBQUNBLElB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