@decaf-ts/ui-decorators 0.5.14 → 0.5.16

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.
@@ -68,6 +68,8 @@ const UIKeys = {
68
68
  CUSTOM_PROPS: "customValidationProps",
69
69
  UILISTITEM: "uilistitem",
70
70
  UILISTPROP: "listprop",
71
+ UILAYOUT: "uilayout",
72
+ UILAYOUTITEM: "uilayoutitem",
71
73
  HANDLERS: "handlers",
72
74
  TYPE: "type",
73
75
  SUB_TYPE: "subtype",
@@ -283,6 +285,8 @@ class RenderingError extends BaseError {
283
285
  */
284
286
  function formatByType(type, value, ...args) {
285
287
  if (type === UIKeys.DATE) {
288
+ if (!value)
289
+ return "";
286
290
  const format = args.shift() || HTML5DateFormat;
287
291
  return formatDate(new Date(value), format);
288
292
  }
@@ -296,14 +300,16 @@ function parseValueByType(type, value, fieldProps) {
296
300
  break;
297
301
  case HTML5InputTypes.DATE: {
298
302
  const format = fieldProps.format;
299
- result =
300
- typeof value === ReservedModels.NUMBER
301
- ? new Date(value)
302
- : value
303
- ? format
304
- ? parseDate(format, value)
305
- : new Date(value)
306
- : undefined;
303
+ if (value) {
304
+ result =
305
+ typeof value === ReservedModels.NUMBER
306
+ ? new Date(value)
307
+ : value
308
+ ? format
309
+ ? parseDate(format, value)
310
+ : new Date(value)
311
+ : undefined;
312
+ }
307
313
  break;
308
314
  }
309
315
  default:
@@ -432,6 +438,30 @@ class RenderingEngine {
432
438
  }
433
439
  return key;
434
440
  }
441
+ /**
442
+ * @description Retrieves class decorator metadata for a model instance
443
+ * @summary Extracts UI-related class decorators from a model and returns them as an array
444
+ * This method collects metadata from various UI class decorators including @uimodel,
445
+ * @uilistitem, @uihandlers, and @uilayout applied to the model class.
446
+ *
447
+ * @template M Type extending Model
448
+ * @param {M} model - The model instance to extract metadata from
449
+ * @returns {UIClassMetadata[]} Array of UI class metadata objects
450
+ *
451
+ * @private
452
+ */
453
+ getClassDecoratorsMetadata(model) {
454
+ return [
455
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UIMODEL), model.constructor) ||
456
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UIMODEL), Model.get(model.constructor.name)),
457
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UILISTITEM), model.constructor) ||
458
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UILISTITEM), Model.get(model.constructor.name)),
459
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.HANDLERS), model.constructor) ||
460
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.HANDLERS), Model.get(model.constructor.name)),
461
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UILAYOUT), model.constructor) ||
462
+ Reflect.getMetadata(RenderingEngine.key(UIKeys.UILAYOUT), Model.get(model.constructor.name)),
463
+ ].filter(Boolean);
464
+ }
435
465
  /**
436
466
  * @description Checks if a type is validatable by its nature.
437
467
  * @summary Determines if a given UI key represents a type that is inherently validatable.
@@ -500,14 +530,7 @@ class RenderingEngine {
500
530
  toFieldDefinition(model, globalProps = {}, generateId = true) {
501
531
  const { inheritProps, ...globalPropsWithoutInherits } = globalProps;
502
532
  globalProps = globalPropsWithoutInherits;
503
- const classDecorators = [
504
- Reflect.getMetadata(RenderingEngine.key(UIKeys.UIMODEL), model.constructor) ||
505
- Reflect.getMetadata(RenderingEngine.key(UIKeys.UIMODEL), Model.get(model.constructor.name)),
506
- Reflect.getMetadata(RenderingEngine.key(UIKeys.UILISTITEM), model.constructor) ||
507
- Reflect.getMetadata(RenderingEngine.key(UIKeys.UILISTITEM), Model.get(model.constructor.name)),
508
- Reflect.getMetadata(RenderingEngine.key(UIKeys.HANDLERS), model.constructor) ||
509
- Reflect.getMetadata(RenderingEngine.key(UIKeys.HANDLERS), Model.get(model.constructor.name)),
510
- ].filter(Boolean);
533
+ const classDecorators = this.getClassDecoratorsMetadata(model);
511
534
  if (!classDecorators.length)
512
535
  throw new RenderingError(`No ui definitions set for model ${model.constructor.name}. Did you use @uimodel?`);
513
536
  const classDecorator = Object.assign({}, ...classDecorators, inheritProps ? inheritProps : {} // override tag and properties when it is a component that should inherit properties from its parent.
@@ -606,24 +629,67 @@ class RenderingEngine {
606
629
  children.push(childDefinition);
607
630
  break;
608
631
  }
632
+ case UIKeys.UILAYOUTITEM:
633
+ break;
609
634
  default:
610
635
  throw new RenderingError(`Invalid key: ${dec.key}`);
611
636
  }
612
637
  });
613
638
  }
614
639
  }
640
+ globalProps = Object.assign({}, props, globalProps, {
641
+ handlers: handlers || {},
642
+ });
615
643
  const result = {
616
644
  tag: tag,
617
645
  item: childProps,
618
- props: Object.assign({}, props, globalProps, {
619
- handlers: handlers || {},
620
- }),
621
- children: children,
646
+ props: globalProps,
647
+ children: ((Object.keys(uiDecorators)?.length && children?.length) ?
648
+ this.getLayoutItems(children, uiDecorators) : children),
622
649
  };
623
650
  if (generateId)
624
651
  result.rendererId = generateUIModelID(model);
625
652
  return result;
626
653
  }
654
+ /**
655
+ * @description Processes layout items for grid positioning
656
+ * @summary Maps child field definitions to their corresponding layout positions
657
+ * This method iterates through child field definitions and applies layout metadata
658
+ * from @uilayoutitem decorators to position them correctly in a grid layout.
659
+ *
660
+ * @param {FieldDefinition[]} children - Array of child field definitions to process
661
+ * @param {Record<string, any>} uiDecorators - UI decorator metadata keyed by property name
662
+ * @returns {FieldDefinition[]} Array of field definitions with layout positioning applied
663
+ *
664
+ * @example
665
+ * // Internal usage - positions children in grid layout
666
+ * const layoutChildren = this.getLayoutItems(childDefinitions, decoratorMetadata);
667
+ */
668
+ getLayoutItems(children, uiDecorators) {
669
+ return children.map((child) => {
670
+ let updatedChild = child;
671
+ for (const key in uiDecorators) {
672
+ const decs = uiDecorators[key];
673
+ for (const dec of decs) {
674
+ if (dec.key === UIKeys.UILAYOUTITEM &&
675
+ (dec.props?.name === child.props?.name || dec.props?.name === child.props?.childOf)) {
676
+ const { col, props, row } = dec.props;
677
+ updatedChild = {
678
+ row,
679
+ col,
680
+ ...child,
681
+ props: {
682
+ ...child.props,
683
+ ...props,
684
+ },
685
+ };
686
+ break;
687
+ }
688
+ }
689
+ }
690
+ return updatedChild;
691
+ });
692
+ }
627
693
  /**
628
694
  * @description Registers a rendering engine instance.
629
695
  * @summary Adds a rendering engine to the static cache and sets it as the current engine.
@@ -854,6 +920,59 @@ function uilistitem(tag, props) {
854
920
  return metadata(RenderingEngine.key(UIKeys.UILISTITEM), meta)(original);
855
921
  };
856
922
  }
923
+ /**
924
+ * @description Decorator that adds event handlers to a UI model
925
+ * @summary Specifies event handlers that should be attached to the rendered model
926
+ * This decorator allows you to define event handlers that will be automatically
927
+ * attached to the rendered UI element. The handlers are passed as properties
928
+ * to the rendering engine.
929
+ *
930
+ * @param {Record<string, any>} [props] Object containing event handler functions and other properties
931
+ * @return {Function} A class decorator function
932
+ *
933
+ * @function uihandlers
934
+ * @category Class Decorators
935
+ *
936
+ * @example
937
+ * // Add event handlers to a model
938
+ * @uimodel('button')
939
+ * @uihandlers({
940
+ * onClick: (event) => console.log('Button clicked'),
941
+ * onMouseOver: (event) => console.log('Mouse over button'),
942
+ * disabled: false
943
+ * })
944
+ * class ClickableButton extends Model {
945
+ * @attribute()
946
+ * label: string;
947
+ * }
948
+ *
949
+ * // Add form submission handlers
950
+ * @uimodel('form')
951
+ * @uihandlers({
952
+ * onSubmit: (event) => {
953
+ * event.preventDefault();
954
+ * console.log('Form submitted');
955
+ * },
956
+ * onReset: (event) => console.log('Form reset')
957
+ * })
958
+ * class ContactForm extends Model {
959
+ * @attribute()
960
+ * email: string;
961
+ * }
962
+ *
963
+ * @mermaid
964
+ * sequenceDiagram
965
+ * participant System
966
+ * participant uihandlers
967
+ * participant Model
968
+ * participant RenderingEngine
969
+ * participant UI
970
+ * System->>uihandlers: apply to Model
971
+ * uihandlers->>Model: adds handler metadata
972
+ * Model->>RenderingEngine: requests rendering with handlers
973
+ * RenderingEngine->>UI: renders element with event handlers attached
974
+ * UI->>Model: triggers handlers on events
975
+ */
857
976
  function uihandlers(props) {
858
977
  return (original) => {
859
978
  const meta = {
@@ -862,6 +981,69 @@ function uihandlers(props) {
862
981
  return metadata(RenderingEngine.key(UIKeys.HANDLERS), meta)(original);
863
982
  };
864
983
  }
984
+ /**
985
+ * @description Decorator that creates a layout container with grid specifications
986
+ * @summary Combines UI model functionality with layout grid configuration
987
+ * This decorator creates a UI model that acts as a layout container with specified
988
+ * column and row configurations. It's a convenience decorator that combines
989
+ * @uimodel with layout-specific properties for responsive grid layouts.
990
+ *
991
+ * @param {string} tag The HTML tag to use for the layout container
992
+ * @param {number} [cols=1] Number of columns in the grid layout
993
+ * @param {number|string[]} [rows=1] Number of rows or array of row definitions
994
+ * @param {UIMediaBreakPoints} [breakpoint='m'] Media breakpoint for responsive behavior
995
+ * @return {Function} A class decorator function
996
+ *
997
+ * @function uilayout
998
+ * @category Class Decorators
999
+ *
1000
+ * @example
1001
+ * // Create a simple 2-column layout
1002
+ * @uilayout('div', 2, 3)
1003
+ * class TwoColumnLayout extends Model {
1004
+ * @attribute()
1005
+ * @uilayoutitem(1, 1)
1006
+ * header: string;
1007
+ *
1008
+ * @attribute()
1009
+ * @uilayoutitem(1, 2)
1010
+ * leftContent: string;
1011
+ *
1012
+ * @attribute()
1013
+ * @uilayoutitem(2, 2)
1014
+ * rightContent: string;
1015
+ * }
1016
+ *
1017
+ * // Create a responsive layout with custom breakpoint
1018
+ * @uilayout('section', 3, 2, 'l')
1019
+ * class ResponsiveLayout extends Model {
1020
+ * @attribute()
1021
+ * @uilayoutitem(1, 1)
1022
+ * title: string;
1023
+ *
1024
+ * @attribute()
1025
+ * @uilayoutitem(2, 1)
1026
+ * subtitle: string;
1027
+ * }
1028
+ *
1029
+ * @mermaid
1030
+ * sequenceDiagram
1031
+ * participant System
1032
+ * participant uilayout
1033
+ * participant uimodel
1034
+ * participant Model
1035
+ * participant RenderingEngine
1036
+ * System->>uilayout: apply to Model
1037
+ * uilayout->>uimodel: call with layout props
1038
+ * uimodel->>Model: adds model metadata with layout config
1039
+ * Model->>RenderingEngine: requests rendering as layout container
1040
+ * RenderingEngine->>System: renders grid layout with specified dimensions
1041
+ */
1042
+ function uilayout(tag, cols = 1, rows = 1, breakpoint = 'm') {
1043
+ return (original, propertyKey) => {
1044
+ return uimodel(tag, { cols, rows, breakpoint })(original, propertyKey);
1045
+ };
1046
+ }
865
1047
 
866
1048
  /**
867
1049
  * @description Module that extends the Model prototype with rendering capabilities
@@ -1190,6 +1372,66 @@ function uilistprop(propName = undefined, props) {
1190
1372
  propMetadata(RenderingEngine.key(UIKeys.UILISTPROP), metadata)(target, propertyKey);
1191
1373
  };
1192
1374
  }
1375
+ /**
1376
+ * @description Decorator that positions a property in a specific grid layout position
1377
+ * @summary Specifies the column and row position for a property in a UI layout grid
1378
+ * This decorator allows you to define the specific position of a property within
1379
+ * a grid-based layout system. It specifies which column and row the property
1380
+ * should occupy when rendered in the UI.
1381
+ *
1382
+ * @param {number} col The column position in the grid layout
1383
+ * @param {number} [row=1] The row position in the grid layout (defaults to 1)
1384
+ * @param {Record<string, any>} [props={}] Additional properties to pass to the layout item
1385
+ * @return {Function} A property decorator function
1386
+ *
1387
+ * @function uilayoutitem
1388
+ * @category Property Decorators
1389
+ *
1390
+ * @example
1391
+ * // Position properties in a grid layout
1392
+ * @uimodel('user-form')
1393
+ * class UserForm {
1394
+ * @attribute()
1395
+ * @uilayoutitem(1, 1) // First column, first row
1396
+ * firstName: string;
1397
+ *
1398
+ * @attribute()
1399
+ * @uilayoutitem(2, 1) // Second column, first row
1400
+ * lastName: string;
1401
+ *
1402
+ * @attribute()
1403
+ * @uilayoutitem(1, 2, { colspan: 2 }) // First column, second row, spans 2 columns
1404
+ * email: string;
1405
+ *
1406
+ * @attribute()
1407
+ * @uilayoutitem(1, 3, { class: 'full-width' }) // First column, third row with custom class
1408
+ * bio: string;
1409
+ * }
1410
+ *
1411
+ * @mermaid
1412
+ * sequenceDiagram
1413
+ * participant Model
1414
+ * participant uilayoutitem
1415
+ * participant RenderingEngine
1416
+ * participant LayoutContainer
1417
+ * Model->>uilayoutitem: Apply to property
1418
+ * uilayoutitem->>Model: Add layout item metadata
1419
+ * RenderingEngine->>Model: Get layout item metadata
1420
+ * Model->>RenderingEngine: Return column, row, and props
1421
+ * RenderingEngine->>LayoutContainer: Position element at grid coordinates
1422
+ * LayoutContainer->>RenderingEngine: Return positioned element
1423
+ */
1424
+ function uilayoutitem(col, row = 1, props = {}) {
1425
+ return (target, propertyKey) => {
1426
+ const metadata = {
1427
+ name: propertyKey,
1428
+ col,
1429
+ row,
1430
+ props: Object.assign({}, props),
1431
+ };
1432
+ propMetadata(RenderingEngine.key(UIKeys.UILAYOUTITEM), metadata)(target, propertyKey);
1433
+ };
1434
+ }
1193
1435
 
1194
1436
  /**
1195
1437
  * @description Class representing an event handler
@@ -1222,7 +1464,7 @@ class EventHandler {
1222
1464
  * @const VERSION
1223
1465
  * @memberOf module:ui-decorators
1224
1466
  */
1225
- const VERSION = "0.5.14";
1467
+ const VERSION = "0.5.16";
1226
1468
 
1227
- export { EventHandler, HTML5CheckTypes, HTML5DateFormat, HTML5InputTypes, RenderingEngine, RenderingError, UIKeys, VERSION, ValidatableByAttribute, ValidatableByType, escapeHtml, formatByType, generateUIModelID, hidden, hideOn, parseToNumber, parseValueByType, renderedBy, revertHtml, uichild, uielement, uihandlers, uilistitem, uilistprop, uimodel, uiprop };
1228
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWktZGVjb3JhdG9ycy5lc20uY2pzIiwic291cmNlcyI6WyIuLi9zcmMvdWkvY29uc3RhbnRzLnRzIiwiLi4vc3JjL3VpL2Vycm9ycy50cyIsIi4uL3NyYy91aS91dGlscy50cyIsIi4uL3NyYy91aS9SZW5kZXJpbmcudHMiLCIuLi9zcmMvbW9kZWwvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy9tb2RlbC9vdmVycmlkZXMudHMiLCIuLi9zcmMvdWkvZGVjb3JhdG9ycy50cyIsIi4uL3NyYy91aS9oYW5kbGVycy50cyIsIi4uL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBkZXNjcmlwdGlvbiBDb25zdGFudHMgYW5kIGVudW1zIGZvciBVSSByZW5kZXJpbmcgYW5kIHZhbGlkYXRpb25cbiAqIEBzdW1tYXJ5IERlZmluZXMga2V5cywgbWFwcGluZ3MsIGFuZCBIVE1MNSBpbnB1dCB0eXBlcyBmb3IgVUkgY29tcG9uZW50c1xuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgY29uc3RhbnRzIHVzZWQgdGhyb3VnaG91dCB0aGUgVUkgZGVjb3JhdG9ycyBsaWJyYXJ5IGZvclxuICogcmVuZGVyaW5nLCB2YWxpZGF0aW9uLCBhbmQgSFRNTCBlbGVtZW50IGdlbmVyYXRpb24uXG4gKiBAbW9kdWxlIHVpL2NvbnN0YW50c1xuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cblxuaW1wb3J0IHtcbiAgQ29uc3RydWN0b3IsXG4gIERhdGVWYWxpZGF0b3IsXG4gIERpZmZWYWxpZGF0b3IsXG4gIEVtYWlsVmFsaWRhdG9yLFxuICBFcXVhbHNWYWxpZGF0b3IsXG4gIEdyZWF0ZXJUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgR3JlYXRlclRoYW5WYWxpZGF0b3IsXG4gIExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgTGVzc1RoYW5WYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgTWF4VmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1pblZhbGlkYXRvcixcbiAgTW9kZWxLZXlzLFxuICBQYXNzd29yZFZhbGlkYXRvcixcbiAgUGF0dGVyblZhbGlkYXRvcixcbiAgUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFN0ZXBWYWxpZGF0b3IsXG4gIFVSTFZhbGlkYXRvcixcbiAgVmFsaWRhdGlvbktleXMsXG4gIFZhbGlkYXRvcixcbn0gZnJvbSBcIkBkZWNhZi10cy9kZWNvcmF0b3ItdmFsaWRhdGlvblwiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBLZXkgY29uc3RhbnRzIHVzZWQgZm9yIFVJIG1ldGFkYXRhIGFuZCByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IENvbGxlY3Rpb24gb2Ygc3RyaW5nIGNvbnN0YW50cyB1c2VkIGFzIGtleXMgZm9yIFVJLXJlbGF0ZWQgbWV0YWRhdGFcbiAqIFRoZXNlIGtleXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgcmVsYXRlZCB0b1xuICogVUkgbW9kZWxzLCBlbGVtZW50cywgcHJvcGVydGllcywgYW5kIHZhbGlkYXRpb24gcnVsZXMuXG4gKlxuICogQHR5cGVkZWYge09iamVjdH0gVUlLZXlzVHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgLSBCYXNlIHJlZmxlY3Rpb24ga2V5IGZvciBVSSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVJTU9ERUwgLSBLZXkgZm9yIFVJIG1vZGVsIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVOREVSRURfQlkgLSBLZXkgZm9yIHNwZWNpZnlpbmcgcmVuZGVyaW5nIGVuZ2luZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVMRU1FTlQgLSBLZXkgZm9yIGVsZW1lbnQgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBQUk9QIC0gS2V5IGZvciBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5BTUUgLSBLZXkgZm9yIG5hbWUgYXR0cmlidXRlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTkFNRV9QUkVGSVggLSBQcmVmaXggZm9yIGlucHV0IG5hbWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ1VTVE9NX1BST1BTIC0gS2V5IGZvciBjdXN0b20gdmFsaWRhdGlvbiBwcm9wZXJ0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUSVRFTSAtIEtleSBmb3IgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVUlMSVNUUFJPUCAtIEtleSBmb3IgbGlzdCBwcm9wZXJ0eSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRZUEUgLSBLZXkgZm9yIHR5cGUgbWV0YWRhdGFcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVUJfVFlQRSAtIEtleSBmb3Igc3VidHlwZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEtleSBmb3IgaGlkZGVuIGF0dHJpYnV0ZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEZPUk1BVCAtIEtleSBmb3IgZm9ybWF0IG1ldGFkYXRhXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVBRF9PTkxZIC0gS2V5IGZvciByZWFkb25seSBhdHRyaWJ1dGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVFVSVJFRCAtIEtleSBmb3IgcmVxdWlyZWQgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1JTiAtIEtleSBmb3IgbWluaW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUlOX0xFTkdUSCAtIEtleSBmb3IgbWluaW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1BWCAtIEtleSBmb3IgbWF4aW11bSB2YWx1ZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTUFYX0xFTkdUSCAtIEtleSBmb3IgbWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBVFRFUk4gLSBLZXkgZm9yIHBhdHRlcm4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFVSTCAtIEtleSBmb3IgVVJMIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTVEVQIC0gS2V5IGZvciBzdGVwIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBEQVRFIC0gS2V5IGZvciBkYXRlIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBFTUFJTCAtIEtleSBmb3IgZW1haWwgdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gS2V5IGZvciBwYXNzd29yZCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRVFVQUxTIC0gS2V5IGZvciBlcXVhbGl0eSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gRElGRiAtIEtleSBmb3IgZGlmZmVyZW5jZSB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTEVTU19USEFOIC0gS2V5IGZvciBsZXNzIHRoYW4gdmFsaWRhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IExFU1NfVEhBTl9PUl9FUVVBTCAtIEtleSBmb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBHUkVBVEVSX1RIQU4gLSBLZXkgZm9yIGdyZWF0ZXIgdGhhbiB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gR1JFQVRFUl9USEFOX09SX0VRVUFMIC0gS2V5IGZvciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdmFsaWRhdGlvblxuICpcbiAqIEBjb25zdCBVSUtleXNcbiAqIEB0eXBlIHtVSUtleXNUeXBlfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFVJS2V5cyA9IHtcbiAgUkVGTEVDVDogYCR7TW9kZWxLZXlzLlJFRkxFQ1R9LnVpLmAsXG4gIFVJTU9ERUw6IFwidWltb2RlbFwiLFxuICBSRU5ERVJFRF9CWTogXCJyZW5kZXJlZC1ieVwiLFxuICBFTEVNRU5UOiBcImVsZW1lbnRcIixcbiAgUFJPUDogXCJwcm9wXCIsXG4gIENISUxEOiBcImNoaWxkXCIsXG4gIE5BTUU6IFwibmFtZVwiLFxuICBOQU1FX1BSRUZJWDogXCJpbnB1dC1cIixcbiAgQ1VTVE9NX1BST1BTOiBcImN1c3RvbVZhbGlkYXRpb25Qcm9wc1wiLFxuXG4gIFVJTElTVElURU06IFwidWlsaXN0aXRlbVwiLFxuICBVSUxJU1RQUk9QOiBcImxpc3Rwcm9wXCIsXG4gIEhBTkRMRVJTOiBcImhhbmRsZXJzXCIsXG5cbiAgVFlQRTogXCJ0eXBlXCIsXG4gIFNVQl9UWVBFOiBcInN1YnR5cGVcIixcblxuICBISURERU46IFwiaGlkZGVuXCIsXG4gIEZPUk1BVDogXCJmb3JtYXRcIixcblxuICBSRUFEX09OTFk6IFwicmVhZG9ubHlcIixcbiAgUkVRVUlSRUQ6IFZhbGlkYXRpb25LZXlzLlJFUVVJUkVELFxuICBNSU46IFZhbGlkYXRpb25LZXlzLk1JTixcbiAgTUlOX0xFTkdUSDogVmFsaWRhdGlvbktleXMuTUlOX0xFTkdUSCxcbiAgTUFYOiBWYWxpZGF0aW9uS2V5cy5NQVgsXG4gIE1BWF9MRU5HVEg6IFZhbGlkYXRpb25LZXlzLk1BWF9MRU5HVEgsXG4gIFBBVFRFUk46IFZhbGlkYXRpb25LZXlzLlBBVFRFUk4sXG4gIFVSTDogVmFsaWRhdGlvbktleXMuVVJMLFxuICBTVEVQOiBWYWxpZGF0aW9uS2V5cy5TVEVQLFxuICBEQVRFOiBWYWxpZGF0aW9uS2V5cy5EQVRFLFxuICBFTUFJTDogVmFsaWRhdGlvbktleXMuRU1BSUwsXG4gIFBBU1NXT1JEOiBWYWxpZGF0aW9uS2V5cy5QQVNTV09SRCxcbiAgRVFVQUxTOiBWYWxpZGF0aW9uS2V5cy5FUVVBTFMsXG4gIERJRkY6IFZhbGlkYXRpb25LZXlzLkRJRkYsXG4gIExFU1NfVEhBTjogVmFsaWRhdGlvbktleXMuTEVTU19USEFOLFxuICBMRVNTX1RIQU5fT1JfRVFVQUw6IFZhbGlkYXRpb25LZXlzLkxFU1NfVEhBTl9PUl9FUVVBTCxcbiAgR1JFQVRFUl9USEFOOiBWYWxpZGF0aW9uS2V5cy5HUkVBVEVSX1RIQU4sXG4gIEdSRUFURVJfVEhBTl9PUl9FUVVBTDogVmFsaWRhdGlvbktleXMuR1JFQVRFUl9USEFOX09SX0VRVUFMLFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gTWFwcGluZyBvZiBpbnB1dCB0eXBlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgc3BlY2lhbCBpbnB1dCB0eXBlcyB0byB0aGVpciB2YWxpZGF0b3IgY2xhc3Nlc1xuICogVGhpcyBjb25zdGFudCBtYXBzIGlucHV0IHR5cGVzIGxpa2UgZW1haWwsIFVSTCwgZGF0ZSwgYW5kIHBhc3N3b3JkIHRvIHRoZWlyXG4gKiBjb3JyZXNwb25kaW5nIHZhbGlkYXRvciBjbGFzc2VzIGZyb20gdGhlIGRlY29yYXRvci12YWxpZGF0aW9uIGxpYnJhcnkuXG4gKlxuICogQHR5cGVkZWYge09iamVjdC48c3RyaW5nLCBDb25zdHJ1Y3RvcjxWYWxpZGF0b3I+Pn0gVmFsaWRhdGFibGVCeVR5cGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RW1haWxWYWxpZGF0b3I+fSBlbWFpbCAtIFZhbGlkYXRvciBmb3IgZW1haWwgaW5wdXRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFVSTFZhbGlkYXRvcj59IHVybCAtIFZhbGlkYXRvciBmb3IgVVJMIGlucHV0c1xuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxEYXRlVmFsaWRhdG9yPn0gZGF0ZSAtIFZhbGlkYXRvciBmb3IgZGF0ZSBpbnB1dHNcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UGFzc3dvcmRWYWxpZGF0b3I+fSBwYXNzd29yZCAtIFZhbGlkYXRvciBmb3IgcGFzc3dvcmQgaW5wdXRzXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlUeXBlXG4gKiBAdHlwZSB7VmFsaWRhdGFibGVCeVR5cGVNYXB9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgVmFsaWRhdGFibGVCeVR5cGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLkVNQUlMXTogRW1haWxWYWxpZGF0b3IsXG4gIFtVSUtleXMuVVJMXTogVVJMVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRBVEVdOiBEYXRlVmFsaWRhdG9yLFxuICBbVUlLZXlzLlBBU1NXT1JEXTogUGFzc3dvcmRWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBNYXBwaW5nIG9mIHZhbGlkYXRpb24gYXR0cmlidXRlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHZhbGlkYXRvcnNcbiAqIEBzdW1tYXJ5IE1hcHMgSFRNTCB2YWxpZGF0aW9uIGF0dHJpYnV0ZXMgdG8gdGhlaXIgdmFsaWRhdG9yIGNsYXNzZXNcbiAqIFRoaXMgY29uc3RhbnQgbWFwcyBIVE1MIHZhbGlkYXRpb24gYXR0cmlidXRlcyBsaWtlIHJlcXVpcmVkLCBtaW4sIG1heCwgcGF0dGVybiwgZXRjLlxuICogdG8gdGhlaXIgY29ycmVzcG9uZGluZyB2YWxpZGF0b3IgY2xhc3NlcyBmcm9tIHRoZSBkZWNvcmF0b3ItdmFsaWRhdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3QuPHN0cmluZywgQ29uc3RydWN0b3I8VmFsaWRhdG9yPj59IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVNYXBcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8UmVxdWlyZWRWYWxpZGF0b3I+fSByZXF1aXJlZCAtIFZhbGlkYXRvciBmb3IgcmVxdWlyZWQgZmllbGRzXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPE1pblZhbGlkYXRvcj59IG1pbiAtIFZhbGlkYXRvciBmb3IgbWluaW11bSB2YWx1ZVxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhWYWxpZGF0b3I+fSBtYXggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8U3RlcFZhbGlkYXRvcj59IHN0ZXAgLSBWYWxpZGF0b3IgZm9yIHN0ZXAgdmFsdWVcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TWluTGVuZ3RoVmFsaWRhdG9yPn0gbWlubGVuZ3RoIC0gVmFsaWRhdG9yIGZvciBtaW5pbXVtIGxlbmd0aFxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxNYXhMZW5ndGhWYWxpZGF0b3I+fSBtYXhsZW5ndGggLSBWYWxpZGF0b3IgZm9yIG1heGltdW0gbGVuZ3RoXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPFBhdHRlcm5WYWxpZGF0b3I+fSBwYXR0ZXJuIC0gVmFsaWRhdG9yIGZvciByZWdleCBwYXR0ZXJuXG4gKiBAcHJvcGVydHkge0NvbnN0cnVjdG9yPEVxdWFsc1ZhbGlkYXRvcj59IGVxdWFscyAtIFZhbGlkYXRvciBmb3IgZXF1YWxpdHlcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8RGlmZlZhbGlkYXRvcj59IGRpZmYgLSBWYWxpZGF0b3IgZm9yIGRpZmZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5WYWxpZGF0b3I+fSBsZXNzdGhhbiAtIFZhbGlkYXRvciBmb3IgbGVzcyB0aGFuIGNvbXBhcmlzb25cbiAqIEBwcm9wZXJ0eSB7Q29uc3RydWN0b3I8TGVzc1RoYW5PckVxdWFsVmFsaWRhdG9yPn0gbGVzc3RoYW5vcmVxdWFsIC0gVmFsaWRhdG9yIGZvciBsZXNzIHRoYW4gb3IgZXF1YWwgY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhblZhbGlkYXRvcj59IGdyZWF0ZXJ0aGFuIC0gVmFsaWRhdG9yIGZvciBncmVhdGVyIHRoYW4gY29tcGFyaXNvblxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvcjxHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3I+fSBncmVhdGVydGhhbm9yZXF1YWwgLSBWYWxpZGF0b3IgZm9yIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uXG4gKlxuICogQGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGVcbiAqIEB0eXBlIHtWYWxpZGF0YWJsZUJ5QXR0cmlidXRlTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IFZhbGlkYXRhYmxlQnlBdHRyaWJ1dGU6IFJlY29yZDxzdHJpbmcsIENvbnN0cnVjdG9yPFZhbGlkYXRvcj4+ID0ge1xuICBbVUlLZXlzLlJFUVVJUkVEXTogUmVxdWlyZWRWYWxpZGF0b3IsXG4gIFtVSUtleXMuTUlOXTogTWluVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF06IE1heFZhbGlkYXRvcixcbiAgW1VJS2V5cy5TVEVQXTogU3RlcFZhbGlkYXRvcixcbiAgW1VJS2V5cy5NSU5fTEVOR1RIXTogTWluTGVuZ3RoVmFsaWRhdG9yLFxuICBbVUlLZXlzLk1BWF9MRU5HVEhdOiBNYXhMZW5ndGhWYWxpZGF0b3IsXG4gIFtVSUtleXMuUEFUVEVSTl06IFBhdHRlcm5WYWxpZGF0b3IsXG4gIFtVSUtleXMuRVFVQUxTXTogRXF1YWxzVmFsaWRhdG9yLFxuICBbVUlLZXlzLkRJRkZdOiBEaWZmVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl06IExlc3NUaGFuVmFsaWRhdG9yLFxuICBbVUlLZXlzLkxFU1NfVEhBTl9PUl9FUVVBTF06IExlc3NUaGFuT3JFcXVhbFZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5dOiBHcmVhdGVyVGhhblZhbGlkYXRvcixcbiAgW1VJS2V5cy5HUkVBVEVSX1RIQU5fT1JfRVFVQUxdOiBHcmVhdGVyVGhhbk9yRXF1YWxWYWxpZGF0b3IsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTdGFuZGFyZCBkYXRlIGZvcm1hdCBzdHJpbmcgZm9yIEhUTUw1IGRhdGUgaW5wdXRzXG4gKiBAc3VtbWFyeSBGb3JtYXQgc3RyaW5nIGZvciBIVE1MNSBkYXRlIGlucHV0cyAoeXl5eS1NTS1kZClcbiAqIFRoaXMgY29uc3RhbnQgZGVmaW5lcyB0aGUgc3RhbmRhcmQgZGF0ZSBmb3JtYXQgc3RyaW5nIHVzZWQgZm9yIEhUTUw1IGRhdGUgaW5wdXRzLlxuICpcbiAqIEBjb25zdCBIVE1MNURhdGVGb3JtYXRcbiAqIEB0eXBlIHtzdHJpbmd9XG4gKiBAcmVhZG9ubHlcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9yc1xuICovXG5leHBvcnQgY29uc3QgSFRNTDVEYXRlRm9ybWF0ID0gXCJ5eXl5LU1NLWRkXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIENvbGxlY3Rpb24gb2YgSFRNTDUgaW5wdXQgdHlwZSB2YWx1ZXNcbiAqIEBzdW1tYXJ5IE1hcHMgaW5wdXQgdHlwZSBjb25zdGFudHMgdG8gdGhlaXIgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzXG4gKiBUaGlzIGNvbnN0YW50IHByb3ZpZGVzIGEgbWFwcGluZyBvZiBpbnB1dCB0eXBlIGNvbnN0YW50cyB0byB0aGVpciBjb3JyZXNwb25kaW5nXG4gKiBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgZm9yIHVzZSBpbiBmb3JtIGVsZW1lbnRzLlxuICpcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEhUTUw1SW5wdXRUeXBlc01hcFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEJVVFRPTiAtIEJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ0hFQ0tCT1ggLSBDaGVja2JveCBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQ09MT1IgLSBDb2xvciBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IERBVEUgLSBEYXRlIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gREFURVRJTUVfTE9DQUwgLSBMb2NhbCBkYXRldGltZSBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEVNQUlMIC0gRW1haWwgaW5wdXQgdHlwZSB3aXRoIHZhbGlkYXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBGSUxFIC0gRmlsZSB1cGxvYWQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhJRERFTiAtIEhpZGRlbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gSU1BR0UgLSBJbWFnZSBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gTU9OVEggLSBNb250aCBwaWNrZXIgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE5VTUJFUiAtIE51bWVyaWMgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBU1NXT1JEIC0gUGFzc3dvcmQgaW5wdXQgdHlwZSB3aXRoIG1hc2tlZCB0ZXh0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkFESU8gLSBSYWRpbyBidXR0b24gaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJBTkdFIC0gUmFuZ2Ugc2xpZGVyIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRVNFVCAtIEZvcm0gcmVzZXQgYnV0dG9uIGlucHV0IHR5cGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBTRUFSQ0ggLSBTZWFyY2ggaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFNVQk1JVCAtIEZvcm0gc3VibWl0IGJ1dHRvbiBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVMIC0gVGVsZXBob25lIG51bWJlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVEVYVCAtIEJhc2ljIHRleHQgaW5wdXQgdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFRJTUUgLSBUaW1lIHBpY2tlciBpbnB1dCB0eXBlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVVJMIC0gVVJMIGlucHV0IHR5cGUgd2l0aCB2YWxpZGF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gV0VFSyAtIFdlZWsgcGlja2VyIGlucHV0IHR5cGVcbiAqXG4gKiBAY29uc3QgSFRNTDVJbnB1dFR5cGVzXG4gKiBAdHlwZSB7SFRNTDVJbnB1dFR5cGVzTWFwfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1SW5wdXRUeXBlcyA9IHtcbiAgQlVUVE9OOiBcImJ1dHRvblwiLFxuICBDSEVDS0JPWDogXCJjaGVja2JveFwiLFxuICBDT0xPUjogXCJjb2xvclwiLFxuICBEQVRFOiBVSUtleXMuREFURSxcbiAgREFURVRJTUVfTE9DQUw6IFwiZGF0ZXRpbWUtbG9jYWxcIixcbiAgRU1BSUw6IFVJS2V5cy5FTUFJTCxcbiAgRklMRTogXCJmaWxlXCIsXG4gIEhJRERFTjogXCJoaWRkZW5cIixcbiAgSU1BR0U6IFwiaW1hZ2VcIixcbiAgTU9OVEg6IFwibW9udGhcIixcbiAgTlVNQkVSOiBcIm51bWJlclwiLFxuICBQQVNTV09SRDogVUlLZXlzLlBBU1NXT1JELFxuICBSQURJTzogXCJyYWRpb1wiLFxuICBSQU5HRTogXCJyYW5nZVwiLFxuICBSRVNFVDogXCJyZXNldFwiLFxuICBTRUFSQ0g6IFwic2VhcmNoXCIsXG4gIFNVQk1JVDogXCJzdWJtaXRcIixcbiAgVEVMOiBcInRlbFwiLFxuICBURVhUOiBcInRleHRcIixcbiAgVElNRTogXCJ0aW1lXCIsXG4gIFVSTDogVUlLZXlzLlVSTCxcbiAgV0VFSzogXCJ3ZWVrXCIsXG59O1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBcnJheSBvZiBIVE1MNSBpbnB1dCB0eXBlcyB0aGF0IHVzZSBjaGVja2JveGVzXG4gKiBAc3VtbWFyeSBMaXN0IG9mIGlucHV0IHR5cGVzIHRoYXQgcmVwcmVzZW50IGNoZWNrYWJsZSBjb250cm9sc1xuICogVGhpcyBjb25zdGFudCBkZWZpbmVzIGFuIGFycmF5IG9mIEhUTUw1IGlucHV0IHR5cGVzIHRoYXQgcmVwcmVzZW50XG4gKiBjaGVja2FibGUgY29udHJvbHMgKGNoZWNrYm94IGFuZCByYWRpbykuXG4gKlxuICogQGNvbnN0IEhUTUw1Q2hlY2tUeXBlc1xuICogQHR5cGUge3N0cmluZ1tdfVxuICogQHJlYWRvbmx5XG4gKiBAbWVtYmVyT2YgbW9kdWxlOnVpLWRlY29yYXRvcnNcbiAqL1xuZXhwb3J0IGNvbnN0IEhUTUw1Q2hlY2tUeXBlcyA9IFtcbiAgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YLFxuICBIVE1MNUlucHV0VHlwZXMuUkFESU8sXG5dO1xuIiwiaW1wb3J0IHsgQmFzZUVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEVycm9yIHRocm93biB3aGVuIGEgcmVuZGVyaW5nIG9wZXJhdGlvbiBmYWlsc1xuICogQHN1bW1hcnkgU3BlY2lhbGl6ZWQgZXJyb3IgZm9yIHJlbmRlcmluZyBmYWlsdXJlcyBpbiBVSSBjb21wb25lbnRzXG4gKiBUaGlzIGVycm9yIGlzIHRocm93biB3aGVuIHRoZSByZW5kZXJpbmcgZW5naW5lIGVuY291bnRlcnMgYW4gZXJyb3Igd2hpbGVcbiAqIGF0dGVtcHRpbmcgdG8gcmVuZGVyIGEgVUkgY29tcG9uZW50IG9yIG1vZGVsLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfEVycm9yfSBtc2cgVGhlIGVycm9yIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAqXG4gKiBAY2xhc3MgUmVuZGVyaW5nRXJyb3JcbiAqIEBleHRlbmRzIEJhc2VFcnJvclxuICogQGNhdGVnb3J5IEVycm9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBUaHJvd2luZyBhIHJlbmRlcmluZyBlcnJvclxuICogdHJ5IHtcbiAqICAgLy8gUmVuZGVyaW5nIGNvZGUgdGhhdCBtaWdodCBmYWlsXG4gKiAgIGlmICghY29tcG9uZW50LmNhblJlbmRlcigpKSB7XG4gKiAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKCdDb21wb25lbnQgY2Fubm90IGJlIHJlbmRlcmVkJyk7XG4gKiAgIH1cbiAqIH0gY2F0Y2ggKGVycm9yKSB7XG4gKiAgIGNvbnNvbGUuZXJyb3IoJ1JlbmRlcmluZyBmYWlsZWQ6JywgZXJyb3IubWVzc2FnZSk7XG4gKiB9XG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJpbmdFcnJvciBleHRlbmRzIEJhc2VFcnJvciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ3JlYXRlcyBhIG5ldyBSZW5kZXJpbmdFcnJvciBpbnN0YW5jZVxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyB0aGUgZXJyb3Igd2l0aCBhIG1lc3NhZ2Ugb3Igb3JpZ2luYWwgZXJyb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXJyb3J9IG1zZyBUaGUgZXJyb3IgbWVzc2FnZSBvciBvcmlnaW5hbCBlcnJvclxuICAgKi9cbiAgY29uc3RydWN0b3IobXNnOiBzdHJpbmcgfCBFcnJvcikge1xuICAgIHN1cGVyKFJlbmRlcmluZ0Vycm9yLm5hbWUsIG1zZyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIGZvcm1hdERhdGUsXG4gIE1vZGVsLFxuICBwYXJzZURhdGUsXG4gIFJlc2VydmVkTW9kZWxzLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBIVE1MNURhdGVGb3JtYXQsIEhUTUw1SW5wdXRUeXBlcywgVUlLZXlzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBmaW5kTW9kZWxJZCwgSW50ZXJuYWxFcnJvciB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgRmllbGRQcm9wZXJ0aWVzIH0gZnJvbSBcIi4vdHlwZXNcIjtcblxuLyoqXG4gKiBAZnVuY3Rpb24gZm9ybWF0QnlUeXBlXG4gKlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCeVR5cGUoXG4gIHR5cGU6IGFueSxcbiAgdmFsdWU6IGFueSxcbiAgLi4uYXJnczogdW5rbm93bltdXG4pOiBzdHJpbmcgfCBudW1iZXIge1xuICBpZiAodHlwZSA9PT0gVUlLZXlzLkRBVEUpIHtcbiAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyA9IChhcmdzLnNoaWZ0KCkgYXMgc3RyaW5nKSB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgcmV0dXJuIGZvcm1hdERhdGUobmV3IERhdGUodmFsdWUpLCBmb3JtYXQpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVmFsdWVCeVR5cGUoXG4gIHR5cGU6IHN0cmluZyxcbiAgdmFsdWU6IHN0cmluZyB8IG51bWJlcixcbiAgZmllbGRQcm9wczogRmllbGRQcm9wZXJ0aWVzXG4pOiBzdHJpbmcgfCBudW1iZXIgfCBEYXRlIHtcbiAgbGV0IHJlc3VsdDogc3RyaW5nIHwgbnVtYmVyIHwgRGF0ZSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgc3dpdGNoICh0eXBlKSB7XG4gICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgcmVzdWx0ID0gcGFyc2VUb051bWJlcih2YWx1ZSk7XG4gICAgICBicmVhaztcbiAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOiB7XG4gICAgICBjb25zdCBmb3JtYXQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IGZpZWxkUHJvcHMuZm9ybWF0O1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5OVU1CRVJcbiAgICAgICAgICA/IG5ldyBEYXRlKHZhbHVlKVxuICAgICAgICAgIDogdmFsdWVcbiAgICAgICAgICAgID8gZm9ybWF0XG4gICAgICAgICAgICAgID8gcGFyc2VEYXRlKGZvcm1hdCwgdmFsdWUpXG4gICAgICAgICAgICAgIDogbmV3IERhdGUodmFsdWUpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgcmVzdWx0ID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBSZXNlcnZlZE1vZGVscy5TVFJJTkdcbiAgICAgICAgICA/IGVzY2FwZUh0bWwodmFsdWUgYXMgc3RyaW5nKVxuICAgICAgICAgIDogcmVzdWx0O1xuICB9XG4gIGlmICh0eXBlb2YgcmVzdWx0ID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXG4gICAgICBgRmFpbGVkIHRvIHBhcnNlIHZhbHVlIG9mIHR5cGUgJHt0eXBlfSBmcm9tICR7dHlwZW9mIHZhbHVlfSAtICR7dmFsdWV9YFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVG9OdW1iZXIodmFsdWU6IHN0cmluZyB8IG51bWJlcikge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiICYmICFpc05hTih2YWx1ZSkpIHJldHVybiB2YWx1ZTtcblxuICBjb25zdCBwYXJzZWQgPSBOdW1iZXIodmFsdWUpO1xuICBpZiAoIWlzTmFOKHBhcnNlZCkpIHJldHVybiBwYXJzZWQ7XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVzY2FwZUh0bWwodmFsdWU6IHN0cmluZykge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gdmFsdWU7XG5cbiAgY29uc3QgdGFnc1RvUmVwbGFjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBcIiZcIjogXCImYW1wO1wiLFxuICAgIFwiPFwiOiBcIiZsdDtcIixcbiAgICBcIj5cIjogXCImZ3Q7XCIsXG4gIH07XG4gIHJldHVybiBgJHt2YWx1ZX1gLnJlcGxhY2UoL1smPD5dL2csICh0YWcpID0+IHtcbiAgICByZXR1cm4gdGFnc1RvUmVwbGFjZVt0YWddIHx8IHRhZztcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnRIdG1sKHZhbHVlOiBzdHJpbmcpIHtcbiAgY29uc3QgdGFnc1RvUmVwbGFjZTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICBcIiZhbXA7XCI6IFwiJlwiLFxuICAgIFwiJmx0O1wiOiBcIjxcIixcbiAgICBcIiZndDtcIjogXCI+XCIsXG4gIH07XG5cbiAgcmV0dXJuIGAke3ZhbHVlfWAucmVwbGFjZSgvJmx0O3wmZ3Q7fCZhbXA7L2csICh0YWcpID0+IHtcbiAgICByZXR1cm4gdGFnc1RvUmVwbGFjZVt0YWddIHx8IHRhZztcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZW5lcmF0ZVVJTW9kZWxJRDxNIGV4dGVuZHMgTW9kZWw+KG1vZGVsOiBNKSB7XG4gIGxldCBpZDogc3RyaW5nIHwgbnVtYmVyIHwgYmlnaW50O1xuICB0cnkge1xuICAgIGlkID0gZmluZE1vZGVsSWQobW9kZWwpIGFzIHN0cmluZyB8IG51bWJlcjtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICBpZCA9IERhdGUubm93KCk7XG4gIH1cbiAgY29uc3QgbmFtZSA9IG1vZGVsLmNvbnN0cnVjdG9yLm5hbWU7XG4gIHJldHVybiBgJHtuYW1lfS0ke2lkfWA7XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEVycm9yIH0gZnJvbSBcIkBkZWNhZi10cy9kYi1kZWNvcmF0b3JzXCI7XG5pbXBvcnQge1xuICBDb25zdHJ1Y3RvcixcbiAgTW9kZWwsXG4gIE1vZGVsQ29uc3RydWN0b3IsXG4gIFJlc2VydmVkTW9kZWxzLFxuICBWYWxpZGF0aW9uS2V5cyxcbiAgVmFsaWRhdGlvbk1ldGFkYXRhLFxufSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQge1xuICBIVE1MNURhdGVGb3JtYXQsXG4gIEhUTUw1SW5wdXRUeXBlcyxcbiAgVUlLZXlzLFxuICBWYWxpZGF0YWJsZUJ5QXR0cmlidXRlLFxuICBWYWxpZGF0YWJsZUJ5VHlwZSxcbn0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQge1xuICBGaWVsZERlZmluaXRpb24sXG4gIEZpZWxkUHJvcGVydGllcyxcbiAgVUlFbGVtZW50TWV0YWRhdGEsXG4gIFVJTGlzdEl0ZW1FbGVtZW50TWV0YWRhdGEsXG4gIFVJTGlzdEl0ZW1Nb2RlbE1ldGFkYXRhLFxuICBVSU1vZGVsTWV0YWRhdGEsXG4gIFVJUHJvcE1ldGFkYXRhLFxufSBmcm9tIFwiLi90eXBlc1wiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB7IERlY29yYXRvck1ldGFkYXRhLCBSZWZsZWN0aW9uIH0gZnJvbSBcIkBkZWNhZi10cy9yZWZsZWN0aW9uXCI7XG5pbXBvcnQgeyBmb3JtYXRCeVR5cGUsIGdlbmVyYXRlVUlNb2RlbElEIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gQWJzdHJhY3QgY2xhc3MgZm9yIHJlbmRlcmluZyBVSSBjb21wb25lbnRzIGJhc2VkIG9uIG1vZGVsIG1ldGFkYXRhLlxuICogQHN1bW1hcnkgVGhlIFJlbmRlcmluZ0VuZ2luZSBjbGFzcyBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgY29udmVydGluZyBtb2RlbCBtZXRhZGF0YSBpbnRvIFVJIGZpZWxkIGRlZmluaXRpb25zLlxuICogSXQgaGFuZGxlcyB0aGUgdHJhbnNsYXRpb24gb2YgbW9kZWwgcHJvcGVydGllcyB0byBVSSBlbGVtZW50cywgYXBwbGllcyB2YWxpZGF0aW9uIHJ1bGVzLCBhbmQgbWFuYWdlcyBkaWZmZXJlbnQgcmVuZGVyaW5nIGZsYXZvcnMuXG4gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGJ5IHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFQgVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyByZXN1bHQsIGRlZmF1bHRzIHRvIHZvaWRcbiAqIEB0ZW1wbGF0ZSBSIFRoZSB0eXBlIG9mIHRoZSBmaWVsZCBkZWZpbml0aW9uLCBkZWZhdWx0cyB0byBGaWVsZERlZmluaXRpb248VD5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZmxhdm91ciAtIFRoZSBmbGF2b3Igb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUuXG4gKlxuICogQGNsYXNzIFJlbmRlcmluZ0VuZ2luZVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyaW5nRW5naW5lPFQgPSB2b2lkLCBSID0gRmllbGREZWZpbml0aW9uPFQ+PiB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2FjaGUgZm9yIHN0b3JpbmcgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZXMgb3IgY29uc3RydWN0b3JzLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjYWNoZTogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICB8IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPj5cbiAgICB8IFJlbmRlcmluZ0VuZ2luZTx1bmtub3duLCB1bmtub3duPlxuICA+ID0ge307XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBUaGUgY3VycmVudGx5IGFjdGl2ZSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAcHJpdmF0ZVxuICAgKiBAc3RhdGljXG4gICAqL1xuICBwcml2YXRlIHN0YXRpYyBjdXJyZW50OlxuICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+PlxuICAgIHwgUmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVuZGVyaW5nIGVuZ2luZSBoYXMgYmVlbiBpbml0aWFsaXplZC5cbiAgICovXG4gIHByb3RlY3RlZCBpbml0aWFsaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3RvcihyZWFkb25seSBmbGF2b3VyOiBzdHJpbmcpIHtcbiAgICBSZW5kZXJpbmdFbmdpbmUucmVnaXN0ZXIodGhpcyk7XG4gICAgY29uc29sZS5sb2coYGRlY2FmJ3MgJHtmbGF2b3VyfSByZW5kZXJpbmcgZW5naW5lIGxvYWRlZGApO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBJbml0aWFsaXplcyB0aGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgQWJzdHJhY3QgbWV0aG9kIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgZm9yIHNwZWNpZmljIGluaXRpYWxpemF0aW9uIGxvZ2ljLlxuICAgKlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIG5lZWRlZCBmb3IgaW5pdGlhbGl6YXRpb24uXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFic3RyYWN0IGluaXRpYWxpemUoLi4uYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gVHJhbnNsYXRlcyBiZXR3ZWVuIG1vZGVsIHR5cGVzIGFuZCBIVE1MIGlucHV0IHR5cGVzLlxuICAgKiBAc3VtbWFyeSBDb252ZXJ0cyBtb2RlbCBkYXRhIHR5cGVzIHRvIGFwcHJvcHJpYXRlIEhUTUwgaW5wdXQgdHlwZXMgYW5kIHZpY2UgdmVyc2EuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHRyYW5zbGF0ZS5cbiAgICogQHBhcmFtIHtib29sZWFufSBbdG9WaWV3PXRydWVdIC0gRGlyZWN0aW9uIG9mIHRyYW5zbGF0aW9uICh0cnVlIGZvciBtb2RlbCB0byB2aWV3LCBmYWxzZSBmb3IgdmlldyB0byBtb2RlbCkuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSB0cmFuc2xhdGVkIHR5cGUuXG4gICAqL1xuICB0cmFuc2xhdGUoa2V5OiBzdHJpbmcsIHRvVmlldzogYm9vbGVhbiA9IHRydWUpOiBzdHJpbmcge1xuICAgIGlmICh0b1ZpZXcpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuU1RSSU5HOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuVEVYVDtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5OVU1CRVI6XG4gICAgICAgIGNhc2UgUmVzZXJ2ZWRNb2RlbHMuQklHSU5UOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuTlVNQkVSO1xuICAgICAgICBjYXNlIFJlc2VydmVkTW9kZWxzLkJPT0xFQU46XG4gICAgICAgICAgcmV0dXJuIEhUTUw1SW5wdXRUeXBlcy5DSEVDS0JPWDtcbiAgICAgICAgY2FzZSBSZXNlcnZlZE1vZGVscy5EQVRFOlxuICAgICAgICAgIHJldHVybiBIVE1MNUlucHV0VHlwZXMuREFURTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3dpdGNoIChrZXkpIHtcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVYVDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuRU1BSUw6XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNPTE9SOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5QQVNTV09SRDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVEVMOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5VUkw6XG4gICAgICAgICAgcmV0dXJuIFJlc2VydmVkTW9kZWxzLlNUUklORztcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuTlVNQkVSOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5OVU1CRVI7XG4gICAgICAgIGNhc2UgSFRNTDVJbnB1dFR5cGVzLkNIRUNLQk9YOlxuICAgICAgICAgIHJldHVybiBSZXNlcnZlZE1vZGVscy5CT09MRUFOO1xuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFOlxuICAgICAgICBjYXNlIEhUTUw1SW5wdXRUeXBlcy5EQVRFVElNRV9MT0NBTDpcbiAgICAgICAgY2FzZSBIVE1MNUlucHV0VHlwZXMuVElNRTpcbiAgICAgICAgICByZXR1cm4gUmVzZXJ2ZWRNb2RlbHMuREFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGtleTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBpdHMgbmF0dXJlLlxuICAgKiBAc3VtbWFyeSBEZXRlcm1pbmVzIGlmIGEgZ2l2ZW4gVUkga2V5IHJlcHJlc2VudHMgYSB0eXBlIHRoYXQgaXMgaW5oZXJlbnRseSB2YWxpZGF0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBVSSBrZXkgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkYXRhYmxlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgaXNWYWxpZGF0YWJsZUJ5VHlwZShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5VHlwZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ2hlY2tzIGlmIGEgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUuXG4gICAqIEBzdW1tYXJ5IERldGVybWluZXMgaWYgYSBnaXZlbiBVSSBrZXkgcmVwcmVzZW50cyBhIHZhbGlkYXRpb24gdGhhdCBjYW4gYmUgYXBwbGllZCBhcyBhbiBhdHRyaWJ1dGUuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUgVUkga2V5IHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZGF0YWJsZSBieSBhdHRyaWJ1dGUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHByb3RlY3RlZCBpc1ZhbGlkYXRhYmxlQnlBdHRyaWJ1dGUoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoVmFsaWRhdGFibGVCeUF0dHJpYnV0ZSkuaW5jbHVkZXMoa2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgdmFsaWRhdGlvbiBtZXRhZGF0YSB0byBhbiBhdHRyaWJ1dGUgdmFsdWUuXG4gICAqIEBzdW1tYXJ5IFRyYW5zZm9ybXMgdmFsaWRhdGlvbiBtZXRhZGF0YSBpbnRvIGEgdmFsdWUgc3VpdGFibGUgZm9yIHVzZSBhcyBhbiBIVE1MIGF0dHJpYnV0ZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSB2YWxpZGF0aW9uIGtleS5cbiAgICogQHBhcmFtIHtWYWxpZGF0aW9uTWV0YWRhdGF9IHZhbHVlIC0gVGhlIHZhbGlkYXRpb24gbWV0YWRhdGEuXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudW1iZXIgfCBib29sZWFufSBUaGUgY29udmVydGVkIGF0dHJpYnV0ZSB2YWx1ZS5cbiAgICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBnaXZlbiBrZXkgaXMgbm90IHZhbGlkYXRhYmxlIGJ5IGF0dHJpYnV0ZS5cbiAgICovXG4gIHByb3RlY3RlZCB0b0F0dHJpYnV0ZVZhbHVlKFxuICAgIGtleTogc3RyaW5nLFxuICAgIHZhbHVlOiBWYWxpZGF0aW9uTWV0YWRhdGFcbiAgKTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB7XG4gICAgaWYgKCFPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5pbmNsdWRlcyhrZXkpKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBhdHRyaWJ1dGUga2V5IFwiJHtrZXl9XCIuIEV4cGVjdGVkIG9uZSBvZjogJHtPYmplY3Qua2V5cyhWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKS5qb2luKFwiLCBcIil9LmBcbiAgICAgICk7XG5cbiAgICByZXR1cm4ga2V5ID09PSBVSUtleXMuUkVRVUlSRUQgPyB0cnVlIDogdmFsdWVba2V5XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gQ29udmVydHMgYSBtb2RlbCB0byBhIGZpZWxkIGRlZmluaXRpb24uXG4gICAqIEBzdW1tYXJ5IFByb2Nlc3NlcyBhIG1vZGVsIGluc3RhbmNlLCBleHRyYWN0aW5nIFVJLXJlbGF0ZWQgbWV0YWRhdGEgYW5kIHZhbGlkYXRpb24gcnVsZXMgdG8gY3JlYXRlIGEgZmllbGQgZGVmaW5pdGlvbi5cbiAgICpcbiAgICogQHRlbXBsYXRlIE0gVHlwZSBleHRlbmRpbmcgTW9kZWxcbiAgICogQHRlbXBsYXRlIFQgVHlwZSByZWZlcmVuY2luZyB0aGUgc3BlY2lmaWMgUmVuZGVyaW5nIGVuZ2luZSBmaWVsZCBwcm9wZXJ0aWVzL2lucHV0c1xuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIGluc3RhbmNlIHRvIGNvbnZlcnQuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IFtnbG9iYWxQcm9wcz17fV0gLSBHbG9iYWwgcHJvcGVydGllcyB0byBhcHBseSB0byBhbGwgY2hpbGQgZWxlbWVudHMuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2dlbmVyYXRlSWQ9dHJ1ZV0gLSBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0byBwb3B1bGF0ZSB0aGUgcmVuZGVyZXJJZCBwcm9wZXJ0eS5cbiAgICogQHJldHVybnMge0ZpZWxkRGVmaW5pdGlvbjxUPn0gQSBmaWVsZCBkZWZpbml0aW9uIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIFVJIHN0cnVjdHVyZSBvZiB0aGUgbW9kZWwuXG4gICAqIEB0aHJvd3Mge1JlbmRlcmluZ0Vycm9yfSBJZiBubyBVSSBkZWZpbml0aW9ucyBhcmUgc2V0IGZvciB0aGUgbW9kZWwgb3IgaWYgdGhlcmUgYXJlIGludmFsaWQgZGVjb3JhdG9ycy5cbiAgICpcbiAgICogQG1lcm1haWRcbiAgICogc2VxdWVuY2VEaWFncmFtXG4gICAqICBwYXJ0aWNpcGFudCBDIGFzIENsaWVudFxuICAgKiAgcGFydGljaXBhbnQgUkUgYXMgUmVuZGVyaW5nRW5naW5lXG4gICAqICBwYXJ0aWNpcGFudCBSIGFzIFJlZmxlY3Rpb25cbiAgICogIHBhcnRpY2lwYW50IE0gYXMgTW9kZWxcbiAgICogIEMtPj5SRTogdG9GaWVsZERlZmluaXRpb24obW9kZWwsIGdsb2JhbFByb3BzKVxuICAgKiAgUkUtPj5SOiBnZXRNZXRhZGF0YShVSUtleXMuVUlNT0RFTCwgbW9kZWwuY29uc3RydWN0b3IpXG4gICAqICBSLS0+PlJFOiBVSU1vZGVsTWV0YWRhdGFcbiAgICogIFJFLT4+UjogZ2V0QWxsUHJvcGVydHlEZWNvcmF0b3JzKG1vZGVsLCBVSUtleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhW10+XG4gICAqICBSRS0+PlI6IGdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhtb2RlbCwgVmFsaWRhdGlvbktleXMuUkVGTEVDVClcbiAgICogIFItLT4+UkU6IFJlY29yZDxzdHJpbmcsIERlY29yYXRvck1ldGFkYXRhPFZhbGlkYXRpb25NZXRhZGF0YT5bXT5cbiAgICogIGxvb3AgRm9yIGVhY2ggcHJvcGVydHlcbiAgICogICAgUkUtPj5SRTogUHJvY2VzcyBVSSBkZWNvcmF0b3JzXG4gICAqICAgIFJFLT4+UkU6IEFwcGx5IHZhbGlkYXRpb24gcnVsZXNcbiAgICogIGVuZFxuICAgKiAgUkUtLT4+QzogRmllbGREZWZpbml0aW9uPFQ+XG4gICAqL1xuICBwcm90ZWN0ZWQgdG9GaWVsZERlZmluaXRpb248TSBleHRlbmRzIE1vZGVsPihcbiAgICBtb2RlbDogTSxcbiAgICBnbG9iYWxQcm9wczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbiAgICBnZW5lcmF0ZUlkOiBib29sZWFuID0gdHJ1ZVxuICApOiBGaWVsZERlZmluaXRpb248VD4ge1xuICAgIGNvbnN0IHsgaW5oZXJpdFByb3BzLCAuLi5nbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cyB9ID0gZ2xvYmFsUHJvcHM7XG4gICAgZ2xvYmFsUHJvcHMgPSBnbG9iYWxQcm9wc1dpdGhvdXRJbmhlcml0cztcblxuICAgIGNvbnN0IGNsYXNzRGVjb3JhdG9yczogVUlNb2RlbE1ldGFkYXRhW10gfCBVSUxpc3RJdGVtTW9kZWxNZXRhZGF0YVtdID0gW1xuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksXG4gICAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUSVRFTSksXG4gICAgICAgIG1vZGVsLmNvbnN0cnVjdG9yXG4gICAgICApIHx8XG4gICAgICAgIFJlZmxlY3QuZ2V0TWV0YWRhdGEoXG4gICAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUSVRFTSksXG4gICAgICAgICAgTW9kZWwuZ2V0KG1vZGVsLmNvbnN0cnVjdG9yLm5hbWUpIGFzIGFueVxuICAgICAgICApLFxuICAgICAgUmVmbGVjdC5nZXRNZXRhZGF0YShcbiAgICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLFxuICAgICAgICBtb2RlbC5jb25zdHJ1Y3RvclxuICAgICAgKSB8fFxuICAgICAgICBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgICAgIFJlbmRlcmluZ0VuZ2luZS5rZXkoVUlLZXlzLkhBTkRMRVJTKSxcbiAgICAgICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgYXMgYW55XG4gICAgICAgICksXG4gICAgXS5maWx0ZXIoQm9vbGVhbik7XG5cbiAgICBpZiAoIWNsYXNzRGVjb3JhdG9ycy5sZW5ndGgpXG4gICAgICB0aHJvdyBuZXcgUmVuZGVyaW5nRXJyb3IoXG4gICAgICAgIGBObyB1aSBkZWZpbml0aW9ucyBzZXQgZm9yIG1vZGVsICR7bW9kZWwuY29uc3RydWN0b3IubmFtZX0uIERpZCB5b3UgdXNlIEB1aW1vZGVsP2BcbiAgICAgICk7XG5cbiAgICBjb25zdCBjbGFzc0RlY29yYXRvciA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7fSxcbiAgICAgIC4uLmNsYXNzRGVjb3JhdG9ycyxcbiAgICAgIGluaGVyaXRQcm9wcyA/IGluaGVyaXRQcm9wcyA6IHt9IC8vIG92ZXJyaWRlIHRhZyBhbmQgcHJvcGVydGllcyB3aGVuIGl0IGlzIGEgY29tcG9uZW50IHRoYXQgc2hvdWxkIGluaGVyaXQgcHJvcGVydGllcyBmcm9tIGl0cyBwYXJlbnQuXG4gICAgKTtcbiAgICBjb25zdCB7IHRhZywgcHJvcHMsIGl0ZW0sIGhhbmRsZXJzIH0gPSBjbGFzc0RlY29yYXRvcjtcblxuICAgIGNvbnN0IHVpRGVjb3JhdG9yczogUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGFbXT4gPVxuICAgICAgUmVmbGVjdGlvbi5nZXRBbGxQcm9wZXJ0eURlY29yYXRvcnMobW9kZWwsIFVJS2V5cy5SRUZMRUNUKSBhcyBSZWNvcmQ8XG4gICAgICAgIHN0cmluZyxcbiAgICAgICAgRGVjb3JhdG9yTWV0YWRhdGFbXVxuICAgICAgPjtcbiAgICBsZXQgY2hpbGRyZW46IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PltdIHwgdW5kZWZpbmVkO1xuICAgIGxldCBjaGlsZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+ID0gaXRlbT8ucHJvcHMgfHwge307XG4gICAgbGV0IG1hcHBlcjogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGNvbnN0IGdldFBhdGggPSAocGFyZW50OiBzdHJpbmcgfCB1bmRlZmluZWQsIHByb3A6IHN0cmluZykgPT4ge1xuICAgICAgcmV0dXJuIHBhcmVudCA/IFtwYXJlbnQsIHByb3BdLmpvaW4oXCIuXCIpIDogcHJvcDtcbiAgICB9O1xuXG4gICAgaWYgKHVpRGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdGlvbkRlY29yYXRvcnM6IFJlY29yZDxcbiAgICAgICAgc3RyaW5nLFxuICAgICAgICBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W11cbiAgICAgID4gPSBSZWZsZWN0aW9uLmdldEFsbFByb3BlcnR5RGVjb3JhdG9ycyhcbiAgICAgICAgbW9kZWwsXG4gICAgICAgIFZhbGlkYXRpb25LZXlzLlJFRkxFQ1RcbiAgICAgICkgYXMgUmVjb3JkPHN0cmluZywgRGVjb3JhdG9yTWV0YWRhdGE8VmFsaWRhdGlvbk1ldGFkYXRhPltdPjtcblxuICAgICAgZm9yIChjb25zdCBrZXkgaW4gdWlEZWNvcmF0b3JzKSB7XG4gICAgICAgIGNvbnN0IGRlY3MgPSB1aURlY29yYXRvcnNba2V5XTtcbiAgICAgICAgY29uc3QgdHlwZXMgPSBPYmplY3QudmFsdWVzKGRlY3MpLmZpbHRlcihcbiAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5rZXkgPT09IFVJS2V5cy5QUk9QIHx8IGl0ZW0ua2V5ID09PSBVSUtleXMuRUxFTUVOVFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZXM/Lmxlbmd0aCA+IDEpXG4gICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKFxuICAgICAgICAgICAgYE9ubHkgb25lIHR5cGUgb2YgZGVjb3JhdGlvbiBpcyBhbGxvd2VkLiBQbGVhc2UgY2hvb3NlIGJldHdlZW4gQHVpcHJvcCBhbmQgQHVpZWxlbWVudGBcbiAgICAgICAgICApO1xuICAgICAgICBkZWNzLnNoaWZ0KCk7XG4gICAgICAgIGRlY3MuZm9yRWFjaCgoZGVjKSA9PiB7XG4gICAgICAgICAgaWYgKCFkZWMpIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgTm8gZGVjb3JhdG9yIGZvdW5kYCk7XG5cbiAgICAgICAgICBzd2l0Y2ggKGRlYy5rZXkpIHtcbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlBST1A6IHtcbiAgICAgICAgICAgICAgY2hpbGRQcm9wc1trZXldID0gZGVjLnByb3BzIGFzIFVJUHJvcE1ldGFkYXRhO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLkNISUxEOiB7XG4gICAgICAgICAgICAgIGlmICghTW9kZWwuaXNQcm9wZXJ0eU1vZGVsKG1vZGVsLCBrZXkpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZW5kZXJpbmdFcnJvcihgQ2hpbGQgXCIke2tleX1cIiBtdXN0IGJlIGEgbW9kZWwuYCk7XG5cbiAgICAgICAgICAgICAgbGV0IENsYXp6O1xuICAgICAgICAgICAgICBjb25zdCBzdWJtb2RlbCA9IChtb2RlbCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtrZXldIGFzIE1vZGVsO1xuICAgICAgICAgICAgICBjb25zdCBjb25zdHJ1Y3RhYmxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2Ygc3VibW9kZWwgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgICAgICBzdWJtb2RlbCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgICFBcnJheS5pc0FycmF5KHN1Ym1vZGVsKTtcbiAgICAgICAgICAgICAgLy8gY3JlYXRlIGluc3RhbmNlIGlmIHVuZGVmaW5lZFxuICAgICAgICAgICAgICBpZiAoIWNvbnN0cnVjdGFibGUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjbGF6ek5hbWUgPSAoZGVjLnByb3BzLnByb3BzIGFzIFJlY29yZDxzdHJpbmcsIGFueT4pXG4gICAgICAgICAgICAgICAgICA/Lm5hbWUgYXMgc3RyaW5nO1xuICAgICAgICAgICAgICAgIENsYXp6ID0gbmV3IChNb2RlbC5nZXQoY2xhenpOYW1lKSBhcyBNb2RlbENvbnN0cnVjdG9yPE1vZGVsPikoKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuR2xvYmFsUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBnbG9iYWxQcm9wcyB8fCB7fSwge1xuICAgICAgICAgICAgICAgIGluaGVyaXRQcm9wczogZGVjLnByb3BzIGFzIFVJTW9kZWxNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICBjaGlsZE9mOiBnZXRQYXRoKGdsb2JhbFByb3BzPy5jaGlsZE9mIGFzIHN0cmluZywga2V5KSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGNoaWxkRGVmaW5pdGlvbiA9IHRoaXMudG9GaWVsZERlZmluaXRpb24oXG4gICAgICAgICAgICAgICAgc3VibW9kZWwgfHwgQ2xhenosIC8vIE11c3QgYXZvaWQgdW5kZWZpbmVkIHZhbHVlcyDigJQgYW4gaW5zdGFuY2UgaXMgcmVxdWlyZWQgdG8gcmV0cmlldmUgcHJvcGVydGllcy5cbiAgICAgICAgICAgICAgICBjaGlsZHJlbkdsb2JhbFByb3BzLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkcmVuLnB1c2goXG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uIGFzIEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PlxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgVUlLZXlzLlVJTElTVFBST1A6IHtcbiAgICAgICAgICAgICAgbWFwcGVyID0gbWFwcGVyIHx8IHt9O1xuICAgICAgICAgICAgICBtYXBwZXJbZGVjLnByb3BzPy5uYW1lIGFzIHN0cmluZ10gPSBrZXk7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICBjbGFzc0RlY29yYXRvci5wcm9wcz8uaXRlbSB8fCB7fSxcbiAgICAgICAgICAgICAgICBpdGVtPy5wcm9wcyB8fCB7fSxcbiAgICAgICAgICAgICAgICBkZWMucHJvcHM/LnByb3BzIHx8IHt9LFxuICAgICAgICAgICAgICAgIGdsb2JhbFByb3BzXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNoaWxkUHJvcHMgPSB7XG4gICAgICAgICAgICAgICAgdGFnOiBpdGVtPy50YWcgfHwgcHJvcHMucmVuZGVyIHx8IFwiXCIsXG4gICAgICAgICAgICAgICAgcHJvcHM6IE9iamVjdC5hc3NpZ24oe30sIGNoaWxkUHJvcHM/LnByb3BzLCB7IG1hcHBlciB9LCBwcm9wcyksXG4gICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFVJS2V5cy5FTEVNRU5UOiB7XG4gICAgICAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4gfHwgW107XG5cbiAgICAgICAgICAgICAgY29uc3QgdWlQcm9wczogVUlFbGVtZW50TWV0YWRhdGEgPSBkZWMucHJvcHMgYXMgVUlFbGVtZW50TWV0YWRhdGE7XG4gICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgICAgICB7fSxcbiAgICAgICAgICAgICAgICB1aVByb3BzLnByb3BzIGFzIGFueSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBwYXRoOiBnZXRQYXRoKFxuICAgICAgICAgICAgICAgICAgICBnbG9iYWxQcm9wcz8uY2hpbGRPZiBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgIHVpUHJvcHMucHJvcHMhLm5hbWVcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICBjaGlsZE9mOiB1bmRlZmluZWQsIC8vIFRoZSBjaGlsZE9mIHByb3AgaXMgcGFzc2VkIGJ5IGdsb2JhbFByb3BzIHdoZW4gaXQgaXMgYSBuZXN0ZWQgcHJvcFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2xvYmFsUHJvcHNcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBjaGlsZERlZmluaXRpb246IEZpZWxkRGVmaW5pdGlvbjxSZWNvcmQ8c3RyaW5nLCBhbnk+PiA9IHtcbiAgICAgICAgICAgICAgICB0YWc6IHVpUHJvcHMudGFnLFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRpb25EZWNzOiBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W10gPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNvcmF0b3JzW1xuICAgICAgICAgICAgICAgICAga2V5XG4gICAgICAgICAgICAgICAgXSBhcyBEZWNvcmF0b3JNZXRhZGF0YTxWYWxpZGF0aW9uTWV0YWRhdGE+W107XG5cbiAgICAgICAgICAgICAgY29uc3QgdHlwZURlYzogRGVjb3JhdG9yTWV0YWRhdGFPYmplY3QgPVxuICAgICAgICAgICAgICAgIHZhbGlkYXRpb25EZWNzLnNoaWZ0KCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjIG9mIHZhbGlkYXRpb25EZWNzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5QXR0cmlidXRlKGRlYy5rZXkpKSB7XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbdGhpcy50cmFuc2xhdGUoZGVjLmtleSldID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b0F0dHJpYnV0ZVZhbHVlKGRlYy5rZXksIGRlYy5wcm9wcyk7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZGF0YWJsZUJ5VHlwZShkZWMua2V5KSkge1xuICAgICAgICAgICAgICAgICAgaWYgKGRlYy5rZXkgPT09IEhUTUw1SW5wdXRUeXBlcy5EQVRFKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wc1tVSUtleXMuRk9STUFUXSA9XG4gICAgICAgICAgICAgICAgICAgICAgZGVjLnByb3BzLmZvcm1hdCB8fCBIVE1MNURhdGVGb3JtYXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdID0gZGVjLmtleTtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGlmICghY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhc2ljVHlwZSA9ICh0eXBlRGVjLnByb3BzIGFzIHsgbmFtZTogc3RyaW5nIH0pLm5hbWU7XG4gICAgICAgICAgICAgICAgY2hpbGREZWZpbml0aW9uLnByb3BzW1VJS2V5cy5UWVBFXSA9IHRoaXMudHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgICAgYmFzaWNUeXBlLnRvTG93ZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNoaWxkRGVmaW5pdGlvbi5wcm9wcy52YWx1ZSA9IGZvcm1hdEJ5VHlwZShcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLlRZUEVdLFxuICAgICAgICAgICAgICAgIG1vZGVsW2tleSBhcyBrZXlvZiBNXSxcbiAgICAgICAgICAgICAgICBjaGlsZERlZmluaXRpb24ucHJvcHNbVUlLZXlzLkZPUk1BVF1cbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjaGlsZHJlbi5wdXNoKGNoaWxkRGVmaW5pdGlvbik7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlbmRlcmluZ0Vycm9yKGBJbnZhbGlkIGtleTogJHtkZWMua2V5fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBGaWVsZERlZmluaXRpb248VD4gPSB7XG4gICAgICB0YWc6IHRhZyxcbiAgICAgIGl0ZW06IGNoaWxkUHJvcHMgYXMgVUlMaXN0SXRlbUVsZW1lbnRNZXRhZGF0YSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcywgZ2xvYmFsUHJvcHMsIHtcbiAgICAgICAgaGFuZGxlcnM6IGhhbmRsZXJzIHx8IHt9LFxuICAgICAgfSkgYXMgVCAmIEZpZWxkUHJvcGVydGllcyxcbiAgICAgIGNoaWxkcmVuOiBjaGlsZHJlbiBhcyBGaWVsZERlZmluaXRpb248YW55PltdLFxuICAgIH07XG5cbiAgICBpZiAoZ2VuZXJhdGVJZCkgcmVzdWx0LnJlbmRlcmVySWQgPSBnZW5lcmF0ZVVJTW9kZWxJRChtb2RlbCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZW5kZXJzIGEgbW9kZWwgd2l0aCBnbG9iYWwgcHJvcGVydGllcyBhbmQgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gICAqIEBzdW1tYXJ5IEFic3RyYWN0IG1ldGhvZCB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGRlZmluZSBzcGVjaWZpYyByZW5kZXJpbmcgYmVoYXZpb3IuXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBNIFR5cGUgZXh0ZW5kaW5nIE1vZGVsXG4gICAqIEB0ZW1wbGF0ZSBSIFJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgb3V0cHV0IHR5cGVcbiAgICogQHBhcmFtIHtNfSBtb2RlbCAtIFRoZSBtb2RlbCB0byBiZSByZW5kZXJlZC5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gZ2xvYmFsUHJvcHMgLSBHbG9iYWwgcHJvcGVydGllcyB0byBiZSBhcHBsaWVkIHRvIGFsbCBlbGVtZW50cyBkdXJpbmcgcmVuZGVyaW5nLlxuICAgKiBAcGFyYW0gey4uLmFueVtdfSBhcmdzIC0gQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBtYXkgYmUgcmVxdWlyZWQgZm9yIHNwZWNpZmljIHJlbmRlcmluZyBpbXBsZW1lbnRhdGlvbnMuXG4gICAqIEByZXR1cm5zIHtSfSBUaGUgcmVuZGVyZWQgcmVzdWx0LCB0eXBlIGRlcGVuZHMgb24gdGhlIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLlxuICAgKlxuICAgKiBAYWJzdHJhY3RcbiAgICovXG4gIGFic3RyYWN0IHJlbmRlcjxNIGV4dGVuZHMgTW9kZWw+KFxuICAgIG1vZGVsOiBNLFxuICAgIGdsb2JhbFByb3BzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICAuLi5hcmdzOiBhbnlbXVxuICApOiBSO1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGEgcmVuZGVyaW5nIGVuZ2luZSBpbnN0YW5jZS5cbiAgICogQHN1bW1hcnkgQWRkcyBhIHJlbmRlcmluZyBlbmdpbmUgdG8gdGhlIHN0YXRpYyBjYWNoZSBhbmQgc2V0cyBpdCBhcyB0aGUgY3VycmVudCBlbmdpbmUuXG4gICAqXG4gICAqIEBwYXJhbSB7UmVuZGVyaW5nRW5naW5lPHVua25vd24sIHVua25vd24+fSBlbmdpbmUgLSBUaGUgcmVuZGVyaW5nIGVuZ2luZSB0byByZWdpc3Rlci5cbiAgICogQHRocm93cyB7SW50ZXJuYWxFcnJvcn0gSWYgYW4gZW5naW5lIHdpdGggdGhlIHNhbWUgZmxhdm9yIGFscmVhZHkgZXhpc3RzLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXIoZW5naW5lOiBSZW5kZXJpbmdFbmdpbmU8dW5rbm93biwgdW5rbm93bj4pIHtcbiAgICBpZiAoZW5naW5lLmZsYXZvdXIgaW4gdGhpcy5jYWNoZSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2VuZ2luZS5mbGF2b3VyfSBhbHJlYWR5IGV4aXN0c2BcbiAgICAgICk7XG4gICAgdGhpcy5jYWNoZVtlbmdpbmUuZmxhdm91cl0gPSBlbmdpbmU7XG4gICAgdGhpcy5jdXJyZW50ID0gZW5naW5lO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgb3IgaW5pdGlhbGl6ZXMgYSByZW5kZXJpbmcgZW5naW5lLlxuICAgKiBAc3VtbWFyeSBHZXRzIGFuIGV4aXN0aW5nIGVuZ2luZSBpbnN0YW5jZSBvciBjcmVhdGVzIGFuZCBpbml0aWFsaXplcyBhIG5ldyBvbmUgaWYgZ2l2ZW4gYSBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7Q29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PiB8IFJlbmRlcmluZ0VuZ2luZTxPPn0gb2JqIC0gVGhlIGVuZ2luZSBpbnN0YW5jZSBvciBjb25zdHJ1Y3Rvci5cbiAgICogQHJldHVybnMge1JlbmRlcmluZ0VuZ2luZTxPPn0gVGhlIGluaXRpYWxpemVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqIEBzdGF0aWNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGdldE9yQm9vdDxPPihcbiAgICBvYmo6IENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgKTogUmVuZGVyaW5nRW5naW5lPE8+IHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgUmVuZGVyaW5nRW5naW5lKSByZXR1cm4gb2JqIGFzIFJlbmRlcmluZ0VuZ2luZTxPPjtcbiAgICBjb25zdCBlbmdpbmU6IFJlbmRlcmluZ0VuZ2luZTxPPiA9IG5ldyBvYmooKTtcbiAgICBlbmdpbmUuaW5pdGlhbGl6ZSgpOyAvLyBtYWtlIHRoZSBib290aW5nIGFzeW5jLiB1c2UgdGhlIGluaXRpYWxpemVkIGZsYWcgdG8gY29udHJvbCBpdFxuICAgIHJldHVybiBlbmdpbmUgYXMgUmVuZGVyaW5nRW5naW5lPE8+O1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBSZXRyaWV2ZXMgYSByZW5kZXJpbmcgZW5naW5lIGJ5IGZsYXZvci5cbiAgICogQHN1bW1hcnkgR2V0cyB0aGUgY3VycmVudCByZW5kZXJpbmcgZW5naW5lIG9yIGEgc3BlY2lmaWMgb25lIGJ5IGZsYXZvci5cbiAgICpcbiAgICogQHRlbXBsYXRlIE8gVGhlIHR5cGUgb2YgdGhlIHJlbmRlcmluZyBlbmdpbmUgb3V0cHV0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gLSBUaGUgZmxhdm9yIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHJldHJpZXZlLlxuICAgKiBAcmV0dXJucyB7UmVuZGVyaW5nRW5naW5lPE8+fSBUaGUgcmVxdWVzdGVkIHJlbmRlcmluZyBlbmdpbmUuXG4gICAqIEB0aHJvd3Mge0ludGVybmFsRXJyb3J9IElmIHRoZSByZXF1ZXN0ZWQgZmxhdm9yIGRvZXMgbm90IGV4aXN0LlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgZ2V0PE8+KGZsYXZvdXI/OiBzdHJpbmcpOiBSZW5kZXJpbmdFbmdpbmU8Tz4ge1xuICAgIGlmICghZmxhdm91cilcbiAgICAgIHJldHVybiB0aGlzLmdldE9yQm9vdDxPPihcbiAgICAgICAgdGhpcy5jdXJyZW50IGFzIENvbnN0cnVjdG9yPFJlbmRlcmluZ0VuZ2luZTxPPj4gfCBSZW5kZXJpbmdFbmdpbmU8Tz5cbiAgICAgICk7XG4gICAgaWYgKCEoZmxhdm91ciBpbiB0aGlzLmNhY2hlKSlcbiAgICAgIHRocm93IG5ldyBJbnRlcm5hbEVycm9yKFxuICAgICAgICBgUmVuZGVyaW5nIGVuZ2luZSB1bmRlciAke2ZsYXZvdXJ9IGRvZXMgbm90IGV4aXN0YFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5nZXRPckJvb3Q8Tz4oXG4gICAgICB0aGlzLmNhY2hlW2ZsYXZvdXJdIGFzXG4gICAgICAgIHwgQ29uc3RydWN0b3I8UmVuZGVyaW5nRW5naW5lPE8+PlxuICAgICAgICB8IFJlbmRlcmluZ0VuZ2luZTxPPlxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgYSBtb2RlbCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgcmVuZGVyaW5nIGVuZ2luZS5cbiAgICogQHN1bW1hcnkgRGV0ZXJtaW5lcyB0aGUgY29ycmVjdCByZW5kZXJpbmcgZW5naW5lIGZvciBhIG1vZGVsIGFuZCBpbnZva2VzIGl0cyByZW5kZXIgbWV0aG9kLlxuICAgKlxuICAgKiBAdGVtcGxhdGUgTSBUeXBlIGV4dGVuZGluZyBNb2RlbFxuICAgKiBAcGFyYW0ge019IG1vZGVsIC0gVGhlIG1vZGVsIHRvIHJlbmRlci5cbiAgICogQHBhcmFtIHsuLi5hbnlbXX0gYXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIHJlbmRlciBtZXRob2QuXG4gICAqIEByZXR1cm5zIHthbnl9IFRoZSByZXN1bHQgb2YgdGhlIHJlbmRlcmluZyBwcm9jZXNzLlxuICAgKiBAdGhyb3dzIHtJbnRlcm5hbEVycm9yfSBJZiBubyByZWdpc3RlcmVkIG1vZGVsIGlzIGZvdW5kLlxuICAgKlxuICAgKiBAc3RhdGljXG4gICAqL1xuICBzdGF0aWMgcmVuZGVyPE0gZXh0ZW5kcyBNb2RlbD4obW9kZWw6IE0sIC4uLmFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvciA9XG4gICAgICBNb2RlbC5nZXQobW9kZWwuY29uc3RydWN0b3IubmFtZSkgfHwgTW9kZWwuZnJvbU9iamVjdChtb2RlbCk7XG4gICAgaWYgKCFjb25zdHJ1Y3RvcikgdGhyb3cgbmV3IEludGVybmFsRXJyb3IoXCJObyBtb2RlbCByZWdpc3RlcmVkIGZvdW5kXCIpO1xuICAgIGNvbnN0IGZsYXZvdXIgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFxuICAgICAgUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUkVOREVSRURfQlkpLFxuICAgICAgY29uc3RydWN0b3IgYXMgTW9kZWxDb25zdHJ1Y3RvcjxNb2RlbD5cbiAgICApO1xuXG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBmb3IgdGhlIHZhciBhcmdzIHR5cGUgY2hlY2tcbiAgICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLmdldChmbGF2b3VyKS5yZW5kZXIobW9kZWwsIC4uLmFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBHZW5lcmF0ZXMgYSBtZXRhZGF0YSBrZXkgZm9yIFVJLXJlbGF0ZWQgcHJvcGVydGllcy5cbiAgICogQHN1bW1hcnkgUHJlZml4ZXMgYSBnaXZlbiBrZXkgd2l0aCB0aGUgVUkgcmVmbGVjdGlvbiBwcmVmaXguXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgLSBUaGUga2V5IHRvIHByZWZpeC5cbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIHByZWZpeGVkIGtleS5cbiAgICpcbiAgICogQHN0YXRpY1xuICAgKi9cbiAgc3RhdGljIGtleShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke1VJS2V5cy5SRUZMRUNUfSR7a2V5fWA7XG4gIH1cbn1cbiIsImltcG9ydCB7IFVJS2V5cyB9IGZyb20gXCIuLi91aS9jb25zdGFudHNcIjtcbmltcG9ydCB7IGFwcGx5LCBtZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvcmVmbGVjdGlvblwiO1xuaW1wb3J0IHsgUmVuZGVyaW5nRW5naW5lIH0gZnJvbSBcIi4uL3VpL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgVUlMaXN0SXRlbU1vZGVsTWV0YWRhdGEsIFVJTW9kZWxNZXRhZGF0YSB9IGZyb20gXCIuLi91aS90eXBlc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCB0YWdzIGEgY2xhc3MgYXMgYSBVSSBtb2RlbFxuICogQHN1bW1hcnkgQWRkcyByZW5kZXJpbmcgY2FwYWJpbGl0aWVzIHRvIGEgbW9kZWwgY2xhc3MgYnkgcHJvdmlkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogVGhpcyBkZWNvcmF0b3IgYXBwbGllcyBtZXRhZGF0YSB0byB0aGUgY2xhc3MgdGhhdCBlbmFibGVzIGl0IHRvIGJlIHJlbmRlcmVkIGJ5IHRoZSBVSSByZW5kZXJpbmcgZW5naW5lLlxuICogVGhlIG1vZGVsIHdpbGwgYmUgcmVuZGVyZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZyBhbmQgcHJvcGVydGllcy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gVGhlIEhUTUwgdGFnIHRvIHVzZSB3aGVuIHJlbmRlcmluZyB0aGlzIG1vZGVsIChkZWZhdWx0cyB0byBjbGFzcyBuYW1lKVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSByZW5kZXJlZCBlbGVtZW50XG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBjbGFzcyBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWltb2RlbFxuICogQGNhdGVnb3J5IENsYXNzIERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gQmFzaWMgdXNhZ2Ugd2l0aCBkZWZhdWx0IHRhZyAoY2xhc3MgbmFtZSlcbiAqIEB1aW1vZGVsKClcbiAqIGNsYXNzIFVzZXJQcm9maWxlIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogLy8gVXNhZ2Ugd2l0aCBjdXN0b20gdGFnIGFuZCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgnZGl2JywgeyBjbGFzczogJ3VzZXItY2FyZCcgfSlcbiAqIGNsYXNzIFVzZXJDYXJkIGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdXNlcm5hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aW1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IGNvbnN0cnVjdG9yXG4gKiAgIHBhcnRpY2lwYW50IGluc3RhbmNlXG4gKiAgIFN5c3RlbS0+PnVpbW9kZWw6ZG8oY29uc3RydWN0b3IpXG4gKiAgIHVpbW9kZWwtPj5jb25zdHJ1Y3RvcjogRXhlY3V0ZXMgdGhlIGNvbnN0cnVjdG9yXG4gKiAgIGNvbnN0cnVjdG9yLT4+dWltb2RlbDogcmV0dXJucyBpbnN0YW5jZVxuICogICB1aW1vZGVsLT4+aW5zdGFuY2U6IGFkZHMgdGhlIHJlbmRlciBtZXRob2RcbiAqICAgdWltb2RlbC0+PlN5c3RlbTogcmV0dXJucyBVSU1vZGVsIGluc3RhbmNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aW1vZGVsKHRhZz86IHN0cmluZywgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGE6IFVJTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnIHx8IG9yaWdpbmFsLm5hbWUsXG4gICAgICBwcm9wczogcHJvcHMsXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlNT0RFTCksIG1ldGEpKG9yaWdpbmFsKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgc3BlY2lmaWVzIHdoaWNoIHJlbmRlcmluZyBlbmdpbmUgdG8gdXNlIGZvciBhIG1vZGVsXG4gKiBAc3VtbWFyeSBBc3NvY2lhdGVzIGEgbW9kZWwgd2l0aCBhIHNwZWNpZmljIHJlbmRlcmluZyBlbmdpbmUgaW1wbGVtZW50YXRpb25cbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBzcGVjaWZpYyBtb2RlbCBjbGFzcyxcbiAqIGVuYWJsaW5nIGRpZmZlcmVudCByZW5kZXJpbmcgc3RyYXRlZ2llcyBmb3IgZGlmZmVyZW50IG1vZGVscy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5naW5lIFRoZSBuYW1lIG9mIHRoZSByZW5kZXJpbmcgZW5naW5lIHRvIHVzZVxuICogQHJldHVybiB7RnVuY3Rpb259IEEgY2xhc3MgZGVjb3JhdG9yIGZ1bmN0aW9uXG4gKlxuICogQGZ1bmN0aW9uIHJlbmRlcmVkQnlcbiAqIEBjYXRlZ29yeSBDbGFzcyBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIFNwZWNpZnkgYSBjdXN0b20gcmVuZGVyaW5nIGVuZ2luZSBmb3IgYSBtb2RlbFxuICogQHVpbW9kZWwoKVxuICogQHJlbmRlcmVkQnkoJ3JlYWN0JylcbiAqIGNsYXNzIFJlYWN0Q29tcG9uZW50IGV4dGVuZHMgTW9kZWwge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCByZW5kZXJlZEJ5XG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj5yZW5kZXJlZEJ5OiBhcHBseSB0byBNb2RlbFxuICogICByZW5kZXJlZEJ5LT4+TW9kZWw6IGFkZHMgZW5naW5lIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIHNwZWNpZmllZCBlbmdpbmVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+U3lzdGVtOiByZW5kZXJzIHdpdGggY3VzdG9tIGVuZ2luZVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyZWRCeShlbmdpbmU6IHN0cmluZykge1xuICByZXR1cm4gYXBwbHkobWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUkVOREVSRURfQlkpLCBlbmdpbmUpKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgdGFncyBhIG1vZGVsIGFzIGEgbGlzdCBpdGVtIGZvciBVSSByZW5kZXJpbmdcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBtb2RlbCBzaG91bGQgYmUgcmVuZGVyZWQgd2hlbiBkaXNwbGF5ZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFwcGxpZXMgbWV0YWRhdGEgdG8gdGhlIGNsYXNzIHRoYXQgZW5hYmxlcyBpdCB0byBiZSByZW5kZXJlZCBhcyBhIGxpc3QgaXRlbVxuICogYnkgdGhlIFVJIHJlbmRlcmluZyBlbmdpbmUuIFRoZSBtb2RlbCB3aWxsIGJlIHJlbmRlcmVkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIHdoZW4gaXQgYXBwZWFycyBpbiBhIGxpc3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIFRoZSBIVE1MIHRhZyB0byB1c2Ugd2hlbiByZW5kZXJpbmcgdGhpcyBtb2RlbCBhcyBhIGxpc3QgaXRlbSAoZGVmYXVsdHMgdG8gY2xhc3MgbmFtZSlcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgcmVuZGVyZWQgbGlzdCBpdGVtIGVsZW1lbnRcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIGNsYXNzIGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aWxpc3RpdGVtXG4gKiBAY2F0ZWdvcnkgQ2xhc3MgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBCYXNpYyB1c2FnZSB3aXRoIGRlZmF1bHQgdGFnIChjbGFzcyBuYW1lKVxuICogQHVpbW9kZWwoKVxuICogQHVpbGlzdGl0ZW0oKVxuICogY2xhc3MgVG9kb0l0ZW0gZXh0ZW5kcyBNb2RlbCB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICB0aXRsZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNvbXBsZXRlZDogYm9vbGVhbjtcbiAqIH1cbiAqXG4gKiAvLyBVc2FnZSB3aXRoIGN1c3RvbSB0YWcgYW5kIHByb3BlcnRpZXNcbiAqIEB1aW1vZGVsKClcbiAqIEB1aWxpc3RpdGVtKCdsaScsIHsgY2xhc3M6ICdsaXN0LWdyb3VwLWl0ZW0nIH0pXG4gKiBjbGFzcyBMaXN0SXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IFN5c3RlbVxuICogICBwYXJ0aWNpcGFudCB1aWxpc3RpdGVtXG4gKiAgIHBhcnRpY2lwYW50IE1vZGVsXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBTeXN0ZW0tPj51aWxpc3RpdGVtOiBhcHBseSB0byBNb2RlbFxuICogICB1aWxpc3RpdGVtLT4+TW9kZWw6IGFkZHMgbGlzdCBpdGVtIG1ldGFkYXRhXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiB1c2VzIGxpc3QgaXRlbSBtZXRhZGF0YSB3aGVuIGluIGxpc3QgY29udGV4dFxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5TeXN0ZW06IHJlbmRlcnMgd2l0aCBsaXN0IGl0ZW0gc3R5bGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gdWlsaXN0aXRlbSh0YWc/OiBzdHJpbmcsIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIHJldHVybiAob3JpZ2luYWw6IGFueSwgcHJvcGVydHlLZXk/OiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhOiBVSUxpc3RJdGVtTW9kZWxNZXRhZGF0YSA9IHtcbiAgICAgIGl0ZW06IHtcbiAgICAgICAgdGFnOiB0YWcgfHwgb3JpZ2luYWwubmFtZSxcbiAgICAgICAgcHJvcHM6IHByb3BzLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHJldHVybiBtZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5VSUxJU1RJVEVNKSwgbWV0YSkob3JpZ2luYWwpO1xuICB9O1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiB1aWhhbmRsZXJzKHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICByZXR1cm4gKG9yaWdpbmFsOiBhbnkpID0+IHtcbiAgICBjb25zdCBtZXRhID0ge1xuICAgICAgaGFuZGxlcnM6IHByb3BzXG4gICAgfTtcbiAgICByZXR1cm4gbWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuSEFORExFUlMpLCBtZXRhKShvcmlnaW5hbCk7XG4gIH07XG59IiwiLyoqXG4gKiBAZGVzY3JpcHRpb24gTW9kdWxlIHRoYXQgZXh0ZW5kcyB0aGUgTW9kZWwgcHJvdG90eXBlIHdpdGggcmVuZGVyaW5nIGNhcGFiaWxpdGllc1xuICogQHN1bW1hcnkgQWRkcyB0aGUgcmVuZGVyIG1ldGhvZCB0byBhbGwgTW9kZWwgaW5zdGFuY2VzIGZyb20gZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIFRoaXMgbW9kdWxlIGltcGxlbWVudHMgdGhlIFJlbmRlcmFibGUgaW50ZXJmYWNlIGZvciB0aGUgTW9kZWwgY2xhc3MgYnkgYWRkaW5nIGEgcmVuZGVyIG1ldGhvZFxuICogdG8gaXRzIHByb3RvdHlwZS4gVGhpcyBhbGxvd3MgYW55IE1vZGVsIGluc3RhbmNlIHRvIGJlIHJlbmRlcmVkIHVzaW5nIHRoZSBSZW5kZXJpbmdFbmdpbmUuXG4gKiBAbW9kdWxlIG1vZGVsL292ZXJyaWRlc1xuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzL21vZGVsXG4gKi9cblxuaW1wb3J0IHsgTW9kZWwgfSBmcm9tIFwiQGRlY2FmLXRzL2RlY29yYXRvci12YWxpZGF0aW9uXCI7XG5pbXBvcnQgeyBSZW5kZXJpbmdFbmdpbmUgfSBmcm9tIFwiLi4vdWkvUmVuZGVyaW5nXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFJlbmRlcnMgdGhlIG1vZGVsIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAc3VtbWFyeSBEZWxlZ2F0ZXMgcmVuZGVyaW5nIHRvIHRoZSBSZW5kZXJpbmdFbmdpbmUgYmFzZWQgb24gbW9kZWwgbWV0YWRhdGFcbiAqIFRoaXMgbWV0aG9kIGltcGxlbWVudHMgdGhlIHJlbmRlciBtZXRob2QgZnJvbSB0aGUgUmVuZGVyYWJsZSBpbnRlcmZhY2UgZm9yIGFsbCBNb2RlbCBpbnN0YW5jZXMuXG4gKiBJdCB1c2VzIHRoZSBSZW5kZXJpbmdFbmdpbmUgdG8gZGV0ZXJtaW5lIGhvdyB0byByZW5kZXIgdGhlIG1vZGVsIGJhc2VkIG9uIGl0cyBtZXRhZGF0YS5cbiAqXG4gKiBAdGVtcGxhdGUgTSBUeXBlIG9mIHRoZSBtb2RlbCBiZWluZyByZW5kZXJlZFxuICogQHBhcmFtIHthbnlbXX0gYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKiBAcmV0dXJuIHthbnl9IFRoZSByZW5kZXJlZCBvdXRwdXQgaW4gdGhlIGZvcm1hdCBkZXRlcm1pbmVkIGJ5IHRoZSByZW5kZXJpbmcgZW5naW5lXG4gKi9cbk1vZGVsLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiA8TSBleHRlbmRzIE1vZGVsPih0aGlzOiBNLCAuLi5hcmdzOiBhbnlbXSkge1xuICByZXR1cm4gUmVuZGVyaW5nRW5naW5lLnJlbmRlcih0aGlzLCAuLi5hcmdzKTtcbn07XG4iLCJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQgeyBVSUtleXMgfSBmcm9tIFwiLi9jb25zdGFudHNcIjtcbmltcG9ydCB7IHByb3BNZXRhZGF0YSB9IGZyb20gXCJAZGVjYWYtdHMvZGVjb3JhdG9yLXZhbGlkYXRpb25cIjtcbmltcG9ydCB7XG4gIENydWRPcGVyYXRpb25LZXlzLFxuICBVSUVsZW1lbnRNZXRhZGF0YSxcbiAgVUlMaXN0UHJvcE1ldGFkYXRhLFxuICBVSVByb3BNZXRhZGF0YSxcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IFJlbmRlcmluZ0VuZ2luZSB9IGZyb20gXCIuL1JlbmRlcmluZ1wiO1xuaW1wb3J0IHsgT3BlcmF0aW9uS2V5cyB9IGZyb20gXCJAZGVjYWYtdHMvZGItZGVjb3JhdG9yc1wiO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBEZWNvcmF0b3IgdGhhdCBoaWRlcyBhIHByb3BlcnR5IGR1cmluZyBzcGVjaWZpYyBDUlVEIG9wZXJhdGlvbnNcbiAqIEBzdW1tYXJ5IENvbnRyb2xzIHByb3BlcnR5IHZpc2liaWxpdHkgYmFzZWQgb24gb3BlcmF0aW9uIHR5cGVcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB3aGljaCBDUlVEIG9wZXJhdGlvbnMgc2hvdWxkIGhpZGUgYSBwcm9wZXJ0eVxuICogaW4gdGhlIFVJLiBUaGUgcHJvcGVydHkgd2lsbCBvbmx5IGJlIHZpc2libGUgZHVyaW5nIG9wZXJhdGlvbnMgbm90IHNwZWNpZmllZC5cbiAqXG4gKiBAcGFyYW0gb3BlcmF0aW9ucyAtIFRoZSBDUlVEIG9wZXJhdGlvbnMgZHVyaW5nIHdoaWNoIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZU9uXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBIaWRlIHRoZSBwYXNzd29yZCBmaWVsZCBkdXJpbmcgUkVBRCBvcGVyYXRpb25zXG4gKiBjbGFzcyBVc2VyIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHVzZXJuYW1lOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQGhpZGVPbihPcGVyYXRpb25LZXlzLlJFQUQpXG4gKiAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCBoaWRlT25cbiAqICAgcGFydGljaXBhbnQgUmVuZGVyaW5nRW5naW5lXG4gKiAgIHBhcnRpY2lwYW50IFVJXG4gKiAgIE1vZGVsLT4+aGlkZU9uOiBBcHBseSB0byBwcm9wZXJ0eVxuICogICBoaWRlT24tPj5Nb2RlbDogQWRkIGhpZGRlbiBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogQ2hlY2sgaWYgcHJvcGVydHkgc2hvdWxkIGJlIGhpZGRlblxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIGhpZGRlbiBvcGVyYXRpb25zXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PlVJOiBSZW5kZXIgb3IgaGlkZSBiYXNlZCBvbiBjdXJyZW50IG9wZXJhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaGlkZU9uKC4uLm9wZXJhdGlvbnM6IENydWRPcGVyYXRpb25LZXlzW10pIHtcbiAgcmV0dXJuIHByb3BNZXRhZGF0YTxDcnVkT3BlcmF0aW9uS2V5c1tdPihcbiAgICBSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5ISURERU4pLFxuICAgIG9wZXJhdGlvbnNcbiAgKTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgY29tcGxldGVseSBoaWRlcyBhIHByb3BlcnR5IGluIGFsbCBVSSBvcGVyYXRpb25zXG4gKiBAc3VtbWFyeSBNYWtlcyBhIHByb3BlcnR5IGludmlzaWJsZSBpbiBhbGwgQ1JVRCBvcGVyYXRpb25zXG4gKiBUaGlzIGRlY29yYXRvciBpcyBhIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIGhpZGVPbiB0aGF0IGhpZGVzIGEgcHJvcGVydHlcbiAqIGR1cmluZyBhbGwgQ1JVRCBvcGVyYXRpb25zIChDUkVBVEUsIFJFQUQsIFVQREFURSwgREVMRVRFKS5cbiAqXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gaGlkZGVuXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBDb21wbGV0ZWx5IGhpZGUgdGhlIGludGVybmFsSWQgZmllbGQgaW4gdGhlIFVJXG4gKiBjbGFzcyBQcm9kdWN0IHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAaGlkZGVuKClcbiAqICAgaW50ZXJuYWxJZDogc3RyaW5nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgaGlkZGVuXG4gKiAgIHBhcnRpY2lwYW50IGhpZGVPblxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgTW9kZWwtPj5oaWRkZW46IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIGhpZGRlbi0+PmhpZGVPbjogQ2FsbCB3aXRoIGFsbCBvcGVyYXRpb25zXG4gKiAgIGhpZGVPbi0+Pk1vZGVsOiBBZGQgaGlkZGVuIG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBDaGVjayBpZiBwcm9wZXJ0eSBzaG91bGQgYmUgaGlkZGVuXG4gKiAgIE1vZGVsLT4+UmVuZGVyaW5nRW5naW5lOiBSZXR1cm4gYWxsIG9wZXJhdGlvbnNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IEFsd2F5cyBoaWRlIHByb3BlcnR5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoaWRkZW4oKSB7XG4gIHJldHVybiBoaWRlT24oXG4gICAgT3BlcmF0aW9uS2V5cy5DUkVBVEUsXG4gICAgT3BlcmF0aW9uS2V5cy5SRUFELFxuICAgIE9wZXJhdGlvbktleXMuVVBEQVRFLFxuICAgIE9wZXJhdGlvbktleXMuREVMRVRFXG4gICk7XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IHNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgYXMgYSBVSSBlbGVtZW50XG4gKiBAc3VtbWFyeSBNYXBzIGEgbW9kZWwgcHJvcGVydHkgdG8gYSBzcGVjaWZpYyBVSSBlbGVtZW50IHdpdGggY3VzdG9tIHByb3BlcnRpZXNcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIHdoaWNoIEhUTUwgZWxlbWVudCBvciBjb21wb25lbnQgc2hvdWxkIGJlIHVzZWRcbiAqIHRvIHJlbmRlciBhIHNwZWNpZmljIHByb3BlcnR5LCBhbG9uZyB3aXRoIGFueSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGF0IGVsZW1lbnQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byB1c2UgZm9yIHJlbmRlcmluZ1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbcHJvcHNdIEFkZGl0aW9uYWwgcHJvcGVydGllcyB0byBwYXNzIHRvIHRoZSBlbGVtZW50XG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtzZXJpYWxpemU9ZmFsc2VdIFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBzZXJpYWxpemVkXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWllbGVtZW50XG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBSZW5kZXIgYSBwcm9wZXJ0eSBhcyBhIHRleHQgaW5wdXRcbiAqIGNsYXNzIExvZ2luRm9ybSB7XG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWllbGVtZW50KCdpbnB1dCcsIHsgdHlwZTogJ3RleHQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHVzZXJuYW1lJyB9KVxuICogICB1c2VybmFtZTogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2lucHV0JywgeyB0eXBlOiAncGFzc3dvcmQnLCBwbGFjZWhvbGRlcjogJ0VudGVyIHBhc3N3b3JkJyB9KVxuICogICBwYXNzd29yZDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWVsZW1lbnQoJ2J1dHRvbicsIHsgY2xhc3M6ICdidG4tcHJpbWFyeScgfSlcbiAqICAgc3VibWl0OiBzdHJpbmcgPSAnTG9naW4nO1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWllbGVtZW50XG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBVSVxuICogICBNb2RlbC0+PnVpZWxlbWVudDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWllbGVtZW50LT4+TW9kZWw6IEFkZCBlbGVtZW50IG1ldGFkYXRhXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pk1vZGVsOiBHZXQgZWxlbWVudCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHRhZyBhbmQgcHJvcHNcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+VUk6IFJlbmRlciB3aXRoIHNwZWNpZmllZCBlbGVtZW50XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aWVsZW1lbnQoXG4gIHRhZzogc3RyaW5nLFxuICBwcm9wcz86IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIHNlcmlhbGl6ZTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuIChvcmlnaW5hbDogYW55LCBwcm9wZXJ0eUtleT86IGFueSkgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSUVsZW1lbnRNZXRhZGF0YSA9IHtcbiAgICAgIHRhZzogdGFnLFxuICAgICAgc2VyaWFsaXplOiBzZXJpYWxpemUsXG4gICAgICBwcm9wczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMgfHwge30sIHtcbiAgICAgICAgbmFtZTogcHJvcGVydHlLZXksXG4gICAgICB9KSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHByb3BNZXRhZGF0YShSZW5kZXJpbmdFbmdpbmUua2V5KFVJS2V5cy5FTEVNRU5UKSwgbWV0YWRhdGEpKFxuICAgICAgb3JpZ2luYWwsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eVxuICogQHN1bW1hcnkgU3BlY2lmaWVzIGhvdyBhIHByb3BlcnR5IHNob3VsZCBiZSBwYXNzZWQgdG8gYSBVSSBjb21wb25lbnRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IHNob3VsZCBiZSBtYXBwZWQgdG9cbiAqIGEgcHJvcGVydHkgb2YgdGhlIFVJIGNvbXBvbmVudCB3aGVuIHJlbmRlcmluZy4gSXQgcmVxdWlyZXMgdGhlIGNsYXNzIHRvIGJlXG4gKiBkZWNvcmF0ZWQgd2l0aCBAdWltb2RlbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgY29tcG9uZW50IChkZWZhdWx0cyB0byB0aGUgcHJvcGVydHkga2V5KVxuICogQHBhcmFtIHtib29sZWFufSBbc3RyaW5naWZ5PWZhbHNlXSBXaGV0aGVyIHRvIHN0cmluZ2lmeSB0aGUgcHJvcGVydHkgdmFsdWVcbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBBIHByb3BlcnR5IGRlY29yYXRvciBmdW5jdGlvblxuICpcbiAqIEBmdW5jdGlvbiB1aXByb3BcbiAqIEBjYXRlZ29yeSBQcm9wZXJ0eSBEZWNvcmF0b3JzXG4gKlxuICogQGV4YW1wbGVcbiAqIC8vIE1hcCBtb2RlbCBwcm9wZXJ0aWVzIHRvIGNvbXBvbmVudCBwcm9wZXJ0aWVzXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aXByb3AoKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAnZnVsbE5hbWUnIHRvIHRoZSBjb21wb25lbnRcbiAqICAgZnVsbE5hbWU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlwcm9wKCd1c2VyRW1haWwnKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyAndXNlckVtYWlsJyB0byB0aGUgY29tcG9uZW50XG4gKiAgIGVtYWlsOiBzdHJpbmc7XG4gKlxuICogICBAYXR0cmlidXRlKClcbiAqICAgQHVpcHJvcCgndXNlckRhdGEnLCB0cnVlKSAvLyBXaWxsIGJlIHBhc3NlZCBhcyBzdHJpbmdpZmllZCBKU09OXG4gKiAgIHVzZXJEYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICogfVxuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWlwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBDb21wb25lbnRcbiAqICAgTW9kZWwtPj51aXByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpcHJvcC0+Pk1vZGVsOiBBZGQgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IHByb3AgbWV0YWRhdGFcbiAqICAgTW9kZWwtPj5SZW5kZXJpbmdFbmdpbmU6IFJldHVybiBwcm9wIG5hbWUgYW5kIHN0cmluZ2lmeSBmbGFnXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+PkNvbXBvbmVudDogUGFzcyBwcm9wZXJ0eSB3aXRoIHNwZWNpZmllZCBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1aXByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHN0cmluZ2lmeTogYm9vbGVhbiA9IGZhbHNlXG4pIHtcbiAgcmV0dXJuICh0YXJnZXQ6IGFueSwgcHJvcGVydHlLZXk6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IG1ldGFkYXRhOiBVSVByb3BNZXRhZGF0YSA9IHtcbiAgICAgIG5hbWU6IHByb3BOYW1lIHx8IHByb3BlcnR5S2V5LFxuICAgICAgc3RyaW5naWZ5OiBzdHJpbmdpZnksXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gRGVjb3JhdG9yIHRoYXQgbWFwcyBhIG5lc3RlZCBtb2RlbCBwcm9wZXJ0eSB0byBhIFVJIGNvbXBvbmVudCBwcm9wZXJ0eS5cbiAqIEBzdW1tYXJ5IERlZmluZXMgaG93IGEgcGFyZW50IGNvbXBvbmVudCBzaG91bGQgcmVuZGVyIHRoZSBjaGlsZCBtb2RlbCB3aGVuIG5lc3RlZC5cbiAqXG4gKiBUaGlzIGRlY29yYXRvciBpcyB1c2VkIHRvIGRlY29yYXRlIHByb3BlcnRpZXMgdGhhdCBhcmUgbmVzdGVkIG1vZGVscy5cbiAqIFdoZW4gYXBwbGllZCwgaXQgYWxsb3dzIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgdGFnIG9mIHRoZSBjaGlsZCBtb2RlbCB3aXRoIHRoZSBwcm92aWRlZCBvbmUsXG4gKiBlbmFibGluZyBkaWZmZXJlbnQgcmVuZGVyaW5nIGJlaGF2aW9yIHdoZW4gdGhlIG1vZGVsIGFjdHMgYXMgYSBjaGlsZCAobmVzdGVkKVxuICogY29tcGFyZWQgdG8gd2hlbiBpdCBpcyByZW5kZXJlZCBhcyB0aGUgcGFyZW50IG1vZGVsLlxuICpcbiAqIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBgQHVpbW9kZWxgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiBUaGUgbW9kZWwgY2xhc3MgbmFtZSB0byBwYXNzIHRvIHRoZSBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpLlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgSFRNTCBlbGVtZW50IG9yIGNvbXBvbmVudCB0YWcgbmFtZSB0byBvdmVycmlkZSB0aGUgVUkgdGFnIG9mIHRoZSBuZXN0ZWQgbW9kZWxcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW3Byb3BzXSBBZGRpdGlvbmFsIHByb3BlcnRpZXMgdG8gcGFzcyB0byB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtib29sZWFufSBbc2VyaWFsaXplPWZhbHNlXSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgc2VyaWFsaXplZFxuICogQHJldHVybiB7RnVuY3Rpb259IEEgcHJvcGVydHkgZGVjb3JhdG9yIGZ1bmN0aW9uLlxuICpcbiAqIEBmdW5jdGlvbiB1aWNoaWxkXG4gKiBAY2F0ZWdvcnkgUHJvcGVydHkgRGVjb3JhdG9yc1xuICpcbiAqIEBleGFtcGxlXG4gKiAvLyBNYXAgYSBuZXN0ZWQgbW9kZWwgdG8gYSBjb21wb25lbnQgcHJvcGVydHkgd2l0aCBhIGRpZmZlcmVudCB0YWcgd2hlbiBuZXN0ZWRcbiAqIEB1aW1vZGVsKCdhZGRyZXNzLWNvbXBvbmVudCcpXG4gKiBjbGFzcyBBZGRyZXNzIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHN0cmVldDogc3RyaW5nO1xuICpcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIGNpdHk6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAdWltb2RlbCgndXNlci1wcm9maWxlJylcbiAqIGNsYXNzIFVzZXJQcm9maWxlIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIEB1aWNoaWxkKEFkZHJlc3MubmFtZSwgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50JylcbiAqICAgYWRkcmVzczogQWRkcmVzcztcbiAqIH1cbiAqXG4gKiAvLyBJbiB0aGlzIGV4YW1wbGUsIHRoZSBBZGRyZXNzIG1vZGVsIGhhcyB0aGUgZGVmYXVsdCB0YWcgJ2FkZHJlc3MtY29tcG9uZW50JyB3aGVuIHJlbmRlcmVkIGFzIGEgcm9vdCBjb21wb25lbnQsXG4gKiAvLyBidXQgd2hlbiB1c2VkIGluc2lkZSBVc2VyUHJvZmlsZSwgaXQgaXMgcmVuZGVyZWQgd2l0aCB0aGUgb3ZlcnJpZGRlbiB0YWcgJ2FkZHJlc3MtY2hpbGQtY29tcG9uZW50J1xuICpcbiAqIEBtZXJtYWlkXG4gKiBzZXF1ZW5jZURpYWdyYW1cbiAqICAgcGFydGljaXBhbnQgTW9kZWxcbiAqICAgcGFydGljaXBhbnQgdWljaGlsZFxuICogICBwYXJ0aWNpcGFudCBSZW5kZXJpbmdFbmdpbmVcbiAqICAgcGFydGljaXBhbnQgQ29tcG9uZW50XG4gKiAgIE1vZGVsLT4+dWljaGlsZDogQXBwbHkgdG8gcHJvcGVydHlcbiAqICAgdWljaGlsZC0+Pk1vZGVsOiBBZGQgY2hpbGQgbWV0YWRhdGFcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+TW9kZWw6IEdldCBjaGlsZCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSwgc3RyaW5naWZ5IGZsYWcsIGFuZCBjaGlsZCB0YWcgb3ZlcnJpZGVcbiAqICAgUmVuZGVyaW5nRW5naW5lLT4+Q29tcG9uZW50OiBQYXNzIHByb3BlcnR5IHdpdGggc3BlY2lmaWVkIG5hbWUgYW5kIHJlbmRlciB3aXRoIG92ZXJyaWRkZW4gdGFnIGlmIG5lc3RlZFxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB1aWNoaWxkKFxuICBjbGF6ejogc3RyaW5nLFxuICB0YWc6IHN0cmluZyxcbiAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSxcbiAgc2VyaWFsaXplOiBib29sZWFuID0gZmFsc2Vcbikge1xuICByZXR1cm4gKHRhcmdldDogYW55LCBwcm9wZXJ0eUtleTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgbWV0YWRhdGE6IFVJRWxlbWVudE1ldGFkYXRhID0ge1xuICAgICAgdGFnOiB0YWcsXG4gICAgICBzZXJpYWxpemU6IHNlcmlhbGl6ZSxcbiAgICAgIHByb3BzOiBPYmplY3QuYXNzaWduKHt9LCBwcm9wcyB8fCB7fSwge1xuICAgICAgICBuYW1lOiBjbGF6eiB8fCBwcm9wZXJ0eUtleSxcbiAgICAgIH0pLFxuICAgIH07XG5cbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuQ0hJTEQpLCBtZXRhZGF0YSkoXG4gICAgICB0YXJnZXQsXG4gICAgICBwcm9wZXJ0eUtleVxuICAgICk7XG4gIH07XG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlY29yYXRvciB0aGF0IG1hcHMgYSBtb2RlbCBwcm9wZXJ0eSB0byBhIGxpc3QgaXRlbSBjb21wb25lbnRcbiAqIEBzdW1tYXJ5IFNwZWNpZmllcyBob3cgYSBwcm9wZXJ0eSBzaG91bGQgYmUgcmVuZGVyZWQgaW4gYSBsaXN0IGNvbnRleHRcbiAqIFRoaXMgZGVjb3JhdG9yIGFsbG93cyB5b3UgdG8gZGVmaW5lIGhvdyBhIG1vZGVsIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBsaXN0XG4gKiBzaG91bGQgYmUgcmVuZGVyZWQuIEl0IHJlcXVpcmVzIHRoZSBjbGFzcyB0byBiZSBkZWNvcmF0ZWQgd2l0aCBAdWlsaXN0aXRlbS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gW3Byb3BOYW1lXSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gcGFzcyB0byB0aGUgbGlzdCBjb21wb25lbnQgKGRlZmF1bHRzIHRvIHRoZSBwcm9wZXJ0eSBrZXkpXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IFtwcm9wc10gQWRkaXRpb25hbCBwcm9wZXJ0aWVzIHRvIHBhc3MgdG8gdGhlIGxpc3QgY29udGFpbmVyXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gQSBwcm9wZXJ0eSBkZWNvcmF0b3IgZnVuY3Rpb25cbiAqXG4gKiBAZnVuY3Rpb24gdWlsaXN0cHJvcFxuICogQGNhdGVnb3J5IFByb3BlcnR5IERlY29yYXRvcnNcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gRGVmaW5lIGEgbGlzdCBwcm9wZXJ0eSB3aXRoIGN1c3RvbSByZW5kZXJpbmdcbiAqIEB1aW1vZGVsKCd0b2RvLWxpc3QnKVxuICogY2xhc3MgVG9kb0xpc3Qge1xuICogICBAYXR0cmlidXRlKClcbiAqICAgdGl0bGU6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBAdWlsaXN0cHJvcCgnaXRlbXMnLCB7IGNsYXNzOiAndG9kby1pdGVtcy1jb250YWluZXInIH0pXG4gKiAgIGl0ZW1zOiBUb2RvSXRlbVtdO1xuICogfVxuICpcbiAqIEB1aWxpc3RpdGVtKCdsaScsIHsgY2xhc3M6ICd0b2RvLWl0ZW0nIH0pXG4gKiBjbGFzcyBUb2RvSXRlbSBleHRlbmRzIE1vZGVsIHtcbiAqICAgQGF0dHJpYnV0ZSgpXG4gKiAgIHRleHQ6IHN0cmluZztcbiAqXG4gKiAgIEBhdHRyaWJ1dGUoKVxuICogICBjb21wbGV0ZWQ6IGJvb2xlYW47XG4gKiB9XG4gKlxuICogQG1lcm1haWRcbiAqIHNlcXVlbmNlRGlhZ3JhbVxuICogICBwYXJ0aWNpcGFudCBNb2RlbFxuICogICBwYXJ0aWNpcGFudCB1aWxpc3Rwcm9wXG4gKiAgIHBhcnRpY2lwYW50IFJlbmRlcmluZ0VuZ2luZVxuICogICBwYXJ0aWNpcGFudCBMaXN0Q29udGFpbmVyXG4gKiAgIHBhcnRpY2lwYW50IExpc3RJdGVtc1xuICogICBNb2RlbC0+PnVpbGlzdHByb3A6IEFwcGx5IHRvIHByb3BlcnR5XG4gKiAgIHVpbGlzdHByb3AtPj5Nb2RlbDogQWRkIGxpc3QgcHJvcCBtZXRhZGF0YVxuICogICBSZW5kZXJpbmdFbmdpbmUtPj5Nb2RlbDogR2V0IGxpc3QgcHJvcCBtZXRhZGF0YVxuICogICBNb2RlbC0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHByb3AgbmFtZSBhbmQgY29udGFpbmVyIHByb3BzXG4gKiAgIFJlbmRlcmluZ0VuZ2luZS0+Pkxpc3RDb250YWluZXI6IENyZWF0ZSBjb250YWluZXIgd2l0aCBwcm9wc1xuICogICBSZW5kZXJpbmdFbmdpbmUtPj5MaXN0SXRlbXM6IFJlbmRlciBlYWNoIGl0ZW0gdXNpbmcgQHVpbGlzdGl0ZW1cbiAqICAgTGlzdENvbnRhaW5lci0+PlJlbmRlcmluZ0VuZ2luZTogUmV0dXJuIHJlbmRlcmVkIGxpc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVpbGlzdHByb3AoXG4gIHByb3BOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQsXG4gIHByb3BzPzogUmVjb3JkPHN0cmluZywgYW55PlxuKSB7XG4gIHJldHVybiAodGFyZ2V0OiBhbnksIHByb3BlcnR5S2V5OiBzdHJpbmcpID0+IHtcbiAgICBjb25zdCBtZXRhZGF0YTogUGFydGlhbDxVSUxpc3RQcm9wTWV0YWRhdGE+ID0ge1xuICAgICAgbmFtZTogcHJvcE5hbWUgfHwgcHJvcGVydHlLZXksXG4gICAgICBwcm9wczogcHJvcHMgfHwge30sXG4gICAgfTtcbiAgICBwcm9wTWV0YWRhdGEoUmVuZGVyaW5nRW5naW5lLmtleShVSUtleXMuVUlMSVNUUFJPUCksIG1ldGFkYXRhKShcbiAgICAgIHRhcmdldCxcbiAgICAgIHByb3BlcnR5S2V5XG4gICAgKTtcbiAgfTtcbn1cbiIsIi8qKlxuICogQGRlc2NyaXB0aW9uIENsYXNzIHJlcHJlc2VudGluZyBhbiBldmVudCBoYW5kbGVyXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSBzdHJ1Y3R1cmUgZm9yIGhhbmRsaW5nIGV2ZW50cyBpbiB0aGUgVUkgZGVjb3JhdG9ycyBzeXN0ZW1cbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBmb3VuZGF0aW9uIGZvciBtYW5hZ2luZyBhbmQgcHJvY2Vzc2luZyBldmVudHMgdGhhdCBvY2N1clxuICogd2l0aGluIHRoZSBVSSBjb21wb25lbnRzIGdlbmVyYXRlZCBieSB0aGUgZGVjb3JhdG9ycy5cbiAqIEBjbGFzcyBFdmVudEhhbmRsZXJcbiAqIEBtZW1iZXJPZiBtb2R1bGU6dWktZGVjb3JhdG9ycy91aVxuICovXG5leHBvcnQgY2xhc3MgRXZlbnRIYW5kbGVyIHtcbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIEV2ZW50SGFuZGxlclxuICAgKiBAc3VtbWFyeSBJbml0aWFsaXplcyBhIG5ldyBFdmVudEhhbmRsZXIgb2JqZWN0XG4gICAqIFRoaXMgY29uc3RydWN0b3IgY3VycmVudGx5IGRvZXNuJ3QgdGFrZSBhbnkgcGFyYW1ldGVycywgYnV0IGl0IGNhbiBiZVxuICAgKiBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGFjY2VwdCBjb25maWd1cmF0aW9uIG9wdGlvbnMgaWYgbmVlZGVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoKSB7fVxufSIsIi8qKlxuICogQGRlc2NyaXB0aW9uIFVJIGRlY29yYXRvcnMgbW9kdWxlIGZvciBUeXBlU2NyaXB0IGFwcGxpY2F0aW9uc1xuICogQHN1bW1hcnkgQSBjb2xsZWN0aW9uIG9mIGRlY29yYXRvcnMgYW5kIHV0aWxpdGllcyBmb3IgYnVpbGRpbmcgVUkgY29tcG9uZW50cyBpbiBUeXBlU2NyaXB0IGFwcGxpY2F0aW9ucy5cbiAqIFRoaXMgbW9kdWxlIGV4cG9ydHMgZnVuY3Rpb25hbGl0eSBmcm9tIGJvdGggdGhlIG1vZGVsIGFuZCBVSSBzdWJtb2R1bGVzLCBwcm92aWRpbmcgZGVjb3JhdG9ycyBmb3JcbiAqIHJlbmRlcmluZywgY29tcG9uZW50IGRlZmluaXRpb24sIGFuZCBVSSBzdGF0ZSBtYW5hZ2VtZW50LlxuICogQG1vZHVsZSB1aS1kZWNvcmF0b3JzXG4gKi9cblxuZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3VpXCI7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIEN1cnJlbnQgcGFja2FnZSB2ZXJzaW9uIHN0cmluZ1xuICogQHN1bW1hcnkgU3RvcmVzIHRoZSBjdXJyZW50IHBhY2thZ2UgdmVyc2lvbiBmb3IgcmVmZXJlbmNlXG4gKiBAY29uc3QgVkVSU0lPTlxuICogQG1lbWJlck9mIG1vZHVsZTp1aS1kZWNvcmF0b3JzXG4gKi9cbmV4cG9ydCBjb25zdCBWRVJTSU9OID0gXCIjI1ZFUlNJT04jI1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUE7Ozs7Ozs7QUFPRztBQTBCSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUE0Q0c7QUFDVSxNQUFBLE1BQU0sR0FBRztBQUNwQixJQUFBLE9BQU8sRUFBRSxDQUFBLEVBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBTSxJQUFBLENBQUE7QUFDbkMsSUFBQSxPQUFPLEVBQUUsU0FBUztBQUNsQixJQUFBLFdBQVcsRUFBRSxhQUFhO0FBQzFCLElBQUEsT0FBTyxFQUFFLFNBQVM7QUFDbEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtBQUNaLElBQUEsS0FBSyxFQUFFLE9BQU87QUFDZCxJQUFBLElBQUksRUFBRSxNQUFNO0FBQ1osSUFBQSxXQUFXLEVBQUUsUUFBUTtBQUNyQixJQUFBLFlBQVksRUFBRSx1QkFBdUI7QUFFckMsSUFBQSxVQUFVLEVBQUUsWUFBWTtBQUN4QixJQUFBLFVBQVUsRUFBRSxVQUFVO0FBQ3RCLElBQUEsUUFBUSxFQUFFLFVBQVU7QUFFcEIsSUFBQSxJQUFJLEVBQUUsTUFBTTtBQUNaLElBQUEsUUFBUSxFQUFFLFNBQVM7QUFFbkIsSUFBQSxNQUFNLEVBQUUsUUFBUTtBQUNoQixJQUFBLE1BQU0sRUFBRSxRQUFRO0FBRWhCLElBQUEsU0FBUyxFQUFFLFVBQVU7SUFDckIsUUFBUSxFQUFFLGNBQWMsQ0FBQyxRQUFRO0lBQ2pDLEdBQUcsRUFBRSxjQUFjLENBQUMsR0FBRztJQUN2QixVQUFVLEVBQUUsY0FBYyxDQUFDLFVBQVU7SUFDckMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHO0lBQ3ZCLFVBQVUsRUFBRSxjQUFjLENBQUMsVUFBVTtJQUNyQyxPQUFPLEVBQUUsY0FBYyxDQUFDLE9BQU87SUFDL0IsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHO0lBQ3ZCLElBQUksRUFBRSxjQUFjLENBQUMsSUFBSTtJQUN6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
1469
+ 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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