angular-three-cannon 1.0.0 → 1.2.0
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/README.md +12 -4
- package/esm2020/lib/store.mjs +31 -2
- package/esm2020/services/index.mjs +6 -1
- package/esm2020/services/lib/body.mjs +6 -4
- package/esm2020/services/lib/constraint.mjs +68 -0
- package/esm2020/services/lib/contact-material.mjs +17 -0
- package/esm2020/services/lib/ray.mjs +31 -0
- package/esm2020/services/lib/raycast-vehicle.mjs +70 -0
- package/esm2020/services/lib/spring.mjs +36 -0
- package/esm2020/services/lib/utils.mjs +33 -0
- package/fesm2015/angular-three-cannon-services.mjs +235 -6
- package/fesm2015/angular-three-cannon-services.mjs.map +1 -1
- package/fesm2015/angular-three-cannon.mjs +30 -1
- package/fesm2015/angular-three-cannon.mjs.map +1 -1
- package/fesm2020/angular-three-cannon-services.mjs +235 -6
- package/fesm2020/angular-three-cannon-services.mjs.map +1 -1
- package/fesm2020/angular-three-cannon.mjs +30 -1
- package/fesm2020/angular-three-cannon.mjs.map +1 -1
- package/lib/store.d.ts +5 -1
- package/package.json +1 -1
- package/plugin/package.json +1 -1
- package/services/index.d.ts +5 -0
- package/services/lib/constraint.d.ts +26 -0
- package/services/lib/contact-material.d.ts +4 -0
- package/services/lib/ray.d.ts +5 -0
- package/services/lib/raycast-vehicle.d.ts +24 -0
- package/services/lib/spring.d.ts +15 -0
- package/services/lib/utils.d.ts +8 -0
package/README.md
CHANGED
|
@@ -1,7 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Physics utilities for Angular Three using CannonJS
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
## Installation
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
```shell
|
|
6
|
+
ng add angular-three-cannon
|
|
7
|
+
```
|
|
6
8
|
|
|
7
|
-
|
|
9
|
+
## Documentations
|
|
10
|
+
|
|
11
|
+
Read more about Angular Three Cannon usages in [TBD: Documentations](#)
|
|
12
|
+
|
|
13
|
+
## Contributions
|
|
14
|
+
|
|
15
|
+
Contributions are welcomed
|
package/esm2020/lib/store.mjs
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import { NgtRxStore } from 'angular-three';
|
|
2
1
|
import { Injectable } from '@angular/core';
|
|
2
|
+
import { makeId, NgtRxStore } from 'angular-three';
|
|
3
3
|
import * as i0 from "@angular/core";
|
|
4
4
|
export class NgtcStore extends NgtRxStore {
|
|
5
|
+
constructor() {
|
|
6
|
+
super(...arguments);
|
|
7
|
+
this.optionsQueue = {};
|
|
8
|
+
}
|
|
5
9
|
initialize() {
|
|
6
10
|
super.initialize();
|
|
7
11
|
this.set({
|
|
@@ -10,12 +14,37 @@ export class NgtcStore extends NgtRxStore {
|
|
|
10
14
|
refs: {},
|
|
11
15
|
scaleOverrides: {},
|
|
12
16
|
subscriptions: {},
|
|
17
|
+
optionsQueueNotifier: Date.now(),
|
|
18
|
+
});
|
|
19
|
+
queueMicrotask(() => {
|
|
20
|
+
this.run();
|
|
21
|
+
this.hold(this.select('optionsQueueNotifier'), () => {
|
|
22
|
+
if (Object.keys(this.optionsQueue).length) {
|
|
23
|
+
this.run();
|
|
24
|
+
}
|
|
25
|
+
});
|
|
13
26
|
});
|
|
14
27
|
}
|
|
28
|
+
queue(cb) {
|
|
29
|
+
const id = makeId();
|
|
30
|
+
this.optionsQueue[id] = cb;
|
|
31
|
+
this.set({ optionsQueueNotifier: Date.now() });
|
|
32
|
+
return id;
|
|
33
|
+
}
|
|
34
|
+
remove(id) {
|
|
35
|
+
delete this.optionsQueue[id];
|
|
36
|
+
}
|
|
37
|
+
run() {
|
|
38
|
+
for (const id of Object.keys(this.optionsQueue)) {
|
|
39
|
+
const cb = this.optionsQueue[id];
|
|
40
|
+
cb();
|
|
41
|
+
this.remove(id);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
15
44
|
}
|
|
16
45
|
NgtcStore.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: NgtcStore, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
|
|
17
46
|
NgtcStore.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: NgtcStore });
|
|
18
47
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.1", ngImport: i0, type: NgtcStore, decorators: [{
|
|
19
48
|
type: Injectable
|
|
20
49
|
}] });
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
50
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtY2Fubm9uL3NyYy9saWIvc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBYSxNQUFNLGVBQWUsQ0FBQztBQVd0RCxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUF3Qm5ELE1BQU0sT0FBTyxTQUFVLFNBQVEsVUFBcUI7SUFEcEQ7O1FBRXFCLGlCQUFZLEdBQStCLEVBQUUsQ0FBQztLQXdDbEU7SUF2Q1ksVUFBVTtRQUNmLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ0wsTUFBTSxFQUFFLEVBQUU7WUFDVixNQUFNLEVBQUUsRUFBRTtZQUNWLElBQUksRUFBRSxFQUFFO1lBQ1IsY0FBYyxFQUFFLEVBQUU7WUFDbEIsYUFBYSxFQUFFLEVBQUU7WUFDakIsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtTQUNuQyxDQUFDLENBQUM7UUFFSCxjQUFjLENBQUMsR0FBRyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLEdBQUcsRUFBRTtnQkFDaEQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxNQUFNLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztpQkFDZDtZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsS0FBSyxDQUFDLEVBQWM7UUFDaEIsTUFBTSxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLG9CQUFvQixFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsTUFBTSxDQUFDLEVBQVU7UUFDYixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVPLEdBQUc7UUFDUCxLQUFLLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzdDLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDakMsRUFBRSxFQUFFLENBQUM7WUFDTCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ25CO0lBQ0wsQ0FBQzs7c0dBeENRLFNBQVM7MEdBQVQsU0FBUzsyRkFBVCxTQUFTO2tCQURyQixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgdHlwZSB7XG4gICAgQ2Fubm9uV29ya2VyQVBJLFxuICAgIENhbm5vbldvcmtlclByb3BzLFxuICAgIENvbGxpZGVCZWdpbkV2ZW50LFxuICAgIENvbGxpZGVFbmRFdmVudCxcbiAgICBDb2xsaWRlRXZlbnQsXG4gICAgUmF5aGl0RXZlbnQsXG4gICAgUmVmcyxcbiAgICBTdWJzY3JpcHRpb25zLFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IG1ha2VJZCwgTmd0UnhTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuXG5leHBvcnQgdHlwZSBOZ3RjRXZlbnQgPSBDb2xsaWRlQmVnaW5FdmVudCB8IENvbGxpZGVFbmRFdmVudCB8IENvbGxpZGVFdmVudCB8IFJheWhpdEV2ZW50O1xuZXhwb3J0IHR5cGUgTmd0Y0NhbGxiYWNrQnlUeXBlPFQgZXh0ZW5kcyB7IHR5cGU6IHN0cmluZyB9PiA9IHtcbiAgICBbSyBpbiBUWyd0eXBlJ11dPzogVCBleHRlbmRzIHsgdHlwZTogSyB9ID8gKGU6IFQpID0+IHZvaWQgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNFdmVudHMgPSB7XG4gICAgW3V1aWQ6IHN0cmluZ106IFBhcnRpYWw8Tmd0Y0NhbGxiYWNrQnlUeXBlPE5ndGNFdmVudD4+O1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y1NjYWxlT3ZlcnJpZGVzID0geyBbdXVpZDogc3RyaW5nXTogVEhSRUUuVmVjdG9yMyB9O1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNTdGF0ZSB7XG4gICAgYm9kaWVzOiB7IFt1dWlkOiBzdHJpbmddOiBudW1iZXIgfTtcbiAgICBldmVudHM6IE5ndGNFdmVudHM7XG4gICAgcmVmczogUmVmcztcbiAgICBzY2FsZU92ZXJyaWRlczogTmd0Y1NjYWxlT3ZlcnJpZGVzO1xuICAgIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbnM7XG4gICAgd29ya2VyOiBDYW5ub25Xb3JrZXJBUEk7XG4gICAgaW5pdDogKGlucHV0czogQ2Fubm9uV29ya2VyUHJvcHMpID0+IHZvaWQ7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBOZ3RjU3RvcmUgZXh0ZW5kcyBOZ3RSeFN0b3JlPE5ndGNTdGF0ZT4gaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uc1F1ZXVlOiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB2b2lkPiA9IHt9O1xuICAgIG92ZXJyaWRlIGluaXRpYWxpemUoKSB7XG4gICAgICAgIHN1cGVyLmluaXRpYWxpemUoKTtcbiAgICAgICAgdGhpcy5zZXQoe1xuICAgICAgICAgICAgYm9kaWVzOiB7fSxcbiAgICAgICAgICAgIGV2ZW50czoge30sXG4gICAgICAgICAgICByZWZzOiB7fSxcbiAgICAgICAgICAgIHNjYWxlT3ZlcnJpZGVzOiB7fSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM6IHt9LFxuICAgICAgICAgICAgb3B0aW9uc1F1ZXVlTm90aWZpZXI6IERhdGUubm93KCksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMucnVuKCk7XG4gICAgICAgICAgICB0aGlzLmhvbGQodGhpcy5zZWxlY3QoJ29wdGlvbnNRdWV1ZU5vdGlmaWVyJyksICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy5vcHRpb25zUXVldWUpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBxdWV1ZShjYjogKCkgPT4gdm9pZCkge1xuICAgICAgICBjb25zdCBpZCA9IG1ha2VJZCgpO1xuICAgICAgICB0aGlzLm9wdGlvbnNRdWV1ZVtpZF0gPSBjYjtcbiAgICAgICAgdGhpcy5zZXQoeyBvcHRpb25zUXVldWVOb3RpZmllcjogRGF0ZS5ub3coKSB9KTtcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHJlbW92ZShpZDogc3RyaW5nKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLm9wdGlvbnNRdWV1ZVtpZF07XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBydW4oKSB7XG4gICAgICAgIGZvciAoY29uc3QgaWQgb2YgT2JqZWN0LmtleXModGhpcy5vcHRpb25zUXVldWUpKSB7XG4gICAgICAgICAgICBjb25zdCBjYiA9IHRoaXMub3B0aW9uc1F1ZXVlW2lkXTtcbiAgICAgICAgICAgIGNiKCk7XG4gICAgICAgICAgICB0aGlzLnJlbW92ZShpZCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
export * from './lib/body';
|
|
2
|
-
|
|
2
|
+
export * from './lib/constraint';
|
|
3
|
+
export * from './lib/contact-material';
|
|
4
|
+
export * from './lib/ray';
|
|
5
|
+
export * from './lib/raycast-vehicle';
|
|
6
|
+
export * from './lib/spring';
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL2FuZ3VsYXItdGhyZWUtY2Fubm9uL3NlcnZpY2VzL3NyYy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsd0JBQXdCLENBQUM7QUFDdkMsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbGliL2JvZHknO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvY29uc3RyYWludCc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9jb250YWN0LW1hdGVyaWFsJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3JheSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9yYXljYXN0LXZlaGljbGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvc3ByaW5nJztcbiJdfQ==
|
|
@@ -74,9 +74,10 @@ function injectBody(type, getPropsFn, argsFn, { ref, waitFor } = {}) {
|
|
|
74
74
|
// by Physics without a visual representation
|
|
75
75
|
combineLatest(waits$).subscribe(() => (bodyRef.nativeElement || (bodyRef.nativeElement = new THREE.Object3D())));
|
|
76
76
|
// start the pipeline as soon as bodyRef has a truthy value
|
|
77
|
-
subscription =
|
|
78
|
-
|
|
77
|
+
subscription = combineLatest([physicsStore.select('worker'), bodyRef.$])
|
|
78
|
+
.pipe(switchMap(([worker, object]) => {
|
|
79
79
|
const currentWorker = worker;
|
|
80
|
+
const { events, refs } = physicsStore.get();
|
|
80
81
|
let objectCount = 1;
|
|
81
82
|
if (object instanceof THREE.InstancedMesh) {
|
|
82
83
|
object.instanceMatrix.setUsage(THREE.DynamicDrawUsage);
|
|
@@ -132,7 +133,8 @@ function injectBody(type, getPropsFn, argsFn, { ref, waitFor } = {}) {
|
|
|
132
133
|
currentWorker.removeBodies({ uuid: uuids });
|
|
133
134
|
};
|
|
134
135
|
}));
|
|
135
|
-
}))
|
|
136
|
+
}))
|
|
137
|
+
.subscribe();
|
|
136
138
|
const makeAtomic = (type, index) => {
|
|
137
139
|
const op = `set${NgtcUtils.capitalize(type)}`;
|
|
138
140
|
return {
|
|
@@ -290,4 +292,4 @@ function injectBody(type, getPropsFn, argsFn, { ref, waitFor } = {}) {
|
|
|
290
292
|
const api = { ...makeApi(undefined), at: (index) => cache[index] || (cache[index] = makeApi(index)) };
|
|
291
293
|
return { ref: bodyRef, api };
|
|
292
294
|
}
|
|
293
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1jYW5ub24vc2VydmljZXMvc3JjL2xpYi9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUF1QnZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQWtCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0csT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFpRC9CLE1BQU0sVUFBVSxXQUFXLENBQ3ZCLEVBQThCLEVBQzlCLElBQXVFO0lBRXZFLE9BQU8sVUFBVSxDQUFzQixPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDckIsRUFBNEIsRUFDNUIsSUFBdUU7SUFFdkUsTUFBTSxjQUFjLEdBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxDQUFvQixLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLGNBQWMsRUFBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BHLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUMxQixFQUFpQyxFQUNqQyxJQUF1RTtJQUV2RSxPQUFPLFVBQVUsQ0FBeUIsVUFBVSxF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RUFBRSxLQUFLLENBQUM7WUFDdkMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDO1lBQ3BDLE1BQU07Z0JBQ0YsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDdEMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQy9DLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUNwQyxDQUFDO1NBQ0osQ0FBQztJQUNOLENBQUM7SUFFRCxNQUFNLEtBQUssR0FBdUMsRUFBRSxDQUFDO0lBQ3JELE1BQU0sR0FBRyxHQUFHLEVBQUUsR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUM5RyxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIEF0b21pY05hbWUsXG4gICAgQXRvbWljUHJvcHMsXG4gICAgQm9keVByb3BzLFxuICAgIEJvZHlTaGFwZVR5cGUsXG4gICAgQm94UHJvcHMsXG4gICAgQ29tcG91bmRCb2R5UHJvcHMsXG4gICAgQ29udmV4UG9seWhlZHJvbkFyZ3MsXG4gICAgQ29udmV4UG9seWhlZHJvblByb3BzLFxuICAgIEN5bGluZGVyUHJvcHMsXG4gICAgSGVpZ2h0ZmllbGRQcm9wcyxcbiAgICBQYXJ0aWNsZVByb3BzLFxuICAgIFBsYW5lUHJvcHMsXG4gICAgUHJvcFZhbHVlLFxuICAgIFF1YWQsXG4gICAgU2V0T3BOYW1lLFxuICAgIFNwaGVyZUFyZ3MsXG4gICAgU3BoZXJlUHJvcHMsXG4gICAgVHJpbWVzaFByb3BzLFxuICAgIFRyaXBsZXQsXG4gICAgVmVjdG9yTmFtZSxcbn0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBpbmplY3ROZ3REZXN0cm95LCBpbmplY3ROZ3RSZWYsIE5ndEluamVjdGVkUmVmLCB0YXBFZmZlY3QgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndGNTdG9yZSwgTmd0Y1V0aWxzIH0gZnJvbSAnYW5ndWxhci10aHJlZS1jYW5ub24nO1xuaW1wb3J0IHsgTkdUQ19ERUJVR19BUEkgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbi9kZWJ1Zyc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBpc09ic2VydmFibGUsIE9ic2VydmFibGUsIG9mLCBSZXBsYXlTdWJqZWN0LCBTdWJzY3JpcHRpb24sIHN3aXRjaE1hcCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuXG5leHBvcnQgdHlwZSBOZ3RjQXRvbWljQXBpPEsgZXh0ZW5kcyBBdG9taWNOYW1lPiA9IHtcbiAgICBzZXQ6ICh2YWx1ZTogQXRvbWljUHJvcHNbS10pID0+IHZvaWQ7XG4gICAgc3Vic2NyaWJlOiAoY2FsbGJhY2s6ICh2YWx1ZTogQXRvbWljUHJvcHNbS10pID0+IHZvaWQpID0+ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RjUXVhdGVybmlvbkFwaSA9IHtcbiAgICBjb3B5OiAoeyB3LCB4LCB5LCB6IH06IFRIUkVFLlF1YXRlcm5pb24pID0+IHZvaWQ7XG4gICAgc2V0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlciwgdzogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHN1YnNjcmliZTogKGNhbGxiYWNrOiAodmFsdWU6IFF1YWQpID0+IHZvaWQpID0+ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgdHlwZSBOZ3RjVmVjdG9yQXBpID0ge1xuICAgIGNvcHk6ICh7IHgsIHksIHogfTogVEhSRUUuVmVjdG9yMyB8IFRIUkVFLkV1bGVyKSA9PiB2b2lkO1xuICAgIHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc3Vic2NyaWJlOiAoY2FsbGJhY2s6ICh2YWx1ZTogVHJpcGxldCkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNXb3JrZXJBcGkgPSB7XG4gICAgW0sgaW4gQXRvbWljTmFtZV06IE5ndGNBdG9taWNBcGk8Sz47XG59ICYge1xuICAgIFtLIGluIFZlY3Rvck5hbWVdOiBOZ3RjVmVjdG9yQXBpO1xufSAmIHtcbiAgICBhcHBseUZvcmNlOiAoZm9yY2U6IFRyaXBsZXQsIHdvcmxkUG9pbnQ6IFRyaXBsZXQpID0+IHZvaWQ7XG4gICAgYXBwbHlJbXB1bHNlOiAoaW1wdWxzZTogVHJpcGxldCwgd29ybGRQb2ludDogVHJpcGxldCkgPT4gdm9pZDtcbiAgICBhcHBseUxvY2FsRm9yY2U6IChmb3JjZTogVHJpcGxldCwgbG9jYWxQb2ludDogVHJpcGxldCkgPT4gdm9pZDtcbiAgICBhcHBseUxvY2FsSW1wdWxzZTogKGltcHVsc2U6IFRyaXBsZXQsIGxvY2FsUG9pbnQ6IFRyaXBsZXQpID0+IHZvaWQ7XG4gICAgYXBwbHlUb3JxdWU6ICh0b3JxdWU6IFRyaXBsZXQpID0+IHZvaWQ7XG4gICAgcXVhdGVybmlvbjogTmd0Y1F1YXRlcm5pb25BcGk7XG4gICAgcm90YXRpb246IE5ndGNWZWN0b3JBcGk7XG4gICAgc2NhbGVPdmVycmlkZTogKHNjYWxlOiBUcmlwbGV0KSA9PiB2b2lkO1xuICAgIHNsZWVwOiAoKSA9PiB2b2lkO1xuICAgIHdha2VVcDogKCkgPT4gdm9pZDtcbiAgICByZW1vdmU6ICgpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNCb2R5UHVibGljQXBpIGV4dGVuZHMgTmd0Y1dvcmtlckFwaSB7XG4gICAgYXQ6IChpbmRleDogbnVtYmVyKSA9PiBOZ3RjV29ya2VyQXBpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNCb2R5UmV0dXJuPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4ge1xuICAgIHJlZjogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47XG4gICAgYXBpOiBOZ3RjQm9keVB1YmxpY0FwaTtcbn1cblxuZXhwb3J0IHR5cGUgTmd0Y0dldEJ5SW5kZXg8VCBleHRlbmRzIEJvZHlQcm9wcz4gPSAoaW5kZXg6IG51bWJlcikgPT4gVCB8IE9ic2VydmFibGU8VD47XG5leHBvcnQgdHlwZSBOZ3RjQXJnRm48VD4gPSAoYXJnczogVCkgPT4gdW5rbm93bltdO1xuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UGxhbmU8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8UGxhbmVQcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIHJldHVybiBpbmplY3RCb2R5PFBsYW5lUHJvcHMsIFRPYmplY3Q+KCdQbGFuZScsIGZuLCAoKSA9PiBbXSwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RCb3g8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8Qm94UHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICBjb25zdCBkZWZhdWx0Qm94QXJnczogVHJpcGxldCA9IFsxLCAxLCAxXTtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxCb3hQcm9wcywgVE9iamVjdD4oJ0JveCcsIGZuLCAoYXJncyA9IGRlZmF1bHRCb3hBcmdzKTogVHJpcGxldCA9PiBhcmdzLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEN5bGluZGVyPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PEN5bGluZGVyUHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxDeWxpbmRlclByb3BzLCBUT2JqZWN0PignQ3lsaW5kZXInLCBmbiwgKGFyZ3MgPSBbXSBhcyBbXSkgPT4gYXJncywgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RIZWlnaHRmaWVsZDxUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuICAgIGZuOiBOZ3RjR2V0QnlJbmRleDxIZWlnaHRmaWVsZFByb3BzPixcbiAgICBvcHRzPzogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfVxuKSB7XG4gICAgcmV0dXJuIGluamVjdEJvZHk8SGVpZ2h0ZmllbGRQcm9wcywgVE9iamVjdD4oJ0hlaWdodGZpZWxkJywgZm4sIChhcmdzKSA9PiBhcmdzLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFBhcnRpY2xlPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PFBhcnRpY2xlUHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxQYXJ0aWNsZVByb3BzLCBUT2JqZWN0PignUGFydGljbGUnLCBmbiwgKCkgPT4gW10sIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0U3BoZXJlPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PFNwaGVyZVByb3BzPixcbiAgICBvcHRzPzogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfVxuKSB7XG4gICAgcmV0dXJuIGluamVjdEJvZHk8U3BoZXJlUHJvcHMsIFRPYmplY3Q+KFxuICAgICAgICAnU3BoZXJlJyxcbiAgICAgICAgZm4sXG4gICAgICAgIChhcmdzOiBTcGhlcmVBcmdzID0gWzFdKTogU3BoZXJlQXJncyA9PiB7XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncykpIHRocm93IG5ldyBFcnJvcignaW5qZWN0U3BoZXJlIGFyZ3MgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgICAgICAgICAgcmV0dXJuIFthcmdzWzBdXTtcbiAgICAgICAgfSxcbiAgICAgICAgb3B0c1xuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RUcmltZXNoPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PFRyaW1lc2hQcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIHJldHVybiBpbmplY3RCb2R5PFRyaW1lc2hQcm9wcywgVE9iamVjdD4oJ1RyaW1lc2gnLCBmbiwgKGFyZ3MpID0+IGFyZ3MsIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29udmV4UG9seWhlZHJvbjxUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuICAgIGZuOiBOZ3RjR2V0QnlJbmRleDxDb252ZXhQb2x5aGVkcm9uUHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxDb252ZXhQb2x5aGVkcm9uUHJvcHMsIFRPYmplY3Q+KFxuICAgICAgICAnQ29udmV4UG9seWhlZHJvbicsXG4gICAgICAgIGZuLFxuICAgICAgICAoW3ZlcnRpY2VzLCBmYWNlcywgbm9ybWFscywgYXhlcywgYm91bmRpbmdTcGhlcmVSYWRpdXNdID0gW10pOiBDb252ZXhQb2x5aGVkcm9uQXJnczxUcmlwbGV0PiA9PiBbXG4gICAgICAgICAgICB2ZXJ0aWNlcyAmJiB2ZXJ0aWNlcy5tYXAoTmd0Y1V0aWxzLm1ha2VUcmlwbGV0KSxcbiAgICAgICAgICAgIGZhY2VzLFxuICAgICAgICAgICAgbm9ybWFscyAmJiBub3JtYWxzLm1hcChOZ3RjVXRpbHMubWFrZVRyaXBsZXQpLFxuICAgICAgICAgICAgYXhlcyAmJiBheGVzLm1hcChOZ3RjVXRpbHMubWFrZVRyaXBsZXQpLFxuICAgICAgICAgICAgYm91bmRpbmdTcGhlcmVSYWRpdXMsXG4gICAgICAgIF0sXG4gICAgICAgIG9wdHNcbiAgICApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q29tcG91bmRCb2R5PFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PENvbXBvdW5kQm9keVByb3BzPixcbiAgICBvcHRzPzogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfVxuKSB7XG4gICAgcmV0dXJuIGluamVjdEJvZHk8Q29tcG91bmRCb2R5UHJvcHMsIFRPYmplY3Q+KCdDb21wb3VuZCcsIGZuLCAoYXJncykgPT4gYXJncyBhcyB1bmtub3duW10sIG9wdHMpO1xufVxuXG5jb25zdCB0ZW1wID0gbmV3IFRIUkVFLk9iamVjdDNEKCk7XG5cbmZ1bmN0aW9uIGluamVjdEJvZHk8VEJvZHlQcm9wcyBleHRlbmRzIEJvZHlQcm9wcywgVE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICB0eXBlOiBCb2R5U2hhcGVUeXBlLFxuICAgIGdldFByb3BzRm46IE5ndGNHZXRCeUluZGV4PFRCb2R5UHJvcHM+LFxuICAgIGFyZ3NGbjogTmd0Y0FyZ0ZuPFRCb2R5UHJvcHNbJ2FyZ3MnXT4sXG4gICAgeyByZWYsIHdhaXRGb3IgfTogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfSA9IHt9XG4pOiBOZ3RjQm9keVJldHVybjxUT2JqZWN0PiB7XG4gICAgbGV0IHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gYSBSZXBsYXlTdWJqZWN0IHRoYXQgd291bGQgZW1pdCBvbmNlIGluIHF1ZXVlTWljcm90YXNrIGNhbGxcbiAgICBjb25zdCBtaWNyb1F1ZXVlJCA9IG5ldyBSZXBsYXlTdWJqZWN0PHZvaWQ+KDEpO1xuICAgIC8vIGEgUmVwbGF5U3ViamVjdCB0aGF0IHdvdWxkIGVtaXQgd2hlbmV2ZXIgb3VyIHByb3BzIGVtaXRzLiBUaGlzIGlzIGRvbmUgc28gdGhhdCB0aGUgY29uc3VtZXJzIGNhbiBwYXNzIGluXG4gICAgLy8gT2JzZXJ2YWJsZSB0byBpbmplY3RCb2R5IGlmIHRoZXkgaGF2ZSByZWFjdGl2ZSBwcm9wcyAoZWc6IElucHV0KVxuICAgIGNvbnN0IHByb3BzU3ViamVjdCQgPSBuZXcgUmVwbGF5U3ViamVjdDxUQm9keVByb3BzPigxKTtcblxuICAgIC8vIGFuIGFycmF5IG9mIHN0cmVhbXMgd2Ugd2FudCB0byB3YWl0IHRvIGVtaXQgdW50aWwgd2UgZGVjaWRlIHRvIGdpdmUgdGhlIGJvZHlSZWYgYW4gZW1wdHkgT2JqZWN0M0RcbiAgICBjb25zdCB3YWl0cyQgPSBbbWljcm9RdWV1ZSRdIGFzIE9ic2VydmFibGU8dW5rbm93bj5bXTtcblxuICAgIGNvbnN0IGRlYnVnQXBpID0gaW5qZWN0KE5HVENfREVCVUdfQVBJLCB7IHNraXBTZWxmOiB0cnVlLCBvcHRpb25hbDogdHJ1ZSB9KTtcbiAgICBjb25zdCBwaHlzaWNzU3RvcmUgPSBpbmplY3QoTmd0Y1N0b3JlLCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuXG4gICAgLy8gY2xlYW4gdXAgb3VyIHN0cmVhbXMgb24gZGVzdHJveVxuICAgIGluamVjdE5ndERlc3Ryb3koKCkgPT4ge1xuICAgICAgICBtaWNyb1F1ZXVlJC5jb21wbGV0ZSgpO1xuICAgICAgICBwcm9wc1N1YmplY3QkLmNvbXBsZXRlKCk7XG4gICAgICAgIHN1YnNjcmlwdGlvbj8udW5zdWJzY3JpYmUoKTtcbiAgICB9KTtcblxuICAgIC8vIGdpdmUgb3VyIGJvZHlSZWYgYW4gTmd0SW5qZWN0ZWRSZWZcbiAgICBsZXQgYm9keVJlZiA9IGluamVjdE5ndFJlZjxUT2JqZWN0PigpO1xuXG4gICAgLy8gYWRkIHdhaXRGb3IgaWYgdGhlIGNvbnN1bWVycyBwYXNzIGl0IGluXG4gICAgaWYgKHdhaXRGb3IpIHdhaXRzJC5wdXNoKHdhaXRGb3IpO1xuICAgIC8vIHJlLWFzc2lnbiBib2R5UmVmIGlmIHRoZSBjb25zdW1lcnMgcGFzcyBhIHJlZiBpblxuICAgIGlmIChyZWYpIGJvZHlSZWYgPSByZWY7XG5cbiAgICAvLyBmaXJlIG1pY3JvUXVldWUkXG4gICAgcXVldWVNaWNyb3Rhc2soKCkgPT4gbWljcm9RdWV1ZSQubmV4dCgpKTtcblxuICAgIC8vIHdoZW4gYWxsIHdhaXRzJCBlbWl0LCB3ZSBnaXZlIGJvZHlSZWYgYW4gZW1wdHkgT2JqZWN0M0QgaWYgaXQgZG9lc24ndCBoYXZlIG9uZS4gUGh5c2ljIE9iamVjdCBjYW4gc3RpbGwgYmUgYWZmZWN0ZWRcbiAgICAvLyBieSBQaHlzaWNzIHdpdGhvdXQgYSB2aXN1YWwgcmVwcmVzZW50YXRpb25cbiAgICBjb21iaW5lTGF0ZXN0KHdhaXRzJCkuc3Vic2NyaWJlKCgpID0+IChib2R5UmVmLm5hdGl2ZUVsZW1lbnQgfHw9IG5ldyBUSFJFRS5PYmplY3QzRCgpIGFzIFRPYmplY3QpKTtcblxuICAgIC8vIHN0YXJ0IHRoZSBwaXBlbGluZSBhcyBzb29uIGFzIGJvZHlSZWYgaGFzIGEgdHJ1dGh5IHZhbHVlXG4gICAgc3Vic2NyaXB0aW9uID0gYm9keVJlZi4kLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgob2JqZWN0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGV2ZW50cywgcmVmcywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRXb3JrZXIgPSB3b3JrZXI7XG4gICAgICAgICAgICBsZXQgb2JqZWN0Q291bnQgPSAxO1xuXG4gICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuSW5zdGFuY2VkTWVzaCkge1xuICAgICAgICAgICAgICAgIG9iamVjdC5pbnN0YW5jZU1hdHJpeC5zZXRVc2FnZShUSFJFRS5EeW5hbWljRHJhd1VzYWdlKTtcbiAgICAgICAgICAgICAgICBvYmplY3RDb3VudCA9IG9iamVjdC5jb3VudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gY29uc29saWRhdGUgb3VyIHV1aWRzIGludG8gYW4gQXJyYXkgc28gd2UgY2FuIGhhbmRsZSB0aGVtIGluIGEgbW9yZSBjb25zaXN0ZW50IHdheVxuICAgICAgICAgICAgY29uc3QgdXVpZHMgPVxuICAgICAgICAgICAgICAgIG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkluc3RhbmNlZE1lc2hcbiAgICAgICAgICAgICAgICAgICAgPyBuZXcgQXJyYXkob2JqZWN0Q291bnQpLmZpbGwoMCkubWFwKChfLCBpKSA9PiBgJHtvYmplY3QudXVpZH0vJHtpfWApXG4gICAgICAgICAgICAgICAgICAgIDogW29iamVjdC51dWlkXTtcblxuICAgICAgICAgICAgLy8gY29uc3RydWN0IGFuIEFycmF5PE9ic2VydmFibGU+IGZyb20gZ2V0UHJvcHNGblxuICAgICAgICAgICAgLy8gc28gd2UgY2FuIHJlYWN0IHRvIHByb3BzIGNoYW5nZWRcbiAgICAgICAgICAgIGNvbnN0IHByb3BzTGlzdCQgPSB1dWlkcy5tYXAoKHV1aWQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHNSZXN1bHQgPSBnZXRQcm9wc0ZuKGluZGV4KTtcbiAgICAgICAgICAgICAgICAvLyBUT0RPICB3ZSB1c2UgYSBwcm9wc1N1YmplY3QkIGJlY2F1c2Ugd2Ugd2FudCB0byBlbnN1cmUgdGhpcyBwcm9wc1Jlc3VsdCBzdHJlYW0gaXMgSE9UXG4gICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB0YXBFZmZlY3Qgd2lsbCByZW1vdmUgZXZlcnl0aGluZyBmcm9tIGN1cnJlbnRXb3JrZXIjYm9kaWVzIGJlY2F1c2UgdGhlIHN0cmVhbSBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgICAoaXNPYnNlcnZhYmxlKHByb3BzUmVzdWx0KSA/IHByb3BzUmVzdWx0IDogb2YocHJvcHNSZXN1bHQpKS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBuZXh0OiAocHJvcHMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ndGNVdGlscy5wcmVwYXJlKHRlbXAsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5JbnN0YW5jZWRNZXNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0LnNldE1hdHJpeEF0KGluZGV4LCB0ZW1wLm1hdHJpeCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Lmluc3RhbmNlTWF0cml4Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnNbdXVpZF0gPSBvYmplY3Q7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0FwaT8uYWRkKHV1aWQsIHByb3BzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ndGNVdGlscy5zZXR1cENvbGxpc2lvbihldmVudHMsIHByb3BzLCB1dWlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzU3ViamVjdCQubmV4dCh7IC4uLnByb3BzLCBhcmdzOiBhcmdzRm4ocHJvcHMuYXJncykgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYFtOR1QgQ2Fubm9uXSBFcnJvciB3aXRoIHByb2Nlc3NpbmcgcHJvcHM6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1N1YmplY3QkLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBwcm9wc1N1YmplY3QkO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KHByb3BzTGlzdCQpLnBpcGUoXG4gICAgICAgICAgICAgICAgdGFwRWZmZWN0KChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50V29ya2VyLmFkZEJvZGllcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogcHJvcHMubWFwKCh7IG9uQ29sbGlkZSwgb25Db2xsaWRlQmVnaW4sIG9uQ29sbGlkZUVuZCwgLi4uc2VyaWFsaXphYmxlUHJvcHMgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbGxpZGU6IEJvb2xlYW4ob25Db2xsaWRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbGxpZGVCZWdpbjogQm9vbGVhbihvbkNvbGxpZGVCZWdpbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db2xsaWRlRW5kOiBCb29sZWFuKG9uQ29sbGlkZUVuZCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXphYmxlUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogdXVpZHMsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBDYW5ub25Xb3JrZXIgd2hlbmV2ZXIgcHJvcHMgY2hhbmdlcy9jb21wbGV0ZXNcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHV1aWRzLmZvckVhY2goKHV1aWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcmVmc1t1dWlkXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0FwaT8ucmVtb3ZlKHV1aWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBldmVudHNbdXVpZF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXb3JrZXIucmVtb3ZlQm9kaWVzKHsgdXVpZDogdXVpZHMgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgKS5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IG1ha2VBdG9taWMgPSA8VCBleHRlbmRzIEF0b21pY05hbWU+KHR5cGU6IFQsIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wOiBTZXRPcE5hbWU8VD4gPSBgc2V0JHtOZ3RjVXRpbHMuY2FwaXRhbGl6ZSh0eXBlKX1gO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXQ6ICh2YWx1ZTogUHJvcFZhbHVlPFQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyW29wXSh7IHByb3BzOiB2YWx1ZSwgdXVpZCB9IGFzIG5ldmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUXVhdGVybmlvbiA9IChpbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gJ3F1YXRlcm5pb24nO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29weTogKHsgdywgeCwgeSwgeiB9OiBUSFJFRS5RdWF0ZXJuaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFF1YXRlcm5pb24oeyBwcm9wczogW3gsIHksIHosIHddLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5zZXRRdWF0ZXJuaW9uKHsgcHJvcHM6IFt4LCB5LCB6LCB3XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUm90YXRpb24gPSAoaW5kZXg/OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcHk6ICh7IHgsIHksIHogfTogVEhSRUUuVmVjdG9yMyB8IFRIUkVFLkV1bGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFJvdGF0aW9uKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFJvdGF0aW9uKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBUcmlwbGV0KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdWJzY3JpcHRpb25zLCB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IE5ndGNVdGlscy5pbmNyZW1lbnRpbmdJZCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICdib2RpZXMnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSAncXVhdGVybmlvbic7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnNbaWRdID0geyBbdHlwZV06IE5ndGNVdGlscy5xdWF0ZXJuaW9uVG9Sb3RhdGlvbihjYWxsYmFjaykgfTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5zdWJzY3JpYmUoeyBwcm9wczogeyBpZCwgdGFyZ2V0LCB0eXBlIH0sIHV1aWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN1YnNjcmlwdGlvbnNbaWRdO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIudW5zdWJzY3JpYmUoeyBwcm9wczogaWQgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VWZWMgPSAodHlwZTogVmVjdG9yTmFtZSwgaW5kZXg/OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgb3A6IFNldE9wTmFtZTxWZWN0b3JOYW1lPiA9IGBzZXQke05ndGNVdGlscy5jYXBpdGFsaXplKHR5cGUpfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3B5OiAoeyB4LCB5LCB6IH06IFRIUkVFLlZlY3RvcjMgfCBUSFJFRS5FdWxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlcltvcF0oeyBwcm9wczogW3gsIHksIHpdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXJbb3BdKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUmVtb3ZlID0gKGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodXVpZCkgd29ya2VyLnJlbW92ZUJvZGllcyh7IHV1aWQ6IFt1dWlkXSB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFrZUFwaShpbmRleD86IG51bWJlcik6IE5ndGNXb3JrZXJBcGkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsb3dTbGVlcDogbWFrZUF0b21pYygnYWxsb3dTbGVlcCcsIGluZGV4KSxcbiAgICAgICAgICAgIGFuZ3VsYXJEYW1waW5nOiBtYWtlQXRvbWljKCdhbmd1bGFyRGFtcGluZycsIGluZGV4KSxcbiAgICAgICAgICAgIGFuZ3VsYXJGYWN0b3I6IG1ha2VWZWMoJ2FuZ3VsYXJGYWN0b3InLCBpbmRleCksXG4gICAgICAgICAgICBhbmd1bGFyVmVsb2NpdHk6IG1ha2VWZWMoJ2FuZ3VsYXJWZWxvY2l0eScsIGluZGV4KSxcbiAgICAgICAgICAgIGFwcGx5Rm9yY2UoZm9yY2U6IFRyaXBsZXQsIHdvcmxkUG9pbnQ6IFRyaXBsZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIuYXBwbHlGb3JjZSh7IHByb3BzOiBbZm9yY2UsIHdvcmxkUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5SW1wdWxzZShpbXB1bHNlOiBUcmlwbGV0LCB3b3JsZFBvaW50OiBUcmlwbGV0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLmFwcGx5SW1wdWxzZSh7IHByb3BzOiBbaW1wdWxzZSwgd29ybGRQb2ludF0sIHV1aWQgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwbHlMb2NhbEZvcmNlKGZvcmNlOiBUcmlwbGV0LCBsb2NhbFBvaW50OiBUcmlwbGV0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLmFwcGx5TG9jYWxGb3JjZSh7IHByb3BzOiBbZm9yY2UsIGxvY2FsUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5TG9jYWxJbXB1bHNlKGltcHVsc2U6IFRyaXBsZXQsIGxvY2FsUG9pbnQ6IFRyaXBsZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIuYXBwbHlMb2NhbEltcHVsc2UoeyBwcm9wczogW2ltcHVsc2UsIGxvY2FsUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5VG9ycXVlKHRvcnF1ZTogVHJpcGxldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5hcHBseVRvcnF1ZSh7IHByb3BzOiBbdG9ycXVlXSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJHcm91cDogbWFrZUF0b21pYygnY29sbGlzaW9uRmlsdGVyR3JvdXAnLCBpbmRleCksXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJNYXNrOiBtYWtlQXRvbWljKCdjb2xsaXNpb25GaWx0ZXJNYXNrJywgaW5kZXgpLFxuICAgICAgICAgICAgY29sbGlzaW9uUmVzcG9uc2U6IG1ha2VBdG9taWMoJ2NvbGxpc2lvblJlc3BvbnNlJywgaW5kZXgpLFxuICAgICAgICAgICAgZml4ZWRSb3RhdGlvbjogbWFrZUF0b21pYygnZml4ZWRSb3RhdGlvbicsIGluZGV4KSxcbiAgICAgICAgICAgIGlzVHJpZ2dlcjogbWFrZUF0b21pYygnaXNUcmlnZ2VyJywgaW5kZXgpLFxuICAgICAgICAgICAgbGluZWFyRGFtcGluZzogbWFrZUF0b21pYygnbGluZWFyRGFtcGluZycsIGluZGV4KSxcbiAgICAgICAgICAgIGxpbmVhckZhY3RvcjogbWFrZVZlYygnbGluZWFyRmFjdG9yJywgaW5kZXgpLFxuICAgICAgICAgICAgbWFzczogbWFrZUF0b21pYygnbWFzcycsIGluZGV4KSxcbiAgICAgICAgICAgIG1hdGVyaWFsOiBtYWtlQXRvbWljKCdtYXRlcmlhbCcsIGluZGV4KSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBtYWtlVmVjKCdwb3NpdGlvbicsIGluZGV4KSxcbiAgICAgICAgICAgIHF1YXRlcm5pb246IG1ha2VRdWF0ZXJuaW9uKGluZGV4KSxcbiAgICAgICAgICAgIHJlbW92ZTogbWFrZVJlbW92ZShpbmRleCksXG4gICAgICAgICAgICByb3RhdGlvbjogbWFrZVJvdGF0aW9uKGluZGV4KSxcbiAgICAgICAgICAgIHNjYWxlT3ZlcnJpZGUoc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNjYWxlT3ZlcnJpZGVzIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXVpZCkgc2NhbGVPdmVycmlkZXNbdXVpZF0gPSBuZXcgVEhSRUUuVmVjdG9yMyguLi5zY2FsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xlZXAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNsZWVwKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbGVlcFNwZWVkTGltaXQ6IG1ha2VBdG9taWMoJ3NsZWVwU3BlZWRMaW1pdCcsIGluZGV4KSxcbiAgICAgICAgICAgIHNsZWVwVGltZUxpbWl0OiBtYWtlQXRvbWljKCdzbGVlcFRpbWVMaW1pdCcsIGluZGV4KSxcbiAgICAgICAgICAgIHVzZXJEYXRhOiBtYWtlQXRvbWljKCd1c2VyRGF0YScsIGluZGV4KSxcbiAgICAgICAgICAgIHZlbG9jaXR5OiBtYWtlVmVjKCd2ZWxvY2l0eScsIGluZGV4KSxcbiAgICAgICAgICAgIHdha2VVcCgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIud2FrZVVwKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGU6IHsgW2luZGV4OiBudW1iZXJdOiBOZ3RjV29ya2VyQXBpIH0gPSB7fTtcbiAgICBjb25zdCBhcGkgPSB7IC4uLm1ha2VBcGkodW5kZWZpbmVkKSwgYXQ6IChpbmRleDogbnVtYmVyKSA9PiBjYWNoZVtpbmRleF0gfHwgKGNhY2hlW2luZGV4XSA9IG1ha2VBcGkoaW5kZXgpKSB9O1xuICAgIHJldHVybiB7IHJlZjogYm9keVJlZiwgYXBpIH07XG59XG4iXX0=
|
|
295
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9keS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1jYW5ub24vc2VydmljZXMvc3JjL2xpYi9ib2R5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUF1QnZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQWtCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBYyxFQUFFLEVBQUUsYUFBYSxFQUFnQixTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0csT0FBTyxLQUFLLEtBQUssTUFBTSxPQUFPLENBQUM7QUFpRC9CLE1BQU0sVUFBVSxXQUFXLENBQ3ZCLEVBQThCLEVBQzlCLElBQXVFO0lBRXZFLE9BQU8sVUFBVSxDQUFzQixPQUFPLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FDckIsRUFBNEIsRUFDNUIsSUFBdUU7SUFFdkUsTUFBTSxjQUFjLEdBQVksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQzFDLE9BQU8sVUFBVSxDQUFvQixLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLGNBQWMsRUFBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3BHLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUMxQixFQUFpQyxFQUNqQyxJQUF1RTtJQUV2RSxPQUFPLFVBQVUsQ0FBeUIsVUFBVSxF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QWMsRUFBRSxVQUFVLENBQUMsZ0JBQWdCLEVBQUUsS0FBSyxDQUFDO1lBQ25ELFFBQVEsRUFBRSxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQztZQUN2QyxRQUFRLEVBQUUsT0FBTyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUM7WUFDcEMsTUFBTTtnQkFDRixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDO2dCQUN0QyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7U0FDSixDQUFDO0lBQ04sQ0FBQztJQUVELE1BQU0sS0FBSyxHQUF1QyxFQUFFLENBQUM7SUFDckQsTUFBTSxHQUFHLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQzlHLE9BQU8sRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gICAgQXRvbWljTmFtZSxcbiAgICBBdG9taWNQcm9wcyxcbiAgICBCb2R5UHJvcHMsXG4gICAgQm9keVNoYXBlVHlwZSxcbiAgICBCb3hQcm9wcyxcbiAgICBDb21wb3VuZEJvZHlQcm9wcyxcbiAgICBDb252ZXhQb2x5aGVkcm9uQXJncyxcbiAgICBDb252ZXhQb2x5aGVkcm9uUHJvcHMsXG4gICAgQ3lsaW5kZXJQcm9wcyxcbiAgICBIZWlnaHRmaWVsZFByb3BzLFxuICAgIFBhcnRpY2xlUHJvcHMsXG4gICAgUGxhbmVQcm9wcyxcbiAgICBQcm9wVmFsdWUsXG4gICAgUXVhZCxcbiAgICBTZXRPcE5hbWUsXG4gICAgU3BoZXJlQXJncyxcbiAgICBTcGhlcmVQcm9wcyxcbiAgICBUcmltZXNoUHJvcHMsXG4gICAgVHJpcGxldCxcbiAgICBWZWN0b3JOYW1lLFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IGluamVjdE5ndERlc3Ryb3ksIGluamVjdE5ndFJlZiwgTmd0SW5qZWN0ZWRSZWYsIHRhcEVmZmVjdCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0Y1N0b3JlLCBOZ3RjVXRpbHMgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbic7XG5pbXBvcnQgeyBOR1RDX0RFQlVHX0FQSSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uL2RlYnVnJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGlzT2JzZXJ2YWJsZSwgT2JzZXJ2YWJsZSwgb2YsIFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCB0eXBlIE5ndGNBdG9taWNBcGk8SyBleHRlbmRzIEF0b21pY05hbWU+ID0ge1xuICAgIHNldDogKHZhbHVlOiBBdG9taWNQcm9wc1tLXSkgPT4gdm9pZDtcbiAgICBzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBBdG9taWNQcm9wc1tLXSkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNRdWF0ZXJuaW9uQXBpID0ge1xuICAgIGNvcHk6ICh7IHcsIHgsIHksIHogfTogVEhSRUUuUXVhdGVybmlvbikgPT4gdm9pZDtcbiAgICBzZXQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyLCB3OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc3Vic2NyaWJlOiAoY2FsbGJhY2s6ICh2YWx1ZTogUXVhZCkgPT4gdm9pZCkgPT4gKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNWZWN0b3JBcGkgPSB7XG4gICAgY29weTogKHsgeCwgeSwgeiB9OiBUSFJFRS5WZWN0b3IzIHwgVEhSRUUuRXVsZXIpID0+IHZvaWQ7XG4gICAgc2V0OiAoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcikgPT4gdm9pZDtcbiAgICBzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBUcmlwbGV0KSA9PiB2b2lkKSA9PiAoKSA9PiB2b2lkO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y1dvcmtlckFwaSA9IHtcbiAgICBbSyBpbiBBdG9taWNOYW1lXTogTmd0Y0F0b21pY0FwaTxLPjtcbn0gJiB7XG4gICAgW0sgaW4gVmVjdG9yTmFtZV06IE5ndGNWZWN0b3JBcGk7XG59ICYge1xuICAgIGFwcGx5Rm9yY2U6IChmb3JjZTogVHJpcGxldCwgd29ybGRQb2ludDogVHJpcGxldCkgPT4gdm9pZDtcbiAgICBhcHBseUltcHVsc2U6IChpbXB1bHNlOiBUcmlwbGV0LCB3b3JsZFBvaW50OiBUcmlwbGV0KSA9PiB2b2lkO1xuICAgIGFwcGx5TG9jYWxGb3JjZTogKGZvcmNlOiBUcmlwbGV0LCBsb2NhbFBvaW50OiBUcmlwbGV0KSA9PiB2b2lkO1xuICAgIGFwcGx5TG9jYWxJbXB1bHNlOiAoaW1wdWxzZTogVHJpcGxldCwgbG9jYWxQb2ludDogVHJpcGxldCkgPT4gdm9pZDtcbiAgICBhcHBseVRvcnF1ZTogKHRvcnF1ZTogVHJpcGxldCkgPT4gdm9pZDtcbiAgICBxdWF0ZXJuaW9uOiBOZ3RjUXVhdGVybmlvbkFwaTtcbiAgICByb3RhdGlvbjogTmd0Y1ZlY3RvckFwaTtcbiAgICBzY2FsZU92ZXJyaWRlOiAoc2NhbGU6IFRyaXBsZXQpID0+IHZvaWQ7XG4gICAgc2xlZXA6ICgpID0+IHZvaWQ7XG4gICAgd2FrZVVwOiAoKSA9PiB2b2lkO1xuICAgIHJlbW92ZTogKCkgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0JvZHlQdWJsaWNBcGkgZXh0ZW5kcyBOZ3RjV29ya2VyQXBpIHtcbiAgICBhdDogKGluZGV4OiBudW1iZXIpID0+IE5ndGNXb3JrZXJBcGk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0JvZHlSZXR1cm48VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPiB7XG4gICAgcmVmOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0PjtcbiAgICBhcGk6IE5ndGNCb2R5UHVibGljQXBpO1xufVxuXG5leHBvcnQgdHlwZSBOZ3RjR2V0QnlJbmRleDxUIGV4dGVuZHMgQm9keVByb3BzPiA9IChpbmRleDogbnVtYmVyKSA9PiBUIHwgT2JzZXJ2YWJsZTxUPjtcbmV4cG9ydCB0eXBlIE5ndGNBcmdGbjxUPiA9IChhcmdzOiBUKSA9PiB1bmtub3duW107XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RQbGFuZTxUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuICAgIGZuOiBOZ3RjR2V0QnlJbmRleDxQbGFuZVByb3BzPixcbiAgICBvcHRzPzogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfVxuKSB7XG4gICAgcmV0dXJuIGluamVjdEJvZHk8UGxhbmVQcm9wcywgVE9iamVjdD4oJ1BsYW5lJywgZm4sICgpID0+IFtdLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEJveDxUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuICAgIGZuOiBOZ3RjR2V0QnlJbmRleDxCb3hQcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIGNvbnN0IGRlZmF1bHRCb3hBcmdzOiBUcmlwbGV0ID0gWzEsIDEsIDFdO1xuICAgIHJldHVybiBpbmplY3RCb2R5PEJveFByb3BzLCBUT2JqZWN0PignQm94JywgZm4sIChhcmdzID0gZGVmYXVsdEJveEFyZ3MpOiBUcmlwbGV0ID0+IGFyZ3MsIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0Q3lsaW5kZXI8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8Q3lsaW5kZXJQcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIHJldHVybiBpbmplY3RCb2R5PEN5bGluZGVyUHJvcHMsIFRPYmplY3Q+KCdDeWxpbmRlcicsIGZuLCAoYXJncyA9IFtdIGFzIFtdKSA9PiBhcmdzLCBvcHRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEhlaWdodGZpZWxkPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PEhlaWdodGZpZWxkUHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxIZWlnaHRmaWVsZFByb3BzLCBUT2JqZWN0PignSGVpZ2h0ZmllbGQnLCBmbiwgKGFyZ3MpID0+IGFyZ3MsIG9wdHMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0UGFydGljbGU8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8UGFydGljbGVQcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIHJldHVybiBpbmplY3RCb2R5PFBhcnRpY2xlUHJvcHMsIFRPYmplY3Q+KCdQYXJ0aWNsZScsIGZuLCAoKSA9PiBbXSwgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RTcGhlcmU8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8U3BoZXJlUHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxTcGhlcmVQcm9wcywgVE9iamVjdD4oXG4gICAgICAgICdTcGhlcmUnLFxuICAgICAgICBmbixcbiAgICAgICAgKGFyZ3M6IFNwaGVyZUFyZ3MgPSBbMV0pOiBTcGhlcmVBcmdzID0+IHtcbiAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShhcmdzKSkgdGhyb3cgbmV3IEVycm9yKCdpbmplY3RTcGhlcmUgYXJncyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgICAgICAgICByZXR1cm4gW2FyZ3NbMF1dO1xuICAgICAgICB9LFxuICAgICAgICBvcHRzXG4gICAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFRyaW1lc2g8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8VHJpbWVzaFByb3BzPixcbiAgICBvcHRzPzogeyByZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Pjsgd2FpdEZvcj86IE9ic2VydmFibGU8dW5rbm93bj4gfVxuKSB7XG4gICAgcmV0dXJuIGluamVjdEJvZHk8VHJpbWVzaFByb3BzLCBUT2JqZWN0PignVHJpbWVzaCcsIGZuLCAoYXJncykgPT4gYXJncywgb3B0cyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RDb252ZXhQb2x5aGVkcm9uPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRD4oXG4gICAgZm46IE5ndGNHZXRCeUluZGV4PENvbnZleFBvbHloZWRyb25Qcm9wcz4sXG4gICAgb3B0cz86IHsgcmVmPzogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdD47IHdhaXRGb3I/OiBPYnNlcnZhYmxlPHVua25vd24+IH1cbikge1xuICAgIHJldHVybiBpbmplY3RCb2R5PENvbnZleFBvbHloZWRyb25Qcm9wcywgVE9iamVjdD4oXG4gICAgICAgICdDb252ZXhQb2x5aGVkcm9uJyxcbiAgICAgICAgZm4sXG4gICAgICAgIChbdmVydGljZXMsIGZhY2VzLCBub3JtYWxzLCBheGVzLCBib3VuZGluZ1NwaGVyZVJhZGl1c10gPSBbXSk6IENvbnZleFBvbHloZWRyb25BcmdzPFRyaXBsZXQ+ID0+IFtcbiAgICAgICAgICAgIHZlcnRpY2VzICYmIHZlcnRpY2VzLm1hcChOZ3RjVXRpbHMubWFrZVRyaXBsZXQpLFxuICAgICAgICAgICAgZmFjZXMsXG4gICAgICAgICAgICBub3JtYWxzICYmIG5vcm1hbHMubWFwKE5ndGNVdGlscy5tYWtlVHJpcGxldCksXG4gICAgICAgICAgICBheGVzICYmIGF4ZXMubWFwKE5ndGNVdGlscy5tYWtlVHJpcGxldCksXG4gICAgICAgICAgICBib3VuZGluZ1NwaGVyZVJhZGl1cyxcbiAgICAgICAgXSxcbiAgICAgICAgb3B0c1xuICAgICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RDb21wb3VuZEJvZHk8VE9iamVjdCBleHRlbmRzIFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogTmd0Y0dldEJ5SW5kZXg8Q29tcG91bmRCb2R5UHJvcHM+LFxuICAgIG9wdHM/OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Qm9keTxDb21wb3VuZEJvZHlQcm9wcywgVE9iamVjdD4oJ0NvbXBvdW5kJywgZm4sIChhcmdzKSA9PiBhcmdzIGFzIHVua25vd25bXSwgb3B0cyk7XG59XG5cbmNvbnN0IHRlbXAgPSBuZXcgVEhSRUUuT2JqZWN0M0QoKTtcblxuZnVuY3Rpb24gaW5qZWN0Qm9keTxUQm9keVByb3BzIGV4dGVuZHMgQm9keVByb3BzLCBUT2JqZWN0IGV4dGVuZHMgVEhSRUUuT2JqZWN0M0Q+KFxuICAgIHR5cGU6IEJvZHlTaGFwZVR5cGUsXG4gICAgZ2V0UHJvcHNGbjogTmd0Y0dldEJ5SW5kZXg8VEJvZHlQcm9wcz4sXG4gICAgYXJnc0ZuOiBOZ3RjQXJnRm48VEJvZHlQcm9wc1snYXJncyddPixcbiAgICB7IHJlZiwgd2FpdEZvciB9OiB7IHJlZj86IE5ndEluamVjdGVkUmVmPFRPYmplY3Q+OyB3YWl0Rm9yPzogT2JzZXJ2YWJsZTx1bmtub3duPiB9ID0ge31cbik6IE5ndGNCb2R5UmV0dXJuPFRPYmplY3Q+IHtcbiAgICBsZXQgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBhIFJlcGxheVN1YmplY3QgdGhhdCB3b3VsZCBlbWl0IG9uY2UgaW4gcXVldWVNaWNyb3Rhc2sgY2FsbFxuICAgIGNvbnN0IG1pY3JvUXVldWUkID0gbmV3IFJlcGxheVN1YmplY3Q8dm9pZD4oMSk7XG4gICAgLy8gYSBSZXBsYXlTdWJqZWN0IHRoYXQgd291bGQgZW1pdCB3aGVuZXZlciBvdXIgcHJvcHMgZW1pdHMuIFRoaXMgaXMgZG9uZSBzbyB0aGF0IHRoZSBjb25zdW1lcnMgY2FuIHBhc3MgaW5cbiAgICAvLyBPYnNlcnZhYmxlIHRvIGluamVjdEJvZHkgaWYgdGhleSBoYXZlIHJlYWN0aXZlIHByb3BzIChlZzogSW5wdXQpXG4gICAgY29uc3QgcHJvcHNTdWJqZWN0JCA9IG5ldyBSZXBsYXlTdWJqZWN0PFRCb2R5UHJvcHM+KDEpO1xuXG4gICAgLy8gYW4gYXJyYXkgb2Ygc3RyZWFtcyB3ZSB3YW50IHRvIHdhaXQgdG8gZW1pdCB1bnRpbCB3ZSBkZWNpZGUgdG8gZ2l2ZSB0aGUgYm9keVJlZiBhbiBlbXB0eSBPYmplY3QzRFxuICAgIGNvbnN0IHdhaXRzJCA9IFttaWNyb1F1ZXVlJF0gYXMgT2JzZXJ2YWJsZTx1bmtub3duPltdO1xuXG4gICAgY29uc3QgZGVidWdBcGkgPSBpbmplY3QoTkdUQ19ERUJVR19BUEksIHsgc2tpcFNlbGY6IHRydWUsIG9wdGlvbmFsOiB0cnVlIH0pO1xuICAgIGNvbnN0IHBoeXNpY3NTdG9yZSA9IGluamVjdChOZ3RjU3RvcmUsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cbiAgICAvLyBjbGVhbiB1cCBvdXIgc3RyZWFtcyBvbiBkZXN0cm95XG4gICAgaW5qZWN0Tmd0RGVzdHJveSgoKSA9PiB7XG4gICAgICAgIG1pY3JvUXVldWUkLmNvbXBsZXRlKCk7XG4gICAgICAgIHByb3BzU3ViamVjdCQuY29tcGxldGUoKTtcbiAgICAgICAgc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpO1xuICAgIH0pO1xuXG4gICAgLy8gZ2l2ZSBvdXIgYm9keVJlZiBhbiBOZ3RJbmplY3RlZFJlZlxuICAgIGxldCBib2R5UmVmID0gaW5qZWN0Tmd0UmVmPFRPYmplY3Q+KCk7XG5cbiAgICAvLyBhZGQgd2FpdEZvciBpZiB0aGUgY29uc3VtZXJzIHBhc3MgaXQgaW5cbiAgICBpZiAod2FpdEZvcikgd2FpdHMkLnB1c2god2FpdEZvcik7XG4gICAgLy8gcmUtYXNzaWduIGJvZHlSZWYgaWYgdGhlIGNvbnN1bWVycyBwYXNzIGEgcmVmIGluXG4gICAgaWYgKHJlZikgYm9keVJlZiA9IHJlZjtcblxuICAgIC8vIGZpcmUgbWljcm9RdWV1ZSRcbiAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBtaWNyb1F1ZXVlJC5uZXh0KCkpO1xuXG4gICAgLy8gd2hlbiBhbGwgd2FpdHMkIGVtaXQsIHdlIGdpdmUgYm9keVJlZiBhbiBlbXB0eSBPYmplY3QzRCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lLiBQaHlzaWMgT2JqZWN0IGNhbiBzdGlsbCBiZSBhZmZlY3RlZFxuICAgIC8vIGJ5IFBoeXNpY3Mgd2l0aG91dCBhIHZpc3VhbCByZXByZXNlbnRhdGlvblxuICAgIGNvbWJpbmVMYXRlc3Qod2FpdHMkKS5zdWJzY3JpYmUoKCkgPT4gKGJvZHlSZWYubmF0aXZlRWxlbWVudCB8fD0gbmV3IFRIUkVFLk9iamVjdDNEKCkgYXMgVE9iamVjdCkpO1xuXG4gICAgLy8gc3RhcnQgdGhlIHBpcGVsaW5lIGFzIHNvb24gYXMgYm9keVJlZiBoYXMgYSB0cnV0aHkgdmFsdWVcbiAgICBzdWJzY3JpcHRpb24gPSBjb21iaW5lTGF0ZXN0KFtwaHlzaWNzU3RvcmUuc2VsZWN0KCd3b3JrZXInKSwgYm9keVJlZi4kXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICBzd2l0Y2hNYXAoKFt3b3JrZXIsIG9iamVjdF0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50V29ya2VyID0gd29ya2VyO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgeyBldmVudHMsIHJlZnMgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0Q291bnQgPSAxO1xuXG4gICAgICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFRIUkVFLkluc3RhbmNlZE1lc2gpIHtcbiAgICAgICAgICAgICAgICAgICAgb2JqZWN0Lmluc3RhbmNlTWF0cml4LnNldFVzYWdlKFRIUkVFLkR5bmFtaWNEcmF3VXNhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBvYmplY3RDb3VudCA9IG9iamVjdC5jb3VudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xpZGF0ZSBvdXIgdXVpZHMgaW50byBhbiBBcnJheSBzbyB3ZSBjYW4gaGFuZGxlIHRoZW0gaW4gYSBtb3JlIGNvbnNpc3RlbnQgd2F5XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZHMgPVxuICAgICAgICAgICAgICAgICAgICBvYmplY3QgaW5zdGFuY2VvZiBUSFJFRS5JbnN0YW5jZWRNZXNoXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBBcnJheShvYmplY3RDb3VudCkuZmlsbCgwKS5tYXAoKF8sIGkpID0+IGAke29iamVjdC51dWlkfS8ke2l9YClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogW29iamVjdC51dWlkXTtcblxuICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBhbiBBcnJheTxPYnNlcnZhYmxlPiBmcm9tIGdldFByb3BzRm5cbiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBjYW4gcmVhY3QgdG8gcHJvcHMgY2hhbmdlZFxuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzTGlzdCQgPSB1dWlkcy5tYXAoKHV1aWQsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzUmVzdWx0ID0gZ2V0UHJvcHNGbihpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gIHdlIHVzZSBhIHByb3BzU3ViamVjdCQgYmVjYXVzZSB3ZSB3YW50IHRvIGVuc3VyZSB0aGlzIHByb3BzUmVzdWx0IHN0cmVhbSBpcyBIT1RcbiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCB0YXBFZmZlY3Qgd2lsbCByZW1vdmUgZXZlcnl0aGluZyBmcm9tIGN1cnJlbnRXb3JrZXIjYm9kaWVzIGJlY2F1c2UgdGhlIHN0cmVhbSBjb21wbGV0ZXNcbiAgICAgICAgICAgICAgICAgICAgKGlzT2JzZXJ2YWJsZShwcm9wc1Jlc3VsdCkgPyBwcm9wc1Jlc3VsdCA6IG9mKHByb3BzUmVzdWx0KSkuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ndGNVdGlscy5wcmVwYXJlKHRlbXAsIHByb3BzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgVEhSRUUuSW5zdGFuY2VkTWVzaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Quc2V0TWF0cml4QXQoaW5kZXgsIHRlbXAubWF0cml4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Lmluc3RhbmNlTWF0cml4Lm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmc1t1dWlkXSA9IG9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0FwaT8uYWRkKHV1aWQsIHByb3BzLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZ3RjVXRpbHMuc2V0dXBDb2xsaXNpb24oZXZlbnRzLCBwcm9wcywgdXVpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHNTdWJqZWN0JC5uZXh0KHsgLi4ucHJvcHMsIGFyZ3M6IGFyZ3NGbihwcm9wcy5hcmdzKSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgW05HVCBDYW5ub25dIEVycm9yIHdpdGggcHJvY2Vzc2luZyBwcm9wczogJHtlcnJvcn1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wc1N1YmplY3QkLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wc1N1YmplY3QkO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocHJvcHNMaXN0JCkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgdGFwRWZmZWN0KChwcm9wcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFdvcmtlci5hZGRCb2RpZXMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBwcm9wcy5tYXAoKHsgb25Db2xsaWRlLCBvbkNvbGxpZGVCZWdpbiwgb25Db2xsaWRlRW5kLCAuLi5zZXJpYWxpemFibGVQcm9wcyB9KSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbGxpZGU6IEJvb2xlYW4ob25Db2xsaWRlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db2xsaWRlQmVnaW46IEJvb2xlYW4ob25Db2xsaWRlQmVnaW4pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbkNvbGxpZGVFbmQ6IEJvb2xlYW4ob25Db2xsaWRlRW5kKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc2VyaWFsaXphYmxlUHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXVpZDogdXVpZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsZWFuIHVwIENhbm5vbldvcmtlciB3aGVuZXZlciBwcm9wcyBjaGFuZ2VzL2NvbXBsZXRlc1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkcy5mb3JFYWNoKCh1dWlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZWZzW3V1aWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z0FwaT8ucmVtb3ZlKHV1aWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZXZlbnRzW3V1aWRdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXb3JrZXIucmVtb3ZlQm9kaWVzKHsgdXVpZDogdXVpZHMgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IG1ha2VBdG9taWMgPSA8VCBleHRlbmRzIEF0b21pY05hbWU+KHR5cGU6IFQsIGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IG9wOiBTZXRPcE5hbWU8VD4gPSBgc2V0JHtOZ3RjVXRpbHMuY2FwaXRhbGl6ZSh0eXBlKX1gO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBzZXQ6ICh2YWx1ZTogUHJvcFZhbHVlPFQ+KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyW29wXSh7IHByb3BzOiB2YWx1ZSwgdXVpZCB9IGFzIG5ldmVyKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUXVhdGVybmlvbiA9IChpbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICBjb25zdCB0eXBlID0gJ3F1YXRlcm5pb24nO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29weTogKHsgdywgeCwgeSwgeiB9OiBUSFJFRS5RdWF0ZXJuaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFF1YXRlcm5pb24oeyBwcm9wczogW3gsIHksIHosIHddLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIsIHc6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5zZXRRdWF0ZXJuaW9uKHsgcHJvcHM6IFt4LCB5LCB6LCB3XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUm90YXRpb24gPSAoaW5kZXg/OiBudW1iZXIpID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvcHk6ICh7IHgsIHksIHogfTogVEhSRUUuVmVjdG9yMyB8IFRIUkVFLkV1bGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFJvdGF0aW9uKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXQ6ICh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNldFJvdGF0aW9uKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpYmU6IChjYWxsYmFjazogKHZhbHVlOiBUcmlwbGV0KSA9PiB2b2lkKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdWJzY3JpcHRpb25zLCB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IE5ndGNVdGlscy5pbmNyZW1lbnRpbmdJZCsrO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9ICdib2RpZXMnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSAncXVhdGVybmlvbic7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcblxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnNbaWRdID0geyBbdHlwZV06IE5ndGNVdGlscy5xdWF0ZXJuaW9uVG9Sb3RhdGlvbihjYWxsYmFjaykgfTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5zdWJzY3JpYmUoeyBwcm9wczogeyBpZCwgdGFyZ2V0LCB0eXBlIH0sIHV1aWQgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHN1YnNjcmlwdGlvbnNbaWRdO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIudW5zdWJzY3JpYmUoeyBwcm9wczogaWQgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGNvbnN0IG1ha2VWZWMgPSAodHlwZTogVmVjdG9yTmFtZSwgaW5kZXg/OiBudW1iZXIpID0+IHtcbiAgICAgICAgY29uc3Qgb3A6IFNldE9wTmFtZTxWZWN0b3JOYW1lPiA9IGBzZXQke05ndGNVdGlscy5jYXBpdGFsaXplKHR5cGUpfWA7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb3B5OiAoeyB4LCB5LCB6IH06IFRIUkVFLlZlY3RvcjMgfCBUSFJFRS5FdWxlcikgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlcltvcF0oeyBwcm9wczogW3gsIHksIHpdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNldDogKHg6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXJbb3BdKHsgcHJvcHM6IFt4LCB5LCB6XSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBnZXQgc3Vic2NyaWJlKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3Vic2NyaXB0aW9ucywgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUoYm9keVJlZiwgd29ya2VyLCBzdWJzY3JpcHRpb25zLCB0eXBlLCBpbmRleCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlUmVtb3ZlID0gKGluZGV4PzogbnVtYmVyKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICBpZiAodXVpZCkgd29ya2VyLnJlbW92ZUJvZGllcyh7IHV1aWQ6IFt1dWlkXSB9KTtcbiAgICAgICAgfTtcbiAgICB9O1xuXG4gICAgZnVuY3Rpb24gbWFrZUFwaShpbmRleD86IG51bWJlcik6IE5ndGNXb3JrZXJBcGkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsb3dTbGVlcDogbWFrZUF0b21pYygnYWxsb3dTbGVlcCcsIGluZGV4KSxcbiAgICAgICAgICAgIGFuZ3VsYXJEYW1waW5nOiBtYWtlQXRvbWljKCdhbmd1bGFyRGFtcGluZycsIGluZGV4KSxcbiAgICAgICAgICAgIGFuZ3VsYXJGYWN0b3I6IG1ha2VWZWMoJ2FuZ3VsYXJGYWN0b3InLCBpbmRleCksXG4gICAgICAgICAgICBhbmd1bGFyVmVsb2NpdHk6IG1ha2VWZWMoJ2FuZ3VsYXJWZWxvY2l0eScsIGluZGV4KSxcbiAgICAgICAgICAgIGFwcGx5Rm9yY2UoZm9yY2U6IFRyaXBsZXQsIHdvcmxkUG9pbnQ6IFRyaXBsZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIuYXBwbHlGb3JjZSh7IHByb3BzOiBbZm9yY2UsIHdvcmxkUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5SW1wdWxzZShpbXB1bHNlOiBUcmlwbGV0LCB3b3JsZFBvaW50OiBUcmlwbGV0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLmFwcGx5SW1wdWxzZSh7IHByb3BzOiBbaW1wdWxzZSwgd29ybGRQb2ludF0sIHV1aWQgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXBwbHlMb2NhbEZvcmNlKGZvcmNlOiBUcmlwbGV0LCBsb2NhbFBvaW50OiBUcmlwbGV0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLmFwcGx5TG9jYWxGb3JjZSh7IHByb3BzOiBbZm9yY2UsIGxvY2FsUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5TG9jYWxJbXB1bHNlKGltcHVsc2U6IFRyaXBsZXQsIGxvY2FsUG9pbnQ6IFRyaXBsZXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIuYXBwbHlMb2NhbEltcHVsc2UoeyBwcm9wczogW2ltcHVsc2UsIGxvY2FsUG9pbnRdLCB1dWlkIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFwcGx5VG9ycXVlKHRvcnF1ZTogVHJpcGxldCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgd29ya2VyIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICB1dWlkICYmIHdvcmtlci5hcHBseVRvcnF1ZSh7IHByb3BzOiBbdG9ycXVlXSwgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJHcm91cDogbWFrZUF0b21pYygnY29sbGlzaW9uRmlsdGVyR3JvdXAnLCBpbmRleCksXG4gICAgICAgICAgICBjb2xsaXNpb25GaWx0ZXJNYXNrOiBtYWtlQXRvbWljKCdjb2xsaXNpb25GaWx0ZXJNYXNrJywgaW5kZXgpLFxuICAgICAgICAgICAgY29sbGlzaW9uUmVzcG9uc2U6IG1ha2VBdG9taWMoJ2NvbGxpc2lvblJlc3BvbnNlJywgaW5kZXgpLFxuICAgICAgICAgICAgZml4ZWRSb3RhdGlvbjogbWFrZUF0b21pYygnZml4ZWRSb3RhdGlvbicsIGluZGV4KSxcbiAgICAgICAgICAgIGlzVHJpZ2dlcjogbWFrZUF0b21pYygnaXNUcmlnZ2VyJywgaW5kZXgpLFxuICAgICAgICAgICAgbGluZWFyRGFtcGluZzogbWFrZUF0b21pYygnbGluZWFyRGFtcGluZycsIGluZGV4KSxcbiAgICAgICAgICAgIGxpbmVhckZhY3RvcjogbWFrZVZlYygnbGluZWFyRmFjdG9yJywgaW5kZXgpLFxuICAgICAgICAgICAgbWFzczogbWFrZUF0b21pYygnbWFzcycsIGluZGV4KSxcbiAgICAgICAgICAgIG1hdGVyaWFsOiBtYWtlQXRvbWljKCdtYXRlcmlhbCcsIGluZGV4KSxcbiAgICAgICAgICAgIHBvc2l0aW9uOiBtYWtlVmVjKCdwb3NpdGlvbicsIGluZGV4KSxcbiAgICAgICAgICAgIHF1YXRlcm5pb246IG1ha2VRdWF0ZXJuaW9uKGluZGV4KSxcbiAgICAgICAgICAgIHJlbW92ZTogbWFrZVJlbW92ZShpbmRleCksXG4gICAgICAgICAgICByb3RhdGlvbjogbWFrZVJvdGF0aW9uKGluZGV4KSxcbiAgICAgICAgICAgIHNjYWxlT3ZlcnJpZGUoc2NhbGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHNjYWxlT3ZlcnJpZGVzIH0gPSBwaHlzaWNzU3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKGJvZHlSZWYsIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpZiAodXVpZCkgc2NhbGVPdmVycmlkZXNbdXVpZF0gPSBuZXcgVEhSRUUuVmVjdG9yMyguLi5zY2FsZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2xlZXAoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyB3b3JrZXIgfSA9IHBoeXNpY3NTdG9yZS5nZXQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQoYm9keVJlZiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLnNsZWVwKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzbGVlcFNwZWVkTGltaXQ6IG1ha2VBdG9taWMoJ3NsZWVwU3BlZWRMaW1pdCcsIGluZGV4KSxcbiAgICAgICAgICAgIHNsZWVwVGltZUxpbWl0OiBtYWtlQXRvbWljKCdzbGVlcFRpbWVMaW1pdCcsIGluZGV4KSxcbiAgICAgICAgICAgIHVzZXJEYXRhOiBtYWtlQXRvbWljKCd1c2VyRGF0YScsIGluZGV4KSxcbiAgICAgICAgICAgIHZlbG9jaXR5OiBtYWtlVmVjKCd2ZWxvY2l0eScsIGluZGV4KSxcbiAgICAgICAgICAgIHdha2VVcCgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciB9ID0gcGh5c2ljc1N0b3JlLmdldCgpO1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChib2R5UmVmLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIud2FrZVVwKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY2FjaGU6IHsgW2luZGV4OiBudW1iZXJdOiBOZ3RjV29ya2VyQXBpIH0gPSB7fTtcbiAgICBjb25zdCBhcGkgPSB7IC4uLm1ha2VBcGkodW5kZWZpbmVkKSwgYXQ6IChpbmRleDogbnVtYmVyKSA9PiBjYWNoZVtpbmRleF0gfHwgKGNhY2hlW2luZGV4XSA9IG1ha2VBcGkoaW5kZXgpKSB9O1xuICAgIHJldHVybiB7IHJlZjogYm9keVJlZiwgYXBpIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { injectNgtRef, is, makeId, tapEffect } from 'angular-three';
|
|
3
|
+
import { NgtcStore } from 'angular-three-cannon';
|
|
4
|
+
import { combineLatest, takeUntil } from 'rxjs';
|
|
5
|
+
import { injectOptionsProcessor } from './utils';
|
|
6
|
+
export function injectPointToPointConstraint(bodyA, bodyB, optsFn) {
|
|
7
|
+
return injectConstraint('PointToPoint', bodyA, bodyB, optsFn);
|
|
8
|
+
}
|
|
9
|
+
export function injectConeTwistConstraint(bodyA, bodyB, optsFn) {
|
|
10
|
+
return injectConstraint('ConeTwist', bodyA, bodyB, optsFn);
|
|
11
|
+
}
|
|
12
|
+
export function injectDistanceConstraint(bodyA, bodyB, optsFn) {
|
|
13
|
+
return injectConstraint('Distance', bodyA, bodyB, optsFn);
|
|
14
|
+
}
|
|
15
|
+
export function injectHingeConstraint(bodyA, bodyB, optsFn) {
|
|
16
|
+
return injectConstraint('Hinge', bodyA, bodyB, optsFn);
|
|
17
|
+
}
|
|
18
|
+
export function injectLockConstraint(bodyA, bodyB, optsFn) {
|
|
19
|
+
return injectConstraint('Lock', bodyA, bodyB, optsFn);
|
|
20
|
+
}
|
|
21
|
+
function injectConstraint(type, bodyA, bodyB, optsFn = () => ({})) {
|
|
22
|
+
const { opts$, destroy$ } = injectOptionsProcessor(optsFn);
|
|
23
|
+
const uuid = makeId();
|
|
24
|
+
const physicsStore = inject(NgtcStore, { skipSelf: true });
|
|
25
|
+
const bodyARef = !is.ref(bodyA) ? injectNgtRef(bodyA) : bodyA;
|
|
26
|
+
const bodyBRef = !is.ref(bodyB) ? injectNgtRef(bodyB) : bodyB;
|
|
27
|
+
combineLatest([physicsStore.select('worker'), bodyARef.$, bodyBRef.$, opts$])
|
|
28
|
+
.pipe(tapEffect(([worker, bodyA, bodyB, opts]) => {
|
|
29
|
+
worker.addConstraint({ props: [bodyA.uuid, bodyB.uuid, opts], type, uuid });
|
|
30
|
+
return () => worker.removeConstraint({ uuid });
|
|
31
|
+
}), takeUntil(destroy$))
|
|
32
|
+
.subscribe();
|
|
33
|
+
const api = {
|
|
34
|
+
disable: () => {
|
|
35
|
+
const worker = physicsStore.get('worker');
|
|
36
|
+
worker.disableConstraint({ uuid });
|
|
37
|
+
},
|
|
38
|
+
enable: () => {
|
|
39
|
+
const worker = physicsStore.get('worker');
|
|
40
|
+
worker.enableConstraint({ uuid });
|
|
41
|
+
},
|
|
42
|
+
remove: () => {
|
|
43
|
+
const worker = physicsStore.get('worker');
|
|
44
|
+
worker.removeConstraint({ uuid });
|
|
45
|
+
},
|
|
46
|
+
};
|
|
47
|
+
if (type === 'Hinge') {
|
|
48
|
+
const hingeApi = api;
|
|
49
|
+
hingeApi.disableMotor = () => {
|
|
50
|
+
const worker = physicsStore.get('worker');
|
|
51
|
+
worker.disableConstraintMotor({ uuid });
|
|
52
|
+
};
|
|
53
|
+
hingeApi.enableMotor = () => {
|
|
54
|
+
const worker = physicsStore.get('worker');
|
|
55
|
+
worker.enableConstraintMotor({ uuid });
|
|
56
|
+
};
|
|
57
|
+
hingeApi.setMotorSpeed = (value) => {
|
|
58
|
+
const worker = physicsStore.get('worker');
|
|
59
|
+
worker.setConstraintMotorSpeed({ uuid, props: value });
|
|
60
|
+
};
|
|
61
|
+
hingeApi.setMotorMaxForce = (value) => {
|
|
62
|
+
const worker = physicsStore.get('worker');
|
|
63
|
+
worker.setConstraintMotorMaxForce({ uuid, props: value });
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
return { bodyA: bodyARef, bodyB: bodyBRef, api };
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RyYWludC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1jYW5ub24vc2VydmljZXMvc3JjL2xpYi9jb25zdHJhaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFVdkMsT0FBTyxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFrQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQW9DakQsTUFBTSxVQUFVLDRCQUE0QixDQUl4QyxLQUEwQyxFQUMxQyxLQUEwQyxFQUMxQyxNQUFxRTtJQUVyRSxPQUFPLGdCQUFnQixDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBSXJDLEtBQTBDLEVBQzFDLEtBQTBDLEVBQzFDLE1BQStEO0lBRS9ELE9BQU8sZ0JBQWdCLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FJcEMsS0FBMEMsRUFDMUMsS0FBMEMsRUFDMUMsTUFBNkQ7SUFFN0QsT0FBTyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUlqQyxLQUEwQyxFQUMxQyxLQUEwQyxFQUMxQyxNQUF1RDtJQUV2RCxPQUFPLGdCQUFn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TUFBTSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUM7UUFFRixRQUFRLENBQUMsV0FBVyxHQUFHLEdBQUcsRUFBRTtZQUN4QixNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDM0MsQ0FBQyxDQUFDO1FBRUYsUUFBUSxDQUFDLGFBQWEsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLHVCQUF1QixDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNELENBQUMsQ0FBQztRQUVGLFFBQVEsQ0FBQyxnQkFBZ0IsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQzFDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQztLQUNMO0lBRUQsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICAgIENvbmVUd2lzdENvbnN0cmFpbnRPcHRzLFxuICAgIENvbnN0cmFpbnRPcHRucyxcbiAgICBDb25zdHJhaW50VHlwZXMsXG4gICAgRGlzdGFuY2VDb25zdHJhaW50T3B0cyxcbiAgICBIaW5nZUNvbnN0cmFpbnRPcHRzLFxuICAgIExvY2tDb25zdHJhaW50T3B0cyxcbiAgICBQb2ludFRvUG9pbnRDb25zdHJhaW50T3B0cyxcbn0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBpbmplY3ROZ3RSZWYsIGlzLCBtYWtlSWQsIE5ndEluamVjdGVkUmVmLCB0YXBFZmZlY3QgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndGNTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5qZWN0T3B0aW9uc1Byb2Nlc3NvciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNDb25zdHJhaW50QXBpIHtcbiAgICBkaXNhYmxlOiAoKSA9PiB2b2lkO1xuICAgIGVuYWJsZTogKCkgPT4gdm9pZDtcbiAgICByZW1vdmU6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0hpbmdlQ29uc3RyYWludEFwaSBleHRlbmRzIE5ndGNDb25zdHJhaW50QXBpIHtcbiAgICBkaXNhYmxlTW90b3I6ICgpID0+IHZvaWQ7XG4gICAgZW5hYmxlTW90b3I6ICgpID0+IHZvaWQ7XG4gICAgc2V0TW90b3JNYXhGb3JjZTogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc2V0TW90b3JTcGVlZDogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCB0eXBlIE5ndGNDb25zdHJhaW50T1JIaW5nZUFwaTxUIGV4dGVuZHMgJ0hpbmdlJyB8IENvbnN0cmFpbnRUeXBlcz4gPSBUIGV4dGVuZHMgQ29uc3RyYWludFR5cGVzXG4gICAgPyBOZ3RjQ29uc3RyYWludEFwaVxuICAgIDogTmd0Y0hpbmdlQ29uc3RyYWludEFwaTtcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjQ29uc3RyYWludFJldHVybjxcbiAgICBUIGV4dGVuZHMgJ0hpbmdlJyB8IENvbnN0cmFpbnRUeXBlcyxcbiAgICBUT2JqZWN0QSBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0QsXG4gICAgVE9iamVjdEIgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEXG4+IHtcbiAgICBib2R5QTogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEE+O1xuICAgIGJvZHlCOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Qj47XG4gICAgYXBpOiBOZ3RjQ29uc3RyYWludE9SSGluZ2VBcGk8VD47XG59XG5cbmV4cG9ydCB0eXBlIE5ndGNPcHRzRnVuY3Rpb248XG4gICAgVENvbnN0cmFpbnRUeXBlIGV4dGVuZHMgJ0hpbmdlJyB8IENvbnN0cmFpbnRUeXBlcyxcbiAgICBUT3B0aW9ucyBleHRlbmRzIEhpbmdlQ29uc3RyYWludE9wdHMgfCBDb25zdHJhaW50T3B0bnMgPSBUQ29uc3RyYWludFR5cGUgZXh0ZW5kcyAnSGluZ2UnXG4gICAgICAgID8gSGluZ2VDb25zdHJhaW50T3B0c1xuICAgICAgICA6IENvbnN0cmFpbnRPcHRuc1xuPiA9ICgpID0+IE9ic2VydmFibGU8VE9wdGlvbnM+IHwgVE9wdGlvbnM7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RQb2ludFRvUG9pbnRDb25zdHJhaW50PFxuICAgIFRPYmplY3RBIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRCxcbiAgICBUT2JqZWN0QiBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0Rcbj4oXG4gICAgYm9keUE6IE5ndEluamVjdGVkUmVmPFRPYmplY3RBPiB8IFRPYmplY3RBLFxuICAgIGJvZHlCOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Qj4gfCBUT2JqZWN0QixcbiAgICBvcHRzRm4/OiBOZ3RjT3B0c0Z1bmN0aW9uPCdQb2ludFRvUG9pbnQnLCBQb2ludFRvUG9pbnRDb25zdHJhaW50T3B0cz5cbikge1xuICAgIHJldHVybiBpbmplY3RDb25zdHJhaW50KCdQb2ludFRvUG9pbnQnLCBib2R5QSwgYm9keUIsIG9wdHNGbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RDb25lVHdpc3RDb25zdHJhaW50PFxuICAgIFRPYmplY3RBIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRCxcbiAgICBUT2JqZWN0QiBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0Rcbj4oXG4gICAgYm9keUE6IE5ndEluamVjdGVkUmVmPFRPYmplY3RBPiB8IFRPYmplY3RBLFxuICAgIGJvZHlCOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0Qj4gfCBUT2JqZWN0QixcbiAgICBvcHRzRm4/OiBOZ3RjT3B0c0Z1bmN0aW9uPCdDb25lVHdpc3QnLCBDb25lVHdpc3RDb25zdHJhaW50T3B0cz5cbikge1xuICAgIHJldHVybiBpbmplY3RDb25zdHJhaW50KCdDb25lVHdpc3QnLCBib2R5QSwgYm9keUIsIG9wdHNGbik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3REaXN0YW5jZUNvbnN0cmFpbnQ8XG4gICAgVE9iamVjdEEgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNELFxuICAgIFRPYmplY3RCIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRFxuPihcbiAgICBib2R5QTogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEE+IHwgVE9iamVjdEEsXG4gICAgYm9keUI6IE5ndEluamVjdGVkUmVmPFRPYmplY3RCPiB8IFRPYmplY3RCLFxuICAgIG9wdHNGbj86IE5ndGNPcHRzRnVuY3Rpb248J0Rpc3RhbmNlJywgRGlzdGFuY2VDb25zdHJhaW50T3B0cz5cbikge1xuICAgIHJldHVybiBpbmplY3RDb25zdHJhaW50KCdEaXN0YW5jZScsIGJvZHlBLCBib2R5Qiwgb3B0c0ZuKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdEhpbmdlQ29uc3RyYWludDxcbiAgICBUT2JqZWN0QSBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0QsXG4gICAgVE9iamVjdEIgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEXG4+KFxuICAgIGJvZHlBOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0QT4gfCBUT2JqZWN0QSxcbiAgICBib2R5QjogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEI+IHwgVE9iamVjdEIsXG4gICAgb3B0c0ZuPzogTmd0Y09wdHNGdW5jdGlvbjwnSGluZ2UnLCBIaW5nZUNvbnN0cmFpbnRPcHRzPlxuKSB7XG4gICAgcmV0dXJuIGluamVjdENvbnN0cmFpbnQoJ0hpbmdlJywgYm9keUEsIGJvZHlCLCBvcHRzRm4pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5qZWN0TG9ja0NvbnN0cmFpbnQ8XG4gICAgVE9iamVjdEEgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNELFxuICAgIFRPYmplY3RCIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRFxuPihcbiAgICBib2R5QTogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEE+IHwgVE9iamVjdEEsXG4gICAgYm9keUI6IE5ndEluamVjdGVkUmVmPFRPYmplY3RCPiB8IFRPYmplY3RCLFxuICAgIG9wdHNGbj86IE5ndGNPcHRzRnVuY3Rpb248J0xvY2snLCBMb2NrQ29uc3RyYWludE9wdHM+XG4pIHtcbiAgICByZXR1cm4gaW5qZWN0Q29uc3RyYWludCgnTG9jaycsIGJvZHlBLCBib2R5Qiwgb3B0c0ZuKTtcbn1cblxuZnVuY3Rpb24gaW5qZWN0Q29uc3RyYWludDxcbiAgICBUQ29uc3RyYWludFR5cGUgZXh0ZW5kcyAnSGluZ2UnIHwgQ29uc3RyYWludFR5cGVzLFxuICAgIFRPYmplY3RBIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRCxcbiAgICBUT2JqZWN0QiBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0QsXG4gICAgVE9wdGlvbnMgZXh0ZW5kcyBIaW5nZUNvbnN0cmFpbnRPcHRzIHwgQ29uc3RyYWludE9wdG5zID0gVENvbnN0cmFpbnRUeXBlIGV4dGVuZHMgJ0hpbmdlJ1xuICAgICAgICA/IEhpbmdlQ29uc3RyYWludE9wdHNcbiAgICAgICAgOiBDb25zdHJhaW50T3B0bnNcbj4oXG4gICAgdHlwZTogVENvbnN0cmFpbnRUeXBlLFxuICAgIGJvZHlBOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0QT4gfCBUT2JqZWN0QSxcbiAgICBib2R5QjogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEI+IHwgVE9iamVjdEIsXG4gICAgb3B0c0ZuOiBOZ3RjT3B0c0Z1bmN0aW9uPFRDb25zdHJhaW50VHlwZSwgVE9wdGlvbnM+ID0gKCkgPT4gKHt9IGFzIFRPcHRpb25zKVxuKTogTmd0Y0NvbnN0cmFpbnRSZXR1cm48VENvbnN0cmFpbnRUeXBlLCBUT2JqZWN0QSwgVE9iamVjdEI+IHtcbiAgICBjb25zdCB7IG9wdHMkLCBkZXN0cm95JCB9ID0gaW5qZWN0T3B0aW9uc1Byb2Nlc3NvcihvcHRzRm4pO1xuICAgIGNvbnN0IHV1aWQgPSBtYWtlSWQoKTtcblxuICAgIGNvbnN0IHBoeXNpY3NTdG9yZSA9IGluamVjdChOZ3RjU3RvcmUsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG5cbiAgICBjb25zdCBib2R5QVJlZiA9ICFpcy5yZWYoYm9keUEpID8gaW5qZWN0Tmd0UmVmKGJvZHlBKSA6IGJvZHlBO1xuICAgIGNvbnN0IGJvZHlCUmVmID0gIWlzLnJlZihib2R5QikgPyBpbmplY3ROZ3RSZWYoYm9keUIpIDogYm9keUI7XG5cbiAgICBjb21iaW5lTGF0ZXN0KFtwaHlzaWNzU3RvcmUuc2VsZWN0KCd3b3JrZXInKSwgYm9keUFSZWYuJCwgYm9keUJSZWYuJCwgb3B0cyRdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcEVmZmVjdCgoW3dvcmtlciwgYm9keUEsIGJvZHlCLCBvcHRzXSkgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci5hZGRDb25zdHJhaW50KHsgcHJvcHM6IFtib2R5QS51dWlkLCBib2R5Qi51dWlkLCBvcHRzXSwgdHlwZSwgdXVpZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4gd29ya2VyLnJlbW92ZUNvbnN0cmFpbnQoeyB1dWlkIH0pO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YWtlVW50aWwoZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgY29uc3QgYXBpID0ge1xuICAgICAgICBkaXNhYmxlOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBwaHlzaWNzU3RvcmUuZ2V0KCd3b3JrZXInKTtcbiAgICAgICAgICAgIHdvcmtlci5kaXNhYmxlQ29uc3RyYWludCh7IHV1aWQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVuYWJsZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gcGh5c2ljc1N0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIuZW5hYmxlQ29uc3RyYWludCh7IHV1aWQgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gcGh5c2ljc1N0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIucmVtb3ZlQ29uc3RyYWludCh7IHV1aWQgfSk7XG4gICAgICAgIH0sXG4gICAgfSBhcyBOZ3RjQ29uc3RyYWludE9SSGluZ2VBcGk8VENvbnN0cmFpbnRUeXBlPjtcblxuICAgIGlmICh0eXBlID09PSAnSGluZ2UnKSB7XG4gICAgICAgIGNvbnN0IGhpbmdlQXBpID0gYXBpIGFzIE5ndGNIaW5nZUNvbnN0cmFpbnRBcGk7XG4gICAgICAgIGhpbmdlQXBpLmRpc2FibGVNb3RvciA9ICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHBoeXNpY3NTdG9yZS5nZXQoJ3dvcmtlcicpO1xuICAgICAgICAgICAgd29ya2VyLmRpc2FibGVDb25zdHJhaW50TW90b3IoeyB1dWlkIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGhpbmdlQXBpLmVuYWJsZU1vdG9yID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gcGh5c2ljc1N0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIuZW5hYmxlQ29uc3RyYWludE1vdG9yKHsgdXVpZCB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBoaW5nZUFwaS5zZXRNb3RvclNwZWVkID0gKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHBoeXNpY3NTdG9yZS5nZXQoJ3dvcmtlcicpO1xuICAgICAgICAgICAgd29ya2VyLnNldENvbnN0cmFpbnRNb3RvclNwZWVkKHsgdXVpZCwgcHJvcHM6IHZhbHVlIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGhpbmdlQXBpLnNldE1vdG9yTWF4Rm9yY2UgPSAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gcGh5c2ljc1N0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIuc2V0Q29uc3RyYWludE1vdG9yTWF4Rm9yY2UoeyB1dWlkLCBwcm9wczogdmFsdWUgfSk7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgYm9keUE6IGJvZHlBUmVmLCBib2R5QjogYm9keUJSZWYsIGFwaSB9O1xufVxuIl19
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { makeId, tapEffect } from 'angular-three';
|
|
3
|
+
import { NgtcStore } from 'angular-three-cannon';
|
|
4
|
+
import { combineLatest, takeUntil } from 'rxjs';
|
|
5
|
+
import { injectOptionsProcessor } from './utils';
|
|
6
|
+
export function injectContactMaterial(materialA, materialB, optionsFn) {
|
|
7
|
+
const { opts$, destroy$ } = injectOptionsProcessor(optionsFn);
|
|
8
|
+
const physicsStore = inject(NgtcStore, { skipSelf: true });
|
|
9
|
+
const uuid = makeId();
|
|
10
|
+
combineLatest([physicsStore.select('worker'), opts$])
|
|
11
|
+
.pipe(tapEffect(([worker, options]) => {
|
|
12
|
+
worker.addContactMaterial({ props: [materialA, materialB, options], uuid });
|
|
13
|
+
return () => worker.removeContactMaterial({ uuid });
|
|
14
|
+
}), takeUntil(destroy$))
|
|
15
|
+
.subscribe();
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1tYXRlcmlhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYW5ndWxhci10aHJlZS1jYW5ub24vc2VydmljZXMvc3JjL2xpYi9jb250YWN0LW1hdGVyaWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdkMsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQWMsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzVELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUVqRCxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLFNBQTBCLEVBQzFCLFNBQTBCLEVBQzFCLFNBQTRFO0lBRTVFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFOUQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQzNELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO0lBRXRCLGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEQsSUFBSSxDQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUU7UUFDNUIsTUFBTSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzVFLE9BQU8sR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsUUFBUSxDQUFDLENBQ3RCO1NBQ0EsU0FBUyxFQUFFLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udGFjdE1hdGVyaWFsT3B0aW9ucywgTWF0ZXJpYWxPcHRpb25zIH0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBtYWtlSWQsIHRhcEVmZmVjdCB9IGZyb20gJ2FuZ3VsYXItdGhyZWUnO1xuaW1wb3J0IHsgTmd0Y1N0b3JlIH0gZnJvbSAnYW5ndWxhci10aHJlZS1jYW5ub24nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgT2JzZXJ2YWJsZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBpbmplY3RPcHRpb25zUHJvY2Vzc29yIH0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RDb250YWN0TWF0ZXJpYWwoXG4gICAgbWF0ZXJpYWxBOiBNYXRlcmlhbE9wdGlvbnMsXG4gICAgbWF0ZXJpYWxCOiBNYXRlcmlhbE9wdGlvbnMsXG4gICAgb3B0aW9uc0ZuOiAoKSA9PiBPYnNlcnZhYmxlPENvbnRhY3RNYXRlcmlhbE9wdGlvbnM+IHwgQ29udGFjdE1hdGVyaWFsT3B0aW9uc1xuKSB7XG4gICAgY29uc3QgeyBvcHRzJCwgZGVzdHJveSQgfSA9IGluamVjdE9wdGlvbnNQcm9jZXNzb3Iob3B0aW9uc0ZuKTtcblxuICAgIGNvbnN0IHBoeXNpY3NTdG9yZSA9IGluamVjdChOZ3RjU3RvcmUsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG4gICAgY29uc3QgdXVpZCA9IG1ha2VJZCgpO1xuXG4gICAgY29tYmluZUxhdGVzdChbcGh5c2ljc1N0b3JlLnNlbGVjdCgnd29ya2VyJyksIG9wdHMkXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXBFZmZlY3QoKFt3b3JrZXIsIG9wdGlvbnNdKSA9PiB7XG4gICAgICAgICAgICAgICAgd29ya2VyLmFkZENvbnRhY3RNYXRlcmlhbCh7IHByb3BzOiBbbWF0ZXJpYWxBLCBtYXRlcmlhbEIsIG9wdGlvbnNdLCB1dWlkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB3b3JrZXIucmVtb3ZlQ29udGFjdE1hdGVyaWFsKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFrZVVudGlsKGRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { makeId, tapEffect } from 'angular-three';
|
|
3
|
+
import { NgtcStore } from 'angular-three-cannon';
|
|
4
|
+
import { combineLatest, takeUntil } from 'rxjs';
|
|
5
|
+
import { injectOptionsProcessor } from './utils';
|
|
6
|
+
export function injectRaycastClosest(optionsFn, callback) {
|
|
7
|
+
injectRay('Closest', optionsFn, callback);
|
|
8
|
+
}
|
|
9
|
+
export function injectRaycastAny(optionsFn, callback) {
|
|
10
|
+
injectRay('Any', optionsFn, callback);
|
|
11
|
+
}
|
|
12
|
+
export function injectRaycastAll(optionsFn, callback) {
|
|
13
|
+
injectRay('All', optionsFn, callback);
|
|
14
|
+
}
|
|
15
|
+
function injectRay(mode, optionsFn, callback) {
|
|
16
|
+
const { opts$, destroy$ } = injectOptionsProcessor(optionsFn);
|
|
17
|
+
const uuid = makeId();
|
|
18
|
+
const physicsStore = inject(NgtcStore, { skipSelf: true });
|
|
19
|
+
combineLatest([physicsStore.select('worker'), opts$])
|
|
20
|
+
.pipe(tapEffect(([worker, opts]) => {
|
|
21
|
+
const events = physicsStore.get('events');
|
|
22
|
+
events[uuid] = { rayhit: callback };
|
|
23
|
+
worker.addRay({ props: { ...opts, mode }, uuid });
|
|
24
|
+
return () => {
|
|
25
|
+
worker.removeRay({ uuid });
|
|
26
|
+
delete events[uuid];
|
|
27
|
+
};
|
|
28
|
+
}), takeUntil(destroy$))
|
|
29
|
+
.subscribe();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLWNhbm5vbi9zZXJ2aWNlcy9zcmMvbGliL3JheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsYUFBYSxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFakQsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxTQUFvRCxFQUNwRCxRQUFrQztJQUVsQyxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixTQUFvRCxFQUNwRCxRQUFrQztJQUVsQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixTQUFvRCxFQUNwRCxRQUFrQztJQUVsQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUMxQyxDQUFDO0FBRUQsU0FBUyxTQUFTLENBQ2QsSUFBYSxFQUNiLFNBQW9ELEVBQ3BELFFBQXNDO0lBRXRDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLEdBQUcsc0JBQXNCLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDdEIsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBRTNELGFBQWEsQ0FBQyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDaEQsSUFBSSxDQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDekIsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDcEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLElBQUksRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsT0FBTyxHQUFHLEVBQUU7WUFDUixNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixDQUFDLENBQUM7SUFDTixDQUFDLENBQUMsRUFDRixTQUFTLENBQUMsUUFBUSxDQUFDLENBQ3RCO1NBQ0EsU0FBUyxFQUFFLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUmF5aGl0RXZlbnQsIFJheU1vZGUsIFJheU9wdGlvbnMgfSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IG1ha2VJZCwgdGFwRWZmZWN0IH0gZnJvbSAnYW5ndWxhci10aHJlZSc7XG5pbXBvcnQgeyBOZ3RjU3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlLWNhbm5vbic7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGluamVjdE9wdGlvbnNQcm9jZXNzb3IgfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJheWNhc3RDbG9zZXN0KFxuICAgIG9wdGlvbnNGbjogKCkgPT4gT2JzZXJ2YWJsZTxSYXlPcHRpb25zPiB8IFJheU9wdGlvbnMsXG4gICAgY2FsbGJhY2s6IChlOiBSYXloaXRFdmVudCkgPT4gdm9pZFxuKSB7XG4gICAgaW5qZWN0UmF5KCdDbG9zZXN0Jywgb3B0aW9uc0ZuLCBjYWxsYmFjayk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RSYXljYXN0QW55KFxuICAgIG9wdGlvbnNGbjogKCkgPT4gT2JzZXJ2YWJsZTxSYXlPcHRpb25zPiB8IFJheU9wdGlvbnMsXG4gICAgY2FsbGJhY2s6IChlOiBSYXloaXRFdmVudCkgPT4gdm9pZFxuKSB7XG4gICAgaW5qZWN0UmF5KCdBbnknLCBvcHRpb25zRm4sIGNhbGxiYWNrKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJheWNhc3RBbGwoXG4gICAgb3B0aW9uc0ZuOiAoKSA9PiBPYnNlcnZhYmxlPFJheU9wdGlvbnM+IHwgUmF5T3B0aW9ucyxcbiAgICBjYWxsYmFjazogKGU6IFJheWhpdEV2ZW50KSA9PiB2b2lkXG4pIHtcbiAgICBpbmplY3RSYXkoJ0FsbCcsIG9wdGlvbnNGbiwgY2FsbGJhY2spO1xufVxuXG5mdW5jdGlvbiBpbmplY3RSYXkoXG4gICAgbW9kZTogUmF5TW9kZSxcbiAgICBvcHRpb25zRm46ICgpID0+IE9ic2VydmFibGU8UmF5T3B0aW9ucz4gfCBSYXlPcHRpb25zLFxuICAgIGNhbGxiYWNrOiAoZXZlbnQ6IFJheWhpdEV2ZW50KSA9PiB2b2lkXG4pOiB2b2lkIHtcbiAgICBjb25zdCB7IG9wdHMkLCBkZXN0cm95JCB9ID0gaW5qZWN0T3B0aW9uc1Byb2Nlc3NvcihvcHRpb25zRm4pO1xuICAgIGNvbnN0IHV1aWQgPSBtYWtlSWQoKTtcbiAgICBjb25zdCBwaHlzaWNzU3RvcmUgPSBpbmplY3QoTmd0Y1N0b3JlLCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuXG4gICAgY29tYmluZUxhdGVzdChbcGh5c2ljc1N0b3JlLnNlbGVjdCgnd29ya2VyJyksIG9wdHMkXSlcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICB0YXBFZmZlY3QoKFt3b3JrZXIsIG9wdHNdKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRzID0gcGh5c2ljc1N0b3JlLmdldCgnZXZlbnRzJyk7XG4gICAgICAgICAgICAgICAgZXZlbnRzW3V1aWRdID0geyByYXloaXQ6IGNhbGxiYWNrIH07XG4gICAgICAgICAgICAgICAgd29ya2VyLmFkZFJheSh7IHByb3BzOiB7IC4uLm9wdHMsIG1vZGUgfSwgdXVpZCB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucmVtb3ZlUmF5KHsgdXVpZCB9KTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGV2ZW50c1t1dWlkXTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0YWtlVW50aWwoZGVzdHJveSQpXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xufVxuIl19
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { injectNgtDestroy, injectNgtRef, tapEffect } from 'angular-three';
|
|
3
|
+
import { NgtcStore, NgtcUtils } from 'angular-three-cannon';
|
|
4
|
+
import { combineLatest, takeUntil } from 'rxjs';
|
|
5
|
+
import { Object3D } from 'three';
|
|
6
|
+
export function injectRaycastVehicle(fn, instanceRef) {
|
|
7
|
+
const store = inject(NgtcStore, { skipSelf: true });
|
|
8
|
+
const { destroy$ } = injectNgtDestroy();
|
|
9
|
+
let ref = injectNgtRef();
|
|
10
|
+
if (instanceRef) {
|
|
11
|
+
ref = instanceRef;
|
|
12
|
+
}
|
|
13
|
+
queueMicrotask(() => {
|
|
14
|
+
if (!ref.nativeElement) {
|
|
15
|
+
ref.nativeElement = new Object3D();
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
const { chassisBody, indexForwardAxis = 2, indexRightAxis = 0, indexUpAxis = 1, wheelInfos, wheels } = fn();
|
|
19
|
+
combineLatest([store.select('worker'), ref.$, chassisBody.$, ...wheels.map((wheel) => wheel.$)])
|
|
20
|
+
.pipe(tapEffect(([worker, object]) => {
|
|
21
|
+
const uuid = object.uuid;
|
|
22
|
+
const chassisBodyUUID = NgtcUtils.getUUID(chassisBody);
|
|
23
|
+
const wheelUUIDs = wheels.map((wheel) => NgtcUtils.getUUID(wheel));
|
|
24
|
+
if (!chassisBodyUUID || !wheelUUIDs.every((v) => typeof v === 'string'))
|
|
25
|
+
return;
|
|
26
|
+
worker.addRaycastVehicle({
|
|
27
|
+
props: [
|
|
28
|
+
chassisBodyUUID,
|
|
29
|
+
wheelUUIDs,
|
|
30
|
+
wheelInfos,
|
|
31
|
+
indexForwardAxis,
|
|
32
|
+
indexRightAxis,
|
|
33
|
+
indexUpAxis,
|
|
34
|
+
],
|
|
35
|
+
uuid,
|
|
36
|
+
});
|
|
37
|
+
return () => worker.removeRaycastVehicle({ uuid });
|
|
38
|
+
}), takeUntil(destroy$))
|
|
39
|
+
.subscribe();
|
|
40
|
+
const api = {
|
|
41
|
+
applyEngineForce: (value, wheelIndex) => {
|
|
42
|
+
const worker = store.get('worker');
|
|
43
|
+
const uuid = NgtcUtils.getUUID(ref);
|
|
44
|
+
uuid && worker.applyRaycastVehicleEngineForce({ props: [value, wheelIndex], uuid });
|
|
45
|
+
},
|
|
46
|
+
setBrake: (brake, wheelIndex) => {
|
|
47
|
+
const worker = store.get('worker');
|
|
48
|
+
const uuid = NgtcUtils.getUUID(ref);
|
|
49
|
+
uuid && worker.setRaycastVehicleBrake({ props: [brake, wheelIndex], uuid });
|
|
50
|
+
},
|
|
51
|
+
setSteeringValue: (value, wheelIndex) => {
|
|
52
|
+
const worker = store.get('worker');
|
|
53
|
+
const uuid = NgtcUtils.getUUID(ref);
|
|
54
|
+
uuid && worker.setRaycastVehicleSteeringValue({ props: [value, wheelIndex], uuid });
|
|
55
|
+
},
|
|
56
|
+
sliding: {
|
|
57
|
+
get subscribe() {
|
|
58
|
+
const { worker, subscriptions } = store.get();
|
|
59
|
+
return NgtcUtils.subscribe(ref, worker, subscriptions, 'sliding', undefined, 'vehicles');
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
remove: () => {
|
|
63
|
+
const worker = store.get('worker');
|
|
64
|
+
const uuid = NgtcUtils.getUUID(ref);
|
|
65
|
+
uuid && worker.removeRaycastVehicle({ uuid });
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
return { ref, api };
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmF5Y2FzdC12ZWhpY2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLWNhbm5vbi9zZXJ2aWNlcy9zcmMvbGliL3JheWNhc3QtdmVoaWNsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQWtCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzVELE9BQU8sRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUF3QmpDLE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsRUFBaUMsRUFDakMsV0FBcUM7SUFFckMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBRXhDLElBQUksR0FBRyxHQUFHLFlBQVksRUFBVyxDQUFDO0lBRWxDLElBQUksV0FBVyxFQUFFO1FBQ2IsR0FBRyxHQUFHLFdBQVcsQ0FBQztLQUNyQjtJQUVELGNBQWMsQ0FBQyxHQUFHLEVBQUU7UUFDaEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUU7WUFDcEIsR0FBRyxDQUFDLGFBQWEsR0FBRyxJQUFJLFFBQVEsRUFBYSxDQUFDO1NBQ2pEO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLEVBQUUsV0FBVyxFQUFFLGdCQUFnQixHQUFHLENBQUMsRUFBRSxjQUFjLEdBQUcsQ0FBQyxFQUFFLFdBQVcsR0FBRyxDQUFDLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUFDO0lBRTVHLGFBQWEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0YsSUFBSSxDQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztRQUN6QixNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVuRSxJQUFJLENBQUMsZUFBZSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDO1lBQUUsT0FBTztRQUVoRixNQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDckIsS0FBSyxFQUFFO2dCQUNILGVBQWU7Z0JBQ2YsVUFBc0I7Z0JBQ3RCLFVBQVU7Z0JBQ1YsZ0JBQWdCO2dCQUNoQixjQUFjO2dCQUNkLFdBQVc7YUFDZDtZQUNELElBQUk7U0FDUCxDQUFDLENBQUM7UUFFSCxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLEVBQ0YsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUN0QjtTQUNBLFNBQVMsRUFBRSxDQUFDO0lBRWpCLE1BQU0sR0FBRyxHQUFHO1FBQ1IsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1lBQ3BELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksTUFBTSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELFFBQVEsRUFBRSxDQUFDLEtBQWEsRUFBRSxVQUFrQixFQUFFLEVBQUU7WUFDNUMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3BDLElBQUksSUFBSSxNQUFNLENBQUMsc0JBQXNCLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNoRixDQUFDO1FBQ0QsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1lBQ3BELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksTUFBTSxDQUFDLDhCQUE4QixDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELE9BQU8sRUFBRTtZQUNMLElBQUksU0FBUztnQkFDVCxNQUFNLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDOUMsT0FBTyxTQUFTLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDN0YsQ0FBQztTQUNKO1FBQ0QsTUFBTSxFQUFFLEdBQUcsRUFBRTtZQUNULE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwQyxJQUFJLElBQUksTUFBTSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO0tBQzJCLENBQUM7SUFFakMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBXaGVlbEluZm9PcHRpb25zIH0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBpbmplY3ROZ3REZXN0cm95LCBpbmplY3ROZ3RSZWYsIE5ndEluamVjdGVkUmVmLCB0YXBFZmZlY3QgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndGNTdG9yZSwgTmd0Y1V0aWxzIH0gZnJvbSAnYW5ndWxhci10aHJlZS1jYW5ub24nO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBPYmplY3QzRCB9IGZyb20gJ3RocmVlJztcblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUmF5Y2FzdFZlaGljbGVQcm9wcyB7XG4gICAgY2hhc3Npc0JvZHk6IE5ndEluamVjdGVkUmVmPFRIUkVFLk9iamVjdDNEPjtcbiAgICB3aGVlbEluZm9zOiBXaGVlbEluZm9PcHRpb25zW107XG4gICAgd2hlZWxzOiBBcnJheTxOZ3RJbmplY3RlZFJlZjxUSFJFRS5PYmplY3QzRD4+O1xuICAgIGluZGV4Rm9yd2FyZEF4aXM/OiBudW1iZXI7XG4gICAgaW5kZXhSaWdodEF4aXM/OiBudW1iZXI7XG4gICAgaW5kZXhVcEF4aXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y1JheWNhc3RWZWhpY2xlUHVibGljQXBpIHtcbiAgICBhcHBseUVuZ2luZUZvcmNlOiAodmFsdWU6IG51bWJlciwgd2hlZWxJbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHNldEJyYWtlOiAoYnJha2U6IG51bWJlciwgd2hlZWxJbmRleDogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHNldFN0ZWVyaW5nVmFsdWU6ICh2YWx1ZTogbnVtYmVyLCB3aGVlbEluZGV4OiBudW1iZXIpID0+IHZvaWQ7XG4gICAgc2xpZGluZzogeyBzdWJzY3JpYmU6IChjYWxsYmFjazogKHNsaWRpbmc6IGJvb2xlYW4pID0+IHZvaWQpID0+IHZvaWQgfTtcbiAgICByZW1vdmU6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y1JheWNhc3RWZWhpY2xlUmV0dXJuPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEPiB7XG4gICAgcmVmOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0PjtcbiAgICBhcGk6IE5ndGNSYXljYXN0VmVoaWNsZVB1YmxpY0FwaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFJheWNhc3RWZWhpY2xlPFRPYmplY3QgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEPihcbiAgICBmbjogKCkgPT4gTmd0Y1JheWNhc3RWZWhpY2xlUHJvcHMsXG4gICAgaW5zdGFuY2VSZWY/OiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0PlxuKTogTmd0Y1JheWNhc3RWZWhpY2xlUmV0dXJuPFRPYmplY3Q+IHtcbiAgICBjb25zdCBzdG9yZSA9IGluamVjdChOZ3RjU3RvcmUsIHsgc2tpcFNlbGY6IHRydWUgfSk7XG4gICAgY29uc3QgeyBkZXN0cm95JCB9ID0gaW5qZWN0Tmd0RGVzdHJveSgpO1xuXG4gICAgbGV0IHJlZiA9IGluamVjdE5ndFJlZjxUT2JqZWN0PigpO1xuXG4gICAgaWYgKGluc3RhbmNlUmVmKSB7XG4gICAgICAgIHJlZiA9IGluc3RhbmNlUmVmO1xuICAgIH1cblxuICAgIHF1ZXVlTWljcm90YXNrKCgpID0+IHtcbiAgICAgICAgaWYgKCFyZWYubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgcmVmLm5hdGl2ZUVsZW1lbnQgPSBuZXcgT2JqZWN0M0QoKSBhcyBUT2JqZWN0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGNoYXNzaXNCb2R5LCBpbmRleEZvcndhcmRBeGlzID0gMiwgaW5kZXhSaWdodEF4aXMgPSAwLCBpbmRleFVwQXhpcyA9IDEsIHdoZWVsSW5mb3MsIHdoZWVscyB9ID0gZm4oKTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW3N0b3JlLnNlbGVjdCgnd29ya2VyJyksIHJlZi4kLCBjaGFzc2lzQm9keS4kLCAuLi53aGVlbHMubWFwKCh3aGVlbCkgPT4gd2hlZWwuJCldKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcEVmZmVjdCgoW3dvcmtlciwgb2JqZWN0XSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBvYmplY3QudXVpZDtcbiAgICAgICAgICAgICAgICBjb25zdCBjaGFzc2lzQm9keVVVSUQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChjaGFzc2lzQm9keSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgd2hlZWxVVUlEcyA9IHdoZWVscy5tYXAoKHdoZWVsKSA9PiBOZ3RjVXRpbHMuZ2V0VVVJRCh3aGVlbCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGFzc2lzQm9keVVVSUQgfHwgIXdoZWVsVVVJRHMuZXZlcnkoKHYpID0+IHR5cGVvZiB2ID09PSAnc3RyaW5nJykpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHdvcmtlci5hZGRSYXljYXN0VmVoaWNsZSh7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFzc2lzQm9keVVVSUQsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aGVlbFVVSURzIGFzIHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2hlZWxJbmZvcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4Rm9yd2FyZEF4aXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFJpZ2h0QXhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4VXBBeGlzLFxuICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICB1dWlkLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuICgpID0+IHdvcmtlci5yZW1vdmVSYXljYXN0VmVoaWNsZSh7IHV1aWQgfSk7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRha2VVbnRpbChkZXN0cm95JClcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBjb25zdCBhcGkgPSB7XG4gICAgICAgIGFwcGx5RW5naW5lRm9yY2U6ICh2YWx1ZTogbnVtYmVyLCB3aGVlbEluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHN0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICBjb25zdCB1dWlkID0gTmd0Y1V0aWxzLmdldFVVSUQocmVmKTtcbiAgICAgICAgICAgIHV1aWQgJiYgd29ya2VyLmFwcGx5UmF5Y2FzdFZlaGljbGVFbmdpbmVGb3JjZSh7IHByb3BzOiBbdmFsdWUsIHdoZWVsSW5kZXhdLCB1dWlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRCcmFrZTogKGJyYWtlOiBudW1iZXIsIHdoZWVsSW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gc3RvcmUuZ2V0KCd3b3JrZXInKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChyZWYpO1xuICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIuc2V0UmF5Y2FzdFZlaGljbGVCcmFrZSh7IHByb3BzOiBbYnJha2UsIHdoZWVsSW5kZXhdLCB1dWlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBzZXRTdGVlcmluZ1ZhbHVlOiAodmFsdWU6IG51bWJlciwgd2hlZWxJbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB3b3JrZXIgPSBzdG9yZS5nZXQoJ3dvcmtlcicpO1xuICAgICAgICAgICAgY29uc3QgdXVpZCA9IE5ndGNVdGlscy5nZXRVVUlEKHJlZik7XG4gICAgICAgICAgICB1dWlkICYmIHdvcmtlci5zZXRSYXljYXN0VmVoaWNsZVN0ZWVyaW5nVmFsdWUoeyBwcm9wczogW3ZhbHVlLCB3aGVlbEluZGV4XSwgdXVpZCB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2xpZGluZzoge1xuICAgICAgICAgICAgZ2V0IHN1YnNjcmliZSgpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHdvcmtlciwgc3Vic2NyaXB0aW9ucyB9ID0gc3RvcmUuZ2V0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5ndGNVdGlscy5zdWJzY3JpYmUocmVmLCB3b3JrZXIsIHN1YnNjcmlwdGlvbnMsICdzbGlkaW5nJywgdW5kZWZpbmVkLCAndmVoaWNsZXMnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gc3RvcmUuZ2V0KCd3b3JrZXInKTtcbiAgICAgICAgICAgIGNvbnN0IHV1aWQgPSBOZ3RjVXRpbHMuZ2V0VVVJRChyZWYpO1xuICAgICAgICAgICAgdXVpZCAmJiB3b3JrZXIucmVtb3ZlUmF5Y2FzdFZlaGljbGUoeyB1dWlkIH0pO1xuICAgICAgICB9LFxuICAgIH0gYXMgTmd0Y1JheWNhc3RWZWhpY2xlUHVibGljQXBpO1xuXG4gICAgcmV0dXJuIHsgcmVmLCBhcGkgfTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { inject } from '@angular/core';
|
|
2
|
+
import { makeId, tapEffect } from 'angular-three';
|
|
3
|
+
import { NgtcStore } from 'angular-three-cannon';
|
|
4
|
+
import { combineLatest, takeUntil } from 'rxjs';
|
|
5
|
+
import { injectOptionsProcessor } from './utils';
|
|
6
|
+
export function injectSpring(bodyA, bodyB, optsFn) {
|
|
7
|
+
const store = inject(NgtcStore, { skipSelf: true });
|
|
8
|
+
const uuid = makeId();
|
|
9
|
+
const { opts$, destroy$ } = injectOptionsProcessor(optsFn);
|
|
10
|
+
combineLatest([store.select('worker'), bodyA.$, bodyB.$, opts$])
|
|
11
|
+
.pipe(tapEffect(([worker, bodyA, bodyB, opts]) => {
|
|
12
|
+
worker.addSpring({ props: [bodyA.uuid, bodyB.uuid, opts], uuid });
|
|
13
|
+
return () => worker.removeSpring({ uuid });
|
|
14
|
+
}), takeUntil(destroy$))
|
|
15
|
+
.subscribe();
|
|
16
|
+
const api = {
|
|
17
|
+
setDamping: (value) => {
|
|
18
|
+
const worker = store.get('worker');
|
|
19
|
+
worker.setSpringDamping({ uuid, props: value });
|
|
20
|
+
},
|
|
21
|
+
setRestLength: (value) => {
|
|
22
|
+
const worker = store.get('worker');
|
|
23
|
+
worker.setSpringRestLength({ uuid, props: value });
|
|
24
|
+
},
|
|
25
|
+
setStiffness: (value) => {
|
|
26
|
+
const worker = store.get('worker');
|
|
27
|
+
worker.setSpringStiffness({ uuid, props: value });
|
|
28
|
+
},
|
|
29
|
+
remove: () => {
|
|
30
|
+
const worker = store.get('worker');
|
|
31
|
+
worker.removeSpring({ uuid });
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
return { bodyA, bodyB, api };
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ByaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hbmd1bGFyLXRocmVlLWNhbm5vbi9zZXJ2aWNlcy9zcmMvbGliL3NwcmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRXZDLE9BQU8sRUFBRSxNQUFNLEVBQWtCLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakQsT0FBTyxFQUFFLGFBQWEsRUFBYyxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBa0JqRCxNQUFNLFVBQVUsWUFBWSxDQUl4QixLQUErQixFQUMvQixLQUErQixFQUMvQixNQUFtRDtJQUVuRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFDdEIsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsR0FBRyxzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUzRCxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMzRCxJQUFJLENBQ0QsU0FBUyxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsRSxPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxFQUNGLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FDdEI7U0FDQSxTQUFTLEVBQUUsQ0FBQztJQUVqQixNQUFNLEdBQUcsR0FBRztRQUNSLFVBQVUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFO1lBQzFCLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3BELENBQUM7UUFDRCxhQUFhLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRTtZQUM3QixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO1FBQ0QsWUFBWSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUU7WUFDNUIsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUNELE1BQU0sRUFBRSxHQUFHLEVBQUU7WUFDVCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7S0FDYSxDQUFDO0lBRW5CLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFNwcmluZ09wdG5zIH0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBtYWtlSWQsIE5ndEluamVjdGVkUmVmLCB0YXBFZmZlY3QgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IE5ndGNTdG9yZSB9IGZyb20gJ2FuZ3VsYXItdGhyZWUtY2Fubm9uJztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIE9ic2VydmFibGUsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgaW5qZWN0T3B0aW9uc1Byb2Nlc3NvciB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNTcHJpbmdBcGkge1xuICAgIHNldERhbXBpbmc6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHNldFJlc3RMZW5ndGg6ICh2YWx1ZTogbnVtYmVyKSA9PiB2b2lkO1xuICAgIHNldFN0aWZmbmVzczogKHZhbHVlOiBudW1iZXIpID0+IHZvaWQ7XG4gICAgcmVtb3ZlOiAoKSA9PiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5ndGNTcHJpbmdSZXR1cm48XG4gICAgVE9iamVjdEEgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNELFxuICAgIFRPYmplY3RCIGV4dGVuZHMgVEhSRUUuT2JqZWN0M0QgPSBUSFJFRS5PYmplY3QzRFxuPiB7XG4gICAgYm9keUE6IE5ndEluamVjdGVkUmVmPFRPYmplY3RBPjtcbiAgICBib2R5QjogTmd0SW5qZWN0ZWRSZWY8VE9iamVjdEI+O1xuICAgIGFwaTogTmd0Y1NwcmluZ0FwaTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGluamVjdFNwcmluZzxcbiAgICBUT2JqZWN0QSBleHRlbmRzIFRIUkVFLk9iamVjdDNEID0gVEhSRUUuT2JqZWN0M0QsXG4gICAgVE9iamVjdEIgZXh0ZW5kcyBUSFJFRS5PYmplY3QzRCA9IFRIUkVFLk9iamVjdDNEXG4+KFxuICAgIGJvZHlBOiBOZ3RJbmplY3RlZFJlZjxUT2JqZWN0QT4sXG4gICAgYm9keUI6IE5ndEluamVjdGVkUmVmPFRPYmplY3RCPixcbiAgICBvcHRzRm46ICgpID0+IE9ic2VydmFibGU8U3ByaW5nT3B0bnM+IHwgU3ByaW5nT3B0bnNcbik6IE5ndGNTcHJpbmdSZXR1cm48VE9iamVjdEEsIFRPYmplY3RCPiB7XG4gICAgY29uc3Qgc3RvcmUgPSBpbmplY3QoTmd0Y1N0b3JlLCB7IHNraXBTZWxmOiB0cnVlIH0pO1xuICAgIGNvbnN0IHV1aWQgPSBtYWtlSWQoKTtcbiAgICBjb25zdCB7IG9wdHMkLCBkZXN0cm95JCB9ID0gaW5qZWN0T3B0aW9uc1Byb2Nlc3NvcihvcHRzRm4pO1xuXG4gICAgY29tYmluZUxhdGVzdChbc3RvcmUuc2VsZWN0KCd3b3JrZXInKSwgYm9keUEuJCwgYm9keUIuJCwgb3B0cyRdKVxuICAgICAgICAucGlwZShcbiAgICAgICAgICAgIHRhcEVmZmVjdCgoW3dvcmtlciwgYm9keUEsIGJvZHlCLCBvcHRzXSkgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci5hZGRTcHJpbmcoeyBwcm9wczogW2JvZHlBLnV1aWQsIGJvZHlCLnV1aWQsIG9wdHNdLCB1dWlkIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB3b3JrZXIucmVtb3ZlU3ByaW5nKHsgdXVpZCB9KTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFrZVVudGlsKGRlc3Ryb3kkKVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGNvbnN0IGFwaSA9IHtcbiAgICAgICAgc2V0RGFtcGluZzogKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHN0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIuc2V0U3ByaW5nRGFtcGluZyh7IHV1aWQsIHByb3BzOiB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UmVzdExlbmd0aDogKHZhbHVlOiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHdvcmtlciA9IHN0b3JlLmdldCgnd29ya2VyJyk7XG4gICAgICAgICAgICB3b3JrZXIuc2V0U3ByaW5nUmVzdExlbmd0aCh7IHV1aWQsIHByb3BzOiB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0U3RpZmZuZXNzOiAodmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gc3RvcmUuZ2V0KCd3b3JrZXInKTtcbiAgICAgICAgICAgIHdvcmtlci5zZXRTcHJpbmdTdGlmZm5lc3MoeyB1dWlkLCBwcm9wczogdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlbW92ZTogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgd29ya2VyID0gc3RvcmUuZ2V0KCd3b3JrZXInKTtcbiAgICAgICAgICAgIHdvcmtlci5yZW1vdmVTcHJpbmcoeyB1dWlkIH0pO1xuICAgICAgICB9LFxuICAgIH0gYXMgTmd0Y1NwcmluZ0FwaTtcblxuICAgIHJldHVybiB7IGJvZHlBLCBib2R5QiwgYXBpIH07XG59XG4iXX0=
|