@smarterplan/ngx-smarterplan-core 1.4.18 → 1.4.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/lib/components/csv-export/csv-export.component.mjs +3 -3
- package/esm2022/lib/components/loader/loader.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/avatar/avatar.component.mjs +1 -1
- package/esm2022/lib/components/menu-bar/menu-bar.component.mjs +3 -3
- package/esm2022/lib/components/menu-bar/navigation-bar/navigation-bar.component.mjs +3 -3
- package/esm2022/lib/components/modal-switch-visit/modal-switch-visit.component.mjs +3 -3
- package/esm2022/lib/components/search-bar/search-bar.component.mjs +3 -3
- package/esm2022/lib/components/support-modal/support-modal.component.mjs +3 -3
- package/esm2022/lib/config.mjs +1 -1
- package/esm2022/lib/helpers.service.mjs +28 -2
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasImage.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/CanvasRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/NestThermostat.mjs +1 -1
- package/esm2022/lib/matterport-extensions/nest-thermostat/PlaneRenderer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/scene-component/SceneComponent.mjs +1 -1
- package/esm2022/lib/matterport-extensions/security-camera/SecurityCamera.mjs +22 -22
- package/esm2022/lib/matterport-extensions/tv-player/TvPlayer.mjs +1 -1
- package/esm2022/lib/matterport-extensions/view-frustum-mesh/ViewFrustumMesh.mjs +22 -22
- package/esm2022/lib/mattertagData.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.module.mjs +1 -1
- package/esm2022/lib/ngx-smarterplan-core.service.mjs +1 -1
- package/esm2022/lib/pipes/duration-to-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/format-date-number-to-digits.pipe.mjs +1 -1
- package/esm2022/lib/pipes/hashtag-from-id.pipe.mjs +1 -1
- package/esm2022/lib/pipes/safe-url.pipe.mjs +1 -1
- package/esm2022/lib/pipes/time-date-to-local-string.pipe.mjs +1 -1
- package/esm2022/lib/pipes/username-from-id.pipe.mjs +1 -1
- package/esm2022/lib/services/amplify-cache.service.mjs +1 -1
- package/esm2022/lib/services/base-tab.service.mjs +1 -1
- package/esm2022/lib/services/baseVisibility.service.mjs +1 -1
- package/esm2022/lib/services/content.service.mjs +1 -1
- package/esm2022/lib/services/filter.service.mjs +8 -3
- package/esm2022/lib/services/intervention.service.mjs +1 -1
- package/esm2022/lib/services/locale.service.mjs +1 -1
- package/esm2022/lib/services/matterport-import.service.mjs +1 -1
- package/esm2022/lib/services/matterport-measurement.service.mjs +1 -1
- package/esm2022/lib/services/matterport-navigation.service.mjs +18 -1
- package/esm2022/lib/services/matterport-object3d.service.mjs +1 -1
- package/esm2022/lib/services/matterport-pointer.service.mjs +6 -6
- package/esm2022/lib/services/matterport-tag-copy.service.mjs +1 -1
- package/esm2022/lib/services/matterport-tag.service.mjs +1 -1
- package/esm2022/lib/services/matterport.service.mjs +21 -17
- package/esm2022/lib/services/models/affectation.service.mjs +1 -1
- package/esm2022/lib/services/models/base-object.service.mjs +10 -9
- package/esm2022/lib/services/models/capture.service.mjs +1 -1
- package/esm2022/lib/services/models/comment.service.mjs +1 -1
- package/esm2022/lib/services/models/domain.service.mjs +1 -1
- package/esm2022/lib/services/models/equipment.service.mjs +27 -2
- package/esm2022/lib/services/models/event.service.mjs +1 -1
- package/esm2022/lib/services/models/feature.service.mjs +14 -1
- package/esm2022/lib/services/models/hashtag.service.mjs +1 -1
- package/esm2022/lib/services/models/layer.service.mjs +1 -1
- package/esm2022/lib/services/models/measurement.service.mjs +17 -1
- package/esm2022/lib/services/models/mission.service.mjs +1 -1
- package/esm2022/lib/services/models/navigation.service.mjs +1 -1
- package/esm2022/lib/services/models/node.service.mjs +1 -1
- package/esm2022/lib/services/models/object3D.service.mjs +1 -1
- package/esm2022/lib/services/models/operation.service.mjs +1 -1
- package/esm2022/lib/services/models/organisation.service.mjs +1 -1
- package/esm2022/lib/services/models/plan.service.mjs +1 -1
- package/esm2022/lib/services/models/poi.service.mjs +27 -27
- package/esm2022/lib/services/models/profile.service.mjs +1 -1
- package/esm2022/lib/services/models/property.service.mjs +1 -1
- package/esm2022/lib/services/models/space.service.mjs +1 -1
- package/esm2022/lib/services/models/template.service.mjs +1 -1
- package/esm2022/lib/services/models/ticket.service.mjs +1 -1
- package/esm2022/lib/services/models/visit.service.mjs +1 -1
- package/esm2022/lib/services/models/zone.service.mjs +1 -1
- package/esm2022/lib/services/navigator.service.mjs +1 -1
- package/esm2022/lib/services/s3.service.mjs +1 -1
- package/esm2022/lib/services/search.service.mjs +1 -1
- package/esm2022/lib/services/support.service.mjs +1 -1
- package/esm2022/lib/services/sweep-locator.service.mjs +114 -0
- package/esm2022/lib/services/tag.service.mjs +16 -16
- package/esm2022/lib/services/threejs-import.service.mjs +1 -1
- package/esm2022/lib/services/threejs.service.mjs +840 -35
- package/esm2022/lib/services/user.service.mjs +1 -1
- package/esm2022/lib/services/utils/matterport-transform.util.mjs +1 -1
- package/esm2022/lib/services/validators.service.mjs +1 -1
- package/esm2022/lib/services/viewer.service.mjs +193 -10
- package/esm2022/lib/services/zone-drawer.service.mjs +1 -1
- package/esm2022/lib/services/zoneChange.service.mjs +1 -1
- package/esm2022/lib/tokens/matterport-sdk-key.token.mjs +1 -1
- package/esm2022/lib/types.service.mjs +1 -1
- package/esm2022/lib/validators/email.directive.mjs +1 -1
- package/esm2022/lib/validators/no-empty.directive.mjs +1 -1
- package/esm2022/lib/validators/number.directive.mjs +1 -1
- package/esm2022/lib/validators/text.directive.mjs +1 -1
- package/esm2022/public-api.mjs +2 -1
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs +1785 -583
- package/fesm2022/smarterplan-ngx-smarterplan-core.mjs.map +1 -1
- package/lib/helpers.service.d.ts +17 -0
- package/lib/services/matterport-navigation.service.d.ts +9 -0
- 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/viewer.service.d.ts +87 -2
- package/package.json +1 -1
- package/public-api.d.ts +1 -0
- package/src/assets/vs-app.json +67 -67
|
@@ -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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SyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQztJQUNILENBQUM7d0dBNStFVSxjQUFjOzRHQUFkLGNBQWMsY0FGYixNQUFNOzs0RkFFUCxjQUFjO2tCQUgxQixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgVEhSRUUgZnJvbSAndGhyZWUnO1xuaW1wb3J0IHsgT3JiaXRDb250cm9scyB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9jb250cm9scy9PcmJpdENvbnRyb2xzJztcbmltcG9ydCB7IE9CSkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL09CSkxvYWRlcic7XG5pbXBvcnQgeyBNVExMb2FkZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbG9hZGVycy9NVExMb2FkZXInO1xuaW1wb3J0IHsgR0xURkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0dMVEZMb2FkZXInO1xuaW1wb3J0IHsgS1RYMkxvYWRlciB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9sb2FkZXJzL0tUWDJMb2FkZXInO1xuaW1wb3J0IHsgTWVzaG9wdERlY29kZXIgfSBmcm9tICd0aHJlZS9leGFtcGxlcy9qc20vbGlicy9tZXNob3B0X2RlY29kZXIubW9kdWxlLmpzJztcbmltcG9ydCB7IExpbmUyIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmUyJztcbmltcG9ydCB7IExpbmVHZW9tZXRyeSB9IGZyb20gJ3RocmVlL2V4YW1wbGVzL2pzbS9saW5lcy9MaW5lR2VvbWV0cnknO1xuaW1wb3J0IHsgTGluZU1hdGVyaWFsIH0gZnJvbSAndGhyZWUvZXhhbXBsZXMvanNtL2xpbmVzL0xpbmVNYXRlcmlhbCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUaHJlZUpzQWxpZ25tZW50LCBUaHJlZUpzTW9kZWxVcCB9IGZyb20gJy4uL2hlbHBlcnMuc2VydmljZSc7XG5pbXBvcnQgeyBQb2lUeXBlIH0gZnJvbSAnLi4vdHlwZXMuc2VydmljZSc7XG5cbi8qKlxuICogQSB0YWcgdG8gZHJhdyBpbiB0aGUgVGhyZWUuanMgc2NlbmUsIG1pcnJvcmluZyBhIE1hdHRlcnRhZy5cbiAqXG4gKiBQb3NpdGlvbnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlIC0gdGhlIHNhbWUgbnVtYmVycyBzdG9yZWQgaW4gUE9JLmNvb3JkaW5hdGUgLVxuICogbm90IHNjZW5lIHNwYWNlLiBUaGUgc2VydmljZSByZXBhcmVudHMgdGFncyB1bmRlciB0aGUgbW9kZWwgc28gdGhleSBpbmhlcml0IHRoZSBjZW50ZXJpbmcgYW5kXG4gKiBzY2FsaW5nIGFwcGxpZWQgYXQgbG9hZCwgd2hpY2ggbWVhbnMgY2FsbGVycyBuZXZlciBkZWFsIHdpdGggdGhhdCB0cmFuc2Zvcm0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc1RhZyB7XG4gIC8qKiBUaGUgdGFnZ2VkIGVsZW1lbnQncyBpZCAoUE9JLmVsZW1lbnRJRCksIHVzZWQgdG8gdXBkYXRlIG9yIHJlbW92ZSB0aGUgdGFnIGxhdGVyLiAqL1xuICBpZDogc3RyaW5nO1xuICBwb3NpdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIC8qKiBEcml2ZXMgYm90aCB0aGUgY2xpY2sgcm91dGUgYW5kIHR5cGUgZmlsdGVyaW5nLCBzbyBpdCB0cmF2ZWxzIHdpdGggdGhlIHRhZy4gKi9cbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xuICAvKiogU2hvd24gb24gaG92ZXIuIEEgbWFya2VyIHdpdGggbm8gaWRlbnRpdHkgaXMganVzdCBhIGRvdCBvbiBhIHdhbGwuICovXG4gIGxhYmVsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRoZSBUaHJlZS5qcyBjYXB0dXJlIHRoaXMgdGFnIHdhcyBwbGFjZWQgaW4sIHdoZW4gaXQgd2FzIHBsYWNlZCBpbiBvbmUuICovXG4gIG9yaWdpbkNhcHR1cmVJRD86IHN0cmluZyB8IG51bGw7XG4gIC8qKlxuICAgKiAnbW9kZWwnIHdoZW4gdGhlIHBvc2l0aW9uIGlzIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlcyByYXRoZXIgdGhhbiB0aGUgc3BhY2UgdGFncyBzaGFyZTpcbiAgICogYSB0YWcgcGxhY2VkIGluIGEgbW9kZWwgYmVmb3JlIGl0IHdhcyBjYWxpYnJhdGVkLiBPbmx5IG1lYW5pbmdmdWwgaW4gdGhlIG1vZGVsIGl0IHdhcyBwbGFjZWQgaW4uXG4gICAqL1xuICBmcmFtZT86ICdtb2RlbCcgfCBudWxsO1xuICAvKiogSWNvbiBkcmF3biBvbiB0aGUgdGFnLiBGYWxscyBiYWNrIHRvIGEgcGxhaW4gZGlzYyB3aGVuIGFic2VudCBvciBpdCBmYWlscyB0byBsb2FkLiAqL1xuICBpY29uVXJsPzogc3RyaW5nIHwgbnVsbDtcbiAgLyoqIFRpbnQgZm9yIHRoZSBmYWxsYmFjayBkaXNjLCBhcyBhIENTUyBjb2xvdXIuICovXG4gIGNvbG9yPzogc3RyaW5nO1xufVxuXG4vKiogV2hhdCBhIGNsaWNrIG9uIGEgdGFnIHJlcG9ydHM6IGVub3VnaCB0byByb3V0ZSB0byB0aGUgZWxlbWVudCdzIGRldGFpbCBwYWdlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnQ2xpY2sge1xuICBlbGVtZW50SWQ6IHN0cmluZztcbiAgcG9pVHlwZTogUG9pVHlwZSB8IG51bGw7XG59XG5cbi8qKlxuICogQSBzcG90IHBpY2tlZCBvbiB0aGUgbW9kZWwgZm9yIGEgbmV3IHRhZy5cbiAqXG4gKiBCb3RoIHZlY3RvcnMgYXJlIGluIHRoZSBtb2RlbCdzIG93biBjb29yZGluYXRlIHNwYWNlLCB3aGljaCBpcyB3aGF0IFBPSS5jb29yZGluYXRlIHN0b3Jlcy4gU2NlbmVcbiAqIGNvb3JkaW5hdGVzIGRlbGliZXJhdGVseSBuZXZlciBsZWF2ZSB0aGlzIHNlcnZpY2U6IHRoZSBtb2RlbCBpcyBzY2FsZWQgdG8gYSBmaXhlZCBzaXplIG9uIGxvYWQsIHNvXG4gKiBhIHNjZW5lLXNwYWNlIHBvc2l0aW9uIHdvdWxkIHNpbGVudGx5IG1lYW4gc29tZXdoZXJlIGVsc2UgdGhlIG1vbWVudCB0aGUgLmdsYiBpcyByZS1leHBvcnRlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaHJlZUpzVGFnUGxhY2VtZW50IHtcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogU3VyZmFjZSBub3JtYWwgYXQgdGhlIHBpY2tlZCBwb2ludCAtIE1hdHRlcnBvcnQgc3RvcmVzIHRoZSBzYW1lIHRoaW5nIGluIFBPSS5tZXRhZGF0YS4gKi9cbiAgbm9ybWFsOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbiAgLyoqIFdoYXQgdGhlIHBsYWNlbWVudCB3YXMgYXJtZWQgZm9yLCBzbyB0aGUgY2FsbGVyIGtub3dzIHdoaWNoIGNyZWF0aW9uIGZvcm0gdG8gb3Blbi4gKi9cbiAgcG9pVHlwZT86IFBvaVR5cGUgfCBudWxsO1xufVxuXG4vKiogT25lIHRhZyBzZWVuIGluIGJvdGggc3BhY2VzOiB3aGVyZSBpdCBpcyBzdG9yZWQsIGFuZCB3aGVyZSBpdCByZWFsbHkgc2l0cyBvbiB0aGUgbW9kZWwuICovXG4vKiogQSBkaXN0YW5jZSBtZWFzdXJlZCBvbiB0aGUgbW9kZWw6IGl0cyBwb2ludHMsIGVhY2ggc2VnbWVudCdzIGxlbmd0aCwgYW5kIGEgcGljdHVyZSBvZiBpdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc01lYXN1cmVtZW50IHtcbiAgLyoqIEluIHRoZSBmcmFtZSB0YWcgY29vcmRpbmF0ZXMgYXJlIHN0b3JlZCBpbiwgc28gdGhlIGxhc3Qgb25lIGNhbiBiZSBzYXZlZCBhcyB0aGUgUE9JLiAqL1xuICBwb2ludHM6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9W107XG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMsIHJvdW5kZWQgbGlrZSBNYXR0ZXJwb3J0J3MgbWVhc3VyZW1lbnRzIGFyZS4gKi9cbiAgZGlzdGFuY2VzOiBudW1iZXJbXTtcbiAgLyoqIEpQRUcgZGF0YSBVUkkgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IGRyYXduIG9uIGl0LiAqL1xuICBzY3JlZW5zaG90OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSB0YWcgcGxhY2VkIGluIHRoaXMgbW9kZWwgd2hvc2Ugc3RvcmVkIGNvb3JkaW5hdGVzIGhhZCB0byBjaGFuZ2UgZm9yIGl0IHRvIHN0YXkgd2hlcmUgaXQgaXMsXG4gKiBiZWNhdXNlIHRoZSBjYWxpYnJhdGlvbiBpdCBpcyBkcmF3biB1bmRlciBjaGFuZ2VkLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRocmVlSnNSZWJhc2VkVGFnIHtcbiAgaWQ6IHN0cmluZztcbiAgLyoqIEl0cyBjb29yZGluYXRlcyBpbiB0aGUgc3BhY2UgdGFncyBzaGFyZSwgdW5kZXIgdGhlIG5ldyBjYWxpYnJhdGlvbi4gKi9cbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICAvKiogVHVybnMgYSBkaXJlY3Rpb24gc3RvcmVkIHdpdGggdGhlIHRhZyAtIGl0cyBzdXJmYWNlIG5vcm1hbCAtIHRoZSBzYW1lIHdheS4gKi9cbiAgcm90YXRlRGlyZWN0aW9uOiAoZGlyZWN0aW9uOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfSkgPT4geyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGhyZWVKc0FsaWdubWVudFBhaXIge1xuICAvKiogVGhlIHRhZyB0aGUgcGFpciB3YXMgbWFkZSBmcm9tLCB3aGVuIGl0IGNhbWUgZnJvbSBvbmUuICovXG4gIHRhZ0lkPzogc3RyaW5nO1xuICBzb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICB0YXJnZXQ6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhbiBvcnRob25vcm1hbCBmcmFtZSBmcm9tIHRocmVlIHBvaW50cywgb3IgbnVsbCB3aGVuIHRoZXkgYXJlIChuZWFybHkpIGNvbGxpbmVhci5cbiAqXG4gKiBUaHJlZSBwb2ludHMgZGVmaW5lIGEgcGxhbmUsIGFuZCBhIHBsYW5lIHBsdXMgYW4gb3JpZ2luIGRlZmluZXMgYW4gb3JpZW50YXRpb24uIENvbGxpbmVhciBwb2ludHNcbiAqIGRvIG5vdDogdGhleSBsZWF2ZSB0aGUgcm90YXRpb24gYWJvdXQgdGhlaXIgY29tbW9uIGxpbmUgdW5kZXRlcm1pbmVkLCB3aGljaCBpcyB3aHkgdGhlIGNhbGxlciBoYXNcbiAqIHRvIHJlamVjdCB0aGVtIHJhdGhlciB0aGFuIHByb2R1Y2UgYSBjb25maWRlbnQgd3JvbmcgYW5zd2VyLlxuICovXG5mdW5jdGlvbiBmcmFtZUZyb21Qb2ludHMoYTogVEhSRUUuVmVjdG9yMywgYjogVEhSRUUuVmVjdG9yMywgYzogVEhSRUUuVmVjdG9yMyk6IFRIUkVFLk1hdHJpeDQgfCBudWxsIHtcbiAgY29uc3QgZTEgPSBiLmNsb25lKCkuc3ViKGEpO1xuICBpZiAoZTEubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTEubm9ybWFsaXplKCk7XG5cbiAgY29uc3QgdG9DID0gYy5jbG9uZSgpLnN1YihhKTtcbiAgY29uc3QgZTIgPSB0b0MuY2xvbmUoKS5zdWIoZTEuY2xvbmUoKS5tdWx0aXBseVNjYWxhcih0b0MuZG90KGUxKSkpO1xuICBpZiAoZTIubGVuZ3RoU3EoKSA8IDFlLTEyKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgZTIubm9ybWFsaXplKCk7XG5cbiAgcmV0dXJuIG5ldyBUSFJFRS5NYXRyaXg0KCkubWFrZUJhc2lzKGUxLCBlMiwgZTEuY2xvbmUoKS5jcm9zcyhlMikpO1xufVxuXG4vKipcbiAqIFNvbHZlcyB0aGUgdHJhbnNmb3JtIHRoYXQgbWFwcyBzdG9yZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhlIGxvYWRlZCBtb2RlbCwgZnJvbSBhcyBtYW55IG1hdGNoZWRcbiAqIHRhZ3MgYXMgdGhlcmUgYXJlIC0gdXAgdG8gdGhyZWUuXG4gKlxuICogVGhyZWUgcGFpcnMgcGluIGRvd24gZXZlcnl0aGluZzogcG9zaXRpb24sIG9yaWVudGF0aW9uIGFuZCBzY2FsZS4gQSBtb2RlbCB0aGF0IHNoYXJlcyBvbmx5IGFcbiAqIGNvcm5lciB3aXRoIHRoZSB0YWdzJyBzcGFjZSBtYXkgbm90IGhhdmUgdGhyZWUgdGFncyB0byBvZmZlciwgc28gZmV3ZXIgYXJlIGFjY2VwdGVkLCBlYWNoXG4gKiBzZXR0bGluZyB3aGF0IGl0IGNhbiBhbmQgYXNzdW1pbmcgdGhlIHJlc3Q6XG4gKlxuICogIC0gVHdvIHBhaXJzOiBwb3NpdGlvbiwgaGVhZGluZyBhbmQgc2NhbGUuIFRoZSBvbmUgdGhpbmcgdHdvIHBvaW50cyBjYW5ub3Qgc2F5IGlzIGhvdyB0aGUgbW9kZWxcbiAqICAgIGlzIHRpbHRlZCwgc28gYm90aCBzcGFjZXMgYXJlIHRha2VuIHRvIGFncmVlIG9uIHdoaWNoIHdheSBpcyB1cC5cbiAqICAtIE9uZSBwYWlyOiBwb3NpdGlvbiBvbmx5LiBIZWFkaW5nIGFuZCBzY2FsZSBhcmUgdGFrZW4gdG8gbWF0Y2ggYWxyZWFkeS5cbiAqXG4gKiBgdGFyZ2V0VXBgIGlzIHRoZSBtb2RlbCdzIHZlcnRpY2FsIGF4aXMsIHdoaWNoIHRoZSB0YWdzJyBvd24gdmVydGljYWwgKCtZKSBpcyBtYXRjaGVkIHRvIGluIHRob3NlXG4gKiB0d28gY2FzZXMuIFJldHVybnMgbnVsbCB3aGVuIHRoZSBwb2ludHMgY2Fubm90IGFuc3dlciB0aGUgcXVlc3Rpb24gYXNrZWQgb2YgdGhlbSAtIGNvbGxpbmVhciBmb3JcbiAqIHRocmVlLCBvbmUgYWJvdmUgdGhlIG90aGVyIGZvciB0d28gLSBiZWNhdXNlIGEgd3JvbmcgY2FsaWJyYXRpb24gYXBwbGllZCBzaWxlbnRseSBpcyB3b3JzZSB0aGFuXG4gKiBub25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc29sdmVUaHJlZUpzQWxpZ25tZW50KFxuICBwYWlyczogVGhyZWVKc0FsaWdubWVudFBhaXJbXSxcbiAgdGFyZ2V0VXA6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9ID0geyB4OiAwLCB5OiAxLCB6OiAwIH0sXG4pOiBUaHJlZUpzQWxpZ25tZW50IHwgbnVsbCB7XG4gIGlmICghcGFpcnMgfHwgcGFpcnMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHBhaXJzLmxlbmd0aCA8IDMpIHtcbiAgICByZXR1cm4gc29sdmVSZWR1Y2VkQWxpZ25tZW50KHBhaXJzLCBuZXcgVEhSRUUuVmVjdG9yMyh0YXJnZXRVcC54LCB0YXJnZXRVcC55LCB0YXJnZXRVcC56KS5ub3JtYWxpemUoKSk7XG4gIH1cblxuICBjb25zdCBzb3VyY2VzID0gcGFpcnMuc2xpY2UoMCwgMykubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5zbGljZSgwLCAzKS5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcblxuICBjb25zdCBzb3VyY2VGcmFtZSA9IGZyYW1lRnJvbVBvaW50cyhzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBzb3VyY2VzWzJdKTtcbiAgY29uc3QgdGFyZ2V0RnJhbWUgPSBmcmFtZUZyb21Qb2ludHModGFyZ2V0c1swXSwgdGFyZ2V0c1sxXSwgdGFyZ2V0c1syXSk7XG4gIGlmICghc291cmNlRnJhbWUgfHwgIXRhcmdldEZyYW1lKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBIHJvdGF0aW9uJ3MgaW52ZXJzZSBpcyBpdHMgdHJhbnNwb3NlLCBzbyB0aGlzIGlzIHRoZSByb3RhdGlvbiBjYXJyeWluZyBvbmUgZnJhbWUgb250byB0aGUgb3RoZXIuXG4gIGNvbnN0IHJvdGF0aW9uID0gdGFyZ2V0RnJhbWUubXVsdGlwbHkoc291cmNlRnJhbWUuY2xvbmUoKS50cmFuc3Bvc2UoKSk7XG5cbiAgLy8gU2NhbGUgZnJvbSBob3cgZmFyIGFwYXJ0IHRoZSBwb2ludHMgYXJlIGluIGVhY2ggc3BhY2UsIGF2ZXJhZ2VkIG92ZXIgdGhlIHRocmVlIGVkZ2VzIHNvIGEgc2luZ2xlXG4gIC8vIHNsb3BweSBjbGljayBkb2VzIG5vdCBzZXQgaXQgb24gaXRzIG93bi5cbiAgY29uc3QgZWRnZXMgPSBbWzAsIDFdLCBbMSwgMl0sIFswLCAyXV07XG4gIGxldCByYXRpb1N1bSA9IDA7XG4gIGxldCByYXRpb0NvdW50ID0gMDtcbiAgZm9yIChjb25zdCBbaSwgal0gb2YgZWRnZXMpIHtcbiAgICBjb25zdCBzb3VyY2VMZW5ndGggPSBzb3VyY2VzW2ldLmRpc3RhbmNlVG8oc291cmNlc1tqXSk7XG4gICAgY29uc3QgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0c1tpXS5kaXN0YW5jZVRvKHRhcmdldHNbal0pO1xuICAgIGlmIChzb3VyY2VMZW5ndGggPiAxZS05KSB7XG4gICAgICByYXRpb1N1bSArPSB0YXJnZXRMZW5ndGggLyBzb3VyY2VMZW5ndGg7XG4gICAgICByYXRpb0NvdW50ICs9IDE7XG4gICAgfVxuICB9XG4gIGlmIChyYXRpb0NvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3Qgc2NhbGUgPSByYXRpb1N1bSAvIHJhdGlvQ291bnQ7XG5cbiAgLy8gVGhlIGdyb3VwIGFwcGxpZXMgcG9zaXRpb24sIHRoZW4gcm90YXRpb24sIHRoZW4gc2NhbGUsIHNvIGEgcG9pbnQgbGFuZHMgYXQgdCArIHMqUipwLiBTb2x2aW5nXG4gIC8vIHRoYXQgZm9yIHQgYXQgdGhlIGNlbnRyb2lkcyBnaXZlcyB0aGUgdHJhbnNsYXRpb24uXG4gIGNvbnN0IHNvdXJjZUNlbnRyb2lkID0gc291cmNlcy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIDMpO1xuICBjb25zdCB0YXJnZXRDZW50cm9pZCA9IHRhcmdldHMucmVkdWNlKChzdW0sIHYpID0+IHN1bS5hZGQodiksIG5ldyBUSFJFRS5WZWN0b3IzKCkpLm11bHRpcGx5U2NhbGFyKDEgLyAzKTtcbiAgY29uc3QgdHJhbnNsYXRpb24gPSB0YXJnZXRDZW50cm9pZFxuICAgIC5jbG9uZSgpXG4gICAgLnN1Yihzb3VyY2VDZW50cm9pZC5jbG9uZSgpLmFwcGx5TWF0cml4NChyb3RhdGlvbikubXVsdGlwbHlTY2FsYXIoc2NhbGUpKTtcblxuICBjb25zdCBldWxlciA9IG5ldyBUSFJFRS5FdWxlcigpLnNldEZyb21Sb3RhdGlvbk1hdHJpeChyb3RhdGlvbik7XG5cbiAgcmV0dXJuIHtcbiAgICB0cmFuc2xhdGlvbjogeyB4OiB0cmFuc2xhdGlvbi54LCB5OiB0cmFuc2xhdGlvbi55LCB6OiB0cmFuc2xhdGlvbi56IH0sXG4gICAgcm90YXRpb246IHsgeDogZXVsZXIueCwgeTogZXVsZXIueSwgejogZXVsZXIueiB9LFxuICAgIHNjYWxlLFxuICB9O1xufVxuXG4vKiogVGhlIG9uZS0gYW5kIHR3by1wYWlyIGNhc2VzIG9mIHNvbHZlVGhyZWVKc0FsaWdubWVudCwgd2hpY2ggc2hhcmUgdGhlIFwic2FtZSB2ZXJ0aWNhbFwiIGFzc3VtcHRpb24uICovXG5mdW5jdGlvbiBzb2x2ZVJlZHVjZWRBbGlnbm1lbnQocGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10sIHVwOiBUSFJFRS5WZWN0b3IzKTogVGhyZWVKc0FsaWdubWVudCB8IG51bGwge1xuICBjb25zdCBzb3VyY2VzID0gcGFpcnMubWFwKChwYWlyKSA9PiBuZXcgVEhSRUUuVmVjdG9yMyhwYWlyLnNvdXJjZS54LCBwYWlyLnNvdXJjZS55LCBwYWlyLnNvdXJjZS56KSk7XG4gIGNvbnN0IHRhcmdldHMgPSBwYWlycy5tYXAoKHBhaXIpID0+IG5ldyBUSFJFRS5WZWN0b3IzKHBhaXIudGFyZ2V0LngsIHBhaXIudGFyZ2V0LnksIHBhaXIudGFyZ2V0LnopKTtcblxuICAvLyBTdGFydHMgZnJvbSB0aGUgcm90YXRpb24gdGhhdCBvbmx5IHN0YW5kcyB0aGUgdGFncycgdmVydGljYWwgb24gdGhlIG1vZGVsJ3MuXG4gIGNvbnN0IHJvdGF0aW9uID0gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMobmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCksIHVwKTtcbiAgbGV0IHNjYWxlID0gMTtcblxuICBpZiAocGFpcnMubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3Qgc291cmNlU3BhbiA9IHNvdXJjZXNbMV0uY2xvbmUoKS5zdWIoc291cmNlc1swXSk7XG4gICAgY29uc3QgdGFyZ2V0U3BhbiA9IHRhcmdldHNbMV0uY2xvbmUoKS5zdWIodGFyZ2V0c1swXSk7XG4gICAgaWYgKHNvdXJjZVNwYW4ubGVuZ3RoKCkgPCAxZS05IHx8IHRhcmdldFNwYW4ubGVuZ3RoKCkgPCAxZS05KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgc2NhbGUgPSB0YXJnZXRTcGFuLmxlbmd0aCgpIC8gc291cmNlU3Bhbi5sZW5ndGgoKTtcblxuICAgIC8vIEhlYWRpbmcgaXMgdGhlIHR1cm4gYWJvdXQgdGhlIHZlcnRpY2FsIHRoYXQgbGluZXMgdGhlIHR3byBzcGFucyB1cCwgc28gb25seSB0aGVpciBob3Jpem9udGFsXG4gICAgLy8gcGFydHMgY291bnQuIFR3byBwb2ludHMgb25lIGFib3ZlIHRoZSBvdGhlciBoYXZlIG5vbmUsIGFuZCBzYXkgbm90aGluZyBhYm91dCBoZWFkaW5nLlxuICAgIGNvbnN0IGZsYXR0ZW4gPSAodjogVEhSRUUuVmVjdG9yMykgPT4gdi5jbG9uZSgpLnN1Yih1cC5jbG9uZSgpLm11bHRpcGx5U2NhbGFyKHYuZG90KHVwKSkpO1xuICAgIGNvbnN0IGZyb20gPSBmbGF0dGVuKHNvdXJjZVNwYW4uY2xvbmUoKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pKTtcbiAgICBjb25zdCB0byA9IGZsYXR0ZW4odGFyZ2V0U3Bhbik7XG4gICAgaWYgKGZyb20ubGVuZ3RoKCkgPCAxZS02ICogc291cmNlU3Bhbi5sZW5ndGgoKSB8fCB0by5sZW5ndGgoKSA8IDFlLTYgKiB0YXJnZXRTcGFuLmxlbmd0aCgpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgaGVhZGluZyA9IE1hdGguYXRhbjIobmV3IFRIUkVFLlZlY3RvcjMoKS5jcm9zc1ZlY3RvcnMoZnJvbSwgdG8pLmRvdCh1cCksIGZyb20uZG90KHRvKSk7XG4gICAgcm90YXRpb24ucHJlbXVsdGlwbHkobmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tQXhpc0FuZ2xlKHVwLCBoZWFkaW5nKSk7XG4gIH1cblxuICAvLyBBIHBvaW50IGxhbmRzIGF0IHQgKyBzKlIqcDsgc29sdmVkIGZvciB0IGF0IHRoZSBjZW50cm9pZHMsIGFzIGluIHRoZSB0aHJlZS1wYWlyIGNhc2UuXG4gIGNvbnN0IGNlbnRyb2lkID0gKHBvaW50czogVEhSRUUuVmVjdG9yM1tdKSA9PlxuICAgIHBvaW50cy5yZWR1Y2UoKHN1bSwgdikgPT4gc3VtLmFkZCh2KSwgbmV3IFRIUkVFLlZlY3RvcjMoKSkubXVsdGlwbHlTY2FsYXIoMSAvIHBvaW50cy5sZW5ndGgpO1xuICBjb25zdCB0cmFuc2xhdGlvbiA9IGNlbnRyb2lkKHRhcmdldHMpLnN1YihjZW50cm9pZChzb3VyY2VzKS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pLm11bHRpcGx5U2NhbGFyKHNjYWxlKSk7XG4gIGNvbnN0IGV1bGVyID0gbmV3IFRIUkVFLkV1bGVyKCkuc2V0RnJvbVF1YXRlcm5pb24ocm90YXRpb24pO1xuXG4gIHJldHVybiB7XG4gICAgdHJhbnNsYXRpb246IHsgeDogdHJhbnNsYXRpb24ueCwgeTogdHJhbnNsYXRpb24ueSwgejogdHJhbnNsYXRpb24ueiB9LFxuICAgIHJvdGF0aW9uOiB7IHg6IGV1bGVyLngsIHk6IGV1bGVyLnksIHo6IGV1bGVyLnogfSxcbiAgICBzY2FsZSxcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBPYmpBZGRlZCB7XG4gIGlkOiBzdHJpbmc7XG4gIG5hbWU6IHN0cmluZztcbiAgZmlsZTogc3RyaW5nOyAvLyBUaGUgVVJMIHRvIHRoZSAub2JqIGZpbGVcbiAgcG9zaXRpb246IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9O1xuICByb3RhdGlvbjogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH07XG4gIHNjYWxlOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyOyB6OiBudW1iZXIgfTtcbn1cblxuaW50ZXJmYWNlIFBhcnNlZE1lc2hHcm91cCB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIGNvdW50OiBudW1iZXI7XG4gIG1hdGVyaWFsSW5kZXg6IG51bWJlcjtcbn1cblxuLyoqIFJhdyBnZW9tZXRyeSBkYXRhIGV4dHJhY3RlZCBmcm9tIGEgcGFyc2VkIE9CSiBtZXNoLCBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG5pbnRlcmZhY2UgUGFyc2VkTWVzaERhdGEge1xuICBuYW1lOiBzdHJpbmc7XG4gIC8vIE9uZSBuYW1lIHBlciBtYXRlcmlhbCB1c2VkIGJ5IHRoaXMgbWVzaC4gQSBzaW5nbGUtbWF0ZXJpYWwgbWVzaCBoYXMgb25lIGVudHJ5O1xuICAvLyBhIG1lc2ggd2l0aCBtdWx0aXBsZSB1c2VtdGwgc3dpdGNoZXMgKGdlb21ldHJ5Lmdyb3VwcykgaGFzIG9uZSBwZXIgZ3JvdXAuXG4gIG1hdGVyaWFsTmFtZXM6IHN0cmluZ1tdO1xuICBncm91cHM6IFBhcnNlZE1lc2hHcm91cFtdIHwgbnVsbDtcbiAgcG9zaXRpb246IEZsb2F0MzJBcnJheTtcbiAgbm9ybWFsOiBGbG9hdDMyQXJyYXkgfCBudWxsO1xuICB1djogRmxvYXQzMkFycmF5IHwgbnVsbDtcbiAgaW5kZXg6IFVpbnQzMkFycmF5IHwgbnVsbDtcbiAgYm91bmRpbmdCb3g/OiB7IG1pbjogW251bWJlciwgbnVtYmVyLCBudW1iZXJdOyBtYXg6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB9O1xufVxuXG5pbnRlcmZhY2UgT2JqUGFyc2VyV29ya2VyUmVzcG9uc2Uge1xuICByZXF1ZXN0SWQ6IHN0cmluZztcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgbWVzaGVzPzogUGFyc2VkTWVzaERhdGFbXTtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFRocmVlSnNTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBzY2VuZSE6IFRIUkVFLlNjZW5lO1xuICBwcml2YXRlIGNhbWVyYSE6IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhO1xuICBwcml2YXRlIHJlbmRlcmVyITogVEhSRUUuV2ViR0xSZW5kZXJlcjtcbiAgcHJpdmF0ZSBjb250cm9scyE6IE9yYml0Q29udHJvbHM7XG4gIHByaXZhdGUgYW5pbWF0aW9uRnJhbWVJZCE6IG51bWJlcjtcblxuICAvLyBSYXljYXN0aW5nIGFuZCBpbnRlcmFjdGlvblxuICBwcml2YXRlIHJheWNhc3RlciA9IG5ldyBUSFJFRS5SYXljYXN0ZXIoKTtcbiAgcHJpdmF0ZSBtb3VzZSA9IG5ldyBUSFJFRS5WZWN0b3IyKCk7XG4gIHByaXZhdGUgaXNEcmFnZ2luZ0NhbWVyYTogYm9vbGVhbiA9IGZhbHNlO1xuICBwcml2YXRlIGlzRHJhZ2dpbmdUaW1lcjogYW55O1xuICBwcml2YXRlIGNsaWNrYWJsZU9iamVjdHM6IFRIUkVFLk9iamVjdDNEW10gPSBbXTtcblxuICAvLyBPYnNlcnZhYmxlcyBmb3IgdGhlIHZpZXdlciBjb21wb25lbnRcbiAgcHVibGljIG9iamVjdEhvdmVyZWQkID0gbmV3IFN1YmplY3Q8eyBpZDogc3RyaW5nOyBldmVudDogTW91c2VFdmVudCB9IHwgbnVsbD4oKTtcbiAgcHVibGljIG9iamVjdENsaWNrZWQkID0gbmV3IFN1YmplY3Q8c3RyaW5nIHwgbnVsbD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiB0aGUgdXNlciBjbGlja3MgYSB0YWcsIG1pcnJvcmluZyBNYXR0ZXJwb3J0J3MgdGFnIGNsaWNrLiAqL1xuICBwdWJsaWMgdGFnQ2xpY2tlZCQgPSBuZXcgU3ViamVjdDxUaHJlZUpzVGFnQ2xpY2s+KCk7XG5cbiAgLyoqIEVtaXRzIGEgdGFnJ3MgbGFiZWwgd2hpbGUgdGhlIHBvaW50ZXIgaXMgb3ZlciBpdCwgYW5kIG51bGwgd2hlbiBpdCBsZWF2ZXMuICovXG4gIHB1YmxpYyB0YWdIb3ZlcmVkJCA9IG5ldyBTdWJqZWN0PHsgbGFiZWw6IHN0cmluZzsgZXZlbnQ6IE1vdXNlRXZlbnQgfSB8IG51bGw+KCk7XG5cbiAgLy8gVGFncyBsaXZlIHVuZGVyIHRoZSBtb2RlbCByYXRoZXIgdGhhbiB0aGUgc2NlbmUsIHNvIHRoZSBjZW50ZXJpbmcgYW5kIHNjYWxpbmcgYXBwbGllZCB3aGVuIHRoZVxuICAvLyBtb2RlbCBpcyBwbGFjZWQgY2FycmllcyBvdmVyIGFuZCBQT0kgY29vcmRpbmF0ZXMgY2FuIHN0YXkgaW4gdGhlIG1vZGVsJ3Mgb3duIHNwYWNlLlxuICBwcml2YXRlIHRhZ0dyb3VwID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gIHByaXZhdGUgdGFnU3ByaXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBUSFJFRS5TcHJpdGU+KCk7XG5cbiAgcHJpdmF0ZSBjYW52YXNSZXNpemVPYnNlcnZlcj86IFJlc2l6ZU9ic2VydmVyO1xuXG4gIC8qKiBBYm9ydHMgdGhlIGluLWZsaWdodCBtb2RlbCBkb3dubG9hZC4gUGFyc2luZyBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIG9ubHkgbm90IHN0YXJ0ZWQuICovXG4gIHByaXZhdGUgbG9hZEFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlcjtcblxuICAvLyBUaGUgbG9hZGVkIGJhc2UgbW9kZWwsIGtlcHQgc28gdGFnIHBsYWNlbWVudCBjYW4gcmF5Y2FzdCBhZ2FpbnN0IGl0cyBnZW9tZXRyeS5cbiAgcHJpdmF0ZSBtb2RlbFJvb3Q/OiBUSFJFRS5PYmplY3QzRDtcblxuICAvKiogVHJ1ZSB3aGlsZSB0aGUgbmV4dCBjbGljayBvbiB0aGUgbW9kZWwgcGxhY2VzIGEgdGFnIGluc3RlYWQgb2Ygb3JiaXRpbmcuICovXG4gIHByaXZhdGUgcGxhY2luZ1RhZyA9IGZhbHNlO1xuXG4gIC8qKiBXaGF0IHRoZSBhcm1lZCBwbGFjZW1lbnQgaXMgZm9yLCBlY2hvZWQgYmFjayB3aGVuIHRoZSBzcG90IGlzIHBpY2tlZC4gKi9cbiAgcHJpdmF0ZSBwbGFjZW1lbnRQb2lUeXBlOiBQb2lUeXBlIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvc2l0aW9uIGFuZCBub3JtYWwgb2YgdGhlIGxhc3QgcGxhY2VkIHRhZywgaW4gbW9kZWwgc3BhY2UsIGF3YWl0aW5nIGNvbW1pdCB0byBhIFBPSS4gKi9cbiAgcHJpdmF0ZSBwZW5kaW5nVGFnUGxhY2VtZW50OiBUaHJlZUpzVGFnUGxhY2VtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFBvaW50ZXIgcG9zaXRpb24gd2FpdGluZyBmb3IgYSBwcmV2aWV3IHBpY2ssIGNvYWxlc2NlZCB0byBvbmUgcGVyIGZyYW1lLiAqL1xuICBwcml2YXRlIHBlbmRpbmdQcmV2aWV3RXZlbnQ6IE1vdXNlRXZlbnQgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogVGFncyB3aG9zZSBwb3NpdGlvbiBpcyBpbiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLiBBIHNpYmxpbmcgb2YgdGhlIHRhZyBncm91cCB0aGF0IGRvZXMgbm90XG4gICAqIGNhcnJ5IHRoZSBjYWxpYnJhdGlvbjogY2FsaWJyYXRpbmcgYSBtb2RlbCBmb3IgdGhlIHRhZ3MgaXQgaW1wb3J0cyBtdXN0IG5vdCBtb3ZlIHRoZSBvbmVzIHRoYXRcbiAgICogd2VyZSBwbGFjZWQgc3RyYWlnaHQgb250byBpdC5cbiAgICovXG4gIHByaXZhdGUgbW9kZWxUYWdHcm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuXG4gIC8qKlxuICAgKiBUaGUgY2FwdHVyZSBvbiBzY3JlZW4uIEEgdGFnIHBsYWNlZCBpbiBhIDNEIG1vZGVsIGlzIHJlY29yZGVkIHdpdGggaXQsIHdoaWNoIGlzIGhvdyB0aGUgdGFnc1xuICAgKiBwbGFjZWQgaW4gdGhpcyBvbmUgYXJlIHRvbGQgZnJvbSB0aG9zZSB0aGF0IGNhbWUgZnJvbSBlbHNld2hlcmUuXG4gICAqL1xuICBwcml2YXRlIGN1cnJlbnRDYXB0dXJlSUQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwncyBzdXJmYWNlIGFzIGEgZ3JpZDogZXZlcnkgY2VsbCBzb21lIHBhcnQgb2YgdGhlIHN1cmZhY2UgcGFzc2VzIHRocm91Z2guXG4gICAqXG4gICAqIEl0IGFuc3dlcnMgXCJpcyB0aGlzIHBvaW50IG5lYXIgdGhlIG1vZGVsP1wiIHdpdGhvdXQgdmlzaXRpbmcgdGhlIHRyaWFuZ2xlcywgb2Ygd2hpY2ggYSBjYXB0dXJlZFxuICAgKiBtb2RlbCBoYXMgbWlsbGlvbnMgLSB0aGUgcXVlc3Rpb24gaXMgYXNrZWQgZm9yIGV2ZXJ5IHRhZywgZXZlcnkgdGltZSB0aGUgY2FsaWJyYXRpb24gY2hhbmdlcy5cbiAgICovXG4gIHByaXZhdGUgc3VyZmFjZUNlbGxzOiBTZXQ8bnVtYmVyPiB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgc3VyZmFjZU9yaWdpbiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG5cbiAgcHJpdmF0ZSBzdXJmYWNlQ2VsbFNpemUgPSAxO1xuXG4gIC8qKlxuICAgKiBIb3cgZmFyIGZyb20gdGhlIG1vZGVsJ3Mgc3VyZmFjZSBhIHRhZyBtYXkgYmUgYW5kIHN0aWxsIGNvdW50IGFzIG9uIGl0LCBpbiBtZXRyZXMuXG4gICAqXG4gICAqIEV2ZXJ5IHRhZyBvZiB0aGUgc3BhY2UgaXMgb2ZmZXJlZCB0byBldmVyeSBtb2RlbDsgdGhpcyBpcyB3aGF0IGRlY2lkZXMgd2hpY2ggb25lcyBhIG1vZGVsXG4gICAqIHNob3dzLiBBIHRhZyBtYXJrcyBzb21ldGhpbmcgb24gYSBzdXJmYWNlLCBzbyBvbmUgdGhhdCBiZWxvbmdzIGhlcmUgc2l0cyBvbiB0aGUgc3VyZmFjZSBvclxuICAgKiBjbG9zZSB0byBpdC4gT25lIHRoYXQgbGFuZHMgZGVlcCBpbnNpZGUgdGhlIG1vZGVsLCBvciB3ZWxsIGF3YXkgZnJvbSBpdCwgbWFya3Mgc29tZXRoaW5nIHRoYXRcbiAgICogaXMgbm90IHBhcnQgb2YgdGhpcyBtb2RlbC4gVGhlIGFsbG93YW5jZSBjb3ZlcnMgYSBjYWxpYnJhdGlvbiBkb25lIGJ5IGhhbmQgYW5kIHRoZSBtb2RlbCBub3RcbiAgICogbWF0Y2hpbmcgdGhlIHNjYW4gZXhhY3RseSwgd2hpY2ggdG9nZXRoZXIgcnVuIHRvIGEgZmV3IHRlbnMgb2YgY2VudGltZXRyZXMuXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBPTl9NT0RFTF9NRVRSRVMgPSAwLjc1O1xuXG4gIC8qKiBDZWxscyBwZXIgYXhpcyB0aGUgZ3JpZCdzIGtleXMgY2FuIGFkZHJlc3MsIHdpdGggcm9vbSBlaXRoZXIgc2lkZSBmb3IgcG9pbnRzIG9mZiB0aGUgbW9kZWwuICovXG4gIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFNVUkZBQ0VfR1JJRF9TUEFOID0gMTAyNDtcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBTVVJGQUNFX0dSSURfUEFEID0gMTI4O1xuXG4gIC8qKiBPd24gdGFncyBtb3ZlZCB0byBrZWVwIHRoZWlyIHBsYWNlIHVuZGVyIHRoZSBsYXN0IGNhbGlicmF0aW9uLCB3YWl0aW5nIHRvIGJlIHN0b3JlZC4gKi9cbiAgcHJpdmF0ZSByZWJhc2VkVGFnczogVGhyZWVKc1JlYmFzZWRUYWdbXSA9IFtdO1xuXG4gIC8qKiBUaGUgdHlwZSBmaWx0ZXIgaW4gZm9yY2UuIE51bGwgc2hvd3MgZXZlcnkgdHlwZS4gKi9cbiAgcHJpdmF0ZSB2aXNpYmxlVGFnVHlwZXM6IFBvaVR5cGVbXSB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgbWVhc3VyaW5nID0gZmFsc2U7XG5cbiAgLyoqIFBvaW50cyBjbGlja2VkIHNvIGZhciwgaW4gdGFnIHNwYWNlLiAqL1xuICBwcml2YXRlIG1lYXN1cmVQb2ludHM6IFRIUkVFLlZlY3RvcjNbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBFdmVyeXRoaW5nIGRyYXduIGZvciB0aGUgbWVhc3VyZW1lbnQuIEEgY2hpbGQgb2YgdGhlIHRhZyBncm91cCwgc28gaXRzIHBvaW50cyBzaGFyZSB0aGUgZnJhbWVcbiAgICogdGFnIGNvb3JkaW5hdGVzIGFyZSBzdG9yZWQgaW4gLSB3aGljaCBpcyBtZXRyZXMsIGFuZCB3aGF0IHRoZSBzYXZlZCBQT0kgaGFzIHRvIGJlIGluLlxuICAgKi9cbiAgcHJpdmF0ZSBtZWFzdXJlR3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcblxuICAvKiogVGhlIHNlZ21lbnQgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyIGZyb20gdGhlIGxhc3QgcG9pbnQgY2xpY2tlZC4gKi9cbiAgcHJpdmF0ZSBtZWFzdXJlUnViYmVyQmFuZD86IGFueTtcblxuICBwcml2YXRlIGxhc3RNZWFzdXJlbWVudDogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhhbGYgdGhlIG1vZGVsJ3MgZGlhZ29uYWwgYXMgcGxhY2VkIGluIHRoZSBzY2VuZSwgd2hlcmUgaXQgaXMgY2VudHJlZCBvbiB0aGUgb3JpZ2luLiAqL1xuICBwcml2YXRlIG1vZGVsV29ybGRSYWRpdXMgPSAwO1xuXG4gIC8qKiBUaGUgb3V0ZXJtb3N0IGdyb3VwIHRoZSBtb2RlbCBhbmQgaXRzIHRhZ3MgaGFuZyBmcm9tOiB3aGVyZSBcIndoaWNoIHdheSBpcyB1cFwiIGlzIGFwcGxpZWQuICovXG4gIHByaXZhdGUgbW9kZWxHcm91cD86IFRIUkVFLkdyb3VwO1xuXG4gIHByaXZhdGUgbW9kZWxVcDogVGhyZWVKc01vZGVsVXAgPSAneSc7XG5cbiAgLyoqIFdoaWxlIG1lYXN1cmluZzogaG93IG1hbnkgcG9pbnRzIGFuZCBlYWNoIHNlZ21lbnQncyBsZW5ndGguIE51bGwgd2hlbiBpdCBpcyBhYmFuZG9uZWQuICovXG4gIHB1YmxpYyBtZWFzdXJlbWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHsgcG9pbnRzOiBudW1iZXI7IGRpc3RhbmNlczogbnVtYmVyW10gfSB8IG51bGw+KCk7XG5cbiAgLyoqXG4gICAqIExheWVyIGNhcnJ5aW5nIHRoZSBtb2RlbCBhbG9uZSwgc28gdGhlIGRlcHRoIHBpY2sgY2FuIHJlbmRlciBpdCB3aXRob3V0IHRoZSB0YWdzLlxuICAgKlxuICAgKiBMYXllcnMgYXJlIHRlc3RlZCBwZXIgb2JqZWN0IGF0IHJlbmRlciB0aW1lIGFuZCBjaGlsZHJlbiBhcmUgdHJhdmVyc2VkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlclxuICAgKiB0aGVpciBwYXJlbnQgcGFzc2VkLCBzbyBtYXJraW5nIHRoZSBtb2RlbCdzIG93biBtZXNoZXMgaXMgZW5vdWdoIC0gbm8gcmUtcGFyZW50aW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgUElDS19MQVlFUiA9IDE7XG5cbiAgLyoqIFRoZSBhcHAncyBoaWdobGlnaHQgY29sb3VyLCBzbyBhIG1lYXN1cmVtZW50IHJlYWRzIGFzIHRoZSBhY3RpdmUgdGhpbmcgb24gc2NyZWVuLiAqL1xuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNRUFTVVJFX0NPTE9SID0gJyNGRkIxMDMnO1xuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGJ1Y2tldCBob2xkaW5nIGRvd25sb2FkZWQgbW9kZWxzLCBhbmQgaG93IG1hbnkgdG8ga2VlcC4gKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTU9ERUxfQ0FDSEUgPSAnc21hcnRlcnBsYW4tM2QtbW9kZWxzJztcblxuICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBNT0RFTF9DQUNIRV9TSVpFID0gMztcblxuICBwcml2YXRlIHBpY2tUYXJnZXQ/OiBUSFJFRS5XZWJHTFJlbmRlclRhcmdldDtcblxuICBwcml2YXRlIHBpY2tDYW1lcmE/OiBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYTtcblxuICBwcml2YXRlIHBpY2tEZXB0aE1hdGVyaWFsPzogVEhSRUUuTWVzaERlcHRoTWF0ZXJpYWw7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBwaWNrUGl4ZWwgPSBuZXcgVWludDhBcnJheSg0KTtcblxuICAvKiogRW1pdHMgb25jZSBhIHRhZyBpcyBkcm9wcGVkIG9uIHRoZSBtb2RlbCwgc28gdGhlIFVJIGNhbiBjb25maXJtIGFuZCBwZXJzaXN0IGl0LiAqL1xuICBwdWJsaWMgdGFnUGxhY2VkJCA9IG5ldyBTdWJqZWN0PFRocmVlSnNUYWdQbGFjZW1lbnQ+KCk7XG5cbiAgLyoqIEVtaXRzIHdoZW4gdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGlzIGFiYW5kb25lZCwgc28gdGhlIHBhbmVsIGRyaXZpbmcgaXQgY2FuIGNsb3NlLiAqL1xuICBwdWJsaWMgYWxpZ25tZW50Q2FuY2VsbGVkJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgLyoqIFRyYW5zbHVjZW50IG1hcmtlciBzaG93biB1bmRlciB0aGUgY3Vyc29yIHdoaWxlIHBsYWNpbmcuICovXG4gIHByaXZhdGUgcGxhY2VtZW50UHJldmlldz86IFRIUkVFLlNwcml0ZTtcblxuICBwcml2YXRlIGFsaWduaW5nID0gZmFsc2U7XG4gIHByaXZhdGUgYWxpZ25tZW50UGFpcnM6IFRocmVlSnNBbGlnbm1lbnRQYWlyW10gPSBbXTtcbiAgcHJpdmF0ZSBhbGlnbm1lbnRTb3VyY2U6IHsgeDogbnVtYmVyOyB5OiBudW1iZXI7IHo6IG51bWJlciB9IHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIFRoZSB0YWcgYGFsaWdubWVudFNvdXJjZWAgd2FzIHJlYWQgZnJvbSwga2VwdCBzbyB0aGUgc2FtZSB0YWcgaXMgbm90IG1hdGNoZWQgdHdpY2UuICovXG4gIHByaXZhdGUgYWxpZ25tZW50U291cmNlVGFnSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKiogRHJpdmVzIHRoZSBhbGlnbm1lbnQgd2Fsa3Rocm91Z2gncyBVSTogaG93IG1hbnkgcGFpcnMgYXJlIGRvbmUgYW5kIHdoYXQgaXQgd2FudHMgbmV4dC4gKi9cbiAgcHVibGljIGFsaWdubWVudFByb2dyZXNzJCA9IG5ldyBTdWJqZWN0PHtcbiAgICBwYWlyczogbnVtYmVyO1xuICAgIGF3YWl0aW5nOiAndGFnJyB8ICdwb2ludCcgfCBudWxsO1xuICAgIHRhZ0lkPzogc3RyaW5nO1xuICB9PigpO1xuXG4gIC8qKiBJbi1mbGlnaHQgY2FtZXJhIG1vdmUgc3RhcnRlZCBieSBnb1RvVGFnLCBhZHZhbmNlZCBieSB0aGUgcmVuZGVyIGxvb3AuICovXG4gIHByaXZhdGUgY2FtZXJhVHdlZW46IHtcbiAgICBmcm9tUG9zaXRpb246IFRIUkVFLlZlY3RvcjM7XG4gICAgdG9Qb3NpdGlvbjogVEhSRUUuVmVjdG9yMztcbiAgICBmcm9tVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHRvVGFyZ2V0OiBUSFJFRS5WZWN0b3IzO1xuICAgIHN0YXJ0ZWRBdDogbnVtYmVyO1xuICAgIGR1cmF0aW9uTXM6IG51bWJlcjtcbiAgfSB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBFbWl0cyB0cnVlIHdoaWxlIGEgaGVhdnkgT0JKIGZpbGUgaXMgYmVpbmcgcGFyc2VkIChpbiBhIHdvcmtlciwgd2hlbiBhdmFpbGFibGUpLCBmYWxzZSBvbmNlIGRvbmUuICovXG4gIHB1YmxpYyBtb2RlbExvYWRpbmckID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogRG93bmxvYWQgcHJvZ3Jlc3MgZm9yIEdMQiBtb2RlbHMsIGFzIGEgMC0xIGZyYWN0aW9uLCBvciBudWxsIHdoZW4gdGhlIHRvdGFsIHNpemUgaXMgdW5rbm93bi5cbiAgICpcbiAgICogQSBudWxsIG1lYW5zIHRoZSBzZXJ2ZXIgZGlkIG5vdCBzZW5kIENvbnRlbnQtTGVuZ3RoIChjaHVua2VkIHJlc3BvbnNlcywgc29tZSBwcm94aWVzKSBhbmQgbm9cbiAgICogcGVyY2VudGFnZSBjYW4gYmUgZGVyaXZlZDsgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvciByYXRoZXIgdGhhbiBndWVzc2luZyBhdCBvbmUuXG4gICAqL1xuICBwdWJsaWMgbW9kZWxMb2FkUHJvZ3Jlc3MkID0gbmV3IFN1YmplY3Q8bnVtYmVyIHwgbnVsbD4oKTtcblxuICAvKipcbiAgICogRW1pdHMgd2hlbiBhIGxvYWQgYWN0dWFsbHkgc3RvcHBlZCBzaG9ydCwgd2hpY2ggaXMgbm90IHRoZSBzYW1lIGFzIGFza2luZyBpdCB0by5cbiAgICpcbiAgICogY2FuY2VsTW9kZWxMb2FkKCkgY2FuIGFycml2ZSBhZnRlciBwYXJzZSgpIGhhcyB0YWtlbiB0aGUgbWFpbiB0aHJlYWQsIGFuZCBwYXJzZSBjYW5ub3QgYmVcbiAgICogaW50ZXJydXB0ZWQgLSB0aGUgbW9kZWwgZmluaXNoZXMgbG9hZGluZyByZWdhcmRsZXNzLiBPbmx5IHRoaXMgdGVsbHMgdGhlIFVJIHdoaWNoIG9mIHRoZSB0d29cbiAgICogaGFwcGVuZWQsIHNvIGl0IGRvZXMgbm90IG9mZmVyIHRvIHJlbG9hZCBzb21ldGhpbmcgdGhhdCBpcyBhbHJlYWR5IG9uIHNjcmVlbi5cbiAgICovXG4gIHB1YmxpYyBtb2RlbExvYWRDYW5jZWxsZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAvLyBCYWNrZ3JvdW5kIHBhcnNpbmcgb2YgaGVhdnkgLm9iaiBmaWxlcywgcHJvdmlkZWQgYnkgdGhlIGhvc3RpbmcgYXBwIChzZWUgc2V0T2JqUGFyc2VyV29ya2VyKS5cbiAgLy8gQW5ndWxhciBsaWJyYXJpZXMgYnVpbHQgd2l0aCBuZy1wYWNrYWdyIGNhbid0IGJ1bmRsZSBgbmV3IFdvcmtlcihuZXcgVVJMKC4uLikpYCB0aGVtc2VsdmVzLFxuICAvLyBzbyB0aGUgYXBwIGluc3RhbnRpYXRlcyB0aGUgd29ya2VyIChpdHMgYnVpbGQgcGlwZWxpbmUgc3VwcG9ydHMgaXQpIGFuZCBoYW5kcyBpdCBvdmVyIGhlcmUuXG4gIHByaXZhdGUgb2JqUGFyc2VyV29ya2VyPzogV29ya2VyO1xuICBwcml2YXRlIG9ialBhcnNlclBlbmRpbmdSZXF1ZXN0cyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJlc29sdmU6IChtZXNoZXM6IFBhcnNlZE1lc2hEYXRhW10pID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBFcnJvcikgPT4gdm9pZCB9PigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBXZWIgV29ya2VyIHVzZWQgdG8gcGFyc2UgaGVhdnkgLm9iaiBmaWxlcyBvZmYgdGhlIG1haW4gdGhyZWFkLlxuICAgKiBNdXN0IGJlIGluc3RhbnRpYXRlZCBieSB0aGUgY29uc3VtaW5nIGFwcCAoZS5nLiBgbmV3IFdvcmtlcihuZXcgVVJMKCcuL29iai1wYXJzZXIud29ya2VyJywgaW1wb3J0Lm1ldGEudXJsKSlgKSxcbiAgICogc2luY2UgYSBsaWJyYXJ5IHBhY2thZ2VkIHdpdGggbmctcGFja2FnciBjYW5ub3QgYnVuZGxlIHdvcmtlciBmaWxlcyBpdHNlbGYuXG4gICAqIFdoZW4gbm8gd29ya2VyIGlzIHByb3ZpZGVkLCBsb2FkT2JqTW9kZWwgZmFsbHMgYmFjayB0byBwYXJzaW5nIG9uIHRoZSBtYWluIHRocmVhZC5cbiAgICovXG4gIHNldE9ialBhcnNlcldvcmtlcih3b3JrZXI6IFdvcmtlcik6IHZvaWQge1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyID0gd29ya2VyO1xuICAgIHRoaXMub2JqUGFyc2VyV29ya2VyLm9ubWVzc2FnZSA9ICh7IGRhdGEgfTogTWVzc2FnZUV2ZW50PE9ialBhcnNlcldvcmtlclJlc3BvbnNlPikgPT4ge1xuICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmdldChkYXRhLnJlcXVlc3RJZCk7XG4gICAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5vYmpQYXJzZXJQZW5kaW5nUmVxdWVzdHMuZGVsZXRlKGRhdGEucmVxdWVzdElkKTtcbiAgICAgIGlmIChkYXRhLnN1Y2Nlc3MgJiYgZGF0YS5tZXNoZXMpIHtcbiAgICAgICAgcGVuZGluZy5yZXNvbHZlKGRhdGEubWVzaGVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlbmRpbmcucmVqZWN0KG5ldyBFcnJvcihkYXRhLmVycm9yIHx8ICdVbmtub3duIGVycm9yIHdoaWxlIHBhcnNpbmcgT0JKIGZpbGUgaW4gd29ya2VyJykpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHJlcXVlc3RPYmpQYXJzZUluV29ya2VyKG9ialVybDogc3RyaW5nKTogUHJvbWlzZTxQYXJzZWRNZXNoRGF0YVtdPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcXVlc3RJZCA9IGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc2xpY2UoMil9YDtcbiAgICAgIHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLnNldChyZXF1ZXN0SWQsIHsgcmVzb2x2ZSwgcmVqZWN0IH0pO1xuICAgICAgdGhpcy5vYmpQYXJzZXJXb3JrZXIhLnBvc3RNZXNzYWdlKHsgcmVxdWVzdElkLCBvYmpVcmwgfSk7XG4gICAgICAvLyBEaWFnbm9zdGljIG9ubHk6IGxhcmdlIG1vZGVscyBsZWdpdGltYXRlbHkgdGFrZSBhIHdoaWxlLCB0aGlzIGlzbid0IGEgdGltZW91dC9hYm9ydCxcbiAgICAgIC8vIGp1c3QgYSBzaWduYWwgaW4gY2FzZSB0aGUgd29ya2VyIHdlbnQgc2lsZW50IChlLmcuIGl0IHJhbiBvdXQgb2YgbWVtb3J5IG1pZC1wYXJzZSkuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub2JqUGFyc2VyUGVuZGluZ1JlcXVlc3RzLmhhcyhyZXF1ZXN0SWQpKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKGBUaHJlZUpzU2VydmljZTogb2JqLXBhcnNlciB3b3JrZXIgaGFzIG5vdCByZXBsaWVkIGFmdGVyIDYwcyBmb3IgcmVxdWVzdCAke3JlcXVlc3RJZH0gKG9ialVybD0ke29ialVybH0pLiBTdGlsbCB3YWl0aW5nIC0gbGFyZ2UgZmlsZXMgY2FuIHRha2UgYSB3aGlsZSwgYnV0IHRoaXMgbWF5IGFsc28gbWVhbiB0aGUgd29ya2VyIGh1bmcgb3IgcmFuIG91dCBvZiBtZW1vcnkuYCk7XG4gICAgICAgIH1cbiAgICAgIH0sIDYwMDAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBSZWJ1aWxkcyBhIFRIUkVFLk1lc2ggZnJvbSB0aGUgcmF3IHR5cGVkIGFycmF5cyBzZW50IGJhY2sgYnkgdGhlIHBhcnNlciB3b3JrZXIuICovXG4gIHByaXZhdGUgbWVzaEZyb21QYXJzZWREYXRhKGRhdGE6IFBhcnNlZE1lc2hEYXRhLCBtYXRlcmlhbHM/OiBhbnkpOiBUSFJFRS5NZXNoIHtcbiAgICBjb25zdCBnZW9tZXRyeSA9IG5ldyBUSFJFRS5CdWZmZXJHZW9tZXRyeSgpO1xuICAgIGdlb21ldHJ5LnNldEF0dHJpYnV0ZSgncG9zaXRpb24nLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEucG9zaXRpb24sIDMpKTtcbiAgICBpZiAoZGF0YS51dikge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCd1dicsIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoZGF0YS51diwgMikpO1xuICAgIH1cbiAgICAvLyBJbmRleCBoYXMgdG8gYmUgc2V0IGJlZm9yZSBhbnkgbm9ybWFsIGNvbXB1dGF0aW9uLCB3aGljaCByZWFkcyBpdCB0byBhdmVyYWdlIHNoYXJlZCBmYWNlcy5cbiAgICBpZiAoZGF0YS5pbmRleCkge1xuICAgICAgZ2VvbWV0cnkuc2V0SW5kZXgobmV3IFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZShkYXRhLmluZGV4LCAxKSk7XG4gICAgfVxuICAgIGlmIChkYXRhLm5vcm1hbCkge1xuICAgICAgZ2VvbWV0cnkuc2V0QXR0cmlidXRlKCdub3JtYWwnLCBuZXcgVEhSRUUuQnVmZmVyQXR0cmlidXRlKGRhdGEubm9ybWFsLCAzKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG4gICAgfVxuICAgIC8vIEJveDMuc2V0RnJvbU9iamVjdCgpIHJldXNlcyBhbiBhbHJlYWR5LXNldCBib3VuZGluZ0JveCBpbnN0ZWFkIG9mIHdhbGtpbmcgZXZlcnkgdmVydGV4LFxuICAgIC8vIHNvIGFkb3B0aW5nIHRoZSB3b3JrZXIncyBtYWtlcyBmcmFtaW5nIHRoZSBjYW1lcmEgY2hlYXAgbm8gbWF0dGVyIGhvdyBkZW5zZSB0aGUgbWVzaCBpcy5cbiAgICBpZiAoZGF0YS5ib3VuZGluZ0JveCkge1xuICAgICAgZ2VvbWV0cnkuYm91bmRpbmdCb3ggPSBuZXcgVEhSRUUuQm94MyhcbiAgICAgICAgbmV3IFRIUkVFLlZlY3RvcjMoLi4uZGF0YS5ib3VuZGluZ0JveC5taW4pLFxuICAgICAgICBuZXcgVEhSRUUuVmVjdG9yMyguLi5kYXRhLmJvdW5kaW5nQm94Lm1heCksXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc29sdmVkTWF0ZXJpYWxzID0gZGF0YS5tYXRlcmlhbE5hbWVzLm1hcCgobmFtZSkgPT4ge1xuICAgICAgY29uc3QgbWF0ZXJpYWwgPSBtYXRlcmlhbHMgJiYgbmFtZSA/IG1hdGVyaWFscy5jcmVhdGUobmFtZSkgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIW1hdGVyaWFsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgVGhyZWVKc1NlcnZpY2U6IG5vIE1UTCBtYXRlcmlhbCBuYW1lZCBcIiR7bmFtZX1cIiBmb3IgbWVzaCBcIiR7ZGF0YS5uYW1lfVwiLCB1c2luZyBhIHBsYWluIGZhbGxiYWNrIChubyB0ZXh0dXJlKS5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtYXRlcmlhbCB8fCBuZXcgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWwoKTtcbiAgICB9KTtcblxuICAgIGxldCBtZXNoOiBUSFJFRS5NZXNoO1xuICAgIGlmIChkYXRhLmdyb3VwcyAmJiBkYXRhLmdyb3Vwcy5sZW5ndGggPiAwKSB7XG4gICAgICBkYXRhLmdyb3Vwcy5mb3JFYWNoKChncm91cCkgPT4gZ2VvbWV0cnkuYWRkR3JvdXAoZ3JvdXAuc3RhcnQsIGdyb3VwLmNvdW50LCBncm91cC5tYXRlcmlhbEluZGV4KSk7XG4gICAgICBtZXNoID0gbmV3IFRIUkVFLk1lc2goZ2VvbWV0cnksIHJlc29sdmVkTWF0ZXJpYWxzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzaCA9IG5ldyBUSFJFRS5NZXNoKGdlb21ldHJ5LCByZXNvbHZlZE1hdGVyaWFsc1swXSk7XG4gICAgfVxuICAgIG1lc2gubmFtZSA9IGRhdGEubmFtZTtcbiAgICByZXR1cm4gbWVzaDtcbiAgfVxuXG4gIGluaXQoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIC8vIFRoaXMgc2VydmljZSBpcyBhIHNpbmdsZXRvbiBidXQgdGhlIHZpZXdlciBjb21wb25lbnQgaXMgcmVidWlsdCBvbiBldmVyeSBuYXZpZ2F0aW9uLCBzbyBzdGF0ZVxuICAgIC8vIGZyb20gdGhlIHByZXZpb3VzIHNjZW5lIGlzIHN0aWxsIGhlcmUuIFR3byB0aGluZ3Mgb3V0bGl2ZSBpdCBhbmQgaGF2ZSB0byBnbyBmaXJzdDpcbiAgICAvL1xuICAgIC8vICAtIEEgZG93bmxvYWQgc3RpbGwgaW4gZmxpZ2h0LiBJdHMgb25Mb2FkZWQgcmVzb2x2ZXMgYWdhaW5zdCB3aGF0ZXZlciBgdGhpcy5zY2VuZWAgcG9pbnRzIGF0XG4gICAgLy8gICAgYnkgdGhlbiwgc28gdGhlIG1vZGVsIGJlaW5nIGFiYW5kb25lZCB3b3VsZCBiZSBoYW5kZWQgdG8gdGhlIHNjZW5lIGJ1aWx0IGJlbG93LlxuICAgIC8vICAtIFRoZSB0YWcgZ3JvdXAsIHdoaWNoIGlzIGEgZmllbGQgYW5kIGtlZXBzIGl0cyBzcHJpdGVzLiBUaGV5IHdvdWxkIGJlIHJlLXBhcmVudGVkIHVuZGVyIHRoZVxuICAgIC8vICAgIG5ldyBtb2RlbCBhbmQgc2hvdyB0aGUgcHJldmlvdXMgdmlzaXQncyB0YWdzIG9uIGl0LlxuICAgIHRoaXMuZGlzY2FyZEN1cnJlbnRMb2FkKCk7XG4gICAgdGhpcy5jbGVhclRhZ3MoKTtcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xuICAgIHRoaXMuY2FtZXJhVHdlZW4gPSBudWxsO1xuICAgIHRoaXMubW9kZWxSb290ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gMS4gU2V0dXAgU2NlbmVcbiAgICB0aGlzLnNjZW5lID0gbmV3IFRIUkVFLlNjZW5lKCk7XG4gICAgdGhpcy5zY2VuZS5iYWNrZ3JvdW5kID0gbmV3IFRIUkVFLkNvbG9yKDB4ZTBmN2ZmKTsgLy8gZnJvbSBQT0NcblxuICAgIC8vIDIuIFNldHVwIENhbWVyYVxuICAgIHRoaXMuY2FtZXJhID0gbmV3IFRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhKDc1LCBjYW52YXMuY2xpZW50V2lkdGggLyBjYW52YXMuY2xpZW50SGVpZ2h0LCAwLjEsIDEwMDAwKTtcbiAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoMCwgNSwgMTApOyAvLyB3aWxsIGJlIG92ZXJyaWRkZW4gbGF0ZXIgaWYgcGFzc2VkXG5cbiAgICAvLyAzLiBTZXR1cCBXZWJHTCBSZW5kZXJlclxuICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVEhSRUUuV2ViR0xSZW5kZXJlcih7IGNhbnZhcywgYW50aWFsaWFzOiB0cnVlIH0pO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0U2l6ZShjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UGl4ZWxSYXRpbyhNYXRoLm1pbih3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbywgMS41KSk7XG4gICAgdGhpcy5vYnNlcnZlQ2FudmFzUmVzaXplKGNhbnZhcyk7XG4gICAgXG4gICAgLy8gRml4IGZvciBUaHJlZS5qcyByMTQ3IHZzIHIxNTIrIGNvbG9yIG1hbmFnZW1lbnRcbiAgICBpZiAoJ291dHB1dENvbG9yU3BhY2UnIGluIHRoaXMucmVuZGVyZXIpIHtcbiAgICAgICh0aGlzLnJlbmRlcmVyIGFzIGFueSkub3V0cHV0Q29sb3JTcGFjZSA9ICdzcmdiJzsgLy8gVEhSRUUuU1JHQkNvbG9yU3BhY2VcbiAgICB9IGVsc2Uge1xuICAgICAgKHRoaXMucmVuZGVyZXIgYXMgYW55KS5vdXRwdXRFbmNvZGluZyA9IDMwMDE7IC8vIFRIUkVFLnNSR0JFbmNvZGluZ1xuICAgIH1cblxuICAgIC8vIFdpdGhvdXQgdG9uZSBtYXBwaW5nIGFueXRoaW5nIGJyaWdodGVyIHRoYW4gMS4wIGlzIHNpbXBseSBjdXQgb2ZmIHRvIHB1cmUgd2hpdGUuIENhcHR1cmVkXG4gICAgLy8gdGV4dHVyZXMgY2FycnkgYSBzbWFsbCBmcmFjdGlvbiBvZiB2ZXJ5IGJyaWdodCBwaXhlbHMgLSBza3kgcmVmbGVjdGVkIGluIHdpbmRvd3MsIHN1bmxpdFxuICAgIC8vIHJlbmRlciAtIGFuZCBvbmNlIGxpZ2h0aW5nIHB1c2hlcyB0aG9zZSBwYXN0IHRoZSBsaW1pdCB0aGV5IGZsYXR0ZW4gaW50byB3aGl0ZSBzcGVja3Mgd2l0aFxuICAgIC8vIG5vIGRldGFpbCBsZWZ0LiBSb2xsaW5nIHRoZSBoaWdobGlnaHRzIG9mZiBpbnN0ZWFkIGtlZXBzIHRoYXQgZGV0YWlsIGFuZCBrZWVwcyBicmlnaHQgYXJlYXNcbiAgICAvLyByZWFkaW5nIGFzIGJyaWdodCByYXRoZXIgdGhhbiBibG93bi5cbiAgICB0aGlzLnJlbmRlcmVyLnRvbmVNYXBwaW5nID0gVEhSRUUuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nO1xuICAgIHRoaXMucmVuZGVyZXIudG9uZU1hcHBpbmdFeHBvc3VyZSA9IDEuMDtcblxuICAgIC8vIDQuIExpZ2h0aW5nLCBrZXB0IGRlbGliZXJhdGVseSByZXN0cmFpbmVkIGFuZCBuZXV0cmFsLlxuICAgIC8vXG4gICAgLy8gQ2FwdHVyZWQvcGhvdG9ncmFtbWV0cnkgbW9kZWxzIGFscmVhZHkgaGF2ZSBsaWdodGluZyBiYWtlZCBpbnRvIHRoZWlyIHRleHR1cmVzICh0aGUgc3VuIGFuZFxuICAgIC8vIHNoYWRvd3MgY2FtZSB3aXRoIHRoZSBwaG90b3MpLCBzbyBsaWdodGluZyB0aGVtIGFnYWluIGRpc3RvcnRzIHdoYXQgdGhleSBhY3R1YWxseSBsb29rIGxpa2UuXG4gICAgLy8gVGhlIGludGVuc2l0aWVzIGJlbG93IGFkZCB1cCB0byByb3VnaGx5IDEuMCBvbiBhIHN1cmZhY2UgZmFjaW5nIHRoZSB2aWV3ZXIsIHdoaWNoIHJlbmRlcnMgdGhlXG4gICAgLy8gdGV4dHVyZSBhdCBpdHMgdHJ1ZSB2YWx1ZS4gQW55dGhpbmcgYWJvdmUgMS4wIGlzIGNsaXBwZWQgdG8gcHVyZSB3aGl0ZSBieSB0aGUgcmVuZGVyZXIsIHdoaWNoXG4gICAgLy8gaXMgd2hhdCB0dXJucyBicmlnaHQgYXJlYXMgaW50byBmbGF0IHdoaXRlIHBhdGNoZXMgd2l0aCBubyBkZXRhaWwgbGVmdCBpbiB0aGVtLlxuICAgIC8vXG4gICAgLy8gTmV1dHJhbCB3aGl0ZSBpcyB1c2VkIHJhdGhlciB0aGFuIGEgd2FybSB0aW50IGZvciB0aGUgc2FtZSByZWFzb246IGEgdGludGVkIGxpZ2h0IHNoaWZ0cyBldmVyeVxuICAgIC8vIGNvbG91ciBpbiB0aGUgbW9kZWwgYXdheSBmcm9tIHdoYXQgd2FzIGNhcHR1cmVkLlxuICAgIGNvbnN0IGFtYmllbnRMaWdodCA9IG5ldyBUSFJFRS5BbWJpZW50TGlnaHQoMHhmZmZmZmYsIDAuNyk7XG4gICAgdGhpcy5zY2VuZS5hZGQoYW1iaWVudExpZ2h0KTtcblxuICAgIC8vIEhlYWRsaWdodCByYXRoZXIgdGhhbiBhIGZpeGVkIHN1bjogcGFyZW50ZWQgdG8gdGhlIGNhbWVyYSBzbyBpdCBhbHdheXMgcG9pbnRzIGF0IHdoYXRldmVyIGlzXG4gICAgLy8gYmVpbmcgbG9va2VkIGF0LCBnaXZpbmcgc2hhcGUgdG8gc3VyZmFjZXMgd2l0aG91dCBldmVyIGxlYXZpbmcgYSBmYWNlIHVubGl0LiBObyBzaGFkb3cgY2FzdGluZ1xuICAgIC8vIC0gc2hhZG93cyB3b3VsZCBkb3VibGUgdXAgd2l0aCB0aGUgb25lcyBhbHJlYWR5IGJha2VkIGludG8gdGhlIHRleHR1cmVzLCBhbmQgdGhlIHNoYWRvdyBtYXBcbiAgICAvLyB3YXMgYSByZWFsIGNvc3QgcGVyIGZyYW1lLlxuICAgIGNvbnN0IGhlYWRMaWdodCA9IG5ldyBUSFJFRS5EaXJlY3Rpb25hbExpZ2h0KDB4ZmZmZmZmLCAwLjM1KTtcbiAgICBoZWFkTGlnaHQucG9zaXRpb24uc2V0KDAsIDAsIDEpO1xuICAgIHRoaXMuY2FtZXJhLmFkZChoZWFkTGlnaHQpO1xuICAgIC8vIEEgbGlnaHQgb25seSBjb250cmlidXRlcyB3aGlsZSBpdCBpcyBwYXJ0IG9mIHRoZSBzY2VuZSBncmFwaCwgYW5kIHRoaXMgb25lIGhhbmdzIG9mZiB0aGUgY2FtZXJhLlxuICAgIHRoaXMuc2NlbmUuYWRkKHRoaXMuY2FtZXJhKTtcblxuICAgIC8vIDUuIFNldHVwIENvbnRyb2xzIChmcm9tIFBPQylcbiAgICB0aGlzLmNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHModGhpcy5jYW1lcmEsIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudCk7XG4gICAgdGhpcy5jb250cm9scy5yb3RhdGVTcGVlZCA9IDEuMDtcbiAgICB0aGlzLmNvbnRyb2xzLmRhbXBpbmdGYWN0b3IgPSAwLjE7XG4gICAgdGhpcy5jb250cm9scy5lbmFibGVEYW1waW5nID0gdHJ1ZTtcbiAgICB0aGlzLmNvbnRyb2xzLm1vdXNlQnV0dG9ucyA9IHtcbiAgICAgIExFRlQ6IFRIUkVFLk1PVVNFLlJPVEFURSxcbiAgICAgIE1JRERMRTogVEhSRUUuTU9VU0UuRE9MTFksXG4gICAgICBSSUdIVDogVEhSRUUuTU9VU0UuUEFOLFxuICAgIH07XG4gICAgdGhpcy5jb250cm9scy50YXJnZXQuc2V0KDAsIDAsIDApO1xuXG4gICAgLy8gRXZlbnQgbGlzdGVuZXJzIG9uIGNvbnRyb2xzIHRvIGRpZmZlcmVudGlhdGUgZHJhZ2dpbmcgdnMgY2xpY2tpbmdcbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ3N0YXJ0JywgKCkgPT4ge1xuICAgICAgdGhpcy5pc0RyYWdnaW5nVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc0RyYWdnaW5nQ2FtZXJhID0gdHJ1ZTtcbiAgICAgIH0sIDE1MCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLmNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLmlzRHJhZ2dpbmdUaW1lcik7XG4gICAgICBpZiAodGhpcy5pc0RyYWdnaW5nQ2FtZXJhKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaXNEcmFnZ2luZ0NhbWVyYSA9IGZhbHNlO1xuICAgICAgICB9LCAyNTApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gSW50ZXJhY3Rpb24gRXZlbnQgTGlzdGVuZXJzIG9uIGNhbnZhc1xuICAgIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Nb3VzZUNsaWNrLmJpbmQodGhpcyksIGZhbHNlKTtcbiAgICBjYW52YXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLCBmYWxzZSk7XG5cbiAgICAvLyBFc2NhcGUgYmFja3Mgb3V0IG9mIHBsYWNlbWVudCBhbmQgY2FsaWJyYXRpb24uIE9uIHRoZSB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIGNhbnZhcywgd2hpY2hcbiAgICAvLyB3b3VsZCBuZWVkIGZvY3VzIHRoZSB1c2VyIGhhcyBubyByZWFzb24gdG8gaGF2ZSBnaXZlbiBpdCAtIHRoZXkgYXJlIGFpbWluZyB3aXRoIHRoZSBtb3VzZS5cbiAgICAvLyBSZW1vdmVkIGZpcnN0IGJlY2F1c2UgdGhpcyBzZXJ2aWNlIGlzIGEgc2luZ2xldG9uOiBpbml0KCkgcnVucyBhZ2FpbiBmb3IgZXZlcnkgY2FudmFzLCBhbmRcbiAgICAvLyB0aGUgcHJldmlvdXMgcmVnaXN0cmF0aW9uIHdvdWxkIG90aGVyd2lzZSBzdGlsbCBiZSBhdHRhY2hlZC5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgICB0aGlzLnBpY2tUYXJnZXQ/LmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBpY2tUYXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5waWNrRGVwdGhNYXRlcmlhbD8uZGlzcG9zZSgpO1xuICAgIHRoaXMucGlja0RlcHRoTWF0ZXJpYWwgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5waWNrQ2FtZXJhID0gdW5kZWZpbmVkO1xuICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5vbktleURvd24pO1xuXG4gICAgLy8gNi4gU3RhcnQgdGhlIHJlbmRlciBsb29wXG4gICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5hbmltYXRlKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGF0aCAoc2VydmVkIGJ5IHRoZSBhcHApIGhvbGRpbmcgYmFzaXNfdHJhbnNjb2Rlci5qcy8ud2FzbSwgd2hpY2ggS1RYMkxvYWRlciBuZWVkcyB0byB0dXJuXG4gICAqIEJhc2lzIFVuaXZlcnNhbCB0ZXh0dXJlcyBpbnRvIHdoYXRldmVyIGNvbXByZXNzZWQgZm9ybWF0IHRoZSBsb2NhbCBHUFUgYWN0dWFsbHkgc3VwcG9ydHMuXG4gICAqL1xuICBwcml2YXRlIGt0eDJUcmFuc2NvZGVyUGF0aCA9ICdhc3NldHMvYmFzaXMvJztcblxuICAvKiogT3ZlcnJpZGVzIHdoZXJlIHRoZSBCYXNpcyB0cmFuc2NvZGVyIGZpbGVzIGFyZSBzZXJ2ZWQgZnJvbS4gKi9cbiAgc2V0S3R4MlRyYW5zY29kZXJQYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMua3R4MlRyYW5zY29kZXJQYXRoID0gcGF0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhIGJhc2UgM0QgbW9kZWwgaW4gR0xURi9HTEIgZm9ybWF0IC0gdGhlIHByZWZlcnJlZCBmb3JtYXQgZm9yIGxhcmdlIG1vZGVscy5cbiAgICogVW5saWtlIC5vYmosIGdlb21ldHJ5IGFycml2ZXMgYXMgYmluYXJ5IHR5cGVkIGFycmF5cyAobm8gdGV4dCBwYXJzaW5nIHRvIG9mZmxvYWQgdG8gYSB3b3JrZXIpXG4gICAqIGFuZCBzdGF5cyBpbmRleGVkLCBzbyBmYXIgbGVzcyBkYXRhIHJlYWNoZXMgdGhlIEdQVS4gS1RYMiB0ZXh0dXJlcyBhcmUgc3VwcG9ydGVkIHRvbzogdGhleVxuICAgKiBzdGF5IGNvbXByZXNzZWQgaW4gVlJBTSBpbnN0ZWFkIG9mIGJlaW5nIGRlY29kZWQgdG8gcmF3IHBpeGVscyBsaWtlIEpQRUcvUE5HLlxuICAgKi9cbiAgbG9hZEdMVEZNb2RlbCh1cmw6IHN0cmluZywgY2FtZXJhUG9zaXRpb24/OiB7eDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcn0sIHJvdGF0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCBjYWNoZUtleT86IHN0cmluZywgdXA/OiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIGNvbnN0IGxvYWRlciA9IG5ldyBHTFRGTG9hZGVyKCk7XG5cbiAgICAvLyBLVFgyIG5lZWRzIHRoZSByZW5kZXJlciB0byByZXBvcnQgd2hpY2ggY29tcHJlc3NlZCBmb3JtYXRzIHRoaXMgR1BVIGFjY2VwdHMsIHNvIHRoaXMgaGFzIHRvXG4gICAgLy8gaGFwcGVuIGFmdGVyIGluaXQoKS4gR3VhcmRlZCBzbyBhIG1vZGVsIHdpdGhvdXQgS1RYMiB0ZXh0dXJlcyBzdGlsbCBsb2FkcyBpZiBpdCdzIG1pc3NpbmcuXG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGt0eDJMb2FkZXIgPSBuZXcgS1RYMkxvYWRlcigpXG4gICAgICAgICAgLnNldFRyYW5zY29kZXJQYXRoKHRoaXMua3R4MlRyYW5zY29kZXJQYXRoKVxuICAgICAgICAgIC5kZXRlY3RTdXBwb3J0KHRoaXMucmVuZGVyZXIpO1xuICAgICAgICBsb2FkZXIuc2V0S1RYMkxvYWRlcihrdHgyTG9hZGVyKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignVGhyZWVKc1NlcnZpY2U6IGNvdWxkIG5vdCBzZXQgdXAgS1RYMiB0ZXh0dXJlIHN1cHBvcnQsIGZhbGxpbmcgYmFjayB0byB1bmNvbXByZXNzZWQgdGV4dHVyZXMuJywgZXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBMZXRzIGdsdGZwYWNrL2dsdGYtdHJhbnNmb3JtIG91dHB1dCB1c2luZyBFWFRfbWVzaG9wdF9jb21wcmVzc2lvbiBsb2FkIHdpdGhvdXQgZXh0cmEgc2V0dXAuXG4gICAgbG9hZGVyLnNldE1lc2hvcHREZWNvZGVyKE1lc2hvcHREZWNvZGVyKTtcblxuICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KHRydWUpO1xuICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMCk7XG5cbiAgICAvLyBPcmRlciBtYXR0ZXJzOiBub3JtYWxzIG11c3QgZXhpc3QgYmVmb3JlIGFuaXNvdHJvcHksIGFuZCB0aGUgUGhvbmcgY29udmVyc2lvbiBoYXMgdG8gcnVuXG4gICAgLy8gYmVmb3JlIHNpZGUvZmxhdFNoYWRpbmcgYXJlIHRvdWNoZWQgc28gdGhvc2Ugc2V0dGluZ3MgbGFuZCBvbiB0aGUgbWF0ZXJpYWxzIHdlIGtlZXAuXG4gICAgY29uc3Qgb25Mb2FkZWQgPSAoZ2x0ZjogYW55KSA9PiB7XG4gICAgICB0aGlzLmNvbnZlcnRUb1Bob25nTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5mb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5lbnN1cmVWZXJ0ZXhOb3JtYWxzKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy50dW5lVGV4dHVyZVNhbXBsaW5nKGdsdGYuc2NlbmUpO1xuICAgICAgdGhpcy5wbGFjZUxvYWRlZE9iamVjdEluU2NlbmUoZ2x0Zi5zY2VuZSwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uLCB1cCk7XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgfTtcbiAgICBjb25zdCBvbkVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIC8vIENhbmNlbGxpbmcgaXMgYSBkZWNpc2lvbiwgbm90IGEgZmFpbHVyZTogY2xlYXIgdGhlIG92ZXJsYXkgd2l0aG91dCBhbiBlcnJvciBpbiB0aGUgY29uc29sZS5cbiAgICAgIGlmIChlcnJvcj8ubmFtZSA9PT0gJ0Fib3J0RXJyb3InKSB7XG4gICAgICAgIC8vIE9ubHkgYSBjYW5jZWwgb2YgdGhlIGxvYWQgdGhhdCBpcyBzdGlsbCBjdXJyZW50IGNhbWUgZnJvbSB0aGUgdXNlcjsgYW55dGhpbmcgZWxzZSBpcyB0aGlzXG4gICAgICAgIC8vIGxvYWQgaGF2aW5nIGJlZW4gc3VwZXJzZWRlZCBvciBkaXNjYXJkZWQuXG4gICAgICAgIGlmICh0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LnNpZ25hbC5hYm9ydGVkKSB7XG4gICAgICAgICAgdGhpcy5tb2RlbExvYWRDYW5jZWxsZWQkLm5leHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBHTFRGIG1vZGVsOicsIGVycm9yKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubW9kZWxMb2FkaW5nJC5uZXh0KGZhbHNlKTtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQobnVsbCk7XG4gICAgfTtcblxuICAgIC8vIEdMVEZMb2FkZXIgZGVjb2RlcyBlbWJlZGRlZCBpbWFnZXMgd2l0aCBjcmVhdGVJbWFnZUJpdG1hcCB3aGVuIHRoZSBicm93c2VyIG9mZmVycyBpdCwgYW5kIG9uXG4gICAgLy8gbGFyZ2UgdGV4dHVyZSBhdGxhc2VzIHRoYXQgcGF0aCByZXR1cm5zIHZpc2libHkgY29ycnVwdCBkYXRhIC0gc2NhdHRlcmVkIHdoaXRlIGJsb2NrcyBhY3Jvc3NcbiAgICAvLyB0aGUgbW9kZWwuIFRoZSBleGFjdCBzYW1lIGJ5dGVzIGRlY29kZWQgdGhyb3VnaCBhbiBIVE1MSW1hZ2VFbGVtZW50LCB3aGljaCBpcyB3aGF0IHRoZSAub2JqXG4gICAgLy8gcGF0aCB1c2VzIHZpYSBNVExMb2FkZXIsIGNvbWUgb3V0IGNsZWFuLiBHTFRGTG9hZGVyIGFscmVhZHkgZmFsbHMgYmFjayB0byB0aGF0IGRlY29kZXIgZm9yXG4gICAgLy8gU2FmYXJpIGFuZCBvbGRlciBGaXJlZm94OyB0aGlzIHNpbXBseSBleHRlbmRzIHRoZSBmYWxsYmFjayB0byBjb3ZlciB0aGlzIGNhc2UgdG9vLlxuICAgIC8vXG4gICAgLy8gVGhlIGRlY29kZXIgaXMgY2hvc2VuIHdoaWxlIEdMVEZQYXJzZXIgaXMgYmVpbmcgY29uc3RydWN0ZWQsIHdoaWNoIGhhcHBlbnMgc3luY2hyb25vdXNseVxuICAgIC8vIGluc2lkZSBwYXJzZSgpLCBzbyBoaWRpbmcgY3JlYXRlSW1hZ2VCaXRtYXAgb25seSBoYXMgdG8gaG9sZCBhY3Jvc3MgdGhhdCBjYWxsIHJhdGhlciB0aGFuXG4gICAgLy8gZm9yIHRoZSB3aG9sZSBkb3dubG9hZC5cbiAgICB0aGlzLmZldGNoV2l0aFByb2dyZXNzKHVybCwgY2FjaGVLZXkpXG4gICAgICAvLyBwYXJzZSgpIGhvbGRzIHRoZSBtYWluIHRocmVhZCBmb3Igc2Vjb25kcyBvbiBhIGxhcmdlIG1vZGVsLiBZaWVsZCB1bnRpbCB0aGUgYnJvd3NlciBoYXNcbiAgICAgIC8vIGFjdHVhbGx5IHBhaW50ZWQgZmlyc3QsIG90aGVyd2lzZSB0aGUgZmluYWwgcHJvZ3Jlc3MgdXBkYXRlIG5ldmVyIHJlYWNoZXMgdGhlIHNjcmVlbiBhbmRcbiAgICAgIC8vIHRoZSBiYXIgYXBwZWFycyB0byBzdGFsbCBzaG9ydCBvZiB0aGUgZW5kLlxuICAgICAgLnRoZW4oKGJ1ZmZlcikgPT4gdGhpcy5hZnRlck5leHRQYWludCgpLnRoZW4oKCkgPT4gYnVmZmVyKSlcbiAgICAgIC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgLy8gcGFyc2UoKSBjYW5ub3QgYmUgaW50ZXJydXB0ZWQsIHNvIGEgY2FuY2VsIHRoYXQgbGFuZHMgZHVyaW5nIHRoZSBwYWludCB5aWVsZCBoYXMgdG8gYmVcbiAgICAgICAgLy8gY2F1Z2h0IGhlcmUgLSB0aGUgbGFzdCBtb21lbnQgYmVmb3JlIHRoZSBtYWluIHRocmVhZCBpcyBjb21taXR0ZWQgZm9yIHNldmVyYWwgc2Vjb25kcy5cbiAgICAgICAgaWYgKHRoaXMubG9hZEFib3J0Q29udHJvbGxlcj8uc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCdNb2RlbCBsb2FkIGNhbmNlbGxlZCcsICdBYm9ydEVycm9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2xvYmFsU2NvcGUgPSBnbG9iYWxUaGlzIGFzIGFueTtcbiAgICAgICAgY29uc3Qgb3JpZ2luYWxDcmVhdGVJbWFnZUJpdG1hcCA9IGdsb2JhbFNjb3BlLmNyZWF0ZUltYWdlQml0bWFwO1xuICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2FkZXIucGFyc2UoYnVmZmVyLCB1cmwuc3Vic3RyaW5nKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSksIG9uTG9hZGVkLCBvbkVycm9yKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICBnbG9iYWxTY29wZS5jcmVhdGVJbWFnZUJpdG1hcCA9IG9yaWdpbmFsQ3JlYXRlSW1hZ2VCaXRtYXA7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAuY2F0Y2gob25FcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgdGhlIG1vZGVsIGRvd25sb2FkIGluIHByb2dyZXNzLCBpZiBhbnkuXG4gICAqXG4gICAqIE9ubHkgdGhlIGRvd25sb2FkIGNhbiBiZSBpbnRlcnJ1cHRlZDogcGFyc2UoKSBydW5zIHN5bmNocm9ub3VzbHkgYW5kIGhvbGRzIHRoZSBtYWluIHRocmVhZCB1bnRpbFxuICAgKiBpdCBmaW5pc2hlcywgc28gb25jZSBpdCBoYXMgYmVndW4gdGhlcmUgaXMgbm90aGluZyB0byBjYW5jZWwuIEluIHByYWN0aWNlIHRoZSBkb3dubG9hZCBpcyB0aGVcbiAgICogbG9uZyBwYXJ0LCB3aGljaCBpcyB3aGVyZSBzb21lb25lIHJlYWNoZXMgZm9yIHRoaXMuXG4gICAqL1xuICBjYW5jZWxNb2RlbExvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFiYW5kb25zIHRoZSBsb2FkIGluIHByb2dyZXNzIHdpdGhvdXQgcmVwb3J0aW5nIGl0IGFzIGNhbmNlbGxlZC5cbiAgICpcbiAgICogRHJvcHBpbmcgdGhlIGNvbnRyb2xsZXIgaXMgd2hhdCBtYWtlcyB0aGUgZGlmZmVyZW5jZTogb25FcnJvciB0cmVhdHMgYW4gYWJvcnQgYXMgdXNlci1pbml0aWF0ZWRcbiAgICogb25seSB3aGlsZSB0aGUgY29udHJvbGxlciB0aGF0IGFib3J0ZWQgaXMgc3RpbGwgdGhlIGN1cnJlbnQgb25lLiBUZWFyaW5nIGRvd24gb3IgcmVidWlsZGluZyB0aGVcbiAgICogc2NlbmUgaXMgbm90IHNvbWV0aGluZyB0aGUgcGVyc29uIGFza2VkIGZvciwgc28gaXQgbXVzdCBub3Qgc3VyZmFjZSBhcyBcImxvYWRpbmcgY2FuY2VsbGVkXCIuXG4gICAqL1xuICBwcml2YXRlIGRpc2NhcmRDdXJyZW50TG9hZCgpOiB2b2lkIHtcbiAgICB0aGlzLmxvYWRBYm9ydENvbnRyb2xsZXI/LmFib3J0KCk7XG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIG9uY2UgdGhlIGJyb3dzZXIgaGFzIHBhaW50ZWQgYXQgbGVhc3Qgb25lIGZyYW1lLlxuICAgKlxuICAgKiBBIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayBydW5zICpiZWZvcmUqIHRoYXQgZnJhbWUgaXMgcGFpbnRlZCwgc28gYSBzaW5nbGUgb25lIGlzIG5vdFxuICAgKiBlbm91Z2ggdG8gZ3VhcmFudGVlIHBlbmRpbmcgRE9NIGNoYW5nZXMgYXJlIG9uIHNjcmVlbjsgdGhlIHNlY29uZCBmaXJlcyBhZnRlciB0aGUgZmlyc3QgZnJhbWVcbiAgICogaGFzIGdvbmUgb3V0LiBGYWxscyBiYWNrIHRvIGEgdGltZW91dCB3aGVyZSByQUYgaXNuJ3QgYXZhaWxhYmxlIChTU1IsIHRlc3RzKS5cbiAgICovXG4gIHByaXZhdGUgYWZ0ZXJOZXh0UGFpbnQoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCAwKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiByZXNvbHZlKCkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgYSBmaWxlLCByZXBvcnRpbmcgcHJvZ3Jlc3Mgb24gbW9kZWxMb2FkUHJvZ3Jlc3MkIGFzIGl0IGFycml2ZXMuXG4gICAqXG4gICAqIEdMVEZMb2FkZXIubG9hZCgpIHdvdWxkIHJlcG9ydCBwcm9ncmVzcyB0aHJvdWdoIFhIUiwgYnV0IHRoaXMgcGF0aCBkZWxpYmVyYXRlbHkgdXNlcyBmZXRjaCgpICtcbiAgICogcGFyc2UoKSBpbnN0ZWFkIChzZWUgbG9hZEdMVEZNb2RlbCBmb3Igd2h5KSwgc28gcHJvZ3Jlc3MgaXMgcmVhZCBvZmYgdGhlIHJlc3BvbnNlIHN0cmVhbSBoZXJlLlxuICAgKiBUaGF0IGlzIGFsc28gdGhlIG1vcmUgdXNlZnVsIG51bWJlcjogb24gYSBtb2RlbCBvZiB0aGlzIHNpemUgdGhlIGRvd25sb2FkIGRvbWluYXRlcywgYW5kIHRoZVxuICAgKiBzdHJlYW0gcmVwb3J0cyBpdCBhcyBpdCBoYXBwZW5zIHJhdGhlciB0aGFuIGluIG9uZSBqdW1wIGF0IHRoZSBlbmQuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoV2l0aFByb2dyZXNzKHVybDogc3RyaW5nLCBjYWNoZUtleT86IHN0cmluZyk6IFByb21pc2U8QXJyYXlCdWZmZXI+IHtcbiAgICAvLyBBIGxvYWQgYWxyZWFkeSBydW5uaW5nIGlzIHJlcGxhY2VkLCBub3QgcmFjZWQ6IHdoaWNoZXZlciBmaW5pc2hlZCBsYXN0IHdvdWxkIG90aGVyd2lzZSB3aW4uXG4gICAgdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyPy5hYm9ydCgpO1xuICAgIHRoaXMubG9hZEFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICBjb25zdCB7IHNpZ25hbCB9ID0gdGhpcy5sb2FkQWJvcnRDb250cm9sbGVyO1xuXG4gICAgY29uc3QgY2FjaGVkID0gYXdhaXQgdGhpcy5yZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXkpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgICByZXR1cm4gY2FjaGVkO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7IHNpZ25hbCB9KTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBmZXRjaCAke3VybH06ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudExlbmd0aCA9IE51bWJlcihyZXNwb25zZS5oZWFkZXJzLmdldCgnQ29udGVudC1MZW5ndGgnKSk7XG4gICAgY29uc3QgdG90YWwgPSBOdW1iZXIuaXNGaW5pdGUoY29udGVudExlbmd0aCkgJiYgY29udGVudExlbmd0aCA+IDAgPyBjb250ZW50TGVuZ3RoIDogMDtcblxuICAgIC8vIFdpdGhvdXQgYSByZWFkYWJsZSBzdHJlYW0gKG9sZGVyIGJyb3dzZXJzLCBzb21lIHBvbHlmaWxscykgdGhlcmUgaXMgbm90aGluZyB0byBtZWFzdXJlLCBzb1xuICAgIC8vIGZhbGwgYmFjayB0byBhIHBsYWluIGJ1ZmZlcmVkIHJlYWQgYW5kIGxldCB0aGUgVUkgc2hvdyBhbiBpbmRldGVybWluYXRlIGluZGljYXRvci5cbiAgICBpZiAoIXJlc3BvbnNlLmJvZHk/LmdldFJlYWRlcikge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkuZ2V0UmVhZGVyKCk7XG5cbiAgICAvLyBXaXRoIGEga25vd24gc2l6ZSwgd3JpdGUgY2h1bmtzIHN0cmFpZ2h0IGludG8gb25lIHByZS1hbGxvY2F0ZWQgYnVmZmVyLiBDb2xsZWN0aW5nIHRoZW0gaW4gYW5cbiAgICAvLyBhcnJheSBhbmQgY29uY2F0ZW5hdGluZyBhZnRlcndhcmRzIHdvdWxkIGhvbGQgYm90aCBjb3BpZXMgYXQgb25jZSAtIG9uIGEgMTY0IE1CIG1vZGVsIHRoYXQgaXNcbiAgICAvLyBhbiBhdm9pZGFibGUgMzAwKyBNQiBwZWFrLlxuICAgIGNvbnN0IGJ1ZmZlciA9IHRvdGFsID4gMCA/IG5ldyBVaW50OEFycmF5KHRvdGFsKSA6IG51bGw7XG4gICAgY29uc3QgY2h1bmtzOiBVaW50OEFycmF5W10gPSBbXTtcbiAgICBsZXQgdXNpbmdCdWZmZXIgPSBidWZmZXIgIT09IG51bGw7XG4gICAgbGV0IHJlY2VpdmVkID0gMDtcbiAgICAvLyBDaHVua3MgYXJyaXZlIGluIHRlbnMgb2Yga2lsb2J5dGVzLCBzbyBhIDE2NCBNQiBtb2RlbCBwcm9kdWNlcyB0aG91c2FuZHMgb2YgdGhlbS4gRW1pdHRpbmcgb25cbiAgICAvLyBldmVyeSBvbmUgd291bGQgcnVuIGNoYW5nZSBkZXRlY3Rpb24ganVzdCBhcyBvZnRlbiB0byBtb3ZlIGEgYmFyIHRoYXQgaXMgbWVhc3VyZWQgaW4gd2hvbGVcbiAgICAvLyBwZXJjZW50LCBzbyBvbmx5IHJlcG9ydCB3aGVuIHRoZSBkaXNwbGF5ZWQgdmFsdWUgd291bGQgYWN0dWFsbHkgY2hhbmdlLlxuICAgIGxldCBsYXN0UmVwb3J0ZWQgPSAtMTtcblxuICAgIGlmICh0b3RhbCA9PT0gMCkge1xuICAgICAgdGhpcy5tb2RlbExvYWRQcm9ncmVzcyQubmV4dChudWxsKTtcbiAgICB9XG5cbiAgICBmb3IgKDs7KSB7XG4gICAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgICAgaWYgKGRvbmUpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoc2lnbmFsLmFib3J0ZWQpIHtcbiAgICAgICAgLy8gRnJlZSB0aGUgY29ubmVjdGlvbiByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IGRyYWluaW5nIGluIHRoZSBiYWNrZ3JvdW5kLlxuICAgICAgICBhd2FpdCByZWFkZXIuY2FuY2VsKCk7XG4gICAgICAgIHRocm93IG5ldyBET01FeGNlcHRpb24oJ01vZGVsIGxvYWQgY2FuY2VsbGVkJywgJ0Fib3J0RXJyb3InKTtcbiAgICAgIH1cbiAgICAgIGlmICh1c2luZ0J1ZmZlciAmJiByZWNlaXZlZCArIHZhbHVlLmxlbmd0aCA+IHRvdGFsKSB7XG4gICAgICAgIC8vIENvbnRlbnQtTGVuZ3RoIHVuZGVyc3RhdGVkIHRoZSByZWFsIHNpemUuIE1vdmUgd2hhdCB3ZSBoYXZlIGludG8gdGhlIGNodW5rIGxpc3QgYW5kIHN0YXlcbiAgICAgICAgLy8gdGhlcmUgZm9yIHRoZSByZXN0IG9mIHRoZSByZXNwb25zZSwgcmF0aGVyIHRoYW4gdHJ1bmNhdGluZyB0aGUgdGFpbC5cbiAgICAgICAgY2h1bmtzLnB1c2goYnVmZmVyLnNsaWNlKDAsIHJlY2VpdmVkKSk7XG4gICAgICAgIHVzaW5nQnVmZmVyID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodXNpbmdCdWZmZXIpIHtcbiAgICAgICAgYnVmZmVyLnNldCh2YWx1ZSwgcmVjZWl2ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2h1bmtzLnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgICAgcmVjZWl2ZWQgKz0gdmFsdWUubGVuZ3RoO1xuICAgICAgaWYgKHRvdGFsID4gMCkge1xuICAgICAgICBjb25zdCBwZXJjZW50ID0gTWF0aC5taW4oTWF0aC5yb3VuZCgocmVjZWl2ZWQgLyB0b3RhbCkgKiAxMDApLCAxMDApO1xuICAgICAgICBpZiAocGVyY2VudCAhPT0gbGFzdFJlcG9ydGVkKSB7XG4gICAgICAgICAgbGFzdFJlcG9ydGVkID0gcGVyY2VudDtcbiAgICAgICAgICB0aGlzLm1vZGVsTG9hZFByb2dyZXNzJC5uZXh0KHBlcmNlbnQgLyAxMDApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gVGhlIHN0cmVhbSBjYW4gZW5kIGJlbG93IHRoZSBhZHZlcnRpc2VkIHNpemUgKG9yIHdpdGggbm8gc2l6ZSBhdCBhbGwpLiBMYW5kIG9uIGEgZnVsbCBiYXJcbiAgICAvLyByYXRoZXIgdGhhbiBsZWF2aW5nIGl0IHN0dWNrIGF0IHdoYXRldmVyIHRoZSBsYXN0IGNodW5rIGhhcHBlbmVkIHRvIHJlYWNoLlxuICAgIGlmICh0b3RhbCA+IDAgJiYgbGFzdFJlcG9ydGVkICE9PSAxMDApIHtcbiAgICAgIHRoaXMubW9kZWxMb2FkUHJvZ3Jlc3MkLm5leHQoMSk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogQXJyYXlCdWZmZXI7XG4gICAgaWYgKHVzaW5nQnVmZmVyICYmIHJlY2VpdmVkID09PSB0b3RhbCkge1xuICAgICAgcmVzdWx0ID0gYnVmZmVyLmJ1ZmZlcjtcbiAgICB9IGVsc2UgaWYgKHVzaW5nQnVmZmVyKSB7XG4gICAgICAvLyBGZXdlciBieXRlcyB0aGFuIGFkdmVydGlzZWQ6IGhhbmQgYmFjayBleGFjdGx5IHdoYXQgYXJyaXZlZC5cbiAgICAgIHJlc3VsdCA9IGJ1ZmZlci5idWZmZXIuc2xpY2UoMCwgcmVjZWl2ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXJnZWQgPSBuZXcgVWludDhBcnJheShyZWNlaXZlZCk7XG4gICAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICAgIGNodW5rcy5mb3JFYWNoKChjaHVuaykgPT4ge1xuICAgICAgICBtZXJnZWQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgICAgICBvZmZzZXQgKz0gY2h1bmsubGVuZ3RoO1xuICAgICAgfSk7XG4gICAgICByZXN1bHQgPSBtZXJnZWQuYnVmZmVyO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMud3JpdGVNb2RlbFRvQ2FjaGUoY2FjaGVLZXksIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZWwgc3RvcmUsIG9yIG51bGwgd2hlcmUgdGhlIGJyb3dzZXIgd2lsbCBub3QgZ2l2ZSB1cyBvbmUuXG4gICAqXG4gICAqIENhY2hlIFN0b3JhZ2UgbmVlZHMgYSBzZWN1cmUgY29udGV4dCwgc28gaXQgaXMgYWJzZW50IG92ZXIgcGxhaW4gaHR0cCBhbmQgaW4gc29tZSBlbWJlZGRlZFxuICAgKiB3ZWJ2aWV3cy4gRXZlcnkgY2FsbGVyIHRyZWF0cyB0aGF0IGFzIGEgbWlzcyAtIGNhY2hpbmcgaXMgYW4gb3B0aW1pc2F0aW9uLCBuZXZlciBhIHJlcXVpcmVtZW50LlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBvcGVuTW9kZWxDYWNoZSgpOiBQcm9taXNlPENhY2hlIHwgbnVsbD4ge1xuICAgIGlmICh0eXBlb2YgY2FjaGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgY2FjaGVzLm9wZW4oVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEUpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEEgY2FjaGVkIGNvcHkgb2YgdGhpcyBtb2RlbCwgaWYgb25lIHdhcyBzdG9yZWQuXG4gICAqXG4gICAqIEtleWVkIGJ5IHRoZSBTMyBrZXkgcmF0aGVyIHRoYW4gdGhlIFVSTCBpdCBpcyBmZXRjaGVkIGZyb206IHRoYXQgVVJMIGlzIHNpZ25lZCwgc28gaXQgY2FycmllcyBhXG4gICAqIGZyZXNoIHNpZ25hdHVyZSBhbmQgZXhwaXJ5IGV2ZXJ5IHRpbWUgYW5kIHdvdWxkIG5ldmVyIG1hdGNoIHR3aWNlLiBUaGUgYnJvd3NlcidzIG93biBIVFRQIGNhY2hlXG4gICAqIG1pc3NlcyBmb3IgdGhlIHNhbWUgcmVhc29uLCB3aGljaCBpcyB3aHkgdGhpcyBleGlzdHMgYXQgYWxsLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZWFkTW9kZWxGcm9tQ2FjaGUoY2FjaGVLZXk/OiBzdHJpbmcpOiBQcm9taXNlPEFycmF5QnVmZmVyIHwgbnVsbD4ge1xuICAgIGlmICghY2FjaGVLZXkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgY29uc3QgY2FjaGUgPSBhd2FpdCB0aGlzLm9wZW5Nb2RlbENhY2hlKCk7XG4gICAgICBjb25zdCBoaXQgPSBhd2FpdCBjYWNoZT8ubWF0Y2godGhpcy5tb2RlbENhY2hlVXJsKGNhY2hlS2V5KSk7XG4gICAgICByZXR1cm4gaGl0ID8gYXdhaXQgaGl0LmFycmF5QnVmZmVyKCkgOiBudWxsO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqIFN0b3JlcyBhIG1vZGVsIGZvciBuZXh0IHRpbWUsIGV2aWN0aW5nIHRoZSBvbGRlc3Qgb25jZSBhIGZldyBhcmUgaGVsZC4gKi9cbiAgcHJpdmF0ZSBhc3luYyB3cml0ZU1vZGVsVG9DYWNoZShjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkLCBtb2RlbDogQXJyYXlCdWZmZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIWNhY2hlS2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBjb25zdCBjYWNoZSA9IGF3YWl0IHRoaXMub3Blbk1vZGVsQ2FjaGUoKTtcbiAgICAgIGlmICghY2FjaGUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgYXdhaXQgY2FjaGUucHV0KHRoaXMubW9kZWxDYWNoZVVybChjYWNoZUtleSksIG5ldyBSZXNwb25zZShtb2RlbCkpO1xuXG4gICAgICAvLyBNb2RlbHMgcnVuIHRvIGh1bmRyZWRzIG9mIG1lZ2FieXRlcywgc28gdGhpcyBjYW5ub3QgZ3JvdyB3aXRob3V0IGxpbWl0LiBDYWNoZSBTdG9yYWdlIGtlZXBzXG4gICAgICAvLyBpbnNlcnRpb24gb3JkZXIsIHdoaWNoIG1ha2VzIHRoZSBmcm9udCBvZiB0aGUgbGlzdCB0aGUgbGVhc3QgcmVjZW50bHkgc3RvcmVkLlxuICAgICAgY29uc3Qga2V5cyA9IGF3YWl0IGNhY2hlLmtleXMoKTtcbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgICBrZXlzLnNsaWNlKDAsIE1hdGgubWF4KDAsIGtleXMubGVuZ3RoIC0gVGhyZWVKc1NlcnZpY2UuTU9ERUxfQ0FDSEVfU0laRSkpXG4gICAgICAgICAgLm1hcCgoa2V5KSA9PiBjYWNoZS5kZWxldGUoa2V5KSlcbiAgICAgICk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBPdXQgb2YgcXVvdGEsIHByaXZhdGUgYnJvd3NpbmcsIHN0b3JhZ2UgZGlzYWJsZWQ6IHRoZSBtb2RlbCBpcyBhbHJlYWR5IGxvYWRlZCBlaXRoZXIgd2F5LlxuICAgIH1cbiAgfVxuXG4gIC8qKiBDYWNoZSBTdG9yYWdlIGtleXMgb24gYSBVUkwsIHNvIHRoZSBTMyBrZXkgaXMgZXhwcmVzc2VkIGFzIG9uZS4gSXQgaXMgbmV2ZXIgcmVxdWVzdGVkLiAqL1xuICBwcml2YXRlIG1vZGVsQ2FjaGVVcmwoY2FjaGVLZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBodHRwczovLzNkLW1vZGVsLWNhY2hlLnNtYXJ0ZXJwbGFuLmxvY2FsLyR7ZW5jb2RlVVJJQ29tcG9uZW50KGNhY2hlS2V5KX1gO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpdHMgdGhlIGNhbWVyYSdzIGNsaXBwaW5nIHBsYW5lcyB0byBob3cgYmlnIHRoZSBtb2RlbCBhY3R1YWxseSBpcy5cbiAgICpcbiAgICogRGVwdGggcHJlY2lzaW9uIGRlcGVuZHMgb24gdGhlIGZhci9uZWFyIHJhdGlvLCBhbmQgdGhlIGZpeGVkIDAuMSAvIDEwMDAwIHRoZSBjYW1lcmEgc3RhcnRzIHdpdGhcbiAgICogaXMgYSByYXRpbyBvZiAxMDAwMDAgZm9yIGEgbW9kZWwgb25seSB+MTAgdW5pdHMgYWNyb3NzLiBUaGF0IHdhc3RlcyBtb3N0IG9mIHRoZSBkZXB0aCBidWZmZXIgb25cbiAgICogZW1wdHkgc3BhY2UgYW5kIGxldHMgbmVhcmx5IGNvaW5jaWRlbnQgc3VyZmFjZXMgLSB3aGljaCBjYXB0dXJlZCBtZXNoZXMgaGF2ZSBldmVyeXdoZXJlIC1cbiAgICogZmxpY2tlciBhZ2FpbnN0IGVhY2ggb3RoZXIuXG4gICAqL1xuICBwcml2YXRlIGFkanVzdENsaXBwaW5nUGxhbmVzKHJhZGl1czogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHJhZGl1cyA8IDEwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMC4wMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDtcbiAgICB9IGVsc2UgaWYgKHJhZGl1cyA8IDEwMCkge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDAuMTtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDA7XG4gICAgfSBlbHNlIGlmIChyYWRpdXMgPCAxMDAwKSB7XG4gICAgICB0aGlzLmNhbWVyYS5uZWFyID0gMTA7XG4gICAgICB0aGlzLmNhbWVyYS5mYXIgPSAxMDAwMDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW1lcmEubmVhciA9IDEwMDtcbiAgICAgIHRoaXMuY2FtZXJhLmZhciA9IDEwMDAwMDA7XG4gICAgfVxuICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTd2FwcyB0aGUgUEJSIG1hdGVyaWFscyBHTFRGTG9hZGVyIGJ1aWxkcyBmb3IgdGhlIHBsYWluIFBob25nIG9uZXMgdGhlIC5vYmogcGF0aCBwcm9kdWNlcy5cbiAgICpcbiAgICogTWVzaFN0YW5kYXJkTWF0ZXJpYWwga2VlcHMgYSBzcGVjdWxhciByZWZsZWN0aW9uIGV2ZW4gYXQgbWV0YWxuZXNzIDAsIHNpbmNlIGV2ZXJ5IGRpZWxlY3RyaWNcbiAgICogcmVmbGVjdHMgc29tZSBsaWdodCwgYW5kIEZyZXNuZWwgZHJpdmVzIHRoYXQgcmVmbGVjdGlvbiB0b3dhcmRzIHdoaXRlIGFzIGEgc3VyZmFjZSB0dXJucyBhd2F5XG4gICAqIGZyb20gdGhlIHZpZXdlci4gT24gYW4gYWVyaWFsIHZpZXcgb2YgYSBmYWNhZGUgbW9zdCBzdXJmYWNlcyBzaXQgYXQgZXhhY3RseSB0aG9zZSBncmF6aW5nXG4gICAqIGFuZ2xlcywgd2hpY2ggcGFpbnRzIHdoaXRlIGhpZ2hsaWdodHMgb3ZlciB3aW5kb3cgZnJhbWVzIGFuZCByb29mIGVkZ2VzIC0gdGhlIHNhbWUgbW9kZWxcbiAgICogbG9hZGVkIGFzIC5vYmogbmV2ZXIgc2hvd3MgdGhlbSwgYmVjYXVzZSBNVExMb2FkZXIgYnVpbGRzIFBob25nIG1hdGVyaWFscyBhbmQgT0JKTG9hZGVyIHplcm9lc1xuICAgKiB0aGVpciBzcGVjdWxhciB3aGVuIHRoZSAubXRsIGRlY2xhcmVzIE5zIDAuXG4gICAqXG4gICAqIENhcHR1cmVkIG1vZGVscyBjYXJyeSB0aGVpciBsaWdodGluZyBpbiB0aGUgdGV4dHVyZSBhbmQgd2FudCBubyBzcGVjdWxhciByZXNwb25zZSBhdCBhbGwsIHNvXG4gICAqIG1hdGNoaW5nIHRoZSAub2JqIHBhdGggaGVyZSBpcyBib3RoIHRoZSBmaXggYW5kIHRoZSBtb3JlIGZhaXRoZnVsIGNob2ljZS5cbiAgICovXG4gIHByaXZhdGUgY29udmVydFRvUGhvbmdNYXRlcmlhbHMocm9vdDogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCBjb252ZXJ0ZWQgPSBuZXcgTWFwPGFueSwgVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw+KCk7XG5cbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY29udmVydCA9IChzb3VyY2U6IGFueSk6IGFueSA9PiB7XG4gICAgICAgIGlmICghc291cmNlIHx8ICEoc291cmNlIGFzIGFueSkuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFjb252ZXJ0ZWQuaGFzKHNvdXJjZSkpIHtcbiAgICAgICAgICBjb25zdCBwaG9uZyA9IG5ldyBUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbCh7XG4gICAgICAgICAgICBtYXA6IHNvdXJjZS5tYXAsXG4gICAgICAgICAgICBjb2xvcjogc291cmNlLmNvbG9yLFxuICAgICAgICAgICAgdHJhbnNwYXJlbnQ6IHNvdXJjZS50cmFuc3BhcmVudCxcbiAgICAgICAgICAgIG9wYWNpdHk6IHNvdXJjZS5vcGFjaXR5LFxuICAgICAgICAgICAgYWxwaGFUZXN0OiBzb3VyY2UuYWxwaGFUZXN0LFxuICAgICAgICAgICAgc2lkZTogc291cmNlLnNpZGUsXG4gICAgICAgICAgICBzcGVjdWxhcjogbmV3IFRIUkVFLkNvbG9yKDB4MDAwMDAwKSxcbiAgICAgICAgICAgIHNoaW5pbmVzczogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwaG9uZy5uYW1lID0gc291cmNlLm5hbWU7XG4gICAgICAgICAgY29udmVydGVkLnNldChzb3VyY2UsIHBob25nKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29udmVydGVkLmdldChzb3VyY2UpO1xuICAgICAgfTtcblxuICAgICAgbWVzaC5tYXRlcmlhbCA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbClcbiAgICAgICAgPyBtZXNoLm1hdGVyaWFsLm1hcChjb252ZXJ0KVxuICAgICAgICA6IGNvbnZlcnQobWVzaC5tYXRlcmlhbCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyBldmVyeSBtYXRlcmlhbCBkb3VibGUtc2lkZWQuXG4gICAqXG4gICAqIFJlYWxpdHkgY2FwdHVyZSBtZXNoZXMgcm91dGluZWx5IGNvbnRhaW4gdHJpYW5nbGVzIHdpdGggcmV2ZXJzZWQgd2luZGluZyAtIGFuIGFydGVmYWN0IG9mIHRoZVxuICAgKiByZWNvbnN0cnVjdGlvbiwgbm90IG9mIHRoZSBmaWxlLiBXaXRoIHRoZSBkZWZhdWx0IEZyb250U2lkZSB0aG9zZSB0cmlhbmdsZXMgYXJlIGN1bGxlZCwgbGVhdmluZ1xuICAgKiBzY2F0dGVyZWQgaG9sZXMgdGhhdCBzaG93IHRoZSBzY2VuZSBiYWNrZ3JvdW5kIHRocm91Z2ggdGhlIG1vZGVsLiBBZ2FpbnN0IGEgbGlnaHQgYmFja2dyb3VuZFxuICAgKiB0aGV5IHJlYWQgYXMgd2hpdGUgc3BlY2tzIHdpdGggbm8gZGlzY2VybmlibGUgcGF0dGVybi5cbiAgICpcbiAgICogRHJhd2luZyBib3RoIHNpZGVzIGNvc3RzIGEgbGl0dGxlIGZpbGwgcmF0ZSBidXQgaXMgd2hhdCBtYWtlcyBjYXB0dXJlZCBnZW9tZXRyeSByZW5kZXIgYXNcbiAgICogc29saWQ7IG90aGVyIHZpZXdlcnMgb2YgdGhpcyBraW5kIG9mIGNvbnRlbnQgZG8gdGhlIHNhbWUgdW5jb25kaXRpb25hbGx5LlxuICAgKi9cbiAgcHJpdmF0ZSBmb3JjZURvdWJsZVNpZGVkTWF0ZXJpYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8YW55PigpO1xuICAgIHJvb3QudHJhdmVyc2UoKGNoaWxkKSA9PiB7XG4gICAgICBjb25zdCBtZXNoID0gY2hpbGQgYXMgVEhSRUUuTWVzaDtcbiAgICAgIGlmICghKG1lc2ggYXMgYW55KS5pc01lc2gpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgIXNlZW4uaGFzKG1hdGVyaWFsKSkge1xuICAgICAgICAgIHNlZW4uYWRkKG1hdGVyaWFsKTtcbiAgICAgICAgICBtYXRlcmlhbC5zaWRlID0gVEhSRUUuRG91YmxlU2lkZTtcbiAgICAgICAgICBtYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXB1dGVzIHJlYWwgdmVydGV4IG5vcm1hbHMgZm9yIGFueSBnZW9tZXRyeSB0aGF0IGFycml2ZWQgd2l0aG91dCB0aGVtLlxuICAgKlxuICAgKiBBIGdsVEYgd2l0aG91dCBhIE5PUk1BTCBhdHRyaWJ1dGUgaXMgc3BlYy1jb21wbGlhbnQsIGFuZCBHTFRGTG9hZGVyIGhhbmRsZXMgaXQgYnkgc3dpdGNoaW5nIHRoZVxuICAgKiBtYXRlcmlhbCB0byBmbGF0U2hhZGluZywgd2hpY2ggbWFrZXMgdGhlIHNoYWRlciBkZXJpdmUgdGhlIG5vcm1hbCBwZXIgcGl4ZWwgZnJvbSBzY3JlZW4tc3BhY2VcbiAgICogZGVyaXZhdGl2ZXMuIFRoYXQgZGVyaXZhdGlvbiBjb2xsYXBzZXMgb24gdGhlIGRlZ2VuZXJhdGUsIG5lZWRsZS10aGluIHRyaWFuZ2xlcyB0aGF0IHJlYWxpdHlcbiAgICogY2FwdHVyZSBtZXNoZXMgYXJlIGZ1bGwgb2Y6IHRoZSBmYWNlIGhhcyBhbG1vc3Qgbm8gYXJlYSwgdGhlIGRlcml2ZWQgbm9ybWFsIGlzIG1lYW5pbmdsZXNzLCBhbmRcbiAgICogbGlnaHRpbmcgYmxvd3MgdGhvc2UgZnJhZ21lbnRzIG91dCB0byB3aGl0ZSBzcGVja3MgLSBkZW5zZXN0IGV4YWN0bHkgd2hlcmUgZmluZSBkZXRhaWwgaXMuXG4gICAqXG4gICAqIENvbXB1dGluZyBub3JtYWxzIGZyb20gdGhlIGdlb21ldHJ5IGluc3RlYWQgaXMgcm9idXN0IHRvIHRob3NlIHRyaWFuZ2xlcywgc2luY2UgYSBkZWdlbmVyYXRlXG4gICAqIGZhY2UgY29udHJpYnV0ZXMgYWxtb3N0IG5vdGhpbmcgdG8gdGhlIGF2ZXJhZ2UgYW5kIGl0cyBuZWlnaGJvdXJzIGRvbWluYXRlLlxuICAgKi9cbiAgcHJpdmF0ZSBlbnN1cmVWZXJ0ZXhOb3JtYWxzKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgcm9vdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgaWYgKCEobWVzaCBhcyBhbnkpLmlzTWVzaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBnZW9tZXRyeSA9IG1lc2guZ2VvbWV0cnkgYXMgVEhSRUUuQnVmZmVyR2VvbWV0cnk7XG4gICAgICBpZiAoZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCdub3JtYWwnKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGdlb21ldHJ5LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7XG5cbiAgICAgIC8vIEdMVEZMb2FkZXIgYWxyZWFkeSBzd2l0Y2hlZCB0aGVzZSBtYXRlcmlhbHMgdG8gZmxhdFNoYWRpbmcgYmVjYXVzZSBub3JtYWxzIHdlcmUgbWlzc2luZztcbiAgICAgIC8vIG5vdyB0aGF0IHJlYWwgb25lcyBleGlzdCwgbGV0IHRoZW0gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZXJpdmF0aXZlIGZhbGxiYWNrLlxuICAgICAgY29uc3QgbWF0ZXJpYWxzID0gQXJyYXkuaXNBcnJheShtZXNoLm1hdGVyaWFsKSA/IG1lc2gubWF0ZXJpYWwgOiBbbWVzaC5tYXRlcmlhbF07XG4gICAgICBtYXRlcmlhbHMuZm9yRWFjaCgobWF0ZXJpYWw6IGFueSkgPT4ge1xuICAgICAgICBpZiAobWF0ZXJpYWwgJiYgbWF0ZXJpYWwuZmxhdFNoYWRpbmcpIHtcbiAgICAgICAgICBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGZhbHNlO1xuICAgICAgICAgIG1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlcyBob3cgZXZlcnkgdGV4dHVyZSBpbiBhIG1vZGVsIGlzIHNhbXBsZWQ6IG1heGltdW0gYW5pc290cm9weSwgYW5kIG5vIG1pcG1hcHBpbmcuXG4gICAqXG4gICAqIFBob3RvZ3JhbW1ldHJ5IGF0bGFzZXMgcGFjayB0aGVpciBVViBpc2xhbmRzIHdpdGggdW51c2VkIGd1dHRlciBwaXhlbHMgYmV0d2VlbiB0aGVtLiBNaXBtYXBwaW5nXG4gICAqIGF2ZXJhZ2VzIG5laWdoYm91cmluZyBwaXhlbHMgYXQgZWFjaCBsZXZlbCwgc28gdGhvc2UgZ3V0dGVycyBibGVlZCBmdXJ0aGVyIGludG8gdGhlIGlzbGFuZHMgdGhlXG4gICAqIHNtYWxsZXIgdGhlIGxldmVsIGdldHMgLSBhbmQgdmlld2luZyB0aGUgd2hvbGUgbW9kZWwgYXQgb25jZSB1c2VzIHRoZSBzbWFsbGVzdCBsZXZlbHMsIHBhaW50aW5nXG4gICAqIGJyaWdodCBndXR0ZXIgcGl4ZWxzIG92ZXIgdGhlIGVkZ2VzIG9mIGZpbmUgZGV0YWlsLiBTYW1wbGluZyB0aGUgZnVsbC1yZXNvbHV0aW9uIGltYWdlIGF2b2lkc1xuICAgKiB0aGF0LCBhdCB0aGUgY29zdCBvZiBzb21lIHNoaW1tZXIgb24gbWluaWZpZWQgc3VyZmFjZXMuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBhbmlzb3Ryb3B5IG9ubHkgdGFrZXMgZWZmZWN0IHdoaWxlIG1pcG1hcHBpbmcgaXMgb24sIHNvIHdpdGggdGhlIHNldHRpbmdzIGJlbG93IGl0IGlzXG4gICAqIGluZXJ0OyBpdCBpcyBzZXQgYW55d2F5IHNvIHRoZSBzYW1wbGluZyBzdGF5cyBjb3JyZWN0IGZvciBhbnlvbmUgd2hvIHJlLWVuYWJsZXMgbWlwbWFwcyBoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSB0dW5lVGV4dHVyZVNhbXBsaW5nKHJvb3Q6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnJlbmRlcmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG1heEFuaXNvdHJvcHkgPSB0aGlzLnJlbmRlcmVyLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCk7XG4gICAgaWYgKCFtYXhBbmlzb3Ryb3B5IHx8IG1heEFuaXNvdHJvcHkgPD0gMSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNlZW4gPSBuZXcgU2V0PGFueT4oKTtcbiAgICByb290LnRyYXZlcnNlKChjaGlsZCkgPT4ge1xuICAgICAgY29uc3QgbWVzaCA9IGNoaWxkIGFzIFRIUkVFLk1lc2g7XG4gICAgICBpZiAoIShtZXNoIGFzIGFueSkuaXNNZXNoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1hdGVyaWFscyA9IEFycmF5LmlzQXJyYXkobWVzaC5tYXRlcmlhbCkgPyBtZXNoLm1hdGVyaWFsIDogW21lc2gubWF0ZXJpYWxdO1xuICAgICAgbWF0ZXJpYWxzLmZvckVhY2goKG1hdGVyaWFsOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKCFtYXRlcmlhbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTYW1lIHRleHR1cmUgaXMgcmV1c2VkIGFjcm9zcyB0aGUgbW9kZWwncyBtYXRlcmlhbHM7IG9ubHkgdG91Y2ggZWFjaCBvbmUgb25jZS5cbiAgICAgICAgWydtYXAnLCAnbm9ybWFsTWFwJywgJ3JvdWdobmVzc01hcCcsICdtZXRhbG5lc3NNYXAnLCAnZW1pc3NpdmVNYXAnLCAnYW9NYXAnXS5mb3JFYWNoKChzbG90KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGV4dHVyZSA9IG1hdGVyaWFsW3Nsb3RdO1xuICAgICAgICAgIGlmICh0ZXh0dXJlICYmICFzZWVuLmhhcyh0ZXh0dXJlKSkge1xuICAgICAgICAgICAgc2Vlbi5hZGQodGV4dHVyZSk7XG4gICAgICAgICAgICB0ZXh0dXJlLmFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5O1xuICAgICAgICAgICAgdGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSBmYWxzZTtcbiAgICAgICAgICAgIHRleHR1cmUubWluRmlsdGVyID0gVEhSRUUuTGluZWFyRmlsdGVyO1xuICAgICAgICAgICAgdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWRzIGFuIE9CSiBtb2RlbCB3aXRoIE1UTC5cbiAgICogVGhlIGhlYXZ5IHRleHQtcGFyc2luZyBzdGVwIHJ1bnMgaW4gYSBXZWIgV29ya2VyIHdoZW4gb25lIGhhcyBiZWVuIHJlZ2lzdGVyZWQgdmlhXG4gICAqIHNldE9ialBhcnNlcldvcmtlciAoc2VlIHRoZXJlIGZvciB3aHkgdGhlIGFwcCwgbm90IHRoaXMgbGlicmFyeSwgcHJvdmlkZXMgaXQpOyB0aGlzIGtlZXBzXG4gICAqIHRoZSBtYWluIHRocmVhZCBmcmVlIHdoaWxlIGxhcmdlIGFyY2hpdGVjdHVyZSBtb2RlbHMgKG1pbGxpb25zIG9mIHZlcnRpY2VzKSBhcmUgcGFyc2VkLlxuICAgKiBGYWxscyBiYWNrIHRvIHBhcnNpbmcgb24gdGhlIG1haW4gdGhyZWFkIG90aGVyd2lzZS5cbiAgICovXG4gIGxvYWRPYmpNb2RlbChtdGxVcmw6IHN0cmluZywgb2JqVXJsOiBzdHJpbmcsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSk6IHZvaWQge1xuICAgIGNvbnN0IG10bExvYWRlciA9IG5ldyBNVExMb2FkZXIoKTtcbiAgICBjb25zdCBiYXNlUGF0aCA9IG10bFVybC5zdWJzdHJpbmcoMCwgbXRsVXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTtcbiAgICBtdGxMb2FkZXIuc2V0UGF0aChiYXNlUGF0aCk7XG4gICAgY29uc3QgbXRsRmlsZU5hbWUgPSBtdGxVcmwuc3Vic3RyaW5nKG10bFVybC5sYXN0SW5kZXhPZignLycpICsgMSk7XG5cbiAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dCh0cnVlKTtcblxuICAgIG10bExvYWRlci5sb2FkKG10bEZpbGVOYW1lLCAobWF0ZXJpYWxzKSA9PiB7XG4gICAgICBtYXRlcmlhbHMucHJlbG9hZCgpO1xuXG4gICAgICBpZiAodGhpcy5vYmpQYXJzZXJXb3JrZXIpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0T2JqUGFyc2VJbldvcmtlcihvYmpVcmwpXG4gICAgICAgICAgLnRoZW4oKG1lc2hlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSBuZXcgVEhSRUUuR3JvdXAoKTtcbiAgICAgICAgICAgIG1lc2hlcy5mb3JFYWNoKChtZXNoRGF0YSkgPT4ge1xuICAgICAgICAgICAgICBncm91cC5hZGQodGhpcy5tZXNoRnJvbVBhcnNlZERhdGEobWVzaERhdGEsIG1hdGVyaWFscykpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnBsYWNlTG9hZGVkT2JqZWN0SW5TY2VuZShncm91cCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHBhcnNpbmcgT0JKIG1vZGVsIGluIHdvcmtlcjonLCBlcnJvcik7XG4gICAgICAgICAgfSlcbiAgICAgICAgICAuZmluYWxseSgoKSA9PiB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9iakxvYWRlciA9IG5ldyBPQkpMb2FkZXIoKTtcbiAgICAgIG9iakxvYWRlci5zZXRNYXRlcmlhbHMobWF0ZXJpYWxzKTtcblxuICAgICAgb2JqTG9hZGVyLmxvYWQob2JqVXJsLCAob2JqZWN0KSA9PiB7XG4gICAgICAgIHRoaXMucGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdCwgY2FtZXJhUG9zaXRpb24sIHJvdGF0aW9uKTtcbiAgICAgICAgdGhpcy5tb2RlbExvYWRpbmckLm5leHQoZmFsc2UpO1xuICAgICAgfSwgdW5kZWZpbmVkLCAoZXJyb3IpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBPQkogbW9kZWw6JywgZXJyb3IpO1xuICAgICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgICB9KTtcbiAgICB9LCB1bmRlZmluZWQsIChlcnJvcikgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgbG9hZGluZyBNVEwgZmlsZTonLCBlcnJvcik7XG4gICAgICB0aGlzLm1vZGVsTG9hZGluZyQubmV4dChmYWxzZSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQ2VudGVycywgc2NhbGVzIGFuZCBhZGRzIGEgbG9hZGVkIG9iamVjdCB0byB0aGUgc2NlbmUsIHRoZW4gZnJhbWVzIHRoZSBjYW1lcmEgb24gaXQuICovXG4gIHByaXZhdGUgcGxhY2VMb2FkZWRPYmplY3RJblNjZW5lKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIGNhbWVyYVBvc2l0aW9uPzoge3g6IG51bWJlciwgeTogbnVtYmVyLCB6OiBudW1iZXJ9LCByb3RhdGlvbj86IHt4OiBudW1iZXIsIHk6IG51bWJlciwgejogbnVtYmVyfSwgdXA/OiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIGNvbnN0IGJveCA9IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpO1xuICAgIGNvbnN0IGNlbnRlciA9IGJveC5nZXRDZW50ZXIobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3Qgc2l6ZSA9IGJveC5nZXRTaXplKG5ldyBUSFJFRS5WZWN0b3IzKCkpO1xuICAgIGNvbnN0IG1heERpbSA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgIGNvbnN0IHNjYWxlID0gbWF4RGltID4gMCA/IDEwIC8gbWF4RGltIDogMTtcblxuICAgIC8vIFR3byBuZXN0ZWQgZ3JvdXBzIHNvIHRhZ3MgY2FuIHNoYXJlIHRoZSBtb2RlbCdzIGZyYW1lOiBgY2VudGVyZWRgIGNhcnJpZXMgdGhlIG9mZnNldCB0aGF0XG4gICAgLy8gbW92ZXMgdGhlIG1vZGVsJ3Mgb3duIG9yaWdpbiB0byB0aGUgc2NlbmUgb3JpZ2luLCBgZ3JvdXBgIGNhcnJpZXMgdGhlIHNjYWxlLiBBIHRhZyBwb3NpdGlvbmVkXG4gICAgLy8gd2l0aCByYXcgUE9JIGNvb3JkaW5hdGVzIHRoZW4gbGFuZHMgaW4gdGhlIHNhbWUgcGxhY2UgdGhlIG1vZGVsJ3MgZ2VvbWV0cnkgZG9lcy5cbiAgICBjb25zdCBncm91cCA9IG5ldyBUSFJFRS5Hcm91cCgpO1xuICAgIGNvbnN0IGNlbnRlcmVkID0gbmV3IFRIUkVFLkdyb3VwKCk7XG4gICAgY2VudGVyZWQucG9zaXRpb24uc3ViKGNlbnRlcik7XG5cbiAgICBpZiAocm90YXRpb24pIHtcbiAgICAgIG9iamVjdC5yb3RhdGlvbi5zZXQocm90YXRpb24ueCwgcm90YXRpb24ueSwgcm90YXRpb24ueik7XG4gICAgfVxuICAgIC8vIFdoaWNoIHdheSBpcyB1cC4gQSBjaG9pY2Ugc29tZW9uZSBtYWRlIGJ5IGhhbmQgYWx3YXlzIHdpbnM7IG90aGVyd2lzZSwgdW5sZXNzIHRoZSBtb2RlbCBjYW1lXG4gICAgLy8gd2l0aCBhbiBvcmllbnRhdGlvbiBvZiBpdHMgb3duLCBpdCBpcyB3b3JrZWQgb3V0IGZyb20gdGhlIGdlb21ldHJ5LiBBcHBsaWVkIHRvIHRoZSBvdXRlclxuICAgIC8vIGdyb3VwLCBhYm92ZSBib3RoIHRoZSBtb2RlbCBhbmQgdGhlIHRhZ3M6IHRoZXkgdHVybiB0b2dldGhlciwgYW5kIGV2ZXJ5IGNvb3JkaW5hdGUgYWxyZWFkeVxuICAgIC8vIHN0b3JlZCAtIHRhZyBwb3NpdGlvbnMsIHRoZSBjYWxpYnJhdGlvbiAtIGtlZXBzIG1lYW5pbmcgd2hhdCBpdCBtZWFudC5cbiAgICB0aGlzLm1vZGVsR3JvdXAgPSBncm91cDtcbiAgICB0aGlzLm1vZGVsVXAgPSB1cCA/PyAocm90YXRpb24gPyAneScgOiB0aGlzLmRldGVjdE1vZGVsVXAob2JqZWN0LCBzaXplKSk7XG4gICAgZ3JvdXAucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHRoaXMubW9kZWxVcCkpO1xuXG4gICAgdGhpcy5tb2RlbFJvb3QgPSBvYmplY3Q7XG4gICAgdGhpcy5tb2RlbFdvcmxkUmFkaXVzID0gKHNpemUubGVuZ3RoKCkgLyAyKSAqIHNjYWxlO1xuICAgIC8vIFRoZSBib3ggYWJvdmUgd2FzIG1lYXN1cmVkIGJlZm9yZSBhbnkgcm90YXRpb24gZnJvbSB0aGUgbWV0YWRhdGEgd2FzIGFwcGxpZWQ7IHdpdGggb25lLCBpdFxuICAgIC8vIGhhcyB0byBiZSBtZWFzdXJlZCBhZ2FpbiB0byBiZSB0aGUgbW9kZWwgYXMgaXQgYWN0dWFsbHkgc2l0cy5cbiAgICB0aGlzLmJ1aWxkU3VyZmFjZUdyaWQob2JqZWN0LCByb3RhdGlvbiA/IG5ldyBUSFJFRS5Cb3gzKCkuc2V0RnJvbU9iamVjdChvYmplY3QpIDogYm94KTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgLy8gTWFya3MgdGhlIG1vZGVsIGZvciB0aGUgZGVwdGggcGljaywgd2hpY2ggcmVuZGVycyB0aGlzIGxheWVyIGFsb25lIC0gc28gdGFncyBhbmQgdGhlIGdob3N0XG4gICAgLy8gaXRzZWxmIGNhbm5vdCBlbmQgdXAgYmVpbmcgd2hhdCB0aGUgY3Vyc29yIHJlcG9ydHMgYXMgdGhlIHN1cmZhY2UgdW5kZXIgaXQuXG4gICAgb2JqZWN0LnRyYXZlcnNlKChjaGlsZCkgPT4gY2hpbGQubGF5ZXJzLmVuYWJsZShUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKSk7XG4gICAgY2VudGVyZWQuYWRkKG9iamVjdCk7XG4gICAgY2VudGVyZWQuYWRkKHRoaXMudGFnR3JvdXApO1xuICAgIGNlbnRlcmVkLmFkZCh0aGlzLm1vZGVsVGFnR3JvdXApO1xuICAgIGdyb3VwLmFkZChjZW50ZXJlZCk7XG4gICAgZ3JvdXAuc2NhbGUuc2V0U2NhbGFyKHNjYWxlKTtcblxuICAgIHRoaXMuc2NlbmUuYWRkKGdyb3VwKTtcblxuICAgIC8vIFRhZ3MgcmVnaXN0ZXJlZCBiZWZvcmUgdGhlIG1vZGVsIGZpbmlzaGVkIGxvYWRpbmcgd2VyZSBzaXplZCBhZ2FpbnN0IHRoZSBvbGQgc2NhbGUuXG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHNwcml0ZSkpO1xuXG4gICAgdGhpcy5hZGp1c3RDbGlwcGluZ1BsYW5lcygoc2l6ZS5sZW5ndGgoKSAvIDIpICogc2NhbGUpO1xuXG4gICAgaWYgKGNhbWVyYVBvc2l0aW9uKSB7XG4gICAgICB0aGlzLmNhbWVyYS5wb3NpdGlvbi5zZXQoY2FtZXJhUG9zaXRpb24ueCwgY2FtZXJhUG9zaXRpb24ueSwgY2FtZXJhUG9zaXRpb24ueik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2FtZXJhLnBvc2l0aW9uLnNldCgwLCA1LCAxNSk7XG4gICAgfVxuICAgIHRoaXMuY29udHJvbHMudGFyZ2V0LnNldCgwLCAwLCAwKTtcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgaXRzIHZlcnRpY2FsOiAneScgd2hlbiBpdCBhbHJlYWR5IHN0YW5kcyB1cHJpZ2h0LCBvciB3aGVuIGl0IGlzXG4gICAqIG5vdCBjbGVhciBlbm91Z2ggdG8gYWN0IG9uLlxuICAgKlxuICAgKiBNb2RlbHMgYXJyaXZlIGluIHR3byBjb252ZW50aW9uczogWSB1cCAoZ2xURiwgYW5kIHdoYXQgdGhpcyB2aWV3ZXIgYXNzdW1lcykgYW5kIFogdXAgKG1vc3QgQ0FEXG4gICAqIGFuZCBzY2FubmluZyBleHBvcnRzKS4gQSBaLXVwIG1vZGVsIGxvYWRzIGx5aW5nIG9uIGl0cyBzaWRlLiBUd28gaW5kZXBlbmRlbnQgY3VlcyBzYXkgd2hpY2hcbiAgICogYXhpcyBpcyB0aGUgdmVydGljYWwgb25lLCBhbmQgYm90aCBoYXZlIHRvIGFncmVlIGJlZm9yZSBhbnl0aGluZyBpcyB0dXJuZWQ6XG4gICAqXG4gICAqICAtIFN1cmZhY2UgYXJlYS4gRmxvb3JzIGFuZCBjZWlsaW5ncyBhbGwgZmFjZSBhbG9uZyB0aGUgdmVydGljYWwsIHdoaWxlIHdhbGxzIGFyZSBzaGFyZWQgb3V0XG4gICAqICAgIGJldHdlZW4gdGhlIHR3byBob3Jpem9udGFsIGF4ZXMsIHNvIHRoZSB2ZXJ0aWNhbCB1c3VhbGx5IGNvbGxlY3RzIHRoZSBtb3N0IGFyZWEuXG4gICAqICAtIEV4dGVudC4gQSBidWlsZGluZyBpcyBub3JtYWxseSB3aWRlciB0aGFuIGl0IGlzIHRhbGwsIHNvIHRoZSB2ZXJ0aWNhbCBpcyBpdHMgc2hvcnRlc3Qgc2lkZS5cbiAgICpcbiAgICogRWl0aGVyIGFsb25lIGlzIHdyb25nIG9mdGVuIGVub3VnaCB0byBtYXR0ZXIgLSBhIGxvbmcgY29ycmlkb3IgaGFzIG1vcmUgd2FsbCB0aGFuIGZsb29yLCBhXG4gICAqIHRvd2VyIGlzIHRhbGxlciB0aGFuIGl0IGlzIHdpZGUgLSBhbmQgdHVybmluZyBhIG1vZGVsIHRoYXQgd2FzIGZpbmUgaXMgd29yc2UgdGhhbiBsZWF2aW5nIG9uZVxuICAgKiB0aGF0IHdhcyBub3QuIEEgbW9kZWwgdGhhdCBhbHJlYWR5IGhhcyBZIGFzIGl0cyB2ZXJ0aWNhbCBpcyBuZXZlciB0b3VjaGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBkZXRlY3RNb2RlbFVwKG9iamVjdDogVEhSRUUuT2JqZWN0M0QsIHNpemU6IFRIUkVFLlZlY3RvcjMpOiBUaHJlZUpzTW9kZWxVcCB7XG4gICAgY29uc3QgYXhlcyA9IFsneCcsICd5JywgJ3onXSBhcyBjb25zdDtcbiAgICAvLyBQcm9qZWN0ZWQgYXJlYSBmYWNpbmcgZWFjaCB3YXkgYWxvbmcgZWFjaCBheGlzOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXS5cbiAgICBjb25zdCBhcmVhID0geyB4OiBbMCwgMF0sIHk6IFswLCAwXSwgejogWzAsIDBdIH07XG5cbiAgICBsZXQgdHJpYW5nbGVDb3VudCA9IDA7XG4gICAgb2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKHRydWUpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKHBvc2l0aW9uKSB7XG4gICAgICAgIHRyaWFuZ2xlQ291bnQgKz0gKGNoaWxkLmdlb21ldHJ5LmluZGV4ID8gY2hpbGQuZ2VvbWV0cnkuaW5kZXguY291bnQgOiBwb3NpdGlvbi5jb3VudCkgLyAzO1xuICAgICAgfVxuICAgIH0pO1xuICAgIGlmICh0cmlhbmdsZUNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gJ3knO1xuICAgIH1cbiAgICAvLyBBIHNhbXBsZSBpcyBwbGVudHkgdG8gc2VlIHdoZXJlIHRoZSBhcmVhIGxpZXMsIGFuZCBrZWVwcyB0aGlzIGNoZWFwIG9uIG1vZGVscyB3aXRoIG1pbGxpb25zXG4gICAgLy8gb2YgdHJpYW5nbGVzLlxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMjAwMDAwKSk7XG5cbiAgICBjb25zdCBhID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBiID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBjID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBjb25zdCBub3JtYWwgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XG4gICAgICBmb3IgKGxldCB0cmlhbmdsZSA9IDA7IHRyaWFuZ2xlIDwgY291bnQ7IHRyaWFuZ2xlICs9IHN0cmlkZSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDEpIDogb2Zmc2V0ICsgMSkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICAvLyBUaGUgY3Jvc3MgcHJvZHVjdCdzIGxlbmd0aCBpcyB0d2ljZSB0aGUgdHJpYW5nbGUncyBhcmVhLCBzbyBpdHMgY29tcG9uZW50cyBhcmUgdGhlXG4gICAgICAgIC8vIGFyZWEgdGhlIHRyaWFuZ2xlIHNob3dzIGFsb25nIGVhY2ggYXhpcy5cbiAgICAgICAgbm9ybWFsLmNyb3NzVmVjdG9ycyhiLnN1YihhKSwgYy5zdWIoYSkpO1xuICAgICAgICBheGVzLmZvckVhY2goKGF4aXMpID0+IHtcbiAgICAgICAgICBhcmVhW2F4aXNdW25vcm1hbFtheGlzXSA+PSAwID8gMCA6IDFdICs9IE1hdGguYWJzKG5vcm1hbFtheGlzXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdG90YWwgPSB7IHg6IGFyZWEueFswXSArIGFyZWEueFsxXSwgeTogYXJlYS55WzBdICsgYXJlYS55WzFdLCB6OiBhcmVhLnpbMF0gKyBhcmVhLnpbMV0gfTtcbiAgICBjb25zdCBieUFyZWEgPSBheGVzLnJlZHVjZSgoYmVzdCwgYXhpcykgPT4gKHRvdGFsW2F4aXNdID4gdG90YWxbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcbiAgICBjb25zdCBieUV4dGVudCA9IGF4ZXMucmVkdWNlKChiZXN0LCBheGlzKSA9PiAoc2l6ZVtheGlzXSA8IHNpemVbYmVzdF0gPyBheGlzIDogYmVzdCksICd5JyBhcyB0eXBlb2YgYXhlc1tudW1iZXJdKTtcbiAgICBpZiAoYnlBcmVhID09PSAneScgfHwgYnlBcmVhICE9PSBieUV4dGVudCB8fCB0b3RhbFtieUFyZWFdIDwgMS4yNSAqIHRvdGFsLnkpIHtcbiAgICAgIHJldHVybiAneSc7XG4gICAgfVxuXG4gICAgLy8gV2hpY2ggd2F5IGFsb25nIHRoYXQgYXhpcyBpcyB1cC4gUm9vZnMgYW5kIGdyb3VuZCBtYWtlIGFuIG91dGRvb3IgbW9kZWwgZmFjZSBtb3N0bHkgdXB3YXJkLFxuICAgIC8vIHdoaWNoIHNldHRsZXMgaXQ7IGluZG9vcnMgZmxvb3JzIGFuZCBjZWlsaW5ncyBiYWxhbmNlIG91dCwgYW5kIHRoZSBjb252ZW50aW9uIC0gcG9zaXRpdmUgaXNcbiAgICAvLyB1cCAtIGlzIHRoZSBiZXR0ZXIgZ3Vlc3MuXG4gICAgY29uc3QgW3Bvc2l0aXZlLCBuZWdhdGl2ZV0gPSBhcmVhW2J5QXJlYV07XG4gICAgY29uc3QgdXAgPSBgJHtuZWdhdGl2ZSA+IDAuNjUgKiAocG9zaXRpdmUgKyBuZWdhdGl2ZSkgPyAnLScgOiAnJ30ke2J5QXJlYX1gIGFzIFRocmVlSnNNb2RlbFVwO1xuICAgIGNvbnNvbGUuaW5mbyhgVGhyZWVKc1NlcnZpY2U6IHRoaXMgbW9kZWwncyB2ZXJ0aWNhbCBheGlzIGxvb2tzIGxpa2UgJHt1cH0sIG5vdCB5IC0gc3RhbmRpbmcgaXQgdXByaWdodC5gKTtcbiAgICByZXR1cm4gdXA7XG4gIH1cblxuICAvKiogVGhlIHJvdGF0aW9uIHRoYXQgYnJpbmdzIHRoZSBnaXZlbiBtb2RlbCBheGlzIHRvIHBvaW50IHVwLiAqL1xuICBwcml2YXRlIHVwcmlnaHRSb3RhdGlvbih1cDogVGhyZWVKc01vZGVsVXApOiBUSFJFRS5RdWF0ZXJuaW9uIHtcbiAgICBjb25zdCBheGlzID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICBheGlzW3VwLnJlcGxhY2UoJy0nLCAnJykgYXMgJ3gnIHwgJ3knIHwgJ3onXSA9IHVwLnN0YXJ0c1dpdGgoJy0nKSA/IC0xIDogMTtcbiAgICByZXR1cm4gbmV3IFRIUkVFLlF1YXRlcm5pb24oKS5zZXRGcm9tVW5pdFZlY3RvcnMoYXhpcywgbmV3IFRIUkVFLlZlY3RvcjMoMCwgMSwgMCkpO1xuICB9XG5cbiAgLyoqIFdoaWNoIG9mIHRoZSBtb2RlbCdzIGF4ZXMgaXMgY3VycmVudGx5IHRyZWF0ZWQgYXMgdXAsIHdoZXRoZXIgY2hvc2VuIG9yIHdvcmtlZCBvdXQuICovXG4gIGdldE1vZGVsVXAoKTogVGhyZWVKc01vZGVsVXAge1xuICAgIHJldHVybiB0aGlzLm1vZGVsVXA7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgdGhlIG1vZGVsIHNvIHRoZSBnaXZlbiBheGlzIHBvaW50cyB1cCwgYXQgb25jZS5cbiAgICpcbiAgICogVGhlIG1vZGVsIGFuZCBpdHMgdGFncyB0dXJuIGFzIG9uZSwgc28gbm90aGluZyBzdG9yZWQgaGFzIHRvIGJlIHJlY29tcHV0ZWQuIFRoZSBjYWxsZXIgaXNcbiAgICogZXhwZWN0ZWQgdG8gc3RvcmUgdGhlIGNob2ljZSwgb3IgdGhlIG5leHQgbG9hZCBnb2VzIGJhY2sgdG8gd29ya2luZyBpdCBvdXQuXG4gICAqL1xuICBzZXRNb2RlbFVwKHVwOiBUaHJlZUpzTW9kZWxVcCk6IHZvaWQge1xuICAgIHRoaXMubW9kZWxVcCA9IHVwO1xuICAgIHRoaXMubW9kZWxHcm91cD8ucXVhdGVybmlvbi5jb3B5KHRoaXMudXByaWdodFJvdGF0aW9uKHVwKSk7XG4gIH1cblxuICAvKipcbiAgICogS2VlcHMgdGhlIGRyYXdpbmcgYnVmZmVyIGFuZCBjYW1lcmEgbWF0Y2hlZCB0byB0aGUgY2FudmFzIGFzIGl0IGlzIHJlc2l6ZWQuXG4gICAqXG4gICAqIHJlbmRlcmVyLnNldFNpemUoKSB3cml0ZXMgZXhwbGljaXQgcGl4ZWwgd2lkdGgvaGVpZ2h0IGludG8gdGhlIGNhbnZhcydzIHN0eWxlLCBvdmVycmlkaW5nIHRoZVxuICAgKiAxMDAlLzEwMCUgaXQgc3RhcnRzIHdpdGguIFdpdGhvdXQgdGhpcywgdGhlIGNhbnZhcyBrZWVwcyB3aGF0ZXZlciBzaXplIGl0IGhhZCBhdCBzdGFydHVwOiBoaWRpbmdcbiAgICogdGhlIHRvcCBtZW51IGdyb3dzIHRoZSBjb250YWluZXIsIHRoZSBjYW52YXMgZG9lcyBub3QgZm9sbG93LCBhbmQgdGhlIHN0cmlwIHRoYXQgb3BlbnMgdXAgc2hvd3NcbiAgICogdGhlIHBhZ2UgYmVoaW5kIGl0IGluc3RlYWQgb2YgdGhlIHNjZW5lLlxuICAgKlxuICAgKiBUaGUgcGFyZW50IGlzIG9ic2VydmVkIHJhdGhlciB0aGFuIHRoZSBjYW52YXMsIGJlY2F1c2UgcmVzaXppbmcgdGhlIGNhbnZhcyBpcyB3aGF0IHRoaXMgcmVhY3RzXG4gICAqIHRvIC0gd2F0Y2hpbmcgdGhlIGVsZW1lbnQgd2UgcmVzaXplIHdvdWxkIHJldHJpZ2dlciB0aGUgb2JzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIG9ic2VydmVDYW52YXNSZXNpemUoY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudCk6IHZvaWQge1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IGNhbnZhcy5wYXJlbnRFbGVtZW50O1xuICAgIGlmICghY29udGFpbmVyIHx8IHR5cGVvZiBSZXNpemVPYnNlcnZlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHtcbiAgICAgIGNvbnN0IHdpZHRoID0gY29udGFpbmVyLmNsaWVudFdpZHRoO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gY29udGFpbmVyLmNsaWVudEhlaWdodDtcbiAgICAgIGlmICh3aWR0aCA9PT0gMCB8fCBoZWlnaHQgPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5jYW1lcmEuYXNwZWN0ID0gd2lkdGggLyBoZWlnaHQ7XG4gICAgICB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFNpemUod2lkdGgsIGhlaWdodCk7XG4gICAgICB0aGlzLnVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpO1xuICAgIH0pO1xuICAgIHRoaXMuY2FudmFzUmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZShjb250YWluZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyB0aGUgYWxpZ25tZW50IHdhbGt0aHJvdWdoOiBwaWNrIGEgdGFnLCB0aGVuIGNsaWNrIHdoZXJlIGl0IHJlYWxseSBpcywgdGhyZWUgdGltZXMuXG4gICAqXG4gICAqIEV4aXN0aW5nIHRhZ3MgYXJlIHRoZSBjb3JyZXNwb25kZW5jZXMgLSB0aGV5IGFscmVhZHkgY2FycnkgdGhlIHN0b3JlZCBjb29yZGluYXRlLCBzbyB0aGUgcGVyc29uXG4gICAqIG9ubHkgaGFzIHRvIHN1cHBseSB0aGUgbWF0Y2hpbmcgc3BvdCBvbiB0aGUgbW9kZWwuIE5vIG5ldyByZWNvcmRzIGFyZSB3cml0dGVuOyBub3RoaW5nIGlzXG4gICAqIGFwcGxpZWQgdW50aWwgc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKSBzdWNjZWVkcy5cbiAgICovXG4gIHN0YXJ0VGFnQWxpZ25tZW50KCk6IHZvaWQge1xuICAgIC8vIE9uZSBwb2ludGVyIG1vZGUgYXQgYSB0aW1lLCB0aGUgc2FtZSBydWxlIHN0YXJ0TWVhc3VyaW5nKCkgYXBwbGllcyB0aGUgb3RoZXIgd2F5IHJvdW5kLlxuICAgIGlmICh0aGlzLm1lYXN1cmluZykge1xuICAgICAgdGhpcy5jYW5jZWxNZWFzdXJpbmcoKTtcbiAgICB9XG4gICAgdGhpcy5hbGlnbmluZyA9IHRydWU7XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycyA9IFtdO1xuICAgIHRoaXMuYWxpZ25tZW50U291cmNlID0gbnVsbDtcbiAgICAvLyBXaGlsZSBjYWxpYnJhdGluZywgdGhlIHRhZ3MgZnJvbSBlbHNld2hlcmUgYXJlIGFsbCBzaG93biAtIGluY2x1ZGluZyB0aGUgb25lcyBvZmYgdGhlIG1vZGVsLFxuICAgIC8vIHdoaWNoIGFyZSBleGFjdGx5IHRoZSBvbmVzIGEgY2FsaWJyYXRpb24gaXMgZm9yLlxuICAgIHRoaXMucmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdjcm9zc2hhaXInO1xuICAgIH1cbiAgICB0aGlzLmFsaWdubWVudFByb2dyZXNzJC5uZXh0KHsgcGFpcnM6IDAsIGF3YWl0aW5nOiAndGFnJyB9KTtcbiAgfVxuXG4gIGNhbmNlbFRhZ0FsaWdubWVudCgpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNBbGlnbmluZyA9IHRoaXMuYWxpZ25pbmc7XG4gICAgdGhpcy5hbGlnbmluZyA9IGZhbHNlO1xuICAgIHRoaXMuYWxpZ25tZW50UGFpcnMgPSBbXTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgfVxuICAgIHRoaXMuYWxpZ25tZW50UHJvZ3Jlc3MkLm5leHQoeyBwYWlyczogMCwgYXdhaXRpbmc6IG51bGwgfSk7XG4gICAgaWYgKHdhc0FsaWduaW5nKSB7XG4gICAgICB0aGlzLmFsaWdubWVudENhbmNlbGxlZCQubmV4dCgpO1xuICAgIH1cbiAgfVxuXG4gIGlzQWxpZ25pbmdUYWdzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmFsaWduaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBvaW50ZXIgc2hvdWxkIGJlIHNob3dpbmcgdGhlIHBsYWNlbWVudCBnaG9zdC5cbiAgICpcbiAgICogVHJ1ZSB3aGlsZSBwbGFjaW5nIGEgdGFnLCBhbmQgd2hpbGUgY2FsaWJyYXRpbmcgb25jZSBhIHRhZyBoYXMgYmVlbiBwaWNrZWQgLSB0aGF0IHNlY29uZCBjbGlja1xuICAgKiBpcyB0aGUgc2FtZSBxdWVzdGlvbiAoXCJ3aGVyZSBvbiB0aGUgbW9kZWw/XCIpIGFuZCBkZXNlcnZlcyB0aGUgc2FtZSBhaW1pbmcgYWlkLiBOb3QgdHJ1ZSBmb3IgdGhlXG4gICAqIGZpcnN0IGhhbGYgb2YgYSBwYWlyLCB3aGljaCBpcyBhIGNsaWNrIG9uIGEgdGFnLCBub3Qgb24gdGhlIG1vZGVsLlxuICAgKi9cbiAgcHJpdmF0ZSBpc1ByZXZpZXdpbmdQbGFjZW1lbnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMucGxhY2luZ1RhZyB8fCB0aGlzLm1lYXN1cmluZyB8fCAodGhpcy5hbGlnbmluZyAmJiAhIXRoaXMuYWxpZ25tZW50U291cmNlKTtcbiAgfVxuXG4gIC8qKiBXaGV0aGVyIGEgdGFnIGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIGZvciB0aGlzIGVsZW1lbnQuICovXG4gIGhhc1RhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLnRhZ1Nwcml0ZXMuaGFzKGVsZW1lbnRJZCk7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyBhcmUgb24gc2hvdyAtIHRoZSBvbmVzIGEgcGVyc29uIGNvdWxkIGFjdHVhbGx5IGNsaWNrLiAqL1xuICBnZXRUYWdDb3VudCgpOiBudW1iZXIge1xuICAgIGxldCB2aXNpYmxlID0gMDtcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB7XG4gICAgICBpZiAoc3ByaXRlLnZpc2libGUpIHtcbiAgICAgICAgdmlzaWJsZSArPSAxO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2aXNpYmxlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNvbHZlcyBhbmQgYXBwbGllcyB0aGUgYWxpZ25tZW50IGNvbGxlY3RlZCBzbyBmYXIsIHJldHVybmluZyBpdCBzbyB0aGUgY2FsbGVyIGNhbiBwZXJzaXN0IGl0LlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgdGhyZWUgdGFncyB0dXJuIG91dCB0byBiZSBjb2xsaW5lYXIsIGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBhcHBsaWVkIGFuZFxuICAgKiB0aGUgd2Fsa3Rocm91Z2ggc3RheXMgb3BlbiBmb3IgdGhlIHBlcnNvbiB0byBwaWNrIGEgYmV0dGVyIHRoaXJkIHBvaW50LlxuICAgKi9cbiAgc29sdmVBbGlnbm1lbnRGcm9tUGFpcnMoKTogVGhyZWVKc0FsaWdubWVudCB8IG51bGwge1xuICAgIGNvbnN0IHVwID0gbmV3IFRIUkVFLlZlY3RvcjMoKTtcbiAgICB1cFt0aGlzLm1vZGVsVXAucmVwbGFjZSgnLScsICcnKSBhcyAneCcgfCAneScgfCAneiddID0gdGhpcy5tb2RlbFVwLnN0YXJ0c1dpdGgoJy0nKSA/IC0xIDogMTtcbiAgICBjb25zdCBhbGlnbm1lbnQgPSBzb2x2ZVRocmVlSnNBbGlnbm1lbnQodGhpcy5hbGlnbm1lbnRQYWlycywgdXApO1xuICAgIGlmICghYWxpZ25tZW50KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgLy8gT3V0IG9mIGNhbGlicmF0aW5nIG1vZGUgZmlyc3Q6IGFwcGx5aW5nIHRoZSByZXN1bHQgcmUtZGVjaWRlcyB3aGljaCB0YWdzIHNob3csIGFuZCBmcm9tIGhlcmVcbiAgICAvLyBvbiB0aGF0IGlzIHRoZSBvbmVzIG9uIHRoZSBtb2RlbCBhZ2Fpbiwgbm90IGFsbCBvZiB0aGVtLlxuICAgIHRoaXMuYWxpZ25pbmcgPSBmYWxzZTtcbiAgICB0aGlzLmFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50KTtcbiAgICB0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQgPSBudWxsO1xuICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7IHBhaXJzOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCwgYXdhaXRpbmc6IG51bGwgfSk7XG4gICAgcmV0dXJuIGFsaWdubWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGEgbmV3IGNhbGlicmF0aW9uIHdoaWxlIGtlZXBpbmcgZXZlcnkgdGFnIHBsYWNlZCBpbiB0aGlzIG1vZGVsIGV4YWN0bHkgd2hlcmUgaXQgaXMuXG4gICAqXG4gICAqIEEgY2FsaWJyYXRpb24gaXMgd29ya2VkIG91dCBmb3IgdGhlIHRhZ3MgdGhhdCBjYW1lIGZyb20gZWxzZXdoZXJlLiBUaGUgbW9kZWwncyBvd24gdGFncyB3ZXJlIHB1dFxuICAgKiB3aGVyZSB0aGV5IGFyZSBieSBzb21lb25lIGNsaWNraW5nIHRoZSBtb2RlbCwgc28gdGhleSBtdXN0IG5vdCBmb2xsb3cgaXQuIFRoZWlyIHN0b3JlZFxuICAgKiBjb29yZGluYXRlcyBhcmUgcmV3cml0dGVuIGluc3RlYWQ6IGludG8gdGhlIHNoYXJlZCBzcGFjZSBhcyB0aGUgbmV3IGNhbGlicmF0aW9uIGRlZmluZXMgaXQuXG4gICAqIFRoYXQgaXMgYWxzbyB3aGF0IG1ha2VzIHRoZW0gY29tcGFyYWJsZSB3aXRoIG90aGVyIHZpc2l0cyBmcm9tIGhlcmUgb24gLSBhIHRhZyBwbGFjZWQgYmVmb3JlXG4gICAqIHRoZSBtb2RlbCB3YXMgY2FsaWJyYXRlZCB3YXMgaW4gdGhlIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB2aXNpYmxlIG5vd2hlcmUgZWxzZS5cbiAgICpcbiAgICogVGhlIHJld3JpdHRlbiB0YWdzIGFyZSBrZXB0IGZvciB0aGUgY2FsbGVyIHRvIHN0b3JlOyBzZWUgdGFrZVJlYmFzZWRUYWdzKCkuXG4gICAqL1xuICBwcml2YXRlIGFwcGx5QWxpZ25tZW50S2VlcGluZ093blRhZ3MoYWxpZ25tZW50OiBUaHJlZUpzQWxpZ25tZW50KTogdm9pZCB7XG4gICAgY29uc3Qgb3duID0gWy4uLnRoaXMudGFnU3ByaXRlcy52YWx1ZXMoKV0uZmlsdGVyKChzcHJpdGUpID0+IHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKSk7XG4gICAgLy8gV2hlcmUgZWFjaCBvbmUgaXMgbm93LCBpbiB0aGUgc3BhY2UgdGhlIG1vZGVsIHNpdHMgaW4sIGFuZCBob3cgaXRzIHBhcmVudCB3YXMgdHVybmVkLlxuICAgIGNvbnN0IHBsYWNlZCA9IG93bi5tYXAoKHNwcml0ZSkgPT4ge1xuICAgICAgc3ByaXRlLnBhcmVudD8udXBkYXRlTWF0cml4KCk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzcHJpdGUsXG4gICAgICAgIHBvc2l0aW9uOiBzcHJpdGUucG9zaXRpb24uY2xvbmUoKS5hcHBseU1hdHJpeDQoc3ByaXRlLnBhcmVudD8ubWF0cml4ID8/IG5ldyBUSFJFRS5NYXRyaXg0KCkpLFxuICAgICAgICB0dXJuOiBzcHJpdGUucGFyZW50Py5xdWF0ZXJuaW9uLmNsb25lKCkgPz8gbmV3IFRIUkVFLlF1YXRlcm5pb24oKSxcbiAgICAgIH07XG4gICAgfSk7XG5cbiAgICB0aGlzLnNldFRhZ0FsaWdubWVudChhbGlnbm1lbnQpO1xuXG4gICAgY29uc3QgaW52ZXJzZSA9IHRoaXMudGFnR3JvdXAubWF0cml4LmNsb25lKCkuaW52ZXJ0KCk7XG4gICAgY29uc3QgdW50dXJuID0gdGhpcy50YWdHcm91cC5xdWF0ZXJuaW9uLmNsb25lKCkuaW52ZXJ0KCk7XG4gICAgdGhpcy5yZWJhc2VkVGFncyA9IHBsYWNlZC5tYXAoKHsgc3ByaXRlLCBwb3NpdGlvbiwgdHVybiB9KSA9PiB7XG4gICAgICBzcHJpdGUucG9zaXRpb24uY29weShwb3NpdGlvbi5hcHBseU1hdHJpeDQoaW52ZXJzZSkpO1xuICAgICAgc3ByaXRlLnVzZXJEYXRhLmZyYW1lID0gbnVsbDtcbiAgICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XG4gICAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcbiAgICAgIGNvbnN0IHJvdGF0aW9uID0gdW50dXJuLmNsb25lKCkubXVsdGlwbHkodHVybik7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZDogc3ByaXRlLm5hbWUsXG4gICAgICAgIHBvc2l0aW9uOiB7IHg6IHNwcml0ZS5wb3NpdGlvbi54LCB5OiBzcHJpdGUucG9zaXRpb24ueSwgejogc3ByaXRlLnBvc2l0aW9uLnogfSxcbiAgICAgICAgcm90YXRlRGlyZWN0aW9uOiAoeyB4LCB5LCB6IH0pID0+IHtcbiAgICAgICAgICBjb25zdCB0dXJuZWQgPSBuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KS5hcHBseVF1YXRlcm5pb24ocm90YXRpb24pO1xuICAgICAgICAgIHJldHVybiB7IHg6IHR1cm5lZC54LCB5OiB0dXJuZWQueSwgejogdHVybmVkLnogfTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5yZWZyZXNoVGFnVmlzaWJpbGl0eSgpO1xuICB9XG5cbiAgLyoqIEhhbmRzIG92ZXIgdGhlIHRhZ3MgdGhlIGxhc3QgY2FsaWJyYXRpb24gcmV3cm90ZSwgb25jZSwgZm9yIHRoZW0gdG8gYmUgc3RvcmVkLiAqL1xuICB0YWtlUmViYXNlZFRhZ3MoKTogVGhyZWVKc1JlYmFzZWRUYWdbXSB7XG4gICAgY29uc3QgcmViYXNlZCA9IHRoaXMucmViYXNlZFRhZ3M7XG4gICAgdGhpcy5yZWJhc2VkVGFncyA9IFtdO1xuICAgIHJldHVybiByZWJhc2VkO1xuICB9XG5cbiAgLyoqXG4gICAqIENob29zZXMgdGhlIHRhZyBmb3IgdGhlIHBhaXIgYmVpbmcgbWF0Y2hlZCBieSBpZCwgaW5zdGVhZCBvZiBieSBjbGlja2luZyBpdC5cbiAgICpcbiAgICogQ2xpY2tpbmcgYSB0YWcgc3VwcG9zZXMgaXQgY2FuIGJlIGZvdW5kLiBPbiBhIG1vZGVsIHRoYXQgaGFzIG5ldmVyIGJlZW4gY2FsaWJyYXRlZCB0aGUgdGFncyBtYXlcbiAgICogc2l0IGZhciBmcm9tIGl0LCBvciBhbGwgb24gdG9wIG9mIG9uZSBhbm90aGVyOyBhIGxpc3QgaGFzIG5laXRoZXIgcHJvYmxlbS5cbiAgICovXG4gIHNlbGVjdEFsaWdubWVudFRhZyhlbGVtZW50SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNwcml0ZSA9IHRoaXMudGFnU3ByaXRlcy5nZXQoZWxlbWVudElkKTtcbiAgICBpZiAoIXRoaXMuYWxpZ25pbmcgfHwgdGhpcy5hbGlnbm1lbnRTb3VyY2UgfHwgIXNwcml0ZSB8fCAhdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5pbmNsdWRlcyhzcHJpdGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuc2V0QWxpZ25tZW50U291cmNlKHNwcml0ZSk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHNldEFsaWdubWVudFNvdXJjZShzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgLy8gVGhlIHNwcml0ZSdzIG93biBwb3NpdGlvbiBpcyB0aGUgc3RvcmVkIGNvb3JkaW5hdGUsIHVudG91Y2hlZCBieSBhbnkgYWxpZ25tZW50IGFscmVhZHlcbiAgICAvLyBhcHBsaWVkIC0gdGhhdCB0cmFuc2Zvcm0gbGl2ZXMgb24gdGhlIGdyb3VwLCBub3Qgb24gdGhlIHNwcml0ZS5cbiAgICBjb25zdCBzdG9yZWQgPSBzcHJpdGUucG9zaXRpb247XG4gICAgdGhpcy5hbGlnbm1lbnRTb3VyY2UgPSB7IHg6IHN0b3JlZC54LCB5OiBzdG9yZWQueSwgejogc3RvcmVkLnogfTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZVRhZ0lkID0gc3ByaXRlLm5hbWU7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXG4gICAgICBhd2FpdGluZzogJ3BvaW50JyxcbiAgICAgIHRhZ0lkOiBzcHJpdGUubmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIGEgY2xpY2sgd2hpbGUgdGhlIGFsaWdubWVudCB3YWxrdGhyb3VnaCBpcyBydW5uaW5nLiAqL1xuICBwcml2YXRlIGhhbmRsZUFsaWdubWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmFsaWdubWVudFNvdXJjZSkge1xuICAgICAgLy8gRmlyc3QgaGFsZiBvZiBhIHBhaXI6IHdoaWNoIHRhZyBhcmUgd2UgdGFsa2luZyBhYm91dD9cbiAgICAgIGNvbnN0IGhpdCA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKSwgZmFsc2UpWzBdO1xuICAgICAgaWYgKCFoaXQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBbGlnbm1lbnRTb3VyY2UoaGl0Lm9iamVjdCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2Vjb25kIGhhbGY6IHdoZXJlIHRoYXQgdGFnIGFjdHVhbGx5IGJlbG9uZ3Mgb24gdGhlIG1vZGVsLlxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMucGlja0FsaWdubWVudFRhcmdldChldmVudCk7XG4gICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hbGlnbm1lbnRQYWlycy5wdXNoKHsgdGFnSWQ6IHRoaXMuYWxpZ25tZW50U291cmNlVGFnSWQsIHNvdXJjZTogdGhpcy5hbGlnbm1lbnRTb3VyY2UsIHRhcmdldCB9KTtcbiAgICB0aGlzLmFsaWdubWVudFNvdXJjZSA9IG51bGw7XG4gICAgLy8gVGhlIGdob3N0IGJlbG9uZ3MgdG8gdGhlIGNsaWNrIHRoYXQganVzdCBoYXBwZW5lZDsgdGhlIG5leHQgaGFsZiBpcyBhIGNsaWNrIG9uIGEgdGFnLlxuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5hbGlnbm1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwYWlyczogdGhpcy5hbGlnbm1lbnRQYWlycy5sZW5ndGgsXG4gICAgICAvLyBEb25lIGF0IHRocmVlLCBvciBzb29uZXIgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSB0YWdzIHRvIG1hdGNoOiBmZXdlciBwYWlycyBzdGlsbCBjYWxpYnJhdGUsXG4gICAgICAvLyBvbmx5IGxlc3MgY29tcGxldGVseS5cbiAgICAgIGF3YWl0aW5nOiB0aGlzLmFsaWdubWVudFBhaXJzLmxlbmd0aCA+PSAzIHx8IHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkubGVuZ3RoID09PSAwID8gbnVsbCA6ICd0YWcnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0YXJ0cyBhIG1lYXN1cmVtZW50OiBldmVyeSBjbGljayBvbiB0aGUgbW9kZWwgYWRkcyBhIHBvaW50LCBhbmQgZWFjaCBwYWlyIG9mIGNvbnNlY3V0aXZlXG4gICAqIHBvaW50cyBpcyBhIG1lYXN1cmVkIHNlZ21lbnQuXG4gICAqXG4gICAqIEl0IGVuZHMgdGhyb3VnaCBmaW5pc2hNZWFzdXJpbmcoKSBvciBjYW5jZWxNZWFzdXJpbmcoKSByYXRoZXIgdGhhbiBvbiBpdHMgb3duIGFmdGVyIHR3byBwb2ludHMsXG4gICAqIGJlY2F1c2UgYSBtZWFzdXJlbWVudCBtYXkgaGF2ZSBzZXZlcmFsIHNlZ21lbnRzIC0gdGhlIHNhbWUgYXMgTWF0dGVycG9ydCdzLCB3aG9zZSByZXN1bHRzIGFyZVxuICAgKiBzdG9yZWQgYXMgYSBsaXN0IG9mIGRpc3RhbmNlcy5cbiAgICovXG4gIHN0YXJ0TWVhc3VyaW5nKCk6IHZvaWQge1xuICAgIC8vIE9uZSBwb2ludGVyIG1vZGUgYXQgYSB0aW1lOiBhIGNsaWNrIGNhbm5vdCBiZSBib3RoIGEgdGFnIHBvc2l0aW9uIGFuZCBhIG1lYXN1cmVkIHBvaW50LlxuICAgIHRoaXMuY2FuY2VsVGFnUGxhY2VtZW50KCk7XG4gICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgIHRoaXMuY2FuY2VsVGFnQWxpZ25tZW50KCk7XG4gICAgfVxuICAgIHRoaXMuY2xlYXJNZWFzdXJlbWVudCgpO1xuICAgIGlmICh0aGlzLm1lYXN1cmVHcm91cC5wYXJlbnQgIT09IHRoaXMudGFnR3JvdXApIHtcbiAgICAgIHRoaXMudGFnR3JvdXAuYWRkKHRoaXMubWVhc3VyZUdyb3VwKTtcbiAgICB9XG4gICAgdGhpcy5tZWFzdXJpbmcgPSB0cnVlO1xuICAgIGlmICh0aGlzLnJlbmRlcmVyKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dCh7IHBvaW50czogMCwgZGlzdGFuY2VzOiBbXSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYmFuZG9ucyB0aGUgbWVhc3VyZW1lbnQgYW5kIHJlbW92ZXMgd2hhdCB3YXMgZHJhd24uXG4gICAqXG4gICAqIEFsc28gd2hhdCBjbGVhcnMgYSBmaW5pc2hlZCBtZWFzdXJlbWVudCBvZmYgdGhlIG1vZGVsIG9uY2UgaXRzIGZvcm0gaXMgc2F2ZWQgb3IgY2xvc2VkLCB3aGljaFxuICAgKiBpcyB3aHkgaXQgb25seSByZXBvcnRzIGFuIGFiYW5kb25tZW50IHdoZW4gb25lIHdhcyBhY3R1YWxseSBpbiBwcm9ncmVzcy5cbiAgICovXG4gIGNhbmNlbE1lYXN1cmluZygpOiB2b2lkIHtcbiAgICBjb25zdCB3YXNNZWFzdXJpbmcgPSB0aGlzLm1lYXN1cmluZztcbiAgICB0aGlzLm1lYXN1cmluZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1ByZXZpZXdFdmVudCA9IG51bGw7XG4gICAgdGhpcy5yZW1vdmVQbGFjZW1lbnRQcmV2aWV3KCk7XG4gICAgdGhpcy5jbGVhck1lYXN1cmVtZW50KCk7XG4gICAgLy8gRm9yZ290dGVuIGhlcmUgc28gdGhhdCBhIGZvcm0gb3BlbmVkIGxhdGVyIGNhbm5vdCBwaWNrIHVwIGEgbWVhc3VyZW1lbnQgYWxyZWFkeSBkZWFsdCB3aXRoLlxuICAgIHRoaXMubGFzdE1lYXN1cmVtZW50ID0gbnVsbDtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gICAgaWYgKHdhc01lYXN1cmluZykge1xuICAgICAgdGhpcy5tZWFzdXJlbWVudFByb2dyZXNzJC5uZXh0KG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbmRzIHRoZSBtZWFzdXJlbWVudCBhbmQgcmV0dXJucyBpdCwgb3IgbnVsbCB3aGVuIHRoZXJlIGFyZSBub3QgeWV0IHR3byBwb2ludHMgdG8gbWVhc3VyZVxuICAgKiBiZXR3ZWVuIC0gaW4gd2hpY2ggY2FzZSBtZWFzdXJpbmcgc2ltcGx5IGNhcnJpZXMgb24uXG4gICAqXG4gICAqIFRoZSBkcmF3aW5nIHN0YXlzIG9uIHRoZSBtb2RlbCBzbyBpdCBpcyBzdGlsbCB2aXNpYmxlIHdoaWxlIHRoZSBwZXJzb24gbmFtZXMgdGhlIG1lYXN1cmVtZW50O1xuICAgKiBjYW5jZWxNZWFzdXJpbmcoKSB0YWtlcyBpdCBhd2F5IGFmdGVyd2FyZHMuXG4gICAqL1xuICBmaW5pc2hNZWFzdXJpbmcoKTogVGhyZWVKc01lYXN1cmVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1lYXN1cmluZyB8fCB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyaW5nID0gZmFsc2U7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKG51bGwpO1xuICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG5cbiAgICB0aGlzLmxhc3RNZWFzdXJlbWVudCA9IHtcbiAgICAgIHBvaW50czogdGhpcy5tZWFzdXJlUG9pbnRzLm1hcCgocG9pbnQpID0+ICh7IHg6IHBvaW50LngsIHk6IHBvaW50LnksIHo6IHBvaW50LnogfSkpLFxuICAgICAgZGlzdGFuY2VzOiB0aGlzLm1lYXN1cmVEaXN0YW5jZXMoKSxcbiAgICAgIHNjcmVlbnNob3Q6IHRoaXMuY2FwdHVyZU1lYXN1cmVtZW50U2NyZWVuc2hvdCgpLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubGFzdE1lYXN1cmVtZW50O1xuICB9XG5cbiAgaXNNZWFzdXJpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubWVhc3VyaW5nO1xuICB9XG5cbiAgLyoqIFRoZSBtZWFzdXJlbWVudCBmaW5pc2hNZWFzdXJpbmcoKSBsYXN0IHByb2R1Y2VkLCBmb3IgdGhlIGZvcm0gdGhhdCBzYXZlcyBpdC4gKi9cbiAgZ2V0TGFzdE1lYXN1cmVtZW50KCk6IFRocmVlSnNNZWFzdXJlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmxhc3RNZWFzdXJlbWVudDtcbiAgfVxuXG4gIC8qKiBNZXRyZXMgYmV0d2VlbiBjb25zZWN1dGl2ZSBwb2ludHMuIFRhZyBzcGFjZSBpcyBpbiBtZXRyZXMsIHNvIG5vIGNvbnZlcnNpb24gaXMgaW52b2x2ZWQuICovXG4gIHByaXZhdGUgbWVhc3VyZURpc3RhbmNlcygpOiBudW1iZXJbXSB7XG4gICAgY29uc3QgZGlzdGFuY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCB0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgICBjb25zdCBkaXN0YW5jZSA9IHRoaXMubWVhc3VyZVBvaW50c1tpbmRleCAtIDFdLmRpc3RhbmNlVG8odGhpcy5tZWFzdXJlUG9pbnRzW2luZGV4XSk7XG4gICAgICAvLyBUd28gZGVjaW1hbHMsIHRoZSBwcmVjaXNpb24gTWF0dGVycG9ydCdzIG93biBtZWFzdXJlbWVudHMgYXJlIHN0b3JlZCB3aXRoLlxuICAgICAgZGlzdGFuY2VzLnB1c2goTWF0aC5yb3VuZChkaXN0YW5jZSAqIDEwMCkgLyAxMDApO1xuICAgIH1cbiAgICByZXR1cm4gZGlzdGFuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRNZWFzdXJlUG9pbnQocG9pbnQ6IFRIUkVFLlZlY3RvcjMpOiB2b2lkIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMubWVhc3VyZVBvaW50c1t0aGlzLm1lYXN1cmVQb2ludHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5tZWFzdXJlUG9pbnRzLnB1c2gocG9pbnQpO1xuXG4gICAgY29uc3QgbWFya2VyID0gbmV3IFRIUkVFLlNwcml0ZShcbiAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgIG1hcDogdGhpcy5jcmVhdGVUYWdUZXh0dXJlKFRocmVlSnNTZXJ2aWNlLk1FQVNVUkVfQ09MT1IpLFxuICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICB0cmFuc3BhcmVudDogdHJ1ZSxcbiAgICAgICAgLy8gU2l6ZWQgYWdhaW5zdCB0aGUgdmlld3BvcnQsIG5vdCB0aGUgbW9kZWw6IG1lYXN1cmluZyBpcyBkb25lIHpvb21lZCByaWdodCBpbiwgd2hlcmVcbiAgICAgICAgLy8gYW55dGhpbmcgc2l6ZWQgaW4gbWV0cmVzIHdvdWxkIGNvdmVyIHRoZSB2ZXJ5IHRoaW5nIGJlaW5nIG1lYXN1cmVkLlxuICAgICAgICBzaXplQXR0ZW51YXRpb246IGZhbHNlLFxuICAgICAgfSlcbiAgICApO1xuICAgIG1hcmtlci5zY2FsZS5zZXQoMC4wMjIsIDAuMDIyLCAxKTtcbiAgICBtYXJrZXIucG9zaXRpb24uY29weShwb2ludCk7XG4gICAgbWFya2VyLnJlbmRlck9yZGVyID0gMTAwMTtcbiAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQobWFya2VyKTtcblxuICAgIGlmIChwcmV2aW91cykge1xuICAgICAgdGhpcy5tZWFzdXJlR3JvdXAuYWRkKHRoaXMuY3JlYXRlTWVhc3VyZUxpbmUocHJldmlvdXMsIHBvaW50KSk7XG5cbiAgICAgIGNvbnN0IGRpc3RhbmNlID0gTWF0aC5yb3VuZChwcmV2aW91cy5kaXN0YW5jZVRvKHBvaW50KSAqIDEwMCkgLyAxMDA7XG4gICAgICBjb25zdCBsYWJlbCA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUoYCR7ZGlzdGFuY2UudG9GaXhlZCgyKX0gbWApLFxuICAgICAgICAgIGRlcHRoVGVzdDogZmFsc2UsXG4gICAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICAgICAgc2l6ZUF0dGVudWF0aW9uOiBmYWxzZSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICBsYWJlbC5zY2FsZS5zZXQoMC4xNSwgMC4wNSwgMSk7XG4gICAgICBsYWJlbC5wb3NpdGlvbi5jb3B5KHByZXZpb3VzKS5hZGQocG9pbnQpLm11bHRpcGx5U2NhbGFyKDAuNSk7XG4gICAgICBsYWJlbC5yZW5kZXJPcmRlciA9IDEwMDI7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQobGFiZWwpO1xuICAgIH1cblxuICAgIHRoaXMubWVhc3VyZW1lbnRQcm9ncmVzcyQubmV4dCh7XG4gICAgICBwb2ludHM6IHRoaXMubWVhc3VyZVBvaW50cy5sZW5ndGgsXG4gICAgICBkaXN0YW5jZXM6IHRoaXMubWVhc3VyZURpc3RhbmNlcygpLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc2VnbWVudCB3aXRoIGEgd2lkdGggaW4gcGl4ZWxzLlxuICAgKlxuICAgKiBXZWJHTCdzIG93biBsaW5lcyBhcmUgb25lIHBpeGVsIHdpZGUgd2hhdGV2ZXIgaXMgYXNrZWQgZm9yLCB3aGljaCBhbGwgYnV0IGRpc2FwcGVhcnMgb3ZlciBhXG4gICAqIHBob3RvZ3JhcGhpYyB0ZXh0dXJlLiBUaGlzIGtpbmQgaXMgZHJhd24gYXMgc2NyZWVuLWZhY2luZyBnZW9tZXRyeSwgc28gdGhlIHdpZHRoIGhvbGRzLlxuICAgKi9cbiAgcHJpdmF0ZSBjcmVhdGVNZWFzdXJlTGluZShmcm9tOiBUSFJFRS5WZWN0b3IzLCB0bzogVEhSRUUuVmVjdG9yMyk6IGFueSB7XG4gICAgY29uc3QgZ2VvbWV0cnkgPSBuZXcgTGluZUdlb21ldHJ5KCk7XG4gICAgZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtmcm9tLngsIGZyb20ueSwgZnJvbS56LCB0by54LCB0by55LCB0by56XSk7XG4gICAgY29uc3QgbWF0ZXJpYWwgPSBuZXcgTGluZU1hdGVyaWFsKHtcbiAgICAgIGNvbG9yOiBuZXcgVEhSRUUuQ29sb3IoVGhyZWVKc1NlcnZpY2UuTUVBU1VSRV9DT0xPUikuZ2V0SGV4KCksXG4gICAgICBsaW5ld2lkdGg6IDMsXG4gICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgfSk7XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICBtYXRlcmlhbC5yZXNvbHV0aW9uLnNldChzaXplLngsIHNpemUueSk7XG4gICAgY29uc3QgbGluZSA9IG5ldyBMaW5lMihnZW9tZXRyeSwgbWF0ZXJpYWwpO1xuICAgIGxpbmUucmVuZGVyT3JkZXIgPSAxMDAwO1xuICAgIHJldHVybiBsaW5lO1xuICB9XG5cbiAgLyoqIExpbmUgd2lkdGhzIGFyZSBpbiBwaXhlbHMsIHdoaWNoIHRoZSBtYXRlcmlhbCBjYW4gb25seSBob25vdXIgaWYgaXQga25vd3MgdGhlIGNhbnZhcyBzaXplLiAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVMaW5lUmVzb2x1dGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc2l6ZSA9IHRoaXMucmVuZGVyZXIuZ2V0U2l6ZShuZXcgVEhSRUUuVmVjdG9yMigpKTtcbiAgICB0aGlzLm1lYXN1cmVHcm91cC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQubWF0ZXJpYWw/LnJlc29sdXRpb24pIHtcbiAgICAgICAgY2hpbGQubWF0ZXJpYWwucmVzb2x1dGlvbi5zZXQoc2l6ZS54LCBzaXplLnkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFN0cmV0Y2hlcyBhIHNlZ21lbnQgZnJvbSB0aGUgbGFzdCBwb2ludCB0byB0aGUgcG9pbnRlciwgb3IgaGlkZXMgaXQgd2hlbiBnaXZlbiBudWxsLiAqL1xuICBwcml2YXRlIHVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKHRhcmdldDogVEhSRUUuVmVjdG9yMyB8IG51bGwpOiB2b2lkIHtcbiAgICBjb25zdCBsYXN0ID0gdGhpcy5tZWFzdXJlUG9pbnRzW3RoaXMubWVhc3VyZVBvaW50cy5sZW5ndGggLSAxXTtcbiAgICBpZiAoIXRoaXMubWVhc3VyaW5nIHx8ICFsYXN0IHx8ICF0YXJnZXQpIHtcbiAgICAgIGlmICh0aGlzLm1lYXN1cmVSdWJiZXJCYW5kKSB7XG4gICAgICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIXRoaXMubWVhc3VyZVJ1YmJlckJhbmQpIHtcbiAgICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQgPSB0aGlzLmNyZWF0ZU1lYXN1cmVMaW5lKGxhc3QsIHRhcmdldCk7XG4gICAgICB0aGlzLm1lYXN1cmVSdWJiZXJCYW5kLm1hdGVyaWFsLm9wYWNpdHkgPSAwLjY7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5hZGQodGhpcy5tZWFzdXJlUnViYmVyQmFuZCk7XG4gICAgfVxuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQuZ2VvbWV0cnkuc2V0UG9zaXRpb25zKFtcbiAgICAgIGxhc3QueCwgbGFzdC55LCBsYXN0LnosXG4gICAgICB0YXJnZXQueCwgdGFyZ2V0LnksIHRhcmdldC56LFxuICAgIF0pO1xuICAgIHRoaXMubWVhc3VyZVJ1YmJlckJhbmQudmlzaWJsZSA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZU1lYXN1cmVMYWJlbFRleHR1cmUodGV4dDogc3RyaW5nKTogVEhSRUUuQ2FudmFzVGV4dHVyZSB7XG4gICAgY29uc3QgY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgY2FudmFzLndpZHRoID0gMzg0O1xuICAgIGNhbnZhcy5oZWlnaHQgPSAxMjg7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29uc3QgcmFkaXVzID0gMjg7XG4gICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgwLCAwLCAwLCAwLjc4KSc7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0Lm1vdmVUbyhyYWRpdXMsIDgpO1xuICAgIGNvbnRleHQuYXJjVG8oY2FudmFzLndpZHRoIC0gOCwgOCwgY2FudmFzLndpZHRoIC0gOCwgY2FudmFzLmhlaWdodCAtIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5hcmNUbyhjYW52YXMud2lkdGggLSA4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgY2FudmFzLmhlaWdodCAtIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5hcmNUbyg4LCBjYW52YXMuaGVpZ2h0IC0gOCwgOCwgOCwgcmFkaXVzKTtcbiAgICBjb250ZXh0LmFyY1RvKDgsIDgsIGNhbnZhcy53aWR0aCAtIDgsIDgsIHJhZGl1cyk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJyNGRkZGRkYnO1xuICAgIGNvbnRleHQuZm9udCA9ICdib2xkIDYwcHggc2Fucy1zZXJpZic7XG4gICAgY29udGV4dC50ZXh0QWxpZ24gPSAnY2VudGVyJztcbiAgICBjb250ZXh0LnRleHRCYXNlbGluZSA9ICdtaWRkbGUnO1xuICAgIGNvbnRleHQuZmlsbFRleHQodGV4dCwgY2FudmFzLndpZHRoIC8gMiwgY2FudmFzLmhlaWdodCAvIDIgKyA0KTtcblxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgZXZlcnl0aGluZyBkcmF3biBmb3IgYSBtZWFzdXJlbWVudCBhbmQgZm9yZ2V0cyBpdHMgcG9pbnRzLiAqL1xuICBwcml2YXRlIGNsZWFyTWVhc3VyZW1lbnQoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMubWVhc3VyZUdyb3VwLmNoaWxkcmVuXS5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICB0aGlzLm1lYXN1cmVHcm91cC5yZW1vdmUoY2hpbGQpO1xuICAgICAgY2hpbGQuZ2VvbWV0cnk/LmRpc3Bvc2U/LigpO1xuICAgICAgY2hpbGQubWF0ZXJpYWw/Lm1hcD8uZGlzcG9zZT8uKCk7XG4gICAgICBjaGlsZC5tYXRlcmlhbD8uZGlzcG9zZT8uKCk7XG4gICAgfSk7XG4gICAgdGhpcy5tZWFzdXJlUnViYmVyQmFuZCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLm1lYXN1cmVQb2ludHMgPSBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHBpY3R1cmUgb2YgdGhlIHNjZW5lIHdpdGggdGhlIG1lYXN1cmVtZW50IG9uIGl0LCBhcyBNYXR0ZXJwb3J0IGF0dGFjaGVzIHRvIGl0cyBvd24uXG4gICAqXG4gICAqIFRhZ3MgYXJlIGxlZnQgb3V0LCBhcyB0aGV5IGFyZSB0aGVyZTogdGhlIHBpY3R1cmUgaXMgYWJvdXQgdGhlIG1lYXN1cmVtZW50LiBJdCBpcyB0YWtlbiBzdHJhaWdodFxuICAgKiBhZnRlciBhIHJlbmRlciBiZWNhdXNlIHRoZSBkcmF3aW5nIGJ1ZmZlciBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gaG9sZCB0aGUgZnJhbWUgdW50aWwgdGhlXG4gICAqIGJyb3dzZXIgcHJlc2VudHMgaXQsIGFuZCBzY2FsZWQgZG93biBzaW5jZSBpdCBpcyB1cGxvYWRlZCBhbmQgc2hvd24gYXMgYSB0aHVtYm5haWwuXG4gICAqL1xuICBwcml2YXRlIGNhcHR1cmVNZWFzdXJlbWVudFNjcmVlbnNob3QoKTogc3RyaW5nIHtcbiAgICBjb25zdCBoaWRkZW46IFRIUkVFLlNwcml0ZVtdID0gW107XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4ge1xuICAgICAgaWYgKHNwcml0ZS52aXNpYmxlKSB7XG4gICAgICAgIHNwcml0ZS52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIGhpZGRlbi5wdXNoKHNwcml0ZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLnNjZW5lLCB0aGlzLmNhbWVyYSk7XG4gICAgY29uc3Qgc291cmNlID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50O1xuICAgIGNvbnN0IHNjYWxlID0gTWF0aC5taW4oMSwgODAwIC8gc291cmNlLndpZHRoLCA2MDAgLyBzb3VyY2UuaGVpZ2h0KTtcbiAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICBjYW52YXMud2lkdGggPSBNYXRoLm1heCgxLCBNYXRoLnJvdW5kKHNvdXJjZS53aWR0aCAqIHNjYWxlKSk7XG4gICAgY2FudmFzLmhlaWdodCA9IE1hdGgubWF4KDEsIE1hdGgucm91bmQoc291cmNlLmhlaWdodCAqIHNjYWxlKSk7XG4gICAgY2FudmFzLmdldENvbnRleHQoJzJkJykuZHJhd0ltYWdlKHNvdXJjZSwgMCwgMCwgY2FudmFzLndpZHRoLCBjYW52YXMuaGVpZ2h0KTtcblxuICAgIGhpZGRlbi5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIHNwcml0ZS52aXNpYmxlID0gdHJ1ZTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycsIDAuODUpO1xuICB9XG5cbiAgLyoqIEFybXMgdGFnIHBsYWNlbWVudDogdGhlIG5leHQgY2xpY2sgb24gdGhlIG1vZGVsIGRyb3BzIGEgdGFnIGluc3RlYWQgb2YgYmVpbmcgaWdub3JlZC4gKi9cbiAgc3RhcnRUYWdQbGFjZW1lbnQocG9pVHlwZTogUG9pVHlwZSB8IG51bGwgPSBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5wbGFjaW5nVGFnID0gdHJ1ZTtcbiAgICB0aGlzLnBsYWNlbWVudFBvaVR5cGUgPSBwb2lUeXBlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgaWYgKHRoaXMucmVuZGVyZXIpIHtcbiAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnY3Jvc3NoYWlyJztcbiAgICB9XG4gIH1cblxuICAvKiogTGVhdmVzIHBsYWNlbWVudCBtb2RlIHdpdGhvdXQgcGxhY2luZyBhbnl0aGluZy4gKi9cbiAgY2FuY2VsVGFnUGxhY2VtZW50KCk6IHZvaWQge1xuICAgIHRoaXMucGxhY2luZ1RhZyA9IGZhbHNlO1xuICAgIHRoaXMucGVuZGluZ1RhZ1BsYWNlbWVudCA9IG51bGw7XG4gICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdkZWZhdWx0JztcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2hvd3MgYSB0cmFuc2x1Y2VudCB0YWcgdW5kZXIgdGhlIGN1cnNvciB3aGlsZSBwbGFjaW5nLCBzbyB0aGUgc3BvdCBpcyB2aXNpYmxlIGJlZm9yZSBjb21taXRpbmcuXG4gICAqXG4gICAqIE1hdHRlcnBvcnQgZG9lcyB0aGlzIHdpdGggYSB0YWcgdGhhdCBmb2xsb3dzIHRoZSBwb2ludGVyOyB0aGUgZXF1aXZhbGVudCBoZXJlIGlzIGEgcHJldmlld1xuICAgKiBzcHJpdGUgdGhhdCBnZXRzIHJlbW92ZWQgdGhlIG1vbWVudCB0aGUgcmVhbCB0YWcgdGFrZXMgaXRzIHBsYWNlLlxuICAgKi9cbiAgcHJpdmF0ZSB1cGRhdGVQbGFjZW1lbnRQcmV2aWV3KGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLnBpY2tQb2ludE9uR3B1KGV2ZW50KTtcbiAgICBpZiAoIXBvc2l0aW9uKSB7XG4gICAgICB0aGlzLnJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTtcbiAgICAgIHRoaXMudXBkYXRlTWVhc3VyZVJ1YmJlckJhbmQobnVsbCk7XG4gICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ25vdC1hbGxvd2VkJztcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ2Nyb3NzaGFpcic7XG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcbiAgICAgIHRoaXMucGxhY2VtZW50UHJldmlldyA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICAgIG5ldyBUSFJFRS5TcHJpdGVNYXRlcmlhbCh7XG4gICAgICAgICAgbWFwOiB0aGlzLmNyZWF0ZVRhZ1RleHR1cmUoJyM5RTlFOUUnKSxcbiAgICAgICAgICBkZXB0aFRlc3Q6IGZhbHNlLFxuICAgICAgICAgIHRyYW5zcGFyZW50OiB0cnVlLFxuICAgICAgICAgIG9wYWNpdHk6IDAuNixcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcucmVuZGVyT3JkZXIgPSA5OTk7XG4gICAgICB0aGlzLnRhZ0dyb3VwLmFkZCh0aGlzLnBsYWNlbWVudFByZXZpZXcpO1xuICAgICAgdGhpcy5zY2FsZVRhZ0Zvck1vZGVsKHRoaXMucGxhY2VtZW50UHJldmlldyk7XG4gICAgfVxuICAgIHRoaXMucGxhY2VtZW50UHJldmlldy5wb3NpdGlvbi5jb3B5KHBvc2l0aW9uKTtcbiAgICB0aGlzLnVwZGF0ZU1lYXN1cmVSdWJiZXJCYW5kKHBvc2l0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcG9pbnQgdW5kZXIgdGhlIGN1cnNvciwgcmVhZCBmcm9tIHRoZSBkZXB0aCBidWZmZXIgaW5zdGVhZCBvZiByYXljYXN0LCBpbiB0YWcgc3BhY2UuXG4gICAqXG4gICAqIEEgcmF5Y2FzdCB3YWxrcyBldmVyeSB0cmlhbmdsZSBvZiB0aGUgbWVzaCBpdCBoaXRzOiBvbiBhIGNhcHR1cmVkIG1vZGVsIHRoYXQgaXMgbWlsbGlvbnMgb2ZcbiAgICogdGhlbSwgdGVucyBvZiBtaWxsaXNlY29uZHMsIGV2ZXJ5IHRpbWUgdGhlIHBvaW50ZXIgbW92ZXMuIENvYWxlc2NpbmcgdG8gb25lIHBlciBmcmFtZSBkaWQgbm90XG4gICAqIGhlbHAsIGJlY2F1c2UgdGhlIGNvc3QgaXMgdGhlIHBpY2sgaXRzZWxmIC0gaXQgc2ltcGx5IGJlY2FtZSBvbmUgc2xvdyBmcmFtZSBpbnN0ZWFkIG9mIHNldmVyYWwuXG4gICAqXG4gICAqIFJlbmRlcmluZyB0aGUgbW9kZWwncyBkZXB0aCBpbnRvIGEgc2luZ2xlIHBpeGVsIHVuZGVyIHRoZSBjdXJzb3IgYW5zd2VycyB0aGUgc2FtZSBxdWVzdGlvbiBvblxuICAgKiB0aGUgR1BVIGluIGNvbnN0YW50IHRpbWUsIHdoYXRldmVyIHRoZSBtb2RlbCdzIHNpemUuIFRoZSBjYW1lcmEncyB2aWV3IG9mZnNldCBpcyB3aGF0IG5hcnJvd3NcbiAgICogdGhlIHdob2xlIGltYWdlIGRvd24gdG8gdGhhdCBvbmUgcGl4ZWwsIHNvIHRoZSB2YWx1ZSByZWFkIGJhY2sgaXMgdGhlIGRlcHRoIHRoZSBjdXJzb3IgaXMgb3Zlci5cbiAgICpcbiAgICogVXNlZCBmb3IgdGhlIGdob3N0IG9ubHkuIFRoZSBjbGljayB0aGF0IGFjdHVhbGx5IHBsYWNlcyBhIHRhZyBzdGlsbCByYXljYXN0czogaXQgaXMgb25lIHBpY2ssXG4gICAqIGl0cyBjb3N0IGRvZXMgbm90IG1hdHRlciwgYW5kIGl0IHlpZWxkcyB0aGUgc3VyZmFjZSBub3JtYWwsIHdoaWNoIGRlcHRoIGFsb25lIGNhbm5vdCBnaXZlLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrUG9pbnRPbkdwdShldmVudDogTW91c2VFdmVudCk6IFRIUkVFLlZlY3RvcjMgfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kZWxSb290IHx8ICF0aGlzLnJlbmRlcmVyIHx8ICF0aGlzLmNhbWVyYSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnBpY2tUYXJnZXQpIHtcbiAgICAgIHRoaXMucGlja1RhcmdldCA9IG5ldyBUSFJFRS5XZWJHTFJlbmRlclRhcmdldCgxLCAxKTtcbiAgICAgIHRoaXMucGlja0NhbWVyYSA9IG5ldyBUSFJFRS5QZXJzcGVjdGl2ZUNhbWVyYSgpO1xuICAgICAgdGhpcy5waWNrQ2FtZXJhLmxheWVycy5zZXQoVGhyZWVKc1NlcnZpY2UuUElDS19MQVlFUik7XG4gICAgICB0aGlzLnBpY2tEZXB0aE1hdGVyaWFsID0gbmV3IFRIUkVFLk1lc2hEZXB0aE1hdGVyaWFsKHtcbiAgICAgICAgZGVwdGhQYWNraW5nOiBUSFJFRS5SR0JBRGVwdGhQYWNraW5nLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBjb25zdCB4ID0gZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICBjb25zdCB5ID0gZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wO1xuICAgIGlmICh4IDwgMCB8fCB5IDwgMCB8fCB4ID4gcmVjdC53aWR0aCB8fCB5ID4gcmVjdC5oZWlnaHQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMucGlja0NhbWVyYS5jb3B5KHRoaXMuY2FtZXJhKTtcbiAgICB0aGlzLnBpY2tDYW1lcmEubGF5ZXJzLnNldChUaHJlZUpzU2VydmljZS5QSUNLX0xBWUVSKTtcbiAgICAvLyBSZW5kZXJzIHRoZSBvbmUgcGl4ZWwgdGhlIGN1cnNvciBpcyBvdmVyIGFzIGlmIGl0IHdlcmUgdGhlIHdob2xlIGltYWdlIC0gb2Zmc2V0IGJ5IGhhbGYgYVxuICAgIC8vIHBpeGVsIHNvIHRoZSBjdXJzb3Igc2l0cyBhdCB0aGF0IHBpeGVsJ3MgY2VudHJlLCB3aGljaCBpcyB3aGVyZSBOREMgKDAsIDApIGxhbmRzLlxuICAgIHRoaXMucGlja0NhbWVyYS5zZXRWaWV3T2Zmc2V0KHJlY3Qud2lkdGgsIHJlY3QuaGVpZ2h0LCB4IC0gMC41LCB5IC0gMC41LCAxLCAxKTtcblxuICAgIC8vIFdoZXJlIHRoZSBtb2RlbCBpcyBub3QsIHRoZSBwaXhlbCBtdXN0IHJlYWQgYXMgXCJub3RoaW5nXCIsIHNvIGl0IGlzIGNsZWFyZWQgdG8gd2hpdGUgLSBhIHZhbHVlXG4gICAgLy8gbm8gcmVhbCBkZXB0aCBwYWNrcyB0by4gVHdvIHRoaW5ncyB3b3VsZCBvdGhlcndpc2UgcGFpbnQgb3ZlciB0aGF0OiB0aGUgZGVmYXVsdCBibGFjayBjbGVhcixcbiAgICAvLyB3aGljaCBkZWNvZGVzIGFzIGRlcHRoIDAgKGEgaGl0IGFnYWluc3QgdGhlIGxlbnMpLCBhbmQgdGhlIHNjZW5lIGJhY2tncm91bmQsIHdoaWNoIHRocmVlLmpzXG4gICAgLy8gZHJhd3MgaW4gcGxhY2Ugb2YgdGhlIGNsZWFyIGNvbG91ciB3aGVuZXZlciBvbmUgaXMgc2V0LlxuICAgIGNvbnN0IHByZXZpb3VzQ2xlYXJDb2xvciA9IHRoaXMucmVuZGVyZXIuZ2V0Q2xlYXJDb2xvcihuZXcgVEhSRUUuQ29sb3IoKSk7XG4gICAgY29uc3QgcHJldmlvdXNDbGVhckFscGhhID0gdGhpcy5yZW5kZXJlci5nZXRDbGVhckFscGhhKCk7XG4gICAgY29uc3QgcHJldmlvdXNUYXJnZXQgPSB0aGlzLnJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpO1xuICAgIGNvbnN0IHByZXZpb3VzQmFja2dyb3VuZCA9IHRoaXMuc2NlbmUuYmFja2dyb3VuZDtcblxuICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IG51bGw7XG4gICAgdGhpcy5zY2VuZS5vdmVycmlkZU1hdGVyaWFsID0gdGhpcy5waWNrRGVwdGhNYXRlcmlhbDtcbiAgICB0aGlzLnJlbmRlcmVyLnNldENsZWFyQ29sb3IoMHhmZmZmZmYsIDEpO1xuICAgIHRoaXMucmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KHRoaXMucGlja1RhcmdldCk7XG4gICAgdGhpcy5yZW5kZXJlci5jbGVhcigpO1xuICAgIHRoaXMucmVuZGVyZXIucmVuZGVyKHRoaXMuc2NlbmUsIHRoaXMucGlja0NhbWVyYSk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHModGhpcy5waWNrVGFyZ2V0LCAwLCAwLCAxLCAxLCB0aGlzLnBpY2tQaXhlbCk7XG5cbiAgICB0aGlzLnJlbmRlcmVyLnNldFJlbmRlclRhcmdldChwcmV2aW91c1RhcmdldCk7XG4gICAgdGhpcy5yZW5kZXJlci5zZXRDbGVhckNvbG9yKHByZXZpb3VzQ2xlYXJDb2xvciwgcHJldmlvdXNDbGVhckFscGhhKTtcbiAgICB0aGlzLnNjZW5lLm92ZXJyaWRlTWF0ZXJpYWwgPSBudWxsO1xuICAgIHRoaXMuc2NlbmUuYmFja2dyb3VuZCA9IHByZXZpb3VzQmFja2dyb3VuZDtcblxuICAgIGNvbnN0IFtyLCBnLCBiLCBhXSA9IHRoaXMucGlja1BpeGVsO1xuICAgIGlmIChyID09PSAyNTUgJiYgZyA9PT0gMjU1ICYmIGIgPT09IDI1NSAmJiBhID09PSAyNTUpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSBpbnZlcnNlIG9mIHRocmVlJ3MgcGFja0RlcHRoVG9SR0JBLCB3aGljaCBzdG9yZXMgdGhlIHZhbHVlIGl0c2VsZiBpbiBhbHBoYSBhbmQgZXZlciBmaW5lclxuICAgIC8vIGZyYWN0aW9ucyBvZiBpdCBpbiBibHVlLCBncmVlbiBhbmQgcmVkIC0gYWxwaGEgaXMgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSwgbm90IHJlZC4gUmVhZCB0aGVcbiAgICAvLyBvdGhlciB3YXkgcm91bmQsIHRoZSByZXN1bHQgaXMgbW9zdGx5IHRoZSBsb3ctb3JkZXIgbm9pc2UsIG9mdGVuIG5lYXIgemVybywgd2hpY2ggdW5wcm9qZWN0c1xuICAgIC8vIG9udG8gdGhlIG5lYXIgcGxhbmU6IGEgZ2hvc3QgcHJlc3NlZCBhZ2FpbnN0IHRoZSBsZW5zLCBmaWxsaW5nIHRoZSB3aG9sZSBzY3JlZW4uXG4gICAgY29uc3QgZG93bnNjYWxlID0gMjU1IC8gMjU2O1xuICAgIGNvbnN0IGRlcHRoID1cbiAgICAgIChyIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYgKiAyNTYpICtcbiAgICAgIChnIC8gMjU1KSAqIGRvd25zY2FsZSAvICgyNTYgKiAyNTYpICtcbiAgICAgIChiIC8gMjU1KSAqIGRvd25zY2FsZSAvIDI1NiArXG4gICAgICAoYSAvIDI1NSkgKiBkb3duc2NhbGU7XG5cbiAgICAvLyBOREMgeCBhbmQgeSBhcmUgemVybyBiZWNhdXNlIHRoZSBwaXhlbCByZWFkIGlzIHRoZSBjZW50cmUgb2YgdGhhdCBvbmUtcGl4ZWwgaW1hZ2UgLSB3aGljaCBvbmx5XG4gICAgLy8gaG9sZHMgd2hpbGUgdGhlIHZpZXcgb2Zmc2V0IGlzIGluIGVmZmVjdC4gQ2xlYXJpbmcgaXQgZmlyc3Qgd291bGQgdW5wcm9qZWN0IHRocm91Z2ggdGhlIGZ1bGxcbiAgICAvLyB2aWV3IGluc3RlYWQsIGxhbmRpbmcgdGhlIHBvaW50IG9uIHRoZSByYXkgdGhyb3VnaCB0aGUgbWlkZGxlIG9mIHRoZSBzY3JlZW4uIFRoZSBvZmZzZXQgaXNcbiAgICAvLyBzaW1wbHkgcmVwbGFjZWQgYnkgdGhlIG5leHQgcGljaywgc28gaXQgaXMgbmV2ZXIgY2xlYXJlZC5cbiAgICBjb25zdCB3b3JsZCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDAsIGRlcHRoICogMiAtIDEpLnVucHJvamVjdCh0aGlzLnBpY2tDYW1lcmEpO1xuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIHJldHVybiB0aGlzLnRhZ0dyb3VwLndvcmxkVG9Mb2NhbCh3b3JsZCk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVBsYWNlbWVudFByZXZpZXcoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnBsYWNlbWVudFByZXZpZXcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy50YWdHcm91cC5yZW1vdmUodGhpcy5wbGFjZW1lbnRQcmV2aWV3KTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcubWF0ZXJpYWwubWFwPy5kaXNwb3NlKCk7XG4gICAgdGhpcy5wbGFjZW1lbnRQcmV2aWV3Lm1hdGVyaWFsLmRpc3Bvc2UoKTtcbiAgICB0aGlzLnBsYWNlbWVudFByZXZpZXcgPSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogU2hvd3Mgb3IgaGlkZXMgb25lIHRhZywgbGVhdmluZyBpdCByZWdpc3RlcmVkIHNvIGl0IGNhbiBiZSBicm91Z2h0IGJhY2sgd2l0aG91dCByZWxvYWRpbmcuICovXG4gIHNldFRhZ1Zpc2liaWxpdHkoZWxlbWVudElkOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKHNwcml0ZSkge1xuICAgICAgc3ByaXRlLnZpc2libGUgPSB2aXNpYmxlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTaG93cyBvbmx5IHRhZ3Mgb2YgdGhlIGdpdmVuIHR5cGVzLCBoaWRpbmcgdGhlIHJlc3QuXG4gICAqXG4gICAqIFBhc3NpbmcgbnVsbCBzaG93cyBldmVyeXRoaW5nIC0gdGhlIFwibm8gZmlsdGVyXCIgc3RhdGUsIGRpc3RpbmN0IGZyb20gYW4gZW1wdHkgYXJyYXksIHdoaWNoIGlzIGFcbiAgICogZmlsdGVyIHRoYXQgaGFwcGVucyB0byBtYXRjaCBub3RoaW5nLlxuICAgKi9cbiAgc2V0VmlzaWJsZVRhZ1R5cGVzKHR5cGVzOiBQb2lUeXBlW10gfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy52aXNpYmxlVGFnVHlwZXMgPSB0eXBlcztcbiAgICB0aGlzLnRhZ1Nwcml0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpKTtcbiAgfVxuXG4gIC8qKiBTYXlzIHdoaWNoIGNhcHR1cmUgaXMgb24gc2NyZWVuLCBzbyB0aGUgdGFncyBwbGFjZWQgaW4gaXQgY2FuIGJlIHRvbGQgZnJvbSB0aGUgcmVzdC4gKi9cbiAgc2V0Q3VycmVudENhcHR1cmUoY2FwdHVyZUlEOiBzdHJpbmcgfCBudWxsKTogdm9pZCB7XG4gICAgdGhpcy5jdXJyZW50Q2FwdHVyZUlEID0gY2FwdHVyZUlEO1xuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHtcbiAgICAgIHRoaXMucGFyZW50VGFnKHNwcml0ZSk7XG4gICAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEV2ZXJ5IHRhZyByZWdpc3RlcmVkIGluIHRoZSBzY2VuZSwgc2hvd24gb3Igbm90LiAqL1xuICBnZXRUYWdzKCk6IHtcbiAgICBpZDogc3RyaW5nO1xuICAgIGxhYmVsOiBzdHJpbmcgfCBudWxsO1xuICAgIHBvaVR5cGU6IFBvaVR5cGUgfCBudWxsO1xuICAgIHZpc2libGU6IGJvb2xlYW47XG4gICAgLyoqIFdoZXRoZXIgdGhlIGNhbGlicmF0aW9uIHdhbGt0aHJvdWdoIGNhbiB1c2UgaXQuICovXG4gICAgY2FsaWJyYXRhYmxlOiBib29sZWFuO1xuICB9W10ge1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSBuZXcgU2V0KHRoaXMuY2FsaWJyYXRpb25DYW5kaWRhdGVzKCkpO1xuICAgIHJldHVybiBbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXS5tYXAoKHNwcml0ZSkgPT4gKHtcbiAgICAgIGlkOiBzcHJpdGUubmFtZSxcbiAgICAgIGxhYmVsOiBzcHJpdGUudXNlckRhdGEubGFiZWwgPz8gbnVsbCxcbiAgICAgIHBvaVR5cGU6IHNwcml0ZS51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwsXG4gICAgICB2aXNpYmxlOiBzcHJpdGUudmlzaWJsZSxcbiAgICAgIGNhbGlicmF0YWJsZTogY2FuZGlkYXRlcy5oYXMoc3ByaXRlKSxcbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogSG93IGZhciB0aGUgdGFncyBmcm9tIGVsc2V3aGVyZSBzaXQgZnJvbSB0aGUgbW9kZWwsIG1lYXN1cmVkIGluIG1vZGVsIHJhZGlpLiBOdWxsIHdpdGhvdXQgYm90aC5cbiAgICpcbiAgICogQmVmb3JlIGEgbW9kZWwgaXMgY2FsaWJyYXRlZCB0aG9zZSB0YWdzIGFyZSB3aGVyZXZlciB0aGVpciBvd24gY29vcmRpbmF0ZXMgcHV0IHRoZW0sIHdoaWNoIGZvclxuICAgKiBhIG1vZGVsIHdpdGggYSBkaWZmZXJlbnQgb3JpZ2luIGNhbiBiZSBhIGxvbmcgd2F5IG9mZiAtIHRvbyBmYXIgdG8gZmluZCwgbGV0IGFsb25lIGNsaWNrLlxuICAgKi9cbiAgZ2V0VGFnRGlzdGFuY2VGcm9tTW9kZWwoKTogbnVtYmVyIHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLm1vZGVsUm9vdCB8fCAhdGhpcy5tb2RlbFdvcmxkUmFkaXVzKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY2VudHJvaWQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIGNvbnN0IGNhbmRpZGF0ZXMgPSB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpO1xuICAgIGNhbmRpZGF0ZXMuZm9yRWFjaCgoc3ByaXRlKSA9PiBjZW50cm9pZC5hZGQoc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSkpKTtcbiAgICBjb25zdCBjb3VudCA9IGNhbmRpZGF0ZXMubGVuZ3RoO1xuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIFRoZSBtb2RlbCBpcyBjZW50cmVkIG9uIHRoZSB3b3JsZCBvcmlnaW4gd2hlbiBpdCBpcyBwbGFjZWQuXG4gICAgcmV0dXJuIGNlbnRyb2lkLmRpdmlkZVNjYWxhcihjb3VudCkubGVuZ3RoKCkgLyB0aGlzLm1vZGVsV29ybGRSYWRpdXM7XG4gIH1cblxuICAvKipcbiAgICogSGFuZ3MgYSB0YWcgZnJvbSB0aGUgZ3JvdXAgaXRzIGNvb3JkaW5hdGVzIGJlbG9uZyB0bzogb3V0c2lkZSB0aGUgY2FsaWJyYXRpb24gd2hlbiB0aGV5IGFyZSBpblxuICAgKiB0aGlzIG1vZGVsJ3Mgb3duIGNvb3JkaW5hdGVzLCB1bmRlciBpdCBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIHBhcmVudFRhZyhzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogdm9pZCB7XG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnVzZXJEYXRhLmZyYW1lID09PSAnbW9kZWwnICYmIHRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxuICAgICAgPyB0aGlzLm1vZGVsVGFnR3JvdXBcbiAgICAgIDogdGhpcy50YWdHcm91cDtcbiAgICBpZiAoc3ByaXRlLnBhcmVudCAhPT0gcGFyZW50KSB7XG4gICAgICBwYXJlbnQuYWRkKHNwcml0ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0YWdzIGEgY2FsaWJyYXRpb24gY2FuIGJlIHdvcmtlZCBvdXQgZnJvbTogdGhvc2UgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UsIHdoZXRoZXIgb3JcbiAgICogbm90IHRoZXkgYXJlIG9uIHNob3cgLSBiZWZvcmUgY2FsaWJyYXRpbmcsIG1vc3Qgb2YgdGhlbSB3aWxsIG5vdCBiZS5cbiAgICpcbiAgICogVGFncyBwbGFjZWQgaW4gdGhpcyBtb2RlbCBhcmUgd2hlcmUgdGhleSBhcmUgYmVjYXVzZSBzb21lb25lIGNsaWNrZWQgdGhlcmU7IG1hdGNoaW5nIHRoZW0gdG9cbiAgICogXCJ3aGVyZSB0aGV5IHJlYWxseSBhcmVcIiB3b3VsZCBiZSBjaXJjdWxhci4gQSB0YWcgaW4gYW5vdGhlciBtb2RlbCdzIG93biBjb29yZGluYXRlcyBjYW5ub3QgYmVcbiAgICogcGxhY2VkIGhlcmUgYXQgYWxsLiBBbmQgYSB0YWcgYWxyZWFkeSB1c2VkIGluIHRoaXMgY2FsaWJyYXRpb24gY2Fubm90IGJlIHVzZWQgYWdhaW4gLSB0d29cbiAgICogcGFpcnMgZnJvbSBvbmUgdGFnIGNhcnJ5IG5vIG1vcmUgdGhhbiBvbmUuXG4gICAqL1xuICBwcml2YXRlIGNhbGlicmF0aW9uQ2FuZGlkYXRlcygpOiBUSFJFRS5PYmplY3QzRFtdIHtcbiAgICBjb25zdCB1c2VkID0gbmV3IFNldCh0aGlzLmFsaWdubWVudFBhaXJzLm1hcCgocGFpcikgPT4gcGFpci50YWdJZCkpO1xuICAgIHJldHVybiBbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXS5maWx0ZXIoKHNwcml0ZSkgPT5cbiAgICAgIHNwcml0ZS5wYXJlbnQgPT09IHRoaXMudGFnR3JvdXBcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5mcmFtZSAhPT0gJ21vZGVsJ1xuICAgICAgJiYgIXRoaXMuaXNPd25lZEJ5VmlzaXQoc3ByaXRlKVxuICAgICAgJiYgIXVzZWQuaGFzKHNwcml0ZS5uYW1lKSk7XG4gIH1cblxuICAvKiogSG93IG1hbnkgdGFncyB0aGVyZSBhcmUgdG8gY2FsaWJyYXRlIHdpdGgsIG5vdCBjb3VudGluZyB0aG9zZSBhbHJlYWR5IHVzZWQuICovXG4gIGdldENhbGlicmF0aW9uQ2FuZGlkYXRlQ291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5jYWxpYnJhdGlvbkNhbmRpZGF0ZXMoKS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogSG93IG1hbnkgdGFncyBmcm9tIGVsc2V3aGVyZSBhcmUgbm90IG9uIHRoaXMgbW9kZWwsIGFuZCBzbyBub3Qgc2hvd24gb24gaXQuXG4gICAqXG4gICAqIE9uIGEgbW9kZWwgdGhhdCBoYXMgbm90IGJlZW4gY2FsaWJyYXRlZCwgdGhpcyBpcyB3aGF0IHN1Z2dlc3RzIGl0IHNob3VsZCBiZTogdGhlIHRhZ3MgYXJlIG91dFxuICAgKiB0aGVyZSwganVzdCBub3Qgd2hlcmUgdGhlIG1vZGVsIGlzLlxuICAgKi9cbiAgZ2V0T2ZmTW9kZWxUYWdDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmNhbGlicmF0aW9uQ2FuZGlkYXRlcygpLmZpbHRlcigoc3ByaXRlKSA9PiAhdGhpcy5pc09uTW9kZWwoc3ByaXRlKSkubGVuZ3RoO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgdGhlIHRhZyB3YXMgcGxhY2VkIGluIHRoZSB2aXNpdCBvbiBzY3JlZW4uICovXG4gIHByaXZhdGUgaXNPd25lZEJ5VmlzaXQoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSURcbiAgICAgICYmIHNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPT09IHRoaXMuY3VycmVudENhcHR1cmVJRDtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIHRhZyBzaG93cyB3aGVuIGl0cyB0eXBlIGlzIG5vdCBmaWx0ZXJlZCBvdXQgYW5kIGl0IGJlbG9uZ3Mgb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogT25lIHBsYWNlIGRlY2lkZXMsIGJlY2F1c2UgdGhlIHR3byB1c2VkIHRvIHNldCBgdmlzaWJsZWAgc2VwYXJhdGVseSBhbmQgd2hpY2hldmVyIHJhbiBsYXN0XG4gICAqIHVuZGlkIHRoZSBvdGhlci5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlUYWdWaXNpYmlsaXR5KHNwcml0ZTogVEhSRUUuT2JqZWN0M0QpOiB2b2lkIHtcbiAgICBjb25zdCB0eXBlQWxsb3dlZCA9IHRoaXMudmlzaWJsZVRhZ1R5cGVzID09PSBudWxsXG4gICAgICB8fCB0aGlzLnZpc2libGVUYWdUeXBlcy5pbmNsdWRlcyhzcHJpdGUudXNlckRhdGEucG9pVHlwZSk7XG4gICAgc3ByaXRlLnZpc2libGUgPSB0eXBlQWxsb3dlZCAmJiB0aGlzLmJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSB0YWcgaGFzIGEgcGxhY2Ugb24gdGhpcyBtb2RlbC5cbiAgICpcbiAgICogRXZlcnkgdGFnIG9mIHRoZSBzcGFjZSBpcyBvZmZlcmVkIHRvIGV2ZXJ5IG1vZGVsIC0gdGhlcmUgaXMgb25lIHNldCBvZiB0YWdzLCBub3Qgb25lIHBlciBtb2RlbC5cbiAgICogV2hhdCBhIG1vZGVsIHNob3dzIG9mIGl0IGlzIHRoZSBwYXJ0IHRoYXQgc2l0cyBvbiB0aGUgbW9kZWwuXG4gICAqL1xuICBwcml2YXRlIGJlbG9uZ3NPblRoaXNNb2RlbChzcHJpdGU6IFRIUkVFLk9iamVjdDNEKTogYm9vbGVhbiB7XG4gICAgLy8gUGxhY2VkIGhlcmUgYnkgYSBjbGljayBvbiB0aGlzIHZlcnkgc3VyZmFjZS5cbiAgICBpZiAodGhpcy5pc093bmVkQnlWaXNpdChzcHJpdGUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgLy8gUGxhY2VkIGluIGFub3RoZXIgbW9kZWwgYmVmb3JlIHRoYXQgb25lIHdhcyBjYWxpYnJhdGVkOiBpdHMgY29vcmRpbmF0ZXMgYXJlIHRoYXQgbW9kZWwncyBvd25cbiAgICAvLyBhbmQgc2F5IG5vdGhpbmcgYWJvdXQgd2hlcmUgaXQgd291bGQgYmUgaW4gdGhpcyBvbmUuXG4gICAgaWYgKHNwcml0ZS51c2VyRGF0YS5mcmFtZSA9PT0gJ21vZGVsJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICAvLyBDYWxpYnJhdGluZyBpcyBtYXRjaGluZyB0YWdzIHRvIHdoZXJlIHRoZXkgYmVsb25nLCBzbyB0aGV5IGFsbCBoYXZlIHRvIGJlIG9uIG9mZmVyLlxuICAgIGlmICh0aGlzLmFsaWduaW5nKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXNPbk1vZGVsKHNwcml0ZSk7XG4gIH1cblxuICAvKiogV2hldGhlciBhIHRhZywgZHJhd24gd2hlcmUgaXRzIGNvb3JkaW5hdGVzIGFuZCB0aGUgY2FsaWJyYXRpb24gcHV0IGl0LCBzaXRzIG9uIHRoZSBtb2RlbC4gKi9cbiAgcHJpdmF0ZSBpc09uTW9kZWwoc3ByaXRlOiBUSFJFRS5PYmplY3QzRCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5zdXJmYWNlQ2VsbHMpIHtcbiAgICAgIC8vIE5vIG1vZGVsIHRvIGJlIG9uIHlldC5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3QgcGFyZW50ID0gc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwO1xuICAgIHBhcmVudC51cGRhdGVNYXRyaXgoKTtcbiAgICAvLyBUaGUgZ3JpZCBpcyBpbiB0aGUgbW9kZWwncyBvd24gdW5pdHM7IHRoZSBjYWxpYnJhdGlvbidzIHNjYWxlIGlzIGhvdyBtYW55IG9mIHRob3NlIGEgbWV0cmUgaXMuXG4gICAgY29uc3QgcmVhY2ggPSBUaHJlZUpzU2VydmljZS5PTl9NT0RFTF9NRVRSRVMgKiAocGFyZW50LnNjYWxlLnggfHwgMSk7XG4gICAgcmV0dXJuIHRoaXMuaXNOZWFyU3VyZmFjZShzcHJpdGUucG9zaXRpb24uY2xvbmUoKS5hcHBseU1hdHJpeDQocGFyZW50Lm1hdHJpeCksIHJlYWNoKTtcbiAgfVxuXG4gIC8qKiBSZS1kZWNpZGVzIGV2ZXJ5IHRhZydzIHZpc2liaWxpdHk6IHRoZSBtb2RlbCwgdGhlIGNhbGlicmF0aW9uIG9yIHRoZSBtb2RlIGNoYW5nZWQuICovXG4gIHByaXZhdGUgcmVmcmVzaFRhZ1Zpc2liaWxpdHkoKTogdm9pZCB7XG4gICAgdGhpcy50YWdTcHJpdGVzLmZvckVhY2goKHNwcml0ZSkgPT4gdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoc3ByaXRlKSk7XG4gIH1cblxuICBwcml2YXRlIHN1cmZhY2VLZXkoeDogbnVtYmVyLCB5OiBudW1iZXIsIHo6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3Qgc3BhbiA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9TUEFOO1xuICAgIGNvbnN0IHBhZCA9IFRocmVlSnNTZXJ2aWNlLlNVUkZBQ0VfR1JJRF9QQUQ7XG4gICAgY29uc3QgW2ksIGosIGtdID0gW3ggKyBwYWQsIHkgKyBwYWQsIHogKyBwYWRdO1xuICAgIGlmIChpIDwgMCB8fCBqIDwgMCB8fCBrIDwgMCB8fCBpID49IHNwYW4gfHwgaiA+PSBzcGFuIHx8IGsgPj0gc3Bhbikge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH1cbiAgICByZXR1cm4gaSArIHNwYW4gKiAoaiArIHNwYW4gKiBrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXlzIHRoZSBncmlkIG92ZXIgdGhlIG1vZGVsJ3Mgc3VyZmFjZS5cbiAgICpcbiAgICogUnVucyBvbmNlIHBlciBtb2RlbCwgaW4gb25lIHBhc3Mgb3ZlciBpdHMgdHJpYW5nbGVzLiBBIHRyaWFuZ2xlIHNtYWxsZXIgdGhhbiBhIGNlbGwgaXMgbWFya2VkXG4gICAqIGJ5IGl0cyBjZW50cmUsIHdoaWNoIGlzIGV2ZXJ5IHRyaWFuZ2xlIG9mIGEgc2Nhbm5lZCBtb2RlbDsgYSBsYXJnZXIgb25lIC0gdGhlIHR3byB0cmlhbmdsZXMgb2ZcbiAgICogYSBkcmF3biB3YWxsIC0gaXMgc2FtcGxlZCBhY3Jvc3MgaXRzIGZhY2UsIG9yIHRoZSBtaWRkbGUgb2YgdGhlIHdhbGwgd291bGQgcmVhZCBhcyBlbXB0eS5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRTdXJmYWNlR3JpZChvYmplY3Q6IFRIUkVFLk9iamVjdDNELCBib3g6IFRIUkVFLkJveDMpOiB2b2lkIHtcbiAgICBjb25zdCBzaXplID0gYm94LmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgbG9uZ2VzdCA9IE1hdGgubWF4KHNpemUueCwgc2l6ZS55LCBzaXplLnopO1xuICAgIGlmICghKGxvbmdlc3QgPiAwKSkge1xuICAgICAgdGhpcy5zdXJmYWNlQ2VsbHMgPSBudWxsO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBBIHF1YXJ0ZXIgb2YgYSBtZXRyZSB3aGVyZSB0aGUgbW9kZWwgaXMgaW4gbWV0cmVzOyBjb2Fyc2VyIG9uIGEgdmVyeSBsYXJnZSBvbmUsIHNvIHRoZSBncmlkXG4gICAgLy8gc3RheXMgYWRkcmVzc2FibGUgYW5kIGl0cyBtZW1vcnkgYm91bmRlZC5cbiAgICBjb25zdCBjZWxsID0gTWF0aC5tYXgoMC4yNSwgbG9uZ2VzdCAvIDM4NCk7XG4gICAgY29uc3Qgb3JpZ2luID0gYm94Lm1pbi5jbG9uZSgpO1xuICAgIGNvbnN0IGNlbGxzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gICAgY29uc3QgbWFyayA9IChwb2ludDogVEhSRUUuVmVjdG9yMykgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5zdXJmYWNlS2V5KFxuICAgICAgICBNYXRoLmZsb29yKChwb2ludC54IC0gb3JpZ2luLngpIC8gY2VsbCksXG4gICAgICAgIE1hdGguZmxvb3IoKHBvaW50LnkgLSBvcmlnaW4ueSkgLyBjZWxsKSxcbiAgICAgICAgTWF0aC5mbG9vcigocG9pbnQueiAtIG9yaWdpbi56KSAvIGNlbGwpLFxuICAgICAgKTtcbiAgICAgIGlmIChrZXkgPj0gMCkge1xuICAgICAgICBjZWxscy5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgbGV0IHRyaWFuZ2xlQ291bnQgPSAwO1xuICAgIG9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCh0cnVlKTtcbiAgICBvYmplY3QudHJhdmVyc2UoKGNoaWxkOiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHBvc2l0aW9uID0gY2hpbGQuaXNNZXNoICYmIGNoaWxkLmdlb21ldHJ5Py5hdHRyaWJ1dGVzPy5wb3NpdGlvbjtcbiAgICAgIGlmIChwb3NpdGlvbikge1xuICAgICAgICB0cmlhbmdsZUNvdW50ICs9IChjaGlsZC5nZW9tZXRyeS5pbmRleCA/IGNoaWxkLmdlb21ldHJ5LmluZGV4LmNvdW50IDogcG9zaXRpb24uY291bnQpIC8gMztcbiAgICAgIH1cbiAgICB9KTtcbiAgICAvLyBQYXN0IGEgZmV3IG1pbGxpb24gdHJpYW5nbGVzIHRoZXkgYXJlIGZhciBzbWFsbGVyIHRoYW4gYSBjZWxsLCBhbmQgZXZlcnkgY2VsbCBpcyBoaXQgbWFueVxuICAgIC8vIHRpbWVzIG92ZXI7IGEgc2FtcGxlIG1hcmtzIHRoZSBzYW1lIGNlbGxzLlxuICAgIGNvbnN0IHN0cmlkZSA9IE1hdGgubWF4KDEsIE1hdGguY2VpbCh0cmlhbmdsZUNvdW50IC8gMzAwMDAwMCkpO1xuXG4gICAgY29uc3QgYSA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYiA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgYyA9IG5ldyBUSFJFRS5WZWN0b3IzKCk7XG4gICAgY29uc3QgcG9pbnQgPSBuZXcgVEhSRUUuVmVjdG9yMygpO1xuICAgIG9iamVjdC50cmF2ZXJzZSgoY2hpbGQ6IGFueSkgPT4ge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBjaGlsZC5pc01lc2ggJiYgY2hpbGQuZ2VvbWV0cnk/LmF0dHJpYnV0ZXM/LnBvc2l0aW9uO1xuICAgICAgaWYgKCFwb3NpdGlvbikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbmRleCA9IGNoaWxkLmdlb21ldHJ5LmluZGV4O1xuICAgICAgY29uc3QgY291bnQgPSAoaW5kZXggPyBpbmRleC5jb3VudCA6IHBvc2l0aW9uLmNvdW50KSAvIDM7XG4gICAgICBmb3IgKGxldCB0cmlhbmdsZSA9IDA7IHRyaWFuZ2xlIDwgY291bnQ7IHRyaWFuZ2xlICs9IHN0cmlkZSkge1xuICAgICAgICBjb25zdCBvZmZzZXQgPSB0cmlhbmdsZSAqIDM7XG4gICAgICAgIGEuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCkgOiBvZmZzZXQpLmFwcGx5TWF0cml4NChjaGlsZC5tYXRyaXhXb3JsZCk7XG4gICAgICAgIGIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShwb3NpdGlvbiwgaW5kZXggPyBpbmRleC5nZXRYKG9mZnNldCArIDEpIDogb2Zmc2V0ICsgMSkuYXBwbHlNYXRyaXg0KGNoaWxkLm1hdHJpeFdvcmxkKTtcbiAgICAgICAgYy5mcm9tQnVmZmVyQXR0cmlidXRlKHBvc2l0aW9uLCBpbmRleCA/IGluZGV4LmdldFgob2Zmc2V0ICsgMikgOiBvZmZzZXQgKyAyKS5hcHBseU1hdHJpeDQoY2hpbGQubWF0cml4V29ybGQpO1xuICAgICAgICBjb25zdCBlZGdlID0gTWF0aC5tYXgoYS5kaXN0YW5jZVRvKGIpLCBiLmRpc3RhbmNlVG8oYyksIGMuZGlzdGFuY2VUbyhhKSk7XG4gICAgICAgIGlmIChlZGdlIDw9IGNlbGwpIHtcbiAgICAgICAgICBtYXJrKHBvaW50LmNvcHkoYSkuYWRkKGIpLmFkZChjKS5tdWx0aXBseVNjYWxhcigxIC8gMykpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhbGYtY2VsbCBzdGVwcyBhY3Jvc3MgdGhlIGZhY2UuIENhcHBlZCwgc28gb25lIGVub3Jtb3VzIHRyaWFuZ2xlIGNhbm5vdCBzdGFsbCB0aGUgbG9hZDtcbiAgICAgICAgLy8gdGhlIHJlYWNoIGEgdGFnIGlzIHRlc3RlZCB3aXRoIHNwYW5zIHNldmVyYWwgY2VsbHMgYW5kIGJyaWRnZXMgd2hhdCB0aGUgY2FwIGxlYXZlcy5cbiAgICAgICAgY29uc3Qgc3RlcHMgPSBNYXRoLm1pbig5NiwgTWF0aC5jZWlsKCgyICogZWRnZSkgLyBjZWxsKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IHN0ZXBzOyBpICs9IDEpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8PSBzdGVwcyAtIGk7IGogKz0gMSkge1xuICAgICAgICAgICAgcG9pbnQuY29weShhKVxuICAgICAgICAgICAgICAuYWRkU2NhbGVkVmVjdG9yKGIuY2xvbmUoKS5zdWIoYSksIGkgLyBzdGVwcylcbiAgICAgICAgICAgICAgLmFkZFNjYWxlZFZlY3RvcihjLmNsb25lKCkuc3ViKGEpLCBqIC8gc3RlcHMpO1xuICAgICAgICAgICAgbWFyayhwb2ludCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnN1cmZhY2VDZWxscyA9IGNlbGxzO1xuICAgIHRoaXMuc3VyZmFjZU9yaWdpbi5jb3B5KG9yaWdpbik7XG4gICAgdGhpcy5zdXJmYWNlQ2VsbFNpemUgPSBjZWxsO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgc29tZSBwYXJ0IG9mIHRoZSBtb2RlbCdzIHN1cmZhY2UgbGllcyB3aXRoaW4gYHJlYWNoYCBvZiBhIHBvaW50LCBpbiBtb2RlbCB1bml0cy4gKi9cbiAgcHJpdmF0ZSBpc05lYXJTdXJmYWNlKHBvaW50OiBUSFJFRS5WZWN0b3IzLCByZWFjaDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgY2VsbCA9IHRoaXMuc3VyZmFjZUNlbGxTaXplO1xuICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuc3VyZmFjZU9yaWdpbjtcbiAgICBjb25zdCB4ID0gKHBvaW50LnggLSBvcmlnaW4ueCkgLyBjZWxsO1xuICAgIGNvbnN0IHkgPSAocG9pbnQueSAtIG9yaWdpbi55KSAvIGNlbGw7XG4gICAgY29uc3QgeiA9IChwb2ludC56IC0gb3JpZ2luLnopIC8gY2VsbDtcbiAgICAvLyBJbiBjZWxscy4gQ2FwcGVkOiBiZXlvbmQgdGhpcyB0aGUgY2FsaWJyYXRpb24ncyBzY2FsZSBtYWtlcyBhIG1ldHJlIHNvIG1hbnkgY2VsbHMgdGhhdCB0aGVcbiAgICAvLyBzZWFyY2ggd291bGQgZHdhcmYgdGhlIG1vZGVsLCBhbmQgYSB0YWcgdGhhdCBmYXIgb2ZmIGlzIG5vdCBvbiBpdCBieSBhbnkgcmVhZGluZy5cbiAgICBjb25zdCBzcGFuID0gTWF0aC5taW4oMTYsIE1hdGguY2VpbChyZWFjaCAvIGNlbGwpKTtcbiAgICAvLyBBIGNlbGwgaXMgXCJ3aXRoaW4gcmVhY2hcIiB3aGVuIGl0cyBjZW50cmUgaXMsIGdpdmUgb3IgdGFrZSB0aGUgaGFsZi1kaWFnb25hbCBvZiB0aGUgY2VsbC5cbiAgICBjb25zdCBsaW1pdCA9IChyZWFjaCAvIGNlbGwgKyAwLjg3KSAqKiAyO1xuICAgIGNvbnN0IFtjeCwgY3ksIGN6XSA9IFtNYXRoLmZsb29yKHgpLCBNYXRoLmZsb29yKHkpLCBNYXRoLmZsb29yKHopXTtcbiAgICBmb3IgKGxldCBrID0gY3ogLSBzcGFuOyBrIDw9IGN6ICsgc3BhbjsgayArPSAxKSB7XG4gICAgICBmb3IgKGxldCBqID0gY3kgLSBzcGFuOyBqIDw9IGN5ICsgc3BhbjsgaiArPSAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSBjeCAtIHNwYW47IGkgPD0gY3ggKyBzcGFuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCBkaXN0YW5jZSA9IChpICsgMC41IC0geCkgKiogMiArIChqICsgMC41IC0geSkgKiogMiArIChrICsgMC41IC0geikgKiogMjtcbiAgICAgICAgICBpZiAoZGlzdGFuY2UgPD0gbGltaXQgJiYgdGhpcy5zdXJmYWNlQ2VsbHMuaGFzKHRoaXMuc3VyZmFjZUtleShpLCBqLCBrKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogTW92ZXMgdGhlIGNhbWVyYSB0byBsb29rIGF0IGEgdGFnLCBtaXJyb3JpbmcgTWF0dGVycG9ydCdzIGdvVG9UYWcuXG4gICAqXG4gICAqIEFuaW1hdGVkIHJhdGhlciB0aGFuIHRlbGVwb3J0ZWQ6IGp1bXBpbmcgdGhlIGNhbWVyYSBsb3NlcyB0aGUgdmlld2VyJ3Mgc2Vuc2Ugb2Ygd2hlcmUgdGhleSB3ZXJlXG4gICAqIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC4gVGhlIGFwcHJvYWNoIGRpc3RhbmNlIGZvbGxvd3MgdGhlIG1vZGVsJ3Mgc2l6ZSBzbyBpdCBmcmFtZXMgc2Vuc2libHlcbiAgICogd2hhdGV2ZXIgdGhlIHVuaXRzIGFyZS5cbiAgICovXG4gIGdvVG9UYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFzcHJpdGUgfHwgIXRoaXMuY2FtZXJhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGFyZ2V0ID0gc3ByaXRlLmdldFdvcmxkUG9zaXRpb24obmV3IFRIUkVFLlZlY3RvcjMoKSk7XG4gICAgY29uc3QgZGlzdGFuY2UgPSB0aGlzLm1vZGVsUm9vdFxuICAgICAgPyBuZXcgVEhSRUUuQm94MygpLnNldEZyb21PYmplY3QodGhpcy5tb2RlbFJvb3QpLmdldFNpemUobmV3IFRIUkVFLlZlY3RvcjMoKSkubGVuZ3RoKCkgKiAwLjE1XG4gICAgICA6IDU7XG5cbiAgICAvLyBBcHByb2FjaCBhbG9uZyB0aGUgY3VycmVudCB2aWV3aW5nIGRpcmVjdGlvbiwgc28gdGhlIGNhbWVyYSBjbG9zZXMgaW4gcmF0aGVyIHRoYW4gc3dpbmdpbmdcbiAgICAvLyBhcm91bmQgdG8gYW4gYXJiaXRyYXJ5IHNpZGUuXG4gICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5jYW1lcmEucG9zaXRpb24uY2xvbmUoKS5zdWIodGhpcy5jb250cm9scy50YXJnZXQpLm5vcm1hbGl6ZSgpO1xuICAgIHRoaXMuY2FtZXJhVHdlZW4gPSB7XG4gICAgICBmcm9tUG9zaXRpb246IHRoaXMuY2FtZXJhLnBvc2l0aW9uLmNsb25lKCksXG4gICAgICB0b1Bvc2l0aW9uOiB0YXJnZXQuY2xvbmUoKS5hZGQoZGlyZWN0aW9uLm11bHRpcGx5U2NhbGFyKGRpc3RhbmNlKSksXG4gICAgICBmcm9tVGFyZ2V0OiB0aGlzLmNvbnRyb2xzLnRhcmdldC5jbG9uZSgpLFxuICAgICAgdG9UYXJnZXQ6IHRhcmdldCxcbiAgICAgIHN0YXJ0ZWRBdDogcGVyZm9ybWFuY2Uubm93KCksXG4gICAgICBkdXJhdGlvbk1zOiA2MDAsXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBBZHZhbmNlcyB0aGUgY2FtZXJhIGFuaW1hdGlvbiBzdGFydGVkIGJ5IGdvVG9UYWcsIGlmIG9uZSBpcyBydW5uaW5nLiAqL1xuICBwcml2YXRlIHN0ZXBDYW1lcmFUd2VlbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FtZXJhVHdlZW4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgeyBmcm9tUG9zaXRpb24sIHRvUG9zaXRpb24sIGZyb21UYXJnZXQsIHRvVGFyZ2V0LCBzdGFydGVkQXQsIGR1cmF0aW9uTXMgfSA9IHRoaXMuY2FtZXJhVHdlZW47XG4gICAgY29uc3QgbGluZWFyID0gTWF0aC5taW4oKHBlcmZvcm1hbmNlLm5vdygpIC0gc3RhcnRlZEF0KSAvIGR1cmF0aW9uTXMsIDEpO1xuICAgIC8vIEVhc2Ugb3V0LCBzbyB0aGUgbW92ZSBzZXR0bGVzIGluc3RlYWQgb2Ygc3RvcHBpbmcgZGVhZC5cbiAgICBjb25zdCB0ID0gMSAtIE1hdGgucG93KDEgLSBsaW5lYXIsIDMpO1xuXG4gICAgdGhpcy5jYW1lcmEucG9zaXRpb24ubGVycFZlY3RvcnMoZnJvbVBvc2l0aW9uLCB0b1Bvc2l0aW9uLCB0KTtcbiAgICB0aGlzLmNvbnRyb2xzLnRhcmdldC5sZXJwVmVjdG9ycyhmcm9tVGFyZ2V0LCB0b1RhcmdldCwgdCk7XG5cbiAgICBpZiAobGluZWFyID49IDEpIHtcbiAgICAgIHRoaXMuY2FtZXJhVHdlZW4gPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGlzUGxhY2luZ1RhZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wbGFjaW5nVGFnO1xuICB9XG5cbiAgLyoqIFRoZSBzcG90IHBpY2tlZCBieSB0aGUgbGFzdCBwbGFjZW1lbnQsIGZvciB3aG9ldmVyIGNvbW1pdHMgaXQgdG8gYSBQT0kuICovXG4gIGdldFBlbmRpbmdUYWdQbGFjZW1lbnQoKTogVGhyZWVKc1RhZ1BsYWNlbWVudCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnBlbmRpbmdUYWdQbGFjZW1lbnQ7XG4gIH1cblxuICAvKipcbiAgICogUmF5Y2FzdHMgYSBjbGljayBhZ2FpbnN0IHRoZSBtb2RlbCdzIGdlb21ldHJ5IGFuZCByZXR1cm5zIHRoZSBoaXQsIGluIHdvcmxkIHNwYWNlLlxuICAgKlxuICAgKiBSZXR1cm5zIG51bGwgd2hlbiB0aGUgY2xpY2sgbWlzc2VkLCB3aGljaCBpcyBhIG5vcm1hbCBvdXRjb21lIC0gdGhlIHVzZXIgY2xpY2tlZCB0aGUgc2t5IC0gYW5kXG4gICAqIGxlYXZlcyB3aGF0ZXZlciBtb2RlIGlzIGFybWVkIHN0aWxsIGFybWVkLCBzbyB0aGV5IGNhbiBzaW1wbHkgdHJ5IGFnYWluLlxuICAgKi9cbiAgcHJpdmF0ZSByYXljYXN0TW9kZWwoZXZlbnQ6IE1vdXNlRXZlbnQpOiBUSFJFRS5JbnRlcnNlY3Rpb24gfCBudWxsIHtcbiAgICBpZiAoIXRoaXMubW9kZWxSb290KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCByZWN0ID0gdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgIHRoaXMubW91c2UueSA9IC0oKGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCkgLyByZWN0LmhlaWdodCkgKiAyICsgMTtcbiAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcblxuICAgIHJldHVybiB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3QodGhpcy5tb2RlbFJvb3QsIHRydWUpWzBdID8/IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogVHVybnMgYSBjbGljayBpbnRvIGEgcG9pbnQgb24gdGhlIG1vZGVsLCBpbiB0aGUgZnJhbWUgdGFnIGNvb3JkaW5hdGVzIGFyZSBwZXJzaXN0ZWQgaW4uXG4gICAqXG4gICAqIFRoYXQgZnJhbWUgaXMgdGhlIHRhZyBncm91cCdzLCBub3QgdGhlIG1vZGVsJ3MuIEEgc3RvcmVkIGNvb3JkaW5hdGUgaXMgcmVhZCBiYWNrIGFzIGEgc3ByaXRlXG4gICAqIHBvc2l0aW9uIGluc2lkZSB0aGF0IGdyb3VwLCBzbyBhIGNvb3JkaW5hdGUgY2FwdHVyZWQgaW4gYW55IG90aGVyIGZyYW1lIGNvbWVzIGJhY2sgZGlzcGxhY2VkIGJ5XG4gICAqIGV4YWN0bHkgaG93ZXZlciBmYXIgdGhlIGFsaWdubWVudCBtb3ZlcyB0aGUgZ3JvdXAuIFRoZSB0d28gZnJhbWVzIGFncmVlIG9ubHkgd2hpbGUgdGhlXG4gICAqIGFsaWdubWVudCBpcyBpZGVudGl0eSwgd2hpY2ggaXMgd2h5IHRoaXMgc3RheWVkIGludmlzaWJsZSB1bnRpbCBhIG1vZGVsIHdhcyBjYWxpYnJhdGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrUGxhY2VtZW50T25Nb2RlbChldmVudDogTW91c2VFdmVudCk6IFRocmVlSnNUYWdQbGFjZW1lbnQgfCBudWxsIHtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHRoaXMudGFnR3JvdXAudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy50YWdHcm91cC53b3JsZFRvTG9jYWwoaGl0LnBvaW50LmNsb25lKCkpO1xuXG4gICAgLy8gQSBmYWNlIG5vcm1hbCBpcyBpbiB0aGUgZ2VvbWV0cnkncyBsb2NhbCBzcGFjZSBhbHJlYWR5LCBidXQgdGhlIG1lc2ggaXQgYmVsb25ncyB0byBtYXkgc2l0XG4gICAgLy8gdW5kZXIgdHJhbnNmb3JtcyBvZiBpdHMgb3duLCBzbyB0YWtlIGl0IG91dCB0aHJvdWdoIHRob3NlIGFuZCBiYWNrIGludG8gdGhlIHRhZyBmcmFtZSwgc28gaXRcbiAgICAvLyBkZXNjcmliZXMgdGhlIHNhbWUgb3JpZW50YXRpb24gdGhlIHBvc2l0aW9uIGRvZXMuXG4gICAgbGV0IG5vcm1hbCA9IG5ldyBUSFJFRS5WZWN0b3IzKDAsIDEsIDApO1xuICAgIGlmIChoaXQuZmFjZSkge1xuICAgICAgbm9ybWFsID0gaGl0LmZhY2Uubm9ybWFsXG4gICAgICAgIC5jbG9uZSgpXG4gICAgICAgIC50cmFuc2Zvcm1EaXJlY3Rpb24oaGl0Lm9iamVjdC5tYXRyaXhXb3JsZClcbiAgICAgICAgLnRyYW5zZm9ybURpcmVjdGlvbihuZXcgVEhSRUUuTWF0cml4NCgpLmNvcHkodGhpcy50YWdHcm91cC5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpXG4gICAgICAgIC5ub3JtYWxpemUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgcG9zaXRpb246IHsgeDogcG9zaXRpb24ueCwgeTogcG9zaXRpb24ueSwgejogcG9zaXRpb24ueiB9LFxuICAgICAgbm9ybWFsOiB7IHg6IG5vcm1hbC54LCB5OiBub3JtYWwueSwgejogbm9ybWFsLnogfSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSB1c2VyIHNheXMgYSB0YWcgcmVhbGx5IGJlbG9uZ3MsIGluIHRoZSBzcGFjZSB0aGUgc29sdmVkIGFsaWdubWVudCBtYXBzIG9udG8uXG4gICAqXG4gICAqIHNldFRhZ0FsaWdubWVudCB3cml0ZXMgdGhlIHNvbHV0aW9uIHRvIHRoZSB0YWcgZ3JvdXAncyBvd24gdHJhbnNmb3JtLCB3aGljaCBpcyBleHByZXNzZWRcbiAgICogcmVsYXRpdmUgdG8gaXRzIHBhcmVudCAtIHNvIHRoZSB0YXJnZXQgaGFzIHRvIGJlIGluIHRoZSBwYXJlbnQncyBmcmFtZS4gTWVhc3VyaW5nIGl0IGluIHRoZVxuICAgKiBncm91cCdzIG93biBmcmFtZSBpbnN0ZWFkIHdvdWxkIGZvbGQgdGhlIGN1cnJlbnQgYWxpZ25tZW50IGludG8gdGhlIGFuc3dlciwgbWFraW5nIGVhY2hcbiAgICogY2FsaWJyYXRpb24gZGVwZW5kIG9uIHRoZSBvbmUgYmVmb3JlIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBwaWNrQWxpZ25tZW50VGFyZ2V0KGV2ZW50OiBNb3VzZUV2ZW50KTogeyB4OiBudW1iZXI7IHk6IG51bWJlcjsgejogbnVtYmVyIH0gfCBudWxsIHtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnJheWNhc3RNb2RlbChldmVudCk7XG4gICAgaWYgKCFoaXQpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmcmFtZSA9IHRoaXMudGFnR3JvdXAucGFyZW50ID8/IHRoaXMuc2NlbmU7XG4gICAgZnJhbWUudXBkYXRlV29ybGRNYXRyaXgodHJ1ZSwgZmFsc2UpO1xuICAgIGNvbnN0IHBvaW50ID0gZnJhbWUud29ybGRUb0xvY2FsKGhpdC5wb2ludC5jbG9uZSgpKTtcbiAgICByZXR1cm4geyB4OiBwb2ludC54LCB5OiBwb2ludC55LCB6OiBwb2ludC56IH07XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgdHJhbnNmb3JtIG1hcHBpbmcgY2FwdHVyZWQgdGFnIGNvb3JkaW5hdGVzIG9udG8gdGhpcyBtb2RlbCdzIHNwYWNlLlxuICAgKlxuICAgKiBFdmVyeSB0YWcgY29tZXMgZnJvbSB0aGUgc2FtZSBzb3VyY2Ugc3BhY2UsIHNvIHRoaXMgaXMgb25lIHRyYW5zZm9ybSBvbiB0aGUgZ3JvdXAgcmF0aGVyIHRoYW5cbiAgICogcGVyLXRhZyBtYXRocyAtIHdoaWNoIGFsc28gbWVhbnMgaXQgYXBwbGllcyByZXRyb2FjdGl2ZWx5IHRvIHRhZ3MgYWxyZWFkeSBwbGFjZWQsIGFuZCBjYW4gYmVcbiAgICogYWRqdXN0ZWQgbGl2ZSB3aGlsZSBzb21lb25lIGRpYWxzIHRoZSBudW1iZXJzIGluLlxuICAgKlxuICAgKiBQYXNzaW5nIG51bGwgcmVzZXRzIHRvIGlkZW50aXR5LCBpLmUuIHRhZyBjb29yZGluYXRlcyBhcmUgYWxyZWFkeSBpbiBtb2RlbCBzcGFjZS5cbiAgICovXG4gIHNldFRhZ0FsaWdubWVudChhbGlnbm1lbnQ6IFRocmVlSnNBbGlnbm1lbnQgfCBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgeyB0cmFuc2xhdGlvbiwgcm90YXRpb24sIHNjYWxlIH0gPSBhbGlnbm1lbnQgPz8ge307XG4gICAgdGhpcy50YWdHcm91cC5wb3NpdGlvbi5zZXQodHJhbnNsYXRpb24/LnggPz8gMCwgdHJhbnNsYXRpb24/LnkgPz8gMCwgdHJhbnNsYXRpb24/LnogPz8gMCk7XG4gICAgdGhpcy50YWdHcm91cC5yb3RhdGlvbi5zZXQocm90YXRpb24/LnggPz8gMCwgcm90YXRpb24/LnkgPz8gMCwgcm90YXRpb24/LnogPz8gMCk7XG4gICAgdGhpcy50YWdHcm91cC5zY2FsZS5zZXRTY2FsYXIoc2NhbGUgPz8gMSk7XG4gICAgdGhpcy50YWdHcm91cC51cGRhdGVNYXRyaXgoKTtcblxuICAgIC8vIFRhZyBzaXplIGlzIGRlcml2ZWQgZnJvbSB0aGUgd29ybGQgc2NhbGUgaXQgaW5oZXJpdHMsIHdoaWNoIHRoaXMgY2FsbCBqdXN0IGNoYW5nZWQgLSBhbmQgc29cbiAgICAvLyBpcyB3aGljaCB0YWdzIGxhbmQgb24gdGhlIG1vZGVsLlxuICAgIHRoaXMudGFnU3ByaXRlcy5mb3JFYWNoKChzcHJpdGUpID0+IHRoaXMuc2NhbGVUYWdGb3JNb2RlbChzcHJpdGUpKTtcbiAgICB0aGlzLnJlZnJlc2hUYWdWaXNpYmlsaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIHRhZywgb3IgbW92ZXMvcmVzdHlsZXMgdGhlIG9uZSBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgZWxlbWVudC5cbiAgICpcbiAgICogVXBzZXJ0IHJhdGhlciB0aGFuIGEgZGVjbGFyYXRpdmUgXCJoZXJlIGlzIHRoZSBmdWxsIGxpc3RcIiBjYWxsLCBiZWNhdXNlIHRhZ3MgYXJyaXZlIHBlciB0eXBlXG4gICAqIChlcXVpcG1lbnQsIHRoZW4gdGlja2V0cywgdGhlbiBtZWFzdXJlbWVudHMuLi4pIGZyb20gc2VwYXJhdGUgc3Vic2NyaXB0aW9ucyAtIHJlcGxhY2luZyB0aGUgc2V0XG4gICAqIG9uIGVhY2ggb2YgdGhvc2Ugd291bGQgd2lwZSB0aGUgdHlwZXMgdGhhdCBjYW1lIGJlZm9yZS5cbiAgICovXG4gIHVwc2VydFRhZyh0YWc6IFRocmVlSnNUYWcpOiB2b2lkIHtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMudGFnU3ByaXRlcy5nZXQodGFnLmlkKTtcbiAgICBpZiAoZXhpc3RpbmcpIHtcbiAgICAgIGV4aXN0aW5nLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBleGlzdGluZy51c2VyRGF0YS5wb2lUeXBlO1xuICAgICAgZXhpc3RpbmcudXNlckRhdGEubGFiZWwgPSB0YWcubGFiZWwgPz8gZXhpc3RpbmcudXNlckRhdGEubGFiZWw7XG4gICAgICBleGlzdGluZy51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IGV4aXN0aW5nLnVzZXJEYXRhLm9yaWdpbkNhcHR1cmVJRDtcbiAgICAgIGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IGV4aXN0aW5nLnVzZXJEYXRhLmZyYW1lO1xuICAgICAgdGhpcy5wYXJlbnRUYWcoZXhpc3RpbmcpO1xuICAgICAgdGhpcy5hcHBseVRhZ1Zpc2liaWxpdHkoZXhpc3RpbmcpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNwcml0ZSA9IG5ldyBUSFJFRS5TcHJpdGUoXG4gICAgICBuZXcgVEhSRUUuU3ByaXRlTWF0ZXJpYWwoe1xuICAgICAgICBtYXA6IHRoaXMuY3JlYXRlVGFnVGV4dHVyZSh0YWcuY29sb3IpLFxuICAgICAgICAvLyBUYWdzIHJlYWQgYXMgVUkgcmF0aGVyIHRoYW4gZ2VvbWV0cnksIHNvIHRoZXkgc3RheSB2aXNpYmxlIHRocm91Z2ggdGhlIG1vZGVsIGluc3RlYWQgb2ZcbiAgICAgICAgLy8gYmVpbmcgb2NjbHVkZWQgYnkgd2hhdGV2ZXIgd2FsbCBoYXBwZW5zIHRvIGJlIGJldHdlZW4gdGhlbSBhbmQgdGhlIGNhbWVyYS5cbiAgICAgICAgZGVwdGhUZXN0OiBmYWxzZSxcbiAgICAgICAgdHJhbnNwYXJlbnQ6IHRydWUsXG4gICAgICB9KVxuICAgICk7XG4gICAgc3ByaXRlLm5hbWUgPSB0YWcuaWQ7XG4gICAgc3ByaXRlLnVzZXJEYXRhLnBvaVR5cGUgPSB0YWcucG9pVHlwZSA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5sYWJlbCA9IHRhZy5sYWJlbCA/PyBudWxsO1xuICAgIHNwcml0ZS51c2VyRGF0YS5vcmlnaW5DYXB0dXJlSUQgPSB0YWcub3JpZ2luQ2FwdHVyZUlEID8/IG51bGw7XG4gICAgc3ByaXRlLnVzZXJEYXRhLmZyYW1lID0gdGFnLmZyYW1lID8/IG51bGw7XG4gICAgc3ByaXRlLnBvc2l0aW9uLnNldCh0YWcucG9zaXRpb24ueCwgdGFnLnBvc2l0aW9uLnksIHRhZy5wb3NpdGlvbi56KTtcbiAgICBzcHJpdGUucmVuZGVyT3JkZXIgPSA5OTk7XG4gICAgdGhpcy5wYXJlbnRUYWcoc3ByaXRlKTtcbiAgICB0aGlzLnNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlKTtcbiAgICB0aGlzLmFwcGx5VGFnVmlzaWJpbGl0eShzcHJpdGUpO1xuXG4gICAgdGhpcy50YWdTcHJpdGVzLnNldCh0YWcuaWQsIHNwcml0ZSk7XG5cbiAgICBpZiAodGFnLmljb25VcmwpIHtcbiAgICAgIHRoaXMuYXBwbHlUYWdJY29uKHNwcml0ZSwgdGFnLmljb25VcmwpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBSZW1vdmVzIHRoZSB0YWcgcmVnaXN0ZXJlZCBmb3IgYW4gZWxlbWVudCwgaWYgdGhlcmUgaXMgb25lLiAqL1xuICByZW1vdmVUYWcoZWxlbWVudElkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBzcHJpdGUgPSB0aGlzLnRhZ1Nwcml0ZXMuZ2V0KGVsZW1lbnRJZCk7XG4gICAgaWYgKCFzcHJpdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgc3ByaXRlLnBhcmVudD8ucmVtb3ZlKHNwcml0ZSk7XG4gICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgIHNwcml0ZS5tYXRlcmlhbC5kaXNwb3NlKCk7XG4gICAgdGhpcy50YWdTcHJpdGVzLmRlbGV0ZShlbGVtZW50SWQpO1xuICB9XG5cbiAgLyoqIFJlbW92ZXMgZXZlcnkgdGFnIGZyb20gdGhlIHNjZW5lLiAqL1xuICBjbGVhclRhZ3MoKTogdm9pZCB7XG4gICAgWy4uLnRoaXMudGFnU3ByaXRlcy5rZXlzKCldLmZvckVhY2goKGlkKSA9PiB0aGlzLnJlbW92ZVRhZyhpZCkpO1xuICB9XG5cbiAgLyoqIExvYWRzIGFuIGljb24gaW50byBhbiBleGlzdGluZyB0YWcsIGxlYXZpbmcgdGhlIGZhbGxiYWNrIGRpc2MgaW4gcGxhY2UgaWYgaXQgZmFpbHMuICovXG4gIHByaXZhdGUgYXBwbHlUYWdJY29uKHNwcml0ZTogVEhSRUUuU3ByaXRlLCBpY29uVXJsOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBuZXcgVEhSRUUuVGV4dHVyZUxvYWRlcigpLmxvYWQoXG4gICAgICBpY29uVXJsLFxuICAgICAgKHRleHR1cmUpID0+IHtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm1hcD8uZGlzcG9zZSgpO1xuICAgICAgICBzcHJpdGUubWF0ZXJpYWwubWFwID0gdGV4dHVyZTtcbiAgICAgICAgc3ByaXRlLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICB1bmRlZmluZWQsXG4gICAgICAoKSA9PiBjb25zb2xlLndhcm4oYFRocmVlSnNTZXJ2aWNlOiBjb3VsZCBub3QgbG9hZCB0YWcgaWNvbiBcIiR7aWNvblVybH1cIiwga2VlcGluZyB0aGUgZGVmYXVsdCBtYXJrZXIuYClcbiAgICApO1xuICB9XG5cbiAgLyoqIERyYXdzIHRoZSBkZWZhdWx0IHRhZyBtYXJrZXI6IGEgZmlsbGVkIGRpc2Mgd2l0aCBhIHdoaXRlIHJpbmcsIHNvIGl0IHJlYWRzIG9uIGFueSBiYWNrZ3JvdW5kLiAqL1xuICBwcml2YXRlIGNyZWF0ZVRhZ1RleHR1cmUoY29sb3IgPSAnIzFFODhFNScpOiBUSFJFRS5DYW52YXNUZXh0dXJlIHtcbiAgICBjb25zdCBzaXplID0gMTI4O1xuICAgIGNvbnN0IGNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgIGNhbnZhcy53aWR0aCA9IHNpemU7XG4gICAgY2FudmFzLmhlaWdodCA9IHNpemU7XG4gICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmFyYyhzaXplIC8gMiwgc2l6ZSAvIDIsIHNpemUgLyAyIC0gOCwgMCwgTWF0aC5QSSAqIDIpO1xuICAgIGNvbnRleHQuZmlsbFN0eWxlID0gY29sb3I7XG4gICAgY29udGV4dC5maWxsKCk7XG4gICAgY29udGV4dC5saW5lV2lkdGggPSA4O1xuICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSAnI0ZGRkZGRic7XG4gICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgIHJldHVybiBuZXcgVEhSRUUuQ2FudmFzVGV4dHVyZShjYW52YXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNpemVzIGEgdGFnIHJlbGF0aXZlIHRvIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQSBzcHJpdGUgaW5oZXJpdHMgdGhlIG1vZGVsJ3Mgc2NhbGUgYW5kIHRoZSBhbGlnbm1lbnQncywgc28gYSBmaXhlZCBzaXplIHdvdWxkIGNvbWUgb3V0IHRpbnkgb25cbiAgICogYSBsYXJnZSBtb2RlbCBhbmQgaHVnZSBvbiBhIHNtYWxsIG9uZS4gRGl2aWRpbmcgYnkgdGhlIGdyb3VwJ3Mgd29ybGQgc2NhbGUga2VlcHMgdGFncyB0aGUgc2FtZVxuICAgKiBzaXplIG9uIHNjcmVlbiB3aGF0ZXZlciB0aGUgbW9kZWwncyB1bml0cyBhcmUuXG4gICAqL1xuICBwcml2YXRlIHNjYWxlVGFnRm9yTW9kZWwoc3ByaXRlOiBUSFJFRS5TcHJpdGUpOiB2b2lkIHtcbiAgICAvLyBJdHMgb3duIHBhcmVudCdzIHNjYWxlOiB0YWdzIGluIHRoZSBtb2RlbCdzIGNvb3JkaW5hdGVzIGRvIG5vdCBpbmhlcml0IHRoZSBjYWxpYnJhdGlvbidzLlxuICAgIGNvbnN0IHdvcmxkU2NhbGUgPSAoc3ByaXRlLnBhcmVudCA/PyB0aGlzLnRhZ0dyb3VwKS5nZXRXb3JsZFNjYWxlKG5ldyBUSFJFRS5WZWN0b3IzKCkpLnggfHwgMTtcbiAgICBjb25zdCBzaXplID0gMC40IC8gd29ybGRTY2FsZTtcbiAgICBzcHJpdGUuc2NhbGUuc2V0KHNpemUsIHNpemUsIDEpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgc2Vjb25kYXJ5IGludGVyYWN0aXZlIG9iamVjdHMgKGUuZy4sIFBPSXMsIHNlbnNvcnMpIHRvIHRoZSBzY2VuZS5cbiAgICovXG4gIHVwZGF0ZU9ianNUb1NjZW5lKG9ianNBZGRlZDogT2JqQWRkZWRbXSk6IHZvaWQge1xuICAgIGNvbnN0IGV4aXN0aW5nSWRzID0gdGhpcy5jbGlja2FibGVPYmplY3RzLm1hcCgob2JqKSA9PiBvYmoubmFtZSk7XG4gICAgY29uc3Qgb2JqTG9hZGVyID0gbmV3IE9CSkxvYWRlcigpO1xuXG4gICAgLy8gZGVsZXRlIG9iamVjdHMgdGhhdCBhcmUgbm90IGluIHRoZSBwcm92aWRlZCBhcnJheVxuICAgIHRoaXMuY2xpY2thYmxlT2JqZWN0cy5mb3JFYWNoKChvYmopID0+IHtcbiAgICAgIGlmICghb2Jqc0FkZGVkLmZpbmQoKG9iakRhdGEpID0+IG9iakRhdGEuaWQgPT09IG9iai5uYW1lKSkge1xuICAgICAgICB0aGlzLnNjZW5lLnJlbW92ZShvYmopO1xuICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMgPSB0aGlzLmNsaWNrYWJsZU9iamVjdHMuZmlsdGVyKFxuICAgICAgICAgIChvYmplY3QpID0+IG9iamVjdC5uYW1lICE9PSBvYmoubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgb2Jqc0FkZGVkLmZvckVhY2goKG9iamVjdERhdGE6IE9iakFkZGVkKSA9PiB7XG4gICAgICBpZiAoIWV4aXN0aW5nSWRzLmluY2x1ZGVzKG9iamVjdERhdGEuaWQpKSB7XG4gICAgICAgIG9iakxvYWRlci5sb2FkKG9iamVjdERhdGEuZmlsZSwgKG5ld09iamVjdCkgPT4ge1xuICAgICAgICAgIG5ld09iamVjdC5uYW1lID0gb2JqZWN0RGF0YS5pZDtcblxuICAgICAgICAgIG5ld09iamVjdC50cmF2ZXJzZSgoY2hpbGQpID0+IHtcbiAgICAgICAgICAgIGlmICgoY2hpbGQgYXMgVEhSRUUuTWVzaCkuaXNNZXNoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG1lc2ggPSBjaGlsZCBhcyBUSFJFRS5NZXNoO1xuICAgICAgICAgICAgICBpZiAobWVzaC5tYXRlcmlhbCBpbnN0YW5jZW9mIFRIUkVFLk1hdGVyaWFsKSB7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC50cmFuc3BhcmVudCA9IHRydWU7XG4gICAgICAgICAgICAgICAgbWVzaC5tYXRlcmlhbC5vcGFjaXR5ID0gMC44O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBzZXQgb2JqZWN0IHBvc2l0aW9uIGFuZCByb3RhdGlvblxuICAgICAgICAgIG5ld09iamVjdC5wb3NpdGlvbi5zZXQoXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLngsXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnksXG4gICAgICAgICAgICBvYmplY3REYXRhLnBvc2l0aW9uLnpcbiAgICAgICAgICApO1xuICAgICAgICAgIFxuICAgICAgICAgIC8vIFRoZSBKU09OIGNvbmZpZ3VyYXRpb24gaGFzIHJvdGF0aW9uIGFscmVhZHkgaW4gcmFkaWFucyAoZS5nLiAzLjE0MTUuLi4pXG4gICAgICAgICAgbmV3T2JqZWN0LnJvdGF0aW9uLnNldChcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueCxcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24ueSxcbiAgICAgICAgICAgIG9iamVjdERhdGEucm90YXRpb24uelxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBuZXdPYmplY3Quc2NhbGUuc2V0KG9iamVjdERhdGEuc2NhbGUueCwgb2JqZWN0RGF0YS5zY2FsZS55LCBvYmplY3REYXRhLnNjYWxlLnopO1xuXG4gICAgICAgICAgdGhpcy5zY2VuZS5hZGQobmV3T2JqZWN0KTtcbiAgICAgICAgICB0aGlzLmNsaWNrYWJsZU9iamVjdHMucHVzaChuZXdPYmplY3QpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgb25Nb3VzZU1vdmUoZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuXG4gICAgICB0aGlzLnJheWNhc3Rlci5zZXRGcm9tQ2FtZXJhKHRoaXMubW91c2UsIHRoaXMuY2FtZXJhKTtcblxuICAgICAgLy8gV2hpbGUgdGhlIGdob3N0IGlzIHVwIGl0IGZvbGxvd3MgdGhlIHBvaW50ZXIgYW5kIG5vdGhpbmcgZWxzZSBzaG91bGQgcmVhY3QgdG8gaXQuIFRoZSBtb3ZlXG4gICAgICAvLyBpcyBvbmx5IHJlY29yZGVkIGhlcmU6IHBvaW50ZXIgZXZlbnRzIGZpcmUgZmFyIG1vcmUgb2Z0ZW4gdGhhbiBmcmFtZXMsIGFuZCBwaWNraW5nIGEgcG9pbnRcbiAgICAgIC8vIGNvc3RzIGEgcmF5Y2FzdCBhZ2FpbnN0IHRoZSB3aG9sZSBtb2RlbCwgc28gZG9pbmcgaXQgcGVyIGV2ZW50IGlzIHdoYXQgbWFkZSB0aGUgZ2hvc3QgdHJhaWxcbiAgICAgIC8vIGJlaGluZCB0aGUgY3Vyc29yLiBUaGUgcmVuZGVyIGxvb3AgcGlja3MgdXAgdGhlIGxhdGVzdCBwb3NpdGlvbiwgb25jZSwgcGVyIGZyYW1lLlxuICAgICAgaWYgKHRoaXMuaXNQcmV2aWV3aW5nUGxhY2VtZW50KCkpIHtcbiAgICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gZXZlbnQ7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gTm90IHByZXZpZXdpbmcgYW55IG1vcmUgKGEgcGFpciB3YXMganVzdCBjb21wbGV0ZWQsIHNheSk6IGRyb3AgYSBnaG9zdCBsZWZ0IG92ZXIgZnJvbSBpdC5cbiAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuXG4gICAgICAvLyBUYWdzIGZpcnN0OiB0aGV5IGRyYXcgb24gdG9wIG9mIHRoZSBtb2RlbCwgc28gdGhleSBoYXZlIHRvIGFuc3dlciB0aGUgcG9pbnRlciBmaXJzdCB0b28uXG4gICAgICBjb25zdCBob3ZlcmVkVGFnID0gdGhpcy5yYXljYXN0ZXJcbiAgICAgICAgLmludGVyc2VjdE9iamVjdHMoWy4uLnRoaXMudGFnU3ByaXRlcy52YWx1ZXMoKV0sIGZhbHNlKVxuICAgICAgICAuZmluZCgoaGl0KSA9PiBoaXQub2JqZWN0LnZpc2libGUpPy5vYmplY3Q7XG4gICAgICBpZiAoaG92ZXJlZFRhZykge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLmRvbUVsZW1lbnQuc3R5bGUuY3Vyc29yID0gJ3BvaW50ZXInO1xuICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgICAgIGNvbnN0IGxhYmVsID0gaG92ZXJlZFRhZy51c2VyRGF0YS5sYWJlbDtcbiAgICAgICAgdGhpcy50YWdIb3ZlcmVkJC5uZXh0KGxhYmVsID8geyBsYWJlbCwgZXZlbnQgfSA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aGlzLnRhZ0hvdmVyZWQkLm5leHQobnVsbCk7XG5cbiAgICAgIGNvbnN0IGludGVyc2VjdHMgPSB0aGlzLnJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzKHRoaXMuY2xpY2thYmxlT2JqZWN0cywgdHJ1ZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3RzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdwb2ludGVyJztcbiAgICAgICAgY29uc3QgaW50ZXJzZWN0ZWRPYmplY3RJZCA9IGludGVyc2VjdHNbMF0ub2JqZWN0Py5wYXJlbnQ/Lm5hbWU7XG4gICAgICAgIGlmIChpbnRlcnNlY3RlZE9iamVjdElkKSB7XG4gICAgICAgICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQoeyBpZDogaW50ZXJzZWN0ZWRPYmplY3RJZCwgZXZlbnQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgIHRoaXMub2JqZWN0SG92ZXJlZCQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZW5kZXJlci5kb21FbGVtZW50LnN0eWxlLmN1cnNvciA9ICdncmFiYmluZyc7XG4gICAgICB0aGlzLm9iamVjdEhvdmVyZWQkLm5leHQobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBvbk1vdXNlQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNEcmFnZ2luZ0NhbWVyYSkge1xuICAgICAgY29uc3QgcmVjdCA9IHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIHRoaXMubW91c2UueCA9ICgoZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCkgLyByZWN0LndpZHRoKSAqIDIgLSAxO1xuICAgICAgdGhpcy5tb3VzZS55ID0gLSgoZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wKSAvIHJlY3QuaGVpZ2h0KSAqIDIgKyAxO1xuXG4gICAgICAvLyBBbGlnbm1lbnQgYW5kIHBsYWNlbWVudCBib3RoIHRha2UgdGhlIGNsaWNrIGJlZm9yZSBhbnl0aGluZyBjYW4gYmUgb3BlbmVkIGJ5IGl0LlxuICAgICAgaWYgKHRoaXMuYWxpZ25pbmcpIHtcbiAgICAgICAgdGhpcy5yYXljYXN0ZXIuc2V0RnJvbUNhbWVyYSh0aGlzLm1vdXNlLCB0aGlzLmNhbWVyYSk7XG4gICAgICAgIHRoaXMuaGFuZGxlQWxpZ25tZW50Q2xpY2soZXZlbnQpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIE1lYXN1cmluZyB0YWtlcyBldmVyeSBjbGljayBhcyBhIHBvaW50LCB0aGUgc2FtZSB3YXkgcGxhY2VtZW50IHRha2VzIGl0IGFzIGEgcG9zaXRpb24uXG4gICAgICBpZiAodGhpcy5tZWFzdXJpbmcpIHtcbiAgICAgICAgY29uc3QgcGxhY2VtZW50ID0gdGhpcy5waWNrUGxhY2VtZW50T25Nb2RlbChldmVudCk7XG4gICAgICAgIGlmIChwbGFjZW1lbnQpIHtcbiAgICAgICAgICBjb25zdCB7IHgsIHksIHogfSA9IHBsYWNlbWVudC5wb3NpdGlvbjtcbiAgICAgICAgICB0aGlzLmFkZE1lYXN1cmVQb2ludChuZXcgVEhSRUUuVmVjdG9yMyh4LCB5LCB6KSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBQbGFjZW1lbnQgd2lucyBvdmVyIGV2ZXJ5dGhpbmc6IHdoaWxlIGFybWVkLCBhIGNsaWNrIG1lYW5zIFwicHV0IGl0IGhlcmVcIiwgbm90IFwib3BlbiB0aGF0XCIuXG4gICAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XG4gICAgICAgIGNvbnN0IHBsYWNlbWVudCA9IHRoaXMucGlja1BsYWNlbWVudE9uTW9kZWwoZXZlbnQpO1xuICAgICAgICBpZiAocGxhY2VtZW50KSB7XG4gICAgICAgICAgcGxhY2VtZW50LnBvaVR5cGUgPSB0aGlzLnBsYWNlbWVudFBvaVR5cGU7XG4gICAgICAgICAgdGhpcy5wZW5kaW5nVGFnUGxhY2VtZW50ID0gcGxhY2VtZW50O1xuICAgICAgICAgIHRoaXMucGxhY2luZ1RhZyA9IGZhbHNlO1xuICAgICAgICAgIHRoaXMucmVtb3ZlUGxhY2VtZW50UHJldmlldygpO1xuICAgICAgICAgIHRoaXMucmVuZGVyZXIuZG9tRWxlbWVudC5zdHlsZS5jdXJzb3IgPSAnZGVmYXVsdCc7XG4gICAgICAgICAgdGhpcy50YWdQbGFjZWQkLm5leHQocGxhY2VtZW50KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMucmF5Y2FzdGVyLnNldEZyb21DYW1lcmEodGhpcy5tb3VzZSwgdGhpcy5jYW1lcmEpO1xuXG4gICAgICAvLyBTYW1lIHByZWNlZGVuY2UgYXMgaG92ZXI6IGEgdGFnIGRyYXduIG92ZXIgdGhlIG1vZGVsIGNsYWltcyB0aGUgY2xpY2suXG4gICAgICBjb25zdCB0YWdIaXRzID0gdGhpcy5yYXljYXN0ZXIuaW50ZXJzZWN0T2JqZWN0cyhbLi4udGhpcy50YWdTcHJpdGVzLnZhbHVlcygpXSwgZmFsc2UpXG4gICAgICAgIC5maWx0ZXIoKGhpdCkgPT4gaGl0Lm9iamVjdC52aXNpYmxlKTtcbiAgICAgIGlmICh0YWdIaXRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgdGFnID0gdGFnSGl0c1swXS5vYmplY3Q7XG4gICAgICAgIHRoaXMudGFnQ2xpY2tlZCQubmV4dCh7IGVsZW1lbnRJZDogdGFnLm5hbWUsIHBvaVR5cGU6IHRhZy51c2VyRGF0YS5wb2lUeXBlID8/IG51bGwgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgaW50ZXJzZWN0cyA9IHRoaXMucmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHModGhpcy5jbGlja2FibGVPYmplY3RzLCB0cnVlKTtcblxuICAgICAgaWYgKGludGVyc2VjdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBjbGlja2VkT2JqZWN0ID0gaW50ZXJzZWN0c1swXS5vYmplY3Q7XG4gICAgICAgIGNvbnN0IGlkID0gY2xpY2tlZE9iamVjdD8ucGFyZW50Py5uYW1lO1xuICAgICAgICBpZiAoaWQpIHtcbiAgICAgICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChpZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub2JqZWN0Q2xpY2tlZCQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXNjYXBlIGNhbmNlbHMgd2hhdGV2ZXIgdGhlIHBvaW50ZXIgaXMgY3VycmVudGx5IGNvbW1pdHRlZCB0by5cbiAgICpcbiAgICogRW1pdHMgdGhyb3VnaCB0aGUgc2FtZSBzdWJqZWN0cyB0aGUgZXhwbGljaXQgQ2FuY2VsIGJ1dHRvbnMgdXNlLCBzbyB0aGUgVUkgZHJpdmluZyB0aGVtIGZvbGxvd3NcbiAgICogYWxvbmcgaW5zdGVhZCBvZiBiZWluZyBsZWZ0IHNob3dpbmcgYSBtb2RlIHRoYXQgaXMgbm8gbG9uZ2VyIGFybWVkLlxuICAgKi9cbiAgcHJpdmF0ZSBvbktleURvd24gPSAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkID0+IHtcbiAgICBpZiAoZXZlbnQua2V5ICE9PSAnRXNjYXBlJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5wbGFjaW5nVGFnKSB7XG4gICAgICAvLyBOb3RoaW5nIG91dHNpZGUgdGhlIHNjZW5lIHRyYWNrcyBwbGFjZW1lbnQsIHNvIGNsZWFyaW5nIGl0IGhlcmUgaXMgdGhlIHdob2xlIG9mIGl0LlxuICAgICAgdGhpcy5jYW5jZWxUYWdQbGFjZW1lbnQoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubWVhc3VyaW5nKSB7XG4gICAgICB0aGlzLmNhbmNlbE1lYXN1cmluZygpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbGlnbmluZykge1xuICAgICAgdGhpcy5jYW5jZWxUYWdBbGlnbm1lbnQoKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFuaW1hdGUgPSAoKTogdm9pZCA9PiB7XG4gICAgdGhpcy5hbmltYXRpb25GcmFtZUlkID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMuYW5pbWF0ZSk7XG4gICAgdGhpcy5zdGVwQ2FtZXJhVHdlZW4oKTtcbiAgICB0aGlzLmNvbnRyb2xzLnVwZGF0ZSgpO1xuXG4gICAgLy8gT25lIHBpY2sgcGVyIGZyYW1lLCBhZ2FpbnN0IHRoZSBwb2ludGVyJ3MgbGF0ZXN0IHBvc2l0aW9uIC0gc2VlIG9uTW91c2VNb3ZlLlxuICAgIGlmICh0aGlzLnBlbmRpbmdQcmV2aWV3RXZlbnQpIHtcbiAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50O1xuICAgICAgdGhpcy5wZW5kaW5nUHJldmlld0V2ZW50ID0gbnVsbDtcbiAgICAgIHRoaXMudXBkYXRlUGxhY2VtZW50UHJldmlldyhldmVudCk7XG4gICAgfVxuXG4gICAgdGhpcy5yZW5kZXJlci5yZW5kZXIodGhpcy5zY2VuZSwgdGhpcy5jYW1lcmEpO1xuICB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLmFuaW1hdGlvbkZyYW1lSWQpO1xuICAgIH1cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMub25LZXlEb3duKTtcbiAgICBpZiAodGhpcy5jYW52YXNSZXNpemVPYnNlcnZlcikge1xuICAgICAgdGhpcy5jYW52YXNSZXNpemVPYnNlcnZlci5kaXNjb25uZWN0KCk7XG4gICAgICB0aGlzLmNhbnZhc1Jlc2l6ZU9ic2VydmVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICB0aGlzLmRpc2NhcmRDdXJyZW50TG9hZCgpO1xuICAgIHRoaXMuY2xlYXJUYWdzKCk7XG4gICAgdGhpcy5tZWFzdXJpbmcgPSBmYWxzZTtcbiAgICB0aGlzLmNsZWFyTWVhc3VyZW1lbnQoKTtcbiAgICBpZiAodGhpcy5yZW5kZXJlcikge1xuICAgICAgdGhpcy5yZW5kZXJlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRyb2xzKSB7XG4gICAgICB0aGlzLmNvbnRyb2xzLmRpc3Bvc2UoKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|