matrix-react-sdk
Version:
SDK for matrix.org using React
227 lines (182 loc) • 23.7 kB
JavaScript
"use strict";
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 _classnames = _interopRequireDefault(require("classnames"));
var _RoomAvatar = _interopRequireDefault(require("./RoomAvatar"));
var _NotificationBadge = _interopRequireDefault(require("../rooms/NotificationBadge"));
var _RoomNotificationStateStore = require("../../../stores/notifications/RoomNotificationStateStore");
var _presence = require("../../../utils/presence");
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _languageHandler = require("../../../languageHandler");
var _TextWithTooltip = _interopRequireDefault(require("../elements/TextWithTooltip"));
var _DMRoomMap = _interopRequireDefault(require("../../../utils/DMRoomMap"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _dec, _class, _temp;
var Icon;
(function (Icon) {
Icon["None"] = "NONE";
Icon["Globe"] = "GLOBE";
Icon["PresenceOnline"] = "ONLINE";
Icon["PresenceAway"] = "AWAY";
Icon["PresenceOffline"] = "OFFLINE";
})(Icon || (Icon = {}));
function tooltipText(variant
/*: Icon*/
) {
switch (variant) {
case Icon.Globe:
return (0, _languageHandler._t)("This room is public");
case Icon.PresenceOnline:
return (0, _languageHandler._t)("Online");
case Icon.PresenceAway:
return (0, _languageHandler._t)("Away");
case Icon.PresenceOffline:
return (0, _languageHandler._t)("Offline");
}
}
let DecoratedRoomAvatar = (_dec = (0, _replaceableComponent.replaceableComponent)("views.avatars.DecoratedRoomAvatar"), _dec(_class = (_temp = class DecoratedRoomAvatar extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "_dmUser", void 0);
(0, _defineProperty2.default)(this, "isUnmounted", false);
(0, _defineProperty2.default)(this, "isWatchingTimeline", false);
(0, _defineProperty2.default)(this, "onRoomTimeline", (ev
/*: MatrixEvent*/
, room
/*: Room*/
) => {
if (this.isUnmounted) return; // apparently these can happen?
if (!room) return;
if (this.props.room.roomId !== room.roomId) return;
if (ev.getType() === 'm.room.join_rules' || ev.getType() === 'm.room.member') {
this.setState({
icon: this.calculateIcon()
});
}
});
(0, _defineProperty2.default)(this, "onPresenceUpdate", () => {
if (this.isUnmounted) return;
const newIcon = this.getPresenceIcon();
if (newIcon !== this.state.icon) this.setState({
icon: newIcon
});
});
this.state = {
notificationState: _RoomNotificationStateStore.RoomNotificationStateStore.instance.getRoomState(this.props.room),
icon: this.calculateIcon()
};
}
componentWillUnmount() {
this.isUnmounted = true;
if (this.isWatchingTimeline) this.props.room.off('Room.timeline', this.onRoomTimeline);
this.dmUser = null; // clear listeners, if any
}
get isPublicRoom()
/*: boolean*/
{
const joinRules = this.props.room.currentState.getStateEvents("m.room.join_rules", "");
const joinRule = joinRules && joinRules.getContent().join_rule;
return joinRule === 'public';
}
get dmUser()
/*: User*/
{
return this._dmUser;
}
set dmUser(val
/*: User*/
) {
const oldUser = this._dmUser;
this._dmUser = val;
if (oldUser && oldUser !== this._dmUser) {
oldUser.off('User.currentlyActive', this.onPresenceUpdate);
oldUser.off('User.presence', this.onPresenceUpdate);
}
if (this._dmUser && oldUser !== this._dmUser) {
this._dmUser.on('User.currentlyActive', this.onPresenceUpdate);
this._dmUser.on('User.presence', this.onPresenceUpdate);
}
}
getPresenceIcon()
/*: Icon*/
{
if (!this.dmUser) return Icon.None;
let icon = Icon.None;
const isOnline = this.dmUser.currentlyActive || this.dmUser.presence === 'online';
if (isOnline) {
icon = Icon.PresenceOnline;
} else if (this.dmUser.presence === 'offline') {
icon = Icon.PresenceOffline;
} else if (this.dmUser.presence === 'unavailable') {
icon = Icon.PresenceAway;
}
return icon;
}
calculateIcon()
/*: Icon*/
{
let icon = Icon.None; // We look at the DMRoomMap and not the tag here so that we don't exclude DMs in Favourites
const otherUserId = _DMRoomMap.default.shared().getUserIdForRoomId(this.props.room.roomId);
if (otherUserId && this.props.room.getJoinedMemberCount() === 2) {
// Track presence, if available
if ((0, _presence.isPresenceEnabled)()) {
if (otherUserId) {
this.dmUser = _MatrixClientPeg.MatrixClientPeg.get().getUser(otherUserId);
icon = this.getPresenceIcon();
}
}
} else {
// Track publicity
icon = this.isPublicRoom ? Icon.Globe : Icon.None;
if (!this.isWatchingTimeline) {
this.props.room.on('Room.timeline', this.onRoomTimeline);
this.isWatchingTimeline = true;
}
}
return icon;
}
render()
/*: React.ReactNode*/
{
let badge
/*: React.ReactNode*/
;
if (this.props.displayBadge) {
badge = /*#__PURE__*/_react.default.createElement(_NotificationBadge.default, {
notification: this.state.notificationState,
forceCount: this.props.forceCount,
roomId: this.props.room.roomId
});
}
let icon;
if (this.state.icon !== Icon.None) {
icon = /*#__PURE__*/_react.default.createElement(_TextWithTooltip.default, {
tooltip: tooltipText(this.state.icon),
class: `mx_DecoratedRoomAvatar_icon mx_DecoratedRoomAvatar_icon_${this.state.icon.toLowerCase()}`
});
}
const classes = (0, _classnames.default)("mx_DecoratedRoomAvatar", {
mx_DecoratedRoomAvatar_cutout: icon
});
return /*#__PURE__*/_react.default.createElement("div", {
className: classes
}, /*#__PURE__*/_react.default.createElement(_RoomAvatar.default, {
room: this.props.room,
width: this.props.avatarSize,
height: this.props.avatarSize,
oobData: this.props.oobData,
viewAvatarOnClick: this.props.viewAvatarOnClick
}), icon, badge);
}
}, _temp)) || _class);
exports.default = DecoratedRoomAvatar;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2F2YXRhcnMvRGVjb3JhdGVkUm9vbUF2YXRhci50c3giXSwibmFtZXMiOlsiSWNvbiIsInRvb2x0aXBUZXh0IiwidmFyaWFudCIsIkdsb2JlIiwiUHJlc2VuY2VPbmxpbmUiLCJQcmVzZW5jZUF3YXkiLCJQcmVzZW5jZU9mZmxpbmUiLCJEZWNvcmF0ZWRSb29tQXZhdGFyIiwiUmVhY3QiLCJQdXJlQ29tcG9uZW50IiwiY29uc3RydWN0b3IiLCJwcm9wcyIsImV2Iiwicm9vbSIsImlzVW5tb3VudGVkIiwicm9vbUlkIiwiZ2V0VHlwZSIsInNldFN0YXRlIiwiaWNvbiIsImNhbGN1bGF0ZUljb24iLCJuZXdJY29uIiwiZ2V0UHJlc2VuY2VJY29uIiwic3RhdGUiLCJub3RpZmljYXRpb25TdGF0ZSIsIlJvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlIiwiaW5zdGFuY2UiLCJnZXRSb29tU3RhdGUiLCJjb21wb25lbnRXaWxsVW5tb3VudCIsImlzV2F0Y2hpbmdUaW1lbGluZSIsIm9mZiIsIm9uUm9vbVRpbWVsaW5lIiwiZG1Vc2VyIiwiaXNQdWJsaWNSb29tIiwiam9pblJ1bGVzIiwiY3VycmVudFN0YXRlIiwiZ2V0U3RhdGVFdmVudHMiLCJqb2luUnVsZSIsImdldENvbnRlbnQiLCJqb2luX3J1bGUiLCJfZG1Vc2VyIiwidmFsIiwib2xkVXNlciIsIm9uUHJlc2VuY2VVcGRhdGUiLCJvbiIsIk5vbmUiLCJpc09ubGluZSIsImN1cnJlbnRseUFjdGl2ZSIsInByZXNlbmNlIiwib3RoZXJVc2VySWQiLCJETVJvb21NYXAiLCJzaGFyZWQiLCJnZXRVc2VySWRGb3JSb29tSWQiLCJnZXRKb2luZWRNZW1iZXJDb3VudCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFVzZXIiLCJyZW5kZXIiLCJiYWRnZSIsImRpc3BsYXlCYWRnZSIsImZvcmNlQ291bnQiLCJ0b0xvd2VyQ2FzZSIsImNsYXNzZXMiLCJteF9EZWNvcmF0ZWRSb29tQXZhdGFyX2N1dG91dCIsImF2YXRhclNpemUiLCJvb2JEYXRhIiwidmlld0F2YXRhck9uQ2xpY2siXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUtBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBZ0JLQSxJOztXQUFBQSxJO0FBQUFBLEVBQUFBLEk7QUFBQUEsRUFBQUEsSTtBQUFBQSxFQUFBQSxJO0FBQUFBLEVBQUFBLEk7QUFBQUEsRUFBQUEsSTtHQUFBQSxJLEtBQUFBLEk7O0FBU0wsU0FBU0MsV0FBVCxDQUFxQkM7QUFBckI7QUFBQSxFQUFvQztBQUNoQyxVQUFRQSxPQUFSO0FBQ0ksU0FBS0YsSUFBSSxDQUFDRyxLQUFWO0FBQ0ksYUFBTyx5QkFBRyxxQkFBSCxDQUFQOztBQUNKLFNBQUtILElBQUksQ0FBQ0ksY0FBVjtBQUNJLGFBQU8seUJBQUcsUUFBSCxDQUFQOztBQUNKLFNBQUtKLElBQUksQ0FBQ0ssWUFBVjtBQUNJLGFBQU8seUJBQUcsTUFBSCxDQUFQOztBQUNKLFNBQUtMLElBQUksQ0FBQ00sZUFBVjtBQUNJLGFBQU8seUJBQUcsU0FBSCxDQUFQO0FBUlI7QUFVSDs7SUFHb0JDLG1CLFdBRHBCLGdEQUFxQixtQ0FBckIsQyx5QkFBRCxNQUNxQkEsbUJBRHJCLFNBQ2lEQyxlQUFNQztBQUR2RDtBQUNxRjtBQUtqRkMsRUFBQUEsV0FBVyxDQUFDQztBQUFEO0FBQUEsSUFBZ0I7QUFDdkIsVUFBTUEsS0FBTjtBQUR1QjtBQUFBLHVEQUhMLEtBR0s7QUFBQSw4REFGRSxLQUVGO0FBQUEsMERBc0NGLENBQUNDO0FBQUQ7QUFBQSxNQUFrQkM7QUFBbEI7QUFBQSxTQUFpQztBQUN0RCxVQUFJLEtBQUtDLFdBQVQsRUFBc0IsT0FEZ0MsQ0FHdEQ7O0FBQ0EsVUFBSSxDQUFDRCxJQUFMLEVBQVc7QUFDWCxVQUFJLEtBQUtGLEtBQUwsQ0FBV0UsSUFBWCxDQUFnQkUsTUFBaEIsS0FBMkJGLElB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QyxNQURHLEVBUUYvQyxJQVJFLEVBU0Z1QyxLQVRFLENBQVA7QUFXSDs7QUF4SWdGLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgY2xhc3NOYW1lcyBmcm9tIFwiY2xhc3NuYW1lc1wiO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbVwiO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvdXNlclwiO1xuaW1wb3J0IHsgTWF0cml4RXZlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL2V2ZW50XCI7XG5cbmltcG9ydCBSb29tQXZhdGFyIGZyb20gXCIuL1Jvb21BdmF0YXJcIjtcbmltcG9ydCBOb3RpZmljYXRpb25CYWRnZSBmcm9tICcuLi9yb29tcy9Ob3RpZmljYXRpb25CYWRnZSc7XG5pbXBvcnQgeyBSb29tTm90aWZpY2F0aW9uU3RhdGVTdG9yZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yZXMvbm90aWZpY2F0aW9ucy9Sb29tTm90aWZpY2F0aW9uU3RhdGVTdG9yZVwiO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uU3RhdGUgfSBmcm9tIFwiLi4vLi4vLi4vc3RvcmVzL25vdGlmaWNhdGlvbnMvTm90aWZpY2F0aW9uU3RhdGVcIjtcbmltcG9ydCB7aXNQcmVzZW5jZUVuYWJsZWR9IGZyb20gXCIuLi8uLi8uLi91dGlscy9wcmVzZW5jZVwiO1xuaW1wb3J0IHtNYXRyaXhDbGllbnRQZWd9IGZyb20gXCIuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWdcIjtcbmltcG9ydCB7X3R9IGZyb20gXCIuLi8uLi8uLi9sYW5ndWFnZUhhbmRsZXJcIjtcbmltcG9ydCBUZXh0V2l0aFRvb2x0aXAgZnJvbSBcIi4uL2VsZW1lbnRzL1RleHRXaXRoVG9vbHRpcFwiO1xuaW1wb3J0IERNUm9vbU1hcCBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvRE1Sb29tTWFwXCI7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuaW50ZXJmYWNlIElQcm9wcyB7XG4gICAgcm9vbTogUm9vbTtcbiAgICBhdmF0YXJTaXplOiBudW1iZXI7XG4gICAgZGlzcGxheUJhZGdlPzogYm9vbGVhbjtcbiAgICBmb3JjZUNvdW50PzogYm9vbGVhbjtcbiAgICBvb2JEYXRhPzogb2JqZWN0O1xuICAgIHZpZXdBdmF0YXJPbkNsaWNrPzogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIElTdGF0ZSB7XG4gICAgbm90aWZpY2F0aW9uU3RhdGU/OiBOb3RpZmljYXRpb25TdGF0ZTtcbiAgICBpY29uOiBJY29uO1xufVxuXG5lbnVtIEljb24ge1xuICAgIC8vIE5vdGU6IHRoZSBuYW1lcyBoZXJlIGFyZSB1c2VkIGluIENTUyBjbGFzcyBuYW1lc1xuICAgIE5vbmUgPSBcIk5PTkVcIiwgLy8gLi4uIGV4Y2VwdCB0aGlzIG9uZVxuICAgIEdsb2JlID0gXCJHTE9CRVwiLFxuICAgIFByZXNlbmNlT25saW5lID0gXCJPTkxJTkVcIixcbiAgICBQcmVzZW5jZUF3YXkgPSBcIkFXQVlcIixcbiAgICBQcmVzZW5jZU9mZmxpbmUgPSBcIk9GRkxJTkVcIixcbn1cblxuZnVuY3Rpb24gdG9vbHRpcFRleHQodmFyaWFudDogSWNvbikge1xuICAgIHN3aXRjaCAodmFyaWFudCkge1xuICAgICAgICBjYXNlIEljb24uR2xvYmU6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJUaGlzIHJvb20gaXMgcHVibGljXCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPbmxpbmU6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJPbmxpbmVcIik7XG4gICAgICAgIGNhc2UgSWNvbi5QcmVzZW5jZUF3YXk6XG4gICAgICAgICAgICByZXR1cm4gX3QoXCJBd2F5XCIpO1xuICAgICAgICBjYXNlIEljb24uUHJlc2VuY2VPZmZsaW5lOlxuICAgICAgICAgICAgcmV0dXJuIF90KFwiT2ZmbGluZVwiKTtcbiAgICB9XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmF2YXRhcnMuRGVjb3JhdGVkUm9vbUF2YXRhclwiKVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRGVjb3JhdGVkUm9vbUF2YXRhciBleHRlbmRzIFJlYWN0LlB1cmVDb21wb25lbnQ8SVByb3BzLCBJU3RhdGU+IHtcbiAgICBwcml2YXRlIF9kbVVzZXI6IFVzZXI7XG4gICAgcHJpdmF0ZSBpc1VubW91bnRlZCA9IGZhbHNlO1xuICAgIHByaXZhdGUgaXNXYXRjaGluZ1RpbWVsaW5lID0gZmFsc2U7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm9wczogSVByb3BzKSB7XG4gICAgICAgIHN1cGVyKHByb3BzKTtcblxuICAgICAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgICAgICAgbm90aWZpY2F0aW9uU3RhdGU6IFJvb21Ob3RpZmljYXRpb25TdGF0ZVN0b3JlLmluc3RhbmNlLmdldFJvb21TdGF0ZSh0aGlzLnByb3BzLnJvb20pLFxuICAgICAgICAgICAgaWNvbjogdGhpcy5jYWxjdWxhdGVJY29uKCksXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVibGljIGNvbXBvbmVudFdpbGxVbm1vdW50KCkge1xuICAgICAgICB0aGlzLmlzVW5tb3VudGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuaXNXYXRjaGluZ1RpbWVsaW5lKSB0aGlzLnByb3BzLnJvb20ub2ZmKCdSb29tLnRpbWVsaW5lJywgdGhpcy5vblJvb21UaW1lbGluZSk7XG4gICAgICAgIHRoaXMuZG1Vc2VyID0gbnVsbDsgLy8gY2xlYXIgbGlzdGVuZXJzLCBpZiBhbnlcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpc1B1YmxpY1Jvb20oKTogYm9vbGVhbiB7XG4gICAgICAgIGNvbnN0IGpvaW5SdWxlcyA9IHRoaXMucHJvcHMucm9vbS5jdXJyZW50U3RhdGUuZ2V0U3RhdGVFdmVudHMoXCJtLnJvb20uam9pbl9ydWxlc1wiLCBcIlwiKTtcbiAgICAgICAgY29uc3Qgam9pblJ1bGUgPSBqb2luUnVsZXMgJiYgam9pblJ1bGVzLmdldENvbnRlbnQoKS5qb2luX3J1bGU7XG4gICAgICAgIHJldHVybiBqb2luUnVsZSA9PT0gJ3B1YmxpYyc7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgZG1Vc2VyKCk6IFVzZXIge1xuICAgICAgICByZXR1cm4gdGhpcy5fZG1Vc2VyO1xuICAgIH1cblxuICAgIHByaXZhdGUgc2V0IGRtVXNlcih2YWw6IFVzZXIpIHtcbiAgICAgICAgY29uc3Qgb2xkVXNlciA9IHRoaXMuX2RtVXNlcjtcbiAgICAgICAgdGhpcy5fZG1Vc2VyID0gdmFsO1xuICAgICAgICBpZiAob2xkVXNlciAmJiBvbGRVc2VyICE9PSB0aGlzLl9kbVVzZXIpIHtcbiAgICAgICAgICAgIG9sZFVzZXIub2ZmKCdVc2VyLmN1cnJlbnRseUFjdGl2ZScsIHRoaXMub25QcmVzZW5jZVVwZGF0ZSk7XG4gICAgICAgICAgICBvbGRVc2VyLm9mZignVXNlci5wcmVzZW5jZScsIHRoaXMub25QcmVzZW5jZVVwZGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2RtVXNlciAmJiBvbGRVc2VyICE9PSB0aGlzLl9kbVVzZXIpIHtcbiAgICAgICAgICAgIHRoaXMuX2RtVXNlci5vbignVXNlci5jdXJyZW50bHlBY3RpdmUnLCB0aGlzLm9uUHJlc2VuY2VVcGRhdGUpO1xuICAgICAgICAgICAgdGhpcy5fZG1Vc2VyLm9uKCdVc2VyLnByZXNlbmNlJywgdGhpcy5vblByZXNlbmNlVXBkYXRlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25Sb29tVGltZWxpbmUgPSAoZXY6IE1hdHJpeEV2ZW50LCByb29tOiBSb29tKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVW5tb3VudGVkKSByZXR1cm47XG5cbiAgICAgICAgLy8gYXBwYXJlbnRseSB0aGVzZSBjYW4gaGFwcGVuP1xuICAgICAgICBpZiAoIXJvb20pIHJldHVybjtcbiAgICAgICAgaWYgKHRoaXMucHJvcHMucm9vbS5yb29tSWQgIT09IHJvb20ucm9vbUlkKSByZXR1cm47XG5cbiAgICAgICAgaWYgKGV2LmdldFR5cGUoKSA9PT0gJ20ucm9vbS5qb2luX3J1bGVzJyB8fCBldi5nZXRUeXBlKCkgPT09ICdtLnJvb20ubWVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZSh7aWNvbjogdGhpcy5jYWxjdWxhdGVJY29uKCl9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIG9uUHJlc2VuY2VVcGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzVW5tb3VudGVkKSByZXR1cm47XG5cbiAgICAgICAgY29uc3QgbmV3SWNvbiA9IHRoaXMuZ2V0UHJlc2VuY2VJY29uKCk7XG4gICAgICAgIGlmIChuZXdJY29uICE9PSB0aGlzLnN0YXRlLmljb24pIHRoaXMuc2V0U3RhdGUoe2ljb246IG5ld0ljb259KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBnZXRQcmVzZW5jZUljb24oKTogSWNvbiB7XG4gICAgICAgIGlmICghdGhpcy5kbVVzZXIpIHJldHVybiBJY29uLk5vbmU7XG5cbiAgICAgICAgbGV0IGljb24gPSBJY29uLk5vbmU7XG5cbiAgICAgICAgY29uc3QgaXNPbmxpbmUgPSB0aGlzLmRtVXNlci5jdXJyZW50bHlBY3RpdmUgfHwgdGhpcy5kbVVzZXIucHJlc2VuY2UgPT09ICdvbmxpbmUnO1xuICAgICAgICBpZiAoaXNPbmxpbmUpIHtcbiAgICAgICAgICAgIGljb24gPSBJY29uLlByZXNlbmNlT25saW5lO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZG1Vc2VyLnByZXNlbmNlID09PSAnb2ZmbGluZScpIHtcbiAgICAgICAgICAgIGljb24gPSBJY29uLlByZXNlbmNlT2ZmbGluZTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRtVXNlci5wcmVzZW5jZSA9PT0gJ3VuYXZhaWxhYmxlJykge1xuICAgICAgICAgICAgaWNvbiA9IEljb24uUHJlc2VuY2VBd2F5O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGljb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVJY29uKCk6IEljb24ge1xuICAgICAgICBsZXQgaWNvbiA9IEljb24uTm9uZTtcblxuICAgICAgICAvLyBXZSBsb29rIGF0IHRoZSBETVJvb21NYXAgYW5kIG5vdCB0aGUgdGFnIGhlcmUgc28gdGhhdCB3ZSBkb24ndCBleGNsdWRlIERNcyBpbiBGYXZvdXJpdGVzXG4gICAgICAgIGNvbnN0IG90aGVyVXNlcklkID0gRE1Sb29tTWFwLnNoYXJlZCgpLmdldFVzZXJJZEZvclJvb21JZCh0aGlzLnByb3BzLnJvb20ucm9vbUlkKTtcbiAgICAgICAgaWYgKG90aGVyVXNlcklkICYmIHRoaXMucHJvcHMucm9vbS5nZXRKb2luZWRNZW1iZXJDb3VudCgpID09PSAyKSB7XG4gICAgICAgICAgICAvLyBUcmFjayBwcmVzZW5jZSwgaWYgYXZhaWxhYmxlXG4gICAgICAgICAgICBpZiAoaXNQcmVzZW5jZUVuYWJsZWQoKSkge1xuICAgICAgICAgICAgICAgIGlmIChvdGhlclVzZXJJZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRtVXNlciA9IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRVc2VyKG90aGVyVXNlcklkKTtcbiAgICAgICAgICAgICAgICAgICAgaWNvbiA9IHRoaXMuZ2V0UHJlc2VuY2VJY29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVHJhY2sgcHVibGljaXR5XG4gICAgICAgICAgICBpY29uID0gdGhpcy5pc1B1YmxpY1Jvb20gPyBJY29uLkdsb2JlIDogSWNvbi5Ob25lO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzV2F0Y2hpbmdUaW1lbGluZSkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvcHMucm9vbS5vbignUm9vbS50aW1lbGluZScsIHRoaXMub25Sb29tVGltZWxpbmUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNXYXRjaGluZ1RpbWVsaW5lID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaWNvbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyKCk6IFJlYWN0LlJlYWN0Tm9kZSB7XG4gICAgICAgIGxldCBiYWRnZTogUmVhY3QuUmVhY3ROb2RlO1xuICAgICAgICBpZiAodGhpcy5wcm9wcy5kaXNwbGF5QmFkZ2UpIHtcbiAgICAgICAgICAgIGJhZGdlID0gPE5vdGlmaWNhdGlvbkJhZGdlXG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uPXt0aGlzLnN0YXRlLm5vdGlmaWNhdGlvblN0YXRlfVxuICAgICAgICAgICAgICAgIGZvcmNlQ291bnQ9e3RoaXMucHJvcHMuZm9yY2VDb3VudH1cbiAgICAgICAgICAgICAgICByb29tSWQ9e3RoaXMucHJvcHMucm9vbS5yb29tSWR9XG4gICAgICAgICAgICAvPjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBpY29uO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5pY29uICE9PSBJY29uLk5vbmUpIHtcbiAgICAgICAgICAgIGljb24gPSA8VGV4dFdpdGhUb29sdGlwXG4gICAgICAgICAgICAgICAgdG9vbHRpcD17dG9vbHRpcFRleHQodGhpcy5zdGF0ZS5pY29uKX1cbiAgICAgICAgICAgICAgICBjbGFzcz17YG14X0RlY29yYXRlZFJvb21BdmF0YXJfaWNvbiBteF9EZWNvcmF0ZWRSb29tQXZhdGFyX2ljb25fJHt0aGlzLnN0YXRlLmljb24udG9Mb3dlckNhc2UoKX1gfVxuICAgICAgICAgICAgLz47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X0RlY29yYXRlZFJvb21BdmF0YXJcIiwge1xuICAgICAgICAgICAgbXhfRGVjb3JhdGVkUm9vbUF2YXRhcl9jdXRvdXQ6IGljb24sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiA8ZGl2IGNsYXNzTmFtZT17Y2xhc3Nlc30+XG4gICAgICAgICAgICA8Um9vbUF2YXRhclxuICAgICAgICAgICAgICAgIHJvb209e3RoaXMucHJvcHMucm9vbX1cbiAgICAgICAgICAgICAgICB3aWR0aD17dGhpcy5wcm9wcy5hdmF0YXJTaXplfVxuICAgICAgICAgICAgICAgIGhlaWdodD17dGhpcy5wcm9wcy5hdmF0YXJTaXplfVxuICAgICAgICAgICAgICAgIG9vYkRhdGE9e3RoaXMucHJvcHMub29iRGF0YX1cbiAgICAgICAgICAgICAgICB2aWV3QXZhdGFyT25DbGljaz17dGhpcy5wcm9wcy52aWV3QXZhdGFyT25DbGlja31cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB7aWNvbn1cbiAgICAgICAgICAgIHtiYWRnZX1cbiAgICAgICAgPC9kaXY+O1xuICAgIH1cbn1cbiJdfQ==