UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

207 lines (206 loc) • 30.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "Routes", { enumerable: true, get: function() { return Routes; } }); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _reactrouterdom = require("react-router-dom"); const _api = require("../../../api"); const _Loading = require("../../elements/Loading"); const _StayLoggedIn = /*#__PURE__*/ _interop_require_default(require("../../modals/StayLoggedIn")); const _Default = /*#__PURE__*/ _interop_require_default(require("../../templates/Default")); const _ActionsProvider = require("../../utilities/ActionsProvider"); const _Auth = require("../../utilities/Auth"); const _Config = require("../../utilities/Config"); const _DocumentInfo = require("../../utilities/DocumentInfo"); const _Locale = require("../../utilities/Locale"); const _NotFound = /*#__PURE__*/ _interop_require_default(require("../NotFound")); const _Unauthorized = /*#__PURE__*/ _interop_require_default(require("../Unauthorized")); const _collections = require("./collections"); const _custom = require("./custom"); const _globals = require("./globals"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interop_require_wildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = { __proto__: null }; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for(var key in obj){ if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const Dashboard = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../Dashboard")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const ForgotPassword = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../ForgotPassword")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const Login = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../Login")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const Logout = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../Logout")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const Verify = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../Verify")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const CreateFirstUser = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../CreateFirstUser")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const ResetPassword = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../ResetPassword")))); // @ts-expect-error Just TypeScript being broken // TODO: Open TypeScript issue const Account = /*#__PURE__*/ (0, _react.lazy)(()=>Promise.resolve().then(()=>/*#__PURE__*/ _interop_require_wildcard(require("../Account")))); const Routes = ()=>{ const [initialized, setInitialized] = (0, _react.useState)(null); const { permissions, refreshCookie, user } = (0, _Auth.useAuth)(); const { i18n } = (0, _reacti18next.useTranslation)(); const { code: locale } = (0, _Locale.useLocale)(); const canAccessAdmin = permissions?.canAccessAdmin; const config = (0, _Config.useConfig)(); const { admin: { inactivityRoute: logoutInactivityRoute, logoutRoute, user: userSlug }, collections, globals, routes } = config; const isLoadingUser = Boolean(typeof user === 'undefined' || user && typeof canAccessAdmin === 'undefined'); const userCollection = collections.find(({ slug })=>slug === userSlug); (0, _react.useEffect)(()=>{ if (userCollection && !userCollection?.auth?.disableLocalStrategy) { const { slug } = userCollection; _api.requests.get(`${routes.api}/${slug}/init`, { headers: { 'Accept-Language': i18n.language } }).then((res)=>res.json().then((data)=>{ if (data && 'initialized' in data) { setInitialized(data.initialized); } })); } else { setInitialized(true); } }, [ i18n.language, routes, userCollection ]); return /*#__PURE__*/ _react.default.createElement(_react.Suspense, { fallback: /*#__PURE__*/ _react.default.createElement(_Loading.LoadingOverlayToggle, { name: "route-suspense", show: true }) }, /*#__PURE__*/ _react.default.createElement(_Loading.LoadingOverlayToggle, { name: "route-loader", show: isLoadingUser }), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: routes.admin, render: ({ match })=>{ if (initialized === false) { return /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Switch, null, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/create-first-user` }, /*#__PURE__*/ _react.default.createElement(CreateFirstUser, { setInitialized: setInitialized })), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, null, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Redirect, { to: `${match.url}/create-first-user` }))); } if (initialized === true && !isLoadingUser) { return /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Switch, null, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/create-first-user` }, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Redirect, { to: `${match.url}/` })), (0, _custom.customRoutes)({ canAccessAdmin, config, match, user }), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/login` }, /*#__PURE__*/ _react.default.createElement(Login, null)), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}${logoutRoute}` }, /*#__PURE__*/ _react.default.createElement(Logout, null)), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}${logoutInactivityRoute}` }, /*#__PURE__*/ _react.default.createElement(Logout, { inactivity: true })), !userCollection?.auth?.disableLocalStrategy && /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/forgot` }, /*#__PURE__*/ _react.default.createElement(ForgotPassword, null)), !userCollection?.auth?.disableLocalStrategy && /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/reset/:token` }, /*#__PURE__*/ _react.default.createElement(ResetPassword, null)), collections.map((collection)=>{ if (collection?.auth?.verify && !collection.auth.disableLocalStrategy) { return /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { exact: true, key: `${collection.slug}-verify`, path: `${match.url}/${collection.slug}/verify/:token` }, /*#__PURE__*/ _react.default.createElement(Verify, { collection: collection })); } return null; }), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, null, user ? /*#__PURE__*/ _react.default.createElement(_react.Fragment, null, canAccessAdmin && /*#__PURE__*/ _react.default.createElement(_ActionsProvider.ActionsProvider, null, /*#__PURE__*/ _react.default.createElement(_Default.default, null, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Switch, null, /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { exact: true, path: `${match.url}/` }, /*#__PURE__*/ _react.default.createElement(Dashboard, null)), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}/account` }, /*#__PURE__*/ _react.default.createElement(_DocumentInfo.DocumentInfoProvider, { collection: collections.find(({ slug })=>slug === userSlug), id: user.id }, /*#__PURE__*/ _react.default.createElement(Account, null))), (0, _collections.collectionRoutes)({ collections, match, permissions, user }), (0, _globals.globalRoutes)({ globals, locale, match, permissions, user }), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}*` }, /*#__PURE__*/ _react.default.createElement(_NotFound.default, null))))), canAccessAdmin === false && /*#__PURE__*/ _react.default.createElement(_Unauthorized.default, null)) : /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Redirect, { to: `${match.url}/login${window.location.pathname.startsWith(routes.admin) ? `?redirect=${encodeURIComponent(window.location.pathname.replace(routes.admin, ''))}` : ''}` })), /*#__PURE__*/ _react.default.createElement(_reactrouterdom.Route, { path: `${match.url}*` }, /*#__PURE__*/ _react.default.createElement(_NotFound.default, null))); } return null; } }), /*#__PURE__*/ _react.default.createElement(_StayLoggedIn.default, { refreshCookie: refreshCookie })); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3ZpZXdzL1JvdXRlcy9pbmRleC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFJlYWN0LCB7IEZyYWdtZW50LCBTdXNwZW5zZSwgbGF6eSwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgUmVkaXJlY3QsIFJvdXRlLCBTd2l0Y2ggfSBmcm9tICdyZWFjdC1yb3V0ZXItZG9tJ1xuXG5pbXBvcnQgeyByZXF1ZXN0cyB9IGZyb20gJy4uLy4uLy4uL2FwaSdcbmltcG9ydCB7IExvYWRpbmdPdmVybGF5VG9nZ2xlIH0gZnJvbSAnLi4vLi4vZWxlbWVudHMvTG9hZGluZydcbmltcG9ydCBTdGF5TG9nZ2VkSW4gZnJvbSAnLi4vLi4vbW9kYWxzL1N0YXlMb2dnZWRJbidcbmltcG9ydCBEZWZhdWx0VGVtcGxhdGUgZnJvbSAnLi4vLi4vdGVtcGxhdGVzL0RlZmF1bHQnXG5pbXBvcnQgeyBBY3Rpb25zUHJvdmlkZXIgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvQWN0aW9uc1Byb3ZpZGVyJ1xuaW1wb3J0IHsgdXNlQXV0aCB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0NvbmZpZydcbmltcG9ydCB7IERvY3VtZW50SW5mb1Byb3ZpZGVyIH0gZnJvbSAnLi4vLi4vdXRpbGl0aWVzL0RvY3VtZW50SW5mbydcbmltcG9ydCB7IHVzZUxvY2FsZSB9IGZyb20gJy4uLy4uL3V0aWxpdGllcy9Mb2NhbGUnXG5pbXBvcnQgTm90Rm91bmQgZnJvbSAnLi4vTm90Rm91bmQnXG5pbXBvcnQgVW5hdXRob3JpemVkIGZyb20gJy4uL1VuYXV0aG9yaXplZCdcbmltcG9ydCB7IGNvbGxlY3Rpb25Sb3V0ZXMgfSBmcm9tICcuL2NvbGxlY3Rpb25zJ1xuaW1wb3J0IHsgY3VzdG9tUm91dGVzIH0gZnJvbSAnLi9jdXN0b20nXG5pbXBvcnQgeyBnbG9iYWxSb3V0ZXMgfSBmcm9tICcuL2dsb2JhbHMnXG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgSnVzdCBUeXBlU2NyaXB0IGJlaW5nIGJyb2tlbiAvLyBUT0RPOiBPcGVuIFR5cGVTY3JpcHQgaXNzdWVcbmNvbnN0IERhc2hib2FyZCA9IGxhenkoKCkgPT4gaW1wb3J0KCcuLi9EYXNoYm9hcmQnKSlcbi8vIEB0cy1leHBlY3QtZXJyb3IgSnVzdCBUeXBlU2NyaXB0IGJlaW5nIGJyb2tlbiAvLyBUT0RPOiBPcGVuIFR5cGVTY3JpcHQgaXNzdWVcbmNvbnN0IEZvcmdvdFBhc3N3b3JkID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4uL0ZvcmdvdFBhc3N3b3JkJykpXG4vLyBAdHMtZXhwZWN0LWVycm9yIEp1c3QgVHlwZVNjcmlwdCBiZWluZyBicm9rZW4gLy8gVE9ETzogT3BlbiBUeXBlU2NyaXB0IGlzc3VlXG5jb25zdCBMb2dpbiA9IGxhenkoKCkgPT4gaW1wb3J0KCcuLi9Mb2dpbicpKVxuLy8gQHRzLWV4cGVjdC1lcnJvciBKdXN0IFR5cGVTY3JpcHQgYmVpbmcgYnJva2VuIC8vIFRPRE86IE9wZW4gVHlwZVNjcmlwdCBpc3N1ZVxuY29uc3QgTG9nb3V0ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4uL0xvZ291dCcpKVxuLy8gQHRzLWV4cGVjdC1lcnJvciBKdXN0IFR5cGVTY3JpcHQgYmVpbmcgYnJva2VuIC8vIFRPRE86IE9wZW4gVHlwZVNjcmlwdCBpc3N1ZVxuY29uc3QgVmVyaWZ5ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4uL1ZlcmlmeScpKVxuLy8gQHRzLWV4cGVjdC1lcnJvciBKdXN0IFR5cGVTY3JpcHQgYmVpbmcgYnJva2VuIC8vIFRPRE86IE9wZW4gVHlwZVNjcmlwdCBpc3N1ZVxuY29uc3QgQ3JlYXRlRmlyc3RVc2VyID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4uL0NyZWF0ZUZpcnN0VXNlcicpKVxuLy8gQHRzLWV4cGVjdC1lcnJvciBKdXN0IFR5cGVTY3JpcHQgYmVpbmcgYnJva2VuIC8vIFRPRE86IE9wZW4gVHlwZVNjcmlwdCBpc3N1ZVxuY29uc3QgUmVzZXRQYXNzd29yZCA9IGxhenkoKCkgPT4gaW1wb3J0KCcuLi9SZXNldFBhc3N3b3JkJykpXG4vLyBAdHMtZXhwZWN0LWVycm9yIEp1c3QgVHlwZVNjcmlwdCBiZWluZyBicm9rZW4gLy8gVE9ETzogT3BlbiBUeXBlU2NyaXB0IGlzc3VlXG5jb25zdCBBY2NvdW50ID0gbGF6eSgoKSA9PiBpbXBvcnQoJy4uL0FjY291bnQnKSlcblxuZXhwb3J0IGNvbnN0IFJvdXRlczogUmVhY3QuRkMgPSAoKSA9PiB7XG4gIGNvbnN0IFtpbml0aWFsaXplZCwgc2V0SW5pdGlhbGl6ZWRdID0gdXNlU3RhdGU8Ym9vbGVhbiB8IG51bGw+KG51bGwpXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMsIHJlZnJlc2hDb29raWUsIHVzZXIgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IGkxOG4gfSA9IHVzZVRyYW5zbGF0aW9uKClcbiAgY29uc3QgeyBjb2RlOiBsb2NhbGUgfSA9IHVzZUxvY2FsZSgpXG5cbiAgY29uc3QgY2FuQWNjZXNzQWRtaW4gPSBwZXJtaXNzaW9ucz8uY2FuQWNjZXNzQWRtaW5cblxuICBjb25zdCBjb25maWcgPSB1c2VDb25maWcoKVxuXG4gIGNvbnN0IHtcbiAgICBhZG1pbjogeyBpbmFjdGl2aXR5Um91dGU6IGxvZ291dEluYWN0aXZpdHlSb3V0ZSwgbG9nb3V0Um91dGUsIHVzZXI6IHVzZXJTbHVnIH0sXG4gICAgY29sbGVjdGlvbnMsXG4gICAgZ2xvYmFscyxcbiAgICByb3V0ZXMsXG4gIH0gPSBjb25maWdcblxuICBjb25zdCBpc0xvYWRpbmdVc2VyID0gQm9vbGVhbihcbiAgICB0eXBlb2YgdXNlciA9PT0gJ3VuZGVmaW5lZCcgfHwgKHVzZXIgJiYgdHlwZW9mIGNhbkFjY2Vzc0FkbWluID09PSAndW5kZWZpbmVkJyksXG4gIClcblxuICBjb25zdCB1c2VyQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb25zLmZpbmQoKHsgc2x1ZyB9KSA9PiBzbHVnID09PSB1c2VyU2x1ZylcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGlmICh1c2VyQ29sbGVjdGlvbiAmJiAhdXNlckNvbGxlY3Rpb24/LmF1dGg/LmRpc2FibGVMb2NhbFN0cmF0ZWd5KSB7XG4gICAgICBjb25zdCB7IHNsdWcgfSA9IHVzZXJDb2xsZWN0aW9uXG5cbiAgICAgIHJlcXVlc3RzXG4gICAgICAgIC5nZXQoYCR7cm91dGVzLmFwaX0vJHtzbHVnfS9pbml0YCwge1xuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKChyZXMpID0+XG4gICAgICAgICAgcmVzLmpzb24oKS50aGVuKChkYXRhKSA9PiB7XG4gICAgICAgICAgICBpZiAoZGF0YSAmJiAnaW5pdGlhbGl6ZWQnIGluIGRhdGEpIHtcbiAgICAgICAgICAgICAgc2V0SW5pdGlhbGl6ZWQoZGF0YS5pbml0aWFsaXplZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgIH0gZWxzZSB7XG4gICAgICBzZXRJbml0aWFsaXplZCh0cnVlKVxuICAgIH1cbiAgfSwgW2kxOG4ubGFuZ3VhZ2UsIHJvdXRlcywgdXNlckNvbGxlY3Rpb25dKVxuXG4gIHJldHVybiAoXG4gICAgPFN1c3BlbnNlIGZhbGxiYWNrPXs8TG9hZGluZ092ZXJsYXlUb2dnbGUgbmFtZT1cInJvdXRlLXN1c3BlbnNlXCIgc2hvdyAvPn0+XG4gICAgICA8TG9hZGluZ092ZXJsYXlUb2dnbGUgbmFtZT1cInJvdXRlLWxvYWRlclwiIHNob3c9e2lzTG9hZGluZ1VzZXJ9IC8+XG4gICAgICA8Um91dGVcbiAgICAgICAgcGF0aD17cm91dGVzLmFkbWlufVxuICAgICAgICByZW5kZXI9eyh7IG1hdGNoIH0pID0+IHtcbiAgICAgICAgICBpZiAoaW5pdGlhbGl6ZWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8U3dpdGNoPlxuICAgICAgICAgICAgICAgIDxSb3V0ZSBwYXRoPXtgJHttYXRjaC51cmx9L2NyZWF0ZS1maXJzdC11c2VyYH0+XG4gICAgICAgICAgICAgICAgICA8Q3JlYXRlRmlyc3RVc2VyIHNldEluaXRpYWxpemVkPXtzZXRJbml0aWFsaXplZH0gLz5cbiAgICAgICAgICAgICAgICA8L1JvdXRlPlxuICAgICAgICAgICAgICAgIDxSb3V0ZT5cbiAgICAgICAgICAgICAgICAgIDxSZWRpcmVjdCB0bz17YCR7bWF0Y2gudXJsfS9jcmVhdGUtZmlyc3QtdXNlcmB9IC8+XG4gICAgICAgICAgICAgICAgPC9Sb3V0ZT5cbiAgICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGluaXRpYWxpemVkID09PSB0cnVlICYmICFpc0xvYWRpbmdVc2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICA8U3dpdGNoPlxuICAgICAgICAgICAgICAgIDxSb3V0ZSBwYXRoPXtgJHttYXRjaC51cmx9L2NyZWF0ZS1maXJzdC11c2VyYH0+XG4gICAgICAgICAgICAgICAgICA8UmVkaXJlY3QgdG89e2Ake21hdGNoLnVybH0vYH0gLz5cbiAgICAgICAgICAgICAgICA8L1JvdXRlPlxuICAgICAgICAgICAgICAgIHtjdXN0b21Sb3V0ZXMoe1xuICAgICAgICAgICAgICAgICAgY2FuQWNjZXNzQWRtaW4sXG4gICAgICAgICAgICAgICAgICBjb25maWcsXG4gICAgICAgICAgICAgICAgICBtYXRjaCxcbiAgICAgICAgICAgICAgICAgIHVzZXIsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake21hdGNoLnVybH0vbG9naW5gfT5cbiAgICAgICAgICAgICAgICAgIDxMb2dpbiAvPlxuICAgICAgICAgICAgICAgIDwvUm91dGU+XG4gICAgICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake21hdGNoLnVybH0ke2xvZ291dFJvdXRlfWB9PlxuICAgICAgICAgICAgICAgICAgPExvZ291dCAvPlxuICAgICAgICAgICAgICAgIDwvUm91dGU+XG4gICAgICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake21hdGNoLnVybH0ke2xvZ291dEluYWN0aXZpdHlSb3V0ZX1gfT5cbiAgICAgICAgICAgICAgICAgIDxMb2dvdXQgaW5hY3Rpdml0eSAvPlxuICAgICAgICAgICAgICAgIDwvUm91dGU+XG4gICAgICAgICAgICAgICAgeyF1c2VyQ29sbGVjdGlvbj8uYXV0aD8uZGlzYWJsZUxvY2FsU3RyYXRlZ3kgJiYgKFxuICAgICAgICAgICAgICAgICAgPFJvdXRlIHBhdGg9e2Ake21hdGNoLnVybH0vZm9yZ290YH0+XG4gICAgICAgICAgICAgICAgICAgIDxGb3Jnb3RQYXNzd29yZCAvPlxuICAgICAgICAgICAgICAgICAgPC9Sb3V0ZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHshdXNlckNvbGxlY3Rpb24/LmF1dGg/LmRpc2FibGVMb2NhbFN0cmF0ZWd5ICYmIChcbiAgICAgICAgICAgICAgICAgIDxSb3V0ZSBwYXRoPXtgJHttYXRjaC51cmx9L3Jlc2V0Lzp0b2tlbmB9PlxuICAgICAgICAgICAgICAgICAgICA8UmVzZXRQYXNzd29yZCAvPlxuICAgICAgICAgICAgICAgICAgPC9Sb3V0ZT5cbiAgICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgICAgIHtjb2xsZWN0aW9ucy5tYXAoKGNvbGxlY3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uPy5hdXRoPy52ZXJpZnkgJiYgIWNvbGxlY3Rpb24uYXV0aC5kaXNhYmxlTG9jYWxTdHJhdGVneSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgIDxSb3V0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgZXhhY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleT17YCR7Y29sbGVjdGlvbi5zbHVnfS12ZXJpZnlgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD17YCR7bWF0Y2gudXJsfS8ke2NvbGxlY3Rpb24uc2x1Z30vdmVyaWZ5Lzp0b2tlbmB9XG4gICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPFZlcmlmeSBjb2xsZWN0aW9uPXtjb2xsZWN0aW9ufSAvPlxuICAgICAgICAgICAgICAgICAgICAgIDwvUm91dGU+XG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsXG4gICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgPFJvdXRlPlxuICAgICAgICAgICAgICAgICAge3VzZXIgPyAoXG4gICAgICAgICAgICAgICAgICAgIDxGcmFnbWVudD5cbiAgICAgICAgICAgICAgICAgICAgICB7Y2FuQWNjZXNzQWRtaW4gJiYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgPEFjdGlvbnNQcm92aWRlcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPERlZmF1bHRUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8U3dpdGNoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPFJvdXRlIGV4YWN0IHBhdGg9e2Ake21hdGNoLnVybH0vYH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEYXNoYm9hcmQgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvUm91dGU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Um91dGUgcGF0aD17YCR7bWF0Y2gudXJsfS9hY2NvdW50YH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxEb2N1bWVudEluZm9Qcm92aWRlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rpb249e2NvbGxlY3Rpb25zLmZpbmQoKHsgc2x1ZyB9KSA9PiBzbHVnID09PSB1c2VyU2x1Zyl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9e3VzZXIuaWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8QWNjb3VudCAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0RvY3VtZW50SW5mb1Byb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9Sb3V0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtjb2xsZWN0aW9uUm91dGVzKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2dsb2JhbFJvdXRlcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Um91dGUgcGF0aD17YCR7bWF0Y2gudXJsfSpgfT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPE5vdEZvdW5kIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1JvdXRlPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvU3dpdGNoPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8L0RlZmF1bHRUZW1wbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvQWN0aW9uc1Byb3ZpZGVyPlxuICAgICAgICAgICAgICAgICAgICAgICl9XG4gICAgICAgICAgICAgICAgICAgICAge2NhbkFjY2Vzc0FkbWluID09PSBmYWxzZSAmJiA8VW5hdXRob3JpemVkIC8+fVxuICAgICAgICAgICAgICAgICAgICA8L0ZyYWdtZW50PlxuICAgICAgICAgICAgICAgICAgKSA6IChcbiAgICAgICAgICAgICAgICAgICAgPFJlZGlyZWN0XG4gICAgICAgICAgICAgICAgICAgICAgdG89e2Ake21hdGNoLnVybH0vbG9naW4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnN0YXJ0c1dpdGgocm91dGVzLmFkbWluKVxuICAgICAgICAgICAgICAgICAgICAgICAgICA/IGA/cmVkaXJlY3Q9JHtlbmNvZGVVUklDb21wb25lbnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUucmVwbGFjZShyb3V0ZXMuYWRtaW4sICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgIH1gfVxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICA8L1JvdXRlPlxuICAgICAgICAgICAgICAgIDxSb3V0ZSBwYXRoPXtgJHttYXRjaC51cmx9KmB9PlxuICAgICAgICAgICAgICAgICAgPE5vdEZvdW5kIC8+XG4gICAgICAgICAgICAgICAgPC9Sb3V0ZT5cbiAgICAgICAgICAgICAgPC9Td2l0Y2g+XG4gICAgICAgICAgICApXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfX1cbiAgICAgIC8+XG4gICAgICA8U3RheUxvZ2dlZEluIHJlZnJlc2hDb29raWU9e3JlZnJlc2hDb29raWV9IC8+XG4gICAgPC9TdXNwZW5zZT5cbiAgKVxufVxuIl0sIm5hbWVzIjpbIlJvdXRlcyIsIkRhc2hib2FyZCIsImxhenkiLCJGb3Jnb3RQYXNzd29yZCIsIkxvZ2luIiwiTG9nb3V0IiwiVmVyaWZ5IiwiQ3JlYXRlRmlyc3RVc2VyIiwiUmVzZXRQYXNzd29yZCIsIkFjY291bnQiLCJpbml0aWFsaXplZCIsInNldEluaXRpYWxpemVkIiwidXNlU3RhdGUiLCJwZXJtaXNzaW9ucyIsInJlZnJlc2hDb29raWUiLCJ1c2VyIiwidXNlQXV0aCIsImkxOG4iLCJ1c2VUcmFuc2xhdGlvbiIsImNvZGUiLCJsb2NhbGUiLCJ1c2VMb2NhbGUiLCJjYW5BY2Nlc3NBZG1pbiIsImNvbmZpZyIsInVzZUNvbmZpZyIsImFkbWluIiwiaW5hY3Rpdml0eVJvdXRlIiwibG9nb3V0SW5hY3Rpdml0eVJvdXRlIiwibG9nb3V0Um91dGUiLCJ1c2VyU2x1ZyIsImNvbGxlY3Rpb25zIiwiZ2xvYmFscyIsInJvdXRlcyIsImlzTG9hZGluZ1VzZXIiLCJCb29sZWFuIiwidXNlckNvbGxlY3Rpb24iLCJmaW5kIiwic2x1ZyIsInVzZUVmZmVjdCIsImF1dGgiLCJkaXNhYmxlTG9jYWxTdHJhdGVneSIsInJlcXVlc3RzIiwiZ2V0IiwiYXBpIiwiaGVhZGVycyIsImxhbmd1YWdlIiwidGhlbiIsInJlcyIsImpzb24iLCJkYXRhIiwiU3VzcGVuc2UiLCJmYWxsYmFjayIsIkxvYWRpbmdPdmVybGF5VG9nZ2xlIiwibmFtZSIsInNob3ciLCJSb3V0ZSIsInBhdGgiLCJyZW5kZXIiLCJtYXRjaCIsIlN3aXRjaCIsInVybCIsIlJlZGlyZWN0IiwidG8iLCJjdXN0b21Sb3V0ZXMiLCJpbmFjdGl2aXR5IiwibWFwIiwiY29sbGVjdGlvbiIsInZlcmlmeSIsImV4YWN0Iiwia2V5IiwiRnJhZ21lbnQiLCJBY3Rpb25zUHJvdmlkZXIiLCJEZWZhdWx0VGVtcGxhdGUiLCJEb2N1bWVudEluZm9Qcm92aWRlciIsImlkIiwiY29sbGVjdGlvblJvdXRlcyIsImdsb2JhbFJvdXRlcyIsIk5vdEZvdW5kIiwiVW5hdXRob3JpemVkIiwid2luZG93IiwibG9jYXRpb24iLCJwYXRobmFtZSIsInN0YXJ0c1dpdGgiLCJlbmNvZGVVUklDb21wb25lbnQiLCJyZXBsYWNlIiwiU3RheUxvZ2dlZEluIl0sIm1hcHBpbmdzIjoiOzs7OytCQW9DYUE7OztlQUFBQTs7OytEQXBDd0Q7OEJBQ3RDO2dDQUNTO3FCQUVmO3lCQUNZO3FFQUNaO2dFQUNHO2lDQUNJO3NCQUNSO3dCQUNFOzhCQUNXO3dCQUNYO2lFQUNMO3FFQUNJOzZCQUNRO3dCQUNKO3lCQUNBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUU3QiwrRUFBK0U7QUFDL0UsTUFBTUMsMEJBQVlDLElBQUFBLFdBQUksRUFBQyxJQUFNLG1FQUFBLFFBQU87QUFDcEMsK0VBQStFO0FBQy9FLE1BQU1DLCtCQUFpQkQsSUFBQUEsV0FBSSxFQUFDLElBQU0sbUVBQUEsUUFBTztBQUN6QywrRUFBK0U7QUFDL0UsTUFBTUUsc0JBQVFGLElBQUFBLFdBQUksRUFBQyxJQUFNLG1FQUFBLFFBQU87QUFDaEMsK0VBQStFO0FBQy9FLE1BQU1HLHVCQUFTSCxJQUFBQSxXQUFJLEVBQUMsSUFBTSxtRUFBQSxRQUFPO0FBQ2pDLCtFQUErRTtBQUMvRSxNQUFNSSx1QkFBU0osSUFBQUEsV0FBSSxFQUFDLElBQU0sbUVBQUEsUUFBTztBQUNqQywrRUFBK0U7QUFDL0UsTUFBTUssZ0NBQWtCTCxJQUFBQSxXQUFJLEVBQUMsSUFBTSxtRUFBQSxRQUFPO0FBQzFDLCtFQUErRTtBQUMvRSxNQUFNTSw4QkFBZ0JOLElBQUFBLFdBQUksRUFBQyxJQUFNLG1FQUFBLFFBQU87QUFDeEMsK0VBQStFO0FBQy9FLE1BQU1PLHdCQUFVUCxJQUFBQSxXQUFJLEVBQUMsSUFBTSxtRUFBQSxRQUFPO0FBRTNCLE1BQU1GLFNBQW1CO0lBQzlCLE1BQU0sQ0FBQ1UsYUFBYUMsZUFBZSxHQUFHQyxJQUFBQSxlQUFRLEVBQWlCO0lBQy9ELE1BQU0sRUFBRUMsV0FBVyxFQUFFQyxhQUFhLEVBQUVDLElBQUksRUFBRSxHQUFHQyxJQUFBQSxhQUFPO0lBQ3BELE1BQU0sRUFBRUMsSUFBSSxFQUFFLEdBQUdDLElBQUFBLDRCQUFjO0lBQy9CLE1BQU0sRUFBRUMsTUFBTUMsTUFBTSxFQUFFLEdBQUdDLElBQUFBLGlCQUFTO0lBRWxDLE1BQU1DLGlCQUFpQlQsYUFBYVM7SUFFcEMsTUFBTUMsU0FBU0MsSUFBQUEsaUJBQVM7SUFFeEIsTUFBTSxFQUNKQyxPQUFPLEVBQUVDLGlCQUFpQkMscUJBQXFCLEVBQUVDLFdBQVcsRUFBRWIsTUFBTWMsUUFBUSxFQUFFLEVBQzlFQyxXQUFXLEVBQ1hDLE9BQU8sRUFDUEMsTUFBTSxFQUNQLEdBQUdUO0lBRUosTUFBTVUsZ0JBQWdCQyxRQUNwQixPQUFPbkIsU0FBUyxlQUFnQkEsUUFBUSxPQUFPTyxtQkFBbUI7SUFHcEUsTUFBTWEsaUJBQWlCTCxZQUFZTSxJQUFJLENBQUMsQ0FBQyxFQUFFQyxJQUFJLEVBQUUsR0FBS0EsU0FBU1I7SUFFL0RTLElBQUFBLGdCQUFTLEVBQUM7UUFDUixJQUFJSCxrQkFBa0IsQ0FBQ0EsZ0JBQWdCSSxNQUFNQyxzQkFBc0I7WUFDakUsTUFBTSxFQUFFSCxJQUFJLEVBQUUsR0FBR0Y7WUFFakJNLGFBQVEsQ0FDTEMsR0FBRyxDQUFDLENBQUMsRUFBRVYsT0FBT1csR0FBRyxDQUFDLENBQUMsRUFBRU4sS0FBSyxLQUFLLENBQUMsRUFBRTtnQkFDakNPLFNBQVM7b0JBQ1AsbUJBQW1CM0IsS0FBSzRCLFFBQVE7Z0JBQ2xDO1lBQ0YsR0FDQ0MsSUFBSSxDQUFDLENBQUNDLE1BQ0xBLElBQUlDLElBQUksR0FBR0YsSUFBSSxDQUFDLENBQUNHO29CQUNmLElBQUlBLFFBQVEsaUJBQWlCQSxNQUFNO3dCQUNqQ3RDLGVBQWVzQyxLQUFLdkMsV0FBVztvQkFDakM7Z0JBQ0Y7UUFFTixPQUFPO1lBQ0xDLGVBQWU7UUFDakI7SUFDRixHQUFHO1FBQUNNLEtBQUs0QixRQUFRO1FBQUViO1FBQVFHO0tBQWU7SUFFMUMscUJBQ0UsNkJBQUNlLGVBQVE7UUFBQ0Msd0JBQVUsNkJBQUNDLDZCQUFvQjtZQUFDQyxNQUFLO1lBQWlCQyxNQUFBQTs7cUJBQzlELDZCQUFDRiw2QkFBb0I7UUFBQ0MsTUFBSztRQUFlQyxNQUFNckI7c0JBQ2hELDZCQUFDc0IscUJBQUs7UUFDSkMsTUFBTXhCLE9BQU9QLEtBQUs7UUFDbEJnQyxRQUFRLENBQUMsRUFBRUMsS0FBSyxFQUFFO1lBQ2hCLElBQUloRCxnQkFBZ0IsT0FBTztnQkFDekIscUJBQ0UsNkJBQUNpRCxzQkFBTSxzQkFDTCw2QkFBQ0oscUJBQUs7b0JBQUNDLE1BQU0sQ0FBQyxFQUFFRSxNQUFNRSxHQUFHLENBQUMsa0JBQWtCLENBQUM7aUNBQzNDLDZCQUFDckQ7b0JBQWdCSSxnQkFBZ0JBO21DQUVuQyw2QkFBQzRDLHFCQUFLLHNCQUNKLDZCQUFDTSx3QkFBUTtvQkFBQ0MsSUFBSSxDQUFDLEVBQUVKLE1BQU1FLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQzs7WUFJdEQ7WUFFQSxJQUFJbEQsZ0JBQWdCLFFBQVEsQ0FBQ3VCLGVBQWU7Z0JBQzFDLHFCQUNFLDZCQUFDMEIsc0JBQU0sc0JBQ0wsNkJBQUNKLHFCQUFLO29CQUFDQyxNQUFNLENBQUMsRUFBRUUsTUFBTUUsR0FBRyxDQUFDLGtCQUFrQixDQUFDO2lDQUMzQyw2QkFBQ0Msd0JBQVE7b0JBQUNDLElBQUksQ0FBQyxFQUFFSixNQUFNRSxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUU5QkcsSUFBQUEsb0JBQVksRUFBQztvQkFDWnpDO29CQUNBQztvQkFDQW1DO29CQUNBM0M7Z0JBQ0Ysa0JBQ0EsNkJBQUN3QyxxQkFBSztvQkFBQ0MsTUFBTSxDQUFDLEVBQUVFLE1BQU1FLEdBQUcsQ0FBQyxNQUFNLENBQUM7aUNBQy9CLDZCQUFDeEQsNkJBRUgsNkJBQUNtRCxxQkFBSztvQkFBQ0MsTUFBTSxDQUFDLEVBQUVFLE1BQU1FLEdBQUcsQ0FBQyxFQUFFaEMsWUFBWSxDQUFDO2lDQUN2Qyw2QkFBQ3ZCLDhCQUVILDZCQUFDa0QscUJBQUs7b0JBQUNDLE1BQU0sQ0FBQyxFQUFFRSxNQUFNRSxHQUFHLENBQUMsRUFBRWpDLHNCQUFzQixDQUFDO2lDQUNqRCw2QkFBQ3RCO29CQUFPMkQsWUFBQUE7cUJBRVQsQ0FBQzdCLGdCQUFnQkksTUFBTUMsc0NBQ3RCLDZCQUFDZSxxQkFBSztvQkFBQ0MsTUFBTSxDQUFDLEVBQUVFLE1BQU1FLEdBQUcsQ0FBQyxPQUFPLENBQUM7aUNBQ2hDLDZCQUFDekQsd0JBR0osQ0FBQ2dDLGdCQUFnQkksTUFBTUMsc0NBQ3RCLDZCQUFDZSxxQkFBSztvQkFBQ0MsTUFBTSxDQUFDLEVBQUVFLE1BQU1FLEdBQUcsQ0FBQyxhQUFhLENBQUM7aUNBQ3RDLDZCQUFDcEQsdUJBR0pzQixZQUFZbUMsR0FBRyxDQUFDLENBQUNDO29CQUNoQixJQUFJQSxZQUFZM0IsTUFBTTRCLFVBQVUsQ0FBQ0QsV0FBVzNCLElBQUksQ0FBQ0Msb0JBQW9CLEVBQUU7d0JBQ3JFLHFCQUNFLDZCQUFDZSxxQkFBSzs0QkFDSmEsT0FBQUE7NEJBQ0FDLEtBQUssQ0FBQyxFQUFFSCxXQUFXN0IsSUFBSSxDQUFDLE9BQU8sQ0FBQzs0QkFDaENtQixNQUFNLENBQUMsRUFBRUUsTUFBTUUsR0FBRyxDQUFDLENBQUMsRUFBRU0sV0FBVzdCLElBQUksQ0FBQyxjQUFjLENBQUM7eUNBRXJELDZCQUFDL0I7NEJBQU80RCxZQUFZQTs7b0JBRzFCO29CQUNBLE9BQU87Z0JBQ1Qsa0JBQ0EsNkJBQUNYLHFCQUFLLFFBQ0h4QyxxQkFDQyw2QkFBQ3VELGVBQVEsUUFDTmhELGdDQUNDLDZCQUFDaUQsZ0NBQWUsc0JBQ2QsNkJBQUNDLGdCQUFlLHNCQUNkLDZCQUFDYixzQkFBTSxzQkFDTCw2QkFBQ0oscUJBQUs7b0JBQUNhLE9BQUFBO29CQUFNWixNQUFNLENBQUMsRUFBRUUsTUFBTUUsR0FBRyxDQUFDLENBQUMsQ0FBQztpQ0FDaEMsNkJBQUMzRCxpQ0FFSCw2QkFBQ3NELHFCQUFLO29CQUFDQyxNQUFNLENBQUMsRUFBRUUsTUFBTUUsR0FBRyxDQUFDLFFBQVEsQ0FBQztpQ0FDakMsNkJBQUNhLGtDQUFvQjtvQkFDbkJQLFlBQVlwQyxZQUFZTSxJQUFJLENBQUMsQ0FBQyxFQUFFQyxJQUFJLEVBQUUsR0FBS0EsU0FBU1I7b0JBQ3BENkMsSUFBSTNELEtBQUsyRCxFQUFFO2lDQUVYLDZCQUFDakUsa0JBR0prRSxJQUFBQSw2QkFBZ0IsRUFBQztvQkFDaEI3QztvQkFDQTRCO29CQUNBN0M7b0JBQ0FFO2dCQUNGLElBQ0M2RCxJQUFBQSxxQkFBWSxFQUFDO29CQUNaN0M7b0JBQ0FYO29CQUNBc0M7b0JBQ0E3QztvQkFDQUU7Z0JBQ0Ysa0JBQ0EsNkJBQUN3QyxxQkFBSztvQkFBQ0MsTUFBTSxDQUFDLEVBQUVFLE1BQU1FLEdBQUcsQ0FBQyxDQUFDLENBQUM7aUNBQzFCLDZCQUFDaUIsaUJBQVEsYUFNbEJ2RCxtQkFBbUIsdUJBQVMsNkJBQUN3RCxxQkFBWSx5QkFHNUMsNkJBQUNqQix3QkFBUTtvQkFDUEMsSUFBSSxDQUFDLEVBQUVKLE1BQU1FLEdBQUcsQ0FBQyxNQUFNLEVBQ3JCbUIsT0FBT0MsUUFBUSxDQUFDQyxRQUFRLENBQUNDLFVBQVUsQ0FBQ2xELE9BQU9QLEtBQUssSUFDNUMsQ0FBQyxVQUFVLEVBQUUwRCxtQkFDWEosT0FBT0MsUUFBUSxDQUFDQyxRQUFRLENBQUNHLE9BQU8sQ0FBQ3BELE9BQU9QLEtBQUssRUFBRSxLQUMvQyxDQUFDLEdBQ0gsR0FDTCxDQUFDO21DQUlSLDZCQUFDOEIscUJBQUs7b0JBQUNDLE1BQU0sQ0FBQyxFQUFFRSxNQUFNRSxHQUFHLENBQUMsQ0FBQyxDQUFDO2lDQUMxQiw2QkFBQ2lCLGlCQUFRO1lBSWpCO1lBRUEsT0FBTztRQUNUO3NCQUVGLDZCQUFDUSxxQkFBWTtRQUFDdkUsZUFBZUE7O0FBR25DIn0=