matrix-react-sdk
Version:
SDK for matrix.org using React
211 lines (207 loc) • 35.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
exports.getUnsentMessages = getUnsentMessages;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _warningTriangle = require("../../../res/img/feather-customised/warning-triangle.svg");
var _languageHandler = require("../../languageHandler");
var _Resend = _interopRequireDefault(require("../../Resend"));
var _dispatcher = _interopRequireDefault(require("../../dispatcher/dispatcher"));
var _ErrorUtils = require("../../utils/ErrorUtils");
var _actions = require("../../dispatcher/actions");
var _StaticNotificationState = require("../../stores/notifications/StaticNotificationState");
var _AccessibleButton = _interopRequireDefault(require("../views/elements/AccessibleButton"));
var _InlineSpinner = _interopRequireDefault(require("../views/elements/InlineSpinner"));
var _MatrixClientContext = _interopRequireDefault(require("../../contexts/MatrixClientContext"));
var _RoomStatusBarUnsentMessages = require("./RoomStatusBarUnsentMessages");
var _ExternalLink = _interopRequireDefault(require("../views/elements/ExternalLink"));
/*
Copyright 2024 New Vector Ltd.
Copyright 2015-2021 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 STATUS_BAR_HIDDEN = 0;
const STATUS_BAR_EXPANDED = 1;
const STATUS_BAR_EXPANDED_LARGE = 2;
function getUnsentMessages(room, threadId) {
if (!room) {
return [];
}
return room.getPendingEvents().filter(function (ev) {
const isNotSent = ev.status === _matrix.EventStatus.NOT_SENT;
const belongsToTheThread = threadId === ev.threadRootId;
return isNotSent && (!threadId || belongsToTheThread);
});
}
class RoomStatusBar extends _react.default.PureComponent {
constructor(props, context) {
super(props, context);
(0, _defineProperty2.default)(this, "unmounted", false);
(0, _defineProperty2.default)(this, "onSyncStateChange", (state, prevState, data) => {
if (state === "SYNCING" && prevState === "SYNCING") {
return;
}
if (this.unmounted) return;
this.setState({
syncState: state,
syncStateData: data ?? null
});
});
(0, _defineProperty2.default)(this, "onResendAllClick", () => {
_Resend.default.resendUnsentEvents(this.props.room).then(() => {
this.setState({
isResending: false
});
});
this.setState({
isResending: true
});
_dispatcher.default.fire(_actions.Action.FocusSendMessageComposer);
});
(0, _defineProperty2.default)(this, "onCancelAllClick", () => {
_Resend.default.cancelUnsentEvents(this.props.room);
_dispatcher.default.fire(_actions.Action.FocusSendMessageComposer);
});
(0, _defineProperty2.default)(this, "onRoomLocalEchoUpdated", (ev, room) => {
if (room.roomId !== this.props.room.roomId) return;
const messages = getUnsentMessages(this.props.room);
this.setState({
unsentMessages: messages,
isResending: messages.length > 0 && this.state.isResending
});
});
this.state = {
syncState: this.context.getSyncState(),
syncStateData: this.context.getSyncStateData(),
unsentMessages: getUnsentMessages(this.props.room),
isResending: false
};
}
componentDidMount() {
const client = this.context;
client.on(_matrix.ClientEvent.Sync, this.onSyncStateChange);
client.on(_matrix.RoomEvent.LocalEchoUpdated, this.onRoomLocalEchoUpdated);
this.checkSize();
}
componentDidUpdate() {
this.checkSize();
}
componentWillUnmount() {
this.unmounted = true;
// we may have entirely lost our client as we're logging out before clicking login on the guest bar...
const client = this.context;
if (client) {
client.removeListener(_matrix.ClientEvent.Sync, this.onSyncStateChange);
client.removeListener(_matrix.RoomEvent.LocalEchoUpdated, this.onRoomLocalEchoUpdated);
}
}
// Check whether current size is greater than 0, if yes call props.onVisible
checkSize() {
if (this.getSize()) {
if (this.props.onVisible) this.props.onVisible();
} else {
if (this.props.onHidden) this.props.onHidden();
}
}
// We don't need the actual height - just whether it is likely to have
// changed - so we use '0' to indicate normal size, and other values to
// indicate other sizes.
getSize() {
if (this.shouldShowConnectionError()) {
return STATUS_BAR_EXPANDED;
} else if (this.state.unsentMessages.length > 0 || this.state.isResending) {
return STATUS_BAR_EXPANDED_LARGE;
}
return STATUS_BAR_HIDDEN;
}
shouldShowConnectionError() {
// no conn bar trumps the "some not sent" msg since you can't resend without
// a connection!
// There's one situation in which we don't show this 'no connection' bar, and that's
// if it's a resource limit exceeded error: those are shown in the top bar.
const errorIsMauError = Boolean(this.state.syncStateData && this.state.syncStateData.error && this.state.syncStateData.error.name === "M_RESOURCE_LIMIT_EXCEEDED");
return this.state.syncState === "ERROR" && !errorIsMauError;
}
getUnsentMessageContent() {
const unsentMessages = this.state.unsentMessages;
let title;
let consentError = null;
let resourceLimitError = null;
for (const m of unsentMessages) {
if (m.error && m.error.errcode === "M_CONSENT_NOT_GIVEN") {
consentError = m.error;
break;
} else if (m.error && m.error.errcode === "M_RESOURCE_LIMIT_EXCEEDED") {
resourceLimitError = m.error;
break;
}
}
if (consentError) {
title = (0, _languageHandler._t)("room|status_bar|requires_consent_agreement", {}, {
consentLink: sub => /*#__PURE__*/_react.default.createElement(_ExternalLink.default, {
href: consentError.data?.consent_uri,
target: "_blank",
rel: "noreferrer noopener"
}, sub)
});
} else if (resourceLimitError) {
title = (0, _ErrorUtils.messageForResourceLimitError)(resourceLimitError.data.limit_type, resourceLimitError.data.admin_contact, {
"monthly_active_user": (0, _languageHandler._td)("room|status_bar|monthly_user_limit_reached"),
"hs_disabled": (0, _languageHandler._td)("room|status_bar|homeserver_blocked"),
"": (0, _languageHandler._td)("room|status_bar|exceeded_resource_limit")
});
} else {
title = (0, _languageHandler._t)("room|status_bar|some_messages_not_sent");
}
let buttonRow = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onCancelAllClick,
className: "mx_RoomStatusBar_unsentCancelAllBtn"
}, (0, _languageHandler._t)("room|status_bar|delete_all")), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onResendAllClick,
className: "mx_RoomStatusBar_unsentRetry"
}, (0, _languageHandler._t)("room|status_bar|retry_all")));
if (this.state.isResending) {
buttonRow = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_InlineSpinner.default, {
w: 20,
h: 20
}), /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("forward|sending")));
}
return /*#__PURE__*/_react.default.createElement(_RoomStatusBarUnsentMessages.RoomStatusBarUnsentMessages, {
title: title,
description: (0, _languageHandler._t)("room|status_bar|select_messages_to_retry"),
notificationState: _StaticNotificationState.StaticNotificationState.RED_EXCLAMATION,
buttons: buttonRow
});
}
render() {
if (this.shouldShowConnectionError()) {
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomStatusBar"
}, /*#__PURE__*/_react.default.createElement("div", {
role: "alert"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomStatusBar_connectionLostBar"
}, /*#__PURE__*/_react.default.createElement(_warningTriangle.Icon, {
width: "24px",
height: "24px"
}), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomStatusBar_connectionLostBar_title"
}, (0, _languageHandler._t)("room|status_bar|server_connectivity_lost_title")), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_RoomStatusBar_connectionLostBar_desc"
}, (0, _languageHandler._t)("room|status_bar|server_connectivity_lost_description"))))));
}
if (this.state.unsentMessages.length > 0 || this.state.isResending) {
return this.getUnsentMessageContent();
}
return null;
}
}
exports.default = RoomStatusBar;
(0, _defineProperty2.default)(RoomStatusBar, "contextType", _MatrixClientContext.default);
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfd2FybmluZ1RyaWFuZ2xlIiwiX2xhbmd1YWdlSGFuZGxlciIsIl9SZXNlbmQiLCJfZGlzcGF0Y2hlciIsIl9FcnJvclV0aWxzIiwiX2FjdGlvbnMiLCJfU3RhdGljTm90aWZpY2F0aW9uU3RhdGUiLCJfQWNjZXNzaWJsZUJ1dHRvbiIsIl9JbmxpbmVTcGlubmVyIiwiX01hdHJpeENsaWVudENvbnRleHQiLCJfUm9vbVN0YXR1c0JhclVuc2VudE1lc3NhZ2VzIiwiX0V4dGVybmFsTGluayIsIlNUQVRVU19CQVJfSElEREVOIiwiU1RBVFVTX0JBUl9FWFBBTkRFRCIsIlNUQVRVU19CQVJfRVhQQU5ERURfTEFSR0UiLCJnZXRVbnNlbnRNZXNzYWdlcyIsInJvb20iLCJ0aHJlYWRJZCIsImdldFBlbmRpbmdFdmVudHMiLCJmaWx0ZXIiLCJldiIsImlzTm90U2VudCIsInN0YXR1cyIsIkV2ZW50U3RhdHVzIiwiTk9UX1NFTlQiLCJiZWxvbmdzVG9UaGVUaHJlYWQiLCJ0aHJlYWRSb290SWQiLCJSb29tU3RhdHVzQmFyIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImNvbnRleHQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsInN0YXRlIiwicHJldlN0YXRlIiwiZGF0YSIsInVubW91bnRlZCIsInNldFN0YXRlIiwic3luY1N0YXRlIiwic3luY1N0YXRlRGF0YSIsIlJlc2VuZCIsInJlc2VuZFVuc2VudEV2ZW50cyIsInRoZW4iLCJpc1Jlc2VuZGluZyIsImRpcyIsImZpcmUiLCJBY3Rpb24iLCJGb2N1c1NlbmRNZXNzYWdlQ29tcG9zZXIiLCJjYW5jZWxVbnNlbnRFdmVudHMiLCJyb29tSWQiLCJtZXNzYWdlcyIsInVuc2VudE1lc3NhZ2VzIiwibGVuZ3RoIiwiZ2V0U3luY1N0YXRlIiwiZ2V0U3luY1N0YXRlRGF0YSIsImNvbXBvbmVudERpZE1vdW50IiwiY2xpZW50Iiwib24iLCJDbGllbnRFdmVudCIsIlN5bmMiLCJvblN5bmNTdGF0ZUNoYW5nZSIsIlJvb21FdmVudCIsIkxvY2FsRWNob1VwZGF0ZWQiLCJvblJvb21Mb2NhbEVjaG9VcGRhdGVkIiwiY2hlY2tTaXplIiwiY29tcG9uZW50RGlkVXBkYXRlIiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJyZW1vdmVMaXN0ZW5lciIsImdldFNpemUiLCJvblZpc2libGUiLCJvbkhpZGRlbiIsInNob3VsZFNob3dDb25uZWN0aW9uRXJyb3IiLCJlcnJvcklzTWF1RXJyb3IiLCJCb29sZWFuIiwiZXJyb3IiLCJuYW1lIiwiZ2V0VW5zZW50TWVzc2FnZUNvbnRlbnQiLCJ0aXRsZSIsImNvbnNlbnRFcnJvciIsInJlc291cmNlTGltaXRFcnJvciIsIm0iLCJlcnJjb2RlIiwiX3QiLCJjb25zZW50TGluayIsInN1YiIsImNyZWF0ZUVsZW1lbnQiLCJocmVmIiwiY29uc2VudF91cmkiLCJ0YXJnZXQiLCJyZWwiLCJtZXNzYWdlRm9yUmVzb3VyY2VMaW1pdEVycm9yIiwibGltaXRfdHlwZSIsImFkbWluX2NvbnRhY3QiLCJfdGQiLCJidXR0b25Sb3ciLCJGcmFnbWVudCIsIm9uQ2xpY2siLCJvbkNhbmNlbEFsbENsaWNrIiwiY2xhc3NOYW1lIiwib25SZXNlbmRBbGxDbGljayIsInciLCJoIiwiUm9vbVN0YXR1c0JhclVuc2VudE1lc3NhZ2VzIiwiZGVzY3JpcHRpb24iLCJub3RpZmljYXRpb25TdGF0ZSIsIlN0YXRpY05vdGlmaWNhdGlvblN0YXRlIiwiUkVEX0VYQ0xBTUFUSU9OIiwiYnV0dG9ucyIsInJlbmRlciIsInJvbGUiLCJJY29uIiwid2lkdGgiLCJoZWlnaHQiLCJleHBvcnRzIiwiTWF0cml4Q2xpZW50Q29udGV4dCJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3N0cnVjdHVyZXMvUm9vbVN0YXR1c0Jhci50c3giXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMTUtMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgUmVhY3ROb2RlIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQge1xuICAgIENsaWVudEV2ZW50LFxuICAgIEV2ZW50U3RhdHVzLFxuICAgIE1hdHJpeEVycm9yLFxuICAgIE1hdHJpeEV2ZW50LFxuICAgIFJvb20sXG4gICAgUm9vbUV2ZW50LFxuICAgIFN5bmNTdGF0ZSxcbiAgICBTeW5jU3RhdGVEYXRhLFxufSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbWF0cml4XCI7XG5cbmltcG9ydCB7IEljb24gYXMgV2FybmluZ0ljb24gfSBmcm9tIFwiLi4vLi4vLi4vcmVzL2ltZy9mZWF0aGVyLWN1c3RvbWlzZWQvd2FybmluZy10cmlhbmdsZS5zdmdcIjtcbmltcG9ydCB7IF90LCBfdGQgfSBmcm9tIFwiLi4vLi4vbGFuZ3VhZ2VIYW5kbGVyXCI7XG5pbXBvcnQgUmVzZW5kIGZyb20gXCIuLi8uLi9SZXNlbmRcIjtcbmltcG9ydCBkaXMgZnJvbSBcIi4uLy4uL2Rpc3BhdGNoZXIvZGlzcGF0Y2hlclwiO1xuaW1wb3J0IHsgbWVzc2FnZUZvclJlc291cmNlTGltaXRFcnJvciB9IGZyb20gXCIuLi8uLi91dGlscy9FcnJvclV0aWxzXCI7XG5pbXBvcnQgeyBBY3Rpb24gfSBmcm9tIFwiLi4vLi4vZGlzcGF0Y2hlci9hY3Rpb25zXCI7XG5pbXBvcnQgeyBTdGF0aWNOb3RpZmljYXRpb25TdGF0ZSB9IGZyb20gXCIuLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9TdGF0aWNOb3RpZmljYXRpb25TdGF0ZVwiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24gZnJvbSBcIi4uL3ZpZXdzL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBJbmxpbmVTcGlubmVyIGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9JbmxpbmVTcGlubmVyXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHsgUm9vbVN0YXR1c0JhclVuc2VudE1lc3NhZ2VzIH0gZnJvbSBcIi4vUm9vbVN0YXR1c0JhclVuc2VudE1lc3NhZ2VzXCI7XG5pbXBvcnQgRXh0ZXJuYWxMaW5rIGZyb20gXCIuLi92aWV3cy9lbGVtZW50cy9FeHRlcm5hbExpbmtcIjtcblxuY29uc3QgU1RBVFVTX0JBUl9ISURERU4gPSAwO1xuY29uc3QgU1RBVFVTX0JBUl9FWFBBTkRFRCA9IDE7XG5jb25zdCBTVEFUVVNfQkFSX0VYUEFOREVEX0xBUkdFID0gMjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuc2VudE1lc3NhZ2VzKHJvb206IFJvb20sIHRocmVhZElkPzogc3RyaW5nKTogTWF0cml4RXZlbnRbXSB7XG4gICAgaWYgKCFyb29tKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHJvb20uZ2V0UGVuZGluZ0V2ZW50cygpLmZpbHRlcihmdW5jdGlvbiAoZXYpIHtcbiAgICAgICAgY29uc3QgaXNOb3RTZW50ID0gZXYuc3RhdHVzID09PSBFdmVudFN0YXR1cy5OT1RfU0VOVDtcbiAgICAgICAgY29uc3QgYmVsb25nc1RvVGhlVGhyZWFkID0gdGhyZWFkSWQgPT09IGV2LnRocmVhZFJvb3RJZDtcbiAgICAgICAgcmV0dXJuIGlzTm90U2VudCAmJiAoIXRocmVhZElkIHx8IGJlbG9uZ3NUb1RoZVRocmVhZCk7XG4gICAgfSk7XG59XG5cbmludGVyZmFjZSBJUHJvcHMge1xuICAgIC8vIHRoZSByb29tIHRoaXMgc3RhdHVzYmFyIGlzIHJlcHJlc2VudGluZy5cbiAgICByb29tOiBSb29tO1xuXG4gICAgLy8gdHJ1ZSBpZiB0aGUgcm9vbSBpcyBiZWluZyBwZWVrZWQgYXQuIFRoaXMgYWZmZWN0cyBjb21wb25lbnRzIHRoYXQgc2hvdWxkbid0XG4gICAgLy8gbG9naWNhbGx5IGJlIHNob3duIHdoZW4gcGVla2luZywgc3VjaCBhcyBhIHByb21wdCB0byBpbnZpdGUgcGVvcGxlIHRvIGEgcm9vbS5cbiAgICBpc1BlZWtpbmc/OiBib29sZWFuO1xuICAgIC8vIGNhbGxiYWNrIGZvciB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgJ3Jlc2VuZCBhbGwnIGJ1dHRvbiBpbiB0aGVcbiAgICAvLyAndW5zZW50IG1lc3NhZ2VzJyBiYXJcbiAgICBvblJlc2VuZEFsbENsaWNrPzogKCkgPT4gdm9pZDtcblxuICAgIC8vIGNhbGxiYWNrIGZvciB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgJ2NhbmNlbCBhbGwnIGJ1dHRvbiBpbiB0aGVcbiAgICAvLyAndW5zZW50IG1lc3NhZ2VzJyBiYXJcbiAgICBvbkNhbmNlbEFsbENsaWNrPzogKCkgPT4gdm9pZDtcblxuICAgIC8vIGNhbGxiYWNrIGZvciB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgJ2ludml0ZSBvdGhlcnMnIGJ1dHRvbiBpbiB0aGVcbiAgICAvLyAneW91IGFyZSBhbG9uZScgYmFyXG4gICAgb25JbnZpdGVDbGljaz86ICgpID0+IHZvaWQ7XG5cbiAgICAvLyBjYWxsYmFjayBmb3Igd2hlbiB3ZSBkbyBzb21ldGhpbmcgdGhhdCBjaGFuZ2VzIHRoZSBzaXplIG9mIHRoZVxuICAgIC8vIHN0YXR1cyBiYXIuIFRoaXMgaXMgdXNlZCB0byB0cmlnZ2VyIGEgcmUtbGF5b3V0IGluIHRoZSBwYXJlbnRcbiAgICAvLyBjb21wb25lbnQuXG4gICAgb25SZXNpemU/OiAoKSA9PiB2b2lkO1xuXG4gICAgLy8gY2FsbGJhY2sgZm9yIHdoZW4gdGhlIHN0YXR1cyBiYXIgY2FuIGJlIGhpZGRlbiBmcm9tIHZpZXcsIGFzIGl0IGlzXG4gICAgLy8gbm90IGRpc3BsYXlpbmcgYW55dGhpbmdcbiAgICBvbkhpZGRlbj86ICgpID0+IHZvaWQ7XG5cbiAgICAvLyBjYWxsYmFjayBmb3Igd2hlbiB0aGUgc3RhdHVzIGJhciBpcyBkaXNwbGF5aW5nIHNvbWV0aGluZyBhbmQgc2hvdWxkXG4gICAgLy8gYmUgdmlzaWJsZVxuICAgIG9uVmlzaWJsZT86ICgpID0+IHZvaWQ7XG59XG5cbmludGVyZmFjZSBJU3RhdGUge1xuICAgIHN5bmNTdGF0ZTogU3luY1N0YXRlIHwgbnVsbDtcbiAgICBzeW5jU3RhdGVEYXRhOiBTeW5jU3RhdGVEYXRhIHwgbnVsbDtcbiAgICB1bnNlbnRNZXNzYWdlczogTWF0cml4RXZlbnRbXTtcbiAgICBpc1Jlc2VuZGluZzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUm9vbVN0YXR1c0JhciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIHVubW91bnRlZCA9IGZhbHNlO1xuICAgIHB1YmxpYyBzdGF0aWMgY29udGV4dFR5cGUgPSBNYXRyaXhDbGllbnRDb250ZXh0O1xuICAgIHB1YmxpYyBkZWNsYXJlIGNvbnRleHQ6IFJlYWN0LkNvbnRleHRUeXBlPHR5cGVvZiBNYXRyaXhDbGllbnRDb250ZXh0PjtcblxuICAgIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzLCBjb250ZXh0OiBSZWFjdC5Db250ZXh0VHlwZTx0eXBlb2YgTWF0cml4Q2xpZW50Q29udGV4dD4pIHtcbiAgICAgICAgc3VwZXIocHJvcHMsIGNvbnRleHQpO1xuXG4gICAgICAgIHRoaXMuc3RhdGUgPSB7XG4gICAgICAgICAgICBzeW5jU3RhdGU6IHRoaXMuY29udGV4dC5nZXRTeW5jU3RhdGUoKSxcbiAgICAgICAgICAgIHN5bmNTdGF0ZURhdGE6IHRoaXMuY29udGV4dC5nZXRTeW5jU3RhdGVEYXRhKCksXG4gICAgICAgICAgICB1bnNlbnRNZXNzYWdlczogZ2V0VW5zZW50TWVzc2FnZXModGhpcy5wcm9wcy5yb29tKSxcbiAgICAgICAgICAgIGlzUmVzZW5kaW5nOiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkTW91bnQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY29udGV4dDtcbiAgICAgICAgY2xpZW50Lm9uKENsaWVudEV2ZW50LlN5bmMsIHRoaXMub25TeW5jU3RhdGVDaGFuZ2UpO1xuICAgICAgICBjbGllbnQub24oUm9vbUV2ZW50LkxvY2FsRWNob1VwZGF0ZWQsIHRoaXMub25Sb29tTG9jYWxFY2hvVXBkYXRlZCk7XG5cbiAgICAgICAgdGhpcy5jaGVja1NpemUoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcG9uZW50RGlkVXBkYXRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmNoZWNrU2l6ZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb21wb25lbnRXaWxsVW5tb3VudCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51bm1vdW50ZWQgPSB0cnVlO1xuICAgICAgICAvLyB3ZSBtYXkgaGF2ZSBlbnRpcmVseSBsb3N0IG91ciBjbGllbnQgYXMgd2UncmUgbG9nZ2luZyBvdXQgYmVmb3JlIGNsaWNraW5nIGxvZ2luIG9uIHRoZSBndWVzdCBiYXIuLi5cbiAgICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jb250ZXh0O1xuICAgICAgICBpZiAoY2xpZW50KSB7XG4gICAgICAgICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoQ2xpZW50RXZlbnQuU3luYywgdGhpcy5vblN5bmNTdGF0ZUNoYW5nZSk7XG4gICAgICAgICAgICBjbGllbnQucmVtb3ZlTGlzdGVuZXIoUm9vbUV2ZW50LkxvY2FsRWNob1VwZGF0ZWQsIHRoaXMub25Sb29tTG9jYWxFY2hvVXBkYXRlZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3luY1N0YXRlQ2hhbmdlID0gKHN0YXRlOiBTeW5jU3RhdGUsIHByZXZTdGF0ZTogU3luY1N0YXRlIHwgbnVsbCwgZGF0YT86IFN5bmNTdGF0ZURhdGEpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHN0YXRlID09PSBcIlNZTkNJTkdcIiAmJiBwcmV2U3RhdGUgPT09IFwiU1lOQ0lOR1wiKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudW5tb3VudGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgc3luY1N0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIHN5bmNTdGF0ZURhdGE6IGRhdGEgPz8gbnVsbCxcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25SZXNlbmRBbGxDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgUmVzZW5kLnJlc2VuZFVuc2VudEV2ZW50cyh0aGlzLnByb3BzLnJvb20pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7IGlzUmVzZW5kaW5nOiBmYWxzZSB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoeyBpc1Jlc2VuZGluZzogdHJ1ZSB9KTtcbiAgICAgICAgZGlzLmZpcmUoQWN0aW9uLkZvY3VzU2VuZE1lc3NhZ2VDb21wb3Nlcik7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25DYW5jZWxBbGxDbGljayA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgUmVzZW5kLmNhbmNlbFVuc2VudEV2ZW50cyh0aGlzLnByb3BzLnJvb20pO1xuICAgICAgICBkaXMuZmlyZShBY3Rpb24uRm9jdXNTZW5kTWVzc2FnZUNvbXBvc2VyKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBvblJvb21Mb2NhbEVjaG9VcGRhdGVkID0gKGV2OiBNYXRyaXhFdmVudCwgcm9vbTogUm9vbSk6IHZvaWQgPT4ge1xuICAgICAgICBpZiAocm9vbS5yb29tSWQgIT09IHRoaXMucHJvcHMucm9vbS5yb29tSWQpIHJldHVybjtcbiAgICAgICAgY29uc3QgbWVzc2FnZXMgPSBnZXRVbnNlbnRNZXNzYWdlcyh0aGlzLnByb3BzLnJvb20pO1xuICAgICAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgICAgICAgIHVuc2VudE1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgICAgICAgIGlzUmVzZW5kaW5nOiBtZXNzYWdlcy5sZW5ndGggPiAwICYmIHRoaXMuc3RhdGUuaXNSZXNlbmRpbmcsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAvLyBDaGVjayB3aGV0aGVyIGN1cnJlbnQgc2l6ZSBpcyBncmVhdGVyIHRoYW4gMCwgaWYgeWVzIGNhbGwgcHJvcHMub25WaXNpYmxlXG4gICAgcHJpdmF0ZSBjaGVja1NpemUoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmdldFNpemUoKSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMub25WaXNpYmxlKSB0aGlzLnByb3BzLm9uVmlzaWJsZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMub25IaWRkZW4pIHRoaXMucHJvcHMub25IaWRkZW4oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIGFjdHVhbCBoZWlnaHQgLSBqdXN0IHdoZXRoZXIgaXQgaXMgbGlrZWx5IHRvIGhhdmVcbiAgICAvLyBjaGFuZ2VkIC0gc28gd2UgdXNlICcwJyB0byBpbmRpY2F0ZSBub3JtYWwgc2l6ZSwgYW5kIG90aGVyIHZhbHVlcyB0b1xuICAgIC8vIGluZGljYXRlIG90aGVyIHNpemVzLlxuICAgIHByaXZhdGUgZ2V0U2l6ZSgpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRTaG93Q29ubmVjdGlvbkVycm9yKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBTVEFUVVNfQkFSX0VYUEFOREVEO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUudW5zZW50TWVzc2FnZXMubGVuZ3RoID4gMCB8fCB0aGlzLnN0YXRlLmlzUmVzZW5kaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RBVFVTX0JBUl9FWFBBTkRFRF9MQVJHRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU1RBVFVTX0JBUl9ISURERU47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzaG91bGRTaG93Q29ubmVjdGlvbkVycm9yKCk6IGJvb2xlYW4ge1xuICAgICAgICAvLyBubyBjb25uIGJhciB0cnVtcHMgdGhlIFwic29tZSBub3Qgc2VudFwiIG1zZyBzaW5jZSB5b3UgY2FuJ3QgcmVzZW5kIHdpdGhvdXRcbiAgICAgICAgLy8gYSBjb25uZWN0aW9uIVxuICAgICAgICAvLyBUaGVyZSdzIG9uZSBzaXR1YXRpb24gaW4gd2hpY2ggd2UgZG9uJ3Qgc2hvdyB0aGlzICdubyBjb25uZWN0aW9uJyBiYXIsIGFuZCB0aGF0J3NcbiAgICAgICAgLy8gaWYgaXQncyBhIHJlc291cmNlIGxpbWl0IGV4Y2VlZGVkIGVycm9yOiB0aG9zZSBhcmUgc2hvd24gaW4gdGhlIHRvcCBiYXIuXG4gICAgICAgIGNvbnN0IGVycm9ySXNNYXVFcnJvciA9IEJvb2xlYW4oXG4gICAgICAgICAgICB0aGlzLnN0YXRlLnN5bmNTdGF0ZURhdGEgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN5bmNTdGF0ZURhdGEuZXJyb3IgJiZcbiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlLnN5bmNTdGF0ZURhdGEuZXJyb3IubmFtZSA9PT0gXCJNX1JFU09VUkNFX0xJTUlUX0VYQ0VFREVEXCIsXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN5bmNTdGF0ZSA9PT0gXCJFUlJPUlwiICYmICFlcnJvcklzTWF1RXJyb3I7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRVbnNlbnRNZXNzYWdlQ29udGVudCgpOiBKU1guRWxlbWVudCB7XG4gICAgICAgIGNvbnN0IHVuc2VudE1lc3NhZ2VzID0gdGhpcy5zdGF0ZS51bnNlbnRNZXNzYWdlcztcblxuICAgICAgICBsZXQgdGl0bGU6IFJlYWN0Tm9kZTtcblxuICAgICAgICBsZXQgY29uc2VudEVycm9yOiBNYXRyaXhFcnJvciB8IG51bGwgPSBudWxsO1xuICAgICAgICBsZXQgcmVzb3VyY2VMaW1pdEVycm9yOiBNYXRyaXhFcnJvciB8IG51bGwgPSBudWxsO1xuICAgICAgICBmb3IgKGNvbnN0IG0gb2YgdW5zZW50TWVzc2FnZXMpIHtcbiAgICAgICAgICAgIGlmIChtLmVycm9yICYmIG0uZXJyb3IuZXJyY29kZSA9PT0gXCJNX0NPTlNFTlRfTk9UX0dJVkVOXCIpIHtcbiAgICAgICAgICAgICAgICBjb25zZW50RXJyb3IgPSBtLmVycm9yO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChtLmVycm9yICYmIG0uZXJyb3IuZXJyY29kZSA9PT0gXCJNX1JFU09VUkNFX0xJTUlUX0VYQ0VFREVEXCIpIHtcbiAgICAgICAgICAgICAgICByZXNvdXJjZUxpbWl0RXJyb3IgPSBtLmVycm9yO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChjb25zZW50RXJyb3IpIHtcbiAgICAgICAgICAgIHRpdGxlID0gX3QoXG4gICAgICAgICAgICAgICAgXCJyb29tfHN0YXR1c19iYXJ8cmVxdWlyZXNfY29uc2VudF9hZ3JlZW1lbnRcIixcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNlbnRMaW5rOiAoc3ViKSA9PiAoXG4gICAgICAgICAgICAgICAgICAgICAgICA8RXh0ZXJuYWxMaW5rIGhyZWY9e2NvbnNlbnRFcnJvciEuZGF0YT8uY29uc2VudF91cml9IHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXIgbm9vcGVuZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VifVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHRlcm5hbExpbms+XG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzb3VyY2VMaW1pdEVycm9yKSB7XG4gICAgICAgICAgICB0aXRsZSA9IG1lc3NhZ2VGb3JSZXNvdXJjZUxpbWl0RXJyb3IoXG4gICAgICAgICAgICAgICAgcmVzb3VyY2VMaW1pdEVycm9yLmRhdGEubGltaXRfdHlwZSxcbiAgICAgICAgICAgICAgICByZXNvdXJjZUxpbWl0RXJyb3IuZGF0YS5hZG1pbl9jb250YWN0LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgXCJtb250aGx5X2FjdGl2ZV91c2VyXCI6IF90ZChcInJvb218c3RhdHVzX2Jhcnxtb250aGx5X3VzZXJfbGltaXRfcmVhY2hlZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgXCJoc19kaXNhYmxlZFwiOiBfdGQoXCJyb29tfHN0YXR1c19iYXJ8aG9tZXNlcnZlcl9ibG9ja2VkXCIpLFxuICAgICAgICAgICAgICAgICAgICBcIlwiOiBfdGQoXCJyb29tfHN0YXR1c19iYXJ8ZXhjZWVkZWRfcmVzb3VyY2VfbGltaXRcIiksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZSA9IF90KFwicm9vbXxzdGF0dXNfYmFyfHNvbWVfbWVzc2FnZXNfbm90X3NlbnRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnV0dG9uUm93ID0gKFxuICAgICAgICAgICAgPD5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uQ2FuY2VsQWxsQ2xpY2t9IGNsYXNzTmFtZT1cIm14X1Jvb21TdGF0dXNCYXJfdW5zZW50Q2FuY2VsQWxsQnRuXCI+XG4gICAgICAgICAgICAgICAgICAgIHtfdChcInJvb218c3RhdHVzX2JhcnxkZWxldGVfYWxsXCIpfVxuICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uUmVzZW5kQWxsQ2xpY2t9IGNsYXNzTmFtZT1cIm14X1Jvb21TdGF0dXNCYXJfdW5zZW50UmV0cnlcIj5cbiAgICAgICAgICAgICAgICAgICAge190KFwicm9vbXxzdGF0dXNfYmFyfHJldHJ5X2FsbFwiKX1cbiAgICAgICAgICAgICAgICA8L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICA8Lz5cbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNSZXNlbmRpbmcpIHtcbiAgICAgICAgICAgIGJ1dHRvblJvdyA9IChcbiAgICAgICAgICAgICAgICA8PlxuICAgICAgICAgICAgICAgICAgICA8SW5saW5lU3Bpbm5lciB3PXsyMH0gaD17MjB9IC8+XG4gICAgICAgICAgICAgICAgICAgIHsvKiBzcGFuIGZvciBjc3MgKi99XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPntfdChcImZvcndhcmR8c2VuZGluZ1wiKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC8+XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxSb29tU3RhdHVzQmFyVW5zZW50TWVzc2FnZXNcbiAgICAgICAgICAgICAgICB0aXRsZT17dGl0bGV9XG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb249e190KFwicm9vbXxzdGF0dXNfYmFyfHNlbGVjdF9tZXNzYWdlc190b19yZXRyeVwiKX1cbiAgICAgICAgICAgICAgICBub3RpZmljYXRpb25TdGF0ZT17U3RhdGljTm90aWZpY2F0aW9uU3RhdGUuUkVEX0VYQ0xBTUFUSU9OfVxuICAgICAgICAgICAgICAgIGJ1dHRvbnM9e2J1dHRvblJvd31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlbmRlcigpOiBSZWFjdC5SZWFjdE5vZGUge1xuICAgICAgICBpZiAodGhpcy5zaG91bGRTaG93Q29ubmVjdGlvbkVycm9yKCkpIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Sb29tU3RhdHVzQmFyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X1Jvb21TdGF0dXNCYXJfY29ubmVjdGlvbkxvc3RCYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8V2FybmluZ0ljb24gd2lkdGg9XCIyNHB4XCIgaGVpZ2h0PVwiMjRweFwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Sb29tU3RhdHVzQmFyX2Nvbm5lY3Rpb25Mb3N0QmFyX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7X3QoXCJyb29tfHN0YXR1c19iYXJ8c2VydmVyX2Nvbm5lY3Rpdml0eV9sb3N0X3RpdGxlXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9Sb29tU3RhdHVzQmFyX2Nvbm5lY3Rpb25Mb3N0QmFyX2Rlc2NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtfdChcInJvb218c3RhdHVzX2JhcnxzZXJ2ZXJfY29ubmVjdGl2aXR5X2xvc3RfZGVzY3JpcHRpb25cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnVuc2VudE1lc3NhZ2VzLmxlbmd0aCA+IDAgfHwgdGhpcy5zdGF0ZS5pc1Jlc2VuZGluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VW5zZW50TWVzc2FnZUNvbnRlbnQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBUUEsSUFBQUEsTUFBQSxHQUFBQyxzQkFBQSxDQUFBQyxPQUFBO0FBQ0EsSUFBQUMsT0FBQSxHQUFBRCxPQUFBO0FBV0EsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGdCQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxPQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxXQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxXQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxRQUFBLEdBQUFQLE9BQUE7QUFDQSxJQUFBUSx3QkFBQSxHQUFBUixPQUFBO0FBQ0EsSUFBQVMsaUJBQUEsR0FBQVYsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFVLGNBQUEsR0FBQVgsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFXLG9CQUFBLEdBQUFaLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBWSw0QkFBQSxHQUFBWixPQUFBO0FBQ0EsSUFBQWEsYUFBQSxHQUFBZCxzQkFBQSxDQUFBQyxPQUFBO0FBL0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQTJCQSxNQUFNYyxpQkFBaUIsR0FBRyxDQUFD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