@aws-cdk/aws-mediaconnect-alpha 2.263.0-alpha.0 → 2.264.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +936 -482
- package/.jsii.tabl.json.gz +0 -0
- package/.warnings.jsii.js +0 -41
- package/lib/bridge-output.js +1 -1
- package/lib/bridge-source.js +2 -2
- package/lib/bridge.js +5 -5
- package/lib/flow-entitlement.d.ts +10 -1
- package/lib/flow-entitlement.js +2 -3
- package/lib/flow-output.d.ts +30 -19
- package/lib/flow-output.js +16 -19
- package/lib/flow-source-configuration.js +4 -4
- package/lib/flow-source.d.ts +14 -5
- package/lib/flow-source.js +2 -3
- package/lib/flow.d.ts +32 -15
- package/lib/flow.js +22 -19
- package/lib/gateway.js +1 -1
- package/lib/mediaconnect-grants.generated.js +2 -2
- package/lib/router-input.d.ts +22 -9
- package/lib/router-input.js +13 -9
- package/lib/router-network-interface.d.ts +21 -5
- package/lib/router-network-interface.js +8 -12
- package/lib/router-output.d.ts +10 -5
- package/lib/router-output.js +10 -8
- package/lib/shared.js +9 -9
- package/package.json +6 -6
package/lib/flow.js
CHANGED
|
@@ -52,7 +52,7 @@ const shared_1 = require("./shared");
|
|
|
52
52
|
*/
|
|
53
53
|
class FlowSize {
|
|
54
54
|
value;
|
|
55
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FlowSize", version: "2.
|
|
55
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FlowSize", version: "2.264.0-alpha.0" };
|
|
56
56
|
/**
|
|
57
57
|
* Medium flow size. The default — standard transport stream distribution; does not
|
|
58
58
|
* support NDI, CDI, or JPEG XS.
|
|
@@ -102,7 +102,7 @@ class FailoverConfig {
|
|
|
102
102
|
_state;
|
|
103
103
|
_recoveryWindow;
|
|
104
104
|
_primarySource;
|
|
105
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FailoverConfig", version: "2.
|
|
105
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.FailoverConfig", version: "2.264.0-alpha.0" };
|
|
106
106
|
/**
|
|
107
107
|
* Configure merge-mode failover. Requires two binary-identical sources.
|
|
108
108
|
*/
|
|
@@ -186,7 +186,7 @@ var EncodingProfile;
|
|
|
186
186
|
*/
|
|
187
187
|
class Colorimetry {
|
|
188
188
|
value;
|
|
189
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Colorimetry", version: "2.
|
|
189
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Colorimetry", version: "2.264.0-alpha.0" };
|
|
190
190
|
/** Option for BT601 */
|
|
191
191
|
static BT601 = new Colorimetry('BT601');
|
|
192
192
|
/** Option for BT709 */
|
|
@@ -216,7 +216,7 @@ exports.Colorimetry = Colorimetry;
|
|
|
216
216
|
*/
|
|
217
217
|
class VideoRange {
|
|
218
218
|
value;
|
|
219
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.VideoRange", version: "2.
|
|
219
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.VideoRange", version: "2.264.0-alpha.0" };
|
|
220
220
|
/** Option for Narrow */
|
|
221
221
|
static NARROW = new VideoRange('NARROW');
|
|
222
222
|
/** Option for Full */
|
|
@@ -238,7 +238,7 @@ exports.VideoRange = VideoRange;
|
|
|
238
238
|
*/
|
|
239
239
|
class ScanMode {
|
|
240
240
|
value;
|
|
241
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.ScanMode", version: "2.
|
|
241
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.ScanMode", version: "2.264.0-alpha.0" };
|
|
242
242
|
/** Option for Progressive */
|
|
243
243
|
static PROGRESSIVE = new ScanMode('progressive');
|
|
244
244
|
/** Option for Interlace */
|
|
@@ -260,7 +260,7 @@ exports.ScanMode = ScanMode;
|
|
|
260
260
|
*/
|
|
261
261
|
class Tcs {
|
|
262
262
|
value;
|
|
263
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Tcs", version: "2.
|
|
263
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Tcs", version: "2.264.0-alpha.0" };
|
|
264
264
|
/** Option for SDR */
|
|
265
265
|
static SDR = new Tcs('SDR');
|
|
266
266
|
/** Option for PQ */
|
|
@@ -294,7 +294,7 @@ exports.Tcs = Tcs;
|
|
|
294
294
|
*/
|
|
295
295
|
class AudioStreamOrderOptions {
|
|
296
296
|
value;
|
|
297
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.AudioStreamOrderOptions", version: "2.
|
|
297
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.AudioStreamOrderOptions", version: "2.264.0-alpha.0" };
|
|
298
298
|
/** Mono */
|
|
299
299
|
static MONO = new AudioStreamOrderOptions('SMPTE2110.(M)');
|
|
300
300
|
/** Dual Mono */
|
|
@@ -346,7 +346,7 @@ var MediaStreamType;
|
|
|
346
346
|
*/
|
|
347
347
|
class MediaVideoFormat {
|
|
348
348
|
value;
|
|
349
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.MediaVideoFormat", version: "2.
|
|
349
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.MediaVideoFormat", version: "2.264.0-alpha.0" };
|
|
350
350
|
/** Option for 2160p */
|
|
351
351
|
static UHD_2160P = new MediaVideoFormat('2160p');
|
|
352
352
|
/** Option for 1080p */
|
|
@@ -372,7 +372,7 @@ exports.MediaVideoFormat = MediaVideoFormat;
|
|
|
372
372
|
*/
|
|
373
373
|
class MediaStream {
|
|
374
374
|
_config;
|
|
375
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.MediaStream", version: "2.
|
|
375
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.MediaStream", version: "2.264.0-alpha.0" };
|
|
376
376
|
/**
|
|
377
377
|
* Configuration for MediaStream Video
|
|
378
378
|
*/
|
|
@@ -544,8 +544,8 @@ class FlowBase extends aws_cdk_lib_1.Resource {
|
|
|
544
544
|
/**
|
|
545
545
|
* Add an output to this flow
|
|
546
546
|
*/
|
|
547
|
-
addOutput(id,
|
|
548
|
-
const protocol =
|
|
547
|
+
addOutput(id, options) {
|
|
548
|
+
const protocol = options.output._bind().protocol;
|
|
549
549
|
if (protocol === 'ndi-speed-hq') {
|
|
550
550
|
if (this._ndiState !== undefined && this._ndiState !== shared_1.State.ENABLED) {
|
|
551
551
|
throw new aws_cdk_lib_1.ValidationError((0, helpers_internal_1.lit) `NdiOutputRequiresNdiConfig`, 'NDI outputs require ndiConfig with ndiState set to State.ENABLED on the flow', this);
|
|
@@ -565,7 +565,10 @@ class FlowBase extends aws_cdk_lib_1.Resource {
|
|
|
565
565
|
}
|
|
566
566
|
return new flow_output_1.FlowOutput(this, id, {
|
|
567
567
|
flow: this,
|
|
568
|
-
output:
|
|
568
|
+
output: options.output,
|
|
569
|
+
flowOutputName: options.flowOutputName,
|
|
570
|
+
description: options.description,
|
|
571
|
+
outputStatus: options.outputStatus,
|
|
569
572
|
});
|
|
570
573
|
}
|
|
571
574
|
/**
|
|
@@ -762,7 +765,7 @@ let Flow = (() => {
|
|
|
762
765
|
Flow = _classThis = _classDescriptor.value;
|
|
763
766
|
if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
|
|
764
767
|
}
|
|
765
|
-
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Flow", version: "2.
|
|
768
|
+
static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-mediaconnect-alpha.Flow", version: "2.264.0-alpha.0" };
|
|
766
769
|
/** Uniquely identifies this class. */
|
|
767
770
|
static PROPERTY_INJECTION_ID = '@aws-cdk.aws-mediaconnect-alpha.Flow';
|
|
768
771
|
/**
|
|
@@ -826,8 +829,8 @@ let Flow = (() => {
|
|
|
826
829
|
// Enhanced CDK Analytics Telemetry
|
|
827
830
|
(0, metadata_resource_1.addConstructMetadata)(this, props);
|
|
828
831
|
// Validate maintenance start hour format
|
|
829
|
-
if (props.
|
|
830
|
-
(0, shared_1.validateMaintenanceTime)(props.
|
|
832
|
+
if (props.maintenanceConfiguration) {
|
|
833
|
+
(0, shared_1.validateMaintenanceTime)(props.maintenanceConfiguration.time);
|
|
831
834
|
}
|
|
832
835
|
// Validate source monitoring thresholds and content-quality requirements
|
|
833
836
|
this.validateMonitoring(props);
|
|
@@ -864,9 +867,9 @@ let Flow = (() => {
|
|
|
864
867
|
source: sourceConfig,
|
|
865
868
|
availabilityZone: props?.availabilityZone,
|
|
866
869
|
flowSize: props?.flowSize?.value,
|
|
867
|
-
maintenance: props?.
|
|
868
|
-
maintenanceDay: (0, shared_1.toTitleCase)(props.
|
|
869
|
-
maintenanceStartHour: props.
|
|
870
|
+
maintenance: props?.maintenanceConfiguration ? {
|
|
871
|
+
maintenanceDay: (0, shared_1.toTitleCase)(props.maintenanceConfiguration.day),
|
|
872
|
+
maintenanceStartHour: props.maintenanceConfiguration.time,
|
|
870
873
|
} : undefined,
|
|
871
874
|
mediaStreams: props.mediaStreams ? props.mediaStreams.map(stream => stream._bind()) : undefined,
|
|
872
875
|
ndiConfig: props.ndiConfig ? {
|
|
@@ -1062,4 +1065,4 @@ let Flow = (() => {
|
|
|
1062
1065
|
return Flow = _classThis;
|
|
1063
1066
|
})();
|
|
1064
1067
|
exports.Flow = Flow;
|
|
1065
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQXFJO0FBRXJJLCtEQUEwRDtBQUMxRCxtRUFBdUQ7QUFFdkQsNEVBQTREO0FBQzVELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFHMUUsK0NBQTJDO0FBRTNDLDJFQUE2RDtBQUM3RCxtRkFBNkQ7QUFFN0QscUNBQXVHO0FBd0p2Rzs7R0FFRztBQUNILE1BQWEsUUFBUTtJQTZCaUI7O0lBNUJwQzs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQVUsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JEOztPQUVHO0lBQ0ksTUFBTSxDQUFVLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtJQUVELDhDQUE4QztJQUM5QyxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQWxDSCw0QkFtQ0M7QUE0REQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLGNBQWM7SUF1Qk47SUFDQTtJQUNBO0lBQ0E7O0lBekJuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBZ0MsRUFBRTs7Ozs7Ozs7OztRQUNwRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxPQUFP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S0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekIsTUFBTSxJQUFJLHFDQUF1QixDQUMvQixJQUFBLHNCQUFHLEVBQUEsbUNBQW1DLEVBQ3RDLGdFQUFnRSxRQUFRLEdBQUcsQ0FDNUUsQ0FBQztZQUNKLENBQUM7WUFDRCxPQUFPLGdCQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxLQUFLLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQ7O1dBRUc7UUFFSSxlQUFlLENBQUMsR0FBdUI7Ozs7Ozs7Ozs7WUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7Z0JBQ3RCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtnQkFDZCxtQkFBbUIsRUFBRSxHQUFHLENBQUMsbUJBQW1CO2dCQUM1QyxvQkFBb0IsRUFBRSxHQUFHLENBQUMsb0JBQW9CLEVBQUUsS0FBSztnQkFDckQsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsZUFBZSxDQUFDO2dCQUNsRSxRQUFRLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRO2dCQUM3QixPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPO2FBQzFCLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1NBQ1o7O1lBaFhVLHVEQUFJOzs7OztBQUFKLG9CQUFJIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBCaXRyYXRlLCBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBBcm5Gb3JtYXQsIFJlc291cmNlLCBMYXp5LCBOYW1lcywgRHVyYXRpb24sIFN0YWNrLCBUb2tlbiwgRm4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgdHlwZSB7IE1ldHJpY09wdGlvbnMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBNZXRyaWMsIFVuaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtY2xvdWR3YXRjaCc7XG5pbXBvcnQgeyBDZm5GbG93IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgdHlwZSB7IElGbG93UmVmLCBGbG93UmVmZXJlbmNlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLW1lZGlhY29ubmVjdCc7XG5pbXBvcnQgeyBsaXQgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlL2xpYi9oZWxwZXJzLWludGVybmFsJztcbmltcG9ydCB7IGFkZENvbnN0cnVjdE1ldGFkYXRhLCBNZXRob2RNZXRhZGF0YSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL21ldGFkYXRhLXJlc291cmNlJztcbmltcG9ydCB7IHByb3BlcnR5SW5qZWN0YWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL3Byb3AtaW5qZWN0YWJsZSc7XG5pbXBvcnQgdHlwZSB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHR5cGUgeyBJRmxvd091dHB1dCwgT3V0cHV0Q29uZmlndXJhdGlvbiB9IGZyb20gJy4vZmxvdy1vdXRwdXQnO1xuaW1wb3J0IHsgRmxvd091dHB1dCB9IGZyb20gJy4vZmxvdy1vdXRwdXQnO1xuaW1wb3J0IHR5cGUgeyBTb3VyY2VDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9mbG93LXNvdXJjZS1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFNvdXJjZVByb3RvY29sIH0gZnJvbSAnLi9mbG93LXNvdXJjZS1jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IEZsb3dHcmFudHMgfSBmcm9tICcuL21lZGlhY29ubmVjdC1ncmFudHMuZ2VuZXJhdGVkJztcbmltcG9ydCB0eXBlIHsgVnBjSW50ZXJmYWNlQ29uZmlnLCBNYWludGVuYW5jZURheSwgRnJhbWVyYXRlLCBQaXhlbEFzcGVjdFJhdGlvIH0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHsgRmFpbG92ZXJNb2RlLCBOZXR3b3JrSW50ZXJmYWNlLCBTdGF0ZSwgdG9UaXRsZUNhc2UsIHZhbGlkYXRlTWFpbnRlbmFuY2VUaW1lIH0gZnJvbSAnLi9zaGFyZWQnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgRmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIElGbG93IGV4dGVuZHMgSVJlc291cmNlLCBJRmxvd1JlZiB7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd0Fybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQW1hem9uIFJlc291cmNlIE5hbWUgKEFSTikgb2YgdGhlIHNvdXJjZSBkZWZpbmVkIG9uIHRoZSBmbG93LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBcm46IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgZmxvdyB1c2VzIHRvIHNlbmQgb3V0Ym91bmQgY29udGVudC5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZWdyZXNzSXA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgZmxvdyBsaXN0ZW5zIG9uIGZvciBpbmNvbWluZyBjb250ZW50LlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIGxpc3RlbmVyLXN0eWxlIHNvdXJjZSBwcm90b2NvbHMgKFJUUCwgUlRQLUZFQywgUklTVCwgU1JUIGxpc3RlbmVyLFxuICAgKiBaaXhpIHB1c2gpLiBBY2Nlc3NpbmcgdGhpcyBvbiBTUlQgY2FsbGVyLCBlbnRpdGxlbWVudCwgZ2F0ZXdheSBicmlkZ2UsIHJvdXRlcixcbiAgICogQ0RJLCBKUEVHIFhTLCBvciBpbXBvcnRlZCBmbG93cyB0aHJvd3Mg4oCUIHRob3NlIHNvdXJjZXMgZG9uJ3QgZXhwb3NlIGEgbGlzdGVuaW5nXG4gICAqIElQIGFkZHJlc3MuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdElwOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IHRoYXQgdGhlIGZsb3cgbGlzdGVucyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQXZhaWxhYmxlIGZvciB0aGUgc2FtZSBsaXN0ZW5lci1zdHlsZSBzb3VyY2UgcHJvdG9jb2xzIGFzIGBzb3VyY2VJbmdlc3RJcGAuXG4gICAqIEFjY2Vzc2luZyB0aGlzIG9uIFNSVCBjYWxsZXIsIGVudGl0bGVtZW50LCBnYXRld2F5IGJyaWRnZSwgcm91dGVyLCBDREksIEpQRUcgWFMsXG4gICAqIG9yIGltcG9ydGVkIGZsb3dzIHRocm93cy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0UG9ydDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgZnVsbCBpbmdlc3QgVVJMIGZvciB0aGUgZmxvdyBzb3VyY2UsIGNvbWJpbmluZyBwcm90b2NvbCwgSVAsIGFuZCBwb3J0LlxuICAgKiBGb3IgZXhhbXBsZTogYHNydDovLzIwMy4wLjExMy4xMDo1MDAwYFxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIGxpc3RlbmVyLXN0eWxlIHNvdXJjZSBwcm90b2NvbHMgKFJUUCwgUlRQLUZFQywgUklTVCwgU1JUIGxpc3RlbmVyLFxuICAgKiBaaXhpIHB1c2gpIHdoZXJlIHRoZSBmbG93IGxpc3RlbnMgZm9yIGFuIHVwc3RyZWFtIHNlbmRlci4gQWNjZXNzaW5nIHRoaXMgb25cbiAgICogU1JUIGNhbGxlciwgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIENESSwgSlBFRyBYUywgb3IgaW1wb3J0ZWRcbiAgICogZmxvd3MgdGhyb3dzIOKAlCB0aG9zZSBzb3VyY2VzIGRvbid0IGV4cG9zZSBhIHNpbmdsZSBob3N0OnBvcnQgaW5nZXN0IFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdFVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgQXZhaWxhYmlsaXR5IFpvbmUgdGhhdCB0aGUgZmxvdyB3YXMgY3JlYXRlZCBpbi5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd0F2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEZhaWxvdmVyIENvbmZpZ3VyYXRpb24gZm9yIGZsb3dcbiAgICovXG4gIHJlYWRvbmx5IGlzRmFpbG92ZXJFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBncmFudCBtZXRob2RzIGZvciB0aGlzIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBncmFudHM6IEZsb3dHcmFudHM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0aGlzIGZsb3cuXG4gICAqL1xuICBtZXRyaWMobWV0cmljTmFtZTogc3RyaW5nLCBwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGJpdHJhdGUgb2YgY29udGVudCBpbmdlc3RlZCBpbnRvIHRoZSBmbG93LlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VCaXRyYXRlKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciBwYWNrZXRzIHRoYXQgd2VyZSBub3QgcmVjb3ZlcmVkIGJ5IHRoZSBmbG93IHNvdXJjZS5cbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VOb3RSZWNvdmVyZWRQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgdG90YWwgbnVtYmVyIG9mIHBhY2tldHMgcmVjZWl2ZWQgYnkgdGhlIGZsb3cgc291cmNlLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZVRvdGFsUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBpbmRpY2F0aW5nIHdoaWNoIHNvdXJjZSBpcyBzZWxlY3RlZCBmb3IgaW5nZXN0IHdoZW4gdXNpbmcgYEZhaWxvdmVyYCBmYWlsb3ZlciBtb2RlLlxuICAgKiBAZGVmYXVsdCAtIG1heGltdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VTZWxlY3RlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBpbmRpY2F0aW5nIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSBzb3VyY2UgKDEgY29ubmVjdGVkLCAwIGRpc2Nvbm5lY3RlZCkuXG4gICAqIEFwcGxpZXMgb25seSB0byBaaXhpLCBTUlQsIGFuZCBSSVNUIHNvdXJjZXMuXG4gICAqIEBkZWZhdWx0IC0gbWluaW11bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZUNvbm5lY3RlZChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIHRyYW5zaXRpb25lZCBmcm9tIGNvbm5lY3RlZCB0byBkaXNjb25uZWN0ZWQuXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljU291cmNlRGlzY29ubmVjdGlvbnMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBudW1iZXIgb2YgcGFja2V0cyBsb3N0IGR1cmluZyB0cmFuc2l0LCBtZWFzdXJlZCBiZWZvcmUgYW55IGVycm9yIGNvcnJlY3Rpb24uXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljU291cmNlRHJvcHBlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBwZXJjZW50YWdlIG9mIHBhY2tldHMgbG9zdCBkdXJpbmcgdHJhbnNpdCwgZXZlbiBpZiB0aGV5IHdlcmUgcmVjb3ZlcmVkLlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VQYWNrZXRMb3NzUGVyY2VudChwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHJvdW5kLXRyaXAgdGltZSBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIE1lZGlhQ29ubmVjdC5cbiAgICogQXBwbGllcyBvbmx5IHRvIFJJU1QsIFppeGksIGFuZCBTUlQgc291cmNlcy5cbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljU291cmNlUm91bmRUcmlwVGltZShwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yayBqaXR0ZXIgb2YgdGhlIHNvdXJjZSwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VKaXR0ZXIocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3V0cHV0IHRvIHRoaXMgZmxvd1xuICAgKi9cbiAgYWRkT3V0cHV0KGlkOiBzdHJpbmcsIG91dHB1dENvbmZpZzogT3V0cHV0Q29uZmlndXJhdGlvbik6IElGbG93T3V0cHV0O1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIEZsb3cgU2l6ZVxuICovXG5leHBvcnQgY2xhc3MgRmxvd1NpemUge1xuICAvKipcbiAgICogTWVkaXVtIGZsb3cgc2l6ZS4gVGhlIGRlZmF1bHQg4oCUIHN0YW5kYXJkIHRyYW5zcG9ydCBzdHJlYW0gZGlzdHJpYnV0aW9uOyBkb2VzIG5vdFxuICAgKiBzdXBwb3J0IE5ESSwgQ0RJLCBvciBKUEVHIFhTLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Zsb3ctc2l6ZXMtY2FwYWJpbGl0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUVESVVNID0gbmV3IEZsb3dTaXplKCdNRURJVU0nKTtcbiAgLyoqXG4gICAqIExhcmdlIGZsb3cgc2l6ZS4gUmVxdWlyZWQgd2hlbiB0aGUgZmxvdyB1c2VzIE5ESSBzb3VyY2VzIG9yIG91dHB1dHMuIFN1cHBvcnRzXG4gICAqIHRyYW5zcG9ydCBzdHJlYW0gZGlzdHJpYnV0aW9uIHBsdXMgTkRJOyBkb2VzIG5vdCBzdXBwb3J0IENESSBvciBKUEVHIFhTLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Zsb3ctc2l6ZXMtY2FwYWJpbGl0aWVzLmh0bWxcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEFSR0UgPSBuZXcgRmxvd1NpemUoJ0xBUkdFJyk7XG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIGxhcmdlIDR4IGZsb3cgc2l6ZS4gUmVxdWlyZWQgZm9yIEpQRUcgWFMgYW5kIENESSBwcm90b2NvbHMuIERvZXMgbm90IHN1cHBvcnQgdHJhbnNwb3J0IHN0cmVhbXMgb3IgTkRJLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMQVJHRV80WCA9IG5ldyBGbG93U2l6ZSgnTEFSR0VfNFgnKTtcblxuICAvKipcbiAgICogVXNlIGEgY3VzdG9tIGZsb3cgc2l6ZSB2YWx1ZVxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIGZsb3cgc2l6ZSBzdHJpbmcgdmFsdWVcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEZsb3dTaXplIHtcbiAgICByZXR1cm4gbmV3IEZsb3dTaXplKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIGZsb3cgc2l6ZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cblxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogTWFpbnRlbmFuY2UgV2luZG93IGNvbmZpZ3VyYXRpb24gZm9yIE1lZGlhQ29ubmVjdCBGbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW50ZW5hbmNlV2luZG93IHtcbiAgLyoqXG4gICAqIEEgZGF5IG9mIGEgd2VlayB3aGVuIHRoZSBtYWludGVuYW5jZSB3aWxsIGhhcHBlbi5cbiAgICovXG4gIHJlYWRvbmx5IG1haW50ZW5hbmNlRGF5OiBNYWludGVuYW5jZURheTtcbiAgLyoqXG4gICAqIFVUQyB0aW1lIHdoZW4gdGhlIG1haW50ZW5hbmNlIHdpbGwgaGFwcGVuLiBVc2UgMjQtaG91ciBISDpNTSBmb3JtYXQuIE1pbnV0ZXMgbXVzdCBiZSAwMC4gRXhhbXBsZTogMTM6MDAuXG4gICAqL1xuICByZWFkb25seSBtYWludGVuYW5jZVN0YXJ0SG91cjogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIG1lcmdlLW1vZGUgc291cmNlIGZhaWxvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lcmdlRmFpbG92ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgZmFpbG92ZXIgaXMgZW5hYmxlZC4gU2V0IHRvIGBTdGF0ZS5ESVNBQkxFRGAgdG8ga2VlcCB0aGUgY29uZmlndXJhdGlvblxuICAgKiBvbiB0aGUgZmxvdyB3aXRob3V0IHN3aXRjaGluZyBmYWlsb3ZlciBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhdGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFNlYXJjaCB3aW5kb3cgdGltZSB0byBsb29rIGZvciBTTVBURSAyMDIyLTcgcGFja2V0cy4gQSBsYXJnZXIgcmVjb3Zlcnkgd2luZG93XG4gICAqIG1lYW5zIGEgbG9uZ2VyIGRlbGF5IGluIHRyYW5zbWl0dGluZyB0aGUgc3RyZWFtLCBidXQgbW9yZSByb29tIGZvciBlcnJvclxuICAgKiBjb3JyZWN0aW9uLiBBIHNtYWxsZXIgd2luZG93IG1lYW5zIGEgc2hvcnRlciBkZWxheSBidXQgbGVzcyByb29tIGZvciBjb3JyZWN0aW9uLlxuICAgKlxuICAgKiBWYWxpZCByYW5nZTogMTAw4oCTMTUwMDAgbXMuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gMjAwIG1zXG4gICAqL1xuICByZWFkb25seSByZWNvdmVyeVdpbmRvdz86IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIHN3aXRjaG92ZXItbW9kZSBzb3VyY2UgZmFpbG92ZXIuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmFpbG92ZXJGYWlsb3Zlck9wdGlvbnMge1xuICAvKipcbiAgICogV2hldGhlciBmYWlsb3ZlciBpcyBlbmFibGVkLiBTZXQgdG8gYFN0YXRlLkRJU0FCTEVEYCB0byBrZWVwIHRoZSBjb25maWd1cmF0aW9uXG4gICAqIG9uIHRoZSBmbG93IHdpdGhvdXQgc3dpdGNoaW5nIGZhaWxvdmVyIG9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGF0ZS5FTkFCTEVEXG4gICAqL1xuICByZWFkb25seSBzdGF0ZT86IFN0YXRlO1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHNvdXJjZSB5b3Ugd2FudCB0byB0cmVhdCBhcyBwcmltYXJ5LiBJZiBzZXQsIE1lZGlhQ29ubmVjdCBhbHdheXNcbiAgICogdXNlcyB0aGlzIHNvdXJjZSB3aGVuIGl0IGlzIGF2YWlsYWJsZS4gV2hlbiB1bnNldCwgYm90aCBzb3VyY2VzIGFyZSB0cmVhdGVkIHdpdGhcbiAgICogZXF1YWwgcHJpb3JpdHkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYm90aCBzb3VyY2VzIGFyZSBlcXVhbCBwcmlvcml0eVxuICAgKi9cbiAgcmVhZG9ubHkgcHJpbWFyeVNvdXJjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBTb3VyY2UgZmFpbG92ZXIgY29uZmlndXJhdGlvbiBmb3IgYSBmbG93LlxuICpcbiAqIE1lZGlhQ29ubmVjdCBzdXBwb3J0cyB0d28gZmFpbG92ZXIgbW9kZXM6XG4gKiAtIHtAbGluayBGYWlsb3ZlckNvbmZpZy5tZXJnZX0gY29tYmluZXMgdHdvIGJpbmFyeS1pZGVudGljYWwgc291cmNlcyBpbnRvIGEgc2luZ2xlXG4gKiAgIHN0cmVhbSwgcmVjb3ZlcmluZyBsb3N0IHBhY2tldHMgZnJvbSB0aGUgb3RoZXIgc291cmNlIChTTVBURSAyMDIyLTcpLlxuICogLSB7QGxpbmsgRmFpbG92ZXJDb25maWcuZmFpbG92ZXJ9IHN3aXRjaGVzIGJldHdlZW4gYSBwcmltYXJ5IGFuZCBiYWNrdXAgc291cmNlIHdoZW5cbiAqICAgdGhlIGFjdGl2ZSBzb3VyY2Ugc3RvcHMgcmVjZWl2aW5nIGRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBGYWlsb3ZlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBDb25maWd1cmUgbWVyZ2UtbW9kZSBmYWlsb3Zlci4gUmVxdWlyZXMgdHdvIGJpbmFyeS1pZGVudGljYWwgc291cmNlcy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbWVyZ2Uob3B0aW9uczogTWVyZ2VGYWlsb3Zlck9wdGlvbnMgPSB7fSk6IEZhaWxvdmVyQ29uZmlnIHtcbiAgICBpZiAob3B0aW9ucy5yZWNvdmVyeVdpbmRvdykge1xuICAgICAgY29uc3QgbXMgPSBvcHRpb25zLnJlY292ZXJ5V2luZG93LnRvTWlsbGlzZWNvbmRzKCk7XG4gICAgICBpZiAobXMgPCAxMDAgfHwgbXMgPiAxNTAwMCkge1xuICAgICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YFJlY292ZXJ5V2luZG93UmFuZ2VgLCBgUmVjb3Zlcnkgd2luZG93IG11c3QgYmUgYmV0d2VlbiAxMDAgYW5kIDE1MDAwIG1zLCBnb3QgJHttc31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBGYWlsb3ZlckNvbmZpZyhGYWlsb3Zlck1vZGUuTUVSR0UsIG9wdGlvbnMuc3RhdGUgPz8gU3RhdGUuRU5BQkxFRCwgb3B0aW9ucy5yZWNvdmVyeVdpbmRvdywgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmUgc3dpdGNob3Zlci1tb2RlIGZhaWxvdmVyLiBUaGUgZmxvdyBzd2FwcyB0byB0aGUgYmFja3VwIHNvdXJjZSB3aGVuIHRoZVxuICAgKiBwcmltYXJ5IHNvdXJjZSBzdG9wcyByZWNlaXZpbmcgZGF0YS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZmFpbG92ZXIob3B0aW9uczogRmFpbG92ZXJGYWlsb3Zlck9wdGlvbnMgPSB7fSk6IEZhaWxvdmVyQ29uZmlnIHtcbiAgICByZXR1cm4gbmV3IEZhaWxvdmVyQ29uZmlnKEZhaWxvdmVyTW9kZS5GQUlMT1ZFUiwgb3B0aW9ucy5zdGF0ZSA/PyBTdGF0ZS5FTkFCTEVELCB1bmRlZmluZWQsIG9wdGlvbnMucHJpbWFyeVNvdXJjZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2ZhaWxvdmVyTW9kZTogRmFpbG92ZXJNb2RlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3N0YXRlOiBTdGF0ZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9yZWNvdmVyeVdpbmRvdzogRHVyYXRpb24gfCB1bmRlZmluZWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcHJpbWFyeVNvdXJjZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBmYWlsb3ZlciBlbmFibGVkLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBnZXQgX2lzRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGUgPT09IFN0YXRlLkVOQUJMRUQ7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8gYSBGbG93LlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5GbG93LkZhaWxvdmVyQ29uZmlnUHJvcGVydHkge1xuICAgIHJldHVybiB7XG4gICAgICBmYWlsb3Zlck1vZGU6IHRoaXMuX2ZhaWxvdmVyTW9kZS52YWx1ZSxcbiAgICAgIHJlY292ZXJ5V2luZG93OiB0aGlzLl9yZWNvdmVyeVdpbmRvdz8udG9NaWxsaXNlY29uZHMoKSxcbiAgICAgIHNvdXJjZVByaW9yaXR5OiB0aGlzLl9wcmltYXJ5U291cmNlID8geyBwcmltYXJ5U291cmNlOiB0aGlzLl9wcmltYXJ5U291cmNlIH0gOiB1bmRlZmluZWQsXG4gICAgICBzdGF0ZTogdGhpcy5fc3RhdGUsXG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBzb3VyY2UgbW9uaXRvcmluZyBtZXRyaWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9uaXRvcmluZ01ldHJpYyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBtZXRyaWMgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhlIHRocmVzaG9sZCBpcyBwZXJzaXN0ZWQgYnkgdGhlXG4gICAqIHNlcnZpY2UgZWl0aGVyIHdheSwgc28geW91IGNhbiB0b2dnbGUgdGhlIG1ldHJpYyBvbiBhbmQgb2ZmIHdpdGhvdXQgbG9zaW5nXG4gICAqIHRoZSB0aHJlc2hvbGQgdmFsdWUuXG4gICAqL1xuICByZWFkb25seSBzdGF0ZTogU3RhdGU7XG4gIC8qKlxuICAgKiBUaHJlc2hvbGQgaW4gc2Vjb25kcyB0aGF0IHRyaWdnZXJzIHRoZSBtZXRyaWMncyBhbGVydC4gVmFsaWQgcmFuZ2U6IDEw4oCTNjAgc2Vjb25kcy5cbiAgICovXG4gIHJlYWRvbmx5IHRocmVzaG9sZDogRHVyYXRpb247XG59XG5cbi8qKlxuICogU291cmNlIG1vbml0b3Jpbmcgc2V0dGluZ3MuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU291cmNlTW9uaXRvcmluZ0NvbmZpZyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBjb250ZW50IHF1YWxpdHkgYW5hbHlzaXMgaXMgZW5hYmxlZCBvciBkaXNhYmxlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBjb250ZW50IHF1YWxpdHkgYW5hbHlzaXMgaXMgZGlzYWJsZWRcbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnRRdWFsaXR5QW5hbHlzaXNTdGF0ZT86IFN0YXRlO1xuICAvKipcbiAgICogVGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIHRodW1ibmFpbCBtb25pdG9yaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRodW1ibmFpbCBtb25pdG9yaW5nIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSB0aHVtYm5haWxTdGF0ZT86IFN0YXRlO1xuICAvKipcbiAgICogU2lsZW50LWF1ZGlvIGRldGVjdGlvbiBvbiB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHNpbGVudCBhdWRpbyBtb25pdG9yaW5nIGlzIG5vdCBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBzaWxlbnRBdWRpbz86IE1vbml0b3JpbmdNZXRyaWM7XG4gIC8qKlxuICAgKiBCbGFjay1mcmFtZXMgZGV0ZWN0aW9uIG9uIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYmxhY2sgZnJhbWVzIG1vbml0b3JpbmcgaXMgbm90IGNvbmZpZ3VyZWRcbiAgICovXG4gIHJlYWRvbmx5IGJsYWNrRnJhbWVzPzogTW9uaXRvcmluZ01ldHJpYztcbiAgLyoqXG4gICAqIEZyb3plbi1mcmFtZXMgZGV0ZWN0aW9uIG9uIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZnJvemVuIGZyYW1lcyBtb25pdG9yaW5nIGlzIG5vdCBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBmcm96ZW5GcmFtZXM/OiBNb25pdG9yaW5nTWV0cmljO1xufVxuXG4vKipcbiAqIE5ESSBDb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmRpRGlzY292ZXJ5U2VydmVyQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSB1bmlxdWUgbmV0d29yayBhZGRyZXNzIG9mIHRoZSBOREkgZGlzY292ZXJ5IHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IGRpc2NvdmVyeVNlcnZlckFkZHJlc3M6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwb3J0IGZvciB0aGUgTkRJIGRpc2NvdmVyeSBzZXJ2ZXIuIERlZmF1bHRzIHRvIDU5NTkgaWYgYSBjdXN0b20gcG9ydCBpc24ndCBzcGVjaWZpZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkOyB3aGVuIG9taXR0ZWQsIE1lZGlhQ29ubmVjdCBhcHBsaWVzIDU5NTkgYXQgZGVwbG95IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGRpc2NvdmVyeVNlcnZlclBvcnQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgVlBDIGludGVyZmFjZSB0aGF0IHRoZSBOREkgZGlzY292ZXJ5IHNlcnZlciB1c2VzIHRvIHJlYWNoIHRoZSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgdnBjSW50ZXJmYWNlOiBWcGNJbnRlcmZhY2VDb25maWc7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgTkRJIENvbmZpZ1xuICovXG5leHBvcnQgaW50ZXJmYWNlIE5kaUNvbmZpZyB7XG4gIC8qKlxuICAgKiBBIHByZWZpeCBmb3IgdGhlIG5hbWVzIG9mIHRoZSBOREkgc291cmNlcyB0aGF0IHRoZSBmbG93IGNyZWF0ZXMuXG4gICAqIElmIGEgY3VzdG9tIG5hbWUgaXNuJ3Qgc3BlY2lmaWVkLCBNZWRpYUNvbm5lY3QgZ2VuZXJhdGVzIGEgdW5pcXVlIDEyLWNoYXJhY3RlciBJRCBhcyB0aGUgcHJlZml4LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIE1lZGlhQ29ubmVjdCBnZW5lcmF0ZXMgYSB1bmlxdWUgMTItY2hhcmFjdGVyIElEXG4gICAqL1xuICByZWFkb25seSBtYWNoaW5lTmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgaW5kaXZpZHVhbCBOREkgZGlzY292ZXJ5IHNlcnZlcnMuXG4gICAqIEEgbWF4aW11bSBvZiAzIHNlcnZlcnMgaXMgYWxsb3dlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBOREkgZGlzY292ZXJ5IHNlcnZlcnNcbiAgICovXG4gIHJlYWRvbmx5IG5kaURpc2NvdmVyeVNlcnZlcnM/OiBOZGlEaXNjb3ZlcnlTZXJ2ZXJDb25maWdbXTtcbiAgLyoqXG4gICAqIEEgc2V0dGluZyB0aGF0IGNvbnRyb2xzIHdoZXRoZXIgTkRJIHNvdXJjZXMgb3Igb3V0cHV0cyBjYW4gYmUgdXNlZCBpbiB0aGUgZmxvdy5cbiAgICogTXVzdCBiZSBFTkFCTEVEIGZvciB0aGUgZmxvdyB0byBzdXBwb3J0IE5ESSBzb3VyY2VzIG9yIG91dHB1dHMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0YXRlLkRJU0FCTEVEXG4gICAqL1xuICByZWFkb25seSBuZGlTdGF0ZT86IFN0YXRlO1xufVxuXG4vKipcbiAqIEVuY29kaW5nIHByb2ZpbGVzIHN1cHBvcnRlZCB3aGVuIHRyYW5zY29kaW5nIGFuIE5ESSBzb3VyY2UgdG8gYSB0cmFuc3BvcnQgc3RyZWFtLlxuICovXG5leHBvcnQgZW51bSBFbmNvZGluZ1Byb2ZpbGUge1xuICAvKipcbiAgICogSC4yNjQgcHJvZmlsZSB0dW5lZCBmb3IgY29udHJpYnV0aW9uIHdvcmtmbG93cyDigJQgaGlnaGVyIHF1YWxpdHksIGhpZ2hlciBiaXRyYXRlLlxuICAgKi9cbiAgQ09OVFJJQlVUSU9OX0gyNjRfREVGQVVMVCA9ICdDT05UUklCVVRJT05fSDI2NF9ERUZBVUxUJyxcbiAgLyoqXG4gICAqIEguMjY0IHByb2ZpbGUgdHVuZWQgZm9yIGRpc3RyaWJ1dGlvbiB3b3JrZmxvd3Mg4oCUIGxvd2VyIGJpdHJhdGUsIHdpZGVyIGNvbXBhdGliaWxpdHkuXG4gICAqL1xuICBESVNUUklCVVRJT05fSDI2NF9ERUZBVUxUID0gJ0RJU1RSSUJVVElPTl9IMjY0X0RFRkFVTFQnLFxufVxuXG4vKipcbiAqIEVuY29kaW5nIGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byBhbiBOREkgc291cmNlIHdoZW4gdHJhbnNjb2RpbmcgaXQgdG8gYSB0cmFuc3BvcnRcbiAqIHN0cmVhbSBmb3IgZG93bnN0cmVhbSBkaXN0cmlidXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2RpbmdDb25maWcge1xuICAvKipcbiAgICogVGhlIGVuY29kaW5nIHByb2ZpbGUgdG8gdXNlIHdoZW4gdHJhbnNjb2RpbmcgdGhlIE5ESSBzb3VyY2UgY29udGVudCB0byBhIHRyYW5zcG9ydFxuICAgKiBzdHJlYW0uIFlvdSBjYW4gY2hhbmdlIHRoaXMgdmFsdWUgd2hpbGUgdGhlIGZsb3cgaXMgcnVubmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgTWVkaWFDb25uZWN0IHNlcnZpY2UgZGVmYXVsdFxuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2RpbmdQcm9maWxlPzogRW5jb2RpbmdQcm9maWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB2aWRlbyBiaXRyYXRlIHRvIHVzZSB3aGVuIHRyYW5zY29kaW5nIHRoZSBOREkgc291cmNlIHRvIGEgdHJhbnNwb3J0IHN0cmVhbS5cbiAgICpcbiAgICogVGhlIHN1cHBvcnRlZCByYW5nZSBpcyAxMCBNYnBzIOKAkyA1MCBNYnBzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgYXBwbGllcyAyMCBNYnBzIGF0IGRlcGxveSB0aW1lXG4gICAqL1xuICByZWFkb25seSB2aWRlb01heEJpdHJhdGU/OiBCaXRyYXRlO1xufVxuXG4vKipcbiAqIE9wdGlvbiBmb3IgQ29sb3JpbWV0cnlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbG9yaW1ldHJ5IHtcbiAgLyoqIE9wdGlvbiBmb3IgQlQ2MDEgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCVDYwMSA9IG5ldyBDb2xvcmltZXRyeSgnQlQ2MDEnKTtcbiAgLyoqIE9wdGlvbiBmb3IgQlQ3MDkgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCVDcwOSA9IG5ldyBDb2xvcmltZXRyeSgnQlQ3MDknKTtcbiAgLyoqIE9wdGlvbiBmb3IgQlQyMDIwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQyMDIwID0gbmV3IENvbG9yaW1ldHJ5KCdCVDIwMjAnKTtcbiAgLyoqIE9wdGlvbiBmb3IgQlQyMTAwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQyMTAwID0gbmV3IENvbG9yaW1ldHJ5KCdCVDIxMDAnKTtcbiAgLyoqIE9wdGlvbiBmb3IgU1QyMDY1LTEgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVDIwNjVfMSA9IG5ldyBDb2xvcmltZXRyeSgnU1QyMDY1LTEnKTtcbiAgLyoqIE9wdGlvbiBmb3IgU1QyMDY1LTMgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVDIwNjVfMyA9IG5ldyBDb2xvcmltZXRyeSgnU1QyMDY1LTMnKTtcbiAgLyoqIE9wdGlvbiBmb3IgWFlaICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgWFlaID0gbmV3IENvbG9yaW1ldHJ5KCdYWVonKTtcblxuICAvKiogVXNlIGEgY3VzdG9tIGNvbG9yaW1ldHJ5IHZhbHVlICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IENvbG9yaW1ldHJ5IHsgcmV0dXJuIG5ldyBDb2xvcmltZXRyeSh2YWx1ZSk7IH1cbiAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgY29sb3JpbWV0cnkgc3RyaW5nIHZhbHVlICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgVmlkZW8gUmFuZ2VcbiAqL1xuZXhwb3J0IGNsYXNzIFZpZGVvUmFuZ2Uge1xuICAvKiogT3B0aW9uIGZvciBOYXJyb3cgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBOQVJST1cgPSBuZXcgVmlkZW9SYW5nZSgnTkFSUk9XJyk7XG4gIC8qKiBPcHRpb24gZm9yIEZ1bGwgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBGVUxMID0gbmV3IFZpZGVvUmFuZ2UoJ0ZVTEwnKTtcbiAgLyoqIE9wdGlvbiBmb3IgRnVsbCBQcm90ZWN0ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlVMTFBST1RFQ1QgPSBuZXcgVmlkZW9SYW5nZSgnRlVMTFBST1RFQ1QnKTtcblxuICAvKiogVXNlIGEgY3VzdG9tIHZpZGVvIHJhbmdlIHZhbHVlICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IFZpZGVvUmFuZ2UgeyByZXR1cm4gbmV3IFZpZGVvUmFuZ2UodmFsdWUpOyB9XG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHZpZGVvIHJhbmdlIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFNjYW4gTW9kZVxuICovXG5leHBvcnQgY2xhc3MgU2Nhbk1vZGUge1xuICAvKiogT3B0aW9uIGZvciBQcm9ncmVzc2l2ZSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST0dSRVNTSVZFID0gbmV3IFNjYW5Nb2RlKCdwcm9ncmVzc2l2ZScpO1xuICAvKiogT3B0aW9uIGZvciBJbnRlcmxhY2UgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBJTlRFUkxBQ0UgPSBuZXcgU2Nhbk1vZGUoJ2ludGVybGFjZScpO1xuICAvKiogT3B0aW9uIGZvciBQcm9ncmVzc2l2ZSBTZWdtZW50ZWQgRnJhbWUgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9HUkVTU0lWRV9TRUdNRU5URURfRlJBTUUgPSBuZXcgU2Nhbk1vZGUoJ3Byb2dyZXNzaXZlLXNlZ21lbnRlZC1mcmFtZScpO1xuXG4gIC8qKiBVc2UgYSBjdXN0b20gc2NhbiBtb2RlIHZhbHVlICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IFNjYW5Nb2RlIHsgcmV0dXJuIG5ldyBTY2FuTW9kZSh2YWx1ZSk7IH1cbiAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgc2NhbiBtb2RlIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFRjc1xuICovXG5leHBvcnQgY2xhc3MgVGNzIHtcbiAgLyoqIE9wdGlvbiBmb3IgU0RSICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0RSID0gbmV3IFRjcygnU0RSJyk7XG4gIC8qKiBPcHRpb24gZm9yIFBRICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFEgPSBuZXcgVGNzKCdQUScpO1xuICAvKiogT3B0aW9uIGZvciBITEcgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBITEcgPSBuZXcgVGNzKCdITEcnKTtcbiAgLyoqIE9wdGlvbiBmb3IgTGluZWFyICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTElORUFSID0gbmV3IFRjcygnTElORUFSJyk7XG4gIC8qKiBPcHRpb24gZm9yIEJUMjEwMExJTlBRICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQyMTAwTElOUFEgPSBuZXcgVGNzKCdCVDIxMDBMSU5QUScpO1xuICAvKiogT3B0aW9uIGZvciBCVDIxMDBMSU5ITEcgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBCVDIxMDBMSU5ITEcgPSBuZXcgVGNzKCdCVDIxMDBMSU5ITEcnKTtcbiAgLyoqIE9wdGlvbiBmb3IgU1QyMDY1LTEgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVDIwNjVfMSA9IG5ldyBUY3MoJ1NUMjA2NS0xJyk7XG4gIC8qKiBPcHRpb24gZm9yIFNUNDI4LTEgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVDQyOF8xID0gbmV3IFRjcygnU1Q0MjgtMScpO1xuICAvKiogT3B0aW9uIGZvciBEZW5zaXR5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVOU0lUWSA9IG5ldyBUY3MoJ0RFTlNJVFknKTtcblxuICAvKiogVXNlIGEgY3VzdG9tIFRDUyB2YWx1ZSAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBUY3MgeyByZXR1cm4gbmV3IFRjcyh2YWx1ZSk7IH1cbiAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgVENTIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIEZNVFAgVmlkZW9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbXRwVmlkZW8ge1xuICAvKipcbiAgICogVGhlIGZvcm1hdCB1c2VkIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgY29sb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gY29sb3JpbWV0cnkgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBjb2xvcmltZXRyeT86IENvbG9yaW1ldHJ5O1xuICAvKipcbiAgICogVGhlIGZyYW1lIHJhdGUgZm9yIHRoZSB2aWRlbyBzdHJlYW0uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZnJhbWUgcmF0ZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IGV4YWN0RnJhbWVyYXRlPzogRnJhbWVyYXRlO1xuICAvKipcbiAgICogVGhlIHBpeGVsIGFzcGVjdCByYXRpbyAoUEFSKSBvZiB0aGUgdmlkZW8g4oCUIHRoZSBzaGFwZSBvZiBhIHNpbmdsZSBwaXhlbCwgbm90IHRoZVxuICAgKiBkaXNwbGF5IGFzcGVjdCByYXRpby4gVXNlIGBQaXhlbEFzcGVjdFJhdGlvLlNRVUFSRWAgZm9yIG1vc3QgbW9kZXJuIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGl4ZWwgYXNwZWN0IHJhdGlvIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcGFyPzogUGl4ZWxBc3BlY3RSYXRpbztcbiAgLyoqXG4gICAqIFRoZSBlbmNvZGluZyByYW5nZSBvZiB0aGUgdmlkZW8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gdmlkZW8gcmFuZ2Ugc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB2aWRlb1JhbmdlPzogVmlkZW9SYW5nZTtcbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIGNvbXByZXNzaW9uIHRoYXQgd2FzIHVzZWQgdG8gc21vb3RoIHRoZSB2aWRlbydzIGFwcGVhcmFuY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gc2NhbiBtb2RlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgc2Nhbk1vZGU/OiBTY2FuTW9kZTtcbiAgLyoqXG4gICAqIFRoZSB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpYyBzeXN0ZW0gKFRDUykgdGhhdCBpcyB1c2VkIGluIHRoZSB2aWRlby5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBUQ1Mgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSB0Y3M/OiBUY3M7XG59XG5cbi8qKlxuICogQXVkaW8gU3RyZWFtIE9yZGVyIE9wdGlvbnNcbiAqL1xuZXhwb3J0IGNsYXNzIEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zIHtcbiAgLyoqIE1vbm8gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBNT05PID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKE0pJyk7XG4gIC8qKiBEdWFsIE1vbm8gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBEVUFMX01PTk8gPSBuZXcgQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMoJ1NNUFRFMjExMC4oRE0pJyk7XG4gIC8qKiBTdGFuZGFyZCBTdGVyZW8gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVEFOREFSRF9TVEVSRU8gPSBuZXcgQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMoJ1NNUFRFMjExMC4oU1QpJyk7XG4gIC8qKiBMZWZ0IFJpZ2h0IE1hdHJpeCBTdGVyZW8gKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBMVFJUX01BVFJJWF9TVEVSRU8gPSBuZXcgQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMoJ1NNUFRFMjExMC4oTHRSdCknKTtcbiAgLyoqIDUuMSBTdXJyb3VuZCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNVUlJPVU5EXzVfMSA9IG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucygnU01QVEUyMTEwLig1MSknKTtcbiAgLyoqIDcuMSBTdXJyb3VuZCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNVUlJPVU5EXzdfMSA9IG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucygnU01QVEUyMTEwLig3MSknKTtcbiAgLyoqIDIyLjIgU3Vycm91bmQgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVVJST1VORF8yMl8yID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKDIyMiknKTtcbiAgLyoqIE9uZSBTREkgQXVkaW8gR3JvdXAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBPTkVfU0RJX0FVRElPX0dST1VQID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKFNHUlApJyk7XG5cbiAgLyoqIFVzZSBhIGN1c3RvbSBhdWRpbyBzdHJlYW0gb3JkZXIgdmFsdWUgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMgeyByZXR1cm4gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKHZhbHVlKTsgfVxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSBhdWRpbyBzdHJlYW0gb3JkZXIgc3RyaW5nIHZhbHVlICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgTWVkaWEgU3RyZWFtIFR5cGVcbiAqXG4gKiBAaW50ZXJuYWxcbiAqL1xuZW51bSBNZWRpYVN0cmVhbVR5cGUge1xuICAvKipcbiAgICogT3B0aW9uIGZvciBWaWRlb1xuICAgKi9cbiAgVklERU89J3ZpZGVvJyxcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgQXVkaW9cbiAgICovXG4gIEFVRElPPSdhdWRpbycsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIGFuY2lsbGFyeSBkYXRhXG4gICAqL1xuICBBTkNJTExBUllfREFUQT0nYW5jaWxsYXJ5LWRhdGEnLFxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIE1lZGlhIFZpZGVvIGZvcm1hdFxuICovXG5leHBvcnQgY2xhc3MgTWVkaWFWaWRlb0Zvcm1hdCB7XG4gIC8qKiBPcHRpb24gZm9yIDIxNjBwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgVUhEXzIxNjBQID0gbmV3IE1lZGlhVmlkZW9Gb3JtYXQoJzIxNjBwJyk7XG4gIC8qKiBPcHRpb24gZm9yIDEwODBwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSERfMTA4MFAgPSBuZXcgTWVkaWFWaWRlb0Zvcm1hdCgnMTA4MHAnKTtcbiAgLyoqIE9wdGlvbiBmb3IgMTA4MGkgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBIRF8xMDgwSSA9IG5ldyBNZWRpYVZpZGVvRm9ybWF0KCcxMDgwaScpO1xuICAvKiogT3B0aW9uIGZvciA3MjBwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSERfNzIwUCA9IG5ldyBNZWRpYVZpZGVvRm9ybWF0KCc3MjBwJyk7XG4gIC8qKiBPcHRpb24gZm9yIDQ4MHAgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTRF80ODBQID0gbmV3IE1lZGlhVmlkZW9Gb3JtYXQoJzQ4MHAnKTtcblxuICAvKiogVXNlIGEgY3VzdG9tIHZpZGVvIGZvcm1hdCB2YWx1ZSAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBNZWRpYVZpZGVvRm9ybWF0IHsgcmV0dXJuIG5ldyBNZWRpYVZpZGVvRm9ybWF0KHZhbHVlKTsgfVxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSB2aWRlbyBmb3JtYXQgc3RyaW5nIHZhbHVlICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG4gIC8qKiBSZXR1cm5zIHRoZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHVibGljIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnZhbHVlOyB9XG59XG5cbi8qKlxuICogQmFzZSBjb25maWd1cmF0aW9uIGZvciBNZWRpYSBTdHJlYW0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFTdHJlYW1CYXNlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBtZWRpYSBzdHJlYW0uXG4gICAqL1xuICByZWFkb25seSBtZWRpYVN0cmVhbUlkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBBIG5hbWUgdGhhdCBoZWxwcyB5b3UgZGlzdGluZ3Vpc2ggb25lIG1lZGlhIHN0cmVhbSBmcm9tIGFub3RoZXIuXG4gICAqL1xuICByZWFkb25seSBtZWRpYVN0cmVhbU5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgZGVzY3JpcHRpb24gdGhhdCBjYW4gaGVscCB5b3UgcXVpY2tseSBpZGVudGlmeSB3aGF0IHlvdXIgbWVkaWEgc3RyZWFtIGlzIHVzZWQgZm9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG1lZGlhIHN0cmVhbSByZXByZXNlbnRzIG9uZSBjb21wb25lbnQgb2YgeW91ciBjb250ZW50LCBzdWNoIGFzIHZpZGVvLCBhdWRpbywgb3IgYW5jaWxsYXJ5IGRhdGEuXG4gKiBBZnRlciB5b3UgYWRkIGEgbWVkaWEgc3RyZWFtIHRvIHlvdXIgZmxvdywgeW91IGNhbiBhc3NvY2lhdGUgaXQgd2l0aCBzb3VyY2VzIGFuZCBvdXRwdXRzIHRoYXQgdXNlXG4gKiB0aGUgU1QgMjExMCBKUEVHIFhTIG9yIENESSBwcm90b2NvbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYVN0cmVhbVZpZGVvIGV4dGVuZHMgTWVkaWFTdHJlYW1CYXNlIHtcbiAgLyoqXG4gICAqIEF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVsYXRlZCB0byB0aGUgbWVkaWEgc3RyZWFtLlxuICAgKi9cbiAgcmVhZG9ubHkgZm10cDogRm10cFZpZGVvO1xuICAvKipcbiAgICogVGhlIHNhbXBsZSByYXRlIGZvciB0aGUgc3RyZWFtLiBUaGlzIHZhbHVlIGlzIG1lYXN1cmVkIGluIEh6LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgY2xvY2sgcmF0ZSBmb3IgdGhlIG1lZGlhIHN0cmVhbSB0eXBlXG4gICAqL1xuICByZWFkb25seSBjbG9ja1JhdGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IHR5cGUgbnVtYmVyIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgUlRQIHBheWxvYWQgdHlwZSkgb2YgdGhlIG1lZGlhIHN0cmVhbS5cbiAgICogTWVkaWFDb25uZWN0IGFzc2lnbnMgdGhpcyB2YWx1ZSB0byB0aGUgbWVkaWEgc3RyZWFtLiBGb3IgU1QgMjExMCBKUEVHIFhTIG91dHB1dHMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgdGhpcyB2YWx1ZSB0byB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXNzaWduZWQgYnkgTWVkaWFDb25uZWN0XG4gICAqL1xuICByZWFkb25seSBmbXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgcmVzb2x1dGlvbiBvZiB0aGUgdmlkZW8uXG4gICAqL1xuICByZWFkb25seSB2aWRlb0Zvcm1hdDogTWVkaWFWaWRlb0Zvcm1hdDtcbn1cblxuLyoqXG4gKiBBIG1lZGlhIHN0cmVhbSByZXByZXNlbnRzIG9uZSBjb21wb25lbnQgb2YgeW91ciBjb250ZW50LCBzdWNoIGFzIHZpZGVvLCBhdWRpbywgb3IgYW5jaWxsYXJ5IGRhdGEuXG4gKiBBZnRlciB5b3UgYWRkIGEgbWVkaWEgc3RyZWFtIHRvIHlvdXIgZmxvdywgeW91IGNhbiBhc3NvY2lhdGUgaXQgd2l0aCBzb3VyY2VzIGFuZCBvdXRwdXRzIHRoYXQgdXNlXG4gKiB0aGUgU1QgMjExMCBKUEVHIFhTIG9yIENESSBwcm90b2NvbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYVN0cmVhbUF1ZGlvIGV4dGVuZHMgTWVkaWFTdHJlYW1CYXNlIHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgb2YgdGhlIGF1ZGlvIGNoYW5uZWwuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIE1lZGlhQ29ubmVjdCBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGNoYW5uZWxPcmRlcj86IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zO1xuICAvKipcbiAgICogVGhlIHNhbXBsZSByYXRlIGZvciB0aGUgc3RyZWFtLiBUaGlzIHZhbHVlIGlzIG1lYXN1cmVkIGluIEh6LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRlZmF1bHQgY2xvY2sgcmF0ZSBmb3IgdGhlIG1lZGlhIHN0cmVhbSB0eXBlXG4gICAqL1xuICByZWFkb25seSBjbG9ja1JhdGU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IHR5cGUgbnVtYmVyIChzb21ldGltZXMgcmVmZXJyZWQgdG8gYXMgUlRQIHBheWxvYWQgdHlwZSkgb2YgdGhlIG1lZGlhIHN0cmVhbS5cbiAgICogTWVkaWFDb25uZWN0IGFzc2lnbnMgdGhpcyB2YWx1ZSB0byB0aGUgbWVkaWEgc3RyZWFtLiBGb3IgU1QgMjExMCBKUEVHIFhTIG91dHB1dHMsIHlvdSBuZWVkIHRvIHByb3ZpZGUgdGhpcyB2YWx1ZSB0byB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXNzaWduZWQgYnkgTWVkaWFDb25uZWN0XG4gICAqL1xuICByZWFkb25seSBmbXQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgYXVkaW8gbGFuZ3VhZ2UsIGluIGEgZm9ybWF0IHRoYXQgaXMgcmVjb2duaXplZCBieSB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gbGFuZ3VhZ2Ugc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBsYW5nPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEEgbWVkaWEgc3RyZWFtIHJlcHJlc2VudHMgb25lIGNvbXBvbmVudCBvZiB5b3VyIGNvbnRlbnQsIHN1Y2ggYXMgdmlkZW8sIGF1ZGlvLCBvciBhbmNpbGxhcnkgZGF0YS5cbiAqIEFmdGVyIHlvdSBhZGQgYSBtZWRpYSBzdHJlYW0gdG8geW91ciBmbG93LCB5b3UgY2FuIGFzc29jaWF0ZSBpdCB3aXRoIHNvdXJjZXMgYW5kIG91dHB1dHMgdGhhdCB1c2VcbiAqIHRoZSBTVCAyMTEwIEpQRUcgWFMgb3IgQ0RJIHByb3RvY29sLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhU3RyZWFtQW5jaWxsYXJ5RGF0YSBleHRlbmRzIE1lZGlhU3RyZWFtQmFzZSB7IH1cblxuLyoqXG4gKiBQcm9wZXJ0aWVzIGZvciB0aGUgRmxvd1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdXRvZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBmbG93TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lIHRoYXQgeW91IHdhbnQgdG8gY3JlYXRlIHRoZSBmbG93IGluLiBUaGVzZSBvcHRpb25zIGFyZSBsaW1pdGVkIHRvIHRoZSBBdmFpbGFiaWxpdHkgWm9uZXMgd2l0aGluIHRoZSBjdXJyZW50IEFXUyBSZWdpb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY2hvc2VuIGJ5IE1lZGlhQ29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgYXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgcHJvY2Vzc2luZyBjYXBhY2l0eSBhbmQgZmVhdHVyZSBzZXQgb2YgdGhlIGZsb3cuIFNldCB0aGlzIG9wdGlvbmFsIHBhcmFtZXRlciB0byBMQVJHRSBpZiB5b3Ugd2FudCB0byBlbmFibGUgTkRJIG91dHB1dHMgb24gdGhlIGZsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdW5kZWZpbmVkOyB3aGVuIG9taXR0ZWQsIE1lZGlhQ29ubmVjdCBhcHBsaWVzIEZsb3dTaXplLk1FRElVTSBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd1NpemU/OiBGbG93U2l6ZTtcblxuICAvKipcbiAgICogVGhlIG1haW50ZW5hbmNlIHdpbmRvdyBmb3IgdGhlIGZsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY2hvc2VuIGJ5IE1lZGlhQ29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgbWFpbnRlbmFuY2U/OiBNYWludGVuYW5jZVdpbmRvdztcblxuICAvKipcbiAgICogVGhlIG1lZGlhIHN0cmVhbXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmbG93LiBBZnRlciB5b3UgYXNzb2NpYXRlIGEgbWVkaWEgc3RyZWFtIHdpdGggYSBzb3VyY2UsIHlvdSBjYW4gYWxzbyBhc3NvY2lhdGUgaXQgd2l0aCBvdXRwdXRzIG9uIHRoZSBmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBNZWRpYSBTdHJlYW1zXG4gICAqL1xuICByZWFkb25seSBtZWRpYVN0cmVhbXM/OiBNZWRpYVN0cmVhbVtdO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGEgZmxvdydzIE5ESSBzb3VyY2Ugb3Igb3V0cHV0LiBSZXF1aXJlZCB3aGVuIHRoZSBmbG93IGluY2x1ZGVzIGFuIE5ESSBzb3VyY2Ugb3Igb3V0cHV0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBOREkgQ29uZmlndXJhdGlvbiBhcHBsaWVkXG4gICAqL1xuICByZWFkb25seSBuZGlDb25maWc/OiBOZGlDb25maWc7XG5cbiAgLyoqXG4gICAqIEVuY29kaW5nIGNvbmZpZ3VyYXRpb24gYXBwbGllZCB0byB0aGUgTkRJIHNvdXJjZSB3aGVuIHRyYW5zY29kaW5nIGl0IHRvIGEgdHJhbnNwb3J0XG4gICAqIHN0cmVhbSBmb3IgZG93bnN0cmVhbSBkaXN0cmlidXRpb24uXG4gICAqXG4gICAqIFJlcXVpcmVkIHdoZW4gdGhlIGZsb3cgc291cmNlIHVzZXMgdGhlIE5ESSBTcGVlZEhRIHByb3RvY29sXG4gICAqIChzZWUge0BsaW5rIFNvdXJjZUNvbmZpZ3VyYXRpb24ubmRpfSkuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gZW5jb2RpbmcgY29uZmlnOyByZXF1aXJlZCBmb3IgTkRJIHNvdXJjZXNcbiAgICovXG4gIHJlYWRvbmx5IGVuY29kaW5nQ29uZmlnPzogRW5jb2RpbmdDb25maWc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBmb3IgdGhlIHNvdXJjZSB0aGF0IHlvdSB3YW50IHRvIHVzZSBmb3IgdGhlIG5ldyBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlOiBTb3VyY2VDb25maWd1cmF0aW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgZm9yIHNvdXJjZSBmYWlsb3Zlci5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gc291cmNlIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gYXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlRmFpbG92ZXJDb25maWc/OiBGYWlsb3ZlckNvbmZpZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGZvciBzb3VyY2UgbW9uaXRvcmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgTm8gc291cmNlIG1vbml0b3JpbmcgY29uZmlndXJhdGlvbiBhcHBsaWVkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VNb25pdG9yaW5nQ29uZmlnPzogU291cmNlTW9uaXRvcmluZ0NvbmZpZztcblxuICAvKipcbiAgICogVGhlIFZQQyBJbnRlcmZhY2VzIGZvciB0aGlzIGZsb3cuXG4gICAqXG4gICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgdGhlIEZsb3dWcGNJbnRlcmZhY2UgY29uc3RydWN0LlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBWUEMgSW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gYXBwbGllZFxuICAgKi9cbiAgcmVhZG9ubHkgdnBjSW50ZXJmYWNlcz86IFZwY0ludGVyZmFjZUNvbmZpZ1tdO1xuXG59XG5cbi8qKlxuICogU2ltcGxpZmllZCBjb25maWd1cmF0aW9uIGZvciBNZWRpYSBTdHJlYW1zXG4gKi9cbmV4cG9ydCBjbGFzcyBNZWRpYVN0cmVhbSB7XG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBNZWRpYVN0cmVhbSBWaWRlb1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2aWRlbyhjb25maWc6IE1lZGlhU3RyZWFtVmlkZW8pOiBNZWRpYVN0cmVhbSB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYVN0cmVhbSh7XG4gICAgICBtZWRpYVN0cmVhbUlkOiBjb25maWcubWVkaWFTdHJlYW1JZCxcbiAgICAgIG1lZGlhU3RyZWFtTmFtZTogY29uZmlnLm1lZGlhU3RyZWFtTmFtZSxcbiAgICAgIHZpZGVvRm9ybWF0OiBjb25maWcudmlkZW9Gb3JtYXQudmFsdWUsXG4gICAgICBjbG9ja1JhdGU6IGNvbmZpZy5jbG9ja1JhdGUsXG4gICAgICBmbXQ6IGNvbmZpZy5mbXQsXG4gICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBmbXRwOiB7XG4gICAgICAgICAgZXhhY3RGcmFtZXJhdGU6IGNvbmZpZy5mbXRwLmV4YWN0RnJhbWVyYXRlPy50b1N0cmluZygpLFxuICAgICAgICAgIHBhcjogY29uZmlnLmZtdHAucGFyPy50b1N0cmluZygpLFxuICAgICAgICAgIGNvbG9yaW1ldHJ5OiBjb25maWcuZm10cC5jb2xvcmltZXRyeT8udmFsdWUsXG4gICAgICAgICAgcmFuZ2U6IGNvbmZpZy5mbXRwLnZpZGVvUmFuZ2U/LnZhbHVlLFxuICAgICAgICAgIHNjYW5Nb2RlOiBjb25maWcuZm10cC5zY2FuTW9kZT8udmFsdWUsXG4gICAgICAgICAgdGNzOiBjb25maWcuZm10cC50Y3M/LnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIG1lZGlhU3RyZWFtVHlwZTogTWVkaWFTdHJlYW1UeXBlLlZJREVPLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIE1lZGlhU3RyZWFtIGF1ZGlvXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGF1ZGlvKGNvbmZpZzogTWVkaWFTdHJlYW1BdWRpbyk6IE1lZGlhU3RyZWFtIHtcbiAgICByZXR1cm4gbmV3IE1lZGlhU3RyZWFtKHtcbiAgICAgIG1lZGlhU3RyZWFtSWQ6IGNvbmZpZy5tZWRpYVN0cmVhbUlkLFxuICAgICAgbWVkaWFTdHJlYW1OYW1lOiBjb25maWcubWVkaWFTdHJlYW1OYW1lLFxuICAgICAgY2xvY2tSYXRlOiBjb25maWcuY2xvY2tSYXRlLFxuICAgICAgZm10OiBjb25maWcuZm10LFxuICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZm10cDoge1xuICAgICAgICAgIGNoYW5uZWxPcmRlcjogY29uZmlnLmNoYW5uZWxPcmRlcj8udmFsdWUsXG4gICAgICAgIH0sXG4gICAgICAgIGxhbmc6IGNvbmZpZy5sYW5nLFxuICAgICAgfSxcbiAgICAgIG1lZGlhU3RyZWFtVHlwZTogTWVkaWFTdHJlYW1UeXBlLkFVRElPLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyYXRpb24gZm9yIE1lZGlhU3RyZWFtIGFuY2lsbGFyeSBkYXRhXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFuY2lsbGFyeURhdGEoY29uZmlnOiBNZWRpYVN0cmVhbUFuY2lsbGFyeURhdGEpOiBNZWRpYVN0cmVhbSB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYVN0cmVhbSh7XG4gICAgICBtZWRpYVN0cmVhbUlkOiBjb25maWcubWVkaWFTdHJlYW1JZCxcbiAgICAgIG1lZGlhU3RyZWFtTmFtZTogY29uZmlnLm1lZGlhU3RyZWFtTmFtZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBtZWRpYVN0cmVhbVR5cGU6IE1lZGlhU3RyZWFtVHlwZS5BTkNJTExBUllfREFUQSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBfY29uZmlnOiBDZm5GbG93Lk1lZGlhU3RyZWFtUHJvcGVydHkpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHVibGljIF9iaW5kKCk6IENmbkZsb3cuTWVkaWFTdHJlYW1Qcm9wZXJ0eSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxufVxuXG4vKipcbiAqIEF0dHJpYnV0ZXMgZm9yIGltcG9ydGluZyBhbiBleGlzdGluZyBGbG93LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dBdHRyaWJ1dGVzIHtcbiAgLyoqXG4gICAqIFRoZSBBUk4gb2YgdGhlIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBmbG93QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIGZhaWxvdmVyIGNvbmZpZ3VyZWRcbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IGlzRmFpbG92ZXJFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQVJOIG9mIHRoZSBzb3VyY2UgZGVmaW5lZCBvbiB0aGUgZmxvdy5cbiAgICpcbiAgICogTm90IGVuY29kZWQgaW4gdGhlIGZsb3cgQVJOLCBzbyBtdXN0IGJlIHByb3ZpZGVkIGV4cGxpY2l0bHkgd2hlbiB5b3UgbmVlZFxuICAgKiBhY2Nlc3MgdG8gYHNvdXJjZUFybmAgb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzb3VyY2VBcm4gaXMgbm90IGF2YWlsYWJsZSBvbiB0aGUgaW1wb3J0ZWQgY29uc3RydWN0XG4gICAqL1xuICByZWFkb25seSBzb3VyY2VBcm4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUCBhZGRyZXNzIHRoYXQgdGhlIGZsb3cgdXNlcyB0byBzZW5kIG91dGJvdW5kIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBlZ3Jlc3NJcGAgb24gdGhlIGltcG9ydGVkIGZsb3cgdGhyb3dzOyBvbmx5IHByb3ZpZGUgd2hlbiBhdmFpbGFibGUuXG4gICAqL1xuICByZWFkb25seSBlZ3Jlc3NJcD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIElQIGFkZHJlc3MgdGhhdCB0aGUgZmxvdyBsaXN0ZW5zIG9uIGZvciBpbmNvbWluZyBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgc291cmNlSW5nZXN0SXBgIG9uIHRoZSBpbXBvcnRlZCBmbG93IHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0SXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwb3J0IHRoYXQgdGhlIGZsb3cgbGlzdGVucyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhY2Nlc3NpbmcgYHNvdXJjZUluZ2VzdFBvcnRgIG9uIHRoZSBpbXBvcnRlZCBmbG93IHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0UG9ydD86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEF2YWlsYWJpbGl0eSBab25lIHRoYXQgdGhlIGZsb3cgd2FzIGNyZWF0ZWQgaW4uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYGZsb3dBdmFpbGFiaWxpdHlab25lYCBpcyB1bmRlZmluZWQgb24gdGhlIGltcG9ydGVkIGZsb3cuXG4gICAqL1xuICByZWFkb25seSBmbG93QXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbn1cblxuYWJzdHJhY3QgY2xhc3MgRmxvd0Jhc2UgZXh0ZW5kcyBSZXNvdXJjZSBpbXBsZW1lbnRzIElGbG93IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBGbG93IGNvbnN0cnVjdCB0aGF0IHJlcHJlc2VudHMgYW4gZXh0ZXJuYWwgKGltcG9ydGVkKSBGbG93LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmxvd0F0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IEZsb3dBdHRyaWJ1dGVzKTogSUZsb3cge1xuICAgIGNsYXNzIEltcG9ydCBleHRlbmRzIEZsb3dCYXNlIGltcGxlbWVudHMgSUZsb3cge1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZsb3dBcm4gPSBhdHRycy5mbG93QXJuO1xuICAgICAgcHVibGljIHJlYWRvbmx5IGZsb3dBdmFpbGFiaWxpdHlab25lID0gYXR0cnMuZmxvd0F2YWlsYWJpbGl0eVpvbmU7XG5cbiAgICAgIC8vIEltcG9ydGVkIGZsb3dzIGRlZmF1bHQgdG8gYGZhbHNlYC4gUGFzcyBgaXNGYWlsb3ZlckVuYWJsZWQ6IHRydWVgIGluIHRoZVxuICAgICAgLy8gYXR0cmlidXRlcyB3aGVuIHRoZSByZWFsIHNlcnZpY2Utc2lkZSBmbG93IGhhcyBmYWlsb3ZlciBlbmFibGVkIGFuZCB5b3VcbiAgICAgIC8vIG5lZWQgdG8gYWRkIGEgRmxvd1NvdXJjZS5cbiAgICAgIHB1YmxpYyBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW4gPSBhdHRycy5pc0ZhaWxvdmVyRW5hYmxlZCA/PyBmYWxzZTtcblxuICAgICAgcHVibGljIGdldCBzb3VyY2VBcm4oKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnNvdXJjZUFybikgcmV0dXJuIGF0dHJzLnNvdXJjZUFybjtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgU291cmNlQXJuTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnc291cmNlQXJuJyB3YXMgbm90IHByb3ZpZGVkIHdoZW4gaW1wb3J0aW5nIEZsb3cgJHt0aGlzLm5vZGUucGF0aH07IHByb3ZpZGUgJ3NvdXJjZUFybicgaW4gZnJvbUZsb3dBdHRyaWJ1dGVzKClgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBnZXQgZWdyZXNzSXAoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLmVncmVzc0lwKSByZXR1cm4gYXR0cnMuZWdyZXNzSXA7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YEVncmVzc0lwTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnZWdyZXNzSXAnIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBpbXBvcnRpbmcgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgcHJvdmlkZSBpdCBpbiBmcm9tRmxvd0F0dHJpYnV0ZXMoKWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBzb3VyY2VJbmdlc3RJcCgpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXR0cnMuc291cmNlSW5nZXN0SXApIHJldHVybiBhdHRycy5zb3VyY2VJbmdlc3RJcDtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgU291cmNlSW5nZXN0SXBOb3RQcm92aWRlZGAsXG4gICAgICAgICAgYCdzb3VyY2VJbmdlc3RJcCcgd2FzIG5vdCBwcm92aWRlZCB3aGVuIGltcG9ydGluZyBGbG93ICR7dGhpcy5ub2RlLnBhdGh9OyBwcm92aWRlIGl0IGluIGZyb21GbG93QXR0cmlidXRlcygpYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdFBvcnQoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnNvdXJjZUluZ2VzdFBvcnQpIHJldHVybiBhdHRycy5zb3VyY2VJbmdlc3RQb3J0O1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBTb3VyY2VJbmdlc3RQb3J0Tm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnc291cmNlSW5nZXN0UG9ydCcgd2FzIG5vdCBwcm92aWRlZCB3aGVuIGltcG9ydGluZyBGbG93ICR7dGhpcy5ub2RlLnBhdGh9OyBwcm92aWRlIGl0IGluIGZyb21GbG93QXR0cmlidXRlcygpYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdFVybCgpOiBzdHJpbmcge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBTb3VyY2VJbmdlc3RVcmxOb3RBdmFpbGFibGVJbXBvcnRlZGAsXG4gICAgICAgICAgYCdzb3VyY2VJbmdlc3RVcmwnIGlzIG5vdCBhdmFpbGFibGUgb24gaW1wb3J0ZWQgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgb25seSBGbG93cyBjb25zdHJ1Y3RlZCBpbiB0aGlzIGFwcCBmb3IgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29scyAoUlRQLCBSVFAtRkVDLCBSSVNULCBTUlQgbGlzdGVuZXIsIFppeGkgcHVzaCkgZXhwb3NlIGEgc291cmNlIGluZ2VzdCBVUkxgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBJbXBvcnQoc2NvcGUsIGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBvcnQgYW4gZXhpc3RpbmcgRmxvdyBmcm9tIGl0cyBBUk4uXG4gICAqXG4gICAqIFVzZSBgZnJvbUZsb3dBdHRyaWJ1dGVzKClgIGluc3RlYWQgaWYgeW91IG5lZWQgYWNjZXNzIHRvIGBzb3VyY2VBcm5gIG9yIGFueSBvdGhlclxuICAgKiBhdHRyaWJ1dGUgbm90IGVuY29kZWQgaW4gdGhlIGZsb3cgQVJOLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBmcm9tRmxvd0FybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBmbG93QXJuOiBzdHJpbmcpOiBJRmxvdyB7XG4gICAgcmV0dXJuIEZsb3cuZnJvbUZsb3dBdHRyaWJ1dGVzKHNjb3BlLCBpZCwgeyBmbG93QXJuIH0pO1xuICB9XG5cbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHNvdXJjZUFybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZmxvd0Fybjogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgZWdyZXNzSXA6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHNvdXJjZUluZ2VzdElwOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VJbmdlc3RVcmw6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGZsb3dBdmFpbGFiaWxpdHlab25lPzogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgTkRJIHN0YXRlIGZvciB0aGlzIGZsb3cuIGB1bmRlZmluZWRgIGZvciBpbXBvcnRlZCBmbG93cyAoc3RhdGUgaXMgdW5rbm93bikuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9uZGlTdGF0ZT86IFN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHByb3RvY29sIHZhbHVlIGZvciB0aGlzIGZsb3cuIGB1bmRlZmluZWRgIGZvciBpbXBvcnRlZCBmbG93cy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX3NvdXJjZVByb3RvY29sPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUcmFja3MgdGhlIG51bWJlciBvZiBOREkgb3V0cHV0cyBhZGRlZCB0byB0aGlzIGZsb3cuIFVzZWQgdG8gZW5mb3JjZSB0aGVcbiAgICogZG9jdW1lbnRlZCBcIm1heCAxIE5ESSBvdXRwdXQgcGVyIGZsb3dcIiBsaW1pdC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwcm90ZWN0ZWQgX25kaU91dHB1dENvdW50ID0gMDtcblxuICAvKipcbiAgICogQ29sbGVjdGlvbiBvZiBncmFudCBtZXRob2RzIGZvciB0aGlzIGZsb3cuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZ3JhbnRzID0gRmxvd0dyYW50cy5mcm9tRmxvdyh0aGlzKTtcblxuICAvKipcbiAgICogQSByZWZlcmVuY2UgdG8gdGhpcyBGbG93IHJlc291cmNlLlxuICAgKiBSZXF1aXJlZCBieSB0aGUgYXV0by1nZW5lcmF0ZWQgSUZsb3dSZWYgaW50ZXJmYWNlLlxuICAgKi9cbiAgcHVibGljIGdldCBmbG93UmVmKCk6IEZsb3dSZWZlcmVuY2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmbG93QXJuOiB0aGlzLmZsb3dBcm4sXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYW4gb3V0cHV0IHRvIHRoaXMgZmxvd1xuICAgKi9cbiAgcHVibGljIGFkZE91dHB1dChpZDogc3RyaW5nLCBvdXRwdXRDb25maWc6IE91dHB1dENvbmZpZ3VyYXRpb24pOiBJRmxvd091dHB1dCB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBvdXRwdXRDb25maWcuX2JpbmQoKS5wcm90b2NvbDtcblxuICAgIGlmIChwcm90b2NvbCA9PT0gJ25kaS1zcGVlZC1ocScpIHtcbiAgICAgIGlmICh0aGlzLl9uZGlTdGF0ZSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuX25kaVN0YXRlICE9PSBTdGF0ZS5FTkFCTEVEKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YE5kaU91dHB1dFJlcXVpcmVzTmRpQ29uZmlnYCxcbiAgICAgICAgICAnTkRJIG91dHB1dHMgcmVxdWlyZSBuZGlDb25maWcgd2l0aCBuZGlTdGF0ZSBzZXQgdG8gU3RhdGUuRU5BQkxFRCBvbiB0aGUgZmxvdycsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gTkRJIHBhc3N0aHJvdWdoIGlzIG5vdCBzdXBwb3J0ZWQg4oCUIGEgZmxvdyBjYW5ub3QgaGF2ZSBib3RoIGFuIE5ESSBzb3VyY2VcbiAgICAgIC8vIGFuZCBhbiBOREkgb3V0cHV0LiBUaGUgc2VydmljZSByZWplY3RzIHRoaXMgYXQgZGVwbG95OyBmYWlsIGZhc3QgaGVyZS5cbiAgICAgIGlmICh0aGlzLl9zb3VyY2VQcm90b2NvbCA9PT0gU291cmNlUHJvdG9jb2wuTkRJX1NQRUVEX0hRLnZhbHVlKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YE5kaVBhc3N0aHJvdWdoTm90U3VwcG9ydGVkYCxcbiAgICAgICAgICAnTkRJIHBhc3N0aHJvdWdoIGlzIG5vdCBzdXBwb3J0ZWQuIEEgZmxvdyBjYW5ub3QgaGF2ZSBib3RoIGFuIE5ESSBzb3VyY2UgYW5kIGFuIE5ESSBvdXRwdXQnLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEEgZmxvdyBzdXBwb3J0cyBhIG1heGltdW0gb2YgMSBOREkgb3V0cHV0IChMYXJnZSBmbG93IHNpemUsIHRyYW5zcG9ydFxuICAgICAgLy8gc3RyZWFtIHByb3RvY29scyArIDEgTkRJIG91dHB1dCkuXG4gICAgICAvLyBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9tZWRpYWNvbm5lY3QvbGF0ZXN0L3VnL2Zsb3ctc2l6ZXMtY2FwYWJpbGl0aWVzLmh0bWxcbiAgICAgIGlmICh0aGlzLl9uZGlPdXRwdXRDb3VudCA+PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YE5kaU91dHB1dExpbWl0YCxcbiAgICAgICAgICAnQSBmbG93IHN1cHBvcnRzIGEgbWF4aW11bSBvZiAxIE5ESSBvdXRwdXQnLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICB0aGlzLl9uZGlPdXRwdXRDb3VudCsrO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvd091dHB1dCh0aGlzLCBpZCwge1xuICAgICAgZmxvdzogdGhpcyxcbiAgICAgIG91dHB1dDogb3V0cHV0Q29uZmlnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0aGlzIGZsb3cuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL01lZGlhQ29ubmVjdCcsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIEZsb3dBUk46IHRoaXMuZmxvd0FybixcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBiaXRyYXRlIG9mIGNvbnRlbnQgaW5nZXN0ZWQgaW50byB0aGUgZmxvdy5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VCaXRSYXRlYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzIGFjcm9zc1xuICAgKiBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy4gVG8gbmFycm93IHRvIGEgc3BlY2lmaWMgc291cmNlIG9uIGEgbXVsdGktc291cmNlIGZsb3csIGNhbGxcbiAgICoge0BsaW5rIG1ldHJpY30gd2l0aCBhbiBhZGRpdGlvbmFsIGBTb3VyY2VBUk5gIGRpbWVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZUJpdHJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1NvdXJjZUJpdFJhdGUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQklUU19QRVJfU0VDT05ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBwYWNrZXRzIHRoYXQgd2VyZSBsb3N0IGluIHRyYW5zaXQgYW5kIG5vdCByZWNvdmVyZWQgYnkgZXJyb3IgY29ycmVjdGlvbi5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VOb3RSZWNvdmVyZWRQYWNrZXRzYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzXG4gICAqIGFjcm9zcyBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlTm90UmVjb3ZlcmVkUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU291cmNlTm90UmVjb3ZlcmVkUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBmbG93IHNvdXJjZXMuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlVG90YWxQYWNrZXRzYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzIGFjcm9zc1xuICAgKiBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VUb3RhbFBhY2tldHMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgaW5kaWNhdGluZyB3aGljaCBzb3VyY2UgaXMgc2VsZWN0ZWQgZm9yIGluZ2VzdCB3aGVuIHVzaW5nIGBGYWlsb3ZlcmAgZmFpbG92ZXIgbW9kZS5cbiAgICogQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGUgc291cmNlIGlzIGJlaW5nIHVzZWQgYXMgdGhlIGlucHV0OyAwIGluZGljYXRlcyBpdCBpcyBzdGFuZGJ5LlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZVNlbGVjdGVkYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLiBUbyBuYXJyb3cgdG8gYSBzcGVjaWZpYyBzb3VyY2UsXG4gICAqIGNhbGwge0BsaW5rIG1ldHJpY30gd2l0aCBhbiBhZGRpdGlvbmFsIGBTb3VyY2VBUk5gIGRpbWVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVNlbGVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VTZWxlY3RlZCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ21heCcsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5OT05FLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHNvdXJjZS4gMSBmb3IgY29ubmVjdGVkLCAwIGZvciBkaXNjb25uZWN0ZWQuXG4gICAqIEFwcGxpZXMgb25seSB0byBaaXhpLCBTUlQsIGFuZCBSSVNUIHNvdXJjZXMuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlQ29ubmVjdGVkYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1pbmltdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VDb25uZWN0ZWQnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdtaW4nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTk9ORSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIHRyYW5zaXRpb25lZCBmcm9tIGNvbm5lY3RlZCB0byBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlRGlzY29ubmVjdGlvbnNgIG1ldHJpYyB3aXRoIGRpbWVuc2lvbiBgRmxvd0FSTmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZURpc2Nvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VEaXNjb25uZWN0aW9ucycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QgZHVyaW5nIHRyYW5zaXQsIG1lYXN1cmVkIGJlZm9yZSBhbnkgZXJyb3JcbiAgICogY29ycmVjdGlvbiB0YWtlcyBwbGFjZS5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VEcm9wcGVkUGFja2V0c2AgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlRHJvcHBlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1NvdXJjZURyb3BwZWRQYWNrZXRzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcGVyY2VudGFnZSBvZiBwYWNrZXRzIGxvc3QgZHVyaW5nIHRyYW5zaXQsIGV2ZW4gaWYgdGhleSB3ZXJlIHJlY292ZXJlZC5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VQYWNrZXRMb3NzUGVyY2VudGAgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VQYWNrZXRMb3NzUGVyY2VudCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ2F2ZycsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5QRVJDRU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcm91bmQtdHJpcCB0aW1lIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgTWVkaWFDb25uZWN0LiBBcHBsaWVzIG9ubHkgdG9cbiAgICogUklTVCwgWml4aSwgYW5kIFNSVCBzb3VyY2VzLlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZVJvdW5kVHJpcFRpbWVgIG1ldHJpYyB3aXRoIGRpbWVuc2lvbiBgRmxvd0FSTmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTb3VyY2VSb3VuZFRyaXBUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VSb3VuZFRyaXBUaW1lJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yayBqaXR0ZXIgb2YgdGhlIHNvdXJjZSwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZUppdHRlcmAgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZUppdHRlcihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU291cmNlSml0dGVyJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbiBBV1MgRWxlbWVudGFsIE1lZGlhQ29ubmVjdCBGbG93LlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgRmxvdyBleHRlbmRzIEZsb3dCYXNlIGltcGxlbWVudHMgSUZsb3cge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYWNvbm5lY3QtYWxwaGEuRmxvdyc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXQgb2Ygc291cmNlIHByb3RvY29scyB3aGVyZSB0aGUgZmxvdyBvcGVucyBhbiBJUDpwb3J0IGFuZCBsaXN0ZW5zIGZvclxuICAgKiB1cHN0cmVhbSBjb250ZW50LiBEZXRlcm1pbmVzIGF2YWlsYWJpbGl0eSBvZiBgc291cmNlSW5nZXN0SXBgLCBgc291cmNlSW5nZXN0UG9ydGAsXG4gICAqIGFuZCBgc291cmNlSW5nZXN0VXJsYC4gTWFwcyBlYWNoIHByb3RvY29sIHRvIHRoZSBVUkwgc2NoZW1lIHVzZWQgdG8gY29uc3RydWN0XG4gICAqIHRoZSBpbmdlc3QgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTElTVEVORVJfUFJPVE9DT0xfU0NIRU1FUzogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcChbXG4gICAgWydydHAnLCAncnRwJ10sXG4gICAgWydydHAtZmVjJywgJ3J0cCddLFxuICAgIFsncmlzdCcsICdyaXN0J10sXG4gICAgWydzcnQtbGlzdGVuZXInLCAnc3J0J10sXG4gICAgWyd6aXhpLXB1c2gnLCAneml4aSddLFxuICBdKTtcblxuICBwcml2YXRlIHN0YXRpYyBpc0xpc3RlbmVyU3R5bGVQcm90b2NvbChwcm90b2NvbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb3RvY29sICE9PSB1bmRlZmluZWQgJiYgRmxvdy5MSVNURU5FUl9QUk9UT0NPTF9TQ0hFTUVTLmhhcyhwcm90b2NvbCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZmxvd0Fybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlZ3Jlc3NJcDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3VyY2VJbmdlc3RJcDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0xpc3RlbmVyU291cmNlOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxvd0F2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB2cGNJbnRlcmZhY2VzOiBDZm5GbG93LlZwY0ludGVyZmFjZVByb3BlcnR5W10gPSBbXTtcblxuICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdElwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9oYXNMaXN0ZW5lclNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFNvdXJjZUluZ2VzdElwTm90QXZhaWxhYmxlU291cmNlUHJvdG9jb2xgLFxuICAgICAgICBgJ3NvdXJjZUluZ2VzdElwJyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgb25seSBsaXN0ZW5lci1zdHlsZSBzb3VyY2UgcHJvdG9jb2xzIChSVFAsIFJUUC1GRUMsIFJJU1QsIFNSVCBsaXN0ZW5lciwgWml4aSBwdXNoKSBleHBvc2UgYSBzb3VyY2UgaW5nZXN0IElQIOKAlCBDREksIEpQRUcgWFMsIGVudGl0bGVtZW50LCBnYXRld2F5IGJyaWRnZSwgcm91dGVyLCBhbmQgU1JUIGNhbGxlciBzb3VyY2VzIGRvIG5vdGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc291cmNlSW5nZXN0SXA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdFBvcnQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2hhc0xpc3RlbmVyU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU291cmNlSW5nZXN0UG9ydE5vdEF2YWlsYWJsZVNvdXJjZVByb3RvY29sYCxcbiAgICAgICAgYCdzb3VyY2VJbmdlc3RQb3J0JyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgb25seSBsaXN0ZW5lci1zdHlsZSBzb3VyY2UgcHJvdG9jb2xzIChSVFAsIFJUUC1GRUMsIFJJU1QsIFNSVCBsaXN0ZW5lciwgWml4aSBwdXNoKSBleHBvc2UgYSBzb3VyY2UgaW5nZXN0IHBvcnQg4oCUIENESSwgSlBFRyBYUywgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIGFuZCBTUlQgY2FsbGVyIHNvdXJjZXMgZG8gbm90YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zb3VyY2VJbmdlc3RQb3J0O1xuICB9XG5cbiAgcHVibGljIGdldCBzb3VyY2VJbmdlc3RVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2hhc0xpc3RlbmVyU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU291cmNlSW5nZXN0VXJsTm90QXZhaWxhYmxlU291cmNlUHJvdG9jb2xgLFxuICAgICAgICBgJ3NvdXJjZUluZ2VzdFVybCcgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIEZsb3cgJHt0aGlzLm5vZGUucGF0aH07IG9ubHkgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29scyAoUlRQLCBSVFAtRkVDLCBSSVNULCBTUlQgbGlzdGVuZXIsIFppeGkgcHVzaCkgZXhwb3NlIGEgc291cmNlIGluZ2VzdCBVUkwg4oCUIENESSwgSlBFRyBYUywgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIGFuZCBTUlQgY2FsbGVyIHNvdXJjZXMgZG8gbm90YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJbmdlc3RVcmwodGhpcy5fc291cmNlUHJvdG9jb2wsIHRoaXMuX3NvdXJjZUluZ2VzdElwLCB0aGlzLl9zb3VyY2VJbmdlc3RQb3J0KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGbG93UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/LmZsb3dOYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiA2NCB9KSB9KSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIGZsb3cgbmFtZSBpZiBwcm92aWRlZFxuICAgIHRoaXMudmFsaWRhdGVOYW1lKHByb3BzKTtcblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgbWFpbnRlbmFuY2Ugc3RhcnQgaG91ciBmb3JtYXRcbiAgICBpZiAocHJvcHMubWFpbnRlbmFuY2UpIHtcbiAgICAgIHZhbGlkYXRlTWFpbnRlbmFuY2VUaW1lKHByb3BzLm1haW50ZW5hbmNlLm1haW50ZW5hbmNlU3RhcnRIb3VyKTtcbiAgICB9XG5cbiAgICAvLyBWYWxpZGF0ZSBzb3VyY2UgbW9uaXRvcmluZyB0aHJlc2hvbGRzIGFuZCBjb250ZW50LXF1YWxpdHkgcmVxdWlyZW1lbnRzXG4gICAgdGhpcy52YWxpZGF0ZU1vbml0b3JpbmcocHJvcHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgZW5jb2RpbmcgY29uZmlnIHZpZGVvIG1heCBiaXRyYXRlIHJhbmdlICgxMC01MCBNYnBzKVxuICAgIHRoaXMudmFsaWRhdGVFbmNvZGluZyhwcm9wcyk7XG5cbiAgICAvLyBPbmx5IGl0ZXJhdGUgYSBrbm93bi1jb25jcmV0ZSB2cGNJbnRlcmZhY2VzIGxpc3Q7IHNraXAgdG9rZW5pemVkIGxpc3RzIHRvIGF2b2lkXG4gICAgLy8gcHVzaGluZyB0aGUgdG9rZW4gbWFya2VyIGludG8gb3VyIGludGVybmFsIGNvbGxlY3Rpb24uXG4gICAgaWYgKHByb3BzLnZwY0ludGVyZmFjZXMgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHByb3BzLnZwY0ludGVyZmFjZXMpKSB7XG4gICAgICBwcm9wcy52cGNJbnRlcmZhY2VzLmZvckVhY2godnBjID0+IHRoaXMuYWRkVnBjSW50ZXJmYWNlKHZwYykpO1xuICAgIH1cbiAgICB0aGlzLmlzRmFpbG92ZXJFbmFibGVkID0gcHJvcHMuc291cmNlRmFpbG92ZXJDb25maWc/Ll9pc0VuYWJsZWQgPz8gZmFsc2U7XG5cbiAgICBjb25zdCBzb3VyY2VDb25maWcgPSBwcm9wcy5zb3VyY2UuX2JpbmQodGhpcywgU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgIHNlcnZpY2U6ICdtZWRpYWNvbm5lY3QnLFxuICAgICAgcmVzb3VyY2U6ICdmbG93JyxcbiAgICAgIHJlc291cmNlTmFtZTogYCo6JHt0aGlzLnBoeXNpY2FsTmFtZX1gLFxuICAgICAgYXJuRm9ybWF0OiBBcm5Gb3JtYXQuQ09MT05fUkVTT1VSQ0VfTkFNRSxcbiAgICB9KSk7XG5cbiAgICBpZiAoKHNvdXJjZUNvbmZpZy5wcm90b2NvbCA9PT0gU291cmNlUHJvdG9jb2wuSlBFR1hTLnZhbHVlIHx8IHNvdXJjZUNvbmZpZy5wcm90b2NvbCA9PT0gU291cmNlUHJvdG9jb2wuQ0RJLnZhbHVlKVxuICAgICAgJiYgcHJvcHMuZmxvd1NpemU/LnZhbHVlICE9PSBGbG93U2l6ZS5MQVJHRV80WC52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEZsb3dTaXplUmVxdWlyZWRgLFxuICAgICAgICAnRmxvd3MgdXNpbmcgSlBFRyBYUyBhbmQgQ0RJIHByb3RvY29scyByZXF1aXJlIExBUkdFXzRYIGZsb3cgc2l6ZTsgc2V0IGZsb3dTaXplIHRvIEZsb3dTaXplLkxBUkdFXzRYJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTkRJIGNvbnN0cmFpbnRzIChkaXNjb3Zlcnkgc2VydmVyIGxpbWl0LCBwcm90b2NvbCBjb25mbGljdHMsIGZsb3cgc2l6ZSwgc291cmNlIHJlcXVpcmVtZW50cylcbiAgICB0aGlzLnZhbGlkYXRlTmRpKHByb3BzLCBzb3VyY2VDb25maWcpO1xuXG4gICAgLy8gTEFSR0VfNFggb25seSBzdXBwb3J0cyBDREkgYW5kIEpQRUcgWFMgcHJvdG9jb2xzXG4gICAgaWYgKHByb3BzLmZsb3dTaXplPy52YWx1ZSA9PT0gRmxvd1NpemUuTEFSR0VfNFgudmFsdWVcbiAgICAgICYmIHNvdXJjZUNvbmZpZy5wcm90b2NvbCAhPT0gU291cmNlUHJvdG9jb2wuSlBFR1hTLnZhbHVlXG4gICAgICAmJiBzb3VyY2VDb25maWcucHJvdG9jb2wgIT09IFNvdXJjZVByb3RvY29sLkNESS52YWx1ZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEZsb3dTaXplTGFyZ2U0eFByb3RvY29sYCxcbiAgICAgICAgJ0xBUkdFXzRYIGZsb3cgc2l6ZSBvbmx5IHN1cHBvcnRzIENESSBhbmQgSlBFRyBYUyBwcm90b2NvbHMnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBWUEMgaW50ZXJmYWNlIEVGQS1jb3VudCBsaW1pdFxuICAgIHRoaXMudmFsaWRhdGVWcGNFZmFDb3VudChwcm9wcyk7XG5cbiAgICBjb25zdCBmbG93ID0gbmV3IENmbkZsb3codGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgbmFtZTogdGhpcy5waHlzaWNhbE5hbWUsXG4gICAgICBzb3VyY2U6IHNvdXJjZUNvbmZpZyxcbiAgICAgIGF2YWlsYWJpbGl0eVpvbmU6IHByb3BzPy5hdmFpbGFiaWxpdHlab25lLFxuICAgICAgZmxvd1NpemU6IHByb3BzPy5mbG93U2l6ZT8udmFsdWUsXG4gICAgICBtYWludGVuYW5jZTogcHJvcHM/Lm1haW50ZW5hbmNlID8ge1xuICAgICAgICBtYWludGVuYW5jZURheTogdG9UaXRsZUNhc2UocHJvcHMubWFpbnRlbmFuY2UubWFpbnRlbmFuY2VEYXkpLFxuICAgICAgICBtYWludGVuYW5jZVN0YXJ0SG91cjogcHJvcHMubWFpbnRlbmFuY2UubWFpbnRlbmFuY2VTdGFydEhvdXIsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgbWVkaWFTdHJlYW1zOiBwcm9wcy5tZWRpYVN0cmVhbXMgPyBwcm9wcy5tZWRpYVN0cmVhbXMubWFwKHN0cmVhbSA9PiBzdHJlYW0uX2JpbmQoKSkgOiB1bmRlZmluZWQsXG4gICAgICBuZGlDb25maWc6IHByb3BzLm5kaUNvbmZpZyA/IHtcbiAgICAgICAgbWFjaGluZU5hbWU6IHByb3BzLm5kaUNvbmZpZy5tYWNoaW5lTmFtZSxcbiAgICAgICAgbmRpU3RhdGU6IHByb3BzLm5kaUNvbmZpZy5uZGlTdGF0ZSxcbiAgICAgICAgbmRpRGlzY292ZXJ5U2VydmVyczogcHJvcHMubmRpQ29uZmlnLm5kaURpc2NvdmVyeVNlcnZlcnM/Lm1hcChzZXJ2ZXIgPT4gKHtcbiAgICAgICAgICBkaXNjb3ZlcnlTZXJ2ZXJBZGRyZXNzOiBzZXJ2ZXIuZGlzY292ZXJ5U2VydmVyQWRkcmVzcyxcbiAgICAgICAgICBkaXNjb3ZlcnlTZXJ2ZXJQb3J0OiBzZXJ2ZXIuZGlzY292ZXJ5U2VydmVyUG9ydCxcbiAgICAgICAgICB2cGNJbnRlcmZhY2VBZGFwdGVyOiBzZXJ2ZXIudnBjSW50ZXJmYWNlLm5hbWUsXG4gICAgICAgIH0pKSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBlbmNvZGluZ0NvbmZpZzogcHJvcHMuZW5jb2RpbmdDb25maWcgPyB7XG4gICAgICAgIGVuY29kaW5nUHJvZmlsZTogcHJvcHMuZW5jb2RpbmdDb25maWcuZW5jb2RpbmdQcm9maWxlLFxuICAgICAgICB2aWRlb01heEJpdHJhdGU6IHByb3BzLmVuY29kaW5nQ29uZmlnLnZpZGVvTWF4Qml0cmF0ZT8udG9CcHMoKSxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICBzb3VyY2VGYWlsb3ZlckNvbmZpZzogcHJvcHMuc291cmNlRmFpbG92ZXJDb25maWc/Ll9iaW5kKCksXG4gICAgICBzb3VyY2VNb25pdG9yaW5nQ29uZmlnOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnID8ge1xuICAgICAgICBjb250ZW50UXVhbGl0eUFuYWx5c2lzU3RhdGU6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuY29udGVudFF1YWxpdHlBbmFseXNpc1N0YXRlLFxuICAgICAgICB0aHVtYm5haWxTdGF0ZTogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy50aHVtYm5haWxTdGF0ZSxcbiAgICAgICAgYXVkaW9Nb25pdG9yaW5nU2V0dGluZ3M6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuc2lsZW50QXVkaW8gPyBbe1xuICAgICAgICAgIHNpbGVudEF1ZGlvOiB7XG4gICAgICAgICAgICBzdGF0ZTogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5zaWxlbnRBdWRpby5zdGF0ZSxcbiAgICAgICAgICAgIHRocmVzaG9sZFNlY29uZHM6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuc2lsZW50QXVkaW8udGhyZXNob2xkLnRvU2Vjb25kcygpLFxuICAgICAgICAgIH0sXG4gICAgICAgIH1dIDogdW5kZWZpbmVkLFxuICAgICAgICB2aWRlb01vbml0b3JpbmdTZXR0aW5nczogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5ibGFja0ZyYW1lcyB8fCBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmZyb3plbkZyYW1lcyA/IFt7XG4gICAgICAgICAgYmxhY2tGcmFtZXM6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuYmxhY2tGcmFtZXMgPyB7XG4gICAgICAgICAgICBzdGF0ZTogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5ibGFja0ZyYW1lcy5zdGF0ZSxcbiAgICAgICAgICAgIHRocmVzaG9sZFNlY29uZHM6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuYmxhY2tGcmFtZXMudGhyZXNob2xkLnRvU2Vjb25kcygpLFxuICAgICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgZnJvemVuRnJhbWVzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmZyb3plbkZyYW1lcyA/IHtcbiAgICAgICAgICAgIHN0YXRlOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmZyb3plbkZyYW1lcy5zdGF0ZSxcbiAgICAgICAgICAgIHRocmVzaG9sZFNlY29uZHM6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuZnJvemVuRnJhbWVzLnRocmVzaG9sZC50b1NlY29uZHMoKSxcbiAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICB9XSA6IHVuZGVmaW5lZCxcbiAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICB2cGNJbnRlcmZhY2VzOiBMYXp5LmFueSh7IHByb2R1Y2U6ICgpID0+IHRoaXMudnBjSW50ZXJmYWNlcyB9LCB7IG9taXRFbXB0eUFycmF5OiB0cnVlIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5mbG93QXJuID0gZmxvdy5hdHRyRmxvd0FybjtcbiAgICB0aGlzLnNvdXJjZUFybiA9IGZsb3cuYXR0clNvdXJjZVNvdXJjZUFybjtcbiAgICB0aGlzLmVncmVzc0lwID0gZmxvdy5hdHRyRWdyZXNzSXA7XG4gICAgdGhpcy5fc291cmNlSW5nZXN0SXAgPSBmbG93LmF0dHJTb3VyY2VJbmdlc3RJcDtcbiAgICB0aGlzLl9zb3VyY2VJbmdlc3RQb3J0ID0gZmxvdy5hdHRyU291cmNlU291cmNlSW5nZXN0UG9ydDtcbiAgICB0aGlzLmZsb3dBdmFpbGFiaWxpdHlab25lID0gZmxvdy5hdHRyRmxvd0F2YWlsYWJpbGl0eVpvbmU7XG4gICAgdGhpcy5fbmRpU3RhdGUgPSBwcm9wcy5uZGlDb25maWc/Lm5kaVN0YXRlID8/IFN0YXRlLkRJU0FCTEVEO1xuICAgIHRoaXMuX3NvdXJjZVByb3RvY29sID0gc291cmNlQ29uZmlnLnByb3RvY29sO1xuICAgIHRoaXMuX2hhc0xpc3RlbmVyU291cmNlID0gRmxvdy5pc0xpc3RlbmVyU3R5bGVQcm90b2NvbChzb3VyY2VDb25maWcucHJvdG9jb2wpO1xuXG4gICAgdGhpcy5ub2RlLmFkZFZhbGlkYXRpb24oe1xuICAgICAgdmFsaWRhdGU6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbmFtZXMgPSB0aGlzLnZwY0ludGVyZmFjZXMubWFwKHYgPT4gdi5uYW1lKS5maWx0ZXIobiA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKG4pKTtcbiAgICAgICAgY29uc3QgZHVwbGljYXRlcyA9IFsuLi5uZXcgU2V0KG5hbWVzLmZpbHRlcigobiwgaSkgPT4gbmFtZXMuaW5kZXhPZihuKSAhPT0gaSkpXTtcbiAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZXMubGVuZ3RoID4gMFxuICAgICAgICAgID8gW2BWUEMgaW50ZXJmYWNlIG5hbWVzIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIGZsb3cuIER1cGxpY2F0ZSBuYW1lKHMpOiAke2R1cGxpY2F0ZXMuam9pbignLCAnKX1gXVxuICAgICAgICAgIDogW107XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqIFZhbGlkYXRlIHRoZSBmbG93IG5hbWUgbGVuZ3RoIGFuZCBjaGFyYWN0ZXIgc2V0LCB3aGVuIGEgY29uY3JldGUgdmFsdWUgaXMgcHJvdmlkZWQuICovXG4gIHByaXZhdGUgdmFsaWRhdGVOYW1lKHByb3BzOiBGbG93UHJvcHMpOiB2b2lkIHtcbiAgICBpZiAocHJvcHMuZmxvd05hbWUgIT0gbnVsbCAmJiBwcm9wcy5mbG93TmFtZSAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy5mbG93TmFtZSkpIHtcbiAgICAgIGlmIChwcm9wcy5mbG93TmFtZS5sZW5ndGggPiA2NCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBGbG93TmFtZUxlbmd0aGAsIGBGbG93IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDY0IGNoYXJhY3RlcnMsIGdvdCAke3Byb3BzLmZsb3dOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIGlmICghL15bYS16QS1aMC05Xy1dKyQvLnRlc3QocHJvcHMuZmxvd05hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEZsb3dOYW1lRm9ybWF0YCwgYEZsb3cgbmFtZSBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycywgaHlwaGVucywgYW5kIHVuZGVyc2NvcmVzLCBnb3QgJyR7cHJvcHMuZmxvd05hbWV9J2AsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBzb3VyY2UtbW9uaXRvcmluZyB0aHJlc2hvbGRzICgxMC02MCBzZWNvbmRzKSBhbmQgdGhhdCB0aGUgcGVyLW1ldHJpYyBjaGVja3MgYXJlIG9ubHlcbiAgICogdXNlZCB3aGVuIGNvbnRlbnQtcXVhbGl0eSBhbmFseXNpcyBpcyBlbmFibGVkLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU1vbml0b3JpbmcocHJvcHM6IEZsb3dQcm9wcyk6IHZvaWQge1xuICAgIGNvbnN0IG1vbml0b3JpbmcgPSBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnO1xuICAgIGlmIChtb25pdG9yaW5nICYmIChtb25pdG9yaW5nLnNpbGVudEF1ZGlvIHx8IG1vbml0b3JpbmcuYmxhY2tGcmFtZXMgfHwgbW9uaXRvcmluZy5mcm96ZW5GcmFtZXMpXG4gICAgICAmJiBtb25pdG9yaW5nLmNvbnRlbnRRdWFsaXR5QW5hbHlzaXNTdGF0ZSAhPT0gU3RhdGUuRU5BQkxFRCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YE1vbml0b3JpbmdNZXRyaWNzUmVxdWlyZUNvbnRlbnRRdWFsaXR5QW5hbHlzaXNgLFxuICAgICAgICAnc2lsZW50QXVkaW8sIGJsYWNrRnJhbWVzLCBhbmQgZnJvemVuRnJhbWVzIHJlcXVpcmUgY29udGVudFF1YWxpdHlBbmFseXNpc1N0YXRlIHRvIGJlIFN0YXRlLkVOQUJMRUQnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKG1vbml0b3Jpbmc/LnNpbGVudEF1ZGlvKSB7XG4gICAgICBjb25zdCBzZWNzID0gbW9uaXRvcmluZy5zaWxlbnRBdWRpby50aHJlc2hvbGQudG9TZWNvbmRzKCk7XG4gICAgICBpZiAoc2VjcyA8IDEwIHx8IHNlY3MgPiA2MCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBTaWxlbnRBdWRpb1RocmVzaG9sZFJhbmdlYCwgYFNpbGVudCBhdWRpbyB0aHJlc2hvbGQgbXVzdCBiZSBiZXR3ZWVuIDEwIGFuZCA2MCBzZWNvbmRzLCBnb3QgJHtzZWNzfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobW9uaXRvcmluZz8uYmxhY2tGcmFtZXMpIHtcbiAgICAgIGNvbnN0IHNlY3MgPSBtb25pdG9yaW5nLmJsYWNrRnJhbWVzLnRocmVzaG9sZC50b1NlY29uZHMoKTtcbiAgICAgIGlmIChzZWNzIDwgMTAgfHwgc2VjcyA+IDYwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEJsYWNrRnJhbWVzVGhyZXNob2xkUmFuZ2VgLCBgQmxhY2sgZnJhbWVzIHRocmVzaG9sZCBtdXN0IGJlIGJldHdlZW4gMTAgYW5kIDYwIHNlY29uZHMsIGdvdCAke3NlY3N9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChtb25pdG9yaW5nPy5mcm96ZW5GcmFtZXMpIHtcbiAgICAgIGNvbnN0IHNlY3MgPSBtb25pdG9yaW5nLmZyb3plbkZyYW1lcy50aHJlc2hvbGQudG9TZWNvbmRzKCk7XG4gICAgICBpZiAoc2VjcyA8IDEwIHx8IHNlY3MgPiA2MCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBGcm96ZW5GcmFtZXNUaHJlc2hvbGRSYW5nZWAsIGBGcm96ZW4gZnJhbWVzIHRocmVzaG9sZCBtdXN0IGJlIGJldHdlZW4gMTAgYW5kIDYwIHNlY29uZHMsIGdvdCAke3NlY3N9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIFZhbGlkYXRlIHRoZSBlbmNvZGluZyBjb25maWcncyB2aWRlbyBtYXggYml0cmF0ZSByYW5nZSAoMTAtNTAgTWJwcykuICovXG4gIHByaXZhdGUgdmFsaWRhdGVFbmNvZGluZyhwcm9wczogRmxvd1Byb3BzKTogdm9pZCB7XG4gICAgaWYgKHByb3BzLmVuY29kaW5nQ29uZmlnPy52aWRlb01heEJpdHJhdGUpIHtcbiAgICAgIGNvbnN0IG1icHMgPSBwcm9wcy5lbmNvZGluZ0NvbmZpZy52aWRlb01heEJpdHJhdGUudG9NYnBzKCk7XG4gICAgICBpZiAobWJwcyA8IDEwIHx8IG1icHMgPiA1MCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBFbmNvZGluZ1ZpZGVvTWF4Qml0cmF0ZVJhbmdlYCxcbiAgICAgICAgICBgRW5jb2RpbmcgY29uZmlnIHZpZGVvTWF4Qml0cmF0ZSBtdXN0IGJlIGJldHdlZW4gMTAgYW5kIDUwIE1icHMsIGdvdCAke21icHN9YCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0ZSBOREkgY29uc3RyYWludHM6IGRpc2NvdmVyeS1zZXJ2ZXIgbGltaXQsIG11dHVhbCBleGNsdXNpdml0eSB3aXRoIENESS9KUEVHIFhTLCB0aGVcbiAgICogcmVxdWlyZWQgTEFSR0UgZmxvdyBzaXplLCBhbmQgdGhlIHJlcXVpcmVtZW50cyBhbiBOREkgc291cmNlIHBsYWNlcyBvbiB0aGUgZmxvdy5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVOZGkocHJvcHM6IEZsb3dQcm9wcywgc291cmNlQ29uZmlnOiBDZm5GbG93LlNvdXJjZVByb3BlcnR5KTogdm9pZCB7XG4gICAgLy8gTkRJIGRpc2NvdmVyeSBzZXJ2ZXJzIGxpbWl0IChzZXJ2aWNlIHJlamVjdHMgPjMgYXQgZGVwbG95IHRpbWUpXG4gICAgY29uc3QgZGlzY292ZXJ5U2VydmVycyA9IHByb3BzLm5kaUNvbmZpZz8ubmRpRGlzY292ZXJ5U2VydmVycztcbiAgICBpZiAoZGlzY292ZXJ5U2VydmVycyAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQoZGlzY292ZXJ5U2VydmVycykgJiYgZGlzY292ZXJ5U2VydmVycy5sZW5ndGggPiAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpTWF4RGlzY292ZXJ5U2VydmVyc2AsXG4gICAgICAgIGBOREkgY29uZmlnIHN1cHBvcnRzIGEgbWF4aW11bSBvZiAzIGRpc2NvdmVyeSBzZXJ2ZXJzLCBnb3QgJHtkaXNjb3ZlcnlTZXJ2ZXJzLmxlbmd0aH1gLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOREkgY2Fubm90IGNvZXhpc3Qgd2l0aCBDREkgb3IgSlBFRyBYUyDigJQgdGhleSByZXF1aXJlIGRpZmZlcmVudCBmbG93IHNpemVzXG4gICAgaWYgKHByb3BzLm5kaUNvbmZpZz8ubmRpU3RhdGUgPT09IFN0YXRlLkVOQUJMRURcbiAgICAgICYmIChzb3VyY2VDb25maWcucHJvdG9jb2wgPT09IFNvdXJjZVByb3RvY29sLkNESS52YWx1ZSB8fCBzb3VyY2VDb25maWcucHJvdG9jb2wgPT09IFNvdXJjZVByb3RvY29sLkpQRUdYUy52YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBOZGlDZGlDb25mbGljdGAsXG4gICAgICAgICdOREkgY2Fubm90IGJlIHVzZWQgd2l0aCBDREkgb3IgSlBFRyBYUyBwcm90b2NvbHM7IE5ESSByZXF1aXJlcyBMQVJHRSBmbG93IHNpemUgd2hpbGUgQ0RJIGFuZCBKUEVHIFhTIHJlcXVpcmUgTEFSR0VfNFgnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOREkgcmVxdWlyZXMgTEFSR0UgZmxvdyBzaXplIChub3QgTUVESVVNLCBub3QgTEFSR0VfNFgpXG4gICAgaWYgKHByb3BzLm5kaUNvbmZpZz8ubmRpU3RhdGUgPT09IFN0YXRlLkVOQUJMRURcbiAgICAgICYmIHByb3BzLmZsb3dTaXplPy52YWx1ZSAhPT0gRmxvd1NpemUuTEFSR0UudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBOZGlGbG93U2l6ZVJlcXVpcmVkYCxcbiAgICAgICAgJ05ESSByZXF1aXJlcyBMQVJHRSBmbG93IHNpemU7IHNldCBmbG93U2l6ZSB0byBGbG93U2l6ZS5MQVJHRScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5ESSBzb3VyY2VzIHJlcXVpcmUgTkRJIHRvIGJlIGVuYWJsZWQgb24gdGhlIGZsb3dcbiAgICBpZiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5ORElfU1BFRURfSFEudmFsdWVcbiAgICAgICYmIHByb3BzLm5kaUNvbmZpZz8ubmRpU3RhdGUgIT09IFN0YXRlLkVOQUJMRUQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBOZGlTb3VyY2VSZXF1aXJlc05kaUNvbmZpZ2AsXG4gICAgICAgICdOREkgc291cmNlcyByZXF1aXJlIG5kaUNvbmZpZyB3aXRoIG5kaVN0YXRlIHNldCB0byBTdGF0ZS5FTkFCTEVEJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTkRJIHNvdXJjZXMgcmVxdWlyZSBMQVJHRSBmbG93IHNpemVcbiAgICBpZiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5ORElfU1BFRURfSFEudmFsdWVcbiAgICAgICYmIHByb3BzLmZsb3dTaXplPy52YWx1ZSAhPT0gRmxvd1NpemUuTEFSR0UudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBOZGlTb3VyY2VGbG93U2l6ZVJlcXVpcmVkYCxcbiAgICAgICAgJ05ESSBzb3VyY2VzIHJlcXVpcmUgTEFSR0UgZmxvdyBzaXplOyBzZXQgZmxvd1NpemUgdG8gRmxvd1NpemUuTEFSR0UnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOREkgc291cmNlcyByZXF1aXJlIGVuY29kaW5nQ29uZmlnIHRvIHRyYW5zY29kZSBpbnRvIGEgdHJhbnNwb3J0IHN0cmVhbVxuICAgIGlmIChzb3VyY2VDb25maWcucHJvdG9jb2wgPT09IFNvdXJjZVByb3RvY29sLk5ESV9TUEVFRF9IUS52YWx1ZVxuICAgICAgJiYgIXByb3BzLmVuY29kaW5nQ29uZmlnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpU291cmNlUmVxdWlyZXNFbmNvZGluZ0NvbmZpZ2AsXG4gICAgICAgICdOREkgc291cmNlcyByZXF1aXJlIGVuY29kaW5nQ29uZmlnIHRvIHRyYW5zY29kZSB0aGUgTkRJIHNvdXJjZSBpbnRvIGEgdHJhbnNwb3J0IHN0cmVhbScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSB0aGUgRUZBIFZQQy1pbnRlcmZhY2UgY291bnQgKGF0IG1vc3Qgb25lKSwgd2hlbiB0aGUgbGlzdCBpcyBjb25jcmV0ZS4gKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVZwY0VmYUNvdW50KHByb3BzOiBGbG93UHJvcHMpOiB2b2lkIHtcbiAgICAvLyBTa2lwIEVGQS1jb3VudCB2YWxpZGF0aW9uIHdoZW4gdGhlIHVzZXIgcGFzc2VkIGEgdG9rZW5pemVkIHZwY0ludGVyZmFjZXMgbGlzdDtcbiAgICAvLyB3ZSBjYW4ndCBpbnNwZWN0IGluZGl2aWR1YWwgZW50cmllcyBpbiB0aGF0IGNhc2UuXG4gICAgY29uc3QgZWZhQ291bnQgPSBwcm9wcy52cGNJbnRlcmZhY2VzICE9PSB1bmRlZmluZWQgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy52cGNJbnRlcmZhY2VzKVxuICAgICAgPyBwcm9wcy52cGNJbnRlcmZhY2VzLmZpbHRlcih2cGMgPT4gdnBjLm5ldHdvcmtJbnRlcmZhY2VUeXBlPy52YWx1ZSA9PT0gTmV0d29ya0ludGVyZmFjZS5FRkEudmFsdWUpLmxlbmd0aFxuICAgICAgOiAwO1xuXG4gICAgaWYgKGVmYUNvdW50ID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YEZsb3dNYXhFZmFJbnRlcmZhY2VzYCxcbiAgICAgICAgYEEgZmxvdyBjYW4gaGF2ZSBhIG1heGltdW0gb2YgMSBFRkEgVlBDIGludGVyZmFjZSwgZ290ICR7ZWZhQ291bnR9YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIHRoZSBVUkwgZm9yIGEgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29sLiBUaGUgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5XG4gICAqIGNoZWNrZWQgYF9oYXNMaXN0ZW5lclNvdXJjZWA7IHRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIHByb3RvY29sIGlzIGluXG4gICAqIGBMSVNURU5FUl9QUk9UT0NPTF9TQ0hFTUVTYCBhbmQgdGhyb3dzIGFuIHVuc2NvcGVkIGVycm9yIG90aGVyd2lzZS5cbiAgICovXG4gIHByaXZhdGUgY29tcHV0ZUluZ2VzdFVybChwcm90b2NvbDogc3RyaW5nIHwgdW5kZWZpbmVkLCBpcDogc3RyaW5nLCBwb3J0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGNvbnN0IHNjaGVtZSA9IHByb3RvY29sID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBGbG93LkxJU1RFTkVSX1BST1RPQ09MX1NDSEVNRVMuZ2V0KHByb3RvY29sKTtcbiAgICBpZiAoc2NoZW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFNvdXJjZUluZ2VzdFVybENvbXB1dGVOb3RMaXN0ZW5lcmAsXG4gICAgICAgIGBpbnRlcm5hbDogY29tcHV0ZUluZ2VzdFVybCBjYWxsZWQgZm9yIG5vbi1saXN0ZW5lciBwcm90b2NvbCAnJHtwcm90b2NvbH0nYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBGbi5qb2luKCcnLCBbYCR7c2NoZW1lfTovL2AsIGlwLCAnOicsIHBvcnRdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBWUEMgaW50ZXJmYWNlIHRvIHRoaXMgZmxvdy5cbiAgICovXG4gIEBNZXRob2RNZXRhZGF0YSgpXG4gIHB1YmxpYyBhZGRWcGNJbnRlcmZhY2UodnBjOiBWcGNJbnRlcmZhY2VDb25maWcpIHtcbiAgICB0aGlzLnZwY0ludGVyZmFjZXMucHVzaCh7XG4gICAgICBuYW1lOiB2cGMubmFtZSxcbiAgICAgIG5ldHdvcmtJbnRlcmZhY2VJZHM6IHZwYy5uZXR3b3JrSW50ZXJmYWNlSWRzLFxuICAgICAgbmV0d29ya0ludGVyZmFjZVR5cGU6IHZwYy5uZXR3b3JrSW50ZXJmYWNlVHlwZT8udmFsdWUsXG4gICAgICBzZWN1cml0eUdyb3VwSWRzOiB2cGMuc2VjdXJpdHlHcm91cHMubWFwKHNnID0+IHNnLnNlY3VyaXR5R3JvdXBJZCksXG4gICAgICBzdWJuZXRJZDogdnBjLnN1Ym5ldC5zdWJuZXRJZCxcbiAgICAgIHJvbGVBcm46IHZwYy5yb2xlLnJvbGVBcm4sXG4gICAgfSk7XG4gICAgcmV0dXJuIHZwYztcbiAgfVxufVxuIl19
|
|
1068
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvdy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImZsb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQ0EsNkNBQXFJO0FBRXJJLCtEQUEwRDtBQUMxRCxtRUFBdUQ7QUFFdkQsNEVBQTREO0FBQzVELDhFQUE4RjtBQUM5RiwwRUFBMEU7QUFHMUUsK0NBQTJDO0FBRTNDLDJFQUE2RDtBQUM3RCxtRkFBNkQ7QUFFN0QscUNBQXVHO0FBaUx2Rzs7R0FFRztBQUNILE1BQWEsUUFBUTtJQTZCaUI7O0lBNUJwQzs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBVSxNQUFNLEdBQUcsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdkQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQVUsS0FBSyxHQUFHLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3JEOztPQUVHO0lBQ0ksTUFBTSxDQUFVLFFBQVEsR0FBRyxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRDs7O09BR0c7SUFDSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQWE7UUFDNUIsT0FBTyxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1QjtJQUVELDhDQUE4QztJQUM5QyxZQUFvQyxLQUFhO1FBQWIsVUFBSyxHQUFMLEtBQUssQ0FBUTtLQUFJO0lBRXJELCtCQUErQjtJQUN4QixRQUFRO1FBQ2IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0tBQ25COztBQWxDSCw0QkFtQ0M7QUF3REQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLGNBQWM7SUF1Qk47SUFDQTtJQUNBO0lBQ0E7O0lBekJuQjs7T0FFRztJQUNJLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBZ0MsRUFBRTs7Ozs7Ozs7OztRQUNwRCxJQUFJLE9BQU8sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMzQixNQUFNLEVBQUUsR0FBRyxPQUFP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LEdBQUcsUUFBUSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ2pHLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUkscUNBQXVCLENBQy9CLElBQUEsc0JBQUcsRUFBQSxtQ0FBbUMsRUFDdEMsZ0VBQWdFLFFBQVEsR0FBRyxDQUM1RSxDQUFDO1lBQ0osQ0FBQztZQUNELE9BQU8sZ0JBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxNQUFNLEtBQUssRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDckQ7UUFFRDs7V0FFRztRQUVJLGVBQWUsQ0FBQyxHQUF1Qjs7Ozs7Ozs7OztZQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDdEIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2dCQUNkLG1CQUFtQixFQUFFLEdBQUcsQ0FBQyxtQkFBbUI7Z0JBQzVDLG9CQUFvQixFQUFFLEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLO2dCQUNyRCxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUM7Z0JBQ2xFLFFBQVEsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVE7Z0JBQzdCLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU87YUFDMUIsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxHQUFHLENBQUM7U0FDWjs7WUFoWFUsdURBQUk7Ozs7O0FBQUosb0JBQUkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEJpdHJhdGUsIElSZXNvdXJjZSB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IEFybkZvcm1hdCwgUmVzb3VyY2UsIExhenksIE5hbWVzLCBEdXJhdGlvbiwgU3RhY2ssIFRva2VuLCBGbiwgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IsIFZhbGlkYXRpb25FcnJvciB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlIHsgTWV0cmljT3B0aW9ucyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IE1ldHJpYywgVW5pdCB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IENmbkZsb3cgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFjb25uZWN0JztcbmltcG9ydCB0eXBlIHsgSUZsb3dSZWYsIEZsb3dSZWZlcmVuY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtbWVkaWFjb25uZWN0JztcbmltcG9ydCB7IGxpdCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0IHsgYWRkQ29uc3RydWN0TWV0YWRhdGEsIE1ldGhvZE1ldGFkYXRhIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvbWV0YWRhdGEtcmVzb3VyY2UnO1xuaW1wb3J0IHsgcHJvcGVydHlJbmplY3RhYmxlIH0gZnJvbSAnYXdzLWNkay1saWIvY29yZS9saWIvcHJvcC1pbmplY3RhYmxlJztcbmltcG9ydCB0eXBlIHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgdHlwZSB7IElGbG93T3V0cHV0LCBPdXRwdXRDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9mbG93LW91dHB1dCc7XG5pbXBvcnQgeyBGbG93T3V0cHV0IH0gZnJvbSAnLi9mbG93LW91dHB1dCc7XG5pbXBvcnQgdHlwZSB7IFNvdXJjZUNvbmZpZ3VyYXRpb24gfSBmcm9tICcuL2Zsb3ctc291cmNlLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgU291cmNlUHJvdG9jb2wgfSBmcm9tICcuL2Zsb3ctc291cmNlLWNvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgRmxvd0dyYW50cyB9IGZyb20gJy4vbWVkaWFjb25uZWN0LWdyYW50cy5nZW5lcmF0ZWQnO1xuaW1wb3J0IHR5cGUgeyBWcGNJbnRlcmZhY2VDb25maWcsIE1haW50ZW5hbmNlRGF5LCBGcmFtZXJhdGUsIFBpeGVsQXNwZWN0UmF0aW8gfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQgeyBGYWlsb3Zlck1vZGUsIE5ldHdvcmtJbnRlcmZhY2UsIFN0YXRlLCB0b1RpdGxlQ2FzZSwgdmFsaWRhdGVNYWludGVuYW5jZVRpbWUgfSBmcm9tICcuL3NoYXJlZCc7XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBGbG93XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUZsb3cgZXh0ZW5kcyBJUmVzb3VyY2UsIElGbG93UmVmIHtcblxuICAvKipcbiAgICogVGhlIEFtYXpvbiBSZXNvdXJjZSBOYW1lIChBUk4pIG9mIHRoZSBmbG93LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmbG93QXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBbWF6b24gUmVzb3VyY2UgTmFtZSAoQVJOKSBvZiB0aGUgc291cmNlIGRlZmluZWQgb24gdGhlIGZsb3cuXG4gICAqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUFybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB0aGF0IHRoZSBmbG93IHVzZXMgdG8gc2VuZCBvdXRib3VuZCBjb250ZW50LlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBlZ3Jlc3NJcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB0aGF0IHRoZSBmbG93IGxpc3RlbnMgb24gZm9yIGluY29taW5nIGNvbnRlbnQuXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29scyAoUlRQLCBSVFAtRkVDLCBSSVNULCBTUlQgbGlzdGVuZXIsXG4gICAqIFppeGkgcHVzaCkuIEFjY2Vzc2luZyB0aGlzIG9uIFNSVCBjYWxsZXIsIGVudGl0bGVtZW50LCBnYXRld2F5IGJyaWRnZSwgcm91dGVyLFxuICAgKiBDREksIEpQRUcgWFMsIG9yIGltcG9ydGVkIGZsb3dzIHRocm93cyDigJQgdGhvc2Ugc291cmNlcyBkb24ndCBleHBvc2UgYSBsaXN0ZW5pbmdcbiAgICogSVAgYWRkcmVzcy5cbiAgICpcbiAgICogQGF0dHJpYnV0ZVxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0SXA6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBvcnQgdGhhdCB0aGUgZmxvdyBsaXN0ZW5zIG9uIGZvciBpbmNvbWluZyBjb250ZW50LlxuICAgKlxuICAgKiBBdmFpbGFibGUgZm9yIHRoZSBzYW1lIGxpc3RlbmVyLXN0eWxlIHNvdXJjZSBwcm90b2NvbHMgYXMgYHNvdXJjZUluZ2VzdElwYC5cbiAgICogQWNjZXNzaW5nIHRoaXMgb24gU1JUIGNhbGxlciwgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIENESSwgSlBFRyBYUyxcbiAgICogb3IgaW1wb3J0ZWQgZmxvd3MgdGhyb3dzLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBmdWxsIGluZ2VzdCBVUkwgZm9yIHRoZSBmbG93IHNvdXJjZSwgY29tYmluaW5nIHByb3RvY29sLCBJUCwgYW5kIHBvcnQuXG4gICAqIEZvciBleGFtcGxlOiBgc3J0Oi8vMjAzLjAuMTEzLjEwOjUwMDBgXG4gICAqXG4gICAqIEF2YWlsYWJsZSBmb3IgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29scyAoUlRQLCBSVFAtRkVDLCBSSVNULCBTUlQgbGlzdGVuZXIsXG4gICAqIFppeGkgcHVzaCkgd2hlcmUgdGhlIGZsb3cgbGlzdGVucyBmb3IgYW4gdXBzdHJlYW0gc2VuZGVyLiBBY2Nlc3NpbmcgdGhpcyBvblxuICAgKiBTUlQgY2FsbGVyLCBlbnRpdGxlbWVudCwgZ2F0ZXdheSBicmlkZ2UsIHJvdXRlciwgQ0RJLCBKUEVHIFhTLCBvciBpbXBvcnRlZFxuICAgKiBmbG93cyB0aHJvd3Mg4oCUIHRob3NlIHNvdXJjZXMgZG9uJ3QgZXhwb3NlIGEgc2luZ2xlIGhvc3Q6cG9ydCBpbmdlc3QgVVJMLlxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlSW5nZXN0VXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSB0aGF0IHRoZSBmbG93IHdhcyBjcmVhdGVkIGluLlxuICAgKlxuICAgKiBAYXR0cmlidXRlXG4gICAqL1xuICByZWFkb25seSBmbG93QXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogRmFpbG92ZXIgQ29uZmlndXJhdGlvbiBmb3IgZmxvd1xuICAgKi9cbiAgcmVhZG9ubHkgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDb2xsZWN0aW9uIG9mIGdyYW50IG1ldGhvZHMgZm9yIHRoaXMgZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IGdyYW50czogRmxvd0dyYW50cztcblxuICAvKipcbiAgICogQ3JlYXRlIGEgQ2xvdWRXYXRjaCBtZXRyaWMgZm9yIHRoaXMgZmxvdy5cbiAgICovXG4gIG1ldHJpYyhtZXRyaWNOYW1lOiBzdHJpbmcsIHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgYml0cmF0ZSBvZiBjb250ZW50IGluZ2VzdGVkIGludG8gdGhlIGZsb3cuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZUJpdHJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHBhY2tldHMgdGhhdCB3ZXJlIG5vdCByZWNvdmVyZWQgYnkgdGhlIGZsb3cgc291cmNlLlxuICAgKiBAZGVmYXVsdCAtIHN1bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZU5vdFJlY292ZXJlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljO1xuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFja2V0cyByZWNlaXZlZCBieSB0aGUgZmxvdyBzb3VyY2UuXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljU291cmNlVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGluZGljYXRpbmcgd2hpY2ggc291cmNlIGlzIHNlbGVjdGVkIGZvciBpbmdlc3Qgd2hlbiB1c2luZyBgRmFpbG92ZXJgIGZhaWxvdmVyIG1vZGUuXG4gICAqIEBkZWZhdWx0IC0gbWF4aW11bSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZVNlbGVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHNvdXJjZSAoMSBjb25uZWN0ZWQsIDAgZGlzY29ubmVjdGVkKS5cbiAgICogQXBwbGllcyBvbmx5IHRvIFppeGksIFNSVCwgYW5kIFJJU1Qgc291cmNlcy5cbiAgICogQGRlZmF1bHQgLSBtaW5pbXVtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgbWV0cmljU291cmNlQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBzb3VyY2UgdHJhbnNpdGlvbmVkIGZyb20gY29ubmVjdGVkIHRvIGRpc2Nvbm5lY3RlZC5cbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VEaXNjb25uZWN0aW9ucyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QgZHVyaW5nIHRyYW5zaXQsIG1lYXN1cmVkIGJlZm9yZSBhbnkgZXJyb3IgY29ycmVjdGlvbi5cbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VEcm9wcGVkUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHBlcmNlbnRhZ2Ugb2YgcGFja2V0cyBsb3N0IGR1cmluZyB0cmFuc2l0LCBldmVuIGlmIHRoZXkgd2VyZSByZWNvdmVyZWQuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcm91bmQtdHJpcCB0aW1lIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgTWVkaWFDb25uZWN0LlxuICAgKiBBcHBsaWVzIG9ubHkgdG8gUklTVCwgWml4aSwgYW5kIFNSVCBzb3VyY2VzLlxuICAgKiBAZGVmYXVsdCAtIGF2ZXJhZ2Ugb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBtZXRyaWNTb3VyY2VSb3VuZFRyaXBUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYztcblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgY3VycmVudCBuZXR3b3JrIGppdHRlciBvZiB0aGUgc291cmNlLCBtZWFzdXJlZCBpbiBtaWxsaXNlY29uZHMuXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIG1ldHJpY1NvdXJjZUppdHRlcihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWM7XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBvdXRwdXQgdG8gdGhpcyBmbG93XG4gICAqL1xuICBhZGRPdXRwdXQoaWQ6IHN0cmluZywgb3B0aW9uczogQWRkRmxvd091dHB1dE9wdGlvbnMpOiBJRmxvd091dHB1dDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBhZGRpbmcgYW4gb3V0cHV0IHRvIGEgZmxvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZGRGbG93T3V0cHV0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICByZWFkb25seSBvdXRwdXQ6IE91dHB1dENvbmZpZ3VyYXRpb247XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmxvdyBvdXRwdXQuXG4gICAqIEBkZWZhdWx0IC0gYXV0by1nZW5lcmF0ZWRcbiAgICovXG4gIHJlYWRvbmx5IGZsb3dPdXRwdXROYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogQSBkZXNjcmlwdGlvbiBvZiB0aGUgb3V0cHV0LlxuICAgKiBAZGVmYXVsdCAtIG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIG91dHB1dCBpcyBlbmFibGVkLlxuICAgKiBAZGVmYXVsdCBTdGF0ZS5FTkFCTEVEXG4gICAqL1xuICByZWFkb25seSBvdXRwdXRTdGF0dXM/OiBTdGF0ZTtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBGbG93IFNpemVcbiAqL1xuZXhwb3J0IGNsYXNzIEZsb3dTaXplIHtcbiAgLyoqXG4gICAqIE1lZGl1bSBmbG93IHNpemUuIFRoZSBkZWZhdWx0IOKAlCBzdGFuZGFyZCB0cmFuc3BvcnQgc3RyZWFtIGRpc3RyaWJ1dGlvbjsgZG9lcyBub3RcbiAgICogc3VwcG9ydCBOREksIENESSwgb3IgSlBFRyBYUy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFjb25uZWN0L2xhdGVzdC91Zy9mbG93LXNpemVzLWNhcGFiaWxpdGllcy5odG1sXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IE1FRElVTSA9IG5ldyBGbG93U2l6ZSgnTUVESVVNJyk7XG4gIC8qKlxuICAgKiBMYXJnZSBmbG93IHNpemUuIFJlcXVpcmVkIHdoZW4gdGhlIGZsb3cgdXNlcyBOREkgc291cmNlcyBvciBvdXRwdXRzLiBTdXBwb3J0c1xuICAgKiB0cmFuc3BvcnQgc3RyZWFtIGRpc3RyaWJ1dGlvbiBwbHVzIE5ESTsgZG9lcyBub3Qgc3VwcG9ydCBDREkgb3IgSlBFRyBYUy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vbWVkaWFjb25uZWN0L2xhdGVzdC91Zy9mbG93LXNpemVzLWNhcGFiaWxpdGllcy5odG1sXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExBUkdFID0gbmV3IEZsb3dTaXplKCdMQVJHRScpO1xuICAvKipcbiAgICogT3B0aW9uIGZvciBsYXJnZSA0eCBmbG93IHNpemUuIFJlcXVpcmVkIGZvciBKUEVHIFhTIGFuZCBDREkgcHJvdG9jb2xzLiBEb2VzIG5vdCBzdXBwb3J0IHRyYW5zcG9ydCBzdHJlYW1zIG9yIE5ESS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTEFSR0VfNFggPSBuZXcgRmxvd1NpemUoJ0xBUkdFXzRYJyk7XG5cbiAgLyoqXG4gICAqIFVzZSBhIGN1c3RvbSBmbG93IHNpemUgdmFsdWVcbiAgICogQHBhcmFtIHZhbHVlIFRoZSBmbG93IHNpemUgc3RyaW5nIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBGbG93U2l6ZSB7XG4gICAgcmV0dXJuIG5ldyBGbG93U2l6ZSh2YWx1ZSk7XG4gIH1cblxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSBmbG93IHNpemUgc3RyaW5nIHZhbHVlICovXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IHZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIHNjaGVkdWxlZCBtYWludGVuYW5jZSB3aW5kb3dzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1haW50ZW5hbmNlV2luZG93IHtcbiAgLyoqIEEgZGF5IG9mIGEgd2VlayB3aGVuIHRoZSBtYWludGVuYW5jZSB3aWxsIGhhcHBlbi4gKi9cbiAgcmVhZG9ubHkgZGF5OiBNYWludGVuYW5jZURheTtcbiAgLyoqIFRoZSBtYWludGVuYW5jZSBzdGFydCB0aW1lIGluIFVUQywgMjQtaG91ciBISDpNTSBmb3JtYXQuIE1pbnV0ZXMgbXVzdCBiZSAwMCAoZS5nLiwgJzAyOjAwJywgJzEzOjAwJykuICovXG4gIHJlYWRvbmx5IHRpbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBtZXJnZS1tb2RlIHNvdXJjZSBmYWlsb3Zlci5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXJnZUZhaWxvdmVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGV0aGVyIGZhaWxvdmVyIGlzIGVuYWJsZWQuIFNldCB0byBgU3RhdGUuRElTQUJMRURgIHRvIGtlZXAgdGhlIGNvbmZpZ3VyYXRpb25cbiAgICogb24gdGhlIGZsb3cgd2l0aG91dCBzd2l0Y2hpbmcgZmFpbG92ZXIgb24uXG4gICAqXG4gICAqIEBkZWZhdWx0IFN0YXRlLkVOQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IHN0YXRlPzogU3RhdGU7XG4gIC8qKlxuICAgKiBTZWFyY2ggd2luZG93IHRpbWUgdG8gbG9vayBmb3IgU01QVEUgMjAyMi03IHBhY2tldHMuIEEgbGFyZ2VyIHJlY292ZXJ5IHdpbmRvd1xuICAgKiBtZWFucyBhIGxvbmdlciBkZWxheSBpbiB0cmFuc21pdHRpbmcgdGhlIHN0cmVhbSwgYnV0IG1vcmUgcm9vbSBmb3IgZXJyb3JcbiAgICogY29ycmVjdGlvbi4gQSBzbWFsbGVyIHdpbmRvdyBtZWFucyBhIHNob3J0ZXIgZGVsYXkgYnV0IGxlc3Mgcm9vbSBmb3IgY29ycmVjdGlvbi5cbiAgICpcbiAgICogVmFsaWQgcmFuZ2U6IDEwMOKAkzE1MDAwIG1zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIDIwMCBtc1xuICAgKi9cbiAgcmVhZG9ubHkgcmVjb3ZlcnlXaW5kb3c/OiBEdXJhdGlvbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBzd2l0Y2hvdmVyLW1vZGUgc291cmNlIGZhaWxvdmVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZhaWxvdmVyRmFpbG92ZXJPcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgZmFpbG92ZXIgaXMgZW5hYmxlZC4gU2V0IHRvIGBTdGF0ZS5ESVNBQkxFRGAgdG8ga2VlcCB0aGUgY29uZmlndXJhdGlvblxuICAgKiBvbiB0aGUgZmxvdyB3aXRob3V0IHN3aXRjaGluZyBmYWlsb3ZlciBvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhdGUuRU5BQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgeW91IHdhbnQgdG8gdHJlYXQgYXMgcHJpbWFyeS4gSWYgc2V0LCBNZWRpYUNvbm5lY3QgYWx3YXlzXG4gICAqIHVzZXMgdGhpcyBzb3VyY2Ugd2hlbiBpdCBpcyBhdmFpbGFibGUuIFdoZW4gdW5zZXQsIGJvdGggc291cmNlcyBhcmUgdHJlYXRlZCB3aXRoXG4gICAqIGVxdWFsIHByaW9yaXR5LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJvdGggc291cmNlcyBhcmUgZXF1YWwgcHJpb3JpdHlcbiAgICovXG4gIHJlYWRvbmx5IHByaW1hcnlTb3VyY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogU291cmNlIGZhaWxvdmVyIGNvbmZpZ3VyYXRpb24gZm9yIGEgZmxvdy5cbiAqXG4gKiBNZWRpYUNvbm5lY3Qgc3VwcG9ydHMgdHdvIGZhaWxvdmVyIG1vZGVzOlxuICogLSB7QGxpbmsgRmFpbG92ZXJDb25maWcubWVyZ2V9IGNvbWJpbmVzIHR3byBiaW5hcnktaWRlbnRpY2FsIHNvdXJjZXMgaW50byBhIHNpbmdsZVxuICogICBzdHJlYW0sIHJlY292ZXJpbmcgbG9zdCBwYWNrZXRzIGZyb20gdGhlIG90aGVyIHNvdXJjZSAoU01QVEUgMjAyMi03KS5cbiAqIC0ge0BsaW5rIEZhaWxvdmVyQ29uZmlnLmZhaWxvdmVyfSBzd2l0Y2hlcyBiZXR3ZWVuIGEgcHJpbWFyeSBhbmQgYmFja3VwIHNvdXJjZSB3aGVuXG4gKiAgIHRoZSBhY3RpdmUgc291cmNlIHN0b3BzIHJlY2VpdmluZyBkYXRhLlxuICovXG5leHBvcnQgY2xhc3MgRmFpbG92ZXJDb25maWcge1xuICAvKipcbiAgICogQ29uZmlndXJlIG1lcmdlLW1vZGUgZmFpbG92ZXIuIFJlcXVpcmVzIHR3byBiaW5hcnktaWRlbnRpY2FsIHNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIG1lcmdlKG9wdGlvbnM6IE1lcmdlRmFpbG92ZXJPcHRpb25zID0ge30pOiBGYWlsb3ZlckNvbmZpZyB7XG4gICAgaWYgKG9wdGlvbnMucmVjb3ZlcnlXaW5kb3cpIHtcbiAgICAgIGNvbnN0IG1zID0gb3B0aW9ucy5yZWNvdmVyeVdpbmRvdy50b01pbGxpc2Vjb25kcygpO1xuICAgICAgaWYgKG1zIDwgMTAwIHx8IG1zID4gMTUwMDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yKGxpdGBSZWNvdmVyeVdpbmRvd1JhbmdlYCwgYFJlY292ZXJ5IHdpbmRvdyBtdXN0IGJlIGJldHdlZW4gMTAwIGFuZCAxNTAwMCBtcywgZ290ICR7bXN9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgRmFpbG92ZXJDb25maWcoRmFpbG92ZXJNb2RlLk1FUkdFLCBvcHRpb25zLnN0YXRlID8/IFN0YXRlLkVOQUJMRUQsIG9wdGlvbnMucmVjb3ZlcnlXaW5kb3csIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogQ29uZmlndXJlIHN3aXRjaG92ZXItbW9kZSBmYWlsb3Zlci4gVGhlIGZsb3cgc3dhcHMgdG8gdGhlIGJhY2t1cCBzb3VyY2Ugd2hlbiB0aGVcbiAgICogcHJpbWFyeSBzb3VyY2Ugc3RvcHMgcmVjZWl2aW5nIGRhdGEuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZhaWxvdmVyKG9wdGlvbnM6IEZhaWxvdmVyRmFpbG92ZXJPcHRpb25zID0ge30pOiBGYWlsb3ZlckNvbmZpZyB7XG4gICAgcmV0dXJuIG5ldyBGYWlsb3ZlckNvbmZpZyhGYWlsb3Zlck1vZGUuRkFJTE9WRVIsIG9wdGlvbnMuc3RhdGUgPz8gU3RhdGUuRU5BQkxFRCwgdW5kZWZpbmVkLCBvcHRpb25zLnByaW1hcnlTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9mYWlsb3Zlck1vZGU6IEZhaWxvdmVyTW9kZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IF9zdGF0ZTogU3RhdGUsXG4gICAgcHJpdmF0ZSByZWFkb25seSBfcmVjb3ZlcnlXaW5kb3c6IER1cmF0aW9uIHwgdW5kZWZpbmVkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgX3ByaW1hcnlTb3VyY2U6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgKSB7fVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgZmFpbG92ZXIgZW5hYmxlZC5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgZ2V0IF9pc0VuYWJsZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3N0YXRlID09PSBTdGF0ZS5FTkFCTEVEO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGlzIGJvdW5kIHRvIGEgRmxvdy5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBwdWJsaWMgX2JpbmQoKTogQ2ZuRmxvdy5GYWlsb3ZlckNvbmZpZ1Byb3BlcnR5IHtcbiAgICByZXR1cm4ge1xuICAgICAgZmFpbG92ZXJNb2RlOiB0aGlzLl9mYWlsb3Zlck1vZGUudmFsdWUsXG4gICAgICByZWNvdmVyeVdpbmRvdzogdGhpcy5fcmVjb3ZlcnlXaW5kb3c/LnRvTWlsbGlzZWNvbmRzKCksXG4gICAgICBzb3VyY2VQcmlvcml0eTogdGhpcy5fcHJpbWFyeVNvdXJjZSA/IHsgcHJpbWFyeVNvdXJjZTogdGhpcy5fcHJpbWFyeVNvdXJjZSB9IDogdW5kZWZpbmVkLFxuICAgICAgc3RhdGU6IHRoaXMuX3N0YXRlLFxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25maWd1cmVzIGEgc291cmNlIG1vbml0b3JpbmcgbWV0cmljLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vbml0b3JpbmdNZXRyaWMge1xuICAvKipcbiAgICogV2hldGhlciB0aGUgbWV0cmljIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFRoZSB0aHJlc2hvbGQgaXMgcGVyc2lzdGVkIGJ5IHRoZVxuICAgKiBzZXJ2aWNlIGVpdGhlciB3YXksIHNvIHlvdSBjYW4gdG9nZ2xlIHRoZSBtZXRyaWMgb24gYW5kIG9mZiB3aXRob3V0IGxvc2luZ1xuICAgKiB0aGUgdGhyZXNob2xkIHZhbHVlLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdGU6IFN0YXRlO1xuICAvKipcbiAgICogVGhyZXNob2xkIGluIHNlY29uZHMgdGhhdCB0cmlnZ2VycyB0aGUgbWV0cmljJ3MgYWxlcnQuIFZhbGlkIHJhbmdlOiAxMOKAkzYwIHNlY29uZHMuXG4gICAqL1xuICByZWFkb25seSB0aHJlc2hvbGQ6IER1cmF0aW9uO1xufVxuXG4vKipcbiAqIFNvdXJjZSBtb25pdG9yaW5nIHNldHRpbmdzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZU1vbml0b3JpbmdDb25maWcge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgY29udGVudCBxdWFsaXR5IGFuYWx5c2lzIGlzIGVuYWJsZWQgb3IgZGlzYWJsZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gY29udGVudCBxdWFsaXR5IGFuYWx5c2lzIGlzIGRpc2FibGVkXG4gICAqL1xuICByZWFkb25seSBjb250ZW50UXVhbGl0eUFuYWx5c2lzU3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0aHVtYm5haWwgbW9uaXRvcmluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aHVtYm5haWwgbW9uaXRvcmluZyBpcyBkaXNhYmxlZFxuICAgKi9cbiAgcmVhZG9ubHkgdGh1bWJuYWlsU3RhdGU/OiBTdGF0ZTtcbiAgLyoqXG4gICAqIFNpbGVudC1hdWRpbyBkZXRlY3Rpb24gb24gdGhlIHNvdXJjZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzaWxlbnQgYXVkaW8gbW9uaXRvcmluZyBpcyBub3QgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgc2lsZW50QXVkaW8/OiBNb25pdG9yaW5nTWV0cmljO1xuICAvKipcbiAgICogQmxhY2stZnJhbWVzIGRldGVjdGlvbiBvbiB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGJsYWNrIGZyYW1lcyBtb25pdG9yaW5nIGlzIG5vdCBjb25maWd1cmVkXG4gICAqL1xuICByZWFkb25seSBibGFja0ZyYW1lcz86IE1vbml0b3JpbmdNZXRyaWM7XG4gIC8qKlxuICAgKiBGcm96ZW4tZnJhbWVzIGRldGVjdGlvbiBvbiB0aGUgc291cmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGZyb3plbiBmcmFtZXMgbW9uaXRvcmluZyBpcyBub3QgY29uZmlndXJlZFxuICAgKi9cbiAgcmVhZG9ubHkgZnJvemVuRnJhbWVzPzogTW9uaXRvcmluZ01ldHJpYztcbn1cblxuLyoqXG4gKiBOREkgQ29uZmlndXJhdGlvblxuICovXG5leHBvcnQgaW50ZXJmYWNlIE5kaURpc2NvdmVyeVNlcnZlckNvbmZpZyB7XG4gIC8qKlxuICAgKiBUaGUgdW5pcXVlIG5ldHdvcmsgYWRkcmVzcyBvZiB0aGUgTkRJIGRpc2NvdmVyeSBzZXJ2ZXIuXG4gICAqL1xuICByZWFkb25seSBkaXNjb3ZlcnlTZXJ2ZXJBZGRyZXNzOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgcG9ydCBmb3IgdGhlIE5ESSBkaXNjb3Zlcnkgc2VydmVyLiBEZWZhdWx0cyB0byA1OTU5IGlmIGEgY3VzdG9tIHBvcnQgaXNuJ3Qgc3BlY2lmaWVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgYXBwbGllcyA1OTU5IGF0IGRlcGxveSB0aW1lXG4gICAqL1xuICByZWFkb25seSBkaXNjb3ZlcnlTZXJ2ZXJQb3J0PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIFZQQyBpbnRlcmZhY2UgdGhhdCB0aGUgTkRJIGRpc2NvdmVyeSBzZXJ2ZXIgdXNlcyB0byByZWFjaCB0aGUgZmxvdy5cbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZTogVnBjSW50ZXJmYWNlQ29uZmlnO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIE5ESSBDb25maWdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOZGlDb25maWcge1xuICAvKipcbiAgICogQSBwcmVmaXggZm9yIHRoZSBuYW1lcyBvZiB0aGUgTkRJIHNvdXJjZXMgdGhhdCB0aGUgZmxvdyBjcmVhdGVzLlxuICAgKiBJZiBhIGN1c3RvbSBuYW1lIGlzbid0IHNwZWNpZmllZCwgTWVkaWFDb25uZWN0IGdlbmVyYXRlcyBhIHVuaXF1ZSAxMi1jaGFyYWN0ZXIgSUQgYXMgdGhlIHByZWZpeC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBNZWRpYUNvbm5lY3QgZ2VuZXJhdGVzIGEgdW5pcXVlIDEyLWNoYXJhY3RlciBJRFxuICAgKi9cbiAgcmVhZG9ubHkgbWFjaGluZU5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgZm9yIGluZGl2aWR1YWwgTkRJIGRpc2NvdmVyeSBzZXJ2ZXJzLlxuICAgKiBBIG1heGltdW0gb2YgMyBzZXJ2ZXJzIGlzIGFsbG93ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gTkRJIGRpc2NvdmVyeSBzZXJ2ZXJzXG4gICAqL1xuICByZWFkb25seSBuZGlEaXNjb3ZlcnlTZXJ2ZXJzPzogTmRpRGlzY292ZXJ5U2VydmVyQ29uZmlnW107XG4gIC8qKlxuICAgKiBBIHNldHRpbmcgdGhhdCBjb250cm9scyB3aGV0aGVyIE5ESSBzb3VyY2VzIG9yIG91dHB1dHMgY2FuIGJlIHVzZWQgaW4gdGhlIGZsb3cuXG4gICAqIE11c3QgYmUgRU5BQkxFRCBmb3IgdGhlIGZsb3cgdG8gc3VwcG9ydCBOREkgc291cmNlcyBvciBvdXRwdXRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGF0ZS5ESVNBQkxFRFxuICAgKi9cbiAgcmVhZG9ubHkgbmRpU3RhdGU/OiBTdGF0ZTtcbn1cblxuLyoqXG4gKiBFbmNvZGluZyBwcm9maWxlcyBzdXBwb3J0ZWQgd2hlbiB0cmFuc2NvZGluZyBhbiBOREkgc291cmNlIHRvIGEgdHJhbnNwb3J0IHN0cmVhbS5cbiAqL1xuZXhwb3J0IGVudW0gRW5jb2RpbmdQcm9maWxlIHtcbiAgLyoqXG4gICAqIEguMjY0IHByb2ZpbGUgdHVuZWQgZm9yIGNvbnRyaWJ1dGlvbiB3b3JrZmxvd3Mg4oCUIGhpZ2hlciBxdWFsaXR5LCBoaWdoZXIgYml0cmF0ZS5cbiAgICovXG4gIENPTlRSSUJVVElPTl9IMjY0X0RFRkFVTFQgPSAnQ09OVFJJQlVUSU9OX0gyNjRfREVGQVVMVCcsXG4gIC8qKlxuICAgKiBILjI2NCBwcm9maWxlIHR1bmVkIGZvciBkaXN0cmlidXRpb24gd29ya2Zsb3dzIOKAlCBsb3dlciBiaXRyYXRlLCB3aWRlciBjb21wYXRpYmlsaXR5LlxuICAgKi9cbiAgRElTVFJJQlVUSU9OX0gyNjRfREVGQVVMVCA9ICdESVNUUklCVVRJT05fSDI2NF9ERUZBVUxUJyxcbn1cblxuLyoqXG4gKiBFbmNvZGluZyBjb25maWd1cmF0aW9uIGFwcGxpZWQgdG8gYW4gTkRJIHNvdXJjZSB3aGVuIHRyYW5zY29kaW5nIGl0IHRvIGEgdHJhbnNwb3J0XG4gKiBzdHJlYW0gZm9yIGRvd25zdHJlYW0gZGlzdHJpYnV0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEVuY29kaW5nQ29uZmlnIHtcbiAgLyoqXG4gICAqIFRoZSBlbmNvZGluZyBwcm9maWxlIHRvIHVzZSB3aGVuIHRyYW5zY29kaW5nIHRoZSBOREkgc291cmNlIGNvbnRlbnQgdG8gYSB0cmFuc3BvcnRcbiAgICogc3RyZWFtLiBZb3UgY2FuIGNoYW5nZSB0aGlzIHZhbHVlIHdoaWxlIHRoZSBmbG93IGlzIHJ1bm5pbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIE1lZGlhQ29ubmVjdCBzZXJ2aWNlIGRlZmF1bHRcbiAgICovXG4gIHJlYWRvbmx5IGVuY29kaW5nUHJvZmlsZT86IEVuY29kaW5nUHJvZmlsZTtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdmlkZW8gYml0cmF0ZSB0byB1c2Ugd2hlbiB0cmFuc2NvZGluZyB0aGUgTkRJIHNvdXJjZSB0byBhIHRyYW5zcG9ydCBzdHJlYW0uXG4gICAqXG4gICAqIFRoZSBzdXBwb3J0ZWQgcmFuZ2UgaXMgMTAgTWJwcyDigJMgNTAgTWJwcy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1bmRlZmluZWQ7IHdoZW4gb21pdHRlZCwgTWVkaWFDb25uZWN0IGFwcGxpZXMgMjAgTWJwcyBhdCBkZXBsb3kgdGltZVxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9NYXhCaXRyYXRlPzogQml0cmF0ZTtcbn1cblxuLyoqXG4gKiBPcHRpb24gZm9yIENvbG9yaW1ldHJ5XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xvcmltZXRyeSB7XG4gIC8qKiBPcHRpb24gZm9yIEJUNjAxICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQ2MDEgPSBuZXcgQ29sb3JpbWV0cnkoJ0JUNjAxJyk7XG4gIC8qKiBPcHRpb24gZm9yIEJUNzA5ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQ3MDkgPSBuZXcgQ29sb3JpbWV0cnkoJ0JUNzA5Jyk7XG4gIC8qKiBPcHRpb24gZm9yIEJUMjAyMCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJUMjAyMCA9IG5ldyBDb2xvcmltZXRyeSgnQlQyMDIwJyk7XG4gIC8qKiBPcHRpb24gZm9yIEJUMjEwMCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJUMjEwMCA9IG5ldyBDb2xvcmltZXRyeSgnQlQyMTAwJyk7XG4gIC8qKiBPcHRpb24gZm9yIFNUMjA2NS0xICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1QyMDY1XzEgPSBuZXcgQ29sb3JpbWV0cnkoJ1NUMjA2NS0xJyk7XG4gIC8qKiBPcHRpb24gZm9yIFNUMjA2NS0zICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1QyMDY1XzMgPSBuZXcgQ29sb3JpbWV0cnkoJ1NUMjA2NS0zJyk7XG4gIC8qKiBPcHRpb24gZm9yIFhZWiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFhZWiA9IG5ldyBDb2xvcmltZXRyeSgnWFlaJyk7XG5cbiAgLyoqIFVzZSBhIGN1c3RvbSBjb2xvcmltZXRyeSB2YWx1ZSAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBDb2xvcmltZXRyeSB7IHJldHVybiBuZXcgQ29sb3JpbWV0cnkodmFsdWUpOyB9XG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIGNvbG9yaW1ldHJ5IHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIFZpZGVvIFJhbmdlXG4gKi9cbmV4cG9ydCBjbGFzcyBWaWRlb1JhbmdlIHtcbiAgLyoqIE9wdGlvbiBmb3IgTmFycm93ICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTkFSUk9XID0gbmV3IFZpZGVvUmFuZ2UoJ05BUlJPVycpO1xuICAvKiogT3B0aW9uIGZvciBGdWxsICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRlVMTCA9IG5ldyBWaWRlb1JhbmdlKCdGVUxMJyk7XG4gIC8qKiBPcHRpb24gZm9yIEZ1bGwgUHJvdGVjdCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEZVTExQUk9URUNUID0gbmV3IFZpZGVvUmFuZ2UoJ0ZVTExQUk9URUNUJyk7XG5cbiAgLyoqIFVzZSBhIGN1c3RvbSB2aWRlbyByYW5nZSB2YWx1ZSAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBWaWRlb1JhbmdlIHsgcmV0dXJuIG5ldyBWaWRlb1JhbmdlKHZhbHVlKTsgfVxuICAvKiogQHBhcmFtIHZhbHVlIFRoZSB2aWRlbyByYW5nZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudmFsdWU7IH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBTY2FuIE1vZGVcbiAqL1xuZXhwb3J0IGNsYXNzIFNjYW5Nb2RlIHtcbiAgLyoqIE9wdGlvbiBmb3IgUHJvZ3Jlc3NpdmUgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBQUk9HUkVTU0lWRSA9IG5ldyBTY2FuTW9kZSgncHJvZ3Jlc3NpdmUnKTtcbiAgLyoqIE9wdGlvbiBmb3IgSW50ZXJsYWNlICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSU5URVJMQUNFID0gbmV3IFNjYW5Nb2RlKCdpbnRlcmxhY2UnKTtcbiAgLyoqIE9wdGlvbiBmb3IgUHJvZ3Jlc3NpdmUgU2VnbWVudGVkIEZyYW1lICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgUFJPR1JFU1NJVkVfU0VHTUVOVEVEX0ZSQU1FID0gbmV3IFNjYW5Nb2RlKCdwcm9ncmVzc2l2ZS1zZWdtZW50ZWQtZnJhbWUnKTtcblxuICAvKiogVXNlIGEgY3VzdG9tIHNjYW4gbW9kZSB2YWx1ZSAqL1xuICBwdWJsaWMgc3RhdGljIG9mKHZhbHVlOiBzdHJpbmcpOiBTY2FuTW9kZSB7IHJldHVybiBuZXcgU2Nhbk1vZGUodmFsdWUpOyB9XG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIHNjYW4gbW9kZSBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudmFsdWU7IH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBUY3NcbiAqL1xuZXhwb3J0IGNsYXNzIFRjcyB7XG4gIC8qKiBPcHRpb24gZm9yIFNEUiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFNEUiA9IG5ldyBUY3MoJ1NEUicpO1xuICAvKiogT3B0aW9uIGZvciBQUSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBRID0gbmV3IFRjcygnUFEnKTtcbiAgLyoqIE9wdGlvbiBmb3IgSExHICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSExHID0gbmV3IFRjcygnSExHJyk7XG4gIC8qKiBPcHRpb24gZm9yIExpbmVhciAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IExJTkVBUiA9IG5ldyBUY3MoJ0xJTkVBUicpO1xuICAvKiogT3B0aW9uIGZvciBCVDIxMDBMSU5QUSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEJUMjEwMExJTlBRID0gbmV3IFRjcygnQlQyMTAwTElOUFEnKTtcbiAgLyoqIE9wdGlvbiBmb3IgQlQyMTAwTElOSExHICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgQlQyMTAwTElOSExHID0gbmV3IFRjcygnQlQyMTAwTElOSExHJyk7XG4gIC8qKiBPcHRpb24gZm9yIFNUMjA2NS0xICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1QyMDY1XzEgPSBuZXcgVGNzKCdTVDIwNjUtMScpO1xuICAvKiogT3B0aW9uIGZvciBTVDQyOC0xICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1Q0MjhfMSA9IG5ldyBUY3MoJ1NUNDI4LTEnKTtcbiAgLyoqIE9wdGlvbiBmb3IgRGVuc2l0eSAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IERFTlNJVFkgPSBuZXcgVGNzKCdERU5TSVRZJyk7XG5cbiAgLyoqIFVzZSBhIGN1c3RvbSBUQ1MgdmFsdWUgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogVGNzIHsgcmV0dXJuIG5ldyBUY3ModmFsdWUpOyB9XG4gIC8qKiBAcGFyYW0gdmFsdWUgVGhlIFRDUyBzdHJpbmcgdmFsdWUgKi9cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcihwdWJsaWMgcmVhZG9ubHkgdmFsdWU6IHN0cmluZykge31cbiAgLyoqIFJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSAqL1xuICBwdWJsaWMgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudmFsdWU7IH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBGTVRQIFZpZGVvXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm10cFZpZGVvIHtcbiAgLyoqXG4gICAqIFRoZSBmb3JtYXQgdXNlZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvbG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGNvbG9yaW1ldHJ5IHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgY29sb3JpbWV0cnk/OiBDb2xvcmltZXRyeTtcbiAgLyoqXG4gICAqIFRoZSBmcmFtZSByYXRlIGZvciB0aGUgdmlkZW8gc3RyZWFtLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGZyYW1lIHJhdGUgc3BlY2lmaWVkXG4gICAqL1xuICByZWFkb25seSBleGFjdEZyYW1lcmF0ZT86IEZyYW1lcmF0ZTtcbiAgLyoqXG4gICAqIFRoZSBwaXhlbCBhc3BlY3QgcmF0aW8gKFBBUikgb2YgdGhlIHZpZGVvIOKAlCB0aGUgc2hhcGUgb2YgYSBzaW5nbGUgcGl4ZWwsIG5vdCB0aGVcbiAgICogZGlzcGxheSBhc3BlY3QgcmF0aW8uIFVzZSBgUGl4ZWxBc3BlY3RSYXRpby5TUVVBUkVgIGZvciBtb3N0IG1vZGVybiBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHBpeGVsIGFzcGVjdCByYXRpbyBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcj86IFBpeGVsQXNwZWN0UmF0aW87XG4gIC8qKlxuICAgKiBUaGUgZW5jb2RpbmcgcmFuZ2Ugb2YgdGhlIHZpZGVvLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHZpZGVvIHJhbmdlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9SYW5nZT86IFZpZGVvUmFuZ2U7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBjb21wcmVzc2lvbiB0aGF0IHdhcyB1c2VkIHRvIHNtb290aCB0aGUgdmlkZW8ncyBhcHBlYXJhbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIHNjYW4gbW9kZSBzcGVjaWZpZWRcbiAgICovXG4gIHJlYWRvbmx5IHNjYW5Nb2RlPzogU2Nhbk1vZGU7XG4gIC8qKlxuICAgKiBUaGUgdHJhbnNmZXIgY2hhcmFjdGVyaXN0aWMgc3lzdGVtIChUQ1MpIHRoYXQgaXMgdXNlZCBpbiB0aGUgdmlkZW8uXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gVENTIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgdGNzPzogVGNzO1xufVxuXG4vKipcbiAqIEF1ZGlvIFN0cmVhbSBPcmRlciBPcHRpb25zXG4gKi9cbmV4cG9ydCBjbGFzcyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucyB7XG4gIC8qKiBNb25vICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTU9OTyA9IG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucygnU01QVEUyMTEwLihNKScpO1xuICAvKiogRHVhbCBNb25vICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgRFVBTF9NT05PID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKERNKScpO1xuICAvKiogU3RhbmRhcmQgU3RlcmVvICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1RBTkRBUkRfU1RFUkVPID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKFNUKScpO1xuICAvKiogTGVmdCBSaWdodCBNYXRyaXggU3RlcmVvICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTFRSVF9NQVRSSVhfU1RFUkVPID0gbmV3IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zKCdTTVBURTIxMTAuKEx0UnQpJyk7XG4gIC8qKiA1LjEgU3Vycm91bmQgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVVJST1VORF81XzEgPSBuZXcgQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMoJ1NNUFRFMjExMC4oNTEpJyk7XG4gIC8qKiA3LjEgU3Vycm91bmQgKi9cbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBTVVJST1VORF83XzEgPSBuZXcgQXVkaW9TdHJlYW1PcmRlck9wdGlvbnMoJ1NNUFRFMjExMC4oNzEpJyk7XG4gIC8qKiAyMi4yIFN1cnJvdW5kICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU1VSUk9VTkRfMjJfMiA9IG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucygnU01QVEUyMTEwLigyMjIpJyk7XG4gIC8qKiBPbmUgU0RJIEF1ZGlvIEdyb3VwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgT05FX1NESV9BVURJT19HUk9VUCA9IG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucygnU01QVEUyMTEwLihTR1JQKScpO1xuXG4gIC8qKiBVc2UgYSBjdXN0b20gYXVkaW8gc3RyZWFtIG9yZGVyIHZhbHVlICovXG4gIHB1YmxpYyBzdGF0aWMgb2YodmFsdWU6IHN0cmluZyk6IEF1ZGlvU3RyZWFtT3JkZXJPcHRpb25zIHsgcmV0dXJuIG5ldyBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucyh2YWx1ZSk7IH1cbiAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgYXVkaW8gc3RyZWFtIG9yZGVyIHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIE1lZGlhIFN0cmVhbSBUeXBlXG4gKlxuICogQGludGVybmFsXG4gKi9cbmVudW0gTWVkaWFTdHJlYW1UeXBlIHtcbiAgLyoqXG4gICAqIE9wdGlvbiBmb3IgVmlkZW9cbiAgICovXG4gIFZJREVPPSd2aWRlbycsXG4gIC8qKlxuICAgKiBPcHRpb24gZm9yIEF1ZGlvXG4gICAqL1xuICBBVURJTz0nYXVkaW8nLFxuICAvKipcbiAgICogT3B0aW9uIGZvciBhbmNpbGxhcnkgZGF0YVxuICAgKi9cbiAgQU5DSUxMQVJZX0RBVEE9J2FuY2lsbGFyeS1kYXRhJyxcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBNZWRpYSBWaWRlbyBmb3JtYXRcbiAqL1xuZXhwb3J0IGNsYXNzIE1lZGlhVmlkZW9Gb3JtYXQge1xuICAvKiogT3B0aW9uIGZvciAyMTYwcCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFVIRF8yMTYwUCA9IG5ldyBNZWRpYVZpZGVvRm9ybWF0KCcyMTYwcCcpO1xuICAvKiogT3B0aW9uIGZvciAxMDgwcCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhEXzEwODBQID0gbmV3IE1lZGlhVmlkZW9Gb3JtYXQoJzEwODBwJyk7XG4gIC8qKiBPcHRpb24gZm9yIDEwODBpICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgSERfMTA4MEkgPSBuZXcgTWVkaWFWaWRlb0Zvcm1hdCgnMTA4MGknKTtcbiAgLyoqIE9wdGlvbiBmb3IgNzIwcCAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEhEXzcyMFAgPSBuZXcgTWVkaWFWaWRlb0Zvcm1hdCgnNzIwcCcpO1xuICAvKiogT3B0aW9uIGZvciA0ODBwICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgU0RfNDgwUCA9IG5ldyBNZWRpYVZpZGVvRm9ybWF0KCc0ODBwJyk7XG5cbiAgLyoqIFVzZSBhIGN1c3RvbSB2aWRlbyBmb3JtYXQgdmFsdWUgKi9cbiAgcHVibGljIHN0YXRpYyBvZih2YWx1ZTogc3RyaW5nKTogTWVkaWFWaWRlb0Zvcm1hdCB7IHJldHVybiBuZXcgTWVkaWFWaWRlb0Zvcm1hdCh2YWx1ZSk7IH1cbiAgLyoqIEBwYXJhbSB2YWx1ZSBUaGUgdmlkZW8gZm9ybWF0IHN0cmluZyB2YWx1ZSAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSB2YWx1ZTogc3RyaW5nKSB7fVxuICAvKiogUmV0dXJucyB0aGUgc3RyaW5nIHZhbHVlICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy52YWx1ZTsgfVxufVxuXG4vKipcbiAqIEJhc2UgY29uZmlndXJhdGlvbiBmb3IgTWVkaWEgU3RyZWFtLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lZGlhU3RyZWFtQmFzZSB7XG4gIC8qKlxuICAgKiBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbWVkaWEgc3RyZWFtLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVkaWFTdHJlYW1JZDogbnVtYmVyO1xuICAvKipcbiAgICogQSBuYW1lIHRoYXQgaGVscHMgeW91IGRpc3Rpbmd1aXNoIG9uZSBtZWRpYSBzdHJlYW0gZnJvbSBhbm90aGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVkaWFTdHJlYW1OYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGhlbHAgeW91IHF1aWNrbHkgaWRlbnRpZnkgd2hhdCB5b3VyIG1lZGlhIHN0cmVhbSBpcyB1c2VkIGZvci5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBtZWRpYSBzdHJlYW0gcmVwcmVzZW50cyBvbmUgY29tcG9uZW50IG9mIHlvdXIgY29udGVudCwgc3VjaCBhcyB2aWRlbywgYXVkaW8sIG9yIGFuY2lsbGFyeSBkYXRhLlxuICogQWZ0ZXIgeW91IGFkZCBhIG1lZGlhIHN0cmVhbSB0byB5b3VyIGZsb3csIHlvdSBjYW4gYXNzb2NpYXRlIGl0IHdpdGggc291cmNlcyBhbmQgb3V0cHV0cyB0aGF0IHVzZVxuICogdGhlIFNUIDIxMTAgSlBFRyBYUyBvciBDREkgcHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFTdHJlYW1WaWRlbyBleHRlbmRzIE1lZGlhU3RyZWFtQmFzZSB7XG4gIC8qKlxuICAgKiBBdHRyaWJ1dGVzIHRoYXQgYXJlIHJlbGF0ZWQgdG8gdGhlIG1lZGlhIHN0cmVhbS5cbiAgICovXG4gIHJlYWRvbmx5IGZtdHA6IEZtdHBWaWRlbztcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGUgcmF0ZSBmb3IgdGhlIHN0cmVhbS4gVGhpcyB2YWx1ZSBpcyBtZWFzdXJlZCBpbiBIei5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGNsb2NrIHJhdGUgZm9yIHRoZSBtZWRpYSBzdHJlYW0gdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvY2tSYXRlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGZvcm1hdCB0eXBlIG51bWJlciAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFJUUCBwYXlsb2FkIHR5cGUpIG9mIHRoZSBtZWRpYSBzdHJlYW0uXG4gICAqIE1lZGlhQ29ubmVjdCBhc3NpZ25zIHRoaXMgdmFsdWUgdG8gdGhlIG1lZGlhIHN0cmVhbS4gRm9yIFNUIDIxMTAgSlBFRyBYUyBvdXRwdXRzLCB5b3UgbmVlZCB0byBwcm92aWRlIHRoaXMgdmFsdWUgdG8gdGhlIHJlY2VpdmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFzc2lnbmVkIGJ5IE1lZGlhQ29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZm10PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHJlc29sdXRpb24gb2YgdGhlIHZpZGVvLlxuICAgKi9cbiAgcmVhZG9ubHkgdmlkZW9Gb3JtYXQ6IE1lZGlhVmlkZW9Gb3JtYXQ7XG59XG5cbi8qKlxuICogQSBtZWRpYSBzdHJlYW0gcmVwcmVzZW50cyBvbmUgY29tcG9uZW50IG9mIHlvdXIgY29udGVudCwgc3VjaCBhcyB2aWRlbywgYXVkaW8sIG9yIGFuY2lsbGFyeSBkYXRhLlxuICogQWZ0ZXIgeW91IGFkZCBhIG1lZGlhIHN0cmVhbSB0byB5b3VyIGZsb3csIHlvdSBjYW4gYXNzb2NpYXRlIGl0IHdpdGggc291cmNlcyBhbmQgb3V0cHV0cyB0aGF0IHVzZVxuICogdGhlIFNUIDIxMTAgSlBFRyBYUyBvciBDREkgcHJvdG9jb2wuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWVkaWFTdHJlYW1BdWRpbyBleHRlbmRzIE1lZGlhU3RyZWFtQmFzZSB7XG4gIC8qKlxuICAgKiBUaGUgZm9ybWF0IG9mIHRoZSBhdWRpbyBjaGFubmVsLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBNZWRpYUNvbm5lY3Qgc2VydmljZSBkZWZhdWx0XG4gICAqL1xuICByZWFkb25seSBjaGFubmVsT3JkZXI/OiBBdWRpb1N0cmVhbU9yZGVyT3B0aW9ucztcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGUgcmF0ZSBmb3IgdGhlIHN0cmVhbS4gVGhpcyB2YWx1ZSBpcyBtZWFzdXJlZCBpbiBIei5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZWZhdWx0IGNsb2NrIHJhdGUgZm9yIHRoZSBtZWRpYSBzdHJlYW0gdHlwZVxuICAgKi9cbiAgcmVhZG9ubHkgY2xvY2tSYXRlPzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGZvcm1hdCB0eXBlIG51bWJlciAoc29tZXRpbWVzIHJlZmVycmVkIHRvIGFzIFJUUCBwYXlsb2FkIHR5cGUpIG9mIHRoZSBtZWRpYSBzdHJlYW0uXG4gICAqIE1lZGlhQ29ubmVjdCBhc3NpZ25zIHRoaXMgdmFsdWUgdG8gdGhlIG1lZGlhIHN0cmVhbS4gRm9yIFNUIDIxMTAgSlBFRyBYUyBvdXRwdXRzLCB5b3UgbmVlZCB0byBwcm92aWRlIHRoaXMgdmFsdWUgdG8gdGhlIHJlY2VpdmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFzc2lnbmVkIGJ5IE1lZGlhQ29ubmVjdFxuICAgKi9cbiAgcmVhZG9ubHkgZm10PzogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIGF1ZGlvIGxhbmd1YWdlLCBpbiBhIGZvcm1hdCB0aGF0IGlzIHJlY29nbml6ZWQgYnkgdGhlIHJlY2VpdmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGxhbmd1YWdlIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgbGFuZz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIG1lZGlhIHN0cmVhbSByZXByZXNlbnRzIG9uZSBjb21wb25lbnQgb2YgeW91ciBjb250ZW50LCBzdWNoIGFzIHZpZGVvLCBhdWRpbywgb3IgYW5jaWxsYXJ5IGRhdGEuXG4gKiBBZnRlciB5b3UgYWRkIGEgbWVkaWEgc3RyZWFtIHRvIHlvdXIgZmxvdywgeW91IGNhbiBhc3NvY2lhdGUgaXQgd2l0aCBzb3VyY2VzIGFuZCBvdXRwdXRzIHRoYXQgdXNlXG4gKiB0aGUgU1QgMjExMCBKUEVHIFhTIG9yIENESSBwcm90b2NvbC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZWRpYVN0cmVhbUFuY2lsbGFyeURhdGEgZXh0ZW5kcyBNZWRpYVN0cmVhbUJhc2UgeyB9XG5cbi8qKlxuICogUHJvcGVydGllcyBmb3IgdGhlIEZsb3dcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93UHJvcHMge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIGZsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXV0b2dlbmVyYXRlZFxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd05hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSB0aGF0IHlvdSB3YW50IHRvIGNyZWF0ZSB0aGUgZmxvdyBpbi4gVGhlc2Ugb3B0aW9ucyBhcmUgbGltaXRlZCB0byB0aGUgQXZhaWxhYmlsaXR5IFpvbmVzIHdpdGhpbiB0aGUgY3VycmVudCBBV1MgUmVnaW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNob3NlbiBieSBNZWRpYUNvbm5lY3RcbiAgICovXG4gIHJlYWRvbmx5IGF2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIHByb2Nlc3NpbmcgY2FwYWNpdHkgYW5kIGZlYXR1cmUgc2V0IG9mIHRoZSBmbG93LiBTZXQgdGhpcyBvcHRpb25hbCBwYXJhbWV0ZXIgdG8gTEFSR0UgaWYgeW91IHdhbnQgdG8gZW5hYmxlIE5ESSBvdXRwdXRzIG9uIHRoZSBmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHVuZGVmaW5lZDsgd2hlbiBvbWl0dGVkLCBNZWRpYUNvbm5lY3QgYXBwbGllcyBGbG93U2l6ZS5NRURJVU0gYXQgZGVwbG95IHRpbWVcbiAgICovXG4gIHJlYWRvbmx5IGZsb3dTaXplPzogRmxvd1NpemU7XG5cbiAgLyoqXG4gICAqIFRoZSBtYWludGVuYW5jZSB3aW5kb3cgZm9yIHRoZSBmbG93LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGNob3NlbiBieSBNZWRpYUNvbm5lY3RcbiAgICovXG4gIHJlYWRvbmx5IG1haW50ZW5hbmNlQ29uZmlndXJhdGlvbj86IE1haW50ZW5hbmNlV2luZG93O1xuXG4gIC8qKlxuICAgKiBUaGUgbWVkaWEgc3RyZWFtcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZsb3cuIEFmdGVyIHlvdSBhc3NvY2lhdGUgYSBtZWRpYSBzdHJlYW0gd2l0aCBhIHNvdXJjZSwgeW91IGNhbiBhbHNvIGFzc29jaWF0ZSBpdCB3aXRoIG91dHB1dHMgb24gdGhlIGZsb3cuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIE1lZGlhIFN0cmVhbXNcbiAgICovXG4gIHJlYWRvbmx5IG1lZGlhU3RyZWFtcz86IE1lZGlhU3RyZWFtW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBmb3IgYSBmbG93J3MgTkRJIHNvdXJjZSBvciBvdXRwdXQuIFJlcXVpcmVkIHdoZW4gdGhlIGZsb3cgaW5jbHVkZXMgYW4gTkRJIHNvdXJjZSBvciBvdXRwdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IE5vIE5ESSBDb25maWd1cmF0aW9uIGFwcGxpZWRcbiAgICovXG4gIHJlYWRvbmx5IG5kaUNvbmZpZz86IE5kaUNvbmZpZztcblxuICAvKipcbiAgICogRW5jb2RpbmcgY29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBOREkgc291cmNlIHdoZW4gdHJhbnNjb2RpbmcgaXQgdG8gYSB0cmFuc3BvcnRcbiAgICogc3RyZWFtIGZvciBkb3duc3RyZWFtIGRpc3RyaWJ1dGlvbi5cbiAgICpcbiAgICogUmVxdWlyZWQgd2hlbiB0aGUgZmxvdyBzb3VyY2UgdXNlcyB0aGUgTkRJIFNwZWVkSFEgcHJvdG9jb2xcbiAgICogKHNlZSB7QGxpbmsgU291cmNlQ29uZmlndXJhdGlvbi5uZGl9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBlbmNvZGluZyBjb25maWc7IHJlcXVpcmVkIGZvciBOREkgc291cmNlc1xuICAgKi9cbiAgcmVhZG9ubHkgZW5jb2RpbmdDb25maWc/OiBFbmNvZGluZ0NvbmZpZztcblxuICAvKipcbiAgICogVGhlIHNldHRpbmdzIGZvciB0aGUgc291cmNlIHRoYXQgeW91IHdhbnQgdG8gdXNlIGZvciB0aGUgbmV3IGZsb3cuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2U6IFNvdXJjZUNvbmZpZ3VyYXRpb247XG5cbiAgLyoqXG4gICAqIFRoZSBzZXR0aW5ncyBmb3Igc291cmNlIGZhaWxvdmVyLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBzb3VyY2UgZmFpbG92ZXIgY29uZmlndXJhdGlvbiBhcHBsaWVkXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VGYWlsb3ZlckNvbmZpZz86IEZhaWxvdmVyQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGluZ3MgZm9yIHNvdXJjZSBtb25pdG9yaW5nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBObyBzb3VyY2UgbW9uaXRvcmluZyBjb25maWd1cmF0aW9uIGFwcGxpZWRcbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZU1vbml0b3JpbmdDb25maWc/OiBTb3VyY2VNb25pdG9yaW5nQ29uZmlnO1xuXG4gIC8qKlxuICAgKiBUaGUgVlBDIEludGVyZmFjZXMgZm9yIHRoaXMgZmxvdy5cbiAgICogQGRlZmF1bHQgTm8gVlBDIEludGVyZmFjZSBjb25maWd1cmF0aW9uIGFwcGxpZWRcbiAgICovXG4gIHJlYWRvbmx5IHZwY0ludGVyZmFjZXM/OiBWcGNJbnRlcmZhY2VDb25maWdbXTtcblxufVxuXG4vKipcbiAqIFNpbXBsaWZpZWQgY29uZmlndXJhdGlvbiBmb3IgTWVkaWEgU3RyZWFtc1xuICovXG5leHBvcnQgY2xhc3MgTWVkaWFTdHJlYW0ge1xuICAvKipcbiAgICogQ29uZmlndXJhdGlvbiBmb3IgTWVkaWFTdHJlYW0gVmlkZW9cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmlkZW8oY29uZmlnOiBNZWRpYVN0cmVhbVZpZGVvKTogTWVkaWFTdHJlYW0ge1xuICAgIHJldHVybiBuZXcgTWVkaWFTdHJlYW0oe1xuICAgICAgbWVkaWFTdHJlYW1JZDogY29uZmlnLm1lZGlhU3RyZWFtSWQsXG4gICAgICBtZWRpYVN0cmVhbU5hbWU6IGNvbmZpZy5tZWRpYVN0cmVhbU5hbWUsXG4gICAgICB2aWRlb0Zvcm1hdDogY29uZmlnLnZpZGVvRm9ybWF0LnZhbHVlLFxuICAgICAgY2xvY2tSYXRlOiBjb25maWcuY2xvY2tSYXRlLFxuICAgICAgZm10OiBjb25maWcuZm10LFxuICAgICAgZGVzY3JpcHRpb246IGNvbmZpZy5kZXNjcmlwdGlvbixcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZm10cDoge1xuICAgICAgICAgIGV4YWN0RnJhbWVyYXRlOiBjb25maWcuZm10cC5leGFjdEZyYW1lcmF0ZT8udG9TdHJpbmcoKSxcbiAgICAgICAgICBwYXI6IGNvbmZpZy5mbXRwLnBhcj8udG9TdHJpbmcoKSxcbiAgICAgICAgICBjb2xvcmltZXRyeTogY29uZmlnLmZtdHAuY29sb3JpbWV0cnk/LnZhbHVlLFxuICAgICAgICAgIHJhbmdlOiBjb25maWcuZm10cC52aWRlb1JhbmdlPy52YWx1ZSxcbiAgICAgICAgICBzY2FuTW9kZTogY29uZmlnLmZtdHAuc2Nhbk1vZGU/LnZhbHVlLFxuICAgICAgICAgIHRjczogY29uZmlnLmZtdHAudGNzPy52YWx1ZSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtZWRpYVN0cmVhbVR5cGU6IE1lZGlhU3RyZWFtVHlwZS5WSURFTyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBNZWRpYVN0cmVhbSBhdWRpb1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhdWRpbyhjb25maWc6IE1lZGlhU3RyZWFtQXVkaW8pOiBNZWRpYVN0cmVhbSB7XG4gICAgcmV0dXJuIG5ldyBNZWRpYVN0cmVhbSh7XG4gICAgICBtZWRpYVN0cmVhbUlkOiBjb25maWcubWVkaWFTdHJlYW1JZCxcbiAgICAgIG1lZGlhU3RyZWFtTmFtZTogY29uZmlnLm1lZGlhU3RyZWFtTmFtZSxcbiAgICAgIGNsb2NrUmF0ZTogY29uZmlnLmNsb2NrUmF0ZSxcbiAgICAgIGZtdDogY29uZmlnLmZtdCxcbiAgICAgIGRlc2NyaXB0aW9uOiBjb25maWcuZGVzY3JpcHRpb24sXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZtdHA6IHtcbiAgICAgICAgICBjaGFubmVsT3JkZXI6IGNvbmZpZy5jaGFubmVsT3JkZXI/LnZhbHVlLFxuICAgICAgICB9LFxuICAgICAgICBsYW5nOiBjb25maWcubGFuZyxcbiAgICAgIH0sXG4gICAgICBtZWRpYVN0cmVhbVR5cGU6IE1lZGlhU3RyZWFtVHlwZS5BVURJTyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmF0aW9uIGZvciBNZWRpYVN0cmVhbSBhbmNpbGxhcnkgZGF0YVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhbmNpbGxhcnlEYXRhKGNvbmZpZzogTWVkaWFTdHJlYW1BbmNpbGxhcnlEYXRhKTogTWVkaWFTdHJlYW0ge1xuICAgIHJldHVybiBuZXcgTWVkaWFTdHJlYW0oe1xuICAgICAgbWVkaWFTdHJlYW1JZDogY29uZmlnLm1lZGlhU3RyZWFtSWQsXG4gICAgICBtZWRpYVN0cmVhbU5hbWU6IGNvbmZpZy5tZWRpYVN0cmVhbU5hbWUsXG4gICAgICBkZXNjcmlwdGlvbjogY29uZmlnLmRlc2NyaXB0aW9uLFxuICAgICAgbWVkaWFTdHJlYW1UeXBlOiBNZWRpYVN0cmVhbVR5cGUuQU5DSUxMQVJZX0RBVEEsXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgX2NvbmZpZzogQ2ZuRmxvdy5NZWRpYVN0cmVhbVByb3BlcnR5KSB7fVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHB1YmxpYyBfYmluZCgpOiBDZm5GbG93Lk1lZGlhU3RyZWFtUHJvcGVydHkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWc7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRyaWJ1dGVzIGZvciBpbXBvcnRpbmcgYW4gZXhpc3RpbmcgRmxvdy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGbG93QXR0cmlidXRlcyB7XG4gIC8qKlxuICAgKiBUaGUgQVJOIG9mIHRoZSBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd0Fybjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciBmYWlsb3ZlciBjb25maWd1cmVkXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFSTiBvZiB0aGUgc291cmNlIGRlZmluZWQgb24gdGhlIGZsb3cuXG4gICAqXG4gICAqIE5vdCBlbmNvZGVkIGluIHRoZSBmbG93IEFSTiwgc28gbXVzdCBiZSBwcm92aWRlZCBleHBsaWNpdGx5IHdoZW4geW91IG5lZWRcbiAgICogYWNjZXNzIHRvIGBzb3VyY2VBcm5gIG9uIHRoZSBpbXBvcnRlZCBjb25zdHJ1Y3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc291cmNlQXJuIGlzIG5vdCBhdmFpbGFibGUgb24gdGhlIGltcG9ydGVkIGNvbnN0cnVjdFxuICAgKi9cbiAgcmVhZG9ubHkgc291cmNlQXJuPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgSVAgYWRkcmVzcyB0aGF0IHRoZSBmbG93IHVzZXMgdG8gc2VuZCBvdXRib3VuZCBjb250ZW50LlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGFjY2Vzc2luZyBgZWdyZXNzSXBgIG9uIHRoZSBpbXBvcnRlZCBmbG93IHRocm93czsgb25seSBwcm92aWRlIHdoZW4gYXZhaWxhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZWdyZXNzSXA/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBJUCBhZGRyZXNzIHRoYXQgdGhlIGZsb3cgbGlzdGVucyBvbiBmb3IgaW5jb21pbmcgY29udGVudC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhY2Nlc3NpbmcgYHNvdXJjZUluZ2VzdElwYCBvbiB0aGUgaW1wb3J0ZWQgZmxvdyB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdElwPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcG9ydCB0aGF0IHRoZSBmbG93IGxpc3RlbnMgb24gZm9yIGluY29taW5nIGNvbnRlbnQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYWNjZXNzaW5nIGBzb3VyY2VJbmdlc3RQb3J0YCBvbiB0aGUgaW1wb3J0ZWQgZmxvdyB0aHJvd3M7IG9ubHkgcHJvdmlkZSB3aGVuIGF2YWlsYWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUluZ2VzdFBvcnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBBdmFpbGFiaWxpdHkgWm9uZSB0aGF0IHRoZSBmbG93IHdhcyBjcmVhdGVkIGluLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGBmbG93QXZhaWxhYmlsaXR5Wm9uZWAgaXMgdW5kZWZpbmVkIG9uIHRoZSBpbXBvcnRlZCBmbG93LlxuICAgKi9cbiAgcmVhZG9ubHkgZmxvd0F2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG59XG5cbmFic3RyYWN0IGNsYXNzIEZsb3dCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJRmxvdyB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgRmxvdyBjb25zdHJ1Y3QgdGhhdCByZXByZXNlbnRzIGFuIGV4dGVybmFsIChpbXBvcnRlZCkgRmxvdy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZsb3dBdHRyaWJ1dGVzKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGF0dHJzOiBGbG93QXR0cmlidXRlcyk6IElGbG93IHtcbiAgICBjbGFzcyBJbXBvcnQgZXh0ZW5kcyBGbG93QmFzZSBpbXBsZW1lbnRzIElGbG93IHtcbiAgICAgIHB1YmxpYyByZWFkb25seSBmbG93QXJuID0gYXR0cnMuZmxvd0FybjtcbiAgICAgIHB1YmxpYyByZWFkb25seSBmbG93QXZhaWxhYmlsaXR5Wm9uZSA9IGF0dHJzLmZsb3dBdmFpbGFiaWxpdHlab25lO1xuXG4gICAgICAvLyBJbXBvcnRlZCBmbG93cyBkZWZhdWx0IHRvIGBmYWxzZWAuIFBhc3MgYGlzRmFpbG92ZXJFbmFibGVkOiB0cnVlYCBpbiB0aGVcbiAgICAgIC8vIGF0dHJpYnV0ZXMgd2hlbiB0aGUgcmVhbCBzZXJ2aWNlLXNpZGUgZmxvdyBoYXMgZmFpbG92ZXIgZW5hYmxlZCBhbmQgeW91XG4gICAgICAvLyBuZWVkIHRvIGFkZCBhIEZsb3dTb3VyY2UuXG4gICAgICBwdWJsaWMgaXNGYWlsb3ZlckVuYWJsZWQ/OiBib29sZWFuID0gYXR0cnMuaXNGYWlsb3ZlckVuYWJsZWQgPz8gZmFsc2U7XG5cbiAgICAgIHB1YmxpYyBnZXQgc291cmNlQXJuKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhdHRycy5zb3VyY2VBcm4pIHJldHVybiBhdHRycy5zb3VyY2VBcm47XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNvdXJjZUFybk5vdFByb3ZpZGVkYCxcbiAgICAgICAgICBgJ3NvdXJjZUFybicgd2FzIG5vdCBwcm92aWRlZCB3aGVuIGltcG9ydGluZyBGbG93ICR7dGhpcy5ub2RlLnBhdGh9OyBwcm92aWRlICdzb3VyY2VBcm4nIGluIGZyb21GbG93QXR0cmlidXRlcygpYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBwdWJsaWMgZ2V0IGVncmVzc0lwKCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhdHRycy5lZ3Jlc3NJcCkgcmV0dXJuIGF0dHJzLmVncmVzc0lwO1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGxpdGBFZ3Jlc3NJcE5vdFByb3ZpZGVkYCxcbiAgICAgICAgICBgJ2VncmVzc0lwJyB3YXMgbm90IHByb3ZpZGVkIHdoZW4gaW1wb3J0aW5nIEZsb3cgJHt0aGlzLm5vZGUucGF0aH07IHByb3ZpZGUgaXQgaW4gZnJvbUZsb3dBdHRyaWJ1dGVzKClgLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHB1YmxpYyBnZXQgc291cmNlSW5nZXN0SXAoKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGF0dHJzLnNvdXJjZUluZ2VzdElwKSByZXR1cm4gYXR0cnMuc291cmNlSW5nZXN0SXA7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFNvdXJjZUluZ2VzdElwTm90UHJvdmlkZWRgLFxuICAgICAgICAgIGAnc291cmNlSW5nZXN0SXAnIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBpbXBvcnRpbmcgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgcHJvdmlkZSBpdCBpbiBmcm9tRmxvd0F0dHJpYnV0ZXMoKWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBzb3VyY2VJbmdlc3RQb3J0KCk6IHN0cmluZyB7XG4gICAgICAgIGlmIChhdHRycy5zb3VyY2VJbmdlc3RQb3J0KSByZXR1cm4gYXR0cnMuc291cmNlSW5nZXN0UG9ydDtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgU291cmNlSW5nZXN0UG9ydE5vdFByb3ZpZGVkYCxcbiAgICAgICAgICBgJ3NvdXJjZUluZ2VzdFBvcnQnIHdhcyBub3QgcHJvdmlkZWQgd2hlbiBpbXBvcnRpbmcgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgcHJvdmlkZSBpdCBpbiBmcm9tRmxvd0F0dHJpYnV0ZXMoKWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgcHVibGljIGdldCBzb3VyY2VJbmdlc3RVcmwoKTogc3RyaW5nIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgU291cmNlSW5nZXN0VXJsTm90QXZhaWxhYmxlSW1wb3J0ZWRgLFxuICAgICAgICAgIGAnc291cmNlSW5nZXN0VXJsJyBpcyBub3QgYXZhaWxhYmxlIG9uIGltcG9ydGVkIEZsb3cgJHt0aGlzLm5vZGUucGF0aH07IG9ubHkgRmxvd3MgY29uc3RydWN0ZWQgaW4gdGhpcyBhcHAgZm9yIGxpc3RlbmVyLXN0eWxlIHNvdXJjZSBwcm90b2NvbHMgKFJUUCwgUlRQLUZFQywgUklTVCwgU1JUIGxpc3RlbmVyLCBaaXhpIHB1c2gpIGV4cG9zZSBhIHNvdXJjZSBpbmdlc3QgVVJMYCxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICAvKipcbiAgICogSW1wb3J0IGFuIGV4aXN0aW5nIEZsb3cgZnJvbSBpdHMgQVJOLlxuICAgKlxuICAgKiBVc2UgYGZyb21GbG93QXR0cmlidXRlcygpYCBpbnN0ZWFkIGlmIHlvdSBuZWVkIGFjY2VzcyB0byBgc291cmNlQXJuYCBvciBhbnkgb3RoZXJcbiAgICogYXR0cmlidXRlIG5vdCBlbmNvZGVkIGluIHRoZSBmbG93IEFSTi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbUZsb3dBcm4oc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgZmxvd0Fybjogc3RyaW5nKTogSUZsb3cge1xuICAgIHJldHVybiBGbG93LmZyb21GbG93QXR0cmlidXRlcyhzY29wZSwgaWQsIHsgZmxvd0FybiB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGZsb3dBcm46IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGVncmVzc0lwOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBzb3VyY2VJbmdlc3RJcDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc291cmNlSW5nZXN0UG9ydDogc3RyaW5nO1xuICBwdWJsaWMgYWJzdHJhY3QgcmVhZG9ubHkgc291cmNlSW5nZXN0VXJsOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBmbG93QXZhaWxhYmlsaXR5Wm9uZT86IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IGlzRmFpbG92ZXJFbmFibGVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIE5ESSBzdGF0ZSBmb3IgdGhpcyBmbG93LiBgdW5kZWZpbmVkYCBmb3IgaW1wb3J0ZWQgZmxvd3MgKHN0YXRlIGlzIHVua25vd24pLlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHByb3RlY3RlZCBfbmRpU3RhdGU/OiBTdGF0ZTtcblxuICAvKipcbiAgICogVGhlIHNvdXJjZSBwcm90b2NvbCB2YWx1ZSBmb3IgdGhpcyBmbG93LiBgdW5kZWZpbmVkYCBmb3IgaW1wb3J0ZWQgZmxvd3MuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9zb3VyY2VQcm90b2NvbD86IHN0cmluZztcblxuICAvKipcbiAgICogVHJhY2tzIHRoZSBudW1iZXIgb2YgTkRJIG91dHB1dHMgYWRkZWQgdG8gdGhpcyBmbG93LiBVc2VkIHRvIGVuZm9yY2UgdGhlXG4gICAqIGRvY3VtZW50ZWQgXCJtYXggMSBOREkgb3V0cHV0IHBlciBmbG93XCIgbGltaXQuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgcHJvdGVjdGVkIF9uZGlPdXRwdXRDb3VudCA9IDA7XG5cbiAgLyoqXG4gICAqIENvbGxlY3Rpb24gb2YgZ3JhbnQgbWV0aG9kcyBmb3IgdGhpcyBmbG93LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGdyYW50cyA9IEZsb3dHcmFudHMuZnJvbUZsb3codGhpcyk7XG5cbiAgLyoqXG4gICAqIEEgcmVmZXJlbmNlIHRvIHRoaXMgRmxvdyByZXNvdXJjZS5cbiAgICogUmVxdWlyZWQgYnkgdGhlIGF1dG8tZ2VuZXJhdGVkIElGbG93UmVmIGludGVyZmFjZS5cbiAgICovXG4gIHB1YmxpYyBnZXQgZmxvd1JlZigpOiBGbG93UmVmZXJlbmNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgZmxvd0FybjogdGhpcy5mbG93QXJuLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG91dHB1dCB0byB0aGlzIGZsb3dcbiAgICovXG4gIHB1YmxpYyBhZGRPdXRwdXQoaWQ6IHN0cmluZywgb3B0aW9uczogQWRkRmxvd091dHB1dE9wdGlvbnMpOiBJRmxvd091dHB1dCB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBvcHRpb25zLm91dHB1dC5fYmluZCgpLnByb3RvY29sO1xuXG4gICAgaWYgKHByb3RvY29sID09PSAnbmRpLXNwZWVkLWhxJykge1xuICAgICAgaWYgKHRoaXMuX25kaVN0YXRlICE9PSB1bmRlZmluZWQgJiYgdGhpcy5fbmRpU3RhdGUgIT09IFN0YXRlLkVOQUJMRUQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgTmRpT3V0cHV0UmVxdWlyZXNOZGlDb25maWdgLFxuICAgICAgICAgICdOREkgb3V0cHV0cyByZXF1aXJlIG5kaUNvbmZpZyB3aXRoIG5kaVN0YXRlIHNldCB0byBTdGF0ZS5FTkFCTEVEIG9uIHRoZSBmbG93JyxcbiAgICAgICAgICB0aGlzLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICAvLyBOREkgcGFzc3Rocm91Z2ggaXMgbm90IHN1cHBvcnRlZCDigJQgYSBmbG93IGNhbm5vdCBoYXZlIGJvdGggYW4gTkRJIHNvdXJjZVxuICAgICAgLy8gYW5kIGFuIE5ESSBvdXRwdXQuIFRoZSBzZXJ2aWNlIHJlamVjdHMgdGhpcyBhdCBkZXBsb3k7IGZhaWwgZmFzdCBoZXJlLlxuICAgICAgaWYgKHRoaXMuX3NvdXJjZVByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5ORElfU1BFRURfSFEudmFsdWUpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgTmRpUGFzc3Rocm91Z2hOb3RTdXBwb3J0ZWRgLFxuICAgICAgICAgICdOREkgcGFzc3Rocm91Z2ggaXMgbm90IHN1cHBvcnRlZC4gQSBmbG93IGNhbm5vdCBoYXZlIGJvdGggYW4gTkRJIHNvdXJjZSBhbmQgYW4gTkRJIG91dHB1dCcsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQSBmbG93IHN1cHBvcnRzIGEgbWF4aW11bSBvZiAxIE5ESSBvdXRwdXQgKExhcmdlIGZsb3cgc2l6ZSwgdHJhbnNwb3J0XG4gICAgICAvLyBzdHJlYW0gcHJvdG9jb2xzICsgMSBOREkgb3V0cHV0KS5cbiAgICAgIC8vIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL21lZGlhY29ubmVjdC9sYXRlc3QvdWcvZmxvdy1zaXplcy1jYXBhYmlsaXRpZXMuaHRtbFxuICAgICAgaWYgKHRoaXMuX25kaU91dHB1dENvdW50ID49IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgTmRpT3V0cHV0TGltaXRgLFxuICAgICAgICAgICdBIGZsb3cgc3VwcG9ydHMgYSBtYXhpbXVtIG9mIDEgTkRJIG91dHB1dCcsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX25kaU91dHB1dENvdW50Kys7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93T3V0cHV0KHRoaXMsIGlkLCB7XG4gICAgICBmbG93OiB0aGlzLFxuICAgICAgb3V0cHV0OiBvcHRpb25zLm91dHB1dCxcbiAgICAgIGZsb3dPdXRwdXROYW1lOiBvcHRpb25zLmZsb3dPdXRwdXROYW1lLFxuICAgICAgZGVzY3JpcHRpb246IG9wdGlvbnMuZGVzY3JpcHRpb24sXG4gICAgICBvdXRwdXRTdGF0dXM6IG9wdGlvbnMub3V0cHV0U3RhdHVzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIENsb3VkV2F0Y2ggbWV0cmljIGZvciB0aGlzIGZsb3cuXG4gICAqL1xuICBwdWJsaWMgbWV0cmljKG1ldHJpY05hbWU6IHN0cmluZywgcHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBtZXRyaWNOYW1lLFxuICAgICAgbmFtZXNwYWNlOiAnQVdTL01lZGlhQ29ubmVjdCcsXG4gICAgICBkaW1lbnNpb25zTWFwOiB7XG4gICAgICAgIEZsb3dBUk46IHRoaXMuZmxvd0FybixcbiAgICAgIH0sXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KS5hdHRhY2hUbyh0aGlzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgZm9yIHRoZSBiaXRyYXRlIG9mIGNvbnRlbnQgaW5nZXN0ZWQgaW50byB0aGUgZmxvdy5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VCaXRSYXRlYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzIGFjcm9zc1xuICAgKiBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy4gVG8gbmFycm93IHRvIGEgc3BlY2lmaWMgc291cmNlIG9uIGEgbXVsdGktc291cmNlIGZsb3csIGNhbGxcbiAgICoge0BsaW5rIG1ldHJpY30gd2l0aCBhbiBhZGRpdGlvbmFsIGBTb3VyY2VBUk5gIGRpbWVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZUJpdHJhdGUocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1NvdXJjZUJpdFJhdGUnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdhdmcnLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQklUU19QRVJfU0VDT05ELFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciBwYWNrZXRzIHRoYXQgd2VyZSBsb3N0IGluIHRyYW5zaXQgYW5kIG5vdCByZWNvdmVyZWQgYnkgZXJyb3IgY29ycmVjdGlvbi5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VOb3RSZWNvdmVyZWRQYWNrZXRzYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzXG4gICAqIGFjcm9zcyBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlTm90UmVjb3ZlcmVkUGFja2V0cyhwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU291cmNlTm90UmVjb3ZlcmVkUGFja2V0cycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIHRvdGFsIG51bWJlciBvZiBwYWNrZXRzIHJlY2VpdmVkIGJ5IHRoZSBmbG93IHNvdXJjZXMuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlVG90YWxQYWNrZXRzYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLCB3aGljaCBhZ2dyZWdhdGVzIGFjcm9zc1xuICAgKiBhbGwgc291cmNlcyBvbiB0aGUgZmxvdy5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlVG90YWxQYWNrZXRzKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VUb3RhbFBhY2tldHMnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuQ09VTlQsXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRyaWMgaW5kaWNhdGluZyB3aGljaCBzb3VyY2UgaXMgc2VsZWN0ZWQgZm9yIGluZ2VzdCB3aGVuIHVzaW5nIGBGYWlsb3ZlcmAgZmFpbG92ZXIgbW9kZS5cbiAgICogQSB2YWx1ZSBvZiAxIGluZGljYXRlcyB0aGUgc291cmNlIGlzIGJlaW5nIHVzZWQgYXMgdGhlIGlucHV0OyAwIGluZGljYXRlcyBpdCBpcyBzdGFuZGJ5LlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZVNlbGVjdGVkYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLiBUbyBuYXJyb3cgdG8gYSBzcGVjaWZpYyBzb3VyY2UsXG4gICAqIGNhbGwge0BsaW5rIG1ldHJpY30gd2l0aCBhbiBhZGRpdGlvbmFsIGBTb3VyY2VBUk5gIGRpbWVuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBtYXhpbXVtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVNlbGVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VTZWxlY3RlZCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ21heCcsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5OT05FLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGluZGljYXRpbmcgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHNvdXJjZS4gMSBmb3IgY29ubmVjdGVkLCAwIGZvciBkaXNjb25uZWN0ZWQuXG4gICAqIEFwcGxpZXMgb25seSB0byBaaXhpLCBTUlQsIGFuZCBSSVNUIHNvdXJjZXMuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlQ29ubmVjdGVkYCBtZXRyaWMgd2l0aCBkaW1lbnNpb24gYEZsb3dBUk5gLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG1pbmltdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlQ29ubmVjdGVkKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VDb25uZWN0ZWQnLCB7XG4gICAgICBzdGF0aXN0aWM6ICdtaW4nLFxuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5zZWNvbmRzKDYwKSxcbiAgICAgIHVuaXQ6IFVuaXQuTk9ORSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc291cmNlIHRyYW5zaXRpb25lZCBmcm9tIGNvbm5lY3RlZCB0byBkaXNjb25uZWN0ZWQuXG4gICAqXG4gICAqIEVtaXRzIHRoZSBgU291cmNlRGlzY29ubmVjdGlvbnNgIG1ldHJpYyB3aXRoIGRpbWVuc2lvbiBgRmxvd0FSTmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gc3VtIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZURpc2Nvbm5lY3Rpb25zKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VEaXNjb25uZWN0aW9ucycsIHtcbiAgICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5DT1VOVCxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIG51bWJlciBvZiBwYWNrZXRzIGxvc3QgZHVyaW5nIHRyYW5zaXQsIG1lYXN1cmVkIGJlZm9yZSBhbnkgZXJyb3JcbiAgICogY29ycmVjdGlvbiB0YWtlcyBwbGFjZS5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VEcm9wcGVkUGFja2V0c2AgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBzdW0gb3ZlciA2MCBzZWNvbmRzXG4gICAqL1xuICBwdWJsaWMgbWV0cmljU291cmNlRHJvcHBlZFBhY2tldHMocHJvcHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5tZXRyaWMoJ1NvdXJjZURyb3BwZWRQYWNrZXRzJywge1xuICAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0LkNPVU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcGVyY2VudGFnZSBvZiBwYWNrZXRzIGxvc3QgZHVyaW5nIHRyYW5zaXQsIGV2ZW4gaWYgdGhleSB3ZXJlIHJlY292ZXJlZC5cbiAgICpcbiAgICogRW1pdHMgdGhlIGBTb3VyY2VQYWNrZXRMb3NzUGVyY2VudGAgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZVBhY2tldExvc3NQZXJjZW50KHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VQYWNrZXRMb3NzUGVyY2VudCcsIHtcbiAgICAgIHN0YXRpc3RpYzogJ2F2ZycsXG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLnNlY29uZHMoNjApLFxuICAgICAgdW5pdDogVW5pdC5QRVJDRU5ULFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0cmljIGZvciB0aGUgcm91bmQtdHJpcCB0aW1lIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgTWVkaWFDb25uZWN0LiBBcHBsaWVzIG9ubHkgdG9cbiAgICogUklTVCwgWml4aSwgYW5kIFNSVCBzb3VyY2VzLlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZVJvdW5kVHJpcFRpbWVgIG1ldHJpYyB3aXRoIGRpbWVuc2lvbiBgRmxvd0FSTmAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gYXZlcmFnZSBvdmVyIDYwIHNlY29uZHNcbiAgICovXG4gIHB1YmxpYyBtZXRyaWNTb3VyY2VSb3VuZFRyaXBUaW1lKHByb3BzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMubWV0cmljKCdTb3VyY2VSb3VuZFRyaXBUaW1lJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldHJpYyBmb3IgdGhlIGN1cnJlbnQgbmV0d29yayBqaXR0ZXIgb2YgdGhlIHNvdXJjZSwgbWVhc3VyZWQgaW4gbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBFbWl0cyB0aGUgYFNvdXJjZUppdHRlcmAgbWV0cmljIHdpdGggZGltZW5zaW9uIGBGbG93QVJOYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhdmVyYWdlIG92ZXIgNjAgc2Vjb25kc1xuICAgKi9cbiAgcHVibGljIG1ldHJpY1NvdXJjZUppdHRlcihwcm9wcz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLm1ldHJpYygnU291cmNlSml0dGVyJywge1xuICAgICAgc3RhdGlzdGljOiAnYXZnJyxcbiAgICAgIHBlcmlvZDogRHVyYXRpb24uc2Vjb25kcyg2MCksXG4gICAgICB1bml0OiBVbml0Lk1JTExJU0VDT05EUyxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbiBBV1MgRWxlbWVudGFsIE1lZGlhQ29ubmVjdCBGbG93LlxuICovXG5AcHJvcGVydHlJbmplY3RhYmxlXG5leHBvcnQgY2xhc3MgRmxvdyBleHRlbmRzIEZsb3dCYXNlIGltcGxlbWVudHMgSUZsb3cge1xuICAvKiogVW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGNsYXNzLiAqL1xuICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IFBST1BFUlRZX0lOSkVDVElPTl9JRDogc3RyaW5nID0gJ0Bhd3MtY2RrLmF3cy1tZWRpYWNvbm5lY3QtYWxwaGEuRmxvdyc7XG5cbiAgLyoqXG4gICAqIFRoZSBzZXQgb2Ygc291cmNlIHByb3RvY29scyB3aGVyZSB0aGUgZmxvdyBvcGVucyBhbiBJUDpwb3J0IGFuZCBsaXN0ZW5zIGZvclxuICAgKiB1cHN0cmVhbSBjb250ZW50LiBEZXRlcm1pbmVzIGF2YWlsYWJpbGl0eSBvZiBgc291cmNlSW5nZXN0SXBgLCBgc291cmNlSW5nZXN0UG9ydGAsXG4gICAqIGFuZCBgc291cmNlSW5nZXN0VXJsYC4gTWFwcyBlYWNoIHByb3RvY29sIHRvIHRoZSBVUkwgc2NoZW1lIHVzZWQgdG8gY29uc3RydWN0XG4gICAqIHRoZSBpbmdlc3QgVVJMLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgTElTVEVORVJfUFJPVE9DT0xfU0NIRU1FUzogUmVhZG9ubHlNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcChbXG4gICAgWydydHAnLCAncnRwJ10sXG4gICAgWydydHAtZmVjJywgJ3J0cCddLFxuICAgIFsncmlzdCcsICdyaXN0J10sXG4gICAgWydzcnQtbGlzdGVuZXInLCAnc3J0J10sXG4gICAgWyd6aXhpLXB1c2gnLCAneml4aSddLFxuICBdKTtcblxuICBwcml2YXRlIHN0YXRpYyBpc0xpc3RlbmVyU3R5bGVQcm90b2NvbChwcm90b2NvbDogc3RyaW5nIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHByb3RvY29sICE9PSB1bmRlZmluZWQgJiYgRmxvdy5MSVNURU5FUl9QUk9UT0NPTF9TQ0hFTUVTLmhhcyhwcm90b2NvbCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgZmxvd0Fybjogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgc291cmNlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBlZ3Jlc3NJcDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3VyY2VJbmdlc3RJcDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF9zb3VyY2VJbmdlc3RQb3J0OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2hhc0xpc3RlbmVyU291cmNlOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgZmxvd0F2YWlsYWJpbGl0eVpvbmU/OiBzdHJpbmc7XG4gIHB1YmxpYyByZWFkb25seSBpc0ZhaWxvdmVyRW5hYmxlZD86IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSB2cGNJbnRlcmZhY2VzOiBDZm5GbG93LlZwY0ludGVyZmFjZVByb3BlcnR5W10gPSBbXTtcblxuICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdElwKCk6IHN0cmluZyB7XG4gICAgaWYgKCF0aGlzLl9oYXNMaXN0ZW5lclNvdXJjZSkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFNvdXJjZUluZ2VzdElwTm90QXZhaWxhYmxlU291cmNlUHJvdG9jb2xgLFxuICAgICAgICBgJ3NvdXJjZUluZ2VzdElwJyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgb25seSBsaXN0ZW5lci1zdHlsZSBzb3VyY2UgcHJvdG9jb2xzIChSVFAsIFJUUC1GRUMsIFJJU1QsIFNSVCBsaXN0ZW5lciwgWml4aSBwdXNoKSBleHBvc2UgYSBzb3VyY2UgaW5nZXN0IElQIOKAlCBDREksIEpQRUcgWFMsIGVudGl0bGVtZW50LCBnYXRld2F5IGJyaWRnZSwgcm91dGVyLCBhbmQgU1JUIGNhbGxlciBzb3VyY2VzIGRvIG5vdGAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc291cmNlSW5nZXN0SXA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNvdXJjZUluZ2VzdFBvcnQoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2hhc0xpc3RlbmVyU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU291cmNlSW5nZXN0UG9ydE5vdEF2YWlsYWJsZVNvdXJjZVByb3RvY29sYCxcbiAgICAgICAgYCdzb3VyY2VJbmdlc3RQb3J0JyBpcyBub3QgYXZhaWxhYmxlIG9uIHRoaXMgRmxvdyAke3RoaXMubm9kZS5wYXRofTsgb25seSBsaXN0ZW5lci1zdHlsZSBzb3VyY2UgcHJvdG9jb2xzIChSVFAsIFJUUC1GRUMsIFJJU1QsIFNSVCBsaXN0ZW5lciwgWml4aSBwdXNoKSBleHBvc2UgYSBzb3VyY2UgaW5nZXN0IHBvcnQg4oCUIENESSwgSlBFRyBYUywgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIGFuZCBTUlQgY2FsbGVyIHNvdXJjZXMgZG8gbm90YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9zb3VyY2VJbmdlc3RQb3J0O1xuICB9XG5cbiAgcHVibGljIGdldCBzb3VyY2VJbmdlc3RVcmwoKTogc3RyaW5nIHtcbiAgICBpZiAoIXRoaXMuX2hhc0xpc3RlbmVyU291cmNlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgU291cmNlSW5nZXN0VXJsTm90QXZhaWxhYmxlU291cmNlUHJvdG9jb2xgLFxuICAgICAgICBgJ3NvdXJjZUluZ2VzdFVybCcgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIEZsb3cgJHt0aGlzLm5vZGUucGF0aH07IG9ubHkgbGlzdGVuZXItc3R5bGUgc291cmNlIHByb3RvY29scyAoUlRQLCBSVFAtRkVDLCBSSVNULCBTUlQgbGlzdGVuZXIsIFppeGkgcHVzaCkgZXhwb3NlIGEgc291cmNlIGluZ2VzdCBVUkwg4oCUIENESSwgSlBFRyBYUywgZW50aXRsZW1lbnQsIGdhdGV3YXkgYnJpZGdlLCByb3V0ZXIsIGFuZCBTUlQgY2FsbGVyIHNvdXJjZXMgZG8gbm90YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbXB1dGVJbmdlc3RVcmwodGhpcy5fc291cmNlUHJvdG9jb2wsIHRoaXMuX3NvdXJjZUluZ2VzdElwLCB0aGlzLl9zb3VyY2VJbmdlc3RQb3J0KTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIHByb3BzOiBGbG93UHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHM/LmZsb3dOYW1lID8/IExhenkuc3RyaW5nKHsgcHJvZHVjZTogKCkgPT4gTmFtZXMudW5pcXVlUmVzb3VyY2VOYW1lKHRoaXMsIHsgbWF4TGVuZ3RoOiA2NCB9KSB9KSxcbiAgICB9KTtcblxuICAgIC8vIFZhbGlkYXRlIGZsb3cgbmFtZSBpZiBwcm92aWRlZFxuICAgIHRoaXMudmFsaWRhdGVOYW1lKHByb3BzKTtcblxuICAgIC8vIEVuaGFuY2VkIENESyBBbmFseXRpY3MgVGVsZW1ldHJ5XG4gICAgYWRkQ29uc3RydWN0TWV0YWRhdGEodGhpcywgcHJvcHMpO1xuXG4gICAgLy8gVmFsaWRhdGUgbWFpbnRlbmFuY2Ugc3RhcnQgaG91ciBmb3JtYXRcbiAgICBpZiAocHJvcHMubWFpbnRlbmFuY2VDb25maWd1cmF0aW9uKSB7XG4gICAgICB2YWxpZGF0ZU1haW50ZW5hbmNlVGltZShwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24udGltZSk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgc291cmNlIG1vbml0b3JpbmcgdGhyZXNob2xkcyBhbmQgY29udGVudC1xdWFsaXR5IHJlcXVpcmVtZW50c1xuICAgIHRoaXMudmFsaWRhdGVNb25pdG9yaW5nKHByb3BzKTtcblxuICAgIC8vIFZhbGlkYXRlIGVuY29kaW5nIGNvbmZpZyB2aWRlbyBtYXggYml0cmF0ZSByYW5nZSAoMTAtNTAgTWJwcylcbiAgICB0aGlzLnZhbGlkYXRlRW5jb2RpbmcocHJvcHMpO1xuXG4gICAgLy8gT25seSBpdGVyYXRlIGEga25vd24tY29uY3JldGUgdnBjSW50ZXJmYWNlcyBsaXN0OyBza2lwIHRva2VuaXplZCBsaXN0cyB0byBhdm9pZFxuICAgIC8vIHB1c2hpbmcgdGhlIHRva2VuIG1hcmtlciBpbnRvIG91ciBpbnRlcm5hbCBjb2xsZWN0aW9uLlxuICAgIGlmIChwcm9wcy52cGNJbnRlcmZhY2VzICE9PSB1bmRlZmluZWQgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChwcm9wcy52cGNJbnRlcmZhY2VzKSkge1xuICAgICAgcHJvcHMudnBjSW50ZXJmYWNlcy5mb3JFYWNoKHZwYyA9PiB0aGlzLmFkZFZwY0ludGVyZmFjZSh2cGMpKTtcbiAgICB9XG4gICAgdGhpcy5pc0ZhaWxvdmVyRW5hYmxlZCA9IHByb3BzLnNvdXJjZUZhaWxvdmVyQ29uZmlnPy5faXNFbmFibGVkID8/IGZhbHNlO1xuXG4gICAgY29uc3Qgc291cmNlQ29uZmlnID0gcHJvcHMuc291cmNlLl9iaW5kKHRoaXMsIFN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICBzZXJ2aWNlOiAnbWVkaWFjb25uZWN0JyxcbiAgICAgIHJlc291cmNlOiAnZmxvdycsXG4gICAgICByZXNvdXJjZU5hbWU6IGAqOiR7dGhpcy5waHlzaWNhbE5hbWV9YCxcbiAgICAgIGFybkZvcm1hdDogQXJuRm9ybWF0LkNPTE9OX1JFU09VUkNFX05BTUUsXG4gICAgfSkpO1xuXG4gICAgaWYgKChzb3VyY2VDb25maWcucHJvdG9jb2wgPT09IFNvdXJjZVByb3RvY29sLkpQRUdYUy52YWx1ZSB8fCBzb3VyY2VDb25maWcucHJvdG9jb2wgPT09IFNvdXJjZVByb3RvY29sLkNESS52YWx1ZSlcbiAgICAgICYmIHByb3BzLmZsb3dTaXplPy52YWx1ZSAhPT0gRmxvd1NpemUuTEFSR0VfNFgudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBGbG93U2l6ZVJlcXVpcmVkYCxcbiAgICAgICAgJ0Zsb3dzIHVzaW5nIEpQRUcgWFMgYW5kIENESSBwcm90b2NvbHMgcmVxdWlyZSBMQVJHRV80WCBmbG93IHNpemU7IHNldCBmbG93U2l6ZSB0byBGbG93U2l6ZS5MQVJHRV80WCcsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5ESSBjb25zdHJhaW50cyAoZGlzY292ZXJ5IHNlcnZlciBsaW1pdCwgcHJvdG9jb2wgY29uZmxpY3RzLCBmbG93IHNpemUsIHNvdXJjZSByZXF1aXJlbWVudHMpXG4gICAgdGhpcy52YWxpZGF0ZU5kaShwcm9wcywgc291cmNlQ29uZmlnKTtcblxuICAgIC8vIExBUkdFXzRYIG9ubHkgc3VwcG9ydHMgQ0RJIGFuZCBKUEVHIFhTIHByb3RvY29sc1xuICAgIGlmIChwcm9wcy5mbG93U2l6ZT8udmFsdWUgPT09IEZsb3dTaXplLkxBUkdFXzRYLnZhbHVlXG4gICAgICAmJiBzb3VyY2VDb25maWcucHJvdG9jb2wgIT09IFNvdXJjZVByb3RvY29sLkpQRUdYUy52YWx1ZVxuICAgICAgJiYgc291cmNlQ29uZmlnLnByb3RvY29sICE9PSBTb3VyY2VQcm90b2NvbC5DREkudmFsdWUpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBGbG93U2l6ZUxhcmdlNHhQcm90b2NvbGAsXG4gICAgICAgICdMQVJHRV80WCBmbG93IHNpemUgb25seSBzdXBwb3J0cyBDREkgYW5kIEpQRUcgWFMgcHJvdG9jb2xzJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVlBDIGludGVyZmFjZSBFRkEtY291bnQgbGltaXRcbiAgICB0aGlzLnZhbGlkYXRlVnBjRWZhQ291bnQocHJvcHMpO1xuXG4gICAgY29uc3QgZmxvdyA9IG5ldyBDZm5GbG93KHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIG5hbWU6IHRoaXMucGh5c2ljYWxOYW1lLFxuICAgICAgc291cmNlOiBzb3VyY2VDb25maWcsXG4gICAgICBhdmFpbGFiaWxpdHlab25lOiBwcm9wcz8uYXZhaWxhYmlsaXR5Wm9uZSxcbiAgICAgIGZsb3dTaXplOiBwcm9wcz8uZmxvd1NpemU/LnZhbHVlLFxuICAgICAgbWFpbnRlbmFuY2U6IHByb3BzPy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24gPyB7XG4gICAgICAgIG1haW50ZW5hbmNlRGF5OiB0b1RpdGxlQ2FzZShwcm9wcy5tYWludGVuYW5jZUNvbmZpZ3VyYXRpb24uZGF5KSxcbiAgICAgICAgbWFpbnRlbmFuY2VTdGFydEhvdXI6IHByb3BzLm1haW50ZW5hbmNlQ29uZmlndXJhdGlvbi50aW1lLFxuICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgIG1lZGlhU3RyZWFtczogcHJvcHMubWVkaWFTdHJlYW1zID8gcHJvcHMubWVkaWFTdHJlYW1zLm1hcChzdHJlYW0gPT4gc3RyZWFtLl9iaW5kKCkpIDogdW5kZWZpbmVkLFxuICAgICAgbmRpQ29uZmlnOiBwcm9wcy5uZGlDb25maWcgPyB7XG4gICAgICAgIG1hY2hpbmVOYW1lOiBwcm9wcy5uZGlDb25maWcubWFjaGluZU5hbWUsXG4gICAgICAgIG5kaVN0YXRlOiBwcm9wcy5uZGlDb25maWcubmRpU3RhdGUsXG4gICAgICAgIG5kaURpc2NvdmVyeVNlcnZlcnM6IHByb3BzLm5kaUNvbmZpZy5uZGlEaXNjb3ZlcnlTZXJ2ZXJzPy5tYXAoc2VydmVyID0+ICh7XG4gICAgICAgICAgZGlzY292ZXJ5U2VydmVyQWRkcmVzczogc2VydmVyLmRpc2NvdmVyeVNlcnZlckFkZHJlc3MsXG4gICAgICAgICAgZGlzY292ZXJ5U2VydmVyUG9ydDogc2VydmVyLmRpc2NvdmVyeVNlcnZlclBvcnQsXG4gICAgICAgICAgdnBjSW50ZXJmYWNlQWRhcHRlcjogc2VydmVyLnZwY0ludGVyZmFjZS5uYW1lLFxuICAgICAgICB9KSksXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgZW5jb2RpbmdDb25maWc6IHByb3BzLmVuY29kaW5nQ29uZmlnID8ge1xuICAgICAgICBlbmNvZGluZ1Byb2ZpbGU6IHByb3BzLmVuY29kaW5nQ29uZmlnLmVuY29kaW5nUHJvZmlsZSxcbiAgICAgICAgdmlkZW9NYXhCaXRyYXRlOiBwcm9wcy5lbmNvZGluZ0NvbmZpZy52aWRlb01heEJpdHJhdGU/LnRvQnBzKCksXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgc291cmNlRmFpbG92ZXJDb25maWc6IHByb3BzLnNvdXJjZUZhaWxvdmVyQ29uZmlnPy5fYmluZCgpLFxuICAgICAgc291cmNlTW9uaXRvcmluZ0NvbmZpZzogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZyA/IHtcbiAgICAgICAgY29udGVudFF1YWxpdHlBbmFseXNpc1N0YXRlOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmNvbnRlbnRRdWFsaXR5QW5hbHlzaXNTdGF0ZSxcbiAgICAgICAgdGh1bWJuYWlsU3RhdGU6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcudGh1bWJuYWlsU3RhdGUsXG4gICAgICAgIGF1ZGlvTW9uaXRvcmluZ1NldHRpbmdzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLnNpbGVudEF1ZGlvID8gW3tcbiAgICAgICAgICBzaWxlbnRBdWRpbzoge1xuICAgICAgICAgICAgc3RhdGU6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuc2lsZW50QXVkaW8uc3RhdGUsXG4gICAgICAgICAgICB0aHJlc2hvbGRTZWNvbmRzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLnNpbGVudEF1ZGlvLnRocmVzaG9sZC50b1NlY29uZHMoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9XSA6IHVuZGVmaW5lZCxcbiAgICAgICAgdmlkZW9Nb25pdG9yaW5nU2V0dGluZ3M6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuYmxhY2tGcmFtZXMgfHwgcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5mcm96ZW5GcmFtZXMgPyBbe1xuICAgICAgICAgIGJsYWNrRnJhbWVzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmJsYWNrRnJhbWVzID8ge1xuICAgICAgICAgICAgc3RhdGU6IHByb3BzLnNvdXJjZU1vbml0b3JpbmdDb25maWcuYmxhY2tGcmFtZXMuc3RhdGUsXG4gICAgICAgICAgICB0aHJlc2hvbGRTZWNvbmRzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmJsYWNrRnJhbWVzLnRocmVzaG9sZC50b1NlY29uZHMoKSxcbiAgICAgICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgICAgIGZyb3plbkZyYW1lczogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5mcm96ZW5GcmFtZXMgPyB7XG4gICAgICAgICAgICBzdGF0ZTogcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZy5mcm96ZW5GcmFtZXMuc3RhdGUsXG4gICAgICAgICAgICB0aHJlc2hvbGRTZWNvbmRzOiBwcm9wcy5zb3VyY2VNb25pdG9yaW5nQ29uZmlnLmZyb3plbkZyYW1lcy50aHJlc2hvbGQudG9TZWNvbmRzKCksXG4gICAgICAgICAgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgfV0gOiB1bmRlZmluZWQsXG4gICAgICB9IDogdW5kZWZpbmVkLFxuICAgICAgdnBjSW50ZXJmYWNlczogTGF6eS5hbnkoeyBwcm9kdWNlOiAoKSA9PiB0aGlzLnZwY0ludGVyZmFjZXMgfSwgeyBvbWl0RW1wdHlBcnJheTogdHJ1ZSB9KSxcbiAgICB9KTtcblxuICAgIHRoaXMuZmxvd0FybiA9IGZsb3cuYXR0ckZsb3dBcm47XG4gICAgdGhpcy5zb3VyY2VBcm4gPSBmbG93LmF0dHJTb3VyY2VTb3VyY2VBcm47XG4gICAgdGhpcy5lZ3Jlc3NJcCA9IGZsb3cuYXR0ckVncmVzc0lwO1xuICAgIHRoaXMuX3NvdXJjZUluZ2VzdElwID0gZmxvdy5hdHRyU291cmNlSW5nZXN0SXA7XG4gICAgdGhpcy5fc291cmNlSW5nZXN0UG9ydCA9IGZsb3cuYXR0clNvdXJjZVNvdXJjZUluZ2VzdFBvcnQ7XG4gICAgdGhpcy5mbG93QXZhaWxhYmlsaXR5Wm9uZSA9IGZsb3cuYXR0ckZsb3dBdmFpbGFiaWxpdHlab25lO1xuICAgIHRoaXMuX25kaVN0YXRlID0gcHJvcHMubmRpQ29uZmlnPy5uZGlTdGF0ZSA/PyBTdGF0ZS5ESVNBQkxFRDtcbiAgICB0aGlzLl9zb3VyY2VQcm90b2NvbCA9IHNvdXJjZUNvbmZpZy5wcm90b2NvbDtcbiAgICB0aGlzLl9oYXNMaXN0ZW5lclNvdXJjZSA9IEZsb3cuaXNMaXN0ZW5lclN0eWxlUHJvdG9jb2woc291cmNlQ29uZmlnLnByb3RvY29sKTtcblxuICAgIHRoaXMubm9kZS5hZGRWYWxpZGF0aW9uKHtcbiAgICAgIHZhbGlkYXRlOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5hbWVzID0gdGhpcy52cGNJbnRlcmZhY2VzLm1hcCh2ID0+IHYubmFtZSkuZmlsdGVyKG4gPT4gIVRva2VuLmlzVW5yZXNvbHZlZChuKSk7XG4gICAgICAgIGNvbnN0IGR1cGxpY2F0ZXMgPSBbLi4ubmV3IFNldChuYW1lcy5maWx0ZXIoKG4sIGkpID0+IG5hbWVzLmluZGV4T2YobikgIT09IGkpKV07XG4gICAgICAgIHJldHVybiBkdXBsaWNhdGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICA/IFtgVlBDIGludGVyZmFjZSBuYW1lcyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gYSBmbG93LiBEdXBsaWNhdGUgbmFtZShzKTogJHtkdXBsaWNhdGVzLmpvaW4oJywgJyl9YF1cbiAgICAgICAgICA6IFtdO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSB0aGUgZmxvdyBuYW1lIGxlbmd0aCBhbmQgY2hhcmFjdGVyIHNldCwgd2hlbiBhIGNvbmNyZXRlIHZhbHVlIGlzIHByb3ZpZGVkLiAqL1xuICBwcml2YXRlIHZhbGlkYXRlTmFtZShwcm9wczogRmxvd1Byb3BzKTogdm9pZCB7XG4gICAgaWYgKHByb3BzLmZsb3dOYW1lICE9IG51bGwgJiYgcHJvcHMuZmxvd05hbWUgIT09ICcnICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMuZmxvd05hbWUpKSB7XG4gICAgICBpZiAocHJvcHMuZmxvd05hbWUubGVuZ3RoID4gNjQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgRmxvd05hbWVMZW5ndGhgLCBgRmxvdyBuYW1lIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA2NCBjaGFyYWN0ZXJzLCBnb3QgJHtwcm9wcy5mbG93TmFtZS5sZW5ndGh9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgICBpZiAoIS9eW2EtekEtWjAtOV8tXSskLy50ZXN0KHByb3BzLmZsb3dOYW1lKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBGbG93TmFtZUZvcm1hdGAsIGBGbG93IG5hbWUgbXVzdCBjb250YWluIG9ubHkgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMsIGh5cGhlbnMsIGFuZCB1bmRlcnNjb3JlcywgZ290ICcke3Byb3BzLmZsb3dOYW1lfSdgLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgc291cmNlLW1vbml0b3JpbmcgdGhyZXNob2xkcyAoMTAtNjAgc2Vjb25kcykgYW5kIHRoYXQgdGhlIHBlci1tZXRyaWMgY2hlY2tzIGFyZSBvbmx5XG4gICAqIHVzZWQgd2hlbiBjb250ZW50LXF1YWxpdHkgYW5hbHlzaXMgaXMgZW5hYmxlZC5cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNb25pdG9yaW5nKHByb3BzOiBGbG93UHJvcHMpOiB2b2lkIHtcbiAgICBjb25zdCBtb25pdG9yaW5nID0gcHJvcHMuc291cmNlTW9uaXRvcmluZ0NvbmZpZztcbiAgICBpZiAobW9uaXRvcmluZyAmJiAobW9uaXRvcmluZy5zaWxlbnRBdWRpbyB8fCBtb25pdG9yaW5nLmJsYWNrRnJhbWVzIHx8IG1vbml0b3JpbmcuZnJvemVuRnJhbWVzKVxuICAgICAgJiYgbW9uaXRvcmluZy5jb250ZW50UXVhbGl0eUFuYWx5c2lzU3RhdGUgIT09IFN0YXRlLkVOQUJMRUQpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBNb25pdG9yaW5nTWV0cmljc1JlcXVpcmVDb250ZW50UXVhbGl0eUFuYWx5c2lzYCxcbiAgICAgICAgJ3NpbGVudEF1ZGlvLCBibGFja0ZyYW1lcywgYW5kIGZyb3plbkZyYW1lcyByZXF1aXJlIGNvbnRlbnRRdWFsaXR5QW5hbHlzaXNTdGF0ZSB0byBiZSBTdGF0ZS5FTkFCTEVEJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChtb25pdG9yaW5nPy5zaWxlbnRBdWRpbykge1xuICAgICAgY29uc3Qgc2VjcyA9IG1vbml0b3Jpbmcuc2lsZW50QXVkaW8udGhyZXNob2xkLnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHNlY3MgPCAxMCB8fCBzZWNzID4gNjApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgU2lsZW50QXVkaW9UaHJlc2hvbGRSYW5nZWAsIGBTaWxlbnQgYXVkaW8gdGhyZXNob2xkIG11c3QgYmUgYmV0d2VlbiAxMCBhbmQgNjAgc2Vjb25kcywgZ290ICR7c2Vjc31gLCB0aGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG1vbml0b3Jpbmc/LmJsYWNrRnJhbWVzKSB7XG4gICAgICBjb25zdCBzZWNzID0gbW9uaXRvcmluZy5ibGFja0ZyYW1lcy50aHJlc2hvbGQudG9TZWNvbmRzKCk7XG4gICAgICBpZiAoc2VjcyA8IDEwIHx8IHNlY3MgPiA2MCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBCbGFja0ZyYW1lc1RocmVzaG9sZFJhbmdlYCwgYEJsYWNrIGZyYW1lcyB0aHJlc2hvbGQgbXVzdCBiZSBiZXR3ZWVuIDEwIGFuZCA2MCBzZWNvbmRzLCBnb3QgJHtzZWNzfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobW9uaXRvcmluZz8uZnJvemVuRnJhbWVzKSB7XG4gICAgICBjb25zdCBzZWNzID0gbW9uaXRvcmluZy5mcm96ZW5GcmFtZXMudGhyZXNob2xkLnRvU2Vjb25kcygpO1xuICAgICAgaWYgKHNlY3MgPCAxMCB8fCBzZWNzID4gNjApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgRnJvemVuRnJhbWVzVGhyZXNob2xkUmFuZ2VgLCBgRnJvemVuIGZyYW1lcyB0aHJlc2hvbGQgbXVzdCBiZSBiZXR3ZWVuIDEwIGFuZCA2MCBzZWNvbmRzLCBnb3QgJHtzZWNzfWAsIHRoaXMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBWYWxpZGF0ZSB0aGUgZW5jb2RpbmcgY29uZmlnJ3MgdmlkZW8gbWF4IGJpdHJhdGUgcmFuZ2UgKDEwLTUwIE1icHMpLiAqL1xuICBwcml2YXRlIHZhbGlkYXRlRW5jb2RpbmcocHJvcHM6IEZsb3dQcm9wcyk6IHZvaWQge1xuICAgIGlmIChwcm9wcy5lbmNvZGluZ0NvbmZpZz8udmlkZW9NYXhCaXRyYXRlKSB7XG4gICAgICBjb25zdCBtYnBzID0gcHJvcHMuZW5jb2RpbmdDb25maWcudmlkZW9NYXhCaXRyYXRlLnRvTWJwcygpO1xuICAgICAgaWYgKG1icHMgPCAxMCB8fCBtYnBzID4gNTApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgRW5jb2RpbmdWaWRlb01heEJpdHJhdGVSYW5nZWAsXG4gICAgICAgICAgYEVuY29kaW5nIGNvbmZpZyB2aWRlb01heEJpdHJhdGUgbXVzdCBiZSBiZXR3ZWVuIDEwIGFuZCA1MCBNYnBzLCBnb3QgJHttYnBzfWAsXG4gICAgICAgICAgdGhpcyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgTkRJIGNvbnN0cmFpbnRzOiBkaXNjb3Zlcnktc2VydmVyIGxpbWl0LCBtdXR1YWwgZXhjbHVzaXZpdHkgd2l0aCBDREkvSlBFRyBYUywgdGhlXG4gICAqIHJlcXVpcmVkIExBUkdFIGZsb3cgc2l6ZSwgYW5kIHRoZSByZXF1aXJlbWVudHMgYW4gTkRJIHNvdXJjZSBwbGFjZXMgb24gdGhlIGZsb3cuXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlTmRpKHByb3BzOiBGbG93UHJvcHMsIHNvdXJjZUNvbmZpZzogQ2ZuRmxvdy5Tb3VyY2VQcm9wZXJ0eSk6IHZvaWQge1xuICAgIC8vIE5ESSBkaXNjb3Zlcnkgc2VydmVycyBsaW1pdCAoc2VydmljZSByZWplY3RzID4zIGF0IGRlcGxveSB0aW1lKVxuICAgIGNvbnN0IGRpc2NvdmVyeVNlcnZlcnMgPSBwcm9wcy5uZGlDb25maWc/Lm5kaURpc2NvdmVyeVNlcnZlcnM7XG4gICAgaWYgKGRpc2NvdmVyeVNlcnZlcnMgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGRpc2NvdmVyeVNlcnZlcnMpICYmIGRpc2NvdmVyeVNlcnZlcnMubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YE5kaU1heERpc2NvdmVyeVNlcnZlcnNgLFxuICAgICAgICBgTkRJIGNvbmZpZyBzdXBwb3J0cyBhIG1heGltdW0gb2YgMyBkaXNjb3Zlcnkgc2VydmVycywgZ290ICR7ZGlzY292ZXJ5U2VydmVycy5sZW5ndGh9YCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTkRJIGNhbm5vdCBjb2V4aXN0IHdpdGggQ0RJIG9yIEpQRUcgWFMg4oCUIHRoZXkgcmVxdWlyZSBkaWZmZXJlbnQgZmxvdyBzaXplc1xuICAgIGlmIChwcm9wcy5uZGlDb25maWc/Lm5kaVN0YXRlID09PSBTdGF0ZS5FTkFCTEVEXG4gICAgICAmJiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5DREkudmFsdWUgfHwgc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5KUEVHWFMudmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpQ2RpQ29uZmxpY3RgLFxuICAgICAgICAnTkRJIGNhbm5vdCBiZSB1c2VkIHdpdGggQ0RJIG9yIEpQRUcgWFMgcHJvdG9jb2xzOyBOREkgcmVxdWlyZXMgTEFSR0UgZmxvdyBzaXplIHdoaWxlIENESSBhbmQgSlBFRyBYUyByZXF1aXJlIExBUkdFXzRYJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTkRJIHJlcXVpcmVzIExBUkdFIGZsb3cgc2l6ZSAobm90IE1FRElVTSwgbm90IExBUkdFXzRYKVxuICAgIGlmIChwcm9wcy5uZGlDb25maWc/Lm5kaVN0YXRlID09PSBTdGF0ZS5FTkFCTEVEXG4gICAgICAmJiBwcm9wcy5mbG93U2l6ZT8udmFsdWUgIT09IEZsb3dTaXplLkxBUkdFLnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpRmxvd1NpemVSZXF1aXJlZGAsXG4gICAgICAgICdOREkgcmVxdWlyZXMgTEFSR0UgZmxvdyBzaXplOyBzZXQgZmxvd1NpemUgdG8gRmxvd1NpemUuTEFSR0UnLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBOREkgc291cmNlcyByZXF1aXJlIE5ESSB0byBiZSBlbmFibGVkIG9uIHRoZSBmbG93XG4gICAgaWYgKHNvdXJjZUNvbmZpZy5wcm90b2NvbCA9PT0gU291cmNlUHJvdG9jb2wuTkRJX1NQRUVEX0hRLnZhbHVlXG4gICAgICAmJiBwcm9wcy5uZGlDb25maWc/Lm5kaVN0YXRlICE9PSBTdGF0ZS5FTkFCTEVEKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpU291cmNlUmVxdWlyZXNOZGlDb25maWdgLFxuICAgICAgICAnTkRJIHNvdXJjZXMgcmVxdWlyZSBuZGlDb25maWcgd2l0aCBuZGlTdGF0ZSBzZXQgdG8gU3RhdGUuRU5BQkxFRCcsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIE5ESSBzb3VyY2VzIHJlcXVpcmUgTEFSR0UgZmxvdyBzaXplXG4gICAgaWYgKHNvdXJjZUNvbmZpZy5wcm90b2NvbCA9PT0gU291cmNlUHJvdG9jb2wuTkRJX1NQRUVEX0hRLnZhbHVlXG4gICAgICAmJiBwcm9wcy5mbG93U2l6ZT8udmFsdWUgIT09IEZsb3dTaXplLkxBUkdFLnZhbHVlKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTmRpU291cmNlRmxvd1NpemVSZXF1aXJlZGAsXG4gICAgICAgICdOREkgc291cmNlcyByZXF1aXJlIExBUkdFIGZsb3cgc2l6ZTsgc2V0IGZsb3dTaXplIHRvIEZsb3dTaXplLkxBUkdFJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTkRJIHNvdXJjZXMgcmVxdWlyZSBlbmNvZGluZ0NvbmZpZyB0byB0cmFuc2NvZGUgaW50byBhIHRyYW5zcG9ydCBzdHJlYW1cbiAgICBpZiAoc291cmNlQ29uZmlnLnByb3RvY29sID09PSBTb3VyY2VQcm90b2NvbC5ORElfU1BFRURfSFEudmFsdWVcbiAgICAgICYmICFwcm9wcy5lbmNvZGluZ0NvbmZpZykge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YE5kaVNvdXJjZVJlcXVpcmVzRW5jb2RpbmdDb25maWdgLFxuICAgICAgICAnTkRJIHNvdXJjZXMgcmVxdWlyZSBlbmNvZGluZ0NvbmZpZyB0byB0cmFuc2NvZGUgdGhlIE5ESSBzb3VyY2UgaW50byBhIHRyYW5zcG9ydCBzdHJlYW0nLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKiogVmFsaWRhdGUgdGhlIEVGQSBWUEMtaW50ZXJmYWNlIGNvdW50IChhdCBtb3N0IG9uZSksIHdoZW4gdGhlIGxpc3QgaXMgY29uY3JldGUuICovXG4gIHByaXZhdGUgdmFsaWRhdGVWcGNFZmFDb3VudChwcm9wczogRmxvd1Byb3BzKTogdm9pZCB7XG4gICAgLy8gU2tpcCBFRkEtY291bnQgdmFsaWRhdGlvbiB3aGVuIHRoZSB1c2VyIHBhc3NlZCBhIHRva2VuaXplZCB2cGNJbnRlcmZhY2VzIGxpc3Q7XG4gICAgLy8gd2UgY2FuJ3QgaW5zcGVjdCBpbmRpdmlkdWFsIGVudHJpZXMgaW4gdGhhdCBjYXNlLlxuICAgIGNvbnN0IGVmYUNvdW50ID0gcHJvcHMudnBjSW50ZXJmYWNlcyAhPT0gdW5kZWZpbmVkICYmICFUb2tlbi5pc1VucmVzb2x2ZWQocHJvcHMudnBjSW50ZXJmYWNlcylcbiAgICAgID8gcHJvcHMudnBjSW50ZXJmYWNlcy5maWx0ZXIodnBjID0+IHZwYy5uZXR3b3JrSW50ZXJmYWNlVHlwZT8udmFsdWUgPT09IE5ldHdvcmtJbnRlcmZhY2UuRUZBLnZhbHVlKS5sZW5ndGhcbiAgICAgIDogMDtcblxuICAgIGlmIChlZmFDb3VudCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBGbG93TWF4RWZhSW50ZXJmYWNlc2AsXG4gICAgICAgIGBBIGZsb3cgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDEgRUZBIFZQQyBpbnRlcmZhY2UsIGdvdCAke2VmYUNvdW50fWAsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgVVJMIGZvciBhIGxpc3RlbmVyLXN0eWxlIHNvdXJjZSBwcm90b2NvbC4gVGhlIGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeVxuICAgKiBjaGVja2VkIGBfaGFzTGlzdGVuZXJTb3VyY2VgOyB0aGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBwcm90b2NvbCBpcyBpblxuICAgKiBgTElTVEVORVJfUFJPVE9DT0xfU0NIRU1FU2AgYW5kIHRocm93cyBhbiB1bnNjb3BlZCBlcnJvciBvdGhlcndpc2UuXG4gICAqL1xuICBwcml2YXRlIGNvbXB1dGVJbmdlc3RVcmwocHJvdG9jb2w6IHN0cmluZyB8IHVuZGVmaW5lZCwgaXA6IHN0cmluZywgcG9ydDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBzY2hlbWUgPSBwcm90b2NvbCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogRmxvdy5MSVNURU5FUl9QUk9UT0NPTF9TQ0hFTUVTLmdldChwcm90b2NvbCk7XG4gICAgaWYgKHNjaGVtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgIGxpdGBTb3VyY2VJbmdlc3RVcmxDb21wdXRlTm90TGlzdGVuZXJgLFxuICAgICAgICBgaW50ZXJuYWw6IGNvbXB1dGVJbmdlc3RVcmwgY2FsbGVkIGZvciBub24tbGlzdGVuZXIgcHJvdG9jb2wgJyR7cHJvdG9jb2x9J2AsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gRm4uam9pbignJywgW2Ake3NjaGVtZX06Ly9gLCBpcCwgJzonLCBwb3J0XSk7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEgVlBDIGludGVyZmFjZSB0byB0aGlzIGZsb3cuXG4gICAqL1xuICBATWV0aG9kTWV0YWRhdGEoKVxuICBwdWJsaWMgYWRkVnBjSW50ZXJmYWNlKHZwYzogVnBjSW50ZXJmYWNlQ29uZmlnKSB7XG4gICAgdGhpcy52cGNJbnRlcmZhY2VzLnB1c2goe1xuICAgICAgbmFtZTogdnBjLm5hbWUsXG4gICAgICBuZXR3b3JrSW50ZXJmYWNlSWRzOiB2cGMubmV0d29ya0ludGVyZmFjZUlkcyxcbiAgICAgIG5ldHdvcmtJbnRlcmZhY2VUeXBlOiB2cGMubmV0d29ya0ludGVyZmFjZVR5cGU/LnZhbHVlLFxuICAgICAgc2VjdXJpdHlHcm91cElkczogdnBjLnNlY3VyaXR5R3JvdXBzLm1hcChzZyA9PiBzZy5zZWN1cml0eUdyb3VwSWQpLFxuICAgICAgc3VibmV0SWQ6IHZwYy5zdWJuZXQuc3VibmV0SWQsXG4gICAgICByb2xlQXJuOiB2cGMucm9sZS5yb2xlQXJuLFxuICAgIH0pO1xuICAgIHJldHVybiB2cGM7XG4gIH1cbn1cbiJdfQ==
|