@decaf-ts/ui-decorators 0.5.16 → 0.5.17

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.
@@ -224,6 +224,7 @@ const HTML5InputTypes = {
224
224
  SUBMIT: "submit",
225
225
  TEL: "tel",
226
226
  TEXT: "text",
227
+ TEXTAREA: 'textarea',
227
228
  TIME: "time",
228
229
  URL: UIKeys.URL,
229
230
  WEEK: "week",
@@ -300,7 +301,7 @@ function parseValueByType(type, value, fieldProps) {
300
301
  break;
301
302
  case HTML5InputTypes.DATE: {
302
303
  const format = fieldProps.format;
303
- if (value) {
304
+ if (value && `${value}`.trim().length) {
304
305
  result =
305
306
  typeof value === ReservedModels.NUMBER
306
307
  ? new Date(value)
@@ -425,6 +426,9 @@ class RenderingEngine {
425
426
  case HTML5InputTypes.PASSWORD:
426
427
  case HTML5InputTypes.TEL:
427
428
  case HTML5InputTypes.URL:
429
+ case HTML5InputTypes.SEARCH:
430
+ case HTML5InputTypes.HIDDEN:
431
+ case HTML5InputTypes.TEXTAREA:
428
432
  return ReservedModels.STRING;
429
433
  case HTML5InputTypes.NUMBER:
430
434
  return ReservedModels.NUMBER;
@@ -547,9 +551,9 @@ class RenderingEngine {
547
551
  const validationDecorators = Reflection.getAllPropertyDecorators(model, ValidationKeys.REFLECT);
548
552
  for (const key in uiDecorators) {
549
553
  const decs = uiDecorators[key];
550
- const types = Object.values(decs).filter((item) => item.key === UIKeys.PROP || item.key === UIKeys.ELEMENT);
554
+ const types = Object.values(decs).filter(({ key }) => [UIKeys.PROP, UIKeys.ELEMENT, UIKeys.CHILD].includes(key));
551
555
  if (types?.length > 1)
552
- throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop and @uielement`);
556
+ throw new RenderingError(`Only one type of decoration is allowed. Please choose between @uiprop, @uichild or @uielement`);
553
557
  decs.shift();
554
558
  decs.forEach((dec) => {
555
559
  if (!dec)
@@ -574,7 +578,7 @@ class RenderingEngine {
574
578
  Clazz = new (Model.get(clazzName))();
575
579
  }
576
580
  children = children || [];
577
- const childrenGlobalProps = Object.assign({}, globalProps || {}, {
581
+ const childrenGlobalProps = Object.assign({}, globalProps || {}, { "model": Clazz }, {
578
582
  inheritProps: dec.props,
579
583
  childOf: getPath(globalProps?.childOf, key),
580
584
  });
@@ -583,13 +587,15 @@ class RenderingEngine {
583
587
  children.push(childDefinition);
584
588
  break;
585
589
  }
590
+ case UIKeys.HIDDEN:
586
591
  case UIKeys.UILISTPROP: {
587
592
  mapper = mapper || {};
588
- mapper[dec.props?.name] = key;
593
+ if (dec.props?.name)
594
+ mapper[dec.props?.name] = key;
589
595
  const props = Object.assign({}, classDecorator.props?.item || {}, item?.props || {}, dec.props?.props || {}, globalProps);
590
596
  childProps = {
591
597
  tag: item?.tag || props.render || "",
592
- props: Object.assign({}, childProps?.props, { mapper }, props),
598
+ props: Object.assign({}, childProps?.props, dec.key === UIKeys.UILISTPROP ? { mapper } : { [dec.key]: dec.props }, props),
593
599
  };
594
600
  break;
595
601
  }
@@ -599,7 +605,7 @@ class RenderingEngine {
599
605
  const props = Object.assign({}, uiProps.props, {
600
606
  path: getPath(globalProps?.childOf, uiProps.props.name),
601
607
  childOf: undefined, // The childOf prop is passed by globalProps when it is a nested prop
602
- }, globalProps);
608
+ }, childProps?.props, globalProps);
603
609
  const childDefinition = {
604
610
  tag: uiProps.tag,
605
611
  props,
@@ -1302,14 +1308,14 @@ function uiprop(propName = undefined, stringify = false) {
1302
1308
  * Model->>RenderingEngine: Return prop name, stringify flag, and child tag override
1303
1309
  * RenderingEngine->>Component: Pass property with specified name and render with overridden tag if nested
1304
1310
  */
1305
- function uichild(clazz, tag, props = {}, serialize = false) {
1311
+ function uichild(clazz, tag, props = {}, isArray = false, serialize = false) {
1306
1312
  return (target, propertyKey) => {
1307
1313
  const metadata = {
1308
1314
  tag: tag,
1309
1315
  serialize: serialize,
1310
1316
  props: Object.assign({}, props || {}, {
1311
1317
  name: clazz || propertyKey,
1312
- }),
1318
+ }, isArray ? { customTypes: [Array.name], multiple: true } : { multiple: false }),
1313
1319
  };
1314
1320
  propMetadata(RenderingEngine.key(UIKeys.CHILD), metadata)(target, propertyKey);
1315
1321
  };
@@ -1464,7 +1470,7 @@ class EventHandler {
1464
1470
  * @const VERSION
1465
1471
  * @memberOf module:ui-decorators
1466
1472
  */
1467
- const VERSION = "0.5.16";
1473
+ const VERSION = "0.5.17";
1468
1474
 
1469
1475
  export { EventHandler, HTML5CheckTypes, HTML5DateFormat, HTML5InputTypes, RenderingEngine, RenderingError, UIKeys, VERSION, ValidatableByAttribute, ValidatableByType, escapeHtml, formatByType, generateUIModelID, hidden, hideOn, parseToNumber, parseValueByType, renderedBy, revertHtml, uichild, uielement, uihandlers, uilayout, uilayoutitem, uilistitem, uilistprop, uimodel, uiprop };
1470
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvdWkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3VpL2Vycm9ycy50cyIsIi4uL3NyYy91aS91dGlscy50cyIsIi4uL3NyYy91aS9SZW5kZXJpbmcudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvdWkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91aS9oYW5kbGVycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgYW5kIGVudW1zIGZvciBVSSByZW5kZXJpbmcgYW5kIHZhbGlkYXRpb25cbiAqIEBzdW1tYXJ5IERlZmluZXMga2V5cywgbWFwcGluZ3MsIGFuZCBIVE1MNSBpbnB1dCB0eXBlcyBmb3IgVUkgY29tcG9uZW50c1xuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgVUkgZGVjb3JhdG9ycyBsaWJyYXJ5IGZvclxuICogcmVuZGVyaW5nLCB2YWxpZGF0aW9uLCBhbmQgSFRNTCBlbGVtZW50IGdlbmVyYXRpb24uXG4gKiBAbW9kdWxlIHVpL2NvbnN0YW50c1xuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERhdGVWYWxpZGF0b3IsXG4gIERpZmZWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBFcXVhbHNWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgTGVzc1RoYW5WYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgTWF4VmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1pblZhbGlkYXRvcixcbiAgTW9kZWxLZXlzLFxuICBQYXNzd29yZFZhbGlkYXRvcixcbiAgUGF0dGVyblZhbGlkYXRvcixcbiAgUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFN0ZXBWYWxpZGF0b3IsXG4gIFVSTFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgZm9yIFVJIG1ldGFkYXRhIGFuZCByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB1c2VkIGFzIGtleXMgZm9yIFVJLXJlbGF0ZWQgbWV0YWRhdGFcbiAqIFRoZXNlIGtleXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgcmVsYXRlZCB0b1xuICogVUkgbW9kZWxzLCBlbGVtZW50cywgcHJvcGVydGllcywgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVUlLZXlzVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBCYXNlIHJlZmxlY3Rpb24ga2V5IGZvciBVSSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVJTU9ERUwgLSBLZXkgZm9yIFVJIG1vZGVsIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVOREVSRURfQlkgLSBLZXkgZm9yIHNwZWNpZnlpbmcgcmVuZGVyaW5nIGVuZ2luZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVMRU1FTlQgLSBLZXkgZm9yIGVsZW1lbnQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQUk9QIC0gS2V5IGZvciBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5BTUUgLSBLZXkgZm9yIG5hbWUgYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRV9QUkVGSVggLSBQcmVmaXggZm9yIGlucHV0IG5hbWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ1VTVE9NX1BST1BTIC0gS2V5IGZvciBjdXN0b20gdmFsaWRhdGlvbiBwcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUSVRFTSAtIEtleSBmb3IgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUUFJPUCAtIEtleSBmb3IgbGlzdCBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHR5cGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJfVFlQRSAtIEtleSBmb3Igc3VidHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEtleSBmb3IgaGlkZGVuIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZPUk1BVCAtIEtleSBmb3IgZm9ybWF0IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIC0gS2V5IGZvciByZWFkb25seSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCAtIEtleSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiAtIEtleSBmb3IgbWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCAtIEtleSBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCAtIEtleSBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCAtIEtleSBmb3IgbWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gLSBLZXkgZm9yIHBhdHRlcm4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIEtleSBmb3IgVVJMIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIC0gS2V5IGZvciBzdGVwIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gS2V5IGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEtleSBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gS2V5IGZvciBwYXNzd29yZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUxTIC0gS2V5IGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIEtleSBmb3IgZGlmZmVyZW5jZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gS2V5IGZvciBsZXNzIHRoYW4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IExFU1NfVEhBTl9PUl9FUVVBTCAtIEtleSBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gS2V5IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBVSUtleXNcbiAqIEB0eXBlIHtVSUtleXNUeXBlfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFVJS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9LnVpLmAsXG4gIFVJTU9ERUw6IFwidWltb2RlbFwiLFxuICBSRU5ERVJFRF9CWTogXCJyZW5kZXJlZC1ieVwiLFxuICBFTEVNRU5UOiBcImVsZW1lbnRcIixcbiAgUFJPUDogXCJwcm9wXCIsXG4gIENISUxEOiBcImNoaWxkXCIsXG4gIE5BTUU6IFwibmFtZVwiLFxuICBOQU1FX1BSRUZJWDogXCJpbnB1dC1cIixcbiAgQ1VTVE9NX1BST1BTOiBcImN1c3RvbVZhbGlkYXRpb25Qcm9wc1wiLFxuXG4gIFVJTElTVElURU06IFwidWlsaXN0aXRlbVwiLFxuICBVSUxJU1RQUk9QOiBcImxpc3Rwcm9wXCIsXG4gIFVJTEFZT1VUOiBcInVpbGF5b3V0XCIsXG4gIFVJTEFZT1VUSVRFTTogXCJ1aWxheW91dGl0ZW1cIixcbiAgSEFORExFUlM6IFwiaGFuZGxlcnNcIixcblxuICBUWVBFOiBcInR5cGVcIixcbiAgU1VCX1RZUEU6IFwic3VidHlwZVwiLFxuXG4gIEhJRERFTjogXCJoaWRkZW5cIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuXG4gIFJFQURfT05MWTogXCJyZWFkb25seVwiLFxuICBSRVFVSVJFRDogVmFsaWRhdGlvbktleXMuUkVRVUlSRUQsXG4gIE1JTjogVmFsaWRhdGlvbktleXMuTUlOLFxuICBNSU5fTEVOR1RIOiBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RILFxuICBNQVg6IFZhbGlkYXRpb25LZXlzLk1BWCxcbiAgTUFYX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCxcbiAgUEFUVEVSTjogVmFsaWRhdGlvbktleXMuUEFUVEVSTixcbiAgVVJMOiBWYWxpZGF0aW9uS2V5cy5VUkwsXG4gIFNURVA6IFZhbGlkYXRpb25LZXlzLlNURVAsXG4gIERBVEU6IFZhbGlkYXRpb25LZXlzLkRBVEUsXG4gIEVNQUlMOiBWYWxpZGF0aW9uS2V5cy5FTUFJTCxcbiAgUEFTU1dPUkQ6IFZhbGlkYXRpb25LZXlzLlBBU1NXT1JELFxuICBFUVVBTFM6IFZhbGlkYXRpb25LZXlzLkVRVUFMUyxcbiAgRElGRjogVmFsaWRhdGlvbktleXMuRElGRixcbiAgTEVTU19USEFOOiBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4sXG4gIExFU1NfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMLFxuICBHUkVBVEVSX1RIQU46IFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGlucHV0IHR5cGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBzcGVjaWFsIGlucHV0IHR5cGVzIHRvIHRoZWlyIHZhbGlkYXRvciBjbGFzc2VzXG4gKiBUaGlzIGNvbnN0YW50IG1hcHMgaW5wdXQgdHlwZXMgbGlrZSBlbWFpbCwgVVJMLCBkYXRlLCBhbmQgcGFzc3dvcmQgdG8gdGhlaXJcbiAqIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yIGNsYXNzZXMgZnJvbSB0aGUgZGVjb3JhdG9yLXZhbGlkYXRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+fSBWYWxpZGF0YWJsZUJ5VHlwZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxFbWFpbFZhbGlkYXRvcj59IGVtYWlsIC0gVmFsaWRhdG9yIGZvciBlbWFpbCBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8VVJMVmFsaWRhdG9yPn0gdXJsIC0gVmFsaWRhdG9yIGZvciBVUkwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPERhdGVWYWxpZGF0b3I+fSBkYXRlIC0gVmFsaWRhdG9yIGZvciBkYXRlIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxQYXNzd29yZFZhbGlkYXRvcj59IHBhc3N3b3JkIC0gVmFsaWRhdG9yIGZvciBwYXNzd29yZCBpbnB1dHNcbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeVR5cGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5VHlwZU1hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0YWJsZUJ5VHlwZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuRU1BSUxdOiBFbWFpbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5VUkxdOiBVUkxWYWxpZGF0b3IsXG4gIFtVSUtleXMuREFURV06IERhdGVWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFTU1dPUkRdOiBQYXNzd29yZFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIEhUTUwgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIGxpa2UgcmVxdWlyZWQsIG1pbiwgbWF4LCBwYXR0ZXJuLCBldGMuXG4gKiB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeUF0dHJpYnV0ZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxSZXF1aXJlZFZhbGlkYXRvcj59IHJlcXVpcmVkIC0gVmFsaWRhdG9yIGZvciByZXF1aXJlZCBmaWVsZHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluVmFsaWRhdG9yPn0gbWluIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heFZhbGlkYXRvcj59IG1heCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxTdGVwVmFsaWRhdG9yPn0gc3RlcCAtIFZhbGlkYXRvciBmb3Igc3RlcCB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNaW5MZW5ndGhWYWxpZGF0b3I+fSBtaW5sZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1pbmltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heExlbmd0aFZhbGlkYXRvcj59IG1heGxlbmd0aCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGF0dGVyblZhbGlkYXRvcj59IHBhdHRlcm4gLSBWYWxpZGF0b3IgZm9yIHJlZ2V4IHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RXF1YWxzVmFsaWRhdG9yPn0gZXF1YWxzIC0gVmFsaWRhdG9yIGZvciBlcXVhbGl0eVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEaWZmVmFsaWRhdG9yPn0gZGlmZiAtIFZhbGlkYXRvciBmb3IgZGlmZmVyZW5jZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhblZhbGlkYXRvcj59IGxlc3N0aGFuIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBsZXNzdGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGxlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuVmFsaWRhdG9yPn0gZ3JlYXRlcnRoYW4gLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFub3JlcXVhbCAtIFZhbGlkYXRvciBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZVxuICogQHR5cGUge1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuUkVRVUlSRURdOiBSZXF1aXJlZFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5dOiBNaW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYXTogTWF4VmFsaWRhdG9yLFxuICBbVUlLZXlzLlNURVBdOiBTdGVwVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1JTl9MRU5HVEhdOiBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYX0xFTkdUSF06IE1heExlbmd0aFZhbGlkYXRvcixcbiAgW1VJS2V5cy5QQVRURVJOXTogUGF0dGVyblZhbGlkYXRvcixcbiAgW1VJS2V5cy5FUVVBTFNdOiBFcXVhbHNWYWxpZGF0b3IsXG4gIFtVSUtleXMuRElGRl06IERpZmZWYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOXTogTGVzc1RoYW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOX09SX0VRVUFMXTogTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl06IEdyZWF0ZXJUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIGRhdGUgZm9ybWF0IHN0cmluZyBmb3IgSFRNTDUgZGF0ZSBpbnB1dHNcbiAqIEBzdW1tYXJ5IEZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzICh5eXl5LU1NLWRkKVxuICogVGhpcyBjb25zdGFudCBkZWZpbmVzIHRoZSBzdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgdXNlZCBmb3IgSFRNTDUgZGF0ZSBpbnB1dHMuXG4gKlxuICogQGNvbnN0IEhUTUw1RGF0ZUZvcm1hdFxuICogQHR5cGUge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNURhdGVGb3JtYXQgPSBcInl5eXktTU0tZGRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiBIVE1MNSBpbnB1dCB0eXBlIHZhbHVlc1xuICogQHN1bW1hcnkgTWFwcyBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXNcbiAqIFRoaXMgY29uc3RhbnQgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGlucHV0IHR5cGUgY29uc3RhbnRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIEhUTUwgYXR0cmlidXRlIHZhbHVlcyBmb3IgdXNlIGluIGZvcm0gZWxlbWVudHMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gSFRNTDVJbnB1dFR5cGVzTWFwXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQlVUVE9OIC0gQnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDSEVDS0JPWCAtIENoZWNrYm94IGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDT0xPUiAtIENvbG9yIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSAtIERhdGUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFVElNRV9MT0NBTCAtIExvY2FsIGRhdGV0aW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRU1BSUwgLSBFbWFpbCBpbnB1dCB0eXBlIHdpdGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZJTEUgLSBGaWxlIHVwbG9hZCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gSGlkZGVuIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTUFHRSAtIEltYWdlIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT05USCAtIE1vbnRoIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIC0gTnVtZXJpYyBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBQYXNzd29yZCBpbnB1dCB0eXBlIHdpdGggbWFza2VkIHRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSQURJTyAtIFJhZGlvIGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFOR0UgLSBSYW5nZSBzbGlkZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFU0VUIC0gRm9ybSByZXNldCBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFQVJDSCAtIFNlYXJjaCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1VCTUlUIC0gRm9ybSBzdWJtaXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURUwgLSBUZWxlcGhvbmUgbnVtYmVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURVhUIC0gQmFzaWMgdGV4dCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRSAtIFRpbWUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgLSBVUkwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBXRUVLIC0gV2VlayBwaWNrZXIgaW5wdXQgdHlwZVxuICpcbiAqIEBjb25zdCBIVE1MNUlucHV0VHlwZXNcbiAqIEB0eXBlIHtIVE1MNUlucHV0VHlwZXNNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVJbnB1dFR5cGVzID0ge1xuICBCVVRUT046IFwiYnV0dG9uXCIsXG4gIENIRUNLQk9YOiBcImNoZWNrYm94XCIsXG4gIENPTE9SOiBcImNvbG9yXCIsXG4gIERBVEU6IFVJS2V5cy5EQVRFLFxuICBEQVRFVElNRV9MT0NBTDogXCJkYXRldGltZS1sb2NhbFwiLFxuICBFTUFJTDogVUlLZXlzLkVNQUlMLFxuICBGSUxFOiBcImZpbGVcIixcbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBJTUFHRTogXCJpbWFnZVwiLFxuICBNT05USDogXCJtb250aFwiLFxuICBOVU1CRVI6IFwibnVtYmVyXCIsXG4gIFBBU1NXT1JEOiBVSUtleXMuUEFTU1dPUkQsXG4gIFJBRElPOiBcInJhZGlvXCIsXG4gIFJBTkdFOiBcInJhbmdlXCIsXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIFNFQVJDSDogXCJzZWFyY2hcIixcbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICBURUw6IFwidGVsXCIsXG4gIFRFWFQ6IFwidGV4dFwiLFxuICBUSU1FOiBcInRpbWVcIixcbiAgVVJMOiBVSUtleXMuVVJMLFxuICBXRUVLOiBcIndlZWtcIixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgdXNlIGNoZWNrYm94ZXNcbiAqIEBzdW1tYXJ5IExpc3Qgb2YgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnQgY2hlY2thYmxlIGNvbnRyb2xzXG4gKiBUaGlzIGNvbnN0YW50IGRlZmluZXMgYW4gYXJyYXkgb2YgSFRNTDUgaW5wdXQgdHlwZXMgdGhhdCByZXByZXNlbnRcbiAqIGNoZWNrYWJsZSBjb250cm9scyAoY2hlY2tib3ggYW5kIHJhZGlvKS5cbiAqXG4gKiBAY29uc3QgSFRNTDVDaGVja1R5cGVzXG4gKiBAdHlwZSB7c3RyaW5nW119XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVDaGVja1R5cGVzID0gW1xuICBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1gsXG4gIEhUTUw1SW5wdXRUeXBlcy5SQURJTyxcbl07XG4iLCJpbXBvcnQgeyBCYXNlRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRXJyb3IgdGhyb3duIHdoZW4gYSByZW5kZXJpbmcgb3BlcmF0aW9uIGZhaWxzXG4gKiBAc3VtbWFyeSBTcGVjaWFsaXplZCBlcnJvciBmb3IgcmVuZGVyaW5nIGZhaWx1cmVzIGluIFVJIGNvbXBvbmVudHNcbiAqIFRoaXMgZXJyb3IgaXMgdGhyb3duIHdoZW4gdGhlIHJlbmRlcmluZyBlbmdpbmUgZW5jb3VudGVycyBhbiBlcnJvciB3aGlsZVxuICogYXR0ZW1wdGluZyB0byByZW5kZXIgYSBVSSBjb21wb25lbnQgb3IgbW9kZWwuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFcnJvclxuICogQGV4dGVuZHMgQmFzZUVycm9yXG4gKiBAY2F0ZWdvcnkgRXJyb3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFRocm93aW5nIGEgcmVuZGVyaW5nIGVycm9yXG4gKiB0cnkge1xuICogICAvLyBSZW5kZXJpbmcgY29kZSB0aGF0IG1pZ2h0IGZhaWxcbiAqICAgaWYgKCFjb21wb25lbnQuY2FuUmVuZGVyKCkpIHtcbiAqICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoJ0NvbXBvbmVudCBjYW5ub3QgYmUgcmVuZGVyZWQnKTtcbiAqICAgfVxuICogfSBjYXRjaCAoZXJyb3IpIHtcbiAqICAgY29uc29sZS5lcnJvcignUmVuZGVyaW5nIGZhaWxlZDonLCBlcnJvci5tZXNzYWdlKTtcbiAqIH1cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlcmluZ0Vycm9yIGV4dGVuZHMgQmFzZUVycm9yIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGEgbmV3IFJlbmRlcmluZ0Vycm9yIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIHRoZSBlcnJvciB3aXRoIGEgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKiBAcGFyYW0ge3N0cmluZ3xFcnJvcn0gbXNnIFRoZSBlcnJvciBtZXNzYWdlIG9yIG9yaWdpbmFsIGVycm9yXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihtc2c6IHN0cmluZyB8IEVycm9yKSB7XG4gICAgc3VwZXIoUmVuZGVyaW5nRXJyb3IubmFtZSwgbXNnKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgZm9ybWF0RGF0ZSxcbiAgTW9kZWwsXG4gIHBhcnNlRGF0ZSxcbiAgUmVzZXJ2ZWRNb2RlbHMsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7IEhUTUw1RGF0ZUZvcm1hdCwgSFRNTDVJbnB1dFR5cGVzLCBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IGZpbmRNb2RlbElkLCBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBGaWVsZFByb3BlcnRpZXMgfSBmcm9tIFwiLi90eXBlc1wiO1xuXG4vKipcbiAqIEBmdW5jdGlvbiBmb3JtYXRCeVR5cGVcbiAqXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ5VHlwZShcbiAgdHlwZTogYW55LFxuICB2YWx1ZTogYW55LFxuICAuLi5hcmdzOiB1bmtub3duW11cbik6IHN0cmluZyB8IG51bWJlciB7XG4gIGlmICh0eXBlID09PSBVSUtleXMuREFURSkge1xuICAgIGlmKCF2YWx1ZSlcbiAgICAgICAgcmV0dXJuIFwiXCI7XG4gICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgPSAoYXJncy5zaGlmdCgpIGFzIHN0cmluZykgfHwgSFRNTDVEYXRlRm9ybWF0O1xuICAgIHJldHVybiBmb3JtYXREYXRlKG5ldyBEYXRlKHZhbHVlKSwgZm9ybWF0KTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVZhbHVlQnlUeXBlKFxuICB0eXBlOiBzdHJpbmcsXG4gIHZhbHVlOiBzdHJpbmcgfCBudW1iZXIsXG4gIGZpZWxkUHJvcHM6IEZpZWxkUHJvcGVydGllc1xuKTogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB7XG4gIGxldCByZXN1bHQ6IHN0cmluZyB8IG51bWJlciB8IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gIHN3aXRjaCAodHlwZSkge1xuICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjpcbiAgICAgIHJlc3VsdCA9IHBhcnNlVG9OdW1iZXIodmFsdWUpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuREFURToge1xuICAgICAgY29uc3QgZm9ybWF0OiBzdHJpbmcgfCB1bmRlZmluZWQgPSBmaWVsZFByb3BzLmZvcm1hdDtcbiAgICAgIGlmKHZhbHVlKSB7XG4gICAgICAgIHJlc3VsdCA9XG4gICAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5OVU1CRVJcbiAgICAgICAgICAgID8gbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHZhbHVlXG4gICAgICAgICAgICAgID8gZm9ybWF0XG4gICAgICAgICAgICAgICAgPyBwYXJzZURhdGUoZm9ybWF0LCB2YWx1ZSlcbiAgICAgICAgICAgICAgICA6IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmVzdWx0ID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5TVFJJTkdcbiAgICAgICAgICA/IGVzY2FwZUh0bWwodmFsdWUgYXMgc3RyaW5nKVxuICAgICAgICAgIDogcmVzdWx0O1xuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHBhcnNlIHZhbHVlIG9mIHR5cGUgJHt0eXBlfSBmcm9tICR7dHlwZW9mIHZhbHVlfSAtICR7dmFsdWV9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9OdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICFpc05hTih2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIWlzTmFOKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3QgdGFnc1RvUmVwbGFjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBcIiZcIjogXCImYW1wO1wiLFxuICAgIFwiPFwiOiBcIiZsdDtcIixcbiAgICBcIj5cIjogXCImZ3Q7XCIsXG4gIH07XG4gIHJldHVybiBgJHt2YWx1ZX1gLnJlcGxhY2UoL1smPD5dL2csICh0YWcpID0+IHtcbiAgICByZXR1cm4gdGFnc1RvUmVwbGFjZVt0YWddIHx8IHRhZztcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnRIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgdGFnc1RvUmVwbGFjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBcIiZhbXA7XCI6IFwiJlwiLFxuICAgIFwiJmx0O1wiOiBcIjxcIixcbiAgICBcIiZndDtcIjogXCI+XCIsXG4gIH07XG5cbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvJmx0O3wmZ3Q7fCZhbXA7L2csICh0YWcpID0+IHtcbiAgICByZXR1cm4gdGFnc1RvUmVwbGFjZVt0YWddIHx8IHRhZztcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVVJTW9kZWxJRDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIGxldCBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB0cnkge1xuICAgIGlkID0gZmluZE1vZGVsSWQobW9kZWwpIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZCA9IERhdGUubm93KCk7XG4gIH1cbiAgY29uc3QgbmFtZSA9IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHJldHVybiBgJHtuYW1lfS0ke2lkfWA7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFJlc2VydmVkTW9kZWxzLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBIVE1MNURhdGVGb3JtYXQsXG4gIEhUTUw1SW5wdXRUeXBlcyxcbiAgVUlLZXlzLFxuICBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlLFxuICBWYWxpZGF0YWJsZUJ5VHlwZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBGaWVsZERlZmluaXRpb24sXG4gIEZpZWxkUHJvcGVydGllcyxcbiAgVUlDbGFzc01ldGFkYXRhLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMYXlvdXRJdGVtTWV0YWRhdGEsXG4gIFVJTGlzdEl0ZW1FbGVtZW50TWV0YWRhdGEsXG4gIFVJTW9kZWxNZXRhZGF0YSxcbiAgVUlQcm9wTWV0YWRhdGEsXG59IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFcnJvciB9IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IGZvcm1hdEJ5VHlwZSwgZ2VuZXJhdGVVSU1vZGVsSUQgfSBmcm9tIFwiLi91dGlsc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBYnN0cmFjdCBjbGFzcyBmb3IgcmVuZGVyaW5nIFVJIGNvbXBvbmVudHMgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGEuXG4gKiBAc3VtbWFyeSBUaGUgUmVuZGVyaW5nRW5naW5lIGNsYXNzIHByb3ZpZGVzIGEgZnJhbWV3b3JrIGZvciBjb252ZXJ0aW5nIG1vZGVsIG1ldGFkYXRhIGludG8gVUkgZmllbGQgZGVmaW5pdGlvbnMuXG4gKiBJdCBoYW5kbGVzIHRoZSB0cmFuc2xhdGlvbiBvZiBtb2RlbCBwcm9wZXJ0aWVzIHRvIFVJIGVsZW1lbnRzLCBhcHBsaWVzIHZhbGlkYXRpb24gcnVsZXMsIGFuZCBtYW5hZ2VzIGRpZmZlcmVudCByZW5kZXJpbmcgZmxhdm9ycy5cbiAqIFRoaXMgY2xhc3MgaXMgZGVzaWduZWQgdG8gYmUgZXh0ZW5kZWQgYnkgc3BlY2lmaWMgcmVuZGVyaW5nIGltcGxlbWVudGF0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSBvZiB0aGUgcmVuZGVyaW5nIHJlc3VsdCwgZGVmYXVsdHMgdG8gdm9pZFxuICogQHRlbXBsYXRlIFIgVGhlIHR5cGUgb2YgdGhlIGZpZWxkIGRlZmluaXRpb24sIGRlZmF1bHRzIHRvIEZpZWxkRGVmaW5pdGlvbjxUPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRW5naW5lXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJpbmdFbmdpbmU8VCA9IHZvaWQsIFIgPSBGaWVsZERlZmluaXRpb248VD4+IHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDYWNoZSBmb3Igc3RvcmluZyByZW5kZXJpbmcgZW5naW5lIGluc3RhbmNlcyBvciBjb25zdHJ1Y3RvcnMuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGNhY2hlOiBSZWNvcmQ8XG4gICAgc3RyaW5nLFxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGN1cnJlbnQ6XG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj47XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZW5kZXJpbmcgZW5naW5lIGhhcyBiZWVuIGluaXRpYWxpemVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGluaXRpYWxpemVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgcHJvdGVjdGVkIGNvbnN0cnVjdG9yKHJlYWRvbmx5IGZsYXZvdXI6IHN0cmluZykge1xuICAgIFJlbmRlcmluZ0VuZ2luZS5yZWdpc3Rlcih0aGlzKTtcbiAgICBjb25zb2xlLmxvZyhgZGVjYWYncyAke2ZsYXZvdXJ9IHJlbmRlcmluZyBlbmdpbmUgbG9hZGVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEluaXRpYWxpemVzIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyBmb3Igc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gbG9naWMuXG4gICAqXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgbmVlZGVkIGZvciBpbml0aWFsaXphdGlvbi5cbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gaW5pdGlhbGl6YXRpb24gaXMgY29tcGxldGUuXG4gICAqXG4gICAqIEBhYnN0cmFjdFxuICAgKi9cbiAgYWJzdHJhY3QgaW5pdGlhbGl6ZSguLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUcmFuc2xhdGVzIGJldHdlZW4gbW9kZWwgdHlwZXMgYW5kIEhUTUwgaW5wdXQgdHlwZXMuXG4gICAqIEBzdW1tYXJ5IENvbnZlcnRzIG1vZGVsIGRhdGEgdHlwZXMgdG8gYXBwcm9wcmlhdGUgSFRNTCBpbnB1dCB0eXBlcyBhbmQgdmljZSB2ZXJzYS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gdHJhbnNsYXRlLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFt0b1ZpZXc9dHJ1ZV0gLSBEaXJlY3Rpb24gb2YgdHJhbnNsYXRpb24gKHRydWUgZm9yIG1vZGVsIHRvIHZpZXcsIGZhbHNlIGZvciB2aWV3IHRvIG1vZGVsKS5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHRyYW5zbGF0ZWQgdHlwZS5cbiAgICovXG4gIHRyYW5zbGF0ZShrZXk6IHN0cmluZywgdG9WaWV3OiBib29sZWFuID0gdHJ1ZSk6IHN0cmluZyB7XG4gICAgaWYgKHRvVmlldykge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5TVFJJTkc6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5URVhUO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLk5VTUJFUjpcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CSUdJTlQ6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQk9PTEVBTjpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkRBVEU6XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5EQVRFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URVhUOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5FTUFJTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ09MT1I6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlBBU1NXT1JEOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5URUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlVSTDpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLkJPT0xFQU47XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEVUSU1FX0xPQ0FMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5USU1FOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5EQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgY2xhc3MgZGVjb3JhdG9yIG1ldGFkYXRhIGZvciBhIG1vZGVsIGluc3RhbmNlXG4gICAqIEBzdW1tYXJ5IEV4dHJhY3RzIFVJLXJlbGF0ZWQgY2xhc3MgZGVjb3JhdG9ycyBmcm9tIGEgbW9kZWwgYW5kIHJldHVybnMgdGhlbSBhcyBhbiBhcnJheVxuICAgKiBUaGlzIG1ldGhvZCBjb2xsZWN0cyBtZXRhZGF0YSBmcm9tIHZhcmlvdXMgVUkgY2xhc3MgZGVjb3JhdG9ycyBpbmNsdWRpbmcgQHVpbW9kZWwsXG4gICAqIEB1aWxpc3RpdGVtLCBAdWloYW5kbGVycywgYW5kIEB1aWxheW91dCBhcHBsaWVkIHRvIHRoZSBtb2RlbCBjbGFzcy5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBleHRyYWN0IG1ldGFkYXRhIGZyb21cbiAgICogQHJldHVybnMge1VJQ2xhc3NNZXRhZGF0YVtdfSBBcnJheSBvZiBVSSBjbGFzcyBtZXRhZGF0YSBvYmplY3RzXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIGdldENsYXNzRGVjb3JhdG9yc01ldGFkYXRhPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pOiBVSUNsYXNzTWV0YWRhdGFbXSAge1xuICAgIHJldHVybiBbXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSU1PREVMKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTU9ERUwpLFxuICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUSVRFTSksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSxcbiAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgKSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgKSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTEFZT1VUKSxcbiAgICAgICAgbW9kZWwuY29uc3RydWN0b3JcbiAgICAgICkgfHxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTEFZT1VUKSxcbiAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgKSxcbiAgICBdLmZpbHRlcihCb29sZWFuKTs7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgaXRzIG5hdHVyZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdHlwZSB0aGF0IGlzIGluaGVyZW50bHkgdmFsaWRhdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgVUkga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZGF0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeVR5cGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeVR5cGUpLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENoZWNrcyBpZiBhIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVUkga2V5IHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHRoYXQgY2FuIGJlIGFwcGxpZWQgYXMgYW4gYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIHZhbGlkYXRpb24gbWV0YWRhdGEgdG8gYW4gYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAc3VtbWFyeSBUcmFuc2Zvcm1zIHZhbGlkYXRpb24gbWV0YWRhdGEgaW50byBhIHZhbHVlIHN1aXRhYmxlIGZvciB1c2UgYXMgYW4gSFRNTCBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgdmFsaWRhdGlvbiBrZXkuXG4gICAqIEBwYXJhbSB7VmFsaWRhdGlvbk1ldGFkYXRhfSB2YWx1ZSAtIFRoZSB2YWxpZGF0aW9uIG1ldGFkYXRhLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbn0gVGhlIGNvbnZlcnRlZCBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgZ2l2ZW4ga2V5IGlzIG5vdCB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUuXG4gICAqL1xuICBwcm90ZWN0ZWQgdG9BdHRyaWJ1dGVWYWx1ZShcbiAgICBrZXk6IHN0cmluZyxcbiAgICB2YWx1ZTogVmFsaWRhdGlvbk1ldGFkYXRhXG4gICk6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4ge1xuICAgIGlmICghT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuaW5jbHVkZXMoa2V5KSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgYXR0cmlidXRlIGtleSBcIiR7a2V5fVwiLiBFeHBlY3RlZCBvbmUgb2Y6ICR7T2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuam9pbihcIiwgXCIpfS5gXG4gICAgICApO1xuXG4gICAgcmV0dXJuIGtleSA9PT0gVUlLZXlzLlJFUVVJUkVEID8gdHJ1ZSA6IHZhbHVlW2tleV07XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENvbnZlcnRzIGEgbW9kZWwgdG8gYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKiBAc3VtbWFyeSBQcm9jZXNzZXMgYSBtb2RlbCBpbnN0YW5jZSwgZXh0cmFjdGluZyBVSS1yZWxhdGVkIG1ldGFkYXRhIGFuZCB2YWxpZGF0aW9uIHJ1bGVzIHRvIGNyZWF0ZSBhIGZpZWxkIGRlZmluaXRpb24uXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBUIFR5cGUgcmVmZXJlbmNpbmcgdGhlIHNwZWNpZmljIFJlbmRlcmluZyBlbmdpbmUgZmllbGQgcHJvcGVydGllcy9pbnB1dHNcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCBpbnN0YW5jZSB0byBjb252ZXJ0LlxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBbZ2xvYmFsUHJvcHM9e31dIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYXBwbHkgdG8gYWxsIGNoaWxkIGVsZW1lbnRzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtnZW5lcmF0ZUlkPXRydWVdIC0gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcG9wdWxhdGUgdGhlIHJlbmRlcmVySWQgcHJvcGVydHkuXG4gICAqIEByZXR1cm5zIHtGaWVsZERlZmluaXRpb248VD59IEEgZmllbGQgZGVmaW5pdGlvbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBVSSBzdHJ1Y3R1cmUgb2YgdGhlIG1vZGVsLlxuICAgKiBAdGhyb3dzIHtSZW5kZXJpbmdFcnJvcn0gSWYgbm8gVUkgZGVmaW5pdGlvbnMgYXJlIHNldCBmb3IgdGhlIG1vZGVsIG9yIGlmIHRoZXJlIGFyZSBpbnZhbGlkIGRlY29yYXRvcnMuXG4gICAqXG4gICAqIEBtZXJtYWlkXG4gICAqIHNlcXVlbmNlRGlhZ3JhbVxuICAgKiAgcGFydGljaXBhbnQgQyBhcyBDbGllbnRcbiAgICogIHBhcnRpY2lwYW50IFJFIGFzIFJlbmRlcmluZ0VuZ2luZVxuICAgKiAgcGFydGljaXBhbnQgUiBhcyBSZWZsZWN0aW9uXG4gICAqICBwYXJ0aWNpcGFudCBNIGFzIE1vZGVsXG4gICAqICBDLT4+UkU6IHRvRmllbGREZWZpbml0aW9uKG1vZGVsLCBnbG9iYWxQcm9wcylcbiAgICogIFJFLT4+UjogZ2V0TWV0YWRhdGEoVUlLZXlzLlVJTU9ERUwsIG1vZGVsLmNvbnN0cnVjdG9yKVxuICAgKiAgUi0tPj5SRTogVUlNb2RlbE1ldGFkYXRhXG4gICAqICBSRS0+PlI6IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpXG4gICAqICBSLS0+PlJFOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPlxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1QpXG4gICAqICBSLS0+PlJFOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+XG4gICAqICBsb29wIEZvciBlYWNoIHByb3BlcnR5XG4gICAqICAgIFJFLT4+UkU6IFByb2Nlc3MgVUkgZGVjb3JhdG9yc1xuICAgKiAgICBSRS0+PlJFOiBBcHBseSB2YWxpZGF0aW9uIHJ1bGVzXG4gICAqICBlbmRcbiAgICogIFJFLS0+PkM6IEZpZWxkRGVmaW5pdGlvbjxUPlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvRmllbGREZWZpbml0aW9uPE0gZXh0ZW5kcyBNb2RlbD4oXG4gICAgbW9kZWw6IE0sXG4gICAgZ2xvYmFsUHJvcHM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30sXG4gICAgZ2VuZXJhdGVJZDogYm9vbGVhbiA9IHRydWVcbiAgKTogRmllbGREZWZpbml0aW9uPFQ+IHtcbiAgICBcbiAgICBjb25zdCB7IGluaGVyaXRQcm9wcywgLi4uZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHMgfSA9IGdsb2JhbFByb3BzO1xuICAgIGdsb2JhbFByb3BzID0gZ2xvYmFsUHJvcHNXaXRob3V0SW5oZXJpdHM7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvcnMgPSB0aGlzLmdldENsYXNzRGVjb3JhdG9yc01ldGFkYXRhPE0+KG1vZGVsKTtcblxuICAgIGlmICghY2xhc3NEZWNvcmF0b3JzLmxlbmd0aClcbiAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihcbiAgICAgICAgYE5vIHVpIGRlZmluaXRpb25zIHNldCBmb3IgbW9kZWwgJHttb2RlbC5jb25zdHJ1Y3Rvci5uYW1lfS4gRGlkIHlvdSB1c2UgQHVpbW9kZWw/YFxuICAgICAgKTtcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9yID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHt9LFxuICAgICAgLi4uY2xhc3NEZWNvcmF0b3JzLFxuICAgICAgaW5oZXJpdFByb3BzID8gaW5oZXJpdFByb3BzIDoge30gLy8gb3ZlcnJpZGUgdGFnIGFuZCBwcm9wZXJ0aWVzIHdoZW4gaXQgaXMgYSBjb21wb25lbnQgdGhhdCBzaG91bGQgaW5oZXJpdCBwcm9wZXJ0aWVzIGZyb20gaXRzIHBhcmVudC5cbiAgICApO1xuICAgIGNvbnN0IHsgdGFnLCBwcm9wcywgaXRlbSwgaGFuZGxlcnMgfSA9IGNsYXNzRGVjb3JhdG9yO1xuXG4gICAgY29uc3QgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YVtdPiA9XG4gICAgICBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVUlLZXlzLlJFRkxFQ1QpIGFzIFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBEZWNvcmF0b3JNZXRhZGF0YVtdXG4gICAgICA+O1xuICAgIGxldCBjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+W10gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGNoaWxkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSBpdGVtPy5wcm9wcyB8fCB7fTtcbiAgICBsZXQgbWFwcGVyOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgY29uc3QgZ2V0UGF0aCA9IChwYXJlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZCwgcHJvcDogc3RyaW5nKSA9PiB7XG4gICAgICByZXR1cm4gcGFyZW50ID8gW3BhcmVudCwgcHJvcF0uam9pbihcIi5cIikgOiBwcm9wO1xuICAgIH07XG5cbiAgICBpZiAodWlEZWNvcmF0b3JzKSB7XG4gICAgICBjb25zdCB2YWxpZGF0aW9uRGVjb3JhdG9yczogUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXVxuICAgICAgPiA9IFJlZmxlY3Rpb24uZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgICBtb2RlbCxcbiAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVFxuICAgICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10+O1xuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB1aURlY29yYXRvcnNba2V5XTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKGRlY3MpLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5rZXkgPT09IFVJS2V5cy5QUk9QIHx8IGl0ZW0ua2V5ID09PSBVSUtleXMuRUxFTUVOVFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZXM/Lmxlbmd0aCA+IDEpXG4gICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgYE9ubHkgb25lIHR5cGUgb2YgZGVjb3JhdGlvbiBpcyBhbGxvd2VkLiBQbGVhc2UgY2hvb3NlIGJldHdlZW4gQHVpcHJvcCBhbmQgQHVpZWxlbWVudGBcbiAgICAgICAgICApO1xuICAgICAgICBkZWNzLnNoaWZ0KCk7XG4gICAgICAgIGRlY3MuZm9yRWFjaCgoZGVjKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWMpIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgTm8gZGVjb3JhdG9yIGZvdW5kYCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGRlYy5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlBST1A6IHtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gZGVjLnByb3BzIGFzIFVJUHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkNISUxEOiB7XG4gICAgICAgICAgICAgIGlmICghTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgQ2hpbGQgXCIke2tleX1cIiBtdXN0IGJlIGEgbW9kZWwuYCk7XG5cbiAgICAgICAgICAgICAgbGV0IENsYXp6O1xuICAgICAgICAgICAgICBjb25zdCBzdWJtb2RlbCA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldIGFzIE1vZGVsO1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RhYmxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2Ygc3VibW9kZWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHN1Ym1vZGVsKTtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGluc3RhbmNlIGlmIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAoZGVjLnByb3BzLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgICAgICAgICAgICA/Lm5hbWUgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIENsYXp6ID0gbmV3IChNb2RlbC5nZXQoY2xhenpOYW1lKSBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBnbG9iYWxQcm9wcyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZE9mOiBnZXRQYXRoKGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZywga2V5KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBtYXBwZXJbZGVjLnByb3BzPy5uYW1lIGFzIHN0cmluZ10gPSBrZXk7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjbGFzc0RlY29yYXRvci5wcm9wcz8uaXRlbSB8fCB7fSxcbiAgICAgICAgICAgICAgICBpdGVtPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBkZWMucHJvcHM/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgcHJvcHMucmVuZGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkUHJvcHM/LnByb3BzLCB7IG1hcHBlciB9LCBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FTEVNRU5UOiB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgICAgICAgY29uc3QgdWlQcm9wczogVUlFbGVtZW50TWV0YWRhdGEgPSBkZWMucHJvcHMgYXMgVUlFbGVtZW50TWV0YWRhdGE7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcz8uY2hpbGRPZiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjaGlsZE9mOiB1bmRlZmluZWQsIC8vIFRoZSBjaGlsZE9mIHByb3AgaXMgcGFzc2VkIGJ5IGdsb2JhbFByb3BzIHdoZW4gaXQgaXMgYSBuZXN0ZWQgcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBjaGlsZERlZmluaXRpb246IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IHVpUHJvcHMudGFnLFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNzOiBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10gPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JzW1xuICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgXSBhcyBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W107XG5cbiAgICAgICAgICAgICAgY29uc3QgdHlwZURlYzogRGVjb3JhdG9yTWV0YWRhdGFPYmplY3QgPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNzLnNoaWZ0KCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIHZhbGlkYXRpb25EZWNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKGRlYy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbdGhpcy50cmFuc2xhdGUoZGVjLmtleSldID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0F0dHJpYnV0ZVZhbHVlKGRlYy5rZXksIGRlYy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5VHlwZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IEhUTUw1SW5wdXRUeXBlcy5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXSA9XG4gICAgICAgICAgICAgICAgICAgICAgZGVjLnByb3BzLmZvcm1hdCB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gZGVjLmtleTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljVHlwZSA9ICh0eXBlRGVjLnByb3BzIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgICAgYmFzaWNUeXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcy52YWx1ZSA9IGZvcm1hdEJ5VHlwZShcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdLFxuICAgICAgICAgICAgICAgIG1vZGVsW2tleSBhcyBrZXlvZiBNXSxcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMQVlPVVRJVEVNOiBcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBJbnZhbGlkIGtleTogJHtkZWMua2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgZ2xvYmFsUHJvcHMsIHtcbiAgICAgIGhhbmRsZXJzOiBoYW5kbGVycyB8fCB7fSxcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IEZpZWxkRGVmaW5pdGlvbjxUPiA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgaXRlbTogY2hpbGRQcm9wcyBhcyBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICAgICAgcHJvcHM6IGdsb2JhbFByb3BzIGFzIFQgJiBGaWVsZFByb3BlcnRpZXMsXG4gICAgICBjaGlsZHJlbjogKChPYmplY3Qua2V5cyh1aURlY29yYXRvcnMpPy5sZW5ndGggJiYgY2hpbGRyZW4/Lmxlbmd0aCkgPyBcbiAgICAgICAgdGhpcy5nZXRMYXlvdXRJdGVtcyhjaGlsZHJlbiwgdWlEZWNvcmF0b3JzKSA6IGNoaWxkcmVuKSxcbiAgICBcbiAgICB9O1xuXG4gICAgaWYgKGdlbmVyYXRlSWQpIHJlc3VsdC5yZW5kZXJlcklkID0gZ2VuZXJhdGVVSU1vZGVsSUQobW9kZWwpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBsYXlvdXQgaXRlbXMgZm9yIGdyaWQgcG9zaXRpb25pbmdcbiAgICogQHN1bW1hcnkgTWFwcyBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGxheW91dCBwb3NpdGlvbnNcbiAgICogVGhpcyBtZXRob2QgaXRlcmF0ZXMgdGhyb3VnaCBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyBhbmQgYXBwbGllcyBsYXlvdXQgbWV0YWRhdGFcbiAgICogZnJvbSBAdWlsYXlvdXRpdGVtIGRlY29yYXRvcnMgdG8gcG9zaXRpb24gdGhlbSBjb3JyZWN0bHkgaW4gYSBncmlkIGxheW91dC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWVsZERlZmluaXRpb25bXX0gY2hpbGRyZW4gLSBBcnJheSBvZiBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdWlEZWNvcmF0b3JzIC0gVUkgZGVjb3JhdG9yIG1ldGFkYXRhIGtleWVkIGJ5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybnMge0ZpZWxkRGVmaW5pdGlvbltdfSBBcnJheSBvZiBmaWVsZCBkZWZpbml0aW9ucyB3aXRoIGxheW91dCBwb3NpdGlvbmluZyBhcHBsaWVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEludGVybmFsIHVzYWdlIC0gcG9zaXRpb25zIGNoaWxkcmVuIGluIGdyaWQgbGF5b3V0XG4gICAqIGNvbnN0IGxheW91dENoaWxkcmVuID0gdGhpcy5nZXRMYXlvdXRJdGVtcyhjaGlsZERlZmluaXRpb25zLCBkZWNvcmF0b3JNZXRhZGF0YSk7XG4gICAqL1xuICBnZXRMYXlvdXRJdGVtcyhjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPGFueT5bXSwgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogRmllbGREZWZpbml0aW9uPGFueT5bXSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGxldCB1cGRhdGVkQ2hpbGQgPSBjaGlsZDtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVpRGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNzID0gdWlEZWNvcmF0b3JzW2tleV07XG4gICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuVUlMQVlPVVRJVEVNICYmXG4gICAgICAgICAgICAoZGVjLnByb3BzPy5uYW1lID09PSBjaGlsZC5wcm9wcz8ubmFtZSB8fCBkZWMucHJvcHM/Lm5hbWUgPT09IGNoaWxkLnByb3BzPy5jaGlsZE9mKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgeyBjb2wsIHByb3BzLCByb3cgfSA9IGRlYy5wcm9wcyBhcyBVSUxheW91dEl0ZW1NZXRhZGF0YTtcbiAgICAgICAgICAgIHVwZGF0ZWRDaGlsZCA9IHtcbiAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICBjb2wsXG4gICAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgIC4uLmNoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRDaGlsZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHdpdGggZ2xvYmFsIHByb3BlcnRpZXMgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiBSZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIG91dHB1dCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGdsb2JhbFByb3BzIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMgZHVyaW5nIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJucyB7Un0gVGhlIHJlbmRlcmVkIHJlc3VsdCwgdHlwZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSByZW5kZXJpbmcgZW5naW5lIHRvIHRoZSBzdGF0aWMgY2FjaGUgYW5kIHNldHMgaXQgYXMgdGhlIGN1cnJlbnQgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPn0gZW5naW5lIC0gVGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmVnaXN0ZXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFuIGVuZ2luZSB3aXRoIHRoZSBzYW1lIGZsYXZvciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+KSB7XG4gICAgaWYgKGVuZ2luZS5mbGF2b3VyIGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtlbmdpbmUuZmxhdm91cn0gYWxyZWFkeSBleGlzdHNgXG4gICAgICApO1xuICAgIHRoaXMuY2FjaGVbZW5naW5lLmZsYXZvdXJdID0gZW5naW5lO1xuICAgIHRoaXMuY3VycmVudCA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGluaXRpYWxpemVzIGEgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhbiBleGlzdGluZyBlbmdpbmUgaW5zdGFuY2Ugb3IgY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgb25lIGlmIGdpdmVuIGEgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz59IG9iaiAtIFRoZSBlbmdpbmUgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSBpbml0aWFsaXplZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPckJvb3Q8Tz4oXG4gICAgb2JqOiBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbmRlcmluZ0VuZ2luZSkgcmV0dXJuIG9iaiBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gICAgY29uc3QgZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8Tz4gPSBuZXcgb2JqKCk7XG4gICAgZW5naW5lLmluaXRpYWxpemUoKTsgLy8gbWFrZSB0aGUgYm9vdGluZyBhc3luYy4gdXNlIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIGNvbnRyb2wgaXRcbiAgICByZXR1cm4gZW5naW5lIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVuZGVyaW5nIGVuZ2luZSBieSBmbGF2b3IuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBvciBhIHNwZWNpZmljIG9uZSBieSBmbGF2b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIHJlcXVlc3RlZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGZsYXZvciBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldDxPPihmbGF2b3VyPzogc3RyaW5nKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICAgIHRoaXMuY3VycmVudCBhcyBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgICApO1xuICAgIGlmICghKGZsYXZvdXIgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtmbGF2b3VyfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgdGhpcy5jYWNoZVtmbGF2b3VyXSBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj5cbiAgICAgICAgfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbCBhbmQgaW52b2tlcyBpdHMgcmVuZGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVnaXN0ZXJlZCBtb2RlbCBpcyBmb3VuZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPVxuICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIHx8IE1vZGVsLmZyb21PYmplY3QobW9kZWwpO1xuICAgIGlmICghY29uc3RydWN0b3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCBmb3VuZFwiKTtcbiAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlJFTkRFUkVEX0JZKSxcbiAgICAgIGNvbnN0cnVjdG9yIGFzIE1vZGVsQ29uc3RydWN0b3I8TW9kZWw+XG4gICAgKTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZm9yIHRoZSB2YXIgYXJncyB0eXBlIGNoZWNrXG4gICAgcmV0dXJuIFJlbmRlcmluZ0VuZ2luZS5nZXQoZmxhdm91cikucmVuZGVyKG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbWV0YWRhdGEga2V5IGZvciBVSS1yZWxhdGVkIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFByZWZpeGVzIGEgZ2l2ZW4ga2V5IHdpdGggdGhlIFVJIHJlZmxlY3Rpb24gcHJlZml4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBwcmVmaXguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcmVmaXhlZCBrZXkuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtVSUtleXMuUkVGTEVDVH0ke2tleX1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBVSUtleXMgfSBmcm9tIFwiLi4vdWkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuLi91aS9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IFVJTGlzdEl0ZW1Nb2RlbE1ldGFkYXRhLCBVSU1lZGlhQnJlYWtQb2ludHMsIFVJTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi91aS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgY2xhc3MgYXMgYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgQWRkcyByZW5kZXJpbmcgY2FwYWJpbGl0aWVzIHRvIGEgbW9kZWwgY2xhc3MgYnkgcHJvdmlkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLlxuICogVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWltb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIGNsYXNzIFVzZXJQcm9maWxlIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgnZGl2JywgeyBjbGFzczogJ3VzZXItY2FyZCcgfSlcbiAqIGNsYXNzIFVzZXJDYXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGNvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IGluc3RhbmNlXG4gKiAgIFN5c3RlbS0+PnVpbW9kZWw6ZG8oY29uc3RydWN0b3IpXG4gKiAgIHVpbW9kZWwtPj5jb25zdHJ1Y3RvcjogRXhlY3V0ZXMgdGhlIGNvbnN0cnVjdG9yXG4gKiAgIGNvbnN0cnVjdG9yLT4+dWltb2RlbDogcmV0dXJucyBpbnN0YW5jZVxuICogICB1aW1vZGVsLT4+aW5zdGFuY2U6IGFkZHMgdGhlIHJlbmRlciBtZXRob2RcbiAqICAgdWltb2RlbC0+PlN5c3RlbTogcmV0dXJucyBVSU1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW1vZGVsKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgbW9kZWwgd2l0aCBhIHNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzcyxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5naW5lIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHJlbmRlcmVkQnlcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNwZWNpZnkgYSBjdXN0b20gcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbFxuICogQHVpbW9kZWwoKVxuICogQHJlbmRlcmVkQnkoJ3JlYWN0JylcbiAqIGNsYXNzIFJlYWN0Q29tcG9uZW50IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCByZW5kZXJlZEJ5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj5yZW5kZXJlZEJ5OiBhcHBseSB0byBNb2RlbFxuICogICByZW5kZXJlZEJ5LT4+TW9kZWw6IGFkZHMgZW5naW5lIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIHNwZWNpZmllZCBlbmdpbmVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggY3VzdG9tIGVuZ2luZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUkVOREVSRURfQlkpLCBlbmdpbmUpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgdGFncyBhIG1vZGVsIGFzIGEgbGlzdCBpdGVtIGZvciBVSSByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBtb2RlbCBzaG91bGQgYmUgcmVuZGVyZWQgd2hlbiBkaXNwbGF5ZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIGNsYXNzIHRoYXQgZW5hYmxlcyBpdCB0byBiZSByZW5kZXJlZCBhcyBhIGxpc3QgaXRlbVxuICogYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuIFRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIHdoZW4gaXQgYXBwZWFycyBpbiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIFRoZSBIVE1MIHRhZyB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBtb2RlbCBhcyBhIGxpc3QgaXRlbSAoZGVmYXVsdHMgdG8gY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgcmVuZGVyZWQgbGlzdCBpdGVtIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3RpdGVtXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgdGFnIChjbGFzcyBuYW1lKVxuICogQHVpbW9kZWwoKVxuICogQHVpbGlzdGl0ZW0oKVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3RpdGVtKCdsaScsIHsgY2xhc3M6ICdsaXN0LWdyb3VwLWl0ZW0nIH0pXG4gKiBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxpc3RpdGVtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxpc3RpdGVtOiBhcHBseSB0byBNb2RlbFxuICogICB1aWxpc3RpdGVtLT4+TW9kZWw6IGFkZHMgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIGxpc3QgaXRlbSBtZXRhZGF0YSB3aGVuIGluIGxpc3QgY29udGV4dFxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBsaXN0IGl0ZW0gc3R5bGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0aXRlbSh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUxpc3RJdGVtTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgdGFnOiB0YWcgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSwgbWV0YSkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBhZGRzIGV2ZW50IGhhbmRsZXJzIHRvIGEgVUkgbW9kZWxcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBldmVudCBoYW5kbGVycyB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgbW9kZWxcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGV2ZW50IGhhbmRsZXJzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgVUkgZWxlbWVudC4gVGhlIGhhbmRsZXJzIGFyZSBwYXNzZWQgYXMgcHJvcGVydGllc1xuICogdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIE9iamVjdCBjb250YWluaW5nIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWloYW5kbGVyc1xuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIGV2ZW50IGhhbmRsZXJzIHRvIGEgbW9kZWxcbiAqIEB1aW1vZGVsKCdidXR0b24nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvbkNsaWNrOiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCcpLFxuICogICBvbk1vdXNlT3ZlcjogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnTW91c2Ugb3ZlciBidXR0b24nKSxcbiAqICAgZGlzYWJsZWQ6IGZhbHNlXG4gKiB9KVxuICogY2xhc3MgQ2xpY2thYmxlQnV0dG9uIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBBZGQgZm9ybSBzdWJtaXNzaW9uIGhhbmRsZXJzXG4gKiBAdWltb2RlbCgnZm9ybScpXG4gKiBAdWloYW5kbGVycyh7XG4gKiAgIG9uU3VibWl0OiAoZXZlbnQpID0+IHtcbiAqICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICogICAgIGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZCcpO1xuICogICB9LFxuICogICBvblJlc2V0OiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdGb3JtIHJlc2V0JylcbiAqIH0pXG4gKiBjbGFzcyBDb250YWN0Rm9ybSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWloYW5kbGVyc1xuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgU3lzdGVtLT4+dWloYW5kbGVyczogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWloYW5kbGVycy0+Pk1vZGVsOiBhZGRzIGhhbmRsZXIgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyB3aXRoIGhhbmRsZXJzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiByZW5kZXJzIGVsZW1lbnQgd2l0aCBldmVudCBoYW5kbGVycyBhdHRhY2hlZFxuICogICBVSS0+Pk1vZGVsOiB0cmlnZ2VycyBoYW5kbGVycyBvbiBldmVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpaGFuZGxlcnMocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBoYW5kbGVyczogcHJvcHNcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY3JlYXRlcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBncmlkIHNwZWNpZmljYXRpb25zXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggbGF5b3V0IGdyaWQgY29uZmlndXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY3JlYXRlcyBhIFVJIG1vZGVsIHRoYXQgYWN0cyBhcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBzcGVjaWZpZWRcbiAqIGNvbHVtbiBhbmQgcm93IGNvbmZpZ3VyYXRpb25zLiBJdCdzIGEgY29udmVuaWVuY2UgZGVjb3JhdG9yIHRoYXQgY29tYmluZXNcbiAqIEB1aW1vZGVsIHdpdGggbGF5b3V0LXNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHJlc3BvbnNpdmUgZ3JpZCBsYXlvdXRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgdGFnIHRvIHVzZSBmb3IgdGhlIGxheW91dCBjb250YWluZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29scz0xXSBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZCBsYXlvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ1tdfSBbcm93cz0xXSBOdW1iZXIgb2Ygcm93cyBvciBhcnJheSBvZiByb3cgZGVmaW5pdGlvbnNcbiAqIEBwYXJhbSB7VUlNZWRpYUJyZWFrUG9pbnRzfSBbYnJlYWtwb2ludD0nbSddIE1lZGlhIGJyZWFrcG9pbnQgZm9yIHJlc3BvbnNpdmUgYmVoYXZpb3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxheW91dFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIDItY29sdW1uIGxheW91dFxuICogQHVpbGF5b3V0KCdkaXYnLCAyLCAzKVxuICogY2xhc3MgVHdvQ29sdW1uTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKVxuICogICBoZWFkZXI6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDIpXG4gKiAgIGxlZnRDb250ZW50OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgyLCAyKVxuICogICByaWdodENvbnRlbnQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBDcmVhdGUgYSByZXNwb25zaXZlIGxheW91dCB3aXRoIGN1c3RvbSBicmVha3BvaW50XG4gKiBAdWlsYXlvdXQoJ3NlY3Rpb24nLCAzLCAyLCAnbCcpXG4gKiBjbGFzcyBSZXNwb25zaXZlTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMiwgMSlcbiAqICAgc3VidGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dFxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxheW91dDogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWlsYXlvdXQtPj51aW1vZGVsOiBjYWxsIHdpdGggbGF5b3V0IHByb3BzXG4gKiAgIHVpbW9kZWwtPj5Nb2RlbDogYWRkcyBtb2RlbCBtZXRhZGF0YSB3aXRoIGxheW91dCBjb25maWdcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyBhcyBsYXlvdXQgY29udGFpbmVyXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlN5c3RlbTogcmVuZGVycyBncmlkIGxheW91dCB3aXRoIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxheW91dCh0YWc6IHN0cmluZywgY29sczogbnVtYmVyID0gMSwgcm93czogbnVtYmVyIHwgc3RyaW5nW10gPSAxLCBicmVha3BvaW50OiBVSU1lZGlhQnJlYWtQb2ludHMgPSAnbScpIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIHJldHVybiB1aW1vZGVsKHRhZywge2NvbHMsIHJvd3MsIGJyZWFrcG9pbnR9KShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufSIsIi8qKlxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSB0aGF0IGV4dGVuZHMgdGhlIE1vZGVsIHByb3RvdHlwZSB3aXRoIHJlbmRlcmluZyBjYXBhYmlsaXRpZXNcbiAqIEBzdW1tYXJ5IEFkZHMgdGhlIHJlbmRlciBtZXRob2QgdG8gYWxsIE1vZGVsIGluc3RhbmNlcyBmcm9tIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSZW5kZXJhYmxlIGludGVyZmFjZSBmb3IgdGhlIE1vZGVsIGNsYXNzIGJ5IGFkZGluZyBhIHJlbmRlciBtZXRob2RcbiAqIHRvIGl0cyBwcm90b3R5cGUuIFRoaXMgYWxsb3dzIGFueSBNb2RlbCBpbnN0YW5jZSB0byBiZSByZW5kZXJlZCB1c2luZyB0aGUgUmVuZGVyaW5nRW5naW5lLlxuICogQG1vZHVsZSBtb2RlbC9vdmVycmlkZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9tb2RlbFxuICovXG5cbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4uL3VpL1JlbmRlcmluZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIHRoZSBtb2RlbCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIGVuZ2luZVxuICogQHN1bW1hcnkgRGVsZWdhdGVzIHJlbmRlcmluZyB0byB0aGUgUmVuZGVyaW5nRW5naW5lIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhXG4gKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSByZW5kZXIgbWV0aG9kIGZyb20gdGhlIFJlbmRlcmFibGUgaW50ZXJmYWNlIGZvciBhbGwgTW9kZWwgaW5zdGFuY2VzLlxuICogSXQgdXNlcyB0aGUgUmVuZGVyaW5nRW5naW5lIHRvIGRldGVybWluZSBob3cgdG8gcmVuZGVyIHRoZSBtb2RlbCBiYXNlZCBvbiBpdHMgbWV0YWRhdGEuXG4gKlxuICogQHRlbXBsYXRlIE0gVHlwZSBvZiB0aGUgbW9kZWwgYmVpbmcgcmVuZGVyZWRcbiAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcmVuZGVyaW5nIGVuZ2luZVxuICogQHJldHVybiB7YW55fSBUaGUgcmVuZGVyZWQgb3V0cHV0IGluIHRoZSBmb3JtYXQgZGV0ZXJtaW5lZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZVxuICovXG5Nb2RlbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4odGhpczogTSwgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIFJlbmRlcmluZ0VuZ2luZS5yZW5kZXIodGhpcywgLi4uYXJncyk7XG59O1xuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJTGF5b3V0SXRlbU1ldGFkYXRhLFxuICBVSUxpc3RQcm9wTWV0YWRhdGEsXG4gIFVJUHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4vUmVuZGVyaW5nXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGhpZGVzIGEgcHJvcGVydHkgZHVyaW5nIHNwZWNpZmljIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ29udHJvbHMgcHJvcGVydHkgdmlzaWJpbGl0eSBiYXNlZCBvbiBvcGVyYXRpb24gdHlwZVxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoIENSVUQgb3BlcmF0aW9ucyBzaG91bGQgaGlkZSBhIHByb3BlcnR5XG4gKiBpbiB0aGUgVUkuIFRoZSBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgdmlzaWJsZSBkdXJpbmcgb3BlcmF0aW9ucyBub3Qgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBvcGVyYXRpb25zIC0gVGhlIENSVUQgb3BlcmF0aW9ucyBkdXJpbmcgd2hpY2ggdGhlIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRlT25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhpZGUgdGhlIHBhc3N3b3JkIGZpZWxkIGR1cmluZyBSRUFEIG9wZXJhdGlvbnNcbiAqIGNsYXNzIFVzZXIge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAaGlkZU9uKE9wZXJhdGlvbktleXMuUkVBRClcbiAqICAgcGFzc3dvcmQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGhpZGVPblxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgTW9kZWwtPj5oaWRlT246IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIGhpZGVPbi0+Pk1vZGVsOiBBZGQgaGlkZGVuIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBDaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gaGlkZGVuIG9wZXJhdGlvbnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IFJlbmRlciBvciBoaWRlIGJhc2VkIG9uIGN1cnJlbnQgb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRlT24oLi4ub3BlcmF0aW9uczogQ3J1ZE9wZXJhdGlvbktleXNbXSkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPENydWRPcGVyYXRpb25LZXlzW10+KFxuICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhJRERFTiksXG4gICAgb3BlcmF0aW9uc1xuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjb21wbGV0ZWx5IGhpZGVzIGEgcHJvcGVydHkgaW4gYWxsIFVJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IE1ha2VzIGEgcHJvcGVydHkgaW52aXNpYmxlIGluIGFsbCBDUlVEIG9wZXJhdGlvbnNcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaGlkZU9uIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eVxuICogZHVyaW5nIGFsbCBDUlVEIG9wZXJhdGlvbnMgKENSRUFURSwgUkVBRCwgVVBEQVRFLCBERUxFVEUpLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRkZW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbXBsZXRlbHkgaGlkZSB0aGUgaW50ZXJuYWxJZCBmaWVsZCBpbiB0aGUgVUlcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRkZW4oKVxuICogICBpbnRlcm5hbElkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRkZW5cbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBNb2RlbC0+PmhpZGRlbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZGVuLT4+aGlkZU9uOiBDYWxsIHdpdGggYWxsIG9wZXJhdGlvbnNcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBhbGwgb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogQWx3YXlzIGhpZGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbigpIHtcbiAgcmV0dXJuIGhpZGVPbihcbiAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5ERUxFVEVcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IE1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIHNwZWNpZmljIFVJIGVsZW1lbnQgd2l0aCBjdXN0b20gcHJvcGVydGllc1xuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgd2hpY2ggSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZFxuICogdG8gcmVuZGVyIGEgc3BlY2lmaWMgcHJvcGVydHksIGFsb25nIHdpdGggYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoYXQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIHVzZSBmb3IgcmVuZGVyaW5nXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWVsZW1lbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlbmRlciBhIHByb3BlcnR5IGFzIGEgdGV4dCBpbnB1dFxuICogY2xhc3MgTG9naW5Gb3JtIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgdXNlcm5hbWUnIH0pXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFzc3dvcmQnIH0pXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnYnV0dG9uJywgeyBjbGFzczogJ2J0bi1wcmltYXJ5JyB9KVxuICogICBzdWJtaXQ6IHN0cmluZyA9ICdMb2dpbic7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWVsZW1lbnRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+dWllbGVtZW50OiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWVsZW1lbnQtPj5Nb2RlbDogQWRkIGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gdGFnIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIHdpdGggc3BlY2lmaWVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpZWxlbWVudChcbiAgdGFnOiBzdHJpbmcsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2VyaWFsaXplOiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwge1xuICAgICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkVMRU1FTlQpLCBtZXRhZGF0YSkoXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHBhc3NlZCB0byBhIFVJIGNvbXBvbmVudFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgc2hvdWxkIGJlIG1hcHBlZCB0b1xuICogYSBwcm9wZXJ0eSBvZiB0aGUgVUkgY29tcG9uZW50IHdoZW4gcmVuZGVyaW5nLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmVcbiAqIGRlY29yYXRlZCB3aXRoIEB1aW1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzdHJpbmdpZnk9ZmFsc2VdIFdoZXRoZXIgdG8gc3RyaW5naWZ5IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIG1vZGVsIHByb3BlcnRpZXMgdG8gY29tcG9uZW50IHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICdmdWxsTmFtZScgdG8gdGhlIGNvbXBvbmVudFxuICogICBmdWxsTmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJFbWFpbCcpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICd1c2VyRW1haWwnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRGF0YScsIHRydWUpIC8vIFdpbGwgYmUgcGFzc2VkIGFzIHN0cmluZ2lmaWVkIEpTT05cbiAqICAgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpcHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlwcm9wLT4+TW9kZWw6IEFkZCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgc3RyaW5naWZ5IGZsYWdcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpcHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgc3RyaW5naWZ5OiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJUHJvcE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5QUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbmVzdGVkIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5LlxuICogQHN1bW1hcnkgRGVmaW5lcyBob3cgYSBwYXJlbnQgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIGNoaWxkIG1vZGVsIHdoZW4gbmVzdGVkLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gZGVjb3JhdGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXN0ZWQgbW9kZWxzLlxuICogV2hlbiBhcHBsaWVkLCBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB0YWcgb2YgdGhlIGNoaWxkIG1vZGVsIHdpdGggdGhlIHByb3ZpZGVkIG9uZSxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgYmVoYXZpb3Igd2hlbiB0aGUgbW9kZWwgYWN0cyBhcyBhIGNoaWxkIChuZXN0ZWQpXG4gKiBjb21wYXJlZCB0byB3aGVuIGl0IGlzIHJlbmRlcmVkIGFzIHRoZSBwYXJlbnQgbW9kZWwuXG4gKlxuICogSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIGBAdWltb2RlbGAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IFRoZSBtb2RlbCBjbGFzcyBuYW1lIHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIG92ZXJyaWRlIHRoZSBVSSB0YWcgb2YgdGhlIG5lc3RlZCBtb2RlbFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIHVpY2hpbGRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBhIG5lc3RlZCBtb2RlbCB0byBhIGNvbXBvbmVudCBwcm9wZXJ0eSB3aXRoIGEgZGlmZmVyZW50IHRhZyB3aGVuIG5lc3RlZFxuICogQHVpbW9kZWwoJ2FkZHJlc3MtY29tcG9uZW50JylcbiAqIGNsYXNzIEFkZHJlc3Mge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgc3RyZWV0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY2l0eTogc3RyaW5nO1xuICogfVxuICpcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpY2hpbGQoQWRkcmVzcy5uYW1lLCAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnKVxuICogICBhZGRyZXNzOiBBZGRyZXNzO1xuICogfVxuICpcbiAqIC8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIEFkZHJlc3MgbW9kZWwgaGFzIHRoZSBkZWZhdWx0IHRhZyAnYWRkcmVzcy1jb21wb25lbnQnIHdoZW4gcmVuZGVyZWQgYXMgYSByb290IGNvbXBvbmVudCxcbiAqIC8vIGJ1dCB3aGVuIHVzZWQgaW5zaWRlIFVzZXJQcm9maWxlLCBpdCBpcyByZW5kZXJlZCB3aXRoIHRoZSBvdmVycmlkZGVuIHRhZyAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWNoaWxkXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aWNoaWxkOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWNoaWxkLT4+TW9kZWw6IEFkZCBjaGlsZCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGNoaWxkIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lLCBzdHJpbmdpZnkgZmxhZywgYW5kIGNoaWxkIHRhZyBvdmVycmlkZVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Db21wb25lbnQ6IFBhc3MgcHJvcGVydHkgd2l0aCBzcGVjaWZpZWQgbmFtZSBhbmQgcmVuZGVyIHdpdGggb3ZlcnJpZGRlbiB0YWcgaWYgbmVzdGVkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVpY2hpbGQoXG4gIGNsYXp6OiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICBzZXJpYWxpemU6IGJvb2xlYW4gPSBmYWxzZVxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlFbGVtZW50TWV0YWRhdGEgPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIHNlcmlhbGl6ZTogc2VyaWFsaXplLFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzIHx8IHt9LCB7XG4gICAgICAgIG5hbWU6IGNsYXp6IHx8IHByb3BlcnR5S2V5LFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5DSElMRCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgbGlzdCBpdGVtIGNvbXBvbmVudFxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBpbiBhIGxpc3QgY29udGV4dFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgY29udGFpbmluZyBhIGxpc3RcbiAqIHNob3VsZCBiZSByZW5kZXJlZC4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIEB1aWxpc3RpdGVtLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbGlzdCBjb250YWluZXJcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3Rwcm9wXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBEZWZpbmUgYSBsaXN0IHByb3BlcnR5IHdpdGggY3VzdG9tIHJlbmRlcmluZ1xuICogQHVpbW9kZWwoJ3RvZG8tbGlzdCcpXG4gKiBjbGFzcyBUb2RvTGlzdCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxpc3Rwcm9wKCdpdGVtcycsIHsgY2xhc3M6ICd0b2RvLWl0ZW1zLWNvbnRhaW5lcicgfSlcbiAqICAgaXRlbXM6IFRvZG9JdGVtW107XG4gKiB9XG4gKlxuICogQHVpbGlzdGl0ZW0oJ2xpJywgeyBjbGFzczogJ3RvZG8taXRlbScgfSlcbiAqIGNsYXNzIFRvZG9JdGVtIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGV4dDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGlzdHByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExpc3RDb250YWluZXJcbiAqICAgcGFydGljaXBhbnQgTGlzdEl0ZW1zXG4gKiAgIE1vZGVsLT4+dWlsaXN0cHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsaXN0cHJvcC0+Pk1vZGVsOiBBZGQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGlzdCBwcm9wIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lIGFuZCBjb250YWluZXIgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdENvbnRhaW5lcjogQ3JlYXRlIGNvbnRhaW5lciB3aXRoIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RJdGVtczogUmVuZGVyIGVhY2ggaXRlbSB1c2luZyBAdWlsaXN0aXRlbVxuICogICBMaXN0Q29udGFpbmVyLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcmVuZGVyZWQgbGlzdFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0cHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBQYXJ0aWFsPFVJTGlzdFByb3BNZXRhZGF0YT4gPSB7XG4gICAgICBuYW1lOiBwcm9wTmFtZSB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIHByb3BzOiBwcm9wcyB8fCB7fSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RQUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBwb3NpdGlvbnMgYSBwcm9wZXJ0eSBpbiBhIHNwZWNpZmljIGdyaWQgbGF5b3V0IHBvc2l0aW9uXG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgdGhlIGNvbHVtbiBhbmQgcm93IHBvc2l0aW9uIGZvciBhIHByb3BlcnR5IGluIGEgVUkgbGF5b3V0IGdyaWRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHRoZSBzcGVjaWZpYyBwb3NpdGlvbiBvZiBhIHByb3BlcnR5IHdpdGhpblxuICogYSBncmlkLWJhc2VkIGxheW91dCBzeXN0ZW0uIEl0IHNwZWNpZmllcyB3aGljaCBjb2x1bW4gYW5kIHJvdyB0aGUgcHJvcGVydHlcbiAqIHNob3VsZCBvY2N1cHkgd2hlbiByZW5kZXJlZCBpbiB0aGUgVUkuXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGNvbCBUaGUgY29sdW1uIHBvc2l0aW9uIGluIHRoZSBncmlkIGxheW91dFxuICogQHBhcmFtIHtudW1iZXJ9IFtyb3c9MV0gVGhlIHJvdyBwb3NpdGlvbiBpbiB0aGUgZ3JpZCBsYXlvdXQgKGRlZmF1bHRzIHRvIDEpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wcz17fV0gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxheW91dCBpdGVtXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsYXlvdXRpdGVtXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBQb3NpdGlvbiBwcm9wZXJ0aWVzIGluIGEgZ3JpZCBsYXlvdXRcbiAqIEB1aW1vZGVsKCd1c2VyLWZvcm0nKVxuICogY2xhc3MgVXNlckZvcm0ge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKSAvLyBGaXJzdCBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBmaXJzdE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDIsIDEpIC8vIFNlY29uZCBjb2x1bW4sIGZpcnN0IHJvd1xuICogICBsYXN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMSwgMiwgeyBjb2xzcGFuOiAyIH0pIC8vIEZpcnN0IGNvbHVtbiwgc2Vjb25kIHJvdywgc3BhbnMgMiBjb2x1bW5zXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAzLCB7IGNsYXNzOiAnZnVsbC13aWR0aCcgfSkgLy8gRmlyc3QgY29sdW1uLCB0aGlyZCByb3cgd2l0aCBjdXN0b20gY2xhc3NcbiAqICAgYmlvOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dGl0ZW1cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IExheW91dENvbnRhaW5lclxuICogICBNb2RlbC0+PnVpbGF5b3V0aXRlbTogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlsYXlvdXRpdGVtLT4+TW9kZWw6IEFkZCBsYXlvdXQgaXRlbSBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gY29sdW1uLCByb3csIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MYXlvdXRDb250YWluZXI6IFBvc2l0aW9uIGVsZW1lbnQgYXQgZ3JpZCBjb29yZGluYXRlc1xuICogICBMYXlvdXRDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwb3NpdGlvbmVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGF5b3V0aXRlbShcbiAgY29sOiBudW1iZXIsXG4gIHJvdzogbnVtYmVyID0gMSxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJTGF5b3V0SXRlbU1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogIHByb3BlcnR5S2V5LFxuICAgICAgY29sLFxuICAgICAgcm93LFxuICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIHByb3BzKSxcbiAgICB9OyAgXG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTEFZT1VUSVRFTSksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENsYXNzIHJlcHJlc2VudGluZyBhbiBldmVudCBoYW5kbGVyXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIGV2ZW50cyBpbiB0aGUgVUkgZGVjb3JhdG9ycyBzeXN0ZW1cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBtYW5hZ2luZyBhbmQgcHJvY2Vzc2luZyBldmVudHMgdGhhdCBvY2N1clxuICogd2l0aGluIHRoZSBVSSBjb21wb25lbnRzIGdlbmVyYXRlZCBieSB0aGUgZGVjb3JhdG9ycy5cbiAqIEBjbGFzcyBFdmVudEhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy91aVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEV2ZW50SGFuZGxlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBFdmVudEhhbmRsZXIgb2JqZWN0XG4gICAqIFRoaXMgY29uc3RydWN0b3IgY3VycmVudGx5IGRvZXNuJ3QgdGFrZSBhbnkgcGFyYW1ldGVycywgYnV0IGl0IGNhbiBiZVxuICAgKiBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGFjY2VwdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaWYgbmVlZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxufSIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFVJIGRlY29yYXRvcnMgbW9kdWxlIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgYnVpbGRpbmcgVUkgY29tcG9uZW50cyBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIGJvdGggdGhlIG1vZGVsIGFuZCBVSSBzdWJtb2R1bGVzLCBwcm92aWRpbmcgZGVjb3JhdG9ycyBmb3JcbiAqIHJlbmRlcmluZywgY29tcG9uZW50IGRlZmluaXRpb24sIGFuZCBVSSBzdGF0ZSBtYW5hZ2VtZW50LlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VpXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBmb3IgcmVmZXJlbmNlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7QUFPRztBQTBCSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Q0c7QUFDVSxNQUFBLE1BQU0sR0FBRztBQUNwQixJQUFBLE9BQU8sRUFBRSxDQUFBLEVBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBTSxJQUFBLENBQUE7QUFDbkMsSUFBQSxPQUFPLEVBQUUsU0FBUztBQUNsQixJQUFBLFdBQVcsRUFBRSxhQUFhO0FBQzFCLElBQUEsT0FBTyxFQUFFLFNBQVM7QUFDbEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtBQUNaLElBQUEsS0FBSyxFQUFFLE9BQU87QUFDZCxJQUFBLElBQUksRUFBRSxNQUFNO0FBQ1osSUFBQSxXQUFXLEVBQUUsUUFBUTtBQUNyQixJQUFBLFlBQVksRUFBRSx1QkFBdUI7QUFFckMsSUFBQSxVQUFVLEVBQUUsWUFBWTtBQUN4QixJQUFBLFVBQVUsRUFBRSxVQUFVO0FBQ3RCLElBQUEsUUFBUSxFQUFFLFVBQVU7QUFDcEIsSUFBQSxZQUFZLEVBQUUsY0FBYztBQUM1QixJQUFBLFFBQVEsRUFBRSxVQUFVO0FBRXBCLElBQUEsSUFBSSxFQUFFLE1BQU07QUFDWixJQUFBLFFBQVEsRUFBRSxTQUFTO0FBRW5CLElBQUEsTUFBTSxFQUFFLFFBQVE7QUFDaEIsSUFBQSxNQUFNLEVBQUUsUUFBUTtBQUVoQixJQUFBLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFFBQVEsRUFBRSxjQUFjLENBQUMsUUFBUTtJQUNqQyxHQUFHLEVBQUUsY0FBYyxDQUFDLEdBQUc7SUFDdkIsVUFBVSxFQUFFLGNBQWMsQ0FBQyxVQUFVO0lBQ3JDLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRztJQUN2QixVQUFVLEVBQUUs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
1476
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvdWkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3VpL2Vycm9ycy50cyIsIi4uL3NyYy91aS91dGlscy50cyIsIi4uL3NyYy91aS9SZW5kZXJpbmcudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvdWkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91aS9oYW5kbGVycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgYW5kIGVudW1zIGZvciBVSSByZW5kZXJpbmcgYW5kIHZhbGlkYXRpb25cbiAqIEBzdW1tYXJ5IERlZmluZXMga2V5cywgbWFwcGluZ3MsIGFuZCBIVE1MNSBpbnB1dCB0eXBlcyBmb3IgVUkgY29tcG9uZW50c1xuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgVUkgZGVjb3JhdG9ycyBsaWJyYXJ5IGZvclxuICogcmVuZGVyaW5nLCB2YWxpZGF0aW9uLCBhbmQgSFRNTCBlbGVtZW50IGdlbmVyYXRpb24uXG4gKiBAbW9kdWxlIHVpL2NvbnN0YW50c1xuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERhdGVWYWxpZGF0b3IsXG4gIERpZmZWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBFcXVhbHNWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgTGVzc1RoYW5WYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgTWF4VmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1pblZhbGlkYXRvcixcbiAgTW9kZWxLZXlzLFxuICBQYXNzd29yZFZhbGlkYXRvcixcbiAgUGF0dGVyblZhbGlkYXRvcixcbiAgUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFN0ZXBWYWxpZGF0b3IsXG4gIFVSTFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgZm9yIFVJIG1ldGFkYXRhIGFuZCByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB1c2VkIGFzIGtleXMgZm9yIFVJLXJlbGF0ZWQgbWV0YWRhdGFcbiAqIFRoZXNlIGtleXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgcmVsYXRlZCB0b1xuICogVUkgbW9kZWxzLCBlbGVtZW50cywgcHJvcGVydGllcywgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVUlLZXlzVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBCYXNlIHJlZmxlY3Rpb24ga2V5IGZvciBVSSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVJTU9ERUwgLSBLZXkgZm9yIFVJIG1vZGVsIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVOREVSRURfQlkgLSBLZXkgZm9yIHNwZWNpZnlpbmcgcmVuZGVyaW5nIGVuZ2luZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVMRU1FTlQgLSBLZXkgZm9yIGVsZW1lbnQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQUk9QIC0gS2V5IGZvciBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5BTUUgLSBLZXkgZm9yIG5hbWUgYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRV9QUkVGSVggLSBQcmVmaXggZm9yIGlucHV0IG5hbWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ1VTVE9NX1BST1BTIC0gS2V5IGZvciBjdXN0b20gdmFsaWRhdGlvbiBwcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUSVRFTSAtIEtleSBmb3IgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUUFJPUCAtIEtleSBmb3IgbGlzdCBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHR5cGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJfVFlQRSAtIEtleSBmb3Igc3VidHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEtleSBmb3IgaGlkZGVuIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZPUk1BVCAtIEtleSBmb3IgZm9ybWF0IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIC0gS2V5IGZvciByZWFkb25seSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCAtIEtleSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiAtIEtleSBmb3IgbWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCAtIEtleSBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCAtIEtleSBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCAtIEtleSBmb3IgbWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gLSBLZXkgZm9yIHBhdHRlcm4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIEtleSBmb3IgVVJMIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIC0gS2V5IGZvciBzdGVwIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gS2V5IGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEtleSBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gS2V5IGZvciBwYXNzd29yZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUxTIC0gS2V5IGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIEtleSBmb3IgZGlmZmVyZW5jZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gS2V5IGZvciBsZXNzIHRoYW4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IExFU1NfVEhBTl9PUl9FUVVBTCAtIEtleSBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gS2V5IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBVSUtleXNcbiAqIEB0eXBlIHtVSUtleXNUeXBlfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFVJS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9LnVpLmAsXG4gIFVJTU9ERUw6IFwidWltb2RlbFwiLFxuICBSRU5ERVJFRF9CWTogXCJyZW5kZXJlZC1ieVwiLFxuICBFTEVNRU5UOiBcImVsZW1lbnRcIixcbiAgUFJPUDogXCJwcm9wXCIsXG4gIENISUxEOiBcImNoaWxkXCIsXG4gIE5BTUU6IFwibmFtZVwiLFxuICBOQU1FX1BSRUZJWDogXCJpbnB1dC1cIixcbiAgQ1VTVE9NX1BST1BTOiBcImN1c3RvbVZhbGlkYXRpb25Qcm9wc1wiLFxuXG4gIFVJTElTVElURU06IFwidWlsaXN0aXRlbVwiLFxuICBVSUxJU1RQUk9QOiBcImxpc3Rwcm9wXCIsXG4gIFVJTEFZT1VUOiBcInVpbGF5b3V0XCIsXG4gIFVJTEFZT1VUSVRFTTogXCJ1aWxheW91dGl0ZW1cIixcbiAgSEFORExFUlM6IFwiaGFuZGxlcnNcIixcblxuICBUWVBFOiBcInR5cGVcIixcbiAgU1VCX1RZUEU6IFwic3VidHlwZVwiLFxuXG4gIEhJRERFTjogXCJoaWRkZW5cIixcbiAgRk9STUFUOiBcImZvcm1hdFwiLFxuXG4gIFJFQURfT05MWTogXCJyZWFkb25seVwiLFxuICBSRVFVSVJFRDogVmFsaWRhdGlvbktleXMuUkVRVUlSRUQsXG4gIE1JTjogVmFsaWRhdGlvbktleXMuTUlOLFxuICBNSU5fTEVOR1RIOiBWYWxpZGF0aW9uS2V5cy5NSU5fTEVOR1RILFxuICBNQVg6IFZhbGlkYXRpb25LZXlzLk1BWCxcbiAgTUFYX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUFYX0xFTkdUSCxcbiAgUEFUVEVSTjogVmFsaWRhdGlvbktleXMuUEFUVEVSTixcbiAgVVJMOiBWYWxpZGF0aW9uS2V5cy5VUkwsXG4gIFNURVA6IFZhbGlkYXRpb25LZXlzLlNURVAsXG4gIERBVEU6IFZhbGlkYXRpb25LZXlzLkRBVEUsXG4gIEVNQUlMOiBWYWxpZGF0aW9uS2V5cy5FTUFJTCxcbiAgUEFTU1dPUkQ6IFZhbGlkYXRpb25LZXlzLlBBU1NXT1JELFxuICBFUVVBTFM6IFZhbGlkYXRpb25LZXlzLkVRVUFMUyxcbiAgRElGRjogVmFsaWRhdGlvbktleXMuRElGRixcbiAgTEVTU19USEFOOiBWYWxpZGF0aW9uS2V5cy5MRVNTX1RIQU4sXG4gIExFU1NfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuTEVTU19USEFOX09SX0VRVUFMLFxuICBHUkVBVEVSX1RIQU46IFZhbGlkYXRpb25LZXlzLkdSRUFURVJfVEhBTixcbiAgR1JFQVRFUl9USEFOX09SX0VRVUFMOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUwsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIGlucHV0IHR5cGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBzcGVjaWFsIGlucHV0IHR5cGVzIHRvIHRoZWlyIHZhbGlkYXRvciBjbGFzc2VzXG4gKiBUaGlzIGNvbnN0YW50IG1hcHMgaW5wdXQgdHlwZXMgbGlrZSBlbWFpbCwgVVJMLCBkYXRlLCBhbmQgcGFzc3dvcmQgdG8gdGhlaXJcbiAqIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yIGNsYXNzZXMgZnJvbSB0aGUgZGVjb3JhdG9yLXZhbGlkYXRpb24gbGlicmFyeS5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+fSBWYWxpZGF0YWJsZUJ5VHlwZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxFbWFpbFZhbGlkYXRvcj59IGVtYWlsIC0gVmFsaWRhdG9yIGZvciBlbWFpbCBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8VVJMVmFsaWRhdG9yPn0gdXJsIC0gVmFsaWRhdG9yIGZvciBVUkwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPERhdGVWYWxpZGF0b3I+fSBkYXRlIC0gVmFsaWRhdG9yIGZvciBkYXRlIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxQYXNzd29yZFZhbGlkYXRvcj59IHBhc3N3b3JkIC0gVmFsaWRhdG9yIGZvciBwYXNzd29yZCBpbnB1dHNcbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeVR5cGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5VHlwZU1hcH1cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWYWxpZGF0YWJsZUJ5VHlwZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuRU1BSUxdOiBFbWFpbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5VUkxdOiBVUkxWYWxpZGF0b3IsXG4gIFtVSUtleXMuREFURV06IERhdGVWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFTU1dPUkRdOiBQYXNzd29yZFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIE1hcHBpbmcgb2YgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsaWRhdG9yc1xuICogQHN1bW1hcnkgTWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIEhUTUwgdmFsaWRhdGlvbiBhdHRyaWJ1dGVzIGxpa2UgcmVxdWlyZWQsIG1pbiwgbWF4LCBwYXR0ZXJuLCBldGMuXG4gKiB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeUF0dHJpYnV0ZU1hcFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxSZXF1aXJlZFZhbGlkYXRvcj59IHJlcXVpcmVkIC0gVmFsaWRhdG9yIGZvciByZXF1aXJlZCBmaWVsZHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluVmFsaWRhdG9yPn0gbWluIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIHZhbHVlXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heFZhbGlkYXRvcj59IG1heCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxTdGVwVmFsaWRhdG9yPn0gc3RlcCAtIFZhbGlkYXRvciBmb3Igc3RlcCB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNaW5MZW5ndGhWYWxpZGF0b3I+fSBtaW5sZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1pbmltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1heExlbmd0aFZhbGlkYXRvcj59IG1heGxlbmd0aCAtIFZhbGlkYXRvciBmb3IgbWF4aW11bSBsZW5ndGhcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGF0dGVyblZhbGlkYXRvcj59IHBhdHRlcm4gLSBWYWxpZGF0b3IgZm9yIHJlZ2V4IHBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RXF1YWxzVmFsaWRhdG9yPn0gZXF1YWxzIC0gVmFsaWRhdG9yIGZvciBlcXVhbGl0eVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEaWZmVmFsaWRhdG9yPn0gZGlmZiAtIFZhbGlkYXRvciBmb3IgZGlmZmVyZW5jZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhblZhbGlkYXRvcj59IGxlc3N0aGFuIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxMZXNzVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBsZXNzdGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGxlc3MgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuVmFsaWRhdG9yPn0gZ3JlYXRlcnRoYW4gLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFub3JlcXVhbCAtIFZhbGlkYXRvciBmb3IgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb25cbiAqXG4gKiBAY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZVxuICogQHR5cGUge1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeUF0dHJpYnV0ZTogUmVjb3JkPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj4gPSB7XG4gIFtVSUtleXMuUkVRVUlSRURdOiBSZXF1aXJlZFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5dOiBNaW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYXTogTWF4VmFsaWRhdG9yLFxuICBbVUlLZXlzLlNURVBdOiBTdGVwVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1JTl9MRU5HVEhdOiBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUFYX0xFTkdUSF06IE1heExlbmd0aFZhbGlkYXRvcixcbiAgW1VJS2V5cy5QQVRURVJOXTogUGF0dGVyblZhbGlkYXRvcixcbiAgW1VJS2V5cy5FUVVBTFNdOiBFcXVhbHNWYWxpZGF0b3IsXG4gIFtVSUtleXMuRElGRl06IERpZmZWYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOXTogTGVzc1RoYW5WYWxpZGF0b3IsXG4gIFtVSUtleXMuTEVTU19USEFOX09SX0VRVUFMXTogTGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl06IEdyZWF0ZXJUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkdSRUFURVJfVEhBTl9PUl9FUVVBTF06IEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFN0YW5kYXJkIGRhdGUgZm9ybWF0IHN0cmluZyBmb3IgSFRNTDUgZGF0ZSBpbnB1dHNcbiAqIEBzdW1tYXJ5IEZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzICh5eXl5LU1NLWRkKVxuICogVGhpcyBjb25zdGFudCBkZWZpbmVzIHRoZSBzdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgdXNlZCBmb3IgSFRNTDUgZGF0ZSBpbnB1dHMuXG4gKlxuICogQGNvbnN0IEhUTUw1RGF0ZUZvcm1hdFxuICogQHR5cGUge3N0cmluZ31cbiAqIEByZWFkb25seVxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBIVE1MNURhdGVGb3JtYXQgPSBcInl5eXktTU0tZGRcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ29sbGVjdGlvbiBvZiBIVE1MNSBpbnB1dCB0eXBlIHZhbHVlc1xuICogQHN1bW1hcnkgTWFwcyBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXNcbiAqIFRoaXMgY29uc3RhbnQgcHJvdmlkZXMgYSBtYXBwaW5nIG9mIGlucHV0IHR5cGUgY29uc3RhbnRzIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmdcbiAqIEhUTUwgYXR0cmlidXRlIHZhbHVlcyBmb3IgdXNlIGluIGZvcm0gZWxlbWVudHMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gSFRNTDVJbnB1dFR5cGVzTWFwXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQlVUVE9OIC0gQnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDSEVDS0JPWCAtIENoZWNrYm94IGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDT0xPUiAtIENvbG9yIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURSAtIERhdGUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFVElNRV9MT0NBTCAtIExvY2FsIGRhdGV0aW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRU1BSUwgLSBFbWFpbCBpbnB1dCB0eXBlIHdpdGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZJTEUgLSBGaWxlIHVwbG9hZCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSElEREVOIC0gSGlkZGVuIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBJTUFHRSAtIEltYWdlIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBNT05USCAtIE1vbnRoIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTlVNQkVSIC0gTnVtZXJpYyBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUEFTU1dPUkQgLSBQYXNzd29yZCBpbnB1dCB0eXBlIHdpdGggbWFza2VkIHRleHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSQURJTyAtIFJhZGlvIGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFOR0UgLSBSYW5nZSBzbGlkZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFU0VUIC0gRm9ybSByZXNldCBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNFQVJDSCAtIFNlYXJjaCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU1VCTUlUIC0gRm9ybSBzdWJtaXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURUwgLSBUZWxlcGhvbmUgbnVtYmVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBURVhUIC0gQmFzaWMgdGV4dCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVElNRSAtIFRpbWUgcGlja2VyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBVUkwgLSBVUkwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBXRUVLIC0gV2VlayBwaWNrZXIgaW5wdXQgdHlwZVxuICpcbiAqIEBjb25zdCBIVE1MNUlucHV0VHlwZXNcbiAqIEB0eXBlIHtIVE1MNUlucHV0VHlwZXNNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVJbnB1dFR5cGVzID0ge1xuICBCVVRUT046IFwiYnV0dG9uXCIsXG4gIENIRUNLQk9YOiBcImNoZWNrYm94XCIsXG4gIENPTE9SOiBcImNvbG9yXCIsXG4gIERBVEU6IFVJS2V5cy5EQVRFLFxuICBEQVRFVElNRV9MT0NBTDogXCJkYXRldGltZS1sb2NhbFwiLFxuICBFTUFJTDogVUlLZXlzLkVNQUlMLFxuICBGSUxFOiBcImZpbGVcIixcbiAgSElEREVOOiBcImhpZGRlblwiLFxuICBJTUFHRTogXCJpbWFnZVwiLFxuICBNT05USDogXCJtb250aFwiLFxuICBOVU1CRVI6IFwibnVtYmVyXCIsXG4gIFBBU1NXT1JEOiBVSUtleXMuUEFTU1dPUkQsXG4gIFJBRElPOiBcInJhZGlvXCIsXG4gIFJBTkdFOiBcInJhbmdlXCIsXG4gIFJFU0VUOiBcInJlc2V0XCIsXG4gIFNFQVJDSDogXCJzZWFyY2hcIixcbiAgU1VCTUlUOiBcInN1Ym1pdFwiLFxuICBURUw6IFwidGVsXCIsXG4gIFRFWFQ6IFwidGV4dFwiLFxuICBURVhUQVJFQTogJ3RleHRhcmVhJyxcbiAgVElNRTogXCJ0aW1lXCIsXG4gIFVSTDogVUlLZXlzLlVSTCxcbiAgV0VFSzogXCJ3ZWVrXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBIVE1MNSBpbnB1dCB0eXBlcyB0aGF0IHVzZSBjaGVja2JveGVzXG4gKiBAc3VtbWFyeSBMaXN0IG9mIGlucHV0IHR5cGVzIHRoYXQgcmVwcmVzZW50IGNoZWNrYWJsZSBjb250cm9sc1xuICogVGhpcyBjb25zdGFudCBkZWZpbmVzIGFuIGFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgcmVwcmVzZW50XG4gKiBjaGVja2FibGUgY29udHJvbHMgKGNoZWNrYm94IGFuZCByYWRpbykuXG4gKlxuICogQGNvbnN0IEhUTUw1Q2hlY2tUeXBlc1xuICogQHR5cGUge3N0cmluZ1tdfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1Q2hlY2tUeXBlcyA9IFtcbiAgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YLFxuICBIVE1MNUlucHV0VHlwZXMuUkFESU8sXG5dO1xuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgcmVuZGVyaW5nIG9wZXJhdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgU3BlY2lhbGl6ZWQgZXJyb3IgZm9yIHJlbmRlcmluZyBmYWlsdXJlcyBpbiBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSByZW5kZXJpbmcgZW5naW5lIGVuY291bnRlcnMgYW4gZXJyb3Igd2hpbGVcbiAqIGF0dGVtcHRpbmcgdG8gcmVuZGVyIGEgVUkgY29tcG9uZW50IG9yIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvd2luZyBhIHJlbmRlcmluZyBlcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUmVuZGVyaW5nIGNvZGUgdGhhdCBtaWdodCBmYWlsXG4gKiAgIGlmICghY29tcG9uZW50LmNhblJlbmRlcigpKSB7XG4gKiAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKCdDb21wb25lbnQgY2Fubm90IGJlIHJlbmRlcmVkJyk7XG4gKiAgIH1cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmluZyBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBSZW5kZXJpbmdFcnJvciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgZXJyb3Igd2l0aCBhIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKFJlbmRlcmluZ0Vycm9yLm5hbWUsIG1zZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGZvcm1hdERhdGUsXG4gIE1vZGVsLFxuICBwYXJzZURhdGUsXG4gIFJlc2VydmVkTW9kZWxzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIVE1MNURhdGVGb3JtYXQsIEhUTUw1SW5wdXRUeXBlcywgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBmaW5kTW9kZWxJZCwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZnVuY3Rpb24gZm9ybWF0QnlUeXBlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeVR5cGUoXG4gIHR5cGU6IGFueSxcbiAgdmFsdWU6IGFueSxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBzdHJpbmcgfCBudW1iZXIge1xuICBpZiAodHlwZSA9PT0gVUlLZXlzLkRBVEUpIHtcbiAgICBpZighdmFsdWUpXG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgIGNvbnN0IGZvcm1hdDogc3RyaW5nID0gKGFyZ3Muc2hpZnQoKSBhcyBzdHJpbmcpIHx8IEhUTUw1RGF0ZUZvcm1hdDtcbiAgICByZXR1cm4gZm9ybWF0RGF0ZShuZXcgRGF0ZSh2YWx1ZSksIGZvcm1hdCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VWYWx1ZUJ5VHlwZShcbiAgdHlwZTogc3RyaW5nLFxuICB2YWx1ZTogc3RyaW5nIHwgbnVtYmVyLFxuICBmaWVsZFByb3BzOiBGaWVsZFByb3BlcnRpZXNcbik6IHN0cmluZyB8IG51bWJlciB8IERhdGUge1xuICBsZXQgcmVzdWx0OiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5OVU1CRVI6XG4gICAgICByZXN1bHQgPSBwYXJzZVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkRBVEU6IHtcbiAgICAgIGNvbnN0IGZvcm1hdDogc3RyaW5nIHwgdW5kZWZpbmVkID0gZmllbGRQcm9wcy5mb3JtYXQ7XG4gICAgICBpZih2YWx1ZSAmJiBgJHt2YWx1ZX1gLnRyaW0oKS5sZW5ndGgpIHtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLk5VTUJFUlxuICAgICAgICAgICAgPyBuZXcgRGF0ZSh2YWx1ZSlcbiAgICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgICAgPyBmb3JtYXRcbiAgICAgICAgICAgICAgICA/IHBhcnNlRGF0ZShmb3JtYXQsIHZhbHVlKVxuICAgICAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGRlZmF1bHQ6XG4gICAgICByZXN1bHQgPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFJlc2VydmVkTW9kZWxzLlNUUklOR1xuICAgICAgICAgID8gZXNjYXBlSHRtbCh2YWx1ZSBhcyBzdHJpbmcpXG4gICAgICAgICAgOiByZXN1bHQ7XG4gIH1cbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09IFwidW5kZWZpbmVkXCIpIHtcbiAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgIGBGYWlsZWQgdG8gcGFyc2UgdmFsdWUgb2YgdHlwZSAke3R5cGV9IGZyb20gJHt0eXBlb2YgdmFsdWV9IC0gJHt2YWx1ZX1gXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUb051bWJlcih2YWx1ZTogc3RyaW5nIHwgbnVtYmVyKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgJiYgIWlzTmFOKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuXG4gIGNvbnN0IHBhcnNlZCA9IE51bWJlcih2YWx1ZSk7XG4gIGlmICghaXNOYU4ocGFyc2VkKSkgcmV0dXJuIHBhcnNlZDtcblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlSHRtbCh2YWx1ZTogc3RyaW5nKSB7XG4gIGlmICghdmFsdWUpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJlwiOiBcIiZhbXA7XCIsXG4gICAgXCI8XCI6IFwiJmx0O1wiLFxuICAgIFwiPlwiOiBcIiZndDtcIixcbiAgfTtcbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvWyY8Pl0vZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVydEh0bWwodmFsdWU6IHN0cmluZykge1xuICBjb25zdCB0YWdzVG9SZXBsYWNlOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgIFwiJmFtcDtcIjogXCImXCIsXG4gICAgXCImbHQ7XCI6IFwiPFwiLFxuICAgIFwiJmd0O1wiOiBcIj5cIixcbiAgfTtcblxuICByZXR1cm4gYCR7dmFsdWV9YC5yZXBsYWNlKC8mbHQ7fCZndDt8JmFtcDsvZywgKHRhZykgPT4ge1xuICAgIHJldHVybiB0YWdzVG9SZXBsYWNlW3RhZ10gfHwgdGFnO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdlbmVyYXRlVUlNb2RlbElEPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0pIHtcbiAgbGV0IGlkOiBzdHJpbmcgfCBudW1iZXIgfCBiaWdpbnQ7XG4gIHRyeSB7XG4gICAgaWQgPSBmaW5kTW9kZWxJZChtb2RlbCkgYXMgc3RyaW5nIHwgbnVtYmVyO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgIGlkID0gRGF0ZS5ub3coKTtcbiAgfVxuICBjb25zdCBuYW1lID0gbW9kZWwuY29uc3RydWN0b3IubmFtZTtcbiAgcmV0dXJuIGAke25hbWV9LSR7aWR9YDtcbn1cbiIsImltcG9ydCB7IEludGVybmFsRXJyb3IgfSBmcm9tIFwiQGRlY2FmLXRzL2RiLWRlY29yYXRvcnNcIjtcbmltcG9ydCB7XG4gIENvbnN0cnVjdG9yLFxuICBNb2RlbCxcbiAgTW9kZWxDb25zdHJ1Y3RvcixcbiAgUmVzZXJ2ZWRNb2RlbHMsXG4gIFZhbGlkYXRpb25LZXlzLFxuICBWYWxpZGF0aW9uTWV0YWRhdGEsXG59IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIEhUTUw1RGF0ZUZvcm1hdCxcbiAgSFRNTDVJbnB1dFR5cGVzLFxuICBVSUtleXMsXG4gIFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUsXG4gIFZhbGlkYXRhYmxlQnlUeXBlLFxufSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7XG4gIEZpZWxkRGVmaW5pdGlvbixcbiAgRmllbGRQcm9wZXJ0aWVzLFxuICBVSUNsYXNzTWV0YWRhdGEsXG4gIFVJRWxlbWVudE1ldGFkYXRhLFxuICBVSUxheW91dEl0ZW1NZXRhZGF0YSxcbiAgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlNb2RlbE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0Vycm9yIH0gZnJvbSBcIi4vZXJyb3JzXCI7XG5pbXBvcnQgeyBEZWNvcmF0b3JNZXRhZGF0YSwgUmVmbGVjdGlvbiB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgZm9ybWF0QnlUeXBlLCBnZW5lcmF0ZVVJTW9kZWxJRCB9IGZyb20gXCIuL3V0aWxzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEFic3RyYWN0IGNsYXNzIGZvciByZW5kZXJpbmcgVUkgY29tcG9uZW50cyBiYXNlZCBvbiBtb2RlbCBtZXRhZGF0YS5cbiAqIEBzdW1tYXJ5IFRoZSBSZW5kZXJpbmdFbmdpbmUgY2xhc3MgcHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIGNvbnZlcnRpbmcgbW9kZWwgbWV0YWRhdGEgaW50byBVSSBmaWVsZCBkZWZpbml0aW9ucy5cbiAqIEl0IGhhbmRsZXMgdGhlIHRyYW5zbGF0aW9uIG9mIG1vZGVsIHByb3BlcnRpZXMgdG8gVUkgZWxlbWVudHMsIGFwcGxpZXMgdmFsaWRhdGlvbiBydWxlcywgYW5kIG1hbmFnZXMgZGlmZmVyZW50IHJlbmRlcmluZyBmbGF2b3JzLlxuICogVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBleHRlbmRlZCBieSBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgcmVzdWx0LCBkZWZhdWx0cyB0byB2b2lkXG4gKiBAdGVtcGxhdGUgUiBUaGUgdHlwZSBvZiB0aGUgZmllbGQgZGVmaW5pdGlvbiwgZGVmYXVsdHMgdG8gRmllbGREZWZpbml0aW9uPFQ+XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZsYXZvdXIgLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lLlxuICpcbiAqIEBjbGFzcyBSZW5kZXJpbmdFbmdpbmVcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcmluZ0VuZ2luZTxUID0gdm9pZCwgUiA9IEZpZWxkRGVmaW5pdGlvbjxUPj4ge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENhY2hlIGZvciBzdG9yaW5nIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2VzIG9yIGNvbnN0cnVjdG9ycy5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY2FjaGU6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAgfCBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4+XG4gICAgfCBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj5cbiAgPiA9IHt9O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVGhlIGN1cnJlbnRseSBhY3RpdmUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHByaXZhdGVcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgY3VycmVudDpcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPjtcblxuICAvKipcbiAgICogRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlbmRlcmluZyBlbmdpbmUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgaW5pdGlhbGl6ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgY29uc3RydWN0b3IocmVhZG9ubHkgZmxhdm91cjogc3RyaW5nKSB7XG4gICAgUmVuZGVyaW5nRW5naW5lLnJlZ2lzdGVyKHRoaXMpO1xuICAgIGNvbnNvbGUubG9nKGBkZWNhZidzICR7Zmxhdm91cn0gcmVuZGVyaW5nIGVuZ2luZSBsb2FkZWRgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gSW5pdGlhbGl6ZXMgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIGZvciBzcGVjaWZpYyBpbml0aWFsaXphdGlvbiBsb2dpYy5cbiAgICpcbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBuZWVkZWQgZm9yIGluaXRpYWxpemF0aW9uLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBpbml0aWFsaXphdGlvbiBpcyBjb21wbGV0ZS5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCBpbml0aWFsaXplKC4uLmFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFRyYW5zbGF0ZXMgYmV0d2VlbiBtb2RlbCB0eXBlcyBhbmQgSFRNTCBpbnB1dCB0eXBlcy5cbiAgICogQHN1bW1hcnkgQ29udmVydHMgbW9kZWwgZGF0YSB0eXBlcyB0byBhcHByb3ByaWF0ZSBIVE1MIGlucHV0IHR5cGVzIGFuZCB2aWNlIHZlcnNhLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byB0cmFuc2xhdGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RvVmlldz10cnVlXSAtIERpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAodHJ1ZSBmb3IgbW9kZWwgdG8gdmlldywgZmFsc2UgZm9yIHZpZXcgdG8gbW9kZWwpLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgdHJhbnNsYXRlZCB0eXBlLlxuICAgKi9cbiAgdHJhbnNsYXRlKGtleTogc3RyaW5nLCB0b1ZpZXc6IGJvb2xlYW4gPSB0cnVlKTogc3RyaW5nIHtcbiAgICBpZiAodG9WaWV3KSB7XG4gICAgICBzd2l0Y2ggKGtleSkge1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLlNUUklORzpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLlRFWFQ7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuTlVNQkVSOlxuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkJJR0lOVDpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLk5VTUJFUjtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5CT09MRUFOOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuQ0hFQ0tCT1g7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuREFURTpcbiAgICAgICAgICByZXR1cm4gSFRNTDVJbnB1dFR5cGVzLkRBVEU7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFWFQ6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkVNQUlMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5DT0xPUjpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuUEFTU1dPUkQ6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLlRFTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVVJMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5TRUFSQ0g6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkhJRERFTjpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVYVEFSRUE6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLlNUUklORztcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVI7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5CT09MRUFOO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFVElNRV9MT0NBTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVElNRTpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuREFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGNsYXNzIGRlY29yYXRvciBtZXRhZGF0YSBmb3IgYSBtb2RlbCBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBFeHRyYWN0cyBVSS1yZWxhdGVkIGNsYXNzIGRlY29yYXRvcnMgZnJvbSBhIG1vZGVsIGFuZCByZXR1cm5zIHRoZW0gYXMgYW4gYXJyYXlcbiAgICogVGhpcyBtZXRob2QgY29sbGVjdHMgbWV0YWRhdGEgZnJvbSB2YXJpb3VzIFVJIGNsYXNzIGRlY29yYXRvcnMgaW5jbHVkaW5nIEB1aW1vZGVsLFxuICAgKiBAdWlsaXN0aXRlbSwgQHVpaGFuZGxlcnMsIGFuZCBAdWlsYXlvdXQgYXBwbGllZCB0byB0aGUgbW9kZWwgY2xhc3MuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gZXh0cmFjdCBtZXRhZGF0YSBmcm9tXG4gICAqIEByZXR1cm5zIHtVSUNsYXNzTWV0YWRhdGFbXX0gQXJyYXkgb2YgVUkgY2xhc3MgbWV0YWRhdGEgb2JqZWN0c1xuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBnZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YTxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKTogVUlDbGFzc01ldGFkYXRhW10gIHtcbiAgICByZXR1cm4gW1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSU1PREVMKSxcbiAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgKSxcbiAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVElURU0pLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUSVRFTSksXG4gICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksXG4gICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICksXG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxBWU9VVCksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxBWU9VVCksXG4gICAgICAgIE1vZGVsLmdldChtb2RlbC5jb25zdHJ1Y3Rvci5uYW1lKSBhcyBhbnlcbiAgICAgICksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGl0cyBuYXR1cmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHR5cGUgdGhhdCBpcyBpbmhlcmVudGx5IHZhbGlkYXRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIFVJIGtleSB0byBjaGVjay5cbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHR5cGUgaXMgdmFsaWRhdGFibGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlUeXBlKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlUeXBlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDaGVja3MgaWYgYSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIFVJIGtleSByZXByZXNlbnRzIGEgdmFsaWRhdGlvbiB0aGF0IGNhbiBiZSBhcHBsaWVkIGFzIGFuIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZSwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGlzVmFsaWRhdGFibGVCeUF0dHJpYnV0ZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyB2YWxpZGF0aW9uIG1ldGFkYXRhIHRvIGFuIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHN1bW1hcnkgVHJhbnNmb3JtcyB2YWxpZGF0aW9uIG1ldGFkYXRhIGludG8gYSB2YWx1ZSBzdWl0YWJsZSBmb3IgdXNlIGFzIGFuIEhUTUwgYXR0cmlidXRlLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIHZhbGlkYXRpb24ga2V5LlxuICAgKiBAcGFyYW0ge1ZhbGlkYXRpb25NZXRhZGF0YX0gdmFsdWUgLSBUaGUgdmFsaWRhdGlvbiBtZXRhZGF0YS5cbiAgICogQHJldHVybnMge3N0cmluZyB8IG51bWJlciB8IGJvb2xlYW59IFRoZSBjb252ZXJ0ZWQgYXR0cmlidXRlIHZhbHVlLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGdpdmVuIGtleSBpcyBub3QgdmFsaWRhdGFibGUgYnkgYXR0cmlidXRlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHRvQXR0cmlidXRlVmFsdWUoXG4gICAga2V5OiBzdHJpbmcsXG4gICAgdmFsdWU6IFZhbGlkYXRpb25NZXRhZGF0YVxuICApOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHtcbiAgICBpZiAoIU9iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmluY2x1ZGVzKGtleSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGF0dHJpYnV0ZSBrZXkgXCIke2tleX1cIi4gRXhwZWN0ZWQgb25lIG9mOiAke09iamVjdC5rZXlzKFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUpLmpvaW4oXCIsIFwiKX0uYFxuICAgICAgKTtcblxuICAgIHJldHVybiBrZXkgPT09IFVJS2V5cy5SRVFVSVJFRCA/IHRydWUgOiB2YWx1ZVtrZXldO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDb252ZXJ0cyBhIG1vZGVsIHRvIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICogQHN1bW1hcnkgUHJvY2Vzc2VzIGEgbW9kZWwgaW5zdGFuY2UsIGV4dHJhY3RpbmcgVUktcmVsYXRlZCBtZXRhZGF0YSBhbmQgdmFsaWRhdGlvbiBydWxlcyB0byBjcmVhdGUgYSBmaWVsZCBkZWZpbml0aW9uLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgVCBUeXBlIHJlZmVyZW5jaW5nIHRoZSBzcGVjaWZpYyBSZW5kZXJpbmcgZW5naW5lIGZpZWxkIHByb3BlcnRpZXMvaW5wdXRzXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgaW5zdGFuY2UgdG8gY29udmVydC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2dsb2JhbFByb3BzPXt9XSAtIEdsb2JhbCBwcm9wZXJ0aWVzIHRvIGFwcGx5IHRvIGFsbCBjaGlsZCBlbGVtZW50cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBbZ2VuZXJhdGVJZD10cnVlXSAtIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRvIHBvcHVsYXRlIHRoZSByZW5kZXJlcklkIHByb3BlcnR5LlxuICAgKiBAcmV0dXJucyB7RmllbGREZWZpbml0aW9uPFQ+fSBBIGZpZWxkIGRlZmluaXRpb24gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgVUkgc3RydWN0dXJlIG9mIHRoZSBtb2RlbC5cbiAgICogQHRocm93cyB7UmVuZGVyaW5nRXJyb3J9IElmIG5vIFVJIGRlZmluaXRpb25zIGFyZSBzZXQgZm9yIHRoZSBtb2RlbCBvciBpZiB0aGVyZSBhcmUgaW52YWxpZCBkZWNvcmF0b3JzLlxuICAgKlxuICAgKiBAbWVybWFpZFxuICAgKiBzZXF1ZW5jZURpYWdyYW1cbiAgICogIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gICAqICBwYXJ0aWNpcGFudCBSRSBhcyBSZW5kZXJpbmdFbmdpbmVcbiAgICogIHBhcnRpY2lwYW50IFIgYXMgUmVmbGVjdGlvblxuICAgKiAgcGFydGljaXBhbnQgTSBhcyBNb2RlbFxuICAgKiAgQy0+PlJFOiB0b0ZpZWxkRGVmaW5pdGlvbihtb2RlbCwgZ2xvYmFsUHJvcHMpXG4gICAqICBSRS0+PlI6IGdldE1ldGFkYXRhKFVJS2V5cy5VSU1PREVMLCBtb2RlbC5jb25zdHJ1Y3RvcilcbiAgICogIFItLT4+UkU6IFVJTW9kZWxNZXRhZGF0YVxuICAgKiAgUkUtPj5SOiBnZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT5cbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBWYWxpZGF0aW9uS2V5cy5SRUZMRUNUKVxuICAgKiAgUi0tPj5SRTogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPlxuICAgKiAgbG9vcCBGb3IgZWFjaCBwcm9wZXJ0eVxuICAgKiAgICBSRS0+PlJFOiBQcm9jZXNzIFVJIGRlY29yYXRvcnNcbiAgICogICAgUkUtPj5SRTogQXBwbHkgdmFsaWRhdGlvbiBydWxlc1xuICAgKiAgZW5kXG4gICAqICBSRS0tPj5DOiBGaWVsZERlZmluaXRpb248VD5cbiAgICovXG4gIHByb3RlY3RlZCB0b0ZpZWxkRGVmaW5pdGlvbjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuICAgIGdlbmVyYXRlSWQ6IGJvb2xlYW4gPSB0cnVlXG4gICk6IEZpZWxkRGVmaW5pdGlvbjxUPiB7XG4gICAgXG4gICAgY29uc3QgeyBpbmhlcml0UHJvcHMsIC4uLmdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzIH0gPSBnbG9iYWxQcm9wcztcbiAgICBnbG9iYWxQcm9wcyA9IGdsb2JhbFByb3BzV2l0aG91dEluaGVyaXRzO1xuXG4gICAgY29uc3QgY2xhc3NEZWNvcmF0b3JzID0gdGhpcy5nZXRDbGFzc0RlY29yYXRvcnNNZXRhZGF0YTxNPihtb2RlbCk7XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIGBObyB1aSBkZWZpbml0aW9ucyBzZXQgZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0uIERpZCB5b3UgdXNlIEB1aW1vZGVsP2BcbiAgICAgICk7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIC4uLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgIGluaGVyaXRQcm9wcyA/IGluaGVyaXRQcm9wcyA6IHt9IC8vIG92ZXJyaWRlIHRhZyBhbmQgcHJvcGVydGllcyB3aGVuIGl0IGlzIGEgY29tcG9uZW50IHRoYXQgc2hvdWxkIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIGl0cyBwYXJlbnQuXG4gICAgKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzIH0gPSBjbGFzc0RlY29yYXRvcjtcblxuICAgIGNvbnN0IHVpRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gPVxuICAgICAgUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgRGVjb3JhdG9yTWV0YWRhdGFbXVxuICAgICAgPjtcbiAgICBsZXQgY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PltdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjaGlsZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gaXRlbT8ucHJvcHMgfHwge307XG4gICAgbGV0IG1hcHBlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGdldFBhdGggPSAocGFyZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHBhcmVudCA/IFtwYXJlbnQsIHByb3BdLmpvaW4oXCIuXCIpIDogcHJvcDtcbiAgICB9O1xuXG4gICAgaWYgKHVpRGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY29yYXRvcnM6IFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W11cbiAgICAgID4gPSBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICkgYXMgUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPjtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVpRGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNzID0gdWlEZWNvcmF0b3JzW2tleV07XG4gICAgICAgIGNvbnN0IHR5cGVzID0gT2JqZWN0LnZhbHVlcyhkZWNzKS5maWx0ZXIoKHtrZXl9KSA9PiBbVUlLZXlzLlBST1AsIFVJS2V5cy5FTEVNRU5ULCBVSUtleXMuQ0hJTERdLmluY2x1ZGVzKGtleSkpO1xuICAgICAgICBpZiAodHlwZXM/Lmxlbmd0aCA+IDEpXG4gICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgYE9ubHkgb25lIHR5cGUgb2YgZGVjb3JhdGlvbiBpcyBhbGxvd2VkLiBQbGVhc2UgY2hvb3NlIGJldHdlZW4gQHVpcHJvcCwgQHVpY2hpbGQgb3IgQHVpZWxlbWVudGBcbiAgICAgICAgICApO1xuICAgICAgICBkZWNzLnNoaWZ0KCk7XG4gICAgICAgIGRlY3MuZm9yRWFjaCgoZGVjKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWMpIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgTm8gZGVjb3JhdG9yIGZvdW5kYCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGRlYy5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlBST1A6IHtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gZGVjLnByb3BzIGFzIFVJUHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkNISUxEOiB7XG4gICAgICAgICAgICAgIGlmICghTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgQ2hpbGQgXCIke2tleX1cIiBtdXN0IGJlIGEgbW9kZWwuYCk7XG5cbiAgICAgICAgICAgICAgbGV0IENsYXp6O1xuICAgICAgICAgICAgICBjb25zdCBzdWJtb2RlbCA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldIGFzIE1vZGVsO1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RhYmxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2Ygc3VibW9kZWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHN1Ym1vZGVsKTtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGluc3RhbmNlIGlmIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAoZGVjLnByb3BzLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgICAgICAgICAgICA/Lm5hbWUgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIENsYXp6ID0gbmV3IChNb2RlbC5nZXQoY2xhenpOYW1lKSBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBnbG9iYWxQcm9wcyB8fCB7fSwge1wibW9kZWxcIjogQ2xhenp9ICx7XG4gICAgICAgICAgICAgICAgaW5oZXJpdFByb3BzOiBkZWMucHJvcHMgYXMgVUlNb2RlbE1ldGFkYXRhLFxuICAgICAgICAgICAgICAgIGNoaWxkT2Y6IGdldFBhdGgoZ2xvYmFsUHJvcHM/LmNoaWxkT2YgYXMgc3RyaW5nLCBrZXkpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgY29uc3QgY2hpbGREZWZpbml0aW9uID0gdGhpcy50b0ZpZWxkRGVmaW5pdGlvbihcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCB8fCBDbGF6eiwgLy8gTXVzdCBhdm9pZCB1bmRlZmluZWQgdmFsdWVzIOKAlCBhbiBpbnN0YW5jZSBpcyByZXF1aXJlZCB0byByZXRyaWV2ZSBwcm9wZXJ0aWVzLlxuICAgICAgICAgICAgICAgIGNoaWxkcmVuR2xvYmFsUHJvcHMsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgY2hpbGRyZW4ucHVzaChcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24gYXMgRmllbGREZWZpbml0aW9uPFJlY29yZDxzdHJpbmcsIGFueT4+XG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuSElEREVOOiBcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBpZihkZWMucHJvcHM/Lm5hbWUpXG4gICAgICAgICAgICAgICAgbWFwcGVyW2RlYy5wcm9wcz8ubmFtZSBhcyBzdHJpbmddID0ga2V5O1xuICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICAgICAgICAgICAge30sXG4gICAgICAgICAgICAgICAgY2xhc3NEZWNvcmF0b3IucHJvcHM/Lml0ZW0gfHwge30sXG4gICAgICAgICAgICAgICAgaXRlbT8ucHJvcHMgfHwge30sXG4gICAgICAgICAgICAgICAgZGVjLnByb3BzPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBnbG9iYWxQcm9wc1xuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjaGlsZFByb3BzID0ge1xuICAgICAgICAgICAgICAgIHRhZzogaXRlbT8udGFnIHx8IHByb3BzLnJlbmRlciB8fCBcIlwiLFxuICAgICAgICAgICAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKFxuICAgICAgICAgICAgICAgICAge30sIFxuICAgICAgICAgICAgICAgICAgY2hpbGRQcm9wcz8ucHJvcHMsIFxuICAgICAgICAgICAgICAgICAgZGVjLmtleSA9PT0gVUlLZXlzLlVJTElTVFBST1AgPyB7IG1hcHBlciB9IDoge1tkZWMua2V5XTogZGVjLnByb3BzfSwgXG4gICAgICAgICAgICAgICAgICBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FTEVNRU5UOiB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgICAgICAgY29uc3QgdWlQcm9wczogVUlFbGVtZW50TWV0YWRhdGEgPSBkZWMucHJvcHMgYXMgVUlFbGVtZW50TWV0YWRhdGE7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcz8uY2hpbGRPZiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjaGlsZE9mOiB1bmRlZmluZWQsIC8vIFRoZSBjaGlsZE9mIHByb3AgaXMgcGFzc2VkIGJ5IGdsb2JhbFByb3BzIHdoZW4gaXQgaXMgYSBuZXN0ZWQgcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hpbGRQcm9wcz8ucHJvcHMsXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBjaGlsZERlZmluaXRpb246IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IHVpUHJvcHMudGFnLFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNzOiBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10gPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JzW1xuICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgXSBhcyBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W107XG5cbiAgICAgICAgICAgICAgY29uc3QgdHlwZURlYzogRGVjb3JhdG9yTWV0YWRhdGFPYmplY3QgPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNzLnNoaWZ0KCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIHZhbGlkYXRpb25EZWNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKGRlYy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbdGhpcy50cmFuc2xhdGUoZGVjLmtleSldID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0F0dHJpYnV0ZVZhbHVlKGRlYy5rZXksIGRlYy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5VHlwZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IEhUTUw1SW5wdXRUeXBlcy5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXSA9XG4gICAgICAgICAgICAgICAgICAgICAgZGVjLnByb3BzLmZvcm1hdCB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gZGVjLmtleTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljVHlwZSA9ICh0eXBlRGVjLnByb3BzIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgICAgYmFzaWNUeXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcy52YWx1ZSA9IGZvcm1hdEJ5VHlwZShcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdLFxuICAgICAgICAgICAgICAgIG1vZGVsW2tleSBhcyBrZXlvZiBNXSxcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSBVSUtleXMuVUlMQVlPVVRJVEVNOiBcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBJbnZhbGlkIGtleTogJHtkZWMua2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZ2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgZ2xvYmFsUHJvcHMsIHtcbiAgICAgIGhhbmRsZXJzOiBoYW5kbGVycyB8fCB7fSxcbiAgICB9KTtcbiAgICBjb25zdCByZXN1bHQ6IEZpZWxkRGVmaW5pdGlvbjxUPiA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgaXRlbTogY2hpbGRQcm9wcyBhcyBVSUxpc3RJdGVtRWxlbWVudE1ldGFkYXRhLFxuICAgICAgcHJvcHM6IGdsb2JhbFByb3BzIGFzIFQgJiBGaWVsZFByb3BlcnRpZXMsXG4gICAgICBjaGlsZHJlbjogKChPYmplY3Qua2V5cyh1aURlY29yYXRvcnMpPy5sZW5ndGggJiYgY2hpbGRyZW4/Lmxlbmd0aCkgPyBcbiAgICAgICAgdGhpcy5nZXRMYXlvdXRJdGVtcyhjaGlsZHJlbiwgdWlEZWNvcmF0b3JzKSA6IGNoaWxkcmVuKSxcbiAgICBcbiAgICB9O1xuXG4gICAgaWYgKGdlbmVyYXRlSWQpIHJlc3VsdC5yZW5kZXJlcklkID0gZ2VuZXJhdGVVSU1vZGVsSUQobW9kZWwpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFByb2Nlc3NlcyBsYXlvdXQgaXRlbXMgZm9yIGdyaWQgcG9zaXRpb25pbmdcbiAgICogQHN1bW1hcnkgTWFwcyBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGxheW91dCBwb3NpdGlvbnNcbiAgICogVGhpcyBtZXRob2QgaXRlcmF0ZXMgdGhyb3VnaCBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyBhbmQgYXBwbGllcyBsYXlvdXQgbWV0YWRhdGFcbiAgICogZnJvbSBAdWlsYXlvdXRpdGVtIGRlY29yYXRvcnMgdG8gcG9zaXRpb24gdGhlbSBjb3JyZWN0bHkgaW4gYSBncmlkIGxheW91dC5cbiAgICpcbiAgICogQHBhcmFtIHtGaWVsZERlZmluaXRpb25bXX0gY2hpbGRyZW4gLSBBcnJheSBvZiBjaGlsZCBmaWVsZCBkZWZpbml0aW9ucyB0byBwcm9jZXNzXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gdWlEZWNvcmF0b3JzIC0gVUkgZGVjb3JhdG9yIG1ldGFkYXRhIGtleWVkIGJ5IHByb3BlcnR5IG5hbWVcbiAgICogQHJldHVybnMge0ZpZWxkRGVmaW5pdGlvbltdfSBBcnJheSBvZiBmaWVsZCBkZWZpbml0aW9ucyB3aXRoIGxheW91dCBwb3NpdGlvbmluZyBhcHBsaWVkXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIC8vIEludGVybmFsIHVzYWdlIC0gcG9zaXRpb25zIGNoaWxkcmVuIGluIGdyaWQgbGF5b3V0XG4gICAqIGNvbnN0IGxheW91dENoaWxkcmVuID0gdGhpcy5nZXRMYXlvdXRJdGVtcyhjaGlsZERlZmluaXRpb25zLCBkZWNvcmF0b3JNZXRhZGF0YSk7XG4gICAqL1xuICBnZXRMYXlvdXRJdGVtcyhjaGlsZHJlbjogRmllbGREZWZpbml0aW9uPGFueT5bXSwgdWlEZWNvcmF0b3JzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KTogRmllbGREZWZpbml0aW9uPGFueT5bXSB7XG4gICAgcmV0dXJuIGNoaWxkcmVuLm1hcCgoY2hpbGQpID0+IHtcbiAgICAgIGxldCB1cGRhdGVkQ2hpbGQgPSBjaGlsZDtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHVpRGVjb3JhdG9ycykge1xuICAgICAgICBjb25zdCBkZWNzID0gdWlEZWNvcmF0b3JzW2tleV07XG4gICAgICAgIGZvciAoY29uc3QgZGVjIG9mIGRlY3MpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkZWMua2V5ID09PSBVSUtleXMuVUlMQVlPVVRJVEVNICYmXG4gICAgICAgICAgICAoZGVjLnByb3BzPy5uYW1lID09PSBjaGlsZC5wcm9wcz8ubmFtZSB8fCBkZWMucHJvcHM/Lm5hbWUgPT09IGNoaWxkLnByb3BzPy5jaGlsZE9mKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc3QgeyBjb2wsIHByb3BzLCByb3cgfSA9IGRlYy5wcm9wcyBhcyBVSUxheW91dEl0ZW1NZXRhZGF0YTtcbiAgICAgICAgICAgIHVwZGF0ZWRDaGlsZCA9IHtcbiAgICAgICAgICAgICAgcm93LFxuICAgICAgICAgICAgICBjb2wsXG4gICAgICAgICAgICAgIC4uLmNoaWxkLFxuICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgIC4uLmNoaWxkLnByb3BzLFxuICAgICAgICAgICAgICAgIC4uLnByb3BzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHVwZGF0ZWRDaGlsZDtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVuZGVycyBhIG1vZGVsIHdpdGggZ2xvYmFsIHByb3BlcnRpZXMgYW5kIGFkZGl0aW9uYWwgYXJndW1lbnRzLlxuICAgKiBAc3VtbWFyeSBBYnN0cmFjdCBtZXRob2QgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3NlcyB0byBkZWZpbmUgc3BlY2lmaWMgcmVuZGVyaW5nIGJlaGF2aW9yLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAdGVtcGxhdGUgUiBSZW5kZXJpbmcgZW5naW5lIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIG91dHB1dCB0eXBlXG4gICAqIEBwYXJhbSB7TX0gbW9kZWwgLSBUaGUgbW9kZWwgdG8gYmUgcmVuZGVyZWQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGdsb2JhbFByb3BzIC0gR2xvYmFsIHByb3BlcnRpZXMgdG8gYmUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMgZHVyaW5nIHJlbmRlcmluZy5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgbWF5IGJlIHJlcXVpcmVkIGZvciBzcGVjaWZpYyByZW5kZXJpbmcgaW1wbGVtZW50YXRpb25zLlxuICAgKiBAcmV0dXJucyB7Un0gVGhlIHJlbmRlcmVkIHJlc3VsdCwgdHlwZSBkZXBlbmRzIG9uIHRoZSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi5cbiAgICpcbiAgICogQGFic3RyYWN0XG4gICAqL1xuICBhYnN0cmFjdCByZW5kZXI8TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgLi4uYXJnczogYW55W11cbiAgKTogUjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlZ2lzdGVycyBhIHJlbmRlcmluZyBlbmdpbmUgaW5zdGFuY2UuXG4gICAqIEBzdW1tYXJ5IEFkZHMgYSByZW5kZXJpbmcgZW5naW5lIHRvIHRoZSBzdGF0aWMgY2FjaGUgYW5kIHNldHMgaXQgYXMgdGhlIGN1cnJlbnQgZW5naW5lLlxuICAgKlxuICAgKiBAcGFyYW0ge1JlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPn0gZW5naW5lIC0gVGhlIHJlbmRlcmluZyBlbmdpbmUgdG8gcmVnaXN0ZXIuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIGFuIGVuZ2luZSB3aXRoIHRoZSBzYW1lIGZsYXZvciBhbHJlYWR5IGV4aXN0cy5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlZ2lzdGVyKGVuZ2luZTogUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+KSB7XG4gICAgaWYgKGVuZ2luZS5mbGF2b3VyIGluIHRoaXMuY2FjaGUpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtlbmdpbmUuZmxhdm91cn0gYWxyZWFkeSBleGlzdHNgXG4gICAgICApO1xuICAgIHRoaXMuY2FjaGVbZW5naW5lLmZsYXZvdXJdID0gZW5naW5lO1xuICAgIHRoaXMuY3VycmVudCA9IGVuZ2luZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIG9yIGluaXRpYWxpemVzIGEgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgR2V0cyBhbiBleGlzdGluZyBlbmdpbmUgaW5zdGFuY2Ugb3IgY3JlYXRlcyBhbmQgaW5pdGlhbGl6ZXMgYSBuZXcgb25lIGlmIGdpdmVuIGEgY29uc3RydWN0b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge0NvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz59IG9iaiAtIFRoZSBlbmdpbmUgaW5zdGFuY2Ugb3IgY29uc3RydWN0b3IuXG4gICAqIEByZXR1cm5zIHtSZW5kZXJpbmdFbmdpbmU8Tz59IFRoZSBpbml0aWFsaXplZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBnZXRPckJvb3Q8Tz4oXG4gICAgb2JqOiBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICk6IFJlbmRlcmluZ0VuZ2luZTxPPiB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIFJlbmRlcmluZ0VuZ2luZSkgcmV0dXJuIG9iaiBhcyBSZW5kZXJpbmdFbmdpbmU8Tz47XG4gICAgY29uc3QgZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8Tz4gPSBuZXcgb2JqKCk7XG4gICAgZW5naW5lLmluaXRpYWxpemUoKTsgLy8gbWFrZSB0aGUgYm9vdGluZyBhc3luYy4gdXNlIHRoZSBpbml0aWFsaXplZCBmbGFnIHRvIGNvbnRyb2wgaXRcbiAgICByZXR1cm4gZW5naW5lIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmV0cmlldmVzIGEgcmVuZGVyaW5nIGVuZ2luZSBieSBmbGF2b3IuXG4gICAqIEBzdW1tYXJ5IEdldHMgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBvciBhIHNwZWNpZmljIG9uZSBieSBmbGF2b3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBPIFRoZSB0eXBlIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIG91dHB1dFxuICAgKiBAcGFyYW0ge3N0cmluZ30gW2ZsYXZvdXJdIC0gVGhlIGZsYXZvciBvZiB0aGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIHJlcXVlc3RlZCByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiB0aGUgcmVxdWVzdGVkIGZsYXZvciBkb2VzIG5vdCBleGlzdC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGdldDxPPihmbGF2b3VyPzogc3RyaW5nKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAoIWZsYXZvdXIpXG4gICAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICAgIHRoaXMuY3VycmVudCBhcyBDb25zdHJ1Y3RvcjxSZW5kZXJpbmdFbmdpbmU8Tz4+IHwgUmVuZGVyaW5nRW5naW5lPE8+XG4gICAgICApO1xuICAgIGlmICghKGZsYXZvdXIgaW4gdGhpcy5jYWNoZSkpXG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxFcnJvcihcbiAgICAgICAgYFJlbmRlcmluZyBlbmdpbmUgdW5kZXIgJHtmbGF2b3VyfSBkb2VzIG5vdCBleGlzdGBcbiAgICAgICk7XG4gICAgcmV0dXJuIHRoaXMuZ2V0T3JCb290PE8+KFxuICAgICAgdGhpcy5jYWNoZVtmbGF2b3VyXSBhc1xuICAgICAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj5cbiAgICAgICAgfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgdGhlIGNvcnJlY3QgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbCBhbmQgaW52b2tlcyBpdHMgcmVuZGVyIG1ldGhvZC5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byByZW5kZXIuXG4gICAqIEBwYXJhbSB7Li4uYW55W119IGFyZ3MgLSBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXIgbWV0aG9kLlxuICAgKiBAcmV0dXJucyB7YW55fSBUaGUgcmVzdWx0IG9mIHRoZSByZW5kZXJpbmcgcHJvY2Vzcy5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgbm8gcmVnaXN0ZXJlZCBtb2RlbCBpcyBmb3VuZC5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNLCAuLi5hcmdzOiBhbnlbXSk6IGFueSB7XG4gICAgY29uc3QgY29uc3RydWN0b3IgPVxuICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIHx8IE1vZGVsLmZyb21PYmplY3QobW9kZWwpO1xuICAgIGlmICghY29uc3RydWN0b3IpIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFwiTm8gbW9kZWwgcmVnaXN0ZXJlZCBmb3VuZFwiKTtcbiAgICBjb25zdCBmbGF2b3VyID0gUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlJFTkRFUkVEX0JZKSxcbiAgICAgIGNvbnN0cnVjdG9yIGFzIE1vZGVsQ29uc3RydWN0b3I8TW9kZWw+XG4gICAgKTtcblxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgZm9yIHRoZSB2YXIgYXJncyB0eXBlIGNoZWNrXG4gICAgcmV0dXJuIFJlbmRlcmluZ0VuZ2luZS5nZXQoZmxhdm91cikucmVuZGVyKG1vZGVsLCAuLi5hcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gR2VuZXJhdGVzIGEgbWV0YWRhdGEga2V5IGZvciBVSS1yZWxhdGVkIHByb3BlcnRpZXMuXG4gICAqIEBzdW1tYXJ5IFByZWZpeGVzIGEgZ2l2ZW4ga2V5IHdpdGggdGhlIFVJIHJlZmxlY3Rpb24gcHJlZml4LlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IC0gVGhlIGtleSB0byBwcmVmaXguXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBwcmVmaXhlZCBrZXkuXG4gICAqXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHN0YXRpYyBrZXkoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHtVSUtleXMuUkVGTEVDVH0ke2tleX1gO1xuICB9XG59XG4iLCJpbXBvcnQgeyBVSUtleXMgfSBmcm9tIFwiLi4vdWkvY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBhcHBseSwgbWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuLi91aS9SZW5kZXJpbmdcIjtcbmltcG9ydCB7IFVJTGlzdEl0ZW1Nb2RlbE1ldGFkYXRhLCBVSU1lZGlhQnJlYWtQb2ludHMsIFVJTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi91aS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgY2xhc3MgYXMgYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgQWRkcyByZW5kZXJpbmcgY2FwYWJpbGl0aWVzIHRvIGEgbW9kZWwgY2xhc3MgYnkgcHJvdmlkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLlxuICogVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWltb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIGNsYXNzIFVzZXJQcm9maWxlIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgnZGl2JywgeyBjbGFzczogJ3VzZXItY2FyZCcgfSlcbiAqIGNsYXNzIFVzZXJDYXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGNvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IGluc3RhbmNlXG4gKiAgIFN5c3RlbS0+PnVpbW9kZWw6ZG8oY29uc3RydWN0b3IpXG4gKiAgIHVpbW9kZWwtPj5jb25zdHJ1Y3RvcjogRXhlY3V0ZXMgdGhlIGNvbnN0cnVjdG9yXG4gKiAgIGNvbnN0cnVjdG9yLT4+dWltb2RlbDogcmV0dXJucyBpbnN0YW5jZVxuICogICB1aW1vZGVsLT4+aW5zdGFuY2U6IGFkZHMgdGhlIHJlbmRlciBtZXRob2RcbiAqICAgdWltb2RlbC0+PlN5c3RlbTogcmV0dXJucyBVSU1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW1vZGVsKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgbW9kZWwgd2l0aCBhIHNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzcyxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5naW5lIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHJlbmRlcmVkQnlcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNwZWNpZnkgYSBjdXN0b20gcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbFxuICogQHVpbW9kZWwoKVxuICogQHJlbmRlcmVkQnkoJ3JlYWN0JylcbiAqIGNsYXNzIFJlYWN0Q29tcG9uZW50IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCByZW5kZXJlZEJ5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj5yZW5kZXJlZEJ5OiBhcHBseSB0byBNb2RlbFxuICogICByZW5kZXJlZEJ5LT4+TW9kZWw6IGFkZHMgZW5naW5lIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIHNwZWNpZmllZCBlbmdpbmVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggY3VzdG9tIGVuZ2luZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUkVOREVSRURfQlkpLCBlbmdpbmUpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgdGFncyBhIG1vZGVsIGFzIGEgbGlzdCBpdGVtIGZvciBVSSByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBtb2RlbCBzaG91bGQgYmUgcmVuZGVyZWQgd2hlbiBkaXNwbGF5ZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIGNsYXNzIHRoYXQgZW5hYmxlcyBpdCB0byBiZSByZW5kZXJlZCBhcyBhIGxpc3QgaXRlbVxuICogYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuIFRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIHdoZW4gaXQgYXBwZWFycyBpbiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIFRoZSBIVE1MIHRhZyB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBtb2RlbCBhcyBhIGxpc3QgaXRlbSAoZGVmYXVsdHMgdG8gY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgcmVuZGVyZWQgbGlzdCBpdGVtIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3RpdGVtXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgdGFnIChjbGFzcyBuYW1lKVxuICogQHVpbW9kZWwoKVxuICogQHVpbGlzdGl0ZW0oKVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3RpdGVtKCdsaScsIHsgY2xhc3M6ICdsaXN0LWdyb3VwLWl0ZW0nIH0pXG4gKiBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxpc3RpdGVtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxpc3RpdGVtOiBhcHBseSB0byBNb2RlbFxuICogICB1aWxpc3RpdGVtLT4+TW9kZWw6IGFkZHMgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIGxpc3QgaXRlbSBtZXRhZGF0YSB3aGVuIGluIGxpc3QgY29udGV4dFxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBsaXN0IGl0ZW0gc3R5bGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0aXRlbSh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUxpc3RJdGVtTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgdGFnOiB0YWcgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSwgbWV0YSkob3JpZ2luYWwpO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBhZGRzIGV2ZW50IGhhbmRsZXJzIHRvIGEgVUkgbW9kZWxcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBldmVudCBoYW5kbGVycyB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgbW9kZWxcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGV2ZW50IGhhbmRsZXJzIHRoYXQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiBhdHRhY2hlZCB0byB0aGUgcmVuZGVyZWQgVUkgZWxlbWVudC4gVGhlIGhhbmRsZXJzIGFyZSBwYXNzZWQgYXMgcHJvcGVydGllc1xuICogdG8gdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIE9iamVjdCBjb250YWluaW5nIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25zIGFuZCBvdGhlciBwcm9wZXJ0aWVzXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWloYW5kbGVyc1xuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQWRkIGV2ZW50IGhhbmRsZXJzIHRvIGEgbW9kZWxcbiAqIEB1aW1vZGVsKCdidXR0b24nKVxuICogQHVpaGFuZGxlcnMoe1xuICogICBvbkNsaWNrOiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdCdXR0b24gY2xpY2tlZCcpLFxuICogICBvbk1vdXNlT3ZlcjogKGV2ZW50KSA9PiBjb25zb2xlLmxvZygnTW91c2Ugb3ZlciBidXR0b24nKSxcbiAqICAgZGlzYWJsZWQ6IGZhbHNlXG4gKiB9KVxuICogY2xhc3MgQ2xpY2thYmxlQnV0dG9uIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBBZGQgZm9ybSBzdWJtaXNzaW9uIGhhbmRsZXJzXG4gKiBAdWltb2RlbCgnZm9ybScpXG4gKiBAdWloYW5kbGVycyh7XG4gKiAgIG9uU3VibWl0OiAoZXZlbnQpID0+IHtcbiAqICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICogICAgIGNvbnNvbGUubG9nKCdGb3JtIHN1Ym1pdHRlZCcpO1xuICogICB9LFxuICogICBvblJlc2V0OiAoZXZlbnQpID0+IGNvbnNvbGUubG9nKCdGb3JtIHJlc2V0JylcbiAqIH0pXG4gKiBjbGFzcyBDb250YWN0Rm9ybSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBTeXN0ZW1cbiAqICAgcGFydGljaXBhbnQgdWloYW5kbGVyc1xuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgU3lzdGVtLT4+dWloYW5kbGVyczogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWloYW5kbGVycy0+Pk1vZGVsOiBhZGRzIGhhbmRsZXIgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyB3aXRoIGhhbmRsZXJzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiByZW5kZXJzIGVsZW1lbnQgd2l0aCBldmVudCBoYW5kbGVycyBhdHRhY2hlZFxuICogICBVSS0+Pk1vZGVsOiB0cmlnZ2VycyBoYW5kbGVycyBvbiBldmVudHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpaGFuZGxlcnMocHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHJldHVybiAob3JpZ2luYWw6IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGEgPSB7XG4gICAgICBoYW5kbGVyczogcHJvcHNcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5IQU5ETEVSUyksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY3JlYXRlcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBncmlkIHNwZWNpZmljYXRpb25zXG4gKiBAc3VtbWFyeSBDb21iaW5lcyBVSSBtb2RlbCBmdW5jdGlvbmFsaXR5IHdpdGggbGF5b3V0IGdyaWQgY29uZmlndXJhdGlvblxuICogVGhpcyBkZWNvcmF0b3IgY3JlYXRlcyBhIFVJIG1vZGVsIHRoYXQgYWN0cyBhcyBhIGxheW91dCBjb250YWluZXIgd2l0aCBzcGVjaWZpZWRcbiAqIGNvbHVtbiBhbmQgcm93IGNvbmZpZ3VyYXRpb25zLiBJdCdzIGEgY29udmVuaWVuY2UgZGVjb3JhdG9yIHRoYXQgY29tYmluZXNcbiAqIEB1aW1vZGVsIHdpdGggbGF5b3V0LXNwZWNpZmljIHByb3BlcnRpZXMgZm9yIHJlc3BvbnNpdmUgZ3JpZCBsYXlvdXRzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIEhUTUwgdGFnIHRvIHVzZSBmb3IgdGhlIGxheW91dCBjb250YWluZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSBbY29scz0xXSBOdW1iZXIgb2YgY29sdW1ucyBpbiB0aGUgZ3JpZCBsYXlvdXRcbiAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ1tdfSBbcm93cz0xXSBOdW1iZXIgb2Ygcm93cyBvciBhcnJheSBvZiByb3cgZGVmaW5pdGlvbnNcbiAqIEBwYXJhbSB7VUlNZWRpYUJyZWFrUG9pbnRzfSBbYnJlYWtwb2ludD0nbSddIE1lZGlhIGJyZWFrcG9pbnQgZm9yIHJlc3BvbnNpdmUgYmVoYXZpb3JcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxheW91dFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQ3JlYXRlIGEgc2ltcGxlIDItY29sdW1uIGxheW91dFxuICogQHVpbGF5b3V0KCdkaXYnLCAyLCAzKVxuICogY2xhc3MgVHdvQ29sdW1uTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKVxuICogICBoZWFkZXI6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDIpXG4gKiAgIGxlZnRDb250ZW50OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgyLCAyKVxuICogICByaWdodENvbnRlbnQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiAvLyBDcmVhdGUgYSByZXNwb25zaXZlIGxheW91dCB3aXRoIGN1c3RvbSBicmVha3BvaW50XG4gKiBAdWlsYXlvdXQoJ3NlY3Rpb24nLCAzLCAyLCAnbCcpXG4gKiBjbGFzcyBSZXNwb25zaXZlTGF5b3V0IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAxKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMiwgMSlcbiAqICAgc3VidGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxheW91dFxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxheW91dDogYXBwbHkgdG8gTW9kZWxcbiAqICAgdWlsYXlvdXQtPj51aW1vZGVsOiBjYWxsIHdpdGggbGF5b3V0IHByb3BzXG4gKiAgIHVpbW9kZWwtPj5Nb2RlbDogYWRkcyBtb2RlbCBtZXRhZGF0YSB3aXRoIGxheW91dCBjb25maWdcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IHJlcXVlc3RzIHJlbmRlcmluZyBhcyBsYXlvdXQgY29udGFpbmVyXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlN5c3RlbTogcmVuZGVycyBncmlkIGxheW91dCB3aXRoIHNwZWNpZmllZCBkaW1lbnNpb25zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxheW91dCh0YWc6IHN0cmluZywgY29sczogbnVtYmVyID0gMSwgcm93czogbnVtYmVyIHwgc3RyaW5nW10gPSAxLCBicmVha3BvaW50OiBVSU1lZGlhQnJlYWtQb2ludHMgPSAnbScpIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIHJldHVybiB1aW1vZGVsKHRhZywge2NvbHMsIHJvd3MsIGJyZWFrcG9pbnR9KShvcmlnaW5hbCwgcHJvcGVydHlLZXkpO1xuICB9O1xufSIsIi8qKlxuICogQGRlc2NyaXB0aW9uIE1vZHVsZSB0aGF0IGV4dGVuZHMgdGhlIE1vZGVsIHByb3RvdHlwZSB3aXRoIHJlbmRlcmluZyBjYXBhYmlsaXRpZXNcbiAqIEBzdW1tYXJ5IEFkZHMgdGhlIHJlbmRlciBtZXRob2QgdG8gYWxsIE1vZGVsIGluc3RhbmNlcyBmcm9tIGRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBUaGlzIG1vZHVsZSBpbXBsZW1lbnRzIHRoZSBSZW5kZXJhYmxlIGludGVyZmFjZSBmb3IgdGhlIE1vZGVsIGNsYXNzIGJ5IGFkZGluZyBhIHJlbmRlciBtZXRob2RcbiAqIHRvIGl0cyBwcm90b3R5cGUuIFRoaXMgYWxsb3dzIGFueSBNb2RlbCBpbnN0YW5jZSB0byBiZSByZW5kZXJlZCB1c2luZyB0aGUgUmVuZGVyaW5nRW5naW5lLlxuICogQG1vZHVsZSBtb2RlbC9vdmVycmlkZXNcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy9tb2RlbFxuICovXG5cbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4uL3VpL1JlbmRlcmluZ1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIHRoZSBtb2RlbCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIGVuZ2luZVxuICogQHN1bW1hcnkgRGVsZWdhdGVzIHJlbmRlcmluZyB0byB0aGUgUmVuZGVyaW5nRW5naW5lIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhXG4gKiBUaGlzIG1ldGhvZCBpbXBsZW1lbnRzIHRoZSByZW5kZXIgbWV0aG9kIGZyb20gdGhlIFJlbmRlcmFibGUgaW50ZXJmYWNlIGZvciBhbGwgTW9kZWwgaW5zdGFuY2VzLlxuICogSXQgdXNlcyB0aGUgUmVuZGVyaW5nRW5naW5lIHRvIGRldGVybWluZSBob3cgdG8gcmVuZGVyIHRoZSBtb2RlbCBiYXNlZCBvbiBpdHMgbWV0YWRhdGEuXG4gKlxuICogQHRlbXBsYXRlIE0gVHlwZSBvZiB0aGUgbW9kZWwgYmVpbmcgcmVuZGVyZWRcbiAqIEBwYXJhbSB7YW55W119IGFyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcmVuZGVyaW5nIGVuZ2luZVxuICogQHJldHVybiB7YW55fSBUaGUgcmVuZGVyZWQgb3V0cHV0IGluIHRoZSBmb3JtYXQgZGV0ZXJtaW5lZCBieSB0aGUgcmVuZGVyaW5nIGVuZ2luZVxuICovXG5Nb2RlbC5wcm90b3R5cGUucmVuZGVyID0gZnVuY3Rpb24gPE0gZXh0ZW5kcyBNb2RlbD4odGhpczogTSwgLi4uYXJnczogYW55W10pIHtcbiAgcmV0dXJuIFJlbmRlcmluZ0VuZ2luZS5yZW5kZXIodGhpcywgLi4uYXJncyk7XG59O1xuIiwiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHsgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBwcm9wTWV0YWRhdGEgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBDcnVkT3BlcmF0aW9uS2V5cyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJTGF5b3V0SXRlbU1ldGFkYXRhLFxuICBVSUxpc3RQcm9wTWV0YWRhdGEsXG4gIFVJUHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4vUmVuZGVyaW5nXCI7XG5pbXBvcnQgeyBPcGVyYXRpb25LZXlzIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IGhpZGVzIGEgcHJvcGVydHkgZHVyaW5nIHNwZWNpZmljIENSVUQgb3BlcmF0aW9uc1xuICogQHN1bW1hcnkgQ29udHJvbHMgcHJvcGVydHkgdmlzaWJpbGl0eSBiYXNlZCBvbiBvcGVyYXRpb24gdHlwZVxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHdoaWNoIENSVUQgb3BlcmF0aW9ucyBzaG91bGQgaGlkZSBhIHByb3BlcnR5XG4gKiBpbiB0aGUgVUkuIFRoZSBwcm9wZXJ0eSB3aWxsIG9ubHkgYmUgdmlzaWJsZSBkdXJpbmcgb3BlcmF0aW9ucyBub3Qgc3BlY2lmaWVkLlxuICpcbiAqIEBwYXJhbSBvcGVyYXRpb25zIC0gVGhlIENSVUQgb3BlcmF0aW9ucyBkdXJpbmcgd2hpY2ggdGhlIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRlT25cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIEhpZGUgdGhlIHBhc3N3b3JkIGZpZWxkIGR1cmluZyBSRUFEIG9wZXJhdGlvbnNcbiAqIGNsYXNzIFVzZXIge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAaGlkZU9uKE9wZXJhdGlvbktleXMuUkVBRClcbiAqICAgcGFzc3dvcmQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGhpZGVPblxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgVUlcbiAqICAgTW9kZWwtPj5oaWRlT246IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIGhpZGVPbi0+Pk1vZGVsOiBBZGQgaGlkZGVuIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBDaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gaGlkZGVuIG9wZXJhdGlvbnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IFJlbmRlciBvciBoaWRlIGJhc2VkIG9uIGN1cnJlbnQgb3BlcmF0aW9uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRlT24oLi4ub3BlcmF0aW9uczogQ3J1ZE9wZXJhdGlvbktleXNbXSkge1xuICByZXR1cm4gcHJvcE1ldGFkYXRhPENydWRPcGVyYXRpb25LZXlzW10+KFxuICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhJRERFTiksXG4gICAgb3BlcmF0aW9uc1xuICApO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBjb21wbGV0ZWx5IGhpZGVzIGEgcHJvcGVydHkgaW4gYWxsIFVJIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IE1ha2VzIGEgcHJvcGVydHkgaW52aXNpYmxlIGluIGFsbCBDUlVEIG9wZXJhdGlvbnNcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIGEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgaGlkZU9uIHRoYXQgaGlkZXMgYSBwcm9wZXJ0eVxuICogZHVyaW5nIGFsbCBDUlVEIG9wZXJhdGlvbnMgKENSRUFURSwgUkVBRCwgVVBEQVRFLCBERUxFVEUpLlxuICpcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiBoaWRkZW5cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIENvbXBsZXRlbHkgaGlkZSB0aGUgaW50ZXJuYWxJZCBmaWVsZCBpbiB0aGUgVUlcbiAqIGNsYXNzIFByb2R1Y3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEBoaWRkZW4oKVxuICogICBpbnRlcm5hbElkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRkZW5cbiAqICAgcGFydGljaXBhbnQgaGlkZU9uXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBNb2RlbC0+PmhpZGRlbjogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgaGlkZGVuLT4+aGlkZU9uOiBDYWxsIHdpdGggYWxsIG9wZXJhdGlvbnNcbiAqICAgaGlkZU9uLT4+TW9kZWw6IEFkZCBoaWRkZW4gbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IENoZWNrIGlmIHByb3BlcnR5IHNob3VsZCBiZSBoaWRkZW5cbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBhbGwgb3BlcmF0aW9uc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogQWx3YXlzIGhpZGUgcHJvcGVydHlcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhpZGRlbigpIHtcbiAgcmV0dXJuIGhpZGVPbihcbiAgICBPcGVyYXRpb25LZXlzLkNSRUFURSxcbiAgICBPcGVyYXRpb25LZXlzLlJFQUQsXG4gICAgT3BlcmF0aW9uS2V5cy5VUERBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5ERUxFVEVcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSByZW5kZXJlZCBhcyBhIFVJIGVsZW1lbnRcbiAqIEBzdW1tYXJ5IE1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIHNwZWNpZmljIFVJIGVsZW1lbnQgd2l0aCBjdXN0b20gcHJvcGVydGllc1xuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgd2hpY2ggSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCBzaG91bGQgYmUgdXNlZFxuICogdG8gcmVuZGVyIGEgc3BlY2lmaWMgcHJvcGVydHksIGFsb25nIHdpdGggYW55IGFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoYXQgZWxlbWVudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIHVzZSBmb3IgcmVuZGVyaW5nXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGVsZW1lbnRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3NlcmlhbGl6ZT1mYWxzZV0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWVsZW1lbnRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFJlbmRlciBhIHByb3BlcnR5IGFzIGEgdGV4dCBpbnB1dFxuICogY2xhc3MgTG9naW5Gb3JtIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAndGV4dCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgdXNlcm5hbWUnIH0pXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnaW5wdXQnLCB7IHR5cGU6ICdwYXNzd29yZCcsIHBsYWNlaG9sZGVyOiAnRW50ZXIgcGFzc3dvcmQnIH0pXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpZWxlbWVudCgnYnV0dG9uJywgeyBjbGFzczogJ2J0bi1wcmltYXJ5JyB9KVxuICogICBzdWJtaXQ6IHN0cmluZyA9ICdMb2dpbic7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWVsZW1lbnRcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+dWllbGVtZW50OiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWVsZW1lbnQtPj5Nb2RlbDogQWRkIGVsZW1lbnQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gdGFnIGFuZCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5VSTogUmVuZGVyIHdpdGggc3BlY2lmaWVkIGVsZW1lbnRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpZWxlbWVudChcbiAgdGFnOiBzdHJpbmcsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PixcbiAgc2VyaWFsaXplOiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnksIHByb3BlcnR5S2V5PzogYW55KSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwge1xuICAgICAgICBuYW1lOiBwcm9wZXJ0eUtleSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICByZXR1cm4gcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkVMRU1FTlQpLCBtZXRhZGF0YSkoXG4gICAgICBvcmlnaW5hbCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHBhc3NlZCB0byBhIFVJIGNvbXBvbmVudFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgaG93IGEgbW9kZWwgcHJvcGVydHkgc2hvdWxkIGJlIG1hcHBlZCB0b1xuICogYSBwcm9wZXJ0eSBvZiB0aGUgVUkgY29tcG9uZW50IHdoZW4gcmVuZGVyaW5nLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmVcbiAqIGRlY29yYXRlZCB3aXRoIEB1aW1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcHJvcE5hbWVdIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzdHJpbmdpZnk9ZmFsc2VdIFdoZXRoZXIgdG8gc3RyaW5naWZ5IHRoZSBwcm9wZXJ0eSB2YWx1ZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpcHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gTWFwIG1vZGVsIHByb3BlcnRpZXMgdG8gY29tcG9uZW50IHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICdmdWxsTmFtZScgdG8gdGhlIGNvbXBvbmVudFxuICogICBmdWxsTmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoJ3VzZXJFbWFpbCcpIC8vIFdpbGwgYmUgcGFzc2VkIGFzICd1c2VyRW1haWwnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRGF0YScsIHRydWUpIC8vIFdpbGwgYmUgcGFzc2VkIGFzIHN0cmluZ2lmaWVkIEpTT05cbiAqICAgdXNlckRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aXByb3BcbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IENvbXBvbmVudFxuICogICBNb2RlbC0+PnVpcHJvcDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWlwcm9wLT4+TW9kZWw6IEFkZCBwcm9wIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgc3RyaW5naWZ5IGZsYWdcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpcHJvcChcbiAgcHJvcE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZCxcbiAgc3RyaW5naWZ5OiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJUHJvcE1ldGFkYXRhID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBzdHJpbmdpZnk6IHN0cmluZ2lmeSxcbiAgICB9O1xuICAgIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5QUk9QKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbmVzdGVkIG1vZGVsIHByb3BlcnR5IHRvIGEgVUkgY29tcG9uZW50IHByb3BlcnR5LlxuICogQHN1bW1hcnkgRGVmaW5lcyBob3cgYSBwYXJlbnQgY29tcG9uZW50IHNob3VsZCByZW5kZXIgdGhlIGNoaWxkIG1vZGVsIHdoZW4gbmVzdGVkLlxuICpcbiAqIFRoaXMgZGVjb3JhdG9yIGlzIHVzZWQgdG8gZGVjb3JhdGUgcHJvcGVydGllcyB0aGF0IGFyZSBuZXN0ZWQgbW9kZWxzLlxuICogV2hlbiBhcHBsaWVkLCBpdCBhbGxvd3Mgb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCB0YWcgb2YgdGhlIGNoaWxkIG1vZGVsIHdpdGggdGhlIHByb3ZpZGVkIG9uZSxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgYmVoYXZpb3Igd2hlbiB0aGUgbW9kZWwgYWN0cyBhcyBhIGNoaWxkIChuZXN0ZWQpXG4gKiBjb21wYXJlZCB0byB3aGVuIGl0IGlzIHJlbmRlcmVkIGFzIHRoZSBwYXJlbnQgbW9kZWwuXG4gKlxuICogSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlIGRlY29yYXRlZCB3aXRoIGBAdWltb2RlbGAuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IFRoZSBtb2RlbCBjbGFzcyBuYW1lIHRvIHBhc3MgdG8gdGhlIGNvbXBvbmVudCAoZGVmYXVsdHMgdG8gdGhlIHByb3BlcnR5IGtleSkuXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBIVE1MIGVsZW1lbnQgb3IgY29tcG9uZW50IHRhZyBuYW1lIHRvIG92ZXJyaWRlIHRoZSBVSSB0YWcgb2YgdGhlIG5lc3RlZCBtb2RlbFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogQGZ1bmN0aW9uIHVpY2hpbGRcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBhIG5lc3RlZCBtb2RlbCB0byBhIGNvbXBvbmVudCBwcm9wZXJ0eSB3aXRoIGEgZGlmZmVyZW50IHRhZyB3aGVuIG5lc3RlZFxuICogQHVpbW9kZWwoJ2FkZHJlc3MtY29tcG9uZW50JylcbiAqIGNsYXNzIEFkZHJlc3Mge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgc3RyZWV0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY2l0eTogc3RyaW5nO1xuICogfVxuICpcbiAqIEB1aW1vZGVsKCd1c2VyLXByb2ZpbGUnKVxuICogY2xhc3MgVXNlclByb2ZpbGUge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpY2hpbGQoQWRkcmVzcy5uYW1lLCAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnKVxuICogICBhZGRyZXNzOiBBZGRyZXNzO1xuICogfVxuICpcbiAqIC8vIEluIHRoaXMgZXhhbXBsZSwgdGhlIEFkZHJlc3MgbW9kZWwgaGFzIHRoZSBkZWZhdWx0IHRhZyAnYWRkcmVzcy1jb21wb25lbnQnIHdoZW4gcmVuZGVyZWQgYXMgYSByb290IGNvbXBvbmVudCxcbiAqIC8vIGJ1dCB3aGVuIHVzZWQgaW5zaWRlIFVzZXJQcm9maWxlLCBpdCBpcyByZW5kZXJlZCB3aXRoIHRoZSBvdmVycmlkZGVuIHRhZyAnYWRkcmVzcy1jaGlsZC1jb21wb25lbnQnXG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWNoaWxkXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aWNoaWxkOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWNoaWxkLT4+TW9kZWw6IEFkZCBjaGlsZCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGNoaWxkIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gcHJvcCBuYW1lLCBzdHJpbmdpZnkgZmxhZywgYW5kIGNoaWxkIHRhZyBvdmVycmlkZVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Db21wb25lbnQ6IFBhc3MgcHJvcGVydHkgd2l0aCBzcGVjaWZpZWQgbmFtZSBhbmQgcmVuZGVyIHdpdGggb3ZlcnJpZGRlbiB0YWcgaWYgbmVzdGVkXG4gKi9cblxuZXhwb3J0IGZ1bmN0aW9uIHVpY2hpbGQoXG4gIGNsYXp6OiBzdHJpbmcsXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuICBpc0FycmF5OiBib29sZWFuID0gZmFsc2UsXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogY2xhenogfHwgcHJvcGVydHlLZXksXG4gICAgICB9LCBpc0FycmF5ID8ge2N1c3RvbVR5cGVzOiBbQXJyYXkubmFtZV0sIG11bHRpcGxlOiB0cnVlfSA6IHttdWx0aXBsZTogZmFsc2V9KSxcbiAgICB9O1xuXG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkNISUxEKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBtYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBsaXN0IGl0ZW0gY29tcG9uZW50XG4gKiBAc3VtbWFyeSBTcGVjaWZpZXMgaG93IGEgcHJvcGVydHkgc2hvdWxkIGJlIHJlbmRlcmVkIGluIGEgbGlzdCBjb250ZXh0XG4gKiBUaGlzIGRlY29yYXRvciBhbGxvd3MgeW91IHRvIGRlZmluZSBob3cgYSBtb2RlbCBwcm9wZXJ0eSBjb250YWluaW5nIGEgbGlzdFxuICogc2hvdWxkIGJlIHJlbmRlcmVkLiBJdCByZXF1aXJlcyB0aGUgY2xhc3MgdG8gYmUgZGVjb3JhdGVkIHdpdGggQHVpbGlzdGl0ZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFtwcm9wTmFtZV0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHBhc3MgdG8gdGhlIGxpc3QgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBsaXN0IGNvbnRhaW5lclxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHVpbGlzdHByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIERlZmluZSBhIGxpc3QgcHJvcGVydHkgd2l0aCBjdXN0b20gcmVuZGVyaW5nXG4gKiBAdWltb2RlbCgndG9kby1saXN0JylcbiAqIGNsYXNzIFRvZG9MaXN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRpdGxlOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGlzdHByb3AoJ2l0ZW1zJywgeyBjbGFzczogJ3RvZG8taXRlbXMtY29udGFpbmVyJyB9KVxuICogICBpdGVtczogVG9kb0l0ZW1bXTtcbiAqIH1cbiAqXG4gKiBAdWlsaXN0aXRlbSgnbGknLCB7IGNsYXNzOiAndG9kby1pdGVtJyB9KVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0ZXh0OiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgY29tcGxldGVkOiBib29sZWFuO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlsaXN0cHJvcFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTGlzdENvbnRhaW5lclxuICogICBwYXJ0aWNpcGFudCBMaXN0SXRlbXNcbiAqICAgTW9kZWwtPj51aWxpc3Rwcm9wOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWxpc3Rwcm9wLT4+TW9kZWw6IEFkZCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBsaXN0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIGNvbnRhaW5lciBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MaXN0Q29udGFpbmVyOiBDcmVhdGUgY29udGFpbmVyIHdpdGggcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TGlzdEl0ZW1zOiBSZW5kZXIgZWFjaCBpdGVtIHVzaW5nIEB1aWxpc3RpdGVtXG4gKiAgIExpc3RDb250YWluZXItPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiByZW5kZXJlZCBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWxpc3Rwcm9wKFxuICBwcm9wTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT5cbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFBhcnRpYWw8VUlMaXN0UHJvcE1ldGFkYXRhPiA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgcHJvcHM6IHByb3BzIHx8IHt9LFxuICAgIH07XG4gICAgcHJvcE1ldGFkYXRhKFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLlVJTElTVFBST1ApLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHBvc2l0aW9ucyBhIHByb3BlcnR5IGluIGEgc3BlY2lmaWMgZ3JpZCBsYXlvdXQgcG9zaXRpb25cbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyB0aGUgY29sdW1uIGFuZCByb3cgcG9zaXRpb24gZm9yIGEgcHJvcGVydHkgaW4gYSBVSSBsYXlvdXQgZ3JpZFxuICogVGhpcyBkZWNvcmF0b3IgYWxsb3dzIHlvdSB0byBkZWZpbmUgdGhlIHNwZWNpZmljIHBvc2l0aW9uIG9mIGEgcHJvcGVydHkgd2l0aGluXG4gKiBhIGdyaWQtYmFzZWQgbGF5b3V0IHN5c3RlbS4gSXQgc3BlY2lmaWVzIHdoaWNoIGNvbHVtbiBhbmQgcm93IHRoZSBwcm9wZXJ0eVxuICogc2hvdWxkIG9jY3VweSB3aGVuIHJlbmRlcmVkIGluIHRoZSBVSS5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gY29sIFRoZSBjb2x1bW4gcG9zaXRpb24gaW4gdGhlIGdyaWQgbGF5b3V0XG4gKiBAcGFyYW0ge251bWJlcn0gW3Jvdz0xXSBUaGUgcm93IHBvc2l0aW9uIGluIHRoZSBncmlkIGxheW91dCAoZGVmYXVsdHMgdG8gMSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzPXt9XSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgbGF5b3V0IGl0ZW1cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxheW91dGl0ZW1cbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFBvc2l0aW9uIHByb3BlcnRpZXMgaW4gYSBncmlkIGxheW91dFxuICogQHVpbW9kZWwoJ3VzZXItZm9ybScpXG4gKiBjbGFzcyBVc2VyRm9ybSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDEpIC8vIEZpcnN0IGNvbHVtbiwgZmlyc3Qgcm93XG4gKiAgIGZpcnN0TmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWxheW91dGl0ZW0oMiwgMSkgLy8gU2Vjb25kIGNvbHVtbiwgZmlyc3Qgcm93XG4gKiAgIGxhc3ROYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpbGF5b3V0aXRlbSgxLCAyLCB7IGNvbHNwYW46IDIgfSkgLy8gRmlyc3QgY29sdW1uLCBzZWNvbmQgcm93LCBzcGFucyAyIGNvbHVtbnNcbiAqICAgZW1haWw6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsYXlvdXRpdGVtKDEsIDMsIHsgY2xhc3M6ICdmdWxsLXdpZHRoJyB9KSAvLyBGaXJzdCBjb2x1bW4sIHRoaXJkIHJvdyB3aXRoIGN1c3RvbSBjbGFzc1xuICogICBiaW86IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IHVpbGF5b3V0aXRlbVxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgTGF5b3V0Q29udGFpbmVyXG4gKiAgIE1vZGVsLT4+dWlsYXlvdXRpdGVtOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICB1aWxheW91dGl0ZW0tPj5Nb2RlbDogQWRkIGxheW91dCBpdGVtIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgbGF5b3V0IGl0ZW0gbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBjb2x1bW4sIHJvdywgYW5kIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkxheW91dENvbnRhaW5lcjogUG9zaXRpb24gZWxlbWVudCBhdCBncmlkIGNvb3JkaW5hdGVzXG4gKiAgIExheW91dENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHBvc2l0aW9uZWQgZWxlbWVudFxuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsYXlvdXRpdGVtKFxuICBjb2w6IG51bWJlcixcbiAgcm93OiBudW1iZXIgPSAxLFxuICBwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9LFxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogVUlMYXlvdXRJdGVtTWV0YWRhdGEgPSB7XG4gICAgICBuYW1lOiAgcHJvcGVydHlLZXksXG4gICAgICBjb2wsXG4gICAgICByb3csXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLFxuICAgIH07ICBcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMQVlPVVRJVEVNKSwgbWV0YWRhdGEpKFxuICAgICAgdGFyZ2V0LFxuICAgICAgcHJvcGVydHlLZXlcbiAgICApO1xuICB9O1xufVxuIiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gQ2xhc3MgcmVwcmVzZW50aW5nIGFuIGV2ZW50IGhhbmRsZXJcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHN0cnVjdHVyZSBmb3IgaGFuZGxpbmcgZXZlbnRzIGluIHRoZSBVSSBkZWNvcmF0b3JzIHN5c3RlbVxuICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGZvdW5kYXRpb24gZm9yIG1hbmFnaW5nIGFuZCBwcm9jZXNzaW5nIGV2ZW50cyB0aGF0IG9jY3VyXG4gKiB3aXRoaW4gdGhlIFVJIGNvbXBvbmVudHMgZ2VuZXJhdGVkIGJ5IHRoZSBkZWNvcmF0b3JzLlxuICogQGNsYXNzIEV2ZW50SGFuZGxlclxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzL3VpXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEhhbmRsZXIge1xuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRXZlbnRIYW5kbGVyXG4gICAqIEBzdW1tYXJ5IEluaXRpYWxpemVzIGEgbmV3IEV2ZW50SGFuZGxlciBvYmplY3RcbiAgICogVGhpcyBjb25zdHJ1Y3RvciBjdXJyZW50bHkgZG9lc24ndCB0YWtlIGFueSBwYXJhbWV0ZXJzLCBidXQgaXQgY2FuIGJlXG4gICAqIGV4dGVuZGVkIGluIHRoZSBmdXR1cmUgdG8gYWNjZXB0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBpZiBuZWVkZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHt9XG59IiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gVUkgZGVjb3JhdG9ycyBtb2R1bGUgZm9yIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zXG4gKiBAc3VtbWFyeSBBIGNvbGxlY3Rpb24gb2YgZGVjb3JhdG9ycyBhbmQgdXRpbGl0aWVzIGZvciBidWlsZGluZyBVSSBjb21wb25lbnRzIGluIFR5cGVTY3JpcHQgYXBwbGljYXRpb25zLlxuICogVGhpcyBtb2R1bGUgZXhwb3J0cyBmdW5jdGlvbmFsaXR5IGZyb20gYm90aCB0aGUgbW9kZWwgYW5kIFVJIHN1Ym1vZHVsZXMsIHByb3ZpZGluZyBkZWNvcmF0b3JzIGZvclxuICogcmVuZGVyaW5nLCBjb21wb25lbnQgZGVmaW5pdGlvbiwgYW5kIFVJIHN0YXRlIG1hbmFnZW1lbnQuXG4gKiBAbW9kdWxlIHVpLWRlY29yYXRvcnNcbiAqL1xuXG5leHBvcnQgKiBmcm9tIFwiLi9tb2RlbFwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdWlcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQ3VycmVudCBwYWNrYWdlIHZlcnNpb24gc3RyaW5nXG4gKiBAc3VtbWFyeSBTdG9yZXMgdGhlIGN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIGZvciByZWZlcmVuY2VcbiAqIEBjb25zdCBWRVJTSU9OXG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZFUlNJT04gPSBcIiMjVkVSU0lPTiMjXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTs7Ozs7OztBQU9HO0FBMEJIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTRDRztBQUNVLE1BQUEsTUFBTSxHQUFHO0FBQ3BCLElBQUEsT0FBTyxFQUFFLENBQUEsRUFBRyxTQUFTLENBQUMsT0FBTyxDQUFNLElBQUEsQ0FBQTtBQUNuQyxJQUFBLE9BQU8sRUFBRSxTQUFTO0FBQ2xCLElBQUEsV0FBVyxFQUFFLGFBQWE7QUFDMUIsSUFBQSxPQUFPLEVBQUUsU0FBUztB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