@sapui5/sap.fe.base 1.127.2 → 1.129.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.
@@ -2,7 +2,7 @@
2
2
  * SAP UI development toolkit for HTML5 (SAPUI5)
3
3
  * (c) Copyright 2009-2024 SAP SE. All rights reserved
4
4
  */
5
- sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/HookSupport", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata"], function (ObjectPath, merge, uid, HookSupport, Metadata, BaseObject, ControllerMetadata) {
5
+ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/util/merge", "sap/base/util/uid", "sap/fe/base/HookSupport", "sap/ui/base/Metadata", "sap/ui/base/Object", "sap/ui/core/mvc/ControllerMetadata", "sap/ui/model/json/JSONModel"], function (ObjectPath, deepClone, merge, uid, HookSupport, Metadata, BaseObject, ControllerMetadata, JSONModel) {
6
6
  "use strict";
7
7
 
8
8
  var _exports = {};
@@ -23,7 +23,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
23
23
 
24
24
  /**
25
25
  * Method that will find the correct API object based on the current control hierarchy.
26
- *
27
26
  * @param target
28
27
  * @returns The proper getAPI function for this constructor
29
28
  */
@@ -61,7 +60,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
61
60
 
62
61
  /**
63
62
  * Ensures that when an xmlEventHandler is defined, the `getAPI` function is properly assigned.
64
- *
65
63
  * @param target The class constructor that should hold the static functions
66
64
  */
67
65
  const ensureGetAPI = function (target) {
@@ -77,15 +75,49 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
77
75
  target.getAPI = prepareGetAPIFunction(target);
78
76
  }
79
77
  };
78
+ /**
79
+ * Creates the binding info for an array property coming from the state.
80
+ * @param stateProperty
81
+ * @returns The aggregation binding info
82
+ */
83
+ function bindStateArray(stateProperty) {
84
+ if (stateProperty.__bindingInfo !== undefined) {
85
+ return {
86
+ path: stateProperty.__bindingInfo.path,
87
+ model: stateProperty.__bindingInfo.model
88
+ };
89
+ }
90
+ }
91
+
92
+ /**
93
+ * Allows to define a property that will hold the control state.
94
+ *
95
+ * Properties defined with this decorator will be automatically bound to the control state when used in JSX.
96
+ * Arrays need to be bound using the `bindState` function.
97
+ * @experimental
98
+ * @returns A property decorator
99
+ */
100
+ _exports.bindStateArray = bindStateArray;
101
+ function defineState() {
102
+ return function (target, propertyKey, propertyDescriptor) {
103
+ var _initializer, _ref;
104
+ const metadata = ensureMetadata(target);
105
+ metadata.stateProperty = propertyKey;
106
+ delete propertyDescriptor.writable;
107
+ metadata.statePropertyDefaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
108
+ delete propertyDescriptor.initializer;
109
+ return propertyDescriptor;
110
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
111
+ }
80
112
 
81
113
  /* #region CONTROLLER EXTENSIONS */
82
114
 
83
115
  /**
84
116
  * Defines that the following method is an override for the method name with the same name in the specific controller extension or base implementation.
85
- *
86
117
  * @param extensionName The name of the extension that will be overridden
87
118
  * @returns The decorated method
88
119
  */
120
+ _exports.defineState = defineState;
89
121
  function methodOverride(extensionName) {
90
122
  return function (target, propertyKey) {
91
123
  if (!target.override) {
@@ -110,7 +142,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
110
142
 
111
143
  /**
112
144
  * Defines that the method can be extended by other controller extension based on the defined overrideExecutionType.
113
- *
114
145
  * @param overrideExecution The OverrideExecution defining when the override should run (Before / After / Instead)
115
146
  * @returns The decorated method
116
147
  */
@@ -132,7 +163,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
132
163
 
133
164
  /**
134
165
  * Defines that the method will be publicly available for controller extension usage.
135
- *
136
166
  * @returns The decorated method
137
167
  */
138
168
  _exports.extensible = extensible;
@@ -148,7 +178,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
148
178
  }
149
179
  /**
150
180
  * Defines that the method will be only available for internal usage of the controller extension.
151
- *
152
181
  * @returns The decorated method
153
182
  */
154
183
  _exports.publicExtension = publicExtension;
@@ -164,7 +193,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
164
193
  }
165
194
  /**
166
195
  * Defines that the method cannot be further extended by other controller extension.
167
- *
168
196
  * @returns The decorated method
169
197
  */
170
198
  _exports.privateExtension = privateExtension;
@@ -181,7 +209,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
181
209
 
182
210
  /**
183
211
  * Defines that we are going to use instantiate a controller extension under the following variable name.
184
- *
185
212
  * @param extensionClass The controller extension that will be instantiated
186
213
  * @returns The decorated property
187
214
  */
@@ -200,7 +227,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
200
227
  /* #region CONTROL */
201
228
  /**
202
229
  * Indicates that the property shall be declared as an event on the control metadata.
203
- *
204
230
  * @returns The decorated property
205
231
  */
206
232
  _exports.usingExtension = usingExtension;
@@ -214,15 +240,14 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
214
240
  }
215
241
 
216
242
  /**
217
- * Defines the following property in the control metatada.
218
- *
243
+ * Defines the following property in the control metadata.
219
244
  * @param attributeDefinition The property definition
220
245
  * @returns The decorated property.
221
246
  */
222
247
  _exports.event = event;
223
248
  function property(attributeDefinition) {
224
249
  return function (target, propertyKey, propertyDescriptor) {
225
- var _initializer, _ref;
250
+ var _initializer2, _ref2;
226
251
  const metadata = ensureMetadata(target);
227
252
  if (attributeDefinition.bindable === undefined) {
228
253
  attributeDefinition.bindable = true;
@@ -235,22 +260,21 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
235
260
  metadata.properties[propertyKey] = attributeDefinition;
236
261
  }
237
262
  delete propertyDescriptor.writable;
238
- attributeDefinition.defaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
263
+ attributeDefinition.defaultValue ??= (_initializer2 = (_ref2 = propertyDescriptor).initializer) === null || _initializer2 === void 0 ? void 0 : _initializer2.call(_ref2);
239
264
  delete propertyDescriptor.initializer;
240
265
  return propertyDescriptor;
241
- }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
266
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
242
267
  }
243
268
 
244
269
  /**
245
- * Defines and configure the following aggregation in the control metatada.
246
- *
270
+ * Defines and configures the following aggregation in the control metadata.
247
271
  * @param aggregationDefinition The aggregation definition
248
272
  * @returns The decorated property.
249
273
  */
250
274
  _exports.property = property;
251
275
  function aggregation(aggregationDefinition) {
252
276
  return function (target, propertyKey, propertyDescriptor) {
253
- var _initializer2, _ref2;
277
+ var _initializer3, _ref3;
254
278
  const metadata = ensureMetadata(target);
255
279
  if (aggregationDefinition.multiple === undefined) {
256
280
  // UI5 defaults this to true but this is just weird...
@@ -263,15 +287,14 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
263
287
  metadata.defaultAggregation = propertyKey;
264
288
  }
265
289
  delete propertyDescriptor.writable;
266
- aggregationDefinition.defaultValue ??= (_initializer2 = (_ref2 = propertyDescriptor).initializer) === null || _initializer2 === void 0 ? void 0 : _initializer2.call(_ref2);
290
+ aggregationDefinition.defaultValue ??= (_initializer3 = (_ref3 = propertyDescriptor).initializer) === null || _initializer3 === void 0 ? void 0 : _initializer3.call(_ref3);
267
291
  delete propertyDescriptor.initializer;
268
292
  return propertyDescriptor;
269
- }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
293
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
270
294
  }
271
295
 
272
296
  /**
273
- * Defines and configure the following association in the control metatada.
274
- *
297
+ * Defines and configures the following association in the control metadata.
275
298
  * @param ui5AssociationMetadata The definition of the association.
276
299
  * @returns The decorated property
277
300
  */
@@ -285,12 +308,11 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
285
308
  delete propertyDescriptor.writable;
286
309
  delete propertyDescriptor.initializer;
287
310
  return propertyDescriptor;
288
- }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
311
+ }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
289
312
  }
