matrix-react-sdk
Version:
SDK for matrix.org using React
167 lines (164 loc) • 28.6 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.CallEvent = void 0;
var _react = _interopRequireWildcard(require("react"));
var _Call = require("../../../models/Call");
var _languageHandler = require("../../../languageHandler");
var _useCall = require("../../../hooks/useCall");
var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher"));
var _actions = require("../../../dispatcher/actions");
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _MemberAvatar = _interopRequireDefault(require("../avatars/MemberAvatar"));
var _LiveContentSummary = require("../rooms/LiveContentSummary");
var _FacePile = _interopRequireDefault(require("../elements/FacePile"));
var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext"));
var _CallDuration = require("../voip/CallDuration");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
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 MAX_FACES = 8;
const ActiveCallEvent = /*#__PURE__*/(0, _react.forwardRef)(({
mxEvent,
call,
participatingMembers,
buttonText,
buttonKind,
buttonDisabledTooltip,
onButtonClick
}, ref) => {
const senderName = (0, _react.useMemo)(() => mxEvent.sender?.name ?? mxEvent.getSender(), [mxEvent]);
const facePileMembers = (0, _react.useMemo)(() => participatingMembers.slice(0, MAX_FACES), [participatingMembers]);
const facePileOverflow = participatingMembers.length > facePileMembers.length;
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent_wrapper",
ref: ref
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent mx_CallEvent_active"
}, /*#__PURE__*/_react.default.createElement(_MemberAvatar.default, {
member: mxEvent.sender,
fallbackUserId: mxEvent.getSender(),
viewUserOnClick: true,
size: "24px"
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent_columns"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent_details"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_CallEvent_title"
}, (0, _languageHandler._t)("timeline|m.call|video_call_started_text", {
name: senderName
})), /*#__PURE__*/_react.default.createElement(_LiveContentSummary.LiveContentSummary, {
type: _LiveContentSummary.LiveContentType.Video,
text: (0, _languageHandler._t)("voip|video_call"),
active: false,
participantCount: participatingMembers.length
}), /*#__PURE__*/_react.default.createElement(_FacePile.default, {
members: facePileMembers,
size: "24px",
overflow: facePileOverflow
})), call && /*#__PURE__*/_react.default.createElement(_CallDuration.SessionDuration, {
session: call.session
}), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
className: "mx_CallEvent_button",
kind: buttonKind,
disabled: onButtonClick === null || buttonDisabledTooltip !== undefined,
onClick: onButtonClick,
title: buttonDisabledTooltip
}, buttonText))));
});
const ActiveLoadedCallEvent = /*#__PURE__*/(0, _react.forwardRef)(({
mxEvent,
call
}, ref) => {
const connectionState = (0, _useCall.useConnectionState)(call);
const participatingMembers = (0, _useCall.useParticipatingMembers)(call);
const joinCallButtonDisabledTooltip = (0, _useCall.useJoinCallButtonDisabledTooltip)(call);
const connect = (0, _react.useCallback)(ev => {
ev.preventDefault();
_dispatcher.default.dispatch({
action: _actions.Action.ViewRoom,
room_id: mxEvent.getRoomId(),
view_call: true,
metricsTrigger: undefined
});
}, [mxEvent]);
const disconnect = (0, _react.useCallback)(ev => {
ev.preventDefault();
call.disconnect();
}, [call]);
const [buttonText, buttonKind, onButtonClick] = (0, _react.useMemo)(() => {
switch (connectionState) {
case _Call.ConnectionState.Disconnected:
return [(0, _languageHandler._t)("action|join"), "primary", connect];
case _Call.ConnectionState.Connected:
return [(0, _languageHandler._t)("action|leave"), "danger", disconnect];
case _Call.ConnectionState.Disconnecting:
return [(0, _languageHandler._t)("action|leave"), "danger", null];
case _Call.ConnectionState.Connecting:
case _Call.ConnectionState.Lobby:
case _Call.ConnectionState.WidgetLoading:
return [(0, _languageHandler._t)("action|join"), "primary", null];
}
}, [connectionState, connect, disconnect]);
return /*#__PURE__*/_react.default.createElement(ActiveCallEvent, {
ref: ref,
mxEvent: mxEvent,
call: call,
participatingMembers: participatingMembers,
buttonText: buttonText,
buttonKind: buttonKind,
buttonDisabledTooltip: joinCallButtonDisabledTooltip ?? undefined,
onButtonClick: onButtonClick
});
});
/**
* An event tile representing an active or historical Element call.
*/
const CallEvent = exports.CallEvent = /*#__PURE__*/(0, _react.forwardRef)(({
mxEvent
}, ref) => {
const client = (0, _react.useContext)(_MatrixClientContext.default);
const call = (0, _useCall.useCall)(mxEvent.getRoomId());
const latestEvent = client.getRoom(mxEvent.getRoomId()).currentState.getStateEvents(mxEvent.getType(), mxEvent.getStateKey());
if ("m.terminated" in latestEvent.getContent() || latestEvent.isRedacted()) {
// The call is terminated
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent_wrapper",
ref: ref
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent mx_CallEvent_inactive"
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CallEvent_columns"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_CallEvent_title"
}, (0, _languageHandler._t)("timeline|m.call|video_call_ended")), /*#__PURE__*/_react.default.createElement(_CallDuration.CallDuration, {
delta: latestEvent.getTs() - mxEvent.getTs()
}))));
}
if (call === null) {
// There should be a call, but it hasn't loaded yet
return /*#__PURE__*/_react.default.createElement(ActiveCallEvent, {
ref: ref,
mxEvent: mxEvent,
call: null,
participatingMembers: [],
buttonText: (0, _languageHandler._t)("action|join"),
buttonKind: "primary",
onButtonClick: null
});
}
return /*#__PURE__*/_react.default.createElement(ActiveLoadedCallEvent, {
mxEvent: mxEvent,
call: call,
ref: ref
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfcmVhY3QiLCJfaW50ZXJvcFJlcXVpcmVXaWxkY2FyZCIsInJlcXVpcmUiLCJfQ2FsbCIsIl9sYW5ndWFnZUhhbmRsZXIiLCJfdXNlQ2FsbCIsIl9kaXNwYXRjaGVyIiwiX2ludGVyb3BSZXF1aXJlRGVmYXVsdCIsIl9hY3Rpb25zIiwiX0FjY2Vzc2libGVCdXR0b24iLCJfTWVtYmVyQXZhdGFyIiwiX0xpdmVDb250ZW50U3VtbWFyeSIsIl9GYWNlUGlsZSIsIl9NYXRyaXhDbGllbnRDb250ZXh0IiwiX0NhbGxEdXJhdGlvbiIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIk1BWF9GQUNFUyIsIkFjdGl2ZUNhbGxFdmVudCIsImZvcndhcmRSZWYiLCJteEV2ZW50IiwicGFydGljaXBhdGluZ01lbWJlcnMiLCJidXR0b25UZXh0IiwiYnV0dG9uS2luZCIsImJ1dHRvbkRpc2FibGVkVG9vbHRpcCIsIm9uQnV0dG9uQ2xpY2siLCJyZWYiLCJzZW5kZXJOYW1lIiwidXNlTWVtbyIsInNlbmRlciIsIm5hbWUiLCJnZXRTZW5kZXIiLCJmYWNlUGlsZU1lbWJlcnMiLCJzbGljZSIsImZhY2VQaWxlT3ZlcmZsb3ciLCJsZW5ndGgiLCJjcmVhdGVFbGVtZW50IiwiY2xhc3NOYW1lIiwibWVtYmVyIiwiZmFsbGJhY2tVc2VySWQiLCJ2aWV3VXNlck9uQ2xpY2siLCJzaXplIiwiX3QiLCJMaXZlQ29udGVudFN1bW1hcnkiLCJ0eXBlIiwiTGl2ZUNvbnRlbnRUeXBlIiwiVmlkZW8iLCJ0ZXh0IiwiYWN0aXZlIiwicGFydGljaXBhbnRDb3VudCIsIm1lbWJlcnMiLCJvdmVyZmxvdyIsIlNlc3Npb25EdXJhdGlvbiIsInNlc3Npb24iLCJraW5kIiwiZGlzYWJsZWQiLCJ1bmRlZmluZWQiLCJvbkNsaWNrIiwidGl0bGUiLCJBY3RpdmVMb2FkZWRDYWxsRXZlbnQiLCJjb25uZWN0aW9uU3RhdGUiLCJ1c2VDb25uZWN0aW9uU3RhdGUiLCJ1c2VQYXJ0aWNpcGF0aW5nTWVtYmVycyIsImpvaW5DYWxsQnV0dG9uRGlzYWJsZWRUb29sdGlwIiwidXNlSm9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAiLCJjb25uZWN0IiwidXNlQ2FsbGJhY2siLCJldiIsInByZXZlbnREZWZhdWx0IiwiZGVmYXVsdERpc3BhdGNoZXIiLCJkaXNwYXRjaCIsImFjdGlvbiIsIkFjdGlvbiIsIlZpZXdSb29tIiwicm9vbV9pZCIsImdldFJvb21JZCIsInZpZXdfY2FsbCIsIm1ldHJpY3NUcmlnZ2VyIiwiZGlzY29ubmVjdCIsIkNvbm5lY3Rpb25TdGF0ZSIsIkRpc2Nvbm5lY3RlZCIsIkNvbm5lY3RlZCIsIkRpc2Nvbm5lY3RpbmciLCJDb25uZWN0aW5nIiwiTG9iYnkiLCJXaWRnZXRMb2FkaW5nIiwiQ2FsbEV2ZW50IiwiZXhwb3J0cyIsImNsaWVudCIsInVzZUNvbnRleHQiLCJNYXRyaXhDbGllbnRDb250ZXh0IiwidXNlQ2FsbCIsImxhdGVzdEV2ZW50IiwiZ2V0Um9vbSIsImN1cnJlbnRTdGF0ZSIsImdldFN0YXRlRXZlbnRzIiwiZ2V0VHlwZSIsImdldFN0YXRlS2V5IiwiZ2V0Q29udGVudCIsImlzUmVkYWN0ZWQiLCJDYWxsRHVyYXRpb24iLCJkZWx0YSIsImdldFRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdmlld3MvbWVzc2FnZXMvQ2FsbEV2ZW50LnRzeCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMiBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgZm9yd2FyZFJlZiwgdXNlQ2FsbGJhY2ssIHVzZUNvbnRleHQsIHVzZU1lbW8gfSBmcm9tIFwicmVhY3RcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXRyaXhFdmVudCwgUm9vbU1lbWJlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IENvbm5lY3Rpb25TdGF0ZSwgRWxlbWVudENhbGwgfSBmcm9tIFwiLi4vLi4vLi4vbW9kZWxzL0NhbGxcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHtcbiAgICB1c2VDYWxsLFxuICAgIHVzZUNvbm5lY3Rpb25TdGF0ZSxcbiAgICB1c2VKb2luQ2FsbEJ1dHRvbkRpc2FibGVkVG9vbHRpcCxcbiAgICB1c2VQYXJ0aWNpcGF0aW5nTWVtYmVycyxcbn0gZnJvbSBcIi4uLy4uLy4uL2hvb2tzL3VzZUNhbGxcIjtcbmltcG9ydCBkZWZhdWx0RGlzcGF0Y2hlciBmcm9tIFwiLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyXCI7XG5pbXBvcnQgdHlwZSB7IFZpZXdSb29tUGF5bG9hZCB9IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL3BheWxvYWRzL1ZpZXdSb29tUGF5bG9hZFwiO1xuaW1wb3J0IHsgQWN0aW9uIH0gZnJvbSBcIi4uLy4uLy4uL2Rpc3BhdGNoZXIvYWN0aW9uc1wiO1xuaW1wb3J0IEFjY2Vzc2libGVCdXR0b24sIHsgQWNjZXNzaWJsZUJ1dHRvbktpbmQsIEJ1dHRvbkV2ZW50IH0gZnJvbSBcIi4uL2VsZW1lbnRzL0FjY2Vzc2libGVCdXR0b25cIjtcbmltcG9ydCBNZW1iZXJBdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvTWVtYmVyQXZhdGFyXCI7XG5pbXBvcnQgeyBMaXZlQ29udGVudFN1bW1hcnksIExpdmVDb250ZW50VHlwZSB9IGZyb20gXCIuLi9yb29tcy9MaXZlQ29udGVudFN1bW1hcnlcIjtcbmltcG9ydCBGYWNlUGlsZSBmcm9tIFwiLi4vZWxlbWVudHMvRmFjZVBpbGVcIjtcbmltcG9ydCBNYXRyaXhDbGllbnRDb250ZXh0IGZyb20gXCIuLi8uLi8uLi9jb250ZXh0cy9NYXRyaXhDbGllbnRDb250ZXh0XCI7XG5pbXBvcnQgeyBDYWxsRHVyYXRpb24sIFNlc3Npb25EdXJhdGlvbiB9IGZyb20gXCIuLi92b2lwL0NhbGxEdXJhdGlvblwiO1xuXG5jb25zdCBNQVhfRkFDRVMgPSA4O1xuXG5pbnRlcmZhY2UgQWN0aXZlQ2FsbEV2ZW50UHJvcHMge1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIGNhbGw6IEVsZW1lbnRDYWxsIHwgbnVsbDtcbiAgICBwYXJ0aWNpcGF0aW5nTWVtYmVyczogUm9vbU1lbWJlcltdO1xuICAgIGJ1dHRvblRleHQ6IHN0cmluZztcbiAgICBidXR0b25LaW5kOiBBY2Nlc3NpYmxlQnV0dG9uS2luZDtcbiAgICBidXR0b25EaXNhYmxlZFRvb2x0aXA/OiBzdHJpbmc7XG4gICAgb25CdXR0b25DbGljazogKChldjogQnV0dG9uRXZlbnQpID0+IHZvaWQpIHwgbnVsbDtcbn1cblxuY29uc3QgQWN0aXZlQ2FsbEV2ZW50ID0gZm9yd2FyZFJlZjxhbnksIEFjdGl2ZUNhbGxFdmVudFByb3BzPihcbiAgICAoeyBteEV2ZW50LCBjYWxsLCBwYXJ0aWNpcGF0aW5nTWVtYmVycywgYnV0dG9uVGV4dCwgYnV0dG9uS2luZCwgYnV0dG9uRGlzYWJsZWRUb29sdGlwLCBvbkJ1dHRvbkNsaWNrIH0sIHJlZikgPT4ge1xuICAgICAgICBjb25zdCBzZW5kZXJOYW1lID0gdXNlTWVtbygoKSA9PiBteEV2ZW50LnNlbmRlcj8ubmFtZSA/PyBteEV2ZW50LmdldFNlbmRlcigpLCBbbXhFdmVudF0pO1xuXG4gICAgICAgIGNvbnN0IGZhY2VQaWxlTWVtYmVycyA9IHVzZU1lbW8oKCkgPT4gcGFydGljaXBhdGluZ01lbWJlcnMuc2xpY2UoMCwgTUFYX0ZBQ0VTKSwgW3BhcnRpY2lwYXRpbmdNZW1iZXJzXSk7XG4gICAgICAgIGNvbnN0IGZhY2VQaWxlT3ZlcmZsb3cgPSBwYXJ0aWNpcGF0aW5nTWVtYmVycy5sZW5ndGggPiBmYWNlUGlsZU1lbWJlcnMubGVuZ3RoO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0NhbGxFdmVudF93cmFwcGVyXCIgcmVmPXtyZWZ9PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ2FsbEV2ZW50IG14X0NhbGxFdmVudF9hY3RpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPE1lbWJlckF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyPXtteEV2ZW50LnNlbmRlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIGZhbGxiYWNrVXNlcklkPXtteEV2ZW50LmdldFNlbmRlcigpfVxuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1VzZXJPbkNsaWNrXG4gICAgICAgICAgICAgICAgICAgICAgICBzaXplPVwiMjRweFwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ2FsbEV2ZW50X2NvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ2FsbEV2ZW50X2RldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9DYWxsRXZlbnRfdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge190KFwidGltZWxpbmV8bS5jYWxsfHZpZGVvX2NhbGxfc3RhcnRlZF90ZXh0XCIsIHsgbmFtZTogc2VuZGVyTmFtZSB9KX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPExpdmVDb250ZW50U3VtbWFyeVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPXtMaXZlQ29udGVudFR5cGUuVmlkZW99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ9e190KFwidm9pcHx2aWRlb19jYWxsXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU9e2ZhbHNlfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWNpcGFudENvdW50PXtwYXJ0aWNpcGF0aW5nTWVtYmVycy5sZW5ndGh9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8RmFjZVBpbGUgbWVtYmVycz17ZmFjZVBpbGVNZW1iZXJzfSBzaXplPVwiMjRweFwiIG92ZXJmbG93PXtmYWNlUGlsZU92ZXJmbG93fSAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB7Y2FsbCAmJiA8U2Vzc2lvbkR1cmF0aW9uIHNlc3Npb249e2NhbGwuc2Vzc2lvbn0gLz59XG4gICAgICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0NhbGxFdmVudF9idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ9e2J1dHRvbktpbmR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWQ9e29uQnV0dG9uQ2xpY2sgPT09IG51bGwgfHwgYnV0dG9uRGlzYWJsZWRUb29sdGlwICE9PSB1bmRlZmluZWR9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25CdXR0b25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZT17YnV0dG9uRGlzYWJsZWRUb29sdGlwfVxuICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtidXR0b25UZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9BY2Nlc3NpYmxlQnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICApO1xuICAgIH0sXG4pO1xuXG5pbnRlcmZhY2UgQWN0aXZlTG9hZGVkQ2FsbEV2ZW50UHJvcHMge1xuICAgIG14RXZlbnQ6IE1hdHJpeEV2ZW50O1xuICAgIGNhbGw6IEVsZW1lbnRDYWxsO1xufVxuXG5jb25zdCBBY3RpdmVMb2FkZWRDYWxsRXZlbnQgPSBmb3J3YXJkUmVmPGFueSwgQWN0aXZlTG9hZGVkQ2FsbEV2ZW50UHJvcHM+KCh7IG14RXZlbnQsIGNhbGwgfSwgcmVmKSA9PiB7XG4gICAgY29uc3QgY29ubmVjdGlvblN0YXRlID0gdXNlQ29ubmVjdGlvblN0YXRlKGNhbGwpO1xuICAgIGNvbnN0IHBhcnRpY2lwYXRpbmdNZW1iZXJzID0gdXNlUGFydGljaXBhdGluZ01lbWJlcnMoY2FsbCk7XG4gICAgY29uc3Qgam9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAgPSB1c2VKb2luQ2FsbEJ1dHRvbkRpc2FibGVkVG9vbHRpcChjYWxsKTtcblxuICAgIGNvbnN0IGNvbm5lY3QgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKGV2OiBCdXR0b25FdmVudCkgPT4ge1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGRlZmF1bHREaXNwYXRjaGVyLmRpc3BhdGNoPFZpZXdSb29tUGF5bG9hZD4oe1xuICAgICAgICAgICAgICAgIGFjdGlvbjogQWN0aW9uLlZpZXdSb29tLFxuICAgICAgICAgICAgICAgIHJvb21faWQ6IG14RXZlbnQuZ2V0Um9vbUlkKCkhLFxuICAgICAgICAgICAgICAgIHZpZXdfY2FsbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBtZXRyaWNzVHJpZ2dlcjogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIFtteEV2ZW50XSxcbiAgICApO1xuXG4gICAgY29uc3QgZGlzY29ubmVjdCA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoZXY6IEJ1dHRvbkV2ZW50KSA9PiB7XG4gICAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgY2FsbC5kaXNjb25uZWN0KCk7XG4gICAgICAgIH0sXG4gICAgICAgIFtjYWxsXSxcbiAgICApO1xuXG4gICAgY29uc3QgW2J1dHRvblRleHQsIGJ1dHRvbktpbmQsIG9uQnV0dG9uQ2xpY2tdID0gdXNlTWVtbzxcbiAgICAgICAgW3N0cmluZywgQWNjZXNzaWJsZUJ1dHRvbktpbmQsIG51bGwgfCAoKGV2OiBCdXR0b25FdmVudCkgPT4gdm9pZCldXG4gICAgPigoKSA9PiB7XG4gICAgICAgIHN3aXRjaCAoY29ubmVjdGlvblN0YXRlKSB7XG4gICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0ZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtfdChcImFjdGlvbnxqb2luXCIpLCBcInByaW1hcnlcIiwgY29ubmVjdF07XG4gICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5Db25uZWN0ZWQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtfdChcImFjdGlvbnxsZWF2ZVwiKSwgXCJkYW5nZXJcIiwgZGlzY29ubmVjdF07XG4gICAgICAgICAgICBjYXNlIENvbm5lY3Rpb25TdGF0ZS5EaXNjb25uZWN0aW5nOlxuICAgICAgICAgICAgICAgIHJldHVybiBbX3QoXCJhY3Rpb258bGVhdmVcIiksIFwiZGFuZ2VyXCIsIG51bGxdO1xuICAgICAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuQ29ubmVjdGluZzpcbiAgICAgICAgICAgIGNhc2UgQ29ubmVjdGlvblN0YXRlLkxvYmJ5OlxuICAgICAgICAgICAgY2FzZSBDb25uZWN0aW9uU3RhdGUuV2lkZ2V0TG9hZGluZzpcbiAgICAgICAgICAgICAgICByZXR1cm4gW190KFwiYWN0aW9ufGpvaW5cIiksIFwicHJpbWFyeVwiLCBudWxsXTtcbiAgICAgICAgfVxuICAgIH0sIFtjb25uZWN0aW9uU3RhdGUsIGNvbm5lY3QsIGRpc2Nvbm5lY3RdKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxBY3RpdmVDYWxsRXZlbnRcbiAgICAgICAgICAgIHJlZj17cmVmfVxuICAgICAgICAgICAgbXhFdmVudD17bXhFdmVudH1cbiAgICAgICAgICAgIGNhbGw9e2NhbGx9XG4gICAgICAgICAgICBwYXJ0aWNpcGF0aW5nTWVtYmVycz17cGFydGljaXBhdGluZ01lbWJlcnN9XG4gICAgICAgICAgICBidXR0b25UZXh0PXtidXR0b25UZXh0fVxuICAgICAgICAgICAgYnV0dG9uS2luZD17YnV0dG9uS2luZH1cbiAgICAgICAgICAgIGJ1dHRvbkRpc2FibGVkVG9vbHRpcD17am9pbkNhbGxCdXR0b25EaXNhYmxlZFRvb2x0aXAgPz8gdW5kZWZpbmVkfVxuICAgICAgICAgICAgb25CdXR0b25DbGljaz17b25CdXR0b25DbGlja31cbiAgICAgICAgLz5cbiAgICApO1xufSk7XG5cbmludGVyZmFjZSBDYWxsRXZlbnRQcm9wcyB7XG4gICAgbXhFdmVudDogTWF0cml4RXZlbnQ7XG59XG5cbi8qKlxuICogQW4gZXZlbnQgdGlsZSByZXByZXNlbnRpbmcgYW4gYWN0aXZlIG9yIGhpc3RvcmljYWwgRWxlbWVudCBjYWxsLlxuICovXG5leHBvcnQgY29uc3QgQ2FsbEV2ZW50ID0gZm9yd2FyZFJlZjxhbnksIENhbGxFdmVudFByb3BzPigoeyBteEV2ZW50IH0sIHJlZikgPT4ge1xuICAgIGNvbnN0IGNsaWVudCA9IHVzZUNvbnRleHQoTWF0cml4Q2xpZW50Q29udGV4dCk7XG4gICAgY29uc3QgY2FsbCA9IHVzZUNhbGwobXhFdmVudC5nZXRSb29tSWQoKSEpO1xuICAgIGNvbnN0IGxhdGVzdEV2ZW50ID0gY2xpZW50XG4gICAgICAgIC5nZXRSb29tKG14RXZlbnQuZ2V0Um9vbUlkKCkpIVxuICAgICAgICAuY3VycmVudFN0YXRlLmdldFN0YXRlRXZlbnRzKG14RXZlbnQuZ2V0VHlwZSgpLCBteEV2ZW50LmdldFN0YXRlS2V5KCkhKSE7XG5cbiAgICBpZiAoXCJtLnRlcm1pbmF0ZWRcIiBpbiBsYXRlc3RFdmVudC5nZXRDb250ZW50KCkgfHwgbGF0ZXN0RXZlbnQuaXNSZWRhY3RlZCgpKSB7XG4gICAgICAgIC8vIFRoZSBjYWxsIGlzIHRlcm1pbmF0ZWRcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ2FsbEV2ZW50X3dyYXBwZXJcIiByZWY9e3JlZn0+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9DYWxsRXZlbnQgbXhfQ2FsbEV2ZW50X2luYWN0aXZlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ2FsbEV2ZW50X2NvbHVtbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzTmFtZT1cIm14X0NhbGxFdmVudF90aXRsZVwiPntfdChcInRpbWVsaW5lfG0uY2FsbHx2aWRlb19jYWxsX2VuZGVkXCIpfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxDYWxsRHVyYXRpb24gZGVsdGE9e2xhdGVzdEV2ZW50LmdldFRzKCkgLSBteEV2ZW50LmdldFRzKCl9IC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGNhbGwgPT09IG51bGwpIHtcbiAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGEgY2FsbCwgYnV0IGl0IGhhc24ndCBsb2FkZWQgeWV0XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8QWN0aXZlQ2FsbEV2ZW50XG4gICAgICAgICAgICAgICAgcmVmPXtyZWZ9XG4gICAgICAgICAgICAgICAgbXhFdmVudD17bXhFdmVudH1cbiAgICAgICAgICAgICAgICBjYWxsPXtudWxsfVxuICAgICAgICAgICAgICAgIHBhcnRpY2lwYXRpbmdNZW1iZXJzPXtbXX1cbiAgICAgICAgICAgICAgICBidXR0b25UZXh0PXtfdChcImFjdGlvbnxqb2luXCIpfVxuICAgICAgICAgICAgICAgIGJ1dHRvbktpbmQ9XCJwcmltYXJ5XCJcbiAgICAgICAgICAgICAgICBvbkJ1dHRvbkNsaWNrPXtudWxsfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gPEFjdGl2ZUxvYWRlZENhbGxFdmVudCBteEV2ZW50PXtteEV2ZW50fSBjYWxsPXtjYWxsIGFzIEVsZW1lbnRDYWxsfSByZWY9e3JlZn0gLz47XG59KTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQVFBLElBQUFBLE1BQUEsR0FBQUMsdUJBQUEsQ0FBQUMsT0FBQTtBQUdBLElBQUFDLEtBQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLGdCQUFBLEdBQUFGLE9BQUE7QUFDQSxJQUFBRyxRQUFBLEdBQUFILE9BQUE7QUFNQSxJQUFBSSxXQUFBLEdBQUFDLHNCQUFBLENBQUFMLE9BQUE7QUFFQSxJQUFBTSxRQUFBLEdBQUFOLE9BQUE7QUFDQSxJQUFBTyxpQkFBQSxHQUFBRixzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQVEsYUFBQSxHQUFBSCxzQkFBQSxDQUFBTCxPQUFBO0FBQ0EsSUFBQVMsbUJBQUEsR0FBQVQsT0FBQTtBQUNBLElBQUFVLFNBQUEsR0FBQUwsc0JBQUEsQ0FBQUwsT0FBQTtBQUNBLElBQUFXLG9CQUFBLEdBQUFOLHNCQUFBLENBQUFMLE9B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