UNPKG

matrix-react-sdk

Version:
191 lines (189 loc) 40.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.RoomGeneralContextMenu = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _logger = require("matrix-js-sdk/src/logger"); var _react = _interopRequireWildcard(require("react")); var _KeyboardShortcuts = require("../../../accessibility/KeyboardShortcuts"); var _RoomListActions = _interopRequireDefault(require("../../../actions/RoomListActions")); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _useUnreadNotifications = require("../../../hooks/useUnreadNotifications"); var _KeyBindingsManager = require("../../../KeyBindingsManager"); var _languageHandler = require("../../../languageHandler"); var _NotificationLevel = require("../../../stores/notifications/NotificationLevel"); var _models = require("../../../stores/room-list/models"); var _RoomListStore = _interopRequireWildcard(require("../../../stores/room-list/RoomListStore")); var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap")); var _notifications = require("../../../utils/notifications"); var _IconizedContextMenu = _interopRequireWildcard(require("../context_menus/IconizedContextMenu")); var _UIComponents = require("../../../customisations/helpers/UIComponents"); var _UIFeature = require("../../../settings/UIFeature"); var _DeveloperToolsOption = require("./DeveloperToolsOption"); var _useSettings = require("../../../hooks/useSettings"); const _excluded = ["room", "onFinished", "onPostFavoriteClick", "onPostLowPriorityClick", "onPostInviteClick", "onPostCopyLinkClick", "onPostSettingsClick", "onPostLeaveClick", "onPostForgetClick", "onPostMarkAsReadClick", "onPostMarkAsUnreadClick"]; /* Copyright 2024 New Vector Ltd. Copyright 2021-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. */ 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; } /** * Room context menu accessible via the room list. */ const RoomGeneralContextMenu = _ref => { let { room, onFinished, onPostFavoriteClick, onPostLowPriorityClick, onPostInviteClick, onPostCopyLinkClick, onPostSettingsClick, onPostLeaveClick, onPostForgetClick, onPostMarkAsReadClick, onPostMarkAsUnreadClick } = _ref, props = (0, _objectWithoutProperties2.default)(_ref, _excluded); const cli = (0, _react.useContext)(_MatrixClientContext.default); const roomTags = (0, _useEventEmitter.useEventEmitterState)(_RoomListStore.default.instance, _RoomListStore.LISTS_UPDATE_EVENT, () => _RoomListStore.default.instance.getTagsForRoom(room)); const isDm = _DMRoomMap.default.shared().getUserIdForRoomId(room.roomId); const wrapHandler = (handler, postHandler, persistent = false) => { return ev => { ev.preventDefault(); ev.stopPropagation(); handler(ev); const action = (0, _KeyBindingsManager.getKeyBindingsManager)().getAccessibilityAction(ev); if (!persistent || action === _KeyboardShortcuts.KeyBindingAction.Enter) { onFinished(); } postHandler?.(ev); }; }; const onTagRoom = (ev, tagId) => { if (!cli) return; if (tagId === _models.DefaultTagID.Favourite || tagId === _models.DefaultTagID.LowPriority) { const inverseTag = tagId === _models.DefaultTagID.Favourite ? _models.DefaultTagID.LowPriority : _models.DefaultTagID.Favourite; const isApplied = _RoomListStore.default.instance.getTagsForRoom(room).includes(tagId); const removeTag = isApplied ? tagId : inverseTag; const addTag = isApplied ? null : tagId; _dispatcher.default.dispatch(_RoomListActions.default.tagRoom(cli, room, removeTag, addTag, 0)); } else { _logger.logger.warn(`Unexpected tag ${tagId} applied to ${room.roomId}`); } }; const isFavorite = roomTags.includes(_models.DefaultTagID.Favourite); const favoriteOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuCheckbox, { onClick: wrapHandler(ev => onTagRoom(ev, _models.DefaultTagID.Favourite), onPostFavoriteClick, true), active: isFavorite, label: isFavorite ? (0, _languageHandler._t)("room|context_menu|unfavourite") : (0, _languageHandler._t)("room|context_menu|favourite"), iconClassName: "mx_RoomGeneralContextMenu_iconStar" }); const isLowPriority = roomTags.includes(_models.DefaultTagID.LowPriority); const lowPriorityOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuCheckbox, { onClick: wrapHandler(ev => onTagRoom(ev, _models.DefaultTagID.LowPriority), onPostLowPriorityClick, true), active: isLowPriority, label: (0, _languageHandler._t)("room|context_menu|low_priority"), iconClassName: "mx_RoomGeneralContextMenu_iconArrowDown" }); let inviteOption = null; if (room.canInvite(cli.getUserId()) && !isDm && (0, _UIComponents.shouldShowComponent)(_UIFeature.UIComponent.InviteUsers)) { inviteOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => _dispatcher.default.dispatch({ action: "view_invite", roomId: room.roomId }), onPostInviteClick), label: (0, _languageHandler._t)("action|invite"), iconClassName: "mx_RoomGeneralContextMenu_iconInvite" }); } let copyLinkOption = null; if (!isDm) { copyLinkOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => _dispatcher.default.dispatch({ action: "copy_room", room_id: room.roomId }), onPostCopyLinkClick), label: (0, _languageHandler._t)("room|context_menu|copy_link"), iconClassName: "mx_RoomGeneralContextMenu_iconCopyLink" }); } const settingsOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => _dispatcher.default.dispatch({ action: "open_room_settings", room_id: room.roomId }), onPostSettingsClick), label: (0, _languageHandler._t)("common|settings"), iconClassName: "mx_RoomGeneralContextMenu_iconSettings" }); let leaveOption; if (roomTags.includes(_models.DefaultTagID.Archived)) { leaveOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { iconClassName: "mx_RoomGeneralContextMenu_iconSignOut", label: (0, _languageHandler._t)("room|context_menu|forget"), className: "mx_IconizedContextMenu_option_red", onClick: wrapHandler(() => _dispatcher.default.dispatch({ action: "forget_room", room_id: room.roomId }), onPostForgetClick) }); } else { leaveOption = /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => _dispatcher.default.dispatch({ action: "leave_room", room_id: room.roomId }), onPostLeaveClick), label: (0, _languageHandler._t)("action|leave"), className: "mx_IconizedContextMenu_option_red", iconClassName: "mx_RoomGeneralContextMenu_iconSignOut" }); } const { level } = (0, _useUnreadNotifications.useUnreadNotifications)(room); const markAsReadOption = (() => { if (level > _NotificationLevel.NotificationLevel.None) { return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => { (0, _notifications.clearRoomNotification)(room, cli); onFinished?.(); }, onPostMarkAsReadClick), label: (0, _languageHandler._t)("room|context_menu|mark_read"), iconClassName: "mx_RoomGeneralContextMenu_iconMarkAsRead" }); } else if (!roomTags.includes(_models.DefaultTagID.Archived)) { return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOption, { onClick: wrapHandler(() => { (0, _notifications.setMarkedUnreadState)(room, cli, true); onFinished?.(); }, onPostMarkAsUnreadClick), label: (0, _languageHandler._t)("room|context_menu|mark_unread"), iconClassName: "mx_RoomGeneralContextMenu_iconMarkAsUnread" }); } else { return null; } })(); const developerModeEnabled = (0, _useSettings.useSettingValue)("developerMode"); const developerToolsOption = developerModeEnabled ? /*#__PURE__*/_react.default.createElement(_DeveloperToolsOption.DeveloperToolsOption, { onFinished: onFinished, roomId: room.roomId }) : null; return /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.default, (0, _extends2.default)({}, props, { onFinished: onFinished, className: "mx_RoomGeneralContextMenu", compact: true }), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, null, markAsReadOption, !roomTags.includes(_models.DefaultTagID.Archived) && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, favoriteOption, lowPriorityOption, inviteOption, copyLinkOption, settingsOption), developerToolsOption), /*#__PURE__*/_react.default.createElement(_IconizedContextMenu.IconizedContextMenuOptionList, { red: true }, leaveOption)); }; exports.RoomGeneralContextMenu = RoomGeneralContextMenu; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9yZWFjdCIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX0tleWJvYXJkU2hvcnRjdXRzIiwiX1Jvb21MaXN0QWN0aW9ucyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfTWF0cml4Q2xpZW50Q29udGV4dCIsIl9kaXNwYXRjaGVyIiwiX3VzZUV2ZW50RW1pdHRlciIsIl91c2VVbnJlYWROb3RpZmljYXRpb25zIiwiX0tleUJpbmRpbmdzTWFuYWdlciIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfTm90aWZpY2F0aW9uTGV2ZWwiLCJfbW9kZWxzIiwiX1Jvb21MaXN0U3RvcmUiLCJfRE1Sb29tTWFwIiwiX25vdGlmaWNhdGlvbnMiLCJfSWNvbml6ZWRDb250ZXh0TWVudSIsIl9VSUNvbXBvbmVudHMiLCJfVUlGZWF0dXJlIiwiX0RldmVsb3BlclRvb2xzT3B0aW9uIiwiX3VzZVNldHRpbmdzIiwiX2V4Y2x1ZGVkIiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiUm9vbUdlbmVyYWxDb250ZXh0TWVudSIsIl9yZWYiLCJyb29tIiwib25GaW5pc2hlZCIsIm9uUG9zdEZhdm9yaXRlQ2xpY2siLCJvblBvc3RMb3dQcmlvcml0eUNsaWNrIiwib25Qb3N0SW52aXRlQ2xpY2siLCJvblBvc3RDb3B5TGlua0NsaWNrIiwib25Qb3N0U2V0dGluZ3NDbGljayIsIm9uUG9zdExlYXZlQ2xpY2siLCJvblBvc3RGb3JnZXRDbGljayIsIm9uUG9zdE1hcmtBc1JlYWRDbGljayIsIm9uUG9zdE1hcmtBc1VucmVhZENsaWNrIiwicHJvcHMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXMyIiwiY2xpIiwidXNlQ29udGV4dCIsIk1hdHJpeENsaWVudENvbnRleHQiLCJyb29tVGFncyIsInVzZUV2ZW50RW1pdHRlclN0YXRlIiwiUm9vbUxpc3RTdG9yZSIsImluc3RhbmNlIiwiTElTVFNfVVBEQVRFX0VWRU5UIiwiZ2V0VGFnc0ZvclJvb20iLCJpc0RtIiwiRE1Sb29tTWFwIiwic2hhcmVkIiwiZ2V0VXNlcklkRm9yUm9vbUlkIiwicm9vbUlkIiwid3JhcEhhbmRsZXIiLCJoYW5kbGVyIiwicG9zdEhhbmRsZXIiLCJwZXJzaXN0ZW50IiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsImFjdGlvbiIsImdldEtleUJpbmRpbmdzTWFuYWdlciIsImdldEFjY2Vzc2liaWxpdHlBY3Rpb24iLCJLZXlCaW5kaW5nQWN0aW9uIiwiRW50ZXIiLCJvblRhZ1Jvb20iLCJ0YWdJZCIsIkRlZmF1bHRUYWdJRCIsIkZhdm91cml0ZSIsIkxvd1ByaW9yaXR5IiwiaW52ZXJzZVRhZyIsImlzQXBwbGllZCIsImluY2x1ZGVzIiwicmVtb3ZlVGFnIiwiYWRkVGFnIiwiZGlzIiwiZGlzcGF0Y2giLCJSb29tTGlzdEFjdGlvbnMiLCJ0YWdSb29tIiwibG9nZ2VyIiwid2FybiIsImlzRmF2b3JpdGUiLCJmYXZvcml0ZU9wdGlvbiIsImNyZWF0ZUVsZW1lbnQiLCJJY29uaXplZENvbnRleHRNZW51Q2hlY2tib3giLCJvbkNsaWNrIiwiYWN0aXZlIiwibGFiZWwiLCJfdCIsImljb25DbGFzc05hbWUiLCJpc0xvd1ByaW9yaXR5IiwibG93UHJpb3JpdHlPcHRpb24iLCJpbnZpdGVPcHRpb24iLCJjYW5JbnZpdGUiLCJnZXRVc2VySWQiLCJzaG91bGRTaG93Q29tcG9uZW50IiwiVUlDb21wb25lbnQiLCJJbnZpdGVVc2VycyIsIkljb25pemVkQ29udGV4dE1lbnVPcHRpb24iLCJjb3B5TGlua09wdGlvbiIsInJvb21faWQiLCJzZXR0aW5nc09wdGlvbiIsImxlYXZlT3B0aW9uIiwiQXJjaGl2ZWQiLCJjbGFzc05hbWUiLCJsZXZlbCIsInVzZVVucmVhZE5vdGlmaWNhdGlvbnMiLCJtYXJrQXNSZWFkT3B0aW9uIiwiTm90aWZpY2F0aW9uTGV2ZWwiLCJOb25lIiwiY2xlYXJSb29tTm90aWZpY2F0aW9uIiwic2V0TWFya2VkVW5yZWFkU3RhdGUiLCJkZXZlbG9wZXJNb2RlRW5hYmxlZCIsInVzZVNldHRpbmdWYWx1ZSIsImRldmVsb3BlclRvb2xzT3B0aW9uIiwiRGV2ZWxvcGVyVG9vbHNPcHRpb24iLCJfZXh0ZW5kczIiLCJjb21wYWN0IiwiSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QiLCJGcmFnbWVudCIsInJlZCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9jb250ZXh0X21lbnVzL1Jvb21HZW5lcmFsQ29udGV4dE1lbnUudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxLTIwMjMgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCBSZWFjdCwgeyB1c2VDb250ZXh0IH0gZnJvbSBcInJlYWN0XCI7XG5cbmltcG9ydCB7IEtleUJpbmRpbmdBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vYWNjZXNzaWJpbGl0eS9LZXlib2FyZFNob3J0Y3V0c1wiO1xuaW1wb3J0IFJvb21MaXN0QWN0aW9ucyBmcm9tIFwiLi4vLi4vLi4vYWN0aW9ucy9Sb29tTGlzdEFjdGlvbnNcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgZGlzIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IHVzZUV2ZW50RW1pdHRlclN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUV2ZW50RW1pdHRlclwiO1xuaW1wb3J0IHsgdXNlVW5yZWFkTm90aWZpY2F0aW9ucyB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VVbnJlYWROb3RpZmljYXRpb25zXCI7XG5pbXBvcnQgeyBnZXRLZXlCaW5kaW5nc01hbmFnZXIgfSBmcm9tIFwiLi4vLi4vLi4vS2V5QmluZGluZ3NNYW5hZ2VyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkxldmVsIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9ub3RpZmljYXRpb25zL05vdGlmaWNhdGlvbkxldmVsXCI7XG5pbXBvcnQgeyBEZWZhdWx0VGFnSUQsIFRhZ0lEIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9yb29tLWxpc3QvbW9kZWxzXCI7XG5pbXBvcnQgUm9vbUxpc3RTdG9yZSwgeyBMSVNUU19VUERBVEVfRVZFTlQgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3Jvb20tbGlzdC9Sb29tTGlzdFN0b3JlXCI7XG5pbXBvcnQgRE1Sb29tTWFwIGZyb20gXCIuLi8uLi8uLi91dGlscy9ETVJvb21NYXBcIjtcbmltcG9ydCB7IGNsZWFyUm9vbU5vdGlmaWNhdGlvbiwgc2V0TWFya2VkVW5yZWFkU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvbm90aWZpY2F0aW9uc1wiO1xuaW1wb3J0IHsgSVByb3BzIGFzIElDb250ZXh0TWVudVByb3BzIH0gZnJvbSBcIi4uLy4uL3N0cnVjdHVyZXMvQ29udGV4dE1lbnVcIjtcbmltcG9ydCBJY29uaXplZENvbnRleHRNZW51LCB7XG4gICAgSWNvbml6ZWRDb250ZXh0TWVudUNoZWNrYm94LFxuICAgIEljb25pemVkQ29udGV4dE1lbnVPcHRpb24sXG4gICAgSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QsXG59IGZyb20gXCIuLi9jb250ZXh0X21lbnVzL0ljb25pemVkQ29udGV4dE1lbnVcIjtcbmltcG9ydCB7IEJ1dHRvbkV2ZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCB7IHNob3VsZFNob3dDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvaGVscGVycy9VSUNvbXBvbmVudHNcIjtcbmltcG9ydCB7IFVJQ29tcG9uZW50IH0gZnJvbSBcIi4uLy4uLy4uL3NldHRpbmdzL1VJRmVhdHVyZVwiO1xuaW1wb3J0IHsgRGV2ZWxvcGVyVG9vbHNPcHRpb24gfSBmcm9tIFwiLi9EZXZlbG9wZXJUb29sc09wdGlvblwiO1xuaW1wb3J0IHsgdXNlU2V0dGluZ1ZhbHVlIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZVNldHRpbmdzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUm9vbUdlbmVyYWxDb250ZXh0TWVudVByb3BzIGV4dGVuZHMgSUNvbnRleHRNZW51UHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlICdmYXZvdXJpdGUnIG9wdGlvbiBpcyBzZWxlY3RlZCwgYWZ0ZXIgdGhlIG1lbnUgaGFzIHByb2Nlc3NlZFxuICAgICAqIHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgb25Qb3N0RmF2b3JpdGVDbGljaz86IChldmVudDogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlICdsb3cgcHJpb3JpdHknIG9wdGlvbiBpcyBzZWxlY3RlZCwgYWZ0ZXIgdGhlIG1lbnUgaGFzIHByb2Nlc3NlZFxuICAgICAqIHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgb25Qb3N0TG93UHJpb3JpdHlDbGljaz86IChldmVudDogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlICdpbnZpdGUnIG9wdGlvbiBpcyBzZWxlY3RlZCwgYWZ0ZXIgdGhlIG1lbnUgaGFzIHByb2Nlc3NlZFxuICAgICAqIHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgb25Qb3N0SW52aXRlQ2xpY2s/OiAoZXZlbnQ6IEJ1dHRvbkV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSAnY29weSBsaW5rJyBvcHRpb24gaXMgc2VsZWN0ZWQsIGFmdGVyIHRoZSBtZW51IGhhcyBwcm9jZXNzZWRcbiAgICAgKiB0aGUgbW91c2Ugb3Iga2V5Ym9hcmQgZXZlbnQuXG4gICAgICogQHBhcmFtIGV2ZW50IFRoZSBldmVudCB0aGF0IGNhdXNlZCB0aGUgb3B0aW9uIHRvIGJlIHNlbGVjdGVkLlxuICAgICAqL1xuICAgIG9uUG9zdENvcHlMaW5rQ2xpY2s/OiAoZXZlbnQ6IEJ1dHRvbkV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSAnc2V0dGluZ3MnIG9wdGlvbiBpcyBzZWxlY3RlZCwgYWZ0ZXIgdGhlIG1lbnUgaGFzIHByb2Nlc3NlZFxuICAgICAqIHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgb25Qb3N0U2V0dGluZ3NDbGljaz86IChldmVudDogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlICdmb3JnZXQgcm9vbScgb3B0aW9uIGlzIHNlbGVjdGVkLCBhZnRlciB0aGUgbWVudSBoYXMgcHJvY2Vzc2VkXG4gICAgICogdGhlIG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50LlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIG9wdGlvbiB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBvblBvc3RGb3JnZXRDbGljaz86IChldmVudDogQnV0dG9uRXZlbnQpID0+IHZvaWQ7XG4gICAgLyoqXG4gICAgICogQ2FsbGVkIHdoZW4gdGhlICdsZWF2ZScgb3B0aW9uIGlzIHNlbGVjdGVkLCBhZnRlciB0aGUgbWVudSBoYXMgcHJvY2Vzc2VkXG4gICAgICogdGhlIG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50LlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIG9wdGlvbiB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBvblBvc3RMZWF2ZUNsaWNrPzogKGV2ZW50OiBCdXR0b25FdmVudCkgPT4gdm9pZDtcbiAgICAvKipcbiAgICAgKiBDYWxsZWQgd2hlbiB0aGUgJ21hcmsgYXMgcmVhZCcgb3B0aW9uIGlzIHNlbGVjdGVkLCBhZnRlciB0aGUgbWVudSBoYXMgcHJvY2Vzc2VkXG4gICAgICogdGhlIG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50LlxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCBjYXVzZWQgdGhlIG9wdGlvbiB0byBiZSBzZWxlY3RlZC5cbiAgICAgKi9cbiAgICBvblBvc3RNYXJrQXNSZWFkQ2xpY2s/OiAoZXZlbnQ6IEJ1dHRvbkV2ZW50KSA9PiB2b2lkO1xuICAgIC8qKlxuICAgICAqIENhbGxlZCB3aGVuIHRoZSAnbWFyayBhcyB1bnJlYWQnIG9wdGlvbiBpcyBzZWxlY3RlZCwgYWZ0ZXIgdGhlIG1lbnUgaGFzIHByb2Nlc3NlZFxuICAgICAqIHRoZSBtb3VzZSBvciBrZXlib2FyZCBldmVudC5cbiAgICAgKiBAcGFyYW0gZXZlbnQgVGhlIGV2ZW50IHRoYXQgY2F1c2VkIHRoZSBvcHRpb24gdG8gYmUgc2VsZWN0ZWQuXG4gICAgICovXG4gICAgb25Qb3N0TWFya0FzVW5yZWFkQ2xpY2s/OiAoZXZlbnQ6IEJ1dHRvbkV2ZW50KSA9PiB2b2lkO1xufVxuXG4vKipcbiAqIFJvb20gY29udGV4dCBtZW51IGFjY2Vzc2libGUgdmlhIHRoZSByb29tIGxpc3QuXG4gKi9cbmV4cG9ydCBjb25zdCBSb29tR2VuZXJhbENvbnRleHRNZW51OiBSZWFjdC5GQzxSb29tR2VuZXJhbENvbnRleHRNZW51UHJvcHM+ID0gKHtcbiAgICByb29tLFxuICAgIG9uRmluaXNoZWQsXG4gICAgb25Qb3N0RmF2b3JpdGVDbGljayxcbiAgICBvblBvc3RMb3dQcmlvcml0eUNsaWNrLFxuICAgIG9uUG9zdEludml0ZUNsaWNrLFxuICAgIG9uUG9zdENvcHlMaW5rQ2xpY2ssXG4gICAgb25Qb3N0U2V0dGluZ3NDbGljayxcbiAgICBvblBvc3RMZWF2ZUNsaWNrLFxuICAgIG9uUG9zdEZvcmdldENsaWNrLFxuICAgIG9uUG9zdE1hcmtBc1JlYWRDbGljayxcbiAgICBvblBvc3RNYXJrQXNVbnJlYWRDbGljayxcbiAgICAuLi5wcm9wc1xufSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3Qgcm9vbVRhZ3MgPSB1c2VFdmVudEVtaXR0ZXJTdGF0ZShSb29tTGlzdFN0b3JlLmluc3RhbmNlLCBMSVNUU19VUERBVEVfRVZFTlQsICgpID0+XG4gICAgICAgIFJvb21MaXN0U3RvcmUuaW5zdGFuY2UuZ2V0VGFnc0ZvclJvb20ocm9vbSksXG4gICAgKTtcbiAgICBjb25zdCBpc0RtID0gRE1Sb29tTWFwLnNoYXJlZCgpLmdldFVzZXJJZEZvclJvb21JZChyb29tLnJvb21JZCk7XG4gICAgY29uc3Qgd3JhcEhhbmRsZXIgPSAoXG4gICAgICAgIGhhbmRsZXI6IChldjogQnV0dG9uRXZlbnQpID0+IHZvaWQsXG4gICAgICAgIHBvc3RIYW5kbGVyPzogKGV2OiBCdXR0b25FdmVudCkgPT4gdm9pZCxcbiAgICAgICAgcGVyc2lzdGVudCA9IGZhbHNlLFxuICAgICk6ICgoZXY6IEJ1dHRvbkV2ZW50KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIHJldHVybiAoZXY6IEJ1dHRvbkV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGhhbmRsZXIoZXYpO1xuXG4gICAgICAgICAgICBjb25zdCBhY3Rpb24gPSBnZXRLZXlCaW5kaW5nc01hbmFnZXIoKS5nZXRBY2Nlc3NpYmlsaXR5QWN0aW9uKGV2IGFzIFJlYWN0LktleWJvYXJkRXZlbnQpO1xuICAgICAgICAgICAgaWYgKCFwZXJzaXN0ZW50IHx8IGFjdGlvbiA9PT0gS2V5QmluZGluZ0FjdGlvbi5FbnRlcikge1xuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHBvc3RIYW5kbGVyPy4oZXYpO1xuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBvblRhZ1Jvb20gPSAoZXY6IEJ1dHRvbkV2ZW50LCB0YWdJZDogVGFnSUQpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFjbGkpIHJldHVybjtcbiAgICAgICAgaWYgKHRhZ0lkID09PSBEZWZhdWx0VGFnSUQuRmF2b3VyaXRlIHx8IHRhZ0lkID09PSBEZWZhdWx0VGFnSUQuTG93UHJpb3JpdHkpIHtcbiAgICAgICAgICAgIGNvbnN0IGludmVyc2VUYWcgPSB0YWdJZCA9PT0gRGVmYXVsdFRhZ0lELkZhdm91cml0ZSA/IERlZmF1bHRUYWdJRC5Mb3dQcmlvcml0eSA6IERlZmF1bHRUYWdJRC5GYXZvdXJpdGU7XG4gICAgICAgICAgICBjb25zdCBpc0FwcGxpZWQgPSBSb29tTGlzdFN0b3JlLmluc3RhbmNlLmdldFRhZ3NGb3JSb29tKHJvb20pLmluY2x1ZGVzKHRhZ0lkKTtcbiAgICAgICAgICAgIGNvbnN0IHJlbW92ZVRhZyA9IGlzQXBwbGllZCA/IHRhZ0lkIDogaW52ZXJzZVRhZztcbiAgICAgICAgICAgIGNvbnN0IGFkZFRhZyA9IGlzQXBwbGllZCA/IG51bGwgOiB0YWdJZDtcbiAgICAgICAgICAgIGRpcy5kaXNwYXRjaChSb29tTGlzdEFjdGlvbnMudGFnUm9vbShjbGksIHJvb20sIHJlbW92ZVRhZywgYWRkVGFnLCAwKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgVW5leHBlY3RlZCB0YWcgJHt0YWdJZH0gYXBwbGllZCB0byAke3Jvb20ucm9vbUlkfWApO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGlzRmF2b3JpdGUgPSByb29tVGFncy5pbmNsdWRlcyhEZWZhdWx0VGFnSUQuRmF2b3VyaXRlKTtcbiAgICBjb25zdCBmYXZvcml0ZU9wdGlvbjogSlNYLkVsZW1lbnQgPSAoXG4gICAgICAgIDxJY29uaXplZENvbnRleHRNZW51Q2hlY2tib3hcbiAgICAgICAgICAgIG9uQ2xpY2s9e3dyYXBIYW5kbGVyKChldikgPT4gb25UYWdSb29tKGV2LCBEZWZhdWx0VGFnSUQuRmF2b3VyaXRlKSwgb25Qb3N0RmF2b3JpdGVDbGljaywgdHJ1ZSl9XG4gICAgICAgICAgICBhY3RpdmU9e2lzRmF2b3JpdGV9XG4gICAgICAgICAgICBsYWJlbD17aXNGYXZvcml0ZSA/IF90KFwicm9vbXxjb250ZXh0X21lbnV8dW5mYXZvdXJpdGVcIikgOiBfdChcInJvb218Y29udGV4dF9tZW51fGZhdm91cml0ZVwiKX1cbiAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tR2VuZXJhbENvbnRleHRNZW51X2ljb25TdGFyXCJcbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgY29uc3QgaXNMb3dQcmlvcml0eSA9IHJvb21UYWdzLmluY2x1ZGVzKERlZmF1bHRUYWdJRC5Mb3dQcmlvcml0eSk7XG4gICAgY29uc3QgbG93UHJpb3JpdHlPcHRpb246IEpTWC5FbGVtZW50ID0gKFxuICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudUNoZWNrYm94XG4gICAgICAgICAgICBvbkNsaWNrPXt3cmFwSGFuZGxlcigoZXYpID0+IG9uVGFnUm9vbShldiwgRGVmYXVsdFRhZ0lELkxvd1ByaW9yaXR5KSwgb25Qb3N0TG93UHJpb3JpdHlDbGljaywgdHJ1ZSl9XG4gICAgICAgICAgICBhY3RpdmU9e2lzTG93UHJpb3JpdHl9XG4gICAgICAgICAgICBsYWJlbD17X3QoXCJyb29tfGNvbnRleHRfbWVudXxsb3dfcHJpb3JpdHlcIil9XG4gICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUdlbmVyYWxDb250ZXh0TWVudV9pY29uQXJyb3dEb3duXCJcbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgbGV0IGludml0ZU9wdGlvbjogSlNYLkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBpZiAocm9vbS5jYW5JbnZpdGUoY2xpLmdldFVzZXJJZCgpISkgJiYgIWlzRG0gJiYgc2hvdWxkU2hvd0NvbXBvbmVudChVSUNvbXBvbmVudC5JbnZpdGVVc2VycykpIHtcbiAgICAgICAgaW52aXRlT3B0aW9uID0gKFxuICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXt3cmFwSGFuZGxlcihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcInZpZXdfaW52aXRlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbUlkOiByb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBvblBvc3RJbnZpdGVDbGljayxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxpbnZpdGVcIil9XG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVfaWNvbkludml0ZVwiXG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGxldCBjb3B5TGlua09wdGlvbjogSlNYLkVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBpZiAoIWlzRG0pIHtcbiAgICAgICAgY29weUxpbmtPcHRpb24gPSAoXG4gICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvblxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3dyYXBIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwiY29weV9yb29tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogcm9vbS5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgb25Qb3N0Q29weUxpbmtDbGljayxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInJvb218Y29udGV4dF9tZW51fGNvcHlfbGlua1wiKX1cbiAgICAgICAgICAgICAgICBpY29uQ2xhc3NOYW1lPVwibXhfUm9vbUdlbmVyYWxDb250ZXh0TWVudV9pY29uQ29weUxpbmtcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXR0aW5nc09wdGlvbjogSlNYLkVsZW1lbnQgPSAoXG4gICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICBvbkNsaWNrPXt3cmFwSGFuZGxlcihcbiAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiBcIm9wZW5fcm9vbV9zZXR0aW5nc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogcm9vbS5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG9uUG9zdFNldHRpbmdzQ2xpY2ssXG4gICAgICAgICAgICApfVxuICAgICAgICAgICAgbGFiZWw9e190KFwiY29tbW9ufHNldHRpbmdzXCIpfVxuICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVfaWNvblNldHRpbmdzXCJcbiAgICAgICAgLz5cbiAgICApO1xuXG4gICAgbGV0IGxlYXZlT3B0aW9uOiBKU1guRWxlbWVudDtcbiAgICBpZiAocm9vbVRhZ3MuaW5jbHVkZXMoRGVmYXVsdFRhZ0lELkFyY2hpdmVkKSkge1xuICAgICAgICBsZWF2ZU9wdGlvbiA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVfaWNvblNpZ25PdXRcIlxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInJvb218Y29udGV4dF9tZW51fGZvcmdldFwiKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9JY29uaXplZENvbnRleHRNZW51X29wdGlvbl9yZWRcIlxuICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3dyYXBIYW5kbGVyKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzLmRpc3BhdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IFwiZm9yZ2V0X3Jvb21cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb29tX2lkOiByb29tLnJvb21JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBvblBvc3RGb3JnZXRDbGljayxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZWF2ZU9wdGlvbiA9IChcbiAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgb25DbGljaz17d3JhcEhhbmRsZXIoXG4gICAgICAgICAgICAgICAgICAgICgpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXMuZGlzcGF0Y2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogXCJsZWF2ZV9yb29tXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vbV9pZDogcm9vbS5yb29tSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgb25Qb3N0TGVhdmVDbGljayxcbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxsZWF2ZVwiKX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9JY29uaXplZENvbnRleHRNZW51X29wdGlvbl9yZWRcIlxuICAgICAgICAgICAgICAgIGljb25DbGFzc05hbWU9XCJteF9Sb29tR2VuZXJhbENvbnRleHRNZW51X2ljb25TaWduT3V0XCJcbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBsZXZlbCB9ID0gdXNlVW5yZWFkTm90aWZpY2F0aW9ucyhyb29tKTtcbiAgICBjb25zdCBtYXJrQXNSZWFkT3B0aW9uOiBKU1guRWxlbWVudCB8IG51bGwgPSAoKCkgPT4ge1xuICAgICAgICBpZiAobGV2ZWwgPiBOb3RpZmljYXRpb25MZXZlbC5Ob25lKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3dyYXBIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyUm9vbU5vdGlmaWNhdGlvbihyb29tLCBjbGkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb25GaW5pc2hlZD8uKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIG9uUG9zdE1hcmtBc1JlYWRDbGljayl9XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInJvb218Y29udGV4dF9tZW51fG1hcmtfcmVhZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVfaWNvbk1hcmtBc1JlYWRcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2UgaWYgKCFyb29tVGFncy5pbmNsdWRlcyhEZWZhdWx0VGFnSUQuQXJjaGl2ZWQpKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxJY29uaXplZENvbnRleHRNZW51T3B0aW9uXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3dyYXBIYW5kbGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldE1hcmtlZFVucmVhZFN0YXRlKHJvb20sIGNsaSwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkZpbmlzaGVkPy4oKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgb25Qb3N0TWFya0FzVW5yZWFkQ2xpY2spfVxuICAgICAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJyb29tfGNvbnRleHRfbWVudXxtYXJrX3VucmVhZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgaWNvbkNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVfaWNvbk1hcmtBc1VucmVhZFwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBjb25zdCBkZXZlbG9wZXJNb2RlRW5hYmxlZCA9IHVzZVNldHRpbmdWYWx1ZTxib29sZWFuPihcImRldmVsb3Blck1vZGVcIik7XG4gICAgY29uc3QgZGV2ZWxvcGVyVG9vbHNPcHRpb24gPSBkZXZlbG9wZXJNb2RlRW5hYmxlZCA/IChcbiAgICAgICAgPERldmVsb3BlclRvb2xzT3B0aW9uIG9uRmluaXNoZWQ9e29uRmluaXNoZWR9IHJvb21JZD17cm9vbS5yb29tSWR9IC8+XG4gICAgKSA6IG51bGw7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudSB7Li4ucHJvcHN9IG9uRmluaXNoZWQ9e29uRmluaXNoZWR9IGNsYXNzTmFtZT1cIm14X1Jvb21HZW5lcmFsQ29udGV4dE1lbnVcIiBjb21wYWN0PlxuICAgICAgICAgICAgPEljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICAgICAgICAgIHttYXJrQXNSZWFkT3B0aW9ufVxuICAgICAgICAgICAgICAgIHshcm9vbVRhZ3MuaW5jbHVkZXMoRGVmYXVsdFRhZ0lELkFyY2hpdmVkKSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICB7ZmF2b3JpdGVPcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICB7bG93UHJpb3JpdHlPcHRpb259XG4gICAgICAgICAgICAgICAgICAgICAgICB7aW52aXRlT3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAge2NvcHlMaW5rT3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICAgICAge3NldHRpbmdzT3B0aW9ufVxuICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtkZXZlbG9wZXJUb29sc09wdGlvbn1cbiAgICAgICAgICAgIDwvSWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3Q+XG4gICAgICAgICAgICA8SWNvbml6ZWRDb250ZXh0TWVudU9wdGlvbkxpc3QgcmVkPntsZWF2ZU9wdGlvbn08L0ljb25pemVkQ29udGV4dE1lbnVPcHRpb25MaXN0PlxuICAgICAgICA8L0ljb25pemVkQ29udGV4dE1lbnU+XG4gICAgKTtcbn07XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUYsT0FBQTtBQUVBLElBQUFHLGtCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxnQkFBQSxHQUFBQyxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQU0sb0JBQUEsR0FBQUQsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFPLFdBQUEsR0FBQUYsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFRLGdCQUFBLEdBQUFSLE9BQUE7QUFDQSxJQUFBUyx1QkFBQSxHQUFBVCxPQUFBO0FBQ0EsSUFBQVUsbUJBQUEsR0FBQVYsT0FBQTtBQUNBLElBQUFXLGdCQUFBLEdBQUFYLE9BQUE7QUFDQSxJQUFBWSxrQkFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEs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