UNPKG

matrix-react-sdk

Version:
214 lines (211 loc) 44.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireWildcard(require("react")); var _logger = require("matrix-js-sdk/src/logger"); var _languageHandler = require("../../../../../languageHandler"); var _AccessibleButton = _interopRequireDefault(require("../../../elements/AccessibleButton")); var _Notifier = _interopRequireDefault(require("../../../../../Notifier")); var _SettingsStore = _interopRequireDefault(require("../../../../../settings/SettingsStore")); var _SettingLevel = require("../../../../../settings/SettingLevel"); var _EchoChamber = require("../../../../../stores/local-echo/EchoChamber"); var _MatrixClientContext = _interopRequireDefault(require("../../../../../contexts/MatrixClientContext")); var _StyledRadioGroup = _interopRequireDefault(require("../../../elements/StyledRadioGroup")); var _RoomNotifs = require("../../../../../RoomNotifs"); var _dispatcher = _interopRequireDefault(require("../../../../../dispatcher/dispatcher")); var _actions = require("../../../../../dispatcher/actions"); var _UserTab = require("../../../dialogs/UserTab"); var _BrowserWorkarounds = require("../../../../../utils/BrowserWorkarounds"); var _SettingsTab = _interopRequireDefault(require("../SettingsTab")); var _SettingsSection = require("../../shared/SettingsSection"); var _SettingsSubsection = _interopRequireDefault(require("../../shared/SettingsSubsection")); 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 2019-2021 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ class NotificationsSettingsTab extends _react.default.Component { constructor(props, context) { super(props, context); (0, _defineProperty2.default)(this, "roomProps", void 0); (0, _defineProperty2.default)(this, "soundUpload", /*#__PURE__*/(0, _react.createRef)()); (0, _defineProperty2.default)(this, "triggerUploader", async e => { e.stopPropagation(); e.preventDefault(); this.soundUpload.current?.click(); }); (0, _defineProperty2.default)(this, "onSoundUploadChanged", e => { if (!e.target.files || !e.target.files.length) { this.setState({ uploadedFile: null }); return; } const file = e.target.files[0]; this.setState({ uploadedFile: file }); }); (0, _defineProperty2.default)(this, "onClickSaveSound", async e => { e.stopPropagation(); e.preventDefault(); try { await this.saveSound(); } catch (ex) { _logger.logger.error(`Unable to save notification sound for ${this.props.roomId}`); _logger.logger.error(ex); } }); (0, _defineProperty2.default)(this, "clearSound", e => { e.stopPropagation(); e.preventDefault(); _SettingsStore.default.setValue("notificationSound", this.props.roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, null); this.setState({ currentSound: "default" }); }); (0, _defineProperty2.default)(this, "onRoomNotificationChange", value => { this.roomProps.notificationVolume = value; this.forceUpdate(); }); (0, _defineProperty2.default)(this, "onOpenSettingsClick", event => { // avoid selecting the radio button event.preventDefault(); this.props.closeSettingsFn(); _dispatcher.default.dispatch({ action: _actions.Action.ViewUserSettings, initialTabId: _UserTab.UserTab.Notifications }); }); this.roomProps = _EchoChamber.EchoChamber.forRoom(context.getRoom(this.props.roomId)); let currentSound = "default"; const soundData = _Notifier.default.getSoundForRoom(this.props.roomId); if (soundData) { currentSound = soundData.name || soundData.url; } this.state = { currentSound, uploadedFile: null }; } async saveSound() { if (!this.state.uploadedFile) { return; } let type = this.state.uploadedFile.type; if (type === "video/ogg") { // XXX: I've observed browsers allowing users to pick a audio/ogg files, // and then calling it a video/ogg. This is a lame hack, but man browsers // suck at detecting mimetypes. type = "audio/ogg"; } const { content_uri: url } = await this.context.uploadContent(this.state.uploadedFile, { type }); await _SettingsStore.default.setValue("notificationSound", this.props.roomId, _SettingLevel.SettingLevel.ROOM_ACCOUNT, { name: this.state.uploadedFile.name, type: type, size: this.state.uploadedFile.size, url }); this.setState({ uploadedFile: null, currentSound: this.state.uploadedFile.name }); } render() { let currentUploadedFile; if (this.state.uploadedFile) { currentUploadedFile = /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("room_settings|notifications|uploaded_sound"), ": ", /*#__PURE__*/_react.default.createElement("code", null, this.state.uploadedFile.name))); } return /*#__PURE__*/_react.default.createElement(_SettingsTab.default, null, /*#__PURE__*/_react.default.createElement(_SettingsSection.SettingsSection, { heading: (0, _languageHandler._t)("notifications|enable_prompt_toast_title") }, /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettingsTab_notificationsSection" }, /*#__PURE__*/_react.default.createElement(_StyledRadioGroup.default, { name: "roomNotificationSetting", definitions: [{ value: _RoomNotifs.RoomNotifState.AllMessages, className: "mx_NotificationSettingsTab_defaultEntry", label: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("notifications|default"), /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettingsTab_microCopy" }, (0, _languageHandler._t)("room_settings|notifications|settings_link", {}, { a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link_inline", onClick: this.onOpenSettingsClick }, sub) }))) }, { value: _RoomNotifs.RoomNotifState.AllMessagesLoud, className: "mx_NotificationSettingsTab_allMessagesEntry", label: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("notifications|all_messages"), /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettingsTab_microCopy" }, (0, _languageHandler._t)("notifications|all_messages_description"))) }, { value: _RoomNotifs.RoomNotifState.MentionsOnly, className: "mx_NotificationSettingsTab_mentionsKeywordsEntry", label: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("notifications|mentions_and_keywords"), /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettingsTab_microCopy" }, (0, _languageHandler._t)("notifications|mentions_and_keywords_description", {}, { a: sub => /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { kind: "link_inline", onClick: this.onOpenSettingsClick }, sub) }))) }, { value: _RoomNotifs.RoomNotifState.Mute, className: "mx_NotificationSettingsTab_noneEntry", label: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _languageHandler._t)("common|off"), /*#__PURE__*/_react.default.createElement("div", { className: "mx_NotificationSettingsTab_microCopy" }, (0, _languageHandler._t)("notifications|mute_description"))) }], onChange: this.onRoomNotificationChange, value: this.roomProps.notificationVolume })), /*#__PURE__*/_react.default.createElement(_SettingsSubsection.default, { heading: (0, _languageHandler._t)("room_settings|notifications|sounds_section") }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsTab_subsectionText" }, /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("room_settings|notifications|notification_sound"), ":", " ", /*#__PURE__*/_react.default.createElement("code", null, this.state.currentSound))), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_NotificationSound_resetSound", disabled: this.state.currentSound == "default", onClick: this.clearSound, kind: "primary" }, (0, _languageHandler._t)("action|reset"))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("h4", { className: "mx_Heading_h4" }, (0, _languageHandler._t)("room_settings|notifications|custom_sound_prompt")), /*#__PURE__*/_react.default.createElement("div", { className: "mx_SettingsFlag" }, /*#__PURE__*/_react.default.createElement("form", { autoComplete: "off", noValidate: true }, /*#__PURE__*/_react.default.createElement("input", { ref: this.soundUpload, className: "mx_NotificationSound_soundUpload", type: "file", onClick: _BrowserWorkarounds.chromeFileInputFix, onChange: this.onSoundUploadChanged, accept: "audio/*", "aria-label": (0, _languageHandler._t)("room_settings|notifications|upload_sound_label") })), currentUploadedFile), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_NotificationSound_browse", onClick: this.triggerUploader, kind: "primary" }, (0, _languageHandler._t)("room_settings|notifications|browse_button")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, { className: "mx_NotificationSound_save", disabled: this.state.uploadedFile == null, onClick: this.onClickSaveSound, kind: "primary" }, (0, _languageHandler._t)("action|save")), /*#__PURE__*/_react.default.createElement("br", null))))); } } exports.default = NotificationsSettingsTab; (0, _defineProperty2.default)(NotificationsSettingsTab, "contextType", _MatrixClientContext.default); //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9BY2Nlc3NpYmxlQnV0dG9uIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9Ob3RpZmllciIsIl9TZXR0aW5nc1N0b3JlIiwiX1NldHRpbmdMZXZlbCIsIl9FY2hvQ2hhbWJlciIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX1N0eWxlZFJhZGlvR3JvdXAiLCJfUm9vbU5vdGlmcyIsIl9kaXNwYXRjaGVyIiwiX2FjdGlvbnMiLCJfVXNlclRhYiIsIl9Ccm93c2VyV29ya2Fyb3VuZHMiLCJfU2V0dGluZ3NUYWIiLCJfU2V0dGluZ3NTZWN0aW9uIiwiX1NldHRpbmdzU3Vic2VjdGlvbiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIk5vdGlmaWNhdGlvbnNTZXR0aW5nc1RhYiIsIlJlYWN0IiwiQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImNvbnRleHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiY3JlYXRlUmVmIiwic3RvcFByb3BhZ2F0aW9uIiwicHJldmVudERlZmF1bHQiLCJzb3VuZFVwbG9hZCIsImN1cnJlbnQiLCJjbGljayIsInRhcmdldCIsImZpbGVzIiwibGVuZ3RoIiwic2V0U3RhdGUiLCJ1cGxvYWRlZEZpbGUiLCJmaWxlIiwic2F2ZVNvdW5kIiwiZXgiLCJsb2dnZXIiLCJlcnJvciIsInJvb21JZCIsIlNldHRpbmdzU3RvcmUiLCJzZXRWYWx1ZSIsIlNldHRpbmdMZXZlbCIsIlJPT01fQUNDT1VOVCIsImN1cnJlbnRTb3VuZCIsInZhbHVlIiwicm9vbVByb3BzIiwibm90aWZpY2F0aW9uVm9sdW1lIiwiZm9yY2VVcGRhdGUiLCJldmVudCIsImNsb3NlU2V0dGluZ3NGbiIsImRlZmF1bHREaXNwYXRjaGVyIiwiZGlzcGF0Y2giLCJhY3Rpb24iLCJBY3Rpb24iLCJWaWV3VXNlclNldHRpbmdzIiwiaW5pdGlhbFRhYklkIiwiVXNlclRhYiIsIk5vdGlmaWNhdGlvbnMiLCJFY2hvQ2hhbWJlciIsImZvclJvb20iLCJnZXRSb29tIiwic291bmREYXRhIiwiTm90aWZpZXIiLCJnZXRTb3VuZEZvclJvb20iLCJuYW1lIiwidXJsIiwic3RhdGUiLCJ0eXBlIiwiY29udGVudF91cmkiLCJ1cGxvYWRDb250ZW50Iiwic2l6ZSIsInJlbmRlciIsImN1cnJlbnRVcGxvYWRlZEZpbGUiLCJjcmVhdGVFbGVtZW50IiwiX3QiLCJTZXR0aW5nc1NlY3Rpb24iLCJoZWFkaW5nIiwiY2xhc3NOYW1lIiwiZGVmaW5pdGlvbnMiLCJSb29tTm90aWZTdGF0ZSIsIkFsbE1lc3NhZ2VzIiwibGFiZWwiLCJGcmFnbWVudCIsInN1YiIsImtpbmQiLCJvbkNsaWNrIiwib25PcGVuU2V0dGluZ3NDbGljayIsIkFsbE1lc3NhZ2VzTG91ZCIsIk1lbnRpb25zT25seSIsIk11dGUiLCJvbkNoYW5nZSIsIm9uUm9vbU5vdGlmaWNhdGlvbkNoYW5nZSIsImRpc2FibGVkIiwiY2xlYXJTb3VuZCIsImF1dG9Db21wbGV0ZSIsIm5vVmFsaWRhdGUiLCJyZWYiLCJjaHJvbWVGaWxlSW5wdXRGaXgiLCJvblNvdW5kVXBsb2FkQ2hhbmdlZCIsImFjY2VwdCIsInRyaWdnZXJVcGxvYWRlciIsIm9uQ2xpY2tTYXZlU291bmQiLCJleHBvcnRzIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3NldHRpbmdzL3RhYnMvcm9vbS9Ob3RpZmljYXRpb25TZXR0aW5nc1RhYi50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTktMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgY3JlYXRlUmVmIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5cbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vLi4vLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IE5vdGlmaWVyIGZyb20gXCIuLi8uLi8uLi8uLi8uLi9Ob3RpZmllclwiO1xuaW1wb3J0IFNldHRpbmdzU3RvcmUgZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3NldHRpbmdzL1NldHRpbmdzU3RvcmVcIjtcbmltcG9ydCB7IFNldHRpbmdMZXZlbCB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zZXR0aW5ncy9TZXR0aW5nTGV2ZWxcIjtcbmltcG9ydCB7IFJvb21FY2hvQ2hhbWJlciB9IGZyb20gXCIuLi8uLi8uLi8uLi8uLi9zdG9yZXMvbG9jYWwtZWNoby9Sb29tRWNob0NoYW1iZXJcIjtcbmltcG9ydCB7IEVjaG9DaGFtYmVyIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3N0b3Jlcy9sb2NhbC1lY2hvL0VjaG9DaGFtYmVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IFN0eWxlZFJhZGlvR3JvdXAgZnJvbSBcIi4uLy4uLy4uL2VsZW1lbnRzL1N0eWxlZFJhZGlvR3JvdXBcIjtcbmltcG9ydCB7IFJvb21Ob3RpZlN0YXRlIH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL1Jvb21Ob3RpZnNcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vLi4vLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgeyBVc2VyVGFiIH0gZnJvbSBcIi4uLy4uLy4uL2RpYWxvZ3MvVXNlclRhYlwiO1xuaW1wb3J0IHsgY2hyb21lRmlsZUlucHV0Rml4IH0gZnJvbSBcIi4uLy4uLy4uLy4uLy4uL3V0aWxzL0Jyb3dzZXJXb3JrYXJvdW5kc1wiO1xuaW1wb3J0IFNldHRpbmdzVGFiIGZyb20gXCIuLi9TZXR0aW5nc1RhYlwiO1xuaW1wb3J0IHsgU2V0dGluZ3NTZWN0aW9uIH0gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1NlY3Rpb25cIjtcbmltcG9ydCBTZXR0aW5nc1N1YnNlY3Rpb24gZnJvbSBcIi4uLy4uL3NoYXJlZC9TZXR0aW5nc1N1YnNlY3Rpb25cIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgcm9vbUlkOiBzdHJpbmc7XG4gICAgY2xvc2VTZXR0aW5nc0ZuKCk6IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIGN1cnJlbnRTb3VuZDogc3RyaW5nO1xuICAgIHVwbG9hZGVkRmlsZTogRmlsZSB8IG51bGw7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vdGlmaWNhdGlvbnNTZXR0aW5nc1RhYiBleHRlbmRzIFJlYWN0LkNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgcm9vbVByb3BzOiBSb29tRWNob0NoYW1iZXI7XG4gICAgcHJpdmF0ZSBzb3VuZFVwbG9hZCA9IGNyZWF0ZVJlZjxIVE1MSW5wdXRFbGVtZW50PigpO1xuXG4gICAgcHVibGljIHN0YXRpYyBjb250ZXh0VHlwZSA9IE1hdHJpeENsaWVudENvbnRleHQ7XG4gICAgcHVibGljIGRlY2xhcmUgY29udGV4dDogUmVhY3QuQ29udGV4dFR5cGU8dHlwZW9mIE1hdHJpeENsaWVudENvbnRleHQ+O1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByb3BzOiBJUHJvcHMsIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBNYXRyaXhDbGllbnRDb250ZXh0Pikge1xuICAgICAgICBzdXBlcihwcm9wcywgY29udGV4dCk7XG5cbiAgICAgICAgdGhpcy5yb29tUHJvcHMgPSBFY2hvQ2hhbWJlci5mb3JSb29tKGNvbnRleHQuZ2V0Um9vbSh0aGlzLnByb3BzLnJvb21JZCkhKTtcblxuICAgICAgICBsZXQgY3VycmVudFNvdW5kID0gXCJkZWZhdWx0XCI7XG4gICAgICAgIGNvbnN0IHNvdW5kRGF0YSA9IE5vdGlmaWVyLmdldFNvdW5kRm9yUm9vbSh0aGlzLnByb3BzLnJvb21JZCk7XG4gICAgICAgIGlmIChzb3VuZERhdGEpIHtcbiAgICAgICAgICAgIGN1cnJlbnRTb3VuZCA9IHNvdW5kRGF0YS5uYW1lIHx8IHNvdW5kRGF0YS51cmw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgY3VycmVudFNvdW5kLFxuICAgICAgICAgICAgdXBsb2FkZWRGaWxlOiBudWxsLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlclVwbG9hZGVyID0gYXN5bmMgKGU6IEJ1dHRvbkV2ZW50KTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICB0aGlzLnNvdW5kVXBsb2FkLmN1cnJlbnQ/LmNsaWNrKCk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Tb3VuZFVwbG9hZENoYW5nZWQgPSAoZTogUmVhY3QuQ2hhbmdlRXZlbnQ8SFRNTElucHV0RWxlbWVudD4pOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFlLnRhcmdldC5maWxlcyB8fCAhZS50YXJnZXQuZmlsZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgICAgICB1cGxvYWRlZEZpbGU6IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpbGUgPSBlLnRhcmdldC5maWxlc1swXTtcbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgICAgICAgICB1cGxvYWRlZEZpbGU6IGZpbGUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uQ2xpY2tTYXZlU291bmQgPSBhc3luYyAoZTogQnV0dG9uRXZlbnQpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLnNhdmVTb3VuZCgpO1xuICAgICAgICB9IGNhdGNoIChleCkge1xuICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBVbmFibGUgdG8gc2F2ZSBub3RpZmljYXRpb24gc291bmQgZm9yICR7dGhpcy5wcm9wcy5yb29tSWR9YCk7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXgpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgYXN5bmMgc2F2ZVNvdW5kKCk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBpZiAoIXRoaXMuc3RhdGUudXBsb2FkZWRGaWxlKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgdHlwZSA9IHRoaXMuc3RhdGUudXBsb2FkZWRGaWxlLnR5cGU7XG4gICAgICAgIGlmICh0eXBlID09PSBcInZpZGVvL29nZ1wiKSB7XG4gICAgICAgICAgICAvLyBYWFg6IEkndmUgb2JzZXJ2ZWQgYnJvd3NlcnMgYWxsb3dpbmcgdXNlcnMgdG8gcGljayBhIGF1ZGlvL29nZyBmaWxlcyxcbiAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNhbGxpbmcgaXQgYSB2aWRlby9vZ2cuIFRoaXMgaXMgYSBsYW1lIGhhY2ssIGJ1dCBtYW4gYnJvd3NlcnNcbiAgICAgICAgICAgIC8vIHN1Y2sgYXQgZGV0ZWN0aW5nIG1pbWV0eXBlcy5cbiAgICAgICAgICAgIHR5cGUgPSBcImF1ZGlvL29nZ1wiO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBjb250ZW50X3VyaTogdXJsIH0gPSBhd2FpdCB0aGlzLmNvbnRleHQudXBsb2FkQ29udGVudCh0aGlzLnN0YXRlLnVwbG9hZGVkRmlsZSwge1xuICAgICAgICAgICAgdHlwZSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgYXdhaXQgU2V0dGluZ3NTdG9yZS5zZXRWYWx1ZShcIm5vdGlmaWNhdGlvblNvdW5kXCIsIHRoaXMucHJvcHMucm9vbUlkLCBTZXR0aW5nTGV2ZWwuUk9PTV9BQ0NPVU5ULCB7XG4gICAgICAgICAgICBuYW1lOiB0aGlzLnN0YXRlLnVwbG9hZGVkRmlsZS5uYW1lLFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHNpemU6IHRoaXMuc3RhdGUudXBsb2FkZWRGaWxlLnNpemUsXG4gICAgICAgICAgICB1cmwsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgdXBsb2FkZWRGaWxlOiBudWxsLFxuICAgICAgICAgICAgY3VycmVudFNvdW5kOiB0aGlzLnN0YXRlLnVwbG9hZGVkRmlsZS5uYW1lLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFyU291bmQgPSAoZTogQnV0dG9uRXZlbnQpOiB2b2lkID0+IHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBTZXR0aW5nc1N0b3JlLnNldFZhbHVlKFwibm90aWZpY2F0aW9uU291bmRcIiwgdGhpcy5wcm9wcy5yb29tSWQsIFNldHRpbmdMZXZlbC5ST09NX0FDQ09VTlQsIG51bGwpO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgY3VycmVudFNvdW5kOiBcImRlZmF1bHRcIixcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25Sb29tTm90aWZpY2F0aW9uQ2hhbmdlID0gKHZhbHVlOiBSb29tTm90aWZTdGF0ZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLnJvb21Qcm9wcy5ub3RpZmljYXRpb25Wb2x1bWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIG9uT3BlblNldHRpbmdzQ2xpY2sgPSAoZXZlbnQ6IEJ1dHRvbkV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAgIC8vIGF2b2lkIHNlbGVjdGluZyB0aGUgcmFkaW8gYnV0dG9uXG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMucHJvcHMuY2xvc2VTZXR0aW5nc0ZuKCk7XG4gICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdVc2VyU2V0dGluZ3MsXG4gICAgICAgICAgICBpbml0aWFsVGFiSWQ6IFVzZXJUYWIuTm90aWZpY2F0aW9ucyxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3ROb2RlIHtcbiAgICAgICAgbGV0IGN1cnJlbnRVcGxvYWRlZEZpbGU6IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS51cGxvYWRlZEZpbGUpIHtcbiAgICAgICAgICAgIGN1cnJlbnRVcGxvYWRlZEZpbGUgPSAoXG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJyb29tX3NldHRpbmdzfG5vdGlmaWNhdGlvbnN8dXBsb2FkZWRfc291bmRcIil9OiA8Y29kZT57dGhpcy5zdGF0ZS51cGxvYWRlZEZpbGUubmFtZX08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFNldHRpbmdzVGFiPlxuICAgICAgICAgICAgICAgIDxTZXR0aW5nc1NlY3Rpb24gaGVhZGluZz17X3QoXCJub3RpZmljYXRpb25zfGVuYWJsZV9wcm9tcHRfdG9hc3RfdGl0bGVcIil9PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNldHRpbmdzVGFiX25vdGlmaWNhdGlvbnNTZWN0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3R5bGVkUmFkaW9Hcm91cFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJyb29tTm90aWZpY2F0aW9uU2V0dGluZ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnM9e1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IFJvb21Ob3RpZlN0YXRlLkFsbE1lc3NhZ2VzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBcIm14X05vdGlmaWNhdGlvblNldHRpbmdzVGFiX2RlZmF1bHRFbnRyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJub3RpZmljYXRpb25zfGRlZmF1bHRcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfTm90aWZpY2F0aW9uU2V0dGluZ3NUYWJfbWljcm9Db3B5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyb29tX3NldHRpbmdzfG5vdGlmaWNhdGlvbnN8c2V0dGluZ3NfbGlua1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTogKHN1YikgPT4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEFjY2Vzc2libGVCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwibGlua19pbmxpbmVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25PcGVuU2V0dGluZ3NDbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBSb29tTm90aWZTdGF0ZS5BbGxNZXNzYWdlc0xvdWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwibXhfTm90aWZpY2F0aW9uU2V0dGluZ3NUYWJfYWxsTWVzc2FnZXNFbnRyeVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJub3RpZmljYXRpb25zfGFsbF9tZXNzYWdlc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Ob3RpZmljYXRpb25TZXR0aW5nc1RhYl9taWNyb0NvcHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcIm5vdGlmaWNhdGlvbnN8YWxsX21lc3NhZ2VzX2Rlc2NyaXB0aW9uXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiBSb29tTm90aWZTdGF0ZS5NZW50aW9uc09ubHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IFwibXhfTm90aWZpY2F0aW9uU2V0dGluZ3NUYWJfbWVudGlvbnNLZXl3b3Jkc0VudHJ5XCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcIm5vdGlmaWNhdGlvbnN8bWVudGlvbnNfYW5kX2tleXdvcmRzXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNldHRpbmdzVGFiX21pY3JvQ29weVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm90aWZpY2F0aW9uc3xtZW50aW9uc19hbmRfa2V5d29yZHNfZGVzY3JpcHRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGE6IChzdWIpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cImxpbmtfaW5saW5lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLm9uT3BlblNldHRpbmdzQ2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Yn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogUm9vbU5vdGlmU3RhdGUuTXV0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogXCJteF9Ob3RpZmljYXRpb25TZXR0aW5nc1RhYl9ub25lRW50cnlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiY29tbW9ufG9mZlwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Ob3RpZmljYXRpb25TZXR0aW5nc1RhYl9taWNyb0NvcHlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcIm5vdGlmaWNhdGlvbnN8bXV0ZV9kZXNjcmlwdGlvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9e3RoaXMub25Sb29tTm90aWZpY2F0aW9uQ2hhbmdlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXt0aGlzLnJvb21Qcm9wcy5ub3RpZmljYXRpb25Wb2x1bWV9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8U2V0dGluZ3NTdWJzZWN0aW9uIGhlYWRpbmc9e190KFwicm9vbV9zZXR0aW5nc3xub3RpZmljYXRpb25zfHNvdW5kc19zZWN0aW9uXCIpfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9TZXR0aW5nc1RhYl9zdWJzZWN0aW9uVGV4dFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInJvb21fc2V0dGluZ3N8bm90aWZpY2F0aW9uc3xub3RpZmljYXRpb25fc291bmRcIil9OntcIiBcIn1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb2RlPnt0aGlzLnN0YXRlLmN1cnJlbnRTb3VuZH08L2NvZGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Ob3RpZmljYXRpb25Tb3VuZF9yZXNldFNvdW5kXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUuY3VycmVudFNvdW5kID09IFwiZGVmYXVsdFwifVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNsaWNrPXt0aGlzLmNsZWFyU291bmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcImFjdGlvbnxyZXNldFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzTmFtZT1cIm14X0hlYWRpbmdfaDRcIj57X3QoXCJyb29tX3NldHRpbmdzfG5vdGlmaWNhdGlvbnN8Y3VzdG9tX3NvdW5kX3Byb21wdFwiKX08L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfU2V0dGluZ3NGbGFnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIGF1dG9Db21wbGV0ZT1cIm9mZlwiIG5vVmFsaWRhdGU9e3RydWV9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXt0aGlzLnNvdW5kVXBsb2FkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNvdW5kX3NvdW5kVXBsb2FkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwiZmlsZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17Y2hyb21lRmlsZUlucHV0Rml4fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXt0aGlzLm9uU291bmRVcGxvYWRDaGFuZ2VkfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdD1cImF1ZGlvLypcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtbGFiZWw9e190KFwicm9vbV9zZXR0aW5nc3xub3RpZmljYXRpb25zfHVwbG9hZF9zb3VuZF9sYWJlbFwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Y3VycmVudFVwbG9hZGVkRmlsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X05vdGlmaWNhdGlvblNvdW5kX2Jyb3dzZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMudHJpZ2dlclVwbG9hZGVyfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kPVwicHJpbWFyeVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJyb29tX3NldHRpbmdzfG5vdGlmaWNhdGlvbnN8YnJvd3NlX2J1dHRvblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Ob3RpZmljYXRpb25Tb3VuZF9zYXZlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e3RoaXMuc3RhdGUudXBsb2FkZWRGaWxlID09IG51bGx9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s9e3RoaXMub25DbGlja1NhdmVTb3VuZH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiYWN0aW9ufHNhdmVcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiciAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTdWJzZWN0aW9uPlxuICAgICAgICAgICAgICAgIDwvU2V0dGluZ3NTZWN0aW9uPlxuICAgICAgICAgICAgPC9TZXR0aW5nc1RhYj5cbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyx1QkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGlCQUFBLEdBQUFDLHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBSyxTQUFBLEdBQUFELHNCQUFBLENBQUFKLE9BQUE7QUFDQSxJQUFBTSxjQUFBLEdBQUFGLHNCQUFBLENB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TUFBQSxDQUFBMkIsT0FBQSxDQUFBd0UsYUFBQTtNQUFJSSxTQUFTLEVBQUM7SUFBZSxHQUFFLElBQUFILG1CQUFFLEVBQUMsaURBQWlELENBQU0sQ0FBQyxlQUMxRnBHLE1BQUEsQ0FBQTJCLE9BQUEsQ0FBQXdFLGFBQUE7TUFBS0ksU0FBUyxFQUFDO0lBQWlCLGdCQUM1QnZHLE1BQUEsQ0FBQTJCLE9BQUEsQ0FBQXdFLGFBQUE7TUFBTXFCLFlBQVksRUFBQyxLQUFLO01BQUNDLFVBQVUsRUFBRTtJQUFLLGdCQUN0Q3pILE1BQUEsQ0FBQTJCLE9BQUEsQ0FBQXdFLGFBQUE7TUFDSXVCLEdBQUcsRUFBRSxJQUFJLENBQUN2RSxXQUFZO01BQ3RCb0QsU0FBUyxFQUFDLGtDQUFrQztNQUM1Q1YsSUFBSSxFQUFDLE1BQU07TUFDWGtCLE9BQU8sRUFBRVksc0NBQW1CO01BQzVCUCxRQUFRLEVBQUUsSUFBSSxDQUFDUSxvQkFBcUI7TUFDcENDLE1BQU0sRUFBQyxTQUFTO01BQ2hCLGNBQVksSUFBQXpCLG1CQUFFLEVBQUMsZ0RBQWdEO0lBQUUsQ0FDcEUsQ0FDQyxDQUFDLEVBRU5GLG1CQUNBLENBQUMsZUFFTmxHLE1BQUEsQ0FBQTJCLE9BQUEsQ0FBQXdFLGFBQUEsQ0FBQzlGLGlCQUFBLENBQUFzQixPQUFnQjtNQUNiNEUsU0FBUyxFQUFDLDZCQUE2QjtNQUN2Q1EsT0FBTyxFQUFFLElBQUksQ0FBQ2UsZUFBZ0I7TUFDOUJoQixJQUFJLEVBQUM7SUFBUyxHQUViLElBQUFWLG1CQUFFLEVBQUMsMkNBQTJDLENBQ2pDLENBQUMsZUFFbkJwRyxNQUFBLENBQUEyQixPQUFBLENBQUF3RSxhQUFBLENBQUM5RixpQkFBQSxDQUFBc0IsT0FBZ0I7TUFDYjRFLFNBQVMsRUFBQywyQkFBMkI7TUFDckNlLFFBQVEsRUFBRSxJQUFJLENBQUMxQixLQUFLLENBQUNsQyxZQUFZLElBQUksSUFBSztNQUMxQ3FELE9BQU8sRUFBRSxJQUFJLENBQUNnQixnQkFBaUI7TUFDL0JqQixJQUFJLEVBQUM7SUFBUyxHQUViLElBQUFWLG1CQUFFLEVBQUMsYUFBYSxDQUNILENBQUMsZUFDbkJwRyxNQUFBLENBQUEyQixPQUFBLENBQUF3RSxhQUFBLFdBQUssQ0FDSixDQUNXLENBQ1AsQ0FDUixDQUFDO0VBRXRCO0FBQ0o7QUFBQzZCLE9BQUEsQ0FBQXJHLE9BQUEsR0FBQWMsd0JBQUE7QUFBQSxJQUFBTSxnQkFBQSxDQUFBcEIsT0FBQSxFQTdRb0JjLHdCQUF3QixpQkFJYndGLDRCQUFtQiIsImlnbm9yZUxpc3QiOltdfQ==