290
313
 
291
314
  /**
292
315
  * Defines in the metadata that this control implements a specific interface.
293
- *
294
316
  * @param interfaceName The name of the implemented interface
295
317
  * @returns The decorated method
296
318
  */
@@ -304,7 +326,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
304
326
 
305
327
  /**
306
328
  * Indicates that the following method should also be exposed statically so we can call it from XML.
307
- *
308
329
  * @returns The decorated method
309
330
  */
310
331
  _exports.implementInterface = implementInterface;
@@ -316,7 +337,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
316
337
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
317
338
  args[_key] = arguments[_key];
318
339
  }
319
- if (args && args.length) {
340
+ if (args !== null && args !== void 0 && args.length) {
320
341
  const currentTarget = currentConstructor.getAPI(args[0]);
321
342
  currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget[propertykey.toString()](...args);
322
343
  }
@@ -326,7 +347,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
326
347
  _exports.xmlEventHandler = xmlEventHandler;
327
348
  /**
328
349
  * Indicates that the following class should define a UI5 control of the specified name.
329
- *
330
350
  * @param sTarget The fully qualified name of the UI5 class
331
351
  * @param metadataDefinition Inline metadata definition
332
352
  * @returns A class decorator that will create a ui5 class
@@ -366,7 +386,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
366
386
  }
367
387
  /**
368
388
  * Defines that the following object will hold a reference to a control through jsx templating.
369
- *
370
389
  * @returns The decorated property.
371
390
  */
372
391
  _exports.createReference = createReference;
@@ -385,18 +404,108 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
385
404
  return propertyDescriptor;
386
405
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
387
406
  }
407
+ _exports.defineReference = defineReference;
408
+ function _createStateProperty(obj, targetControl) {
409
+ var _obj$metadata;
410
+ if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.stateProperty) {
411
+ const stateModel = new JSONModel({});
412
+ targetControl.setModel(stateModel, "$componentState");
413
+ let updatingState = false;
414
+ targetControl._updateState = function () {
415
+ delete this._updateStateTimer;
416
+ if (!updatingState) {
417
+ var _onStateChange, _ref4;
418
+ updatingState = true;
419
+ (_onStateChange = (_ref4 = this).onStateChange) === null || _onStateChange === void 0 ? void 0 : _onStateChange.call(_ref4);
420
+ updatingState = false;
421
+ }
422
+ };
423
+ targetControl._updateStateDebounced = function () {
424
+ if (!this._updateStateTimer && !updatingState) {
425
+ this._updateStateTimer = setTimeout(() => {
426
+ this._updateState();
427
+ }, 200);
428
+ }
429
+ };
430
+ Object.defineProperty(targetControl, obj.metadata.stateProperty, {
431
+ configurable: true,
432
+ get: () => {
433
+ return new Proxy(stateModel, {
434
+ get: function (jsonModel, prop) {
435
+ const pathInModel = `/${prop.toString()}`;
436
+ const oObj = deepClone(jsonModel.getObject(pathInModel));
437
+ let oTarget;
438
+ if (typeof oObj === "string") {
439
+ oTarget = {
440
+ value: oObj
441
+ };
442
+ oTarget.toString = function () {
443
+ return this.value;
444
+ };
445
+ } else if (typeof oObj === "number") {
446
+ oTarget = {
447
+ value: oObj
448
+ };
449
+ oTarget.toString = function () {
450
+ return this.value.toString();
451
+ };
452
+ } else if (typeof oObj === "boolean") {
453
+ oTarget = new Boolean(oObj);
454
+ } else if (Array.isArray(oObj)) {
455
+ oTarget = new Proxy(oObj.concat(), {
456
+ get(target, p, receiver) {
457
+ const ref = Reflect.get(target, p, receiver);
458
+ if (typeof ref === "function") {
459
+ return ref.bind(target);
460
+ } else if (ref === undefined && isNaN(Number(p.toString()))) {
461
+ return {
462
+ __bindingInfo: {
463
+ model: "$componentState",
464
+ path: p
465
+ }
466
+ };
467
+ }
468
+ return ref;
469
+ }
470
+ });
471
+ } else {
472
+ oTarget = {
473
+ ...oObj
474
+ };
475
+ }
476
+ oTarget.__bindingInfo = {
477
+ model: "$componentState",
478
+ path: pathInModel
479
+ };
480
+ return oTarget;
481
+ },
482
+ set: (setStateModel, prop, value) => {
483
+ const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
484
+ targetControl._updateStateDebounced();
485
+ return setResult;
486
+ }
487
+ });
488
+ },
489
+ set: function (value) {
490
+ // Replacing the complete state
491
+ stateModel.setProperty(`/`, value);
492
+ }
493
+ });
494
+ if (obj.metadata.statePropertyDefaultValue) {
495
+ targetControl[obj.metadata.stateProperty] = obj.metadata.statePropertyDefaultValue;
496
+ }
497
+ }
498
+ }
388
499
 
389
500
  /**
390
501
  * Internal heavy lifting that will take care of creating the class property for ui5 to use.
391
- *
392
502
  * @param clazz The class prototype
393
503
  * @param name The name of the class to create
394
504
  * @param inObj The metadata object
395
505
  * @returns The metadata class
396
506
  */
397
- _exports.defineReference = defineReference;
398
507
  function registerUI5Metadata(clazz, name, inObj) {
399
- var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata;
508
+ var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata2;
400
509
  if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
401
510
  Object.getOwnPropertyNames(inObj).forEach(objName => {
402
511
  const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
@@ -432,7 +541,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
432
541
  }
433
542
  }
434
543
  });
435
- if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
544
+ if ((_obj$metadata2 = obj.metadata) !== null && _obj$metadata2 !== void 0 && _obj$metadata2.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
436
545
  for (const cExtName in obj.metadata.controllerExtensions) {
437
546
  obj[cExtName] = obj.metadata.controllerExtensions[cExtName];
438
547
  }
@@ -586,6 +695,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
586
695
  }
587
696
  }
588
697
  }
698
+ _createStateProperty(obj, this);
589
699
  };
590
700
  clazz.override = function (oExtension) {
591
701
  const pol = {};
@@ -605,4 +715,4 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/merge", "sap/base/util
605
715
  }
606
716
  return _exports;
607
717
  }, false);
