use-stomp
Version:
react provider, class decorator, and a hook for websockets using the stomp protocol
404 lines (324 loc) • 53.5 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
require("core-js/modules/es.array.concat");
require("core-js/modules/es.array.filter");
require("core-js/modules/es.array.for-each");
require("core-js/modules/es.array.iterator");
require("core-js/modules/es.map");
require("core-js/modules/es.object.get-own-property-descriptor");
require("core-js/modules/es.object.to-string");
require("core-js/modules/es.set");
require("core-js/modules/es.string.iterator");
require("core-js/modules/web.dom-collections.for-each");
require("core-js/modules/web.dom-collections.iterator");
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _sockjsClient = _interopRequireDefault(require("sockjs-client"));
var _uuid = require("uuid");
var _stomp = _interopRequireDefault(require("./stomp"));
var _webSocketConfigs = require("./webSocketConfigs");
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
var _self = self;
var ctx = {
WEBSOCKET: null,
WEBSOCKET_AUTH_HEADER: '',
WEBSOCKET_CONNECTION: _webSocketConfigs.States.DISCONNECTED,
WEBSOCKET_HEADER: '',
WEBSOCKET_EXPLICIT_DISCONNECT: false,
WEBSOCKET_URL: '',
WEBSOCKET_STATE: {},
WEBSOCKET_PORTS: new Map(),
WEBSOCKET_CHANNELS: new Map(),
WEBSOCKET_RECONNECT_COUNT: 0,
WEBSOCKET_RECONNECT_INTERVAL: null,
WEBSOCKET_RECONNECT_INTERVAL_MS: 10000,
WEBSOCKET_RECONNECT_MAX_ATTEMPTS: 10,
WEBSOCKET_SUBSCRIPTIONS: new Map(),
WEBSOCKET_VISIBLE_TABS: new Set()
};
function packageMessage(message) {
try {
return (0, _typeof2.default)(message) === 'object' && message !== null ? JSON.stringify(message) : message;
} catch (e) {
return message;
}
}
function parseMessage(message) {
try {
var parsed = JSON.parse(message);
return (0, _typeof2.default)(parsed) === 'object' && parsed !== null && parsed.content ? parsed.content : parsed;
} catch (e) {
return message;
}
}
var broadcast = function broadcast(type, payload) {
ctx.WEBSOCKET_PORTS.forEach(function (port, id) {
emit(id, type, payload);
});
};
var emit = function emit(id, type, payload) {
var onlyVisible = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
if (ctx.WEBSOCKET_PORTS.has(id)) {
// if (!onlyVisible || ctx.WEBSOCKET_VISIBLE_TABS.has(id)) {
ctx.WEBSOCKET_PORTS.get(id).postMessage({
type: type,
payload: payload
});
}
};
var onConnected = function onConnected() {
console.log('[use-stomp::ws::connected]');
resubscribeAll();
setState(_webSocketConfigs.States.CONNECTED);
};
var onChannelMessage = function onChannelMessage(channel) {
return function (msg) {
var message = parseMessage(msg.body);
if ((message === null || message === void 0 ? void 0 : message.status) === 'END') {
disconnect();
} else {
// if (isAnyTabVisible()) {
ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).forEach(function (id) {
emit(id, _webSocketConfigs.Events.MESSAGE, {
channel: channel,
message: message
});
}); // } else {
// }
}
};
};
var onChannelMessageSync = function onChannelMessageSync(channel) {
return function (msg) {
var message = parseMessage(msg.body);
if ((message === null || message === void 0 ? void 0 : message.status) === 'END') {
disconnect();
} else {
ctx.WEBSOCKET_STATE[channel] = [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_STATE[channel] || []), [{
id: (0, _uuid.v4)(),
message: message
}]);
(ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel) || []).forEach(function (id) {
emit(id, _webSocketConfigs.Events.MESSAGE, {
channel: channel,
message: ctx.WEBSOCKET_STATE[channel]
});
});
}
};
};
var onDismissSync = function onDismissSync(e) {
ctx.WEBSOCKET_STATE[e.data.payload.channel] = ctx.WEBSOCKET_STATE[e.data.payload.channel].filter(function (message) {
return message.id !== e.data.payload.id;
});
(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel) || []).forEach(function (id) {
emit(id, _webSocketConfigs.Events.MESSAGE, {
channel: e.data.payload.channel,
message: ctx.WEBSOCKET_STATE[e.data.payload.channel]
});
});
};
var onDisconnected = function onDisconnected() {
console.log('[use-stomp::ws::disconnected]');
setState(_webSocketConfigs.States.DISCONNECTED);
if (!ctx.WEBSOCKET_EXPLICIT_DISCONNECT && !ctx.WEBSOCKET_RECONNECT_INTERVAL && !ctx.WEBSOCKET_RECONNECT_COUNT) {
ctx.WEBSOCKET_RECONNECT_COUNT = 1;
var maxAttempts = ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS;
var reconnect = function reconnect() {
console.log('[use-stomp::ws::reconnecting]', "".concat(ctx.WEBSOCKET_RECONNECT_COUNT, " / ").concat(maxAttempts));
var hasMaxAttempts = ctx.WEBSOCKET_RECONNECT_COUNT > maxAttempts;
var canTerminate = isConnected() || hasMaxAttempts;
if (canTerminate) {
console.log('[use-stomp::ws::reconnected]');
clearInterval(ctx.WEBSOCKET_RECONNECT_INTERVAL);
ctx.WEBSOCKET_RECONNECT_COUNT = 0;
ctx.WEBSOCKET_RECONNECT_INTERVAL = null;
} else if (!isConnecting() && !isConnected() && !hasMaxAttempts) {
ctx.WEBSOCKET_RECONNECT_COUNT = ctx.WEBSOCKET_RECONNECT_COUNT + 1;
connect();
}
};
ctx.WEBSOCKET_RECONNECT_INTERVAL = setInterval(reconnect, ctx.WEBSOCKET_RECONNECT_INTERVAL_MS);
reconnect();
}
};
var onError = function onError(e) {
broadcast(_webSocketConfigs.Events.ERROR, e);
};
var isConnected = function isConnected() {
return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.CONNECTED;
};
var isConnecting = function isConnecting() {
return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.CONNECTING;
};
var isDisconnected = function isDisconnected() {
return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.DISCONNECTED;
};
var isDisconnecting = function isDisconnecting() {
return ctx.WEBSOCKET_CONNECTION === _webSocketConfigs.States.DISCONNECTING;
};
var isAnyTabVisible = function isAnyTabVisible() {
return ctx.WEBSOCKET_VISIBLE_TABS.size > 0;
};
var connect = function connect() {
if (isConnecting() || isConnected() || isDisconnecting()) {
return;
}
disconnect();
setState(_webSocketConfigs.States.CONNECTING);
ctx.WEBSOCKET = _stomp.default.over(new _sockjsClient.default(ctx.WEBSOCKET_URL, null, {}));
ctx.WEBSOCKET.connect(ctx.WEBSOCKET_AUTH_HEADER ? {
Authorization: ctx.WEBSOCKET_AUTH_HEADER
} : ctx.WEBSOCKET_HEADER, onConnected, onDisconnected, onError);
};
var disconnect = function disconnect() {
if (isDisconnecting() || isDisconnected()) {
return;
}
ctx.WEBSOCKET_EXPLICIT_DISCONNECT = true;
setState(_webSocketConfigs.States.DISCONNECTING);
unsubscribeAll();
if (ctx.WEBSOCKET) {
ctx.WEBSOCKET.disconnect(function () {
ctx.WEBSOCKET_EXPLICIT_DISCONNECT = false;
});
}
setState(_webSocketConfigs.States.DISCONNECTED);
};
var testDisconnect = function testDisconnect() {
if (isConnected() && !(isDisconnected() || isDisconnecting())) {
setState(_webSocketConfigs.States.DISCONNECTING);
unsubscribeAll();
if (ctx.WEBSOCKET) {
ctx.WEBSOCKET.disconnect();
}
setState(_webSocketConfigs.States.DISCONNECTED);
}
};
var resubscribeAll = function resubscribeAll() {
var _ctx$WEBSOCKET, _ctx$WEBSOCKET2;
if ((_ctx$WEBSOCKET = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET !== void 0 && _ctx$WEBSOCKET.subscribe && (_ctx$WEBSOCKET2 = ctx.WEBSOCKET) !== null && _ctx$WEBSOCKET2 !== void 0 && _ctx$WEBSOCKET2.connected && isConnected()) {
ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) {
ctx.WEBSOCKET_CHANNELS.set(channel, ctx.WEBSOCKET.subscribe(channel, onChannelMessage(channel)));
});
}
};
var subscribe = function subscribe(e) {
if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) {
ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessage(e.data.payload.channel)));
} // if channel has no subscriptions, set it as an array and add id
if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) {
ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]);
} else {
// if channel does exist, update the ids to include id
ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id]));
}
};
var subscribeSync = function subscribeSync(e) {
if (isConnected() && !ctx.WEBSOCKET_CHANNELS.has(e.data.payload.channel)) {
ctx.WEBSOCKET_CHANNELS.set(e.data.payload.channel, ctx.WEBSOCKET.subscribe(e.data.payload.channel, onChannelMessageSync(e.data.payload.channel)));
} // if channel has no subscriptions, set it as an array and add id
if (!ctx.WEBSOCKET_SUBSCRIPTIONS.has(e.data.payload.channel)) {
ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [e.data.payload.id]);
} else {
// if channel does exist, update the ids to include id
ctx.WEBSOCKET_SUBSCRIPTIONS.set(e.data.payload.channel, [].concat((0, _toConsumableArray2.default)(ctx.WEBSOCKET_SUBSCRIPTIONS.get(e.data.payload.channel)), [e.data.payload.id]));
}
};
var sendMessage = function sendMessage(e) {
if (ctx.WEBSOCKET && isConnected()) {
ctx.WEBSOCKET.send(e.data.payload.channel, null, packageMessage(e.data.payload.message));
}
};
var setAuthHeader = function setAuthHeader(e) {
ctx.WEBSOCKET_AUTH_HEADER = e.data.payload;
};
var setHeader = function setHeader(e) {
ctx.WEBSOCKET_HEADER = e.data.payload;
};
var setUrl = function setUrl(e) {
ctx.WEBSOCKET_URL = e.data.payload;
};
var setVisibility = function setVisibility(e) {
var visible = e.data.payload.visibility;
var current = ctx.WEBSOCKET_VISIBLE_TABS.has(e.data.payload.id);
if (visible && !current) {
ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id);
}
if (!visible && current) {
ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id);
}
};
var setState = function setState(state) {
ctx.WEBSOCKET_CONNECTION = state;
broadcast(_webSocketConfigs.Events.CONNECTION, ctx.WEBSOCKET_CONNECTION);
};
var unregister = function unregister(e) {
ctx.WEBSOCKET_PORTS.delete(e.data.payload.id);
ctx.WEBSOCKET_VISIBLE_TABS.delete(e.data.payload.id);
ctx.WEBSOCKET_SUBSCRIPTIONS.forEach(function (ids, channel) {
unsubscribe(_objectSpread(_objectSpread({}, e), {}, {
data: {
payload: _objectSpread(_objectSpread({}, e.data.payload), {}, {
channel: channel
})
}
}));
});
};
var unsubscribe = function unsubscribe(e) {
var uuid = e.data.payload.id;
var channel = e.data.payload.channel;
if (ctx.WEBSOCKET_SUBSCRIPTIONS.has(channel)) {
var ids = ctx.WEBSOCKET_SUBSCRIPTIONS.get(channel).filter(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("ids", function (id) {
return id !== uuid;
}));
if (!ids.length) {
ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel);
ctx.WEBSOCKET_CHANNELS.get(channel).unsubscribe();
ctx.WEBSOCKET_CHANNELS.delete(channel);
} else {
ctx.WEBSOCKET_SUBSCRIPTIONS.set(channel, ids);
}
}
};
var unsubscribeAll = function unsubscribeAll() {
ctx.WEBSOCKET_CHANNELS.forEach(function (subscription, channel) {
subscription.unsubscribe();
ctx.WEBSOCKET_CHANNELS.delete(channel);
ctx.WEBSOCKET_SUBSCRIPTIONS.delete(channel);
});
};
_self.addEventListener('connect', function (e) {
var port = e.ports[0];
var register = function register(e) {
ctx.WEBSOCKET_PORTS.set(e.data.payload.id, port);
ctx.WEBSOCKET_RECONNECT_INTERVAL_MS = e.data.payload.reconnectInterval;
ctx.WEBSOCKET_RECONNECT_MAX_ATTEMPTS = e.data.payload.reconnectMaxAttempts;
if (e.data.payload.visible) {
ctx.WEBSOCKET_VISIBLE_TABS.add(e.data.payload.id);
}
};
port.addEventListener('message', function (e) {
var _messageBroker;
var messageBroker = (_messageBroker = {}, (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.CONNECT, connect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.DISMISS_SYNC, onDismissSync), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.DISCONNECT, disconnect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.REGISTER, register), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SEND_MESSAGE, sendMessage), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_AUTH_HEADER, setAuthHeader), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_HEADER, setHeader), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_URL, setUrl), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SET_VISIBILITY, setVisibility), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SUBSCRIBE, subscribe), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.SUBSCRIBE_SYNC, subscribeSync), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.TEST_DISCONNECT, testDisconnect), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNREGISTER, unregister), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNSUBSCRIBE, unsubscribe), (0, _defineProperty2.default)(_messageBroker, _webSocketConfigs.Events.UNSUBSCRIBE_SYNC, unsubscribe), _messageBroker);
if (messageBroker[e.data.type]) {
messageBroker[e.data.type](e);
}
});
port.start();
console.log('[use-stomp::port::connected]');
port.postMessage({
type: _webSocketConfigs.Events.CONNECTION,
payload: ctx.WEBSOCKET_CONNECTION
});
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy93ZWJTb2NrZXRXb3JrZXJJbnN0YW5jZS50cyJdLCJuYW1lcyI6WyJfc2VsZiIsInNlbGYiLCJjdHgiLCJXRUJTT0NLRVQiLCJXRUJTT0NLRVRfQVVUSF9IRUFERVIiLCJXRUJTT0NLRVRfQ09OTkVDVElPTiIsIlN0YXRlcyIsIkRJU0NPTk5FQ1RFRCIsIldFQlNPQ0tFVF9IRUFERVIiLCJXRUJTT0NLRVRfRVhQTElDSVRfRElTQ09OTkVDVCIsIldFQlNPQ0tFVF9VUkwiLCJXRUJTT0NLRVRfU1RBVEUiLCJXRUJTT0NLRVRfUE9SVFMiLCJNYXAiLCJXRUJTT0NLRVRfQ0hBTk5FTFMiLCJXRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UIiwiV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCIsIldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVMiLCJXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUyIsIldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TIiwiV0VCU09DS0VUX1ZJU0lCTEVfVEFCUyIsIlNldCIsInBhY2thZ2VNZXNzYWdlIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJlIiwicGFyc2VNZXNzYWdlIiwicGFyc2VkIiwicGFyc2UiLCJjb250ZW50IiwiYnJvYWRjYXN0IiwidHlwZSIsInBheWxvYWQiLCJmb3JFYWNoIiwicG9ydCIsImlkIiwiZW1pdCIsIm9ubHlWaXNpYmxlIiwiaGFzIiwiZ2V0IiwicG9zdE1lc3NhZ2UiLCJvbkNvbm5lY3RlZCIsImNvbnNvbGUiLCJsb2ciLCJyZXN1YnNjcmliZUFsbCIsInNldFN0YXRlIiwiQ09OTkVDVEVEIiwib25DaGFubmVsTWVzc2FnZSIsImNoYW5uZWwiLCJtc2ciLCJib2R5Iiwic3RhdHVzIiwiZGlzY29ubmVjdCIsIkV2ZW50cyIsIk1FU1NBR0UiLCJvbkNoYW5uZWxNZXNzYWdlU3luYyIsIm9uRGlzbWlzc1N5bmMiLCJkYXRhIiwiZmlsdGVyIiwib25EaXNjb25uZWN0ZWQiLCJtYXhBdHRlbXB0cyIsInJlY29ubmVjdCIsImhhc01heEF0dGVtcHRzIiwiY2FuVGVybWluYXRlIiwiaXNDb25uZWN0ZWQiLCJjbGVhckludGVydmFsIiwiaXNDb25uZWN0aW5nIiwiY29ubmVjdCIsInNldEludGVydmFsIiwib25FcnJvciIsIkVSUk9SIiwiQ09OTkVDVElORyIsImlzRGlzY29ubmVjdGVkIiwiaXNEaXNjb25uZWN0aW5nIiwiRElTQ09OTkVDVElORyIsImlzQW55VGFiVmlzaWJsZSIsInNpemUiLCJTdG9tcCIsIm92ZXIiLCJTb2NrSlMiLCJBdXRob3JpemF0aW9uIiwidW5zdWJzY3JpYmVBbGwiLCJ0ZXN0RGlzY29ubmVjdCIsInN1YnNjcmliZSIsImNvbm5lY3RlZCIsInN1YnNjcmlwdGlvbiIsInNldCIsInN1YnNjcmliZVN5bmMiLCJzZW5kTWVzc2FnZSIsInNlbmQiLCJzZXRBdXRoSGVhZGVyIiwic2V0SGVhZGVyIiwic2V0VXJsIiwic2V0VmlzaWJpbGl0eSIsInZpc2libGUiLCJ2aXNpYmlsaXR5IiwiY3VycmVudCIsImFkZCIsImRlbGV0ZSIsInN0YXRlIiwiQ09OTkVDVElPTiIsInVucmVnaXN0ZXIiLCJpZHMiLCJ1bnN1YnNjcmliZSIsInV1aWQiLCJsZW5ndGgiLCJhZGRFdmVudExpc3RlbmVyIiwicG9ydHMiLCJyZWdpc3RlciIsInJlY29ubmVjdEludGVydmFsIiwicmVjb25uZWN0TWF4QXR0ZW1wdHMiLCJtZXNzYWdlQnJva2VyIiwiQ09OTkVDVCIsIkRJU01JU1NfU1lOQyIsIkRJU0NPTk5FQ1QiLCJSRUdJU1RFUiIsIlNFTkRfTUVTU0FHRSIsIlNFVF9BVVRIX0hFQURFUiIsIlNFVF9IRUFERVIiLCJTRVRfVVJMIiwiU0VUX1ZJU0lCSUxJVFkiLCJTVUJTQ1JJQkUiLCJTVUJTQ1JJQkVfU1lOQyIsIlRFU1RfRElTQ09OTkVDVCIsIlVOUkVHSVNURVIiLCJVTlNVQlNDUklCRSIsIlVOU1VCU0NSSUJFX1NZTkMiLCJzdGFydCJdLCJtYXBwaW5ncyI6Ijs7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OUQsVUFITixpREFJZEMseUJBQU84RCxRQUpPLEVBSUlQLFFBSkosaURBS2R2RCx5QkFBTytELFlBTE8sRUFLUTVCLFdBTFIsaURBTWRuQyx5QkFBT2dFLGVBTk8sRUFNVzNCLGFBTlgsaURBT2RyQyx5QkFBT2lFLFVBUE8sRUFPTTNCLFNBUE4saURBUWR0Qyx5QkFBT2tFLE9BUk8sRUFRRzNCLE1BUkgsaURBU2R2Qyx5QkFBT21FLGNBVE8sRUFTVTNCLGFBVFYsaURBVWR4Qyx5QkFBT29FLFNBVk8sRUFVS3RDLFNBVkwsaURBV2Q5Qix5QkFBT3FFLGNBWE8sRUFXVW5DLGFBWFYsaURBWWRsQyx5QkFBT3NFLGVBWk8sRUFZV3pDLGNBWlgsaURBYWQ3Qix5QkFBT3VFLFVBYk8sRUFhTXZCLFVBYk4saURBY2RoRCx5QkFBT3dFLFdBZE8sRUFjT3RCLFdBZFAsaURBZWRsRCx5QkFBT3lFLGdCQWZPLEVBZVl2QixXQWZaLGtCQUFuQjs7QUFrQkEsUUFBSVEsYUFBYSxDQUFDdEYsQ0FBQyxDQUFDZ0MsSUFBRixDQUFPMUIsSUFBUixDQUFqQixFQUFnQztBQUM1QmdGLE1BQUFBLGFBQWEsQ0FBQ3RGLENBQUMsQ0FBQ2dDLElBQUYsQ0FBTzFCLElBQVIsQ0FBYixDQUEyQk4sQ0FBM0I7QUFDSDtBQUNKLEdBdEJEO0FBd0JBUyxFQUFBQSxJQUFJLENBQUM2RixLQUFMO0FBRUFyRixFQUFBQSxPQUFPLENBQUNDLEdBQVIsQ0FBWSw4QkFBWjtBQUVBVCxFQUFBQSxJQUFJLENBQUNNLFdBQUwsQ0FBaUI7QUFDYlQsSUFBQUEsSUFBSSxFQUFFc0IseUJBQU8rQyxVQURBO0FBRWJwRSxJQUFBQSxPQUFPLEVBQUUvQixHQUFHLENBQUNHO0FBRkEsR0FBakI7QUFJSCxDQTlDRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBTb2NrSlMgZnJvbSAnc29ja2pzLWNsaWVudCc7XG5pbXBvcnQgdHlwZSB7Q2xpZW50LCBTdWJzY3JpcHRpb259IGZyb20gJ3N0b21wanMnO1xuaW1wb3J0IHt2NH0gZnJvbSAndXVpZCc7XG5cbmltcG9ydCBTdG9tcCBmcm9tICcuL3N0b21wJztcbmltcG9ydCB7RXZlbnRzLCBTdGF0ZXN9IGZyb20gJy4vd2ViU29ja2V0Q29uZmlncyc7XG5cbnR5cGUgV0VCU09DS0VUX0NPTk5FQ1RJT04gPSB7XG4gICAgV0VCU09DS0VUOiBDbGllbnQ7XG4gICAgV0VCU09DS0VUX0FVVEhfSEVBREVSOiBzdHJpbmc7XG4gICAgV0VCU09DS0VUX0NPTk5FQ1RJT046IHN0cmluZztcbiAgICBXRUJTT0NLRVRfRVhQTElDSVRfRElTQ09OTkVDVDogYm9vbGVhbjtcbiAgICBXRUJTT0NLRVRfSEVBREVSOiBzdHJpbmc7XG4gICAgV0VCU09DS0VUX1VSTDogc3RyaW5nO1xuICAgIFdFQlNPQ0tFVF9TVEFURToge1xuICAgICAgICBbY2hhbm5lbDogc3RyaW5nXToge2lkOiBzdHJpbmc7IG1lc3NhZ2U6IGFueX1bXTtcbiAgICB9O1xuICAgIFdFQlNPQ0tFVF9QT1JUUzogTWFwPHN0cmluZywgTWVzc2FnZVBvcnQ+O1xuICAgIFdFQlNPQ0tFVF9DSEFOTkVMUzogTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPjtcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UOiBudW1iZXI7XG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTDogTm9kZUpTLlRpbWVyO1xuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUxfTVM6IG51bWJlcjtcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUzogbnVtYmVyO1xuICAgIFdFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG4gICAgV0VCU09DS0VUX1ZJU0lCTEVfVEFCUzogU2V0PHN0cmluZz47XG59O1xuXG5pbnRlcmZhY2UgU2hhcmVkV29ya2VyR2xvYmFsU2NvcGUge1xuICAgIGFkZEV2ZW50TGlzdGVuZXIoXG4gICAgICAgIHR5cGU6IHN0cmluZyxcbiAgICAgICAgbGlzdGVuZXI6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkLFxuICAgICAgICBvcHRpb25zPzogYm9vbGVhbiB8IEFkZEV2ZW50TGlzdGVuZXJPcHRpb25zXG4gICAgKTogdm9pZDtcbiAgICBvbmNvbm5lY3Q6IChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB2b2lkO1xuICAgIHdzOiBDbGllbnQ7XG59XG5cbmNvbnN0IF9zZWxmOiBTaGFyZWRXb3JrZXJHbG9iYWxTY29wZSA9IHNlbGYgYXMgYW55O1xuXG5jb25zdCBjdHg6IFdFQlNPQ0tFVF9DT05ORUNUSU9OID0ge1xuICAgIFdFQlNPQ0tFVDogbnVsbCxcbiAgICBXRUJTT0NLRVRfQVVUSF9IRUFERVI6ICcnLFxuICAgIFdFQlNPQ0tFVF9DT05ORUNUSU9OOiBTdGF0ZXMuRElTQ09OTkVDVEVELFxuICAgIFdFQlNPQ0tFVF9IRUFERVI6ICcnLFxuICAgIFdFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUOiBmYWxzZSxcbiAgICBXRUJTT0NLRVRfVVJMOiAnJyxcbiAgICBXRUJTT0NLRVRfU1RBVEU6IHt9LFxuICAgIFdFQlNPQ0tFVF9QT1JUUzogbmV3IE1hcCgpLFxuICAgIFdFQlNPQ0tFVF9DSEFOTkVMUzogbmV3IE1hcCgpLFxuICAgIFdFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQ6IDAsXG4gICAgV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTDogbnVsbCxcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMX01TOiAxMDAwMCxcbiAgICBXRUJTT0NLRVRfUkVDT05ORUNUX01BWF9BVFRFTVBUUzogMTAsXG4gICAgV0VCU09DS0VUX1NVQlNDUklQVElPTlM6IG5ldyBNYXAoKSxcbiAgICBXRUJTT0NLRVRfVklTSUJMRV9UQUJTOiBuZXcgU2V0KClcbn07XG5cbmZ1bmN0aW9uIHBhY2thZ2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIG1lc3NhZ2UgPT09ICdvYmplY3QnICYmIG1lc3NhZ2UgIT09IG51bGxcbiAgICAgICAgICAgID8gSlNPTi5zdHJpbmdpZnkobWVzc2FnZSlcbiAgICAgICAgICAgIDogbWVzc2FnZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gcGFyc2VNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgICB0cnkge1xuICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuXG4gICAgICAgIHJldHVybiB0eXBlb2YgcGFyc2VkID09PSAnb2JqZWN0JyAmJiBwYXJzZWQgIT09IG51bGwgJiYgcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgID8gcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgIDogcGFyc2VkO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgfVxufVxuXG5jb25zdCBicm9hZGNhc3QgPSAodHlwZSwgcGF5bG9hZCkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfUE9SVFMuZm9yRWFjaCgocG9ydCwgaWQpID0+IHtcbiAgICAgICAgZW1pdChpZCwgdHlwZSwgcGF5bG9hZCk7XG4gICAgfSk7XG59O1xuXG5jb25zdCBlbWl0ID0gKGlkLCB0eXBlLCBwYXlsb2FkLCBvbmx5VmlzaWJsZSA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKGN0eC5XRUJTT0NLRVRfUE9SVFMuaGFzKGlkKSkge1xuICAgICAgICAvLyBpZiAoIW9ubHlWaXNpYmxlIHx8IGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLmhhcyhpZCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9QT1JUUy5nZXQoaWQpLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBwYXlsb2FkXG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNvbnN0IG9uQ29ubmVjdGVkID0gKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKCdbdXNlLXN0b21wOjp3czo6Y29ubmVjdGVkXScpO1xuXG4gICAgcmVzdWJzY3JpYmVBbGwoKTtcblxuICAgIHNldFN0YXRlKFN0YXRlcy5DT05ORUNURUQpO1xufTtcblxuY29uc3Qgb25DaGFubmVsTWVzc2FnZSA9IChjaGFubmVsKSA9PiAobXNnKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlTWVzc2FnZShtc2cuYm9keSk7XG5cbiAgICBpZiAobWVzc2FnZT8uc3RhdHVzID09PSAnRU5EJykge1xuICAgICAgICBkaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgKGlzQW55VGFiVmlzaWJsZSgpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5nZXQoY2hhbm5lbCkuZm9yRWFjaCgoaWQpID0+IHtcbiAgICAgICAgICAgIGVtaXQoaWQsIEV2ZW50cy5NRVNTQUdFLCB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIH0gZWxzZSB7XG4gICAgICAgIC8vIH1cbiAgICB9XG59O1xuXG5jb25zdCBvbkNoYW5uZWxNZXNzYWdlU3luYyA9IChjaGFubmVsKSA9PiAobXNnKSA9PiB7XG4gICAgY29uc3QgbWVzc2FnZSA9IHBhcnNlTWVzc2FnZShtc2cuYm9keSk7XG5cbiAgICBpZiAobWVzc2FnZT8uc3RhdHVzID09PSAnRU5EJykge1xuICAgICAgICBkaXNjb25uZWN0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9TVEFURVtjaGFubmVsXSA9IFtcbiAgICAgICAgICAgIC4uLihjdHguV0VCU09DS0VUX1NUQVRFW2NoYW5uZWxdIHx8IFtdKSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogdjQoKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgICAgICB9XG4gICAgICAgIF07XG5cbiAgICAgICAgKGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5nZXQoY2hhbm5lbCkgfHwgW10pLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICAgICAgICBlbWl0KGlkLCBFdmVudHMuTUVTU0FHRSwge1xuICAgICAgICAgICAgICAgIGNoYW5uZWwsXG4gICAgICAgICAgICAgICAgbWVzc2FnZTogY3R4LldFQlNPQ0tFVF9TVEFURVtjaGFubmVsXVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbmNvbnN0IG9uRGlzbWlzc1N5bmMgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfU1RBVEVbZS5kYXRhLnBheWxvYWQuY2hhbm5lbF0gPSBjdHguV0VCU09DS0VUX1NUQVRFW1xuICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsXG4gICAgXS5maWx0ZXIoKG1lc3NhZ2UpID0+IG1lc3NhZ2UuaWQgIT09IGUuZGF0YS5wYXlsb2FkLmlkKTtcblxuICAgIChjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuZ2V0KGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpIHx8IFtdKS5mb3JFYWNoKFxuICAgICAgICAoaWQpID0+IHtcbiAgICAgICAgICAgIGVtaXQoaWQsIEV2ZW50cy5NRVNTQUdFLCB7XG4gICAgICAgICAgICAgICAgY2hhbm5lbDogZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBjdHguV0VCU09DS0VUX1NUQVRFW2UuZGF0YS5wYXlsb2FkLmNoYW5uZWxdXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG5jb25zdCBvbkRpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICBjb25zb2xlLmxvZygnW3VzZS1zdG9tcDo6d3M6OmRpc2Nvbm5lY3RlZF0nKTtcblxuICAgIHNldFN0YXRlKFN0YXRlcy5ESVNDT05ORUNURUQpO1xuXG4gICAgaWYgKFxuICAgICAgICAhY3R4LldFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUICYmXG4gICAgICAgICFjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCAmJlxuICAgICAgICAhY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlRcbiAgICApIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlQgPSAxO1xuXG4gICAgICAgIGNvbnN0IG1heEF0dGVtcHRzID0gY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfTUFYX0FUVEVNUFRTO1xuXG4gICAgICAgIGNvbnN0IHJlY29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICdbdXNlLXN0b21wOjp3czo6cmVjb25uZWN0aW5nXScsXG4gICAgICAgICAgICAgICAgYCR7Y3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfQ09VTlR9IC8gJHttYXhBdHRlbXB0c31gXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBoYXNNYXhBdHRlbXB0cyA9IGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UID4gbWF4QXR0ZW1wdHM7XG5cbiAgICAgICAgICAgIGNvbnN0IGNhblRlcm1pbmF0ZSA9IGlzQ29ubmVjdGVkKCkgfHwgaGFzTWF4QXR0ZW1wdHM7XG5cbiAgICAgICAgICAgIGlmIChjYW5UZXJtaW5hdGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnW3VzZS1zdG9tcDo6d3M6OnJlY29ubmVjdGVkXScpO1xuICAgICAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwoY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUwpO1xuICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UID0gMDtcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9JTlRFUlZBTCA9IG51bGw7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0Nvbm5lY3RpbmcoKSAmJiAhaXNDb25uZWN0ZWQoKSAmJiAhaGFzTWF4QXR0ZW1wdHMpIHtcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VUX1JFQ09OTkVDVF9DT1VOVCA9XG4gICAgICAgICAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0NPVU5UICsgMTtcbiAgICAgICAgICAgICAgICBjb25uZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY3R4LldFQlNPQ0tFVF9SRUNPTk5FQ1RfSU5URVJWQUwgPSBzZXRJbnRlcnZhbChcbiAgICAgICAgICAgIHJlY29ubmVjdCxcbiAgICAgICAgICAgIGN0eC5XRUJTT0NLRVRfUkVDT05ORUNUX0lOVEVSVkFMX01TXG4gICAgICAgICk7XG5cbiAgICAgICAgcmVjb25uZWN0KCk7XG4gICAgfVxufTtcblxuY29uc3Qgb25FcnJvciA9IChlKSA9PiB7XG4gICAgYnJvYWRjYXN0KEV2ZW50cy5FUlJPUiwgZSk7XG59O1xuXG5jb25zdCBpc0Nvbm5lY3RlZCA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkNPTk5FQ1RFRDtcbmNvbnN0IGlzQ29ubmVjdGluZyA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkNPTk5FQ1RJTkc7XG5jb25zdCBpc0Rpc2Nvbm5lY3RlZCA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkRJU0NPTk5FQ1RFRDtcbmNvbnN0IGlzRGlzY29ubmVjdGluZyA9ICgpID0+IGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9PT0gU3RhdGVzLkRJU0NPTk5FQ1RJTkc7XG5jb25zdCBpc0FueVRhYlZpc2libGUgPSAoKSA9PiBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5zaXplID4gMDtcblxuY29uc3QgY29ubmVjdCA9ICgpID0+IHtcbiAgICBpZiAoaXNDb25uZWN0aW5nKCkgfHwgaXNDb25uZWN0ZWQoKSB8fCBpc0Rpc2Nvbm5lY3RpbmcoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgZGlzY29ubmVjdCgpO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkNPTk5FQ1RJTkcpO1xuXG4gICAgY3R4LldFQlNPQ0tFVCA9IFN0b21wLm92ZXIobmV3IFNvY2tKUyhjdHguV0VCU09DS0VUX1VSTCwgbnVsbCwge30pKTtcblxuICAgIChjdHguV0VCU09DS0VULmNvbm5lY3QgYXMgYW55KShcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9BVVRIX0hFQURFUlxuICAgICAgICAgICAgPyB7QXV0aG9yaXphdGlvbjogY3R4LldFQlNPQ0tFVF9BVVRIX0hFQURFUn1cbiAgICAgICAgICAgIDogY3R4LldFQlNPQ0tFVF9IRUFERVIsXG4gICAgICAgIG9uQ29ubmVjdGVkLFxuICAgICAgICBvbkRpc2Nvbm5lY3RlZCxcbiAgICAgICAgb25FcnJvclxuICAgICk7XG59O1xuXG5jb25zdCBkaXNjb25uZWN0ID0gKCkgPT4ge1xuICAgIGlmIChpc0Rpc2Nvbm5lY3RpbmcoKSB8fCBpc0Rpc2Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjdHguV0VCU09DS0VUX0VYUExJQ0lUX0RJU0NPTk5FQ1QgPSB0cnVlO1xuXG4gICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RJTkcpO1xuICAgIHVuc3Vic2NyaWJlQWxsKCk7XG5cbiAgICBpZiAoY3R4LldFQlNPQ0tFVCkge1xuICAgICAgICAoY3R4LldFQlNPQ0tFVC5kaXNjb25uZWN0IGFzIGFueSkoKCkgPT4ge1xuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9FWFBMSUNJVF9ESVNDT05ORUNUID0gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNldFN0YXRlKFN0YXRlcy5ESVNDT05ORUNURUQpO1xufTtcblxuY29uc3QgdGVzdERpc2Nvbm5lY3QgPSAoKSA9PiB7XG4gICAgaWYgKGlzQ29ubmVjdGVkKCkgJiYgIShpc0Rpc2Nvbm5lY3RlZCgpIHx8IGlzRGlzY29ubmVjdGluZygpKSkge1xuICAgICAgICBzZXRTdGF0ZShTdGF0ZXMuRElTQ09OTkVDVElORyk7XG4gICAgICAgIHVuc3Vic2NyaWJlQWxsKCk7XG5cbiAgICAgICAgaWYgKGN0eC5XRUJTT0NLRVQpIHtcbiAgICAgICAgICAgIChjdHguV0VCU09DS0VULmRpc2Nvbm5lY3QgYXMgYW55KSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgc2V0U3RhdGUoU3RhdGVzLkRJU0NPTk5FQ1RFRCk7XG4gICAgfVxufTtcblxuY29uc3QgcmVzdWJzY3JpYmVBbGwgPSAoKSA9PiB7XG4gICAgaWYgKGN0eC5XRUJTT0NLRVQ/LnN1YnNjcmliZSAmJiBjdHguV0VCU09DS0VUPy5jb25uZWN0ZWQgJiYgaXNDb25uZWN0ZWQoKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLmZvckVhY2goKHN1YnNjcmlwdGlvbiwgY2hhbm5lbCkgPT4ge1xuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5zZXQoXG4gICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBjdHguV0VCU09DS0VULnN1YnNjcmliZShjaGFubmVsLCBvbkNoYW5uZWxNZXNzYWdlKGNoYW5uZWwpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufTtcblxuY29uc3Qgc3Vic2NyaWJlID0gKGUpID0+IHtcbiAgICBpZiAoaXNDb25uZWN0ZWQoKSAmJiAhY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5oYXMoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCkpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9DSEFOTkVMUy5zZXQoXG4gICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgY3R4LldFQlNPQ0tFVC5zdWJzY3JpYmUoXG4gICAgICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuY2hhbm5lbCxcbiAgICAgICAgICAgICAgICBvbkNoYW5uZWxNZXNzYWdlKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIGNoYW5uZWwgaGFzIG5vIHN1YnNjcmlwdGlvbnMsIHNldCBpdCBhcyBhbiBhcnJheSBhbmQgYWRkIGlkXG4gICAgaWYgKCFjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuaGFzKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgY2hhbm5lbCBkb2VzIGV4aXN0LCB1cGRhdGUgdGhlIGlkcyB0byBpbmNsdWRlIGlkXG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgLi4uY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChlLmRhdGEucGF5bG9hZC5jaGFubmVsKSxcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmlkXG4gICAgICAgIF0pO1xuICAgIH1cbn07XG5cbmNvbnN0IHN1YnNjcmliZVN5bmMgPSAoZSkgPT4ge1xuICAgIGlmIChpc0Nvbm5lY3RlZCgpICYmICFjdHguV0VCU09DS0VUX0NIQU5ORUxTLmhhcyhlLmRhdGEucGF5bG9hZC5jaGFubmVsKSkge1xuICAgICAgICBjdHguV0VCU09DS0VUX0NIQU5ORUxTLnNldChcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICBjdHguV0VCU09DS0VULnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBlLmRhdGEucGF5bG9hZC5jaGFubmVsLFxuICAgICAgICAgICAgICAgIG9uQ2hhbm5lbE1lc3NhZ2VTeW5jKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuICAgIC8vIGlmIGNoYW5uZWwgaGFzIG5vIHN1YnNjcmlwdGlvbnMsIHNldCBpdCBhcyBhbiBhcnJheSBhbmQgYWRkIGlkXG4gICAgaWYgKCFjdHguV0VCU09DS0VUX1NVQlNDUklQVElPTlMuaGFzKGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgZS5kYXRhLnBheWxvYWQuaWRcbiAgICAgICAgXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgY2hhbm5lbCBkb2VzIGV4aXN0LCB1cGRhdGUgdGhlIGlkcyB0byBpbmNsdWRlIGlkXG4gICAgICAgIGN0eC5XRUJTT0NLRVRfU1VCU0NSSVBUSU9OUy5zZXQoZS5kYXRhLnBheWxvYWQuY2hhbm5lbCwgW1xuICAgICAgICAgICAgLi4uY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmdldChlLmRhdGEucGF5bG9hZC5jaGFubmVsKSxcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmlkXG4gICAgICAgIF0pO1xuICAgIH1cbn07XG5cbmNvbnN0IHNlbmRNZXNzYWdlID0gKGUpID0+IHtcbiAgICBpZiAoY3R4LldFQlNPQ0tFVCAmJiBpc0Nvbm5lY3RlZCgpKSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVQuc2VuZChcbiAgICAgICAgICAgIGUuZGF0YS5wYXlsb2FkLmNoYW5uZWwsXG4gICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgcGFja2FnZU1lc3NhZ2UoZS5kYXRhLnBheWxvYWQubWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICB9XG59O1xuXG5jb25zdCBzZXRBdXRoSGVhZGVyID0gKGUpID0+IHtcbiAgICBjdHguV0VCU09DS0VUX0FVVEhfSEVBREVSID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRIZWFkZXIgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfSEVBREVSID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRVcmwgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfVVJMID0gZS5kYXRhLnBheWxvYWQ7XG59O1xuXG5jb25zdCBzZXRWaXNpYmlsaXR5ID0gKGUpID0+IHtcbiAgICBjb25zdCB2aXNpYmxlID0gZS5kYXRhLnBheWxvYWQudmlzaWJpbGl0eTtcbiAgICBjb25zdCBjdXJyZW50ID0gY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuaGFzKGUuZGF0YS5wYXlsb2FkLmlkKTtcblxuICAgIGlmICh2aXNpYmxlICYmICFjdXJyZW50KSB7XG4gICAgICAgIGN0eC5XRUJTT0NLRVRfVklTSUJMRV9UQUJTLmFkZChlLmRhdGEucGF5bG9hZC5pZCk7XG4gICAgfVxuXG4gICAgaWYgKCF2aXNpYmxlICYmIGN1cnJlbnQpIHtcbiAgICAgICAgY3R4LldFQlNPQ0tFVF9WSVNJQkxFX1RBQlMuZGVsZXRlKGUuZGF0YS5wYXlsb2FkLmlkKTtcbiAgICB9XG59O1xuXG5jb25zdCBzZXRTdGF0ZSA9IChzdGF0ZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfQ09OTkVDVElPTiA9IHN0YXRlO1xuICAgIGJyb2FkY2FzdChFdmVudHMuQ09OTkVDVElPTiwgY3R4LldFQlNPQ0tFVF9DT05ORUNUSU9OKTtcbn07XG5cbmNvbnN0IHVucmVnaXN0ZXIgPSAoZSkgPT4ge1xuICAgIGN0eC5XRUJTT0NLRVRfUE9SVFMuZGVsZXRlKGUuZGF0YS5wYXlsb2FkLmlkKTtcbiAgICBjdHguV0VCU09DS0VUX1ZJU0lCTEVfVEFCUy5kZWxldGUoZS5kYXRhLnBheWxvYWQuaWQpO1xuXG4gICAgY3R4LldFQlNPQ0tFVF9TVUJTQ1JJUFRJT05TLmZvckVhY2goKGlkcywgY2hhbm5lbCkgPT4ge1xuICAgICAgICB1bnN1YnNjcmliZSh7XG4gICAgICAgICAgICAuLi5lLFxuICAgICAgICAgICAgZGF