UNPKG

@simplux/core

Version:

The core package of simplux. Contains everything to manage your application state in a simple way.

114 lines (113 loc) 22.3 kB
import { createImmerReducer } from './immer.js'; import { createModuleReducer } from './reducer.js'; import { createSelectors } from './selectors.js'; import { simpluxStore } from './store.js'; /** * Helper symbol used for identifying simplux module objects. * * @public */ // should really be a symbol, but as of TypeScript 4.1 there is a bug // that causes the symbol to not be properly re-exported in type // definitions when spreading a module object onto an export, which can // cause issues with composite builds export const SIMPLUX_MODULE = '[SIMPLUX_MODULE]'; /** * This is part of the simplux internal API and should not be accessed * except by simplux extensions. * * @internal */ export function createModule(store, config) { if (process.env.NODE_ENV !== 'production') { if (!config.name) { throw new Error('you must provide a module name!'); } } const { getState, dispatch, subscribe, setReducer } = store; const internals = { name: config.name, mutations: {}, dispatch, getReducer: () => simpluxStore.getReducer(config.name), getState: getModuleState, }; function getModuleState() { return internals.mockStateValue || getState()[config.name]; } function setModuleState(state) { dispatch({ type: `@simplux/${config.name}/setState`, state, }); } let unsubscribeFromStore; let latestModuleState = config.initialState; const handlers = []; const defaultStateChangeHandlerOptions = { shouldSkipInitialInvocation: false, }; const subscribeToStateChanges = (handler, options = {}) => { const fullOptions = Object.assign(Object.assign({}, defaultStateChangeHandlerOptions), options); handlers.push(handler); if (handlers.length === 1) { latestModuleState = getModuleState(); unsubscribeFromStore = subscribe(() => { const moduleState = getModuleState(); if (moduleState !== latestModuleState) { const previousModuleState = latestModuleState; latestModuleState = moduleState; for (const handler of handlers) { handler(moduleState, previousModuleState); } } }); } if (!fullOptions.shouldSkipInitialInvocation) { handler(latestModuleState, latestModuleState); } const unsubscribe = () => { const idx = handlers.indexOf(handler); if (idx >= 0) { handlers.splice(idx, 1); } if (handlers.length === 0 && unsubscribeFromStore) { unsubscribeFromStore(); unsubscribeFromStore = undefined; } }; return { unsubscribe, handler: handler, }; }; const moduleReducer = createModuleReducer(config.name, config.initialState, internals.mutations); const moduleReducerWithImmerSupport = createImmerReducer(moduleReducer); setReducer(config.name, moduleReducerWithImmerSupport); const result = { state: undefined, setState: setModuleState, subscribeToStateChanges, $simplux: internals, [SIMPLUX_MODULE]: '', }; const selectors = createSelectors(result, { state: (s) => s, }); result.state = selectors.state; return result; } /** * Checks if an object is a simplux module. * * @param object - the object to check * * @returns true if the object is a simplux module * * @internal */ export function _isSimpluxModule(object) { var _a; return ((_a = object) === null || _a === void 0 ? void 0 : _a[SIMPLUX_MODULE]) === ''; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kdWxlLmpzIiwic291cmNlcyI6WyJAc2ltcGx1eC9jb3JlL3NyYy9tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBBbnlBY3Rpb24sIFJlZHVjZXIgfSBmcm9tICdyZWR1eCdcclxuaW1wb3J0IHsgY3JlYXRlSW1tZXJSZWR1Y2VyIH0gZnJvbSAnLi9pbW1lci5qcydcclxuaW1wb3J0IHR5cGUgeyBNdXRhdGlvbkRlZmluaXRpb25zIH0gZnJvbSAnLi9tdXRhdGlvbnMuanMnXHJcbmltcG9ydCB7IGNyZWF0ZU1vZHVsZVJlZHVjZXIgfSBmcm9tICcuL3JlZHVjZXIuanMnXHJcbmltcG9ydCB7IGNyZWF0ZVNlbGVjdG9ycywgU2ltcGx1eFNlbGVjdG9yIH0gZnJvbSAnLi9zZWxlY3RvcnMuanMnXHJcbmltcG9ydCB7IHNpbXBsdXhTdG9yZSwgX1NpbXBsdXhTdG9yZSB9IGZyb20gJy4vc3RvcmUuanMnXHJcbmltcG9ydCB0eXBlIHsgSW1tdXRhYmxlIH0gZnJvbSAnLi90eXBlcy5qcydcclxuXHJcbi8qKlxyXG4gKiBIZWxwZXIgc3ltYm9sIHVzZWQgZm9yIGlkZW50aWZ5aW5nIHNpbXBsdXggbW9kdWxlIG9iamVjdHMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbi8vIHNob3VsZCByZWFsbHkgYmUgYSBzeW1ib2wsIGJ1dCBhcyBvZiBUeXBlU2NyaXB0IDQuMSB0aGVyZSBpcyBhIGJ1Z1xyXG4vLyB0aGF0IGNhdXNlcyB0aGUgc3ltYm9sIHRvIG5vdCBiZSBwcm9wZXJseSByZS1leHBvcnRlZCBpbiB0eXBlXHJcbi8vIGRlZmluaXRpb25zIHdoZW4gc3ByZWFkaW5nIGEgbW9kdWxlIG9iamVjdCBvbnRvIGFuIGV4cG9ydCwgd2hpY2ggY2FuXHJcbi8vIGNhdXNlIGlzc3VlcyB3aXRoIGNvbXBvc2l0ZSBidWlsZHNcclxuZXhwb3J0IGNvbnN0IFNJTVBMVVhfTU9EVUxFID0gJ1tTSU1QTFVYX01PRFVMRV0nXHJcblxyXG4vKipcclxuICogQ29uZmlndXJhdGlvbiBvYmplY3QgZm9yIGNyZWF0aW5nIHNpbXBsdXggbW9kdWxlcy5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbHV4TW9kdWxlQ29uZmlnPFRTdGF0ZT4ge1xyXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZ1xyXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZTogVFN0YXRlXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4gYSBtb2R1bGUgdG8gYmUgbm90aWZpZWQgb2ZcclxuICogbW9kdWxlIHN0YXRlIGNoYW5nZXMuXHJcbiAqXHJcbiAqIEBwYXJhbSBzdGF0ZSAtIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2R1bGVcclxuICogQHBhcmFtIHByZXZpb3VzU3RhdGUgLSB0aGUgcHJldmlvdXMgc3RhdGUgb2YgdGhlIG1vZHVsZVxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBTdGF0ZUNoYW5nZUhhbmRsZXI8VFN0YXRlPiA9IChcclxuICBzdGF0ZTogSW1tdXRhYmxlPFRTdGF0ZT4sXHJcbiAgcHJldmlvdXNTdGF0ZTogSW1tdXRhYmxlPFRTdGF0ZT4sXHJcbikgPT4gdm9pZFxyXG5cclxuLyoqXHJcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciByZWdpc3RlcmluZyBzdGF0ZSBjaGFuZ2UgaGFuZGxlcnMuXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RhdGVDaGFuZ2VIYW5kbGVyT3B0aW9ucyB7XHJcbiAgLyoqXHJcbiAgICogQnkgZGVmYXVsdCBhIHN0YXRlIGNoYW5nZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG1vZHVsZSdzXHJcbiAgICogY3VycmVudCBzdGF0ZSBpbW1lZGlhdGVseSBhZnRlciBiZWluZyByZWdpc3RlcmVkLiBTZXR0aW5nIHRoaXNcclxuICAgKiBwcm9wZXJ0eSB0byB0cnVlIHdpbGwgc2tpcCB0aGF0IGludm9jYXRpb24gYW5kIHdpbGwgb25seSBjYWxsIHRoZVxyXG4gICAqIGhhbmRsZXIgYXMgc29vbiBhcyB0aGUgc3RhdGUgY2hhbmdlcy5cclxuICAgKlxyXG4gICAqIEBkZWZhdWx0VmFsdWUgYGZhbHNlYFxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHNob3VsZFNraXBJbml0aWFsSW52b2NhdGlvbj86IGJvb2xlYW5cclxufVxyXG5cclxuLyoqXHJcbiAqIFRoaXMgdHlwZSBleGlzdHMgdG8gZ2V0IHRoZSBjb25jcmV0ZSB0eXBlIG9mIHRoZSBoYW5kbGVyLCBpLmUuIHRvIHJldHVyblxyXG4gKiBhIGhhbmRsZXIgd2l0aCB0aGUgY29ycmVjdCBudW1iZXIgb3IgcGFyYW1ldGVyc1xyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgdHlwZSBSZXNvbHZlZFN0YXRlQ2hhbmdlSGFuZGxlcjxUU3RhdGUsIFRIYW5kbGVyPiA9IFRIYW5kbGVyIGV4dGVuZHMgKFxyXG4gIHN0YXRlOiBJbW11dGFibGU8VFN0YXRlPixcclxuKSA9PiB2b2lkXHJcbiAgPyAoc3RhdGU6IEltbXV0YWJsZTxUU3RhdGU+KSA9PiB2b2lkXHJcbiAgOiBTdGF0ZUNoYW5nZUhhbmRsZXI8VFN0YXRlPlxyXG5cclxuLyoqXHJcbiAqIEFuIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHVuc3Vic2NyaWJlIGZyb20gYSBzdWJzY3JpcHRpb24gKGUuZy4gZm9yIGFcclxuICogc3RhdGUgY2hhbmdlIGhhbmRsZXIpLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmlwdGlvbiB7XHJcbiAgLyoqXHJcbiAgICogVW5zdWJzY3JpYmUgZnJvbSB0aGUgc3Vic2NyaXB0aW9uLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHVuc3Vic2NyaWJlOiAoKSA9PiB2b2lkXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHN1YnNjcmlwdGlvbiBmb3IgYSBzdGF0ZSBjaGFuZ2UgaGFuZGxlci5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTdGF0ZUNoYW5nZVN1YnNjcmlwdGlvbjxcclxuICBUU3RhdGUsXHJcbiAgVEhhbmRsZXIgZXh0ZW5kcyBTdGF0ZUNoYW5nZUhhbmRsZXI8VFN0YXRlPlxyXG4+IGV4dGVuZHMgU3Vic2NyaXB0aW9uIHtcclxuICAvKipcclxuICAgKiBUaGUgaGFuZGxlciBmdW5jdGlvbi4gVXNlZnVsIGZvciB0ZXN0aW5nLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGhhbmRsZXI6IFJlc29sdmVkU3RhdGVDaGFuZ2VIYW5kbGVyPFRTdGF0ZSwgVEhhbmRsZXI+XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTdWJzY3JpYmUgdG8gc3RhdGUgY2hhbmdlcy5cclxuICpcclxuICogQHBhcmFtIGhhbmRsZXIgLSB0aGUgaGFuZGxlciBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIGNoYW5nZXNcclxuICogQHBhcmFtIG9wdGlvbnMgLSBjb25maWd1cmF0aW9uIGZvciB0aGUgc3Vic2NyaXB0aW9uXHJcbiAqXHJcbiAqIEByZXR1cm5zIGEgc3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gdW5zdWJzY3JpYmUgZnJvbSBzdGF0ZSBjaGFuZ2VzXHJcbiAqXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCB0eXBlIFN1YnNjcmliZVRvU3RhdGVDaGFuZ2VzPFRTdGF0ZT4gPSA8XHJcbiAgVEhhbmRsZXIgZXh0ZW5kcyBTdGF0ZUNoYW5nZUhhbmRsZXI8VFN0YXRlPlxyXG4+KFxyXG4gIGhhbmRsZXI6IFRIYW5kbGVyLFxyXG4gIG9wdGlvbnM/OiBTdGF0ZUNoYW5nZUhhbmRsZXJPcHRpb25zLFxyXG4pID0+IFN0YXRlQ2hhbmdlU3Vic2NyaXB0aW9uPFRTdGF0ZSwgVEhhbmRsZXI+XHJcblxyXG4vKipcclxuICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaW1wbHV4IGludGVybmFsIEFQSSBhbmQgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZFxyXG4gKiBleGNlcHQgYnkgc2ltcGx1eCBleHRlbnNpb25zLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgX1NpbXBsdXhNb2R1bGVJbnRlcm5hbHM8VFN0YXRlPiB7XHJcbiAgLyoqXHJcbiAgICogVGhlIHVuaXF1ZSBuYW1lIG9mIHRoZSBtb2R1bGUuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2NrIHN0YXRlIHZhbHVlIHRvIHJldHVybiBpbnN0ZWFkIG9mIHRoZSByZWFsIHN0YXRlIHdoZW4gdGhlXHJcbiAgICogbW9kdWxlJ3Mgc3RhdGUgaXMgYWNjZXNzZWQuXHJcbiAgICovXHJcbiAgbW9ja1N0YXRlVmFsdWU/OiBUU3RhdGVcclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgYWxsIG1vZHVsZSBtdXRhdGlvbnMgdG8gYmUgYWJsZSB0byBkZXRlY3QgZHVwbGljYXRlcyBldGMuXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgbXV0YXRpb25zOiBNdXRhdGlvbkRlZmluaXRpb25zPFRTdGF0ZT5cclxuXHJcbiAgLyoqXHJcbiAgICogTW9jayBmdW5jdGlvbnMgdGhhdCBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQgb2YgcmVhbCBtdXRhdGlvbnMuXHJcbiAgICovXHJcbiAgbXV0YXRpb25Nb2Nrcz86IHsgW25hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnlbXSkgPT4gVFN0YXRlIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhY2sgZ2VuZXJhdGVkIHNlbGVjdG9yIElEcyBmb3IgdGhlIG1vZHVsZS5cclxuICAgKi9cclxuICBsYXN0U2VsZWN0b3JJZD86IG51bWJlclxyXG5cclxuICAvKipcclxuICAgKiBNb2NrIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCBvZiByZWFsIHNlbGVjdG9ycy5cclxuICAgKi9cclxuICBzZWxlY3Rvck1vY2tzPzogeyBbc2VsZWN0b3JJZDogbnVtYmVyXTogKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHByb3h5IHRvIHRoZSBSZWR1eCBzdG9yZSdzIGRpc3BhdGNoIGZ1bmN0aW9uLiBUaGlzIGlzIHBhcnQgb2YgdGhlXHJcbiAgICogc2ltcGx1eCBpbnRlcm5hbCBBUEkgYW5kIHNob3VsZCBub3QgYmUgYWNjZXNzZWQgZXhjZXB0IGJ5IHNpbXBsdXhcclxuICAgKiBleHRlbnNpb25zLlxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IGRpc3BhdGNoOiAoYWN0aW9uOiBBbnlBY3Rpb24pID0+IHZvaWRcclxuXHJcbiAgLyoqXHJcbiAgICogQSBwcm94eSB0byB0aGUgUmVkdXggc3RvcmUncyBkaXNwYXRjaCBmdW5jdGlvbi4gVGhpcyBpcyBwYXJ0IG9mIHRoZVxyXG4gICAqIHNpbXBsdXggaW50ZXJuYWwgQVBJIGFuZCBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGV4Y2VwdCBieSBzaW1wbHV4XHJcbiAgICogZXh0ZW5zaW9ucy5cclxuICAgKi9cclxuICByZWFkb25seSBnZXRSZWR1Y2VyOiAoKSA9PiBSZWR1Y2VyXHJcblxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY3VycmVudCBtb2R1bGUgc3RhdGUuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyB0aGUgbW9kdWxlIHN0YXRlXHJcbiAgICovXHJcbiAgcmVhZG9ubHkgZ2V0U3RhdGU6ICgpID0+IEltbXV0YWJsZTxUU3RhdGU+XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBJbnRlcmZhY2UgZm9yIGVmZmljaWVudGx5IGlkZW50aWZ5aW5nIHNpbXBsdXggbW9kdWxlIG9iamVjdHMgYXQgY29tcGlsZSB0aW1lLlxyXG4gKlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFNpbXBsdXhNb2R1bGVNYXJrZXI8VFN0YXRlPiB7XHJcbiAgLyoqXHJcbiAgICogQSBzeW1ib2wgdGhhdCBhbGxvd3MgZWZmaWNpZW50IGNvbXBpbGUtdGltZSBhbmQgcnVuLXRpbWUgaWRlbnRpZmljYXRpb25cclxuICAgKiBvZiBzaW1wbHV4IG1vZHVsZSBvYmplY3RzLlxyXG4gICAqXHJcbiAgICogVGhpcyBwcm9wZXJ0eSB3aWxsIGhhdmUgYW4gYHVuZGVmaW5lZGAgdmFsdWUgYXQgcnVudGltZS5cclxuICAgKlxyXG4gICAqIEBwdWJsaWNcclxuICAgKi9cclxuICByZWFkb25seSBbU0lNUExVWF9NT0RVTEVdOiBUU3RhdGVcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc2ltcGx1eCBtb2R1bGUgdGhhdCBjb250YWlucyBzb21lIHN0YXRlIGFuZCBhbGxvd3MgY29udHJvbGxlZCBtb2RpZmljYXRpb25cclxuICogYW5kIG9ic2VydmF0aW9uIG9mIHRoZSBzdGF0ZS5cclxuICpcclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBTaW1wbHV4TW9kdWxlPFRTdGF0ZT4gZXh0ZW5kcyBTaW1wbHV4TW9kdWxlTWFya2VyPFRTdGF0ZT4ge1xyXG4gIC8qKlxyXG4gICAqIEEgc2VsZWN0b3IgZm9yIGdldHRpbmcgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLlxyXG4gICAqXHJcbiAgICogQHJldHVybnMgdGhlIG1vZHVsZSBzdGF0ZVxyXG4gICAqL1xyXG4gIHJlYWRvbmx5IHN0YXRlOiBTaW1wbHV4U2VsZWN0b3I8VFN0YXRlLCBbXSwgSW1tdXRhYmxlPFRTdGF0ZT4+XHJcblxyXG4gIC8qKlxyXG4gICAqIFJlcGxhY2UgdGhlIHdob2xlIG1vZHVsZSBzdGF0ZS5cclxuICAgKlxyXG4gICAqIEBwYXJhbSBzdGF0ZSAtIHRoZSBzdGF0ZSB0byBzZXQgZm9yIHRoZSBtb2R1bGVcclxuICAgKi9cclxuICByZWFkb25seSBzZXRTdGF0ZTogKHN0YXRlOiBJbW11dGFibGU8VFN0YXRlPikgPT4gdm9pZFxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlciBhIGhhbmRsZXIgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtb2R1bGUncyBzdGF0ZVxyXG4gICAqIGNoYW5nZXMuIFRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IHdpdGggdGhlIG1vZHVsZSdzXHJcbiAgICogY3VycmVudCBzdGF0ZSB3aGVuIHN1YnNjcmliaW5nIChjYW4gYmUgY2hhbmdlZCBieSBwcm92aWRpbmcgY3VzdG9tXHJcbiAgICogb3B0aW9ucykuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gaGFuZGxlciAtIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW5ldmVyIHRoZSBtb2R1bGUncyBzdGF0ZSBjaGFuZ2VzXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBhIHN1YnNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1bnN1YnNjcmliZWQgZnJvbSB0byByZW1vdmUgdGhlIGhhbmRsZXJcclxuICAgKi9cclxuICByZWFkb25seSBzdWJzY3JpYmVUb1N0YXRlQ2hhbmdlczogU3Vic2NyaWJlVG9TdGF0ZUNoYW5nZXM8VFN0YXRlPlxyXG5cclxuICAvKipcclxuICAgKiBJbnRlcm5hbCBzdGF0ZSB0aGF0IGlzIHVzZWQgYnkgc2ltcGx1eC4gVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaW1wbHV4XHJcbiAgICogaW50ZXJuYWwgQVBJIGFuZCBzaG91bGQgbm90IGJlIGFjY2Vzc2VkIGV4Y2VwdCBieSBzaW1wbHV4IGV4dGVuc2lvbnMuXHJcbiAgICpcclxuICAgKiBAaW50ZXJuYWxcclxuICAgKi9cclxuICByZWFkb25seSAkc2ltcGx1eDogX1NpbXBsdXhNb2R1bGVJbnRlcm5hbHM8VFN0YXRlPlxyXG59XHJcblxyXG4vKipcclxuICogVGhpcyBpcyBwYXJ0IG9mIHRoZSBzaW1wbHV4IGludGVybmFsIEFQSSBhbmQgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZFxyXG4gKiBleGNlcHQgYnkgc2ltcGx1eCBleHRlbnNpb25zLlxyXG4gKlxyXG4gKiBAaW50ZXJuYWxcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNb2R1bGU8VFN0YXRlPihcclxuICBzdG9yZTogX1NpbXBsdXhTdG9yZSxcclxuICBjb25maWc6IFNpbXBsdXhNb2R1bGVDb25maWc8VFN0YXRlPixcclxuKTogU2ltcGx1eE1vZHVsZTxUU3RhdGU+IHtcclxuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICdwcm9kdWN0aW9uJykge1xyXG4gICAgaWYgKCFjb25maWcubmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3lvdSBtdXN0IHByb3ZpZGUgYSBtb2R1bGUgbmFtZSEnKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgeyBnZXRTdGF0ZSwgZGlzcGF0Y2gsIHN1YnNjcmliZSwgc2V0UmVkdWNlciB9ID0gc3RvcmVcclxuXHJcbiAgY29uc3QgaW50ZXJuYWxzOiBfU2ltcGx1eE1vZHVsZUludGVybmFsczxUU3RhdGU+ID0ge1xyXG4gICAgbmFtZTogY29uZmlnLm5hbWUsXHJcbiAgICBtdXRhdGlvbnM6IHt9LFxyXG4gICAgZGlzcGF0Y2gsXHJcbiAgICBnZXRSZWR1Y2VyOiAoKSA9PiBzaW1wbHV4U3RvcmUuZ2V0UmVkdWNlcihjb25maWcubmFtZSksXHJcbiAgICBnZXRTdGF0ZTogZ2V0TW9kdWxlU3RhdGUsXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBnZXRNb2R1bGVTdGF0ZSgpOiBJbW11dGFibGU8VFN0YXRlPiB7XHJcbiAgICByZXR1cm4gaW50ZXJuYWxzLm1vY2tTdGF0ZVZhbHVlIHx8IGdldFN0YXRlKClbY29uZmlnLm5hbWVdXHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBzZXRNb2R1bGVTdGF0ZShzdGF0ZTogSW1tdXRhYmxlPFRTdGF0ZT4pIHtcclxuICAgIGRpc3BhdGNoKHtcclxuICAgICAgdHlwZTogYEBzaW1wbHV4LyR7Y29uZmlnLm5hbWV9L3NldFN0YXRlYCxcclxuICAgICAgc3RhdGUsXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgbGV0IHVuc3Vic2NyaWJlRnJvbVN0b3JlOiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWRcclxuICBsZXQgbGF0ZXN0TW9kdWxlU3RhdGUgPSBjb25maWcuaW5pdGlhbFN0YXRlIGFzIEltbXV0YWJsZTxUU3RhdGU+XHJcbiAgY29uc3QgaGFuZGxlcnM6IFN0YXRlQ2hhbmdlSGFuZGxlcjxUU3RhdGU+W10gPSBbXVxyXG5cclxuICB0eXBlIFJlcXVpcmVkPFQ+ID0geyBbcHJvcCBpbiBrZXlvZiBUXS0/OiBUW3Byb3BdIH1cclxuXHJcbiAgY29uc3QgZGVmYXVsdFN0YXRlQ2hhbmdlSGFuZGxlck9wdGlvbnM6IFJlcXVpcmVkPFN0YXRlQ2hhbmdlSGFuZGxlck9wdGlvbnM+ID0ge1xyXG4gICAgc2hvdWxkU2tpcEluaXRpYWxJbnZvY2F0aW9uOiBmYWxzZSxcclxuICB9XHJcblxyXG4gIGNvbnN0IHN1YnNjcmliZVRvU3RhdGVDaGFuZ2VzOiBTdWJzY3JpYmVUb1N0YXRlQ2hhbmdlczxUU3RhdGU+ID0gKFxyXG4gICAgaGFuZGxlcixcclxuICAgIG9wdGlvbnMgPSB7fSxcclxuICApID0+IHtcclxuICAgIGNvbnN0IGZ1bGxPcHRpb25zID0ge1xyXG4gICAgICAuLi5kZWZhdWx0U3RhdGVDaGFuZ2VIYW5kbGVyT3B0aW9ucyxcclxuICAgICAgLi4ub3B0aW9ucyxcclxuICAgIH1cclxuXHJcbiAgICBoYW5kbGVycy5wdXNoKGhhbmRsZXIpXHJcblxyXG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMSkge1xyXG4gICAgICBsYXRlc3RNb2R1bGVTdGF0ZSA9IGdldE1vZHVsZVN0YXRlKClcclxuICAgICAgdW5zdWJzY3JpYmVGcm9tU3RvcmUgPSBzdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IG1vZHVsZVN0YXRlID0gZ2V0TW9kdWxlU3RhdGUoKVxyXG5cclxuICAgICAgICBpZiAobW9kdWxlU3RhdGUgIT09IGxhdGVzdE1vZHVsZVN0YXRlKSB7XHJcbiAgICAgICAgICBjb25zdCBwcmV2aW91c01vZHVsZVN0YXRlID0gbGF0ZXN0TW9kdWxlU3RhdGVcclxuICAgICAgICAgIGxhdGVzdE1vZHVsZVN0YXRlID0gbW9kdWxlU3RhdGVcclxuXHJcbiAgICAgICAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgaGFuZGxlcnMpIHtcclxuICAgICAgICAgICAgaGFuZGxlcihtb2R1bGVTdGF0ZSwgcHJldmlvdXNNb2R1bGVTdGF0ZSlcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmdWxsT3B0aW9ucy5zaG91bGRTa2lwSW5pdGlhbEludm9jYXRpb24pIHtcclxuICAgICAgaGFuZGxlcihsYXRlc3RNb2R1bGVTdGF0ZSwgbGF0ZXN0TW9kdWxlU3RhdGUpXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdW5zdWJzY3JpYmUgPSAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IGlkeCA9IGhhbmRsZXJzLmluZGV4T2YoaGFuZGxlcilcclxuICAgICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgICAgaGFuZGxlcnMuc3BsaWNlKGlkeCwgMSlcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMCAmJiB1bnN1YnNjcmliZUZyb21TdG9yZSkge1xyXG4gICAgICAgIHVuc3Vic2NyaWJlRnJvbVN0b3JlKClcclxuICAgICAgICB1bnN1YnNjcmliZUZyb21TdG9yZSA9IHVuZGVmaW5lZFxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdW5zdWJzY3JpYmUsXHJcbiAgICAgIGhhbmRsZXI6IChoYW5kbGVyIGFzIHVua25vd24pIGFzIFJlc29sdmVkU3RhdGVDaGFuZ2VIYW5kbGVyPFxyXG4gICAgICAgIFRTdGF0ZSxcclxuICAgICAgICB0eXBlb2YgaGFuZGxlclxyXG4gICAgICA+LFxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29uc3QgbW9kdWxlUmVkdWNlciA9IGNyZWF0ZU1vZHVsZVJlZHVjZXIoXHJcbiAgICBjb25maWcubmFtZSxcclxuICAgIGNvbmZpZy5pbml0aWFsU3RhdGUsXHJcbiAgICBpbnRlcm5hbHMubXV0YXRpb25zLFxyXG4gIClcclxuXHJcbiAgY29uc3QgbW9kdWxlUmVkdWNlcldpdGhJbW1lclN1cHBvcnQgPSBjcmVhdGVJbW1lclJlZHVjZXIobW9kdWxlUmVkdWNlcilcclxuXHJcbiAgc2V0UmVkdWNlcihjb25maWcubmFtZSwgbW9kdWxlUmVkdWNlcldpdGhJbW1lclN1cHBvcnQpXHJcblxyXG4gIHR5cGUgU2hhbGxvd011dGFibGU8VD4gPSB7IC1yZWFkb25seSBbcHJvcCBpbiBrZXlvZiBUXTogVFtwcm9wXSB9XHJcblxyXG4gIGNvbnN0IHJlc3VsdDogU2hhbGxvd011dGFibGU8U2ltcGx1eE1vZHVsZTxUU3RhdGU+PiA9IHtcclxuICAgIHN0YXRlOiB1bmRlZmluZWQhLFxyXG4gICAgc2V0U3RhdGU6IHNldE1vZHVsZVN0YXRlLFxyXG4gICAgc3Vic2NyaWJlVG9TdGF0ZUNoYW5nZXMsXHJcbiAgICAkc2ltcGx1eDogaW50ZXJuYWxzLFxyXG4gICAgW1NJTVBMVVhfTU9EVUxFXTogJycgYXMgYW55LFxyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2VsZWN0b3JzID0gY3JlYXRlU2VsZWN0b3JzKHJlc3VsdCwge1xyXG4gICAgc3RhdGU6IChzKSA9PiBzLFxyXG4gIH0pXHJcblxyXG4gIHJlc3VsdC5zdGF0ZSA9IHNlbGVjdG9ycy5zdGF0ZVxyXG5cclxuICByZXR1cm4gcmVzdWx0XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBDaGVja3MgaWYgYW4gb2JqZWN0IGlzIGEgc2ltcGx1eCBtb2R1bGUuXHJcbiAqXHJcbiAqIEBwYXJhbSBvYmplY3QgLSB0aGUgb2JqZWN0IHRvIGNoZWNrXHJcbiAqXHJcbiAqIEByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHNpbXBsdXggbW9kdWxlXHJcbiAqXHJcbiAqIEBpbnRlcm5hbFxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIF9pc1NpbXBsdXhNb2R1bGU8VFN0YXRlLCBUT3RoZXI+KFxyXG4gIG9iamVjdDogU2ltcGx1eE1vZHVsZU1hcmtlcjxUU3RhdGU+IHwgVE90aGVyLFxyXG4pOiBvYmplY3QgaXMgU2ltcGx1eE1vZHVsZTxUU3RhdGU+IHtcclxuICByZXR1cm4gKG9iamVjdCBhcyBhbnkpPy5bU0lNUExVWF9NT0RVTEVdID09PSAnJ1xyXG59XHJcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUE7QUFFL0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ2xELE9BQU8sRUFBRSxlQUFlLEVBQW1CLE1BQU0sZ0JBQWdCLENBQUE7QUFDakUsT0FBTyxFQUFFLFlBQVksRUFBaUIsTUFBTSxZQUFZLENBQUE7QUFHeEQ7Ozs7R0FJRztBQUNILHFFQUFxRTtBQUNyRSxnRUFBZ0U7QUFDaEUsdUVBQXVFO0FBQ3ZFLHFDQUFxQztBQUNyQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQUE7QUEyTmhEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDMUIsS0FBb0IsRUFDcEIsTUFBbUM7SUFFbkMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsS0FBSyxZQUFZLEVBQUU7UUFDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFBO1NBQ25EO0tBQ0Y7SUFFRCxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLEdBQUcsS0FBSyxDQUFBO0lBRTNELE1BQU0sU0FBUyxHQUFvQztRQUNqRCxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7UUFDakIsU0FBUyxFQUFFLEVBQUU7UUFDYixRQUFRO1FBQ1IsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLFlBQVks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