matrix-react-sdk
Version:
SDK for matrix.org using React
342 lines (339 loc) • 55.4 kB
JavaScript
"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 _logger = require("matrix-js-sdk/src/logger");
var _languageHandler = require("../../../languageHandler");
var _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _DialogButtons = _interopRequireDefault(require("../elements/DialogButtons"));
var _Field = _interopRequireDefault(require("../elements/Field"));
var _StyledRadioGroup = _interopRequireDefault(require("../elements/StyledRadioGroup"));
var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox"));
var _exportUtils = require("../../../utils/exportUtils/exportUtils");
var _Validation = _interopRequireDefault(require("../elements/Validation"));
var _HtmlExport = _interopRequireDefault(require("../../../utils/exportUtils/HtmlExport"));
var _JSONExport = _interopRequireDefault(require("../../../utils/exportUtils/JSONExport"));
var _PlainTextExport = _interopRequireDefault(require("../../../utils/exportUtils/PlainTextExport"));
var _useStateCallback = require("../../../hooks/useStateCallback");
var _Spinner = _interopRequireDefault(require("../elements/Spinner"));
var _InfoDialog = _interopRequireDefault(require("./InfoDialog"));
var _ChatExport = _interopRequireDefault(require("../../../customisations/ChatExport"));
var _validate = require("../../../utils/validate");
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 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.
*/
/**
* Set up form state using "forceRoomExportParameters" or defaults
* Form fields configured in ForceRoomExportParameters are not allowed to be edited
* Only return change handlers for editable values
*/
const useExportFormState = () => {
const config = _ChatExport.default.getForceChatExportParameters();
const [exportFormat, setExportFormat] = (0, _react.useState)(config.format ?? _exportUtils.ExportFormat.Html);
const [exportType, setExportType] = (0, _react.useState)(config.range ?? _exportUtils.ExportType.Timeline);
const [includeAttachments, setAttachments] = (0, _react.useState)(config.includeAttachments ?? false);
const [numberOfMessages, setNumberOfMessages] = (0, _react.useState)(config.numberOfMessages ?? 100);
const [sizeLimit, setSizeLimit] = (0, _react.useState)(config.sizeMb ?? 8);
return {
exportFormat,
exportType,
includeAttachments,
numberOfMessages,
sizeLimit,
setExportFormat: !config.format ? setExportFormat : undefined,
setExportType: !config.range ? setExportType : undefined,
setNumberOfMessages: !config.numberOfMessages ? setNumberOfMessages : undefined,
setSizeLimit: !config.sizeMb ? setSizeLimit : undefined,
setAttachments: config.includeAttachments === undefined ? setAttachments : undefined
};
};
const ExportDialog = ({
room,
onFinished
}) => {
const {
exportFormat,
exportType,
includeAttachments,
numberOfMessages,
sizeLimit,
setExportFormat,
setExportType,
setNumberOfMessages,
setSizeLimit,
setAttachments
} = useExportFormState();
const [isExporting, setExporting] = (0, _react.useState)(false);
const sizeLimitRef = (0, _react.useRef)(null);
const messageCountRef = (0, _react.useRef)(null);
const [exportProgressText, setExportProgressText] = (0, _react.useState)((0, _languageHandler._t)("export_chat|processing"));
const [displayCancel, setCancelWarning] = (0, _react.useState)(false);
const [exportCancelled, setExportCancelled] = (0, _react.useState)(false);
const [exportSuccessful, setExportSuccessful] = (0, _react.useState)(false);
const [exporter, setExporter] = (0, _useStateCallback.useStateCallback)(null, async exporter => {
await exporter?.export().then(() => {
if (!exportCancelled) setExportSuccessful(true);
});
});
const startExport = async () => {
const exportOptions = {
numberOfMessages,
attachmentsIncluded: includeAttachments,
maxSize: sizeLimit * 1024 * 1024
};
switch (exportFormat) {
case _exportUtils.ExportFormat.Html:
setExporter(new _HtmlExport.default(room, _exportUtils.ExportType[exportType], exportOptions, setExportProgressText));
break;
case _exportUtils.ExportFormat.Json:
setExporter(new _JSONExport.default(room, _exportUtils.ExportType[exportType], exportOptions, setExportProgressText));
break;
case _exportUtils.ExportFormat.PlainText:
setExporter(new _PlainTextExport.default(room, _exportUtils.ExportType[exportType], exportOptions, setExportProgressText));
break;
default:
_logger.logger.error("Unknown export format");
return;
}
};
const onExportClick = async () => {
const isValidSize = !setSizeLimit || (await sizeLimitRef.current?.validate({
focused: false
}));
if (!isValidSize) {
sizeLimitRef.current?.validate({
focused: true
});
return;
}
if (exportType === _exportUtils.ExportType.LastNMessages) {
const isValidNumberOfMessages = await messageCountRef.current?.validate({
focused: false
});
if (!isValidNumberOfMessages) {
messageCountRef.current?.validate({
focused: true
});
return;
}
}
setExporting(true);
await startExport();
};
const validateSize = (0, _Validation.default)({
rules: [{
key: "required",
test({
value,
allowEmpty
}) {
return allowEmpty || !!value;
},
invalid: () => {
const min = 1;
const max = 2000;
return (0, _languageHandler._t)("export_chat|enter_number_between_min_max", {
min,
max
});
}
}, {
key: "number",
test: ({
value
}) => {
const parsedSize = parseInt(value, 10);
return (0, _validate.validateNumberInRange)(1, 2000)(parsedSize);
},
invalid: () => {
const min = 1;
const max = 2000;
return (0, _languageHandler._t)("export_chat|size_limit_min_max", {
min,
max
});
}
}]
});
const onValidateSize = async fieldState => {
const result = await validateSize(fieldState);
return result;
};
const validateNumberOfMessages = (0, _Validation.default)({
rules: [{
key: "required",
test({
value,
allowEmpty
}) {
return allowEmpty || !!value;
},
invalid: () => {
const min = 1;
const max = 10 ** 8;
return (0, _languageHandler._t)("export_chat|enter_number_between_min_max", {
min,
max
});
}
}, {
key: "number",
test: ({
value
}) => {
const parsedSize = parseInt(value, 10);
return (0, _validate.validateNumberInRange)(1, 10 ** 8)(parsedSize);
},
invalid: () => {
const min = 1;
const max = 10 ** 8;
return (0, _languageHandler._t)("export_chat|num_messages_min_max", {
min,
max
});
}
}]
});
const onValidateNumberOfMessages = async fieldState => {
const result = await validateNumberOfMessages(fieldState);
return result;
};
const onCancel = async () => {
if (isExporting) setCancelWarning(true);else onFinished(false);
};
const confirmCancel = async () => {
await exporter?.cancelExport();
setExportCancelled(true);
setExporting(false);
setExporter(null);
};
const exportFormatOptions = Object.values(_exportUtils.ExportFormat).map(format => ({
value: format,
label: (0, _exportUtils.textForFormat)(format)
}));
const exportTypeOptions = Object.values(_exportUtils.ExportType).map(type => {
return /*#__PURE__*/_react.default.createElement("option", {
key: _exportUtils.ExportType[type],
value: type
}, (0, _exportUtils.textForType)(type));
});
let messageCount;
if (exportType === _exportUtils.ExportType.LastNMessages && setNumberOfMessages) {
messageCount = /*#__PURE__*/_react.default.createElement(_Field.default, {
id: "message-count",
element: "input",
type: "number",
value: numberOfMessages.toString(),
ref: messageCountRef,
onValidate: onValidateNumberOfMessages,
label: (0, _languageHandler._t)("export_chat|num_messages"),
onChange: e => {
setNumberOfMessages(parseInt(e.target.value));
}
});
}
const sizePostFix = /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("export_chat|size_limit_postfix"));
if (exportCancelled) {
// Display successful cancellation message
return /*#__PURE__*/_react.default.createElement(_InfoDialog.default, {
title: (0, _languageHandler._t)("export_chat|cancelled"),
description: (0, _languageHandler._t)("export_chat|cancelled_detail"),
hasCloseButton: true,
onFinished: onFinished
});
} else if (exportSuccessful) {
// Display successful export message
return /*#__PURE__*/_react.default.createElement(_InfoDialog.default, {
title: (0, _languageHandler._t)("export_chat|successful"),
description: (0, _languageHandler._t)("export_chat|successful_detail"),
hasCloseButton: true,
onFinished: onFinished
});
} else if (displayCancel) {
// Display cancel warning
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: (0, _languageHandler._t)("common|warning"),
className: "mx_ExportDialog",
contentId: "mx_Dialog_content",
onFinished: onFinished,
fixedWidth: true
}, /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("export_chat|confirm_stop")), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|stop"),
primaryButtonClass: "danger",
hasCancel: true,
cancelButton: (0, _languageHandler._t)("action|continue"),
onCancel: () => setCancelWarning(false),
onPrimaryButtonClick: confirmCancel
}));
} else {
// Display export settings
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
title: isExporting ? (0, _languageHandler._t)("export_chat|exporting_your_data") : (0, _languageHandler._t)("export_chat|title"),
className: `mx_ExportDialog ${isExporting && "mx_ExportDialog_Exporting"}`,
contentId: "mx_Dialog_content",
hasCancel: true,
onFinished: onFinished,
fixedWidth: true
}, !isExporting ? /*#__PURE__*/_react.default.createElement("p", null, (0, _languageHandler._t)("export_chat|select_option")) : null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_ExportDialog_options"
}, !!setExportFormat && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ExportDialog_subheading"
}, (0, _languageHandler._t)("export_chat|format")), /*#__PURE__*/_react.default.createElement(_StyledRadioGroup.default, {
name: "exportFormat",
value: exportFormat,
onChange: key => setExportFormat(_exportUtils.ExportFormat[key]),
definitions: exportFormatOptions
})), !!setExportType && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ExportDialog_subheading"
}, (0, _languageHandler._t)("export_chat|messages")), /*#__PURE__*/_react.default.createElement(_Field.default, {
id: "export-type",
element: "select",
value: exportType,
onChange: e => {
setExportType(_exportUtils.ExportType[e.target.value]);
}
}, exportTypeOptions), messageCount), setSizeLimit && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_ExportDialog_subheading"
}, (0, _languageHandler._t)("export_chat|size_limit")), /*#__PURE__*/_react.default.createElement(_Field.default, {
id: "size-limit",
type: "number",
autoComplete: "off",
onValidate: onValidateSize,
element: "input",
ref: sizeLimitRef,
value: sizeLimit.toString(),
postfixComponent: sizePostFix,
onChange: e => setSizeLimit(parseInt(e.target.value))
})), setAttachments && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
className: "mx_ExportDialog_attachments-checkbox",
id: "include-attachments",
checked: includeAttachments,
onChange: e => setAttachments(e.target.checked)
}, (0, _languageHandler._t)("export_chat|include_attachments")))), isExporting ? /*#__PURE__*/_react.default.createElement("div", {
"data-testid": "export-progress",
className: "mx_ExportDialog_progress"
}, /*#__PURE__*/_react.default.createElement(_Spinner.default, {
w: 24,
h: 24
}), /*#__PURE__*/_react.default.createElement("p", null, exportProgressText), /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|cancel"),
primaryButtonClass: "danger",
hasCancel: false,
onPrimaryButtonClick: onCancel
})) : /*#__PURE__*/_react.default.createElement(_DialogButtons.default, {
primaryButton: (0, _languageHandler._t)("action|export"),
onPrimaryButtonClick: onExportClick,
onCancel: () => onFinished(false)
}));
}
};
var _default = exports.default = ExportDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfbG9nZ2VyIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9CYXNlRGlhbG9nIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9EaWFsb2dCdXR0b25zIiwiX0ZpZWxkIiwiX1N0eWxlZFJhZGlvR3JvdXAiLCJfU3R5bGVkQ2hlY2tib3giLCJfZXhwb3J0VXRpbHMiLCJfVmFsaWRhdGlvbiIsIl9IdG1sRXhwb3J0IiwiX0pTT05FeHBvcnQiLCJfUGxhaW5UZXh0RXhwb3J0IiwiX3VzZVN0YXRlQ2FsbGJhY2siLCJfU3Bpbm5lciIsIl9JbmZvRGlhbG9nIiwiX0NoYXRFeHBvcnQiLCJfdmFsaWRhdGUiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsImRlZmF1bHQiLCJoYXMiLCJnZXQiLCJuIiwiX19wcm90b19fIiwiYSIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwidSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImkiLCJzZXQiLCJ1c2VFeHBvcnRGb3JtU3RhdGUiLCJjb25maWciLCJDaGF0RXhwb3J0IiwiZ2V0Rm9yY2VDaGF0RXhwb3J0UGFyYW1ldGVycyIsImV4cG9ydEZvcm1hdCIsInNldEV4cG9ydEZvcm1hdCIsInVzZVN0YXRlIiwiZm9ybWF0IiwiRXhwb3J0Rm9ybWF0IiwiSHRtbCIsImV4cG9ydFR5cGUiLCJzZXRFeHBvcnRUeXBlIiwicmFuZ2UiLCJFeHBvcnRUeXBlIiwiVGltZWxpbmUiLCJpbmNsdWRlQXR0YWNobWVudHMiLCJzZXRBdHRhY2htZW50cyIsIm51bWJlck9mTWVzc2FnZXMiLCJzZXROdW1iZXJPZk1lc3NhZ2VzIiwic2l6ZUxpbWl0Iiwic2V0U2l6ZUxpbWl0Iiwic2l6ZU1iIiwidW5kZWZpbmVkIiwiRXhwb3J0RGlhbG9nIiwicm9vbSIsIm9uRmluaXNoZWQiLCJpc0V4cG9ydGluZyIsInNldEV4cG9ydGluZyIsInNpemVMaW1pdFJlZiIsInVzZVJlZiIsIm1lc3NhZ2VDb3VudFJlZiIsImV4cG9ydFByb2dyZXNzVGV4dCIsInNldEV4cG9ydFByb2dyZXNzVGV4dCIsIl90IiwiZGlzcGxheUNhbmNlbCIsInNldENhbmNlbFdhcm5pbmciLCJleHBvcnRDYW5jZWxsZWQiLCJzZXRFeHBvcnRDYW5jZWxsZWQiLCJleHBvcnRTdWNjZXNzZnVsIiwic2V0RXhwb3J0U3VjY2Vzc2Z1bCIsImV4cG9ydGVyIiwic2V0RXhwb3J0ZXIiLCJ1c2VTdGF0ZUNhbGxiYWNrIiwiZXhwb3J0IiwidGhlbiIsInN0YXJ0RXhwb3J0IiwiZXhwb3J0T3B0aW9ucyIsImF0dGFjaG1lbnRzSW5jbHVkZWQiLCJtYXhTaXplIiwiSFRNTEV4cG9ydGVyIiwiSnNvbiIsIkpTT05FeHBvcnRlciIsIlBsYWluVGV4dCIsIlBsYWluVGV4dEV4cG9ydGVyIiwibG9nZ2VyIiwiZXJyb3IiLCJvbkV4cG9ydENsaWNrIiwiaXNWYWxpZFNpemUiLCJjdXJyZW50IiwidmFsaWRhdGUiLCJmb2N1c2VkIiwiTGFzdE5NZXNzYWdlcyIsImlzVmFsaWROdW1iZXJPZk1lc3NhZ2VzIiwidmFsaWRhdGVTaXplIiwid2l0aFZhbGlkYXRpb24iLCJydWxlcyIsImtleSIsInRlc3QiLCJ2YWx1ZSIsImFsbG93RW1wdHkiLCJpbnZhbGlkIiwibWluIiwibWF4IiwicGFyc2VkU2l6ZSIsInBhcnNlSW50IiwidmFsaWRhdGVOdW1iZXJJblJhbmdlIiwib25WYWxpZGF0ZVNpemUiLCJmaWVsZFN0YXRlIiwicmVzdWx0IiwidmFsaWRhdGVOdW1iZXJPZk1lc3NhZ2VzIiwib25WYWxpZGF0ZU51bWJlck9mTWVzc2FnZXMiLCJvbkNhbmNlbCIsImNvbmZpcm1DYW5jZWwiLCJjYW5jZWxFeHBvcnQiLCJleHBvcnRGb3JtYXRPcHRpb25zIiwidmFsdWVzIiwibWFwIiwibGFiZWwiLCJ0ZXh0Rm9yRm9ybWF0IiwiZXhwb3J0VHlwZU9wdGlvbnMiLCJ0eXBlIiwiY3JlYXRlRWxlbWVudCIsInRleHRGb3JUeXBlIiwibWVzc2FnZUNvdW50IiwiaWQiLCJlbGVtZW50IiwidG9TdHJpbmciLCJyZWYiLCJvblZhbGlkYXRlIiwib25DaGFuZ2UiLCJ0YXJnZXQiLCJzaXplUG9zdEZpeCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJoYXNDbG9zZUJ1dHRvbiIsImNsYXNzTmFtZSIsImNvbnRlbnRJZCIsImZpeGVkV2lkdGgiLCJwcmltYXJ5QnV0dG9uIiwicHJpbWFyeUJ1dHRvbkNsYXNzIiwiaGFzQ2FuY2VsIiwiY2FuY2VsQnV0dG9uIiwib25QcmltYXJ5QnV0dG9uQ2xpY2siLCJGcmFnbWVudCIsIm5hbWUiLCJkZWZpbml0aW9ucyIsImF1dG9Db21wbGV0ZSIsInBvc3RmaXhDb21wb25lbnQiLCJjaGVja2VkIiwidyIsImgiLCJfZGVmYXVsdCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvY29tcG9uZW50cy92aWV3cy9kaWFsb2dzL0V4cG9ydERpYWxvZy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0LCB7IHVzZVJlZiwgdXNlU3RhdGUsIERpc3BhdGNoLCBTZXRTdGF0ZUFjdGlvbiB9IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgX3QgfSBmcm9tIFwiLi4vLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgQmFzZURpYWxvZyBmcm9tIFwiLi9CYXNlRGlhbG9nXCI7XG5pbXBvcnQgRGlhbG9nQnV0dG9ucyBmcm9tIFwiLi4vZWxlbWVudHMvRGlhbG9nQnV0dG9uc1wiO1xuaW1wb3J0IEZpZWxkIGZyb20gXCIuLi9lbGVtZW50cy9GaWVsZFwiO1xuaW1wb3J0IFN0eWxlZFJhZGlvR3JvdXAgZnJvbSBcIi4uL2VsZW1lbnRzL1N0eWxlZFJhZGlvR3JvdXBcIjtcbmltcG9ydCBTdHlsZWRDaGVja2JveCBmcm9tIFwiLi4vZWxlbWVudHMvU3R5bGVkQ2hlY2tib3hcIjtcbmltcG9ydCB7XG4gICAgRXhwb3J0Rm9ybWF0LFxuICAgIEV4cG9ydEZvcm1hdEtleSxcbiAgICBFeHBvcnRUeXBlLFxuICAgIEV4cG9ydFR5cGVLZXksXG4gICAgdGV4dEZvckZvcm1hdCxcbiAgICB0ZXh0Rm9yVHlwZSxcbn0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V4cG9ydFV0aWxzL2V4cG9ydFV0aWxzXCI7XG5pbXBvcnQgd2l0aFZhbGlkYXRpb24sIHsgSUZpZWxkU3RhdGUsIElWYWxpZGF0aW9uUmVzdWx0IH0gZnJvbSBcIi4uL2VsZW1lbnRzL1ZhbGlkYXRpb25cIjtcbmltcG9ydCBIVE1MRXhwb3J0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V4cG9ydFV0aWxzL0h0bWxFeHBvcnRcIjtcbmltcG9ydCBKU09ORXhwb3J0ZXIgZnJvbSBcIi4uLy4uLy4uL3V0aWxzL2V4cG9ydFV0aWxzL0pTT05FeHBvcnRcIjtcbmltcG9ydCBQbGFpblRleHRFeHBvcnRlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvZXhwb3J0VXRpbHMvUGxhaW5UZXh0RXhwb3J0XCI7XG5pbXBvcnQgeyB1c2VTdGF0ZUNhbGxiYWNrIH0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZVN0YXRlQ2FsbGJhY2tcIjtcbmltcG9ydCBFeHBvcnRlciBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvZXhwb3J0VXRpbHMvRXhwb3J0ZXJcIjtcbmltcG9ydCBTcGlubmVyIGZyb20gXCIuLi9lbGVtZW50cy9TcGlubmVyXCI7XG5pbXBvcnQgSW5mb0RpYWxvZyBmcm9tIFwiLi9JbmZvRGlhbG9nXCI7XG5pbXBvcnQgQ2hhdEV4cG9ydCBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvQ2hhdEV4cG9ydFwiO1xuaW1wb3J0IHsgdmFsaWRhdGVOdW1iZXJJblJhbmdlIH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3ZhbGlkYXRlXCI7XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIHJvb206IFJvb207XG4gICAgb25GaW5pc2hlZChkb0V4cG9ydD86IGJvb2xlYW4pOiB2b2lkO1xufVxuXG5pbnRlcmZhY2UgRXhwb3J0Q29uZmlnIHtcbiAgICBleHBvcnRGb3JtYXQ6IEV4cG9ydEZvcm1hdDtcbiAgICBleHBvcnRUeXBlOiBFeHBvcnRUeXBlO1xuICAgIG51bWJlck9mTWVzc2FnZXM6IG51bWJlcjtcbiAgICBzaXplTGltaXQ6IG51bWJlcjtcbiAgICBpbmNsdWRlQXR0YWNobWVudHM6IGJvb2xlYW47XG4gICAgc2V0RXhwb3J0Rm9ybWF0PzogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248RXhwb3J0Rm9ybWF0Pj47XG4gICAgc2V0RXhwb3J0VHlwZT86IERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPEV4cG9ydFR5cGU+PjtcbiAgICBzZXRBdHRhY2htZW50cz86IERpc3BhdGNoPFNldFN0YXRlQWN0aW9uPGJvb2xlYW4+PjtcbiAgICBzZXROdW1iZXJPZk1lc3NhZ2VzPzogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248bnVtYmVyPj47XG4gICAgc2V0U2l6ZUxpbWl0PzogRGlzcGF0Y2g8U2V0U3RhdGVBY3Rpb248bnVtYmVyPj47XG59XG5cbi8qKlxuICogU2V0IHVwIGZvcm0gc3RhdGUgdXNpbmcgXCJmb3JjZVJvb21FeHBvcnRQYXJhbWV0ZXJzXCIgb3IgZGVmYXVsdHNcbiAqIEZvcm0gZmllbGRzIGNvbmZpZ3VyZWQgaW4gRm9yY2VSb29tRXhwb3J0UGFyYW1ldGVycyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZWRpdGVkXG4gKiBPbmx5IHJldHVybiBjaGFuZ2UgaGFuZGxlcnMgZm9yIGVkaXRhYmxlIHZhbHVlc1xuICovXG5jb25zdCB1c2VFeHBvcnRGb3JtU3RhdGUgPSAoKTogRXhwb3J0Q29uZmlnID0+IHtcbiAgICBjb25zdCBjb25maWcgPSBDaGF0RXhwb3J0LmdldEZvcmNlQ2hhdEV4cG9ydFBhcmFtZXRlcnMoKTtcblxuICAgIGNvbnN0IFtleHBvcnRGb3JtYXQsIHNldEV4cG9ydEZvcm1hdF0gPSB1c2VTdGF0ZShjb25maWcuZm9ybWF0ID8/IEV4cG9ydEZvcm1hdC5IdG1sKTtcbiAgICBjb25zdCBbZXhwb3J0VHlwZSwgc2V0RXhwb3J0VHlwZV0gPSB1c2VTdGF0ZShjb25maWcucmFuZ2UgPz8gRXhwb3J0VHlwZS5UaW1lbGluZSk7XG4gICAgY29uc3QgW2luY2x1ZGVBdHRhY2htZW50cywgc2V0QXR0YWNobWVudHNdID0gdXNlU3RhdGUoY29uZmlnLmluY2x1ZGVBdHRhY2htZW50cyA/PyBmYWxzZSk7XG4gICAgY29uc3QgW251bWJlck9mTWVzc2FnZXMsIHNldE51bWJlck9mTWVzc2FnZXNdID0gdXNlU3RhdGU8bnVtYmVyPihjb25maWcubnVtYmVyT2ZNZXNzYWdlcyA/PyAxMDApO1xuICAgIGNvbnN0IFtzaXplTGltaXQsIHNldFNpemVMaW1pdF0gPSB1c2VTdGF0ZTxudW1iZXI+KGNvbmZpZy5zaXplTWIgPz8gOCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBleHBvcnRGb3JtYXQsXG4gICAgICAgIGV4cG9ydFR5cGUsXG4gICAgICAgIGluY2x1ZGVBdHRhY2htZW50cyxcbiAgICAgICAgbnVtYmVyT2ZNZXNzYWdlcyxcbiAgICAgICAgc2l6ZUxpbWl0LFxuICAgICAgICBzZXRFeHBvcnRGb3JtYXQ6ICFjb25maWcuZm9ybWF0ID8gc2V0RXhwb3J0Rm9ybWF0IDogdW5kZWZpbmVkLFxuICAgICAgICBzZXRFeHBvcnRUeXBlOiAhY29uZmlnLnJhbmdlID8gc2V0RXhwb3J0VHlwZSA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0TnVtYmVyT2ZNZXNzYWdlczogIWNvbmZpZy5udW1iZXJPZk1lc3NhZ2VzID8gc2V0TnVtYmVyT2ZNZXNzYWdlcyA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0U2l6ZUxpbWl0OiAhY29uZmlnLnNpemVNYiA/IHNldFNpemVMaW1pdCA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2V0QXR0YWNobWVudHM6IGNvbmZpZy5pbmNsdWRlQXR0YWNobWVudHMgPT09IHVuZGVmaW5lZCA/IHNldEF0dGFjaG1lbnRzIDogdW5kZWZpbmVkLFxuICAgIH07XG59O1xuXG5jb25zdCBFeHBvcnREaWFsb2c6IFJlYWN0LkZDPElQcm9wcz4gPSAoeyByb29tLCBvbkZpbmlzaGVkIH0pID0+IHtcbiAgICBjb25zdCB7XG4gICAgICAgIGV4cG9ydEZvcm1hdCxcbiAgICAgICAgZXhwb3J0VHlwZSxcbiAgICAgICAgaW5jbHVkZUF0dGFjaG1lbnRzLFxuICAgICAgICBudW1iZXJPZk1lc3NhZ2VzLFxuICAgICAgICBzaXplTGltaXQsXG4gICAgICAgIHNldEV4cG9ydEZvcm1hdCxcbiAgICAgICAgc2V0RXhwb3J0VHlwZSxcbiAgICAgICAgc2V0TnVtYmVyT2ZNZXNzYWdlcyxcbiAgICAgICAgc2V0U2l6ZUxpbWl0LFxuICAgICAgICBzZXRBdHRhY2htZW50cyxcbiAgICB9ID0gdXNlRXhwb3J0Rm9ybVN0YXRlKCk7XG5cbiAgICBjb25zdCBbaXNFeHBvcnRpbmcsIHNldEV4cG9ydGluZ10gPSB1c2VTdGF0ZShmYWxzZSk7XG4gICAgY29uc3Qgc2l6ZUxpbWl0UmVmID0gdXNlUmVmPEZpZWxkPihudWxsKTtcbiAgICBjb25zdCBtZXNzYWdlQ291bnRSZWYgPSB1c2VSZWY8RmllbGQ+KG51bGwpO1xuICAgIGNvbnN0IFtleHBvcnRQcm9ncmVzc1RleHQsIHNldEV4cG9ydFByb2dyZXNzVGV4dF0gPSB1c2VTdGF0ZShfdChcImV4cG9ydF9jaGF0fHByb2Nlc3NpbmdcIikpO1xuICAgIGNvbnN0IFtkaXNwbGF5Q2FuY2VsLCBzZXRDYW5jZWxXYXJuaW5nXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbZXhwb3J0Q2FuY2VsbGVkLCBzZXRFeHBvcnRDYW5jZWxsZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtleHBvcnRTdWNjZXNzZnVsLCBzZXRFeHBvcnRTdWNjZXNzZnVsXSA9IHVzZVN0YXRlKGZhbHNlKTtcbiAgICBjb25zdCBbZXhwb3J0ZXIsIHNldEV4cG9ydGVyXSA9IHVzZVN0YXRlQ2FsbGJhY2s8RXhwb3J0ZXIgfCBudWxsPihcbiAgICAgICAgbnVsbCxcbiAgICAgICAgYXN5bmMgKGV4cG9ydGVyOiBFeHBvcnRlciB8IG51bGwpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGF3YWl0IGV4cG9ydGVyPy5leHBvcnQoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWV4cG9ydENhbmNlbGxlZCkgc2V0RXhwb3J0U3VjY2Vzc2Z1bCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBzdGFydEV4cG9ydCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgZXhwb3J0T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIG51bWJlck9mTWVzc2FnZXMsXG4gICAgICAgICAgICBhdHRhY2htZW50c0luY2x1ZGVkOiBpbmNsdWRlQXR0YWNobWVudHMsXG4gICAgICAgICAgICBtYXhTaXplOiBzaXplTGltaXQgKiAxMDI0ICogMTAyNCxcbiAgICAgICAgfTtcbiAgICAgICAgc3dpdGNoIChleHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0Lkh0bWw6XG4gICAgICAgICAgICAgICAgc2V0RXhwb3J0ZXIobmV3IEhUTUxFeHBvcnRlcihyb29tLCBFeHBvcnRUeXBlW2V4cG9ydFR5cGVdLCBleHBvcnRPcHRpb25zLCBzZXRFeHBvcnRQcm9ncmVzc1RleHQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0Lkpzb246XG4gICAgICAgICAgICAgICAgc2V0RXhwb3J0ZXIobmV3IEpTT05FeHBvcnRlcihyb29tLCBFeHBvcnRUeXBlW2V4cG9ydFR5cGVdLCBleHBvcnRPcHRpb25zLCBzZXRFeHBvcnRQcm9ncmVzc1RleHQpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgRXhwb3J0Rm9ybWF0LlBsYWluVGV4dDpcbiAgICAgICAgICAgICAgICBzZXRFeHBvcnRlcihuZXcgUGxhaW5UZXh0RXhwb3J0ZXIocm9vbSwgRXhwb3J0VHlwZVtleHBvcnRUeXBlXSwgZXhwb3J0T3B0aW9ucywgc2V0RXhwb3J0UHJvZ3Jlc3NUZXh0KSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcIlVua25vd24gZXhwb3J0IGZvcm1hdFwiKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3Qgb25FeHBvcnRDbGljayA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgY29uc3QgaXNWYWxpZFNpemUgPVxuICAgICAgICAgICAgIXNldFNpemVMaW1pdCB8fFxuICAgICAgICAgICAgKGF3YWl0IHNpemVMaW1pdFJlZi5jdXJyZW50Py52YWxpZGF0ZSh7XG4gICAgICAgICAgICAgICAgZm9jdXNlZDogZmFsc2UsXG4gICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkU2l6ZSkge1xuICAgICAgICAgICAgc2l6ZUxpbWl0UmVmLmN1cnJlbnQ/LnZhbGlkYXRlKHsgZm9jdXNlZDogdHJ1ZSB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhwb3J0VHlwZSA9PT0gRXhwb3J0VHlwZS5MYXN0Tk1lc3NhZ2VzKSB7XG4gICAgICAgICAgICBjb25zdCBpc1ZhbGlkTnVtYmVyT2ZNZXNzYWdlcyA9IGF3YWl0IG1lc3NhZ2VDb3VudFJlZi5jdXJyZW50Py52YWxpZGF0ZSh7IGZvY3VzZWQ6IGZhbHNlIH0pO1xuICAgICAgICAgICAgaWYgKCFpc1ZhbGlkTnVtYmVyT2ZNZXNzYWdlcykge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VDb3VudFJlZi5jdXJyZW50Py52YWxpZGF0ZSh7IGZvY3VzZWQ6IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldEV4cG9ydGluZyh0cnVlKTtcbiAgICAgICAgYXdhaXQgc3RhcnRFeHBvcnQoKTtcbiAgICB9O1xuXG4gICAgY29uc3QgdmFsaWRhdGVTaXplID0gd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICBydWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJyZXF1aXJlZFwiLFxuICAgICAgICAgICAgICAgIHRlc3QoeyB2YWx1ZSwgYWxsb3dFbXB0eSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0VtcHR5IHx8ICEhdmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IDIwMDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdChcImV4cG9ydF9jaGF0fGVudGVyX251bWJlcl9iZXR3ZWVuX21pbl9tYXhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdGVzdDogKHsgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRTaXplID0gcGFyc2VJbnQodmFsdWUhLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU51bWJlckluUmFuZ2UoMSwgMjAwMCkocGFyc2VkU2l6ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IDIwMDA7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdChcImV4cG9ydF9jaGF0fHNpemVfbGltaXRfbWluX21heFwiLCB7IG1pbiwgbWF4IH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3Qgb25WYWxpZGF0ZVNpemUgPSBhc3luYyAoZmllbGRTdGF0ZTogSUZpZWxkU3RhdGUpOiBQcm9taXNlPElWYWxpZGF0aW9uUmVzdWx0PiA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHZhbGlkYXRlU2l6ZShmaWVsZFN0YXRlKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgY29uc3QgdmFsaWRhdGVOdW1iZXJPZk1lc3NhZ2VzID0gd2l0aFZhbGlkYXRpb24oe1xuICAgICAgICBydWxlczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGtleTogXCJyZXF1aXJlZFwiLFxuICAgICAgICAgICAgICAgIHRlc3QoeyB2YWx1ZSwgYWxsb3dFbXB0eSB9KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGxvd0VtcHR5IHx8ICEhdmFsdWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IDEwICoqIDg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdChcImV4cG9ydF9jaGF0fGVudGVyX251bWJlcl9iZXR3ZWVuX21pbl9tYXhcIiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBrZXk6IFwibnVtYmVyXCIsXG4gICAgICAgICAgICAgICAgdGVzdDogKHsgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRTaXplID0gcGFyc2VJbnQodmFsdWUhLCAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU51bWJlckluUmFuZ2UoMSwgMTAgKiogOCkocGFyc2VkU2l6ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbnZhbGlkOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IDEwICoqIDg7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBfdChcImV4cG9ydF9jaGF0fG51bV9tZXNzYWdlc19taW5fbWF4XCIsIHsgbWluLCBtYXggfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBvblZhbGlkYXRlTnVtYmVyT2ZNZXNzYWdlcyA9IGFzeW5jIChmaWVsZFN0YXRlOiBJRmllbGRTdGF0ZSk6IFByb21pc2U8SVZhbGlkYXRpb25SZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdmFsaWRhdGVOdW1iZXJPZk1lc3NhZ2VzKGZpZWxkU3RhdGUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG5cbiAgICBjb25zdCBvbkNhbmNlbCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgaWYgKGlzRXhwb3J0aW5nKSBzZXRDYW5jZWxXYXJuaW5nKHRydWUpO1xuICAgICAgICBlbHNlIG9uRmluaXNoZWQoZmFsc2UpO1xuICAgIH07XG5cbiAgICBjb25zdCBjb25maXJtQ2FuY2VsID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICBhd2FpdCBleHBvcnRlcj8uY2FuY2VsRXhwb3J0KCk7XG4gICAgICAgIHNldEV4cG9ydENhbmNlbGxlZCh0cnVlKTtcbiAgICAgICAgc2V0RXhwb3J0aW5nKGZhbHNlKTtcbiAgICAgICAgc2V0RXhwb3J0ZXIobnVsbCk7XG4gICAgfTtcblxuICAgIGNvbnN0IGV4cG9ydEZvcm1hdE9wdGlvbnMgPSBPYmplY3QudmFsdWVzKEV4cG9ydEZvcm1hdCkubWFwKChmb3JtYXQpID0+ICh7XG4gICAgICAgIHZhbHVlOiBmb3JtYXQsXG4gICAgICAgIGxhYmVsOiB0ZXh0Rm9yRm9ybWF0KGZvcm1hdCksXG4gICAgfSkpO1xuXG4gICAgY29uc3QgZXhwb3J0VHlwZU9wdGlvbnMgPSBPYmplY3QudmFsdWVzKEV4cG9ydFR5cGUpLm1hcCgodHlwZSkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPG9wdGlvbiBrZXk9e0V4cG9ydFR5cGVbdHlwZV19IHZhbHVlPXt0eXBlfT5cbiAgICAgICAgICAgICAgICB7dGV4dEZvclR5cGUodHlwZSl9XG4gICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIGxldCBtZXNzYWdlQ291bnQ6IEpTWC5FbGVtZW50IHwgdW5kZWZpbmVkO1xuICAgIGlmIChleHBvcnRUeXBlID09PSBFeHBvcnRUeXBlLkxhc3ROTWVzc2FnZXMgJiYgc2V0TnVtYmVyT2ZNZXNzYWdlcykge1xuICAgICAgICBtZXNzYWdlQ291bnQgPSAoXG4gICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICBpZD1cIm1lc3NhZ2UtY291bnRcIlxuICAgICAgICAgICAgICAgIGVsZW1lbnQ9XCJpbnB1dFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cIm51bWJlclwiXG4gICAgICAgICAgICAgICAgdmFsdWU9e251bWJlck9mTWVzc2FnZXMudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICByZWY9e21lc3NhZ2VDb3VudFJlZn1cbiAgICAgICAgICAgICAgICBvblZhbGlkYXRlPXtvblZhbGlkYXRlTnVtYmVyT2ZNZXNzYWdlc31cbiAgICAgICAgICAgICAgICBsYWJlbD17X3QoXCJleHBvcnRfY2hhdHxudW1fbWVzc2FnZXNcIil9XG4gICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNldE51bWJlck9mTWVzc2FnZXMocGFyc2VJbnQoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzaXplUG9zdEZpeCA9IDxzcGFuPntfdChcImV4cG9ydF9jaGF0fHNpemVfbGltaXRfcG9zdGZpeFwiKX08L3NwYW4+O1xuXG4gICAgaWYgKGV4cG9ydENhbmNlbGxlZCkge1xuICAgICAgICAvLyBEaXNwbGF5IHN1Y2Nlc3NmdWwgY2FuY2VsbGF0aW9uIG1lc3NhZ2VcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxJbmZvRGlhbG9nXG4gICAgICAgICAgICAgICAgdGl0bGU9e190KFwiZXhwb3J0X2NoYXR8Y2FuY2VsbGVkXCIpfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChcImV4cG9ydF9jaGF0fGNhbmNlbGxlZF9kZXRhaWxcIil9XG4gICAgICAgICAgICAgICAgaGFzQ2xvc2VCdXR0b249e3RydWV9XG4gICAgICAgICAgICAgICAgb25GaW5pc2hlZD17b25GaW5pc2hlZH1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfSBlbHNlIGlmIChleHBvcnRTdWNjZXNzZnVsKSB7XG4gICAgICAgIC8vIERpc3BsYXkgc3VjY2Vzc2Z1bCBleHBvcnQgbWVzc2FnZVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEluZm9EaWFsb2dcbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJleHBvcnRfY2hhdHxzdWNjZXNzZnVsXCIpfVxuICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uPXtfdChcImV4cG9ydF9jaGF0fHN1Y2Nlc3NmdWxfZGV0YWlsXCIpfVxuICAgICAgICAgICAgICAgIGhhc0Nsb3NlQnV0dG9uPXt0cnVlfVxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e29uRmluaXNoZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoZGlzcGxheUNhbmNlbCkge1xuICAgICAgICAvLyBEaXNwbGF5IGNhbmNlbCB3YXJuaW5nXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtfdChcImNvbW1vbnx3YXJuaW5nXCIpfVxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0V4cG9ydERpYWxvZ1wiXG4gICAgICAgICAgICAgICAgY29udGVudElkPVwibXhfRGlhbG9nX2NvbnRlbnRcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e29uRmluaXNoZWR9XG4gICAgICAgICAgICAgICAgZml4ZWRXaWR0aD17dHJ1ZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8cD57X3QoXCJleHBvcnRfY2hhdHxjb25maXJtX3N0b3BcIil9PC9wPlxuICAgICAgICAgICAgICAgIDxEaWFsb2dCdXR0b25zXG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlCdXR0b249e190KFwiYWN0aW9ufHN0b3BcIil9XG4gICAgICAgICAgICAgICAgICAgIHByaW1hcnlCdXR0b25DbGFzcz1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgIGhhc0NhbmNlbD17dHJ1ZX1cbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uPXtfdChcImFjdGlvbnxjb250aW51ZVwiKX1cbiAgICAgICAgICAgICAgICAgICAgb25DYW5jZWw9eygpID0+IHNldENhbmNlbFdhcm5pbmcoZmFsc2UpfVxuICAgICAgICAgICAgICAgICAgICBvblByaW1hcnlCdXR0b25DbGljaz17Y29uZmlybUNhbmNlbH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERpc3BsYXkgZXhwb3J0IHNldHRpbmdzXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QmFzZURpYWxvZ1xuICAgICAgICAgICAgICAgIHRpdGxlPXtpc0V4cG9ydGluZyA/IF90KFwiZXhwb3J0X2NoYXR8ZXhwb3J0aW5nX3lvdXJfZGF0YVwiKSA6IF90KFwiZXhwb3J0X2NoYXR8dGl0bGVcIil9XG4gICAgICAgICAgICAgICAgY2xhc3NOYW1lPXtgbXhfRXhwb3J0RGlhbG9nICR7aXNFeHBvcnRpbmcgJiYgXCJteF9FeHBvcnREaWFsb2dfRXhwb3J0aW5nXCJ9YH1cbiAgICAgICAgICAgICAgICBjb250ZW50SWQ9XCJteF9EaWFsb2dfY29udGVudFwiXG4gICAgICAgICAgICAgICAgaGFzQ2FuY2VsPXt0cnVlfVxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e29uRmluaXNoZWR9XG4gICAgICAgICAgICAgICAgZml4ZWRXaWR0aD17dHJ1ZX1cbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7IWlzRXhwb3J0aW5nID8gPHA+e190KFwiZXhwb3J0X2NoYXR8c2VsZWN0X29wdGlvblwiKX08L3A+IDogbnVsbH1cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfRXhwb3J0RGlhbG9nX29wdGlvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgeyEhc2V0RXhwb3J0Rm9ybWF0ICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfRXhwb3J0RGlhbG9nX3N1YmhlYWRpbmdcIj57X3QoXCJleHBvcnRfY2hhdHxmb3JtYXRcIil9PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFN0eWxlZFJhZGlvR3JvdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImV4cG9ydEZvcm1hdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtleHBvcnRGb3JtYXR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoa2V5OiBFeHBvcnRGb3JtYXRLZXkpID0+IHNldEV4cG9ydEZvcm1hdChFeHBvcnRGb3JtYXRba2V5XSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zPXtleHBvcnRGb3JtYXRPcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Lz5cbiAgICAgICAgICAgICAgICAgICAgKX1cblxuICAgICAgICAgICAgICAgICAgICB7ISFzZXRFeHBvcnRUeXBlICYmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIDw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfRXhwb3J0RGlhbG9nX3N1YmhlYWRpbmdcIj57X3QoXCJleHBvcnRfY2hhdHxtZXNzYWdlc1wiKX08L3NwYW4+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJleHBvcnQtdHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQ9XCJzZWxlY3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT17ZXhwb3J0VHlwZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRFeHBvcnRUeXBlKEV4cG9ydFR5cGVbZS50YXJnZXQudmFsdWUgYXMgRXhwb3J0VHlwZUtleV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2V4cG9ydFR5cGVPcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvRmllbGQ+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge21lc3NhZ2VDb3VudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgIHtzZXRTaXplTGltaXQgJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9FeHBvcnREaWFsb2dfc3ViaGVhZGluZ1wiPntfdChcImV4cG9ydF9jaGF0fHNpemVfbGltaXRcIil9PC9zcGFuPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPEZpZWxkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2l6ZS1saW1pdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJudW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvQ29tcGxldGU9XCJvZmZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblZhbGlkYXRlPXtvblZhbGlkYXRlU2l6ZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudD1cImlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPXtzaXplTGltaXRSZWZ9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPXtzaXplTGltaXQudG9TdHJpbmcoKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdGZpeENvbXBvbmVudD17c2l6ZVBvc3RGaXh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0U2l6ZUxpbWl0KHBhcnNlSW50KGUudGFyZ2V0LnZhbHVlKSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvPlxuICAgICAgICAgICAgICAgICAgICApfVxuXG4gICAgICAgICAgICAgICAgICAgIHtzZXRBdHRhY2htZW50cyAmJiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdHlsZWRDaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9FeHBvcnREaWFsb2dfYXR0YWNobWVudHMtY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZD1cImluY2x1ZGUtYXR0YWNobWVudHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkPXtpbmNsdWRlQXR0YWNobWVudHN9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2hhbmdlPXsoZSkgPT4gc2V0QXR0YWNobWVudHMoKGUudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLmNoZWNrZWQpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwiZXhwb3J0X2NoYXR8aW5jbHVkZV9hdHRhY2htZW50c1wiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1N0eWxlZENoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAge2lzRXhwb3J0aW5nID8gKFxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGRhdGEtdGVzdGlkPVwiZXhwb3J0LXByb2dyZXNzXCIgY2xhc3NOYW1lPVwibXhfRXhwb3J0RGlhbG9nX3Byb2dyZXNzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8U3Bpbm5lciB3PXsyNH0gaD17MjR9IC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD57ZXhwb3J0UHJvZ3Jlc3NUZXh0fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxEaWFsb2dCdXR0b25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJhY3Rpb258Y2FuY2VsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlCdXR0b25DbGFzcz1cImRhbmdlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQ2FuY2VsPXtmYWxzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvblByaW1hcnlCdXR0b25DbGljaz17b25DYW5jZWx9XG4gICAgICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICA8RGlhbG9nQnV0dG9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeUJ1dHRvbj17X3QoXCJhY3Rpb258ZXhwb3J0XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25QcmltYXJ5QnV0dG9uQ2xpY2s9e29uRXhwb3J0Q2xpY2t9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbkNhbmNlbD17KCkgPT4gb25GaW5pc2hlZChmYWxzZSl9XG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQmFzZURpYWxvZz5cbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBFeHBvcnREaWFsb2c7XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFRQSxJQUFBQSxNQUFBLEdBQUFDLHVCQUFBLENBQUFDLE9BQUE7QUFFQSxJQUFBQyxPQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxnQkFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssY0FBQSxHQUFBRCxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU0sTUFBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQUgsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFRLGVBQUEsR0FBQUosc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFTLFlBQUEsR0FBQVQsT0FBQTtBQVFBLElBQUFVLFdBQUEsR0FBQU4sc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFXLFdBQUEsR0FBQVAsc0JBQUEsQ0FBQUosT0FBQTtBQUNBLElBQUFZLFdBQUEs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