use-stomp
Version:
react provider, class decorator, and a hook for websockets using the stomp protocol
161 lines (149 loc) • 20.6 kB
JavaScript
import "core-js/modules/es.object.get-own-property-descriptor";
import _typeof from "@babel/runtime/helpers/typeof";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
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) { _defineProperty(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; }
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
import SockJS from 'sockjs-client';
import UseStompCtx from './context';
import Stomp from './stomp';
export default /*#__PURE__*/React.memo(function (props) {
var _client$current, _client$current2;
var client = useRef(null);
var _useState = useState(false),
_useState2 = _slicedToArray(_useState, 2),
connected = _useState2[0],
setConnected = _useState2[1];
var packageMessage = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("packageMessage", function (channel, msg, optHeaders) {
if (props.packageMessage) {
return props.packageMessage(channel, msg, optHeaders);
}
try {
return _typeof(msg) === 'object' && msg !== null ? JSON.stringify(msg) : msg;
} catch (e) {
return msg;
}
}), [props.packageMessage]);
var parseMessage = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("parseMessage", function (channel, msg) {
if (props.parseMessage) {
return props.parseMessage(channel, msg);
}
try {
var parsed = JSON.parse(msg);
return _typeof(parsed) === 'object' && parsed !== null && parsed.content ? parsed.content : parsed;
} catch (e) {
return msg;
}
}), [props.parseMessage]);
var onConnected = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onConnected", function () {
console.log('%c[use-stomp::connected]', 'color: rgb(95,153,63);');
setConnected(function () {
return true;
});
}), []);
var onDisconnected = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onDisconnected", function () {
console.log('%c[use-stomp::disconnected]', 'color: rgb(170,34,23);');
setConnected(function () {
return false;
});
client.current = null;
}), []);
var onError = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("onError", function (error) {
console.error('[use-stomp::error]', error);
}), []);
var send = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("send", function (channel, msg) {
var optHeaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (connected) {
client.current.send(channel, optHeaders, packageMessage(channel, msg, optHeaders));
} else {
console.warn('[use-stomp::send]', 'cannot send when websocket is not connected');
}
}), [client.current, connected, packageMessage]);
var subscribe = useCallback(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("subscribe", function (channel, callback) {
try {
return client.current.subscribe(channel, function (msg) {
var body = parseMessage(channel, msg.body);
callback(body, msg.headers.destination);
if (body && body.status === 'END') {
client.current.disconnect();
}
}, props.subscribeHeaders).unsubscribe;
} catch (e) {
throw Error(e);
}
}), [(_client$current = client.current) === null || _client$current === void 0 ? void 0 : _client$current.disconnect, (_client$current2 = client.current) === null || _client$current2 === void 0 ? void 0 : _client$current2.subscribe, parseMessage, props.subscribeHeaders]);
useEffect(function () {
var hasHeaders = props.headers || props.authHeader;
if (hasHeaders && props.url && !connected) {
client.current = Stomp.over(new SockJS(props.url, null, props.options), !!props.debug);
client.current.connect(props.authHeader ? {
Authorization: props.authHeader
} : props.headers, onConnected, onDisconnected, onError);
}
return function () {
if (connected && client.current) {
client.current.disconnect();
}
};
}, [connected, props.authHeader, props.headers, props.url]);
var ctx = useMemo(function (name, callable) {
callable.displayName = name;
Object.defineProperty(callable, "name", _objectSpread(_objectSpread({}, Object.getOwnPropertyDescriptor(callable, "name")), {}, {
value: name
}));
return callable;
}("ctx", function () {
return {
send: send,
subscribe: subscribe,
connected: connected
};
}), [connected, send, subscribe]);
return /*#__PURE__*/React.createElement(UseStompCtx.Provider, {
value: ctx
}, props.children);
});
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy91c2VTdG9tcFByb3ZpZGVyLnRzeCJdLCJuYW1lcyI6WyJSZWFjdCIsInVzZUNhbGxiYWNrIiwidXNlRWZmZWN0IiwidXNlTWVtbyIsInVzZVJlZiIsInVzZVN0YXRlIiwiU29ja0pTIiwiVXNlU3RvbXBDdHgiLCJTdG9tcCIsIm1lbW8iLCJwcm9wcyIsImNsaWVudCIsImNvbm5lY3RlZCIsInNldENvbm5lY3RlZCIsInBhY2thZ2VNZXNzYWdlIiwiY2hhbm5lbCIsIm1zZyIsIm9wdEhlYWRlcnMiLCJKU09OIiwic3RyaW5naWZ5IiwiZSIsInBhcnNlTWVzc2FnZSIsInBhcnNlZCIsInBhcnNlIiwiY29udGVudCIsIm9uQ29ubmVjdGVkIiwiY29uc29sZSIsImxvZyIsIm9uRGlzY29ubmVjdGVkIiwiY3VycmVudCIsIm9uRXJyb3IiLCJlcnJvciIsInNlbmQiLCJ3YXJuIiwic3Vic2NyaWJlIiwiY2FsbGJhY2siLCJib2R5IiwiaGVhZGVycyIsImRlc3RpbmF0aW9uIiwic3RhdHVzIiwiZGlzY29ubmVjdCIsInN1YnNjcmliZUhlYWRlcnMiLCJ1bnN1YnNjcmliZSIsIkVycm9yIiwiaGFzSGVhZGVycyIsImF1dGhIZWFkZXIiLCJ1cmwiLCJvdmVyIiwib3B0aW9ucyIsImRlYnVnIiwiY29ubmVjdCIsIkF1dGhvcml6YXRpb24iLCJjdHgiLCJjaGlsZHJlbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsS0FBUCxJQUFlQyxXQUFmLEVBQTRCQyxTQUE1QixFQUF1Q0MsT0FBdkMsRUFBZ0RDLE1BQWhELEVBQXdEQyxRQUF4RCxRQUF1RSxPQUF2RTtBQUNBLE9BQU9DLE1BQVAsTUFBOEIsZUFBOUI7QUFHQSxPQUFPQyxXQUFQLE1BQXdCLFdBQXhCO0FBQ0EsT0FBT0MsS0FBUCxNQUFrQixTQUFsQjtBQXFDQSw0QkFBZVIsS0FBSyxDQUFDUyxJQUFOLENBQWtDLFVBQUNDLEtBQUQsRUFBVztBQUFBOztBQUN4RCxNQUFNQyxNQUFNLEdB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RUFBVEEsU0FGRztBQUdIdEIsTUFBQUEsU0FBUyxFQUFUQTtBQUhHLEtBQVA7QUFBQSxHQURlLEdBTWYsQ0FBQ0EsU0FBRCxFQUFZb0IsSUFBWixFQUFrQkUsU0FBbEIsQ0FOZSxDQUFuQjtBQVNBLHNCQUNJLG9CQUFDLFdBQUQsQ0FBYSxRQUFiO0FBQXNCLElBQUEsS0FBSyxFQUFFa0I7QUFBN0IsS0FDSzFDLEtBQUssQ0FBQzJDLFFBRFgsQ0FESjtBQUtILENBaEpjLENBQWYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgUmVhY3QsIHt1c2VDYWxsYmFjaywgdXNlRWZmZWN0LCB1c2VNZW1vLCB1c2VSZWYsIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgU29ja0pTLCB7T3B0aW9uc30gZnJvbSAnc29ja2pzLWNsaWVudCc7XG5pbXBvcnQgdHlwZSB7Q2xpZW50fSBmcm9tICdzdG9tcGpzJztcblxuaW1wb3J0IFVzZVN0b21wQ3R4IGZyb20gJy4vY29udGV4dCc7XG5pbXBvcnQgU3RvbXAgZnJvbSAnLi9zdG9tcCc7XG5cbmV4cG9ydCB0eXBlIFVzZVN0b21wUHJvdmlkZXJQcm9wcyA9IHtcbiAgICAvKipcbiAgICAgKiBIVFRQIHRvIGNvbm5lY3RcbiAgICAgKi9cbiAgICB1cmw6IHN0cmluZztcbiAgICAvKipcbiAgICAgKiBBZGQgY29uc29sZSBsb2dzIGZvciBkZWJ1Z2dpbmdcbiAgICAgKi9cbiAgICBkZWJ1Zz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogU29ja0pTIE9wdGlvbnMgKGh0dHBzOi8vZ2l0aHViLmNvbS9zb2NranMvc29ja2pzLWNsaWVudCNzb2NranMtY2xpZW50LWFwaSlcbiAgICAgKi9cbiAgICBvcHRpb25zPzogT3B0aW9ucztcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBhdXRoIGhlYWRlciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIG9yIGFnZW50IHRocm91Z2ggdGhlIFNUT01QIGNvbm5lY3Rpb24gZnJhbWVcbiAgICAgKi9cbiAgICBhdXRoSGVhZGVyPzogc3RyaW5nO1xuICAgIC8qKlxuICAgICAqIFRoZSByZXF1ZXN0IGhlYWRlciB3aWxsIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyIG9yIGFnZW50IHRocm91Z2ggdGhlIFNUT01QIGNvbm5lY3Rpb24gZnJhbWVcbiAgICAgKi9cbiAgICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgLyoqXG4gICAgICogb3ZlcnJpZGUgZGVmYXVsdCBwYXJzaW5nIG9mIG1lc3NhZ2VzXG4gICAgICovXG4gICAgcGFyc2VNZXNzYWdlPyhjaGFubmVsOiBzdHJpbmcsIG1zZzogYW55KTogYW55O1xuICAgIC8qKlxuICAgICAqIG92ZXJyaWRlIGRlZmF1bHQgcGFja2FnaW5nIG9mIG1lc3NhZ2VzXG4gICAgICovXG4gICAgcGFja2FnZU1lc3NhZ2U/KGNoYW5uZWw6IHN0cmluZywgbXNnOiBhbnksIG9wdEhlYWRlcnM6IGFueSk6IGFueTtcbiAgICAvKipcbiAgICAgKiBUaGUgcmVxdWVzdCBoZWFkZXIgdGhhdCB3aWxsIGJlIHBhc3NlZCB3aGVuIHN1YnNjcmliaW5nIHRvIHRoZSB0YXJnZXRcbiAgICAgKi9cbiAgICBzdWJzY3JpYmVIZWFkZXJzPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBSZWFjdC5tZW1vPFVzZVN0b21wUHJvdmlkZXJQcm9wcz4oKHByb3BzKSA9PiB7XG4gICAgY29uc3QgY2xpZW50ID0gdXNlUmVmPENsaWVudD4obnVsbCk7XG5cbiAgICBjb25zdCBbY29ubmVjdGVkLCBzZXRDb25uZWN0ZWRdID0gdXNlU3RhdGUoZmFsc2UpO1xuXG4gICAgY29uc3QgcGFja2FnZU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKGNoYW5uZWwsIG1zZywgb3B0SGVhZGVycykgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BzLnBhY2thZ2VNZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHByb3BzLnBhY2thZ2VNZXNzYWdlKGNoYW5uZWwsIG1zZywgb3B0SGVhZGVycyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBtc2cgPT09ICdvYmplY3QnICYmIG1zZyAhPT0gbnVsbFxuICAgICAgICAgICAgICAgICAgICA/IEpTT04uc3RyaW5naWZ5KG1zZylcbiAgICAgICAgICAgICAgICAgICAgOiBtc2c7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW3Byb3BzLnBhY2thZ2VNZXNzYWdlXVxuICAgICk7XG5cbiAgICBjb25zdCBwYXJzZU1lc3NhZ2UgPSB1c2VDYWxsYmFjayhcbiAgICAgICAgKGNoYW5uZWwsIG1zZykgPT4ge1xuICAgICAgICAgICAgaWYgKHByb3BzLnBhcnNlTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wcy5wYXJzZU1lc3NhZ2UoY2hhbm5lbCwgbXNnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKG1zZyk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIHBhcnNlZCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkICE9PSBudWxsICYmXG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5jb250ZW50XG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VkLmNvbnRlbnRcbiAgICAgICAgICAgICAgICAgICAgOiBwYXJzZWQ7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1zZztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgW3Byb3BzLnBhcnNlTWVzc2FnZV1cbiAgICApO1xuXG4gICAgY29uc3Qgb25Db25uZWN0ZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCclY1t1c2Utc3RvbXA6OmNvbm5lY3RlZF0nLCAnY29sb3I6IHJnYig5NSwxNTMsNjMpOycpO1xuICAgICAgICBzZXRDb25uZWN0ZWQoKCkgPT4gdHJ1ZSk7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25EaXNjb25uZWN0ZWQgPSB1c2VDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgIGNvbnNvbGUubG9nKCclY1t1c2Utc3RvbXA6OmRpc2Nvbm5lY3RlZF0nLCAnY29sb3I6IHJnYigxNzAsMzQsMjMpOycpO1xuICAgICAgICBzZXRDb25uZWN0ZWQoKCkgPT4gZmFsc2UpO1xuICAgICAgICBjbGllbnQuY3VycmVudCA9IG51bGw7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgb25FcnJvciA9IHVzZUNhbGxiYWNrKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdbdXNlLXN0b21wOjplcnJvcl0nLCBlcnJvcik7XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3Qgc2VuZCA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoY2hhbm5lbCwgbXNnLCBvcHRIZWFkZXJzID0ge30pID0+IHtcbiAgICAgICAgICAgIGlmIChjb25uZWN0ZWQpIHtcbiAgICAgICAgICAgICAgICBjbGllbnQuY3VycmVudC5zZW5kKFxuICAgICAgICAgICAgICAgICAgICBjaGFubmVsLFxuICAgICAgICAgICAgICAgICAgICBvcHRIZWFkZXJzLFxuICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTWVzc2FnZShjaGFubmVsLCBtc2csIG9wdEhlYWRlcnMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgICAnW3VzZS1zdG9tcDo6c2VuZF0nLFxuICAgICAgICAgICAgICAgICAgICAnY2Fubm90IHNlbmQgd2hlbiB3ZWJzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbY2xpZW50LmN1cnJlbnQsIGNvbm5lY3RlZCwgcGFja2FnZU1lc3NhZ2VdXG4gICAgKTtcblxuICAgIGNvbnN0IHN1YnNjcmliZSA9IHVzZUNhbGxiYWNrKFxuICAgICAgICAoY2hhbm5lbCwgY2FsbGJhY2spID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5jdXJyZW50LnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCxcbiAgICAgICAgICAgICAgICAgICAgKG1zZzogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gcGFyc2VNZXNzYWdlKGNoYW5uZWwsIG1zZy5ib2R5KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soYm9keSwgbXNnLmhlYWRlcnMuZGVzdGluYXRpb24pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYm9keSAmJiBib2R5LnN0YXR1cyA9PT0gJ0VORCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpZW50LmN1cnJlbnQuZGlzY29ubmVjdCBhcyBhbnkpKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHByb3BzLnN1YnNjcmliZUhlYWRlcnNcbiAgICAgICAgICAgICAgICApLnVuc3Vic2NyaWJlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBbXG4gICAgICAgICAgICBjbGllbnQuY3VycmVudD8uZGlzY29ubmVjdCxcbiAgICAgICAgICAgIGNsaWVudC5jdXJyZW50Py5zdWJzY3JpYmUsXG4gICAgICAgICAgICBwYXJzZU1lc3NhZ2UsXG4gICAgICAgICAgICBwcm9wcy5zdWJzY3JpYmVIZWFkZXJzXG4gICAgICAgIF1cbiAgICApO1xuXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgY29uc3QgaGFzSGVhZGVycyA9IHByb3BzLmhlYWRlcnMgfHwgcHJvcHMuYXV0aEhlYWRlcjtcblxuICAgICAgICBpZiAoaGFzSGVhZGVycyAmJiBwcm9wcy51cmwgJiYgIWNvbm5lY3RlZCkge1xuICAgICAgICAgICAgY2xpZW50LmN1cnJlbnQgPSBTdG9tcC5vdmVyKFxuICAgICAgICAgICAgICAgIG5ldyBTb2NrSlMocHJvcHMudXJsLCBudWxsLCBwcm9wcy5vcHRpb25zKSxcbiAgICAgICAgICAgICAgICAhIXByb3BzLmRlYnVnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAoY2xpZW50LmN1cnJlbnQuY29ubmVjdCBhcyBhbnkpKFxuICAgICAgICAgICAgICAgIHByb3BzLmF1dGhIZWFkZXJcbiAgICAgICAgICAgICAgICAgICAgPyB7QXV0aG9yaXphdGlvbjogcHJvcHMuYXV0aEhlYWRlcn1cbiAgICAgICAgICAgICAgICAgICAgOiBwcm9wcy5oZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9uQ29ubmVjdGVkLFxuICAgICAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkLFxuICAgICAgICAgICAgICAgIG9uRXJyb3JcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbm5lY3RlZCAmJiBjbGllbnQuY3VycmVudCkge1xuICAgICAgICAgICAgICAgIChjbGllbnQuY3VycmVudC5kaXNjb25uZWN0IGFzIGFueSkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9LCBbY29ubmVjdGVkLCBwcm9wcy5hdXRoSGVhZGVyLCBwcm9wcy5oZWFkZXJzLCBwcm9wcy51cmxdKTtcblxuICAgIGNvbnN0IGN0eCA9IHVzZU1lbW8oXG4gICAgICAgICgpID0+ICh7XG4gICAgICAgICAgICBzZW5kLFxuICAgICAgICAgICAgc3Vic2NyaWJlLFxuICAgICAgICAgICAgY29ubmVjdGVkXG4gICAgICAgIH0pLFxuICAgICAgICBbY29ubmVjdGVkLCBzZW5kLCBzdWJzY3JpYmVdXG4gICAgKTtcblxuICAgIHJldHVybiAoXG4gICAgICAgIDxVc2VTdG9tcEN0eC5Qcm92aWRlciB2YWx1ZT17Y3R4fT5cbiAgICAgICAgICAgIHtwcm9wcy5jaGlsZHJlbn1cbiAgICAgICAgPC9Vc2VTdG9tcEN0eC5Qcm92aWRlcj5cbiAgICApO1xufSk7XG4iXX0=