angular-three-cannon 2.0.0-beta.9 → 2.1.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.
Files changed (49) hide show
  1. package/README.md +71 -4
  2. package/body/README.md +49 -0
  3. package/body/index.d.ts +2 -0
  4. package/body/lib/body.d.ts +17 -0
  5. package/body/lib/types.d.ts +49 -0
  6. package/body/lib/utils.d.ts +50 -0
  7. package/constraint/README.md +47 -0
  8. package/constraint/index.d.ts +1 -0
  9. package/constraint/lib/constraint.d.ts +32 -0
  10. package/debug/README.md +48 -2
  11. package/debug/lib/debug.d.ts +15 -33
  12. package/esm2022/body/angular-three-cannon-body.mjs +5 -0
  13. package/esm2022/body/index.mjs +2 -0
  14. package/esm2022/body/lib/body.mjs +108 -0
  15. package/esm2022/body/lib/types.mjs +2 -0
  16. package/esm2022/body/lib/utils.mjs +193 -0
  17. package/esm2022/constraint/angular-three-cannon-constraint.mjs +5 -0
  18. package/esm2022/constraint/index.mjs +2 -0
  19. package/esm2022/constraint/lib/constraint.mjs +67 -0
  20. package/esm2022/debug/lib/debug.mjs +56 -71
  21. package/esm2022/lib/physics.mjs +79 -176
  22. package/fesm2022/angular-three-cannon-body.mjs +306 -0
  23. package/fesm2022/angular-three-cannon-body.mjs.map +1 -0
  24. package/fesm2022/angular-three-cannon-constraint.mjs +74 -0
  25. package/fesm2022/angular-three-cannon-constraint.mjs.map +1 -0
  26. package/fesm2022/angular-three-cannon-debug.mjs +56 -71
  27. package/fesm2022/angular-three-cannon-debug.mjs.map +1 -1
  28. package/fesm2022/angular-three-cannon.mjs +79 -176
  29. package/fesm2022/angular-three-cannon.mjs.map +1 -1
  30. package/lib/physics.d.ts +31 -49
  31. package/package.json +25 -15
  32. package/esm2022/services/angular-three-cannon-services.mjs +0 -5
  33. package/esm2022/services/index.mjs +0 -7
  34. package/esm2022/services/lib/body.mjs +0 -293
  35. package/esm2022/services/lib/constraints.mjs +0 -58
  36. package/esm2022/services/lib/contact-material.mjs +0 -20
  37. package/esm2022/services/lib/ray.mjs +0 -30
  38. package/esm2022/services/lib/raycast-vehicle.mjs +0 -68
  39. package/esm2022/services/lib/spring.mjs +0 -31
  40. package/fesm2022/angular-three-cannon-services.mjs +0 -490
  41. package/fesm2022/angular-three-cannon-services.mjs.map +0 -1
  42. package/services/README.md +0 -3
  43. package/services/index.d.ts +0 -6
  44. package/services/lib/body.d.ts +0 -60
  45. package/services/lib/constraints.d.ts +0 -31
  46. package/services/lib/contact-material.d.ts +0 -9
  47. package/services/lib/ray.d.ts +0 -12
  48. package/services/lib/raycast-vehicle.d.ts +0 -30
  49. package/services/lib/spring.d.ts +0 -19
@@ -1,12 +1,14 @@
1
- import { Component, Injector, Input, NgZone, effect, forwardRef, inject, untracked } from '@angular/core';
1
+ import { ChangeDetectionStrategy, Component, DestroyRef, afterNextRender, computed, inject, input, signal, untracked, } from '@angular/core';
2
2
  import { CannonWorkerAPI, } from '@pmndrs/cannon-worker-api';
3
- import { createInjectionToken, injectBeforeRender, injectNgtStore, signalStore } from 'angular-three';
4
- import * as THREE from 'three';
3
+ import { injectBeforeRender, injectStore } from 'angular-three';
4
+ import { injectAutoEffect } from 'ngxtension/auto-effect';
5
+ import { mergeInputs } from 'ngxtension/inject-inputs';
6
+ import { InstancedMesh, Matrix4, Quaternion, Vector3 } from 'three';
5
7
  import * as i0 from "@angular/core";
