@expressive/mvc 0.64.0 → 0.64.2
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.
- package/dist/esm/control.js +5 -4
- package/dist/esm/model.js +2 -2
- package/dist/index.d.ts +9 -3
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/esm/control.js
CHANGED
|
@@ -77,14 +77,15 @@ function createEffect(target, callback, argument) {
|
|
|
77
77
|
function invoke() {
|
|
78
78
|
let stale;
|
|
79
79
|
function onUpdate() {
|
|
80
|
-
if (stale)
|
|
81
|
-
return
|
|
80
|
+
if (stale || reset === null)
|
|
81
|
+
return;
|
|
82
82
|
stale = true;
|
|
83
83
|
if (reset && unset) {
|
|
84
84
|
unset(true);
|
|
85
85
|
unset = void 0;
|
|
86
86
|
}
|
|
87
|
-
|
|
87
|
+
enqueue(invoke);
|
|
88
|
+
return { then: enqueue };
|
|
88
89
|
}
|
|
89
90
|
const subscriber = target[Observable](onUpdate, argument === true);
|
|
90
91
|
try {
|
|
@@ -143,4 +144,4 @@ export {
|
|
|
143
144
|
enter,
|
|
144
145
|
event
|
|
145
146
|
};
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRyb2wudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogVXBkYXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogXG4gKiBAcGFyYW0ga2V5IC1cbiAqICAgLSBgc3RyaW5nYCAtIHByb3BlcnR5IHdoaWNoIGhhcyB1cGRhdGVkLlxuICogICAtIGBmYWxzZWAgLSBhIG5vcm1hbCB1cGRhdGUgaGFzIGNvbXBsZXRlZC5cbiAqICAgLSBgdHJ1ZWAgLSBpbml0aWFsIGV2ZW50OyBpbnN0YW5jZSBpcyByZWFkeS5cbiAqICAgLSBgbnVsbGAgLSB0ZXJtaW5hbCBldmVudDsgaW5zdGFuY2UgaXMgZXhwaXJlZC5cbiAqIEBwYXJhbSBzb3VyY2UgLSBJbnN0YW5jZSBvZiBNb2RlbCBmb3Igd2hpY2ggdXBkYXRlIGhhcyBvY2N1cmVkLlxuICovXG50eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBPYnNlcnZhYmxlID0gYW55PiA9IFxuICAodGhpczogVCwga2V5OiB1bmtub3duLCBzb3VyY2U6IFQpID0+ICgoKSA9PiB2b2lkKSB8IG51bGwgfCB2b2lkO1xuXG50eXBlIEVmZmVjdDxUIGV4dGVuZHMgT2JzZXJ2YWJsZT4gPSAodGhpczogVCwgcHJveHk6IFQpID0+XG4gICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCkgfCBQcm9taXNlPHZvaWQ+IHwgbnVsbCB8IHZvaWQ7XG5cbnR5cGUgRXZlbnQgPSBudW1iZXIgfCBzdHJpbmcgfCBudWxsIHwgYm9vbGVhbiB8IHN5bWJvbDtcblxuaW50ZXJmYWNlIE9ic2VydmFibGUge1xuICBbT2JzZXJ2YWJsZV0oY2FsbGJhY2s6IE9uVXBkYXRlLCByZXF1aXJlZD86IGJvb2xlYW4pOiB0aGlzO1xufVxuXG5jb25zdCBPYnNlcnZhYmxlID0gU3ltYm9sKFwib2JzZXJ2ZVwiKTtcblxuLyoqIFBsYWNlaG9sZGVyIGV2ZW50IGRldGVybWluZXMgaWYgbW9kZWwgaXMgaW5pdGlhbGl6ZWQgb3Igbm90LiAqL1xuY29uc3Qgb25SZWFkeSA9ICgpID0+IG51bGw7XG5cbmNvbnN0IExJU1RFTkVSUyA9IG5ldyBXZWFrTWFwPE9ic2VydmFibGUsIE1hcDxPblVwZGF0ZSwgU2V0PEV2ZW50PiB8IHVuZGVmaW5lZD4+KCk7XG5cbi8qKiBFdmVudHMgcGVuZGluZyBmb3IgYSBnaXZlbiBvYmplY3QuICovXG5jb25zdCBQRU5ESU5HID0gbmV3IFdlYWtNYXA8T2JzZXJ2YWJsZSwgU2V0PEV2ZW50Pj4oKTtcblxuLyoqIFVwZGF0ZSByZWdpc3Rlci4gKi9cbmNvbnN0IFBFTkRJTkdfS0VZUyA9IG5ldyBXZWFrTWFwPE9ic2VydmFibGUsIFNldDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2w+PigpO1xuXG4vKiogQ2VudHJhbCBldmVudCBkaXNwYXRjaC4gQnVuY2hlcyBhbGwgdXBkYXRlcyB0byBvY2N1ciBhdCBzYW1lIHRpbWUuICovXG5jb25zdCBESVNQQVRDSCA9IG5ldyBTZXQ8KCkgPT4gdm9pZD4oKTtcblxuZnVuY3Rpb24gYWRkTGlzdGVuZXI8VCBleHRlbmRzIE9ic2VydmFibGU+KFxuICBzdWJqZWN0OiBULCBjYWxsYmFjazogT25VcGRhdGU8VD4sIHNlbGVjdD86IEV2ZW50IHwgU2V0PEV2ZW50Pil7XG5cbiAgbGV0IGxpc3RlbmVycyA9IExJU1RFTkVSUy5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKCFsaXN0ZW5lcnMpXG4gICAgTElTVEVORVJTLnNldChzdWJqZWN0LCBsaXN0ZW5lcnMgPSBuZXcgTWFwKFtbb25SZWFkeSwgdW5kZWZpbmVkXV0pKTtcblxuICBpZihzZWxlY3QgIT09IHVuZGVmaW5lZCAmJiAhKHNlbGVjdCBpbnN0YW5jZW9mIFNldCkpXG4gICAgc2VsZWN0ID0gbmV3IFNldChbc2VsZWN0XSk7XG5cbiAgaWYoIWxpc3RlbmVycy5oYXMob25SZWFkeSkgJiYgIXNlbGVjdClcbiAgICBjYWxsYmFjay5jYWxsKHN1YmplY3QsIHRydWUsIHN1YmplY3QpO1xuXG4gIGxpc3RlbmVycy5zZXQoY2FsbGJhY2ssIHNlbGVjdCk7XG5cbiAgcmV0dXJuICgpID0+IGxpc3RlbmVycy5kZWxldGUoY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBlbWl0KG1vZGVsOiBPYnNlcnZhYmxlLCBrZXk6IEV2ZW50KTogdm9pZCB7XG4gIGNvbnN0IGxpc3RlbmVycyA9IExJU1RFTkVSUy5nZXQobW9kZWwpITtcbiAgY29uc3Qgbm90UmVhZHkgPSBsaXN0ZW5lcnMuaGFzKG9uUmVhZHkpO1xuXG4gIGlmKGtleSA9PT0gdHJ1ZSAmJiAhbm90UmVhZHkpXG4gICAgcmV0dXJuO1xuXG4gIGxldCBwZW5kaW5nID0gUEVORElORy5nZXQobW9kZWwpO1xuXG4gIGlmKHBlbmRpbmcpe1xuICAgIHBlbmRpbmcuYWRkKGtleSk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgUEVORElORy5zZXQobW9kZWwsIHBlbmRpbmcgPSBuZXcgU2V0KG5vdFJlYWR5ID8gW3RydWUsIGtleV0gOiBba2V5XSkpO1xuXG4gIGZvcihjb25zdCBrZXkgb2YgcGVuZGluZylcbiAgICBmb3IoY29uc3QgW2NhbGxiYWNrLCBmaWx0ZXJdIG9mIGxpc3RlbmVycylcbiAgICAgIGlmKCFmaWx0ZXIgfHwgZmlsdGVyLmhhcyhrZXkpKXtcbiAgICAgICAgY29uc3QgYWZ0ZXIgPSBjYWxsYmFjay5jYWxsKG1vZGVsLCBrZXksIG1vZGVsKTtcblxuICAgICAgICBpZihhZnRlcilcbiAgICAgICAgICBlbnF1ZXVlKGFmdGVyKTtcblxuICAgICAgICBlbHNlIGlmKGFmdGVyID09PSBudWxsKVxuICAgICAgICAgIGxpc3RlbmVycy5kZWxldGUoY2FsbGJhY2spO1xuICAgICAgfVxuXG4gIGlmKGtleSA9PT0gbnVsbClcbiAgICBsaXN0ZW5lcnMuY2xlYXIoKTtcbiAgXG4gIFBFTkRJTkcuZGVsZXRlKG1vZGVsKTtcbn1cblxuZnVuY3Rpb24gZXZlbnQoXG4gIHN1YmplY3Q6IE9ic2VydmFibGUsXG4gIGtleT86IHN0cmluZyB8IG51bWJlciB8IHN5bWJvbCB8IG51bGwsXG4gIHNpbGVudD86IGJvb2xlYW4pe1xuXG4gIGlmKGtleSA9PT0gbnVsbClcbiAgICByZXR1cm4gZW1pdChzdWJqZWN0LCBrZXkpO1xuXG4gIGlmKCFrZXkpXG4gICAgcmV0dXJuIGVtaXQoc3ViamVjdCwgdHJ1ZSk7XG5cbiAgbGV0IHBlbmRpbmcgPSBQRU5ESU5HX0tFWVMuZ2V0KHN1YmplY3QpO1xuXG4gIGlmKCFwZW5kaW5nKXtcbiAgICBQRU5ESU5HX0tFWVMuc2V0KHN1YmplY3QsIHBlbmRpbmcgPSBuZXcgU2V0KCkpO1xuXG4gICAgaWYoIXNpbGVudClcbiAgICAgIGVucXVldWUoKCkgPT4ge1xuICAgICAgICBlbWl0KHN1YmplY3QsIGZhbHNlKTtcbiAgICAgICAgUEVORElOR19LRVlTLmRlbGV0ZShzdWJqZWN0KVxuICAgICAgfSlcbiAgfVxuXG4gIHBlbmRpbmcuYWRkKGtleSk7XG5cbiAgaWYoIXNpbGVudClcbiAgICBlbWl0KHN1YmplY3QsIGtleSk7XG59XG5cbmZ1bmN0aW9uIGVucXVldWUoZXZlbnRIYW5kbGVyOiAoKCkgPT4gdm9pZCkpe1xuICBpZighRElTUEFUQ0guc2l6ZSlcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIERJU1BBVENILmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGV2ZW50KCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyKXtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgRElTUEFUQ0guY2xlYXIoKTtcbiAgICB9LCAwKTtcblxuICBESVNQQVRDSC5hZGQoZXZlbnRIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzaWRlLWVmZmVjdCB3aGljaCB3aWxsIHVwZGF0ZSB3aGVuZXZlciB2YWx1ZXMgYWNjZXNzZWQgY2hhbmdlLlxuICogQ2FsbGJhY2sgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IGFuZCB3aGVuZXZlciB2YWx1ZXMgYXJlIHN0YWxlLlxuICogXG4gKiBAcGFyYW0gdGFyZ2V0IC0gSW5zdGFuY2Ugb2YgTW9kZWwgdG8gb2JzZXJ2ZS5cbiAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGludm9rZSB3aGVuIHZhbHVlcyBjaGFuZ2UuXG4gKiBAcGFyYW0gcmVxdWlyZVZhbHVlcyAtIElmIGB0cnVlYCB3aWxsIHRocm93IGlmIGFjY2Vzc2luZyBhIHZhbHVlIHdoaWNoIGlzIGB1bmRlZmluZWRgLlxuICovXG5mdW5jdGlvbiBjcmVhdGVFZmZlY3Q8VCBleHRlbmRzIE9ic2VydmFibGU+KHRhcmdldDogVCwgY2FsbGJhY2s6IEVmZmVjdDxSZXF1aXJlZDxUPj4sIHJlcXVpcmVWYWx1ZXM6IHRydWUpOiAoKSA9PiB2b2lkO1xuZnVuY3Rpb24gY3JlYXRlRWZmZWN0PFQgZXh0ZW5kcyBPYnNlcnZhYmxlPih0YXJnZXQ6IFQsIGNhbGxiYWNrOiBFZmZlY3Q8VD4sIHJlY3Vyc2l2ZT86IGJvb2xlYW4pOiAoKSA9PiB2b2lkO1xuZnVuY3Rpb24gY3JlYXRlRWZmZWN0PFQgZXh0ZW5kcyBPYnNlcnZhYmxlPih0YXJnZXQ6IFQsIGNhbGxiYWNrOiBFZmZlY3Q8VD4sIGFyZ3VtZW50PzogYm9vbGVhbil7XG4gIGxldCB1bnNldDogKCh1cGRhdGU6IGJvb2xlYW4gfCBudWxsKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlc2V0OiAoKCkgPT4gdm9pZCkgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGZ1bmN0aW9uIGludm9rZSgpe1xuICAgIGxldCBzdGFsZTogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGZ1bmN0aW9uIG9uVXBkYXRlKCkge1xuICAgICAgaWYgKHN0YWxlKVxuICAgICAgICByZXR1cm4gbnVsbDtcblxuICAgICAgc3RhbGUgPSB0cnVlO1xuXG4gICAgICBpZiAocmVzZXQgJiYgdW5zZXQpIHtcbiAgICAgICAgdW5zZXQodHJ1ZSk7XG4gICAgICAgIHVuc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzZXQ7XG4gICAgfVxuXG4gICAgY29uc3Qgc3Vic2NyaWJlciA9IHRhcmdldFtPYnNlcnZhYmxlXShvblVwZGF0ZSwgYXJndW1lbnQgPT09IHRydWUpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGV4aXQgPSBlbnRlcihhcmd1bWVudCA9PT0gZmFsc2UpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gY2FsbGJhY2suY2FsbChzdWJzY3JpYmVyLCBzdWJzY3JpYmVyKTtcbiAgICAgIGNvbnN0IGZsdXNoID0gZXhpdCgpO1xuXG4gICAgICByZXNldCA9IG91dHB1dCA9PT0gbnVsbCA/IG51bGwgOiBpbnZva2U7XG4gICAgICB1bnNldCA9IGtleSA9PiB7XG4gICAgICAgIGlmKHR5cGVvZiBvdXRwdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgIG91dHB1dChrZXkpO1xuXG4gICAgICAgIGZsdXNoKCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNhdGNoKGVycil7XG4gICAgICBpZihlcnIgaW5zdGFuY2VvZiBQcm9taXNlKXtcbiAgICAgICAgcmVzZXQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGVyci50aGVuKGludm9rZSk7XG4gICAgICB9XG4gICAgICBlbHNlXG4gICAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwKCl7XG4gICAgaWYodW5zZXQpXG4gICAgICB1bnNldChmYWxzZSk7XG5cbiAgICByZXNldCA9IG51bGw7XG4gIH07XG5cbiAgaWYoRWZmZWN0Q29udGV4dCAmJiBhcmd1bWVudCAhPT0gZmFsc2UpXG4gICAgRWZmZWN0Q29udGV4dC5hZGQoY2xlYW51cCk7XG5cbiAgYWRkTGlzdGVuZXIodGFyZ2V0LCBrZXkgPT4ge1xuICAgIGlmKGtleSA9PT0gdHJ1ZSlcbiAgICAgIGludm9rZSgpO1xuXG4gICAgZWxzZSBpZighcmVzZXQpXG4gICAgICByZXR1cm4gcmVzZXQ7XG5cbiAgICBpZihrZXkgPT09IG51bGwgJiYgdW5zZXQpXG4gICAgICB1bnNldChudWxsKTtcbiAgfSk7XG4gIFxuICByZXR1cm4gY2xlYW51cDtcbn1cblxubGV0IEVmZmVjdENvbnRleHQ6IFNldDwoKSA9PiB2b2lkPiB8IHVuZGVmaW5lZDtcblxuZXhwb3J0IGZ1bmN0aW9uIGVudGVyKGlnbm9yZT86IGJvb2xlYW4pe1xuICBpZihpZ25vcmUpXG4gICAgcmV0dXJuICgpID0+ICgpID0+IHt9O1xuXG4gIGNvbnN0IGxhc3QgPSBFZmZlY3RDb250ZXh0O1xuICBjb25zdCBjb250ZXh0ID0gRWZmZWN0Q29udGV4dCA9IG5ldyBTZXQ7XG5cbiAgcmV0dXJuICgpID0+IHtcbiAgICBFZmZlY3RDb250ZXh0ID0gbGFzdDtcbiAgICByZXR1cm4gKCkgPT4gY29udGV4dC5mb3JFYWNoKGZuID0+IGZuKCkpO1xuICB9XG59XG5cbmV4cG9ydCB7XG4gIGFkZExpc3RlbmVyLFxuICBjcmVhdGVFZmZlY3QsXG4gIGV2ZW50LFxuICBPblVwZGF0ZSxcbiAgUEVORElOR19LRVlTLFxuICBPYnNlcnZhYmxlXG59Il0sCiAgIm1hcHBpbmdzIjogIkFBc0JBLE1BQU0sYUFBYSxPQUFPLFNBQVM7QUFHbkMsTUFBTSxVQUFVLE1BQU07QUFFdEIsTUFBTSxZQUFZLG9CQUFJLFFBQTJEO0FBR2pGLE1BQU0sVUFBVSxvQkFBSSxRQUFnQztBQUdwRCxNQUFNLGVBQWUsb0JBQUksUUFBbUQ7QUFHNUUsTUFBTSxXQUFXLG9CQUFJLElBQWdCO0FBRXJDLFNBQVMsWUFDUCxTQUFZLFVBQXVCLFFBQTRCO0FBRS9ELE1BQUksWUFBWSxVQUFVLElBQUksT0FBTztBQUVyQyxNQUFHLENBQUM7QUFDRixjQUFVLElBQUksU0FBUyxZQUFZLG9CQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsTUFBUyxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFHLFdBQVcsVUFBYSxFQUFFLGtCQUFrQjtBQUM3QyxhQUFTLG9CQUFJLElBQUksQ0FBQyxNQUFNLENBQUM7QUFF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
|
|
147
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL2NvbnRyb2wudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogVXBkYXRlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICogXG4gKiBAcGFyYW0ga2V5IC1cbiAqICAgLSBgc3RyaW5nYCAtIHByb3BlcnR5IHdoaWNoIGhhcyB1cGRhdGVkLlxuICogICAtIGBmYWxzZWAgLSBhIG5vcm1hbCB1cGRhdGUgaGFzIGNvbXBsZXRlZC5cbiAqICAgLSBgdHJ1ZWAgLSBpbml0aWFsIGV2ZW50OyBpbnN0YW5jZSBpcyByZWFkeS5cbiAqICAgLSBgbnVsbGAgLSB0ZXJtaW5hbCBldmVudDsgaW5zdGFuY2UgaXMgZXhwaXJlZC5cbiAqIEBwYXJhbSBzb3VyY2UgLSBJbnN0YW5jZSBvZiBNb2RlbCBmb3Igd2hpY2ggdXBkYXRlIGhhcyBvY2N1cmVkLlxuICovXG50eXBlIE9uVXBkYXRlPFQgZXh0ZW5kcyBPYnNlcnZhYmxlID0gYW55PiA9IFxuICAodGhpczogVCwga2V5OiBFdmVudCwgc291cmNlOiBUKSA9PiAoKCkgPT4gdm9pZCkgfCBudWxsIHwgdm9pZDtcblxudHlwZSBFZmZlY3Q8VCBleHRlbmRzIE9ic2VydmFibGU+ID0gKHRoaXM6IFQsIHByb3h5OiBUKSA9PlxuICAoKHVwZGF0ZTogYm9vbGVhbiB8IG51bGwpID0+IHZvaWQpIHwgUHJvbWlzZTx2b2lkPiB8IG51bGwgfCB2b2lkO1xuXG50eXBlIEV2ZW50ID0gbnVtYmVyIHwgc3RyaW5nIHwgbnVsbCB8IGJvb2xlYW4gfCBzeW1ib2w7XG5cbnR5cGUgUHJvbWlzZUxpdGU8VCA9IHZvaWQ+ID0geyB0aGVuOiAoY2FsbGJhY2s6ICgpID0+IFQpID0+IFQgfTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgT2JzZXJ2YWJsZSB7XG4gIGV4cG9ydCB0eXBlIENhbGxiYWNrID0gKCkgPT4gdm9pZCB8IFByb21pc2VMaXRlO1xufVxuXG5pbnRlcmZhY2UgT2JzZXJ2YWJsZSB7XG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT2JzZXJ2YWJsZS5DYWxsYmFjaywgcmVxdWlyZWQ/OiBib29sZWFuKTogdGhpcztcbn1cblxuY29uc3QgT2JzZXJ2YWJsZSA9IFN5bWJvbChcIm9ic2VydmVcIik7XG5cbi8qKiBQbGFjZWhvbGRlciBldmVudCBkZXRlcm1pbmVzIGlmIG1vZGVsIGlzIGluaXRpYWxpemVkIG9yIG5vdC4gKi9cbmNvbnN0IG9uUmVhZHkgPSAoKSA9PiBudWxsO1xuXG5jb25zdCBMSVNURU5FUlMgPSBuZXcgV2Vha01hcDxPYnNlcnZhYmxlLCBNYXA8T25VcGRhdGUsIFNldDxFdmVudD4gfCB1bmRlZmluZWQ+PigpO1xuXG4vKiogRXZlbnRzIHBlbmRpbmcgZm9yIGEgZ2l2ZW4gb2JqZWN0LiAqL1xuY29uc3QgUEVORElORyA9IG5ldyBXZWFrTWFwPE9ic2VydmFibGUsIFNldDxFdmVudD4+KCk7XG5cbi8qKiBVcGRhdGUgcmVnaXN0ZXIuICovXG5jb25zdCBQRU5ESU5HX0tFWVMgPSBuZXcgV2Vha01hcDxPYnNlcnZhYmxlLCBTZXQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sPj4oKTtcblxuLyoqIENlbnRyYWwgZXZlbnQgZGlzcGF0Y2guIEJ1bmNoZXMgYWxsIHVwZGF0ZXMgdG8gb2NjdXIgYXQgc2FtZSB0aW1lLiAqL1xuY29uc3QgRElTUEFUQ0ggPSBuZXcgU2V0PCgpID0+IHZvaWQ+KCk7XG5cbmZ1bmN0aW9uIGFkZExpc3RlbmVyPFQgZXh0ZW5kcyBPYnNlcnZhYmxlPihcbiAgc3ViamVjdDogVCwgY2FsbGJhY2s6IE9uVXBkYXRlPFQ+LCBzZWxlY3Q/OiBFdmVudCB8IFNldDxFdmVudD4pe1xuXG4gIGxldCBsaXN0ZW5lcnMgPSBMSVNURU5FUlMuZ2V0KHN1YmplY3QpITtcblxuICBpZighbGlzdGVuZXJzKVxuICAgIExJU1RFTkVSUy5zZXQoc3ViamVjdCwgbGlzdGVuZXJzID0gbmV3IE1hcChbW29uUmVhZHksIHVuZGVmaW5lZF1dKSk7XG5cbiAgaWYoc2VsZWN0ICE9PSB1bmRlZmluZWQgJiYgIShzZWxlY3QgaW5zdGFuY2VvZiBTZXQpKVxuICAgIHNlbGVjdCA9IG5ldyBTZXQoW3NlbGVjdF0pO1xuXG4gIGlmKCFsaXN0ZW5lcnMuaGFzKG9uUmVhZHkpICYmICFzZWxlY3QpXG4gICAgY2FsbGJhY2suY2FsbChzdWJqZWN0LCB0cnVlLCBzdWJqZWN0KTtcblxuICBsaXN0ZW5lcnMuc2V0KGNhbGxiYWNrLCBzZWxlY3QpO1xuXG4gIHJldHVybiAoKSA9PiBsaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbn1cblxuZnVuY3Rpb24gZW1pdChtb2RlbDogT2JzZXJ2YWJsZSwga2V5OiBFdmVudCk6IHZvaWQge1xuICBjb25zdCBsaXN0ZW5lcnMgPSBMSVNURU5FUlMuZ2V0KG1vZGVsKSE7XG4gIGNvbnN0IG5vdFJlYWR5ID0gbGlzdGVuZXJzLmhhcyhvblJlYWR5KTtcblxuICBpZihrZXkgPT09IHRydWUgJiYgIW5vdFJlYWR5KVxuICAgIHJldHVybjtcblxuICBsZXQgcGVuZGluZyA9IFBFTkRJTkcuZ2V0KG1vZGVsKTtcblxuICBpZihwZW5kaW5nKXtcbiAgICBwZW5kaW5nLmFkZChrZXkpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIFBFTkRJTkcuc2V0KG1vZGVsLCBwZW5kaW5nID0gbmV3IFNldChub3RSZWFkeSA/IFt0cnVlLCBrZXldIDogW2tleV0pKTtcblxuICBmb3IoY29uc3Qga2V5IG9mIHBlbmRpbmcpXG4gICAgZm9yKGNvbnN0IFtjYWxsYmFjaywgZmlsdGVyXSBvZiBsaXN0ZW5lcnMpXG4gICAgICBpZighZmlsdGVyIHx8IGZpbHRlci5oYXMoa2V5KSl7XG4gICAgICAgIGNvbnN0IGFmdGVyID0gY2FsbGJhY2suY2FsbChtb2RlbCwga2V5LCBtb2RlbCk7XG5cbiAgICAgICAgaWYoYWZ0ZXIpXG4gICAgICAgICAgZW5xdWV1ZShhZnRlcik7XG5cbiAgICAgICAgZWxzZSBpZihhZnRlciA9PT0gbnVsbClcbiAgICAgICAgICBsaXN0ZW5lcnMuZGVsZXRlKGNhbGxiYWNrKTtcbiAgICAgIH1cblxuICBpZihrZXkgPT09IG51bGwpXG4gICAgbGlzdGVuZXJzLmNsZWFyKCk7XG4gIFxuICBQRU5ESU5HLmRlbGV0ZShtb2RlbCk7XG59XG5cbmZ1bmN0aW9uIGV2ZW50KFxuICBzdWJqZWN0OiBPYnNlcnZhYmxlLFxuICBrZXk/OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wgfCBudWxsLFxuICBzaWxlbnQ/OiBib29sZWFuKXtcblxuICBpZihrZXkgPT09IG51bGwpXG4gICAgcmV0dXJuIGVtaXQoc3ViamVjdCwga2V5KTtcblxuICBpZigha2V5KVxuICAgIHJldHVybiBlbWl0KHN1YmplY3QsIHRydWUpO1xuXG4gIGxldCBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldChzdWJqZWN0KTtcblxuICBpZighcGVuZGluZyl7XG4gICAgUEVORElOR19LRVlTLnNldChzdWJqZWN0LCBwZW5kaW5nID0gbmV3IFNldCgpKTtcblxuICAgIGlmKCFzaWxlbnQpXG4gICAgICBlbnF1ZXVlKCgpID0+IHtcbiAgICAgICAgZW1pdChzdWJqZWN0LCBmYWxzZSk7XG4gICAgICAgIFBFTkRJTkdfS0VZUy5kZWxldGUoc3ViamVjdClcbiAgICAgIH0pXG4gIH1cblxuICBwZW5kaW5nLmFkZChrZXkpO1xuXG4gIGlmKCFzaWxlbnQpXG4gICAgZW1pdChzdWJqZWN0LCBrZXkpO1xufVxuXG5mdW5jdGlvbiBlbnF1ZXVlKGV2ZW50SGFuZGxlcjogKCgpID0+IHZvaWQpKXtcbiAgaWYoIURJU1BBVENILnNpemUpXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBESVNQQVRDSC5mb3JFYWNoKGV2ZW50ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBldmVudCgpO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGVycil7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIERJU1BBVENILmNsZWFyKCk7XG4gICAgfSwgMCk7XG5cbiAgRElTUEFUQ0guYWRkKGV2ZW50SGFuZGxlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgc2lkZS1lZmZlY3Qgd2hpY2ggd2lsbCB1cGRhdGUgd2hlbmV2ZXIgdmFsdWVzIGFjY2Vzc2VkIGNoYW5nZS5cbiAqIENhbGxiYWNrIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhbmQgd2hlbmV2ZXIgdmFsdWVzIGFyZSBzdGFsZS5cbiAqIFxuICogQHBhcmFtIHRhcmdldCAtIEluc3RhbmNlIG9mIE1vZGVsIHRvIG9ic2VydmUuXG4gKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBpbnZva2Ugd2hlbiB2YWx1ZXMgY2hhbmdlLlxuICogQHBhcmFtIHJlcXVpcmVWYWx1ZXMgLSBJZiBgdHJ1ZWAgd2lsbCB0aHJvdyBpZiBhY2Nlc3NpbmcgYSB2YWx1ZSB3aGljaCBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlRWZmZWN0PFQgZXh0ZW5kcyBPYnNlcnZhYmxlPih0YXJnZXQ6IFQsIGNhbGxiYWNrOiBFZmZlY3Q8UmVxdWlyZWQ8VD4+LCByZXF1aXJlVmFsdWVzOiB0cnVlKTogKCkgPT4gdm9pZDtcbmZ1bmN0aW9uIGNyZWF0ZUVmZmVjdDxUIGV4dGVuZHMgT2JzZXJ2YWJsZT4odGFyZ2V0OiBULCBjYWxsYmFjazogRWZmZWN0PFQ+LCByZWN1cnNpdmU/OiBib29sZWFuKTogKCkgPT4gdm9pZDtcbmZ1bmN0aW9uIGNyZWF0ZUVmZmVjdDxUIGV4dGVuZHMgT2JzZXJ2YWJsZT4odGFyZ2V0OiBULCBjYWxsYmFjazogRWZmZWN0PFQ+LCBhcmd1bWVudD86IGJvb2xlYW4pe1xuICBsZXQgdW5zZXQ6ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XG4gIGxldCByZXNldDogKCgpID0+IHZvaWQpIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBpbnZva2UoKSB7XG4gICAgbGV0IHN0YWxlOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgZnVuY3Rpb24gb25VcGRhdGUoKTogdm9pZCB8IFByb21pc2VMaXRlPHZvaWQ+IHtcbiAgICAgIGlmIChzdGFsZSB8fCByZXNldCA9PT0gbnVsbClcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBzdGFsZSA9IHRydWU7XG5cbiAgICAgIGlmIChyZXNldCAmJiB1bnNldCkge1xuICAgICAgICB1bnNldCh0cnVlKTtcbiAgICAgICAgdW5zZXQgPSB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIGVucXVldWUoaW52b2tlKTtcbiAgICAgIHJldHVybiB7IHRoZW46IGVucXVldWUgfVxuICAgIH1cblxuICAgIGNvbnN0IHN1YnNjcmliZXIgPSB0YXJnZXRbT2JzZXJ2YWJsZV0ob25VcGRhdGUsIGFyZ3VtZW50ID09PSB0cnVlKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBleGl0ID0gZW50ZXIoYXJndW1lbnQgPT09IGZhbHNlKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IGNhbGxiYWNrLmNhbGwoc3Vic2NyaWJlciwgc3Vic2NyaWJlcik7XG4gICAgICBjb25zdCBmbHVzaCA9IGV4aXQoKTtcblxuICAgICAgcmVzZXQgPSBvdXRwdXQgPT09IG51bGwgPyBudWxsIDogaW52b2tlO1xuICAgICAgdW5zZXQgPSBrZXkgPT4ge1xuICAgICAgICBpZih0eXBlb2Ygb3V0cHV0ID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgICBvdXRwdXQoa2V5KTtcblxuICAgICAgICBmbHVzaCgpO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXRjaChlcnIpe1xuICAgICAgaWYoZXJyIGluc3RhbmNlb2YgUHJvbWlzZSl7XG4gICAgICAgIHJlc2V0ID0gdW5kZWZpbmVkO1xuICAgICAgICBlcnIudGhlbihpbnZva2UpO1xuICAgICAgfVxuICAgICAgZWxzZVxuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2xlYW51cCgpe1xuICAgIGlmKHVuc2V0KVxuICAgICAgdW5zZXQoZmFsc2UpO1xuXG4gICAgcmVzZXQgPSBudWxsO1xuICB9O1xuXG4gIGlmKEVmZmVjdENvbnRleHQgJiYgYXJndW1lbnQgIT09IGZhbHNlKVxuICAgIEVmZmVjdENvbnRleHQuYWRkKGNsZWFudXApO1xuXG4gIGFkZExpc3RlbmVyKHRhcmdldCwga2V5ID0+IHtcbiAgICBpZihrZXkgPT09IHRydWUpXG4gICAgICBpbnZva2UoKTtcblxuICAgIGVsc2UgaWYoIXJlc2V0KVxuICAgICAgcmV0dXJuIHJlc2V0O1xuXG4gICAgaWYoa2V5ID09PSBudWxsICYmIHVuc2V0KVxuICAgICAgdW5zZXQobnVsbCk7XG4gIH0pO1xuICBcbiAgcmV0dXJuIGNsZWFudXA7XG59XG5cbmxldCBFZmZlY3RDb250ZXh0OiBTZXQ8KCkgPT4gdm9pZD4gfCB1bmRlZmluZWQ7XG5cbmV4cG9ydCBmdW5jdGlvbiBlbnRlcihpZ25vcmU/OiBib29sZWFuKXtcbiAgaWYoaWdub3JlKVxuICAgIHJldHVybiAoKSA9PiAoKSA9PiB7fTtcblxuICBjb25zdCBsYXN0ID0gRWZmZWN0Q29udGV4dDtcbiAgY29uc3QgY29udGV4dCA9IEVmZmVjdENvbnRleHQgPSBuZXcgU2V0O1xuXG4gIHJldHVybiAoKSA9PiB7XG4gICAgRWZmZWN0Q29udGV4dCA9IGxhc3Q7XG4gICAgcmV0dXJuICgpID0+IGNvbnRleHQuZm9yRWFjaChmbiA9PiBmbigpKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBhZGRMaXN0ZW5lcixcbiAgY3JlYXRlRWZmZWN0LFxuICBldmVudCxcbiAgT25VcGRhdGUsXG4gIFBFTkRJTkdfS0VZUyxcbiAgT2JzZXJ2YWJsZVxufSJdLAogICJtYXBwaW5ncyI6ICJBQTRCQSxNQUFNLGFBQWEsT0FBTyxTQUFTO0FBR25DLE1BQU0sVUFBVSxNQUFNO0FBRXRCLE1BQU0sWUFBWSxvQkFBSSxRQUEyRDtBQUdqRixNQUFNLFVBQVUsb0JBQUksUUFBZ0M7QUFHcEQsTUFBTSxlQUFlLG9CQUFJLFFBQW1EO0FBRzVFLE1BQU0s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
|
package/dist/esm/model.js
CHANGED
|
@@ -15,7 +15,7 @@ class Model {
|
|
|
15
15
|
[Observable](callback, required) {
|
|
16
16
|
const watch2 = /* @__PURE__ */ new Set();
|
|
17
17
|
const proxy = Object.create(this);
|
|
18
|
-
addListener(this, callback, watch2);
|
|
18
|
+
addListener(this, () => void callback(), watch2);
|
|
19
19
|
OBSERVER.set(proxy, (key, value) => {
|
|
20
20
|
if (value === void 0 && required)
|
|
21
21
|
throw new Error(`${this}.${key} is required in this context.`);
|
|
@@ -306,4 +306,4 @@ export {
|
|
|
306
306
|
update,
|
|
307
307
|
watch
|
|
308
308
|
};
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT2JzZXJ2YWJsZSwgT25VcGRhdGUsIFBFTkRJTkdfS0VZUyB9IGZyb20gJy4vY29udHJvbCc7XG5cbmNvbnN0IGRlZmluZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLyoqIFJlZ2lzdGVyIGZvciBhbGwgYWN0aXZlIG1vZGVscyB2aWEgc3RyaW5nIGlkZW50aWZpZXJzICh1c3VhbGx5IHVuaXF1ZSkuICovXG5jb25zdCBJRCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBzdHJpbmc+KCk7XG5cbi8qKiBJbnRlcm5hbCBzdGF0ZSBhc3NpZ25lZCB0byBtb2RlbHMuICovXG5jb25zdCBTVEFURSA9IG5ldyBXZWFrTWFwPE1vZGVsLCBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPj4oKTtcblxuLyoqIEV4dGVybmFsIGxpc3RlbmVycyBmb3IgYW55IGdpdmVuIE1vZGVsLiAqL1xuY29uc3QgTk9USUZZID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgU2V0PE9uVXBkYXRlPj4oKTtcblxuLyoqIFBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiAqL1xuY29uc3QgUEFSRU5UID0gbmV3IFdlYWtNYXA8TW9kZWwsIE1vZGVsIHwgbnVsbD4oKTtcblxuLyoqIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGJ5IGEgZ2l2ZW4gdHlwZS4gKi9cbmNvbnN0IE1FVEhPRFMgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4+KCk7XG5cbi8qKiBSZWZlcmVuY2UgYm91bmQgaW5zdGFuY2UgbWV0aG9kcyB0byByZWFsIG9uZXMuICovXG5jb25zdCBNRVRIT0QgPSBuZXcgV2Vha01hcDxhbnksIGFueT4oKTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgTW9kZWwge1xuICAvKiogQW55IHR5cGUgb2YgTW9kZWwsIHVzaW5nIG93biBjbGFzcyBjb25zdHJ1Y3RvciBhcyBpdHMgaWRlbnRpZmllci4gKi9cbiAgdHlwZSBUeXBlPFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpICYgdHlwZW9mIE1vZGVsO1xuXG4gIC8qKiBBIE1vZGVsIGNvbnN0cnVjdG9yLCBidXQgd2hpY2ggaXMgbm90IGFic3RyYWN0LiAqL1xuICB0eXBlIEluaXQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAobmV3ICguLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KSA9PiBUKSAmIE9taXQ8dHlwZW9mIE1vZGVsLCBuZXZlcj47XG5cbiAgLyoqXG4gICAqIE1vZGVsIGNvbnN0cnVjdG9yIGNhbGxiYWNrIC0gaXMgY2FsbGVkIHdoZW4gTW9kZWwgZmluaXNoZXMgaW50aWFsaXppbmcuXG4gICAqIFJldHVybmVkIGZ1bmN0aW9uIHdpbGwgcnVuIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBDYWxsYmFjazxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgICh0aGlzOiBULCB0aGlzQXJnOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgKCgpID0+IHZvaWQpIHwgQXNzaWduPFQ+IHwgdm9pZDtcblxuICAvKiogTW9kZWwgY29uc3RydWN0b3IgYXJndW1lbnQgKi9cbiAgdHlwZSBBcmd1bWVudDxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPSBBc3NpZ248VD4gfCBDYWxsYmFjazxUPiB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqL1xuICB0eXBlIEFyZ3M8VCBleHRlbmRzIE1vZGVsID0gYW55PiA9IChBcmd1bWVudDxUPiB8IEFyZ3M8VD4pW107XG5cbiAgLyoqIFN1YnNldCBvZiBga2V5b2YgVGAgd2hpY2ggYXJlIG5vdCBtZXRob2RzIG9yIGRlZmluZWQgYnkgYmFzZSBNb2RlbCBVLiAqKi9cbiAgdHlwZSBGaWVsZDxUPiA9IEV4Y2x1ZGU8a2V5b2YgVCwga2V5b2YgTW9kZWw+O1xuXG4gIC8qKiBBbnkgdmFsaWQga2V5IGZvciBtb2RlbCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBGaWVsZDxUPi4gKi9cbiAgdHlwZSBFdmVudDxUPiA9IEZpZWxkPFQ+IHwgKHN0cmluZyAmIHt9KSB8IG51bWJlciB8IHN5bWJvbDtcblxuICAvKiogT2JqZWN0IG92ZXJsYXkgdG8gb3ZlcnJpZGUgdmFsdWVzIGFuZCBtZXRob2RzIG9uIGEgbW9kZWwuICovXG4gIHR5cGUgQXNzaWduPFQ+ID0ge1xuICAgIFtLIGluIEZpZWxkPFQ+XT86XG4gICAgICBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgXG4gICAgICAgID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgICAgOiBUW0tdO1xuICB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4cG9ydC9JbXBvcnQgY29tcGF0aWJsZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBpbiBhIE1vZGVsLiAqL1xuICB0eXBlIEV4cG9ydDxSPiA9IFIgZXh0ZW5kcyB7IGdldCgpOiBpbmZlciBUIH0gPyBUIDogUjtcblxuICAvKiogVmFsdWUgZm9yIGEgcHJvcGVydHkgbWFuYWdlZCBieSBhIG1vZGVsLiAqL1xuICB0eXBlIFZhbHVlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgSyBleHRlbmRzIGtleW9mIFQgPyBFeHBvcnQ8VFtLXT4gOiB1bmtub3duO1xuXG4gIHR5cGUgT25FdmVudDxUIGV4dGVuZHMgTW9kZWw+ID1cbiAgICAodGhpczogVCwga2V5OiB1bmtub3duLCBzb3VyY2U6IFQpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQgfCBudWxsO1xuXG4gIHR5cGUgT25VcGRhdGU8VCBleHRlbmRzIE1vZGVsLCBLIGV4dGVuZHMgRXZlbnQ8VD4+ID1cbiAgICAodGhpczogVCwga2V5OiBLLCB0aGlzQXJnOiBLKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZnJvbSBjdXJyZW50IHN0YXRlIG9mIGdpdmVuIG1vZGVsLlxuICAgKiBEaWZmZXJzIGZyb20gYFZhbHVlc2AgYXMgdmFsdWVzIGhlcmUgd2lsbCBkcmlsbFxuICAgKiBpbnRvIFwicmVhbFwiIHZhbHVlcyBoZWxkIGJ5IGV4b3RpY3MgbGlrZSByZWYuT2JqZWN0LlxuICAgKi9cbiAgdHlwZSBTdGF0ZTxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dOiBFeHBvcnQ8VFtQXT4gfTtcblxuICAvKiogT2JqZWN0IGNvbXBlcmFibGUgdG8gZGF0YSBmb3VuZCBpbiBULiAqL1xuICB0eXBlIFZhbHVlczxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dPzogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIEV4b3RpYyB2YWx1ZSwgd2hlcmUgYWN0dWFsIHZhbHVlIGlzIGNvbnRhaW5lZCB3aXRoaW4uICovXG4gIHR5cGUgUmVmPFQgPSBhbnk+ID0ge1xuICAgIChuZXh0OiBUKTogdm9pZDtcbiAgICBjdXJyZW50OiBUIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIHN1YnNjcmliZWQgdG8gcGFyZW50IGFuZCB1cGRhdGVzIHdoZW4gYWNjZXNzZWQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgc3RhdGUgb2YgdGhpcyBtb2RlbC4gVGhpcyBpcyBhIHByb3h5IHdoaWNoIGRldGVjdHMgcHJvcGVydGllcyB3aGljaFxuICAgKiB3aGVyZSBhY2Nlc3NlZCwgYW5kIHRodXMgZGVwZW5kZWQgdXBvbiB0byBzdGF5IGN1cnJlbnQuXG4gICAqIFxuICAgKiBAcGFyYW0gdXBkYXRlIC0gU2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBhbmQgZXZlbnRzIGZpcmVkLCBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAgICogXG4gICAqIEByZXR1cm5zIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGVmZmVjdCBpcyBzdGFsZS5cbiAgICovXG4gIHR5cGUgRWZmZWN0PFQ+ID0gKHRoaXM6IFQsIGN1cnJlbnQ6IFQsIHVwZGF0ZTogU2V0PEV2ZW50PFQ+PikgPT5cbiAgICBFZmZlY3RDYWxsYmFjayB8IFByb21pc2U8dm9pZD4gfCBudWxsIHwgdm9pZDtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5lZCBieSBlZmZlY3QuIFdpbGwgYmUgY2FsbGVkIHdoZW4gZWZmZWN0IGlzIHN0YWxlLlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIGB0cnVlYCBpZiB1cGRhdGUgaXMgcGVuZGluZywgYGZhbHNlYCBlZmZlY3QgaGFzIGJlZW4gY2FuY2VsbGVkLCBgbnVsbGAgaWYgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBFZmZlY3RDYWxsYmFjayA9ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk7XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IGluaXRpYWxpemVyLCB3aWxsIHJ1biB1cG9uIGluc3RhbmNlIGNyZWF0aW9uLlxuICAgKiBPcHRpb25hbCByZXR1cm5lZCBjYWxsYmFjayB3aWxsIHJ1biB3aGVuIG9uY2UgdXBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICB0eXBlIEluc3RydWN0aW9uPFQgPSBhbnksIE0gZXh0ZW5kcyBNb2RlbCA9IGFueT4gPVxuICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGFsbG93IGZvciBudW1iZXJzL3N5bWJvbCBwcm9wZXJ0aWVzP1xuICAgICh0aGlzOiBNLCBrZXk6IEV4dHJhY3Q8RmllbGQ8TT4sIHN0cmluZz4sIHRoaXNBcmc6IE0sIHN0YXRlOiBTdGF0ZTxNPikgPT5cbiAgICAgIERlc2NyaXB0b3I8VD4gfCAoKHNvdXJjZTogTSkgPT4gVCkgfCB2b2lkO1xuXG4gIHR5cGUgR2V0dGVyPFQ+ID0gKHNvdXJjZTogTW9kZWwpID0+IFQ7XG4gIHR5cGUgU2V0dGVyPFQ+ID0gKHZhbHVlOiBULCBwcmV2aW91czogVCkgPT4gYm9vbGVhbiB8IHZvaWQgfCAoKCkgPT4gVCk7XG5cbiAgdHlwZSBEZXNjcmlwdG9yPFQgPSBhbnk+ID0ge1xuICAgIGdldD86IEdldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgc2V0PzogU2V0dGVyPFQ+IHwgYm9vbGVhbjtcbiAgICBlbnVtZXJhYmxlPzogYm9vbGVhbjtcbiAgICB2YWx1ZT86IFQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIExvb3BiYWNrIHRvIGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaW4gYSBzdWJzY3JpYmVkIGNvbnRleHQsXG4gICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgKiovXG4gIGlzOiB0aGlzO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBNb2RlbCBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT25VcGRhdGUsIHJlcXVpcmVkPzogYm9vbGVhbil7XG4gICAgY29uc3Qgd2F0Y2ggPSBuZXcgU2V0PE1vZGVsLkV2ZW50PHRoaXM+PigpO1xuICAgIGNvbnN0IHByb3h5ID0gT2JqZWN0LmNyZWF0ZSh0aGlzKTtcbiAgICBcbiAgICBhZGRMaXN0ZW5lcih0aGlzLCBjYWxsYmFjaywgd2F0Y2gpO1xuICAgIE9CU0VSVkVSLnNldChwcm94eSwgKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGlmKHZhbHVlID09PSB1bmRlZmluZWQgJiYgcmVxdWlyZWQpXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt0aGlzfS4ke2tleX0gaXMgcmVxdWlyZWQgaW4gdGhpcyBjb250ZXh0LmApO1xuXG4gICAgICB3YXRjaC5hZGQoa2V5KTtcblxuICAgICAgaWYodmFsdWUgaW5zdGFuY2VvZiBPYmplY3QgJiYgT2JzZXJ2YWJsZSBpbiB2YWx1ZSlcbiAgICAgICAgcmV0dXJuIHZhbHVlW09ic2VydmFibGVdKGNhbGxiYWNrLCByZXF1aXJlZCk7XG5cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9KTtcblxuICAgIHJldHVybiBwcm94eSBhcyB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFB1bGwgY3VycmVudCB2YWx1ZXMgZnJvbSBzdGF0ZS4gRmxhdHRlbnMgYWxsIG1vZGVscyBhbmQgZXhvdGljIHZhbHVlcyByZWN1cnNpdmVseS5cbiAgICogXG4gICAqIEByZXR1cm5zIE9iamVjdCB3aXRoIGFsbCB2YWx1ZXMgZnJvbSB0aGlzIG1vZGVsLlxuICAgKiovXG4gIGdldCgpOiBNb2RlbC5TdGF0ZTx0aGlzPjtcblxuICAvKipcbiAgICogUnVuIGEgZnVuY3Rpb24gd2hpY2ggd2lsbCBydW4gYXV0b21hdGljYWxseSB3aGVuIGFjY2Vzc2VkIHZhbHVlcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gZWZmZWN0IEZ1bmN0aW9uIHRvIHJ1biwgYW5kIGFnYWluIHdoZW5ldmVyIGFjY2Vzc2VkIHZhbHVlcyBjaGFuZ2UuXG4gICAqICAgICAgICAgICAgICAgSWYgZWZmZWN0IHJldHVybnMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgd2hlbiBhIGNoYW5nZSBvY2N1cnMgKHN5bmNyb25vdXNseSksXG4gICAqICAgICAgICAgICAgICAgZWZmZWN0IGlzIGNhbmNlbGxlZCwgb3IgcGFyZW50IG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KGVmZmVjdDogTW9kZWwuRWZmZWN0PHRoaXM+KTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogR2V0IHZhbHVlIG9mIGEgcHJvcGVydHkuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gZ2V0IHZhbHVlIG9mLlxuICAgKiBAcGFyYW0gcmVxdWlyZWQgLSBJZiB0cnVlLCB3aWxsIHRocm93IGFuIGVycm9yIGlmIHByb3BlcnR5IGlzIG5vdCBhdmFpbGFibGUuXG4gICAqIEByZXR1cm5zIFZhbHVlIG9mIHByb3BlcnR5LlxuICAgKi9cbiAgZ2V0PFQgZXh0ZW5kcyBNb2RlbC5FdmVudDx0aGlzPj4oa2V5OiBULCByZXF1aXJlZD86IGJvb2xlYW4pOiBNb2RlbC5WYWx1ZTx0aGlzLCBUPjtcblxuICAvKipcbiAgICogUnVuIGEgZnVuY3Rpb24gd2hlbiBhIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIE1vZGVsLkV2ZW50PHRoaXM+PihrZXk6IFQsIGNhbGxiYWNrOiBNb2RlbC5PblVwZGF0ZTx0aGlzLCBUPik6ICgpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIGlmIG1vZGVsIGlzIGV4cGlyZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGNoZWNrIGlmIG1vZGVsIGlzIGV4cGlyZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBtb2RlbCBpcyBleHBpcmVkLCBgZmFsc2VgIG90aGVyd2lzZS5cbiAgICovXG4gIGdldChzdGF0dXM6IG51bGwpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDYWxsYmFjayB3aGVuIG1vZGVsIGlzIHRvIGJlIGRlc3Ryb3llZC5cbiAgICogXG4gICAqIEBwYXJhbSBjYWxsYmFjayAtIEZ1bmN0aW9uIHRvIGNhbGwgd2hlbiBtb2RlbCBpcyBkZXN0cm95ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldChzdGF0dXM6IG51bGwsIGNhbGxiYWNrOiAoKSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcblxuICBnZXQoYXJnMT86IE1vZGVsLkVmZmVjdDx0aGlzPiB8IHN0cmluZyB8IG51bGwsIGFyZzI/OiBib29sZWFuIHwgTW9kZWwuT25VcGRhdGU8dGhpcywgYW55Pil7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpe1xuICAgICAgbGV0IHBlbmRpbmcgPSBuZXcgU2V0PE1vZGVsLkV2ZW50PHRoaXM+PigpO1xuXG4gICAgICByZXR1cm4gY3JlYXRlRWZmZWN0KHNlbGYsIChwcm94eSkgPT4ge1xuICAgICAgICBjb25zdCBjYiA9IGFyZzEuY2FsbChwcm94eSwgcHJveHksIHBlbmRpbmcpO1xuXG4gICAgICAgIHJldHVybiBjYiA9PT0gbnVsbCA/IG51bGwgOiAoKHVwZGF0ZSkgPT4ge1xuICAgICAgICAgIHBlbmRpbmcgPSBQRU5ESU5HX0tFWVMuZ2V0KHNlbGYpITtcbiAgICAgICAgICBpZih0eXBlb2YgY2IgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgY2IodXBkYXRlKTtcbiAgICAgICAgfSlcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoXG4gICAgICBhcmcxID09PSB1bmRlZmluZWQgPyBzbmFwc2hvdChzZWxmKSA6XG4gICAgICB0eXBlb2YgYXJnMiA9PSBcImZ1bmN0aW9uXCIgPyBhZGRMaXN0ZW5lcihzZWxmLCBhcmcyLCBhcmcxKSA6XG4gICAgICBhcmcxID09PSBudWxsID8gT2JqZWN0LmlzRnJvemVuKFNUQVRFLmdldChzZWxmKSkgOlxuICAgICAgZmV0Y2goc2VsZiwgYXJnMSwgYXJnMilcbiAgICApXG4gIH1cblxuICAvKipcbiAgICogR2V0IHVwZGF0ZSBpbiBwcm9ncmVzcy5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSB3aGljaCByZXNvbHZlcyBvYmplY3Qgd2l0aCB1cGRhdGVkIHZhbHVlcywgYHVuZGVmaW5lZGAgaWYgdGhlcmUgbm8gdXBkYXRlIGlzIHBlbmRpbmcuXG4gICAqKi9cbiAgc2V0KCk6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+IHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgbXVsaXRwbGUgcHJvcGVydGllcyBhdCBvbmNlLiBNZXJnZXMgYXJndW1lbnQgd2l0aCBjdXJyZW50IHN0YXRlLlxuICAgKiBQcm9wZXJ0aWVzIHdoaWNoIGFyZSBub3QgbWFuYWdlZCBieSB0aGlzIG1vZGVsIHdpbGwgYmUgaWdub3JlZC5cbiAgICogXG4gICAqIEBwYXJhbSBhc3NpZ24gLSBPYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIHRvIHVwZGF0ZS5cbiAgICogQHBhcmFtIHNpbGVudCAtIElmIGFuIHVwZGF0ZSBkb2VzIG9jY3VyLCBsaXN0ZW5lcnMgd2lsbCBub3QgYmUgcmVmcmVzaGVkIGF1dG9tYXRpY2FsbHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZCwgYHVuZGVmaW5lZGAgKGltbWVkaWF0ZWx5KSBpZiBhIG5vb3AuXG4gICAqL1xuICBzZXQoYXNzaWduPzogTW9kZWwuQXNzaWduPHRoaXM+LCBzaWxlbnQ/OiBib29sZWFuKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFB1c2ggYW4gdXBkYXRlLiBUaGlzIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgYXNzb2NpYXRlZCBwcm9wZXJ0eS5cbiAgICogXG4gICAqIFVzZWZ1bCB3aGVyZSBhIHByb3BlcnR5IHZhbHVlIGludGVybmFsbHkgaGFzIGNoYW5nZWQsIGJ1dCB0aGUgb2JqZWN0IGlzIHRoZSBzYW1lLlxuICAgKiBGb3IgZXhhbXBsZTogQW4gYXJyYXkgaGFzIHB1c2hlZCBhIG5ldyB2YWx1ZSwgb3IgYSBuZXN0ZWQgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIFlvdSBjYW4gYWxzbyB1c2UgdGhpcyB0byBkaXNwYXRjaCBhcmJpdHJhcnkgZXZlbnRzLlxuICAgKiBTeW1ib2xzIGFyZSByZWNvbW1lbmRlZCBhcyBub24tcHJvcGVydHkgZXZlbnRzLCBob3dldmVyIHlvdSBjYW4gdXNlIGFueSBzdHJpbmcuXG4gICAqIElmIGRvaW5nIHNvLCBiZSBzdXJlIHRvIGF2b2lkIGNvbGxpc2lvbnMgd2l0aCBwcm9wZXJ0eSBuYW1lcyEgQW4gZWFzeSB3YXkgdG8gZG8gdGhpcyBpc1xuICAgKiB0byBwcmVmaXggYW4gZXZlbnQgd2l0aCBcIiFcIiBhbmQvb3IgdXNlIGRhc2gtY2FzZS4gZS5nLiBgc2V0KFwiIWV2ZW50XCIpYCBvciBgc2V0KFwibXktZXZlbnRcIilgLlxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IG9yIGV2ZW50IHRvIGRpc3BhdGNoLlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+KTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT47XG5cbiAgLyoqXG4gICAqIFNldCBhIHZhbHVlIGZvciBhIHByb3BlcnR5LiBUaGlzIHdpbGwgdXBkYXRlIHRoZSB2YWx1ZSBhbmQgbm90aWZ5IGxpc3RlbmVycy5cbiAgICogXG4gICAqICoqVXNlIHdpdGggY2F1dGlvbiEqKiBLZXkgbm9yIHZhbHVlIGFyZSBjaGVja2VkIGZvciB2YWxpZGl0eS5cbiAgICogXG4gICAqIFRoaXMgaXMgbWVhbnQgZm9yIGFzc2lnbmluZyB2YWx1ZXMgcHJvZ3JhbW1hdGljYWxseSxcbiAgICogd2hlcmUgc2ltcGxlIGFzc2lnbm1lbnQgaXMgbm90IHByYWN0aWNhYmxlLlxuICAgKiBcbiAgICogRm9yIGV4YW1wbGU6IGAodGhpcyBhcyBhbnkpW215UHJvcGVydHldID0gdmFsdWU7YFxuICAgKiBcbiAgICogQHBhcmFtIGtleSAtIFByb3BlcnR5IHRvIHNldCB2YWx1ZSBmb3IuXG4gICAqIEBwYXJhbSB2YWx1ZSAtIFZhbHVlIHRvIHNldCBmb3IgcHJvcGVydHkuXG4gICAqIEBwYXJhbSBpbml0IC0gSWYgdHJ1ZSwgbW9kZWwgd2lsbCBiZWdpbiB0byBtYW5hZ2UgdGhlIHByb3BlcnR5IGlmIGl0IGlzIG5vdCBhbHJlYWR5LlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmVzIGFuIGFycmF5IG9mIGtleXMgdXBkYXRlZC5cbiAgICovXG4gIHNldChrZXk6IE1vZGVsLkV2ZW50PHRoaXM+LCB2YWx1ZTogdW5rbm93biwgaW5pdD86IGJvb2xlYW4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogXG4gICAqIEdpdmVuIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZXZlcnkgYXNzaWdubWVudCAod2hpY2ggY2hhbmdlcyB2YWx1ZSkgb3IgZXhwbGljaXQgYHNldGAuXG4gICAqIFxuICAgKiBUbyBydW4gbG9naWMgb24gZmluYWwgdmFsdWUgb25seSwgY2FsbGJhY2sgbWF5IHJldHVybiBhIGZ1bmN0aW9uLiBVc2luZyB0aGUgc2FtZVxuICAgKiBmdW5jdGlvbiBmb3Igb25lIG9yIG1vcmUgZXZlbnRzIHdpbGwgZW5zdXJlIGl0IGlzIGNhbGxlZCBvbmx5IHdoZW4gZXZlbnRzIGFyZSBzZXR0bGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHVwZGF0ZSBvY2N1cnMuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIHJlbW92ZSBsaXN0ZW5lci4gV2lsbCByZXR1cm4gYHRydWVgIGlmIHJlbW92ZWQsIGBmYWxzZWAgaWYgaW5hY3RpdmUgYWxyZWFkeS5cbiAgICogXG4gICovXG4gIHNldChjYWxsYmFjazogTW9kZWwuT25FdmVudDx0aGlzPik6ICgpID0+IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhbGwgYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogVW5saWtlIGBnZXRgLCB0aGlzIGNhbHNsIHN5bmNocm9ub3VzbHkgYW5kIHdpbGwgZmlyZSBhcyBtYW55IHRpbWVzIGFzIHRoZSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIEBwYXJhbSBldmVudCAtIFByb3BlcnR5IHRvIHdhdGNoIGZvciB1cGRhdGVzLlxuICAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+LCBldmVudDogTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsKTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogRGVjbGFyZSBhbiBlbmQgdG8gdXBkYXRlcy4gVGhpcyBldmVudCBpcyBmaW5hbCBhbmQgd2lsbCBmcmVlemUgc3RhdGUuXG4gICAqIFRoaXMgZXZlbnQgY2FuIGJlIHdhdGNoZWQgZm9yIGFzIHdlbGwsIHRvIHJ1biBjbGVhbnVwIGxvZ2ljIGFuZCBpbnRlcm5hbGx5IHdpbGwgcmVtb3ZlIGFsbCBsaXN0ZW5lcnMuXG4gICAqIFxuICAgKiBAcGFyYW0gc3RhdHVzIC0gYG51bGxgIHRvIGVuZCB1cGRhdGVzLlxuICAgKi9cbiAgc2V0KHN0YXR1czogbnVsbCk6IHZvaWQ7XG5cbiAgc2V0KFxuICAgIGFyZzE/OiBNb2RlbC5PbkV2ZW50PHRoaXM+IHwgTW9kZWwuQXNzaWduPHRoaXM+IHwgTW9kZWwuRXZlbnQ8dGhpcz4gfCBudWxsLFxuICAgIGFyZzI/OiB1bmtub3duLFxuICAgIGFyZzM/OiBib29sZWFuKXtcblxuICAgIGNvbnN0IHNlbGYgPSB0aGlzLmlzO1xuXG4gICAgaWYodHlwZW9mIGFyZzEgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgcmV0dXJuIGFkZExpc3RlbmVyKHNlbGYsIGtleSA9PiB7XG4gICAgICAgIGlmKGFyZzIgPT09IGtleSB8fCBhcmcyID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIGtleSA9PSBcInN0cmluZ1wiKVxuICAgICAgICAgIHJldHVybiBhcmcxLmNhbGwoc2VsZiwga2V5LCBzZWxmKTtcbiAgICAgIH0pXG4gICAgICBcbiAgICBpZihhcmcxICYmIHR5cGVvZiBhcmcxID09IFwib2JqZWN0XCIpXG4gICAgICBhc3NpZ24oc2VsZiwgYXJnMSwgYXJnMiA9PT0gdHJ1ZSk7XG4gICAgZWxzZSBpZighYXJnMilcbiAgICAgIGV2ZW50KHNlbGYsIGFyZzEpO1xuICAgIGVsc2UgaWYoYXJnMylcbiAgICAgIG1hbmFnZShzZWxmLCBhcmcxIGFzIHN0cmluZyB8IG51bWJlciwgYXJnMik7XG4gICAgZWxzZVxuICAgICAgdXBkYXRlKHNlbGYsIGFyZzEgYXMgc3RyaW5nIHwgbnVtYmVyLCBhcmcyKVxuXG4gICAgY29uc3QgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQodGhpcyk7XG5cbiAgICBpZihwZW5kaW5nKVxuICAgICAgcmV0dXJuIDxQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPj4ge1xuICAgICAgICB0aGVuOiAocmVzKSA9PiBuZXcgUHJvbWlzZTxhbnk+KHJlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlID0gYWRkTGlzdGVuZXIodGhpcywga2V5ID0+IHtcbiAgICAgICAgICAgIGlmKGtleSAhPT0gdHJ1ZSl7XG4gICAgICAgICAgICAgIHJlbW92ZSgpO1xuICAgICAgICAgICAgICByZXR1cm4gcmVzLmJpbmQobnVsbCwgQXJyYXkuZnJvbShwZW5kaW5nKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pLnRoZW4ocmVzKVxuICAgICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGUgb3ZlciBtYW5hZ2VkIHByb3BlcnRpZXMgaW4gdGhpcyBpbnN0YW5jZSBvZiBNb2RlbC5cbiAgICogWWVpbGRzIHRoZSBrZXkgYW5kIGN1cnJlbnQgdmFsdWUgZm9yIGVhY2ggcHJvcGVydHkuXG4gICAqL1xuICBbU3ltYm9sLml0ZXJhdG9yXSgpOiBJdGVyYXRvcjxbc3RyaW5nLCB1bmtub3duXT4ge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyhTVEFURS5nZXQodGhpcy5pcykhKVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGFuZCBhY3RpdmF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGlzIG1vZGVsLlxuICAgKiBcbiAgICogKipJbXBvcnRhbnQqKiAtIFVubGlrZSBgbmV3IHRoaXMoLi4uKWAgLSB0aGlzIG1ldGhvZCBhbHNvIGFjdGl2YXRlcyBzdGF0ZS5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gYXJndW1lbnRzIHNlbnQgdG8gY29uc3RydWN0b3JcbiAgICovXG4gIHN0YXRpYyBuZXc8VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5Jbml0PFQ+LCAuLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KXtcbiAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzKC4uLmFyZ3MpO1xuICAgIGV2ZW50KGluc3RhbmNlKTtcbiAgICByZXR1cm4gaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogU3RhdGljIGVxdWl2YWxlbnQgb2YgYHggaW5zdGFuY2VvZiB0aGlzYC5cbiAgICogRGV0ZXJtaW5lcyBpZiBwcm92aWRlZCBjbGFzcyBpcyBhIHN1YnR5cGUgb2YgdGhpcyBvbmUuXG4gICAqIElmIHNvLCBsYW5ndWFnZSBzZXJ2ZXIgd2lsbCBtYWtlIGF2YWlsYWJsZSBhbGwgc3RhdGljXG4gICAqIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhpcyBjbGFzcy5cbiAgICovXG4gIHN0YXRpYyBpczxUIGV4dGVuZHMgTW9kZWwuVHlwZT4odGhpczogVCwgbWF5YmU6IHVua25vd24pOiBtYXliZSBpcyBUIHtcbiAgICByZXR1cm4gbWF5YmUgPT09IHRoaXMgfHwgdHlwZW9mIG1heWJlID09IFwiZnVuY3Rpb25cIiAmJiBtYXliZS5wcm90b3R5cGUgaW5zdGFuY2VvZiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gcnVuIHdoZW4gYW55IGluc3RhbmNlIG9mIHRoaXMgTW9kZWwgaXMgdXBkYXRlZC4gXG4gICAqL1xuICBzdGF0aWMgb248VCBleHRlbmRzIE1vZGVsPih0aGlzOiBNb2RlbC5UeXBlPFQ+LCBsaXN0ZW5lcjogTW9kZWwuT25FdmVudDxUPil7XG4gICAgbGV0IG5vdGlmeSA9IE5PVElGWS5nZXQodGhpcyk7XG5cbiAgICBpZighbm90aWZ5KVxuICAgICAgTk9USUZZLnNldCh0aGlzLCBub3RpZnkgPSBuZXcgU2V0KTtcblxuICAgIG5vdGlmeS5hZGQobGlzdGVuZXIpO1xuXG4gICAgcmV0dXJuICgpID0+IG5vdGlmeS5kZWxldGUobGlzdGVuZXIpO1xuICB9XG59XG5cbmRlZmluZShNb2RlbC5wcm90b3R5cGUsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiBJRC5nZXQodGhpcy5pcyk7XG4gIH1cbn0pO1xuXG5kZWZpbmUoTW9kZWwsIFwidG9TdHJpbmdcIiwge1xuICB2YWx1ZSgpe1xuICAgIHJldHVybiB0aGlzLm5hbWU7XG4gIH1cbn0pO1xuXG5mdW5jdGlvbiBhc3NpZ24oc3ViamVjdDogTW9kZWwsIGRhdGE6IE1vZGVsLkFzc2lnbjxNb2RlbD4sIHNpbGVudD86IGJvb2xlYW4pe1xuICBjb25zdCBtZXRob2RzID0gTUVUSE9EUy5nZXQoc3ViamVjdC5jb25zdHJ1Y3RvciBhcyBNb2RlbC5UeXBlKSE7XG4gICAgXG4gIGZvcihjb25zdCBrZXkgaW4gZGF0YSl7XG4gICAgY29uc3QgYmluZCA9IG1ldGhvZHMuZ2V0KGtleSk7XG5cbiAgICBpZihiaW5kKVxuICAgICAgYmluZC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSk7XG4gICAgZWxzZSBpZihrZXkgaW4gc3ViamVjdCAmJiBrZXkgIT09IFwiaXNcIil7XG4gICAgICBjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzdWJqZWN0LCBrZXkpITtcbiAgICAgIGNvbnN0IHNldCA9IGRlc2MgJiYgZGVzYy5zZXQgYXMgKHZhbHVlOiBhbnksIHNpbGVudD86IGJvb2xlYW4pID0+IHZvaWQ7XG5cbiAgICAgIHNldC5jYWxsKHN1YmplY3QsIGRhdGFba2V5XSwgc2lsZW50KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqIEFwcGx5IGluc3RydWN0aW9ucyBhbmQgaW5oZXJpdGVkIGV2ZW50IGxpc3RlbmVycy4gRW5zdXJlIGNsYXNzIG1ldGFkYXRhIGlzIHJlYWR5LiAqL1xuZnVuY3Rpb24gcHJlcGFyZShtb2RlbDogTW9kZWwpe1xuICBsZXQgVCA9IG1vZGVsLmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGU7XG5cbiAgaWYoVCA9PT0gTW9kZWwpXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNyZWF0ZSBiYXNlIE1vZGVsLlwiKTtcblxuICBjb25zdCBjaGFpbiA9IFtdIGFzIE1vZGVsLlR5cGVbXTtcbiAgbGV0IGtleXMgPSBuZXcgTWFwPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IHZvaWQ+KCk7XG5cbiAgSUQuc2V0KG1vZGVsLCBgJHtUfS0ke3VpZCgpfWApO1xuXG4gIHdoaWxlKFQubmFtZSl7XG4gICAgZm9yKGNvbnN0IGNiIG9mIE5PVElGWS5nZXQoVCkgfHwgW10pXG4gICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgY2IpO1xuXG4gICAgaWYoVCA9PT0gTW9kZWwpIGJyZWFrO1xuICAgIGVsc2UgY2hhaW4udW5zaGlmdChUKTtcblxuICAgIFQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoVClcbiAgfVxuXG4gIGZvcihjb25zdCB0eXBlIG9mIGNoYWluKXtcbiAgICBpZihNRVRIT0RTLmhhcyh0eXBlKSl7XG4gICAgICBrZXlzID0gTUVUSE9EUy5nZXQodHlwZSkhO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgTUVUSE9EUy5zZXQodHlwZSwga2V5cyA9IG5ldyBNYXAoa2V5cykpO1xuXG4gICAgZm9yKGNvbnN0IFtrZXksIHsgdmFsdWUgfV0gb2YgT2JqZWN0LmVudHJpZXMoXG4gICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0eXBlLnByb3RvdHlwZSlcbiAgICApKXtcbiAgICAgIGlmKCF2YWx1ZSB8fCBrZXkgPT0gXCJjb25zdHJ1Y3RvclwiKVxuICAgICAgICBjb250aW51ZTtcbiAgICAgIFxuICAgICAgZnVuY3Rpb24gYmluZCh0aGlzOiBNb2RlbCwgb3JpZ2luYWw/OiBGdW5jdGlvbil7XG4gICAgICAgIGNvbnN0IHsgaXMgfSA9IHRoaXM7XG5cbiAgICAgICAgaWYoaXMuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhb3JpZ2luYWwpXG4gICAgICAgICAgcmV0dXJuIHZhbHVlIGFzIEZ1bmN0aW9uO1xuXG4gICAgICAgIGNvbnN0IGZuID0gb3JpZ2luYWwgfHwgdmFsdWU7XG4gICAgICAgIGNvbnN0IGJvdW5kID0gZm4uYmluZChpcyk7XG4gICAgICAgIFxuICAgICAgICBNRVRIT0Quc2V0KGJvdW5kLCBmbik7XG4gICAgICAgIGRlZmluZShpcywga2V5LCB7IHZhbHVlOiBib3VuZCwgd3JpdGFibGU6IHRydWUgfSk7XG4gICAgICAgIFxuICAgICAgICByZXR1cm4gYm91bmQ7XG4gICAgICB9XG5cbiAgICAgIGtleXMuc2V0KGtleSwgYmluZCk7XG4gICAgICBkZWZpbmUodHlwZS5wcm90b3R5cGUsIGtleSwgeyBnZXQ6IGJpbmQsIHNldDogYmluZCB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBtb2RlbCBhcmd1ZW1udHMsIHJ1biBjYWxsYmFja3MgYW5kIG9ic2VydmUgcHJvcGVydGllcy5cbiAqIEFjY3VtdWxhdGUgYW5kIGhhbmRsZSBjbGVhbnVwIGV2ZW50cy5cbiAqKi9cbmZ1bmN0aW9uIGluaXQobW9kZWw6IE1vZGVsLCBhcmdzOiBNb2RlbC5BcmdzKXtcbiAgY29uc3Qgc3RhdGUgPSB7fSBhcyBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPjtcblxuICBTVEFURS5zZXQobW9kZWwsIHN0YXRlKTtcblxuICBhcmdzID0gYXJncy5mbGF0KCkuZmlsdGVyKGFyZyA9PiB7XG4gICAgaWYodHlwZW9mIGFyZyAhPSBcInN0cmluZ1wiKVxuICAgICAgcmV0dXJuIHRydWU7XG5cbiAgICBJRC5zZXQobW9kZWwsIGFyZyk7XG4gIH0pO1xuXG4gIGFkZExpc3RlbmVyKG1vZGVsLCAoKSA9PiB7XG4gICAgaWYoIVBBUkVOVC5oYXMobW9kZWwpKVxuICAgICAgUEFSRU5ULnNldChtb2RlbCwgbnVsbCk7XG5cbiAgICBmb3IoY29uc3Qga2V5IGluIG1vZGVsKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG1vZGVsLCBrZXkpITtcblxuICAgICAgaWYoXCJ2YWx1ZVwiIGluIGRlc2MpXG4gICAgICAgIG1hbmFnZShtb2RlbCwga2V5LCBkZXNjLnZhbHVlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBmb3IoY29uc3QgYXJnIG9mIGFyZ3Mpe1xuICAgICAgY29uc3QgdXNlID0gdHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBhcmcuY2FsbChtb2RlbCwgbW9kZWwpXG4gICAgICAgIDogYXJnIGFzIE1vZGVsLkFzc2lnbjxNb2RlbD47XG5cbiAgICAgIGlmKHVzZSBpbnN0YW5jZW9mIFByb21pc2UpXG4gICAgICAgIHVzZS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEFzeW5jIGVycm9yIGluIGNvbnN0cnVjdG9yIGZvciAke21vZGVsfTpgKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgIH0pO1xuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwiZnVuY3Rpb25cIilcbiAgICAgICAgYWRkTGlzdGVuZXIobW9kZWwsIHVzZSwgbnVsbClcbiAgICAgIGVsc2UgaWYodHlwZW9mIHVzZSA9PSBcIm9iamVjdFwiKVxuICAgICAgICBhc3NpZ24obW9kZWwsIHVzZSwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICAgIGZvcihjb25zdCBbXywgdmFsdWVdIG9mIG1vZGVsKVxuICAgICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE1vZGVsICYmIFBBUkVOVC5nZXQodmFsdWUpID09PSBtb2RlbClcbiAgICAgICAgICB2YWx1ZS5zZXQobnVsbCk7XG4gIFxuICAgICAgT2JqZWN0LmZyZWV6ZShzdGF0ZSk7XG4gICAgfSwgbnVsbCk7XG4gIFxuICAgIHJldHVybiBudWxsO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gbWFuYWdlKHRhcmdldDogTW9kZWwsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZTogYW55LCBzaWxlbnQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQodGFyZ2V0KSE7XG4gIFxuICBmdW5jdGlvbiBnZXQodGhpczogTW9kZWwpe1xuICAgIHJldHVybiB3YXRjaCh0aGlzLCBrZXksIHN0YXRlW2tleV0pO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0KHZhbHVlOiB1bmtub3duLCBzaWxlbnQ/OiBib29sZWFuKXtcbiAgICB1cGRhdGUodGFyZ2V0LCBrZXksIHZhbHVlLCBzaWxlbnQpO1xuICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgIVBBUkVOVC5oYXModmFsdWUpKXtcbiAgICAgIFBBUkVOVC5zZXQodmFsdWUsIHRhcmdldCk7XG4gICAgICBldmVudCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZGVmaW5lKHRhcmdldCwga2V5LCB7IHNldCwgZ2V0IH0pO1xuICBzZXQodmFsdWUsIHNpbGVudCk7XG59XG5cbnR5cGUgUHJveHk8VCA9IGFueT4gPSAoa2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBUKSA9PiBUO1xuXG5jb25zdCBPQlNFUlZFUiA9IG5ldyBXZWFrTWFwPE1vZGVsLCBQcm94eT4oKTtcblxuZnVuY3Rpb24gd2F0Y2goZnJvbTogTW9kZWwsIGtleTogc3RyaW5nIHwgbnVtYmVyLCB2YWx1ZT86IGFueSl7XG4gIGNvbnN0IGFjY2VzcyA9IE9CU0VSVkVSLmdldChmcm9tKTtcbiAgcmV0dXJuIGFjY2VzcyA/IGFjY2VzcyhrZXksIHZhbHVlKSA6IHZhbHVlO1xufVxuXG5mdW5jdGlvbiBmZXRjaChzdWJqZWN0OiBNb2RlbCwgcHJvcGVydHk6IHN0cmluZywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuICBcbiAgaWYocHJvcGVydHkgaW4gc3RhdGUgfHwgcmVxdWlyZWQgPT09IGZhbHNlKXtcbiAgICBjb25zdCB2YWx1ZSA9IHN0YXRlW3Byb3BlcnR5XTtcblxuICAgIGlmKHZhbHVlICE9PSB1bmRlZmluZWQgfHwgIXJlcXVpcmVkKVxuICAgICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IoYCR7c3ViamVjdH0uJHtwcm9wZXJ0eX0gaXMgbm90IHlldCBhdmFpbGFibGUuYCk7XG4gIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBhZGRMaXN0ZW5lcihzdWJqZWN0LCBrZXkgPT4ge1xuICAgICAgaWYoa2V5ID09PSBwcm9wZXJ0eSl7XG4gICAgICAgIHJlc29sdmUoc3RhdGVba2V5XSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZihrZXkgPT09IG51bGwpXG4gICAgICAgIHJlamVjdChuZXcgRXJyb3IoYCR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhyb3cgT2JqZWN0LmFzc2lnbihwcm9taXNlLCB7XG4gICAgdG9TdHJpbmc6ICgpID0+IFN0cmluZyhlcnJvciksXG4gICAgbmFtZTogXCJTdXNwZW5zZVwiLFxuICAgIG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UsXG4gICAgc3RhY2s6IGVycm9yLnN0YWNrXG4gIH0pO1xufVxuXG4vKiogQ3VycmVudGx5IGFjY3VtdWxhdGluZyBleHBvcnQuIFN0b3JlcyByZWFsIHZhbHVlcyBvZiBwbGFjZWhvbGRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgcmVmKCkgb3IgY2hpbGQgbW9kZWxzLiAqL1xubGV0IEVYUE9SVDogTWFwPGFueSwgYW55PiB8IHVuZGVmaW5lZDtcblxuZnVuY3Rpb24gc25hcHNob3Q8VCBleHRlbmRzIE1vZGVsPihtb2RlbDogVCk6IE1vZGVsLlN0YXRlPFQ+IHtcbiAgY29uc3QgdmFsdWVzID0ge30gYXMgYW55O1xuICBsZXQgaXNOb3RSZWN1cnNpdmU7XG5cbiAgaWYoIUVYUE9SVCl7XG4gICAgaXNOb3RSZWN1cnNpdmUgPSB0cnVlO1xuICAgIEVYUE9SVCA9IG5ldyBNYXAoW1ttb2RlbCwgdmFsdWVzXV0pO1xuICB9XG5cbiAgZm9yKGxldCBba2V5LCB2YWx1ZV0gb2YgbW9kZWwpe1xuICAgIGlmKEVYUE9SVC5oYXModmFsdWUpKVxuICAgICAgdmFsdWUgPSBFWFBPUlQuZ2V0KHZhbHVlKTtcbiAgICBlbHNlIGlmKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIFwiZ2V0XCIgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLmdldCA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgRVhQT1JULnNldCh2YWx1ZSwgdmFsdWUgPSB2YWx1ZS5nZXQoKSk7XG5cbiAgICB2YWx1ZXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgaWYoaXNOb3RSZWN1cnNpdmUpXG4gICAgRVhQT1JUID0gdW5kZWZpbmVkO1xuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKHZhbHVlcyk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZTxUPihcbiAgc3ViamVjdDogTW9kZWwsXG4gIGtleTogc3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLFxuICB2YWx1ZTogVCxcbiAgYXJnPzogYm9vbGVhbiB8IE1vZGVsLlNldHRlcjxUPil7XG5cbiAgY29uc3Qgc3RhdGUgPSBTVEFURS5nZXQoc3ViamVjdCkhO1xuXG4gIGlmKE9iamVjdC5pc0Zyb3plbihzdGF0ZSkpXG4gICAgdGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byB1cGRhdGUgJHtTdHJpbmcoa2V5KX0gYnV0ICR7c3ViamVjdH0gaXMgZGVzdHJveWVkLmApO1xuXG4gIGNvbnN0IHByZXZpb3VzID0gc3RhdGVba2V5XSBhcyBUO1xuXG4gIGlmKHR5cGVvZiBhcmcgPT0gXCJmdW5jdGlvblwiKXtcbiAgICBjb25zdCBvdXQgPSBhcmcuY2FsbChzdWJqZWN0LCB2YWx1ZSwgcHJldmlvdXMpO1xuXG4gICAgaWYob3V0ID09PSBmYWxzZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGlmKHR5cGVvZiBvdXQgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgdmFsdWUgPSBvdXQoKTtcbiAgfVxuXG4gIGlmKHZhbHVlID09PSBwcmV2aW91cyAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKVxuICAgIHJldHVybjtcblxuICBzdGF0ZVtrZXldID0gdmFsdWU7XG5cbiAgaWYoYXJnICE9PSB0cnVlKVxuICAgIGV2ZW50KHN1YmplY3QsIGtleSk7XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKiBSYW5kb20gYWxwaGFudW1iZXJpYyBvZiBsZW5ndGggNjsgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbGV0dGVyLiAqL1xuZnVuY3Rpb24gdWlkKCl7XG4gIHJldHVybiAoMC4yNzggKyBNYXRoLnJhbmRvbSgpICogMC43MjIpLnRvU3RyaW5nKDM2KS5zdWJzdHJpbmcoMiwgOCkudG9VcHBlckNhc2UoKTtcbn1cblxuZXhwb3J0IHtcbiAgZXZlbnQsXG4gIGZldGNoLFxuICBNRVRIT0QsXG4gIE1vZGVsLFxuICBQQVJFTlQsXG4gIFNUQVRFLFxuICB1aWQsXG4gIHVwZGF0ZSxcbiAgd2F0Y2hcbn0iXSwKICAibWFwcGluZ3MiOiAiQUFBQSxTQUFTLGFBQWEsY0FBYyxPQUFPLFlBQXNCLG9CQUFvQjtBQUVyRixNQUFNLFNBQVMsT0FBTztBQUd0QixNQUFNLEtBQUssb0JBQUksUUFBdUI7QUFHdEMsTUFBTSxRQUFRLG9CQUFJLFFBQTBEO0FBRzVFLE1BQU0sU0FBUyxvQkFBSSxRQUFtQztBQUd0RCxNQUFNLFNBQVMsb0JBQUksUUFBNkI7QUFHaEQsTUFBTSxVQUFVLG9CQUFJLFFBQXVEO0FBRzNFLE1BQU0sU0FBUyxvQkFBSSxRQUFrQjtBQW1IckMsTUFBZSxNQUE0QjtBQUFBLEVBQ3pDLGVBQWUsTUFBaUI7QUFDOUIsWUFBUSxJQUFJO0FBQ1osV0FBTyxNQUFNLE1BQU0sRUFBRSxPQUFPLEtBQUssQ0FBQztBQUNsQyxTQUFLLE1BQU0sSUFBSTtBQUFBLEVBQ2pCO0FBQUEsRUFFQSxDQUFDLFVBQVUsRUFBRSxVQUFvQixVQUFtQjtBQUNsRCxVQUFNQSxTQUFRLG9CQUFJLElBQXVCO0FBQ3pDLFVBQU0sUUFBUSxPQUFPLE9BQU8sSUFBSTtBQUVoQyxnQkFBWSxNQUFNLFVBQVVBLE1BQUs7QUFDakMsYUFBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLFVBQVU7QUFDbEMsVUFBRyxVQUFVLFVBQWE7QUFDeEIsY0FBTSxJQUFJLE1BQU0sR0FBRyxJQUFJLElBQUksR0FBRywrQkFBK0I7QUFFL0QsTUFBQUEsT0FBTSxJQUFJLEdBQUc7QUFFYixVQUFHLGlCQUFpQixVQUFVLGNBQWM7QUFDMUMsZUFBTyxNQUFNLFVBQVUsRUFBRSxVQUFVLFFBQVE7QUFFN0MsYUFBTztBQUFBLElBQ1QsQ0FBQztBQUVELFdBQU87QUFBQSxFQUNUO0FBQUEsRUFxREEsSUFBSSxNQUEyQyxNQUEyQztBQUN4RixVQUFNLE9BQU8sS0FBSztBQUVsQixRQUFHLE9BQU8sUUFBUSxZQUFXO0FBQzNCLFVBQUksVUFBVSxvQkFBSSxJQUF1QjtBQUV6QyxhQUFPLGFBQWEsTUFBTSxDQUFDLFVBQVU7QUFDbkMsY0FBTSxLQUFLLEtBQUssS0FBSyxPQUFPLE9BQU8sT0FBTztBQUUxQyxlQUFPLE9BQU8sT0FBTyxPQUFRLENBQUNDLFlBQVc7QUFDdkMsb0JBQVUsYUFBYSxJQUFJLElBQUk7QUFDL0IsY0FBRyxPQUFPLE1BQU07QUFDZCxlQUFHQSxPQUFNO0FBQUEsUUFDYjtBQUFBLE1BQ0YsQ0FBQztBQUFBLElBQ0g7QUFFQSxXQUNFLFNBQVMsU0FBWSxTQUFTLElBQUksSUFDbEMsT0FBTyxRQUFRLGFBQWEsWUFBWSxNQUFNLE1BQU0sSUFBSSxJQUN4RCxTQUFTLE9BQU8sT0FBTyxTQUFTLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFDL0MsTUFBTSxNQUFNLE1BQU0sSUFBSTtBQUFBLEVBRTFCO0FBQUEsRUFtRkEsSUFDRSxNQUNBLE1BQ0EsTUFBZTtBQUVmLFVBQU0sT0FBTyxLQUFLO0FBRWxCLFFBQUcsT0FBTyxRQUFRO0FBQ2hCLGFBQU8sWUFBWSxNQUFNLFNBQU87QUFDOUIsWUFBRyxTQUFTLE9BQU8sU0FBUyxVQUFhLE9BQU8sT0FBTztBQUNyRCxpQkFBTyxLQUFLLEtBQUssTUFBTSxLQUFLLElBQUk7QUFBQSxNQUNwQyxDQUFDO0FBRUgsUUFBRyxRQUFRLE9BQU8sUUFBUTtBQUN4QixhQUFPLE1BQU0sTUFBTSxTQUFTLElBQUk7QUFBQSxhQUMxQixDQUFDO0FBQ1AsWUFBTSxNQUFNLElBQUk7QUFBQSxhQUNWO0FBQ04sYUFBTyxNQUFNLE1BQXlCLElBQUk7QUFBQTtBQUUxQyxhQUFPLE1BQU0sTUFBeUIsSUFBSTtBQUU1QyxVQUFNLFVBQVUsYUFBYSxJQUFJLElBQUk7QUFFckMsUUFBRztBQUNELGFBQTBDO0FBQUEsUUFDeEMsTUFBTSxDQUFDLFFBQVEsSUFBSSxRQUFhLENBQUFDLFNBQU87QUFDckMsZ0JBQU0sU0FBUyxZQUFZLE1BQU0sU0FBTztBQUN0QyxnQkFBRyxRQUFRLE1BQUs7QUFDZCxxQkFBTztBQUNQLHFCQUFPQSxLQUFJLEtBQUssTUFBTSxNQUFNLEtBQUssT0FBTyxDQUFDO0FBQUEsWUFDM0M7QUFBQSxVQUNGLENBQUM7QUFBQSxRQUNILENBQUMsRUFBRSxLQUFLLEdBQUc7QUFBQSxNQUNiO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFNQSxDQUFDLE9BQU8sUUFBUSxJQUFpQztBQUMvQyxXQUFPLE9BQU8sUUFBUSxNQUFNLElBQUksS0FBSyxFQUFFLENBQUUsRUFBRSxPQUFPLFFBQVEsRUFBRTtBQUFBLEVBQzlEO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVNBLE9BQU8sT0FBNkMsTUFBb0I7QUFDdEUsVUFBTSxXQUFXLElBQUksS0FBSyxHQUFHLElBQUk7QUFDakMsVUFBTSxRQUFRO0FBQ2QsV0FBTztBQUFBLEVBQ1Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQVFBLE9BQU8sR0FBa0MsT0FBNEI7QUFDbkUsV0FBTyxVQUFVLFFBQVEsT0FBTyxTQUFTLGNBQWMsTUFBTSxxQkFBcUI7QUFBQSxFQUNwRjtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsT0FBTyxHQUF5QyxVQUEyQjtBQUN6RSxRQUFJLFNBQVMsT0FBTyxJQUFJLElBQUk7QUFFNUIsUUFBRyxDQUFDO0FBQ0YsYUFBTyxJQUFJLE1BQU0sU0FBUyxvQkFBSSxLQUFHO0FBRW5DLFdBQU8sSUFBSSxRQUFRO0FBRW5CLFdBQU8sTUFBTSxPQUFPLE9BQU8sUUFBUTtBQUFBLEVBQ3JDO0FBQ0Y7QUFFQSxPQUFPLE1BQU0sV0FBVyxZQUFZO0FBQUEsRUFDbEMsUUFBTztBQUNMLFdBQU8sR0FBRyxJQUFJLEtBQUssRUFBRTtBQUFBLEVBQ3ZCO0FBQ0YsQ0FBQztBQUVELE9BQU8sT0FBTyxZQUFZO0FBQUEsRUFDeEIsUUFBTztBQUNMLFdBQU8sS0FBSztBQUFBLEVBQ2Q7QUFDRixDQUFDO0FBRUQsU0FBUyxPQUFPLFNBQWdCLE1BQTJCLFFBQWlCO0FBQzFFLFFBQU0sVUFBVSxRQUFRLElBQUksUUFBUSxXQUF5QjtBQUU3RCxhQUFVLE9BQU8sTUFBSztBQUNwQixVQUFNLE9BQU8sUUFBUSxJQUFJLEdBQUc7QUFFNUIsUUFBRztBQUNELFdBQUssS0FBSyxTQUFTLEtBQUssR0FBRyxDQUFDO0FBQUEsYUFDdEIsT0FBTyxXQUFXLFFBQVEsTUFBSztBQUNyQyxZQUFNLE9BQU8sT0FBTyx5QkFBeUIsU0FBUyxHQUFHO0FBQ3pELFlBQU0sTUFBTSxRQUFRLEtBQUs7QUFFekIsVUFBSSxLQUFLLFNBQVMsS0FBSyxHQUFHLEdBQUcsTUFBTTtBQUFBLElBQ3JDO0FBQUEsRUFDRjtBQUNGO0FBR0EsU0FBUyxRQUFRLE9BQWE7QUFDNUIsTUFBSSxJQUFJLE1BQU07QUFFZCxNQUFHLE1BQU07QUFDUCxVQUFNLElBQUksTUFBTSwyQkFBMkI7QUFFN0MsUUFBTSxRQUFRLENBQUM7QUFDZixNQUFJLE9BQU8sb0JBQUksSUFBa0M7QUFFakQsS0FBRyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7QUFFN0IsU0FBTSxFQUFFLE1BQUs7QUFDWCxlQUFVLE1BQU0sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0FBQ2hDLGtCQUFZLE9BQU8sRUFBRTtBQUV2QixRQUFHLE1BQU0sTUFBTztBQUFBLFFBQ1gsT0FBTSxRQUFRLENBQUM7QUFFcEIsUUFBSSxPQUFPLGVBQWUsQ0FBQztBQUFBLEVBQzdCO0FBRUEsYUFBVSxRQUFRLE9BQU07QUFDdEIsUUFBRyxRQUFRLElBQUksSUFBSSxHQUFFO0FBQ25CLGFBQU8sUUFBUSxJQUFJLElBQUk7QUFDdkI7QUFBQSxJQUNGO0FBRUEsWUFBUSxJQUFJLE1BQU0sT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDO0FBRXRDLGVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssT0FBTztBQUFBLE1BQ25DLE9BQU8sMEJBQTBCLEtBQUssU0FBUztBQUFBLElBQ2pELEdBQUU7QUFJQSxVQUFTQyxRQUFULFNBQTJCLFVBQW9CO0FBQzdDLGNBQU0sRUFBRSxHQUFHLElBQUk7QUFFZixZQUFHLEdBQUcsZUFBZSxHQUFHLEtBQUssQ0FBQztBQUM1QixpQkFBTztBQUVULGNBQU0sS0FBSyxZQUFZO0FBQ3ZCLGNBQU0sUUFBUSxHQUFHLEtBQUssRUFBRTtBQUV4QixlQUFPLElBQUksT0FBTyxFQUFFO0FBQ3BCLGVBQU8sSUFBSSxLQUFLLEVBQUUsT0FBTyxPQUFPLFVBQVUsS0FBSyxDQUFDO0FBRWhELGVBQU87QUFBQSxNQUNUO0FBYlMsaUJBQUFBO0FBSFQsVUFBRyxDQUFDLFNBQVMsT0FBTztBQUNsQjtBQWlCRixXQUFLLElBQUksS0FBS0EsS0FBSTtBQUNsQixhQUFPLEtBQUssV0FBVyxLQUFLLEVBQUUsS0FBS0EsT0FBTSxLQUFLQSxNQUFLLENBQUM7QUFBQSxJQUN0RDtBQUFBLEVBQ0Y7QUFDRjtBQU1BLFNBQVMsS0FBSyxPQUFjLE1BQWlCO0FBQzNDLFFBQU0sUUFBUSxDQUFDO0FBRWYsUUFBTSxJQUFJLE9BQU8sS0FBSztBQUV0QixTQUFPLEtBQUssS0FBSyxFQUFFLE9BQU8sU0FBTztBQUMvQixRQUFHLE9BQU8sT0FBTztBQUNmLGFBQU87QUFFVCxPQUFHLElBQUksT0FBTyxHQUFHO0FBQUEsRUFDbkIsQ0FBQztBQUVELGNBQVksT0FBTyxNQUFNO0FBQ3ZCLFFBQUcsQ0FBQyxPQUFPLElBQUksS0FBSztBQUNsQixhQUFPLElBQUksT0FBTyxJQUFJO0FBRXhCLGVBQVUsT0FBTyxPQUFNO0FBQ3JCLFlBQU0sT0FBTyxPQUFPLHlCQUF5QixPQUFPLEdBQUc7QUFFdkQsVUFBRyxXQUFXO0FBQ1osZUFBTyxPQUFPLEtBQUssS0FBSyxPQUFPLElBQUk7QUFBQSxJQUN2QztBQUVBLGVBQVUsT0FBTyxNQUFLO0FBQ3BCLFlBQU0sTUFBTSxPQUFPLE9BQU8sYUFDdEIsSUFBSSxLQUFLLE9BQU8sS0FBSyxJQUNyQjtBQUVKLFVBQUcsZUFBZTtBQUNoQixZQUFJLE1BQU0sU0FBTztBQUNmLGtCQUFRLE1BQU0sa0NBQWtDLEtBQUssR0FBRztBQUN4RCxrQkFBUSxNQUFNLEdBQUc7QUFBQSxRQUNuQixDQUFDO0FBQUEsZUFDSyxPQUFPLE9BQU87QUFDcEIsb0JBQVksT0FBTyxLQUFLLElBQUk7QUFBQSxlQUN0QixPQUFPLE9BQU87QUFDcEIsZUFBTyxPQUFPLEtBQUssSUFBSTtBQUFBLElBQzNCO0FBRUEsZ0JBQVksT0FBTyxNQUFNO0FBQ3ZCLGlCQUFVLENBQUMsR0FBRyxLQUFLLEtBQUs7QUFDdEIsWUFBRyxpQkFBaUIsU0FBUyxPQUFPLElBQUksS0FBSyxNQUFNO0FBQ2pELGdCQUFNLElBQUksSUFBSTtBQUVsQixhQUFPLE9BQU8sS0FBSztBQUFBLElBQ3JCLEdBQUcsSUFBSTtBQUVQLFdBQU87QUFBQSxFQUNULENBQUM7QUFDSDtBQUVBLFNBQVMsT0FBTyxRQUFlLEtBQXNCLE9BQVksUUFBaUI7QUFDaEYsUUFBTSxRQUFRLE1BQU0sSUFBSSxNQUFNO0FBRTlCLFdBQVMsTUFBZ0I7QUFDdkIsV0FBTyxNQUFNLE1BQU0sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUFBLEVBQ3BDO0FBRUEsV0FBUyxJQUFJQyxRQUFnQkMsU0FBaUI7QUFDNUMsV0FBTyxRQUFRLEtBQUtELFFBQU9DLE9BQU07QUFDakMsUUFBR0Qsa0JBQWlCLFNBQVMsQ0FBQyxPQUFPLElBQUlBLE1BQUssR0FBRTtBQUM5QyxhQUFPLElBQUlBLFFBQU8sTUFBTTtBQUN4QixZQUFNQSxNQUFLO0FBQUEsSUFDYjtBQUFBLEVBQ0Y7QUFFQSxTQUFPLFFBQVEsS0FBSyxFQUFFLEtBQUssSUFBSSxDQUFDO0FBQ2hDLE1BQUksT0FBTyxNQUFNO0FBQ25CO0FBSUEsTUFBTSxXQUFXLG9CQUFJLFFBQXNCO0FBRTNDLFNBQVMsTUFBTSxNQUFhLEtBQXNCLE9BQVk7QUFDNUQsUUFBTSxTQUFTLFNBQVMsSUFBSSxJQUFJO0FBQ2hDLFNBQU8sU0FBUyxPQUFPLEtBQUssS0FBSyxJQUFJO0FBQ3ZDO0FBRUEsU0FBUyxNQUFNLFNBQWdCLFVBQWtCLFVBQW1CO0FBQ2xFLFFBQU0sUUFBUSxNQUFNLElBQUksT0FBTztBQUUvQixNQUFHLFlBQVksU0FBUyxhQUFhLE9BQU07QUFDekMsVUFBTSxRQUFRLE1BQU0sUUFBUTtBQUU1QixRQUFHLFVBQVUsVUFBYSxDQUFDO0FBQ3pCLGFBQU87QUFBQSxFQUNYO0FBRUEsUUFBTSxRQUFRLElBQUksTUFBTSxHQUFHLE9BQU8sSUFBSSxRQUFRLHdCQUF3QjtBQUN0RSxRQUFNLFVBQVUsSUFBSSxRQUFhLENBQUMsU0FBUyxXQUFXO0FBQ3BELGdCQUFZLFNBQVMsU0FBTztBQUMxQixVQUFHLFFBQVEsVUFBUztBQUNsQixnQkFBUSxNQUFNLEdBQUcsQ0FBQztBQUNsQixlQUFPO0FBQUEsTUFDVDtBQUVBLFVBQUcsUUFBUTtBQUNULGVBQU8sSUFBSSxNQUFNLEdBQUcsT0FBTyxnQkFBZ0IsQ0FBQztBQUFBLElBQ2hELENBQUM7QUFBQSxFQUNILENBQUM7QUFFRCxRQUFNLE9BQU8sT0FBTyxTQUFTO0FBQUEsSUFDM0IsVUFBVSxNQUFNLE9BQU8sS0FBSztBQUFBLElBQzVCLE1BQU07QUFBQSxJQUNOLFNBQVMsTUFBTTtBQUFBLElBQ2YsT0FBTyxNQUFNO0FBQUEsRUFDZixDQUFDO0FBQ0g7QUFHQSxJQUFJO0FBRUosU0FBUyxTQUEwQixPQUEwQjtBQUMzRCxRQUFNLFNBQVMsQ0FBQztBQUNoQixNQUFJO0FBRUosTUFBRyxDQUFDLFFBQU87QUFDVCxxQkFBaUI7QUFDakIsYUFBUyxvQkFBSSxJQUFJLENBQUMsQ0FBQyxPQUFPLE1BQU0sQ0FBQyxDQUFDO0FBQUEsRUFDcEM7QUFFQSxXQUFRLENBQUMsS0FBSyxLQUFLLEtBQUssT0FBTTtBQUM1QixRQUFHLE9BQU8sSUFBSSxLQUFLO0FBQ2pCLGNBQVEsT0FBTyxJQUFJLEtBQUs7QUFBQSxhQUNsQixTQUFTLE9BQU8sU0FBUyxZQUFZLFNBQVMsU0FBUyxPQUFPLE1BQU0sUUFBUTtBQUNsRixhQUFPLElBQUksT0FBTyxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBRXZDLFdBQU8sR0FBRyxJQUFJO0FBQUEsRUFDaEI7QUFFQSxNQUFHO0FBQ0QsYUFBUztBQUVYLFNBQU8sT0FBTyxPQUFPLE1BQU07QUFDN0I7QUFFQSxTQUFTLE9BQ1AsU0FDQSxLQUNBLE9BQ0EsS0FBZ0M7QUFFaEMsUUFBTSxRQUFRLE1BQU0sSUFBSSxPQUFPO0FBRS9CLE1BQUcsT0FBTyxTQUFTLEtBQUs7QUFDdEIsVUFBTSxJQUFJLE1BQU0sbUJBQW1CLE9BQU8sR0FBRyxDQUFDLFFBQVEsT0FBTyxnQkFBZ0I7QUFFL0UsUUFBTSxXQUFXLE1BQU0sR0FBRztBQUUxQixNQUFHLE9BQU8sT0FBTyxZQUFXO0FBQzFCLFVBQU0sTUFBTSxJQUFJLEtBQUssU0FBUyxPQUFPLFFBQVE7QUFFN0MsUUFBRyxRQUFRO0FBQ1QsYUFBTztBQUVULFFBQUcsT0FBTyxPQUFPO0FBQ2YsY0FBUSxJQUFJO0FBQUEsRUFDaEI7QUFFQSxNQUFHLFVBQVUsWUFBWSxVQUFVO0FBQ2pDO0FBRUYsUUFBTSxHQUFHLElBQUk7QUFFYixNQUFHLFFBQVE7QUFDVCxVQUFNLFNBQVMsR0FBRztBQUVwQixTQUFPO0FBQ1Q7QUFHQSxTQUFTLE1BQUs7QUFDWixVQUFRLFFBQVEsS0FBSyxPQUFPLElBQUksT0FBTyxTQUFTLEVBQUUsRUFBRSxVQUFVLEdBQUcsQ0FBQyxFQUFFLFlBQVk7QUFDbEY7IiwKICAibmFtZXMiOiBbIndhdGNoIiwgInVwZGF0ZSIsICJyZXMiLCAiYmluZCIsICJ2YWx1ZSIsICJzaWxlbnQiXQp9Cg==
|
|
309
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL21vZGVsLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBhZGRMaXN0ZW5lciwgY3JlYXRlRWZmZWN0LCBldmVudCwgT2JzZXJ2YWJsZSwgT25VcGRhdGUsIFBFTkRJTkdfS0VZUyB9IGZyb20gJy4vY29udHJvbCc7XG5cbmNvbnN0IGRlZmluZSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTtcblxuLyoqIFJlZ2lzdGVyIGZvciBhbGwgYWN0aXZlIG1vZGVscyB2aWEgc3RyaW5nIGlkZW50aWZpZXJzICh1c3VhbGx5IHVuaXF1ZSkuICovXG5jb25zdCBJRCA9IG5ldyBXZWFrTWFwPE1vZGVsLCBzdHJpbmc+KCk7XG5cbi8qKiBJbnRlcm5hbCBzdGF0ZSBhc3NpZ25lZCB0byBtb2RlbHMuICovXG5jb25zdCBTVEFURSA9IG5ldyBXZWFrTWFwPE1vZGVsLCBSZWNvcmQ8c3RyaW5nIHwgbnVtYmVyIHwgc3ltYm9sLCB1bmtub3duPj4oKTtcblxuLyoqIEV4dGVybmFsIGxpc3RlbmVycyBmb3IgYW55IGdpdmVuIE1vZGVsLiAqL1xuY29uc3QgTk9USUZZID0gbmV3IFdlYWtNYXA8TW9kZWwuVHlwZSwgU2V0PE9uVXBkYXRlPj4oKTtcblxuLyoqIFBhcmVudC1jaGlsZCByZWxhdGlvbnNoaXBzLiAqL1xuY29uc3QgUEFSRU5UID0gbmV3IFdlYWtNYXA8TW9kZWwsIE1vZGVsIHwgbnVsbD4oKTtcblxuLyoqIExpc3Qgb2YgbWV0aG9kcyBkZWZpbmVkIGJ5IGEgZ2l2ZW4gdHlwZS4gKi9cbmNvbnN0IE1FVEhPRFMgPSBuZXcgV2Vha01hcDxNb2RlbC5UeXBlLCBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4+KCk7XG5cbi8qKiBSZWZlcmVuY2UgYm91bmQgaW5zdGFuY2UgbWV0aG9kcyB0byByZWFsIG9uZXMuICovXG5jb25zdCBNRVRIT0QgPSBuZXcgV2Vha01hcDxhbnksIGFueT4oKTtcblxuZGVjbGFyZSBuYW1lc3BhY2UgTW9kZWwge1xuICAvKiogQW55IHR5cGUgb2YgTW9kZWwsIHVzaW5nIG93biBjbGFzcyBjb25zdHJ1Y3RvciBhcyBpdHMgaWRlbnRpZmllci4gKi9cbiAgdHlwZSBUeXBlPFQgZXh0ZW5kcyBNb2RlbCA9IE1vZGVsPiA9XG4gICAgKGFic3RyYWN0IG5ldyAoLi4uYXJnczogYW55W10pID0+IFQpICYgdHlwZW9mIE1vZGVsO1xuXG4gIC8qKiBBIE1vZGVsIGNvbnN0cnVjdG9yLCBidXQgd2hpY2ggaXMgbm90IGFic3RyYWN0LiAqL1xuICB0eXBlIEluaXQ8VCBleHRlbmRzIE1vZGVsID0gTW9kZWw+ID1cbiAgICAobmV3ICguLi5hcmdzOiBNb2RlbC5BcmdzPFQ+KSA9PiBUKSAmIE9taXQ8dHlwZW9mIE1vZGVsLCBuZXZlcj47XG5cbiAgLyoqXG4gICAqIE1vZGVsIGNvbnN0cnVjdG9yIGNhbGxiYWNrIC0gaXMgY2FsbGVkIHdoZW4gTW9kZWwgZmluaXNoZXMgaW50aWFsaXppbmcuXG4gICAqIFJldHVybmVkIGZ1bmN0aW9uIHdpbGwgcnVuIHdoZW4gbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBDYWxsYmFjazxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPVxuICAgICh0aGlzOiBULCB0aGlzQXJnOiBUKSA9PiBQcm9taXNlPHZvaWQ+IHwgKCgpID0+IHZvaWQpIHwgQXNzaWduPFQ+IHwgdm9pZDtcblxuICAvKiogTW9kZWwgY29uc3RydWN0b3IgYXJndW1lbnQgKi9cbiAgdHlwZSBBcmd1bWVudDxUIGV4dGVuZHMgTW9kZWwgPSBNb2RlbD4gPSBBc3NpZ248VD4gfCBDYWxsYmFjazxUPiB8IHN0cmluZyB8IHZvaWQ7XG5cbiAgLyoqIE1vZGVsIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyAqL1xuICB0eXBlIEFyZ3M8VCBleHRlbmRzIE1vZGVsID0gYW55PiA9IChBcmd1bWVudDxUPiB8IEFyZ3M8VD4pW107XG5cbiAgLyoqIFN1YnNldCBvZiBga2V5b2YgVGAgd2hpY2ggYXJlIG5vdCBtZXRob2RzIG9yIGRlZmluZWQgYnkgYmFzZSBNb2RlbCBVLiAqKi9cbiAgdHlwZSBGaWVsZDxUPiA9IEV4Y2x1ZGU8a2V5b2YgVCwga2V5b2YgTW9kZWw+O1xuXG4gIC8qKiBBbnkgdmFsaWQga2V5IGZvciBtb2RlbCwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBGaWVsZDxUPi4gKi9cbiAgdHlwZSBFdmVudDxUPiA9IEZpZWxkPFQ+IHwgKHN0cmluZyAmIHt9KSB8IG51bWJlciB8IHN5bWJvbDtcblxuICAvKiogT2JqZWN0IG92ZXJsYXkgdG8gb3ZlcnJpZGUgdmFsdWVzIGFuZCBtZXRob2RzIG9uIGEgbW9kZWwuICovXG4gIHR5cGUgQXNzaWduPFQ+ID0ge1xuICAgIFtLIGluIEZpZWxkPFQ+XT86XG4gICAgICBUW0tdIGV4dGVuZHMgKC4uLmFyZ3M6IGluZmVyIEEpID0+IGluZmVyIFIgXG4gICAgICAgID8gKHRoaXM6IFQsIC4uLmFyZ3M6IEEpID0+IFJcbiAgICAgICAgOiBUW0tdO1xuICB9ICYgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLyoqIEV4cG9ydC9JbXBvcnQgY29tcGF0aWJsZSB2YWx1ZSBmb3IgYSBnaXZlbiBwcm9wZXJ0eSBpbiBhIE1vZGVsLiAqL1xuICB0eXBlIEV4cG9ydDxSPiA9IFIgZXh0ZW5kcyB7IGdldCgpOiBpbmZlciBUIH0gPyBUIDogUjtcblxuICAvKiogVmFsdWUgZm9yIGEgcHJvcGVydHkgbWFuYWdlZCBieSBhIG1vZGVsLiAqL1xuICB0eXBlIFZhbHVlPFQgZXh0ZW5kcyBNb2RlbCwgSyBleHRlbmRzIEV2ZW50PFQ+PiA9XG4gICAgSyBleHRlbmRzIGtleW9mIFQgPyBFeHBvcnQ8VFtLXT4gOiB1bmtub3duO1xuXG4gIHR5cGUgT25FdmVudDxUIGV4dGVuZHMgTW9kZWw+ID1cbiAgICAodGhpczogVCwga2V5OiB1bmtub3duLCBzb3VyY2U6IFQpID0+ICgoKSA9PiB2b2lkKSB8IHZvaWQgfCBudWxsO1xuXG4gIHR5cGUgT25VcGRhdGU8VCBleHRlbmRzIE1vZGVsLCBLIGV4dGVuZHMgRXZlbnQ8VD4+ID1cbiAgICAodGhpczogVCwga2V5OiBLLCB0aGlzQXJnOiBLKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBWYWx1ZXMgZnJvbSBjdXJyZW50IHN0YXRlIG9mIGdpdmVuIG1vZGVsLlxuICAgKiBEaWZmZXJzIGZyb20gYFZhbHVlc2AgYXMgdmFsdWVzIGhlcmUgd2lsbCBkcmlsbFxuICAgKiBpbnRvIFwicmVhbFwiIHZhbHVlcyBoZWxkIGJ5IGV4b3RpY3MgbGlrZSByZWYuT2JqZWN0LlxuICAgKi9cbiAgdHlwZSBTdGF0ZTxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dOiBFeHBvcnQ8VFtQXT4gfTtcblxuICAvKiogT2JqZWN0IGNvbXBlcmFibGUgdG8gZGF0YSBmb3VuZCBpbiBULiAqL1xuICB0eXBlIFZhbHVlczxUPiA9IHsgW1AgaW4gRmllbGQ8VD5dPzogRXhwb3J0PFRbUF0+IH07XG5cbiAgLyoqIEV4b3RpYyB2YWx1ZSwgd2hlcmUgYWN0dWFsIHZhbHVlIGlzIGNvbnRhaW5lZCB3aXRoaW4uICovXG4gIHR5cGUgUmVmPFQgPSBhbnk+ID0ge1xuICAgIChuZXh0OiBUKTogdm9pZDtcbiAgICBjdXJyZW50OiBUIHwgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIGlzIHN1YnNjcmliZWQgdG8gcGFyZW50IGFuZCB1cGRhdGVzIHdoZW4gYWNjZXNzZWQgcHJvcGVydGllcyBjaGFuZ2UuXG4gICAqIFxuICAgKiBAcGFyYW0gY3VycmVudCAtIEN1cnJlbnQgc3RhdGUgb2YgdGhpcyBtb2RlbC4gVGhpcyBpcyBhIHByb3h5IHdoaWNoIGRldGVjdHMgcHJvcGVydGllcyB3aGljaFxuICAgKiB3aGVyZSBhY2Nlc3NlZCwgYW5kIHRodXMgZGVwZW5kZWQgdXBvbiB0byBzdGF5IGN1cnJlbnQuXG4gICAqIFxuICAgKiBAcGFyYW0gdXBkYXRlIC0gU2V0IG9mIHByb3BlcnRpZXMgd2hpY2ggaGF2ZSBjaGFuZ2VkLCBhbmQgZXZlbnRzIGZpcmVkLCBzaW5jZSBsYXN0IHVwZGF0ZS5cbiAgICogXG4gICAqIEByZXR1cm5zIEEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGlzIGVmZmVjdCBpcyBzdGFsZS5cbiAgICovXG4gIHR5cGUgRWZmZWN0PFQ+ID0gKHRoaXM6IFQsIGN1cnJlbnQ6IFQsIHVwZGF0ZTogU2V0PEV2ZW50PFQ+PikgPT5cbiAgICBFZmZlY3RDYWxsYmFjayB8IFByb21pc2U8dm9pZD4gfCBudWxsIHwgdm9pZDtcblxuICAvKipcbiAgICogQSBjYWxsYmFjayBmdW5jdGlvbiByZXR1cm5lZCBieSBlZmZlY3QuIFdpbGwgYmUgY2FsbGVkIHdoZW4gZWZmZWN0IGlzIHN0YWxlLlxuICAgKiBcbiAgICogQHBhcmFtIHVwZGF0ZSAtIGB0cnVlYCBpZiB1cGRhdGUgaXMgcGVuZGluZywgYGZhbHNlYCBlZmZlY3QgaGFzIGJlZW4gY2FuY2VsbGVkLCBgbnVsbGAgaWYgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKi9cbiAgdHlwZSBFZmZlY3RDYWxsYmFjayA9ICgodXBkYXRlOiBib29sZWFuIHwgbnVsbCkgPT4gdm9pZCk7XG5cbiAgLyoqXG4gICAqIFByb3BlcnR5IGluaXRpYWxpemVyLCB3aWxsIHJ1biB1cG9uIGluc3RhbmNlIGNyZWF0aW9uLlxuICAgKiBPcHRpb25hbCByZXR1cm5lZCBjYWxsYmFjayB3aWxsIHJ1biB3aGVuIG9uY2UgdXBvbiBmaXJzdCBhY2Nlc3MuXG4gICAqL1xuICB0eXBlIEluc3RydWN0aW9uPFQgPSBhbnksIE0gZXh0ZW5kcyBNb2RlbCA9IGFueT4gPVxuICAgIC8vIFRPRE86IFNob3VsZCB0aGlzIGFsbG93IGZvciBudW1iZXJzL3N5bWJvbCBwcm9wZXJ0aWVzP1xuICAgICh0aGlzOiBNLCBrZXk6IEV4dHJhY3Q8RmllbGQ8TT4sIHN0cmluZz4sIHRoaXNBcmc6IE0sIHN0YXRlOiBTdGF0ZTxNPikgPT5cbiAgICAgIERlc2NyaXB0b3I8VD4gfCAoKHNvdXJjZTogTSkgPT4gVCkgfCB2b2lkO1xuXG4gIHR5cGUgR2V0dGVyPFQ+ID0gKHNvdXJjZTogTW9kZWwpID0+IFQ7XG4gIHR5cGUgU2V0dGVyPFQ+ID0gKHZhbHVlOiBULCBwcmV2aW91czogVCkgPT4gYm9vbGVhbiB8IHZvaWQgfCAoKCkgPT4gVCk7XG5cbiAgdHlwZSBEZXNjcmlwdG9yPFQgPSBhbnk+ID0ge1xuICAgIGdldD86IEdldHRlcjxUPiB8IGJvb2xlYW47XG4gICAgc2V0PzogU2V0dGVyPFQ+IHwgYm9vbGVhbjtcbiAgICBlbnVtZXJhYmxlPzogYm9vbGVhbjtcbiAgICB2YWx1ZT86IFQ7XG4gIH1cbn1cblxuaW50ZXJmYWNlIE1vZGVsIHtcbiAgLyoqXG4gICAqIExvb3BiYWNrIHRvIGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaW4gYSBzdWJzY3JpYmVkIGNvbnRleHQsXG4gICAqIHRvIGtlZXAgd3JpdGUgYWNjZXNzIHRvIGB0aGlzYCBhZnRlciBhIGRlc3RydWN0dXJlLiBZb3UgY2FuIHVzZSBpdCB0byByZWFkIHZhcmlhYmxlcyBzaWxlbnRseSBhcyB3ZWxsLlxuICAgKiovXG4gIGlzOiB0aGlzO1xufVxuXG5hYnN0cmFjdCBjbGFzcyBNb2RlbCBpbXBsZW1lbnRzIE9ic2VydmFibGUge1xuICBjb25zdHJ1Y3RvciguLi5hcmdzOiBNb2RlbC5BcmdzKXtcbiAgICBwcmVwYXJlKHRoaXMpO1xuICAgIGRlZmluZSh0aGlzLCBcImlzXCIsIHsgdmFsdWU6IHRoaXMgfSk7XG4gICAgaW5pdCh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIFtPYnNlcnZhYmxlXShjYWxsYmFjazogT2JzZXJ2YWJsZS5DYWxsYmFjaywgcmVxdWlyZWQ/OiBib29sZWFuKXtcbiAgICBjb25zdCB3YXRjaCA9IG5ldyBTZXQ8TW9kZWwuRXZlbnQ8dGhpcz4+KCk7XG4gICAgY29uc3QgcHJveHkgPSBPYmplY3QuY3JlYXRlKHRoaXMpO1xuICAgIFxuICAgIGFkZExpc3RlbmVyKHRoaXMsICgpID0+IHZvaWQgY2FsbGJhY2soKSwgd2F0Y2gpO1xuXG4gICAgT0JTRVJWRVIuc2V0KHByb3h5LCAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYodmFsdWUgPT09IHVuZGVmaW5lZCAmJiByZXF1aXJlZClcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3RoaXN9LiR7a2V5fSBpcyByZXF1aXJlZCBpbiB0aGlzIGNvbnRleHQuYCk7XG5cbiAgICAgIHdhdGNoLmFkZChrZXkpO1xuXG4gICAgICBpZih2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBPYnNlcnZhYmxlIGluIHZhbHVlKVxuICAgICAgICByZXR1cm4gdmFsdWVbT2JzZXJ2YWJsZV0oY2FsbGJhY2ssIHJlcXVpcmVkKTtcblxuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHByb3h5IGFzIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUHVsbCBjdXJyZW50IHZhbHVlcyBmcm9tIHN0YXRlLiBGbGF0dGVucyBhbGwgbW9kZWxzIGFuZCBleG90aWMgdmFsdWVzIHJlY3Vyc2l2ZWx5LlxuICAgKiBcbiAgICogQHJldHVybnMgT2JqZWN0IHdpdGggYWxsIHZhbHVlcyBmcm9tIHRoaXMgbW9kZWwuXG4gICAqKi9cbiAgZ2V0KCk6IE1vZGVsLlN0YXRlPHRoaXM+O1xuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aGljaCB3aWxsIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4gYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICogXG4gICAqIEBwYXJhbSBlZmZlY3QgRnVuY3Rpb24gdG8gcnVuLCBhbmQgYWdhaW4gd2hlbmV2ZXIgYWNjZXNzZWQgdmFsdWVzIGNoYW5nZS5cbiAgICogICAgICAgICAgICAgICBJZiBlZmZlY3QgcmV0dXJucyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgY2hhbmdlIG9jY3VycyAoc3luY3Jvbm91c2x5KSxcbiAgICogICAgICAgICAgICAgICBlZmZlY3QgaXMgY2FuY2VsbGVkLCBvciBwYXJlbnQgbW9kZWwgaXMgZGVzdHJveWVkLlxuICAgKiBAcmV0dXJucyBGdW5jdGlvbiB0byBjYW5jZWwgbGlzdGVuZXIuXG4gICAqL1xuICBnZXQoZWZmZWN0OiBNb2RlbC5FZmZlY3Q8dGhpcz4pOiAoKSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgdmFsdWUgb2YgYSBwcm9wZXJ0eS5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byBnZXQgdmFsdWUgb2YuXG4gICAqIEBwYXJhbSByZXF1aXJlZCAtIElmIHRydWUsIHdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgcHJvcGVydHkgaXMgbm90IGF2YWlsYWJsZS5cbiAgICogQHJldHVybnMgVmFsdWUgb2YgcHJvcGVydHkuXG4gICAqL1xuICBnZXQ8VCBleHRlbmRzIE1vZGVsLkV2ZW50PHRoaXM+PihrZXk6IFQsIHJlcXVpcmVkPzogYm9vbGVhbik6IE1vZGVsLlZhbHVlPHRoaXMsIFQ+O1xuXG4gIC8qKlxuICAgKiBSdW4gYSBmdW5jdGlvbiB3aGVuIGEgcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogXG4gICAqIEBwYXJhbSBrZXkgLSBQcm9wZXJ0eSB0byB3YXRjaCBmb3IgdXBkYXRlcy5cbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIEByZXR1cm5zIEZ1bmN0aW9uIHRvIGNhbmNlbCBsaXN0ZW5lci5cbiAgICovXG4gIGdldDxUIGV4dGVuZHMgTW9kZWwuRXZlbnQ8dGhpcz4+KGtleTogVCwgY2FsbGJhY2s6IE1vZGVsLk9uVXBkYXRlPHRoaXMsIFQ+KTogKCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2sgaWYgbW9kZWwgaXMgZXhwaXJlZC5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gY2hlY2sgaWYgbW9kZWwgaXMgZXhwaXJlZC5cbiAgICogQHJldHVybnMgYHRydWVgIGlmIG1vZGVsIGlzIGV4cGlyZWQsIGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgZ2V0KHN0YXR1czogbnVsbCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gbW9kZWwgaXMgdG8gYmUgZGVzdHJveWVkLlxuICAgKiBcbiAgICogQHBhcmFtIGNhbGxiYWNrIC0gRnVuY3Rpb24gdG8gY2FsbCB3aGVuIG1vZGVsIGlzIGRlc3Ryb3llZC5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gY2FuY2VsIGxpc3RlbmVyLlxuICAgKi9cbiAgZ2V0KHN0YXR1czogbnVsbCwgY2FsbGJhY2s6ICgpID0+IHZvaWQpOiAoKSA9PiB2b2lkO1xuXG4gIGdldChhcmcxPzogTW9kZWwuRWZmZWN0PHRoaXM+IHwgc3RyaW5nIHwgbnVsbCwgYXJnMj86IGJvb2xlYW4gfCBNb2RlbC5PblVwZGF0ZTx0aGlzLCBhbnk+KXtcbiAgICBjb25zdCBzZWxmID0gdGhpcy5pcztcblxuICAgIGlmKHR5cGVvZiBhcmcxID09IFwiZnVuY3Rpb25cIil7XG4gICAgICBsZXQgcGVuZGluZyA9IG5ldyBTZXQ8TW9kZWwuRXZlbnQ8dGhpcz4+KCk7XG5cbiAgICAgIHJldHVybiBjcmVhdGVFZmZlY3Qoc2VsZiwgKHByb3h5KSA9PiB7XG4gICAgICAgIGNvbnN0IGNiID0gYXJnMS5jYWxsKHByb3h5LCBwcm94eSwgcGVuZGluZyk7XG5cbiAgICAgICAgcmV0dXJuIGNiID09PSBudWxsID8gbnVsbCA6ICgodXBkYXRlKSA9PiB7XG4gICAgICAgICAgcGVuZGluZyA9IFBFTkRJTkdfS0VZUy5nZXQoc2VsZikhO1xuICAgICAgICAgIGlmKHR5cGVvZiBjYiA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICAgICAgICBjYih1cGRhdGUpO1xuICAgICAgICB9KVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIChcbiAgICAgIGFyZzEgPT09IHVuZGVmaW5lZCA/IHNuYXBzaG90KHNlbGYpIDpcbiAgICAgIHR5cGVvZiBhcmcyID09IFwiZnVuY3Rpb25cIiA/IGFkZExpc3RlbmVyKHNlbGYsIGFyZzIsIGFyZzEpIDpcbiAgICAgIGFyZzEgPT09IG51bGwgPyBPYmplY3QuaXNGcm96ZW4oU1RBVEUuZ2V0KHNlbGYpKSA6XG4gICAgICBmZXRjaChzZWxmLCBhcmcxLCBhcmcyKVxuICAgIClcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdXBkYXRlIGluIHByb2dyZXNzLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHdoaWNoIHJlc29sdmVzIG9iamVjdCB3aXRoIHVwZGF0ZWQgdmFsdWVzLCBgdW5kZWZpbmVkYCBpZiB0aGVyZSBubyB1cGRhdGUgaXMgcGVuZGluZy5cbiAgICoqL1xuICBzZXQoKTogUHJvbWlzZUxpa2U8TW9kZWwuRXZlbnQ8dGhpcz5bXT4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBtdWxpdHBsZSBwcm9wZXJ0aWVzIGF0IG9uY2UuIE1lcmdlcyBhcmd1bWVudCB3aXRoIGN1cnJlbnQgc3RhdGUuXG4gICAqIFByb3BlcnRpZXMgd2hpY2ggYXJlIG5vdCBtYW5hZ2VkIGJ5IHRoaXMgbW9kZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgKiBcbiAgICogQHBhcmFtIGFzc2lnbiAtIE9iamVjdCB3aXRoIHByb3BlcnRpZXMgdG8gdXBkYXRlLlxuICAgKiBAcGFyYW0gc2lsZW50IC0gSWYgYW4gdXBkYXRlIGRvZXMgb2NjdXIsIGxpc3RlbmVycyB3aWxsIG5vdCBiZSByZWZyZXNoZWQgYXV0b21hdGljYWxseS5cbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLCBgdW5kZWZpbmVkYCAoaW1tZWRpYXRlbHkpIGlmIGEgbm9vcC5cbiAgICovXG4gIHNldChhc3NpZ24/OiBNb2RlbC5Bc3NpZ248dGhpcz4sIHNpbGVudD86IGJvb2xlYW4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogUHVzaCBhbiB1cGRhdGUuIFRoaXMgd2lsbCBub3QgY2hhbmdlIHRoZSB2YWx1ZSBvZiBhc3NvY2lhdGVkIHByb3BlcnR5LlxuICAgKiBcbiAgICogVXNlZnVsIHdoZXJlIGEgcHJvcGVydHkgdmFsdWUgaW50ZXJuYWxseSBoYXMgY2hhbmdlZCwgYnV0IHRoZSBvYmplY3QgaXMgdGhlIHNhbWUuXG4gICAqIEZvciBleGFtcGxlOiBBbiBhcnJheSBoYXMgcHVzaGVkIGEgbmV3IHZhbHVlLCBvciBhIG5lc3RlZCBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBcbiAgICogWW91IGNhbiBhbHNvIHVzZSB0aGlzIHRvIGRpc3BhdGNoIGFyYml0cmFyeSBldmVudHMuXG4gICAqIFN5bWJvbHMgYXJlIHJlY29tbWVuZGVkIGFzIG5vbi1wcm9wZXJ0eSBldmVudHMsIGhvd2V2ZXIgeW91IGNhbiB1c2UgYW55IHN0cmluZy5cbiAgICogSWYgZG9pbmcgc28sIGJlIHN1cmUgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIHByb3BlcnR5IG5hbWVzISBBbiBlYXN5IHdheSB0byBkbyB0aGlzIGlzXG4gICAqIHRvIHByZWZpeCBhbiBldmVudCB3aXRoIFwiIVwiIGFuZC9vciB1c2UgZGFzaC1jYXNlLiBlLmcuIGBzZXQoXCIhZXZlbnRcIilgIG9yIGBzZXQoXCJteS1ldmVudFwiKWAuXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgb3IgZXZlbnQgdG8gZGlzcGF0Y2guXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4pOiBQcm9taXNlTGlrZTxNb2RlbC5FdmVudDx0aGlzPltdPjtcblxuICAvKipcbiAgICogU2V0IGEgdmFsdWUgZm9yIGEgcHJvcGVydHkuIFRoaXMgd2lsbCB1cGRhdGUgdGhlIHZhbHVlIGFuZCBub3RpZnkgbGlzdGVuZXJzLlxuICAgKiBcbiAgICogKipVc2Ugd2l0aCBjYXV0aW9uISoqIEtleSBub3IgdmFsdWUgYXJlIGNoZWNrZWQgZm9yIHZhbGlkaXR5LlxuICAgKiBcbiAgICogVGhpcyBpcyBtZWFudCBmb3IgYXNzaWduaW5nIHZhbHVlcyBwcm9ncmFtbWF0aWNhbGx5LFxuICAgKiB3aGVyZSBzaW1wbGUgYXNzaWdubWVudCBpcyBub3QgcHJhY3RpY2FibGUuXG4gICAqIFxuICAgKiBGb3IgZXhhbXBsZTogYCh0aGlzIGFzIGFueSlbbXlQcm9wZXJ0eV0gPSB2YWx1ZTtgXG4gICAqIFxuICAgKiBAcGFyYW0ga2V5IC0gUHJvcGVydHkgdG8gc2V0IHZhbHVlIGZvci5cbiAgICogQHBhcmFtIHZhbHVlIC0gVmFsdWUgdG8gc2V0IGZvciBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIGluaXQgLSBJZiB0cnVlLCBtb2RlbCB3aWxsIGJlZ2luIHRvIG1hbmFnZSB0aGUgcHJvcGVydHkgaWYgaXQgaXMgbm90IGFscmVhZHkuXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2ZXMgYW4gYXJyYXkgb2Yga2V5cyB1cGRhdGVkLlxuICAgKi9cbiAgc2V0KGtleTogTW9kZWwuRXZlbnQ8dGhpcz4sIHZhbHVlOiB1bmtub3duLCBpbml0PzogYm9vbGVhbik6IFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+O1xuXG4gIC8qKlxuICAgKiBDYWxsIGEgZnVuY3Rpb24gd2hlbiB1cGRhdGUgb2NjdXJzLlxuICAgKiBcbiAgICogR2l2ZW4gZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBhc3NpZ25tZW50ICh3aGljaCBjaGFuZ2VzIHZhbHVlKSBvciBleHBsaWNpdCBgc2V0YC5cbiAgICogXG4gICAqIFRvIHJ1biBsb2dpYyBvbiBmaW5hbCB2YWx1ZSBvbmx5LCBjYWxsYmFjayBtYXkgcmV0dXJuIGEgZnVuY3Rpb24uIFVzaW5nIHRoZSBzYW1lXG4gICAqIGZ1bmN0aW9uIGZvciBvbmUgb3IgbW9yZSBldmVudHMgd2lsbCBlbnN1cmUgaXQgaXMgY2FsbGVkIG9ubHkgd2hlbiBldmVudHMgYXJlIHNldHRsZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdXBkYXRlIG9jY3Vycy5cbiAgICogQHJldHVybnMgRnVuY3Rpb24gdG8gcmVtb3ZlIGxpc3RlbmVyLiBXaWxsIHJldHVybiBgdHJ1ZWAgaWYgcmVtb3ZlZCwgYGZhbHNlYCBpZiBpbmFjdGl2ZSBhbHJlYWR5LlxuICAgKiBcbiAgKi9cbiAgc2V0KGNhbGxiYWNrOiBNb2RlbC5PbkV2ZW50PHRoaXM+KTogKCkgPT4gYm9vbGVhbjtcblxuICAvKipcbiAgICogQ2FsbCBhIGZ1bmN0aW9uIHdoZW4gYSBwcm9wZXJ0eSBpcyB1cGRhdGVkLlxuICAgKiBVbmxpa2UgYGdldGAsIHRoaXMgY2Fsc2wgc3luY2hyb25vdXNseSBhbmQgd2lsbCBmaXJlIGFzIG1hbnkgdGltZXMgYXMgdGhlIHByb3BlcnR5IGlzIHVwZGF0ZWQuXG4gICAqIFxuICAgKiBAcGFyYW0gY2FsbGJhY2sgLSBGdW5jdGlvbiB0byBjYWxsIHdoZW4gcHJvcGVydHkgaXMgdXBkYXRlZC5cbiAgICogQHBhcmFtIGV2ZW50IC0gUHJvcGVydHkgdG8gd2F0Y2ggZm9yIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoY2FsbGJhY2s6IE1vZGVsLk9uRXZlbnQ8dGhpcz4sIGV2ZW50OiBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwpOiAoKSA9PiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEZWNsYXJlIGFuIGVuZCB0byB1cGRhdGVzLiBUaGlzIGV2ZW50IGlzIGZpbmFsIGFuZCB3aWxsIGZyZWV6ZSBzdGF0ZS5cbiAgICogVGhpcyBldmVudCBjYW4gYmUgd2F0Y2hlZCBmb3IgYXMgd2VsbCwgdG8gcnVuIGNsZWFudXAgbG9naWMgYW5kIGludGVybmFsbHkgd2lsbCByZW1vdmUgYWxsIGxpc3RlbmVycy5cbiAgICogXG4gICAqIEBwYXJhbSBzdGF0dXMgLSBgbnVsbGAgdG8gZW5kIHVwZGF0ZXMuXG4gICAqL1xuICBzZXQoc3RhdHVzOiBudWxsKTogdm9pZDtcblxuICBzZXQoXG4gICAgYXJnMT86IE1vZGVsLk9uRXZlbnQ8dGhpcz4gfCBNb2RlbC5Bc3NpZ248dGhpcz4gfCBNb2RlbC5FdmVudDx0aGlzPiB8IG51bGwsXG4gICAgYXJnMj86IHVua25vd24sXG4gICAgYXJnMz86IGJvb2xlYW4pe1xuXG4gICAgY29uc3Qgc2VsZiA9IHRoaXMuaXM7XG5cbiAgICBpZih0eXBlb2YgYXJnMSA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICByZXR1cm4gYWRkTGlzdGVuZXIoc2VsZiwga2V5ID0+IHtcbiAgICAgICAgaWYoYXJnMiA9PT0ga2V5IHx8IGFyZzIgPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Yga2V5ID09IFwic3RyaW5nXCIpXG4gICAgICAgICAgcmV0dXJuIGFyZzEuY2FsbChzZWxmLCBrZXksIHNlbGYpO1xuICAgICAgfSlcbiAgICAgIFxuICAgIGlmKGFyZzEgJiYgdHlwZW9mIGFyZzEgPT0gXCJvYmplY3RcIilcbiAgICAgIGFzc2lnbihzZWxmLCBhcmcxLCBhcmcyID09PSB0cnVlKTtcbiAgICBlbHNlIGlmKCFhcmcyKVxuICAgICAgZXZlbnQoc2VsZiwgYXJnMSk7XG4gICAgZWxzZSBpZihhcmczKVxuICAgICAgbWFuYWdlKHNlbGYsIGFyZzEgYXMgc3RyaW5nIHwgbnVtYmVyLCBhcmcyKTtcbiAgICBlbHNlXG4gICAgICB1cGRhdGUoc2VsZiwgYXJnMSBhcyBzdHJpbmcgfCBudW1iZXIsIGFyZzIpXG5cbiAgICBjb25zdCBwZW5kaW5nID0gUEVORElOR19LRVlTLmdldCh0aGlzKTtcblxuICAgIGlmKHBlbmRpbmcpXG4gICAgICByZXR1cm4gPFByb21pc2VMaWtlPE1vZGVsLkV2ZW50PHRoaXM+W10+PiB7XG4gICAgICAgIHRoZW46IChyZXMpID0+IG5ldyBQcm9taXNlPGFueT4ocmVzID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmUgPSBhZGRMaXN0ZW5lcih0aGlzLCBrZXkgPT4ge1xuICAgICAgICAgICAgaWYoa2V5ICE9PSB0cnVlKXtcbiAgICAgICAgICAgICAgcmVtb3ZlKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZXMuYmluZChudWxsLCBBcnJheS5mcm9tKHBlbmRpbmcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkudGhlbihyZXMpXG4gICAgICB9XG4gIH1cblxuICAvKipcbiAgICogSXRlcmF0ZSBvdmVyIG1hbmFnZWQgcHJvcGVydGllcyBpbiB0aGlzIGluc3RhbmNlIG9mIE1vZGVsLlxuICAgKiBZZWlsZHMgdGhlIGtleSBhbmQgY3VycmVudCB2YWx1ZSBmb3IgZWFjaCBwcm9wZXJ0eS5cbiAgICovXG4gIFtTeW1ib2wuaXRlcmF0b3JdKCk6IEl0ZXJhdG9yPFtzdHJpbmcsIHVua25vd25dPiB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKFNUQVRFLmdldCh0aGlzLmlzKSEpW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW5kIGFjdGl2YXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgbW9kZWwuXG4gICAqIFxuICAgKiAqKkltcG9ydGFudCoqIC0gVW5saWtlIGBuZXcgdGhpcyguLi4pYCAtIHRoaXMgbWV0aG9kIGFsc28gYWN0aXZhdGVzIHN0YXRlLlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBhcmd1bWVudHMgc2VudCB0byBjb25zdHJ1Y3RvclxuICAgKi9cbiAgc3RhdGljIG5ldzxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLkluaXQ8VD4sIC4uLmFyZ3M6IE1vZGVsLkFyZ3M8VD4pe1xuICAgIGNvbnN0IGluc3RhbmNlID0gbmV3IHRoaXMoLi4uYXJncyk7XG4gICAgZXZlbnQoaW5zdGFuY2UpO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGF0aWMgZXF1aXZhbGVudCBvZiBgeCBpbnN0YW5jZW9mIHRoaXNgLlxuICAgKiBEZXRlcm1pbmVzIGlmIHByb3ZpZGVkIGNsYXNzIGlzIGEgc3VidHlwZSBvZiB0aGlzIG9uZS5cbiAgICogSWYgc28sIGxhbmd1YWdlIHNlcnZlciB3aWxsIG1ha2UgYXZhaWxhYmxlIGFsbCBzdGF0aWNcbiAgICogbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGlzIGNsYXNzLlxuICAgKi9cbiAgc3RhdGljIGlzPFQgZXh0ZW5kcyBNb2RlbC5UeXBlPih0aGlzOiBULCBtYXliZTogdW5rbm93bik6IG1heWJlIGlzIFQge1xuICAgIHJldHVybiBtYXliZSA9PT0gdGhpcyB8fCB0eXBlb2YgbWF5YmUgPT0gXCJmdW5jdGlvblwiICYmIG1heWJlLnByb3RvdHlwZSBpbnN0YW5jZW9mIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBydW4gd2hlbiBhbnkgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCBpcyB1cGRhdGVkLiBcbiAgICovXG4gIHN0YXRpYyBvbjxUIGV4dGVuZHMgTW9kZWw+KHRoaXM6IE1vZGVsLlR5cGU8VD4sIGxpc3RlbmVyOiBNb2RlbC5PbkV2ZW50PFQ+KXtcbiAgICBsZXQgbm90aWZ5ID0gTk9USUZZLmdldCh0aGlzKTtcblxuICAgIGlmKCFub3RpZnkpXG4gICAgICBOT1RJRlkuc2V0KHRoaXMsIG5vdGlmeSA9IG5ldyBTZXQpO1xuXG4gICAgbm90aWZ5LmFkZChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gbm90aWZ5LmRlbGV0ZShsaXN0ZW5lcik7XG4gIH1cbn1cblxuZGVmaW5lKE1vZGVsLnByb3RvdHlwZSwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIElELmdldCh0aGlzLmlzKTtcbiAgfVxufSk7XG5cbmRlZmluZShNb2RlbCwgXCJ0b1N0cmluZ1wiLCB7XG4gIHZhbHVlKCl7XG4gICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgfVxufSk7XG5cbmZ1bmN0aW9uIGFzc2lnbihzdWJqZWN0OiBNb2RlbCwgZGF0YTogTW9kZWwuQXNzaWduPE1vZGVsPiwgc2lsZW50PzogYm9vbGVhbil7XG4gIGNvbnN0IG1ldGhvZHMgPSBNRVRIT0RTLmdldChzdWJqZWN0LmNvbnN0cnVjdG9yIGFzIE1vZGVsLlR5cGUpITtcbiAgICBcbiAgZm9yKGNvbnN0IGtleSBpbiBkYXRhKXtcbiAgICBjb25zdCBiaW5kID0gbWV0aG9kcy5nZXQoa2V5KTtcblxuICAgIGlmKGJpbmQpXG4gICAgICBiaW5kLmNhbGwoc3ViamVjdCwgZGF0YVtrZXldKTtcbiAgICBlbHNlIGlmKGtleSBpbiBzdWJqZWN0ICYmIGtleSAhPT0gXCJpc1wiKXtcbiAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHN1YmplY3QsIGtleSkhO1xuICAgICAgY29uc3Qgc2V0ID0gZGVzYyAmJiBkZXNjLnNldCBhcyAodmFsdWU6IGFueSwgc2lsZW50PzogYm9vbGVhbikgPT4gdm9pZDtcblxuICAgICAgc2V0LmNhbGwoc3ViamVjdCwgZGF0YVtrZXldLCBzaWxlbnQpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQXBwbHkgaW5zdHJ1Y3Rpb25zIGFuZCBpbmhlcml0ZWQgZXZlbnQgbGlzdGVuZXJzLiBFbnN1cmUgY2xhc3MgbWV0YWRhdGEgaXMgcmVhZHkuICovXG5mdW5jdGlvbiBwcmVwYXJlKG1vZGVsOiBNb2RlbCl7XG4gIGxldCBUID0gbW9kZWwuY29uc3RydWN0b3IgYXMgTW9kZWwuVHlwZTtcblxuICBpZihUID09PSBNb2RlbClcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgY3JlYXRlIGJhc2UgTW9kZWwuXCIpO1xuXG4gIGNvbnN0IGNoYWluID0gW10gYXMgTW9kZWwuVHlwZVtdO1xuICBsZXQga2V5cyA9IG5ldyBNYXA8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gdm9pZD4oKTtcblxuICBJRC5zZXQobW9kZWwsIGAke1R9LSR7dWlkKCl9YCk7XG5cbiAgd2hpbGUoVC5uYW1lKXtcbiAgICBmb3IoY29uc3QgY2Igb2YgTk9USUZZLmdldChUKSB8fCBbXSlcbiAgICAgIGFkZExpc3RlbmVyKG1vZGVsLCBjYik7XG5cbiAgICBpZihUID09PSBNb2RlbCkgYnJlYWs7XG4gICAgZWxzZSBjaGFpbi51bnNoaWZ0KFQpO1xuXG4gICAgVCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihUKVxuICB9XG5cbiAgZm9yKGNvbnN0IHR5cGUgb2YgY2hhaW4pe1xuICAgIGlmKE1FVEhPRFMuaGFzKHR5cGUpKXtcbiAgICAgIGtleXMgPSBNRVRIT0RTLmdldCh0eXBlKSE7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBNRVRIT0RTLnNldCh0eXBlLCBrZXlzID0gbmV3IE1hcChrZXlzKSk7XG5cbiAgICBmb3IoY29uc3QgW2tleSwgeyB2YWx1ZSB9XSBvZiBPYmplY3QuZW50cmllcyhcbiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHR5cGUucHJvdG90eXBlKVxuICAgICkpe1xuICAgICAgaWYoIXZhbHVlIHx8IGtleSA9PSBcImNvbnN0cnVjdG9yXCIpXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgXG4gICAgICBmdW5jdGlvbiBiaW5kKHRoaXM6IE1vZGVsLCBvcmlnaW5hbD86IEZ1bmN0aW9uKXtcbiAgICAgICAgY29uc3QgeyBpcyB9ID0gdGhpcztcblxuICAgICAgICBpZihpcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFvcmlnaW5hbClcbiAgICAgICAgICByZXR1cm4gdmFsdWUgYXMgRnVuY3Rpb247XG5cbiAgICAgICAgY29uc3QgZm4gPSBvcmlnaW5hbCB8fCB2YWx1ZTtcbiAgICAgICAgY29uc3QgYm91bmQgPSBmbi5iaW5kKGlzKTtcbiAgICAgICAgXG4gICAgICAgIE1FVEhPRC5zZXQoYm91bmQsIGZuKTtcbiAgICAgICAgZGVmaW5lKGlzLCBrZXksIHsgdmFsdWU6IGJvdW5kLCB3cml0YWJsZTogdHJ1ZSB9KTtcbiAgICAgICAgXG4gICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgIH1cblxuICAgICAga2V5cy5zZXQoa2V5LCBiaW5kKTtcbiAgICAgIGRlZmluZSh0eXBlLnByb3RvdHlwZSwga2V5LCB7IGdldDogYmluZCwgc2V0OiBiaW5kIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEFwcGx5IG1vZGVsIGFyZ3VlbW50cywgcnVuIGNhbGxiYWNrcyBhbmQgb2JzZXJ2ZSBwcm9wZXJ0aWVzLlxuICogQWNjdW11bGF0ZSBhbmQgaGFuZGxlIGNsZWFudXAgZXZlbnRzLlxuICoqL1xuZnVuY3Rpb24gaW5pdChtb2RlbDogTW9kZWwsIGFyZ3M6IE1vZGVsLkFyZ3Mpe1xuICBjb25zdCBzdGF0ZSA9IHt9IGFzIFJlY29yZDxzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsIHVua25vd24+O1xuXG4gIFNUQVRFLnNldChtb2RlbCwgc3RhdGUpO1xuXG4gIGFyZ3MgPSBhcmdzLmZsYXQoKS5maWx0ZXIoYXJnID0+IHtcbiAgICBpZih0eXBlb2YgYXJnICE9IFwic3RyaW5nXCIpXG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIElELnNldChtb2RlbCwgYXJnKTtcbiAgfSk7XG5cbiAgYWRkTGlzdGVuZXIobW9kZWwsICgpID0+IHtcbiAgICBpZighUEFSRU5ULmhhcyhtb2RlbCkpXG4gICAgICBQQVJFTlQuc2V0KG1vZGVsLCBudWxsKTtcblxuICAgIGZvcihjb25zdCBrZXkgaW4gbW9kZWwpe1xuICAgICAgY29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobW9kZWwsIGtleSkhO1xuXG4gICAgICBpZihcInZhbHVlXCIgaW4gZGVzYylcbiAgICAgICAgbWFuYWdlKG1vZGVsLCBrZXksIGRlc2MudmFsdWUsIHRydWUpO1xuICAgIH1cblxuICAgIGZvcihjb25zdCBhcmcgb2YgYXJncyl7XG4gICAgICBjb25zdCB1c2UgPSB0eXBlb2YgYXJnID09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IGFyZy5jYWxsKG1vZGVsLCBtb2RlbClcbiAgICAgICAgOiBhcmcgYXMgTW9kZWwuQXNzaWduPE1vZGVsPjtcblxuICAgICAgaWYodXNlIGluc3RhbmNlb2YgUHJvbWlzZSlcbiAgICAgICAgdXNlLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihgQXN5bmMgZXJyb3IgaW4gY29uc3RydWN0b3IgZm9yICR7bW9kZWx9OmApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICBlbHNlIGlmKHR5cGVvZiB1c2UgPT0gXCJmdW5jdGlvblwiKVxuICAgICAgICBhZGRMaXN0ZW5lcihtb2RlbCwgdXNlLCBudWxsKVxuICAgICAgZWxzZSBpZih0eXBlb2YgdXNlID09IFwib2JqZWN0XCIpXG4gICAgICAgIGFzc2lnbihtb2RlbCwgdXNlLCB0cnVlKTtcbiAgICB9XG5cbiAgICBhZGRMaXN0ZW5lcihtb2RlbCwgKCkgPT4ge1xuICAgICAgZm9yKGNvbnN0IFtfLCB2YWx1ZV0gb2YgbW9kZWwpXG4gICAgICAgIGlmKHZhbHVlIGluc3RhbmNlb2YgTW9kZWwgJiYgUEFSRU5ULmdldCh2YWx1ZSkgPT09IG1vZGVsKVxuICAgICAgICAgIHZhbHVlLnNldChudWxsKTtcbiAgXG4gICAgICBPYmplY3QuZnJlZXplKHN0YXRlKTtcbiAgICB9LCBudWxsKTtcbiAgXG4gICAgcmV0dXJuIG51bGw7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYW5hZ2UodGFyZ2V0OiBNb2RlbCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlOiBhbnksIHNpbGVudD86IGJvb2xlYW4pe1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldCh0YXJnZXQpITtcbiAgXG4gIGZ1bmN0aW9uIGdldCh0aGlzOiBNb2RlbCl7XG4gICAgcmV0dXJuIHdhdGNoKHRoaXMsIGtleSwgc3RhdGVba2V5XSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXQodmFsdWU6IHVua25vd24sIHNpbGVudD86IGJvb2xlYW4pe1xuICAgIHVwZGF0ZSh0YXJnZXQsIGtleSwgdmFsdWUsIHNpbGVudCk7XG4gICAgaWYodmFsdWUgaW5zdGFuY2VvZiBNb2RlbCAmJiAhUEFSRU5ULmhhcyh2YWx1ZSkpe1xuICAgICAgUEFSRU5ULnNldCh2YWx1ZSwgdGFyZ2V0KTtcbiAgICAgIGV2ZW50KHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBkZWZpbmUodGFyZ2V0LCBrZXksIHsgc2V0LCBnZXQgfSk7XG4gIHNldCh2YWx1ZSwgc2lsZW50KTtcbn1cblxudHlwZSBQcm94eTxUID0gYW55PiA9IChrZXk6IHN0cmluZyB8IG51bWJlciwgdmFsdWU6IFQpID0+IFQ7XG5cbmNvbnN0IE9CU0VSVkVSID0gbmV3IFdlYWtNYXA8TW9kZWwsIFByb3h5PigpO1xuXG5mdW5jdGlvbiB3YXRjaChmcm9tOiBNb2RlbCwga2V5OiBzdHJpbmcgfCBudW1iZXIsIHZhbHVlPzogYW55KXtcbiAgY29uc3QgYWNjZXNzID0gT0JTRVJWRVIuZ2V0KGZyb20pO1xuICByZXR1cm4gYWNjZXNzID8gYWNjZXNzKGtleSwgdmFsdWUpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGZldGNoKHN1YmplY3Q6IE1vZGVsLCBwcm9wZXJ0eTogc3RyaW5nLCByZXF1aXJlZD86IGJvb2xlYW4pe1xuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldChzdWJqZWN0KSE7XG4gIFxuICBpZihwcm9wZXJ0eSBpbiBzdGF0ZSB8fCByZXF1aXJlZCA9PT0gZmFsc2Upe1xuICAgIGNvbnN0IHZhbHVlID0gc3RhdGVbcHJvcGVydHldO1xuXG4gICAgaWYodmFsdWUgIT09IHVuZGVmaW5lZCB8fCAhcmVxdWlyZWQpXG4gICAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihgJHtzdWJqZWN0fS4ke3Byb3BlcnR5fSBpcyBub3QgeWV0IGF2YWlsYWJsZS5gKTtcbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGFkZExpc3RlbmVyKHN1YmplY3QsIGtleSA9PiB7XG4gICAgICBpZihrZXkgPT09IHByb3BlcnR5KXtcbiAgICAgICAgcmVzb2x2ZShzdGF0ZVtrZXldKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIGlmKGtleSA9PT0gbnVsbClcbiAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgJHtzdWJqZWN0fSBpcyBkZXN0cm95ZWQuYCkpO1xuICAgIH0pO1xuICB9KTtcblxuICB0aHJvdyBPYmplY3QuYXNzaWduKHByb21pc2UsIHtcbiAgICB0b1N0cmluZzogKCkgPT4gU3RyaW5nKGVycm9yKSxcbiAgICBuYW1lOiBcIlN1c3BlbnNlXCIsXG4gICAgbWVzc2FnZTogZXJyb3IubWVzc2FnZSxcbiAgICBzdGFjazogZXJyb3Iuc3RhY2tcbiAgfSk7XG59XG5cbi8qKiBDdXJyZW50bHkgYWNjdW11bGF0aW5nIGV4cG9ydC4gU3RvcmVzIHJlYWwgdmFsdWVzIG9mIHBsYWNlaG9sZGVyIHByb3BlcnRpZXMgc3VjaCBhcyByZWYoKSBvciBjaGlsZCBtb2RlbHMuICovXG5sZXQgRVhQT1JUOiBNYXA8YW55LCBhbnk+IHwgdW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBzbmFwc2hvdDxUIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBUKTogTW9kZWwuU3RhdGU8VD4ge1xuICBjb25zdCB2YWx1ZXMgPSB7fSBhcyBhbnk7XG4gIGxldCBpc05vdFJlY3Vyc2l2ZTtcblxuICBpZighRVhQT1JUKXtcbiAgICBpc05vdFJlY3Vyc2l2ZSA9IHRydWU7XG4gICAgRVhQT1JUID0gbmV3IE1hcChbW21vZGVsLCB2YWx1ZXNdXSk7XG4gIH1cblxuICBmb3IobGV0IFtrZXksIHZhbHVlXSBvZiBtb2RlbCl7XG4gICAgaWYoRVhQT1JULmhhcyh2YWx1ZSkpXG4gICAgICB2YWx1ZSA9IEVYUE9SVC5nZXQodmFsdWUpO1xuICAgIGVsc2UgaWYodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09IFwib2JqZWN0XCIgJiYgXCJnZXRcIiBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUuZ2V0ID09PSBcImZ1bmN0aW9uXCIpXG4gICAgICBFWFBPUlQuc2V0KHZhbHVlLCB2YWx1ZSA9IHZhbHVlLmdldCgpKTtcblxuICAgIHZhbHVlc1trZXldID0gdmFsdWU7XG4gIH1cblxuICBpZihpc05vdFJlY3Vyc2l2ZSlcbiAgICBFWFBPUlQgPSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIE9iamVjdC5mcmVlemUodmFsdWVzKTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlPFQ+KFxuICBzdWJqZWN0OiBNb2RlbCxcbiAga2V5OiBzdHJpbmcgfCBudW1iZXIgfCBzeW1ib2wsXG4gIHZhbHVlOiBULFxuICBhcmc/OiBib29sZWFuIHwgTW9kZWwuU2V0dGVyPFQ+KXtcblxuICBjb25zdCBzdGF0ZSA9IFNUQVRFLmdldChzdWJqZWN0KSE7XG5cbiAgaWYoT2JqZWN0LmlzRnJvemVuKHN0YXRlKSlcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHVwZGF0ZSAke1N0cmluZyhrZXkpfSBidXQgJHtzdWJqZWN0fSBpcyBkZXN0cm95ZWQuYCk7XG5cbiAgY29uc3QgcHJldmlvdXMgPSBzdGF0ZVtrZXldIGFzIFQ7XG5cbiAgaWYodHlwZW9mIGFyZyA9PSBcImZ1bmN0aW9uXCIpe1xuICAgIGNvbnN0IG91dCA9IGFyZy5jYWxsKHN1YmplY3QsIHZhbHVlLCBwcmV2aW91cyk7XG5cbiAgICBpZihvdXQgPT09IGZhbHNlKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gICAgaWYodHlwZW9mIG91dCA9PSBcImZ1bmN0aW9uXCIpXG4gICAgICB2YWx1ZSA9IG91dCgpO1xuICB9XG5cbiAgaWYodmFsdWUgPT09IHByZXZpb3VzICYmIHZhbHVlICE9PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuO1xuXG4gIHN0YXRlW2tleV0gPSB2YWx1ZTtcblxuICBpZihhcmcgIT09IHRydWUpXG4gICAgZXZlbnQoc3ViamVjdCwga2V5KTtcblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqIFJhbmRvbSBhbHBoYW51bWJlcmljIG9mIGxlbmd0aCA2OyBhbHdheXMgc3RhcnRzIHdpdGggYSBsZXR0ZXIuICovXG5mdW5jdGlvbiB1aWQoKXtcbiAgcmV0dXJuICgwLjI3OCArIE1hdGgucmFuZG9tKCkgKiAwLjcyMikudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA4KS50b1VwcGVyQ2FzZSgpO1xufVxuXG5leHBvcnQge1xuICBldmVudCxcbiAgZmV0Y2gsXG4gIE1FVEhPRCxcbiAgTW9kZWwsXG4gIFBBUkVOVCxcbiAgU1RBVEUsXG4gIHVpZCxcbiAgdXBkYXRlLFxuICB3YXRjaFxufSJdLAogICJtYXBwaW5ncyI6ICJBQUFBLFNBQVMsYUFBYSxjQUFjLE9BQU8sWUFBc0Isb0JBQW9CO0FBRXJGLE1BQU0sU0FBUyxPQUFPO0FBR3RCLE1BQU0sS0FBSyxvQkFBSSxRQUF1QjtBQUd0QyxNQUFNLFFBQVEsb0JBQUksUUFBMEQ7QUFHNUUsTUFBTSxTQUFTLG9CQUFJLFFBQW1DO0FBR3RELE1BQU0sU0FBUyxvQkFBSSxRQUE2QjtBQUdoRCxNQUFNLFVBQVUsb0JBQUksUUFBdUQ7QUFHM0UsTUFBTSxTQUFTLG9CQUFJLFFBQWtCO0FBbUhyQyxNQUFlLE1BQTRCO0FBQUEsRUFDekMsZUFBZSxNQUFpQjtBQUM5QixZQUFRLElBQUk7QUFDWixXQUFPLE1BQU0sTUFBTSxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQ2xDLFNBQUssTUFBTSxJQUFJO0FBQUEsRUFDakI7QUFBQSxFQUVBLENBQUMsVUFBVSxFQUFFLFVBQStCLFVBQW1CO0FBQzdELFVBQU1BLFNBQVEsb0JBQUksSUFBdUI7QUFDekMsVUFBTSxRQUFRLE9BQU8sT0FBTyxJQUFJO0FBRWhDLGdCQUFZLE1BQU0sTUFBTSxLQUFLLFNBQVMsR0FBR0EsTUFBSztBQUU5QyxhQUFTLElBQUksT0FBTyxDQUFDLEtBQUssVUFBVTtBQUNsQyxVQUFHLFVBQVUsVUFBYTtBQUN4QixjQUFNLElBQUksTUFBTSxHQUFHLElBQUks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
|
package/dist/index.d.ts
CHANGED
|
@@ -8,11 +8,17 @@
|
|
|
8
8
|
* - `null` - terminal event; instance is expired.
|
|
9
9
|
* @param source - Instance of Model for which update has occured.
|
|
10
10
|
*/
|
|
11
|
-
type OnUpdate<T extends Observable = any> = (this: T, key:
|
|
11
|
+
type OnUpdate<T extends Observable = any> = (this: T, key: Event, source: T) => (() => void) | null | void;
|
|
12
12
|
type Effect<T extends Observable> = (this: T, proxy: T) => ((update: boolean | null) => void) | Promise<void> | null | void;
|
|
13
13
|
type Event = number | string | null | boolean | symbol;
|
|
14
|
+
type PromiseLite<T = void> = {
|
|
15
|
+
then: (callback: () => T) => T;
|
|
16
|
+
};
|
|
17
|
+
declare namespace Observable {
|
|
18
|
+
type Callback = () => void | PromiseLite;
|
|
19
|
+
}
|
|
14
20
|
interface Observable {
|
|
15
|
-
[Observable](callback:
|
|
21
|
+
[Observable](callback: Observable.Callback, required?: boolean): this;
|
|
16
22
|
}
|
|
17
23
|
declare const Observable: unique symbol;
|
|
18
24
|
declare function addListener<T extends Observable>(subject: T, callback: OnUpdate<T>, select?: Event | Set<Event>): () => boolean;
|
|
@@ -117,7 +123,7 @@ interface Model {
|
|
|
117
123
|
}
|
|
118
124
|
declare abstract class Model implements Observable {
|
|
119
125
|
constructor(...args: Model.Args);
|
|
120
|
-
[Observable](callback:
|
|
126
|
+
[Observable](callback: Observable.Callback, required?: boolean): this;
|
|
121
127
|
/**
|
|
122
128
|
* Pull current values from state. Flattens all models and exotic values recursively.
|
|
123
129
|
*
|
package/dist/index.js
CHANGED
|
@@ -116,14 +116,15 @@ function createEffect(target, callback, argument) {
|
|
|
116
116
|
function invoke() {
|
|
117
117
|
let stale;
|
|
118
118
|
function onUpdate() {
|
|
119
|
-
if (stale)
|
|
120
|
-
return
|
|
119
|
+
if (stale || reset === null)
|
|
120
|
+
return;
|
|
121
121
|
stale = true;
|
|
122
122
|
if (reset && unset) {
|
|
123
123
|
unset(true);
|
|
124
124
|
unset = void 0;
|
|
125
125
|
}
|
|
126
|
-
|
|
126
|
+
enqueue(invoke);
|
|
127
|
+
return { then: enqueue };
|
|
127
128
|
}
|
|
128
129
|
const subscriber = target[Observable](onUpdate, argument === true);
|
|
129
130
|
try {
|
|
@@ -192,7 +193,7 @@ var Model = class {
|
|
|
192
193
|
[Observable](callback, required) {
|
|
193
194
|
const watch2 = /* @__PURE__ */ new Set();
|
|
194
195
|
const proxy = Object.create(this);
|
|
195
|
-
addListener(this, callback, watch2);
|
|
196
|
+
addListener(this, () => void callback(), watch2);
|
|
196
197
|
OBSERVER.set(proxy, (key2, value) => {
|
|
197
198
|
if (value === void 0 && required)
|
|
198
199
|
throw new Error(`${this}.${key2} is required in this context.`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/control.ts","../src/model.ts","../src/context.ts","../src/instruction/use.ts","../src/instruction/get.ts","../src/instruction/ref.ts","../src/instruction/set.ts","../src/instruction/has.ts"],"sourcesContent":["export { get } from './instruction/get';\nexport { ref } from './instruction/ref';\nexport { set } from './instruction/set';\nexport { use } from './instruction/use';\nexport { has } from './instruction/has';\n\nexport { Model, Model as default, METHOD } from './model';\nexport { createEffect, addListener, event, Observable } from './control';\nexport { Context } from './context';","/**\n * Update callback function.\n * \n * @param key -\n * - `string` - property which has updated.\n * - `false` - a normal update has completed.\n * - `true` - initial event; instance is ready.\n * - `null` - terminal event; instance is expired.\n * @param source - Instance of Model for which update has occured.\n */\ntype OnUpdate<T extends Observable = any> = \n (this: T, key: unknown, source: T) => (() => void) | null | void;\n\ntype Effect<T extends Observable> = (this: T, proxy: T) =>\n ((update: boolean | null) => void) | Promise<void> | null | void;\n\ntype Event = number | string | null | boolean | symbol;\n\ninterface Observable {\n [Observable](callback: OnUpdate, required?: boolean): this;\n}\n\nconst Observable = Symbol(\"observe\");\n\n/** Placeholder event determines if model is initialized or not. */\nconst onReady = () => null;\n\nconst LISTENERS = new WeakMap<Observable, Map<OnUpdate, Set<Event> | undefined>>();\n\n/** Events pending for a given object. */\nconst PENDING = new WeakMap<Observable, Set<Event>>();\n\n/** Update register. */\nconst PENDING_KEYS = new WeakMap<Observable, Set<string | number | symbol>>();\n\n/** Central event dispatch. Bunches all updates to occur at same time. */\nconst DISPATCH = new Set<() => void>();\n\nfunction addListener<T extends Observable>(\n subject: T, callback: OnUpdate<T>, select?: Event | Set<Event>){\n\n let listeners = LISTENERS.get(subject)!;\n\n if(!listeners)\n LISTENERS.set(subject, listeners = new Map([[onReady, undefined]]));\n\n if(select !== undefined && !(select instanceof Set))\n select = new Set([select]);\n\n if(!listeners.has(onReady) && !select)\n callback.call(subject, true, subject);\n\n listeners.set(callback, select);\n\n return () => listeners.delete(callback);\n}\n\nfunction emit(model: Observable, key: Event): void {\n const listeners = LISTENERS.get(model)!;\n const notReady = listeners.has(onReady);\n\n if(key === true && !notReady)\n return;\n\n let pending = PENDING.get(model);\n\n if(pending){\n pending.add(key);\n return;\n }\n\n PENDING.set(model, pending = new Set(notReady ? [true, key] : [key]));\n\n for(const key of pending)\n for(const [callback, filter] of listeners)\n if(!filter || filter.has(key)){\n const after = callback.call(model, key, model);\n\n if(after)\n enqueue(after);\n\n else if(after === null)\n listeners.delete(callback);\n }\n\n if(key === null)\n listeners.clear();\n \n PENDING.delete(model);\n}\n\nfunction event(\n subject: Observable,\n key?: string | number | symbol | null,\n silent?: boolean){\n\n if(key === null)\n return emit(subject, key);\n\n if(!key)\n return emit(subject, true);\n\n let pending = PENDING_KEYS.get(subject);\n\n if(!pending){\n PENDING_KEYS.set(subject, pending = new Set());\n\n if(!silent)\n enqueue(() => {\n emit(subject, false);\n PENDING_KEYS.delete(subject)\n })\n }\n\n pending.add(key);\n\n if(!silent)\n emit(subject, key);\n}\n\nfunction enqueue(eventHandler: (() => void)){\n if(!DISPATCH.size)\n setTimeout(() => {\n DISPATCH.forEach(event => {\n try {\n event();\n }\n catch(err){\n console.error(err);\n }\n });\n DISPATCH.clear();\n }, 0);\n\n DISPATCH.add(eventHandler);\n}\n\n/**\n * Create a side-effect which will update whenever values accessed change.\n * Callback is called immediately and whenever values are stale.\n * \n * @param target - Instance of Model to observe.\n * @param callback - Function to invoke when values change.\n * @param requireValues - If `true` will throw if accessing a value which is `undefined`.\n */\nfunction createEffect<T extends Observable>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;\nfunction createEffect<T extends Observable>(target: T, callback: Effect<T>, recursive?: boolean): () => void;\nfunction createEffect<T extends Observable>(target: T, callback: Effect<T>, argument?: boolean){\n let unset: ((update: boolean | null) => void) | undefined;\n let reset: (() => void) | null | undefined;\n\n function invoke(){\n let stale: boolean | undefined;\n\n function onUpdate() {\n if (stale)\n return null;\n\n stale = true;\n\n if (reset && unset) {\n unset(true);\n unset = undefined;\n }\n\n return reset;\n }\n\n const subscriber = target[Observable](onUpdate, argument === true);\n\n try {\n const exit = enter(argument === false);\n const output = callback.call(subscriber, subscriber);\n const flush = exit();\n\n reset = output === null ? null : invoke;\n unset = key => {\n if(typeof output == \"function\")\n output(key);\n\n flush();\n }\n }\n catch(err){\n if(err instanceof Promise){\n reset = undefined;\n err.then(invoke);\n }\n else\n throw err;\n }\n }\n\n function cleanup(){\n if(unset)\n unset(false);\n\n reset = null;\n };\n\n if(EffectContext && argument !== false)\n EffectContext.add(cleanup);\n\n addListener(target, key => {\n if(key === true)\n invoke();\n\n else if(!reset)\n return reset;\n\n if(key === null && unset)\n unset(null);\n });\n \n return cleanup;\n}\n\nlet EffectContext: Set<() => void> | undefined;\n\nexport function enter(ignore?: boolean){\n if(ignore)\n return () => () => {};\n\n const last = EffectContext;\n const context = EffectContext = new Set;\n\n return () => {\n EffectContext = last;\n return () => context.forEach(fn => fn());\n }\n}\n\nexport {\n addListener,\n createEffect,\n event,\n OnUpdate,\n PENDING_KEYS,\n Observable\n}","import { addListener, createEffect, event, Observable, OnUpdate, PENDING_KEYS } from './control';\n\nconst define = Object.defineProperty;\n\n/** Register for all active models via string identifiers (usually unique). */\nconst ID = new WeakMap<Model, string>();\n\n/** Internal state assigned to models. */\nconst STATE = new WeakMap<Model, Record<string | number | symbol, unknown>>();\n\n/** External listeners for any given Model. */\nconst NOTIFY = new WeakMap<Model.Type, Set<OnUpdate>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<Model, Model | null>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Model.Type, Map<string, (value: any) => void>>();\n\n/** Reference bound instance methods to real ones. */\nconst METHOD = new WeakMap<any, any>();\n\ndeclare namespace Model {\n /** Any type of Model, using own class constructor as its identifier. */\n type Type<T extends Model = Model> =\n (abstract new (...args: any[]) => T) & typeof Model;\n\n /** A Model constructor, but which is not abstract. */\n type Init<T extends Model = Model> =\n (new (...args: Model.Args<T>) => T) & Omit<typeof Model, never>;\n\n /**\n * Model constructor callback - is called when Model finishes intializing.\n * Returned function will run when model is destroyed.\n */\n type Callback<T extends Model = Model> =\n (this: T, thisArg: T) => Promise<void> | (() => void) | Assign<T> | void;\n\n /** Model constructor argument */\n type Argument<T extends Model = Model> = Assign<T> | Callback<T> | string | void;\n\n /** Model constructor arguments */\n type Args<T extends Model = any> = (Argument<T> | Args<T>)[];\n\n /** Subset of `keyof T` which are not methods or defined by base Model U. **/\n type Field<T> = Exclude<keyof T, keyof Model>;\n\n /** Any valid key for model, including but not limited to Field<T>. */\n type Event<T> = Field<T> | (string & {}) | number | symbol;\n\n /** Object overlay to override values and methods on a model. */\n type Assign<T> = {\n [K in Field<T>]?:\n T[K] extends (...args: infer A) => infer R \n ? (this: T, ...args: A) => R\n : T[K];\n } & Record<string, unknown>;\n\n /** Export/Import compatible value for a given property in a Model. */\n type Export<R> = R extends { get(): infer T } ? T : R;\n\n /** Value for a property managed by a model. */\n type Value<T extends Model, K extends Event<T>> =\n K extends keyof T ? Export<T[K]> : unknown;\n\n type OnEvent<T extends Model> =\n (this: T, key: unknown, source: T) => (() => void) | void | null;\n\n type OnUpdate<T extends Model, K extends Event<T>> =\n (this: T, key: K, thisArg: K) => void;\n\n /**\n * Values from current state of given model.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type State<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Values<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n }\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n * \n * @param current - Current state of this model. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n * \n * @param update - Set of properties which have changed, and events fired, since last update.\n * \n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (this: T, current: T, update: Set<Event<T>>) =>\n EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n * \n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if model is destroyed.\n */\n type EffectCallback = ((update: boolean | null) => void);\n\n /**\n * Property initializer, will run upon instance creation.\n * Optional returned callback will run when once upon first access.\n */\n type Instruction<T = any, M extends Model = any> =\n // TODO: Should this allow for numbers/symbol properties?\n (this: M, key: Extract<Field<M>, string>, thisArg: M, state: State<M>) =>\n Descriptor<T> | ((source: M) => T) | void;\n\n type Getter<T> = (source: Model) => T;\n type Setter<T> = (value: T, previous: T) => boolean | void | (() => T);\n\n type Descriptor<T = any> = {\n get?: Getter<T> | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n value?: T;\n }\n}\n\ninterface Model {\n /**\n * Loopback to instance of this model. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n is: this;\n}\n\nabstract class Model implements Observable {\n constructor(...args: Model.Args){\n prepare(this);\n define(this, \"is\", { value: this });\n init(this, args);\n }\n\n [Observable](callback: OnUpdate, required?: boolean){\n const watch = new Set<Model.Event<this>>();\n const proxy = Object.create(this);\n \n addListener(this, callback, watch);\n OBSERVER.set(proxy, (key, value) => {\n if(value === undefined && required)\n throw new Error(`${this}.${key} is required in this context.`);\n\n watch.add(key);\n\n if(value instanceof Object && Observable in value)\n return value[Observable](callback, required);\n\n return value;\n });\n\n return proxy as this;\n }\n\n /**\n * Pull current values from state. Flattens all models and exotic values recursively.\n * \n * @returns Object with all values from this model.\n **/\n get(): Model.State<this>;\n\n /**\n * Run a function which will run automatically when accessed values change.\n * \n * @param effect Function to run, and again whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent model is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: Model.Effect<this>): () => void;\n\n /**\n * Get value of a property.\n * \n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends Model.Event<this>>(key: T, required?: boolean): Model.Value<this, T>;\n\n /**\n * Run a function when a property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n * @returns Function to cancel listener.\n */\n get<T extends Model.Event<this>>(key: T, callback: Model.OnUpdate<this, T>): () => void;\n\n /**\n * Check if model is expired.\n * \n * @param status - `null` to check if model is expired.\n * @returns `true` if model is expired, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when model is to be destroyed.\n * \n * @param callback - Function to call when model is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n get(arg1?: Model.Effect<this> | string | null, arg2?: boolean | Model.OnUpdate<this, any>){\n const self = this.is;\n\n if(typeof arg1 == \"function\"){\n let pending = new Set<Model.Event<this>>();\n\n return createEffect(self, (proxy) => {\n const cb = arg1.call(proxy, proxy, pending);\n\n return cb === null ? null : ((update) => {\n pending = PENDING_KEYS.get(self)!;\n if(typeof cb == \"function\")\n cb(update);\n })\n });\n }\n\n return (\n arg1 === undefined ? snapshot(self) :\n typeof arg2 == \"function\" ? addListener(self, arg2, arg1) :\n arg1 === null ? Object.isFrozen(STATE.get(self)) :\n fetch(self, arg1, arg2)\n )\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Update mulitple properties at once. Merges argument with current state.\n * Properties which are not managed by this model will be ignored.\n * \n * @param assign - Object with properties to update.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n * @returns Promise resolving an array of keys updated, `undefined` (immediately) if a noop.\n */\n set(assign?: Model.Assign<this>, silent?: boolean): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Push an update. This will not change the value of associated property.\n * \n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n * \n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions with property names! An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n * \n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Set a value for a property. This will update the value and notify listeners.\n * \n * **Use with caution!** Key nor value are checked for validity.\n * \n * This is meant for assigning values programmatically,\n * where simple assignment is not practicable.\n * \n * For example: `(this as any)[myProperty] = value;`\n * \n * @param key - Property to set value for.\n * @param value - Value to set for property.\n * @param init - If true, model will begin to manage the property if it is not already.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>, value: unknown, init?: boolean): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Call a function when update occurs.\n * \n * Given function is called for every assignment (which changes value) or explicit `set`.\n * \n * To run logic on final value only, callback may return a function. Using the same\n * function for one or more events will ensure it is called only when events are settled.\n * \n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n * \n */\n set(callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Call a function when a property is updated.\n * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.\n * \n * @param callback - Function to call when property is updated.\n * @param event - Property to watch for updates.\n */\n set(callback: Model.OnEvent<this>, event: Model.Event<this> | null): () => boolean;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n * \n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n set(\n arg1?: Model.OnEvent<this> | Model.Assign<this> | Model.Event<this> | null,\n arg2?: unknown,\n arg3?: boolean){\n\n const self = this.is;\n\n if(typeof arg1 == \"function\")\n return addListener(self, key => {\n if(arg2 === key || arg2 === undefined && typeof key == \"string\")\n return arg1.call(self, key, self);\n })\n \n if(arg1 && typeof arg1 == \"object\")\n assign(self, arg1, arg2 === true);\n else if(!arg2)\n event(self, arg1);\n else if(arg3)\n manage(self, arg1 as string | number, arg2);\n else\n update(self, arg1 as string | number, arg2)\n\n const pending = PENDING_KEYS.get(this);\n\n if(pending)\n return <PromiseLike<Model.Event<this>[]>> {\n then: (res) => new Promise<any>(res => {\n const remove = addListener(this, key => {\n if(key !== true){\n remove();\n return res.bind(null, Array.from(pending));\n }\n });\n }).then(res)\n }\n }\n\n /**\n * Iterate over managed properties in this instance of Model.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STATE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this model.\n * \n * **Important** - Unlike `new this(...)` - this method also activates state.\n * \n * @param args - arguments sent to constructor\n */\n static new<T extends Model>(this: Model.Init<T>, ...args: Model.Args<T>){\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends Model.Type>(this: T, maybe: unknown): maybe is T {\n return maybe === this || typeof maybe == \"function\" && maybe.prototype instanceof this;\n }\n\n /**\n * Register a callback to run when any instance of this Model is updated. \n */\n static on<T extends Model>(this: Model.Type<T>, listener: Model.OnEvent<T>){\n let notify = NOTIFY.get(this);\n\n if(!notify)\n NOTIFY.set(this, notify = new Set);\n\n notify.add(listener);\n\n return () => notify.delete(listener);\n }\n}\n\ndefine(Model.prototype, \"toString\", {\n value(){\n return ID.get(this.is);\n }\n});\n\ndefine(Model, \"toString\", {\n value(){\n return this.name;\n }\n});\n\nfunction assign(subject: Model, data: Model.Assign<Model>, silent?: boolean){\n const methods = METHODS.get(subject.constructor as Model.Type)!;\n \n for(const key in data){\n const bind = methods.get(key);\n\n if(bind)\n bind.call(subject, data[key]);\n else if(key in subject && key !== \"is\"){\n const desc = Object.getOwnPropertyDescriptor(subject, key)!;\n const set = desc && desc.set as (value: any, silent?: boolean) => void;\n\n set.call(subject, data[key], silent);\n }\n }\n}\n\n/** Apply instructions and inherited event listeners. Ensure class metadata is ready. */\nfunction prepare(model: Model){\n let T = model.constructor as Model.Type;\n\n if(T === Model)\n throw new Error(\"Cannot create base Model.\");\n\n const chain = [] as Model.Type[];\n let keys = new Map<string, (value: any) => void>();\n\n ID.set(model, `${T}-${uid()}`);\n\n while(T.name){\n for(const cb of NOTIFY.get(T) || [])\n addListener(model, cb);\n\n if(T === Model) break;\n else chain.unshift(T);\n\n T = Object.getPrototypeOf(T)\n }\n\n for(const type of chain){\n if(METHODS.has(type)){\n keys = METHODS.get(type)!;\n continue;\n }\n\n METHODS.set(type, keys = new Map(keys));\n\n for(const [key, { value }] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )){\n if(!value || key == \"constructor\")\n continue;\n \n function bind(this: Model, original?: Function){\n const { is } = this;\n\n if(is.hasOwnProperty(key) && !original)\n return value as Function;\n\n const fn = original || value;\n const bound = fn.bind(is);\n \n METHOD.set(bound, fn);\n define(is, key, { value: bound, writable: true });\n \n return bound;\n }\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n }\n}\n\n/**\n * Apply model arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(model: Model, args: Model.Args){\n const state = {} as Record<string | number | symbol, unknown>;\n\n STATE.set(model, state);\n\n args = args.flat().filter(arg => {\n if(typeof arg != \"string\")\n return true;\n\n ID.set(model, arg);\n });\n\n addListener(model, () => {\n if(!PARENT.has(model))\n PARENT.set(model, null);\n\n for(const key in model){\n const desc = Object.getOwnPropertyDescriptor(model, key)!;\n\n if(\"value\" in desc)\n manage(model, key, desc.value, true);\n }\n\n for(const arg of args){\n const use = typeof arg == \"function\"\n ? arg.call(model, model)\n : arg as Model.Assign<Model>;\n\n if(use instanceof Promise)\n use.catch(err => {\n console.error(`Async error in constructor for ${model}:`);\n console.error(err);\n });\n else if(typeof use == \"function\")\n addListener(model, use, null)\n else if(typeof use == \"object\")\n assign(model, use, true);\n }\n\n addListener(model, () => {\n for(const [_, value] of model)\n if(value instanceof Model && PARENT.get(value) === model)\n value.set(null);\n \n Object.freeze(state);\n }, null);\n \n return null;\n });\n}\n\nfunction manage(target: Model, key: string | number, value: any, silent?: boolean){\n const state = STATE.get(target)!;\n \n function get(this: Model){\n return watch(this, key, state[key]);\n }\n\n function set(value: unknown, silent?: boolean){\n update(target, key, value, silent);\n if(value instanceof Model && !PARENT.has(value)){\n PARENT.set(value, target);\n event(value);\n }\n }\n\n define(target, key, { set, get });\n set(value, silent);\n}\n\ntype Proxy<T = any> = (key: string | number, value: T) => T;\n\nconst OBSERVER = new WeakMap<Model, Proxy>();\n\nfunction watch(from: Model, key: string | number, value?: any){\n const access = OBSERVER.get(from);\n return access ? access(key, value) : value;\n}\n\nfunction fetch(subject: Model, property: string, required?: boolean){\n const state = STATE.get(subject)!;\n \n if(property in state || required === false){\n const value = state[property];\n\n if(value !== undefined || !required)\n return value;\n }\n\n const error = new Error(`${subject}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n addListener(subject, key => {\n if(key === property){\n resolve(state[key]);\n return null;\n }\n\n if(key === null)\n reject(new Error(`${subject} is destroyed.`));\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: \"Suspense\",\n message: error.message,\n stack: error.stack\n });\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child models. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction snapshot<T extends Model>(model: T): Model.State<T> {\n const values = {} as any;\n let isNotRecursive;\n\n if(!EXPORT){\n isNotRecursive = true;\n EXPORT = new Map([[model, values]]);\n }\n\n for(let [key, value] of model){\n if(EXPORT.has(value))\n value = EXPORT.get(value);\n else if(value && typeof value == \"object\" && \"get\" in value && typeof value.get === \"function\")\n EXPORT.set(value, value = value.get());\n\n values[key] = value;\n }\n\n if(isNotRecursive)\n EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction update<T>(\n subject: Model,\n key: string | number | symbol,\n value: T,\n arg?: boolean | Model.Setter<T>){\n\n const state = STATE.get(subject)!;\n\n if(Object.isFrozen(state))\n throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);\n\n const previous = state[key] as T;\n\n if(typeof arg == \"function\"){\n const out = arg.call(subject, value, previous);\n\n if(out === false)\n return false;\n\n if(typeof out == \"function\")\n value = out();\n }\n\n if(value === previous && value !== undefined)\n return;\n\n state[key] = value;\n\n if(arg !== true)\n event(subject, key);\n\n return true;\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid(){\n return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();\n}\n\nexport {\n event,\n fetch,\n METHOD,\n Model,\n PARENT,\n STATE,\n uid,\n update,\n watch\n}","import { addListener } from './control';\nimport { event, Model, PARENT, uid } from './model';\n\nconst LOOKUP = new WeakMap<Model, Context | ((got: Context) => void)[]>();\nconst KEYS = new Map<symbol | Model.Type, symbol>();\n\nfunction key(T: Model.Type | symbol, upstream?: boolean): symbol {\n let K = KEYS.get(T);\n\n if(!K)\n KEYS.set(T, K = Symbol(\n typeof T == \"symbol\" ? \"get \" + T.description : String(T)\n ));\n \n return upstream ? key(K) : K;\n}\n\nfunction keys(from: Model.Type, upstream?: boolean){\n const keys = new Set<symbol>();\n\n do {\n keys.add(key(from, upstream));\n }\n while((from = Object.getPrototypeOf(from)) !== Model);\n\n return keys;\n}\n\ndeclare namespace Context {\n type Multiple<T extends Model> = {\n [key: string | number]: Model.Init<T> | T;\n };\n\n type Accept<T extends Model = Model> = T | Model.Init<T> | Multiple<T>;\n\n type Expect<T extends Model = Model> = (model: T) => (() => void) | void;\n}\n\ninterface Context {\n [key: symbol]: Model | Context.Expect | null | undefined;\n}\n\nclass Context {\n static get<T extends Model>(on: Model, callback: ((got: Context) => void)): void;\n static get<T extends Model>(on: Model): Context | undefined;\n static get({ is }: Model, callback?: (got: Context) => void){\n const waiting = LOOKUP.get(is);\n\n if(waiting instanceof Context){\n if(callback)\n callback(waiting);\n\n return waiting;\n }\n\n if(callback)\n if(waiting) \n waiting.push(callback);\n else \n LOOKUP.set(is, [callback]);\n }\n\n public id!: string;\n\n protected layer = new Map<string | number, Model | Model.Type>();\n protected cleanup = new Set<() => void>();\n\n constructor(inputs?: Context.Accept){\n if(inputs)\n this.include(inputs);\n }\n\n /** Run callback when a specified type is registered to a **child** context. */\n public has<T extends Model>(Type: Model.Type<T>, callback: (model: T) => void){\n Object.defineProperty(this, key(Type, true), { value: callback, configurable: true });\n }\n\n /** Find specified type registered to a parent context. Returns undefined if none are found. */\n public get<T extends Model>(Type: Model.Type<T>, require: true): T;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean): T | undefined;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean){\n const result = this[key(Type)];\n\n if(result === null)\n throw new Error(`Did find ${Type} in context, but multiple were defined.`);\n\n if(result)\n return result as T;\n\n if(require)\n throw new Error(`Could not find ${Type} in context.`);\n }\n\n public push(inputs?: Context.Accept){\n const next = Object.create(this) as this;\n\n this.cleanup = new Set([() => next.pop(), ...this.cleanup]);\n\n next.layer = new Map();\n next.cleanup = new Set();\n\n if(inputs)\n next.include(inputs);\n\n return next;\n }\n\n public pop(){\n for(const key of Object.getOwnPropertySymbols(this))\n delete (this as any)[key];\n\n this.cleanup.forEach(cb => cb());\n this.cleanup.clear();\n this.layer.clear();\n }\n\n public include<T extends Model>(\n inputs: Context.Accept<T>,\n forEach?: Context.Expect<T>\n ){\n const init = new Map<Model, boolean>();\n\n if(typeof inputs == \"function\" || inputs instanceof Model)\n inputs = { [forEach ? 0 : this.layer.size]: inputs };\n\n Object.entries(inputs).forEach(([K, V]: [string, Model | Model.Init<Model>]) => {\n if(Model.is(V) || V instanceof Model){\n const exists = this.layer.get(K);\n \n if(!exists){\n const instance = this.add(V);\n \n this.layer.set(K, V);\n init.set(instance, true);\n }\n // Context must force-reset because inputs are no longer safe.\n else if(exists !== V){ \n this.pop();\n this.id = uid();\n this.include(inputs);\n }\n\n return;\n }\n\n throw new Error(\n `Context may only include instance or class \\`extends Model\\` but got ${\n K == '0' || K == V ? V : `${V} (as '${K}')`\n }.`\n );\n })\n\n for(const [model, explicit] of init){\n model.set();\n\n if(explicit && forEach)\n forEach(model as T);\n\n for(const [_key, value] of model)\n if(PARENT.get(value as Model) === model){\n this.add(value as Model, true);\n init.set(value as Model, false);\n }\n }\n }\n\n protected add<T extends Model>(\n input: T | Model.Init<T>,\n implicit?: boolean){\n\n const cleanup = new Set<() => void>();\n let T: Model.Type<T>;\n let I: T;\n\n if(typeof input == \"function\"){\n T = input;\n I = new input() as T;\n }\n else {\n T = input.constructor as Model.Type<T>;\n I = input;\n }\n\n keys(T, true).forEach(K => {\n const expects = this[K] as Context.Expect | undefined;\n \n if(!expects)\n return;\n \n addListener(I, event => {\n if(event === true){\n const callback = expects(I);\n \n if(callback)\n cleanup.add(callback);\n }\n\n return null;\n }) \n });\n\n keys(T).forEach(K => {\n const value = this.hasOwnProperty(K) ? null : I;\n\n if(value || this[K] !== I && !implicit)\n Object.defineProperty(this, K, {\n configurable: true,\n value\n });\n });\n\n this.cleanup.add(() => {\n cleanup.forEach(cb => cb());\n\n if(I !== input)\n event(I, null);\n })\n\n const waiting = LOOKUP.get(I);\n \n if(waiting instanceof Array)\n waiting.forEach(cb => cb(this));\n\n LOOKUP.set(I, this);\n\n return I;\n }\n}\n\nexport { Context }","import { fetch, Model, PARENT, STATE, uid, update, watch } from '../model';\n\nconst INSTRUCTION = new Map<symbol, Model.Instruction>();\n\nfunction use <T> (instruction: Model.Instruction<T>): T extends void ? unknown : T;\n\nfunction use <T extends Model> (Type: Model.Init<T>, required: false): T | undefined;\n\nfunction use <T extends Model> (Type: Model.Init<T>, ready?: (i: T) => void): T;\n\nfunction use(\n arg1: Model.Init | Model.Instruction,\n arg2?: ((i: Model) => void) | boolean){\n\n if(Model.is(arg1))\n arg1 = childInstruction(arg1, arg2);\n\n const token = Symbol(\"instruction-\" + uid());\n INSTRUCTION.set(token, arg1);\n return token;\n}\n\nfunction childInstruction(\n type: Model.Init<Model>,\n arg2?: ((i: Model) => void) | boolean\n): Model.Instruction<any, any> {\n return (key, subject) => {\n function set(next: Model | undefined){\n if(next ? !(next instanceof type) : arg2 !== false)\n throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);\n\n update(subject, key, next);\n\n if(next && typeof arg2 == \"function\")\n arg2(next);\n\n return false;\n }\n\n const value = new type();\n\n set(value);\n PARENT.set(value, subject);\n value.set();\n\n return { set };\n }\n}\n\nfunction init(this: Model){\n const state = STATE.get(this)!;\n\n for(const key in this){\n const { value } = Object.getOwnPropertyDescriptor(this, key)!;\n const instruction = INSTRUCTION.get(value);\n\n if(!instruction)\n continue;\n\n INSTRUCTION.delete(value);\n delete (this as any)[key];\n\n const output = instruction.call(this, key, this, state);\n\n if(!output)\n continue;\n\n const desc = typeof output == \"object\" ? output : { get: output };\n\n if(\"value\" in desc)\n state[key] = desc.value;\n\n const model = this;\n\n Object.defineProperty(model, key, {\n enumerable: desc.enumerable !== false,\n get(this: Model){\n return watch(this, key, \n typeof desc.get == \"function\"\n ? desc.get(this)\n : fetch(model, key, desc.get)\n );\n },\n set(next){\n if(desc.set === false)\n throw new Error(`${model}.${key} is read-only.`);\n\n update(model, key, next, desc.set);\n }\n })\n }\n\n return null;\n}\n\nModel.on(init);\n\nexport { use }","import { Context } from '../context';\nimport { createEffect } from '../control';\nimport { fetch, METHOD, Model, PARENT, event, update } from '../model';\nimport { use } from './use';\n\ntype Type<T extends Model> = Model.Type<T> & typeof Model;\n\nconst STALE = new WeakSet<() => void>();\n\ndeclare namespace get {\n type Compute<T, S = any> = (on: S, key: string) => T;\n\n type Factory<T, S = any> = (this: S, key: string, thisArg: S) => T;\n\n type Source<T extends Model = Model> = (resolve: (x: T) => void) => void;\n\n type Effect<T> = (model: T, key: string) => (() => void) | void;\n}\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param expectParent - If true, will throw if Model is created without a parent.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, expectParent?: true): T;\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param required - If false, property may be undefined. Otherwise will throw suspense.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, required?: false): T | undefined;\n\n/**\n * Implement a computed value from a foreign model. Output will be generated by provided function,\n * where the foreign model will be passed to that function.\n * \n * @param source - Type of Model to fetch for computation.\n * @param compute - Compute function. Will update automatically as input values change.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, effect: get.Effect<T>): T;\n\n/**\n * Implement a computed value; output will be generated by provided function.\n *\n * @param source - Source model from which computed value will be a subscriber.\n * @param compute - Compute function. Bound to a subscriber-proxy of source, returns output value. Will update automatically as input values change.\n */\nfunction get <R, T extends Model> (source: T, compute: get.Compute<R, T>): R;\n\n/**\n * Implement a computed value; output is returned by function from provided factory.\n * \n * Factory is bound to owner of property.\n *\n * @param compute - Factory function to generate a getter to subscribe dependancies.\n */\nfunction get <R, T> (compute: get.Factory<R, T>): R;\n \nfunction get<R, T extends Model>(\n arg0: T | get.Factory<R, T> | Type<T>,\n arg1?: Function | boolean){\n\n return use((key, subject, state) => {\n if(typeof arg0 == \"symbol\")\n throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key}. This is not allowed.`)\n\n if(Model.is(arg0)){\n const hasParent = PARENT.get(subject) as T;\n\n // TODO: notify on discovered context \n function assign(value: T) {\n if (typeof arg1 == \"function\")\n value.get(x => (arg1 as Function)(x, key));\n\n update(subject, key, value);\n }\n\n if(!hasParent && arg1 === true)\n throw new Error(`${subject} may only exist as a child of type ${arg0}.`);\n else if(hasParent)\n if(hasParent instanceof arg0){\n assign(hasParent);\n return {}\n }\n else if(arg1 === true)\n throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);\n \n Context.get(subject, (context) => {\n const model = context.get(arg0);\n\n if(model)\n assign(model);\n else if(arg1 !== false)\n throw new Error(`Required ${arg0} not found in context for ${subject}.`)\n });\n\n return {\n get: arg1 !== false,\n enumerable: false\n };\n }\n \n let from = subject;\n \n if(arg0 instanceof Model){\n from = arg0;\n }\n else {\n const fn = METHOD.get(arg0) || arg0;\n arg1 = ((p, k) => fn.call(p, k, p)) as get.Effect<T>;\n }\n\n const source: get.Source<T> = resolve => resolve(from);\n const getter = arg1 as get.Compute<R, T>;\n\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n function connect(model: Model){\n reset = createEffect(model, current => {\n proxy = current;\n\n if(!(key in state) || STALE.delete(compute))\n compute(!reset);\n\n return (didUpdate) => {\n if(didUpdate){\n STALE.add(compute);\n event(subject, key, true);\n }\n };\n }, false)\n }\n\n function compute(initial?: boolean){\n let next: R | undefined;\n\n try {\n next = getter.call(proxy, proxy, key);\n }\n catch(err){\n console.warn(`An exception was thrown while ${initial ? \"initializing\" : \"refreshing\"} ${subject}.${key}.`)\n\n if(initial)\n throw err;\n\n console.error(err);\n }\n\n update(subject, key, next, !isAsync);\n }\n\n return () => {\n if(!proxy){\n source(connect);\n isAsync = true;\n }\n\n if(STALE.delete(compute))\n compute();\n\n return fetch(subject, key, !proxy) as T;\n }\n })\n}\n\nexport { get };","import { addListener, enter } from '../control';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst { defineProperty, defineProperties } = Object;\n\ndeclare namespace ref {\n type Callback<T> = (argument: T) =>\n ((next: T | null) => void) | Promise<void> | void | boolean;\n\n interface Object<T = any> {\n (next: T | null): void;\n\n /** Current value held by this reference. */\n current: T | null;\n\n /** \n * Subscribe to changes of this reference.\n * \n * @param callback - Callback to invoke with the current value when it changes.\n * @returns Unsubscribe function to stop listening to changes.\n */\n get(callback: (value: T) => void): () => void;\n\n /** Retrieve current value. */\n get(): T | null;\n }\n\n /** Object with references to all managed values of `T`. */\n\n /** Object with references to all managed values of `T`. */\n type Proxy<T extends Model> =\n & { [P in Model.Field<T>]-?: Object<T[P]> }\n & { get(): T };\n\n type CustomProxy<T extends Model, R> =\n & { [P in Model.Field<T>]-?: R }\n & { get(): T };\n}\n\n/**\n * Creates an object with references to all managed values.\n * Each property is a function to set value in state when invoked.\n *\n * *Properties are simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param target - Source model from which to reference values.\n */\nfunction ref <T extends Model> (target: T): ref.Proxy<T>;\n\n/**\n * Creates an object with values based on managed values.\n * Each property will invoke mapper function on first access supply\n * the its return value going forward.\n *\n * @param target - Source model from which to reference values.\n * @param mapper - Function producing the placeholder value for any given property.\n */\nfunction ref <O extends Model, R>\n (target: O, mapper: (key: Model.Field<O>) => R): ref.CustomProxy<O, R>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n */\nfunction ref <T> (callback?: ref.Callback<T>): ref.Object<T>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n * @param ignoreNull - Default `true`. If `false`, will still callback with `null`.\n */\nfunction ref <T> (callback: ref.Callback<T | null>, ignoreNull: boolean): ref.Object<T>;\n\nfunction ref<T>(\n arg?: ref.Callback<T> | Model,\n arg2?: ((key: string) => any) | boolean){\n\n return use<T>((key, subject, state) => {\n let value = {};\n const method = (key: string) =>\n (callback?: (value: T) => void) => callback\n ? addListener(subject, () => callback(state[key]), key)\n : state[key];\n\n if(arg === subject)\n subject.get(() => {\n for(const key in state)\n if(typeof arg2 == \"function\")\n defineProperty(value, key, {\n configurable: true,\n get(){\n const out = arg2(key);\n defineProperty(value, key, { value: out });\n return out;\n }\n })\n else {\n const get = method(key);\n const set = (value: unknown) => {\n update(subject, key, value)\n };\n\n defineProperties(set, {\n current: { get, set },\n get: { value: get }\n });\n\n defineProperty(value, key, { value: set });\n }\n })\n\n else if(typeof arg == \"object\")\n throw new Error(\"ref instruction does not support object which is not 'this'\");\n\n else {\n let unset: ((next: T) => void) | undefined;\n\n const get = method(key);\n const set = (value?: any) => {\n if(!update(subject, key, value) || !arg)\n return;\n\n if(unset)\n unset = void unset(value);\n \n if(value === null && arg2 !== false)\n return;\n\n const exit = enter();\n const out = arg.call(subject, value);\n const flush = exit();\n\n unset = key => {\n if(typeof out == \"function\")\n out(key);\n\n flush();\n }\n };\n \n state[key] = null;\n value = defineProperties(set, {\n current: { get, set },\n get: { value: get }\n }) as ref.Object<T>;\n }\n\n defineProperty(subject, key, { value });\n })\n}\n\nexport { ref }","import { addListener, enter } from '../control';\nimport { Model, event, update } from '../model';\nimport { use } from './use';\n\ndeclare namespace set {\n type Callback<T, S = any> = (this: S, next: T, previous: T) =>\n ((next: T) => void) | Promise<any> | void | boolean;\n\n type Factory<T, S = any> = (this: S, key: string) => Promise<T> | T;\n}\n\n/**\n * Set property as `undefined` but required.\n * \n * Property cannot be accessed until it is defined. If accessed while undefined, a hybrid\n * `Promise`/`Error` (aka: [Suspense](https://reactjs.org/docs/concurrent-mode-suspense.html)) will be thrown.\n */\nfunction set <T = any>(): T;\n\n/**\n * Set property with a factory function.\n * \n * **Note** Factory is lazy! It will only run if/when property is accessed.\n * Value will be undefined until factory resolves, which will also dispatch an update for the property.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required: false): T | undefined;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param required - If true run factory immediately on creation, otherwise on access.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required?: boolean): T;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param onUpdate - Callback run when property is finished computing or is set. \n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, onUpdate?: set.Callback<T>): T;\n\n/**\n * Set a property with empty placeholder and/or update callback.\n * \n * @param value - Starting value for property. If undefined, suspense will be thrown on access, until value is set and accepted by callback.\n * @param onUpdate - Callback run when property is set. If returns false, update is not accepted and property will keep previous value.\n */\nfunction set <T> (value: T | undefined, onUpdate?: set.Callback<T>): T;\n\nfunction set <T> (\n value?: set.Factory<T> | Promise<T> | T,\n argument?: set.Callback<any> | boolean){\n\n return use<T>((key, subject) => {\n const property: Model.Descriptor = { enumerable: false };\n\n if(typeof value == \"function\" || value instanceof Promise){\n function init(){\n if(typeof value == \"function\")\n try {\n value = attempt(value.bind(subject, key));\n }\n catch(err){\n console.warn(`Generating initial value for ${subject}.${key} failed.`);\n throw err;\n }\n\n property.get = argument !== false;\n\n const set = (value: any) => subject[key] = value;\n\n if(value instanceof Promise)\n value.then(set, error => {\n event(subject, key);\n property.get = () => { throw error };\n })\n else\n set(value);\n\n if(argument)\n return null;\n \n return subject[key];\n }\n\n if(argument)\n addListener(subject, init, true);\n else\n property.get = init;\n }\n else if(value !== undefined)\n property.value = value;\n\n if(typeof argument == \"function\"){\n let unset: ((next: T) => void) | undefined;\n\n property.set = function(this: any, value: any, previous: any){\n const exit = enter();\n const returns = argument.call(this, value, previous);\n const flush = exit();\n\n if(returns === false)\n return false;\n\n if(typeof unset == \"function\")\n unset(value);\n\n unset = (next: T) => {\n if(typeof returns == \"function\")\n returns(next);\n\n flush();\n }\n }\n }\n else\n property.set = value => {\n property.get = undefined;\n update(subject, key, value);\n }\n\n return property;\n })\n}\n\nfunction attempt(fn: () => any): any {\n function retry(err: unknown){\n if(err instanceof Promise)\n return err.then(compute);\n else\n throw err;\n }\n\n function compute(): any {\n try {\n const output = fn();\n\n return output instanceof Promise\n ? output.catch(retry)\n : output;\n }\n catch(err){\n return retry(err);\n }\n }\n\n return compute();\n}\n\nexport { set }","import { enter } from '../control';\nimport { Context } from '../context';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst APPLY = new WeakMap<Model, (model: Model) => (() => void) | boolean | void>();\n\ndeclare namespace has {\n type Callback<T = any> = (model: T, recipient: Model) => void | boolean | (() => void);\n}\n\nfunction has <T extends Model> (type: Model.Type<T>, callback?: has.Callback<T>): readonly T[];\nfunction has (callback?: has.Callback): readonly Model[];\n \nfunction has <T extends Model> (\n arg1?: Model.Type<T> | has.Callback<Model>,\n arg2?: has.Callback<T>){\n\n return use<T[]>((key, subject) => {\n const applied = new Set<Model>();\n const reset = () => {\n update(subject, key, Object.freeze(Array.from(applied)));\n }\n\n if(Model.is(arg1))\n Context.get(subject, ctx => {\n ctx.has(arg1, model => {\n let remove: (() => void) | undefined;\n let disconnect: (() => void) | undefined;\n let flush: (() => void) | undefined;\n \n if(applied.has(model))\n return;\n \n const exit = enter();\n\n try {\n const notify = APPLY.get(model);\n\n if(notify){\n const after = notify(subject);\n \n if(after === false)\n return;\n \n if(typeof after == \"function\")\n disconnect = after;\n }\n \n if(typeof arg2 == \"function\"){\n const done = arg2(model, subject);\n \n if(done === false)\n return false;\n\n if(typeof done == \"function\")\n remove = done;\n }\n }\n finally {\n flush = exit();\n }\n \n applied.add(model);\n reset();\n \n const done = () => { \n flush();\n ignore();\n \n applied.delete(model);\n reset();\n \n if(disconnect)\n disconnect();\n \n if(typeof remove == \"function\")\n remove();\n\n remove = undefined;\n }\n \n const ignore = model.set(done, null);\n \n return done;\n })\n });\n else {\n if(APPLY.has(subject))\n throw new Error(`'has' callback can only be used once per model.`);\n\n APPLY.set(subject, recipient => {\n let remove: (() => void) | boolean | void;\n\n if(arg1){\n remove = arg1(recipient, subject);\n \n if(remove === false)\n return false;\n }\n\n applied.add(recipient);\n reset();\n\n return () => {\n applied.delete(recipient);\n reset();\n\n if(typeof remove == \"function\")\n remove();\n }\n });\n }\n\n return { value: [] };\n })\n}\n\nexport { has }"],"mappings":"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","names":["key","event","watch","key","update","res","set","keys","bind","use","get","value","silent","keys","require","key","init","event","key","set","init","key","assign","key","get","set","value","key","init","set","value","key","done"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/control.ts","../src/model.ts","../src/context.ts","../src/instruction/use.ts","../src/instruction/get.ts","../src/instruction/ref.ts","../src/instruction/set.ts","../src/instruction/has.ts"],"sourcesContent":["export { get } from './instruction/get';\nexport { ref } from './instruction/ref';\nexport { set } from './instruction/set';\nexport { use } from './instruction/use';\nexport { has } from './instruction/has';\n\nexport { Model, Model as default, METHOD } from './model';\nexport { createEffect, addListener, event, Observable } from './control';\nexport { Context } from './context';","/**\n * Update callback function.\n * \n * @param key -\n * - `string` - property which has updated.\n * - `false` - a normal update has completed.\n * - `true` - initial event; instance is ready.\n * - `null` - terminal event; instance is expired.\n * @param source - Instance of Model for which update has occured.\n */\ntype OnUpdate<T extends Observable = any> = \n (this: T, key: Event, source: T) => (() => void) | null | void;\n\ntype Effect<T extends Observable> = (this: T, proxy: T) =>\n ((update: boolean | null) => void) | Promise<void> | null | void;\n\ntype Event = number | string | null | boolean | symbol;\n\ntype PromiseLite<T = void> = { then: (callback: () => T) => T };\n\ndeclare namespace Observable {\n export type Callback = () => void | PromiseLite;\n}\n\ninterface Observable {\n [Observable](callback: Observable.Callback, required?: boolean): this;\n}\n\nconst Observable = Symbol(\"observe\");\n\n/** Placeholder event determines if model is initialized or not. */\nconst onReady = () => null;\n\nconst LISTENERS = new WeakMap<Observable, Map<OnUpdate, Set<Event> | undefined>>();\n\n/** Events pending for a given object. */\nconst PENDING = new WeakMap<Observable, Set<Event>>();\n\n/** Update register. */\nconst PENDING_KEYS = new WeakMap<Observable, Set<string | number | symbol>>();\n\n/** Central event dispatch. Bunches all updates to occur at same time. */\nconst DISPATCH = new Set<() => void>();\n\nfunction addListener<T extends Observable>(\n subject: T, callback: OnUpdate<T>, select?: Event | Set<Event>){\n\n let listeners = LISTENERS.get(subject)!;\n\n if(!listeners)\n LISTENERS.set(subject, listeners = new Map([[onReady, undefined]]));\n\n if(select !== undefined && !(select instanceof Set))\n select = new Set([select]);\n\n if(!listeners.has(onReady) && !select)\n callback.call(subject, true, subject);\n\n listeners.set(callback, select);\n\n return () => listeners.delete(callback);\n}\n\nfunction emit(model: Observable, key: Event): void {\n const listeners = LISTENERS.get(model)!;\n const notReady = listeners.has(onReady);\n\n if(key === true && !notReady)\n return;\n\n let pending = PENDING.get(model);\n\n if(pending){\n pending.add(key);\n return;\n }\n\n PENDING.set(model, pending = new Set(notReady ? [true, key] : [key]));\n\n for(const key of pending)\n for(const [callback, filter] of listeners)\n if(!filter || filter.has(key)){\n const after = callback.call(model, key, model);\n\n if(after)\n enqueue(after);\n\n else if(after === null)\n listeners.delete(callback);\n }\n\n if(key === null)\n listeners.clear();\n \n PENDING.delete(model);\n}\n\nfunction event(\n subject: Observable,\n key?: string | number | symbol | null,\n silent?: boolean){\n\n if(key === null)\n return emit(subject, key);\n\n if(!key)\n return emit(subject, true);\n\n let pending = PENDING_KEYS.get(subject);\n\n if(!pending){\n PENDING_KEYS.set(subject, pending = new Set());\n\n if(!silent)\n enqueue(() => {\n emit(subject, false);\n PENDING_KEYS.delete(subject)\n })\n }\n\n pending.add(key);\n\n if(!silent)\n emit(subject, key);\n}\n\nfunction enqueue(eventHandler: (() => void)){\n if(!DISPATCH.size)\n setTimeout(() => {\n DISPATCH.forEach(event => {\n try {\n event();\n }\n catch(err){\n console.error(err);\n }\n });\n DISPATCH.clear();\n }, 0);\n\n DISPATCH.add(eventHandler);\n}\n\n/**\n * Create a side-effect which will update whenever values accessed change.\n * Callback is called immediately and whenever values are stale.\n * \n * @param target - Instance of Model to observe.\n * @param callback - Function to invoke when values change.\n * @param requireValues - If `true` will throw if accessing a value which is `undefined`.\n */\nfunction createEffect<T extends Observable>(target: T, callback: Effect<Required<T>>, requireValues: true): () => void;\nfunction createEffect<T extends Observable>(target: T, callback: Effect<T>, recursive?: boolean): () => void;\nfunction createEffect<T extends Observable>(target: T, callback: Effect<T>, argument?: boolean){\n let unset: ((update: boolean | null) => void) | undefined;\n let reset: (() => void) | null | undefined;\n\n function invoke() {\n let stale: boolean | undefined;\n\n function onUpdate(): void | PromiseLite<void> {\n if (stale || reset === null)\n return;\n\n stale = true;\n\n if (reset && unset) {\n unset(true);\n unset = undefined;\n }\n\n enqueue(invoke);\n return { then: enqueue }\n }\n\n const subscriber = target[Observable](onUpdate, argument === true);\n\n try {\n const exit = enter(argument === false);\n const output = callback.call(subscriber, subscriber);\n const flush = exit();\n\n reset = output === null ? null : invoke;\n unset = key => {\n if(typeof output == \"function\")\n output(key);\n\n flush();\n }\n }\n catch(err){\n if(err instanceof Promise){\n reset = undefined;\n err.then(invoke);\n }\n else\n throw err;\n }\n }\n\n function cleanup(){\n if(unset)\n unset(false);\n\n reset = null;\n };\n\n if(EffectContext && argument !== false)\n EffectContext.add(cleanup);\n\n addListener(target, key => {\n if(key === true)\n invoke();\n\n else if(!reset)\n return reset;\n\n if(key === null && unset)\n unset(null);\n });\n \n return cleanup;\n}\n\nlet EffectContext: Set<() => void> | undefined;\n\nexport function enter(ignore?: boolean){\n if(ignore)\n return () => () => {};\n\n const last = EffectContext;\n const context = EffectContext = new Set;\n\n return () => {\n EffectContext = last;\n return () => context.forEach(fn => fn());\n }\n}\n\nexport {\n addListener,\n createEffect,\n event,\n OnUpdate,\n PENDING_KEYS,\n Observable\n}","import { addListener, createEffect, event, Observable, OnUpdate, PENDING_KEYS } from './control';\n\nconst define = Object.defineProperty;\n\n/** Register for all active models via string identifiers (usually unique). */\nconst ID = new WeakMap<Model, string>();\n\n/** Internal state assigned to models. */\nconst STATE = new WeakMap<Model, Record<string | number | symbol, unknown>>();\n\n/** External listeners for any given Model. */\nconst NOTIFY = new WeakMap<Model.Type, Set<OnUpdate>>();\n\n/** Parent-child relationships. */\nconst PARENT = new WeakMap<Model, Model | null>();\n\n/** List of methods defined by a given type. */\nconst METHODS = new WeakMap<Model.Type, Map<string, (value: any) => void>>();\n\n/** Reference bound instance methods to real ones. */\nconst METHOD = new WeakMap<any, any>();\n\ndeclare namespace Model {\n /** Any type of Model, using own class constructor as its identifier. */\n type Type<T extends Model = Model> =\n (abstract new (...args: any[]) => T) & typeof Model;\n\n /** A Model constructor, but which is not abstract. */\n type Init<T extends Model = Model> =\n (new (...args: Model.Args<T>) => T) & Omit<typeof Model, never>;\n\n /**\n * Model constructor callback - is called when Model finishes intializing.\n * Returned function will run when model is destroyed.\n */\n type Callback<T extends Model = Model> =\n (this: T, thisArg: T) => Promise<void> | (() => void) | Assign<T> | void;\n\n /** Model constructor argument */\n type Argument<T extends Model = Model> = Assign<T> | Callback<T> | string | void;\n\n /** Model constructor arguments */\n type Args<T extends Model = any> = (Argument<T> | Args<T>)[];\n\n /** Subset of `keyof T` which are not methods or defined by base Model U. **/\n type Field<T> = Exclude<keyof T, keyof Model>;\n\n /** Any valid key for model, including but not limited to Field<T>. */\n type Event<T> = Field<T> | (string & {}) | number | symbol;\n\n /** Object overlay to override values and methods on a model. */\n type Assign<T> = {\n [K in Field<T>]?:\n T[K] extends (...args: infer A) => infer R \n ? (this: T, ...args: A) => R\n : T[K];\n } & Record<string, unknown>;\n\n /** Export/Import compatible value for a given property in a Model. */\n type Export<R> = R extends { get(): infer T } ? T : R;\n\n /** Value for a property managed by a model. */\n type Value<T extends Model, K extends Event<T>> =\n K extends keyof T ? Export<T[K]> : unknown;\n\n type OnEvent<T extends Model> =\n (this: T, key: unknown, source: T) => (() => void) | void | null;\n\n type OnUpdate<T extends Model, K extends Event<T>> =\n (this: T, key: K, thisArg: K) => void;\n\n /**\n * Values from current state of given model.\n * Differs from `Values` as values here will drill\n * into \"real\" values held by exotics like ref.Object.\n */\n type State<T> = { [P in Field<T>]: Export<T[P]> };\n\n /** Object comperable to data found in T. */\n type Values<T> = { [P in Field<T>]?: Export<T[P]> };\n\n /** Exotic value, where actual value is contained within. */\n type Ref<T = any> = {\n (next: T): void;\n current: T | null;\n }\n\n /**\n * A callback function which is subscribed to parent and updates when accessed properties change.\n * \n * @param current - Current state of this model. This is a proxy which detects properties which\n * where accessed, and thus depended upon to stay current.\n * \n * @param update - Set of properties which have changed, and events fired, since last update.\n * \n * @returns A callback function which will be called when this effect is stale.\n */\n type Effect<T> = (this: T, current: T, update: Set<Event<T>>) =>\n EffectCallback | Promise<void> | null | void;\n\n /**\n * A callback function returned by effect. Will be called when effect is stale.\n * \n * @param update - `true` if update is pending, `false` effect has been cancelled, `null` if model is destroyed.\n */\n type EffectCallback = ((update: boolean | null) => void);\n\n /**\n * Property initializer, will run upon instance creation.\n * Optional returned callback will run when once upon first access.\n */\n type Instruction<T = any, M extends Model = any> =\n // TODO: Should this allow for numbers/symbol properties?\n (this: M, key: Extract<Field<M>, string>, thisArg: M, state: State<M>) =>\n Descriptor<T> | ((source: M) => T) | void;\n\n type Getter<T> = (source: Model) => T;\n type Setter<T> = (value: T, previous: T) => boolean | void | (() => T);\n\n type Descriptor<T = any> = {\n get?: Getter<T> | boolean;\n set?: Setter<T> | boolean;\n enumerable?: boolean;\n value?: T;\n }\n}\n\ninterface Model {\n /**\n * Loopback to instance of this model. This is useful when in a subscribed context,\n * to keep write access to `this` after a destructure. You can use it to read variables silently as well.\n **/\n is: this;\n}\n\nabstract class Model implements Observable {\n constructor(...args: Model.Args){\n prepare(this);\n define(this, \"is\", { value: this });\n init(this, args);\n }\n\n [Observable](callback: Observable.Callback, required?: boolean){\n const watch = new Set<Model.Event<this>>();\n const proxy = Object.create(this);\n \n addListener(this, () => void callback(), watch);\n\n OBSERVER.set(proxy, (key, value) => {\n if(value === undefined && required)\n throw new Error(`${this}.${key} is required in this context.`);\n\n watch.add(key);\n\n if(value instanceof Object && Observable in value)\n return value[Observable](callback, required);\n\n return value;\n });\n\n return proxy as this;\n }\n\n /**\n * Pull current values from state. Flattens all models and exotic values recursively.\n * \n * @returns Object with all values from this model.\n **/\n get(): Model.State<this>;\n\n /**\n * Run a function which will run automatically when accessed values change.\n * \n * @param effect Function to run, and again whenever accessed values change.\n * If effect returns a function, it will be called when a change occurs (syncronously),\n * effect is cancelled, or parent model is destroyed.\n * @returns Function to cancel listener.\n */\n get(effect: Model.Effect<this>): () => void;\n\n /**\n * Get value of a property.\n * \n * @param key - Property to get value of.\n * @param required - If true, will throw an error if property is not available.\n * @returns Value of property.\n */\n get<T extends Model.Event<this>>(key: T, required?: boolean): Model.Value<this, T>;\n\n /**\n * Run a function when a property is updated.\n * \n * @param key - Property to watch for updates.\n * @param callback - Function to call when property is updated.\n * @returns Function to cancel listener.\n */\n get<T extends Model.Event<this>>(key: T, callback: Model.OnUpdate<this, T>): () => void;\n\n /**\n * Check if model is expired.\n * \n * @param status - `null` to check if model is expired.\n * @returns `true` if model is expired, `false` otherwise.\n */\n get(status: null): boolean;\n\n /**\n * Callback when model is to be destroyed.\n * \n * @param callback - Function to call when model is destroyed.\n * @returns Function to cancel listener.\n */\n get(status: null, callback: () => void): () => void;\n\n get(arg1?: Model.Effect<this> | string | null, arg2?: boolean | Model.OnUpdate<this, any>){\n const self = this.is;\n\n if(typeof arg1 == \"function\"){\n let pending = new Set<Model.Event<this>>();\n\n return createEffect(self, (proxy) => {\n const cb = arg1.call(proxy, proxy, pending);\n\n return cb === null ? null : ((update) => {\n pending = PENDING_KEYS.get(self)!;\n if(typeof cb == \"function\")\n cb(update);\n })\n });\n }\n\n return (\n arg1 === undefined ? snapshot(self) :\n typeof arg2 == \"function\" ? addListener(self, arg2, arg1) :\n arg1 === null ? Object.isFrozen(STATE.get(self)) :\n fetch(self, arg1, arg2)\n )\n }\n\n /**\n * Get update in progress.\n *\n * @returns Promise which resolves object with updated values, `undefined` if there no update is pending.\n **/\n set(): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Update mulitple properties at once. Merges argument with current state.\n * Properties which are not managed by this model will be ignored.\n * \n * @param assign - Object with properties to update.\n * @param silent - If an update does occur, listeners will not be refreshed automatically.\n * @returns Promise resolving an array of keys updated, `undefined` (immediately) if a noop.\n */\n set(assign?: Model.Assign<this>, silent?: boolean): PromiseLike<Model.Event<this>[]> | undefined;\n\n /**\n * Push an update. This will not change the value of associated property.\n * \n * Useful where a property value internally has changed, but the object is the same.\n * For example: An array has pushed a new value, or a nested property is updated.\n * \n * You can also use this to dispatch arbitrary events.\n * Symbols are recommended as non-property events, however you can use any string.\n * If doing so, be sure to avoid collisions with property names! An easy way to do this is\n * to prefix an event with \"!\" and/or use dash-case. e.g. `set(\"!event\")` or `set(\"my-event\")`.\n * \n * @param key - Property or event to dispatch.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Set a value for a property. This will update the value and notify listeners.\n * \n * **Use with caution!** Key nor value are checked for validity.\n * \n * This is meant for assigning values programmatically,\n * where simple assignment is not practicable.\n * \n * For example: `(this as any)[myProperty] = value;`\n * \n * @param key - Property to set value for.\n * @param value - Value to set for property.\n * @param init - If true, model will begin to manage the property if it is not already.\n * @returns Promise resolves an array of keys updated.\n */\n set(key: Model.Event<this>, value: unknown, init?: boolean): PromiseLike<Model.Event<this>[]>;\n\n /**\n * Call a function when update occurs.\n * \n * Given function is called for every assignment (which changes value) or explicit `set`.\n * \n * To run logic on final value only, callback may return a function. Using the same\n * function for one or more events will ensure it is called only when events are settled.\n * \n * @param callback - Function to call when update occurs.\n * @returns Function to remove listener. Will return `true` if removed, `false` if inactive already.\n * \n */\n set(callback: Model.OnEvent<this>): () => boolean;\n\n /**\n * Call a function when a property is updated.\n * Unlike `get`, this calsl synchronously and will fire as many times as the property is updated.\n * \n * @param callback - Function to call when property is updated.\n * @param event - Property to watch for updates.\n */\n set(callback: Model.OnEvent<this>, event: Model.Event<this> | null): () => boolean;\n\n /**\n * Declare an end to updates. This event is final and will freeze state.\n * This event can be watched for as well, to run cleanup logic and internally will remove all listeners.\n * \n * @param status - `null` to end updates.\n */\n set(status: null): void;\n\n set(\n arg1?: Model.OnEvent<this> | Model.Assign<this> | Model.Event<this> | null,\n arg2?: unknown,\n arg3?: boolean){\n\n const self = this.is;\n\n if(typeof arg1 == \"function\")\n return addListener(self, key => {\n if(arg2 === key || arg2 === undefined && typeof key == \"string\")\n return arg1.call(self, key, self);\n })\n \n if(arg1 && typeof arg1 == \"object\")\n assign(self, arg1, arg2 === true);\n else if(!arg2)\n event(self, arg1);\n else if(arg3)\n manage(self, arg1 as string | number, arg2);\n else\n update(self, arg1 as string | number, arg2)\n\n const pending = PENDING_KEYS.get(this);\n\n if(pending)\n return <PromiseLike<Model.Event<this>[]>> {\n then: (res) => new Promise<any>(res => {\n const remove = addListener(this, key => {\n if(key !== true){\n remove();\n return res.bind(null, Array.from(pending));\n }\n });\n }).then(res)\n }\n }\n\n /**\n * Iterate over managed properties in this instance of Model.\n * Yeilds the key and current value for each property.\n */\n [Symbol.iterator](): Iterator<[string, unknown]> {\n return Object.entries(STATE.get(this.is)!)[Symbol.iterator]();\n }\n\n /**\n * Create and activate a new instance of this model.\n * \n * **Important** - Unlike `new this(...)` - this method also activates state.\n * \n * @param args - arguments sent to constructor\n */\n static new<T extends Model>(this: Model.Init<T>, ...args: Model.Args<T>){\n const instance = new this(...args);\n event(instance);\n return instance;\n }\n\n /**\n * Static equivalent of `x instanceof this`.\n * Determines if provided class is a subtype of this one.\n * If so, language server will make available all static\n * methods and properties of this class.\n */\n static is<T extends Model.Type>(this: T, maybe: unknown): maybe is T {\n return maybe === this || typeof maybe == \"function\" && maybe.prototype instanceof this;\n }\n\n /**\n * Register a callback to run when any instance of this Model is updated. \n */\n static on<T extends Model>(this: Model.Type<T>, listener: Model.OnEvent<T>){\n let notify = NOTIFY.get(this);\n\n if(!notify)\n NOTIFY.set(this, notify = new Set);\n\n notify.add(listener);\n\n return () => notify.delete(listener);\n }\n}\n\ndefine(Model.prototype, \"toString\", {\n value(){\n return ID.get(this.is);\n }\n});\n\ndefine(Model, \"toString\", {\n value(){\n return this.name;\n }\n});\n\nfunction assign(subject: Model, data: Model.Assign<Model>, silent?: boolean){\n const methods = METHODS.get(subject.constructor as Model.Type)!;\n \n for(const key in data){\n const bind = methods.get(key);\n\n if(bind)\n bind.call(subject, data[key]);\n else if(key in subject && key !== \"is\"){\n const desc = Object.getOwnPropertyDescriptor(subject, key)!;\n const set = desc && desc.set as (value: any, silent?: boolean) => void;\n\n set.call(subject, data[key], silent);\n }\n }\n}\n\n/** Apply instructions and inherited event listeners. Ensure class metadata is ready. */\nfunction prepare(model: Model){\n let T = model.constructor as Model.Type;\n\n if(T === Model)\n throw new Error(\"Cannot create base Model.\");\n\n const chain = [] as Model.Type[];\n let keys = new Map<string, (value: any) => void>();\n\n ID.set(model, `${T}-${uid()}`);\n\n while(T.name){\n for(const cb of NOTIFY.get(T) || [])\n addListener(model, cb);\n\n if(T === Model) break;\n else chain.unshift(T);\n\n T = Object.getPrototypeOf(T)\n }\n\n for(const type of chain){\n if(METHODS.has(type)){\n keys = METHODS.get(type)!;\n continue;\n }\n\n METHODS.set(type, keys = new Map(keys));\n\n for(const [key, { value }] of Object.entries(\n Object.getOwnPropertyDescriptors(type.prototype)\n )){\n if(!value || key == \"constructor\")\n continue;\n \n function bind(this: Model, original?: Function){\n const { is } = this;\n\n if(is.hasOwnProperty(key) && !original)\n return value as Function;\n\n const fn = original || value;\n const bound = fn.bind(is);\n \n METHOD.set(bound, fn);\n define(is, key, { value: bound, writable: true });\n \n return bound;\n }\n\n keys.set(key, bind);\n define(type.prototype, key, { get: bind, set: bind });\n }\n }\n}\n\n/**\n * Apply model arguemnts, run callbacks and observe properties.\n * Accumulate and handle cleanup events.\n **/\nfunction init(model: Model, args: Model.Args){\n const state = {} as Record<string | number | symbol, unknown>;\n\n STATE.set(model, state);\n\n args = args.flat().filter(arg => {\n if(typeof arg != \"string\")\n return true;\n\n ID.set(model, arg);\n });\n\n addListener(model, () => {\n if(!PARENT.has(model))\n PARENT.set(model, null);\n\n for(const key in model){\n const desc = Object.getOwnPropertyDescriptor(model, key)!;\n\n if(\"value\" in desc)\n manage(model, key, desc.value, true);\n }\n\n for(const arg of args){\n const use = typeof arg == \"function\"\n ? arg.call(model, model)\n : arg as Model.Assign<Model>;\n\n if(use instanceof Promise)\n use.catch(err => {\n console.error(`Async error in constructor for ${model}:`);\n console.error(err);\n });\n else if(typeof use == \"function\")\n addListener(model, use, null)\n else if(typeof use == \"object\")\n assign(model, use, true);\n }\n\n addListener(model, () => {\n for(const [_, value] of model)\n if(value instanceof Model && PARENT.get(value) === model)\n value.set(null);\n \n Object.freeze(state);\n }, null);\n \n return null;\n });\n}\n\nfunction manage(target: Model, key: string | number, value: any, silent?: boolean){\n const state = STATE.get(target)!;\n \n function get(this: Model){\n return watch(this, key, state[key]);\n }\n\n function set(value: unknown, silent?: boolean){\n update(target, key, value, silent);\n if(value instanceof Model && !PARENT.has(value)){\n PARENT.set(value, target);\n event(value);\n }\n }\n\n define(target, key, { set, get });\n set(value, silent);\n}\n\ntype Proxy<T = any> = (key: string | number, value: T) => T;\n\nconst OBSERVER = new WeakMap<Model, Proxy>();\n\nfunction watch(from: Model, key: string | number, value?: any){\n const access = OBSERVER.get(from);\n return access ? access(key, value) : value;\n}\n\nfunction fetch(subject: Model, property: string, required?: boolean){\n const state = STATE.get(subject)!;\n \n if(property in state || required === false){\n const value = state[property];\n\n if(value !== undefined || !required)\n return value;\n }\n\n const error = new Error(`${subject}.${property} is not yet available.`);\n const promise = new Promise<any>((resolve, reject) => {\n addListener(subject, key => {\n if(key === property){\n resolve(state[key]);\n return null;\n }\n\n if(key === null)\n reject(new Error(`${subject} is destroyed.`));\n });\n });\n\n throw Object.assign(promise, {\n toString: () => String(error),\n name: \"Suspense\",\n message: error.message,\n stack: error.stack\n });\n}\n\n/** Currently accumulating export. Stores real values of placeholder properties such as ref() or child models. */\nlet EXPORT: Map<any, any> | undefined;\n\nfunction snapshot<T extends Model>(model: T): Model.State<T> {\n const values = {} as any;\n let isNotRecursive;\n\n if(!EXPORT){\n isNotRecursive = true;\n EXPORT = new Map([[model, values]]);\n }\n\n for(let [key, value] of model){\n if(EXPORT.has(value))\n value = EXPORT.get(value);\n else if(value && typeof value == \"object\" && \"get\" in value && typeof value.get === \"function\")\n EXPORT.set(value, value = value.get());\n\n values[key] = value;\n }\n\n if(isNotRecursive)\n EXPORT = undefined;\n\n return Object.freeze(values);\n}\n\nfunction update<T>(\n subject: Model,\n key: string | number | symbol,\n value: T,\n arg?: boolean | Model.Setter<T>){\n\n const state = STATE.get(subject)!;\n\n if(Object.isFrozen(state))\n throw new Error(`Tried to update ${String(key)} but ${subject} is destroyed.`);\n\n const previous = state[key] as T;\n\n if(typeof arg == \"function\"){\n const out = arg.call(subject, value, previous);\n\n if(out === false)\n return false;\n\n if(typeof out == \"function\")\n value = out();\n }\n\n if(value === previous && value !== undefined)\n return;\n\n state[key] = value;\n\n if(arg !== true)\n event(subject, key);\n\n return true;\n}\n\n/** Random alphanumberic of length 6; always starts with a letter. */\nfunction uid(){\n return (0.278 + Math.random() * 0.722).toString(36).substring(2, 8).toUpperCase();\n}\n\nexport {\n event,\n fetch,\n METHOD,\n Model,\n PARENT,\n STATE,\n uid,\n update,\n watch\n}","import { addListener } from './control';\nimport { event, Model, PARENT, uid } from './model';\n\nconst LOOKUP = new WeakMap<Model, Context | ((got: Context) => void)[]>();\nconst KEYS = new Map<symbol | Model.Type, symbol>();\n\nfunction key(T: Model.Type | symbol, upstream?: boolean): symbol {\n let K = KEYS.get(T);\n\n if(!K)\n KEYS.set(T, K = Symbol(\n typeof T == \"symbol\" ? \"get \" + T.description : String(T)\n ));\n \n return upstream ? key(K) : K;\n}\n\nfunction keys(from: Model.Type, upstream?: boolean){\n const keys = new Set<symbol>();\n\n do {\n keys.add(key(from, upstream));\n }\n while((from = Object.getPrototypeOf(from)) !== Model);\n\n return keys;\n}\n\ndeclare namespace Context {\n type Multiple<T extends Model> = {\n [key: string | number]: Model.Init<T> | T;\n };\n\n type Accept<T extends Model = Model> = T | Model.Init<T> | Multiple<T>;\n\n type Expect<T extends Model = Model> = (model: T) => (() => void) | void;\n}\n\ninterface Context {\n [key: symbol]: Model | Context.Expect | null | undefined;\n}\n\nclass Context {\n static get<T extends Model>(on: Model, callback: ((got: Context) => void)): void;\n static get<T extends Model>(on: Model): Context | undefined;\n static get({ is }: Model, callback?: (got: Context) => void){\n const waiting = LOOKUP.get(is);\n\n if(waiting instanceof Context){\n if(callback)\n callback(waiting);\n\n return waiting;\n }\n\n if(callback)\n if(waiting) \n waiting.push(callback);\n else \n LOOKUP.set(is, [callback]);\n }\n\n public id!: string;\n\n protected layer = new Map<string | number, Model | Model.Type>();\n protected cleanup = new Set<() => void>();\n\n constructor(inputs?: Context.Accept){\n if(inputs)\n this.include(inputs);\n }\n\n /** Run callback when a specified type is registered to a **child** context. */\n public has<T extends Model>(Type: Model.Type<T>, callback: (model: T) => void){\n Object.defineProperty(this, key(Type, true), { value: callback, configurable: true });\n }\n\n /** Find specified type registered to a parent context. Returns undefined if none are found. */\n public get<T extends Model>(Type: Model.Type<T>, require: true): T;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean): T | undefined;\n public get<T extends Model>(Type: Model.Type<T>, require?: boolean){\n const result = this[key(Type)];\n\n if(result === null)\n throw new Error(`Did find ${Type} in context, but multiple were defined.`);\n\n if(result)\n return result as T;\n\n if(require)\n throw new Error(`Could not find ${Type} in context.`);\n }\n\n public push(inputs?: Context.Accept){\n const next = Object.create(this) as this;\n\n this.cleanup = new Set([() => next.pop(), ...this.cleanup]);\n\n next.layer = new Map();\n next.cleanup = new Set();\n\n if(inputs)\n next.include(inputs);\n\n return next;\n }\n\n public pop(){\n for(const key of Object.getOwnPropertySymbols(this))\n delete (this as any)[key];\n\n this.cleanup.forEach(cb => cb());\n this.cleanup.clear();\n this.layer.clear();\n }\n\n public include<T extends Model>(\n inputs: Context.Accept<T>,\n forEach?: Context.Expect<T>\n ){\n const init = new Map<Model, boolean>();\n\n if(typeof inputs == \"function\" || inputs instanceof Model)\n inputs = { [forEach ? 0 : this.layer.size]: inputs };\n\n Object.entries(inputs).forEach(([K, V]: [string, Model | Model.Init<Model>]) => {\n if(Model.is(V) || V instanceof Model){\n const exists = this.layer.get(K);\n \n if(!exists){\n const instance = this.add(V);\n \n this.layer.set(K, V);\n init.set(instance, true);\n }\n // Context must force-reset because inputs are no longer safe.\n else if(exists !== V){ \n this.pop();\n this.id = uid();\n this.include(inputs);\n }\n\n return;\n }\n\n throw new Error(\n `Context may only include instance or class \\`extends Model\\` but got ${\n K == '0' || K == V ? V : `${V} (as '${K}')`\n }.`\n );\n })\n\n for(const [model, explicit] of init){\n model.set();\n\n if(explicit && forEach)\n forEach(model as T);\n\n for(const [_key, value] of model)\n if(PARENT.get(value as Model) === model){\n this.add(value as Model, true);\n init.set(value as Model, false);\n }\n }\n }\n\n protected add<T extends Model>(\n input: T | Model.Init<T>,\n implicit?: boolean){\n\n const cleanup = new Set<() => void>();\n let T: Model.Type<T>;\n let I: T;\n\n if(typeof input == \"function\"){\n T = input;\n I = new input() as T;\n }\n else {\n T = input.constructor as Model.Type<T>;\n I = input;\n }\n\n keys(T, true).forEach(K => {\n const expects = this[K] as Context.Expect | undefined;\n \n if(!expects)\n return;\n \n addListener(I, event => {\n if(event === true){\n const callback = expects(I);\n \n if(callback)\n cleanup.add(callback);\n }\n\n return null;\n }) \n });\n\n keys(T).forEach(K => {\n const value = this.hasOwnProperty(K) ? null : I;\n\n if(value || this[K] !== I && !implicit)\n Object.defineProperty(this, K, {\n configurable: true,\n value\n });\n });\n\n this.cleanup.add(() => {\n cleanup.forEach(cb => cb());\n\n if(I !== input)\n event(I, null);\n })\n\n const waiting = LOOKUP.get(I);\n \n if(waiting instanceof Array)\n waiting.forEach(cb => cb(this));\n\n LOOKUP.set(I, this);\n\n return I;\n }\n}\n\nexport { Context }","import { fetch, Model, PARENT, STATE, uid, update, watch } from '../model';\n\nconst INSTRUCTION = new Map<symbol, Model.Instruction>();\n\nfunction use <T> (instruction: Model.Instruction<T>): T extends void ? unknown : T;\n\nfunction use <T extends Model> (Type: Model.Init<T>, required: false): T | undefined;\n\nfunction use <T extends Model> (Type: Model.Init<T>, ready?: (i: T) => void): T;\n\nfunction use(\n arg1: Model.Init | Model.Instruction,\n arg2?: ((i: Model) => void) | boolean){\n\n if(Model.is(arg1))\n arg1 = childInstruction(arg1, arg2);\n\n const token = Symbol(\"instruction-\" + uid());\n INSTRUCTION.set(token, arg1);\n return token;\n}\n\nfunction childInstruction(\n type: Model.Init<Model>,\n arg2?: ((i: Model) => void) | boolean\n): Model.Instruction<any, any> {\n return (key, subject) => {\n function set(next: Model | undefined){\n if(next ? !(next instanceof type) : arg2 !== false)\n throw new Error(`${subject}.${key} expected Model of type ${type} but got ${next && next.constructor}.`);\n\n update(subject, key, next);\n\n if(next && typeof arg2 == \"function\")\n arg2(next);\n\n return false;\n }\n\n const value = new type();\n\n set(value);\n PARENT.set(value, subject);\n value.set();\n\n return { set };\n }\n}\n\nfunction init(this: Model){\n const state = STATE.get(this)!;\n\n for(const key in this){\n const { value } = Object.getOwnPropertyDescriptor(this, key)!;\n const instruction = INSTRUCTION.get(value);\n\n if(!instruction)\n continue;\n\n INSTRUCTION.delete(value);\n delete (this as any)[key];\n\n const output = instruction.call(this, key, this, state);\n\n if(!output)\n continue;\n\n const desc = typeof output == \"object\" ? output : { get: output };\n\n if(\"value\" in desc)\n state[key] = desc.value;\n\n const model = this;\n\n Object.defineProperty(model, key, {\n enumerable: desc.enumerable !== false,\n get(this: Model){\n return watch(this, key, \n typeof desc.get == \"function\"\n ? desc.get(this)\n : fetch(model, key, desc.get)\n );\n },\n set(next){\n if(desc.set === false)\n throw new Error(`${model}.${key} is read-only.`);\n\n update(model, key, next, desc.set);\n }\n })\n }\n\n return null;\n}\n\nModel.on(init);\n\nexport { use }","import { Context } from '../context';\nimport { createEffect } from '../control';\nimport { fetch, METHOD, Model, PARENT, event, update } from '../model';\nimport { use } from './use';\n\ntype Type<T extends Model> = Model.Type<T> & typeof Model;\n\nconst STALE = new WeakSet<() => void>();\n\ndeclare namespace get {\n type Compute<T, S = any> = (on: S, key: string) => T;\n\n type Factory<T, S = any> = (this: S, key: string, thisArg: S) => T;\n\n type Source<T extends Model = Model> = (resolve: (x: T) => void) => void;\n\n type Effect<T> = (model: T, key: string) => (() => void) | void;\n}\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param expectParent - If true, will throw if Model is created without a parent.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, expectParent?: true): T;\n\n/**\n * Fetches and assigns the controller which spawned this host.\n * When parent assigns an instance via `use()` directive, it\n * will be made available to child upon this request.\n *\n * @param Type - Type of controller compatible with this class. \n * @param required - If false, property may be undefined. Otherwise will throw suspense.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, required?: false): T | undefined;\n\n/**\n * Implement a computed value from a foreign model. Output will be generated by provided function,\n * where the foreign model will be passed to that function.\n * \n * @param source - Type of Model to fetch for computation.\n * @param compute - Compute function. Will update automatically as input values change.\n */\nfunction get <T extends Model> (Type: Model.Type<T>, effect: get.Effect<T>): T;\n\n/**\n * Implement a computed value; output will be generated by provided function.\n *\n * @param source - Source model from which computed value will be a subscriber.\n * @param compute - Compute function. Bound to a subscriber-proxy of source, returns output value. Will update automatically as input values change.\n */\nfunction get <R, T extends Model> (source: T, compute: get.Compute<R, T>): R;\n\n/**\n * Implement a computed value; output is returned by function from provided factory.\n * \n * Factory is bound to owner of property.\n *\n * @param compute - Factory function to generate a getter to subscribe dependancies.\n */\nfunction get <R, T> (compute: get.Factory<R, T>): R;\n \nfunction get<R, T extends Model>(\n arg0: T | get.Factory<R, T> | Type<T>,\n arg1?: Function | boolean){\n\n return use((key, subject, state) => {\n if(typeof arg0 == \"symbol\")\n throw new Error(`Attempted to use an instruction result (probably use or get) as computed source for ${subject}.${key}. This is not allowed.`)\n\n if(Model.is(arg0)){\n const hasParent = PARENT.get(subject) as T;\n\n // TODO: notify on discovered context \n function assign(value: T) {\n if (typeof arg1 == \"function\")\n value.get(x => (arg1 as Function)(x, key));\n\n update(subject, key, value);\n }\n\n if(!hasParent && arg1 === true)\n throw new Error(`${subject} may only exist as a child of type ${arg0}.`);\n else if(hasParent)\n if(hasParent instanceof arg0){\n assign(hasParent);\n return {}\n }\n else if(arg1 === true)\n throw new Error(`New ${subject} created as child of ${hasParent}, but must be instanceof ${arg0}.`);\n \n Context.get(subject, (context) => {\n const model = context.get(arg0);\n\n if(model)\n assign(model);\n else if(arg1 !== false)\n throw new Error(`Required ${arg0} not found in context for ${subject}.`)\n });\n\n return {\n get: arg1 !== false,\n enumerable: false\n };\n }\n \n let from = subject;\n \n if(arg0 instanceof Model){\n from = arg0;\n }\n else {\n const fn = METHOD.get(arg0) || arg0;\n arg1 = ((p, k) => fn.call(p, k, p)) as get.Effect<T>;\n }\n\n const source: get.Source<T> = resolve => resolve(from);\n const getter = arg1 as get.Compute<R, T>;\n\n let reset: (() => void) | undefined;\n let isAsync: boolean;\n let proxy: any;\n\n function connect(model: Model){\n reset = createEffect(model, current => {\n proxy = current;\n\n if(!(key in state) || STALE.delete(compute))\n compute(!reset);\n\n return (didUpdate) => {\n if(didUpdate){\n STALE.add(compute);\n event(subject, key, true);\n }\n };\n }, false)\n }\n\n function compute(initial?: boolean){\n let next: R | undefined;\n\n try {\n next = getter.call(proxy, proxy, key);\n }\n catch(err){\n console.warn(`An exception was thrown while ${initial ? \"initializing\" : \"refreshing\"} ${subject}.${key}.`)\n\n if(initial)\n throw err;\n\n console.error(err);\n }\n\n update(subject, key, next, !isAsync);\n }\n\n return () => {\n if(!proxy){\n source(connect);\n isAsync = true;\n }\n\n if(STALE.delete(compute))\n compute();\n\n return fetch(subject, key, !proxy) as T;\n }\n })\n}\n\nexport { get };","import { addListener, enter } from '../control';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst { defineProperty, defineProperties } = Object;\n\ndeclare namespace ref {\n type Callback<T> = (argument: T) =>\n ((next: T | null) => void) | Promise<void> | void | boolean;\n\n interface Object<T = any> {\n (next: T | null): void;\n\n /** Current value held by this reference. */\n current: T | null;\n\n /** \n * Subscribe to changes of this reference.\n * \n * @param callback - Callback to invoke with the current value when it changes.\n * @returns Unsubscribe function to stop listening to changes.\n */\n get(callback: (value: T) => void): () => void;\n\n /** Retrieve current value. */\n get(): T | null;\n }\n\n /** Object with references to all managed values of `T`. */\n\n /** Object with references to all managed values of `T`. */\n type Proxy<T extends Model> =\n & { [P in Model.Field<T>]-?: Object<T[P]> }\n & { get(): T };\n\n type CustomProxy<T extends Model, R> =\n & { [P in Model.Field<T>]-?: R }\n & { get(): T };\n}\n\n/**\n * Creates an object with references to all managed values.\n * Each property is a function to set value in state when invoked.\n *\n * *Properties are simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param target - Source model from which to reference values.\n */\nfunction ref <T extends Model> (target: T): ref.Proxy<T>;\n\n/**\n * Creates an object with values based on managed values.\n * Each property will invoke mapper function on first access supply\n * the its return value going forward.\n *\n * @param target - Source model from which to reference values.\n * @param mapper - Function producing the placeholder value for any given property.\n */\nfunction ref <O extends Model, R>\n (target: O, mapper: (key: Model.Field<O>) => R): ref.CustomProxy<O, R>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n */\nfunction ref <T> (callback?: ref.Callback<T>): ref.Object<T>;\n\n/**\n * Creates a ref-compatible property.\n * Will persist value, and updates to this are made part of controller event-stream.\n *\n * *Output is simultaneously a ref-function and ref-object, use as needed.*\n *\n * @param callback - Optional callback to synchronously fire when reference is first set or does update.\n * @param ignoreNull - Default `true`. If `false`, will still callback with `null`.\n */\nfunction ref <T> (callback: ref.Callback<T | null>, ignoreNull: boolean): ref.Object<T>;\n\nfunction ref<T>(\n arg?: ref.Callback<T> | Model,\n arg2?: ((key: string) => any) | boolean){\n\n return use<T>((key, subject, state) => {\n let value = {};\n const method = (key: string) =>\n (callback?: (value: T) => void) => callback\n ? addListener(subject, () => callback(state[key]), key)\n : state[key];\n\n if(arg === subject)\n subject.get(() => {\n for(const key in state)\n if(typeof arg2 == \"function\")\n defineProperty(value, key, {\n configurable: true,\n get(){\n const out = arg2(key);\n defineProperty(value, key, { value: out });\n return out;\n }\n })\n else {\n const get = method(key);\n const set = (value: unknown) => {\n update(subject, key, value)\n };\n\n defineProperties(set, {\n current: { get, set },\n get: { value: get }\n });\n\n defineProperty(value, key, { value: set });\n }\n })\n\n else if(typeof arg == \"object\")\n throw new Error(\"ref instruction does not support object which is not 'this'\");\n\n else {\n let unset: ((next: T) => void) | undefined;\n\n const get = method(key);\n const set = (value?: any) => {\n if(!update(subject, key, value) || !arg)\n return;\n\n if(unset)\n unset = void unset(value);\n \n if(value === null && arg2 !== false)\n return;\n\n const exit = enter();\n const out = arg.call(subject, value);\n const flush = exit();\n\n unset = key => {\n if(typeof out == \"function\")\n out(key);\n\n flush();\n }\n };\n \n state[key] = null;\n value = defineProperties(set, {\n current: { get, set },\n get: { value: get }\n }) as ref.Object<T>;\n }\n\n defineProperty(subject, key, { value });\n })\n}\n\nexport { ref }","import { addListener, enter } from '../control';\nimport { Model, event, update } from '../model';\nimport { use } from './use';\n\ndeclare namespace set {\n type Callback<T, S = any> = (this: S, next: T, previous: T) =>\n ((next: T) => void) | Promise<any> | void | boolean;\n\n type Factory<T, S = any> = (this: S, key: string) => Promise<T> | T;\n}\n\n/**\n * Set property as `undefined` but required.\n * \n * Property cannot be accessed until it is defined. If accessed while undefined, a hybrid\n * `Promise`/`Error` (aka: [Suspense](https://reactjs.org/docs/concurrent-mode-suspense.html)) will be thrown.\n */\nfunction set <T = any>(): T;\n\n/**\n * Set property with a factory function.\n * \n * **Note** Factory is lazy! It will only run if/when property is accessed.\n * Value will be undefined until factory resolves, which will also dispatch an update for the property.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required: false): T | undefined;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param required - If true run factory immediately on creation, otherwise on access.\n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, required?: boolean): T;\n\n/**\n * Set property with a factory function.\n *\n * If async, property cannot be accessed until resolves, yeilding a result.\n * If accessed while still processing, React Suspense will be thrown.\n *\n * @param factory - Callback run to derrive property value.\n * @param onUpdate - Callback run when property is finished computing or is set. \n */\nfunction set <T> (factory: set.Factory<T> | Promise<T>, onUpdate?: set.Callback<T>): T;\n\n/**\n * Set a property with empty placeholder and/or update callback.\n * \n * @param value - Starting value for property. If undefined, suspense will be thrown on access, until value is set and accepted by callback.\n * @param onUpdate - Callback run when property is set. If returns false, update is not accepted and property will keep previous value.\n */\nfunction set <T> (value: T | undefined, onUpdate?: set.Callback<T>): T;\n\nfunction set <T> (\n value?: set.Factory<T> | Promise<T> | T,\n argument?: set.Callback<any> | boolean){\n\n return use<T>((key, subject) => {\n const property: Model.Descriptor = { enumerable: false };\n\n if(typeof value == \"function\" || value instanceof Promise){\n function init(){\n if(typeof value == \"function\")\n try {\n value = attempt(value.bind(subject, key));\n }\n catch(err){\n console.warn(`Generating initial value for ${subject}.${key} failed.`);\n throw err;\n }\n\n property.get = argument !== false;\n\n const set = (value: any) => subject[key] = value;\n\n if(value instanceof Promise)\n value.then(set, error => {\n event(subject, key);\n property.get = () => { throw error };\n })\n else\n set(value);\n\n if(argument)\n return null;\n \n return subject[key];\n }\n\n if(argument)\n addListener(subject, init, true);\n else\n property.get = init;\n }\n else if(value !== undefined)\n property.value = value;\n\n if(typeof argument == \"function\"){\n let unset: ((next: T) => void) | undefined;\n\n property.set = function(this: any, value: any, previous: any){\n const exit = enter();\n const returns = argument.call(this, value, previous);\n const flush = exit();\n\n if(returns === false)\n return false;\n\n if(typeof unset == \"function\")\n unset(value);\n\n unset = (next: T) => {\n if(typeof returns == \"function\")\n returns(next);\n\n flush();\n }\n }\n }\n else\n property.set = value => {\n property.get = undefined;\n update(subject, key, value);\n }\n\n return property;\n })\n}\n\nfunction attempt(fn: () => any): any {\n function retry(err: unknown){\n if(err instanceof Promise)\n return err.then(compute);\n else\n throw err;\n }\n\n function compute(): any {\n try {\n const output = fn();\n\n return output instanceof Promise\n ? output.catch(retry)\n : output;\n }\n catch(err){\n return retry(err);\n }\n }\n\n return compute();\n}\n\nexport { set }","import { enter } from '../control';\nimport { Context } from '../context';\nimport { Model, update } from '../model';\nimport { use } from './use';\n\nconst APPLY = new WeakMap<Model, (model: Model) => (() => void) | boolean | void>();\n\ndeclare namespace has {\n type Callback<T = any> = (model: T, recipient: Model) => void | boolean | (() => void);\n}\n\nfunction has <T extends Model> (type: Model.Type<T>, callback?: has.Callback<T>): readonly T[];\nfunction has (callback?: has.Callback): readonly Model[];\n \nfunction has <T extends Model> (\n arg1?: Model.Type<T> | has.Callback<Model>,\n arg2?: has.Callback<T>){\n\n return use<T[]>((key, subject) => {\n const applied = new Set<Model>();\n const reset = () => {\n update(subject, key, Object.freeze(Array.from(applied)));\n }\n\n if(Model.is(arg1))\n Context.get(subject, ctx => {\n ctx.has(arg1, model => {\n let remove: (() => void) | undefined;\n let disconnect: (() => void) | undefined;\n let flush: (() => void) | undefined;\n \n if(applied.has(model))\n return;\n \n const exit = enter();\n\n try {\n const notify = APPLY.get(model);\n\n if(notify){\n const after = notify(subject);\n \n if(after === false)\n return;\n \n if(typeof after == \"function\")\n disconnect = after;\n }\n \n if(typeof arg2 == \"function\"){\n const done = arg2(model, subject);\n \n if(done === false)\n return false;\n\n if(typeof done == \"function\")\n remove = done;\n }\n }\n finally {\n flush = exit();\n }\n \n applied.add(model);\n reset();\n \n const done = () => { \n flush();\n ignore();\n \n applied.delete(model);\n reset();\n \n if(disconnect)\n disconnect();\n \n if(typeof remove == \"function\")\n remove();\n\n remove = undefined;\n }\n \n const ignore = model.set(done, null);\n \n return done;\n })\n });\n else {\n if(APPLY.has(subject))\n throw new Error(`'has' callback can only be used once per model.`);\n\n APPLY.set(subject, recipient => {\n let remove: (() => void) | boolean | void;\n\n if(arg1){\n remove = arg1(recipient, subject);\n \n if(remove === false)\n return false;\n }\n\n applied.add(recipient);\n reset();\n\n return () => {\n applied.delete(recipient);\n reset();\n\n if(typeof remove == \"function\")\n remove();\n }\n });\n }\n\n return { value: [] };\n })\n}\n\nexport { has }"],"mappings":"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","names":["key","event","watch","key","update","res","set","keys","bind","use","get","value","silent","keys","require","key","init","event","key","set","init","key","assign","key","get","set","value","key","init","set","value","key","done"]}
|
package/package.json
CHANGED