merchi_product_form
Version:
A React component for Merchi product forms
228 lines (227 loc) • 33 kB
JavaScript
'use client';
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t["return"] && (u = t["return"](), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
import * as React from 'react';
import { useState } from 'react';
import { isBoolean, isArray } from 'lodash';
import { IconFile } from './icons';
import { allowedFileTypes } from './utils';
import DropzoneInput from './DropzoneInput';
import InputHiddenStatic from './InputHiddenStatic';
import VariationError from './VariationError';
import VariationLabel from './VariationLabel';
import Collapse from './Collapse';
import { useFieldArray } from 'react-hook-form';
import { FaChevronDown, FaChevronUp, FaDownload, FaTimes, FaTrash } from 'react-icons/fa';
import { CgSpinner } from 'react-icons/cg';
import { useMerchiFormContext } from '../context/MerchiProductFormProvider';
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
var LoadingIcon = function LoadingIcon() {
return /*#__PURE__*/_jsx(CgSpinner, {
className: "animate_spin"
});
};
function FileListItem(_ref) {
var file = _ref.file,
disabled = _ref.disabled,
doDelete = _ref.doDelete,
loading = _ref.loading;
var _useMerchiFormContext = useMerchiFormContext(),
classNameFileListItem = _useMerchiFormContext.classNameFileListItem,
classNameFileButtonDownload = _useMerchiFormContext.classNameFileButtonDownload,
classNameFileButtonDelete = _useMerchiFormContext.classNameFileButtonDelete;
return /*#__PURE__*/_jsx("li", {
className: classNameFileListItem,
children: /*#__PURE__*/_jsxs("div", {
style: {
display: 'flex',
alignItems: 'center',
justifyContent: 'center',
minHeight: '2.5rem'
},
children: [/*#__PURE__*/_jsx("span", {
className: "ml-3",
children: file.name
}), !disabled && /*#__PURE__*/_jsxs("div", {
style: {
marginLeft: 'auto'
},
children: [/*#__PURE__*/_jsx("a", {
className: classNameFileButtonDownload,
href: file.downloadUrl,
download: true,
children: /*#__PURE__*/_jsx(FaDownload, {})
}), doDelete && /*#__PURE__*/_jsx("button", {
className: classNameFileButtonDelete,
onClick: doDelete,
disabled: Boolean(loading),
children: loading ? /*#__PURE__*/_jsx(LoadingIcon, {}) : /*#__PURE__*/_jsx(FaTrash, {})
})]
})]
})
});
}
function VariationFilesList(_ref2) {
var files = _ref2.files;
var _useMerchiFormContext2 = useMerchiFormContext(),
classNameFileListItemContainer = _useMerchiFormContext2.classNameFileListItemContainer;
return /*#__PURE__*/_jsx("ul", {
className: classNameFileListItemContainer,
children: files.map(function (f, i) {
return /*#__PURE__*/_jsx(FileListItem, {
file: f
}, "".concat(i, "-publicfile"));
})
});
}
function determineBoolean(value) {
return isBoolean(value) ? value : value === 'true' ? true : false;
}
function VariationFile(_ref3) {
var deleteVariationFile = _ref3.deleteVariationFile,
file = _ref3.file,
index = _ref3.index,
inputName = _ref3.inputName;
var _useMerchiFormContext3 = useMerchiFormContext(),
classNameFilePreviewContainer = _useMerchiFormContext3.classNameFilePreviewContainer,
classNameFilePreviewIconWrapper = _useMerchiFormContext3.classNameFilePreviewIconWrapper;
return /*#__PURE__*/_jsxs("div", {
className: classNameFilePreviewContainer,
onClick: function onClick() {
return deleteVariationFile(file);
},
children: [/*#__PURE__*/_jsx("div", {
className: classNameFilePreviewIconWrapper,
onClick: function onClick() {
return deleteVariationFile(file);
},
children: /*#__PURE__*/_jsx(FaTimes, {
className: "close-icon"
})
}), /*#__PURE__*/_jsx(IconFile, {
file: file
}), /*#__PURE__*/_jsx(InputHiddenStatic, {
name: "".concat(inputName, "[").concat(index, "].id"),
rules: {
required: true
},
value: file.id
})]
});
}
function ButtonUploadedFiles(_ref4) {
var files = _ref4.files,
isOpen = _ref4.isOpen,
onClick = _ref4.onClick;
var hasFiles = Array.isArray(files) && files.length > 0;
var text = files.length !== 1 ? "".concat(files.length, " files selected") : '1 file selected';
var Icon = isOpen ? FaChevronUp : FaChevronDown;
var _useMerchiFormContext4 = useMerchiFormContext(),
classNameFileUploadButton = _useMerchiFormContext4.classNameFileUploadButton;
return /*#__PURE__*/_jsxs("button", {
type: "button",
className: classNameFileUploadButton,
disabled: files.length === 0,
onClick: onClick,
children: [hasFiles ? text : 'No files selected', ' ', hasFiles && /*#__PURE__*/_jsx(Icon, {})]
});
}
function VariationFileInput(_ref5) {
var disabled = _ref5.disabled,
name = _ref5.name,
variation = _ref5.variation;
var _useMerchiFormContext5 = useMerchiFormContext(),
classNameFileUploadContainer = _useMerchiFormContext5.classNameFileUploadContainer,
control = _useMerchiFormContext5.control;
var inputName = "".concat(name, ".variationFiles");
var variationField = variation.variationField;
var allowFileMultiple = variationField.allowFileMultiple,
placeholder = variationField.placeholder,
required = variationField.required,
showFilePreview = variationField.showFilePreview;
var _useFieldArray = useFieldArray({
control: control,
keyName: 'fileId',
name: inputName,
rules: {
required: required
}
}),
append = _useFieldArray.append,
fields = _useFieldArray.fields,
remove = _useFieldArray.remove;
var hasFiles = isArray(fields) && fields.length;
var _useState = useState(Boolean(hasFiles)),
_useState2 = _slicedToArray(_useState, 2),
isOpen = _useState2[0],
setIsOpen = _useState2[1];
var toggle = function toggle() {
return setIsOpen(!isOpen);
};
var _allowFileMultiple = determineBoolean(allowFileMultiple);
var _showFilePreview = determineBoolean(showFilePreview);
function handleUploadSuccess(fs) {
if (_allowFileMultiple) {
append(fs);
} else {
if (hasFiles) remove(0);
append(fs);
}
}
return /*#__PURE__*/_jsxs("div", {
className: classNameFileUploadContainer,
children: [/*#__PURE__*/_jsx(VariationLabel, {
variationClassName: "merchi-embed-form_input-file",
variation: variation
}), /*#__PURE__*/_jsx(DropzoneInput, {
accept: allowedFileTypes(variationField),
disabled: disabled,
multiple: allowFileMultiple,
onUploadSuccess: handleUploadSuccess,
placeholder: placeholder
}), /*#__PURE__*/_jsx(VariationError, {
name: name
}), /*#__PURE__*/_jsx("div", {
className: "uploaded-variation-files",
children: fields.map(function (file, index) {
return _showFilePreview ? /*#__PURE__*/_jsx("fieldset", {
className: "d-inline-block mr-2",
children: /*#__PURE__*/_jsx(VariationFile, {
deleteVariationFile: function deleteVariationFile() {
return remove(index);
},
file: file,
index: index,
inputName: inputName
}, "".concat(name, "-file-key-").concat(index))
}, file.fileId) : /*#__PURE__*/_jsx(InputHiddenStatic, {
name: "".concat(inputName, "[").concat(index, "].id"),
rules: {
required: true
},
value: file.id
}, "".concat(name, "-file-key-").concat(index));
})
}), !_showFilePreview && /*#__PURE__*/_jsxs(_Fragment, {
children: [/*#__PURE__*/_jsx(Collapse, {
isOpen: Boolean(isOpen),
children: /*#__PURE__*/_jsx(VariationFilesList, {
files: fields
})
}), /*#__PURE__*/_jsx("div", {
className: "clearfix mb-3",
children: /*#__PURE__*/_jsx(ButtonUploadedFiles, {
files: fields,
isOpen: isOpen,
onClick: toggle
})
})]
})]
});
}
export default VariationFileInput;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfc2xpY2VkVG9BcnJheSIsInIiLCJlIiwiX2FycmF5V2l0aEhvbGVzIiwiX2l0ZXJhYmxlVG9BcnJheUxpbWl0IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwiX25vbkl0ZXJhYmxlUmVzdCIsIlR5cGVFcnJvciIsImEiLCJfYXJyYXlMaWtlVG9BcnJheSIsInQiLCJ0b1N0cmluZyIsImNhbGwiLCJzbGljZSIsImNvbnN0cnVjdG9yIiwibmFtZSIsIkFycmF5IiwiZnJvbSIsInRlc3QiLCJsZW5ndGgiLCJuIiwibCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiaSIsInUiLCJmIiwibyIsIm5leHQiLCJPYmplY3QiLCJkb25lIiwicHVzaCIsInZhbHVlIiwiaXNBcnJheSIsIlJlYWN0IiwidXNlU3RhdGUiLCJpc0Jvb2xlYW4iLCJJY29uRmlsZSIsImFsbG93ZWRGaWxlVHlwZXMiLCJEcm9wem9uZUlucHV0IiwiSW5wdXRIaWRkZW5TdGF0aWMiLCJWYXJpYXRpb25FcnJvciIsIlZhcmlhdGlvbkxhYmVsIiwiQ29sbGFwc2UiLCJ1c2VGaWVsZEFycmF5IiwiRmFDaGV2cm9uRG93biIsIkZhQ2hldnJvblVwIiwiRmFEb3dubG9hZCIsIkZhVGltZXMiLCJGYVRyYXNoIiwiQ2dTcGlubmVyIiwidXNlTWVyY2hpRm9ybUNvbnRleHQiLCJqc3giLCJfanN4IiwianN4cyIsIl9qc3hzIiwiRnJhZ21lbnQiLCJfRnJhZ21lbnQiLCJMb2FkaW5nSWNvbiIsImNsYXNzTmFtZSIsIkZpbGVMaXN0SXRlbSIsIl9yZWYiLCJmaWxlIiwiZGlzYWJsZWQiLCJkb0RlbGV0ZSIsImxvYWRpbmciLCJfdXNlTWVyY2hpRm9ybUNvbnRleHQiLCJjbGFzc05hbWVGaWxlTGlzdEl0ZW0iLCJjbGFzc05hbWVGaWxlQnV0dG9uRG93bmxvYWQiLCJjbGFzc05hbWVGaWxlQnV0dG9uRGVsZXRlIiwiY2hpbGRyZW4iLCJzdHlsZSIsImRpc3BsYXkiLCJhbGlnbkl0ZW1zIiwianVzdGlmeUNvbnRlbnQiLCJtaW5IZWlnaHQiLCJtYXJnaW5MZWZ0IiwiaHJlZiIsImRvd25sb2FkVXJsIiwiZG93bmxvYWQiLCJvbkNsaWNrIiwiQm9vbGVhbiIsIlZhcmlhdGlvbkZpbGVzTGlzdCIsIl9yZWYyIiwiZmlsZXMiLCJfdXNlTWVyY2hpRm9ybUNvbnRleHQyIiwiY2xhc3NOYW1lRmlsZUxpc3RJdGVtQ29udGFpbmVyIiwibWFwIiwiY29uY2F0IiwiZGV0ZXJtaW5lQm9vbGVhbiIsIlZhcmlhdGlvbkZpbGUiLCJfcmVmMyIsImRlbGV0ZVZhcmlhdGlvbkZpbGUiLCJpbmRleCIsImlucHV0TmFtZSIsIl91c2VNZXJjaGlGb3JtQ29udGV4dDMiLCJjbGFzc05hbWVGaWxlUHJldmlld0NvbnRhaW5lciIsImNsYXNzTmFtZUZpbGVQcmV2aWV3SWNvbldyYXBwZXIiLCJydWxlcyIsInJlcXVpcmVkIiwiaWQiLCJCdXR0b25VcGxvYWRlZEZpbGVzIiwiX3JlZjQiLCJpc09wZW4iLCJoYXNGaWxlcyIsInRleHQiLCJJY29uIiwiX3VzZU1lcmNoaUZvcm1Db250ZXh0NCIsImNsYXNzTmFtZUZpbGVVcGxvYWRCdXR0b24iLCJ0eXBlIiwiVmFyaWF0aW9uRmlsZUlucHV0IiwiX3JlZjUiLCJ2YXJpYXRpb24iLCJfdXNlTWVyY2hpRm9ybUNvbnRleHQ1IiwiY2xhc3NOYW1lRmlsZVVwbG9hZENvbnRhaW5lciIsImNvbnRyb2wiLCJ2YXJpYXRpb25GaWVsZCIsImFsbG93RmlsZU11bHRpcGxlIiwicGxhY2Vob2xkZXIiLCJzaG93RmlsZVByZXZpZXciLCJfdXNlRmllbGRBcnJheSIsImtleU5hbWUiLCJhcHBlbmQiLCJmaWVsZHMiLCJyZW1vdmUiLCJfdXNlU3RhdGUiLCJfdXNlU3RhdGUyIiwic2V0SXNPcGVuIiwidG9nZ2xlIiwiX2FsbG93RmlsZU11bHRpcGxlIiwiX3Nob3dGaWxlUHJldmlldyIsImhhbmRsZVVwbG9hZFN1Y2Nlc3MiLCJmcyIsInZhcmlhdGlvbkNsYXNzTmFtZSIsImFjY2VwdCIsIm11bHRpcGxlIiwib25VcGxvYWRTdWNjZXNzIiwiZmlsZUlkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbXBvbmVudHMvVmFyaWF0aW9uRmlsZUlucHV0LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIndXNlIGNsaWVudCc7XHJcbmltcG9ydCAqIGFzIFJlYWN0IGZyb20gJ3JlYWN0J1xyXG5pbXBvcnQgeyB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0JztcclxuaW1wb3J0IHsgaXNCb29sZWFuLCBpc0FycmF5IH0gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgSWNvbkZpbGUgfSBmcm9tICcuL2ljb25zJztcclxuaW1wb3J0IHsgYWxsb3dlZEZpbGVUeXBlcyB9IGZyb20gJy4vdXRpbHMnO1xyXG5pbXBvcnQgRHJvcHpvbmVJbnB1dCBmcm9tICcuL0Ryb3B6b25lSW5wdXQnO1xyXG5pbXBvcnQgSW5wdXRIaWRkZW5TdGF0aWMgZnJvbSAnLi9JbnB1dEhpZGRlblN0YXRpYyc7XHJcbmltcG9ydCBWYXJpYXRpb25FcnJvciBmcm9tICcuL1ZhcmlhdGlvbkVycm9yJztcclxuaW1wb3J0IFZhcmlhdGlvbkxhYmVsIGZyb20gJy4vVmFyaWF0aW9uTGFiZWwnO1xyXG5pbXBvcnQgQ29sbGFwc2UgZnJvbSAnLi9Db2xsYXBzZSc7XHJcbmltcG9ydCB7IHVzZUZpZWxkQXJyYXkgfSBmcm9tICdyZWFjdC1ob29rLWZvcm0nO1xyXG5pbXBvcnQge1xyXG4gIEZhQ2hldnJvbkRvd24sXHJcbiAgRmFDaGV2cm9uVXAsXHJcbiAgRmFEb3dubG9hZCxcclxuICBGYVRpbWVzLFxyXG4gIEZhVHJhc2gsXHJcbn0gZnJvbSAncmVhY3QtaWNvbnMvZmEnO1xyXG5pbXBvcnQgeyBDZ1NwaW5uZXIgfSBmcm9tICdyZWFjdC1pY29ucy9jZyc7XHJcbmltcG9ydCB7IHVzZU1lcmNoaUZvcm1Db250ZXh0IH0gZnJvbSAnLi4vY29udGV4dC9NZXJjaGlQcm9kdWN0Rm9ybVByb3ZpZGVyJztcclxuXHJcbmNvbnN0IExvYWRpbmdJY29uID0gKCkgPT4gPENnU3Bpbm5lciBjbGFzc05hbWU9J2FuaW1hdGVfc3BpbicgLz47XHJcblxyXG5pbnRlcmZhY2UgUHJvcHNGaWxlTGlzdEl0ZW0ge1xyXG4gIGZpbGU6IGFueTtcclxuICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgZG9EZWxldGU/OiAoKSA9PiB2b2lkO1xyXG4gIGxvYWRpbmc/OiBib29sZWFuO1xyXG59XHJcblxyXG5mdW5jdGlvbiBGaWxlTGlzdEl0ZW0oe1xyXG4gIGZpbGUsXHJcbiAgZGlzYWJsZWQsXHJcbiAgZG9EZWxldGUsXHJcbiAgbG9hZGluZyxcclxufTogUHJvcHNGaWxlTGlzdEl0ZW0pIHtcclxuICBjb25zdCB7XHJcbiAgICBjbGFzc05hbWVGaWxlTGlzdEl0ZW0sXHJcbiAgICBjbGFzc05hbWVGaWxlQnV0dG9uRG93bmxvYWQsXHJcbiAgICBjbGFzc05hbWVGaWxlQnV0dG9uRGVsZXRlLFxyXG4gIH0gPSB1c2VNZXJjaGlGb3JtQ29udGV4dCgpO1xyXG4gIHJldHVybiAoXHJcbiAgICA8bGkgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlTGlzdEl0ZW19PlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgc3R5bGU9e3tcclxuICAgICAgICAgIGRpc3BsYXk6ICdmbGV4JyxcclxuICAgICAgICAgIGFsaWduSXRlbXM6ICdjZW50ZXInLFxyXG4gICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICdjZW50ZXInLFxyXG4gICAgICAgICAgbWluSGVpZ2h0OiAnMi41cmVtJyxcclxuICAgICAgICB9fVxyXG4gICAgICA+XHJcbiAgICAgICAgPHNwYW4gY2xhc3NOYW1lPSdtbC0zJz57ZmlsZS5uYW1lfTwvc3Bhbj5cclxuICAgICAgICB7IWRpc2FibGVkICYmIChcclxuICAgICAgICAgIDxkaXYgc3R5bGU9e3sgbWFyZ2luTGVmdDogJ2F1dG8nIH19PlxyXG4gICAgICAgICAgICA8YVxyXG4gICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3NOYW1lRmlsZUJ1dHRvbkRvd25sb2FkfVxyXG4gICAgICAgICAgICAgIGhyZWY9e2ZpbGUuZG93bmxvYWRVcmx9XHJcbiAgICAgICAgICAgICAgZG93bmxvYWRcclxuICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgIDxGYURvd25sb2FkIC8+XHJcbiAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAge2RvRGVsZXRlICYmIChcclxuICAgICAgICAgICAgICA8YnV0dG9uXHJcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZUZpbGVCdXR0b25EZWxldGV9XHJcbiAgICAgICAgICAgICAgICBvbkNsaWNrPXtkb0RlbGV0ZX1cclxuICAgICAgICAgICAgICAgIGRpc2FibGVkPXtCb29sZWFuKGxvYWRpbmcpfVxyXG4gICAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHtsb2FkaW5nID8gKFxyXG4gICAgICAgICAgICAgICAgICA8TG9hZGluZ0ljb24gLz5cclxuICAgICAgICAgICAgICAgICkgOiAoXHJcbiAgICAgICAgICAgICAgICAgIDxGYVRyYXNoIC8+XHJcbiAgICAgICAgICAgICAgICApfVxyXG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICApfVxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2xpPlxyXG4gICk7XHJcbn1cclxuXHJcbmludGVyZmFjZSBWYXJpYXRpb25GaWxlc0xpc3RQcm9wcyB7XHJcbiAgZmlsZXM6IEFycmF5PGFueT47XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFZhcmlhdGlvbkZpbGVzTGlzdCh7IGZpbGVzIH06IFZhcmlhdGlvbkZpbGVzTGlzdFByb3BzKSB7XHJcbiAgY29uc3QgeyBjbGFzc05hbWVGaWxlTGlzdEl0ZW1Db250YWluZXIgfSA9IHVzZU1lcmNoaUZvcm1Db250ZXh0KCk7XHJcbiAgcmV0dXJuIChcclxuICAgIDx1bCBjbGFzc05hbWU9e2NsYXNzTmFtZUZpbGVMaXN0SXRlbUNvbnRhaW5lcn0+XHJcbiAgICAgIHtmaWxlcy5tYXAoKGY6IGFueSwgaTogbnVtYmVyKSA9PiAoXHJcbiAgICAgICAgPEZpbGVMaXN0SXRlbSBrZXk9e2Ake2l9LXB1YmxpY2ZpbGVgfSBmaWxlPXtmfSAvPlxyXG4gICAgICApKX1cclxuICAgIDwvdWw+XHJcbiAgKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZGV0ZXJtaW5lQm9vbGVhbih2YWx1ZTogYW55KSB7XHJcbiAgcmV0dXJuIGlzQm9vbGVhbih2YWx1ZSkgPyB2YWx1ZSA6IHZhbHVlID09PSAndHJ1ZScgPyB0cnVlIDogZmFsc2U7XHJcbn1cclxuXHJcbmludGVyZmFjZSBWYXJpYXRpb25GaWxlUHJvcHMge1xyXG4gIGRlbGV0ZVZhcmlhdGlvbkZpbGU6IChmaWxlOiBhbnkpID0+IHZvaWQ7XHJcbiAgZmlsZTogYW55O1xyXG4gIGluZGV4OiBudW1iZXI7XHJcbiAgaW5wdXROYW1lOiBzdHJpbmc7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFZhcmlhdGlvbkZpbGUoe1xyXG4gIGRlbGV0ZVZhcmlhdGlvbkZpbGUsXHJcbiAgZmlsZSxcclxuICBpbmRleCxcclxuICBpbnB1dE5hbWUsXHJcbn06IFZhcmlhdGlvbkZpbGVQcm9wcykge1xyXG4gIGNvbnN0IHtcclxuICAgIGNsYXNzTmFtZUZpbGVQcmV2aWV3Q29udGFpbmVyLFxyXG4gICAgY2xhc3NOYW1lRmlsZVByZXZpZXdJY29uV3JhcHBlcixcclxuICB9ID0gdXNlTWVyY2hpRm9ybUNvbnRleHQoKTtcclxuICByZXR1cm4gKFxyXG4gICAgPGRpdlxyXG4gICAgICBjbGFzc05hbWU9e2NsYXNzTmFtZUZpbGVQcmV2aWV3Q29udGFpbmVyfVxyXG4gICAgICBvbkNsaWNrPXsoKSA9PiBkZWxldGVWYXJpYXRpb25GaWxlKGZpbGUpfVxyXG4gICAgPlxyXG4gICAgICA8ZGl2XHJcbiAgICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlUHJldmlld0ljb25XcmFwcGVyfVxyXG4gICAgICAgIG9uQ2xpY2s9eygpID0+IGRlbGV0ZVZhcmlhdGlvbkZpbGUoZmlsZSl9XHJcbiAgICAgID5cclxuICAgICAgICA8RmFUaW1lcyBjbGFzc05hbWU9J2Nsb3NlLWljb24nIC8+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8SWNvbkZpbGUgZmlsZT17ZmlsZX0gLz5cclxuICAgICAgPElucHV0SGlkZGVuU3RhdGljXHJcbiAgICAgICAgbmFtZT17YCR7aW5wdXROYW1lfVske2luZGV4fV0uaWRgfVxyXG4gICAgICAgIHJ1bGVzPXt7IHJlcXVpcmVkOiB0cnVlIH19XHJcbiAgICAgICAgdmFsdWU9e2ZpbGUuaWR9XHJcbiAgICAgIC8+XHJcbiAgICA8L2Rpdj5cclxuICApO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgQnV0dG9uVXBsb2FkZWRGaWxlc1Byb3BzIHtcclxuICBmaWxlczogQXJyYXk8YW55PjtcclxuICBpc09wZW4/OiBib29sZWFuO1xyXG4gIG9uQ2xpY2s6ICgpID0+IHZvaWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIEJ1dHRvblVwbG9hZGVkRmlsZXMoe1xyXG4gIGZpbGVzLFxyXG4gIGlzT3BlbixcclxuICBvbkNsaWNrLFxyXG59OiBCdXR0b25VcGxvYWRlZEZpbGVzUHJvcHMpIHtcclxuICBjb25zdCBoYXNGaWxlcyA9IEFycmF5LmlzQXJyYXkoZmlsZXMpICYmIGZpbGVzLmxlbmd0aCA+IDA7XHJcbiAgY29uc3QgdGV4dCA9XHJcbiAgICBmaWxlcy5sZW5ndGggIT09IDEgPyBgJHtmaWxlcy5sZW5ndGh9IGZpbGVzIHNlbGVjdGVkYCA6ICcxIGZpbGUgc2VsZWN0ZWQnO1xyXG4gIGNvbnN0IEljb24gPSBpc09wZW4gPyBGYUNoZXZyb25VcCA6IEZhQ2hldnJvbkRvd247XHJcbiAgY29uc3QgeyBjbGFzc05hbWVGaWxlVXBsb2FkQnV0dG9uIH0gPSB1c2VNZXJjaGlGb3JtQ29udGV4dCgpO1xyXG4gIHJldHVybiAoXHJcbiAgICA8YnV0dG9uXHJcbiAgICAgIHR5cGU9J2J1dHRvbidcclxuICAgICAgY2xhc3NOYW1lPXtjbGFzc05hbWVGaWxlVXBsb2FkQnV0dG9ufVxyXG4gICAgICBkaXNhYmxlZD17ZmlsZXMubGVuZ3RoID09PSAwfVxyXG4gICAgICBvbkNsaWNrPXtvbkNsaWNrfVxyXG4gICAgPlxyXG4gICAgICB7aGFzRmlsZXMgPyB0ZXh0IDogJ05vIGZpbGVzIHNlbGVjdGVkJ317JyAnfVxyXG4gICAgICB7aGFzRmlsZXMgJiYgPEljb24gLz59XHJcbiAgICA8L2J1dHRvbj5cclxuICApO1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUHJvcHMge1xyXG4gIGRpc2FibGVkPzogYm9vbGVhbjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgdmFyaWF0aW9uOiBhbnk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIFZhcmlhdGlvbkZpbGVJbnB1dCh7IGRpc2FibGVkLCBuYW1lLCB2YXJpYXRpb24gfTogUHJvcHMpIHtcclxuICBjb25zdCB7IGNsYXNzTmFtZUZpbGVVcGxvYWRDb250YWluZXIsIGNvbnRyb2wgfSA9IHVzZU1lcmNoaUZvcm1Db250ZXh0KCk7XHJcbiAgY29uc3QgaW5wdXROYW1lID0gYCR7bmFtZX0udmFyaWF0aW9uRmlsZXNgO1xyXG4gIGNvbnN0IHsgdmFyaWF0aW9uRmllbGQgfSA9IHZhcmlhdGlvbjtcclxuICBjb25zdCB7IGFsbG93RmlsZU11bHRpcGxlLCBwbGFjZWhvbGRlciwgcmVxdWlyZWQsIHNob3dGaWxlUHJldmlldyB9ID1cclxuICAgIHZhcmlhdGlvbkZpZWxkO1xyXG4gIGNvbnN0IHsgYXBwZW5kLCBmaWVsZHMsIHJlbW92ZSB9ID0gdXNlRmllbGRBcnJheSh7XHJcbiAgICBjb250cm9sLFxyXG4gICAga2V5TmFtZTogJ2ZpbGVJZCcsXHJcbiAgICBuYW1lOiBpbnB1dE5hbWUsXHJcbiAgICBydWxlczogeyByZXF1aXJlZCB9LFxyXG4gIH0pO1xyXG4gIGNvbnN0IGhhc0ZpbGVzID0gaXNBcnJheShmaWVsZHMpICYmIGZpZWxkcy5sZW5ndGg7XHJcbiAgY29uc3QgW2lzT3Blbiwgc2V0SXNPcGVuXSA9IHVzZVN0YXRlKEJvb2xlYW4oaGFzRmlsZXMpKTtcclxuICBjb25zdCB0b2dnbGUgPSAoKSA9PiBzZXRJc09wZW4oIWlzT3Blbik7XHJcbiAgY29uc3QgX2FsbG93RmlsZU11bHRpcGxlID0gZGV0ZXJtaW5lQm9vbGVhbihhbGxvd0ZpbGVNdWx0aXBsZSk7XHJcbiAgY29uc3QgX3Nob3dGaWxlUHJldmlldyA9IGRldGVybWluZUJvb2xlYW4oc2hvd0ZpbGVQcmV2aWV3KTtcclxuICBmdW5jdGlvbiBoYW5kbGVVcGxvYWRTdWNjZXNzKGZzOiBhbnkpIHtcclxuICAgIGlmIChfYWxsb3dGaWxlTXVsdGlwbGUpIHtcclxuICAgICAgYXBwZW5kKGZzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChoYXNGaWxlcykgcmVtb3ZlKDApO1xyXG4gICAgICBhcHBlbmQoZnMpO1xyXG4gICAgfVxyXG4gIH1cclxuICByZXR1cm4gKFxyXG4gICAgPGRpdiBjbGFzc05hbWU9e2NsYXNzTmFtZUZpbGVVcGxvYWRDb250YWluZXJ9PlxyXG4gICAgICA8VmFyaWF0aW9uTGFiZWxcclxuICAgICAgICB2YXJpYXRpb25DbGFzc05hbWU9J21lcmNoaS1lbWJlZC1mb3JtX2lucHV0LWZpbGUnXHJcbiAgICAgICAgdmFyaWF0aW9uPXt2YXJpYXRpb259XHJcbiAgICAgIC8+XHJcbiAgICAgIDxEcm9wem9uZUlucHV0XHJcbiAgICAgICAgYWNjZXB0PXthbGxvd2VkRmlsZVR5cGVzKHZhcmlhdGlvbkZpZWxkKX1cclxuICAgICAgICBkaXNhYmxlZD17ZGlzYWJsZWR9XHJcbiAgICAgICAgbXVsdGlwbGU9e2FsbG93RmlsZU11bHRpcGxlfVxyXG4gICAgICAgIG9uVXBsb2FkU3VjY2Vzcz17aGFuZGxlVXBsb2FkU3VjY2Vzc31cclxuICAgICAgICBwbGFjZWhvbGRlcj17cGxhY2Vob2xkZXJ9XHJcbiAgICAgIC8+XHJcbiAgICAgIDxWYXJpYXRpb25FcnJvciBuYW1lPXtuYW1lfSAvPlxyXG4gICAgICA8ZGl2IGNsYXNzTmFtZT0ndXBsb2FkZWQtdmFyaWF0aW9uLWZpbGVzJz5cclxuICAgICAgICB7ZmllbGRzLm1hcCgoZmlsZTogYW55LCBpbmRleDogbnVtYmVyKSA9PlxyXG4gICAgICAgICAgX3Nob3dGaWxlUHJldmlldyA/IChcclxuICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzTmFtZT0nZC1pbmxpbmUtYmxvY2sgbXItMicga2V5PXtmaWxlLmZpbGVJZH0+XHJcbiAgICAgICAgICAgICAgPFZhcmlhdGlvbkZpbGVcclxuICAgICAgICAgICAgICAgIGtleT17YCR7bmFtZX0tZmlsZS1rZXktJHtpbmRleH1gfVxyXG4gICAgICAgICAgICAgICAgZGVsZXRlVmFyaWF0aW9uRmlsZT17KCkgPT4gcmVtb3ZlKGluZGV4KX1cclxuICAgICAgICAgICAgICAgIGZpbGU9e2ZpbGV9XHJcbiAgICAgICAgICAgICAgICBpbmRleD17aW5kZXh9XHJcbiAgICAgICAgICAgICAgICBpbnB1dE5hbWU9e2lucHV0TmFtZX1cclxuICAgICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8L2ZpZWxkc2V0PlxyXG4gICAgICAgICAgKSA6IChcclxuICAgICAgICAgICAgPElucHV0SGlkZGVuU3RhdGljXHJcbiAgICAgICAgICAgICAga2V5PXtgJHtuYW1lfS1maWxlLWtleS0ke2luZGV4fWB9XHJcbiAgICAgICAgICAgICAgbmFtZT17YCR7aW5wdXROYW1lfVske2luZGV4fV0uaWRgfVxyXG4gICAgICAgICAgICAgIHJ1bGVzPXt7IHJlcXVpcmVkOiB0cnVlIH19XHJcbiAgICAgICAgICAgICAgdmFsdWU9e2ZpbGUuaWR9XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICApXHJcbiAgICAgICAgKX1cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIHshX3Nob3dGaWxlUHJldmlldyAmJiAoXHJcbiAgICAgICAgPD5cclxuICAgICAgICAgIDxDb2xsYXBzZSBpc09wZW49e0Jvb2xlYW4oaXNPcGVuKX0+XHJcbiAgICAgICAgICAgIDxWYXJpYXRpb25GaWxlc0xpc3QgZmlsZXM9e2ZpZWxkc30gLz5cclxuICAgICAgICAgIDwvQ29sbGFwc2U+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT0nY2xlYXJmaXggbWItMyc+XHJcbiAgICAgICAgICAgIDxCdXR0b25VcGxvYWRlZEZpbGVzXHJcbiAgICAgICAgICAgICAgZmlsZXM9e2ZpZWxkc31cclxuICAgICAgICAgICAgICBpc09wZW49e2lzT3Blbn1cclxuICAgICAgICAgICAgICBvbkNsaWNrPXt0b2dnbGV9XHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8Lz5cclxuICAgICAgKX1cclxuICAgIDwvZGl2PlxyXG4gICk7XHJcbn1cclxuXHJcbmV4cG9ydCBkZWZhdWx0IFZhcmlhdGlvbkZpbGVJbnB1dDtcclxuIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZOztBQUFDLFNBQUFBLGVBQUFDLENBQUEsRUFBQUMsQ0FBQSxXQUFBQyxlQUFBLENBQUFGLENBQUEsS0FBQUcscUJBQUEsQ0FBQUgsQ0FBQSxFQUFBQyxDQUFBLEtBQUFHLDJCQUFBLENBQUFKLENBQUEsRUFBQUMsQ0FBQSxLQUFBSSxnQkFBQTtBQUFBLFNBQUFBLGlCQUFBLGNBQUFDLFNBQUE7QUFBQSxTQUFBRiw0QkFBQUosQ0FBQSxFQUFBTyxDQUFBLFFBQUFQLENBQUEsMkJBQUFBLENBQUEsU0FBQVEsaUJBQUEsQ0FBQVIsQ0FBQSxFQUFBTyxDQUFBLE9BQUFFLENBQUEsTUFBQUMsUUFBQSxDQUFBQyxJQUFBLENBQUFYLENBQUEsRUFBQVksS0FBQSw2QkFBQUgsQ0FBQSxJQUFBVCxDQUFBLENBQUFhLFdBQUEsS0FBQUosQ0FBQSxHQUFBVCxDQUFBLENBQUFhLFdBQUEsQ0FBQUMsSUFBQSxhQUFBTCxDQUFBLGNBQUFBLENBQUEsR0FBQU0sS0FBQSxDQUFBQyxJQUFBLENBQUFoQixDQUFBLG9CQUFBUyxDQUFBLCtDQUFBUSxJQUFBLENBQUFSLENBQUEs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