@simplux/react
Version:
The react extension package of simplux. Provides a simple way to use simplux in react applications.
140 lines (133 loc) • 22.8 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', { value: true });
var core = require('@simplux/core');
var React = require('react');
var reactDom = require('react-dom');
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
var __spreadArray = (undefined && undefined.__spreadArray) || function (to, from) {
for (var i = 0, il = from.length, j = to.length; i < il; i++, j++)
to[j] = from[i];
return to;
};
// this default context value just passes calls through to the module; this
// is mainly useful for testing since you do not have to wrap your component
// in a provider
var defaultValue = {
subscribeToModuleStateChanges: function (simpluxModule, handler) {
return simpluxModule.subscribeToStateChanges(handler).unsubscribe;
},
getModuleState: function (simpluxModule) { return simpluxModule.$simplux.getState(); },
};
// by always returning 0 for `calculateChangedBits` we prevent components
// from re-rendering just because they access the context value; instead
// it is up to each component to decide when to render, the context is just
// responsible for providing a consistent state value during each render
// pass
var SimpluxContext = React.createContext(defaultValue, function () { return 0; });
// we only support accessing the context via the useSimplux hook
delete SimpluxContext.Consumer;
var useSimpluxContext = function () { return React.useContext(SimpluxContext); };
var useSimpluxSubscription = function (getStoreProxy) {
var _a = React.useState(function () { return getStoreProxy().getState(); }), moduleStates = _a[0], setModuleStates = _a[1];
var subscribers = new Map();
React.useEffect(function () {
var previousModuleStates = moduleStates;
var currentModuleStates = moduleStates;
return getStoreProxy().subscribe(function () {
previousModuleStates = currentModuleStates;
currentModuleStates = getStoreProxy().getState();
reactDom.unstable_batchedUpdates(function () {
setModuleStates(currentModuleStates);
subscribers.forEach(function (moduleSubscribers, moduleName) {
var currentState = currentModuleStates[moduleName];
var prevState = previousModuleStates[moduleName];
if (currentState !== prevState) {
moduleSubscribers.forEach(function (sub) { return sub(currentState, prevState); });
}
});
});
});
}, []);
function getModuleState(simpluxModule) {
return (simpluxModule.$simplux.mockStateValue ||
moduleStates[simpluxModule.$simplux.name] ||
simpluxModule.$simplux.getState());
}
function subscribeToModuleStateChanges(simpluxModule, handler) {
var moduleName = simpluxModule.$simplux.name;
var moduleState = getModuleState(simpluxModule);
if (!subscribers.has(moduleName)) {
subscribers.set(moduleName, new Set());
}
subscribers.get(moduleName).add(handler);
handler(moduleState, moduleState);
return function () { return subscribers.get(moduleName).delete(handler); };
}
return {
getModuleState: getModuleState,
subscribeToModuleStateChanges: subscribeToModuleStateChanges,
};
};
/**
* A provider for allowing components to use state from simplux modules.
*
* It is recommended to wrap your entire application with a single provider.
*
* @public
*/
var SimpluxProvider = function (_a) {
var children = _a.children;
var contextValue = useSimpluxSubscription(core._getStoreProxy);
return (React__default["default"].createElement(SimpluxContext.Provider, { value: contextValue }, children));
};
function useSimplux(selectorOrModule) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
var module = core._isSimpluxModule(selectorOrModule)
? selectorOrModule
: selectorOrModule.owningModule;
var selector = core._isSimpluxModule(selectorOrModule)
? selectorOrModule.state
: selectorOrModule;
var selectorMocks = module.$simplux.selectorMocks || {};
var selectorMock = selectorMocks[selector.selectorId];
if (selectorMock) {
return selectorMock.apply(void 0, args);
}
return useSelector(selector, args);
function useSelector(selector, args) {
var _a = React.useReducer(function (s) { return s + 1; }, 0), forceRender = _a[1];
var context = useSimpluxContext();
var selectedState = selector.withState.apply(selector, __spreadArray([context.getModuleState(selector.owningModule)], args));
React.useEffect(function () {
var previousSelectedState = selectedState;
var hadError = false;
function checkForUpdates(state) {
try {
var newSelectedState = selector.withState.apply(selector, __spreadArray([state], args));
if (newSelectedState === previousSelectedState && !hadError) {
return;
}
previousSelectedState = newSelectedState;
hadError = false;
}
catch (err) {
// we ignore all errors here, since when the component
// is re-rendered, the selector is called again, and
// will throw again, if neither args nor module state
// changed
hadError = true;
}
forceRender();
}
return context.subscribeToModuleStateChanges(selector.owningModule, checkForUpdates);
}, __spreadArray([], args));
return selectedState;
}
}
exports.SimpluxProvider = SimpluxProvider;
exports.useSimplux = useSimplux;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGx1eC5yZWFjdC5kZXZlbG9wbWVudC5qcyIsInNvdXJjZXMiOlsiQHNpbXBsdXgvcmVhY3Qvc3JjL3VzZVNpbXBsdXgudHMiLCJAc2ltcGx1eC9yZWFjdC9zcmMvY29udGV4dC50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBJbW11dGFibGUsXHJcbiAgU2ltcGx1eE1vZHVsZSxcclxuICBTaW1wbHV4U2VsZWN0b3IsXHJcbiAgX2lzU2ltcGx1eE1vZHVsZSxcclxufSBmcm9tICdAc2ltcGx1eC9jb3JlJ1xyXG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZHVjZXIgfSBmcm9tICdyZWFjdCdcclxuaW1wb3J0IHsgdXNlU2ltcGx1eENvbnRleHQgfSBmcm9tICcuL2NvbnRleHQuanMnXHJcblxyXG4vKipcclxuICogQSByZWFjdCBob29rIHRoYXQgYWxsb3dzIGFjY2Vzc2luZyBhIG1vZHVsZSdzIHN0YXRlIGluc2lkZVxyXG4gKiBhIGNvbXBvbmVudC4gV2hlbmV2ZXIgdGhlIHN0YXRlIG9mIHRoZSBtb2R1bGUgY2hhbmdlcyB0aGVcclxuICogY29tcG9uZW50IHVzaW5nIHRoZSBob29rIHdpbGwgYmUgcmUtcmVuZGVyZWQuXHJcbiAqXHJcbiAqIEBwYXJhbSBzaW1wbHV4TW9kdWxlIC0gdGhlIG1vZHVsZSB0byByZXR1cm4gdGhlIHN0YXRlIGZvclxyXG4gKlxyXG4gKiBAcmV0dXJucyB0aGUgc3RhdGUgb2YgdGhlIG1vZHVsZVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlU2ltcGx1eDxUU3RhdGU+KFxyXG4gIHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPixcclxuKTogSW1tdXRhYmxlPFRTdGF0ZT5cclxuXHJcbi8qKlxyXG4gKiBBIHJlYWN0IGhvb2sgdGhhdCBhbGxvd3MgYWNjZXNzaW5nIGEgbW9kdWxlJ3Mgc3RhdGUgaW5zaWRlXHJcbiAqIGEgY29tcG9uZW50LiBXaGVuZXZlciB0aGUgcmVzdWx0IG9mIHRoZSBzZWxlY3RvciBjaGFuZ2VzIHRoZVxyXG4gKiBjb21wb25lbnQgdXNpbmcgdGhlIGhvb2sgd2lsbCBiZSByZS1yZW5kZXJlZC5cclxuICpcclxuICogQHBhcmFtIHNlbGVjdG9yIC0gdGhlIG1vZHVsZSBzZWxlY3RvciB0aGF0IGRldGVybWluZXMgdGhlIHNsaWNlXHJcbiAqIG9mIHRoZSBtb2R1bGUncyBzdGF0ZSB3aGljaCBpcyByZXR1cm5lZFxyXG4gKiBAcGFyYW0gYXJncyAtIHRoZSBhcmd1bWVudHMgZm9yIHRoZSBzZWxlY3RvclxyXG4gKlxyXG4gKiBAcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBzZWxlY3RvclxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gdXNlU2ltcGx1eDxUU3RhdGUsIFRBcmdzIGV4dGVuZHMgYW55W10sIFRSZXN1bHQ+KFxyXG4gIHNlbGVjdG9yOiBTaW1wbHV4U2VsZWN0b3I8VFN0YXRlLCBUQXJncywgVFJlc3VsdD4sXHJcbiAgLi4uYXJnczogVEFyZ3NcclxuKTogVFJlc3VsdFxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVzZVNpbXBsdXg8VFN0YXRlLCBUQXJncyBleHRlbmRzIGFueVtdLCBUUmVzdWx0PihcclxuICBzZWxlY3Rvck9yTW9kdWxlOlxyXG4gICAgfCBTaW1wbHV4U2VsZWN0b3I8VFN0YXRlLCBUQXJncywgVFJlc3VsdD5cclxuICAgIHwgU2ltcGx1eE1vZHVsZTxUU3RhdGU+LFxyXG4gIC4uLmFyZ3M6IFRBcmdzXHJcbik6IFRSZXN1bHQge1xyXG4gIGNvbnN0IG1vZHVsZSA9IF9pc1NpbXBsdXhNb2R1bGUoc2VsZWN0b3JPck1vZHVsZSlcclxuICAgID8gc2VsZWN0b3JPck1vZHVsZVxyXG4gICAgOiBzZWxlY3Rvck9yTW9kdWxlLm93bmluZ01vZHVsZVxyXG5cclxuICBjb25zdCBzZWxlY3RvciA9IF9pc1NpbXBsdXhNb2R1bGUoc2VsZWN0b3JPck1vZHVsZSlcclxuICAgID8gc2VsZWN0b3JPck1vZHVsZS5zdGF0ZVxyXG4gICAgOiBzZWxlY3Rvck9yTW9kdWxlXHJcblxyXG4gIGNvbnN0IHNlbGVjdG9yTW9ja3MgPSBtb2R1bGUuJHNpbXBsdXguc2VsZWN0b3JNb2NrcyB8fCB7fVxyXG4gIGNvbnN0IHNlbGVjdG9yTW9jayA9IHNlbGVjdG9yTW9ja3Nbc2VsZWN0b3Iuc2VsZWN0b3JJZF1cclxuXHJcbiAgaWYgKHNlbGVjdG9yTW9jaykge1xyXG4gICAgcmV0dXJuIHNlbGVjdG9yTW9jayguLi5hcmdzKVxyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHVzZVNlbGVjdG9yKHNlbGVjdG9yIGFzIFNpbXBsdXhTZWxlY3RvcjxUU3RhdGUsIFRBcmdzLCBUUmVzdWx0PiwgYXJncylcclxuXHJcbiAgZnVuY3Rpb24gdXNlU2VsZWN0b3I8VFN0YXRlLCBUQXJncyBleHRlbmRzIGFueVtdLCBUUmVzdWx0PihcclxuICAgIHNlbGVjdG9yOiBTaW1wbHV4U2VsZWN0b3I8VFN0YXRlLCBUQXJncywgVFJlc3VsdD4sXHJcbiAgICBhcmdzOiBUQXJncyxcclxuICApOiBUUmVzdWx0IHtcclxuICAgIGNvbnN0IFssIGZvcmNlUmVuZGVyXSA9IHVzZVJlZHVjZXIoKHM6IG51bWJlcikgPT4gcyArIDEsIDApXHJcblxyXG4gICAgY29uc3QgY29udGV4dCA9IHVzZVNpbXBsdXhDb250ZXh0KClcclxuXHJcbiAgICBjb25zdCBzZWxlY3RlZFN0YXRlID0gc2VsZWN0b3Iud2l0aFN0YXRlKFxyXG4gICAgICBjb250ZXh0LmdldE1vZHVsZVN0YXRlKHNlbGVjdG9yLm93bmluZ01vZHVsZSksXHJcbiAgICAgIC4uLmFyZ3MsXHJcbiAgICApXHJcblxyXG4gICAgdXNlRWZmZWN0KCgpID0+IHtcclxuICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRTdGF0ZSA9IHNlbGVjdGVkU3RhdGVcclxuICAgICAgbGV0IGhhZEVycm9yID0gZmFsc2VcclxuXHJcbiAgICAgIGZ1bmN0aW9uIGNoZWNrRm9yVXBkYXRlcyhzdGF0ZTogSW1tdXRhYmxlPFRTdGF0ZT4pIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRTdGF0ZSA9IHNlbGVjdG9yLndpdGhTdGF0ZShzdGF0ZSwgLi4uYXJncylcclxuXHJcbiAgICAgICAgICBpZiAobmV3U2VsZWN0ZWRTdGF0ZSA9PT0gcHJldmlvdXNTZWxlY3RlZFN0YXRlICYmICFoYWRFcnJvcikge1xyXG4gICAgICAgICAgICByZXR1cm5cclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkU3RhdGUgPSBuZXdTZWxlY3RlZFN0YXRlXHJcbiAgICAgICAgICBoYWRFcnJvciA9IGZhbHNlXHJcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgICAvLyB3ZSBpZ25vcmUgYWxsIGVycm9ycyBoZXJlLCBzaW5jZSB3aGVuIHRoZSBjb21wb25lbnRcclxuICAgICAgICAgIC8vIGlzIHJlLXJlbmRlcmVkLCB0aGUgc2VsZWN0b3IgaXMgY2FsbGVkIGFnYWluLCBhbmRcclxuICAgICAgICAgIC8vIHdpbGwgdGhyb3cgYWdhaW4sIGlmIG5laXRoZXIgYXJncyBub3IgbW9kdWxlIHN0YXRlXHJcbiAgICAgICAgICAvLyBjaGFuZ2VkXHJcbiAgICAgICAgICBoYWRFcnJvciA9IHRydWVcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvcmNlUmVuZGVyKClcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIGNvbnRleHQuc3Vic2NyaWJlVG9Nb2R1bGVTdGF0ZUNoYW5nZXMoXHJcbiAgICAgICAgc2VsZWN0b3Iub3duaW5nTW9kdWxlLFxyXG4gICAgICAgIGNoZWNrRm9yVXBkYXRlcyxcclxuICAgICAgKVxyXG4gICAgfSwgWy4uLmFyZ3NdKVxyXG5cclxuICAgIHJldHVybiBzZWxlY3RlZFN0YXRlXHJcbiAgfVxyXG59XHJcbiIsImltcG9ydCB7XG4gIEltbXV0YWJsZSxcbiAgU2ltcGx1eE1vZHVsZSxcbiAgU3RhdGVDaGFuZ2VIYW5kbGVyLFxuICBfZ2V0U3RvcmVQcm94eSxcbiAgX0ludGVybmFsUmVkdXhTdG9yZVByb3h5LFxufSBmcm9tICdAc2ltcGx1eC9jb3JlJ1xuaW1wb3J0IFJlYWN0LCB7XG4gIENvbnRleHQsXG4gIGNyZWF0ZUNvbnRleHQsXG4gIEZ1bmN0aW9uQ29tcG9uZW50LFxuICBSZWFjdE5vZGUsXG4gIHVzZUNvbnRleHQsXG4gIHVzZUVmZmVjdCxcbiAgdXNlU3RhdGUsXG59IGZyb20gJ3JlYWN0J1xuaW1wb3J0IHsgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMgfSBmcm9tICdyZWFjdC1kb20nXG5cbi8vIHJlcXVpcmVkIHNpbmNlIFJlYWN0IHR5cGluZ3MgdG8gbm90IGluY2x1ZGUgdGhlIHNlY29uZCBwYXJhbWV0ZXJcbnR5cGUgQ3JlYXRlQ29udGV4dEZuID0gPFQ+KFxuICBkZWZhdWx0VmFsdWU6IFQsXG4gIGNhbGN1bGF0ZUNoYW5nZWRCaXRzOiAoKSA9PiBudW1iZXIsXG4pID0+IENvbnRleHQ8VD5cblxuZXhwb3J0IGludGVyZmFjZSBTaW1wbHV4Q29udGV4dFZhbHVlIHtcbiAgc3Vic2NyaWJlVG9Nb2R1bGVTdGF0ZUNoYW5nZXM6IDxUU3RhdGU+KFxuICAgIHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPixcbiAgICBoYW5kbGVyOiBTdGF0ZUNoYW5nZUhhbmRsZXI8VFN0YXRlPixcbiAgKSA9PiAoKSA9PiB2b2lkXG5cbiAgZ2V0TW9kdWxlU3RhdGU6IDxUU3RhdGU+KFxuICAgIHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPixcbiAgKSA9PiBJbW11dGFibGU8VFN0YXRlPlxufVxuXG5pbnRlcmZhY2UgTW9kdWxlU3RhdGVzIHtcbiAgW21vZHVsZU5hbWU6IHN0cmluZ106IGFueVxufVxuXG4vLyB0aGlzIGRlZmF1bHQgY29udGV4dCB2YWx1ZSBqdXN0IHBhc3NlcyBjYWxscyB0aHJvdWdoIHRvIHRoZSBtb2R1bGU7IHRoaXNcbi8vIGlzIG1haW5seSB1c2VmdWwgZm9yIHRlc3Rpbmcgc2luY2UgeW91IGRvIG5vdCBoYXZlIHRvIHdyYXAgeW91ciBjb21wb25lbnRcbi8vIGluIGEgcHJvdmlkZXJcbmNvbnN0IGRlZmF1bHRWYWx1ZTogU2ltcGx1eENvbnRleHRWYWx1ZSA9IHtcbiAgc3Vic2NyaWJlVG9Nb2R1bGVTdGF0ZUNoYW5nZXMoc2ltcGx1eE1vZHVsZSwgaGFuZGxlcikge1xuICAgIHJldHVybiBzaW1wbHV4TW9kdWxlLnN1YnNjcmliZVRvU3RhdGVDaGFuZ2VzKGhhbmRsZXIpLnVuc3Vic2NyaWJlXG4gIH0sXG4gIGdldE1vZHVsZVN0YXRlOiAoc2ltcGx1eE1vZHVsZSkgPT4gc2ltcGx1eE1vZHVsZS4kc2ltcGx1eC5nZXRTdGF0ZSgpLFxufVxuXG4vLyBieSBhbHdheXMgcmV0dXJuaW5nIDAgZm9yIGBjYWxjdWxhdGVDaGFuZ2VkQml0c2Agd2UgcHJldmVudCBjb21wb25lbnRzXG4vLyBmcm9tIHJlLXJlbmRlcmluZyBqdXN0IGJlY2F1c2UgdGhleSBhY2Nlc3MgdGhlIGNvbnRleHQgdmFsdWU7IGluc3RlYWRcbi8vIGl0IGlzIHVwIHRvIGVhY2ggY29tcG9uZW50IHRvIGRlY2lkZSB3aGVuIHRvIHJlbmRlciwgdGhlIGNvbnRleHQgaXMganVzdFxuLy8gcmVzcG9uc2libGUgZm9yIHByb3ZpZGluZyBhIGNvbnNpc3RlbnQgc3RhdGUgdmFsdWUgZHVyaW5nIGVhY2ggcmVuZGVyXG4vLyBwYXNzXG5jb25zdCBTaW1wbHV4Q29udGV4dCA9IChjcmVhdGVDb250ZXh0IGFzIENyZWF0ZUNvbnRleHRGbikoZGVmYXVsdFZhbHVlLCAoKSA9PiAwKVxuXG4vLyB3ZSBvbmx5IHN1cHBvcnQgYWNjZXNzaW5nIHRoZSBjb250ZXh0IHZpYSB0aGUgdXNlU2ltcGx1eCBob29rXG5kZWxldGUgKFNpbXBsdXhDb250ZXh0IGFzIFBhcnRpYWw8dHlwZW9mIFNpbXBsdXhDb250ZXh0PikuQ29uc3VtZXJcblxuZXhwb3J0IGNvbnN0IHVzZVNpbXBsdXhDb250ZXh0ID0gKCkgPT4gdXNlQ29udGV4dChTaW1wbHV4Q29udGV4dClcblxuZXhwb3J0IGNvbnN0IHVzZVNpbXBsdXhTdWJzY3JpcHRpb24gPSAoXG4gIGdldFN0b3JlUHJveHk6ICgpID0+IF9JbnRlcm5hbFJlZHV4U3RvcmVQcm94eSxcbik6IFNpbXBsdXhDb250ZXh0VmFsdWUgPT4ge1xuICBjb25zdCBbbW9kdWxlU3RhdGVzLCBzZXRNb2R1bGVTdGF0ZXNdID0gdXNlU3RhdGU8TW9kdWxlU3RhdGVzPigoKSA9PlxuICAgIGdldFN0b3JlUHJveHkoKS5nZXRTdGF0ZSgpLFxuICApXG5cbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBTZXQ8KHN0YXRlOiBhbnksIHByZXZpb3VzU3RhdGU6IGFueSkgPT4gdm9pZD5cbiAgPigpXG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBsZXQgcHJldmlvdXNNb2R1bGVTdGF0ZXMgPSBtb2R1bGVTdGF0ZXNcbiAgICBsZXQgY3VycmVudE1vZHVsZVN0YXRlcyA9IG1vZHVsZVN0YXRlc1xuXG4gICAgcmV0dXJuIGdldFN0b3JlUHJveHkoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgcHJldmlvdXNNb2R1bGVTdGF0ZXMgPSBjdXJyZW50TW9kdWxlU3RhdGVzXG4gICAgICBjdXJyZW50TW9kdWxlU3RhdGVzID0gZ2V0U3RvcmVQcm94eSgpLmdldFN0YXRlKClcblxuICAgICAgdW5zdGFibGVfYmF0Y2hlZFVwZGF0ZXMoKCkgPT4ge1xuICAgICAgICBzZXRNb2R1bGVTdGF0ZXMoY3VycmVudE1vZHVsZVN0YXRlcylcblxuICAgICAgICBzdWJzY3JpYmVycy5mb3JFYWNoKChtb2R1bGVTdWJzY3JpYmVycywgbW9kdWxlTmFtZSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IGN1cnJlbnRNb2R1bGVTdGF0ZXNbbW9kdWxlTmFtZV1cbiAgICAgICAgICBjb25zdCBwcmV2U3RhdGUgPSBwcmV2aW91c01vZHVsZVN0YXRlc1ttb2R1bGVOYW1lXVxuXG4gICAgICAgICAgaWYgKGN1cnJlbnRTdGF0ZSAhPT0gcHJldlN0YXRlKSB7XG4gICAgICAgICAgICBtb2R1bGVTdWJzY3JpYmVycy5mb3JFYWNoKChzdWIpID0+IHN1YihjdXJyZW50U3RhdGUsIHByZXZTdGF0ZSkpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9KVxuICB9LCBbXSlcblxuICBmdW5jdGlvbiBnZXRNb2R1bGVTdGF0ZTxUU3RhdGU+KHNpbXBsdXhNb2R1bGU6IFNpbXBsdXhNb2R1bGU8VFN0YXRlPikge1xuICAgIHJldHVybiAoXG4gICAgICBzaW1wbHV4TW9kdWxlLiRzaW1wbHV4Lm1vY2tTdGF0ZVZhbHVlIHx8XG4gICAgICBtb2R1bGVTdGF0ZXNbc2ltcGx1eE1vZHVsZS4kc2ltcGx1eC5uYW1lXSB8fFxuICAgICAgc2ltcGx1eE1vZHVsZS4kc2ltcGx1eC5nZXRTdGF0ZSgpXG4gICAgKVxuICB9XG5cbiAgZnVuY3Rpb24gc3Vic2NyaWJlVG9Nb2R1bGVTdGF0ZUNoYW5nZXMoXG4gICAgc2ltcGx1eE1vZHVsZTogU2ltcGx1eE1vZHVsZTxhbnk+LFxuICAgIGhhbmRsZXI6IFN0YXRlQ2hhbmdlSGFuZGxlcjxhbnk+LFxuICApIHtcbiAgICBjb25zdCBtb2R1bGVOYW1lID0gc2ltcGx1eE1vZHVsZS4kc2ltcGx1eC5uYW1lXG4gICAgY29uc3QgbW9kdWxlU3RhdGUgPSBnZXRNb2R1bGVTdGF0ZShzaW1wbHV4TW9kdWxlKVxuXG4gICAgaWYgKCFzdWJzY3JpYmVycy5oYXMobW9kdWxlTmFtZSkpIHtcbiAgICAgIHN1YnNjcmliZXJzLnNldChtb2R1bGVOYW1lLCBuZXcgU2V0KCkpXG4gICAgfVxuXG4gICAgc3Vic2NyaWJlcnMuZ2V0KG1vZHVsZU5hbWUpIS5hZGQoaGFuZGxlcilcblxuICAgIGhhbmRsZXIobW9kdWxlU3RhdGUsIG1vZHVsZVN0YXRlKVxuXG4gICAgcmV0dXJuICgpID0+IHN1YnNjcmliZXJzLmdldChtb2R1bGVOYW1lKSEuZGVsZXRlKGhhbmRsZXIpXG4gIH1cblxuICByZXR1cm4ge1xuICAgIGdldE1vZHVsZVN0YXRlLFxuICAgIHN1YnNjcmliZVRvTW9kdWxlU3RhdGVDaGFuZ2VzLFxuICB9XG59XG5cbi8qKlxuICogQSBwcm92aWRlciBmb3IgYWxsb3dpbmcgY29tcG9uZW50cyB0byB1c2Ugc3RhdGUgZnJvbSBzaW1wbHV4IG1vZHVsZXMuXG4gKlxuICogSXQgaXMgcmVjb21tZW5kZWQgdG8gd3JhcCB5b3VyIGVudGlyZSBhcHBsaWNhdGlvbiB3aXRoIGEgc2luZ2xlIHByb3ZpZGVyLlxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IFNpbXBsdXhQcm92aWRlcjogRnVuY3Rpb25Db21wb25lbnQ8eyBjaGlsZHJlbjogUmVhY3ROb2RlIH0+ID0gKHtcbiAgY2hpbGRyZW4sXG59KSA9PiB7XG4gIGNvbnN0IGNvbnRleHRWYWx1ZSA9IHVzZVNpbXBsdXhTdWJzY3JpcHRpb24oX2dldFN0b3JlUHJveHkpXG5cbiAgcmV0dXJuIChcbiAgICA8U2ltcGx1eENvbnRleHQuUHJvdmlkZXIgdmFsdWU9e2NvbnRleHRWYWx1ZX0+XG4gICAgICB7Y2hpbGRyZW59XG4gICAgPC9TaW1wbHV4Q29udGV4dC5Qcm92aWRlcj5cbiAgKVxufVxuIl0sIm5hbWVzIjpbInVzZUVmZmVjdCIsInVzZVJlZHVjZXIiLCJfaXNTaW1wbHV4TW9kdWxlIiwiUmVhY3QiLCJfZ2V0U3RvcmVQcm94eSIsInVuc3RhYmxlX2JhdGNoZWRVcGRhdGVzIiwidXNlU3RhdGUiLCJ1c2VDb250ZXh0IiwiY3JlYXRlQ29udGV4dCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUN1Q0E7QUFDQTtBQUNBO0FBQ0EsSUFBTSxZQUFZLEdBQXdCO0FBQzFDLElBQUUsNkJBQTZCLEVBQS9CLFVBQWdDLGFBQWEsRUFBRSxPQUFPLEVBQXREO0FBQ0EsUUFBSSxPQUFPLGFBQWEsQ0FB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