UNPKG

matrix-react-sdk

Version:
375 lines (314 loc) 38.9 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _react = _interopRequireDefault(require("react")); var sdk = _interopRequireWildcard(require("../../../index")); var _dispatcher = _interopRequireDefault(require("../../../dispatcher/dispatcher")); var _classnames = _interopRequireDefault(require("classnames")); var _room = require("matrix-js-sdk/src/models/room"); var _roomMember = require("matrix-js-sdk/src/models/room-member"); var _propTypes = _interopRequireDefault(require("prop-types")); var _MatrixClientPeg = require("../../../MatrixClientPeg"); var _FlairStore = _interopRequireDefault(require("../../../stores/FlairStore")); var _Permalinks = require("../../../utils/permalinks/Permalinks"); var _MatrixClientContext = _interopRequireDefault(require("../../../contexts/MatrixClientContext")); var _actions = require("../../../dispatcher/actions"); var _Media = require("../../../customisations/Media"); var _Tooltip = _interopRequireDefault(require("./Tooltip")); var _replaceableComponent = require("../../../utils/replaceableComponent"); var _dec, _class, _class2, _temp; let Pill = (_dec = (0, _replaceableComponent.replaceableComponent)("views.elements.Pill"), _dec(_class = (_temp = _class2 = class Pill extends _react.default.Component { constructor(...args) { super(...args); (0, _defineProperty2.default)(this, "state", { // ID/alias of the room/user resourceId: null, // Type of pill pillType: null, // The member related to the user pill member: null, // The group related to the group pill group: null, // The room related to the room pill room: null, // Is the user hovering the pill hover: false }); (0, _defineProperty2.default)(this, "onMouseOver", () => { this.setState({ hover: true }); }); (0, _defineProperty2.default)(this, "onMouseLeave", () => { this.setState({ hover: false }); }); (0, _defineProperty2.default)(this, "onUserPillClicked", () => { _dispatcher.default.dispatch({ action: _actions.Action.ViewUser, member: this.state.member }); }); } static roomNotifPos(text) { return text.indexOf("@room"); } static roomNotifLen() { return "@room".length; } // TODO: [REACT-WARNING] Replace with appropriate lifecycle event // eslint-disable-next-line camelcase async UNSAFE_componentWillReceiveProps(nextProps) { let resourceId; let prefix; if (nextProps.url) { if (nextProps.inMessage) { const parts = (0, _Permalinks.parseAppLocalLink)(nextProps.url); resourceId = parts.primaryEntityId; // The room/user ID prefix = parts.sigil; // The first character of prefix } else { resourceId = (0, _Permalinks.getPrimaryPermalinkEntity)(nextProps.url); prefix = resourceId ? resourceId[0] : undefined; } } const pillType = this.props.type || { '@': Pill.TYPE_USER_MENTION, '#': Pill.TYPE_ROOM_MENTION, '!': Pill.TYPE_ROOM_MENTION, '+': Pill.TYPE_GROUP_MENTION }[prefix]; let member; let group; let room; switch (pillType) { case Pill.TYPE_AT_ROOM_MENTION: { room = nextProps.room; } break; case Pill.TYPE_USER_MENTION: { const localMember = nextProps.room ? nextProps.room.getMember(resourceId) : undefined; member = localMember; if (!localMember) { member = new _roomMember.RoomMember(null, resourceId); this.doProfileLookup(resourceId, member); } } break; case Pill.TYPE_ROOM_MENTION: { const localRoom = resourceId[0] === '#' ? _MatrixClientPeg.MatrixClientPeg.get().getRooms().find(r => { return r.getCanonicalAlias() === resourceId || r.getAltAliases().includes(resourceId); }) : _MatrixClientPeg.MatrixClientPeg.get().getRoom(resourceId); room = localRoom; if (!localRoom) {// TODO: This would require a new API to resolve a room alias to // a room avatar and name. // this.doRoomProfileLookup(resourceId, member); } } break; case Pill.TYPE_GROUP_MENTION: { const cli = _MatrixClientPeg.MatrixClientPeg.get(); try { group = await _FlairStore.default.getGroupProfileCached(cli, resourceId); } catch (e) { // if FlairStore failed, fall back to just groupId group = { groupId: resourceId, avatarUrl: null, name: null }; } } } this.setState({ resourceId, pillType, member, group, room }); } componentDidMount() { this._unmounted = false; this._matrixClient = _MatrixClientPeg.MatrixClientPeg.get(); // eslint-disable-next-line new-cap this.UNSAFE_componentWillReceiveProps(this.props); // HACK: We shouldn't be calling lifecycle functions ourselves. } componentWillUnmount() { this._unmounted = true; } doProfileLookup(userId, member) { _MatrixClientPeg.MatrixClientPeg.get().getProfileInfo(userId).then(resp => { if (this._unmounted) { return; } member.name = resp.displayname; member.rawDisplayName = resp.displayname; member.events.member = { getContent: () => { return { avatar_url: resp.avatar_url }; }, getDirectionalContent: function () { return this.getContent(); } }; this.setState({ member }); }).catch(err => { console.error('Could not retrieve profile data for ' + userId + ':', err); }); } render() { const BaseAvatar = sdk.getComponent('views.avatars.BaseAvatar'); const MemberAvatar = sdk.getComponent('avatars.MemberAvatar'); const RoomAvatar = sdk.getComponent('avatars.RoomAvatar'); const resource = this.state.resourceId; let avatar = null; let linkText = resource; let pillClass; let userId; let href = this.props.url; let onClick; switch (this.state.pillType) { case Pill.TYPE_AT_ROOM_MENTION: { const room = this.props.room; if (room) { linkText = "@room"; if (this.props.shouldShowPillAvatar) { avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, { room: room, width: 16, height: 16, "aria-hidden": "true" }); } pillClass = 'mx_AtRoomPill'; } } break; case Pill.TYPE_USER_MENTION: { // If this user is not a member of this room, default to the empty member const member = this.state.member; if (member) { userId = member.userId; member.rawDisplayName = member.rawDisplayName || ''; linkText = member.rawDisplayName; if (this.props.shouldShowPillAvatar) { avatar = /*#__PURE__*/_react.default.createElement(MemberAvatar, { member: member, width: 16, height: 16, "aria-hidden": "true" }); } pillClass = 'mx_UserPill'; href = null; onClick = this.onUserPillClicked; } } break; case Pill.TYPE_ROOM_MENTION: { const room = this.state.room; if (room) { linkText = room.name || resource; if (this.props.shouldShowPillAvatar) { avatar = /*#__PURE__*/_react.default.createElement(RoomAvatar, { room: room, width: 16, height: 16, "aria-hidden": "true" }); } } pillClass = 'mx_RoomPill'; } break; case Pill.TYPE_GROUP_MENTION: { if (this.state.group) { const { avatarUrl, groupId, name } = this.state.group; linkText = groupId; if (this.props.shouldShowPillAvatar) { avatar = /*#__PURE__*/_react.default.createElement(BaseAvatar, { name: name || groupId, width: 16, height: 16, "aria-hidden": "true", url: avatarUrl ? (0, _Media.mediaFromMxc)(avatarUrl).getSquareThumbnailHttp(16) : null }); } pillClass = 'mx_GroupPill'; } } break; } const classes = (0, _classnames.default)("mx_Pill", pillClass, { "mx_UserPill_me": userId === _MatrixClientPeg.MatrixClientPeg.get().getUserId(), "mx_UserPill_selected": this.props.isSelected }); if (this.state.pillType) { const { yOffset } = this.props; let tip; if (this.state.hover && resource) { tip = /*#__PURE__*/_react.default.createElement(_Tooltip.default, { label: resource, yOffset: yOffset }); } return /*#__PURE__*/_react.default.createElement(_MatrixClientContext.default.Provider, { value: this._matrixClient }, this.props.inMessage ? /*#__PURE__*/_react.default.createElement("a", { className: classes, href: href, onClick: onClick, "data-offset-key": this.props.offsetKey, onMouseOver: this.onMouseOver, onMouseLeave: this.onMouseLeave }, avatar, linkText, tip) : /*#__PURE__*/_react.default.createElement("span", { className: classes, "data-offset-key": this.props.offsetKey, onMouseOver: this.onMouseOver, onMouseLeave: this.onMouseLeave }, avatar, linkText, tip)); } else { // Deliberately render nothing if the URL isn't recognised return null; } } }, (0, _defineProperty2.default)(_class2, "TYPE_USER_MENTION", 'TYPE_USER_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_ROOM_MENTION", 'TYPE_ROOM_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_GROUP_MENTION", 'TYPE_GROUP_MENTION'), (0, _defineProperty2.default)(_class2, "TYPE_AT_ROOM_MENTION", 'TYPE_AT_ROOM_MENTION'), (0, _defineProperty2.default)(_class2, "propTypes", { // The Type of this Pill. If url is given, this is auto-detected. type: _propTypes.default.string, // The URL to pillify (no validation is done) url: _propTypes.default.string, // Whether the pill is in a message inMessage: _propTypes.default.bool, // The room in which this pill is being rendered room: _propTypes.default.instanceOf(_room.Room), // Whether to include an avatar in the pill shouldShowPillAvatar: _propTypes.default.bool, // Whether to render this pill as if it were highlit by a selection isSelected: _propTypes.default.bool }), _temp)) || _class); var _default = Pill; exports.default = _default; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2VsZW1lbnRzL1BpbGwuanMiXSwibmFtZXMiOlsiUGlsbCIsIlJlYWN0IiwiQ29tcG9uZW50IiwicmVzb3VyY2VJZCIsInBpbGxUeXBlIiwibWVtYmVyIiwiZ3JvdXAiLCJyb29tIiwiaG92ZXIiLCJzZXRTdGF0ZSIsImRpcyIsImRpc3BhdGNoIiwiYWN0aW9uIiwiQWN0aW9uIiwiVmlld1VzZXIiLCJzdGF0ZSIsInJvb21Ob3RpZlBvcyIsInRleHQiLCJpbmRleE9mIiwicm9vbU5vdGlmTGVuIiwibGVuZ3RoIiwiVU5TQUZFX2NvbXBvbmVudFdpbGxSZWNlaXZlUHJvcHMiLCJuZXh0UHJvcHMiLCJwcmVmaXgiLCJ1cmwiLCJpbk1lc3NhZ2UiLCJwYXJ0cyIsInByaW1hcnlFbnRpdHlJZCIsInNpZ2lsIiwidW5kZWZpbmVkIiwicHJvcHMiLCJ0eXBlIiwiVFlQRV9VU0VSX01FTlRJT04iLCJUWVBFX1JPT01fTUVOVElPTiIsIlRZUEVfR1JPVVBfTUVOVElPTiIsIlRZUEVfQVRfUk9PTV9NRU5USU9OIiwibG9jYWxNZW1iZXIiLCJnZXRNZW1iZXIiLCJSb29tTWVtYmVyIiwiZG9Qcm9maWxlTG9va3VwIiwibG9jYWxSb29tIiwiTWF0cml4Q2xpZW50UGVnIiwiZ2V0IiwiZ2V0Um9vbXMiLCJmaW5kIiwiciIsImdldENhbm9uaWNhbEFsaWFzIiwiZ2V0QWx0QWxpYXNlcyIsImluY2x1ZGVzIiwiZ2V0Um9vbSIsImNsaSIsIkZsYWlyU3RvcmUiLCJnZXRHcm91cFByb2ZpbGVDYWNoZWQiLCJlIiwiZ3JvdXBJZCIsImF2YXRhclVybCIsIm5hbWUiLCJjb21wb25lbnREaWRNb3VudCIsIl91bm1vdW50ZWQiLCJfbWF0cml4Q2xpZW50IiwiY29tcG9uZW50V2lsbFVubW91bnQiLCJ1c2VySWQiLCJnZXRQcm9maWxlSW5mbyIsInRoZW4iLCJyZXNwIiwiZGlzcGxheW5hbWUiLCJyYXdEaXNwbGF5TmFtZSIsImV2ZW50cyIsImdldENvbnRlbnQiLCJhdmF0YXJfdXJsIiwiZ2V0RGlyZWN0aW9uYWxDb250ZW50IiwiY2F0Y2giLCJlcnIiLCJjb25zb2xlIiwiZXJyb3IiLCJyZW5kZXIiLCJCYXNlQXZhdGFyIiwic2RrIiwiZ2V0Q29tcG9uZW50IiwiTWVtYmVyQXZhdGFyIiwiUm9vbUF2YXRhciIsInJlc291cmNlIiwiYXZhdGFyIiwibGlua1RleHQiLCJwaWxsQ2xhc3MiLCJocmVmIiwib25DbGljayIsInNob3VsZFNob3dQaWxsQXZhdGFyIiwib25Vc2VyUGlsbENsaWNrZWQiLCJnZXRTcXVhcmVUaHVtYm5haWxIdHRwIiwiY2xhc3NlcyIsImdldFVzZXJJZCIsImlzU2VsZWN0ZWQiLCJ5T2Zmc2V0IiwidGlwIiwib2Zmc2V0S2V5Iiwib25Nb3VzZU92ZXIiLCJvbk1vdXNlTGVhdmUiLCJQcm9wVHlwZXMiLCJzdHJpbmciLCJib29sIiwiaW5zdGFuY2VPZiIsIlJvb20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7QUFlQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7OztJQUdNQSxJLFdBREwsZ0RBQXFCLHFCQUFyQixDLG1DQUFELE1BQ01BLElBRE4sU0FDbUJDLGVBQU1DLFNBRHpCLENBQ21DO0FBQUE7QUFBQTtBQUFBLGlEQTZCdkI7QUFDSjtBQUNBQyxNQUFBQSxVQUFVLEVBQUUsSUFGUjtBQUdKO0FBQ0FDLE1BQUFBLFFBQVEsRUFBRSxJQUpOO0FBTUo7QUFDQUMsTUFBQUEsTUFBTSxFQUFFLElBUEo7QUFRSjtBQUNBQyxNQUFBQSxLQUFLLEVBQUUsSUFUSDtBQVVKO0FBQ0FDLE1BQUFBLElBQUksRUFBRSxJQVhGO0FBWUo7QUFDQUMsTUFBQUEsS0FBSyxFQUFFO0FBYkgsS0E3QnVCO0FBQUEsdURBaUlqQixNQUFNO0FBQ2hCLFdBQUtDLFFBQUwsQ0FBYztBQUNWRCxRQUFBQSxLQUFLLEVBQUU7QUFERyxPQUFkO0FBR0gsS0FySThCO0FBQUEsd0RBdUloQixNQUFNO0FBQ2pCLFdBQUtDLFFBQUwsQ0FBYztBQUNWRCxRQUFBQSxLQUFLLEVBQUU7QUFERyxPQUFkO0FBR0gsS0EzSThCO0FBQUEsNkRBa0tYLE1BQU07QUFDdEJFLDBCQUFJQyxRQUFKLENBQWE7QUFDVEMsUUFBQUEsTUFBTSxFQUFFQyxnQkFBT0MsUUFETjtBQUVUVCxRQUFBQSxNQUFNLEVBQUUsS0FBS1UsS0FBTCxDQUFXVjtBQUZWLE9BQWI7QUFJSCxLQXZLOEI7QUFBQTs7QUFDL0IsU0FBT1csWUFBUCxDQUFvQkMsSUFBcEIsRUFBMEI7QUFDdEIsV0FBT0EsSUFBSSxDQUFDQyxPQUFMLENBQWEsT0FBYixDQUFQO0FBQ0g7O0FBRUQsU0FBT0MsWUFBUCxHQUFzQjtBQUNsQixXQUFPLFFBQVFDLE1BQWY7QUFDSDs7QUFzQ0Q7QUFDQTtBQUNBLFFBQU1DLGdDQUFOLENBQXVDQyxTQUF2QyxFQUFrRDtBQUM5QyxRQUFJbkIsVUFBSjtBQUNBLFFBQUlvQixNQUFKOztBQUVBLFFBQUlELFNBQVMsQ0FBQ0UsR0FBZCxFQUFtQjtBQUNmLFVBQUlGLFNBQVMsQ0FBQ0csU0FBZCxFQUF5QjtBQUNyQixjQUFNQyxLQUFLLEdBQUcsbUNBQWtCSixTQUFTLENBQUNFLEdBQTVCLENBQWQ7QUFDQXJCLFFBQUFBLFVBQVUsR0FBR3VCLEtBQUssQ0FBQ0MsZUFBbkIsQ0FGcUIsQ0FFZTs7QUFDcENKLFFBQUFBLE1BQU0sR0FBR0csS0FBSyxDQUFDRSxLQUFmLENBSHFCLENBR0M7QUFDekIsT0FKRCxNQUlPO0FBQ0h6QixRQUFBQSxVQUFVLEdBQUcsMkNBQTBCbUIsU0FBUyxDQUFDRSxHQUFwQyxDQUFiO0FBQ0FELFFBQUFBLE1BQU0sR0FBR3BCLFVBQVUsR0FBR0EsVUFBVSxDQUFDLENBQUQsQ0FBYixHQUFtQjBCLFNBQXRDO0FBQ0g7QUFDSjs7QUFFRCxVQUFNekIsUUFBUSxHQUFHLEtBQUswQixLQUFMLENBQVdDLElBQVgsSUFBbUI7QUFDaEMsV0FBSy9CLElBQUksQ0FBQ2dDLGlCQURzQjtBQUVoQyxXQUFLaEMsSUFBSSxDQUFDaUMsaUJBRnNCO0FBR2hDLFdBQUtqQyxJQUFJLENBQUNpQyxpQkFIc0I7QUFJaEMsV0FBS2pDLElBQUksQ0FBQ2tDO0FBSnNCLE1BS2xDWCxNQUxrQyxDQUFwQztBQU9BLFFBQUlsQixNQUFKO0FBQ0EsUUFBSUMsS0FBSjtBQUNBLFFBQUlDLElBQUo7O0FBQ0EsWUFBUUgsUUFBUjtBQUNJLFdBQUtKLElBQUksQ0FBQ21DLG9CQUFWO0FBQWdDO0FBQzVCNUIsVUFBQUEsSUFBSSxHQUFHZSxTQUFTLENBQUNmLElBQWpCO0FBQ0g7QUFDRzs7QUFDSixXQUFLUCxJQUFJLENBQUNnQyxpQkFBVjtBQUE2QjtBQUN6QixnQkFBTUksV0FBVyxHQUFHZCxTQUFTLENBQUNmLElBQVYsR0FBaUJlLFNBQVMsQ0FBQ2YsSUFBVixDQUFlOEIsU0FBZixDQUF5QmxDLFVBQXpCLENBQWpCLEdBQXdEMEIsU0FBNUU7QUFDQXhCLFVBQUFBLE1BQU0sR0FBRytCLFdBQVQ7O0FBQ0EsY0FBSSxDQUFDQSxXQUFMLEVBQWtCO0FBQ2QvQixZQUFBQSxNQUFNLEdBQUcsSUFBSWlDLHNCQUFKLENBQWUsSUFBZixFQUFxQm5DLFVBQXJCLENBQVQ7QUFDQSxpQkFBS29DLGVBQUwsQ0FBcUJwQyxVQUFyQixFQUFpQ0UsTUFBakM7QUFDSDtBQUNKO0FBQ0c7O0FBQ0osV0FBS0wsSUFBSSxDQUFDaUMsaUJBQVY7QUFBNkI7QUFDekIsZ0JBQU1PLFNBQVMsR0FBR3JDLFVBQVUsQ0FBQyxDQUFELENBQVYsS0FBa0IsR0FBbEIsR0FDZHNDLGlDQUFnQkMsR0FBaEIsR0FBc0JDLFFBQXRCLEdBQWlDQyxJQUFqQyxDQUF1Q0MsQ0FBRCxJQUFPO0FBQ3pDLG1CQUFPQSxDQUFDLENBQUNDLGlCQUFGLE9BQTBCM0MsVUFBMUIsSUFDQTBDLENBQUMsQ0FBQ0UsYUFBRixHQUFrQkMsUUFBbEIsQ0FBMkI3QyxVQUEzQixDQURQO0FBRUgsV0FIRCxDQURjLEdBSVRzQyxpQ0FBZ0JDLEdBQWhCLEdBQXNCTyxPQUF0QixDQUE4QjlDLFVBQTlCLENBSlQ7QUFLQUksVUFBQUEsSUFBSSxHQUFHaUMsU0FBUDs7QUFDQSxjQUFJLENBQUNBLFNBQUwsRUFBZ0IsQ0FDWjtBQUNBO0FBQ0E7QUFDSDtBQUNKO0FBQ0c7O0FBQ0osV0FBS3hDLElBQUksQ0FBQ2tDLGtCQUFWO0FBQThCO0FBQzFCLGdCQUFNZ0IsR0FBRyxHQUFHVCxpQ0FBZ0JDLEdBQWhCLEVBQVo7O0FBRUEsY0FBSTtBQUNBcEMsWUFBQUEsS0FBSyxHQUFHLE1BQU02QyxvQkFBV0MscUJBQVgsQ0FBaUNGLEdBQWpDLEVBQXNDL0MsVUFBdEMsQ0FBZDtBQUNILFdBRkQsQ0FFRSxPQUFPa0QsQ0FBUCxFQUFVO0FBQUU7QUFDVi9DLFlBQUFBLEtBQUssR0FBRztBQUNKZ0QsY0FBQUEsT0FBTyxFQUFFbkQsVUFETDtBQUVKb0QsY0FBQUEsU0FBUyxFQUFFLElBRlA7QUFHSkMsY0FBQUEsSUFBSSxFQUFFO0FBSEYsYUFBUjtBQUtIO0FBQ0o7QUF4Q0w7O0FBMENBLFNBQUsvQyxRQUFMLENBQWM7QUFBQ04sTUFBQUEsVUFBRDtBQUFhQyxNQUFBQSxRQUFiO0FBQXVCQyxNQUFBQSxNQUF2QjtBQUErQkMsTUFBQUEsS0FBL0I7QUFBc0NDLE1BQUFBO0FBQXRDLEtBQWQ7QUFDSDs7QUFFRGtELEVBQUFBLGlCQUFpQixHQUFHO0FBQ2hCLFNBQUtDLFVBQUwsR0FBa0IsS0FBbEI7QUFDQSxTQUFLQyxhQUFMLEdBQXFCbEIsaUNBQWdCQyxHQUFoQixFQUFyQixDQUZnQixDQUloQjs7QUFDQSxTQUFLckIsZ0NBQUwsQ0FBc0MsS0FBS1MsS0FBM0MsRUFMZ0IsQ0FLbUM7QUFDdEQ7O0FBRUQ4QixFQUFBQSxvQkFBb0IsR0FBRztBQUNuQixTQUFLRixVQUFMLEdBQWtCLElBQWxCO0FBQ0g7O0FBY0RuQixFQUFBQSxlQUFlLENBQUNzQixNQUFELEVBQVN4RCxNQUFULEVBQWlCO0FBQzVCb0MscUNBQWdCQyxHQUFoQixHQUFzQm9CLGNBQXRCLENBQXFDRCxNQUFyQyxFQUE2Q0UsSUFBN0MsQ0FBbURDLElBQUQsSUFBVTtBQUN4RCxVQUFJLEtBQUtOLFVBQVQsRUFBcUI7QUFDakI7QUFDSDs7QUFDRHJELE1BQUFBLE1BQU0sQ0FBQ21ELElBQVAsR0FBY1EsSUFBSSxDQUFDQyxXQUFuQjtBQUNBNUQsTUFBQUEsTUFBTSxDQUFDNkQsY0FBUCxHQUF3QkYsSUFBSSxDQUFDQyxXQUE3QjtBQUNBNUQsTUFBQUEsTUFBTSxDQUFDOEQsTUFBUCxDQUFjOUQsTUFBZCxHQUF1QjtBQUNuQitELFFBQUFBLFVBQVUsRUFBRSxNQUFNO0FBQ2QsaUJBQU87QUFBQ0MsWUFBQUEsVUFBVSxFQUFFTCxJQUFJLENBQUNLO0FBQWxCLFdBQVA7QUFDSCxTQUhrQjtBQUluQkMsUUFBQUEscUJBQXFCLEVBQUUsWUFBVztBQUM5QixpQkFBTyxLQUFLRixVQUFMLEVBQVA7QUFDSDtBQU5rQixPQUF2QjtBQVFBLFdBQUszRCxRQUFMLENBQWM7QUFBQ0osUUFBQUE7QUFBRCxPQUFkO0FBQ0gsS0FmRCxFQWVHa0UsS0FmSCxDQWVVQyxHQUFELElBQVM7QUFDZEMsTUFBQUEsT0FBTyxDQUFDQyxLQUFSLENBQWMseUNBQXlDYixNQUF6QyxHQUFrRCxHQUFoRSxFQUFxRVcsR0FBckU7QUFDSCxLQWpCRDtBQWtCSDs7QUFTREcsRUFBQUEsTUFBTSxHQUFHO0FBQ0wsVUFBTUMsVUFBVSxHQUFHQyxHQUFHLENBQUNDLFlBQUosQ0FBaUIsMEJBQWpCLENBQW5CO0FBQ0EsVUFBTUMsWUFBWSxHQUFHRixHQUFHLENBQUNDLFlBQUosQ0FBaUIsc0JBQWpCLENBQXJCO0FBQ0EsVUFBTUUsVUFBVSxHQUFHSCxHQUFHLENBQUNDLFlBQUosQ0FBaUIsb0JBQWpCLENBQW5CO0FBRUEsVUFBTUcsUUFBUSxHQUFHLEtBQUtsRSxLQUFMLENBQVdaLFVBQTVCO0FBRUEsUUFBSStFLE1BQU0sR0FBRyxJQUFiO0FBQ0EsUUFBSUMsUUFBUSxHQUFHRixRQUFmO0FBQ0EsUUFBSUcsU0FBSjtBQUNBLFFBQUl2QixNQUFKO0FBQ0EsUUFBSXdCLElBQUksR0FBRyxLQUFLdkQsS0FBTCxDQUFXTixHQUF0QjtBQUNBLFFBQUk4RCxPQUFKOztBQUNBLFlBQVEsS0FBS3ZFLEtBQUwsQ0FBV1gsUUFBbkI7QUFDSSxXQUFLSixJQUFJLENBQUNtQyxvQkFBVjtBQUFnQztBQUM1QixnQkFBTTVCLElBQUksR0FBRyxLQUFLdUIsS0FBTCxDQUFXdkIsSUFBeEI7O0FBQ0EsY0FBSUEsSUFBSixFQUFVO0FBQ040RSxZQUFBQSxRQUFRLEdBQUcsT0FBWDs7QUFDQSxnQkFBSSxLQUFLckQsS0FBTCxDQUFXeUQsb0JBQWYsRUFBcUM7QUFDakNMLGNBQUFBLE1BQU0sZ0JBQUcsNkJBQUMsVUFBRDtBQUFZLGdCQUFBLElBQUksRUFBRTNFLElBQWxCO0FBQXdCLGdCQUFBLEtBQUssRUFBRSxFQUEvQjtBQUFtQyxnQkFBQSxNQUFNLEVBQUUsRUFBM0M7QUFBK0MsK0JBQVk7QUFBM0QsZ0JBQVQ7QUFDSDs7QUFDRDZFLFlBQUFBLFNBQVMsR0FBRyxlQUFaO0FBQ0g7QUFDSjtBQUNHOztBQUNKLFdBQUtwRixJQUFJLENBQUNnQyxpQkFBVjtBQUE2QjtBQUN6QjtBQUNBLGdCQUFNM0IsTUFBTSxHQUFHLEtBQUtVLEtBQUwsQ0FBV1YsTUFBMUI7O0FBQ0EsY0FBSUEsTUFBSixFQUFZO0FBQ1J3RCxZQUFBQSxNQUFNLEdBQUd4RCxNQUFNLENBQUN3RCxNQUFoQjtBQUNBeEQsWUFBQUEsTUFBTSxDQUFDNkQsY0FBUCxHQUF3QjdELE1BQU0sQ0FBQzZELGNBQVAsSUFBeUIsRUFBakQ7QUFDQWlCLFlBQUFBLFFBQVEsR0FBRzlFLE1BQU0sQ0FBQzZELGNBQWxCOztBQUNBLGdCQUFJLEtBQUtwQyxLQUFMLENBQVd5RCxvQkFBZixFQUFxQztBQUNqQ0wsY0FBQUEsTUFBTSxnQkFBRyw2QkFBQyxZQUFEO0FBQWMsZ0JBQUEsTUFBTSxFQUFFN0UsTUFBdEI7QUFBOEIsZ0JBQUEsS0FBSyxFQUFFLEVBQXJDO0FBQXlDLGdCQUFBLE1BQU0sRUFBRSxFQUFqRDtBQUFxRCwrQkFBWTtBQUFqRSxnQkFBVDtBQUNIOztBQUNEK0UsWUFBQUEsU0FBUyxHQUFHLGFBQVo7QUFDQUMsWUFBQUEsSUFBSSxHQUFHLElBQVA7QUFDQUMsWUFBQUEsT0FBTyxHQUFHLEtBQUtFLGlCQUFmO0FBQ0g7QUFDSjtBQUNHOztBQUNKLFdBQUt4RixJQUFJLENBQUNpQyxpQkFBVjtBQUE2QjtBQUN6QixnQkFBTTFCLElBQUksR0FBRyxLQUFLUSxLQUFMLENBQVdSLElBQXhCOztBQUNBLGNBQUlBLElBQUosRUFBVTtBQUNONEUsWUFBQUEsUUFBUSxHQUFHNUUsSUFBSSxDQUFDaUQsSUFBTCxJQUFheUIsUUFBeEI7O0FBQ0EsZ0JBQUksS0FBS25ELEtBQUwsQ0FBV3lELG9CQUFmLEVBQXFDO0FBQ2pDTCxjQUFBQSxNQUFNLGdCQUFHLDZCQUFDLFVBQUQ7QUFBWSxnQkFBQSxJQUFJLEVBQUUzRSxJQUFsQjtBQUF3QixnQkFBQSxLQUFLLEVBQUUsRUFBL0I7QUFBbUMsZ0JBQUEsTUFBTSxFQUFFLEVBQTNDO0FBQStDLCtCQUFZO0FBQTNELGdCQUFUO0FBQ0g7QUFDSjs7QUFDRDZFLFVBQUFBLFNBQVMsR0FBRyxhQUFaO0FBQ0g7QUFDRzs7QUFDSixXQUFLcEYsSUFBSSxDQUFDa0Msa0JBQVY7QUFBOEI7QUFDMUIsY0FBSSxLQUFLbkIsS0FBTCxDQUFXVCxLQUFmLEVBQXNCO0FBQ2xCLGtCQUFNO0FBQUNpRCxjQUFBQSxTQUFEO0FBQVlELGNBQUFBLE9BQVo7QUFBcUJFLGNBQUFBO0FBQXJCLGdCQUE2QixLQUFLekMsS0FBTCxDQUFXVCxLQUE5QztBQUVBNkUsWUFBQUEsUUFBUSxHQUFHN0IsT0FBWDs7QUFDQSxnQkFBSSxLQUFLeEIsS0FBTCxDQUFXeUQsb0JBQWYsRUFBcUM7QUFDakNMLGNBQUFBLE1BQU0sZ0JBQUcsNkJBQUMsVUFBRDtBQUNMLGdCQUFBLElBQUksRUFBRTFCLElBQUksSUFBSUYsT0FEVDtBQUNrQixnQkFBQSxLQUFLLEVBQUUsRUFEekI7QUFDNkIsZ0JBQUEsTUFBTSxFQUFFLEVBRHJDO0FBQ3lDLCtCQUFZLE1BRHJEO0FBRUwsZ0JBQUEsR0FBRyxFQUFFQyxTQUFTLEdBQUcseUJBQWFBLFNBQWIsRUFBd0JrQyxzQkFBeEIsQ0FBK0MsRUFBL0MsQ0FBSCxHQUF3RDtBQUZqRSxnQkFBVDtBQUdIOztBQUNETCxZQUFBQSxTQUFTLEdBQUcsY0FBWjtBQUNIO0FBQ0o7QUFDRztBQXBEUjs7QUF1REEsVUFBTU0sT0FBTyxHQUFHLHlCQUFXLFNBQVgsRUFBc0JOLFNBQXRCLEVBQWlDO0FBQzdDLHdCQUFrQnZCLE1BQU0sS0FBS3BCLGlDQUFnQkMsR0FBaEIsR0FBc0JpRCxTQUF0QixFQURnQjtBQUU3Qyw4QkFBd0IsS0FBSzdELEtBQUwsQ0FBVzhEO0FBRlUsS0FBakMsQ0FBaEI7O0FBS0EsUUFBSSxLQUFLN0UsS0FBTCxDQUFXWCxRQUFmLEVBQXlCO0FBQ3JCLFlBQU07QUFBQ3lGLFFBQUFBO0FBQUQsVUFBWSxLQUFLL0QsS0FBdkI7QUFFQSxVQUFJZ0UsR0FBSjs7QUFDQSxVQUFJLEtBQUsvRSxLQUFMLENBQVdQLEtBQVgsSUFBb0J5RSxRQUF4QixFQUFrQztBQUM5QmEsUUFBQUEsR0FBRyxnQkFBRyw2QkFBQyxnQkFBRDtBQUFTLFVBQUEsS0FBSyxFQUFFYixRQUFoQjtBQUEwQixVQUFBLE9BQU8sRUFBRVk7QUFBbkMsVUFBTjtBQUNIOztBQUVELDBCQUFPLDZCQUFDLDRCQUFELENBQXFCLFFBQXJCO0FBQThCLFFBQUEsS0FBSyxFQUFFLEtBQUtsQztBQUExQyxTQUNELEtBQUs3QixLQUFMLENBQVdMLFNBQVgsZ0JBQ0U7QUFDSSxRQUFBLFNBQVMsRUFBRWlFLE9BRGY7QUFFSSxRQUFBLElBQUksRUFBRUwsSUFGVjtBQUdJLFFBQUEsT0FBTyxFQUFFQyxPQUhiO0FBSUksMkJBQWlCLEtBQUt4RCxLQUFMLENBQVdpRSxTQUpoQztBQUtJLFFBQUEsV0FBVyxFQUFFLEtBQUtDLFdBTHRCO0FBTUksUUFBQSxZQUFZLEVBQUUsS0FBS0M7QUFOdkIsU0FRTWYsTUFSTixFQVNNQyxRQVROLEVBVU1XLEdBVk4sQ0FERixnQkFhRTtBQUNJLFFBQUEsU0FBUyxFQUFFSixPQURmO0FBRUksMkJBQWlCLEtBQUs1RCxLQUFMLENBQVdpRSxTQUZoQztBQUdJLFFBQUEsV0FBVyxFQUFFLEtBQUtDLFdBSHRCO0FBSUksUUFBQSxZQUFZLEVBQUUsS0FBS0M7QUFKdkIsU0FNTWYsTUFOTixFQU9NQyxRQVBOLEVBUU1XLEdBUk4sQ0FkRCxDQUFQO0FBeUJILEtBakNELE1BaUNPO0FBQ0g7QUFDQSxhQUFPLElBQVA7QUFDSDtBQUNKOztBQXZSOEIsQyw4REFTSixtQiwrREFDQSxtQixnRUFDQyxvQixrRUFDRSxzQix1REFFWDtBQUNmO0FBQ0EvRCxFQUFBQSxJQUFJLEVBQUVtRSxtQkFBVUMsTUFGRDtBQUdmO0FBQ0EzRSxFQUFBQSxHQUFHLEVBQUUwRSxtQkFBVUMsTUFKQTtBQUtmO0FBQ0ExRSxFQUFBQSxTQUFTLEVBQUV5RSxtQkFBVUUsSUFOTjtBQU9mO0FBQ0E3RixFQUFBQSxJQUFJLEVBQUUyRixtQkFBVUcsVUFBVixDQUFxQkMsVUFBckIsQ0FSUztBQVNmO0FBQ0FmLEVBQUFBLG9CQUFvQixFQUFFVyxtQkFBVUUsSUFWakI7QUFXZjtBQUNBUixFQUFBQSxVQUFVLEVBQUVNLG1CQUFVRTtBQVpQLEM7ZUE0UVJwRyxJIiwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDE3IC0gMjAxOSwgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xueW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG5cbiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcblxuVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG5TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG5saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiovXG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0ICogYXMgc2RrIGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCBkaXMgZnJvbSAnLi4vLi4vLi4vZGlzcGF0Y2hlci9kaXNwYXRjaGVyJztcbmltcG9ydCBjbGFzc05hbWVzIGZyb20gJ2NsYXNzbmFtZXMnO1xuaW1wb3J0IHsgUm9vbSB9IGZyb20gJ21hdHJpeC1qcy1zZGsvc3JjL21vZGVscy9yb29tJztcbmltcG9ydCB7IFJvb21NZW1iZXIgfSBmcm9tICdtYXRyaXgtanMtc2RrL3NyYy9tb2RlbHMvcm9vbS1tZW1iZXInO1xuaW1wb3J0IFByb3BUeXBlcyBmcm9tICdwcm9wLXR5cGVzJztcbmltcG9ydCB7TWF0cml4Q2xpZW50UGVnfSBmcm9tICcuLi8uLi8uLi9NYXRyaXhDbGllbnRQZWcnO1xuaW1wb3J0IEZsYWlyU3RvcmUgZnJvbSBcIi4uLy4uLy4uL3N0b3Jlcy9GbGFpclN0b3JlXCI7XG5pbXBvcnQge2dldFByaW1hcnlQZXJtYWxpbmtFbnRpdHksIHBhcnNlQXBwTG9jYWxMaW5rfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcGVybWFsaW5rcy9QZXJtYWxpbmtzXCI7XG5pbXBvcnQgTWF0cml4Q2xpZW50Q29udGV4dCBmcm9tIFwiLi4vLi4vLi4vY29udGV4dHMvTWF0cml4Q2xpZW50Q29udGV4dFwiO1xuaW1wb3J0IHtBY3Rpb259IGZyb20gXCIuLi8uLi8uLi9kaXNwYXRjaGVyL2FjdGlvbnNcIjtcbmltcG9ydCB7bWVkaWFGcm9tTXhjfSBmcm9tIFwiLi4vLi4vLi4vY3VzdG9taXNhdGlvbnMvTWVkaWFcIjtcbmltcG9ydCBUb29sdGlwIGZyb20gJy4vVG9vbHRpcCc7XG5pbXBvcnQge3JlcGxhY2VhYmxlQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvcmVwbGFjZWFibGVDb21wb25lbnRcIjtcblxuQHJlcGxhY2VhYmxlQ29tcG9uZW50KFwidmlld3MuZWxlbWVudHMuUGlsbFwiKVxuY2xhc3MgUGlsbCBleHRlbmRzIFJlYWN0LkNvbXBvbmVudCB7XG4gICAgc3RhdGljIHJvb21Ob3RpZlBvcyh0ZXh0KSB7XG4gICAgICAgIHJldHVybiB0ZXh0LmluZGV4T2YoXCJAcm9vbVwiKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgcm9vbU5vdGlmTGVuKCkge1xuICAgICAgICByZXR1cm4gXCJAcm9vbVwiLmxlbmd0aDtcbiAgICB9XG5cbiAgICBzdGF0aWMgVFlQRV9VU0VSX01FTlRJT04gPSAnVFlQRV9VU0VSX01FTlRJT04nO1xuICAgIHN0YXRpYyBUWVBFX1JPT01fTUVOVElPTiA9ICdUWVBFX1JPT01fTUVOVElPTic7XG4gICAgc3RhdGljIFRZUEVfR1JPVVBfTUVOVElPTiA9ICdUWVBFX0dST1VQX01FTlRJT04nO1xuICAgIHN0YXRpYyBUWVBFX0FUX1JPT01fTUVOVElPTiA9ICdUWVBFX0FUX1JPT01fTUVOVElPTic7IC8vICdAcm9vbScgbWVudGlvblxuXG4gICAgc3RhdGljIHByb3BUeXBlcyA9IHtcbiAgICAgICAgLy8gVGhlIFR5cGUgb2YgdGhpcyBQaWxsLiBJZiB1cmwgaXMgZ2l2ZW4sIHRoaXMgaXMgYXV0by1kZXRlY3RlZC5cbiAgICAgICAgdHlwZTogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgLy8gVGhlIFVSTCB0byBwaWxsaWZ5IChubyB2YWxpZGF0aW9uIGlzIGRvbmUpXG4gICAgICAgIHVybDogUHJvcFR5cGVzLnN0cmluZyxcbiAgICAgICAgLy8gV2hldGhlciB0aGUgcGlsbCBpcyBpbiBhIG1lc3NhZ2VcbiAgICAgICAgaW5NZXNzYWdlOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgLy8gVGhlIHJvb20gaW4gd2hpY2ggdGhpcyBwaWxsIGlzIGJlaW5nIHJlbmRlcmVkXG4gICAgICAgIHJvb206IFByb3BUeXBlcy5pbnN0YW5jZU9mKFJvb20pLFxuICAgICAgICAvLyBXaGV0aGVyIHRvIGluY2x1ZGUgYW4gYXZhdGFyIGluIHRoZSBwaWxsXG4gICAgICAgIHNob3VsZFNob3dQaWxsQXZhdGFyOiBQcm9wVHlwZXMuYm9vbCxcbiAgICAgICAgLy8gV2hldGhlciB0byByZW5kZXIgdGhpcyBwaWxsIGFzIGlmIGl0IHdlcmUgaGlnaGxpdCBieSBhIHNlbGVjdGlvblxuICAgICAgICBpc1NlbGVjdGVkOiBQcm9wVHlwZXMuYm9vbCxcbiAgICB9O1xuXG4gICAgc3RhdGUgPSB7XG4gICAgICAgIC8vIElEL2FsaWFzIG9mIHRoZSByb29tL3VzZXJcbiAgICAgICAgcmVzb3VyY2VJZDogbnVsbCxcbiAgICAgICAgLy8gVHlwZSBvZiBwaWxsXG4gICAgICAgIHBpbGxUeXBlOiBudWxsLFxuXG4gICAgICAgIC8vIFRoZSBtZW1iZXIgcmVsYXRlZCB0byB0aGUgdXNlciBwaWxsXG4gICAgICAgIG1lbWJlcjogbnVsbCxcbiAgICAgICAgLy8gVGhlIGdyb3VwIHJlbGF0ZWQgdG8gdGhlIGdyb3VwIHBpbGxcbiAgICAgICAgZ3JvdXA6IG51bGwsXG4gICAgICAgIC8vIFRoZSByb29tIHJlbGF0ZWQgdG8gdGhlIHJvb20gcGlsbFxuICAgICAgICByb29tOiBudWxsLFxuICAgICAgICAvLyBJcyB0aGUgdXNlciBob3ZlcmluZyB0aGUgcGlsbFxuICAgICAgICBob3ZlcjogZmFsc2UsXG4gICAgfTtcblxuICAgIC8vIFRPRE86IFtSRUFDVC1XQVJOSU5HXSBSZXBsYWNlIHdpdGggYXBwcm9wcmlhdGUgbGlmZWN5Y2xlIGV2ZW50XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNhbWVsY2FzZVxuICAgIGFzeW5jIFVOU0FGRV9jb21wb25lbnRXaWxsUmVjZWl2ZVByb3BzKG5leHRQcm9wcykge1xuICAgICAgICBsZXQgcmVzb3VyY2VJZDtcbiAgICAgICAgbGV0IHByZWZpeDtcblxuICAgICAgICBpZiAobmV4dFByb3BzLnVybCkge1xuICAgICAgICAgICAgaWYgKG5leHRQcm9wcy5pbk1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJ0cyA9IHBhcnNlQXBwTG9jYWxMaW5rKG5leHRQcm9wcy51cmwpO1xuICAgICAgICAgICAgICAgIHJlc291cmNlSWQgPSBwYXJ0cy5wcmltYXJ5RW50aXR5SWQ7IC8vIFRoZSByb29tL3VzZXIgSURcbiAgICAgICAgICAgICAgICBwcmVmaXggPSBwYXJ0cy5zaWdpbDsgLy8gVGhlIGZpcnN0IGNoYXJhY3RlciBvZiBwcmVmaXhcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb3VyY2VJZCA9IGdldFByaW1hcnlQZXJtYWxpbmtFbnRpdHkobmV4dFByb3BzLnVybCk7XG4gICAgICAgICAgICAgICAgcHJlZml4ID0gcmVzb3VyY2VJZCA/IHJlc291cmNlSWRbMF0gOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBwaWxsVHlwZSA9IHRoaXMucHJvcHMudHlwZSB8fCB7XG4gICAgICAgICAgICAnQCc6IFBpbGwuVFlQRV9VU0VSX01FTlRJT04sXG4gICAgICAgICAgICAnIyc6IFBpbGwuVFlQRV9ST09NX01FTlRJT04sXG4gICAgICAgICAgICAnISc6IFBpbGwuVFlQRV9ST09NX01FTlRJT04sXG4gICAgICAgICAgICAnKyc6IFBpbGwuVFlQRV9HUk9VUF9NRU5USU9OLFxuICAgICAgICB9W3ByZWZpeF07XG5cbiAgICAgICAgbGV0IG1lbWJlcjtcbiAgICAgICAgbGV0IGdyb3VwO1xuICAgICAgICBsZXQgcm9vbTtcbiAgICAgICAgc3dpdGNoIChwaWxsVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfQVRfUk9PTV9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgcm9vbSA9IG5leHRQcm9wcy5yb29tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfVVNFUl9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbG9jYWxNZW1iZXIgPSBuZXh0UHJvcHMucm9vbSA/IG5leHRQcm9wcy5yb29tLmdldE1lbWJlcihyZXNvdXJjZUlkKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBtZW1iZXIgPSBsb2NhbE1lbWJlcjtcbiAgICAgICAgICAgICAgICBpZiAoIWxvY2FsTWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIG1lbWJlciA9IG5ldyBSb29tTWVtYmVyKG51bGwsIHJlc291cmNlSWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRvUHJvZmlsZUxvb2t1cChyZXNvdXJjZUlkLCBtZW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGlsbC5UWVBFX1JPT01fTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGxvY2FsUm9vbSA9IHJlc291cmNlSWRbMF0gPT09ICcjJyA/XG4gICAgICAgICAgICAgICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRSb29tcygpLmZpbmQoKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByLmdldENhbm9uaWNhbEFsaWFzKCkgPT09IHJlc291cmNlSWQgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldEFsdEFsaWFzZXMoKS5pbmNsdWRlcyhyZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgfSkgOiBNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0Um9vbShyZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICByb29tID0gbG9jYWxSb29tO1xuICAgICAgICAgICAgICAgIGlmICghbG9jYWxSb29tKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgd291bGQgcmVxdWlyZSBhIG5ldyBBUEkgdG8gcmVzb2x2ZSBhIHJvb20gYWxpYXMgdG9cbiAgICAgICAgICAgICAgICAgICAgLy8gYSByb29tIGF2YXRhciBhbmQgbmFtZS5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kb1Jvb21Qcm9maWxlTG9va3VwKHJlc291cmNlSWQsIG1lbWJlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfR1JPVVBfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNsaSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKTtcblxuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0gYXdhaXQgRmxhaXJTdG9yZS5nZXRHcm91cFByb2ZpbGVDYWNoZWQoY2xpLCByZXNvdXJjZUlkKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IC8vIGlmIEZsYWlyU3RvcmUgZmFpbGVkLCBmYWxsIGJhY2sgdG8ganVzdCBncm91cElkXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBJZDogcmVzb3VyY2VJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhclVybDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3Jlc291cmNlSWQsIHBpbGxUeXBlLCBtZW1iZXIsIGdyb3VwLCByb29tfSk7XG4gICAgfVxuXG4gICAgY29tcG9uZW50RGlkTW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9tYXRyaXhDbGllbnQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5ldy1jYXBcbiAgICAgICAgdGhpcy5VTlNBRkVfY29tcG9uZW50V2lsbFJlY2VpdmVQcm9wcyh0aGlzLnByb3BzKTsgLy8gSEFDSzogV2Ugc2hvdWxkbid0IGJlIGNhbGxpbmcgbGlmZWN5Y2xlIGZ1bmN0aW9ucyBvdXJzZWx2ZXMuXG4gICAgfVxuXG4gICAgY29tcG9uZW50V2lsbFVubW91bnQoKSB7XG4gICAgICAgIHRoaXMuX3VubW91bnRlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgb25Nb3VzZU92ZXIgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaG92ZXI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBvbk1vdXNlTGVhdmUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe1xuICAgICAgICAgICAgaG92ZXI6IGZhbHNlLFxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgZG9Qcm9maWxlTG9va3VwKHVzZXJJZCwgbWVtYmVyKSB7XG4gICAgICAgIE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRQcm9maWxlSW5mbyh1c2VySWQpLnRoZW4oKHJlc3ApID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLl91bm1vdW50ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtZW1iZXIubmFtZSA9IHJlc3AuZGlzcGxheW5hbWU7XG4gICAgICAgICAgICBtZW1iZXIucmF3RGlzcGxheU5hbWUgPSByZXNwLmRpc3BsYXluYW1lO1xuICAgICAgICAgICAgbWVtYmVyLmV2ZW50cy5tZW1iZXIgPSB7XG4gICAgICAgICAgICAgICAgZ2V0Q29udGVudDogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2F2YXRhcl91cmw6IHJlc3AuYXZhdGFyX3VybH07XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXREaXJlY3Rpb25hbENvbnRlbnQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICB0aGlzLnNldFN0YXRlKHttZW1iZXJ9KTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ291bGQgbm90IHJldHJpZXZlIHByb2ZpbGUgZGF0YSBmb3IgJyArIHVzZXJJZCArICc6JywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25Vc2VyUGlsbENsaWNrZWQgPSAoKSA9PiB7XG4gICAgICAgIGRpcy5kaXNwYXRjaCh7XG4gICAgICAgICAgICBhY3Rpb246IEFjdGlvbi5WaWV3VXNlcixcbiAgICAgICAgICAgIG1lbWJlcjogdGhpcy5zdGF0ZS5tZW1iZXIsXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IEJhc2VBdmF0YXIgPSBzZGsuZ2V0Q29tcG9uZW50KCd2aWV3cy5hdmF0YXJzLkJhc2VBdmF0YXInKTtcbiAgICAgICAgY29uc3QgTWVtYmVyQXZhdGFyID0gc2RrLmdldENvbXBvbmVudCgnYXZhdGFycy5NZW1iZXJBdmF0YXInKTtcbiAgICAgICAgY29uc3QgUm9vbUF2YXRhciA9IHNkay5nZXRDb21wb25lbnQoJ2F2YXRhcnMuUm9vbUF2YXRhcicpO1xuXG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gdGhpcy5zdGF0ZS5yZXNvdXJjZUlkO1xuXG4gICAgICAgIGxldCBhdmF0YXIgPSBudWxsO1xuICAgICAgICBsZXQgbGlua1RleHQgPSByZXNvdXJjZTtcbiAgICAgICAgbGV0IHBpbGxDbGFzcztcbiAgICAgICAgbGV0IHVzZXJJZDtcbiAgICAgICAgbGV0IGhyZWYgPSB0aGlzLnByb3BzLnVybDtcbiAgICAgICAgbGV0IG9uQ2xpY2s7XG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZS5waWxsVHlwZSkge1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfQVRfUk9PTV9NRU5USU9OOiB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm9vbSA9IHRoaXMucHJvcHMucm9vbTtcbiAgICAgICAgICAgICAgICBpZiAocm9vbSkge1xuICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCA9IFwiQHJvb21cIjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucHJvcHMuc2hvdWxkU2hvd1BpbGxBdmF0YXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF2YXRhciA9IDxSb29tQXZhdGFyIHJvb209e3Jvb219IHdpZHRoPXsxNn0gaGVpZ2h0PXsxNn0gYXJpYS1oaWRkZW49XCJ0cnVlXCIgLz47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcGlsbENsYXNzID0gJ214X0F0Um9vbVBpbGwnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgUGlsbC5UWVBFX1VTRVJfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIC8vIElmIHRoaXMgdXNlciBpcyBub3QgYSBtZW1iZXIgb2YgdGhpcyByb29tLCBkZWZhdWx0IHRvIHRoZSBlbXB0eSBtZW1iZXJcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXIgPSB0aGlzLnN0YXRlLm1lbWJlcjtcbiAgICAgICAgICAgICAgICBpZiAobWVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHVzZXJJZCA9IG1lbWJlci51c2VySWQ7XG4gICAgICAgICAgICAgICAgICAgIG1lbWJlci5yYXdEaXNwbGF5TmFtZSA9IG1lbWJlci5yYXdEaXNwbGF5TmFtZSB8fCAnJztcbiAgICAgICAgICAgICAgICAgICAgbGlua1RleHQgPSBtZW1iZXIucmF3RGlzcGxheU5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNob3VsZFNob3dQaWxsQXZhdGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXIgPSA8TWVtYmVyQXZhdGFyIG1lbWJlcj17bWVtYmVyfSB3aWR0aD17MTZ9IGhlaWdodD17MTZ9IGFyaWEtaGlkZGVuPVwidHJ1ZVwiIC8+O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHBpbGxDbGFzcyA9ICdteF9Vc2VyUGlsbCc7XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBvbkNsaWNrID0gdGhpcy5vblVzZXJQaWxsQ2xpY2tlZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBpbGwuVFlQRV9ST09NX01FTlRJT046IHtcbiAgICAgICAgICAgICAgICBjb25zdCByb29tID0gdGhpcy5zdGF0ZS5yb29tO1xuICAgICAgICAgICAgICAgIGlmIChyb29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmtUZXh0ID0gcm9vbS5uYW1lIHx8IHJlc291cmNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9wcy5zaG91bGRTaG93UGlsbEF2YXRhcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXZhdGFyID0gPFJvb21BdmF0YXIgcm9vbT17cm9vbX0gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBhcmlhLWhpZGRlbj1cInRydWVcIiAvPjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwaWxsQ2xhc3MgPSAnbXhfUm9vbVBpbGwnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQaWxsLlRZUEVfR1JPVVBfTUVOVElPTjoge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHthdmF0YXJVcmwsIGdyb3VwSWQsIG5hbWV9ID0gdGhpcy5zdGF0ZS5ncm91cDtcblxuICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCA9IGdyb3VwSWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3BzLnNob3VsZFNob3dQaWxsQXZhdGFyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhdmF0YXIgPSA8QmFzZUF2YXRhclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9e25hbWUgfHwgZ3JvdXBJZH0gd2lkdGg9ezE2fSBoZWlnaHQ9ezE2fSBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybD17YXZhdGFyVXJsID8gbWVkaWFGcm9tTXhjKGF2YXRhclVybCkuZ2V0U3F1YXJlVGh1bWJuYWlsSHR0cCgxNikgOiBudWxsfSAvPjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBwaWxsQ2xhc3MgPSAnbXhfR3JvdXBQaWxsJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjbGFzc2VzID0gY2xhc3NOYW1lcyhcIm14X1BpbGxcIiwgcGlsbENsYXNzLCB7XG4gICAgICAgICAgICBcIm14X1VzZXJQaWxsX21lXCI6IHVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFVzZXJJZCgpLFxuICAgICAgICAgICAgXCJteF9Vc2VyUGlsbF9zZWxlY3RlZFwiOiB0aGlzLnByb3BzLmlzU2VsZWN0ZWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLnN0YXRlLnBpbGxUeXBlKSB7XG4gICAgICAgICAgICBjb25zdCB7eU9mZnNldH0gPSB0aGlzLnByb3BzO1xuXG4gICAgICAgICAgICBsZXQgdGlwO1xuICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaG92ZXIgJiYgcmVzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICB0aXAgPSA8VG9vbHRpcCBsYWJlbD17cmVzb3VyY2V9IHlPZmZzZXQ9e3lPZmZzZXR9IC8+O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gPE1hdHJpeENsaWVudENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3RoaXMuX21hdHJpeENsaWVudH0+XG4gICAgICAgICAgICAgICAgeyB0aGlzLnByb3BzLmluTWVzc2FnZSA/XG4gICAgICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU9e2NsYXNzZXN9XG4gICAgICAgICAgICAgICAgICAgICAgICBocmVmPXtocmVmfVxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17b25DbGlja31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtb2Zmc2V0LWtleT17dGhpcy5wcm9wcy5vZmZzZXRLZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlT3Zlcj17dGhpcy5vbk1vdXNlT3Zlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17dGhpcy5vbk1vdXNlTGVhdmV9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbGlua1RleHQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aXAgfVxuICAgICAgICAgICAgICAgICAgICA8L2E+IDpcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT17Y2xhc3Nlc31cbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtb2Zmc2V0LWtleT17dGhpcy5wcm9wcy5vZmZzZXRLZXl9XG4gICAgICAgICAgICAgICAgICAgICAgICBvbk1vdXNlT3Zlcj17dGhpcy5vbk1vdXNlT3Zlcn1cbiAgICAgICAgICAgICAgICAgICAgICAgIG9uTW91c2VMZWF2ZT17dGhpcy5vbk1vdXNlTGVhdmV9XG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgYXZhdGFyIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbGlua1RleHQgfVxuICAgICAgICAgICAgICAgICAgICAgICAgeyB0aXAgfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+IH1cbiAgICAgICAgICAgIDwvTWF0cml4Q2xpZW50Q29udGV4dC5Qcm92aWRlcj47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgcmVuZGVyIG5vdGhpbmcgaWYgdGhlIFVSTCBpc24ndCByZWNvZ25pc2VkXG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUGlsbDtcbiJdfQ==