@stemy/ngx-utils 12.1.1 → 12.1.4
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/bundles/stemy-ngx-utils.umd.js +51 -30
- package/bundles/stemy-ngx-utils.umd.js.map +1 -1
- package/esm2015/ngx-utils/services/acl.service.js +3 -1
- package/esm2015/ngx-utils/services/config.service.js +4 -4
- package/esm2015/ngx-utils/services/error-handler.service.js +2 -2
- package/esm2015/ngx-utils/services/static-language.service.js +17 -17
- package/esm2015/ngx-utils/services/storage.service.js +4 -4
- package/esm2015/ngx-utils/utils/file-system.js +20 -0
- package/esm2015/public_api.js +2 -1
- package/esm2020/ngx-utils/common-types.mjs +117 -0
- package/esm2020/ngx-utils/components/dynamic-table/dynamic-table.component.mjs +178 -0
- package/esm2020/ngx-utils/components/pagination-menu/pagination-menu.component.mjs +101 -0
- package/esm2020/ngx-utils/components/unordered-list/unordered-list.component.mjs +65 -0
- package/esm2020/ngx-utils/directives/async-method.base.mjs +78 -0
- package/esm2020/ngx-utils/directives/async-method.directive.mjs +21 -0
- package/esm2020/ngx-utils/directives/background.directive.mjs +51 -0
- package/esm2020/ngx-utils/directives/dynamic-table-template.directive.mjs +20 -0
- package/esm2020/ngx-utils/directives/global-template.directive.mjs +30 -0
- package/esm2020/ngx-utils/directives/icon.directive.mjs +67 -0
- package/esm2020/ngx-utils/directives/ngx-template-outlet.directive.mjs +90 -0
- package/esm2020/ngx-utils/directives/pagination-item.directive.mjs +33 -0
- package/esm2020/ngx-utils/directives/pagination.directive.mjs +83 -0
- package/esm2020/ngx-utils/directives/resource-if.directive.mjs +50 -0
- package/esm2020/ngx-utils/directives/sticky-class.directive.mjs +34 -0
- package/esm2020/ngx-utils/directives/sticky.directive.mjs +55 -0
- package/esm2020/ngx-utils/directives/unordered-list-item.directive.mjs +77 -0
- package/esm2020/ngx-utils/directives/unordered-list-template.directive.mjs +26 -0
- package/esm2020/ngx-utils/ngx-utils.imports.mjs +165 -0
- package/esm2020/ngx-utils/ngx-utils.module.mjs +178 -0
- package/esm2020/ngx-utils/pipes/chunk.pipe.mjs +25 -0
- package/esm2020/ngx-utils/pipes/entries.pipe.mjs +28 -0
- package/esm2020/ngx-utils/pipes/extra-item-properties.pipe.mjs +31 -0
- package/esm2020/ngx-utils/pipes/filter.pipe.mjs +42 -0
- package/esm2020/ngx-utils/pipes/find.pipe.mjs +29 -0
- package/esm2020/ngx-utils/pipes/format-number.pipe.mjs +21 -0
- package/esm2020/ngx-utils/pipes/get-offset.pipe.mjs +17 -0
- package/esm2020/ngx-utils/pipes/get-type.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/global-template.pipe.mjs +41 -0
- package/esm2020/ngx-utils/pipes/group-by.pipe.mjs +27 -0
- package/esm2020/ngx-utils/pipes/is-type.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/join.pipe.mjs +19 -0
- package/esm2020/ngx-utils/pipes/keys.pipe.mjs +22 -0
- package/esm2020/ngx-utils/pipes/map.pipe.mjs +29 -0
- package/esm2020/ngx-utils/pipes/max.pipe.mjs +26 -0
- package/esm2020/ngx-utils/pipes/min.pipe.mjs +26 -0
- package/esm2020/ngx-utils/pipes/reduce.pipe.mjs +30 -0
- package/esm2020/ngx-utils/pipes/remap.pipe.mjs +32 -0
- package/esm2020/ngx-utils/pipes/replace.pipe.mjs +16 -0
- package/esm2020/ngx-utils/pipes/reverse.pipe.mjs +24 -0
- package/esm2020/ngx-utils/pipes/round.pipe.mjs +21 -0
- package/esm2020/ngx-utils/pipes/safe-html.pipe.mjs +34 -0
- package/esm2020/ngx-utils/pipes/translate.pipe.mjs +86 -0
- package/esm2020/ngx-utils/pipes/values.pipe.mjs +22 -0
- package/esm2020/ngx-utils/plugins/resize-event.plugin.mjs +59 -0
- package/esm2020/ngx-utils/plugins/scroll-event.plugin.mjs +39 -0
- package/esm2020/ngx-utils/services/acl.service.mjs +81 -0
- package/esm2020/ngx-utils/services/api.service.mjs +38 -0
- package/esm2020/ngx-utils/services/auth.service.mjs +14 -0
- package/esm2020/ngx-utils/services/base-http.client.mjs +47 -0
- package/esm2020/ngx-utils/services/base-http.service.mjs +298 -0
- package/esm2020/ngx-utils/services/config.service.mjs +116 -0
- package/esm2020/ngx-utils/services/error-handler.service.mjs +49 -0
- package/esm2020/ngx-utils/services/events.service.mjs +26 -0
- package/esm2020/ngx-utils/services/formatter.service.mjs +47 -0
- package/esm2020/ngx-utils/services/global-template.service.mjs +37 -0
- package/esm2020/ngx-utils/services/icon.service.mjs +26 -0
- package/esm2020/ngx-utils/services/language.service.mjs +113 -0
- package/esm2020/ngx-utils/services/open-api.service.mjs +40 -0
- package/esm2020/ngx-utils/services/promise.service.mjs +55 -0
- package/esm2020/ngx-utils/services/state.service.mjs +173 -0
- package/esm2020/ngx-utils/services/static-language.service.mjs +166 -0
- package/esm2020/ngx-utils/services/storage.service.mjs +49 -0
- package/esm2020/ngx-utils/services/toaster.service.mjs +32 -0
- package/esm2020/ngx-utils/services/translated-url.serializer.mjs +73 -0
- package/esm2020/ngx-utils/services/universal.service.mjs +78 -0
- package/esm2020/ngx-utils/utils/ajax-request-handler.mjs +40 -0
- package/esm2020/ngx-utils/utils/array.utils.mjs +100 -0
- package/esm2020/ngx-utils/utils/auth.guard.mjs +181 -0
- package/esm2020/ngx-utils/utils/canvas.utils.mjs +388 -0
- package/esm2020/ngx-utils/utils/date.utils.mjs +28 -0
- package/esm2020/ngx-utils/utils/file.utils.mjs +90 -0
- package/esm2020/ngx-utils/utils/generic-value.mjs +20 -0
- package/esm2020/ngx-utils/utils/geometry.mjs +132 -0
- package/esm2020/ngx-utils/utils/initializer.mjs +20 -0
- package/esm2020/ngx-utils/utils/loader.utils.mjs +55 -0
- package/esm2020/ngx-utils/utils/math.utils.mjs +15 -0
- package/esm2020/ngx-utils/utils/object.utils.mjs +261 -0
- package/esm2020/ngx-utils/utils/observable.utils.mjs +63 -0
- package/esm2020/ngx-utils/utils/reflect.utils.mjs +33 -0
- package/esm2020/ngx-utils/utils/set.utils.mjs +20 -0
- package/esm2020/ngx-utils/utils/string.utils.mjs +41 -0
- package/esm2020/ngx-utils/utils/timer.utils.mjs +52 -0
- package/esm2020/ngx-utils/utils/unique.utils.mjs +24 -0
- package/esm2020/ngx-utils/utils/vector.mjs +77 -0
- package/esm2020/public_api.mjs +85 -0
- package/esm2020/stemy-ngx-utils.mjs +5 -0
- package/esm2020/tools/config.mjs +71 -0
- package/esm2020/tools/public_api.mjs +2 -0
- package/esm2020/tools/stemy-ngx-utils-tools.mjs +5 -0
- package/fesm2015/stemy-ngx-utils-tools.mjs +77 -0
- package/fesm2015/stemy-ngx-utils-tools.mjs.map +1 -0
- package/fesm2015/stemy-ngx-utils.js +46 -24
- package/fesm2015/stemy-ngx-utils.js.map +1 -1
- package/fesm2015/stemy-ngx-utils.mjs +5168 -0
- package/fesm2015/stemy-ngx-utils.mjs.map +1 -0
- package/fesm2020/stemy-ngx-utils-tools.mjs +77 -0
- package/fesm2020/stemy-ngx-utils-tools.mjs.map +1 -0
- package/fesm2020/stemy-ngx-utils.mjs +5099 -0
- package/fesm2020/stemy-ngx-utils.mjs.map +1 -0
- package/ngx-utils/services/static-language.service.d.ts +1 -1
- package/ngx-utils/utils/file-system.d.ts +16 -0
- package/package.json +1 -1
- package/public_api.d.ts +1 -0
- package/stemy-ngx-utils.metadata.json +1 -1
- package/tools/config.d.ts +7 -0
- package/tools/package.json +10 -0
- package/tools/public_api.d.ts +1 -0
- package/tools/stemy-ngx-utils-tools.d.ts +5 -0
- package/bundles/stemy-ngx-utils.umd.min.js +0 -16
- package/bundles/stemy-ngx-utils.umd.min.js.map +0 -1
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Subject } from "rxjs";
|
|
2
|
+
export class GenericValue extends Subject {
|
|
3
|
+
constructor(value = null) {
|
|
4
|
+
super();
|
|
5
|
+
this._value = value;
|
|
6
|
+
}
|
|
7
|
+
get value() {
|
|
8
|
+
return this._value;
|
|
9
|
+
}
|
|
10
|
+
set value(value) {
|
|
11
|
+
if (value == this._value)
|
|
12
|
+
return;
|
|
13
|
+
this._value = value;
|
|
14
|
+
this.next(value);
|
|
15
|
+
}
|
|
16
|
+
setJustValue(value) {
|
|
17
|
+
this._value = value;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpYy12YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvdXRpbHMvZ2VuZXJpYy12YWx1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRTdCLE1BQU0sT0FBTyxZQUFnQixTQUFRLE9BQVU7SUFjM0MsWUFBWSxRQUFXLElBQUk7UUFDdkIsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQztJQUN4QixDQUFDO0lBZkQsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxJQUFJLEtBQUssQ0FBQyxLQUFRO1FBQ2QsSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPO1FBQ2pDLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsQ0FBQztJQVNELFlBQVksQ0FBQyxLQUFRO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7U3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBjbGFzcyBHZW5lcmljVmFsdWU8VD4gZXh0ZW5kcyBTdWJqZWN0PFQ+IHtcclxuXHJcbiAgICBnZXQgdmFsdWUoKTogVCB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIHNldCB2YWx1ZSh2YWx1ZTogVCkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSB0aGlzLl92YWx1ZSkgcmV0dXJuO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgdGhpcy5uZXh0KHZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIF92YWx1ZTogVDtcclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih2YWx1ZTogVCA9IG51bGwpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SnVzdFZhbHVlKHZhbHVlOiBUKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
export class Rect {
|
|
2
|
+
constructor(x, y, width, height, rotation = 0) {
|
|
3
|
+
this.x = x;
|
|
4
|
+
this.y = y;
|
|
5
|
+
this.width = width;
|
|
6
|
+
this.height = height;
|
|
7
|
+
this.rotation = rotation;
|
|
8
|
+
}
|
|
9
|
+
get center() {
|
|
10
|
+
return new Point(this.x, this.y);
|
|
11
|
+
}
|
|
12
|
+
get left() {
|
|
13
|
+
return this.x - this.width * .5;
|
|
14
|
+
}
|
|
15
|
+
get right() {
|
|
16
|
+
return this.x + this.width * .5;
|
|
17
|
+
}
|
|
18
|
+
get bottom() {
|
|
19
|
+
return this.y - this.height * .5;
|
|
20
|
+
}
|
|
21
|
+
get top() {
|
|
22
|
+
return this.y + this.height * .5;
|
|
23
|
+
}
|
|
24
|
+
distance(p) {
|
|
25
|
+
p = p.rotateAround(this.center, -this.rotation);
|
|
26
|
+
const x = Math.max(this.left - p.x, 0, p.x - this.right);
|
|
27
|
+
const y = Math.max(this.bottom - p.y, 0, p.y - this.top);
|
|
28
|
+
return Math.sqrt(x * x + y * y);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class Circle {
|
|
32
|
+
constructor(x, y, radius) {
|
|
33
|
+
this.x = x;
|
|
34
|
+
this.y = y;
|
|
35
|
+
this.radius = radius;
|
|
36
|
+
}
|
|
37
|
+
get center() {
|
|
38
|
+
return new Point(this.x, this.y);
|
|
39
|
+
}
|
|
40
|
+
get left() {
|
|
41
|
+
return new Point(this.x - this.radius, this.y);
|
|
42
|
+
}
|
|
43
|
+
get right() {
|
|
44
|
+
return new Point(this.x + this.radius, this.y);
|
|
45
|
+
}
|
|
46
|
+
get top() {
|
|
47
|
+
return new Point(this.x, this.y + this.radius);
|
|
48
|
+
}
|
|
49
|
+
get bottom() {
|
|
50
|
+
return new Point(this.x, this.y - this.radius);
|
|
51
|
+
}
|
|
52
|
+
get rect() {
|
|
53
|
+
return new Rect(this.x, this.y, this.radius * 2, this.radius * 2);
|
|
54
|
+
}
|
|
55
|
+
distance(p) {
|
|
56
|
+
return this.center.distance(p) - this.radius;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export class Point {
|
|
60
|
+
constructor(x, y) {
|
|
61
|
+
this.x = x;
|
|
62
|
+
this.y = y;
|
|
63
|
+
}
|
|
64
|
+
get length() {
|
|
65
|
+
return this.distance(Point.Zero);
|
|
66
|
+
}
|
|
67
|
+
get perpendicular() {
|
|
68
|
+
return new Point(this.y, -this.x);
|
|
69
|
+
}
|
|
70
|
+
add(p) {
|
|
71
|
+
return new Point(this.x + p.x, this.y + p.y);
|
|
72
|
+
}
|
|
73
|
+
subtract(p) {
|
|
74
|
+
return new Point(this.x - p.x, this.y - p.y);
|
|
75
|
+
}
|
|
76
|
+
multiply(p) {
|
|
77
|
+
if (p instanceof Point) {
|
|
78
|
+
return new Point(this.x * p.x, this.y * p.y);
|
|
79
|
+
}
|
|
80
|
+
return new Point(this.x * p, this.y * p);
|
|
81
|
+
}
|
|
82
|
+
distance(b) {
|
|
83
|
+
const x = b.x - this.x;
|
|
84
|
+
const y = b.y - this.y;
|
|
85
|
+
return Math.sqrt(x * x + y * y);
|
|
86
|
+
}
|
|
87
|
+
lerp(p, ratio) {
|
|
88
|
+
const diff = p.subtract(this);
|
|
89
|
+
return this.add(diff.multiply(ratio));
|
|
90
|
+
}
|
|
91
|
+
perpendicularTo(p, length) {
|
|
92
|
+
const diff = p.perpendicular.subtract(this.perpendicular);
|
|
93
|
+
const ratio = length / diff.length;
|
|
94
|
+
const center = this.lerp(p, .5);
|
|
95
|
+
return center.add(diff.multiply(ratio));
|
|
96
|
+
}
|
|
97
|
+
circleWith(a, b) {
|
|
98
|
+
const yDelta_a = b.y - a.y;
|
|
99
|
+
const xDelta_a = b.x - a.x;
|
|
100
|
+
const yDelta_b = this.y - b.y;
|
|
101
|
+
const xDelta_b = this.x - b.x;
|
|
102
|
+
const aSlope = yDelta_a / xDelta_a;
|
|
103
|
+
const bSlope = yDelta_b / xDelta_b;
|
|
104
|
+
const x = (aSlope * bSlope * (a.y - this.y) + bSlope * (a.x + b.x) - aSlope * (b.x + this.x)) / (2 * (bSlope - aSlope));
|
|
105
|
+
const y = -1 * (x - (a.x + b.x) / 2) / aSlope + (a.y + b.y) / 2;
|
|
106
|
+
const center = new Point(x, y);
|
|
107
|
+
return new Circle(center.x, center.y, center.distance(this));
|
|
108
|
+
}
|
|
109
|
+
tangents(c) {
|
|
110
|
+
const pd = c.center.subtract(this);
|
|
111
|
+
const a = Math.asin(c.radius / pd.length);
|
|
112
|
+
const b = Math.atan2(pd.y, pd.x);
|
|
113
|
+
// Tangent points
|
|
114
|
+
let t = b - a;
|
|
115
|
+
const t1 = new Point(c.x + c.radius * Math.sin(t), c.y + c.radius * -Math.cos(t));
|
|
116
|
+
t = b + a;
|
|
117
|
+
const t2 = new Point(c.x + c.radius * -Math.sin(t), c.y + c.radius * Math.cos(t));
|
|
118
|
+
return [t1, t2];
|
|
119
|
+
}
|
|
120
|
+
angle(p) {
|
|
121
|
+
const diff = p.subtract(this);
|
|
122
|
+
return Math.atan2(diff.y, diff.x) * 180 / Math.PI;
|
|
123
|
+
}
|
|
124
|
+
rotateAround(p, angle) {
|
|
125
|
+
const rotation = (p.angle(this) + angle) * Math.PI / 180;
|
|
126
|
+
const distance = p.distance(this);
|
|
127
|
+
const rotated = new Point(Math.cos(rotation) * distance, Math.sin(rotation) * distance);
|
|
128
|
+
return p.add(rotated);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
Point.Zero = new Point(0, 0);
|
|
132
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbWV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3V0aWxzL2dlb21ldHJ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU9BLE1BQU0sT0FBTyxJQUFJO0lBc0JiLFlBQXFCLENBQVMsRUFBVyxDQUFTLEVBQVcsS0FBYSxFQUFXLE1BQWMsRUFBVyxXQUFtQixDQUFDO1FBQTdHLE1BQUMsR0FBRCxDQUFDLENBQVE7UUFBVyxNQUFDLEdBQUQsQ0FBQyxDQUFRO1FBQVcsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUFXLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVyxhQUFRLEdBQVIsUUFBUSxDQUFZO0lBRWxJLENBQUM7SUF0QkQsSUFBSSxNQUFNO1FBQ04sT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ0osT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDTCxPQUFPLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUksTUFBTTtRQUNOLE9BQU8sSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsSUFBSSxHQUFHO1FBQ0gsT0FBTyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ3JDLENBQUM7SUFNRCxRQUFRLENBQUMsQ0FBUTtRQUNiLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFD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QUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDL0IsT0FBTyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRCxRQUFRLENBQUMsQ0FBUztRQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxpQkFBaUI7UUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNkLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNWLE1BQU0sRUFBRSxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsRixPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLLENBQUMsQ0FBUTtRQUNWLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCxZQUFZLENBQUMsQ0FBUSxFQUFFLEtBQWE7UUFDaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ3pELE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQztRQUN4RixPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQzs7QUFuRk0sVUFBSSxHQUFVLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSVNoYXBlIHtcclxuICAgIHg6IG51bWJlcjtcclxuICAgIHk6IG51bWJlcjtcclxuXHJcbiAgICBkaXN0YW5jZShzaGFwZTogSVNoYXBlKTogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgUmVjdCBpbXBsZW1lbnRzIElTaGFwZSB7XHJcblxyXG4gICAgZ2V0IGNlbnRlcigpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLngsIHRoaXMueSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGxlZnQoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy54IC0gdGhpcy53aWR0aCAqIC41O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByaWdodCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnggKyB0aGlzLndpZHRoICogLjU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IGJvdHRvbSgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnkgLSB0aGlzLmhlaWdodCAqIC41O1xyXG4gICAgfVxyXG5cclxuICAgIGdldCB0b3AoKTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy55ICsgdGhpcy5oZWlnaHQgKiAuNTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcihyZWFkb25seSB4OiBudW1iZXIsIHJlYWRvbmx5IHk6IG51bWJlciwgcmVhZG9ubHkgd2lkdGg6IG51bWJlciwgcmVhZG9ubHkgaGVpZ2h0OiBudW1iZXIsIHJlYWRvbmx5IHJvdGF0aW9uOiBudW1iZXIgPSAwKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRpc3RhbmNlKHA6IFBvaW50KTogbnVtYmVyIHtcclxuICAgICAgICBwID0gcC5yb3RhdGVBcm91bmQodGhpcy5jZW50ZXIsIC10aGlzLnJvdGF0aW9uKTtcclxuICAgICAgICBjb25zdCB4ID0gTWF0aC5tYXgodGhpcy5sZWZ0IC0gcC54LCAwLCBwLnggLSB0aGlzLnJpZ2h0KTtcclxuICAgICAgICBjb25zdCB5ID0gTWF0aC5tYXgodGhpcy5ib3R0b20gLSBwLnksIDAsIHAueSAtIHRoaXMudG9wKTtcclxuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHgqeCArIHkqeSk7XHJcbiAgICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBDaXJjbGUgaW1wbGVtZW50cyBJU2hhcGUge1xyXG5cclxuICAgIGdldCBjZW50ZXIoKTogUG9pbnQge1xyXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBsZWZ0KCk6IFBvaW50IHtcclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMueCAtIHRoaXMucmFkaXVzLCB0aGlzLnkpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCByaWdodCgpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLnggKyB0aGlzLnJhZGl1cywgdGhpcy55KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXQgdG9wKCk6IFBvaW50IHtcclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMueCwgdGhpcy55ICsgdGhpcy5yYWRpdXMpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBib3R0b20oKTogUG9pbnQge1xyXG4gICAgICAgIHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkgLSB0aGlzLnJhZGl1cyk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHJlY3QoKTogUmVjdCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBSZWN0KHRoaXMueCwgdGhpcy55LCB0aGlzLnJhZGl1cyAqIDIsIHRoaXMucmFkaXVzICogMik7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgeDogbnVtYmVyLCByZWFkb25seSB5OiBudW1iZXIsIHJlYWRvbmx5IHJhZGl1czogbnVtYmVyKSB7XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGRpc3RhbmNlKHA6IFBvaW50KTogbnVtYmVyIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jZW50ZXIuZGlzdGFuY2UocCkgLSB0aGlzLnJhZGl1cztcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFBvaW50IGltcGxlbWVudHMgSVNoYXBlIHtcclxuXHJcbiAgICBzdGF0aWMgWmVybzogUG9pbnQgPSBuZXcgUG9pbnQoMCwgMCk7XHJcblxyXG4gICAgZ2V0IGxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc3RhbmNlKFBvaW50Llplcm8pO1xyXG4gICAgfVxyXG5cclxuICAgIGdldCBwZXJwZW5kaWN1bGFyKCk6IFBvaW50IHtcclxuICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMueSwgLXRoaXMueCk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgeDogbnVtYmVyLCByZWFkb25seSB5OiBudW1iZXIpIHtcclxuICAgIH1cclxuXHJcbiAgICBhZGQocDogUG9pbnQpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLnggKyBwLngsIHRoaXMueSArIHAueSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3VidHJhY3QocDogUG9pbnQpOiBQb2ludCB7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLnggLSBwLngsIHRoaXMueSAtIHAueSk7XHJcbiAgICB9XHJcblxyXG4gICAgbXVsdGlwbHkocDogUG9pbnQgfCBudW1iZXIpOiBQb2ludCB7XHJcbiAgICAgICAgaWYgKHAgaW5zdGFuY2VvZiBQb2ludCkge1xyXG4gICAgICAgICAgICByZXR1cm4gbmV3IFBvaW50KHRoaXMueCAqIHAueCwgdGhpcy55ICogcC55KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludCh0aGlzLnggKiBwLCB0aGlzLnkgKiBwKTtcclxuICAgIH1cclxuXHJcbiAgICBkaXN0YW5jZShiOiBQb2ludCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgeCA9IGIueCAtIHRoaXMueDtcclxuICAgICAgICBjb25zdCB5ID0gYi55IC0gdGhpcy55O1xyXG4gICAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XHJcbiAgICB9XHJcblxyXG4gICAgbGVycChwOiBQb2ludCwgcmF0aW86IG51bWJlcik6IFBvaW50IHtcclxuICAgICAgICBjb25zdCBkaWZmID0gcC5zdWJ0cmFjdCh0aGlzKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5hZGQoZGlmZi5tdWx0aXBseShyYXRpbykpO1xyXG4gICAgfVxyXG5cclxuICAgIHBlcnBlbmRpY3VsYXJUbyhwOiBQb2ludCwgbGVuZ3RoOiBudW1iZXIpOiBQb2ludCB7XHJcbiAgICAgICAgY29uc3QgZGlmZiA9IHAucGVycGVuZGljdWxhci5zdWJ0cmFjdCh0aGlzLnBlcnBlbmRpY3VsYXIpO1xyXG4gICAgICAgIGNvbnN0IHJhdGlvID0gbGVuZ3RoIC8gZGlmZi5sZW5ndGg7XHJcbiAgICAgICAgY29uc3QgY2VudGVyID0gdGhpcy5sZXJwKHAsIC41KTtcclxuICAgICAgICByZXR1cm4gY2VudGVyLmFkZChkaWZmLm11bHRpcGx5KHJhdGlvKSk7XHJcbiAgICB9XHJcblxyXG4gICAgY2lyY2xlV2l0aChhOiBQb2ludCwgYjogUG9pbnQpOiBDaXJjbGUge1xyXG4gICAgICAgIGNvbnN0IHlEZWx0YV9hID0gYi55IC0gYS55O1xyXG4gICAgICAgIGNvbnN0IHhEZWx0YV9hID0gYi54IC0gYS54O1xyXG4gICAgICAgIGNvbnN0IHlEZWx0YV9iID0gdGhpcy55IC0gYi55O1xyXG4gICAgICAgIGNvbnN0IHhEZWx0YV9iID0gdGhpcy54IC0gYi54O1xyXG5cclxuICAgICAgICBjb25zdCBhU2xvcGUgPSB5RGVsdGFfYSAvIHhEZWx0YV9hO1xyXG4gICAgICAgIGNvbnN0IGJTbG9wZSA9IHlEZWx0YV9iIC8geERlbHRhX2I7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSAoYVNsb3BlICogYlNsb3BlICogKGEueSAtIHRoaXMueSkgKyBiU2xvcGUgKiAoYS54ICsgYi54KSAtIGFTbG9wZSAqIChiLnggKyB0aGlzLngpKSAvICgyICogKGJTbG9wZSAtIGFTbG9wZSkpO1xyXG4gICAgICAgIGNvbnN0IHkgPSAtMSAqICh4IC0gKGEueCArIGIueCkgLyAyKSAvIGFTbG9wZSArIChhLnkgKyBiLnkpIC8gMjtcclxuICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgUG9pbnQoeCwgeSk7XHJcbiAgICAgICAgcmV0dXJuIG5ldyBDaXJjbGUoY2VudGVyLngsIGNlbnRlci55LCBjZW50ZXIuZGlzdGFuY2UodGhpcykpO1xyXG4gICAgfVxyXG5cclxuICAgIHRhbmdlbnRzKGM6IENpcmNsZSk6IFBvaW50W10ge1xyXG4gICAgICAgIGNvbnN0IHBkID0gYy5jZW50ZXIuc3VidHJhY3QodGhpcyk7XHJcbiAgICAgICAgY29uc3QgYSA9IE1hdGguYXNpbihjLnJhZGl1cyAvIHBkLmxlbmd0aCk7XHJcbiAgICAgICAgY29uc3QgYiA9IE1hdGguYXRhbjIocGQueSwgcGQueCk7XHJcbiAgICAgICAgLy8gVGFuZ2VudCBwb2ludHNcclxuICAgICAgICBsZXQgdCA9IGIgLSBhO1xyXG4gICAgICAgIGNvbnN0IHQxID0gbmV3IFBvaW50KGMueCArIGMucmFkaXVzICogTWF0aC5zaW4odCksIGMueSArIGMucmFkaXVzICogLU1hdGguY29zKHQpKTtcclxuICAgICAgICB0ID0gYiArIGE7XHJcbiAgICAgICAgY29uc3QgdDIgPSBuZXcgUG9pbnQoYy54ICsgYy5yYWRpdXMgKiAtTWF0aC5zaW4odCksIGMueSArIGMucmFkaXVzICogTWF0aC5jb3ModCkpO1xyXG4gICAgICAgIHJldHVybiBbdDEsIHQyXTtcclxuICAgIH1cclxuXHJcbiAgICBhbmdsZShwOiBQb2ludCk6IG51bWJlciB7XHJcbiAgICAgICAgY29uc3QgZGlmZiA9IHAuc3VidHJhY3QodGhpcyk7XHJcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIoZGlmZi55LCBkaWZmLngpICogMTgwIC8gTWF0aC5QSTtcclxuICAgIH1cclxuXHJcbiAgICByb3RhdGVBcm91bmQocDogUG9pbnQsIGFuZ2xlOiBudW1iZXIpOiBQb2ludCB7XHJcbiAgICAgICAgY29uc3Qgcm90YXRpb24gPSAocC5hbmdsZSh0aGlzKSArIGFuZ2xlKSAqIE1hdGguUEkgLyAxODA7XHJcbiAgICAgICAgY29uc3QgZGlzdGFuY2UgPSBwLmRpc3RhbmNlKHRoaXMpO1xyXG4gICAgICAgIGNvbnN0IHJvdGF0ZWQgPSBuZXcgUG9pbnQoTWF0aC5jb3Mocm90YXRpb24pICogZGlzdGFuY2UsIE1hdGguc2luKHJvdGF0aW9uKSAqIGRpc3RhbmNlKTtcclxuICAgICAgICByZXR1cm4gcC5hZGQocm90YXRlZCk7XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { Invokable } from "invokable";
|
|
2
|
+
export class Initializer {
|
|
3
|
+
constructor(callback, shouldInit = true) {
|
|
4
|
+
this.callback = callback;
|
|
5
|
+
this.shouldInit = shouldInit;
|
|
6
|
+
this.initialized = !this.shouldInit;
|
|
7
|
+
// @ts-ignore
|
|
8
|
+
return Invokable.create(this);
|
|
9
|
+
}
|
|
10
|
+
get isInitialized() {
|
|
11
|
+
return this.initialized;
|
|
12
|
+
}
|
|
13
|
+
[Invokable.call]() {
|
|
14
|
+
if (this.initialized)
|
|
15
|
+
return null;
|
|
16
|
+
this.initialized = true;
|
|
17
|
+
return this.callback();
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbmd4LXV0aWxzL3V0aWxzL2luaXRpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFcEMsTUFBTSxPQUFPLFdBQVc7SUFRcEIsWUFBb0IsUUFBaUIsRUFBVSxhQUFzQixJQUFJO1FBQXJELGFBQVEsR0FBUixRQUFRLENBQVM7UUFBVSxlQUFVLEdBQVYsVUFBVSxDQUFnQjtRQUNyRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxhQUFhO1FBQ2IsT0FBTyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFSRCxJQUFJLGFBQWE7UUFDYixPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDNUIsQ0FBQztJQVFELENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQztRQUNaLElBQUksSUFBSSxDQUFDLFdBQVc7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0ludm9rYWJsZX0gZnJvbSBcImludm9rYWJsZVwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIEluaXRpYWxpemVyPFQ+IHtcclxuXHJcbiAgICBwcml2YXRlIGluaXRpYWxpemVkOiBib29sZWFuO1xyXG5cclxuICAgIGdldCBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgY2FsbGJhY2s6ICgpID0+IFQsIHByaXZhdGUgc2hvdWxkSW5pdDogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gIXRoaXMuc2hvdWxkSW5pdDtcclxuICAgICAgICAvLyBAdHMtaWdub3JlXHJcbiAgICAgICAgcmV0dXJuIEludm9rYWJsZS5jcmVhdGUodGhpcyk7XHJcbiAgICB9XHJcblxyXG4gICAgW0ludm9rYWJsZS5jYWxsXSgpOiBUIHtcclxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2soKTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplcjxUPiB7XHJcbiAgICAoKTogVDtcclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export class LoaderUtils {
|
|
2
|
+
static loadScript(src, async = false) {
|
|
3
|
+
this.scriptPromises[src] = this.scriptPromises[src] || new Promise((resolve, reject) => {
|
|
4
|
+
// Load script
|
|
5
|
+
const script = document.createElement("script");
|
|
6
|
+
script.type = "text/javascript";
|
|
7
|
+
script.src = src;
|
|
8
|
+
script.async = async;
|
|
9
|
+
if (script.readyState) {
|
|
10
|
+
// Internet explorer
|
|
11
|
+
script.onreadystatechange = () => {
|
|
12
|
+
if (script.readyState === "loaded" || script.readyState === "complete") {
|
|
13
|
+
script.onreadystatechange = null;
|
|
14
|
+
resolve(script);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
// Other browsers
|
|
20
|
+
script.onload = () => resolve(script);
|
|
21
|
+
}
|
|
22
|
+
script.onerror = (error) => reject(error);
|
|
23
|
+
document.body.appendChild(script);
|
|
24
|
+
});
|
|
25
|
+
return this.scriptPromises[src];
|
|
26
|
+
}
|
|
27
|
+
static loadStyle(src) {
|
|
28
|
+
this.stylePromises[src] = this.stylePromises[src] || new Promise((resolve, reject) => {
|
|
29
|
+
// Load script
|
|
30
|
+
const link = document.createElement("link");
|
|
31
|
+
link.rel = "stylesheet";
|
|
32
|
+
link.type = "text/css";
|
|
33
|
+
link.href = src;
|
|
34
|
+
if (link.readyState) {
|
|
35
|
+
// Internet explorer
|
|
36
|
+
link.onreadystatechange = () => {
|
|
37
|
+
if (link.readyState === "loaded" || link.readyState === "complete") {
|
|
38
|
+
link.onreadystatechange = null;
|
|
39
|
+
resolve(link);
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// Other browsers
|
|
45
|
+
link.onload = () => resolve(link);
|
|
46
|
+
}
|
|
47
|
+
link.onerror = (error) => reject(error);
|
|
48
|
+
document.body.appendChild(link);
|
|
49
|
+
});
|
|
50
|
+
return this.stylePromises[src];
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
LoaderUtils.scriptPromises = {};
|
|
54
|
+
LoaderUtils.stylePromises = {};
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy91dGlscy9sb2FkZXIudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFdBQVc7SUFLcEIsTUFBTSxDQUFDLFVBQVUsQ0FBQyxHQUFXLEVBQUUsUUFBaUIsS0FBSztRQUNqRCxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLElBQUksSUFBSSxPQUFPLENBQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDeEYsY0FBYztZQUNkLE1BQU0sTUFBTSxHQUFRLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDckQsTUFBTSxDQUFDLElBQUksR0FBRyxpQkFBaUIsQ0FBQztZQUNoQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztZQUNqQixNQUFNLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNyQixJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUU7Z0JBQ25CLG9CQUFvQjtnQkFDcEIsTUFBTSxDQUFDLGtCQUFrQixHQUFHLEdBQUcsRUFBRTtvQkFDN0IsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsVUFBVSxLQUFLLFVBQVUsRUFBRTt3QkFDcEUsTUFBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQzt3QkFDakMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3FCQUNuQjtnQkFDTCxDQUFDLENBQUM7YUFDTDtpQkFBTTtnQkFDSCxpQkFBaUI7Z0JBQ2pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ3pDO1lBQ0QsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9DLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQVc7UUFDeEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3RGLGNBQWM7WUFDZCxNQUFNLElBQUksR0FBUSxRQUFRLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxHQUFHLEdBQUcsWUFBWSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsR0FBRyxDQUFDO1lBRWhCLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtnQkFDakIsb0JBQW9CO2dCQUNwQixJQUFJLENBQUMsa0JBQWtCLEdBQUcsR0FBRyxFQUFFO29CQUMzQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssVUFBVSxFQUFFO3dCQUNoRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO3dCQUMvQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ2pCO2dCQUNMLENBQUMsQ0FBQzthQUNMO2lCQUFNO2dCQUNILGlCQUFpQjtnQkFDakIsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDckM7WUFDRCxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsS0FBVSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsQ0FBQzs7QUFwRE0sMEJBQWMsR0FBb0IsRUFBRSxDQUFDO0FBQ3JDLHlCQUFhLEdBQW1CLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SVNjcmlwdFByb21pc2VzLCBJU3R5bGVQcm9taXNlc30gZnJvbSBcIi4uL2NvbW1vbi10eXBlc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIExvYWRlclV0aWxzIHtcclxuXHJcbiAgICBzdGF0aWMgc2NyaXB0UHJvbWlzZXM6IElTY3JpcHRQcm9taXNlcyA9IHt9O1xyXG4gICAgc3RhdGljIHN0eWxlUHJvbWlzZXM6IElTdHlsZVByb21pc2VzID0ge307XHJcblxyXG4gICAgc3RhdGljIGxvYWRTY3JpcHQoc3JjOiBzdHJpbmcsIGFzeW5jOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPEhUTUxTY3JpcHRFbGVtZW50PiB7XHJcbiAgICAgICAgdGhpcy5zY3JpcHRQcm9taXNlc1tzcmNdID0gdGhpcy5zY3JpcHRQcm9taXNlc1tzcmNdIHx8IG5ldyBQcm9taXNlPGFueT4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAvLyBMb2FkIHNjcmlwdFxyXG4gICAgICAgICAgICBjb25zdCBzY3JpcHQ6IGFueSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzY3JpcHRcIik7XHJcbiAgICAgICAgICAgIHNjcmlwdC50eXBlID0gXCJ0ZXh0L2phdmFzY3JpcHRcIjtcclxuICAgICAgICAgICAgc2NyaXB0LnNyYyA9IHNyYztcclxuICAgICAgICAgICAgc2NyaXB0LmFzeW5jID0gYXN5bmM7XHJcbiAgICAgICAgICAgIGlmIChzY3JpcHQucmVhZHlTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgZXhwbG9yZXJcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSBcImxvYWRlZFwiIHx8IHNjcmlwdC5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUoc2NyaXB0KTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXIgYnJvd3NlcnNcclxuICAgICAgICAgICAgICAgIHNjcmlwdC5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKHNjcmlwdCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc2NyaXB0Lm9uZXJyb3IgPSAoZXJyb3I6IGFueSkgPT4gcmVqZWN0KGVycm9yKTtcclxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnNjcmlwdFByb21pc2VzW3NyY107XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGxvYWRTdHlsZShzcmM6IHN0cmluZyk6IFByb21pc2U8SFRNTExpbmtFbGVtZW50PiB7XHJcbiAgICAgICAgdGhpcy5zdHlsZVByb21pc2VzW3NyY10gPSB0aGlzLnN0eWxlUHJvbWlzZXNbc3JjXSB8fCBuZXcgUHJvbWlzZTxhbnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgICAgICAgLy8gTG9hZCBzY3JpcHRcclxuICAgICAgICAgICAgY29uc3QgbGluazogYW55ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpbmtcIik7XHJcbiAgICAgICAgICAgIGxpbmsucmVsID0gXCJzdHlsZXNoZWV0XCI7XHJcbiAgICAgICAgICAgIGxpbmsudHlwZSA9IFwidGV4dC9jc3NcIjtcclxuICAgICAgICAgICAgbGluay5ocmVmID0gc3JjO1xyXG5cclxuICAgICAgICAgICAgaWYgKGxpbmsucmVhZHlTdGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgZXhwbG9yZXJcclxuICAgICAgICAgICAgICAgIGxpbmsub25yZWFkeXN0YXRlY2hhbmdlID0gKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChsaW5rLnJlYWR5U3RhdGUgPT09IFwibG9hZGVkXCIgfHwgbGluay5yZWFkeVN0YXRlID09PSBcImNvbXBsZXRlXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGluay5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGxpbmspO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH07XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBPdGhlciBicm93c2Vyc1xyXG4gICAgICAgICAgICAgICAgbGluay5vbmxvYWQgPSAoKSA9PiByZXNvbHZlKGxpbmspO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxpbmsub25lcnJvciA9IChlcnJvcjogYW55KSA9PiByZWplY3QoZXJyb3IpO1xyXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0eWxlUHJvbWlzZXNbc3JjXTtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ObjectUtils } from "./object.utils";
|
|
2
|
+
export class MathUtils {
|
|
3
|
+
static equal(a, b, epsilon = null) {
|
|
4
|
+
epsilon = ObjectUtils.isNumber(epsilon) ? epsilon : Math.E;
|
|
5
|
+
return Math.abs(a - b) < epsilon;
|
|
6
|
+
}
|
|
7
|
+
static clamp(value, min, max) {
|
|
8
|
+
return Math.max(Math.min(value, max), min);
|
|
9
|
+
}
|
|
10
|
+
static round(value, precision = 2, divider = 1) {
|
|
11
|
+
precision = Math.pow(10, precision);
|
|
12
|
+
return Math.round(value * precision / divider) / precision;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aC51dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9uZ3gtdXRpbHMvdXRpbHMvbWF0aC51dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0MsTUFBTSxPQUFPLFNBQVM7SUFFbEIsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLFVBQWtCLElBQUk7UUFDckQsT0FBTyxHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBRSxHQUFHLE9BQU8sQ0FBQztJQUN2QyxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFhLEVBQUUsR0FBVyxFQUFFLEdBQVc7UUFDaEQsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQWEsRUFBRSxZQUFvQixDQUFDLEVBQUUsVUFBa0IsQ0FBQztRQUNsRSxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQy9ELENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gXCIuL29iamVjdC51dGlsc1wiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE1hdGhVdGlscyB7XHJcblxyXG4gICAgc3RhdGljIGVxdWFsKGE6IG51bWJlciwgYjogbnVtYmVyLCBlcHNpbG9uOiBudW1iZXIgPSBudWxsKTogYm9vbGVhbiB7XHJcbiAgICAgICAgZXBzaWxvbiA9IE9iamVjdFV0aWxzLmlzTnVtYmVyKGVwc2lsb24pID8gZXBzaWxvbiA6IE1hdGguRTtcclxuICAgICAgICByZXR1cm4gTWF0aC5hYnMoIGEgLSBiICkgPCBlcHNpbG9uO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbih2YWx1ZSwgbWF4KSwgbWluKVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyByb3VuZCh2YWx1ZTogbnVtYmVyLCBwcmVjaXNpb246IG51bWJlciA9IDIsIGRpdmlkZXI6IG51bWJlciA9IDEpOiBudW1iZXIge1xyXG4gICAgICAgIHByZWNpc2lvbiA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24pO1xyXG4gICAgICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlICogcHJlY2lzaW9uIC8gZGl2aWRlcikgLyBwcmVjaXNpb247XHJcbiAgICB9XHJcbn1cclxuIl19
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
const defaultPredicate = () => true;
|
|
2
|
+
const hasBlob = typeof Blob !== "undefined";
|
|
3
|
+
const hasFile = typeof File !== "undefined";
|
|
4
|
+
export class ObjectUtils {
|
|
5
|
+
static compare(a, b) {
|
|
6
|
+
if ((a === null || b === null) || (typeof a != typeof b)) {
|
|
7
|
+
return null;
|
|
8
|
+
}
|
|
9
|
+
if (typeof a === "string") {
|
|
10
|
+
return (a).localeCompare(b);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
if (a instanceof Date) {
|
|
14
|
+
a = a.getTime();
|
|
15
|
+
b = b.getTime();
|
|
16
|
+
}
|
|
17
|
+
if (a > b) {
|
|
18
|
+
return 1;
|
|
19
|
+
}
|
|
20
|
+
else if (a < b) {
|
|
21
|
+
return -1;
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
static getProperties(obj) {
|
|
27
|
+
if (!ObjectUtils.isObject(obj) && !ObjectUtils.isFunction(obj))
|
|
28
|
+
return [];
|
|
29
|
+
const props = new Set();
|
|
30
|
+
Object.keys(obj).forEach(p => props.add(p));
|
|
31
|
+
Object.getOwnPropertyNames(obj).forEach(p => props.add(p));
|
|
32
|
+
return Array.from(props);
|
|
33
|
+
}
|
|
34
|
+
static equals(a, b) {
|
|
35
|
+
if (a === b)
|
|
36
|
+
return true;
|
|
37
|
+
if (a === null || b === null)
|
|
38
|
+
return false;
|
|
39
|
+
if (a !== a && b !== b)
|
|
40
|
+
return true; // NaN === NaN
|
|
41
|
+
const at = typeof a, bt = typeof b;
|
|
42
|
+
let length, key, keySet;
|
|
43
|
+
if (at == bt && at == "object") {
|
|
44
|
+
if (Array.isArray(a)) {
|
|
45
|
+
if (!Array.isArray(b))
|
|
46
|
+
return false;
|
|
47
|
+
if ((length = a.length) == b.length) {
|
|
48
|
+
for (key = 0; key < length; key++) {
|
|
49
|
+
if (!ObjectUtils.equals(a[key], b[key]))
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
if (Array.isArray(b)) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
keySet = Object.create(null);
|
|
60
|
+
for (key in a) {
|
|
61
|
+
if (a.hasOwnProperty(key)) {
|
|
62
|
+
if (!ObjectUtils.equals(a[key], b[key])) {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
keySet[key] = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
for (key in b) {
|
|
69
|
+
if (b.hasOwnProperty(key) && !(key in keySet) && typeof b[key] !== "undefined") {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
static evaluate(expr, context = {}, res = {}) {
|
|
79
|
+
expr = Object.keys(context).reduce((res, key) => `var ${key} = this['${key}'];\n${res}`, expr);
|
|
80
|
+
const lines = expr.split("\n");
|
|
81
|
+
const lastLine = "return " + lines.pop().replace("return ", "");
|
|
82
|
+
lines.push(lastLine);
|
|
83
|
+
expr = lines.join("\n");
|
|
84
|
+
let result = null;
|
|
85
|
+
try {
|
|
86
|
+
result = new Function(expr).call(context);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
res.exception = e;
|
|
90
|
+
console.log(`Failed to parse expression: ${e.message}`, expr, context);
|
|
91
|
+
}
|
|
92
|
+
res.result = result;
|
|
93
|
+
return result;
|
|
94
|
+
}
|
|
95
|
+
static empty(obj) {
|
|
96
|
+
return !obj || Object.keys(obj).length == 0;
|
|
97
|
+
}
|
|
98
|
+
static iterate(obj, cb) {
|
|
99
|
+
if (!obj)
|
|
100
|
+
return;
|
|
101
|
+
const keys = Array.isArray(obj) ? Array.from(obj.keys()) : Object.keys(obj);
|
|
102
|
+
keys.forEach(
|
|
103
|
+
// @dynamic
|
|
104
|
+
key => {
|
|
105
|
+
cb(obj[key], key);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
static getValue(obj, key, defaultValue, treeFallback = false) {
|
|
109
|
+
key = key || "";
|
|
110
|
+
const keys = key.split(".");
|
|
111
|
+
let curKey = "";
|
|
112
|
+
do {
|
|
113
|
+
curKey += keys.shift();
|
|
114
|
+
if (ObjectUtils.isDefined(obj) && ObjectUtils.isDefined(obj[curKey]) && (typeof obj[curKey] === "object" || !keys.length)) {
|
|
115
|
+
obj = obj[curKey];
|
|
116
|
+
curKey = "";
|
|
117
|
+
}
|
|
118
|
+
else if (!keys.length) {
|
|
119
|
+
defaultValue = typeof defaultValue == "undefined" ? key.replace(new RegExp(`${curKey}$`), `{${curKey}}`) : defaultValue;
|
|
120
|
+
obj = treeFallback ? obj || defaultValue : defaultValue;
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
curKey += ".";
|
|
124
|
+
}
|
|
125
|
+
} while (keys.length);
|
|
126
|
+
return obj;
|
|
127
|
+
}
|
|
128
|
+
static mapToPath(target, source, path) {
|
|
129
|
+
if (typeof source === "undefined")
|
|
130
|
+
return target;
|
|
131
|
+
if (path.length == 0)
|
|
132
|
+
return source;
|
|
133
|
+
const key = path.shift();
|
|
134
|
+
if (key == "*") {
|
|
135
|
+
if (ObjectUtils.isArray(source)) {
|
|
136
|
+
target = ObjectUtils.isArray(target) ? target : [];
|
|
137
|
+
return source.map((item, index) => {
|
|
138
|
+
return ObjectUtils.mapToPath(target[index], item, Array.from(path));
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
if (ObjectUtils.isObject(source)) {
|
|
142
|
+
target = ObjectUtils.isObject(target) ? target : {};
|
|
143
|
+
return Object.keys(source).reduce((result, key) => {
|
|
144
|
+
result[key] = ObjectUtils.mapToPath(target[key], source[key], Array.from(path));
|
|
145
|
+
return result;
|
|
146
|
+
}, {});
|
|
147
|
+
}
|
|
148
|
+
return ObjectUtils.isNullOrUndefined(target) ? null : target;
|
|
149
|
+
}
|
|
150
|
+
const isArray = ObjectUtils.isArray(target);
|
|
151
|
+
target = ObjectUtils.isObject(target) || isArray ? target : {};
|
|
152
|
+
target[key] = ObjectUtils.mapToPath(target[key], source, Array.from(path));
|
|
153
|
+
return isNaN(key) || isArray ? target : Object.values(target);
|
|
154
|
+
}
|
|
155
|
+
static filter(obj, predicate) {
|
|
156
|
+
return ObjectUtils.copyRecursive(null, obj, predicate);
|
|
157
|
+
}
|
|
158
|
+
static copy(obj) {
|
|
159
|
+
return ObjectUtils.copyRecursive(null, obj);
|
|
160
|
+
}
|
|
161
|
+
static assign(target, source, predicate) {
|
|
162
|
+
return ObjectUtils.copyRecursive(target, source, predicate);
|
|
163
|
+
}
|
|
164
|
+
static getType(obj) {
|
|
165
|
+
const regex = new RegExp("\\s([a-zA-Z]+)");
|
|
166
|
+
return Object.prototype.toString.call(obj).match(regex)[1].toLowerCase();
|
|
167
|
+
}
|
|
168
|
+
static isPrimitive(value) {
|
|
169
|
+
const type = typeof value;
|
|
170
|
+
return value == null || (type !== "object" && type !== "function");
|
|
171
|
+
}
|
|
172
|
+
static isObject(value) {
|
|
173
|
+
return ObjectUtils.getType(value) === "object";
|
|
174
|
+
}
|
|
175
|
+
static isDefined(value) {
|
|
176
|
+
return typeof value !== "undefined" && value !== null;
|
|
177
|
+
}
|
|
178
|
+
static isNullOrUndefined(value) {
|
|
179
|
+
return typeof value == "undefined" || value == null;
|
|
180
|
+
}
|
|
181
|
+
static isString(value) {
|
|
182
|
+
return typeof value === "string";
|
|
183
|
+
}
|
|
184
|
+
static isFunction(value) {
|
|
185
|
+
return typeof value === "function";
|
|
186
|
+
}
|
|
187
|
+
static isDate(value) {
|
|
188
|
+
return null !== value && !isNaN(value) && "undefined" !== typeof value.getDate;
|
|
189
|
+
}
|
|
190
|
+
static isBlob(value) {
|
|
191
|
+
return (hasBlob && value instanceof Blob) || (hasFile && value instanceof File);
|
|
192
|
+
}
|
|
193
|
+
static isBoolean(value) {
|
|
194
|
+
return typeof (value) == typeof (true);
|
|
195
|
+
}
|
|
196
|
+
static isNumber(value) {
|
|
197
|
+
if (typeof value !== "number")
|
|
198
|
+
return false;
|
|
199
|
+
const num = +value;
|
|
200
|
+
if ((num - num) !== 0) {
|
|
201
|
+
return false;
|
|
202
|
+
}
|
|
203
|
+
if (num === value) {
|
|
204
|
+
return true;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
static isArray(value) {
|
|
208
|
+
return Array.isArray(value);
|
|
209
|
+
}
|
|
210
|
+
static isSet(value) {
|
|
211
|
+
return value instanceof Set;
|
|
212
|
+
}
|
|
213
|
+
static checkInterface(obj, interFaceObject) {
|
|
214
|
+
return ObjectUtils.isInterface(obj, interFaceObject);
|
|
215
|
+
}
|
|
216
|
+
static isInterface(obj, interFaceObject) {
|
|
217
|
+
if (!obj || typeof obj !== "object" || ObjectUtils.isArray(obj) || !ObjectUtils.isObject(interFaceObject))
|
|
218
|
+
return false;
|
|
219
|
+
const keys = Object.keys(interFaceObject);
|
|
220
|
+
for (const key of keys) {
|
|
221
|
+
let type = interFaceObject[key] || "";
|
|
222
|
+
if (type.startsWith("*")) {
|
|
223
|
+
type = type.substr(1);
|
|
224
|
+
if (obj.hasOwnProperty(key) && ObjectUtils.getType(obj[key]) !== type)
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
else if (!obj.hasOwnProperty(key) || ObjectUtils.getType(obj[key]) !== type) {
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return true;
|
|
232
|
+
}
|
|
233
|
+
static pad(obj, width, chr = "0") {
|
|
234
|
+
const str = ObjectUtils.isDefined(obj) ? obj.toString() : "";
|
|
235
|
+
return str.length >= width ? str : new Array(width - str.length + 1).join(chr) + str;
|
|
236
|
+
}
|
|
237
|
+
static copyRecursive(target, source, predicate) {
|
|
238
|
+
predicate = predicate || defaultPredicate;
|
|
239
|
+
if (ObjectUtils.isPrimitive(source) || ObjectUtils.isDate(source) || ObjectUtils.isBlob(source) || ObjectUtils.isFunction(source))
|
|
240
|
+
return source;
|
|
241
|
+
if (ObjectUtils.isArray(source)) {
|
|
242
|
+
target = ObjectUtils.isArray(target) ? Array.from(target) : [];
|
|
243
|
+
source.forEach((item, index) => {
|
|
244
|
+
if (!predicate(item, index, target, source))
|
|
245
|
+
return;
|
|
246
|
+
if (target.length > index)
|
|
247
|
+
target[index] = ObjectUtils.copyRecursive(target[index], item, predicate);
|
|
248
|
+
else
|
|
249
|
+
target.push(ObjectUtils.copyRecursive(null, item, predicate));
|
|
250
|
+
});
|
|
251
|
+
return target;
|
|
252
|
+
}
|
|
253
|
+
return Object.keys(source).reduce((result, key) => {
|
|
254
|
+
if (!predicate(source[key], key, result, source))
|
|
255
|
+
return result;
|
|
256
|
+
result[key] = ObjectUtils.copyRecursive(result[key], source[key], predicate);
|
|
257
|
+
return result;
|
|
258
|
+
}, Object.assign({}, target));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JqZWN0LnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL25neC11dGlscy91dGlscy9vYmplY3QudXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsTUFBTSxnQkFBZ0IsR0FBb0IsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO0FBQ3JELE1BQU0sT0FBTyxHQUFHLE9BQU8sSUFBSSxLQUFLLFdBQVcsQ0FBQztBQUM1QyxNQUFNLE9BQU8sR0FBRyxPQUFPLElBQUksS0FBSyxXQUFXLENBQUM7QUFFNUMsTUFBTSxPQUFPLFdBQVc7SUFFcEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFNLEVBQUUsQ0FBTTtRQUN6QixJQUFJLENBQUMsQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFO1lBQ3RELE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtZQUN2QixPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDSCxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUU7Z0JBQ25CLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1AsT0FBTyxDQUFDLENBQUM7YUFDWjtpQkFBTSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ2QsT0FBTyxDQUFDLENBQUMsQ0FBQzthQUNiO1lBQ0QsT0FBTyxDQUFDLENBQUM7U0FDWjtJQUNMLENBQUM7SUFFRCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQVE7UUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxR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LENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQztvQkFBRSxPQUFPO2dCQUNwRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSztvQkFDckIsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzs7b0JBRTFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDdEUsQ0FBQyxDQUFDLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQztTQUNqQjtRQUNELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUM7Z0JBQUUsT0FBTyxNQUFNLENBQUM7WUFDaEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM3RSxPQUFPLE1BQU0sQ0FBQztRQUNsQixDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBGaWx0ZXJQcmVkaWNhdGUgPSAodmFsdWU6IGFueSwga2V5PzogYW55LCB0YXJnZXQ/OiBhbnksIHNvdXJjZT86IGFueSkgPT4gYm9vbGVhbjtcclxuZXhwb3J0IHR5cGUgSXRlcmF0ZUNhbGxiYWNrID0gKHZhbHVlOiBhbnksIGtleT86IGFueSkgPT4gdm9pZDtcclxuXHJcbmNvbnN0IGRlZmF1bHRQcmVkaWNhdGU6IEZpbHRlclByZWRpY2F0ZSA9ICgpID0+IHRydWU7XHJcbmNvbnN0IGhhc0Jsb2IgPSB0eXBlb2YgQmxvYiAhPT0gXCJ1bmRlZmluZWRcIjtcclxuY29uc3QgaGFzRmlsZSA9IHR5cGVvZiBGaWxlICE9PSBcInVuZGVmaW5lZFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIE9iamVjdFV0aWxzIHtcclxuXHJcbiAgICBzdGF0aWMgY29tcGFyZShhOiBhbnksIGI6IGFueSk6IG51bWJlciB7XHJcbiAgICAgICAgaWYgKChhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHx8ICh0eXBlb2YgYSAhPSB0eXBlb2YgYikpIHtcclxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICByZXR1cm4gKGEpLmxvY2FsZUNvbXBhcmUoYik7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBEYXRlKSB7XHJcbiAgICAgICAgICAgICAgICBhID0gYS5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgICAgICBiID0gYi5nZXRUaW1lKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKGEgPiBiKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChhIDwgYikge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiAwO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZ2V0UHJvcGVydGllcyhvYmo6IGFueSk6IHN0cmluZ1tdIHtcclxuICAgICAgICBpZiAoIU9iamVjdFV0aWxzLmlzT2JqZWN0KG9iaikgJiYgIU9iamVjdFV0aWxzLmlzRnVuY3Rpb24ob2JqKSkgcmV0dXJuIFtdO1xyXG4gICAgICAgIGNvbnN0IHByb3BzID0gbmV3IFNldDxzdHJpbmc+KCk7XHJcbiAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKHAgPT4gcHJvcHMuYWRkKHApKTtcclxuICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvYmopLmZvckVhY2gocCA9PiBwcm9wcy5hZGQocCkpO1xyXG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKHByb3BzKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXF1YWxzKGE6IGFueSwgYjogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlO1xyXG4gICAgICAgIGlmIChhID09PSBudWxsIHx8IGIgPT09IG51bGwpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBpZiAoYSAhPT0gYSAmJiBiICE9PSBiKSByZXR1cm4gdHJ1ZTsgLy8gTmFOID09PSBOYU5cclxuICAgICAgICBjb25zdCBhdCA9IHR5cGVvZiBhLCBidCA9IHR5cGVvZiBiO1xyXG4gICAgICAgIGxldCBsZW5ndGg6IG51bWJlciwga2V5OiBhbnksIGtleVNldDogYW55O1xyXG4gICAgICAgIGlmIChhdCA9PSBidCAmJiBhdCA9PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYikpIHJldHVybiBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGlmICgobGVuZ3RoID0gYS5sZW5ndGgpID09IGIubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChrZXkgPSAwOyBrZXkgPCBsZW5ndGg7IGtleSsrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGFba2V5XSwgYltrZXldKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAga2V5U2V0ID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcclxuICAgICAgICAgICAgICAgIGZvciAoa2V5IGluIGEpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoYS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0VXRpbHMuZXF1YWxzKGFba2V5XSwgYltrZXldKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldFtrZXldID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBmb3IgKGtleSBpbiBiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGIuaGFzT3duUHJvcGVydHkoa2V5KSAmJiAhKGtleSBpbiBrZXlTZXQpICYmIHR5cGVvZiBiW2tleV0gIT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgZXZhbHVhdGUoZXhwcjogc3RyaW5nLCBjb250ZXh0OiBhbnkgPSB7fSwgcmVzOiBhbnkgPSB7fSk6IGFueSB7XHJcbiAgICAgICAgZXhwciA9IE9iamVjdC5rZXlzKGNvbnRleHQpLnJlZHVjZSgocmVzLCBrZXkpID0+IGB2YXIgJHtrZXl9ID0gdGhpc1snJHtrZXl9J107XFxuJHtyZXN9YCwgZXhwcik7XHJcbiAgICAgICAgY29uc3QgbGluZXMgPSBleHByLnNwbGl0KFwiXFxuXCIpO1xyXG4gICAgICAgIGNvbnN0IGxhc3RMaW5lID0gXCJyZXR1cm4gXCIgKyBsaW5lcy5wb3AoKS5yZXBsYWNlKFwicmV0dXJuIFwiLCBcIlwiKTtcclxuICAgICAgICBsaW5lcy5wdXNoKGxhc3RMaW5lKTtcclxuICAgICAgICBleHByID0gbGluZXMuam9pbihcIlxcblwiKTtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gbnVsbDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICByZXN1bHQgPSBuZXcgRnVuY3Rpb24oZXhwcikuY2FsbChjb250ZXh0KTtcclxuICAgICAgICB9IGNhdGNoIChlKSB7XHJcbiAgICAgICAgICAgIHJlcy5leGNlcHRpb24gPSBlO1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgRmFpbGVkIHRvIHBhcnNlIGV4cHJlc3Npb246ICR7ZS5tZXNzYWdlfWAsIGV4cHIsIGNvbnRleHQpO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXMucmVzdWx0ID0gcmVzdWx0O1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGVtcHR5KG9iajogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuICFvYmogfHwgT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT0gMDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXRlcmF0ZShvYmo6IGFueSwgY2I6IEl0ZXJhdGVDYWxsYmFjayk6IHZvaWQge1xyXG4gICAgICAgIGlmICghb2JqKSByZXR1cm47XHJcbiAgICAgICAgY29uc3Qga2V5czogYW55W10gPSBBcnJheS5pc0FycmF5KG9iaikgPyBBcnJheS5mcm9tKG9iai5rZXlzKCkpIDogT2JqZWN0LmtleXMob2JqKTtcclxuICAgICAgICBrZXlzLmZvckVhY2goXHJcbiAgICAgICAgICAgIC8vIEBkeW5hbWljXHJcbiAgICAgICAgICAgIGtleSA9PiB7XHJcbiAgICAgICAgICAgICAgICBjYihvYmpba2V5XSwga2V5KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGdldFZhbHVlKG9iajogYW55LCBrZXk6IHN0cmluZywgZGVmYXVsdFZhbHVlPzogYW55LCB0cmVlRmFsbGJhY2s6IGJvb2xlYW4gPSBmYWxzZSk6IGFueSB7XHJcbiAgICAgICAga2V5ID0ga2V5IHx8IFwiXCI7XHJcbiAgICAgICAgY29uc3Qga2V5cyA9IGtleS5zcGxpdChcIi5cIik7XHJcbiAgICAgICAgbGV0IGN1cktleSA9IFwiXCI7XHJcbiAgICAgICAgZG8ge1xyXG4gICAgICAgICAgICBjdXJLZXkgKz0ga2V5cy5zaGlmdCgpO1xyXG4gICAgICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNEZWZpbmVkKG9iaikgJiYgT2JqZWN0VXRpbHMuaXNEZWZpbmVkKG9ialtjdXJLZXldKSAmJiAodHlwZW9mIG9ialtjdXJLZXldID09PSBcIm9iamVjdFwiIHx8ICFrZXlzLmxlbmd0aCkpIHtcclxuICAgICAgICAgICAgICAgIG9iaiA9IG9ialtjdXJLZXldO1xyXG4gICAgICAgICAgICAgICAgY3VyS2V5ID0gXCJcIjtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICgha2V5cy5sZW5ndGgpIHtcclxuICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHR5cGVvZiBkZWZhdWx0VmFsdWUgPT0gXCJ1bmRlZmluZWRcIiA/IGtleS5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7Y3VyS2V5fSRgKSwgYHske2N1cktleX19YCkgOiBkZWZhdWx0VmFsdWU7XHJcbiAgICAgICAgICAgICAgICBvYmogPSB0cmVlRmFsbGJhY2sgPyBvYmogfHwgZGVmYXVsdFZhbHVlIDogZGVmYXVsdFZhbHVlO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgY3VyS2V5ICs9IFwiLlwiO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSB3aGlsZSAoa2V5cy5sZW5ndGgpO1xyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1hcFRvUGF0aCh0YXJnZXQ6IGFueSwgc291cmNlOiBhbnksIHBhdGg6IHN0cmluZ1tdKTogYW55IHtcclxuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJ1bmRlZmluZWRcIikgcmV0dXJuIHRhcmdldDtcclxuICAgICAgICBpZiAocGF0aC5sZW5ndGggPT0gMCkgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICBjb25zdCBrZXk6IGFueSA9IHBhdGguc2hpZnQoKTtcclxuICAgICAgICBpZiAoa2V5ID09IFwiKlwiKSB7XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc0FycmF5KHNvdXJjZSkpIHtcclxuICAgICAgICAgICAgICAgIHRhcmdldCA9IE9iamVjdFV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IHRhcmdldCA6IFtdO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5tYXAoKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLm1hcFRvUGF0aCh0YXJnZXRbaW5kZXhdLCBpdGVtLCBBcnJheS5mcm9tKHBhdGgpKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChPYmplY3RVdGlscy5pc09iamVjdChzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBPYmplY3RVdGlscy5pc09iamVjdCh0YXJnZXQpID8gdGFyZ2V0IDoge307XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoKHJlc3VsdCwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBPYmplY3RVdGlscy5tYXBUb1BhdGgodGFyZ2V0W2tleV0sIHNvdXJjZVtrZXldLCBBcnJheS5mcm9tKHBhdGgpKTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgICAgICAgICAgfSwge30pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBPYmplY3RVdGlscy5pc051bGxPclVuZGVmaW5lZCh0YXJnZXQpID8gbnVsbCA6IHRhcmdldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgaXNBcnJheSA9IE9iamVjdFV0aWxzLmlzQXJyYXkodGFyZ2V0KTtcclxuICAgICAgICB0YXJnZXQgPSBPYmplY3RVdGlscy5pc09iamVjdCh0YXJnZXQpIHx8IGlzQXJyYXkgPyB0YXJnZXQgOiB7fTtcclxuICAgICAgICB0YXJnZXRba2V5XSA9IE9iamVjdFV0aWxzLm1hcFRvUGF0aCh0YXJnZXRba2V5XSwgc291cmNlLCBBcnJheS5mcm9tKHBhdGgpKTtcclxuICAgICAgICByZXR1cm4gaXNOYU4oa2V5KSB8fCBpc0FycmF5ID8gdGFyZ2V0IDogT2JqZWN0LnZhbHVlcyh0YXJnZXQpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBmaWx0ZXIob2JqOiBhbnksIHByZWRpY2F0ZTogRmlsdGVyUHJlZGljYXRlKTogYW55IHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuY29weVJlY3Vyc2l2ZShudWxsLCBvYmosIHByZWRpY2F0ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGNvcHk8VD4ob2JqOiBUKTogVCB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdFV0aWxzLmNvcHlSZWN1cnNpdmUobnVsbCwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgYXNzaWduPFQ+KHRhcmdldDogVCwgc291cmNlOiBhbnksIHByZWRpY2F0ZT86IEZpbHRlclByZWRpY2F0ZSk6IFQge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RVdGlscy5jb3B5UmVjdXJzaXZlKHRhcmdldCwgc291cmNlLCBwcmVkaWNhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBnZXRUeXBlKG9iajogYW55KTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAoXCJcXFxccyhbYS16QS1aXSspXCIpO1xyXG4gICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqKS5tYXRjaChyZWdleClbMV0udG9Mb3dlckNhc2UoKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNQcmltaXRpdmUodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGNvbnN0IHR5cGUgPSB0eXBlb2YgdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgKHR5cGUgIT09IFwib2JqZWN0XCIgJiYgdHlwZSAhPT0gXCJmdW5jdGlvblwiKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNPYmplY3QodmFsdWU6IGFueSk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiBPYmplY3RVdGlscy5nZXRUeXBlKHZhbHVlKSA9PT0gXCJvYmplY3RcIjtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNEZWZpbmVkKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSBcInVuZGVmaW5lZFwiICYmIHZhbHVlICE9PSBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc051bGxPclVuZGVmaW5lZCh2YWx1ZTogYW55KTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcInVuZGVmaW5lZFwiIHx8IHZhbHVlID09IG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzU3RyaW5nKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRnVuY3Rpb24odmFsdWU6IGFueSk6IHZhbHVlIGlzIEZ1bmN0aW9uIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSBcImZ1bmN0aW9uXCI7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzRGF0ZSh2YWx1ZTogYW55KTogdmFsdWUgaXMgRGF0ZSB7XHJcbiAgICAgICAgcmV0dXJuIG51bGwgIT09IHZhbHVlICYmICFpc05hTih2YWx1ZSkgJiYgXCJ1bmRlZmluZWRcIiAhPT0gdHlwZW9mIHZhbHVlLmdldERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzQmxvYih2YWx1ZTogYW55KTogdmFsdWUgaXMgQmxvYiB7XHJcbiAgICAgICAgcmV0dXJuIChoYXNCbG9iICYmIHZhbHVlIGluc3RhbmNlb2YgQmxvYikgfHwgKGhhc0ZpbGUgJiYgdmFsdWUgaW5zdGFuY2VvZiBGaWxlKTtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgaXNCb29sZWFuKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdHlwZW9mKHZhbHVlKSA9PSB0eXBlb2YodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzTnVtYmVyKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBudW1iZXIge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwibnVtYmVyXCIpIHJldHVybiBmYWxzZTtcclxuICAgICAgICBjb25zdCBudW0gPSArdmFsdWU7XHJcbiAgICAgICAgaWYgKChudW0gLSBudW0pICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKG51bSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0FycmF5KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBBcnJheTxhbnk+IHtcclxuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIGlzU2V0KHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBTZXQ8YW55PiB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2V0O1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBjaGVja0ludGVyZmFjZShvYmo6IGFueSwgaW50ZXJGYWNlT2JqZWN0OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gT2JqZWN0VXRpbHMuaXNJbnRlcmZhY2Uob2JqLCBpbnRlckZhY2VPYmplY3QpO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBpc0ludGVyZmFjZShvYmo6IGFueSwgaW50ZXJGYWNlT2JqZWN0OiBhbnkpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIW9iaiB8fCB0eXBlb2Ygb2JqICE9PSBcIm9iamVjdFwiIHx8IE9iamVjdFV0aWxzLmlzQXJyYXkob2JqKSB8fCAhT2JqZWN0VXRpbHMuaXNPYmplY3QoaW50ZXJGYWNlT2JqZWN0KSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhpbnRlckZhY2VPYmplY3QpO1xyXG4gICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcclxuICAgICAgICAgICAgbGV0IHR5cGUgPSBpbnRlckZhY2VPYmplY3Rba2V5XSB8fCBcIlwiO1xyXG4gICAgICAgICAgICBpZiAodHlwZS5zdGFydHNXaXRoKFwiKlwiKSkge1xyXG4gICAgICAgICAgICAgICAgdHlwZSA9IHR5cGUuc3Vic3RyKDEpO1xyXG4gICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpICYmIE9iamVjdFV0aWxzLmdldFR5cGUob2JqW2tleV0pICE9PSB0eXBlKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW9iai5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IE9iamVjdFV0aWxzLmdldFR5cGUob2JqW2tleV0pICE9PSB0eXBlKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIHBhZChvYmo6IGFueSwgd2lkdGg6IG51bWJlciwgY2hyOiBzdHJpbmcgPSBcIjBcIik6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3Qgc3RyID0gT2JqZWN0VXRpbHMuaXNEZWZpbmVkKG9iaikgPyBvYmoudG9TdHJpbmcoKSA6IFwiXCI7XHJcbiAgICAgICAgcmV0dXJuIHN0ci5sZW5ndGggPj0gd2lkdGggPyBzdHIgOiBuZXcgQXJyYXkod2lkdGggLSBzdHIubGVuZ3RoICsgMSkuam9pbihjaHIpICsgc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhdGljIGNvcHlSZWN1cnNpdmUodGFyZ2V0OiBhbnksIHNvdXJjZTogYW55LCBwcmVkaWNhdGU/OiBGaWx0ZXJQcmVkaWNhdGUpOiBhbnkge1xyXG4gICAgICAgIHByZWRpY2F0ZSA9IHByZWRpY2F0ZSB8fCBkZWZhdWx0UHJlZGljYXRlO1xyXG4gICAgICAgIGlmIChPYmplY3RVdGlscy5pc1ByaW1pdGl2ZShzb3VyY2UpIHx8IE9iamVjdFV0aWxzLmlzRGF0ZShzb3VyY2UpIHx8IE9iamVjdFV0aWxzLmlzQmxvYihzb3VyY2UpIHx8IE9iamVjdFV0aWxzLmlzRnVuY3Rpb24oc291cmNlKSkgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICBpZiAoT2JqZWN0VXRpbHMuaXNBcnJheShzb3VyY2UpKSB7XHJcbiAgICAgICAgICAgIHRhcmdldCA9IE9iamVjdFV0aWxzLmlzQXJyYXkodGFyZ2V0KSA/IEFycmF5LmZyb20odGFyZ2V0KSA6IFtdO1xyXG4gICAgICAgICAgICBzb3VyY2UuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICghcHJlZGljYXRlKGl0ZW0sIGluZGV4LCB0YXJnZXQsIHNvdXJjZSkpIHJldHVybjtcclxuICAgICAgICAgICAgICAgIGlmICh0YXJnZXQubGVuZ3RoID4gaW5kZXgpXHJcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2luZGV4XSA9IE9iamVjdFV0aWxzLmNvcHlSZWN1cnNpdmUodGFyZ2V0W2luZGV4XSwgaXRlbSwgcHJlZGljYXRlKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQucHVzaChPYmplY3RVdGlscy5jb3B5UmVjdXJzaXZlKG51bGwsIGl0ZW0sIHByZWRpY2F0ZSkpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgcmV0dXJuIHRhcmdldDtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKChyZXN1bHQsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIXByZWRpY2F0ZShzb3VyY2Vba2V5XSwga2V5LCByZXN1bHQsIHNvdXJjZSkpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gT2JqZWN0VXRpbHMuY29weVJlY3Vyc2l2ZShyZXN1bHRba2V5XSwgc291cmNlW2tleV0sIHByZWRpY2F0ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfSwgT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0KSk7XHJcbiAgICB9XHJcbn1cclxuIl19
|