6
- const v = new THREE.Vector3();
7
- const s = new THREE.Vector3(1, 1, 1);
8
- const q = new THREE.Quaternion();
9
- const m = new THREE.Matrix4();
8
+ const v = new Vector3();
9
+ const s = new Vector3(1, 1, 1);
10
+ const q = new Quaternion();
11
+ const m = new Matrix4();
10
12
  function apply(index, positions, quaternions, scale = s, object) {
11
13
  if (index !== undefined) {
12
14
  m.compose(v.fromArray(positions, index * 3), q.fromArray(quaternions, index * 4), scale);
@@ -18,107 +20,68 @@ function apply(index, positions, quaternions, scale = s, object) {
18
20
  }
19
21
  return m.identity();
20
22
  }
21
- const unique = () => {
23
+ function unique() {
22
24
  const values = [];
23
25
  return (value) => (values.includes(value) ? false : !!values.push(value));
26
+ }
27
+ const defaultOptions = {
28
+ allowSleep: false,
29
+ axisIndex: 0,
30
+ broadphase: 'Naive',
31
+ defaultContactMaterial: { contactEquationStiffness: 1e6 },
32
+ frictionGravity: null,
33
+ gravity: [0, -9.81, 0],
34
+ isPaused: false,
35
+ iterations: 5,
36
+ maxSubSteps: 10,
37
+ quatNormalizeFast: false,
38
+ quatNormalizeSkip: 0,
39
+ shouldInvalidate: true,
40
+ size: 1000,
41
+ solver: 'GS',
42
+ stepSize: 1 / 60,
43
+ tolerance: 0.001,
24
44
  };
25
- export const [injectNgtcPhysicsApi, provideNgtcPhysicsApi] = createInjectionToken((physics) => physics.api, { isRoot: false, deps: [forwardRef(() => NgtcPhysics)] });
26
45
  export class NgtcPhysics {
27
46
  constructor() {
28
- this.inputs = signalStore({
29
- allowSleep: false,
30
- axisIndex: 0,
31
- broadphase: 'Naive',
32
- defaultContactMaterial: { contactEquationStiffness: 1e6 },
33
- frictionGravity: null,
34
- gravity: [0, -9.81, 0],
35
- isPaused: false,
36
- iterations: 5,
37
- maxSubSteps: 10,
38
- quatNormalizeFast: false,
39
- quatNormalizeSkip: 0,
40
- shouldInvalidate: true,
41
- size: 1000,
42
- solver: 'GS',
43
- stepSize: 1 / 60,
44
- tolerance: 0.001,
45
- });
46
- this.zone = inject(NgZone);
47
- this.injector = inject(Injector);
48
- this.store = injectNgtStore();
47
+ this.autoEffect = injectAutoEffect();
48
+ this.store = injectStore();
49
+ this.options = input(defaultOptions, { transform: mergeInputs(defaultOptions) });
49
50
  this.invalidate = this.store.select('invalidate');
50
- this.api = signalStore({
51
+ // @ts-expect-error - worker is not nullable, and we don't want to use ! operator
52
+ this.worker = signal(null);
53
+ this.api = {
51
54
  bodies: {},
52
55
  events: {},
53
56
  refs: {},
54
57
  scaleOverrides: {},
55
58
  subscriptions: {},
56
- worker: null,
57
- });
58
- this.worker = this.api.select('worker');
59
- }
60
- set _isPaused(isPaused) {
61
- this.inputs.set({ isPaused });
62
- }
63
- set _maxSubSteps(maxSubSteps) {
64
- this.inputs.set({ maxSubSteps });
65
- }
66
- set _shouldInvalidate(shouldInvalidate) {
67
- this.inputs.set({ shouldInvalidate });
68
- }
69
- set _stepSize(stepSize) {
70
- this.inputs.set({ stepSize });
71
- }
72
- set _size(size) {
73
- this.inputs.set({ size });
74
- }
75
- set _allowSleep(allowSleep) {
76
- this.inputs.set({ allowSleep });
77
- }
78
- set _axisIndex(axisIndex) {
79
- this.inputs.set({ axisIndex });
80
- }
81
- set _broadphase(broadphase) {
82
- this.inputs.set({ broadphase });
83
- }
84
- set _defaultContactMaterial(defaultContactMaterial) {
85
- this.inputs.set({ defaultContactMaterial });
86
- }
87
- set _frictionGravity(frictionGravity) {
88
- this.inputs.set({ frictionGravity });
89
- }
90
- set _gravity(gravity) {
91
- this.inputs.set({ gravity });
92
- }
93
- set _iterations(iterations) {
94
- this.inputs.set({ iterations });
95
- }
96
- set _quatNormalizeFast(quatNormalizeFast) {
97
- this.inputs.set({ quatNormalizeFast });
98
- }
99
- set _quatNormalizeSkip(quatNormalizeSkip) {
100
- this.inputs.set({ quatNormalizeSkip });
101
- }
102
- set _solver(solver) {
103
- this.inputs.set({ solver });
104
- }
105
- set _tolerance(tolerance) {
106
- this.inputs.set({ tolerance });
107
- }
108
- ngOnInit() {
109
- this.zone.runOutsideAngular(() => {
110
- this.api.set({ worker: new CannonWorkerAPI(this.inputs.state()) });
59
+ worker: this.worker.asReadonly(),
60
+ };
61
+ afterNextRender(() => {
62
+ this.worker.set(new CannonWorkerAPI(this.options()));
111
63
  this.connectWorker();
112
64
  this.updateWorkerState('axisIndex');
113
65
  this.updateWorkerState('broadphase');
114
66
  this.updateWorkerState('gravity');
115
67
  this.updateWorkerState('iterations');
116
68
  this.updateWorkerState('tolerance');
117
- this.beforeRender();
69
+ });
70
+ let timeSinceLastCalled = 0;
71
+ injectBeforeRender(({ delta }) => {
72
+ const [{ isPaused, maxSubSteps, stepSize }, worker] = [this.options(), this.worker()];
73
+ if (isPaused || !worker || stepSize == null)
74
+ return;
75
+ timeSinceLastCalled += delta;
76
+ worker.step({ maxSubSteps, stepSize, timeSinceLastCalled });
77
+ timeSinceLastCalled = 0;
78
+ });
79
+ inject(DestroyRef).onDestroy(() => {
80
+ this.ref?.destroy();
118
81
  });
119
82
  }
120
83
  connectWorker() {
121
- effect((onCleanup) => {
84
+ this.autoEffect(() => {
122
85
  const worker = this.worker();
123
86
  if (!worker)
124
87
  return;
@@ -129,34 +92,29 @@ export class NgtcPhysics {
129
92
  worker.on('collideEnd', this.collideEndHandler.bind(this));
130
93
  worker.on('frame', this.frameHandler.bind(this));
131
94
  worker.on('rayhit', this.rayhitHandler.bind(this));
132
- onCleanup(() => {
95
+ return () => {
133
96
  worker.terminate();
134
97
  worker.removeAllListeners();
135
- });
136
- }, { injector: this.injector });
98
+ };
99
+ });
137
100
  }
138
101
  updateWorkerState(key) {
139
- const compute = this.inputs.select(key);
140
- effect(() => {
141
- const [worker, value] = [untracked(this.worker), compute()];
142
- // @ts-expect-error
102
+ const computedValue = computed(() => this.options()[key]);
103
+ this.autoEffect(() => {
104
+ const [worker, value] = [untracked(this.worker), computedValue()];
105
+ // @ts-expect-error - we know key is a valid key of CannonWorkerAPI
143
106
  worker[key] = value;
144
- }, { injector: this.injector });
107
+ });
145
108
  }
146
109
  collideHandler({ body, contact: { bi, bj, ...contactRest }, target, ...rest }) {
147
- const { events, refs } = this.api.get();
110
+ const { events, refs } = this.api;
148
111
  const cb = events[target]?.collide;
149
112
  if (cb) {
150
- cb({
151
- body: refs[body],
152
- contact: { bi: refs[bi], bj: refs[bj], ...contactRest },
153
- target: refs[target],
154
- ...rest,
155
- });
113
+ cb({ body: refs[body], contact: { bi: refs[bi], bj: refs[bj], ...contactRest }, target: refs[target], ...rest });
156
114
  }
157
115
  }
158
116
  collideBeginHandler({ bodyA, bodyB }) {
159
- const { events, refs } = this.api.get();
117
+ const { events, refs } = this.api;
160
118
  const cbA = events[bodyA]?.collideBegin;
161
119
  if (cbA)
162
120
  cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideBegin' });
@@ -165,7 +123,7 @@ export class NgtcPhysics {
165
123
  cbB({ body: refs[bodyA], op: 'event', target: refs[bodyB], type: 'collideBegin' });
166
124
  }
167
125
  collideEndHandler({ bodyA, bodyB }) {
168
- const { events, refs } = this.api.get();
126
+ const { events, refs } = this.api;
169
127
  const cbA = events[bodyA]?.collideEnd;
170
128
  if (cbA)
171
129
  cbA({ body: refs[bodyB], op: 'event', target: refs[bodyA], type: 'collideEnd' });
@@ -175,8 +133,8 @@ export class NgtcPhysics {
175
133
  }
176
134
  frameHandler({ active, bodies: uuids = [], observations, positions, quaternions, }) {
177
135
  const [{ shouldInvalidate }, { bodies, subscriptions, refs, scaleOverrides }, invalidate] = [
178
- this.inputs.get(),
179
- this.api.get(),
136
+ untracked(this.options),
137
+ this.api,
180
138
  this.invalidate(),
181
139
  ];
182
140
  for (let i = 0; i < uuids.length; i++) {
@@ -185,13 +143,13 @@ export class NgtcPhysics {
185
143
  observations.forEach(([id, value, type]) => {
186
144
  const subscription = subscriptions[id] || {};
187
145
  const cb = subscription[type];
188
- // HELP: We clearly know the type of the callback, but typescript can't deal with it
146
+ // @ts-expect-error - We clearly know the type of the callback, but typescript can't deal with it
189
147
  cb && cb(value);
190
148
  });
191
149
  if (!active)
192
150
  return;
193
151
  for (const ref of Object.values(refs).filter(unique())) {
194
- if (ref instanceof THREE.InstancedMesh) {
152
+ if (ref instanceof InstancedMesh) {
195
153
  for (let i = 0; i < ref.count; i++) {
196
154
  const uuid = `${ref.uuid}/${i}`;
197
155
  const index = bodies[uuid];
@@ -210,80 +168,25 @@ export class NgtcPhysics {
210
168
  invalidate();
211
169
  }
212
170
  rayhitHandler({ body, ray: { uuid, ...rayRest }, ...rest }) {
213
- const { events, refs } = this.api.get();
171
+ const { events, refs } = this.api;
214
172
  const cb = events[uuid]?.rayhit;
215
173
  if (cb)
216
174
  cb({ body: body ? refs[body] : null, ray: { uuid, ...rayRest }, ...rest });
217
175
  }
218
- beforeRender() {
219
- let timeSinceLastCalled = 0;
220
- injectBeforeRender(({ delta }) => {
221
- const [{ isPaused, maxSubSteps, stepSize }, worker] = [this.inputs.get(), this.worker()];
222
- if (isPaused || !worker)
223
- return;
224
- timeSinceLastCalled += delta;
225
- worker.step({ maxSubSteps, stepSize: stepSize, timeSinceLastCalled });
226
- timeSinceLastCalled = 0;
227
- }, { injector: this.injector });
228
- }
229
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
230
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.7", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { _isPaused: ["isPaused", "_isPaused"], _maxSubSteps: ["maxSubSteps", "_maxSubSteps"], _shouldInvalidate: ["shouldInvalidate", "_shouldInvalidate"], _stepSize: ["stepSize", "_stepSize"], _size: ["size", "_size"], _allowSleep: ["allowSleep", "_allowSleep"], _axisIndex: ["axisIndex", "_axisIndex"], _broadphase: ["broadphase", "_broadphase"], _defaultContactMaterial: ["defaultContactMaterial", "_defaultContactMaterial"], _frictionGravity: ["frictionGravity", "_frictionGravity"], _gravity: ["gravity", "_gravity"], _iterations: ["iterations", "_iterations"], _quatNormalizeFast: ["quatNormalizeFast", "_quatNormalizeFast"], _quatNormalizeSkip: ["quatNormalizeSkip", "_quatNormalizeSkip"], _solver: ["solver", "_solver"], _tolerance: ["tolerance", "_tolerance"] }, providers: [provideNgtcPhysicsApi()], ngImport: i0, template: `<ng-content />`, isInline: true }); }
176
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
177
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.0", type: NgtcPhysics, isStandalone: true, selector: "ngtc-physics", inputs: { options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: `
178
+ <ng-content />
179
+ `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
231
180
  }
232
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.7", ngImport: i0, type: NgtcPhysics, decorators: [{
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: NgtcPhysics, decorators: [{
233
182
  type: Component,
234
183
  args: [{
235
184
  selector: 'ngtc-physics',
236
185
  standalone: true,
237
- template: `<ng-content />`,
238
- providers: [provideNgtcPhysicsApi()],
186
+ template: `
187
+ <ng-content />
188
+ `,
189
+ changeDetection: ChangeDetectionStrategy.OnPush,
239
190
  }]
240
- }], propDecorators: { _isPaused: [{
241
- type: Input,
242
- args: [{ alias: 'isPaused' }]
243
- }], _maxSubSteps: [{
244
- type: Input,
245
- args: [{ alias: 'maxSubSteps' }]
246
- }], _shouldInvalidate: [{
247
- type: Input,
248
- args: [{ alias: 'shouldInvalidate' }]
249
- }], _stepSize: [{
250
- type: Input,
251
- args: [{ alias: 'stepSize' }]
252
- }], _size: [{
253
- type: Input,
254
- args: [{ alias: 'size' }]
255
- }], _allowSleep: [{
256
- type: Input,
257
- args: [{ alias: 'allowSleep' }]
258
- }], _axisIndex: [{
259
- type: Input,
260
- args: [{ alias: 'axisIndex' }]
261
- }], _broadphase: [{
262
- type: Input,
263
- args: [{ alias: 'broadphase' }]
264
- }], _defaultContactMaterial: [{
265
- type: Input,
266
- args: [{ alias: 'defaultContactMaterial' }]
267
- }], _frictionGravity: [{
268
- type: Input,
269
- args: [{ alias: 'frictionGravity' }]
270
- }], _gravity: [{
271
- type: Input,
272
- args: [{ alias: 'gravity' }]
273
- }], _iterations: [{
274
- type: Input,
275
- args: [{ alias: 'iterations' }]
276
- }], _quatNormalizeFast: [{
277
- type: Input,
278
- args: [{ alias: 'quatNormalizeFast' }]
279
- }], _quatNormalizeSkip: [{
280
- type: Input,
281
- args: [{ alias: 'quatNormalizeSkip' }]
282
- }], _solver: [{
283
- type: Input,
284
- args: [{ alias: 'solver' }]
285
- }], _tolerance: [{
286
- type: Input,
287
- args: [{ alias: 'tolerance' }]
288
- }] } });
289
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBZSxNQUFNLGVBQWUsQ0FBQztBQUN2SCxPQUFPLEVBQ04sZUFBZSxHQWlCZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxrQkFBa0IsRUFBRSxjQUFjLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDOztBQUUvQixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUM5QixNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztBQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUU5QixTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBdUIsRUFBRSxXQUF5QixFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsTUFBdUI7SUFDbkgsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFO1FBQ3hCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN6RixJ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b25lLCBlZmZlY3QsIGZvcndhcmRSZWYsIGluamVjdCwgdW50cmFja2VkLCB0eXBlIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHR0eXBlIEJyb2FkcGhhc2UsXG5cdHR5cGUgQ2Fubm9uV29ya2VyUHJvcHMsXG5cdHR5cGUgQ29sbGlkZUJlZ2luRXZlbnQsXG5cdHR5cGUgQ29sbGlkZUVuZEV2ZW50LFxuXHR0eXBlIENvbGxpZGVFdmVudCxcblx0dHlwZSBDb250YWN0TWF0ZXJpYWxPcHRpb25zLFxuXHR0eXBlIFJheWhpdEV2ZW50LFxuXHR0eXBlIFJlZnMsXG5cdHR5cGUgU29sdmVyLFxuXHR0eXBlIFN1YnNjcmlwdGlvbnMsXG5cdHR5cGUgVHJpcGxldCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudCxcblx0dHlwZSBXb3JrZXJDb2xsaWRlRW5kRXZlbnQsXG5cdHR5cGUgV29ya2VyQ29sbGlkZUV2ZW50LFxuXHR0eXBlIFdvcmtlckZyYW1lTWVzc2FnZSxcblx0dHlwZSBXb3JrZXJSYXloaXRFdmVudCxcbn0gZnJvbSAnQHBtbmRycy9jYW5ub24td29ya2VyLWFwaSc7XG5pbXBvcnQgeyBjcmVhdGVJbmplY3Rpb25Ub2tlbiwgaW5qZWN0QmVmb3JlUmVuZGVyLCBpbmplY3ROZ3RTdG9yZSwgc2lnbmFsU3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCAqIGFzIFRIUkVFIGZyb20gJ3RocmVlJztcblxuY29uc3QgdiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5jb25zdCBzID0gbmV3IFRIUkVFLlZlY3RvcjMoMSwgMSwgMSk7XG5jb25zdCBxID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKTtcbmNvbnN0IG0gPSBuZXcgVEhSRUUuTWF0cml4NCgpO1xuXG5mdW5jdGlvbiBhcHBseShpbmRleDogbnVtYmVyLCBwb3NpdGlvbnM6IEZsb2F0MzJBcnJheSwgcXVhdGVybmlvbnM6IEZsb2F0MzJBcnJheSwgc2NhbGUgPSBzLCBvYmplY3Q/OiBUSFJFRS5PYmplY3QzRCkge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zLCBpbmRleCAqIDQpLCBzY2FsZSk7XG5cdFx0aWYgKG9iamVjdCkge1xuXHRcdFx0b2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTtcblx0XHRcdG9iamVjdC5tYXRyaXguY29weShtKTtcblx0XHR9XG5cdFx0cmV0dXJuIG07XG5cdH1cblx0cmV0dXJuIG0uaWRlbnRpdHkoKTtcbn1cblxuY29uc3QgdW5pcXVlID0gKCkgPT4ge1xuXHRjb25zdCB2YWx1ZXM6IHVua25vd25bXSA9IFtdO1xuXHRyZXR1cm4gKHZhbHVlOiB1bmtub3duKSA9PiAodmFsdWVzLmluY2x1ZGVzKHZhbHVlKSA/IGZhbHNlIDogISF2YWx1ZXMucHVzaCh2YWx1ZSkpO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y1BoeXNpY3NTdGF0ZSA9IENhbm5vbldvcmtlclByb3BzICYge1xuXHRpc1BhdXNlZD86IGJvb2xlYW47XG5cdG1heFN1YlN0ZXBzPzogbnVtYmVyO1xuXHRzaG91bGRJbnZhbGlkYXRlPzogYm9vbGVhbjtcblx0c3RlcFNpemU/OiBudW1iZXI7XG59O1xuXG50eXBlIE5ndGNDYW5ub25FdmVudCA9IENvbGxpZGVCZWdpbkV2ZW50IHwgQ29sbGlkZUVuZEV2ZW50IHwgQ29sbGlkZUV2ZW50IHwgUmF5aGl0RXZlbnQ7XG50eXBlIE5ndGNDYWxsYmFja0J5VHlwZTxUIGV4dGVuZHMgeyB0eXBlOiBzdHJpbmcgfT4gPSB7XG5cdFtLIGluIFRbJ3R5cGUnXV0/OiBUIGV4dGVuZHMgeyB0eXBlOiBLIH0gPyAoZTogVCkgPT4gdm9pZCA6IG5ldmVyO1xufTtcblxuZXhwb3J0IHR5cGUgTmd0Y0Nhbm5vbkV2ZW50cyA9IHsgW3V1aWQ6IHN0cmluZ106IFBhcnRpYWw8Tmd0Y0NhbGxiYWNrQnlUeXBlPE5ndGNDYW5ub25FdmVudD4+IH07XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0geyBbdXVpZDogc3RyaW5nXTogVEhSRUUuVmVjdG9yMyB9O1xuXG5leHBvcnQgdHlwZSBOZ3RjUGh5c2ljc0FwaSA9IHtcblx0Ym9kaWVzOiB7IFt1dWlkOiBzdHJpbmddOiBudW1iZXIgfTtcblx0ZXZlbnRzOiBOZ3RjQ2Fubm9uRXZlbnRzO1xuXHRyZWZzOiBSZWZzO1xuXHRzY2FsZU92ZXJyaWRlczogU2NhbGVPdmVycmlkZXM7XG5cdHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbnM7XG5cdHdvcmtlcjogQ2Fubm9uV29ya2VyQVBJO1xufTtcblxuZXhwb3J0IGNvbnN0IFtpbmplY3ROZ3RjUGh5c2ljc0FwaSwgcHJvdmlkZU5ndGNQaHlzaWNzQXBpXSA9IGNyZWF0ZUluamVjdGlvblRva2VuKFxuXHQocGh5c2ljczogTmd0Y1BoeXNpY3MpID0+IHBoeXNpY3MuYXBpLFxuXHR7IGlzUm9vdDogZmFsc2UsIGRlcHM6IFtmb3J3YXJkUmVmKCgpID0+IE5ndGNQaHlzaWNzKV0gfSxcbik7XG5cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogJ25ndGMtcGh5c2ljcycsXG5cdHN0YW5kYWxvbmU6IHRydWUsXG5cdHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQgLz5gLFxuXHRwcm92aWRlcnM6IFtwcm92aWRlTmd0Y1BoeXNpY3NBcGkoKV0sXG59KVxuZXhwb3J0IGNsYXNzIE5ndGNQaHlzaWNzIGltcGxlbWVudHMgT25Jbml0IHtcblx0cHJpdmF0ZSBpbnB1dHMgPSBzaWduYWxTdG9yZTxOZ3RjUGh5c2ljc1N0YXRlPih7XG5cdFx0YWxsb3dTbGVlcDogZmFsc2UsXG5cdFx0YXhpc0luZGV4OiAwLFxuXHRcdGJyb2FkcGhhc2U6ICdOYWl2ZScsXG5cdFx0ZGVmYXVsdENvbnRhY3RNYXRlcmlhbDogeyBjb250YWN0RXF1YXRpb25TdGlmZm5lc3M6IDFlNiB9LFxuXHRcdGZyaWN0aW9uR3Jhdml0eTogbnVsbCxcblx0XHRncmF2aXR5OiBbMCwgLTkuODEsIDBdLFxuXHRcdGlzUGF1c2VkOiBmYWxzZSxcblx0XHRpdGVyYXRpb25zOiA1LFxuXHRcdG1heFN1YlN0ZXBzOiAxMCxcblx0XHRxdWF0Tm9ybWFsaXplRmFzdDogZmFsc2UsXG5cdFx0cXVhdE5vcm1hbGl6ZVNraXA6IDAsXG5cdFx0c2hvdWxkSW52YWxpZGF0ZTogdHJ1ZSxcblx0XHRzaXplOiAxMDAwLFxuXHRcdHNvbHZlcjogJ0dTJyxcblx0XHRzdGVwU2l6ZTogMSAvIDYwLFxuXHRcdHRvbGVyYW5jZTogMC4wMDEsXG5cdH0pO1xuXG5cdEBJbnB1dCh7IGFsaWFzOiAnaXNQYXVzZWQnIH0pIHNldCBfaXNQYXVzZWQoaXNQYXVzZWQ6IGJvb2xlYW4pIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBpc1BhdXNlZCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnbWF4U3ViU3RlcHMnIH0pIHNldCBfbWF4U3ViU3RlcHMobWF4U3ViU3RlcHM6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IG1heFN1YlN0ZXBzIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdzaG91bGRJbnZhbGlkYXRlJyB9KSBzZXQgX3Nob3VsZEludmFsaWRhdGUoc2hvdWxkSW52YWxpZGF0ZTogYm9vbGVhbikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHNob3VsZEludmFsaWRhdGUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3N0ZXBTaXplJyB9KSBzZXQgX3N0ZXBTaXplKHN0ZXBTaXplOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzdGVwU2l6ZSB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnc2l6ZScgfSkgc2V0IF9zaXplKHNpemU6IG51bWJlcikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHNpemUgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2FsbG93U2xlZXAnIH0pIHNldCBfYWxsb3dTbGVlcChhbGxvd1NsZWVwOiBib29sZWFuKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgYWxsb3dTbGVlcCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnYXhpc0luZGV4JyB9KSBzZXQgX2F4aXNJbmRleChheGlzSW5kZXg6IDAgfCAxIHwgMikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGF4aXNJbmRleCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnYnJvYWRwaGFzZScgfSkgc2V0IF9icm9hZHBoYXNlKGJyb2FkcGhhc2U6IEJyb2FkcGhhc2UpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBicm9hZHBoYXNlIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdkZWZhdWx0Q29udGFjdE1hdGVyaWFsJyB9KSBzZXQgX2RlZmF1bHRDb250YWN0TWF0ZXJpYWwoXG5cdFx0ZGVmYXVsdENvbnRhY3RNYXRlcmlhbDogQ29udGFjdE1hdGVyaWFsT3B0aW9ucyxcblx0KSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZGVmYXVsdENvbnRhY3RNYXRlcmlhbCB9KTtcblx0fVxuXG5cdEBJbnB1dCh7IGFsaWFzOiAnZnJpY3Rpb25HcmF2aXR5JyB9KSBzZXQgX2ZyaWN0aW9uR3Jhdml0eShmcmljdGlvbkdyYXZpdHk6IFRyaXBsZXQgfCBudWxsKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgZnJpY3Rpb25HcmF2aXR5IH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdncmF2aXR5JyB9KSBzZXQgX2dyYXZpdHkoZ3Jhdml0eTogVHJpcGxldCkge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IGdyYXZpdHkgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ2l0ZXJhdGlvbnMnIH0pIHNldCBfaXRlcmF0aW9ucyhpdGVyYXRpb25zOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBpdGVyYXRpb25zIH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdxdWF0Tm9ybWFsaXplRmFzdCcgfSkgc2V0IF9xdWF0Tm9ybWFsaXplRmFzdChxdWF0Tm9ybWFsaXplRmFzdDogYm9vbGVhbikge1xuXHRcdHRoaXMuaW5wdXRzLnNldCh7IHF1YXROb3JtYWxpemVGYXN0IH0pO1xuXHR9XG5cblx0QElucHV0KHsgYWxpYXM6ICdxdWF0Tm9ybWFsaXplU2tpcCcgfSkgc2V0IF9xdWF0Tm9ybWFsaXplU2tpcChxdWF0Tm9ybWFsaXplU2tpcDogbnVtYmVyKSB7XG5cdFx0dGhpcy5pbnB1dHMuc2V0KHsgcXVhdE5vcm1hbGl6ZVNraXAgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3NvbHZlcicgfSkgc2V0IF9zb2x2ZXIoc29sdmVyOiBTb2x2ZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyBzb2x2ZXIgfSk7XG5cdH1cblxuXHRASW5wdXQoeyBhbGlhczogJ3RvbGVyYW5jZScgfSkgc2V0IF90b2xlcmFuY2UodG9sZXJhbmNlOiBudW1iZXIpIHtcblx0XHR0aGlzLmlucHV0cy5zZXQoeyB0b2xlcmFuY2UgfSk7XG5cdH1cblxuXHRwcml2YXRlIHpvbmUgPSBpbmplY3QoTmdab25lKTtcblx0cHJpdmF0ZSBpbmplY3RvciA9IGluamVjdChJbmplY3Rvcik7XG5cblx0cHJpdmF0ZSBzdG9yZSA9IGluamVjdE5ndFN0b3JlKCk7XG5cdHByaXZhdGUgaW52YWxpZGF0ZSA9IHRoaXMuc3RvcmUuc2VsZWN0KCdpbnZhbGlkYXRlJyk7XG5cblx0YXBpID0gc2lnbmFsU3RvcmU8Tmd0Y1BoeXNpY3NBcGk+KHtcblx0XHRib2RpZXM6IHt9LFxuXHRcdGV2ZW50czoge30sXG5cdFx0cmVmczoge30sXG5cdFx0c2NhbGVPdmVycmlkZXM6IHt9LFxuXHRcdHN1YnNjcmlwdGlvbnM6IHt9LFxuXHRcdHdvcmtlcjogbnVsbCEsXG5cdH0pO1xuXG5cdHByaXZhdGUgd29ya2VyID0gdGhpcy5hcGkuc2VsZWN0KCd3b3JrZXInKTtcblxuXHRuZ09uSW5pdCgpIHtcblx0XHR0aGlzLnpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuXHRcdFx0dGhpcy5hcGkuc2V0KHsgd29ya2VyOiBuZXcgQ2Fubm9uV29ya2VyQVBJKHRoaXMuaW5wdXRzLnN0YXRlKCkpIH0pO1xuXHRcdFx0dGhpcy5jb25uZWN0V29ya2VyKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdheGlzSW5kZXgnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2Jyb2FkcGhhc2UnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2dyYXZpdHknKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2l0ZXJhdGlvbnMnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ3RvbGVyYW5jZScpO1xuXHRcdFx0dGhpcy5iZWZvcmVSZW5kZXIoKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgY29ubmVjdFdvcmtlcigpIHtcblx0XHRlZmZlY3QoXG5cdFx0XHQob25DbGVhbnVwKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCk7XG5cdFx0XHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHRcdFx0d29ya2VyLmNvbm5lY3QoKTtcblx0XHRcdFx0d29ya2VyLmluaXQoKTtcblxuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ2NvbGxpZGVCZWdpbicsIHRoaXMuY29sbGlkZUJlZ2luSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdjb2xsaWRlRW5kJywgdGhpcy5jb2xsaWRlRW5kSGFuZGxlci5iaW5kKHRoaXMpKTtcblx0XHRcdFx0KHdvcmtlciBhcyBhbnkpLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0XHQod29ya2VyIGFzIGFueSkub24oJ3JheWhpdCcsIHRoaXMucmF5aGl0SGFuZGxlci5iaW5kKHRoaXMpKTtcblxuXHRcdFx0XHRvbkNsZWFudXAoKCkgPT4ge1xuXHRcdFx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdFx0XHQod29ya2VyIGFzIGFueSkucmVtb3ZlQWxsTGlzdGVuZXJzKCk7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSxcblx0XHRcdHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSB1cGRhdGVXb3JrZXJTdGF0ZShrZXk6IGtleW9mIE5ndGNQaHlzaWNzU3RhdGUpIHtcblx0XHRjb25zdCBjb21wdXRlID0gdGhpcy5pbnB1dHMuc2VsZWN0KGtleSk7XG5cdFx0ZWZmZWN0KFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRjb25zdCBbd29ya2VyLCB2YWx1ZV0gPSBbdW50cmFja2VkKHRoaXMud29ya2VyKSwgY29tcHV0ZSgpXTtcblx0XHRcdFx0Ly8gQHRzLWV4cGVjdC1lcnJvclxuXHRcdFx0XHR3b3JrZXJba2V5XSA9IHZhbHVlO1xuXHRcdFx0fSxcblx0XHRcdHsgaW5qZWN0b3I6IHRoaXMuaW5qZWN0b3IgfSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBjb2xsaWRlSGFuZGxlcih7IGJvZHksIGNvbnRhY3Q6IHsgYmksIGJqLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQsIC4uLnJlc3QgfTogV29ya2VyQ29sbGlkZUV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGkuZ2V0KCk7XG5cdFx0Y29uc3QgY2IgPSBldmVudHNbdGFyZ2V0XT8uY29sbGlkZTtcblxuXHRcdGlmIChjYikge1xuXHRcdFx0Y2Ioe1xuXHRcdFx0XHRib2R5OiByZWZzW2JvZHldLFxuXHRcdFx0XHRjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LFxuXHRcdFx0XHR0YXJnZXQ6IHJlZnNbdGFyZ2V0XSxcblx0XHRcdFx0Li4ucmVzdCxcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUJlZ2luSGFuZGxlcih7IGJvZHlBLCBib2R5QiB9OiBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudFsnZGF0YSddKSB7XG5cdFx0Y29uc3QgeyBldmVudHMsIHJlZnMgfSA9IHRoaXMuYXBpLmdldCgpO1xuXHRcdGNvbnN0IGNiQSA9IGV2ZW50c1tib2R5QV0/LmNvbGxpZGVCZWdpbjtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlQmVnaW4nIH0pO1xuXHRcdGNvbnN0IGNiQiA9IGV2ZW50c1tib2R5Ql0/LmNvbGxpZGVCZWdpbjtcblx0XHRpZiAoY2JCKSBjYkIoeyBib2R5OiByZWZzW2JvZHlBXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5Ql0sIHR5cGU6ICdjb2xsaWRlQmVnaW4nIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBjb2xsaWRlRW5kSGFuZGxlcih7IGJvZHlBLCBib2R5QiB9OiBXb3JrZXJDb2xsaWRlRW5kRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaS5nZXQoKTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkEpIGNiQSh7IGJvZHk6IHJlZnNbYm9keUJdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlBXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHRcdGNvbnN0IGNiQiA9IGV2ZW50c1tib2R5Ql0/LmNvbGxpZGVFbmQ7XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUVuZCcgfSk7XG5cdH1cblxuXHRwcml2YXRlIGZyYW1lSGFuZGxlcih7XG5cdFx0YWN0aXZlLFxuXHRcdGJvZGllczogdXVpZHMgPSBbXSxcblx0XHRvYnNlcnZhdGlvbnMsXG5cdFx0cG9zaXRpb25zLFxuXHRcdHF1YXRlcm5pb25zLFxuXHR9OiBXb3JrZXJGcmFtZU1lc3NhZ2VbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IFt7IHNob3VsZEludmFsaWRhdGUgfSwgeyBib2RpZXMsIHN1YnNjcmlwdGlvbnMsIHJlZnMsIHNjYWxlT3ZlcnJpZGVzIH0sIGludmFsaWRhdGVdID0gW1xuXHRcdFx0dGhpcy5pbnB1dHMuZ2V0KCksXG5cdFx0XHR0aGlzLmFwaS5nZXQoKSxcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgpLFxuXHRcdF07XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHV1aWRzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRib2RpZXNbdXVpZHNbaV1dID0gaTtcblx0XHR9XG5cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBIRUxQOiBXZSBjbGVhcmx5IGtub3cgdGhlIHR5cGUgb2YgdGhlIGNhbGxiYWNrLCBidXQgdHlwZXNjcmlwdCBjYW4ndCBkZWFsIHdpdGggaXRcblx0XHRcdGNiICYmIGNiKHZhbHVlIGFzIG5ldmVyKTtcblx0XHR9KTtcblxuXHRcdGlmICghYWN0aXZlKSByZXR1cm47XG5cblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBUSFJFRS5JbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaS5nZXQoKTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cblxuXHRwcml2YXRlIGJlZm9yZVJlbmRlcigpIHtcblx0XHRsZXQgdGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0aW5qZWN0QmVmb3JlUmVuZGVyKFxuXHRcdFx0KHsgZGVsdGEgfSkgPT4ge1xuXHRcdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5pbnB1dHMuZ2V0KCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0XHRpZiAoaXNQYXVzZWQgfHwgIXdvcmtlcikgcmV0dXJuO1xuXHRcdFx0XHR0aW1lU2luY2VMYXN0Q2FsbGVkICs9IGRlbHRhO1xuXHRcdFx0XHR3b3JrZXIuc3RlcCh7IG1heFN1YlN0ZXBzLCBzdGVwU2l6ZTogc3RlcFNpemUhLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0XHR0aW1lU2luY2VMYXN0Q2FsbGVkID0gMDtcblx0XHRcdH0sXG5cdFx0XHR7IGluamVjdG9yOiB0aGlzLmluamVjdG9yIH0sXG5cdFx0KTtcblx0fVxufVxuIl19
191
+ }], ctorParameters: () => [] });
192
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGh5c2ljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvY2Fubm9uL3NyYy9saWIvcGh5c2ljcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxVQUFVLEVBR1YsZUFBZSxFQUNmLFFBQVEsRUFDUixNQUFNLEVBQ04sS0FBSyxFQUNMLE1BQU0sRUFDTixTQUFTLEdBQ1QsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNOLGVBQWUsR0FhZixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFZLFVBQVUsRUFBbUIsT0FBTyxFQUFFLE1BQU0sT0FBTyxDQUFDOztBQWUvRixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBQ3hCLE1BQU0sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsTUFBTSxDQUFDLEdBQUcsSUFBSSxVQUFVLEVBQUUsQ0FBQztBQUMzQixNQUFNLENBQUMsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0FBRXhCLFNBQVMsS0FBSyxDQUNiLEtBQWEsRUFDYixTQUE0QixFQUM1QixXQUE4QixFQUM5QixLQUFLLEdBQUcsQ0FBQyxFQUNULE1BQWlCO0lBRWpCLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQyxF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LEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNwRCxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM3RCxDQUFDO1FBQ0YsQ0FBQztRQUNELElBQUksZ0JBQWdCO1lBQUUsVUFBVSxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVPLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRSxJQUFJLEVBQUUsR0FBRyxPQUFPLEVBQUUsRUFBRSxHQUFHLElBQUksRUFBNkI7UUFDNUYsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQ2xDLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7UUFDaEMsSUFBSSxFQUFFO1lBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BGLENBQUM7OEdBakpXLFdBQVc7a0dBQVgsV0FBVyxrTkFMYjs7RUFFVDs7MkZBR1csV0FBVztrQkFSdkIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsY0FBYztvQkFDeEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLFFBQVEsRUFBRTs7RUFFVDtvQkFDRCxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDL0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcblx0Q29tcG9uZW50LFxuXHREZXN0cm95UmVmLFxuXHRFbWJlZGRlZFZpZXdSZWYsXG5cdFNpZ25hbCxcblx0YWZ0ZXJOZXh0UmVuZGVyLFxuXHRjb21wdXRlZCxcblx0aW5qZWN0LFxuXHRpbnB1dCxcblx0c2lnbmFsLFxuXHR1bnRyYWNrZWQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcblx0Q2Fubm9uV29ya2VyQVBJLFxuXHRDYW5ub25Xb3JrZXJQcm9wcyxcblx0Q29sbGlkZUJlZ2luRXZlbnQsXG5cdENvbGxpZGVFbmRFdmVudCxcblx0Q29sbGlkZUV2ZW50LFxuXHRSYXloaXRFdmVudCxcblx0UmVmcyxcblx0U3Vic2NyaXB0aW9ucyxcblx0V29ya2VyQ29sbGlkZUJlZ2luRXZlbnQsXG5cdFdvcmtlckNvbGxpZGVFbmRFdmVudCxcblx0V29ya2VyQ29sbGlkZUV2ZW50LFxuXHRXb3JrZXJGcmFtZU1lc3NhZ2UsXG5cdFdvcmtlclJheWhpdEV2ZW50LFxufSBmcm9tICdAcG1uZHJzL2Nhbm5vbi13b3JrZXItYXBpJztcbmltcG9ydCB7IGluamVjdEJlZm9yZVJlbmRlciwgaW5qZWN0U3RvcmUgfSBmcm9tICdhbmd1bGFyLXRocmVlJztcbmltcG9ydCB7IGluamVjdEF1dG9FZmZlY3QgfSBmcm9tICduZ3h0ZW5zaW9uL2F1dG8tZWZmZWN0JztcbmltcG9ydCB7IG1lcmdlSW5wdXRzIH0gZnJvbSAnbmd4dGVuc2lvbi9pbmplY3QtaW5wdXRzJztcbmltcG9ydCB7IEluc3RhbmNlZE1lc2gsIE1hdHJpeDQsIE9iamVjdDNELCBRdWF0ZXJuaW9uLCBRdWF0ZXJuaW9uVHVwbGUsIFZlY3RvcjMgfSBmcm9tICd0aHJlZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y0Nhbm5vbldvcmtlckV2ZW50cyB7XG5cdGNvbGxpZGU6IFdvcmtlckNvbGxpZGVFdmVudDtcblx0Y29sbGlkZUJlZ2luOiBXb3JrZXJDb2xsaWRlQmVnaW5FdmVudDtcblx0Y29sbGlkZUVuZDogV29ya2VyQ29sbGlkZUVuZEV2ZW50O1xuXHRmcmFtZTogV29ya2VyRnJhbWVNZXNzYWdlO1xuXHRyYXloaXQ6IFdvcmtlclJheWhpdEV2ZW50O1xufVxuXG5leHBvcnQgdHlwZSBOZ3RjQ2Fubm9uV29ya2VyID0gQ2Fubm9uV29ya2VyQVBJICYge1xuXHRvbjogPEsgZXh0ZW5kcyBrZXlvZiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzPihldmVudDogSywgY2I6IChkYXRhOiBOZ3RjQ2Fubm9uV29ya2VyRXZlbnRzW0tdWydkYXRhJ10pID0+IHZvaWQpID0+IHZvaWQ7XG5cdHJlbW92ZUFsbExpc3RlbmVyczogKCkgPT4gdm9pZDtcbn07XG5cbmNvbnN0IHYgPSBuZXcgVmVjdG9yMygpO1xuY29uc3QgcyA9IG5ldyBWZWN0b3IzKDEsIDEsIDEpO1xuY29uc3QgcSA9IG5ldyBRdWF0ZXJuaW9uKCk7XG5jb25zdCBtID0gbmV3IE1hdHJpeDQoKTtcblxuZnVuY3Rpb24gYXBwbHkoXG5cdGluZGV4OiBudW1iZXIsXG5cdHBvc2l0aW9uczogQXJyYXlMaWtlPG51bWJlcj4sXG5cdHF1YXRlcm5pb25zOiBBcnJheUxpa2U8bnVtYmVyPixcblx0c2NhbGUgPSBzLFxuXHRvYmplY3Q/OiBPYmplY3QzRCxcbikge1xuXHRpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuXHRcdG0uY29tcG9zZSh2LmZyb21BcnJheShwb3NpdGlvbnMsIGluZGV4ICogMyksIHEuZnJvbUFycmF5KHF1YXRlcm5pb25zIGFzIFF1YXRlcm5pb25UdXBsZSwgaW5kZXggKiA0KSwgc2NhbGUpO1xuXHRcdGlmIChvYmplY3QpIHtcblx0XHRcdG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7XG5cdFx0XHRvYmplY3QubWF0cml4LmNvcHkobSk7XG5cdFx0fVxuXHRcdHJldHVybiBtO1xuXHR9XG5cdHJldHVybiBtLmlkZW50aXR5KCk7XG59XG5cbmZ1bmN0aW9uIHVuaXF1ZSgpIHtcblx0Y29uc3QgdmFsdWVzOiB1bmtub3duW10gPSBbXTtcblx0cmV0dXJuICh2YWx1ZTogdW5rbm93bikgPT4gKHZhbHVlcy5pbmNsdWRlcyh2YWx1ZSkgPyBmYWxzZSA6ICEhdmFsdWVzLnB1c2godmFsdWUpKTtcbn1cblxudHlwZSBOZ3RjQ2Fubm9uRXZlbnQgPSBDb2xsaWRlQmVnaW5FdmVudCB8IENvbGxpZGVFbmRFdmVudCB8IENvbGxpZGVFdmVudCB8IFJheWhpdEV2ZW50O1xudHlwZSBOZ3RjQ2FsbGJhY2tCeVR5cGU8VCBleHRlbmRzIHsgdHlwZTogc3RyaW5nIH0+ID0ge1xuXHRbSyBpbiBUWyd0eXBlJ11dPzogVCBleHRlbmRzIHsgdHlwZTogSyB9ID8gKGU6IFQpID0+IHZvaWQgOiBuZXZlcjtcbn07XG5cbmV4cG9ydCB0eXBlIE5ndGNDYW5ub25FdmVudHMgPSBSZWNvcmQ8c3RyaW5nLCBQYXJ0aWFsPE5ndGNDYWxsYmFja0J5VHlwZTxOZ3RjQ2Fubm9uRXZlbnQ+Pj47XG5cbmV4cG9ydCB0eXBlIFNjYWxlT3ZlcnJpZGVzID0gUmVjb3JkPHN0cmluZywgVmVjdG9yMz47XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmd0Y1BoeXNpY3NJbnB1dHMgZXh0ZW5kcyBDYW5ub25Xb3JrZXJQcm9wcyB7XG5cdGlzUGF1c2VkPzogYm9vbGVhbjtcblx0bWF4U3ViU3RlcHM/OiBudW1iZXI7XG5cdHNob3VsZEludmFsaWRhdGU/OiBib29sZWFuO1xuXHRzdGVwU2l6ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOZ3RjUGh5c2ljc0FwaSB7XG5cdGJvZGllczogeyBbdXVpZDogc3RyaW5nXTogbnVtYmVyIH07XG5cdGV2ZW50czogTmd0Y0Nhbm5vbkV2ZW50cztcblx0cmVmczogUmVmcztcblx0c2NhbGVPdmVycmlkZXM6IFNjYWxlT3ZlcnJpZGVzO1xuXHRzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25zO1xuXHR3b3JrZXI6IFNpZ25hbDxDYW5ub25Xb3JrZXJBUEk+O1xufVxuXG5jb25zdCBkZWZhdWx0T3B0aW9uczogTmd0Y1BoeXNpY3NJbnB1dHMgPSB7XG5cdGFsbG93U2xlZXA6IGZhbHNlLFxuXHRheGlzSW5kZXg6IDAsXG5cdGJyb2FkcGhhc2U6ICdOYWl2ZScsXG5cdGRlZmF1bHRDb250YWN0TWF0ZXJpYWw6IHsgY29udGFjdEVxdWF0aW9uU3RpZmZuZXNzOiAxZTYgfSxcblx0ZnJpY3Rpb25HcmF2aXR5OiBudWxsLFxuXHRncmF2aXR5OiBbMCwgLTkuODEsIDBdLFxuXHRpc1BhdXNlZDogZmFsc2UsXG5cdGl0ZXJhdGlvbnM6IDUsXG5cdG1heFN1YlN0ZXBzOiAxMCxcblx0cXVhdE5vcm1hbGl6ZUZhc3Q6IGZhbHNlLFxuXHRxdWF0Tm9ybWFsaXplU2tpcDogMCxcblx0c2hvdWxkSW52YWxpZGF0ZTogdHJ1ZSxcblx0c2l6ZTogMTAwMCxcblx0c29sdmVyOiAnR1MnLFxuXHRzdGVwU2l6ZTogMSAvIDYwLFxuXHR0b2xlcmFuY2U6IDAuMDAxLFxufTtcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmd0Yy1waHlzaWNzJyxcblx0c3RhbmRhbG9uZTogdHJ1ZSxcblx0dGVtcGxhdGU6IGBcblx0XHQ8bmctY29udGVudCAvPlxuXHRgLFxuXHRjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgTmd0Y1BoeXNpY3Mge1xuXHRwcml2YXRlIGF1dG9FZmZlY3QgPSBpbmplY3RBdXRvRWZmZWN0KCk7XG5cdHByaXZhdGUgc3RvcmUgPSBpbmplY3RTdG9yZSgpO1xuXG5cdG9wdGlvbnMgPSBpbnB1dChkZWZhdWx0T3B0aW9ucywgeyB0cmFuc2Zvcm06IG1lcmdlSW5wdXRzKGRlZmF1bHRPcHRpb25zKSB9KTtcblxuXHRwcml2YXRlIGludmFsaWRhdGUgPSB0aGlzLnN0b3JlLnNlbGVjdCgnaW52YWxpZGF0ZScpO1xuXHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gd29ya2VyIGlzIG5vdCBudWxsYWJsZSwgYW5kIHdlIGRvbid0IHdhbnQgdG8gdXNlICEgb3BlcmF0b3Jcblx0cHJpdmF0ZSB3b3JrZXIgPSBzaWduYWw8Q2Fubm9uV29ya2VyQVBJPihudWxsKTtcblxuXHRhcGk6IE5ndGNQaHlzaWNzQXBpID0ge1xuXHRcdGJvZGllczoge30sXG5cdFx0ZXZlbnRzOiB7fSxcblx0XHRyZWZzOiB7fSxcblx0XHRzY2FsZU92ZXJyaWRlczoge30sXG5cdFx0c3Vic2NyaXB0aW9uczoge30sXG5cdFx0d29ya2VyOiB0aGlzLndvcmtlci5hc1JlYWRvbmx5KCksXG5cdH07XG5cblx0cHJpdmF0ZSByZWY/OiBFbWJlZGRlZFZpZXdSZWY8eyAkaW1wbGljaXQ6IE5ndGNQaHlzaWNzQXBpIH0+O1xuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGFmdGVyTmV4dFJlbmRlcigoKSA9PiB7XG5cdFx0XHR0aGlzLndvcmtlci5zZXQobmV3IENhbm5vbldvcmtlckFQSSh0aGlzLm9wdGlvbnMoKSkpO1xuXHRcdFx0dGhpcy5jb25uZWN0V29ya2VyKCk7XG5cdFx0XHR0aGlzLnVwZGF0ZVdvcmtlclN0YXRlKCdheGlzSW5kZXgnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2Jyb2FkcGhhc2UnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2dyYXZpdHknKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ2l0ZXJhdGlvbnMnKTtcblx0XHRcdHRoaXMudXBkYXRlV29ya2VyU3RhdGUoJ3RvbGVyYW5jZScpO1xuXHRcdH0pO1xuXG5cdFx0bGV0IHRpbWVTaW5jZUxhc3RDYWxsZWQgPSAwO1xuXHRcdGluamVjdEJlZm9yZVJlbmRlcigoeyBkZWx0YSB9KSA9PiB7XG5cdFx0XHRjb25zdCBbeyBpc1BhdXNlZCwgbWF4U3ViU3RlcHMsIHN0ZXBTaXplIH0sIHdvcmtlcl0gPSBbdGhpcy5vcHRpb25zKCksIHRoaXMud29ya2VyKCldO1xuXHRcdFx0aWYgKGlzUGF1c2VkIHx8ICF3b3JrZXIgfHwgc3RlcFNpemUgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCArPSBkZWx0YTtcblx0XHRcdHdvcmtlci5zdGVwKHsgbWF4U3ViU3RlcHMsIHN0ZXBTaXplLCB0aW1lU2luY2VMYXN0Q2FsbGVkIH0pO1xuXHRcdFx0dGltZVNpbmNlTGFzdENhbGxlZCA9IDA7XG5cdFx0fSk7XG5cblx0XHRpbmplY3QoRGVzdHJveVJlZikub25EZXN0cm95KCgpID0+IHtcblx0XHRcdHRoaXMucmVmPy5kZXN0cm95KCk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbm5lY3RXb3JrZXIoKSB7XG5cdFx0dGhpcy5hdXRvRWZmZWN0KCgpID0+IHtcblx0XHRcdGNvbnN0IHdvcmtlciA9IHRoaXMud29ya2VyKCkgYXMgTmd0Y0Nhbm5vbldvcmtlcjtcblx0XHRcdGlmICghd29ya2VyKSByZXR1cm47XG5cblx0XHRcdHdvcmtlci5jb25uZWN0KCk7XG5cdFx0XHR3b3JrZXIuaW5pdCgpO1xuXG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGUnLCB0aGlzLmNvbGxpZGVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdjb2xsaWRlQmVnaW4nLCB0aGlzLmNvbGxpZGVCZWdpbkhhbmRsZXIuYmluZCh0aGlzKSk7XG5cdFx0XHR3b3JrZXIub24oJ2NvbGxpZGVFbmQnLCB0aGlzLmNvbGxpZGVFbmRIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdmcmFtZScsIHRoaXMuZnJhbWVIYW5kbGVyLmJpbmQodGhpcykpO1xuXHRcdFx0d29ya2VyLm9uKCdyYXloaXQnLCB0aGlzLnJheWhpdEhhbmRsZXIuYmluZCh0aGlzKSk7XG5cblx0XHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHRcdHdvcmtlci50ZXJtaW5hdGUoKTtcblx0XHRcdFx0d29ya2VyLnJlbW92ZUFsbExpc3RlbmVycygpO1xuXHRcdFx0fTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgdXBkYXRlV29ya2VyU3RhdGUoa2V5OiBrZXlvZiBOZ3RjUGh5c2ljc0lucHV0cykge1xuXHRcdGNvbnN0IGNvbXB1dGVkVmFsdWUgPSBjb21wdXRlZCgoKSA9PiB0aGlzLm9wdGlvbnMoKVtrZXldKTtcblxuXHRcdHRoaXMuYXV0b0VmZmVjdCgoKSA9PiB7XG5cdFx0XHRjb25zdCBbd29ya2VyLCB2YWx1ZV0gPSBbdW50cmFja2VkKHRoaXMud29ya2VyKSwgY29tcHV0ZWRWYWx1ZSgpXTtcblx0XHRcdC8vIEB0cy1leHBlY3QtZXJyb3IgLSB3ZSBrbm93IGtleSBpcyBhIHZhbGlkIGtleSBvZiBDYW5ub25Xb3JrZXJBUElcblx0XHRcdHdvcmtlcltrZXldID0gdmFsdWU7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVIYW5kbGVyKHsgYm9keSwgY29udGFjdDogeyBiaSwgYmosIC4uLmNvbnRhY3RSZXN0IH0sIHRhcmdldCwgLi4ucmVzdCB9OiBXb3JrZXJDb2xsaWRlRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t0YXJnZXRdPy5jb2xsaWRlO1xuXHRcdGlmIChjYikge1xuXHRcdFx0Y2IoeyBib2R5OiByZWZzW2JvZHldLCBjb250YWN0OiB7IGJpOiByZWZzW2JpXSwgYmo6IHJlZnNbYmpdLCAuLi5jb250YWN0UmVzdCB9LCB0YXJnZXQ6IHJlZnNbdGFyZ2V0XSwgLi4ucmVzdCB9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGNvbGxpZGVCZWdpbkhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUJlZ2luRXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYkEgPSBldmVudHNbYm9keUFdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQSkgY2JBKHsgYm9keTogcmVmc1tib2R5Ql0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUFdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlQmVnaW47XG5cdFx0aWYgKGNiQikgY2JCKHsgYm9keTogcmVmc1tib2R5QV0sIG9wOiAnZXZlbnQnLCB0YXJnZXQ6IHJlZnNbYm9keUJdLCB0eXBlOiAnY29sbGlkZUJlZ2luJyB9KTtcblx0fVxuXG5cdHByaXZhdGUgY29sbGlkZUVuZEhhbmRsZXIoeyBib2R5QSwgYm9keUIgfTogV29ya2VyQ29sbGlkZUVuZEV2ZW50WydkYXRhJ10pIHtcblx0XHRjb25zdCB7IGV2ZW50cywgcmVmcyB9ID0gdGhpcy5hcGk7XG5cdFx0Y29uc3QgY2JBID0gZXZlbnRzW2JvZHlBXT8uY29sbGlkZUVuZDtcblx0XHRpZiAoY2JBKSBjYkEoeyBib2R5OiByZWZzW2JvZHlCXSwgb3A6ICdldmVudCcsIHRhcmdldDogcmVmc1tib2R5QV0sIHR5cGU6ICdjb2xsaWRlRW5kJyB9KTtcblx0XHRjb25zdCBjYkIgPSBldmVudHNbYm9keUJdPy5jb2xsaWRlRW5kO1xuXHRcdGlmIChjYkIpIGNiQih7IGJvZHk6IHJlZnNbYm9keUFdLCBvcDogJ2V2ZW50JywgdGFyZ2V0OiByZWZzW2JvZHlCXSwgdHlwZTogJ2NvbGxpZGVFbmQnIH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBmcmFtZUhhbmRsZXIoe1xuXHRcdGFjdGl2ZSxcblx0XHRib2RpZXM6IHV1aWRzID0gW10sXG5cdFx0b2JzZXJ2YXRpb25zLFxuXHRcdHBvc2l0aW9ucyxcblx0XHRxdWF0ZXJuaW9ucyxcblx0fTogV29ya2VyRnJhbWVNZXNzYWdlWydkYXRhJ10pIHtcblx0XHRjb25zdCBbeyBzaG91bGRJbnZhbGlkYXRlIH0sIHsgYm9kaWVzLCBzdWJzY3JpcHRpb25zLCByZWZzLCBzY2FsZU92ZXJyaWRlcyB9LCBpbnZhbGlkYXRlXSA9IFtcblx0XHRcdHVudHJhY2tlZCh0aGlzLm9wdGlvbnMpLFxuXHRcdFx0dGhpcy5hcGksXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoKSxcblx0XHRdO1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdXVpZHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGJvZGllc1t1dWlkc1tpXV0gPSBpO1xuXHRcdH1cblx0XHRvYnNlcnZhdGlvbnMuZm9yRWFjaCgoW2lkLCB2YWx1ZSwgdHlwZV0pID0+IHtcblx0XHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbnNbaWRdIHx8IHt9O1xuXHRcdFx0Y29uc3QgY2IgPSBzdWJzY3JpcHRpb25bdHlwZV07XG5cdFx0XHQvLyBAdHMtZXhwZWN0LWVycm9yIC0gV2UgY2xlYXJseSBrbm93IHRoZSB0eXBlIG9mIHRoZSBjYWxsYmFjaywgYnV0IHR5cGVzY3JpcHQgY2FuJ3QgZGVhbCB3aXRoIGl0XG5cdFx0XHRjYiAmJiBjYih2YWx1ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKCFhY3RpdmUpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlZiBvZiBPYmplY3QudmFsdWVzKHJlZnMpLmZpbHRlcih1bmlxdWUoKSkpIHtcblx0XHRcdGlmIChyZWYgaW5zdGFuY2VvZiBJbnN0YW5jZWRNZXNoKSB7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVmLmNvdW50OyBpKyspIHtcblx0XHRcdFx0XHRjb25zdCB1dWlkID0gYCR7cmVmLnV1aWR9LyR7aX1gO1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gYm9kaWVzW3V1aWRdO1xuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZWYuc2V0TWF0cml4QXQoaSwgYXBwbHkoaW5kZXgsIHBvc2l0aW9ucywgcXVhdGVybmlvbnMsIHNjYWxlT3ZlcnJpZGVzW3V1aWRdKSk7XG5cdFx0XHRcdFx0XHRyZWYuaW5zdGFuY2VNYXRyaXgubmVlZHNVcGRhdGUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc3Qgc2NhbGUgPSBzY2FsZU92ZXJyaWRlc1tyZWYudXVpZF0gfHwgcmVmLnNjYWxlO1xuXHRcdFx0XHRhcHBseShib2RpZXNbcmVmLnV1aWRdLCBwb3NpdGlvbnMsIHF1YXRlcm5pb25zLCBzY2FsZSwgcmVmKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKHNob3VsZEludmFsaWRhdGUpIGludmFsaWRhdGUoKTtcblx0fVxuXG5cdHByaXZhdGUgcmF5aGl0SGFuZGxlcih7IGJvZHksIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfTogV29ya2VyUmF5aGl0RXZlbnRbJ2RhdGEnXSkge1xuXHRcdGNvbnN0IHsgZXZlbnRzLCByZWZzIH0gPSB0aGlzLmFwaTtcblx0XHRjb25zdCBjYiA9IGV2ZW50c1t1dWlkXT8ucmF5aGl0O1xuXHRcdGlmIChjYikgY2IoeyBib2R5OiBib2R5ID8gcmVmc1tib2R5XSA6IG51bGwsIHJheTogeyB1dWlkLCAuLi5yYXlSZXN0IH0sIC4uLnJlc3QgfSk7XG5cdH1cbn1cbiJdfQ==