@fireflysemantics/slice 15.0.19 → 15.0.24

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.
Files changed (29) hide show
  1. package/esm2020/lib/AbstractStore.mjs +296 -0
  2. package/{esm2015/lib/EStore.js → esm2020/lib/EStore.mjs} +10 -10
  3. package/esm2020/lib/Slice.mjs +222 -0
  4. package/esm2020/lib/utilities.mjs +226 -0
  5. package/{esm2015/public-api.js → esm2020/public-api.mjs} +1 -1
  6. package/fesm2015/{fireflysemantics-slice.js → fireflysemantics-slice.mjs} +20 -20
  7. package/fesm2015/fireflysemantics-slice.mjs.map +1 -0
  8. package/fesm2020/fireflysemantics-slice.mjs +1494 -0
  9. package/fesm2020/fireflysemantics-slice.mjs.map +1 -0
  10. package/lib/models/Predicate.d.ts +1 -1
  11. package/lib/models/scrollPosition.d.ts +1 -1
  12. package/package.json +22 -9
  13. package/bundles/fireflysemantics-slice.umd.js +0 -1905
  14. package/bundles/fireflysemantics-slice.umd.js.map +0 -1
  15. package/esm2015/lib/AbstractStore.js +0 -296
  16. package/esm2015/lib/Slice.js +0 -222
  17. package/esm2015/lib/utilities.js +0 -226
  18. package/fesm2015/fireflysemantics-slice.js.map +0 -1
  19. /package/{esm2015/fireflysemantics-slice.js → esm2020/fireflysemantics-slice.mjs} +0 -0
  20. /package/{esm2015/lib/OStore.js → esm2020/lib/OStore.mjs} +0 -0
  21. /package/{esm2015/lib/models/ActionTypes.js → esm2020/lib/models/ActionTypes.mjs} +0 -0
  22. /package/{esm2015/lib/models/Delta.js → esm2020/lib/models/Delta.mjs} +0 -0
  23. /package/{esm2015/lib/models/Entity.js → esm2020/lib/models/Entity.mjs} +0 -0
  24. /package/{esm2015/lib/models/Predicate.js → esm2020/lib/models/Predicate.mjs} +0 -0
  25. /package/{esm2015/lib/models/StoreConfig.js → esm2020/lib/models/StoreConfig.mjs} +0 -0
  26. /package/{esm2015/lib/models/constants.js → esm2020/lib/models/constants.mjs} +0 -0
  27. /package/{esm2015/lib/models/index.js → esm2020/lib/models/index.mjs} +0 -0
  28. /package/{esm2015/lib/models/scrollPosition.js → esm2020/lib/models/scrollPosition.mjs} +0 -0
  29. /package/{fireflysemantics-slice.d.ts → index.d.ts} +0 -0
