matrix-react-sdk
Version:
SDK for matrix.org using React
285 lines (237 loc) • 34.8 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 _BaseDialog = _interopRequireDefault(require("./BaseDialog"));
var _languageHandler = require("../../../languageHandler");
var _Field = _interopRequireDefault(require("../elements/Field"));
var _AccessibleButton = _interopRequireDefault(require("../elements/AccessibleButton"));
var _MatrixClientPeg = require("../../../MatrixClientPeg");
var _arrays = require("../../../utils/arrays");
var _SdkConfig = _interopRequireDefault(require("../../../SdkConfig"));
var _InviteDialog = _interopRequireDefault(require("./InviteDialog"));
var _BaseAvatar = _interopRequireDefault(require("../avatars/BaseAvatar"));
var _RoomInvite = require("../../../RoomInvite");
var _StyledCheckbox = _interopRequireDefault(require("../elements/StyledCheckbox"));
var _Modal = _interopRequireDefault(require("../../../Modal"));
var _ErrorDialog = _interopRequireDefault(require("./ErrorDialog"));
var _replaceableComponent = require("../../../utils/replaceableComponent");
var _Media = require("../../../customisations/Media");
var _dec, _class, _temp;
let CommunityPrototypeInviteDialog = (_dec = (0, _replaceableComponent.replaceableComponent)("views.dialogs.CommunityPrototypeInviteDialog"), _dec(_class = (_temp = class CommunityPrototypeInviteDialog extends _react.default.PureComponent
/*:: <IProps, IState>*/
{
constructor(props
/*: IProps*/
) {
super(props);
(0, _defineProperty2.default)(this, "onSubmit", async (ev
/*: FormEvent*/
) => {
ev.preventDefault();
ev.stopPropagation();
this.setState({
busy: true
});
try {
const targets = [...this.state.emailTargets, ...this.state.userTargets];
const result = await (0, _RoomInvite.inviteMultipleToRoom)(this.props.roomId, targets);
const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(this.props.roomId);
const success = (0, _RoomInvite.showAnyInviteErrors)(result.states, room, result.inviter);
if (success) {
this.props.onFinished(true);
} else {
this.setState({
busy: false
});
}
} catch (e) {
this.setState({
busy: false
});
console.error(e);
_Modal.default.createTrackedDialog('Failed to invite', '', _ErrorDialog.default, {
title: (0, _languageHandler._t)("Failed to invite"),
description: e && e.message ? e.message : (0, _languageHandler._t)("Operation failed")
});
}
});
(0, _defineProperty2.default)(this, "onAddressChange", (ev
/*: ChangeEvent<HTMLInputElement>*/
, index
/*: number*/
) => {
const targets = (0, _arrays.arrayFastClone)(this.state.emailTargets);
if (index >= targets.length) {
targets.push(ev.target.value);
} else {
targets[index] = ev.target.value;
}
this.setState({
emailTargets: targets
});
});
(0, _defineProperty2.default)(this, "onAddressBlur", (index
/*: number*/
) => {
const targets = (0, _arrays.arrayFastClone)(this.state.emailTargets);
if (index >= targets.length) return; // not important
if (targets[index].trim() === "") {
targets.splice(index, 1);
this.setState({
emailTargets: targets
});
}
});
(0, _defineProperty2.default)(this, "onShowPeopleClick", () => {
this.setState({
showPeople: !this.state.showPeople
});
});
(0, _defineProperty2.default)(this, "setPersonToggle", (person
/*: IPerson*/
, selected
/*: boolean*/
) => {
const targets = (0, _arrays.arrayFastClone)(this.state.userTargets);
if (selected && !targets.includes(person.userId)) {
targets.push(person.userId);
} else if (!selected && targets.includes(person.userId)) {
targets.splice(targets.indexOf(person.userId), 1);
}
this.setState({
userTargets: targets
});
});
(0, _defineProperty2.default)(this, "onShowMorePeople", () => {
this.setState({
numPeople: this.state.numPeople + 5
}); // arbitrary increase
});
this.state = {
emailTargets: [],
userTargets: [],
showPeople: false,
people: this.buildSuggestions(),
numPeople: 5,
// arbitrary default
busy: false
};
}
buildSuggestions()
/*: IPerson[]*/
{
const alreadyInvited = new Set([_MatrixClientPeg.MatrixClientPeg.get().getUserId(), _SdkConfig.default.get()['welcomeUserId']]);
if (this.props.roomId) {
const room = _MatrixClientPeg.MatrixClientPeg.get().getRoom(this.props.roomId);
if (!room) throw new Error("Room ID given to InviteDialog does not look like a room");
room.getMembersWithMembership('invite').forEach(m => alreadyInvited.add(m.userId));
room.getMembersWithMembership('join').forEach(m => alreadyInvited.add(m.userId)); // add banned users, so we don't try to invite them
room.getMembersWithMembership('ban').forEach(m => alreadyInvited.add(m.userId));
}
return _InviteDialog.default.buildRecents(alreadyInvited);
}
renderPerson(person
/*: IPerson*/
, key
/*: any*/
) {
const avatarSize = 36;
let avatarUrl = null;
if (person.user.getMxcAvatarUrl()) {
avatarUrl = (0, _Media.mediaFromMxc)(person.user.getMxcAvatarUrl()).getSquareThumbnailHttp(avatarSize);
}
return /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CommunityPrototypeInviteDialog_person",
key: key
}, /*#__PURE__*/_react.default.createElement(_BaseAvatar.default, {
url: avatarUrl,
name: person.user.name,
idName: person.user.userId,
width: avatarSize,
height: avatarSize
}), /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CommunityPrototypeInviteDialog_personIdentifiers"
}, /*#__PURE__*/_react.default.createElement("span", {
className: "mx_CommunityPrototypeInviteDialog_personName"
}, person.user.name), /*#__PURE__*/_react.default.createElement("span", {
className: "mx_CommunityPrototypeInviteDialog_personId"
}, person.userId)), /*#__PURE__*/_react.default.createElement(_StyledCheckbox.default, {
onChange: e => this.setPersonToggle(person, e.target.checked)
}));
}
render() {
const emailAddresses = [];
this.state.emailTargets.forEach((address, i) => {
emailAddresses.push( /*#__PURE__*/_react.default.createElement(_Field.default, {
key: i,
value: address,
onChange: e => this.onAddressChange(e, i),
label: (0, _languageHandler._t)("Email address"),
placeholder: (0, _languageHandler._t)("Email address"),
onBlur: () => this.onAddressBlur(i)
}));
}); // Push a clean input
emailAddresses.push( /*#__PURE__*/_react.default.createElement(_Field.default, {
key: emailAddresses.length,
value: "",
onChange: e => this.onAddressChange(e, emailAddresses.length),
label: emailAddresses.length > 0 ? (0, _languageHandler._t)("Add another email") : (0, _languageHandler._t)("Email address"),
placeholder: emailAddresses.length > 0 ? (0, _languageHandler._t)("Add another email") : (0, _languageHandler._t)("Email address")
}));
let peopleIntro = null;
const people = [];
if (this.state.showPeople) {
const humansToPresent = this.state.people.slice(0, this.state.numPeople);
humansToPresent.forEach((person, i) => {
people.push(this.renderPerson(person, i));
});
if (humansToPresent.length < this.state.people.length) {
people.push( /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onShowMorePeople,
kind: "link",
key: "more",
className: "mx_CommunityPrototypeInviteDialog_morePeople"
}, (0, _languageHandler._t)("Show more")));
}
}
if (this.state.people.length > 0) {
peopleIntro = /*#__PURE__*/_react.default.createElement("div", {
className: "mx_CommunityPrototypeInviteDialog_people"
}, /*#__PURE__*/_react.default.createElement("span", null, (0, _languageHandler._t)("People you know on %(brand)s", {
brand: _SdkConfig.default.get().brand
})), /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
onClick: this.onShowPeopleClick
}, this.state.showPeople ? (0, _languageHandler._t)("Hide") : (0, _languageHandler._t)("Show")));
}
let buttonText = (0, _languageHandler._t)("Skip");
const targetCount = this.state.userTargets.length + this.state.emailTargets.length;
if (targetCount > 0) {
buttonText = (0, _languageHandler._t)("Send %(count)s invites", {
count: targetCount
});
}
return /*#__PURE__*/_react.default.createElement(_BaseDialog.default, {
className: "mx_CommunityPrototypeInviteDialog",
onFinished: this.props.onFinished,
title: (0, _languageHandler._t)("Invite people to join %(communityName)s", {
communityName: this.props.communityName
})
}, /*#__PURE__*/_react.default.createElement("form", {
onSubmit: this.onSubmit
}, /*#__PURE__*/_react.default.createElement("div", {
className: "mx_Dialog_content"
}, emailAddresses, peopleIntro, people, /*#__PURE__*/_react.default.createElement(_AccessibleButton.default, {
kind: "primary",
onClick: this.onSubmit,
disabled: this.state.busy,
className: "mx_CommunityPrototypeInviteDialog_primaryButton"
}, buttonText))));
}
}, _temp)) || _class);
exports.default = CommunityPrototypeInviteDialog;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL3ZpZXdzL2RpYWxvZ3MvQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nLnRzeCJdLCJuYW1lcyI6WyJDb21tdW5pdHlQcm90b3R5cGVJbnZpdGVEaWFsb2ciLCJSZWFjdCIsIlB1cmVDb21wb25lbnQiLCJjb25zdHJ1Y3RvciIsInByb3BzIiwiZXYiLCJwcmV2ZW50RGVmYXVsdCIsInN0b3BQcm9wYWdhdGlvbiIsInNldFN0YXRlIiwiYnVzeSIsInRhcmdldHMiLCJzdGF0ZSIsImVtYWlsVGFyZ2V0cyIsInVzZXJUYXJnZXRzIiwicmVzdWx0Iiwicm9vbUlkIiwicm9vbSIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFJvb20iLCJzdWNjZXNzIiwic3RhdGVzIiwiaW52aXRlciIsIm9uRmluaXNoZWQiLCJlIiwiY29uc29sZSIsImVycm9yIiwiTW9kYWwiLCJjcmVhdGVUcmFja2VkRGlhbG9nIiwiRXJyb3JEaWFsb2ciLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibWVzc2FnZSIsImluZGV4IiwibGVuZ3RoIiwicHVzaCIsInRhcmdldCIsInZhbHVlIiwidHJpbSIsInNwbGljZSIsInNob3dQZW9wbGUiLCJwZXJzb24iLCJzZWxlY3RlZCIsImluY2x1ZGVzIiwidXNlcklkIiwiaW5kZXhPZiIsIm51bVBlb3BsZSIsInBlb3BsZSIsImJ1aWxkU3VnZ2VzdGlvbnMiLCJhbHJlYWR5SW52aXRlZCIsIlNldCIsImdldFVzZXJJZCIsIlNka0NvbmZpZyIsIkVycm9yIiwiZ2V0TWVtYmVyc1dpdGhNZW1iZXJzaGlwIiwiZm9yRWFjaCIsIm0iLCJhZGQiLCJJbnZpdGVEaWFsb2ciLCJidWlsZFJlY2VudHMiLCJyZW5kZXJQZXJzb24iLCJrZXkiLCJhdmF0YXJTaXplIiwiYXZhdGFyVXJsIiwidXNlciIsImdldE14Y0F2YXRhclVybCIsImdldFNxdWFyZVRodW1ibmFpbEh0dHAiLCJuYW1lIiwic2V0UGVyc29uVG9nZ2xlIiwiY2hlY2tlZCIsInJlbmRlciIsImVtYWlsQWRkcmVzc2VzIiwiYWRkcmVzcyIsImkiLCJvbkFkZHJlc3NDaGFuZ2UiLCJvbkFkZHJlc3NCbHVyIiwicGVvcGxlSW50cm8iLCJodW1hbnNUb1ByZXNlbnQiLCJzbGljZSIsIm9uU2hvd01vcmVQZW9wbGUiLCJicmFuZCIsIm9uU2hvd1Blb3BsZUNsaWNrIiwiYnV0dG9uVGV4dCIsInRhcmdldENvdW50IiwiY291bnQiLCJjb21tdW5pdHlOYW1lIiwib25TdWJtaXQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBZ0JBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOzs7O0lBdUJxQkEsOEIsV0FEcEIsZ0RBQXFCLDhDQUFyQixDLHlCQUFELE1BQ3FCQSw4QkFEckIsU0FDNERDLGVBQU1DO0FBRGxFO0FBQ2dHO0FBQzVGQyxFQUFBQSxXQUFXLENBQUNDO0FBQUQ7QUFBQSxJQUFnQjtBQUN2QixVQUFNQSxLQUFOO0FBRHVCLG9EQTJCUixPQUFPQztBQUFQO0FBQUEsU0FBeUI7QUFDeENBLE1BQUFBLEVBQUUsQ0FBQ0MsY0FBSDtBQUNBRCxNQUFBQSxFQUFFLENBQUNFLGVBQUg7QUFFQSxXQUFLQyxRQUFMLENBQWM7QUFBQ0MsUUFBQUEsSUFBSSxFQUFFO0FBQVAsT0FBZDs7QUFDQSxVQUFJO0FBQ0EsY0FBTUMsT0FBTyxHQUFHLENBQUMsR0FBRyxLQUFLQyxLQUFMLENBQVdDLFlBQWYsRUFBNkIsR0FBRyxLQUFLRCxLQUFMLENBQVdFLFdBQTNDLENBQWhCO0FBQ0EsY0FBTUMsTUFBTSxHQUFHLE1BQU0sc0NBQXFCLEtBQUtWLEtBQUwsQ0FBV1csTUFBaEMsRUFBd0NMLE9BQXhDLENBQXJCOztBQUNBLGNBQU1NLElBQUksR0FBR0MsaUNBQWdCQyxHQUFoQixHQUFzQkMsT0FBdEIsQ0FBOEIsS0FBS2YsS0FBTCxDQUFXVyxNQUF6QyxDQUFiOztBQUNBLGNBQU1LLE9BQU8sR0FBRyxxQ0FBb0JOLE1BQU0sQ0FBQ08sTUFBM0IsRUFBbUNMLElBQW5DLEVBQXlDRixNQUFNLENBQUNRLE9BQWhELENBQWhCOztBQUNBLFlBQUlGLE9BQUosRUFBYTtBQUNULGVBQUtoQixLQUFMLENBQVdtQixVQUFYLENBQXNCLElBQXRCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZUFBS2YsUUFBTCxDQUFjO0FBQUNDLFlBQUFBLElBQUksRUFBRTtBQUFQLFdBQWQ7QUFDSDtBQUNKLE9BVkQsQ0FVRSxPQUFPZSxDQUFQLEVBQVU7QUFDUixhQUFLaEIsUUFBTCxDQUFjO0FBQUNDLFVBQUFBLElBQUksRUFBRTtBQUFQLFNBQWQ7QUFDQWdCLFFBQUFBLE9BQU8sQ0FBQ0MsS0FBUixDQUFjRixDQUFkOztBQUNBRyx1QkFBTUMsbUJBQU4sQ0FBMEIsa0JBQTFCLEVBQThDLEVBQTlDLEVBQWtEQyxvQkFBbEQsRUFBK0Q7QUFDM0RDLFVBQUFBLEtBQUssRUFBRSx5QkFBRyxrQkFBSCxDQURvRDtBQUUzREMsVUFBQUEsV0FBVyxFQUFJUCxDQUFDLElBQUlBLENBQUMsQ0FBQ1EsT0FBUixHQUFtQlIsQ0FBQyxDQUFDUSxPQUFyQixHQUErQix5QkFBRyxrQkFBSDtBQUZjLFNBQS9EO0FBSUg7QUFDSixLQWxEMEI7QUFBQSwyREFvREQsQ0FBQzNCO0FBQUQ7QUFBQSxNQUFvQzRCO0FBQXBDO0FBQUEsU0FBc0Q7QUFDNUUsWUFBTXZCLE9BQU8sR0FBRyw0QkFBZSxLQUFLQyxLQUFMLENBQVdDLFlBQTFCLENBQWhCOztBQUNBLFVBQUlxQixLQUFLLElBQUl2QixPQUFPLENBQUN3QixNQUFyQixFQUE2QjtBQUN6QnhCLFFBQUFBLE9BQU8sQ0FBQ3lCLElBQVIsQ0FBYTlCLEVBQUUsQ0FBQytCLE1BQUgsQ0FBVUMsS0FBdkI7QUFDSCxPQUZELE1BRU87QUFDSDNCLFFBQUFBLE9BQU8sQ0FBQ3VCLEtBQUQsQ0FBUCxHQUFpQjVCLEVBQUUsQ0FBQytCLE1BQUgsQ0FBVUMsS0FBM0I7QUFDSDs7QUFDRCxXQUFLN0IsUUFBTCxDQUFjO0FBQUNJLFFBQUFBLFlBQVksRUFBRUY7QUFBZixPQUFkO0FBQ0gsS0E1RDBCO0FBQUEseURBOERILENBQUN1QjtBQUFEO0FBQUEsU0FBbUI7QUFDdkMsWUFBTXZCLE9BQU8sR0FBRyw0QkFBZSxLQUFLQyxLQUFMLENBQVdDLFlBQTFCLENBQWhCO0FBQ0EsVUFBSXFCLEtBQUssSUFBSXZCLE9BQU8sQ0FBQ3dCLE1BQXJCLEVBQTZCLE9BRlUsQ0FFRjs7QUFDckMsVUFBSXhCLE9BQU8sQ0FBQ3VCLEtBQUQsQ0FBUCxDQUFlSyxJQUFmLE9BQTBCLEVBQTlCLEVBQWtDO0FBQzlCNUIsUUFBQUEsT0FBTyxDQUFDNkIsTUFBUixDQUFlTixLQUFmLEVBQXNCLENBQXRCO0FBQ0EsYUFBS3pCLFFBQUwsQ0FBYztBQUFDSSxVQUFBQSxZQUFZLEVBQUVGO0FBQWYsU0FBZDtBQUNIO0FBQ0osS0FyRTBCO0FBQUEsNkRBdUVDLE1BQU07QUFDOUIsV0FBS0YsUUFBTCxDQUFjO0FBQUNnQyxRQUFBQSxVQUFVLEVBQUUsQ0FBQyxLQUFLN0IsS0FBTCxDQUFXNkI7QUFBekIsT0FBZDtBQUNILEtBekUwQjtBQUFBLDJEQTJFRCxDQUFDQztBQUFEO0FBQUEsTUFBa0JDO0FBQWxCO0FBQUEsU0FBd0M7QUFDOUQsWUFBTWhDLE9BQU8sR0FBRyw0QkFBZSxLQUFLQyxLQUFMLENBQVdFLFdBQTFCLENBQWhCOztBQUNBLFVBQUk2QixRQUFRLElBQUksQ0FBQ2hDLE9BQU8sQ0FBQ2lDLFFBQVIsQ0FBaUJGLE1BQU0sQ0FBQ0csTUFBeEIsQ0FBakIsRUFBa0Q7QUFDOUNsQyxRQUFBQSxPQUFPLENBQUN5QixJQUFSLENBQWFNLE1BQU0sQ0FBQ0csTUFBcEI7QUFDSCxPQUZELE1BRU8sSUFBSSxDQUFDRixRQUFELElBQWFoQyxPQUFPLENBQUNpQyxRQUFSLENBQWlCRixNQUFNLENBQUNHLE1BQXhCLENBQWpCLEVBQWtEO0FBQ3JEbEMsUUFBQUEsT0FBTyxDQUFDNkIsTUFBUixDQUFlN0IsT0FBTyxDQUFDbUMsT0FBUixDQUFnQkosTUFBTSxDQUFDRyxNQUF2QixDQUFmLEVBQStDLENBQS9DO0FBQ0g7O0FBQ0QsV0FBS3BDLFFBQUwsQ0FBYztBQUFDSyxRQUFBQSxXQUFXLEVBQUVIO0FBQWQsT0FBZDtBQUNILEtBbkYwQjtBQUFBLDREQTZHQSxNQUFNO0FBQzdCLFdBQUtGLFFBQUwsQ0FBYztBQUFDc0MsUUFBQUEsU0FBUyxFQUFFLEtBQUtuQyxLQUFMLENBQVdtQyxTQUFYLEdBQXVCO0FBQW5DLE9BQWQsRUFENkIsQ0FDeUI7QUFDekQsS0EvRzBCO0FBR3ZCLFNBQUtuQyxLQUFMLEdBQWE7QUFDVEMsTUFBQUEsWUFBWSxFQUFFLEVBREw7QUFFVEMsTUFBQUEsV0FBVyxFQUFFLEVBRko7QUFHVDJCLE1BQUFBLFVBQVUsRUFBRSxLQUhIO0FBSVRPLE1BQUFBLE1BQU0sRUFBRSxLQUFLQyxnQkFBTCxFQUpDO0FBS1RGLE1BQUFBLFNBQVMsRUFBRSxDQUxGO0FBS0s7QUFDZHJDLE1BQUFBLElBQUksRUFBRTtBQU5HLEtBQWI7QUFRSDs7QUFFT3VDLEVBQUFBLGdCQUFSO0FBQUE7QUFBc0M7QUFDbEMsVUFBTUMsY0FBYyxHQUFHLElBQUlDLEdBQUosQ0FBUSxDQUFDakMsaUNBQWdCQyxHQUFoQixHQUFzQmlDLFNBQXRCLEVBQUQsRUFBb0NDLG1CQUFVbEMsR0FBVixHQUFnQixlQUFoQixDQUFwQyxDQUFSLENBQXZCOztBQUNBLFFBQUksS0FBS2QsS0FBTCxDQUFXVyxNQUFmLEVBQXVCO0FBQ25CLFlBQU1DLElBQUksR0FBR0MsaUNBQWdCQyxHQUFoQixHQUFzQkMsT0FBdEIsQ0FBOEIsS0FBS2YsS0FBTCxDQUFXVyxNQUF6QyxDQUFiOztBQUNBLFVBQUksQ0FBQ0MsSUFBTCxFQUFXLE1BQU0sSUFBSXFDLEtBQUosQ0FBVSx5REFBVixDQUFOO0FBQ1hyQyxNQUFBQSxJQUFJLENBQUNzQyx3QkFBTCxDQUE4QixRQUE5QixFQUF3Q0MsT0FBeEMsQ0FBZ0RDLENBQUMsSUFBSVAsY0FBYyxDQUFDUSxHQUFmLENBQW1CRCxDQUFDLENBQUNaLE1BQXJCLENBQXJEO0FBQ0E1QixNQUFBQSxJQUFJLENBQUNzQyx3QkFBTCxDQUE4QixNQUE5QixFQUFzQ0MsT0FBdEMsQ0FBOENDLENBQUMsSUFBSVAsY0FBYyxDQUFDUSxHQUFmLENBQW1CRCxDQUFDLENBQUNaLE1BQXJCLENBQW5ELEVBSm1CLENBS25COztBQUNBNUIsTUFBQUEsSUFBSSxDQUFDc0Msd0JBQUwsQ0FBOEIsS0FBOUIsRUFBcUNDLE9BQXJDLENBQTZDQyxDQUFDLElBQUlQLGNBQWMsQ0FBQ1EsR0FBZixDQUFtQkQsQ0FBQyxDQUFDWixNQUFyQixDQUFsRDtBQUNIOztBQUVELFdBQU9jLHNCQUFhQyxZQUFiLENBQTBCVixjQUExQixDQUFQO0FBQ0g7O0FBNERPVyxFQUFBQSxZQUFSLENBQXFCbkI7QUFBckI7QUFBQSxJQUFzQ29CO0FBQXRDO0FBQUEsSUFBZ0Q7QUFDNUMsVUFBTUMsVUFBVSxHQUFHLEVBQW5CO0FBQ0EsUUFBSUMsU0FBUyxHQUFHLElBQWhCOztBQUNBLFFBQUl0QixNQUFNLENBQUN1QixJQUFQLENBQVlDLGVBQVosRUFBSixFQUFtQztBQUMvQkYsTUFBQUEsU0FBUyxHQUFHLHlCQUFhdEIsTUFBTSxDQUFDdUIsSUFBUCxDQUFZQyxlQUFaLEVBQWIsRUFBNENDLHNCQUE1QyxDQUFtRUosVUFBbkUsQ0FBWjtBQUNIOztBQUNELHdCQUNJO0FBQUssTUFBQSxTQUFTLEVBQUMsMENBQWY7QUFBMEQsTUFBQSxHQUFHLEVBQUVEO0FBQS9ELG9CQUNJLDZCQUFDLG1CQUFEO0FBQ0ksTUFBQSxHQUFHLEVBQUVFLFNBRFQ7QUFFSSxNQUFBLElBQUksRUFBRXRCLE1BQU0sQ0FBQ3VCLElBQVAsQ0FBWUcsSUFGdEI7QUFHSSxNQUFBLE1BQU0sRUFBRTFCLE1BQU0sQ0FBQ3VCLElBQVAsQ0FBWXBCLE1BSHhCO0FBSUksTUFBQSxLQUFLLEVBQUVrQixVQUpYO0FBS0ksTUFBQSxNQUFNLEVBQUVBO0FBTFosTUFESixlQVFJO0FBQUssTUFBQSxTQUFTLEVBQUM7QUFBZixvQkFDSTtBQUFNLE1BQUEsU0FBUyxFQUFDO0FBQWhCLE9BQWdFckIsTUFBTSxDQUFDdUIsSUFBUCxDQUFZRyxJQUE1RSxDQURKLGVBRUk7QUFBTSxNQUFBLFNBQVMsRUFBQztBQUFoQixPQUE4RDFCLE1BQU0sQ0FBQ0csTUFBckUsQ0FGSixDQVJKLGVBWUksNkJBQUMsdUJBQUQ7QUFBZ0IsTUFBQSxRQUFRLEVBQUdwQixDQUFELElBQU8sS0FBSzRDLGVBQUwsQ0FBcUIzQixNQUFyQixFQUE2QmpCLENBQUMsQ0FBQ1ksTUFBRixDQUFTaUMsT0FBdEM7QUFBakMsTUFaSixDQURKO0FBZ0JIOztBQU1NQyxFQUFBQSxNQUFQLEdBQWdCO0FBQ1osVUFBTUMsY0FBYyxHQUFHLEVBQXZCO0FBQ0EsU0FBSzVELEtBQUwsQ0FBV0MsWUFBWCxDQUF3QjJDLE9BQXhCLENBQWdDLENBQUNpQixPQUFELEVBQVVDLENBQVYsS0FBZ0I7QUFDNUNGLE1BQUFBLGNBQWMsQ0FBQ3BDLElBQWYsZUFDSSw2QkFBQyxjQUFEO0FBQ0ksUUFBQSxHQUFHLEVBQUVzQyxDQURUO0FBRUksUUFBQSxLQUFLLEVBQUVELE9BRlg7QUFHSSxRQUFBLFFBQVEsRUFBR2hELENBQUQsSUFBTyxLQUFLa0QsZUFBTCxDQUFxQmxELENBQXJCLEVBQXdCaUQsQ0FBeEIsQ0FIckI7QUFJSSxRQUFBLEtBQUssRUFBRSx5QkFBRyxlQUFILENBSlg7QUFLSSxRQUFBLFdBQVcsRUFBRSx5QkFBRyxlQUFILENBTGpCO0FBTUksUUFBQSxNQUFNLEVBQUUsTUFBTSxLQUFLRSxhQUFMLENBQW1CRixDQUFuQjtBQU5sQixRQURKO0FBVUgsS0FYRCxFQUZZLENBZVo7O0FBQ0FGLElBQUFBLGNBQWMsQ0FBQ3BDLElBQWYsZUFDSSw2QkFBQyxjQUFEO0FBQ0ksTUFBQSxHQUFHLEVBQUVvQyxjQUFjLENBQUNyQyxNQUR4QjtBQUVJLE1BQUEsS0FBSyxFQUFFLEVBRlg7QUFHSSxNQUFBLFFBQVEsRUFBR1YsQ0FBRCxJQUFPLEtBQUtrRCxlQUFMLENBQXFCbEQsQ0FBckIsRUFBd0IrQyxjQUFjLENBQUNyQyxNQUF2QyxDQUhyQjtBQUlJLE1BQUEsS0FBSyxFQUFFcUMsY0FBYyxDQUFDckMsTUFBZixHQUF3QixDQUF4QixHQUE0Qix5QkFBRyxtQkFBSCxDQUE1QixHQUFzRCx5QkFBRyxlQUFILENBSmpFO0FBS0ksTUFBQSxXQUFXLEVBQUVxQyxjQUFjLENBQUNyQyxNQUFmLEdBQXdCLENBQXhCLEdBQTRCLHlCQUFHLG1CQUFILENBQTVCLEdBQXNELHlCQUFHLGVBQUg7QUFMdkUsTUFESjtBQVVBLFFBQUkwQyxXQUFXLEdBQUcsSUFBbEI7QUFDQSxVQUFNN0IsTUFBTSxHQUFHLEVBQWY7O0FBQ0EsUUFBSSxLQUFLcEMsS0FBTCxDQUFXNkIsVUFBZixFQUEyQjtBQUN2QixZQUFNcUMsZUFBZSxHQUFHLEtBQUtsRSxLQUFMLENBQVdvQyxNQUFYLENBQWtCK0IsS0FBbEIsQ0FBd0IsQ0FBeEIsRUFBMkIsS0FBS25FLEtBQUwsQ0FBV21DLFNBQXRDLENBQXhCO0FBQ0ErQixNQUFBQSxlQUFlLENBQUN0QixPQUFoQixDQUF3QixDQUFDZCxNQUFELEVBQVNnQyxDQUFULEtBQWU7QUFDbkMxQixRQUFBQSxNQUFNLENBQUNaLElBQVAsQ0FBWSxLQUFLeUIsWUFBTCxDQUFrQm5CLE1BQWxCLEVBQTBCZ0MsQ0FBMUIsQ0FBWjtBQUNILE9BRkQ7O0FBR0EsVUFBSUksZUFBZSxDQUFDM0MsTUFBaEIsR0FBeUIsS0FBS3ZCLEtBQUwsQ0FBV29DLE1BQVgsQ0FBa0JiLE1BQS9DLEVBQXVEO0FBQ25EYSxRQUFBQSxNQUFNLENBQUNaLElBQVAsZUFDSSw2QkFBQyx5QkFBRDtBQUNJLFVBQUEsT0FBTyxFQUFFLEtBQUs0QyxnQkFEbEI7QUFFSSxVQUFBLElBQUksRUFBQyxNQUZUO0FBRWdCLFVBQUEsR0FBRyxFQUFDLE1BRnBCO0FBR0ksVUFBQSxTQUFTLEVBQUM7QUFIZCxXQUlFLHlCQUFHLFdBQUgsQ0FKRixDQURKO0FBT0g7QUFDSjs7QUFDRCxRQUFJLEtBQUtwRSxLQUFMLENBQVdvQyxNQUFYLENBQWtCYixNQUFsQixHQUEyQixDQUEvQixFQUFrQztBQUM5QjBDLE1BQUFBLFdBQVcsZ0JBQ1A7QUFBSyxRQUFBLFNBQVMsRUFBQztBQUFmLHNCQUNJLDJDQUFPLHlCQUFHLDhCQUFILEVBQW1DO0FBQUNJLFFBQUFBLEtBQUssRUFBRTVCLG1CQUFVbEMsR0FBVixHQUFnQjhEO0FBQXhCLE9BQW5DLENBQVAsQ0FESixlQUVJLDZCQUFDLHlCQUFEO0FBQWtCLFFBQUEsT0FBTyxFQUFFLEtBQUtDO0FBQWhDLFNBQ0ssS0FBS3RFLEtBQUwsQ0FBVzZCLFVBQVgsR0FBd0IseUJBQUcsTUFBSCxDQUF4QixHQUFxQyx5QkFBRyxNQUFILENBRDFDLENBRkosQ0FESjtBQVFIOztBQUVELFFBQUkwQyxVQUFVLEdBQUcseUJBQUcsTUFBSCxDQUFqQjtBQUNBLFVBQU1DLFdBQVcsR0FBRyxLQUFLeEUsS0FBTCxDQUFXRSxXQUFYLENBQXVCcUIsTUFBdkIsR0FBZ0MsS0FBS3ZCLEtBQUwsQ0FBV0MsWUFBWCxDQUF3QnNCLE1BQTVFOztBQUNBLFFBQUlpRCxXQUFXLEdBQUcsQ0FBbEIsRUFBcUI7QUFDakJELE1BQUFBLFVBQVUsR0FBRyx5QkFBRyx3QkFBSCxFQUE2QjtBQUFDRSxRQUFBQSxLQUFLLEVBQUVEO0FBQVIsT0FBN0IsQ0FBYjtBQUNIOztBQUVELHdCQUNJLDZCQUFDLG1CQUFEO0FBQ0ksTUFBQSxTQUFTLEVBQUMsbUNBRGQ7QUFFSSxNQUFBLFVBQVUsRUFBRSxLQUFLL0UsS0FBTCxDQUFXbUIsVUFGM0I7QUFHSSxNQUFBLEtBQUssRUFBRSx5QkFBRyx5Q0FBSCxFQUE4QztBQUFDOEQsUUFBQUEsYUFBYSxFQUFFLEtBQUtqRixLQUFMLENBQVdpRjtBQUEzQixPQUE5QztBQUhYLG9CQUtJO0FBQU0sTUFBQSxRQUFRLEVBQUUsS0FBS0M7QUFBckIsb0JBQ0k7QUFBSyxNQUFBLFNBQVMsRUFBQztBQUFmLE9BQ0tmLGNBREwsRUFFS0ssV0FGTCxFQUdLN0IsTUFITCxlQUlJLDZCQUFDLHlCQUFEO0FBQ0ksTUFBQSxJQUFJLEVBQUMsU0FEVDtBQUNtQixNQUFBLE9BQU8sRUFBRSxLQUFLdUMsUUFEakM7QUFFSSxNQUFBLFFBQVEsRUFBRSxLQUFLM0UsS0FBTCxDQUFXRixJQUZ6QjtBQUdJLE1BQUEsU0FBUyxFQUFDO0FBSGQsT0FJRXlFLFVBSkYsQ0FKSixDQURKLENBTEosQ0FESjtBQW9CSDs7QUFsTTJGLEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjAgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuXG4gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG5cblVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxubGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4qL1xuXG5pbXBvcnQgUmVhY3QsIHsgQ2hhbmdlRXZlbnQsIEZvcm1FdmVudCB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCBCYXNlRGlhbG9nIGZyb20gXCIuL0Jhc2VEaWFsb2dcIjtcbmltcG9ydCB7IF90IH0gZnJvbSBcIi4uLy4uLy4uL2xhbmd1YWdlSGFuZGxlclwiO1xuaW1wb3J0IHsgSURpYWxvZ1Byb3BzIH0gZnJvbSBcIi4vSURpYWxvZ1Byb3BzXCI7XG5pbXBvcnQgRmllbGQgZnJvbSBcIi4uL2VsZW1lbnRzL0ZpZWxkXCI7XG5pbXBvcnQgQWNjZXNzaWJsZUJ1dHRvbiBmcm9tIFwiLi4vZWxlbWVudHMvQWNjZXNzaWJsZUJ1dHRvblwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuaW1wb3J0IHsgYXJyYXlGYXN0Q2xvbmUgfSBmcm9tIFwiLi4vLi4vLi4vdXRpbHMvYXJyYXlzXCI7XG5pbXBvcnQgU2RrQ29uZmlnIGZyb20gXCIuLi8uLi8uLi9TZGtDb25maWdcIjtcbmltcG9ydCB7IFJvb21NZW1iZXIgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvbW9kZWxzL3Jvb20tbWVtYmVyXCI7XG5pbXBvcnQgSW52aXRlRGlhbG9nIGZyb20gXCIuL0ludml0ZURpYWxvZ1wiO1xuaW1wb3J0IEJhc2VBdmF0YXIgZnJvbSBcIi4uL2F2YXRhcnMvQmFzZUF2YXRhclwiO1xuaW1wb3J0IHtpbnZpdGVNdWx0aXBsZVRvUm9vbSwgc2hvd0FueUludml0ZUVycm9yc30gZnJvbSBcIi4uLy4uLy4uL1Jvb21JbnZpdGVcIjtcbmltcG9ydCBTdHlsZWRDaGVja2JveCBmcm9tIFwiLi4vZWxlbWVudHMvU3R5bGVkQ2hlY2tib3hcIjtcbmltcG9ydCBNb2RhbCBmcm9tIFwiLi4vLi4vLi4vTW9kYWxcIjtcbmltcG9ydCBFcnJvckRpYWxvZyBmcm9tIFwiLi9FcnJvckRpYWxvZ1wiO1xuaW1wb3J0IHtyZXBsYWNlYWJsZUNvbXBvbmVudH0gZnJvbSBcIi4uLy4uLy4uL3V0aWxzL3JlcGxhY2VhYmxlQ29tcG9uZW50XCI7XG5pbXBvcnQge21lZGlhRnJvbU14Y30gZnJvbSBcIi4uLy4uLy4uL2N1c3RvbWlzYXRpb25zL01lZGlhXCI7XG5cbmludGVyZmFjZSBJUHJvcHMgZXh0ZW5kcyBJRGlhbG9nUHJvcHMge1xuICAgIHJvb21JZDogc3RyaW5nO1xuICAgIGNvbW11bml0eU5hbWU6IHN0cmluZztcbn1cblxuaW50ZXJmYWNlIElQZXJzb24ge1xuICAgIHVzZXJJZDogc3RyaW5nO1xuICAgIHVzZXI6IFJvb21NZW1iZXI7XG4gICAgbGFzdEFjdGl2ZTogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgSVN0YXRlIHtcbiAgICBlbWFpbFRhcmdldHM6IHN0cmluZ1tdO1xuICAgIHVzZXJUYXJnZXRzOiBzdHJpbmdbXTtcbiAgICBzaG93UGVvcGxlOiBib29sZWFuO1xuICAgIHBlb3BsZTogSVBlcnNvbltdO1xuICAgIG51bVBlb3BsZTogbnVtYmVyO1xuICAgIGJ1c3k6IGJvb2xlYW47XG59XG5cbkByZXBsYWNlYWJsZUNvbXBvbmVudChcInZpZXdzLmRpYWxvZ3MuQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nXCIpXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDb21tdW5pdHlQcm90b3R5cGVJbnZpdGVEaWFsb2cgZXh0ZW5kcyBSZWFjdC5QdXJlQ29tcG9uZW50PElQcm9wcywgSVN0YXRlPiB7XG4gICAgY29uc3RydWN0b3IocHJvcHM6IElQcm9wcykge1xuICAgICAgICBzdXBlcihwcm9wcyk7XG5cbiAgICAgICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgICAgICAgIGVtYWlsVGFyZ2V0czogW10sXG4gICAgICAgICAgICB1c2VyVGFyZ2V0czogW10sXG4gICAgICAgICAgICBzaG93UGVvcGxlOiBmYWxzZSxcbiAgICAgICAgICAgIHBlb3BsZTogdGhpcy5idWlsZFN1Z2dlc3Rpb25zKCksXG4gICAgICAgICAgICBudW1QZW9wbGU6IDUsIC8vIGFyYml0cmFyeSBkZWZhdWx0XG4gICAgICAgICAgICBidXN5OiBmYWxzZSxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGJ1aWxkU3VnZ2VzdGlvbnMoKTogSVBlcnNvbltdIHtcbiAgICAgICAgY29uc3QgYWxyZWFkeUludml0ZWQgPSBuZXcgU2V0KFtNYXRyaXhDbGllbnRQZWcuZ2V0KCkuZ2V0VXNlcklkKCksIFNka0NvbmZpZy5nZXQoKVsnd2VsY29tZVVzZXJJZCddXSk7XG4gICAgICAgIGlmICh0aGlzLnByb3BzLnJvb21JZCkge1xuICAgICAgICAgICAgY29uc3Qgcm9vbSA9IE1hdHJpeENsaWVudFBlZy5nZXQoKS5nZXRSb29tKHRoaXMucHJvcHMucm9vbUlkKTtcbiAgICAgICAgICAgIGlmICghcm9vbSkgdGhyb3cgbmV3IEVycm9yKFwiUm9vbSBJRCBnaXZlbiB0byBJbnZpdGVEaWFsb2cgZG9lcyBub3QgbG9vayBsaWtlIGEgcm9vbVwiKTtcbiAgICAgICAgICAgIHJvb20uZ2V0TWVtYmVyc1dpdGhNZW1iZXJzaGlwKCdpbnZpdGUnKS5mb3JFYWNoKG0gPT4gYWxyZWFkeUludml0ZWQuYWRkKG0udXNlcklkKSk7XG4gICAgICAgICAgICByb29tLmdldE1lbWJlcnNXaXRoTWVtYmVyc2hpcCgnam9pbicpLmZvckVhY2gobSA9PiBhbHJlYWR5SW52aXRlZC5hZGQobS51c2VySWQpKTtcbiAgICAgICAgICAgIC8vIGFkZCBiYW5uZWQgdXNlcnMsIHNvIHdlIGRvbid0IHRyeSB0byBpbnZpdGUgdGhlbVxuICAgICAgICAgICAgcm9vbS5nZXRNZW1iZXJzV2l0aE1lbWJlcnNoaXAoJ2JhbicpLmZvckVhY2gobSA9PiBhbHJlYWR5SW52aXRlZC5hZGQobS51c2VySWQpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBJbnZpdGVEaWFsb2cuYnVpbGRSZWNlbnRzKGFscmVhZHlJbnZpdGVkKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU3VibWl0ID0gYXN5bmMgKGV2OiBGb3JtRXZlbnQpID0+IHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXYuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7YnVzeTogdHJ1ZX0pO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFsuLi50aGlzLnN0YXRlLmVtYWlsVGFyZ2V0cywgLi4udGhpcy5zdGF0ZS51c2VyVGFyZ2V0c107XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBpbnZpdGVNdWx0aXBsZVRvUm9vbSh0aGlzLnByb3BzLnJvb21JZCwgdGFyZ2V0cyk7XG4gICAgICAgICAgICBjb25zdCByb29tID0gTWF0cml4Q2xpZW50UGVnLmdldCgpLmdldFJvb20odGhpcy5wcm9wcy5yb29tSWQpO1xuICAgICAgICAgICAgY29uc3Qgc3VjY2VzcyA9IHNob3dBbnlJbnZpdGVFcnJvcnMocmVzdWx0LnN0YXRlcywgcm9vbSwgcmVzdWx0Lmludml0ZXIpO1xuICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByb3BzLm9uRmluaXNoZWQodHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2J1c3k6IGZhbHNlfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2J1c3k6IGZhbHNlfSk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgTW9kYWwuY3JlYXRlVHJhY2tlZERpYWxvZygnRmFpbGVkIHRvIGludml0ZScsICcnLCBFcnJvckRpYWxvZywge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBfdChcIkZhaWxlZCB0byBpbnZpdGVcIiksXG4gICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICgoZSAmJiBlLm1lc3NhZ2UpID8gZS5tZXNzYWdlIDogX3QoXCJPcGVyYXRpb24gZmFpbGVkXCIpKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BZGRyZXNzQ2hhbmdlID0gKGV2OiBDaGFuZ2VFdmVudDxIVE1MSW5wdXRFbGVtZW50PiwgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gYXJyYXlGYXN0Q2xvbmUodGhpcy5zdGF0ZS5lbWFpbFRhcmdldHMpO1xuICAgICAgICBpZiAoaW5kZXggPj0gdGFyZ2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRhcmdldHMucHVzaChldi50YXJnZXQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGFyZ2V0c1tpbmRleF0gPSBldi50YXJnZXQudmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZXRTdGF0ZSh7ZW1haWxUYXJnZXRzOiB0YXJnZXRzfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25BZGRyZXNzQmx1ciA9IChpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBhcnJheUZhc3RDbG9uZSh0aGlzLnN0YXRlLmVtYWlsVGFyZ2V0cyk7XG4gICAgICAgIGlmIChpbmRleCA+PSB0YXJnZXRzLmxlbmd0aCkgcmV0dXJuOyAvLyBub3QgaW1wb3J0YW50XG4gICAgICAgIGlmICh0YXJnZXRzW2luZGV4XS50cmltKCkgPT09IFwiXCIpIHtcbiAgICAgICAgICAgIHRhcmdldHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgIHRoaXMuc2V0U3RhdGUoe2VtYWlsVGFyZ2V0czogdGFyZ2V0c30pO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25TaG93UGVvcGxlQ2xpY2sgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3Nob3dQZW9wbGU6ICF0aGlzLnN0YXRlLnNob3dQZW9wbGV9KTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRQZXJzb25Ub2dnbGUgPSAocGVyc29uOiBJUGVyc29uLCBzZWxlY3RlZDogYm9vbGVhbikgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXRzID0gYXJyYXlGYXN0Q2xvbmUodGhpcy5zdGF0ZS51c2VyVGFyZ2V0cyk7XG4gICAgICAgIGlmIChzZWxlY3RlZCAmJiAhdGFyZ2V0cy5pbmNsdWRlcyhwZXJzb24udXNlcklkKSkge1xuICAgICAgICAgICAgdGFyZ2V0cy5wdXNoKHBlcnNvbi51c2VySWQpO1xuICAgICAgICB9IGVsc2UgaWYgKCFzZWxlY3RlZCAmJiB0YXJnZXRzLmluY2x1ZGVzKHBlcnNvbi51c2VySWQpKSB7XG4gICAgICAgICAgICB0YXJnZXRzLnNwbGljZSh0YXJnZXRzLmluZGV4T2YocGVyc29uLnVzZXJJZCksIDEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe3VzZXJUYXJnZXRzOiB0YXJnZXRzfSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgcmVuZGVyUGVyc29uKHBlcnNvbjogSVBlcnNvbiwga2V5OiBhbnkpIHtcbiAgICAgICAgY29uc3QgYXZhdGFyU2l6ZSA9IDM2O1xuICAgICAgICBsZXQgYXZhdGFyVXJsID0gbnVsbDtcbiAgICAgICAgaWYgKHBlcnNvbi51c2VyLmdldE14Y0F2YXRhclVybCgpKSB7XG4gICAgICAgICAgICBhdmF0YXJVcmwgPSBtZWRpYUZyb21NeGMocGVyc29uLnVzZXIuZ2V0TXhjQXZhdGFyVXJsKCkpLmdldFNxdWFyZVRodW1ibmFpbEh0dHAoYXZhdGFyU2l6ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nX3BlcnNvblwiIGtleT17a2V5fT5cbiAgICAgICAgICAgICAgICA8QmFzZUF2YXRhclxuICAgICAgICAgICAgICAgICAgICB1cmw9e2F2YXRhclVybH1cbiAgICAgICAgICAgICAgICAgICAgbmFtZT17cGVyc29uLnVzZXIubmFtZX1cbiAgICAgICAgICAgICAgICAgICAgaWROYW1lPXtwZXJzb24udXNlci51c2VySWR9XG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPXthdmF0YXJTaXplfVxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9e2F2YXRhclNpemV9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzTmFtZT1cIm14X0NvbW11bml0eVByb3RvdHlwZUludml0ZURpYWxvZ19wZXJzb25JZGVudGlmaWVyc1wiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzc05hbWU9XCJteF9Db21tdW5pdHlQcm90b3R5cGVJbnZpdGVEaWFsb2dfcGVyc29uTmFtZVwiPntwZXJzb24udXNlci5uYW1lfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3NOYW1lPVwibXhfQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nX3BlcnNvbklkXCI+e3BlcnNvbi51c2VySWR9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxTdHlsZWRDaGVja2JveCBvbkNoYW5nZT17KGUpID0+IHRoaXMuc2V0UGVyc29uVG9nZ2xlKHBlcnNvbiwgZS50YXJnZXQuY2hlY2tlZCl9IC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uU2hvd01vcmVQZW9wbGUgPSAoKSA9PiB7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoe251bVBlb3BsZTogdGhpcy5zdGF0ZS5udW1QZW9wbGUgKyA1fSk7IC8vIGFyYml0cmFyeSBpbmNyZWFzZVxuICAgIH07XG5cbiAgICBwdWJsaWMgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBlbWFpbEFkZHJlc3NlcyA9IFtdO1xuICAgICAgICB0aGlzLnN0YXRlLmVtYWlsVGFyZ2V0cy5mb3JFYWNoKChhZGRyZXNzLCBpKSA9PiB7XG4gICAgICAgICAgICBlbWFpbEFkZHJlc3Nlcy5wdXNoKChcbiAgICAgICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICAgICAga2V5PXtpfVxuICAgICAgICAgICAgICAgICAgICB2YWx1ZT17YWRkcmVzc31cbiAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2U9eyhlKSA9PiB0aGlzLm9uQWRkcmVzc0NoYW5nZShlLCBpKX1cbiAgICAgICAgICAgICAgICAgICAgbGFiZWw9e190KFwiRW1haWwgYWRkcmVzc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9e190KFwiRW1haWwgYWRkcmVzc1wiKX1cbiAgICAgICAgICAgICAgICAgICAgb25CbHVyPXsoKSA9PiB0aGlzLm9uQWRkcmVzc0JsdXIoaSl9XG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBQdXNoIGEgY2xlYW4gaW5wdXRcbiAgICAgICAgZW1haWxBZGRyZXNzZXMucHVzaCgoXG4gICAgICAgICAgICA8RmllbGRcbiAgICAgICAgICAgICAgICBrZXk9e2VtYWlsQWRkcmVzc2VzLmxlbmd0aH1cbiAgICAgICAgICAgICAgICB2YWx1ZT17XCJcIn1cbiAgICAgICAgICAgICAgICBvbkNoYW5nZT17KGUpID0+IHRoaXMub25BZGRyZXNzQ2hhbmdlKGUsIGVtYWlsQWRkcmVzc2VzLmxlbmd0aCl9XG4gICAgICAgICAgICAgICAgbGFiZWw9e2VtYWlsQWRkcmVzc2VzLmxlbmd0aCA+IDAgPyBfdChcIkFkZCBhbm90aGVyIGVtYWlsXCIpIDogX3QoXCJFbWFpbCBhZGRyZXNzXCIpfVxuICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPXtlbWFpbEFkZHJlc3Nlcy5sZW5ndGggPiAwID8gX3QoXCJBZGQgYW5vdGhlciBlbWFpbFwiKSA6IF90KFwiRW1haWwgYWRkcmVzc1wiKX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICkpO1xuXG4gICAgICAgIGxldCBwZW9wbGVJbnRybyA9IG51bGw7XG4gICAgICAgIGNvbnN0IHBlb3BsZSA9IFtdO1xuICAgICAgICBpZiAodGhpcy5zdGF0ZS5zaG93UGVvcGxlKSB7XG4gICAgICAgICAgICBjb25zdCBodW1hbnNUb1ByZXNlbnQgPSB0aGlzLnN0YXRlLnBlb3BsZS5zbGljZSgwLCB0aGlzLnN0YXRlLm51bVBlb3BsZSk7XG4gICAgICAgICAgICBodW1hbnNUb1ByZXNlbnQuZm9yRWFjaCgocGVyc29uLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgcGVvcGxlLnB1c2godGhpcy5yZW5kZXJQZXJzb24ocGVyc29uLCBpKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChodW1hbnNUb1ByZXNlbnQubGVuZ3RoIDwgdGhpcy5zdGF0ZS5wZW9wbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgcGVvcGxlLnB1c2goKFxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgb25DbGljaz17dGhpcy5vblNob3dNb3JlUGVvcGxlfVxuICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cImxpbmtcIiBrZXk9XCJtb3JlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZT1cIm14X0NvbW11bml0eVByb3RvdHlwZUludml0ZURpYWxvZ19tb3JlUGVvcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgPntfdChcIlNob3cgbW9yZVwiKX08L0FjY2Vzc2libGVCdXR0b24+XG4gICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuc3RhdGUucGVvcGxlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHBlb3BsZUludHJvID0gKFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3NOYW1lPVwibXhfQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nX3Blb3BsZVwiPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj57X3QoXCJQZW9wbGUgeW91IGtub3cgb24gJShicmFuZClzXCIsIHticmFuZDogU2RrQ29uZmlnLmdldCgpLmJyYW5kfSl9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8QWNjZXNzaWJsZUJ1dHRvbiBvbkNsaWNrPXt0aGlzLm9uU2hvd1Blb3BsZUNsaWNrfT5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt0aGlzLnN0YXRlLnNob3dQZW9wbGUgPyBfdChcIkhpZGVcIikgOiBfdChcIlNob3dcIil9XG4gICAgICAgICAgICAgICAgICAgIDwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnV0dG9uVGV4dCA9IF90KFwiU2tpcFwiKTtcbiAgICAgICAgY29uc3QgdGFyZ2V0Q291bnQgPSB0aGlzLnN0YXRlLnVzZXJUYXJnZXRzLmxlbmd0aCArIHRoaXMuc3RhdGUuZW1haWxUYXJnZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKHRhcmdldENvdW50ID4gMCkge1xuICAgICAgICAgICAgYnV0dG9uVGV4dCA9IF90KFwiU2VuZCAlKGNvdW50KXMgaW52aXRlc1wiLCB7Y291bnQ6IHRhcmdldENvdW50fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPEJhc2VEaWFsb2dcbiAgICAgICAgICAgICAgICBjbGFzc05hbWU9XCJteF9Db21tdW5pdHlQcm90b3R5cGVJbnZpdGVEaWFsb2dcIlxuICAgICAgICAgICAgICAgIG9uRmluaXNoZWQ9e3RoaXMucHJvcHMub25GaW5pc2hlZH1cbiAgICAgICAgICAgICAgICB0aXRsZT17X3QoXCJJbnZpdGUgcGVvcGxlIHRvIGpvaW4gJShjb21tdW5pdHlOYW1lKXNcIiwge2NvbW11bml0eU5hbWU6IHRoaXMucHJvcHMuY29tbXVuaXR5TmFtZX0pfVxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxmb3JtIG9uU3VibWl0PXt0aGlzLm9uU3VibWl0fT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzc05hbWU9XCJteF9EaWFsb2dfY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge2VtYWlsQWRkcmVzc2VzfVxuICAgICAgICAgICAgICAgICAgICAgICAge3Blb3BsZUludHJvfVxuICAgICAgICAgICAgICAgICAgICAgICAge3Blb3BsZX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxBY2Nlc3NpYmxlQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZD1cInByaW1hcnlcIiBvbkNsaWNrPXt0aGlzLm9uU3VibWl0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPXt0aGlzLnN0YXRlLmJ1c3l9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lPVwibXhfQ29tbXVuaXR5UHJvdG90eXBlSW52aXRlRGlhbG9nX3ByaW1hcnlCdXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgPntidXR0b25UZXh0fTwvQWNjZXNzaWJsZUJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9CYXNlRGlhbG9nPlxuICAgICAgICApO1xuICAgIH1cbn1cbiJdfQ==