UNPKG

matrix-react-sdk

Version:
99 lines (92 loc) 16.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.VoiceRecordingStore = void 0; var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _matrix = require("matrix-js-sdk/src/matrix"); var _AsyncStoreWithClient = require("./AsyncStoreWithClient"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _VoiceMessageRecording = require("../audio/VoiceMessageRecording"); function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } /* Copyright 2024 New Vector Ltd. Copyright 2021, 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 SEPARATOR = "|"; class VoiceRecordingStore extends _AsyncStoreWithClient.AsyncStoreWithClient { constructor() { super(_dispatcher.default, {}); } static get instance() { if (!this.internalInstance) { this.internalInstance = new VoiceRecordingStore(); this.internalInstance.start(); } return this.internalInstance; } async onAction(payload) { // Nothing to do, but we're required to override the function return; } static getVoiceRecordingId(room, relation) { if (relation?.rel_type === "io.element.thread" || relation?.rel_type === _matrix.RelationType.Thread) { return room.roomId + SEPARATOR + relation.event_id; } else { return room.roomId; } } /** * Gets the active recording instance, if any. * @param {string} voiceRecordingId The room ID (with optionally the thread ID if in one) to get the recording in. * @returns {Optional<VoiceRecording>} The recording, if any. */ getActiveRecording(voiceRecordingId) { return this.state[voiceRecordingId]; } /** * Starts a new recording if one isn't already in progress. Note that this simply * creates a recording instance - whether or not recording is actively in progress * can be seen via the VoiceRecording class. * @param {string} voiceRecordingId The room ID (with optionally the thread ID if in one) to start recording in. * @returns {VoiceRecording} The recording. */ startRecording(voiceRecordingId) { if (!this.matrixClient) throw new Error("Cannot start a recording without a MatrixClient"); if (!voiceRecordingId) throw new Error("Recording must be associated with a room"); if (this.state[voiceRecordingId]) throw new Error("A recording is already in progress"); const recording = (0, _VoiceMessageRecording.createVoiceMessageRecording)(this.matrixClient); // noinspection JSIgnoredPromiseFromCall - we can safely run this async this.updateState(_objectSpread(_objectSpread({}, this.state), {}, { [voiceRecordingId]: recording })); return recording; } /** * Disposes of the current recording, no matter the state of it. * @param {string} voiceRecordingId The room ID (with optionally the thread ID if in one) to dispose of the recording in. * @returns {Promise<void>} Resolves when complete. */ disposeRecording(voiceRecordingId) { this.state[voiceRecordingId]?.destroy(); // stops internally const _this$state = this.state, { // eslint-disable-next-line @typescript-eslint/no-unused-vars [voiceRecordingId]: _toDelete } = _this$state, newState = (0, _objectWithoutProperties2.default)(_this$state, [voiceRecordingId].map(_toPropertyKey)); // unexpectedly AsyncStore.updateState merges state // AsyncStore.reset actually just *sets* return this.reset(newState); } } exports.VoiceRecordingStore = VoiceRecordingStore; (0, _defineProperty2.default)(VoiceRecordingStore, "internalInstance", void 0); window.mxVoiceRecordingStore = VoiceRecordingStore.instance; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9Bc3luY1N0b3JlV2l0aENsaWVudCIsIl9kaXNwYXRjaGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9Wb2ljZU1lc3NhZ2VSZWNvcmRpbmciLCJfdG9Qcm9wZXJ0eUtleSIsInQiLCJpIiwiX3RvUHJpbWl0aXZlIiwiciIsImUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsImNhbGwiLCJUeXBlRXJyb3IiLCJTdHJpbmciLCJOdW1iZXIiLCJvd25LZXlzIiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJTRVBBUkFUT1IiLCJWb2ljZVJlY29yZGluZ1N0b3JlIiwiQXN5bmNTdG9yZVdpdGhDbGllbnQiLCJjb25zdHJ1Y3RvciIsImRlZmF1bHREaXNwYXRjaGVyIiwiaW5zdGFuY2UiLCJpbnRlcm5hbEluc3RhbmNlIiwic3RhcnQiLCJvbkFjdGlvbiIsInBheWxvYWQiLCJnZXRWb2ljZVJlY29yZGluZ0lkIiwicm9vbSIsInJlbGF0aW9uIiwicmVsX3R5cGUiLCJSZWxhdGlvblR5cGUiLCJUaHJlYWQiLCJyb29tSWQiLCJldmVudF9pZCIsImdldEFjdGl2ZVJlY29yZGluZyIsInZvaWNlUmVjb3JkaW5nSWQiLCJzdGF0ZSIsInN0YXJ0UmVjb3JkaW5nIiwibWF0cml4Q2xpZW50IiwiRXJyb3IiLCJyZWNvcmRpbmciLCJjcmVhdGVWb2ljZU1lc3NhZ2VSZWNvcmRpbmciLCJ1cGRhdGVTdGF0ZSIsImRpc3Bvc2VSZWNvcmRpbmciLCJkZXN0cm95IiwiX3RoaXMkc3RhdGUiLCJfdG9EZWxldGUiLCJuZXdTdGF0ZSIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJtYXAiLCJyZXNldCIsImV4cG9ydHMiLCJ3aW5kb3ciLCJteFZvaWNlUmVjb3JkaW5nU3RvcmUiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcmVzL1ZvaWNlUmVjb3JkaW5nU3RvcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjEsIDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgT3B0aW9uYWwgfSBmcm9tIFwibWF0cml4LWV2ZW50cy1zZGtcIjtcbmltcG9ydCB7IFJvb20sIElFdmVudFJlbGF0aW9uLCBSZWxhdGlvblR5cGUgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IEFzeW5jU3RvcmVXaXRoQ2xpZW50IH0gZnJvbSBcIi4vQXN5bmNTdG9yZVdpdGhDbGllbnRcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBBY3Rpb25QYXlsb2FkIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvcGF5bG9hZHNcIjtcbmltcG9ydCB7IGNyZWF0ZVZvaWNlTWVzc2FnZVJlY29yZGluZywgVm9pY2VNZXNzYWdlUmVjb3JkaW5nIH0gZnJvbSBcIi4uL2F1ZGlvL1ZvaWNlTWVzc2FnZVJlY29yZGluZ1wiO1xuXG5jb25zdCBTRVBBUkFUT1IgPSBcInxcIjtcblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgW3ZvaWNlUmVjb3JkaW5nSWQ6IHN0cmluZ106IE9wdGlvbmFsPFZvaWNlTWVzc2FnZVJlY29yZGluZz47XG59XG5cbmV4cG9ydCBjbGFzcyBWb2ljZVJlY29yZGluZ1N0b3JlIGV4dGVuZHMgQXN5bmNTdG9yZVdpdGhDbGllbnQ8SVN0YXRlPiB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJuYWxJbnN0YW5jZTogVm9pY2VSZWNvcmRpbmdTdG9yZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoZGVmYXVsdERpc3BhdGNoZXIsIHt9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc3RhdGljIGdldCBpbnN0YW5jZSgpOiBWb2ljZVJlY29yZGluZ1N0b3JlIHtcbiAgICAgICAgaWYgKCF0aGlzLmludGVybmFsSW5zdGFuY2UpIHtcbiAgICAgICAgICAgIHRoaXMuaW50ZXJuYWxJbnN0YW5jZSA9IG5ldyBWb2ljZVJlY29yZGluZ1N0b3JlKCk7XG4gICAgICAgICAgICB0aGlzLmludGVybmFsSW5zdGFuY2Uuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbEluc3RhbmNlO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBvbkFjdGlvbihwYXlsb2FkOiBBY3Rpb25QYXlsb2FkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIC8vIE5vdGhpbmcgdG8gZG8sIGJ1dCB3ZSdyZSByZXF1aXJlZCB0byBvdmVycmlkZSB0aGUgZnVuY3Rpb25cbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0Vm9pY2VSZWNvcmRpbmdJZChyb29tOiBSb29tLCByZWxhdGlvbj86IElFdmVudFJlbGF0aW9uKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKHJlbGF0aW9uPy5yZWxfdHlwZSA9PT0gXCJpby5lbGVtZW50LnRocmVhZFwiIHx8IHJlbGF0aW9uPy5yZWxfdHlwZSA9PT0gUmVsYXRpb25UeXBlLlRocmVhZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvb20ucm9vbUlkICsgU0VQQVJBVE9SICsgcmVsYXRpb24uZXZlbnRfaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcm9vbS5yb29tSWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXRzIHRoZSBhY3RpdmUgcmVjb3JkaW5nIGluc3RhbmNlLCBpZiBhbnkuXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IHZvaWNlUmVjb3JkaW5nSWQgVGhlIHJvb20gSUQgKHdpdGggb3B0aW9uYWxseSB0aGUgdGhyZWFkIElEIGlmIGluIG9uZSkgdG8gZ2V0IHRoZSByZWNvcmRpbmcgaW4uXG4gICAgICogQHJldHVybnMge09wdGlvbmFsPFZvaWNlUmVjb3JkaW5nPn0gVGhlIHJlY29yZGluZywgaWYgYW55LlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBY3RpdmVSZWNvcmRpbmcodm9pY2VSZWNvcmRpbmdJZDogc3RyaW5nKTogT3B0aW9uYWw8Vm9pY2VNZXNzYWdlUmVjb3JkaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlW3ZvaWNlUmVjb3JkaW5nSWRdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXJ0cyBhIG5ldyByZWNvcmRpbmcgaWYgb25lIGlzbid0IGFscmVhZHkgaW4gcHJvZ3Jlc3MuIE5vdGUgdGhhdCB0aGlzIHNpbXBseVxuICAgICAqIGNyZWF0ZXMgYSByZWNvcmRpbmcgaW5zdGFuY2UgLSB3aGV0aGVyIG9yIG5vdCByZWNvcmRpbmcgaXMgYWN0aXZlbHkgaW4gcHJvZ3Jlc3NcbiAgICAgKiBjYW4gYmUgc2VlbiB2aWEgdGhlIFZvaWNlUmVjb3JkaW5nIGNsYXNzLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2b2ljZVJlY29yZGluZ0lkIFRoZSByb29tIElEICh3aXRoIG9wdGlvbmFsbHkgdGhlIHRocmVhZCBJRCBpZiBpbiBvbmUpIHRvIHN0YXJ0IHJlY29yZGluZyBpbi5cbiAgICAgKiBAcmV0dXJucyB7Vm9pY2VSZWNvcmRpbmd9IFRoZSByZWNvcmRpbmcuXG4gICAgICovXG4gICAgcHVibGljIHN0YXJ0UmVjb3JkaW5nKHZvaWNlUmVjb3JkaW5nSWQ/OiBzdHJpbmcpOiBWb2ljZU1lc3NhZ2VSZWNvcmRpbmcge1xuICAgICAgICBpZiAoIXRoaXMubWF0cml4Q2xpZW50KSB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3Qgc3RhcnQgYSByZWNvcmRpbmcgd2l0aG91dCBhIE1hdHJpeENsaWVudFwiKTtcbiAgICAgICAgaWYgKCF2b2ljZVJlY29yZGluZ0lkKSB0aHJvdyBuZXcgRXJyb3IoXCJSZWNvcmRpbmcgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYSByb29tXCIpO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZVt2b2ljZVJlY29yZGluZ0lkXSkgdGhyb3cgbmV3IEVycm9yKFwiQSByZWNvcmRpbmcgaXMgYWxyZWFkeSBpbiBwcm9ncmVzc1wiKTtcblxuICAgICAgICBjb25zdCByZWNvcmRpbmcgPSBjcmVhdGVWb2ljZU1lc3NhZ2VSZWNvcmRpbmcodGhpcy5tYXRyaXhDbGllbnQpO1xuXG4gICAgICAgIC8vIG5vaW5zcGVjdGlvbiBKU0lnbm9yZWRQcm9taXNlRnJvbUNhbGwgLSB3ZSBjYW4gc2FmZWx5IHJ1biB0aGlzIGFzeW5jXG4gICAgICAgIHRoaXMudXBkYXRlU3RhdGUoeyAuLi50aGlzLnN0YXRlLCBbdm9pY2VSZWNvcmRpbmdJZF06IHJlY29yZGluZyB9KTtcblxuICAgICAgICByZXR1cm4gcmVjb3JkaW5nO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERpc3Bvc2VzIG9mIHRoZSBjdXJyZW50IHJlY29yZGluZywgbm8gbWF0dGVyIHRoZSBzdGF0ZSBvZiBpdC5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdm9pY2VSZWNvcmRpbmdJZCBUaGUgcm9vbSBJRCAod2l0aCBvcHRpb25hbGx5IHRoZSB0aHJlYWQgSUQgaWYgaW4gb25lKSB0byBkaXNwb3NlIG9mIHRoZSByZWNvcmRpbmcgaW4uXG4gICAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVzIHdoZW4gY29tcGxldGUuXG4gICAgICovXG4gICAgcHVibGljIGRpc3Bvc2VSZWNvcmRpbmcodm9pY2VSZWNvcmRpbmdJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRoaXMuc3RhdGVbdm9pY2VSZWNvcmRpbmdJZF0/LmRlc3Ryb3koKTsgLy8gc3RvcHMgaW50ZXJuYWxseVxuXG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICAgICAgICAgIFt2b2ljZVJlY29yZGluZ0lkXTogX3RvRGVsZXRlLFxuICAgICAgICAgICAgLi4ubmV3U3RhdGVcbiAgICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIC8vIHVuZXhwZWN0ZWRseSBBc3luY1N0b3JlLnVwZGF0ZVN0YXRlIG1lcmdlcyBzdGF0ZVxuICAgICAgICAvLyBBc3luY1N0b3JlLnJlc2V0IGFjdHVhbGx5IGp1c3QgKnNldHMqXG4gICAgICAgIHJldHVybiB0aGlzLnJlc2V0KG5ld1N0YXRlKTtcbiAgICB9XG59XG5cbndpbmRvdy5teFZvaWNlUmVjb3JkaW5nU3RvcmUgPSBWb2ljZVJlY29yZGluZ1N0b3JlLmluc3RhbmNlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFTQSxJQUFBQSxPQUFBLEdBQUFDLE9BQUE7QUFFQSxJQUFBQyxxQkFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsV0FBQSxHQUFBQyxzQkFBQSxDQUFBSCxPQUFBO0FBRUEsSUFBQUksc0JBQUEsR0FBQUosT0FBQTtBQUFvRyxTQUFBSyxlQUFBQyxDQUFBLFFBQUFDLENBQUEsR0FBQUMsWUFBQSxDQUFBRixDQUFBLHVDQUFBQyxDQUFBLEdBQUFBLENBQUEsR0FBQUEsQ0FBQTtBQUFBLFNBQUFDLGFBQUFGLENBQUEsRUFB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V0Usa0JBQWtCQSxDQUFDQyxnQkFBd0IsRUFBbUM7SUFDakYsT0FBTyxJQUFJLENBQUNDLEtBQUssQ0FBQ0QsZ0JBQWdCLENBQUM7RUFDdkM7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDV0UsY0FBY0EsQ0FBQ0YsZ0JBQXlCLEVBQXlCO0lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUNHLFlBQVksRUFBRSxNQUFNLElBQUlDLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztJQUMxRixJQUFJLENBQUNKLGdCQUFnQixFQUFFLE1BQU0sSUFBSUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDO0lBQ2xGLElBQUksSUFBSSxDQUFDSCxLQUFLLENBQUNELGdCQUFnQixDQUFDLEVBQUUsTUFBTSxJQUFJSSxLQUFLLENBQUMsb0NBQW9DLENBQUM7SUFFdkYsTUFBTUMsU0FBUyxHQUFHLElBQUFDLGtEQUEyQixFQUFDLElBQUksQ0FBQ0gsWUFBWSxDQUFDOztJQUVoRTtJQUNBLElBQUksQ0FBQ0ksV0FBVyxDQUFBbkMsYUFBQSxDQUFBQSxhQUFBLEtBQU0sSUFBSSxDQUFDNkIsS0FBSztNQUFFLENBQUNELGdCQUFnQixHQUFHSztJQUFTLEVBQUUsQ0FBQztJQUVsRSxPQUFPQSxTQUFTO0VBQ3BCOztFQUVBO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7RUFDV0csZ0JBQWdCQSxDQUFDUixnQkFBd0IsRUFBaUI7SUFDN0QsSUFBSSxDQUFDQyxLQUFLLENBQUNELGdCQUFnQixDQUFDLEVBQUVTLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQzs7SUFFekMsTUFBQUMsV0FBQSxHQUlJLElBQUksQ0FBQ1QsS0FBSztNQUpSO1FBQ0Y7UUFDQSxDQUFDRCxnQkFBZ0IsR0FBR1c7TUFFeEIsQ0FBQyxHQUFBRCxXQUFBO01BRE1FLFFBQVEsT0FBQUMseUJBQUEsQ0FBQXBDLE9BQUEsRUFBQWlDLFdBQUEsR0FEVlYsZ0JBQWdCLEVBQUFjLEdBQUEsQ0FBQWhFLGNBQUE7SUFHckI7SUFDQTtJQUNBLE9BQU8sSUFBSSxDQUFDaUUsS0FBSyxDQUFDSCxRQUFRLENBQUM7RUFDL0I7QUFDSjtBQUFDSSxPQUFBLENBQUFsQyxtQkFBQSxHQUFBQSxtQkFBQTtBQUFBLElBQUFOLGdCQUFBLENBQUFDLE9BQUEsRUExRVlLLG1CQUFtQjtBQTRFaENtQyxNQUFNLENBQUNDLHFCQUFxQixHQUFHcEMsbUJBQW1CLENBQUNJLFFBQVEiLCJpZ25vcmVMaXN0IjpbXX0=