matrix-react-sdk
Version:
SDK for matrix.org using React
307 lines (298 loc) • 50.1 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../languageHandler");
var _AppTile = _interopRequireDefault(require("../elements/AppTile"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _WidgetUtils = _interopRequireDefault(require("../../../utils/WidgetUtils"));
var _PersistedElement = _interopRequireDefault(require("../elements/PersistedElement"));
var _IntegrationManagers = require("../../../integrations/IntegrationManagers");
var _ContextMenu = _interopRequireWildcard(require("../../structures/ContextMenu"));
var _WidgetType = require("../../../widgets/WidgetType");
var _WidgetMessagingStore = require("../../../stores/widgets/WidgetMessagingStore");
var _GenericElementContextMenu = _interopRequireDefault(require("../context_menus/GenericElementContextMenu"));
var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore"));
var _AsyncStore = require("../../../stores/AsyncStore");
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 2018-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
// This should be below the dialog level (4000), but above the rest of the UI (1000-2000).
// We sit in a context menu, so this should be given to the context menu.
const STICKERPICKER_Z_INDEX = 3500;
// Key to store the widget's AppTile under in PersistedElement
const PERSISTED_ELEMENT_KEY = "stickerPicker";
class Stickerpicker extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "dispatcherRef", void 0);
(0, _defineProperty2.default)(this, "prevSentVisibility", void 0);
(0, _defineProperty2.default)(this, "popoverWidth", 300);
(0, _defineProperty2.default)(this, "popoverHeight", 300);
// This is loaded by _acquireScalarClient on an as-needed basis.
(0, _defineProperty2.default)(this, "scalarClient", null);
(0, _defineProperty2.default)(this, "removeStickerpickerWidgets", async () => {
const scalarClient = await this.acquireScalarClient();
_logger.logger.log("Removing Stickerpicker widgets");
if (this.state.widgetId) {
if (scalarClient) {
scalarClient.disableWidgetAssets(_WidgetType.WidgetType.STICKERPICKER, this.state.widgetId).then(() => {
_logger.logger.log("Assets disabled");
}).catch(() => {
_logger.logger.error("Failed to disable assets");
});
} else {
_logger.logger.error("Cannot disable assets: no scalar client");
}
} else {
_logger.logger.warn("No widget ID specified, not disabling assets");
}
this.props.setStickerPickerOpen(false);
_WidgetUtils.default.removeStickerpickerWidgets(this.props.room.client).then(() => {
this.forceUpdate();
}).catch(e => {
_logger.logger.error("Failed to remove sticker picker widget", e);
});
});
(0, _defineProperty2.default)(this, "updateWidget", () => {
const stickerpickerWidget = _WidgetUtils.default.getStickerpickerWidgets(this.props.room.client)[0];
if (!stickerpickerWidget) {
Stickerpicker.currentWidget = undefined;
this.setState({
stickerpickerWidget: null,
widgetId: null
});
return;
}
const currentWidget = Stickerpicker.currentWidget;
const currentUrl = currentWidget?.content?.url ?? null;
const newUrl = stickerpickerWidget?.content?.url ?? null;
if (newUrl !== currentUrl) {
// Destroy the existing frame so a new one can be created
_PersistedElement.default.destroyElement(PERSISTED_ELEMENT_KEY);
}
Stickerpicker.currentWidget = stickerpickerWidget;
this.setState({
stickerpickerWidget,
widgetId: stickerpickerWidget ? stickerpickerWidget.id : null
});
});
(0, _defineProperty2.default)(this, "onAction", payload => {
switch (payload.action) {
case "user_widget_updated":
this.forceUpdate();
break;
case "stickerpicker_close":
this.props.setStickerPickerOpen(false);
break;
case "show_left_panel":
case "hide_left_panel":
this.props.setStickerPickerOpen(false);
break;
}
});
(0, _defineProperty2.default)(this, "onRightPanelStoreUpdate", () => {
this.props.setStickerPickerOpen(false);
});
/**
* Called when the window is resized
*/
(0, _defineProperty2.default)(this, "onResize", () => {
if (this.props.isStickerPickerOpen) {
this.props.setStickerPickerOpen(false);
}
});
/**
* The stickers picker was hidden
*/
(0, _defineProperty2.default)(this, "onFinished", () => {
if (this.props.isStickerPickerOpen) {
this.props.setStickerPickerOpen(false);
}
});
/**
* Launch the integration manager on the stickers integration page
*/
(0, _defineProperty2.default)(this, "launchManageIntegrations", () => {
// noinspection JSIgnoredPromiseFromCall
_IntegrationManagers.IntegrationManagers.sharedInstance()?.getPrimaryManager()?.open(this.props.room, `type_${_WidgetType.WidgetType.STICKERPICKER.preferred}`, this.state.widgetId ?? undefined);
});
this.state = {
imError: null,
stickerpickerWidget: null,
widgetId: null
};
}
async acquireScalarClient() {
if (this.scalarClient) return Promise.resolve(this.scalarClient);
// TODO: Pick the right manager for the widget
if (_IntegrationManagers.IntegrationManagers.sharedInstance().hasManager()) {
this.scalarClient = _IntegrationManagers.IntegrationManagers.sharedInstance().getPrimaryManager()?.getScalarClient() ?? null;
return this.scalarClient?.connect().then(() => {
this.forceUpdate();
return this.scalarClient;
}).catch(e => {
this.imError((0, _languageHandler._td)("integration_manager|error_connecting_heading"), e);
});
} else {
_IntegrationManagers.IntegrationManagers.sharedInstance().openNoManagerDialog();
}
}
componentDidMount() {
// Close the sticker picker when the window resizes
window.addEventListener("resize", this.onResize);
this.dispatcherRef = _dispatcher.default.register(this.onAction);
// Track updates to widget state in account data
_MatrixClientPeg.MatrixClientPeg.safeGet().on(_matrix.ClientEvent.AccountData, this.updateWidget);
_RightPanelStore.default.instance.on(_AsyncStore.UPDATE_EVENT, this.onRightPanelStoreUpdate);
// Initialise widget state from current account data
this.updateWidget();
}
componentWillUnmount() {
const client = _MatrixClientPeg.MatrixClientPeg.get();
if (client) client.removeListener(_matrix.ClientEvent.AccountData, this.updateWidget);
_RightPanelStore.default.instance.off(_AsyncStore.UPDATE_EVENT, this.onRightPanelStoreUpdate);
window.removeEventListener("resize", this.onResize);
if (this.dispatcherRef) {
_dispatcher.default.unregister(this.dispatcherRef);
}
}
componentDidUpdate() {
this.sendVisibilityToWidget(this.props.isStickerPickerOpen);
}
imError(errorMsg, e) {
_logger.logger.error(errorMsg, e);
this.setState({
imError: (0, _languageHandler._t)(errorMsg)
});
this.props.setStickerPickerOpen(false);
}
defaultStickerpickerContent() {
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.launchManageIntegrations,
className: "mx_Stickers_contentPlaceholder"
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("stickers|empty")), /*#__PURE__*/_react.default.createElement("p", {
className: "mx_Stickers_addLink"
}, (0, _languageHandler._t)("stickers|empty_add_prompt")), /*#__PURE__*/_react.default.createElement("img", {
src: require("../../../../res/img/stickerpack-placeholder.png"),
alt: ""
}));
}
errorStickerpickerContent() {
return /*#__PURE__*/_react.default.createElement("div", {
style: {
textAlign: "center"
},
className: "error"
}, /*#__PURE__*/_react.default.createElement("p", null, " ", this.state.imError, " "));
}
sendVisibilityToWidget(visible) {
if (!this.state.stickerpickerWidget) return;
const messaging = _WidgetMessagingStore.WidgetMessagingStore.instance.getMessagingForUid(_WidgetUtils.default.calcWidgetUid(this.state.stickerpickerWidget.id));
if (messaging && visible !== this.prevSentVisibility) {
messaging.updateVisibility(visible).catch(err => {
_logger.logger.error("Error updating widget visibility: ", err);
});
this.prevSentVisibility = visible;
}
}
getStickerpickerContent() {
// Handle integration manager errors
if (this.state.imError) {
return this.errorStickerpickerContent();
}
// Stickers
// TODO - Add support for Stickerpickers from multiple app stores.
// Render content from multiple stickerpack sources, each within their
// own iframe, within the stickerpicker UI element.
const stickerpickerWidget = this.state.stickerpickerWidget;
let stickersContent;
// Use a separate ReactDOM tree to render the AppTile separately so that it persists and does
// not unmount when we (a) close the sticker picker (b) switch rooms. It's properties are still
// updated.
// Load stickerpack content
if (!!stickerpickerWidget?.content?.url) {
// Set default name
stickerpickerWidget.content.name = stickerpickerWidget.content.name || (0, _languageHandler._t)("common|stickerpack");
// FIXME: could this use the same code as other apps?
const stickerApp = {
id: stickerpickerWidget.id,
url: stickerpickerWidget.content.url,
name: stickerpickerWidget.content.name,
type: stickerpickerWidget.content.type,
data: stickerpickerWidget.content.data,
creatorUserId: stickerpickerWidget.content.creatorUserId || stickerpickerWidget.sender
};
stickersContent = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Stickers_content_container"
}, /*#__PURE__*/_react.default.createElement("div", {
id: "stickersContent",
className: "mx_Stickers_content",
style: {
border: "none",
height: this.popoverHeight,
width: this.popoverWidth
}
}, /*#__PURE__*/_react.default.createElement(_PersistedElement.default, {
persistKey: PERSISTED_ELEMENT_KEY,
zIndex: STICKERPICKER_Z_INDEX
}, /*#__PURE__*/_react.default.createElement(_AppTile.default, {
app: stickerApp,
room: this.props.room,
threadId: this.props.threadId,
fullWidth: true,
userId: _MatrixClientPeg.MatrixClientPeg.safeGet().credentials.userId,
creatorUserId: stickerpickerWidget.sender || _MatrixClientPeg.MatrixClientPeg.safeGet().credentials.userId,
waitForIframeLoad: true,
showMenubar: true,
onEditClick: this.launchManageIntegrations,
onDeleteClick: this.removeStickerpickerWidgets,
showTitle: false,
showPopout: false,
handleMinimisePointerEvents: true,
userWidget: true,
showLayoutButtons: false
}))));
} else {
// Default content to show if stickerpicker widget not added
stickersContent = this.defaultStickerpickerContent();
}
return stickersContent;
}
render() {
if (!this.props.isStickerPickerOpen) return null;
return /*#__PURE__*/_react.default.createElement(_ContextMenu.default, (0, _extends2.default)({
chevronFace: _ContextMenu.ChevronFace.Bottom,
menuWidth: this.popoverWidth,
menuHeight: this.popoverHeight,
onFinished: this.onFinished,
menuPaddingTop: 0,
menuPaddingLeft: 0,
menuPaddingRight: 0,
zIndex: STICKERPICKER_Z_INDEX,
mountAsChild: true
}, this.props.menuPosition), /*#__PURE__*/_react.default.createElement(_GenericElementContextMenu.default, {
element: this.getStickerpickerContent(),
onResize: this.onFinished
}));
}
}
exports.default = Stickerpicker;
(0, _defineProperty2.default)(Stickerpicker, "defaultProps", {
threadId: null
});
(0, _defineProperty2.default)(Stickerpicker, "currentWidget", void 0);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9BcHBUaWxlIiwiX01hdHJpeENsaWVudFBlZyIsIl9kaXNwYXRjaGVyIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfV2lkZ2V0VXRpbHMiLCJfUGVyc2lzdGVkRWxlbWVudCIsIl9JbnRlZ3JhdGlvbk1hbmFnZXJzIiwiX0NvbnRleHRNZW51IiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfV2lkZ2V0VHlwZSIsIl9XaWRnZXRNZXNzYWdpbmdTdG9yZSIsIl9HZW5lcmljRWxlbWVudENvbnRleHRNZW51IiwiX1JpZ2h0UGFuZWxTdG9yZSIsIl9Bc3luY1N0b3JlIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiU1RJQ0tFUlBJQ0tFUl9aX0lOREVYIiwiUEVSU0lTVEVEX0VMRU1FTlRfS0VZIiwiU3RpY2tlcnBpY2tlciIsIlJlYWN0IiwiUHVyZUNvbXBvbmVudCIsImNvbnN0cnVjdG9yIiwicHJvcHMiLCJfZGVmaW5lUHJvcGVydHkyIiwic2NhbGFyQ2xpZW50IiwiYWNxdWlyZVNjYWxhckNsaWVudCIsImxvZ2dlciIsImxvZyIsInN0YXRlIiwid2lkZ2V0SWQiLCJkaXNhYmxlV2lkZ2V0QXNzZXRzIiwiV2lkZ2V0VHlwZSIsIlNUSUNLRVJQSUNLRVIiLCJ0aGVuIiwiY2F0Y2giLCJlcnJvciIsIndhcm4iLCJzZXRTdGlja2VyUGlja2VyT3BlbiIsIldpZGdldFV0aWxzIiwicmVtb3ZlU3RpY2tlcnBpY2tlcldpZGdldHMiLCJyb29tIiwiY2xpZW50IiwiZm9yY2VVcGRhdGUiLCJzdGlja2VycGlja2VyV2lkZ2V0IiwiZ2V0U3RpY2tlcnBpY2tlcldpZGdldHMiLCJjdXJyZW50V2lkZ2V0IiwidW5kZWZpbmVkIiwic2V0U3RhdGUiLCJjdXJyZW50VXJsIiwiY29udGVudCIsInVybCIsIm5ld1VybCIsIlBlcnNpc3RlZEVsZW1lbnQiLCJkZXN0cm95RWxlbWVudCIsImlkIiwicGF5bG9hZCIsImFjdGlvbiIsImlzU3RpY2tlclBpY2tlck9wZW4iLCJJbnRlZ3JhdGlvbk1hbmFnZXJzIiwic2hhcmVkSW5zdGFuY2UiLCJnZXRQcmltYXJ5TWFuYWdlciIsIm9wZW4iLCJwcmVmZXJyZWQiLCJpbUVycm9yIiwiUHJvbWlzZSIsInJlc29sdmUiLCJoYXNNYW5hZ2VyIiwiZ2V0U2NhbGFyQ2xpZW50IiwiY29ubmVjdCIsIl90ZCIsIm9wZW5Ob01hbmFnZXJEaWFsb2ciLCJjb21wb25lbnREaWRNb3VudCIsIndpbmRvdyIsImFkZEV2ZW50TGlzdGVuZXIiLCJvblJlc2l6ZSIsImRpc3BhdGNoZXJSZWYiLCJkaXMiLCJyZWdpc3RlciIsIm9uQWN0aW9uIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsIm9uIiwiQ2xpZW50RXZlbnQiLCJBY2NvdW50RGF0YSIsInVwZGF0ZVdpZGdldCIsIlJpZ2h0UGFuZWxTdG9yZSIsImluc3RhbmNlIiwiVVBEQVRFX0VWRU5UIiwib25SaWdodFBhbmVsU3RvcmVVcGRhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsInJlbW92ZUxpc3RlbmVyIiwib2ZmIiwicmVtb3ZlRXZlbnRMaXN0ZW5lciIsInVucmVnaXN0ZXIiLCJjb21wb25lbnREaWRVcGRhdGUiLCJzZW5kVmlzaWJpbGl0eVRvV2lkZ2V0IiwiZXJyb3JNc2ciLCJfdCIsImRlZmF1bHRTdGlja2VycGlja2VyQ29udGVudCIsImNyZWF0ZUVsZW1lbnQiLCJvbkNsaWNrIiwibGF1bmNoTWFuYWdlSW50ZWdyYXRpb25zIiwiY2xhc3NOYW1lIiwic3JjIiwiYWx0IiwiZXJyb3JTdGlja2VycGlja2VyQ29udGVudCIsInN0eWxlIiwidGV4dEFsaWduIiwidmlzaWJsZSIsIm1lc3NhZ2luZyIsIldpZGdldE1lc3NhZ2luZ1N0b3JlIiwiZ2V0TWVzc2FnaW5nRm9yVWlkIiwiY2FsY1dpZGdldFVpZCIsInByZXZTZW50VmlzaWJpbGl0eSIsInVwZGF0ZVZpc2liaWxpdHkiLCJlcnIiLCJnZXRTdGlja2VycGlja2VyQ29udGVudCIsInN0aWNrZXJzQ29udGVudCIsIm5hbWUiLCJzdGlja2VyQXBwIiwidHlwZSIsImRhdGEiLCJjcmVhdG9yVXNlcklkIiwic2VuZGVyIiwiYm9yZGVyIiwiaGVpZ2h0IiwicG9wb3ZlckhlaWdodCIsIndpZHRoIiwicG9wb3ZlcldpZHRoIiwicGVyc2lzdEtleSIsInpJbmRleCIsImFwcCIsInRocmVhZElkIiwiZnVsbFdpZHRoIiwidXNlcklkIiwiY3JlZGVudGlhbHMiLCJ3YWl0Rm9ySWZyYW1lTG9hZCIsInNob3dNZW51YmFyIiwib25FZGl0Q2xpY2siLCJvbkRlbGV0ZUNsaWNrIiwic2hvd1RpdGxlIiwic2hvd1BvcG91dCIsImhhbmRsZU1pbmltaXNlUG9pbnRlckV2ZW50cyIsInVzZXJXaWRnZXQiLCJzaG93TGF5b3V0QnV0dG9ucyIsInJlbmRlciIsIl9leHRlbmRzMiIsImNoZXZyb25GYWNlIiwiQ2hldnJvbkZhY2UiLCJCb3R0b20iLCJtZW51V2lkdGgiLCJtZW51SGVpZ2h0Iiwib25GaW5pc2hlZCIsIm1lbnVQYWRkaW5nVG9wIiwibWVudVBhZGRpbmdMZWZ0IiwibWVudVBhZGRpbmdSaWdodCIsIm1vdW50QXNDaGlsZCIsIm1lbnVQb3NpdGlvbiIsImVsZW1lbnQiLCJleHBvcnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3Mvcm9vbXMvU3RpY2tlcnBpY2tlci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE4LTIwMjQgTmV3IFZlY3RvciBMdGQuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IFJvb20sIENsaWVudEV2ZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgSVdpZGdldCB9IGZyb20gXCJtYXRyaXgtd2lkZ2V0LWFwaVwiO1xuXG5pbXBvcnQgeyBfdCwgX3RkLCBUcmFuc2xhdGlvbktleSB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBBcHBUaWxlIGZyb20gXCIuLi9lbGVtZW50cy9BcHBUaWxlXCI7XG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vLi4vLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCBBY2Nlc3NpYmxlQnV0dG9uIGZyb20gXCIuLi9lbGVtZW50cy9BY2Nlc3NpYmxlQnV0dG9uXCI7XG5pbXBvcnQgV2lkZ2V0VXRpbHMsIHsgVXNlcldpZGdldCB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9XaWRnZXRVdGlsc1wiO1xuaW1wb3J0IFBlcnNpc3RlZEVsZW1lbnQgZnJvbSBcIi4uL2VsZW1lbnRzL1BlcnNpc3RlZEVsZW1lbnRcIjtcbmltcG9ydCB7IEludGVncmF0aW9uTWFuYWdlcnMgfSBmcm9tIFwiLi4vLi4vLi4vaW50ZWdyYXRpb25zL0ludGVncmF0aW9uTWFuYWdlcnNcIjtcbmltcG9ydCBDb250ZXh0TWVudSwgeyBDaGV2cm9uRmFjZSB9IGZyb20gXCIuLi8uLi9zdHJ1Y3R1cmVzL0NvbnRleHRNZW51XCI7XG5pbXBvcnQgeyBXaWRnZXRUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL3dpZGdldHMvV2lkZ2V0VHlwZVwiO1xuaW1wb3J0IHsgV2lkZ2V0TWVzc2FnaW5nU3RvcmUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3dpZGdldHMvV2lkZ2V0TWVzc2FnaW5nU3RvcmVcIjtcbmltcG9ydCB7IEFjdGlvblBheWxvYWQgfSBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9wYXlsb2Fkc1wiO1xuaW1wb3J0IFNjYWxhckF1dGhDbGllbnQgZnJvbSBcIi4uLy4uLy4uL1NjYWxhckF1dGhDbGllbnRcIjtcbmltcG9ydCBHZW5lcmljRWxlbWVudENvbnRleHRNZW51IGZyb20gXCIuLi9jb250ZXh0X21lbnVzL0dlbmVyaWNFbGVtZW50Q29udGV4dE1lbnVcIjtcbmltcG9ydCBSaWdodFBhbmVsU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yaWdodC1wYW5lbC9SaWdodFBhbmVsU3RvcmVcIjtcbmltcG9ydCB7IFVQREFURV9FVkVOVCB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvQXN5bmNTdG9yZVwiO1xuXG4vLyBUaGlzIHNob3VsZCBiZSBiZWxvdyB0aGUgZGlhbG9nIGxldmVsICg0MDAwKSwgYnV0IGFib3ZlIHRoZSByZXN0IG9mIHRoZSBVSSAoMTAwMC0yMDAwKS5cbi8vIFdlIHNpdCBpbiBhIGNvbnRleHQgbWVudSwgc28gdGhpcyBzaG91bGQgYmUgZ2l2ZW4gdG8gdGhlIGNvbnRleHQgbWVudS5cbmNvbnN0IFNUSUNLRVJQSUNLRVJfWl9JTkRFWCA9IDM1MDA7XG5cbi8vIEtleSB0byBzdG9yZSB0aGUgd2lkZ2V0J3MgQXBwVGlsZSB1bmRlciBpbiBQZXJzaXN0ZWRFbGVtZW50XG5jb25zdCBQRVJTSVNURURfRUxFTUVOVF9LRVkgPSBcInN0aWNrZXJQaWNrZXJcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgcm9vbTogUm9vbTtcbiAgICB0aHJlYWRJZD86IHN0cmluZyB8IG51bGw7XG4gICAgaXNTdGlja2VyUGlja2VyT3BlbjogYm9vbGVhbjtcbiAgICBtZW51UG9zaXRpb24/OiBhbnk7XG4gICAgc2V0U3RpY2tlclBpY2tlck9wZW46IChpc1N0aWNrZXJQaWNrZXJPcGVuOiBib29sZWFuKSA9PiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBpbUVycm9yOiBzdHJpbmcgfCBudWxsO1xuICAgIHN0aWNrZXJwaWNrZXJXaWRnZXQ6IFVzZXJXaWRnZXQgfCBudWxsO1xuICAgIHdpZGdldElkOiBzdHJpbmcgfCBudWxsO1xufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGlja2VycGlja2VyIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHB1YmxpYyBzdGF0aWMgZGVmYXVsdFByb3BzOiBQYXJ0aWFsPElQcm9wcz4gPSB7XG4gICAgICAgIHRocmVhZElkOiBudWxsLFxuICAgIH07XG5cbiAgICBwdWJsaWMgc3RhdGljIGN1cnJlbnRXaWRnZXQ/OiBVc2VyV2lkZ2V0O1xuXG4gICAgcHJpdmF0ZSBkaXNwYXRjaGVyUmVmPzogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBwcmV2U2VudFZpc2liaWxpdHk/OiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBwb3BvdmVyV2lkdGggPSAzMDA7XG4gICAgcHJpdmF0ZSBwb3BvdmVySGVpZ2h0ID0gMzAwO1xuICAgIC8vIFRoaXMgaXMgbG9hZGVkIGJ5IF9hY3F1aXJlU2NhbGFyQ2xpZW50IG9uIGFuIGFzLW5lZWRlZCBiYXNpcy5cbiAgICBwcml2YXRlIHNjYWxhckNsaWVudDogU2NhbGFyQXV0aENsaWVudCB8IG51bGwgPSBudWxsO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMpIHtcbiAgICAgICAgc3VwZXIocHJvcHMpO1xuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgaW1FcnJvcjogbnVsbCxcbiAgICAgICAgICAgIHN0aWNrZXJwaWNrZXJXaWRnZXQ6IG51bGwsXG4gICAgICAgICAgICB3aWRnZXRJZDogbnVsbCxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGFjcXVpcmVTY2FsYXJDbGllbnQoKTogUHJvbWlzZTx2b2lkIHwgdW5kZWZpbmVkIHwgbnVsbCB8IFNjYWxhckF1dGhDbGllbnQ+IHtcbiAgICAgICAgaWYgKHRoaXMuc2NhbGFyQ2xpZW50KSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuc2NhbGFyQ2xpZW50KTtcbiAgICAgICAgLy8gVE9ETzogUGljayB0aGUgcmlnaHQgbWFuYWdlciBmb3IgdGhlIHdpZGdldFxuICAgICAgICBpZiAoSW50ZWdyYXRpb25NYW5hZ2Vycy5zaGFyZWRJbnN0YW5jZSgpLmhhc01hbmFnZXIoKSkge1xuICAgICAgICAgICAgdGhpcy5zY2FsYXJDbGllbnQgPSBJbnRlZ3JhdGlvbk1hbmFnZXJzLnNoYXJlZEluc3RhbmNlKCkuZ2V0UHJpbWFyeU1hbmFnZXIoKT8uZ2V0U2NhbGFyQ2xpZW50KCkgPz8gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhckNsaWVudFxuICAgICAgICAgICAgICAgID8uY29ubmVjdCgpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxhckNsaWVudDtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmltRXJyb3IoX3RkKFwiaW50ZWdyYXRpb25fbWFuYWdlcnxlcnJvcl9jb25uZWN0aW5nX2hlYWRpbmdcIiksIGUpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgSW50ZWdyYXRpb25NYW5hZ2Vycy5zaGFyZWRJbnN0YW5jZSgpLm9wZW5Ob01hbmFnZXJEaWFsb2coKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVtb3ZlU3RpY2tlcnBpY2tlcldpZGdldHMgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGNvbnN0IHNjYWxhckNsaWVudCA9IGF3YWl0IHRoaXMuYWNxdWlyZVNjYWxhckNsaWVudCgpO1xuICAgICAgICBsb2dnZXIubG9nKFwiUmVtb3ZpbmcgU3RpY2tlcnBpY2tlciB3aWRnZXRzXCIpO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS53aWRnZXRJZCkge1xuICAgICAgICAgICAgaWYgKHNjYWxhckNsaWVudCkge1xuICAgICAgICAgICAgICAgIHNjYWxhckNsaWVudFxuICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZVdpZGdldEFzc2V0cyhXaWRnZXRUeXBlLlNUSUNLRVJQSUNLRVIsIHRoaXMuc3RhdGUud2lkZ2V0SWQpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coXCJBc3NldHMgZGlzYWJsZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJGYWlsZWQgdG8gZGlzYWJsZSBhc3NldHNcIik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXCJDYW5ub3QgZGlzYWJsZSBhc3NldHM6IG5vIHNjYWxhciBjbGllbnRcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcIk5vIHdpZGdldCBJRCBzcGVjaWZpZWQsIG5vdCBkaXNhYmxpbmcgYXNzZXRzXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wcm9wcy5zZXRTdGlja2VyUGlja2VyT3BlbihmYWxzZSk7XG4gICAgICAgIFdpZGdldFV0aWxzLnJlbW92ZVN0aWNrZXJwaWNrZXJXaWRnZXRzKHRoaXMucHJvcHMucm9vbS5jbGllbnQpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIkZhaWxlZCB0byByZW1vdmUgc3RpY2tlciBwaWNrZXIgd2lkZ2V0XCIsIGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBjb21wb25lbnREaWRNb3VudCgpOiB2b2lkIHtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHN0aWNrZXIgcGlja2VyIHdoZW4gdGhlIHdpbmRvdyByZXNpemVzXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuXG4gICAgICAgIHRoaXMuZGlzcGF0Y2hlclJlZiA9IGRpcy5yZWdpc3Rlcih0aGlzLm9uQWN0aW9uKTtcblxuICAgICAgICAvLyBUcmFjayB1cGRhdGVzIHRvIHdpZGdldCBzdGF0ZSBpbiBhY2NvdW50IGRhdGFcbiAgICAgICAgTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5vbihDbGllbnRFdmVudC5BY2NvdW50RGF0YSwgdGhpcy51cGRhdGVXaWRnZXQpO1xuXG4gICAgICAgIFJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS5vbihVUERBVEVfRVZFTlQsIHRoaXMub25SaWdodFBhbmVsU3RvcmVVcGRhdGUpO1xuICAgICAgICAvLyBJbml0aWFsaXNlIHdpZGdldCBzdGF0ZSBmcm9tIGN1cnJlbnQgYWNjb3VudCBkYXRhXG4gICAgICAgIHRoaXMudXBkYXRlV2lkZ2V0KCk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG4gICAgICAgIGlmIChjbGllbnQpIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihDbGllbnRFdmVudC5BY2NvdW50RGF0YSwgdGhpcy51cGRhdGVXaWRnZXQpO1xuICAgICAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2Uub2ZmKFVQREFURV9FVkVOVCwgdGhpcy5vblJpZ2h0UGFuZWxTdG9yZVVwZGF0ZSk7XG4gICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMub25SZXNpemUpO1xuICAgICAgICBpZiAodGhpcy5kaXNwYXRjaGVyUmVmKSB7XG4gICAgICAgICAgICBkaXMudW5yZWdpc3Rlcih0aGlzLmRpc3BhdGNoZXJSZWYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudERpZFVwZGF0ZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZW5kVmlzaWJpbGl0eVRvV2lkZ2V0KHRoaXMucHJvcHMuaXNTdGlja2VyUGlja2VyT3Blbik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbUVycm9yKGVycm9yTXNnOiBUcmFuc2xhdGlvbktleSwgZTogRXJyb3IpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTXNnLCBlKTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICBpbUVycm9yOiBfdChlcnJvck1zZyksXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnByb3BzLnNldFN0aWNrZXJQaWNrZXJPcGVuKGZhbHNlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVdpZGdldCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc3RpY2tlcnBpY2tlcldpZGdldCA9IFdpZGdldFV0aWxzLmdldFN0aWNrZXJwaWNrZXJXaWRnZXRzKHRoaXMucHJvcHMucm9vbS5jbGllbnQpWzBdO1xuICAgICAgICBpZiAoIXN0aWNrZXJwaWNrZXJXaWRnZXQpIHtcbiAgICAgICAgICAgIFN0aWNrZXJwaWNrZXIuY3VycmVudFdpZGdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoeyBzdGlja2VycGlja2VyV2lkZ2V0OiBudWxsLCB3aWRnZXRJZDogbnVsbCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN1cnJlbnRXaWRnZXQgPSBTdGlja2VycGlja2VyLmN1cnJlbnRXaWRnZXQ7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRVcmwgPSBjdXJyZW50V2lkZ2V0Py5jb250ZW50Py51cmwgPz8gbnVsbDtcbiAgICAgICAgY29uc3QgbmV3VXJsID0gc3RpY2tlcnBpY2tlcldpZGdldD8uY29udGVudD8udXJsID8/IG51bGw7XG5cbiAgICAgICAgaWYgKG5ld1VybCAhPT0gY3VycmVudFVybCkge1xuICAgICAgICAgICAgLy8gRGVzdHJveSB0aGUgZXhpc3RpbmcgZnJhbWUgc28gYSBuZXcgb25lIGNhbiBiZSBjcmVhdGVkXG4gICAgICAgICAgICBQZXJzaXN0ZWRFbGVtZW50LmRlc3Ryb3lFbGVtZW50KFBFUlNJU1RFRF9FTEVNRU5UX0tFWSk7XG4gICAgICAgIH1cblxuICAgICAgICBTdGlja2VycGlja2VyLmN1cnJlbnRXaWRnZXQgPSBzdGlja2VycGlja2VyV2lkZ2V0O1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHN0aWNrZXJwaWNrZXJXaWRnZXQsXG4gICAgICAgICAgICB3aWRnZXRJZDogc3RpY2tlcnBpY2tlcldpZGdldCA/IHN0aWNrZXJwaWNrZXJXaWRnZXQuaWQgOiBudWxsLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvbkFjdGlvbiA9IChwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogdm9pZCA9PiB7XG4gICAgICAgIHN3aXRjaCAocGF5bG9hZC5hY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgXCJ1c2VyX3dpZGdldF91cGRhdGVkXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInN0aWNrZXJwaWNrZXJfY2xvc2VcIjpcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFN0aWNrZXJQaWNrZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJzaG93X2xlZnRfcGFuZWxcIjpcbiAgICAgICAgICAgIGNhc2UgXCJoaWRlX2xlZnRfcGFuZWxcIjpcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLnNldFN0aWNrZXJQaWNrZXJPcGVuKGZhbHNlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUmlnaHRQYW5lbFN0b3JlVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnByb3BzLnNldFN0aWNrZXJQaWNrZXJPcGVuKGZhbHNlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBkZWZhdWx0U3RpY2tlcnBpY2tlckNvbnRlbnQoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b24gb25DbGljaz17dGhpcy5sYXVuY2hNYW5hZ2VJbnRlZ3JhdGlvbnN9IGNsYXNzTmFtZT1cIm14X1N0aWNrZXJzX2NvbnRlbnRQbGFjZWhvbGRlclwiPlxuICAgICAgICAgICAgICAgIDxwPntfdChcInN0aWNrZXJzfGVtcHR5XCIpfTwvcD5cbiAgICAgICAgICAgICAgICA8cCBjbGFzc05hbWU9XCJteF9TdGlja2Vyc19hZGRMaW5rXCI+e190KFwic3RpY2tlcnN8ZW1wdHlfYWRkX3Byb21wdFwiKX08L3A+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9e3JlcXVpcmUoXCIuLi8uLi8uLi8uLi9yZXMvaW1nL3N0aWNrZXJwYWNrLXBsYWNlaG9sZGVyLnBuZ1wiKX0gYWx0PVwiXCIgLz5cbiAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVycm9yU3RpY2tlcnBpY2tlckNvbnRlbnQoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPGRpdiBzdHlsZT17eyB0ZXh0QWxpZ246IFwiY2VudGVyXCIgfX0gY2xhc3NOYW1lPVwiZXJyb3JcIj5cbiAgICAgICAgICAgICAgICA8cD4ge3RoaXMuc3RhdGUuaW1FcnJvcn0gPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZW5kVmlzaWJpbGl0eVRvV2lkZ2V0KHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLnN0YXRlLnN0aWNrZXJwaWNrZXJXaWRnZXQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbWVzc2FnaW5nID0gV2lkZ2V0TWVzc2FnaW5nU3RvcmUuaW5zdGFuY2UuZ2V0TWVzc2FnaW5nRm9yVWlkKFxuICAgICAgICAgICAgV2lkZ2V0VXRpbHMuY2FsY1dpZGdldFVpZCh0aGlzLnN0YXRlLnN0aWNrZXJwaWNrZXJXaWRnZXQuaWQpLFxuICAgICAgICApO1xuICAgICAgICBpZiAobWVzc2FnaW5nICYmIHZpc2libGUgIT09IHRoaXMucHJldlNlbnRWaXNpYmlsaXR5KSB7XG4gICAgICAgICAgICBtZXNzYWdpbmcudXBkYXRlVmlzaWJpbGl0eSh2aXNpYmxlKS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFwiRXJyb3IgdXBkYXRpbmcgd2lkZ2V0IHZpc2liaWxpdHk6IFwiLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnByZXZTZW50VmlzaWJpbGl0eSA9IHZpc2libGU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0U3RpY2tlcnBpY2tlckNvbnRlbnQoKTogSlNYLkVsZW1lbnQge1xuICAgICAgICAvLyBIYW5kbGUgaW50ZWdyYXRpb24gbWFuYWdlciBlcnJvcnNcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaW1FcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZXJyb3JTdGlja2VycGlja2VyQ29udGVudCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RpY2tlcnNcbiAgICAgICAgLy8gVE9ETyAtIEFkZCBzdXBwb3J0IGZvciBTdGlja2VycGlja2VycyBmcm9tIG11bHRpcGxlIGFwcCBzdG9yZXMuXG4gICAgICAgIC8vIFJlbmRlciBjb250ZW50IGZyb20gbXVsdGlwbGUgc3RpY2tlcnBhY2sgc291cmNlcywgZWFjaCB3aXRoaW4gdGhlaXJcbiAgICAgICAgLy8gb3duIGlmcmFtZSwgd2l0aGluIHRoZSBzdGlja2VycGlja2VyIFVJIGVsZW1lbnQuXG4gICAgICAgIGNvbnN0IHN0aWNrZXJwaWNrZXJXaWRnZXQgPSB0aGlzLnN0YXRlLnN0aWNrZXJwaWNrZXJXaWRnZXQ7XG4gICAgICAgIGxldCBzdGlja2Vyc0NvbnRlbnQ6IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIFVzZSBhIHNlcGFyYXRlIFJlYWN0RE9NIHRyZWUgdG8gcmVuZGVyIHRoZSBBcHBUaWxlIHNlcGFyYXRlbHkgc28gdGhhdCBpdCBwZXJzaXN0cyBhbmQgZG9lc1xuICAgICAgICAvLyBub3QgdW5tb3VudCB3aGVuIHdlIChhKSBjbG9zZSB0aGUgc3RpY2tlciBwaWNrZXIgKGIpIHN3aXRjaCByb29tcy4gSXQncyBwcm9wZXJ0aWVzIGFyZSBzdGlsbFxuICAgICAgICAvLyB1cGRhdGVkLlxuXG4gICAgICAgIC8vIExvYWQgc3RpY2tlcnBhY2sgY29udGVudFxuICAgICAgICBpZiAoISFzdGlja2VycGlja2VyV2lkZ2V0Py5jb250ZW50Py51cmwpIHtcbiAgICAgICAgICAgIC8vIFNldCBkZWZhdWx0IG5hbWVcbiAgICAgICAgICAgIHN0aWNrZXJwaWNrZXJXaWRnZXQuY29udGVudC5uYW1lID0gc3RpY2tlcnBpY2tlcldpZGdldC5jb250ZW50Lm5hbWUgfHwgX3QoXCJjb21tb258c3RpY2tlcnBhY2tcIik7XG5cbiAgICAgICAgICAgIC8vIEZJWE1FOiBjb3VsZCB0aGlzIHVzZSB0aGUgc2FtZSBjb2RlIGFzIG90aGVyIGFwcHM/XG4gICAgICAgICAgICBjb25zdCBzdGlja2VyQXBwOiBJV2lkZ2V0ID0ge1xuICAgICAgICAgICAgICAgIGlkOiBzdGlja2VycGlja2VyV2lkZ2V0LmlkLFxuICAgICAgICAgICAgICAgIHVybDogc3RpY2tlcnBpY2tlcldpZGdldC5jb250ZW50LnVybCxcbiAgICAgICAgICAgICAgICBuYW1lOiBzdGlja2VycGlja2VyV2lkZ2V0LmNvbnRlbnQubmFtZSxcbiAgICAgICAgICAgICAgICB0eXBlOiBzdGlja2VycGlja2VyV2lkZ2V0LmNvbnRlbnQudHlwZSxcbiAgICAgICAgICAgICAgICBkYXRhOiBzdGlja2VycGlja2VyV2lkZ2V0LmNvbnRlbnQuZGF0YSxcbiAgICAgICAgICAgICAgICBjcmVhdG9yVXNlcklkOiBzdGlja2VycGlja2VyV2lkZ2V0LmNvbnRlbnQuY3JlYXRvclVzZXJJZCB8fCBzdGlja2VycGlja2VyV2lkZ2V0LnNlbmRlcixcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHN0aWNrZXJzQ29udGVudCA9IChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1N0aWNrZXJzX2NvbnRlbnRfY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic3RpY2tlcnNDb250ZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X1N0aWNrZXJzX2NvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9e3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3JkZXI6IFwibm9uZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5wb3BvdmVySGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLnBvcG92ZXJXaWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxQZXJzaXN0ZWRFbGVtZW50IHBlcnNpc3RLZXk9e1BFUlNJU1RFRF9FTEVNRU5UX0tFWX0gekluZGV4PXtTVElDS0VSUElDS0VSX1pfSU5ERVh9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBcHBUaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcD17c3RpY2tlckFwcH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbT17dGhpcy5wcm9wcy5yb29tfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRJZD17dGhpcy5wcm9wcy50aHJlYWRJZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbFdpZHRoPXt0cnVlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySWQ9e01hdHJpeENsaWVudFBlZy5zYWZlR2V0KCkuY3JlZGVudGlhbHMudXNlcklkIX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRvclVzZXJJZD17XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlja2VycGlja2VyV2lkZ2V0LnNlbmRlciB8fCBNYXRyaXhDbGllbnRQZWcuc2FmZUdldCgpLmNyZWRlbnRpYWxzLnVzZXJJZCFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0Rm9ySWZyYW1lTG9hZD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd01lbnViYXI9e3RydWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRWRpdENsaWNrPXt0aGlzLmxhdW5jaE1hbmFnZUludGVncmF0aW9uc31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZWxldGVDbGljaz17dGhpcy5yZW1vdmVTdGlja2VycGlja2VyV2lkZ2V0c31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1RpdGxlPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BvcG91dD17ZmFsc2V9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZU1pbmltaXNlUG9pbnRlckV2ZW50cz17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcldpZGdldD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0xheW91dEJ1dHRvbnM9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1BlcnNpc3RlZEVsZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIERlZmF1bHQgY29udGVudCB0byBzaG93IGlmIHN0aWNrZXJwaWNrZXIgd2lkZ2V0IG5vdCBhZGRlZFxuICAgICAgICAgICAgc3RpY2tlcnNDb250ZW50ID0gdGhpcy5kZWZhdWx0U3RpY2tlcnBpY2tlckNvbnRlbnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3RpY2tlcnNDb250ZW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgaXMgcmVzaXplZFxuICAgICAqL1xuICAgIHByaXZhdGUgb25SZXNpemUgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLmlzU3RpY2tlclBpY2tlck9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMucHJvcHMuc2V0U3RpY2tlclBpY2tlck9wZW4oZmFsc2UpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIFRoZSBzdGlja2VycyBwaWNrZXIgd2FzIGhpZGRlblxuICAgICAqL1xuICAgIHByaXZhdGUgb25GaW5pc2hlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMuaXNTdGlja2VyUGlja2VyT3Blbikge1xuICAgICAgICAgICAgdGhpcy5wcm9wcy5zZXRTdGlja2VyUGlja2VyT3BlbihmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqXG4gICAgICogTGF1bmNoIHRoZSBpbnRlZ3JhdGlvbiBtYW5hZ2VyIG9uIHRoZSBzdGlja2VycyBpbnRlZ3JhdGlvbiBwYWdlXG4gICAgICovXG4gICAgcHJpdmF0ZSBsYXVuY2hNYW5hZ2VJbnRlZ3JhdGlvbnMgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU0lnbm9yZWRQcm9taXNlRnJvbUNhbGxcbiAgICAgICAgSW50ZWdyYXRpb25NYW5hZ2Vycy5zaGFyZWRJbnN0YW5jZSgpXG4gICAgICAgICAgICA/LmdldFByaW1hcnlNYW5hZ2VyKClcbiAgICAgICAgICAgID8ub3Blbih0aGlzLnByb3BzLnJvb20sIGB0eXBlXyR7V2lkZ2V0VHlwZS5TVElDS0VSUElDS0VSLnByZWZlcnJlZH1gLCB0aGlzLnN0YXRlLndpZGdldElkID8/IHVuZGVmaW5lZCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgaWYgKCF0aGlzLnByb3BzLmlzU3RpY2tlclBpY2tlck9wZW4pIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8Q29udGV4dE1lbnVcbiAgICAgICAgICAgICAgICBjaGV2cm9uRmFjZT17Q2hldnJvbkZhY2UuQm90dG9tfVxuICAgICAgICAgICAgICAgIG1lbnVXaWR0aD17dGhpcy5wb3BvdmVyV2lkdGh9XG4gICAgICAgICAgICAgICAgbWVudUhlaWdodD17dGhpcy5wb3BvdmVySGVpZ2h0fVxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICBtZW51UGFkZGluZ1RvcD17MH1cbiAgICAgICAgICAgICAgICBtZW51UGFkZGluZ0xlZnQ9ezB9XG4gICAgICAgICAgICAgICAgbWVudVBhZGRpbmdSaWdodD17MH1cbiAgICAgICAgICAgICAgICB6SW5kZXg9e1NUSUNLRVJQSUNLRVJfWl9JTkRFWH1cbiAgICAgICAgICAgICAgICBtb3VudEFzQ2hpbGQ9e3RydWV9XG4gICAgICAgICAgICAgICAgey4uLnRoaXMucHJvcHMubWVudVBvc2l0aW9ufVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxHZW5lcmljRWxlbWVudENvbnRleHRNZW51IGVsZW1lbnQ9e3RoaXMuZ2V0U3RpY2tlcnBpY2tlckNvbnRlbnQoKX0gb25SZXNpemU9e3RoaXMub25GaW5pc2hlZH0gLz5cbiAgICAgICAgICAgIDwvQ29udGV4dE1lbnU+XG4gICAgICAgICk7XG4gICAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFPQSxJQUFBQSxNQUFBLEdBQUFDLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFDQSxJQUFBRSxPQUFBLEdBQUFGLE9BQUE7QUFHQSxJQUFBRyxnQkFBQSxHQUFBSCxPQUFBO0FBQ0EsSUFBQUksUUFBQSxHQUFBTCxzQkFBQSxDQUFB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