UNPKG

ts-union

Version:

ADT (sum type) in typescript inspired by ML language family

248 lines 26.3 kB
// tslint:disable:no-expression-statement // tslint:disable-next-line:no-implicit-dependencies import { of, Union } from './index'; import test from 'ava'; // tslint:disable-next-line:no-object-literal-type-assertion const U = Union({ Simple: of(), SuperSimple: of(null), One: of(), Const: of(3), Two: of(), Three: of(), }); const { SuperSimple, Simple, One, Two, Three, Const } = U; test('unpacks simple', t => { const s = Simple(); const c = Const(); t.is(U.if.Simple(s, () => 4), 4); t.is(U.if.Simple(c, () => 4), undefined); t.is(U.if.Simple(c, () => 4, () => 1), 1); }); test('unpacks const', t => { const si = Simple(); const c = Const(); t.is(U.if.Const(c, n => n), 3); t.is(U.if.Const(si, n => n, () => 1), 1); t.is(U.if.Const(si, n => n), undefined); }); test('else case accepts the original object', t => { const simple = Simple(); t.is(U.if.Const(simple, _ => Simple(), v => v), simple); }); test('unpacks one arg', t => { const one = One('one'); const c = Const(); t.is(U.if.One(one, s => s), 'one'); t.is(U.if.One(c, s => s, _ => 'els'), 'els'); t.is(U.if.One(c, s => s), undefined); }); test('unpacks two args', t => { const f = (s, n) => s + n.toString(); const two = Two('two', 1); const c = Const(); t.is(U.if.Two(two, f), 'two1'); t.is(U.if.Two(c, f, () => 'els'), 'els'); t.is(U.if.Two(c, f), undefined); }); test('unpacks three args', t => { const f = (s, n, b) => s + n.toString() + (b ? 'true' : 'false'); const three = Three('three', 1, true); const c = Const(); t.is(U.if.Three(three, f), 'three1true'); t.is(U.if.Three(c, f, () => 'els'), 'els'); t.is(U.if.Three(c, f), undefined); }); const throwErr = () => { throw new Error('shouldnt happen'); }; test('switch simple case', t => { t.is(U.match(Simple(), { Simple: () => 'simple', default: throwErr, }), 'simple'); }); test('switch const case', t => { t.is(U.match(Const(), { Const: n => n, default: throwErr, }), 3); }); test('switch one case', t => { t.is(U.match(One('one'), { One: s => s, default: throwErr, }), 'one'); }); test('switch two case', t => { t.is(U.match(Two('two', 2), { Two: (s, n) => s + n.toString(), default: throwErr, }), 'two2'); }); test('switch three case', t => { t.is(U.match(Three('three', 1, true), { Three: (s, n, b) => s + n.toString() + (b ? 'true' : 'false'), default: throwErr, }), 'three1true'); }); test('switch deferred eval', t => { const evalFunc = U.match({ Simple: () => 'simple', SuperSimple: () => 'super simple', Const: n => n.toString(), One: s => s, Three: (s, n, b) => s + n.toString() + (b ? 'true' : 'false'), Two: (s, n) => s + n.toString(), }); t.is(evalFunc(Simple()), 'simple'); t.is(evalFunc(SuperSimple), 'super simple'); t.is(evalFunc(Const()), '3'); t.is(evalFunc(One('one')), 'one'); t.is(evalFunc(Two('two', 2)), 'two2'); t.is(evalFunc(Three('three', 3, true)), 'three3true'); }); test('switch default case', t => { const three = Three('three', 3, true); const two = Two('two', 2); const one = One('one'); const si = Simple(); const co = Const(); const val = 'def'; const justDef = U.match({ default: _ => val }); t.is(justDef(si), val); t.is(justDef(co), val); t.is(justDef(one), val); t.is(justDef(two), val); t.is(justDef(three), val); t.is(U.match(si, { default: _ => val }), val); t.is(U.match(co, { default: _ => val }), val); t.is(U.match(one, { default: _ => val }), val); t.is(U.match(two, { default: _ => val }), val); t.is(U.match(three, { default: _ => val }), val); }); const Maybe = Union(a => ({ Nothing: of(null), Just: of(a), })); const { Nothing, Just } = Maybe; test('generic match', t => { const shouldBeTwo = Maybe.match(Just(1), { Just: n => n + 1, default: throwErr, }); t.is(shouldBeTwo, 2); const numToStr = Maybe.match({ Just: (n) => n.toString(), Nothing: () => 'nothing', }); t.is(numToStr(Just(1)), '1'); t.is(numToStr(Nothing()), 'nothing'); const strLen = Maybe.match({ Just: s => s.length, Nothing: () => -1, }); t.is(strLen(Just('a')), 1); t.is(strLen(Nothing()), -1); }); test('generic if', t => { const one = Just(1); const nothing = Nothing(); t.is(Maybe.if.Just(one, n => n + 1), 2); t.is(Maybe.if.Just(nothing, n => n), undefined); t.is(Maybe.if.Nothing(nothing, () => 1), 1); }); test('if can write a generic func like map or bind', t => { const map = (val, f) => Maybe.if.Just(val, v => Just(f(v)), n => n); const maybeOne = map(Just('a'), s => s.length); t.is(Maybe.if.Just(maybeOne, n => n + 1), 2); const bind = (val, f) => Maybe.if.Just(val, a => f(a), _ => Nothing()); t.is(Maybe.if.Just(bind(Just(1), n => Just(n.toString())), s => s), '1'); }); // Used for Readme.md example // const ReqResult = Union(TPayload => ({ // Pending: of<void>(), // Ok: TPayload, // Err: of<string | Error>() // })); // const res = ReqResult.Ok('this is awesome!'); // const toStr = ReqResult.match(res, { // Pending: () => 'Thinking...', // Err: err => // typeof err === 'string' ? `Oops ${err}` : `Exception ${err.message}`, // Ok: str => `Ok, ${str}` // }); test('we can have boolean and union values for cases', t => { // related to https://github.com/Microsoft/TypeScript/issues/7294 const T = Union({ Bool: of(), StrOrNum: of(), Enum: of(), Void: of(null), }); const toStr = T.match({ Void: () => 'void', Bool: b => (b === true ? 'true' : b === false ? 'false' : throwErr()), Enum: s => s, StrOrNum: sn => (typeof sn === 'number' ? sn.toString() : sn), }); t.is(toStr(T.Void), 'void'); t.is(toStr(T.Bool(true)), 'true'); t.is(toStr(T.Enum('yes')), 'yes'); t.is(toStr(T.StrOrNum(1)), '1'); t.is(toStr(T.StrOrNum('F* yeah!')), 'F* yeah!'); t.is(T.if.Void(T.Void, () => 'void'), 'void'); const G = Union(a => ({ Val: of(a), Nope: of(), })); const valOr = (val, def) => G.if.Val(val, v => v, () => def); const strOrNumVal = 'v'; t.is(valOr(G.Val(strOrNumVal), 4), 'v'); t.is(valOr(G.Val(1), -1), 1); t.is(valOr(G.Val(1), -1), 1); t.is(valOr(G.Nope('nope'), -1), -1); t.is(valOr(G.Nope(100500), -1), -1); }); test('shorthand for declaring cases momoizes the value in generics', t => { const G = Union(a => ({ Val: of(a), Nope: of(null), Void: of(), })); // not the same reference t.not(G.Val(1), G.Val(1)); t.not(G.Void(), G.Void()); // but 'of(null)' memoizes it t.is(G.Nope(), G.Nope()); }); test('it can correctly create matchWith function', t => { const State = Union({ Loading: of(null), Loaded: of(), Err: of(), }); const Ev = Union({ ErrorHappened: of(), DataFetched: of(), }); const { Loaded, Err, Loading } = State; const transition = State.matchWith(Ev, { Loading: { ErrorHappened: (_, err) => Err(err), DataFetched: (_, data) => Loaded(data), }, Loaded: { DataFetched: (loaded, data) => Loaded(loaded + data), }, default: (prevState, _ev) => prevState, }); const { ErrorHappened, DataFetched } = Ev; // declared cases t.deepEqual(transition(Loading, ErrorHappened('oops')), Err('oops')); t.deepEqual(transition(Loading, DataFetched(1)), Loaded(1)); t.deepEqual(transition(Loaded(1), DataFetched(1)), Loaded(2)); // fallback to default t.deepEqual(transition(Loaded(1), ErrorHappened('oops')), Loaded(1)); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9pbmRleC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlDQUF5QztBQUN6QyxvREFBb0Q7QUFDcEQsT0FBTyxFQUFrQixFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBRXBELE9BQU8sSUFBSSxNQUFNLEtBQUssQ0FBQztBQUV2Qiw0REFBNEQ7QUFDNUQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2QsTUFBTSxFQUFFLEVBQUUsRUFBUTtJQUNsQixXQUFXLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixHQUFHLEVBQUUsRUFBRSxFQUFVO0lBQ2pCLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ1osR0FBRyxFQUFFLEVBQUUsRUFBa0I7SUFDekIsS0FBSyxFQUFFLEVBQUUsRUFBMkI7Q0FDckMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRTFELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUN6QixNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUNuQixNQUFNLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQztJQUVsQixDQUFDLENBQUMsRUFBRSxDQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDdkIsQ0FBQyxDQUNGLENBQUM7SUFFRixDQUFDLENBQUMsRUFBRSxDQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFDdkIsU0FBUyxDQUNWLENBQUM7SUFFRixDQUFDLENBQUMs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Q0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDdkIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDeEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFMUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDbkQsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3hCLE9BQU8sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ2pCLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0NBQ1osQ0FBQyxDQUFDLENBQUM7QUFFSixNQUFNLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQztBQUVoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3hCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2xCLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXJCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDM0IsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFO1FBQ2pDLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTO0tBQ3pCLENBQUMsQ0FBQztJQUVILENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBVSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFN0MsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBaUI7UUFDekMsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU07UUFDbkIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNsQixDQUFDLENBQUM7SUFFSCxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBQ3JCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwQixNQUFNLE9BQU8sR0FBRyxPQUFPLEVBQVUsQ0FBQztJQUVsQyxDQUFDLENBQUMsRUFBRSxDQUNGLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDOUIsQ0FBQyxDQUNGLENBQUM7SUFDRixDQUFDLENBQUMsRUFBRSxDQUNGLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUM5QixTQUFTLENBQ1YsQ0FBQztJQUNGLENBQUMsQ0FBQyxFQUFFLENBQ0YsS0FBSyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUNsQyxDQUFDLENBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBRUgsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLENBQUMsQ0FBQyxFQUFFO0lBR3ZELE1BQU0sR0FBRyxHQUFHLENBQU8sR0FBZ0IsRUFBRSxDQUFjLEVBQUUsRUFBRSxDQUNyRCxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FDWCxHQUFHLEVBQ0gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2YsQ0FBQyxDQUFDLEVBQUUsQ0FBRSxDQUE0QixDQUNuQyxDQUFDO0lBRUosTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUvQyxDQUFDLENBQUMsRUFBRSxDQUNGLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbkMsQ0FBQyxDQUNGLENBQUM7SUFFRixNQUFNLElBQUksR0FBRyxDQUFPLEdBQWdCLEVBQUUsQ0FBd0IsRUFBRSxFQUFFLENBQ2hFLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUNYLEdBQUcsRUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDVCxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBSyxDQUNsQixDQUFDO0lBRUosQ0FBQyxDQUFDLEVBQUUsQ0FDRixLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FDWCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQ3RDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNQLEVBQ0QsR0FBRyxDQUNKLENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQUVILDZCQUE2QjtBQUM3Qix5Q0FBeUM7QUFDekMseUJBQXlCO0FBQ3pCLGtCQUFrQjtBQUNsQiw4QkFBOEI7QUFDOUIsT0FBTztBQUVQLGdEQUFnRDtBQUVoRCx1Q0FBdUM7QUFDdkMsa0NBQWtDO0FBQ2xDLGdCQUFnQjtBQUNoQiw0RUFBNEU7QUFDNUUsNEJBQTRCO0FBQzVCLE1BQU07QUFFTixJQUFJLENBQUMsZ0RBQWdELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDekQsaUVBQWlFO0lBRWpFLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNkLElBQUksRUFBRSxFQUFFLEVBQVc7UUFDbkIsUUFBUSxFQUFFLEVBQUUsRUFBbUI7UUFDL0IsSUFBSSxFQUFFLEVBQUUsRUFBZ0I7UUFDeEIsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7S0FDZixDQUFDLENBQUM7SUFFSCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ3BCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNO1FBQ2xCLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ3JFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDWixRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7S0FDOUQsQ0FBQyxDQUFDO0lBRUgsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzVCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNsQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUVoRCxDQUFDLENBQUMsRUFBRSxDQUNGLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQy9CLE1BQU0sQ0FDUCxDQUFDO0lBRUYsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNWLElBQUksRUFBRSxFQUFFLEVBQW1CO0tBQzVCLENBQUMsQ0FBQyxDQUFDO0lBSUosTUFBTSxLQUFLLEdBQUcsQ0FBSSxHQUFhLEVBQUUsR0FBTSxFQUFFLEVBQUUsQ0FDekMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQ04sR0FBRyxFQUNILENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNOLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FDVixDQUFDO0lBRUosTUFBTSxXQUFXLEdBQUcsR0FBc0IsQ0FBQztJQUUzQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM3QixDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFFSCxJQUFJLENBQUMsOERBQThELEVBQUUsQ0FBQyxDQUFDLEVBQUU7SUFDdkUsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwQixHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNWLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDO1FBQ2QsSUFBSSxFQUFFLEVBQUUsRUFBUTtLQUNqQixDQUFDLENBQUMsQ0FBQztJQUVKLHlCQUF5QjtJQUN6QixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBVyxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQVcsQ0FBQyxDQUFDO0lBRTVDLDZCQUE2QjtJQUM3QixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQVcsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFXLENBQUMsQ0FBQztBQUM3QyxDQUFDLENBQUMsQ0FBQztBQUVILElBQUksQ0FBQyw0Q0FBNEMsRUFBRSxDQUFDLENBQUMsRUFBRTtJQUNyRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbEIsT0FBTyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUM7UUFDakIsTUFBTSxFQUFFLEVBQUUsRUFBVTtRQUNwQixHQUFHLEVBQUUsRUFBRSxFQUFVO0tBQ2xCLENBQUMsQ0FBQztJQUVILE1BQU0sRUFBRSxHQUFHLEtBQUssQ0FBQztRQUNmLGFBQWEsRUFBRSxFQUFFLEVBQVU7UUFDM0IsV0FBVyxFQUFFLEVBQUUsRUFBVTtLQUMxQixDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsR0FBRyxLQUFLLENBQUM7SUFFdkMsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUU7UUFDckMsT0FBTyxFQUFFO1lBQ1AsYUFBYSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztZQUNuQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1NBQ3ZDO1FBRUQsTUFBTSxFQUFFO1lBQ04sV0FBVyxFQUFFLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7U0FDckQ7UUFFRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQyxTQUFTO0tBQ3ZDLENBQUMsQ0FBQztJQUVILE1BQU0sRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDO0lBRTFDLGlCQUFpQjtJQUNqQixDQUFDLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDckUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUMsQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5RCxzQkFBc0I7SUFDdEIsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3ZFLENBQUMsQ0FBQyxDQUFDIn0=