UNPKG

matrix-react-sdk

Version:
113 lines (108 loc) 16.7 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.useUserOnboardingContext = useUserOnboardingContext; var _logger = require("matrix-js-sdk/src/logger"); var _matrix = require("matrix-js-sdk/src/matrix"); var _react = require("react"); var _Notifier = require("../Notifier"); var _DMRoomMap = _interopRequireDefault(require("../utils/DMRoomMap")); var _MatrixClientContext = require("../contexts/MatrixClientContext"); var _useSettings = require("./useSettings"); var _useEventEmitter = require("./useEventEmitter"); /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const USER_ONBOARDING_CONTEXT_INTERVAL = 5000; /** * Returns a persistent, non-changing reference to a function * This function proxies all its calls to the current value of the given input callback * * This allows you to use the current value of e.g., a state in a callback that’s used by e.g., a useEventEmitter or * similar hook without re-registering the hook when the state changes * @param value changing callback */ function useRefOf(value) { const ref = (0, _react.useRef)(value); ref.current = value; return (0, _react.useCallback)((...values) => ref.current(...values), []); } function useUserOnboardingContextValue(defaultValue, callback) { const [value, setValue] = (0, _react.useState)(defaultValue); const cli = (0, _MatrixClientContext.useMatrixClientContext)(); const handler = useRefOf(callback); (0, _react.useEffect)(() => { if (value) { return; } let handle = null; let enabled = true; const repeater = async () => { if (handle !== null) { clearTimeout(handle); handle = null; } setValue(await handler(cli)); if (enabled) { handle = window.setTimeout(repeater, USER_ONBOARDING_CONTEXT_INTERVAL); } }; repeater().catch(err => _logger.logger.warn("could not update user onboarding context", err)); cli.on(_matrix.ClientEvent.AccountData, repeater); return () => { enabled = false; cli.off(_matrix.ClientEvent.AccountData, repeater); if (handle !== null) { clearTimeout(handle); handle = null; } }; }, [cli, handler, value]); return value; } function useShowNotificationsPrompt() { const client = (0, _MatrixClientContext.useMatrixClientContext)(); const [value, setValue] = (0, _react.useState)(client.pushRules ? _Notifier.Notifier.shouldShowPrompt() : true); const updateValue = (0, _react.useCallback)(() => { setValue(client.pushRules ? _Notifier.Notifier.shouldShowPrompt() : true); }, [client]); (0, _useEventEmitter.useEventEmitter)(_Notifier.Notifier, _Notifier.NotifierEvent.NotificationHiddenChange, () => { updateValue(); }); const setting = (0, _useSettings.useSettingValue)("notificationsEnabled"); (0, _react.useEffect)(() => { updateValue(); }, [setting, updateValue]); // shouldShowPrompt is dependent on the client having push rules. There isn't an event for the client // fetching its push rules, but we'll know it has them by the time it sync, so we update this on sync. (0, _useEventEmitter.useTypedEventEmitter)(client, _matrix.ClientEvent.Sync, updateValue); return value; } function useUserOnboardingContext() { const hasAvatar = useUserOnboardingContextValue(false, async cli => { const profile = await cli.getProfileInfo(cli.getUserId()); return Boolean(profile?.avatar_url); }); const hasDevices = useUserOnboardingContextValue(false, async cli => { const myDevice = cli.getDeviceId(); const devices = await cli.getDevices(); return Boolean(devices.devices.find(device => device.device_id !== myDevice)); }); const hasDmRooms = useUserOnboardingContextValue(false, async () => { const dmRooms = _DMRoomMap.default.shared().getUniqueRoomsWithIndividuals() ?? {}; return Boolean(Object.keys(dmRooms).length); }); const showNotificationsPrompt = useShowNotificationsPrompt(); return (0, _react.useMemo)(() => ({ hasAvatar, hasDevices, hasDmRooms, showNotificationsPrompt }), [hasAvatar, hasDevices, hasDmRooms, showNotificationsPrompt]); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfcmVhY3QiLCJfTm90aWZpZXIiLCJfRE1Sb29tTWFwIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX3VzZVNldHRpbmdzIiwiX3VzZUV2ZW50RW1pdHRlciIsIlVTRVJfT05CT0FSRElOR19DT05URVhUX0lOVEVSVkFMIiwidXNlUmVmT2YiLCJ2YWx1ZSIsInJlZiIsInVzZVJlZiIsImN1cnJlbnQiLCJ1c2VDYWxsYmFjayIsInZhbHVlcyIsInVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dFZhbHVlIiwiZGVmYXVsdFZhbHVlIiwiY2FsbGJhY2siLCJzZXRWYWx1ZSIsInVzZVN0YXRlIiwiY2xpIiwidXNlTWF0cml4Q2xpZW50Q29udGV4dCIsImhhbmRsZXIiLCJ1c2VFZmZlY3QiLCJoYW5kbGUiLCJlbmFibGVkIiwicmVwZWF0ZXIiLCJjbGVhclRpbWVvdXQiLCJ3aW5kb3ciLCJzZXRUaW1lb3V0IiwiY2F0Y2giLCJlcnIiLCJsb2dnZXIiLCJ3YXJuIiwib24iLCJDbGllbnRFdmVudCIsIkFjY291bnREYXRhIiwib2ZmIiwidXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQiLCJjbGllbnQiLCJwdXNoUnVsZXMiLCJOb3RpZmllciIsInNob3VsZFNob3dQcm9tcHQiLCJ1cGRhdGVWYWx1ZSIsInVzZUV2ZW50RW1pdHRlciIsIk5vdGlmaWVyRXZlbnQiLCJOb3RpZmljYXRpb25IaWRkZW5DaGFuZ2UiLCJzZXR0aW5nIiwidXNlU2V0dGluZ1ZhbHVlIiwidXNlVHlwZWRFdmVudEVtaXR0ZXIiLCJTeW5jIiwidXNlVXNlck9uYm9hcmRpbmdDb250ZXh0IiwiaGFzQXZhdGFyIiwicHJvZmlsZSIsImdldFByb2ZpbGVJbmZvIiwiZ2V0VXNlcklkIiwiQm9vbGVhbiIsImF2YXRhcl91cmwiLCJoYXNEZXZpY2VzIiwibXlEZXZpY2UiLCJnZXREZXZpY2VJZCIsImRldmljZXMiLCJnZXREZXZpY2VzIiwiZmluZCIsImRldmljZSIsImRldmljZV9pZCIsImhhc0RtUm9vbXMiLCJkbVJvb21zIiwiRE1Sb29tTWFwIiwic2hhcmVkIiwiZ2V0VW5pcXVlUm9vbXNXaXRoSW5kaXZpZHVhbHMiLCJPYmplY3QiLCJrZXlzIiwibGVuZ3RoIiwic2hvd05vdGlmaWNhdGlvbnNQcm9tcHQiLCJ1c2VNZW1vIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2hvb2tzL3VzZVVzZXJPbmJvYXJkaW5nQ29udGV4dC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbG9nZ2VyXCI7XG5pbXBvcnQgeyBDbGllbnRFdmVudCwgTWF0cml4Q2xpZW50IH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgdXNlQ2FsbGJhY2ssIHVzZUVmZmVjdCwgdXNlTWVtbywgdXNlUmVmLCB1c2VTdGF0ZSB9IGZyb20gXCJyZWFjdFwiO1xuXG5pbXBvcnQgeyBOb3RpZmllciwgTm90aWZpZXJFdmVudCB9IGZyb20gXCIuLi9Ob3RpZmllclwiO1xuaW1wb3J0IERNUm9vbU1hcCBmcm9tIFwiLi4vdXRpbHMvRE1Sb29tTWFwXCI7XG5pbXBvcnQgeyB1c2VNYXRyaXhDbGllbnRDb250ZXh0IH0gZnJvbSBcIi4uL2NvbnRleHRzL01hdHJpeENsaWVudENvbnRleHRcIjtcbmltcG9ydCB7IHVzZVNldHRpbmdWYWx1ZSB9IGZyb20gXCIuL3VzZVNldHRpbmdzXCI7XG5pbXBvcnQgeyB1c2VFdmVudEVtaXR0ZXIsIHVzZVR5cGVkRXZlbnRFbWl0dGVyIH0gZnJvbSBcIi4vdXNlRXZlbnRFbWl0dGVyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck9uYm9hcmRpbmdDb250ZXh0IHtcbiAgICBoYXNBdmF0YXI6IGJvb2xlYW47XG4gICAgaGFzRGV2aWNlczogYm9vbGVhbjtcbiAgICBoYXNEbVJvb21zOiBib29sZWFuO1xuICAgIHNob3dOb3RpZmljYXRpb25zUHJvbXB0OiBib29sZWFuO1xufVxuXG5jb25zdCBVU0VSX09OQk9BUkRJTkdfQ09OVEVYVF9JTlRFUlZBTCA9IDUwMDA7XG5cbi8qKlxuICogUmV0dXJucyBhIHBlcnNpc3RlbnQsIG5vbi1jaGFuZ2luZyByZWZlcmVuY2UgdG8gYSBmdW5jdGlvblxuICogVGhpcyBmdW5jdGlvbiBwcm94aWVzIGFsbCBpdHMgY2FsbHMgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGlucHV0IGNhbGxiYWNrXG4gKlxuICogVGhpcyBhbGxvd3MgeW91IHRvIHVzZSB0aGUgY3VycmVudCB2YWx1ZSBvZiBlLmcuLCBhIHN0YXRlIGluIGEgY2FsbGJhY2sgdGhhdOKAmXMgdXNlZCBieSBlLmcuLCBhIHVzZUV2ZW50RW1pdHRlciBvclxuICogc2ltaWxhciBob29rIHdpdGhvdXQgcmUtcmVnaXN0ZXJpbmcgdGhlIGhvb2sgd2hlbiB0aGUgc3RhdGUgY2hhbmdlc1xuICogQHBhcmFtIHZhbHVlIGNoYW5naW5nIGNhbGxiYWNrXG4gKi9cbmZ1bmN0aW9uIHVzZVJlZk9mPFQgZXh0ZW5kcyBhbnlbXSwgUj4odmFsdWU6ICguLi52YWx1ZXM6IFQpID0+IFIpOiAoLi4udmFsdWVzOiBUKSA9PiBSIHtcbiAgICBjb25zdCByZWYgPSB1c2VSZWYodmFsdWUpO1xuICAgIHJlZi5jdXJyZW50ID0gdmFsdWU7XG4gICAgcmV0dXJuIHVzZUNhbGxiYWNrKCguLi52YWx1ZXM6IFQpID0+IHJlZi5jdXJyZW50KC4uLnZhbHVlcyksIFtdKTtcbn1cblxuZnVuY3Rpb24gdXNlVXNlck9uYm9hcmRpbmdDb250ZXh0VmFsdWU8VD4oZGVmYXVsdFZhbHVlOiBULCBjYWxsYmFjazogKGNsaTogTWF0cml4Q2xpZW50KSA9PiBQcm9taXNlPFQ+KTogVCB7XG4gICAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZTxUPihkZWZhdWx0VmFsdWUpO1xuICAgIGNvbnN0IGNsaSA9IHVzZU1hdHJpeENsaWVudENvbnRleHQoKTtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSB1c2VSZWZPZihjYWxsYmFjayk7XG5cbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYW5kbGU6IG51bWJlciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgZW5hYmxlZCA9IHRydWU7XG4gICAgICAgIGNvbnN0IHJlcGVhdGVyID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAgICAgaWYgKGhhbmRsZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChoYW5kbGUpO1xuICAgICAgICAgICAgICAgIGhhbmRsZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzZXRWYWx1ZShhd2FpdCBoYW5kbGVyKGNsaSkpO1xuICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICBoYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChyZXBlYXRlciwgVVNFUl9PTkJPQVJESU5HX0NPTlRFWFRfSU5URVJWQUwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXBlYXRlcigpLmNhdGNoKChlcnIpID0+IGxvZ2dlci53YXJuKFwiY291bGQgbm90IHVwZGF0ZSB1c2VyIG9uYm9hcmRpbmcgY29udGV4dFwiLCBlcnIpKTtcbiAgICAgICAgY2xpLm9uKENsaWVudEV2ZW50LkFjY291bnREYXRhLCByZXBlYXRlcik7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBlbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICBjbGkub2ZmKENsaWVudEV2ZW50LkFjY291bnREYXRhLCByZXBlYXRlcik7XG4gICAgICAgICAgICBpZiAoaGFuZGxlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhhbmRsZSk7XG4gICAgICAgICAgICAgICAgaGFuZGxlID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbY2xpLCBoYW5kbGVyLCB2YWx1ZV0pO1xuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gdXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQoKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2xpZW50ID0gdXNlTWF0cml4Q2xpZW50Q29udGV4dCgpO1xuXG4gICAgY29uc3QgW3ZhbHVlLCBzZXRWYWx1ZV0gPSB1c2VTdGF0ZTxib29sZWFuPihjbGllbnQucHVzaFJ1bGVzID8gTm90aWZpZXIuc2hvdWxkU2hvd1Byb21wdCgpIDogdHJ1ZSk7XG5cbiAgICBjb25zdCB1cGRhdGVWYWx1ZSA9IHVzZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgc2V0VmFsdWUoY2xpZW50LnB1c2hSdWxlcyA/IE5vdGlmaWVyLnNob3VsZFNob3dQcm9tcHQoKSA6IHRydWUpO1xuICAgIH0sIFtjbGllbnRdKTtcblxuICAgIHVzZUV2ZW50RW1pdHRlcihOb3RpZmllciwgTm90aWZpZXJFdmVudC5Ob3RpZmljYXRpb25IaWRkZW5DaGFuZ2UsICgpID0+IHtcbiAgICAgICAgdXBkYXRlVmFsdWUoKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNldHRpbmcgPSB1c2VTZXR0aW5nVmFsdWUoXCJub3RpZmljYXRpb25zRW5hYmxlZFwiKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICB1cGRhdGVWYWx1ZSgpO1xuICAgIH0sIFtzZXR0aW5nLCB1cGRhdGVWYWx1ZV0pO1xuXG4gICAgLy8gc2hvdWxkU2hvd1Byb21wdCBpcyBkZXBlbmRlbnQgb24gdGhlIGNsaWVudCBoYXZpbmcgcHVzaCBydWxlcy4gVGhlcmUgaXNuJ3QgYW4gZXZlbnQgZm9yIHRoZSBjbGllbnRcbiAgICAvLyBmZXRjaGluZyBpdHMgcHVzaCBydWxlcywgYnV0IHdlJ2xsIGtub3cgaXQgaGFzIHRoZW0gYnkgdGhlIHRpbWUgaXQgc3luYywgc28gd2UgdXBkYXRlIHRoaXMgb24gc3luYy5cbiAgICB1c2VUeXBlZEV2ZW50RW1pdHRlcihjbGllbnQsIENsaWVudEV2ZW50LlN5bmMsIHVwZGF0ZVZhbHVlKTtcblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dCgpOiBVc2VyT25ib2FyZGluZ0NvbnRleHQge1xuICAgIGNvbnN0IGhhc0F2YXRhciA9IHVzZVVzZXJPbmJvYXJkaW5nQ29udGV4dFZhbHVlKGZhbHNlLCBhc3luYyAoY2xpKSA9PiB7XG4gICAgICAgIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCBjbGkuZ2V0UHJvZmlsZUluZm8oY2xpLmdldFVzZXJJZCgpISk7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHByb2ZpbGU/LmF2YXRhcl91cmwpO1xuICAgIH0pO1xuICAgIGNvbnN0IGhhc0RldmljZXMgPSB1c2VVc2VyT25ib2FyZGluZ0NvbnRleHRWYWx1ZShmYWxzZSwgYXN5bmMgKGNsaSkgPT4ge1xuICAgICAgICBjb25zdCBteURldmljZSA9IGNsaS5nZXREZXZpY2VJZCgpO1xuICAgICAgICBjb25zdCBkZXZpY2VzID0gYXdhaXQgY2xpLmdldERldmljZXMoKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oZGV2aWNlcy5kZXZpY2VzLmZpbmQoKGRldmljZSkgPT4gZGV2aWNlLmRldmljZV9pZCAhPT0gbXlEZXZpY2UpKTtcbiAgICB9KTtcbiAgICBjb25zdCBoYXNEbVJvb21zID0gdXNlVXNlck9uYm9hcmRpbmdDb250ZXh0VmFsdWUoZmFsc2UsIGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgZG1Sb29tcyA9IERNUm9vbU1hcC5zaGFyZWQoKS5nZXRVbmlxdWVSb29tc1dpdGhJbmRpdmlkdWFscygpID8/IHt9O1xuICAgICAgICByZXR1cm4gQm9vbGVhbihPYmplY3Qua2V5cyhkbVJvb21zKS5sZW5ndGgpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNob3dOb3RpZmljYXRpb25zUHJvbXB0ID0gdXNlU2hvd05vdGlmaWNhdGlvbnNQcm9tcHQoKTtcblxuICAgIHJldHVybiB1c2VNZW1vKFxuICAgICAgICAoKSA9PiAoeyBoYXNBdmF0YXIsIGhhc0RldmljZXMsIGhhc0RtUm9vbXMsIHNob3dOb3RpZmljYXRpb25zUHJvbXB0IH0pLFxuICAgICAgICBbaGFzQXZhdGFyLCBoYXNEZXZpY2VzLCBoYXNEbVJvb21zLCBzaG93Tm90aWZpY2F0aW9uc1Byb21wdF0sXG4gICAgKTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUVBLElBQUFHLFNBQUEsR0FBQUgsT0FBQTtBQUNBLElBQUFJLFVBQUEsR0FBQUMsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFNLG9CQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxZQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSxnQkFBQSxHQUFBUixPQUFBO0FBaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQW1CQSxNQUFNUyxnQ0FBZ0MsR0FBRyxJQUFJOztBQUU3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsU0FBU0MsUUFBUUEsQ0FBcUJDLEtBQTBCLEVBQXVCO0VBQ25GLE1BQU1DLEdBQUcsR0FBRyxJQUFBQyxh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SixXQUFXLENBQUMsQ0FBQzs7RUFFMUI7RUFDQTtFQUNBLElBQUFNLHFDQUFvQixFQUFDVixNQUFNLEVBQUVKLG1CQUFXLENBQUNlLElBQUksRUFBRVAsV0FBVyxDQUFDO0VBRTNELE9BQU9sQyxLQUFLO0FBQ2hCO0FBRU8sU0FBUzBDLHdCQUF3QkEsQ0FBQSxFQUEwQjtFQUM5RCxNQUFNQyxTQUFTLEdBQUdyQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsTUFBT0ssR0FBRyxJQUFLO0lBQ2xFLE1BQU1pQyxPQUFPLEdBQUcsTUFBTWpDLEdBQUcsQ0FBQ2tDLGNBQWMsQ0FBQ2xDLEdBQUcsQ0FBQ21DLFNBQVMsQ0FBQyxDQUFFLENBQUM7SUFDMUQsT0FBT0MsT0FBTyxDQUFDSCxPQUFPLEVBQUVJLFVBQVUsQ0FBQztFQUN2QyxDQUFDLENBQUM7RUFDRixNQUFNQyxVQUFVLEdBQUczQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsTUFBT0ssR0FBRyxJQUFLO0lBQ25FLE1BQU11QyxRQUFRLEdBQUd2QyxHQUFHLENBQUN3QyxXQUFXLENBQUMsQ0FBQztJQUNsQyxNQUFNQyxPQUFPLEdBQUcsTUFBTXpDLEdBQUcsQ0FBQzBDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE9BQU9OLE9BQU8sQ0FBQ0ssT0FBTyxDQUFDQSxPQUFPLENBQUNFLElBQUksQ0FBRUMsTUFBTSxJQUFLQSxNQUFNLENBQUNDLFNBQVMsS0FBS04sUUFBUSxDQUFDLENBQUM7RUFDbkYsQ0FBQyxDQUFDO0VBQ0YsTUFBTU8sVUFBVSxHQUFHbkQsNkJBQTZCLENBQUMsS0FBSyxFQUFFLFlBQVk7SUFDaEUsTUFBTW9ELE9BQU8sR0FBR0Msa0JBQVMsQ0FBQ0MsTUFBTSxDQUFDLENBQUMsQ0FBQ0MsNkJBQTZCLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RSxPQUFPZCxPQUFPLENBQUNlLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDTCxPQUFPLENBQUMsQ0FBQ00sTUFBTSxDQUFDO0VBQy9DLENBQUMsQ0FBQztFQUNGLE1BQU1DLHVCQUF1QixHQUFHcEMsMEJBQTBCLENBQUMsQ0FBQztFQUU1RCxPQUFPLElBQUFxQyxjQUFPLEVBQ1YsT0FBTztJQUFFdkIsU0FBUztJQUFFTSxVQUFVO0lBQUVRLFVBQVU7SUFBRVE7RUFBd0IsQ0FBQyxDQUFDLEVBQ3RFLENBQUN0QixTQUFTLEVBQUVNLFVBQVUsRUFBRVEsVUFBVSxFQUFFUSx1QkFBdUIsQ0FDL0QsQ0FBQztBQUNMIiwiaWdub3JlTGlzdCI6W119