matrix-react-sdk
Version:
SDK for matrix.org using React
160 lines (153 loc) • 27.3 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 = _interopRequireDefault(require("react"));
var _SyntaxHighlight = _interopRequireDefault(require("../views/elements/SyntaxHighlight"));
var _languageHandler = require("../../languageHandler");
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _EventUtils = require("../../utils/EventUtils");
var _MatrixClientPeg = require("../../MatrixClientPeg");
var _BaseDialog = _interopRequireDefault(require("../views/dialogs/BaseDialog"));
var _BaseTool = require("../views/dialogs/devtools/BaseTool");
var _RoomState = require("../views/dialogs/devtools/RoomState");
var _Event = require("../views/dialogs/devtools/Event");
var _CopyableText = _interopRequireDefault(require("../views/elements/CopyableText"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2019 Michael Telatynski <7t3chguy@gmail.com>
Copyright 2015, 2016 , 2019, 2023 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.
*/
class ViewSource extends _react.default.Component {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "onBack", () => {
// TODO: refresh the "Event ID:" modal header
this.setState({
isEditing: false
});
});
this.state = {
isEditing: false
};
}
onEdit() {
this.setState({
isEditing: true
});
}
// returns the dialog body for viewing the event source
viewSourceContent() {
let mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
if (this.props.ignoreEdits) {
mxEvent = this.props.mxEvent;
}
const isEncrypted = mxEvent.isEncrypted();
// @ts-ignore
const decryptedEventSource = mxEvent.clearEvent; // FIXME: clearEvent is private
const originalEventSource = mxEvent.event;
const copyOriginalFunc = () => {
return (0, _Event.stringify)(originalEventSource);
};
if (isEncrypted) {
const copyDecryptedFunc = () => {
return (0, _Event.stringify)(decryptedEventSource || {});
};
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("details", {
open: true,
className: "mx_ViewSource_details"
}, /*#__PURE__*/_react.default.createElement("summary", null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("devtools|view_source_decrypted_event_source"))), decryptedEventSource ? /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: copyDecryptedFunc
}, /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
language: "json"
}, (0, _Event.stringify)(decryptedEventSource))) : /*#__PURE__*/_react.default.createElement("div", null, (0, _languageHandler._t)("devtools|view_source_decrypted_event_source_unavailable"))), /*#__PURE__*/_react.default.createElement("details", {
className: "mx_ViewSource_details"
}, /*#__PURE__*/_react.default.createElement("summary", null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("devtools|original_event_source"))), /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: copyOriginalFunc
}, /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
language: "json"
}, (0, _Event.stringify)(originalEventSource)))));
} else {
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ViewSource_heading"
}, (0, _languageHandler._t)("devtools|original_event_source")), /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: copyOriginalFunc
}, /*#__PURE__*/_react.default.createElement(_SyntaxHighlight.default, {
language: "json"
}, (0, _Event.stringify)(originalEventSource))));
}
}
// returns the SendCustomEvent component prefilled with the correct details
editSourceContent() {
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isStateEvent = mxEvent.isState();
const roomId = mxEvent.getRoomId();
if (isStateEvent) {
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Consumer, null, cli => /*#__PURE__*/_react.default.createElement(_BaseTool.DevtoolsContext.Provider, {
value: {
room: cli.getRoom(roomId)
}
}, /*#__PURE__*/_react.default.createElement(_RoomState.StateEventEditor, {
onBack: this.onBack,
mxEvent: mxEvent
})));
}
return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Consumer, null, cli => /*#__PURE__*/_react.default.createElement(_BaseTool.DevtoolsContext.Provider, {
value: {
room: cli.getRoom(roomId)
}
}, /*#__PURE__*/_react.default.createElement(_Event.TimelineEventEditor, {
onBack: this.onBack,
mxEvent: mxEvent
})));
}
canSendStateEvent(mxEvent) {
const cli = _MatrixClientPeg.MatrixClientPeg.safeGet();
const room = cli.getRoom(mxEvent.getRoomId());
return !!room?.currentState.mayClientSendStateEvent(mxEvent.getType(), cli);
}
render() {
const mxEvent = this.props.mxEvent.replacingEvent() || this.props.mxEvent; // show the replacing event, not the original, if it is an edit
const isEditing = this.state.isEditing;
const roomId = mxEvent.getRoomId();
const eventId = mxEvent.getId();
const canEdit = mxEvent.isState() ? this.canSendStateEvent(mxEvent) : (0, _EventUtils.canEditContent)(_MatrixClientPeg.MatrixClientPeg.safeGet(), this.props.mxEvent);
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_ViewSource",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("action|view_source")
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ViewSource_header"
}, /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: () => roomId,
border: false
}, (0, _languageHandler._t)("devtools|room_id", {
roomId
})), /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: () => eventId,
border: false
}, (0, _languageHandler._t)("devtools|event_id", {
eventId
})), mxEvent.threadRootId && /*#__PURE__*/_react.default.createElement(_CopyableText.default, {
getTextToCopy: () => mxEvent.threadRootId,
border: false
}, (0, _languageHandler._t)("devtools|thread_root_id", {
threadRootId: mxEvent.threadRootId
}))), isEditing ? this.editSourceContent() : this.viewSourceContent(), !isEditing && canEdit && /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_buttons"
}, /*#__PURE__*/_react.default.createElement("button", {
onClick: () => this.onEdit()
}, (0, _languageHandler._t)("action|edit"))));
}
}
exports.default = ViewSource;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9TeW50YXhIaWdobGlnaHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfRXZlbnRVdGlscyIsIl9NYXRyaXhDbGllbnRQZWciLCJfQmFzZURpYWxvZyIsIl9CYXNlVG9vbCIsIl9Sb29tU3RhdGUiLCJfRXZlbnQiLCJfQ29weWFibGVUZXh0IiwiVmlld1NvdXJjZSIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJkZWZhdWx0Iiwic2V0U3RhdGUiLCJpc0VkaXRpbmciLCJzdGF0ZSIsIm9uRWRpdCIsInZpZXdTb3VyY2VDb250ZW50IiwibXhFdmVudCIsInJlcGxhY2luZ0V2ZW50IiwiaWdub3JlRWRpdHMiLCJpc0VuY3J5cHRlZCIsImRlY3J5cHRlZEV2ZW50U291cmNlIiwiY2xlYXJFdmVudCIsIm9yaWdpbmFsRXZlbnRTb3VyY2UiLCJldmVudCIsImNvcHlPcmlnaW5hbEZ1bmMiLCJzdHJpbmdpZnkiLCJjb3B5RGVjcnlwdGVkRnVuYyIsImNyZWF0ZUVsZW1lbnQiLCJGcmFnbWVudCIsIm9wZW4iLCJjbGFzc05hbWUiLCJfdCIsImdldFRleHRUb0NvcHkiLCJsYW5ndWFnZSIsImVkaXRTb3VyY2VDb250ZW50IiwiaXNTdGF0ZUV2ZW50IiwiaXNTdGF0ZSIsInJvb21JZCIsImdldFJvb21JZCIsIkNvbnN1bWVyIiwiY2xpIiwiRGV2dG9vbHNDb250ZXh0IiwiUHJvdmlkZXIiLCJ2YWx1ZSIsInJvb20iLCJnZXRSb29tIiwiU3RhdGVFdmVudEVkaXRvciIsIm9uQmFjayIsIlRpbWVsaW5lRXZlbnRFZGl0b3IiLCJjYW5TZW5kU3RhdGVFdmVudCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJjdXJyZW50U3RhdGUiLCJtYXlDbGllbnRTZW5kU3RhdGVFdmVudCIsImdldFR5cGUiLCJyZW5kZXIiLCJldmVudElkIiwiZ2V0SWQiLCJjYW5FZGl0IiwiY2FuRWRpdENvbnRlbnQiLCJvbkZpbmlzaGVkIiwidGl0bGUiLCJib3JkZXIiLCJ0aHJlYWRSb290SWQiLCJvbkNsaWNrIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvVmlld1NvdXJjZS50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTkgTWljaGFlbCBUZWxhdHluc2tpIDw3dDNjaGd1eUBnbWFpbC5jb20+XG5Db3B5cmlnaHQgMjAxNSwgMjAxNiAsIDIwMTksIDIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCBTeW50YXhIaWdobGlnaHQgZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL1N5bnRheEhpZ2hsaWdodFwiO1xuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgY2FuRWRpdENvbnRlbnQgfSBmcm9tIFwiLi4vLi4vdXRpbHMvRXZlbnRVdGlsc1wiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IEJhc2VEaWFsb2cgZnJvbSBcIi4uL3ZpZXdzL2RpYWxvZ3MvQmFzZURpYWxvZ1wiO1xuaW1wb3J0IHsgRGV2dG9vbHNDb250ZXh0IH0gZnJvbSBcIi4uL3ZpZXdzL2RpYWxvZ3MvZGV2dG9vbHMvQmFzZVRvb2xcIjtcbmltcG9ydCB7IFN0YXRlRXZlbnRFZGl0b3IgfSBmcm9tIFwiLi4vdmlld3MvZGlhbG9ncy9kZXZ0b29scy9Sb29tU3RhdGVcIjtcbmltcG9ydCB7IHN0cmluZ2lmeSwgVGltZWxpbmVFdmVudEVkaXRvciB9IGZyb20gXCIuLi92aWV3cy9kaWFsb2dzL2RldnRvb2xzL0V2ZW50XCI7XG5pbXBvcnQgQ29weWFibGVUZXh0IGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9Db3B5YWJsZVRleHRcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7IC8vIHRoZSBNYXRyaXhFdmVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRleHQgbWVudVxuICAgIGlnbm9yZUVkaXRzPzogYm9vbGVhbjtcbiAgICBvbkZpbmlzaGVkKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGlzRWRpdGluZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlld1NvdXJjZSBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaXNFZGl0aW5nOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uQmFjayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgLy8gVE9ETzogcmVmcmVzaCB0aGUgXCJFdmVudCBJRDpcIiBtb2RhbCBoZWFkZXJcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzRWRpdGluZzogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25FZGl0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNldFN0YXRlKHsgaXNFZGl0aW5nOiB0cnVlIH0pO1xuICAgIH1cblxuICAgIC8vIHJldHVybnMgdGhlIGRpYWxvZyBib2R5IGZvciB2aWV3aW5nIHRoZSBldmVudCBzb3VyY2VcbiAgICBwcml2YXRlIHZpZXdTb3VyY2VDb250ZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgbGV0IG14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQucmVwbGFjaW5nRXZlbnQoKSB8fCB0aGlzLnByb3BzLm14RXZlbnQ7IC8vIHNob3cgdGhlIHJlcGxhY2luZyBldmVudCwgbm90IHRoZSBvcmlnaW5hbCwgaWYgaXQgaXMgYW4gZWRpdFxuICAgICAgICBpZiAodGhpcy5wcm9wcy5pZ25vcmVFZGl0cykge1xuICAgICAgICAgICAgbXhFdmVudCA9IHRoaXMucHJvcHMubXhFdmVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzRW5jcnlwdGVkID0gbXhFdmVudC5pc0VuY3J5cHRlZCgpO1xuICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgIGNvbnN0IGRlY3J5cHRlZEV2ZW50U291cmNlID0gbXhFdmVudC5jbGVhckV2ZW50OyAvLyBGSVhNRTogY2xlYXJFdmVudCBpcyBwcml2YXRlXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsRXZlbnRTb3VyY2UgPSBteEV2ZW50LmV2ZW50O1xuICAgICAgICBjb25zdCBjb3B5T3JpZ2luYWxGdW5jID0gKCk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KG9yaWdpbmFsRXZlbnRTb3VyY2UpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvcHlEZWNyeXB0ZWRGdW5jID0gKCk6IHN0cmluZyA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeShkZWNyeXB0ZWRFdmVudFNvdXJjZSB8fCB7fSk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8ZGV0YWlscyBvcGVuIGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2VfZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImRldnRvb2xzfHZpZXdfc291cmNlX2RlY3J5cHRlZF9ldmVudF9zb3VyY2VcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9zdW1tYXJ5PlxuICAgICAgICAgICAgICAgICAgICAgICAge2RlY3J5cHRlZEV2ZW50U291cmNlID8gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb3B5YWJsZVRleHQgZ2V0VGV4dFRvQ29weT17Y29weURlY3J5cHRlZEZ1bmN9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3ludGF4SGlnaGxpZ2h0IGxhbmd1YWdlPVwianNvblwiPntzdHJpbmdpZnkoZGVjcnlwdGVkRXZlbnRTb3VyY2UpfTwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29weWFibGVUZXh0PlxuICAgICAgICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PntfdChcImRldnRvb2xzfHZpZXdfc291cmNlX2RlY3J5cHRlZF9ldmVudF9zb3VyY2VfdW5hdmFpbGFibGVcIil9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICA8L2RldGFpbHM+XG4gICAgICAgICAgICAgICAgICAgIDxkZXRhaWxzIGNsYXNzTmFtZT1cIm14X1ZpZXdTb3VyY2VfZGV0YWlsc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHN1bW1hcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkaW5nXCI+e190KFwiZGV2dG9vbHN8b3JpZ2luYWxfZXZlbnRfc291cmNlXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3VtbWFyeT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDb3B5YWJsZVRleHQgZ2V0VGV4dFRvQ29weT17Y29weU9yaWdpbmFsRnVuY30+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN5bnRheEhpZ2hsaWdodCBsYW5ndWFnZT1cImpzb25cIj57c3RyaW5naWZ5KG9yaWdpbmFsRXZlbnRTb3VyY2UpfTwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9Db3B5YWJsZVRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGV0YWlscz5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkaW5nXCI+e190KFwiZGV2dG9vbHN8b3JpZ2luYWxfZXZlbnRfc291cmNlXCIpfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8Q29weWFibGVUZXh0IGdldFRleHRUb0NvcHk9e2NvcHlPcmlnaW5hbEZ1bmN9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFN5bnRheEhpZ2hsaWdodCBsYW5ndWFnZT1cImpzb25cIj57c3RyaW5naWZ5KG9yaWdpbmFsRXZlbnRTb3VyY2UpfTwvU3ludGF4SGlnaGxpZ2h0PlxuICAgICAgICAgICAgICAgICAgICA8L0NvcHlhYmxlVGV4dD5cbiAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm5zIHRoZSBTZW5kQ3VzdG9tRXZlbnQgY29tcG9uZW50IHByZWZpbGxlZCB3aXRoIHRoZSBjb3JyZWN0IGRldGFpbHNcbiAgICBwcml2YXRlIGVkaXRTb3VyY2VDb250ZW50KCk6IEpTWC5FbGVtZW50IHtcbiAgICAgICAgY29uc3QgbXhFdmVudCA9IHRoaXMucHJvcHMubXhFdmVudC5yZXBsYWNpbmdFdmVudCgpIHx8IHRoaXMucHJvcHMubXhFdmVudDsgLy8gc2hvdyB0aGUgcmVwbGFjaW5nIGV2ZW50LCBub3QgdGhlIG9yaWdpbmFsLCBpZiBpdCBpcyBhbiBlZGl0XG5cbiAgICAgICAgY29uc3QgaXNTdGF0ZUV2ZW50ID0gbXhFdmVudC5pc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IHJvb21JZCA9IG14RXZlbnQuZ2V0Um9vbUlkKCk7XG5cbiAgICAgICAgaWYgKGlzU3RhdGVFdmVudCkge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8TWF0cml4Q2xpZW50Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICAgICAgICAgICAgeyhjbGkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgIDxEZXZ0b29sc0NvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3sgcm9vbTogY2xpLmdldFJvb20ocm9vbUlkKSEgfX0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0YXRlRXZlbnRFZGl0b3Igb25CYWNrPXt0aGlzLm9uQmFja30gbXhFdmVudD17bXhFdmVudH0gLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvRGV2dG9vbHNDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvTWF0cml4Q2xpZW50Q29udGV4dC5Db25zdW1lcj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPE1hdHJpeENsaWVudENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICAgICAgICAgeyhjbGkpID0+IChcbiAgICAgICAgICAgICAgICAgICAgPERldnRvb2xzQ29udGV4dC5Qcm92aWRlciB2YWx1ZT17eyByb29tOiBjbGkuZ2V0Um9vbShyb29tSWQpISB9fT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxUaW1lbGluZUV2ZW50RWRpdG9yIG9uQmFjaz17dGhpcy5vbkJhY2t9IG14RXZlbnQ9e214RXZlbnR9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvRGV2dG9vbHNDb250ZXh0LlByb3ZpZGVyPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L01hdHJpeENsaWVudENvbnRleHQuQ29uc3VtZXI+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYW5TZW5kU3RhdGVFdmVudChteEV2ZW50OiBNYXRyaXhFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBjbGkgPSBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpO1xuICAgICAgICBjb25zdCByb29tID0gY2xpLmdldFJvb20obXhFdmVudC5nZXRSb29tSWQoKSk7XG4gICAgICAgIHJldHVybiAhIXJvb20/LmN1cnJlbnRTdGF0ZS5tYXlDbGllbnRTZW5kU3RhdGVFdmVudChteEV2ZW50LmdldFR5cGUoKSwgY2xpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IG14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQucmVwbGFjaW5nRXZlbnQoKSB8fCB0aGlzLnByb3BzLm14RXZlbnQ7IC8vIHNob3cgdGhlIHJlcGxhY2luZyBldmVudCwgbm90IHRoZSBvcmlnaW5hbCwgaWYgaXQgaXMgYW4gZWRpdFxuXG4gICAgICAgIGNvbnN0IGlzRWRpdGluZyA9IHRoaXMuc3RhdGUuaXNFZGl0aW5nO1xuICAgICAgICBjb25zdCByb29tSWQgPSBteEV2ZW50LmdldFJvb21JZCgpITtcbiAgICAgICAgY29uc3QgZXZlbnRJZCA9IG14RXZlbnQuZ2V0SWQoKSE7XG4gICAgICAgIGNvbnN0IGNhbkVkaXQgPSBteEV2ZW50LmlzU3RhdGUoKVxuICAgICAgICAgICAgPyB0aGlzLmNhblNlbmRTdGF0ZUV2ZW50KG14RXZlbnQpXG4gICAgICAgICAgICA6IGNhbkVkaXRDb250ZW50KE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCksIHRoaXMucHJvcHMubXhFdmVudCk7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZyBjbGFzc05hbWU9XCJteF9WaWV3U291cmNlXCIgb25GaW5pc2hlZD17dGhpcy5wcm9wcy5vbkZpbmlzaGVkfSB0aXRsZT17X3QoXCJhY3Rpb258dmlld19zb3VyY2VcIil9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfVmlld1NvdXJjZV9oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPENvcHlhYmxlVGV4dCBnZXRUZXh0VG9Db3B5PXsoKSA9PiByb29tSWR9IGJvcmRlcj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICAgICAge190KFwiZGV2dG9vbHN8cm9vbV9pZFwiLCB7IHJvb21JZCB9KX1cbiAgICAgICAgICAgICAgICAgICAgPC9Db3B5YWJsZVRleHQ+XG4gICAgICAgICAgICAgICAgICAgIDxDb3B5YWJsZVRleHQgZ2V0VGV4dFRvQ29weT17KCkgPT4gZXZlbnRJZH0gYm9yZGVyPXtmYWxzZX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJkZXZ0b29sc3xldmVudF9pZFwiLCB7IGV2ZW50SWQgfSl9XG4gICAgICAgICAgICAgICAgICAgIDwvQ29weWFibGVUZXh0PlxuICAgICAgICAgICAgICAgICAgICB7bXhFdmVudC50aHJlYWRSb290SWQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPENvcHlhYmxlVGV4dCBnZXRUZXh0VG9Db3B5PXsoKSA9PiBteEV2ZW50LnRocmVhZFJvb3RJZCF9IGJvcmRlcj17ZmFsc2V9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImRldnRvb2xzfHRocmVhZF9yb290X2lkXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkUm9vdElkOiBteEV2ZW50LnRocmVhZFJvb3RJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQ29weWFibGVUZXh0PlxuICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtpc0VkaXRpbmcgPyB0aGlzLmVkaXRTb3VyY2VDb250ZW50KCkgOiB0aGlzLnZpZXdTb3VyY2VDb250ZW50KCl9XG4gICAgICAgICAgICAgICAgeyFpc0VkaXRpbmcgJiYgY2FuRWRpdCAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRGlhbG9nX2J1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gb25DbGljaz17KCkgPT4gdGhpcy5vbkVkaXQoKX0+e190KFwiYWN0aW9ufGVkaXRcIil9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVNBLElBQUFBLE1BQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLGdCQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxnQkFBQSxHQUFBRixPQUFBO0FB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