@ngutil/data 0.0.81 → 0.0.83

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,121 +0,0 @@
1
- import { DataSource as CdkDataSource } from "@angular/cdk/collections";
2
- import { BehaviorSubject, catchError, combineLatest, distinctUntilChanged, filter, map, merge, Observable, of, ReplaySubject, shareReplay, Subject, switchMap, take, takeUntil, tap, timer } from "rxjs";
3
- import { isEqual } from "lodash-es";
4
- import { deepClone, deepFreeze, isFalsy } from "@ngutil/common";
5
- import { querySubject } from "../query";
6
- import { MemoryStore } from "../store";
7
- const DEBOUNCE_TIME = 50;
8
- export class DataSource extends CdkDataSource {
9
- #slice;
10
- #reload;
11
- #query;
12
- constructor(provider, store = new MemoryStore(), query$ = querySubject("normal", "forced")) {
13
- super();
14
- this.provider = provider;
15
- this.store = store;
16
- this.query$ = query$;
17
- this.isBusy$ = new BehaviorSubject(false);
18
- this.total$ = new BehaviorSubject(undefined);
19
- this.#slice = new ReplaySubject(1);
20
- this.slice$ = this.#slice.pipe(switchMap(slice => this.provider.clampSlice(slice)), distinctUntilChanged(isEqual), map(slice => deepFreeze(deepClone(slice))), shareReplay({ bufferSize: 1, refCount: true }));
21
- this.#reload = new BehaviorSubject(undefined);
22
- this.#query = combineLatest({
23
- query: this.query$,
24
- reload: merge(this.#reload, this.provider.changed$)
25
- }).pipe(
26
- // tap(() => this.#setBusy(true)),
27
- // TODO: maybe silent reset or prevent items$ chenges
28
- // TODO: alternative solution use cacheId, and query item from store with this cacheId
29
- switchMap(({ query }) => this.store.clear().pipe(map(() => query))), switchMap(query => this.slice$.pipe(map(slice => {
30
- // this.#setBusy(true)
31
- return { ...query, slice };
32
- }))), shareReplay({ bufferSize: 1, refCount: true }));
33
- this.items$ = this.#query.pipe(switchMap(v => (this.provider.isAsync ? timer(DEBOUNCE_TIME).pipe(map(() => v)) : of(v))), switchMap(query => this.store.hasSlice(query.slice).pipe(take(1), switchMap(hasSlice => {
34
- if (hasSlice) {
35
- return this.store.getSlice(query.slice).pipe(take(1));
36
- }
37
- else {
38
- this.#setBusy(true);
39
- return this.provider.queryList(query).pipe(take(1), catchError(() => {
40
- this.#setBusy(false);
41
- return of({ items: [], total: undefined });
42
- }), tap(() => this.#setBusy(false)), switchMap(result => {
43
- if (result.total != null) {
44
- this.total$.next(result.total);
45
- }
46
- return this.store.insertSlice(query.slice, result.items);
47
- }), take(1));
48
- }
49
- }))), shareReplay({ bufferSize: 1, refCount: true }));
50
- this.isEmpty$ = combineLatest({ busy: this.isBusy$, items: this.items$ }).pipe(filter(({ busy }) => !busy), map(({ items }) => items.every(isFalsy)), shareReplay({ bufferSize: 1, refCount: true }));
51
- this.#cvSubs = new Map();
52
- }
53
- setSlice(slice) {
54
- this.#slice.next(slice);
55
- return this;
56
- }
57
- all() {
58
- return this.setSlice({ start: 0, end: Infinity });
59
- }
60
- reload() {
61
- this.#reload.next();
62
- }
63
- getItem(ref) {
64
- const refn = this.provider.meta.normalizeRef(ref);
65
- return this.store.get(refn).pipe(take(1), switchMap(result => {
66
- if (result == null) {
67
- return this.provider.queryItem(refn).pipe(take(1));
68
- }
69
- return of(result);
70
- }));
71
- }
72
- watchItem(ref) {
73
- const refn = this.provider.meta.normalizeRef(ref);
74
- return this.#storeFirst(query => this.store.get(refn), query => this.provider.queryItem(refn, query));
75
- }
76
- getItemPosition(ref) {
77
- return this.watchItemPosition(ref).pipe(take(1));
78
- }
79
- watchItemPosition(ref) {
80
- const refn = this.provider.meta.normalizeRef(ref);
81
- return this.#storeFirst(query => this.store.indexOf(refn).pipe(map(i => (i < 0 ? undefined : i))), query => this.provider.queryPosition(refn, query));
82
- }
83
- realodItem(ref, insertPosition) {
84
- const refn = this.provider.meta.normalizeRef(ref);
85
- return this.#query.pipe(take(1), switchMap(query => this.provider.queryItem(refn, query).pipe(take(1))), switchMap(item => item != null ? this.store.updateOrInsert(refn, item, insertPosition).pipe(map(() => item)) : of(item)));
86
- }
87
- #storeFirst(storeFn, selfFn) {
88
- return this.#query.pipe(take(1), switchMap(query => storeFn(query).pipe(switchMap(result => (result == null ? selfFn(query) : of(result))))));
89
- }
90
- #setBusy(busy) {
91
- if (this.isBusy$.value !== busy) {
92
- // dont set true when not async provider, but false is also set
93
- if (busy && !this.provider.isAsync) {
94
- return;
95
- }
96
- this.isBusy$.next(busy);
97
- }
98
- }
99
- #cvSubs;
100
- connect(collectionViewer) {
101
- const until = new Subject();
102
- this.#cvSubs.get(collectionViewer)?.next();
103
- this.#cvSubs.set(collectionViewer, until);
104
- return new Observable((subscriber) => {
105
- const sub1 = collectionViewer.viewChange.subscribe(this.#slice);
106
- const sub2 = this.items$.subscribe(subscriber);
107
- return () => {
108
- if (this.#cvSubs.get(collectionViewer) === until) {
109
- this.#cvSubs.delete(collectionViewer);
110
- }
111
- sub1.unsubscribe();
112
- sub2.unsubscribe();
113
- };
114
- }).pipe(takeUntil(until));
115
- }
116
- disconnect(collectionViewer) {
117
- this.#cvSubs.get(collectionViewer)?.next();
118
- this.#cvSubs.delete(collectionViewer);
119
- }
120
- }
121
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGF0YS9zcmMvc291cmNlL3NvdXJjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxJQUFJLGFBQWEsRUFBb0IsTUFBTSwwQkFBMEIsQ0FBQTtBQUV4RixPQUFPLEVBQ0gsZUFBZSxFQUNmLFVBQVUsRUFDVixhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLE1BQU0sRUFDTixHQUFHLEVBQ0gsS0FBSyxFQUNMLFVBQVUsRUFDVixFQUFFLEVBQ0YsYUFBYSxFQUNiLFdBQVcsRUFDWCxPQUFPLEVBRVAsU0FBUyxFQUNULElBQUksRUFDSixTQUFTLEVBQ1QsR0FBRyxFQUNILEtBQUssRUFDUixNQUFNLE1BQU0sQ0FBQTtBQUViLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFFbkMsT0FBTyxFQUFtQixTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBS2hGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDdkMsT0FBTyxFQUF3QixXQUFXLEVBQTBCLE1BQU0sVUFBVSxDQUFBO0FBRXBGLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQTtBQUV4QixNQUFNLE9BQU8sVUFBNEIsU0FBUSxhQUE0QjtJQUloRSxNQUFNLENBQThCO0lBUXBDLE9BQU8sQ0FBdUM7SUFFOUMsTUFBTSxDQWlCZDtJQXdDRCxZQUNvQixRQUF5QixFQUN6QixRQUE0QixJQUFJLFdBQVcsRUFBRSxFQUM3QyxTQUFTLFlBQVksQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO1FBRXpELEtBQUssRUFBRSxDQUFBO1FBSlMsYUFBUSxHQUFSLFFBQVEsQ0FBaUI7UUFDekIsVUFBSyxHQUFMLEtBQUssQ0FBd0M7UUFDN0MsV0FBTSxHQUFOLE1BQU0sQ0FBbUM7UUF6RXBELFlBQU8sR0FBRyxJ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Qy9DLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUE7UUFFakMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLENBQUMsQ0FBQTtRQUV6QyxPQUFPLElBQUksVUFBVSxDQUFDLENBQUMsVUFBa0QsRUFBRSxFQUFFO1lBQ3pFLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFBO1lBQy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBRTlDLE9BQU8sR0FBRyxFQUFFO2dCQUNSLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtnQkFDekMsQ0FBQztnQkFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7Z0JBQ2xCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQTtZQUN0QixDQUFDLENBQUE7UUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUE7SUFDN0IsQ0FBQztJQUVRLFVBQVUsQ0FBQyxnQkFBa0M7UUFDbEQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3pDLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IERhdGFTb3VyY2UgYXMgQ2RrRGF0YVNvdXJjZSwgQ29sbGVjdGlvblZpZXdlciB9IGZyb20gXCJAYW5ndWxhci9jZGsvY29sbGVjdGlvbnNcIlxuXG5pbXBvcnQge1xuICAgIEJlaGF2aW9yU3ViamVjdCxcbiAgICBjYXRjaEVycm9yLFxuICAgIGNvbWJpbmVMYXRlc3QsXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQsXG4gICAgZmlsdGVyLFxuICAgIG1hcCxcbiAgICBtZXJnZSxcbiAgICBPYnNlcnZhYmxlLFxuICAgIG9mLFxuICAgIFJlcGxheVN1YmplY3QsXG4gICAgc2hhcmVSZXBsYXksXG4gICAgU3ViamVjdCxcbiAgICBTdWJzY3JpYmVyLFxuICAgIHN3aXRjaE1hcCxcbiAgICB0YWtlLFxuICAgIHRha2VVbnRpbCxcbiAgICB0YXAsXG4gICAgdGltZXJcbn0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiXG5cbmltcG9ydCB7IENvbm5lY3RQcm90b2NvbCwgZGVlcENsb25lLCBkZWVwRnJlZXplLCBpc0ZhbHN5IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuaW1wb3J0IHR5cGUgeyBNb2RlbCwgTW9kZWxSZWYgfSBmcm9tIFwiLi4vbW9kZWxcIlxuaW1wb3J0IHR5cGUgeyBEYXRhUHJvdmlkZXIgfSBmcm9tIFwiLi4vcHJvdmlkZXIvcHJvdmlkZXJcIlxuaW1wb3J0IHR5cGUgeyBRdWVyeVJlc3VsdCwgUXVlcnlXaXRoU2xpY2UsIFNsaWNlIH0gZnJvbSBcIi4uL3F1ZXJ5XCJcbmltcG9ydCB7IHF1ZXJ5U3ViamVjdCB9IGZyb20gXCIuLi9xdWVyeVwiXG5pbXBvcnQgeyB0eXBlIENvbGxlY3Rpb25TdG9yZSwgTWVtb3J5U3RvcmUsIHR5cGUgUGFydGlhbENvbGxlY3Rpb24gfSBmcm9tIFwiLi4vc3RvcmVcIlxuXG5jb25zdCBERUJPVU5DRV9USU1FID0gNTBcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2U8VCBleHRlbmRzIE1vZGVsPiBleHRlbmRzIENka0RhdGFTb3VyY2U8VCB8IHVuZGVmaW5lZD4gaW1wbGVtZW50cyBDb25uZWN0UHJvdG9jb2wge1xuICAgIHJlYWRvbmx5IGlzQnVzeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKVxuICAgIHJlYWRvbmx5IHRvdGFsJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyIHwgdW5kZWZpbmVkPih1bmRlZmluZWQpXG5cbiAgICByZWFkb25seSAjc2xpY2UgPSBuZXcgUmVwbGF5U3ViamVjdDxTbGljZT4oMSlcbiAgICByZWFkb25seSBzbGljZSQ6IE9ic2VydmFibGU8U2xpY2U+ID0gdGhpcy4jc2xpY2UucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKHNsaWNlID0+IHRoaXMucHJvdmlkZXIuY2xhbXBTbGljZShzbGljZSkpLFxuICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZChpc0VxdWFsKSxcbiAgICAgICAgbWFwKHNsaWNlID0+IGRlZXBGcmVlemUoZGVlcENsb25lKHNsaWNlKSkpLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgI3JlbG9hZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8dm9pZD4odW5kZWZpbmVkKVxuXG4gICAgcmVhZG9ubHkgI3F1ZXJ5OiBPYnNlcnZhYmxlPFF1ZXJ5V2l0aFNsaWNlPFQ+PiA9IGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICBxdWVyeTogdGhpcy5xdWVyeSQsXG4gICAgICAgIHJlbG9hZDogbWVyZ2UodGhpcy4jcmVsb2FkLCB0aGlzLnByb3ZpZGVyLmNoYW5nZWQkKVxuICAgIH0pLnBpcGUoXG4gICAgICAgIC8vIHRhcCgoKSA9PiB0aGlzLiNzZXRCdXN5KHRydWUpKSxcbiAgICAgICAgLy8gVE9ETzogbWF5YmUgc2lsZW50IHJlc2V0IG9yIHByZXZlbnQgaXRlbXMkIGNoZW5nZXNcbiAgICAgICAgLy8gVE9ETzogYWx0ZXJuYXRpdmUgc29sdXRpb24gdXNlIGNhY2hlSWQsIGFuZCBxdWVyeSBpdGVtIGZyb20gc3RvcmUgd2l0aCB0aGlzIGNhY2hlSWRcbiAgICAgICAgc3dpdGNoTWFwKCh7IHF1ZXJ5IH0pID0+IHRoaXMuc3RvcmUuY2xlYXIoKS5waXBlKG1hcCgoKSA9PiBxdWVyeSkpKSxcbiAgICAgICAgc3dpdGNoTWFwKHF1ZXJ5ID0+XG4gICAgICAgICAgICB0aGlzLnNsaWNlJC5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChzbGljZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuI3NldEJ1c3kodHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgLi4ucXVlcnksIHNsaWNlIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgaXRlbXMkOiBPYnNlcnZhYmxlPFBhcnRpYWxDb2xsZWN0aW9uPFQ+PiA9IHRoaXMuI3F1ZXJ5LnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCh2ID0+ICh0aGlzLnByb3ZpZGVyLmlzQXN5bmMgPyB0aW1lcihERUJPVU5DRV9USU1FKS5waXBlKG1hcCgoKSA9PiB2KSkgOiBvZih2KSkpLFxuICAgICAgICBzd2l0Y2hNYXAocXVlcnkgPT5cbiAgICAgICAgICAgIHRoaXMuc3RvcmUuaGFzU2xpY2UocXVlcnkuc2xpY2UpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoaGFzU2xpY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzU2xpY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLmdldFNsaWNlKHF1ZXJ5LnNsaWNlKS5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNzZXRCdXN5KHRydWUpXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm92aWRlci5xdWVyeUxpc3QocXVlcnkpLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaEVycm9yKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2V0QnVzeShmYWxzZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHsgaXRlbXM6IFtdLCB0b3RhbDogdW5kZWZpbmVkIH0gc2F0aXNmaWVzIFF1ZXJ5UmVzdWx0PFQ+KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB0aGlzLiNzZXRCdXN5KGZhbHNlKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQudG90YWwgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3RhbCQubmV4dChyZXN1bHQudG90YWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaW5zZXJ0U2xpY2UocXVlcnkuc2xpY2UsIHJlc3VsdC5pdGVtcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlKDEpXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgaXNFbXB0eSQgPSBjb21iaW5lTGF0ZXN0KHsgYnVzeTogdGhpcy5pc0J1c3kkLCBpdGVtczogdGhpcy5pdGVtcyQgfSkucGlwZShcbiAgICAgICAgZmlsdGVyKCh7IGJ1c3kgfSkgPT4gIWJ1c3kpLFxuICAgICAgICBtYXAoKHsgaXRlbXMgfSkgPT4gaXRlbXMuZXZlcnkoaXNGYWxzeSkpLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHB1YmxpYyByZWFkb25seSBwcm92aWRlcjogRGF0YVByb3ZpZGVyPFQ+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgc3RvcmU6IENvbGxlY3Rpb25TdG9yZTxUPiA9IG5ldyBNZW1vcnlTdG9yZSgpLFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgcXVlcnkkID0gcXVlcnlTdWJqZWN0KFwibm9ybWFsXCIsIFwiZm9yY2VkXCIpXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKClcbiAgICB9XG5cbiAgICBzZXRTbGljZShzbGljZTogU2xpY2UpIHtcbiAgICAgICAgdGhpcy4jc2xpY2UubmV4dChzbGljZSlcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNldFNsaWNlKHsgc3RhcnQ6IDAsIGVuZDogSW5maW5pdHkgfSlcbiAgICB9XG5cbiAgICByZWxvYWQoKSB7XG4gICAgICAgIHRoaXMuI3JlbG9hZC5uZXh0KClcbiAgICB9XG5cbiAgICBnZXRJdGVtKHJlZjogTW9kZWxSZWYpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgY29uc3QgcmVmbiA9IHRoaXMucHJvdmlkZXIubWV0YS5ub3JtYWxpemVSZWYocmVmKVxuICAgICAgICByZXR1cm4gdGhpcy5zdG9yZS5nZXQocmVmbikucGlwZShcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAocmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXIucXVlcnlJdGVtKHJlZm4pLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9mKHJlc3VsdClcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICB3YXRjaEl0ZW0ocmVmOiBNb2RlbFJlZik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZWZuID0gdGhpcy5wcm92aWRlci5tZXRhLm5vcm1hbGl6ZVJlZihyZWYpXG4gICAgICAgIHJldHVybiB0aGlzLiNzdG9yZUZpcnN0KFxuICAgICAgICAgICAgcXVlcnkgPT4gdGhpcy5zdG9yZS5nZXQocmVmbiksXG4gICAgICAgICAgICBxdWVyeSA9PiB0aGlzLnByb3ZpZGVyLnF1ZXJ5SXRlbShyZWZuLCBxdWVyeSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIGdldEl0ZW1Qb3NpdGlvbihyZWY6IE1vZGVsUmVmKTogT2JzZXJ2YWJsZTxudW1iZXIgfCB1bmRlZmluZWQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2F0Y2hJdGVtUG9zaXRpb24ocmVmKS5waXBlKHRha2UoMSkpXG4gICAgfVxuXG4gICAgd2F0Y2hJdGVtUG9zaXRpb24ocmVmOiBNb2RlbFJlZik6IE9ic2VydmFibGU8bnVtYmVyIHwgdW5kZWZpbmVkPiB7XG4gICAgICAgIGNvbnN0IHJlZm4gPSB0aGlzLnByb3ZpZGVyLm1ldGEubm9ybWFsaXplUmVmKHJlZilcbiAgICAgICAgcmV0dXJuIHRoaXMuI3N0b3JlRmlyc3QoXG4gICAgICAgICAgICBxdWVyeSA9PiB0aGlzLnN0b3JlLmluZGV4T2YocmVmbikucGlwZShtYXAoaSA9PiAoaSA8IDAgPyB1bmRlZmluZWQgOiBpKSkpLFxuICAgICAgICAgICAgcXVlcnkgPT4gdGhpcy5wcm92aWRlci5xdWVyeVBvc2l0aW9uKHJlZm4sIHF1ZXJ5KVxuICAgICAgICApXG4gICAgfVxuXG4gICAgcmVhbG9kSXRlbShyZWY6IE1vZGVsUmVmLCBpbnNlcnRQb3NpdGlvbj86IG51bWJlcik6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICBjb25zdCByZWZuID0gdGhpcy5wcm92aWRlci5tZXRhLm5vcm1hbGl6ZVJlZihyZWYpXG4gICAgICAgIHJldHVybiB0aGlzLiNxdWVyeS5waXBlKFxuICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChxdWVyeSA9PiB0aGlzLnByb3ZpZGVyLnF1ZXJ5SXRlbShyZWZuLCBxdWVyeSkucGlwZSh0YWtlKDEpKSksXG4gICAgICAgICAgICBzd2l0Y2hNYXAoaXRlbSA9PlxuICAgICAgICAgICAgICAgIGl0ZW0gIT0gbnVsbCA/IHRoaXMuc3RvcmUudXBkYXRlT3JJbnNlcnQocmVmbiwgaXRlbSwgaW5zZXJ0UG9zaXRpb24pLnBpcGUobWFwKCgpID0+IGl0ZW0pKSA6IG9mKGl0ZW0pXG4gICAgICAgICAgICApXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjc3RvcmVGaXJzdDxYPihcbiAgICAgICAgc3RvcmVGbjogKHF1ZXJ5OiBRdWVyeVdpdGhTbGljZTxUPikgPT4gT2JzZXJ2YWJsZTxYPixcbiAgICAgICAgc2VsZkZuOiAocXVlcnk6IFF1ZXJ5V2l0aFNsaWNlPFQ+KSA9PiBPYnNlcnZhYmxlPFg+XG4gICAgKTogT2JzZXJ2YWJsZTxYPiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNxdWVyeS5waXBlKFxuICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgIHN3aXRjaE1hcChxdWVyeSA9PiBzdG9yZUZuKHF1ZXJ5KS5waXBlKHN3aXRjaE1hcChyZXN1bHQgPT4gKHJlc3VsdCA9PSBudWxsID8gc2VsZkZuKHF1ZXJ5KSA6IG9mKHJlc3VsdCkpKSkpXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjc2V0QnVzeShidXN5OiBib29sZWFuKSB7XG4gICAgICAgIGlmICh0aGlzLmlzQnVzeSQudmFsdWUgIT09IGJ1c3kpIHtcbiAgICAgICAgICAgIC8vIGRvbnQgc2V0IHRydWUgd2hlbiBub3QgYXN5bmMgcHJvdmlkZXIsIGJ1dCBmYWxzZSBpcyBhbHNvIHNldFxuICAgICAgICAgICAgaWYgKGJ1c3kgJiYgIXRoaXMucHJvdmlkZXIuaXNBc3luYykge1xuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5pc0J1c3kkLm5leHQoYnVzeSlcbiAgICAgICAgfVxuICAgIH1cblxuICAgICNjdlN1YnMgPSBuZXcgTWFwPENvbGxlY3Rpb25WaWV3ZXIsIFN1YmplY3Q8dm9pZD4+KClcblxuICAgIG92ZXJyaWRlIGNvbm5lY3QoY29sbGVjdGlvblZpZXdlcjogQ29sbGVjdGlvblZpZXdlcik6IE9ic2VydmFibGU8cmVhZG9ubHkgKFQgfCB1bmRlZmluZWQpW10+IHtcbiAgICAgICAgY29uc3QgdW50aWwgPSBuZXcgU3ViamVjdDx2b2lkPigpXG5cbiAgICAgICAgdGhpcy4jY3ZTdWJzLmdldChjb2xsZWN0aW9uVmlld2VyKT8ubmV4dCgpXG4gICAgICAgIHRoaXMuI2N2U3Vicy5zZXQoY29sbGVjdGlvblZpZXdlciwgdW50aWwpXG5cbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChzdWJzY3JpYmVyOiBTdWJzY3JpYmVyPHJlYWRvbmx5IChUIHwgdW5kZWZpbmVkKVtdPikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc3ViMSA9IGNvbGxlY3Rpb25WaWV3ZXIudmlld0NoYW5nZS5zdWJzY3JpYmUodGhpcy4jc2xpY2UpXG4gICAgICAgICAgICBjb25zdCBzdWIyID0gdGhpcy5pdGVtcyQuc3Vic2NyaWJlKHN1YnNjcmliZXIpXG5cbiAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuI2N2U3Vicy5nZXQoY29sbGVjdGlvblZpZXdlcikgPT09IHVudGlsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2N2U3Vicy5kZWxldGUoY29sbGVjdGlvblZpZXdlcilcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3ViMS51bnN1YnNjcmliZSgpXG4gICAgICAgICAgICAgICAgc3ViMi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pLnBpcGUodGFrZVVudGlsKHVudGlsKSlcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNjb25uZWN0KGNvbGxlY3Rpb25WaWV3ZXI6IENvbGxlY3Rpb25WaWV3ZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy4jY3ZTdWJzLmdldChjb2xsZWN0aW9uVmlld2VyKT8ubmV4dCgpXG4gICAgICAgIHRoaXMuI2N2U3Vicy5kZWxldGUoY29sbGVjdGlvblZpZXdlcilcbiAgICB9XG59XG4iXX0=
@@ -1,3 +0,0 @@
1
- export class CollectionStore {
2
- }
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RhdGEvc3JjL3N0b3JlL2NvbGxlY3Rpb24tc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBU0EsTUFBTSxPQUFnQixlQUFlO0NBbURwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiXG5cbmltcG9ydCB7IERlZXBSZWFkb25seSB9IGZyb20gXCJAbmd1dGlsL2NvbW1vblwiXG5cbmltcG9ydCB7IE1vZGVsLCBNb2RlbFJlZk5vcm0gfSBmcm9tIFwiLi4vbW9kZWxcIlxuaW1wb3J0IHsgU2xpY2UgfSBmcm9tIFwiLi4vcXVlcnlcIlxuXG5leHBvcnQgdHlwZSBQYXJ0aWFsQ29sbGVjdGlvbjxUPiA9IHJlYWRvbmx5IChUIHwgdW5kZWZpbmVkKVtdXG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uU3RvcmU8VCBleHRlbmRzIE1vZGVsPiB7XG4gICAgLyoqXG4gICAgICogVXBkYXRlIHRoZSBnaXZlbiBzbGljZSwgYW5kIHJldHVybiBhbGwgaXRlbXMgb2JzZXJ2YWJsZVxuICAgICAqL1xuICAgIGFic3RyYWN0IGluc2VydFNsaWNlKHNsaWNlOiBEZWVwUmVhZG9ubHk8U2xpY2U+LCBpdGVtczogcmVhZG9ubHkgVFtdKTogT2JzZXJ2YWJsZTxQYXJ0aWFsQ29sbGVjdGlvbjxUPj5cblxuICAgIC8qKlxuICAgICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBnaXZlbiBzbGljZSBpcyBhdmFpbGFibGUgaW4gdGhlIGNhY2hlXG4gICAgICovXG4gICAgYWJzdHJhY3QgaGFzU2xpY2Uoc2xpY2U6IERlZXBSZWFkb25seTxTbGljZT4pOiBPYnNlcnZhYmxlPGJvb2xlYW4+XG5cbiAgICAvKipcbiAgICAgKiBAcmV0dXJucyBpdGVtcyBieSB0aGUgZ2l2ZW4gc2xpY2VcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBnZXRTbGljZShzbGljZTogRGVlcFJlYWRvbmx5PFNsaWNlPik6IE9ic2VydmFibGU8UGFydGlhbENvbGxlY3Rpb248VD4+XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaXRlbSBmcm9tIGNvbGxlY3Rpb25cbiAgICAgKi9cbiAgICBhYnN0cmFjdCBnZXQocmVmOiBNb2RlbFJlZk5vcm0pOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+XG5cbiAgICAvKipcbiAgICAgKiBHZXQgaW5kZXggb2YgaXRlbSBpbiBjb2xsZWN0aW9uLCAtMSBpZiBub3QgZm91bmRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCBpbmRleE9mKHJlZjogTW9kZWxSZWZOb3JtKTogT2JzZXJ2YWJsZTxudW1iZXI+XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaXRlbSBpbiBjb2xsZWN0aW9uXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBpbmRleCwgb3IgLTEgaWYgbm90IGZvdW5kXG4gICAgICovXG4gICAgYWJzdHJhY3QgdXBkYXRlKHJlZjogTW9kZWxSZWZOb3JtLCBpdGVtOiBUKTogT2JzZXJ2YWJsZTxudW1iZXI+XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGUgaXRlbSBpZiBleGlzdHMgaW4gY29sbGVjdGlvbiwgb3IgaW5zZXJ0IGF0IHRoZSBnaXZlbiBwb3NpdGlvblxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIElmIHBvc2l0b24gaXMgbmVnYXRpdmUsIGluc2VydCBhdCB0aGUgZW5kIG9mIGNvbGxlY3Rpb25cbiAgICAgKiBAcmV0dXJucyB0aGUgdXBkYXRlZCBpbmRleCBvciBpbmRleCBvZiB3aGVyZSB0byBpbnNlcnRcbiAgICAgKi9cbiAgICBhYnN0cmFjdCB1cGRhdGVPckluc2VydChyZWY6IE1vZGVsUmVmTm9ybSwgaXRlbTogVCwgcG9zaXRpb24/OiBudW1iZXIpOiBPYnNlcnZhYmxlPG51bWJlcj5cblxuICAgIC8qKlxuICAgICAqIFJlbW92ZSBpdGVtIGZyb20gY29sbGVjdGlvblxuICAgICAqIEByZXR1cm5zIHRoZSBpbmRleCBvZiBkZWxldGVkIGl0ZW0sIC0xIGlmIG5vdCBmb3VuZFxuICAgICAqL1xuICAgIGFic3RyYWN0IGRlbChyZWY6IE1vZGVsUmVmTm9ybSk6IE9ic2VydmFibGU8bnVtYmVyPlxuXG4gICAgLyoqXG4gICAgICogUmVtb3ZlcyBhbGwgaXRlbXMgZnJvbSBjb2xsZWN0aW9uXG4gICAgICovXG4gICAgYWJzdHJhY3QgY2xlYXIoKTogT2JzZXJ2YWJsZTx2b2lkPlxufVxuIl19
@@ -1,3 +0,0 @@
1
- export { CollectionStore } from "./collection-store";
2
- export { MemoryStore } from "./memory-store";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYXRhL3NyYy9zdG9yZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFxQixNQUFNLG9CQUFvQixDQUFBO0FBQ3ZFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IENvbGxlY3Rpb25TdG9yZSwgUGFydGlhbENvbGxlY3Rpb24gfSBmcm9tIFwiLi9jb2xsZWN0aW9uLXN0b3JlXCJcbmV4cG9ydCB7IE1lbW9yeVN0b3JlIH0gZnJvbSBcIi4vbWVtb3J5LXN0b3JlXCJcbiJdfQ==
@@ -1,79 +0,0 @@
1
- import { BehaviorSubject, combineLatest, map, of, take } from "rxjs";
2
- import { sliceApply, sliceClamp, sliceEq, sliceInsert } from "../query";
3
- import { CollectionStore } from "./collection-store";
4
- export class MemoryStore extends CollectionStore {
5
- #data = new BehaviorSubject([]);
6
- insertSlice(slice, items) {
7
- this.#data.next(sliceInsert(slice, this.#data.value, items));
8
- return this.#data;
9
- }
10
- hasSlice(slice) {
11
- return this.#data.pipe(map(data => {
12
- if (sliceEq(slice, sliceClamp(slice, { start: 0, end: data.length }))) {
13
- for (let i = slice.start; i < slice.end; i++) {
14
- if (data[i] == null) {
15
- return false;
16
- }
17
- }
18
- return true;
19
- }
20
- else {
21
- return false;
22
- }
23
- }));
24
- }
25
- getSlice(slice) {
26
- return this.#data.pipe(map(data => sliceApply(slice, data)));
27
- }
28
- get(ref) {
29
- return this.#data.pipe(map(data => data.find(ref.toFilter())));
30
- }
31
- indexOf(ref) {
32
- return this.#data.pipe(map(data => data.findIndex(ref.toFilter())));
33
- }
34
- update(ref, item) {
35
- return combineLatest({
36
- index: this.indexOf(ref),
37
- data: this.#data
38
- }).pipe(take(1), map(({ index, data }) => {
39
- if (index < 0) {
40
- return index;
41
- }
42
- this.#data.next(sliceInsert({ start: index, end: index + 1 }, data, [item]));
43
- return index;
44
- }));
45
- }
46
- updateOrInsert(ref, item, position) {
47
- return combineLatest({
48
- index: this.indexOf(ref),
49
- data: this.#data
50
- }).pipe(take(1), map(({ index, data }) => {
51
- if (index < 0) {
52
- index = position == null ? data.length : position < 0 ? data.length : position;
53
- }
54
- this.#data.next(sliceInsert({ start: index, end: index + 1 }, data, [item]));
55
- return index;
56
- }));
57
- }
58
- del(ref) {
59
- return combineLatest({
60
- index: this.indexOf(ref),
61
- data: this.#data
62
- }).pipe(take(1), map(({ index, data }) => {
63
- if (index < 0) {
64
- return index;
65
- }
66
- const result = data.slice(0);
67
- result.splice(index, 1);
68
- this.#data.next(result);
69
- return index;
70
- }));
71
- }
72
- clear() {
73
- if (this.#data.value.length > 0) {
74
- this.#data.next([]);
75
- }
76
- return of(undefined);
77
- }
78
- }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5LXN0b3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvZGF0YS9zcmMvc3RvcmUvbWVtb3J5LXN0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBR2hGLE9BQU8sRUFBUyxVQUFVLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUE7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBcUIsTUFBTSxvQkFBb0IsQ0FBQTtBQUV2RSxNQUFNLE9BQU8sV0FBNkIsU0FBUSxlQUFrQjtJQUN2RCxLQUFLLEdBQUcsSUFBSSxlQUFlLENBQXVCLEVBQUUsQ0FBQyxDQUFBO0lBRXJELFdBQVcsQ0FBQyxLQUFZLEVBQUUsS0FBbUI7UUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFBO1FBQzVELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQTtJQUNyQixDQUFDO0lBRVEsUUFBUSxDQUFDLEtBQVk7UUFDMUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FDbEIsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ1AsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUs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Q0FBQyxDQUNMLENBQUE7SUFDTCxDQUFDO0lBRVEsR0FBRyxDQUFDLEdBQWlCO1FBQzFCLE9BQU8sYUFBYSxDQUFDO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztZQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUs7U0FDbkIsQ0FBQyxDQUFDLElBQUksQ0FDSCxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ1AsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRTtZQUNwQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDWixPQUFPLEtBQUssQ0FBQTtZQUNoQixDQUFDO1lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1QixNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQTtZQUN2QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtZQUN2QixPQUFPLEtBQUssQ0FBQTtRQUNoQixDQUFDLENBQUMsQ0FDTCxDQUFBO0lBQ0wsQ0FBQztJQUVRLEtBQUs7UUFDVixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2QixDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUE7SUFDeEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBtYXAsIE9ic2VydmFibGUsIG9mLCB0YWtlIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBNb2RlbCwgTW9kZWxSZWZOb3JtIH0gZnJvbSBcIi4uL21vZGVsXCJcbmltcG9ydCB7IFNsaWNlLCBzbGljZUFwcGx5LCBzbGljZUNsYW1wLCBzbGljZUVxLCBzbGljZUluc2VydCB9IGZyb20gXCIuLi9xdWVyeVwiXG5pbXBvcnQgeyBDb2xsZWN0aW9uU3RvcmUsIFBhcnRpYWxDb2xsZWN0aW9uIH0gZnJvbSBcIi4vY29sbGVjdGlvbi1zdG9yZVwiXG5cbmV4cG9ydCBjbGFzcyBNZW1vcnlTdG9yZTxUIGV4dGVuZHMgTW9kZWw+IGV4dGVuZHMgQ29sbGVjdGlvblN0b3JlPFQ+IHtcbiAgICByZWFkb25seSAjZGF0YSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UGFydGlhbENvbGxlY3Rpb248VD4+KFtdKVxuXG4gICAgb3ZlcnJpZGUgaW5zZXJ0U2xpY2Uoc2xpY2U6IFNsaWNlLCBpdGVtczogcmVhZG9ubHkgVFtdKTogT2JzZXJ2YWJsZTxQYXJ0aWFsQ29sbGVjdGlvbjxUPj4ge1xuICAgICAgICB0aGlzLiNkYXRhLm5leHQoc2xpY2VJbnNlcnQoc2xpY2UsIHRoaXMuI2RhdGEudmFsdWUsIGl0ZW1zKSlcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RhdGFcbiAgICB9XG5cbiAgICBvdmVycmlkZSBoYXNTbGljZShzbGljZTogU2xpY2UpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2RhdGEucGlwZShcbiAgICAgICAgICAgIG1hcChkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoc2xpY2VFcShzbGljZSwgc2xpY2VDbGFtcChzbGljZSwgeyBzdGFydDogMCwgZW5kOiBkYXRhLmxlbmd0aCB9KSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNsaWNlLnN0YXJ0OyBpIDwgc2xpY2UuZW5kOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhW2ldID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBvdmVycmlkZSBnZXRTbGljZShzbGljZTogU2xpY2UpOiBPYnNlcnZhYmxlPFBhcnRpYWxDb2xsZWN0aW9uPFQ+PiB7XG4gICAgICAgIHJldHVybiB0aGlzLiNkYXRhLnBpcGUobWFwKGRhdGEgPT4gc2xpY2VBcHBseShzbGljZSwgZGF0YSkpKVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGdldChyZWY6IE1vZGVsUmVmTm9ybSk6IE9ic2VydmFibGU8VCB8IHVuZGVmaW5lZD4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGF0YS5waXBlKG1hcChkYXRhID0+IGRhdGEuZmluZChyZWYudG9GaWx0ZXIoKSkpKVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGluZGV4T2YocmVmOiBNb2RlbFJlZk5vcm0pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gdGhpcy4jZGF0YS5waXBlKG1hcChkYXRhID0+IGRhdGEuZmluZEluZGV4KHJlZi50b0ZpbHRlcigpKSkpXG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgdXBkYXRlKHJlZjogTW9kZWxSZWZOb3JtLCBpdGVtOiBUKTogT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgaW5kZXg6IHRoaXMuaW5kZXhPZihyZWYpLFxuICAgICAgICAgICAgZGF0YTogdGhpcy4jZGF0YVxuICAgICAgICB9KS5waXBlKFxuICAgICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgICAgIG1hcCgoeyBpbmRleCwgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy4jZGF0YS5uZXh0KHNsaWNlSW5zZXJ0KHsgc3RhcnQ6IGluZGV4LCBlbmQ6IGluZGV4ICsgMSB9LCBkYXRhLCBbaXRlbV0pKVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIG92ZXJyaWRlIHVwZGF0ZU9ySW5zZXJ0KHJlZjogTW9kZWxSZWZOb3JtLCBpdGVtOiBULCBwb3NpdGlvbj86IG51bWJlcik6IE9ic2VydmFibGU8bnVtYmVyPiB7XG4gICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHtcbiAgICAgICAgICAgIGluZGV4OiB0aGlzLmluZGV4T2YocmVmKSxcbiAgICAgICAgICAgIGRhdGE6IHRoaXMuI2RhdGFcbiAgICAgICAgfSkucGlwZShcbiAgICAgICAgICAgIHRha2UoMSksXG4gICAgICAgICAgICBtYXAoKHsgaW5kZXgsIGRhdGEgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBwb3NpdGlvbiA9PSBudWxsID8gZGF0YS5sZW5ndGggOiBwb3NpdGlvbiA8IDAgPyBkYXRhLmxlbmd0aCA6IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI2RhdGEubmV4dChzbGljZUluc2VydCh7IHN0YXJ0OiBpbmRleCwgZW5kOiBpbmRleCArIDEgfSwgZGF0YSwgW2l0ZW1dKSlcbiAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXhcbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkZWwocmVmOiBNb2RlbFJlZk5vcm0pOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdCh7XG4gICAgICAgICAgICBpbmRleDogdGhpcy5pbmRleE9mKHJlZiksXG4gICAgICAgICAgICBkYXRhOiB0aGlzLiNkYXRhXG4gICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICAgICAgbWFwKCh7IGluZGV4LCBkYXRhIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRleFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkYXRhLnNsaWNlKDApXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNwbGljZShpbmRleCwgMSlcbiAgICAgICAgICAgICAgICB0aGlzLiNkYXRhLm5leHQocmVzdWx0KVxuICAgICAgICAgICAgICAgIHJldHVybiBpbmRleFxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgIH1cblxuICAgIG92ZXJyaWRlIGNsZWFyKCk6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICBpZiAodGhpcy4jZGF0YS52YWx1ZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLiNkYXRhLm5leHQoW10pXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZClcbiAgICB9XG59XG4iXX0=