UNPKG

@nlabs/gothamjs

Version:
192 lines (191 loc) 23.7 kB
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { Transition } from '@headlessui/react'; import { useFluxListener } from '@nlabs/arkhamjs-utils-react'; import { cn } from '@nlabs/utils'; import { Fragment, useEffect, useState } from 'react'; import { GothamConstants } from '../../constants/GothamConstants.js'; import { Svg } from '../Svg/Svg.js'; // Custom Button component const Button = ({ children, onClick, className = '' })=>/*#__PURE__*/ _jsx("button", { type: "button", onClick: onClick, className: cn('inline-flex items-center px-4 py-2 border border-transparent text-sm font-medium rounded-md shadow-sm', 'text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500', className), children: children }); // Custom IconButton component const IconButton = ({ children, onClick, className = '' })=>/*#__PURE__*/ _jsx("button", { type: "button", onClick: onClick, className: cn('p-1 rounded-full hover:bg-gray-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500', className), children: children }); // Custom Alert component const Alert = ({ children, severity, onClose })=>{ const bgColors = { error: 'bg-red-500', info: 'bg-blue-500', success: 'bg-green-500', warning: 'bg-yellow-500' }; return /*#__PURE__*/ _jsxs("div", { className: cn('rounded-md p-4 w-full flex items-center justify-between', bgColors[severity] || 'bg-gray-500', 'text-white'), children: [ /*#__PURE__*/ _jsx("div", { children: children }), onClose && /*#__PURE__*/ _jsxs("button", { type: "button", onClick: onClose, className: "ml-auto -mx-1.5 -my-1.5 rounded-md p-1.5 inline-flex text-white hover:bg-opacity-20 hover:bg-black focus:outline-none focus:ring-2 focus:ring-white", children: [ /*#__PURE__*/ _jsx("span", { className: "sr-only", children: "Dismiss" }), /*#__PURE__*/ _jsx("svg", { className: "h-5 w-5", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 20 20", fill: "currentColor", children: /*#__PURE__*/ _jsx("path", { fillRule: "evenodd", d: "M4.293 4.293a1 1 0 011.414 0L10 8.586l4.293-4.293a1 1 0 111.414 1.414L11.414 10l4.293 4.293a1 1 0 01-1.414 1.414L10 11.414l-4.293 4.293a1 1 0 01-1.414-1.414L8.586 10 4.293 5.707a1 1 0 010-1.414z", clipRule: "evenodd" }) }) ] }) ] }); }; export const Notify = ()=>{ const [isOpen, setOpen] = useState(false); const [notification, setNotification] = useState({}); const [timeoutId, setTimeoutId] = useState(null); const notifyClose = ()=>setOpen(false); useEffect(()=>{ if (isOpen && notification.autoHideDuration) { if (timeoutId) { clearTimeout(timeoutId); } const id = setTimeout(()=>{ setOpen(false); }, notification.autoHideDuration); setTimeoutId(id); return ()=>{ clearTimeout(id); }; } return undefined; }, [ isOpen, notification.autoHideDuration, timeoutId ]); const notifyOpen = ({ actions = [], autoHideDuration = 3000, message, severity, anchorOrigin = { horizontal: 'left', vertical: 'bottom' }, ...restProps })=>{ let action; if (actions.length) { action = (key)=>/*#__PURE__*/ _jsx("div", { className: "flex space-x-2", children: actions.map(({ icon, label, onClick }, index)=>/*#__PURE__*/ _jsx(Fragment, { children: icon ? /*#__PURE__*/ _jsx(IconButton, { onClick: ()=>onClick(key), children: /*#__PURE__*/ _jsx(Svg, { color: "inherit", height: 24, name: icon, width: 24 }) }) : /*#__PURE__*/ _jsx(Button, { onClick: ()=>onClick(key), children: label }) }, index)) }); } setNotification({ ...restProps, actions: [ action ], anchorOrigin, autoHideDuration, message: severity ? /*#__PURE__*/ _jsx(Alert, { onClose: notifyClose, severity: severity, children: message }) : message, severity }); setOpen(true); }; useFluxListener(GothamConstants.NOTIFY_OPEN, notifyOpen); useFluxListener(GothamConstants.NOTIFY_CLOSE, notifyClose); const positionClasses = (()=>{ const { horizontal = 'left', vertical = 'bottom' } = notification.anchorOrigin || {}; const positions = { bottom: { center: 'bottom-4 left-1/2 transform -translate-x-1/2', left: 'bottom-4 left-4', right: 'bottom-4 right-4' }, top: { center: 'top-4 left-1/2 transform -translate-x-1/2', left: 'top-4 left-4', right: 'top-4 right-4' } }; return positions[vertical][horizontal]; })(); return /*#__PURE__*/ _jsx(Transition, { show: isOpen, as: Fragment, enter: "transform ease-out duration-300 transition", enterFrom: "translate-y-2 opacity-0 sm:translate-y-0 sm:translate-x-2", enterTo: "translate-y-0 opacity-100 sm:translate-x-0", leave: "transition ease-in duration-100", leaveFrom: "opacity-100", leaveTo: "opacity-0", children: /*#__PURE__*/ _jsx("div", { className: cn('fixed z-50 max-w-sm w-full shadow-lg rounded-lg pointer-events-auto overflow-hidden', positionClasses), children: /*#__PURE__*/ _jsx("div", { className: "ring-1 ring-black ring-opacity-5 bg-white", children: !notification.severity ? /*#__PURE__*/ _jsx("div", { className: "p-4", children: /*#__PURE__*/ _jsxs("div", { className: "flex items-start", children: [ /*#__PURE__*/ _jsx("div", { className: "flex-1", children: notification.message }), notification.actions?.length && /*#__PURE__*/ _jsx("div", { className: "ml-4 flex-shrink-0 flex", children: notification.actions.map(({ icon, label, onClick }, index)=>/*#__PURE__*/ _jsx(Fragment, { children: icon ? /*#__PURE__*/ _jsx(IconButton, { onClick: ()=>onClick('notification'), children: /*#__PURE__*/ _jsx(Svg, { color: "inherit", height: 24, name: icon, width: 24 }) }) : /*#__PURE__*/ _jsx(Button, { onClick: ()=>onClick('notification'), children: label }) }, index)) }) ] }) }) : /*#__PURE__*/ _jsx("div", { children: notification.message }) }) }) }); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy9jb21wb25lbnRzL05vdGlmeS9Ob3RpZnkudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7VHJhbnNpdGlvbn0gZnJvbSAnQGhlYWRsZXNzdWkvcmVhY3QnO1xuaW1wb3J0IHt1c2VGbHV4TGlzdGVuZXJ9IGZyb20gJ0BubGFicy9hcmtoYW1qcy11dGlscy1yZWFjdCc7XG5pbXBvcnQge2NufSBmcm9tICdAbmxhYnMvdXRpbHMnO1xuaW1wb3J0IHtGcmFnbWVudCwgdXNlRWZmZWN0LCB1c2VTdGF0ZX0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQge0dvdGhhbUNvbnN0YW50c30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL0dvdGhhbUNvbnN0YW50cy5qcyc7XG5pbXBvcnQge1N2Z30gZnJvbSAnLi4vU3ZnL1N2Zy5qcyc7XG5cbmltcG9ydCB0eXBlIHtSZWFjdEVsZW1lbnR9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Ob3RpZnlBY3Rpb24ge1xuICByZWFkb25seSBpY29uPzogc3RyaW5nO1xuICByZWFkb25seSBsYWJlbD86IHN0cmluZztcbiAgcmVhZG9ubHkgb25DbGljazogKGtleTogc3RyaW5nKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgdHlwZSBHb3RoYW1TZXZlcml0eSA9ICdlcnJvcicgfCAnaW5mbycgfCAnc3VjY2VzcycgfCAnd2FybmluZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR290aGFtTm90aWZ5UGFyYW1zIHtcbiAgcmVhZG9ubHkgYWN0aW9ucz86IEdvdGhhbU5vdGlmeUFjdGlvbltdO1xuICByZWFkb25seSBhbmNob3JPcmlnaW4/OiB7XG4gICAgdmVydGljYWw6ICd0b3AnIHwgJ2JvdHRvbSc7XG4gICAgaG9yaXpvbnRhbDogJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuICB9O1xuICByZWFkb25seSBhdXRvSGlkZUR1cmF0aW9uPzogbnVtYmVyO1xuICByZWFkb25seSBtZXNzYWdlPzogUmVhY3RFbGVtZW50IHwgc3RyaW5nO1xuICByZWFkb25seSBzZXZlcml0eT86IEdvdGhhbVNldmVyaXR5O1xufVxuXG4vLyBDdXN0b20gQnV0dG9uIGNvbXBvbmVudFxuY29uc3QgQnV0dG9uID0gKHtjaGlsZHJlbiwgb25DbGljaywgY2xhc3NOYW1lID0gJyd9KSA9PiAoXG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBvbkNsaWNrPXtvbkNsaWNrfVxuICAgIGNsYXNzTmFtZT17Y24oXG4gICAgICAnaW5saW5lLWZsZXggaXRlbXMtY2VudGVyIHB4LTQgcHktMiBib3JkZXIgYm9yZGVyLXRyYW5zcGFyZW50IHRleHQtc20gZm9udC1tZWRpdW0gcm91bmRlZC1tZCBzaGFkb3ctc20nLFxuICAgICAgJ3RleHQtd2hpdGUgYmctaW5kaWdvLTYwMCBob3ZlcjpiZy1pbmRpZ28tNzAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWluZGlnby01MDAnLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX1cbiAgPlxuICAgIHtjaGlsZHJlbn1cbiAgPC9idXR0b24+XG4pO1xuXG4vLyBDdXN0b20gSWNvbkJ1dHRvbiBjb21wb25lbnRcbmNvbnN0IEljb25CdXR0b24gPSAoe2NoaWxkcmVuLCBvbkNsaWNrLCBjbGFzc05hbWUgPSAnJ30pID0+IChcbiAgPGJ1dHRvblxuICAgIHR5cGU9XCJidXR0b25cIlxuICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgY2xhc3NOYW1lPXtjbihcbiAgICAgICdwLTEgcm91bmRlZC1mdWxsIGhvdmVyOmJnLWdyYXktMjAwIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy1vZmZzZXQtMiBmb2N1czpyaW5nLWluZGlnby01MDAnLFxuICAgICAgY2xhc3NOYW1lXG4gICAgKX1cbiAgPlxuICAgIHtjaGlsZHJlbn1cbiAgPC9idXR0b24+XG4pO1xuXG4vLyBDdXN0b20gQWxlcnQgY29tcG9uZW50XG5jb25zdCBBbGVydCA9ICh7Y2hpbGRyZW4sIHNldmVyaXR5LCBvbkNsb3NlfSkgPT4ge1xuICBjb25zdCBiZ0NvbG9ycyA9IHtcbiAgICBlcnJvcjogJ2JnLXJlZC01MDAnLFxuICAgIGluZm86ICdiZy1ibHVlLTUwMCcsXG4gICAgc3VjY2VzczogJ2JnLWdyZWVuLTUwMCcsXG4gICAgd2FybmluZzogJ2JnLXllbGxvdy01MDAnXG4gIH07XG5cbiAgcmV0dXJuIChcbiAgICA8ZGl2IGNsYXNzTmFtZT17Y24oXG4gICAgICAncm91bmRlZC1tZCBwLTQgdy1mdWxsIGZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbicsXG4gICAgICBiZ0NvbG9yc1tzZXZlcml0eV0gfHwgJ2JnLWdyYXktNTAwJyxcbiAgICAgICd0ZXh0LXdoaXRlJ1xuICAgICl9PlxuICAgICAgPGRpdj57Y2hpbGRyZW59PC9kaXY+XG4gICAgICB7b25DbG9zZSAmJiAoXG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICBvbkNsaWNrPXtvbkNsb3NlfVxuICAgICAgICAgIGNsYXNzTmFtZT1cIm1sLWF1dG8gLW14LTEuNSAtbXktMS41IHJvdW5kZWQtbWQgcC0xLjUgaW5saW5lLWZsZXggdGV4dC13aGl0ZSBob3ZlcjpiZy1vcGFjaXR5LTIwIGhvdmVyOmJnLWJsYWNrIGZvY3VzOm91dGxpbmUtbm9uZSBmb2N1czpyaW5nLTIgZm9jdXM6cmluZy13aGl0ZVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJzci1vbmx5XCI+RGlzbWlzczwvc3Bhbj5cbiAgICAgICAgICA8c3ZnIGNsYXNzTmFtZT1cImgtNSB3LTVcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgdmlld0JveD1cIjAgMCAyMCAyMFwiIGZpbGw9XCJjdXJyZW50Q29sb3JcIj5cbiAgICAgICAgICAgIDxwYXRoIGZpbGxSdWxlPVwiZXZlbm9kZFwiIGQ9XCJNNC4yOTMgNC4yOTNhMSAxIDAgMDExLjQxNCAwTDEwIDguNTg2bDQuMjkzLTQuMjkzYTEgMSAwIDExMS40MTQgMS40MTRMMTEuNDE0IDEwbDQuMjkzIDQuMjkzYTEgMSAwIDAxLTEuNDE0IDEuNDE0TDEwIDExLjQxNGwtNC4yOTMgNC4yOTNhMSAxIDAgMDEtMS40MTQtMS40MTRMOC41ODYgMTAgNC4yOTMgNS43MDdhMSAxIDAgMDEwLTEuNDE0elwiIGNsaXBSdWxlPVwiZXZlbm9kZFwiIC8+XG4gICAgICAgICAgPC9zdmc+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgKX1cbiAgICA8L2Rpdj5cbiAgKTtcbn07XG5cbmV4cG9ydCBjb25zdCBOb3RpZnkgPSAoKSA9PiB7XG4gIGNvbnN0IFtpc09wZW4sIHNldE9wZW5dID0gdXNlU3RhdGUoZmFsc2UpO1xuICBjb25zdCBbbm90aWZpY2F0aW9uLCBzZXROb3RpZmljYXRpb25dID0gdXNlU3RhdGU8R290aGFtTm90aWZ5UGFyYW1zPih7fSk7XG4gIGNvbnN0IFt0aW1lb3V0SWQsIHNldFRpbWVvdXRJZF0gPSB1c2VTdGF0ZTxOb2RlSlMuVGltZW91dCB8IG51bGw+KG51bGwpO1xuXG4gIGNvbnN0IG5vdGlmeUNsb3NlID0gKCkgPT4gc2V0T3BlbihmYWxzZSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBpZiAoaXNPcGVuICYmIG5vdGlmaWNhdGlvbi5hdXRvSGlkZUR1cmF0aW9uKSB7XG4gICAgICBpZiAodGltZW91dElkKSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBzZXRPcGVuKGZhbHNlKTtcbiAgICAgIH0sIG5vdGlmaWNhdGlvbi5hdXRvSGlkZUR1cmF0aW9uKTtcblxuICAgICAgc2V0VGltZW91dElkKGlkKTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfSwgW2lzT3Blbiwgbm90aWZpY2F0aW9uLmF1dG9IaWRlRHVyYXRpb24sIHRpbWVvdXRJZF0pO1xuXG4gIGNvbnN0IG5vdGlmeU9wZW4gPSAoe1xuICAgIGFjdGlvbnMgPSBbXSxcbiAgICBhdXRvSGlkZUR1cmF0aW9uID0gMzAwMCxcbiAgICBtZXNzYWdlLFxuICAgIHNldmVyaXR5LFxuICAgIGFuY2hvck9yaWdpbiA9IHsgaG9yaXpvbnRhbDogJ2xlZnQnLCB2ZXJ0aWNhbDogJ2JvdHRvbScgfSxcbiAgICAuLi5yZXN0UHJvcHNcbiAgfTogR290aGFtTm90aWZ5UGFyYW1zKSA9PiB7XG4gICAgbGV0IGFjdGlvbjtcblxuICAgIGlmKGFjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBhY3Rpb24gPSAoa2V5OiBzdHJpbmcpID0+IChcbiAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJmbGV4IHNwYWNlLXgtMlwiPlxuICAgICAgICAgIHthY3Rpb25zLm1hcCgoe2ljb24sIGxhYmVsLCBvbkNsaWNrfSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgIDxGcmFnbWVudCBrZXk9e2luZGV4fT5cbiAgICAgICAgICAgICAge2ljb24gPyAoXG4gICAgICAgICAgICAgICAgPEljb25CdXR0b24gb25DbGljaz17KCkgPT4gb25DbGljayhrZXkpfT5cbiAgICAgICAgICAgICAgICAgIDxTdmcgY29sb3I9XCJpbmhlcml0XCIgaGVpZ2h0PXsyNH0gbmFtZT17aWNvbn0gd2lkdGg9ezI0fSAvPlxuICAgICAgICAgICAgICAgIDwvSWNvbkJ1dHRvbj5cbiAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9eygpID0+IG9uQ2xpY2soa2V5KX0+e2xhYmVsfTwvQnV0dG9uPlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9GcmFnbWVudD5cbiAgICAgICAgICApKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICApO1xuICAgIH1cblxuICAgIHNldE5vdGlmaWNhdGlvbih7XG4gICAgICAuLi5yZXN0UHJvcHMsXG4gICAgICBhY3Rpb25zOiBbYWN0aW9uIGFzIEdvdGhhbU5vdGlmeUFjdGlvbl0sXG4gICAgICBhbmNob3JPcmlnaW4sXG4gICAgICBhdXRvSGlkZUR1cmF0aW9uLFxuICAgICAgbWVzc2FnZTogc2V2ZXJpdHkgPyAoXG4gICAgICAgIDxBbGVydFxuICAgICAgICAgIG9uQ2xvc2U9e25vdGlmeUNsb3NlfVxuICAgICAgICAgIHNldmVyaXR5PXtzZXZlcml0eX1cbiAgICAgICAgPlxuICAgICAgICAgIHttZXNzYWdlfVxuICAgICAgICA8L0FsZXJ0PlxuICAgICAgKSA6IG1lc3NhZ2UsXG4gICAgICBzZXZlcml0eVxuICAgIH0pO1xuICAgIHNldE9wZW4odHJ1ZSk7XG4gIH07XG5cbiAgdXNlRmx1eExpc3RlbmVyKEdvdGhhbUNvbnN0YW50cy5OT1RJRllfT1BFTiwgbm90aWZ5T3Blbik7XG4gIHVzZUZsdXhMaXN0ZW5lcihHb3RoYW1Db25zdGFudHMuTk9USUZZX0NMT1NFLCBub3RpZnlDbG9zZSk7XG5cbiAgY29uc3QgcG9zaXRpb25DbGFzc2VzID0gKCgpID0+IHtcbiAgICBjb25zdCB7aG9yaXpvbnRhbCA9ICdsZWZ0JywgdmVydGljYWwgPSAnYm90dG9tJ30gPSBub3RpZmljYXRpb24uYW5jaG9yT3JpZ2luIHx8IHt9O1xuXG4gICAgY29uc3QgcG9zaXRpb25zID0ge1xuICAgICAgYm90dG9tOiB7XG4gICAgICAgIGNlbnRlcjogJ2JvdHRvbS00IGxlZnQtMS8yIHRyYW5zZm9ybSAtdHJhbnNsYXRlLXgtMS8yJyxcbiAgICAgICAgbGVmdDogJ2JvdHRvbS00IGxlZnQtNCcsXG4gICAgICAgIHJpZ2h0OiAnYm90dG9tLTQgcmlnaHQtNCdcbiAgICAgIH0sXG4gICAgICB0b3A6IHtcbiAgICAgICAgY2VudGVyOiAndG9wLTQgbGVmdC0xLzIgdHJhbnNmb3JtIC10cmFuc2xhdGUteC0xLzInLFxuICAgICAgICBsZWZ0OiAndG9wLTQgbGVmdC00JyxcbiAgICAgICAgcmlnaHQ6ICd0b3AtNCByaWdodC00J1xuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcG9zaXRpb25zW3ZlcnRpY2FsXVtob3Jpem9udGFsXTtcbiAgfSkoKTtcblxuICByZXR1cm4gKFxuICAgIDxUcmFuc2l0aW9uXG4gICAgICBzaG93PXtpc09wZW59XG4gICAgICBhcz17RnJhZ21lbnR9XG4gICAgICBlbnRlcj1cInRyYW5zZm9ybSBlYXNlLW91dCBkdXJhdGlvbi0zMDAgdHJhbnNpdGlvblwiXG4gICAgICBlbnRlckZyb209XCJ0cmFuc2xhdGUteS0yIG9wYWNpdHktMCBzbTp0cmFuc2xhdGUteS0wIHNtOnRyYW5zbGF0ZS14LTJcIlxuICAgICAgZW50ZXJUbz1cInRyYW5zbGF0ZS15LTAgb3BhY2l0eS0xMDAgc206dHJhbnNsYXRlLXgtMFwiXG4gICAgICBsZWF2ZT1cInRyYW5zaXRpb24gZWFzZS1pbiBkdXJhdGlvbi0xMDBcIlxuICAgICAgbGVhdmVGcm9tPVwib3BhY2l0eS0xMDBcIlxuICAgICAgbGVhdmVUbz1cIm9wYWNpdHktMFwiXG4gICAgPlxuICAgICAgPGRpdiBjbGFzc05hbWU9e2NuKFxuICAgICAgICAnZml4ZWQgei01MCBtYXgtdy1zbSB3LWZ1bGwgc2hhZG93LWxnIHJvdW5kZWQtbGcgcG9pbnRlci1ldmVudHMtYXV0byBvdmVyZmxvdy1oaWRkZW4nLFxuICAgICAgICBwb3NpdGlvbkNsYXNzZXNcbiAgICAgICl9PlxuICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInJpbmctMSByaW5nLWJsYWNrIHJpbmctb3BhY2l0eS01IGJnLXdoaXRlXCI+XG4gICAgICAgICAgeyFub3RpZmljYXRpb24uc2V2ZXJpdHkgPyAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cInAtNFwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXggaXRlbXMtc3RhcnRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cImZsZXgtMVwiPlxuICAgICAgICAgICAgICAgICAge25vdGlmaWNhdGlvbi5tZXNzYWdlfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIHtub3RpZmljYXRpb24uYWN0aW9ucz8ubGVuZ3RoICYmIChcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibWwtNCBmbGV4LXNocmluay0wIGZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAge25vdGlmaWNhdGlvbi5hY3Rpb25zLm1hcCgoe2ljb24sIGxhYmVsLCBvbkNsaWNrfSwgaW5kZXgpID0+IChcbiAgICAgICAgICAgICAgICAgICAgICA8RnJhZ21lbnQga2V5PXtpbmRleH0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7aWNvbiA/IChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPEljb25CdXR0b24gb25DbGljaz17KCkgPT4gb25DbGljaygnbm90aWZpY2F0aW9uJyl9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxTdmcgY29sb3I9XCJpbmhlcml0XCIgaGVpZ2h0PXsyNH0gbmFtZT17aWNvbn0gd2lkdGg9ezI0fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0ljb25CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApIDogKFxuICAgICAgICAgICAgICAgICAgICAgICAgICA8QnV0dG9uIG9uQ2xpY2s9eygpID0+IG9uQ2xpY2soJ25vdGlmaWNhdGlvbicpfT57bGFiZWx9PC9CdXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgICAgICAgIDwvRnJhZ21lbnQ+XG4gICAgICAgICAgICAgICAgICAgICkpfVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICApIDogKFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAge25vdGlmaWNhdGlvbi5tZXNzYWdlIGFzIFJlYWN0RWxlbWVudH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICl9XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9UcmFuc2l0aW9uPlxuICApO1xufTtcbiJdLCJuYW1lcyI6WyJUcmFuc2l0aW9uIiwidXNlRmx1eExpc3RlbmVyIiwiY24iLCJGcmFnbWVudCIsInVzZUVmZmVjdCIsInVzZVN0YXRlIiwiR290aGFtQ29uc3RhbnRzIiwiU3ZnIiwiQnV0dG9uIiwiY2hpbGRyZW4iLCJvbkNsaWNrIiwiY2xhc3NOYW1lIiwiYnV0dG9uIiwidHlwZSIsIkljb25CdXR0b24iLCJBbGVydCIsInNldmVyaXR5Iiwib25DbG9zZSIsImJnQ29sb3JzIiwiZXJyb3IiLCJpbmZvIiwic3VjY2VzcyIsIndhcm5pbmciLCJkaXYiLCJzcGFuIiwic3ZnIiwieG1sbnMiLCJ2aWV3Qm94IiwiZmlsbCIsInBhdGgiLCJmaWxsUnVsZSIsImQiLCJjbGlwUnVsZSIsIk5vdGlmeSIsImlzT3BlbiIsInNldE9wZW4iLCJub3RpZmljYXRpb24iLCJzZXROb3RpZmljYXRpb24iLCJ0aW1lb3V0SWQiLCJzZXRUaW1lb3V0SWQiLCJub3RpZnlDbG9zZSIsImF1dG9IaWRlRHVyYXRpb24iLCJjbGVhclRpbWVvdXQiLCJpZCIsInNldFRpbWVvdXQiLCJ1bmRlZmluZWQiLCJub3RpZnlPcGVuIiwiYWN0aW9ucyIsIm1lc3NhZ2UiLCJhbmNob3JPcmlnaW4iLCJob3Jpem9udGFsIiwidmVydGljYWwiLCJyZXN0UHJvcHMiLCJhY3Rpb24iLCJsZW5ndGgiLCJrZXkiLCJtYXAiLCJpY29uIiwibGFiZWwiLCJpbmRleCIsImNvbG9yIiwiaGVpZ2h0IiwibmFtZSIsIndpZHRoIiwiTk9USUZZX09QRU4iLCJOT1RJRllfQ0xPU0UiLCJwb3NpdGlvbkNsYXNzZXMiLCJwb3NpdGlvbnMiLCJib3R0b20iLCJjZW50ZXIiLCJsZWZ0IiwicmlnaHQiLCJ0b3AiLCJzaG93IiwiYXMiLCJlbnRlciIsImVudGVyRnJvbSIsImVudGVyVG8iLCJsZWF2ZSIsImxlYXZlRnJvbSIsImxlYXZlVG8iXSwibWFwcGluZ3MiOiI7QUFBQSxTQUFRQSxVQUFVLFFBQU8sb0JBQW9CO0FBQzdDLFNBQVFDLGVBQWUsUUFBTyw4QkFBOEI7QUFDNUQsU0FBUUMsRUFBRSxRQUFPLGVBQWU7QUFDaEMsU0FBUUMsUUFBUSxFQUFFQyxTQUFTLEVBQUVDLFFBQVEsUUFBTyxRQUFRO0FBRXBELFNBQVFDLGVBQWUsUUFBTyxxQ0FBcUM7QUFDbkUsU0FBUUMsR0FBRyxRQUFPLGdCQUFnQjtBQXVCbEMsMEJBQTBCO0FBQzFCLE1BQU1DLFNBQVMsQ0FBQyxFQUFDQyxRQUFRLEVBQUVDLE9BQU8sRUFBRUMsWUFBWSxFQUFFLEVBQUMsaUJBQ2pELEtBQUNDO1FBQ0NDLE1BQUs7UUFDTEgsU0FBU0E7UUFDVEMsV0FBV1QsR0FDVCx5R0FDQSwwSEFDQVM7a0JBR0RGOztBQUlMLDhCQUE4QjtBQUM5QixNQUFNSyxhQUFhLENBQUMsRUFBQ0wsUUFBUSxFQUFFQyxPQUFPLEVBQUVDLFlBQVksRUFBRSxFQUFDLGlCQUNyRCxLQUFDQztRQUNDQyxNQUFLO1FBQ0xILFNBQVNBO1FBQ1RDLFdBQVdULEdBQ1QsZ0hBQ0FTO2tCQUdERjs7QUFJTCx5QkFBeUI7QUFDekIsTUFBTU0sUUFBUSxDQUFDLEVBQUNOLFFBQVEsRUFBRU8sUUFBUSxFQUFFQyxPQUFPLEVBQUM7SUFDMUMsTUFBTUMsV0FBVztRQUNmQyxPQUFPO1FBQ1BDLE1BQU07UUFDTkMsU0FBUztRQUNUQyxTQUFTO0lBQ1g7SUFFQSxxQkFDRSxNQUFDQztRQUFJWixXQUFXVCxHQUNkLDJEQUNBZ0IsUUFBUSxDQUFDRixTQUFTLElBQUksZUFDdEI7OzBCQUVBLEtBQUNPOzBCQUFLZDs7WUFDTFEseUJBQ0MsTUFB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