@ngutil/aria 0.0.80 → 0.0.82
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/fesm2022/ngutil-aria.mjs +88 -65
- package/fesm2022/ngutil-aria.mjs.map +1 -1
- package/focus/focus-state.directive.d.ts +1 -2
- package/focus/focus.service.d.ts +1 -1
- package/focus/focusable.directive.d.ts +0 -1
- package/package.json +7 -9
- package/ui-state/abstract.d.ts +1 -1
- package/ui-state/dirty.directive.d.ts +9 -0
- package/ui-state/index.d.ts +5 -3
- package/ui-state/progress-state.d.ts +1 -1
- package/esm2022/activity/activity.service.mjs +0 -49
- package/esm2022/activity/index.mjs +0 -2
- package/esm2022/focus/focus-state.directive.mjs +0 -63
- package/esm2022/focus/focus-trap.directive.mjs +0 -25
- package/esm2022/focus/focus.service.mjs +0 -145
- package/esm2022/focus/focusable.directive.mjs +0 -52
- package/esm2022/focus/index.mjs +0 -5
- package/esm2022/gestures/gesture-drag.mjs +0 -81
- package/esm2022/gestures/gesture-event.mjs +0 -44
- package/esm2022/gestures/gesture-longtap.mjs +0 -34
- package/esm2022/gestures/gesture-tap.mjs +0 -37
- package/esm2022/gestures/gesture.mjs +0 -66
- package/esm2022/gestures/gesture.service.mjs +0 -279
- package/esm2022/gestures/index.mjs +0 -7
- package/esm2022/index.mjs +0 -6
- package/esm2022/keystroke/index.mjs +0 -2
- package/esm2022/keystroke/keystroke.service.mjs +0 -92
- package/esm2022/ngutil-aria.mjs +0 -5
- package/esm2022/ui-state/abstract.mjs +0 -41
- package/esm2022/ui-state/busy.directive.mjs +0 -27
- package/esm2022/ui-state/disabled.directive.mjs +0 -28
- package/esm2022/ui-state/index.mjs +0 -25
- package/esm2022/ui-state/progress-state.mjs +0 -141
- package/esm2022/ui-state/readonly.directive.mjs +0 -27
- package/esm2022/ui-state/selector.mjs +0 -308
- package/esm2022/ui-state/ui-state.mjs +0 -91
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { NgModule } from "@angular/core";
|
|
2
|
-
import { BusyDirective } from "./busy.directive";
|
|
3
|
-
import { DisabledDirective } from "./disabled.directive";
|
|
4
|
-
import { ReadonlyDirective } from "./readonly.directive";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
export * from "./abstract";
|
|
7
|
-
export * from "./busy.directive";
|
|
8
|
-
export * from "./disabled.directive";
|
|
9
|
-
export * from "./progress-state";
|
|
10
|
-
export * from "./readonly.directive";
|
|
11
|
-
export * from "./ui-state";
|
|
12
|
-
const entries = [BusyDirective, DisabledDirective, ReadonlyDirective];
|
|
13
|
-
export class UiStateModule {
|
|
14
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
15
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, imports: [BusyDirective, DisabledDirective, ReadonlyDirective], exports: [BusyDirective, DisabledDirective, ReadonlyDirective] }); }
|
|
16
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule }); }
|
|
17
|
-
}
|
|
18
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, decorators: [{
|
|
19
|
-
type: NgModule,
|
|
20
|
-
args: [{
|
|
21
|
-
imports: entries,
|
|
22
|
-
exports: entries
|
|
23
|
-
}]
|
|
24
|
-
}] });
|
|
25
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXhDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7QUFFeEQsY0FBYyxZQUFZLENBQUE7QUFDMUIsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLFlBQVksQ0FBQTtBQUUxQixNQUFNLE9BQU8sR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0FBTXJFLE1BQU0sT0FBTyxhQUFhOzhHQUFiLGFBQWE7K0dBQWIsYUFBYSxZQU5ULGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsYUFBbkQsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQjsrR0FNdkQsYUFBYTs7MkZBQWIsYUFBYTtrQkFKekIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLE9BQU87aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IEJ1c3lEaXJlY3RpdmUgfSBmcm9tIFwiLi9idXN5LmRpcmVjdGl2ZVwiXG5pbXBvcnQgeyBEaXNhYmxlZERpcmVjdGl2ZSB9IGZyb20gXCIuL2Rpc2FibGVkLmRpcmVjdGl2ZVwiXG5pbXBvcnQgeyBSZWFkb25seURpcmVjdGl2ZSB9IGZyb20gXCIuL3JlYWRvbmx5LmRpcmVjdGl2ZVwiXG5cbmV4cG9ydCAqIGZyb20gXCIuL2Fic3RyYWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2J1c3kuZGlyZWN0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpc2FibGVkLmRpcmVjdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9wcm9ncmVzcy1zdGF0ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9yZWFkb25seS5kaXJlY3RpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5jb25zdCBlbnRyaWVzID0gW0J1c3lEaXJlY3RpdmUsIERpc2FibGVkRGlyZWN0aXZlLCBSZWFkb25seURpcmVjdGl2ZV1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBlbnRyaWVzLFxuICAgIGV4cG9ydHM6IGVudHJpZXNcbn0pXG5leHBvcnQgY2xhc3MgVWlTdGF0ZU1vZHVsZSB7fVxuIl19
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
import { Directive } from "@angular/core";
|
|
2
|
-
import { toSignal } from "@angular/core/rxjs-interop";
|
|
3
|
-
import { animationFrames, map, Observable, of, scan, shareReplay, startWith, Subject, switchMap, takeWhile } from "rxjs";
|
|
4
|
-
import { clamp } from "lodash-es";
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const SEGMENT_REGISTER = { type: "fix", percent: 0 };
|
|
7
|
-
const SEGMENT_COMPLETE = { type: "fix", percent: 1 };
|
|
8
|
-
export class ProgressState {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.#segments = {};
|
|
11
|
-
this.#input = new Subject();
|
|
12
|
-
this.#state = this.#input.pipe(startWith(null), scan((state, input) => {
|
|
13
|
-
if (Object.keys(state).length === 0) {
|
|
14
|
-
state = this.#initialState();
|
|
15
|
-
}
|
|
16
|
-
if (input == null) {
|
|
17
|
-
return state;
|
|
18
|
-
}
|
|
19
|
-
let current = state[input.name] ?? { ratio: 0, share: 0, done: false };
|
|
20
|
-
current = { ...current, ...input };
|
|
21
|
-
if (input.progress.type === "lax") {
|
|
22
|
-
delete current.laxBegin;
|
|
23
|
-
current.done = false;
|
|
24
|
-
}
|
|
25
|
-
if (input.progress.type === "fix" && input.progress.percent < 1) {
|
|
26
|
-
current.done = false;
|
|
27
|
-
}
|
|
28
|
-
return { ...state, [input.name]: { ...current, ...input } };
|
|
29
|
-
}, {}), switchMap(state => {
|
|
30
|
-
const slist = Object.values(state);
|
|
31
|
-
const min = slist.reduce((min, current) => Math.min(min, current.distribution || 0), Infinity) || 1;
|
|
32
|
-
const totalDistribution = slist.reduce((total, current) => total + (current.distribution || min), 0);
|
|
33
|
-
const hasLax = slist.some(segment => segment.progress.type === "lax");
|
|
34
|
-
const trigger = hasLax ? animationFrames() : of({ timestamp: performance.now() });
|
|
35
|
-
return trigger.pipe(map(({ timestamp }) => {
|
|
36
|
-
for (const segment of slist) {
|
|
37
|
-
if (segment.distribution == null) {
|
|
38
|
-
segment.distribution = min;
|
|
39
|
-
}
|
|
40
|
-
segment.ratio = segment.distribution / totalDistribution + 0.0001;
|
|
41
|
-
let percent;
|
|
42
|
-
if (segment.progress.type === "lax") {
|
|
43
|
-
if (segment.laxBegin == null) {
|
|
44
|
-
segment.laxBegin = timestamp;
|
|
45
|
-
}
|
|
46
|
-
percent = (timestamp - segment.laxBegin) / segment.progress.predictedTime;
|
|
47
|
-
if (percent >= 0.8) {
|
|
48
|
-
const final = (timestamp - segment.laxBegin) / (segment.progress.predictedTime * 50);
|
|
49
|
-
percent = 0.8 + Math.log1p(final);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
delete segment.laxBegin;
|
|
54
|
-
percent = clamp(segment.progress.percent, 0, 1);
|
|
55
|
-
}
|
|
56
|
-
segment.share = percent * segment.ratio;
|
|
57
|
-
segment.done = percent >= 1;
|
|
58
|
-
}
|
|
59
|
-
return state;
|
|
60
|
-
}), takeWhile(state => Object.values(state).some(segment => !segment.done), true));
|
|
61
|
-
}), shareReplay({ bufferSize: 1, refCount: true }));
|
|
62
|
-
this.value$ = this.#state;
|
|
63
|
-
this.value = toSignal(this.value$);
|
|
64
|
-
this.percent$ = this.value$.pipe(map(value => value != null
|
|
65
|
-
? clamp(Object.values(value).reduce((a, b) => a + b.share, 0), 0, 1)
|
|
66
|
-
: 0), shareReplay({ bufferSize: 1, refCount: true }));
|
|
67
|
-
this.percent = toSignal(this.percent$);
|
|
68
|
-
}
|
|
69
|
-
#segments;
|
|
70
|
-
#input;
|
|
71
|
-
#state;
|
|
72
|
-
segment(name, distribution = 1) {
|
|
73
|
-
const segment = this.#segments[name] ?? (this.#segments[name] = new ProgressSegmentRef(this.#input, name, distribution));
|
|
74
|
-
segment.next(SEGMENT_REGISTER);
|
|
75
|
-
return segment;
|
|
76
|
-
}
|
|
77
|
-
connect(state, name, distribution) {
|
|
78
|
-
return new Observable(() => {
|
|
79
|
-
const segment = this.segment(name, distribution);
|
|
80
|
-
return state.percent$.subscribe(percent => {
|
|
81
|
-
segment.next({ type: "fix", percent });
|
|
82
|
-
});
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
#initialState() {
|
|
86
|
-
return Object.values(this.#segments).reduce((res, segment) => {
|
|
87
|
-
if (segment.value) {
|
|
88
|
-
res[segment.name] = {
|
|
89
|
-
name: segment.name,
|
|
90
|
-
distribution: segment.distribution,
|
|
91
|
-
progress: segment.value,
|
|
92
|
-
ratio: 0,
|
|
93
|
-
share: 0,
|
|
94
|
-
done: false
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
return res;
|
|
98
|
-
}, {});
|
|
99
|
-
}
|
|
100
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ProgressState, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
101
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: ProgressState, ngImport: i0 }); }
|
|
102
|
-
}
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ProgressState, decorators: [{
|
|
104
|
-
type: Directive
|
|
105
|
-
}] });
|
|
106
|
-
export class ProgressSegmentRef {
|
|
107
|
-
#subject;
|
|
108
|
-
set distribution(value) {
|
|
109
|
-
if (this.#distribution !== value) {
|
|
110
|
-
this.#distribution = value;
|
|
111
|
-
if (this.#value != null) {
|
|
112
|
-
this.#next(this.#value);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
get distribution() {
|
|
117
|
-
return this.#distribution;
|
|
118
|
-
}
|
|
119
|
-
#distribution;
|
|
120
|
-
get value() {
|
|
121
|
-
return this.#value;
|
|
122
|
-
}
|
|
123
|
-
#value;
|
|
124
|
-
constructor(subject, name, distribution) {
|
|
125
|
-
this.name = name;
|
|
126
|
-
this.#subject = subject;
|
|
127
|
-
this.#distribution = distribution;
|
|
128
|
-
}
|
|
129
|
-
next(progress) {
|
|
130
|
-
return this.#next(progress);
|
|
131
|
-
}
|
|
132
|
-
complete() {
|
|
133
|
-
return this.#next(SEGMENT_COMPLETE);
|
|
134
|
-
}
|
|
135
|
-
#next(progress) {
|
|
136
|
-
this.#value = progress;
|
|
137
|
-
this.#subject.next({ name: this.name, distribution: this.distribution, progress });
|
|
138
|
-
return this;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3Mtc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9wcm9ncmVzcy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRXhILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUE7O0FBc0NqQyxNQUFNLGdCQUFnQixHQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDOUQsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO0FBRzlELE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRWEsY0FBUyxHQUEwQyxFQUFFLENBQUE7UUFFckQsV0FBTSxHQUFHLElBQUksT0FBTyxFQUF3QixDQUFBO1FBRTVDLFdBQU0sR0FBa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsSUFBSSxLQUFLLElB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Q1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO0lBQzdCLENBQUM7SUFDRCxhQUFhLENBQVM7SUFFdEIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxNQUFNLENBQVc7SUFFakIsWUFDSSxPQUFzQyxFQUN0QixJQUFZLEVBQzVCLFlBQXFCO1FBREwsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUc1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQTtJQUNyQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWtCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBa0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2xGLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZXMsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNjYW4sIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVdoaWxlIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gXCJsb2Rhc2gtZXNcIlxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gXCJ1dGlsaXR5LXR5cGVzXCJcblxuaW1wb3J0IHsgRGVlcFJlYWRvbmx5IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0NvbW1vbiB7XG4gICAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICAgIHJlYWRvbmx5IFtvdGhlcjogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzTGF4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImxheFwiXG4gICAgcmVhZG9ubHkgcHJlZGljdGVkVGltZTogbnVtYmVyXG4gICAgLy8gcmVhZG9ubHkgdXBkYXRlSW50ZXJ2YWw6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzRml4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImZpeFwiXG4gICAgcmVhZG9ubHkgcGVyY2VudDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzID0gKFByb2dyZXNzTGF4IHwgUHJvZ3Jlc3NGaXgpICYgUHJvZ3Jlc3NDb21tb25cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ21lbnRJbnB1dCB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgcHJvZ3Jlc3M6IERlZXBSZWFkb25seTxQcm9ncmVzcz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ2VtZW50IGV4dGVuZHMgUHJvZ3Jlc3NTZWdtZW50SW5wdXQge1xuICAgIHJhdGlvOiBudW1iZXJcbiAgICBzaGFyZTogbnVtYmVyXG4gICAgZG9uZTogYm9vbGVhblxuICAgIGxheEJlZ2luPzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzU2VnZW1lbnRzID0geyBba2V5OiBzdHJpbmddOiBQcm9ncmVzc1NlZ2VtZW50IH1cblxuY29uc3QgU0VHTUVOVF9SRUdJU1RFUjogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDAgfVxuY29uc3QgU0VHTUVOVF9DT01QTEVURTogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDEgfVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1N0YXRlIHtcbiAgICByZWFkb25seSAjc2VnbWVudHM6IHsgW2tleTogc3RyaW5nXTogUHJvZ3Jlc3NTZWdtZW50UmVmIH0gPSB7fVxuXG4gICAgcmVhZG9ubHkgI2lucHV0ID0gbmV3IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+KClcblxuICAgIHJlYWRvbmx5ICNzdGF0ZTogT2JzZXJ2YWJsZTxQcm9ncmVzc1NlZ2VtZW50cz4gPSB0aGlzLiNpbnB1dC5waXBlKFxuICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgIHNjYW4oKHN0YXRlLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoaXMuI2luaXRpYWxTdGF0ZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gc3RhdGVbaW5wdXQubmFtZV0gPz8geyByYXRpbzogMCwgc2hhcmU6IDAsIGRvbmU6IGZhbHNlIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIC4uLmlucHV0IH1cblxuICAgICAgICAgICAgaWYgKGlucHV0LnByb2dyZXNzLnR5cGUgPT09IFwibGF4XCIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY3VycmVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZG9uZSA9IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dC5wcm9ncmVzcy50eXBlID09PSBcImZpeFwiICYmIGlucHV0LnByb2dyZXNzLnBlcmNlbnQgPCAxKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5kb25lID0gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIFtpbnB1dC5uYW1lXTogeyAuLi5jdXJyZW50LCAuLi5pbnB1dCB9IH1cbiAgICAgICAgfSwge30gYXMgUHJvZ3Jlc3NTZWdlbWVudHMpLFxuICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2xpc3QgPSBPYmplY3QudmFsdWVzKHN0YXRlKSBhcyBBcnJheTxNdXRhYmxlPFByb2dyZXNzU2VnZW1lbnQ+PlxuICAgICAgICAgICAgY29uc3QgbWluID0gc2xpc3QucmVkdWNlKChtaW4sIGN1cnJlbnQpID0+IE1hdGgubWluKG1pbiwgY3VycmVudC5kaXN0cmlidXRpb24gfHwgMCksIEluZmluaXR5KSB8fCAxXG4gICAgICAgICAgICBjb25zdCB0b3RhbERpc3RyaWJ1dGlvbiA9IHNsaXN0LnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQuZGlzdHJpYnV0aW9uIHx8IG1pbiksIDApXG4gICAgICAgICAgICBjb25zdCBoYXNMYXggPSBzbGlzdC5zb21lKHNlZ21lbnQgPT4gc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKVxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IGhhc0xheCA/IGFuaW1hdGlvbkZyYW1lcygpIDogb2YoeyB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpIH0pXG5cbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IHRpbWVzdGFtcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuZGlzdHJpYnV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmRpc3RyaWJ1dGlvbiA9IG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5yYXRpbyA9IHNlZ21lbnQuZGlzdHJpYnV0aW9uIC8gdG90YWxEaXN0cmlidXRpb24gKyAwLjAwMDFcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBlcmNlbnQ6IG51bWJlclxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQubGF4QmVnaW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmxheEJlZ2luID0gdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIHNlZ21lbnQucHJvZ3Jlc3MucHJlZGljdGVkVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJjZW50ID49IDAuOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIChzZWdtZW50LnByb2dyZXNzLnByZWRpY3RlZFRpbWUgKiA1MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IDAuOCArIE1hdGgubG9nMXAoZmluYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VnbWVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBjbGFtcChzZWdtZW50LnByb2dyZXNzLnBlcmNlbnQsIDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuc2hhcmUgPSBwZXJjZW50ICogc2VnbWVudC5yYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5kb25lID0gcGVyY2VudCA+PSAxXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoc3RhdGUgPT4gT2JqZWN0LnZhbHVlcyhzdGF0ZSkuc29tZShzZWdtZW50ID0+ICFzZWdtZW50LmRvbmUpLCB0cnVlKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgIClcblxuICAgIHJlYWRvbmx5IHZhbHVlJDogT2JzZXJ2YWJsZTxEZWVwUmVhZG9ubHk8UHJvZ3Jlc3NTZWdlbWVudHM+PiA9IHRoaXMuI3N0YXRlXG4gICAgcmVhZG9ubHkgdmFsdWUgPSB0b1NpZ25hbCh0aGlzLnZhbHVlJClcblxuICAgIHJlYWRvbmx5IHBlcmNlbnQkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZhbHVlJC5waXBlKFxuICAgICAgICBtYXAodmFsdWUgPT5cbiAgICAgICAgICAgIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc2hhcmUsIDApLFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogMFxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgcGVyY2VudCA9IHRvU2lnbmFsKHRoaXMucGVyY2VudCQpXG5cbiAgICBzZWdtZW50KG5hbWU6IHN0cmluZywgZGlzdHJpYnV0aW9uOiBudW1iZXIgPSAxKTogUHJvZ3Jlc3NTZWdtZW50UmVmIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9XG4gICAgICAgICAgICB0aGlzLiNzZWdtZW50c1tuYW1lXSA/PyAodGhpcy4jc2VnbWVudHNbbmFtZV0gPSBuZXcgUHJvZ3Jlc3NTZWdtZW50UmVmKHRoaXMuI2lucHV0LCBuYW1lLCBkaXN0cmlidXRpb24pKVxuICAgICAgICBzZWdtZW50Lm5leHQoU0VHTUVOVF9SRUdJU1RFUilcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRcbiAgICB9XG5cbiAgICBjb25uZWN0KHN0YXRlOiBQcm9ncmVzc1N0YXRlLCBuYW1lOiBzdHJpbmcsIGRpc3RyaWJ1dGlvbj86IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudChuYW1lLCBkaXN0cmlidXRpb24pXG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucGVyY2VudCQuc3Vic2NyaWJlKHBlcmNlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQubmV4dCh7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI2luaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jc2VnbWVudHMpLnJlZHVjZSgocmVzLCBzZWdtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VnbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc1tzZWdtZW50Lm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWdtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogc2VnbWVudC5kaXN0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBzZWdtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByYXRpbzogMCxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9LCB7fSBhcyBQcm9ncmVzc1NlZ2VtZW50cylcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1NlZ21lbnRSZWYge1xuICAgIHJlYWRvbmx5ICNzdWJqZWN0OiBTdWJqZWN0PFByb2dyZXNzU2VnbWVudElucHV0PlxuXG4gICAgc2V0IGRpc3RyaWJ1dGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXN0cmlidXRpb24gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXN0cmlidXRpb24gPSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXh0KHRoaXMuI3ZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRpc3RyaWJ1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3RyaWJ1dGlvblxuICAgIH1cbiAgICAjZGlzdHJpYnV0aW9uPzogbnVtYmVyXG5cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZVxuICAgIH1cbiAgICAjdmFsdWU/OiBQcm9ncmVzc1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN1YmplY3Q6IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBkaXN0cmlidXRpb24/OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy4jc3ViamVjdCA9IHN1YmplY3RcbiAgICAgICAgdGhpcy4jZGlzdHJpYnV0aW9uID0gZGlzdHJpYnV0aW9uXG4gICAgfVxuXG4gICAgbmV4dChwcm9ncmVzczogUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25leHQocHJvZ3Jlc3MpXG4gICAgfVxuXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXh0KFNFR01FTlRfQ09NUExFVEUpXG4gICAgfVxuXG4gICAgI25leHQocHJvZ3Jlc3M6IFByb2dyZXNzKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlID0gcHJvZ3Jlc3NcbiAgICAgICAgdGhpcy4jc3ViamVjdC5uZXh0KHsgbmFtZTogdGhpcy5uYW1lLCBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLCBwcm9ncmVzcyB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Directive, input } from "@angular/core";
|
|
2
|
-
import { AbstractUiState, NOTSET } from "./abstract";
|
|
3
|
-
import { UiState } from "./ui-state";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class ReadonlyDirective extends AbstractUiState {
|
|
6
|
-
constructor() {
|
|
7
|
-
super("readonly");
|
|
8
|
-
this.input = input(NOTSET, { alias: "nuReadonly" });
|
|
9
|
-
this.when = input(NOTSET, { alias: "nuReadonlyWhen" });
|
|
10
|
-
}
|
|
11
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ReadonlyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
12
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: ReadonlyDirective, isStandalone: true, selector: "[nuReadonly], [nuReadonlyWhen]", inputs: { input: { classPropertyName: "input", publicName: "nuReadonly", isSignal: true, isRequired: false, transformFunction: null }, when: { classPropertyName: "when", publicName: "nuReadonlyWhen", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-readonly": "yes() ? 'true' : 'false'", "attr.readonly": "yes() ? '' : null" } }, providers: [UiState], exportAs: ["readonly"], usesInheritance: true, ngImport: i0 }); }
|
|
13
|
-
}
|
|
14
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ReadonlyDirective, decorators: [{
|
|
15
|
-
type: Directive,
|
|
16
|
-
args: [{
|
|
17
|
-
selector: "[nuReadonly], [nuReadonlyWhen]",
|
|
18
|
-
exportAs: "readonly",
|
|
19
|
-
standalone: true,
|
|
20
|
-
host: {
|
|
21
|
-
"[attr.aria-readonly]": "yes() ? 'true' : 'false'",
|
|
22
|
-
"[attr.readonly]": "yes() ? '' : null"
|
|
23
|
-
},
|
|
24
|
-
providers: [UiState]
|
|
25
|
-
}]
|
|
26
|
-
}], ctorParameters: () => [] });
|
|
27
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvdWktc3RhdGUvcmVhZG9ubHkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7O0FBWXBDLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUEyQjtJQUk5RDtRQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUpaLFVBQUssR0FBRyxLQUFLLENBQUMsTUFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELFNBQUksR0FBRyxLQUFLLENBQUMsTUFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFJcEUsQ0FBQzs4R0FOUSxpQkFBaUI7a0dBQWpCLGlCQUFpQix1Y0FGZixDQUFDLE9BQU8sQ0FBQzs7MkZBRVgsaUJBQWlCO2tCQVY3QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLHNCQUFzQixFQUFFLDBCQUEwQjt3QkFDbEQsaUJBQWlCLEVBQUUsbUJBQW1CO3FCQUN6QztvQkFDRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgQWJzdHJhY3RVaVN0YXRlLCBOT1RTRVQgfSBmcm9tIFwiLi9hYnN0cmFjdFwiXG5pbXBvcnQgeyBVaVN0YXRlIH0gZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVSZWFkb25seV0sIFtudVJlYWRvbmx5V2hlbl1cIixcbiAgICBleHBvcnRBczogXCJyZWFkb25seVwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICBcIlthdHRyLmFyaWEtcmVhZG9ubHldXCI6IFwieWVzKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCIsXG4gICAgICAgIFwiW2F0dHIucmVhZG9ubHldXCI6IFwieWVzKCkgPyAnJyA6IG51bGxcIlxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbVWlTdGF0ZV1cbn0pXG5leHBvcnQgY2xhc3MgUmVhZG9ubHlEaXJlY3RpdmUgZXh0ZW5kcyBBYnN0cmFjdFVpU3RhdGU8XCJyZWFkb25seVwiPiB7XG4gICAgcmVhZG9ubHkgaW5wdXQgPSBpbnB1dChOT1RTRVQgYXMgYm9vbGVhbiwgeyBhbGlhczogXCJudVJlYWRvbmx5XCIgfSlcbiAgICByZWFkb25seSB3aGVuID0gaW5wdXQoTk9UU0VUIGFzIHN0cmluZywgeyBhbGlhczogXCJudVJlYWRvbmx5V2hlblwiIH0pXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJyZWFkb25seVwiKVxuICAgIH1cbn1cbiJdfQ==
|
|
@@ -1,308 +0,0 @@
|
|
|
1
|
-
const COMPILE_CACHE = {};
|
|
2
|
-
export function compile(selector) {
|
|
3
|
-
return (COMPILE_CACHE[selector] ??= _compile(parse(selector)));
|
|
4
|
-
}
|
|
5
|
-
class Cursor {
|
|
6
|
-
get ch() {
|
|
7
|
-
return this.data[this.position];
|
|
8
|
-
}
|
|
9
|
-
constructor(data) {
|
|
10
|
-
this.data = data;
|
|
11
|
-
this.position = 0;
|
|
12
|
-
}
|
|
13
|
-
inc(value = 1) {
|
|
14
|
-
this.position += value;
|
|
15
|
-
return this;
|
|
16
|
-
}
|
|
17
|
-
eatWs() {
|
|
18
|
-
let end = this.position;
|
|
19
|
-
while (end < this.data.length && /[ \r\n\t]/.test(this.data[end])) {
|
|
20
|
-
end++;
|
|
21
|
-
}
|
|
22
|
-
this.position = end;
|
|
23
|
-
return this;
|
|
24
|
-
}
|
|
25
|
-
is(ch) {
|
|
26
|
-
if (ch.length === 1) {
|
|
27
|
-
return this.ch === ch;
|
|
28
|
-
}
|
|
29
|
-
const begin = this.position;
|
|
30
|
-
const end = begin + ch.length;
|
|
31
|
-
return this.data.substring(begin, end) === ch;
|
|
32
|
-
}
|
|
33
|
-
eof() {
|
|
34
|
-
return this.position >= this.data.length;
|
|
35
|
-
}
|
|
36
|
-
set(position) {
|
|
37
|
-
this.position = position;
|
|
38
|
-
return this;
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
/**
|
|
42
|
-
* expression:
|
|
43
|
-
* - "*": any
|
|
44
|
-
* - "name without dot": top level: eg. "busy" or "disabled", this is equal to "busy.*"
|
|
45
|
-
* - "name with dot": nested: eg. "busy.self" or "busy.loading"
|
|
46
|
-
* - negate: "!busy", "!busy.*", "!busy.save"
|
|
47
|
-
* - OR: "busy.* || !disabled.*"
|
|
48
|
-
* - AND: "busy.* && !disabled.*"
|
|
49
|
-
* - GROUP: "(busy || disabled) && !readonly"
|
|
50
|
-
* - Shorted of multiple source of same base: "busy{load,save}", if one of load or save is true, the result is true
|
|
51
|
-
*/
|
|
52
|
-
export function parse(selector) {
|
|
53
|
-
const cursor = new Cursor(selector);
|
|
54
|
-
const res = expression(cursor.eatWs());
|
|
55
|
-
if (res == null) {
|
|
56
|
-
throw new Error(`invalid selector: ${selector}`);
|
|
57
|
-
}
|
|
58
|
-
if (!cursor.eof()) {
|
|
59
|
-
throw new Error(`unexpected charcter: ${selector[res.end]} at ${res.end}`);
|
|
60
|
-
}
|
|
61
|
-
return res;
|
|
62
|
-
}
|
|
63
|
-
function expression(cursor) {
|
|
64
|
-
return binary(cursor) || leftExpr(cursor);
|
|
65
|
-
}
|
|
66
|
-
function leftExpr(cursor) {
|
|
67
|
-
const begin = cursor.position;
|
|
68
|
-
const left = unary(cursor) || group(cursor) || load(cursor);
|
|
69
|
-
if (left != null) {
|
|
70
|
-
return left;
|
|
71
|
-
}
|
|
72
|
-
cursor.set(begin);
|
|
73
|
-
return null;
|
|
74
|
-
}
|
|
75
|
-
function group(cursor) {
|
|
76
|
-
const begin = cursor.position;
|
|
77
|
-
if (cursor.is("(")) {
|
|
78
|
-
const expr = expression(cursor.inc().eatWs());
|
|
79
|
-
if (cursor.eatWs().is(")")) {
|
|
80
|
-
cursor.inc();
|
|
81
|
-
return binary(cursor.eatWs(), expr) || expr;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
cursor.set(begin);
|
|
85
|
-
return null;
|
|
86
|
-
}
|
|
87
|
-
function binary(cursor, left = null) {
|
|
88
|
-
const begin = cursor.position;
|
|
89
|
-
left = left ?? leftExpr(cursor);
|
|
90
|
-
if (left != null) {
|
|
91
|
-
cursor.eatWs();
|
|
92
|
-
const result = and(left, cursor) || or(left, cursor);
|
|
93
|
-
if (result != null) {
|
|
94
|
-
return result;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
cursor.set(begin);
|
|
98
|
-
return null;
|
|
99
|
-
}
|
|
100
|
-
function and(left, cursor) {
|
|
101
|
-
if (cursor.is("&&")) {
|
|
102
|
-
cursor.inc(2);
|
|
103
|
-
const right = expression(cursor.eatWs());
|
|
104
|
-
if (right == null) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
return { type: 5 /* TokenType.And */, left, right, begin: left.begin, end: cursor.position };
|
|
108
|
-
}
|
|
109
|
-
return null;
|
|
110
|
-
}
|
|
111
|
-
function or(left, cursor) {
|
|
112
|
-
if (cursor.is("||")) {
|
|
113
|
-
cursor.inc(2);
|
|
114
|
-
const right = expression(cursor.eatWs());
|
|
115
|
-
if (right == null) {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
return { type: 4 /* TokenType.Or */, left, right, begin: left.begin, end: cursor.position };
|
|
119
|
-
}
|
|
120
|
-
return null;
|
|
121
|
-
}
|
|
122
|
-
function unary(cursor) {
|
|
123
|
-
const begin = cursor.position;
|
|
124
|
-
if (cursor.is("!")) {
|
|
125
|
-
const expr = leftExpr(cursor.inc().eatWs());
|
|
126
|
-
if (expr != null) {
|
|
127
|
-
return { type: 3 /* TokenType.Negate */, value: expr, begin, end: cursor.position };
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
cursor.set(begin);
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
function load(cursor) {
|
|
134
|
-
cursor.eatWs();
|
|
135
|
-
const _any = any(cursor);
|
|
136
|
-
if (_any != null) {
|
|
137
|
-
return _any;
|
|
138
|
-
}
|
|
139
|
-
const base = name(cursor);
|
|
140
|
-
if (base == null) {
|
|
141
|
-
return null;
|
|
142
|
-
}
|
|
143
|
-
cursor.eatWs();
|
|
144
|
-
const sub = loadSingle(cursor) || loadMulti(cursor);
|
|
145
|
-
if (sub == null) {
|
|
146
|
-
return base;
|
|
147
|
-
}
|
|
148
|
-
else if (Array.isArray(sub)) {
|
|
149
|
-
return {
|
|
150
|
-
type: 8 /* TokenType.MultiSubscript */,
|
|
151
|
-
base,
|
|
152
|
-
subscripts: sub,
|
|
153
|
-
begin: base.begin,
|
|
154
|
-
end: sub[sub.length - 1].end
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
else {
|
|
158
|
-
return { type: 7 /* TokenType.Subscript */, base, subscript: sub, begin: base.begin, end: sub.end };
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
function loadSingle(cursor) {
|
|
162
|
-
const begin = cursor.position;
|
|
163
|
-
if (cursor.is(".")) {
|
|
164
|
-
cursor.inc().eatWs();
|
|
165
|
-
const prop = any(cursor) || name(cursor);
|
|
166
|
-
if (prop != null) {
|
|
167
|
-
return prop;
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
cursor.set(begin);
|
|
171
|
-
return null;
|
|
172
|
-
}
|
|
173
|
-
function loadMulti(cursor) {
|
|
174
|
-
const begin = cursor.position;
|
|
175
|
-
if (cursor.is("{")) {
|
|
176
|
-
const names = [];
|
|
177
|
-
let entry = null;
|
|
178
|
-
cursor.inc().eatWs();
|
|
179
|
-
while ((entry = name(cursor))) {
|
|
180
|
-
names.push(entry);
|
|
181
|
-
cursor.eatWs();
|
|
182
|
-
if (cursor.is(",")) {
|
|
183
|
-
cursor.inc();
|
|
184
|
-
}
|
|
185
|
-
cursor.eatWs();
|
|
186
|
-
if (cursor.is("}")) {
|
|
187
|
-
if (names.length === 0) {
|
|
188
|
-
throw new Error("expected name");
|
|
189
|
-
}
|
|
190
|
-
cursor.inc();
|
|
191
|
-
return names;
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
}
|
|
195
|
-
cursor.set(begin);
|
|
196
|
-
return null;
|
|
197
|
-
}
|
|
198
|
-
function name(cursor) {
|
|
199
|
-
const begin = cursor.position;
|
|
200
|
-
while (!cursor.eof() && isNameCh(cursor.ch)) {
|
|
201
|
-
cursor.inc();
|
|
202
|
-
}
|
|
203
|
-
if (cursor.position > begin) {
|
|
204
|
-
return { type: 2 /* TokenType.Name */, begin, end: cursor.position, value: cursor.data.slice(begin, cursor.position) };
|
|
205
|
-
}
|
|
206
|
-
cursor.set(begin);
|
|
207
|
-
return null;
|
|
208
|
-
}
|
|
209
|
-
function isNameCh(ch) {
|
|
210
|
-
return /[^.,{}()!\s&|]/.test(ch);
|
|
211
|
-
}
|
|
212
|
-
function any(cursor) {
|
|
213
|
-
if (cursor.is("*")) {
|
|
214
|
-
const begin = cursor.position;
|
|
215
|
-
cursor.inc();
|
|
216
|
-
return { type: 1 /* TokenType.Any */, begin, end: cursor.position };
|
|
217
|
-
}
|
|
218
|
-
return null;
|
|
219
|
-
}
|
|
220
|
-
function _compile(ast, parent) {
|
|
221
|
-
switch (ast.type) {
|
|
222
|
-
case 1 /* TokenType.Any */:
|
|
223
|
-
return compileAny(ast, parent);
|
|
224
|
-
case 7 /* TokenType.Subscript */:
|
|
225
|
-
return compileSubscript(ast, parent);
|
|
226
|
-
case 8 /* TokenType.MultiSubscript */:
|
|
227
|
-
return compileMultiSubscript(ast, parent);
|
|
228
|
-
case 2 /* TokenType.Name */:
|
|
229
|
-
return compileName(ast, parent);
|
|
230
|
-
case 3 /* TokenType.Negate */:
|
|
231
|
-
return compileNot(_compile(ast.value, parent));
|
|
232
|
-
case 4 /* TokenType.Or */:
|
|
233
|
-
return compileOr(_compile(ast.left, parent), _compile(ast.right, parent));
|
|
234
|
-
case 5 /* TokenType.And */:
|
|
235
|
-
return compileAnd(_compile(ast.left, parent), _compile(ast.right, parent));
|
|
236
|
-
}
|
|
237
|
-
return () => false;
|
|
238
|
-
}
|
|
239
|
-
function compileAny(ast, parent) {
|
|
240
|
-
if (parent) {
|
|
241
|
-
return v => {
|
|
242
|
-
if (v[parent] == null) {
|
|
243
|
-
return false;
|
|
244
|
-
}
|
|
245
|
-
return Object.values(v[parent]).some(v => v === true);
|
|
246
|
-
};
|
|
247
|
-
}
|
|
248
|
-
else {
|
|
249
|
-
return v => {
|
|
250
|
-
for (const entry of Object.values(v)) {
|
|
251
|
-
if (Object.values(entry).some(v => v === true)) {
|
|
252
|
-
return true;
|
|
253
|
-
}
|
|
254
|
-
}
|
|
255
|
-
return false;
|
|
256
|
-
};
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
function compileSubscript(ast, parent) {
|
|
260
|
-
parent ??= ast.base.value;
|
|
261
|
-
if (ast.subscript.type === 1 /* TokenType.Any */) {
|
|
262
|
-
return compileAny(ast.subscript, parent);
|
|
263
|
-
}
|
|
264
|
-
if (ast.subscript.type === 2 /* TokenType.Name */) {
|
|
265
|
-
return compileName(ast.subscript, parent);
|
|
266
|
-
}
|
|
267
|
-
return () => false;
|
|
268
|
-
}
|
|
269
|
-
function compileMultiSubscript(ast, parent) {
|
|
270
|
-
parent ??= ast.base.value;
|
|
271
|
-
const values = ast.subscripts.map(v => compileSubscript({ type: 7 /* TokenType.Subscript */, base: ast.base, subscript: v, begin: v.begin, end: v.end }, parent));
|
|
272
|
-
if (values.length === 1) {
|
|
273
|
-
return values[0];
|
|
274
|
-
}
|
|
275
|
-
else {
|
|
276
|
-
let result = values[0];
|
|
277
|
-
for (let i = 1; i < values.length; i++) {
|
|
278
|
-
result = compileOr(result, values[i]);
|
|
279
|
-
}
|
|
280
|
-
return result;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function compileName(ast, parent) {
|
|
284
|
-
if (parent) {
|
|
285
|
-
return v => {
|
|
286
|
-
if (v[parent] == null) {
|
|
287
|
-
return false;
|
|
288
|
-
}
|
|
289
|
-
return !!v[parent][ast.value];
|
|
290
|
-
};
|
|
291
|
-
}
|
|
292
|
-
else {
|
|
293
|
-
return v => {
|
|
294
|
-
const many = v[ast.value];
|
|
295
|
-
return many != null && Object.values(many).some(v => v === true);
|
|
296
|
-
};
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
function compileNot(compiled) {
|
|
300
|
-
return v => !compiled(v);
|
|
301
|
-
}
|
|
302
|
-
function compileOr(left, right) {
|
|
303
|
-
return v => left(v) || right(v);
|
|
304
|
-
}
|
|
305
|
-
function compileAnd(left, right) {
|
|
306
|
-
return v => left(v) && right(v);
|
|
307
|
-
}
|
|
308
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9zZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyREEsTUFBTSxhQUFhLEdBQXdDLEVBQUUsQ0FBQTtBQUM3RCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEUsQ0FBQztBQUVELE1BQU0sTUFBTTtJQUdSLElBQUksRUFBRTtRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELFlBQXFCLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBTmpDLGFBQVEsR0FBVyxDQUFDLENBQUE7SUFNZ0IsQ0FBQztJQUVyQyxHQUFHLENBQUMsUUFBZ0IsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQTtRQUN0QixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUN2QixPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hFLEdBQUcsRUFBRSxDQUFBO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFBO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELEVBQUUsQ0FBQyxFQUFVO1FBQ1QsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ2xCLE9BQU8sSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUE7UUFDekIsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUE7UUFDM0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUE7UUFDN0IsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFBO0lBQ2pELENBQUM7SUFFRCxHQUFHO1FBQ0MsT0FBTyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQzVDLENBQUM7SUFFRCxHQUFHLENBQUMsUUFBZ0I7UUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUE7UUFDeEIsT0FBTyxJQUFJLENBQUE7SUFDZixDQUFDO0NBQ0o7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FBQyxRQUFnQjtJQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUNuQyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7SUFDdEMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixRQUFRLEVBQUUsQ0FBQyxDQUFBO0lBQ3BELENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUM7UUFDaEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQTtJQUM5RSxDQUFDO0lBQ0QsT0FBTyxHQUFHLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsTUFBYztJQUM5QixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDN0MsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLE1BQWM7SUFDNUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtJQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUMzRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDakIsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBUyxLQUFLLENBQUMsTUFBYztJQUN6QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO0lBQzdCLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2pCLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUM3QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN6QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDWixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFBO1FBQy9DLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLE1BQU0sQ0FBQyxNQUFjLEVBQUUsT0FBMkIsSUFBSTtJQUMzRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO0lBQzdCLElBQUksR0FBRyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFBO0lBQy9CLElBQUksSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2YsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ2QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3BELElBQUksTUFBTSxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pCLE9BQU8sTUFBTSxDQUFBO1FBQ2pCLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxJQUFpQixFQUFFLE1BQWM7SUFDMUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7UUFDbEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUNiLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUN4QyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUNoQixPQUFPLElBQUksQ0FBQTtRQUNmLENBQUM7UUFDRCxPQUFPLEVBQUUsSUFBSSx1QkFBZSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUN4RixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBUyxFQUFFLENBQUMsSUFBaUIsRUFBRSxNQUFjO0lBQ3pDLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQ2xCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDYixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDeEMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUE7UUFDZixDQUFDO1FBQ0QsT0FBTyxFQUFFLElBQUksc0JBQWMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDdkYsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLE1BQWM7SUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtJQUM3QixJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNqQixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDM0MsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDZixPQUFPLEVBQUUsSUFBSSwwQkFBa0IsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBQy9FLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLElBQUksQ0FBQyxNQUFjO0lBQ3hCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNkLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN4QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN6QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUNkLE1BQU0sR0FBRyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbkQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDZCxPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUM1QixPQUFPO1lBQ0gsSUFBSSxrQ0FBMEI7WUFDOUIsSUFBSTtZQUNKLFVBQVUsRUFBRSxHQUFHO1lBQ2YsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHO1NBQy9CLENBQUE7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sRUFBRSxJQUFJLDZCQUFxQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUE7SUFDL0YsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxNQUFjO0lBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFDN0IsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDeEMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUM7WUFDZixPQUFPLElBQUksQ0FBQTtRQUNmLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxNQUFjO0lBQzdCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUE7SUFDN0IsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsRUFBZSxDQUFBO1FBQzdCLElBQUksS0FBSyxHQUFtQixJQUFJLENBQUE7UUFFaEMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFBO1FBQ3BCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUVkLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7WUFDaEIsQ0FBQztZQUVELE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUNkLElBQUksTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUNqQixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7b0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUE7Z0JBQ3BDLENBQUM7Z0JBQ0QsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFBO2dCQUNaLE9BQU8sS0FBSyxDQUFBO1lBQ2hCLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUE7SUFDakIsT0FBTyxJQUFJLENBQUE7QUFDZixDQUFDO0FBRUQsU0FBUyxJQUFJLENBQUMsTUFBYztJQUN4QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFBO0lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQzFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQTtJQUNoQixDQUFDO0lBQ0QsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLEtBQUssRUFBRSxDQUFDO1FBQzFCLE9BQU8sRUFBRSxJQUFJLHdCQUFnQixFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFBO0lBQ2xILENBQUM7SUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pCLE9BQU8sSUFBSSxDQUFBO0FBQ2YsQ0FBQztBQUVELFNBQVMsUUFBUSxDQUFDLEVBQVU7SUFDeEIsT0FBTyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7QUFDcEMsQ0FBQztBQUVELFNBQVMsR0FBRyxDQUFDLE1BQWM7SUFDdkIsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDakIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQTtRQUM3QixNQUFNLENBQUMsR0FBRyxFQUFFLENBQUE7UUFDWixPQUFPLEVBQUUsSUFBSSx1QkFBZSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFBO0lBQy9ELENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQTtBQUNmLENBQUM7QUFFRCxTQUFTLFFBQVEsQ0FBQyxHQUFnQixFQUFFLE1BQWU7SUFDL0MsUUFBUSxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZjtZQUNJLE9BQU8sVUFBVSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUNsQztZQUNJLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3hDO1lBQ0ksT0FBTyxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDN0M7WUFDSSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkM7WUFDSSxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFBO1FBQ2xEO1lBQ0ksT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtRQUM3RTtZQUNJLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDbEYsQ0FBQztJQUNELE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFBO0FBQ3RCLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxHQUFXLEVBQUUsTUFBZTtJQUM1QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLENBQUMsRUFBRTtZQUNQLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQTtZQUNoQixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUN6RCxDQUFDLENBQUE7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sQ0FBQyxDQUFDLEVBQUU7WUFDUCxLQUFLLE1BQU0sS0FBSyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUM3QyxPQUFPLElBQUksQ0FBQTtnQkFDZixDQUFDO1lBQ0wsQ0FBQztZQUNELE9BQU8sS0FBSyxDQUFBO1FBQ2hCLENBQUMsQ0FBQTtJQUNMLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxHQUFpQixFQUFFLE1BQWU7SUFDeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBO0lBRXpCLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLDBCQUFrQixFQUFFLENBQUM7UUFDdkMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQTtJQUM1QyxDQUFDO0lBQ0QsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksMkJBQW1CLEVBQUUsQ0FBQztRQUN4QyxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBQzdDLENBQUM7SUFFRCxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQTtBQUN0QixDQUFDO0FBRUQsU0FBUyxxQkFBcUIsQ0FBQyxHQUFzQixFQUFFLE1BQWU7SUFDbEUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBO0lBQ3pCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQ2xDLGdCQUFnQixDQUNaLEVBQUUsSUFBSSw2QkFBcUIsRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQ3ZGLE1BQU0sQ0FDVCxDQUNKLENBQUE7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdEIsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDcEIsQ0FBQztTQUFNLENBQUM7UUFDSixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUE7UUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNyQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtRQUN6QyxDQUFDO1FBQ0QsT0FBTyxNQUFNLENBQUE7SUFDakIsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxHQUFZLEVBQUUsTUFBZTtJQUM5QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1FBQ1QsT0FBTyxDQUFDLENBQUMsRUFBRTtZQUNQLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUNwQixPQUFPLEtBQUssQ0FBQTtZQUNoQixDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUNqQyxDQUFDLENBQUE7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNKLE9BQU8sQ0FBQyxDQUFDLEVBQUU7WUFDUCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3pCLE9BQU8sSUFBSSxJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQTtRQUNwRSxDQUFDLENBQUE7SUFDTCxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLFFBQTBCO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBc0IsRUFBRSxLQUF1QjtJQUM5RCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBc0IsRUFBRSxLQUF1QjtJQUMvRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVaVN0YXRlRGV0YWlscyB9IGZyb20gXCIuL3VpLXN0YXRlXCJcblxuZXhwb3J0IHR5cGUgQ29tcGlsZWRTZWxlY3RvciA9IChzdGF0ZTogVWlTdGF0ZURldGFpbHMpID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGVudW0gVG9rZW5UeXBlIHtcbiAgICBBbnkgPSAxLFxuICAgIE5hbWUgPSAyLFxuICAgIE5lZ2F0ZSA9IDMsXG4gICAgT3IgPSA0LFxuICAgIEFuZCA9IDUsXG4gICAgU3Vic2NyaXB0ID0gNyxcbiAgICBNdWx0aVN1YnNjcmlwdCA9IDhcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RCYXNlIHtcbiAgICBiZWdpbjogbnVtYmVyXG4gICAgZW5kOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RBbnkgZXh0ZW5kcyBBc3RCYXNlIHtcbiAgICB0eXBlOiBUb2tlblR5cGUuQW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0TmFtZSBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5OYW1lXG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzdE5lZ2F0ZSBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5OZWdhdGVcbiAgICB2YWx1ZTogU2VsZWN0b3JBc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RPciBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5PclxuICAgIGxlZnQ6IFNlbGVjdG9yQXN0XG4gICAgcmlnaHQ6IFNlbGVjdG9yQXN0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0QW5kIGV4dGVuZHMgQXN0QmFzZSB7XG4gICAgdHlwZTogVG9rZW5UeXBlLkFuZFxuICAgIGxlZnQ6IFNlbGVjdG9yQXN0XG4gICAgcmlnaHQ6IFNlbGVjdG9yQXN0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0U3Vic2NyaXB0IGV4dGVuZHMgQXN0QmFzZSB7XG4gICAgdHlwZTogVG9rZW5UeXBlLlN1YnNjcmlwdFxuICAgIGJhc2U6IEFzdE5hbWVcbiAgICBzdWJzY3JpcHQ6IEFzdEFueSB8IEFzdE5hbWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RNdWx0aVN1YnNjcmlwdCBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5NdWx0aVN1YnNjcmlwdFxuICAgIGJhc2U6IEFzdE5hbWVcbiAgICBzdWJzY3JpcHRzOiBBc3ROYW1lW11cbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0b3JBc3QgPSBBc3RBbnkgfCBBc3ROYW1lIHwgQXN0TmVnYXRlIHwgQXN0T3IgfCBBc3RBbmQgfCBBc3RTdWJzY3JpcHQgfCBBc3RNdWx0aVN1YnNjcmlwdFxuXG5jb25zdCBDT01QSUxFX0NBQ0hFOiB7IFtrZXk6IHN0cmluZ106IENvbXBpbGVkU2VsZWN0b3IgfSA9IHt9XG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZShzZWxlY3Rvcjogc3RyaW5nKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcmV0dXJuIChDT01QSUxFX0NBQ0hFW3NlbGVjdG9yXSA/Pz0gX2NvbXBpbGUocGFyc2Uoc2VsZWN0b3IpKSlcbn1cblxuY2xhc3MgQ3Vyc29yIHtcbiAgICBwb3NpdGlvbjogbnVtYmVyID0gMFxuXG4gICAgZ2V0IGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb25dXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgZGF0YTogc3RyaW5nKSB7fVxuXG4gICAgaW5jKHZhbHVlOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gKz0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBlYXRXcygpIHtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMucG9zaXRpb25cbiAgICAgICAgd2hpbGUgKGVuZCA8IHRoaXMuZGF0YS5sZW5ndGggJiYgL1sgXFxyXFxuXFx0XS8udGVzdCh0aGlzLmRhdGFbZW5kXSkpIHtcbiAgICAgICAgICAgIGVuZCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGVuZFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlzKGNoOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2ggPT09IGNoXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmVnaW4gPSB0aGlzLnBvc2l0aW9uXG4gICAgICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2gubGVuZ3RoXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc3Vic3RyaW5nKGJlZ2luLCBlbmQpID09PSBjaFxuICAgIH1cblxuICAgIGVvZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24gPj0gdGhpcy5kYXRhLmxlbmd0aFxuICAgIH1cblxuICAgIHNldChwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cblxuLyoqXG4gKiBleHByZXNzaW9uOlxuICogIC0gXCIqXCI6IGFueVxuICogIC0gXCJuYW1lIHdpdGhvdXQgZG90XCI6IHRvcCBsZXZlbDogZWcuIFwiYnVzeVwiIG9yIFwiZGlzYWJsZWRcIiwgdGhpcyBpcyBlcXVhbCB0byBcImJ1c3kuKlwiXG4gKiAgLSBcIm5hbWUgd2l0aCBkb3RcIjogbmVzdGVkOiBlZy4gXCJidXN5LnNlbGZcIiBvciBcImJ1c3kubG9hZGluZ1wiXG4gKiAgLSBuZWdhdGU6IFwiIWJ1c3lcIiwgXCIhYnVzeS4qXCIsIFwiIWJ1c3kuc2F2ZVwiXG4gKiAgLSBPUjogXCJidXN5LiogfHwgIWRpc2FibGVkLipcIlxuICogIC0gQU5EOiBcImJ1c3kuKiAmJiAhZGlzYWJsZWQuKlwiXG4gKiAgLSBHUk9VUDogXCIoYnVzeSB8fCBkaXNhYmxlZCkgJiYgIXJlYWRvbmx5XCJcbiAqICAtIFNob3J0ZWQgb2YgbXVsdGlwbGUgc291cmNlIG9mIHNhbWUgYmFzZTogXCJidXN5e2xvYWQsc2F2ZX1cIiwgaWYgb25lIG9mIGxvYWQgb3Igc2F2ZSBpcyB0cnVlLCB0aGUgcmVzdWx0IGlzIHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHNlbGVjdG9yOiBzdHJpbmcpOiBTZWxlY3RvckFzdCB7XG4gICAgY29uc3QgY3Vyc29yID0gbmV3IEN1cnNvcihzZWxlY3RvcilcbiAgICBjb25zdCByZXMgPSBleHByZXNzaW9uKGN1cnNvci5lYXRXcygpKVxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc2VsZWN0b3I6ICR7c2VsZWN0b3J9YClcbiAgICB9XG5cbiAgICBpZiAoIWN1cnNvci5lb2YoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgY2hhcmN0ZXI6ICR7c2VsZWN0b3JbcmVzLmVuZF19IGF0ICR7cmVzLmVuZH1gKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGV4cHJlc3Npb24oY3Vyc29yOiBDdXJzb3IpIHtcbiAgICByZXR1cm4gYmluYXJ5KGN1cnNvcikgfHwgbGVmdEV4cHIoY3Vyc29yKVxufVxuXG5mdW5jdGlvbiBsZWZ0RXhwcihjdXJzb3I6IEN1cnNvcikge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgY29uc3QgbGVmdCA9IHVuYXJ5KGN1cnNvcikgfHwgZ3JvdXAoY3Vyc29yKSB8fCBsb2FkKGN1cnNvcilcbiAgICBpZiAobGVmdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsZWZ0XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ3JvdXAoY3Vyc29yOiBDdXJzb3IpOiBTZWxlY3RvckFzdCB8IG51bGwge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgaWYgKGN1cnNvci5pcyhcIihcIikpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24oY3Vyc29yLmluYygpLmVhdFdzKCkpXG4gICAgICAgIGlmIChjdXJzb3IuZWF0V3MoKS5pcyhcIilcIikpIHtcbiAgICAgICAgICAgIGN1cnNvci5pbmMoKVxuICAgICAgICAgICAgcmV0dXJuIGJpbmFyeShjdXJzb3IuZWF0V3MoKSwgZXhwcikgfHwgZXhwclxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gYmluYXJ5KGN1cnNvcjogQ3Vyc29yLCBsZWZ0OiBTZWxlY3RvckFzdCB8IG51bGwgPSBudWxsKTogU2VsZWN0b3JBc3QgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIGxlZnQgPSBsZWZ0ID8/IGxlZnRFeHByKGN1cnNvcilcbiAgICBpZiAobGVmdCAhPSBudWxsKSB7XG4gICAgICAgIGN1cnNvci5lYXRXcygpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFuZChsZWZ0LCBjdXJzb3IpIHx8IG9yKGxlZnQsIGN1cnNvcilcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3Vyc29yLnNldChiZWdpbilcbiAgICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBhbmQobGVmdDogU2VsZWN0b3JBc3QsIGN1cnNvcjogQ3Vyc29yKTogQXN0QW5kIHwgbnVsbCB7XG4gICAgaWYgKGN1cnNvci5pcyhcIiYmXCIpKSB7XG4gICAgICAgIGN1cnNvci5pbmMoMilcbiAgICAgICAgY29uc3QgcmlnaHQgPSBleHByZXNzaW9uKGN1cnNvci5lYXRXcygpKVxuICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuQW5kLCBsZWZ0LCByaWdodCwgYmVnaW46IGxlZnQuYmVnaW4sIGVuZDogY3Vyc29yLnBvc2l0aW9uIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gb3IobGVmdDogU2VsZWN0b3JBc3QsIGN1cnNvcjogQ3Vyc29yKTogQXN0T3IgfCBudWxsIHtcbiAgICBpZiAoY3Vyc29yLmlzKFwifHxcIikpIHtcbiAgICAgICAgY3Vyc29yLmluYygyKVxuICAgICAgICBjb25zdCByaWdodCA9IGV4cHJlc3Npb24oY3Vyc29yLmVhdFdzKCkpXG4gICAgICAgIGlmIChyaWdodCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRva2VuVHlwZS5PciwgbGVmdCwgcmlnaHQsIGJlZ2luOiBsZWZ0LmJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHVuYXJ5KGN1cnNvcjogQ3Vyc29yKTogU2VsZWN0b3JBc3QgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIGlmIChjdXJzb3IuaXMoXCIhXCIpKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBsZWZ0RXhwcihjdXJzb3IuaW5jKCkuZWF0V3MoKSlcbiAgICAgICAgaWYgKGV4cHIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogVG9rZW5UeXBlLk5lZ2F0ZSwgdmFsdWU6IGV4cHIsIGJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3Vyc29yLnNldChiZWdpbilcbiAgICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBsb2FkKGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgQXN0TmFtZSB8IEFzdFN1YnNjcmlwdCB8IEFzdE11bHRpU3Vic2NyaXB0IHwgbnVsbCB7XG4gICAgY3Vyc29yLmVhdFdzKClcbiAgICBjb25zdCBfYW55ID0gYW55KGN1cnNvcilcbiAgICBpZiAoX2FueSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBfYW55XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IG5hbWUoY3Vyc29yKVxuICAgIGlmIChiYXNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjdXJzb3IuZWF0V3MoKVxuICAgIGNvbnN0IHN1YiA9IGxvYWRTaW5nbGUoY3Vyc29yKSB8fCBsb2FkTXVsdGkoY3Vyc29yKVxuICAgIGlmIChzdWIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYmFzZVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdWIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuTXVsdGlTdWJzY3JpcHQsXG4gICAgICAgICAgICBiYXNlLFxuICAgICAgICAgICAgc3Vic2NyaXB0czogc3ViLFxuICAgICAgICAgICAgYmVnaW46IGJhc2UuYmVnaW4sXG4gICAgICAgICAgICBlbmQ6IHN1YltzdWIubGVuZ3RoIC0gMV0uZW5kXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuU3Vic2NyaXB0LCBiYXNlLCBzdWJzY3JpcHQ6IHN1YiwgYmVnaW46IGJhc2UuYmVnaW4sIGVuZDogc3ViLmVuZCB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2FkU2luZ2xlKGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgQXN0TmFtZSB8IG51bGwge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgaWYgKGN1cnNvci5pcyhcIi5cIikpIHtcbiAgICAgICAgY3Vyc29yLmluYygpLmVhdFdzKClcbiAgICAgICAgY29uc3QgcHJvcCA9IGFueShjdXJzb3IpIHx8IG5hbWUoY3Vyc29yKVxuICAgICAgICBpZiAocHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcFxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbG9hZE11bHRpKGN1cnNvcjogQ3Vyc29yKTogQXN0TmFtZVtdIHwgbnVsbCB7XG4gICAgY29uc3QgYmVnaW4gPSBjdXJzb3IucG9zaXRpb25cbiAgICBpZiAoY3Vyc29yLmlzKFwie1wiKSkge1xuICAgICAgICBjb25zdCBuYW1lcyA9IFtdIGFzIEFzdE5hbWVbXVxuICAgICAgICBsZXQgZW50cnk6IEFzdE5hbWUgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGN1cnNvci5pbmMoKS5lYXRXcygpXG4gICAgICAgIHdoaWxlICgoZW50cnkgPSBuYW1lKGN1cnNvcikpKSB7XG4gICAgICAgICAgICBuYW1lcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgY3Vyc29yLmVhdFdzKClcblxuICAgICAgICAgICAgaWYgKGN1cnNvci5pcyhcIixcIikpIHtcbiAgICAgICAgICAgICAgICBjdXJzb3IuaW5jKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3Vyc29yLmVhdFdzKClcbiAgICAgICAgICAgIGlmIChjdXJzb3IuaXMoXCJ9XCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBuYW1lXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnNvci5pbmMoKVxuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbmFtZShjdXJzb3I6IEN1cnNvcik6IEFzdE5hbWUgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIHdoaWxlICghY3Vyc29yLmVvZigpICYmIGlzTmFtZUNoKGN1cnNvci5jaCkpIHtcbiAgICAgICAgY3Vyc29yLmluYygpXG4gICAgfVxuICAgIGlmIChjdXJzb3IucG9zaXRpb24gPiBiZWdpbikge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuTmFtZSwgYmVnaW4sIGVuZDogY3Vyc29yLnBvc2l0aW9uLCB2YWx1ZTogY3Vyc29yLmRhdGEuc2xpY2UoYmVnaW4sIGN1cnNvci5wb3NpdGlvbikgfVxuICAgIH1cbiAgICBjdXJzb3Iuc2V0KGJlZ2luKVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzTmFtZUNoKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL1teLix7fSgpIVxccyZ8XS8udGVzdChjaClcbn1cblxuZnVuY3Rpb24gYW55KGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgbnVsbCB7XG4gICAgaWYgKGN1cnNvci5pcyhcIipcIikpIHtcbiAgICAgICAgY29uc3QgYmVnaW4gPSBjdXJzb3IucG9zaXRpb25cbiAgICAgICAgY3Vyc29yLmluYygpXG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRva2VuVHlwZS5BbnksIGJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIF9jb21waWxlKGFzdDogU2VsZWN0b3JBc3QsIHBhcmVudD86IHN0cmluZyk6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQW55OlxuICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVBbnkoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlN1YnNjcmlwdDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlU3Vic2NyaXB0KGFzdCwgcGFyZW50KVxuICAgICAgICBjYXNlIFRva2VuVHlwZS5NdWx0aVN1YnNjcmlwdDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlTXVsdGlTdWJzY3JpcHQoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLk5hbWU6XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU5hbWUoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLk5lZ2F0ZTpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlTm90KF9jb21waWxlKGFzdC52YWx1ZSwgcGFyZW50KSlcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuT3I6XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU9yKF9jb21waWxlKGFzdC5sZWZ0LCBwYXJlbnQpLCBfY29tcGlsZShhc3QucmlnaHQsIHBhcmVudCkpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFuZDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlQW5kKF9jb21waWxlKGFzdC5sZWZ0LCBwYXJlbnQpLCBfY29tcGlsZShhc3QucmlnaHQsIHBhcmVudCkpXG4gICAgfVxuICAgIHJldHVybiAoKSA9PiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjb21waWxlQW55KGFzdDogQXN0QW55LCBwYXJlbnQ/OiBzdHJpbmcpOiBDb21waWxlZFNlbGVjdG9yIHtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHJldHVybiB2ID0+IHtcbiAgICAgICAgICAgIGlmICh2W3BhcmVudF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModltwYXJlbnRdKS5zb21lKHYgPT4gdiA9PT0gdHJ1ZSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LnZhbHVlcyh2KSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QudmFsdWVzKGVudHJ5KS5zb21lKHYgPT4gdiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZVN1YnNjcmlwdChhc3Q6IEFzdFN1YnNjcmlwdCwgcGFyZW50Pzogc3RyaW5nKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcGFyZW50ID8/PSBhc3QuYmFzZS52YWx1ZVxuXG4gICAgaWYgKGFzdC5zdWJzY3JpcHQudHlwZSA9PT0gVG9rZW5UeXBlLkFueSkge1xuICAgICAgICByZXR1cm4gY29tcGlsZUFueShhc3Quc3Vic2NyaXB0LCBwYXJlbnQpXG4gICAgfVxuICAgIGlmIChhc3Quc3Vic2NyaXB0LnR5cGUgPT09IFRva2VuVHlwZS5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjb21waWxlTmFtZShhc3Quc3Vic2NyaXB0LCBwYXJlbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVNdWx0aVN1YnNjcmlwdChhc3Q6IEFzdE11bHRpU3Vic2NyaXB0LCBwYXJlbnQ/OiBzdHJpbmcpOiBDb21waWxlZFNlbGVjdG9yIHtcbiAgICBwYXJlbnQgPz89IGFzdC5iYXNlLnZhbHVlXG4gICAgY29uc3QgdmFsdWVzID0gYXN0LnN1YnNjcmlwdHMubWFwKHYgPT5cbiAgICAgICAgY29tcGlsZVN1YnNjcmlwdChcbiAgICAgICAgICAgIHsgdHlwZTogVG9rZW5UeXBlLlN1YnNjcmlwdCwgYmFzZTogYXN0LmJhc2UsIHN1YnNjcmlwdDogdiwgYmVnaW46IHYuYmVnaW4sIGVuZDogdi5lbmQgfSxcbiAgICAgICAgICAgIHBhcmVudFxuICAgICAgICApXG4gICAgKVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1swXVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2YWx1ZXNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBpbGVPcihyZXN1bHQsIHZhbHVlc1tpXSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21waWxlTmFtZShhc3Q6IEFzdE5hbWUsIHBhcmVudD86IHN0cmluZyk6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHYgPT4ge1xuICAgICAgICAgICAgaWYgKHZbcGFyZW50XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gISF2W3BhcmVudF1bYXN0LnZhbHVlXVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHYgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWFueSA9IHZbYXN0LnZhbHVlXVxuICAgICAgICAgICAgcmV0dXJuIG1hbnkgIT0gbnVsbCAmJiBPYmplY3QudmFsdWVzKG1hbnkpLnNvbWUodiA9PiB2ID09PSB0cnVlKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21waWxlTm90KGNvbXBpbGVkOiBDb21waWxlZFNlbGVjdG9yKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcmV0dXJuIHYgPT4gIWNvbXBpbGVkKHYpXG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVPcihsZWZ0OiBDb21waWxlZFNlbGVjdG9yLCByaWdodDogQ29tcGlsZWRTZWxlY3Rvcik6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHJldHVybiB2ID0+IGxlZnQodikgfHwgcmlnaHQodilcbn1cblxuZnVuY3Rpb24gY29tcGlsZUFuZChsZWZ0OiBDb21waWxlZFNlbGVjdG9yLCByaWdodDogQ29tcGlsZWRTZWxlY3Rvcik6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHJldHVybiB2ID0+IGxlZnQodikgJiYgcmlnaHQodilcbn1cbiJdfQ==
|