matrix-react-sdk
Version:
SDK for matrix.org using React
123 lines (119 loc) • 17.9 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _reactTransitionGroup = require("react-transition-group");
var _BreadcrumbsStore = require("../../../stores/BreadcrumbsStore");
var _DecoratedRoomAvatar = _interopRequireDefault(require("../avatars/DecoratedRoomAvatar"));
var _languageHandler = require("../../../languageHandler");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _AsyncStore = require("../../../stores/AsyncStore");
var _RovingTabIndex = require("../../../accessibility/RovingTabIndex");
var _Toolbar = _interopRequireDefault(require("../../../accessibility/Toolbar"));
var _actions = require("../../../dispatcher/actions");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 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 RoomBreadcrumbTile = ({
room,
onClick
}) => {
const [onFocus, isActive, ref] = (0, _RovingTabIndex.useRovingTabIndex)();
return /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_RoomBreadcrumbs_crumb",
onClick: onClick,
"aria-label": (0, _languageHandler._t)("a11y|room_name", {
name: room.name
}),
title: room.name,
onFocus: onFocus,
ref: ref,
tabIndex: isActive ? 0 : -1,
placement: "right"
}, /*#__PURE__*/_react.default.createElement(_DecoratedRoomAvatar.default, {
room: room,
size: "32px",
displayBadge: true,
hideIfDot: true,
tooltipProps: {
tabIndex: isActive ? 0 : -1
}
}));
};
class RoomBreadcrumbs extends _react.default.PureComponent {
constructor(props) {
super(props);
(0, _defineProperty2.default)(this, "isMounted", true);
(0, _defineProperty2.default)(this, "onBreadcrumbsUpdate", () => {
if (!this.isMounted) return;
// We need to trick the CSSTransition component into updating, which means we need to
// tell it to not animate, then to animate a moment later. This causes two updates
// which means two renders. The skipFirst change is so that our don't-animate state
// doesn't show the breadcrumb we're about to reveal as it causes a visual jump/jerk.
// The second update, on the next available tick, causes the "enter" animation to start
// again and this time we want to show the newest breadcrumb because it'll be hidden
// off screen for the animation.
this.setState({
doAnimation: false,
skipFirst: true
});
window.setTimeout(() => this.setState({
doAnimation: true,
skipFirst: false
}), 0);
});
(0, _defineProperty2.default)(this, "viewRoom", (room, index, viaKeyboard = false) => {
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: room.roomId,
metricsTrigger: "WebHorizontalBreadcrumbs",
metricsViaKeyboard: viaKeyboard
});
});
this.state = {
doAnimation: true,
// technically we want animation on mount, but it won't be perfect
skipFirst: false // render the thing, as boring as it is
};
_BreadcrumbsStore.BreadcrumbsStore.instance.on(_AsyncStore.UPDATE_EVENT, this.onBreadcrumbsUpdate);
}
componentWillUnmount() {
this.isMounted = false;
_BreadcrumbsStore.BreadcrumbsStore.instance.off(_AsyncStore.UPDATE_EVENT, this.onBreadcrumbsUpdate);
}
render() {
const tiles = _BreadcrumbsStore.BreadcrumbsStore.instance.rooms.map((r, i) => /*#__PURE__*/_react.default.createElement(RoomBreadcrumbTile, {
key: r.roomId,
room: r,
onClick: ev => this.viewRoom(r, i, ev.type !== "click")
}));
if (tiles.length > 0) {
// NOTE: The CSSTransition timeout MUST match the timeout in our CSS!
return /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, {
appear: true,
in: this.state.doAnimation,
timeout: 640,
classNames: "mx_RoomBreadcrumbs"
}, /*#__PURE__*/_react.default.createElement(_Toolbar.default, {
className: "mx_RoomBreadcrumbs",
"aria-label": (0, _languageHandler._t)("room_list|breadcrumbs_label")
}, tiles.slice(this.state.skipFirst ? 1 : 0)));
} else {
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomBreadcrumbs"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomBreadcrumbs_placeholder"
}, (0, _languageHandler._t)("room_list|breadcrumbs_empty")));
}
}
}
exports.default = RoomBreadcrumbs;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9yZWFjdFRyYW5zaXRpb25Hcm91cCIsIl9CcmVhZGNydW1ic1N0b3JlIiwiX0RlY29yYXRlZFJvb21BdmF0YXIiLCJfbGFuZ3VhZ2VIYW5kbGVyIiwiX2Rpc3BhdGNoZXIiLCJfQXN5bmNTdG9yZSIsIl9Sb3ZpbmdUYWJJbmRleCIsIl9Ub29sYmFyIiwiX2FjdGlvbnMiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIlJvb21CcmVhZGNydW1iVGlsZSIsInJvb20iLCJvbkNsaWNrIiwib25Gb2N1cyIsImlzQWN0aXZlIiwicmVmIiwidXNlUm92aW5nVGFiSW5kZXgiLCJkZWZhdWx0IiwiY3JlYXRlRWxlbWVudCIsImNsYXNzTmFtZSIsIl90IiwibmFtZSIsInRpdGxlIiwidGFiSW5kZXgiLCJwbGFjZW1lbnQiLCJzaXplIiwiZGlzcGxheUJhZGdlIiwiaGlkZUlmRG90IiwidG9vbHRpcFByb3BzIiwiUm9vbUJyZWFkY3J1bWJzIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJpc01vdW50ZWQiLCJzZXRTdGF0ZSIsImRvQW5pbWF0aW9uIiwic2tpcEZpcnN0Iiwid2luZG93Iiwic2V0VGltZW91dCIsImluZGV4IiwidmlhS2V5Ym9hcmQiLCJkZWZhdWx0RGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1Jvb20iLCJyb29tX2lkIiwicm9vbUlkIiwibWV0cmljc1RyaWdnZXIiLCJtZXRyaWNzVmlhS2V5Ym9hcmQiLCJzdGF0ZSIsIkJyZWFkY3J1bWJzU3RvcmUiLCJpbnN0YW5jZSIsIm9uIiwiVVBEQVRFX0VWRU5UIiwib25CcmVhZGNydW1ic1VwZGF0ZSIsImNvbXBvbmVudFdpbGxVbm1vdW50Iiwib2ZmIiwicmVuZGVyIiwidGlsZXMiLCJyb29tcyIsIm1hcCIsInIiLCJpIiwia2V5IiwiZXYiLCJ2aWV3Um9vbSIsInR5cGUiLCJsZW5ndGgiLCJDU1NUcmFuc2l0aW9uIiwiYXBwZWFyIiwiaW4iLCJ0aW1lb3V0IiwiY2xhc3NOYW1lcyIsInNsaWNlIiwiZXhwb3J0cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL3Jvb21zL1Jvb21CcmVhZGNydW1icy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IENTU1RyYW5zaXRpb24gfSBmcm9tIFwicmVhY3QtdHJhbnNpdGlvbi1ncm91cFwiO1xuXG5pbXBvcnQgeyBCcmVhZGNydW1ic1N0b3JlIH0gZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9CcmVhZGNydW1ic1N0b3JlXCI7XG5pbXBvcnQgRGVjb3JhdGVkUm9vbUF2YXRhciBmcm9tIFwiLi4vYXZhdGFycy9EZWNvcmF0ZWRSb29tQXZhdGFyXCI7XG5pbXBvcnQgeyBfdCB9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBVUERBVEVfRVZFTlQgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL0FzeW5jU3RvcmVcIjtcbmltcG9ydCB7IHVzZVJvdmluZ1RhYkluZGV4IH0gZnJvbSBcIi4uLy4uLy4uL2FjY2Vzc2liaWxpdHkvUm92aW5nVGFiSW5kZXhcIjtcbmltcG9ydCBUb29sYmFyIGZyb20gXCIuLi8uLi8uLi9hY2Nlc3NpYmlsaXR5L1Rvb2xiYXJcIjtcbmltcG9ydCB7IEFjdGlvbiB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQnV0dG9uRXZlbnQgfSBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuXG5pbnRlcmZhY2UgSVByb3BzIHt9XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIC8vIEJvdGggb2YgdGhlc2UgY29udHJvbCB0aGUgYW5pbWF0aW9uIGZvciB0aGUgYnJlYWRjcnVtYnMuIEZvciBkZXRhaWxzIG9uIHRoZVxuICAgIC8vIGFjdHVhbCBhbmltYXRpb24sIHNlZSB0aGUgQ1NTLlxuICAgIC8vXG4gICAgLy8gZG9BbmltYXRpb24gaXMgdG8gbGllIHRvIHRoZSBDU1NUcmFuc2l0aW9uIGNvbXBvbmVudCAoc2VlIG9uQnJlYWRjcnVtYnNVcGRhdGVcbiAgICAvLyBmb3IgaW5mbykuIHNraXBGaXJzdCBpcyB1c2VkIHRvIHRyeSBhbmQgcmVkdWNlIGplcmt5IGFuaW1hdGlvbiAtIGFsc28gc2VlIHRoZVxuICAgIC8vIGJyZWFkY3J1bWIgdXBkYXRlIGZ1bmN0aW9uIGZvciBpbmZvIG9uIHRoYXQuXG4gICAgZG9BbmltYXRpb246IGJvb2xlYW47XG4gICAgc2tpcEZpcnN0OiBib29sZWFuO1xufVxuXG5jb25zdCBSb29tQnJlYWRjcnVtYlRpbGU6IFJlYWN0LkZDPHsgcm9vbTogUm9vbTsgb25DbGljazogKGV2OiBCdXR0b25FdmVudCkgPT4gdm9pZCB9PiA9ICh7IHJvb20sIG9uQ2xpY2sgfSkgPT4ge1xuICAgIGNvbnN0IFtvbkZvY3VzLCBpc0FjdGl2ZSwgcmVmXSA9IHVzZVJvdmluZ1RhYkluZGV4KCk7XG5cbiAgICByZXR1cm4gKFxuICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfUm9vbUJyZWFkY3J1bWJzX2NydW1iXCJcbiAgICAgICAgICAgIG9uQ2xpY2s9e29uQ2xpY2t9XG4gICAgICAgICAgICBhcmlhLWxhYmVsPXtfdChcImExMXl8cm9vbV9uYW1lXCIsIHsgbmFtZTogcm9vbS5uYW1lIH0pfVxuICAgICAgICAgICAgdGl0bGU9e3Jvb20ubmFtZX1cbiAgICAgICAgICAgIG9uRm9jdXM9e29uRm9jdXN9XG4gICAgICAgICAgICByZWY9e3JlZn1cbiAgICAgICAgICAgIHRhYkluZGV4PXtpc0FjdGl2ZSA/IDAgOiAtMX1cbiAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPERlY29yYXRlZFJvb21BdmF0YXJcbiAgICAgICAgICAgICAgICByb29tPXtyb29tfVxuICAgICAgICAgICAgICAgIHNpemU9XCIzMnB4XCJcbiAgICAgICAgICAgICAgICBkaXNwbGF5QmFkZ2U9e3RydWV9XG4gICAgICAgICAgICAgICAgaGlkZUlmRG90PXt0cnVlfVxuICAgICAgICAgICAgICAgIHRvb2x0aXBQcm9wcz17eyB0YWJJbmRleDogaXNBY3RpdmUgPyAwIDogLTEgfX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICApO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbUJyZWFkY3J1bWJzIGV4dGVuZHMgUmVhY3QuUHVyZUNvbXBvbmVudDxJUHJvcHMsIElTdGF0ZT4ge1xuICAgIHByaXZhdGUgaXNNb3VudGVkID0gdHJ1ZTtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgZG9BbmltYXRpb246IHRydWUsIC8vIHRlY2huaWNhbGx5IHdlIHdhbnQgYW5pbWF0aW9uIG9uIG1vdW50LCBidXQgaXQgd29uJ3QgYmUgcGVyZmVjdFxuICAgICAgICAgICAgc2tpcEZpcnN0OiBmYWxzZSwgLy8gcmVuZGVyIHRoZSB0aGluZywgYXMgYm9yaW5nIGFzIGl0IGlzXG4gICAgICAgIH07XG5cbiAgICAgICAgQnJlYWRjcnVtYnNTdG9yZS5pbnN0YW5jZS5vbihVUERBVEVfRVZFTlQsIHRoaXMub25CcmVhZGNydW1ic1VwZGF0ZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzTW91bnRlZCA9IGZhbHNlO1xuICAgICAgICBCcmVhZGNydW1ic1N0b3JlLmluc3RhbmNlLm9mZihVUERBVEVfRVZFTlQsIHRoaXMub25CcmVhZGNydW1ic1VwZGF0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkJyZWFkY3J1bWJzVXBkYXRlID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuaXNNb3VudGVkKSByZXR1cm47XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byB0cmljayB0aGUgQ1NTVHJhbnNpdGlvbiBjb21wb25lbnQgaW50byB1cGRhdGluZywgd2hpY2ggbWVhbnMgd2UgbmVlZCB0b1xuICAgICAgICAvLyB0ZWxsIGl0IHRvIG5vdCBhbmltYXRlLCB0aGVuIHRvIGFuaW1hdGUgYSBtb21lbnQgbGF0ZXIuIFRoaXMgY2F1c2VzIHR3byB1cGRhdGVzXG4gICAgICAgIC8vIHdoaWNoIG1lYW5zIHR3byByZW5kZXJzLiBUaGUgc2tpcEZpcnN0IGNoYW5nZSBpcyBzbyB0aGF0IG91ciBkb24ndC1hbmltYXRlIHN0YXRlXG4gICAgICAgIC8vIGRvZXNuJ3Qgc2hvdyB0aGUgYnJlYWRjcnVtYiB3ZSdyZSBhYm91dCB0byByZXZlYWwgYXMgaXQgY2F1c2VzIGEgdmlzdWFsIGp1bXAvamVyay5cbiAgICAgICAgLy8gVGhlIHNlY29uZCB1cGRhdGUsIG9uIHRoZSBuZXh0IGF2YWlsYWJsZSB0aWNrLCBjYXVzZXMgdGhlIFwiZW50ZXJcIiBhbmltYXRpb24gdG8gc3RhcnRcbiAgICAgICAgLy8gYWdhaW4gYW5kIHRoaXMgdGltZSB3ZSB3YW50IHRvIHNob3cgdGhlIG5ld2VzdCBicmVhZGNydW1iIGJlY2F1c2UgaXQnbGwgYmUgaGlkZGVuXG4gICAgICAgIC8vIG9mZiBzY3JlZW4gZm9yIHRoZSBhbmltYXRpb24uXG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBkb0FuaW1hdGlvbjogZmFsc2UsIHNraXBGaXJzdDogdHJ1ZSB9KTtcbiAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5zZXRTdGF0ZSh7IGRvQW5pbWF0aW9uOiB0cnVlLCBza2lwRmlyc3Q6IGZhbHNlIH0pLCAwKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSB2aWV3Um9vbSA9IChyb29tOiBSb29tLCBpbmRleDogbnVtYmVyLCB2aWFLZXlib2FyZCA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgYWN0aW9uOiBBY3Rpb24uVmlld1Jvb20sXG4gICAgICAgICAgICByb29tX2lkOiByb29tLnJvb21JZCxcbiAgICAgICAgICAgIG1ldHJpY3NUcmlnZ2VyOiBcIldlYkhvcml6b250YWxCcmVhZGNydW1ic1wiLFxuICAgICAgICAgICAgbWV0cmljc1ZpYUtleWJvYXJkOiB2aWFLZXlib2FyZCxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZW5kZXIoKTogUmVhY3QuUmVhY3RFbGVtZW50IHtcbiAgICAgICAgY29uc3QgdGlsZXMgPSBCcmVhZGNydW1ic1N0b3JlLmluc3RhbmNlLnJvb21zLm1hcCgociwgaSkgPT4gKFxuICAgICAgICAgICAgPFJvb21CcmVhZGNydW1iVGlsZVxuICAgICAgICAgICAgICAgIGtleT17ci5yb29tSWR9XG4gICAgICAgICAgICAgICAgcm9vbT17cn1cbiAgICAgICAgICAgICAgICBvbkNsaWNrPXsoZXY6IEJ1dHRvbkV2ZW50KSA9PiB0aGlzLnZpZXdSb29tKHIsIGksIGV2LnR5cGUgIT09IFwiY2xpY2tcIil9XG4gICAgICAgICAgICAvPlxuICAgICAgICApKTtcblxuICAgICAgICBpZiAodGlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgLy8gTk9URTogVGhlIENTU1RyYW5zaXRpb24gdGltZW91dCBNVVNUIG1hdGNoIHRoZSB0aW1lb3V0IGluIG91ciBDU1MhXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIDxDU1NUcmFuc2l0aW9uIGFwcGVhcj17dHJ1ZX0gaW49e3RoaXMuc3RhdGUuZG9BbmltYXRpb259IHRpbWVvdXQ9ezY0MH0gY2xhc3NOYW1lcz1cIm14X1Jvb21CcmVhZGNydW1ic1wiPlxuICAgICAgICAgICAgICAgICAgICA8VG9vbGJhciBjbGFzc05hbWU9XCJteF9Sb29tQnJlYWRjcnVtYnNcIiBhcmlhLWxhYmVsPXtfdChcInJvb21fbGlzdHxicmVhZGNydW1ic19sYWJlbFwiKX0+XG4gICAgICAgICAgICAgICAgICAgICAgICB7dGlsZXMuc2xpY2UodGhpcy5zdGF0ZS5za2lwRmlyc3QgPyAxIDogMCl9XG4gICAgICAgICAgICAgICAgICAgIDwvVG9vbGJhcj5cbiAgICAgICAgICAgICAgICA8L0NTU1RyYW5zaXRpb24+XG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Jvb21CcmVhZGNydW1ic1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Jvb21CcmVhZGNydW1ic19wbGFjZWhvbGRlclwiPntfdChcInJvb21fbGlzdHxicmVhZGNydW1ic19lbXB0eVwiKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBRUEsSUFBQUMscUJBQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLGlCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxvQkFBQSxHQUFBSixzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUksZ0JBQUEsR0FBQUosT0FBQTtBQUNBLElBQUFLLFdBQUEsR0FBQU4sc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFNLFdBQUEsR0FBQU4sT0FBQTtBQUNBLElBQUFPLGVBQUEsR0FBQVAsT0FBQTtBQUNBLElBQUFRLFFBQUEsR0FBQVQsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFTLFFBQUEsR0FBQVQsT0FBQTtBQUVBLElBQUFVLGlCQUFBLEdBQUFYLHNCQUFBLENBQUFDLE9BQUE7QUFyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBOEJBLE1BQU1XLGtCQUFnRixHQUFHQSxDQUFDO0VBQUVDLElBQUk7RUFBRUM7QUFBUSxDQUFDLEtBQUs7RUFDNUcsTUFBTSxDQUFDQyxPQUFPLEVBQUVDLFFBQVEsRUFBRUMsR0FBRyxDQUFDLEdBQUcsSUFBQUMsaUNBQWlCLEVBQUMsQ0FBQztFQUVwRCxvQkFDSW5CLE1BQUEsQ0FBQW9CLE9BQUEsQ0FBQUMsYUFBQSxDQUFDVCxpQkFBQSxDQUFBUSxPQUFnQjtJQUNiRSxTQUFTLEVBQUMsMEJBQTBCO0lBQ3BDUCxPQUFPLEVBQUVBLE9BQVE7SUFDakIsY0FBWSxJQUFBUSxtQkFBRSxFQUFDLGdCQUFnQixFQUFFO01BQUVDLElBQUksRUFBRVYsSUFBSSxDQUFDVTtJQUFLLENBQUMsQ0FBRTtJQUN0REMsS0FBSyxFQUFFWCxJQUFJLENBQUNVLElBQUs7SUFDakJSLE9BQU8sRUFB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