608
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJsZW5ndGgiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJtZXRob2RPdmVycmlkZSIsImV4dGVuc2lvbk5hbWUiLCJwcm9wZXJ0eUtleSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsInByb3BlcnR5RGVzY3JpcHRvciIsImluaXRpYWxpemVyIiwiZXZlbnQiLCJldmVudEtleSIsInByb3BlcnR5IiwiYXR0cmlidXRlRGVmaW5pdGlvbiIsImJpbmRhYmxlIiwidW5kZWZpbmVkIiwiaXNCaW5kaW5nSW5mbyIsImdyb3VwIiwid3JpdGFibGUiLCJkZWZhdWx0VmFsdWUiLCJhZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiIsIm11bHRpcGxlIiwiaXNEZWZhdWx0IiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwiYXNzb2NpYXRpb24iLCJ1aTVBc3NvY2lhdGlvbk1ldGFkYXRhIiwiaW1wbGVtZW50SW50ZXJmYWNlIiwiaW50ZXJmYWNlTmFtZSIsInhtbEV2ZW50SGFuZGxlciIsInByb3BlcnR5a2V5IiwiY3VycmVudENvbnN0cnVjdG9yIiwiYXJncyIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsIkFycmF5IiwiaXNBcnJheSIsImNvbmNhdCIsInJlZ2lzdGVyVUk1TWV0YWRhdGEiLCJjcmVhdGVSZWZlcmVuY2UiLCJjdXJyZW50Iiwic2V0Q3VycmVudCIsIm9Db250cm9sSW5zdGFuY2UiLCJkZWZpbmVSZWZlcmVuY2UiLCJCYXNlT2JqZWN0IiwiaXNPYmplY3RBIiwiY2xhenoiLCJuYW1lIiwiaW5PYmoiLCJPYmplY3QiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsIm9iak5hbWUiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJvYmoiLCJiYXNlVHlwZSIsImdldFByb3RvdHlwZU9mIiwiZ2V0U3RlcmVvdHlwZSIsInJlbmRlcmVyRGVmaW5pdGlvbiIsInJlbmRlcmVyIiwicmVuZGVyIiwiYXBpVmVyc2lvbiIsImtleXMiLCJlIiwiY0V4dE5hbWUiLCJvdXRwdXQiLCJleHRlbmQiLCJmbkluaXQiLCJpbml0IiwiYXBwbHkiLCJhUHJvcGVydHlLZXlzIiwicHJvcGVydHlEZWYiLCJwcm9wZXJ0eURlZmF1bHQiLCJfYmluZGluZ1Byb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsImNvbmZpZ3VyYWJsZSIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eSIsImJpbmRpbmdQcm9wZXJ0eVZhbHVlIiwicHJvcFZhbHVlIiwic2V0UHJvcGVydHkiLCJfYXBwbHlpbmdTZXR0aW5ncyIsImFBZ2dyZWdhdGlvbktleXMiLCJhZ2dyZWdhdGlvbktleSIsImFnZ3JlZ2F0aW9uRGVmIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkNvbnRlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImFBc3NvY2lhdGlvbktleXMiLCJhc3NvY2lhdGlvbktleSIsInNldEFzc29jaWF0aW9uIiwiZ2V0QXNzb2NpYXRpb24iLCJyZWZlcmVuY2VQcm9wZXJ0aWVzIiwidmFsdWUiLCJtZXRob2ROYW1lIiwibWV0aG9kRGVmaW5pdGlvbiIsIm1ldGhvZEhvbGRlciIsIm1ldGhvZEFycmF5cyIsInJldmVyc2UiLCJtZXRob2RBcmdzIiwiYXJnIiwib0V4dGVuc2lvbiIsInBvbCIsIm9DbGFzcyIsIk1ldGFkYXRhIiwiY3JlYXRlQ2xhc3MiLCJ1aWQiLCJDb250cm9sbGVyTWV0YWRhdGEiLCJfc3RhdGljT3ZlcnJpZGUiLCJfb3ZlcnJpZGUiLCJPYmplY3RQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDbGFzc1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGV4cGVjdGVkQW5ub3RhdGlvbnM/OiBzdHJpbmdbXTtcblx0ZXhwZWN0ZWRUeXBlcz86IHN0cmluZ1tdO1xuXHRhbGxvd2VkVmFsdWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVUk1QWdncmVnYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRhbHRUeXBlcz86IHN0cmluZ1tdO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGlzRGVmYXVsdD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGRlZmF1bHRDbGFzcz86IHVua25vd247XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcblx0dmlzaWJpbGl0eT86IHN0cmluZztcblx0Zm9yd2FyZGluZz86IG9iamVjdDtcbn07XG5leHBvcnQgdHlwZSBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24gPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcblx0Y29udHJvbGxlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24+O1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBVSTVQcm9wZXJ0eU1ldGFkYXRhPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhPjtcblx0cmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cdGFzc29jaWF0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QXNzb2NpYXRpb25NZXRhZGF0YT47XG5cdG1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uPjtcblx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cdGludGVyZmFjZXM6IHN0cmluZ1tdO1xuXHRsaWJyYXJ5Pzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRjb25maWc/OiB7XG5cdFx0ZnVsbFdpZHRoPzogYm9vbGVhbjtcblx0fTtcblx0bWFuaWZlc3Q/OiBzdHJpbmcgfCB1bmtub3duO1xuXHRyZXR1cm5UeXBlcz86IHN0cmluZ1tdO1xuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiB1bmtub3duO1xufTtcbnR5cGUgVUk1Q29udHJvbGxlckRlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRvdmVycmlkZXM/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1Q29udHJvbERlZmluaXRpb24gPSB7XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0b3ZlcnJpZGU/OiB1bmtub3duO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVBUElDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xuXHRfX2FwaVJlZ2lzdGVyZWQ6IGJvb2xlYW47XG59ICYge1xuXHRbazogc3RyaW5nXTogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBYTUxFdmVudEhvbGRlciA9IHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xufTtcblxudHlwZSBDb250cm9sUHJvcGVydHlOYW1lczxUPiA9IHtcblx0Ly8gbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIFRTIGNvbXBpbGVyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBhcnRpYWw8UGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGFydGlhbDxQaWNrPFQsIEs+PiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBDb252ZXJ0Q29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIFwibWV0YVBhdGhcIiB8IFwiY29udGV4dFBhdGhcIiA/IHN0cmluZyA6IFRbS107XG59O1xuZXhwb3J0IHR5cGUgU3RyaWN0UHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGljazxULCBLPiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBVSTVBY2Nlc3NvcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIGdldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgZ2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAoKSA9PiBUW1BdO1xufTtcbmV4cG9ydCB0eXBlIFVJNVNldHRlcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIHNldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgc2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAodmFsdWU6IFRbUF0pID0+IFQ7XG59O1xuZXhwb3J0IHR5cGUgRW5oYW5jZVdpdGhVSTU8VD4gPSB7XG5cdG5ldyAocHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xuXHRuZXcgKHNJZDogc3RyaW5nLCBwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG59ICYgVCAmXG5cdFVJNUFjY2Vzc29yczxUPiAmXG5cdFVJNVNldHRlcnM8VD47XG5cbmV4cG9ydCB0eXBlIEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uID0gXCJJbnN0ZWFkXCIgfCBcIkJlZm9yZVwiIHwgXCJBZnRlclwiIHwgXCJBZnRlckFzeW5jXCIgfCBcIkJlZm9yZUFzeW5jXCI7XG5cbmNvbnN0IGVuc3VyZU1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24ge1xuXHR0YXJnZXQubWV0YWRhdGEgPSBtZXJnZShcblx0XHR7XG5cdFx0XHRjb250cm9sbGVyRXh0ZW5zaW9uczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRyZWZlcmVuY2VzOiB7fSxcblx0XHRcdGFzc29jaWF0aW9uczoge30sXG5cdFx0XHRtZXRob2RzOiB7fSxcblx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRpbnRlcmZhY2VzOiBbXVxuXHRcdH0sXG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID8/IHt9XG5cdCkgYXMgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRoYXQgd2lsbCBmaW5kIHRoZSBjb3JyZWN0IEFQSSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udHJvbCBoaWVyYXJjaHkuXG4gKlxuICogQHBhcmFtIHRhcmdldFxuICogQHJldHVybnMgVGhlIHByb3BlciBnZXRBUEkgZnVuY3Rpb24gZm9yIHRoaXMgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldDogVUk1QVBJQ29udHJvbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBVSTVBUElDb250cm9sPihcblx0XHR0aGlzOiBVSTVBUElDb250cm9sLFxuXHRcdG9FdmVudDogVUk1RXZlbnQsXG5cdFx0YXBpRlFOOiBzdHJpbmcgPSB0YXJnZXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKClcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0aWYgKHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKSB7XG5cdFx0XHRvU291cmNlID0gdGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24ob1NvdXJjZSkgPz8gb1NvdXJjZTtcblx0XHR9XG5cdFx0d2hpbGUgKG9Tb3VyY2UgJiYgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikgJiYgb1NvdXJjZS5nZXRQYXJlbnQpIHtcblx0XHRcdGlmICh0aGlzLmlzRGVwZW5kZW50Qm91bmQpIHtcblx0XHRcdFx0Y29uc3Qgb0RlcGVuZGVudHMgPSAob1NvdXJjZSBhcyBDb250cm9sKS5nZXREZXBlbmRlbnRzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NvcnJlY3REZXBlbmRlbnQgPSBvRGVwZW5kZW50cy5maW5kKChvRGVwZW5kZW50OiBVSTVFbGVtZW50KSA9PiBvRGVwZW5kZW50LmlzQShhcGlGUU4pKTtcblx0XHRcdFx0aWYgKGhhc0NvcnJlY3REZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRvU291cmNlID0gaGFzQ29ycmVjdERlcGVuZGVudCBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9Tb3VyY2UgfHwgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2VNYXAgPSB0aGlzLmluc3RhbmNlTWFwLmdldCh0aGlzKSBhcyBUW107XG5cdFx0XHRvU291cmNlID0gb1NvdXJjZU1hcD8uW29Tb3VyY2VNYXAubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRDb250cm9sO1xuXHRcdGlmIChvU291cmNlICYmIG9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdHRhcmdldENvbnRyb2wgPSBvU291cmNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcblx0fTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgd2hlbiBhbiB4bWxFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlIGBnZXRBUElgIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGFzc2lnbmVkLlxuICpcbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGhvbGQgdGhlIHN0YXRpYyBmdW5jdGlvbnNcbiAqL1xuY29uc3QgZW5zdXJlR2V0QVBJID0gZnVuY3Rpb24gKHRhcmdldDogVUk1QVBJQ29udHJvbCk6IHZvaWQge1xuXHRpZiAoIXRhcmdldC5fX2FwaVJlZ2lzdGVyZWQpIHtcblx0XHR0YXJnZXQuX19hcGlSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHR0YXJnZXQuaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuXHRcdHRhcmdldC5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKF9pbnN0YW5jZTogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGlmICghdGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSkge1xuXHRcdFx0XHR0aGlzLmluc3RhbmNlTWFwLnNldChfaW5zdGFuY2UuY29uc3RydWN0b3IsIFtdKTtcblx0XHRcdH1cblx0XHRcdCh0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpIGFzIG9iamVjdFtdKS5wdXNoKF9pbnN0YW5jZSk7XG5cdFx0fTtcblx0XHR0YXJnZXQuZ2V0QVBJID0gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldCk7XG5cdH1cbn07XG5cbi8qICNyZWdpb24gQ09OVFJPTExFUiBFWFRFTlNJT05TICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kIG5hbWUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzcGVjaWZpYyBjb250cm9sbGVyIGV4dGVuc2lvbiBvciBiYXNlIGltcGxlbWVudGF0aW9uLlxuICpcbiAqIEBwYXJhbSBleHRlbnNpb25OYW1lIFRoZSBuYW1lIG9mIHRoZSBleHRlbnNpb24gdGhhdCB3aWxsIGJlIG92ZXJyaWRkZW5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXRob2RPdmVycmlkZShleHRlbnNpb25OYW1lPzogc3RyaW5nKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSkge1xuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGUgPSB7fTtcblx0XHR9XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGVzKSB7XG5cdFx0XHR0YXJnZXQub3ZlcnJpZGVzID0ge307XG5cdFx0fVxuXHRcdGxldCBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0Lm92ZXJyaWRlcztcblx0XHRpZiAoZXh0ZW5zaW9uTmFtZSkge1xuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbikge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbiA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0aWYgKCFjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSkge1xuXHRcdFx0XHRjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXSA9IHt9O1xuXHRcdFx0fVxuXHRcdFx0Y3VycmVudFRhcmdldCA9IGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdO1xuXHRcdH1cblx0XHRjdXJyZW50VGFyZ2V0W3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0gKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj4pW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldO1xuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIGNhbiBiZSBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbiBiYXNlZCBvbiB0aGUgZGVmaW5lZCBvdmVycmlkZUV4ZWN1dGlvblR5cGUuXG4gKlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByaXZhdGVFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IGZhbHNlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW5ub3QgYmUgZnVydGhlciBleHRlbmRlZCBieSBvdGhlciBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gZXZlbnQoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIGV2ZW50S2V5KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGF0YWRhLlxuICpcbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbiBUaGUgYWdncmVnYXRpb24gZGVmaW5pdGlvblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjogVUk1QWdncmVnYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Ly8gVUk1IGRlZmF1bHRzIHRoaXMgdG8gdHJ1ZSBidXQgdGhpcyBpcyBqdXN0IHdlaXJkLi4uXG5cdFx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24ubXVsdGlwbGUgPSBmYWxzZTtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRtZXRhZGF0YS5hZ2dyZWdhdGlvbnNbcHJvcGVydHlLZXldID0gYWdncmVnYXRpb25EZWZpbml0aW9uO1xuXHRcdH1cblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLmlzRGVmYXVsdCkge1xuXHRcdFx0bWV0YWRhdGEuZGVmYXVsdEFnZ3JlZ2F0aW9uID0gcHJvcGVydHlLZXk7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlIHRoZSBmb2xsb3dpbmcgYXNzb2NpYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YXRhZGEuXG4gKlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIGluIHRoZSBtZXRhZGF0YSB0aGF0IHRoaXMgY29udHJvbCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBpbnRlcmZhY2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbXBsZW1lbnRJbnRlcmZhY2UoaW50ZXJmYWNlTmFtZTogc3RyaW5nKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cblx0XHRtZXRhZGF0YS5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlTmFtZSk7XG5cdH07XG59XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2Qgc2hvdWxkIGFsc28gYmUgZXhwb3NlZCBzdGF0aWNhbGx5IHNvIHdlIGNhbiBjYWxsIGl0IGZyb20gWE1MLlxuICpcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3MgJiYgYXJncy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhcmdldCA9IGN1cnJlbnRDb25zdHJ1Y3Rvci5nZXRBUEkoYXJnc1swXSBhcyBVSTVFdmVudCk7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQ/Lltwcm9wZXJ0eWtleS50b1N0cmluZygpXSguLi5hcmdzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xufVxuXG50eXBlIFVJNUNvbnRyb2xBbmRNb3JlID0gdHlwZW9mIENvbnRyb2wgJlxuXHRGdW5jdGlvbiAmIHtcblx0XHRyZWdpc3Rlckluc3RhbmNlPzogRnVuY3Rpb247XG5cdFx0b3ZlcnJpZGU/OiBGdW5jdGlvbjtcblx0XHRyZW5kZXJlcj86IHVua25vd247XG5cdFx0cmVuZGVyOiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdH07XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBjbGFzcyBzaG91bGQgZGVmaW5lIGEgVUk1IGNvbnRyb2wgb2YgdGhlIHNwZWNpZmllZCBuYW1lLlxuICpcbiAqIEBwYXJhbSBzVGFyZ2V0IFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgVUk1IGNsYXNzXG4gKiBAcGFyYW0gbWV0YWRhdGFEZWZpbml0aW9uIElubGluZSBtZXRhZGF0YSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBBIGNsYXNzIGRlY29yYXRvciB0aGF0IHdpbGwgY3JlYXRlIGEgdWk1IGNsYXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVVSTVDbGFzcyhzVGFyZ2V0OiBzdHJpbmcsIG1ldGFkYXRhRGVmaW5pdGlvbj86IFBhcnRpYWw8VUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbj4pOiBDbGFzc0RlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAoY29uc3RydWN0b3I6IFVJNUNvbnRyb2xBbmRNb3JlKSB7XG5cdFx0aWYgKCFjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEpIHtcblx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSA9IHt9O1xuXHRcdH1cblx0XHRpZiAobWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdFx0aWYgKGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSB7XG5cdFx0XHRcdFx0aWYgKEFycmF5LmlzQXJyYXkoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pKSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLmNvbmNhdChcblx0XHRcdFx0XHRcdFx0bWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXVxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSB7XG5cdFx0XHRcdFx0XHRcdC4uLmNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldLFxuXHRcdFx0XHRcdFx0XHQuLi4obWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXSBhcyBvYmplY3QpXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY29uc3RydWN0b3IsIHNUYXJnZXQsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG5cdH0gYXMgQ2xhc3NEZWNvcmF0b3I7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWZlcmVuY2U8VCBleHRlbmRzIFVJNUVsZW1lbnQ+KCk6IFJlZjxUPiB7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVCxcblx0XHRzZXRDdXJyZW50OiBmdW5jdGlvbiAob0NvbnRyb2xJbnN0YW5jZTogVCk6IHZvaWQge1xuXHRcdFx0dGhpcy5jdXJyZW50ID0gb0NvbnRyb2xJbnN0YW5jZTtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgZm9sbG93aW5nIG9iamVjdCB3aWxsIGhvbGQgYSByZWZlcmVuY2UgdG8gYSBjb250cm9sIHRocm91Z2gganN4IHRlbXBsYXRpbmcuXG4gKlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaGVhdnkgbGlmdGluZyB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGNyZWF0aW5nIHRoZSBjbGFzcyBwcm9wZXJ0eSBmb3IgdWk1IHRvIHVzZS5cbiAqXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG5cdGNsYXp6Lm92ZXJyaWRlID0gZnVuY3Rpb24gKG9FeHRlbnNpb246IHVua25vd24pOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgcG9sID0ge307XG5cdFx0KHBvbCBhcyBGdW5jdGlvbikuY29uc3RydWN0b3IgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogRnVuY3Rpb24ge1xuXHRcdFx0cmV0dXJuIGNsYXp6LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NsYXNzID0gKE1ldGFkYXRhIGFzIHVua25vd24gYXMgeyBjcmVhdGVDbGFzczogRnVuY3Rpb24gfSkuY3JlYXRlQ2xhc3MoXG5cdFx0XHRjbGF6eixcblx0XHRcdGBhbm9ueW1vdXNFeHRlbnNpb25+JHt1aWQoKX1gLFxuXHRcdFx0cG9sLFxuXHRcdFx0Q29udHJvbGxlck1ldGFkYXRhXG5cdFx0KTtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fc3RhdGljT3ZlcnJpZGUgPSBvRXh0ZW5zaW9uO1xuXHRcdG9DbGFzcy5nZXRNZXRhZGF0YSgpLl9vdmVycmlkZSA9IChjbGF6ei5nZXRNZXRhZGF0YSgpIGFzIHsgX292ZXJyaWRlPzogdW5rbm93biB9KS5fb3ZlcnJpZGU7XG5cdFx0cmV0dXJuIG9DbGFzcztcblx0fTtcblxuXHRPYmplY3RQYXRoLnNldChuYW1lLCBvdXRwdXQpO1xuXG5cdHJldHVybiBvdXRwdXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7QUFBQTtBQUFBO0FBQUE7Ozs7OztFQW9J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
718
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJiaW5kU3RhdGVBcnJheSIsInN0YXRlUHJvcGVydHkiLCJfX2JpbmRpbmdJbmZvIiwicGF0aCIsIm1vZGVsIiwiX2V4cG9ydHMiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwiX2luaXRpYWxpemVyIiwiX3JlZiIsIndyaXRhYmxlIiwic3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSIsImluaXRpYWxpemVyIiwiY2FsbCIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJfaW5pdGlhbGl6ZXIyIiwiX3JlZjIiLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiX2luaXRpYWxpemVyMyIsIl9yZWYzIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsIl9jcmVhdGVTdGF0ZVByb3BlcnR5Iiwib2JqIiwiX29iaiRtZXRhZGF0YSIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInVwZGF0aW5nU3RhdGUiLCJfdXBkYXRlU3RhdGUiLCJfdXBkYXRlU3RhdGVUaW1lciIsIl9vblN0YXRlQ2hhbmdlIiwiX3JlZjQiLCJvblN0YXRlQ2hhbmdlIiwiX3VwZGF0ZVN0YXRlRGVib3VuY2VkIiwic2V0VGltZW91dCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiUHJveHkiLCJqc29uTW9kZWwiLCJwcm9wIiwicGF0aEluTW9kZWwiLCJvT2JqIiwiZGVlcENsb25lIiwiZ2V0T2JqZWN0Iiwib1RhcmdldCIsInZhbHVlIiwiQm9vbGVhbiIsInAiLCJyZWNlaXZlciIsInJlZiIsIlJlZmxlY3QiLCJiaW5kIiwiaXNOYU4iLCJOdW1iZXIiLCJzZXRTdGF0ZU1vZGVsIiwic2V0UmVzdWx0Iiwic2V0UHJvcGVydHkiLCJjbGF6eiIsIm5hbWUiLCJpbk9iaiIsIl9jbGF6eiRnZXRNZXRhZGF0YSIsIl9jbGF6eiRnZXRNZXRhZGF0YTIiLCJfaW5PYmokbWV0YWRhdGEiLCJfY2xhenokbWV0YWRhdGEiLCJfb2JqJG1ldGFkYXRhMiIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwib2JqTmFtZSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImJhc2VUeXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRTdGVyZW90eXBlIiwicmVuZGVyZXJEZWZpbml0aW9uIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJhcGlWZXJzaW9uIiwia2V5cyIsImUiLCJjRXh0TmFtZSIsIm91dHB1dCIsImV4dGVuZCIsImZuSW5pdCIsImluaXQiLCJfdGhpcyIsIl9sZW4yIiwiX2tleTIiLCJhcHBseSIsImFQcm9wZXJ0eUtleXMiLCJwcm9wZXJ0eURlZiIsInByb3BlcnR5RGVmYXVsdCIsIl9iaW5kaW5nUHJvcGVydGllcyIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eSIsImJpbmRpbmdQcm9wZXJ0eVZhbHVlIiwicHJvcFZhbHVlIiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJhZ2dyZWdhdGlvbkRlZiIsInNldEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25Db250ZW50IiwiZ2V0QWdncmVnYXRpb24iLCJhQXNzb2NpYXRpb25LZXlzIiwiYXNzb2NpYXRpb25LZXkiLCJzZXRBc3NvY2lhdGlvbiIsImdldEFzc29jaWF0aW9uIiwicmVmZXJlbmNlUHJvcGVydGllcyIsIm1ldGhvZE5hbWUiLCJtZXRob2REZWZpbml0aW9uIiwibWV0aG9kSG9sZGVyIiwibWV0aG9kQXJyYXlzIiwicmV2ZXJzZSIsIl9sZW4zIiwibWV0aG9kQXJncyIsIl9rZXkzIiwiYXJnIiwib0V4dGVuc2lvbiIsInBvbCIsIl9sZW40IiwiX2tleTQiLCJvQ2xhc3MiLCJNZXRhZGF0YSIsImNyZWF0ZUNsYXNzIiwidWlkIiwiQ29udHJvbGxlck1ldGFkYXRhIiwiX3N0YXRpY092ZXJyaWRlIiwiX292ZXJyaWRlIiwiT2JqZWN0UGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ2xhc3NTdXBwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgeyBob29rYWJsZSB9IGZyb20gXCJzYXAvZmUvYmFzZS9Ib29rU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGV4cGVjdGVkQW5ub3RhdGlvbnM/OiBzdHJpbmdbXTtcblx0ZXhwZWN0ZWRUeXBlcz86IHN0cmluZ1tdO1xuXHRhbGxvd2VkVmFsdWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVUk1QWdncmVnYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRhbHRUeXBlcz86IHN0cmluZ1tdO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGlzRGVmYXVsdD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGRlZmF1bHRDbGFzcz86IHVua25vd247XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcblx0dmlzaWJpbGl0eT86IHN0cmluZztcblx0Zm9yd2FyZGluZz86IG9iamVjdDtcbn07XG5leHBvcnQgdHlwZSBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24gPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcblx0Y29udHJvbGxlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24+O1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBVSTVQcm9wZXJ0eU1ldGFkYXRhPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhPjtcblx0cmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cdGFzc29jaWF0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QXNzb2NpYXRpb25NZXRhZGF0YT47XG5cdG1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uPjtcblx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cdGludGVyZmFjZXM6IHN0cmluZ1tdO1xuXHRsaWJyYXJ5Pzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRjb25maWc/OiB7XG5cdFx0ZnVsbFdpZHRoPzogYm9vbGVhbjtcblx0fTtcblx0c3RhdGVQcm9wZXJ0eT86IHN0cmluZztcblx0c3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdG1hbmlmZXN0Pzogc3RyaW5nIHwgdW5rbm93bjtcblx0cmV0dXJuVHlwZXM/OiBzdHJpbmdbXTtcblx0YnVpbGRpbmdCbG9ja01ldGFkYXRhPzogdW5rbm93bjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG50eXBlIFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZT86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0b3ZlcnJpZGVzPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUNvbnRyb2xEZWZpbml0aW9uID0ge1xuXHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdG92ZXJyaWRlPzogdW5rbm93bjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1QVBJQ29udHJvbCA9IENvbnRyb2wgJiB7XG5cdGdldEFQSShldmVudDogVUk1RXZlbnQsIGZxZG4/OiBzdHJpbmcpOiBVSTVBUElDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRpbnN0YW5jZU1hcDogV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPjtcblx0X19hcGlSZWdpc3RlcmVkOiBib29sZWFuO1xufSAmIHtcblx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgWE1MRXZlbnRIb2xkZXIgPSB7XG5cdGdldEFQSShldmVudDogVUk1RXZlbnQsIGZxZG4/OiBzdHJpbmcpOiBVSTVBUElDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRpbnN0YW5jZU1hcDogV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPjtcbn07XG5cbnR5cGUgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4gPSB7XG5cdC8vIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBUUyBjb21waWxlclxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcbmV4cG9ydCB0eXBlIFByb3BlcnRpZXNPZjxULCBLIGV4dGVuZHMga2V5b2YgVCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4gPSBQYXJ0aWFsPFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+PiAmXG5cdChLIGV4dGVuZHMga2V5b2YgVCA/IFBhcnRpYWw8UGljazxULCBLPj4gOiB7fSkgJlxuXHQkQ29udHJvbFNldHRpbmdzO1xuZXhwb3J0IHR5cGUgQ29udmVydENvbnRleHRUb1N0cmluZzxUPiA9IHtcblx0W0sgaW4ga2V5b2YgVF06IEsgZXh0ZW5kcyBcIm1ldGFQYXRoXCIgfCBcImNvbnRleHRQYXRoXCIgPyBzdHJpbmcgOiBUW0tdO1xufTtcbnR5cGUgQ29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENvbnRleHQgfCB1bmRlZmluZWQgPyBzdHJpbmcgfCB1bmRlZmluZWQgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mQnVpbGRpbmdCbG9jazxUPiA9IENvbnRleHRUb1N0cmluZzxQcm9wZXJ0aWVzT2Y8VD4+O1xuZXhwb3J0IHR5cGUgU3RyaWN0UHJvcGVydGllc09mPFQ+ID0gUGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj47XG5leHBvcnQgdHlwZSBVSTVBY2Nlc3NvcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIGdldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgZ2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAoKSA9PiBUW1BdO1xufTtcbmV4cG9ydCB0eXBlIFVJNVNldHRlcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIHNldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgc2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAodmFsdWU6IFRbUF0pID0+IFQ7XG59O1xuZXhwb3J0IHR5cGUgRW5oYW5jZVdpdGhVSTU8VD4gPSB7XG5cdG5ldyAocHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xuXHRuZXcgKHNJZDogc3RyaW5nLCBwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG59ICYgVCAmXG5cdFVJNUFjY2Vzc29yczxUPiAmXG5cdFVJNVNldHRlcnM8VD47XG5cbmV4cG9ydCB0eXBlIEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uID0gXCJJbnN0ZWFkXCIgfCBcIkJlZm9yZVwiIHwgXCJBZnRlclwiIHwgXCJBZnRlckFzeW5jXCIgfCBcIkJlZm9yZUFzeW5jXCI7XG5cbmNvbnN0IGVuc3VyZU1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24ge1xuXHR0YXJnZXQubWV0YWRhdGEgPSBtZXJnZShcblx0XHR7XG5cdFx0XHRjb250cm9sbGVyRXh0ZW5zaW9uczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRyZWZlcmVuY2VzOiB7fSxcblx0XHRcdGFzc29jaWF0aW9uczoge30sXG5cdFx0XHRtZXRob2RzOiB7fSxcblx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRpbnRlcmZhY2VzOiBbXVxuXHRcdH0sXG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID8/IHt9XG5cdCkgYXMgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRoYXQgd2lsbCBmaW5kIHRoZSBjb3JyZWN0IEFQSSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udHJvbCBoaWVyYXJjaHkuXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcmV0dXJucyBUaGUgcHJvcGVyIGdldEFQSSBmdW5jdGlvbiBmb3IgdGhpcyBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0OiBVSTVBUElDb250cm9sKSB7XG5cdHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIFVJNUFQSUNvbnRyb2w+KFxuXHRcdHRoaXM6IFVJNUFQSUNvbnRyb2wsXG5cdFx0b0V2ZW50OiBVSTVFdmVudCxcblx0XHRhcGlGUU46IHN0cmluZyA9IHRhcmdldC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKVxuXHQpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBNYW5hZ2VkT2JqZWN0IHwgbnVsbDtcblx0XHRpZiAodGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24pIHtcblx0XHRcdG9Tb3VyY2UgPSB0YXJnZXQuX2dldEFQSUV4dGVuc2lvbihvU291cmNlKSA/PyBvU291cmNlO1xuXHRcdH1cblx0XHR3aGlsZSAob1NvdXJjZSAmJiAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSAmJiBvU291cmNlLmdldFBhcmVudCkge1xuXHRcdFx0aWYgKHRoaXMuaXNEZXBlbmRlbnRCb3VuZCkge1xuXHRcdFx0XHRjb25zdCBvRGVwZW5kZW50cyA9IChvU291cmNlIGFzIENvbnRyb2wpLmdldERlcGVuZGVudHMoKTtcblx0XHRcdFx0Y29uc3QgaGFzQ29ycmVjdERlcGVuZGVudCA9IG9EZXBlbmRlbnRzLmZpbmQoKG9EZXBlbmRlbnQ6IFVJNUVsZW1lbnQpID0+IG9EZXBlbmRlbnQuaXNBKGFwaUZRTikpO1xuXHRcdFx0XHRpZiAoaGFzQ29ycmVjdERlcGVuZGVudCkge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBoYXNDb3JyZWN0RGVwZW5kZW50IGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghb1NvdXJjZSB8fCAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZU1hcCA9IHRoaXMuaW5zdGFuY2VNYXAuZ2V0KHRoaXMpIGFzIFRbXTtcblx0XHRcdG9Tb3VyY2UgPSBvU291cmNlTWFwPy5bb1NvdXJjZU1hcC5sZW5ndGggLSAxXTtcblx0XHR9XG5cdFx0bGV0IHRhcmdldENvbnRyb2w7XG5cdFx0aWYgKG9Tb3VyY2UgJiYgb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbCA9IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHJldHVybiB0YXJnZXRDb250cm9sO1xuXHR9O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB3aGVuIGFuIHhtbEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGUgYGdldEFQSWAgZnVuY3Rpb24gaXMgcHJvcGVybHkgYXNzaWduZWQuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHNob3VsZCBob2xkIHRoZSBzdGF0aWMgZnVuY3Rpb25zXG4gKi9cbmNvbnN0IGVuc3VyZUdldEFQSSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUFQSUNvbnRyb2wpOiB2b2lkIHtcblx0aWYgKCF0YXJnZXQuX19hcGlSZWdpc3RlcmVkKSB7XG5cdFx0dGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCA9IHRydWU7XG5cdFx0dGFyZ2V0Lmluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT4oKTtcblx0XHR0YXJnZXQucmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uIChfaW5zdGFuY2U6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRpZiAoIXRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikpIHtcblx0XHRcdFx0dGhpcy5pbnN0YW5jZU1hcC5zZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yLCBbXSk7XG5cdFx0XHR9XG5cdFx0XHQodGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSBhcyBvYmplY3RbXSkucHVzaChfaW5zdGFuY2UpO1xuXHRcdH07XG5cdFx0dGFyZ2V0LmdldEFQSSA9IHByZXBhcmVHZXRBUElGdW5jdGlvbih0YXJnZXQpO1xuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBTdGF0ZU9mPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gUmVhZG9ubHlBcnJheTxVPiAmIFBhcnRpYWw8VT4gOiBUW0tdO1xufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvSG9sZGVyID0ge1xuXHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsOiBzdHJpbmc7XG5cdH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGJpbmRpbmcgaW5mbyBmb3IgYW4gYXJyYXkgcHJvcGVydHkgY29taW5nIGZyb20gdGhlIHN0YXRlLlxuICogQHBhcmFtIHN0YXRlUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGlvbiBiaW5kaW5nIGluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRTdGF0ZUFycmF5KHN0YXRlUHJvcGVydHk6IHJlYWRvbmx5IG9iamVjdFtdKTogQWdncmVnYXRpb25CaW5kaW5nSW5mbyB8IHVuZGVmaW5lZCB7XG5cdGlmICgoc3RhdGVQcm9wZXJ0eSBhcyB1bmtub3duIGFzIEJpbmRpbmdJbmZvSG9sZGVyKS5fX2JpbmRpbmdJbmZvICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0aDogKHN0YXRlUHJvcGVydHkgYXMgdW5rbm93biBhcyBCaW5kaW5nSW5mb0hvbGRlcikuX19iaW5kaW5nSW5mby5wYXRoLFxuXHRcdFx0bW9kZWw6IChzdGF0ZVByb3BlcnR5IGFzIHVua25vd24gYXMgQmluZGluZ0luZm9Ib2xkZXIpLl9fYmluZGluZ0luZm8ubW9kZWxcblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogQWxsb3dzIHRvIGRlZmluZSBhIHByb3BlcnR5IHRoYXQgd2lsbCBob2xkIHRoZSBjb250cm9sIHN0YXRlLlxuICpcbiAqIFByb3BlcnRpZXMgZGVmaW5lZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGUgY29udHJvbCBzdGF0ZSB3aGVuIHVzZWQgaW4gSlNYLlxuICogQXJyYXlzIG5lZWQgdG8gYmUgYm91bmQgdXNpbmcgdGhlIGBiaW5kU3RhdGVgIGZ1bmN0aW9uLlxuICogQGV4cGVyaW1lbnRhbFxuICogQHJldHVybnMgQSBwcm9wZXJ0eSBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVN0YXRlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHkgPSBwcm9wZXJ0eUtleTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kT3ZlcnJpZGUoZXh0ZW5zaW9uTmFtZT86IHN0cmluZyk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZSkge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlID0ge307XG5cdFx0fVxuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlcykge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlcyA9IHt9O1xuXHRcdH1cblx0XHRsZXQgY3VycmVudFRhcmdldCA9IHRhcmdldC5vdmVycmlkZXM7XG5cdFx0aWYgKGV4dGVuc2lvbk5hbWUpIHtcblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb24pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXTtcblx0XHR9XG5cdFx0Y3VycmVudFRhcmdldFtwcm9wZXJ0eUtleS50b1N0cmluZygpXSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+KVtwcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24gYmFzZWQgb24gdGhlIGRlZmluZWQgb3ZlcnJpZGVFeGVjdXRpb25UeXBlLlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaWNFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IHRydWU7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgb25seSBhdmFpbGFibGUgZm9yIGludGVybmFsIHVzYWdlIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBleHRlbnNpb25DbGFzcyBUaGUgY29udHJvbGxlciBleHRlbnNpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNpbmdFeHRlbnNpb24oZXh0ZW5zaW9uQ2xhc3M6IHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRtZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IGV4dGVuc2lvbkNsYXNzO1xuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qICNlbmRyZWdpb24gKi9cblxuLyogI3JlZ2lvbiBDT05UUk9MICovXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiBldmVudCBvbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb24gVGhlIHByb3BlcnR5IGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShhdHRyaWJ1dGVEZWZpbml0aW9uOiBVSTVQcm9wZXJ0eU1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSBmYWxzZTtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZ3JvdXAgPSBcIkRhdGFcIjtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBhdHRyaWJ1dGVEZWZpbml0aW9uO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhZ2dyZWdhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3M/Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3Moc1RhcmdldDogc3RyaW5nLCBtZXRhZGF0YURlZmluaXRpb24/OiBQYXJ0aWFsPFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24+KTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdG9yOiBVSTVDb250cm9sQW5kTW9yZSkge1xuXHRcdGlmICghY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhKSB7XG5cdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEgPSB7fTtcblx0XHR9XG5cdFx0aWYgKG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSkge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0ge1xuXHRcdFx0XHRcdFx0XHQuLi5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSxcblx0XHRcdFx0XHRcdFx0Li4uKG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl0gYXMgb2JqZWN0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWdpc3RlclVJNU1ldGFkYXRhKGNvbnN0cnVjdG9yLCBzVGFyZ2V0LCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmZXJlbmNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50PigpOiBSZWY8VD4ge1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQsXG5cdFx0c2V0Q3VycmVudDogZnVuY3Rpb24gKG9Db250cm9sSW5zdGFuY2U6IFQpOiB2b2lkIHtcblx0XHRcdHRoaXMuY3VycmVudCA9IG9Db250cm9sSW5zdGFuY2U7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBvYmplY3Qgd2lsbCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCB0aHJvdWdoIGpzeCB0ZW1wbGF0aW5nLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdGF0ZVByb3BlcnR5KFxuXHRvYmo6IFVJNUNvbnRyb2xEZWZpbml0aW9uLFxuXHR0YXJnZXRDb250cm9sOiBDb250cm9sICYgeyBfdXBkYXRlU3RhdGU6IEZ1bmN0aW9uOyBfdXBkYXRlU3RhdGVEZWJvdW5jZWQ6IEZ1bmN0aW9uOyBfdXBkYXRlU3RhdGVUaW1lcjogdW5rbm93biB9XG4pOiB2b2lkIHtcblx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IHN0YXRlTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHR0YXJnZXRDb250cm9sLnNldE1vZGVsKHN0YXRlTW9kZWwsIFwiJGNvbXBvbmVudFN0YXRlXCIpO1xuXHRcdGxldCB1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGUgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRkZWxldGUgdGhpcy5fdXBkYXRlU3RhdGVUaW1lcjtcblx0XHRcdGlmICghdXBkYXRpbmdTdGF0ZSkge1xuXHRcdFx0XHR1cGRhdGluZ1N0YXRlID0gdHJ1ZTtcblx0XHRcdFx0KHRoaXMgYXMgeyBvblN0YXRlQ2hhbmdlPzogRnVuY3Rpb24gfSkub25TdGF0ZUNoYW5nZT8uKCk7XG5cdFx0XHRcdHVwZGF0aW5nU3RhdGUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLl91cGRhdGVTdGF0ZVRpbWVyICYmICF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVN0YXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdGF0ZSgpO1xuXHRcdFx0XHR9LCAyMDApO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldENvbnRyb2wsIG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm94eShzdGF0ZU1vZGVsLCB7XG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoanNvbk1vZGVsLCBwcm9wKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXRoSW5Nb2RlbCA9IGAvJHtwcm9wLnRvU3RyaW5nKCl9YDtcblx0XHRcdFx0XHRcdGNvbnN0IG9PYmogPSBkZWVwQ2xvbmUoanNvbk1vZGVsLmdldE9iamVjdChwYXRoSW5Nb2RlbCkpO1xuXHRcdFx0XHRcdFx0bGV0IG9UYXJnZXQ7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9PYmogPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0b1RhcmdldCA9IHsgdmFsdWU6IG9PYmogfTtcblx0XHRcdFx0XHRcdFx0b1RhcmdldC50b1N0cmluZyA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0geyB2YWx1ZTogb09iaiB9O1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9PYmogPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UYXJnZXQgPSBuZXcgQm9vbGVhbihvT2JqKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvT2JqKSkge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0gbmV3IFByb3h5KG9PYmouY29uY2F0KCksIHtcblx0XHRcdFx0XHRcdFx0XHRnZXQodGFyZ2V0OiB1bmtub3duW10sIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmVmID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiByZWYuYmluZCh0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChyZWYgPT09IHVuZGVmaW5lZCAmJiBpc05hTihOdW1iZXIocC50b1N0cmluZygpKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtb2RlbDogXCIkY29tcG9uZW50U3RhdGVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdGg6IHBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVmO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0geyAuLi5vT2JqIH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvVGFyZ2V0Ll9fYmluZGluZ0luZm8gPSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBwYXRoSW5Nb2RlbFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHJldHVybiBvVGFyZ2V0O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2V0OiAoc2V0U3RhdGVNb2RlbDogSlNPTk1vZGVsLCBwcm9wLCB2YWx1ZSk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0UmVzdWx0ID0gc2V0U3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7cHJvcC50b1N0cmluZygpfWAsIHZhbHVlKTtcblx0XHRcdFx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc2V0UmVzdWx0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0Ly8gUmVwbGFjaW5nIHRoZSBjb21wbGV0ZSBzdGF0ZVxuXHRcdFx0XHRzdGF0ZU1vZGVsLnNldFByb3BlcnR5KGAvYCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbFtvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eSBhcyBrZXlvZiBDb250cm9sXSA9IG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlIGFzIG5ldmVyO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0X2NyZWF0ZVN0YXRlUHJvcGVydHkob2JqLCB0aGlzKTtcblx0fTtcblxuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUE4SUEsTUFBTUEsY0FBYyxHQUFH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QVUsT0FBQWhILEtBQUEsQ0FBQStHLEtBQUEsR0FBQUUsS0FBQSxNQUFBQSxLQUFBLEdBQUFGLEtBQUEsRUFBQUUsS0FBQTtvQkFBVkQsVUFBVSxDQUFBQyxLQUFBLElBQUExTSxTQUFBLENBQUEwTSxLQUFBO2tCQUFBO2tCQUsxQixLQUFLLE1BQU1DLEdBQUcsSUFBSUwsWUFBWSxFQUFFO29CQUMvQixNQUFNSyxHQUFHLENBQUMvQixLQUFLLENBQUNILEtBQUksRUFBRWdDLFVBQVUsQ0FBQztrQkFDbEM7Z0JBQ0QsQ0FBQztjQUNGO1lBQ0QsQ0FBQyxDQUFDO1VBQ0g7UUFDRDtNQUNEO01BQ0EvRixvQkFBb0IsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRURvQyxLQUFLLENBQUNqRyxRQUFRLEdBQUcsVUFBVThKLFVBQW1CLEVBQVk7TUFDekQsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUNiQSxHQUFHLENBQWNwTCxXQUFXLEdBQUcsWUFBd0M7UUFBQSxTQUFBcUwsS0FBQSxHQUFBOU0sU0FBQSxDQUFBQyxNQUFBLEVBQTNCdUYsSUFBSSxPQUFBQyxLQUFBLENBQUFxSCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSnZILElBQUksQ0FBQXVILEtBQUEsSUFBQS9NLFNBQUEsQ0FBQStNLEtBQUE7UUFBQTtRQUNoRCxPQUFPaEUsS0FBSyxDQUFDNkIsS0FBSyxDQUFDLElBQUksRUFBRXBGLElBQUksQ0FBQztNQUMvQixDQUFDO01BQ0QsTUFBTXdILE1BQU0sR0FBSUMsUUFBUSxDQUEwQ0MsV0FBVyxDQUM1RW5FLEtBQUssRUFDTCxzQkFBc0JvRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQzdCTixHQUFHLEVBQ0hPLGtCQUNELENBQUM7TUFDREosTUFBTSxDQUFDN00sV0FBVyxDQUFDLENBQUMsQ0FBQ2tOLGVBQWUsR0FBR1QsVUFBVTtNQUNqREksTUFBTSxDQUFDN00sV0FBVyxDQUFDLENBQUMsQ0FBQ21OLFNBQVMsR0FBSXZFLEtBQUssQ0FBQzVJLFdBQVcsQ0FBQyxDQUFDLENBQTZCbU4sU0FBUztNQUMzRixPQUFPTixNQUFNO0lBQ2QsQ0FBQztJQUVETyxVQUFVLENBQUM3TCxHQUFHLENBQUNzSCxJQUFJLEVBQUVxQixNQUFNLENBQUM7SUFFNUIsT0FBT0EsTUFBTTtFQUNkO0VBQUMsT0FBQW5JLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==