matrix-react-sdk
Version:
SDK for matrix.org using React
90 lines (86 loc) • 12.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LandmarkNavigation = exports.Landmark = void 0;
var _RoomContext = require("../contexts/RoomContext");
var _actions = require("../dispatcher/actions");
var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher"));
/*
* Copyright 2024 New Vector Ltd.
* Copyright 2024 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.
*/
let Landmark = exports.Landmark = /*#__PURE__*/function (Landmark) {
Landmark[Landmark["ACTIVE_SPACE_BUTTON"] = 0] = "ACTIVE_SPACE_BUTTON";
Landmark[Landmark["ROOM_SEARCH"] = 1] = "ROOM_SEARCH";
Landmark[Landmark["ROOM_LIST"] = 2] = "ROOM_LIST";
Landmark[Landmark["MESSAGE_COMPOSER_OR_HOME"] = 3] = "MESSAGE_COMPOSER_OR_HOME";
return Landmark;
}({});
const ORDERED_LANDMARKS = [Landmark.ACTIVE_SPACE_BUTTON, Landmark.ROOM_SEARCH, Landmark.ROOM_LIST, Landmark.MESSAGE_COMPOSER_OR_HOME];
/**
* The landmarks are cycled through in the following order:
* ACTIVE_SPACE_BUTTON <-> ROOM_SEARCH <-> ROOM_LIST <-> MESSAGE_COMPOSER/HOME <-> ACTIVE_SPACE_BUTTON
*/
class LandmarkNavigation {
/**
* Get the next/previous landmark that must be focused from a given landmark
* @param currentLandmark The current landmark
* @param backwards If true, the landmark before currentLandmark in ORDERED_LANDMARKS is returned
* @returns The next landmark to focus
*/
static getLandmark(currentLandmark, backwards = false) {
const currentIndex = ORDERED_LANDMARKS.findIndex(l => l === currentLandmark);
const offset = backwards ? -1 : 1;
const newLandmark = ORDERED_LANDMARKS.at((currentIndex + offset) % ORDERED_LANDMARKS.length);
return newLandmark;
}
/**
* Focus the next landmark from a given landmark.
* This method will skip over any missing landmarks.
* @param currentLandmark The current landmark
* @param backwards If true, search the next landmark to the left in ORDERED_LANDMARKS
*/
static findAndFocusNextLandmark(currentLandmark, backwards = false) {
let landmark = currentLandmark;
let element = null;
while (element === null) {
landmark = LandmarkNavigation.getLandmark(landmark, backwards);
element = landmarkToDomElementMap[landmark]();
}
element?.focus({
focusVisible: true
});
}
}
/**
* The functions return:
* - The DOM element of the landmark if it exists
* - undefined if the DOM element exists but focus is given through an action
* - null if the landmark does not exist
*/
exports.LandmarkNavigation = LandmarkNavigation;
const landmarkToDomElementMap = {
[Landmark.ACTIVE_SPACE_BUTTON]: () => document.querySelector(".mx_SpaceButton_active"),
[Landmark.ROOM_SEARCH]: () => document.querySelector(".mx_RoomSearch"),
[Landmark.ROOM_LIST]: () => document.querySelector(".mx_RoomTile_selected") || document.querySelector(".mx_RoomTile"),
[Landmark.MESSAGE_COMPOSER_OR_HOME]: () => {
const isComposerOpen = !!document.querySelector(".mx_MessageComposer");
if (isComposerOpen) {
const inThread = !!document.activeElement?.closest(".mx_ThreadView");
_dispatcher.default.dispatch({
action: _actions.Action.FocusSendMessageComposer,
context: inThread ? _RoomContext.TimelineRenderingType.Thread : _RoomContext.TimelineRenderingType.Room
}, true);
// Special case where the element does exist but we focus it through an action.
return undefined;
} else {
return document.querySelector(".mx_HomePage");
}
}
};
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfUm9vbUNvbnRleHQiLCJyZXF1aXJlIiwiX2FjdGlvbnMiLCJfZGlzcGF0Y2hlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJMYW5kbWFyayIsImV4cG9ydHMiLCJPUkRFUkVEX0xBTkRNQVJLUyIsIkFDVElWRV9TUEFDRV9CVVRUT04iLCJST09NX1NFQVJDSCIsIlJPT01fTElTVCIsIk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRSIsIkxhbmRtYXJrTmF2aWdhdGlvbiIsImdldExhbmRtYXJrIiwiY3VycmVudExhbmRtYXJrIiwiYmFja3dhcmRzIiwiY3VycmVudEluZGV4IiwiZmluZEluZGV4IiwibCIsIm9mZnNldCIsIm5ld0xhbmRtYXJrIiwiYXQiLCJsZW5ndGgiLCJmaW5kQW5kRm9jdXNOZXh0TGFuZG1hcmsiLCJsYW5kbWFyayIsImVsZW1lbnQiLCJsYW5kbWFya1RvRG9tRWxlbWVudE1hcCIsImZvY3VzIiwiZm9jdXNWaXNpYmxlIiwiZG9jdW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiaXNDb21wb3Nlck9wZW4iLCJpblRocmVhZCIsImFjdGl2ZUVsZW1lbnQiLCJjbG9zZXN0IiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIkZvY3VzU2VuZE1lc3NhZ2VDb21wb3NlciIsImNvbnRleHQiLCJUaW1lbGluZVJlbmRlcmluZ1R5cGUiLCJUaHJlYWQiLCJSb29tIiwidW5kZWZpbmVkIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FjY2Vzc2liaWxpdHkvTGFuZG1hcmtOYXZpZ2F0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbiAqIENvcHlyaWdodCAyMDI0IFRoZSBNYXRyaXgub3JnIEZvdW5kYXRpb24gQy5JLkMuXG4gKlxuICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG4gKiBQbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuICovXG5cbmltcG9ydCB7IFRpbWVsaW5lUmVuZGVyaW5nVHlwZSB9IGZyb20gXCIuLi9jb250ZXh0cy9Sb29tQ29udGV4dFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcblxuZXhwb3J0IGNvbnN0IGVudW0gTGFuZG1hcmsge1xuICAgIC8vIFRoaXMgaXMgdGhlIHNwYWNlL2hvbWUgYnV0dG9uIGluIHRoZSBsZWZ0IHBhbmVsLlxuICAgIEFDVElWRV9TUEFDRV9CVVRUT04sXG4gICAgLy8gVGhpcyBpcyB0aGUgcm9vbSBmaWx0ZXIgaW4gdGhlIGxlZnQgcGFuZWwuXG4gICAgUk9PTV9TRUFSQ0gsXG4gICAgLy8gVGhpcyBpcyB0aGUgY3VycmVudGx5IG9wZW5lZCByb29tL2ZpcnN0IHJvb20gaW4gdGhlIHJvb20gbGlzdCBpbiB0aGUgbGVmdCBwYW5lbC5cbiAgICBST09NX0xJU1QsXG4gICAgLy8gVGhpcyBpcyB0aGUgbWVzc2FnZSBjb21wb3NlciB3aXRoaW4gdGhlIHJvb20gaWYgYXZhaWxhYmxlIG9yIGl0IGlzIHRoZSB3ZWxjb21lIHNjcmVlbiBzaG93biB3aGVuIG5vIHJvb20gaXMgc2VsZWN0ZWRcbiAgICBNRVNTQUdFX0NPTVBPU0VSX09SX0hPTUUsXG59XG5cbmNvbnN0IE9SREVSRURfTEFORE1BUktTID0gW1xuICAgIExhbmRtYXJrLkFDVElWRV9TUEFDRV9CVVRUT04sXG4gICAgTGFuZG1hcmsuUk9PTV9TRUFSQ0gsXG4gICAgTGFuZG1hcmsuUk9PTV9MSVNULFxuICAgIExhbmRtYXJrLk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRSxcbl07XG5cbi8qKlxuICogVGhlIGxhbmRtYXJrcyBhcmUgY3ljbGVkIHRocm91Z2ggaW4gdGhlIGZvbGxvd2luZyBvcmRlcjpcbiAqIEFDVElWRV9TUEFDRV9CVVRUT04gPC0+IFJPT01fU0VBUkNIIDwtPiBST09NX0xJU1QgPC0+IE1FU1NBR0VfQ09NUE9TRVIvSE9NRSA8LT4gQUNUSVZFX1NQQUNFX0JVVFRPTlxuICovXG5leHBvcnQgY2xhc3MgTGFuZG1hcmtOYXZpZ2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIG5leHQvcHJldmlvdXMgbGFuZG1hcmsgdGhhdCBtdXN0IGJlIGZvY3VzZWQgZnJvbSBhIGdpdmVuIGxhbmRtYXJrXG4gICAgICogQHBhcmFtIGN1cnJlbnRMYW5kbWFyayBUaGUgY3VycmVudCBsYW5kbWFya1xuICAgICAqIEBwYXJhbSBiYWNrd2FyZHMgSWYgdHJ1ZSwgdGhlIGxhbmRtYXJrIGJlZm9yZSBjdXJyZW50TGFuZG1hcmsgaW4gT1JERVJFRF9MQU5ETUFSS1MgaXMgcmV0dXJuZWRcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV4dCBsYW5kbWFyayB0byBmb2N1c1xuICAgICAqL1xuICAgIHByaXZhdGUgc3RhdGljIGdldExhbmRtYXJrKGN1cnJlbnRMYW5kbWFyazogTGFuZG1hcmssIGJhY2t3YXJkcyA9IGZhbHNlKTogTGFuZG1hcmsge1xuICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSBPUkRFUkVEX0xBTkRNQVJLUy5maW5kSW5kZXgoKGwpID0+IGwgPT09IGN1cnJlbnRMYW5kbWFyayk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IGJhY2t3YXJkcyA/IC0xIDogMTtcbiAgICAgICAgY29uc3QgbmV3TGFuZG1hcmsgPSBPUkRFUkVEX0xBTkRNQVJLUy5hdCgoY3VycmVudEluZGV4ICsgb2Zmc2V0KSAlIE9SREVSRURfTEFORE1BUktTLmxlbmd0aCkhO1xuICAgICAgICByZXR1cm4gbmV3TGFuZG1hcms7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9jdXMgdGhlIG5leHQgbGFuZG1hcmsgZnJvbSBhIGdpdmVuIGxhbmRtYXJrLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgc2tpcCBvdmVyIGFueSBtaXNzaW5nIGxhbmRtYXJrcy5cbiAgICAgKiBAcGFyYW0gY3VycmVudExhbmRtYXJrIFRoZSBjdXJyZW50IGxhbmRtYXJrXG4gICAgICogQHBhcmFtIGJhY2t3YXJkcyBJZiB0cnVlLCBzZWFyY2ggdGhlIG5leHQgbGFuZG1hcmsgdG8gdGhlIGxlZnQgaW4gT1JERVJFRF9MQU5ETUFSS1NcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RhdGljIGZpbmRBbmRGb2N1c05leHRMYW5kbWFyayhjdXJyZW50TGFuZG1hcms6IExhbmRtYXJrLCBiYWNrd2FyZHMgPSBmYWxzZSk6IHZvaWQge1xuICAgICAgICBsZXQgbGFuZG1hcmsgPSBjdXJyZW50TGFuZG1hcms7XG4gICAgICAgIGxldCBlbGVtZW50OiBIVE1MRWxlbWVudCB8IG51bGwgfCB1bmRlZmluZWQgPSBudWxsO1xuICAgICAgICB3aGlsZSAoZWxlbWVudCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgbGFuZG1hcmsgPSBMYW5kbWFya05hdmlnYXRpb24uZ2V0TGFuZG1hcmsobGFuZG1hcmssIGJhY2t3YXJkcyk7XG4gICAgICAgICAgICBlbGVtZW50ID0gbGFuZG1hcmtUb0RvbUVsZW1lbnRNYXBbbGFuZG1hcmtdKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxlbWVudD8uZm9jdXMoeyBmb2N1c1Zpc2libGU6IHRydWUgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIFRoZSBmdW5jdGlvbnMgcmV0dXJuOlxuICogLSBUaGUgRE9NIGVsZW1lbnQgb2YgdGhlIGxhbmRtYXJrIGlmIGl0IGV4aXN0c1xuICogLSB1bmRlZmluZWQgaWYgdGhlIERPTSBlbGVtZW50IGV4aXN0cyBidXQgZm9jdXMgaXMgZ2l2ZW4gdGhyb3VnaCBhbiBhY3Rpb25cbiAqIC0gbnVsbCBpZiB0aGUgbGFuZG1hcmsgZG9lcyBub3QgZXhpc3RcbiAqL1xuY29uc3QgbGFuZG1hcmtUb0RvbUVsZW1lbnRNYXA6IFJlY29yZDxMYW5kbWFyaywgKCkgPT4gSFRNTEVsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkPiA9IHtcbiAgICBbTGFuZG1hcmsuQUNUSVZFX1NQQUNFX0JVVFRPTl06ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1NwYWNlQnV0dG9uX2FjdGl2ZVwiKSxcblxuICAgIFtMYW5kbWFyay5ST09NX1NFQVJDSF06ICgpID0+IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21TZWFyY2hcIiksXG4gICAgW0xhbmRtYXJrLlJPT01fTElTVF06ICgpID0+XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21UaWxlX3NlbGVjdGVkXCIpIHx8XG4gICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFwiLm14X1Jvb21UaWxlXCIpLFxuXG4gICAgW0xhbmRtYXJrLk1FU1NBR0VfQ09NUE9TRVJfT1JfSE9NRV06ICgpID0+IHtcbiAgICAgICAgY29uc3QgaXNDb21wb3Nlck9wZW4gPSAhIWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIubXhfTWVzc2FnZUNvbXBvc2VyXCIpO1xuICAgICAgICBpZiAoaXNDb21wb3Nlck9wZW4pIHtcbiAgICAgICAgICAgIGNvbnN0IGluVGhyZWFkID0gISFkb2N1bWVudC5hY3RpdmVFbGVtZW50Py5jbG9zZXN0KFwiLm14X1RocmVhZFZpZXdcIik7XG4gICAgICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaChcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLkZvY3VzU2VuZE1lc3NhZ2VDb21wb3NlcixcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogaW5UaHJlYWQgPyBUaW1lbGluZVJlbmRlcmluZ1R5cGUuVGhyZWFkIDogVGltZWxpbmVSZW5kZXJpbmdUeXBlLlJvb20sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vIFNwZWNpYWwgY2FzZSB3aGVyZSB0aGUgZWxlbWVudCBkb2VzIGV4aXN0IGJ1dCB3ZSBmb2N1cyBpdCB0aHJvdWdoIGFuIGFjdGlvbi5cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MRWxlbWVudD4oXCIubXhfSG9tZVBhZ2VcIik7XG4gICAgICAgIH1cbiAgICB9LFxufTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLFlBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLFFBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFdBQUEsR0FBQUMsc0JBQUEsQ0FBQUgsT0FBQTtBQVZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBTkEsSUFZa0JJLFFBQVEsR0FBQUMsT0FBQSxDQUFBRCxRQUFBLDBCQUFSQSxRQUFRO0VBQVJBLFFBQVEsQ0FBUkEsUUFBUTtFQUFSQSxRQUFRLENBQVJBLFFBQVE7RUFBUkEsUUFBUSxDQUFSQSxRQUFRO0VBQVJBLFFBQVEsQ0FBUkEsUUFBUTtFQUFBLE9BQVJBLFFBQVE7QUFBQTtBQVcxQixNQUFNRSxpQkFBaUIsR0FBRyxDQUN0QkYsUUFBUSxDQUFDRyxtQkFBbUIsRUFDNUJILFFBQVEsQ0FBQ0ksV0FBVyxFQUNwQkosUUFBUSxDQUFDSyxTQUFTLEVBQ2xCTCxRQUFRLENBQUNNLHdCQUF3QixDQUNwQzs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1DLGtCQUFrQixDQUFDO0VBQzVCO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNJLE9BQWVDLFdBQVdBLENBQUNDLGVBQXlCLEVBQUVDLFNBQVMsR0FBRyxLQUFLLEVBQVk7SUFDL0UsTUFBTUMsWUFBWSxHQUFHVCxpQkFBaUIsQ0FBQ1UsU0FBUyxDQUFFQyxDQUFDLElBQUtBLENBQUMsS0FBS0osZUFBZSxDQUFDO0lBQzlFLE1BQU1LLE1BQU0sR0FBR0osU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUM7SUFDakMsTUFBTUssV0FBVyxHQUFHYixpQkFBaUIsQ0FBQ2MsRUFBRSxDQUFDLENBQUNMLFlBQVksR0FBR0csTUFBTSxJQUFJWixpQkFBaUIsQ0FBQ2UsTUFBTSxDQUFFO0lBQzdGLE9BQU9GLFdBQVc7RUFDdEI7O0VBRUE7QUFDSjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0VBQ0ksT0FBY0csd0JBQXdCQSxDQUFDVCxlQUF5QixFQUFFQyxTQUFTLEdBQUcsS0FBSyxFQUFRO0lBQ3ZGLElBQUlTLFFBQVEsR0FBR1YsZUFBZTtJQUM5QixJQUFJVyxPQUF1QyxHQUFHLElBQUk7SUFDbEQsT0FBT0EsT0FBTyxLQUFLLElBQUksRUFBRTtNQUNyQkQsUUFBUSxHQUFHWixrQkFBa0IsQ0FBQ0MsV0FBVyxDQUFDVyxRQUFRLEVBQUVULFNBQVMsQ0FBQztNQUM5RFUsT0FBTyxHQUFHQyx1QkFBdUIsQ0FBQ0YsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUNqRDtJQUNBQyxPQUFPLEVBQUVFLEtBQUssQ0FBQztNQUFFQyxZQUFZLEVBQUU7SUFBSyxDQUFDLENBQUM7RUFDMUM7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFMQXRCLE9BQUEsQ0FBQU0sa0JBQUEsR0FBQUEsa0JBQUE7QUFNQSxNQUFNYyx1QkFBK0UsR0FBRztFQUNwRixDQUFDckIsUUFBUSxDQUFDRyxtQkFBbUIsR0FBRyxNQUFNcUIsUUFBUSxDQUFDQyxhQUFhLENBQWMsd0JBQXdCLENBQUM7RUFFbkcsQ0FBQ3pCLFFBQVEsQ0FBQ0ksV0FBVyxHQUFHLE1BQU1vQixRQUFRLENBQUNDLGFBQWEsQ0FBYyxnQkFBZ0IsQ0FBQztFQUNuRixDQUFDekIsUUFBUSxDQUFDSyxTQUFTLEdBQUcsTUFDbEJtQixRQUFRLENBQUNDLGFBQWEsQ0FBYyx1QkFBdUIsQ0FBQyxJQUM1REQsUUFBUSxDQUFDQyxhQUFhLENBQWMsY0FBYyxDQUFDO0VBRXZELENBQUN6QixRQUFRLENBQUNNLHdCQUF3QixHQUFHLE1BQU07SUFDdkMsTUFBTW9CLGNBQWMsR0FBRyxDQUFDLENBQUNGLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLHFCQUFxQixDQUFDO0lBQ3RFLElBQUlDLGNBQWMsRUFBRTtNQUNoQixNQUFNQyxRQUFRLEdBQUcsQ0FBQyxDQUFDSCxRQUFRLENBQUNJLGFBQWEsRUFBRUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDO01BQ3BFQyxtQkFBaUIsQ0FBQ0MsUUFBUSxDQUN0QjtRQUNJQyxNQUFNLEVBQUVDLGVBQU0sQ0FBQ0Msd0JBQXdCO1FBQ3ZDQyxPQUFPLEVBQUVSLFFBQVEsR0FBR1Msa0NBQXFCLENBQUNDLE1BQU0sR0FBR0Qsa0NBQXFCLENBQUNFO01BQzdFLENBQUMsRUFDRCxJQUNKLENBQUM7TUFDRDtNQUNBLE9BQU9DLFNBQVM7SUFDcEIsQ0FBQyxNQUFNO01BQ0gsT0FBT2YsUUFBUSxDQUFDQyxhQUFhLENBQWMsY0FBYyxDQUFDO0lBQzlEO0VBQ0o7QUFDSixDQUFDIiwiaWdub3JlTGlzdCI6W119