@expressive/mvc 0.71.0 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,85 +1,118 @@
1
- import { addListener, enter } from "../control";
2
- import { event, update } from "../model";
3
- import { use } from "./use";
1
+ import { addListener, event, scope, watch } from "../observable.js";
2
+ import { METHOD, State, access, update } from "../state.js";
3
+ import { use } from "./use.js";
4
+
5
+ //#region src/instruction/set.ts
6
+ const STALE = /* @__PURE__ */ new WeakSet();
4
7
  function set(value, argument) {
5
- return use((key, subject) => {
6
- const property = {};
7
- if (typeof value == "function" || isThenable(value)) {
8
- let init2 = function() {
9
- if (typeof value == "function")
10
- try {
11
- value = attempt(value.bind(subject, key));
12
- } catch (err) {
13
- console.warn(`Generating initial value for ${subject}.${key} failed.`);
14
- throw err;
15
- }
16
- property.get = argument !== false;
17
- const set2 = (value2) => subject[key] = value2;
18
- if (isThenable(value))
19
- value.then(set2, (error) => {
20
- event(subject, key);
21
- property.get = () => {
22
- throw error;
23
- };
24
- });
25
- else
26
- set2(value);
27
- if (argument)
28
- return null;
29
- return subject[key];
30
- };
31
- var init = init2;
32
- if (argument)
33
- addListener(subject, init2, true);
34
- else
35
- property.get = init2;
36
- } else if (value !== void 0)
37
- property.value = value;
38
- if (typeof argument == "function") {
39
- let unset;
40
- property.set = function(value2, previous) {
41
- const exit = enter();
42
- const returns = argument.call(this, value2, previous);
43
- const flush = exit();
44
- if (returns === false)
45
- return false;
46
- if (typeof unset == "function")
47
- unset(value2);
48
- unset = (next) => {
49
- if (typeof returns == "function")
50
- returns(next);
51
- flush();
52
- };
53
- };
54
- } else
55
- property.set = (value2) => {
56
- property.get = void 0;
57
- update(subject, key, value2);
58
- };
59
- return property;
60
- });
8
+ return use((key, subject, state) => {
9
+ if (typeof value == "symbol") throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key}. This is not allowed.`);
10
+ const property = {};
11
+ if (value instanceof State || value === true) {
12
+ let from = subject;
13
+ let getter;
14
+ if (value instanceof State) {
15
+ from = value;
16
+ getter = argument;
17
+ } else {
18
+ const fn = METHOD.get(argument) || argument;
19
+ getter = ((p, k) => fn.call(p, k, p));
20
+ }
21
+ const source = (resolve) => resolve(from);
22
+ let reset;
23
+ let isAsync;
24
+ let proxy;
25
+ function connect(self) {
26
+ reset = watch(self, (current) => {
27
+ proxy = current;
28
+ if (!(key in state) || STALE.delete(compute)) compute(!reset);
29
+ return (didUpdate) => {
30
+ if (didUpdate) {
31
+ STALE.add(compute);
32
+ event(subject, key, true);
33
+ }
34
+ };
35
+ }, false);
36
+ }
37
+ function compute(initial) {
38
+ let next;
39
+ try {
40
+ next = getter.call(proxy, proxy, key);
41
+ } catch (err) {
42
+ console.warn(`An exception was thrown while ${initial ? "initializing" : "refreshing"} ${subject}.${key}.`);
43
+ if (initial) throw err;
44
+ console.error(err);
45
+ }
46
+ update(subject, key, next, !isAsync);
47
+ }
48
+ return () => {
49
+ if (!proxy) {
50
+ source(connect);
51
+ isAsync = true;
52
+ }
53
+ if (STALE.delete(compute)) compute();
54
+ return access(subject, key, !proxy);
55
+ };
56
+ }
57
+ if (typeof value == "function" || value instanceof Promise) {
58
+ function init() {
59
+ if (typeof value == "function") try {
60
+ value = attempt(value.bind(subject, key));
61
+ } catch (err) {
62
+ console.warn(`Generating initial value for ${subject}.${key} failed.`);
63
+ throw err;
64
+ }
65
+ property.get = argument !== false;
66
+ const set = (value) => subject[key] = value;
67
+ if (value instanceof Promise) value.then(set, (error) => {
68
+ event(subject, key);
69
+ property.get = () => {
70
+ throw error;
71
+ };
72
+ });
73
+ else set(value);
74
+ if (argument) return null;
75
+ return subject[key];
76
+ }
77
+ if (argument) addListener(subject, init, true);
78
+ else property.get = init;
79
+ } else if (value !== void 0) property.value = value;
80
+ if (typeof argument == "function") {
81
+ let unset;
82
+ property.set = function(value, previous) {
83
+ const exit = scope();
84
+ const returns = argument.call(this, value, previous);
85
+ const flush = exit();
86
+ if (returns === false) return false;
87
+ if (typeof unset == "function") unset(value);
88
+ unset = (next) => {
89
+ if (typeof returns == "function") returns(next);
90
+ flush();
91
+ };
92
+ };
93
+ } else property.set = (value) => {
94
+ property.get = void 0;
95
+ update(subject, key, value);
96
+ };
97
+ return property;
98
+ });
61
99
  }
62
100
  function attempt(fn) {
63
- function retry(err) {
64
- if (err instanceof Promise)
65
- return err.then(compute);
66
- else
67
- throw err;
68
- }
69
- function compute() {
70
- try {
71
- const output = fn();
72
- return output instanceof Promise ? output.catch(retry) : output;
73
- } catch (err) {
74
- return retry(err);
75
- }
76
- }
77
- return compute();
101
+ function retry(err) {
102
+ if (err instanceof Promise) return err.then(compute);
103
+ else throw err;
104
+ }
105
+ function compute() {
106
+ try {
107
+ const output = fn();
108
+ return output instanceof Promise ? output.catch(retry) : output;
109
+ } catch (err) {
110
+ return retry(err);
111
+ }
112
+ }
113
+ return compute();
78
114
  }
79
- function isThenable(value) {
80
- return value && typeof value == "object" && typeof value.then == "function";
81
- }
82
- export {
83
- set
84
- };
85
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3NldC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgYWRkTGlzdGVuZXIsIGVudGVyIH0gZnJvbSAnLi4vY29udHJvbCc7XG5pbXBvcnQgeyBNb2RlbCwgZXZlbnQsIHVwZGF0ZSB9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7IHVzZSB9IGZyb20gJy4vdXNlJztcblxuZGVjbGFyZSBuYW1lc3BhY2Ugc2V0IHtcbiAgdHlwZSBDYWxsYmFjazxULCBTID0gYW55PiA9ICh0aGlzOiBTLCBuZXh0OiBULCBwcmV2aW91czogVCkgPT5cbiAgICAoKG5leHQ6IFQpID0+IHZvaWQpIHwgUHJvbWlzZTxhbnk+IHwgdm9pZCB8IGJvb2xlYW47XG5cbiAgdHlwZSBGYWN0b3J5PFQsIFMgPSBhbnk+ID0gKHRoaXM6IFMsIGtleTogc3RyaW5nKSA9PiBUaGVuYWJsZTxUPiB8IFQ7XG5cbiAgdHlwZSBUaGVuYWJsZTxUPiA9IHtcbiAgICB0aGVuOiAob25GdWxmaWxsZWQ/OiAodmFsdWU6IFQpID0+IGFueSwgb25SZWplY3RlZD86IChyZWFzb246IGFueSkgPT4gYW55KSA9PiBhbnk7XG4gIH07XG59XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IGFzIGB1bmRlZmluZWRgIGJ1dCByZXF1aXJlZC5cbiAqIFxuICogUHJvcGVydHkgY2Fubm90IGJlIGFjY2Vzc2VkIHVudGlsIGl0IGlzIGRlZmluZWQuIElmIGFjY2Vzc2VkIHdoaWxlIHVuZGVmaW5lZCwgYSBoeWJyaWRcbiAqIGBQcm9taXNlYC9gRXJyb3JgIChha2E6IFtTdXNwZW5zZV0oaHR0cHM6Ly9yZWFjdGpzLm9yZy9kb2NzL2NvbmN1cnJlbnQtbW9kZS1zdXNwZW5zZS5odG1sKSkgd2lsbCBiZSB0aHJvd24uXG4gKi9cbmZ1bmN0aW9uIHNldCA8VCA9IGFueT4oKTogVDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKiBcbiAqICoqTm90ZSoqIEZhY3RvcnkgaXMgbGF6eSEgSXQgd2lsbCBvbmx5IHJ1biBpZi93aGVuIHByb3BlcnR5IGlzIGFjY2Vzc2VkLlxuICogVmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgdW50aWwgZmFjdG9yeSByZXNvbHZlcywgd2hpY2ggd2lsbCBhbHNvIGRpc3BhdGNoIGFuIHVwZGF0ZSBmb3IgdGhlIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBzZXQgPFQ+IChmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiB8IHNldC5UaGVuYWJsZTxUPiwgcmVxdWlyZWQ6IGZhbHNlKTogVCB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKlxuICogSWYgYXN5bmMsIHByb3BlcnR5IGNhbm5vdCBiZSBhY2Nlc3NlZCB1bnRpbCByZXNvbHZlcywgeWVpbGRpbmcgYSByZXN1bHQuXG4gKiBJZiBhY2Nlc3NlZCB3aGlsZSBzdGlsbCBwcm9jZXNzaW5nLCBSZWFjdCBTdXNwZW5zZSB3aWxsIGJlIHRocm93bi5cbiAqXG4gKiBAcGFyYW0gZmFjdG9yeSAtIENhbGxiYWNrIHJ1biB0byBkZXJyaXZlIHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIHJlcXVpcmVkIC0gSWYgdHJ1ZSBydW4gZmFjdG9yeSBpbW1lZGlhdGVseSBvbiBjcmVhdGlvbiwgb3RoZXJ3aXNlIG9uIGFjY2Vzcy5cbiAqL1xuZnVuY3Rpb24gc2V0IDxUPiAoZmFjdG9yeTogc2V0LkZhY3Rvcnk8VD4gfCBzZXQuVGhlbmFibGU8VD4sIHJlcXVpcmVkPzogYm9vbGVhbik6IFQ7XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IHdpdGggYSBmYWN0b3J5IGZ1bmN0aW9uLlxuICpcbiAqIElmIGFzeW5jLCBwcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgdW50aWwgcmVzb2x2ZXMsIHllaWxkaW5nIGEgcmVzdWx0LlxuICogSWYgYWNjZXNzZWQgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZywgUmVhY3QgU3VzcGVuc2Ugd2lsbCBiZSB0aHJvd24uXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgLSBDYWxsYmFjayBydW4gdG8gZGVycml2ZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSBvblVwZGF0ZSAtIENhbGxiYWNrIHJ1biB3aGVuIHByb3BlcnR5IGlzIGZpbmlzaGVkIGNvbXB1dGluZyBvciBpcyBzZXQuIFxuICovXG5mdW5jdGlvbiBzZXQgPFQ+IChmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiB8IHNldC5UaGVuYWJsZTxUPiwgb25VcGRhdGU/OiBzZXQuQ2FsbGJhY2s8VD4pOiBUO1xuXG4vKipcbiAqIFNldCBhIHByb3BlcnR5IHdpdGggZW1wdHkgcGxhY2Vob2xkZXIgYW5kL29yIHVwZGF0ZSBjYWxsYmFjay5cbiAqIFxuICogQHBhcmFtIHZhbHVlIC0gU3RhcnRpbmcgdmFsdWUgZm9yIHByb3BlcnR5LiBJZiB1bmRlZmluZWQsIHN1c3BlbnNlIHdpbGwgYmUgdGhyb3duIG9uIGFjY2VzcywgdW50aWwgdmFsdWUgaXMgc2V0IGFuZCBhY2NlcHRlZCBieSBjYWxsYmFjay5cbiAqIEBwYXJhbSBvblVwZGF0ZSAtIENhbGxiYWNrIHJ1biB3aGVuIHByb3BlcnR5IGlzIHNldC4gSWYgcmV0dXJucyBmYWxzZSwgdXBkYXRlIGlzIG5vdCBhY2NlcHRlZCBhbmQgcHJvcGVydHkgd2lsbCBrZWVwIHByZXZpb3VzIHZhbHVlLlxuICovXG5mdW5jdGlvbiBzZXQgPFQ+ICh2YWx1ZTogVCB8IHVuZGVmaW5lZCwgb25VcGRhdGU/OiBzZXQuQ2FsbGJhY2s8VD4pOiBUO1xuXG5mdW5jdGlvbiBzZXQgPFQ+IChcbiAgdmFsdWU/OiBzZXQuRmFjdG9yeTxUPiB8IHNldC5UaGVuYWJsZTxUPiB8IFQsXG4gIGFyZ3VtZW50Pzogc2V0LkNhbGxiYWNrPGFueT4gfCBib29sZWFuKXtcblxuICByZXR1cm4gdXNlPFQ+KChrZXksIHN1YmplY3QpID0+IHtcbiAgICBjb25zdCBwcm9wZXJ0eTogTW9kZWwuRGVzY3JpcHRvciA9IHt9O1xuXG4gICAgaWYodHlwZW9mIHZhbHVlID09IFwiZnVuY3Rpb25cIiB8fCBpc1RoZW5hYmxlKHZhbHVlKSl7XG4gICAgICBmdW5jdGlvbiBpbml0KCl7XG4gICAgICAgIGlmKHR5cGVvZiB2YWx1ZSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhbHVlID0gYXR0ZW1wdCh2YWx1ZS5iaW5kKHN1YmplY3QsIGtleSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXRjaChlcnIpe1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBHZW5lcmF0aW5nIGluaXRpYWwgdmFsdWUgZm9yICR7c3ViamVjdH0uJHtrZXl9IGZhaWxlZC5gKTtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgcHJvcGVydHkuZ2V0ID0gYXJndW1lbnQgIT09IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHNldCA9ICh2YWx1ZTogYW55KSA9PiBzdWJqZWN0W2tleV0gPSB2YWx1ZTtcblxuICAgICAgICBpZihpc1RoZW5hYmxlKHZhbHVlKSlcbiAgICAgICAgICB2YWx1ZS50aGVuKHNldCwgZXJyb3IgPT4ge1xuICAgICAgICAgICAgZXZlbnQoc3ViamVjdCwga2V5KTtcbiAgICAgICAgICAgIHByb3BlcnR5LmdldCA9ICgpID0+IHsgdGhyb3cgZXJyb3IgfTtcbiAgICAgICAgICB9KVxuICAgICAgICBlbHNlXG4gICAgICAgICAgc2V0KHZhbHVlKTtcblxuICAgICAgICBpZihhcmd1bWVudClcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBzdWJqZWN0W2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmKGFyZ3VtZW50KVxuICAgICAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBpbml0LCB0cnVlKTtcbiAgICAgIGVsc2VcbiAgICAgICAgcHJvcGVydHkuZ2V0ID0gaW5pdDtcbiAgICB9XG4gICAgZWxzZSBpZih2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgICAgcHJvcGVydHkudmFsdWUgPSB2YWx1ZTtcblxuICAgIGlmKHR5cGVvZiBhcmd1bWVudCA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgbGV0IHVuc2V0OiAoKG5leHQ6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gICAgICBwcm9wZXJ0eS5zZXQgPSBmdW5jdGlvbih0aGlzOiBhbnksIHZhbHVlOiBhbnksIHByZXZpb3VzOiBhbnkpe1xuICAgICAgICBjb25zdCBleGl0ID0gZW50ZXIoKTtcbiAgICAgICAgY29uc3QgcmV0dXJucyA9IGFyZ3VtZW50LmNhbGwodGhpcywgdmFsdWUsIHByZXZpb3VzKTtcbiAgICAgICAgY29uc3QgZmx1c2ggPSBleGl0KCk7XG5cbiAgICAgICAgaWYocmV0dXJucyA9PT0gZmFsc2UpXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIGlmKHR5cGVvZiB1bnNldCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgdW5zZXQodmFsdWUpO1xuXG4gICAgICAgIHVuc2V0ID0gKG5leHQ6IFQpID0+IHtcbiAgICAgICAgICBpZih0eXBlb2YgcmV0dXJucyA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICByZXR1cm5zKG5leHQpO1xuXG4gICAgICAgICAgZmx1c2goKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBlbHNlXG4gICAgICBwcm9wZXJ0eS5zZXQgPSB2YWx1ZSA9PiB7XG4gICAgICAgIHByb3BlcnR5LmdldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdXBkYXRlKHN1YmplY3QsIGtleSwgdmFsdWUpO1xuICAgICAgfVxuXG4gICAgcmV0dXJuIHByb3BlcnR5O1xuICB9KVxufVxuXG5mdW5jdGlvbiBhdHRlbXB0KGZuOiAoKSA9PiBhbnkpOiBhbnkge1xuICBmdW5jdGlvbiByZXRyeShlcnI6IHVua25vd24pe1xuICAgIGlmKGVyciBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICByZXR1cm4gZXJyLnRoZW4oY29tcHV0ZSk7XG4gICAgZWxzZVxuICAgICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgZnVuY3Rpb24gY29tcHV0ZSgpOiBhbnkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBvdXRwdXQgPSBmbigpO1xuXG4gICAgICByZXR1cm4gb3V0cHV0IGluc3RhbmNlb2YgUHJvbWlzZVxuICAgICAgICA/IG91dHB1dC5jYXRjaChyZXRyeSlcbiAgICAgICAgOiBvdXRwdXQ7XG4gICAgfVxuICAgIGNhdGNoKGVycil7XG4gICAgICByZXR1cm4gcmV0cnkoZXJyKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29tcHV0ZSgpO1xufVxuXG5mdW5jdGlvbiBpc1RoZW5hYmxlKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzZXQuVGhlbmFibGU8YW55PiB7XG4gIHJldHVybiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PSBcImZ1bmN0aW9uXCI7XG59XG5cbmV4cG9ydCB7IHNldCB9Il0sCiAgIm1hcHBpbmdzIjogIkFBQUEsU0FBUyxhQUFhLGFBQWE7QUFDbkMsU0FBZ0IsT0FBTyxjQUFjO0FBQ3JDLFNBQVMsV0FBVztBQTJEcEIsU0FBUyxJQUNQLE9BQ0EsVUFBdUM7QUFFdkMsU0FBTyxJQUFPLENBQUMsS0FBSyxZQUFZO0FBQzlCLFVBQU0sV0FBNkIsQ0FBQztBQUVwQyxRQUFHLE9BQU8sU0FBUyxjQUFjLFdBQVcsS0FBSyxHQUFFO0FBQ2pELFVBQVNBLFFBQVQsV0FBZTtBQUNiLFlBQUcsT0FBTyxTQUFTO0FBQ2pCLGNBQUk7QUFDRixvQkFBUSxRQUFRLE1BQU0sS0FBSyxTQUFTLEdBQUcsQ0FBQztBQUFBLFVBQzFDLFNBQ00sS0FBSTtBQUNSLG9CQUFRLEtBQUssZ0NBQWdDLE9BQU8sSUFBSSxHQUFHLFVBQVU7QUFDckUsa0JBQU07QUFBQSxVQUNSO0FBRUYsaUJBQVMsTUFBTSxhQUFhO0FBRTVCLGNBQU1DLE9BQU0sQ0FBQ0MsV0FBZSxRQUFRLEdBQUcsSUFBSUE7QUFFM0MsWUFBRyxXQUFXLEtBQUs7QUFDakIsZ0JBQU0sS0FBS0QsTUFBSyxXQUFTO0FBQ3ZCLGtCQUFNLFNBQVMsR0FBRztBQUNsQixxQkFBUyxNQUFNLE1BQU07QUFBRSxvQkFBTTtBQUFBLFlBQU07QUFBQSxVQUNyQyxDQUFDO0FBQUE7QUFFRCxVQUFBQSxLQUFJLEtBQUs7QUFFWCxZQUFHO0FBQ0QsaUJBQU87QUFFVCxlQUFPLFFBQVEsR0FBRztBQUFBLE1BQ3BCO0FBMUJTLGlCQUFBRDtBQTRCVCxVQUFHO0FBQ0Qsb0JBQVksU0FBU0EsT0FBTSxJQUFJO0FBQUE7QUFFL0IsaUJBQVMsTUFBTUE7QUFBQSxJQUNuQixXQUNRLFVBQVU7QUFDaEIsZUFBUyxRQUFRO0FBRW5CLFFBQUcsT0FBTyxZQUFZLFlBQVc7QUFDL0IsVUFBSTtBQUVKLGVBQVMsTUFBTSxTQUFvQkUsUUFBWSxVQUFjO0FBQzNELGNBQU0sT0FBTyxNQUFNO0FBQ25CLGNBQU0sVUFBVSxTQUFTLEtBQUssTUFBTUEsUUFBTyxRQUFRO0FBQ25ELGNBQU0sUUFBUSxLQUFLO0FBRW5CLFlBQUcsWUFBWTtBQUNiLGlCQUFPO0FBRVQsWUFBRyxPQUFPLFNBQVM7QUFDakIsZ0JBQU1BLE1BQUs7QUFFYixnQkFBUSxDQUFDLFNBQVk7QUFDbkIsY0FBRyxPQUFPLFdBQVc7QUFDbkIsb0JBQVEsSUFBSTtBQUVkLGdCQUFNO0FBQUEsUUFDUjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBRUUsZUFBUyxNQUFNLENBQUFBLFdBQVM7QUFDdEIsaUJBQVMsTUFBTTtBQUNmLGVBQU8sU0FBUyxLQUFLQSxNQUFLO0FBQUEsTUFDNUI7QUFFRixXQUFPO0FBQUEsRUFDVCxDQUFDO0FBQ0g7QUFFQSxTQUFTLFFBQVEsSUFBb0I7QUFDbkMsV0FBUyxNQUFNLEtBQWE7QUFDMUIsUUFBRyxlQUFlO0FBQ2hCLGFBQU8sSUFBSSxLQUFLLE9BQU87QUFBQTtBQUV2QixZQUFNO0FBQUEsRUFDVjtBQUVBLFdBQVMsVUFBZTtBQUN0QixRQUFJO0FBQ0YsWUFBTSxTQUFTLEdBQUc7QUFFbEIsYUFBTyxrQkFBa0IsVUFDckIsT0FBTyxNQUFNLEtBQUssSUFDbEI7QUFBQSxJQUNOLFNBQ00sS0FBSTtBQUNSLGFBQU8sTUFBTSxHQUFHO0FBQUEsSUFDbEI7QUFBQSxFQUNGO0FBRUEsU0FBTyxRQUFRO0FBQ2pCO0FBRUEsU0FBUyxXQUFXLE9BQXdDO0FBQzFELFNBQU8sU0FBUyxPQUFPLFNBQVMsWUFBWSxPQUFPLE1BQU0sUUFBUTtBQUNuRTsiLAogICJuYW1lcyI6IFsiaW5pdCIsICJzZXQiLCAidmFsdWUiXQp9Cg==
115
+
116
+ //#endregion
117
+ export { set };
118
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0LmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnN0cnVjdGlvbi9zZXQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWRkTGlzdGVuZXIsIHNjb3BlLCB3YXRjaCB9IGZyb20gJy4uL29ic2VydmFibGUnO1xuaW1wb3J0IHsgYWNjZXNzLCBldmVudCwgTUVUSE9ELCBTdGF0ZSwgdXBkYXRlIH0gZnJvbSAnLi4vc3RhdGUnO1xuaW1wb3J0IHsgSW5zdHJ1Y3Rpb24sIHVzZSB9IGZyb20gJy4vdXNlJztcblxuY29uc3QgU1RBTEUgPSBuZXcgV2Vha1NldDwoKSA9PiB2b2lkPigpO1xuXG5kZWNsYXJlIG5hbWVzcGFjZSBzZXQge1xuICB0eXBlIENhbGxiYWNrPFQsIFMgPSBhbnk+ID0gKFxuICAgIHRoaXM6IFMsXG4gICAgbmV4dDogVCxcbiAgICBwcmV2aW91czogVFxuICApID0+ICgobmV4dDogVCkgPT4gdm9pZCkgfCBQcm9taXNlPGFueT4gfCB2b2lkIHwgYm9vbGVhbjtcblxuICB0eXBlIENvbXB1dGU8VCwgUyA9IGFueT4gPSAob246IFMsIGtleTogc3RyaW5nKSA9PiBUO1xuXG4gIHR5cGUgRmFjdG9yeTxULCBTID0gYW55PiA9ICh0aGlzOiBTLCBrZXk6IHN0cmluZykgPT4gUHJvbWlzZTxUPiB8IFQ7XG59XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IGFzIGB1bmRlZmluZWRgIGJ1dCByZXF1aXJlZC5cbiAqXG4gKiBQcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgdW50aWwgaXQgaXMgZGVmaW5lZC4gSWYgYWNjZXNzZWQgd2hpbGUgdW5kZWZpbmVkLCBhIGh5YnJpZFxuICogYFByb21pc2VgL2BFcnJvcmAgKGFrYTogW1N1c3BlbnNlXShodHRwczovL3JlYWN0anMub3JnL2RvY3MvY29uY3VycmVudC1tb2RlLXN1c3BlbnNlLmh0bWwpKSB3aWxsIGJlIHRocm93bi5cbiAqL1xuZnVuY3Rpb24gc2V0PFQgPSBhbnk+KCk6IFQ7XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IHdpdGggYSBmYWN0b3J5IGZ1bmN0aW9uLlxuICpcbiAqICoqTm90ZSoqIEZhY3RvcnkgaXMgbGF6eSEgSXQgd2lsbCBvbmx5IHJ1biBpZi93aGVuIHByb3BlcnR5IGlzIGFjY2Vzc2VkLlxuICogVmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgdW50aWwgZmFjdG9yeSByZXNvbHZlcywgd2hpY2ggd2lsbCBhbHNvIGRpc3BhdGNoIGFuIHVwZGF0ZSBmb3IgdGhlIHByb3BlcnR5LlxuICovXG5mdW5jdGlvbiBzZXQ8VD4oZmFjdG9yeTogc2V0LkZhY3Rvcnk8VD4sIHJlcXVpcmVkOiBmYWxzZSk6IFQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogU2V0IHByb3BlcnR5IHdpdGggYSBmYWN0b3J5IGZ1bmN0aW9uLlxuICpcbiAqIElmIGFzeW5jLCBwcm9wZXJ0eSBjYW5ub3QgYmUgYWNjZXNzZWQgdW50aWwgcmVzb2x2ZXMsIHllaWxkaW5nIGEgcmVzdWx0LlxuICogSWYgYWNjZXNzZWQgd2hpbGUgc3RpbGwgcHJvY2Vzc2luZywgUmVhY3QgU3VzcGVuc2Ugd2lsbCBiZSB0aHJvd24uXG4gKlxuICogQHBhcmFtIGZhY3RvcnkgLSBDYWxsYmFjayBydW4gdG8gZGVycml2ZSBwcm9wZXJ0eSB2YWx1ZS5cbiAqIEBwYXJhbSByZXF1aXJlZCAtIElmIHRydWUgcnVuIGZhY3RvcnkgaW1tZWRpYXRlbHkgb24gY3JlYXRpb24sIG90aGVyd2lzZSBvbiBhY2Nlc3MuXG4gKi9cbmZ1bmN0aW9uIHNldDxUPihmYWN0b3J5OiBzZXQuRmFjdG9yeTxUPiwgcmVxdWlyZWQ/OiBib29sZWFuKTogVDtcblxuLyoqXG4gKiBTZXQgcHJvcGVydHkgd2l0aCBhIGZhY3RvcnkgZnVuY3Rpb24uXG4gKlxuICogSWYgYXN5bmMsIHByb3BlcnR5IGNhbm5vdCBiZSBhY2Nlc3NlZCB1bnRpbCByZXNvbHZlcywgeWVpbGRpbmcgYSByZXN1bHQuXG4gKiBJZiBhY2Nlc3NlZCB3aGlsZSBzdGlsbCBwcm9jZXNzaW5nLCBSZWFjdCBTdXNwZW5zZSB3aWxsIGJlIHRocm93bi5cbiAqXG4gKiBAcGFyYW0gZmFjdG9yeSAtIENhbGxiYWNrIHJ1biB0byBkZXJyaXZlIHByb3BlcnR5IHZhbHVlLlxuICogQHBhcmFtIG9uVXBkYXRlIC0gQ2FsbGJhY2sgcnVuIHdoZW4gcHJvcGVydHkgaXMgZmluaXNoZWQgY29tcHV0aW5nIG9yIGlzIHNldC5cbiAqL1xuZnVuY3Rpb24gc2V0PFQ+KGZhY3Rvcnk6IHNldC5GYWN0b3J5PFQ+LCBvblVwZGF0ZT86IHNldC5DYWxsYmFjazxUPik6IFQ7XG5cbi8qKlxuICogU2V0IGEgcHJvcGVydHkgd2l0aCBlbXB0eSBwbGFjZWhvbGRlciBhbmQvb3IgdXBkYXRlIGNhbGxiYWNrLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFN0YXJ0aW5nIHZhbHVlIGZvciBwcm9wZXJ0eS4gSWYgdW5kZWZpbmVkLCBzdXNwZW5zZSB3aWxsIGJlIHRocm93biBvbiBhY2Nlc3MsIHVudGlsIHZhbHVlIGlzIHNldCBhbmQgYWNjZXB0ZWQgYnkgY2FsbGJhY2suXG4gKiBAcGFyYW0gb25VcGRhdGUgLSBDYWxsYmFjayBydW4gd2hlbiBwcm9wZXJ0eSBpcyBzZXQuIElmIHJldHVybnMgZmFsc2UsIHVwZGF0ZSBpcyBub3QgYWNjZXB0ZWQgYW5kIHByb3BlcnR5IHdpbGwga2VlcCBwcmV2aW91cyB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gc2V0PFQ+KHZhbHVlOiBUIHwgdW5kZWZpbmVkLCBvblVwZGF0ZT86IHNldC5DYWxsYmFjazxUPik6IFQ7XG5cbi8qKlxuICogSW1wbGVtZW50IGEgcmVhY3RpdmUgY29tcHV0ZWQgdmFsdWUgdXNpbmcgYSBtZXRob2QgcmVmZXJlbmNlLlxuICpcbiAqIFRoZSBtZXRob2Qgd2lsbCBhdXRvbWF0aWNhbGx5IHJlLXJ1biB3aGVuIGFueSBhY2Nlc3NlZCBwcm9wZXJ0aWVzIGNoYW5nZS5cbiAqIFVzZSBgdHJ1ZWAgdG8gaW5kaWNhdGUgcmVhY3RpdmUgbW9kZSB3aXRoIGltcGxpY2l0IGB0aGlzYCBhcyB0aGUgc291cmNlLlxuICpcbiAqIEBwYXJhbSByZWFjdGl2ZVRvVGhpcyAtIFBhc3MgYHRydWVgIHRvIGVuYWJsZSByZWFjdGl2ZSBtb2RlIHdpdGggaW1wbGljaXQgdGhpc1xuICogQHBhcmFtIG1ldGhvZCAtIE1ldGhvZCByZWZlcmVuY2Ugb3IgY29tcHV0ZSBmdW5jdGlvbiB0byB1c2VcbiAqL1xuZnVuY3Rpb24gc2V0PFIsIFQgPSBhbnk+KFxuICByZWFjdGl2ZVRvVGhpczogdHJ1ZSxcbiAgbWV0aG9kOiBzZXQuQ29tcHV0ZTxSLCBUPiB8IEZ1bmN0aW9uXG4pOiBSO1xuXG4vKipcbiAqIEltcGxlbWVudCBhIGNvbXB1dGVkIHZhbHVlOyBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQgYnkgcHJvdmlkZWQgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHJlYWN0aXZlVG8gLSBTb3VyY2Ugc3RhdGUgZnJvbSB3aGljaCBjb21wdXRlZCB2YWx1ZSB3aWxsIGJlIGEgc3Vic2NyaWJlci5cbiAqIEBwYXJhbSBjb21wdXRlIC0gQ29tcHV0ZSBmdW5jdGlvbi4gQm91bmQgdG8gYSBzdWJzY3JpYmVyLXByb3h5IG9mIHNvdXJjZSwgcmV0dXJucyBvdXRwdXQgdmFsdWUuIFdpbGwgdXBkYXRlIGF1dG9tYXRpY2FsbHkgYXMgaW5wdXQgdmFsdWVzIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gc2V0PFIsIFQgZXh0ZW5kcyBTdGF0ZT4ocmVhY3RpdmVUbzogVCwgY29tcHV0ZTogc2V0LkNvbXB1dGU8UiwgVD4pOiBSO1xuXG5mdW5jdGlvbiBzZXQ8VCA9IGFueT4odmFsdWU/OiB1bmtub3duLCBhcmd1bWVudD86IHVua25vd24pOiBhbnkge1xuICByZXR1cm4gdXNlPFQ+KChrZXksIHN1YmplY3QsIHN0YXRlKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEF0dGVtcHRlZCB0byB1c2UgYW4gaW5zdHJ1Y3Rpb24gcmVzdWx0IChwcm9iYWJseSB1c2Ugb3IgZ2V0KSBhcyBjb21wdXRlZCBzb3VyY2UgZm9yICR7c3ViamVjdH0uJHtrZXl9LiBUaGlzIGlzIG5vdCBhbGxvd2VkLmBcbiAgICAgICk7XG5cbiAgICBjb25zdCBwcm9wZXJ0eTogSW5zdHJ1Y3Rpb24uRGVzY3JpcHRvciA9IHt9O1xuXG4gICAgLy8gSGFuZGxlIHJlYWN0aXZlIGNvbXB1dGUgbW9kZXNcbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdGF0ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSkge1xuICAgICAgbGV0IGZyb20gPSBzdWJqZWN0O1xuICAgICAgbGV0IGdldHRlcjogc2V0LkNvbXB1dGU8VCwgYW55PjtcblxuICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RhdGUpIHtcbiAgICAgICAgZnJvbSA9IHZhbHVlO1xuICAgICAgICBnZXR0ZXIgPSBhcmd1bWVudCBhcyBzZXQuQ29tcHV0ZTxULCBhbnk+O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdmFsdWUgPT09IHRydWUsIGltcGxpY2l0IHRoaXMgd2l0aCBtZXRob2QgcmVmZXJlbmNlXG4gICAgICAgIGNvbnN0IGZuID0gTUVUSE9ELmdldChhcmd1bWVudCkgfHwgYXJndW1lbnQ7XG4gICAgICAgIGdldHRlciA9ICgocCwgaykgPT4gZm4uY2FsbChwLCBrLCBwKSkgYXMgc2V0LkNvbXB1dGU8VCwgYW55PjtcbiAgICAgIH1cblxuICAgICAgdHlwZSBTb3VyY2U8VCBleHRlbmRzIFN0YXRlID0gU3RhdGU+ID0gKHJlc29sdmU6ICh4OiBUKSA9PiB2b2lkKSA9PiB2b2lkO1xuICAgICAgY29uc3Qgc291cmNlOiBTb3VyY2UgPSAocmVzb2x2ZSkgPT4gcmVzb2x2ZShmcm9tKTtcblxuICAgICAgbGV0IHJlc2V0OiAoKCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgaXNBc3luYzogYm9vbGVhbjtcbiAgICAgIGxldCBwcm94eTogYW55O1xuXG4gICAgICBmdW5jdGlvbiBjb25uZWN0KHNlbGY6IFN0YXRlKSB7XG4gICAgICAgIHJlc2V0ID0gd2F0Y2goXG4gICAgICAgICAgc2VsZixcbiAgICAgICAgICAoY3VycmVudCkgPT4ge1xuICAgICAgICAgICAgcHJveHkgPSBjdXJyZW50O1xuXG4gICAgICAgICAgICBpZiAoIShrZXkgaW4gc3RhdGUpIHx8IFNUQUxFLmRlbGV0ZShjb21wdXRlKSkgY29tcHV0ZSghcmVzZXQpO1xuXG4gICAgICAgICAgICByZXR1cm4gKGRpZFVwZGF0ZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoZGlkVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgU1RBTEUuYWRkKGNvbXB1dGUpO1xuICAgICAgICAgICAgICAgIGV2ZW50KHN1YmplY3QsIGtleSwgdHJ1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWxzZVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmdW5jdGlvbiBjb21wdXRlKGluaXRpYWw/OiBib29sZWFuKSB7XG4gICAgICAgIGxldCBuZXh0OiBUIHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgbmV4dCA9IGdldHRlci5jYWxsKHByb3h5LCBwcm94eSwga2V5KTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYEFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoaWxlICR7XG4gICAgICAgICAgICAgIGluaXRpYWwgPyAnaW5pdGlhbGl6aW5nJyA6ICdyZWZyZXNoaW5nJ1xuICAgICAgICAgICAgfSAke3N1YmplY3R9LiR7a2V5fS5gXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpbml0aWFsKSB0aHJvdyBlcnI7XG5cbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cblxuICAgICAgICB1cGRhdGUoc3ViamVjdCwga2V5LCBuZXh0LCAhaXNBc3luYyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIGlmICghcHJveHkpIHtcbiAgICAgICAgICBzb3VyY2UoY29ubmVjdCk7XG4gICAgICAgICAgaXNBc3luYyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoU1RBTEUuZGVsZXRlKGNvbXB1dGUpKSBjb21wdXRlKCk7XG5cbiAgICAgICAgcmV0dXJuIGFjY2VzcyhzdWJqZWN0LCBrZXksICFwcm94eSkgYXMgVDtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGZhY3RvcnkvdmFsdWUgbW9kZXMgKGV4aXN0aW5nIGxvZ2ljKVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJylcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsdWUgPSBhdHRlbXB0KHZhbHVlLmJpbmQoc3ViamVjdCwga2V5KSk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBHZW5lcmF0aW5nIGluaXRpYWwgdmFsdWUgZm9yICR7c3ViamVjdH0uJHtrZXl9IGZhaWxlZC5gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cblxuICAgICAgICBwcm9wZXJ0eS5nZXQgPSBhcmd1bWVudCAhPT0gZmFsc2U7XG5cbiAgICAgICAgY29uc3Qgc2V0ID0gKHZhbHVlOiBhbnkpID0+IChzdWJqZWN0W2tleV0gPSB2YWx1ZSk7XG5cbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgICB2YWx1ZS50aGVuKHNldCwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBldmVudChzdWJqZWN0LCBrZXkpO1xuICAgICAgICAgICAgcHJvcGVydHkuZ2V0ID0gKCkgPT4ge1xuICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIGVsc2Ugc2V0KHZhbHVlKTtcblxuICAgICAgICBpZiAoYXJndW1lbnQpIHJldHVybiBudWxsO1xuXG4gICAgICAgIHJldHVybiBzdWJqZWN0W2tleV07XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmd1bWVudCkge1xuICAgICAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBpbml0LCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHByb3BlcnR5LmdldCA9IGluaXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wZXJ0eS52YWx1ZSA9IHZhbHVlO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgYXJndW1lbnQgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbGV0IHVuc2V0OiAoKG5leHQ6IFQpID0+IHZvaWQpIHwgdW5kZWZpbmVkO1xuXG4gICAgICBwcm9wZXJ0eS5zZXQgPSBmdW5jdGlvbiAodGhpczogYW55LCB2YWx1ZTogYW55LCBwcmV2aW91czogYW55KSB7XG4gICAgICAgIGNvbnN0IGV4aXQgPSBzY29wZSgpO1xuICAgICAgICBjb25zdCByZXR1cm5zID0gYXJndW1lbnQuY2FsbCh0aGlzLCB2YWx1ZSwgcHJldmlvdXMpO1xuICAgICAgICBjb25zdCBmbHVzaCA9IGV4aXQoKTtcblxuICAgICAgICBpZiAocmV0dXJucyA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBpZiAodHlwZW9mIHVuc2V0ID09ICdmdW5jdGlvbicpIHVuc2V0KHZhbHVlKTtcblxuICAgICAgICB1bnNldCA9IChuZXh0OiBUKSA9PiB7XG4gICAgICAgICAgaWYgKHR5cGVvZiByZXR1cm5zID09ICdmdW5jdGlvbicpIHJldHVybnMobmV4dCk7XG5cbiAgICAgICAgICBmbHVzaCgpO1xuICAgICAgICB9O1xuICAgICAgfTtcbiAgICB9IGVsc2VcbiAgICAgIHByb3BlcnR5LnNldCA9ICh2YWx1ZSkgPT4ge1xuICAgICAgICBwcm9wZXJ0eS5nZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIHZhbHVlKTtcbiAgICAgIH07XG5cbiAgICByZXR1cm4gcHJvcGVydHk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhdHRlbXB0KGZuOiAoKSA9PiBhbnkpOiBhbnkge1xuICAvLyBJZ25vcmUgVFM4MDAwNjogRnVuY3Rpb24gbXVzdCBiZSBzeW5jaHJvbm91cy5cbiAgZnVuY3Rpb24gcmV0cnkoZXJyOiB1bmtub3duKSB7XG4gICAgaWYgKGVyciBpbnN0YW5jZW9mIFByb21pc2UpIHJldHVybiBlcnIudGhlbihjb21wdXRlKTtcbiAgICBlbHNlIHRocm93IGVycjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbXB1dGUoKTogYW55IHtcbiAgICB0cnkge1xuICAgICAgY29uc3Qgb3V0cHV0ID0gZm4oKTtcblxuICAgICAgcmV0dXJuIG91dHB1dCBpbnN0YW5jZW9mIFByb21pc2UgPyBvdXRwdXQuY2F0Y2gocmV0cnkpIDogb3V0cHV0O1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmV0dXJuIHJldHJ5KGVycik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGUoKTtcbn1cblxuZXhwb3J0IHsgc2V0IH07XG4iXSwibWFwcGluZ3MiOiI7Ozs7O0FBSUEsTUFBTSx3QkFBUSxJQUFJLFNBQXFCO0FBa0Z2QyxTQUFTLElBQWEsT0FBaUIsVUFBeUI7QUFDOUQsUUFBTyxLQUFRLEtBQUssU0FBUyxVQUFVO0FBQ3JDLE1BQUksT0FBTyxTQUFTLFNBQ2xCLE9BQU0sSUFBSSxNQUNSLHVGQUF1RixRQUFRLEdBQUcsSUFBSSx3QkFDdkc7RUFFSCxNQUFNLFdBQW1DLEVB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
@@ -0,0 +1,23 @@
1
+ import { State } from "../state.js";
2
+
3
+ //#region src/instruction/use.d.ts
4
+ /**
5
+ * Property initializer, will run upon instance creation.
6
+ * Optional returned callback will run when once upon first access.
7
+ */
8
+ type Instruction<T = any, M extends State = any> = (this: M, key: Extract<State.Field<M>, string>, thisArg: M, state: State.Values<M>) => Instruction.Descriptor<T> | ((source: M) => T) | void;
9
+ declare namespace Instruction {
10
+ type Getter<T> = (source: State) => T;
11
+ type Descriptor<T = any> = {
12
+ get?: Getter<T> | boolean;
13
+ set?: State.Setter<T> | boolean;
14
+ enumerable?: boolean;
15
+ value?: T;
16
+ };
17
+ }
18
+ declare function use<T>(instruction: Instruction<T>): T extends void ? unknown : T;
19
+ declare function use<T extends State>(Type: State.Type<T>, required: false): T | undefined;
20
+ declare function use<T extends State>(Type: State.Type<T>, ready?: (i: T) => void): T;
21
+ //#endregion
22
+ export { Instruction, use };
23
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLmQudHMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3VzZS5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFN0YXRlIH0gZnJvbSAnLi4vc3RhdGUnO1xuLyoqXG4gKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAqIE9wdGlvbmFsIHJldHVybmVkIGNhbGxiYWNrIHdpbGwgcnVuIHdoZW4gb25jZSB1cG9uIGZpcnN0IGFjY2Vzcy5cbiAqL1xudHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgU3RhdGUgPSBhbnk+ID0gKHRoaXM6IE0sIGtleTogRXh0cmFjdDxTdGF0ZS5GaWVsZDxNPiwgc3RyaW5nPiwgdGhpc0FyZzogTSwgc3RhdGU6IFN0YXRlLlZhbHVlczxNPikgPT4gSW5zdHJ1Y3Rpb24uRGVzY3JpcHRvcjxUPiB8ICgoc291cmNlOiBNKSA9PiBUKSB8IHZvaWQ7XG5kZWNsYXJlIG5hbWVzcGFjZSBJbnN0cnVjdGlvbiB7XG4gICAgdHlwZSBHZXR0ZXI8VD4gPSAoc291cmNlOiBTdGF0ZSkgPT4gVDtcbiAgICB0eXBlIERlc2NyaXB0b3I8VCA9IGFueT4gPSB7XG4gICAgICAgIGdldD86IEdldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgICAgIHNldD86IFN0YXRlLlNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgICAgIGVudW1lcmFibGU/OiBib29sZWFuO1xuICAgICAgICB2YWx1ZT86IFQ7XG4gICAgfTtcbn1cbmRlY2xhcmUgZnVuY3Rpb24gdXNlPFQ+KGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbjxUPik6IFQgZXh0ZW5kcyB2b2lkID8gdW5rbm93biA6IFQ7XG5kZWNsYXJlIGZ1bmN0aW9uIHVzZTxUIGV4dGVuZHMgU3RhdGU+KFR5cGU6IFN0YXRlLlR5cGU8VD4sIHJlcXVpcmVkOiBmYWxzZSk6IFQgfCB1bmRlZmluZWQ7XG5kZWNsYXJlIGZ1bmN0aW9uIHVzZTxUIGV4dGVuZHMgU3RhdGU+KFR5cGU6IFN0YXRlLlR5cGU8VD4sIHJlYWR5PzogKGk6IFQpID0+IHZvaWQpOiBUO1xuZXhwb3J0IHsgdXNlLCBJbnN0cnVjdGlvbiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFDQSxJQUFFLGNBQUE7Q0FBQTtFQUFBLEdBQUEsTUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0VBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQSxZQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDRixJQUFHLGNBQVM7Q0FBQTtFQUFXLE1BQUU7RUFBSTtFQUFLO0VBQUs7RUFBQTtFQUFTO0VBQUEsTUFBUTtFQUFBO0VBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ3hELElBQUcsTUFBQTtDQUFRO0VBQUMsTUFBUTtFQUFDO0VBQUE7RUFBYztFQUFJO0VBQUE7Q0FBSztFQUFBO0VBQUs7RUFBSTtFQUFDO0VBQU07RUFBQTtFQUFNO0NBQUE7QUFDbEUsSUFBRSxNQUFBO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBLE1BQUE7RUFBQTtFQUFBO0NBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNGLElBQUksTUFBQztDQUFBO0VBQUEsTUFBZTtFQUFDO0VBQU87RUFBQSxNQUFRO0VBQU87RUFBQztFQUFJO0NBQUU7RUFBQztFQUFDO0VBQU87RUFBRTtFQUFLO0VBQUE7RUFBUTtFQUFLO0VBQUM7RUFBTztFQUFHO0NBQUEifQ==
@@ -1,65 +1,56 @@
1
- import { fetch, Model, PARENT, STATE, uid, update, watch } from "../model";
1
+ import { PARENT, STATE, State, access, follow, uid, update } from "../state.js";
2
+
3
+ //#region src/instruction/use.ts
2
4
  const INSTRUCTION = /* @__PURE__ */ new Map();
3
5
  function use(arg1, arg2) {
4
- if (Model.is(arg1))
5
- arg1 = childInstruction(arg1, arg2);
6
- const token = Symbol("instruction-" + uid());
7
- INSTRUCTION.set(token, arg1);
8
- return token;
6
+ if (State.is(arg1)) arg1 = childInstruction(arg1, arg2);
7
+ const token = Symbol("instruction-" + uid());
8
+ INSTRUCTION.set(token, arg1);
9
+ return token;
9
10
  }
10
11
  function childInstruction(type, arg2) {
11
- return (key, subject) => {
12
- function set(next) {
13
- if (next ? !(next instanceof type) : arg2 !== false)
14
- throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);
15
- update(subject, key, next);
16
- if (next && typeof arg2 == "function")
17
- arg2(next);
18
- return false;
19
- }
20
- const value = new type();
21
- set(value);
22
- PARENT.set(value, subject);
23
- value.set();
24
- return { set };
25
- };
12
+ return (key, subject) => {
13
+ function set(next) {
14
+ if (next ? !(next instanceof type) : arg2 !== false) throw new Error(`${subject}.${key} expected State of type ${type} but got ${next && next.constructor}.`);
15
+ update(subject, key, next);
16
+ if (next && typeof arg2 == "function") arg2(next);
17
+ return false;
18
+ }
19
+ const value = new type();
20
+ set(value);
21
+ PARENT.set(value, subject);
22
+ value.set();
23
+ return { set };
24
+ };
26
25
  }
27
26
  function init() {
28
- const state = STATE.get(this);
29
- for (const key in this) {
30
- const { value } = Object.getOwnPropertyDescriptor(this, key);
31
- const instruction = INSTRUCTION.get(value);
32
- if (!instruction)
33
- continue;
34
- INSTRUCTION.delete(value);
35
- delete this[key];
36
- const output = instruction.call(this, key, this, state);
37
- if (!output)
38
- continue;
39
- const desc = typeof output == "object" ? output : { get: output };
40
- if ("value" in desc)
41
- state[key] = desc.value;
42
- const model = this;
43
- Object.defineProperty(model, key, {
44
- enumerable: desc.enumerable !== false,
45
- get() {
46
- return watch(
47
- this,
48
- key,
49
- typeof desc.get == "function" ? desc.get(this) : fetch(model, key, desc.get)
50
- );
51
- },
52
- set(next) {
53
- if (desc.set === false)
54
- throw new Error(`${model}.${key} is read-only.`);
55
- update(model, key, next, desc.set);
56
- }
57
- });
58
- }
59
- return null;
27
+ const state = STATE.get(this);
28
+ for (const key in this) {
29
+ const { value } = Object.getOwnPropertyDescriptor(this, key);
30
+ const instruction = INSTRUCTION.get(value);
31
+ if (!instruction) continue;
32
+ INSTRUCTION.delete(value);
33
+ delete this[key];
34
+ const output = instruction.call(this, key, this, state);
35
+ if (!output) continue;
36
+ const desc = typeof output == "object" ? output : { get: output };
37
+ if ("value" in desc) state[key] = desc.value;
38
+ const self = this;
39
+ Object.defineProperty(self, key, {
40
+ enumerable: desc.enumerable !== false,
41
+ get() {
42
+ return follow(this, key, typeof desc.get == "function" ? desc.get(this) : access(self, key, desc.get));
43
+ },
44
+ set(next) {
45
+ if (desc.set === false) throw new Error(`${self}.${key} is read-only.`);
46
+ update(self, key, next, desc.set);
47
+ }
48
+ });
49
+ }
50
+ return null;
60
51
  }
61
- Model.on(init);
62
- export {
63
- use
64
- };
65
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2luc3RydWN0aW9uL3VzZS50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiaW1wb3J0IHsgZmV0Y2gsIE1vZGVsLCBQQVJFTlQsIFNUQVRFLCB1aWQsIHVwZGF0ZSwgd2F0Y2ggfSBmcm9tICcuLi9tb2RlbCc7XG5cbmNvbnN0IElOU1RSVUNUSU9OID0gbmV3IE1hcDxzeW1ib2wsIE1vZGVsLkluc3RydWN0aW9uPigpO1xuXG5mdW5jdGlvbiB1c2UgPFQ+IChpbnN0cnVjdGlvbjogTW9kZWwuSW5zdHJ1Y3Rpb248VD4pOiBUIGV4dGVuZHMgdm9pZCA/IHVua25vd24gOiBUO1xuXG5mdW5jdGlvbiB1c2UgPFQgZXh0ZW5kcyBNb2RlbD4gKFR5cGU6IE1vZGVsLkluaXQ8VD4sIHJlcXVpcmVkOiBmYWxzZSk6IFQgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHVzZSA8VCBleHRlbmRzIE1vZGVsPiAoVHlwZTogTW9kZWwuSW5pdDxUPiwgcmVhZHk/OiAoaTogVCkgPT4gdm9pZCk6IFQ7XG5cbmZ1bmN0aW9uIHVzZShcbiAgYXJnMTogTW9kZWwuSW5pdCB8IE1vZGVsLkluc3RydWN0aW9uLFxuICBhcmcyPzogKChpOiBNb2RlbCkgPT4gdm9pZCkgfCBib29sZWFuKXtcblxuICBpZihNb2RlbC5pcyhhcmcxKSlcbiAgICBhcmcxID0gY2hpbGRJbnN0cnVjdGlvbihhcmcxLCBhcmcyKTtcblxuICBjb25zdCB0b2tlbiA9IFN5bWJvbChcImluc3RydWN0aW9uLVwiICsgdWlkKCkpO1xuICBJTlNUUlVDVElPTi5zZXQodG9rZW4sIGFyZzEpO1xuICByZXR1cm4gdG9rZW47XG59XG5cbmZ1bmN0aW9uIGNoaWxkSW5zdHJ1Y3Rpb24oXG4gIHR5cGU6IE1vZGVsLkluaXQ8TW9kZWw+LFxuICBhcmcyPzogKChpOiBNb2RlbCkgPT4gdm9pZCkgfCBib29sZWFuXG4pOiBNb2RlbC5JbnN0cnVjdGlvbjxhbnksIGFueT4ge1xuICByZXR1cm4gKGtleSwgc3ViamVjdCkgPT4ge1xuICAgIGZ1bmN0aW9uIHNldChuZXh0OiBNb2RlbCB8IHVuZGVmaW5lZCl7XG4gICAgICBpZihuZXh0ID8gIShuZXh0IGluc3RhbmNlb2YgdHlwZSkgOiBhcmcyICE9PSBmYWxzZSlcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3N1YmplY3R9LiR7a2V5fSBleHBlY3RlZCBNb2RlbCBvZiB0eXBlICR7dHlwZX0gYnV0IGdvdCAke25leHQgJiYgbmV4dC5jb25zdHJ1Y3Rvcn0uYCk7XG5cbiAgICAgIHVwZGF0ZShzdWJqZWN0LCBrZXksIG5leHQpO1xuXG4gICAgICBpZihuZXh0ICYmIHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgYXJnMihuZXh0KTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gbmV3IHR5cGUoKTtcblxuICAgIHNldCh2YWx1ZSk7XG4gICAgUEFSRU5ULnNldCh2YWx1ZSwgc3ViamVjdCk7XG4gICAgdmFsdWUuc2V0KCk7XG5cbiAgICByZXR1cm4geyBzZXQgfTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpbml0KHRoaXM6IE1vZGVsKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQodGhpcykhO1xuXG4gIGZvcihjb25zdCBrZXkgaW4gdGhpcyl7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0aGlzLCBrZXkpITtcbiAgICBjb25zdCBpbnN0cnVjdGlvbiA9IElOU1RSVUNUSU9OLmdldCh2YWx1ZSk7XG5cbiAgICBpZighaW5zdHJ1Y3Rpb24pXG4gICAgICBjb250aW51ZTtcblxuICAgIElOU1RSVUNUSU9OLmRlbGV0ZSh2YWx1ZSk7XG4gICAgZGVsZXRlICh0aGlzIGFzIGFueSlba2V5XTtcblxuICAgIGNvbnN0IG91dHB1dCA9IGluc3RydWN0aW9uLmNhbGwodGhpcywga2V5LCB0aGlzLCBzdGF0ZSk7XG5cbiAgICBpZighb3V0cHV0KVxuICAgICAgY29udGludWU7XG5cbiAgICBjb25zdCBkZXNjID0gdHlwZW9mIG91dHB1dCA9PSBcIm9iamVjdFwiID8gb3V0cHV0IDogeyBnZXQ6IG91dHB1dCB9O1xuXG4gICAgaWYoXCJ2YWx1ZVwiIGluIGRlc2MpXG4gICAgICBzdGF0ZVtrZXldID0gZGVzYy52YWx1ZTtcblxuICAgIGNvbnN0IG1vZGVsID0gdGhpcztcblxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShtb2RlbCwga2V5LCB7XG4gICAgICBlbnVtZXJhYmxlOiBkZXNjLmVudW1lcmFibGUgIT09IGZhbHNlLFxuICAgICAgZ2V0KHRoaXM6IE1vZGVsKXtcbiAgICAgICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgXG4gICAgICAgICAgdHlwZW9mIGRlc2MuZ2V0ID09IFwiZnVuY3Rpb25cIlxuICAgICAgICAgICAgPyBkZXNjLmdldCh0aGlzKVxuICAgICAgICAgICAgOiBmZXRjaChtb2RlbCwga2V5LCBkZXNjLmdldClcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBzZXQobmV4dCl7XG4gICAgICAgIGlmKGRlc2Muc2V0ID09PSBmYWxzZSlcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bW9kZWx9LiR7a2V5fSBpcyByZWFkLW9ubHkuYCk7XG5cbiAgICAgICAgdXBkYXRlKG1vZGVsLCBrZXksIG5leHQsIGRlc2Muc2V0KTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbk1vZGVsLm9uKGluaXQpO1xuXG5leHBvcnQgeyB1c2UgfSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsT0FBTyxPQUFPLFFBQVEsT0FBTyxLQUFLLFFBQVEsYUFBYTtBQUVoRSxNQUFNLGNBQWMsb0JBQUksSUFBK0I7QUFRdkQsU0FBUyxJQUNQLE1BQ0EsTUFBc0M7QUFFdEMsTUFBRyxNQUFNLEdBQUcsSUFBSTtBQUNkLFdBQU8saUJBQWlCLE1BQU0sSUFBSTtBQUVwQyxRQUFNLFFBQVEsT0FBTyxpQkFBaUIsSUFBSSxDQUFDO0FBQzNDLGNBQVksSUFBSSxPQUFPLElBQUk7QUFDM0IsU0FBTztBQUNUO0FBRUEsU0FBUyxpQkFDUCxNQUNBLE1BQzZCO0FBQzdCLFNBQU8sQ0FBQyxLQUFLLFlBQVk7QUFDdkIsYUFBUyxJQUFJLE1BQXdCO0FBQ25DLFVBQUcsT0FBTyxFQUFFLGdCQUFnQixRQUFRLFNBQVM7QUFDM0MsY0FBTSxJQUFJLE1BQU0sR0FBRyxPQUFPLElBQUksR0FBRywyQkFBMkIsSUFBSSxZQUFZLFFBQVEsS0FBSyxXQUFXLEdBQUc7QUFFekcsYUFBTyxTQUFTLEtBQUssSUFBSTtBQUV6QixVQUFHLFFBQVEsT0FBTyxRQUFRO0FBQ3hCLGFBQUssSUFBSTtBQUVYLGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSxRQUFRLElBQUksS0FBSztBQUV2QixRQUFJLEtBQUs7QUFDVCxXQUFPLElBQUksT0FBTyxPQUFPO0FBQ3pCLFVBQU0sSUFBSTtBQUVWLFdBQU8sRUFBRSxJQUFJO0FBQUEsRUFDZjtBQUNGO0FBRUEsU0FBUyxPQUFpQjtBQUN4QixRQUFNLFFBQVEsTUFBTSxJQUFJLElBQUk7QUFFNUIsYUFBVSxPQUFPLE1BQUs7QUFDcEIsVUFBTSxFQUFFLE1BQU0sSUFBSSxPQUFPLHlCQUF5QixNQUFNLEdBQUc7QUFDM0QsVUFBTSxjQUFjLFlBQVksSUFBSSxLQUFLO0FBRXpDLFFBQUcsQ0FBQztBQUNGO0FBRUYsZ0JBQVksT0FBTyxLQUFLO0FBQ3hCLFdBQVEsS0FBYSxHQUFHO0FBRXhCLFVBQU0sU0FBUyxZQUFZLEtBQUssTUFBTSxLQUFLLE1BQU0sS0FBSztBQUV0RCxRQUFHLENBQUM7QUFDRjtBQUVGLFVBQU0sT0FBTyxPQUFPLFVBQVUsV0FBVyxTQUFTLEVBQUUsS0FBSyxPQUFPO0FBRWhFLFFBQUcsV0FBVztBQUNaLFlBQU0sR0FBRyxJQUFJLEtBQUs7QUFFcEIsVUFBTSxRQUFRO0FBRWQsV0FBTyxlQUFlLE9BQU8sS0FBSztBQUFBLE1BQ2hDLFlBQVksS0FBSyxlQUFlO0FBQUEsTUFDaEMsTUFBZ0I7QUFDZCxlQUFPO0FBQUEsVUFBTTtBQUFBLFVBQU07QUFBQSxVQUNqQixPQUFPLEtBQUssT0FBTyxhQUNmLEtBQUssSUFBSSxJQUFJLElBQ2IsTUFBTSxPQUFPLEtBQUssS0FBSyxHQUFHO0FBQUEsUUFDaEM7QUFBQSxNQUNGO0FBQUEsTUFDQSxJQUFJLE1BQUs7QUFDUCxZQUFHLEtBQUssUUFBUTtBQUNkLGdCQUFNLElBQUksTUFBTSxHQUFHLEtBQUssSUFBSSxHQUFHLGdCQUFnQjtBQUVqRCxlQUFPLE9BQU8sS0FBSyxNQUFNLEtBQUssR0FBRztBQUFBLE1BQ25DO0FBQUEsSUFDRixDQUFDO0FBQUEsRUFDSDtBQUVBLFNBQU87QUFDVDtBQUVBLE1BQU0sR0FBRyxJQUFJOyIsCiAgIm5hbWVzIjogW10KfQo=
52
+ State.on(init);
53
+
54
+ //#endregion
55
+ export { use };
56
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLmpzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9pbnN0cnVjdGlvbi91c2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYWNjZXNzLCBmb2xsb3csIFN0YXRlLCBQQVJFTlQsIFNUQVRFLCB1aWQsIHVwZGF0ZSB9IGZyb20gJy4uL3N0YXRlJztcblxuLyoqXG4gKiBQcm9wZXJ0eSBpbml0aWFsaXplciwgd2lsbCBydW4gdXBvbiBpbnN0YW5jZSBjcmVhdGlvbi5cbiAqIE9wdGlvbmFsIHJldHVybmVkIGNhbGxiYWNrIHdpbGwgcnVuIHdoZW4gb25jZSB1cG9uIGZpcnN0IGFjY2Vzcy5cbiAqL1xudHlwZSBJbnN0cnVjdGlvbjxUID0gYW55LCBNIGV4dGVuZHMgU3RhdGUgPSBhbnk+ID1cbiAgLy8gVE9ETzogU2hvdWxkIHRoaXMgYWxsb3cgZm9yIG51bWJlcnMvc3ltYm9sIHByb3BlcnRpZXM/XG4gIChcbiAgICB0aGlzOiBNLFxuICAgIGtleTogRXh0cmFjdDxTdGF0ZS5GaWVsZDxNPiwgc3RyaW5nPixcbiAgICB0aGlzQXJnOiBNLFxuICAgIHN0YXRlOiBTdGF0ZS5WYWx1ZXM8TT5cbiAgKSA9PiBJbnN0cnVjdGlvbi5EZXNjcmlwdG9yPFQ+IHwgKChzb3VyY2U6IE0pID0+IFQpIHwgdm9pZDtcblxuZGVjbGFyZSBuYW1lc3BhY2UgSW5zdHJ1Y3Rpb24ge1xuICB0eXBlIEdldHRlcjxUPiA9IChzb3VyY2U6IFN0YXRlKSA9PiBUO1xuXG4gIHR5cGUgRGVzY3JpcHRvcjxUID0gYW55PiA9IHtcbiAgICBnZXQ/OiBHZXR0ZXI8VD4gfCBib29sZWFuO1xuICAgIHNldD86IFN0YXRlLlNldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgZW51bWVyYWJsZT86IGJvb2xlYW47XG4gICAgdmFsdWU/OiBUO1xuICB9O1xufVxuXG5jb25zdCBJTlNUUlVDVElPTiA9IG5ldyBNYXA8c3ltYm9sLCBJbnN0cnVjdGlvbj4oKTtcblxuZnVuY3Rpb24gdXNlPFQ+KGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbjxUPik6IFQgZXh0ZW5kcyB2b2lkID8gdW5rbm93biA6IFQ7XG5cbmZ1bmN0aW9uIHVzZTxUIGV4dGVuZHMgU3RhdGU+KFxuICBUeXBlOiBTdGF0ZS5UeXBlPFQ+LFxuICByZXF1aXJlZDogZmFsc2Vcbik6IFQgfCB1bmRlZmluZWQ7XG5cbmZ1bmN0aW9uIHVzZTxUIGV4dGVuZHMgU3RhdGU+KFR5cGU6IFN0YXRlLlR5cGU8VD4sIHJlYWR5PzogKGk6IFQpID0+IHZvaWQpOiBUO1xuXG5mdW5jdGlvbiB1c2UoXG4gIGFyZzE6IFN0YXRlLlR5cGUgfCBJbnN0cnVjdGlvbixcbiAgYXJnMj86ICgoaTogU3RhdGUpID0+IHZvaWQpIHwgYm9vbGVhblxuKSB7XG4gIGlmIChTdGF0ZS5pcyhhcmcxKSkgYXJnMSA9IGNoaWxkSW5zdHJ1Y3Rpb24oYXJnMSwgYXJnMik7XG5cbiAgY29uc3QgdG9rZW4gPSBTeW1ib2woJ2luc3RydWN0aW9uLScgKyB1aWQoKSk7XG4gIElOU1RSVUNUSU9OLnNldCh0b2tlbiwgYXJnMSk7XG4gIHJldHVybiB0b2tlbjtcbn1cblxuZnVuY3Rpb24gY2hpbGRJbnN0cnVjdGlvbihcbiAgdHlwZTogU3RhdGUuVHlwZTxTdGF0ZT4sXG4gIGFyZzI/OiAoKGk6IFN0YXRlKSA9PiB2b2lkKSB8IGJvb2xlYW5cbik6IEluc3RydWN0aW9uPGFueSwgYW55PiB7XG4gIHJldHVybiAoa2V5LCBzdWJqZWN0KSA9PiB7XG4gICAgZnVuY3Rpb24gc2V0KG5leHQ6IFN0YXRlIHwgdW5kZWZpbmVkKSB7XG4gICAgICBpZiAobmV4dCA/ICEobmV4dCBpbnN0YW5jZW9mIHR5cGUpIDogYXJnMiAhPT0gZmFsc2UpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtzdWJqZWN0fS4ke2tleX0gZXhwZWN0ZWQgU3RhdGUgb2YgdHlwZSAke3R5cGV9IGJ1dCBnb3QgJHtcbiAgICAgICAgICAgIG5leHQgJiYgbmV4dC5jb25zdHJ1Y3RvclxuICAgICAgICAgIH0uYFxuICAgICAgICApO1xuXG4gICAgICB1cGRhdGUoc3ViamVjdCwga2V5LCBuZXh0KTtcblxuICAgICAgaWYgKG5leHQgJiYgdHlwZW9mIGFyZzIgPT0gJ2Z1bmN0aW9uJykgYXJnMihuZXh0KTtcblxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlID0gbmV3IHR5cGUoKTtcblxuICAgIHNldCh2YWx1ZSk7XG4gICAgUEFSRU5ULnNldCh2YWx1ZSwgc3ViamVjdCk7XG4gICAgdmFsdWUuc2V0KCk7XG5cbiAgICByZXR1cm4geyBzZXQgfTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gaW5pdCh0aGlzOiBTdGF0ZSkge1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldCh0aGlzKSE7XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gdGhpcykge1xuICAgIGNvbnN0IHsgdmFsdWUgfSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGhpcywga2V5KSE7XG4gICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBJTlNUUlVDVElPTi5nZXQodmFsdWUpO1xuXG4gICAgaWYgKCFpbnN0cnVjdGlvbikgY29udGludWU7XG5cbiAgICBJTlNUUlVDVElPTi5kZWxldGUodmFsdWUpO1xuICAgIGRlbGV0ZSAodGhpcyBhcyBhbnkpW2tleV07XG5cbiAgICBjb25zdCBvdXRwdXQgPSBpbnN0cnVjdGlvbi5jYWxsKHRoaXMsIGtleSwgdGhpcywgc3RhdGUpO1xuXG4gICAgaWYgKCFvdXRwdXQpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVzYyA9IHR5cGVvZiBvdXRwdXQgPT0gJ29iamVjdCcgPyBvdXRwdXQgOiB7IGdldDogb3V0cHV0IH07XG5cbiAgICBpZiAoJ3ZhbHVlJyBpbiBkZXNjKSBzdGF0ZVtrZXldID0gZGVzYy52YWx1ZTtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHNlbGYsIGtleSwge1xuICAgICAgZW51bWVyYWJsZTogZGVzYy5lbnVtZXJhYmxlICE9PSBmYWxzZSxcbiAgICAgIGdldCh0aGlzOiBTdGF0ZSkge1xuICAgICAgICByZXR1cm4gZm9sbG93KFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIHR5cGVvZiBkZXNjLmdldCA9PSAnZnVuY3Rpb24nXG4gICAgICAgICAgICA/IGRlc2MuZ2V0KHRoaXMpXG4gICAgICAgICAgICA6IGFjY2VzcyhzZWxmLCBrZXksIGRlc2MuZ2V0KVxuICAgICAgICApO1xuICAgICAgfSxcbiAgICAgIHNldChuZXh0KSB7XG4gICAgICAgIGlmIChkZXNjLnNldCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7c2VsZn0uJHtrZXl9IGlzIHJlYWQtb25seS5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZShzZWxmLCBrZXksIG5leHQsIGRlc2Muc2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG5TdGF0ZS5vbihpbml0KTtcblxuZXhwb3J0IHsgdXNlLCBJbnN0cnVjdGlvbiB9O1xuIl0sIm1hcHBpbmdzIjoiOzs7QUEwQkEsTUFBTSw4QkFBYyxJQUFJLEtBQTBCO0FBV2xELFNBQVMsSUFDUCxNQUNBLE1BQ0E7QUFDQSxLQUFJLE1BQU0sR0FBRyxLQUFLLENBQUUsUUFBTyxpQkFBaUIsTUFBTSxLQUFLO0NBRXZELE1BQU0sUUFBUSxPQUFPLGlCQUFpQixLQUFLLENBQUM7QUFDNUMsYUFBWSxJQUFJLE9BQU8sS0FBSztBQUM1QixRQUFPOztBQUdULFNBQVMsaUJBQ1AsTUFDQSxNQUN1QjtBQUN2QixTQUFRLEtBQUssWUFBWTtFQUN2QixTQUFTLElBQUksTUFBeUI7QUFDcEMsT0FBSSxPQUFPLEVBQUUsZ0JBQWdCLFFBQVEsU0FBUyxNQUM1QyxPQUFNLElBQUksTUFDUixHQUFHLFFBQVEsR0FBRyxJQUFJLDBCQUEwQixLQUFLLFdBQy9DLFFBQVEsS0FBSyxZQUNkLEdBQ0Y7QUFFSCxVQUFPLFNBQVMsS0FBSyxLQUFLO0FBRTFCLE9BQUksUUFBUSxPQUFPLFFBQVEsV0FBWSxNQUFLLEtBQUs7QUFFakQsVUFBTzs7RUFHVCxNQUFNLFFBQVEsSUFBSSxNQUFNO0FBRXhCLE1BQUksTUFBTTtBQUNWLFNBQU8sSUFBSSxPQUFPLFFBQVE7QUFDMUIsUUFBTSxLQUFLO0FBRVgsU0FBTyxFQUFFLEtBQUs7OztBQUlsQixTQUFTLE9BQWtCO0NBQ3pCLE1BQU0sUUFBUSxNQUFNLElBQUksS0FBSztBQUU3QixNQUFLLE1BQU0sT0FBTyxNQUFNO0VBQ3RCLE1BQU0sRUFBRSxVQUFVLE9BQU8seUJBQXlCLE1BQU0sSUFBSTtFQUM1RCxNQUFNLGNBQWMsWUFBWSxJQUFJLE1BQU07QUFFMUMsTUFBSSxDQUFDLFlBQWE7QUFFbEIsY0FBWSxPQUFPLE1BQU07QUFDekIsU0FBUSxLQUFhO0VBRXJCLE1BQU0sU0FBUyxZQUFZLEtBQUssTUFBTSxLQUFLLE1BQU0sTUFBTTtBQUV2RCxNQUFJLENBQUMsT0FBUTtFQUViLE1BQU0sT0FBTyxPQUFPLFVBQVUsV0FBVyxTQUFTLEVBQUUsS0FBSyxRQUFRO0FBRWpFLE1BQUksV0FBVyxLQUFNLE9BQU0sT0FBTyxLQUFLO0VBRXZDLE1BQU0sT0FBTztBQUViLFNBQU8sZUFBZSxNQUFNLEtBQUs7R0FDL0IsWUFBWSxLQUFLLGVBQWU7R0FDaEMsTUFBaUI7QUFDZixXQUFPLE9BQ0wsTUFDQSxLQUNBLE9BQU8sS0FBSyxPQUFPLGFBQ2YsS0FBSyxJQUFJLEtBQUssR0FDZCxPQUFPLE1BQU0sS0FBSyxLQUFLLElBQUksQ0FDaEM7O0dBRUgsSUFBSSxNQUFNO0FBQ1IsUUFBSSxLQUFLLFFBQVEsTUFDZixPQUFNLElBQUksTUFBTSxHQUFHLEtBQUssR0FBRyxJQUFJLGdCQUFnQjtBQUdqRCxXQUFPLE1BQU0sS0FBSyxNQUFNLEtBQUssSUFBSTs7R0FFcEMsQ0FBQzs7QUFHSixRQUFPOztBQUdULE1BQU0sR0FBRyxLQUFLIn0=
@@ -0,0 +1,42 @@
1
+ //#region src/observable.d.ts
2
+ /**
3
+ * Update callback function.
4
+ *
5
+ * @param key -
6
+ * - `string` - property which has updated.
7
+ * - `false` - a normal update has completed.
8
+ * - `true` - initial event; instance is ready.
9
+ * - `null` - terminal event; instance is expired.
10
+ * @param source - Instance of State for which update has occured.
11
+ */
12
+ type Notify<T extends Observable = any> = (this: T, key: Event, source: T) => (() => void) | null | void;
13
+ type Effect<T extends Observable> = (proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
14
+ type Event = number | string | null | boolean | symbol;
15
+ type PromiseLite<T = void> = {
16
+ then: (callback: () => T) => T;
17
+ };
18
+ declare namespace Observable {
19
+ type Callback = () => void | PromiseLite;
20
+ }
21
+ interface Observable {
22
+ [Observable](callback: Observable.Callback, required?: boolean): this | void;
23
+ }
24
+ declare const Observable: unique symbol;
25
+ /** Update register. */
26
+ declare const PENDING_KEYS: WeakMap<Observable, Set<string | number | symbol>>;
27
+ declare function addListener<T extends Observable>(subject: T, callback: Notify<T>, select?: Event | Set<Event>): () => boolean;
28
+ declare function event(subject: Observable, key?: string | number | symbol | null, silent?: boolean): void;
29
+ /**
30
+ * Create a side-effect which will update whenever values accessed change.
31
+ * Callback is called immediately and whenever values are stale.
32
+ *
33
+ * @param target - Instance of State to observe.
34
+ * @param callback - Function to invoke when values change.
35
+ * @param requireValues - If `true` will throw if accessing a value which is `undefined`.
36
+ */
37
+ declare function watch<T extends Observable>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;
38
+ declare function watch<T extends Observable>(target: T, callback: Effect<T>, recursive?: boolean): () => void;
39
+ declare function scope(): () => () => void;
40
+ //#endregion
41
+ export { Notify, Observable, PENDING_KEYS, addListener, event, scope, watch };
42
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZS5kLnRzIiwibmFtZXMiOltdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vYnNlcnZhYmxlLmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVcGRhdGUgY2FsbGJhY2sgZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIGtleSAtXG4gKiAgIC0gYHN0cmluZ2AgLSBwcm9wZXJ0eSB3aGljaCBoYXMgdXBkYXRlZC5cbiAqICAgLSBgZmFsc2VgIC0gYSBub3JtYWwgdXBkYXRlIGhhcyBjb21wbGV0ZWQuXG4gKiAgIC0gYHRydWVgIC0gaW5pdGlhbCBldmVudDsgaW5zdGFuY2UgaXMgcmVhZHkuXG4gKiAgIC0gYG51bGxgIC0gdGVybWluYWwgZXZlbnQ7IGluc3RhbmNlIGlzIGV4cGlyZWQuXG4gKiBAcGFyYW0gc291cmNlIC0gSW5zdGFuY2Ugb2YgU3RhdGUgZm9yIHdoaWNoIHVwZGF0ZSBoYXMgb2NjdXJlZC5cbiAqL1xudHlwZSBOb3RpZnk8VCBleHRlbmRzIE9ic2VydmFibGUgPSBhbnk+ID0gKHRoaXM6IFQsIGtleTogRXZlbnQsIHNvdXJjZTogVCkgPT4gKCgpID0+IHZvaWQpIHwgbnVsbCB8IHZvaWQ7XG50eXBlIEVmZmVjdDxUIGV4dGVuZHMgT2JzZXJ2YWJsZT4gPSAocHJveHk6IFQpID0+ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCkgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG50eXBlIEV2ZW50ID0gbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IGJvb2xlYW4gfCBzeW1ib2w7XG50eXBlIFByb21pc2VMaXRlPFQgPSB2b2lkPiA9IHtcbiAgICB0aGVuOiAoY2FsbGJhY2s6ICgpID0+IFQpID0+IFQ7XG59O1xuZGVjbGFyZSBuYW1lc3BhY2UgT2JzZXJ2YWJsZSB7XG4gICAgdHlwZSBDYWxsYmFjayA9ICgpID0+IHZvaWQgfCBQcm9taXNlTGl0ZTtcbn1cbmludGVyZmFjZSBPYnNlcnZhYmxlIHtcbiAgICBbT2JzZXJ2YWJsZV0oY2FsbGJhY2s6IE9ic2VydmFibGUuQ2FsbGJhY2ssIHJlcXVpcmVkPzogYm9vbGVhbik6IHRoaXMgfCB2b2lkO1xufVxuZGVjbGFyZSBjb25zdCBPYnNlcnZhYmxlOiB1bmlxdWUgc3ltYm9sO1xuLyoqIFVwZGF0ZSByZWdpc3Rlci4gKi9cbmRlY2xhcmUgY29uc3QgUEVORElOR19LRVlTOiBXZWFrTWFwPE9ic2VydmFibGUsIFNldDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+PjtcbmRlY2xhcmUgZnVuY3Rpb24gYWRkTGlzdGVuZXI8VCBleHRlbmRzIE9ic2VydmFibGU+KHN1YmplY3Q6IFQsIGNhbGxiYWNrOiBOb3RpZnk8VD4sIHNlbGVjdD86IEV2ZW50IHwgU2V0PEV2ZW50Pik6ICgpID0+IGJvb2xlYW47XG5kZWNsYXJlIGZ1bmN0aW9uIGV2ZW50KHN1YmplY3Q6IE9ic2VydmFibGUsIGtleT86IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IG51bGwsIHNpbGVudD86IGJvb2xlYW4pOiB2b2lkO1xuLyoqXG4gKiBDcmVhdGUgYSBzaWRlLWVmZmVjdCB3aGljaCB3aWxsIHVwZGF0ZSB3aGVuZXZlciB2YWx1ZXMgYWNjZXNzZWQgY2hhbmdlLlxuICogQ2FsbGJhY2sgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFuZCB3aGVuZXZlciB2YWx1ZXMgYXJlIHN0YWxlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBJbnN0YW5jZSBvZiBTdGF0ZSB0byBvYnNlcnZlLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdmFsdWVzIGNoYW5nZS5cbiAqIEBwYXJhbSByZXF1aXJlVmFsdWVzIC0gSWYgYHRydWVgIHdpbGwgdGhyb3cgaWYgYWNjZXNzaW5nIGEgdmFsdWUgd2hpY2ggaXMgYHVuZGVmaW5lZGAuXG4gKi9cbmRlY2xhcmUgZnVuY3Rpb24gd2F0Y2g8VCBleHRlbmRzIE9ic2VydmFibGU+KHRhcmdldDogVCwgY2FsbGJhY2s6IEVmZmVjdDxSZXF1aXJlZDxUPj4sIHJlcXVpcmVWYWx1ZXM6IHRydWUpOiAoKSA9PiB2b2lkO1xuZGVjbGFyZSBmdW5jdGlvbiB3YXRjaDxUIGV4dGVuZHMgT2JzZXJ2YWJsZT4odGFyZ2V0OiBULCBjYWxsYmFjazogRWZmZWN0PFQ+LCByZWN1cnNpdmU/OiBib29sZWFuKTogKCkgPT4gdm9pZDtcbmV4cG9ydCBkZWNsYXJlIGZ1bmN0aW9uIHNjb3BlKCk6ICgpID0+ICgpID0+IHZvaWQ7XG5leHBvcnQgeyBhZGRMaXN0ZW5lciwgd2F0Y2gsIGV2ZW50LCBOb3RpZnksIFBFTkRJTkdfS0VZUywgT2JzZXJ2YWJsZSB9O1xuIl0sIm1hcHBpbmdzIjoiO0FBQUEsSUFBRSxTQUFBO0NBQUE7RUFBQSxNQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDRixJQUFHLFNBQU87Q0FBQTtFQUFBLE1BQVM7RUFBQTtFQUFRO0VBQUE7RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUMzQixJQUFDLFFBQUE7Q0FBQTtPQUFBLEVBQUE7Q0FBQSxFQUFBO0NBQUE7QUFDRCxJQUFJLGNBQVU7Q0FBQTtFQUFBLE1BQUEsQ0FBQSxHQUFBLEVBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQ2QsSUFBSSxhQUFhO0NBQUM7T0FBUyxDQUFBLFlBQVU7Q0FBQSxDQUFBLElBQU8sR0FBQTtDQUFBO0FBQzVDLElBQUksYUFBYTtDQUFDO09BQVEsQ0FBQSxXQUFXLFNBQVM7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtDQUFBO0FBQzlDLElBQUksYUFBWTtDQUFBO09BQVEsRUFBSztDQUFFLEVBQUE7Q0FBQTtBQUMvQixJQUFJLGVBQVk7Q0FBQTtPQUFjO0VBQUM7RUFBWTtFQUFDO0VBQU87Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDbkQsSUFBSSxjQUFjO0NBQUM7RUFBQSxNQUFTO0VBQUE7RUFBYTtFQUFBO0VBQU07RUFBTztFQUFJO0VBQU87RUFBQTtDQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0NBQUE7QUFDakUsSUFBRSxRQUFBO0NBQUE7T0FBQSxDQUFBLFdBQUE7Q0FBQTtFQUFBO0VBQUE7RUFBQTtFQUFBO0VBQUE7Q0FBQTtBQUNGLElBQUksUUFBUTtDQUFDO0VBQUMsTUFBUTtFQUFBO0VBQWE7RUFBRztFQUFHO0VBQVU7RUFBTTtDQUFBO0VBQUE7RUFBTztFQUFBO0VBQVM7RUFBSTtFQUFJO0VBQUk7RUFBSTtFQUFJO0VBQUE7Q0FBSTtBQUNqRyxJQUFJLFFBQVE7Q0FBQztFQUFDLE1BQVE7RUFBQTtFQUFhO0VBQUU7RUFBQTtFQUFXO0NBQUU7RUFBQztFQUFDO0VBQU87RUFBQztFQUFPO0VBQUc7RUFBSztFQUFJO0VBQUE7Q0FBSTtBQUNuRixJQUFXLFFBQVE7Q0FBQztPQUFVLEVBQUM7Q0FBQSxFQUFLO0NBQUMifQ==
@@ -0,0 +1,121 @@
1
+ //#region src/observable.ts
2
+ const Observable = Symbol("observe");
3
+ /** Placeholder event determines if state is initialized or not. */
4
+ const onReady = () => null;
5
+ const LISTENERS = /* @__PURE__ */ new WeakMap();
6
+ /** Events pending for a given object. */
7
+ const PENDING = /* @__PURE__ */ new WeakMap();
8
+ /** Update register. */
9
+ const PENDING_KEYS = /* @__PURE__ */ new WeakMap();
10
+ /** Central event dispatch. Bunches all updates to occur at same time. */
11
+ const DISPATCH = /* @__PURE__ */ new Set();
12
+ function addListener(subject, callback, select) {
13
+ let listeners = LISTENERS.get(subject);
14
+ if (!listeners) LISTENERS.set(subject, listeners = new Map([[onReady, void 0]]));
15
+ if (select !== void 0 && !(select instanceof Set)) select = new Set([select]);
16
+ if (!listeners.has(onReady) && !select) callback.call(subject, true, subject);
17
+ listeners.set(callback, select);
18
+ return () => listeners.delete(callback);
19
+ }
20
+ function emit(state, key) {
21
+ const listeners = LISTENERS.get(state);
22
+ const notReady = listeners.has(onReady);
23
+ if (key === true && !notReady) return;
24
+ let pending = PENDING.get(state);
25
+ if (pending) {
26
+ pending.add(key);
27
+ return;
28
+ }
29
+ PENDING.set(state, pending = new Set(notReady ? [true, key] : [key]));
30
+ for (const key of pending) for (const [callback, filter] of listeners) if (!filter || filter.has(key)) {
31
+ const after = callback.call(state, key, state);
32
+ if (after) enqueue(after);
33
+ else if (after === null) listeners.delete(callback);
34
+ }
35
+ if (key === null) listeners.clear();
36
+ PENDING.delete(state);
37
+ }
38
+ function event(subject, key, silent) {
39
+ if (key === null) return emit(subject, key);
40
+ if (!key) return emit(subject, true);
41
+ let pending = PENDING_KEYS.get(subject);
42
+ if (!pending) {
43
+ PENDING_KEYS.set(subject, pending = /* @__PURE__ */ new Set());
44
+ if (!silent) enqueue(() => {
45
+ emit(subject, false);
46
+ PENDING_KEYS.delete(subject);
47
+ });
48
+ }
49
+ pending.add(key);
50
+ if (!silent) emit(subject, key);
51
+ }
52
+ function enqueue(eventHandler) {
53
+ if (!DISPATCH.size) setTimeout(() => {
54
+ DISPATCH.forEach((event) => {
55
+ try {
56
+ event();
57
+ } catch (err) {
58
+ console.error(err);
59
+ }
60
+ });
61
+ DISPATCH.clear();
62
+ }, 0);
63
+ DISPATCH.add(eventHandler);
64
+ }
65
+ function watch(target, callback, argument) {
66
+ let unset;
67
+ let reset;
68
+ function invoke() {
69
+ let ignore = true;
70
+ function onUpdate() {
71
+ if (ignore || reset === null) return;
72
+ ignore = true;
73
+ if (reset && unset) {
74
+ unset(true);
75
+ unset = void 0;
76
+ }
77
+ enqueue(invoke);
78
+ return { then: enqueue };
79
+ }
80
+ try {
81
+ const exit = argument === false ? void 0 : scope();
82
+ const output = callback(target[Observable](onUpdate, argument === true));
83
+ const flush = exit ? exit() : () => {};
84
+ ignore = false;
85
+ reset = output === null ? null : invoke;
86
+ unset = (key) => {
87
+ if (typeof output == "function") output(key);
88
+ flush();
89
+ };
90
+ } catch (err) {
91
+ if (err instanceof Promise) {
92
+ reset = void 0;
93
+ err.then(invoke);
94
+ } else throw err;
95
+ }
96
+ }
97
+ function cleanup() {
98
+ if (unset) unset(false);
99
+ reset = null;
100
+ }
101
+ if (EffectContext && argument !== false) EffectContext.add(cleanup);
102
+ addListener(target, (key) => {
103
+ if (key === true) invoke();
104
+ else if (!reset) return reset;
105
+ if (key === null && unset) unset(null);
106
+ });
107
+ return cleanup;
108
+ }
109
+ let EffectContext;
110
+ function scope() {
111
+ const last = EffectContext;
112
+ const context = EffectContext = /* @__PURE__ */ new Set();
113
+ return () => {
114
+ EffectContext = last;
115
+ return () => context.forEach((fn) => fn());
116
+ };
117
+ }
118
+
119
+ //#endregion
120
+ export { Observable, PENDING_KEYS, addListener, event, scope, watch };
121
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZS5qcyIsIm5hbWVzIjpbXSwic291cmNlcyI6WyIuLi8uLi9zcmMvb2JzZXJ2YWJsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVwZGF0ZSBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0ga2V5IC1cbiAqICAgLSBgc3RyaW5nYCAtIHByb3BlcnR5IHdoaWNoIGhhcyB1cGRhdGVkLlxuICogICAtIGBmYWxzZWAgLSBhIG5vcm1hbCB1cGRhdGUgaGFzIGNvbXBsZXRlZC5cbiAqICAgLSBgdHJ1ZWAgLSBpbml0aWFsIGV2ZW50OyBpbnN0YW5jZSBpcyByZWFkeS5cbiAqICAgLSBgbnVsbGAgLSB0ZXJtaW5hbCBldmVudDsgaW5zdGFuY2UgaXMgZXhwaXJlZC5cbiAqIEBwYXJhbSBzb3VyY2UgLSBJbnN0YW5jZSBvZiBTdGF0ZSBmb3Igd2hpY2ggdXBkYXRlIGhhcyBvY2N1cmVkLlxuICovXG50eXBlIE5vdGlmeTxUIGV4dGVuZHMgT2JzZXJ2YWJsZSA9IGFueT4gPSAoXG4gIHRoaXM6IFQsXG4gIGtleTogRXZlbnQsXG4gIHNvdXJjZTogVFxuKSA9PiAoKCkgPT4gdm9pZCkgfCBudWxsIHwgdm9pZDtcblxudHlwZSBFZmZlY3Q8VCBleHRlbmRzIE9ic2VydmFibGU+ID0gKFxuICBwcm94eTogVFxuKSA9PiAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpIHwgUHJvbWlzZTx2b2lkPiB8IG51bGwgfCB2b2lkO1xuXG50eXBlIEV2ZW50ID0gbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IGJvb2xlYW4gfCBzeW1ib2w7XG5cbnR5cGUgUHJvbWlzZUxpdGU8VCA9IHZvaWQ+ID0geyB0aGVuOiAoY2FsbGJhY2s6ICgpID0+IFQpID0+IFQgfTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgT2JzZXJ2YWJsZSB7XG4gIGV4cG9ydCB0eXBlIENhbGxiYWNrID0gKCkgPT4gdm9pZCB8IFByb21pc2VMaXRlO1xufVxuXG5pbnRlcmZhY2UgT2JzZXJ2YWJsZSB7XG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT2JzZXJ2YWJsZS5DYWxsYmFjaywgcmVxdWlyZWQ/OiBib29sZWFuKTogdGhpcyB8IHZvaWQ7XG59XG5cbmNvbnN0IE9ic2VydmFibGUgPSBTeW1ib2woJ29ic2VydmUnKTtcblxuLyoqIFBsYWNlaG9sZGVyIGV2ZW50IGRldGVybWluZXMgaWYgc3RhdGUgaXMgaW5pdGlhbGl6ZWQgb3Igbm90LiAqL1xuY29uc3Qgb25SZWFkeSA9ICgpID0+IG51bGw7XG5cbmNvbnN0IExJU1RFTkVSUyA9IG5ldyBXZWFrTWFwPFxuICBPYnNlcnZhYmxlLFxuICBNYXA8Tm90aWZ5LCBTZXQ8RXZlbnQ+IHwgdW5kZWZpbmVkPlxuPigpO1xuXG4vKiogRXZlbnRzIHBlbmRpbmcgZm9yIGEgZ2l2ZW4gb2JqZWN0LiAqL1xuY29uc3QgUEVORElORyA9IG5ldyBXZWFrTWFwPE9ic2VydmFibGUsIFNldDxFdmVudD4+KCk7XG5cbi8qKiBVcGRhdGUgcmVnaXN0ZXIuICovXG5jb25zdCBQRU5ESU5HX0tFWVMgPSBuZXcgV2Vha01hcDxPYnNlcnZhYmxlLCBTZXQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPj4oKTtcblxuLyoqIENlbnRyYWwgZXZlbnQgZGlzcGF0Y2guIEJ1bmNoZXMgYWxsIHVwZGF0ZXMgdG8gb2NjdXIgYXQgc2FtZSB0aW1lLiAqL1xuY29uc3QgRElTUEFUQ0ggPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbmZ1bmN0aW9uIGFkZExpc3RlbmVyPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPihcbiAgc3ViamVjdDogVCxcbiAgY2FsbGJhY2s6IE5vdGlmeTxUPixcbiAgc2VsZWN0PzogRXZlbnQgfCBTZXQ8RXZlbnQ+XG4pIHtcbiAgbGV0IGxpc3RlbmVycyA9IExJU1RFTkVSUy5nZXQoc3ViamVjdCkhO1xuXG4gIGlmICghbGlzdGVuZXJzKVxuICAgIExJU1RFTkVSUy5zZXQoc3ViamVjdCwgKGxpc3RlbmVycyA9IG5ldyBNYXAoW1tvblJlYWR5LCB1bmRlZmluZWRdXSkpKTtcblxuICBpZiAoc2VsZWN0ICE9PSB1bmRlZmluZWQgJiYgIShzZWxlY3QgaW5zdGFuY2VvZiBTZXQpKVxuICAgIHNlbGVjdCA9IG5ldyBTZXQoW3NlbGVjdF0pO1xuXG4gIGlmICghbGlzdGVuZXJzLmhhcyhvblJlYWR5KSAmJiAhc2VsZWN0KSB7XG4gICAgY2FsbGJhY2suY2FsbChzdWJqZWN0LCB0cnVlLCBzdWJqZWN0KTtcbiAgfVxuXG4gIGxpc3RlbmVycy5zZXQoY2FsbGJhY2ssIHNlbGVjdCk7XG5cbiAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUoY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBlbWl0KHN0YXRlOiBPYnNlcnZhYmxlLCBrZXk6IEV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IExJU1RFTkVSUy5nZXQoc3RhdGUpITtcbiAgY29uc3Qgbm90UmVhZHkgPSBsaXN0ZW5lcnMuaGFzKG9uUmVhZHkpO1xuXG4gIGlmIChrZXkgPT09IHRydWUgJiYgIW5vdFJlYWR5KSByZXR1cm47XG5cbiAgbGV0IHBlbmRpbmcgPSBQRU5ESU5HLmdldChzdGF0ZSk7XG5cbiAgaWYgKHBlbmRpbmcpIHtcbiAgICBwZW5kaW5nLmFkZChrZXkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIFBFTkRJTkcuc2V0KHN0YXRlLCAocGVuZGluZyA9IG5ldyBTZXQobm90UmVhZHkgPyBbdHJ1ZSwga2V5XSA6IFtrZXldKSkpO1xuXG4gIGZvciAoY29uc3Qga2V5IG9mIHBlbmRpbmcpXG4gICAgZm9yIChjb25zdCBbY2FsbGJhY2ssIGZpbHRlcl0gb2YgbGlzdGVuZXJzKVxuICAgICAgaWYgKCFmaWx0ZXIgfHwgZmlsdGVyLmhhcyhrZXkpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gY2FsbGJhY2suY2FsbChzdGF0ZSwga2V5LCBzdGF0ZSk7XG5cbiAgICAgICAgaWYgKGFmdGVyKSB7XG4gICAgICAgICAgZW5xdWV1ZShhZnRlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoYWZ0ZXIgPT09IG51bGwpIHtcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gIGlmIChrZXkgPT09IG51bGwpIGxpc3RlbmVycy5jbGVhcigpO1xuXG4gIFBFTkRJTkcuZGVsZXRlKHN0YXRlKTtcbn1cblxuZnVuY3Rpb24gZXZlbnQoXG4gIHN1YmplY3Q6IE9ic2VydmFibGUsXG4gIGtleT86IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IG51bGwsXG4gIHNpbGVudD86IGJvb2xlYW5cbikge1xuICBpZiAoa2V5ID09PSBudWxsKSByZXR1cm4gZW1pdChzdWJqZWN0LCBrZXkpO1xuXG4gIGlmICgha2V5KSByZXR1cm4gZW1pdChzdWJqZWN0LCB0cnVlKTtcblxuICBsZXQgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQoc3ViamVjdCk7XG5cbiAgaWYgKCFwZW5kaW5nKSB7XG4gICAgUEVORElOR19LRVlTLnNldChzdWJqZWN0LCAocGVuZGluZyA9IG5ldyBTZXQoKSkpO1xuXG4gICAgaWYgKCFzaWxlbnQpXG4gICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgZW1pdChzdWJqZWN0LCBmYWxzZSk7XG4gICAgICAgIFBFTkRJTkdfS0VZUy5kZWxldGUoc3ViamVjdCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHBlbmRpbmcuYWRkKGtleSk7XG5cbiAgaWYgKCFzaWxlbnQpIGVtaXQoc3ViamVjdCwga2V5KTtcbn1cblxuZnVuY3Rpb24gZW5xdWV1ZShldmVudEhhbmRsZXI6ICgpID0+IHZvaWQpIHtcbiAgaWYgKCFESVNQQVRDSC5zaXplKVxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgRElTUEFUQ0guZm9yRWFjaCgoZXZlbnQpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmVudCgpO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgRElTUEFUQ0guY2xlYXIoKTtcbiAgICB9LCAwKTtcblxuICBESVNQQVRDSC5hZGQoZXZlbnRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzaWRlLWVmZmVjdCB3aGljaCB3aWxsIHVwZGF0ZSB3aGVuZXZlciB2YWx1ZXMgYWNjZXNzZWQgY2hhbmdlLlxuICogQ2FsbGJhY2sgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFuZCB3aGVuZXZlciB2YWx1ZXMgYXJlIHN0YWxlLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgLSBJbnN0YW5jZSBvZiBTdGF0ZSB0byBvYnNlcnZlLlxuICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gaW52b2tlIHdoZW4gdmFsdWVzIGNoYW5nZS5cbiAqIEBwYXJhbSByZXF1aXJlVmFsdWVzIC0gSWYgYHRydWVgIHdpbGwgdGhyb3cgaWYgYWNjZXNzaW5nIGEgdmFsdWUgd2hpY2ggaXMgYHVuZGVmaW5lZGAuXG4gKi9cbmZ1bmN0aW9uIHdhdGNoPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPihcbiAgdGFyZ2V0OiBULFxuICBjYWxsYmFjazogRWZmZWN0PFJlcXVpcmVkPFQ+PixcbiAgcmVxdWlyZVZhbHVlczogdHJ1ZVxuKTogKCkgPT4gdm9pZDtcblxuZnVuY3Rpb24gd2F0Y2g8VCBleHRlbmRzIE9ic2VydmFibGU+KFxuICB0YXJnZXQ6IFQsXG4gIGNhbGxiYWNrOiBFZmZlY3Q8VD4sXG4gIHJlY3Vyc2l2ZT86IGJvb2xlYW5cbik6ICgpID0+IHZvaWQ7XG5cbmZ1bmN0aW9uIHdhdGNoPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPihcbiAgdGFyZ2V0OiBULFxuICBjYWxsYmFjazogRWZmZWN0PFQ+LFxuICBhcmd1bWVudD86IGJvb2xlYW5cbikge1xuICBsZXQgdW5zZXQ6ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNldDogKCgpID0+IHZvaWQpIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBpbnZva2UoKSB7XG4gICAgbGV0IGlnbm9yZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBmdW5jdGlvbiBvblVwZGF0ZSgpOiB2b2lkIHwgUHJvbWlzZUxpdGU8dm9pZD4ge1xuICAgICAgaWYgKGlnbm9yZSB8fCByZXNldCA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBpZ25vcmUgPSB0cnVlO1xuXG4gICAgICBpZiAocmVzZXQgJiYgdW5zZXQpIHtcbiAgICAgICAgdW5zZXQodHJ1ZSk7XG4gICAgICAgIHVuc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICBlbnF1ZXVlKGludm9rZSk7XG4gICAgICByZXR1cm4geyB0aGVuOiBlbnF1ZXVlIH07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXQgPSBhcmd1bWVudCA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBzY29wZSgpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gY2FsbGJhY2soXG4gICAgICAgIHRhcmdldFtPYnNlcnZhYmxlXShvblVwZGF0ZSwgYXJndW1lbnQgPT09IHRydWUpIGFzIFRcbiAgICAgICk7XG4gICAgICBjb25zdCBmbHVzaCA9IGV4aXQgPyBleGl0KCkgOiAoKSA9PiB7fTtcblxuICAgICAgaWdub3JlID0gZmFsc2U7XG4gICAgICByZXNldCA9IG91dHB1dCA9PT0gbnVsbCA/IG51bGwgOiBpbnZva2U7XG4gICAgICB1bnNldCA9IChrZXkpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBvdXRwdXQgPT0gJ2Z1bmN0aW9uJykgb3V0cHV0KGtleSk7XG5cbiAgICAgICAgZmx1c2goKTtcbiAgICAgIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoZXJyIGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICByZXNldCA9IHVuZGVmaW5lZDtcbiAgICAgICAgZXJyLnRoZW4oaW52b2tlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCkge1xuICAgIGlmICh1bnNldCkgdW5zZXQoZmFsc2UpO1xuXG4gICAgcmVzZXQgPSBudWxsO1xuICB9XG5cbiAgaWYgKEVmZmVjdENvbnRleHQgJiYgYXJndW1lbnQgIT09IGZhbHNlKSBFZmZlY3RDb250ZXh0LmFkZChjbGVhbnVwKTtcblxuICBhZGRMaXN0ZW5lcih0YXJnZXQsIChrZXkpID0+IHtcbiAgICBpZiAoa2V5ID09PSB0cnVlKSBpbnZva2UoKTtcbiAgICBlbHNlIGlmICghcmVzZXQpIHJldHVybiByZXNldDtcblxuICAgIGlmIChrZXkgPT09IG51bGwgJiYgdW5zZXQpIHVuc2V0KG51bGwpO1xuICB9KTtcblxuICByZXR1cm4gY2xlYW51cDtcbn1cblxubGV0IEVmZmVjdENvbnRleHQ6IFNldDwoKSA9PiB2b2lkPiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIHNjb3BlKCkge1xuICBjb25zdCBsYXN0ID0gRWZmZWN0Q29udGV4dDtcbiAgY29uc3QgY29udGV4dCA9IChFZmZlY3RDb250ZXh0ID0gbmV3IFNldCgpKTtcblxuICByZXR1cm4gKCkgPT4ge1xuICAgIEVmZmVjdENvbnRleHQgPSBsYXN0O1xuICAgIHJldHVybiAoKSA9PiBjb250ZXh0LmZvckVhY2goKGZuKSA9PiBmbigpKTtcbiAgfTtcbn1cblxuZXhwb3J0IHsgYWRkTGlzdGVuZXIsIHdhdGNoLCBldmVudCwgTm90aWZ5LCBQRU5ESU5HX0tFWVMsIE9ic2VydmFibGUgfTtcbiJdLCJtYXBwaW5ncyI6IjtBQWdDQSxNQUFNLGFBQWEsT0FBTyxVQUFVOztBQUdwQyxNQUFNLGdCQUFnQjtBQUV0QixNQUFNLDRCQUFZLElBQUksU0FHbkI7O0FBR0gsTUFBTSwwQkFBVSxJQUFJLFNBQWlDOztBQUdyRCxNQUFNLCtCQUFlLElBQUksU0FBb0Q7O0FBRzdFLE1BQU0sMkJBQVcsSUFBSSxLQUFpQjtBQUV0QyxTQUFTLFlBQ1AsU0FDQSxVQUNBLFFBQ0E7Q0FDQSxJQUFJLFlBQVksVUFBVSxJQUFJLFFBQVE7QUFFdEMsS0FBSSxDQUFDLFVBQ0gsV0FBVSxJQUFJLFNBQVUsWUFBWSxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsT0FBVSxDQUFDLENBQUMsQ0FBRTtBQUV2RSxLQUFJLFdBQVcsVUFBYSxFQUFFLGtCQUFrQixLQUM5QyxVQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQztBQUU1QixLQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsSUFBSSxDQUFDLE9BQzlCLFVBQVMsS0FBSyxTQUFTLE1BQU0sUUFBUTtBQUd2QyxXQUFVLElBQUksVUFBVSxPQUFPO0FBRS9CLGNBQWEsVUFBVSxPQUFPLFNBQVM7O0FBR3pDLFNBQVMsS0FBSyxPQUFtQixLQUFrQjtDQUNqRCxNQUFNLFlBQVksVUFBVSxJQUFJLE1BQU07Q0FDdEMsTUFBTSxXQUFXLFVBQVUsSUFBSSxRQUFRO0FBRXZDLEtBQUksUUFBUSxRQUFRLENBQUMsU0FBVTtDQUUvQixJQUFJLFVBQVUsUUFBUSxJQUFJLE1BQU07QUFFaEMsS0FBSSxTQUFTO0FBQ1gsVUFBUSxJQUFJLElBQUk7QUFDaEI7O0FBR0YsU0FBUSxJQUFJLE9BQVEsVUFBVSxJQUFJLElBQUksV0FBVyxDQUFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUU7QUFFdkUsTUFBSyxNQUFNLE9BQU8sUUFDaEIsTUFBSyxNQUFNLENBQUMsVUFBVSxXQUFXLFVBQy9CLEtBQUksQ0FBQyxVQUFVLE9BQU8sSUFBSSxJQUFJLEVBQUU7RUFDOUIsTUFBTSxRQUFRLFNBQVMsS0FBSyxPQUFPLEtBQUssTUFBTTtBQUU5QyxNQUFJLE1BQ0YsU0FBUSxNQUFNO1dBQ0wsVUFBVSxLQUNuQixXQUFVLE9BQU8sU0FBUzs7QUFJbEMsS0FBSSxRQUFRLEtBQU0sV0FBVSxPQUFPO0FBRW5DLFNBQVEsT0FBTyxNQUFNOztBQUd2QixTQUFTLE1BQ1AsU0FDQSxLQUNBLFFBQ0E7QUFDQSxLQUFJLFFBQVEsS0FBTSxRQUFPLEtBQUssU0FBUyxJQUFJO0FBRTNDLEtBQUksQ0FBQyxJQUFLLFFBQU8sS0FBSyxTQUFTLEtBQUs7Q0FFcEMsSUFBSSxVQUFVLGFBQWEsSUFBSSxRQUFRO0FBRXZDLEtBQUksQ0FBQyxTQUFTO0FBQ1osZUFBYSxJQUFJLFNBQVUsMEJBQVUsSUFBSSxLQUFLLENBQUU7QUFFaEQsTUFBSSxDQUFDLE9BQ0gsZUFBYztBQUNaLFFBQUssU0FBUyxNQUFNO0FBQ3BCLGdCQUFhLE9BQU8sUUFBUTtJQUM1Qjs7QUFHTixTQUFRLElBQUksSUFBSTtBQUVoQixLQUFJLENBQUMsT0FBUSxNQUFLLFNBQVMsSUFBSTs7QUFHakMsU0FBUyxRQUFRLGNBQTBCO0FBQ3pDLEtBQUksQ0FBQyxTQUFTLEtBQ1osa0JBQWlCO0FBQ2YsV0FBUyxTQUFTLFVBQVU7QUFDMUIsT0FBSTtBQUNGLFdBQU87WUFDQSxLQUFLO0FBQ1osWUFBUSxNQUFNLElBQUk7O0lBRXBCO0FBQ0YsV0FBUyxPQUFPO0lBQ2YsRUFBRTtBQUVQLFVBQVMsSUFBSSxhQUFhOztBQXVCNUIsU0FBUyxNQUNQLFFBQ0EsVUFDQSxVQUNBO0NBQ0EsSUFBSTtDQUNKLElBQUk7Q0FFSixTQUFTLFNBQVM7RUFDaEIsSUFBSSxTQUFrQjtFQUV0QixTQUFTLFdBQXFDO0FBQzVDLE9BQUksVUFBVSxVQUFVLEtBQU07QUFFOUIsWUFBUztBQUVULE9BQUksU0FBUyxPQUFPO0FBQ2xCLFVBQU0sS0FBSztBQUNYLFlBQVE7O0FBR1YsV0FBUSxPQUFPO0FBQ2YsVUFBTyxFQUFFLE1BQU0sU0FBUzs7QUFHMUIsTUFBSTtHQUNGLE1BQU0sT0FBTyxhQUFhLFFBQVEsU0FBWSxPQUFPO0dBQ3JELE1BQU0sU0FBUyxTQUNiLE9BQU8sWUFBWSxVQUFVLGFBQWEsS0FBSyxDQUNoRDtHQUNELE1BQU0sUUFBUSxPQUFPLE1BQU0sU0FBUztBQUVwQyxZQUFTO0FBQ1QsV0FBUSxXQUFXLE9BQU8sT0FBTztBQUNqQyxZQUFTLFFBQVE7QUFDZixRQUFJLE9BQU8sVUFBVSxXQUFZLFFBQU8sSUFBSTtBQUU1QyxXQUFPOztXQUVGLEtBQUs7QUFDWixPQUFJLGVBQWUsU0FBUztBQUMxQixZQUFRO0FBQ1IsUUFBSSxLQUFLLE9BQU87U0FFaEIsT0FBTTs7O0NBS1osU0FBUyxVQUFVO0FBQ2pCLE1BQUksTUFBTyxPQUFNLE1BQU07QUFFdkIsVUFBUTs7QUFHVixLQUFJLGlCQUFpQixhQUFhLE1BQU8sZUFBYyxJQUFJLFFBQVE7QUFFbkUsYUFBWSxTQUFTLFFBQVE7QUFDM0IsTUFBSSxRQUFRLEtBQU0sU0FBUTtXQUNqQixDQUFDLE1BQU8sUUFBTztBQUV4QixNQUFJLFFBQVEsUUFBUSxNQUFPLE9BQU0sS0FBSztHQUN0QztBQUVGLFFBQU87O0FBR1QsSUFBSTtBQUVKLFNBQWdCLFFBQVE7Q0FDdEIsTUFBTSxPQUFPO0NBQ2IsTUFBTSxVQUFXLGdDQUFnQixJQUFJLEtBQUs7QUFFMUMsY0FBYTtBQUNYLGtCQUFnQjtBQUNoQixlQUFhLFFBQVEsU0FBUyxPQUFPLElBQUksQ0FBQyJ9