UNPKG

@nlabs/gothamjs

Version:
163 lines (162 loc) 18.4 kB
import { forwardRef, useEffect, useMemo, useRef, useState } from "react"; import { Controller, useFormContext } from "react-hook-form"; import { useIsMobile } from "../../hooks/useIsMobile.js"; import { getOutlineClasses } from "../../utils/colorUtils.js"; import { ErrorMessage } from "../ErrorMessage/ErrorMessage.js"; import { InputField } from "../InputField/InputField.js"; import { Label } from "../Label/Label.js"; import { DatePicker } from "./DatePicker.js"; import { jsx, jsxs } from "react/jsx-runtime"; const DateField = forwardRef(({ className = "w-full rounded-md outline-1 outline-solid focus:outline-3 px-3.5 py-2 text-black dark:text-white placeholder:text-black/50 dark:placeholder:text-white/50 sm:text-sm sm:leading-6", color = "primary", defaultValue, disabled = false, error: externalError, label = "", labelClass = "mb-1", labelColor = "neutral", maxDate, minDate, name, onChange, type = "text", value, ...props }, ref) => { const isMobile = useIsMobile(); const { control, formState: { errors }, clearErrors, trigger } = useFormContext(); const formError = errors?.[name]; const hasError = !!formError || !!externalError; const [isPickerVisible, setIsPickerVisible] = useState(false); const pickerRef = useRef(null); const inputRef = useRef(null); const outlineClasses = useMemo( () => getOutlineClasses(hasError ? "error" : color, { hasFocus: true, hasHover: true }), [color, hasError] ); const inputClasses = [ "bg-white/30 dark:bg-black/30", disabled ? "text-neutral/30 dark:text-neutral-dark/30 outline-neutral/30 dark:outline-neutral-dark/30" : outlineClasses, className ].filter(Boolean).join(" "); useEffect(() => { if (ref && typeof ref === "object" && inputRef.current) { ref.current = inputRef.current; } }, [ref, inputRef.current]); const ensureDateInRange = (timestamp) => { if (!timestamp) return timestamp; if (minDate && timestamp < minDate) { return minDate; } if (maxDate && timestamp > maxDate) { return maxDate; } return timestamp; }; const formatDateForInput = (timestamp) => { return new Date(timestamp).toISOString().split("T")[0]; }; const parseInputDate = (dateString) => { return new Date(dateString).getTime(); }; const isDateValid = (timestamp) => { if (minDate && timestamp < minDate) { return false; } if (maxDate && timestamp > maxDate) { return false; } return true; }; useEffect(() => { const handleClickOutside = (event) => { if (pickerRef.current && !pickerRef.current.contains(event.target) && inputRef.current && !inputRef.current.contains(event.target)) { setIsPickerVisible(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, []); return /* @__PURE__ */ jsx( Controller, { control, name, defaultValue: value || ensureDateInRange(defaultValue || (/* @__PURE__ */ new Date()).getTime()), render: ({ field }) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col w-full", ref, children: [ /* @__PURE__ */ jsx( Label, { className: labelClass, color: labelColor, hasError, label, name } ), /* @__PURE__ */ jsxs("div", { className: "relative", children: [ /* @__PURE__ */ jsx( InputField, { ...props, ref: inputRef, disabled, value: formatDateForInput(field.value), onChange: (changeEvent) => { const timestamp = parseInputDate(changeEvent.target.value); field.onChange(timestamp); if (isDateValid(timestamp)) { clearErrors(name); trigger(name); } if (onChange) { onChange(timestamp); } }, onFocus: () => { if (!isMobile) { setIsPickerVisible(true); } }, onBlur: () => { trigger(name); }, className: inputClasses, type: isMobile ? "date" : type, min: minDate ? formatDateForInput(minDate) : void 0, max: maxDate ? formatDateForInput(maxDate) : void 0 } ), isPickerVisible && !disabled && !isMobile && /* @__PURE__ */ jsx("div", { ref: pickerRef, className: "absolute z-10 mt-1", children: /* @__PURE__ */ jsx( DatePicker, { initialDate: field.value, minDate, maxDate, onDateSelect: (timestamp) => { field.onChange(timestamp); if (isDateValid(timestamp)) { clearErrors(name); trigger(name); } if (onChange) { onChange(timestamp); } setIsPickerVisible(false); } } ) }), /* @__PURE__ */ jsx(ErrorMessage, { message: formError?.message }) ] }) ] }) } ); }); export { DateField }; //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRGF0ZUZpZWxkL0RhdGVGaWVsZC50c3giXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI1LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge2ZvcndhcmRSZWYsIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHtDb250cm9sbGVyLCB1c2VGb3JtQ29udGV4dH0gZnJvbSAncmVhY3QtaG9vay1mb3JtJztcblxuaW1wb3J0IHt1c2VJc01vYmlsZX0gZnJvbSAnLi4vLi4vaG9va3MvdXNlSXNNb2JpbGUuanMnO1xuaW1wb3J0IHtnZXRPdXRsaW5lQ2xhc3Nlc30gZnJvbSAnLi4vLi4vdXRpbHMvY29sb3JVdGlscy5qcyc7XG5pbXBvcnQge0Vycm9yTWVzc2FnZX0gZnJvbSAnLi4vRXJyb3JNZXNzYWdlL0Vycm9yTWVzc2FnZS5qcyc7XG5pbXBvcnQge0lucHV0RmllbGQsIHR5cGUgSW5wdXRGaWVsZFByb3BzfSBmcm9tICcuLi9JbnB1dEZpZWxkL0lucHV0RmllbGQuanMnO1xuaW1wb3J0IHtMYWJlbH0gZnJvbSAnLi4vTGFiZWwvTGFiZWwuanMnO1xuaW1wb3J0IHtEYXRlUGlja2VyfSBmcm9tICcuL0RhdGVQaWNrZXIuanMnO1xuXG5pbXBvcnQgdHlwZSB7R290aGFtQ29sb3J9IGZyb20gJy4uLy4uL3V0aWxzL2NvbG9yVXRpbHMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERhdGVGaWVsZFByb3BzIGV4dGVuZHMgUmVhY3QuSW5wdXRIVE1MQXR0cmlidXRlczxIVE1MSW5wdXRFbGVtZW50PiB7XG4gIHJlYWRvbmx5IGNsYXNzTmFtZT86IHN0cmluZztcbiAgcmVhZG9ubHkgY29sb3I/OiBHb3RoYW1Db2xvcjtcbiAgcmVhZG9ubHkgZGVmYXVsdFZhbHVlPzogbnVtYmVyO1xuICByZWFkb25seSBkaXNhYmxlZD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGxhYmVsPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENsYXNzPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbENvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgZXJyb3I/OiBib29sZWFuO1xuICByZWFkb25seSBlcnJvckNvbG9yPzogR290aGFtQ29sb3I7XG4gIHJlYWRvbmx5IG1heERhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1pbkRhdGU/OiBudW1iZXI7XG4gIHJlYWRvbmx5IG9uQ2hhbmdlPzogKGRhdGUpID0+IHZvaWQ7XG4gIHJlYWRvbmx5IHZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRGF0ZUZpZWxkID0gZm9yd2FyZFJlZjxIVE1MSW5wdXRFbGVtZW50LCBEYXRlRmllbGRQcm9wcz4oKHtcbiAgY2xhc3NOYW1lID0gJ3ctZnVsbCByb3VuZGVkLW1kIG91dGxpbmUtMSBvdXRsaW5lLXNvbGlkIGZvY3VzOm91dGxpbmUtMyBweC0zLjUgcHktMiB0ZXh0LWJsYWNrIGRhcms6dGV4dC13aGl0ZSBwbGFjZWhvbGRlcjp0ZXh0LWJsYWNrLzUwIGRhcms6cGxhY2Vob2xkZXI6dGV4dC13aGl0ZS81MCBzbTp0ZXh0LXNtIHNtOmxlYWRpbmctNicsXG4gIGNvbG9yID0gJ3ByaW1hcnknLFxuICBkZWZhdWx0VmFsdWUsXG4gIGRpc2FibGVkID0gZmFsc2UsXG4gIGVycm9yOiBleHRlcm5hbEVycm9yLFxuICBsYWJlbCA9ICcnLFxuICBsYWJlbENsYXNzID0gJ21iLTEnLFxuICBsYWJlbENvbG9yID0gJ25ldXRyYWwnLFxuICBtYXhEYXRlLFxuICBtaW5EYXRlLFxuICBuYW1lLFxuICBvbkNoYW5nZSxcbiAgdHlwZSA9ICd0ZXh0JyxcbiAgdmFsdWUsXG4gIC4uLnByb3BzXG59LCByZWYpID0+IHtcbiAgY29uc3QgaXNNb2JpbGUgPSB1c2VJc01vYmlsZSgpO1xuICBjb25zdCB7Y29udHJvbCwgZm9ybVN0YXRlOiB7ZXJyb3JzfSwgY2xlYXJFcnJvcnMsIHRyaWdnZXJ9ID0gdXNlRm9ybUNvbnRleHQoKTtcbiAgY29uc3QgZm9ybUVycm9yID0gZXJyb3JzPy5bbmFtZV07XG4gIGNvbnN0IGhhc0Vycm9yID0gISFmb3JtRXJyb3IgfHwgISFleHRlcm5hbEVycm9yO1xuICBjb25zdCBbaXNQaWNrZXJWaXNpYmxlLCBzZXRJc1BpY2tlclZpc2libGVdID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBwaWNrZXJSZWYgPSB1c2VSZWY8SFRNTERpdkVsZW1lbnQ+KG51bGwpO1xuICBjb25zdCBpbnB1dFJlZiA9IHVzZVJlZjxIVE1MSW5wdXRFbGVtZW50PihudWxsKTtcbiAgY29uc3Qgb3V0bGluZUNsYXNzZXMgPSB1c2VNZW1vKFxuICAgICgpID0+IGdldE91dGxpbmVDbGFzc2VzKGhhc0Vycm9yID8gJ2Vycm9yJyA6IGNvbG9yLCB7aGFzRm9jdXM6IHRydWUsIGhhc0hvdmVyOiB0cnVlfSksXG4gICAgW2NvbG9yLCBoYXNFcnJvcl1cbiAgKTtcbiAgY29uc3QgaW5wdXRDbGFzc2VzID0gW1xuICAgICdiZy13aGl0ZS8zMCBkYXJrOmJnLWJsYWNrLzMwJyxcbiAgICBkaXNhYmxlZCA/ICd0ZXh0LW5ldXRyYWwvMzAgZGFyazp0ZXh0LW5ldXRyYWwtZGFyay8zMCBvdXRsaW5lLW5ldXRyYWwvMzAgZGFyazpvdXRsaW5lLW5ldXRyYWwtZGFyay8zMCcgOiBvdXRsaW5lQ2xhc3NlcyxcbiAgICBjbGFzc05hbWVcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignICcpO1xuXG4gIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgaWYgKHJlZiAmJiB0eXBlb2YgcmVmID09PSAnb2JqZWN0JyAmJiBpbnB1dFJlZi5jdXJyZW50KSB7XG4gICAgICByZWYuY3VycmVudCA9IGlucHV0UmVmLmN1cnJlbnQ7XG4gICAgfVxuICB9LCBbcmVmLCBpbnB1dFJlZi5jdXJyZW50XSk7XG5cbiAgY29uc3QgZW5zdXJlRGF0ZUluUmFuZ2UgPSAodGltZXN0YW1wOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGlmICghdGltZXN0YW1wKSByZXR1cm4gdGltZXN0YW1wO1xuXG4gICAgaWYgKG1pbkRhdGUgJiYgdGltZXN0YW1wIDwgbWluRGF0ZSkge1xuICAgICAgcmV0dXJuIG1pbkRhdGU7XG4gICAgfVxuXG4gICAgaWYgKG1heERhdGUgJiYgdGltZXN0YW1wID4gbWF4RGF0ZSkge1xuICAgICAgcmV0dXJuIG1heERhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRpbWVzdGFtcDtcbiAgfTtcblxuICBjb25zdCBmb3JtYXREYXRlRm9ySW5wdXQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZSh0aW1lc3RhbXApLnRvSVNPU3RyaW5nKCkuc3BsaXQoJ1QnKVswXTtcbiAgfTtcblxuICBjb25zdCBwYXJzZUlucHV0RGF0ZSA9IChkYXRlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIHJldHVybiBuZXcgRGF0ZShkYXRlU3RyaW5nKS5nZXRUaW1lKCk7XG4gIH07XG5cbiAgY29uc3QgaXNEYXRlVmFsaWQgPSAodGltZXN0YW1wOiBudW1iZXIpOiBib29sZWFuID0+IHtcbiAgICBpZiAobWluRGF0ZSAmJiB0aW1lc3RhbXAgPCBtaW5EYXRlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChtYXhEYXRlICYmIHRpbWVzdGFtcCA+IG1heERhdGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH07XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBoYW5kbGVDbGlja091dHNpZGUgPSAoZXZlbnQ6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGlja2VyUmVmLmN1cnJlbnQgJiZcbiAgICAgICAgIXBpY2tlclJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgICBpbnB1dFJlZi5jdXJyZW50ICYmXG4gICAgICAgICFpbnB1dFJlZi5jdXJyZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKVxuICAgICAgKSB7XG4gICAgICAgIHNldElzUGlja2VyVmlzaWJsZShmYWxzZSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIGhhbmRsZUNsaWNrT3V0c2lkZSk7XG4gICAgfTtcbiAgfSwgW10pO1xuXG4gIHJldHVybiAoXG4gICAgPENvbnRyb2xsZXJcbiAgICAgIGNvbnRyb2w9e2NvbnRyb2x9XG4gICAgICBuYW1lPXtuYW1lfVxuICAgICAgZGVmYXVsdFZhbHVlPXt2YWx1ZSB8fCBlbnN1cmVEYXRlSW5SYW5nZShkZWZhdWx0VmFsdWUgfHwgbmV3IERhdGUoKS5nZXRUaW1lKCkpfVxuICAgICAgcmVuZGVyPXsoe2ZpZWxkfSkgPT4gKFxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggZmxleC1jb2wgdy1mdWxsXCIgcmVmPXtyZWZ9PlxuICAgICAgICAgIDxMYWJlbFxuICAgICAgICAgICAgY2xhc3NOYW1lPXtsYWJlbENsYXNzfVxuICAgICAgICAgICAgY29sb3I9e2xhYmVsQ29sb3J9XG4gICAgICAgICAgICBoYXNFcnJvcj17aGFzRXJyb3J9XG4gICAgICAgICAgICBsYWJlbD17bGFiZWx9XG4gICAgICAgICAgICBuYW1lPXtuYW1lfSAvPlxuICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwicmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDxJbnB1dEZpZWxkXG4gICAgICAgICAgICAgIHsuLi5wcm9wcyBhcyBPbWl0PElucHV0RmllbGRQcm9wcywgJ29uQ2hhbmdlJz59XG4gICAgICAgICAgICAgIHJlZj17aW5wdXRSZWZ9XG4gICAgICAgICAgICAgIGRpc2FibGVkPXtkaXNhYmxlZH1cbiAgICAgICAgICAgICAgdmFsdWU9e2Zvcm1hdERhdGVGb3JJbnB1dChmaWVsZC52YWx1ZSl9XG4gICAgICAgICAgICAgIG9uQ2hhbmdlPXsoY2hhbmdlRXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0aW1lc3RhbXAgPSBwYXJzZUlucHV0RGF0ZShjaGFuZ2VFdmVudC50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaXNEYXRlVmFsaWQodGltZXN0YW1wKSkge1xuICAgICAgICAgICAgICAgICAgY2xlYXJFcnJvcnMobmFtZSk7XG4gICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChvbkNoYW5nZSkge1xuICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG9uRm9jdXM9eygpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICBvbkJsdXI9eygpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSBvbiBibHVyXG4gICAgICAgICAgICAgICAgdHJpZ2dlcihuYW1lKTtcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgY2xhc3NOYW1lPXtpbnB1dENsYXNzZXN9XG4gICAgICAgICAgICAgIHR5cGU9e2lzTW9iaWxlID8gJ2RhdGUnIDogdHlwZX1cbiAgICAgICAgICAgICAgbWluPXttaW5EYXRlID8gZm9ybWF0RGF0ZUZvcklucHV0KG1pbkRhdGUpIDogdW5kZWZpbmVkfVxuICAgICAgICAgICAgICBtYXg9e21heERhdGUgPyBmb3JtYXREYXRlRm9ySW5wdXQobWF4RGF0ZSkgOiB1bmRlZmluZWR9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgICAge2lzUGlja2VyVmlzaWJsZSAmJiAhZGlzYWJsZWQgJiYgIWlzTW9iaWxlICYmIChcbiAgICAgICAgICAgICAgPGRpdiByZWY9e3BpY2tlclJlZn0gY2xhc3NOYW1lPVwiYWJzb2x1dGUgei0xMCBtdC0xXCI+XG4gICAgICAgICAgICAgICAgPERhdGVQaWNrZXJcbiAgICAgICAgICAgICAgICAgIGluaXRpYWxEYXRlPXtmaWVsZC52YWx1ZX1cbiAgICAgICAgICAgICAgICAgIG1pbkRhdGU9e21pbkRhdGV9XG4gICAgICAgICAgICAgICAgICBtYXhEYXRlPXttYXhEYXRlfVxuICAgICAgICAgICAgICAgICAgb25EYXRlU2VsZWN0PXsodGltZXN0YW1wKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZpZWxkLm9uQ2hhbmdlKHRpbWVzdGFtcCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGF0ZVZhbGlkKHRpbWVzdGFtcCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjbGVhckVycm9ycyhuYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyKG5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG9uQ2hhbmdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2UodGltZXN0YW1wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBzZXRJc1BpY2tlclZpc2libGUoZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICl9XG4gICAgICAgICAgICA8RXJyb3JNZXNzYWdlIG1lc3NhZ2U9e2Zvcm1FcnJvcj8ubWVzc2FnZSBhcyBzdHJpbmd9IC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgKX1cbiAgICAvPlxuICApO1xufSk7Il0sCiAgIm1hcHBpbmdzIjogIkFBSUEsU0FBUSxZQUFZLFdBQVcsU0FBUyxRQUFRLGdCQUFlO0FBQy9ELFNBQVEsWUFBWSxzQkFBcUI7QUFFekMsU0FBUSxtQkFBa0I7QUFDMUIsU0FBUSx5QkFBd0I7QUFDaEMsU0FBUSxvQkFBbUI7QUFDM0IsU0FBUSxrQkFBdUM7QUFDL0MsU0FBUSxhQUFZO0FBQ3BCLFNBQVEsa0JBQWlCO0FBc0hmLGNBTUEsWUFOQTtBQWpHSCxNQUFNLFlBQVksV0FBNkMsQ0FBQztBQUFBLEVBQ3JFLFlBQVk7QUFBQSxFQUNaLFFBQVE7QUFBQSxFQUNSO0FBQUEsRUFDQSxXQUFXO0FBQUEsRUFDWCxPQUFPO0FBQUEsRUFDUCxRQUFRO0FBQUEsRUFDUixhQUFhO0FBQUEsRUFDYixhQUFhO0FBQUEsRUFDYjtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0EsT0FBTztBQUFBLEVBQ1A7QUFBQSxFQUNBLEdBQUc7QUFDTCxHQUFHLFFBQVE7QUFDVCxRQUFNLFdBQVcsWUFBWTtBQUM3QixRQUFNLEVBQUMsU0FBUyxXQUFXLEVBQUMsT0FBTSxHQUFHLGFBQWEsUUFBTyxJQUFJLGVBQWU7QUFDNUUsUUFBTSxZQUFZLFNBQVMsSUFBSTtBQUMvQixRQUFNLFdBQVcsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQ2xDLFFBQU0sQ0FBQyxpQkFBaUIsa0JBQWtCLElBQUksU0FBUyxLQUFLO0FBQzVELFFBQU0sWUFBWSxPQUF1QixJQUFJO0FBQzdDLFFBQU0sV0FBVyxPQUF5QixJQUFJO0FBQzlDLFFBQU0saUJBQWlCO0FBQUEsSUFDckIsTUFBTSxrQkFBa0IsV0FBVyxVQUFVLE9BQU8sRUFBQyxVQUFVLE1BQU0sVUFBVSxLQUFJLENBQUM7QUFBQSxJQUNwRixDQUFDLE9BQU8sUUFBUTtBQUFBLEVBQ2xCO0FBQ0EsUUFBTSxlQUFlO0FBQUEsSUFDbkI7QUFBQSxJQUNBLFdBQVcsOEZBQThGO0FBQUEsSUFDekc7QUFBQSxFQUNGLEVBQUUsT0FBTyxPQUFPLEVBQUUsS0FBSyxHQUFHO0FBRTFCLFlBQVUsTUFBTTtBQUNkLFFBQUksT0FBTyxPQUFPLFFBQVEsWUFBWSxTQUFTLFNBQVM7QUFDdEQsVUFBSSxVQUFVLFNBQVM7QUFBQSxJQUN6QjtBQUFBLEVBQ0YsR0FBRyxDQUFDLEtBQUssU0FBUyxPQUFPLENBQUM7QUFFMUIsUUFBTSxvQkFBb0IsQ0FBQyxjQUE4QjtBQUN2RCxRQUFJLENBQUMsVUFBVyxRQUFPO0FBRXZCLFFBQUksV0FBVyxZQUFZLFNBQVM7QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLFdBQVcsWUFBWSxTQUFTO0FBQ2xDLGFBQU87QUFBQSxJQUNUO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLHFCQUFxQixDQUFDLGNBQThCO0FBQ3hELFdBQU8sSUFBSSxLQUFLLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUFBLEVBQ3ZEO0FBRUEsUUFBTSxpQkFBaUIsQ0FBQyxlQUErQjtBQUNyRCxXQUFPLElBQUksS0FBSyxVQUFVLEVBQUUsUUFBUTtBQUFBLEVBQ3RDO0FBRUEsUUFBTSxjQUFjLENBQUMsY0FBK0I7QUFDbEQsUUFBSSxXQUFXLFlBQVksU0FBUztBQUNsQyxhQUFPO0FBQUEsSUFDVDtBQUNBLFFBQUksV0FBVyxZQUFZLFNBQVM7QUFDbEMsYUFBTztBQUFBLElBQ1Q7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFlBQVUsTUFBTTtBQUNkLFVBQU0scUJBQXFCLENBQUMsVUFBc0I7QUFDaEQsVUFDRSxVQUFVLFdBQ1YsQ0FBQyxVQUFVLFFBQVEsU0FBUyxNQUFNLE1BQWMsS0FDaEQsU0FBUyxXQUNULENBQUMsU0FBUyxRQUFRLFNBQVMsTUFBTSxNQUFjLEdBQy9DO0FBQ0EsMkJBQW1CLEtBQUs7QUFBQSxNQUMxQjtBQUFBLElBQ0Y7QUFFQSxhQUFTLGlCQUFpQixhQUFhLGtCQUFrQjtBQUN6RCxXQUFPLE1BQU07QUFDWCxlQUFTLG9CQUFvQixhQUFhLGtCQUFrQjtBQUFBLElBQzlEO0FBQUEsRUFDRixHQUFHLENBQUMsQ0FBQztBQUVMLFNBQ0U7QUFBQSxJQUFDO0FBQUE7QUFBQSxNQUNDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsY0FBYyxTQUFTLGtCQUFrQixpQkFBZ0Isb0JBQUksS0FBSyxHQUFFLFFBQVEsQ0FBQztBQUFBLE1BQzdFLFFBQVEsQ0FBQyxFQUFDLE1BQUssTUFDYixxQkFBQyxTQUFJLFdBQVUsd0JBQXVCLEtBQ3BDO0FBQUE7QUFBQSxVQUFDO0FBQUE7QUFBQSxZQUNDLFdBQVc7QUFBQSxZQUNYLE9BQU87QUFBQSxZQUNQO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQTtBQUFBLFFBQVk7QUFBQSxRQUNkLHFCQUFDLFNBQUksV0FBVSxZQUNiO0FBQUE7QUFBQSxZQUFDO0FBQUE7QUFBQSxjQUNFLEdBQUc7QUFBQSxjQUNKLEtBQUs7QUFBQSxjQUNMO0FBQUEsY0FDQSxPQUFPLG1CQUFtQixNQUFNLEtBQUs7QUFBQSxjQUNyQyxVQUFVLENBQUMsZ0JBQWdCO0FBQ3pCLHNCQUFNLFlBQVksZUFBZSxZQUFZLE9BQU8sS0FBSztBQUN6RCxzQkFBTSxTQUFTLFNBQVM7QUFFeEIsb0JBQUksWUFBWSxTQUFTLEdBQUc7QUFDMUIsOEJBQVksSUFBSTtBQUNoQiwwQkFBUSxJQUFJO0FBQUEsZ0JBQ2Q7QUFFQSxvQkFBSSxVQUFVO0FBQ1osMkJBQVMsU0FBUztBQUFBLGdCQUNwQjtBQUFBLGNBQ0Y7QUFBQSxjQUNBLFNBQVMsTUFBTTtBQUNiLG9CQUFJLENBQUMsVUFBVTtBQUNiLHFDQUFtQixJQUFJO0FBQUEsZ0JBQ3pCO0FBQUEsY0FDRjtBQUFBLGNBQ0EsUUFBUSxNQUFNO0FBRVosd0JBQVEsSUFBSTtBQUFBLGNBQ2Q7QUFBQSxjQUNBLFdBQVc7QUFBQSxjQUNYLE1BQU0sV0FBVyxTQUFTO0FBQUEsY0FDMUIsS0FBSyxVQUFVLG1CQUFtQixPQUFPLElBQUk7QUFBQSxjQUM3QyxLQUFLLFVBQVUsbUJBQW1CLE9BQU8sSUFBSTtBQUFBO0FBQUEsVUFDL0M7QUFBQSxVQUNDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxZQUNoQyxvQkFBQyxTQUFJLEtBQUssV0FBVyxXQUFVLHNCQUM3QjtBQUFBLFlBQUM7QUFBQTtBQUFBLGNBQ0MsYUFBYSxNQUFNO0FBQUEsY0FDbkI7QUFBQSxjQUNBO0FBQUEsY0FDQSxjQUFjLENBQUMsY0FBYztBQUMzQixzQkFBTSxTQUFTLFNBQVM7QUFFeEIsb0JBQUksWUFBWSxTQUFTLEdBQUc7QUFDMUIsOEJBQVksSUFBSTtBQUNoQiwwQkFBUSxJQUFJO0FBQUEsZ0JBQ2Q7QUFFQSxvQkFBSSxVQUFVO0FBQ1osMkJBQVMsU0FBUztBQUFBLGdCQUNwQjtBQUNBLG1DQUFtQixLQUFLO0FBQUEsY0FDMUI7QUFBQTtBQUFBLFVBQ0YsR0FDRjtBQUFBLFVBRUYsb0JBQUMsZ0JBQWEsU0FBUyxXQUFXLFNBQW1CO0FBQUEsV0FDdkQ7QUFBQSxTQUNGO0FBQUE7QUFBQSxFQUVKO0FBRUosQ0FBQzsiLAogICJuYW1lcyI6IFtdCn0K