@sapui5/sap.fe.base 1.130.6 → 1.132.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.
@@ -48,7 +48,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
48
48
  }
49
49
  if (!oSource || !oSource.isA(apiFQN)) {
50
50
  const oSourceMap = this.instanceMap.get(this);
51
- oSource = oSourceMap === null || oSourceMap === void 0 ? void 0 : oSourceMap[oSourceMap.length - 1];
51
+ oSource = oSourceMap?.[oSourceMap.length - 1];
52
52
  }
53
53
  let targetControl;
54
54
  if (oSource && oSource.isA(apiFQN)) {
@@ -85,11 +85,13 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
85
85
  */
86
86
  function defineState() {
87
87
  return function (target, propertyKey, propertyDescriptor) {
88
- var _initializer, _ref;
89
88
  const metadata = ensureMetadata(target);
89
+ if (metadata.stateProperty !== undefined) {
90
+ throw new Error("Only one state property per control is allowed");
91
+ }
90
92
  metadata.stateProperty = propertyKey;
91
93
  delete propertyDescriptor.writable;
92
- metadata.statePropertyDefaultValue ??= (_initializer = (_ref = propertyDescriptor).initializer) === null || _initializer === void 0 ? void 0 : _initializer.call(_ref);
94
+ metadata.statePropertyDefaultValue ??= propertyDescriptor.initializer?.();
93
95
  delete propertyDescriptor.initializer;
94
96
  return propertyDescriptor;
95
97
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
@@ -232,7 +234,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
232
234
  _exports.event = event;
233
235
  function property(attributeDefinition) {
234
236
  return function (target, propertyKey, propertyDescriptor) {
235
- var _initializer2, _ref2;
236
237
  const metadata = ensureMetadata(target);
237
238
  if (attributeDefinition.bindable === undefined) {
238
239
  attributeDefinition.bindable = true;
@@ -245,7 +246,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
245
246
  metadata.properties[propertyKey] = attributeDefinition;
246
247
  }
247
248
  delete propertyDescriptor.writable;
248
- attributeDefinition.defaultValue ??= (_initializer2 = (_ref2 = propertyDescriptor).initializer) === null || _initializer2 === void 0 ? void 0 : _initializer2.call(_ref2);
249
+ attributeDefinition.defaultValue ??= propertyDescriptor.initializer?.();
249
250
  delete propertyDescriptor.initializer;
250
251
  return propertyDescriptor;
251
252
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.
@@ -259,7 +260,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
259
260
  _exports.property = property;
260
261
  function aggregation(aggregationDefinition) {
261
262
  return function (target, propertyKey, propertyDescriptor) {
262
- var _initializer3, _ref3;
263
263
  const metadata = ensureMetadata(target);
264
264
  if (aggregationDefinition.multiple === undefined) {
265
265
  // UI5 defaults this to true but this is just weird...
@@ -272,7 +272,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
272
272
  metadata.defaultAggregation = propertyKey;
273
273
  }
274
274
  delete propertyDescriptor.writable;
275
- aggregationDefinition.defaultValue ??= (_initializer3 = (_ref3 = propertyDescriptor).initializer) === null || _initializer3 === void 0 ? void 0 : _initializer3.call(_ref3);
275
+ aggregationDefinition.defaultValue ??= propertyDescriptor.initializer?.();
276
276
  delete propertyDescriptor.initializer;
277
277
  return propertyDescriptor;
278
278
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if I declare it as such.
@@ -322,9 +322,9 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
322
322
  for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
323
323
  args[_key] = arguments[_key];
324
324
  }
325
- if (args !== null && args !== void 0 && args.length) {
325
+ if (args?.length) {
326
326
  const currentTarget = currentConstructor.getAPI(args[0]);
327
- currentTarget === null || currentTarget === void 0 ? void 0 : currentTarget[propertykey.toString()](...args);
327
+ currentTarget?.[propertykey.toString()](...args);
328
328
  }
329
329
  };
330
330
  };
@@ -361,6 +361,32 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
361
361
  };
362
362
  }
363
363
  _exports.defineUI5Class = defineUI5Class;
364
+ /**
365
+ * Mixin a specific interface including all its methods and properties into the control.
366
+ * @param interfaceClass Implementation class of the control
367
+ * @returns The decorated class
368
+ */
369
+ function mixin(interfaceClass) {
370
+ return function (baseCtor) {
371
+ if (baseCtor.prototype.extend) {
372
+ throw new Error("The mixinInterface decorator must be placed after `defineUi5Class`");
373
+ }
374
+ const metadata = ensureMetadata(baseCtor.prototype);
375
+ const interfaceName = interfaceClass.prototype.getInterfaceName?.();
376
+ if (interfaceName) {
377
+ metadata.interfaces.push(interfaceName);
378
+ }
379
+ Object.getOwnPropertyNames(interfaceClass.prototype).forEach(name => {
380
+ if (name !== "constructor" && name !== "setupMixin") {
381
+ Object.defineProperty(baseCtor.prototype, name, Object.getOwnPropertyDescriptor(interfaceClass.prototype, name) || Object.create(null));
382
+ }
383
+ });
384
+ // Hook to add potentially more logic to the mixin
385
+ interfaceClass.prototype.setupMixin?.(baseCtor);
386
+ return baseCtor;
387
+ };
388
+ }
389
+ _exports.mixin = mixin;
364
390
  function createReference() {
365
391
  return {
366
392
  current: undefined,
@@ -394,28 +420,17 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
394
420
  const pathInModel = `/${prop.toString()}`;
395
421
  const oObj = deepClone(jsonModel.getObject(pathInModel));
396
422
  let oTarget;
397
- if (typeof oObj === "string") {
398
- oTarget = {
399
- value: oObj
400
- };
401
- oTarget.toString = function () {
402
- return this.value;
403
- };
404
- oTarget.valueOf = function () {
405
- return this.value;
423
+ if (prop === "__bindingInfo") {
424
+ return {
425
+ model: "$componentState"
406
426
  };
427
+ }
428
+ if (typeof oObj === "string") {
429
+ oTarget = oObj;
407
430
  } else if (typeof oObj === "number") {
408
- oTarget = {
409
- value: oObj
410
- };
411
- oTarget.toString = function () {
412
- return this.value.toString();
413
- };
414
- oTarget.valueOf = function () {
415
- return this.value;
416
- };
431
+ oTarget = oObj;
417
432
  } else if (typeof oObj === "boolean") {
418
- oTarget = new Boolean(oObj);
433
+ oTarget = oObj;
419
434
  } else if (Array.isArray(oObj)) {
420
435
  oTarget = new Proxy(oObj, {
421
436
  get(target, p, receiver) {
@@ -438,62 +453,107 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
438
453
  ...oObj
439
454
  };
440
455
  }
441
- oTarget.__bindingInfo = {
442
- model: "$componentState",
443
- path: pathInModel
444
- };
456
+ if (typeof oTarget === "object") {
457
+ oTarget.__bindingInfo = {
458
+ model: "$componentState",
459
+ path: pathInModel
460
+ };
461
+ }
445
462
  return oTarget;
446
463
  }
447
464
  function _createStateProperty(obj, targetControl) {
448
- var _obj$metadata;
449
- if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.stateProperty) {
450
- const stateModel = new JSONModel({});
451
- targetControl.setModel(stateModel, "$componentState");
465
+ if (obj.metadata?.stateProperty || targetControl?.getModel && targetControl.getModel("$componentState")) {
466
+ if (obj.metadata?.stateProperty) {
467
+ targetControl.setModel(new JSONModel(), "$componentState");
468
+ }
469
+ const stateModel = targetControl.getModel("$componentState");
452
470
  let updatingState = false;
453
- // This method can be used to force the state to be applied and wait for it to be applied in tests
454
- targetControl._updateState = async function () {
455
- delete this._updateStateTimer;
456
- if (!updatingState) {
457
- var _onStateChange, _ref4;
458
- updatingState = true;
459
- await ((_onStateChange = (_ref4 = this).onStateChange) === null || _onStateChange === void 0 ? void 0 : _onStateChange.call(_ref4, this._changedProps));
460
- this._changedProps = [];
461
- updatingState = false;
462
- }
463
- };
464
- targetControl._updateStateDebounced = function (changedProp) {
465
- this._changedProps ??= [];
466
- if (!this._changedProps.includes(changedProp)) {
467
- this._changedProps.push(changedProp);
468
- }
469
- if (!this._updateStateTimer && !updatingState) {
470
- this._updateStateTimer = setTimeout(() => {
471
- this._updateState();
472
- }, 200);
471
+ const boundToStateProps = [];
472
+ for (const propertyName in obj.metadata?.properties) {
473
+ const propertyDef = obj.metadata.properties[propertyName];
474
+ if (propertyDef.bindToState) {
475
+ boundToStateProps.push(propertyName);
473
476
  }
474
- };
475
- Object.defineProperty(targetControl, obj.metadata.stateProperty, {
476
- configurable: true,
477
- get: () => {
478
- return new Proxy(stateModel, {
479
- get: (target, prop) => {
480
- return _getHandlerForStateProperty(target, prop);
481
- },
482
- set: (setStateModel, prop, value) => {
483
- const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
484
- targetControl._updateStateDebounced(prop.toString());
485
- return setResult;
486
- }
487
- });
488
- },
489
- set: function (value) {
490
- // Replacing the complete state
491
- stateModel.setProperty(`/`, value);
477
+ }
478
+ // as we may have bound properties in parent classes and subclasses, we keep track of those in the model itself
479
+ const initialBoundProperties = stateModel.getProperty("/__boundProperties") ?? [];
480
+ stateModel.setProperty("/__boundProperties", [...initialBoundProperties, ...boundToStateProps]);
481
+ stateModel.attachPropertyChange(evt => {
482
+ const path = evt.getParameter("path")?.substring(1); // to remove the first /
483
+ if (path && boundToStateProps.includes(path)) {
484
+ targetControl.setProperty(path, evt.getParameter("value"));
492
485
  }
493
486
  });
494
- if (obj.metadata.statePropertyDefaultValue) {
495
- targetControl[obj.metadata.stateProperty] = {
496
- ...obj.metadata.statePropertyDefaultValue
487
+ if (obj.metadata?.stateProperty) {
488
+ // This method can be used to force the state to be applied and wait for it to be applied in tests
489
+ targetControl._updateState = async function () {
490
+ delete this._updateStateTimer;
491
+ if (!updatingState) {
492
+ updatingState = true;
493
+ await this.onStateChange?.(this._changedProps);
494
+ this._changedProps = [];
495
+ updatingState = false;
496
+ }
497
+ };
498
+ targetControl._updateStateDebounced = function (changedProp) {
499
+ this._changedProps ??= [];
500
+ if (!this._changedProps.includes(changedProp)) {
501
+ this._changedProps.push(changedProp);
502
+ }
503
+ if (!this._updateStateTimer && !updatingState) {
504
+ this._updateStateTimer = setTimeout(() => {
505
+ this._updateState();
506
+ }, 200);
507
+ }
508
+ };
509
+ Object.defineProperty(targetControl, obj.metadata.stateProperty, {
510
+ configurable: true,
511
+ get: () => {
512
+ return new Proxy(stateModel, {
513
+ get: (target, prop) => {
514
+ return _getHandlerForStateProperty(target, prop);
515
+ },
516
+ set: (setStateModel, prop, value) => {
517
+ // we need to check whether the property is a known bound property in any of the related classes
518
+ const knownBoundProperties = setStateModel.getProperty("/__boundProperties") ?? [];
519
+ if (knownBoundProperties.includes(prop.toString())) {
520
+ targetControl._ignoreStatePropertyUpdate = true;
521
+ targetControl.setProperty(prop.toString(), value);
522
+ targetControl._ignoreStatePropertyUpdate = false;
523
+ }
524
+ const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
525
+ targetControl._updateStateDebounced(prop.toString());
526
+ return setResult;
527
+ }
528
+ });
529
+ },
530
+ set: function (value) {
531
+ const knownBoundProperties = stateModel.getProperty("/__boundProperties") ?? [];
532
+ // Replacing the complete state
533
+ stateModel.setProperty(`/`, value);
534
+ // restoring the boundProperties references
535
+ stateModel.setProperty("/__boundProperties", knownBoundProperties);
536
+ }
537
+ });
538
+ if (obj.metadata.statePropertyDefaultValue) {
539
+ targetControl[obj.metadata.stateProperty] = {
540
+ ...obj.metadata.statePropertyDefaultValue
541
+ };
542
+ }
543
+ const fnApplySettings = targetControl.applySettings;
544
+ targetControl.applySettings = function (mSettings) {
545
+ delete mSettings?.models?.$componentState;
546
+ return fnApplySettings.call(this, mSettings);
547
+ };
548
+ }
549
+ const fnSetProperty = targetControl.setProperty;
550
+ if (boundToStateProps.length > 0) {
551
+ targetControl.setProperty = function (sPropertyName, oValue, bSuppressInvalidate) {
552
+ if (boundToStateProps.includes(sPropertyName) && !this._ignoreStatePropertyUpdate) {
553
+ stateModel.setProperty(`/${sPropertyName}`, oValue);
554
+ targetControl._updateStateDebounced(sPropertyName);
555
+ }
556
+ return fnSetProperty.call(this, sPropertyName, oValue, bSuppressInvalidate);
497
557
  };
498
558
  }
499
559
  }
@@ -507,8 +567,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
507
567
  * @returns The metadata class
508
568
  */
509
569
  function registerUI5Metadata(clazz, name, inObj) {
510
- var _clazz$getMetadata, _clazz$getMetadata2, _inObj$metadata, _clazz$metadata, _obj$metadata2;
511
- if ((_clazz$getMetadata = clazz.getMetadata) !== null && _clazz$getMetadata !== void 0 && _clazz$getMetadata.call(clazz).isA("sap.ui.core.mvc.ControllerExtension")) {
570
+ if (clazz.getMetadata?.().isA("sap.ui.core.mvc.ControllerExtension")) {
512
571
  Object.getOwnPropertyNames(inObj).forEach(objName => {
513
572
  const descriptor = Object.getOwnPropertyDescriptor(inObj, objName);
514
573
  if (descriptor && !descriptor.enumerable) {
@@ -522,7 +581,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
522
581
  obj.override = inObj.override;
523
582
  obj.constructor = clazz;
524
583
  obj.metadata.baseType = Object.getPrototypeOf(clazz.prototype).getMetadata().getName();
525
- if ((clazz === null || clazz === void 0 ? void 0 : (_clazz$getMetadata2 = clazz.getMetadata()) === null || _clazz$getMetadata2 === void 0 ? void 0 : _clazz$getMetadata2.getStereotype()) === "control") {
584
+ if (clazz?.getMetadata()?.getStereotype() === "control") {
526
585
  const rendererDefinition = inObj.renderer || clazz.renderer || clazz.render;
527
586
  obj.renderer = {
528
587
  apiVersion: 2
@@ -533,7 +592,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
533
592
  obj.renderer = rendererDefinition;
534
593
  }
535
594
  }
536
- obj.metadata.interfaces = ((_inObj$metadata = inObj.metadata) === null || _inObj$metadata === void 0 ? void 0 : _inObj$metadata.interfaces) || ((_clazz$metadata = clazz.metadata) === null || _clazz$metadata === void 0 ? void 0 : _clazz$metadata.interfaces);
595
+ obj.metadata.interfaces = inObj.metadata?.interfaces || clazz.metadata?.interfaces;
537
596
  Object.keys(clazz.prototype).forEach(key => {
538
597
  if (key !== "metadata") {
539
598
  try {
@@ -543,7 +602,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
543
602
  }
544
603
  }
545
604
  });
546
- if ((_obj$metadata2 = obj.metadata) !== null && _obj$metadata2 !== void 0 && _obj$metadata2.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
605
+ if (obj.metadata?.controllerExtensions && Object.keys(obj.metadata.controllerExtensions).length > 0) {
547
606
  for (const cExtName in obj.metadata.controllerExtensions) {
548
607
  obj[cExtName] = obj.metadata.controllerExtensions[cExtName];
549
608
  }
@@ -608,7 +667,8 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
608
667
  }
609
668
  });
610
669
  }
611
- if (propertyDefault !== undefined) {
670
+ if (propertyDefault !== undefined && this[propertyKey] !== propertyDefault) {
671
+ // don't overwrite the default value if it's already there
612
672
  this._applyingSettings = true;
613
673
  this[propertyKey] = propertyDefault;
614
674
  this._applyingSettings = false;
@@ -633,7 +693,7 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
633
693
  }
634
694
  }
635
695
  });
636
- if (defaultValue && defaultValue !== null && defaultValue !== void 0 && defaultValue.isA) {
696
+ if (defaultValue && defaultValue?.isA) {
637
697
  this._applyingSettings = true;
638
698
  this[aggregationKey] = defaultValue;
639
699
  this._applyingSettings = false;
@@ -721,4 +781,4 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
721
781
  }
722
782
  return _exports;
723
783
  }, false);
724
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwiX2luaXRpYWxpemVyIiwiX3JlZiIsInN0YXRlUHJvcGVydHkiLCJ3cml0YWJsZSIsInN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUiLCJpbml0aWFsaXplciIsImNhbGwiLCJfZXhwb3J0cyIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJfaW5pdGlhbGl6ZXIyIiwiX3JlZjIiLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiX2luaXRpYWxpemVyMyIsIl9yZWYzIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsIl9nZXRIYW5kbGVyRm9yU3RhdGVQcm9wZXJ0eSIsImpzb25Nb2RlbCIsInByb3AiLCJwYXRoSW5Nb2RlbCIsIm9PYmoiLCJkZWVwQ2xvbmUiLCJnZXRPYmplY3QiLCJvVGFyZ2V0IiwidmFsdWUiLCJ2YWx1ZU9mIiwiQm9vbGVhbiIsIlByb3h5IiwicCIsInJlY2VpdmVyIiwicmVmIiwiUmVmbGVjdCIsImJpbmQiLCJpc05hTiIsIk51bWJlciIsIl9fYmluZGluZ0luZm8iLCJtb2RlbCIsInBhdGgiLCJfY3JlYXRlU3RhdGVQcm9wZXJ0eSIsIm9iaiIsIl9vYmokbWV0YWRhdGEiLCJzdGF0ZU1vZGVsIiwiSlNPTk1vZGVsIiwic2V0TW9kZWwiLCJ1cGRhdGluZ1N0YXRlIiwiX3VwZGF0ZVN0YXRlIiwiX3VwZGF0ZVN0YXRlVGltZXIiLCJfb25TdGF0ZUNoYW5nZSIsIl9yZWY0Iiwib25TdGF0ZUNoYW5nZSIsIl9jaGFuZ2VkUHJvcHMiLCJfdXBkYXRlU3RhdGVEZWJvdW5jZWQiLCJjaGFuZ2VkUHJvcCIsImluY2x1ZGVzIiwic2V0VGltZW91dCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwic2V0U3RhdGVNb2RlbCIsInNldFJlc3VsdCIsInNldFByb3BlcnR5IiwiY2xhenoiLCJuYW1lIiwiaW5PYmoiLCJfY2xhenokZ2V0TWV0YWRhdGEiLCJfY2xhenokZ2V0TWV0YWRhdGEyIiwiX2luT2JqJG1ldGFkYXRhIiwiX2NsYXp6JG1ldGFkYXRhIiwiX29iaiRtZXRhZGF0YTIiLCJnZXRPd25Qcm9wZXJ0eU5hbWVzIiwiZm9yRWFjaCIsIm9iak5hbWUiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJiYXNlVHlwZSIsImdldFByb3RvdHlwZU9mIiwiZ2V0U3RlcmVvdHlwZSIsInJlbmRlcmVyRGVmaW5pdGlvbiIsInJlbmRlcmVyIiwicmVuZGVyIiwiYXBpVmVyc2lvbiIsImtleXMiLCJlIiwiY0V4dE5hbWUiLCJvdXRwdXQiLCJleHRlbmQiLCJmbkluaXQiLCJpbml0IiwiZm5BZnRlckluaXQiLCJhZnRlckluaXQiLCJfdGhpcyIsIl9sZW4yIiwiX2tleTIiLCJhcHBseSIsImFQcm9wZXJ0eUtleXMiLCJwcm9wZXJ0eURlZiIsInByb3BlcnR5RGVmYXVsdCIsIl9iaW5kaW5nUHJvcGVydGllcyIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eSIsImJpbmRpbmdQcm9wZXJ0eVZhbHVlIiwicHJvcFZhbHVlIiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJhZ2dyZWdhdGlvbkRlZiIsInNldEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25Db250ZW50IiwiZ2V0QWdncmVnYXRpb24iLCJhQXNzb2NpYXRpb25LZXlzIiwiYXNzb2NpYXRpb25LZXkiLCJzZXRBc3NvY2lhdGlvbiIsImdldEFzc29jaWF0aW9uIiwicmVmZXJlbmNlUHJvcGVydGllcyIsIm1ldGhvZE5hbWUiLCJtZXRob2REZWZpbml0aW9uIiwibWV0aG9kSG9sZGVyIiwibWV0aG9kQXJyYXlzIiwicmV2ZXJzZSIsIl9sZW4zIiwibWV0aG9kQXJncyIsIl9rZXkzIiwiYXJnIiwib0V4dGVuc2lvbiIsInBvbCIsIl9sZW40IiwiX2tleTQiLCJvQ2xhc3MiLCJNZXRhZGF0YSIsImNyZWF0ZUNsYXNzIiwidWlkIiwiQ29udHJvbGxlck1ldGFkYXRhIiwiX3N0YXRpY092ZXJyaWRlIiwiX292ZXJyaWRlIiwiT2JqZWN0UGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ2xhc3NTdXBwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgeyBob29rYWJsZSB9IGZyb20gXCJzYXAvZmUvYmFzZS9Ib29rU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCBNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2Jhc2UvTWV0YWRhdGFcIjtcbmltcG9ydCBCYXNlT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9PYmplY3RcIjtcbmltcG9ydCB0eXBlIENvbnRyb2wgZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIHsgJENvbnRyb2xTZXR0aW5ncyB9IGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSBVSTVFbGVtZW50IGZyb20gXCJzYXAvdWkvY29yZS9FbGVtZW50XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sbGVyRXh0ZW5zaW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlckV4dGVuc2lvblwiO1xuaW1wb3J0IENvbnRyb2xsZXJNZXRhZGF0YSBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJNZXRhZGF0YVwiO1xuaW1wb3J0IHR5cGUgT3ZlcnJpZGVFeGVjdXRpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9PdmVycmlkZUV4ZWN1dGlvblwiO1xuaW1wb3J0IHR5cGUgQ29udGV4dCBmcm9tIFwic2FwL3VpL21vZGVsL0NvbnRleHRcIjtcbmltcG9ydCBKU09OTW9kZWwgZnJvbSBcInNhcC91aS9tb2RlbC9qc29uL0pTT05Nb2RlbFwiO1xuXG50eXBlIE92ZXJyaWRlRGVmaW5pdGlvbiA9IFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPjtcbnR5cGUgVUk1Q29udHJvbGxlck1ldGhvZERlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlRXhlY3V0aW9uPzogT3ZlcnJpZGVFeGVjdXRpb247XG5cdHB1YmxpYz86IGJvb2xlYW47XG5cdGZpbmFsPzogYm9vbGVhbjtcbn07XG5leHBvcnQgdHlwZSBOb25BYnN0cmFjdENsYXNzPFQ+ID0gUGljazxULCBrZXlvZiBUPiAmIChuZXcgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gVCk7XG5cbnR5cGUgVUk1UHJvcGVydHlNZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRiaW5kYWJsZT86IGJvb2xlYW47XG5cdHJlcXVpcmVkPzogYm9vbGVhbjtcblx0Z3JvdXA/OiBzdHJpbmc7XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGJ5VmFsdWU/OiBib29sZWFuO1xuXHRpc0JpbmRpbmdJbmZvPzogYm9vbGVhbjtcblx0ZXhwZWN0ZWRBbm5vdGF0aW9ucz86IHN0cmluZ1tdO1xuXHRleHBlY3RlZFR5cGVzPzogc3RyaW5nW107XG5cdGFsbG93ZWRWYWx1ZXM/OiBzdHJpbmdbXTtcblx0dmlzaWJpbGl0eT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGFsdFR5cGVzPzogc3RyaW5nW107XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0aXNEZWZhdWx0PzogYm9vbGVhbjtcblx0ZGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0ZGVmYXVsdENsYXNzPzogdW5rbm93bjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xuXHRmb3J3YXJkaW5nPzogb2JqZWN0O1xufTtcbmV4cG9ydCB0eXBlIFVJNUFzc29jaWF0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG59O1xuZXhwb3J0IHR5cGUgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiA9IHtcblx0ZGVmYXVsdEFnZ3JlZ2F0aW9uPzogc3RyaW5nO1xuXHRjb250cm9sbGVyRXh0ZW5zaW9uczogUmVjb3JkPHN0cmluZywgdHlwZW9mIENvbnRyb2xsZXJFeHRlbnNpb24gfCBGdW5jdGlvbj47XG5cdHByb3BlcnRpZXM6IFJlY29yZDxzdHJpbmcsIFVJNVByb3BlcnR5TWV0YWRhdGE+O1xuXHRhZ2dyZWdhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGE+O1xuXHRyZWZlcmVuY2VzOiBSZWNvcmQ8c3RyaW5nLCBib29sZWFuPjtcblx0YXNzb2NpYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhPjtcblx0bWV0aG9kczogUmVjb3JkPHN0cmluZywgVUk1Q29udHJvbGxlck1ldGhvZERlZmluaXRpb24+O1xuXHRldmVudHM6IFJlY29yZDxzdHJpbmcsIHt9Pjtcblx0aW50ZXJmYWNlczogc3RyaW5nW107XG5cdGxpYnJhcnk/OiBzdHJpbmc7XG5cdGRlc2lnbnRpbWU/OiBzdHJpbmc7XG5cdGNvbmZpZz86IHtcblx0XHRmdWxsV2lkdGg/OiBib29sZWFuO1xuXHR9O1xuXHRzdGF0ZVByb3BlcnR5Pzogc3RyaW5nO1xuXHRzdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0bWFuaWZlc3Q/OiBzdHJpbmcgfCB1bmtub3duO1xuXHRyZXR1cm5UeXBlcz86IHN0cmluZ1tdO1xuXHRidWlsZGluZ0Jsb2NrTWV0YWRhdGE/OiB1bmtub3duO1xufTtcbmV4cG9ydCB0eXBlIEFjY2Vzc29yRGVzY3JpcHRvcjxUPiA9IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPFQ+ICYgeyBpbml0aWFsaXplcj86ICgpID0+IFQgfTtcbnR5cGUgVUk1Q29udHJvbGxlckRlZmluaXRpb24gPSB7XG5cdG92ZXJyaWRlPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRvdmVycmlkZXM/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1Q29udHJvbERlZmluaXRpb24gPSB7XG5cdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0b3ZlcnJpZGU/OiB1bmtub3duO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVBUElDb250cm9sID0gQ29udHJvbCAmIHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xuXHRfX2FwaVJlZ2lzdGVyZWQ6IGJvb2xlYW47XG59ICYge1xuXHRbazogc3RyaW5nXTogRnVuY3Rpb247XG59O1xuXG5leHBvcnQgdHlwZSBYTUxFdmVudEhvbGRlciA9IHtcblx0Z2V0QVBJKGV2ZW50OiBVSTVFdmVudCwgZnFkbj86IHN0cmluZyk6IFVJNUFQSUNvbnRyb2wgfCB1bmRlZmluZWQ7XG5cdGluc3RhbmNlTWFwOiBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+O1xufTtcblxudHlwZSBDb250cm9sUHJvcGVydHlOYW1lczxUPiA9IHtcblx0Ly8gbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIFRTIGNvbXBpbGVyXG5cdC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IEs7XG59W2tleW9mIFRdO1xuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mPFQsIEsgZXh0ZW5kcyBrZXlvZiBUIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiA9IFBhcnRpYWw8UGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj4+ICZcblx0KEsgZXh0ZW5kcyBrZXlvZiBUID8gUGFydGlhbDxQaWNrPFQsIEs+PiA6IHt9KSAmXG5cdCRDb250cm9sU2V0dGluZ3M7XG5leHBvcnQgdHlwZSBDb252ZXJ0Q29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogSyBleHRlbmRzIFwibWV0YVBhdGhcIiB8IFwiY29udGV4dFBhdGhcIiA/IHN0cmluZyA6IFRbS107XG59O1xudHlwZSBDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ29udGV4dCB8IHVuZGVmaW5lZCA/IHN0cmluZyB8IHVuZGVmaW5lZCA6IFRbS107XG59O1xuXG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2ZCdWlsZGluZ0Jsb2NrPFQ+ID0gQ29udGV4dFRvU3RyaW5nPFByb3BlcnRpZXNPZjxUPj47XG5leHBvcnQgdHlwZSBTdHJpY3RQcm9wZXJ0aWVzT2Y8VD4gPSBQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+PjtcbmV4cG9ydCB0eXBlIFVJNUFjY2Vzc29yczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgZ2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBnZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICgpID0+IFRbUF07XG59O1xuZXhwb3J0IHR5cGUgVUk1U2V0dGVyczxUPiA9IHtcblx0Ly8gQWRkIGFsbCB0aGUgc2V0WFhYIG1ldGhvZCwgbWlnaHQgYWRkIHRvbyBtdWNoIGFzIEknbSBub3QgZmlsdGVyaW5nIG9uIGFjdHVhbCBwcm9wZXJ0aWVzLi4uXG5cdFtQIGluIGtleW9mIFJlcXVpcmVkPFQ+IGFzIGBzZXQke0NhcGl0YWxpemU8c3RyaW5nICYgUD59YF06ICh2YWx1ZTogVFtQXSkgPT4gVDtcbn07XG5leHBvcnQgdHlwZSBFbmhhbmNlV2l0aFVJNTxUPiA9IHtcblx0bmV3IChwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG5cdG5ldyAoc0lkOiBzdHJpbmcsIHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcbn0gJiBUICZcblx0VUk1QWNjZXNzb3JzPFQ+ICZcblx0VUk1U2V0dGVyczxUPjtcblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24gPSBcIkluc3RlYWRcIiB8IFwiQmVmb3JlXCIgfCBcIkFmdGVyXCIgfCBcIkFmdGVyQXN5bmNcIiB8IFwiQmVmb3JlQXN5bmNcIjtcblxuY29uc3QgZW5zdXJlTWV0YWRhdGEgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbiB7XG5cdHRhcmdldC5tZXRhZGF0YSA9IG1lcmdlKFxuXHRcdHtcblx0XHRcdGNvbnRyb2xsZXJFeHRlbnNpb25zOiB7fSxcblx0XHRcdHByb3BlcnRpZXM6IHt9LFxuXHRcdFx0YWdncmVnYXRpb25zOiB7fSxcblx0XHRcdHJlZmVyZW5jZXM6IHt9LFxuXHRcdFx0YXNzb2NpYXRpb25zOiB7fSxcblx0XHRcdG1ldGhvZHM6IHt9LFxuXHRcdFx0ZXZlbnRzOiB7fSxcblx0XHRcdGludGVyZmFjZXM6IFtdXG5cdFx0fSxcblx0XHR0YXJnZXQubWV0YWRhdGEgPz8ge31cblx0KSBhcyBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZXR1cm4gdGFyZ2V0Lm1ldGFkYXRhO1xufTtcblxuLyoqXG4gKiBNZXRob2QgdGhhdCB3aWxsIGZpbmQgdGhlIGNvcnJlY3QgQVBJIG9iamVjdCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250cm9sIGhpZXJhcmNoeS5cbiAqIEBwYXJhbSB0YXJnZXRcbiAqIEByZXR1cm5zIFRoZSBwcm9wZXIgZ2V0QVBJIGZ1bmN0aW9uIGZvciB0aGlzIGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIHByZXBhcmVHZXRBUElGdW5jdGlvbih0YXJnZXQ6IFVJNUFQSUNvbnRyb2wpIHtcblx0cmV0dXJuIGZ1bmN0aW9uIDxUIGV4dGVuZHMgVUk1QVBJQ29udHJvbD4oXG5cdFx0dGhpczogVUk1QVBJQ29udHJvbCxcblx0XHRvRXZlbnQ6IFVJNUV2ZW50LFxuXHRcdGFwaUZRTjogc3RyaW5nID0gdGFyZ2V0LmdldE1ldGFkYXRhKCkuZ2V0TmFtZSgpXG5cdCk6IFQgfCB1bmRlZmluZWQge1xuXHRcdGxldCBvU291cmNlID0gb0V2ZW50LmdldFNvdXJjZSgpIGFzIE1hbmFnZWRPYmplY3QgfCBudWxsO1xuXHRcdGlmICh0YXJnZXQuX2dldEFQSUV4dGVuc2lvbikge1xuXHRcdFx0b1NvdXJjZSA9IHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKG9Tb3VyY2UpID8/IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHdoaWxlIChvU291cmNlICYmICFvU291cmNlLmlzQTxUPihhcGlGUU4pICYmIG9Tb3VyY2UuZ2V0UGFyZW50KSB7XG5cdFx0XHRpZiAodGhpcy5pc0RlcGVuZGVudEJvdW5kKSB7XG5cdFx0XHRcdGNvbnN0IG9EZXBlbmRlbnRzID0gKG9Tb3VyY2UgYXMgQ29udHJvbCkuZ2V0RGVwZW5kZW50cygpO1xuXHRcdFx0XHRjb25zdCBoYXNDb3JyZWN0RGVwZW5kZW50ID0gb0RlcGVuZGVudHMuZmluZCgob0RlcGVuZGVudDogVUk1RWxlbWVudCkgPT4gb0RlcGVuZGVudC5pc0EoYXBpRlFOKSk7XG5cdFx0XHRcdGlmIChoYXNDb3JyZWN0RGVwZW5kZW50KSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IGhhc0NvcnJlY3REZXBlbmRlbnQgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpIGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCFvU291cmNlIHx8ICFvU291cmNlLmlzQTxUPihhcGlGUU4pKSB7XG5cdFx0XHRjb25zdCBvU291cmNlTWFwID0gdGhpcy5pbnN0YW5jZU1hcC5nZXQodGhpcykgYXMgVFtdO1xuXHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2VNYXA/LltvU291cmNlTWFwLmxlbmd0aCAtIDFdO1xuXHRcdH1cblx0XHRsZXQgdGFyZ2V0Q29udHJvbDtcblx0XHRpZiAob1NvdXJjZSAmJiBvU291cmNlLmlzQTxUPihhcGlGUU4pKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sID0gb1NvdXJjZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhcmdldENvbnRyb2w7XG5cdH07XG59XG5cbi8qKlxuICogRW5zdXJlcyB0aGF0IHdoZW4gYW4geG1sRXZlbnRIYW5kbGVyIGlzIGRlZmluZWQsIHRoZSBgZ2V0QVBJYCBmdW5jdGlvbiBpcyBwcm9wZXJseSBhc3NpZ25lZC5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIGNsYXNzIGNvbnN0cnVjdG9yIHRoYXQgc2hvdWxkIGhvbGQgdGhlIHN0YXRpYyBmdW5jdGlvbnNcbiAqL1xuY29uc3QgZW5zdXJlR2V0QVBJID0gZnVuY3Rpb24gKHRhcmdldDogVUk1QVBJQ29udHJvbCk6IHZvaWQge1xuXHRpZiAoIXRhcmdldC5fX2FwaVJlZ2lzdGVyZWQpIHtcblx0XHR0YXJnZXQuX19hcGlSZWdpc3RlcmVkID0gdHJ1ZTtcblx0XHR0YXJnZXQuaW5zdGFuY2VNYXAgPSBuZXcgV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuXHRcdHRhcmdldC5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24gKF9pbnN0YW5jZTogRnVuY3Rpb24pOiB2b2lkIHtcblx0XHRcdGlmICghdGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSkge1xuXHRcdFx0XHR0aGlzLmluc3RhbmNlTWFwLnNldChfaW5zdGFuY2UuY29uc3RydWN0b3IsIFtdKTtcblx0XHRcdH1cblx0XHRcdCh0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpIGFzIG9iamVjdFtdKS5wdXNoKF9pbnN0YW5jZSk7XG5cdFx0fTtcblx0XHR0YXJnZXQuZ2V0QVBJID0gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldCk7XG5cdH1cbn07XG5cbnR5cGUgRXh0ZW5kV2l0aE9iamVjdDxULCBLPiA9IFQgZXh0ZW5kcyBvYmplY3QgPyBLICYgeyBbVEtleSBpbiBrZXlvZiBUXT86IEJpbmRpbmdJbmZvSG9sZGVyPFRbVEtleV0+IH0gOiBLO1xuXG5leHBvcnQgdHlwZSBTdGF0ZU9mPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFycmF5PGluZmVyIFU+IHwgUmVhZG9ubHlBcnJheTxpbmZlciBVPiA/IEV4dGVuZFdpdGhPYmplY3Q8VSwgUmVhZG9ubHlBcnJheTxVPj4gOiBUW0tdO1xufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvSG9sZGVyPFQ+ID0gVCAmIHtcblx0X19iaW5kaW5nSW5mbzoge1xuXHRcdHBhdGg6IHN0cmluZztcblx0XHRtb2RlbDogc3RyaW5nO1xuXHRcdHR5cGU6IFQ7XG5cdH07XG59O1xuXG4vKipcbiAqIEFsbG93cyB0byBkZWZpbmUgYSBwcm9wZXJ0eSB0aGF0IHdpbGwgaG9sZCB0aGUgY29udHJvbCBzdGF0ZS5cbiAqXG4gKiBQcm9wZXJ0aWVzIGRlZmluZWQgd2l0aCB0aGlzIGRlY29yYXRvciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYm91bmQgdG8gdGhlIGNvbnRyb2wgc3RhdGUgd2hlbiB1c2VkIGluIEpTWC5cbiAqIEFycmF5cyBuZWVkIHRvIGJlIGJvdW5kIHVzaW5nIHRoZSBgYmluZFN0YXRlYCBmdW5jdGlvbi5cbiAqIEBleHBlcmltZW50YWxcbiAqIEByZXR1cm5zIEEgcHJvcGVydHkgZGVjb3JhdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVTdGF0ZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRtZXRhZGF0YS5zdGF0ZVByb3BlcnR5ID0gcHJvcGVydHlLZXk7XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRtZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbi8qICNyZWdpb24gQ09OVFJPTExFUiBFWFRFTlNJT05TICovXG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIGlzIGFuIG92ZXJyaWRlIGZvciB0aGUgbWV0aG9kIG5hbWUgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoZSBzcGVjaWZpYyBjb250cm9sbGVyIGV4dGVuc2lvbiBvciBiYXNlIGltcGxlbWVudGF0aW9uLlxuICogQHBhcmFtIGV4dGVuc2lvbk5hbWUgVGhlIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlblxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1ldGhvZE92ZXJyaWRlKGV4dGVuc2lvbk5hbWU/OiBzdHJpbmcpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5KSB7XG5cdFx0aWYgKCF0YXJnZXQub3ZlcnJpZGUpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZSA9IHt9O1xuXHRcdH1cblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZXMpIHtcblx0XHRcdHRhcmdldC5vdmVycmlkZXMgPSB7fTtcblx0XHR9XG5cdFx0bGV0IGN1cnJlbnRUYXJnZXQgPSB0YXJnZXQub3ZlcnJpZGVzO1xuXHRcdGlmIChleHRlbnNpb25OYW1lKSB7XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uID0ge307XG5cdFx0XHR9XG5cdFx0XHRpZiAoIWN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdKSB7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQuZXh0ZW5zaW9uW2V4dGVuc2lvbk5hbWVdID0ge307XG5cdFx0XHR9XG5cdFx0XHRjdXJyZW50VGFyZ2V0ID0gY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV07XG5cdFx0fVxuXHRcdGN1cnJlbnRUYXJnZXRbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSAodGFyZ2V0IGFzIFJlY29yZDxzdHJpbmcsIEZ1bmN0aW9uPilbcHJvcGVydHlLZXkudG9TdHJpbmcoKV07XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2FuIGJlIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIGJhc2VkIG9uIHRoZSBkZWZpbmVkIG92ZXJyaWRlRXhlY3V0aW9uVHlwZS5cbiAqIEBwYXJhbSBvdmVycmlkZUV4ZWN1dGlvbiBUaGUgT3ZlcnJpZGVFeGVjdXRpb24gZGVmaW5pbmcgd2hlbiB0aGUgb3ZlcnJpZGUgc2hvdWxkIHJ1biAoQmVmb3JlIC8gQWZ0ZXIgLyBJbnN0ZWFkKVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2libGUob3ZlcnJpZGVFeGVjdXRpb246IEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcjogUHJvcGVydHlEZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLm92ZXJyaWRlRXhlY3V0aW9uID0gb3ZlcnJpZGVFeGVjdXRpb24gYXMgdW5rbm93biBhcyBPdmVycmlkZUV4ZWN1dGlvbjtcblxuXHRcdC8vIGJ5IGRlZmF1bHQsIGV2ZXJ5IGV4dGVuc2libGUgbWV0aG9kIGlzIGFsc28gaG9va2FibGUgKGV4Y2VwdCB0aG9zZSBkZWZpbmVkIGFzIEluc3RlYWQpXG5cdFx0aWYgKG92ZXJyaWRlRXhlY3V0aW9uICE9PSBcIkluc3RlYWRcIikge1xuXHRcdFx0aG9va2FibGUob3ZlcnJpZGVFeGVjdXRpb24pKHRhcmdldCwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpO1xuXHRcdH1cblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIHB1YmxpY2x5IGF2YWlsYWJsZSBmb3IgY29udHJvbGxlciBleHRlbnNpb24gdXNhZ2UuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHVibGljRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpOiB2b2lkIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSB0cnVlO1xuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCB3aWxsIGJlIG9ubHkgYXZhaWxhYmxlIGZvciBpbnRlcm5hbCB1c2FnZSBvZiB0aGUgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJpdmF0ZUV4dGVuc2lvbigpOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ucHVibGljID0gZmFsc2U7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIGNhbm5vdCBiZSBmdXJ0aGVyIGV4dGVuZGVkIGJ5IG90aGVyIGNvbnRyb2xsZXIgZXh0ZW5zaW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmFsRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5maW5hbCA9IHRydWU7XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGF0IHdlIGFyZSBnb2luZyB0byB1c2UgaW5zdGFudGlhdGUgYSBjb250cm9sbGVyIGV4dGVuc2lvbiB1bmRlciB0aGUgZm9sbG93aW5nIHZhcmlhYmxlIG5hbWUuXG4gKiBAcGFyYW0gZXh0ZW5zaW9uQ2xhc3MgVGhlIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBpbnN0YW50aWF0ZWRcbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzaW5nRXh0ZW5zaW9uKGV4dGVuc2lvbkNsYXNzOiB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0bWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSBleHRlbnNpb25DbGFzcztcblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKiAjZW5kcmVnaW9uICovXG5cbi8qICNyZWdpb24gQ09OVFJPTCAqL1xuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgZGVjbGFyZWQgYXMgYW4gZXZlbnQgb24gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBldmVudCgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgZXZlbnRLZXk6IHN0cmluZyB8IFN5bWJvbCkge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmV2ZW50c1tldmVudEtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhdHRyaWJ1dGVEZWZpbml0aW9uIFRoZSBwcm9wZXJ0eSBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvcGVydHkoYXR0cmlidXRlRGVmaW5pdGlvbjogVUk1UHJvcGVydHlNZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSB0cnVlO1xuXHRcdH1cblx0XHRpZiAoYXR0cmlidXRlRGVmaW5pdGlvbi5pc0JpbmRpbmdJbmZvID09PSB0cnVlKSB7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmJpbmRhYmxlID0gZmFsc2U7XG5cdFx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmdyb3VwID0gXCJEYXRhXCI7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLnByb3BlcnRpZXNbcHJvcGVydHlLZXldID0gYXR0cmlidXRlRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhdHRyaWJ1dGVEZWZpbml0aW9uLmRlZmF1bHRWYWx1ZSA/Pz0gKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI/LigpO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC5cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGFuZCBjb25maWd1cmVzIHRoZSBmb2xsb3dpbmcgYWdncmVnYXRpb24gaW4gdGhlIGNvbnRyb2wgbWV0YWRhdGEuXG4gKiBAcGFyYW0gYWdncmVnYXRpb25EZWZpbml0aW9uIFRoZSBhZ2dyZWdhdGlvbiBkZWZpbml0aW9uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWdncmVnYXRpb24oYWdncmVnYXRpb25EZWZpbml0aW9uOiBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5tdWx0aXBsZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQvLyBVSTUgZGVmYXVsdHMgdGhpcyB0byB0cnVlIGJ1dCB0aGlzIGlzIGp1c3Qgd2VpcmQuLi5cblx0XHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5tdWx0aXBsZSA9IGZhbHNlO1xuXHRcdH1cblx0XHRpZiAoIW1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLmFnZ3JlZ2F0aW9uc1twcm9wZXJ0eUtleV0gPSBhZ2dyZWdhdGlvbkRlZmluaXRpb247XG5cdFx0fVxuXHRcdGlmIChhZ2dyZWdhdGlvbkRlZmluaXRpb24uaXNEZWZhdWx0KSB7XG5cdFx0XHRtZXRhZGF0YS5kZWZhdWx0QWdncmVnYXRpb24gPSBwcm9wZXJ0eUtleTtcblx0XHR9XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRhZ2dyZWdhdGlvbkRlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIEkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhc3NvY2lhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhIFRoZSBkZWZpbml0aW9uIG9mIHRoZSBhc3NvY2lhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc29jaWF0aW9uKHVpNUFzc29jaWF0aW9uTWV0YWRhdGE6IFVJNUFzc29jaWF0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoIW1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdG1ldGFkYXRhLmFzc29jaWF0aW9uc1twcm9wZXJ0eUtleV0gPSB1aTVBc3NvY2lhdGlvbk1ldGFkYXRhO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC5cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGluIHRoZSBtZXRhZGF0YSB0aGF0IHRoaXMgY29udHJvbCBpbXBsZW1lbnRzIGEgc3BlY2lmaWMgaW50ZXJmYWNlLlxuICogQHBhcmFtIGludGVyZmFjZU5hbWUgVGhlIG5hbWUgb2YgdGhlIGltcGxlbWVudGVkIGludGVyZmFjZVxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBtZXRob2RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGltcGxlbWVudEludGVyZmFjZShpbnRlcmZhY2VOYW1lOiBzdHJpbmcpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblxuXHRcdG1ldGFkYXRhLmludGVyZmFjZXMucHVzaChpbnRlcmZhY2VOYW1lKTtcblx0fTtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIG1ldGhvZCBzaG91bGQgYWxzbyBiZSBleHBvc2VkIHN0YXRpY2FsbHkgc28gd2UgY2FuIGNhbGwgaXQgZnJvbSBYTUwuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24geG1sRXZlbnRIYW5kbGVyKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlrZXkpIHtcblx0XHRjb25zdCBjdXJyZW50Q29uc3RydWN0b3I6IFVJNUFQSUNvbnRyb2wgPSB0YXJnZXQuY29uc3RydWN0b3IgYXMgdW5rbm93biBhcyBVSTVBUElDb250cm9sO1xuXHRcdGVuc3VyZUdldEFQSShjdXJyZW50Q29uc3RydWN0b3IpO1xuXHRcdGN1cnJlbnRDb25zdHJ1Y3Rvcltwcm9wZXJ0eWtleS50b1N0cmluZygpXSA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRcdGlmIChhcmdzPy5sZW5ndGgpIHtcblx0XHRcdFx0Y29uc3QgY3VycmVudFRhcmdldCA9IGN1cnJlbnRDb25zdHJ1Y3Rvci5nZXRBUEkoYXJnc1swXSBhcyBVSTVFdmVudCk7XG5cdFx0XHRcdGN1cnJlbnRUYXJnZXQ/Lltwcm9wZXJ0eWtleS50b1N0cmluZygpXSguLi5hcmdzKTtcblx0XHRcdH1cblx0XHR9O1xuXHR9O1xufVxuXG50eXBlIFVJNUNvbnRyb2xBbmRNb3JlID0gdHlwZW9mIENvbnRyb2wgJlxuXHRGdW5jdGlvbiAmIHtcblx0XHRyZWdpc3Rlckluc3RhbmNlPzogRnVuY3Rpb247XG5cdFx0b3ZlcnJpZGU/OiBGdW5jdGlvbjtcblx0XHRyZW5kZXJlcj86IHVua25vd247XG5cdFx0cmVuZGVyOiBGdW5jdGlvbjtcblx0XHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdH07XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgdGhlIGZvbGxvd2luZyBjbGFzcyBzaG91bGQgZGVmaW5lIGEgVUk1IGNvbnRyb2wgb2YgdGhlIHNwZWNpZmllZCBuYW1lLlxuICogQHBhcmFtIHNUYXJnZXQgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBVSTUgY2xhc3NcbiAqIEBwYXJhbSBtZXRhZGF0YURlZmluaXRpb24gSW5saW5lIG1ldGFkYXRhIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIEEgY2xhc3MgZGVjb3JhdG9yIHRoYXQgd2lsbCBjcmVhdGUgYSB1aTUgY2xhc3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVVJNUNsYXNzKHNUYXJnZXQ6IHN0cmluZywgbWV0YWRhdGFEZWZpbml0aW9uPzogUGFydGlhbDxVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uPik6IENsYXNzRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChjb25zdHJ1Y3RvcjogVUk1Q29udHJvbEFuZE1vcmUpIHtcblx0XHRpZiAoIWNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YSkge1xuXHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhID0ge307XG5cdFx0fVxuXHRcdGlmIChtZXRhZGF0YURlZmluaXRpb24pIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0XHRpZiAoY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0pIHtcblx0XHRcdFx0XHRpZiAoQXJyYXkuaXNBcnJheShjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkpIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0uY29uY2F0KFxuXHRcdFx0XHRcdFx0XHRtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSA9IHtcblx0XHRcdFx0XHRcdFx0Li4uY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0sXG5cdFx0XHRcdFx0XHRcdC4uLihtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dIGFzIG9iamVjdClcblx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0gbWV0YWRhdGFEZWZpbml0aW9uW2tleSBhcyBrZXlvZiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uXTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gcmVnaXN0ZXJVSTVNZXRhZGF0YShjb25zdHJ1Y3Rvciwgc1RhcmdldCwgY29uc3RydWN0b3IucHJvdG90eXBlKTtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlZmVyZW5jZTxUIGV4dGVuZHMgVUk1RWxlbWVudD4oKTogUmVmPFQ+IHtcblx0cmV0dXJuIHtcblx0XHRjdXJyZW50OiB1bmRlZmluZWQgYXMgdW5rbm93biBhcyBULFxuXHRcdHNldEN1cnJlbnQ6IGZ1bmN0aW9uIChvQ29udHJvbEluc3RhbmNlOiBUKTogdm9pZCB7XG5cdFx0XHR0aGlzLmN1cnJlbnQgPSBvQ29udHJvbEluc3RhbmNlO1xuXHRcdH1cblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBmb2xsb3dpbmcgb2JqZWN0IHdpbGwgaG9sZCBhIHJlZmVyZW5jZSB0byBhIGNvbnRyb2wgdGhyb3VnaCBqc3ggdGVtcGxhdGluZy5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWZpbmVSZWZlcmVuY2UoKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVsZXRlIHByb3BlcnR5RGVzY3JpcHRvci53cml0YWJsZTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRpZiAoQmFzZU9iamVjdC5pc09iamVjdEEodGFyZ2V0LCBcInNhcC51aS5jb3JlLkNvbnRyb2xcIikpIHtcblx0XHRcdGlmICghbWV0YWRhdGEucmVmZXJlbmNlc1twcm9wZXJ0eUtleV0pIHtcblx0XHRcdFx0bWV0YWRhdGEucmVmZXJlbmNlc1twcm9wZXJ0eUtleV0gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyID0gY3JlYXRlUmVmZXJlbmNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgaSBkZWNsYXJlIGl0IGFzIHN1Y2guO1xufVxuXG5mdW5jdGlvbiBfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkoanNvbk1vZGVsOiBKU09OTW9kZWwsIHByb3A6IHN0cmluZyk6IHVua25vd24ge1xuXHRjb25zdCBwYXRoSW5Nb2RlbCA9IGAvJHtwcm9wLnRvU3RyaW5nKCl9YDtcblx0Y29uc3Qgb09iaiA9IGRlZXBDbG9uZShqc29uTW9kZWwuZ2V0T2JqZWN0KHBhdGhJbk1vZGVsKSk7XG5cdGxldCBvVGFyZ2V0O1xuXHRpZiAodHlwZW9mIG9PYmogPT09IFwic3RyaW5nXCIpIHtcblx0XHRvVGFyZ2V0ID0geyB2YWx1ZTogb09iaiB9O1xuXHRcdG9UYXJnZXQudG9TdHJpbmcgPSBmdW5jdGlvbiAoKTogc3RyaW5nIHtcblx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdH07XG5cdFx0b1RhcmdldC52YWx1ZU9mID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvT2JqID09PSBcIm51bWJlclwiKSB7XG5cdFx0b1RhcmdldCA9IHsgdmFsdWU6IG9PYmogfTtcblx0XHRvVGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZS50b1N0cmluZygpO1xuXHRcdH07XG5cdFx0b1RhcmdldC52YWx1ZU9mID0gZnVuY3Rpb24gKCk6IG51bWJlciB7XG5cdFx0XHRyZXR1cm4gdGhpcy52YWx1ZTtcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvT2JqID09PSBcImJvb2xlYW5cIikge1xuXHRcdG9UYXJnZXQgPSBuZXcgQm9vbGVhbihvT2JqKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9PYmopKSB7XG5cdFx0b1RhcmdldCA9IG5ldyBQcm94eShvT2JqLCB7XG5cdFx0XHRnZXQodGFyZ2V0OiB1bmtub3duW10sIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRjb25zdCByZWYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHJldHVybiByZWYuYmluZCh0YXJnZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZiA9PT0gdW5kZWZpbmVkICYmIGlzTmFOKE51bWJlcihwLnRvU3RyaW5nKCkpKSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBwXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVmO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9UYXJnZXQgPSB7IC4uLm9PYmogfTtcblx0fVxuXHRvVGFyZ2V0Ll9fYmluZGluZ0luZm8gPSB7XG5cdFx0bW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIsXG5cdFx0cGF0aDogcGF0aEluTW9kZWxcblx0fTtcblx0cmV0dXJuIG9UYXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdGF0ZVByb3BlcnR5KFxuXHRvYmo6IFVJNUNvbnRyb2xEZWZpbml0aW9uLFxuXHR0YXJnZXRDb250cm9sOiBDb250cm9sICYge1xuXHRcdF91cGRhdGVTdGF0ZTogRnVuY3Rpb247XG5cdFx0X3VwZGF0ZVN0YXRlRGVib3VuY2VkOiBGdW5jdGlvbjtcblx0XHRfdXBkYXRlU3RhdGVUaW1lcjogdW5rbm93bjtcblx0XHRfY2hhbmdlZFByb3BzPzogc3RyaW5nW107XG5cdH1cbik6IHZvaWQge1xuXHRpZiAob2JqLm1ldGFkYXRhPy5zdGF0ZVByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgc3RhdGVNb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdHRhcmdldENvbnRyb2wuc2V0TW9kZWwoc3RhdGVNb2RlbCwgXCIkY29tcG9uZW50U3RhdGVcIik7XG5cdFx0bGV0IHVwZGF0aW5nU3RhdGUgPSBmYWxzZTtcblx0XHQvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgc3RhdGUgdG8gYmUgYXBwbGllZCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgYXBwbGllZCBpbiB0ZXN0c1xuXHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3VwZGF0ZVN0YXRlVGltZXI7XG5cdFx0XHRpZiAoIXVwZGF0aW5nU3RhdGUpIHtcblx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdGF3YWl0ICh0aGlzIGFzIHsgb25TdGF0ZUNoYW5nZT86IEZ1bmN0aW9uIH0pLm9uU3RhdGVDaGFuZ2U/Lih0aGlzLl9jaGFuZ2VkUHJvcHMpO1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMgPSBbXTtcblx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQgPSBmdW5jdGlvbiAoY2hhbmdlZFByb3A6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0dGhpcy5fY2hhbmdlZFByb3BzID8/PSBbXTtcblx0XHRcdGlmICghdGhpcy5fY2hhbmdlZFByb3BzLmluY2x1ZGVzKGNoYW5nZWRQcm9wKSkge1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMucHVzaChjaGFuZ2VkUHJvcCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuX3VwZGF0ZVN0YXRlVGltZXIgJiYgIXVwZGF0aW5nU3RhdGUpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN0YXRlKCk7XG5cdFx0XHRcdH0sIDIwMCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29udHJvbCwgb2JqLm1ldGFkYXRhLnN0YXRlUHJvcGVydHksIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb3h5KHN0YXRlTW9kZWwsIHtcblx0XHRcdFx0XHRnZXQ6ICh0YXJnZXQ6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gX2dldEhhbmRsZXJGb3JTdGF0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXQ6IChzZXRTdGF0ZU1vZGVsOiBKU09OTW9kZWwsIHByb3AsIHZhbHVlKTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzZXRSZXN1bHQgPSBzZXRTdGF0ZU1vZGVsLnNldFByb3BlcnR5KGAvJHtwcm9wLnRvU3RyaW5nKCl9YCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQocHJvcC50b1N0cmluZygpKTtcblx0XHRcdFx0XHRcdHJldHVybiBzZXRSZXN1bHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHQvLyBSZXBsYWNpbmcgdGhlIGNvbXBsZXRlIHN0YXRlXG5cdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoYC9gLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sW29iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5IGFzIGtleW9mIENvbnRyb2xdID0geyAuLi5vYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSB9IGFzIG5ldmVyO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRjb25zdCBmbkFmdGVySW5pdCA9IG91dHB1dC5wcm90b3R5cGUuYWZ0ZXJJbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0X2NyZWF0ZVN0YXRlUHJvcGVydHkob2JqLCB0aGlzKTtcblx0XHRpZiAoZm5BZnRlckluaXQpIHtcblx0XHRcdGZuQWZ0ZXJJbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fTtcblxuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUE4SUEsTUFBTUEsY0FBYyxHQUFHLFNBQUFBLENBQVVDLE1BQXNELEVBQWdDO0lBQ3RIQSxNQUFNLENBQUNDLFFBQVEsR0FBR0MsS0FBSyxDQUN0QjtNQUNDQyxvQkFBb0IsRUFBRSxDQUFDLENBQUM7TUFDeEJDLFVBQVUsRUFBRSxDQUFDLENBQUM7TUFDZEMsWUFBWSxFQUFFLENBQUMsQ0FBQztNQUNoQkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO01BQ1hDLE1BQU0sRUFBRSxDQUFDLENBQUM7TUFDVkMsVUFBVSxFQUFFO0lBQ2IsQ0FBQyxFQUNEVixNQUFNLENBQUNDLFFBQVEsSUFBSSxDQUFDLENBQ3JCLENBQWlDO0lBQ2pDLE9BQU9ELE1BQU0sQ0FBQ0MsUUFBUTtFQUN2QixDQUFDOztFQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7RUFDQSxTQUFTVSxxQkFBcUJBLENBQUNYLE1BQXFCLEVBQUU7SUFDckQsT0FBTyxVQUVOWSxNQUFnQixFQUVBO01BQUEsSUFEaEJDLE1BQWMsR0FBQUMsU0FBQSxDQUFBQyxNQUFBLFFBQUFELFNBQUEsUUFBQUUsU0FBQSxHQUFBRixTQUFBLE1BQUdkLE1BQU0sQ0FBQ2lCLFdBQVcsQ0FBQyxDQUFDLENBQUNDLE9BQU8sQ0FBQyxDQUFDO01BRS9DLElBQUlDLE9BQU8sR0FBR1AsTUFBTSxDQUFDUSxTQUFTLENBQUMsQ0FBeUI7TUFDeEQsSUFBSXBCLE1BQU0sQ0FBQ3FCLGdCQUFnQixFQUFFO1FBQzVCRixPQUFPLEdBQUduQixNQUFNLENBQUNxQixnQkFBZ0IsQ0FBQ0YsT0FBTyxDQUFDLElBQUlBLE9BQU87TUFDdEQ7TUFDQSxPQUFPQSxPQUFPLElBQUksQ0FBQ0EsT0FBTyxDQUFDRyxHQUFHLENBQUlULE1B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
784
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwic3RhdGVQcm9wZXJ0eSIsIkVycm9yIiwid3JpdGFibGUiLCJzdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlIiwiaW5pdGlhbGl6ZXIiLCJfZXhwb3J0cyIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwibWl4aW4iLCJpbnRlcmZhY2VDbGFzcyIsImJhc2VDdG9yIiwiZXh0ZW5kIiwiZ2V0SW50ZXJmYWNlTmFtZSIsIk9iamVjdCIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwibmFtZSIsImRlZmluZVByb3BlcnR5IiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiY3JlYXRlIiwic2V0dXBNaXhpbiIsImNyZWF0ZVJlZmVyZW5jZSIsImN1cnJlbnQiLCJzZXRDdXJyZW50Iiwib0NvbnRyb2xJbnN0YW5jZSIsImRlZmluZVJlZmVyZW5jZSIsIkJhc2VPYmplY3QiLCJpc09iamVjdEEiLCJfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkiLCJqc29uTW9kZWwiLCJwcm9wIiwicGF0aEluTW9kZWwiLCJvT2JqIiwiZGVlcENsb25lIiwiZ2V0T2JqZWN0Iiwib1RhcmdldCIsIm1vZGVsIiwiUHJveHkiLCJwIiwicmVjZWl2ZXIiLCJyZWYiLCJSZWZsZWN0IiwiYmluZCIsImlzTmFOIiwiTnVtYmVyIiwiX19iaW5kaW5nSW5mbyIsInBhdGgiLCJfY3JlYXRlU3RhdGVQcm9wZXJ0eSIsIm9iaiIsImdldE1vZGVsIiwic2V0TW9kZWwiLCJKU09OTW9kZWwiLCJzdGF0ZU1vZGVsIiwidXBkYXRpbmdTdGF0ZSIsImJvdW5kVG9TdGF0ZVByb3BzIiwicHJvcGVydHlOYW1lIiwicHJvcGVydHlEZWYiLCJiaW5kVG9TdGF0ZSIsImluaXRpYWxCb3VuZFByb3BlcnRpZXMiLCJnZXRQcm9wZXJ0eSIsInNldFByb3BlcnR5IiwiYXR0YWNoUHJvcGVydHlDaGFuZ2UiLCJldnQiLCJnZXRQYXJhbWV0ZXIiLCJzdWJzdHJpbmciLCJpbmNsdWRlcyIsIl91cGRhdGVTdGF0ZSIsIl91cGRhdGVTdGF0ZVRpbWVyIiwib25TdGF0ZUNoYW5nZSIsIl9jaGFuZ2VkUHJvcHMiLCJfdXBkYXRlU3RhdGVEZWJvdW5jZWQiLCJjaGFuZ2VkUHJvcCIsInNldFRpbWVvdXQiLCJjb25maWd1cmFibGUiLCJzZXRTdGF0ZU1vZGVsIiwidmFsdWUiLCJrbm93bkJvdW5kUHJvcGVydGllcyIsIl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlIiwic2V0UmVzdWx0IiwiZm5BcHBseVNldHRpbmdzIiwiYXBwbHlTZXR0aW5ncyIsIm1TZXR0aW5ncyIsIm1vZGVscyIsIiRjb21wb25lbnRTdGF0ZSIsImNhbGwiLCJmblNldFByb3BlcnR5Iiwic1Byb3BlcnR5TmFtZSIsIm9WYWx1ZSIsImJTdXBwcmVzc0ludmFsaWRhdGUiLCJjbGF6eiIsImluT2JqIiwib2JqTmFtZSIsImJhc2VUeXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRTdGVyZW90eXBlIiwicmVuZGVyZXJEZWZpbml0aW9uIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJhcGlWZXJzaW9uIiwia2V5cyIsImUiLCJjRXh0TmFtZSIsIm91dHB1dCIsImZuSW5pdCIsImluaXQiLCJmbkFmdGVySW5pdCIsImFmdGVySW5pdCIsIl90aGlzIiwiX2xlbjIiLCJfa2V5MiIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmYXVsdCIsIl9iaW5kaW5nUHJvcGVydGllcyIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJiaW5kaW5nUHJvcGVydHlWYWx1ZSIsInByb3BWYWx1ZSIsIl9hcHBseWluZ1NldHRpbmdzIiwiYUFnZ3JlZ2F0aW9uS2V5cyIsImFnZ3JlZ2F0aW9uS2V5IiwiYWdncmVnYXRpb25EZWYiLCJzZXRBZ2dyZWdhdGlvbiIsImFnZ3JlZ2F0aW9uQ29udGVudCIsImdldEFnZ3JlZ2F0aW9uIiwiYUFzc29jaWF0aW9uS2V5cyIsImFzc29jaWF0aW9uS2V5Iiwic2V0QXNzb2NpYXRpb24iLCJnZXRBc3NvY2lhdGlvbiIsInJlZmVyZW5jZVByb3BlcnRpZXMiLCJtZXRob2ROYW1lIiwibWV0aG9kRGVmaW5pdGlvbiIsIm1ldGhvZEhvbGRlciIsIm1ldGhvZEFycmF5cyIsInJldmVyc2UiLCJfbGVuMyIsIm1ldGhvZEFyZ3MiLCJfa2V5MyIsImFyZyIsIm9FeHRlbnNpb24iLCJwb2wiLCJfbGVuNCIsIl9rZXk0Iiwib0NsYXNzIiwiTWV0YWRhdGEiLCJjcmVhdGVDbGFzcyIsInVpZCIsIkNvbnRyb2xsZXJNZXRhZGF0YSIsIl9zdGF0aWNPdmVycmlkZSIsIl9vdmVycmlkZSIsIk9iamVjdFBhdGgiXSwic291cmNlUm9vdCI6Ii4iLCJzb3VyY2VzIjpbIkNsYXNzU3VwcG9ydC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgT2JqZWN0UGF0aCBmcm9tIFwic2FwL2Jhc2UvdXRpbC9PYmplY3RQYXRoXCI7XG5pbXBvcnQgZGVlcENsb25lIGZyb20gXCJzYXAvYmFzZS91dGlsL2RlZXBDbG9uZVwiO1xuaW1wb3J0IG1lcmdlIGZyb20gXCJzYXAvYmFzZS91dGlsL21lcmdlXCI7XG5pbXBvcnQgdWlkIGZyb20gXCJzYXAvYmFzZS91dGlsL3VpZFwiO1xuaW1wb3J0IHsgaG9va2FibGUgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvSG9va1N1cHBvcnRcIjtcbmltcG9ydCB0eXBlIHsgUmVmIH0gZnJvbSBcInNhcC9mZS9iYXNlL2pzeC1ydW50aW1lL2pzeFwiO1xuaW1wb3J0IHR5cGUgVUk1RXZlbnQgZnJvbSBcInNhcC91aS9iYXNlL0V2ZW50XCI7XG5pbXBvcnQgdHlwZSBNYW5hZ2VkT2JqZWN0IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgdHlwZSB7IE1vZGVsJFByb3BlcnR5Q2hhbmdlRXZlbnQgfSBmcm9tIFwic2FwL3VpL21vZGVsL01vZGVsXCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGJpbmRUb1N0YXRlPzogc3RyaW5nO1xuXHRleHBlY3RlZEFubm90YXRpb25zPzogc3RyaW5nW107XG5cdGV4cGVjdGVkVHlwZXM/OiBzdHJpbmdbXTtcblx0YWxsb3dlZFZhbHVlcz86IHN0cmluZ1tdO1xuXHR2aXNpYmlsaXR5Pzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YWx0VHlwZXM/OiBzdHJpbmdbXTtcblx0bXVsdGlwbGU/OiBib29sZWFuO1xuXHRpc0RlZmF1bHQ/OiBib29sZWFuO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRkZWZhdWx0Q2xhc3M/OiB1bmtub3duO1xuXHRzaW5ndWxhck5hbWU/OiBzdHJpbmc7XG5cdHZpc2liaWxpdHk/OiBzdHJpbmc7XG5cdGZvcndhcmRpbmc/OiBvYmplY3Q7XG59O1xuZXhwb3J0IHR5cGUgVUk1QXNzb2NpYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcbn07XG5leHBvcnQgdHlwZSBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uID0ge1xuXHRkZWZhdWx0QWdncmVnYXRpb24/OiBzdHJpbmc7XG5cdGNvbnRyb2xsZXJFeHRlbnNpb25zOiBSZWNvcmQ8c3RyaW5nLCB0eXBlb2YgQ29udHJvbGxlckV4dGVuc2lvbiB8IEZ1bmN0aW9uPjtcblx0cHJvcGVydGllczogUmVjb3JkPHN0cmluZywgVUk1UHJvcGVydHlNZXRhZGF0YT47XG5cdGFnZ3JlZ2F0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QWdncmVnYXRpb25NZXRhZGF0YT47XG5cdHJlZmVyZW5jZXM6IFJlY29yZDxzdHJpbmcsIGJvb2xlYW4+O1xuXHRhc3NvY2lhdGlvbnM6IFJlY29yZDxzdHJpbmcsIFVJNUFzc29jaWF0aW9uTWV0YWRhdGE+O1xuXHRtZXRob2RzOiBSZWNvcmQ8c3RyaW5nLCBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbj47XG5cdGV2ZW50czogUmVjb3JkPHN0cmluZywge30+O1xuXHRpbnRlcmZhY2VzOiBzdHJpbmdbXTtcblx0bGlicmFyeT86IHN0cmluZztcblx0ZGVzaWdudGltZT86IHN0cmluZztcblx0Y29uZmlnPzoge1xuXHRcdGZ1bGxXaWR0aD86IGJvb2xlYW47XG5cdH07XG5cdHN0YXRlUHJvcGVydHk/OiBzdHJpbmc7XG5cdHN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRtYW5pZmVzdD86IHN0cmluZyB8IHVua25vd247XG5cdHJldHVyblR5cGVzPzogc3RyaW5nW107XG5cdGJ1aWxkaW5nQmxvY2tNZXRhZGF0YT86IHVua25vd247XG59O1xuZXhwb3J0IHR5cGUgQWNjZXNzb3JEZXNjcmlwdG9yPFQ+ID0gVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8VD4gJiB7IGluaXRpYWxpemVyPzogKCkgPT4gVCB9O1xudHlwZSBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGU/OiB7IGV4dGVuc2lvbj86IFJlY29yZDxzdHJpbmcsIE92ZXJyaWRlRGVmaW5pdGlvbj4gfSAmIHtcblx0XHRbazogc3RyaW5nXTogRnVuY3Rpb247XG5cdH07XG5cdG92ZXJyaWRlcz86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRyZW5kZXJlcj86IEZ1bmN0aW9uO1xufTtcblxudHlwZSBVSTVDb250cm9sRGVmaW5pdGlvbiA9IHtcblx0bWV0YWRhdGE/OiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uO1xuXHRvdmVycmlkZT86IHVua25vd247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUFQSUNvbnRyb2wgPSBDb250cm9sICYge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG5cdF9fYXBpUmVnaXN0ZXJlZDogYm9vbGVhbjtcbn0gJiB7XG5cdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcbn07XG5cbmV4cG9ydCB0eXBlIFhNTEV2ZW50SG9sZGVyID0ge1xuXHRnZXRBUEkoZXZlbnQ6IFVJNUV2ZW50LCBmcWRuPzogc3RyaW5nKTogVUk1QVBJQ29udHJvbCB8IHVuZGVmaW5lZDtcblx0aW5zdGFuY2VNYXA6IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT47XG59O1xuXG50eXBlIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+ID0ge1xuXHQvLyBuZWVkZWQgYmVjYXVzZSBvZiB0aGUgVFMgY29tcGlsZXJcblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBGdW5jdGlvbiA/IG5ldmVyIDogSztcbn1ba2V5b2YgVF07XG5leHBvcnQgdHlwZSBQcm9wZXJ0aWVzT2Y8VCwgSyBleHRlbmRzIGtleW9mIFQgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+ID0gUGFydGlhbDxQaWNrPFQsIENvbnRyb2xQcm9wZXJ0eU5hbWVzPFQ+Pj4gJlxuXHQoSyBleHRlbmRzIGtleW9mIFQgPyBQYXJ0aWFsPFBpY2s8VCwgSz4+IDoge30pICZcblx0JENvbnRyb2xTZXR0aW5ncztcbmV4cG9ydCB0eXBlIENvbnZlcnRDb250ZXh0VG9TdHJpbmc8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBLIGV4dGVuZHMgXCJtZXRhUGF0aFwiIHwgXCJjb250ZXh0UGF0aFwiID8gc3RyaW5nIDogVFtLXTtcbn07XG50eXBlIENvbnRleHRUb1N0cmluZzxUPiA9IHtcblx0W0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDb250ZXh0IHwgdW5kZWZpbmVkID8gc3RyaW5nIHwgdW5kZWZpbmVkIDogVFtLXTtcbn07XG5cbmV4cG9ydCB0eXBlIFByb3BlcnRpZXNPZkJ1aWxkaW5nQmxvY2s8VD4gPSBDb250ZXh0VG9TdHJpbmc8UHJvcGVydGllc09mPFQ+PjtcbmV4cG9ydCB0eXBlIFN0cmljdFByb3BlcnRpZXNPZjxUPiA9IFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+O1xuZXhwb3J0IHR5cGUgVUk1QWNjZXNzb3JzPFQ+ID0ge1xuXHQvLyBBZGQgYWxsIHRoZSBnZXRYWFggbWV0aG9kLCBtaWdodCBhZGQgdG9vIG11Y2ggYXMgSSdtIG5vdCBmaWx0ZXJpbmcgb24gYWN0dWFsIHByb3BlcnRpZXMuLi5cblx0W1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD4gYXMgYGdldCR7Q2FwaXRhbGl6ZTxzdHJpbmcgJiBQPn1gXTogKCkgPT4gVFtQXTtcbn07XG5leHBvcnQgdHlwZSBVSTVTZXR0ZXJzPFQ+ID0ge1xuXHQvLyBBZGQgYWxsIHRoZSBzZXRYWFggbWV0aG9kLCBtaWdodCBhZGQgdG9vIG11Y2ggYXMgSSdtIG5vdCBmaWx0ZXJpbmcgb24gYWN0dWFsIHByb3BlcnRpZXMuLi5cblx0W1AgaW4ga2V5b2YgUmVxdWlyZWQ8VD4gYXMgYHNldCR7Q2FwaXRhbGl6ZTxzdHJpbmcgJiBQPn1gXTogKHZhbHVlOiBUW1BdKSA9PiBUO1xufTtcbmV4cG9ydCB0eXBlIEVuaGFuY2VXaXRoVUk1PFQ+ID0ge1xuXHRuZXcgKHByb3BzOiBQcm9wZXJ0aWVzT2Y8VD4pOiBFbmhhbmNlV2l0aFVJNTxUPjtcblx0bmV3IChzSWQ6IHN0cmluZywgcHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xufSAmIFQgJlxuXHRVSTVBY2Nlc3NvcnM8VD4gJlxuXHRVSTVTZXR0ZXJzPFQ+O1xuXG5leHBvcnQgdHlwZSBFeHRlbnNpb25PdmVycmlkZUV4ZWN1dGlvbiA9IFwiSW5zdGVhZFwiIHwgXCJCZWZvcmVcIiB8IFwiQWZ0ZXJcIiB8IFwiQWZ0ZXJBc3luY1wiIHwgXCJCZWZvcmVBc3luY1wiO1xuXG5jb25zdCBlbnN1cmVNZXRhZGF0YSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uIHwgVUk1Q29udHJvbERlZmluaXRpb24pOiBVSTVDb250cm9sTWV0YWRhdGFEZWZpbml0aW9uIHtcblx0dGFyZ2V0Lm1ldGFkYXRhID0gbWVyZ2UoXG5cdFx0e1xuXHRcdFx0Y29udHJvbGxlckV4dGVuc2lvbnM6IHt9LFxuXHRcdFx0cHJvcGVydGllczoge30sXG5cdFx0XHRhZ2dyZWdhdGlvbnM6IHt9LFxuXHRcdFx0cmVmZXJlbmNlczoge30sXG5cdFx0XHRhc3NvY2lhdGlvbnM6IHt9LFxuXHRcdFx0bWV0aG9kczoge30sXG5cdFx0XHRldmVudHM6IHt9LFxuXHRcdFx0aW50ZXJmYWNlczogW11cblx0XHR9LFxuXHRcdHRhcmdldC5tZXRhZGF0YSA/PyB7fVxuXHQpIGFzIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdHJldHVybiB0YXJnZXQubWV0YWRhdGE7XG59O1xuXG4vKipcbiAqIE1ldGhvZCB0aGF0IHdpbGwgZmluZCB0aGUgY29ycmVjdCBBUEkgb2JqZWN0IGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnRyb2wgaGllcmFyY2h5LlxuICogQHBhcmFtIHRhcmdldFxuICogQHJldHVybnMgVGhlIHByb3BlciBnZXRBUEkgZnVuY3Rpb24gZm9yIHRoaXMgY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gcHJlcGFyZUdldEFQSUZ1bmN0aW9uKHRhcmdldDogVUk1QVBJQ29udHJvbCkge1xuXHRyZXR1cm4gZnVuY3Rpb24gPFQgZXh0ZW5kcyBVSTVBUElDb250cm9sPihcblx0XHR0aGlzOiBVSTVBUElDb250cm9sLFxuXHRcdG9FdmVudDogVUk1RXZlbnQsXG5cdFx0YXBpRlFOOiBzdHJpbmcgPSB0YXJnZXQuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKClcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0bGV0IG9Tb3VyY2UgPSBvRXZlbnQuZ2V0U291cmNlKCkgYXMgTWFuYWdlZE9iamVjdCB8IG51bGw7XG5cdFx0aWYgKHRhcmdldC5fZ2V0QVBJRXh0ZW5zaW9uKSB7XG5cdFx0XHRvU291cmNlID0gdGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24ob1NvdXJjZSkgPz8gb1NvdXJjZTtcblx0XHR9XG5cdFx0d2hpbGUgKG9Tb3VyY2UgJiYgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikgJiYgb1NvdXJjZS5nZXRQYXJlbnQpIHtcblx0XHRcdGlmICh0aGlzLmlzRGVwZW5kZW50Qm91bmQpIHtcblx0XHRcdFx0Y29uc3Qgb0RlcGVuZGVudHMgPSAob1NvdXJjZSBhcyBDb250cm9sKS5nZXREZXBlbmRlbnRzKCk7XG5cdFx0XHRcdGNvbnN0IGhhc0NvcnJlY3REZXBlbmRlbnQgPSBvRGVwZW5kZW50cy5maW5kKChvRGVwZW5kZW50OiBVSTVFbGVtZW50KSA9PiBvRGVwZW5kZW50LmlzQShhcGlGUU4pKTtcblx0XHRcdFx0aWYgKGhhc0NvcnJlY3REZXBlbmRlbnQpIHtcblx0XHRcdFx0XHRvU291cmNlID0gaGFzQ29ycmVjdERlcGVuZGVudCBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0b1NvdXJjZSA9IG9Tb3VyY2UuZ2V0UGFyZW50KCkgYXMgdW5rbm93biBhcyBUO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIW9Tb3VyY2UgfHwgIW9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdGNvbnN0IG9Tb3VyY2VNYXAgPSB0aGlzLmluc3RhbmNlTWFwLmdldCh0aGlzKSBhcyBUW107XG5cdFx0XHRvU291cmNlID0gb1NvdXJjZU1hcD8uW29Tb3VyY2VNYXAubGVuZ3RoIC0gMV07XG5cdFx0fVxuXHRcdGxldCB0YXJnZXRDb250cm9sO1xuXHRcdGlmIChvU291cmNlICYmIG9Tb3VyY2UuaXNBPFQ+KGFwaUZRTikpIHtcblx0XHRcdHRhcmdldENvbnRyb2wgPSBvU291cmNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGFyZ2V0Q29udHJvbDtcblx0fTtcbn1cblxuLyoqXG4gKiBFbnN1cmVzIHRoYXQgd2hlbiBhbiB4bWxFdmVudEhhbmRsZXIgaXMgZGVmaW5lZCwgdGhlIGBnZXRBUElgIGZ1bmN0aW9uIGlzIHByb3Blcmx5IGFzc2lnbmVkLlxuICogQHBhcmFtIHRhcmdldCBUaGUgY2xhc3MgY29uc3RydWN0b3IgdGhhdCBzaG91bGQgaG9sZCB0aGUgc3RhdGljIGZ1bmN0aW9uc1xuICovXG5jb25zdCBlbnN1cmVHZXRBUEkgPSBmdW5jdGlvbiAodGFyZ2V0OiBVSTVBUElDb250cm9sKTogdm9pZCB7XG5cdGlmICghdGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCkge1xuXHRcdHRhcmdldC5fX2FwaVJlZ2lzdGVyZWQgPSB0cnVlO1xuXHRcdHRhcmdldC5pbnN0YW5jZU1hcCA9IG5ldyBXZWFrTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG5cdFx0dGFyZ2V0LnJlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbiAoX2luc3RhbmNlOiBGdW5jdGlvbik6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLmluc3RhbmNlTWFwLmdldChfaW5zdGFuY2UuY29uc3RydWN0b3IpKSB7XG5cdFx0XHRcdHRoaXMuaW5zdGFuY2VNYXAuc2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvciwgW10pO1xuXHRcdFx0fVxuXHRcdFx0KHRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikgYXMgb2JqZWN0W10pLnB1c2goX2luc3RhbmNlKTtcblx0XHR9O1xuXHRcdHRhcmdldC5nZXRBUEkgPSBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0KTtcblx0fVxufTtcblxudHlwZSBFeHRlbmRXaXRoT2JqZWN0PFQsIEs+ID0gVCBleHRlbmRzIG9iamVjdCA/IEsgJiB7IFtUS2V5IGluIGtleW9mIFRdPzogQmluZGluZ0luZm9Ib2xkZXI8VFtUS2V5XT4gfSA6IEs7XG5cbmV4cG9ydCB0eXBlIFN0YXRlT2Y8VD4gPSB7XG5cdFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQXJyYXk8aW5mZXIgVT4gfCBSZWFkb25seUFycmF5PGluZmVyIFU+ID8gRXh0ZW5kV2l0aE9iamVjdDxVLCBSZWFkb25seUFycmF5PFU+PiA6IFRbS107XG59O1xuZXhwb3J0IHR5cGUgQmluZGluZ0luZm9Ib2xkZXI8VD4gPSBUICYge1xuXHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsOiBzdHJpbmc7XG5cdFx0dHlwZTogVDtcblx0fTtcbn07XG5cbi8qKlxuICogQWxsb3dzIHRvIGRlZmluZSBhIHByb3BlcnR5IHRoYXQgd2lsbCBob2xkIHRoZSBjb250cm9sIHN0YXRlLlxuICpcbiAqIFByb3BlcnRpZXMgZGVmaW5lZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGUgY29udHJvbCBzdGF0ZSB3aGVuIHVzZWQgaW4gSlNYLlxuICogQXJyYXlzIG5lZWQgdG8gYmUgYm91bmQgdXNpbmcgdGhlIGBiaW5kU3RhdGVgIGZ1bmN0aW9uLlxuICogQGV4cGVyaW1lbnRhbFxuICogQHJldHVybnMgQSBwcm9wZXJ0eSBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVN0YXRlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmIChtZXRhZGF0YS5zdGF0ZVByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk9ubHkgb25lIHN0YXRlIHByb3BlcnR5IHBlciBjb250cm9sIGlzIGFsbG93ZWRcIik7XG5cdFx0fVxuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHkgPSBwcm9wZXJ0eUtleTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kT3ZlcnJpZGUoZXh0ZW5zaW9uTmFtZT86IHN0cmluZyk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZSkge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlID0ge307XG5cdFx0fVxuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlcykge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlcyA9IHt9O1xuXHRcdH1cblx0XHRsZXQgY3VycmVudFRhcmdldCA9IHRhcmdldC5vdmVycmlkZXM7XG5cdFx0aWYgKGV4dGVuc2lvbk5hbWUpIHtcblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb24pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXTtcblx0XHR9XG5cdFx0Y3VycmVudFRhcmdldFtwcm9wZXJ0eUtleS50b1N0cmluZygpXSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+KVtwcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24gYmFzZWQgb24gdGhlIGRlZmluZWQgb3ZlcnJpZGVFeGVjdXRpb25UeXBlLlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaWNFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IHRydWU7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgb25seSBhdmFpbGFibGUgZm9yIGludGVybmFsIHVzYWdlIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBleHRlbnNpb25DbGFzcyBUaGUgY29udHJvbGxlciBleHRlbnNpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNpbmdFeHRlbnNpb24oZXh0ZW5zaW9uQ2xhc3M6IHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRtZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IGV4dGVuc2lvbkNsYXNzO1xuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qICNlbmRyZWdpb24gKi9cblxuLyogI3JlZ2lvbiBDT05UUk9MICovXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiBldmVudCBvbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb24gVGhlIHByb3BlcnR5IGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShhdHRyaWJ1dGVEZWZpbml0aW9uOiBVSTVQcm9wZXJ0eU1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSBmYWxzZTtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZ3JvdXAgPSBcIkRhdGFcIjtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBhdHRyaWJ1dGVEZWZpbml0aW9uO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhZ2dyZWdhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3M/Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3Moc1RhcmdldDogc3RyaW5nLCBtZXRhZGF0YURlZmluaXRpb24/OiBQYXJ0aWFsPFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24+KTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdG9yOiBVSTVDb250cm9sQW5kTW9yZSkge1xuXHRcdGlmICghY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhKSB7XG5cdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEgPSB7fTtcblx0XHR9XG5cdFx0aWYgKG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSkge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0ge1xuXHRcdFx0XHRcdFx0XHQuLi5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSxcblx0XHRcdFx0XHRcdFx0Li4uKG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl0gYXMgb2JqZWN0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWdpc3RlclVJNU1ldGFkYXRhKGNvbnN0cnVjdG9yLCBzVGFyZ2V0LCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxudHlwZSBDb25zdHJ1Y3RvcjxUID0ge30+ID0gbmV3ICguLi5hOiB1bmtub3duW10pID0+IFQ7XG4vKipcbiAqIE1peGluIGEgc3BlY2lmaWMgaW50ZXJmYWNlIGluY2x1ZGluZyBhbGwgaXRzIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgaW50byB0aGUgY29udHJvbC5cbiAqIEBwYXJhbSBpbnRlcmZhY2VDbGFzcyBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB0aGUgY29udHJvbFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gbWl4aW48VCBleHRlbmRzIElJbnRlcmZhY2VXaXRoTWl4aW4+KGludGVyZmFjZUNsYXNzOiBDb25zdHJ1Y3RvcjxUPik6IENsYXNzRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uIChiYXNlQ3RvcjogVUk1Q29udHJvbEFuZE1vcmUpIHtcblx0XHRpZiAoYmFzZUN0b3IucHJvdG90eXBlLmV4dGVuZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiVGhlIG1peGluSW50ZXJmYWNlIGRlY29yYXRvciBtdXN0IGJlIHBsYWNlZCBhZnRlciBgZGVmaW5lVWk1Q2xhc3NgXCIpO1xuXHRcdH1cblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKGJhc2VDdG9yLnByb3RvdHlwZSk7XG5cdFx0Y29uc3QgaW50ZXJmYWNlTmFtZSA9IGludGVyZmFjZUNsYXNzLnByb3RvdHlwZS5nZXRJbnRlcmZhY2VOYW1lPy4oKTtcblx0XHRpZiAoaW50ZXJmYWNlTmFtZSkge1xuXHRcdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHRcdH1cblxuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGludGVyZmFjZUNsYXNzLnByb3RvdHlwZSkuZm9yRWFjaCgobmFtZSkgPT4ge1xuXHRcdFx0aWYgKG5hbWUgIT09IFwiY29uc3RydWN0b3JcIiAmJiBuYW1lICE9PSBcInNldHVwTWl4aW5cIikge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0YmFzZUN0b3IucHJvdG90eXBlLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbnRlcmZhY2VDbGFzcy5wcm90b3R5cGUsIG5hbWUpIHx8IE9iamVjdC5jcmVhdGUobnVsbClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9KTtcblx0XHQvLyBIb29rIHRvIGFkZCBwb3RlbnRpYWxseSBtb3JlIGxvZ2ljIHRvIHRoZSBtaXhpblxuXHRcdGludGVyZmFjZUNsYXNzLnByb3RvdHlwZS5zZXR1cE1peGluPy4oYmFzZUN0b3IpO1xuXHRcdHJldHVybiBiYXNlQ3Rvcjtcblx0fSBhcyBDbGFzc0RlY29yYXRvcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSW50ZXJmYWNlV2l0aE1peGluIHtcblx0LyoqXG5cdCAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0aGF0IHNob3VsZCBiZSBhZGRlZCB0byB0aGUgcmVjZWl2aW5nIGNvbnRyb2wuXG5cdCAqIElmIG5vdCBkZWZpbmVkLCB0aGUgaW50ZXJmYWNlIHdpbGwgbm90IGJlIGFkZGVkLlxuXHQgKiBAcmV0dXJucyBUaGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlXG5cdCAqL1xuXHRnZXRJbnRlcmZhY2VOYW1lPygpOiBzdHJpbmc7XG5cblx0LyoqXG5cdCAqIEhvb2sgdG8gYWRkIG1vcmUgbG9naWMgdG8gdGhlIG1peGluLlxuXHQgKiBUaGlzIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbnRyb2xzIGFyZSBjcmVhdGVkIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgc29tZSBhZGRpdGlvbmFsIGxvZ2ljIHRvIHRoZSBiYXNlIGNsYXNzLlxuXHQgKiBAcGFyYW0gYmFzZUNsYXNzIFRoZSBiYXNlIGNsYXNzIHRoYXQgd2lsbCBiZSBleHRlbmRlZFxuXHQgKi9cblx0c2V0dXBNaXhpbj8oYmFzZUNsYXNzOiBGdW5jdGlvbik6IHZvaWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZWZlcmVuY2U8VCBleHRlbmRzIFVJNUVsZW1lbnQ+KCk6IFJlZjxUPiB7XG5cdHJldHVybiB7XG5cdFx0Y3VycmVudDogdW5kZWZpbmVkIGFzIHVua25vd24gYXMgVCxcblx0XHRzZXRDdXJyZW50OiBmdW5jdGlvbiAob0NvbnRyb2xJbnN0YW5jZTogVCk6IHZvaWQge1xuXHRcdFx0dGhpcy5jdXJyZW50ID0gb0NvbnRyb2xJbnN0YW5jZTtcblx0XHR9XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgZm9sbG93aW5nIG9iamVjdCB3aWxsIGhvbGQgYSByZWZlcmVuY2UgdG8gYSBjb250cm9sIHRocm91Z2gganN4IHRlbXBsYXRpbmcuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIHByb3BlcnR5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lUmVmZXJlbmNlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cdFx0aWYgKEJhc2VPYmplY3QuaXNPYmplY3RBKHRhcmdldCwgXCJzYXAudWkuY29yZS5Db250cm9sXCIpKSB7XG5cdFx0XHRpZiAoIW1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldKSB7XG5cdFx0XHRcdG1ldGFkYXRhLnJlZmVyZW5jZXNbcHJvcGVydHlLZXldID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0KHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplciA9IGNyZWF0ZVJlZmVyZW5jZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuZnVuY3Rpb24gX2dldEhhbmRsZXJGb3JTdGF0ZVByb3BlcnR5KGpzb25Nb2RlbDogSlNPTk1vZGVsLCBwcm9wOiBzdHJpbmcpOiB1bmtub3duIHtcblx0Y29uc3QgcGF0aEluTW9kZWwgPSBgLyR7cHJvcC50b1N0cmluZygpfWA7XG5cdGNvbnN0IG9PYmogPSBkZWVwQ2xvbmUoanNvbk1vZGVsLmdldE9iamVjdChwYXRoSW5Nb2RlbCkpO1xuXHRsZXQgb1RhcmdldDtcblx0aWYgKHByb3AgPT09IFwiX19iaW5kaW5nSW5mb1wiKSB7XG5cdFx0cmV0dXJuIHsgbW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIgfTtcblx0fVxuXHRpZiAodHlwZW9mIG9PYmogPT09IFwic3RyaW5nXCIpIHtcblx0XHRvVGFyZ2V0ID0gb09iajtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJudW1iZXJcIikge1xuXHRcdG9UYXJnZXQgPSBvT2JqO1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvT2JqID09PSBcImJvb2xlYW5cIikge1xuXHRcdG9UYXJnZXQgPSBvT2JqO1xuXHR9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkob09iaikpIHtcblx0XHRvVGFyZ2V0ID0gbmV3IFByb3h5KG9PYmosIHtcblx0XHRcdGdldCh0YXJnZXQ6IHVua25vd25bXSwgcDogc3RyaW5nIHwgc3ltYm9sLCByZWNlaXZlcjogdW5rbm93bltdKTogdW5rbm93biB7XG5cdFx0XHRcdGNvbnN0IHJlZiA9IFJlZmxlY3QuZ2V0KHRhcmdldCwgcCwgcmVjZWl2ZXIpO1xuXHRcdFx0XHRpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJlZi5iaW5kKHRhcmdldCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAocmVmID09PSB1bmRlZmluZWQgJiYgaXNOYU4oTnVtYmVyKHAudG9TdHJpbmcoKSkpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdF9fYmluZGluZ0luZm86IHtcblx0XHRcdFx0XHRcdFx0bW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIsXG5cdFx0XHRcdFx0XHRcdHBhdGg6IHBcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiByZWY7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0gZWxzZSB7XG5cdFx0b1RhcmdldCA9IHsgLi4ub09iaiB9O1xuXHR9XG5cdGlmICh0eXBlb2Ygb1RhcmdldCA9PT0gXCJvYmplY3RcIikge1xuXHRcdG9UYXJnZXQuX19iaW5kaW5nSW5mbyA9IHtcblx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0cGF0aDogcGF0aEluTW9kZWxcblx0XHR9O1xuXHR9XG5cdHJldHVybiBvVGFyZ2V0O1xufVxuXG5mdW5jdGlvbiBfY3JlYXRlU3RhdGVQcm9wZXJ0eShcblx0b2JqOiBVSTVDb250cm9sRGVmaW5pdGlvbixcblx0dGFyZ2V0Q29udHJvbDogQ29udHJvbCAmIHtcblx0XHRfdXBkYXRlU3RhdGU6IEZ1bmN0aW9uO1xuXHRcdF91cGRhdGVTdGF0ZURlYm91bmNlZDogRnVuY3Rpb247XG5cdFx0X2lnbm9yZVN0YXRlUHJvcGVydHlVcGRhdGU6IGJvb2xlYW47XG5cdFx0X3VwZGF0ZVN0YXRlVGltZXI6IHVua25vd247XG5cdFx0X2NoYW5nZWRQcm9wcz86IHN0cmluZ1tdO1xuXHR9XG4pOiB2b2lkIHtcblx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSB8fCAodGFyZ2V0Q29udHJvbD8uZ2V0TW9kZWwgJiYgdGFyZ2V0Q29udHJvbC5nZXRNb2RlbChcIiRjb21wb25lbnRTdGF0ZVwiKSkpIHtcblx0XHRpZiAob2JqLm1ldGFkYXRhPy5zdGF0ZVByb3BlcnR5KSB7XG5cdFx0XHR0YXJnZXRDb250cm9sLnNldE1vZGVsKG5ldyBKU09OTW9kZWwoKSwgXCIkY29tcG9uZW50U3RhdGVcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHN0YXRlTW9kZWwgPSB0YXJnZXRDb250cm9sLmdldE1vZGVsKFwiJGNvbXBvbmVudFN0YXRlXCIpIGFzIEpTT05Nb2RlbDtcblxuXHRcdGxldCB1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0Y29uc3QgYm91bmRUb1N0YXRlUHJvcHM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBwcm9wZXJ0eU5hbWUgaW4gb2JqLm1ldGFkYXRhPy5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBwcm9wZXJ0eURlZiA9IG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV07XG5cdFx0XHRpZiAocHJvcGVydHlEZWYuYmluZFRvU3RhdGUpIHtcblx0XHRcdFx0Ym91bmRUb1N0YXRlUHJvcHMucHVzaChwcm9wZXJ0eU5hbWUpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHQvLyBhcyB3ZSBtYXkgaGF2ZSBib3VuZCBwcm9wZXJ0aWVzIGluIHBhcmVudCBjbGFzc2VzIGFuZCBzdWJjbGFzc2VzLCB3ZSBrZWVwIHRyYWNrIG9mIHRob3NlIGluIHRoZSBtb2RlbCBpdHNlbGZcblx0XHRjb25zdCBpbml0aWFsQm91bmRQcm9wZXJ0aWVzID0gc3RhdGVNb2RlbC5nZXRQcm9wZXJ0eShcIi9fX2JvdW5kUHJvcGVydGllc1wiKSA/PyBbXTtcblx0XHRzdGF0ZU1vZGVsLnNldFByb3BlcnR5KFwiL19fYm91bmRQcm9wZXJ0aWVzXCIsIFsuLi5pbml0aWFsQm91bmRQcm9wZXJ0aWVzLCAuLi5ib3VuZFRvU3RhdGVQcm9wc10pO1xuXG5cdFx0c3RhdGVNb2RlbC5hdHRhY2hQcm9wZXJ0eUNoYW5nZSgoZXZ0OiBNb2RlbCRQcm9wZXJ0eUNoYW5nZUV2ZW50KSA9PiB7XG5cdFx0XHRjb25zdCBwYXRoID0gZXZ0LmdldFBhcmFtZXRlcihcInBhdGhcIik/LnN1YnN0cmluZygxKTsgLy8gdG8gcmVtb3ZlIHRoZSBmaXJzdCAvXG5cdFx0XHRpZiAocGF0aCAmJiBib3VuZFRvU3RhdGVQcm9wcy5pbmNsdWRlcyhwYXRoKSkge1xuXHRcdFx0XHR0YXJnZXRDb250cm9sLnNldFByb3BlcnR5KHBhdGgsIGV2dC5nZXRQYXJhbWV0ZXIoXCJ2YWx1ZVwiKSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSkge1xuXHRcdFx0Ly8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZm9yY2UgdGhlIHN0YXRlIHRvIGJlIGFwcGxpZWQgYW5kIHdhaXQgZm9yIGl0IHRvIGJlIGFwcGxpZWQgaW4gdGVzdHNcblx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0XHRkZWxldGUgdGhpcy5fdXBkYXRlU3RhdGVUaW1lcjtcblx0XHRcdFx0aWYgKCF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0YXdhaXQgKHRoaXMgYXMgeyBvblN0YXRlQ2hhbmdlPzogRnVuY3Rpb24gfSkub25TdGF0ZUNoYW5nZT8uKHRoaXMuX2NoYW5nZWRQcm9wcyk7XG5cdFx0XHRcdFx0dGhpcy5fY2hhbmdlZFByb3BzID0gW107XG5cdFx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQgPSBmdW5jdGlvbiAoY2hhbmdlZFByb3A6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMgPz89IFtdO1xuXHRcdFx0XHRpZiAoIXRoaXMuX2NoYW5nZWRQcm9wcy5pbmNsdWRlcyhjaGFuZ2VkUHJvcCkpIHtcblx0XHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMucHVzaChjaGFuZ2VkUHJvcCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCF0aGlzLl91cGRhdGVTdGF0ZVRpbWVyICYmICF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGUoKTtcblx0XHRcdFx0XHR9LCAyMDApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldENvbnRyb2wsIG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5LCB7XG5cdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIG5ldyBQcm94eShzdGF0ZU1vZGVsLCB7XG5cdFx0XHRcdFx0XHRnZXQ6ICh0YXJnZXQ6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBfZ2V0SGFuZGxlckZvclN0YXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wKTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRzZXQ6IChzZXRTdGF0ZU1vZGVsOiBKU09OTW9kZWwsIHByb3AsIHZhbHVlKTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0XHRcdC8vIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgcHJvcGVydHkgaXMgYSBrbm93biBib3VuZCBwcm9wZXJ0eSBpbiBhbnkgb2YgdGhlIHJlbGF0ZWQgY2xhc3Nlc1xuXHRcdFx0XHRcdFx0XHRjb25zdCBrbm93bkJvdW5kUHJvcGVydGllcyA9IHNldFN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIikgPz8gW107XG5cdFx0XHRcdFx0XHRcdGlmIChrbm93bkJvdW5kUHJvcGVydGllcy5pbmNsdWRlcyhwcm9wLnRvU3RyaW5nKCkpKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5faWdub3JlU3RhdGVQcm9wZXJ0eVVwZGF0ZSA9IHRydWU7XG5cdFx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eShwcm9wLnRvU3RyaW5nKCksIHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0XHR0YXJnZXRDb250cm9sLl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3Qgc2V0UmVzdWx0ID0gc2V0U3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7cHJvcC50b1N0cmluZygpfWAsIHZhbHVlKTtcblx0XHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQocHJvcC50b1N0cmluZygpKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHNldFJlc3VsdDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0c2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0XHRjb25zdCBrbm93bkJvdW5kUHJvcGVydGllcyA9IHN0YXRlTW9kZWwuZ2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIikgPz8gW107XG5cdFx0XHRcdFx0Ly8gUmVwbGFjaW5nIHRoZSBjb21wbGV0ZSBzdGF0ZVxuXHRcdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoYC9gLCB2YWx1ZSk7XG5cdFx0XHRcdFx0Ly8gcmVzdG9yaW5nIHRoZSBib3VuZFByb3BlcnRpZXMgcmVmZXJlbmNlc1xuXHRcdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoXCIvX19ib3VuZFByb3BlcnRpZXNcIiwga25vd25Cb3VuZFByb3BlcnRpZXMpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGlmIChvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSkge1xuXHRcdFx0XHR0YXJnZXRDb250cm9sW29iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5IGFzIGtleW9mIENvbnRyb2xdID0geyAuLi5vYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSB9IGFzIG5ldmVyO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZm5BcHBseVNldHRpbmdzID0gdGFyZ2V0Q29udHJvbC5hcHBseVNldHRpbmdzO1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5hcHBseVNldHRpbmdzID0gZnVuY3Rpb24gKG1TZXR0aW5nczogeyBtb2RlbHM/OiBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4gfSk6IHR5cGVvZiB0YXJnZXRDb250cm9sIHtcblx0XHRcdFx0ZGVsZXRlIG1TZXR0aW5ncz8ubW9kZWxzPy4kY29tcG9uZW50U3RhdGU7XG5cdFx0XHRcdHJldHVybiBmbkFwcGx5U2V0dGluZ3MuY2FsbCh0aGlzLCBtU2V0dGluZ3MpO1xuXHRcdFx0fTtcblx0XHR9XG5cdFx0Y29uc3QgZm5TZXRQcm9wZXJ0eSA9IHRhcmdldENvbnRyb2wuc2V0UHJvcGVydHk7XG5cblx0XHRpZiAoYm91bmRUb1N0YXRlUHJvcHMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbC5zZXRQcm9wZXJ0eSA9IGZ1bmN0aW9uIChzUHJvcGVydHlOYW1lOiBzdHJpbmcsIG9WYWx1ZTogdW5rbm93biwgYlN1cHByZXNzSW52YWxpZGF0ZSk6IHR5cGVvZiB0YXJnZXRDb250cm9sIHtcblx0XHRcdFx0aWYgKGJvdW5kVG9TdGF0ZVByb3BzLmluY2x1ZGVzKHNQcm9wZXJ0eU5hbWUpICYmICF0aGlzLl9pZ25vcmVTdGF0ZVByb3BlcnR5VXBkYXRlKSB7XG5cdFx0XHRcdFx0c3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7c1Byb3BlcnR5TmFtZX1gLCBvVmFsdWUpO1xuXHRcdFx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkKHNQcm9wZXJ0eU5hbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmblNldFByb3BlcnR5LmNhbGwodGhpcywgc1Byb3BlcnR5TmFtZSwgb1ZhbHVlLCBiU3VwcHJlc3NJbnZhbGlkYXRlKTtcblx0XHRcdH07XG5cdFx0fVxuXHR9XG59XG5cbi8qKlxuICogSW50ZXJuYWwgaGVhdnkgbGlmdGluZyB0aGF0IHdpbGwgdGFrZSBjYXJlIG9mIGNyZWF0aW5nIHRoZSBjbGFzcyBwcm9wZXJ0eSBmb3IgdWk1IHRvIHVzZS5cbiAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgcHJvdG90eXBlXG4gKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gKiBAcGFyYW0gaW5PYmogVGhlIG1ldGFkYXRhIG9iamVjdFxuICogQHJldHVybnMgVGhlIG1ldGFkYXRhIGNsYXNzXG4gKi9cbmZ1bmN0aW9uIHJlZ2lzdGVyVUk1TWV0YWRhdGEoY2xheno6IFVJNUNvbnRyb2xBbmRNb3JlLCBuYW1lOiBzdHJpbmcsIGluT2JqOiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiB8IFVJNUNvbnRyb2xEZWZpbml0aW9uKTogRnVuY3Rpb24ge1xuXHRpZiAoY2xhenouZ2V0TWV0YWRhdGE/LigpLmlzQShcInNhcC51aS5jb3JlLm12Yy5Db250cm9sbGVyRXh0ZW5zaW9uXCIpKSB7XG5cdFx0T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoaW5PYmopLmZvckVhY2goKG9iak5hbWUpID0+IHtcblx0XHRcdGNvbnN0IGRlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGluT2JqLCBvYmpOYW1lKTtcblx0XHRcdGlmIChkZXNjcmlwdG9yICYmICFkZXNjcmlwdG9yLmVudW1lcmFibGUpIHtcblx0XHRcdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9KTtcblx0fVxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRjb25zdCBvYmo6IGFueSA9IHt9O1xuXHRvYmoubWV0YWRhdGEgPSBpbk9iai5tZXRhZGF0YSB8fCB7fTtcblx0b2JqLm92ZXJyaWRlID0gaW5PYmoub3ZlcnJpZGU7XG5cdG9iai5jb25zdHJ1Y3RvciA9IGNsYXp6O1xuXHRvYmoubWV0YWRhdGEuYmFzZVR5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY2xhenoucHJvdG90eXBlKS5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKTtcblxuXHRpZiAoKGNsYXp6Py5nZXRNZXRhZGF0YSgpIGFzIHVua25vd24gYXMgeyBnZXRTdGVyZW90eXBlOiBGdW5jdGlvbiB9KT8uZ2V0U3RlcmVvdHlwZSgpID09PSBcImNvbnRyb2xcIikge1xuXHRcdGNvbnN0IHJlbmRlcmVyRGVmaW5pdGlvbiA9IGluT2JqLnJlbmRlcmVyIHx8IGNsYXp6LnJlbmRlcmVyIHx8IGNsYXp6LnJlbmRlcjtcblx0XHRvYmoucmVuZGVyZXIgPSB7IGFwaVZlcnNpb246IDIgfTtcblx0XHRpZiAodHlwZW9mIHJlbmRlcmVyRGVmaW5pdGlvbiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRvYmoucmVuZGVyZXIucmVuZGVyID0gcmVuZGVyZXJEZWZpbml0aW9uO1xuXHRcdH0gZWxzZSBpZiAocmVuZGVyZXJEZWZpbml0aW9uICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqLnJlbmRlcmVyID0gcmVuZGVyZXJEZWZpbml0aW9uO1xuXHRcdH1cblx0fVxuXHRvYmoubWV0YWRhdGEuaW50ZXJmYWNlcyA9IGluT2JqLm1ldGFkYXRhPy5pbnRlcmZhY2VzIHx8IGNsYXp6Lm1ldGFkYXRhPy5pbnRlcmZhY2VzO1xuXHRPYmplY3Qua2V5cyhjbGF6ei5wcm90b3R5cGUpLmZvckVhY2goKGtleSkgPT4ge1xuXHRcdGlmIChrZXkgIT09IFwibWV0YWRhdGFcIikge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0b2JqW2tleV0gPSBjbGF6ei5wcm90b3R5cGVba2V5XTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Ly8gRG8gbm90aGluZ1xuXHRcdFx0fVxuXHRcdH1cblx0fSk7XG5cblx0aWYgKG9iai5tZXRhZGF0YT8uY29udHJvbGxlckV4dGVuc2lvbnMgJiYgT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKS5sZW5ndGggPiAwKSB7XG5cdFx0Zm9yIChjb25zdCBjRXh0TmFtZSBpbiBvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnMpIHtcblx0XHRcdG9ialtjRXh0TmFtZV0gPSBvYmoubWV0YWRhdGEuY29udHJvbGxlckV4dGVuc2lvbnNbY0V4dE5hbWVdO1xuXHRcdH1cblx0fVxuXHRjb25zdCBvdXRwdXQgPSBjbGF6ei5leHRlbmQobmFtZSwgb2JqKSBhcyB0eXBlb2YgQ29udHJvbCAmIEZ1bmN0aW9uO1xuXHRjb25zdCBmbkluaXQgPSBvdXRwdXQucHJvdG90eXBlLmluaXQ7XG5cdGNvbnN0IGZuQWZ0ZXJJbml0ID0gb3V0cHV0LnByb3RvdHlwZS5hZnRlckluaXQ7XG5cdG91dHB1dC5wcm90b3R5cGUuaW5pdCA9IGZ1bmN0aW9uICguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcblx0XHRpZiAoZm5Jbml0KSB7XG5cdFx0XHRmbkluaXQuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fVxuXHRcdGlmIChjbGF6ei5yZWdpc3Rlckluc3RhbmNlKSB7XG5cdFx0XHRjbGF6ei5yZWdpc3Rlckluc3RhbmNlKHRoaXMpO1xuXHRcdH1cblx0XHR0aGlzLm1ldGFkYXRhID0gb2JqLm1ldGFkYXRhO1xuXG5cdFx0aWYgKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKSB7XG5cdFx0XHRjb25zdCBhUHJvcGVydHlLZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnByb3BlcnRpZXMpO1xuXHRcdFx0YVByb3BlcnR5S2V5cy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcm9wZXJ0eURlZiA9IG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0Ly8gSWYgYSB2YWx1ZSB3YXMgc2V0IGluIGBpbml0YCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBpcyBzZXQgaW4gdGhlIHZhbHVlIGluIHRoZSBlbmRcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWZhdWx0ID0gdGhpc1twcm9wZXJ0eUtleV0gPz8gcHJvcGVydHlEZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRpZiAocHJvcGVydHlEZWYuaXNCaW5kaW5nSW5mbyA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzID8/PSB7fTtcblxuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHR0aGlzLm1Qcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA9IHY7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldCgpOiB1bmtub3duIHtcblx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBjYXNlIHdlIG5lZWQgdG8gY29uc2lkZXIgdGhlIHByb3BlcnR5IGZpcnN0IGFuZCBub3QganVzdCB0aGUgX2JpbmRpbmdQcm9wZXJ0aWVzXG5cdFx0XHRcdFx0XHRcdC8vIER1cmluZyB0aGUgaW5pdGlhbGl6YXRpb24sIGlmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgd2l0aCBhIG5vbiBiaW5kaW5nIHZhbHVlLCBzZXRQcm9wZXJ0eSBpcyBjYWxsZWQgYW5kIG5vdCBiaW5kUHJvcGVydHlcblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcGVydHlWYWx1ZSA9IHRoaXMuZ2V0UHJvcGVydHkocHJvcGVydHlLZXkpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBiaW5kaW5nUHJvcGVydHlWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByb3BlcnR5IGlzIHNldCB0byBhIGRpZmZlcmVudCB2YWx1ZSB3ZSB1cGRhdGUgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHRpZiAocHJvcGVydHlWYWx1ZSAmJiBwcm9wZXJ0eVZhbHVlICE9PSBiaW5kaW5nUHJvcGVydHlWYWx1ZSkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSA9IHByb3BlcnR5VmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y29uc3QgcHJvcFZhbHVlID0gdGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldO1xuXHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHByb3BWYWx1ZSA9PT0gXCJvYmplY3RcIikge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB7IC4uLnByb3BWYWx1ZSB9OyAvLyBDcmVhdGUgc2hhbGxvdyBjb3B5XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHByb3BWYWx1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSwgdik7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAocHJvcGVydHlEZWZhdWx0ICE9PSB1bmRlZmluZWQgJiYgdGhpc1twcm9wZXJ0eUtleV0gIT09IHByb3BlcnR5RGVmYXVsdCkge1xuXHRcdFx0XHRcdC8vIGRvbid0IG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCdzIGFscmVhZHkgdGhlcmVcblx0XHRcdFx0XHR0aGlzLl9hcHBseWluZ1NldHRpbmdzID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzW3Byb3BlcnR5S2V5XSA9IHByb3BlcnR5RGVmYXVsdDtcblx0XHRcdFx0XHR0aGlzLl9hcHBseWluZ1NldHRpbmdzID0gZmFsc2U7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMuX2FwcGx5aW5nU2V0dGluZ3M7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdFx0Y29uc3QgYUFnZ3JlZ2F0aW9uS2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnMpO1xuXHRcdFx0YUFnZ3JlZ2F0aW9uS2V5cy5mb3JFYWNoKChhZ2dyZWdhdGlvbktleSkgPT4ge1xuXHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkRlZiA9IG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25LZXldO1xuXHRcdFx0XHRjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzW2FnZ3JlZ2F0aW9uS2V5XSA/PyBhZ2dyZWdhdGlvbkRlZi5kZWZhdWx0VmFsdWU7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhZ2dyZWdhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hZ2dyZWdhdGlvbnNbYWdncmVnYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHRcdGlmIChkZWZhdWx0VmFsdWUgJiYgKGRlZmF1bHRWYWx1ZSBhcyBVSTVFbGVtZW50KT8uaXNBKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1thZ2dyZWdhdGlvbktleV0gPSBkZWZhdWx0VmFsdWU7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBc3NvY2lhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYXNzb2NpYXRpb25zKTtcblx0XHRcdGFBc3NvY2lhdGlvbktleXMuZm9yRWFjaCgoYXNzb2NpYXRpb25LZXkpID0+IHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIGFzc29jaWF0aW9uS2V5LCB7XG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldEFzc29jaWF0aW9uKGFzc29jaWF0aW9uS2V5LCB2KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25Db250ZW50ID0gdGhpcy5nZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSk7XG5cdFx0XHRcdFx0XHRpZiAob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9uc1thc3NvY2lhdGlvbktleV0ubXVsdGlwbGUpIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudCB8fCBbXTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQ7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0pO1xuXHRcdH1cblx0XHRpZiAob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpIHtcblx0XHRcdGNvbnN0IHJlZmVyZW5jZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEucmVmZXJlbmNlcyk7XG5cdFx0XHRyZWZlcmVuY2VQcm9wZXJ0aWVzLmZvckVhY2goKHByb3BlcnR5S2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eUtleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogY3JlYXRlUmVmZXJlbmNlKClcblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IG1ldGhvZE5hbWUgaW4gb2JqLm1ldGFkYXRhLm1ldGhvZHMpIHtcblx0XHRcdFx0Y29uc3QgbWV0aG9kRGVmaW5pdGlvbiA9IG9iai5tZXRhZGF0YS5tZXRob2RzW21ldGhvZE5hbWVdO1xuXHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJBZnRlckFzeW5jXCIgfHwgbWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0aWYgKCF0aGlzLm1ldGhvZEhvbGRlcikge1xuXHRcdFx0XHRcdFx0dGhpcy5tZXRob2RIb2xkZXIgPSBbXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0gPSBbdGhpc1ttZXRob2ROYW1lXV07XG5cdFx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIG1ldGhvZE5hbWUsIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IEZ1bmN0aW9uKSA9PiB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXS5wdXNoKHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYXN5bmMgKC4uLm1ldGhvZEFyZ3M6IHVua25vd25bXSkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IG1ldGhvZEFycmF5cyA9IHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdO1xuXHRcdFx0XHRcdFx0XHRcdGlmIChtZXRob2REZWZpbml0aW9uLm92ZXJyaWRlRXhlY3V0aW9uID09PSBcIkJlZm9yZUFzeW5jXCIpIHtcblx0XHRcdFx0XHRcdFx0XHRcdG1ldGhvZEFycmF5cy5yZXZlcnNlKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgYXJnIG9mIG1ldGhvZEFycmF5cykge1xuXHRcdFx0XHRcdFx0XHRcdFx0YXdhaXQgYXJnLmFwcGx5KHRoaXMsIG1ldGhvZEFyZ3MpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRfY3JlYXRlU3RhdGVQcm9wZXJ0eShvYmosIHRoaXMpO1xuXHRcdGlmIChmbkFmdGVySW5pdCkge1xuXHRcdFx0Zm5BZnRlckluaXQuYXBwbHkodGhpcywgYXJncyk7XG5cdFx0fVxuXHR9O1xuXG5cdGNsYXp6Lm92ZXJyaWRlID0gZnVuY3Rpb24gKG9FeHRlbnNpb246IHVua25vd24pOiBGdW5jdGlvbiB7XG5cdFx0Y29uc3QgcG9sID0ge307XG5cdFx0KHBvbCBhcyBGdW5jdGlvbikuY29uc3RydWN0b3IgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogRnVuY3Rpb24ge1xuXHRcdFx0cmV0dXJuIGNsYXp6LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y29uc3Qgb0NsYXNzID0gKE1ldGFkYXRhIGFzIHVua25vd24gYXMgeyBjcmVhdGVDbGFzczogRnVuY3Rpb24gfSkuY3JlYXRlQ2xhc3MoXG5cdFx0XHRjbGF6eixcblx0XHRcdGBhbm9ueW1vdXNFeHRlbnNpb25+JHt1aWQoKX1gLFxuXHRcdFx0cG9sLFxuXHRcdFx0Q29udHJvbGxlck1ldGFkYXRhXG5cdFx0KTtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fc3RhdGljT3ZlcnJpZGUgPSBvRXh0ZW5zaW9uO1xuXHRcdG9DbGFzcy5nZXRNZXRhZGF0YSgpLl9vdmVycmlkZSA9IChjbGF6ei5nZXRNZXRhZGF0YSgpIGFzIHsgX292ZXJyaWRlPzogdW5rbm93biB9KS5fb3ZlcnJpZGU7XG5cdFx0cmV0dXJuIG9DbGFzcztcblx0fTtcblxuXHRPYmplY3RQYXRoLnNldChuYW1lLCBvdXRwdXQpO1xuXG5cdHJldHVybiBvdXRwdXQ7XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztFQWdKQSxNQUFNQSxjQUFjLEdBQUcsU0FBQUEsQ0FBVUMsTUFBc0QsRUFBZ0M7SUFDdEhBLE1BQU0sQ0FBQ0MsUUFBUSxHQUFHQyxLQUFLLENBQ3RCO01BQ0NDLG9CQUFvQixFQUFFLENBQUMsQ0FBQztNQUN4QkMsVUFBVSxFQUFFLENBQUMsQ0FBQztNQUNkQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO01BQ2hCQyxVQUFVLEVBQUUsQ0FBQyxDQUFDO01BQ2RDLFlBQVksRUFBRSxDQUFDLENBQUM7TUFDaEJDLE9BQU8sRUFBRSxDQUFDLENBQUM7TUFDWEMsTUFBTSxFQUFFLENBQUMsQ0FBQztNQUNWQyxVQUFVLEVBQUU7SUFDYixDQUFDLEVBQ0RWLE1BQU0sQ0FBQ0MsUUFBUSxJQUFJLENBQUMsQ0FDckIsQ0FBaUM7SUFDakMsT0FBT0Qs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QyxLQUFBLElBQUEzTixTQUFBLENBQUEyTixLQUFBO2tCQUFBO2tCQUsxQixLQUFLLE1BQU1DLEdBQUcsSUFBSUwsWUFBWSxFQUFFO29CQUMvQixNQUFNSyxHQUFHLENBQUM3QixLQUFLLENBQUNILEtBQUksRUFBRThCLFVBQVUsQ0FBQztrQkFDbEM7Z0JBQ0QsQ0FBQztjQUNGO1lBQ0QsQ0FBQyxDQUFDO1VBQ0g7UUFDRDtNQUNEO01BQ0ExRixvQkFBb0IsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQztNQUMvQixJQUFJeUQsV0FBVyxFQUFFO1FBQ2hCQSxXQUFXLENBQUNLLEtBQUssQ0FBQyxJQUFJLEVBQUVqSCxJQUFJLENBQUM7TUFDOUI7SUFDRCxDQUFDO0lBRUQ0RixLQUFLLENBQUNsSSxRQUFRLEdBQUcsVUFBVXFMLFVBQW1CLEVBQVk7TUFDekQsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUNiQSxHQUFHLENBQWNyTSxXQUFXLEdBQUcsWUFBd0M7UUFBQSxTQUFBc00sS0FBQSxHQUFBL04sU0FBQSxDQUFBQyxNQUFBLEVBQTNCNkUsSUFBSSxPQUFBQyxLQUFBLENBQUFnSixLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSmxKLElBQUksQ0FBQWtKLEtBQUEsSUFBQWhPLFNBQUEsQ0FBQWdPLEtBQUE7UUFBQTtRQUNoRCxPQUFPdEQsS0FBSyxDQUFDcUIsS0FBSyxDQUFDLElBQUksRUFBRWpILElBQUksQ0FBQztNQUMvQixDQUFDO01BQ0QsTUFBTW1KLE1BQU0sR0FBSUMsUUFBUSxDQUEwQ0MsV0FBVyxDQUM1RXpELEtBQUssRUFDTCxzQkFBc0IwRCxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQzdCTixHQUFHLEVBQ0hPLGtCQUNELENBQUM7TUFDREosTUFBTSxDQUFDOU4sV0FBVyxDQUFDLENBQUMsQ0FBQ21PLGVBQWUsR0FBR1QsVUFBVTtNQUNqREksTUFBTSxDQUFDOU4sV0FBVyxDQUFDLENBQUMsQ0FBQ29PLFNBQVMsR0FBSTdELEtBQUssQ0FBQ3ZLLFdBQVcsQ0FBQyxDQUFDLENBQTZCb08sU0FBUztNQUMzRixPQUFPTixNQUFNO0lBQ2QsQ0FBQztJQUVETyxVQUFVLENBQUM5TSxHQUFHLENBQUN1RSxJQUFJLEVBQUVzRixNQUFNLENBQUM7SUFFNUIsT0FBT0EsTUFBTTtFQUNkO0VBQUMsT0FBQWxKLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==