@sapui5/sap.fe.base 1.129.1 → 1.130.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.
@@ -32,6 +32,7 @@ import type {
32
32
  } from "@sap-ux/vocabularies-types";
33
33
  import { CommonAnnotationTerms } from "@sap-ux/vocabularies-types/vocabularies/Common";
34
34
  import { resolveEnumValue } from "sap/fe/base/AnnotationEnum";
35
+ import type { BindingInfoHolder } from "sap/fe/base/ClassSupport";
35
36
 
36
37
  export type PrimitiveType = string | number | bigint | boolean | object | null | undefined;
37
38
  type DefinedPrimitiveType = string | number | bigint | boolean | object;
@@ -709,6 +710,28 @@ export function ref(reference: string | null): ReferenceExpression {
709
710
  return { _type: "Ref", ref: reference };
710
711
  }
711
712
 
713
+ /**
714
+ * Wrap a state object into a path in model expression.
715
+ * @template T
716
+ * @param stateObjectProp The object to evaluate, if it's a constant it will be wrapped in a constant expression, if it's a state property it will be bound
717
+ * @returns The correct binding toolkit expression
718
+ */
719
+ export function bindState<T extends PrimitiveType>(
720
+ stateObjectProp?: T | BindingInfoHolder<T>
721
+ ): PathInModelExpression<T> | ConstantExpression<T>;
722
+ export function bindState<T extends readonly unknown[]>(stateObjectProp?: T | BindingInfoHolder<T>): PathInModelExpression<T>;
723
+ export function bindState<T extends PrimitiveType | readonly PrimitiveType[]>(
724
+ stateObjectProp?: T | BindingInfoHolder<T>
725
+ ): PathInModelExpression<T> | ConstantExpression<T> {
726
+ if (typeof stateObjectProp === "object" && (stateObjectProp as BindingInfoHolder<T>).__bindingInfo) {
727
+ return pathInModel(
728
+ (stateObjectProp as BindingInfoHolder<T>).__bindingInfo.path,
729
+ (stateObjectProp as BindingInfoHolder<T>).__bindingInfo.model
730
+ );
731
+ } else {
732
+ return constant(stateObjectProp as T);
733
+ }
734
+ }
712
735
  /**
713
736
  * Wrap a primitive into a constant expression if it is not already an expression.
714
737
  * @template T
@@ -75,20 +75,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
75
75
  target.getAPI = prepareGetAPIFunction(target);
76
76
  }
77
77
  };
78
- /**
79
- * Creates the binding info for an array property coming from the state.
80
- * @param stateProperty
81
- * @returns The aggregation binding info
82
- */
83
- function bindStateArray(stateProperty) {
84
- if (stateProperty.__bindingInfo !== undefined) {
85
- return {
86
- path: stateProperty.__bindingInfo.path,
87
- model: stateProperty.__bindingInfo.model
88
- };
89
- }
90
- }
91
-
92
78
  /**
93
79
  * Allows to define a property that will hold the control state.
94
80
  *
@@ -97,7 +83,6 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
97
83
  * @experimental
98
84
  * @returns A property decorator
99
85
  */
100
- _exports.bindStateArray = bindStateArray;
101
86
  function defineState() {
102
87
  return function (target, propertyKey, propertyDescriptor) {
103
88
  var _initializer, _ref;
@@ -405,22 +390,76 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
405
390
  }; // This is technically an accessor decorator, but somehow the compiler doesn't like it if i declare it as such.;
406
391
  }
407
392
  _exports.defineReference = defineReference;
