UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

315 lines (314 loc) • 29.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); function _export(target, all) { for(var name in all)Object.defineProperty(target, name, { enumerable: true, get: all[name] }); } _export(exports, { DocumentInfoProvider: function() { return DocumentInfoProvider; }, useDocumentInfo: function() { return useDocumentInfo; } }); const _qs = /*#__PURE__*/ _interop_require_default(require("qs")); const _react = /*#__PURE__*/ _interop_require_wildcard(require("react")); const _reacti18next = require("react-i18next"); const _reactrouterdom = require("react-router-dom"); const _Auth = require("../Auth"); const _Config = require("../Config"); const _Locale = require("../Locale"); const _Preferences = require("../Preferences"); 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; } const Context = /*#__PURE__*/ (0, _react.createContext)({}); const useDocumentInfo = ()=>(0, _react.useContext)(Context); const DocumentInfoProvider = ({ id: idFromProps, children, collection, global, idFromParams: getIDFromParams })=>{ const { id: idFromParams } = (0, _reactrouterdom.useParams)(); const id = idFromProps || (getIDFromParams ? idFromParams : null); const { routes: { api }, serverURL } = (0, _Config.useConfig)(); const { getPreference, setPreference } = (0, _Preferences.usePreferences)(); const { i18n } = (0, _reacti18next.useTranslation)(); const { permissions } = (0, _Auth.useAuth)(); const { code } = (0, _Locale.useLocale)(); const [publishedDoc, setPublishedDoc] = (0, _react.useState)(null); const [versions, setVersions] = (0, _react.useState)(null); const [unpublishedVersions, setUnpublishedVersions] = (0, _react.useState)(null); const baseURL = `${serverURL}${api}`; let slug; let pluralType; let preferencesKey; if (global) { slug = global.slug; pluralType = 'globals'; preferencesKey = `global-${slug}`; } if (collection) { slug = collection.slug; pluralType = 'collections'; if (id) { preferencesKey = `collection-${slug}-${id}`; } } const [docPermissions, setDocPermissions] = (0, _react.useState)(permissions[pluralType][slug]); const getVersions = (0, _react.useCallback)(async ()=>{ let versionFetchURL; let publishedFetchURL; let draftsEnabled = false; let shouldFetchVersions = false; let unpublishedVersionJSON = null; let versionJSON = null; let shouldFetch = true; const versionParams = { depth: 0, where: { and: [] } }; const publishedVersionParams = { depth: 0, locale: code || undefined, where: { and: [ { or: [ { _status: { equals: 'published' } }, { _status: { exists: false } } ] } ] } }; if (global) { draftsEnabled = Boolean(global?.versions?.drafts); shouldFetchVersions = Boolean(global?.versions); versionFetchURL = `${baseURL}/globals/${global.slug}/versions`; publishedFetchURL = `${baseURL}/globals/${global.slug}?${_qs.default.stringify(publishedVersionParams)}`; } if (collection) { draftsEnabled = Boolean(collection?.versions?.drafts); shouldFetchVersions = Boolean(collection?.versions); versionFetchURL = `${baseURL}/${collection.slug}/versions`; publishedVersionParams.where.and.push({ id: { equals: id } }); publishedFetchURL = `${baseURL}/${collection.slug}?${_qs.default.stringify(publishedVersionParams)}`; if (!id) { shouldFetch = false; } versionParams.where.and.push({ parent: { equals: id } }); } if (shouldFetch) { let publishedJSON; if (draftsEnabled) { publishedJSON = await fetch(publishedFetchURL, { credentials: 'include', headers: { 'Accept-Language': i18n.language } }).then((res)=>res.json()); if (collection) { publishedJSON = publishedJSON?.docs?.[0]; } } if (shouldFetchVersions) { versionJSON = await fetch(`${versionFetchURL}?${_qs.default.stringify(versionParams)}`, { credentials: 'include', headers: { 'Accept-Language': i18n.language } }).then((res)=>res.json()); if (publishedJSON?.updatedAt) { const newerVersionParams = { ...versionParams, where: { ...versionParams.where, and: [ ...versionParams.where.and, { updatedAt: { greater_than: publishedJSON?.updatedAt } } ] } }; // Get any newer versions available const newerVersionRes = await fetch(`${versionFetchURL}?${_qs.default.stringify(newerVersionParams)}`, { credentials: 'include', headers: { 'Accept-Language': i18n.language } }); if (newerVersionRes.status === 200) { unpublishedVersionJSON = await newerVersionRes.json(); } } } setPublishedDoc(publishedJSON); setVersions(versionJSON); setUnpublishedVersions(unpublishedVersionJSON); } }, [ i18n, global, collection, id, baseURL, code ]); const getDocPermissions = _react.default.useCallback(async ()=>{ let docAccessURL; const params = { locale: code || undefined }; if (pluralType === 'globals') { docAccessURL = `/globals/${slug}/access`; } else if (pluralType === 'collections' && id) { docAccessURL = `/${slug}/access/${id}`; } if (docAccessURL) { const res = await fetch(`${serverURL}${api}${docAccessURL}?${_qs.default.stringify(params)}`, { credentials: 'include', headers: { 'Accept-Language': i18n.language } }); try { const json = await res.json(); setDocPermissions(json); } catch (e) { console.error('Unable to fetch document permissions', e); } } }, [ serverURL, api, pluralType, slug, id, i18n.language, code ]); const getDocPreferences = (0, _react.useCallback)(async ()=>{ return getPreference(preferencesKey); }, [ getPreference, preferencesKey ]); const setDocFieldPreferences = (0, _react.useCallback)(async (path, fieldPreferences)=>{ const allPreferences = await getDocPreferences(); if (preferencesKey) { try { await setPreference(preferencesKey, { ...allPreferences, fields: { ...allPreferences?.fields || {}, [path]: { ...allPreferences?.fields?.[path], ...fieldPreferences } } }); } catch (e) { console.error(e); } } }, [ setPreference, preferencesKey, getDocPreferences ]); (0, _react.useEffect)(()=>{ getVersions(); }, [ getVersions ]); (0, _react.useEffect)(()=>{ getDocPermissions(); }, [ getDocPermissions ]); const value = { id, slug, collection, docPermissions, getDocPermissions, getDocPreferences, getVersions, global, preferencesKey, publishedDoc, setDocFieldPreferences, unpublishedVersions, versions }; return /*#__PURE__*/ _react.default.createElement(Context.Provider, { value: value }, children); }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9hZG1pbi9jb21wb25lbnRzL3V0aWxpdGllcy9Eb2N1bWVudEluZm8vaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBxcyBmcm9tICdxcydcbmltcG9ydCBSZWFjdCwgeyBjcmVhdGVDb250ZXh0LCB1c2VDYWxsYmFjaywgdXNlQ29udGV4dCwgdXNlRWZmZWN0LCB1c2VTdGF0ZSB9IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdXNlVHJhbnNsYXRpb24gfSBmcm9tICdyZWFjdC1pMThuZXh0J1xuaW1wb3J0IHsgdXNlUGFyYW1zIH0gZnJvbSAncmVhY3Qtcm91dGVyLWRvbSdcblxuaW1wb3J0IHR5cGUgeyBUeXBlV2l0aFRpbWVzdGFtcHMgfSBmcm9tICcuLi8uLi8uLi8uLi9jb2xsZWN0aW9ucy9jb25maWcvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFBhZ2luYXRlZERvY3MgfSBmcm9tICcuLi8uLi8uLi8uLi9kYXRhYmFzZS90eXBlcydcbmltcG9ydCB0eXBlIHsgVHlwZVdpdGhJRCB9IGZyb20gJy4uLy4uLy4uLy4uL2dsb2JhbHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBEb2N1bWVudFByZWZlcmVuY2VzIH0gZnJvbSAnLi4vLi4vLi4vLi4vcHJlZmVyZW5jZXMvdHlwZXMnXG5pbXBvcnQgdHlwZSB7IFdoZXJlIH0gZnJvbSAnLi4vLi4vLi4vLi4vdHlwZXMnXG5pbXBvcnQgdHlwZSB7IENvbnRleHRUeXBlLCBEb2N1bWVudFBlcm1pc3Npb25zLCBQcm9wcywgVmVyc2lvbiB9IGZyb20gJy4vdHlwZXMnXG5cbmltcG9ydCB7IHVzZUF1dGggfSBmcm9tICcuLi9BdXRoJ1xuaW1wb3J0IHsgdXNlQ29uZmlnIH0gZnJvbSAnLi4vQ29uZmlnJ1xuaW1wb3J0IHsgdXNlTG9jYWxlIH0gZnJvbSAnLi4vTG9jYWxlJ1xuaW1wb3J0IHsgdXNlUHJlZmVyZW5jZXMgfSBmcm9tICcuLi9QcmVmZXJlbmNlcydcblxuY29uc3QgQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQoe30gYXMgQ29udGV4dFR5cGUpXG5cbmV4cG9ydCBjb25zdCB1c2VEb2N1bWVudEluZm8gPSAoKTogQ29udGV4dFR5cGUgPT4gdXNlQ29udGV4dChDb250ZXh0KVxuXG5leHBvcnQgY29uc3QgRG9jdW1lbnRJbmZvUHJvdmlkZXI6IFJlYWN0LkZDPFByb3BzPiA9ICh7XG4gIGlkOiBpZEZyb21Qcm9wcyxcbiAgY2hpbGRyZW4sXG4gIGNvbGxlY3Rpb24sXG4gIGdsb2JhbCxcbiAgaWRGcm9tUGFyYW1zOiBnZXRJREZyb21QYXJhbXMsXG59KSA9PiB7XG4gIGNvbnN0IHsgaWQ6IGlkRnJvbVBhcmFtcyB9ID0gdXNlUGFyYW1zPHsgaWQ6IHN0cmluZyB9PigpXG4gIGNvbnN0IGlkID0gaWRGcm9tUHJvcHMgfHwgKGdldElERnJvbVBhcmFtcyA/IGlkRnJvbVBhcmFtcyA6IG51bGwpXG5cbiAgY29uc3Qge1xuICAgIHJvdXRlczogeyBhcGkgfSxcbiAgICBzZXJ2ZXJVUkwsXG4gIH0gPSB1c2VDb25maWcoKVxuICBjb25zdCB7IGdldFByZWZlcmVuY2UsIHNldFByZWZlcmVuY2UgfSA9IHVzZVByZWZlcmVuY2VzKClcbiAgY29uc3QgeyBpMThuIH0gPSB1c2VUcmFuc2xhdGlvbigpXG4gIGNvbnN0IHsgcGVybWlzc2lvbnMgfSA9IHVzZUF1dGgoKVxuICBjb25zdCB7IGNvZGUgfSA9IHVzZUxvY2FsZSgpXG4gIGNvbnN0IFtwdWJsaXNoZWREb2MsIHNldFB1Ymxpc2hlZERvY10gPSB1c2VTdGF0ZTxUeXBlV2l0aElEICYgVHlwZVdpdGhUaW1lc3RhbXBzPihudWxsKVxuICBjb25zdCBbdmVyc2lvbnMsIHNldFZlcnNpb25zXSA9IHVzZVN0YXRlPFBhZ2luYXRlZERvY3M8VmVyc2lvbj4+KG51bGwpXG4gIGNvbnN0IFt1bnB1Ymxpc2hlZFZlcnNpb25zLCBzZXRVbnB1Ymxpc2hlZFZlcnNpb25zXSA9IHVzZVN0YXRlPFBhZ2luYXRlZERvY3M8VmVyc2lvbj4+KG51bGwpXG5cbiAgY29uc3QgYmFzZVVSTCA9IGAke3NlcnZlclVSTH0ke2FwaX1gXG4gIGxldCBzbHVnOiBzdHJpbmdcbiAgbGV0IHBsdXJhbFR5cGU6ICdjb2xsZWN0aW9ucycgfCAnZ2xvYmFscydcbiAgbGV0IHByZWZlcmVuY2VzS2V5OiBzdHJpbmdcblxuICBpZiAoZ2xvYmFsKSB7XG4gICAgc2x1ZyA9IGdsb2JhbC5zbHVnXG4gICAgcGx1cmFsVHlwZSA9ICdnbG9iYWxzJ1xuICAgIHByZWZlcmVuY2VzS2V5ID0gYGdsb2JhbC0ke3NsdWd9YFxuICB9XG5cbiAgaWYgKGNvbGxlY3Rpb24pIHtcbiAgICBzbHVnID0gY29sbGVjdGlvbi5zbHVnXG4gICAgcGx1cmFsVHlwZSA9ICdjb2xsZWN0aW9ucydcblxuICAgIGlmIChpZCkge1xuICAgICAgcHJlZmVyZW5jZXNLZXkgPSBgY29sbGVjdGlvbi0ke3NsdWd9LSR7aWR9YFxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFtkb2NQZXJtaXNzaW9ucywgc2V0RG9jUGVybWlzc2lvbnNdID0gdXNlU3RhdGU8RG9jdW1lbnRQZXJtaXNzaW9ucz4oXG4gICAgcGVybWlzc2lvbnNbcGx1cmFsVHlwZV1bc2x1Z10sXG4gIClcblxuICBjb25zdCBnZXRWZXJzaW9ucyA9IHVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBsZXQgdmVyc2lvbkZldGNoVVJMXG4gICAgbGV0IHB1Ymxpc2hlZEZldGNoVVJMXG4gICAgbGV0IGRyYWZ0c0VuYWJsZWQgPSBmYWxzZVxuICAgIGxldCBzaG91bGRGZXRjaFZlcnNpb25zID0gZmFsc2VcbiAgICBsZXQgdW5wdWJsaXNoZWRWZXJzaW9uSlNPTiA9IG51bGxcbiAgICBsZXQgdmVyc2lvbkpTT04gPSBudWxsXG4gICAgbGV0IHNob3VsZEZldGNoID0gdHJ1ZVxuXG4gICAgY29uc3QgdmVyc2lvblBhcmFtcyA9IHtcbiAgICAgIGRlcHRoOiAwLFxuICAgICAgd2hlcmU6IHtcbiAgICAgICAgYW5kOiBbXSxcbiAgICAgIH0sXG4gICAgfVxuXG4gICAgY29uc3QgcHVibGlzaGVkVmVyc2lvblBhcmFtczogeyBkZXB0aDogbnVtYmVyOyBsb2NhbGU6IHN0cmluZzsgd2hlcmU6IFdoZXJlIH0gPSB7XG4gICAgICBkZXB0aDogMCxcbiAgICAgIGxvY2FsZTogY29kZSB8fCB1bmRlZmluZWQsXG4gICAgICB3aGVyZToge1xuICAgICAgICBhbmQ6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBvcjogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3N0YXR1czoge1xuICAgICAgICAgICAgICAgICAgZXF1YWxzOiAncHVibGlzaGVkJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgX3N0YXR1czoge1xuICAgICAgICAgICAgICAgICAgZXhpc3RzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICBkcmFmdHNFbmFibGVkID0gQm9vbGVhbihnbG9iYWw/LnZlcnNpb25zPy5kcmFmdHMpXG4gICAgICBzaG91bGRGZXRjaFZlcnNpb25zID0gQm9vbGVhbihnbG9iYWw/LnZlcnNpb25zKVxuICAgICAgdmVyc2lvbkZldGNoVVJMID0gYCR7YmFzZVVSTH0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfS92ZXJzaW9uc2BcbiAgICAgIHB1Ymxpc2hlZEZldGNoVVJMID0gYCR7YmFzZVVSTH0vZ2xvYmFscy8ke2dsb2JhbC5zbHVnfT8ke3FzLnN0cmluZ2lmeShcbiAgICAgICAgcHVibGlzaGVkVmVyc2lvblBhcmFtcyxcbiAgICAgICl9YFxuICAgIH1cblxuICAgIGlmIChjb2xsZWN0aW9uKSB7XG4gICAgICBkcmFmdHNFbmFibGVkID0gQm9vbGVhbihjb2xsZWN0aW9uPy52ZXJzaW9ucz8uZHJhZnRzKVxuICAgICAgc2hvdWxkRmV0Y2hWZXJzaW9ucyA9IEJvb2xlYW4oY29sbGVjdGlvbj8udmVyc2lvbnMpXG4gICAgICB2ZXJzaW9uRmV0Y2hVUkwgPSBgJHtiYXNlVVJMfS8ke2NvbGxlY3Rpb24uc2x1Z30vdmVyc2lvbnNgXG5cbiAgICAgIHB1Ymxpc2hlZFZlcnNpb25QYXJhbXMud2hlcmUuYW5kLnB1c2goe1xuICAgICAgICBpZDoge1xuICAgICAgICAgIGVxdWFsczogaWQsXG4gICAgICAgIH0sXG4gICAgICB9KVxuXG4gICAgICBwdWJsaXNoZWRGZXRjaFVSTCA9IGAke2Jhc2VVUkx9LyR7Y29sbGVjdGlvbi5zbHVnfT8ke3FzLnN0cmluZ2lmeShwdWJsaXNoZWRWZXJzaW9uUGFyYW1zKX1gXG5cbiAgICAgIGlmICghaWQpIHtcbiAgICAgICAgc2hvdWxkRmV0Y2ggPSBmYWxzZVxuICAgICAgfVxuXG4gICAgICB2ZXJzaW9uUGFyYW1zLndoZXJlLmFuZC5wdXNoKHtcbiAgICAgICAgcGFyZW50OiB7XG4gICAgICAgICAgZXF1YWxzOiBpZCxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKHNob3VsZEZldGNoKSB7XG4gICAgICBsZXQgcHVibGlzaGVkSlNPTlxuXG4gICAgICBpZiAoZHJhZnRzRW5hYmxlZCkge1xuICAgICAgICBwdWJsaXNoZWRKU09OID0gYXdhaXQgZmV0Y2gocHVibGlzaGVkRmV0Y2hVUkwsIHtcbiAgICAgICAgICBjcmVkZW50aWFsczogJ2luY2x1ZGUnLFxuICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICdBY2NlcHQtTGFuZ3VhZ2UnOiBpMThuLmxhbmd1YWdlLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pLnRoZW4oKHJlcykgPT4gcmVzLmpzb24oKSlcblxuICAgICAgICBpZiAoY29sbGVjdGlvbikge1xuICAgICAgICAgIHB1Ymxpc2hlZEpTT04gPSBwdWJsaXNoZWRKU09OPy5kb2NzPy5bMF1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoc2hvdWxkRmV0Y2hWZXJzaW9ucykge1xuICAgICAgICB2ZXJzaW9uSlNPTiA9IGF3YWl0IGZldGNoKGAke3ZlcnNpb25GZXRjaFVSTH0/JHtxcy5zdHJpbmdpZnkodmVyc2lvblBhcmFtcyl9YCwge1xuICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgJ0FjY2VwdC1MYW5ndWFnZSc6IGkxOG4ubGFuZ3VhZ2UsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSkudGhlbigocmVzKSA9PiByZXMuanNvbigpKVxuXG4gICAgICAgIGlmIChwdWJsaXNoZWRKU09OPy51cGRhdGVkQXQpIHtcbiAgICAgICAgICBjb25zdCBuZXdlclZlcnNpb25QYXJhbXMgPSB7XG4gICAgICAgICAgICAuLi52ZXJzaW9uUGFyYW1zLFxuICAgICAgICAgICAgd2hlcmU6IHtcbiAgICAgICAgICAgICAgLi4udmVyc2lvblBhcmFtcy53aGVyZSxcbiAgICAgICAgICAgICAgYW5kOiBbXG4gICAgICAgICAgICAgICAgLi4udmVyc2lvblBhcmFtcy53aGVyZS5hbmQsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdXBkYXRlZEF0OiB7XG4gICAgICAgICAgICAgICAgICAgIGdyZWF0ZXJfdGhhbjogcHVibGlzaGVkSlNPTj8udXBkYXRlZEF0LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBHZXQgYW55IG5ld2VyIHZlcnNpb25zIGF2YWlsYWJsZVxuICAgICAgICAgIGNvbnN0IG5ld2VyVmVyc2lvblJlcyA9IGF3YWl0IGZldGNoKFxuICAgICAgICAgICAgYCR7dmVyc2lvbkZldGNoVVJMfT8ke3FzLnN0cmluZ2lmeShuZXdlclZlcnNpb25QYXJhbXMpfWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKVxuXG4gICAgICAgICAgaWYgKG5ld2VyVmVyc2lvblJlcy5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgdW5wdWJsaXNoZWRWZXJzaW9uSlNPTiA9IGF3YWl0IG5ld2VyVmVyc2lvblJlcy5qc29uKClcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgc2V0UHVibGlzaGVkRG9jKHB1Ymxpc2hlZEpTT04pXG4gICAgICBzZXRWZXJzaW9ucyh2ZXJzaW9uSlNPTilcbiAgICAgIHNldFVucHVibGlzaGVkVmVyc2lvbnModW5wdWJsaXNoZWRWZXJzaW9uSlNPTilcbiAgICB9XG4gIH0sIFtpMThuLCBnbG9iYWwsIGNvbGxlY3Rpb24sIGlkLCBiYXNlVVJMLCBjb2RlXSlcblxuICBjb25zdCBnZXREb2NQZXJtaXNzaW9ucyA9IFJlYWN0LnVzZUNhbGxiYWNrKGFzeW5jICgpID0+IHtcbiAgICBsZXQgZG9jQWNjZXNzVVJMOiBzdHJpbmdcbiAgICBjb25zdCBwYXJhbXMgPSB7XG4gICAgICBsb2NhbGU6IGNvZGUgfHwgdW5kZWZpbmVkLFxuICAgIH1cbiAgICBpZiAocGx1cmFsVHlwZSA9PT0gJ2dsb2JhbHMnKSB7XG4gICAgICBkb2NBY2Nlc3NVUkwgPSBgL2dsb2JhbHMvJHtzbHVnfS9hY2Nlc3NgXG4gICAgfSBlbHNlIGlmIChwbHVyYWxUeXBlID09PSAnY29sbGVjdGlvbnMnICYmIGlkKSB7XG4gICAgICBkb2NBY2Nlc3NVUkwgPSBgLyR7c2x1Z30vYWNjZXNzLyR7aWR9YFxuICAgIH1cblxuICAgIGlmIChkb2NBY2Nlc3NVUkwpIHtcbiAgICAgIGNvbnN0IHJlcyA9IGF3YWl0IGZldGNoKGAke3NlcnZlclVSTH0ke2FwaX0ke2RvY0FjY2Vzc1VSTH0/JHtxcy5zdHJpbmdpZnkocGFyYW1zKX1gLCB7XG4gICAgICAgIGNyZWRlbnRpYWxzOiAnaW5jbHVkZScsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQWNjZXB0LUxhbmd1YWdlJzogaTE4bi5sYW5ndWFnZSxcbiAgICAgICAgfSxcbiAgICAgIH0pXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uID0gYXdhaXQgcmVzLmpzb24oKVxuICAgICAgICBzZXREb2NQZXJtaXNzaW9ucyhqc29uKVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdVbmFibGUgdG8gZmV0Y2ggZG9jdW1lbnQgcGVybWlzc2lvbnMnLCBlKVxuICAgICAgfVxuICAgIH1cbiAgfSwgW3NlcnZlclVSTCwgYXBpLCBwbHVyYWxUeXBlLCBzbHVnLCBpZCwgaTE4bi5sYW5ndWFnZSwgY29kZV0pXG5cbiAgY29uc3QgZ2V0RG9jUHJlZmVyZW5jZXMgPSB1c2VDYWxsYmFjayhhc3luYyAoKSA9PiB7XG4gICAgcmV0dXJuIGdldFByZWZlcmVuY2U8RG9jdW1lbnRQcmVmZXJlbmNlcz4ocHJlZmVyZW5jZXNLZXkpXG4gIH0sIFtnZXRQcmVmZXJlbmNlLCBwcmVmZXJlbmNlc0tleV0pXG5cbiAgY29uc3Qgc2V0RG9jRmllbGRQcmVmZXJlbmNlcyA9IHVzZUNhbGxiYWNrPENvbnRleHRUeXBlWydzZXREb2NGaWVsZFByZWZlcmVuY2VzJ10+KFxuICAgIGFzeW5jIChwYXRoLCBmaWVsZFByZWZlcmVuY2VzKSA9PiB7XG4gICAgICBjb25zdCBhbGxQcmVmZXJlbmNlcyA9IGF3YWl0IGdldERvY1ByZWZlcmVuY2VzKClcblxuICAgICAgaWYgKHByZWZlcmVuY2VzS2V5KSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgc2V0UHJlZmVyZW5jZShwcmVmZXJlbmNlc0tleSwge1xuICAgICAgICAgICAgLi4uYWxsUHJlZmVyZW5jZXMsXG4gICAgICAgICAgICBmaWVsZHM6IHtcbiAgICAgICAgICAgICAgLi4uKGFsbFByZWZlcmVuY2VzPy5maWVsZHMgfHwge30pLFxuICAgICAgICAgICAgICBbcGF0aF06IHtcbiAgICAgICAgICAgICAgICAuLi5hbGxQcmVmZXJlbmNlcz8uZmllbGRzPy5bcGF0aF0sXG4gICAgICAgICAgICAgICAgLi4uZmllbGRQcmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgW3NldFByZWZlcmVuY2UsIHByZWZlcmVuY2VzS2V5LCBnZXREb2NQcmVmZXJlbmNlc10sXG4gIClcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldFZlcnNpb25zKClcbiAgfSwgW2dldFZlcnNpb25zXSlcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIGdldERvY1Blcm1pc3Npb25zKClcbiAgfSwgW2dldERvY1Blcm1pc3Npb25zXSlcblxuICBjb25zdCB2YWx1ZTogQ29udGV4dFR5cGUgPSB7XG4gICAgaWQsXG4gICAgc2x1ZyxcbiAgICBjb2xsZWN0aW9uLFxuICAgIGRvY1Blcm1pc3Npb25zLFxuICAgIGdldERvY1Blcm1pc3Npb25zLFxuICAgIGdldERvY1ByZWZlcmVuY2VzLFxuICAgIGdldFZlcnNpb25zLFxuICAgIGdsb2JhbCxcbiAgICBwcmVmZXJlbmNlc0tleSxcbiAgICBwdWJsaXNoZWREb2MsXG4gICAgc2V0RG9jRmllbGRQcmVmZXJlbmNlcyxcbiAgICB1bnB1Ymxpc2hlZFZlcnNpb25zLFxuICAgIHZlcnNpb25zLFxuICB9XG5cbiAgcmV0dXJuIDxDb250ZXh0LlByb3ZpZGVyIHZhbHVlPXt2YWx1ZX0+e2NoaWxkcmVufTwvQ29udGV4dC5Qcm92aWRlcj5cbn1cbiJdLCJuYW1lcyI6WyJEb2N1bWVudEluZm9Qcm92aWRlciIsInVzZURvY3VtZW50SW5mbyIsIkNvbnRleHQiLCJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsImlkIiwiaWRGcm9tUHJvcHMiLCJjaGlsZHJlbiIsImNvbGxlY3Rpb24iLCJnbG9iYWwiLCJpZEZyb21QYXJhbXMiLCJnZXRJREZyb21QYXJhbXMiLCJ1c2VQYXJhbXMiLCJyb3V0ZXMiLCJhcGkiLCJzZXJ2ZXJVUkwiLCJ1c2VDb25maWciLCJnZXRQcmVmZXJlbmNlIiwic2V0UHJlZmVyZW5jZSIsInVzZVByZWZlcmVuY2VzIiwiaTE4biIsInVzZVRyYW5zbGF0aW9uIiwicGVybWlzc2lvbnMiLCJ1c2VBdXRoIiwiY29kZSIsInVzZUxvY2FsZSIsInB1Ymxpc2hlZERvYyIsInNldFB1Ymxpc2hlZERvYyIsInVzZVN0YXRlIiwidmVyc2lvbnMiLCJzZXRWZXJzaW9ucyIsInVucHVibGlzaGVkVmVyc2lvbnMiLCJzZXRVbnB1Ymxpc2hlZFZlcnNpb25zIiwiYmFzZVVSTCIsInNsdWciLCJwbHVyYWxUeXBlIiwicHJlZmVyZW5jZXNLZXkiLCJkb2NQZXJtaXNzaW9ucyIsInNldERvY1Blcm1pc3Npb25zIiwiZ2V0VmVyc2lvbnMiLCJ1c2VDYWxsYmFjayIsInZlcnNpb25GZXRjaFVSTCIsInB1Ymxpc2hlZEZldGNoVVJMIiwiZHJhZnRzRW5hYmxlZCIsInNob3VsZEZldGNoVmVyc2lvbnMiLCJ1bnB1Ymxpc2hlZFZlcnNpb25KU09OIiwidmVyc2lvbkpTT04iLCJzaG91bGRGZXRjaCIsInZlcnNpb25QYXJhbXMiLCJkZXB0aCIsIndoZXJlIiwiYW5kIiwicHVibGlzaGVkVmVyc2lvblBhcmFtcyIsImxvY2FsZSIsInVuZGVmaW5lZCIsIm9yIiwiX3N0YXR1cyIsImVxdWFscyIsImV4aXN0cyIsIkJvb2xlYW4iLCJkcmFmdHMiLCJxcyIsInN0cmluZ2lmeSIsInB1c2giLCJwYXJlbnQiLCJwdWJsaXNoZWRKU09OIiwiZmV0Y2giLCJjcmVkZW50aWFscyIsImhlYWRlcnMiLCJsYW5ndWFnZSIsInRoZW4iLCJyZXMiLCJqc29uIiwiZG9jcyIsInVwZGF0ZWRBdCIsIm5ld2VyVmVyc2lvblBhcmFtcyIsImdyZWF0ZXJfdGhhbiIsIm5ld2VyVmVyc2lvblJlcyIsInN0YXR1cyIsImdldERvY1Blcm1pc3Npb25zIiwiUmVhY3QiLCJkb2NBY2Nlc3NVUkwiLCJwYXJhbXMiLCJlIiwiY29uc29sZSIsImVycm9yIiwiZ2V0RG9jUHJlZmVyZW5jZXMiLCJzZXREb2NGaWVsZFByZWZlcmVuY2VzIiwicGF0aCIsImZpZWxkUHJlZmVyZW5jZXMiLCJhbGxQcmVmZXJlbmNlcyIsImZpZWxkcyIsInVzZUVmZmVjdCIsInZhbHVlIiwiUHJvdmlkZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0lBcUJhQSxvQkFBb0I7ZUFBcEJBOztJQUZBQyxlQUFlO2VBQWZBOzs7MkRBbkJFOytEQUNvRTs4QkFDcEQ7Z0NBQ0w7c0JBU0Y7d0JBQ0U7d0JBQ0E7NkJBQ0s7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBRS9CLE1BQU1DLHdCQUFVQyxJQUFBQSxvQkFBYSxFQUFDLENBQUM7QUFFeEIsTUFBTUYsa0JBQWtCLElBQW1CRyxJQUFBQSxpQkFBVSxFQUFDRjtBQUV0RCxNQUFNRix1QkFBd0MsQ0FBQyxFQUNwREssSUFBSUMsV0FBVyxFQUNmQyxRQUFRLEVBQ1JDLFVBQVUsRUFDVkMsTUFBTSxFQUNOQyxjQUFjQyxlQUFlLEVBQzlCO0lBQ0MsTUFBTSxFQUFFTixJQUFJSyxZQUFZLEVBQUUsR0FBR0UsSUFBQUEseUJBQVM7SUFDdEMsTUFBTVAsS0FBS0MsZUFBZ0JLLENBQUFBLGtCQUFrQkQsZUFBZSxJQUFHO0lBRS9ELE1BQU0sRUFDSkcsUUFBUSxFQUFFQyxHQUFHLEVBQUUsRUFDZkMsU0FBUyxFQUNWLEdBQUdDLElBQUFBLGlCQUFTO0lBQ2IsTUFBTSxF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