mirror of
https://github.com/ENSL/ensl_gathers.git
synced 2024-11-27 14:42:13 +00:00
386 lines
No EOL
37 KiB
JavaScript
386 lines
No EOL
37 KiB
JavaScript
$(function () {
|
|
|
|
"use strict";
|
|
|
|
var UserCounter = React.createClass({displayName: "UserCounter",
|
|
render: function () {
|
|
return (
|
|
React.createElement("li", null,
|
|
React.createElement("a", {href: "#"},
|
|
React.createElement("i", {className: "fa fa-users fa-fw"}), " Online",
|
|
React.createElement("span", {className: "badge add-left"}, " ", this.props.count, " ")
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var UserLogin = React.createClass({displayName: "UserLogin",
|
|
authorizeId: function (id) {
|
|
id = parseInt(id, 10);
|
|
socket.emit("users:authorize", {
|
|
id: id
|
|
});
|
|
},
|
|
handleSubmit: function (e) {
|
|
e.preventDefault();
|
|
var id = React.findDOMNode(this.refs.authorize_id).value.trim();
|
|
if (!id) return;
|
|
React.findDOMNode(this.refs.authorize_id).value = '';
|
|
this.authorizeId(id);
|
|
return;
|
|
},
|
|
render: function () {
|
|
return (
|
|
React.createElement("form", {onSubmit: this.handleSubmit},
|
|
React.createElement("div", {className: "input-group signin"},
|
|
React.createElement("input", {
|
|
id: "btn-input",
|
|
type: "text",
|
|
className: "form-control",
|
|
ref: "authorize_id",
|
|
placeholder: "Choose an ID..."}),
|
|
React.createElement("span", {className: "input-group-btn"},
|
|
React.createElement("input", {
|
|
type: "submit",
|
|
className: "btn btn-primary",
|
|
id: "btn-chat",
|
|
value: "Login"})
|
|
)
|
|
),
|
|
React.createElement("div", {className: "signin"},
|
|
React.createElement("p", {className: "text-center"}, React.createElement("small", null, "Just a temporary measure until genuine authentication is implemented"))
|
|
)
|
|
)
|
|
);
|
|
}
|
|
})
|
|
|
|
var UserLine = React.createClass({displayName: "UserLine",
|
|
render: function () {
|
|
return (
|
|
React.createElement("li", null,
|
|
React.createElement("a", {href: "#"}, this.props.user.username)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var UserMenu = React.createClass({displayName: "UserMenu",
|
|
getDefaultProps: function () {
|
|
return {
|
|
count: 0,
|
|
users: []
|
|
};
|
|
},
|
|
componentDidMount: function () {
|
|
socket.on('userCount', this.updateUsers);
|
|
},
|
|
updateUsers: function (data) {
|
|
this.setProps({
|
|
count: data.count,
|
|
users: data.users
|
|
});
|
|
},
|
|
render: function () {
|
|
var users = this.props.users.map(function (user) {
|
|
return (
|
|
React.createElement(UserLine, {user: user})
|
|
);
|
|
});
|
|
return (
|
|
React.createElement("ul", {className: "nav", id: "side-menu"},
|
|
React.createElement(UserCounter, React.__spread({}, this.props)),
|
|
users,
|
|
React.createElement("li", null, React.createElement("br", null), React.createElement(UserLogin, null), React.createElement("br", null))
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var Chatroom = React.createClass({displayName: "Chatroom",
|
|
getDefaultProps: function () {
|
|
return {
|
|
history: []
|
|
};
|
|
},
|
|
componentDidMount: function () {
|
|
var self = this;
|
|
var TIMER_INTERVAL = 60000; // Every minute
|
|
|
|
socket.on("message:new", function (data) {
|
|
var history = self.props.history;
|
|
history.push(data);
|
|
self.setProps({
|
|
history: history
|
|
});
|
|
self.scrollToBottom();
|
|
});
|
|
|
|
// Message History Retrieved
|
|
socket.on("message:refresh", function (data) {
|
|
self.setProps({
|
|
history: data.chatHistory
|
|
});
|
|
self.scrollToBottom();
|
|
});
|
|
|
|
socket.emit("message:refresh", {});
|
|
|
|
self.timer = setInterval(function () {
|
|
self.refs.messages.refreshTime();
|
|
}, TIMER_INTERVAL);
|
|
},
|
|
|
|
componentDidUnmount: function () {
|
|
clearInterval(this.timer);
|
|
},
|
|
sendMessage: function (message) {
|
|
socket.emit("newMessage", {message: message});
|
|
},
|
|
scrollToBottom: function () {
|
|
var node = React.findDOMNode(this.refs.messageContainer);
|
|
node.scrollTop = node.scrollHeight;
|
|
},
|
|
render: function () {
|
|
var messages = this.props.history.map(function (message) {
|
|
return (
|
|
React.createElement(ChatMessage, {
|
|
avatar: message.author.avatar,
|
|
username: message.author.username,
|
|
content: message.content,
|
|
ref: "messages",
|
|
createdAt: message.createdAt})
|
|
);
|
|
});
|
|
return (
|
|
React.createElement("div", {className: "panel panel-default"},
|
|
React.createElement("div", {className: "panel-heading"}, "Gather Chat"),
|
|
React.createElement("div", {className: "panel-body"},
|
|
React.createElement("ul", {className: "chat", id: "chatmessages", ref: "messageContainer"},
|
|
messages
|
|
)
|
|
),
|
|
React.createElement("div", {className: "panel-footer"},
|
|
React.createElement(MessageBar, null)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var ChatMessage = React.createClass({displayName: "ChatMessage",
|
|
getInitialState: function () {
|
|
return {
|
|
timeAgo: $.timeago(this.props.createdAt)
|
|
}
|
|
},
|
|
refreshTime: function () {
|
|
var self = this;
|
|
self.setState({
|
|
timeAgo: $.timeago(self.props.createdAt)
|
|
});
|
|
},
|
|
render: function () {
|
|
return (
|
|
React.createElement("li", {className: "left clearfix"},
|
|
React.createElement("span", {className: "chat-img pull-left"},
|
|
React.createElement("img", {
|
|
src: this.props.avatar,
|
|
alt: "User Avatar",
|
|
height: "40",
|
|
width: "40",
|
|
className: "img-circle"})
|
|
),
|
|
React.createElement("div", {className: "chat-body clearfix"},
|
|
React.createElement("div", {className: "header"},
|
|
React.createElement("strong", {className: "primary-font"}, this.props.username),
|
|
React.createElement("small", {className: "pull-right text-muted"},
|
|
React.createElement("i", {className: "fa fa-clock-o fa-fw"}), " ", this.state.timeAgo
|
|
)
|
|
),
|
|
React.createElement("p", null, this.props.content)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var MessageBar = React.createClass({displayName: "MessageBar",
|
|
sendMessage: function (content) {
|
|
socket.emit("message:new", {
|
|
content: content
|
|
});
|
|
},
|
|
handleSubmit: function (e) {
|
|
e.preventDefault();
|
|
var content = React.findDOMNode(this.refs.content).value.trim();
|
|
if (!content) return;
|
|
React.findDOMNode(this.refs.content).value = '';
|
|
this.sendMessage(content);
|
|
return;
|
|
},
|
|
render: function () {
|
|
return (
|
|
React.createElement("form", {onSubmit: this.handleSubmit},
|
|
React.createElement("div", {className: "input-group"},
|
|
React.createElement("input", {
|
|
id: "btn-input",
|
|
type: "text",
|
|
className: "form-control",
|
|
ref: "content",
|
|
placeholder: "Be polite please..."}),
|
|
React.createElement("span", {className: "input-group-btn"},
|
|
React.createElement("input", {
|
|
type: "submit",
|
|
className: "btn btn-primary",
|
|
id: "btn-chat",
|
|
value: "Send"})
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var Gather = React.createClass({displayName: "Gather",
|
|
getDefaultProps: function () {
|
|
return {
|
|
gather: {
|
|
gatherers: []
|
|
}
|
|
}
|
|
},
|
|
joinedGather: function () {
|
|
var self = this;
|
|
return this.props.gather.gatherers.some(function (gatherer) {
|
|
return gatherer.user.id === self.props.user.id;
|
|
});
|
|
},
|
|
componentDidMount: function () {
|
|
var self = this;
|
|
socket.on("gather:refresh", function (data) {
|
|
self.setProps({
|
|
gather: data.gather,
|
|
user: data.user
|
|
});
|
|
});
|
|
},
|
|
joinGather: function (e) {
|
|
e.preventDefault();
|
|
socket.emit("gather:join", {});
|
|
},
|
|
leaveGather: function (e) {
|
|
e.preventDefault();
|
|
socket.emit("gather:leave", {});
|
|
},
|
|
render: function () {
|
|
var joinButton;
|
|
if (this.joinedGather()) {
|
|
joinButton = (React.createElement("button", {
|
|
onClick: this.leaveGather,
|
|
className: "btn btn-danger"}, "Leave Gather"));
|
|
} else {
|
|
joinButton = (React.createElement("button", {
|
|
onClick: this.joinGather,
|
|
className: "btn btn-primary"}, "Join Gather"));
|
|
}
|
|
return (
|
|
React.createElement("div", {className: "panel panel-default"},
|
|
React.createElement("div", {className: "panel-heading"},
|
|
"Current Gather",
|
|
React.createElement("span", {className: "badge add-left"}, " ", this.props.gather.gatherers.length, " ")
|
|
),
|
|
React.createElement(Gatherers, {gatherers: this.props.gather.gatherers}),
|
|
React.createElement("div", {className: "panel-body"}
|
|
),
|
|
React.createElement("div", {className: "panel-footer text-right"},
|
|
joinButton
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
// var GatherState = React.createClass({
|
|
// getDefaultProps: function () {
|
|
// return {
|
|
// "state": "none"
|
|
// }
|
|
// },
|
|
// stateDescription: function () {
|
|
// switch(this.props.date) {
|
|
// case "gathering":
|
|
// return "Waiting on more players to join"
|
|
// }
|
|
// },
|
|
// render: function () {
|
|
// <div className="well">
|
|
// <p>{this.displayState}</p>
|
|
// </div>
|
|
// }
|
|
// })
|
|
|
|
var Gatherers = React.createClass({displayName: "Gatherers",
|
|
render: function () {
|
|
var gatherers = this.props.gatherers.map(function (gatherer) {
|
|
var lifeforms = (
|
|
gatherer.user.ability.lifeforms.map(function (lifeform) {
|
|
return React.createElement("span", {className: "label label-default"}, lifeform);
|
|
})
|
|
);
|
|
var division = (React.createElement("span", {className: "label label-primary"}, gatherer.user.ability.division))
|
|
|
|
return (
|
|
React.createElement("tr", null,
|
|
React.createElement("td", null, gatherer.user.username),
|
|
React.createElement("td", null, division),
|
|
React.createElement("td", null, lifeforms)
|
|
)
|
|
);
|
|
})
|
|
return (
|
|
React.createElement("table", {className: "table table-striped gatherer-table"},
|
|
React.createElement("thead", null,
|
|
React.createElement("tr", null,
|
|
React.createElement("th", null, "Player"),
|
|
React.createElement("th", null, "Ability"),
|
|
React.createElement("th", null, "Life Forms")
|
|
)
|
|
),
|
|
React.createElement("tbody", null,
|
|
gatherers
|
|
)
|
|
)
|
|
);
|
|
}
|
|
});
|
|
|
|
var socket;
|
|
|
|
function initialiseComponents () {
|
|
var socketUrl = window.location.protocol + "//" + window.location.host;
|
|
socket = io(socketUrl)
|
|
.on("connect", function () {
|
|
console.log("Connected");
|
|
})
|
|
.on("reconnect", function () {
|
|
console.log("Reconnected");
|
|
})
|
|
.on("disconnect", function () {
|
|
console.log("Disconnected")
|
|
});
|
|
|
|
React.render(React.createElement(UserMenu, null), document.getElementById('side-menu'));
|
|
React.render(React.createElement(Chatroom, null), document.getElementById('chatroom'));
|
|
React.render(React.createElement(Gather, null), document.getElementById('gathers'));
|
|
};
|
|
|
|
initialiseComponents();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtZWQuanMiLCJzb3VyY2VzIjpbbnVsbF0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLENBQUMsQ0FBQyxZQUFZOztBQUVkLFlBQVksQ0FBQzs7QUFFYixJQUFJLGlDQUFpQywyQkFBQTtDQUNwQyxNQUFNLEVBQUUsWUFBWTtFQUNuQjtHQUNDLG9CQUFBLElBQUcsRUFBQSxJQUFDLEVBQUE7SUFDSCxvQkFBQSxHQUFFLEVBQUEsQ0FBQSxDQUFDLElBQUEsRUFBSSxDQUFDLEdBQUksQ0FBQSxFQUFBO0tBQ1gsb0JBQUEsR0FBRSxFQUFBLENBQUEsQ0FBQyxTQUFBLEVBQVMsQ0FBQyxtQkFBb0IsQ0FBSSxDQUFBLEVBQUEsU0FBQSxFQUFBLENBQUE7QUFBQSxLQUNyQyxvQkFBQSxNQUFLLEVBQUEsQ0FBQSxDQUFDLFNBQUEsRUFBUyxDQUFDLGdCQUFpQixDQUFBLEVBQUEsR0FBQSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFDLEdBQVEsQ0FBQTtJQUN6RCxDQUFBO0dBQ0EsQ0FBQTtJQUNKO0VBQ0Y7QUFDRixDQUFDLENBQUMsQ0FBQzs7QUFFSCxJQUFJLCtCQUErQix5QkFBQTtDQUNsQyxXQUFXLEVBQUUsVUFBVSxFQUFFLEVBQUU7RUFDMUIsRUFBRSxHQUFHLFFBQVEsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7RUFDdEIsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtHQUM5QixFQUFFLEVBQUUsRUFBRTtHQUNOLENBQUMsQ0FBQztFQUNIO0NBQ0QsWUFBWSxFQUFFLFVBQVUsQ0FBQyxFQUFFO0VBQzFCLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztFQUNuQixJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0VBQ2hFLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTztFQUNoQixLQUFLLENB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QVEsQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztDQUNoRSxLQUFLLENBQUMsTUFBTSxDQUFDLG9CQUFDLE1BQU0sRUFBQSxJQUFBLENBQUcsQ0FBQSxFQUFFLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUM5RCxDQUFDLENBQUM7O0FBRUYsb0JBQW9CLEVBQUUsQ0FBQztBQUN2QjtBQUNBOztBQUVBLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiJChmdW5jdGlvbiAoKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgVXNlckNvdW50ZXIgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdHJlbmRlcjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8bGk+XG5cdFx0XHRcdDxhIGhyZWY9XCIjXCI+XG5cdFx0XHRcdFx0PGkgY2xhc3NOYW1lPVwiZmEgZmEtdXNlcnMgZmEtZndcIj48L2k+IE9ubGluZSBcblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJiYWRnZSBhZGQtbGVmdFwiPiB7dGhpcy5wcm9wcy5jb3VudH0gPC9zcGFuPlxuXHRcdFx0XHQ8L2E+XG5cdFx0XHQ8L2xpPlxuXHRcdCk7XG5cdH1cbn0pO1xuXG52YXIgVXNlckxvZ2luID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRhdXRob3JpemVJZDogZnVuY3Rpb24gKGlkKSB7XG5cdFx0aWQgPSBwYXJzZUludChpZCwgMTApO1xuXHRcdHNvY2tldC5lbWl0KFwidXNlcnM6YXV0aG9yaXplXCIsIHtcblx0XHRcdGlkOiBpZFxuXHRcdH0pO1xuXHR9LFxuXHRoYW5kbGVTdWJtaXQ6IGZ1bmN0aW9uIChlKSB7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHZhciBpZCA9IFJlYWN0LmZpbmRET01Ob2RlKHRoaXMucmVmcy5hdXRob3JpemVfaWQpLnZhbHVlLnRyaW0oKTtcblx0XHRpZiAoIWlkKSByZXR1cm47XG5cdFx0UmVhY3QuZmluZERPTU5vZGUodGhpcy5yZWZzLmF1dGhvcml6ZV9pZCkudmFsdWUgPSAnJztcblx0XHR0aGlzLmF1dGhvcml6ZUlkKGlkKTtcblx0XHRyZXR1cm47XG5cdH0sXG5cdHJlbmRlcjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9ID5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJpbnB1dC1ncm91cCBzaWduaW5cIj5cblx0XHRcdFx0XHQ8aW5wdXQgXG5cdFx0XHRcdFx0XHRpZD1cImJ0bi1pbnB1dFwiIFxuXHRcdFx0XHRcdFx0dHlwZT1cInRleHRcIiBcblx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cImZvcm0tY29udHJvbFwiIFxuXHRcdFx0XHRcdFx0cmVmPVwiYXV0aG9yaXplX2lkXCJcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiQ2hvb3NlIGFuIElELi4uXCIgLz5cblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJpbnB1dC1ncm91cC1idG5cIj5cblx0XHRcdFx0XHRcdDxpbnB1dCBcblx0XHRcdFx0XHRcdFx0dHlwZT1cInN1Ym1pdFwiIFxuXHRcdFx0XHRcdFx0XHRjbGFzc05hbWU9XCJidG4gYnRuLXByaW1hcnlcIiBcblx0XHRcdFx0XHRcdFx0aWQ9XCJidG4tY2hhdFwiIFxuXHRcdFx0XHRcdFx0XHR2YWx1ZT1cIkxvZ2luXCIgLz5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInNpZ25pblwiPlxuXHRcdFx0XHQ8cCBjbGFzc05hbWU9XCJ0ZXh0LWNlbnRlclwiPjxzbWFsbD5KdXN0IGEgdGVtcG9yYXJ5IG1lYXN1cmUgdW50aWwgZ2VudWluZSBhdXRoZW50aWNhdGlvbiBpcyBpbXBsZW1lbnRlZDwvc21hbGw+PC9wPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZm9ybT5cblx0XHQpO1xuXHR9XG59KVxuXG52YXIgVXNlckxpbmUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdHJlbmRlcjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8bGk+XG5cdFx0XHRcdDxhIGhyZWY9XCIjXCI+e3RoaXMucHJvcHMudXNlci51c2VybmFtZX08L2E+XG5cdFx0XHQ8L2xpPlxuXHRcdCk7XG5cdH1cbn0pO1xuXG52YXIgVXNlck1lbnUgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdGdldERlZmF1bHRQcm9wczogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb3VudDogMCxcblx0XHRcdHVzZXJzOiBbXVxuXHRcdH07XG5cdH0sXG5cdGNvbXBvbmVudERpZE1vdW50OiBmdW5jdGlvbiAoKSB7XG5cdFx0c29ja2V0Lm9uKCd1c2VyQ291bnQnLCB0aGlzLnVwZGF0ZVVzZXJzKTtcblx0fSxcblx0dXBkYXRlVXNlcnM6IGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0dGhpcy5zZXRQcm9wcyh7XG5cdFx0XHRjb3VudDogZGF0YS5jb3VudCxcblx0XHRcdHVzZXJzOiBkYXRhLnVzZXJzXG5cdFx0fSk7XG5cdH0sXG5cdHJlbmRlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciB1c2VycyA9IHRoaXMucHJvcHMudXNlcnMubWFwKGZ1bmN0aW9uICh1c2VyKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8VXNlckxpbmUgdXNlcj17dXNlcn0gLz5cblx0XHRcdCk7XG5cdFx0fSk7XG5cdFx0cmV0dXJuIChcblx0XHRcdDx1bCBjbGFzc05hbWU9XCJuYXZcIiBpZD1cInNpZGUtbWVudVwiPlxuXHRcdFx0XHQ8VXNlckNvdW50ZXIgey4uLnRoaXMucHJvcHN9IC8+XG5cdFx0XHRcdHt1c2Vyc31cblx0XHRcdFx0PGxpPjxiciAvPjxVc2VyTG9naW4gLz48YnIgLz48L2xpPlxuXHRcdFx0PC91bD5cblx0XHQpO1xuXHR9XG59KTtcblxudmFyIENoYXRyb29tID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aGlzdG9yeTogW11cblx0XHR9O1xuXHR9LFxuXHRjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHR2YXIgVElNRVJfSU5URVJWQUwgPSA2MDAwMDsgLy8gRXZlcnkgbWludXRlXG5cblx0XHRzb2NrZXQub24oXCJtZXNzYWdlOm5ld1wiLCBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0dmFyIGhpc3RvcnkgPSBzZWxmLnByb3BzLmhpc3Rvcnk7XG5cdFx0XHRoaXN0b3J5LnB1c2goZGF0YSk7XG5cdFx0XHRzZWxmLnNldFByb3BzKHtcblx0XHRcdFx0aGlzdG9yeTogaGlzdG9yeVxuXHRcdFx0fSk7XG5cdFx0XHRzZWxmLnNjcm9sbFRvQm90dG9tKCk7XG5cdFx0fSk7XG5cblx0XHQvLyBNZXNzYWdlIEhpc3RvcnkgUmV0cmlldmVkXG5cdFx0c29ja2V0Lm9uKFwibWVzc2FnZTpyZWZyZXNoXCIsIGZ1bmN0aW9uIChkYXRhKSB7XG5cdFx0XHRzZWxmLnNldFByb3BzKHtcblx0XHRcdFx0aGlzdG9yeTogZGF0YS5jaGF0SGlzdG9yeVxuXHRcdFx0fSk7XG5cdFx0XHRzZWxmLnNjcm9sbFRvQm90dG9tKCk7XG5cdFx0fSk7XG5cblx0XHRzb2NrZXQuZW1pdChcIm1lc3NhZ2U6cmVmcmVzaFwiLCB7fSk7XG5cblx0XHRzZWxmLnRpbWVyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkge1xuXHRcdFx0c2VsZi5yZWZzLm1lc3NhZ2VzLnJlZnJlc2hUaW1lKCk7XG5cdFx0fSwgVElNRVJfSU5URVJWQUwpO1xuXHR9LFxuXG5cdGNvbXBvbmVudERpZFVubW91bnQ6IGZ1bmN0aW9uICgpIHtcblx0XHRjbGVhckludGVydmFsKHRoaXMudGltZXIpO1xuXHR9LFxuXHRzZW5kTWVzc2FnZTogZnVuY3Rpb24gKG1lc3NhZ2UpIHtcblx0XHRzb2NrZXQuZW1pdChcIm5ld01lc3NhZ2VcIiwge21lc3NhZ2U6IG1lc3NhZ2V9KTtcblx0fSxcblx0c2Nyb2xsVG9Cb3R0b206IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgbm9kZSA9IFJlYWN0LmZpbmRET01Ob2RlKHRoaXMucmVmcy5tZXNzYWdlQ29udGFpbmVyKTtcblx0ICBub2RlLnNjcm9sbFRvcCA9IG5vZGUuc2Nyb2xsSGVpZ2h0O1xuXHR9LFxuXHRyZW5kZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgbWVzc2FnZXMgPSB0aGlzLnByb3BzLmhpc3RvcnkubWFwKGZ1bmN0aW9uIChtZXNzYWdlKSB7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHQ8Q2hhdE1lc3NhZ2UgXG5cdFx0XHRcdFx0YXZhdGFyPXttZXNzYWdlLmF1dGhvci5hdmF0YXJ9IFxuXHRcdFx0XHRcdHVzZXJuYW1lPXttZXNzYWdlLmF1dGhvci51c2VybmFtZX1cblx0XHRcdFx0XHRjb250ZW50PXttZXNzYWdlLmNvbnRlbnR9XG5cdFx0XHRcdFx0cmVmPVwibWVzc2FnZXNcIlxuXHRcdFx0XHRcdGNyZWF0ZWRBdD17bWVzc2FnZS5jcmVhdGVkQXR9IC8+XG5cdFx0XHQpO1xuXHRcdH0pO1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJwYW5lbC1oZWFkaW5nXCI+R2F0aGVyIENoYXQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cdFx0XHRcdFx0PHVsIGNsYXNzTmFtZT1cImNoYXRcIiBpZD1cImNoYXRtZXNzYWdlc1wiIHJlZj1cIm1lc3NhZ2VDb250YWluZXJcIj5cblx0XHRcdFx0XHRcdHttZXNzYWdlc31cblx0XHRcdFx0XHQ8L3VsPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJwYW5lbC1mb290ZXJcIj5cblx0XHRcdFx0XHQ8TWVzc2FnZUJhciAvPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvZGl2PlxuXHRcdCk7XG5cdH1cbn0pO1xuXG52YXIgQ2hhdE1lc3NhZ2UgPSBSZWFjdC5jcmVhdGVDbGFzcyh7XG5cdGdldEluaXRpYWxTdGF0ZTogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR0aW1lQWdvOiAkLnRpbWVhZ28odGhpcy5wcm9wcy5jcmVhdGVkQXQpXG5cdFx0fVxuXHR9LFxuXHRyZWZyZXNoVGltZTogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRzZWxmLnNldFN0YXRlKHtcblx0XHRcdHRpbWVBZ286ICQudGltZWFnbyhzZWxmLnByb3BzLmNyZWF0ZWRBdClcblx0XHR9KTtcblx0fSxcblx0cmVuZGVyOiBmdW5jdGlvbiAoKSB7XG5cdFx0cmV0dXJuIChcblx0XHRcdDxsaSBjbGFzc05hbWU9XCJsZWZ0IGNsZWFyZml4XCI+XG5cdFx0XHRcdDxzcGFuIGNsYXNzTmFtZT1cImNoYXQtaW1nIHB1bGwtbGVmdFwiPlxuXHRcdFx0XHRcdFx0PGltZyBcblx0XHRcdFx0XHRcdFx0c3JjPXt0aGlzLnByb3BzLmF2YXRhcn0gXG5cdFx0XHRcdFx0XHRcdGFsdD1cIlVzZXIgQXZhdGFyXCIgXG5cdFx0XHRcdFx0XHRcdGhlaWdodD1cIjQwXCJcblx0XHRcdFx0XHRcdFx0d2lkdGg9XCI0MFwiXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cImltZy1jaXJjbGVcIiAvPlxuXHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDxkaXYgY2xhc3NOYW1lPVwiY2hhdC1ib2R5IGNsZWFyZml4XCI+XG5cdFx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJoZWFkZXJcIj5cblx0XHRcdFx0XHRcdDxzdHJvbmcgY2xhc3NOYW1lPVwicHJpbWFyeS1mb250XCI+e3RoaXMucHJvcHMudXNlcm5hbWV9PC9zdHJvbmc+XG5cdFx0XHRcdFx0XHQ8c21hbGwgY2xhc3NOYW1lPVwicHVsbC1yaWdodCB0ZXh0LW11dGVkXCI+XG5cdFx0XHRcdFx0XHRcdDxpIGNsYXNzTmFtZT1cImZhIGZhLWNsb2NrLW8gZmEtZndcIj48L2k+IHt0aGlzLnN0YXRlLnRpbWVBZ299XG5cdFx0XHRcdFx0XHQ8L3NtYWxsPlxuXHRcdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHRcdDxwPnt0aGlzLnByb3BzLmNvbnRlbnR9PC9wPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdDwvbGk+XG5cdFx0KTtcblx0fVxufSk7XG5cbnZhciBNZXNzYWdlQmFyID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRzZW5kTWVzc2FnZTogZnVuY3Rpb24gKGNvbnRlbnQpIHtcblx0XHRzb2NrZXQuZW1pdChcIm1lc3NhZ2U6bmV3XCIsIHtcblx0XHRcdGNvbnRlbnQ6IGNvbnRlbnRcblx0XHR9KTtcblx0fSxcblx0aGFuZGxlU3VibWl0OiBmdW5jdGlvbiAoZSkge1xuXHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR2YXIgY29udGVudCA9IFJlYWN0LmZpbmRET01Ob2RlKHRoaXMucmVmcy5jb250ZW50KS52YWx1ZS50cmltKCk7XG5cdFx0aWYgKCFjb250ZW50KSByZXR1cm47XG5cdFx0UmVhY3QuZmluZERPTU5vZGUodGhpcy5yZWZzLmNvbnRlbnQpLnZhbHVlID0gJyc7XG5cdFx0dGhpcy5zZW5kTWVzc2FnZShjb250ZW50KTtcblx0XHRyZXR1cm47XG5cdH0sXG5cdHJlbmRlcjogZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiAoXG5cdFx0XHQ8Zm9ybSBvblN1Ym1pdD17dGhpcy5oYW5kbGVTdWJtaXR9ID5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJpbnB1dC1ncm91cFwiPlxuXHRcdFx0XHRcdDxpbnB1dCBcblx0XHRcdFx0XHRcdGlkPVwiYnRuLWlucHV0XCIgXG5cdFx0XHRcdFx0XHR0eXBlPVwidGV4dFwiIFxuXHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwiZm9ybS1jb250cm9sXCIgXG5cdFx0XHRcdFx0XHRyZWY9XCJjb250ZW50XCJcblx0XHRcdFx0XHRcdHBsYWNlaG9sZGVyPVwiQmUgcG9saXRlIHBsZWFzZS4uLlwiIC8+XG5cdFx0XHRcdFx0PHNwYW4gY2xhc3NOYW1lPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG5cdFx0XHRcdFx0XHQ8aW5wdXQgXG5cdFx0XHRcdFx0XHRcdHR5cGU9XCJzdWJtaXRcIiBcblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwiYnRuIGJ0bi1wcmltYXJ5XCIgXG5cdFx0XHRcdFx0XHRcdGlkPVwiYnRuLWNoYXRcIiBcblx0XHRcdFx0XHRcdFx0dmFsdWU9XCJTZW5kXCIgLz5cblx0XHRcdFx0XHQ8L3NwYW4+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9mb3JtPlxuXHRcdCk7XG5cdH1cbn0pO1xuXG52YXIgR2F0aGVyID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRnZXREZWZhdWx0UHJvcHM6IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0Z2F0aGVyOiB7XG5cdFx0XHRcdGdhdGhlcmVyczogW11cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cdGpvaW5lZEdhdGhlcjogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRyZXR1cm4gdGhpcy5wcm9wcy5nYXRoZXIuZ2F0aGVyZXJzLnNvbWUoZnVuY3Rpb24gKGdhdGhlcmVyKSB7XG5cdFx0XHRyZXR1cm4gZ2F0aGVyZXIudXNlci5pZCA9PT0gc2VsZi5wcm9wcy51c2VyLmlkO1xuXHRcdH0pO1xuXHR9LFxuXHRjb21wb25lbnREaWRNb3VudDogZnVuY3Rpb24gKCkge1xuXHRcdHZhciBzZWxmID0gdGhpcztcblx0XHRzb2NrZXQub24oXCJnYXRoZXI6cmVmcmVzaFwiLCBmdW5jdGlvbiAoZGF0YSkge1xuXHRcdFx0c2VsZi5zZXRQcm9wcyh7XG5cdFx0XHRcdGdhdGhlcjogZGF0YS5nYXRoZXIsXG5cdFx0XHRcdHVzZXI6IGRhdGEudXNlclxuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH0sXG5cdGpvaW5HYXRoZXI6IGZ1bmN0aW9uIChlKSB7XG5cdFx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdHNvY2tldC5lbWl0KFwiZ2F0aGVyOmpvaW5cIiwge30pO1xuXHR9LFxuXHRsZWF2ZUdhdGhlcjogZnVuY3Rpb24gKGUpIHtcblx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0c29ja2V0LmVtaXQoXCJnYXRoZXI6bGVhdmVcIiwge30pO1xuXHR9LFxuXHRyZW5kZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgam9pbkJ1dHRvbjtcblx0XHRpZiAodGhpcy5qb2luZWRHYXRoZXIoKSkge1xuXHRcdFx0am9pbkJ1dHRvbiA9ICg8YnV0dG9uIFxuXHRcdFx0XHRcdFx0XHRvbkNsaWNrPXt0aGlzLmxlYXZlR2F0aGVyfSBcblx0XHRcdFx0XHRcdFx0Y2xhc3NOYW1lPVwiYnRuIGJ0bi1kYW5nZXJcIj5MZWF2ZSBHYXRoZXI8L2J1dHRvbj4pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqb2luQnV0dG9uID0gKDxidXR0b24gXG5cdFx0XHRcdFx0XHRcdG9uQ2xpY2s9e3RoaXMuam9pbkdhdGhlcn0gXG5cdFx0XHRcdFx0XHRcdGNsYXNzTmFtZT1cImJ0biBidG4tcHJpbWFyeVwiPkpvaW4gR2F0aGVyPC9idXR0b24+KTtcblx0XHR9XG5cdFx0cmV0dXJuIChcblx0XHRcdDxkaXYgY2xhc3NOYW1lPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWhlYWRpbmdcIj5cblx0XHRcdFx0XHRDdXJyZW50IEdhdGhlciBcblx0XHRcdFx0XHQ8c3BhbiBjbGFzc05hbWU9XCJiYWRnZSBhZGQtbGVmdFwiPiB7dGhpcy5wcm9wcy5nYXRoZXIuZ2F0aGVyZXJzLmxlbmd0aH0gPC9zcGFuPlxuXHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PEdhdGhlcmVycyBnYXRoZXJlcnM9e3RoaXMucHJvcHMuZ2F0aGVyLmdhdGhlcmVyc30gLz5cblx0XHRcdFx0PGRpdiBjbGFzc05hbWU9XCJwYW5lbC1ib2R5XCI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0XHQ8ZGl2IGNsYXNzTmFtZT1cInBhbmVsLWZvb3RlciB0ZXh0LXJpZ2h0XCI+XG5cdFx0XHRcdFx0e2pvaW5CdXR0b259XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0KTtcblx0fVxufSk7XG5cbi8vIHZhciBHYXRoZXJTdGF0ZSA9IFJlYWN0LmNyZWF0ZUNsYXNzKHtcbi8vIFx0Z2V0RGVmYXVsdFByb3BzOiBmdW5jdGlvbiAoKSB7XG4vLyBcdFx0cmV0dXJuIHtcbi8vIFx0XHRcdFwic3RhdGVcIjogXCJub25lXCJcbi8vIFx0XHR9XG4vLyBcdH0sXG4vLyBcdHN0YXRlRGVzY3JpcHRpb246IGZ1bmN0aW9uICgpIHtcbi8vIFx0XHRzd2l0Y2godGhpcy5wcm9wcy5kYXRlKSB7XG4vLyBcdFx0XHRjYXNlIFwiZ2F0aGVyaW5nXCI6XG4vLyBcdFx0XHRcdHJldHVybiBcIldhaXRpbmcgb24gbW9yZSBwbGF5ZXJzIHRvIGpvaW5cIlxuLy8gXHRcdH1cbi8vIFx0fSxcbi8vIFx0cmVuZGVyOiBmdW5jdGlvbiAoKSB7XG4vLyBcdFx0PGRpdiBjbGFzc05hbWU9XCJ3ZWxsXCI+XG4vLyBcdFx0XHQ8cD57dGhpcy5kaXNwbGF5U3RhdGV9PC9wPlxuLy8gXHRcdDwvZGl2PlxuLy8gXHR9XG4vLyB9KVxuXG52YXIgR2F0aGVyZXJzID0gUmVhY3QuY3JlYXRlQ2xhc3Moe1xuXHRyZW5kZXI6IGZ1bmN0aW9uICgpIHtcblx0XHR2YXIgZ2F0aGVyZXJzID0gdGhpcy5wcm9wcy5nYXRoZXJlcnMubWFwKGZ1bmN0aW9uIChnYXRoZXJlcikge1xuXHRcdFx0dmFyIGxpZmVmb3JtcyA9IChcblx0XHRcdFx0Z2F0aGVyZXIudXNlci5hYmlsaXR5LmxpZmVmb3Jtcy5tYXAoZnVuY3Rpb24gKGxpZmVmb3JtKSB7XG5cdFx0XHRcdFx0cmV0dXJuIDxzcGFuIGNsYXNzTmFtZT1cImxhYmVsIGxhYmVsLWRlZmF1bHRcIj57bGlmZWZvcm19PC9zcGFuPjtcblx0XHRcdFx0fSlcblx0XHRcdCk7XG5cdFx0XHR2YXIgZGl2aXNpb24gPSAoPHNwYW4gY2xhc3NOYW1lPVwibGFiZWwgbGFiZWwtcHJpbWFyeVwiPntnYXRoZXJlci51c2VyLmFiaWxpdHkuZGl2aXNpb259PC9zcGFuPilcblxuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdDx0ZD57Z2F0aGVyZXIudXNlci51c2VybmFtZX08L3RkPlxuXHRcdFx0XHRcdDx0ZD57ZGl2aXNpb259PC90ZD5cblx0XHRcdFx0XHQ8dGQ+e2xpZmVmb3Jtc308L3RkPlxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0KTtcblx0XHR9KVxuXHRcdHJldHVybiAoXG5cdFx0XHQ8dGFibGUgY2xhc3NOYW1lPVwidGFibGUgdGFibGUtc3RyaXBlZCBnYXRoZXJlci10YWJsZVwiPlxuXHRcdFx0XHQ8dGhlYWQ+XG5cdFx0XHRcdFx0PHRyPlxuXHRcdFx0XHRcdFx0PHRoPlBsYXllcjwvdGg+XG5cdFx0XHRcdFx0XHQ8dGg+QWJpbGl0eTwvdGg+XG5cdFx0XHRcdFx0XHQ8dGg+TGlmZSBGb3JtczwvdGg+XG5cdFx0XHRcdFx0PC90cj5cblx0XHRcdFx0PC90aGVhZD5cblx0XHRcdFx0PHRib2R5PlxuXHRcdFx0XHRcdHtnYXRoZXJlcnN9XG5cdFx0XHRcdDwvdGJvZHk+XG5cdFx0XHQ8L3RhYmxlPlxuXHRcdCk7XG5cdH1cbn0pO1xuXG52YXIgc29ja2V0O1xuXG5mdW5jdGlvbiBpbml0aWFsaXNlQ29tcG9uZW50cyAoKSB7XG5cdHZhciBzb2NrZXRVcmwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKyB3aW5kb3cubG9jYXRpb24uaG9zdDtcblx0c29ja2V0ID0gaW8oc29ja2V0VXJsKVxuXHRcdC5vbihcImNvbm5lY3RcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJDb25uZWN0ZWRcIik7XG5cdFx0fSlcblx0XHQub24oXCJyZWNvbm5lY3RcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJSZWNvbm5lY3RlZFwiKTtcblx0XHR9KVxuXHRcdC5vbihcImRpc2Nvbm5lY3RcIiwgZnVuY3Rpb24gKCkge1xuXHRcdFx0Y29uc29sZS5sb2coXCJEaXNjb25uZWN0ZWRcIilcblx0XHR9KTtcblxuXHRSZWFjdC5yZW5kZXIoPFVzZXJNZW51IC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2lkZS1tZW51JykpO1xuXHRSZWFjdC5yZW5kZXIoPENoYXRyb29tIC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2hhdHJvb20nKSk7XG5cdFJlYWN0LnJlbmRlcig8R2F0aGVyIC8+LCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZ2F0aGVycycpKTtcbn07XG5cbmluaXRpYWxpc2VDb21wb25lbnRzKCk7XG5cblxuXG59KTtcblxuIl19
|