393
+ function _getHandlerForStateProperty(jsonModel, prop) {
394
+ const pathInModel = `/${prop.toString()}`;
395
+ const oObj = deepClone(jsonModel.getObject(pathInModel));
396
+ let oTarget;
397
+ if (typeof oObj === "string") {
398
+ oTarget = {
399
+ value: oObj
400
+ };
401
+ oTarget.toString = function () {
402
+ return this.value;
403
+ };
404
+ } else if (typeof oObj === "number") {
405
+ oTarget = {
406
+ value: oObj
407
+ };
408
+ oTarget.toString = function () {
409
+ return this.value.toString();
410
+ };
411
+ } else if (typeof oObj === "boolean") {
412
+ oTarget = new Boolean(oObj);
413
+ } else if (Array.isArray(oObj)) {
414
+ oTarget = new Proxy(oObj, {
415
+ get(target, p, receiver) {
416
+ const ref = Reflect.get(target, p, receiver);
417
+ if (typeof ref === "function") {
418
+ return ref.bind(target);
419
+ } else if (ref === undefined && isNaN(Number(p.toString()))) {
420
+ return {
421
+ __bindingInfo: {
422
+ model: "$componentState",
423
+ path: p
424
+ }
425
+ };
426
+ }
427
+ return ref;
428
+ }
429
+ });
430
+ } else {
431
+ oTarget = {
432
+ ...oObj
433
+ };
434
+ }
435
+ oTarget.__bindingInfo = {
436
+ model: "$componentState",
437
+ path: pathInModel
438
+ };
439
+ return oTarget;
440
+ }
408
441
  function _createStateProperty(obj, targetControl) {
409
442
  var _obj$metadata;
410
443
  if ((_obj$metadata = obj.metadata) !== null && _obj$metadata !== void 0 && _obj$metadata.stateProperty) {
411
444
  const stateModel = new JSONModel({});
412
445
  targetControl.setModel(stateModel, "$componentState");
413
446
  let updatingState = false;
414
- targetControl._updateState = function () {
447
+ // This method can be used to force the state to be applied and wait for it to be applied in tests
448
+ targetControl._updateState = async function () {
415
449
  delete this._updateStateTimer;
416
450
  if (!updatingState) {
417
451
  var _onStateChange, _ref4;
418
452
  updatingState = true;
419
- (_onStateChange = (_ref4 = this).onStateChange) === null || _onStateChange === void 0 ? void 0 : _onStateChange.call(_ref4);
453
+ await ((_onStateChange = (_ref4 = this).onStateChange) === null || _onStateChange === void 0 ? void 0 : _onStateChange.call(_ref4, this._changedProps));
454
+ this._changedProps = [];
420
455
  updatingState = false;
421
456
  }
422
457
  };
423
- targetControl._updateStateDebounced = function () {
458
+ targetControl._updateStateDebounced = function (changedProp) {
459
+ this._changedProps ??= [];
460
+ if (!this._changedProps.includes(changedProp)) {
461
+ this._changedProps.push(changedProp);
462
+ }
424
463
  if (!this._updateStateTimer && !updatingState) {
425
464
  this._updateStateTimer = setTimeout(() => {
426
465
  this._updateState();
@@ -431,57 +470,12 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
431
470
  configurable: true,
432
471
  get: () => {
433
472
  return new Proxy(stateModel, {
434
- get: function (jsonModel, prop) {
435
- const pathInModel = `/${prop.toString()}`;
436
- const oObj = deepClone(jsonModel.getObject(pathInModel));
437
- let oTarget;
438
- if (typeof oObj === "string") {
439
- oTarget = {
440
- value: oObj
441
- };
442
- oTarget.toString = function () {
443
- return this.value;
444
- };
445
- } else if (typeof oObj === "number") {
446
- oTarget = {
447
- value: oObj
448
- };
449
- oTarget.toString = function () {
450
- return this.value.toString();
451
- };
452
- } else if (typeof oObj === "boolean") {
453
- oTarget = new Boolean(oObj);
454
- } else if (Array.isArray(oObj)) {
455
- oTarget = new Proxy(oObj.concat(), {
456
- get(target, p, receiver) {
457
- const ref = Reflect.get(target, p, receiver);
458
- if (typeof ref === "function") {
459
- return ref.bind(target);
460
- } else if (ref === undefined && isNaN(Number(p.toString()))) {
461
- return {
462
- __bindingInfo: {
463
- model: "$componentState",
464
- path: p
465
- }
466
- };
467
- }
468
- return ref;
469
- }
470
- });
471
- } else {
472
- oTarget = {
473
- ...oObj
474
- };
475
- }
476
- oTarget.__bindingInfo = {
477
- model: "$componentState",
478
- path: pathInModel
479
- };
480
- return oTarget;
473
+ get: (target, prop) => {
474
+ return _getHandlerForStateProperty(target, prop);
481
475
  },
482
476
  set: (setStateModel, prop, value) => {
483
477
  const setResult = setStateModel.setProperty(`/${prop.toString()}`, value);
484
- targetControl._updateStateDebounced();
478
+ targetControl._updateStateDebounced(prop.toString());
485
479
  return setResult;
486
480
  }
487
481
  });
@@ -492,7 +486,9 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
492
486
  }
493
487
  });
494
488
  if (obj.metadata.statePropertyDefaultValue) {
495
- targetControl[obj.metadata.stateProperty] = obj.metadata.statePropertyDefaultValue;
489
+ targetControl[obj.metadata.stateProperty] = {
490
+ ...obj.metadata.statePropertyDefaultValue
491
+ };
496
492
  }
497
493
  }
498
494
  }
@@ -548,12 +544,13 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
548
544
  }
549
545
  const output = clazz.extend(name, obj);
550
546
  const fnInit = output.prototype.init;
547
+ const fnAfterInit = output.prototype.afterInit;
551
548
  output.prototype.init = function () {
552
549
  var _this = this;
550
+ for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
551
+ args[_key2] = arguments[_key2];
552
+ }
553
553
  if (fnInit) {
554
- for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
555
- args[_key2] = arguments[_key2];
556
- }
557
554
  fnInit.apply(this, args);
558
555
  }
559
556
  if (clazz.registerInstance) {
@@ -696,6 +693,9 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
696
693
  }
697
694
  }
698
695
  _createStateProperty(obj, this);
696
+ if (fnAfterInit) {
697
+ fnAfterInit.apply(this, args);
698
+ }
699
699
  };
700
700
  clazz.override = function (oExtension) {
701
701
  const pol = {};
@@ -715,4 +715,4 @@ sap.ui.define(["sap/base/util/ObjectPath", "sap/base/util/deepClone", "sap/base/
715
715
  }
716
716
  return _exports;
717
717
  }, false);
718
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJiaW5kU3RhdGVBcnJheSIsInN0YXRlUHJvcGVydHkiLCJfX2JpbmRpbmdJbmZvIiwicGF0aCIsIm1vZGVsIiwiX2V4cG9ydHMiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwiX2luaXRpYWxpemVyIiwiX3JlZiIsIndyaXRhYmxlIiwic3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSIsImluaXRpYWxpemVyIiwiY2FsbCIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJfaW5pdGlhbGl6ZXIyIiwiX3JlZjIiLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiX2luaXRpYWxpemVyMyIsIl9yZWYzIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsIl9jcmVhdGVTdGF0ZVByb3BlcnR5Iiwib2JqIiwiX29iaiRtZXRhZGF0YSIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInVwZGF0aW5nU3RhdGUiLCJfdXBkYXRlU3RhdGUiLCJfdXBkYXRlU3RhdGVUaW1lciIsIl9vblN0YXRlQ2hhbmdlIiwiX3JlZjQiLCJvblN0YXRlQ2hhbmdlIiwiX3VwZGF0ZVN0YXRlRGVib3VuY2VkIiwic2V0VGltZW91dCIsIk9iamVjdCIsImRlZmluZVByb3BlcnR5IiwiY29uZmlndXJhYmxlIiwiUHJveHkiLCJqc29uTW9kZWwiLCJwcm9wIiwicGF0aEluTW9kZWwiLCJvT2JqIiwiZGVlcENsb25lIiwiZ2V0T2JqZWN0Iiwib1RhcmdldCIsInZhbHVlIiwiQm9vbGVhbiIsInAiLCJyZWNlaXZlciIsInJlZiIsIlJlZmxlY3QiLCJiaW5kIiwiaXNOYU4iLCJOdW1iZXIiLCJzZXRTdGF0ZU1vZGVsIiwic2V0UmVzdWx0Iiwic2V0UHJvcGVydHkiLCJjbGF6eiIsIm5hbWUiLCJpbk9iaiIsIl9jbGF6eiRnZXRNZXRhZGF0YSIsIl9jbGF6eiRnZXRNZXRhZGF0YTIiLCJfaW5PYmokbWV0YWRhdGEiLCJfY2xhenokbWV0YWRhdGEiLCJfb2JqJG1ldGFkYXRhMiIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwib2JqTmFtZSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImJhc2VUeXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRTdGVyZW90eXBlIiwicmVuZGVyZXJEZWZpbml0aW9uIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJhcGlWZXJzaW9uIiwia2V5cyIsImUiLCJjRXh0TmFtZSIsIm91dHB1dCIsImV4dGVuZCIsImZuSW5pdCIsImluaXQiLCJfdGhpcyIsIl9sZW4yIiwiX2tleTIiLCJhcHBseSIsImFQcm9wZXJ0eUtleXMiLCJwcm9wZXJ0eURlZiIsInByb3BlcnR5RGVmYXVsdCIsIl9iaW5kaW5nUHJvcGVydGllcyIsInYiLCJtUHJvcGVydGllcyIsInByb3BlcnR5VmFsdWUiLCJnZXRQcm9wZXJ0eSIsImJpbmRpbmdQcm9wZXJ0eVZhbHVlIiwicHJvcFZhbHVlIiwiX2FwcGx5aW5nU2V0dGluZ3MiLCJhQWdncmVnYXRpb25LZXlzIiwiYWdncmVnYXRpb25LZXkiLCJhZ2dyZWdhdGlvbkRlZiIsInNldEFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25Db250ZW50IiwiZ2V0QWdncmVnYXRpb24iLCJhQXNzb2NpYXRpb25LZXlzIiwiYXNzb2NpYXRpb25LZXkiLCJzZXRBc3NvY2lhdGlvbiIsImdldEFzc29jaWF0aW9uIiwicmVmZXJlbmNlUHJvcGVydGllcyIsIm1ldGhvZE5hbWUiLCJtZXRob2REZWZpbml0aW9uIiwibWV0aG9kSG9sZGVyIiwibWV0aG9kQXJyYXlzIiwicmV2ZXJzZSIsIl9sZW4zIiwibWV0aG9kQXJncyIsIl9rZXkzIiwiYXJnIiwib0V4dGVuc2lvbiIsInBvbCIsIl9sZW40IiwiX2tleTQiLCJvQ2xhc3MiLCJNZXRhZGF0YSIsImNyZWF0ZUNsYXNzIiwidWlkIiwiQ29udHJvbGxlck1ldGFkYXRhIiwiX3N0YXRpY092ZXJyaWRlIiwiX292ZXJyaWRlIiwiT2JqZWN0UGF0aCJdLCJzb3VyY2VSb290IjoiLiIsInNvdXJjZXMiOlsiQ2xhc3NTdXBwb3J0LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBPYmplY3RQYXRoIGZyb20gXCJzYXAvYmFzZS91dGlsL09iamVjdFBhdGhcIjtcbmltcG9ydCBkZWVwQ2xvbmUgZnJvbSBcInNhcC9iYXNlL3V0aWwvZGVlcENsb25lXCI7XG5pbXBvcnQgbWVyZ2UgZnJvbSBcInNhcC9iYXNlL3V0aWwvbWVyZ2VcIjtcbmltcG9ydCB1aWQgZnJvbSBcInNhcC9iYXNlL3V0aWwvdWlkXCI7XG5pbXBvcnQgeyBob29rYWJsZSB9IGZyb20gXCJzYXAvZmUvYmFzZS9Ib29rU3VwcG9ydFwiO1xuaW1wb3J0IHR5cGUgeyBSZWYgfSBmcm9tIFwic2FwL2ZlL2Jhc2UvanN4LXJ1bnRpbWUvanN4XCI7XG5pbXBvcnQgdHlwZSBVSTVFdmVudCBmcm9tIFwic2FwL3VpL2Jhc2UvRXZlbnRcIjtcbmltcG9ydCB0eXBlIE1hbmFnZWRPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL01hbmFnZWRPYmplY3RcIjtcbmltcG9ydCB0eXBlIHsgQWdncmVnYXRpb25CaW5kaW5nSW5mbyB9IGZyb20gXCJzYXAvdWkvYmFzZS9NYW5hZ2VkT2JqZWN0XCI7XG5pbXBvcnQgTWV0YWRhdGEgZnJvbSBcInNhcC91aS9iYXNlL01ldGFkYXRhXCI7XG5pbXBvcnQgQmFzZU9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvT2JqZWN0XCI7XG5pbXBvcnQgdHlwZSBDb250cm9sIGZyb20gXCJzYXAvdWkvY29yZS9Db250cm9sXCI7XG5pbXBvcnQgdHlwZSB7ICRDb250cm9sU2V0dGluZ3MgfSBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgVUk1RWxlbWVudCBmcm9tIFwic2FwL3VpL2NvcmUvRWxlbWVudFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbGxlckV4dGVuc2lvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL0NvbnRyb2xsZXJFeHRlbnNpb25cIjtcbmltcG9ydCBDb250cm9sbGVyTWV0YWRhdGEgZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyTWV0YWRhdGFcIjtcbmltcG9ydCB0eXBlIE92ZXJyaWRlRXhlY3V0aW9uIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvT3ZlcnJpZGVFeGVjdXRpb25cIjtcbmltcG9ydCB0eXBlIENvbnRleHQgZnJvbSBcInNhcC91aS9tb2RlbC9Db250ZXh0XCI7XG5pbXBvcnQgSlNPTk1vZGVsIGZyb20gXCJzYXAvdWkvbW9kZWwvanNvbi9KU09OTW9kZWxcIjtcblxudHlwZSBPdmVycmlkZURlZmluaXRpb24gPSBSZWNvcmQ8c3RyaW5nLCBGdW5jdGlvbj47XG50eXBlIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZUV4ZWN1dGlvbj86IE92ZXJyaWRlRXhlY3V0aW9uO1xuXHRwdWJsaWM/OiBib29sZWFuO1xuXHRmaW5hbD86IGJvb2xlYW47XG59O1xuZXhwb3J0IHR5cGUgTm9uQWJzdHJhY3RDbGFzczxUPiA9IFBpY2s8VCwga2V5b2YgVD4gJiAobmV3ICguLi5hcmdzOiB1bmtub3duW10pID0+IFQpO1xuXG50eXBlIFVJNVByb3BlcnR5TWV0YWRhdGEgPSB7XG5cdHR5cGU6IHN0cmluZztcblx0YmluZGFibGU/OiBib29sZWFuO1xuXHRyZXF1aXJlZD86IGJvb2xlYW47XG5cdGdyb3VwPzogc3RyaW5nO1xuXHRkZWZhdWx0VmFsdWU/OiB1bmtub3duO1xuXHRieVZhbHVlPzogYm9vbGVhbjtcblx0aXNCaW5kaW5nSW5mbz86IGJvb2xlYW47XG5cdGV4cGVjdGVkQW5ub3RhdGlvbnM/OiBzdHJpbmdbXTtcblx0ZXhwZWN0ZWRUeXBlcz86IHN0cmluZ1tdO1xuXHRhbGxvd2VkVmFsdWVzPzogc3RyaW5nW107XG59O1xuZXhwb3J0IHR5cGUgVUk1QWdncmVnYXRpb25NZXRhZGF0YSA9IHtcblx0dHlwZTogc3RyaW5nO1xuXHRhbHRUeXBlcz86IHN0cmluZ1tdO1xuXHRtdWx0aXBsZT86IGJvb2xlYW47XG5cdGlzRGVmYXVsdD86IGJvb2xlYW47XG5cdGRlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdGRlZmF1bHRDbGFzcz86IHVua25vd247XG5cdHNpbmd1bGFyTmFtZT86IHN0cmluZztcblx0dmlzaWJpbGl0eT86IHN0cmluZztcblx0Zm9yd2FyZGluZz86IG9iamVjdDtcbn07XG5leHBvcnQgdHlwZSBVSTVBc3NvY2lhdGlvbk1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdG11bHRpcGxlPzogYm9vbGVhbjtcblx0c2luZ3VsYXJOYW1lPzogc3RyaW5nO1xufTtcbmV4cG9ydCB0eXBlIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24gPSB7XG5cdGRlZmF1bHRBZ2dyZWdhdGlvbj86IHN0cmluZztcblx0Y29udHJvbGxlckV4dGVuc2lvbnM6IFJlY29yZDxzdHJpbmcsIHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24+O1xuXHRwcm9wZXJ0aWVzOiBSZWNvcmQ8c3RyaW5nLCBVSTVQcm9wZXJ0eU1ldGFkYXRhPjtcblx0YWdncmVnYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBVSTVBZ2dyZWdhdGlvbk1ldGFkYXRhPjtcblx0cmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgYm9vbGVhbj47XG5cdGFzc29jaWF0aW9uczogUmVjb3JkPHN0cmluZywgVUk1QXNzb2NpYXRpb25NZXRhZGF0YT47XG5cdG1ldGhvZHM6IFJlY29yZDxzdHJpbmcsIFVJNUNvbnRyb2xsZXJNZXRob2REZWZpbml0aW9uPjtcblx0ZXZlbnRzOiBSZWNvcmQ8c3RyaW5nLCB7fT47XG5cdGludGVyZmFjZXM6IHN0cmluZ1tdO1xuXHRsaWJyYXJ5Pzogc3RyaW5nO1xuXHRkZXNpZ250aW1lPzogc3RyaW5nO1xuXHRjb25maWc/OiB7XG5cdFx0ZnVsbFdpZHRoPzogYm9vbGVhbjtcblx0fTtcblx0c3RhdGVQcm9wZXJ0eT86IHN0cmluZztcblx0c3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZT86IHVua25vd247XG5cdG1hbmlmZXN0Pzogc3RyaW5nIHwgdW5rbm93bjtcblx0cmV0dXJuVHlwZXM/OiBzdHJpbmdbXTtcblx0YnVpbGRpbmdCbG9ja01ldGFkYXRhPzogdW5rbm93bjtcbn07XG5leHBvcnQgdHlwZSBBY2Nlc3NvckRlc2NyaXB0b3I8VD4gPSBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxUPiAmIHsgaW5pdGlhbGl6ZXI/OiAoKSA9PiBUIH07XG50eXBlIFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uID0ge1xuXHRvdmVycmlkZT86IHsgZXh0ZW5zaW9uPzogUmVjb3JkPHN0cmluZywgT3ZlcnJpZGVEZWZpbml0aW9uPiB9ICYge1xuXHRcdFtrOiBzdHJpbmddOiBGdW5jdGlvbjtcblx0fTtcblx0b3ZlcnJpZGVzPzogeyBleHRlbnNpb24/OiBSZWNvcmQ8c3RyaW5nLCBPdmVycmlkZURlZmluaXRpb24+IH0gJiB7XG5cdFx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xuXHR9O1xuXHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdHJlbmRlcmVyPzogRnVuY3Rpb247XG59O1xuXG50eXBlIFVJNUNvbnRyb2xEZWZpbml0aW9uID0ge1xuXHRtZXRhZGF0YT86IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb247XG5cdG92ZXJyaWRlPzogdW5rbm93bjtcblx0cmVuZGVyZXI/OiBGdW5jdGlvbjtcbn07XG5cbnR5cGUgVUk1QVBJQ29udHJvbCA9IENvbnRyb2wgJiB7XG5cdGdldEFQSShldmVudDogVUk1RXZlbnQsIGZxZG4/OiBzdHJpbmcpOiBVSTVBUElDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRpbnN0YW5jZU1hcDogV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPjtcblx0X19hcGlSZWdpc3RlcmVkOiBib29sZWFuO1xufSAmIHtcblx0W2s6IHN0cmluZ106IEZ1bmN0aW9uO1xufTtcblxuZXhwb3J0IHR5cGUgWE1MRXZlbnRIb2xkZXIgPSB7XG5cdGdldEFQSShldmVudDogVUk1RXZlbnQsIGZxZG4/OiBzdHJpbmcpOiBVSTVBUElDb250cm9sIHwgdW5kZWZpbmVkO1xuXHRpbnN0YW5jZU1hcDogV2Vha01hcDxvYmplY3QsIG9iamVjdFtdPjtcbn07XG5cbnR5cGUgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4gPSB7XG5cdC8vIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBUUyBjb21waWxlclxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gbmV2ZXIgOiBLO1xufVtrZXlvZiBUXTtcbmV4cG9ydCB0eXBlIFByb3BlcnRpZXNPZjxULCBLIGV4dGVuZHMga2V5b2YgVCB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4gPSBQYXJ0aWFsPFBpY2s8VCwgQ29udHJvbFByb3BlcnR5TmFtZXM8VD4+PiAmXG5cdChLIGV4dGVuZHMga2V5b2YgVCA/IFBhcnRpYWw8UGljazxULCBLPj4gOiB7fSkgJlxuXHQkQ29udHJvbFNldHRpbmdzO1xuZXhwb3J0IHR5cGUgQ29udmVydENvbnRleHRUb1N0cmluZzxUPiA9IHtcblx0W0sgaW4ga2V5b2YgVF06IEsgZXh0ZW5kcyBcIm1ldGFQYXRoXCIgfCBcImNvbnRleHRQYXRoXCIgPyBzdHJpbmcgOiBUW0tdO1xufTtcbnR5cGUgQ29udGV4dFRvU3RyaW5nPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENvbnRleHQgfCB1bmRlZmluZWQgPyBzdHJpbmcgfCB1bmRlZmluZWQgOiBUW0tdO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvcGVydGllc09mQnVpbGRpbmdCbG9jazxUPiA9IENvbnRleHRUb1N0cmluZzxQcm9wZXJ0aWVzT2Y8VD4+O1xuZXhwb3J0IHR5cGUgU3RyaWN0UHJvcGVydGllc09mPFQ+ID0gUGljazxULCBDb250cm9sUHJvcGVydHlOYW1lczxUPj47XG5leHBvcnQgdHlwZSBVSTVBY2Nlc3NvcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIGdldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgZ2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAoKSA9PiBUW1BdO1xufTtcbmV4cG9ydCB0eXBlIFVJNVNldHRlcnM8VD4gPSB7XG5cdC8vIEFkZCBhbGwgdGhlIHNldFhYWCBtZXRob2QsIG1pZ2h0IGFkZCB0b28gbXVjaCBhcyBJJ20gbm90IGZpbHRlcmluZyBvbiBhY3R1YWwgcHJvcGVydGllcy4uLlxuXHRbUCBpbiBrZXlvZiBSZXF1aXJlZDxUPiBhcyBgc2V0JHtDYXBpdGFsaXplPHN0cmluZyAmIFA+fWBdOiAodmFsdWU6IFRbUF0pID0+IFQ7XG59O1xuZXhwb3J0IHR5cGUgRW5oYW5jZVdpdGhVSTU8VD4gPSB7XG5cdG5ldyAocHJvcHM6IFByb3BlcnRpZXNPZjxUPik6IEVuaGFuY2VXaXRoVUk1PFQ+O1xuXHRuZXcgKHNJZDogc3RyaW5nLCBwcm9wczogUHJvcGVydGllc09mPFQ+KTogRW5oYW5jZVdpdGhVSTU8VD47XG59ICYgVCAmXG5cdFVJNUFjY2Vzc29yczxUPiAmXG5cdFVJNVNldHRlcnM8VD47XG5cbmV4cG9ydCB0eXBlIEV4dGVuc2lvbk92ZXJyaWRlRXhlY3V0aW9uID0gXCJJbnN0ZWFkXCIgfCBcIkJlZm9yZVwiIHwgXCJBZnRlclwiIHwgXCJBZnRlckFzeW5jXCIgfCBcIkJlZm9yZUFzeW5jXCI7XG5cbmNvbnN0IGVuc3VyZU1ldGFkYXRhID0gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24ge1xuXHR0YXJnZXQubWV0YWRhdGEgPSBtZXJnZShcblx0XHR7XG5cdFx0XHRjb250cm9sbGVyRXh0ZW5zaW9uczoge30sXG5cdFx0XHRwcm9wZXJ0aWVzOiB7fSxcblx0XHRcdGFnZ3JlZ2F0aW9uczoge30sXG5cdFx0XHRyZWZlcmVuY2VzOiB7fSxcblx0XHRcdGFzc29jaWF0aW9uczoge30sXG5cdFx0XHRtZXRob2RzOiB7fSxcblx0XHRcdGV2ZW50czoge30sXG5cdFx0XHRpbnRlcmZhY2VzOiBbXVxuXHRcdH0sXG5cdFx0dGFyZ2V0Lm1ldGFkYXRhID8/IHt9XG5cdCkgYXMgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0cmV0dXJuIHRhcmdldC5tZXRhZGF0YTtcbn07XG5cbi8qKlxuICogTWV0aG9kIHRoYXQgd2lsbCBmaW5kIHRoZSBjb3JyZWN0IEFQSSBvYmplY3QgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udHJvbCBoaWVyYXJjaHkuXG4gKiBAcGFyYW0gdGFyZ2V0XG4gKiBAcmV0dXJucyBUaGUgcHJvcGVyIGdldEFQSSBmdW5jdGlvbiBmb3IgdGhpcyBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBwcmVwYXJlR2V0QVBJRnVuY3Rpb24odGFyZ2V0OiBVSTVBUElDb250cm9sKSB7XG5cdHJldHVybiBmdW5jdGlvbiA8VCBleHRlbmRzIFVJNUFQSUNvbnRyb2w+KFxuXHRcdHRoaXM6IFVJNUFQSUNvbnRyb2wsXG5cdFx0b0V2ZW50OiBVSTVFdmVudCxcblx0XHRhcGlGUU46IHN0cmluZyA9IHRhcmdldC5nZXRNZXRhZGF0YSgpLmdldE5hbWUoKVxuXHQpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgb1NvdXJjZSA9IG9FdmVudC5nZXRTb3VyY2UoKSBhcyBNYW5hZ2VkT2JqZWN0IHwgbnVsbDtcblx0XHRpZiAodGFyZ2V0Ll9nZXRBUElFeHRlbnNpb24pIHtcblx0XHRcdG9Tb3VyY2UgPSB0YXJnZXQuX2dldEFQSUV4dGVuc2lvbihvU291cmNlKSA/PyBvU291cmNlO1xuXHRcdH1cblx0XHR3aGlsZSAob1NvdXJjZSAmJiAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSAmJiBvU291cmNlLmdldFBhcmVudCkge1xuXHRcdFx0aWYgKHRoaXMuaXNEZXBlbmRlbnRCb3VuZCkge1xuXHRcdFx0XHRjb25zdCBvRGVwZW5kZW50cyA9IChvU291cmNlIGFzIENvbnRyb2wpLmdldERlcGVuZGVudHMoKTtcblx0XHRcdFx0Y29uc3QgaGFzQ29ycmVjdERlcGVuZGVudCA9IG9EZXBlbmRlbnRzLmZpbmQoKG9EZXBlbmRlbnQ6IFVJNUVsZW1lbnQpID0+IG9EZXBlbmRlbnQuaXNBKGFwaUZRTikpO1xuXHRcdFx0XHRpZiAoaGFzQ29ycmVjdERlcGVuZGVudCkge1xuXHRcdFx0XHRcdG9Tb3VyY2UgPSBoYXNDb3JyZWN0RGVwZW5kZW50IGFzIHVua25vd24gYXMgVDtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRvU291cmNlID0gb1NvdXJjZS5nZXRQYXJlbnQoKSBhcyB1bmtub3duIGFzIFQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG9Tb3VyY2UgPSBvU291cmNlLmdldFBhcmVudCgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICghb1NvdXJjZSB8fCAhb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0Y29uc3Qgb1NvdXJjZU1hcCA9IHRoaXMuaW5zdGFuY2VNYXAuZ2V0KHRoaXMpIGFzIFRbXTtcblx0XHRcdG9Tb3VyY2UgPSBvU291cmNlTWFwPy5bb1NvdXJjZU1hcC5sZW5ndGggLSAxXTtcblx0XHR9XG5cdFx0bGV0IHRhcmdldENvbnRyb2w7XG5cdFx0aWYgKG9Tb3VyY2UgJiYgb1NvdXJjZS5pc0E8VD4oYXBpRlFOKSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbCA9IG9Tb3VyY2U7XG5cdFx0fVxuXHRcdHJldHVybiB0YXJnZXRDb250cm9sO1xuXHR9O1xufVxuXG4vKipcbiAqIEVuc3VyZXMgdGhhdCB3aGVuIGFuIHhtbEV2ZW50SGFuZGxlciBpcyBkZWZpbmVkLCB0aGUgYGdldEFQSWAgZnVuY3Rpb24gaXMgcHJvcGVybHkgYXNzaWduZWQuXG4gKiBAcGFyYW0gdGFyZ2V0IFRoZSBjbGFzcyBjb25zdHJ1Y3RvciB0aGF0IHNob3VsZCBob2xkIHRoZSBzdGF0aWMgZnVuY3Rpb25zXG4gKi9cbmNvbnN0IGVuc3VyZUdldEFQSSA9IGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUFQSUNvbnRyb2wpOiB2b2lkIHtcblx0aWYgKCF0YXJnZXQuX19hcGlSZWdpc3RlcmVkKSB7XG5cdFx0dGFyZ2V0Ll9fYXBpUmVnaXN0ZXJlZCA9IHRydWU7XG5cdFx0dGFyZ2V0Lmluc3RhbmNlTWFwID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBvYmplY3RbXT4oKTtcblx0XHR0YXJnZXQucmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uIChfaW5zdGFuY2U6IEZ1bmN0aW9uKTogdm9pZCB7XG5cdFx0XHRpZiAoIXRoaXMuaW5zdGFuY2VNYXAuZ2V0KF9pbnN0YW5jZS5jb25zdHJ1Y3RvcikpIHtcblx0XHRcdFx0dGhpcy5pbnN0YW5jZU1hcC5zZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yLCBbXSk7XG5cdFx0XHR9XG5cdFx0XHQodGhpcy5pbnN0YW5jZU1hcC5nZXQoX2luc3RhbmNlLmNvbnN0cnVjdG9yKSBhcyBvYmplY3RbXSkucHVzaChfaW5zdGFuY2UpO1xuXHRcdH07XG5cdFx0dGFyZ2V0LmdldEFQSSA9IHByZXBhcmVHZXRBUElGdW5jdGlvbih0YXJnZXQpO1xuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBTdGF0ZU9mPFQ+ID0ge1xuXHRbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEFycmF5PGluZmVyIFU+ID8gUmVhZG9ubHlBcnJheTxVPiAmIFBhcnRpYWw8VT4gOiBUW0tdO1xufTtcbmV4cG9ydCB0eXBlIEJpbmRpbmdJbmZvSG9sZGVyID0ge1xuXHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0cGF0aDogc3RyaW5nO1xuXHRcdG1vZGVsOiBzdHJpbmc7XG5cdH07XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGJpbmRpbmcgaW5mbyBmb3IgYW4gYXJyYXkgcHJvcGVydHkgY29taW5nIGZyb20gdGhlIHN0YXRlLlxuICogQHBhcmFtIHN0YXRlUHJvcGVydHlcbiAqIEByZXR1cm5zIFRoZSBhZ2dyZWdhdGlvbiBiaW5kaW5nIGluZm9cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmRTdGF0ZUFycmF5KHN0YXRlUHJvcGVydHk6IHJlYWRvbmx5IG9iamVjdFtdKTogQWdncmVnYXRpb25CaW5kaW5nSW5mbyB8IHVuZGVmaW5lZCB7XG5cdGlmICgoc3RhdGVQcm9wZXJ0eSBhcyB1bmtub3duIGFzIEJpbmRpbmdJbmZvSG9sZGVyKS5fX2JpbmRpbmdJbmZvICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGF0aDogKHN0YXRlUHJvcGVydHkgYXMgdW5rbm93biBhcyBCaW5kaW5nSW5mb0hvbGRlcikuX19iaW5kaW5nSW5mby5wYXRoLFxuXHRcdFx0bW9kZWw6IChzdGF0ZVByb3BlcnR5IGFzIHVua25vd24gYXMgQmluZGluZ0luZm9Ib2xkZXIpLl9fYmluZGluZ0luZm8ubW9kZWxcblx0XHR9O1xuXHR9XG59XG5cbi8qKlxuICogQWxsb3dzIHRvIGRlZmluZSBhIHByb3BlcnR5IHRoYXQgd2lsbCBob2xkIHRoZSBjb250cm9sIHN0YXRlLlxuICpcbiAqIFByb3BlcnRpZXMgZGVmaW5lZCB3aXRoIHRoaXMgZGVjb3JhdG9yIHdpbGwgYmUgYXV0b21hdGljYWxseSBib3VuZCB0byB0aGUgY29udHJvbCBzdGF0ZSB3aGVuIHVzZWQgaW4gSlNYLlxuICogQXJyYXlzIG5lZWQgdG8gYmUgYm91bmQgdXNpbmcgdGhlIGBiaW5kU3RhdGVgIGZ1bmN0aW9uLlxuICogQGV4cGVyaW1lbnRhbFxuICogQHJldHVybnMgQSBwcm9wZXJ0eSBkZWNvcmF0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVN0YXRlKCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHkgPSBwcm9wZXJ0eUtleTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kT3ZlcnJpZGUoZXh0ZW5zaW9uTmFtZT86IHN0cmluZyk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZSkge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlID0ge307XG5cdFx0fVxuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlcykge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlcyA9IHt9O1xuXHRcdH1cblx0XHRsZXQgY3VycmVudFRhcmdldCA9IHRhcmdldC5vdmVycmlkZXM7XG5cdFx0aWYgKGV4dGVuc2lvbk5hbWUpIHtcblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb24pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXTtcblx0XHR9XG5cdFx0Y3VycmVudFRhcmdldFtwcm9wZXJ0eUtleS50b1N0cmluZygpXSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+KVtwcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24gYmFzZWQgb24gdGhlIGRlZmluZWQgb3ZlcnJpZGVFeGVjdXRpb25UeXBlLlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaWNFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IHRydWU7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgb25seSBhdmFpbGFibGUgZm9yIGludGVybmFsIHVzYWdlIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBleHRlbnNpb25DbGFzcyBUaGUgY29udHJvbGxlciBleHRlbnNpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNpbmdFeHRlbnNpb24oZXh0ZW5zaW9uQ2xhc3M6IHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRtZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IGV4dGVuc2lvbkNsYXNzO1xuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qICNlbmRyZWdpb24gKi9cblxuLyogI3JlZ2lvbiBDT05UUk9MICovXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiBldmVudCBvbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb24gVGhlIHByb3BlcnR5IGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShhdHRyaWJ1dGVEZWZpbml0aW9uOiBVSTVQcm9wZXJ0eU1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSBmYWxzZTtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZ3JvdXAgPSBcIkRhdGFcIjtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBhdHRyaWJ1dGVEZWZpbml0aW9uO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhZ2dyZWdhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3M/Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3Moc1RhcmdldDogc3RyaW5nLCBtZXRhZGF0YURlZmluaXRpb24/OiBQYXJ0aWFsPFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24+KTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdG9yOiBVSTVDb250cm9sQW5kTW9yZSkge1xuXHRcdGlmICghY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhKSB7XG5cdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEgPSB7fTtcblx0XHR9XG5cdFx0aWYgKG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSkge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0ge1xuXHRcdFx0XHRcdFx0XHQuLi5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSxcblx0XHRcdFx0XHRcdFx0Li4uKG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl0gYXMgb2JqZWN0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWdpc3RlclVJNU1ldGFkYXRhKGNvbnN0cnVjdG9yLCBzVGFyZ2V0LCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmZXJlbmNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50PigpOiBSZWY8VD4ge1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQsXG5cdFx0c2V0Q3VycmVudDogZnVuY3Rpb24gKG9Db250cm9sSW5zdGFuY2U6IFQpOiB2b2lkIHtcblx0XHRcdHRoaXMuY3VycmVudCA9IG9Db250cm9sSW5zdGFuY2U7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBvYmplY3Qgd2lsbCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCB0aHJvdWdoIGpzeCB0ZW1wbGF0aW5nLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdGF0ZVByb3BlcnR5KFxuXHRvYmo6IFVJNUNvbnRyb2xEZWZpbml0aW9uLFxuXHR0YXJnZXRDb250cm9sOiBDb250cm9sICYgeyBfdXBkYXRlU3RhdGU6IEZ1bmN0aW9uOyBfdXBkYXRlU3RhdGVEZWJvdW5jZWQ6IEZ1bmN0aW9uOyBfdXBkYXRlU3RhdGVUaW1lcjogdW5rbm93biB9XG4pOiB2b2lkIHtcblx0aWYgKG9iai5tZXRhZGF0YT8uc3RhdGVQcm9wZXJ0eSkge1xuXHRcdGNvbnN0IHN0YXRlTW9kZWwgPSBuZXcgSlNPTk1vZGVsKHt9KTtcblx0XHR0YXJnZXRDb250cm9sLnNldE1vZGVsKHN0YXRlTW9kZWwsIFwiJGNvbXBvbmVudFN0YXRlXCIpO1xuXHRcdGxldCB1cGRhdGluZ1N0YXRlID0gZmFsc2U7XG5cdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGUgPSBmdW5jdGlvbiAoKTogdm9pZCB7XG5cdFx0XHRkZWxldGUgdGhpcy5fdXBkYXRlU3RhdGVUaW1lcjtcblx0XHRcdGlmICghdXBkYXRpbmdTdGF0ZSkge1xuXHRcdFx0XHR1cGRhdGluZ1N0YXRlID0gdHJ1ZTtcblx0XHRcdFx0KHRoaXMgYXMgeyBvblN0YXRlQ2hhbmdlPzogRnVuY3Rpb24gfSkub25TdGF0ZUNoYW5nZT8uKCk7XG5cdFx0XHRcdHVwZGF0aW5nU3RhdGUgPSBmYWxzZTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkID0gZnVuY3Rpb24gKCk6IHZvaWQge1xuXHRcdFx0aWYgKCF0aGlzLl91cGRhdGVTdGF0ZVRpbWVyICYmICF1cGRhdGluZ1N0YXRlKSB7XG5cdFx0XHRcdHRoaXMuX3VwZGF0ZVN0YXRlVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcblx0XHRcdFx0XHR0aGlzLl91cGRhdGVTdGF0ZSgpO1xuXHRcdFx0XHR9LCAyMDApO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldENvbnRyb2wsIG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5LCB7XG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0cmV0dXJuIG5ldyBQcm94eShzdGF0ZU1vZGVsLCB7XG5cdFx0XHRcdFx0Z2V0OiBmdW5jdGlvbiAoanNvbk1vZGVsLCBwcm9wKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRjb25zdCBwYXRoSW5Nb2RlbCA9IGAvJHtwcm9wLnRvU3RyaW5nKCl9YDtcblx0XHRcdFx0XHRcdGNvbnN0IG9PYmogPSBkZWVwQ2xvbmUoanNvbk1vZGVsLmdldE9iamVjdChwYXRoSW5Nb2RlbCkpO1xuXHRcdFx0XHRcdFx0bGV0IG9UYXJnZXQ7XG5cdFx0XHRcdFx0XHRpZiAodHlwZW9mIG9PYmogPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRcdFx0b1RhcmdldCA9IHsgdmFsdWU6IG9PYmogfTtcblx0XHRcdFx0XHRcdFx0b1RhcmdldC50b1N0cmluZyA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJudW1iZXJcIikge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0geyB2YWx1ZTogb09iaiB9O1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0LnRvU3RyaW5nID0gZnVuY3Rpb24gKCk6IHN0cmluZyB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAodHlwZW9mIG9PYmogPT09IFwiYm9vbGVhblwiKSB7XG5cdFx0XHRcdFx0XHRcdG9UYXJnZXQgPSBuZXcgQm9vbGVhbihvT2JqKTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvT2JqKSkge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0gbmV3IFByb3h5KG9PYmouY29uY2F0KCksIHtcblx0XHRcdFx0XHRcdFx0XHRnZXQodGFyZ2V0OiB1bmtub3duW10sIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29uc3QgcmVmID0gUmVmbGVjdC5nZXQodGFyZ2V0LCBwLCByZWNlaXZlcik7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAodHlwZW9mIHJlZiA9PT0gXCJmdW5jdGlvblwiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiByZWYuYmluZCh0YXJnZXQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChyZWYgPT09IHVuZGVmaW5lZCAmJiBpc05hTihOdW1iZXIocC50b1N0cmluZygpKSkpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtb2RlbDogXCIkY29tcG9uZW50U3RhdGVcIixcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHBhdGg6IHBcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVmO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRvVGFyZ2V0ID0geyAuLi5vT2JqIH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRvVGFyZ2V0Ll9fYmluZGluZ0luZm8gPSB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBwYXRoSW5Nb2RlbFxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdHJldHVybiBvVGFyZ2V0O1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0c2V0OiAoc2V0U3RhdGVNb2RlbDogSlNPTk1vZGVsLCBwcm9wLCB2YWx1ZSk6IGJvb2xlYW4gPT4ge1xuXHRcdFx0XHRcdFx0Y29uc3Qgc2V0UmVzdWx0ID0gc2V0U3RhdGVNb2RlbC5zZXRQcm9wZXJ0eShgLyR7cHJvcC50b1N0cmluZygpfWAsIHZhbHVlKTtcblx0XHRcdFx0XHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlRGVib3VuY2VkKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc2V0UmVzdWx0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9LFxuXHRcdFx0c2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcblx0XHRcdFx0Ly8gUmVwbGFjaW5nIHRoZSBjb21wbGV0ZSBzdGF0ZVxuXHRcdFx0XHRzdGF0ZU1vZGVsLnNldFByb3BlcnR5KGAvYCwgdmFsdWUpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdGlmIChvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSkge1xuXHRcdFx0dGFyZ2V0Q29udHJvbFtvYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eSBhcyBrZXlvZiBDb250cm9sXSA9IG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlIGFzIG5ldmVyO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0X2NyZWF0ZVN0YXRlUHJvcGVydHkob2JqLCB0aGlzKTtcblx0fTtcblxuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUE4SUEsTUFBTUEsY0FBYyxHQUFH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QVUsT0FBQWhILEtBQUEsQ0FBQStHLEtBQUEsR0FBQUUsS0FBQSxNQUFBQSxLQUFBLEdBQUFGLEtBQUEsRUFBQUUsS0FBQTtvQkFBVkQsVUFBVSxDQUFBQyxLQUFBLElBQUExTSxTQUFBLENBQUEwTSxLQUFBO2tCQUFBO2tCQUsxQixLQUFLLE1BQU1DLEdBQUcsSUFBSUwsWUFBWSxFQUFFO29CQUMvQixNQUFNSyxHQUFHLENBQUMvQixLQUFLLENBQUNILEtBQUksRUFBRWdDLFVBQVUsQ0FBQztrQkFDbEM7Z0JBQ0QsQ0FBQztjQUNGO1lBQ0QsQ0FBQyxDQUFDO1VBQ0g7UUFDRDtNQUNEO01BQ0EvRixvQkFBb0IsQ0FBQ0MsR0FBRyxFQUFFLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBRURvQyxLQUFLLENBQUNqRyxRQUFRLEdBQUcsVUFBVThKLFVBQW1CLEVBQVk7TUFDekQsTUFBTUMsR0FBRyxHQUFHLENBQUMsQ0FBQztNQUNiQSxHQUFHLENBQWNwTCxXQUFXLEdBQUcsWUFBd0M7UUFBQSxTQUFBcUwsS0FBQSxHQUFBOU0sU0FBQSxDQUFBQyxNQUFBLEVBQTNCdUYsSUFBSSxPQUFBQyxLQUFBLENBQUFxSCxLQUFBLEdBQUFDLEtBQUEsTUFBQUEsS0FBQSxHQUFBRCxLQUFBLEVBQUFDLEtBQUE7VUFBSnZILElBQUksQ0FBQXVILEtBQUEsSUFBQS9NLFNBQUEsQ0FBQStNLEtBQUE7UUFBQTtRQUNoRCxPQUFPaEUsS0FBSyxDQUFDNkIsS0FBSyxDQUFDLElBQUksRUFBRXBGLElBQUksQ0FBQztNQUMvQixDQUFDO01BQ0QsTUFBTXdILE1BQU0sR0FBSUMsUUFBUSxDQUEwQ0MsV0FBVyxDQUM1RW5FLEtBQUssRUFDTCxzQkFBc0JvRSxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQzdCTixHQUFHLEVBQ0hPLGtCQUNELENBQUM7TUFDREosTUFBTSxDQUFDN00sV0FBVyxDQUFDLENBQUMsQ0FBQ2tOLGVBQWUsR0FBR1QsVUFBVTtNQUNqREksTUFBTSxDQUFDN00sV0FBVyxDQUFDLENBQUMsQ0FBQ21OLFNBQVMsR0FBSXZFLEtBQUssQ0FBQzVJLFdBQVcsQ0FBQyxDQUFDLENBQTZCbU4sU0FBUztNQUMzRixPQUFPTixNQUFNO0lBQ2QsQ0FBQztJQUVETyxVQUFVLENBQUM3TCxHQUFHLENBQUNzSCxJQUFJLEVBQUVxQixNQUFNLENBQUM7SUFFNUIsT0FBT0EsTUFBTTtFQUNkO0VBQUMsT0FBQW5JLFFBQUE7QUFBQSIsImlnbm9yZUxpc3QiOltdfQ==
718
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJlbnN1cmVNZXRhZGF0YSIsInRhcmdldCIsIm1ldGFkYXRhIiwibWVyZ2UiLCJjb250cm9sbGVyRXh0ZW5zaW9ucyIsInByb3BlcnRpZXMiLCJhZ2dyZWdhdGlvbnMiLCJyZWZlcmVuY2VzIiwiYXNzb2NpYXRpb25zIiwibWV0aG9kcyIsImV2ZW50cyIsImludGVyZmFjZXMiLCJwcmVwYXJlR2V0QVBJRnVuY3Rpb24iLCJvRXZlbnQiLCJhcGlGUU4iLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJnZXRNZXRhZGF0YSIsImdldE5hbWUiLCJvU291cmNlIiwiZ2V0U291cmNlIiwiX2dldEFQSUV4dGVuc2lvbiIsImlzQSIsImdldFBhcmVudCIsImlzRGVwZW5kZW50Qm91bmQiLCJvRGVwZW5kZW50cyIsImdldERlcGVuZGVudHMiLCJoYXNDb3JyZWN0RGVwZW5kZW50IiwiZmluZCIsIm9EZXBlbmRlbnQiLCJvU291cmNlTWFwIiwiaW5zdGFuY2VNYXAiLCJnZXQiLCJ0YXJnZXRDb250cm9sIiwiZW5zdXJlR2V0QVBJIiwiX19hcGlSZWdpc3RlcmVkIiwiV2Vha01hcCIsInJlZ2lzdGVySW5zdGFuY2UiLCJfaW5zdGFuY2UiLCJjb25zdHJ1Y3RvciIsInNldCIsInB1c2giLCJnZXRBUEkiLCJkZWZpbmVTdGF0ZSIsInByb3BlcnR5S2V5IiwicHJvcGVydHlEZXNjcmlwdG9yIiwiX2luaXRpYWxpemVyIiwiX3JlZiIsInN0YXRlUHJvcGVydHkiLCJ3cml0YWJsZSIsInN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUiLCJpbml0aWFsaXplciIsImNhbGwiLCJfZXhwb3J0cyIsIm1ldGhvZE92ZXJyaWRlIiwiZXh0ZW5zaW9uTmFtZSIsIm92ZXJyaWRlIiwib3ZlcnJpZGVzIiwiY3VycmVudFRhcmdldCIsImV4dGVuc2lvbiIsInRvU3RyaW5nIiwiZXh0ZW5zaWJsZSIsIm92ZXJyaWRlRXhlY3V0aW9uIiwiZGVzY3JpcHRvciIsImhvb2thYmxlIiwicHVibGljRXh0ZW5zaW9uIiwiZW51bWVyYWJsZSIsInB1YmxpYyIsInByaXZhdGVFeHRlbnNpb24iLCJmaW5hbEV4dGVuc2lvbiIsImZpbmFsIiwidXNpbmdFeHRlbnNpb24iLCJleHRlbnNpb25DbGFzcyIsImV2ZW50IiwiZXZlbnRLZXkiLCJwcm9wZXJ0eSIsImF0dHJpYnV0ZURlZmluaXRpb24iLCJfaW5pdGlhbGl6ZXIyIiwiX3JlZjIiLCJiaW5kYWJsZSIsImlzQmluZGluZ0luZm8iLCJncm91cCIsImRlZmF1bHRWYWx1ZSIsImFnZ3JlZ2F0aW9uIiwiYWdncmVnYXRpb25EZWZpbml0aW9uIiwiX2luaXRpYWxpemVyMyIsIl9yZWYzIiwibXVsdGlwbGUiLCJpc0RlZmF1bHQiLCJkZWZhdWx0QWdncmVnYXRpb24iLCJhc3NvY2lhdGlvbiIsInVpNUFzc29jaWF0aW9uTWV0YWRhdGEiLCJpbXBsZW1lbnRJbnRlcmZhY2UiLCJpbnRlcmZhY2VOYW1lIiwieG1sRXZlbnRIYW5kbGVyIiwicHJvcGVydHlrZXkiLCJjdXJyZW50Q29uc3RydWN0b3IiLCJfbGVuIiwiYXJncyIsIkFycmF5IiwiX2tleSIsImRlZmluZVVJNUNsYXNzIiwic1RhcmdldCIsIm1ldGFkYXRhRGVmaW5pdGlvbiIsInByb3RvdHlwZSIsImtleSIsImlzQXJyYXkiLCJjb25jYXQiLCJyZWdpc3RlclVJNU1ldGFkYXRhIiwiY3JlYXRlUmVmZXJlbmNlIiwiY3VycmVudCIsInNldEN1cnJlbnQiLCJvQ29udHJvbEluc3RhbmNlIiwiZGVmaW5lUmVmZXJlbmNlIiwiQmFzZU9iamVjdCIsImlzT2JqZWN0QSIsIl9nZXRIYW5kbGVyRm9yU3RhdGVQcm9wZXJ0eSIsImpzb25Nb2RlbCIsInByb3AiLCJwYXRoSW5Nb2RlbCIsIm9PYmoiLCJkZWVwQ2xvbmUiLCJnZXRPYmplY3QiLCJvVGFyZ2V0IiwidmFsdWUiLCJCb29sZWFuIiwiUHJveHkiLCJwIiwicmVjZWl2ZXIiLCJyZWYiLCJSZWZsZWN0IiwiYmluZCIsImlzTmFOIiwiTnVtYmVyIiwiX19iaW5kaW5nSW5mbyIsIm1vZGVsIiwicGF0aCIsIl9jcmVhdGVTdGF0ZVByb3BlcnR5Iiwib2JqIiwiX29iaiRtZXRhZGF0YSIsInN0YXRlTW9kZWwiLCJKU09OTW9kZWwiLCJzZXRNb2RlbCIsInVwZGF0aW5nU3RhdGUiLCJfdXBkYXRlU3RhdGUiLCJfdXBkYXRlU3RhdGVUaW1lciIsIl9vblN0YXRlQ2hhbmdlIiwiX3JlZjQiLCJvblN0YXRlQ2hhbmdlIiwiX2NoYW5nZWRQcm9wcyIsIl91cGRhdGVTdGF0ZURlYm91bmNlZCIsImNoYW5nZWRQcm9wIiwiaW5jbHVkZXMiLCJzZXRUaW1lb3V0IiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJjb25maWd1cmFibGUiLCJzZXRTdGF0ZU1vZGVsIiwic2V0UmVzdWx0Iiwic2V0UHJvcGVydHkiLCJjbGF6eiIsIm5hbWUiLCJpbk9iaiIsIl9jbGF6eiRnZXRNZXRhZGF0YSIsIl9jbGF6eiRnZXRNZXRhZGF0YTIiLCJfaW5PYmokbWV0YWRhdGEiLCJfY2xhenokbWV0YWRhdGEiLCJfb2JqJG1ldGFkYXRhMiIsImdldE93blByb3BlcnR5TmFtZXMiLCJmb3JFYWNoIiwib2JqTmFtZSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsImJhc2VUeXBlIiwiZ2V0UHJvdG90eXBlT2YiLCJnZXRTdGVyZW90eXBlIiwicmVuZGVyZXJEZWZpbml0aW9uIiwicmVuZGVyZXIiLCJyZW5kZXIiLCJhcGlWZXJzaW9uIiwia2V5cyIsImUiLCJjRXh0TmFtZSIsIm91dHB1dCIsImV4dGVuZCIsImZuSW5pdCIsImluaXQiLCJmbkFmdGVySW5pdCIsImFmdGVySW5pdCIsIl90aGlzIiwiX2xlbjIiLCJfa2V5MiIsImFwcGx5IiwiYVByb3BlcnR5S2V5cyIsInByb3BlcnR5RGVmIiwicHJvcGVydHlEZWZhdWx0IiwiX2JpbmRpbmdQcm9wZXJ0aWVzIiwidiIsIm1Qcm9wZXJ0aWVzIiwicHJvcGVydHlWYWx1ZSIsImdldFByb3BlcnR5IiwiYmluZGluZ1Byb3BlcnR5VmFsdWUiLCJwcm9wVmFsdWUiLCJfYXBwbHlpbmdTZXR0aW5ncyIsImFBZ2dyZWdhdGlvbktleXMiLCJhZ2dyZWdhdGlvbktleSIsImFnZ3JlZ2F0aW9uRGVmIiwic2V0QWdncmVnYXRpb24iLCJhZ2dyZWdhdGlvbkNvbnRlbnQiLCJnZXRBZ2dyZWdhdGlvbiIsImFBc3NvY2lhdGlvbktleXMiLCJhc3NvY2lhdGlvbktleSIsInNldEFzc29jaWF0aW9uIiwiZ2V0QXNzb2NpYXRpb24iLCJyZWZlcmVuY2VQcm9wZXJ0aWVzIiwibWV0aG9kTmFtZSIsIm1ldGhvZERlZmluaXRpb24iLCJtZXRob2RIb2xkZXIiLCJtZXRob2RBcnJheXMiLCJyZXZlcnNlIiwiX2xlbjMiLCJtZXRob2RBcmdzIiwiX2tleTMiLCJhcmciLCJvRXh0ZW5zaW9uIiwicG9sIiwiX2xlbjQiLCJfa2V5NCIsIm9DbGFzcyIsIk1ldGFkYXRhIiwiY3JlYXRlQ2xhc3MiLCJ1aWQiLCJDb250cm9sbGVyTWV0YWRhdGEiLCJfc3RhdGljT3ZlcnJpZGUiLCJfb3ZlcnJpZGUiLCJPYmplY3RQYXRoIl0sInNvdXJjZVJvb3QiOiIuIiwic291cmNlcyI6WyJDbGFzc1N1cHBvcnQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9iamVjdFBhdGggZnJvbSBcInNhcC9iYXNlL3V0aWwvT2JqZWN0UGF0aFwiO1xuaW1wb3J0IGRlZXBDbG9uZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9kZWVwQ2xvbmVcIjtcbmltcG9ydCBtZXJnZSBmcm9tIFwic2FwL2Jhc2UvdXRpbC9tZXJnZVwiO1xuaW1wb3J0IHVpZCBmcm9tIFwic2FwL2Jhc2UvdXRpbC91aWRcIjtcbmltcG9ydCB7IGhvb2thYmxlIH0gZnJvbSBcInNhcC9mZS9iYXNlL0hvb2tTdXBwb3J0XCI7XG5pbXBvcnQgdHlwZSB7IFJlZiB9IGZyb20gXCJzYXAvZmUvYmFzZS9qc3gtcnVudGltZS9qc3hcIjtcbmltcG9ydCB0eXBlIFVJNUV2ZW50IGZyb20gXCJzYXAvdWkvYmFzZS9FdmVudFwiO1xuaW1wb3J0IHR5cGUgTWFuYWdlZE9iamVjdCBmcm9tIFwic2FwL3VpL2Jhc2UvTWFuYWdlZE9iamVjdFwiO1xuaW1wb3J0IE1ldGFkYXRhIGZyb20gXCJzYXAvdWkvYmFzZS9NZXRhZGF0YVwiO1xuaW1wb3J0IEJhc2VPYmplY3QgZnJvbSBcInNhcC91aS9iYXNlL09iamVjdFwiO1xuaW1wb3J0IHR5cGUgQ29udHJvbCBmcm9tIFwic2FwL3VpL2NvcmUvQ29udHJvbFwiO1xuaW1wb3J0IHR5cGUgeyAkQ29udHJvbFNldHRpbmdzIH0gZnJvbSBcInNhcC91aS9jb3JlL0NvbnRyb2xcIjtcbmltcG9ydCB0eXBlIFVJNUVsZW1lbnQgZnJvbSBcInNhcC91aS9jb3JlL0VsZW1lbnRcIjtcbmltcG9ydCB0eXBlIENvbnRyb2xsZXJFeHRlbnNpb24gZnJvbSBcInNhcC91aS9jb3JlL212Yy9Db250cm9sbGVyRXh0ZW5zaW9uXCI7XG5pbXBvcnQgQ29udHJvbGxlck1ldGFkYXRhIGZyb20gXCJzYXAvdWkvY29yZS9tdmMvQ29udHJvbGxlck1ldGFkYXRhXCI7XG5pbXBvcnQgdHlwZSBPdmVycmlkZUV4ZWN1dGlvbiBmcm9tIFwic2FwL3VpL2NvcmUvbXZjL092ZXJyaWRlRXhlY3V0aW9uXCI7XG5pbXBvcnQgdHlwZSBDb250ZXh0IGZyb20gXCJzYXAvdWkvbW9kZWwvQ29udGV4dFwiO1xuaW1wb3J0IEpTT05Nb2RlbCBmcm9tIFwic2FwL3VpL21vZGVsL2pzb24vSlNPTk1vZGVsXCI7XG5cbnR5cGUgT3ZlcnJpZGVEZWZpbml0aW9uID0gUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+O1xudHlwZSBVSTVDb250cm9sbGVyTWV0aG9kRGVmaW5pdGlvbiA9IHtcblx0b3ZlcnJpZGVFeGVjdXRpb24/OiBPdmVycmlkZUV4ZWN1dGlvbjtcblx0cHVibGljPzogYm9vbGVhbjtcblx0ZmluYWw/OiBib29sZWFuO1xufTtcbmV4cG9ydCB0eXBlIE5vbkFic3RyYWN0Q2xhc3M8VD4gPSBQaWNrPFQsIGtleW9mIFQ+ICYgKG5ldyAoLi4uYXJnczogdW5rbm93bltdKSA9PiBUKTtcblxudHlwZSBVSTVQcm9wZXJ0eU1ldGFkYXRhID0ge1xuXHR0eXBlOiBzdHJpbmc7XG5cdGJpbmRhYmxlPzogYm9vbGVhbjtcblx0cmVxdWlyZWQ/OiBib29sZWFuO1xuXHRncm91cD86IHN0cmluZztcblx0ZGVmYXVsdFZhbHVlPzogdW5rbm93bjtcblx0YnlWYWx1ZT86IGJvb2xlYW47XG5cdGlzQmluZGluZ0luZm8/OiBib29sZWFuO1xuXHRleHBlY3RlZEFubm90YXRpb25zPzogc3RyaW5nW107XG5cdGV4cGVjdGVkVHlwZXM/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+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHkgPSBwcm9wZXJ0eUtleTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdG1ldGFkYXRhLnN0YXRlUHJvcGVydHlEZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogRnVuY3Rpb24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLjtcbn1cblxuLyogI3JlZ2lvbiBDT05UUk9MTEVSIEVYVEVOU0lPTlMgKi9cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBtZXRob2QgaXMgYW4gb3ZlcnJpZGUgZm9yIHRoZSBtZXRob2QgbmFtZSB3aXRoIHRoZSBzYW1lIG5hbWUgaW4gdGhlIHNwZWNpZmljIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIG9yIGJhc2UgaW1wbGVtZW50YXRpb24uXG4gKiBAcGFyYW0gZXh0ZW5zaW9uTmFtZSBUaGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWV0aG9kT3ZlcnJpZGUoZXh0ZW5zaW9uTmFtZT86IHN0cmluZyk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXkpIHtcblx0XHRpZiAoIXRhcmdldC5vdmVycmlkZSkge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlID0ge307XG5cdFx0fVxuXHRcdGlmICghdGFyZ2V0Lm92ZXJyaWRlcykge1xuXHRcdFx0dGFyZ2V0Lm92ZXJyaWRlcyA9IHt9O1xuXHRcdH1cblx0XHRsZXQgY3VycmVudFRhcmdldCA9IHRhcmdldC5vdmVycmlkZXM7XG5cdFx0aWYgKGV4dGVuc2lvbk5hbWUpIHtcblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb24pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb24gPSB7fTtcblx0XHRcdH1cblx0XHRcdGlmICghY3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0pIHtcblx0XHRcdFx0Y3VycmVudFRhcmdldC5leHRlbnNpb25bZXh0ZW5zaW9uTmFtZV0gPSB7fTtcblx0XHRcdH1cblx0XHRcdGN1cnJlbnRUYXJnZXQgPSBjdXJyZW50VGFyZ2V0LmV4dGVuc2lvbltleHRlbnNpb25OYW1lXTtcblx0XHR9XG5cdFx0Y3VycmVudFRhcmdldFtwcm9wZXJ0eUtleS50b1N0cmluZygpXSA9ICh0YXJnZXQgYXMgUmVjb3JkPHN0cmluZywgRnVuY3Rpb24+KVtwcm9wZXJ0eUtleS50b1N0cmluZygpXTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIG1ldGhvZCBjYW4gYmUgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24gYmFzZWQgb24gdGhlIGRlZmluZWQgb3ZlcnJpZGVFeGVjdXRpb25UeXBlLlxuICogQHBhcmFtIG92ZXJyaWRlRXhlY3V0aW9uIFRoZSBPdmVycmlkZUV4ZWN1dGlvbiBkZWZpbmluZyB3aGVuIHRoZSBvdmVycmlkZSBzaG91bGQgcnVuIChCZWZvcmUgLyBBZnRlciAvIEluc3RlYWQpXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0ZW5zaWJsZShvdmVycmlkZUV4ZWN1dGlvbjogRXh0ZW5zaW9uT3ZlcnJpZGVFeGVjdXRpb24pOiBNZXRob2REZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbGxlckRlZmluaXRpb24sIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yOiBQcm9wZXJ0eURlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKCFtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldID0ge307XG5cdFx0fVxuXHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0ub3ZlcnJpZGVFeGVjdXRpb24gPSBvdmVycmlkZUV4ZWN1dGlvbiBhcyB1bmtub3duIGFzIE92ZXJyaWRlRXhlY3V0aW9uO1xuXG5cdFx0Ly8gYnkgZGVmYXVsdCwgZXZlcnkgZXh0ZW5zaWJsZSBtZXRob2QgaXMgYWxzbyBob29rYWJsZSAoZXhjZXB0IHRob3NlIGRlZmluZWQgYXMgSW5zdGVhZClcblx0XHRpZiAob3ZlcnJpZGVFeGVjdXRpb24gIT09IFwiSW5zdGVhZFwiKSB7XG5cdFx0XHRob29rYWJsZShvdmVycmlkZUV4ZWN1dGlvbikodGFyZ2V0LCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik7XG5cdFx0fVxuXHR9O1xufVxuXG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgcHVibGljbHkgYXZhaWxhYmxlIGZvciBjb250cm9sbGVyIGV4dGVuc2lvbiB1c2FnZS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwdWJsaWNFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcik6IHZvaWQge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLnB1YmxpYyA9IHRydWU7XG5cdH07XG59XG4vKipcbiAqIERlZmluZXMgdGhhdCB0aGUgbWV0aG9kIHdpbGwgYmUgb25seSBhdmFpbGFibGUgZm9yIGludGVybmFsIHVzYWdlIG9mIHRoZSBjb250cm9sbGVyIGV4dGVuc2lvbi5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcml2YXRlRXh0ZW5zaW9uKCk6IE1ldGhvZERlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXksIGRlc2NyaXB0b3IpIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0ZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gdHJ1ZTtcblx0XHRpZiAoIW1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0pIHtcblx0XHRcdG1ldGFkYXRhLm1ldGhvZHNbcHJvcGVydHlLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXS5wdWJsaWMgPSBmYWxzZTtcblx0fTtcbn1cbi8qKlxuICogRGVmaW5lcyB0aGF0IHRoZSBtZXRob2QgY2Fubm90IGJlIGZ1cnRoZXIgZXh0ZW5kZWQgYnkgb3RoZXIgY29udHJvbGxlciBleHRlbnNpb24uXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluYWxFeHRlbnNpb24oKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xsZXJEZWZpbml0aW9uLCBwcm9wZXJ0eUtleSwgZGVzY3JpcHRvcikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZXNjcmlwdG9yLmVudW1lcmFibGUgPSB0cnVlO1xuXHRcdGlmICghbWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSkge1xuXHRcdFx0bWV0YWRhdGEubWV0aG9kc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IHt9O1xuXHRcdH1cblx0XHRtZXRhZGF0YS5tZXRob2RzW3Byb3BlcnR5S2V5LnRvU3RyaW5nKCldLmZpbmFsID0gdHJ1ZTtcblx0fTtcbn1cblxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIHVzZSBpbnN0YW50aWF0ZSBhIGNvbnRyb2xsZXIgZXh0ZW5zaW9uIHVuZGVyIHRoZSBmb2xsb3dpbmcgdmFyaWFibGUgbmFtZS5cbiAqIEBwYXJhbSBleHRlbnNpb25DbGFzcyBUaGUgY29udHJvbGxlciBleHRlbnNpb24gdGhhdCB3aWxsIGJlIGluc3RhbnRpYXRlZFxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNpbmdFeHRlbnNpb24oZXh0ZW5zaW9uQ2xhc3M6IHR5cGVvZiBDb250cm9sbGVyRXh0ZW5zaW9uIHwgRnVuY3Rpb24pOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sbGVyRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblx0XHRtZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9uc1twcm9wZXJ0eUtleS50b1N0cmluZygpXSA9IGV4dGVuc2lvbkNsYXNzO1xuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qICNlbmRyZWdpb24gKi9cblxuLyogI3JlZ2lvbiBDT05UUk9MICovXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eSBzaGFsbCBiZSBkZWNsYXJlZCBhcyBhbiBldmVudCBvbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV2ZW50KCk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBldmVudEtleTogc3RyaW5nIHwgU3ltYm9sKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuZXZlbnRzW2V2ZW50S2V5LnRvU3RyaW5nKCldKSB7XG5cdFx0XHRtZXRhZGF0YS5ldmVudHNbZXZlbnRLZXkudG9TdHJpbmcoKV0gPSB7fTtcblx0XHR9XG5cdH07XG59XG5cbi8qKlxuICogRGVmaW5lcyB0aGUgZm9sbG93aW5nIHByb3BlcnR5IGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIGF0dHJpYnV0ZURlZmluaXRpb24gVGhlIHByb3BlcnR5IGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9wZXJ0eShhdHRyaWJ1dGVEZWZpbml0aW9uOiBVSTVQcm9wZXJ0eU1ldGFkYXRhKTogUHJvcGVydHlEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKHRhcmdldDogVUk1Q29udHJvbERlZmluaXRpb24sIHByb3BlcnR5S2V5OiBzdHJpbmcsIHByb3BlcnR5RGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8dW5rbm93bj4pIHtcblx0XHRjb25zdCBtZXRhZGF0YSA9IGVuc3VyZU1ldGFkYXRhKHRhcmdldCk7XG5cdFx0aWYgKGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YXR0cmlidXRlRGVmaW5pdGlvbi5iaW5kYWJsZSA9IHRydWU7XG5cdFx0fVxuXHRcdGlmIChhdHRyaWJ1dGVEZWZpbml0aW9uLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uYmluZGFibGUgPSBmYWxzZTtcblx0XHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZ3JvdXAgPSBcIkRhdGFcIjtcblx0XHR9XG5cdFx0aWYgKCFtZXRhZGF0YS5wcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBhdHRyaWJ1dGVEZWZpbml0aW9uO1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGF0dHJpYnV0ZURlZmluaXRpb24uZGVmYXVsdFZhbHVlID8/PSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiBGdW5jdGlvbiB9KS5pbml0aWFsaXplcj8uKCk7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgYW5kIGNvbmZpZ3VyZXMgdGhlIGZvbGxvd2luZyBhZ2dyZWdhdGlvbiBpbiB0aGUgY29udHJvbCBtZXRhZGF0YS5cbiAqIEBwYXJhbSBhZ2dyZWdhdGlvbkRlZmluaXRpb24gVGhlIGFnZ3JlZ2F0aW9uIGRlZmluaXRpb25cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgcHJvcGVydHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZ2dyZWdhdGlvbihhZ2dyZWdhdGlvbkRlZmluaXRpb246IFVJNUFnZ3JlZ2F0aW9uTWV0YWRhdGEpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRpZiAoYWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdC8vIFVJNSBkZWZhdWx0cyB0aGlzIHRvIHRydWUgYnV0IHRoaXMgaXMganVzdCB3ZWlyZC4uLlxuXHRcdFx0YWdncmVnYXRpb25EZWZpbml0aW9uLm11bHRpcGxlID0gZmFsc2U7XG5cdFx0fVxuXHRcdGlmICghbWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYWdncmVnYXRpb25zW3Byb3BlcnR5S2V5XSA9IGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbjtcblx0XHR9XG5cdFx0aWYgKGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5pc0RlZmF1bHQpIHtcblx0XHRcdG1ldGFkYXRhLmRlZmF1bHRBZ2dyZWdhdGlvbiA9IHByb3BlcnR5S2V5O1xuXHRcdH1cblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGFnZ3JlZ2F0aW9uRGVmaW5pdGlvbi5kZWZhdWx0VmFsdWUgPz89IChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IEZ1bmN0aW9uIH0pLmluaXRpYWxpemVyPy4oKTtcblx0XHRkZWxldGUgKHByb3BlcnR5RGVzY3JpcHRvciBhcyB7IGluaXRpYWxpemVyPzogdW5rbm93biB9KS5pbml0aWFsaXplcjtcblxuXHRcdHJldHVybiBwcm9wZXJ0eURlc2NyaXB0b3I7XG5cdH0gYXMgdW5rbm93biBhcyBQcm9wZXJ0eURlY29yYXRvcjsgLy8gVGhpcyBpcyB0ZWNobmljYWxseSBhbiBhY2Nlc3NvciBkZWNvcmF0b3IsIGJ1dCBzb21laG93IHRoZSBjb21waWxlciBkb2Vzbid0IGxpa2UgaXQgaWYgSSBkZWNsYXJlIGl0IGFzIHN1Y2guXG59XG5cbi8qKlxuICogRGVmaW5lcyBhbmQgY29uZmlndXJlcyB0aGUgZm9sbG93aW5nIGFzc29jaWF0aW9uIGluIHRoZSBjb250cm9sIG1ldGFkYXRhLlxuICogQHBhcmFtIHVpNUFzc29jaWF0aW9uTWV0YWRhdGEgVGhlIGRlZmluaXRpb24gb2YgdGhlIGFzc29jaWF0aW9uLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eVxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzb2NpYXRpb24odWk1QXNzb2NpYXRpb25NZXRhZGF0YTogVUk1QXNzb2NpYXRpb25NZXRhZGF0YSk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eUtleTogc3RyaW5nLCBwcm9wZXJ0eURlc2NyaXB0b3I6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPHVua25vd24+KSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXHRcdGlmICghbWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0bWV0YWRhdGEuYXNzb2NpYXRpb25zW3Byb3BlcnR5S2V5XSA9IHVpNUFzc29jaWF0aW9uTWV0YWRhdGE7XG5cdFx0fVxuXHRcdGRlbGV0ZSBwcm9wZXJ0eURlc2NyaXB0b3Iud3JpdGFibGU7XG5cdFx0ZGVsZXRlIChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXI7XG5cblx0XHRyZXR1cm4gcHJvcGVydHlEZXNjcmlwdG9yO1xuXHR9IGFzIHVua25vd24gYXMgUHJvcGVydHlEZWNvcmF0b3I7IC8vIFRoaXMgaXMgdGVjaG5pY2FsbHkgYW4gYWNjZXNzb3IgZGVjb3JhdG9yLCBidXQgc29tZWhvdyB0aGUgY29tcGlsZXIgZG9lc24ndCBsaWtlIGl0IGlmIGkgZGVjbGFyZSBpdCBhcyBzdWNoLlxufVxuXG4vKipcbiAqIERlZmluZXMgaW4gdGhlIG1ldGFkYXRhIHRoYXQgdGhpcyBjb250cm9sIGltcGxlbWVudHMgYSBzcGVjaWZpYyBpbnRlcmZhY2UuXG4gKiBAcGFyYW0gaW50ZXJmYWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgaW1wbGVtZW50ZWQgaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBUaGUgZGVjb3JhdGVkIG1ldGhvZFxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1wbGVtZW50SW50ZXJmYWNlKGludGVyZmFjZU5hbWU6IHN0cmluZyk6IFByb3BlcnR5RGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uKSB7XG5cdFx0Y29uc3QgbWV0YWRhdGEgPSBlbnN1cmVNZXRhZGF0YSh0YXJnZXQpO1xuXG5cdFx0bWV0YWRhdGEuaW50ZXJmYWNlcy5wdXNoKGludGVyZmFjZU5hbWUpO1xuXHR9O1xufVxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kIHNob3VsZCBhbHNvIGJlIGV4cG9zZWQgc3RhdGljYWxseSBzbyB3ZSBjYW4gY2FsbCBpdCBmcm9tIFhNTC5cbiAqIEByZXR1cm5zIFRoZSBkZWNvcmF0ZWQgbWV0aG9kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4bWxFdmVudEhhbmRsZXIoKTogTWV0aG9kRGVjb3JhdG9yIHtcblx0cmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQ6IFVJNUNvbnRyb2xEZWZpbml0aW9uLCBwcm9wZXJ0eWtleSkge1xuXHRcdGNvbnN0IGN1cnJlbnRDb25zdHJ1Y3RvcjogVUk1QVBJQ29udHJvbCA9IHRhcmdldC5jb25zdHJ1Y3RvciBhcyB1bmtub3duIGFzIFVJNUFQSUNvbnRyb2w7XG5cdFx0ZW5zdXJlR2V0QVBJKGN1cnJlbnRDb25zdHJ1Y3Rvcik7XG5cdFx0Y3VycmVudENvbnN0cnVjdG9yW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IHZvaWQge1xuXHRcdFx0aWYgKGFyZ3M/Lmxlbmd0aCkge1xuXHRcdFx0XHRjb25zdCBjdXJyZW50VGFyZ2V0ID0gY3VycmVudENvbnN0cnVjdG9yLmdldEFQSShhcmdzWzBdIGFzIFVJNUV2ZW50KTtcblx0XHRcdFx0Y3VycmVudFRhcmdldD8uW3Byb3BlcnR5a2V5LnRvU3RyaW5nKCldKC4uLmFyZ3MpO1xuXHRcdFx0fVxuXHRcdH07XG5cdH07XG59XG5cbnR5cGUgVUk1Q29udHJvbEFuZE1vcmUgPSB0eXBlb2YgQ29udHJvbCAmXG5cdEZ1bmN0aW9uICYge1xuXHRcdHJlZ2lzdGVySW5zdGFuY2U/OiBGdW5jdGlvbjtcblx0XHRvdmVycmlkZT86IEZ1bmN0aW9uO1xuXHRcdHJlbmRlcmVyPzogdW5rbm93bjtcblx0XHRyZW5kZXI6IEZ1bmN0aW9uO1xuXHRcdG1ldGFkYXRhPzogVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbjtcblx0fTtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIGNsYXNzIHNob3VsZCBkZWZpbmUgYSBVSTUgY29udHJvbCBvZiB0aGUgc3BlY2lmaWVkIG5hbWUuXG4gKiBAcGFyYW0gc1RhcmdldCBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFVJNSBjbGFzc1xuICogQHBhcmFtIG1ldGFkYXRhRGVmaW5pdGlvbiBJbmxpbmUgbWV0YWRhdGEgZGVmaW5pdGlvblxuICogQHJldHVybnMgQSBjbGFzcyBkZWNvcmF0b3IgdGhhdCB3aWxsIGNyZWF0ZSBhIHVpNSBjbGFzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmaW5lVUk1Q2xhc3Moc1RhcmdldDogc3RyaW5nLCBtZXRhZGF0YURlZmluaXRpb24/OiBQYXJ0aWFsPFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb24+KTogQ2xhc3NEZWNvcmF0b3Ige1xuXHRyZXR1cm4gZnVuY3Rpb24gKGNvbnN0cnVjdG9yOiBVSTVDb250cm9sQW5kTW9yZSkge1xuXHRcdGlmICghY29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhKSB7XG5cdFx0XHRjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGEgPSB7fTtcblx0XHR9XG5cdFx0aWYgKG1ldGFkYXRhRGVmaW5pdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gbWV0YWRhdGFEZWZpbml0aW9uKSB7XG5cdFx0XHRcdGlmIChjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSkge1xuXHRcdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldKSkge1xuXHRcdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XS5jb25jYXQoXG5cdFx0XHRcdFx0XHRcdG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl1cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnN0cnVjdG9yLnByb3RvdHlwZS5tZXRhZGF0YVtrZXldID0ge1xuXHRcdFx0XHRcdFx0XHQuLi5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubWV0YWRhdGFba2V5XSxcblx0XHRcdFx0XHRcdFx0Li4uKG1ldGFkYXRhRGVmaW5pdGlvbltrZXkgYXMga2V5b2YgVUk1Q29udHJvbE1ldGFkYXRhRGVmaW5pdGlvbl0gYXMgb2JqZWN0KVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc3RydWN0b3IucHJvdG90eXBlLm1ldGFkYXRhW2tleV0gPSBtZXRhZGF0YURlZmluaXRpb25ba2V5IGFzIGtleW9mIFVJNUNvbnRyb2xNZXRhZGF0YURlZmluaXRpb25dO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiByZWdpc3RlclVJNU1ldGFkYXRhKGNvbnN0cnVjdG9yLCBzVGFyZ2V0LCBjb25zdHJ1Y3Rvci5wcm90b3R5cGUpO1xuXHR9IGFzIENsYXNzRGVjb3JhdG9yO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVmZXJlbmNlPFQgZXh0ZW5kcyBVSTVFbGVtZW50PigpOiBSZWY8VD4ge1xuXHRyZXR1cm4ge1xuXHRcdGN1cnJlbnQ6IHVuZGVmaW5lZCBhcyB1bmtub3duIGFzIFQsXG5cdFx0c2V0Q3VycmVudDogZnVuY3Rpb24gKG9Db250cm9sSW5zdGFuY2U6IFQpOiB2b2lkIHtcblx0XHRcdHRoaXMuY3VycmVudCA9IG9Db250cm9sSW5zdGFuY2U7XG5cdFx0fVxuXHR9O1xufVxuLyoqXG4gKiBEZWZpbmVzIHRoYXQgdGhlIGZvbGxvd2luZyBvYmplY3Qgd2lsbCBob2xkIGEgcmVmZXJlbmNlIHRvIGEgY29udHJvbCB0aHJvdWdoIGpzeCB0ZW1wbGF0aW5nLlxuICogQHJldHVybnMgVGhlIGRlY29yYXRlZCBwcm9wZXJ0eS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlZmluZVJlZmVyZW5jZSgpOiBQcm9wZXJ0eURlY29yYXRvciB7XG5cdHJldHVybiBmdW5jdGlvbiAodGFyZ2V0OiBVSTVDb250cm9sRGVmaW5pdGlvbiwgcHJvcGVydHlLZXk6IHN0cmluZywgcHJvcGVydHlEZXNjcmlwdG9yOiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjx1bmtub3duPikge1xuXHRcdGNvbnN0IG1ldGFkYXRhID0gZW5zdXJlTWV0YWRhdGEodGFyZ2V0KTtcblx0XHRkZWxldGUgcHJvcGVydHlEZXNjcmlwdG9yLndyaXRhYmxlO1xuXHRcdGRlbGV0ZSAocHJvcGVydHlEZXNjcmlwdG9yIGFzIHsgaW5pdGlhbGl6ZXI/OiB1bmtub3duIH0pLmluaXRpYWxpemVyO1xuXHRcdGlmIChCYXNlT2JqZWN0LmlzT2JqZWN0QSh0YXJnZXQsIFwic2FwLnVpLmNvcmUuQ29udHJvbFwiKSkge1xuXHRcdFx0aWYgKCFtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSkge1xuXHRcdFx0XHRtZXRhZGF0YS5yZWZlcmVuY2VzW3Byb3BlcnR5S2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdChwcm9wZXJ0eURlc2NyaXB0b3IgYXMgeyBpbml0aWFsaXplcj86IHVua25vd24gfSkuaW5pdGlhbGl6ZXIgPSBjcmVhdGVSZWZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb3BlcnR5RGVzY3JpcHRvcjtcblx0fSBhcyB1bmtub3duIGFzIFByb3BlcnR5RGVjb3JhdG9yOyAvLyBUaGlzIGlzIHRlY2huaWNhbGx5IGFuIGFjY2Vzc29yIGRlY29yYXRvciwgYnV0IHNvbWVob3cgdGhlIGNvbXBpbGVyIGRvZXNuJ3QgbGlrZSBpdCBpZiBpIGRlY2xhcmUgaXQgYXMgc3VjaC47XG59XG5cbmZ1bmN0aW9uIF9nZXRIYW5kbGVyRm9yU3RhdGVQcm9wZXJ0eShqc29uTW9kZWw6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biB7XG5cdGNvbnN0IHBhdGhJbk1vZGVsID0gYC8ke3Byb3AudG9TdHJpbmcoKX1gO1xuXHRjb25zdCBvT2JqID0gZGVlcENsb25lKGpzb25Nb2RlbC5nZXRPYmplY3QocGF0aEluTW9kZWwpKTtcblx0bGV0IG9UYXJnZXQ7XG5cdGlmICh0eXBlb2Ygb09iaiA9PT0gXCJzdHJpbmdcIikge1xuXHRcdG9UYXJnZXQgPSB7IHZhbHVlOiBvT2JqIH07XG5cdFx0b1RhcmdldC50b1N0cmluZyA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWU7XG5cdFx0fTtcblx0fSBlbHNlIGlmICh0eXBlb2Ygb09iaiA9PT0gXCJudW1iZXJcIikge1xuXHRcdG9UYXJnZXQgPSB7IHZhbHVlOiBvT2JqIH07XG5cdFx0b1RhcmdldC50b1N0cmluZyA9IGZ1bmN0aW9uICgpOiBzdHJpbmcge1xuXHRcdFx0cmV0dXJuIHRoaXMudmFsdWUudG9TdHJpbmcoKTtcblx0XHR9O1xuXHR9IGVsc2UgaWYgKHR5cGVvZiBvT2JqID09PSBcImJvb2xlYW5cIikge1xuXHRcdG9UYXJnZXQgPSBuZXcgQm9vbGVhbihvT2JqKTtcblx0fSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9PYmopKSB7XG5cdFx0b1RhcmdldCA9IG5ldyBQcm94eShvT2JqLCB7XG5cdFx0XHRnZXQodGFyZ2V0OiB1bmtub3duW10sIHA6IHN0cmluZyB8IHN5bWJvbCwgcmVjZWl2ZXI6IHVua25vd25bXSk6IHVua25vd24ge1xuXHRcdFx0XHRjb25zdCByZWYgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHAsIHJlY2VpdmVyKTtcblx0XHRcdFx0aWYgKHR5cGVvZiByZWYgPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0XHRcdHJldHVybiByZWYuYmluZCh0YXJnZXQpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHJlZiA9PT0gdW5kZWZpbmVkICYmIGlzTmFOKE51bWJlcihwLnRvU3RyaW5nKCkpKSkge1xuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRfX2JpbmRpbmdJbmZvOiB7XG5cdFx0XHRcdFx0XHRcdG1vZGVsOiBcIiRjb21wb25lbnRTdGF0ZVwiLFxuXHRcdFx0XHRcdFx0XHRwYXRoOiBwXG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gcmVmO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9IGVsc2Uge1xuXHRcdG9UYXJnZXQgPSB7IC4uLm9PYmogfTtcblx0fVxuXHRvVGFyZ2V0Ll9fYmluZGluZ0luZm8gPSB7XG5cdFx0bW9kZWw6IFwiJGNvbXBvbmVudFN0YXRlXCIsXG5cdFx0cGF0aDogcGF0aEluTW9kZWxcblx0fTtcblx0cmV0dXJuIG9UYXJnZXQ7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTdGF0ZVByb3BlcnR5KFxuXHRvYmo6IFVJNUNvbnRyb2xEZWZpbml0aW9uLFxuXHR0YXJnZXRDb250cm9sOiBDb250cm9sICYge1xuXHRcdF91cGRhdGVTdGF0ZTogRnVuY3Rpb247XG5cdFx0X3VwZGF0ZVN0YXRlRGVib3VuY2VkOiBGdW5jdGlvbjtcblx0XHRfdXBkYXRlU3RhdGVUaW1lcjogdW5rbm93bjtcblx0XHRfY2hhbmdlZFByb3BzPzogc3RyaW5nW107XG5cdH1cbik6IHZvaWQge1xuXHRpZiAob2JqLm1ldGFkYXRhPy5zdGF0ZVByb3BlcnR5KSB7XG5cdFx0Y29uc3Qgc3RhdGVNb2RlbCA9IG5ldyBKU09OTW9kZWwoe30pO1xuXHRcdHRhcmdldENvbnRyb2wuc2V0TW9kZWwoc3RhdGVNb2RlbCwgXCIkY29tcG9uZW50U3RhdGVcIik7XG5cdFx0bGV0IHVwZGF0aW5nU3RhdGUgPSBmYWxzZTtcblx0XHQvLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBmb3JjZSB0aGUgc3RhdGUgdG8gYmUgYXBwbGllZCBhbmQgd2FpdCBmb3IgaXQgdG8gYmUgYXBwbGllZCBpbiB0ZXN0c1xuXHRcdHRhcmdldENvbnRyb2wuX3VwZGF0ZVN0YXRlID0gYXN5bmMgZnVuY3Rpb24gKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3VwZGF0ZVN0YXRlVGltZXI7XG5cdFx0XHRpZiAoIXVwZGF0aW5nU3RhdGUpIHtcblx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IHRydWU7XG5cdFx0XHRcdGF3YWl0ICh0aGlzIGFzIHsgb25TdGF0ZUNoYW5nZT86IEZ1bmN0aW9uIH0pLm9uU3RhdGVDaGFuZ2U/Lih0aGlzLl9jaGFuZ2VkUHJvcHMpO1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMgPSBbXTtcblx0XHRcdFx0dXBkYXRpbmdTdGF0ZSA9IGZhbHNlO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQgPSBmdW5jdGlvbiAoY2hhbmdlZFByb3A6IHN0cmluZyk6IHZvaWQge1xuXHRcdFx0dGhpcy5fY2hhbmdlZFByb3BzID8/PSBbXTtcblx0XHRcdGlmICghdGhpcy5fY2hhbmdlZFByb3BzLmluY2x1ZGVzKGNoYW5nZWRQcm9wKSkge1xuXHRcdFx0XHR0aGlzLl9jaGFuZ2VkUHJvcHMucHVzaChjaGFuZ2VkUHJvcCk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIXRoaXMuX3VwZGF0ZVN0YXRlVGltZXIgJiYgIXVwZGF0aW5nU3RhdGUpIHtcblx0XHRcdFx0dGhpcy5fdXBkYXRlU3RhdGVUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMuX3VwZGF0ZVN0YXRlKCk7XG5cdFx0XHRcdH0sIDIwMCk7XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0Q29udHJvbCwgb2JqLm1ldGFkYXRhLnN0YXRlUHJvcGVydHksIHtcblx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gbmV3IFByb3h5KHN0YXRlTW9kZWwsIHtcblx0XHRcdFx0XHRnZXQ6ICh0YXJnZXQ6IEpTT05Nb2RlbCwgcHJvcDogc3RyaW5nKTogdW5rbm93biA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gX2dldEhhbmRsZXJGb3JTdGF0ZVByb3BlcnR5KHRhcmdldCwgcHJvcCk7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRzZXQ6IChzZXRTdGF0ZU1vZGVsOiBKU09OTW9kZWwsIHByb3AsIHZhbHVlKTogYm9vbGVhbiA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBzZXRSZXN1bHQgPSBzZXRTdGF0ZU1vZGVsLnNldFByb3BlcnR5KGAvJHtwcm9wLnRvU3RyaW5nKCl9YCwgdmFsdWUpO1xuXHRcdFx0XHRcdFx0dGFyZ2V0Q29udHJvbC5fdXBkYXRlU3RhdGVEZWJvdW5jZWQocHJvcC50b1N0cmluZygpKTtcblx0XHRcdFx0XHRcdHJldHVybiBzZXRSZXN1bHQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH0sXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuXHRcdFx0XHQvLyBSZXBsYWNpbmcgdGhlIGNvbXBsZXRlIHN0YXRlXG5cdFx0XHRcdHN0YXRlTW9kZWwuc2V0UHJvcGVydHkoYC9gLCB2YWx1ZSk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5RGVmYXVsdFZhbHVlKSB7XG5cdFx0XHR0YXJnZXRDb250cm9sW29iai5tZXRhZGF0YS5zdGF0ZVByb3BlcnR5IGFzIGtleW9mIENvbnRyb2xdID0geyAuLi5vYmoubWV0YWRhdGEuc3RhdGVQcm9wZXJ0eURlZmF1bHRWYWx1ZSB9IGFzIG5ldmVyO1xuXHRcdH1cblx0fVxufVxuXG4vKipcbiAqIEludGVybmFsIGhlYXZ5IGxpZnRpbmcgdGhhdCB3aWxsIHRha2UgY2FyZSBvZiBjcmVhdGluZyB0aGUgY2xhc3MgcHJvcGVydHkgZm9yIHVpNSB0byB1c2UuXG4gKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHByb3RvdHlwZVxuICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGNyZWF0ZVxuICogQHBhcmFtIGluT2JqIFRoZSBtZXRhZGF0YSBvYmplY3RcbiAqIEByZXR1cm5zIFRoZSBtZXRhZGF0YSBjbGFzc1xuICovXG5mdW5jdGlvbiByZWdpc3RlclVJNU1ldGFkYXRhKGNsYXp6OiBVSTVDb250cm9sQW5kTW9yZSwgbmFtZTogc3RyaW5nLCBpbk9iajogVUk1Q29udHJvbGxlckRlZmluaXRpb24gfCBVSTVDb250cm9sRGVmaW5pdGlvbik6IEZ1bmN0aW9uIHtcblx0aWYgKGNsYXp6LmdldE1ldGFkYXRhPy4oKS5pc0EoXCJzYXAudWkuY29yZS5tdmMuQ29udHJvbGxlckV4dGVuc2lvblwiKSkge1xuXHRcdE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGluT2JqKS5mb3JFYWNoKChvYmpOYW1lKSA9PiB7XG5cdFx0XHRjb25zdCBkZXNjcmlwdG9yID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihpbk9iaiwgb2JqTmFtZSk7XG5cdFx0XHRpZiAoZGVzY3JpcHRvciAmJiAhZGVzY3JpcHRvci5lbnVtZXJhYmxlKSB7XG5cdFx0XHRcdGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH1cblx0Ly8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcblx0Y29uc3Qgb2JqOiBhbnkgPSB7fTtcblx0b2JqLm1ldGFkYXRhID0gaW5PYmoubWV0YWRhdGEgfHwge307XG5cdG9iai5vdmVycmlkZSA9IGluT2JqLm92ZXJyaWRlO1xuXHRvYmouY29uc3RydWN0b3IgPSBjbGF6ejtcblx0b2JqLm1ldGFkYXRhLmJhc2VUeXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNsYXp6LnByb3RvdHlwZSkuZ2V0TWV0YWRhdGEoKS5nZXROYW1lKCk7XG5cblx0aWYgKChjbGF6ej8uZ2V0TWV0YWRhdGEoKSBhcyB1bmtub3duIGFzIHsgZ2V0U3RlcmVvdHlwZTogRnVuY3Rpb24gfSk/LmdldFN0ZXJlb3R5cGUoKSA9PT0gXCJjb250cm9sXCIpIHtcblx0XHRjb25zdCByZW5kZXJlckRlZmluaXRpb24gPSBpbk9iai5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXJlciB8fCBjbGF6ei5yZW5kZXI7XG5cdFx0b2JqLnJlbmRlcmVyID0geyBhcGlWZXJzaW9uOiAyIH07XG5cdFx0aWYgKHR5cGVvZiByZW5kZXJlckRlZmluaXRpb24gPT09IFwiZnVuY3Rpb25cIikge1xuXHRcdFx0b2JqLnJlbmRlcmVyLnJlbmRlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9IGVsc2UgaWYgKHJlbmRlcmVyRGVmaW5pdGlvbiAhPSB1bmRlZmluZWQpIHtcblx0XHRcdG9iai5yZW5kZXJlciA9IHJlbmRlcmVyRGVmaW5pdGlvbjtcblx0XHR9XG5cdH1cblx0b2JqLm1ldGFkYXRhLmludGVyZmFjZXMgPSBpbk9iai5tZXRhZGF0YT8uaW50ZXJmYWNlcyB8fCBjbGF6ei5tZXRhZGF0YT8uaW50ZXJmYWNlcztcblx0T2JqZWN0LmtleXMoY2xhenoucHJvdG90eXBlKS5mb3JFYWNoKChrZXkpID0+IHtcblx0XHRpZiAoa2V5ICE9PSBcIm1ldGFkYXRhXCIpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdG9ialtrZXldID0gY2xhenoucHJvdG90eXBlW2tleV07XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdC8vIERvIG5vdGhpbmdcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xuXG5cdGlmIChvYmoubWV0YWRhdGE/LmNvbnRyb2xsZXJFeHRlbnNpb25zICYmIE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5jb250cm9sbGVyRXh0ZW5zaW9ucykubGVuZ3RoID4gMCkge1xuXHRcdGZvciAoY29uc3QgY0V4dE5hbWUgaW4gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zKSB7XG5cdFx0XHRvYmpbY0V4dE5hbWVdID0gb2JqLm1ldGFkYXRhLmNvbnRyb2xsZXJFeHRlbnNpb25zW2NFeHROYW1lXTtcblx0XHR9XG5cdH1cblx0Y29uc3Qgb3V0cHV0ID0gY2xhenouZXh0ZW5kKG5hbWUsIG9iaikgYXMgdHlwZW9mIENvbnRyb2wgJiBGdW5jdGlvbjtcblx0Y29uc3QgZm5Jbml0ID0gb3V0cHV0LnByb3RvdHlwZS5pbml0O1xuXHRjb25zdCBmbkFmdGVySW5pdCA9IG91dHB1dC5wcm90b3R5cGUuYWZ0ZXJJbml0O1xuXHRvdXRwdXQucHJvdG90eXBlLmluaXQgPSBmdW5jdGlvbiAoLi4uYXJnczogdW5rbm93bltdKTogdm9pZCB7XG5cdFx0aWYgKGZuSW5pdCkge1xuXHRcdFx0Zm5Jbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0XHRpZiAoY2xhenoucmVnaXN0ZXJJbnN0YW5jZSkge1xuXHRcdFx0Y2xhenoucmVnaXN0ZXJJbnN0YW5jZSh0aGlzKTtcblx0XHR9XG5cdFx0dGhpcy5tZXRhZGF0YSA9IG9iai5tZXRhZGF0YTtcblxuXHRcdGlmIChvYmoubWV0YWRhdGEucHJvcGVydGllcykge1xuXHRcdFx0Y29uc3QgYVByb3BlcnR5S2V5cyA9IE9iamVjdC5rZXlzKG9iai5tZXRhZGF0YS5wcm9wZXJ0aWVzKTtcblx0XHRcdGFQcm9wZXJ0eUtleXMuZm9yRWFjaCgocHJvcGVydHlLZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgcHJvcGVydHlEZWYgPSBvYmoubWV0YWRhdGEucHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdC8vIElmIGEgdmFsdWUgd2FzIHNldCBpbiBgaW5pdGAgd2UgbmVlZCB0byBtYWtlIHN1cmUgaXQgaXMgc2V0IGluIHRoZSB2YWx1ZSBpbiB0aGUgZW5kXG5cdFx0XHRcdGNvbnN0IHByb3BlcnR5RGVmYXVsdCA9IHRoaXNbcHJvcGVydHlLZXldID8/IHByb3BlcnR5RGVmLmRlZmF1bHRWYWx1ZTtcblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmLmlzQmluZGluZ0luZm8gPT09IHRydWUpIHtcblx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllcyA/Pz0ge307XG5cblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0dGhpcy5fYmluZGluZ1Byb3BlcnRpZXNbcHJvcGVydHlLZXldID0gdjtcblx0XHRcdFx0XHRcdFx0dGhpcy5tUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSB2O1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQoKTogdW5rbm93biB7XG5cdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgY2FzZSB3ZSBuZWVkIHRvIGNvbnNpZGVyIHRoZSBwcm9wZXJ0eSBmaXJzdCBhbmQgbm90IGp1c3QgdGhlIF9iaW5kaW5nUHJvcGVydGllc1xuXHRcdFx0XHRcdFx0XHQvLyBEdXJpbmcgdGhlIGluaXRpYWxpemF0aW9uLCBpZiB0aGUgcHJvcGVydHkgaXMgc2V0IHdpdGggYSBub24gYmluZGluZyB2YWx1ZSwgc2V0UHJvcGVydHkgaXMgY2FsbGVkIGFuZCBub3QgYmluZFByb3BlcnR5XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BlcnR5VmFsdWUgPSB0aGlzLmdldFByb3BlcnR5KHByb3BlcnR5S2V5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgYmluZGluZ1Byb3BlcnR5VmFsdWUgPSB0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV07XG5cdFx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8gYSBkaWZmZXJlbnQgdmFsdWUgd2UgdXBkYXRlIHRoZSBfYmluZGluZ1Byb3BlcnRpZXNcblx0XHRcdFx0XHRcdFx0aWYgKHByb3BlcnR5VmFsdWUgJiYgcHJvcGVydHlWYWx1ZSAhPT0gYmluZGluZ1Byb3BlcnR5VmFsdWUpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLl9iaW5kaW5nUHJvcGVydGllc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eVZhbHVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNvbnN0IHByb3BWYWx1ZSA9IHRoaXMuX2JpbmRpbmdQcm9wZXJ0aWVzW3Byb3BlcnR5S2V5XTtcblx0XHRcdFx0XHRcdFx0aWYgKHR5cGVvZiBwcm9wVmFsdWUgPT09IFwib2JqZWN0XCIpIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4geyAuLi5wcm9wVmFsdWUgfTsgLy8gQ3JlYXRlIHNoYWxsb3cgY29weVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiBwcm9wVmFsdWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRcdHNldDogKHY6IHVua25vd24pID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0UHJvcGVydHkocHJvcGVydHlLZXksIHYpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eUtleSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHByb3BlcnR5RGVmYXVsdCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IHRydWU7XG5cdFx0XHRcdFx0dGhpc1twcm9wZXJ0eUtleV0gPSBwcm9wZXJ0eURlZmF1bHQ7XG5cdFx0XHRcdFx0dGhpcy5fYXBwbHlpbmdTZXR0aW5ncyA9IGZhbHNlO1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLl9hcHBseWluZ1NldHRpbmdzO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHRcdGNvbnN0IGFBZ2dyZWdhdGlvbktleXMgPSBPYmplY3Qua2V5cyhvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zKTtcblx0XHRcdGFBZ2dyZWdhdGlvbktleXMuZm9yRWFjaCgoYWdncmVnYXRpb25LZXkpID0+IHtcblx0XHRcdFx0Y29uc3QgYWdncmVnYXRpb25EZWYgPSBvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XTtcblx0XHRcdFx0Y29uc3QgZGVmYXVsdFZhbHVlID0gdGhpc1thZ2dyZWdhdGlvbktleV0gPz8gYWdncmVnYXRpb25EZWYuZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgYWdncmVnYXRpb25LZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0c2V0OiAodjogdW5rbm93bikgPT4ge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0QWdncmVnYXRpb24oYWdncmVnYXRpb25LZXksIHYpO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0Z2V0OiAoKSA9PiB7XG5cdFx0XHRcdFx0XHRjb25zdCBhZ2dyZWdhdGlvbkNvbnRlbnQgPSB0aGlzLmdldEFnZ3JlZ2F0aW9uKGFnZ3JlZ2F0aW9uS2V5KTtcblx0XHRcdFx0XHRcdGlmIChvYmoubWV0YWRhdGEuYWdncmVnYXRpb25zW2FnZ3JlZ2F0aW9uS2V5XS5tdWx0aXBsZSkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50IHx8IFtdO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFnZ3JlZ2F0aW9uQ29udGVudDtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRpZiAoZGVmYXVsdFZhbHVlICYmIChkZWZhdWx0VmFsdWUgYXMgVUk1RWxlbWVudCk/LmlzQSkge1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSB0cnVlO1xuXHRcdFx0XHRcdHRoaXNbYWdncmVnYXRpb25LZXldID0gZGVmYXVsdFZhbHVlO1xuXHRcdFx0XHRcdHRoaXMuX2FwcGx5aW5nU2V0dGluZ3MgPSBmYWxzZTtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5fYXBwbHlpbmdTZXR0aW5ncztcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0XHRjb25zdCBhQXNzb2NpYXRpb25LZXlzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLmFzc29jaWF0aW9ucyk7XG5cdFx0XHRhQXNzb2NpYXRpb25LZXlzLmZvckVhY2goKGFzc29jaWF0aW9uS2V5KSA9PiB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBhc3NvY2lhdGlvbktleSwge1xuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHRzZXQ6ICh2OiB1bmtub3duKSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRBc3NvY2lhdGlvbihhc3NvY2lhdGlvbktleSwgdik7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdGNvbnN0IGFnZ3JlZ2F0aW9uQ29udGVudCA9IHRoaXMuZ2V0QXNzb2NpYXRpb24oYXNzb2NpYXRpb25LZXkpO1xuXHRcdFx0XHRcdFx0aWYgKG9iai5tZXRhZGF0YS5hc3NvY2lhdGlvbnNbYXNzb2NpYXRpb25LZXldLm11bHRpcGxlKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBhZ2dyZWdhdGlvbkNvbnRlbnQgfHwgW107XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gYWdncmVnYXRpb25Db250ZW50O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0aWYgKG9iai5tZXRhZGF0YS5yZWZlcmVuY2VzKSB7XG5cdFx0XHRjb25zdCByZWZlcmVuY2VQcm9wZXJ0aWVzID0gT2JqZWN0LmtleXMob2JqLm1ldGFkYXRhLnJlZmVyZW5jZXMpO1xuXHRcdFx0cmVmZXJlbmNlUHJvcGVydGllcy5mb3JFYWNoKChwcm9wZXJ0eUtleSkgPT4ge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgcHJvcGVydHlLZXksIHtcblx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IGNyZWF0ZVJlZmVyZW5jZSgpXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cdFx0fVxuXHRcdGlmIChvYmoubWV0YWRhdGEubWV0aG9kcykge1xuXHRcdFx0Zm9yIChjb25zdCBtZXRob2ROYW1lIGluIG9iai5tZXRhZGF0YS5tZXRob2RzKSB7XG5cdFx0XHRcdGNvbnN0IG1ldGhvZERlZmluaXRpb24gPSBvYmoubWV0YWRhdGEubWV0aG9kc1ttZXRob2ROYW1lXTtcblx0XHRcdFx0aWYgKG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQWZ0ZXJBc3luY1wiIHx8IG1ldGhvZERlZmluaXRpb24ub3ZlcnJpZGVFeGVjdXRpb24gPT09IFwiQmVmb3JlQXN5bmNcIikge1xuXHRcdFx0XHRcdGlmICghdGhpcy5tZXRob2RIb2xkZXIpIHtcblx0XHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyID0gW107XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHRoaXMubWV0aG9kSG9sZGVyW21ldGhvZE5hbWVdID0gW3RoaXNbbWV0aG9kTmFtZV1dO1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBtZXRob2ROYW1lLCB7XG5cdFx0XHRcdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cdFx0XHRcdFx0XHRzZXQ6ICh2OiBGdW5jdGlvbikgPT4ge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5tZXRob2RIb2xkZXJbbWV0aG9kTmFtZV0ucHVzaCh2KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRnZXQ6ICgpID0+IHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIGFzeW5jICguLi5tZXRob2RBcmdzOiB1bmtub3duW10pID0+IHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBtZXRob2RBcnJheXMgPSB0aGlzLm1ldGhvZEhvbGRlclttZXRob2ROYW1lXTtcblx0XHRcdFx0XHRcdFx0XHRpZiAobWV0aG9kRGVmaW5pdGlvbi5vdmVycmlkZUV4ZWN1dGlvbiA9PT0gXCJCZWZvcmVBc3luY1wiKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRtZXRob2RBcnJheXMucmV2ZXJzZSgpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGFyZyBvZiBtZXRob2RBcnJheXMpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGF3YWl0IGFyZy5hcHBseSh0aGlzLCBtZXRob2RBcmdzKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0X2NyZWF0ZVN0YXRlUHJvcGVydHkob2JqLCB0aGlzKTtcblx0XHRpZiAoZm5BZnRlckluaXQpIHtcblx0XHRcdGZuQWZ0ZXJJbml0LmFwcGx5KHRoaXMsIGFyZ3MpO1xuXHRcdH1cblx0fTtcblxuXHRjbGF6ei5vdmVycmlkZSA9IGZ1bmN0aW9uIChvRXh0ZW5zaW9uOiB1bmtub3duKTogRnVuY3Rpb24ge1xuXHRcdGNvbnN0IHBvbCA9IHt9O1xuXHRcdChwb2wgYXMgRnVuY3Rpb24pLmNvbnN0cnVjdG9yID0gZnVuY3Rpb24gKC4uLmFyZ3M6IHVua25vd25bXSk6IEZ1bmN0aW9uIHtcblx0XHRcdHJldHVybiBjbGF6ei5hcHBseSh0aGlzLCBhcmdzKTtcblx0XHR9O1xuXHRcdGNvbnN0IG9DbGFzcyA9IChNZXRhZGF0YSBhcyB1bmtub3duIGFzIHsgY3JlYXRlQ2xhc3M6IEZ1bmN0aW9uIH0pLmNyZWF0ZUNsYXNzKFxuXHRcdFx0Y2xhenosXG5cdFx0XHRgYW5vbnltb3VzRXh0ZW5zaW9ufiR7dWlkKCl9YCxcblx0XHRcdHBvbCxcblx0XHRcdENvbnRyb2xsZXJNZXRhZGF0YVxuXHRcdCk7XG5cdFx0b0NsYXNzLmdldE1ldGFkYXRhKCkuX3N0YXRpY092ZXJyaWRlID0gb0V4dGVuc2lvbjtcblx0XHRvQ2xhc3MuZ2V0TWV0YWRhdGEoKS5fb3ZlcnJpZGUgPSAoY2xhenouZ2V0TWV0YWRhdGEoKSBhcyB7IF9vdmVycmlkZT86IHVua25vd24gfSkuX292ZXJyaWRlO1xuXHRcdHJldHVybiBvQ2xhc3M7XG5cdH07XG5cblx0T2JqZWN0UGF0aC5zZXQobmFtZSwgb3V0cHV0KTtcblxuXHRyZXR1cm4gb3V0cHV0O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7RUE4SUEsTUFBTUEsY0FBYyxHQUFHLFNBQUFBLENBQVVDLE1BQXNELEVBQWdDO0lBQ3RIQSxNQUFNLENBQUNDLFFBQVEsR0FBR0Ms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