UNPKG

@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
'use strict'; 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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