@smarterplan/ngx-smarterplan-core 1.4.19 → 1.4.21
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/esm2022/lib/helpers.service.mjs +28 -2
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +28 -7
- package/esm2022/lib/services/filter.service.mjs +8 -3
- package/esm2022/lib/services/matterport-object3d.service.mjs +657 -133
- package/esm2022/lib/services/matterport.service.mjs +330 -9
- package/esm2022/lib/services/models/base-object.service.mjs +10 -9
- package/esm2022/lib/services/models/equipment.service.mjs +27 -2
- package/esm2022/lib/services/models/feature.service.mjs +14 -1
- package/esm2022/lib/services/models/measurement.service.mjs +17 -1
- package/esm2022/lib/services/sweep-locator.service.mjs +114 -0
- package/esm2022/lib/services/threejs.service.mjs +840 -35
- package/esm2022/lib/services/utils/matterport-framing.util.mjs +63 -0
- package/esm2022/lib/services/viewer.service.mjs +193 -10
- package/esm2022/lib/types.service.mjs +3 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +2886 -776
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/helpers.service.d.ts +17 -0
- package/lib/services/matterport-object3d.service.d.ts +125 -5
- package/lib/services/matterport.service.d.ts +106 -7
- package/lib/services/models/base-object.service.d.ts +3 -4
- package/lib/services/models/measurement.service.d.ts +1 -0
- package/lib/services/sweep-locator.service.d.ts +54 -0
- package/lib/services/threejs.service.d.ts +304 -10
- package/lib/services/utils/matterport-framing.util.d.ts +40 -0
- package/lib/services/viewer.service.d.ts +87 -2
- package/lib/types.service.d.ts +42 -1
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
|
@@ -6,6 +6,9 @@ import { MTLLoader } from 'three/examples/jsm/loaders/MTLLoader';
|
|
|
6
6
|
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';
|
|
7
7
|
import { KTX2Loader } from 'three/examples/jsm/loaders/KTX2Loader';
|
|
8
8
|
import { MeshoptDecoder } from 'three/examples/jsm/libs/meshopt_decoder.module.js';
|
|
9
|
+
import { Line2 } from 'three/examples/jsm/lines/Line2';
|
|
10
|
+
import { LineGeometry } from 'three/examples/jsm/lines/LineGeometry';
|
|
11
|
+
import { LineMaterial } from 'three/examples/jsm/lines/LineMaterial';
|
|
9
12
|
import { Subject } from 'rxjs';
|
|
10
13
|
import * as i0 from "@angular/core";
|
|
11
14
|
/**
|
|
@@ -30,20 +33,29 @@ function frameFromPoints(a, b, c) {
|
|
|
30
33
|
return new THREE.Matrix4().makeBasis(e1, e2, e1.clone().cross(e2));
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
33
|
-
* Solves the transform that maps stored tag coordinates onto the loaded model
|
|
36
|
+
* Solves the transform that maps stored tag coordinates onto the loaded model, from as many matched
|
|
37
|
+
* tags as there are - up to three.
|
|
34
38
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* between them free; three resolve it.
|
|
39
|
+
* Three pairs pin down everything: position, orientation and scale. A model that shares only a
|
|
40
|
+
* corner with the tags' space may not have three tags to offer, so fewer are accepted, each
|
|
41
|
+
* settling what it can and assuming the rest:
|
|
39
42
|
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
43
|
+
* - Two pairs: position, heading and scale. The one thing two points cannot say is how the model
|
|
44
|
+
* is tilted, so both spaces are taken to agree on which way is up.
|
|
45
|
+
* - One pair: position only. Heading and scale are taken to match already.
|
|
46
|
+
*
|
|
47
|
+
* `targetUp` is the model's vertical axis, which the tags' own vertical (+Y) is matched to in those
|
|
48
|
+
* two cases. Returns null when the points cannot answer the question asked of them - collinear for
|
|
49
|
+
* three, one above the other for two - because a wrong calibration applied silently is worse than
|
|
50
|
+
* none.
|
|
42
51
|
*/
|
|
43
|
-
export function solveThreeJsAlignment(pairs) {
|
|
44
|
-
if (!pairs || pairs.length
|
|
52
|
+
export function solveThreeJsAlignment(pairs, targetUp = { x: 0, y: 1, z: 0 }) {
|
|
53
|
+
if (!pairs || pairs.length === 0) {
|
|
45
54
|
return null;
|
|
46
55
|
}
|
|
56
|
+
if (pairs.length < 3) {
|
|
57
|
+
return solveReducedAlignment(pairs, new THREE.Vector3(targetUp.x, targetUp.y, targetUp.z).normalize());
|
|
58
|
+
}
|
|
47
59
|
const sources = pairs.slice(0, 3).map((pair) => new THREE.Vector3(pair.source.x, pair.source.y, pair.source.z));
|
|
48
60
|
const targets = pairs.slice(0, 3).map((pair) => new THREE.Vector3(pair.target.x, pair.target.y, pair.target.z));
|
|
49
61
|
const sourceFrame = frameFromPoints(sources[0], sources[1], sources[2]);
|
|
@@ -84,6 +96,41 @@ export function solveThreeJsAlignment(pairs) {
|
|
|
84
96
|
scale,
|
|
85
97
|
};
|
|
86
98
|
}
|
|
99
|
+
/** The one- and two-pair cases of solveThreeJsAlignment, which share the "same vertical" assumption. */
|
|
100
|
+
function solveReducedAlignment(pairs, up) {
|
|
101
|
+
const sources = pairs.map((pair) => new THREE.Vector3(pair.source.x, pair.source.y, pair.source.z));
|
|
102
|
+
const targets = pairs.map((pair) => new THREE.Vector3(pair.target.x, pair.target.y, pair.target.z));
|
|
103
|
+
// Starts from the rotation that only stands the tags' vertical on the model's.
|
|
104
|
+
const rotation = new THREE.Quaternion().setFromUnitVectors(new THREE.Vector3(0, 1, 0), up);
|
|
105
|
+
let scale = 1;
|
|
106
|
+
if (pairs.length === 2) {
|
|
107
|
+
const sourceSpan = sources[1].clone().sub(sources[0]);
|
|
108
|
+
const targetSpan = targets[1].clone().sub(targets[0]);
|
|
109
|
+
if (sourceSpan.length() < 1e-9 || targetSpan.length() < 1e-9) {
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
scale = targetSpan.length() / sourceSpan.length();
|
|
113
|
+
// Heading is the turn about the vertical that lines the two spans up, so only their horizontal
|
|
114
|
+
// parts count. Two points one above the other have none, and say nothing about heading.
|
|
115
|
+
const flatten = (v) => v.clone().sub(up.clone().multiplyScalar(v.dot(up)));
|
|
116
|
+
const from = flatten(sourceSpan.clone().applyQuaternion(rotation));
|
|
117
|
+
const to = flatten(targetSpan);
|
|
118
|
+
if (from.length() < 1e-6 * sourceSpan.length() || to.length() < 1e-6 * targetSpan.length()) {
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const heading = Math.atan2(new THREE.Vector3().crossVectors(from, to).dot(up), from.dot(to));
|
|
122
|
+
rotation.premultiply(new THREE.Quaternion().setFromAxisAngle(up, heading));
|
|
123
|
+
}
|
|
124
|
+
// A point lands at t + s*R*p; solved for t at the centroids, as in the three-pair case.
|
|
125
|
+
const centroid = (points) => points.reduce((sum, v) => sum.add(v), new THREE.Vector3()).multiplyScalar(1 / points.length);
|
|
126
|
+
const translation = centroid(targets).sub(centroid(sources).applyQuaternion(rotation).multiplyScalar(scale));
|
|
127
|
+
const euler = new THREE.Euler().setFromQuaternion(rotation);
|
|
128
|
+
return {
|
|
129
|
+
translation: { x: translation.x, y: translation.y, z: translation.z },
|
|
130
|
+
rotation: { x: euler.x, y: euler.y, z: euler.z },
|
|
131
|
+
scale,
|
|
132
|
+
};
|
|
133
|
+
}
|
|
87
134
|
export class ThreeJsService {
|
|
88
135
|
ngZone;
|
|
89
136
|
scene;
|
|
@@ -121,6 +168,61 @@ export class ThreeJsService {
|
|
|
121
168
|
pendingTagPlacement = null;
|
|
122
169
|
/** Pointer position waiting for a preview pick, coalesced to one per frame. */
|
|
123
170
|
pendingPreviewEvent = null;
|
|
171
|
+
/**
|
|
172
|
+
* Tags whose position is in this model's own coordinates. A sibling of the tag group that does not
|
|
173
|
+
* carry the calibration: calibrating a model for the tags it imports must not move the ones that
|
|
174
|
+
* were placed straight onto it.
|
|
175
|
+
*/
|
|
176
|
+
modelTagGroup = new THREE.Group();
|
|
177
|
+
/**
|
|
178
|
+
* The capture on screen. A tag placed in a 3D model is recorded with it, which is how the tags
|
|
179
|
+
* placed in this one are told from those that came from elsewhere.
|
|
180
|
+
*/
|
|
181
|
+
currentCaptureID = null;
|
|
182
|
+
/**
|
|
183
|
+
* The model's surface as a grid: every cell some part of the surface passes through.
|
|
184
|
+
*
|
|
185
|
+
* It answers "is this point near the model?" without visiting the triangles, of which a captured
|
|
186
|
+
* model has millions - the question is asked for every tag, every time the calibration changes.
|
|
187
|
+
*/
|
|
188
|
+
surfaceCells = null;
|
|
189
|
+
surfaceOrigin = new THREE.Vector3();
|
|
190
|
+
surfaceCellSize = 1;
|
|
191
|
+
/**
|
|
192
|
+
* How far from the model's surface a tag may be and still count as on it, in metres.
|
|
193
|
+
*
|
|
194
|
+
* Every tag of the space is offered to every model; this is what decides which ones a model
|
|
195
|
+
* shows. A tag marks something on a surface, so one that belongs here sits on the surface or
|
|
196
|
+
* close to it. One that lands deep inside the model, or well away from it, marks something that
|
|
197
|
+
* is not part of this model. The allowance covers a calibration done by hand and the model not
|
|
198
|
+
* matching the scan exactly, which together run to a few tens of centimetres.
|
|
199
|
+
*/
|
|
200
|
+
static ON_MODEL_METRES = 0.75;
|
|
201
|
+
/** Cells per axis the grid's keys can address, with room either side for points off the model. */
|
|
202
|
+
static SURFACE_GRID_SPAN = 1024;
|
|
203
|
+
static SURFACE_GRID_PAD = 128;
|
|
204
|
+
/** Own tags moved to keep their place under the last calibration, waiting to be stored. */
|
|
205
|
+
rebasedTags = [];
|
|
206
|
+
/** The type filter in force. Null shows every type. */
|
|
207
|
+
visibleTagTypes = null;
|
|
208
|
+
measuring = false;
|
|
209
|
+
/** Points clicked so far, in tag space. */
|
|
210
|
+
measurePoints = [];
|
|
211
|
+
/**
|
|
212
|
+
* Everything drawn for the measurement. A child of the tag group, so its points share the frame
|
|
213
|
+
* tag coordinates are stored in - which is metres, and what the saved POI has to be in.
|
|
214
|
+
*/
|
|
215
|
+
measureGroup = new THREE.Group();
|
|
216
|
+
/** The segment that follows the pointer from the last point clicked. */
|
|
217
|
+
measureRubberBand;
|
|
218
|
+
lastMeasurement = null;
|
|
219
|
+
/** Half the model's diagonal as placed in the scene, where it is centred on the origin. */
|
|
220
|
+
modelWorldRadius = 0;
|
|
221
|
+
/** The outermost group the model and its tags hang from: where "which way is up" is applied. */
|
|
222
|
+
modelGroup;
|
|
223
|
+
modelUp = 'y';
|
|
224
|
+
/** While measuring: how many points and each segment's length. Null when it is abandoned. */
|
|
225
|
+
measurementProgress$ = new Subject();
|
|
124
226
|
/**
|
|
125
227
|
* Layer carrying the model alone, so the depth pick can render it without the tags.
|
|
126
228
|
*
|
|
@@ -128,6 +230,8 @@ export class ThreeJsService {
|
|
|
128
230
|
* their parent passed, so marking the model's own meshes is enough - no re-parenting.
|
|
129
231
|
*/
|
|
130
232
|
static PICK_LAYER = 1;
|
|
233
|
+
/** The app's highlight colour, so a measurement reads as the active thing on screen. */
|
|
234
|
+
static MEASURE_COLOR = '#FFB103';
|
|
131
235
|
/** Cache Storage bucket holding downloaded models, and how many to keep. */
|
|
132
236
|
static MODEL_CACHE = 'smarterplan-3d-models';
|
|
133
237
|
static MODEL_CACHE_SIZE = 3;
|
|
@@ -144,6 +248,8 @@ export class ThreeJsService {
|
|
|
144
248
|
aligning = false;
|
|
145
249
|
alignmentPairs = [];
|
|
146
250
|
alignmentSource = null;
|
|
251
|
+
/** The tag `alignmentSource` was read from, kept so the same tag is not matched twice. */
|
|
252
|
+
alignmentSourceTagId;
|
|
147
253
|
/** Drives the alignment walkthrough's UI: how many pairs are done and what it wants next. */
|
|
148
254
|
alignmentProgress$ = new Subject();
|
|
149
255
|
/** In-flight camera move started by goToTag, advanced by the render loop. */
|
|
@@ -259,6 +365,8 @@ export class ThreeJsService {
|
|
|
259
365
|
// new model and show the previous visit's tags on it.
|
|
260
366
|
this.discardCurrentLoad();
|
|
261
367
|
this.clearTags();
|
|
368
|
+
this.measuring = false;
|
|
369
|
+
this.clearMeasurement();
|
|
262
370
|
this.cameraTween = null;
|
|
263
371
|
this.modelRoot = undefined;
|
|
264
372
|
// 1. Setup Scene
|
|
@@ -366,7 +474,7 @@ export class ThreeJsService {
|
|
|
366
474
|
* and stays indexed, so far less data reaches the GPU. KTX2 textures are supported too: they
|
|
367
475
|
* stay compressed in VRAM instead of being decoded to raw pixels like JPEG/PNG.
|
|
368
476
|
*/
|
|
369
|
-
loadGLTFModel(url, cameraPosition, rotation, cacheKey) {
|
|
477
|
+
loadGLTFModel(url, cameraPosition, rotation, cacheKey, up) {
|
|
370
478
|
const loader = new GLTFLoader();
|
|
371
479
|
// KTX2 needs the renderer to report which compressed formats this GPU accepts, so this has to
|
|
372
480
|
// happen after init(). Guarded so a model without KTX2 textures still loads if it's missing.
|
|
@@ -392,7 +500,7 @@ export class ThreeJsService {
|
|
|
392
500
|
this.forceDoubleSidedMaterials(gltf.scene);
|
|
393
501
|
this.ensureVertexNormals(gltf.scene);
|
|
394
502
|
this.tuneTextureSampling(gltf.scene);
|
|
395
|
-
this.placeLoadedObjectInScene(gltf.scene, cameraPosition, rotation);
|
|
503
|
+
this.placeLoadedObjectInScene(gltf.scene, cameraPosition, rotation, up);
|
|
396
504
|
this.modelLoading$.next(false);
|
|
397
505
|
};
|
|
398
506
|
const onError = (error) => {
|
|
@@ -865,7 +973,7 @@ export class ThreeJsService {
|
|
|
865
973
|
});
|
|
866
974
|
}
|
|
867
975
|
/** Centers, scales and adds a loaded object to the scene, then frames the camera on it. */
|
|
868
|
-
placeLoadedObjectInScene(object, cameraPosition, rotation) {
|
|
976
|
+
placeLoadedObjectInScene(object, cameraPosition, rotation, up) {
|
|
869
977
|
const box = new THREE.Box3().setFromObject(object);
|
|
870
978
|
const center = box.getCenter(new THREE.Vector3());
|
|
871
979
|
const size = box.getSize(new THREE.Vector3());
|
|
@@ -880,12 +988,25 @@ export class ThreeJsService {
|
|
|
880
988
|
if (rotation) {
|
|
881
989
|
object.rotation.set(rotation.x, rotation.y, rotation.z);
|
|
882
990
|
}
|
|
991
|
+
// Which way is up. A choice someone made by hand always wins; otherwise, unless the model came
|
|
992
|
+
// with an orientation of its own, it is worked out from the geometry. Applied to the outer
|
|
993
|
+
// group, above both the model and the tags: they turn together, and every coordinate already
|
|
994
|
+
// stored - tag positions, the calibration - keeps meaning what it meant.
|
|
995
|
+
this.modelGroup = group;
|
|
996
|
+
this.modelUp = up ?? (rotation ? 'y' : this.detectModelUp(object, size));
|
|
997
|
+
group.quaternion.copy(this.uprightRotation(this.modelUp));
|
|
883
998
|
this.modelRoot = object;
|
|
999
|
+
this.modelWorldRadius = (size.length() / 2) * scale;
|
|
1000
|
+
// The box above was measured before any rotation from the metadata was applied; with one, it
|
|
1001
|
+
// has to be measured again to be the model as it actually sits.
|
|
1002
|
+
this.buildSurfaceGrid(object, rotation ? new THREE.Box3().setFromObject(object) : box);
|
|
1003
|
+
this.refreshTagVisibility();
|
|
884
1004
|
// Marks the model for the depth pick, which renders this layer alone - so tags and the ghost
|
|
885
1005
|
// itself cannot end up being what the cursor reports as the surface under it.
|
|
886
1006
|
object.traverse((child) => child.layers.enable(ThreeJsService.PICK_LAYER));
|
|
887
1007
|
centered.add(object);
|
|
888
1008
|
centered.add(this.tagGroup);
|
|
1009
|
+
centered.add(this.modelTagGroup);
|
|
889
1010
|
group.add(centered);
|
|
890
1011
|
group.scale.setScalar(scale);
|
|
891
1012
|
this.scene.add(group);
|
|
@@ -901,6 +1022,98 @@ export class ThreeJsService {
|
|
|
901
1022
|
this.controls.target.set(0, 0, 0);
|
|
902
1023
|
this.controls.update();
|
|
903
1024
|
}
|
|
1025
|
+
/**
|
|
1026
|
+
* Which of the model's axes is its vertical: 'y' when it already stands upright, or when it is
|
|
1027
|
+
* not clear enough to act on.
|
|
1028
|
+
*
|
|
1029
|
+
* Models arrive in two conventions: Y up (glTF, and what this viewer assumes) and Z up (most CAD
|
|
1030
|
+
* and scanning exports). A Z-up model loads lying on its side. Two independent cues say which
|
|
1031
|
+
* axis is the vertical one, and both have to agree before anything is turned:
|
|
1032
|
+
*
|
|
1033
|
+
* - Surface area. Floors and ceilings all face along the vertical, while walls are shared out
|
|
1034
|
+
* between the two horizontal axes, so the vertical usually collects the most area.
|
|
1035
|
+
* - Extent. A building is normally wider than it is tall, so the vertical is its shortest side.
|
|
1036
|
+
*
|
|
1037
|
+
* Either alone is wrong often enough to matter - a long corridor has more wall than floor, a
|
|
1038
|
+
* tower is taller than it is wide - and turning a model that was fine is worse than leaving one
|
|
1039
|
+
* that was not. A model that already has Y as its vertical is never touched.
|
|
1040
|
+
*/
|
|
1041
|
+
detectModelUp(object, size) {
|
|
1042
|
+
const axes = ['x', 'y', 'z'];
|
|
1043
|
+
// Projected area facing each way along each axis: [positive, negative].
|
|
1044
|
+
const area = { x: [0, 0], y: [0, 0], z: [0, 0] };
|
|
1045
|
+
let triangleCount = 0;
|
|
1046
|
+
object.updateMatrixWorld(true);
|
|
1047
|
+
object.traverse((child) => {
|
|
1048
|
+
const position = child.isMesh && child.geometry?.attributes?.position;
|
|
1049
|
+
if (position) {
|
|
1050
|
+
triangleCount += (child.geometry.index ? child.geometry.index.count : position.count) / 3;
|
|
1051
|
+
}
|
|
1052
|
+
});
|
|
1053
|
+
if (triangleCount === 0) {
|
|
1054
|
+
return 'y';
|
|
1055
|
+
}
|
|
1056
|
+
// A sample is plenty to see where the area lies, and keeps this cheap on models with millions
|
|
1057
|
+
// of triangles.
|
|
1058
|
+
const stride = Math.max(1, Math.ceil(triangleCount / 200000));
|
|
1059
|
+
const a = new THREE.Vector3();
|
|
1060
|
+
const b = new THREE.Vector3();
|
|
1061
|
+
const c = new THREE.Vector3();
|
|
1062
|
+
const normal = new THREE.Vector3();
|
|
1063
|
+
object.traverse((child) => {
|
|
1064
|
+
const position = child.isMesh && child.geometry?.attributes?.position;
|
|
1065
|
+
if (!position) {
|
|
1066
|
+
return;
|
|
1067
|
+
}
|
|
1068
|
+
const index = child.geometry.index;
|
|
1069
|
+
const count = (index ? index.count : position.count) / 3;
|
|
1070
|
+
for (let triangle = 0; triangle < count; triangle += stride) {
|
|
1071
|
+
const offset = triangle * 3;
|
|
1072
|
+
a.fromBufferAttribute(position, index ? index.getX(offset) : offset).applyMatrix4(child.matrixWorld);
|
|
1073
|
+
b.fromBufferAttribute(position, index ? index.getX(offset + 1) : offset + 1).applyMatrix4(child.matrixWorld);
|
|
1074
|
+
c.fromBufferAttribute(position, index ? index.getX(offset + 2) : offset + 2).applyMatrix4(child.matrixWorld);
|
|
1075
|
+
// The cross product's length is twice the triangle's area, so its components are the
|
|
1076
|
+
// area the triangle shows along each axis.
|
|
1077
|
+
normal.crossVectors(b.sub(a), c.sub(a));
|
|
1078
|
+
axes.forEach((axis) => {
|
|
1079
|
+
area[axis][normal[axis] >= 0 ? 0 : 1] += Math.abs(normal[axis]);
|
|
1080
|
+
});
|
|
1081
|
+
}
|
|
1082
|
+
});
|
|
1083
|
+
const total = { x: area.x[0] + area.x[1], y: area.y[0] + area.y[1], z: area.z[0] + area.z[1] };
|
|
1084
|
+
const byArea = axes.reduce((best, axis) => (total[axis] > total[best] ? axis : best), 'y');
|
|
1085
|
+
const byExtent = axes.reduce((best, axis) => (size[axis] < size[best] ? axis : best), 'y');
|
|
1086
|
+
if (byArea === 'y' || byArea !== byExtent || total[byArea] < 1.25 * total.y) {
|
|
1087
|
+
return 'y';
|
|
1088
|
+
}
|
|
1089
|
+
// Which way along that axis is up. Roofs and ground make an outdoor model face mostly upward,
|
|
1090
|
+
// which settles it; indoors floors and ceilings balance out, and the convention - positive is
|
|
1091
|
+
// up - is the better guess.
|
|
1092
|
+
const [positive, negative] = area[byArea];
|
|
1093
|
+
const up = `${negative > 0.65 * (positive + negative) ? '-' : ''}${byArea}`;
|
|
1094
|
+
console.info(`ThreeJsService: this model's vertical axis looks like ${up}, not y - standing it upright.`);
|
|
1095
|
+
return up;
|
|
1096
|
+
}
|
|
1097
|
+
/** The rotation that brings the given model axis to point up. */
|
|
1098
|
+
uprightRotation(up) {
|
|
1099
|
+
const axis = new THREE.Vector3();
|
|
1100
|
+
axis[up.replace('-', '')] = up.startsWith('-') ? -1 : 1;
|
|
1101
|
+
return new THREE.Quaternion().setFromUnitVectors(axis, new THREE.Vector3(0, 1, 0));
|
|
1102
|
+
}
|
|
1103
|
+
/** Which of the model's axes is currently treated as up, whether chosen or worked out. */
|
|
1104
|
+
getModelUp() {
|
|
1105
|
+
return this.modelUp;
|
|
1106
|
+
}
|
|
1107
|
+
/**
|
|
1108
|
+
* Turns the model so the given axis points up, at once.
|
|
1109
|
+
*
|
|
1110
|
+
* The model and its tags turn as one, so nothing stored has to be recomputed. The caller is
|
|
1111
|
+
* expected to store the choice, or the next load goes back to working it out.
|
|
1112
|
+
*/
|
|
1113
|
+
setModelUp(up) {
|
|
1114
|
+
this.modelUp = up;
|
|
1115
|
+
this.modelGroup?.quaternion.copy(this.uprightRotation(up));
|
|
1116
|
+
}
|
|
904
1117
|
/**
|
|
905
1118
|
* Keeps the drawing buffer and camera matched to the canvas as it is resized.
|
|
906
1119
|
*
|
|
@@ -926,6 +1139,7 @@ export class ThreeJsService {
|
|
|
926
1139
|
this.camera.aspect = width / height;
|
|
927
1140
|
this.camera.updateProjectionMatrix();
|
|
928
1141
|
this.renderer.setSize(width, height);
|
|
1142
|
+
this.updateMeasureLineResolution();
|
|
929
1143
|
});
|
|
930
1144
|
this.canvasResizeObserver.observe(container);
|
|
931
1145
|
}
|
|
@@ -937,9 +1151,16 @@ export class ThreeJsService {
|
|
|
937
1151
|
* applied until solveAlignmentFromPairs() succeeds.
|
|
938
1152
|
*/
|
|
939
1153
|
startTagAlignment() {
|
|
1154
|
+
// One pointer mode at a time, the same rule startMeasuring() applies the other way round.
|
|
1155
|
+
if (this.measuring) {
|
|
1156
|
+
this.cancelMeasuring();
|
|
1157
|
+
}
|
|
940
1158
|
this.aligning = true;
|
|
941
1159
|
this.alignmentPairs = [];
|
|
942
1160
|
this.alignmentSource = null;
|
|
1161
|
+
// While calibrating, the tags from elsewhere are all shown - including the ones off the model,
|
|
1162
|
+
// which are exactly the ones a calibration is for.
|
|
1163
|
+
this.refreshTagVisibility();
|
|
943
1164
|
if (this.renderer) {
|
|
944
1165
|
this.renderer.domElement.style.cursor = 'crosshair';
|
|
945
1166
|
}
|
|
@@ -952,6 +1173,7 @@ export class ThreeJsService {
|
|
|
952
1173
|
this.alignmentSource = null;
|
|
953
1174
|
this.pendingPreviewEvent = null;
|
|
954
1175
|
this.removePlacementPreview();
|
|
1176
|
+
this.refreshTagVisibility();
|
|
955
1177
|
if (this.renderer) {
|
|
956
1178
|
this.renderer.domElement.style.cursor = 'default';
|
|
957
1179
|
}
|
|
@@ -971,12 +1193,22 @@ export class ThreeJsService {
|
|
|
971
1193
|
* first half of a pair, which is a click on a tag, not on the model.
|
|
972
1194
|
*/
|
|
973
1195
|
isPreviewingPlacement() {
|
|
974
|
-
return this.placingTag || (this.aligning && !!this.alignmentSource);
|
|
1196
|
+
return this.placingTag || this.measuring || (this.aligning && !!this.alignmentSource);
|
|
975
1197
|
}
|
|
976
1198
|
/** Whether a tag is currently registered for this element. */
|
|
977
1199
|
hasTag(elementId) {
|
|
978
1200
|
return this.tagSprites.has(elementId);
|
|
979
1201
|
}
|
|
1202
|
+
/** How many tags are on show - the ones a person could actually click. */
|
|
1203
|
+
getTagCount() {
|
|
1204
|
+
let visible = 0;
|
|
1205
|
+
this.tagSprites.forEach((sprite) => {
|
|
1206
|
+
if (sprite.visible) {
|
|
1207
|
+
visible += 1;
|
|
1208
|
+
}
|
|
1209
|
+
});
|
|
1210
|
+
return visible;
|
|
1211
|
+
}
|
|
980
1212
|
/**
|
|
981
1213
|
* Solves and applies the alignment collected so far, returning it so the caller can persist it.
|
|
982
1214
|
*
|
|
@@ -984,35 +1216,105 @@ export class ThreeJsService {
|
|
|
984
1216
|
* the walkthrough stays open for the person to pick a better third point.
|
|
985
1217
|
*/
|
|
986
1218
|
solveAlignmentFromPairs() {
|
|
987
|
-
const
|
|
1219
|
+
const up = new THREE.Vector3();
|
|
1220
|
+
up[this.modelUp.replace('-', '')] = this.modelUp.startsWith('-') ? -1 : 1;
|
|
1221
|
+
const alignment = solveThreeJsAlignment(this.alignmentPairs, up);
|
|
988
1222
|
if (!alignment) {
|
|
989
1223
|
return null;
|
|
990
1224
|
}
|
|
991
|
-
|
|
1225
|
+
// Out of calibrating mode first: applying the result re-decides which tags show, and from here
|
|
1226
|
+
// on that is the ones on the model again, not all of them.
|
|
992
1227
|
this.aligning = false;
|
|
1228
|
+
this.applyAlignmentKeepingOwnTags(alignment);
|
|
993
1229
|
this.pendingPreviewEvent = null;
|
|
994
1230
|
this.removePlacementPreview();
|
|
995
1231
|
this.renderer.domElement.style.cursor = 'default';
|
|
996
1232
|
this.alignmentProgress$.next({ pairs: this.alignmentPairs.length, awaiting: null });
|
|
997
1233
|
return alignment;
|
|
998
1234
|
}
|
|
1235
|
+
/**
|
|
1236
|
+
* Applies a new calibration while keeping every tag placed in this model exactly where it is.
|
|
1237
|
+
*
|
|
1238
|
+
* A calibration is worked out for the tags that came from elsewhere. The model's own tags were put
|
|
1239
|
+
* where they are by someone clicking the model, so they must not follow it. Their stored
|
|
1240
|
+
* coordinates are rewritten instead: into the shared space as the new calibration defines it.
|
|
1241
|
+
* That is also what makes them comparable with other visits from here on - a tag placed before
|
|
1242
|
+
* the model was calibrated was in the model's own coordinates, visible nowhere else.
|
|
1243
|
+
*
|
|
1244
|
+
* The rewritten tags are kept for the caller to store; see takeRebasedTags().
|
|
1245
|
+
*/
|
|
1246
|
+
applyAlignmentKeepingOwnTags(alignment) {
|
|
1247
|
+
const own = [...this.tagSprites.values()].filter((sprite) => this.isOwnedByVisit(sprite));
|
|
1248
|
+
// Where each one is now, in the space the model sits in, and how its parent was turned.
|
|
1249
|
+
const placed = own.map((sprite) => {
|
|
1250
|
+
sprite.parent?.updateMatrix();
|
|
1251
|
+
return {
|
|
1252
|
+
sprite,
|
|
1253
|
+
position: sprite.position.clone().applyMatrix4(sprite.parent?.matrix ?? new THREE.Matrix4()),
|
|
1254
|
+
turn: sprite.parent?.quaternion.clone() ?? new THREE.Quaternion(),
|
|
1255
|
+
};
|
|
1256
|
+
});
|
|
1257
|
+
this.setTagAlignment(alignment);
|
|
1258
|
+
const inverse = this.tagGroup.matrix.clone().invert();
|
|
1259
|
+
const unturn = this.tagGroup.quaternion.clone().invert();
|
|
1260
|
+
this.rebasedTags = placed.map(({ sprite, position, turn }) => {
|
|
1261
|
+
sprite.position.copy(position.applyMatrix4(inverse));
|
|
1262
|
+
sprite.userData.frame = null;
|
|
1263
|
+
this.parentTag(sprite);
|
|
1264
|
+
this.scaleTagForModel(sprite);
|
|
1265
|
+
const rotation = unturn.clone().multiply(turn);
|
|
1266
|
+
return {
|
|
1267
|
+
id: sprite.name,
|
|
1268
|
+
position: { x: sprite.position.x, y: sprite.position.y, z: sprite.position.z },
|
|
1269
|
+
rotateDirection: ({ x, y, z }) => {
|
|
1270
|
+
const turned = new THREE.Vector3(x, y, z).applyQuaternion(rotation);
|
|
1271
|
+
return { x: turned.x, y: turned.y, z: turned.z };
|
|
1272
|
+
},
|
|
1273
|
+
};
|
|
1274
|
+
});
|
|
1275
|
+
this.refreshTagVisibility();
|
|
1276
|
+
}
|
|
1277
|
+
/** Hands over the tags the last calibration rewrote, once, for them to be stored. */
|
|
1278
|
+
takeRebasedTags() {
|
|
1279
|
+
const rebased = this.rebasedTags;
|
|
1280
|
+
this.rebasedTags = [];
|
|
1281
|
+
return rebased;
|
|
1282
|
+
}
|
|
1283
|
+
/**
|
|
1284
|
+
* Chooses the tag for the pair being matched by id, instead of by clicking it.
|
|
1285
|
+
*
|
|
1286
|
+
* Clicking a tag supposes it can be found. On a model that has never been calibrated the tags may
|
|
1287
|
+
* sit far from it, or all on top of one another; a list has neither problem.
|
|
1288
|
+
*/
|
|
1289
|
+
selectAlignmentTag(elementId) {
|
|
1290
|
+
const sprite = this.tagSprites.get(elementId);
|
|
1291
|
+
if (!this.aligning || this.alignmentSource || !sprite || !this.calibrationCandidates().includes(sprite)) {
|
|
1292
|
+
return false;
|
|
1293
|
+
}
|
|
1294
|
+
this.setAlignmentSource(sprite);
|
|
1295
|
+
return true;
|
|
1296
|
+
}
|
|
1297
|
+
setAlignmentSource(sprite) {
|
|
1298
|
+
// The sprite's own position is the stored coordinate, untouched by any alignment already
|
|
1299
|
+
// applied - that transform lives on the group, not on the sprite.
|
|
1300
|
+
const stored = sprite.position;
|
|
1301
|
+
this.alignmentSource = { x: stored.x, y: stored.y, z: stored.z };
|
|
1302
|
+
this.alignmentSourceTagId = sprite.name;
|
|
1303
|
+
this.alignmentProgress$.next({
|
|
1304
|
+
pairs: this.alignmentPairs.length,
|
|
1305
|
+
awaiting: 'point',
|
|
1306
|
+
tagId: sprite.name,
|
|
1307
|
+
});
|
|
1308
|
+
}
|
|
999
1309
|
/** Handles a click while the alignment walkthrough is running. */
|
|
1000
1310
|
handleAlignmentClick(event) {
|
|
1001
1311
|
if (!this.alignmentSource) {
|
|
1002
1312
|
// First half of a pair: which tag are we talking about?
|
|
1003
|
-
const hit = this.raycaster.intersectObjects(this.
|
|
1313
|
+
const hit = this.raycaster.intersectObjects(this.calibrationCandidates(), false)[0];
|
|
1004
1314
|
if (!hit) {
|
|
1005
1315
|
return;
|
|
1006
1316
|
}
|
|
1007
|
-
|
|
1008
|
-
// applied - that transform lives on the group, not on the sprite.
|
|
1009
|
-
const stored = hit.object.position;
|
|
1010
|
-
this.alignmentSource = { x: stored.x, y: stored.y, z: stored.z };
|
|
1011
|
-
this.alignmentProgress$.next({
|
|
1012
|
-
pairs: this.alignmentPairs.length,
|
|
1013
|
-
awaiting: 'point',
|
|
1014
|
-
tagId: hit.object.name,
|
|
1015
|
-
});
|
|
1317
|
+
this.setAlignmentSource(hit.object);
|
|
1016
1318
|
return;
|
|
1017
1319
|
}
|
|
1018
1320
|
// Second half: where that tag actually belongs on the model.
|
|
@@ -1020,16 +1322,250 @@ export class ThreeJsService {
|
|
|
1020
1322
|
if (!target) {
|
|
1021
1323
|
return;
|
|
1022
1324
|
}
|
|
1023
|
-
this.alignmentPairs.push({ source: this.alignmentSource, target });
|
|
1325
|
+
this.alignmentPairs.push({ tagId: this.alignmentSourceTagId, source: this.alignmentSource, target });
|
|
1024
1326
|
this.alignmentSource = null;
|
|
1025
1327
|
// The ghost belongs to the click that just happened; the next half is a click on a tag.
|
|
1026
1328
|
this.pendingPreviewEvent = null;
|
|
1027
1329
|
this.removePlacementPreview();
|
|
1028
1330
|
this.alignmentProgress$.next({
|
|
1029
1331
|
pairs: this.alignmentPairs.length,
|
|
1030
|
-
|
|
1332
|
+
// Done at three, or sooner when there are no more tags to match: fewer pairs still calibrate,
|
|
1333
|
+
// only less completely.
|
|
1334
|
+
awaiting: this.alignmentPairs.length >= 3 || this.calibrationCandidates().length === 0 ? null : 'tag',
|
|
1335
|
+
});
|
|
1336
|
+
}
|
|
1337
|
+
/**
|
|
1338
|
+
* Starts a measurement: every click on the model adds a point, and each pair of consecutive
|
|
1339
|
+
* points is a measured segment.
|
|
1340
|
+
*
|
|
1341
|
+
* It ends through finishMeasuring() or cancelMeasuring() rather than on its own after two points,
|
|
1342
|
+
* because a measurement may have several segments - the same as Matterport's, whose results are
|
|
1343
|
+
* stored as a list of distances.
|
|
1344
|
+
*/
|
|
1345
|
+
startMeasuring() {
|
|
1346
|
+
// One pointer mode at a time: a click cannot be both a tag position and a measured point.
|
|
1347
|
+
this.cancelTagPlacement();
|
|
1348
|
+
if (this.aligning) {
|
|
1349
|
+
this.cancelTagAlignment();
|
|
1350
|
+
}
|
|
1351
|
+
this.clearMeasurement();
|
|
1352
|
+
if (this.measureGroup.parent !== this.tagGroup) {
|
|
1353
|
+
this.tagGroup.add(this.measureGroup);
|
|
1354
|
+
}
|
|
1355
|
+
this.measuring = true;
|
|
1356
|
+
if (this.renderer) {
|
|
1357
|
+
this.renderer.domElement.style.cursor = 'crosshair';
|
|
1358
|
+
}
|
|
1359
|
+
this.measurementProgress$.next({ points: 0, distances: [] });
|
|
1360
|
+
}
|
|
1361
|
+
/**
|
|
1362
|
+
* Abandons the measurement and removes what was drawn.
|
|
1363
|
+
*
|
|
1364
|
+
* Also what clears a finished measurement off the model once its form is saved or closed, which
|
|
1365
|
+
* is why it only reports an abandonment when one was actually in progress.
|
|
1366
|
+
*/
|
|
1367
|
+
cancelMeasuring() {
|
|
1368
|
+
const wasMeasuring = this.measuring;
|
|
1369
|
+
this.measuring = false;
|
|
1370
|
+
this.pendingPreviewEvent = null;
|
|
1371
|
+
this.removePlacementPreview();
|
|
1372
|
+
this.clearMeasurement();
|
|
1373
|
+
// Forgotten here so that a form opened later cannot pick up a measurement already dealt with.
|
|
1374
|
+
this.lastMeasurement = null;
|
|
1375
|
+
if (this.renderer) {
|
|
1376
|
+
this.renderer.domElement.style.cursor = 'default';
|
|
1377
|
+
}
|
|
1378
|
+
if (wasMeasuring) {
|
|
1379
|
+
this.measurementProgress$.next(null);
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
/**
|
|
1383
|
+
* Ends the measurement and returns it, or null when there are not yet two points to measure
|
|
1384
|
+
* between - in which case measuring simply carries on.
|
|
1385
|
+
*
|
|
1386
|
+
* The drawing stays on the model so it is still visible while the person names the measurement;
|
|
1387
|
+
* cancelMeasuring() takes it away afterwards.
|
|
1388
|
+
*/
|
|
1389
|
+
finishMeasuring() {
|
|
1390
|
+
if (!this.measuring || this.measurePoints.length < 2) {
|
|
1391
|
+
return null;
|
|
1392
|
+
}
|
|
1393
|
+
this.measuring = false;
|
|
1394
|
+
this.pendingPreviewEvent = null;
|
|
1395
|
+
this.removePlacementPreview();
|
|
1396
|
+
this.updateMeasureRubberBand(null);
|
|
1397
|
+
this.renderer.domElement.style.cursor = 'default';
|
|
1398
|
+
this.lastMeasurement = {
|
|
1399
|
+
points: this.measurePoints.map((point) => ({ x: point.x, y: point.y, z: point.z })),
|
|
1400
|
+
distances: this.measureDistances(),
|
|
1401
|
+
screenshot: this.captureMeasurementScreenshot(),
|
|
1402
|
+
};
|
|
1403
|
+
return this.lastMeasurement;
|
|
1404
|
+
}
|
|
1405
|
+
isMeasuring() {
|
|
1406
|
+
return this.measuring;
|
|
1407
|
+
}
|
|
1408
|
+
/** The measurement finishMeasuring() last produced, for the form that saves it. */
|
|
1409
|
+
getLastMeasurement() {
|
|
1410
|
+
return this.lastMeasurement;
|
|
1411
|
+
}
|
|
1412
|
+
/** Metres between consecutive points. Tag space is in metres, so no conversion is involved. */
|
|
1413
|
+
measureDistances() {
|
|
1414
|
+
const distances = [];
|
|
1415
|
+
for (let index = 1; index < this.measurePoints.length; index += 1) {
|
|
1416
|
+
const distance = this.measurePoints[index - 1].distanceTo(this.measurePoints[index]);
|
|
1417
|
+
// Two decimals, the precision Matterport's own measurements are stored with.
|
|
1418
|
+
distances.push(Math.round(distance * 100) / 100);
|
|
1419
|
+
}
|
|
1420
|
+
return distances;
|
|
1421
|
+
}
|
|
1422
|
+
addMeasurePoint(point) {
|
|
1423
|
+
const previous = this.measurePoints[this.measurePoints.length - 1];
|
|
1424
|
+
this.measurePoints.push(point);
|
|
1425
|
+
const marker = new THREE.Sprite(new THREE.SpriteMaterial({
|
|
1426
|
+
map: this.createTagTexture(ThreeJsService.MEASURE_COLOR),
|
|
1427
|
+
depthTest: false,
|
|
1428
|
+
transparent: true,
|
|
1429
|
+
// Sized against the viewport, not the model: measuring is done zoomed right in, where
|
|
1430
|
+
// anything sized in metres would cover the very thing being measured.
|
|
1431
|
+
sizeAttenuation: false,
|
|
1432
|
+
}));
|
|
1433
|
+
marker.scale.set(0.022, 0.022, 1);
|
|
1434
|
+
marker.position.copy(point);
|
|
1435
|
+
marker.renderOrder = 1001;
|
|
1436
|
+
this.measureGroup.add(marker);
|
|
1437
|
+
if (previous) {
|
|
1438
|
+
this.measureGroup.add(this.createMeasureLine(previous, point));
|
|
1439
|
+
const distance = Math.round(previous.distanceTo(point) * 100) / 100;
|
|
1440
|
+
const label = new THREE.Sprite(new THREE.SpriteMaterial({
|
|
1441
|
+
map: this.createMeasureLabelTexture(`${distance.toFixed(2)} m`),
|
|
1442
|
+
depthTest: false,
|
|
1443
|
+
transparent: true,
|
|
1444
|
+
sizeAttenuation: false,
|
|
1445
|
+
}));
|
|
1446
|
+
label.scale.set(0.15, 0.05, 1);
|
|
1447
|
+
label.position.copy(previous).add(point).multiplyScalar(0.5);
|
|
1448
|
+
label.renderOrder = 1002;
|
|
1449
|
+
this.measureGroup.add(label);
|
|
1450
|
+
}
|
|
1451
|
+
this.measurementProgress$.next({
|
|
1452
|
+
points: this.measurePoints.length,
|
|
1453
|
+
distances: this.measureDistances(),
|
|
1454
|
+
});
|
|
1455
|
+
}
|
|
1456
|
+
/**
|
|
1457
|
+
* A segment with a width in pixels.
|
|
1458
|
+
*
|
|
1459
|
+
* WebGL's own lines are one pixel wide whatever is asked for, which all but disappears over a
|
|
1460
|
+
* photographic texture. This kind is drawn as screen-facing geometry, so the width holds.
|
|
1461
|
+
*/
|
|
1462
|
+
createMeasureLine(from, to) {
|
|
1463
|
+
const geometry = new LineGeometry();
|
|
1464
|
+
geometry.setPositions([from.x, from.y, from.z, to.x, to.y, to.z]);
|
|
1465
|
+
const material = new LineMaterial({
|
|
1466
|
+
color: new THREE.Color(ThreeJsService.MEASURE_COLOR).getHex(),
|
|
1467
|
+
linewidth: 3,
|
|
1468
|
+
depthTest: false,
|
|
1469
|
+
transparent: true,
|
|
1470
|
+
});
|
|
1471
|
+
const size = this.renderer.getSize(new THREE.Vector2());
|
|
1472
|
+
material.resolution.set(size.x, size.y);
|
|
1473
|
+
const line = new Line2(geometry, material);
|
|
1474
|
+
line.renderOrder = 1000;
|
|
1475
|
+
return line;
|
|
1476
|
+
}
|
|
1477
|
+
/** Line widths are in pixels, which the material can only honour if it knows the canvas size. */
|
|
1478
|
+
updateMeasureLineResolution() {
|
|
1479
|
+
if (!this.renderer) {
|
|
1480
|
+
return;
|
|
1481
|
+
}
|
|
1482
|
+
const size = this.renderer.getSize(new THREE.Vector2());
|
|
1483
|
+
this.measureGroup.children.forEach((child) => {
|
|
1484
|
+
if (child.material?.resolution) {
|
|
1485
|
+
child.material.resolution.set(size.x, size.y);
|
|
1486
|
+
}
|
|
1031
1487
|
});
|
|
1032
1488
|
}
|
|
1489
|
+
/** Stretches a segment from the last point to the pointer, or hides it when given null. */
|
|
1490
|
+
updateMeasureRubberBand(target) {
|
|
1491
|
+
const last = this.measurePoints[this.measurePoints.length - 1];
|
|
1492
|
+
if (!this.measuring || !last || !target) {
|
|
1493
|
+
if (this.measureRubberBand) {
|
|
1494
|
+
this.measureRubberBand.visible = false;
|
|
1495
|
+
}
|
|
1496
|
+
return;
|
|
1497
|
+
}
|
|
1498
|
+
if (!this.measureRubberBand) {
|
|
1499
|
+
this.measureRubberBand = this.createMeasureLine(last, target);
|
|
1500
|
+
this.measureRubberBand.material.opacity = 0.6;
|
|
1501
|
+
this.measureGroup.add(this.measureRubberBand);
|
|
1502
|
+
}
|
|
1503
|
+
this.measureRubberBand.geometry.setPositions([
|
|
1504
|
+
last.x, last.y, last.z,
|
|
1505
|
+
target.x, target.y, target.z,
|
|
1506
|
+
]);
|
|
1507
|
+
this.measureRubberBand.visible = true;
|
|
1508
|
+
}
|
|
1509
|
+
createMeasureLabelTexture(text) {
|
|
1510
|
+
const canvas = document.createElement('canvas');
|
|
1511
|
+
canvas.width = 384;
|
|
1512
|
+
canvas.height = 128;
|
|
1513
|
+
const context = canvas.getContext('2d');
|
|
1514
|
+
const radius = 28;
|
|
1515
|
+
context.fillStyle = 'rgba(0, 0, 0, 0.78)';
|
|
1516
|
+
context.beginPath();
|
|
1517
|
+
context.moveTo(radius, 8);
|
|
1518
|
+
context.arcTo(canvas.width - 8, 8, canvas.width - 8, canvas.height - 8, radius);
|
|
1519
|
+
context.arcTo(canvas.width - 8, canvas.height - 8, 8, canvas.height - 8, radius);
|
|
1520
|
+
context.arcTo(8, canvas.height - 8, 8, 8, radius);
|
|
1521
|
+
context.arcTo(8, 8, canvas.width - 8, 8, radius);
|
|
1522
|
+
context.closePath();
|
|
1523
|
+
context.fill();
|
|
1524
|
+
context.fillStyle = '#FFFFFF';
|
|
1525
|
+
context.font = 'bold 60px sans-serif';
|
|
1526
|
+
context.textAlign = 'center';
|
|
1527
|
+
context.textBaseline = 'middle';
|
|
1528
|
+
context.fillText(text, canvas.width / 2, canvas.height / 2 + 4);
|
|
1529
|
+
return new THREE.CanvasTexture(canvas);
|
|
1530
|
+
}
|
|
1531
|
+
/** Removes everything drawn for a measurement and forgets its points. */
|
|
1532
|
+
clearMeasurement() {
|
|
1533
|
+
[...this.measureGroup.children].forEach((child) => {
|
|
1534
|
+
this.measureGroup.remove(child);
|
|
1535
|
+
child.geometry?.dispose?.();
|
|
1536
|
+
child.material?.map?.dispose?.();
|
|
1537
|
+
child.material?.dispose?.();
|
|
1538
|
+
});
|
|
1539
|
+
this.measureRubberBand = undefined;
|
|
1540
|
+
this.measurePoints = [];
|
|
1541
|
+
}
|
|
1542
|
+
/**
|
|
1543
|
+
* A picture of the scene with the measurement on it, as Matterport attaches to its own.
|
|
1544
|
+
*
|
|
1545
|
+
* Tags are left out, as they are there: the picture is about the measurement. It is taken straight
|
|
1546
|
+
* after a render because the drawing buffer is only guaranteed to hold the frame until the
|
|
1547
|
+
* browser presents it, and scaled down since it is uploaded and shown as a thumbnail.
|
|
1548
|
+
*/
|
|
1549
|
+
captureMeasurementScreenshot() {
|
|
1550
|
+
const hidden = [];
|
|
1551
|
+
this.tagSprites.forEach((sprite) => {
|
|
1552
|
+
if (sprite.visible) {
|
|
1553
|
+
sprite.visible = false;
|
|
1554
|
+
hidden.push(sprite);
|
|
1555
|
+
}
|
|
1556
|
+
});
|
|
1557
|
+
this.renderer.render(this.scene, this.camera);
|
|
1558
|
+
const source = this.renderer.domElement;
|
|
1559
|
+
const scale = Math.min(1, 800 / source.width, 600 / source.height);
|
|
1560
|
+
const canvas = document.createElement('canvas');
|
|
1561
|
+
canvas.width = Math.max(1, Math.round(source.width * scale));
|
|
1562
|
+
canvas.height = Math.max(1, Math.round(source.height * scale));
|
|
1563
|
+
canvas.getContext('2d').drawImage(source, 0, 0, canvas.width, canvas.height);
|
|
1564
|
+
hidden.forEach((sprite) => {
|
|
1565
|
+
sprite.visible = true;
|
|
1566
|
+
});
|
|
1567
|
+
return canvas.toDataURL('image/jpeg', 0.85);
|
|
1568
|
+
}
|
|
1033
1569
|
/** Arms tag placement: the next click on the model drops a tag instead of being ignored. */
|
|
1034
1570
|
startTagPlacement(poiType = null) {
|
|
1035
1571
|
this.placingTag = true;
|
|
@@ -1059,6 +1595,7 @@ export class ThreeJsService {
|
|
|
1059
1595
|
const position = this.pickPointOnGpu(event);
|
|
1060
1596
|
if (!position) {
|
|
1061
1597
|
this.removePlacementPreview();
|
|
1598
|
+
this.updateMeasureRubberBand(null);
|
|
1062
1599
|
this.renderer.domElement.style.cursor = 'not-allowed';
|
|
1063
1600
|
return;
|
|
1064
1601
|
}
|
|
@@ -1075,6 +1612,7 @@ export class ThreeJsService {
|
|
|
1075
1612
|
this.scaleTagForModel(this.placementPreview);
|
|
1076
1613
|
}
|
|
1077
1614
|
this.placementPreview.position.copy(position);
|
|
1615
|
+
this.updateMeasureRubberBand(position);
|
|
1078
1616
|
}
|
|
1079
1617
|
/**
|
|
1080
1618
|
* The point under the cursor, read from the depth buffer instead of raycast, in tag space.
|
|
@@ -1176,9 +1714,250 @@ export class ThreeJsService {
|
|
|
1176
1714
|
* filter that happens to match nothing.
|
|
1177
1715
|
*/
|
|
1178
1716
|
setVisibleTagTypes(types) {
|
|
1717
|
+
this.visibleTagTypes = types;
|
|
1718
|
+
this.tagSprites.forEach((sprite) => this.applyTagVisibility(sprite));
|
|
1719
|
+
}
|
|
1720
|
+
/** Says which capture is on screen, so the tags placed in it can be told from the rest. */
|
|
1721
|
+
setCurrentCapture(captureID) {
|
|
1722
|
+
this.currentCaptureID = captureID;
|
|
1179
1723
|
this.tagSprites.forEach((sprite) => {
|
|
1180
|
-
|
|
1724
|
+
this.parentTag(sprite);
|
|
1725
|
+
this.applyTagVisibility(sprite);
|
|
1726
|
+
});
|
|
1727
|
+
}
|
|
1728
|
+
/** Every tag registered in the scene, shown or not. */
|
|
1729
|
+
getTags() {
|
|
1730
|
+
const candidates = new Set(this.calibrationCandidates());
|
|
1731
|
+
return [...this.tagSprites.values()].map((sprite) => ({
|
|
1732
|
+
id: sprite.name,
|
|
1733
|
+
label: sprite.userData.label ?? null,
|
|
1734
|
+
poiType: sprite.userData.poiType ?? null,
|
|
1735
|
+
visible: sprite.visible,
|
|
1736
|
+
calibratable: candidates.has(sprite),
|
|
1737
|
+
}));
|
|
1738
|
+
}
|
|
1739
|
+
/**
|
|
1740
|
+
* How far the tags from elsewhere sit from the model, measured in model radii. Null without both.
|
|
1741
|
+
*
|
|
1742
|
+
* Before a model is calibrated those tags are wherever their own coordinates put them, which for
|
|
1743
|
+
* a model with a different origin can be a long way off - too far to find, let alone click.
|
|
1744
|
+
*/
|
|
1745
|
+
getTagDistanceFromModel() {
|
|
1746
|
+
if (!this.modelRoot || !this.modelWorldRadius) {
|
|
1747
|
+
return null;
|
|
1748
|
+
}
|
|
1749
|
+
const centroid = new THREE.Vector3();
|
|
1750
|
+
const candidates = this.calibrationCandidates();
|
|
1751
|
+
candidates.forEach((sprite) => centroid.add(sprite.getWorldPosition(new THREE.Vector3())));
|
|
1752
|
+
const count = candidates.length;
|
|
1753
|
+
if (count === 0) {
|
|
1754
|
+
return null;
|
|
1755
|
+
}
|
|
1756
|
+
// The model is centred on the world origin when it is placed.
|
|
1757
|
+
return centroid.divideScalar(count).length() / this.modelWorldRadius;
|
|
1758
|
+
}
|
|
1759
|
+
/**
|
|
1760
|
+
* Hangs a tag from the group its coordinates belong to: outside the calibration when they are in
|
|
1761
|
+
* this model's own coordinates, under it otherwise.
|
|
1762
|
+
*/
|
|
1763
|
+
parentTag(sprite) {
|
|
1764
|
+
const parent = sprite.userData.frame === 'model' && this.isOwnedByVisit(sprite)
|
|
1765
|
+
? this.modelTagGroup
|
|
1766
|
+
: this.tagGroup;
|
|
1767
|
+
if (sprite.parent !== parent) {
|
|
1768
|
+
parent.add(sprite);
|
|
1769
|
+
}
|
|
1770
|
+
}
|
|
1771
|
+
/**
|
|
1772
|
+
* The tags a calibration can be worked out from: those that came from somewhere else, whether or
|
|
1773
|
+
* not they are on show - before calibrating, most of them will not be.
|
|
1774
|
+
*
|
|
1775
|
+
* Tags placed in this model are where they are because someone clicked there; matching them to
|
|
1776
|
+
* "where they really are" would be circular. A tag in another model's own coordinates cannot be
|
|
1777
|
+
* placed here at all. And a tag already used in this calibration cannot be used again - two
|
|
1778
|
+
* pairs from one tag carry no more than one.
|
|
1779
|
+
*/
|
|
1780
|
+
calibrationCandidates() {
|
|
1781
|
+
const used = new Set(this.alignmentPairs.map((pair) => pair.tagId));
|
|
1782
|
+
return [...this.tagSprites.values()].filter((sprite) => sprite.parent === this.tagGroup
|
|
1783
|
+
&& sprite.userData.frame !== 'model'
|
|
1784
|
+
&& !this.isOwnedByVisit(sprite)
|
|
1785
|
+
&& !used.has(sprite.name));
|
|
1786
|
+
}
|
|
1787
|
+
/** How many tags there are to calibrate with, not counting those already used. */
|
|
1788
|
+
getCalibrationCandidateCount() {
|
|
1789
|
+
return this.calibrationCandidates().length;
|
|
1790
|
+
}
|
|
1791
|
+
/**
|
|
1792
|
+
* How many tags from elsewhere are not on this model, and so not shown on it.
|
|
1793
|
+
*
|
|
1794
|
+
* On a model that has not been calibrated, this is what suggests it should be: the tags are out
|
|
1795
|
+
* there, just not where the model is.
|
|
1796
|
+
*/
|
|
1797
|
+
getOffModelTagCount() {
|
|
1798
|
+
return this.calibrationCandidates().filter((sprite) => !this.isOnModel(sprite)).length;
|
|
1799
|
+
}
|
|
1800
|
+
/** Whether the tag was placed in the visit on screen. */
|
|
1801
|
+
isOwnedByVisit(sprite) {
|
|
1802
|
+
return !!sprite.userData.originCaptureID
|
|
1803
|
+
&& sprite.userData.originCaptureID === this.currentCaptureID;
|
|
1804
|
+
}
|
|
1805
|
+
/**
|
|
1806
|
+
* A tag shows when its type is not filtered out and it belongs on this model.
|
|
1807
|
+
*
|
|
1808
|
+
* One place decides, because the two used to set `visible` separately and whichever ran last
|
|
1809
|
+
* undid the other.
|
|
1810
|
+
*/
|
|
1811
|
+
applyTagVisibility(sprite) {
|
|
1812
|
+
const typeAllowed = this.visibleTagTypes === null
|
|
1813
|
+
|| this.visibleTagTypes.includes(sprite.userData.poiType);
|
|
1814
|
+
sprite.visible = typeAllowed && this.belongsOnThisModel(sprite);
|
|
1815
|
+
}
|
|
1816
|
+
/**
|
|
1817
|
+
* Whether a tag has a place on this model.
|
|
1818
|
+
*
|
|
1819
|
+
* Every tag of the space is offered to every model - there is one set of tags, not one per model.
|
|
1820
|
+
* What a model shows of it is the part that sits on the model.
|
|
1821
|
+
*/
|
|
1822
|
+
belongsOnThisModel(sprite) {
|
|
1823
|
+
// Placed here by a click on this very surface.
|
|
1824
|
+
if (this.isOwnedByVisit(sprite)) {
|
|
1825
|
+
return true;
|
|
1826
|
+
}
|
|
1827
|
+
// Placed in another model before that one was calibrated: its coordinates are that model's own
|
|
1828
|
+
// and say nothing about where it would be in this one.
|
|
1829
|
+
if (sprite.userData.frame === 'model') {
|
|
1830
|
+
return false;
|
|
1831
|
+
}
|
|
1832
|
+
// Calibrating is matching tags to where they belong, so they all have to be on offer.
|
|
1833
|
+
if (this.aligning) {
|
|
1834
|
+
return true;
|
|
1835
|
+
}
|
|
1836
|
+
return this.isOnModel(sprite);
|
|
1837
|
+
}
|
|
1838
|
+
/** Whether a tag, drawn where its coordinates and the calibration put it, sits on the model. */
|
|
1839
|
+
isOnModel(sprite) {
|
|
1840
|
+
if (!this.surfaceCells) {
|
|
1841
|
+
// No model to be on yet.
|
|
1842
|
+
return false;
|
|
1843
|
+
}
|
|
1844
|
+
const parent = sprite.parent ?? this.tagGroup;
|
|
1845
|
+
parent.updateMatrix();
|
|
1846
|
+
// The grid is in the model's own units; the calibration's scale is how many of those a metre is.
|
|
1847
|
+
const reach = ThreeJsService.ON_MODEL_METRES * (parent.scale.x || 1);
|
|
1848
|
+
return this.isNearSurface(sprite.position.clone().applyMatrix4(parent.matrix), reach);
|
|
1849
|
+
}
|
|
1850
|
+
/** Re-decides every tag's visibility: the model, the calibration or the mode changed. */
|
|
1851
|
+
refreshTagVisibility() {
|
|
1852
|
+
this.tagSprites.forEach((sprite) => this.applyTagVisibility(sprite));
|
|
1853
|
+
}
|
|
1854
|
+
surfaceKey(x, y, z) {
|
|
1855
|
+
const span = ThreeJsService.SURFACE_GRID_SPAN;
|
|
1856
|
+
const pad = ThreeJsService.SURFACE_GRID_PAD;
|
|
1857
|
+
const [i, j, k] = [x + pad, y + pad, z + pad];
|
|
1858
|
+
if (i < 0 || j < 0 || k < 0 || i >= span || j >= span || k >= span) {
|
|
1859
|
+
return -1;
|
|
1860
|
+
}
|
|
1861
|
+
return i + span * (j + span * k);
|
|
1862
|
+
}
|
|
1863
|
+
/**
|
|
1864
|
+
* Lays the grid over the model's surface.
|
|
1865
|
+
*
|
|
1866
|
+
* Runs once per model, in one pass over its triangles. A triangle smaller than a cell is marked
|
|
1867
|
+
* by its centre, which is every triangle of a scanned model; a larger one - the two triangles of
|
|
1868
|
+
* a drawn wall - is sampled across its face, or the middle of the wall would read as empty.
|
|
1869
|
+
*/
|
|
1870
|
+
buildSurfaceGrid(object, box) {
|
|
1871
|
+
const size = box.getSize(new THREE.Vector3());
|
|
1872
|
+
const longest = Math.max(size.x, size.y, size.z);
|
|
1873
|
+
if (!(longest > 0)) {
|
|
1874
|
+
this.surfaceCells = null;
|
|
1875
|
+
return;
|
|
1876
|
+
}
|
|
1877
|
+
// A quarter of a metre where the model is in metres; coarser on a very large one, so the grid
|
|
1878
|
+
// stays addressable and its memory bounded.
|
|
1879
|
+
const cell = Math.max(0.25, longest / 384);
|
|
1880
|
+
const origin = box.min.clone();
|
|
1881
|
+
const cells = new Set();
|
|
1882
|
+
const mark = (point) => {
|
|
1883
|
+
const key = this.surfaceKey(Math.floor((point.x - origin.x) / cell), Math.floor((point.y - origin.y) / cell), Math.floor((point.z - origin.z) / cell));
|
|
1884
|
+
if (key >= 0) {
|
|
1885
|
+
cells.add(key);
|
|
1886
|
+
}
|
|
1887
|
+
};
|
|
1888
|
+
let triangleCount = 0;
|
|
1889
|
+
object.updateMatrixWorld(true);
|
|
1890
|
+
object.traverse((child) => {
|
|
1891
|
+
const position = child.isMesh && child.geometry?.attributes?.position;
|
|
1892
|
+
if (position) {
|
|
1893
|
+
triangleCount += (child.geometry.index ? child.geometry.index.count : position.count) / 3;
|
|
1894
|
+
}
|
|
1181
1895
|
});
|
|
1896
|
+
// Past a few million triangles they are far smaller than a cell, and every cell is hit many
|
|
1897
|
+
// times over; a sample marks the same cells.
|
|
1898
|
+
const stride = Math.max(1, Math.ceil(triangleCount / 3000000));
|
|
1899
|
+
const a = new THREE.Vector3();
|
|
1900
|
+
const b = new THREE.Vector3();
|
|
1901
|
+
const c = new THREE.Vector3();
|
|
1902
|
+
const point = new THREE.Vector3();
|
|
1903
|
+
object.traverse((child) => {
|
|
1904
|
+
const position = child.isMesh && child.geometry?.attributes?.position;
|
|
1905
|
+
if (!position) {
|
|
1906
|
+
return;
|
|
1907
|
+
}
|
|
1908
|
+
const index = child.geometry.index;
|
|
1909
|
+
const count = (index ? index.count : position.count) / 3;
|
|
1910
|
+
for (let triangle = 0; triangle < count; triangle += stride) {
|
|
1911
|
+
const offset = triangle * 3;
|
|
1912
|
+
a.fromBufferAttribute(position, index ? index.getX(offset) : offset).applyMatrix4(child.matrixWorld);
|
|
1913
|
+
b.fromBufferAttribute(position, index ? index.getX(offset + 1) : offset + 1).applyMatrix4(child.matrixWorld);
|
|
1914
|
+
c.fromBufferAttribute(position, index ? index.getX(offset + 2) : offset + 2).applyMatrix4(child.matrixWorld);
|
|
1915
|
+
const edge = Math.max(a.distanceTo(b), b.distanceTo(c), c.distanceTo(a));
|
|
1916
|
+
if (edge <= cell) {
|
|
1917
|
+
mark(point.copy(a).add(b).add(c).multiplyScalar(1 / 3));
|
|
1918
|
+
continue;
|
|
1919
|
+
}
|
|
1920
|
+
// Half-cell steps across the face. Capped, so one enormous triangle cannot stall the load;
|
|
1921
|
+
// the reach a tag is tested with spans several cells and bridges what the cap leaves.
|
|
1922
|
+
const steps = Math.min(96, Math.ceil((2 * edge) / cell));
|
|
1923
|
+
for (let i = 0; i <= steps; i += 1) {
|
|
1924
|
+
for (let j = 0; j <= steps - i; j += 1) {
|
|
1925
|
+
point.copy(a)
|
|
1926
|
+
.addScaledVector(b.clone().sub(a), i / steps)
|
|
1927
|
+
.addScaledVector(c.clone().sub(a), j / steps);
|
|
1928
|
+
mark(point);
|
|
1929
|
+
}
|
|
1930
|
+
}
|
|
1931
|
+
}
|
|
1932
|
+
});
|
|
1933
|
+
this.surfaceCells = cells;
|
|
1934
|
+
this.surfaceOrigin.copy(origin);
|
|
1935
|
+
this.surfaceCellSize = cell;
|
|
1936
|
+
}
|
|
1937
|
+
/** Whether some part of the model's surface lies within `reach` of a point, in model units. */
|
|
1938
|
+
isNearSurface(point, reach) {
|
|
1939
|
+
const cell = this.surfaceCellSize;
|
|
1940
|
+
const origin = this.surfaceOrigin;
|
|
1941
|
+
const x = (point.x - origin.x) / cell;
|
|
1942
|
+
const y = (point.y - origin.y) / cell;
|
|
1943
|
+
const z = (point.z - origin.z) / cell;
|
|
1944
|
+
// In cells. Capped: beyond this the calibration's scale makes a metre so many cells that the
|
|
1945
|
+
// search would dwarf the model, and a tag that far off is not on it by any reading.
|
|
1946
|
+
const span = Math.min(16, Math.ceil(reach / cell));
|
|
1947
|
+
// A cell is "within reach" when its centre is, give or take the half-diagonal of the cell.
|
|
1948
|
+
const limit = (reach / cell + 0.87) ** 2;
|
|
1949
|
+
const [cx, cy, cz] = [Math.floor(x), Math.floor(y), Math.floor(z)];
|
|
1950
|
+
for (let k = cz - span; k <= cz + span; k += 1) {
|
|
1951
|
+
for (let j = cy - span; j <= cy + span; j += 1) {
|
|
1952
|
+
for (let i = cx - span; i <= cx + span; i += 1) {
|
|
1953
|
+
const distance = (i + 0.5 - x) ** 2 + (j + 0.5 - y) ** 2 + (k + 0.5 - z) ** 2;
|
|
1954
|
+
if (distance <= limit && this.surfaceCells.has(this.surfaceKey(i, j, k))) {
|
|
1955
|
+
return true;
|
|
1956
|
+
}
|
|
1957
|
+
}
|
|
1958
|
+
}
|
|
1959
|
+
}
|
|
1960
|
+
return false;
|
|
1182
1961
|
}
|
|
1183
1962
|
/**
|
|
1184
1963
|
* Moves the camera to look at a tag, mirroring Matterport's goToTag.
|
|
@@ -1309,8 +2088,11 @@ export class ThreeJsService {
|
|
|
1309
2088
|
this.tagGroup.position.set(translation?.x ?? 0, translation?.y ?? 0, translation?.z ?? 0);
|
|
1310
2089
|
this.tagGroup.rotation.set(rotation?.x ?? 0, rotation?.y ?? 0, rotation?.z ?? 0);
|
|
1311
2090
|
this.tagGroup.scale.setScalar(scale ?? 1);
|
|
1312
|
-
|
|
2091
|
+
this.tagGroup.updateMatrix();
|
|
2092
|
+
// Tag size is derived from the world scale it inherits, which this call just changed - and so
|
|
2093
|
+
// is which tags land on the model.
|
|
1313
2094
|
this.tagSprites.forEach((sprite) => this.scaleTagForModel(sprite));
|
|
2095
|
+
this.refreshTagVisibility();
|
|
1314
2096
|
}
|
|
1315
2097
|
/**
|
|
1316
2098
|
* Adds a tag, or moves/restyles the one already registered for this element.
|
|
@@ -1325,6 +2107,10 @@ export class ThreeJsService {
|
|
|
1325
2107
|
existing.position.set(tag.position.x, tag.position.y, tag.position.z);
|
|
1326
2108
|
existing.userData.poiType = tag.poiType ?? existing.userData.poiType;
|
|
1327
2109
|
existing.userData.label = tag.label ?? existing.userData.label;
|
|
2110
|
+
existing.userData.originCaptureID = tag.originCaptureID ?? existing.userData.originCaptureID;
|
|
2111
|
+
existing.userData.frame = tag.frame ?? existing.userData.frame;
|
|
2112
|
+
this.parentTag(existing);
|
|
2113
|
+
this.applyTagVisibility(existing);
|
|
1328
2114
|
return;
|
|
1329
2115
|
}
|
|
1330
2116
|
const sprite = new THREE.Sprite(new THREE.SpriteMaterial({
|
|
@@ -1337,10 +2123,13 @@ export class ThreeJsService {
|
|
|
1337
2123
|
sprite.name = tag.id;
|
|
1338
2124
|
sprite.userData.poiType = tag.poiType ?? null;
|
|
1339
2125
|
sprite.userData.label = tag.label ?? null;
|
|
2126
|
+
sprite.userData.originCaptureID = tag.originCaptureID ?? null;
|
|
2127
|
+
sprite.userData.frame = tag.frame ?? null;
|
|
1340
2128
|
sprite.position.set(tag.position.x, tag.position.y, tag.position.z);
|
|
1341
2129
|
sprite.renderOrder = 999;
|
|
2130
|
+
this.parentTag(sprite);
|
|
1342
2131
|
this.scaleTagForModel(sprite);
|
|
1343
|
-
this.
|
|
2132
|
+
this.applyTagVisibility(sprite);
|
|
1344
2133
|
this.tagSprites.set(tag.id, sprite);
|
|
1345
2134
|
if (tag.iconUrl) {
|
|
1346
2135
|
this.applyTagIcon(sprite, tag.iconUrl);
|
|
@@ -1352,7 +2141,7 @@ export class ThreeJsService {
|
|
|
1352
2141
|
if (!sprite) {
|
|
1353
2142
|
return;
|
|
1354
2143
|
}
|
|
1355
|
-
|
|
2144
|
+
sprite.parent?.remove(sprite);
|
|
1356
2145
|
sprite.material.map?.dispose();
|
|
1357
2146
|
sprite.material.dispose();
|
|
1358
2147
|
this.tagSprites.delete(elementId);
|
|
@@ -1393,7 +2182,8 @@ export class ThreeJsService {
|
|
|
1393
2182
|
* size on screen whatever the model's units are.
|
|
1394
2183
|
*/
|
|
1395
2184
|
scaleTagForModel(sprite) {
|
|
1396
|
-
|
|
2185
|
+
// Its own parent's scale: tags in the model's coordinates do not inherit the calibration's.
|
|
2186
|
+
const worldScale = (sprite.parent ?? this.tagGroup).getWorldScale(new THREE.Vector3()).x || 1;
|
|
1397
2187
|
const size = 0.4 / worldScale;
|
|
1398
2188
|
sprite.scale.set(size, size, 1);
|
|
1399
2189
|
}
|
|
@@ -1452,7 +2242,7 @@ export class ThreeJsService {
|
|
|
1452
2242
|
this.removePlacementPreview();
|
|
1453
2243
|
// Tags first: they draw on top of the model, so they have to answer the pointer first too.
|
|
1454
2244
|
const hoveredTag = this.raycaster
|
|
1455
|
-
.intersectObjects(this.
|
|
2245
|
+
.intersectObjects([...this.tagSprites.values()], false)
|
|
1456
2246
|
.find((hit) => hit.object.visible)?.object;
|
|
1457
2247
|
if (hoveredTag) {
|
|
1458
2248
|
this.renderer.domElement.style.cursor = 'pointer';
|
|
@@ -1491,6 +2281,15 @@ export class ThreeJsService {
|
|
|
1491
2281
|
this.handleAlignmentClick(event);
|
|
1492
2282
|
return;
|
|
1493
2283
|
}
|
|
2284
|
+
// Measuring takes every click as a point, the same way placement takes it as a position.
|
|
2285
|
+
if (this.measuring) {
|
|
2286
|
+
const placement = this.pickPlacementOnModel(event);
|
|
2287
|
+
if (placement) {
|
|
2288
|
+
const { x, y, z } = placement.position;
|
|
2289
|
+
this.addMeasurePoint(new THREE.Vector3(x, y, z));
|
|
2290
|
+
}
|
|
2291
|
+
return;
|
|
2292
|
+
}
|
|
1494
2293
|
// Placement wins over everything: while armed, a click means "put it here", not "open that".
|
|
1495
2294
|
if (this.placingTag) {
|
|
1496
2295
|
const placement = this.pickPlacementOnModel(event);
|
|
@@ -1506,7 +2305,7 @@ export class ThreeJsService {
|
|
|
1506
2305
|
}
|
|
1507
2306
|
this.raycaster.setFromCamera(this.mouse, this.camera);
|
|
1508
2307
|
// Same precedence as hover: a tag drawn over the model claims the click.
|
|
1509
|
-
const tagHits = this.raycaster.intersectObjects(this.
|
|
2308
|
+
const tagHits = this.raycaster.intersectObjects([...this.tagSprites.values()], false)
|
|
1510
2309
|
.filter((hit) => hit.object.visible);
|
|
1511
2310
|
if (tagHits.length > 0) {
|
|
1512
2311
|
const tag = tagHits[0].object;
|
|
@@ -1541,6 +2340,10 @@ export class ThreeJsService {
|
|
|
1541
2340
|
this.cancelTagPlacement();
|
|
1542
2341
|
return;
|
|
1543
2342
|
}
|
|
2343
|
+
if (this.measuring) {
|
|
2344
|
+
this.cancelMeasuring();
|
|
2345
|
+
return;
|
|
2346
|
+
}
|
|
1544
2347
|
if (this.aligning) {
|
|
1545
2348
|
this.cancelTagAlignment();
|
|
1546
2349
|
}
|
|
@@ -1568,6 +2371,8 @@ export class ThreeJsService {
|
|
|
1568
2371
|
}
|
|
1569
2372
|
this.discardCurrentLoad();
|
|
1570
2373
|
this.clearTags();
|
|
2374
|
+
this.measuring = false;
|
|
2375
|
+
this.clearMeasurement();
|
|
1571
2376
|
if (this.renderer) {
|
|
1572
2377
|
this.renderer.dispose();
|
|
1573
2378
|
}
|
|
@@ -1584,4 +2389,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1584
2389
|
providedIn: 'root'
|
|
1585
2390
|
}]
|
|
1586
2391
|
}], ctorParameters: () => [{ type: i0.NgZone }] });
|
|
1587
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW9EL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBRWYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMs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QUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2pCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBeHBEVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7IE1UTExvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG5pbXBvcnQgeyBNZXNob3B0RGVjb2RlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saWJzL21lc2hvcHRfZGVjb2Rlci5tb2R1bGUuanMnO1xyXG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IFRocmVlSnNBbGlnbm1lbnQgfSBmcm9tICcuLi9oZWxwZXJzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQb2lUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogQSB0YWcgdG8gZHJhdyBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIG1pcnJvcmluZyBhIE1hdHRlcnRhZy5cclxuICpcclxuICogUG9zaXRpb25zIGFyZSBpbiB0aGUgbW9kZWwncyBvd24gY29vcmRpbmF0ZSBzcGFjZSAtIHRoZSBzYW1lIG51bWJlcnMgc3RvcmVkIGluIFBPSS5jb29yZGluYXRlIC1cclxuICogbm90IHNjZW5lIHNwYWNlLiBUaGUgc2VydmljZSByZXBhcmVudHMgdGFncyB1bmRlciB0aGUgbW9kZWwgc28gdGhleSBpbmhlcml0IHRoZSBjZW50ZXJpbmcgYW5kXHJcbiAqIHNjYWxpbmcgYXBwbGllZCBhdCBsb2FkLCB3aGljaCBtZWFucyBjYWxsZXJzIG5ldmVyIGRlYWwgd2l0aCB0aGF0IHRyYW5zZm9ybS5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZyB7XHJcbiAgLyoqIFRoZSB0YWdnZWQgZWxlbWVudCdzIGlkIChQT0kuZWxlbWVudElEKSwgdXNlZCB0byB1cGRhdGUgb3IgcmVtb3ZlIHRoZSB0YWcgbGF0ZXIuICovXHJcbiAgaWQ6IHN0cmluZztcclxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIERyaXZlcyBib3RoIHRoZSBjbGljayByb3V0ZSBhbmQgdHlwZSBmaWx0ZXJpbmcsIHNvIGl0IHRyYXZlbHMgd2l0aCB0aGUgdGFnLiAqL1xyXG4gIHBvaVR5cGU/OiBQb2lUeXBlIHwgbnVsbDtcclxuICAvKiogU2hvd24gb24gaG92ZXIuIEEgbWFya2VyIHdpdGggbm8gaWRlbnRpdHkgaXMganVzdCBhIGRvdCBvbiBhIHdhbGwuICovXHJcbiAgbGFiZWw/OiBzdHJpbmcgfCBudWxsO1xyXG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXHJcbiAgaWNvblVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXHJcbiAgY29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxyXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xyXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XHJcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xyXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cclxuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XHJcbn1cclxuXHJcbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzQWxpZ25tZW50UGFpciB7XHJcbiAgc291cmNlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG4vKipcclxuICogQnVpbGRzIGFuIG9ydGhvbm9ybWFsIGZyYW1lIGZyb20gdGhyZWUgcG9pbnRzLCBvciBudWxsIHdoZW4gdGhleSBhcmUgKG5lYXJseSkgY29sbGluZWFyLlxyXG4gKlxyXG4gKiBUaHJlZSBwb2ludHMgZGVmaW5lIGEgcGxhbmUsIGFuZCBhIHBsYW5lIHBsdXMgYW4gb3JpZ2luIGRlZmluZXMgYW4gb3JpZW50YXRpb24uIENvbGxpbmVhciBwb2ludHNcclxuICogZG8gbm90OiB0aGV5IGxlYXZlIHRoZSByb3RhdGlvbiBhYm91dCB0aGVpciBjb21tb24gbGluZSB1bmRldGVybWluZWQsIHdoaWNoIGlzIHdoeSB0aGUgY2FsbGVyIGhhc1xyXG4gKiB0byByZWplY3QgdGhlbSByYXRoZXIgdGhhbiBwcm9kdWNlIGEgY29uZmlkZW50IHdyb25nIGFuc3dlci5cclxuICovXHJcbmZ1bmN0aW9uIGZyYW1lRnJvbVBvaW50cyhhOiBUSFJFRS5WZWN0b3IzLCBiOiBUSFJFRS5WZWN0b3IzLCBjOiBUSFJFRS5WZWN0b3IzKTogVEhSRUUuTWF0cml4NCB8IG51bGwge1xyXG4gIGNvbnN0IGUxID0gYi5jbG9uZSgpLnN1YihhKTtcclxuICBpZiAoZTEubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgZTEubm9ybWFsaXplKCk7XHJcblxyXG4gIGNvbnN0IHRvQyA9IGMuY2xvbmUoKS5zdWIoYSk7XHJcbiAgY29uc3QgZTIgPSB0b0MuY2xvbmUoKS5zdWIoZTEuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih0b0MuZG90KGUxKSkpO1xyXG4gIGlmIChlMi5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBlMi5ub3JtYWxpemUoKTtcclxuXHJcbiAgcmV0dXJuIG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZUJhc2lzKGUxLCBlMiwgZTEuY2xvbmUoKS5jcm9zcyhlMikpO1xyXG59XHJcblxyXG4vKipcclxuICogU29sdmVzIHRoZSB0cmFuc2Zvcm0gdGhhdCBtYXBzIHN0b3JlZCB0YWcgY29vcmRpbmF0ZXMgb250byB0aGUgbG9hZGVkIG1vZGVsLlxyXG4gKlxyXG4gKiBUYWtlcyBleGFjdGx5IHRoZSBjb3JyZXNwb25kZW5jZXMgYSBwZXJzb24gY2FuIHByb2R1Y2UgYnkgaGFuZDogdGhyZWUgdGFncywgZWFjaCBwb2ludGVkIGF0IHR3aWNlXHJcbiAqIC0gb25jZSB3aGVyZSBpdCBjdXJyZW50bHkgc2l0cywgb25jZSB3aGVyZSBpdCBiZWxvbmdzLiBUaGF0IGlzIHRoZSBtaW5pbXVtIHRoYXQgcGlucyBkb3duIGFsbFxyXG4gKiB0aHJlZSBwYXJ0cyBvZiB0aGUgYW5zd2VyLiBPbmUgcGFpciBmaXhlcyBvbmx5IHRyYW5zbGF0aW9uOyB0d28gbGVhdmUgdGhlIHJvdGF0aW9uIGFib3V0IHRoZSBsaW5lXHJcbiAqIGJldHdlZW4gdGhlbSBmcmVlOyB0aHJlZSByZXNvbHZlIGl0LlxyXG4gKlxyXG4gKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcG9pbnRzIGFyZSBjb2xsaW5lYXIgb3IgZGVnZW5lcmF0ZSwgYmVjYXVzZSBhIHdyb25nIGFsaWdubWVudCBhcHBsaWVkXHJcbiAqIHNpbGVudGx5IGlzIHdvcnNlIHRoYW4gbm9uZS5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBzb2x2ZVRocmVlSnNBbGlnbm1lbnQocGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XHJcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPCAzKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGNvbnN0IHNvdXJjZXMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIuc291cmNlLngsIHBhaXIuc291cmNlLnksIHBhaXIuc291cmNlLnopKTtcclxuICBjb25zdCB0YXJnZXRzID0gcGFpcnMuc2xpY2UoMCwgMykubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnRhcmdldC54LCBwYWlyLnRhcmdldC55LCBwYWlyLnRhcmdldC56KSk7XHJcblxyXG4gIGNvbnN0IHNvdXJjZUZyYW1lID0gZnJhbWVGcm9tUG9pbnRzKHNvdXJjZXNbMF0sIHNvdXJjZXNbMV0sIHNvdXJjZXNbMl0pO1xyXG4gIGNvbnN0IHRhcmdldEZyYW1lID0gZnJhbWVGcm9tUG9pbnRzKHRhcmdldHNbMF0sIHRhcmdldHNbMV0sIHRhcmdldHNbMl0pO1xyXG4gIGlmICghc291cmNlRnJhbWUgfHwgIXRhcmdldEZyYW1lKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIC8vIEEgcm90YXRpb24ncyBpbnZlcnNlIGlzIGl0cyB0cmFuc3Bvc2UsIHNvIHRoaXMgaXMgdGhlIHJvdGF0aW9uIGNhcnJ5aW5nIG9uZSBmcmFtZSBvbnRvIHRoZSBvdGhlci5cclxuICBjb25zdCByb3RhdGlvbiA9IHRhcmdldEZyYW1lLm11bHRpcGx5KHNvdXJjZUZyYW1lLmNsb25lKCkudHJhbnNwb3NlKCkpO1xyXG5cclxuICAvLyBTY2FsZSBmcm9tIGhvdyBmYXIgYXBhcnQgdGhlIHBvaW50cyBhcmUgaW4gZWFjaCBzcGFjZSwgYXZlcmFnZWQgb3ZlciB0aGUgdGhyZWUgZWRnZXMgc28gYSBzaW5nbGVcclxuICAvLyBzbG9wcHkgY2xpY2sgZG9lcyBub3Qgc2V0IGl0IG9uIGl0cyBvd24uXHJcbiAgY29uc3QgZWRnZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFswLCAyXV07XHJcbiAgbGV0IHJhdGlvU3VtID0gMDtcclxuICBsZXQgcmF0aW9Db3VudCA9IDA7XHJcbiAgZm9yIChjb25zdCBbaSwgal0gb2YgZWRnZXMpIHtcclxuICAgIGNvbnN0IHNvdXJjZUxlbmd0aCA9IHNvdXJjZXNbaV0uZGlzdGFuY2VUbyhzb3VyY2VzW2pdKTtcclxuICAgIGNvbnN0IHRhcmdldExlbmd0aCA9IHRhcmdldHNbaV0uZGlzdGFuY2VUbyh0YXJnZXRzW2pdKTtcclxuICAgIGlmIChzb3VyY2VMZW5ndGggPiAxZS05KSB7XHJcbiAgICAgIHJhdGlvU3VtICs9IHRhcmdldExlbmd0aCAvIHNvdXJjZUxlbmd0aDtcclxuICAgICAgcmF0aW9Db3VudCArPSAxO1xyXG4gICAgfVxyXG4gIH1cclxuICBpZiAocmF0aW9Db3VudCA9PT0gMCkge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGNvbnN0IHNjYWxlID0gcmF0aW9TdW0gLyByYXRpb0NvdW50O1xyXG5cclxuICAvLyBUaGUgZ3JvdXAgYXBwbGllcyBwb3NpdGlvbiwgdGhlbiByb3RhdGlvbiwgdGhlbiBzY2FsZSwgc28gYSBwb2ludCBsYW5kcyBhdCB0ICsgcypSKnAuIFNvbHZpbmdcclxuICAvLyB0aGF0IGZvciB0IGF0IHRoZSBjZW50cm9pZHMgZ2l2ZXMgdGhlIHRyYW5zbGF0aW9uLlxyXG4gIGNvbnN0IHNvdXJjZUNlbnRyb2lkID0gc291cmNlcy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xyXG4gIGNvbnN0IHRhcmdldENlbnRyb2lkID0gdGFyZ2V0cy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xyXG4gIGNvbnN0IHRyYW5zbGF0aW9uID0gdGFyZ2V0Q2VudHJvaWRcclxuICAgIC5jbG9uZSgpXHJcbiAgICAuc3ViKHNvdXJjZUNlbnRyb2lkLmNsb25lKCkuYXBwbHlNYXRyaXg0KHJvdGF0aW9uKS5tdWx0aXBseVNjYWxhcihzY2FsZSkpO1xyXG5cclxuICBjb25zdCBldWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyb3RhdGlvbik7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXHJcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXHJcbiAgICBzY2FsZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGNvdW50OiBudW1iZXI7XHJcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cclxuaW50ZXJmYWNlIFBhcnNlZE1lc2hEYXRhIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XHJcbiAgLy8gYSBtZXNoIHdpdGggbXVsdGlwbGUgdXNlbXRsIHN3aXRjaGVzIChnZW9tZXRyeS5ncm91cHMpIGhhcyBvbmUgcGVyIGdyb3VwLlxyXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xyXG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xyXG4gIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXk7XHJcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIGluZGV4OiBVaW50MzJBcnJheSB8IG51bGw7XHJcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xyXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2NlbmUhOiBUSFJFRS5TY2VuZTtcclxuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHByaXZhdGUgY29udHJvbHMhOiBPcmJpdENvbnRyb2xzO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gUmF5Y2FzdGluZyBhbmQgaW50ZXJhY3Rpb25cclxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdDYW1lcmE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG4gIHB1YmxpYyBvYmplY3RDbGlja2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IG51bGw+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXHJcbiAgcHVibGljIHRhZ0NsaWNrZWQkID0gbmV3IFN1YmplY3Q8VGhyZWVKc1RhZ0NsaWNrPigpO1xyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cclxuICBwdWJsaWMgdGFnSG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG5cclxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXHJcbiAgLy8gbW9kZWwgaXMgcGxhY2VkIGNhcnJpZXMgb3ZlciBhbmQgUE9JIGNvb3JkaW5hdGVzIGNhbiBzdGF5IGluIHRoZSBtb2RlbCdzIG93biBzcGFjZS5cclxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICAvKiogQWJvcnRzIHRoZSBpbi1mbGlnaHQgbW9kZWwgZG93bmxvYWQuIFBhcnNpbmcgY2Fubm90IGJlIGludGVycnVwdGVkLCBvbmx5IG5vdCBzdGFydGVkLiAqL1xyXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgLy8gVGhlIGxvYWRlZCBiYXNlIG1vZGVsLCBrZXB0IHNvIHRhZyBwbGFjZW1lbnQgY2FuIHJheWNhc3QgYWdhaW5zdCBpdHMgZ2VvbWV0cnkuXHJcbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcclxuXHJcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIHBsYWNlcyBhIHRhZyBpbnN0ZWFkIG9mIG9yYml0aW5nLiAqL1xyXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hhdCB0aGUgYXJtZWQgcGxhY2VtZW50IGlzIGZvciwgZWNob2VkIGJhY2sgd2hlbiB0aGUgc3BvdCBpcyBwaWNrZWQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb3NpdGlvbiBhbmQgbm9ybWFsIG9mIHRoZSBsYXN0IHBsYWNlZCB0YWcsIGluIG1vZGVsIHNwYWNlLCBhd2FpdGluZyBjb21taXQgdG8gYSBQT0kuICovXHJcbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb2ludGVyIHBvc2l0aW9uIHdhaXRpbmcgZm9yIGEgcHJldmlldyBwaWNrLCBjb2FsZXNjZWQgdG8gb25lIHBlciBmcmFtZS4gKi9cclxuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogTGF5ZXIgY2FycnlpbmcgdGhlIG1vZGVsIGFsb25lLCBzbyB0aGUgZGVwdGggcGljayBjYW4gcmVuZGVyIGl0IHdpdGhvdXQgdGhlIHRhZ3MuXHJcbiAgICpcclxuICAgKiBMYXllcnMgYXJlIHRlc3RlZCBwZXIgb2JqZWN0IGF0IHJlbmRlciB0aW1lIGFuZCBjaGlsZHJlbiBhcmUgdHJhdmVyc2VkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlclxyXG4gICAqIHRoZWlyIHBhcmVudCBwYXNzZWQsIHNvIG1hcmtpbmcgdGhlIG1vZGVsJ3Mgb3duIG1lc2hlcyBpcyBlbm91Z2ggLSBubyByZS1wYXJlbnRpbmcuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUElDS19MQVlFUiA9IDE7XHJcblxyXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRSA9ICdzbWFydGVycGxhbi0zZC1tb2RlbHMnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcclxuXHJcbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XHJcblxyXG4gIHByaXZhdGUgcGlja0NhbWVyYT86IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcblxyXG4gIC8qKiBFbWl0cyBvbmNlIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsLCBzbyB0aGUgVUkgY2FuIGNvbmZpcm0gYW5kIHBlcnNpc3QgaXQuICovXHJcbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBzbyB0aGUgcGFuZWwgZHJpdmluZyBpdCBjYW4gY2xvc2UuICovXHJcbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKiogVHJhbnNsdWNlbnQgbWFya2VyIHNob3duIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZy4gKi9cclxuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XHJcblxyXG4gIHByaXZhdGUgYWxpZ25pbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGFsaWdubWVudFBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdID0gW107XHJcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBEcml2ZXMgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaCdzIFVJOiBob3cgbWFueSBwYWlycyBhcmUgZG9uZSBhbmQgd2hhdCBpdCB3YW50cyBuZXh0LiAqL1xyXG4gIHB1YmxpYyBhbGlnbm1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7XHJcbiAgICBwYWlyczogbnVtYmVyO1xyXG4gICAgYXdhaXRpbmc6ICd0YWcnIHwgJ3BvaW50JyB8IG51bGw7XHJcbiAgICB0YWdJZD86IHN0cmluZztcclxuICB9PigpO1xyXG5cclxuICAvKiogSW4tZmxpZ2h0IGNhbWVyYSBtb3ZlIHN0YXJ0ZWQgYnkgZ29Ub1RhZywgYWR2YW5jZWQgYnkgdGhlIHJlbmRlciBsb29wLiAqL1xyXG4gIHByaXZhdGUgY2FtZXJhVHdlZW46IHtcclxuICAgIGZyb21Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcclxuICAgIHRvUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XHJcbiAgICBmcm9tVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xyXG4gICAgdG9UYXJnZXQ6IFRIUkVFLlZlY3RvcjM7XHJcbiAgICBzdGFydGVkQXQ6IG51bWJlcjtcclxuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcclxuICB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgT0JKIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXHJcbiAgcHVibGljIG1vZGVsTG9hZGluZyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG5cclxuICAvKipcclxuICAgKiBEb3dubG9hZCBwcm9ncmVzcyBmb3IgR0xCIG1vZGVscywgYXMgYSAwLTEgZnJhY3Rpb24sIG9yIG51bGwgd2hlbiB0aGUgdG90YWwgc2l6ZSBpcyB1bmtub3duLlxyXG4gICAqXHJcbiAgICogQSBudWxsIG1lYW5zIHRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIENvbnRlbnQtTGVuZ3RoIChjaHVua2VkIHJlc3BvbnNlcywgc29tZSBwcm94aWVzKSBhbmQgbm9cclxuICAgKiBwZXJjZW50YWdlIGNhbiBiZSBkZXJpdmVkOyBzaG93IGFuIGluZGV0ZXJtaW5hdGUgaW5kaWNhdG9yIHJhdGhlciB0aGFuIGd1ZXNzaW5nIGF0IG9uZS5cclxuICAgKi9cclxuICBwdWJsaWMgbW9kZWxMb2FkUHJvZ3Jlc3MkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRW1pdHMgd2hlbiBhIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGFza2luZyBpdCB0by5cclxuICAgKlxyXG4gICAqIGNhbmNlbE1vZGVsTG9hZCgpIGNhbiBhcnJpdmUgYWZ0ZXIgcGFyc2UoKSBoYXMgdGFrZW4gdGhlIG1haW4gdGhyZWFkLCBhbmQgcGFyc2UgY2Fubm90IGJlXHJcbiAgICogaW50ZXJydXB0ZWQgLSB0aGUgbW9kZWwgZmluaXNoZXMgbG9hZGluZyByZWdhcmRsZXNzLiBPbmx5IHRoaXMgdGVsbHMgdGhlIFVJIHdoaWNoIG9mIHRoZSB0d29cclxuICAgKiBoYXBwZW5lZCwgc28gaXQgZG9lcyBub3Qgb2ZmZXIgdG8gcmVsb2FkIHNvbWV0aGluZyB0aGF0IGlzIGFscmVhZHkgb24gc2NyZWVuLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb2RlbExvYWRDYW5jZWxsZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgLy8gQmFja2dyb3VuZCBwYXJzaW5nIG9mIGhlYXZ5IC5vYmogZmlsZXMsIHByb3ZpZGVkIGJ5IHRoZSBob3N0aW5nIGFwcCAoc2VlIHNldE9ialBhcnNlcldvcmtlcikuXHJcbiAgLy8gQW5ndWxhciBsaWJyYXJpZXMgYnVpbHQgd2l0aCBuZy1wYWNrYWdyIGNhbid0IGJ1bmRsZSBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYCB0aGVtc2VsdmVzLFxyXG4gIC8vIHNvIHRoZSBhcHAgaW5zdGFudGlhdGVzIHRoZSB3b3JrZXIgKGl0cyBidWlsZCBwaXBlbGluZSBzdXBwb3J0cyBpdCkgYW5kIGhhbmRzIGl0IG92ZXIgaGVyZS5cclxuICBwcml2YXRlIG9ialBhcnNlcldvcmtlcj86IFdvcmtlcjtcclxuICBwcml2YXRlIG9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlc29sdmU6IChtZXNoZXM6IFBhcnNlZE1lc2hEYXRhW10pID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB9PigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lKSB7IH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVnaXN0ZXJzIGEgV2ViIFdvcmtlciB1c2VkIHRvIHBhcnNlIGhlYXZ5IC5vYmogZmlsZXMgb2ZmIHRoZSBtYWluIHRocmVhZC5cclxuICAgKiBNdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAoZS5nLiBgbmV3IFdvcmtlcihuZXcgVVJMKCcuL29iai1wYXJzZXIud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSlgKSxcclxuICAgKiBzaW5jZSBhIGxpYnJhcnkgcGFja2FnZWQgd2l0aCBuZy1wYWNrYWdyIGNhbm5vdCBidW5kbGUgd29ya2VyIGZpbGVzIGl0c2VsZi5cclxuICAgKiBXaGVuIG5vIHdvcmtlciBpcyBwcm92aWRlZCwgbG9hZE9iak1vZGVsIGZhbGxzIGJhY2sgdG8gcGFyc2luZyBvbiB0aGUgbWFpbiB0aHJlYWQuXHJcbiAgICovXHJcbiAgc2V0T2JqUGFyc2VyV29ya2VyKHdvcmtlcjogV29ya2VyKTogdm9pZCB7XHJcbiAgICB0aGlzLm9ialBhcnNlcldvcmtlciA9IHdvcmtlcjtcclxuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PE9ialBhcnNlcldvcmtlclJlc3BvbnNlPikgPT4ge1xyXG4gICAgICBjb25zdCBwZW5kaW5nID0gdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZ2V0KGRhdGEucmVxdWVzdElkKTtcclxuICAgICAgaWYgKCFwZW5kaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmRlbGV0ZShkYXRhLnJlcXVlc3RJZCk7XHJcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5tZXNoZXMpIHtcclxuICAgICAgICBwZW5kaW5nLnJlc29sdmUoZGF0YS5tZXNoZXMpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgT0JKIGZpbGUgaW4gd29ya2VyJykpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZXF1ZXN0T2JqUGFyc2VJbldvcmtlcihvYmpVcmw6IHN0cmluZyk6IFByb21pc2U8UGFyc2VkTWVzaERhdGFbXT4ge1xyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgY29uc3QgcmVxdWVzdElkID0gYCR7RGF0ZS5ub3coKX0tJHtNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDM2KS5zbGljZSgyKX1gO1xyXG4gICAgICB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5zZXQocmVxdWVzdElkLCB7IHJlc29sdmUsIHJlamVjdCB9KTtcclxuICAgICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIhLnBvc3RNZXNzYWdlKHsgcmVxdWVzdElkLCBvYmpVcmwgfSk7XHJcbiAgICAgIC8vIERpYWdub3N0aWMgb25seTogbGFyZ2UgbW9kZWxzIGxlZ2l0aW1hdGVseSB0YWtlIGEgd2hpbGUsIHRoaXMgaXNuJ3QgYSB0aW1lb3V0L2Fib3J0LFxyXG4gICAgICAvLyBqdXN0IGEgc2lnbmFsIGluIGNhc2UgdGhlIHdvcmtlciB3ZW50IHNpbGVudCAoZS5nLiBpdCByYW4gb3V0IG9mIG1lbW9yeSBtaWQtcGFyc2UpLlxyXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuaGFzKHJlcXVlc3RJZCkpIHtcclxuICAgICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG9iai1wYXJzZXIgd29ya2VyIGhhcyBub3QgcmVwbGllZCBhZnRlciA2MHMgZm9yIHJlcXVlc3QgJHtyZXF1ZXN0SWR9IChvYmpVcmw9JHtvYmpVcmx9KS4gU3RpbGwgd2FpdGluZyAtIGxhcmdlIGZpbGVzIGNhbiB0YWtlIGEgd2hpbGUsIGJ1dCB0aGlzIG1heSBhbHNvIG1lYW4gdGhlIHdvcmtlciBodW5nIG9yIHJhbiBvdXQgb2YgbWVtb3J5LmApO1xyXG4gICAgICAgIH1cclxuICAgICAgfSwgNjAwMDApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVidWlsZHMgYSBUSFJFRS5NZXNoIGZyb20gdGhlIHJhdyB0eXBlZCBhcnJheXMgc2VudCBiYWNrIGJ5IHRoZSBwYXJzZXIgd29ya2VyLiAqL1xyXG4gIHByaXZhdGUgbWVzaEZyb21QYXJzZWREYXRhKGRhdGE6IFBhcnNlZE1lc2hEYXRhLCBtYXRlcmlhbHM/OiBhbnkpOiBUSFJFRS5NZXNoIHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IFRIUkVFLkJ1ZmZlckdlb21ldHJ5KCk7XHJcbiAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3Bvc2l0aW9uJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLnBvc2l0aW9uLCAzKSk7XHJcbiAgICBpZiAoZGF0YS51dikge1xyXG4gICAgICBnZW9tZXRyeS5zZXRBdHRyaWJ1dGUoJ3V2JywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLnV2LCAyKSk7XHJcbiAgICB9XHJcbiAgICAvLyBJbmRleCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgbm9ybWFsIGNvbXB1dGF0aW9uLCB3aGljaCByZWFkcyBpdCB0byBhdmVyYWdlIHNoYXJlZCBmYWNlcy5cclxuICAgIGlmIChkYXRhLmluZGV4KSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEluZGV4KG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS5pbmRleCwgMSkpO1xyXG4gICAgfVxyXG4gICAgaWYgKGRhdGEubm9ybWFsKSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgnbm9ybWFsJywgbmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLm5vcm1hbCwgMykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtcclxuICAgIH1cclxuICAgIC8vIEJveDMuc2V0RnJvbU9iamVjdCgpIHJldXNlcyBhbiBhbHJlYWR5LXNldCBib3VuZGluZ0JveCBpbnN0ZWFkIG9mIHdhbGtpbmcgZXZlcnkgdmVydGV4LFxyXG4gICAgLy8gc28gYWRvcHRpbmcgdGhlIHdvcmtlcidzIG1ha2VzIGZyYW1pbmcgdGhlIGNhbWVyYSBjaGVhcCBubyBtYXR0ZXIgaG93IGRlbnNlIHRoZSBtZXNoIGlzLlxyXG4gICAgaWYgKGRhdGEuYm91bmRpbmdCb3gpIHtcclxuICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MyhcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1pbiksXHJcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5tYXgpLFxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc29sdmVkTWF0ZXJpYWxzID0gZGF0YS5tYXRlcmlhbE5hbWVzLm1hcCgobmFtZSkgPT4ge1xyXG4gICAgICBjb25zdCBtYXRlcmlhbCA9IG1hdGVyaWFscyAmJiBuYW1lID8gbWF0ZXJpYWxzLmNyZWF0ZShuYW1lKSA6IHVuZGVmaW5lZDtcclxuICAgICAgaWYgKCFtYXRlcmlhbCkge1xyXG4gICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG5vIE1UTCBtYXRlcmlhbCBuYW1lZCBcIiR7bmFtZX1cIiBmb3IgbWVzaCBcIiR7ZGF0YS5uYW1lfVwiLCB1c2luZyBhIHBsYWluIGZhbGxiYWNrIChubyB0ZXh0dXJlKS5gKTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbWF0ZXJpYWwgfHwgbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBsZXQgbWVzaDogVEhSRUUuTWVzaDtcclxuICAgIGlmIChkYXRhLmdyb3VwcyAmJiBkYXRhLmdyb3Vwcy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGRhdGEuZ3JvdXBzLmZvckVhY2goKGdyb3VwKSA9PiBnZW9tZXRyeS5hZGRHcm91cChncm91cC5zdGFydCwgZ3JvdXAuY291bnQsIGdyb3VwLm1hdGVyaWFsSW5kZXgpKTtcclxuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFscyk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzWzBdKTtcclxuICAgIH1cclxuICAgIG1lc2gubmFtZSA9IGRhdGEubmFtZTtcclxuICAgIHJldHVybiBtZXNoO1xyXG4gIH1cclxuXHJcbiAgaW5pdChjYW52YXM6IEhUTUxDYW52YXNFbGVtZW50KTogdm9pZCB7XHJcbiAgICAvLyBUaGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b24gYnV0IHRoZSB2aWV3ZXIgY29tcG9uZW50IGlzIHJlYnVpbHQgb24gZXZlcnkgbmF2aWdhdGlvbiwgc28gc3RhdGVcclxuICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHNjZW5lIGlzIHN0aWxsIGhlcmUuIFR3byB0aGluZ3Mgb3V0bGl2ZSBpdCBhbmQgaGF2ZSB0byBnbyBmaXJzdDpcclxuICAgIC8vXHJcbiAgICAvLyAgLSBBIGRvd25sb2FkIHN0aWxsIGluIGZsaWdodC4gSXRzIG9uTG9hZGVkIHJlc29sdmVzIGFnYWluc3Qgd2hhdGV2ZXIgYHRoaXMuc2NlbmVgIHBvaW50cyBhdFxyXG4gICAgLy8gICAgYnkgdGhlbiwgc28gdGhlIG1vZGVsIGJlaW5nIGFiYW5kb25lZCB3b3VsZCBiZSBoYW5kZWQgdG8gdGhlIHNjZW5lIGJ1aWx0IGJlbG93LlxyXG4gICAgLy8gIC0gVGhlIHRhZyBncm91cCwgd2hpY2ggaXMgYSBmaWVsZCBhbmQga2VlcHMgaXRzIHNwcml0ZXMuIFRoZXkgd291bGQgYmUgcmUtcGFyZW50ZWQgdW5kZXIgdGhlXHJcbiAgICAvLyAgICBuZXcgbW9kZWwgYW5kIHNob3cgdGhlIHByZXZpb3VzIHZpc2l0J3MgdGFncyBvbiBpdC5cclxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XHJcbiAgICB0aGlzLmNsZWFyVGFncygpO1xyXG4gICAgdGhpcy5jYW1lcmFUd2VlbiA9IG51bGw7XHJcbiAgICB0aGlzLm1vZGVsUm9vdCA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICAvLyAxLiBTZXR1cCBTY2VuZVxyXG4gICAgdGhpcy5zY2VuZSA9IG5ldyBUSFJFRS5TY2VuZSgpO1xyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKDB4ZTBmN2ZmKTsgLy8gZnJvbSBQT0NcclxuXHJcbiAgICAvLyAyLiBTZXR1cCBDYW1lcmFcclxuICAgIHRoaXMuY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDc1LCBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuY2xpZW50SGVpZ2h0LCAwLjEsIDEwMDAwKTtcclxuICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxMCk7IC8vIHdpbGwgYmUgb3ZlcnJpZGRlbiBsYXRlciBpZiBwYXNzZWRcclxuXHJcbiAgICAvLyAzLiBTZXR1cCBXZWJHTCBSZW5kZXJlclxyXG4gICAgdGhpcy5yZW5kZXJlciA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlcmVyKHsgY2FudmFzLCBhbnRpYWxpYXM6IHRydWUgfSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUoY2FudmFzLmNsaWVudFdpZHRoLCBjYW52YXMuY2xpZW50SGVpZ2h0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhNYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMS41KSk7XHJcbiAgICB0aGlzLm9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzKTtcclxuICAgIFxyXG4gICAgLy8gRml4IGZvciBUaHJlZS5qcyByMTQ3IHZzIHIxNTIrIGNvbG9yIG1hbmFnZW1lbnRcclxuICAgIGlmICgnb3V0cHV0Q29sb3JTcGFjZScgaW4gdGhpcy5yZW5kZXJlcikge1xyXG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dENvbG9yU3BhY2UgPSAnc3JnYic7IC8vIFRIUkVFLlNSR0JDb2xvclNwYWNlXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICAodGhpcy5yZW5kZXJlciBhcyBhbnkpLm91dHB1dEVuY29kaW5nID0gMzAwMTsgLy8gVEhSRUUuc1JHQkVuY29kaW5nXHJcbiAgICB9XHJcblxyXG4gICAgLy8gV2l0aG91dCB0b25lIG1hcHBpbmcgYW55dGhpbmcgYnJpZ2h0ZXIgdGhhbiAxLjAgaXMgc2ltcGx5IGN1dCBvZmYgdG8gcHVyZSB3aGl0ZS4gQ2FwdHVyZWRcclxuICAgIC8vIHRleHR1cmVzIGNhcnJ5IGEgc21hbGwgZnJhY3Rpb24gb2YgdmVyeSBicmlnaHQgcGl4ZWxzIC0gc2t5IHJlZmxlY3RlZCBpbiB3aW5kb3dzLCBzdW5saXRcclxuICAgIC8vIHJlbmRlciAtIGFuZCBvbmNlIGxpZ2h0aW5nIHB1c2hlcyB0aG9zZSBwYXN0IHRoZSBsaW1pdCB0aGV5IGZsYXR0ZW4gaW50byB3aGl0ZSBzcGVja3Mgd2l0aFxyXG4gICAgLy8gbm8gZGV0YWlsIGxlZnQuIFJvbGxpbmcgdGhlIGhpZ2hsaWdodHMgb2ZmIGluc3RlYWQga2VlcHMgdGhhdCBkZXRhaWwgYW5kIGtlZXBzIGJyaWdodCBhcmVhc1xyXG4gICAgLy8gcmVhZGluZyBhcyBicmlnaHQgcmF0aGVyIHRoYW4gYmxvd24uXHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xyXG4gICAgdGhpcy5yZW5kZXJlci50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wO1xyXG5cclxuICAgIC8vIDQuIExpZ2h0aW5nLCBrZXB0IGRlbGliZXJhdGVseSByZXN0cmFpbmVkIGFuZCBuZXV0cmFsLlxyXG4gICAgLy9cclxuICAgIC8vIENhcHR1cmVkL3Bob3RvZ3JhbW1ldHJ5IG1vZGVscyBhbHJlYWR5IGhhdmUgbGlnaHRpbmcgYmFrZWQgaW50byB0aGVpciB0ZXh0dXJlcyAodGhlIHN1biBhbmRcclxuICAgIC8vIHNoYWRvd3MgY2FtZSB3aXRoIHRoZSBwaG90b3MpLCBzbyBsaWdodGluZyB0aGVtIGFnYWluIGRpc3RvcnRzIHdoYXQgdGhleSBhY3R1YWxseSBsb29rIGxpa2UuXHJcbiAgICAvLyBUaGUgaW50ZW5zaXRpZXMgYmVsb3cgYWRkIHVwIHRvIHJvdWdobHkgMS4wIG9uIGEgc3VyZmFjZSBmYWNpbmcgdGhlIHZpZXdlciwgd2hpY2ggcmVuZGVycyB0aGVcclxuICAgIC8vIHRleHR1cmUgYXQgaXRzIHRydWUgdmFsdWUuIEFueXRoaW5nIGFib3ZlIDEuMCBpcyBjbGlwcGVkIHRvIHB1cmUgd2hpdGUgYnkgdGhlIHJlbmRlcmVyLCB3aGljaFxyXG4gICAgLy8gaXMgd2hhdCB0dXJucyBicmlnaHQgYXJlYXMgaW50byBmbGF0IHdoaXRlIHBhdGNoZXMgd2l0aCBubyBkZXRhaWwgbGVmdCBpbiB0aGVtLlxyXG4gICAgLy9cclxuICAgIC8vIE5ldXRyYWwgd2hpdGUgaXMgdXNlZCByYXRoZXIgdGhhbiBhIHdhcm0gdGludCBmb3IgdGhlIHNhbWUgcmVhc29uOiBhIHRpbnRlZCBsaWdodCBzaGlmdHMgZXZlcnlcclxuICAgIC8vIGNvbG91ciBpbiB0aGUgbW9kZWwgYXdheSBmcm9tIHdoYXQgd2FzIGNhcHR1cmVkLlxyXG4gICAgY29uc3QgYW1iaWVudExpZ2h0ID0gbmV3IFRIUkVFLkFtYmllbnRMaWdodCgweGZmZmZmZiwgMC43KTtcclxuICAgIHRoaXMuc2NlbmUuYWRkKGFtYmllbnRMaWdodCk7XHJcblxyXG4gICAgLy8gSGVhZGxpZ2h0IHJhdGhlciB0aGFuIGEgZml4ZWQgc3VuOiBwYXJlbnRlZCB0byB0aGUgY2FtZXJhIHNvIGl0IGFsd2F5cyBwb2ludHMgYXQgd2hhdGV2ZXIgaXNcclxuICAgIC8vIGJlaW5nIGxvb2tlZCBhdCwgZ2l2aW5nIHNoYXBlIHRvIHN1cmZhY2VzIHdpdGhvdXQgZXZlciBsZWF2aW5nIGEgZmFjZSB1bmxpdC4gTm8gc2hhZG93IGNhc3RpbmdcclxuICAgIC8vIC0gc2hhZG93cyB3b3VsZCBkb3VibGUgdXAgd2l0aCB0aGUgb25lcyBhbHJlYWR5IGJha2VkIGludG8gdGhlIHRleHR1cmVzLCBhbmQgdGhlIHNoYWRvdyBtYXBcclxuICAgIC8vIHdhcyBhIHJlYWwgY29zdCBwZXIgZnJhbWUuXHJcbiAgICBjb25zdCBoZWFkTGlnaHQgPSBuZXcgVEhSRUUuRGlyZWN0aW9uYWxMaWdodCgweGZmZmZmZiwgMC4zNSk7XHJcbiAgICBoZWFkTGlnaHQucG9zaXRpb24uc2V0KDAsIDAsIDEpO1xyXG4gICAgdGhpcy5jYW1lcmEuYWRkKGhlYWRMaWdodCk7XHJcbiAgICAvLyBBIGxpZ2h0IG9ubHkgY29udHJpYnV0ZXMgd2hpbGUgaXQgaXMgcGFydCBvZiB0aGUgc2NlbmUgZ3JhcGgsIGFuZCB0aGlzIG9uZSBoYW5ncyBvZmYgdGhlIGNhbWVyYS5cclxuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAvLyA1LiBTZXR1cCBDb250cm9scyAoZnJvbSBQT0MpXHJcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnJvdGF0ZVNwZWVkID0gMS4wO1xyXG4gICAgdGhpcy5jb250cm9scy5kYW1waW5nRmFjdG9yID0gMC4xO1xyXG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuY29udHJvbHMubW91c2VCdXR0b25zID0ge1xyXG4gICAgICBMRUZUOiBUSFJFRS5NT1VTRS5ST1RBVEUsXHJcbiAgICAgIE1JRERMRTogVEhSRUUuTU9VU0UuRE9MTFksXHJcbiAgICAgIFJJR0hUOiBUSFJFRS5NT1VTRS5QQU4sXHJcbiAgICB9O1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xyXG5cclxuICAgIC8vIEV2ZW50IGxpc3RlbmVycyBvbiBjb250cm9scyB0byBkaWZmZXJlbnRpYXRlIGRyYWdnaW5nIHZzIGNsaWNraW5nXHJcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge1xyXG4gICAgICB0aGlzLmlzRHJhZ2dpbmdUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSA9IHRydWU7XHJcbiAgICAgIH0sIDE1MCk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcclxuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuaXNEcmFnZ2luZ1RpbWVyKTtcclxuICAgICAgaWYgKHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xyXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gZmFsc2U7XHJcbiAgICAgICAgfSwgMjUwKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgLy8gSW50ZXJhY3Rpb24gRXZlbnQgTGlzdGVuZXJzIG9uIGNhbnZhc1xyXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vbk1vdXNlQ2xpY2suYmluZCh0aGlzKSwgZmFsc2UpO1xyXG4gICAgY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHRoaXMub25Nb3VzZU1vdmUuYmluZCh0aGlzKSwgZmFsc2UpO1xyXG5cclxuICAgIC8vIEVzY2FwZSBiYWNrcyBvdXQgb2YgcGxhY2VtZW50IGFuZCBjYWxpYnJhdGlvbi4gT24gdGhlIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgY2FudmFzLCB3aGljaFxyXG4gICAgLy8gd291bGQgbmVlZCBmb2N1cyB0aGUgdXNlciBoYXMgbm8gcmVhc29uIHRvIGhhdmUgZ2l2ZW4gaXQgLSB0aGV5IGFyZSBhaW1pbmcgd2l0aCB0aGUgbW91c2UuXHJcbiAgICAvLyBSZW1vdmVkIGZpcnN0IGJlY2F1c2UgdGhpcyBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uOiBpbml0KCkgcnVucyBhZ2FpbiBmb3IgZXZlcnkgY2FudmFzLCBhbmRcclxuICAgIC8vIHRoZSBwcmV2aW91cyByZWdpc3RyYXRpb24gd291bGQgb3RoZXJ3aXNlIHN0aWxsIGJlIGF0dGFjaGVkLlxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICB0aGlzLnBpY2tUYXJnZXQ/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGlja1RhcmdldCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWw/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBpY2tDYW1lcmEgPSB1bmRlZmluZWQ7XHJcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuXHJcbiAgICAvLyA2LiBTdGFydCB0aGUgcmVuZGVyIGxvb3BcclxuICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcclxuICAgICAgdGhpcy5hbmltYXRlKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBhdGggKHNlcnZlZCBieSB0aGUgYXBwKSBob2xkaW5nIGJhc2lzX3RyYW5zY29kZXIuanMvLndhc20sIHdoaWNoIEtUWDJMb2FkZXIgbmVlZHMgdG8gdHVyblxyXG4gICAqIEJhc2lzIFVuaXZlcnNhbCB0ZXh0dXJlcyBpbnRvIHdoYXRldmVyIGNvbXByZXNzZWQgZm9ybWF0IHRoZSBsb2NhbCBHUFUgYWN0dWFsbHkgc3VwcG9ydHMuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBrdHgyVHJhbnNjb2RlclBhdGggPSAnYXNzZXRzL2Jhc2lzLyc7XHJcblxyXG4gIC8qKiBPdmVycmlkZXMgd2hlcmUgdGhlIEJhc2lzIHRyYW5zY29kZXIgZmlsZXMgYXJlIHNlcnZlZCBmcm9tLiAqL1xyXG4gIHNldEt0eDJUcmFuc2NvZGVyUGF0aChwYXRoOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHRoaXMua3R4MlRyYW5zY29kZXJQYXRoID0gcGF0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIExvYWRzIGEgYmFzZSAzRCBtb2RlbCBpbiBHTFRGL0dMQiBmb3JtYXQgLSB0aGUgcHJlZmVycmVkIGZvcm1hdCBmb3IgbGFyZ2UgbW9kZWxzLlxyXG4gICAqIFVubGlrZSAub2JqLCBnZW9tZXRyeSBhcnJpdmVzIGFzIGJpbmFyeSB0eXBlZCBhcnJheXMgKG5vIHRleHQgcGFyc2luZyB0byBvZmZsb2FkIHRvIGEgd29ya2VyKVxyXG4gICAqIGFuZCBzdGF5cyBpbmRleGVkLCBzbyBmYXIgbGVzcyBkYXRhIHJlYWNoZXMgdGhlIEdQVS4gS1RYMiB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkIHRvbzogdGhleVxyXG4gICAqIHN0YXkgY29tcHJlc3NlZCBpbiBWUkFNIGluc3RlYWQgb2YgYmVpbmcgZGVjb2RlZCB0byByYXcgcGl4ZWxzIGxpa2UgSlBFRy9QTkcuXHJcbiAgICovXHJcbiAgbG9hZEdMVEZNb2RlbCh1cmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBjYWNoZUtleT86IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgbG9hZGVyID0gbmV3IEdMVEZMb2FkZXIoKTtcclxuXHJcbiAgICAvLyBLVFgyIG5lZWRzIHRoZSByZW5kZXJlciB0byByZXBvcnQgd2hpY2ggY29tcHJlc3NlZCBmb3JtYXRzIHRoaXMgR1BVIGFjY2VwdHMsIHNvIHRoaXMgaGFzIHRvXHJcbiAgICAvLyBoYXBwZW4gYWZ0ZXIgaW5pdCgpLiBHdWFyZGVkIHNvIGEgbW9kZWwgd2l0aG91dCBLVFgyIHRleHR1cmVzIHN0aWxsIGxvYWRzIGlmIGl0J3MgbWlzc2luZy5cclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3Qga3R4MkxvYWRlciA9IG5ldyBLVFgyTG9hZGVyKClcclxuICAgICAgICAgIC5zZXRUcmFuc2NvZGVyUGF0aCh0aGlzLmt0eDJUcmFuc2NvZGVyUGF0aClcclxuICAgICAgICAgIC5kZXRlY3RTdXBwb3J0KHRoaXMucmVuZGVyZXIpO1xyXG4gICAgICAgIGxvYWRlci5zZXRLVFgyTG9hZGVyKGt0eDJMb2FkZXIpO1xyXG4gICAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICAgIGNvbnNvbGUud2FybignVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBzZXQgdXAgS1RYMiB0ZXh0dXJlIHN1cHBvcnQsIGZhbGxpbmcgYmFjayB0byB1bmNvbXByZXNzZWQgdGV4dHVyZXMuJywgZXJyb3IpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICAvLyBMZXRzIGdsdGZwYWNrL2dsdGYtdHJhbnNmb3JtIG91dHB1dCB1c2luZyBFWFRfbWVzaG9wdF9jb21wcmVzc2lvbiBsb2FkIHdpdGhvdXQgZXh0cmEgc2V0dXAuXHJcbiAgICBsb2FkZXIuc2V0TWVzaG9wdERlY29kZXIoTWVzaG9wdERlY29kZXIpO1xyXG5cclxuICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KHRydWUpO1xyXG4gICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgwKTtcclxuXHJcbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBub3JtYWxzIG11c3QgZXhpc3QgYmVmb3JlIGFuaXNvdHJvcHksIGFuZCB0aGUgUGhvbmcgY29udmVyc2lvbiBoYXMgdG8gcnVuXHJcbiAgICAvLyBiZWZvcmUgc2lkZS9mbGF0U2hhZGluZyBhcmUgdG91Y2hlZCBzbyB0aG9zZSBzZXR0aW5ncyBsYW5kIG9uIHRoZSBtYXRlcmlhbHMgd2Uga2VlcC5cclxuICAgIGNvbnN0IG9uTG9hZGVkID0gKGdsdGY6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLmZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMuZW5zdXJlVmVydGV4Tm9ybWFscyhnbHRmLnNjZW5lKTtcclxuICAgICAgdGhpcy50dW5lVGV4dHVyZVNhbXBsaW5nKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShnbHRmLnNjZW5lLCBjYW1lcmFQb3NpdGlvbiwgcm90YXRpb24pO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cclxuICAgICAgaWYgKGVycm9yPy5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcclxuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xyXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxyXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcclxuICAgIC8vIHRoZSBtb2RlbC4gVGhlIGV4YWN0IHNhbWUgYnl0ZXMgZGVjb2RlZCB0aHJvdWdoIGFuIEhUTUxJbWFnZUVsZW1lbnQsIHdoaWNoIGlzIHdoYXQgdGhlIC5vYmpcclxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxyXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcclxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXHJcbiAgICAvLyBmb3IgdGhlIHdob2xlIGRvd25sb2FkLlxyXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxyXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcclxuICAgICAgLy8gYWN0dWFsbHkgcGFpbnRlZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmaW5hbCBwcm9ncmVzcyB1cGRhdGUgbmV2ZXIgcmVhY2hlcyB0aGUgc2NyZWVuIGFuZFxyXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4ge1xyXG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXHJcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cclxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxyXG4gICAqXHJcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXHJcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXHJcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXHJcbiAgICovXHJcbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxyXG4gICAqXHJcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcclxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxyXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgb25jZSB0aGUgYnJvd3NlciBoYXMgcGFpbnRlZCBhdCBsZWFzdCBvbmUgZnJhbWUuXHJcbiAgICpcclxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxyXG4gICAqIGVub3VnaCB0byBndWFyYW50ZWUgcGVuZGluZyBET00gY2hhbmdlcyBhcmUgb24gc2NyZWVuOyB0aGUgc2Vjb25kIGZpcmVzIGFmdGVyIHRoZSBmaXJzdCBmcmFtZVxyXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZnRlck5leHRQYWludCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxyXG4gICAqXHJcbiAgICogR0xURkxvYWRlci5sb2FkKCkgd291bGQgcmVwb3J0IHByb2dyZXNzIHRocm91Z2ggWEhSLCBidXQgdGhpcyBwYXRoIGRlbGliZXJhdGVseSB1c2VzIGZldGNoKCkgK1xyXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cclxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxyXG4gICAqIHN0cmVhbSByZXBvcnRzIGl0IGFzIGl0IGhhcHBlbnMgcmF0aGVyIHRoYW4gaW4gb25lIGp1bXAgYXQgdGhlIGVuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgIC8vIEEgbG9hZCBhbHJlYWR5IHJ1bm5pbmcgaXMgcmVwbGFjZWQsIG5vdCByYWNlZDogd2hpY2hldmVyIGZpbmlzaGVkIGxhc3Qgd291bGQgb3RoZXJ3aXNlIHdpbi5cclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xyXG4gICAgaWYgKGNhY2hlZCkge1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xyXG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcclxuXHJcbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cclxuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cclxuICAgIGlmICghcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKSB7XHJcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXHJcbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcclxuICAgIC8vIGFuIGF2b2lkYWJsZSAzMDArIE1CIHBlYWsuXHJcbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xyXG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcclxuICAgIGxldCB1c2luZ0J1ZmZlciA9IGJ1ZmZlciAhPT0gbnVsbDtcclxuICAgIGxldCByZWNlaXZlZCA9IDA7XHJcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cclxuICAgIC8vIGV2ZXJ5IG9uZSB3b3VsZCBydW4gY2hhbmdlIGRldGVjdGlvbiBqdXN0IGFzIG9mdGVuIHRvIG1vdmUgYSBiYXIgdGhhdCBpcyBtZWFzdXJlZCBpbiB3aG9sZVxyXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cclxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcclxuXHJcbiAgICBpZiAodG90YWwgPT09IDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDs7KSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcclxuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkICsgdmFsdWUubGVuZ3RoID4gdG90YWwpIHtcclxuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XHJcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cclxuICAgICAgICBjaHVua3MucHVzaChidWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpKTtcclxuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1c2luZ0J1ZmZlcikge1xyXG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcclxuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XHJcbiAgICAgICAgICBsYXN0UmVwb3J0ZWQgPSBwZXJjZW50O1xyXG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgc3RyZWFtIGNhbiBlbmQgYmVsb3cgdGhlIGFkdmVydGlzZWQgc2l6ZSAob3Igd2l0aCBubyBzaXplIGF0IGFsbCkuIExhbmQgb24gYSBmdWxsIGJhclxyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cclxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheUJ1ZmZlcjtcclxuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcclxuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcclxuICAgIH0gZWxzZSBpZiAodXNpbmdCdWZmZXIpIHtcclxuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXHJcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xyXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XHJcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcclxuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCBzdG9yZSwgb3IgbnVsbCB3aGVyZSB0aGUgYnJvd3NlciB3aWxsIG5vdCBnaXZlIHVzIG9uZS5cclxuICAgKlxyXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxyXG4gICAqIHdlYnZpZXdzLiBFdmVyeSBjYWxsZXIgdHJlYXRzIHRoYXQgYXMgYSBtaXNzIC0gY2FjaGluZyBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xyXG4gICAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXHJcbiAgICpcclxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxyXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXHJcbiAgICogbWlzc2VzIGZvciB0aGUgc2FtZSByZWFzb24sIHdoaWNoIGlzIHdoeSB0aGlzIGV4aXN0cyBhdCBhbGwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFjYWNoZUtleSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XHJcbiAgICAgIHJldHVybiBoaXQgPyBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKSA6IG51bGw7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIGEgbW9kZWwgZm9yIG5leHQgdGltZSwgZXZpY3RpbmcgdGhlIG9sZGVzdCBvbmNlIGEgZmV3IGFyZSBoZWxkLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWNhY2hlS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcclxuXHJcbiAgICAgIC8vIE1vZGVscyBydW4gdG8gaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBzbyB0aGlzIGNhbm5vdCBncm93IHdpdGhvdXQgbGltaXQuIENhY2hlIFN0b3JhZ2Uga2VlcHNcclxuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cclxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxyXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhY2hlIFN0b3JhZ2Uga2V5cyBvbiBhIFVSTCwgc28gdGhlIFMzIGtleSBpcyBleHByZXNzZWQgYXMgb25lLiBJdCBpcyBuZXZlciByZXF1ZXN0ZWQuICovXHJcbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml0cyB0aGUgY2FtZXJhJ3MgY2xpcHBpbmcgcGxhbmVzIHRvIGhvdyBiaWcgdGhlIG1vZGVsIGFjdHVhbGx5IGlzLlxyXG4gICAqXHJcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcclxuICAgKiBpcyBhIHJhdGlvIG9mIDEwMDAwMCBmb3IgYSBtb2RlbCBvbmx5IH4xMCB1bml0cyBhY3Jvc3MuIFRoYXQgd2FzdGVzIG1vc3Qgb2YgdGhlIGRlcHRoIGJ1ZmZlciBvblxyXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXHJcbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjAxO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4xO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xyXG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDtcclxuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTAwO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXHJcbiAgICpcclxuICAgKiBNZXNoU3RhbmRhcmRNYXRlcmlhbCBrZWVwcyBhIHNwZWN1bGFyIHJlZmxlY3Rpb24gZXZlbiBhdCBtZXRhbG5lc3MgMCwgc2luY2UgZXZlcnkgZGllbGVjdHJpY1xyXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxyXG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXHJcbiAgICogYW5nbGVzLCB3aGljaCBwYWludHMgd2hpdGUgaGlnaGxpZ2h0cyBvdmVyIHdpbmRvdyBmcmFtZXMgYW5kIHJvb2YgZWRnZXMgLSB0aGUgc2FtZSBtb2RlbFxyXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcclxuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXHJcbiAgICpcclxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xyXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XHJcblxyXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHBob25nID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcclxuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxyXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogc291cmNlLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcclxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxyXG4gICAgICAgICAgICBzaWRlOiBzb3VyY2Uuc2lkZSxcclxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXHJcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXHJcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxyXG4gICAgICAgIDogY29udmVydChtZXNoLm1hdGVyaWFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXHJcbiAgICpcclxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcclxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xyXG4gICAqIHNjYXR0ZXJlZCBob2xlcyB0aGF0IHNob3cgdGhlIHNjZW5lIGJhY2tncm91bmQgdGhyb3VnaCB0aGUgbW9kZWwuIEFnYWluc3QgYSBsaWdodCBiYWNrZ3JvdW5kXHJcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBEcmF3aW5nIGJvdGggc2lkZXMgY29zdHMgYSBsaXR0bGUgZmlsbCByYXRlIGJ1dCBpcyB3aGF0IG1ha2VzIGNhcHR1cmVkIGdlb21ldHJ5IHJlbmRlciBhc1xyXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xyXG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbCAmJiAhc2Vlbi5oYXMobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XHJcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cclxuICAgKlxyXG4gICAqIEEgZ2xURiB3aXRob3V0IGEgTk9STUFMIGF0dHJpYnV0ZSBpcyBzcGVjLWNvbXBsaWFudCwgYW5kIEdMVEZMb2FkZXIgaGFuZGxlcyBpdCBieSBzd2l0Y2hpbmcgdGhlXHJcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXHJcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcclxuICAgKiBjYXB0dXJlIG1lc2hlcyBhcmUgZnVsbCBvZjogdGhlIGZhY2UgaGFzIGFsbW9zdCBubyBhcmVhLCB0aGUgZGVyaXZlZCBub3JtYWwgaXMgbWVhbmluZ2xlc3MsIGFuZFxyXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxyXG4gICAqXHJcbiAgICogQ29tcHV0aW5nIG5vcm1hbHMgZnJvbSB0aGUgZ2VvbWV0cnkgaW5zdGVhZCBpcyByb2J1c3QgdG8gdGhvc2UgdHJpYW5nbGVzLCBzaW5jZSBhIGRlZ2VuZXJhdGVcclxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGVuc3VyZVZlcnRleE5vcm1hbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeTtcclxuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XHJcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXHJcbiAgICpcclxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xyXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXHJcbiAgICogc21hbGxlciB0aGUgbGV2ZWwgZ2V0cyAtIGFuZCB2aWV3aW5nIHRoZSB3aG9sZSBtb2RlbCBhdCBvbmNlIHVzZXMgdGhlIHNtYWxsZXN0IGxldmVscywgcGFpbnRpbmdcclxuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcclxuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXHJcbiAgICpcclxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xyXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XHJcbiAgICBpZiAoIW1heEFuaXNvdHJvcHkgfHwgbWF4QW5pc290cm9weSA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XHJcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhbWUgdGV4dHVyZSBpcyByZXVzZWQgYWNyb3NzIHRoZSBtb2RlbCdzIG1hdGVyaWFsczsgb25seSB0b3VjaCBlYWNoIG9uZSBvbmNlLlxyXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xyXG4gICAgICAgICAgaWYgKHRleHR1cmUgJiYgIXNlZW4uaGFzKHRleHR1cmUpKSB7XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXHJcbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXHJcbiAgICogc2V0T2JqUGFyc2VyV29ya2VyIChzZWUgdGhlcmUgZm9yIHdoeSB0aGUgYXBwLCBub3QgdGhpcyBsaWJyYXJ5LCBwcm92aWRlcyBpdCk7IHRoaXMga2VlcHNcclxuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cclxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IGJhc2VQYXRoID0gbXRsVXJsLnN1YnN0cmluZygwLCBtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xyXG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9ialBhcnNlcldvcmtlcikge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxyXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcclxuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZUxvYWRlZE9iamVjdEluU2NlbmUob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9KTogdm9pZCB7XHJcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcclxuXHJcbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxyXG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXHJcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcclxuXHJcbiAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm1vZGVsUm9vdCA9IG9iamVjdDtcclxuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxyXG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcclxuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xyXG4gICAgZ3JvdXAuYWRkKGNlbnRlcmVkKTtcclxuICAgIGdyb3VwLnNjYWxlLnNldFNjYWxhcihzY2FsZSk7XHJcblxyXG4gICAgdGhpcy5zY2VuZS5hZGQoZ3JvdXApO1xyXG5cclxuICAgIC8vIFRhZ3MgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIG1vZGVsIGZpbmlzaGVkIGxvYWRpbmcgd2VyZSBzaXplZCBhZ2FpbnN0IHRoZSBvbGQgc2NhbGUuXHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKSk7XHJcblxyXG4gICAgdGhpcy5hZGp1c3RDbGlwcGluZ1BsYW5lcygoc2l6ZS5sZW5ndGgoKSAvIDIpICogc2NhbGUpO1xyXG5cclxuICAgIGlmIChjYW1lcmFQb3NpdGlvbikge1xyXG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoY2FtZXJhUG9zaXRpb24ueCwgY2FtZXJhUG9zaXRpb24ueSwgY2FtZXJhUG9zaXRpb24ueik7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNSwgMTUpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxyXG4gICAqXHJcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXHJcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXHJcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcclxuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXHJcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cclxuICAgKi9cclxuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxyXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXHJcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxyXG4gICAqL1xyXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5hbGlnbmluZyA9IHRydWU7XHJcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiAndGFnJyB9KTtcclxuICB9XHJcblxyXG4gIGNhbmNlbFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdhc0FsaWduaW5nID0gdGhpcy5hbGlnbmluZztcclxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMgPSBbXTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiBudWxsIH0pO1xyXG4gICAgaWYgKHdhc0FsaWduaW5nKSB7XHJcbiAgICAgIHRoaXMuYWxpZ25tZW50Q2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBpc0FsaWduaW5nVGFncygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLmFsaWduaW5nO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hldGhlciB0aGUgcG9pbnRlciBzaG91bGQgYmUgc2hvd2luZyB0aGUgcGxhY2VtZW50IGdob3N0LlxyXG4gICAqXHJcbiAgICogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgdGFnLCBhbmQgd2hpbGUgY2FsaWJyYXRpbmcgb25jZSBhIHRhZyBoYXMgYmVlbiBwaWNrZWQgLSB0aGF0IHNlY29uZCBjbGlja1xyXG4gICAqIGlzIHRoZSBzYW1lIHF1ZXN0aW9uIChcIndoZXJlIG9uIHRoZSBtb2RlbD9cIikgYW5kIGRlc2VydmVzIHRoZSBzYW1lIGFpbWluZyBhaWQuIE5vdCB0cnVlIGZvciB0aGVcclxuICAgKiBmaXJzdCBoYWxmIG9mIGEgcGFpciwgd2hpY2ggaXMgYSBjbGljayBvbiBhIHRhZywgbm90IG9uIHRoZSBtb2RlbC5cclxuICAgKi9cclxuICBwcml2YXRlIGlzUHJldmlld2luZ1BsYWNlbWVudCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWcgfHwgKHRoaXMuYWxpZ25pbmcgJiYgISF0aGlzLmFsaWdubWVudFNvdXJjZSk7XHJcbiAgfVxyXG5cclxuICAvKiogV2hldGhlciBhIHRhZyBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LiAqL1xyXG4gIGhhc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMudGFnU3ByaXRlcy5oYXMoZWxlbWVudElkKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcclxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxyXG4gICAqL1xyXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGFsaWdubWVudCA9IHNvbHZlVGhyZWVKc0FsaWdubWVudCh0aGlzLmFsaWdubWVudFBhaXJzKTtcclxuICAgIGlmICghYWxpZ25tZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZXRUYWdBbGlnbm1lbnQoYWxpZ25tZW50KTtcclxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIHJldHVybiBhbGlnbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKiogSGFuZGxlcyBhIGNsaWNrIHdoaWxlIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2ggaXMgcnVubmluZy4gKi9cclxuICBwcml2YXRlIGhhbmRsZUFsaWdubWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYWxpZ25tZW50U291cmNlKSB7XHJcbiAgICAgIC8vIEZpcnN0IGhhbGYgb2YgYSBwYWlyOiB3aGljaCB0YWcgYXJlIHdlIHRhbGtpbmcgYWJvdXQ/XHJcbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy50YWdHcm91cC5jaGlsZHJlbiwgZmFsc2UpWzBdO1xyXG4gICAgICBpZiAoIWhpdCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxyXG4gICAgICAvLyBhcHBsaWVkIC0gdGhhdCB0cmFuc2Zvcm0gbGl2ZXMgb24gdGhlIGdyb3VwLCBub3Qgb24gdGhlIHNwcml0ZS5cclxuICAgICAgY29uc3Qgc3RvcmVkID0gaGl0Lm9iamVjdC5wb3NpdGlvbjtcclxuICAgICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSB7IHg6IHN0b3JlZC54LCB5OiBzdG9yZWQueSwgejogc3RvcmVkLnogfTtcclxuICAgICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgICAgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLFxyXG4gICAgICAgIGF3YWl0aW5nOiAncG9pbnQnLFxyXG4gICAgICAgIHRhZ0lkOiBoaXQub2JqZWN0Lm5hbWUsXHJcbiAgICAgIH0pO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxyXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5waWNrQWxpZ25tZW50VGFyZ2V0KGV2ZW50KTtcclxuICAgIGlmICghdGFyZ2V0KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMucHVzaCh7IHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIC8vIFRoZSBnaG9zdCBiZWxvbmdzIHRvIHRoZSBjbGljayB0aGF0IGp1c3QgaGFwcGVuZWQ7IHRoZSBuZXh0IGhhbGYgaXMgYSBjbGljayBvbiBhIHRhZy5cclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xyXG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXHJcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzID8gbnVsbCA6ICd0YWcnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQXJtcyB0YWcgcGxhY2VtZW50OiB0aGUgbmV4dCBjbGljayBvbiB0aGUgbW9kZWwgZHJvcHMgYSB0YWcgaW5zdGVhZCBvZiBiZWluZyBpZ25vcmVkLiAqL1xyXG4gIHN0YXJ0VGFnUGxhY2VtZW50KHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsID0gbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcclxuICAgIHRoaXMucGxhY2VtZW50UG9pVHlwZSA9IHBvaVR5cGU7XHJcbiAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIExlYXZlcyBwbGFjZW1lbnQgbW9kZSB3aXRob3V0IHBsYWNpbmcgYW55dGhpbmcuICovXHJcbiAgY2FuY2VsVGFnUGxhY2VtZW50KCk6IHZvaWQge1xyXG4gICAgdGhpcy5wbGFjaW5nVGFnID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBudWxsO1xyXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNob3dzIGEgdHJhbnNsdWNlbnQgdGFnIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZywgc28gdGhlIHNwb3QgaXMgdmlzaWJsZSBiZWZvcmUgY29tbWl0aW5nLlxyXG4gICAqXHJcbiAgICogTWF0dGVycG9ydCBkb2VzIHRoaXMgd2l0aCBhIHRhZyB0aGF0IGZvbGxvd3MgdGhlIHBvaW50ZXI7IHRoZSBlcXVpdmFsZW50IGhlcmUgaXMgYSBwcmV2aWV3XHJcbiAgICogc3ByaXRlIHRoYXQgZ2V0cyByZW1vdmVkIHRoZSBtb21lbnQgdGhlIHJlYWwgdGFnIHRha2VzIGl0cyBwbGFjZS5cclxuICAgKi9cclxuICBwcml2YXRlIHVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5waWNrUG9pbnRPbkdwdShldmVudCk7XHJcbiAgICBpZiAoIXBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcclxuICAgIGlmICghdGhpcy5wbGFjZW1lbnRQcmV2aWV3KSB7XHJcbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IG5ldyBUSFJFRS5TcHJpdGUoXHJcbiAgICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcclxuICAgICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKCcjOUU5RTlFJyksXHJcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICBvcGFjaXR5OiAwLjYsXHJcbiAgICAgICAgfSlcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnJlbmRlck9yZGVyID0gOTk5O1xyXG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xyXG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcclxuICAgIH1cclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBwb2ludCB1bmRlciB0aGUgY3Vyc29yLCByZWFkIGZyb20gdGhlIGRlcHRoIGJ1ZmZlciBpbnN0ZWFkIG9mIHJheWNhc3QsIGluIHRhZyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEEgcmF5Y2FzdCB3YWxrcyBldmVyeSB0cmlhbmdsZSBvZiB0aGUgbWVzaCBpdCBoaXRzOiBvbiBhIGNhcHR1cmVkIG1vZGVsIHRoYXQgaXMgbWlsbGlvbnMgb2ZcclxuICAgKiB0aGVtLCB0ZW5zIG9mIG1pbGxpc2Vjb25kcywgZXZlcnkgdGltZSB0aGUgcG9pbnRlciBtb3Zlcy4gQ29hbGVzY2luZyB0byBvbmUgcGVyIGZyYW1lIGRpZCBub3RcclxuICAgKiBoZWxwLCBiZWNhdXNlIHRoZSBjb3N0IGlzIHRoZSBwaWNrIGl0c2VsZiAtIGl0IHNpbXBseSBiZWNhbWUgb25lIHNsb3cgZnJhbWUgaW5zdGVhZCBvZiBzZXZlcmFsLlxyXG4gICAqXHJcbiAgICogUmVuZGVyaW5nIHRoZSBtb2RlbCdzIGRlcHRoIGludG8gYSBzaW5nbGUgcGl4ZWwgdW5kZXIgdGhlIGN1cnNvciBhbnN3ZXJzIHRoZSBzYW1lIHF1ZXN0aW9uIG9uXHJcbiAgICogdGhlIEdQVSBpbiBjb25zdGFudCB0aW1lLCB3aGF0ZXZlciB0aGUgbW9kZWwncyBzaXplLiBUaGUgY2FtZXJhJ3MgdmlldyBvZmZzZXQgaXMgd2hhdCBuYXJyb3dzXHJcbiAgICogdGhlIHdob2xlIGltYWdlIGRvd24gdG8gdGhhdCBvbmUgcGl4ZWwsIHNvIHRoZSB2YWx1ZSByZWFkIGJhY2sgaXMgdGhlIGRlcHRoIHRoZSBjdXJzb3IgaXMgb3Zlci5cclxuICAgKlxyXG4gICAqIFVzZWQgZm9yIHRoZSBnaG9zdCBvbmx5LiBUaGUgY2xpY2sgdGhhdCBhY3R1YWxseSBwbGFjZXMgYSB0YWcgc3RpbGwgcmF5Y2FzdHM6IGl0IGlzIG9uZSBwaWNrLFxyXG4gICAqIGl0cyBjb3N0IGRvZXMgbm90IG1hdHRlciwgYW5kIGl0IHlpZWxkcyB0aGUgc3VyZmFjZSBub3JtYWwsIHdoaWNoIGRlcHRoIGFsb25lIGNhbm5vdCBnaXZlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja1BvaW50T25HcHUoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5WZWN0b3IzIHwgbnVsbCB7XHJcbiAgICBpZiAoIXRoaXMubW9kZWxSb290IHx8ICF0aGlzLnJlbmRlcmVyIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMucGlja1RhcmdldCkge1xyXG4gICAgICB0aGlzLnBpY2tUYXJnZXQgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQoMSwgMSk7XHJcbiAgICAgIHRoaXMucGlja0NhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgpO1xyXG4gICAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcclxuICAgICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoRGVwdGhNYXRlcmlhbCh7XHJcbiAgICAgICAgZGVwdGhQYWNraW5nOiBUSFJFRS5SR0JBRGVwdGhQYWNraW5nLFxyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgeCA9IGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQ7XHJcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xyXG4gICAgaWYgKHggPCAwIHx8IHkgPCAwIHx8IHggPiByZWN0LndpZHRoIHx8IHkgPiByZWN0LmhlaWdodCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnBpY2tDYW1lcmEuY29weSh0aGlzLmNhbWVyYSk7XHJcbiAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcclxuICAgIC8vIFJlbmRlcnMgdGhlIG9uZSBwaXhlbCB0aGUgY3Vyc29yIGlzIG92ZXIgYXMgaWYgaXQgd2VyZSB0aGUgd2hvbGUgaW1hZ2UgLSBvZmZzZXQgYnkgaGFsZiBhXHJcbiAgICAvLyBwaXhlbCBzbyB0aGUgY3Vyc29yIHNpdHMgYXQgdGhhdCBwaXhlbCdzIGNlbnRyZSwgd2hpY2ggaXMgd2hlcmUgTkRDICgwLCAwKSBsYW5kcy5cclxuICAgIHRoaXMucGlja0NhbWVyYS5zZXRWaWV3T2Zmc2V0KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCB4IC0gMC41LCB5IC0gMC41LCAxLCAxKTtcclxuXHJcbiAgICAvLyBXaGVyZSB0aGUgbW9kZWwgaXMgbm90LCB0aGUgcGl4ZWwgbXVzdCByZWFkIGFzIFwibm90aGluZ1wiLCBzbyBpdCBpcyBjbGVhcmVkIHRvIHdoaXRlIC0gYSB2YWx1ZVxyXG4gICAgLy8gbm8gcmVhbCBkZXB0aCBwYWNrcyB0by4gVHdvIHRoaW5ncyB3b3VsZCBvdGhlcndpc2UgcGFpbnQgb3ZlciB0aGF0OiB0aGUgZGVmYXVsdCBibGFjayBjbGVhcixcclxuICAgIC8vIHdoaWNoIGRlY29kZXMgYXMgZGVwdGggMCAoYSBoaXQgYWdhaW5zdCB0aGUgbGVucyksIGFuZCB0aGUgc2NlbmUgYmFja2dyb3VuZCwgd2hpY2ggdGhyZWUuanNcclxuICAgIC8vIGRyYXdzIGluIHBsYWNlIG9mIHRoZSBjbGVhciBjb2xvdXIgd2hlbmV2ZXIgb25lIGlzIHNldC5cclxuICAgIGNvbnN0IHByZXZpb3VzQ2xlYXJDb2xvciA9IHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcihuZXcgVEhSRUUuQ29sb3IoKSk7XHJcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQWxwaGEgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQWxwaGEoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzVGFyZ2V0ID0gdGhpcy5yZW5kZXJlci5nZXRSZW5kZXJUYXJnZXQoKTtcclxuICAgIGNvbnN0IHByZXZpb3VzQmFja2dyb3VuZCA9IHRoaXMuc2NlbmUuYmFja2dyb3VuZDtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBudWxsO1xyXG4gICAgdGhpcy5zY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gdGhpcy5waWNrRGVwdGhNYXRlcmlhbDtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweGZmZmZmZiwgMSk7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldCh0aGlzLnBpY2tUYXJnZXQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5jbGVhcigpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5waWNrQ2FtZXJhKTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHModGhpcy5waWNrVGFyZ2V0LCAwLCAwLCAxLCAxLCB0aGlzLnBpY2tQaXhlbCk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQocHJldmlvdXNUYXJnZXQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKHByZXZpb3VzQ2xlYXJDb2xvciwgcHJldmlvdXNDbGVhckFscGhhKTtcclxuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7XHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBwcmV2aW91c0JhY2tncm91bmQ7XHJcblxyXG4gICAgY29uc3QgW3IsIGcsIGIsIGFdID0gdGhpcy5waWNrUGl4ZWw7XHJcbiAgICBpZiAociA9PT0gMjU1ICYmIGcgPT09IDI1NSAmJiBiID09PSAyNTUgJiYgYSA9PT0gMjU1KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRocmVlJ3MgcGFja0RlcHRoVG9SR0JBLCB3aGljaCBzdG9yZXMgdGhlIHZhbHVlIGl0c2VsZiBpbiBhbHBoYSBhbmQgZXZlciBmaW5lclxyXG4gICAgLy8gZnJhY3Rpb25zIG9mIGl0IGluIGJsdWUsIGdyZWVuIGFuZCByZWQgLSBhbHBoYSBpcyB0aGUgbW9zdCBzaWduaWZpY2FudCBieXRlLCBub3QgcmVkLiBSZWFkIHRoZVxyXG4gICAgLy8gb3RoZXIgd2F5IHJvdW5kLCB0aGUgcmVzdWx0IGlzIG1vc3RseSB0aGUgbG93LW9yZGVyIG5vaXNlLCBvZnRlbiBuZWFyIHplcm8sIHdoaWNoIHVucHJvamVjdHNcclxuICAgIC8vIG9udG8gdGhlIG5lYXIgcGxhbmU6IGEgZ2hvc3QgcHJlc3NlZCBhZ2FpbnN0IHRoZSBsZW5zLCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4uXHJcbiAgICBjb25zdCBkb3duc2NhbGUgPSAyNTUgLyAyNTY7XHJcbiAgICBjb25zdCBkZXB0aCA9XHJcbiAgICAgIChyIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYgKiAyNTYpICtcclxuICAgICAgKGcgLyAyNTUpICogZG93bnNjYWxlIC8gKDI1NiAqIDI1NikgK1xyXG4gICAgICAoYiAvIDI1NSkgKiBkb3duc2NhbGUgLyAyNTYgK1xyXG4gICAgICAoYSAvIDI1NSkgKiBkb3duc2NhbGU7XHJcblxyXG4gICAgLy8gTkRDIHggYW5kIHkgYXJlIHplcm8gYmVjYXVzZSB0aGUgcGl4ZWwgcmVhZCBpcyB0aGUgY2VudHJlIG9mIHRoYXQgb25lLXBpeGVsIGltYWdlIC0gd2hpY2ggb25seVxyXG4gICAgLy8gaG9sZHMgd2hpbGUgdGhlIHZpZXcgb2Zmc2V0IGlzIGluIGVmZmVjdC4gQ2xlYXJpbmcgaXQgZmlyc3Qgd291bGQgdW5wcm9qZWN0IHRocm91Z2ggdGhlIGZ1bGxcclxuICAgIC8vIHZpZXcgaW5zdGVhZCwgbGFuZGluZyB0aGUgcG9pbnQgb24gdGhlIHJheSB0aHJvdWdoIHRoZSBtaWRkbGUgb2YgdGhlIHNjcmVlbi4gVGhlIG9mZnNldCBpc1xyXG4gICAgLy8gc2ltcGx5IHJlcGxhY2VkIGJ5IHRoZSBuZXh0IHBpY2ssIHNvIGl0IGlzIG5ldmVyIGNsZWFyZWQuXHJcbiAgICBjb25zdCB3b3JsZCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIGRlcHRoICogMiAtIDEpLnVucHJvamVjdCh0aGlzLnBpY2tDYW1lcmEpO1xyXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVXb3JsZE1hdHJpeCh0cnVlLCBmYWxzZSk7XHJcbiAgICByZXR1cm4gdGhpcy50YWdHcm91cC53b3JsZFRvTG9jYWwod29ybGQpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcgPSB1bmRlZmluZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogU2hvd3Mgb3IgaGlkZXMgb25lIHRhZywgbGVhdmluZyBpdCByZWdpc3RlcmVkIHNvIGl0IGNhbiBiZSBicm91Z2h0IGJhY2sgd2l0aG91dCByZWxvYWRpbmcuICovXHJcbiAgc2V0VGFnVmlzaWJpbGl0eShlbGVtZW50SWQ6IHN0cmluZywgdmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKHNwcml0ZSkge1xyXG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIHR5cGVzLCBoaWRpbmcgdGhlIHJlc3QuXHJcbiAgICpcclxuICAgKiBQYXNzaW5nIG51bGwgc2hvd3MgZXZlcnl0aGluZyAtIHRoZSBcIm5vIGZpbHRlclwiIHN0YXRlLCBkaXN0aW5jdCBmcm9tIGFuIGVtcHR5IGFycmF5LCB3aGljaCBpcyBhXHJcbiAgICogZmlsdGVyIHRoYXQgaGFwcGVucyB0byBtYXRjaCBub3RoaW5nLlxyXG4gICAqL1xyXG4gIHNldFZpc2libGVUYWdUeXBlcyh0eXBlczogUG9pVHlwZVtdIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xyXG4gICAgICBzcHJpdGUudmlzaWJsZSA9IHR5cGVzID09PSBudWxsIHx8IHR5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXHJcbiAgICpcclxuICAgKiBBbmltYXRlZCByYXRoZXIgdGhhbiB0ZWxlcG9ydGVkOiBqdW1waW5nIHRoZSBjYW1lcmEgbG9zZXMgdGhlIHZpZXdlcidzIHNlbnNlIG9mIHdoZXJlIHRoZXkgd2VyZVxyXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcclxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XHJcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxyXG4gICAgICA6IDU7XHJcblxyXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXHJcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xyXG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXHJcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcclxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcclxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcclxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcclxuICAgICAgZHVyYXRpb25NczogNjAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xyXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xyXG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xyXG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxyXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xyXG5cclxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xyXG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cclxuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXHJcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxyXG4gICAqXHJcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcclxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxyXG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXHJcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcclxuICAgIGlmICghaGl0KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XHJcblxyXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XHJcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxyXG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxyXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xyXG4gICAgaWYgKGhpdC5mYWNlKSB7XHJcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxyXG4gICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxyXG4gICAgICAgIC5ub3JtYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXHJcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cclxuICAgKlxyXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcclxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXHJcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXHJcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XHJcbiAgICBpZiAoIWhpdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcclxuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcclxuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcclxuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxyXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXHJcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXHJcbiAgICovXHJcbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xyXG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XHJcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcclxuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xyXG5cclxuICAgIC8vIFRhZyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgd29ybGQgc2NhbGUgaXQgaW5oZXJpdHMsIHdoaWNoIHRoaXMgY2FsbCBqdXN0IGNoYW5nZWQuXHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIGEgdGFnLCBvciBtb3Zlcy9yZXN0eWxlcyB0aGUgb25lIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdGhpcyBlbGVtZW50LlxyXG4gICAqXHJcbiAgICogVXBzZXJ0IHJhdGhlciB0aGFuIGEgZGVjbGFyYXRpdmUgXCJoZXJlIGlzIHRoZSBmdWxsIGxpc3RcIiBjYWxsLCBiZWNhdXNlIHRhZ3MgYXJyaXZlIHBlciB0eXBlXHJcbiAgICogKGVxdWlwbWVudCwgdGhlbiB0aWNrZXRzLCB0aGVuIG1lYXN1cmVtZW50cy4uLikgZnJvbSBzZXBhcmF0ZSBzdWJzY3JpcHRpb25zIC0gcmVwbGFjaW5nIHRoZSBzZXRcclxuICAgKiBvbiBlYWNoIG9mIHRob3NlIHdvdWxkIHdpcGUgdGhlIHR5cGVzIHRoYXQgY2FtZSBiZWZvcmUuXHJcbiAgICovXHJcbiAgdXBzZXJ0VGFnKHRhZzogVGhyZWVKc1RhZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KHRhZy5pZCk7XHJcbiAgICBpZiAoZXhpc3RpbmcpIHtcclxuICAgICAgZXhpc3RpbmcucG9zaXRpb24uc2V0KHRhZy5wb3NpdGlvbi54LCB0YWcucG9zaXRpb24ueSwgdGFnLnBvc2l0aW9uLnopO1xyXG4gICAgICBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZTtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEubGFiZWwgPSB0YWcubGFiZWwgPz8gZXhpc3RpbmcudXNlckRhdGEubGFiZWw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzcHJpdGUgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKHRhZy5jb2xvciksXHJcbiAgICAgICAgLy8gVGFncyByZWFkIGFzIFVJIHJhdGhlciB0aGFuIGdlb21ldHJ5LCBzbyB0aGV5IHN0YXkgdmlzaWJsZSB0aHJvdWdoIHRoZSBtb2RlbCBpbnN0ZWFkIG9mXHJcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYS5cclxuICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgICB9KVxyXG4gICAgKTtcclxuICAgIHNwcml0ZS5uYW1lID0gdGFnLmlkO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IG51bGw7XHJcbiAgICBzcHJpdGUucG9zaXRpb24uc2V0KHRhZy5wb3NpdGlvbi54LCB0YWcucG9zaXRpb24ueSwgdGFnLnBvc2l0aW9uLnopO1xyXG4gICAgc3ByaXRlLnJlbmRlck9yZGVyID0gOTk5O1xyXG4gICAgdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSk7XHJcblxyXG4gICAgdGhpcy50YWdHcm91cC5hZGQoc3ByaXRlKTtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5zZXQodGFnLmlkLCBzcHJpdGUpO1xyXG5cclxuICAgIGlmICh0YWcuaWNvblVybCkge1xyXG4gICAgICB0aGlzLmFwcGx5VGFnSWNvbihzcHJpdGUsIHRhZy5pY29uVXJsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIHRoZSB0YWcgcmVnaXN0ZXJlZCBmb3IgYW4gZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLiAqL1xyXG4gIHJlbW92ZVRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKCFzcHJpdGUpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUoc3ByaXRlKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZGVsZXRlKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBldmVyeSB0YWcgZnJvbSB0aGUgc2NlbmUuICovXHJcbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xyXG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXHJcbiAgcHJpdmF0ZSBhcHBseVRhZ0ljb24oc3ByaXRlOiBUSFJFRS5TcHJpdGUsIGljb25Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxyXG4gICAgICBpY29uVXJsLFxyXG4gICAgICAodGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgICgpID0+IGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBsb2FkIHRhZyBpY29uIFwiJHtpY29uVXJsfVwiLCBrZWVwaW5nIHRoZSBkZWZhdWx0IG1hcmtlci5gKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cclxuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcclxuICAgIGNvbnN0IHNpemUgPSAxMjg7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XHJcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xyXG5cclxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2l6ZXMgYSB0YWcgcmVsYXRpdmUgdG8gdGhlIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cclxuICAgKiBhIGxhcmdlIG1vZGVsIGFuZCBodWdlIG9uIGEgc21hbGwgb25lLiBEaXZpZGluZyBieSB0aGUgZ3JvdXAncyB3b3JsZCBzY2FsZSBrZWVwcyB0YWdzIHRoZSBzYW1lXHJcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xyXG4gICAgY29uc3Qgd29ybGRTY2FsZSA9IHRoaXMudGFnR3JvdXAuZ2V0V29ybGRTY2FsZShuZXcgVEhSRUUuVmVjdG9yMygpKS54IHx8IDE7XHJcbiAgICBjb25zdCBzaXplID0gMC40IC8gd29ybGRTY2FsZTtcclxuICAgIHNwcml0ZS5zY2FsZS5zZXQoc2l6ZSwgc2l6ZSwgMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBZGRzIHNlY29uZGFyeSBpbnRlcmFjdGl2ZSBvYmplY3RzIChlLmcuLCBQT0lzLCBzZW5zb3JzKSB0byB0aGUgc2NlbmUuXHJcbiAgICovXHJcbiAgdXBkYXRlT2Jqc1RvU2NlbmUob2Jqc0FkZGVkOiBPYmpBZGRlZFtdKTogdm9pZCB7XHJcbiAgICBjb25zdCBleGlzdGluZ0lkcyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5tYXAoKG9iaikgPT4gb2JqLm5hbWUpO1xyXG4gICAgY29uc3Qgb2JqTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xyXG5cclxuICAgIC8vIGRlbGV0ZSBvYmplY3RzIHRoYXQgYXJlIG5vdCBpbiB0aGUgcHJvdmlkZWQgYXJyYXlcclxuICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cy5mb3JFYWNoKChvYmopID0+IHtcclxuICAgICAgaWYgKCFvYmpzQWRkZWQuZmluZCgob2JqRGF0YSkgPT4gb2JqRGF0YS5pZCA9PT0gb2JqLm5hbWUpKSB7XHJcbiAgICAgICAgdGhpcy5zY2VuZS5yZW1vdmUob2JqKTtcclxuICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMgPSB0aGlzLmNsaWNrYWJsZU9iamVjdHMuZmlsdGVyKFxyXG4gICAgICAgICAgKG9iamVjdCkgPT4gb2JqZWN0Lm5hbWUgIT09IG9iai5uYW1lXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgb2Jqc0FkZGVkLmZvckVhY2goKG9iamVjdERhdGE6IE9iakFkZGVkKSA9PiB7XHJcbiAgICAgIGlmICghZXhpc3RpbmdJZHMuaW5jbHVkZXMob2JqZWN0RGF0YS5pZCkpIHtcclxuICAgICAgICBvYmpMb2FkZXIubG9hZChvYmplY3REYXRhLmZpbGUsIChuZXdPYmplY3QpID0+IHtcclxuICAgICAgICAgIG5ld09iamVjdC5uYW1lID0gb2JqZWN0RGF0YS5pZDtcclxuXHJcbiAgICAgICAgICBuZXdPYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgICAgICAgIGlmICgoY2hpbGQgYXMgVEhSRUUuTWVzaCkuaXNNZXNoKSB7XHJcbiAgICAgICAgICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgICAgICAgICAgaWYgKG1lc2gubWF0ZXJpYWwgaW5zdGFuY2VvZiBUSFJFRS5NYXRlcmlhbCkge1xyXG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjg7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAvLyBzZXQgb2JqZWN0IHBvc2l0aW9uIGFuZCByb3RhdGlvblxyXG4gICAgICAgICAgbmV3T2JqZWN0LnBvc2l0aW9uLnNldChcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi54LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnksXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24uelxyXG4gICAgICAgICAgKTtcclxuICAgICAgICAgIFxyXG4gICAgICAgICAgLy8gVGhlIEpTT04gY29uZmlndXJhdGlvbiBoYXMgcm90YXRpb24gYWxyZWFkeSBpbiByYWRpYW5zIChlLmcuIDMuMTQxNS4uLilcclxuICAgICAgICAgIG5ld09iamVjdC5yb3RhdGlvbi5zZXQoXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueCxcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi55LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnpcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgbmV3T2JqZWN0LnNjYWxlLnNldChvYmplY3REYXRhLnNjYWxlLngsIG9iamVjdERhdGEuc2NhbGUueSwgb2JqZWN0RGF0YS5zY2FsZS56KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnNjZW5lLmFkZChuZXdPYmplY3QpO1xyXG4gICAgICAgICAgdGhpcy5jbGlja2FibGVPYmplY3RzLnB1c2gobmV3T2JqZWN0KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xyXG4gICAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgICB0aGlzLm1vdXNlLnggPSAoKGV2ZW50LmNsaWVudFggLSByZWN0LmxlZnQpIC8gcmVjdC53aWR0aCkgKiAyIC0gMTtcclxuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBXaGlsZSB0aGUgZ2hvc3QgaXMgdXAgaXQgZm9sbG93cyB0aGUgcG9pbnRlciBhbmQgbm90aGluZyBlbHNlIHNob3VsZCByZWFjdCB0byBpdC4gVGhlIG1vdmVcclxuICAgICAgLy8gaXMgb25seSByZWNvcmRlZCBoZXJlOiBwb2ludGVyIGV2ZW50cyBmaXJlIGZhciBtb3JlIG9mdGVuIHRoYW4gZnJhbWVzLCBhbmQgcGlja2luZyBhIHBvaW50XHJcbiAgICAgIC8vIGNvc3RzIGEgcmF5Y2FzdCBhZ2FpbnN0IHRoZSB3aG9sZSBtb2RlbCwgc28gZG9pbmcgaXQgcGVyIGV2ZW50IGlzIHdoYXQgbWFkZSB0aGUgZ2hvc3QgdHJhaWxcclxuICAgICAgLy8gYmVoaW5kIHRoZSBjdXJzb3IuIFRoZSByZW5kZXIgbG9vcCBwaWNrcyB1cCB0aGUgbGF0ZXN0IHBvc2l0aW9uLCBvbmNlLCBwZXIgZnJhbWUuXHJcbiAgICAgIGlmICh0aGlzLmlzUHJldmlld2luZ1BsYWNlbWVudCgpKSB7XHJcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gZXZlbnQ7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBOb3QgcHJldmlld2luZyBhbnkgbW9yZSAoYSBwYWlyIHdhcyBqdXN0IGNvbXBsZXRlZCwgc2F5KTogZHJvcCBhIGdob3N0IGxlZnQgb3ZlciBmcm9tIGl0LlxyXG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuXHJcbiAgICAgIC8vIFRhZ3MgZmlyc3Q6IHRoZXkgZHJhdyBvbiB0b3Agb2YgdGhlIG1vZGVsLCBzbyB0aGV5IGhhdmUgdG8gYW5zd2VyIHRoZSBwb2ludGVyIGZpcnN0IHRvby5cclxuICAgICAgY29uc3QgaG92ZXJlZFRhZyA9IHRoaXMucmF5Y2FzdGVyXHJcbiAgICAgICAgLmludGVyc2VjdE9iamVjdHModGhpcy50YWdHcm91cC5jaGlsZHJlbiwgZmFsc2UpXHJcbiAgICAgICAgLmZpbmQoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKT8ub2JqZWN0O1xyXG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaW50ZXJzZWN0ZWRPYmplY3RJZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxyXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUGxhY2VtZW50IHdpbnMgb3ZlciBldmVyeXRoaW5nOiB3aGlsZSBhcm1lZCwgYSBjbGljayBtZWFucyBcInB1dCBpdCBoZXJlXCIsIG5vdCBcIm9wZW4gdGhhdFwiLlxyXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXHJcbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMudGFnR3JvdXAuY2hpbGRyZW4sIGZhbHNlKVxyXG4gICAgICAgIC5maWx0ZXIoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKTtcclxuICAgICAgaWYgKHRhZ0hpdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IHRhZyA9IHRhZ0hpdHNbMF0ub2JqZWN0O1xyXG4gICAgICAgIHRoaXMudGFnQ2xpY2tlZCQubmV4dCh7IGVsZW1lbnRJZDogdGFnLm5hbWUsIHBvaVR5cGU6IHRhZy51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwgfSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBpbnRlcnNlY3RzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyh0aGlzLmNsaWNrYWJsZU9iamVjdHMsIHRydWUpO1xyXG5cclxuICAgICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGNvbnN0IGNsaWNrZWRPYmplY3QgPSBpbnRlcnNlY3RzWzBdLm9iamVjdDtcclxuICAgICAgICBjb25zdCBpZCA9IGNsaWNrZWRPYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaWQpIHtcclxuICAgICAgICAgICAgdGhpcy5vYmplY3RDbGlja2VkJC5uZXh0KGlkKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5vYmplY3RDbGlja2VkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBFc2NhcGUgY2FuY2VscyB3aGF0ZXZlciB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgY29tbWl0dGVkIHRvLlxyXG4gICAqXHJcbiAgICogRW1pdHMgdGhyb3VnaCB0aGUgc2FtZSBzdWJqZWN0cyB0aGUgZXhwbGljaXQgQ2FuY2VsIGJ1dHRvbnMgdXNlLCBzbyB0aGUgVUkgZHJpdmluZyB0aGVtIGZvbGxvd3NcclxuICAgKiBhbG9uZyBpbnN0ZWFkIG9mIGJlaW5nIGxlZnQgc2hvd2luZyBhIG1vZGUgdGhhdCBpcyBubyBsb25nZXIgYXJtZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcclxuICAgIGlmIChldmVudC5rZXkgIT09ICdFc2NhcGUnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLnBsYWNpbmdUYWcpIHtcclxuICAgICAgLy8gTm90aGluZyBvdXRzaWRlIHRoZSBzY2VuZSB0cmFja3MgcGxhY2VtZW50LCBzbyBjbGVhcmluZyBpdCBoZXJlIGlzIHRoZSB3aG9sZSBvZiBpdC5cclxuICAgICAgdGhpcy5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYW5pbWF0ZSA9ICgpOiB2b2lkID0+IHtcclxuICAgIHRoaXMuYW5pbWF0aW9uRnJhbWVJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGUpO1xyXG4gICAgdGhpcy5zdGVwQ2FtZXJhVHdlZW4oKTtcclxuICAgIHRoaXMuY29udHJvbHMudXBkYXRlKCk7XHJcblxyXG4gICAgLy8gT25lIHBpY2sgcGVyIGZyYW1lLCBhZ2FpbnN0IHRoZSBwb2ludGVyJ3MgbGF0ZXN0IHBvc2l0aW9uIC0gc2VlIG9uTW91c2VNb3ZlLlxyXG4gICAgaWYgKHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCkge1xyXG4gICAgICBjb25zdCBldmVudCA9IHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudDtcclxuICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgICAgdGhpcy51cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50KTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgfVxyXG5cclxuICBkZXN0cm95KCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCkge1xyXG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xyXG4gICAgfVxyXG4gICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLm9uS2V5RG93bik7XHJcbiAgICBpZiAodGhpcy5jYW52YXNSZXNpemVPYnNlcnZlcikge1xyXG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlciA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XHJcbiAgICB0aGlzLmNsZWFyVGFncygpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb250cm9scykge1xyXG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
|
|
2392
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZWVqcy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmd4LXNtYXJ0ZXJwbGFuLWNvcmUvc3JjL2xpYi9zZXJ2aWNlcy90aHJlZWpzLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDMUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUNqRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDbkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ25FLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtREFBbUQsQ0FBQztBQUNuRixPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDOztBQW1GL0I7Ozs7OztHQU1HO0FBQ0gsU0FBUyxlQUFlLENBQUMsQ0FBZ0IsRUFBRSxDQUFnQixFQUFFLENBQWdCO0lBQzNFLE1BQU0sRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7UUFDMUIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lB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QUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsS0FBVSxFQUFFLEVBQUU7WUFDN0IsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sSUFBSSxLQUFLLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7WUFDdEUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUNkLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekQsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQzVELE1BQU0sTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUM7Z0JBQzVCLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNyRyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUM3RyxDQUFDLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEdB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SyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBNStFVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgKiBhcyBUSFJFRSBmcm9tICd0aHJlZSc7XHJcbmltcG9ydCB7IE9yYml0Q29udHJvbHMgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vY29udHJvbHMvT3JiaXRDb250cm9scyc7XHJcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XHJcbmltcG9ydCB7IE1UTExvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL01UTExvYWRlcic7XHJcbmltcG9ydCB7IEdMVEZMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9HTFRGTG9hZGVyJztcclxuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xyXG5pbXBvcnQgeyBNZXNob3B0RGVjb2RlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saWJzL21lc2hvcHRfZGVjb2Rlci5tb2R1bGUuanMnO1xyXG5pbXBvcnQgeyBMaW5lMiB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lMic7XHJcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xyXG5pbXBvcnQgeyBMaW5lTWF0ZXJpYWwgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGluZXMvTGluZU1hdGVyaWFsJztcclxuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IFBvaVR5cGUgfSBmcm9tICcuLi90eXBlcy5zZXJ2aWNlJztcclxuXHJcbi8qKlxyXG4gKiBBIHRhZyB0byBkcmF3IGluIHRoZSBUaHJlZS5qcyBzY2VuZSwgbWlycm9yaW5nIGEgTWF0dGVydGFnLlxyXG4gKlxyXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxyXG4gKiBub3Qgc2NlbmUgc3BhY2UuIFRoZSBzZXJ2aWNlIHJlcGFyZW50cyB0YWdzIHVuZGVyIHRoZSBtb2RlbCBzbyB0aGV5IGluaGVyaXQgdGhlIGNlbnRlcmluZyBhbmRcclxuICogc2NhbGluZyBhcHBsaWVkIGF0IGxvYWQsIHdoaWNoIG1lYW5zIGNhbGxlcnMgbmV2ZXIgZGVhbCB3aXRoIHRoYXQgdHJhbnNmb3JtLlxyXG4gKi9cclxuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnIHtcclxuICAvKiogVGhlIHRhZ2dlZCBlbGVtZW50J3MgaWQgKFBPSS5lbGVtZW50SUQpLCB1c2VkIHRvIHVwZGF0ZSBvciByZW1vdmUgdGhlIHRhZyBsYXRlci4gKi9cclxuICBpZDogc3RyaW5nO1xyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICAvKiogRHJpdmVzIGJvdGggdGhlIGNsaWNrIHJvdXRlIGFuZCB0eXBlIGZpbHRlcmluZywgc28gaXQgdHJhdmVscyB3aXRoIHRoZSB0YWcuICovXHJcbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xyXG4gIC8qKiBTaG93biBvbiBob3Zlci4gQSBtYXJrZXIgd2l0aCBubyBpZGVudGl0eSBpcyBqdXN0IGEgZG90IG9uIGEgd2FsbC4gKi9cclxuICBsYWJlbD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXHJcbiAgb3JpZ2luQ2FwdHVyZUlEPzogc3RyaW5nIHwgbnVsbDtcclxuICAvKipcclxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcclxuICAgKiBhIHRhZyBwbGFjZWQgaW4gYSBtb2RlbCBiZWZvcmUgaXQgd2FzIGNhbGlicmF0ZWQuIE9ubHkgbWVhbmluZ2Z1bCBpbiB0aGUgbW9kZWwgaXQgd2FzIHBsYWNlZCBpbi5cclxuICAgKi9cclxuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xyXG4gIC8qKiBJY29uIGRyYXduIG9uIHRoZSB0YWcuIEZhbGxzIGJhY2sgdG8gYSBwbGFpbiBkaXNjIHdoZW4gYWJzZW50IG9yIGl0IGZhaWxzIHRvIGxvYWQuICovXHJcbiAgaWNvblVybD86IHN0cmluZyB8IG51bGw7XHJcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXHJcbiAgY29sb3I/OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKiBXaGF0IGEgY2xpY2sgb24gYSB0YWcgcmVwb3J0czogZW5vdWdoIHRvIHJvdXRlIHRvIHRoZSBlbGVtZW50J3MgZGV0YWlsIHBhZ2UuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ0NsaWNrIHtcclxuICBlbGVtZW50SWQ6IHN0cmluZztcclxuICBwb2lUeXBlOiBQb2lUeXBlIHwgbnVsbDtcclxufVxyXG5cclxuLyoqXHJcbiAqIEEgc3BvdCBwaWNrZWQgb24gdGhlIG1vZGVsIGZvciBhIG5ldyB0YWcuXHJcbiAqXHJcbiAqIEJvdGggdmVjdG9ycyBhcmUgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGUgc3BhY2UsIHdoaWNoIGlzIHdoYXQgUE9JLmNvb3JkaW5hdGUgc3RvcmVzLiBTY2VuZVxyXG4gKiBjb29yZGluYXRlcyBkZWxpYmVyYXRlbHkgbmV2ZXIgbGVhdmUgdGhpcyBzZXJ2aWNlOiB0aGUgbW9kZWwgaXMgc2NhbGVkIHRvIGEgZml4ZWQgc2l6ZSBvbiBsb2FkLCBzb1xyXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZ1BsYWNlbWVudCB7XHJcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIC8qKiBTdXJmYWNlIG5vcm1hbCBhdCB0aGUgcGlja2VkIHBvaW50IC0gTWF0dGVycG9ydCBzdG9yZXMgdGhlIHNhbWUgdGhpbmcgaW4gUE9JLm1ldGFkYXRhLiAqL1xyXG4gIG5vcm1hbDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cclxuICBwb2lUeXBlPzogUG9pVHlwZSB8IG51bGw7XHJcbn1cclxuXHJcbi8qKiBPbmUgdGFnIHNlZW4gaW4gYm90aCBzcGFjZXM6IHdoZXJlIGl0IGlzIHN0b3JlZCwgYW5kIHdoZXJlIGl0IHJlYWxseSBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cclxuLyoqIEEgZGlzdGFuY2UgbWVhc3VyZWQgb24gdGhlIG1vZGVsOiBpdHMgcG9pbnRzLCBlYWNoIHNlZ21lbnQncyBsZW5ndGgsIGFuZCBhIHBpY3R1cmUgb2YgaXQuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc01lYXN1cmVtZW50IHtcclxuICAvKiogSW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluLCBzbyB0aGUgbGFzdCBvbmUgY2FuIGJlIHNhdmVkIGFzIHRoZSBQT0kuICovXHJcbiAgcG9pbnRzOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfVtdO1xyXG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMsIHJvdW5kZWQgbGlrZSBNYXR0ZXJwb3J0J3MgbWVhc3VyZW1lbnRzIGFyZS4gKi9cclxuICBkaXN0YW5jZXM6IG51bWJlcltdO1xyXG4gIC8qKiBKUEVHIGRhdGEgVVJJIG9mIHRoZSBzY2VuZSB3aXRoIHRoZSBtZWFzdXJlbWVudCBkcmF3biBvbiBpdC4gKi9cclxuICBzY3JlZW5zaG90OiBzdHJpbmc7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBIHRhZyBwbGFjZWQgaW4gdGhpcyBtb2RlbCB3aG9zZSBzdG9yZWQgY29vcmRpbmF0ZXMgaGFkIHRvIGNoYW5nZSBmb3IgaXQgdG8gc3RheSB3aGVyZSBpdCBpcyxcclxuICogYmVjYXVzZSB0aGUgY2FsaWJyYXRpb24gaXQgaXMgZHJhd24gdW5kZXIgY2hhbmdlZC5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1JlYmFzZWRUYWcge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgLyoqIEl0cyBjb29yZGluYXRlcyBpbiB0aGUgc3BhY2UgdGFncyBzaGFyZSwgdW5kZXIgdGhlIG5ldyBjYWxpYnJhdGlvbi4gKi9cclxuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgLyoqIFR1cm5zIGEgZGlyZWN0aW9uIHN0b3JlZCB3aXRoIHRoZSB0YWcgLSBpdHMgc3VyZmFjZSBub3JtYWwgLSB0aGUgc2FtZSB3YXkuICovXHJcbiAgcm90YXRlRGlyZWN0aW9uOiAoZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xyXG4gIC8qKiBUaGUgdGFnIHRoZSBwYWlyIHdhcyBtYWRlIGZyb20sIHdoZW4gaXQgY2FtZSBmcm9tIG9uZS4gKi9cclxuICB0YWdJZD86IHN0cmluZztcclxuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG4gIHRhcmdldDogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBCdWlsZHMgYW4gb3J0aG9ub3JtYWwgZnJhbWUgZnJvbSB0aHJlZSBwb2ludHMsIG9yIG51bGwgd2hlbiB0aGV5IGFyZSAobmVhcmx5KSBjb2xsaW5lYXIuXHJcbiAqXHJcbiAqIFRocmVlIHBvaW50cyBkZWZpbmUgYSBwbGFuZSwgYW5kIGEgcGxhbmUgcGx1cyBhbiBvcmlnaW4gZGVmaW5lcyBhbiBvcmllbnRhdGlvbi4gQ29sbGluZWFyIHBvaW50c1xyXG4gKiBkbyBub3Q6IHRoZXkgbGVhdmUgdGhlIHJvdGF0aW9uIGFib3V0IHRoZWlyIGNvbW1vbiBsaW5lIHVuZGV0ZXJtaW5lZCwgd2hpY2ggaXMgd2h5IHRoZSBjYWxsZXIgaGFzXHJcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxyXG4gKi9cclxuZnVuY3Rpb24gZnJhbWVGcm9tUG9pbnRzKGE6IFRIUkVFLlZlY3RvcjMsIGI6IFRIUkVFLlZlY3RvcjMsIGM6IFRIUkVFLlZlY3RvcjMpOiBUSFJFRS5NYXRyaXg0IHwgbnVsbCB7XHJcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xyXG4gIGlmIChlMS5sZW5ndGhTcSgpIDwgMWUtMTIpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBlMS5ub3JtYWxpemUoKTtcclxuXHJcbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcclxuICBjb25zdCBlMiA9IHRvQy5jbG9uZSgpLnN1YihlMS5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHRvQy5kb3QoZTEpKSk7XHJcbiAgaWYgKGUyLmxlbmd0aFNxKCkgPCAxZS0xMikge1xyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG4gIGUyLm5vcm1hbGl6ZSgpO1xyXG5cclxuICByZXR1cm4gbmV3IFRIUkVFLk1hdHJpeDQoKS5tYWtlQmFzaXMoZTEsIGUyLCBlMS5jbG9uZSgpLmNyb3NzKGUyKSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBTb2x2ZXMgdGhlIHRyYW5zZm9ybSB0aGF0IG1hcHMgc3RvcmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoZSBsb2FkZWQgbW9kZWwsIGZyb20gYXMgbWFueSBtYXRjaGVkXHJcbiAqIHRhZ3MgYXMgdGhlcmUgYXJlIC0gdXAgdG8gdGhyZWUuXHJcbiAqXHJcbiAqIFRocmVlIHBhaXJzIHBpbiBkb3duIGV2ZXJ5dGhpbmc6IHBvc2l0aW9uLCBvcmllbnRhdGlvbiBhbmQgc2NhbGUuIEEgbW9kZWwgdGhhdCBzaGFyZXMgb25seSBhXHJcbiAqIGNvcm5lciB3aXRoIHRoZSB0YWdzJyBzcGFjZSBtYXkgbm90IGhhdmUgdGhyZWUgdGFncyB0byBvZmZlciwgc28gZmV3ZXIgYXJlIGFjY2VwdGVkLCBlYWNoXHJcbiAqIHNldHRsaW5nIHdoYXQgaXQgY2FuIGFuZCBhc3N1bWluZyB0aGUgcmVzdDpcclxuICpcclxuICogIC0gVHdvIHBhaXJzOiBwb3NpdGlvbiwgaGVhZGluZyBhbmQgc2NhbGUuIFRoZSBvbmUgdGhpbmcgdHdvIHBvaW50cyBjYW5ub3Qgc2F5IGlzIGhvdyB0aGUgbW9kZWxcclxuICogICAgaXMgdGlsdGVkLCBzbyBib3RoIHNwYWNlcyBhcmUgdGFrZW4gdG8gYWdyZWUgb24gd2hpY2ggd2F5IGlzIHVwLlxyXG4gKiAgLSBPbmUgcGFpcjogcG9zaXRpb24gb25seS4gSGVhZGluZyBhbmQgc2NhbGUgYXJlIHRha2VuIHRvIG1hdGNoIGFscmVhZHkuXHJcbiAqXHJcbiAqIGB0YXJnZXRVcGAgaXMgdGhlIG1vZGVsJ3MgdmVydGljYWwgYXhpcywgd2hpY2ggdGhlIHRhZ3MnIG93biB2ZXJ0aWNhbCAoK1kpIGlzIG1hdGNoZWQgdG8gaW4gdGhvc2VcclxuICogdHdvIGNhc2VzLiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgcG9pbnRzIGNhbm5vdCBhbnN3ZXIgdGhlIHF1ZXN0aW9uIGFza2VkIG9mIHRoZW0gLSBjb2xsaW5lYXIgZm9yXHJcbiAqIHRocmVlLCBvbmUgYWJvdmUgdGhlIG90aGVyIGZvciB0d28gLSBiZWNhdXNlIGEgd3JvbmcgY2FsaWJyYXRpb24gYXBwbGllZCBzaWxlbnRseSBpcyB3b3JzZSB0aGFuXHJcbiAqIG5vbmUuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gc29sdmVUaHJlZUpzQWxpZ25tZW50KFxyXG4gIHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLFxyXG4gIHRhcmdldFVwOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSA9IHsgeDogMCwgeTogMSwgejogMCB9LFxyXG4pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XHJcbiAgaWYgKCFwYWlycyB8fCBwYWlycy5sZW5ndGggPT09IDApIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuICBpZiAocGFpcnMubGVuZ3RoIDwgMykge1xyXG4gICAgcmV0dXJuIHNvbHZlUmVkdWNlZEFsaWdubWVudChwYWlycywgbmV3IFRIUkVFLlZlY3RvcjModGFyZ2V0VXAueCwgdGFyZ2V0VXAueSwgdGFyZ2V0VXAueikubm9ybWFsaXplKCkpO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc291cmNlcyA9IHBhaXJzLnNsaWNlKDAsIDMpLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci5zb3VyY2UueCwgcGFpci5zb3VyY2UueSwgcGFpci5zb3VyY2UueikpO1xyXG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcclxuXHJcbiAgY29uc3Qgc291cmNlRnJhbWUgPSBmcmFtZUZyb21Qb2ludHMoc291cmNlc1swXSwgc291cmNlc1sxXSwgc291cmNlc1syXSk7XHJcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XHJcbiAgaWYgKCFzb3VyY2VGcmFtZSB8fCAhdGFyZ2V0RnJhbWUpIHtcclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgLy8gQSByb3RhdGlvbidzIGludmVyc2UgaXMgaXRzIHRyYW5zcG9zZSwgc28gdGhpcyBpcyB0aGUgcm90YXRpb24gY2Fycnlpbmcgb25lIGZyYW1lIG9udG8gdGhlIG90aGVyLlxyXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XHJcblxyXG4gIC8vIFNjYWxlIGZyb20gaG93IGZhciBhcGFydCB0aGUgcG9pbnRzIGFyZSBpbiBlYWNoIHNwYWNlLCBhdmVyYWdlZCBvdmVyIHRoZSB0aHJlZSBlZGdlcyBzbyBhIHNpbmdsZVxyXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cclxuICBjb25zdCBlZGdlcyA9IFtbMCwgMV0sIFsxLCAyXSwgWzAsIDJdXTtcclxuICBsZXQgcmF0aW9TdW0gPSAwO1xyXG4gIGxldCByYXRpb0NvdW50ID0gMDtcclxuICBmb3IgKGNvbnN0IFtpLCBqXSBvZiBlZGdlcykge1xyXG4gICAgY29uc3Qgc291cmNlTGVuZ3RoID0gc291cmNlc1tpXS5kaXN0YW5jZVRvKHNvdXJjZXNbal0pO1xyXG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xyXG4gICAgaWYgKHNvdXJjZUxlbmd0aCA+IDFlLTkpIHtcclxuICAgICAgcmF0aW9TdW0gKz0gdGFyZ2V0TGVuZ3RoIC8gc291cmNlTGVuZ3RoO1xyXG4gICAgICByYXRpb0NvdW50ICs9IDE7XHJcbiAgICB9XHJcbiAgfVxyXG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XHJcblxyXG4gIC8vIFRoZSBncm91cCBhcHBsaWVzIHBvc2l0aW9uLCB0aGVuIHJvdGF0aW9uLCB0aGVuIHNjYWxlLCBzbyBhIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcC4gU29sdmluZ1xyXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXHJcbiAgY29uc3Qgc291cmNlQ2VudHJvaWQgPSBzb3VyY2VzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdGFyZ2V0Q2VudHJvaWQgPSB0YXJnZXRzLnJlZHVjZSgoc3VtLCB2KSA9PiBzdW0uYWRkKHYpLCBuZXcgVEhSRUUuVmVjdG9yMygpKS5tdWx0aXBseVNjYWxhcigxIC8gMyk7XHJcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxyXG4gICAgLmNsb25lKClcclxuICAgIC5zdWIoc291cmNlQ2VudHJvaWQuY2xvbmUoKS5hcHBseU1hdHJpeDQocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcblxyXG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVJvdGF0aW9uTWF0cml4KHJvdGF0aW9uKTtcclxuXHJcbiAgcmV0dXJuIHtcclxuICAgIHRyYW5zbGF0aW9uOiB7IHg6IHRyYW5zbGF0aW9uLngsIHk6IHRyYW5zbGF0aW9uLnksIHo6IHRyYW5zbGF0aW9uLnogfSxcclxuICAgIHJvdGF0aW9uOiB7IHg6IGV1bGVyLngsIHk6IGV1bGVyLnksIHo6IGV1bGVyLnogfSxcclxuICAgIHNjYWxlLFxyXG4gIH07XHJcbn1cclxuXHJcbi8qKiBUaGUgb25lLSBhbmQgdHdvLXBhaXIgY2FzZXMgb2Ygc29sdmVUaHJlZUpzQWxpZ25tZW50LCB3aGljaCBzaGFyZSB0aGUgXCJzYW1lIHZlcnRpY2FsXCIgYXNzdW1wdGlvbi4gKi9cclxuZnVuY3Rpb24gc29sdmVSZWR1Y2VkQWxpZ25tZW50KHBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdLCB1cDogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XHJcbiAgY29uc3QgdGFyZ2V0cyA9IHBhaXJzLm1hcCgocGFpcikgPT4gbmV3IFRIUkVFLlZlY3RvcjMocGFpci50YXJnZXQueCwgcGFpci50YXJnZXQueSwgcGFpci50YXJnZXQueikpO1xyXG5cclxuICAvLyBTdGFydHMgZnJvbSB0aGUgcm90YXRpb24gdGhhdCBvbmx5IHN0YW5kcyB0aGUgdGFncycgdmVydGljYWwgb24gdGhlIG1vZGVsJ3MuXHJcbiAgY29uc3Qgcm90YXRpb24gPSBuZXcgVEhSRUUuUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyhuZXcgVEhSRUUuVmVjdG9yMygwLCAxLCAwKSwgdXApO1xyXG4gIGxldCBzY2FsZSA9IDE7XHJcblxyXG4gIGlmIChwYWlycy5sZW5ndGggPT09IDIpIHtcclxuICAgIGNvbnN0IHNvdXJjZVNwYW4gPSBzb3VyY2VzWzFdLmNsb25lKCkuc3ViKHNvdXJjZXNbMF0pO1xyXG4gICAgY29uc3QgdGFyZ2V0U3BhbiA9IHRhcmdldHNbMV0uY2xvbmUoKS5zdWIodGFyZ2V0c1swXSk7XHJcbiAgICBpZiAoc291cmNlU3Bhbi5sZW5ndGgoKSA8IDFlLTkgfHwgdGFyZ2V0U3Bhbi5sZW5ndGgoKSA8IDFlLTkpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICBzY2FsZSA9IHRhcmdldFNwYW4ubGVuZ3RoKCkgLyBzb3VyY2VTcGFuLmxlbmd0aCgpO1xyXG5cclxuICAgIC8vIEhlYWRpbmcgaXMgdGhlIHR1cm4gYWJvdXQgdGhlIHZlcnRpY2FsIHRoYXQgbGluZXMgdGhlIHR3byBzcGFucyB1cCwgc28gb25seSB0aGVpciBob3Jpem9udGFsXHJcbiAgICAvLyBwYXJ0cyBjb3VudC4gVHdvIHBvaW50cyBvbmUgYWJvdmUgdGhlIG90aGVyIGhhdmUgbm9uZSwgYW5kIHNheSBub3RoaW5nIGFib3V0IGhlYWRpbmcuXHJcbiAgICBjb25zdCBmbGF0dGVuID0gKHY6IFRIUkVFLlZlY3RvcjMpID0+IHYuY2xvbmUoKS5zdWIodXAuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih2LmRvdCh1cCkpKTtcclxuICAgIGNvbnN0IGZyb20gPSBmbGF0dGVuKHNvdXJjZVNwYW4uY2xvbmUoKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pKTtcclxuICAgIGNvbnN0IHRvID0gZmxhdHRlbih0YXJnZXRTcGFuKTtcclxuICAgIGlmIChmcm9tLmxlbmd0aCgpIDwgMWUtNiAqIHNvdXJjZVNwYW4ubGVuZ3RoKCkgfHwgdG8ubGVuZ3RoKCkgPCAxZS02ICogdGFyZ2V0U3Bhbi5sZW5ndGgoKSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGhlYWRpbmcgPSBNYXRoLmF0YW4yKG5ldyBUSFJFRS5WZWN0b3IzKCkuY3Jvc3NWZWN0b3JzKGZyb20sIHRvKS5kb3QodXApLCBmcm9tLmRvdCh0bykpO1xyXG4gICAgcm90YXRpb24ucHJlbXVsdGlwbHkobmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHVwLCBoZWFkaW5nKSk7XHJcbiAgfVxyXG5cclxuICAvLyBBIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcDsgc29sdmVkIGZvciB0IGF0IHRoZSBjZW50cm9pZHMsIGFzIGluIHRoZSB0aHJlZS1wYWlyIGNhc2UuXHJcbiAgY29uc3QgY2VudHJvaWQgPSAocG9pbnRzOiBUSFJFRS5WZWN0b3IzW10pID0+XHJcbiAgICBwb2ludHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyBwb2ludHMubGVuZ3RoKTtcclxuICBjb25zdCB0cmFuc2xhdGlvbiA9IGNlbnRyb2lkKHRhcmdldHMpLnN1YihjZW50cm9pZChzb3VyY2VzKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XHJcbiAgY29uc3QgZXVsZXIgPSBuZXcgVEhSRUUuRXVsZXIoKS5zZXRGcm9tUXVhdGVybmlvbihyb3RhdGlvbik7XHJcblxyXG4gIHJldHVybiB7XHJcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXHJcbiAgICByb3RhdGlvbjogeyB4OiBldWxlci54LCB5OiBldWxlci55LCB6OiBldWxlci56IH0sXHJcbiAgICBzY2FsZSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIE9iakFkZGVkIHtcclxuICBpZDogc3RyaW5nO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBmaWxlOiBzdHJpbmc7IC8vIFRoZSBVUkwgdG8gdGhlIC5vYmogZmlsZVxyXG4gIHBvc2l0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcclxuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XHJcbiAgc2NhbGU6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgUGFyc2VkTWVzaEdyb3VwIHtcclxuICBzdGFydDogbnVtYmVyO1xyXG4gIGNvdW50OiBudW1iZXI7XHJcbiAgbWF0ZXJpYWxJbmRleDogbnVtYmVyO1xyXG59XHJcblxyXG4vKiogUmF3IGdlb21ldHJ5IGRhdGEgZXh0cmFjdGVkIGZyb20gYSBwYXJzZWQgT0JKIG1lc2gsIHNlbnQgYmFjayBieSB0aGUgcGFyc2VyIHdvcmtlci4gKi9cclxuaW50ZXJmYWNlIFBhcnNlZE1lc2hEYXRhIHtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgLy8gT25lIG5hbWUgcGVyIG1hdGVyaWFsIHVzZWQgYnkgdGhpcyBtZXNoLiBBIHNpbmdsZS1tYXRlcmlhbCBtZXNoIGhhcyBvbmUgZW50cnk7XHJcbiAgLy8gYSBtZXNoIHdpdGggbXVsdGlwbGUgdXNlbXRsIHN3aXRjaGVzIChnZW9tZXRyeS5ncm91cHMpIGhhcyBvbmUgcGVyIGdyb3VwLlxyXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xyXG4gIGdyb3VwczogUGFyc2VkTWVzaEdyb3VwW10gfCBudWxsO1xyXG4gIHBvc2l0aW9uOiBGbG9hdDMyQXJyYXk7XHJcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIHV2OiBGbG9hdDMyQXJyYXkgfCBudWxsO1xyXG4gIGluZGV4OiBVaW50MzJBcnJheSB8IG51bGw7XHJcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xyXG59XHJcblxyXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xyXG4gIHJlcXVlc3RJZDogc3RyaW5nO1xyXG4gIHN1Y2Nlc3M6IGJvb2xlYW47XHJcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcclxuICBlcnJvcj86IHN0cmluZztcclxufVxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgVGhyZWVKc1NlcnZpY2Uge1xyXG4gIHByaXZhdGUgc2NlbmUhOiBUSFJFRS5TY2VuZTtcclxuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG4gIHByaXZhdGUgcmVuZGVyZXIhOiBUSFJFRS5XZWJHTFJlbmRlcmVyO1xyXG4gIHByaXZhdGUgY29udHJvbHMhOiBPcmJpdENvbnRyb2xzO1xyXG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcclxuXHJcbiAgLy8gUmF5Y2FzdGluZyBhbmQgaW50ZXJhY3Rpb25cclxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcclxuICBwcml2YXRlIG1vdXNlID0gbmV3IFRIUkVFLlZlY3RvcjIoKTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdDYW1lcmE6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xyXG4gIHByaXZhdGUgY2xpY2thYmxlT2JqZWN0czogVEhSRUUuT2JqZWN0M0RbXSA9IFtdO1xyXG5cclxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcclxuICBwdWJsaWMgb2JqZWN0SG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGlkOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG4gIHB1YmxpYyBvYmplY3RDbGlja2VkJCA9IG5ldyBTdWJqZWN0PHN0cmluZyB8IG51bGw+KCk7XHJcblxyXG4gIC8qKiBFbWl0cyB3aGVuIHRoZSB1c2VyIGNsaWNrcyBhIHRhZywgbWlycm9yaW5nIE1hdHRlcnBvcnQncyB0YWcgY2xpY2suICovXHJcbiAgcHVibGljIHRhZ0NsaWNrZWQkID0gbmV3IFN1YmplY3Q8VGhyZWVKc1RhZ0NsaWNrPigpO1xyXG5cclxuICAvKiogRW1pdHMgYSB0YWcncyBsYWJlbCB3aGlsZSB0aGUgcG9pbnRlciBpcyBvdmVyIGl0LCBhbmQgbnVsbCB3aGVuIGl0IGxlYXZlcy4gKi9cclxuICBwdWJsaWMgdGFnSG92ZXJlZCQgPSBuZXcgU3ViamVjdDx7IGxhYmVsOiBzdHJpbmc7IGV2ZW50OiBNb3VzZUV2ZW50IH0gfCBudWxsPigpO1xyXG5cclxuICAvLyBUYWdzIGxpdmUgdW5kZXIgdGhlIG1vZGVsIHJhdGhlciB0aGFuIHRoZSBzY2VuZSwgc28gdGhlIGNlbnRlcmluZyBhbmQgc2NhbGluZyBhcHBsaWVkIHdoZW4gdGhlXHJcbiAgLy8gbW9kZWwgaXMgcGxhY2VkIGNhcnJpZXMgb3ZlciBhbmQgUE9JIGNvb3JkaW5hdGVzIGNhbiBzdGF5IGluIHRoZSBtb2RlbCdzIG93biBzcGFjZS5cclxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgcHJpdmF0ZSB0YWdTcHJpdGVzID0gbmV3IE1hcDxzdHJpbmcsIFRIUkVFLlNwcml0ZT4oKTtcclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xyXG5cclxuICAvKiogQWJvcnRzIHRoZSBpbi1mbGlnaHQgbW9kZWwgZG93bmxvYWQuIFBhcnNpbmcgY2Fubm90IGJlIGludGVycnVwdGVkLCBvbmx5IG5vdCBzdGFydGVkLiAqL1xyXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcclxuXHJcbiAgLy8gVGhlIGxvYWRlZCBiYXNlIG1vZGVsLCBrZXB0IHNvIHRhZyBwbGFjZW1lbnQgY2FuIHJheWNhc3QgYWdhaW5zdCBpdHMgZ2VvbWV0cnkuXHJcbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcclxuXHJcbiAgLyoqIFRydWUgd2hpbGUgdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIHBsYWNlcyBhIHRhZyBpbnN0ZWFkIG9mIG9yYml0aW5nLiAqL1xyXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xyXG5cclxuICAvKiogV2hhdCB0aGUgYXJtZWQgcGxhY2VtZW50IGlzIGZvciwgZWNob2VkIGJhY2sgd2hlbiB0aGUgc3BvdCBpcyBwaWNrZWQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb3NpdGlvbiBhbmQgbm9ybWFsIG9mIHRoZSBsYXN0IHBsYWNlZCB0YWcsIGluIG1vZGVsIHNwYWNlLCBhd2FpdGluZyBjb21taXQgdG8gYSBQT0kuICovXHJcbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBQb2ludGVyIHBvc2l0aW9uIHdhaXRpbmcgZm9yIGEgcHJldmlldyBwaWNrLCBjb2FsZXNjZWQgdG8gb25lIHBlciBmcmFtZS4gKi9cclxuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XHJcbiAgICogY2FycnkgdGhlIGNhbGlicmF0aW9uOiBjYWxpYnJhdGluZyBhIG1vZGVsIGZvciB0aGUgdGFncyBpdCBpbXBvcnRzIG11c3Qgbm90IG1vdmUgdGhlIG9uZXMgdGhhdFxyXG4gICAqIHdlcmUgcGxhY2VkIHN0cmFpZ2h0IG9udG8gaXQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBtb2RlbFRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBjYXB0dXJlIG9uIHNjcmVlbi4gQSB0YWcgcGxhY2VkIGluIGEgM0QgbW9kZWwgaXMgcmVjb3JkZWQgd2l0aCBpdCwgd2hpY2ggaXMgaG93IHRoZSB0YWdzXHJcbiAgICogcGxhY2VkIGluIHRoaXMgb25lIGFyZSB0b2xkIGZyb20gdGhvc2UgdGhhdCBjYW1lIGZyb20gZWxzZXdoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgY3VycmVudENhcHR1cmVJRDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCdzIHN1cmZhY2UgYXMgYSBncmlkOiBldmVyeSBjZWxsIHNvbWUgcGFydCBvZiB0aGUgc3VyZmFjZSBwYXNzZXMgdGhyb3VnaC5cclxuICAgKlxyXG4gICAqIEl0IGFuc3dlcnMgXCJpcyB0aGlzIHBvaW50IG5lYXIgdGhlIG1vZGVsP1wiIHdpdGhvdXQgdmlzaXRpbmcgdGhlIHRyaWFuZ2xlcywgb2Ygd2hpY2ggYSBjYXB0dXJlZFxyXG4gICAqIG1vZGVsIGhhcyBtaWxsaW9ucyAtIHRoZSBxdWVzdGlvbiBpcyBhc2tlZCBmb3IgZXZlcnkgdGFnLCBldmVyeSB0aW1lIHRoZSBjYWxpYnJhdGlvbiBjaGFuZ2VzLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxzOiBTZXQ8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VPcmlnaW4gPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG5cclxuICBwcml2YXRlIHN1cmZhY2VDZWxsU2l6ZSA9IDE7XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgZnJvbSB0aGUgbW9kZWwncyBzdXJmYWNlIGEgdGFnIG1heSBiZSBhbmQgc3RpbGwgY291bnQgYXMgb24gaXQsIGluIG1ldHJlcy5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbDsgdGhpcyBpcyB3aGF0IGRlY2lkZXMgd2hpY2ggb25lcyBhIG1vZGVsXHJcbiAgICogc2hvd3MuIEEgdGFnIG1hcmtzIHNvbWV0aGluZyBvbiBhIHN1cmZhY2UsIHNvIG9uZSB0aGF0IGJlbG9uZ3MgaGVyZSBzaXRzIG9uIHRoZSBzdXJmYWNlIG9yXHJcbiAgICogY2xvc2UgdG8gaXQuIE9uZSB0aGF0IGxhbmRzIGRlZXAgaW5zaWRlIHRoZSBtb2RlbCwgb3Igd2VsbCBhd2F5IGZyb20gaXQsIG1hcmtzIHNvbWV0aGluZyB0aGF0XHJcbiAgICogaXMgbm90IHBhcnQgb2YgdGhpcyBtb2RlbC4gVGhlIGFsbG93YW5jZSBjb3ZlcnMgYSBjYWxpYnJhdGlvbiBkb25lIGJ5IGhhbmQgYW5kIHRoZSBtb2RlbCBub3RcclxuICAgKiBtYXRjaGluZyB0aGUgc2NhbiBleGFjdGx5LCB3aGljaCB0b2dldGhlciBydW4gdG8gYSBmZXcgdGVucyBvZiBjZW50aW1ldHJlcy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPTl9NT0RFTF9NRVRSRVMgPSAwLjc1O1xyXG5cclxuICAvKiogQ2VsbHMgcGVyIGF4aXMgdGhlIGdyaWQncyBrZXlzIGNhbiBhZGRyZXNzLCB3aXRoIHJvb20gZWl0aGVyIHNpZGUgZm9yIHBvaW50cyBvZmYgdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUkZBQ0VfR1JJRF9TUEFOID0gMTAyNDtcclxuXHJcbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU1VSRkFDRV9HUklEX1BBRCA9IDEyODtcclxuXHJcbiAgLyoqIE93biB0YWdzIG1vdmVkIHRvIGtlZXAgdGhlaXIgcGxhY2UgdW5kZXIgdGhlIGxhc3QgY2FsaWJyYXRpb24sIHdhaXRpbmcgdG8gYmUgc3RvcmVkLiAqL1xyXG4gIHByaXZhdGUgcmViYXNlZFRhZ3M6IFRocmVlSnNSZWJhc2VkVGFnW10gPSBbXTtcclxuXHJcbiAgLyoqIFRoZSB0eXBlIGZpbHRlciBpbiBmb3JjZS4gTnVsbCBzaG93cyBldmVyeSB0eXBlLiAqL1xyXG4gIHByaXZhdGUgdmlzaWJsZVRhZ1R5cGVzOiBQb2lUeXBlW10gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgcHJpdmF0ZSBtZWFzdXJpbmcgPSBmYWxzZTtcclxuXHJcbiAgLyoqIFBvaW50cyBjbGlja2VkIHNvIGZhciwgaW4gdGFnIHNwYWNlLiAqL1xyXG4gIHByaXZhdGUgbWVhc3VyZVBvaW50czogVEhSRUUuVmVjdG9yM1tdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEV2ZXJ5dGhpbmcgZHJhd24gZm9yIHRoZSBtZWFzdXJlbWVudC4gQSBjaGlsZCBvZiB0aGUgdGFnIGdyb3VwLCBzbyBpdHMgcG9pbnRzIHNoYXJlIHRoZSBmcmFtZVxyXG4gICAqIHRhZyBjb29yZGluYXRlcyBhcmUgc3RvcmVkIGluIC0gd2hpY2ggaXMgbWV0cmVzLCBhbmQgd2hhdCB0aGUgc2F2ZWQgUE9JIGhhcyB0byBiZSBpbi5cclxuICAgKi9cclxuICBwcml2YXRlIG1lYXN1cmVHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG5cclxuICAvKiogVGhlIHNlZ21lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyIGZyb20gdGhlIGxhc3QgcG9pbnQgY2xpY2tlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVSdWJiZXJCYW5kPzogYW55O1xyXG5cclxuICBwcml2YXRlIGxhc3RNZWFzdXJlbWVudDogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBIYWxmIHRoZSBtb2RlbCdzIGRpYWdvbmFsIGFzIHBsYWNlZCBpbiB0aGUgc2NlbmUsIHdoZXJlIGl0IGlzIGNlbnRyZWQgb24gdGhlIG9yaWdpbi4gKi9cclxuICBwcml2YXRlIG1vZGVsV29ybGRSYWRpdXMgPSAwO1xyXG5cclxuICAvKiogVGhlIG91dGVybW9zdCBncm91cCB0aGUgbW9kZWwgYW5kIGl0cyB0YWdzIGhhbmcgZnJvbTogd2hlcmUgXCJ3aGljaCB3YXkgaXMgdXBcIiBpcyBhcHBsaWVkLiAqL1xyXG4gIHByaXZhdGUgbW9kZWxHcm91cD86IFRIUkVFLkdyb3VwO1xyXG5cclxuICBwcml2YXRlIG1vZGVsVXA6IFRocmVlSnNNb2RlbFVwID0gJ3knO1xyXG5cclxuICAvKiogV2hpbGUgbWVhc3VyaW5nOiBob3cgbWFueSBwb2ludHMgYW5kIGVhY2ggc2VnbWVudCdzIGxlbmd0aC4gTnVsbCB3aGVuIGl0IGlzIGFiYW5kb25lZC4gKi9cclxuICBwdWJsaWMgbWVhc3VyZW1lbnRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDx7IHBvaW50czogbnVtYmVyOyBkaXN0YW5jZXM6IG51bWJlcltdIH0gfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBMYXllciBjYXJyeWluZyB0aGUgbW9kZWwgYWxvbmUsIHNvIHRoZSBkZXB0aCBwaWNrIGNhbiByZW5kZXIgaXQgd2l0aG91dCB0aGUgdGFncy5cclxuICAgKlxyXG4gICAqIExheWVycyBhcmUgdGVzdGVkIHBlciBvYmplY3QgYXQgcmVuZGVyIHRpbWUgYW5kIGNoaWxkcmVuIGFyZSB0cmF2ZXJzZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXHJcbiAgICogdGhlaXIgcGFyZW50IHBhc3NlZCwgc28gbWFya2luZyB0aGUgbW9kZWwncyBvd24gbWVzaGVzIGlzIGVub3VnaCAtIG5vIHJlLXBhcmVudGluZy5cclxuICAgKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBQSUNLX0xBWUVSID0gMTtcclxuXHJcbiAgLyoqIFRoZSBhcHAncyBoaWdobGlnaHQgY29sb3VyLCBzbyBhIG1lYXN1cmVtZW50IHJlYWRzIGFzIHRoZSBhY3RpdmUgdGhpbmcgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IE1FQVNVUkVfQ09MT1IgPSAnI0ZGQjEwMyc7XHJcblxyXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRSA9ICdzbWFydGVycGxhbi0zZC1tb2RlbHMnO1xyXG5cclxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcclxuXHJcbiAgcHJpdmF0ZSBwaWNrVGFyZ2V0PzogVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ7XHJcblxyXG4gIHByaXZhdGUgcGlja0NhbWVyYT86IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xyXG5cclxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XHJcblxyXG4gIHByaXZhdGUgcmVhZG9ubHkgcGlja1BpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcblxyXG4gIC8qKiBFbWl0cyBvbmNlIGEgdGFnIGlzIGRyb3BwZWQgb24gdGhlIG1vZGVsLCBzbyB0aGUgVUkgY2FuIGNvbmZpcm0gYW5kIHBlcnNpc3QgaXQuICovXHJcbiAgcHVibGljIHRhZ1BsYWNlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnUGxhY2VtZW50PigpO1xyXG5cclxuICAvKiogRW1pdHMgd2hlbiB0aGUgY2FsaWJyYXRpb24gd2Fsa3Rocm91Z2ggaXMgYWJhbmRvbmVkLCBzbyB0aGUgcGFuZWwgZHJpdmluZyBpdCBjYW4gY2xvc2UuICovXHJcbiAgcHVibGljIGFsaWdubWVudENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKiogVHJhbnNsdWNlbnQgbWFya2VyIHNob3duIHVuZGVyIHRoZSBjdXJzb3Igd2hpbGUgcGxhY2luZy4gKi9cclxuICBwcml2YXRlIHBsYWNlbWVudFByZXZpZXc/OiBUSFJFRS5TcHJpdGU7XHJcblxyXG4gIHByaXZhdGUgYWxpZ25pbmcgPSBmYWxzZTtcclxuICBwcml2YXRlIGFsaWdubWVudFBhaXJzOiBUaHJlZUpzQWxpZ25tZW50UGFpcltdID0gW107XHJcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKiBUaGUgdGFnIGBhbGlnbm1lbnRTb3VyY2VgIHdhcyByZWFkIGZyb20sIGtlcHQgc28gdGhlIHNhbWUgdGFnIGlzIG5vdCBtYXRjaGVkIHR3aWNlLiAqL1xyXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgLyoqIERyaXZlcyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoJ3MgVUk6IGhvdyBtYW55IHBhaXJzIGFyZSBkb25lIGFuZCB3aGF0IGl0IHdhbnRzIG5leHQuICovXHJcbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHtcclxuICAgIHBhaXJzOiBudW1iZXI7XHJcbiAgICBhd2FpdGluZzogJ3RhZycgfCAncG9pbnQnIHwgbnVsbDtcclxuICAgIHRhZ0lkPzogc3RyaW5nO1xyXG4gIH0+KCk7XHJcblxyXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXHJcbiAgcHJpdmF0ZSBjYW1lcmFUd2Vlbjoge1xyXG4gICAgZnJvbVBvc2l0aW9uOiBUSFJFRS5WZWN0b3IzO1xyXG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcclxuICAgIGZyb21UYXJnZXQ6IFRIUkVFLlZlY3RvcjM7XHJcbiAgICB0b1RhcmdldDogVEhSRUUuVmVjdG9yMztcclxuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xyXG4gICAgZHVyYXRpb25NczogbnVtYmVyO1xyXG4gIH0gfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqIEVtaXRzIHRydWUgd2hpbGUgYSBoZWF2eSBPQkogZmlsZSBpcyBiZWluZyBwYXJzZWQgKGluIGEgd29ya2VyLCB3aGVuIGF2YWlsYWJsZSksIGZhbHNlIG9uY2UgZG9uZS4gKi9cclxuICBwdWJsaWMgbW9kZWxMb2FkaW5nJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIERvd25sb2FkIHByb2dyZXNzIGZvciBHTEIgbW9kZWxzLCBhcyBhIDAtMSBmcmFjdGlvbiwgb3IgbnVsbCB3aGVuIHRoZSB0b3RhbCBzaXplIGlzIHVua25vd24uXHJcbiAgICpcclxuICAgKiBBIG51bGwgbWVhbnMgdGhlIHNlcnZlciBkaWQgbm90IHNlbmQgQ29udGVudC1MZW5ndGggKGNodW5rZWQgcmVzcG9uc2VzLCBzb21lIHByb3hpZXMpIGFuZCBub1xyXG4gICAqIHBlcmNlbnRhZ2UgY2FuIGJlIGRlcml2ZWQ7IHNob3cgYW4gaW5kZXRlcm1pbmF0ZSBpbmRpY2F0b3IgcmF0aGVyIHRoYW4gZ3Vlc3NpbmcgYXQgb25lLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBtb2RlbExvYWRQcm9ncmVzcyQgPSBuZXcgU3ViamVjdDxudW1iZXIgfCBudWxsPigpO1xyXG5cclxuICAvKipcclxuICAgKiBFbWl0cyB3aGVuIGEgbG9hZCBhY3R1YWxseSBzdG9wcGVkIHNob3J0LCB3aGljaCBpcyBub3QgdGhlIHNhbWUgYXMgYXNraW5nIGl0IHRvLlxyXG4gICAqXHJcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcclxuICAgKiBpbnRlcnJ1cHRlZCAtIHRoZSBtb2RlbCBmaW5pc2hlcyBsb2FkaW5nIHJlZ2FyZGxlc3MuIE9ubHkgdGhpcyB0ZWxscyB0aGUgVUkgd2hpY2ggb2YgdGhlIHR3b1xyXG4gICAqIGhhcHBlbmVkLCBzbyBpdCBkb2VzIG5vdCBvZmZlciB0byByZWxvYWQgc29tZXRoaW5nIHRoYXQgaXMgYWxyZWFkeSBvbiBzY3JlZW4uXHJcbiAgICovXHJcbiAgcHVibGljIG1vZGVsTG9hZENhbmNlbGxlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cclxuICAvLyBBbmd1bGFyIGxpYnJhcmllcyBidWlsdCB3aXRoIG5nLXBhY2thZ3IgY2FuJ3QgYnVuZGxlIGBuZXcgV29ya2VyKG5ldyBVUkwoLi4uKSlgIHRoZW1zZWx2ZXMsXHJcbiAgLy8gc28gdGhlIGFwcCBpbnN0YW50aWF0ZXMgdGhlIHdvcmtlciAoaXRzIGJ1aWxkIHBpcGVsaW5lIHN1cHBvcnRzIGl0KSBhbmQgaGFuZHMgaXQgb3ZlciBoZXJlLlxyXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xyXG4gIHByaXZhdGUgb2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzID0gbmV3IE1hcDxzdHJpbmcsIHsgcmVzb2x2ZTogKG1lc2hlczogUGFyc2VkTWVzaERhdGFbXSkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkIH0+KCk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxyXG5cclxuICAvKipcclxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxyXG4gICAqIE11c3QgYmUgaW5zdGFudGlhdGVkIGJ5IHRoZSBjb25zdW1pbmcgYXBwIChlLmcuIGBuZXcgV29ya2VyKG5ldyBVUkwoJy4vb2JqLXBhcnNlci53b3JrZXInLCBpbXBvcnQubWV0YS51cmwpKWApLFxyXG4gICAqIHNpbmNlIGEgbGlicmFyeSBwYWNrYWdlZCB3aXRoIG5nLXBhY2thZ3IgY2Fubm90IGJ1bmRsZSB3b3JrZXIgZmlsZXMgaXRzZWxmLlxyXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cclxuICAgKi9cclxuICBzZXRPYmpQYXJzZXJXb3JrZXIod29ya2VyOiBXb3JrZXIpOiB2b2lkIHtcclxuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xyXG4gICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIub25tZXNzYWdlID0gKHsgZGF0YSB9OiBNZXNzYWdlRXZlbnQ8T2JqUGFyc2VyV29ya2VyUmVzcG9uc2U+KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5nZXQoZGF0YS5yZXF1ZXN0SWQpO1xyXG4gICAgICBpZiAoIXBlbmRpbmcpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcclxuICAgICAgaWYgKGRhdGEuc3VjY2VzcyAmJiBkYXRhLm1lc2hlcykge1xyXG4gICAgICAgIHBlbmRpbmcucmVzb2x2ZShkYXRhLm1lc2hlcyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcGVuZGluZy5yZWplY3QobmV3IEVycm9yKGRhdGEuZXJyb3IgfHwgJ1Vua25vd24gZXJyb3Igd2hpbGUgcGFyc2luZyBPQkogZmlsZSBpbiB3b3JrZXInKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCByZXF1ZXN0SWQgPSBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnNsaWNlKDIpfWA7XHJcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xyXG4gICAgICB0aGlzLm9ialBhcnNlcldvcmtlciEucG9zdE1lc3NhZ2UoeyByZXF1ZXN0SWQsIG9ialVybCB9KTtcclxuICAgICAgLy8gRGlhZ25vc3RpYyBvbmx5OiBsYXJnZSBtb2RlbHMgbGVnaXRpbWF0ZWx5IHRha2UgYSB3aGlsZSwgdGhpcyBpc24ndCBhIHRpbWVvdXQvYWJvcnQsXHJcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLm9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cy5oYXMocmVxdWVzdElkKSkge1xyXG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LCA2MDAwMCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXHJcbiAgcHJpdmF0ZSBtZXNoRnJvbVBhcnNlZERhdGEoZGF0YTogUGFyc2VkTWVzaERhdGEsIG1hdGVyaWFscz86IGFueSk6IFRIUkVFLk1lc2gge1xyXG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgVEhSRUUuQnVmZmVyR2VvbWV0cnkoKTtcclxuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcclxuICAgIGlmIChkYXRhLnV2KSB7XHJcbiAgICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgndXYnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEudXYsIDIpKTtcclxuICAgIH1cclxuICAgIC8vIEluZGV4IGhhcyB0byBiZSBzZXQgYmVmb3JlIGFueSBub3JtYWwgY29tcHV0YXRpb24sIHdoaWNoIHJlYWRzIGl0IHRvIGF2ZXJhZ2Ugc2hhcmVkIGZhY2VzLlxyXG4gICAgaWYgKGRhdGEuaW5kZXgpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YS5ub3JtYWwpIHtcclxuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBnZW9tZXRyeS5jb21wdXRlVmVydGV4Tm9ybWFscygpO1xyXG4gICAgfVxyXG4gICAgLy8gQm94My5zZXRGcm9tT2JqZWN0KCkgcmV1c2VzIGFuIGFscmVhZHktc2V0IGJvdW5kaW5nQm94IGluc3RlYWQgb2Ygd2Fsa2luZyBldmVyeSB2ZXJ0ZXgsXHJcbiAgICAvLyBzbyBhZG9wdGluZyB0aGUgd29ya2VyJ3MgbWFrZXMgZnJhbWluZyB0aGUgY2FtZXJhIGNoZWFwIG5vIG1hdHRlciBob3cgZGVuc2UgdGhlIG1lc2ggaXMuXHJcbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xyXG4gICAgICBnZW9tZXRyeS5ib3VuZGluZ0JveCA9IG5ldyBUSFJFRS5Cb3gzKFxyXG4gICAgICAgIG5ldyBUSFJFRS5WZWN0b3IzKC4uLmRhdGEuYm91bmRpbmdCb3gubWluKSxcclxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVzb2x2ZWRNYXRlcmlhbHMgPSBkYXRhLm1hdGVyaWFsTmFtZXMubWFwKChuYW1lKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFsID0gbWF0ZXJpYWxzICYmIG5hbWUgPyBtYXRlcmlhbHMuY3JlYXRlKG5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogbm8gTVRMIG1hdGVyaWFsIG5hbWVkIFwiJHtuYW1lfVwiIGZvciBtZXNoIFwiJHtkYXRhLm5hbWV9XCIsIHVzaW5nIGEgcGxhaW4gZmFsbGJhY2sgKG5vIHRleHR1cmUpLmApO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcclxuICAgIH0pO1xyXG5cclxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xyXG4gICAgaWYgKGRhdGEuZ3JvdXBzICYmIGRhdGEuZ3JvdXBzLmxlbmd0aCA+IDApIHtcclxuICAgICAgZGF0YS5ncm91cHMuZm9yRWFjaCgoZ3JvdXApID0+IGdlb21ldHJ5LmFkZEdyb3VwKGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCkpO1xyXG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIG1lc2ggPSBuZXcgVEhSRUUuTWVzaChnZW9tZXRyeSwgcmVzb2x2ZWRNYXRlcmlhbHNbMF0pO1xyXG4gICAgfVxyXG4gICAgbWVzaC5uYW1lID0gZGF0YS5uYW1lO1xyXG4gICAgcmV0dXJuIG1lc2g7XHJcbiAgfVxyXG5cclxuICBpbml0KGNhbnZhczogSFRNTENhbnZhc0VsZW1lbnQpOiB2b2lkIHtcclxuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxyXG4gICAgLy8gZnJvbSB0aGUgcHJldmlvdXMgc2NlbmUgaXMgc3RpbGwgaGVyZS4gVHdvIHRoaW5ncyBvdXRsaXZlIGl0IGFuZCBoYXZlIHRvIGdvIGZpcnN0OlxyXG4gICAgLy9cclxuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XHJcbiAgICAvLyAgICBieSB0aGVuLCBzbyB0aGUgbW9kZWwgYmVpbmcgYWJhbmRvbmVkIHdvdWxkIGJlIGhhbmRlZCB0byB0aGUgc2NlbmUgYnVpbHQgYmVsb3cuXHJcbiAgICAvLyAgLSBUaGUgdGFnIGdyb3VwLCB3aGljaCBpcyBhIGZpZWxkIGFuZCBrZWVwcyBpdHMgc3ByaXRlcy4gVGhleSB3b3VsZCBiZSByZS1wYXJlbnRlZCB1bmRlciB0aGVcclxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIHRoaXMubW9kZWxSb290ID0gdW5kZWZpbmVkO1xyXG5cclxuICAgIC8vIDEuIFNldHVwIFNjZW5lXHJcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XHJcbiAgICB0aGlzLnNjZW5lLmJhY2tncm91bmQgPSBuZXcgVEhSRUUuQ29sb3IoMHhlMGY3ZmYpOyAvLyBmcm9tIFBPQ1xyXG5cclxuICAgIC8vIDIuIFNldHVwIENhbWVyYVxyXG4gICAgdGhpcy5jYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoNzUsIGNhbnZhcy5jbGllbnRXaWR0aCAvIGNhbnZhcy5jbGllbnRIZWlnaHQsIDAuMSwgMTAwMDApO1xyXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24uc2V0KDAsIDUsIDEwKTsgLy8gd2lsbCBiZSBvdmVycmlkZGVuIGxhdGVyIGlmIHBhc3NlZFxyXG5cclxuICAgIC8vIDMuIFNldHVwIFdlYkdMIFJlbmRlcmVyXHJcbiAgICB0aGlzLnJlbmRlcmVyID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoeyBjYW52YXMsIGFudGlhbGlhczogdHJ1ZSB9KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZShjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRQaXhlbFJhdGlvKE1hdGgubWluKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvLCAxLjUpKTtcclxuICAgIHRoaXMub2JzZXJ2ZUNhbnZhc1Jlc2l6ZShjYW52YXMpO1xyXG4gICAgXHJcbiAgICAvLyBGaXggZm9yIFRocmVlLmpzIHIxNDcgdnMgcjE1MisgY29sb3IgbWFuYWdlbWVudFxyXG4gICAgaWYgKCdvdXRwdXRDb2xvclNwYWNlJyBpbiB0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0Q29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2VcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0RW5jb2RpbmcgPSAzMDAxOyAvLyBUSFJFRS5zUkdCRW5jb2RpbmdcclxuICAgIH1cclxuXHJcbiAgICAvLyBXaXRob3V0IHRvbmUgbWFwcGluZyBhbnl0aGluZyBicmlnaHRlciB0aGFuIDEuMCBpcyBzaW1wbHkgY3V0IG9mZiB0byBwdXJlIHdoaXRlLiBDYXB0dXJlZFxyXG4gICAgLy8gdGV4dHVyZXMgY2FycnkgYSBzbWFsbCBmcmFjdGlvbiBvZiB2ZXJ5IGJyaWdodCBwaXhlbHMgLSBza3kgcmVmbGVjdGVkIGluIHdpbmRvd3MsIHN1bmxpdFxyXG4gICAgLy8gcmVuZGVyIC0gYW5kIG9uY2UgbGlnaHRpbmcgcHVzaGVzIHRob3NlIHBhc3QgdGhlIGxpbWl0IHRoZXkgZmxhdHRlbiBpbnRvIHdoaXRlIHNwZWNrcyB3aXRoXHJcbiAgICAvLyBubyBkZXRhaWwgbGVmdC4gUm9sbGluZyB0aGUgaGlnaGxpZ2h0cyBvZmYgaW5zdGVhZCBrZWVwcyB0aGF0IGRldGFpbCBhbmQga2VlcHMgYnJpZ2h0IGFyZWFzXHJcbiAgICAvLyByZWFkaW5nIGFzIGJyaWdodCByYXRoZXIgdGhhbiBibG93bi5cclxuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmcgPSBUSFJFRS5BQ0VTRmlsbWljVG9uZU1hcHBpbmc7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nRXhwb3N1cmUgPSAxLjA7XHJcblxyXG4gICAgLy8gNC4gTGlnaHRpbmcsIGtlcHQgZGVsaWJlcmF0ZWx5IHJlc3RyYWluZWQgYW5kIG5ldXRyYWwuXHJcbiAgICAvL1xyXG4gICAgLy8gQ2FwdHVyZWQvcGhvdG9ncmFtbWV0cnkgbW9kZWxzIGFscmVhZHkgaGF2ZSBsaWdodGluZyBiYWtlZCBpbnRvIHRoZWlyIHRleHR1cmVzICh0aGUgc3VuIGFuZFxyXG4gICAgLy8gc2hhZG93cyBjYW1lIHdpdGggdGhlIHBob3RvcyksIHNvIGxpZ2h0aW5nIHRoZW0gYWdhaW4gZGlzdG9ydHMgd2hhdCB0aGV5IGFjdHVhbGx5IGxvb2sgbGlrZS5cclxuICAgIC8vIFRoZSBpbnRlbnNpdGllcyBiZWxvdyBhZGQgdXAgdG8gcm91Z2hseSAxLjAgb24gYSBzdXJmYWNlIGZhY2luZyB0aGUgdmlld2VyLCB3aGljaCByZW5kZXJzIHRoZVxyXG4gICAgLy8gdGV4dHVyZSBhdCBpdHMgdHJ1ZSB2YWx1ZS4gQW55dGhpbmcgYWJvdmUgMS4wIGlzIGNsaXBwZWQgdG8gcHVyZSB3aGl0ZSBieSB0aGUgcmVuZGVyZXIsIHdoaWNoXHJcbiAgICAvLyBpcyB3aGF0IHR1cm5zIGJyaWdodCBhcmVhcyBpbnRvIGZsYXQgd2hpdGUgcGF0Y2hlcyB3aXRoIG5vIGRldGFpbCBsZWZ0IGluIHRoZW0uXHJcbiAgICAvL1xyXG4gICAgLy8gTmV1dHJhbCB3aGl0ZSBpcyB1c2VkIHJhdGhlciB0aGFuIGEgd2FybSB0aW50IGZvciB0aGUgc2FtZSByZWFzb246IGEgdGludGVkIGxpZ2h0IHNoaWZ0cyBldmVyeVxyXG4gICAgLy8gY29sb3VyIGluIHRoZSBtb2RlbCBhd2F5IGZyb20gd2hhdCB3YXMgY2FwdHVyZWQuXHJcbiAgICBjb25zdCBhbWJpZW50TGlnaHQgPSBuZXcgVEhSRUUuQW1iaWVudExpZ2h0KDB4ZmZmZmZmLCAwLjcpO1xyXG4gICAgdGhpcy5zY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcclxuXHJcbiAgICAvLyBIZWFkbGlnaHQgcmF0aGVyIHRoYW4gYSBmaXhlZCBzdW46IHBhcmVudGVkIHRvIHRoZSBjYW1lcmEgc28gaXQgYWx3YXlzIHBvaW50cyBhdCB3aGF0ZXZlciBpc1xyXG4gICAgLy8gYmVpbmcgbG9va2VkIGF0LCBnaXZpbmcgc2hhcGUgdG8gc3VyZmFjZXMgd2l0aG91dCBldmVyIGxlYXZpbmcgYSBmYWNlIHVubGl0LiBObyBzaGFkb3cgY2FzdGluZ1xyXG4gICAgLy8gLSBzaGFkb3dzIHdvdWxkIGRvdWJsZSB1cCB3aXRoIHRoZSBvbmVzIGFscmVhZHkgYmFrZWQgaW50byB0aGUgdGV4dHVyZXMsIGFuZCB0aGUgc2hhZG93IG1hcFxyXG4gICAgLy8gd2FzIGEgcmVhbCBjb3N0IHBlciBmcmFtZS5cclxuICAgIGNvbnN0IGhlYWRMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjM1KTtcclxuICAgIGhlYWRMaWdodC5wb3NpdGlvbi5zZXQoMCwgMCwgMSk7XHJcbiAgICB0aGlzLmNhbWVyYS5hZGQoaGVhZExpZ2h0KTtcclxuICAgIC8vIEEgbGlnaHQgb25seSBjb250cmlidXRlcyB3aGlsZSBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgYW5kIHRoaXMgb25lIGhhbmdzIG9mZiB0aGUgY2FtZXJhLlxyXG4gICAgdGhpcy5zY2VuZS5hZGQodGhpcy5jYW1lcmEpO1xyXG5cclxuICAgIC8vIDUuIFNldHVwIENvbnRyb2xzIChmcm9tIFBPQylcclxuICAgIHRoaXMuY29udHJvbHMgPSBuZXcgT3JiaXRDb250cm9scyh0aGlzLmNhbWVyYSwgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50KTtcclxuICAgIHRoaXMuY29udHJvbHMucm90YXRlU3BlZWQgPSAxLjA7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmVuYWJsZURhbXBpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5jb250cm9scy5tb3VzZUJ1dHRvbnMgPSB7XHJcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcclxuICAgICAgTUlERExFOiBUSFJFRS5NT1VTRS5ET0xMWSxcclxuICAgICAgUklHSFQ6IFRIUkVFLk1PVVNFLlBBTixcclxuICAgIH07XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcblxyXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignc3RhcnQnLCAoKSA9PiB7XHJcbiAgICAgIHRoaXMuaXNEcmFnZ2luZ1RpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcclxuICAgICAgfSwgMTUwKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuY29udHJvbHMuYWRkRXZlbnRMaXN0ZW5lcignZW5kJywgKCkgPT4ge1xyXG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5pc0RyYWdnaW5nVGltZXIpO1xyXG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzRHJhZ2dpbmdDYW1lcmEgPSBmYWxzZTtcclxuICAgICAgICB9LCAyNTApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBJbnRlcmFjdGlvbiBFdmVudCBMaXN0ZW5lcnMgb24gY2FudmFzXHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uTW91c2VDbGljay5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XHJcblxyXG4gICAgLy8gRXNjYXBlIGJhY2tzIG91dCBvZiBwbGFjZW1lbnQgYW5kIGNhbGlicmF0aW9uLiBPbiB0aGUgd2luZG93IHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIHdoaWNoXHJcbiAgICAvLyB3b3VsZCBuZWVkIGZvY3VzIHRoZSB1c2VyIGhhcyBubyByZWFzb24gdG8gaGF2ZSBnaXZlbiBpdCAtIHRoZXkgYXJlIGFpbWluZyB3aXRoIHRoZSBtb3VzZS5cclxuICAgIC8vIFJlbW92ZWQgZmlyc3QgYmVjYXVzZSB0aGlzIHNlcnZpY2UgaXMgYSBzaW5nbGV0b246IGluaXQoKSBydW5zIGFnYWluIGZvciBldmVyeSBjYW52YXMsIGFuZFxyXG4gICAgLy8gdGhlIHByZXZpb3VzIHJlZ2lzdHJhdGlvbiB3b3VsZCBvdGhlcndpc2Ugc3RpbGwgYmUgYXR0YWNoZWQuXHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIHRoaXMucGlja1RhcmdldD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrVGFyZ2V0ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbD8uZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMucGlja0NhbWVyYSA9IHVuZGVmaW5lZDtcclxuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xyXG5cclxuICAgIC8vIDYuIFN0YXJ0IHRoZSByZW5kZXIgbG9vcFxyXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xyXG4gICAgICB0aGlzLmFuaW1hdGUoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUGF0aCAoc2VydmVkIGJ5IHRoZSBhcHApIGhvbGRpbmcgYmFzaXNfdHJhbnNjb2Rlci5qcy8ud2FzbSwgd2hpY2ggS1RYMkxvYWRlciBuZWVkcyB0byB0dXJuXHJcbiAgICogQmFzaXMgVW5pdmVyc2FsIHRleHR1cmVzIGludG8gd2hhdGV2ZXIgY29tcHJlc3NlZCBmb3JtYXQgdGhlIGxvY2FsIEdQVSBhY3R1YWxseSBzdXBwb3J0cy5cclxuICAgKi9cclxuICBwcml2YXRlIGt0eDJUcmFuc2NvZGVyUGF0aCA9ICdhc3NldHMvYmFzaXMvJztcclxuXHJcbiAgLyoqIE92ZXJyaWRlcyB3aGVyZSB0aGUgQmFzaXMgdHJhbnNjb2RlciBmaWxlcyBhcmUgc2VydmVkIGZyb20uICovXHJcbiAgc2V0S3R4MlRyYW5zY29kZXJQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy5rdHgyVHJhbnNjb2RlclBhdGggPSBwYXRoO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTG9hZHMgYSBiYXNlIDNEIG1vZGVsIGluIEdMVEYvR0xCIGZvcm1hdCAtIHRoZSBwcmVmZXJyZWQgZm9ybWF0IGZvciBsYXJnZSBtb2RlbHMuXHJcbiAgICogVW5saWtlIC5vYmosIGdlb21ldHJ5IGFycml2ZXMgYXMgYmluYXJ5IHR5cGVkIGFycmF5cyAobm8gdGV4dCBwYXJzaW5nIHRvIG9mZmxvYWQgdG8gYSB3b3JrZXIpXHJcbiAgICogYW5kIHN0YXlzIGluZGV4ZWQsIHNvIGZhciBsZXNzIGRhdGEgcmVhY2hlcyB0aGUgR1BVLiBLVFgyIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQgdG9vOiB0aGV5XHJcbiAgICogc3RheSBjb21wcmVzc2VkIGluIFZSQU0gaW5zdGVhZCBvZiBiZWluZyBkZWNvZGVkIHRvIHJhdyBwaXhlbHMgbGlrZSBKUEVHL1BORy5cclxuICAgKi9cclxuICBsb2FkR0xURk1vZGVsKHVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIGNhY2hlS2V5Pzogc3RyaW5nLCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2FkZXIgPSBuZXcgR0xURkxvYWRlcigpO1xyXG5cclxuICAgIC8vIEtUWDIgbmVlZHMgdGhlIHJlbmRlcmVyIHRvIHJlcG9ydCB3aGljaCBjb21wcmVzc2VkIGZvcm1hdHMgdGhpcyBHUFUgYWNjZXB0cywgc28gdGhpcyBoYXMgdG9cclxuICAgIC8vIGhhcHBlbiBhZnRlciBpbml0KCkuIEd1YXJkZWQgc28gYSBtb2RlbCB3aXRob3V0IEtUWDIgdGV4dHVyZXMgc3RpbGwgbG9hZHMgaWYgaXQncyBtaXNzaW5nLlxyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdHJ5IHtcclxuICAgICAgICBjb25zdCBrdHgyTG9hZGVyID0gbmV3IEtUWDJMb2FkZXIoKVxyXG4gICAgICAgICAgLnNldFRyYW5zY29kZXJQYXRoKHRoaXMua3R4MlRyYW5zY29kZXJQYXRoKVxyXG4gICAgICAgICAgLmRldGVjdFN1cHBvcnQodGhpcy5yZW5kZXJlcik7XHJcbiAgICAgICAgbG9hZGVyLnNldEtUWDJMb2FkZXIoa3R4MkxvYWRlcik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgICAgY29uc29sZS53YXJuKCdUaHJlZUpzU2VydmljZTogY291bGQgbm90IHNldCB1cCBLVFgyIHRleHR1cmUgc3VwcG9ydCwgZmFsbGluZyBiYWNrIHRvIHVuY29tcHJlc3NlZCB0ZXh0dXJlcy4nLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vIExldHMgZ2x0ZnBhY2svZ2x0Zi10cmFuc2Zvcm0gb3V0cHV0IHVzaW5nIEVYVF9tZXNob3B0X2NvbXByZXNzaW9uIGxvYWQgd2l0aG91dCBleHRyYSBzZXR1cC5cclxuICAgIGxvYWRlci5zZXRNZXNob3B0RGVjb2RlcihNZXNob3B0RGVjb2Rlcik7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcbiAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDApO1xyXG5cclxuICAgIC8vIE9yZGVyIG1hdHRlcnM6IG5vcm1hbHMgbXVzdCBleGlzdCBiZWZvcmUgYW5pc290cm9weSwgYW5kIHRoZSBQaG9uZyBjb252ZXJzaW9uIGhhcyB0byBydW5cclxuICAgIC8vIGJlZm9yZSBzaWRlL2ZsYXRTaGFkaW5nIGFyZSB0b3VjaGVkIHNvIHRob3NlIHNldHRpbmdzIGxhbmQgb24gdGhlIG1hdGVyaWFscyB3ZSBrZWVwLlxyXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuY29udmVydFRvUGhvbmdNYXRlcmlhbHMoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMuZm9yY2VEb3VibGVTaWRlZE1hdGVyaWFscyhnbHRmLnNjZW5lKTtcclxuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xyXG4gICAgICB0aGlzLnR1bmVUZXh0dXJlU2FtcGxpbmcoZ2x0Zi5zY2VuZSk7XHJcbiAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKGdsdGYuc2NlbmUsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbiwgdXApO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICB9O1xyXG4gICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cclxuICAgICAgaWYgKGVycm9yPy5uYW1lID09PSAnQWJvcnRFcnJvcicpIHtcclxuICAgICAgICAvLyBPbmx5IGEgY2FuY2VsIG9mIHRoZSBsb2FkIHRoYXQgaXMgc3RpbGwgY3VycmVudCBjYW1lIGZyb20gdGhlIHVzZXI7IGFueXRoaW5nIGVsc2UgaXMgdGhpc1xyXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXHJcbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcclxuICAgICAgICAgIHRoaXMubW9kZWxMb2FkQ2FuY2VsbGVkJC5uZXh0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGxvYWRpbmcgR0xURiBtb2RlbDonLCBlcnJvcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KG51bGwpO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyBHTFRGTG9hZGVyIGRlY29kZXMgZW1iZWRkZWQgaW1hZ2VzIHdpdGggY3JlYXRlSW1hZ2VCaXRtYXAgd2hlbiB0aGUgYnJvd3NlciBvZmZlcnMgaXQsIGFuZCBvblxyXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcclxuICAgIC8vIHRoZSBtb2RlbC4gVGhlIGV4YWN0IHNhbWUgYnl0ZXMgZGVjb2RlZCB0aHJvdWdoIGFuIEhUTUxJbWFnZUVsZW1lbnQsIHdoaWNoIGlzIHdoYXQgdGhlIC5vYmpcclxuICAgIC8vIHBhdGggdXNlcyB2aWEgTVRMTG9hZGVyLCBjb21lIG91dCBjbGVhbi4gR0xURkxvYWRlciBhbHJlYWR5IGZhbGxzIGJhY2sgdG8gdGhhdCBkZWNvZGVyIGZvclxyXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxyXG4gICAgLy9cclxuICAgIC8vIFRoZSBkZWNvZGVyIGlzIGNob3NlbiB3aGlsZSBHTFRGUGFyc2VyIGlzIGJlaW5nIGNvbnN0cnVjdGVkLCB3aGljaCBoYXBwZW5zIHN5bmNocm9ub3VzbHlcclxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXHJcbiAgICAvLyBmb3IgdGhlIHdob2xlIGRvd25sb2FkLlxyXG4gICAgdGhpcy5mZXRjaFdpdGhQcm9ncmVzcyh1cmwsIGNhY2hlS2V5KVxyXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcclxuICAgICAgLy8gYWN0dWFsbHkgcGFpbnRlZCBmaXJzdCwgb3RoZXJ3aXNlIHRoZSBmaW5hbCBwcm9ncmVzcyB1cGRhdGUgbmV2ZXIgcmVhY2hlcyB0aGUgc2NyZWVuIGFuZFxyXG4gICAgICAvLyB0aGUgYmFyIGFwcGVhcnMgdG8gc3RhbGwgc2hvcnQgb2YgdGhlIGVuZC5cclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcclxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4ge1xyXG4gICAgICAgIC8vIHBhcnNlKCkgY2Fubm90IGJlIGludGVycnVwdGVkLCBzbyBhIGNhbmNlbCB0aGF0IGxhbmRzIGR1cmluZyB0aGUgcGFpbnQgeWllbGQgaGFzIHRvIGJlXHJcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cclxuICAgICAgICBpZiAodGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5zaWduYWwuYWJvcnRlZCkge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IERPTUV4Y2VwdGlvbignTW9kZWwgbG9hZCBjYW5jZWxsZWQnLCAnQWJvcnRFcnJvcicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBnbG9iYWxTY29wZSA9IGdsb2JhbFRoaXMgYXMgYW55O1xyXG4gICAgICAgIGNvbnN0IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXAgPSBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgbG9hZGVyLnBhcnNlKGJ1ZmZlciwgdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpLCBvbkxvYWRlZCwgb25FcnJvcik7XHJcbiAgICAgICAgfSBmaW5hbGx5IHtcclxuICAgICAgICAgIGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwID0gb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcDtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChvbkVycm9yKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0b3BzIHRoZSBtb2RlbCBkb3dubG9hZCBpbiBwcm9ncmVzcywgaWYgYW55LlxyXG4gICAqXHJcbiAgICogT25seSB0aGUgZG93bmxvYWQgY2FuIGJlIGludGVycnVwdGVkOiBwYXJzZSgpIHJ1bnMgc3luY2hyb25vdXNseSBhbmQgaG9sZHMgdGhlIG1haW4gdGhyZWFkIHVudGlsXHJcbiAgICogaXQgZmluaXNoZXMsIHNvIG9uY2UgaXQgaGFzIGJlZ3VuIHRoZXJlIGlzIG5vdGhpbmcgdG8gY2FuY2VsLiBJbiBwcmFjdGljZSB0aGUgZG93bmxvYWQgaXMgdGhlXHJcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXHJcbiAgICovXHJcbiAgY2FuY2VsTW9kZWxMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWJhbmRvbnMgdGhlIGxvYWQgaW4gcHJvZ3Jlc3Mgd2l0aG91dCByZXBvcnRpbmcgaXQgYXMgY2FuY2VsbGVkLlxyXG4gICAqXHJcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcclxuICAgKiBvbmx5IHdoaWxlIHRoZSBjb250cm9sbGVyIHRoYXQgYWJvcnRlZCBpcyBzdGlsbCB0aGUgY3VycmVudCBvbmUuIFRlYXJpbmcgZG93biBvciByZWJ1aWxkaW5nIHRoZVxyXG4gICAqIHNjZW5lIGlzIG5vdCBzb21ldGhpbmcgdGhlIHBlcnNvbiBhc2tlZCBmb3IsIHNvIGl0IG11c3Qgbm90IHN1cmZhY2UgYXMgXCJsb2FkaW5nIGNhbmNlbGxlZFwiLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZGlzY2FyZEN1cnJlbnRMb2FkKCk6IHZvaWQge1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xyXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVzb2x2ZXMgb25jZSB0aGUgYnJvd3NlciBoYXMgcGFpbnRlZCBhdCBsZWFzdCBvbmUgZnJhbWUuXHJcbiAgICpcclxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxyXG4gICAqIGVub3VnaCB0byBndWFyYW50ZWUgcGVuZGluZyBET00gY2hhbmdlcyBhcmUgb24gc2NyZWVuOyB0aGUgc2Vjb25kIGZpcmVzIGFmdGVyIHRoZSBmaXJzdCBmcmFtZVxyXG4gICAqIGhhcyBnb25lIG91dC4gRmFsbHMgYmFjayB0byBhIHRpbWVvdXQgd2hlcmUgckFGIGlzbid0IGF2YWlsYWJsZSAoU1NSLCB0ZXN0cykuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZnRlck5leHRQYWludCgpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcclxuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRG93bmxvYWRzIGEgZmlsZSwgcmVwb3J0aW5nIHByb2dyZXNzIG9uIG1vZGVsTG9hZFByb2dyZXNzJCBhcyBpdCBhcnJpdmVzLlxyXG4gICAqXHJcbiAgICogR0xURkxvYWRlci5sb2FkKCkgd291bGQgcmVwb3J0IHByb2dyZXNzIHRocm91Z2ggWEhSLCBidXQgdGhpcyBwYXRoIGRlbGliZXJhdGVseSB1c2VzIGZldGNoKCkgK1xyXG4gICAqIHBhcnNlKCkgaW5zdGVhZCAoc2VlIGxvYWRHTFRGTW9kZWwgZm9yIHdoeSksIHNvIHByb2dyZXNzIGlzIHJlYWQgb2ZmIHRoZSByZXNwb25zZSBzdHJlYW0gaGVyZS5cclxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxyXG4gICAqIHN0cmVhbSByZXBvcnRzIGl0IGFzIGl0IGhhcHBlbnMgcmF0aGVyIHRoYW4gaW4gb25lIGp1bXAgYXQgdGhlIGVuZC5cclxuICAgKi9cclxuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcclxuICAgIC8vIEEgbG9hZCBhbHJlYWR5IHJ1bm5pbmcgaXMgcmVwbGFjZWQsIG5vdCByYWNlZDogd2hpY2hldmVyIGZpbmlzaGVkIGxhc3Qgd291bGQgb3RoZXJ3aXNlIHdpbi5cclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcclxuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcclxuICAgIGNvbnN0IHsgc2lnbmFsIH0gPSB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI7XHJcblxyXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xyXG4gICAgaWYgKGNhY2hlZCkge1xyXG4gICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KDEpO1xyXG4gICAgICByZXR1cm4gY2FjaGVkO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcclxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggJHt1cmx9OiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fWApO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbnRlbnRMZW5ndGggPSBOdW1iZXIocmVzcG9uc2UuaGVhZGVycy5nZXQoJ0NvbnRlbnQtTGVuZ3RoJykpO1xyXG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcclxuXHJcbiAgICAvLyBXaXRob3V0IGEgcmVhZGFibGUgc3RyZWFtIChvbGRlciBicm93c2Vycywgc29tZSBwb2x5ZmlsbHMpIHRoZXJlIGlzIG5vdGhpbmcgdG8gbWVhc3VyZSwgc29cclxuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cclxuICAgIGlmICghcmVzcG9uc2UuYm9keT8uZ2V0UmVhZGVyKSB7XHJcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XHJcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XHJcblxyXG4gICAgLy8gV2l0aCBhIGtub3duIHNpemUsIHdyaXRlIGNodW5rcyBzdHJhaWdodCBpbnRvIG9uZSBwcmUtYWxsb2NhdGVkIGJ1ZmZlci4gQ29sbGVjdGluZyB0aGVtIGluIGFuXHJcbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcclxuICAgIC8vIGFuIGF2b2lkYWJsZSAzMDArIE1CIHBlYWsuXHJcbiAgICBjb25zdCBidWZmZXIgPSB0b3RhbCA+IDAgPyBuZXcgVWludDhBcnJheSh0b3RhbCkgOiBudWxsO1xyXG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcclxuICAgIGxldCB1c2luZ0J1ZmZlciA9IGJ1ZmZlciAhPT0gbnVsbDtcclxuICAgIGxldCByZWNlaXZlZCA9IDA7XHJcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cclxuICAgIC8vIGV2ZXJ5IG9uZSB3b3VsZCBydW4gY2hhbmdlIGRldGVjdGlvbiBqdXN0IGFzIG9mdGVuIHRvIG1vdmUgYSBiYXIgdGhhdCBpcyBtZWFzdXJlZCBpbiB3aG9sZVxyXG4gICAgLy8gcGVyY2VudCwgc28gb25seSByZXBvcnQgd2hlbiB0aGUgZGlzcGxheWVkIHZhbHVlIHdvdWxkIGFjdHVhbGx5IGNoYW5nZS5cclxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcclxuXHJcbiAgICBpZiAodG90YWwgPT09IDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuXHJcbiAgICBmb3IgKDs7KSB7XHJcbiAgICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XHJcbiAgICAgIGlmIChkb25lKSB7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB7XHJcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxyXG4gICAgICAgIGF3YWl0IHJlYWRlci5jYW5jZWwoKTtcclxuICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkICsgdmFsdWUubGVuZ3RoID4gdG90YWwpIHtcclxuICAgICAgICAvLyBDb250ZW50LUxlbmd0aCB1bmRlcnN0YXRlZCB0aGUgcmVhbCBzaXplLiBNb3ZlIHdoYXQgd2UgaGF2ZSBpbnRvIHRoZSBjaHVuayBsaXN0IGFuZCBzdGF5XHJcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cclxuICAgICAgICBjaHVua3MucHVzaChidWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpKTtcclxuICAgICAgICB1c2luZ0J1ZmZlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh1c2luZ0J1ZmZlcikge1xyXG4gICAgICAgIGJ1ZmZlci5zZXQodmFsdWUsIHJlY2VpdmVkKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjaHVua3MucHVzaCh2YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xyXG4gICAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgICAgY29uc3QgcGVyY2VudCA9IE1hdGgubWluKE1hdGgucm91bmQoKHJlY2VpdmVkIC8gdG90YWwpICogMTAwKSwgMTAwKTtcclxuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XHJcbiAgICAgICAgICBsYXN0UmVwb3J0ZWQgPSBwZXJjZW50O1xyXG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChwZXJjZW50IC8gMTAwKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgc3RyZWFtIGNhbiBlbmQgYmVsb3cgdGhlIGFkdmVydGlzZWQgc2l6ZSAob3Igd2l0aCBubyBzaXplIGF0IGFsbCkuIExhbmQgb24gYSBmdWxsIGJhclxyXG4gICAgLy8gcmF0aGVyIHRoYW4gbGVhdmluZyBpdCBzdHVjayBhdCB3aGF0ZXZlciB0aGUgbGFzdCBjaHVuayBoYXBwZW5lZCB0byByZWFjaC5cclxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcclxuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dCgxKTtcclxuICAgIH1cclxuXHJcbiAgICBsZXQgcmVzdWx0OiBBcnJheUJ1ZmZlcjtcclxuICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCA9PT0gdG90YWwpIHtcclxuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcclxuICAgIH0gZWxzZSBpZiAodXNpbmdCdWZmZXIpIHtcclxuICAgICAgLy8gRmV3ZXIgYnl0ZXMgdGhhbiBhZHZlcnRpc2VkOiBoYW5kIGJhY2sgZXhhY3RseSB3aGF0IGFycml2ZWQuXHJcbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgbWVyZ2VkID0gbmV3IFVpbnQ4QXJyYXkocmVjZWl2ZWQpO1xyXG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcclxuICAgICAgY2h1bmtzLmZvckVhY2goKGNodW5rKSA9PiB7XHJcbiAgICAgICAgbWVyZ2VkLnNldChjaHVuaywgb2Zmc2V0KTtcclxuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xyXG4gICAgICB9KTtcclxuICAgICAgcmVzdWx0ID0gbWVyZ2VkLmJ1ZmZlcjtcclxuICAgIH1cclxuXHJcbiAgICBhd2FpdCB0aGlzLndyaXRlTW9kZWxUb0NhY2hlKGNhY2hlS2V5LCByZXN1bHQpO1xyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBtb2RlbCBzdG9yZSwgb3IgbnVsbCB3aGVyZSB0aGUgYnJvd3NlciB3aWxsIG5vdCBnaXZlIHVzIG9uZS5cclxuICAgKlxyXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxyXG4gICAqIHdlYnZpZXdzLiBFdmVyeSBjYWxsZXIgdHJlYXRzIHRoYXQgYXMgYSBtaXNzIC0gY2FjaGluZyBpcyBhbiBvcHRpbWlzYXRpb24sIG5ldmVyIGEgcmVxdWlyZW1lbnQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xyXG4gICAgaWYgKHR5cGVvZiBjYWNoZXMgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIGF3YWl0IGNhY2hlcy5vcGVuKFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXHJcbiAgICpcclxuICAgKiBLZXllZCBieSB0aGUgUzMga2V5IHJhdGhlciB0aGFuIHRoZSBVUkwgaXQgaXMgZmV0Y2hlZCBmcm9tOiB0aGF0IFVSTCBpcyBzaWduZWQsIHNvIGl0IGNhcnJpZXMgYVxyXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXHJcbiAgICogbWlzc2VzIGZvciB0aGUgc2FtZSByZWFzb24sIHdoaWNoIGlzIHdoeSB0aGlzIGV4aXN0cyBhdCBhbGwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xyXG4gICAgaWYgKCFjYWNoZUtleSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XHJcbiAgICAgIHJldHVybiBoaXQgPyBhd2FpdCBoaXQuYXJyYXlCdWZmZXIoKSA6IG51bGw7XHJcbiAgICB9IGNhdGNoIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogU3RvcmVzIGEgbW9kZWwgZm9yIG5leHQgdGltZSwgZXZpY3RpbmcgdGhlIG9sZGVzdCBvbmNlIGEgZmV3IGFyZSBoZWxkLiAqL1xyXG4gIHByaXZhdGUgYXN5bmMgd3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCwgbW9kZWw6IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAoIWNhY2hlS2V5KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGNhY2hlID0gYXdhaXQgdGhpcy5vcGVuTW9kZWxDYWNoZSgpO1xyXG4gICAgICBpZiAoIWNhY2hlKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGF3YWl0IGNhY2hlLnB1dCh0aGlzLm1vZGVsQ2FjaGVVcmwoY2FjaGVLZXkpLCBuZXcgUmVzcG9uc2UobW9kZWwpKTtcclxuXHJcbiAgICAgIC8vIE1vZGVscyBydW4gdG8gaHVuZHJlZHMgb2YgbWVnYWJ5dGVzLCBzbyB0aGlzIGNhbm5vdCBncm93IHdpdGhvdXQgbGltaXQuIENhY2hlIFN0b3JhZ2Uga2VlcHNcclxuICAgICAgLy8gaW5zZXJ0aW9uIG9yZGVyLCB3aGljaCBtYWtlcyB0aGUgZnJvbnQgb2YgdGhlIGxpc3QgdGhlIGxlYXN0IHJlY2VudGx5IHN0b3JlZC5cclxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcclxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXHJcbiAgICAgICAga2V5cy5zbGljZSgwLCBNYXRoLm1heCgwLCBrZXlzLmxlbmd0aCAtIFRocmVlSnNTZXJ2aWNlLk1PREVMX0NBQ0hFX1NJWkUpKVxyXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcclxuICAgICAgKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIENhY2hlIFN0b3JhZ2Uga2V5cyBvbiBhIFVSTCwgc28gdGhlIFMzIGtleSBpcyBleHByZXNzZWQgYXMgb25lLiBJdCBpcyBuZXZlciByZXF1ZXN0ZWQuICovXHJcbiAgcHJpdmF0ZSBtb2RlbENhY2hlVXJsKGNhY2hlS2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRml0cyB0aGUgY2FtZXJhJ3MgY2xpcHBpbmcgcGxhbmVzIHRvIGhvdyBiaWcgdGhlIG1vZGVsIGFjdHVhbGx5IGlzLlxyXG4gICAqXHJcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcclxuICAgKiBpcyBhIHJhdGlvIG9mIDEwMDAwMCBmb3IgYSBtb2RlbCBvbmx5IH4xMCB1bml0cyBhY3Jvc3MuIFRoYXQgd2FzdGVzIG1vc3Qgb2YgdGhlIGRlcHRoIGJ1ZmZlciBvblxyXG4gICAqIGVtcHR5IHNwYWNlIGFuZCBsZXRzIG5lYXJseSBjb2luY2lkZW50IHN1cmZhY2VzIC0gd2hpY2ggY2FwdHVyZWQgbWVzaGVzIGhhdmUgZXZlcnl3aGVyZSAtXHJcbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGp1c3RDbGlwcGluZ1BsYW5lcyhyYWRpdXM6IG51bWJlcik6IHZvaWQge1xyXG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAwLjAxO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDA7XHJcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4xO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwO1xyXG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLm5lYXIgPSAxMDtcclxuICAgICAgdGhpcy5jYW1lcmEuZmFyID0gMTAwMDA7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTAwO1xyXG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU3dhcHMgdGhlIFBCUiBtYXRlcmlhbHMgR0xURkxvYWRlciBidWlsZHMgZm9yIHRoZSBwbGFpbiBQaG9uZyBvbmVzIHRoZSAub2JqIHBhdGggcHJvZHVjZXMuXHJcbiAgICpcclxuICAgKiBNZXNoU3RhbmRhcmRNYXRlcmlhbCBrZWVwcyBhIHNwZWN1bGFyIHJlZmxlY3Rpb24gZXZlbiBhdCBtZXRhbG5lc3MgMCwgc2luY2UgZXZlcnkgZGllbGVjdHJpY1xyXG4gICAqIHJlZmxlY3RzIHNvbWUgbGlnaHQsIGFuZCBGcmVzbmVsIGRyaXZlcyB0aGF0IHJlZmxlY3Rpb24gdG93YXJkcyB3aGl0ZSBhcyBhIHN1cmZhY2UgdHVybnMgYXdheVxyXG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXHJcbiAgICogYW5nbGVzLCB3aGljaCBwYWludHMgd2hpdGUgaGlnaGxpZ2h0cyBvdmVyIHdpbmRvdyBmcmFtZXMgYW5kIHJvb2YgZWRnZXMgLSB0aGUgc2FtZSBtb2RlbFxyXG4gICAqIGxvYWRlZCBhcyAub2JqIG5ldmVyIHNob3dzIHRoZW0sIGJlY2F1c2UgTVRMTG9hZGVyIGJ1aWxkcyBQaG9uZyBtYXRlcmlhbHMgYW5kIE9CSkxvYWRlciB6ZXJvZXNcclxuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXHJcbiAgICpcclxuICAgKiBDYXB0dXJlZCBtb2RlbHMgY2FycnkgdGhlaXIgbGlnaHRpbmcgaW4gdGhlIHRleHR1cmUgYW5kIHdhbnQgbm8gc3BlY3VsYXIgcmVzcG9uc2UgYXQgYWxsLCBzb1xyXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cclxuICAgKi9cclxuICBwcml2YXRlIGNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XHJcblxyXG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XHJcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGNvbnN0IGNvbnZlcnQgPSAoc291cmNlOiBhbnkpOiBhbnkgPT4ge1xyXG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xyXG4gICAgICAgICAgcmV0dXJuIHNvdXJjZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcclxuICAgICAgICAgIGNvbnN0IHBob25nID0gbmV3IFRIUkVFLk1lc2hQaG9uZ01hdGVyaWFsKHtcclxuICAgICAgICAgICAgbWFwOiBzb3VyY2UubWFwLFxyXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxyXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogc291cmNlLnRyYW5zcGFyZW50LFxyXG4gICAgICAgICAgICBvcGFjaXR5OiBzb3VyY2Uub3BhY2l0eSxcclxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxyXG4gICAgICAgICAgICBzaWRlOiBzb3VyY2Uuc2lkZSxcclxuICAgICAgICAgICAgc3BlY3VsYXI6IG5ldyBUSFJFRS5Db2xvcigweDAwMDAwMCksXHJcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgcGhvbmcubmFtZSA9IHNvdXJjZS5uYW1lO1xyXG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGNvbnZlcnRlZC5nZXQoc291cmNlKTtcclxuICAgICAgfTtcclxuXHJcbiAgICAgIG1lc2gubWF0ZXJpYWwgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpXHJcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxyXG4gICAgICAgIDogY29udmVydChtZXNoLm1hdGVyaWFsKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXHJcbiAgICpcclxuICAgKiBSZWFsaXR5IGNhcHR1cmUgbWVzaGVzIHJvdXRpbmVseSBjb250YWluIHRyaWFuZ2xlcyB3aXRoIHJldmVyc2VkIHdpbmRpbmcgLSBhbiBhcnRlZmFjdCBvZiB0aGVcclxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xyXG4gICAqIHNjYXR0ZXJlZCBob2xlcyB0aGF0IHNob3cgdGhlIHNjZW5lIGJhY2tncm91bmQgdGhyb3VnaCB0aGUgbW9kZWwuIEFnYWluc3QgYSBsaWdodCBiYWNrZ3JvdW5kXHJcbiAgICogdGhleSByZWFkIGFzIHdoaXRlIHNwZWNrcyB3aXRoIG5vIGRpc2Nlcm5pYmxlIHBhdHRlcm4uXHJcbiAgICpcclxuICAgKiBEcmF3aW5nIGJvdGggc2lkZXMgY29zdHMgYSBsaXR0bGUgZmlsbCByYXRlIGJ1dCBpcyB3aGF0IG1ha2VzIGNhcHR1cmVkIGdlb21ldHJ5IHJlbmRlciBhc1xyXG4gICAqIHNvbGlkOyBvdGhlciB2aWV3ZXJzIG9mIHRoaXMga2luZCBvZiBjb250ZW50IGRvIHRoZSBzYW1lIHVuY29uZGl0aW9uYWxseS5cclxuICAgKi9cclxuICBwcml2YXRlIGZvcmNlRG91YmxlU2lkZWRNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xyXG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChtYXRlcmlhbCAmJiAhc2Vlbi5oYXMobWF0ZXJpYWwpKSB7XHJcbiAgICAgICAgICBzZWVuLmFkZChtYXRlcmlhbCk7XHJcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcclxuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBDb21wdXRlcyByZWFsIHZlcnRleCBub3JtYWxzIGZvciBhbnkgZ2VvbWV0cnkgdGhhdCBhcnJpdmVkIHdpdGhvdXQgdGhlbS5cclxuICAgKlxyXG4gICAqIEEgZ2xURiB3aXRob3V0IGEgTk9STUFMIGF0dHJpYnV0ZSBpcyBzcGVjLWNvbXBsaWFudCwgYW5kIEdMVEZMb2FkZXIgaGFuZGxlcyBpdCBieSBzd2l0Y2hpbmcgdGhlXHJcbiAgICogbWF0ZXJpYWwgdG8gZmxhdFNoYWRpbmcsIHdoaWNoIG1ha2VzIHRoZSBzaGFkZXIgZGVyaXZlIHRoZSBub3JtYWwgcGVyIHBpeGVsIGZyb20gc2NyZWVuLXNwYWNlXHJcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcclxuICAgKiBjYXB0dXJlIG1lc2hlcyBhcmUgZnVsbCBvZjogdGhlIGZhY2UgaGFzIGFsbW9zdCBubyBhcmVhLCB0aGUgZGVyaXZlZCBub3JtYWwgaXMgbWVhbmluZ2xlc3MsIGFuZFxyXG4gICAqIGxpZ2h0aW5nIGJsb3dzIHRob3NlIGZyYWdtZW50cyBvdXQgdG8gd2hpdGUgc3BlY2tzIC0gZGVuc2VzdCBleGFjdGx5IHdoZXJlIGZpbmUgZGV0YWlsIGlzLlxyXG4gICAqXHJcbiAgICogQ29tcHV0aW5nIG5vcm1hbHMgZnJvbSB0aGUgZ2VvbWV0cnkgaW5zdGVhZCBpcyByb2J1c3QgdG8gdGhvc2UgdHJpYW5nbGVzLCBzaW5jZSBhIGRlZ2VuZXJhdGVcclxuICAgKiBmYWNlIGNvbnRyaWJ1dGVzIGFsbW9zdCBub3RoaW5nIHRvIHRoZSBhdmVyYWdlIGFuZCBpdHMgbmVpZ2hib3VycyBkb21pbmF0ZS5cclxuICAgKi9cclxuICBwcml2YXRlIGVuc3VyZVZlcnRleE5vcm1hbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcclxuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XHJcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xyXG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGdlb21ldHJ5ID0gbWVzaC5nZW9tZXRyeSBhcyBUSFJFRS5CdWZmZXJHZW9tZXRyeTtcclxuICAgICAgaWYgKGdlb21ldHJ5LmdldEF0dHJpYnV0ZSgnbm9ybWFsJykpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XHJcblxyXG4gICAgICAvLyBHTFRGTG9hZGVyIGFscmVhZHkgc3dpdGNoZWQgdGhlc2UgbWF0ZXJpYWxzIHRvIGZsYXRTaGFkaW5nIGJlY2F1c2Ugbm9ybWFscyB3ZXJlIG1pc3Npbmc7XHJcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcclxuICAgICAgICAgIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXHJcbiAgICpcclxuICAgKiBQaG90b2dyYW1tZXRyeSBhdGxhc2VzIHBhY2sgdGhlaXIgVVYgaXNsYW5kcyB3aXRoIHVudXNlZCBndXR0ZXIgcGl4ZWxzIGJldHdlZW4gdGhlbS4gTWlwbWFwcGluZ1xyXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXHJcbiAgICogc21hbGxlciB0aGUgbGV2ZWwgZ2V0cyAtIGFuZCB2aWV3aW5nIHRoZSB3aG9sZSBtb2RlbCBhdCBvbmNlIHVzZXMgdGhlIHNtYWxsZXN0IGxldmVscywgcGFpbnRpbmdcclxuICAgKiBicmlnaHQgZ3V0dGVyIHBpeGVscyBvdmVyIHRoZSBlZGdlcyBvZiBmaW5lIGRldGFpbC4gU2FtcGxpbmcgdGhlIGZ1bGwtcmVzb2x1dGlvbiBpbWFnZSBhdm9pZHNcclxuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXHJcbiAgICpcclxuICAgKiBOb3RlIHRoYXQgYW5pc290cm9weSBvbmx5IHRha2VzIGVmZmVjdCB3aGlsZSBtaXBtYXBwaW5nIGlzIG9uLCBzbyB3aXRoIHRoZSBzZXR0aW5ncyBiZWxvdyBpdCBpc1xyXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdHVuZVRleHR1cmVTYW1wbGluZyhyb290OiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XHJcbiAgICBpZiAoIW1heEFuaXNvdHJvcHkgfHwgbWF4QW5pc290cm9weSA8PSAxKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxhbnk+KCk7XHJcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xyXG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBtYXRlcmlhbHMgPSBBcnJheS5pc0FycmF5KG1lc2gubWF0ZXJpYWwpID8gbWVzaC5tYXRlcmlhbCA6IFttZXNoLm1hdGVyaWFsXTtcclxuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAoIW1hdGVyaWFsKSB7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIFNhbWUgdGV4dHVyZSBpcyByZXVzZWQgYWNyb3NzIHRoZSBtb2RlbCdzIG1hdGVyaWFsczsgb25seSB0b3VjaCBlYWNoIG9uZSBvbmNlLlxyXG4gICAgICAgIFsnbWFwJywgJ25vcm1hbE1hcCcsICdyb3VnaG5lc3NNYXAnLCAnbWV0YWxuZXNzTWFwJywgJ2VtaXNzaXZlTWFwJywgJ2FvTWFwJ10uZm9yRWFjaCgoc2xvdCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xyXG4gICAgICAgICAgaWYgKHRleHR1cmUgJiYgIXNlZW4uaGFzKHRleHR1cmUpKSB7XHJcbiAgICAgICAgICAgIHNlZW4uYWRkKHRleHR1cmUpO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xyXG4gICAgICAgICAgICB0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0ZXh0dXJlLm1pbkZpbHRlciA9IFRIUkVFLkxpbmVhckZpbHRlcjtcclxuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMb2FkcyBhbiBPQkogbW9kZWwgd2l0aCBNVEwuXHJcbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXHJcbiAgICogc2V0T2JqUGFyc2VyV29ya2VyIChzZWUgdGhlcmUgZm9yIHdoeSB0aGUgYXBwLCBub3QgdGhpcyBsaWJyYXJ5LCBwcm92aWRlcyBpdCk7IHRoaXMga2VlcHNcclxuICAgKiB0aGUgbWFpbiB0aHJlYWQgZnJlZSB3aGlsZSBsYXJnZSBhcmNoaXRlY3R1cmUgbW9kZWxzIChtaWxsaW9ucyBvZiB2ZXJ0aWNlcykgYXJlIHBhcnNlZC5cclxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBsb2FkT2JqTW9kZWwobXRsVXJsOiBzdHJpbmcsIG9ialVybDogc3RyaW5nLCBjYW1lcmFQb3NpdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgcm90YXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0pOiB2b2lkIHtcclxuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcclxuICAgIGNvbnN0IGJhc2VQYXRoID0gbXRsVXJsLnN1YnN0cmluZygwLCBtdGxVcmwubGFzdEluZGV4T2YoJy8nKSArIDEpO1xyXG4gICAgbXRsTG9hZGVyLnNldFBhdGgoYmFzZVBhdGgpO1xyXG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQodHJ1ZSk7XHJcblxyXG4gICAgbXRsTG9hZGVyLmxvYWQobXRsRmlsZU5hbWUsIChtYXRlcmlhbHMpID0+IHtcclxuICAgICAgbWF0ZXJpYWxzLnByZWxvYWQoKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLm9ialBhcnNlcldvcmtlcikge1xyXG4gICAgICAgIHRoaXMucmVxdWVzdE9ialBhcnNlSW5Xb3JrZXIob2JqVXJsKVxyXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xyXG4gICAgICAgICAgICBtZXNoZXMuZm9yRWFjaCgobWVzaERhdGEpID0+IHtcclxuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ3JvdXAsIGNhbWVyYVBvc2l0aW9uLCByb3RhdGlvbik7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBwYXJzaW5nIE9CSiBtb2RlbCBpbiB3b3JrZXI6JywgZXJyb3IpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIC5maW5hbGx5KCgpID0+IHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcclxuXHJcbiAgICAgIG9iakxvYWRlci5sb2FkKG9ialVybCwgKG9iamVjdCkgPT4ge1xyXG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcclxuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XHJcbiAgICAgIH0sIHVuZGVmaW5lZCwgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xyXG4gICAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcclxuICAgICAgfSk7XHJcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIE1UTCBmaWxlOicsIGVycm9yKTtcclxuICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXHJcbiAgcHJpdmF0ZSBwbGFjZUxvYWRlZE9iamVjdEluU2NlbmUob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCB1cD86IFRocmVlSnNNb2RlbFVwKTogdm9pZCB7XHJcbiAgICBjb25zdCBib3ggPSBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3Qob2JqZWN0KTtcclxuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBtYXhEaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcclxuXHJcbiAgICAvLyBUd28gbmVzdGVkIGdyb3VwcyBzbyB0YWdzIGNhbiBzaGFyZSB0aGUgbW9kZWwncyBmcmFtZTogYGNlbnRlcmVkYCBjYXJyaWVzIHRoZSBvZmZzZXQgdGhhdFxyXG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXHJcbiAgICAvLyB3aXRoIHJhdyBQT0kgY29vcmRpbmF0ZXMgdGhlbiBsYW5kcyBpbiB0aGUgc2FtZSBwbGFjZSB0aGUgbW9kZWwncyBnZW9tZXRyeSBkb2VzLlxyXG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcclxuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XHJcbiAgICBjZW50ZXJlZC5wb3NpdGlvbi5zdWIoY2VudGVyKTtcclxuXHJcbiAgICBpZiAocm90YXRpb24pIHtcclxuICAgICAgb2JqZWN0LnJvdGF0aW9uLnNldChyb3RhdGlvbi54LCByb3RhdGlvbi55LCByb3RhdGlvbi56KTtcclxuICAgIH1cclxuICAgIC8vIFdoaWNoIHdheSBpcyB1cC4gQSBjaG9pY2Ugc29tZW9uZSBtYWRlIGJ5IGhhbmQgYWx3YXlzIHdpbnM7IG90aGVyd2lzZSwgdW5sZXNzIHRoZSBtb2RlbCBjYW1lXHJcbiAgICAvLyB3aXRoIGFuIG9yaWVudGF0aW9uIG9mIGl0cyBvd24sIGl0IGlzIHdvcmtlZCBvdXQgZnJvbSB0aGUgZ2VvbWV0cnkuIEFwcGxpZWQgdG8gdGhlIG91dGVyXHJcbiAgICAvLyBncm91cCwgYWJvdmUgYm90aCB0aGUgbW9kZWwgYW5kIHRoZSB0YWdzOiB0aGV5IHR1cm4gdG9nZXRoZXIsIGFuZCBldmVyeSBjb29yZGluYXRlIGFscmVhZHlcclxuICAgIC8vIHN0b3JlZCAtIHRhZyBwb3NpdGlvbnMsIHRoZSBjYWxpYnJhdGlvbiAtIGtlZXBzIG1lYW5pbmcgd2hhdCBpdCBtZWFudC5cclxuICAgIHRoaXMubW9kZWxHcm91cCA9IGdyb3VwO1xyXG4gICAgdGhpcy5tb2RlbFVwID0gdXAgPz8gKHJvdGF0aW9uID8gJ3knIDogdGhpcy5kZXRlY3RNb2RlbFVwKG9iamVjdCwgc2l6ZSkpO1xyXG4gICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHRoaXMubW9kZWxVcCkpO1xyXG5cclxuICAgIHRoaXMubW9kZWxSb290ID0gb2JqZWN0O1xyXG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlO1xyXG4gICAgLy8gVGhlIGJveCBhYm92ZSB3YXMgbWVhc3VyZWQgYmVmb3JlIGFueSByb3RhdGlvbiBmcm9tIHRoZSBtZXRhZGF0YSB3YXMgYXBwbGllZDsgd2l0aCBvbmUsIGl0XHJcbiAgICAvLyBoYXMgdG8gYmUgbWVhc3VyZWQgYWdhaW4gdG8gYmUgdGhlIG1vZGVsIGFzIGl0IGFjdHVhbGx5IHNpdHMuXHJcbiAgICB0aGlzLmJ1aWxkU3VyZmFjZUdyaWQob2JqZWN0LCByb3RhdGlvbiA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpIDogYm94KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICAgIC8vIE1hcmtzIHRoZSBtb2RlbCBmb3IgdGhlIGRlcHRoIHBpY2ssIHdoaWNoIHJlbmRlcnMgdGhpcyBsYXllciBhbG9uZSAtIHNvIHRhZ3MgYW5kIHRoZSBnaG9zdFxyXG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkKSA9PiBjaGlsZC5sYXllcnMuZW5hYmxlKFRocmVlSnNTZXJ2aWNlLlBJQ0tfTEFZRVIpKTtcclxuICAgIGNlbnRlcmVkLmFkZChvYmplY3QpO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xyXG4gICAgY2VudGVyZWQuYWRkKHRoaXMubW9kZWxUYWdHcm91cCk7XHJcbiAgICBncm91cC5hZGQoY2VudGVyZWQpO1xyXG4gICAgZ3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlKTtcclxuXHJcbiAgICB0aGlzLnNjZW5lLmFkZChncm91cCk7XHJcblxyXG4gICAgLy8gVGFncyByZWdpc3RlcmVkIGJlZm9yZSB0aGUgbW9kZWwgZmluaXNoZWQgbG9hZGluZyB3ZXJlIHNpemVkIGFnYWluc3QgdGhlIG9sZCBzY2FsZS5cclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcclxuXHJcbiAgICB0aGlzLmFkanVzdENsaXBwaW5nUGxhbmVzKChzaXplLmxlbmd0aCgpIC8gMikgKiBzY2FsZSk7XHJcblxyXG4gICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldChjYW1lcmFQb3NpdGlvbi54LCBjYW1lcmFQb3NpdGlvbi55LCBjYW1lcmFQb3NpdGlvbi56KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxNSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5zZXQoMCwgMCwgMCk7XHJcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hpY2ggb2YgdGhlIG1vZGVsJ3MgYXhlcyBpcyBpdHMgdmVydGljYWw6ICd5JyB3aGVuIGl0IGFscmVhZHkgc3RhbmRzIHVwcmlnaHQsIG9yIHdoZW4gaXQgaXNcclxuICAgKiBub3QgY2xlYXIgZW5vdWdoIHRvIGFjdCBvbi5cclxuICAgKlxyXG4gICAqIE1vZGVscyBhcnJpdmUgaW4gdHdvIGNvbnZlbnRpb25zOiBZIHVwIChnbFRGLCBhbmQgd2hhdCB0aGlzIHZpZXdlciBhc3N1bWVzKSBhbmQgWiB1cCAobW9zdCBDQURcclxuICAgKiBhbmQgc2Nhbm5pbmcgZXhwb3J0cykuIEEgWi11cCBtb2RlbCBsb2FkcyBseWluZyBvbiBpdHMgc2lkZS4gVHdvIGluZGVwZW5kZW50IGN1ZXMgc2F5IHdoaWNoXHJcbiAgICogYXhpcyBpcyB0aGUgdmVydGljYWwgb25lLCBhbmQgYm90aCBoYXZlIHRvIGFncmVlIGJlZm9yZSBhbnl0aGluZyBpcyB0dXJuZWQ6XHJcbiAgICpcclxuICAgKiAgLSBTdXJmYWNlIGFyZWEuIEZsb29ycyBhbmQgY2VpbGluZ3MgYWxsIGZhY2UgYWxvbmcgdGhlIHZlcnRpY2FsLCB3aGlsZSB3YWxscyBhcmUgc2hhcmVkIG91dFxyXG4gICAqICAgIGJldHdlZW4gdGhlIHR3byBob3Jpem9udGFsIGF4ZXMsIHNvIHRoZSB2ZXJ0aWNhbCB1c3VhbGx5IGNvbGxlY3RzIHRoZSBtb3N0IGFyZWEuXHJcbiAgICogIC0gRXh0ZW50LiBBIGJ1aWxkaW5nIGlzIG5vcm1hbGx5IHdpZGVyIHRoYW4gaXQgaXMgdGFsbCwgc28gdGhlIHZlcnRpY2FsIGlzIGl0cyBzaG9ydGVzdCBzaWRlLlxyXG4gICAqXHJcbiAgICogRWl0aGVyIGFsb25lIGlzIHdyb25nIG9mdGVuIGVub3VnaCB0byBtYXR0ZXIgLSBhIGxvbmcgY29ycmlkb3IgaGFzIG1vcmUgd2FsbCB0aGFuIGZsb29yLCBhXHJcbiAgICogdG93ZXIgaXMgdGFsbGVyIHRoYW4gaXQgaXMgd2lkZSAtIGFuZCB0dXJuaW5nIGEgbW9kZWwgdGhhdCB3YXMgZmluZSBpcyB3b3JzZSB0aGFuIGxlYXZpbmcgb25lXHJcbiAgICogdGhhdCB3YXMgbm90LiBBIG1vZGVsIHRoYXQgYWxyZWFkeSBoYXMgWSBhcyBpdHMgdmVydGljYWwgaXMgbmV2ZXIgdG91Y2hlZC5cclxuICAgKi9cclxuICBwcml2YXRlIGRldGVjdE1vZGVsVXAob2JqZWN0OiBUSFJFRS5PYmplY3QzRCwgc2l6ZTogVEhSRUUuVmVjdG9yMyk6IFRocmVlSnNNb2RlbFVwIHtcclxuICAgIGNvbnN0IGF4ZXMgPSBbJ3gnLCAneScsICd6J10gYXMgY29uc3Q7XHJcbiAgICAvLyBQcm9qZWN0ZWQgYXJlYSBmYWNpbmcgZWFjaCB3YXkgYWxvbmcgZWFjaCBheGlzOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXS5cclxuICAgIGNvbnN0IGFyZWEgPSB7IHg6IFswLCAwXSwgeTogWzAsIDBdLCB6OiBbMCwgMF0gfTtcclxuXHJcbiAgICBsZXQgdHJpYW5nbGVDb3VudCA9IDA7XHJcbiAgICBvYmplY3QudXBkYXRlTWF0cml4V29ybGQodHJ1ZSk7XHJcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xyXG4gICAgICBpZiAocG9zaXRpb24pIHtcclxuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICBpZiAodHJpYW5nbGVDb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG4gICAgLy8gQSBzYW1wbGUgaXMgcGxlbnR5IHRvIHNlZSB3aGVyZSB0aGUgYXJlYSBsaWVzLCBhbmQga2VlcHMgdGhpcyBjaGVhcCBvbiBtb2RlbHMgd2l0aCBtaWxsaW9uc1xyXG4gICAgLy8gb2YgdHJpYW5nbGVzLlxyXG4gICAgY29uc3Qgc3RyaWRlID0gTWF0aC5tYXgoMSwgTWF0aC5jZWlsKHRyaWFuZ2xlQ291bnQgLyAyMDAwMDApKTtcclxuXHJcbiAgICBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGIgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZDogYW55KSA9PiB7XHJcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcclxuICAgICAgaWYgKCFwb3NpdGlvbikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xyXG4gICAgICBjb25zdCBjb3VudCA9IChpbmRleCA/IGluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcclxuICAgICAgZm9yIChsZXQgdHJpYW5nbGUgPSAwOyB0cmlhbmdsZSA8IGNvdW50OyB0cmlhbmdsZSArPSBzdHJpZGUpIHtcclxuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XHJcbiAgICAgICAgYS5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0KSA6IG9mZnNldCkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBiLmZyb21CdWZmZXJBdHRyaWJ1dGUocG9zaXRpb24sIGluZGV4ID8gaW5kZXguZ2V0WChvZmZzZXQgKyAxKSA6IG9mZnNldCArIDEpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIC8vIFRoZSBjcm9zcyBwcm9kdWN0J3MgbGVuZ3RoIGlzIHR3aWNlIHRoZSB0cmlhbmdsZSdzIGFyZWEsIHNvIGl0cyBjb21wb25lbnRzIGFyZSB0aGVcclxuICAgICAgICAvLyBhcmVhIHRoZSB0cmlhbmdsZSBzaG93cyBhbG9uZyBlYWNoIGF4aXMuXHJcbiAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyhiLnN1YihhKSwgYy5zdWIoYSkpO1xyXG4gICAgICAgIGF4ZXMuZm9yRWFjaCgoYXhpcykgPT4ge1xyXG4gICAgICAgICAgYXJlYVtheGlzXVtub3JtYWxbYXhpc10gPj0gMCA/IDAgOiAxXSArPSBNYXRoLmFicyhub3JtYWxbYXhpc10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCB0b3RhbCA9IHsgeDogYXJlYS54WzBdICsgYXJlYS54WzFdLCB5OiBhcmVhLnlbMF0gKyBhcmVhLnlbMV0sIHo6IGFyZWEuelswXSArIGFyZWEuelsxXSB9O1xyXG4gICAgY29uc3QgYnlBcmVhID0gYXhlcy5yZWR1Y2UoKGJlc3QsIGF4aXMpID0+ICh0b3RhbFtheGlzXSA+IHRvdGFsW2Jlc3RdID8gYXhpcyA6IGJlc3QpLCAneScgYXMgdHlwZW9mIGF4ZXNbbnVtYmVyXSk7XHJcbiAgICBjb25zdCBieUV4dGVudCA9IGF4ZXMucmVkdWNlKChiZXN0LCBheGlzKSA9PiAoc2l6ZVtheGlzXSA8IHNpemVbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcclxuICAgIGlmIChieUFyZWEgPT09ICd5JyB8fCBieUFyZWEgIT09IGJ5RXh0ZW50IHx8IHRvdGFsW2J5QXJlYV0gPCAxLjI1ICogdG90YWwueSkge1xyXG4gICAgICByZXR1cm4gJ3knO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIFdoaWNoIHdheSBhbG9uZyB0aGF0IGF4aXMgaXMgdXAuIFJvb2ZzIGFuZCBncm91bmQgbWFrZSBhbiBvdXRkb29yIG1vZGVsIGZhY2UgbW9zdGx5IHVwd2FyZCxcclxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcclxuICAgIC8vIHVwIC0gaXMgdGhlIGJldHRlciBndWVzcy5cclxuICAgIGNvbnN0IFtwb3NpdGl2ZSwgbmVnYXRpdmVdID0gYXJlYVtieUFyZWFdO1xyXG4gICAgY29uc3QgdXAgPSBgJHtuZWdhdGl2ZSA+IDAuNjUgKiAocG9zaXRpdmUgKyBuZWdhdGl2ZSkgPyAnLScgOiAnJ30ke2J5QXJlYX1gIGFzIFRocmVlSnNNb2RlbFVwO1xyXG4gICAgY29uc29sZS5pbmZvKGBUaHJlZUpzU2VydmljZTogdGhpcyBtb2RlbCdzIHZlcnRpY2FsIGF4aXMgbG9va3MgbGlrZSAke3VwfSwgbm90IHkgLSBzdGFuZGluZyBpdCB1cHJpZ2h0LmApO1xyXG4gICAgcmV0dXJuIHVwO1xyXG4gIH1cclxuXHJcbiAgLyoqIFRoZSByb3RhdGlvbiB0aGF0IGJyaW5ncyB0aGUgZ2l2ZW4gbW9kZWwgYXhpcyB0byBwb2ludCB1cC4gKi9cclxuICBwcml2YXRlIHVwcmlnaHRSb3RhdGlvbih1cDogVGhyZWVKc01vZGVsVXApOiBUSFJFRS5RdWF0ZXJuaW9uIHtcclxuICAgIGNvbnN0IGF4aXMgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgYXhpc1t1cC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB1cC5zdGFydHNXaXRoKCctJykgPyAtMSA6IDE7XHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMoYXhpcywgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgdXAsIHdoZXRoZXIgY2hvc2VuIG9yIHdvcmtlZCBvdXQuICovXHJcbiAgZ2V0TW9kZWxVcCgpOiBUaHJlZUpzTW9kZWxVcCB7XHJcbiAgICByZXR1cm4gdGhpcy5tb2RlbFVwO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHVybnMgdGhlIG1vZGVsIHNvIHRoZSBnaXZlbiBheGlzIHBvaW50cyB1cCwgYXQgb25jZS5cclxuICAgKlxyXG4gICAqIFRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgdHVybiBhcyBvbmUsIHNvIG5vdGhpbmcgc3RvcmVkIGhhcyB0byBiZSByZWNvbXB1dGVkLiBUaGUgY2FsbGVyIGlzXHJcbiAgICogZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNob2ljZSwgb3IgdGhlIG5leHQgbG9hZCBnb2VzIGJhY2sgdG8gd29ya2luZyBpdCBvdXQuXHJcbiAgICovXHJcbiAgc2V0TW9kZWxVcCh1cDogVGhyZWVKc01vZGVsVXApOiB2b2lkIHtcclxuICAgIHRoaXMubW9kZWxVcCA9IHVwO1xyXG4gICAgdGhpcy5tb2RlbEdyb3VwPy5xdWF0ZXJuaW9uLmNvcHkodGhpcy51cHJpZ2h0Um90YXRpb24odXApKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEtlZXBzIHRoZSBkcmF3aW5nIGJ1ZmZlciBhbmQgY2FtZXJhIG1hdGNoZWQgdG8gdGhlIGNhbnZhcyBhcyBpdCBpcyByZXNpemVkLlxyXG4gICAqXHJcbiAgICogcmVuZGVyZXIuc2V0U2l6ZSgpIHdyaXRlcyBleHBsaWNpdCBwaXhlbCB3aWR0aC9oZWlnaHQgaW50byB0aGUgY2FudmFzJ3Mgc3R5bGUsIG92ZXJyaWRpbmcgdGhlXHJcbiAgICogMTAwJS8xMDAlIGl0IHN0YXJ0cyB3aXRoLiBXaXRob3V0IHRoaXMsIHRoZSBjYW52YXMga2VlcHMgd2hhdGV2ZXIgc2l6ZSBpdCBoYWQgYXQgc3RhcnR1cDogaGlkaW5nXHJcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcclxuICAgKiB0aGUgcGFnZSBiZWhpbmQgaXQgaW5zdGVhZCBvZiB0aGUgc2NlbmUuXHJcbiAgICpcclxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXHJcbiAgICogdG8gLSB3YXRjaGluZyB0aGUgZWxlbWVudCB3ZSByZXNpemUgd291bGQgcmV0cmlnZ2VyIHRoZSBvYnNlcnZlci5cclxuICAgKi9cclxuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgY29udGFpbmVyID0gY2FudmFzLnBhcmVudEVsZW1lbnQ7XHJcbiAgICBpZiAoIWNvbnRhaW5lciB8fCB0eXBlb2YgUmVzaXplT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcclxuICAgICAgY29uc3Qgd2lkdGggPSBjb250YWluZXIuY2xpZW50V2lkdGg7XHJcbiAgICAgIGNvbnN0IGhlaWdodCA9IGNvbnRhaW5lci5jbGllbnRIZWlnaHQ7XHJcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XHJcbiAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcclxuICAgICAgdGhpcy5yZW5kZXJlci5zZXRTaXplKHdpZHRoLCBoZWlnaHQpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyLm9ic2VydmUoY29udGFpbmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXHJcbiAgICpcclxuICAgKiBFeGlzdGluZyB0YWdzIGFyZSB0aGUgY29ycmVzcG9uZGVuY2VzIC0gdGhleSBhbHJlYWR5IGNhcnJ5IHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgc28gdGhlIHBlcnNvblxyXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXHJcbiAgICogYXBwbGllZCB1bnRpbCBzb2x2ZUFsaWdubWVudEZyb21QYWlycygpIHN1Y2NlZWRzLlxyXG4gICAqL1xyXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWUsIHRoZSBzYW1lIHJ1bGUgc3RhcnRNZWFzdXJpbmcoKSBhcHBsaWVzIHRoZSBvdGhlciB3YXkgcm91bmQuXHJcbiAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcclxuICAgIH1cclxuICAgIHRoaXMuYWxpZ25pbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSBudWxsO1xyXG4gICAgLy8gV2hpbGUgY2FsaWJyYXRpbmcsIHRoZSB0YWdzIGZyb20gZWxzZXdoZXJlIGFyZSBhbGwgc2hvd24gLSBpbmNsdWRpbmcgdGhlIG9uZXMgb2ZmIHRoZSBtb2RlbCxcclxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcclxuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogJ3RhZycgfSk7XHJcbiAgfVxyXG5cclxuICBjYW5jZWxUYWdBbGlnbm1lbnQoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFsaWdubWVudFBhaXJzID0gW107XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiAwLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIGlmICh3YXNBbGlnbmluZykge1xyXG4gICAgICB0aGlzLmFsaWdubWVudENhbmNlbGxlZCQubmV4dCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgaXNBbGlnbmluZ1RhZ3MoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5hbGlnbmluZztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgdGhlIHBvaW50ZXIgc2hvdWxkIGJlIHNob3dpbmcgdGhlIHBsYWNlbWVudCBnaG9zdC5cclxuICAgKlxyXG4gICAqIFRydWUgd2hpbGUgcGxhY2luZyBhIHRhZywgYW5kIHdoaWxlIGNhbGlicmF0aW5nIG9uY2UgYSB0YWcgaGFzIGJlZW4gcGlja2VkIC0gdGhhdCBzZWNvbmQgY2xpY2tcclxuICAgKiBpcyB0aGUgc2FtZSBxdWVzdGlvbiAoXCJ3aGVyZSBvbiB0aGUgbW9kZWw/XCIpIGFuZCBkZXNlcnZlcyB0aGUgc2FtZSBhaW1pbmcgYWlkLiBOb3QgdHJ1ZSBmb3IgdGhlXHJcbiAgICogZmlyc3QgaGFsZiBvZiBhIHBhaXIsIHdoaWNoIGlzIGEgY2xpY2sgb24gYSB0YWcsIG5vdCBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBpc1ByZXZpZXdpbmdQbGFjZW1lbnQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5wbGFjaW5nVGFnIHx8IHRoaXMubWVhc3VyaW5nIHx8ICh0aGlzLmFsaWduaW5nICYmICEhdGhpcy5hbGlnbm1lbnRTb3VyY2UpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgYSB0YWcgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC4gKi9cclxuICBoYXNUYWcoZWxlbWVudElkOiBzdHJpbmcpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnRhZ1Nwcml0ZXMuaGFzKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogSG93IG1hbnkgdGFncyBhcmUgb24gc2hvdyAtIHRoZSBvbmVzIGEgcGVyc29uIGNvdWxkIGFjdHVhbGx5IGNsaWNrLiAqL1xyXG4gIGdldFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICBsZXQgdmlzaWJsZSA9IDA7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIGlmIChzcHJpdGUudmlzaWJsZSkge1xyXG4gICAgICAgIHZpc2libGUgKz0gMTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gdmlzaWJsZTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxyXG4gICAqXHJcbiAgICogUmV0dXJucyBudWxsIHdoZW4gdGhlIHRocmVlIHRhZ3MgdHVybiBvdXQgdG8gYmUgY29sbGluZWFyLCBpbiB3aGljaCBjYXNlIG5vdGhpbmcgaXMgYXBwbGllZCBhbmRcclxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxyXG4gICAqL1xyXG4gIHNvbHZlQWxpZ25tZW50RnJvbVBhaXJzKCk6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IHVwID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIHVwW3RoaXMubW9kZWxVcC5yZXBsYWNlKCctJywgJycpIGFzICd4JyB8ICd5JyB8ICd6J10gPSB0aGlzLm1vZGVsVXAuc3RhcnRzV2l0aCgnLScpID8gLTEgOiAxO1xyXG4gICAgY29uc3QgYWxpZ25tZW50ID0gc29sdmVUaHJlZUpzQWxpZ25tZW50KHRoaXMuYWxpZ25tZW50UGFpcnMsIHVwKTtcclxuICAgIGlmICghYWxpZ25tZW50KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gICAgLy8gT3V0IG9mIGNhbGlicmF0aW5nIG1vZGUgZmlyc3Q6IGFwcGx5aW5nIHRoZSByZXN1bHQgcmUtZGVjaWRlcyB3aGljaCB0YWdzIHNob3csIGFuZCBmcm9tIGhlcmVcclxuICAgIC8vIG9uIHRoYXQgaXMgdGhlIG9uZXMgb24gdGhlIG1vZGVsIGFnYWluLCBub3QgYWxsIG9mIHRoZW0uXHJcbiAgICB0aGlzLmFsaWduaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IHRoaXMuYWxpZ25tZW50UGFpcnMubGVuZ3RoLCBhd2FpdGluZzogbnVsbCB9KTtcclxuICAgIHJldHVybiBhbGlnbm1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBcHBsaWVzIGEgbmV3IGNhbGlicmF0aW9uIHdoaWxlIGtlZXBpbmcgZXZlcnkgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGV4YWN0bHkgd2hlcmUgaXQgaXMuXHJcbiAgICpcclxuICAgKiBBIGNhbGlicmF0aW9uIGlzIHdvcmtlZCBvdXQgZm9yIHRoZSB0YWdzIHRoYXQgY2FtZSBmcm9tIGVsc2V3aGVyZS4gVGhlIG1vZGVsJ3Mgb3duIHRhZ3Mgd2VyZSBwdXRcclxuICAgKiB3aGVyZSB0aGV5IGFyZSBieSBzb21lb25lIGNsaWNraW5nIHRoZSBtb2RlbCwgc28gdGhleSBtdXN0IG5vdCBmb2xsb3cgaXQuIFRoZWlyIHN0b3JlZFxyXG4gICAqIGNvb3JkaW5hdGVzIGFyZSByZXdyaXR0ZW4gaW5zdGVhZDogaW50byB0aGUgc2hhcmVkIHNwYWNlIGFzIHRoZSBuZXcgY2FsaWJyYXRpb24gZGVmaW5lcyBpdC5cclxuICAgKiBUaGF0IGlzIGFsc28gd2hhdCBtYWtlcyB0aGVtIGNvbXBhcmFibGUgd2l0aCBvdGhlciB2aXNpdHMgZnJvbSBoZXJlIG9uIC0gYSB0YWcgcGxhY2VkIGJlZm9yZVxyXG4gICAqIHRoZSBtb2RlbCB3YXMgY2FsaWJyYXRlZCB3YXMgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB2aXNpYmxlIG5vd2hlcmUgZWxzZS5cclxuICAgKlxyXG4gICAqIFRoZSByZXdyaXR0ZW4gdGFncyBhcmUga2VwdCBmb3IgdGhlIGNhbGxlciB0byBzdG9yZTsgc2VlIHRha2VSZWJhc2VkVGFncygpLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYXBwbHlBbGlnbm1lbnRLZWVwaW5nT3duVGFncyhhbGlnbm1lbnQ6IFRocmVlSnNBbGlnbm1lbnQpOiB2b2lkIHtcclxuICAgIGNvbnN0IG93biA9IFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PiB0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpO1xyXG4gICAgLy8gV2hlcmUgZWFjaCBvbmUgaXMgbm93LCBpbiB0aGUgc3BhY2UgdGhlIG1vZGVsIHNpdHMgaW4sIGFuZCBob3cgaXRzIHBhcmVudCB3YXMgdHVybmVkLlxyXG4gICAgY29uc3QgcGxhY2VkID0gb3duLm1hcCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS5wYXJlbnQ/LnVwZGF0ZU1hdHJpeCgpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHNwcml0ZSxcclxuICAgICAgICBwb3NpdGlvbjogc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHNwcml0ZS5wYXJlbnQ/Lm1hdHJpeCA/PyBuZXcgVEhSRUUuTWF0cml4NCgpKSxcclxuICAgICAgICB0dXJuOiBzcHJpdGUucGFyZW50Py5xdWF0ZXJuaW9uLmNsb25lKCkgPz8gbmV3IFRIUkVFLlF1YXRlcm5pb24oKSxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudCk7XHJcblxyXG4gICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudGFnR3JvdXAubWF0cml4LmNsb25lKCkuaW52ZXJ0KCk7XHJcbiAgICBjb25zdCB1bnR1cm4gPSB0aGlzLnRhZ0dyb3VwLnF1YXRlcm5pb24uY2xvbmUoKS5pbnZlcnQoKTtcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBwbGFjZWQubWFwKCh7IHNwcml0ZSwgcG9zaXRpb24sIHR1cm4gfSkgPT4ge1xyXG4gICAgICBzcHJpdGUucG9zaXRpb24uY29weShwb3NpdGlvbi5hcHBseU1hdHJpeDQoaW52ZXJzZSkpO1xyXG4gICAgICBzcHJpdGUudXNlckRhdGEuZnJhbWUgPSBudWxsO1xyXG4gICAgICB0aGlzLnBhcmVudFRhZyhzcHJpdGUpO1xyXG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgICAgY29uc3Qgcm90YXRpb24gPSB1bnR1cm4uY2xvbmUoKS5tdWx0aXBseSh0dXJuKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgICAgcG9zaXRpb246IHsgeDogc3ByaXRlLnBvc2l0aW9uLngsIHk6IHNwcml0ZS5wb3NpdGlvbi55LCB6OiBzcHJpdGUucG9zaXRpb24ueiB9LFxyXG4gICAgICAgIHJvdGF0ZURpcmVjdGlvbjogKHsgeCwgeSwgeiB9KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCB0dXJuZWQgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pO1xyXG4gICAgICAgICAgcmV0dXJuIHsgeDogdHVybmVkLngsIHk6IHR1cm5lZC55LCB6OiB0dXJuZWQueiB9O1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH07XHJcbiAgICB9KTtcclxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcclxuICB9XHJcblxyXG4gIC8qKiBIYW5kcyBvdmVyIHRoZSB0YWdzIHRoZSBsYXN0IGNhbGlicmF0aW9uIHJld3JvdGUsIG9uY2UsIGZvciB0aGVtIHRvIGJlIHN0b3JlZC4gKi9cclxuICB0YWtlUmViYXNlZFRhZ3MoKTogVGhyZWVKc1JlYmFzZWRUYWdbXSB7XHJcbiAgICBjb25zdCByZWJhc2VkID0gdGhpcy5yZWJhc2VkVGFncztcclxuICAgIHRoaXMucmViYXNlZFRhZ3MgPSBbXTtcclxuICAgIHJldHVybiByZWJhc2VkO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQ2hvb3NlcyB0aGUgdGFnIGZvciB0aGUgcGFpciBiZWluZyBtYXRjaGVkIGJ5IGlkLCBpbnN0ZWFkIG9mIGJ5IGNsaWNraW5nIGl0LlxyXG4gICAqXHJcbiAgICogQ2xpY2tpbmcgYSB0YWcgc3VwcG9zZXMgaXQgY2FuIGJlIGZvdW5kLiBPbiBhIG1vZGVsIHRoYXQgaGFzIG5ldmVyIGJlZW4gY2FsaWJyYXRlZCB0aGUgdGFncyBtYXlcclxuICAgKiBzaXQgZmFyIGZyb20gaXQsIG9yIGFsbCBvbiB0b3Agb2Ygb25lIGFub3RoZXI7IGEgbGlzdCBoYXMgbmVpdGhlciBwcm9ibGVtLlxyXG4gICAqL1xyXG4gIHNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc3ByaXRlID0gdGhpcy50YWdTcHJpdGVzLmdldChlbGVtZW50SWQpO1xyXG4gICAgaWYgKCF0aGlzLmFsaWduaW5nIHx8IHRoaXMuYWxpZ25tZW50U291cmNlIHx8ICFzcHJpdGUgfHwgIXRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkuaW5jbHVkZXMoc3ByaXRlKSkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldEFsaWdubWVudFNvdXJjZShzcHJpdGUpO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldEFsaWdubWVudFNvdXJjZShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICAvLyBUaGUgc3ByaXRlJ3Mgb3duIHBvc2l0aW9uIGlzIHRoZSBzdG9yZWQgY29vcmRpbmF0ZSwgdW50b3VjaGVkIGJ5IGFueSBhbGlnbm1lbnQgYWxyZWFkeVxyXG4gICAgLy8gYXBwbGllZCAtIHRoYXQgdHJhbnNmb3JtIGxpdmVzIG9uIHRoZSBncm91cCwgbm90IG9uIHRoZSBzcHJpdGUuXHJcbiAgICBjb25zdCBzdG9yZWQgPSBzcHJpdGUucG9zaXRpb247XHJcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IHsgeDogc3RvcmVkLngsIHk6IHN0b3JlZC55LCB6OiBzdG9yZWQueiB9O1xyXG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2VUYWdJZCA9IHNwcml0ZS5uYW1lO1xyXG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XHJcbiAgICAgIHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCxcclxuICAgICAgYXdhaXRpbmc6ICdwb2ludCcsXHJcbiAgICAgIHRhZ0lkOiBzcHJpdGUubmFtZSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhhbmRsZXMgYSBjbGljayB3aGlsZSB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoIGlzIHJ1bm5pbmcuICovXHJcbiAgcHJpdmF0ZSBoYW5kbGVBbGlnbm1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xyXG4gICAgICAvLyBGaXJzdCBoYWxmIG9mIGEgcGFpcjogd2hpY2ggdGFnIGFyZSB3ZSB0YWxraW5nIGFib3V0P1xyXG4gICAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCksIGZhbHNlKVswXTtcclxuICAgICAgaWYgKCFoaXQpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICAvLyBTZWNvbmQgaGFsZjogd2hlcmUgdGhhdCB0YWcgYWN0dWFsbHkgYmVsb25ncyBvbiB0aGUgbW9kZWwuXHJcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLnBpY2tBbGlnbm1lbnRUYXJnZXQoZXZlbnQpO1xyXG4gICAgaWYgKCF0YXJnZXQpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsIHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcclxuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcclxuICAgIC8vIFRoZSBnaG9zdCBiZWxvbmdzIHRvIHRoZSBjbGljayB0aGF0IGp1c3QgaGFwcGVuZWQ7IHRoZSBuZXh0IGhhbGYgaXMgYSBjbGljayBvbiBhIHRhZy5cclxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XHJcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcclxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoe1xyXG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXHJcbiAgICAgIC8vIERvbmUgYXQgdGhyZWUsIG9yIHNvb25lciB3aGVuIHRoZXJlIGFyZSBubyBtb3JlIHRhZ3MgdG8gbWF0Y2g6IGZld2VyIHBhaXJzIHN0aWxsIGNhbGlicmF0ZSxcclxuICAgICAgLy8gb25seSBsZXNzIGNvbXBsZXRlbHkuXHJcbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzIHx8IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID09PSAwID8gbnVsbCA6ICd0YWcnLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBTdGFydHMgYSBtZWFzdXJlbWVudDogZXZlcnkgY2xpY2sgb24gdGhlIG1vZGVsIGFkZHMgYSBwb2ludCwgYW5kIGVhY2ggcGFpciBvZiBjb25zZWN1dGl2ZVxyXG4gICAqIHBvaW50cyBpcyBhIG1lYXN1cmVkIHNlZ21lbnQuXHJcbiAgICpcclxuICAgKiBJdCBlbmRzIHRocm91Z2ggZmluaXNoTWVhc3VyaW5nKCkgb3IgY2FuY2VsTWVhc3VyaW5nKCkgcmF0aGVyIHRoYW4gb24gaXRzIG93biBhZnRlciB0d28gcG9pbnRzLFxyXG4gICAqIGJlY2F1c2UgYSBtZWFzdXJlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHNlZ21lbnRzIC0gdGhlIHNhbWUgYXMgTWF0dGVycG9ydCdzLCB3aG9zZSByZXN1bHRzIGFyZVxyXG4gICAqIHN0b3JlZCBhcyBhIGxpc3Qgb2YgZGlzdGFuY2VzLlxyXG4gICAqL1xyXG4gIHN0YXJ0TWVhc3VyaW5nKCk6IHZvaWQge1xyXG4gICAgLy8gT25lIHBvaW50ZXIgbW9kZSBhdCBhIHRpbWU6IGEgY2xpY2sgY2Fubm90IGJlIGJvdGggYSB0YWcgcG9zaXRpb24gYW5kIGEgbWVhc3VyZWQgcG9pbnQuXHJcbiAgICB0aGlzLmNhbmNlbFRhZ1BsYWNlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcclxuICAgIH1cclxuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xyXG4gICAgaWYgKHRoaXMubWVhc3VyZUdyb3VwLnBhcmVudCAhPT0gdGhpcy50YWdHcm91cCkge1xyXG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLm1lYXN1cmVHcm91cCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IHRydWU7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVtZW50UHJvZ3Jlc3MkLm5leHQoeyBwb2ludHM6IDAsIGRpc3RhbmNlczogW10gfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXHJcbiAgICpcclxuICAgKiBBbHNvIHdoYXQgY2xlYXJzIGEgZmluaXNoZWQgbWVhc3VyZW1lbnQgb2ZmIHRoZSBtb2RlbCBvbmNlIGl0cyBmb3JtIGlzIHNhdmVkIG9yIGNsb3NlZCwgd2hpY2hcclxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cclxuICAgKi9cclxuICBjYW5jZWxNZWFzdXJpbmcoKTogdm9pZCB7XHJcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcclxuICAgIHRoaXMubWVhc3VyaW5nID0gZmFsc2U7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcclxuICAgIC8vIEZvcmdvdHRlbiBoZXJlIHNvIHRoYXQgYSBmb3JtIG9wZW5lZCBsYXRlciBjYW5ub3QgcGljayB1cCBhIG1lYXN1cmVtZW50IGFscmVhZHkgZGVhbHQgd2l0aC5cclxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcclxuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICB9XHJcbiAgICBpZiAod2FzTWVhc3VyaW5nKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dChudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEVuZHMgdGhlIG1lYXN1cmVtZW50IGFuZCByZXR1cm5zIGl0LCBvciBudWxsIHdoZW4gdGhlcmUgYXJlIG5vdCB5ZXQgdHdvIHBvaW50cyB0byBtZWFzdXJlXHJcbiAgICogYmV0d2VlbiAtIGluIHdoaWNoIGNhc2UgbWVhc3VyaW5nIHNpbXBseSBjYXJyaWVzIG9uLlxyXG4gICAqXHJcbiAgICogVGhlIGRyYXdpbmcgc3RheXMgb24gdGhlIG1vZGVsIHNvIGl0IGlzIHN0aWxsIHZpc2libGUgd2hpbGUgdGhlIHBlcnNvbiBuYW1lcyB0aGUgbWVhc3VyZW1lbnQ7XHJcbiAgICogY2FuY2VsTWVhc3VyaW5nKCkgdGFrZXMgaXQgYXdheSBhZnRlcndhcmRzLlxyXG4gICAqL1xyXG4gIGZpbmlzaE1lYXN1cmluZygpOiBUaHJlZUpzTWVhc3VyZW1lbnQgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tZWFzdXJpbmcgfHwgdGhpcy5tZWFzdXJlUG9pbnRzLmxlbmd0aCA8IDIpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcclxuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChudWxsKTtcclxuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcblxyXG4gICAgdGhpcy5sYXN0TWVhc3VyZW1lbnQgPSB7XHJcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgICBzY3JlZW5zaG90OiB0aGlzLmNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKSxcclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5sYXN0TWVhc3VyZW1lbnQ7XHJcbiAgfVxyXG5cclxuICBpc01lYXN1cmluZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLm1lYXN1cmluZztcclxuICB9XHJcblxyXG4gIC8qKiBUaGUgbWVhc3VyZW1lbnQgZmluaXNoTWVhc3VyaW5nKCkgbGFzdCBwcm9kdWNlZCwgZm9yIHRoZSBmb3JtIHRoYXQgc2F2ZXMgaXQuICovXHJcbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xyXG4gIH1cclxuXHJcbiAgLyoqIE1ldHJlcyBiZXR3ZWVuIGNvbnNlY3V0aXZlIHBvaW50cy4gVGFnIHNwYWNlIGlzIGluIG1ldHJlcywgc28gbm8gY29udmVyc2lvbiBpcyBpbnZvbHZlZC4gKi9cclxuICBwcml2YXRlIG1lYXN1cmVEaXN0YW5jZXMoKTogbnVtYmVyW10ge1xyXG4gICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGg7IGluZGV4ICs9IDEpIHtcclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLm1lYXN1cmVQb2ludHNbaW5kZXggLSAxXS5kaXN0YW5jZVRvKHRoaXMubWVhc3VyZVBvaW50c1tpbmRleF0pO1xyXG4gICAgICAvLyBUd28gZGVjaW1hbHMsIHRoZSBwcmVjaXNpb24gTWF0dGVycG9ydCdzIG93biBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCB3aXRoLlxyXG4gICAgICBkaXN0YW5jZXMucHVzaChNYXRoLnJvdW5kKGRpc3RhbmNlICogMTAwKSAvIDEwMCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZGlzdGFuY2VzO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhZGRNZWFzdXJlUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcclxuICAgIHRoaXMubWVhc3VyZVBvaW50cy5wdXNoKHBvaW50KTtcclxuXHJcbiAgICBjb25zdCBtYXJrZXIgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLFxyXG4gICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgLy8gU2l6ZWQgYWdhaW5zdCB0aGUgdmlld3BvcnQsIG5vdCB0aGUgbW9kZWw6IG1lYXN1cmluZyBpcyBkb25lIHpvb21lZCByaWdodCBpbiwgd2hlcmVcclxuICAgICAgICAvLyBhbnl0aGluZyBzaXplZCBpbiBtZXRyZXMgd291bGQgY292ZXIgdGhlIHZlcnkgdGhpbmcgYmVpbmcgbWVhc3VyZWQuXHJcbiAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBtYXJrZXIuc2NhbGUuc2V0KDAuMDIyLCAwLjAyMiwgMSk7XHJcbiAgICBtYXJrZXIucG9zaXRpb24uY29weShwb2ludCk7XHJcbiAgICBtYXJrZXIucmVuZGVyT3JkZXIgPSAxMDAxO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKG1hcmtlcik7XHJcblxyXG4gICAgaWYgKHByZXZpb3VzKSB7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZCh0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKHByZXZpb3VzLCBwb2ludCkpO1xyXG5cclxuICAgICAgY29uc3QgZGlzdGFuY2UgPSBNYXRoLnJvdW5kKHByZXZpb3VzLmRpc3RhbmNlVG8ocG9pbnQpICogMTAwKSAvIDEwMDtcclxuICAgICAgY29uc3QgbGFiZWwgPSBuZXcgVEhSRUUuU3ByaXRlKFxyXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XHJcbiAgICAgICAgICBtYXA6IHRoaXMuY3JlYXRlTWVhc3VyZUxhYmVsVGV4dHVyZShgJHtkaXN0YW5jZS50b0ZpeGVkKDIpfSBtYCksXHJcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxyXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXHJcbiAgICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxyXG4gICAgICAgIH0pXHJcbiAgICAgICk7XHJcbiAgICAgIGxhYmVsLnNjYWxlLnNldCgwLjE1LCAwLjA1LCAxKTtcclxuICAgICAgbGFiZWwucG9zaXRpb24uY29weShwcmV2aW91cykuYWRkKHBvaW50KS5tdWx0aXBseVNjYWxhcigwLjUpO1xyXG4gICAgICBsYWJlbC5yZW5kZXJPcmRlciA9IDEwMDI7XHJcbiAgICAgIHRoaXMubWVhc3VyZUdyb3VwLmFkZChsYWJlbCk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KHtcclxuICAgICAgcG9pbnRzOiB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoLFxyXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHNlZ21lbnQgd2l0aCBhIHdpZHRoIGluIHBpeGVscy5cclxuICAgKlxyXG4gICAqIFdlYkdMJ3Mgb3duIGxpbmVzIGFyZSBvbmUgcGl4ZWwgd2lkZSB3aGF0ZXZlciBpcyBhc2tlZCBmb3IsIHdoaWNoIGFsbCBidXQgZGlzYXBwZWFycyBvdmVyIGFcclxuICAgKiBwaG90b2dyYXBoaWMgdGV4dHVyZS4gVGhpcyBraW5kIGlzIGRyYXduIGFzIHNjcmVlbi1mYWNpbmcgZ2VvbWV0cnksIHNvIHRoZSB3aWR0aCBob2xkcy5cclxuICAgKi9cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMaW5lKGZyb206IFRIUkVFLlZlY3RvcjMsIHRvOiBUSFJFRS5WZWN0b3IzKTogYW55IHtcclxuICAgIGNvbnN0IGdlb21ldHJ5ID0gbmV3IExpbmVHZW9tZXRyeSgpO1xyXG4gICAgZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtmcm9tLngsIGZyb20ueSwgZnJvbS56LCB0by54LCB0by55LCB0by56XSk7XHJcbiAgICBjb25zdCBtYXRlcmlhbCA9IG5ldyBMaW5lTWF0ZXJpYWwoe1xyXG4gICAgICBjb2xvcjogbmV3IFRIUkVFLkNvbG9yKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLmdldEhleCgpLFxyXG4gICAgICBsaW5ld2lkdGg6IDMsXHJcbiAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxyXG4gICAgfSk7XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgbWF0ZXJpYWwucmVzb2x1dGlvbi5zZXQoc2l6ZS54LCBzaXplLnkpO1xyXG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xyXG4gICAgbGluZS5yZW5kZXJPcmRlciA9IDEwMDA7XHJcbiAgICByZXR1cm4gbGluZTtcclxuICB9XHJcblxyXG4gIC8qKiBMaW5lIHdpZHRocyBhcmUgaW4gcGl4ZWxzLCB3aGljaCB0aGUgbWF0ZXJpYWwgY2FuIG9ubHkgaG9ub3VyIGlmIGl0IGtub3dzIHRoZSBjYW52YXMgc2l6ZS4gKi9cclxuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5yZW5kZXJlcikge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBzaXplID0gdGhpcy5yZW5kZXJlci5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IyKCkpO1xyXG4gICAgdGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBpZiAoY2hpbGQubWF0ZXJpYWw/LnJlc29sdXRpb24pIHtcclxuICAgICAgICBjaGlsZC5tYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIFN0cmV0Y2hlcyBhIHNlZ21lbnQgZnJvbSB0aGUgbGFzdCBwb2ludCB0byB0aGUgcG9pbnRlciwgb3IgaGlkZXMgaXQgd2hlbiBnaXZlbiBudWxsLiAqL1xyXG4gIHByaXZhdGUgdXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQodGFyZ2V0OiBUSFJFRS5WZWN0b3IzIHwgbnVsbCk6IHZvaWQge1xyXG4gICAgY29uc3QgbGFzdCA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyaW5nIHx8ICFsYXN0IHx8ICF0YXJnZXQpIHtcclxuICAgICAgaWYgKHRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAoIXRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZCA9IHRoaXMuY3JlYXRlTWVhc3VyZUxpbmUobGFzdCwgdGFyZ2V0KTtcclxuICAgICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZC5tYXRlcmlhbC5vcGFjaXR5ID0gMC42O1xyXG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5tZWFzdXJlUnViYmVyQmFuZCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLmdlb21ldHJ5LnNldFBvc2l0aW9ucyhbXHJcbiAgICAgIGxhc3QueCwgbGFzdC55LCBsYXN0LnosXHJcbiAgICAgIHRhcmdldC54LCB0YXJnZXQueSwgdGFyZ2V0LnosXHJcbiAgICBdKTtcclxuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUodGV4dDogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IDM4NDtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSAxMjg7XHJcbiAgICBjb25zdCBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XHJcblxyXG4gICAgY29uc3QgcmFkaXVzID0gMjg7XHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2JhKDAsIDAsIDAsIDAuNzgpJztcclxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XHJcbiAgICBjb250ZXh0Lm1vdmVUbyhyYWRpdXMsIDgpO1xyXG4gICAgY29udGV4dC5hcmNUbyhjYW52YXMud2lkdGggLSA4LCA4LCBjYW52YXMud2lkdGggLSA4LCBjYW52YXMuaGVpZ2h0IC0gOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIDgsIGNhbnZhcy5oZWlnaHQgLSA4LCByYWRpdXMpO1xyXG4gICAgY29udGV4dC5hcmNUbyg4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuYXJjVG8oOCwgOCwgY2FudmFzLndpZHRoIC0gOCwgOCwgcmFkaXVzKTtcclxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuXHJcbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICcjRkZGRkZGJztcclxuICAgIGNvbnRleHQuZm9udCA9ICdib2xkIDYwcHggc2Fucy1zZXJpZic7XHJcbiAgICBjb250ZXh0LnRleHRBbGlnbiA9ICdjZW50ZXInO1xyXG4gICAgY29udGV4dC50ZXh0QmFzZWxpbmUgPSAnbWlkZGxlJztcclxuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA0KTtcclxuXHJcbiAgICByZXR1cm4gbmV3IFRIUkVFLkNhbnZhc1RleHR1cmUoY2FudmFzKTtcclxuICB9XHJcblxyXG4gIC8qKiBSZW1vdmVzIGV2ZXJ5dGhpbmcgZHJhd24gZm9yIGEgbWVhc3VyZW1lbnQgYW5kIGZvcmdldHMgaXRzIHBvaW50cy4gKi9cclxuICBwcml2YXRlIGNsZWFyTWVhc3VyZW1lbnQoKTogdm9pZCB7XHJcbiAgICBbLi4udGhpcy5tZWFzdXJlR3JvdXAuY2hpbGRyZW5dLmZvckVhY2goKGNoaWxkOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAucmVtb3ZlKGNoaWxkKTtcclxuICAgICAgY2hpbGQuZ2VvbWV0cnk/LmRpc3Bvc2U/LigpO1xyXG4gICAgICBjaGlsZC5tYXRlcmlhbD8ubWFwPy5kaXNwb3NlPy4oKTtcclxuICAgICAgY2hpbGQubWF0ZXJpYWw/LmRpc3Bvc2U/LigpO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzID0gW107XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHBpY3R1cmUgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IG9uIGl0LCBhcyBNYXR0ZXJwb3J0IGF0dGFjaGVzIHRvIGl0cyBvd24uXHJcbiAgICpcclxuICAgKiBUYWdzIGFyZSBsZWZ0IG91dCwgYXMgdGhleSBhcmUgdGhlcmU6IHRoZSBwaWN0dXJlIGlzIGFib3V0IHRoZSBtZWFzdXJlbWVudC4gSXQgaXMgdGFrZW4gc3RyYWlnaHRcclxuICAgKiBhZnRlciBhIHJlbmRlciBiZWNhdXNlIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgZnJhbWUgdW50aWwgdGhlXHJcbiAgICogYnJvd3NlciBwcmVzZW50cyBpdCwgYW5kIHNjYWxlZCBkb3duIHNpbmNlIGl0IGlzIHVwbG9hZGVkIGFuZCBzaG93biBhcyBhIHRodW1ibmFpbC5cclxuICAgKi9cclxuICBwcml2YXRlIGNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGhpZGRlbjogVEhSRUUuU3ByaXRlW10gPSBbXTtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XHJcbiAgICAgICAgc3ByaXRlLnZpc2libGUgPSBmYWxzZTtcclxuICAgICAgICBoaWRkZW4ucHVzaChzcHJpdGUpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XHJcbiAgICBjb25zdCBzb3VyY2UgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQ7XHJcbiAgICBjb25zdCBzY2FsZSA9IE1hdGgubWluKDEsIDgwMCAvIHNvdXJjZS53aWR0aCwgNjAwIC8gc291cmNlLmhlaWdodCk7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc291cmNlLndpZHRoICogc2NhbGUpKTtcclxuICAgIGNhbnZhcy5oZWlnaHQgPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS5oZWlnaHQgKiBzY2FsZSkpO1xyXG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcclxuXHJcbiAgICBoaWRkZW4uZm9yRWFjaCgoc3ByaXRlKSA9PiB7XHJcbiAgICAgIHNwcml0ZS52aXNpYmxlID0gdHJ1ZTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL2pwZWcnLCAwLjg1KTtcclxuICB9XHJcblxyXG4gIC8qKiBBcm1zIHRhZyBwbGFjZW1lbnQ6IHRoZSBuZXh0IGNsaWNrIG9uIHRoZSBtb2RlbCBkcm9wcyBhIHRhZyBpbnN0ZWFkIG9mIGJlaW5nIGlnbm9yZWQuICovXHJcbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSB0cnVlO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQb2lUeXBlID0gcG9pVHlwZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cclxuICBjYW5jZWxUYWdQbGFjZW1lbnQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XHJcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2RlZmF1bHQnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXHJcbiAgICpcclxuICAgKiBNYXR0ZXJwb3J0IGRvZXMgdGhpcyB3aXRoIGEgdGFnIHRoYXQgZm9sbG93cyB0aGUgcG9pbnRlcjsgdGhlIGVxdWl2YWxlbnQgaGVyZSBpcyBhIHByZXZpZXdcclxuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgdXBkYXRlUGxhY2VtZW50UHJldmlldyhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcclxuICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XHJcbiAgICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQobnVsbCk7XHJcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnbm90LWFsbG93ZWQnO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xyXG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcclxuICAgICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xyXG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoJyM5RTlFOUUnKSxcclxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXHJcbiAgICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgICAgIG9wYWNpdHk6IDAuNixcclxuICAgICAgICB9KVxyXG4gICAgICApO1xyXG4gICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcucmVuZGVyT3JkZXIgPSA5OTk7XHJcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICAgIHRoaXMuc2NhbGVUYWdGb3JNb2RlbCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3LnBvc2l0aW9uLmNvcHkocG9zaXRpb24pO1xyXG4gICAgdGhpcy51cGRhdGVNZWFzdXJlUnViYmVyQmFuZChwb3NpdGlvbik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUaGUgcG9pbnQgdW5kZXIgdGhlIGN1cnNvciwgcmVhZCBmcm9tIHRoZSBkZXB0aCBidWZmZXIgaW5zdGVhZCBvZiByYXljYXN0LCBpbiB0YWcgc3BhY2UuXHJcbiAgICpcclxuICAgKiBBIHJheWNhc3Qgd2Fsa3MgZXZlcnkgdHJpYW5nbGUgb2YgdGhlIG1lc2ggaXQgaGl0czogb24gYSBjYXB0dXJlZCBtb2RlbCB0aGF0IGlzIG1pbGxpb25zIG9mXHJcbiAgICogdGhlbSwgdGVucyBvZiBtaWxsaXNlY29uZHMsIGV2ZXJ5IHRpbWUgdGhlIHBvaW50ZXIgbW92ZXMuIENvYWxlc2NpbmcgdG8gb25lIHBlciBmcmFtZSBkaWQgbm90XHJcbiAgICogaGVscCwgYmVjYXVzZSB0aGUgY29zdCBpcyB0aGUgcGljayBpdHNlbGYgLSBpdCBzaW1wbHkgYmVjYW1lIG9uZSBzbG93IGZyYW1lIGluc3RlYWQgb2Ygc2V2ZXJhbC5cclxuICAgKlxyXG4gICAqIFJlbmRlcmluZyB0aGUgbW9kZWwncyBkZXB0aCBpbnRvIGEgc2luZ2xlIHBpeGVsIHVuZGVyIHRoZSBjdXJzb3IgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBvblxyXG4gICAqIHRoZSBHUFUgaW4gY29uc3RhbnQgdGltZSwgd2hhdGV2ZXIgdGhlIG1vZGVsJ3Mgc2l6ZS4gVGhlIGNhbWVyYSdzIHZpZXcgb2Zmc2V0IGlzIHdoYXQgbmFycm93c1xyXG4gICAqIHRoZSB3aG9sZSBpbWFnZSBkb3duIHRvIHRoYXQgb25lIHBpeGVsLCBzbyB0aGUgdmFsdWUgcmVhZCBiYWNrIGlzIHRoZSBkZXB0aCB0aGUgY3Vyc29yIGlzIG92ZXIuXHJcbiAgICpcclxuICAgKiBVc2VkIGZvciB0aGUgZ2hvc3Qgb25seS4gVGhlIGNsaWNrIHRoYXQgYWN0dWFsbHkgcGxhY2VzIGEgdGFnIHN0aWxsIHJheWNhc3RzOiBpdCBpcyBvbmUgcGljayxcclxuICAgKiBpdHMgY29zdCBkb2VzIG5vdCBtYXR0ZXIsIGFuZCBpdCB5aWVsZHMgdGhlIHN1cmZhY2Ugbm9ybWFsLCB3aGljaCBkZXB0aCBhbG9uZSBjYW5ub3QgZ2l2ZS5cclxuICAgKi9cclxuICBwcml2YXRlIHBpY2tQb2ludE9uR3B1KGV2ZW50OiBNb3VzZUV2ZW50KTogVEhSRUUuVmVjdG9yMyB8IG51bGwge1xyXG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCB8fCAhdGhpcy5yZW5kZXJlciB8fCAhdGhpcy5jYW1lcmEpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnBpY2tUYXJnZXQpIHtcclxuICAgICAgdGhpcy5waWNrVGFyZ2V0ID0gbmV3IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0KDEsIDEpO1xyXG4gICAgICB0aGlzLnBpY2tDYW1lcmEgPSBuZXcgVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEoKTtcclxuICAgICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSBuZXcgVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWwoe1xyXG4gICAgICAgIGRlcHRoUGFja2luZzogVEhSRUUuUkdCQURlcHRoUGFja2luZyxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcDtcclxuICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gcmVjdC53aWR0aCB8fCB5ID4gcmVjdC5oZWlnaHQpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmNvcHkodGhpcy5jYW1lcmEpO1xyXG4gICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XHJcbiAgICAvLyBSZW5kZXJzIHRoZSBvbmUgcGl4ZWwgdGhlIGN1cnNvciBpcyBvdmVyIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGltYWdlIC0gb2Zmc2V0IGJ5IGhhbGYgYVxyXG4gICAgLy8gcGl4ZWwgc28gdGhlIGN1cnNvciBzaXRzIGF0IHRoYXQgcGl4ZWwncyBjZW50cmUsIHdoaWNoIGlzIHdoZXJlIE5EQyAoMCwgMCkgbGFuZHMuXHJcbiAgICB0aGlzLnBpY2tDYW1lcmEuc2V0Vmlld09mZnNldChyZWN0LndpZHRoLCByZWN0LmhlaWdodCwgeCAtIDAuNSwgeSAtIDAuNSwgMSwgMSk7XHJcblxyXG4gICAgLy8gV2hlcmUgdGhlIG1vZGVsIGlzIG5vdCwgdGhlIHBpeGVsIG11c3QgcmVhZCBhcyBcIm5vdGhpbmdcIiwgc28gaXQgaXMgY2xlYXJlZCB0byB3aGl0ZSAtIGEgdmFsdWVcclxuICAgIC8vIG5vIHJlYWwgZGVwdGggcGFja3MgdG8uIFR3byB0aGluZ3Mgd291bGQgb3RoZXJ3aXNlIHBhaW50IG92ZXIgdGhhdDogdGhlIGRlZmF1bHQgYmxhY2sgY2xlYXIsXHJcbiAgICAvLyB3aGljaCBkZWNvZGVzIGFzIGRlcHRoIDAgKGEgaGl0IGFnYWluc3QgdGhlIGxlbnMpLCBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQsIHdoaWNoIHRocmVlLmpzXHJcbiAgICAvLyBkcmF3cyBpbiBwbGFjZSBvZiB0aGUgY2xlYXIgY29sb3VyIHdoZW5ldmVyIG9uZSBpcyBzZXQuXHJcbiAgICBjb25zdCBwcmV2aW91c0NsZWFyQ29sb3IgPSB0aGlzLnJlbmRlcmVyLmdldENsZWFyQ29sb3IobmV3IFRIUkVFLkNvbG9yKCkpO1xyXG4gICAgY29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XHJcbiAgICBjb25zdCBwcmV2aW91c1RhcmdldCA9IHRoaXMucmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7XHJcbiAgICBjb25zdCBwcmV2aW91c0JhY2tncm91bmQgPSB0aGlzLnNjZW5lLmJhY2tncm91bmQ7XHJcblxyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbnVsbDtcclxuICAgIHRoaXMuc2NlbmUub3ZlcnJpZGVNYXRlcmlhbCA9IHRoaXMucGlja0RlcHRoTWF0ZXJpYWw7XHJcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhmZmZmZmYsIDEpO1xyXG4gICAgdGhpcy5yZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQodGhpcy5waWNrVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuY2xlYXIoKTtcclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMucGlja0NhbWVyYSk7XHJcblxyXG4gICAgdGhpcy5yZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzKHRoaXMucGlja1RhcmdldCwgMCwgMCwgMSwgMSwgdGhpcy5waWNrUGl4ZWwpO1xyXG5cclxuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHByZXZpb3VzVGFyZ2V0KTtcclxuICAgIHRoaXMucmVuZGVyZXIuc2V0Q2xlYXJDb2xvcihwcmV2aW91c0NsZWFyQ29sb3IsIHByZXZpb3VzQ2xlYXJBbHBoYSk7XHJcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xyXG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gcHJldmlvdXNCYWNrZ3JvdW5kO1xyXG5cclxuICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IHRoaXMucGlja1BpeGVsO1xyXG4gICAgaWYgKHIgPT09IDI1NSAmJiBnID09PSAyNTUgJiYgYiA9PT0gMjU1ICYmIGEgPT09IDI1NSkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBUaGUgaW52ZXJzZSBvZiB0aHJlZSdzIHBhY2tEZXB0aFRvUkdCQSwgd2hpY2ggc3RvcmVzIHRoZSB2YWx1ZSBpdHNlbGYgaW4gYWxwaGEgYW5kIGV2ZXIgZmluZXJcclxuICAgIC8vIGZyYWN0aW9ucyBvZiBpdCBpbiBibHVlLCBncmVlbiBhbmQgcmVkIC0gYWxwaGEgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgbm90IHJlZC4gUmVhZCB0aGVcclxuICAgIC8vIG90aGVyIHdheSByb3VuZCwgdGhlIHJlc3VsdCBpcyBtb3N0bHkgdGhlIGxvdy1vcmRlciBub2lzZSwgb2Z0ZW4gbmVhciB6ZXJvLCB3aGljaCB1bnByb2plY3RzXHJcbiAgICAvLyBvbnRvIHRoZSBuZWFyIHBsYW5lOiBhIGdob3N0IHByZXNzZWQgYWdhaW5zdCB0aGUgbGVucywgZmlsbGluZyB0aGUgd2hvbGUgc2NyZWVuLlxyXG4gICAgY29uc3QgZG93bnNjYWxlID0gMjU1IC8gMjU2O1xyXG4gICAgY29uc3QgZGVwdGggPVxyXG4gICAgICAociAvIDI1NSkgKiBkb3duc2NhbGUgLyAoMjU2ICogMjU2ICogMjU2KSArXHJcbiAgICAgIChnIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYpICtcclxuICAgICAgKGIgLyAyNTUpICogZG93bnNjYWxlIC8gMjU2ICtcclxuICAgICAgKGEgLyAyNTUpICogZG93bnNjYWxlO1xyXG5cclxuICAgIC8vIE5EQyB4IGFuZCB5IGFyZSB6ZXJvIGJlY2F1c2UgdGhlIHBpeGVsIHJlYWQgaXMgdGhlIGNlbnRyZSBvZiB0aGF0IG9uZS1waXhlbCBpbWFnZSAtIHdoaWNoIG9ubHlcclxuICAgIC8vIGhvbGRzIHdoaWxlIHRoZSB2aWV3IG9mZnNldCBpcyBpbiBlZmZlY3QuIENsZWFyaW5nIGl0IGZpcnN0IHdvdWxkIHVucHJvamVjdCB0aHJvdWdoIHRoZSBmdWxsXHJcbiAgICAvLyB2aWV3IGluc3RlYWQsIGxhbmRpbmcgdGhlIHBvaW50IG9uIHRoZSByYXkgdGhyb3VnaCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uIFRoZSBvZmZzZXQgaXNcclxuICAgIC8vIHNpbXBseSByZXBsYWNlZCBieSB0aGUgbmV4dCBwaWNrLCBzbyBpdCBpcyBuZXZlciBjbGVhcmVkLlxyXG4gICAgY29uc3Qgd29ybGQgPSBuZXcgVEhSRUUuVmVjdG9yMygwLCAwLCBkZXB0aCAqIDIgLSAxKS51bnByb2plY3QodGhpcy5waWNrQ2FtZXJhKTtcclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgcmV0dXJuIHRoaXMudGFnR3JvdXAud29ybGRUb0xvY2FsKHdvcmxkKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVtb3ZlUGxhY2VtZW50UHJldmlldygpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5wbGFjZW1lbnRQcmV2aWV3KSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMudGFnR3JvdXAucmVtb3ZlKHRoaXMucGxhY2VtZW50UHJldmlldyk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwubWFwPy5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwuZGlzcG9zZSgpO1xyXG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3ID0gdW5kZWZpbmVkO1xyXG4gIH1cclxuXHJcbiAgLyoqIFNob3dzIG9yIGhpZGVzIG9uZSB0YWcsIGxlYXZpbmcgaXQgcmVnaXN0ZXJlZCBzbyBpdCBjYW4gYmUgYnJvdWdodCBiYWNrIHdpdGhvdXQgcmVsb2FkaW5nLiAqL1xyXG4gIHNldFRhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmIChzcHJpdGUpIHtcclxuICAgICAgc3ByaXRlLnZpc2libGUgPSB2aXNpYmxlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2hvd3Mgb25seSB0YWdzIG9mIHRoZSBnaXZlbiB0eXBlcywgaGlkaW5nIHRoZSByZXN0LlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHNob3dzIGV2ZXJ5dGhpbmcgLSB0aGUgXCJubyBmaWx0ZXJcIiBzdGF0ZSwgZGlzdGluY3QgZnJvbSBhbiBlbXB0eSBhcnJheSwgd2hpY2ggaXMgYVxyXG4gICAqIGZpbHRlciB0aGF0IGhhcHBlbnMgdG8gbWF0Y2ggbm90aGluZy5cclxuICAgKi9cclxuICBzZXRWaXNpYmxlVGFnVHlwZXModHlwZXM6IFBvaVR5cGVbXSB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMudmlzaWJsZVRhZ1R5cGVzID0gdHlwZXM7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIC8qKiBTYXlzIHdoaWNoIGNhcHR1cmUgaXMgb24gc2NyZWVuLCBzbyB0aGUgdGFncyBwbGFjZWQgaW4gaXQgY2FuIGJlIHRvbGQgZnJvbSB0aGUgcmVzdC4gKi9cclxuICBzZXRDdXJyZW50Q2FwdHVyZShjYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcclxuICAgIHRoaXMuY3VycmVudENhcHR1cmVJRCA9IGNhcHR1cmVJRDtcclxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcclxuICAgICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqIEV2ZXJ5IHRhZyByZWdpc3RlcmVkIGluIHRoZSBzY2VuZSwgc2hvd24gb3Igbm90LiAqL1xyXG4gIGdldFRhZ3MoKToge1xyXG4gICAgaWQ6IHN0cmluZztcclxuICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xyXG4gICAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XHJcbiAgICB2aXNpYmxlOiBib29sZWFuO1xyXG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNhbiB1c2UgaXQuICovXHJcbiAgICBjYWxpYnJhdGFibGU6IGJvb2xlYW47XHJcbiAgfVtdIHtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLm1hcCgoc3ByaXRlKSA9PiAoe1xyXG4gICAgICBpZDogc3ByaXRlLm5hbWUsXHJcbiAgICAgIGxhYmVsOiBzcHJpdGUudXNlckRhdGEubGFiZWwgPz8gbnVsbCxcclxuICAgICAgcG9pVHlwZTogc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPz8gbnVsbCxcclxuICAgICAgdmlzaWJsZTogc3ByaXRlLnZpc2libGUsXHJcbiAgICAgIGNhbGlicmF0YWJsZTogY2FuZGlkYXRlcy5oYXMoc3ByaXRlKSxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBmYXIgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgc2l0IGZyb20gdGhlIG1vZGVsLCBtZWFzdXJlZCBpbiBtb2RlbCByYWRpaS4gTnVsbCB3aXRob3V0IGJvdGguXHJcbiAgICpcclxuICAgKiBCZWZvcmUgYSBtb2RlbCBpcyBjYWxpYnJhdGVkIHRob3NlIHRhZ3MgYXJlIHdoZXJldmVyIHRoZWlyIG93biBjb29yZGluYXRlcyBwdXQgdGhlbSwgd2hpY2ggZm9yXHJcbiAgICogYSBtb2RlbCB3aXRoIGEgZGlmZmVyZW50IG9yaWdpbiBjYW4gYmUgYSBsb25nIHdheSBvZmYgLSB0b28gZmFyIHRvIGZpbmQsIGxldCBhbG9uZSBjbGljay5cclxuICAgKi9cclxuICBnZXRUYWdEaXN0YW5jZUZyb21Nb2RlbCgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QgfHwgIXRoaXMubW9kZWxXb3JsZFJhZGl1cykge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGNlbnRyb2lkID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpO1xyXG4gICAgY2FuZGlkYXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IGNlbnRyb2lkLmFkZChzcHJpdGUuZ2V0V29ybGRQb3NpdGlvbihuZXcgVEhSRUUuVmVjdG9yMygpKSkpO1xyXG4gICAgY29uc3QgY291bnQgPSBjYW5kaWRhdGVzLmxlbmd0aDtcclxuICAgIGlmIChjb3VudCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIC8vIFRoZSBtb2RlbCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4gd2hlbiBpdCBpcyBwbGFjZWQuXHJcbiAgICByZXR1cm4gY2VudHJvaWQuZGl2aWRlU2NhbGFyKGNvdW50KS5sZW5ndGgoKSAvIHRoaXMubW9kZWxXb3JsZFJhZGl1cztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhhbmdzIGEgdGFnIGZyb20gdGhlIGdyb3VwIGl0cyBjb29yZGluYXRlcyBiZWxvbmcgdG86IG91dHNpZGUgdGhlIGNhbGlicmF0aW9uIHdoZW4gdGhleSBhcmUgaW5cclxuICAgKiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB1bmRlciBpdCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwYXJlbnRUYWcoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IHZvaWQge1xyXG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnVzZXJEYXRhLmZyYW1lID09PSAnbW9kZWwnICYmIHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxyXG4gICAgICA/IHRoaXMubW9kZWxUYWdHcm91cFxyXG4gICAgICA6IHRoaXMudGFnR3JvdXA7XHJcbiAgICBpZiAoc3ByaXRlLnBhcmVudCAhPT0gcGFyZW50KSB7XHJcbiAgICAgIHBhcmVudC5hZGQoc3ByaXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSB0YWdzIGEgY2FsaWJyYXRpb24gY2FuIGJlIHdvcmtlZCBvdXQgZnJvbTogdGhvc2UgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UsIHdoZXRoZXIgb3JcclxuICAgKiBub3QgdGhleSBhcmUgb24gc2hvdyAtIGJlZm9yZSBjYWxpYnJhdGluZywgbW9zdCBvZiB0aGVtIHdpbGwgbm90IGJlLlxyXG4gICAqXHJcbiAgICogVGFncyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBhcmUgd2hlcmUgdGhleSBhcmUgYmVjYXVzZSBzb21lb25lIGNsaWNrZWQgdGhlcmU7IG1hdGNoaW5nIHRoZW0gdG9cclxuICAgKiBcIndoZXJlIHRoZXkgcmVhbGx5IGFyZVwiIHdvdWxkIGJlIGNpcmN1bGFyLiBBIHRhZyBpbiBhbm90aGVyIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzIGNhbm5vdCBiZVxyXG4gICAqIHBsYWNlZCBoZXJlIGF0IGFsbC4gQW5kIGEgdGFnIGFscmVhZHkgdXNlZCBpbiB0aGlzIGNhbGlicmF0aW9uIGNhbm5vdCBiZSB1c2VkIGFnYWluIC0gdHdvXHJcbiAgICogcGFpcnMgZnJvbSBvbmUgdGFnIGNhcnJ5IG5vIG1vcmUgdGhhbiBvbmUuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKTogVEhSRUUuT2JqZWN0M0RbXSB7XHJcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci50YWdJZCkpO1xyXG4gICAgcmV0dXJuIFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLmZpbHRlcigoc3ByaXRlKSA9PlxyXG4gICAgICBzcHJpdGUucGFyZW50ID09PSB0aGlzLnRhZ0dyb3VwXHJcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5mcmFtZSAhPT0gJ21vZGVsJ1xyXG4gICAgICAmJiAhdGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpXHJcbiAgICAgICYmICF1c2VkLmhhcyhzcHJpdGUubmFtZSkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIEhvdyBtYW55IHRhZ3MgdGhlcmUgYXJlIHRvIGNhbGlicmF0ZSB3aXRoLCBub3QgY291bnRpbmcgdGhvc2UgYWxyZWFkeSB1c2VkLiAqL1xyXG4gIGdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEhvdyBtYW55IHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIG5vdCBvbiB0aGlzIG1vZGVsLCBhbmQgc28gbm90IHNob3duIG9uIGl0LlxyXG4gICAqXHJcbiAgICogT24gYSBtb2RlbCB0aGF0IGhhcyBub3QgYmVlbiBjYWxpYnJhdGVkLCB0aGlzIGlzIHdoYXQgc3VnZ2VzdHMgaXQgc2hvdWxkIGJlOiB0aGUgdGFncyBhcmUgb3V0XHJcbiAgICogdGhlcmUsIGp1c3Qgbm90IHdoZXJlIHRoZSBtb2RlbCBpcy5cclxuICAgKi9cclxuICBnZXRPZmZNb2RlbFRhZ0NvdW50KCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5maWx0ZXIoKHNwcml0ZSkgPT4gIXRoaXMuaXNPbk1vZGVsKHNwcml0ZSkpLmxlbmd0aDtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIHRoZSB0YWcgd2FzIHBsYWNlZCBpbiB0aGUgdmlzaXQgb24gc2NyZWVuLiAqL1xyXG4gIHByaXZhdGUgaXNPd25lZEJ5VmlzaXQoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICEhc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRFxyXG4gICAgICAmJiBzcHJpdGUudXNlckRhdGEub3JpZ2luQ2FwdHVyZUlEID09PSB0aGlzLmN1cnJlbnRDYXB0dXJlSUQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIE9uZSBwbGFjZSBkZWNpZGVzLCBiZWNhdXNlIHRoZSB0d28gdXNlZCB0byBzZXQgYHZpc2libGVgIHNlcGFyYXRlbHkgYW5kIHdoaWNoZXZlciByYW4gbGFzdFxyXG4gICAqIHVuZGlkIHRoZSBvdGhlci5cclxuICAgKi9cclxuICBwcml2YXRlIGFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XHJcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXHJcbiAgICAgIHx8IHRoaXMudmlzaWJsZVRhZ1R5cGVzLmluY2x1ZGVzKHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlKTtcclxuICAgIHNwcml0ZS52aXNpYmxlID0gdHlwZUFsbG93ZWQgJiYgdGhpcy5iZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbCAtIHRoZXJlIGlzIG9uZSBzZXQgb2YgdGFncywgbm90IG9uZSBwZXIgbW9kZWwuXHJcbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBiZWxvbmdzT25UaGlzTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xyXG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cclxuICAgIGlmICh0aGlzLmlzT3duZWRCeVZpc2l0KHNwcml0ZSkpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICAvLyBQbGFjZWQgaW4gYW5vdGhlciBtb2RlbCBiZWZvcmUgdGhhdCBvbmUgd2FzIGNhbGlicmF0ZWQ6IGl0cyBjb29yZGluYXRlcyBhcmUgdGhhdCBtb2RlbCdzIG93blxyXG4gICAgLy8gYW5kIHNheSBub3RoaW5nIGFib3V0IHdoZXJlIGl0IHdvdWxkIGJlIGluIHRoaXMgb25lLlxyXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyLlxyXG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5pc09uTW9kZWwoc3ByaXRlKTtcclxuICB9XHJcblxyXG4gIC8qKiBXaGV0aGVyIGEgdGFnLCBkcmF3biB3aGVyZSBpdHMgY29vcmRpbmF0ZXMgYW5kIHRoZSBjYWxpYnJhdGlvbiBwdXQgaXQsIHNpdHMgb24gdGhlIG1vZGVsLiAqL1xyXG4gIHByaXZhdGUgaXNPbk1vZGVsKHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiBib29sZWFuIHtcclxuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcclxuICAgICAgLy8gTm8gbW9kZWwgdG8gYmUgb24geWV0LlxyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICBjb25zdCBwYXJlbnQgPSBzcHJpdGUucGFyZW50ID8/IHRoaXMudGFnR3JvdXA7XHJcbiAgICBwYXJlbnQudXBkYXRlTWF0cml4KCk7XHJcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXHJcbiAgICBjb25zdCByZWFjaCA9IFRocmVlSnNTZXJ2aWNlLk9OX01PREVMX01FVFJFUyAqIChwYXJlbnQuc2NhbGUueCB8fCAxKTtcclxuICAgIHJldHVybiB0aGlzLmlzTmVhclN1cmZhY2Uoc3ByaXRlLnBvc2l0aW9uLmNsb25lKCkuYXBwbHlNYXRyaXg0KHBhcmVudC5tYXRyaXgpLCByZWFjaCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmUtZGVjaWRlcyBldmVyeSB0YWcncyB2aXNpYmlsaXR5OiB0aGUgbW9kZWwsIHRoZSBjYWxpYnJhdGlvbiBvciB0aGUgbW9kZSBjaGFuZ2VkLiAqL1xyXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc3VyZmFjZUtleSh4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgIGNvbnN0IHNwYW4gPSBUaHJlZUpzU2VydmljZS5TVVJGQUNFX0dSSURfU1BBTjtcclxuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XHJcbiAgICBjb25zdCBbaSwgaiwga10gPSBbeCArIHBhZCwgeSArIHBhZCwgeiArIHBhZF07XHJcbiAgICBpZiAoaSA8IDAgfHwgaiA8IDAgfHwgayA8IDAgfHwgaSA+PSBzcGFuIHx8IGogPj0gc3BhbiB8fCBrID49IHNwYW4pIHtcclxuICAgICAgcmV0dXJuIC0xO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGkgKyBzcGFuICogKGogKyBzcGFuICogayk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cclxuICAgKlxyXG4gICAqIFJ1bnMgb25jZSBwZXIgbW9kZWwsIGluIG9uZSBwYXNzIG92ZXIgaXRzIHRyaWFuZ2xlcy4gQSB0cmlhbmdsZSBzbWFsbGVyIHRoYW4gYSBjZWxsIGlzIG1hcmtlZFxyXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcclxuICAgKiBhIGRyYXduIHdhbGwgLSBpcyBzYW1wbGVkIGFjcm9zcyBpdHMgZmFjZSwgb3IgdGhlIG1pZGRsZSBvZiB0aGUgd2FsbCB3b3VsZCByZWFkIGFzIGVtcHR5LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNpemUgPSBib3guZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMygpKTtcclxuICAgIGNvbnN0IGxvbmdlc3QgPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTtcclxuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xyXG4gICAgICB0aGlzLnN1cmZhY2VDZWxscyA9IG51bGw7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIEEgcXVhcnRlciBvZiBhIG1ldHJlIHdoZXJlIHRoZSBtb2RlbCBpcyBpbiBtZXRyZXM7IGNvYXJzZXIgb24gYSB2ZXJ5IGxhcmdlIG9uZSwgc28gdGhlIGdyaWRcclxuICAgIC8vIHN0YXlzIGFkZHJlc3NhYmxlIGFuZCBpdHMgbWVtb3J5IGJvdW5kZWQuXHJcbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XHJcbiAgICBjb25zdCBvcmlnaW4gPSBib3gubWluLmNsb25lKCk7XHJcbiAgICBjb25zdCBjZWxscyA9IG5ldyBTZXQ8bnVtYmVyPigpO1xyXG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xyXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLnN1cmZhY2VLZXkoXHJcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGwpLFxyXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcclxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbCksXHJcbiAgICAgICk7XHJcbiAgICAgIGlmIChrZXkgPj0gMCkge1xyXG4gICAgICAgIGNlbGxzLmFkZChrZXkpO1xyXG4gICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIGxldCB0cmlhbmdsZUNvdW50ID0gMDtcclxuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmIChwb3NpdGlvbikge1xyXG4gICAgICAgIHRyaWFuZ2xlQ291bnQgKz0gKGNoaWxkLmdlb21ldHJ5LmluZGV4ID8gY2hpbGQuZ2VvbWV0cnkuaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudCkgLyAzO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIC8vIFBhc3QgYSBmZXcgbWlsbGlvbiB0cmlhbmdsZXMgdGhleSBhcmUgZmFyIHNtYWxsZXIgdGhhbiBhIGNlbGwsIGFuZCBldmVyeSBjZWxsIGlzIGhpdCBtYW55XHJcbiAgICAvLyB0aW1lcyBvdmVyOyBhIHNhbXBsZSBtYXJrcyB0aGUgc2FtZSBjZWxscy5cclxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xyXG5cclxuICAgIGNvbnN0IGEgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xyXG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XHJcbiAgICBjb25zdCBjID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIGNvbnN0IHBvaW50ID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcclxuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBwb3NpdGlvbiA9IGNoaWxkLmlzTWVzaCAmJiBjaGlsZC5nZW9tZXRyeT8uYXR0cmlidXRlcz8ucG9zaXRpb247XHJcbiAgICAgIGlmICghcG9zaXRpb24pIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgaW5kZXggPSBjaGlsZC5nZW9tZXRyeS5pbmRleDtcclxuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XHJcbiAgICAgIGZvciAobGV0IHRyaWFuZ2xlID0gMDsgdHJpYW5nbGUgPCBjb3VudDsgdHJpYW5nbGUgKz0gc3RyaWRlKSB7XHJcbiAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdHJpYW5nbGUgKiAzO1xyXG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XHJcbiAgICAgICAgYi5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMSkgOiBvZmZzZXQgKyAxKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xyXG4gICAgICAgIGMuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDIpIDogb2Zmc2V0ICsgMikuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcclxuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XHJcbiAgICAgICAgaWYgKGVkZ2UgPD0gY2VsbCkge1xyXG4gICAgICAgICAgbWFyayhwb2ludC5jb3B5KGEpLmFkZChiKS5hZGQoYykubXVsdGlwbHlTY2FsYXIoMSAvIDMpKTtcclxuICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvLyBIYWxmLWNlbGwgc3RlcHMgYWNyb3NzIHRoZSBmYWNlLiBDYXBwZWQsIHNvIG9uZSBlbm9ybW91cyB0cmlhbmdsZSBjYW5ub3Qgc3RhbGwgdGhlIGxvYWQ7XHJcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cclxuICAgICAgICBjb25zdCBzdGVwcyA9IE1hdGgubWluKDk2LCBNYXRoLmNlaWwoKDIgKiBlZGdlKSAvIGNlbGwpKTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8PSBzdGVwczsgaSArPSAxKSB7XHJcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xyXG4gICAgICAgICAgICBwb2ludC5jb3B5KGEpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihiLmNsb25lKCkuc3ViKGEpLCBpIC8gc3RlcHMpXHJcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xyXG4gICAgICAgICAgICBtYXJrKHBvaW50KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuc3VyZmFjZUNlbGxzID0gY2VsbHM7XHJcbiAgICB0aGlzLnN1cmZhY2VPcmlnaW4uY29weShvcmlnaW4pO1xyXG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xyXG4gIH1cclxuXHJcbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cclxuICBwcml2YXRlIGlzTmVhclN1cmZhY2UocG9pbnQ6IFRIUkVFLlZlY3RvcjMsIHJlYWNoOiBudW1iZXIpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGNlbGwgPSB0aGlzLnN1cmZhY2VDZWxsU2l6ZTtcclxuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcclxuICAgIGNvbnN0IHggPSAocG9pbnQueCAtIG9yaWdpbi54KSAvIGNlbGw7XHJcbiAgICBjb25zdCB5ID0gKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsO1xyXG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcclxuICAgIC8vIEluIGNlbGxzLiBDYXBwZWQ6IGJleW9uZCB0aGlzIHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIG1ha2VzIGEgbWV0cmUgc28gbWFueSBjZWxscyB0aGF0IHRoZVxyXG4gICAgLy8gc2VhcmNoIHdvdWxkIGR3YXJmIHRoZSBtb2RlbCwgYW5kIGEgdGFnIHRoYXQgZmFyIG9mZiBpcyBub3Qgb24gaXQgYnkgYW55IHJlYWRpbmcuXHJcbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcclxuICAgIC8vIEEgY2VsbCBpcyBcIndpdGhpbiByZWFjaFwiIHdoZW4gaXRzIGNlbnRyZSBpcywgZ2l2ZSBvciB0YWtlIHRoZSBoYWxmLWRpYWdvbmFsIG9mIHRoZSBjZWxsLlxyXG4gICAgY29uc3QgbGltaXQgPSAocmVhY2ggLyBjZWxsICsgMC44NykgKiogMjtcclxuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcclxuICAgIGZvciAobGV0IGsgPSBjeiAtIHNwYW47IGsgPD0gY3ogKyBzcGFuOyBrICs9IDEpIHtcclxuICAgICAgZm9yIChsZXQgaiA9IGN5IC0gc3BhbjsgaiA8PSBjeSArIHNwYW47IGogKz0gMSkge1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcclxuICAgICAgICAgIGNvbnN0IGRpc3RhbmNlID0gKGkgKyAwLjUgLSB4KSAqKiAyICsgKGogKyAwLjUgLSB5KSAqKiAyICsgKGsgKyAwLjUgLSB6KSAqKiAyO1xyXG4gICAgICAgICAgaWYgKGRpc3RhbmNlIDw9IGxpbWl0ICYmIHRoaXMuc3VyZmFjZUNlbGxzLmhhcyh0aGlzLnN1cmZhY2VLZXkoaSwgaiwgaykpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXHJcbiAgICpcclxuICAgKiBBbmltYXRlZCByYXRoZXIgdGhhbiB0ZWxlcG9ydGVkOiBqdW1waW5nIHRoZSBjYW1lcmEgbG9zZXMgdGhlIHZpZXdlcidzIHNlbnNlIG9mIHdoZXJlIHRoZXkgd2VyZVxyXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcclxuICAgKiB3aGF0ZXZlciB0aGUgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcclxuICAgIGlmICghc3ByaXRlIHx8ICF0aGlzLmNhbWVyYSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XHJcbiAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubW9kZWxSb290XHJcbiAgICAgID8gbmV3IFRIUkVFLkJveDMoKS5zZXRGcm9tT2JqZWN0KHRoaXMubW9kZWxSb290KS5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpLmxlbmd0aCgpICogMC4xNVxyXG4gICAgICA6IDU7XHJcblxyXG4gICAgLy8gQXBwcm9hY2ggYWxvbmcgdGhlIGN1cnJlbnQgdmlld2luZyBkaXJlY3Rpb24sIHNvIHRoZSBjYW1lcmEgY2xvc2VzIGluIHJhdGhlciB0aGFuIHN3aW5naW5nXHJcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXHJcbiAgICBjb25zdCBkaXJlY3Rpb24gPSB0aGlzLmNhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLnN1Yih0aGlzLmNvbnRyb2xzLnRhcmdldCkubm9ybWFsaXplKCk7XHJcbiAgICB0aGlzLmNhbWVyYVR3ZWVuID0ge1xyXG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXHJcbiAgICAgIHRvUG9zaXRpb246IHRhcmdldC5jbG9uZSgpLmFkZChkaXJlY3Rpb24ubXVsdGlwbHlTY2FsYXIoZGlzdGFuY2UpKSxcclxuICAgICAgZnJvbVRhcmdldDogdGhpcy5jb250cm9scy50YXJnZXQuY2xvbmUoKSxcclxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcclxuICAgICAgc3RhcnRlZEF0OiBwZXJmb3JtYW5jZS5ub3coKSxcclxuICAgICAgZHVyYXRpb25NczogNjAwLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xyXG4gIHByaXZhdGUgc3RlcENhbWVyYVR3ZWVuKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmNhbWVyYVR3ZWVuKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGNvbnN0IHsgZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCBmcm9tVGFyZ2V0LCB0b1RhcmdldCwgc3RhcnRlZEF0LCBkdXJhdGlvbk1zIH0gPSB0aGlzLmNhbWVyYVR3ZWVuO1xyXG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xyXG4gICAgLy8gRWFzZSBvdXQsIHNvIHRoZSBtb3ZlIHNldHRsZXMgaW5zdGVhZCBvZiBzdG9wcGluZyBkZWFkLlxyXG4gICAgY29uc3QgdCA9IDEgLSBNYXRoLnBvdygxIC0gbGluZWFyLCAzKTtcclxuXHJcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5sZXJwVmVjdG9ycyhmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIHQpO1xyXG4gICAgdGhpcy5jb250cm9scy50YXJnZXQubGVycFZlY3RvcnMoZnJvbVRhcmdldCwgdG9UYXJnZXQsIHQpO1xyXG5cclxuICAgIGlmIChsaW5lYXIgPj0gMSkge1xyXG4gICAgICB0aGlzLmNhbWVyYVR3ZWVuID0gbnVsbDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnBsYWNpbmdUYWc7XHJcbiAgfVxyXG5cclxuICAvKiogVGhlIHNwb3QgcGlja2VkIGJ5IHRoZSBsYXN0IHBsYWNlbWVudCwgZm9yIHdob2V2ZXIgY29tbWl0cyBpdCB0byBhIFBPSS4gKi9cclxuICBnZXRQZW5kaW5nVGFnUGxhY2VtZW50KCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSYXljYXN0cyBhIGNsaWNrIGFnYWluc3QgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgYW5kIHJldHVybnMgdGhlIGhpdCwgaW4gd29ybGQgc3BhY2UuXHJcbiAgICpcclxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXHJcbiAgICogbGVhdmVzIHdoYXRldmVyIG1vZGUgaXMgYXJtZWQgc3RpbGwgYXJtZWQsIHNvIHRoZXkgY2FuIHNpbXBseSB0cnkgYWdhaW4uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcclxuICAgIGlmICghdGhpcy5tb2RlbFJvb3QpIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xyXG4gICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdCh0aGlzLm1vZGVsUm9vdCwgdHJ1ZSlbMF0gPz8gbnVsbDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR1cm5zIGEgY2xpY2sgaW50byBhIHBvaW50IG9uIHRoZSBtb2RlbCwgaW4gdGhlIGZyYW1lIHRhZyBjb29yZGluYXRlcyBhcmUgcGVyc2lzdGVkIGluLlxyXG4gICAqXHJcbiAgICogVGhhdCBmcmFtZSBpcyB0aGUgdGFnIGdyb3VwJ3MsIG5vdCB0aGUgbW9kZWwncy4gQSBzdG9yZWQgY29vcmRpbmF0ZSBpcyByZWFkIGJhY2sgYXMgYSBzcHJpdGVcclxuICAgKiBwb3NpdGlvbiBpbnNpZGUgdGhhdCBncm91cCwgc28gYSBjb29yZGluYXRlIGNhcHR1cmVkIGluIGFueSBvdGhlciBmcmFtZSBjb21lcyBiYWNrIGRpc3BsYWNlZCBieVxyXG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXHJcbiAgICogYWxpZ25tZW50IGlzIGlkZW50aXR5LCB3aGljaCBpcyB3aHkgdGhpcyBzdGF5ZWQgaW52aXNpYmxlIHVudGlsIGEgbW9kZWwgd2FzIGNhbGlicmF0ZWQuXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcclxuICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdE1vZGVsKGV2ZW50KTtcclxuICAgIGlmICghaGl0KSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xyXG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbChoaXQucG9pbnQuY2xvbmUoKSk7XHJcblxyXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XHJcbiAgICAvLyB1bmRlciB0cmFuc2Zvcm1zIG9mIGl0cyBvd24sIHNvIHRha2UgaXQgb3V0IHRocm91Z2ggdGhvc2UgYW5kIGJhY2sgaW50byB0aGUgdGFnIGZyYW1lLCBzbyBpdFxyXG4gICAgLy8gZGVzY3JpYmVzIHRoZSBzYW1lIG9yaWVudGF0aW9uIHRoZSBwb3NpdGlvbiBkb2VzLlxyXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xyXG4gICAgaWYgKGhpdC5mYWNlKSB7XHJcbiAgICAgIG5vcm1hbCA9IGhpdC5mYWNlLm5vcm1hbFxyXG4gICAgICAgIC5jbG9uZSgpXHJcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihoaXQub2JqZWN0Lm1hdHJpeFdvcmxkKVxyXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24obmV3IFRIUkVFLk1hdHJpeDQoKS5jb3B5KHRoaXMudGFnR3JvdXAubWF0cml4V29ybGQpLmludmVydCgpKVxyXG4gICAgICAgIC5ub3JtYWxpemUoKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBwb3NpdGlvbjogeyB4OiBwb3NpdGlvbi54LCB5OiBwb3NpdGlvbi55LCB6OiBwb3NpdGlvbi56IH0sXHJcbiAgICAgIG5vcm1hbDogeyB4OiBub3JtYWwueCwgeTogbm9ybWFsLnksIHo6IG5vcm1hbC56IH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogV2hlcmUgdGhlIHVzZXIgc2F5cyBhIHRhZyByZWFsbHkgYmVsb25ncywgaW4gdGhlIHNwYWNlIHRoZSBzb2x2ZWQgYWxpZ25tZW50IG1hcHMgb250by5cclxuICAgKlxyXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcclxuICAgKiByZWxhdGl2ZSB0byBpdHMgcGFyZW50IC0gc28gdGhlIHRhcmdldCBoYXMgdG8gYmUgaW4gdGhlIHBhcmVudCdzIGZyYW1lLiBNZWFzdXJpbmcgaXQgaW4gdGhlXHJcbiAgICogZ3JvdXAncyBvd24gZnJhbWUgaW5zdGVhZCB3b3VsZCBmb2xkIHRoZSBjdXJyZW50IGFsaWdubWVudCBpbnRvIHRoZSBhbnN3ZXIsIG1ha2luZyBlYWNoXHJcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcGlja0FsaWdubWVudFRhcmdldChldmVudDogTW91c2VFdmVudCk6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCB7XHJcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XHJcbiAgICBpZiAoIWhpdCkge1xyXG4gICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuICAgIGNvbnN0IGZyYW1lID0gdGhpcy50YWdHcm91cC5wYXJlbnQgPz8gdGhpcy5zY2VuZTtcclxuICAgIGZyYW1lLnVwZGF0ZVdvcmxkTWF0cml4KHRydWUsIGZhbHNlKTtcclxuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcclxuICAgIHJldHVybiB7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNldHMgdGhlIHRyYW5zZm9ybSBtYXBwaW5nIGNhcHR1cmVkIHRhZyBjb29yZGluYXRlcyBvbnRvIHRoaXMgbW9kZWwncyBzcGFjZS5cclxuICAgKlxyXG4gICAqIEV2ZXJ5IHRhZyBjb21lcyBmcm9tIHRoZSBzYW1lIHNvdXJjZSBzcGFjZSwgc28gdGhpcyBpcyBvbmUgdHJhbnNmb3JtIG9uIHRoZSBncm91cCByYXRoZXIgdGhhblxyXG4gICAqIHBlci10YWcgbWF0aHMgLSB3aGljaCBhbHNvIG1lYW5zIGl0IGFwcGxpZXMgcmV0cm9hY3RpdmVseSB0byB0YWdzIGFscmVhZHkgcGxhY2VkLCBhbmQgY2FuIGJlXHJcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxyXG4gICAqXHJcbiAgICogUGFzc2luZyBudWxsIHJlc2V0cyB0byBpZGVudGl0eSwgaS5lLiB0YWcgY29vcmRpbmF0ZXMgYXJlIGFscmVhZHkgaW4gbW9kZWwgc3BhY2UuXHJcbiAgICovXHJcbiAgc2V0VGFnQWxpZ25tZW50KGFsaWdubWVudDogVGhyZWVKc0FsaWdubWVudCB8IG51bGwpOiB2b2lkIHtcclxuICAgIGNvbnN0IHsgdHJhbnNsYXRpb24sIHJvdGF0aW9uLCBzY2FsZSB9ID0gYWxpZ25tZW50ID8/IHt9O1xyXG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XHJcbiAgICB0aGlzLnRhZ0dyb3VwLnJvdGF0aW9uLnNldChyb3RhdGlvbj8ueCA/PyAwLCByb3RhdGlvbj8ueSA/PyAwLCByb3RhdGlvbj8ueiA/PyAwKTtcclxuICAgIHRoaXMudGFnR3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlID8/IDEpO1xyXG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcclxuXHJcbiAgICAvLyBUYWcgc2l6ZSBpcyBkZXJpdmVkIGZyb20gdGhlIHdvcmxkIHNjYWxlIGl0IGluaGVyaXRzLCB3aGljaCB0aGlzIGNhbGwganVzdCBjaGFuZ2VkIC0gYW5kIHNvXHJcbiAgICAvLyBpcyB3aGljaCB0YWdzIGxhbmQgb24gdGhlIG1vZGVsLlxyXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xyXG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cclxuICAgKlxyXG4gICAqIFVwc2VydCByYXRoZXIgdGhhbiBhIGRlY2xhcmF0aXZlIFwiaGVyZSBpcyB0aGUgZnVsbCBsaXN0XCIgY2FsbCwgYmVjYXVzZSB0YWdzIGFycml2ZSBwZXIgdHlwZVxyXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XHJcbiAgICogb24gZWFjaCBvZiB0aG9zZSB3b3VsZCB3aXBlIHRoZSB0eXBlcyB0aGF0IGNhbWUgYmVmb3JlLlxyXG4gICAqL1xyXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nID0gdGhpcy50YWdTcHJpdGVzLmdldCh0YWcuaWQpO1xyXG4gICAgaWYgKGV4aXN0aW5nKSB7XHJcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEucG9pVHlwZSA9IHRhZy5wb2lUeXBlID8/IGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGU7XHJcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsID0gdGFnLmxhYmVsID8/IGV4aXN0aW5nLnVzZXJEYXRhLmxhYmVsO1xyXG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcclxuICAgICAgZXhpc3RpbmcudXNlckRhdGEuZnJhbWUgPSB0YWcuZnJhbWUgPz8gZXhpc3RpbmcudXNlckRhdGEuZnJhbWU7XHJcbiAgICAgIHRoaXMucGFyZW50VGFnKGV4aXN0aW5nKTtcclxuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoZXhpc3RpbmcpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc3ByaXRlID0gbmV3IFRIUkVFLlNwcml0ZShcclxuICAgICAgbmV3IFRIUkVFLlNwcml0ZU1hdGVyaWFsKHtcclxuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxyXG4gICAgICAgIC8vIFRhZ3MgcmVhZCBhcyBVSSByYXRoZXIgdGhhbiBnZW9tZXRyeSwgc28gdGhleSBzdGF5IHZpc2libGUgdGhyb3VnaCB0aGUgbW9kZWwgaW5zdGVhZCBvZlxyXG4gICAgICAgIC8vIGJlaW5nIG9jY2x1ZGVkIGJ5IHdoYXRldmVyIHdhbGwgaGFwcGVucyB0byBiZSBiZXR3ZWVuIHRoZW0gYW5kIHRoZSBjYW1lcmEuXHJcbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcclxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgICBzcHJpdGUubmFtZSA9IHRhZy5pZDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlID0gdGFnLnBvaVR5cGUgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRCA9IHRhZy5vcmlnaW5DYXB0dXJlSUQgPz8gbnVsbDtcclxuICAgIHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9IHRhZy5mcmFtZSA/PyBudWxsO1xyXG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcclxuICAgIHNwcml0ZS5yZW5kZXJPcmRlciA9IDk5OTtcclxuICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XHJcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcclxuICAgIHRoaXMuYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZSk7XHJcblxyXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XHJcblxyXG4gICAgaWYgKHRhZy5pY29uVXJsKSB7XHJcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIFJlbW92ZXMgdGhlIHRhZyByZWdpc3RlcmVkIGZvciBhbiBlbGVtZW50LCBpZiB0aGVyZSBpcyBvbmUuICovXHJcbiAgcmVtb3ZlVGFnKGVsZW1lbnRJZDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XHJcbiAgICBpZiAoIXNwcml0ZSkge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBzcHJpdGUucGFyZW50Py5yZW1vdmUoc3ByaXRlKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XHJcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZGVsZXRlKGVsZW1lbnRJZCk7XHJcbiAgfVxyXG5cclxuICAvKiogUmVtb3ZlcyBldmVyeSB0YWcgZnJvbSB0aGUgc2NlbmUuICovXHJcbiAgY2xlYXJUYWdzKCk6IHZvaWQge1xyXG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xyXG4gIH1cclxuXHJcbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXHJcbiAgcHJpdmF0ZSBhcHBseVRhZ0ljb24oc3ByaXRlOiBUSFJFRS5TcHJpdGUsIGljb25Vcmw6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgbmV3IFRIUkVFLlRleHR1cmVMb2FkZXIoKS5sb2FkKFxyXG4gICAgICBpY29uVXJsLFxyXG4gICAgICAodGV4dHVyZSkgPT4ge1xyXG4gICAgICAgIHNwcml0ZS5tYXRlcmlhbC5tYXA/LmRpc3Bvc2UoKTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcclxuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlO1xyXG4gICAgICB9LFxyXG4gICAgICB1bmRlZmluZWQsXHJcbiAgICAgICgpID0+IGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBsb2FkIHRhZyBpY29uIFwiJHtpY29uVXJsfVwiLCBrZWVwaW5nIHRoZSBkZWZhdWx0IG1hcmtlci5gKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIC8qKiBEcmF3cyB0aGUgZGVmYXVsdCB0YWcgbWFya2VyOiBhIGZpbGxlZCBkaXNjIHdpdGggYSB3aGl0ZSByaW5nLCBzbyBpdCByZWFkcyBvbiBhbnkgYmFja2dyb3VuZC4gKi9cclxuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcclxuICAgIGNvbnN0IHNpemUgPSAxMjg7XHJcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XHJcbiAgICBjYW52YXMuaGVpZ2h0ID0gc2l6ZTtcclxuICAgIGNvbnN0IGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuXHJcbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xyXG4gICAgY29udGV4dC5hcmMoc2l6ZSAvIDIsIHNpemUgLyAyLCBzaXplIC8gMiAtIDgsIDAsIE1hdGguUEkgKiAyKTtcclxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XHJcbiAgICBjb250ZXh0LmZpbGwoKTtcclxuICAgIGNvbnRleHQubGluZVdpZHRoID0gODtcclxuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XHJcbiAgICBjb250ZXh0LnN0cm9rZSgpO1xyXG5cclxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogU2l6ZXMgYSB0YWcgcmVsYXRpdmUgdG8gdGhlIG1vZGVsLlxyXG4gICAqXHJcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cclxuICAgKiBhIGxhcmdlIG1vZGVsIGFuZCBodWdlIG9uIGEgc21hbGwgb25lLiBEaXZpZGluZyBieSB0aGUgZ3JvdXAncyB3b3JsZCBzY2FsZSBrZWVwcyB0YWdzIHRoZSBzYW1lXHJcbiAgICogc2l6ZSBvbiBzY3JlZW4gd2hhdGV2ZXIgdGhlIG1vZGVsJ3MgdW5pdHMgYXJlLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgc2NhbGVUYWdGb3JNb2RlbChzcHJpdGU6IFRIUkVFLlNwcml0ZSk6IHZvaWQge1xyXG4gICAgLy8gSXRzIG93biBwYXJlbnQncyBzY2FsZTogdGFncyBpbiB0aGUgbW9kZWwncyBjb29yZGluYXRlcyBkbyBub3QgaW5oZXJpdCB0aGUgY2FsaWJyYXRpb24ncy5cclxuICAgIGNvbnN0IHdvcmxkU2NhbGUgPSAoc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwKS5nZXRXb3JsZFNjYWxlKG5ldyBUSFJFRS5WZWN0b3IzKCkpLnggfHwgMTtcclxuICAgIGNvbnN0IHNpemUgPSAwLjQgLyB3b3JsZFNjYWxlO1xyXG4gICAgc3ByaXRlLnNjYWxlLnNldChzaXplLCBzaXplLCAxKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEFkZHMgc2Vjb25kYXJ5IGludGVyYWN0aXZlIG9iamVjdHMgKGUuZy4sIFBPSXMsIHNlbnNvcnMpIHRvIHRoZSBzY2VuZS5cclxuICAgKi9cclxuICB1cGRhdGVPYmpzVG9TY2VuZShvYmpzQWRkZWQ6IE9iakFkZGVkW10pOiB2b2lkIHtcclxuICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLm1hcCgob2JqKSA9PiBvYmoubmFtZSk7XHJcbiAgICBjb25zdCBvYmpMb2FkZXIgPSBuZXcgT0JKTG9hZGVyKCk7XHJcblxyXG4gICAgLy8gZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBwcm92aWRlZCBhcnJheVxyXG4gICAgdGhpcy5jbGlja2FibGVPYmplY3RzLmZvckVhY2goKG9iaikgPT4ge1xyXG4gICAgICBpZiAoIW9ianNBZGRlZC5maW5kKChvYmpEYXRhKSA9PiBvYmpEYXRhLmlkID09PSBvYmoubmFtZSkpIHtcclxuICAgICAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xyXG4gICAgICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cyA9IHRoaXMuY2xpY2thYmxlT2JqZWN0cy5maWx0ZXIoXHJcbiAgICAgICAgICAob2JqZWN0KSA9PiBvYmplY3QubmFtZSAhPT0gb2JqLm5hbWVcclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBvYmpzQWRkZWQuZm9yRWFjaCgob2JqZWN0RGF0YTogT2JqQWRkZWQpID0+IHtcclxuICAgICAgaWYgKCFleGlzdGluZ0lkcy5pbmNsdWRlcyhvYmplY3REYXRhLmlkKSkge1xyXG4gICAgICAgIG9iakxvYWRlci5sb2FkKG9iamVjdERhdGEuZmlsZSwgKG5ld09iamVjdCkgPT4ge1xyXG4gICAgICAgICAgbmV3T2JqZWN0Lm5hbWUgPSBvYmplY3REYXRhLmlkO1xyXG5cclxuICAgICAgICAgIG5ld09iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcclxuICAgICAgICAgICAgaWYgKChjaGlsZCBhcyBUSFJFRS5NZXNoKS5pc01lc2gpIHtcclxuICAgICAgICAgICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcclxuICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1hdGVyaWFsKSB7XHJcbiAgICAgICAgICAgICAgICBtZXNoLm1hdGVyaWFsLnRyYW5zcGFyZW50ID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIG1lc2gubWF0ZXJpYWwub3BhY2l0eSA9IDAuODtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgIC8vIHNldCBvYmplY3QgcG9zaXRpb24gYW5kIHJvdGF0aW9uXHJcbiAgICAgICAgICBuZXdPYmplY3QucG9zaXRpb24uc2V0KFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLngsXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucG9zaXRpb24ueSxcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5wb3NpdGlvbi56XHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAvLyBUaGUgSlNPTiBjb25maWd1cmF0aW9uIGhhcyByb3RhdGlvbiBhbHJlYWR5IGluIHJhZGlhbnMgKGUuZy4gMy4xNDE1Li4uKVxyXG4gICAgICAgICAgbmV3T2JqZWN0LnJvdGF0aW9uLnNldChcclxuICAgICAgICAgICAgb2JqZWN0RGF0YS5yb3RhdGlvbi54LFxyXG4gICAgICAgICAgICBvYmplY3REYXRhLnJvdGF0aW9uLnksXHJcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24uelxyXG4gICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgICBuZXdPYmplY3Quc2NhbGUuc2V0KG9iamVjdERhdGEuc2NhbGUueCwgb2JqZWN0RGF0YS5zY2FsZS55LCBvYmplY3REYXRhLnNjYWxlLnopO1xyXG5cclxuICAgICAgICAgIHRoaXMuc2NlbmUuYWRkKG5ld09iamVjdCk7XHJcbiAgICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMucHVzaChuZXdPYmplY3QpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcclxuXHJcbiAgICAgIC8vIFdoaWxlIHRoZSBnaG9zdCBpcyB1cCBpdCBmb2xsb3dzIHRoZSBwb2ludGVyIGFuZCBub3RoaW5nIGVsc2Ugc2hvdWxkIHJlYWN0IHRvIGl0LiBUaGUgbW92ZVxyXG4gICAgICAvLyBpcyBvbmx5IHJlY29yZGVkIGhlcmU6IHBvaW50ZXIgZXZlbnRzIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBmcmFtZXMsIGFuZCBwaWNraW5nIGEgcG9pbnRcclxuICAgICAgLy8gY29zdHMgYSByYXljYXN0IGFnYWluc3QgdGhlIHdob2xlIG1vZGVsLCBzbyBkb2luZyBpdCBwZXIgZXZlbnQgaXMgd2hhdCBtYWRlIHRoZSBnaG9zdCB0cmFpbFxyXG4gICAgICAvLyBiZWhpbmQgdGhlIGN1cnNvci4gVGhlIHJlbmRlciBsb29wIHBpY2tzIHVwIHRoZSBsYXRlc3QgcG9zaXRpb24sIG9uY2UsIHBlciBmcmFtZS5cclxuICAgICAgaWYgKHRoaXMuaXNQcmV2aWV3aW5nUGxhY2VtZW50KCkpIHtcclxuICAgICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBldmVudDtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIE5vdCBwcmV2aWV3aW5nIGFueSBtb3JlIChhIHBhaXIgd2FzIGp1c3QgY29tcGxldGVkLCBzYXkpOiBkcm9wIGEgZ2hvc3QgbGVmdCBvdmVyIGZyb20gaXQuXHJcbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG5cclxuICAgICAgLy8gVGFncyBmaXJzdDogdGhleSBkcmF3IG9uIHRvcCBvZiB0aGUgbW9kZWwsIHNvIHRoZXkgaGF2ZSB0byBhbnN3ZXIgdGhlIHBvaW50ZXIgZmlyc3QgdG9vLlxyXG4gICAgICBjb25zdCBob3ZlcmVkVGFnID0gdGhpcy5yYXljYXN0ZXJcclxuICAgICAgICAuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXHJcbiAgICAgICAgLmZpbmQoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKT8ub2JqZWN0O1xyXG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAncG9pbnRlcic7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcclxuICAgICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobGFiZWwgPyB7IGxhYmVsLCBldmVudCB9IDogbnVsbCk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudGFnSG92ZXJlZCQubmV4dChudWxsKTtcclxuXHJcbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XHJcblxyXG4gICAgICBpZiAoaW50ZXJzZWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcclxuICAgICAgICBjb25zdCBpbnRlcnNlY3RlZE9iamVjdElkID0gaW50ZXJzZWN0c1swXS5vYmplY3Q/LnBhcmVudD8ubmFtZTtcclxuICAgICAgICBpZiAoaW50ZXJzZWN0ZWRPYmplY3RJZCkge1xyXG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XHJcbiAgICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2dyYWJiaW5nJztcclxuICAgICAgdGhpcy5vYmplY3RIb3ZlcmVkJC5uZXh0KG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XHJcbiAgICAgIGNvbnN0IHJlY3QgPSB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xyXG4gICAgICB0aGlzLm1vdXNlLnkgPSAtKChldmVudC5jbGllbnRZIC0gcmVjdC50b3ApIC8gcmVjdC5oZWlnaHQpICogMiArIDE7XHJcblxyXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxyXG4gICAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xyXG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gTWVhc3VyaW5nIHRha2VzIGV2ZXJ5IGNsaWNrIGFzIGEgcG9pbnQsIHRoZSBzYW1lIHdheSBwbGFjZW1lbnQgdGFrZXMgaXQgYXMgYSBwb3NpdGlvbi5cclxuICAgICAgaWYgKHRoaXMubWVhc3VyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgY29uc3QgeyB4LCB5LCB6IH0gPSBwbGFjZW1lbnQucG9zaXRpb247XHJcbiAgICAgICAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gUGxhY2VtZW50IHdpbnMgb3ZlciBldmVyeXRoaW5nOiB3aGlsZSBhcm1lZCwgYSBjbGljayBtZWFucyBcInB1dCBpdCBoZXJlXCIsIG5vdCBcIm9wZW4gdGhhdFwiLlxyXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XHJcbiAgICAgICAgaWYgKHBsYWNlbWVudCkge1xyXG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XHJcbiAgICAgICAgICB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQgPSBwbGFjZW1lbnQ7XHJcbiAgICAgICAgICB0aGlzLnBsYWNpbmdUYWcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xyXG4gICAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcclxuICAgICAgICAgIHRoaXMudGFnUGxhY2VkJC5uZXh0KHBsYWNlbWVudCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XHJcblxyXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXHJcbiAgICAgIGNvbnN0IHRhZ0hpdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKFsuLi50aGlzLnRhZ1Nwcml0ZXMudmFsdWVzKCldLCBmYWxzZSlcclxuICAgICAgICAuZmlsdGVyKChoaXQpID0+IGhpdC5vYmplY3QudmlzaWJsZSk7XHJcbiAgICAgIGlmICh0YWdIaXRzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCB0YWcgPSB0YWdIaXRzWzBdLm9iamVjdDtcclxuICAgICAgICB0aGlzLnRhZ0NsaWNrZWQkLm5leHQoeyBlbGVtZW50SWQ6IHRhZy5uYW1lLCBwb2lUeXBlOiB0YWcudXNlckRhdGEucG9pVHlwZSA/PyBudWxsIH0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XHJcbiAgICAgICAgY29uc3QgaWQgPSBjbGlja2VkT2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XHJcbiAgICAgICAgaWYgKGlkKSB7XHJcbiAgICAgICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChpZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChudWxsKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRXNjYXBlIGNhbmNlbHMgd2hhdGV2ZXIgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGNvbW1pdHRlZCB0by5cclxuICAgKlxyXG4gICAqIEVtaXRzIHRocm91Z2ggdGhlIHNhbWUgc3ViamVjdHMgdGhlIGV4cGxpY2l0IENhbmNlbCBidXR0b25zIHVzZSwgc28gdGhlIFVJIGRyaXZpbmcgdGhlbSBmb2xsb3dzXHJcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgb25LZXlEb3duID0gKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCA9PiB7XHJcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XHJcbiAgICAgIC8vIE5vdGhpbmcgb3V0c2lkZSB0aGUgc2NlbmUgdHJhY2tzIHBsYWNlbWVudCwgc28gY2xlYXJpbmcgaXQgaGVyZSBpcyB0aGUgd2hvbGUgb2YgaXQuXHJcbiAgICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbE1lYXN1cmluZygpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xyXG4gICAgICB0aGlzLmNhbmNlbFRhZ0FsaWdubWVudCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBhbmltYXRlID0gKCk6IHZvaWQgPT4ge1xyXG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XHJcbiAgICB0aGlzLnN0ZXBDYW1lcmFUd2VlbigpO1xyXG4gICAgdGhpcy5jb250cm9scy51cGRhdGUoKTtcclxuXHJcbiAgICAvLyBPbmUgcGljayBwZXIgZnJhbWUsIGFnYWluc3QgdGhlIHBvaW50ZXIncyBsYXRlc3QgcG9zaXRpb24gLSBzZWUgb25Nb3VzZU1vdmUuXHJcbiAgICBpZiAodGhpcy5wZW5kaW5nUHJldmlld0V2ZW50KSB7XHJcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50O1xyXG4gICAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xyXG4gICAgICB0aGlzLnVwZGF0ZVBsYWNlbWVudFByZXZpZXcoZXZlbnQpO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMuY2FtZXJhKTtcclxuICB9XHJcblxyXG4gIGRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XHJcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0aW9uRnJhbWVJZCk7XHJcbiAgICB9XHJcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcclxuICAgIGlmICh0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyKSB7XHJcbiAgICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xyXG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gICAgdGhpcy5kaXNjYXJkQ3VycmVudExvYWQoKTtcclxuICAgIHRoaXMuY2xlYXJUYWdzKCk7XHJcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xyXG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XHJcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xyXG4gICAgICB0aGlzLnJlbmRlcmVyLmRpc3Bvc2UoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XHJcbiAgICAgIHRoaXMuY29udHJvbHMuZGlzcG9zZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=
|