UNPKG

matrix-react-sdk

Version:
172 lines (168 loc) 34.9 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 _matrixWidgetApi = require("matrix-widget-api"); var _BaseDialog = _interopRequireDefault(require("./BaseDialog")); var _languageHandler = require("../../../languageHandler"); var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton")); var _StopGapWidgetDriver = require("../../../stores/widgets/StopGapWidgetDriver"); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _OwnProfileStore = require("../../../stores/OwnProfileStore"); var _arrays = require("../../../utils/arrays"); var _StopGapWidget = require("../../../stores/widgets/StopGapWidget"); var _identifiers = require("../../../identifiers"); var _SettingsStore = _interopRequireDefault(require("../../../settings/SettingsStore")); 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 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. */ const MAX_BUTTONS = 3; class ModalWidgetDialog extends React.PureComponent { constructor(props) { super(props); (0, _defineProperty2.default)(this, "widget", void 0); (0, _defineProperty2.default)(this, "possibleButtons", void 0); (0, _defineProperty2.default)(this, "appFrame", /*#__PURE__*/React.createRef()); (0, _defineProperty2.default)(this, "state", { disabledButtonIds: (this.props.widgetDefinition.buttons || []).filter(b => b.disabled).map(b => b.id) }); (0, _defineProperty2.default)(this, "onReady", () => { this.state.messaging?.sendWidgetConfig(this.props.widgetDefinition); }); (0, _defineProperty2.default)(this, "onLoad", () => { if (!this.state.messaging) return; this.state.messaging.once("ready", this.onReady); this.state.messaging.on(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose); this.state.messaging.on(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.SetModalButtonEnabled}`, this.onButtonEnableToggle); }); (0, _defineProperty2.default)(this, "onWidgetClose", ev => { this.props.onFinished(true, ev.detail.data); }); (0, _defineProperty2.default)(this, "onButtonEnableToggle", ev => { ev.preventDefault(); const isClose = ev.detail.data.button === _matrixWidgetApi.BuiltInModalButtonID.Close; if (isClose || !this.possibleButtons.includes(ev.detail.data.button)) { return this.state.messaging?.transport.reply(ev.detail, { error: { message: "Invalid button" } }); } let buttonIds; if (ev.detail.data.enabled) { buttonIds = (0, _arrays.arrayFastClone)(this.state.disabledButtonIds).filter(i => i !== ev.detail.data.button); } else { // use a set to swap the operation to avoid memory leaky arrays. const tempSet = new Set(this.state.disabledButtonIds); tempSet.add(ev.detail.data.button); buttonIds = Array.from(tempSet); } this.setState({ disabledButtonIds: buttonIds }); this.state.messaging?.transport.reply(ev.detail, {}); }); this.widget = new _StopGapWidget.ElementWidget(_objectSpread(_objectSpread({}, this.props.widgetDefinition), {}, { creatorUserId: _MatrixClientPeg.MatrixClientPeg.safeGet().getSafeUserId(), id: `modal_${this.props.sourceWidgetId}` })); this.possibleButtons = (this.props.widgetDefinition.buttons || []).map(b => b.id); } componentDidMount() { const driver = new _StopGapWidgetDriver.StopGapWidgetDriver([], this.widget, _matrixWidgetApi.WidgetKind.Modal, false); const messaging = new _matrixWidgetApi.ClientWidgetApi(this.widget, this.appFrame.current, driver); this.setState({ messaging }); } componentWillUnmount() { if (!this.state.messaging) return; this.state.messaging.off("ready", this.onReady); this.state.messaging.off(`action:${_matrixWidgetApi.WidgetApiFromWidgetAction.CloseModalWidget}`, this.onWidgetClose); this.state.messaging.stop(); } render() { const templated = this.widget.getCompleteUrl({ widgetRoomId: this.props.widgetRoomId, currentUserId: _MatrixClientPeg.MatrixClientPeg.safeGet().getSafeUserId(), userDisplayName: _OwnProfileStore.OwnProfileStore.instance.displayName ?? undefined, userHttpAvatarUrl: _OwnProfileStore.OwnProfileStore.instance.getHttpAvatarUrl() ?? undefined, clientId: _identifiers.ELEMENT_CLIENT_ID, clientTheme: _SettingsStore.default.getValue("theme"), clientLanguage: (0, _languageHandler.getUserLanguage)(), baseUrl: _MatrixClientPeg.MatrixClientPeg.safeGet().baseUrl }); const parsed = new URL(templated); // Add in some legacy support sprinkles (for non-popout widgets) // TODO: Replace these with proper widget params // See https://github.com/matrix-org/matrix-doc/pull/1958/files#r405714833 parsed.searchParams.set("widgetId", this.widget.id); parsed.searchParams.set("parentUrl", window.location.href.split("#", 2)[0]); // Replace the encoded dollar signs back to dollar signs. They have no special meaning // in HTTP, but URL parsers encode them anyways. const widgetUrl = parsed.toString().replace(/%24/g, "$"); let buttons; if (this.props.widgetDefinition.buttons) { // show first button rightmost for a more natural specification buttons = this.props.widgetDefinition.buttons.slice(0, MAX_BUTTONS).reverse().map(def => { let kind = "secondary"; switch (def.kind) { case _matrixWidgetApi.ModalButtonKind.Primary: kind = "primary"; break; case _matrixWidgetApi.ModalButtonKind.Secondary: kind = "primary_outline"; break; case _matrixWidgetApi.ModalButtonKind.Danger: kind = "danger"; break; } const onClick = () => { this.state.messaging?.notifyModalWidgetButtonClicked(def.id); }; const isDisabled = this.state.disabledButtonIds.includes(def.id); return /*#__PURE__*/React.createElement(_AccessibleButton.default, { key: def.id, kind: kind, onClick: onClick, disabled: isDisabled }, def.label); }); } return /*#__PURE__*/React.createElement(_BaseDialog.default, { title: this.props.widgetDefinition.name || (0, _languageHandler._t)("widget|modal_title_default"), className: "mx_ModalWidgetDialog", contentId: "mx_Dialog_content", onFinished: this.props.onFinished }, /*#__PURE__*/React.createElement("div", { className: "mx_ModalWidgetDialog_warning" }, /*#__PURE__*/React.createElement("img", { src: require("../../../../res/img/element-icons/warning-badge.svg").default, height: "16", width: "16", alt: "" }), (0, _languageHandler._t)("widget|modal_data_warning", { widgetDomain: parsed.hostname })), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("iframe", { title: this.widget.name ?? undefined, ref: this.appFrame, sandbox: "allow-forms allow-scripts allow-same-origin", src: widgetUrl, onLoad: this.onLoad })), /*#__PURE__*/React.createElement("div", { className: "mx_ModalWidgetDialog_buttons" }, buttons)); } } exports.default = ModalWidgetDialog; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJSZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwicmVxdWlyZSIsIl9tYXRyaXhXaWRnZXRBcGkiLCJfQmFzZURpYWxvZyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfU3RvcEdhcFdpZGdldERyaXZlciIsIl9NYXRyaXhDbGllbnRQZWciLCJfT3duUHJvZmlsZVN0b3JlIiwiX2FycmF5cyIsIl9TdG9wR2FwV2lkZ2V0IiwiX2lkZW50aWZpZXJzIiwiX1NldHRpbmdzU3RvcmUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJNQVhfQlVUVE9OUyIsIk1vZGFsV2lkZ2V0RGlhbG9nIiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJjcmVhdGVSZWYiLCJkaXNhYmxlZEJ1dHRvbklkcyIsIndpZGdldERlZmluaXRpb24iLCJidXR0b25zIiwiYiIsImRpc2FibGVkIiwibWFwIiwiaWQiLCJzdGF0ZSIsIm1lc3NhZ2luZyIsInNlbmRXaWRnZXRDb25maWciLCJvbmNlIiwib25SZWFkeSIsIm9uIiwiV2lkZ2V0QXBpRnJvbVdpZGdldEFjdGlvbiIsIkNsb3NlTW9kYWxXaWRnZXQiLCJvbldpZGdldENsb3NlIiwiU2V0TW9kYWxCdXR0b25FbmFibGVkIiwib25CdXR0b25FbmFibGVUb2dnbGUiLCJldiIsIm9uRmluaXNoZWQiLCJkZXRhaWwiLCJkYXRhIiwicHJldmVudERlZmF1bHQiLCJpc0Nsb3NlIiwiYnV0dG9uIiwiQnVpbHRJbk1vZGFsQnV0dG9uSUQiLCJDbG9zZSIsInBvc3NpYmxlQnV0dG9ucyIsImluY2x1ZGVzIiwidHJhbnNwb3J0IiwicmVwbHkiLCJlcnJvciIsIm1lc3NhZ2UiLCJidXR0b25JZHMiLCJlbmFibGVkIiwiYXJyYXlGYXN0Q2xvbmUiLCJ0ZW1wU2V0IiwiU2V0IiwiYWRkIiwiQXJyYXkiLCJmcm9tIiwic2V0U3RhdGUiLCJ3aWRnZXQiLCJFbGVtZW50V2lkZ2V0IiwiY3JlYXRvclVzZXJJZCIsIk1hdHJpeENsaWVudFBlZyIsInNhZmVHZXQiLCJnZXRTYWZlVXNlcklkIiwic291cmNlV2lkZ2V0SWQiLCJjb21wb25lbnREaWRNb3VudCIsImRyaXZlciIsIlN0b3BHYXBXaWRnZXREcml2ZXIiLCJXaWRnZXRLaW5kIiwiTW9kYWwiLCJDbGllbnRXaWRnZXRBcGkiLCJhcHBGcmFtZSIsImN1cnJlbnQiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsIm9mZiIsInN0b3AiLCJyZW5kZXIiLCJ0ZW1wbGF0ZWQiLCJnZXRDb21wbGV0ZVVybCIsIndpZGdldFJvb21JZCIsImN1cnJlbnRVc2VySWQiLCJ1c2VyRGlzcGxheU5hbWUiLCJPd25Qcm9maWxlU3RvcmUiLCJpbnN0YW5jZSIsImRpc3BsYXlOYW1lIiwidW5kZWZpbmVkIiwidXNlckh0dHBBdmF0YXJVcmwiLCJnZXRIdHRwQXZhdGFyVXJsIiwiY2xpZW50SWQiLCJFTEVNRU5UX0NMSUVOVF9JRCIsImNsaWVudFRoZW1lIiwiU2V0dGluZ3NTdG9yZSIsImdldFZhbHVlIiwiY2xpZW50TGFuZ3VhZ2UiLCJnZXRVc2VyTGFuZ3VhZ2UiLCJiYXNlVXJsIiwicGFyc2VkIiwiVVJMIiwic2VhcmNoUGFyYW1zIiwid2luZG93IiwibG9jYXRpb24iLCJocmVmIiwic3BsaXQiLCJ3aWRnZXRVcmwiLCJ0b1N0cmluZyIsInJlcGxhY2UiLCJzbGljZSIsInJldmVyc2UiLCJkZWYiLCJraW5kIiwiTW9kYWxCdXR0b25LaW5kIiwiUHJpbWFyeSIsIlNlY29uZGFyeSIsIkRhbmdlciIsIm9uQ2xpY2siLCJub3RpZnlNb2RhbFdpZGdldEJ1dHRvbkNsaWNrZWQiLCJpc0Rpc2FibGVkIiwiY3JlYXRlRWxlbWVudCIsImtleSIsImxhYmVsIiwidGl0bGUiLCJuYW1lIiwiX3QiLCJjbGFzc05hbWUiLCJjb250ZW50SWQiLCJzcmMiLCJoZWlnaHQiLCJ3aWR0aCIsImFsdCIsIndpZGdldERvbWFpbiIsImhvc3RuYW1lIiwicmVmIiwic2FuZGJveCIsIm9uTG9hZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL01vZGFsV2lkZ2V0RGlhbG9nLnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMCwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7XG4gICAgQ2xpZW50V2lkZ2V0QXBpLFxuICAgIElNb2RhbFdpZGdldENsb3NlUmVxdWVzdCxcbiAgICBJTW9kYWxXaWRnZXRPcGVuUmVxdWVzdERhdGEsXG4gICAgSU1vZGFsV2lkZ2V0UmV0dXJuRGF0YSxcbiAgICBJU2V0TW9kYWxCdXR0b25FbmFibGVkQWN0aW9uUmVxdWVzdCxcbiAgICBJV2lkZ2V0QXBpQWNrbm93bGVkZ2VSZXNwb25zZURhdGEsXG4gICAgSVdpZGdldEFwaUVycm9yUmVzcG9uc2VEYXRhLFxuICAgIEJ1aWx0SW5Nb2RhbEJ1dHRvbklELFxuICAgIE1vZGFsQnV0dG9uSUQsXG4gICAgTW9kYWxCdXR0b25LaW5kLFxuICAgIFdpZGdldCxcbiAgICBXaWRnZXRBcGlGcm9tV2lkZ2V0QWN0aW9uLFxuICAgIFdpZGdldEtpbmQsXG59IGZyb20gXCJtYXRyaXgtd2lkZ2V0LWFwaVwiO1xuXG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgeyBfdCwgZ2V0VXNlckxhbmd1YWdlIH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQWNjZXNzaWJsZUJ1dHRvbktpbmQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgU3RvcEdhcFdpZGdldERyaXZlciB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvd2lkZ2V0cy9TdG9wR2FwV2lkZ2V0RHJpdmVyXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgeyBPd25Qcm9maWxlU3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL093blByb2ZpbGVTdG9yZVwiO1xuaW1wb3J0IHsgYXJyYXlGYXN0Q2xvbmUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYXJyYXlzXCI7XG5pbXBvcnQgeyBFbGVtZW50V2lkZ2V0IH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy93aWRnZXRzL1N0b3BHYXBXaWRnZXRcIjtcbmltcG9ydCB7IEVMRU1FTlRfQ0xJRU5UX0lEIH0gZnJvbSBcIi4uLy4uLy4uL2lkZW50aWZpZXJzXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICB3aWRnZXREZWZpbml0aW9uOiBJTW9kYWxXaWRnZXRPcGVuUmVxdWVzdERhdGE7XG4gICAgd2lkZ2V0Um9vbUlkPzogc3RyaW5nO1xuICAgIHNvdXJjZVdpZGdldElkOiBzdHJpbmc7XG4gICAgb25GaW5pc2hlZChzdWNjZXNzOiB0cnVlLCBkYXRhOiBJTW9kYWxXaWRnZXRSZXR1cm5EYXRhKTogdm9pZDtcbiAgICBvbkZpbmlzaGVkKHN1Y2Nlc3M/OiBmYWxzZSwgZGF0YT86IHZvaWQpOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBtZXNzYWdpbmc/OiBDbGllbnRXaWRnZXRBcGk7XG4gICAgZGlzYWJsZWRCdXR0b25JZHM6IE1vZGFsQnV0dG9uSURbXTtcbn1cblxuY29uc3QgTUFYX0JVVFRPTlMgPSAzO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNb2RhbFdpZGdldERpYWxvZyBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IHdpZGdldDogV2lkZ2V0O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9zc2libGVCdXR0b25zOiBNb2RhbEJ1dHRvbklEW107XG4gICAgcHJpdmF0ZSBhcHBGcmFtZTogUmVhY3QuUmVmT2JqZWN0PEhUTUxJRnJhbWVFbGVtZW50PiA9IFJlYWN0LmNyZWF0ZVJlZigpO1xuXG4gICAgcHVibGljIHN0YXRlOiBJU3RhdGUgPSB7XG4gICAgICAgIGRpc2FibGVkQnV0dG9uSWRzOiAodGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uLmJ1dHRvbnMgfHwgW10pLmZpbHRlcigoYikgPT4gYi5kaXNhYmxlZCkubWFwKChiKSA9PiBiLmlkKSxcbiAgICB9O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuXG4gICAgICAgIHRoaXMud2lkZ2V0ID0gbmV3IEVsZW1lbnRXaWRnZXQoe1xuICAgICAgICAgICAgLi4udGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uLFxuICAgICAgICAgICAgY3JlYXRvclVzZXJJZDogTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRTYWZlVXNlcklkKCksXG4gICAgICAgICAgICBpZDogYG1vZGFsXyR7dGhpcy5wcm9wcy5zb3VyY2VXaWRnZXRJZH1gLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wb3NzaWJsZUJ1dHRvbnMgPSAodGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uLmJ1dHRvbnMgfHwgW10pLm1hcCgoYikgPT4gYi5pZCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZE1vdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBkcml2ZXIgPSBuZXcgU3RvcEdhcFdpZGdldERyaXZlcihbXSwgdGhpcy53aWRnZXQsIFdpZGdldEtpbmQuTW9kYWwsIGZhbHNlKTtcbiAgICAgICAgY29uc3QgbWVzc2FnaW5nID0gbmV3IENsaWVudFdpZGdldEFwaSh0aGlzLndpZGdldCwgdGhpcy5hcHBGcmFtZS5jdXJyZW50ISwgZHJpdmVyKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IG1lc3NhZ2luZyB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50V2lsbFVubW91bnQoKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5tZXNzYWdpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmcub2ZmKFwicmVhZHlcIiwgdGhpcy5vblJlYWR5KTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmcub2ZmKGBhY3Rpb246JHtXaWRnZXRBcGlGcm9tV2lkZ2V0QWN0aW9uLkNsb3NlTW9kYWxXaWRnZXR9YCwgdGhpcy5vbldpZGdldENsb3NlKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmcuc3RvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25SZWFkeSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmc/LnNlbmRXaWRnZXRDb25maWcodGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkxvYWQgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICghdGhpcy5zdGF0ZS5tZXNzYWdpbmcpIHJldHVybjtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmcub25jZShcInJlYWR5XCIsIHRoaXMub25SZWFkeSk7XG4gICAgICAgIHRoaXMuc3RhdGUubWVzc2FnaW5nLm9uKGBhY3Rpb246JHtXaWRnZXRBcGlGcm9tV2lkZ2V0QWN0aW9uLkNsb3NlTW9kYWxXaWRnZXR9YCwgdGhpcy5vbldpZGdldENsb3NlKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5tZXNzYWdpbmcub24oYGFjdGlvbjoke1dpZGdldEFwaUZyb21XaWRnZXRBY3Rpb24uU2V0TW9kYWxCdXR0b25FbmFibGVkfWAsIHRoaXMub25CdXR0b25FbmFibGVUb2dnbGUpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uV2lkZ2V0Q2xvc2UgPSAoZXY6IEN1c3RvbUV2ZW50PElNb2RhbFdpZGdldENsb3NlUmVxdWVzdD4pOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5wcm9wcy5vbkZpbmlzaGVkKHRydWUsIGV2LmRldGFpbC5kYXRhKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkJ1dHRvbkVuYWJsZVRvZ2dsZSA9IChldjogQ3VzdG9tRXZlbnQ8SVNldE1vZGFsQnV0dG9uRW5hYmxlZEFjdGlvblJlcXVlc3Q+KTogdm9pZCA9PiB7XG4gICAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGNvbnN0IGlzQ2xvc2UgPSBldi5kZXRhaWwuZGF0YS5idXR0b24gPT09IEJ1aWx0SW5Nb2RhbEJ1dHRvbklELkNsb3NlO1xuICAgICAgICBpZiAoaXNDbG9zZSB8fCAhdGhpcy5wb3NzaWJsZUJ1dHRvbnMuaW5jbHVkZXMoZXYuZGV0YWlsLmRhdGEuYnV0dG9uKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUubWVzc2FnaW5nPy50cmFuc3BvcnQucmVwbHkoZXYuZGV0YWlsLCB7XG4gICAgICAgICAgICAgICAgZXJyb3I6IHsgbWVzc2FnZTogXCJJbnZhbGlkIGJ1dHRvblwiIH0sXG4gICAgICAgICAgICB9IGFzIElXaWRnZXRBcGlFcnJvclJlc3BvbnNlRGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnV0dG9uSWRzOiBNb2RhbEJ1dHRvbklEW107XG4gICAgICAgIGlmIChldi5kZXRhaWwuZGF0YS5lbmFibGVkKSB7XG4gICAgICAgICAgICBidXR0b25JZHMgPSBhcnJheUZhc3RDbG9uZSh0aGlzLnN0YXRlLmRpc2FibGVkQnV0dG9uSWRzKS5maWx0ZXIoKGkpID0+IGkgIT09IGV2LmRldGFpbC5kYXRhLmJ1dHRvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyB1c2UgYSBzZXQgdG8gc3dhcCB0aGUgb3BlcmF0aW9uIHRvIGF2b2lkIG1lbW9yeSBsZWFreSBhcnJheXMuXG4gICAgICAgICAgICBjb25zdCB0ZW1wU2V0ID0gbmV3IFNldCh0aGlzLnN0YXRlLmRpc2FibGVkQnV0dG9uSWRzKTtcbiAgICAgICAgICAgIHRlbXBTZXQuYWRkKGV2LmRldGFpbC5kYXRhLmJ1dHRvbik7XG4gICAgICAgICAgICBidXR0b25JZHMgPSBBcnJheS5mcm9tKHRlbXBTZXQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkaXNhYmxlZEJ1dHRvbklkczogYnV0dG9uSWRzIH0pO1xuICAgICAgICB0aGlzLnN0YXRlLm1lc3NhZ2luZz8udHJhbnNwb3J0LnJlcGx5KGV2LmRldGFpbCwge30gYXMgSVdpZGdldEFwaUFja25vd2xlZGdlUmVzcG9uc2VEYXRhKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBjb25zdCB0ZW1wbGF0ZWQgPSB0aGlzLndpZGdldC5nZXRDb21wbGV0ZVVybCh7XG4gICAgICAgICAgICB3aWRnZXRSb29tSWQ6IHRoaXMucHJvcHMud2lkZ2V0Um9vbUlkLFxuICAgICAgICAgICAgY3VycmVudFVzZXJJZDogTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRTYWZlVXNlcklkKCksXG4gICAgICAgICAgICB1c2VyRGlzcGxheU5hbWU6IE93blByb2ZpbGVTdG9yZS5pbnN0YW5jZS5kaXNwbGF5TmFtZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICB1c2VySHR0cEF2YXRhclVybDogT3duUHJvZmlsZVN0b3JlLmluc3RhbmNlLmdldEh0dHBBdmF0YXJVcmwoKSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgICBjbGllbnRJZDogRUxFTUVOVF9DTElFTlRfSUQsXG4gICAgICAgICAgICBjbGllbnRUaGVtZTogU2V0dGluZ3NTdG9yZS5nZXRWYWx1ZShcInRoZW1lXCIpLFxuICAgICAgICAgICAgY2xpZW50TGFuZ3VhZ2U6IGdldFVzZXJMYW5ndWFnZSgpLFxuICAgICAgICAgICAgYmFzZVVybDogTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5iYXNlVXJsLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBwYXJzZWQgPSBuZXcgVVJMKHRlbXBsYXRlZCk7XG5cbiAgICAgICAgLy8gQWRkIGluIHNvbWUgbGVnYWN5IHN1cHBvcnQgc3ByaW5rbGVzIChmb3Igbm9uLXBvcG91dCB3aWRnZXRzKVxuICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZXNlIHdpdGggcHJvcGVyIHdpZGdldCBwYXJhbXNcbiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRyaXgtb3JnL21hdHJpeC1kb2MvcHVsbC8xOTU4L2ZpbGVzI3I0MDU3MTQ4MzNcbiAgICAgICAgcGFyc2VkLnNlYXJjaFBhcmFtcy5zZXQoXCJ3aWRnZXRJZFwiLCB0aGlzLndpZGdldC5pZCk7XG4gICAgICAgIHBhcnNlZC5zZWFyY2hQYXJhbXMuc2V0KFwicGFyZW50VXJsXCIsIHdpbmRvdy5sb2NhdGlvbi5ocmVmLnNwbGl0KFwiI1wiLCAyKVswXSk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB0aGUgZW5jb2RlZCBkb2xsYXIgc2lnbnMgYmFjayB0byBkb2xsYXIgc2lnbnMuIFRoZXkgaGF2ZSBubyBzcGVjaWFsIG1lYW5pbmdcbiAgICAgICAgLy8gaW4gSFRUUCwgYnV0IFVSTCBwYXJzZXJzIGVuY29kZSB0aGVtIGFueXdheXMuXG4gICAgICAgIGNvbnN0IHdpZGdldFVybCA9IHBhcnNlZC50b1N0cmluZygpLnJlcGxhY2UoLyUyNC9nLCBcIiRcIik7XG5cbiAgICAgICAgbGV0IGJ1dHRvbnM7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLndpZGdldERlZmluaXRpb24uYnV0dG9ucykge1xuICAgICAgICAgICAgLy8gc2hvdyBmaXJzdCBidXR0b24gcmlnaHRtb3N0IGZvciBhIG1vcmUgbmF0dXJhbCBzcGVjaWZpY2F0aW9uXG4gICAgICAgICAgICBidXR0b25zID0gdGhpcy5wcm9wcy53aWRnZXREZWZpbml0aW9uLmJ1dHRvbnNcbiAgICAgICAgICAgICAgICAuc2xpY2UoMCwgTUFYX0JVVFRPTlMpXG4gICAgICAgICAgICAgICAgLnJldmVyc2UoKVxuICAgICAgICAgICAgICAgIC5tYXAoKGRlZikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQga2luZDogQWNjZXNzaWJsZUJ1dHRvbktpbmQgPSBcInNlY29uZGFyeVwiO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlZi5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1vZGFsQnV0dG9uS2luZC5QcmltYXJ5OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSBcInByaW1hcnlcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kYWxCdXR0b25LaW5kLlNlY29uZGFyeTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gXCJwcmltYXJ5X291dGxpbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTW9kYWxCdXR0b25LaW5kLkRhbmdlcjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gXCJkYW5nZXJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLm1lc3NhZ2luZz8ubm90aWZ5TW9kYWxXaWRnZXRCdXR0b25DbGlja2VkKGRlZi5pZCk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNEaXNhYmxlZCA9IHRoaXMuc3RhdGUuZGlzYWJsZWRCdXR0b25JZHMuaW5jbHVkZXMoZGVmLmlkKTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24ga2V5PXtkZWYuaWR9IGtpbmQ9e2tpbmR9IG9uQ2xpY2s9e29uQ2xpY2t9IGRpc2FibGVkPXtpc0Rpc2FibGVkfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZGVmLmxhYmVsfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxCYXNlRGlhbG9nXG4gICAgICAgICAgICAgICAgdGl0bGU9e3RoaXMucHJvcHMud2lkZ2V0RGVmaW5pdGlvbi5uYW1lIHx8IF90KFwid2lkZ2V0fG1vZGFsX3RpdGxlX2RlZmF1bHRcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfTW9kYWxXaWRnZXREaWFsb2dcIlxuICAgICAgICAgICAgICAgIGNvbnRlbnRJZD1cIm14X0RpYWxvZ19jb250ZW50XCJcbiAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPXt0aGlzLnByb3BzLm9uRmluaXNoZWR9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Nb2RhbFdpZGdldERpYWxvZ193YXJuaW5nXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyYz17cmVxdWlyZShcIi4uLy4uLy4uLy4uL3Jlcy9pbWcvZWxlbWVudC1pY29ucy93YXJuaW5nLWJhZGdlLnN2Z1wiKS5kZWZhdWx0fVxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiMTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCIxNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICB7X3QoXCJ3aWRnZXR8bW9kYWxfZGF0YV93YXJuaW5nXCIsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZGdldERvbWFpbjogcGFyc2VkLmhvc3RuYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8aWZyYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17dGhpcy53aWRnZXQubmFtZSA/PyB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICByZWY9e3RoaXMuYXBwRnJhbWV9XG4gICAgICAgICAgICAgICAgICAgICAgICBzYW5kYm94PVwiYWxsb3ctZm9ybXMgYWxsb3ctc2NyaXB0cyBhbGxvdy1zYW1lLW9yaWdpblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9e3dpZGdldFVybH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9hZD17dGhpcy5vbkxvYWR9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Nb2RhbFdpZGdldERpYWxvZ19idXR0b25zXCI+e2J1dHRvbnN9PC9kaXY+XG4gICAgICAgICAgICA8L0Jhc2VEaWFsb2c+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7OztBQVFBLElBQUFBLEtBQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGdCQUFBLEdBQUFELE9BQUE7QUFnQkEsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLGlCQUFBLEdBQUFGLHNCQUFBLENBQUFILE9BQUE7QUFDQSxJQUFBTSxvQkFBQSxHQUFBTixPQUFBO0FBQ0EsSUFBQU8sZ0JBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyxPQUFBLEdBQUFULE9BQUE7QUFDQSxJQUFBVSxjQUFBLEdBQUFWLE9BQUE7QUFDQSxJQUFBVyxZQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxjQUFBLEdBQUFULHNCQUFBLENBQUFILE9BQUE7QUFBNEQsU0FBQWEseUJBQUFDLENBQUEsNkJBQUFDLE9BQUEsbUJBQUFDLENBQUEsT0FBQUQsT0FBQSxJQUFBRSxDQUFBLE9BQUFGLE9BQUEsWUFBQUYsd0JBQUEsWUFBQUEsQ0FBQUMsQ0FBQSxXQUFBQSxDQUFBLEdBQUFHLENBQUEsR0FBQUQsQ0FBQSxL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