@@ -0,0 +1,222 @@
1
+ import { AbstractStore } from "./AbstractStore";
2
+ const { isArray } = Array;
3
+ export class Slice extends AbstractStore {
4
+ /**
5
+ * perform initial notification to all observers,
6
+ * such that operations like {@link combineLatest}{}
7
+ * will execute at least once.
8
+ *
9
+ * @param label The slice label
10
+ * @param predicate The slice predicate
11
+ * @param eStore The EStore instance containing the elements considered for slicing
12
+ *
13
+ * @example
14
+ <pre>
15
+ //Empty slice
16
+ new Slice<Todo>(Todo.COMPLETE, todo=>!todo.complete);
17
+
18
+ //Initialized slice
19
+ let todos = [new Todo(false, "You complete me!"),
20
+ new Todo(true, "You completed me!")];
21
+ new Slice<Todo>(Todo.COMPLETE, todo=>!todo.complete, todos);
22
+ </pre>
23
+ */
24
+ constructor(label, predicate, eStore) {
25
+ super();
26
+ this.label = label;
27
+ this.predicate = predicate;
28
+ this.eStore = eStore;
29
+ /* The slice element entries */
30
+ this.entries = new Map();
31
+ const entities = eStore.allSnapshot();
32
+ this.config = eStore.config;
33
+ let passed = this.test(predicate, entities);
34
+ const delta = { type: "Initialize" /* ActionTypes.INTIALIZE */, entries: passed };
35
+ this.post(passed);
36
+ this.notifyDelta.next(delta);
37
+ }
38
+ /**
39
+ * Add the element if it satisfies the predicate
40
+ * and notify subscribers that an element was added.
41
+ *
42
+ * @param e The element to be considered for slicing
43
+ */
44
+ post(e) {
45
+ if (isArray(e)) {
46
+ this.postA(e);
47
+ }
48
+ else {
49
+ if (this.predicate(e)) {
50
+ const id = e[this.config.guidKey];
51
+ this.entries.set(id, e);
52
+ const delta = { type: "Post" /* ActionTypes.POST */, entries: [e] };
53
+ this.notifyAll([...Array.from(this.entries.values())], delta);
54
+ }
55
+ }
56
+ }
57
+ /**
58
+ * Add the elements if they satisfy the predicate
59
+ * and notify subscribers that elements were added.
60
+ *
61
+ * @param e The element to be considered for slicing
62
+ */
63
+ postN(...e) {
64
+ this.postA(e);
65
+ }
66
+ /**
67
+ * Add the elements if they satisfy the predicate
68
+ * and notify subscribers that elements were added.
69
+ *
70
+ * @param e The element to be considered for slicing
71
+ */
72
+ postA(e) {
73
+ const d = [];
74
+ e.forEach(e => {
75
+ if (this.predicate(e)) {
76
+ const id = e[this.config.guidKey];
77
+ this.entries.set(id, e);
78
+ d.push(e);
79
+ }
80
+ });
81
+ const delta = { type: "Post" /* ActionTypes.POST */, entries: d };
82
+ this.notifyAll([...Array.from(this.entries.values())], delta);
83
+ }
84
+ /**
85
+ * Delete an element from the slice.
86
+ *
87
+ * @param e The element to be deleted if it satisfies the predicate
88
+ */
89
+ delete(e) {
90
+ if (isArray(e)) {
91
+ this.deleteA(e);
92
+ }
93
+ else {
94
+ if (this.predicate(e)) {
95
+ const id = e[this.config.guidKey];
96
+ this.entries.delete(id);
97
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
98
+ this.notifyAll(Array.from(this.entries.values()), delta);
99
+ }
100
+ }
101
+ }
102
+ /**
103
+ * @param e The elements to be deleted if it satisfies the predicate
104
+ */
105
+ deleteN(...e) {
106
+ this.deleteA(e);
107
+ }
108
+ /**
109
+ * @param e The elements to be deleted if they satisfy the predicate
110
+ */
111
+ deleteA(e) {
112
+ const d = [];
113
+ e.forEach(e => {
114
+ if (this.predicate(e)) {
115
+ const id = e[this.config.guidKey];
116
+ d.push(this.entries.get(id));
117
+ this.entries.delete(id);
118
+ }
119
+ });
120
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
121
+ this.notifyAll([...Array.from(this.entries.values())], delta);
122
+ }
123
+ /**
124
+ * Update the slice when an Entity instance mutates.
125
+ *
126
+ * @param e The element to be added or deleted depending on predicate reevaluation
127
+ */
128
+ put(e) {
129
+ if (isArray(e)) {
130
+ this.putA(e);
131
+ }
132
+ else {
133
+ const id = e[this.config.guidKey];
134
+ if (this.entries.get(id)) {
135
+ if (!this.predicate(e)) {
136
+ //Note that this is a ActionTypes.DELETE because we are removing the
137
+ //entity from the slice.
138
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: [e] };
139
+ this.entries.delete(id);
140
+ this.notifyAll([...Array.from(this.entries.values())], delta);
141
+ }
142
+ }
143
+ else if (this.predicate(e)) {
144
+ this.entries.set(id, e);
145
+ const delta = { type: "Put" /* ActionTypes.PUT */, entries: [e] };
146
+ this.notifyAll([...Array.from(this.entries.values())], delta);
147
+ }
148
+ }
149
+ }
150
+ /**
151
+ * Update the slice with mutated Entity instances.
152
+ *
153
+ * @param e The elements to be deleted if it satisfies the predicate
154
+ */
155
+ putN(...e) {
156
+ this.putA(e);
157
+ }
158
+ /**
159
+ * @param e The elements to be put
160
+ */
161
+ putA(e) {
162
+ const d = []; //instances to delete
163
+ const u = []; //instances to update
164
+ e.forEach(e => {
165
+ const id = e[this.config.guidKey];
166
+ if (this.entries.get(id)) {
167
+ if (!this.predicate(e)) {
168
+ d.push(this.entries.get(id));
169
+ }
170
+ }
171
+ else if (this.predicate(e)) {
172
+ u.push(e);
173
+ }
174
+ });
175
+ if (d.length > 0) {
176
+ d.forEach(e => {
177
+ this.entries.delete(e[this.config.guidKey]);
178
+ });
179
+ const delta = { type: "Delete" /* ActionTypes.DELETE */, entries: d };
180
+ this.notifyAll([...Array.from(this.entries.values())], delta);
181
+ }
182
+ if (u.length > 0) {
183
+ u.forEach(e => {
184
+ this.entries.set(e[this.config.guidKey], e);
185
+ });
186
+ const delta = { type: "Put" /* ActionTypes.PUT */, entries: u };
187
+ this.notifyAll([...Array.from(this.entries.values())], delta);
188
+ }
189
+ }
190
+ /**
191
+ * Resets the slice to empty.
192
+ */
193
+ reset() {
194
+ let delta = {
195
+ type: "Reset" /* ActionTypes.RESET */,
196
+ entries: [...Array.from(this.entries.values())]
197
+ };
198
+ this.notifyAll([], delta);
199
+ this.entries = new Map();
200
+ }
201
+ /**
202
+ * Utility method that applies the predicate to an array
203
+ * of entities and return the ones that pass the test.
204
+ *
205
+ * Used to create an initial set of values
206
+ * that should be part of the `Slice`.
207
+ *
208
+ * @param p
209
+ * @param e
210
+ * @return The the array of entities that pass the predicate test.
211
+ */
212
+ test(p, e) {
213
+ let v = [];
214
+ e.forEach((e) => {
215
+ if (p(e)) {
216
+ v.push(e);
217
+ }
218
+ });
219
+ return v;
220
+ }
221
+ }
222
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zbGljZS9zcmMvbGliL1NsaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUcvQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxDQUFBO0FBRXpCLE1BQU0sT0FBTyxLQUFTLFNBQVEsYUFBZ0I7SUFNMUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxZQUNXLEtBQWEsRUFDYixTQUF1QixFQUN2QixNQUFpQjtRQUN4QixLQUFLLEVBQUUsQ0FBQztRQUhELFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixjQUFTLEdBQVQsU0FBUyxDQUFjO1FBQ3ZCLFdBQU0sR0FBTixNQUFNLENBQVc7UUExQjVCLCtCQUErQjtRQUNmLFlBQU8sR0FBbUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQTJCaEQsTUFBTSxRQUFRLEdBQVEsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQzFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQTtRQUMzQixJQUFJLE1BQU0sR0FBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNqRCxNQUFNLEtBQUssR0FBYSxFQUFFLElBQUksMENBQXVCLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ3pFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDaEMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsSUFBSSxDQUFDLENBQVU7UUFDWCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FD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YTtZQUNsQixJQUFJLGlDQUFtQjtZQUN2QixPQUFPLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQ2xELENBQUM7UUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7Ozs7Ozs7O09BVUc7SUFDSSxJQUFJLENBQUMsQ0FBZSxFQUFFLENBQU07UUFDL0IsSUFBSSxDQUFDLEdBQVEsRUFBRSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFJLEVBQUUsRUFBRTtZQUNmLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNOLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDYjtRQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWx0YSwgQWN0aW9uVHlwZXMsIFByZWRpY2F0ZSB9IGZyb20gXCIuL21vZGVsc1wiXG5pbXBvcnQgeyBBYnN0cmFjdFN0b3JlIH0gZnJvbSBcIi4vQWJzdHJhY3RTdG9yZVwiXG5pbXBvcnQgeyBFU3RvcmUgfSBmcm9tIFwiLi9FU3RvcmVcIjtcblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheVxuXG5leHBvcnQgY2xhc3MgU2xpY2U8RT4gZXh0ZW5kcyBBYnN0cmFjdFN0b3JlPEU+IHtcblxuXG4gICAgLyogVGhlIHNsaWNlIGVsZW1lbnQgZW50cmllcyAqL1xuICAgIHB1YmxpYyBvdmVycmlkZSBlbnRyaWVzOiBNYXA8c3RyaW5nLCBFPiA9IG5ldyBNYXAoKTtcblxuICAgIC8qKlxuICAgICAqIHBlcmZvcm0gaW5pdGlhbCBub3RpZmljYXRpb24gdG8gYWxsIG9ic2VydmVycyxcbiAgICAgKiBzdWNoIHRoYXQgb3BlcmF0aW9ucyBsaWtlIHtAbGluayBjb21iaW5lTGF0ZXN0fXt9XG4gICAgICogd2lsbCBleGVjdXRlIGF0IGxlYXN0IG9uY2UuXG4gICAgICogXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBzbGljZSBsYWJlbFxuICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgVGhlIHNsaWNlIHByZWRpY2F0ZVxuICAgICAqIEBwYXJhbSBlU3RvcmUgVGhlIEVTdG9yZSBpbnN0YW5jZSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBjb25zaWRlcmVkIGZvciBzbGljaW5nXG4gICAgICogXG4gICAgICogQGV4YW1wbGUgXG4gICAgICAgPHByZT5cbiAgICAgICAvL0VtcHR5IHNsaWNlXG4gICAgICAgbmV3IFNsaWNlPFRvZG8+KFRvZG8uQ09NUExFVEUsIHRvZG89PiF0b2RvLmNvbXBsZXRlKTtcbiAgXG4gICAgICAgLy9Jbml0aWFsaXplZCBzbGljZVxuICAgICAgIGxldCB0b2RvcyA9IFtuZXcgVG9kbyhmYWxzZSwgXCJZb3UgY29tcGxldGUgbWUhXCIpLCBcbiAgICAgICAgICAgICAgICAgICAgbmV3IFRvZG8odHJ1ZSwgXCJZb3UgY29tcGxldGVkIG1lIVwiKV07XG4gICAgICAgbmV3IFNsaWNlPFRvZG8+KFRvZG8uQ09NUExFVEUsIHRvZG89PiF0b2RvLmNvbXBsZXRlLCB0b2Rvcyk7XG4gICAgICAgPC9wcmU+XG4gICAgICovXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyBsYWJlbDogc3RyaW5nLFxuICAgICAgICBwdWJsaWMgcHJlZGljYXRlOiBQcmVkaWNhdGU8RT4sXG4gICAgICAgIHB1YmxpYyBlU3RvcmU6IEVTdG9yZTxFPikge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICBjb25zdCBlbnRpdGllczogRVtdID0gZVN0b3JlLmFsbFNuYXBzaG90KClcbiAgICAgICAgdGhpcy5jb25maWcgPSBlU3RvcmUuY29uZmlnXG4gICAgICAgIGxldCBwYXNzZWQ6IEVbXSA9IHRoaXMudGVzdChwcmVkaWNhdGUsIGVudGl0aWVzKTtcbiAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5JTlRJQUxJWkUsIGVudHJpZXM6IHBhc3NlZCB9O1xuICAgICAgICB0aGlzLnBvc3QocGFzc2VkKTtcbiAgICAgICAgdGhpcy5ub3RpZnlEZWx0YS5uZXh0KGRlbHRhKVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZWxlbWVudCBpZiBpdCBzYXRpc2ZpZXMgdGhlIHByZWRpY2F0ZVxuICAgICAqIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBhbiBlbGVtZW50IHdhcyBhZGRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHNsaWNpbmdcbiAgICAgKi9cbiAgICBwb3N0KGU6IEUgfCBFW10pIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoZSkpIHtcbiAgICAgICAgICAgIHRoaXMucG9zdEEoZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChpZCwgZSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBbZV0gfTtcbiAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQWRkIHRoZSBlbGVtZW50cyBpZiB0aGV5IHNhdGlzZnkgdGhlIHByZWRpY2F0ZVxuICAgICAqIGFuZCBub3RpZnkgc3Vic2NyaWJlcnMgdGhhdCBlbGVtZW50cyB3ZXJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgY29uc2lkZXJlZCBmb3Igc2xpY2luZ1xuICAgICAqL1xuICAgIHBvc3ROKC4uLmU6IEVbXSkge1xuICAgICAgICB0aGlzLnBvc3RBKGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFkZCB0aGUgZWxlbWVudHMgaWYgdGhleSBzYXRpc2Z5IHRoZSBwcmVkaWNhdGVcbiAgICAgKiBhbmQgbm90aWZ5IHN1YnNjcmliZXJzIHRoYXQgZWxlbWVudHMgd2VyZSBhZGRlZC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50IHRvIGJlIGNvbnNpZGVyZWQgZm9yIHNsaWNpbmdcbiAgICAgKi9cbiAgICBwb3N0QShlOiBFW10pIHtcbiAgICAgICAgY29uc3QgZDogRVtdID0gW107XG4gICAgICAgIGUuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLnNldChpZCwgZSk7XG4gICAgICAgICAgICAgICAgZC5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QT1NULCBlbnRyaWVzOiBkIH07XG4gICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRGVsZXRlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2xpY2UuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gZSBUaGUgZWxlbWVudCB0byBiZSBkZWxldGVkIGlmIGl0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlKGU6IEUgfCBFW10pIHtcbiAgICAgICAgaWYgKGlzQXJyYXkoZSkpIHtcbiAgICAgICAgICAgIHRoaXMuZGVsZXRlQShlKVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSAoPGFueT5lKVt0aGlzLmNvbmZpZy5ndWlkS2V5XVxuICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpXG4gICAgICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5ERUxFVEUsIGVudHJpZXM6IFtlXSB9XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpLCBkZWx0YSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIGlmIGl0IHNhdGlzZmllcyB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlTiguLi5lOiBFW10pIHtcbiAgICAgICAgdGhpcy5kZWxldGVBKGUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwYXJhbSBlIFRoZSBlbGVtZW50cyB0byBiZSBkZWxldGVkIGlmIHRoZXkgc2F0aXNmeSB0aGUgcHJlZGljYXRlXG4gICAgICovXG4gICAgZGVsZXRlQShlOiBFW10pIHtcbiAgICAgICAgY29uc3QgZDogRVtdID0gW11cbiAgICAgICAgZS5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSAoPGFueT5lKVt0aGlzLmNvbmZpZy5ndWlkS2V5XVxuICAgICAgICAgICAgICAgIGQucHVzaCh0aGlzLmVudHJpZXMuZ2V0KGlkKSEpXG4gICAgICAgICAgICAgICAgdGhpcy5lbnRyaWVzLmRlbGV0ZShpZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBzbGljZSB3aGVuIGFuIEVudGl0eSBpbnN0YW5jZSBtdXRhdGVzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnQgdG8gYmUgYWRkZWQgb3IgZGVsZXRlZCBkZXBlbmRpbmcgb24gcHJlZGljYXRlIHJlZXZhbHVhdGlvblxuICAgICAqL1xuICAgIHB1dChlOiBFIHwgRVtdKSB7XG4gICAgICAgIGlmIChpc0FycmF5KGUpKSB7XG4gICAgICAgICAgICB0aGlzLnB1dEEoZSlcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV07XG4gICAgICAgICAgICBpZiAodGhpcy5lbnRyaWVzLmdldChpZCkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGF0IHRoaXMgaXMgYSBBY3Rpb25UeXBlcy5ERUxFVEUgYmVjYXVzZSB3ZSBhcmUgcmVtb3ZpbmcgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vZW50aXR5IGZyb20gdGhlIHNsaWNlLlxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLkRFTEVURSwgZW50cmllczogW2VdIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5wcmVkaWNhdGUoZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KGlkLCBlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWx0YTogRGVsdGE8RT4gPSB7IHR5cGU6IEFjdGlvblR5cGVzLlBVVCwgZW50cmllczogW2VdIH07XG4gICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlBbGwoWy4uLkFycmF5LmZyb20odGhpcy5lbnRyaWVzLnZhbHVlcygpKV0sIGRlbHRhKTtcbiAgICAgICAgICAgIH0gICAgXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgdGhlIHNsaWNlIHdpdGggbXV0YXRlZCBFbnRpdHkgaW5zdGFuY2VzLlxuICAgICAqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnRzIHRvIGJlIGRlbGV0ZWQgaWYgaXQgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGVcbiAgICAgKi9cbiAgICBwdXROKC4uLmU6IEVbXSkge1xuICAgICAgICB0aGlzLnB1dEEoZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQHBhcmFtIGUgVGhlIGVsZW1lbnRzIHRvIGJlIHB1dFxuICAgICAqL1xuICAgIHB1dEEoZTogRVtdKSB7XG4gICAgICAgIGNvbnN0IGQ6IEVbXSA9IFtdOyAvL2luc3RhbmNlcyB0byBkZWxldGVcbiAgICAgICAgY29uc3QgdTogRVtdID0gW107IC8vaW5zdGFuY2VzIHRvIHVwZGF0ZVxuICAgICAgICBlLmZvckVhY2goZSA9PiB7XG4gICAgICAgICAgICBjb25zdCBpZCA9ICg8YW55PmUpW3RoaXMuY29uZmlnLmd1aWRLZXldO1xuICAgICAgICAgICAgaWYgKHRoaXMuZW50cmllcy5nZXQoaWQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnByZWRpY2F0ZShlKSkge1xuICAgICAgICAgICAgICAgICAgICBkLnB1c2godGhpcy5lbnRyaWVzLmdldChpZCkhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJlZGljYXRlKGUpKSB7XG4gICAgICAgICAgICAgICAgdS5wdXNoKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKGQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZC5mb3JFYWNoKGUgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5kZWxldGUoKDxhbnk+ZSlbdGhpcy5jb25maWcuZ3VpZEtleV0pXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhOiBEZWx0YTxFPiA9IHsgdHlwZTogQWN0aW9uVHlwZXMuREVMRVRFLCBlbnRyaWVzOiBkIH07XG4gICAgICAgICAgICB0aGlzLm5vdGlmeUFsbChbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXSwgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHUuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmVudHJpZXMuc2V0KCg8YW55PmUpW3RoaXMuY29uZmlnLmd1aWRLZXldLCBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgZGVsdGE6IERlbHRhPEU+ID0geyB0eXBlOiBBY3Rpb25UeXBlcy5QVVQsIGVudHJpZXM6IHUgfTtcbiAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKFsuLi5BcnJheS5mcm9tKHRoaXMuZW50cmllcy52YWx1ZXMoKSldLCBkZWx0YSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXNldHMgdGhlIHNsaWNlIHRvIGVtcHR5LlxuICAgICAqL1xuICAgIHJlc2V0KCkge1xuICAgICAgICBsZXQgZGVsdGE6IERlbHRhPEU+ID0ge1xuICAgICAgICAgICAgdHlwZTogQWN0aW9uVHlwZXMuUkVTRVQsXG4gICAgICAgICAgICBlbnRyaWVzOiBbLi4uQXJyYXkuZnJvbSh0aGlzLmVudHJpZXMudmFsdWVzKCkpXVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm5vdGlmeUFsbChbXSwgZGVsdGEpO1xuICAgICAgICB0aGlzLmVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVXRpbGl0eSBtZXRob2QgdGhhdCBhcHBsaWVzIHRoZSBwcmVkaWNhdGUgdG8gYW4gYXJyYXlcbiAgICAgKiBvZiBlbnRpdGllcyBhbmQgcmV0dXJuIHRoZSBvbmVzIHRoYXQgcGFzcyB0aGUgdGVzdC5cbiAgICAgKlxuICAgICAqIFVzZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgc2V0IG9mIHZhbHVlc1xuICAgICAqIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGBTbGljZWAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcFxuICAgICAqIEBwYXJhbSBlXG4gICAgICogQHJldHVybiBUaGUgdGhlIGFycmF5IG9mIGVudGl0aWVzIHRoYXQgcGFzcyB0aGUgcHJlZGljYXRlIHRlc3QuXG4gICAgICovXG4gICAgcHVibGljIHRlc3QocDogUHJlZGljYXRlPEU+LCBlOiBFW10pOiBFW10ge1xuICAgICAgICBsZXQgdjogRVtdID0gW107XG4gICAgICAgIGUuZm9yRWFjaCgoZTogRSkgPT4ge1xuICAgICAgICAgICAgaWYgKHAoZSkpIHtcbiAgICAgICAgICAgICAgICB2LnB1c2goZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdjtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,226 @@
1
+ import { ESTORE_CONFIG_DEFAULT } from "./AbstractStore";
2
+ import { fromEvent, of } from 'rxjs';
3
+ import { switchMap, pairwise, debounceTime, distinctUntilChanged, map, filter } from 'rxjs/operators';
4
+ import { nanoid } from "nanoid";
5
+ /**
6
+ * Returns all the entities are distinct by the
7
+ * `property` value argument.
8
+ *
9
+ * Note that the implementation uses a `Map<string, E>` to
10
+ * index the entities by key. Therefore the more recent occurences
11
+ * matching a key instance will overwrite the previous ones.
12
+ *
13
+ * @param property The name of the property to check for distinct values by.
14
+ * @param entities The entities in the array.
15
+ *
16
+ * @example
17
+ ```
18
+ let todos: Todo[] = [
19
+ { id: 1, title: "Lets do it!" },
20
+ { id: 1, title: "Lets do it again!" },
21
+ { id: 2, title: "All done!" }
22
+ ];
23
+
24
+ let todos2: Todo[] = [
25
+ { id: 1, title: "Lets do it!" },
26
+ { id: 2, title: "All done!" }
27
+ ];
28
+
29
+ expect(distinct(todos, "id").length).toEqual(2);
30
+ expect(distinct(todos2, "id").length).toEqual(2);
31
+
32
+ ```
33
+ */
34
+ export function distinct(entities, property) {
35
+ const entitiesByProperty = new Map(entities.map(e => [e[property], e]));
36
+ return Array.from(entitiesByProperty.values());
37
+ }
38
+ /**
39
+ * Returns true if all the entities are distinct by the
40
+ * `property` value argument.
41
+ *
42
+ * @param property The name of the property to check for distinct values by.
43
+ * @param entities The entities in the array.
44
+ *
45
+ * @example
46
+ *
47
+ ```
48
+ let todos: Todo[] = [
49
+ { id: 1, title: "Lets do it!" },
50
+ { id: 1, title: "Lets do it again!" },
51
+ { id: 2, title: "All done!" }
52
+ ];
53
+
54
+ let todos2: Todo[] = [
55
+ { id: 1, title: "Lets do it!" },
56
+ { id: 2, title: "All done!" }
57
+ ];
58
+
59
+ expect(unique(todos, "id")).toBeFalsy();
60
+ expect(unique(todos2, "id")).toBeTruthy();
61
+ ```
62
+ */
63
+ export function unique(entities, property) {
64
+ return entities.length == distinct(entities, property).length ? true : false;
65
+ }
66
+ /**
67
+ * Create a global ID
68
+ * @return The global id.
69
+ *
70
+ * @example
71
+ * let e.guid = GUID();
72
+ */
73
+ export function GUID() {
74
+ return nanoid();
75
+ }
76
+ /**
77
+ * Set the global identfication property on the instance.
78
+ *
79
+ * @param e Entity we want to set the global identifier on.
80
+ * @param gid The name of the `gid` property. If not specified it defaults to `ESTORE_CONFIG_DEFAULT.guidKey`.
81
+ */
82
+ export function attachGUID(e, gid) {
83
+ const guidKey = gid ? gid : ESTORE_CONFIG_DEFAULT.guidKey;
84
+ let id = nanoid();
85
+ e[guidKey] = id;
86
+ return id;
87
+ }
88
+ /**
89
+ * Set the global identfication property on the instance.
90
+ *
91
+ * @param e[] Entity array we want to set the global identifiers on.
92
+ * @param gid The name of the `gid` property. If not specified it defaults to `gid`.
93
+ */
94
+ export function attachGUIDs(e, gid) {
95
+ e.forEach(e => {
96
+ attachGUID(e, gid);
97
+ });
98
+ }
99
+ /**
100
+ * Create a shallow copy of the argument.
101
+ * @param o The object to copy
102
+ */
103
+ export function shallowCopy(o) {
104
+ return { ...o };
105
+ }
106
+ /**
107
+ * Create a deep copy of the argument.
108
+ * @param o The object to copy
109
+ */
110
+ export function deepCopy(o) {
111
+ return JSON.parse(JSON.stringify(o));
112
+ }
113
+ /**
114
+ * Gets the current active value from the `active`
115
+ * Map.
116
+ *
117
+ * This is used for the scenario where we are managing
118
+ * a single active instance. For example
119
+ * when selecting a book from a collection of books.
120
+ *
121
+ * The selected `Book` instance becomes the active value.
122
+ *
123
+ * @example
124
+ * const book:Book = getActiveValue(bookStore.active);
125
+ * @param m
126
+ */
127
+ export function getActiveValue(m) {
128
+ if (m.size) {
129
+ return m.entries().next().value[1];
130
+ }
131
+ return null;
132
+ }
133
+ /**
134
+ * The method can be used to exclude keys from an instance
135
+ * of type `E`.
136
+ *
137
+ * We can use this to exclude values when searching an object.
138
+ *
139
+ * @param entity An instance of type E
140
+ * @param exclude The keys to exclude
141
+ *
142
+ * @example
143
+ * todo = { id: '1', description: 'Do it!' }
144
+ * let keys = excludeKeys<Todo>(todo, ['id]);
145
+ * // keys = ['description']
146
+ */
147
+ export function excludeKeys(entity, exclude) {
148
+ const keys = Object.keys(entity);
149
+ return keys.filter((key) => {
150
+ return exclude.indexOf(key) < 0;
151
+ });
152
+ }
153
+ /**
154
+ *
155
+ * @param entities The entity to search
156
+ * @param exclude Keys to exclude from each entity
157
+ *
158
+ * @return E[] Array of entities with properties containing the search term.
159
+ */
160
+ export function search(query = '', entities, exclude = []) {
161
+ const { isArray } = Array;
162
+ query = query.toLowerCase();
163
+ return entities.filter(function (e) {
164
+ //Do the keys calculation on each instance e:E
165
+ //because an instance can have optional parameters,
166
+ //and thus we have to check each instance, not just
167
+ //the first one in the array.
168
+ const keys = excludeKeys(e, exclude);
169
+ return keys.some((key) => {
170
+ const value = e[key];
171
+ if (!value) {
172
+ return false;
173
+ }
174
+ if (isArray(value)) {
175
+ return value.some(v => {
176
+ return String(v).toLowerCase().includes(query);
177
+ });
178
+ }
179
+ else {
180
+ return String(value).toLowerCase().includes(query);
181
+ }
182
+ });
183
+ });
184
+ }
185
+ /**
186
+ * @param scrollable The element being scrolled
187
+ * @param debounceMS The number of milliseconds to debounce scroll events
188
+ * @param sp The function returning the scroll position coordinates.
189
+ * @return A boolean valued observable indicating whether the element is scrolling up or down
190
+ */
191
+ export function scrollingUp(scrollable, debounceMS, sp) {
192
+ return fromEvent(scrollable, 'scroll').pipe(debounceTime(debounceMS), distinctUntilChanged(), map(v => sp()), pairwise(), switchMap(p => {
193
+ const y1 = p[0][1];
194
+ const y2 = p[1][1];
195
+ return y1 - y2 > 0 ? of(false) : of(true);
196
+ }));
197
+ }
198
+ /**
199
+ * Filters the entities properties to the set contained in the
200
+ * `keys` array.
201
+ *
202
+ * @param keys The array of keys that the entity be limited to
203
+ * @param entity The entity to map
204
+ * @return An entity instance that has only the keys provided in the keys array
205
+ */
206
+ export function mapEntity(keys, entity) {
207
+ const result = {};
208
+ keys.forEach(k => {
209
+ result[k] = entity[k];
210
+ });
211
+ return result;
212
+ }
213
+ /**
214
+ * Returns an `Observable<E>` instance that
215
+ * filters for arguments where the property
216
+ * value matches the provided value.
217
+ *
218
+ * @param value The value targeted
219
+ * @param propertyName The name of the property to contain the value
220
+ * @param obs The Slice Object Store Observable
221
+ * @returns Observable<E>
222
+ */
223
+ export function onFilteredEvent(value, propertyName, obs) {
224
+ return obs.pipe(filter((e) => !!(e && e[propertyName] === value)));
225
+ }
226
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbGl0aWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2xpY2Uvc3JjL2xpYi91dGlsaXRpZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFjLFNBQVMsRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUE7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUNyRyxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFBO0FBRzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBdUIsUUFBYSxFQUFFLFFBQVc7SUFDdkUsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ3JGLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FBSSxRQUFhLEVBQUUsUUFBaUI7SUFDeEQsT0FBTyxRQUFRLENBQUMsTUFBTSxJQUFJLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztBQUMvRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLElBQUk7SUFDbEIsT0FB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QUFvQixFQUNwQixHQUFrQjtJQUVsQixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLFlBQVksQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRVNUT1JFX0NPTkZJR19ERUZBVUxUIH0gZnJvbSBcIi4vQWJzdHJhY3RTdG9yZVwiO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbUV2ZW50LCBvZiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHBhaXJ3aXNlLCBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IHsgbmFub2lkfSBmcm9tIFwibmFub2lkXCJcbmltcG9ydCB7IHNjcm9sbFBvc2l0aW9uIH0gZnJvbSBcIi4vbW9kZWxzL3Njcm9sbFBvc2l0aW9uXCI7XG5cbi8qKlxuICogUmV0dXJucyBhbGwgdGhlIGVudGl0aWVzIGFyZSBkaXN0aW5jdCBieSB0aGUgXG4gKiBgcHJvcGVydHlgIHZhbHVlIGFyZ3VtZW50LiAgXG4gKiBcbiAqIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyBhIGBNYXA8c3RyaW5nLCBFPmAgdG9cbiAqIGluZGV4IHRoZSBlbnRpdGllcyBieSBrZXkuICBUaGVyZWZvcmUgdGhlIG1vcmUgcmVjZW50IG9jY3VyZW5jZXMgXG4gKiBtYXRjaGluZyBhIGtleSBpbnN0YW5jZSB3aWxsIG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgb25lcy5cbiAqIFxuICogQHBhcmFtIHByb3BlcnR5IFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzdGluY3QgdmFsdWVzIGJ5LlxuICogQHBhcmFtIGVudGl0aWVzIFRoZSBlbnRpdGllcyBpbiB0aGUgYXJyYXkuXG4gKiBcbiAqIEBleGFtcGxlXG4gYGBgXG4gIGxldCB0b2RvczogVG9kb1tdID0gW1xuICAgIHsgaWQ6IDEsIHRpdGxlOiBcIkxldHMgZG8gaXQhXCIgfSxcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IGFnYWluIVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGxldCB0b2RvczI6IFRvZG9bXSA9IFtcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGV4cGVjdChkaXN0aW5jdCh0b2RvcywgXCJpZFwiKS5sZW5ndGgpLnRvRXF1YWwoMik7XG4gIGV4cGVjdChkaXN0aW5jdCh0b2RvczIsIFwiaWRcIikubGVuZ3RoKS50b0VxdWFsKDIpO1xuXG4gYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0aW5jdDxFLCBLIGV4dGVuZHMga2V5b2YgRT4oZW50aXRpZXM6IEVbXSwgcHJvcGVydHk6IEspOiBFW10ge1xuICBjb25zdCBlbnRpdGllc0J5UHJvcGVydHkgPSBuZXcgTWFwKGVudGl0aWVzLm1hcChlID0+IFtlW3Byb3BlcnR5XSwgZV0gYXMgW0VbS10sIEVdKSk7XG4gIHJldHVybiBBcnJheS5mcm9tKGVudGl0aWVzQnlQcm9wZXJ0eS52YWx1ZXMoKSk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIGFsbCB0aGUgZW50aXRpZXMgYXJlIGRpc3RpbmN0IGJ5IHRoZSBcbiAqIGBwcm9wZXJ0eWAgdmFsdWUgYXJndW1lbnQuXG4gKiBcbiAqIEBwYXJhbSBwcm9wZXJ0eSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY2hlY2sgZm9yIGRpc3RpbmN0IHZhbHVlcyBieS5cbiAqIEBwYXJhbSBlbnRpdGllcyBUaGUgZW50aXRpZXMgaW4gdGhlIGFycmF5LlxuICogXG4gKiBAZXhhbXBsZVxuICogXG4gYGBgXG4gIGxldCB0b2RvczogVG9kb1tdID0gW1xuICAgIHsgaWQ6IDEsIHRpdGxlOiBcIkxldHMgZG8gaXQhXCIgfSxcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IGFnYWluIVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGxldCB0b2RvczI6IFRvZG9bXSA9IFtcbiAgICB7IGlkOiAxLCB0aXRsZTogXCJMZXRzIGRvIGl0IVwiIH0sXG4gICAgeyBpZDogMiwgdGl0bGU6IFwiQWxsIGRvbmUhXCIgfVxuICBdO1xuXG4gIGV4cGVjdCh1bmlxdWUodG9kb3MsIFwiaWRcIikpLnRvQmVGYWxzeSgpO1xuICBleHBlY3QodW5pcXVlKHRvZG9zMiwgXCJpZFwiKSkudG9CZVRydXRoeSgpO1xuIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5pcXVlPEU+KGVudGl0aWVzOiBFW10sIHByb3BlcnR5OiBrZXlvZiBFKTpib29sZWFuIHtcbiAgcmV0dXJuIGVudGl0aWVzLmxlbmd0aCA9PSBkaXN0aW5jdChlbnRpdGllcywgcHJvcGVydHkpLmxlbmd0aCA/IHRydWUgOiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBnbG9iYWwgSURcbiAqIEByZXR1cm4gVGhlIGdsb2JhbCBpZC5cbiAqIFxuICogQGV4YW1wbGVcbiAqIGxldCBlLmd1aWQgPSBHVUlEKCk7XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBHVUlEKCkge1xuICByZXR1cm4gbmFub2lkKCk7XG59XG5cbi8qKlxuICogU2V0IHRoZSBnbG9iYWwgaWRlbnRmaWNhdGlvbiBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2UuXG4gKiBcbiAqIEBwYXJhbSBlIEVudGl0eSB3ZSB3YW50IHRvIHNldCB0aGUgZ2xvYmFsIGlkZW50aWZpZXIgb24uXG4gKiBAcGFyYW0gZ2lkIFRoZSBuYW1lIG9mIHRoZSBgZ2lkYCBwcm9wZXJ0eS4gIElmIG5vdCBzcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8gYEVTVE9SRV9DT05GSUdfREVGQVVMVC5ndWlkS2V5YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGF0dGFjaEdVSUQ8RT4oZTogRSwgZ2lkPzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZ3VpZEtleSA9IGdpZCA/IGdpZCA6IEVTVE9SRV9DT05GSUdfREVGQVVMVC5ndWlkS2V5XG4gIGxldCBpZDogc3RyaW5nID0gbmFub2lkKCk7XG4gICg8YW55PmUpW2d1aWRLZXldID0gaWRcbiAgcmV0dXJuIGlkXG59XG5cbi8qKlxuICogU2V0IHRoZSBnbG9iYWwgaWRlbnRmaWNhdGlvbiBwcm9wZXJ0eSBvbiB0aGUgaW5zdGFuY2UuXG4gKiBcbiAqIEBwYXJhbSBlW10gRW50aXR5IGFycmF5IHdlIHdhbnQgdG8gc2V0IHRoZSBnbG9iYWwgaWRlbnRpZmllcnMgb24uXG4gKiBAcGFyYW0gZ2lkIFRoZSBuYW1lIG9mIHRoZSBgZ2lkYCBwcm9wZXJ0eS4gIElmIG5vdCBzcGVjaWZpZWQgaXQgZGVmYXVsdHMgdG8gYGdpZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhdHRhY2hHVUlEczxFPihlOiBFW10sIGdpZD86IHN0cmluZykge1xuICBlLmZvckVhY2goZSA9PiB7XG4gICAgYXR0YWNoR1VJRChlLCBnaWQpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBzaGFsbG93IGNvcHkgb2YgdGhlIGFyZ3VtZW50LlxuICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBjb3B5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzaGFsbG93Q29weTxFPihvOiBFKSB7XG4gIHJldHVybiB7IC4uLm8gfTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBkZWVwIGNvcHkgb2YgdGhlIGFyZ3VtZW50LlxuICogQHBhcmFtIG8gVGhlIG9iamVjdCB0byBjb3B5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWVwQ29weTxFPihvOiBFKSB7XG4gIHJldHVybiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG8pKTtcbn1cblxuLyoqXG4gKiBHZXRzIHRoZSBjdXJyZW50IGFjdGl2ZSB2YWx1ZSBmcm9tIHRoZSBgYWN0aXZlYFxuICogTWFwLiAgXG4gKiBcbiAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIHNjZW5hcmlvIHdoZXJlIHdlIGFyZSBtYW5hZ2luZ1xuICogYSBzaW5nbGUgYWN0aXZlIGluc3RhbmNlLiAgRm9yIGV4YW1wbGUgXG4gKiB3aGVuIHNlbGVjdGluZyBhIGJvb2sgZnJvbSBhIGNvbGxlY3Rpb24gb2YgYm9va3MuICBcbiAqIFxuICogVGhlIHNlbGVjdGVkIGBCb29rYCBpbnN0YW5jZSBiZWNvbWVzIHRoZSBhY3RpdmUgdmFsdWUuXG4gKiBcbiAqIEBleGFtcGxlXG4gKiBjb25zdCBib29rOkJvb2sgPSBnZXRBY3RpdmVWYWx1ZShib29rU3RvcmUuYWN0aXZlKTtcbiAqIEBwYXJhbSBtIFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWN0aXZlVmFsdWU8RT4obTogTWFwPGFueSwgRT4pIHtcbiAgaWYgKG0uc2l6ZSkge1xuICAgIHJldHVybiBtLmVudHJpZXMoKS5uZXh0KCkudmFsdWVbMV07XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKlxuICogVGhlIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBleGNsdWRlIGtleXMgZnJvbSBhbiBpbnN0YW5jZVxuICogb2YgdHlwZSBgRWAuICBcbiAqIFxuICogV2UgY2FuIHVzZSB0aGlzIHRvIGV4Y2x1ZGUgdmFsdWVzIHdoZW4gc2VhcmNoaW5nIGFuIG9iamVjdC5cbiAqIFxuICogQHBhcmFtIGVudGl0eSBBbiBpbnN0YW5jZSBvZiB0eXBlIEVcbiAqIEBwYXJhbSBleGNsdWRlIFRoZSBrZXlzIHRvIGV4Y2x1ZGVcbiAqIFxuICogQGV4YW1wbGVcbiAqIHRvZG8gPSB7IGlkOiAnMScsIGRlc2NyaXB0aW9uOiAnRG8gaXQhJyB9XG4gKiBsZXQga2V5cyA9IGV4Y2x1ZGVLZXlzPFRvZG8+KHRvZG8sIFsnaWRdKTtcbiAqIC8vIGtleXMgPSBbJ2Rlc2NyaXB0aW9uJ11cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4Y2x1ZGVLZXlzPEU+KGVudGl0eTogYW55LCBleGNsdWRlOiBzdHJpbmdbXSkge1xuICBjb25zdCBrZXlzOiBzdHJpbmdbXSA9IE9iamVjdC5rZXlzKGVudGl0eSk7XG4gIHJldHVybiBrZXlzLmZpbHRlcigoa2V5KSA9PiB7XG4gICAgcmV0dXJuIGV4Y2x1ZGUuaW5kZXhPZihrZXkpIDwgMDtcbiAgfSk7XG59XG5cbi8qKlxuICogXG4gKiBAcGFyYW0gZW50aXRpZXMgVGhlIGVudGl0eSB0byBzZWFyY2hcbiAqIEBwYXJhbSBleGNsdWRlIEtleXMgdG8gZXhjbHVkZSBmcm9tIGVhY2ggZW50aXR5XG4gKiBcbiAqIEByZXR1cm4gRVtdIEFycmF5IG9mIGVudGl0aWVzIHdpdGggcHJvcGVydGllcyBjb250YWluaW5nIHRoZSBzZWFyY2ggdGVybS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaDxFPihxdWVyeTogc3RyaW5nID0gJycsIGVudGl0aWVzOiBFW10sIGV4Y2x1ZGU6IHN0cmluZ1tdID0gW10pOiBFW10ge1xuICBjb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5XG5cbiAgcXVlcnkgPSBxdWVyeS50b0xvd2VyQ2FzZSgpO1xuXG5cbiAgcmV0dXJuIGVudGl0aWVzLmZpbHRlcihmdW5jdGlvbiAoZTogRSkge1xuICAgIC8vRG8gdGhlIGtleXMgY2FsY3VsYXRpb24gb24gZWFjaCBpbnN0YW5jZSBlOkVcbiAgICAvL2JlY2F1c2UgYW4gaW5zdGFuY2UgY2FuIGhhdmUgb3B0aW9uYWwgcGFyYW1ldGVycyxcbiAgICAvL2FuZCB0aHVzIHdlIGhhdmUgdG8gY2hlY2sgZWFjaCBpbnN0YW5jZSwgbm90IGp1c3RcbiAgICAvL3RoZSBmaXJzdCBvbmUgaW4gdGhlIGFycmF5LlxuICAgIGNvbnN0IGtleXMgPSBleGNsdWRlS2V5cyhlLCBleGNsdWRlKVxuICAgIHJldHVybiBrZXlzLnNvbWUoIChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gKGUgYXMgYW55KVtrZXldO1xuICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlLnNvbWUodiA9PiB7XG4gICAgICAgICAgcmV0dXJuIFN0cmluZyh2KS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxdWVyeSk7XG4gICAgICB9XG4gICAgfSlcbiAgfSk7XG59XG5cbi8qKlxuICogQHBhcmFtIHNjcm9sbGFibGUgVGhlIGVsZW1lbnQgYmVpbmcgc2Nyb2xsZWRcbiAqIEBwYXJhbSBkZWJvdW5jZU1TIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlYm91bmNlIHNjcm9sbCBldmVudHNcbiAqIEBwYXJhbSBzcCBUaGUgZnVuY3Rpb24gcmV0dXJuaW5nIHRoZSBzY3JvbGwgcG9zaXRpb24gY29vcmRpbmF0ZXMuXG4gKiBAcmV0dXJuIEEgYm9vbGVhbiB2YWx1ZWQgb2JzZXJ2YWJsZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgc2Nyb2xsaW5nIHVwIG9yIGRvd25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjcm9sbGluZ1VwKFxuICBzY3JvbGxhYmxlOiBhbnksIFxuICBkZWJvdW5jZU1TOiBudW1iZXIsIFxuICBzcDogc2Nyb2xsUG9zaXRpb24pOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgcmV0dXJuIGZyb21FdmVudChzY3JvbGxhYmxlLCAnc2Nyb2xsJykucGlwZShcbiAgICBkZWJvdW5jZVRpbWUoZGVib3VuY2VNUyksIFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIFxuICAgIG1hcCh2ID0+IHNwKCkpLCBcbiAgICBwYWlyd2lzZSgpLCBcbiAgICBzd2l0Y2hNYXAocCA9PiB7XG4gICAgY29uc3QgeTEgPSBwWzBdWzFdXG4gICAgY29uc3QgeTIgPSBwWzFdWzFdXG4gICAgcmV0dXJuIHkxIC0geTIgPiAwID8gb2YoZmFsc2UpIDogb2YodHJ1ZSlcbiAgfSkpXG59XG5cbi8qKlxuICogRmlsdGVycyB0aGUgZW50aXRpZXMgcHJvcGVydGllcyB0byB0aGUgc2V0IGNvbnRhaW5lZCBpbiB0aGUgXG4gKiBga2V5c2AgYXJyYXkuXG4gKiAgXG4gKiBAcGFyYW0ga2V5cyBUaGUgYXJyYXkgb2Yga2V5cyB0aGF0IHRoZSBlbnRpdHkgYmUgbGltaXRlZCB0b1xuICogQHBhcmFtIGVudGl0eSBUaGUgZW50aXR5IHRvIG1hcFxuICogQHJldHVybiBBbiBlbnRpdHkgaW5zdGFuY2UgdGhhdCBoYXMgb25seSB0aGUga2V5cyBwcm92aWRlZCBpbiB0aGUga2V5cyBhcnJheSBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcEVudGl0eShrZXlzOnN0cmluZ1tdLCBlbnRpdHk6YW55KSB7XG4gIGNvbnN0IHJlc3VsdDphbnkgPSB7fVxuICBrZXlzLmZvckVhY2goaz0+e1xuICAgIHJlc3VsdFtrXSA9IGVudGl0eVtrXVxuICB9KVxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8qKlxuICogUmV0dXJucyBhbiBgT2JzZXJ2YWJsZTxFPmAgaW5zdGFuY2UgdGhhdCBcbiAqIGZpbHRlcnMgZm9yIGFyZ3VtZW50cyB3aGVyZSB0aGUgcHJvcGVydHkgXG4gKiB2YWx1ZSBtYXRjaGVzIHRoZSBwcm92aWRlZCB2YWx1ZS5cbiAqIFxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0YXJnZXRlZFxuICogQHBhcmFtIHByb3BlcnR5TmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gY29udGFpbiB0aGUgdmFsdWVcbiAqIEBwYXJhbSBvYnMgVGhlIFNsaWNlIE9iamVjdCBTdG9yZSBPYnNlcnZhYmxlXG4gKiBAcmV0dXJucyBPYnNlcnZhYmxlPEU+XG4gKi9cbiBleHBvcnQgZnVuY3Rpb24gb25GaWx0ZXJlZEV2ZW50PEU+KFxuICB2YWx1ZTogYW55LFxuICBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgb2JzOiBPYnNlcnZhYmxlPEU+XG4pOiBPYnNlcnZhYmxlPEU+IHtcbiAgcmV0dXJuIG9icy5waXBlKGZpbHRlcigoZTphbnkpID0+ICEhKGUgJiYgZVtwcm9wZXJ0eU5hbWVdID09PSB2YWx1ZSkpKTtcbn0iXX0=
@@ -7,4 +7,4 @@ export * from './lib/EStore';
7
7
  export * from './lib/OStore';
8
8
  export * from './lib/Slice';
9
9
  export * from './lib/utilities';
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQTtBQUNuQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBzbGljZVxuICovXG5leHBvcnQgKiBmcm9tICcuL2xpYi9tb2RlbHMvJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvQWJzdHJhY3RTdG9yZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL0VTdG9yZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL09TdG9yZSdcbmV4cG9ydCAqIGZyb20gJy4vbGliL1NsaWNlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvdXRpbGl0aWVzJ1xuIl19
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL3NsaWNlL3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxlQUFlLENBQUE7QUFDN0IsY0FBYyxxQkFBcUIsQ0FBQTtBQUNuQyxjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGNBQWMsQ0FBQTtBQUM1QixjQUFjLGFBQWEsQ0FBQTtBQUMzQixjQUFjLGlCQUFpQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBzbGljZVxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL21vZGVscy8nXG5leHBvcnQgKiBmcm9tICcuL2xpYi9BYnN0cmFjdFN0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvRVN0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvT1N0b3JlJ1xuZXhwb3J0ICogZnJvbSAnLi9saWIvU2xpY2UnXG5leHBvcnQgKiBmcm9tICcuL2xpYi91dGlsaXRpZXMnXG4iXX0=