UNPKG

matrix-react-sdk

Version:
162 lines (160 loc) 31.2 kB
"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 _classnames = _interopRequireDefault(require("classnames")); var _matrix = require("matrix-js-sdk/src/matrix"); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../languageHandler"); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _actions = require("../../../dispatcher/actions"); var _SenderProfile = _interopRequireDefault(require("../messages/SenderProfile")); var _MImageReplyBody = _interopRequireDefault(require("../messages/MImageReplyBody")); var _EventUtils = require("../../../utils/EventUtils"); var _EventRenderingUtils = require("../../../utils/EventRenderingUtils"); var _MFileBody = _interopRequireDefault(require("../messages/MFileBody")); var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar")); var _MVoiceMessageBody = _interopRequireDefault(require("../messages/MVoiceMessageBody")); var _EventTileFactory = require("../../../events/EventTileFactory"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); 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; } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2020, 2021 Tulir Asokan <tulir@maunium.net> SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class ReplyTile extends _react.default.PureComponent { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "anchorElement", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "onDecrypted", () => { this.forceUpdate(); if (this.props.onHeightChanged) { this.props.onHeightChanged(); } }); (0, _defineProperty2.default)(this, "onEventRequiresUpdate", () => { // Force update when necessary - redactions and edits this.forceUpdate(); }); (0, _defineProperty2.default)(this, "onClick", e => { const clickTarget = e.target; // Following a link within a reply should not dispatch the `view_room` action // so that the browser can direct the user to the correct location // The exception being the link wrapping the reply if (clickTarget.tagName.toLowerCase() !== "a" || clickTarget.closest("a") === null || clickTarget === this.anchorElement.current) { // This allows the permalink to be opened in a new tab/window or copied as // matrix.to, but also for it to enable routing within Riot when clicked. e.preventDefault(); // Expand thread on shift key if (this.props.toggleExpandedQuote && e.shiftKey) { this.props.toggleExpandedQuote(); } else { _dispatcher.default.dispatch({ action: _actions.Action.ViewRoom, event_id: this.props.mxEvent.getId(), highlighted: true, room_id: this.props.mxEvent.getRoomId(), metricsTrigger: undefined // room doesn't change }); } } }); } componentDidMount() { this.props.mxEvent.on(_matrix.MatrixEventEvent.Decrypted, this.onDecrypted); this.props.mxEvent.on(_matrix.MatrixEventEvent.BeforeRedaction, this.onEventRequiresUpdate); this.props.mxEvent.on(_matrix.MatrixEventEvent.Replaced, this.onEventRequiresUpdate); } componentWillUnmount() { this.props.mxEvent.removeListener(_matrix.MatrixEventEvent.Decrypted, this.onDecrypted); this.props.mxEvent.removeListener(_matrix.MatrixEventEvent.BeforeRedaction, this.onEventRequiresUpdate); this.props.mxEvent.removeListener(_matrix.MatrixEventEvent.Replaced, this.onEventRequiresUpdate); } render() { const mxEvent = this.props.mxEvent; const msgType = mxEvent.getContent().msgtype; const evType = mxEvent.getType(); const { hasRenderer, isInfoMessage, isSeeingThroughMessageHiddenForModeration } = (0, _EventRenderingUtils.getEventDisplayInfo)(_MatrixClientPeg.MatrixClientPeg.safeGet(), mxEvent, false /* Replies are never hidden, so this should be fine */); // This shouldn't happen: the caller should check we support this type // before trying to instantiate us if (!hasRenderer) { const { mxEvent } = this.props; _logger.logger.warn(`Event type not supported: type:${mxEvent.getType()} isState:${mxEvent.isState()}`); return /*#__PURE__*/_react.default.createElement("div", { className: "mx_ReplyTile mx_ReplyTile_info mx_MNoticeBody" }, (0, _languageHandler._t)("timeline|error_no_renderer")); } const classes = (0, _classnames.default)("mx_ReplyTile", { mx_ReplyTile_inline: msgType === _matrix.MsgType.Emote, mx_ReplyTile_info: isInfoMessage && !mxEvent.isRedacted(), mx_ReplyTile_audio: msgType === _matrix.MsgType.Audio, mx_ReplyTile_video: msgType === _matrix.MsgType.Video }); let permalink = "#"; if (this.props.permalinkCreator) { permalink = this.props.permalinkCreator.forEvent(mxEvent.getId()); } let sender; const hasOwnSender = isInfoMessage || evType === _matrix.EventType.RoomCreate; if (!hasOwnSender) { sender = /*#__PURE__*/_react.default.createElement("div", { className: "mx_ReplyTile_sender" }, /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, { member: mxEvent.sender, fallbackUserId: mxEvent.getSender(), size: "16px" }), /*#__PURE__*/_react.default.createElement(_SenderProfile.default, { mxEvent: mxEvent })); } const msgtypeOverrides = { [_matrix.MsgType.Image]: _MImageReplyBody.default, // Override audio and video body with file body. We also hide the download/decrypt button using CSS [_matrix.MsgType.Audio]: (0, _EventUtils.isVoiceMessage)(mxEvent) ? _MVoiceMessageBody.default : _MFileBody.default, [_matrix.MsgType.Video]: _MFileBody.default }; const evOverrides = { // Use MImageReplyBody so that the sticker isn't taking up a lot of space [_matrix.EventType.Sticker]: _MImageReplyBody.default }; return /*#__PURE__*/_react.default.createElement("div", { className: classes }, /*#__PURE__*/_react.default.createElement("a", { href: permalink, onClick: this.onClick, ref: this.anchorElement }, sender, (0, _EventTileFactory.renderReplyTile)(_objectSpread(_objectSpread({}, this.props), {}, { // overrides ref: undefined, showUrlPreview: false, overrideBodyTypes: msgtypeOverrides, overrideEventTypes: evOverrides, maxImageHeight: 96, isSeeingThroughMessageHiddenForModeration, // appease TS highlights: this.props.highlights, highlightLink: this.props.highlightLink, onHeightChanged: this.props.onHeightChanged, permalinkCreator: this.props.permalinkCreator }), false /* showHiddenEvents shouldn't be relevant */))); } } exports.default = ReplyTile; (0, _defineProperty2.default)(ReplyTile, "defaultProps", { onHeightChanged: () => {} }); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbWF0cml4IiwiX2xvZ2dlciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfZGlzcGF0Y2hlciIsIl9hY3Rpb25zIiwiX1NlbmRlclByb2ZpbGUiLCJfTUltYWdlUmVwbHlCb2R5IiwiX0V2ZW50VXRpbHMiLCJfRXZlbnRSZW5kZXJpbmdVdGlscyIsIl9NRmlsZUJvZHkiLCJfTWVtYmVyQXZhdGFyIiwiX01Wb2ljZU1lc3NhZ2VCb2R5IiwiX0V2ZW50VGlsZUZhY3RvcnkiLCJfTWF0cml4Q2xpZW50UGVnIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib3duS2V5cyIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiUmVwbHlUaWxlIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJhcmdzIiwiY3JlYXRlUmVmIiwiZm9yY2VVcGRhdGUiLCJwcm9wcyIsIm9uSGVpZ2h0Q2hhbmdlZCIsImNsaWNrVGFyZ2V0IiwidGFyZ2V0IiwidGFnTmFtZSIsInRvTG93ZXJDYXNlIiwiY2xvc2VzdCIsImFuY2hvckVsZW1lbnQiLCJjdXJyZW50IiwicHJldmVudERlZmF1bHQiLCJ0b2dnbGVFeHBhbmRlZFF1b3RlIiwic2hpZnRLZXkiLCJkaXMiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIlZpZXdSb29tIiwiZXZlbnRfaWQiLCJteEV2ZW50IiwiZ2V0SWQiLCJoaWdobGlnaHRlZCIsInJvb21faWQiLCJnZXRSb29tSWQiLCJtZXRyaWNzVHJpZ2dlciIsInVuZGVmaW5lZCIsImNvbXBvbmVudERpZE1vdW50Iiwib24iLCJNYXRyaXhFdmVudEV2ZW50IiwiRGVjcnlwdGVkIiwib25EZWNyeXB0ZWQiLCJCZWZvcmVSZWRhY3Rpb24iLCJvbkV2ZW50UmVxdWlyZXNVcGRhdGUiLCJSZXBsYWNlZCIsImNvbXBvbmVudFdpbGxVbm1vdW50IiwicmVtb3ZlTGlzdGVuZXIiLCJyZW5kZXIiLCJtc2dUeXBlIiwiZ2V0Q29udGVudCIsIm1zZ3R5cGUiLCJldlR5cGUiLCJnZXRUeXBlIiwiaGFzUmVuZGVyZXIiLCJpc0luZm9NZXNzYWdlIiwiaXNTZWVpbmdUaHJvdWdoTWVzc2FnZUhpZGRlbkZvck1vZGVyYXRpb24iLCJnZXRFdmVudERpc3BsYXlJbmZvIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsImxvZ2dlciIsIndhcm4iLCJpc1N0YXRlIiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIl90IiwiY2xhc3NlcyIsImNsYXNzTmFtZXMiLCJteF9SZXBseVRpbGVfaW5saW5lIiwiTXNnVHlwZSIsIkVtb3RlIiwibXhfUmVwbHlUaWxlX2luZm8iLCJpc1JlZGFjdGVkIiwibXhfUmVwbHlUaWxlX2F1ZGlvIiwiQXVkaW8iLCJteF9SZXBseVRpbGVfdmlkZW8iLCJWaWRlbyIsInBlcm1hbGluayIsInBlcm1hbGlua0NyZWF0b3IiLCJmb3JFdmVudCIsInNlbmRlciIsImhhc093blNlbmRlciIsIkV2ZW50VHlwZSIsIlJvb21DcmVhdGUiLCJtZW1iZXIiLCJmYWxsYmFja1VzZXJJZCIsImdldFNlbmRlciIsInNpemUiLCJtc2d0eXBlT3ZlcnJpZGVzIiwiSW1hZ2UiLCJNSW1hZ2VSZXBseUJvZHkiLCJpc1ZvaWNlTWVzc2FnZSIsIk1Wb2ljZU1lc3NhZ2VCb2R5IiwiTUZpbGVCb2R5IiwiZXZPdmVycmlkZXMiLCJTdGlja2VyIiwiaHJlZiIsIm9uQ2xpY2siLCJyZWYiLCJyZW5kZXJSZXBseVRpbGUiLCJzaG93VXJsUHJldmlldyIsIm92ZXJyaWRlQm9keVR5cGVzIiwib3ZlcnJpZGVFdmVudFR5cGVzIiwibWF4SW1hZ2VIZWlnaHQiLCJoaWdobGlnaHRzIiwiaGlnaGxpZ2h0TGluayIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9yb29tcy9SZXBseVRpbGUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwLCAyMDIxIFR1bGlyIEFzb2thbiA8dHVsaXJAbWF1bml1bS5uZXQ+XG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVSZWYgfSBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gXCJjbGFzc25hbWVzXCI7XG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgTWF0cml4RXZlbnRFdmVudCwgRXZlbnRUeXBlLCBNc2dUeXBlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuXG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IHsgUm9vbVBlcm1hbGlua0NyZWF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgU2VuZGVyUHJvZmlsZSBmcm9tIFwiLi4vbWVzc2FnZXMvU2VuZGVyUHJvZmlsZVwiO1xuaW1wb3J0IE1JbWFnZVJlcGx5Qm9keSBmcm9tIFwiLi4vbWVzc2FnZXMvTUltYWdlUmVwbHlCb2R5XCI7XG5pbXBvcnQgeyBpc1ZvaWNlTWVzc2FnZSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9FdmVudFV0aWxzXCI7XG5pbXBvcnQgeyBnZXRFdmVudERpc3BsYXlJbmZvIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL0V2ZW50UmVuZGVyaW5nVXRpbHNcIjtcbmltcG9ydCBNRmlsZUJvZHkgZnJvbSBcIi4uL21lc3NhZ2VzL01GaWxlQm9keVwiO1xuaW1wb3J0IE1lbWJlckF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9NZW1iZXJBdmF0YXJcIjtcbmltcG9ydCBNVm9pY2VNZXNzYWdlQm9keSBmcm9tIFwiLi4vbWVzc2FnZXMvTVZvaWNlTWVzc2FnZUJvZHlcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgcmVuZGVyUmVwbHlUaWxlIH0gZnJvbSBcIi4uLy4uLy4uL2V2ZW50cy9FdmVudFRpbGVGYWN0b3J5XCI7XG5pbXBvcnQgeyBHZXRSZWxhdGlvbnNGb3JFdmVudCB9IGZyb20gXCIuLi9yb29tcy9FdmVudFRpbGVcIjtcbmltcG9ydCB7IE1hdHJpeENsaWVudFBlZyB9IGZyb20gXCIuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7XG4gICAgcGVybWFsaW5rQ3JlYXRvcj86IFJvb21QZXJtYWxpbmtDcmVhdG9yO1xuICAgIGhpZ2hsaWdodHM/OiBzdHJpbmdbXTtcbiAgICBoaWdobGlnaHRMaW5rPzogc3RyaW5nO1xuICAgIG9uSGVpZ2h0Q2hhbmdlZD8oKTogdm9pZDtcbiAgICB0b2dnbGVFeHBhbmRlZFF1b3RlPzogKCkgPT4gdm9pZDtcbiAgICBnZXRSZWxhdGlvbnNGb3JFdmVudD86IEdldFJlbGF0aW9uc0ZvckV2ZW50O1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBseVRpbGUgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcz4ge1xuICAgIHByaXZhdGUgYW5jaG9yRWxlbWVudCA9IGNyZWF0ZVJlZjxIVE1MQW5jaG9yRWxlbWVudD4oKTtcblxuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzID0ge1xuICAgICAgICBvbkhlaWdodENoYW5nZWQ6ICgpID0+IHt9LFxuICAgIH07XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMucHJvcHMubXhFdmVudC5vbihNYXRyaXhFdmVudEV2ZW50LkRlY3J5cHRlZCwgdGhpcy5vbkRlY3J5cHRlZCk7XG4gICAgICAgIHRoaXMucHJvcHMubXhFdmVudC5vbihNYXRyaXhFdmVudEV2ZW50LkJlZm9yZVJlZGFjdGlvbiwgdGhpcy5vbkV2ZW50UmVxdWlyZXNVcGRhdGUpO1xuICAgICAgICB0aGlzLnByb3BzLm14RXZlbnQub24oTWF0cml4RXZlbnRFdmVudC5SZXBsYWNlZCwgdGhpcy5vbkV2ZW50UmVxdWlyZXNVcGRhdGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5wcm9wcy5teEV2ZW50LnJlbW92ZUxpc3RlbmVyKE1hdHJpeEV2ZW50RXZlbnQuRGVjcnlwdGVkLCB0aGlzLm9uRGVjcnlwdGVkKTtcbiAgICAgICAgdGhpcy5wcm9wcy5teEV2ZW50LnJlbW92ZUxpc3RlbmVyKE1hdHJpeEV2ZW50RXZlbnQuQmVmb3JlUmVkYWN0aW9uLCB0aGlzLm9uRXZlbnRSZXF1aXJlc1VwZGF0ZSk7XG4gICAgICAgIHRoaXMucHJvcHMubXhFdmVudC5yZW1vdmVMaXN0ZW5lcihNYXRyaXhFdmVudEV2ZW50LlJlcGxhY2VkLCB0aGlzLm9uRXZlbnRSZXF1aXJlc1VwZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRlY3J5cHRlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5vbkhlaWdodENoYW5nZWQpIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMub25IZWlnaHRDaGFuZ2VkKCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkV2ZW50UmVxdWlyZXNVcGRhdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIEZvcmNlIHVwZGF0ZSB3aGVuIG5lY2Vzc2FyeSAtIHJlZGFjdGlvbnMgYW5kIGVkaXRzXG4gICAgICAgIHRoaXMuZm9yY2VVcGRhdGUoKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkNsaWNrID0gKGU6IFJlYWN0Lk1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgY2xpY2tUYXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy8gRm9sbG93aW5nIGEgbGluayB3aXRoaW4gYSByZXBseSBzaG91bGQgbm90IGRpc3BhdGNoIHRoZSBgdmlld19yb29tYCBhY3Rpb25cbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYnJvd3NlciBjYW4gZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uXG4gICAgICAgIC8vIFRoZSBleGNlcHRpb24gYmVpbmcgdGhlIGxpbmsgd3JhcHBpbmcgdGhlIHJlcGx5XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGNsaWNrVGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJhXCIgfHxcbiAgICAgICAgICAgIGNsaWNrVGFyZ2V0LmNsb3Nlc3QoXCJhXCIpID09PSBudWxsIHx8XG4gICAgICAgICAgICBjbGlja1RhcmdldCA9PT0gdGhpcy5hbmNob3JFbGVtZW50LmN1cnJlbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0aGUgcGVybWFsaW5rIHRvIGJlIG9wZW5lZCBpbiBhIG5ldyB0YWIvd2luZG93IG9yIGNvcGllZCBhc1xuICAgICAgICAgICAgLy8gbWF0cml4LnRvLCBidXQgYWxzbyBmb3IgaXQgdG8gZW5hYmxlIHJvdXRpbmcgd2l0aGluIFJpb3Qgd2hlbiBjbGlja2VkLlxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgLy8gRXhwYW5kIHRocmVhZCBvbiBzaGlmdCBrZXlcbiAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnRvZ2dsZUV4cGFuZGVkUXVvdGUgJiYgZS5zaGlmdEtleSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMudG9nZ2xlRXhwYW5kZWRRdW90ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkaXMuZGlzcGF0Y2g8Vmlld1Jvb21QYXlsb2FkPih7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgICAgICAgICBldmVudF9pZDogdGhpcy5wcm9wcy5teEV2ZW50LmdldElkKCksXG4gICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodGVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByb29tX2lkOiB0aGlzLnByb3BzLm14RXZlbnQuZ2V0Um9vbUlkKCksXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiB1bmRlZmluZWQsIC8vIHJvb20gZG9lc24ndCBjaGFuZ2VcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGNvbnN0IG14RXZlbnQgPSB0aGlzLnByb3BzLm14RXZlbnQ7XG4gICAgICAgIGNvbnN0IG1zZ1R5cGUgPSBteEV2ZW50LmdldENvbnRlbnQoKS5tc2d0eXBlO1xuICAgICAgICBjb25zdCBldlR5cGUgPSBteEV2ZW50LmdldFR5cGUoKTtcblxuICAgICAgICBjb25zdCB7IGhhc1JlbmRlcmVyLCBpc0luZm9NZXNzYWdlLCBpc1NlZWluZ1Rocm91Z2hNZXNzYWdlSGlkZGVuRm9yTW9kZXJhdGlvbiB9ID0gZ2V0RXZlbnREaXNwbGF5SW5mbyhcbiAgICAgICAgICAgIE1hdHJpeENsaWVudFBlZy5zYWZlR2V0KCksXG4gICAgICAgICAgICBteEV2ZW50LFxuICAgICAgICAgICAgZmFsc2UgLyogUmVwbGllcyBhcmUgbmV2ZXIgaGlkZGVuLCBzbyB0aGlzIHNob3VsZCBiZSBmaW5lICovLFxuICAgICAgICApO1xuICAgICAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW46IHRoZSBjYWxsZXIgc2hvdWxkIGNoZWNrIHdlIHN1cHBvcnQgdGhpcyB0eXBlXG4gICAgICAgIC8vIGJlZm9yZSB0cnlpbmcgdG8gaW5zdGFudGlhdGUgdXNcbiAgICAgICAgaWYgKCFoYXNSZW5kZXJlcikge1xuICAgICAgICAgICAgY29uc3QgeyBteEV2ZW50IH0gPSB0aGlzLnByb3BzO1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV2ZW50IHR5cGUgbm90IHN1cHBvcnRlZDogdHlwZToke214RXZlbnQuZ2V0VHlwZSgpfSBpc1N0YXRlOiR7bXhFdmVudC5pc1N0YXRlKCl9YCk7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfUmVwbHlUaWxlIG14X1JlcGx5VGlsZV9pbmZvIG14X01Ob3RpY2VCb2R5XCI+e190KFwidGltZWxpbmV8ZXJyb3Jfbm9fcmVuZGVyZXJcIil9PC9kaXY+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2xhc3NlcyA9IGNsYXNzTmFtZXMoXCJteF9SZXBseVRpbGVcIiwge1xuICAgICAgICAgICAgbXhfUmVwbHlUaWxlX2lubGluZTogbXNnVHlwZSA9PT0gTXNnVHlwZS5FbW90ZSxcbiAgICAgICAgICAgIG14X1JlcGx5VGlsZV9pbmZvOiBpc0luZm9NZXNzYWdlICYmICFteEV2ZW50LmlzUmVkYWN0ZWQoKSxcbiAgICAgICAgICAgIG14X1JlcGx5VGlsZV9hdWRpbzogbXNnVHlwZSA9PT0gTXNnVHlwZS5BdWRpbyxcbiAgICAgICAgICAgIG14X1JlcGx5VGlsZV92aWRlbzogbXNnVHlwZSA9PT0gTXNnVHlwZS5WaWRlbyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHBlcm1hbGluayA9IFwiI1wiO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5wZXJtYWxpbmtDcmVhdG9yKSB7XG4gICAgICAgICAgICBwZXJtYWxpbmsgPSB0aGlzLnByb3BzLnBlcm1hbGlua0NyZWF0b3IuZm9yRXZlbnQobXhFdmVudC5nZXRJZCgpISk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc2VuZGVyO1xuICAgICAgICBjb25zdCBoYXNPd25TZW5kZXIgPSBpc0luZm9NZXNzYWdlIHx8IGV2VHlwZSA9PT0gRXZlbnRUeXBlLlJvb21DcmVhdGU7XG4gICAgICAgIGlmICghaGFzT3duU2VuZGVyKSB7XG4gICAgICAgICAgICBzZW5kZXIgPSAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9SZXBseVRpbGVfc2VuZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxNZW1iZXJBdmF0YXIgbWVtYmVyPXtteEV2ZW50LnNlbmRlcn0gZmFsbGJhY2tVc2VySWQ9e214RXZlbnQuZ2V0U2VuZGVyKCl9IHNpemU9XCIxNnB4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPFNlbmRlclByb2ZpbGUgbXhFdmVudD17bXhFdmVudH0gLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtc2d0eXBlT3ZlcnJpZGVzOiBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgUmVhY3QuQ29tcG9uZW50PiA9IHtcbiAgICAgICAgICAgIFtNc2dUeXBlLkltYWdlXTogTUltYWdlUmVwbHlCb2R5LFxuICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYXVkaW8gYW5kIHZpZGVvIGJvZHkgd2l0aCBmaWxlIGJvZHkuIFdlIGFsc28gaGlkZSB0aGUgZG93bmxvYWQvZGVjcnlwdCBidXR0b24gdXNpbmcgQ1NTXG4gICAgICAgICAgICBbTXNnVHlwZS5BdWRpb106IGlzVm9pY2VNZXNzYWdlKG14RXZlbnQpID8gTVZvaWNlTWVzc2FnZUJvZHkgOiBNRmlsZUJvZHksXG4gICAgICAgICAgICBbTXNnVHlwZS5WaWRlb106IE1GaWxlQm9keSxcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZXZPdmVycmlkZXM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBSZWFjdC5Db21wb25lbnQ+ID0ge1xuICAgICAgICAgICAgLy8gVXNlIE1JbWFnZVJlcGx5Qm9keSBzbyB0aGF0IHRoZSBzdGlja2VyIGlzbid0IHRha2luZyB1cCBhIGxvdCBvZiBzcGFjZVxuICAgICAgICAgICAgW0V2ZW50VHlwZS5TdGlja2VyXTogTUltYWdlUmVwbHlCb2R5LFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICAgICAgPGEgaHJlZj17cGVybWFsaW5rfSBvbkNsaWNrPXt0aGlzLm9uQ2xpY2t9IHJlZj17dGhpcy5hbmNob3JFbGVtZW50fT5cbiAgICAgICAgICAgICAgICAgICAge3NlbmRlcn1cbiAgICAgICAgICAgICAgICAgICAge3JlbmRlclJlcGx5VGlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnByb3BzLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1VybFByZXZpZXc6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlQm9keVR5cGVzOiBtc2d0eXBlT3ZlcnJpZGVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlRXZlbnRUeXBlczogZXZPdmVycmlkZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4SW1hZ2VIZWlnaHQ6IDk2LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2VlaW5nVGhyb3VnaE1lc3NhZ2VIaWRkZW5Gb3JNb2RlcmF0aW9uLFxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBwZWFzZSBUU1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZ2hsaWdodHM6IHRoaXMucHJvcHMuaGlnaGxpZ2h0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWdobGlnaHRMaW5rOiB0aGlzLnByb3BzLmhpZ2hsaWdodExpbmssXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25IZWlnaHRDaGFuZ2VkOiB0aGlzLnByb3BzLm9uSGVpZ2h0Q2hhbmdlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtYWxpbmtDcmVhdG9yOiB0aGlzLnByb3BzLnBlcm1hbGlua0NyZWF0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogc2hvd0hpZGRlbkV2ZW50cyBzaG91bGRuJ3QgYmUgcmVsZXZhbnQgKi8sXG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFHLE9BQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLE9BQUEsR0FBQUosT0FBQTtBQUVBLElBQUFLLGdCQUFBLEdBQUFMLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFKLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFFQSxJQUFBUSxjQUFBLEdBQUFOLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBUyxnQkFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsV0FBQSxHQUFBVixPQUFBO0FBQ0EsSUFBQVcsb0JBQUEsR0FBQVgsT0FBQTtBQUNBLElBQUFZLFVBQUEsR0FBQVYsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFhLGFBQUEsR0FBQVgsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFjLGtCQUFBLEdBQUFaLHNCQUFBLENBQUFGLE9BQUE7QUFFQSxJQUFBZSxpQkFBQSxHQUFBZixPQUFBO0FBRUEsSUFBQWdCLGdCQUFBLEdBQUFoQixPQUFBO0FBQTJELFNBQUFpQix5QkFBQUMsQ0FBQSw2QkFBQUMsT0FBQSxtQkFBQUMsQ0FBQSxPQUFBRCxPQUFBLElBQUFFLENBQUEsT0FBQUYsT0FBQSxZQUFBRix3QkFBQSxZQUFBQSxDQUFBQyxDQUFBLFdBQUFBLENBQUEsR0FBQUcsQ0FBQSxHQUFBRCxDQUFBLEtBQUFGLENBQUE7QUFBQSxTQUFBbkIsd0JBQUFtQixDQUFBLEVBQUFFLENBQUEsU0FBQUEsQ0FBQSxJQUFBRixDQUFBLElBQUFBLENBQUEsQ0FBQUksVUFBQSxTQUFB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