@data-client/test
Version:
Testing utilities for Data Client
119 lines (117 loc) • 17.8 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["initialFixtures", "resolverFixtures", "getInitialInterceptorData"],
_excluded2 = ["children"];
import { SubscriptionManager, NetworkManager, PollingSubscription, Controller } from '@data-client/react';
import React, { memo, Suspense } from 'react';
import { renderHook, act } from './renderHook.cjs';
import { MockController } from '../MockController.js';
import mockInitialState from '../mockState.js';
import { jsx as _jsx } from "react/jsx-runtime";
const activeCleanups = new Set();
if (typeof afterEach === 'function') {
afterEach(() => {
for (const fn of activeCleanups) fn();
activeCleanups.clear();
});
}
/** @see https://dataclient.io/docs/api/makeRenderDataHook */
export default function makeRenderDataHook(Provider) {
const renderDataClient = (callback, _ref = {}) => {
let {
initialFixtures,
resolverFixtures,
getInitialInterceptorData = () => ({})
} = _ref,
options = _objectWithoutPropertiesLoose(_ref, _excluded);
/** Wraps dispatches that are typically called declaratively in act() */
class ActController extends MockController(Controller, resolverFixtures ? {
fixtures: resolverFixtures,
getInitialInterceptorData
} : {}) {
constructor(options) {
super(options);
const {
setResponse,
resolve
} = this;
this.setResponse = (...args) => {
let promise;
act(() => {
promise = setResponse.call(this, ...args);
});
return promise;
};
this.resolve = (...args) => {
let promise;
act(() => {
promise = resolve.call(this, ...args);
});
return promise;
};
}
}
// we want fresh manager state in each instance
const nm = new NetworkManager();
const sm = new SubscriptionManager(PollingSubscription);
const managers = [nm, sm];
const cleanup = () => {
activeCleanups.delete(cleanup);
nm.cleanupDate = Infinity;
if (nm['rejectors']) Object.values(nm['rejectors']).forEach(rej => {
rej();
});else if (nm['fetching']) nm['fetching'].forEach(({
reject
}) => reject());
nm['clearAll']();
managers.forEach(manager => manager.cleanup());
};
const allSettled = () => {
return nm.allSettled();
};
activeCleanups.add(cleanup);
renderDataClient.cleanup = cleanup;
renderDataClient.allSettled = allSettled;
const initialState = mockInitialState(initialFixtures);
const ProviderWithResolver = /*#__PURE__*/memo(function ProviderWithResolver({
children
}) {
return /*#__PURE__*/_jsx(Provider, {
initialState: initialState,
Controller: ActController,
managers: managers,
devButton: null,
children: children
});
});
const Wrapper = options == null ? void 0 : options.wrapper;
const ProviderWithWrapper = Wrapper ? function ProviderWrapped(props) {
return /*#__PURE__*/_jsx(ProviderWithResolver, {
children: /*#__PURE__*/_jsx(Wrapper, _extends({}, props))
});
} : ProviderWithResolver;
const wrapper = _ref2 => {
let {
children
} = _ref2,
props = _objectWithoutPropertiesLoose(_ref2, _excluded2);
return /*#__PURE__*/_jsx(ProviderWithWrapper, _extends({}, props, {
children: /*#__PURE__*/_jsx(Suspense, {
fallback: null,
children: children
})
}));
};
const ret = renderHook(callback, _extends({}, options, {
wrapper
}));
ret.controller = nm['controller'];
ret.cleanup = cleanup;
ret.allSettled = allSettled;
return ret;
};
renderDataClient.cleanup = () => {};
renderDataClient.allSettled = () => Promise.allSettled([]);
return renderDataClient;
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJTdWJzY3JpcHRpb25NYW5hZ2VyIiwiTmV0d29ya01hbmFnZXIiLCJQb2xsaW5nU3Vic2NyaXB0aW9uIiwiQ29udHJvbGxlciIsIlJlYWN0IiwibWVtbyIsIlN1c3BlbnNlIiwicmVuZGVySG9vayIsImFjdCIsIk1vY2tDb250cm9sbGVyIiwibW9ja0luaXRpYWxTdGF0ZSIsImpzeCIsIl9qc3giLCJhY3RpdmVDbGVhbnVwcyIsIlNldCIsImFmdGVyRWFjaCIsImZuIiwiY2xlYXIiLCJtYWtlUmVuZGVyRGF0YUhvb2siLCJQcm92aWRlciIsInJlbmRlckRhdGFDbGllbnQiLCJjYWxsYmFjayIsIl9yZWYiLCJpbml0aWFsRml4dHVyZXMiLCJyZXNvbHZlckZpeHR1cmVzIiwiZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSIsIm9wdGlvbnMiLCJfb2JqZWN0V2l0aG91dFByb3BlcnRpZXNMb29zZSIsIl9leGNsdWRlZCIsIkFjdENvbnRyb2xsZXIiLCJmaXh0dXJlcyIsImNvbnN0cnVjdG9yIiwic2V0UmVzcG9uc2UiLCJyZXNvbHZlIiwiYXJncyIsInByb21pc2UiLCJjYWxsIiwibm0iLCJzbSIsIm1hbmFnZXJzIiwiY2xlYW51cCIsImRlbGV0ZSIsImNsZWFudXBEYXRlIiwiSW5maW5pdHkiLCJPYmplY3QiLCJ2YWx1ZXMiLCJmb3JFYWNoIiwicmVqIiwicmVqZWN0IiwibWFuYWdlciIsImFsbFNldHRsZWQiLCJhZGQiLCJpbml0aWFsU3RhdGUiLCJQcm92aWRlcldpdGhSZXNvbHZlciIsImNoaWxkcmVuIiwiZGV2QnV0dG9uIiwiV3JhcHBlciIsIndyYXBwZXIiLCJQcm92aWRlcldpdGhXcmFwcGVyIiwiUHJvdmlkZXJXcmFwcGVkIiwicHJvcHMiLCJfZXh0ZW5kcyIsIl9yZWYyIiwiX2V4Y2x1ZGVkMiIsImZhbGxiYWNrIiwicmV0IiwiY29udHJvbGxlciIsIlByb21pc2UiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvbWFrZVJlbmRlckRhdGFDbGllbnQvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIFN0YXRlLFxuICBNYW5hZ2VyLFxuICBTdWJzY3JpcHRpb25NYW5hZ2VyLFxuICBOZXR3b3JrTWFuYWdlcixcbiAgUG9sbGluZ1N1YnNjcmlwdGlvbixcbiAgQ29udHJvbGxlcixcbiAgR2VuZXJpY0Rpc3BhdGNoLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG59IGZyb20gJ0BkYXRhLWNsaWVudC9yZWFjdCc7XG5pbXBvcnQgUmVhY3QsIHsgbWVtbywgU3VzcGVuc2UgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7XG4gIHJlbmRlckhvb2ssXG4gIGFjdCxcbiAgUmVuZGVySG9va1Jlc3VsdCxcbiAgdHlwZSBSZW5kZXJIb29rT3B0aW9ucyxcbn0gZnJvbSAnLi9yZW5kZXJIb29rLmNqcyc7XG5pbXBvcnQgeyBJbnRlcmNlcHRvciwgRml4dHVyZSB9IGZyb20gJy4uL2ZpeHR1cmVUeXBlcy5qcyc7XG5pbXBvcnQgeyBNb2NrQ29udHJvbGxlciB9IGZyb20gJy4uL01vY2tDb250cm9sbGVyLmpzJztcbmltcG9ydCBtb2NrSW5pdGlhbFN0YXRlIGZyb20gJy4uL21vY2tTdGF0ZS5qcyc7XG5pbXBvcnQgeyBNb2NrUHJvcHMgfSBmcm9tICcuLi9tb2NrVHlwZXMuanMnO1xuXG5jb25zdCBhY3RpdmVDbGVhbnVwcyA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuaWYgKHR5cGVvZiBhZnRlckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGFjdGl2ZUNsZWFudXBzKSBmbigpO1xuICAgIGFjdGl2ZUNsZWFudXBzLmNsZWFyKCk7XG4gIH0pO1xufVxuXG4vKiogQHNlZSBodHRwczovL2RhdGFjbGllbnQuaW8vZG9jcy9hcGkvbWFrZVJlbmRlckRhdGFIb29rICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtYWtlUmVuZGVyRGF0YUhvb2soXG4gIFByb3ZpZGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPERhdGFQcm92aWRlclByb3BzPixcbikge1xuICBjb25zdCByZW5kZXJEYXRhQ2xpZW50OiBSZW5kZXJEYXRhSG9vayA9ICg8UCwgUiwgVCA9IGFueT4oXG4gICAgY2FsbGJhY2s6IChwcm9wczogUCkgPT4gUixcbiAgICB7XG4gICAgICBpbml0aWFsRml4dHVyZXMsXG4gICAgICByZXNvbHZlckZpeHR1cmVzLFxuICAgICAgZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSA9ICgpID0+ICh7fSkgYXMgYW55LFxuICAgICAgLi4ub3B0aW9uc1xuICAgIH06IHtcbiAgICAgIGluaXRpYWxQcm9wcz86IFA7XG4gICAgICBpbml0aWFsRml4dHVyZXM/OiBGaXh0dXJlW107XG4gICAgICByZXNvbHZlckZpeHR1cmVzPzogKEZpeHR1cmUgfCBJbnRlcmNlcHRvcjxUPilbXTtcbiAgICAgIGdldEluaXRpYWxJbnRlcmNlcHRvckRhdGE/OiAoKSA9PiBUO1xuICAgICAgd3JhcHBlcj86IFJlYWN0LkNvbXBvbmVudFR5cGU8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4+O1xuICAgIH0gJiBPbWl0PFJlbmRlckhvb2tPcHRpb25zPFA+LCAnaW5pdGlhbFByb3BzJyB8ICd3cmFwcGVyJz4gPSB7fSBhcyBhbnksXG4gICk6IFJlbmRlckRhdGFIb29rUmVzdWx0PFIsIFA+ID0+IHtcbiAgICAvKiogV3JhcHMgZGlzcGF0Y2hlcyB0aGF0IGFyZSB0eXBpY2FsbHkgY2FsbGVkIGRlY2xhcmF0aXZlbHkgaW4gYWN0KCkgKi9cbiAgICBjbGFzcyBBY3RDb250cm9sbGVyPFxuICAgICAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbiAgICAgIFQgPSB7fSxcbiAgICA+IGV4dGVuZHMgTW9ja0NvbnRyb2xsZXIoXG4gICAgICBDb250cm9sbGVyLFxuICAgICAgcmVzb2x2ZXJGaXh0dXJlcyA/XG4gICAgICAgIHtcbiAgICAgICAgICBmaXh0dXJlczogcmVzb2x2ZXJGaXh0dXJlcyxcbiAgICAgICAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhLFxuICAgICAgICB9XG4gICAgICA6IHt9LFxuICAgICk8RD4ge1xuICAgICAgY29uc3RydWN0b3IoXG4gICAgICAgIG9wdGlvbnM6IE1vY2tQcm9wczxUPiAmIENvbnN0cnVjdG9yUGFyYW1ldGVyczx0eXBlb2YgQ29udHJvbGxlcjxEPj5bMF0sXG4gICAgICApIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHsgc2V0UmVzcG9uc2UsIHJlc29sdmUgfSA9IHRoaXM7XG4gICAgICAgIHRoaXMuc2V0UmVzcG9uc2UgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGxldCBwcm9taXNlOiBhbnk7XG4gICAgICAgICAgYWN0KCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSBzZXRSZXNwb25zZS5jYWxsKHRoaXMsIC4uLmFyZ3MpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLnJlc29sdmUgPSAoLi4uYXJncykgPT4ge1xuICAgICAgICAgIGxldCBwcm9taXNlOiBhbnk7XG4gICAgICAgICAgYWN0KCgpID0+IHtcbiAgICAgICAgICAgIHByb21pc2UgPSByZXNvbHZlLmNhbGwodGhpcywgLi4uYXJncyk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gd2Ugd2FudCBmcmVzaCBtYW5hZ2VyIHN0YXRlIGluIGVhY2ggaW5zdGFuY2VcbiAgICBjb25zdCBubSA9IG5ldyBOZXR3b3JrTWFuYWdlcigpO1xuICAgIGNvbnN0IHNtID0gbmV3IFN1YnNjcmlwdGlvbk1hbmFnZXIoUG9sbGluZ1N1YnNjcmlwdGlvbik7XG4gICAgY29uc3QgbWFuYWdlcnMgPSBbbm0sIHNtXTtcbiAgICBjb25zdCBjbGVhbnVwID0gKCkgPT4ge1xuICAgICAgYWN0aXZlQ2xlYW51cHMuZGVsZXRlKGNsZWFudXApO1xuICAgICAgbm0uY2xlYW51cERhdGUgPSBJbmZpbml0eTtcbiAgICAgIGlmICgobm0gYXMgYW55KVsncmVqZWN0b3JzJ10pXG4gICAgICAgIE9iamVjdC52YWx1ZXMoKG5tIGFzIGFueSlbJ3JlamVjdG9ycyddIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pLmZvckVhY2goXG4gICAgICAgICAgcmVqID0+IHtcbiAgICAgICAgICAgIHJlaigpO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICBlbHNlIGlmIChubVsnZmV0Y2hpbmcnXSkgbm1bJ2ZldGNoaW5nJ10uZm9yRWFjaCgoeyByZWplY3QgfSkgPT4gcmVqZWN0KCkpO1xuICAgICAgbm1bJ2NsZWFyQWxsJ10oKTtcbiAgICAgIG1hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgfTtcbiAgICBjb25zdCBhbGxTZXR0bGVkID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIG5tLmFsbFNldHRsZWQoKTtcbiAgICB9O1xuICAgIGFjdGl2ZUNsZWFudXBzLmFkZChjbGVhbnVwKTtcbiAgICByZW5kZXJEYXRhQ2xpZW50LmNsZWFudXAgPSBjbGVhbnVwO1xuICAgIHJlbmRlckRhdGFDbGllbnQuYWxsU2V0dGxlZCA9IGFsbFNldHRsZWQ7XG5cbiAgICBjb25zdCBpbml0aWFsU3RhdGU6IFN0YXRlPHVua25vd24+ID0gbW9ja0luaXRpYWxTdGF0ZShpbml0aWFsRml4dHVyZXMpO1xuXG4gICAgY29uc3QgUHJvdmlkZXJXaXRoUmVzb2x2ZXI6IFJlYWN0LkNvbXBvbmVudFR5cGU8YW55PiA9IG1lbW8oXG4gICAgICBmdW5jdGlvbiBQcm92aWRlcldpdGhSZXNvbHZlcih7IGNoaWxkcmVuIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgPFByb3ZpZGVyXG4gICAgICAgICAgICBpbml0aWFsU3RhdGU9e2luaXRpYWxTdGF0ZX1cbiAgICAgICAgICAgIENvbnRyb2xsZXI9e0FjdENvbnRyb2xsZXJ9XG4gICAgICAgICAgICBtYW5hZ2Vycz17bWFuYWdlcnN9XG4gICAgICAgICAgICBkZXZCdXR0b249e251bGx9XG4gICAgICAgICAgPlxuICAgICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICAgIDwvUHJvdmlkZXI+XG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICBjb25zdCBXcmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+PiB8IHVuZGVmaW5lZCA9XG4gICAgICBvcHRpb25zPy53cmFwcGVyO1xuICAgIGNvbnN0IFByb3ZpZGVyV2l0aFdyYXBwZXIgPVxuICAgICAgV3JhcHBlciA/XG4gICAgICAgIGZ1bmN0aW9uIFByb3ZpZGVyV3JhcHBlZChwcm9wczogUmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4pIHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPFByb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICAgICA8V3JhcHBlciB7Li4ucHJvcHN9IC8+XG4gICAgICAgICAgICA8L1Byb3ZpZGVyV2l0aFJlc29sdmVyPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIDogUHJvdmlkZXJXaXRoUmVzb2x2ZXI7XG5cbiAgICBjb25zdCB3cmFwcGVyOiBSZWFjdC5Db21wb25lbnRUeXBlPGFueT4gPSAoe1xuICAgICAgY2hpbGRyZW4sXG4gICAgICAuLi5wcm9wc1xuICAgIH06IFJlYWN0LlByb3BzV2l0aENoaWxkcmVuPFA+KSA9PiAoXG4gICAgICA8UHJvdmlkZXJXaXRoV3JhcHBlciB7Li4uKHByb3BzIGFzIGFueSl9PlxuICAgICAgICA8U3VzcGVuc2UgZmFsbGJhY2s9e251bGx9PntjaGlsZHJlbn08L1N1c3BlbnNlPlxuICAgICAgPC9Qcm92aWRlcldpdGhXcmFwcGVyPlxuICAgICk7XG5cbiAgICBjb25zdCByZXQ6IGFueSA9IHJlbmRlckhvb2soY2FsbGJhY2ssIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB3cmFwcGVyLFxuICAgIH0pO1xuICAgIHJldC5jb250cm9sbGVyID0gbm1bJ2NvbnRyb2xsZXInXTtcbiAgICByZXQuY2xlYW51cCA9IGNsZWFudXA7XG4gICAgcmV0LmFsbFNldHRsZWQgPSBhbGxTZXR0bGVkO1xuICAgIHJldHVybiByZXQ7XG4gIH0pIGFzIGFueTtcbiAgcmVuZGVyRGF0YUNsaWVudC5jbGVhbnVwID0gKCkgPT4ge307XG4gIHJlbmRlckRhdGFDbGllbnQuYWxsU2V0dGxlZCA9ICgpID0+IFByb21pc2UuYWxsU2V0dGxlZChbXSk7XG4gIHJldHVybiByZW5kZXJEYXRhQ2xpZW50O1xufVxuZXhwb3J0IGludGVyZmFjZSBEYXRhUHJvdmlkZXJQcm9wcyB7XG4gIGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGU7XG4gIG1hbmFnZXJzOiBNYW5hZ2VyW107XG4gIGluaXRpYWxTdGF0ZTogU3RhdGU8dW5rbm93bj47XG4gIENvbnRyb2xsZXI6IHR5cGVvZiBDb250cm9sbGVyPGFueT47XG4gIGRldkJ1dHRvbjogYW55O1xufVxuXG5leHBvcnQgdHlwZSBSZW5kZXJEYXRhSG9va1Jlc3VsdDxSLCBQPiA9IFJlbmRlckhvb2tSZXN1bHQ8UiwgUD4gJiB7XG4gIGNvbnRyb2xsZXI6IENvbnRyb2xsZXI7XG4gIGNsZWFudXA6ICgpID0+IHZvaWQ7XG4gIGFsbFNldHRsZWQ6ICgpID0+IFByb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8dW5rbm93bj5bXT4gfCB1bmRlZmluZWQ7XG59O1xuXG5leHBvcnQgdHlwZSBSZW5kZXJEYXRhSG9vayA9ICg8UCwgUj4oXG4gIGNhbGxiYWNrOiAocHJvcHM6IFApID0+IFIsXG4gIG9wdGlvbnM/OiB7XG4gICAgaW5pdGlhbFByb3BzPzogUDtcbiAgICBpbml0aWFsRml4dHVyZXM/OiByZWFkb25seSBGaXh0dXJlW107XG4gICAgcmVhZG9ubHkgcmVzb2x2ZXJGaXh0dXJlcz86IHJlYWRvbmx5IChGaXh0dXJlIHwgSW50ZXJjZXB0b3IpW107XG4gICAgd3JhcHBlcj86IFJlYWN0LkNvbXBvbmVudFR5cGU8UmVhY3QuUHJvcHNXaXRoQ2hpbGRyZW48UD4+O1xuICB9ICYgT21pdDxSZW5kZXJIb29rT3B0aW9uczxQPiwgJ2luaXRpYWxQcm9wcycgfCAnd3JhcHBlcic+LFxuKSA9PiBSZW5kZXJEYXRhSG9va1Jlc3VsdDxSLCBQPikgJiB7XG4gIC8qKiBAZGVwcmVjYXRlZCB1c2UgcGVyLXJlbmRlciBjbGVhbnVwIHJldHVybmVkIGZyb20gcmVuZGVyRGF0YUNsaWVudCgpIGluc3RlYWQgKi9cbiAgY2xlYW51cDogKCkgPT4gdm9pZDtcbiAgLyoqIEBkZXByZWNhdGVkIHVzZSBwZXItcmVuZGVyIGFsbFNldHRsZWQgcmV0dXJuZWQgZnJvbSByZW5kZXJEYXRhQ2xpZW50KCkgaW5zdGVhZCAqL1xuICBhbGxTZXR0bGVkOiAoKSA9PiBQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHVua25vd24+W10+IHwgdW5kZWZpbmVkO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLFNBR0VBLG1CQUFtQixFQUNuQkMsY0FBYyxFQUNkQyxtQkFBbUIsRUFDbkJDLFVBQVUsUUFHTCxvQkFBb0I7QUFDM0IsT0FBT0MsS0FBSyxJQUFJQyxJQUFJLEVBQUVDLFFBQVEsUUFBUSxPQUFPO0FBRTdDLFNBQ0VDLFVBQVUsRUFDVkMsR0FBRyxRQUdFLGtCQUFrQjtBQUV6QixTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELE9BQU9DLGdCQUFnQixNQUFNLGlCQUFpQjtBQUFDLFNBQUFDLEdBQUEsSUFBQUMsSUFBQTtBQUcvQyxNQUFNQyxjQUFjLEdBQUcsSUFBSUMsR0FBRyxDQUFhLENBQUM7QUFFNUMsSUFBSSxPQUFPQyxTQUFTLEtBQUssVUFBVSxFQUFFO0VBQ25DQSxTQUFTLENBQUMsTUFBTTtJQUNkLEtBQUssTUFBTUMsRUFBRSxJQUFJSCxjQUFjLEVBQUVHLEVBQUUsQ0FBQyxDQUFDO0lBQ3JDSCxjQUFjLENBQUNJLEtBQUssQ0FBQyxDQUFDO0VBQ3hCLENBQUMsQ0FBQztBQUNKOztBQUVBO0FBQ0EsZUFBZSxTQUFTQyxrQkFBa0JBLENBQ3hDQyxRQUFnRCxFQUNoRDtFQUNBLE1BQU1DLGdCQUFnQyxHQUFJQSxDQUN4Q0MsUUFBeUIsRUFDekJDLElBQUEsR0FXNkQsQ0FBQyxDQUFRLEtBQ3ZDO0lBQUEsSUFaL0I7UUFDRUMsZUFBZTtRQUNmQyxnQkFBZ0I7UUFDaEJDLHlCQUF5QixHQUFHQSxDQUFBLE1BQU8sQ0FBQyxDQUFDO01BUWtCLENBQUMsR0FBQUgsSUFBQTtNQVByREksT0FBTyxHQUFBQyw2QkFBQSxDQUFBTCxJQUFBLEVBQUFNLFNBQUE7SUFTWjtJQUNBLE1BQU1DLGFBQWEsU0FHVHBCLGNBQWMsQ0FDdEJOLFVBQVUsRUFDVnFCLGdCQUFnQixHQUNkO01BQ0VNLFFBQVEsRUFBRU4sZ0JBQWdCO01BQzFCQztJQUNGLENBQUMsR0FDRCxDQUFDLENBQ0wsQ0FBQyxDQUFJO01BQ0hNLFdBQVdBLENBQ1RMLE9BQXNFLEVBQ3RFO1FBQ0EsS0FBSyxDQUFDQSxPQUFPLENBQUM7UUFDZCxNQUFNO1VBQUVNLFdBQVc7VUFBRUM7UUFBUSxDQUFDLEdBQUcsSUFBSTtRQUNyQyxJQUFJLENBQUNELFdBQVcsR0FBRyxDQUFDLEdBQUdFLElBQUksS0FBSztVQUM5QixJQUFJQyxPQUFZO1VBQ2hCM0IsR0FBRyxDQUFDLE1BQU07WUFDUjJCLE9BQU8sR0FBR0gsV0FBVyxDQUFDSSxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUdGLElBQUksQ0FBQztVQUMzQyxDQUFDLENBQUM7VUFDRixPQUFPQyxPQUFPO1FBQ2hCLENBQUM7UUFDRCxJQUFJLENBQUNGLE9BQU8sR0FBRyxDQUFDLEdBQUdDLElBQUksS0FBSztVQUMxQixJQUFJQyxPQUFZO1VBQ2hCM0IsR0FBRyxDQUFDLE1BQU07WUFDUjJCLE9BQU8sR0FBR0YsT0FBTyxDQUFDRyxJQUFJLENBQUMsSUFBSSxFQUFFLEdBQUdGLElBQUksQ0FBQztVQUN2QyxDQUFDLENBQUM7VUFDRixPQUFPQyxPQUFPO1FBQ2hCLENBQUM7TUFDSDtJQUNGOztJQUVBO0lBQ0EsTUFBTUUsRUFBRSxHQUFHLElBQUlwQyxjQUFjLENBQUMsQ0FBQztJQUMvQixNQUFNcUMsRUFBRSxHQUFHLElBQUl0QyxtQkFBbUIsQ0FBQ0UsbUJBQW1CLENBQUM7SUFDdkQsTUFBTXFDLFFBQVEsR0FBRyxDQUFDRixFQUFFLEVBQUVDLEVBQUUsQ0FBQztJQUN6QixNQUFNRSxPQUFPLEdBQUdBLENBQUEsS0FBTTtNQUNwQjNCLGNBQWMsQ0FBQzRCLE1BQU0sQ0FBQ0QsT0FBTyxDQUFDO01BQzlCSCxFQUFFLENBQUNLLFdBQVcsR0FBR0MsUUFBUTtNQUN6QixJQUFLTixFQUFFLENBQVMsV0FBVyxDQUFDLEVBQzFCTyxNQUFNLENBQUNDLE1BQU0sQ0FBRVIsRUFBRSxDQUFTLFdBQVcsQ0FBd0IsQ0FBQyxDQUFDUyxPQUFPLENBQ3BFQyxHQUFHLElBQUk7UUFDTEEsR0FBRyxDQUFDLENBQUM7TUFDUCxDQUNGLENBQUMsQ0FBQyxLQUNDLElBQUlWLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRUEsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDUyxPQUFPLENBQUMsQ0FBQztRQUFFRTtNQUFPLENBQUMsS0FBS0EsTUFBTSxDQUFDLENBQUMsQ0FBQztNQUN6RVgsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7TUFDaEJFLFFBQVEsQ0FBQ08sT0FBTyxDQUFDRyxPQUFPLElBQUlBLE9BQU8sQ0FBQ1QsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBQ0QsTUFBTVUsVUFBVSxHQUFHQSxDQUFBLEtBQU07TUFDdkIsT0FBT2IsRUFBRSxDQUFDYSxVQUFVLENBQUMsQ0FBQztJQUN4QixDQUFDO0lBQ0RyQyxjQUFjLENBQUNzQyxHQUFHLENBQUNYLE9BQU8sQ0FBQztJQUMzQnBCLGdCQUFnQixDQUFDb0IsT0FBTyxHQUFHQSxPQUFPO0lBQ2xDcEIsZ0JBQWdCLENBQUM4QixVQUFVLEdBQUdBLFVBQVU7SUFFeEMsTUFBTUUsWUFBNEIsR0FBRzFDLGdCQUFnQixDQUFDYSxlQUFlLENBQUM7SUFFdEUsTUFBTThCLG9CQUE4QyxnQkFBR2hELElBQUksQ0FDekQsU0FBU2dELG9CQUFvQkEsQ0FBQztNQUFFQztJQUFxQyxDQUFDLEVBQUU7TUFDdEUsb0JBQ0UxQyxJQUFBLENBQUNPLFFBQVE7UUFDUGlDLFlBQVksRUFBRUEsWUFBYTtRQUMzQmpELFVBQVUsRUFBRTBCLGFBQWM7UUFDMUJVLFFBQVEsRUFBRUEsUUFBUztRQUNuQmdCLFNBQVMsRUFBRSxJQUFLO1FBQUFELFFBQUEsRUFFZkE7TUFBUSxDQUNELENBQUM7SUFFZixDQUNGLENBQUM7SUFFRCxNQUFNRSxPQUFvRSxHQUN4RTlCLE9BQU8sb0JBQVBBLE9BQU8sQ0FBRStCLE9BQU87SUFDbEIsTUFBTUMsbUJBQW1CLEdBQ3ZCRixPQUFPLEdBQ0wsU0FBU0csZUFBZUEsQ0FBQ0MsS0FBaUMsRUFBRTtNQUMxRCxvQkFDRWhELElBQUEsQ0FBQ3lDLG9CQUFvQjtRQUFBQyxRQUFBLGVBQ25CMUMsSUFBQSxDQUFDNEMsT0FBTyxFQUFBSyxRQUFBLEtBQUtELEtBQUssQ0FBRztNQUFDLENBQ0YsQ0FBQztJQUUzQixDQUFDLEdBQ0RQLG9CQUFvQjtJQUV4QixNQUFNSSxPQUFpQyxHQUFHSyxLQUFBO01BQUEsSUFBQztVQUN6Q1I7UUFFMEIsQ0FBQyxHQUFBUSxLQUFBO1FBRHhCRixLQUFLLEdBQUFqQyw2QkFBQSxDQUFBbUMsS0FBQSxFQUFBQyxVQUFBO01BQUEsb0JBRVJuRCxJQUFBLENBQUM4QyxtQkFBbUIsRUFBQUcsUUFBQSxLQUFNRCxLQUFLO1FBQUFOLFFBQUEsZUFDN0IxQyxJQUFBLENBQUNOLFFBQVE7VUFBQzBELFFBQVEsRUFBRSxJQUFLO1VBQUFWLFFBQUEsRUFBRUE7UUFBUSxDQUFXO01BQUMsRUFDNUIsQ0FBQztJQUFBLENBQ3ZCO0lBRUQsTUFBTVcsR0FBUSxHQUFHMUQsVUFBVSxDQUFDYyxRQUFRLEVBQUF3QyxRQUFBLEtBQy9CbkMsT0FBTztNQUNWK0I7SUFBTyxFQUNSLENBQUM7SUFDRlEsR0FBRyxDQUFDQyxVQUFVLEdBQUc3QixFQUFFLENBQUMsWUFBWSxDQUFDO0lBQ2pDNEIsR0FBRyxDQUFDekIsT0FBTyxHQUFHQSxPQUFPO0lBQ3JCeUIsR0FBRyxDQUFDZixVQUFVLEdBQUdBLFVBQVU7SUFDM0IsT0FBT2UsR0FBRztFQUNaLENBQVM7RUFDVDdDLGdCQUFnQixDQUFDb0IsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0VBQ25DcEIsZ0JBQWdCLENBQUM4QixVQUFVLEdBQUcsTUFBTWlCLE9BQU8sQ0FBQ2pCLFVBQVUsQ0FBQyxFQUFFLENBQUM7RUFDMUQsT0FBTzlCLGdCQUFnQjtBQUN6QiIsImlnbm9yZUxpc3QiOltdfQ==