UNPKG

matrix-react-sdk

Version:
373 lines (370 loc) 68 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _react = _interopRequireWildcard(require("react")); var _classnames = _interopRequireDefault(require("classnames")); var _compoundWeb = require("@vector-im/compound-web"); var _favourite = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/favourite")); var _userAdd = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/user-add")); var _link = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/link")); var _settings = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/settings")); var _exportArchive = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/export-archive")); var _leave = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/leave")); var _files = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/files")); var _extensions = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/extensions")); var _userProfile = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/user-profile")); var _threads = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/threads")); var _polls = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/polls")); var _pin = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/pin")); var _lockSolid = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/lock-solid")); var _lockOff = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/lock-off")); var _public = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/public")); var _error = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/error")); var _chevronDown = _interopRequireDefault(require("@vector-im/compound-design-tokens/assets/web/icons/chevron-down")); var _matrix = require("matrix-js-sdk/src/matrix"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _useIsEncrypted = require("../../../hooks/useIsEncrypted"); var _BaseCard = _interopRequireDefault(require("./BaseCard")); var _languageHandler = require("../../../languageHandler"); var _RoomAvatar = _interopRequireDefault(require("../avatars/RoomAvatar")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _RightPanelStorePhases = require("../../../stores/right-panel/RightPanelStorePhases"); var _Modal = _interopRequireDefault(require("../../../Modal")); var _ShareDialog = _interopRequireDefault(require("../dialogs/ShareDialog")); var _useEventEmitter = require("../../../hooks/useEventEmitter"); var _ShieldUtils = require("../../../utils/ShieldUtils"); var _RoomContext = _interopRequireWildcard(require("../../../contexts/RoomContext")); var _RoomName = _interopRequireDefault(require("../elements/RoomName")); var _ExportDialog = _interopRequireDefault(require("../dialogs/ExportDialog")); var _RightPanelStore = _interopRequireDefault(require("../../../stores/right-panel/RightPanelStore")); var _PosthogTrackers = _interopRequireDefault(require("../../../PosthogTrackers")); var _PollHistoryDialog = require("../dialogs/PollHistoryDialog"); var _Flex = require("../../utils/Flex"); var _RoomListStore = _interopRequireWildcard(require("../../../stores/room-list/RoomListStore")); var _models = require("../../../stores/room-list/models"); var _tagRoom = require("../../../utils/room/tagRoom"); var _canInviteTo = require("../../../utils/room/canInviteTo"); var _inviteToRoom = require("../../../utils/room/inviteToRoom"); var _useAccountData = require("../../../hooks/useAccountData"); var _useRoomState = require("../../../hooks/useRoomState"); var _useTopic = require("../../../hooks/room/useTopic"); var _HtmlUtils = require("../../../HtmlUtils"); var _Box = require("../../utils/Box"); var _RoomTopic = require("../elements/RoomTopic"); var _useDispatcher = require("../../../hooks/useDispatcher"); var _actions = require("../../../dispatcher/actions"); var _Keyboard = require("../../../Keyboard"); var _useTransition = require("../../../hooks/useTransition"); var _videoRooms = require("../../../utils/video-rooms"); var _usePinnedEvents = require("../../../hooks/usePinnedEvents"); var _ReleaseAnnouncement = require("../../structures/ReleaseAnnouncement.tsx"); 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 2024 New Vector Ltd. Copyright 2020 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 onRoomMembersClick = () => { _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.RoomMemberList }, true); }; const onRoomThreadsClick = () => { _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.ThreadPanel }, true); }; const onRoomFilesClick = () => { _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.FilePanel }, true); }; const onRoomExtensionsClick = () => { _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.Extensions }, true); }; const onRoomPinsClick = () => { _PosthogTrackers.default.trackInteraction("PinnedMessageRoomInfoButton"); _RightPanelStore.default.instance.pushCard({ phase: _RightPanelStorePhases.RightPanelPhases.PinnedMessages }, true); }; const onRoomSettingsClick = ev => { _dispatcher.default.dispatch({ action: "open_room_settings" }); _PosthogTrackers.default.trackInteraction("WebRightPanelRoomInfoSettingsButton", ev); }; const RoomTopic = ({ room }) => { const [expanded, setExpanded] = (0, _react.useState)(true); const topic = (0, _useTopic.useTopic)(room); const body = (0, _HtmlUtils.topicToHtml)(topic?.text, topic?.html); const canEditTopic = (0, _useRoomState.useRoomState)(room, state => state.maySendStateEvent(_matrix.EventType.RoomTopic, room.client.getSafeUserId())); const onEditClick = e => { e.preventDefault(); e.stopPropagation(); _dispatcher.default.dispatch({ action: "open_room_settings" }); }; if (!body && !canEditTopic) { return null; } if (!body) { return /*#__PURE__*/_react.default.createElement(_Flex.Flex, { as: "section", direction: "column", justify: "center", gap: "var(--cpd-space-2x)", className: "mx_RoomSummaryCard_topic" }, /*#__PURE__*/_react.default.createElement(_Box.Box, { flex: "1" }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Link, { kind: "primary", onClick: onEditClick }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { size: "sm", weight: "regular" }, (0, _languageHandler._t)("right_panel|add_topic"))))); } const content = expanded ? /*#__PURE__*/_react.default.createElement(_HtmlUtils.Linkify, null, body) : body; return /*#__PURE__*/_react.default.createElement(_Flex.Flex, { as: "section", direction: "column", justify: "center", gap: "var(--cpd-space-2x)", className: (0, _classnames.default)("mx_RoomSummaryCard_topic", { mx_RoomSummaryCard_topic_collapsed: !expanded }) }, /*#__PURE__*/_react.default.createElement(_Box.Box, { flex: "1", className: "mx_RoomSummaryCard_topic_container" }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { size: "sm", weight: "regular", onClick: ev => { if (ev.target instanceof HTMLAnchorElement) { (0, _RoomTopic.onRoomTopicLinkClick)(ev); return; } } }, content), /*#__PURE__*/_react.default.createElement(_compoundWeb.IconButton, { className: "mx_RoomSummaryCard_topic_chevron", size: "24px", onClick: () => setExpanded(!expanded) }, /*#__PURE__*/_react.default.createElement(_chevronDown.default, null))), expanded && canEditTopic && /*#__PURE__*/_react.default.createElement(_Box.Box, { flex: "1", className: "mx_RoomSummaryCard_topic_edit" }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Link, { kind: "primary", onClick: onEditClick }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { size: "sm", weight: "regular" }, (0, _languageHandler._t)("action|edit"))))); }; const RoomSummaryCard = ({ room, permalinkCreator, onSearchChange, onSearchCancel, focusRoomSearch }) => { const cli = (0, _react.useContext)(_MatrixClientContext.default); const onShareRoomClick = () => { _Modal.default.createDialog(_ShareDialog.default, { target: room }); }; const onRoomExportClick = async () => { _Modal.default.createDialog(_ExportDialog.default, { room }); }; const onRoomPollHistoryClick = () => { _Modal.default.createDialog(_PollHistoryDialog.PollHistoryDialog, { room, matrixClient: cli, permalinkCreator }); }; const onLeaveRoomClick = () => { _dispatcher.default.dispatch({ action: "leave_room", room_id: room.roomId }); }; const isRoomEncrypted = (0, _useIsEncrypted.useIsEncrypted)(cli, room); const roomContext = (0, _react.useContext)(_RoomContext.default); const e2eStatus = roomContext.e2eStatus; const isVideoRoom = (0, _videoRooms.isVideoRoom)(room); const roomState = (0, _useRoomState.useRoomState)(room); const directRoomsList = (0, _useAccountData.useAccountData)(room.client, _matrix.EventType.Direct); const [isDirectMessage, setDirectMessage] = (0, _react.useState)(false); (0, _react.useEffect)(() => { for (const [, dmRoomList] of Object.entries(directRoomsList)) { if (dmRoomList.includes(room?.roomId ?? "")) { setDirectMessage(true); break; } } }, [room, directRoomsList]); const searchInputRef = (0, _react.useRef)(null); (0, _useDispatcher.useDispatcher)(_dispatcher.default, payload => { if (payload.action === _actions.Action.FocusMessageSearch) { searchInputRef.current?.focus(); } }); // Clear the search field when the user leaves the search view (0, _useTransition.useTransition)(prevTimelineRenderingType => { if (prevTimelineRenderingType === _RoomContext.TimelineRenderingType.Search && roomContext.timelineRenderingType !== _RoomContext.TimelineRenderingType.Search && searchInputRef.current) { searchInputRef.current.value = ""; } }, [roomContext.timelineRenderingType]); const alias = room.getCanonicalAlias() || room.getAltAliases()[0] || ""; const roomInfo = /*#__PURE__*/_react.default.createElement("header", { className: "mx_RoomSummaryCard_container" }, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, { room: room, size: "80px", viewAvatarOnClick: true }), /*#__PURE__*/_react.default.createElement(_RoomName.default, { room: room }, name => /*#__PURE__*/_react.default.createElement(_compoundWeb.Heading, { as: "h1", size: "md", weight: "semibold", className: "mx_RoomSummaryCard_roomName text-primary", title: name }, name)), /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { as: "div", size: "sm", weight: "semibold", className: "mx_RoomSummaryCard_alias text-secondary", title: alias }, alias), /*#__PURE__*/_react.default.createElement(_Flex.Flex, { as: "section", justify: "center", gap: "var(--cpd-space-2x)", className: "mx_RoomSummaryCard_badges" }, !isDirectMessage && roomState.getJoinRule() === _matrix.JoinRule.Public && /*#__PURE__*/_react.default.createElement(_compoundWeb.Badge, { kind: "grey" }, /*#__PURE__*/_react.default.createElement(_public.default, { width: "1em" }), (0, _languageHandler._t)("common|public_room")), isRoomEncrypted && e2eStatus !== _ShieldUtils.E2EStatus.Warning && /*#__PURE__*/_react.default.createElement(_compoundWeb.Badge, { kind: "green" }, /*#__PURE__*/_react.default.createElement(_lockSolid.default, { width: "1em" }), (0, _languageHandler._t)("common|encrypted")), !e2eStatus && /*#__PURE__*/_react.default.createElement(_compoundWeb.Badge, { kind: "grey" }, /*#__PURE__*/_react.default.createElement(_lockOff.default, { width: "1em" }), (0, _languageHandler._t)("common|unencrypted")), e2eStatus === _ShieldUtils.E2EStatus.Warning && /*#__PURE__*/_react.default.createElement(_compoundWeb.Badge, { kind: "red" }, /*#__PURE__*/_react.default.createElement(_error.default, { width: "1em" }), (0, _languageHandler._t)("common|not_trusted"))), /*#__PURE__*/_react.default.createElement(RoomTopic, { room: room })); const pinCount = (0, _usePinnedEvents.usePinnedEvents)(room).length; const roomTags = (0, _useEventEmitter.useEventEmitterState)(_RoomListStore.default.instance, _RoomListStore.LISTS_UPDATE_EVENT, () => _RoomListStore.default.instance.getTagsForRoom(room)); const canInviteToState = (0, _useEventEmitter.useEventEmitterState)(room, _matrix.RoomStateEvent.Update, () => (0, _canInviteTo.canInviteTo)(room)); const isFavorite = roomTags.includes(_models.DefaultTagID.Favourite); const header = onSearchChange && /*#__PURE__*/_react.default.createElement(_compoundWeb.Form.Root, { className: "mx_RoomSummaryCard_search", onSubmit: e => e.preventDefault() }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Search, { placeholder: (0, _languageHandler._t)("room|search|placeholder"), name: "room_message_search", onChange: onSearchChange, className: "mx_no_textinput", ref: searchInputRef, autoFocus: focusRoomSearch, onKeyDown: e => { if (searchInputRef.current && e.key === _Keyboard.Key.ESCAPE) { searchInputRef.current.value = ""; onSearchCancel?.(); } } })); return /*#__PURE__*/_react.default.createElement(_BaseCard.default, { id: "room-summary-panel", className: "mx_RoomSummaryCard", ariaLabelledBy: "room-summary-panel-tab", role: "tabpanel", header: header }, roomInfo, /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), /*#__PURE__*/_react.default.createElement("div", { role: "menubar", "aria-orientation": "vertical" }, /*#__PURE__*/_react.default.createElement(_compoundWeb.ToggleMenuItem, { Icon: _favourite.default, label: (0, _languageHandler._t)("room|context_menu|favourite"), checked: isFavorite, onSelect: () => (0, _tagRoom.tagRoom)(room, _models.DefaultTagID.Favourite) }), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _userAdd.default, label: (0, _languageHandler._t)("action|invite"), disabled: !canInviteToState, onSelect: () => (0, _inviteToRoom.inviteToRoom)(room) }), /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _userProfile.default, label: (0, _languageHandler._t)("common|people"), onSelect: onRoomMembersClick }), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _threads.default, label: (0, _languageHandler._t)("common|threads"), onSelect: onRoomThreadsClick }), !isVideoRoom && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_ReleaseAnnouncement.ReleaseAnnouncement, { feature: "pinningMessageList", header: (0, _languageHandler._t)("right_panel|pinned_messages|release_announcement|title"), description: (0, _languageHandler._t)("right_panel|pinned_messages|release_announcement|description"), closeLabel: (0, _languageHandler._t)("right_panel|pinned_messages|release_announcement|close"), placement: "top" }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _pin.default, label: (0, _languageHandler._t)("right_panel|pinned_messages_button"), onSelect: onRoomPinsClick }, /*#__PURE__*/_react.default.createElement(_compoundWeb.Text, { as: "span", size: "sm" }, pinCount)))), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _files.default, label: (0, _languageHandler._t)("right_panel|files_button"), onSelect: onRoomFilesClick }), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _extensions.default, label: (0, _languageHandler._t)("right_panel|extensions_button"), onSelect: onRoomExtensionsClick })), /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _link.default, label: (0, _languageHandler._t)("action|copy_link"), onSelect: onShareRoomClick }), !isVideoRoom && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _polls.default, label: (0, _languageHandler._t)("right_panel|polls_button"), onSelect: onRoomPollHistoryClick }), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _exportArchive.default, label: (0, _languageHandler._t)("export_chat|title"), onSelect: onRoomExportClick })), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _settings.default, label: (0, _languageHandler._t)("common|settings"), onSelect: onRoomSettingsClick }), /*#__PURE__*/_react.default.createElement(_compoundWeb.Separator, null), /*#__PURE__*/_react.default.createElement(_compoundWeb.MenuItem, { Icon: _leave.default, kind: "critical", label: (0, _languageHandler._t)("action|leave_room"), onSelect: onLeaveRoomClick }))); }; var _default = exports.default = RoomSummaryCard; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfY2xhc3NuYW1lcyIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfY29tcG91bmRXZWIiLCJfZmF2b3VyaXRlIiwiX3VzZXJBZGQiLCJfbGluayIsIl9zZXR0aW5ncyIsIl9leHBvcnRBcmNoaXZlIiwiX2xlYXZlIiwiX2ZpbGVzIiwiX2V4dGVuc2lvbnMiLCJfdXNlclByb2ZpbGUiLCJfdGhyZWFkcyIsIl9wb2xscyIsIl9waW4iLCJfbG9ja1NvbGlkIiwiX2xvY2tPZmYiLCJfcHVibGljIiwiX2Vycm9yIiwiX2NoZXZyb25Eb3duIiwiX21hdHJpeCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX3VzZUlzRW5jcnlwdGVkIiwiX0Jhc2VDYXJkIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9Sb29tQXZhdGFyIiwiX2Rpc3BhdGNoZXIiLCJfUmlnaHRQYW5lbFN0b3JlUGhhc2VzIiwiX01vZGFsIiwiX1NoYXJlRGlhbG9nIiwiX3VzZUV2ZW50RW1pdHRlciIsIl9TaGllbGRVdGlscyIsIl9Sb29tQ29udGV4dCIsIl9Sb29tTmFtZSIsIl9FeHBvcnREaWFsb2ciLCJfUmlnaHRQYW5lbFN0b3JlIiwiX1Bvc3Rob2dUcmFja2VycyIsIl9Qb2xsSGlzdG9yeURpYWxvZyIsIl9GbGV4IiwiX1Jvb21MaXN0U3RvcmUiLCJfbW9kZWxzIiwiX3RhZ1Jvb20iLCJfY2FuSW52aXRlVG8iLCJfaW52aXRlVG9Sb29tIiwiX3VzZUFjY291bnREYXRhIiwiX3VzZVJvb21TdGF0ZSIsIl91c2VUb3BpYyIsIl9IdG1sVXRpbHMiLCJfQm94IiwiX1Jvb21Ub3BpYyIsIl91c2VEaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfS2V5Ym9hcmQiLCJfdXNlVHJhbnNpdGlvbiIsIl92aWRlb1Jvb21zIiwiX3VzZVBpbm5lZEV2ZW50cyIsIl9SZWxlYXNlQW5ub3VuY2VtZW50IiwiX2dldFJlcXVpcmVXaWxkY2FyZENhY2hlIiwiZSIsIldlYWtNYXAiLCJyIiwidCIsIl9fZXNNb2R1bGUiLCJkZWZhdWx0IiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0Iiwib25Sb29tTWVtYmVyc0NsaWNrIiwiUmlnaHRQYW5lbFN0b3JlIiwiaW5zdGFuY2UiLCJwdXNoQ2FyZCIsInBoYXNlIiwiUmlnaHRQYW5lbFBoYXNlcyIsIlJvb21NZW1iZXJMaXN0Iiwib25Sb29tVGhyZWFkc0NsaWNrIiwiVGhyZWFkUGFuZWwiLCJvblJvb21GaWxlc0NsaWNrIiwiRmlsZVBhbmVsIiwib25Sb29tRXh0ZW5zaW9uc0NsaWNrIiwiRXh0ZW5zaW9ucyIsIm9uUm9vbVBpbnNDbGljayIsIlBvc3Rob2dUcmFja2VycyIsInRyYWNrSW50ZXJhY3Rpb24iLCJQaW5uZWRNZXNzYWdlcyIsIm9uUm9vbVNldHRpbmdzQ2xpY2siLCJldiIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJSb29tVG9waWMiLCJyb29tIiwiZXhwYW5kZWQiLCJzZXRFeHBhbmRlZCIsInVzZVN0YXRlIiwidG9waWMiLCJ1c2VUb3BpYyIsImJvZHkiLCJ0b3BpY1RvSHRtbCIsInRleHQiLCJodG1sIiwiY2FuRWRpdFRvcGljIiwidXNlUm9vbVN0YXRlIiwic3RhdGUiLCJtYXlTZW5kU3RhdGVFdmVudCIsIkV2ZW50VHlwZSIsImNsaWVudCIsImdldFNhZmVVc2VySWQiLCJvbkVkaXRDbGljayIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwiY3JlYXRlRWxlbWVudCIsIkZsZXgiLCJhcyIsImRpcmVjdGlvbiIsImp1c3RpZnkiLCJnYXAiLCJjbGFzc05hbWUiLCJCb3giLCJmbGV4IiwiTGluayIsImtpbmQiLCJvbkNsaWNrIiwiVGV4dCIsInNpemUiLCJ3ZWlnaHQiLCJfdCIsImNvbnRlbnQiLCJMaW5raWZ5IiwiY2xhc3NOYW1lcyIsIm14X1Jvb21TdW1tYXJ5Q2FyZF90b3BpY19jb2xsYXBzZWQiLCJ0YXJnZXQiLCJIVE1MQW5jaG9yRWxlbWVudCIsIm9uUm9vbVRvcGljTGlua0NsaWNrIiwiSWNvbkJ1dHRvbiIsIlJvb21TdW1tYXJ5Q2FyZCIsInBlcm1hbGlua0NyZWF0b3IiLCJvblNlYXJjaENoYW5nZSIsIm9uU2VhcmNoQ2FuY2VsIiwiZm9jdXNSb29tU2VhcmNoIiwiY2xpIiwidXNlQ29udGV4dCIsIk1hdHJpeENsaWVudENvbnRleHQiLCJvblNoYXJlUm9vbUNsaWNrIiwiTW9kYWwiLCJjcmVhdGVEaWFsb2ciLCJTaGFyZURpYWxvZyIsIm9uUm9vbUV4cG9ydENsaWNrIiwiRXhwb3J0RGlhbG9nIiwib25Sb29tUG9sbEhpc3RvcnlDbGljayIsIlBvbGxIaXN0b3J5RGlhbG9nIiwibWF0cml4Q2xpZW50Iiwib25MZWF2ZVJvb21DbGljayIsInJvb21faWQiLCJyb29tSWQiLCJpc1Jvb21FbmNyeXB0ZWQiLCJ1c2VJc0VuY3J5cHRlZCIsInJvb21Db250ZXh0IiwiUm9vbUNvbnRleHQiLCJlMmVTdGF0dXMiLCJpc1ZpZGVvUm9vbSIsImNhbGNJc1ZpZGVvUm9vbSIsInJvb21TdGF0ZSIsImRpcmVjdFJvb21zTGlzdCIsInVzZUFjY291bnREYXRhIiwiRGlyZWN0IiwiaXNEaXJlY3RNZXNzYWdlIiwic2V0RGlyZWN0TWVzc2FnZSIsInVzZUVmZmVjdCIsImRtUm9vbUxpc3QiLCJlbnRyaWVzIiwiaW5jbHVkZXMiLCJzZWFyY2hJbnB1dFJlZiIsInVzZVJlZiIsInVzZURpc3BhdGNoZXIiLCJwYXlsb2FkIiwiQWN0aW9uIiwiRm9jdXNNZXNzYWdlU2VhcmNoIiwiY3VycmVudCIsImZvY3VzIiwidXNlVHJhbnNpdGlvbiIsInByZXZUaW1lbGluZVJlbmRlcmluZ1R5cGUiLCJUaW1lbGluZVJlbmRlcmluZ1R5cGUiLCJTZWFyY2giLCJ0aW1lbGluZVJlbmRlcmluZ1R5cGUiLCJ2YWx1ZSIsImFsaWFzIiwiZ2V0Q2Fub25pY2FsQWxpYXMiLCJnZXRBbHRBbGlhc2VzIiwicm9vbUluZm8iLCJ2aWV3QXZhdGFyT25DbGljayIsIm5hbWUiLCJIZWFkaW5nIiwidGl0bGUiLCJnZXRKb2luUnVsZSIsIkpvaW5SdWxlIiwiUHVibGljIiwiQmFkZ2UiLCJ3aWR0aCIsIkUyRVN0YXR1cyIsIldhcm5pbmciLCJwaW5Db3VudCIsInVzZVBpbm5lZEV2ZW50cyIsImxlbmd0aCIsInJvb21UYWdzIiwidXNlRXZlbnRFbWl0dGVyU3RhdGUiLCJSb29tTGlzdFN0b3JlIiwiTElTVFNfVVBEQVRFX0VWRU5UIiwiZ2V0VGFnc0ZvclJvb20iLCJjYW5JbnZpdGVUb1N0YXRlIiwiUm9vbVN0YXRlRXZlbnQiLCJVcGRhdGUiLCJjYW5JbnZpdGVUbyIsImlzRmF2b3JpdGUiLCJEZWZhdWx0VGFnSUQiLCJGYXZvdXJpdGUiLCJoZWFkZXIiLCJGb3JtIiwiUm9vdCIsIm9uU3VibWl0IiwicGxhY2Vob2xkZXIiLCJvbkNoYW5nZSIsInJlZiIsImF1dG9Gb2N1cyIsIm9uS2V5RG93biIsImtleSIsIktleSIsIkVTQ0FQRSIsImlkIiwiYXJpYUxhYmVsbGVkQnkiLCJyb2xlIiwiU2VwYXJhdG9yIiwiVG9nZ2xlTWVudUl0ZW0iLCJJY29uIiwiRmF2b3VyaXRlSWNvbiIsImxhYmVsIiwiY2hlY2tlZCIsIm9uU2VsZWN0IiwidGFnUm9vbSIsIk1lbnVJdGVtIiwiVXNlckFkZEljb24iLCJkaXNhYmxlZCIsImludml0ZVRvUm9vbSIsIlVzZXJQcm9maWxlSWNvbiIsIlRocmVhZHNJY29uIiwiRnJhZ21lbnQiLCJSZWxlYXNlQW5ub3VuY2VtZW50IiwiZmVhdHVyZSIsImRlc2NyaXB0aW9uIiwiY2xvc2VMYWJlbCIsInBsYWNlbWVudCIsIlBpbkljb24iLCJGaWxlc0ljb24iLCJFeHRlbnNpb25zSWNvbiIsIkxpbmtJY29uIiwiUG9sbHNJY29uIiwiRXhwb3J0QXJjaGl2ZUljb24iLCJTZXR0aW5nc0ljb24iLCJMZWF2ZUljb24iLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9yaWdodF9wYW5lbC9Sb29tU3VtbWFyeUNhcmQudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwIFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG5cblNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBBR1BMLTMuMC1vbmx5IE9SIEdQTC0zLjAtb25seVxuUGxlYXNlIHNlZSBMSUNFTlNFIGZpbGVzIGluIHRoZSByZXBvc2l0b3J5IHJvb3QgZm9yIGZ1bGwgZGV0YWlscy5cbiovXG5cbmltcG9ydCBSZWFjdCwgeyBDaGFuZ2VFdmVudCwgU3ludGhldGljRXZlbnQsIHVzZUNvbnRleHQsIHVzZUVmZmVjdCwgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IGNsYXNzTmFtZXMgZnJvbSBcImNsYXNzbmFtZXNcIjtcbmltcG9ydCB7XG4gICAgTWVudUl0ZW0sXG4gICAgU2VwYXJhdG9yLFxuICAgIFRvZ2dsZU1lbnVJdGVtLFxuICAgIFRleHQsXG4gICAgQmFkZ2UsXG4gICAgSGVhZGluZyxcbiAgICBJY29uQnV0dG9uLFxuICAgIExpbmssXG4gICAgU2VhcmNoLFxuICAgIEZvcm0sXG59IGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLXdlYlwiO1xuaW1wb3J0IEZhdm91cml0ZUljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL2Zhdm91cml0ZVwiO1xuaW1wb3J0IFVzZXJBZGRJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy91c2VyLWFkZFwiO1xuaW1wb3J0IExpbmtJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9saW5rXCI7XG5pbXBvcnQgU2V0dGluZ3NJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9zZXR0aW5nc1wiO1xuaW1wb3J0IEV4cG9ydEFyY2hpdmVJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9leHBvcnQtYXJjaGl2ZVwiO1xuaW1wb3J0IExlYXZlSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvbGVhdmVcIjtcbmltcG9ydCBGaWxlc0ljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL2ZpbGVzXCI7XG5pbXBvcnQgRXh0ZW5zaW9uc0ljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL2V4dGVuc2lvbnNcIjtcbmltcG9ydCBVc2VyUHJvZmlsZUljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL3VzZXItcHJvZmlsZVwiO1xuaW1wb3J0IFRocmVhZHNJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy90aHJlYWRzXCI7XG5pbXBvcnQgUG9sbHNJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9wb2xsc1wiO1xuaW1wb3J0IFBpbkljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL3BpblwiO1xuaW1wb3J0IExvY2tJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9sb2NrLXNvbGlkXCI7XG5pbXBvcnQgTG9ja09mZkljb24gZnJvbSBcIkB2ZWN0b3ItaW0vY29tcG91bmQtZGVzaWduLXRva2Vucy9hc3NldHMvd2ViL2ljb25zL2xvY2stb2ZmXCI7XG5pbXBvcnQgUHVibGljSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvcHVibGljXCI7XG5pbXBvcnQgRXJyb3JJY29uIGZyb20gXCJAdmVjdG9yLWltL2NvbXBvdW5kLWRlc2lnbi10b2tlbnMvYXNzZXRzL3dlYi9pY29ucy9lcnJvclwiO1xuaW1wb3J0IENoZXZyb25Eb3duSWNvbiBmcm9tIFwiQHZlY3Rvci1pbS9jb21wb3VuZC1kZXNpZ24tdG9rZW5zL2Fzc2V0cy93ZWIvaWNvbnMvY2hldnJvbi1kb3duXCI7XG5pbXBvcnQgeyBFdmVudFR5cGUsIEpvaW5SdWxlLCBSb29tLCBSb29tU3RhdGVFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IE1hdHJpeENsaWVudENvbnRleHQgZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZUlzRW5jcnlwdGVkIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUlzRW5jcnlwdGVkXCI7XG5pbXBvcnQgQmFzZUNhcmQgZnJvbSBcIi4vQmFzZUNhcmRcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IFJvb21BdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvUm9vbUF2YXRhclwiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IFJpZ2h0UGFuZWxQaGFzZXMgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3JpZ2h0LXBhbmVsL1JpZ2h0UGFuZWxTdG9yZVBoYXNlc1wiO1xuaW1wb3J0IE1vZGFsIGZyb20gXCIuLi8uLi8uLi9Nb2RhbFwiO1xuaW1wb3J0IFNoYXJlRGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL1NoYXJlRGlhbG9nXCI7XG5pbXBvcnQgeyB1c2VFdmVudEVtaXR0ZXJTdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VFdmVudEVtaXR0ZXJcIjtcbmltcG9ydCB7IEUyRVN0YXR1cyB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9TaGllbGRVdGlsc1wiO1xuaW1wb3J0IHsgUm9vbVBlcm1hbGlua0NyZWF0b3IgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgUm9vbUNvbnRleHQsIHsgVGltZWxpbmVSZW5kZXJpbmdUeXBlIH0gZnJvbSBcIi4uLy4uLy4uL2NvbnRleHRzL1Jvb21Db250ZXh0XCI7XG5pbXBvcnQgUm9vbU5hbWUgZnJvbSBcIi4uL2VsZW1lbnRzL1Jvb21OYW1lXCI7XG5pbXBvcnQgRXhwb3J0RGlhbG9nIGZyb20gXCIuLi9kaWFsb2dzL0V4cG9ydERpYWxvZ1wiO1xuaW1wb3J0IFJpZ2h0UGFuZWxTdG9yZSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL3JpZ2h0LXBhbmVsL1JpZ2h0UGFuZWxTdG9yZVwiO1xuaW1wb3J0IFBvc3Rob2dUcmFja2VycyBmcm9tIFwiLi4vLi4vLi4vUG9zdGhvZ1RyYWNrZXJzXCI7XG5pbXBvcnQgeyBQb2xsSGlzdG9yeURpYWxvZyB9IGZyb20gXCIuLi9kaWFsb2dzL1BvbGxIaXN0b3J5RGlhbG9nXCI7XG5pbXBvcnQgeyBGbGV4IH0gZnJvbSBcIi4uLy4uL3V0aWxzL0ZsZXhcIjtcbmltcG9ydCBSb29tTGlzdFN0b3JlLCB7IExJU1RTX1VQREFURV9FVkVOVCB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcm9vbS1saXN0L1Jvb21MaXN0U3RvcmVcIjtcbmltcG9ydCB7IERlZmF1bHRUYWdJRCB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvcm9vbS1saXN0L21vZGVsc1wiO1xuaW1wb3J0IHsgdGFnUm9vbSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yb29tL3RhZ1Jvb21cIjtcbmltcG9ydCB7IGNhbkludml0ZVRvIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3Jvb20vY2FuSW52aXRlVG9cIjtcbmltcG9ydCB7IGludml0ZVRvUm9vbSB9IGZyb20gXCIuLi8uLi8uLi91dGlscy9yb29tL2ludml0ZVRvUm9vbVwiO1xuaW1wb3J0IHsgdXNlQWNjb3VudERhdGEgfSBmcm9tIFwiLi4vLi4vLi4vaG9va3MvdXNlQWNjb3VudERhdGFcIjtcbmltcG9ydCB7IHVzZVJvb21TdGF0ZSB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VSb29tU3RhdGVcIjtcbmltcG9ydCB7IHVzZVRvcGljIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3Jvb20vdXNlVG9waWNcIjtcbmltcG9ydCB7IExpbmtpZnksIHRvcGljVG9IdG1sIH0gZnJvbSBcIi4uLy4uLy4uL0h0bWxVdGlsc1wiO1xuaW1wb3J0IHsgQm94IH0gZnJvbSBcIi4uLy4uL3V0aWxzL0JveFwiO1xuaW1wb3J0IHsgb25Sb29tVG9waWNMaW5rQ2xpY2sgfSBmcm9tIFwiLi4vZWxlbWVudHMvUm9vbVRvcGljXCI7XG5pbXBvcnQgeyB1c2VEaXNwYXRjaGVyIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZURpc3BhdGNoZXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IEtleSB9IGZyb20gXCIuLi8uLi8uLi9LZXlib2FyZFwiO1xuaW1wb3J0IHsgdXNlVHJhbnNpdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VUcmFuc2l0aW9uXCI7XG5pbXBvcnQgeyBpc1ZpZGVvUm9vbSBhcyBjYWxjSXNWaWRlb1Jvb20gfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvdmlkZW8tcm9vbXNcIjtcbmltcG9ydCB7IHVzZVBpbm5lZEV2ZW50cyB9IGZyb20gXCIuLi8uLi8uLi9ob29rcy91c2VQaW5uZWRFdmVudHNcIjtcbmltcG9ydCB7IFJlbGVhc2VBbm5vdW5jZW1lbnQgfSBmcm9tIFwiLi4vLi4vc3RydWN0dXJlcy9SZWxlYXNlQW5ub3VuY2VtZW50LnRzeFwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHtcbiAgICByb29tOiBSb29tO1xuICAgIHBlcm1hbGlua0NyZWF0b3I6IFJvb21QZXJtYWxpbmtDcmVhdG9yO1xuICAgIG9uU2VhcmNoQ2hhbmdlPzogKGU6IENoYW5nZUV2ZW50KSA9PiB2b2lkO1xuICAgIG9uU2VhcmNoQ2FuY2VsPzogKCkgPT4gdm9pZDtcbiAgICBmb2N1c1Jvb21TZWFyY2g/OiBib29sZWFuO1xufVxuXG5jb25zdCBvblJvb21NZW1iZXJzQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgUmlnaHRQYW5lbFN0b3JlLmluc3RhbmNlLnB1c2hDYXJkKHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuUm9vbU1lbWJlckxpc3QgfSwgdHJ1ZSk7XG59O1xuXG5jb25zdCBvblJvb21UaHJlYWRzQ2xpY2sgPSAoKTogdm9pZCA9PiB7XG4gICAgUmlnaHRQYW5lbFN0b3JlLmluc3RhbmNlLnB1c2hDYXJkKHsgcGhhc2U6IFJpZ2h0UGFuZWxQaGFzZXMuVGhyZWFkUGFuZWwgfSwgdHJ1ZSk7XG59O1xuXG5jb25zdCBvblJvb21GaWxlc0NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgIFJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS5wdXNoQ2FyZCh7IHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLkZpbGVQYW5lbCB9LCB0cnVlKTtcbn07XG5cbmNvbnN0IG9uUm9vbUV4dGVuc2lvbnNDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICBSaWdodFBhbmVsU3RvcmUuaW5zdGFuY2UucHVzaENhcmQoeyBwaGFzZTogUmlnaHRQYW5lbFBoYXNlcy5FeHRlbnNpb25zIH0sIHRydWUpO1xufTtcblxuY29uc3Qgb25Sb29tUGluc0NsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgIFBvc3Rob2dUcmFja2Vycy50cmFja0ludGVyYWN0aW9uKFwiUGlubmVkTWVzc2FnZVJvb21JbmZvQnV0dG9uXCIpO1xuICAgIFJpZ2h0UGFuZWxTdG9yZS5pbnN0YW5jZS5wdXNoQ2FyZCh7IHBoYXNlOiBSaWdodFBhbmVsUGhhc2VzLlBpbm5lZE1lc3NhZ2VzIH0sIHRydWUpO1xufTtcblxuY29uc3Qgb25Sb29tU2V0dGluZ3NDbGljayA9IChldjogRXZlbnQpOiB2b2lkID0+IHtcbiAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7IGFjdGlvbjogXCJvcGVuX3Jvb21fc2V0dGluZ3NcIiB9KTtcbiAgICBQb3N0aG9nVHJhY2tlcnMudHJhY2tJbnRlcmFjdGlvbihcIldlYlJpZ2h0UGFuZWxSb29tSW5mb1NldHRpbmdzQnV0dG9uXCIsIGV2KTtcbn07XG5cbmNvbnN0IFJvb21Ub3BpYzogUmVhY3QuRkM8UGljazxJUHJvcHMsIFwicm9vbVwiPj4gPSAoeyByb29tIH0pOiBKU1guRWxlbWVudCB8IG51bGwgPT4ge1xuICAgIGNvbnN0IFtleHBhbmRlZCwgc2V0RXhwYW5kZWRdID0gdXNlU3RhdGUodHJ1ZSk7XG5cbiAgICBjb25zdCB0b3BpYyA9IHVzZVRvcGljKHJvb20pO1xuICAgIGNvbnN0IGJvZHkgPSB0b3BpY1RvSHRtbCh0b3BpYz8udGV4dCwgdG9waWM/Lmh0bWwpO1xuXG4gICAgY29uc3QgY2FuRWRpdFRvcGljID0gdXNlUm9vbVN0YXRlKHJvb20sIChzdGF0ZSkgPT5cbiAgICAgICAgc3RhdGUubWF5U2VuZFN0YXRlRXZlbnQoRXZlbnRUeXBlLlJvb21Ub3BpYywgcm9vbS5jbGllbnQuZ2V0U2FmZVVzZXJJZCgpKSxcbiAgICApO1xuICAgIGNvbnN0IG9uRWRpdENsaWNrID0gKGU6IFN5bnRoZXRpY0V2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goeyBhY3Rpb246IFwib3Blbl9yb29tX3NldHRpbmdzXCIgfSk7XG4gICAgfTtcblxuICAgIGlmICghYm9keSAmJiAhY2FuRWRpdFRvcGljKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICghYm9keSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEZsZXhcbiAgICAgICAgICAgICAgICBhcz1cInNlY3Rpb25cIlxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbj1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAganVzdGlmeT1cImNlbnRlclwiXG4gICAgICAgICAgICAgICAgZ2FwPVwidmFyKC0tY3BkLXNwYWNlLTJ4KVwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX3RvcGljXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8Qm94IGZsZXg9XCIxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxMaW5rIGtpbmQ9XCJwcmltYXJ5XCIgb25DbGljaz17b25FZGl0Q2xpY2t9PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFRleHQgc2l6ZT1cInNtXCIgd2VpZ2h0PVwicmVndWxhclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInJpZ2h0X3BhbmVsfGFkZF90b3BpY1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgICAgICAgICAgICAgPC9MaW5rPlxuICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgPC9GbGV4PlxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbnRlbnQgPSBleHBhbmRlZCA/IDxMaW5raWZ5Pntib2R5fTwvTGlua2lmeT4gOiBib2R5O1xuICAgIHJldHVybiAoXG4gICAgICAgIDxGbGV4XG4gICAgICAgICAgICBhcz1cInNlY3Rpb25cIlxuICAgICAgICAgICAgZGlyZWN0aW9uPVwiY29sdW1uXCJcbiAgICAgICAgICAgIGp1c3RpZnk9XCJjZW50ZXJcIlxuICAgICAgICAgICAgZ2FwPVwidmFyKC0tY3BkLXNwYWNlLTJ4KVwiXG4gICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZXMoXCJteF9Sb29tU3VtbWFyeUNhcmRfdG9waWNcIiwge1xuICAgICAgICAgICAgICAgIG14X1Jvb21TdW1tYXJ5Q2FyZF90b3BpY19jb2xsYXBzZWQ6ICFleHBhbmRlZCxcbiAgICAgICAgICAgIH0pfVxuICAgICAgICA+XG4gICAgICAgICAgICA8Qm94IGZsZXg9XCIxXCIgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX3RvcGljX2NvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxUZXh0XG4gICAgICAgICAgICAgICAgICAgIHNpemU9XCJzbVwiXG4gICAgICAgICAgICAgICAgICAgIHdlaWdodD1cInJlZ3VsYXJcIlxuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZXY6IFJlYWN0Lk1vdXNlRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi50YXJnZXQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uUm9vbVRvcGljTGlua0NsaWNrKGV2KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICB7Y29udGVudH1cbiAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgPEljb25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX3RvcGljX2NoZXZyb25cIlxuICAgICAgICAgICAgICAgICAgICBzaXplPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9eygpID0+IHNldEV4cGFuZGVkKCFleHBhbmRlZCl9XG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8Q2hldnJvbkRvd25JY29uIC8+XG4gICAgICAgICAgICAgICAgPC9JY29uQnV0dG9uPlxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgICB7ZXhwYW5kZWQgJiYgY2FuRWRpdFRvcGljICYmIChcbiAgICAgICAgICAgICAgICA8Qm94IGZsZXg9XCIxXCIgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX3RvcGljX2VkaXRcIj5cbiAgICAgICAgICAgICAgICAgICAgPExpbmsga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXtvbkVkaXRDbGlja30+XG4gICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBzaXplPVwic21cIiB3ZWlnaHQ9XCJyZWd1bGFyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiYWN0aW9ufGVkaXRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgIDwvTGluaz5cbiAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvRmxleD5cbiAgICApO1xufTtcblxuY29uc3QgUm9vbVN1bW1hcnlDYXJkOiBSZWFjdC5GQzxJUHJvcHM+ID0gKHtcbiAgICByb29tLFxuICAgIHBlcm1hbGlua0NyZWF0b3IsXG4gICAgb25TZWFyY2hDaGFuZ2UsXG4gICAgb25TZWFyY2hDYW5jZWwsXG4gICAgZm9jdXNSb29tU2VhcmNoLFxufSkgPT4ge1xuICAgIGNvbnN0IGNsaSA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG5cbiAgICBjb25zdCBvblNoYXJlUm9vbUNsaWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coU2hhcmVEaWFsb2csIHtcbiAgICAgICAgICAgIHRhcmdldDogcm9vbSxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIGNvbnN0IG9uUm9vbUV4cG9ydENsaWNrID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBNb2RhbC5jcmVhdGVEaWFsb2coRXhwb3J0RGlhbG9nLCB7XG4gICAgICAgICAgICByb29tLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25Sb29tUG9sbEhpc3RvcnlDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgTW9kYWwuY3JlYXRlRGlhbG9nKFBvbGxIaXN0b3J5RGlhbG9nLCB7XG4gICAgICAgICAgICByb29tLFxuICAgICAgICAgICAgbWF0cml4Q2xpZW50OiBjbGksXG4gICAgICAgICAgICBwZXJtYWxpbmtDcmVhdG9yLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3Qgb25MZWF2ZVJvb21DbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgZGVmYXVsdERpc3BhdGNoZXIuZGlzcGF0Y2goe1xuICAgICAgICAgICAgYWN0aW9uOiBcImxlYXZlX3Jvb21cIixcbiAgICAgICAgICAgIHJvb21faWQ6IHJvb20ucm9vbUlkLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaXNSb29tRW5jcnlwdGVkID0gdXNlSXNFbmNyeXB0ZWQoY2xpLCByb29tKTtcbiAgICBjb25zdCByb29tQ29udGV4dCA9IHVzZUNvbnRleHQoUm9vbUNvbnRleHQpO1xuICAgIGNvbnN0IGUyZVN0YXR1cyA9IHJvb21Db250ZXh0LmUyZVN0YXR1cztcbiAgICBjb25zdCBpc1ZpZGVvUm9vbSA9IGNhbGNJc1ZpZGVvUm9vbShyb29tKTtcblxuICAgIGNvbnN0IHJvb21TdGF0ZSA9IHVzZVJvb21TdGF0ZShyb29tKTtcbiAgICBjb25zdCBkaXJlY3RSb29tc0xpc3QgPSB1c2VBY2NvdW50RGF0YTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KHJvb20uY2xpZW50LCBFdmVudFR5cGUuRGlyZWN0KTtcbiAgICBjb25zdCBbaXNEaXJlY3RNZXNzYWdlLCBzZXREaXJlY3RNZXNzYWdlXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFssIGRtUm9vbUxpc3RdIG9mIE9iamVjdC5lbnRyaWVzKGRpcmVjdFJvb21zTGlzdCkpIHtcbiAgICAgICAgICAgIGlmIChkbVJvb21MaXN0LmluY2x1ZGVzKHJvb20/LnJvb21JZCA/PyBcIlwiKSkge1xuICAgICAgICAgICAgICAgIHNldERpcmVjdE1lc3NhZ2UodHJ1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCBbcm9vbSwgZGlyZWN0Um9vbXNMaXN0XSk7XG5cbiAgICBjb25zdCBzZWFyY2hJbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcbiAgICB1c2VEaXNwYXRjaGVyKGRlZmF1bHREaXNwYXRjaGVyLCAocGF5bG9hZCkgPT4ge1xuICAgICAgICBpZiAocGF5bG9hZC5hY3Rpb24gPT09IEFjdGlvbi5Gb2N1c01lc3NhZ2VTZWFyY2gpIHtcbiAgICAgICAgICAgIHNlYXJjaElucHV0UmVmLmN1cnJlbnQ/LmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBDbGVhciB0aGUgc2VhcmNoIGZpZWxkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBzZWFyY2ggdmlld1xuICAgIHVzZVRyYW5zaXRpb24oXG4gICAgICAgIChwcmV2VGltZWxpbmVSZW5kZXJpbmdUeXBlKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgcHJldlRpbWVsaW5lUmVuZGVyaW5nVHlwZSA9PT0gVGltZWxpbmVSZW5kZXJpbmdUeXBlLlNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIHJvb21Db250ZXh0LnRpbWVsaW5lUmVuZGVyaW5nVHlwZSAhPT0gVGltZWxpbmVSZW5kZXJpbmdUeXBlLlNlYXJjaCAmJlxuICAgICAgICAgICAgICAgIHNlYXJjaElucHV0UmVmLmN1cnJlbnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHNlYXJjaElucHV0UmVmLmN1cnJlbnQudmFsdWUgPSBcIlwiO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbcm9vbUNvbnRleHQudGltZWxpbmVSZW5kZXJpbmdUeXBlXSxcbiAgICApO1xuXG4gICAgY29uc3QgYWxpYXMgPSByb29tLmdldENhbm9uaWNhbEFsaWFzKCkgfHwgcm9vbS5nZXRBbHRBbGlhc2VzKClbMF0gfHwgXCJcIjtcbiAgICBjb25zdCByb29tSW5mbyA9IChcbiAgICAgICAgPGhlYWRlciBjbGFzc05hbWU9XCJteF9Sb29tU3VtbWFyeUNhcmRfY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8Um9vbUF2YXRhciByb29tPXtyb29tfSBzaXplPVwiODBweFwiIHZpZXdBdmF0YXJPbkNsaWNrIC8+XG4gICAgICAgICAgICA8Um9vbU5hbWUgcm9vbT17cm9vbX0+XG4gICAgICAgICAgICAgICAgeyhuYW1lKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgIDxIZWFkaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICBhcz1cImgxXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemU9XCJtZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHQ9XCJzZW1pYm9sZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Sb29tU3VtbWFyeUNhcmRfcm9vbU5hbWUgdGV4dC1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPXtuYW1lfVxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICB7bmFtZX1cbiAgICAgICAgICAgICAgICAgICAgPC9IZWFkaW5nPlxuICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8L1Jvb21OYW1lPlxuICAgICAgICAgICAgPFRleHRcbiAgICAgICAgICAgICAgICBhcz1cImRpdlwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNtXCJcbiAgICAgICAgICAgICAgICB3ZWlnaHQ9XCJzZW1pYm9sZFwiXG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkX2FsaWFzIHRleHQtc2Vjb25kYXJ5XCJcbiAgICAgICAgICAgICAgICB0aXRsZT17YWxpYXN9XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAge2FsaWFzfVxuICAgICAgICAgICAgPC9UZXh0PlxuXG4gICAgICAgICAgICA8RmxleCBhcz1cInNlY3Rpb25cIiBqdXN0aWZ5PVwiY2VudGVyXCIgZ2FwPVwidmFyKC0tY3BkLXNwYWNlLTJ4KVwiIGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9iYWRnZXNcIj5cbiAgICAgICAgICAgICAgICB7IWlzRGlyZWN0TWVzc2FnZSAmJiByb29tU3RhdGUuZ2V0Sm9pblJ1bGUoKSA9PT0gSm9pblJ1bGUuUHVibGljICYmIChcbiAgICAgICAgICAgICAgICAgICAgPEJhZGdlIGtpbmQ9XCJncmV5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8UHVibGljSWNvbiB3aWR0aD1cIjFlbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJjb21tb258cHVibGljX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgIHtpc1Jvb21FbmNyeXB0ZWQgJiYgZTJlU3RhdHVzICE9PSBFMkVTdGF0dXMuV2FybmluZyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxCYWRnZSBraW5kPVwiZ3JlZW5cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxMb2NrSWNvbiB3aWR0aD1cIjFlbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJjb21tb258ZW5jcnlwdGVkXCIpfVxuICAgICAgICAgICAgICAgICAgICA8L0JhZGdlPlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICB7IWUyZVN0YXR1cyAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDxCYWRnZSBraW5kPVwiZ3JleVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPExvY2tPZmZJY29uIHdpZHRoPVwiMWVtXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImNvbW1vbnx1bmVuY3J5cHRlZFwiKX1cbiAgICAgICAgICAgICAgICAgICAgPC9CYWRnZT5cbiAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAge2UyZVN0YXR1cyA9PT0gRTJFU3RhdHVzLldhcm5pbmcgJiYgKFxuICAgICAgICAgICAgICAgICAgICA8QmFkZ2Uga2luZD1cInJlZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPEVycm9ySWNvbiB3aWR0aD1cIjFlbVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJjb21tb258bm90X3RydXN0ZWRcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQmFkZ2U+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvRmxleD5cblxuICAgICAgICAgICAgPFJvb21Ub3BpYyByb29tPXtyb29tfSAvPlxuICAgICAgICA8L2hlYWRlcj5cbiAgICApO1xuXG4gICAgY29uc3QgcGluQ291bnQgPSB1c2VQaW5uZWRFdmVudHMocm9vbSkubGVuZ3RoO1xuXG4gICAgY29uc3Qgcm9vbVRhZ3MgPSB1c2VFdmVudEVtaXR0ZXJTdGF0ZShSb29tTGlzdFN0b3JlLmluc3RhbmNlLCBMSVNUU19VUERBVEVfRVZFTlQsICgpID0+XG4gICAgICAgIFJvb21MaXN0U3RvcmUuaW5zdGFuY2UuZ2V0VGFnc0ZvclJvb20ocm9vbSksXG4gICAgKTtcbiAgICBjb25zdCBjYW5JbnZpdGVUb1N0YXRlID0gdXNlRXZlbnRFbWl0dGVyU3RhdGUocm9vbSwgUm9vbVN0YXRlRXZlbnQuVXBkYXRlLCAoKSA9PiBjYW5JbnZpdGVUbyhyb29tKSk7XG4gICAgY29uc3QgaXNGYXZvcml0ZSA9IHJvb21UYWdzLmluY2x1ZGVzKERlZmF1bHRUYWdJRC5GYXZvdXJpdGUpO1xuXG4gICAgY29uc3QgaGVhZGVyID0gb25TZWFyY2hDaGFuZ2UgJiYgKFxuICAgICAgICA8Rm9ybS5Sb290IGNsYXNzTmFtZT1cIm14X1Jvb21TdW1tYXJ5Q2FyZF9zZWFyY2hcIiBvblN1Ym1pdD17KGUpID0+IGUucHJldmVudERlZmF1bHQoKX0+XG4gICAgICAgICAgICA8U2VhcmNoXG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e190KFwicm9vbXxzZWFyY2h8cGxhY2Vob2xkZXJcIil9XG4gICAgICAgICAgICAgICAgbmFtZT1cInJvb21fbWVzc2FnZV9zZWFyY2hcIlxuICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXtvblNlYXJjaENoYW5nZX1cbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9ub190ZXh0aW5wdXRcIlxuICAgICAgICAgICAgICAgIHJlZj17c2VhcmNoSW5wdXRSZWZ9XG4gICAgICAgICAgICAgICAgYXV0b0ZvY3VzPXtmb2N1c1Jvb21TZWFyY2h9XG4gICAgICAgICAgICAgICAgb25LZXlEb3duPXsoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoSW5wdXRSZWYuY3VycmVudCAmJiBlLmtleSA9PT0gS2V5LkVTQ0FQRSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoSW5wdXRSZWYuY3VycmVudC52YWx1ZSA9IFwiXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBvblNlYXJjaENhbmNlbD8uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC9Gb3JtLlJvb3Q+XG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxCYXNlQ2FyZFxuICAgICAgICAgICAgaWQ9XCJyb29tLXN1bW1hcnktcGFuZWxcIlxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbVN1bW1hcnlDYXJkXCJcbiAgICAgICAgICAgIGFyaWFMYWJlbGxlZEJ5PVwicm9vbS1zdW1tYXJ5LXBhbmVsLXRhYlwiXG4gICAgICAgICAgICByb2xlPVwidGFicGFuZWxcIlxuICAgICAgICAgICAgaGVhZGVyPXtoZWFkZXJ9XG4gICAgICAgID5cbiAgICAgICAgICAgIHtyb29tSW5mb31cblxuICAgICAgICAgICAgPFNlcGFyYXRvciAvPlxuXG4gICAgICAgICAgICA8ZGl2IHJvbGU9XCJtZW51YmFyXCIgYXJpYS1vcmllbnRhdGlvbj1cInZlcnRpY2FsXCI+XG4gICAgICAgICAgICAgICAgPFRvZ2dsZU1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgIEljb249e0Zhdm91cml0ZUljb259XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInJvb218Y29udGV4dF9tZW51fGZhdm91cml0ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZD17aXNGYXZvcml0ZX1cbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9eygpID0+IHRhZ1Jvb20ocm9vbSwgRGVmYXVsdFRhZ0lELkZhdm91cml0ZSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8TWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgSWNvbj17VXNlckFkZEljb259XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImFjdGlvbnxpbnZpdGVcIil9XG4gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXshY2FuSW52aXRlVG9TdGF0ZX1cbiAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9eygpID0+IGludml0ZVRvUm9vbShyb29tKX1cbiAgICAgICAgICAgICAgICAvPlxuXG4gICAgICAgICAgICAgICAgPFNlcGFyYXRvciAvPlxuXG4gICAgICAgICAgICAgICAgPE1lbnVJdGVtIEljb249e1VzZXJQcm9maWxlSWNvbn0gbGFiZWw9e190KFwiY29tbW9ufHBlb3BsZVwiKX0gb25TZWxlY3Q9e29uUm9vbU1lbWJlcnNDbGlja30gLz5cbiAgICAgICAgICAgICAgICA8TWVudUl0ZW0gSWNvbj17VGhyZWFkc0ljb259IGxhYmVsPXtfdChcImNvbW1vbnx0aHJlYWRzXCIpfSBvblNlbGVjdD17b25Sb29tVGhyZWFkc0NsaWNrfSAvPlxuICAgICAgICAgICAgICAgIHshaXNWaWRlb1Jvb20gJiYgKFxuICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgPFJlbGVhc2VBbm5vdW5jZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlPVwicGlubmluZ01lc3NhZ2VMaXN0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9e190KFwicmlnaHRfcGFuZWx8cGlubmVkX21lc3NhZ2VzfHJlbGVhc2VfYW5ub3VuY2VtZW50fHRpdGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc3xyZWxlYXNlX2Fubm91bmNlbWVudHxkZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZUxhYmVsPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc3xyZWxlYXNlX2Fubm91bmNlbWVudHxjbG9zZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbj17UGluSWNvbn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcInJpZ2h0X3BhbmVsfHBpbm5lZF9tZXNzYWdlc19idXR0b25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblNlbGVjdD17b25Sb29tUGluc0NsaWNrfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dCBhcz1cInNwYW5cIiBzaXplPVwic21cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cGluQ291bnR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvTWVudUl0ZW0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L1JlbGVhc2VBbm5vdW5jZW1lbnQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW0gSWNvbj17RmlsZXNJY29ufSBsYWJlbD17X3QoXCJyaWdodF9wYW5lbHxmaWxlc19idXR0b25cIil9IG9uU2VsZWN0PXtvblJvb21GaWxlc0NsaWNrfSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgSWNvbj17RXh0ZW5zaW9uc0ljb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwicmlnaHRfcGFuZWx8ZXh0ZW5zaW9uc19idXR0b25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9e29uUm9vbUV4dGVuc2lvbnNDbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICA8U2VwYXJhdG9yIC8+XG5cbiAgICAgICAgICAgICAgICA8TWVudUl0ZW0gSWNvbj17TGlua0ljb259IGxhYmVsPXtfdChcImFjdGlvbnxjb3B5X2xpbmtcIil9IG9uU2VsZWN0PXtvblNoYXJlUm9vbUNsaWNrfSAvPlxuXG4gICAgICAgICAgICAgICAgeyFpc1ZpZGVvUm9vbSAmJiAoXG4gICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8TWVudUl0ZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJY29uPXtQb2xsc0ljb259XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwicmlnaHRfcGFuZWx8cG9sbHNfYnV0dG9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtvblJvb21Qb2xsSGlzdG9yeUNsaWNrfVxuICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxNZW51SXRlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEljb249e0V4cG9ydEFyY2hpdmVJY29ufVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsPXtfdChcImV4cG9ydF9jaGF0fHRpdGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtvblJvb21FeHBvcnRDbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICl9XG5cbiAgICAgICAgICAgICAgICA8TWVudUl0ZW0gSWNvbj17U2V0dGluZ3NJY29ufSBsYWJlbD17X3QoXCJjb21tb258c2V0dGluZ3NcIil9IG9uU2VsZWN0PXtvblJvb21TZXR0aW5nc0NsaWNrfSAvPlxuXG4gICAgICAgICAgICAgICAgPFNlcGFyYXRvciAvPlxuXG4gICAgICAgICAgICAgICAgPE1lbnVJdGVtXG4gICAgICAgICAgICAgICAgICAgIEljb249e0xlYXZlSWNvbn1cbiAgICAgICAgICAgICAgICAgICAga2luZD1cImNyaXRpY2FsXCJcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiYWN0aW9ufGxlYXZlX3Jvb21cIil9XG4gICAgICAgICAgICAgICAgICAgIG9uU2VsZWN0PXtvbkxlYXZlUm9vbUNsaWNrfVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9CYXNlQ2FyZD5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUm9vbVN1bW1hcnlDYXJkO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsV0FBQSxHQUFBQyxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUcsWUFBQSxHQUFBSCxPQUFBO0FBWUEsSUFBQUksVUFBQSxHQUFBRixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQUssUUFBQSxHQUFBSCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU0sS0FBQSxHQUFBSixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQU8sU0FBQSxHQUFBTCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVEsY0FBQSxHQUFBTixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVMsTUFBQSxHQUFBUCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVUsTUFBQSxHQUFBUixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVcsV0FBQSxHQUFBVCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQVksWUFBQSxHQUFBVixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWEsUUFBQSxHQUFBWCxzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWMsTUFBQSxHQUFBWixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWUsSUFBQSxHQUFBYixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQWdCLFVBQUEsR0FBQWQsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFpQixRQUFBLEdBQUFmLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBa0IsT0FBQSxHQUFBaEIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUFtQixNQUFBLEdBQUFqQixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQW9CLFlBQUEsR0FBQWxCLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBcUIsT0FBQSxHQUFBckIsT0FBQTtBQUVBLElBQUFzQixvQkFBQSxHQUFBcEIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUF1QixlQUFBLEdBQUF2QixPQUFBO0FBQ0EsSUFBQXdCLFNBQUEsR0FBQXRCLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBeUIsZ0JBQUEsR0FBQXpCLE9BQUE7QUFDQSxJQUFBMEIsV0FBQSxHQUFBeEIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUEyQixXQUFBLEdBQUF6QixzQkFBQSxDQUFBRixPQUFBO0FBQ0EsSUFBQTRCLHNCQUFBLEdBQUE1QixPQUFBO0FBQ0EsSUFBQTZCLE1BQUEsR0FBQTNCLHNCQUFBLENBQUFGLE9BQUE7QUFDQSxJQUFBOEIsWUFBQSxHQUFBNUIsc0JBQUEsQ0FBQUYsT0FBQTtBQUNBLElBQUErQixnQkFBQSxHQUFBL0IsT0FBQTtBQUNBLElBQUFnQyxZQUFBLEdBQUFoQyxPQUFBO0FBRUEsSUFBQWlDLFlBQUEsR0FBQWxDLHVCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFB