@datorama/core 22.13.8-rc.2 → 22.14.1

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.
Files changed (144) hide show
  1. package/bundle.scss +5696 -4767
  2. package/bundles/datorama-core.umd.js +156 -199
  3. package/bundles/datorama-core.umd.js.map +1 -1
  4. package/bundles/datorama-core.umd.min.js +61 -61
  5. package/bundles/datorama-core.umd.min.js.map +1 -1
  6. package/datorama-core.d.ts +0 -1
  7. package/datorama-core.metadata.json +1 -1
  8. package/esm2015/datorama-core.js +1 -2
  9. package/esm2015/lib/breadcrumbs/breadcrumbs.component.js +2 -4
  10. package/esm2015/lib/directives/clipboard.directive.js +7 -16
  11. package/esm2015/lib/grid/dato-grid-api.js +1 -1
  12. package/esm2015/lib/grid/dato-grid.js +1 -1
  13. package/esm2015/lib/grid/grid/grid.component.js +7 -6
  14. package/esm2015/lib/grid/grid-header/grid-header.component.js +1 -1
  15. package/esm2015/lib/grid/grid-helper.js +1 -1
  16. package/esm2015/lib/grid/grid-pagination/grid-pagination.component.js +2 -2
  17. package/esm2015/lib/grid/grid-toolbar/grid-toolbar.component.js +2 -2
  18. package/esm2015/lib/grid/grid.module.js +2 -2
  19. package/esm2015/lib/grid-v2/grid/grid-v2.component.js +10 -8
  20. package/esm2015/lib/grid-v2/grid/grid-v2.config.js +5 -22
  21. package/esm2015/lib/grid-v2/grid/grid-v2.types.js +3 -3
  22. package/esm2015/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.js +3 -3
  23. package/esm2015/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.js +3 -3
  24. package/esm2015/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.js +1 -1
  25. package/esm2015/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.js +1 -1
  26. package/esm2015/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.js +1 -1
  27. package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.component.js +2 -2
  28. package/esm2015/lib/grid-v2/grid-column-header/grid-column-header.types.js +1 -1
  29. package/esm2015/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -3
  30. package/esm2015/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.js +1 -1
  31. package/esm2015/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.js +1 -1
  32. package/esm2015/lib/grid-v2/grid-controller/grid-controller.component.js +11 -17
  33. package/esm2015/lib/grid-v2/grid-controller/grid-controller.types.js +1 -1
  34. package/esm2015/lib/grid-v2/grid-custom-header/custom-header-template.directive.js +1 -1
  35. package/esm2015/lib/grid-v2/grid-filter/filter-validator.js +1 -1
  36. package/esm2015/lib/grid-v2/grid-filter/grid-filter.component.js +1 -1
  37. package/esm2015/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.js +1 -1
  38. package/esm2015/lib/grid-v2/grid-loader/grid-v2-loader.component.js +1 -1
  39. package/esm2015/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.js +1 -1
  40. package/esm2015/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +1 -1
  41. package/esm2015/lib/grid-v2/grid-pagination/grid-pagination.component.js +1 -1
  42. package/esm2015/lib/grid-v2/grid-settings.js +2 -2
  43. package/esm2015/lib/grid-v2/grid-store/grid.query.js +2 -2
  44. package/esm2015/lib/grid-v2/grid-store/grid.service.js +52 -42
  45. package/esm2015/lib/grid-v2/grid-store/util.js +1 -1
  46. package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -10
  47. package/esm2015/lib/grid-v2/grid-toolbar/grid-toolbar.types.js +1 -1
  48. package/esm2015/lib/grid-v2/grid-v2.module.js +2 -2
  49. package/esm2015/lib/grid-v2/grid-v2.util.js +1 -1
  50. package/esm2015/lib/icon/icon.types.js +1 -1
  51. package/esm2015/lib/rich-text/rich-text.directive.js +38 -20
  52. package/esm2015/lib/select/select.component.js +9 -4
  53. package/esm2015/lib/version.js +2 -2
  54. package/esm5/datorama-core.js +1 -2
  55. package/esm5/lib/breadcrumbs/breadcrumbs.component.js +2 -4
  56. package/esm5/lib/directives/clipboard.directive.js +7 -16
  57. package/esm5/lib/grid/dato-grid-api.js +1 -1
  58. package/esm5/lib/grid/dato-grid.js +1 -1
  59. package/esm5/lib/grid/grid/grid.component.js +7 -6
  60. package/esm5/lib/grid/grid-header/grid-header.component.js +1 -1
  61. package/esm5/lib/grid/grid-helper.js +1 -1
  62. package/esm5/lib/grid/grid-pagination/grid-pagination.component.js +2 -2
  63. package/esm5/lib/grid/grid-toolbar/grid-toolbar.component.js +2 -2
  64. package/esm5/lib/grid/grid.module.js +2 -2
  65. package/esm5/lib/grid-v2/grid/grid-v2.component.js +10 -8
  66. package/esm5/lib/grid-v2/grid/grid-v2.config.js +5 -22
  67. package/esm5/lib/grid-v2/grid/grid-v2.types.js +3 -3
  68. package/esm5/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.js +3 -3
  69. package/esm5/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.js +3 -3
  70. package/esm5/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.js +1 -1
  71. package/esm5/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.js +1 -1
  72. package/esm5/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.js +1 -1
  73. package/esm5/lib/grid-v2/grid-column-header/grid-column-header.component.js +2 -2
  74. package/esm5/lib/grid-v2/grid-column-header/grid-column-header.types.js +1 -1
  75. package/esm5/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.js +4 -3
  76. package/esm5/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.js +1 -1
  77. package/esm5/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.js +1 -1
  78. package/esm5/lib/grid-v2/grid-controller/grid-controller.component.js +11 -17
  79. package/esm5/lib/grid-v2/grid-controller/grid-controller.types.js +1 -1
  80. package/esm5/lib/grid-v2/grid-custom-header/custom-header-template.directive.js +1 -1
  81. package/esm5/lib/grid-v2/grid-filter/filter-validator.js +1 -1
  82. package/esm5/lib/grid-v2/grid-filter/grid-filter.component.js +1 -1
  83. package/esm5/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.js +1 -1
  84. package/esm5/lib/grid-v2/grid-loader/grid-v2-loader.component.js +1 -1
  85. package/esm5/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.js +1 -1
  86. package/esm5/lib/grid-v2/grid-on-hover/grid-on-hover.component.js +1 -1
  87. package/esm5/lib/grid-v2/grid-pagination/grid-pagination.component.js +1 -1
  88. package/esm5/lib/grid-v2/grid-settings.js +2 -2
  89. package/esm5/lib/grid-v2/grid-store/grid.query.js +2 -2
  90. package/esm5/lib/grid-v2/grid-store/grid.service.js +52 -42
  91. package/esm5/lib/grid-v2/grid-store/util.js +1 -1
  92. package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.component.js +4 -16
  93. package/esm5/lib/grid-v2/grid-toolbar/grid-toolbar.types.js +1 -1
  94. package/esm5/lib/grid-v2/grid-v2.module.js +2 -2
  95. package/esm5/lib/grid-v2/grid-v2.util.js +1 -1
  96. package/esm5/lib/icon/icon.types.js +1 -1
  97. package/esm5/lib/rich-text/rich-text.directive.js +39 -21
  98. package/esm5/lib/select/select.component.js +9 -4
  99. package/esm5/lib/version.js +2 -2
  100. package/fesm2015/datorama-core.js +143 -178
  101. package/fesm2015/datorama-core.js.map +1 -1
  102. package/fesm5/datorama-core.js +144 -186
  103. package/fesm5/datorama-core.js.map +1 -1
  104. package/lib/directives/clipboard.directive.d.ts +2 -1
  105. package/lib/grid/dato-grid-api.d.ts +1 -1
  106. package/lib/grid/dato-grid.d.ts +1 -1
  107. package/lib/grid/grid/grid.component.d.ts +3 -4
  108. package/lib/grid/grid-helper.d.ts +1 -1
  109. package/lib/grid/grid-pagination/grid-pagination.component.d.ts +1 -1
  110. package/lib/grid-v2/grid/grid-v2.component.d.ts +2 -2
  111. package/lib/grid-v2/grid/grid-v2.config.d.ts +0 -1
  112. package/lib/grid-v2/grid/grid-v2.types.d.ts +1 -3
  113. package/lib/grid-v2/grid-column-cell-components/grid-avatar-cell/grid-avatar-cell.component.d.ts +2 -2
  114. package/lib/grid-v2/grid-column-cell-components/grid-initials-cell/grid-initials-cell.component.d.ts +2 -2
  115. package/lib/grid-v2/grid-column-cell-components/grid-items-cell/grid-items-cell.component.d.ts +2 -2
  116. package/lib/grid-v2/grid-column-cell-components/grid-items-count-cell/grid-items-count-cell.component.d.ts +2 -2
  117. package/lib/grid-v2/grid-column-cell-components/grid-status-cell/grid-status-cell.component.d.ts +2 -2
  118. package/lib/grid-v2/grid-column-header/grid-column-header.component.d.ts +2 -2
  119. package/lib/grid-v2/grid-column-header/grid-column-header.types.d.ts +1 -1
  120. package/lib/grid-v2/grid-column-header/grid-multi-select-header/grid-multi-select-header.component.d.ts +2 -2
  121. package/lib/grid-v2/grid-column-header-more-menu/grid-column-header-more-menu.component.d.ts +1 -1
  122. package/lib/grid-v2/grid-columns-display-menu/grid-columns-display-menu.component.d.ts +1 -1
  123. package/lib/grid-v2/grid-controller/grid-controller.component.d.ts +7 -7
  124. package/lib/grid-v2/grid-controller/grid-controller.types.d.ts +1 -1
  125. package/lib/grid-v2/grid-custom-header/custom-header-template.directive.d.ts +1 -1
  126. package/lib/grid-v2/grid-filter/filter-validator.d.ts +1 -1
  127. package/lib/grid-v2/grid-groups-menu/grid-groups-menu.component.d.ts +1 -1
  128. package/lib/grid-v2/grid-loader/grid-v2-loader.component.d.ts +2 -2
  129. package/lib/grid-v2/grid-no-data-overlay/grid-v2-no-data-overlay.component.d.ts +2 -2
  130. package/lib/grid-v2/grid-on-hover/grid-on-hover.component.d.ts +1 -1
  131. package/lib/grid-v2/grid-settings.d.ts +2 -2
  132. package/lib/grid-v2/grid-store/grid.query.d.ts +4 -4
  133. package/lib/grid-v2/grid-store/grid.service.d.ts +377 -6
  134. package/lib/grid-v2/grid-store/util.d.ts +1 -1
  135. package/lib/grid-v2/grid-toolbar/grid-toolbar.component.d.ts +1 -3
  136. package/lib/grid-v2/grid-toolbar/grid-toolbar.types.d.ts +1 -1
  137. package/lib/grid-v2/grid-v2.util.d.ts +1 -1
  138. package/lib/icon/icon.types.d.ts +1 -1
  139. package/lib/rich-text/rich-text.directive.d.ts +6 -4
  140. package/package.json +2 -2
  141. package/testing/src/grid/row.ts +1 -1
  142. package/esm2015/lib/rich-text/rich-text.service.js +0 -50
  143. package/esm5/lib/rich-text/rich-text.service.js +0 -51
  144. package/lib/rich-text/rich-text.service.d.ts +0 -10
@@ -10,7 +10,7 @@ import { isEmpty, isFunction, isNil, isString } from '../../utils/validators';
10
10
  import { validateFilter } from '../grid-filter/filter-validator';
11
11
  import { IconRegistry, SvgRegistry } from '../../services/icon-registry';
12
12
  import { getVisibleActions, toolbarActionToContextAction } from '../grid-v2.util';
13
- import { copyToClipboard } from '../../directives/clipboard.directive';
13
+ import { writeToClipboard } from '../../directives/clipboard.directive';
14
14
  import { GridStore } from './grid.store';
15
15
  import { DATO_GRID_STORAGE_API } from '../grid-settings';
16
16
  import { DatoGridColumnTypes, editableCellRendererWithSearchHighlight, GridMinWidths, GridRowSelectionType, searchHighlightCellRenderer } from '../grid/grid-v2.types';
@@ -36,7 +36,7 @@ var GridService = /** @class */ (function () {
36
36
  this.logger = logger;
37
37
  this.treeConfig = defaultGridTreeLabel;
38
38
  this.pageNumberToReturnAfterRefresh = -1;
39
- this.updateGridActionsSubject = new Subject();
39
+ this.reloadGridActionsSubject = new Subject();
40
40
  this.CHECKBOX_SELECTION_COL_ID = 'grid-checkbox-selection';
41
41
  }
42
42
  Object.defineProperty(GridService.prototype, "treeData", {
@@ -69,11 +69,11 @@ var GridService = /** @class */ (function () {
69
69
  ? context
70
70
  : deepmerge(this.gridRef.gridOptions.context || {}, context);
71
71
  };
72
- GridService.prototype.updateGridActions = function () {
73
- this.updateGridActionsSubject.next(true);
72
+ GridService.prototype.reloadGridActions = function () {
73
+ this.reloadGridActionsSubject.next();
74
74
  };
75
- GridService.prototype.getUpdateGridActionsStatus = function () {
76
- return this.updateGridActionsSubject.asObservable();
75
+ GridService.prototype.onReloadGridActions = function () {
76
+ return this.reloadGridActionsSubject.asObservable();
77
77
  };
78
78
  /**
79
79
  * @deprecated use selectRows instead
@@ -185,26 +185,41 @@ var GridService = /** @class */ (function () {
185
185
  this.loadSavedSettings(savedSettings);
186
186
  }
187
187
  };
188
+ GridService.prototype.initGridOptions = function (gridOptions) {
189
+ var options = __assign({}, gridOptions);
190
+ if (typeof gridOptions.enableSearch === 'undefined') {
191
+ options.enableSearch = options.enableV2_1;
192
+ }
193
+ if (typeof gridOptions.enableBackground === 'undefined') {
194
+ options.enableBackground = options.enableV2_1;
195
+ }
196
+ if (typeof gridOptions.showMultiSelectionCheckboxes === 'undefined') {
197
+ options.showMultiSelectionCheckboxes =
198
+ gridOptions.enableV2_1 && options.rowSelection !== GridRowSelectionType.SINGLE;
199
+ }
200
+ if (typeof gridOptions.enableSearchHighlight === 'undefined') {
201
+ options.enableSearchHighlight = options.enableSearch && defaultGridOptions.enableSearchHighlight;
202
+ }
203
+ if (gridOptions.usePivotGridStyle) {
204
+ var rowHeight_1 = 30;
205
+ options.rowHeight = rowHeight_1;
206
+ options.defaultColDef = __assign(__assign({}, options.defaultColDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this), cellStyle: function (params) {
207
+ var style = { lineHeight: rowHeight_1 + "px" };
208
+ if (params.colDef.type === DatoGridColumnTypes.Number) {
209
+ style.textAlign = 'end';
210
+ }
211
+ return style;
212
+ } });
213
+ options.autoGroupColumnDef = __assign(__assign({}, options.autoGroupColumnDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this) });
214
+ }
215
+ return options;
216
+ };
188
217
  GridService.prototype.normalizeOptions = function (params) {
189
218
  var _this = this;
190
219
  this.customHeadersTemplates = params.customHeadersTemplates;
191
220
  var headerComponentParams = { gridService: this, gridQuery: this.gridQuery };
192
221
  params.gridOptions.autoGroupColumnDef = __assign(__assign({}, headerComponentParams), params.gridOptions.autoGroupColumnDef);
193
222
  params.gridOptions.defaultColDef = __assign(__assign({}, params.gridOptions.defaultColDef), { headerComponentParams: headerComponentParams });
194
- if (typeof params.gridOptions.enableSearch === 'undefined') {
195
- params.gridOptions.enableSearch = params.gridOptions.enableV2_1;
196
- }
197
- if (typeof params.gridOptions.enableBackground === 'undefined') {
198
- params.gridOptions.enableBackground = params.gridOptions.enableV2_1;
199
- }
200
- if (typeof params.gridOptions.showMultiSelectionCheckboxes === 'undefined') {
201
- params.gridOptions.showMultiSelectionCheckboxes =
202
- params.gridOptions.enableV2_1 && params.gridOptions.rowSelection !== GridRowSelectionType.SINGLE;
203
- }
204
- if (typeof params.gridOptions.enableSearchHighlight === 'undefined') {
205
- params.gridOptions.enableSearchHighlight =
206
- params.gridOptions.enableSearch && defaultGridOptions.enableSearchHighlight;
207
- }
208
223
  params.gridOptions.columnDefs = this.normalizeColumns(params.gridOptions.columnDefs, params.gridOptions);
209
224
  /** Add core filters */
210
225
  params.gridOptions.isExternalFilterPresent = function () { return true; };
@@ -231,23 +246,18 @@ var GridService = /** @class */ (function () {
231
246
  params.gridOptions.saveSettings = saveSettings !== false && !isNil(gridName);
232
247
  /** Server Side Pagination for select all option */
233
248
  this.initOnRowSelectedForServerSidePagination(params);
249
+ /** Add tree grid specific required settings */
250
+ if (this.isTreeData) {
251
+ var inputRowClassRules = params.gridOptions.rowClassRules;
252
+ params.gridOptions.rowClassRules = __assign(__assign({}, inputRowClassRules), { 'ag-empty-folder': function (params) {
253
+ return params.data.isFolder && size(params.node.childrenAfterGroup) === 0;
254
+ } });
255
+ }
234
256
  /** Add pivot specific required settings */
235
- if (params.gridOptions.pivotMode) {
257
+ if (this.isPivotMode) {
236
258
  this.initPivotSecondaryColsProcess(params);
237
259
  params.gridOptions.saveSettings = false;
238
260
  }
239
- if (params.gridOptions.usePivotGridStyle) {
240
- var rowHeight_1 = 30;
241
- params.gridOptions.rowHeight = rowHeight_1;
242
- params.gridOptions.defaultColDef = __assign(__assign({}, params.gridOptions.defaultColDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this), cellStyle: function (params) {
243
- var style = { lineHeight: rowHeight_1 + "px" };
244
- if (params.colDef.type === DatoGridColumnTypes.Number) {
245
- style.textAlign = 'end';
246
- }
247
- return style;
248
- } });
249
- params.gridOptions.autoGroupColumnDef = __assign(__assign({}, params.gridOptions.autoGroupColumnDef), { cellClassRules: this.getPivotModeCellClassRules(), headerClass: this.getPivotHeaderClass.bind(this) });
250
- }
251
261
  return params.gridOptions;
252
262
  };
253
263
  GridService.prototype.getPivotHeaderClass = function (params) {
@@ -332,8 +342,9 @@ var GridService = /** @class */ (function () {
332
342
  colId: this.CHECKBOX_SELECTION_COL_ID,
333
343
  checkboxSelection: true,
334
344
  headerComponentFramework: DatoGridMultiSelectColumnHeaderComponent,
335
- width: 30,
336
- maxWidth: 30,
345
+ minWidth: 29,
346
+ width: 29,
347
+ maxWidth: 29,
337
348
  suppressSizeToFit: true,
338
349
  cellClass: 'checkbox-selection-cell',
339
350
  headerClass: 'header-checkbox-selection-cell',
@@ -570,8 +581,7 @@ var GridService = /** @class */ (function () {
570
581
  this.updateSettings({ gridAlignment: gridAlignment, columnsSizes: null });
571
582
  };
572
583
  GridService.prototype.saveSettingsToServer = function (settings) {
573
- var isGlobal = this.gridQuery.getGridOptions().isGlobalSettings;
574
- this.storageAPI.set(this.gridName, settings, isGlobal);
584
+ this.storageAPI.set(this.gridName, settings);
575
585
  };
576
586
  /**
577
587
  * @internal used to log grid events to the platform's logging service
@@ -684,8 +694,8 @@ var GridService = /** @class */ (function () {
684
694
  var _b = __read(_a, 1), row = _b[0];
685
695
  var rawValue = _this.api.grid.getValue(column.getColId(), row);
686
696
  var formatter = column.getColDef().valueFormatter;
687
- var value = formatter ? formatter(rawValue) : rawValue;
688
- copyToClipboard(value);
697
+ var value = formatter && typeof formatter !== 'string' ? formatter(rawValue) : rawValue;
698
+ writeToClipboard(value);
689
699
  };
690
700
  if (node.isSelected()) {
691
701
  selected = _this.gridQuery.getSelectedRowNodes();
@@ -1119,8 +1129,8 @@ var GridService = /** @class */ (function () {
1119
1129
  * Refer docs - https://www.ag-grid.com/angular-data-grid/cell-styles/#cell-class-rules */
1120
1130
  GridService.prototype.getPivotModeCellClassRules = function () {
1121
1131
  return {
1122
- 'primary-0-background-color': this.isLeafGroupEvenCell.bind(this),
1123
- 'primary-100-background-color pointer dato-simple-bold': this.isRowGroupValuedCell.bind(this)
1132
+ 'even-row-group-leaf-cell': this.isLeafGroupEvenCell.bind(this),
1133
+ 'row-group-root-cell': this.isRowGroupValuedCell.bind(this)
1124
1134
  };
1125
1135
  };
1126
1136
  GridService.prototype.isLeafGroupEvenCell = function (params) {
@@ -1165,4 +1175,4 @@ var GridService = /** @class */ (function () {
1165
1175
  return GridService;
1166
1176
  }());
1167
1177
  export { GridService };
1168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUN2RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBa0IsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBSUwsbUJBQW1CLEVBT25CLHVDQUF1QyxFQUN2QyxhQUFhLEVBQ2Isb0JBQW9CLEVBQ3BCLDJCQUEy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O0lBRU8sOENBQXdCLEdBQWhDLFVBQWlDLE1BQXVCO1FBQ3RELElBQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUMsU0FBUyxDQUFDO1FBRWhFLElBQUksU0FBUyxJQUFJLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDdEIsSUFBQSwrQkFBTyxDQUFrQztZQUNqRCxJQUFNLG1CQUFtQixHQUFHLE9BQU8sQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzdELElBQU0sZUFBZSxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxVQUFBLEdBQUcsSUFBSSxPQUFBLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBdEMsQ0FBc0MsQ0FBQyxDQUFDO1lBRWhHLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNaLENBQUM7O2dCQXZxQ2dCLFNBQVM7Z0JBQ0wsU0FBUztnQkFDVCxvQkFBb0I7Z0JBQ2pCLFlBQVk7Z0JBQ2IsV0FBVztnREFDL0IsTUFBTSxTQUFDLHFCQUFxQjtnREFDNUIsTUFBTSxTQUFDLGdCQUFnQjs7SUFqQ2YsV0FBVztRQUR2QixVQUFVLEVBQUU7UUFpQ1IsV0FBQSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQTtRQUM3QixXQUFBLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO3lDQU5WLFNBQVM7WUFDTCxTQUFTO1lBQ1Qsb0JBQW9CO1lBQ2pCLFlBQVk7WUFDYixXQUFXO09BL0J2QixXQUFXLENBbXNDdkI7SUFBRCxrQkFBQztDQUFBLEFBbnNDRCxJQW1zQ0M7U0Fuc0NZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIE9uRGVzdHJveSwgUXVlcnlMaXN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYXRvR3JpZEFwaSB9IGZyb20gJy4uL2dyaWQtY29udHJvbGxlci9ncmlkLWNvbnRyb2xsZXIudHlwZXMnO1xuaW1wb3J0IHtcbiAgQ2VsbENsYXNzUGFyYW1zLFxuICBDb2xHcm91cERlZixcbiAgQ29sdW1uLFxuICBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zLFxuICBHcmlkT3B0aW9ucyxcbiAgSUNlbGxSZW5kZXJlclBhcmFtcyxcbiAgSUdldFJvd3NQYXJhbXMsXG4gIFJvd05vZGUsXG4gIFJvd05vZGVUcmFuc2FjdGlvbixcbiAgUm93U2VsZWN0ZWRFdmVudFxufSBmcm9tICdhZy1ncmlkLWNvbW11bml0eSc7XG5pbXBvcnQgeyBSb3dEYXRhVHJhbnNhY3Rpb24gfSBmcm9tICdhZy1ncmlkLWNvbW11bml0eS9kaXN0L2xpYi9yb3dNb2RlbHMvY2xpZW50U2lkZS9jbGllbnRTaWRlUm93TW9kZWwnO1xuaW1wb3J0IHsgR3JpZFF1ZXJ5IH0gZnJvbSAnLi9ncmlkLnF1ZXJ5JztcbmltcG9ydCB7IERhdG9Db3JlRXJyb3IgfSBmcm9tICcuLi8uLi9lcnJvcnMnO1xuaW1wb3J0IHsgRGF0b1RyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy90cmFuc2xhdGUuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQgfSBmcm9tICcuLi9ncmlkLWN1c3RvbS1oZWFkZXIvY3VzdG9tLWhlYWRlci10ZW1wbGF0ZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgdGFrZSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7XG4gIERhdG9GaWx0ZXJDb25kaXRpb25zLFxuICBEYXRvR3JpZENvbmRpdGlvbmFsRmlsdGVyLFxuICBEYXRvR3JpZEV4dGVybmFsRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlcixcbiAgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb24sXG4gIERhdG9HcmlkRmlsdGVyU2VjdGlvbnMsXG4gIERhdG9HcmlkRmlsdGVyc01hcCxcbiAgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb24sXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcnMsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uTGlzdENvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25SYW5nZUNvbmRpdGlvblxufSBmcm9tICcuLi9ncmlkLWZpbHRlci9ncmlkLWZpbHRlci50eXBlcyc7XG5pbXBvcnQgeyBjb2VyY2VBcnJheSB9IGZyb20gJy4uLy4uL3V0aWxzL2NvZXJjaW9uJztcbmltcG9ydCB7IGlzRW1wdHksIGlzRnVuY3Rpb24sIGlzTmlsLCBpc1N0cmluZyB9IGZyb20gJy4uLy4uL3V0aWxzL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHsgdmFsaWRhdGVGaWx0ZXIgfSBmcm9tICcuLi9ncmlkLWZpbHRlci9maWx0ZXItdmFsaWRhdG9yJztcbmltcG9ydCB7IEFnR3JpZE5nMiB9IGZyb20gJ2FnLWdyaWQtYW5ndWxhcic7XG5pbXBvcnQgeyBJY29uUmVnaXN0cnksIFN2Z1JlZ2lzdHJ5IH0gZnJvbSAnLi4vLi4vc2VydmljZXMvaWNvbi1yZWdpc3RyeSc7XG5pbXBvcnQgeyBnZXRWaXNpYmxlQWN0aW9ucywgdG9vbGJhckFjdGlvblRvQ29udGV4dEFjdGlvbiB9IGZyb20gJy4uL2dyaWQtdjIudXRpbCc7XG5pbXBvcnQge1xuICBEYXRvR3JpZFNldHRpbmdzLFxuICBOb3JtYWxpemVPcHRpb25zUGFyYW1zLFxuICBQaXZvdENvbHVtbkRhdGEsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZmlnLFxuICBTdWNjZXNzV3JhcHBlclBhcmFtc1xufSBmcm9tICcuL2dyaWQuc3RvcmUudHlwZXMnO1xuaW1wb3J0IHsgUm93QWN0aW9uIH0gZnJvbSAnLi4vZ3JpZC10b29sYmFyL2dyaWQtdG9vbGJhci50eXBlcyc7XG5pbXBvcnQgeyBjb3B5VG9DbGlwYm9hcmQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NsaXBib2FyZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZFN0b3JlIH0gZnJvbSAnLi9ncmlkLnN0b3JlJztcbmltcG9ydCB7IERBVE9fR1JJRF9TVE9SQUdFX0FQSSwgR3JpZFN0b3JhZ2VBUEkgfSBmcm9tICcuLi9ncmlkLXNldHRpbmdzJztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnZlcnRlclBhcmFtcyxcbiAgRGF0b0dyaWRBbGlnbm1lbnQsXG4gIERhdG9HcmlkQ29sdW1uRGVmLFxuICBEYXRvR3JpZENvbHVtblR5cGVzLFxuICBEYXRvR3JpZEdldFJvd3NQYXJhbXMsXG4gIERhdG9HcmlkT3B0aW9ucyxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0LFxuICBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb24sXG4gIERhdG9HcmlkU29ydCxcbiAgRGF0b0dyaWRUcmVlQ29uZmlnLFxuICBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQsXG4gIEdyaWRNaW5XaWR0aHMsXG4gIEdyaWRSb3dTZWxlY3Rpb25UeXBlLFxuICBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXJcbn0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLnR5cGVzJztcblxuaW1wb3J0IHsgY29udmVydFRvVHJlZURhdGEsIGRlZmF1bHRHcmlkT3B0aW9ucywgZGVmYXVsdEdyaWRUcmVlTGFiZWwgfSBmcm9tICcuLi9ncmlkL2dyaWQtdjIuY29uZmlnJztcbmltcG9ydCB7IGRpZmYgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3QnO1xuaW1wb3J0IHsgdW50aWxEZXN0cm95ZWQgfSBmcm9tICduZ3gtdGFrZS11bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IENvcmVFdmVudExvZ2dlciwgQ29yZUV2ZW50VHlwZXMsIERBVE9fQ09SRV9MT0dHRVIgfSBmcm9tICcuLi8uLi9ldmVudC1sb2dnZXInO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IHNpemUgfSBmcm9tICcuLi8uLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IE9wZXJhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi9vcGVyYXRvci10b2dnbGVyL29wZXJhdG9yLXRvZ2dsZXIudHlwZXMnO1xuaW1wb3J0IHsgZGVlcG1lcmdlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZGVlcC1tZXJnZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0cmlnZ2VyV2luZG93UmVzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBnZXRDb2xGaWVsZCwgZ2V0Q29sdW1uc1NpemVzLCBpc0h0bWxBbGxvd2VkRm9yQ29sLCB0cnlQYXJzZVBpdm90VmFsdWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY29sdW1uLWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGFwaTogRGF0b0dyaWRBcGk7XG4gIHRyZWVDb25maWc6IERhdG9HcmlkVHJlZUNvbmZpZyA9IGRlZmF1bHRHcmlkVHJlZUxhYmVsO1xuICBpc1Bpdm90TW9kZTogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsIC0gdXNlZCBmb3Igc2VydmVyIHNpZGUgYnkgdmFsdWUgZmlsdGVyICovXG4gIF9vcmlnaW5hbEdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsU2V0dGluZ3M6IERhdG9HcmlkU2V0dGluZ3M7XG4gIHByaXZhdGUgZ3JpZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBncmlkUmVmOiBBZ0dyaWROZzI7XG4gIHByaXZhdGUgY3VzdG9tSGVhZGVyc1RlbXBsYXRlczogUXVlcnlMaXN0PERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudD47XG4gIHByaXZhdGUgaXNUcmVlRGF0YTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBwYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcbiAgcHJpdmF0ZSBsYXN0VG90YWxSb3dzOiBudW1iZXI7XG4gIHByaXZhdGUgdXBkYXRlR3JpZEFjdGlvbnNTdWJqZWN0ID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IENIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQgPSAnZ3JpZC1jaGVja2JveC1zZWxlY3Rpb24nO1xuXG4gIHNldCB0cmVlRGF0YShpc1RyZWVEYXRhOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc1RyZWVEYXRhID0gaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGdldCB0cmVlRGF0YSgpIHtcbiAgICByZXR1cm4gdGhpcy5pc1RyZWVEYXRhO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBzdG9yZTogR3JpZFN0b3JlLFxuICAgIHByaXZhdGUgZ3JpZFF1ZXJ5OiBHcmlkUXVlcnksXG4gICAgcHJpdmF0ZSB0cmFuc2xhdGU6IERhdG9UcmFuc2xhdGVTZXJ2aWNlLFxuICAgIHByaXZhdGUgaWNvblJlZ2lzdHJ5OiBJY29uUmVnaXN0cnksXG4gICAgcHJpdmF0ZSBzdmdSZWdpc3RyeTogU3ZnUmVnaXN0cnksXG4gICAgQEluamVjdChEQVRPX0dSSURfU1RPUkFHRV9BUEkpIHByaXZhdGUgc3RvcmFnZUFQSTogR3JpZFN0b3JhZ2VBUEksXG4gICAgQEluamVjdChEQVRPX0NPUkVfTE9HR0VSKSBwcml2YXRlIGxvZ2dlcjogQ29yZUV2ZW50TG9nZ2VyXG4gICkge31cblxuICBuZ09uRGVzdHJveSgpIHt9XG5cbiAgLyoqIEBpbnRlcm5hbCAtIHVzZWQgdG8gaW5pdCB0aGUgc2VydmljZSAqL1xuICBfc2V0QXBpKGFwaTogRGF0b0dyaWRBcGksIGdyaWRSZWY6IEFnR3JpZE5nMikge1xuICAgIHRoaXMuYXBpID0gYXBpO1xuICAgIHRoaXMuZ3JpZFJlZiA9IGdyaWRSZWY7XG4gICAgdGhpcy5ncmlkTmFtZSA9IChncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykuZ3JpZE5hbWU7XG4gICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICBlbmFibGVkOiB0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZFJlZi5ncmlkT3B0aW9ucylcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9uczogR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ3JpZE9wdGlvbnMucm93TW9kZWxUeXBlID09PSAnaW5maW5pdGUnO1xuICB9XG5cbiAgdXBkYXRlR3JpZENvbnRleHQoY29udGV4dCA9IHt9LCByZXBsYWNlID0gZmFsc2UpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmNvbnRleHQgPSByZXBsYWNlXG4gICAgICA/IGNvbnRleHRcbiAgICAgIDogZGVlcG1lcmdlKHRoaXMuZ3JpZFJlZi5ncmlkT3B0aW9ucy5jb250ZXh0IHx8IHt9LCBjb250ZXh0KTtcbiAgfVxuXG4gIHVwZGF0ZUdyaWRBY3Rpb25zKCk6IHZvaWQge1xuICAgIHRoaXMudXBkYXRlR3JpZEFjdGlvbnNTdWJqZWN0Lm5leHQodHJ1ZSk7XG4gIH1cblxuICBnZXRVcGRhdGVHcmlkQWN0aW9uc1N0YXR1cygpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gdGhpcy51cGRhdGVHcmlkQWN0aW9uc1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNlbGVjdFJvd3MgaW5zdGVhZFxuICAgKiBAcGFyYW0gcm93XG4gICAqL1xuICBzZXRTZWxlY3RlZFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICB0aGlzLnNlbGVjdFJvd3Mocm93KTtcbiAgfVxuXG4gIHNlbGVjdFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICBjb25zdCByb3dOb2RlcyA9IGNvZXJjZUFycmF5KHJvdykuZmlsdGVyKHJvd05vZGUgPT4gIXJvd05vZGUuaXNTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsYXN0Tm9kZSA9IHJvd05vZGVzLnBvcCgpO1xuICAgIHJvd05vZGVzLmZvckVhY2gocm93Tm9kZSA9PiByb3dOb2RlLnNldFNlbGVjdGVkKHRydWUsIGZhbHNlLCB0cnVlKSk7XG4gICAgaWYgKGxhc3ROb2RlKSB7XG4gICAgICBsYXN0Tm9kZS5zZXRTZWxlY3RlZCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBkZXNlbGVjdFJvd3M8VD4ocm93OiAoVCAmIFJvd05vZGUpIHwgKFRbXSAmIFJvd05vZGVbXSkpIHtcbiAgICBjb25zdCByb3dOb2RlcyA9IGNvZXJjZUFycmF5KHJvdykuZmlsdGVyKHJvd05vZGUgPT4gcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQoZmFsc2UsIGZhbHNlLCB0cnVlKSk7XG4gICAgaWYgKGxhc3ROb2RlKSB7XG4gICAgICBsYXN0Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0Um93czxUPihkYXRhOiBUW10sIGZpdENvbnRhaW5lciA9IGZhbHNlLCB0cmVlQ29uZmlnOiBQYXJ0aWFsPERhdG9HcmlkVHJlZUNvbmZpZz4gPSB7fSkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5LmdyaWRSZWFkeSQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuaXNUcmVlRGF0YSkge1xuICAgICAgICB0aGlzLnRyZWVDb25maWcgPSB7XG4gICAgICAgICAgLi4uZGVmYXVsdEdyaWRUcmVlTGFiZWwsXG4gICAgICAgICAgLi4udHJlZUNvbmZpZ1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCB0cmVlRGF0ZSA9IGNvbnZlcnRUb1RyZWVEYXRhKGRhdGEsIHRoaXMudHJlZUNvbmZpZyk7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YSh0cmVlRGF0ZSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQaXZvdE1vZGUpIHtcbiAgICAgICAgdGhpcy5zZXRQaXZvdE1vZGVSb3dzPFQ+KGRhdGEpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGRhdGEpO1xuICAgICAgfVxuICAgICAgaWYgKGZpdENvbnRhaW5lcikge1xuICAgICAgICB0aGlzLmZpdEdyaWQoJ2NvbnRhaW5lcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgc2V0RGF0YXNvdXJjZShnZXRSb3dzOiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQsIHJldHVyblRvQ3VycmVudFBhZ2UgPSBmYWxzZSwgc2hvd0xvYWRpbmcgPSBmYWxzZSkge1xuICAgIHJldHVyblRvQ3VycmVudFBhZ2UgJiYgdGhpcy51cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpO1xuICAgIHNob3dMb2FkaW5nICYmIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB0aGlzLl9vcmlnaW5hbEdldFJvd3MgPSBnZXRSb3dzO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0RGF0YXNvdXJjZSh7IGdldFJvd3M6IHRoaXMud3JhcEdldFJvd3ModGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKSwgZ2V0Um93cykgfSk7XG4gIH1cblxuICByZWZyZXNoU2VydmVyRGF0YShrZWVwQ3VycmVudFBhZ2UgPSBmYWxzZSwgc2hvd0xvYWRpbmcgPSBmYWxzZSkge1xuICAgIGtlZXBDdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0RGF0YXNvdXJjZSh7IGdldFJvd3M6IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuZGF0YXNvdXJjZS5nZXRSb3dzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQYWdlVG9LZWVwT25SZWZyZXNoU2VydmVyRGF0YSgpIHtcbiAgICAvLyBLZWVwaW5nIHRoZSBjdXJyZW50IHBhZ2Ugb24gc2VydmVyIHJlZnJlc2ggaXMgY3VycmVudGx5IGF2YWlsYWJsZSBvbmx5IHdoZW4gbm8gcGFnZSBjbGllbnQgY2FjaGluZyBpcyBlbmFibGVkXG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkubWF4QmxvY2tzSW5DYWNoZSA9PT0gMSkge1xuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSB0aGlzLmFwaS5ncmlkLnBhZ2luYXRpb25HZXRDdXJyZW50UGFnZSgpO1xuICAgIH1cbiAgfVxuXG4gIGFkZFJvd3M8VD4ocm93OiBULCBpbmRleD86IG51bWJlcik6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdyk7XG4gICAgY29uc3QgZGF0YTogUm93RGF0YVRyYW5zYWN0aW9uID0geyBhZGQ6IHJvd3MgfTtcbiAgICBpZiAoIWlzTmlsKGluZGV4KSkge1xuICAgICAgZGF0YS5hZGRJbmRleCA9IGluZGV4O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKGRhdGEpO1xuICB9XG5cbiAgdXBkYXRlUm93czxUPihyb3c6IFRbXSk6IGFueSB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdyk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHVwZGF0ZTogcm93cyB9KTtcbiAgfVxuXG4gIHVwZGF0ZVJvd1ZhbHVlPFQ+KHJvdzogUm93Tm9kZSwga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTtcbiAgdXBkYXRlUm93VmFsdWU8VD4oaWQ6IHN0cmluZywga2V5OiBzdHJpbmcsIG5ld1ZhbHVlOiBUKTtcbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBzdHJpbmcgfCBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpIHtcbiAgICBjb25zdCByb3dOb2RlID0gaXNTdHJpbmcocm93KSA/IHRoaXMuYXBpLmdyaWQuZ2V0Um93Tm9kZShyb3cpIDogcm93O1xuICAgIHJvd05vZGUuc2V0RGF0YVZhbHVlKGtleSwgbmV3VmFsdWUpO1xuICB9XG5cbiAgcmVtb3ZlUm93cyhyb3c6IFJvd05vZGUgfCBSb3dOb2RlW10pOiBSb3dOb2RlVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHJvd3MgPSBjb2VyY2VBcnJheShyb3cpLm1hcCgoeyBkYXRhIH0pID0+IGRhdGEpO1xuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoeyByZW1vdmU6IHJvd3MgfSk7XG4gIH1cblxuICByZW1vdmVTZWxlY3RlZFJvd3MoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRSb3dzID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgIHJldHVybiB0aGlzLnJlbW92ZVJvd3Moc2VsZWN0ZWRSb3dzKTtcbiAgfVxuXG4gIGNsZWFyVGFibGUoKSB7XG4gICAgdGhpcy5zZXRSb3dzKFtdKTtcbiAgfVxuXG4gIHVwZGF0ZUNvbHVtbnMoY29sRGVmczogRGF0b0dyaWRDb2x1bW5EZWYgfCBEYXRvR3JpZENvbHVtbkRlZltdLCByZWxvYWRTZXR0aW5ncyA9IGZhbHNlKSB7XG4gICAgaWYgKCFjb2xEZWZzKSB7XG4gICAgICB0aHJvdyBuZXcgRGF0b0NvcmVFcnJvcignTm8gY29sdW1uRGVmcyB3ZXJlIHByb3ZpZGVkLiDwn5W18J+Pu+KAjeKZgO+4jycpO1xuICAgIH1cbiAgICBjb25zdCBub3JtYWxpemVkID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKGNvZXJjZUFycmF5KGNvbERlZnMpKTtcbiAgICBjb25zdCBzYXZlZFNldHRpbmdzID0gcmVsb2FkU2V0dGluZ3MgJiYgdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHRoaXMuYXBpLmdyaWQuc2V0Q29sdW1uRGVmcyhub3JtYWxpemVkKTtcbiAgICBpZiAoc2F2ZWRTZXR0aW5ncykge1xuICAgICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVPcHRpb25zKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcyA9IHBhcmFtcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzO1xuICAgIGNvbnN0IGhlYWRlckNvbXBvbmVudFBhcmFtcyA9IHsgZ3JpZFNlcnZpY2U6IHRoaXMsIGdyaWRRdWVyeTogdGhpcy5ncmlkUXVlcnkgfTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xuICAgICAgLi4uaGVhZGVyQ29tcG9uZW50UGFyYW1zLFxuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZlxuICAgIH07XG5cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgaGVhZGVyQ29tcG9uZW50UGFyYW1zXG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2ggPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoID0gcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlQmFja2dyb3VuZCA9IHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmFtcy5ncmlkT3B0aW9ucy5zaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNob3dNdWx0aVNlbGVjdGlvbkNoZWNrYm94ZXMgPVxuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlVjJfMSAmJiBwYXJhbXMuZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uICE9PSBHcmlkUm93U2VsZWN0aW9uVHlwZS5TSU5HTEU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgcGFyYW1zLmdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPVxuICAgICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZW5hYmxlU2VhcmNoICYmIGRlZmF1bHRHcmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQ7XG4gICAgfVxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLCBwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLyoqIEFkZCBjb3JlIGZpbHRlcnMgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuaXNFeHRlcm5hbEZpbHRlclByZXNlbnQgPSAoKSA9PiB0cnVlO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kb2VzRXh0ZXJuYWxGaWx0ZXJQYXNzID0gKHJvdzogUm93Tm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdmFsaWRhdGVGaWx0ZXIoeyByb3csIGFwaTogdGhpcy5ncmlkUXVlcnkuYXBpLmdyaWQgfSwgdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCkpICYmIHRoaXMucm93TWF0Y2hlc1NlYXJjaChyb3cpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKiogV3JhcCB0aGUgc2VydmVyIHNpZGUgcGFnaW5hdGlvbiBnZXQgcm93cyBmdW5jdGlvbiAqL1xuICAgIGlmICh0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zLmdyaWRPcHRpb25zKSkge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmJsb2NrTG9hZERlYm91bmNlTWlsbGlzID0gMzAwO1xuICAgICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3MgPSB0aGlzLndyYXBHZXRSb3dzKHBhcmFtcy5ncmlkT3B0aW9ucyk7XG4gICAgICAvKiBUaGUgY2FjaGUgc2l6ZSBpcyBzeW5jZWQgd2l0aCB0aGUgcGFnaW5hdGlvbiBwYWdlIHNpemUgKi9cbiAgICAgIGNvbnN0IGNhY2hlU2l6ZSA9IHBhcmFtcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgICBpZiAoY2FjaGVTaXplKSB7XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jYWNoZUJsb2NrU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRWRpdGFibGUgY2VsbCAqL1xuICAgIHRoaXMuaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXMpO1xuXG4gICAgLyoqIFdyYXAgY29udGV4dCBtZW51ICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmdldENvbnRleHRNZW51SXRlbXMgPSB0aGlzLndyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zKTtcblxuICAgIC8qKiBTYXZlIGdyaWQgc2V0dGluZ3MgKi9cbiAgICBjb25zdCB7IHNhdmVTZXR0aW5ncywgZ3JpZE5hbWUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gc2F2ZVNldHRpbmdzICE9PSBmYWxzZSAmJiAhaXNOaWwoZ3JpZE5hbWUpO1xuXG4gICAgLyoqIFNlcnZlciBTaWRlIFBhZ2luYXRpb24gZm9yIHNlbGVjdCBhbGwgb3B0aW9uICovXG4gICAgdGhpcy5pbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcyk7XG5cbiAgICAvKiogQWRkIHBpdm90IHNwZWNpZmljIHJlcXVpcmVkIHNldHRpbmdzICovXG4gICAgaWYgKHBhcmFtcy5ncmlkT3B0aW9ucy5waXZvdE1vZGUpIHtcbiAgICAgIHRoaXMuaW5pdFBpdm90U2Vjb25kYXJ5Q29sc1Byb2Nlc3MocGFyYW1zKTtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5zYXZlU2V0dGluZ3MgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAocGFyYW1zLmdyaWRPcHRpb25zLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSAzMDtcblxuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnJvd0hlaWdodCA9IHJvd0hlaWdodDtcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmID0ge1xuICAgICAgICAuLi5wYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpLFxuICAgICAgICBjZWxsU3R5bGU6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGU6IGFueSA9IHsgbGluZUhlaWdodDogYCR7cm93SGVpZ2h0fXB4YCB9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5OdW1iZXIpIHtcbiAgICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICdlbmQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZiA9IHtcbiAgICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldFBpdm90SGVhZGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuICAgIGxldCBjZWxsQ2xhc3MgPSAnJztcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgLyoqIFVzZSBnZXRQaXZvdFJlc3VsdENvbHVtbnMgZnJvbSB2ZXIgMjggKi9cbiAgICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IGNvbHVtbnMuZ2V0U2Vjb25kYXJ5Q29sdW1ucygpO1xuXG4gICAgICBpZiAocGl2b3RDb2x1bW5zICYmIHBpdm90Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNlbGxDbGFzcyArPSAndG9wLWJvcmRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zID0gbnVsbCk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGlmICghZ3JpZE9wdGlvbnMpIHtcbiAgICAgIGdyaWRPcHRpb25zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbERlZnMgPSBjb2xEZWZzLm1hcCgoY29sOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBoZWFkZXJOYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oY29sLmhlYWRlck5hbWUpXG4gICAgICB9O1xuICAgICAgLyoqIEFkanVzdCB0aGUgd2lkdGggaW4gY2FzZSB0aGUgY29sdW1uIGhhcyBpbmZvICovXG4gICAgICBpZiAoY29sLmluZm8pIHtcbiAgICAgICAgbm9ybWFsaXplZC5taW5XaWR0aCA9IGNvbC5taW5XaWR0aCB8fCBHcmlkTWluV2lkdGhzLldpdGhfSW5mbztcbiAgICAgIH1cbiAgICAgIGlmICghY29sLmNvbElkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuY29sSWQgPSBjb2wuZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplZC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkl0ZW1zICYmICFub3JtYWxpemVkLmZpbHRlcnNDb25maWcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnID0geyBzZWN0aW9uczogRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucy5Db25kaXRpb25hbCB9O1xuICAgICAgfVxuICAgICAgdGhpcy5ub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoZ3JpZE9wdGlvbnMsIGNvbCwgbm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZCh1cGRhdGVkQ29sRGVmcywgZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyxcbiAgICBjb2w6IERhdG9HcmlkQ29sdW1uRGVmLFxuICAgIG5vcm1hbGl6ZWQ6IERhdG9HcmlkQ29sdW1uRGVmXG4gICkge1xuICAgIC8qKiBDaGVjayBpZiBjb2x1bW4gc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VhcmNoICoqL1xuICAgIGNvbnN0IGlzU2VydmVyUGFnaW5hdGlvbiA9IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBjb2wuaW5jbHVkZUluU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGlzU2VydmVyUGFnaW5hdGlvbiAmJiBjb2wudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5EYXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdFxuICAgICAgICAgICAgOiBkZWZhdWx0R3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoICYmXG4gICAgICAhdGhpcy5oYXNDZWxsUmVuZGVyZXIobm9ybWFsaXplZCwgZ3JpZE9wdGlvbnMpICYmXG4gICAgICBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHRcbiAgICApIHtcbiAgICAgIG5vcm1hbGl6ZWQuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBhbGxvd0hUTUwgPSBpc0h0bWxBbGxvd2VkRm9yQ29sKGdyaWRPcHRpb25zLCBwYXJhbXMuY29sRGVmKTtcbiAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9XG4gICAgICAgICAgKGlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShwYXJhbXMpKSB8fFxuICAgICAgICAgICghaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKTtcblxuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVxuICAgICAgICAgID8gZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0KHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpXG4gICAgICAgICAgOiBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXIocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2VsbFJlbmRlcmVyKGNvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYsIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoY29sdW1uLmNlbGxSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlciA9IChvcHRpb25zOiBQYXJ0aWFsPERhdG9HcmlkT3B0aW9ucz4pOiBib29sZWFuID0+XG4gICAgICBvcHRpb25zLmNvbHVtblR5cGVzICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXSAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0uY2VsbFJlbmRlcmVyO1xuXG4gICAgcmV0dXJuIGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZ3JpZE9wdGlvbnMpIHx8IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZGVmYXVsdEdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKFxuICAgIGNvbHVtbkRlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9uc1xuICApOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBjb25zdCBzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcztcbiAgICBjb25zdCByb3dTZWxlY3Rpb24gPVxuICAgICAgZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID8gZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uIDogZGVmYXVsdEdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbjtcblxuICAgIGlmIChzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzICYmIHJvd1NlbGVjdGlvbiA9PT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuTVVMVElQTEUpIHtcbiAgICAgIGNvbnN0IGNoZWNrYm94ZXNDb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmID0ge1xuICAgICAgICBjb2xJZDogdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lELFxuICAgICAgICBjaGVja2JveFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50RnJhbWV3b3JrOiBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICB3aWR0aDogMzAsXG4gICAgICAgIG1heFdpZHRoOiAzMCxcbiAgICAgICAgc3VwcHJlc3NTaXplVG9GaXQ6IHRydWUsXG4gICAgICAgIGNlbGxDbGFzczogJ2NoZWNrYm94LXNlbGVjdGlvbi1jZWxsJyxcbiAgICAgICAgaGVhZGVyQ2xhc3M6ICdoZWFkZXItY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICByZXNpemFibGU6IGZhbHNlLFxuICAgICAgICBwaW5uZWQ6ICdsZWZ0JyxcbiAgICAgICAgbG9ja1Bvc2l0aW9uOiB0cnVlLFxuICAgICAgICBpbmNsdWRlSW5TZWFyY2g6IGZhbHNlXG4gICAgICB9O1xuICAgICAgcmV0dXJuIFtjaGVja2JveGVzQ29sdW1uLCAuLi5jb2x1bW5EZWZzXTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkRlZnM7XG4gIH1cblxuICBwcml2YXRlIGluaXRPblJvd1NlbGVjdGVkRm9yU2VydmVyU2lkZVBhZ2luYXRpb24oeyBncmlkT3B0aW9ucyB9OiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgaWYgKCF0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24oZ3JpZE9wdGlvbnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGV4dGVybmFsT25Sb3dTZWxlY3RlZCA9IGdyaWRPcHRpb25zLm9uUm93U2VsZWN0ZWQ7XG4gICAgZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZCA9IChldnQ6IFJvd1NlbGVjdGVkRXZlbnQpID0+IHtcbiAgICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBldnQubm9kZTtcbiAgICAgICAgY29uc3QgaXNTZWxlY3RlZCA9IG5vZGUuaXNTZWxlY3RlZCgpO1xuICAgICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgICAgY29uc3QgaXNFeGNsdWRlZCA9IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhub2RlLmlkKTtcbiAgICAgICAgaWYgKGlzU2VsZWN0ZWQgJiYgaXNFeGNsdWRlZCkge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oe1xuICAgICAgICAgICAgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBleGNsdWRlZEZyb21TZWxlY3RBbGwuZmlsdGVyKChub2RlSWQ6IHN0cmluZykgPT4gbm9kZUlkICE9PSBub2RlLmlkKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKCFpc1NlbGVjdGVkICYmICFpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogWy4uLmV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCwgbm9kZS5pZF0gfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChleHRlcm5hbE9uUm93U2VsZWN0ZWQpIHtcbiAgICAgICAgZXh0ZXJuYWxPblJvd1NlbGVjdGVkKGV2dCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93TWF0Y2hlc1NlYXJjaChyb3c6IFJvd05vZGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gKHRoaXMuZ3JpZFF1ZXJ5LmdldFNlYXJjaFRlcm0oKSB8fCAnJykudG9Mb3dlckNhc2UoKS50cmltKCk7XG4gICAgaWYgKGlzRW1wdHkoc2VhcmNoVGVybSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5pbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoXG4gICAgICA/IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbENvbHVtbnMoKVxuICAgICAgOiB0aGlzLmdyaWRRdWVyeS5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgZm9yIChjb25zdCBjb2wgb2YgY29sdW1ucykge1xuICAgICAgY29uc3QgY29sRGVmID0gdGhpcy5hcGkuZ3JpZC5nZXRDb2x1bW5EZWYoY29sLmdldENvbElkKCkpIGFzIERhdG9HcmlkQ29sdW1uRGVmO1xuICAgICAgaWYgKCFjb2xEZWYuaW5jbHVkZUluU2VhcmNoKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93VmFsdWUgPSAodGhpcy5hcGkuZ3JpZC5nZXRWYWx1ZShjb2wuZ2V0Q29sSWQoKSwgcm93KSB8fCAnJykudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgICAgaWYgKHJvd1ZhbHVlLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGZpdEdyaWQoJ2NvbnRhaW5lcicpIGluc3RlYWRcbiAgICovXG4gIGZpdFRvQ29udGFpbmVyKCkge1xuICAgIHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICB9XG5cbiAgZ2V0Q3VzdG9tSGVhZGVyKGZpZWxkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzKSB7XG4gICAgICBjb25zdCBzcGVjaWZpYyA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiBjb2x1bW4gPT09IGZpZWxkKTtcbiAgICAgIGNvbnN0IGNvbW1vbiA9IHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcy5maW5kKCh7IGNvbHVtbiB9KSA9PiAhY29sdW1uKTtcbiAgICAgIGlmIChzcGVjaWZpYyB8fCBjb21tb24pIHtcbiAgICAgICAgY29uc3QgeyBtb3JlTWVudSwgY3VzdG9tSGVhZGVyIH0gPSB7XG4gICAgICAgICAgbW9yZU1lbnU6IChzcGVjaWZpYyAmJiBzcGVjaWZpYy5tb3JlTWVudSkgfHwgKGNvbW1vbiAmJiBjb21tb24ubW9yZU1lbnUpLFxuICAgICAgICAgIGN1c3RvbUhlYWRlcjogKHNwZWNpZmljICYmIHNwZWNpZmljLmN1c3RvbUhlYWRlcikgfHwgKGNvbW1vbiAmJiBjb21tb24uY3VzdG9tSGVhZGVyKVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBtb3JlTWVudTogbW9yZU1lbnUgJiYgbW9yZU1lbnUudHBsLCBjdXN0b21IZWFkZXI6IGN1c3RvbUhlYWRlciAmJiBjdXN0b21IZWFkZXIudHBsIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY2xlYXJBbGxGaWx0ZXJzKCkge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MsXG4gICAgICAgICAgZmlsdGVyOiB7fSxcbiAgICAgICAgICBzZWFyY2hUZXJtOiBudWxsXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIGNsZWFyQ29sdW1uRmlsdGVyKGNvbHVtbkZpZWxkOiBzdHJpbmcpIHtcbiAgICBjb25zdCB7IFtjb2x1bW5GaWVsZF06IGRlbGV0ZWQsIC4uLmZpbHRlciB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXJcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0Q29sdW1uRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyLCBub3RpZnlHcmlkID0gdHJ1ZSkge1xuICAgIHRoaXMuX2xvZ0V2ZW50KENvcmVFdmVudFR5cGVzLkdSSURfRklMVEVSX0FQUExJRUQsIHtcbiAgICAgIGNvbHVtbjogY29sdW1uLmdldENvbElkKCksXG4gICAgICBudW1PZkNvbmRpdGlvbnM6IChmaWx0ZXIuY29uZGl0aW9uYWwgJiYgZmlsdGVyLmNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubGVuZ3RoKSB8fCAwLFxuICAgICAgYnlWYWx1ZTogISFmaWx0ZXIuYnlWYWx1ZSA/ICdZZXMnIDogJ05vJ1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVGaWx0ZXIoY29sdW1uLCBmaWx0ZXIpO1xuXG4gICAgaWYgKG5vdGlmeUdyaWQpIHtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0R3JpZEZpbHRlcnMoZmlsdGVyczogRGF0b0dyaWRFeHRlcm5hbEZpbHRlcltdKSB7XG4gICAgaWYgKHRoaXMuYXBpICYmIGZpbHRlcnMpIHtcbiAgICAgIGxldCBhcHBsaWVkRmlsdGVyID0ge307XG5cbiAgICAgIGZvciAoY29uc3QgeyBmaWx0ZXIsIGZpZWxkIH0gb2YgZmlsdGVycykge1xuICAgICAgICBhcHBsaWVkRmlsdGVyW2ZpZWxkXSA9IGZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGRhdGVTZXR0aW5ncyh7IGZpbHRlcjogYXBwbGllZEZpbHRlciB9KTtcbiAgICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgc2V0U29ydEJ5Q29sdW1uKGNvbElkLCBzb3J0KSB7XG4gICAgY29uc3Qgc29ydFRvU2V0ID0gdGhpcy5ncmlkUXVlcnkuZ2V0U29ydCh7IGNvbElkLCBzb3J0IH0pO1xuXG4gICAgdGhpcy5zZXRHcmlkU29ydChzb3J0VG9TZXQpO1xuICB9XG5cbiAgc2V0R3JpZFNvcnQoZ3JpZFNvcnQ6IERhdG9HcmlkU29ydCkge1xuICAgIGlmIChncmlkU29ydCAmJiB0aGlzLmFwaSAmJiB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCkgPiAwKSB7XG4gICAgICBjb25zdCB7IGNvbElkLCBzb3J0LCBzb3J0SW5kZXggfSA9IGdyaWRTb3J0O1xuICAgICAgY29uc3QgZ3JpZENvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldEFsbEdyaWRDb2x1bW5zKCk7XG5cbiAgICAgIGlmIChncmlkQ29sdW1ucykge1xuICAgICAgICBsZXQgc29ydFRvQXBwbHkgPSBncmlkU29ydDtcbiAgICAgICAgLyoqIFNvcnQgYnkgY29sdW1uIGlkICovXG4gICAgICAgIGNvbnN0IGNvbHVtbkJ5SWQgPSBncmlkQ29sdW1ucy5maW5kKChjb2w6IENvbHVtbikgPT4ge1xuICAgICAgICAgIHJldHVybiAoY29sLmdldENvbERlZigpLnNob3dSb3dHcm91cCB8fCBjb2wuZ2V0Q29sSWQoKSkgPT09IGNvbElkO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoY29sdW1uQnlJZCkge1xuICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJZC5nZXRDb2xJZCgpLCBzb3J0IH07XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzTmlsKHNvcnRJbmRleCkpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZUNvbHVtbnMgPSB0aGlzLmFwaS5jb2x1bW5zLmdldFZhbHVlQ29sdW1ucygpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1uID0gdmFsdWVDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiBjb2wuZ2V0Q29sSWQoKSA9PT0gY29sSWQpO1xuICAgICAgICAgIGNvbnN0IGlzUGl2b3RDb2xJZCA9IGNvbElkLnN0YXJ0c1dpdGgoJ3Bpdm90Jyk7XG5cbiAgICAgICAgICBpZiAoaXNQaXZvdENvbElkIHx8IHZhbHVlQ29sdW1uKSB7XG4gICAgICAgICAgICAvKiogQ29sdW1uIGlzIHBpdm90IHZhbHVlIGNvbHVtbiwgc29ydCBieSBpbmRleCAqL1xuICAgICAgICAgICAgY29uc3QgY29sdW1uQnlJbmRleCA9IGdyaWRDb2x1bW5zW3NvcnRJbmRleF07XG5cbiAgICAgICAgICAgIHNvcnRUb0FwcGx5ID0geyBjb2xJZDogY29sdW1uQnlJbmRleC5nZXRDb2xJZCgpLCBzb3J0LCBzb3J0SW5kZXggfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgc29ydDogc29ydFRvQXBwbHkgfSk7XG4gICAgICAgIHRoaXMuYXBpLmdyaWQuc2V0U29ydE1vZGVsKFtzb3J0VG9BcHBseV0pO1xuXG4gICAgICAgIGlmICgodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zIGFzIERhdG9HcmlkT3B0aW9ucykudXNlUGl2b3RHcmlkU3R5bGUpIHtcbiAgICAgICAgICB0aGlzLmFwaS5ncmlkLnJlZHJhd1Jvd3MoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlRmlsdGVyKGNvbHVtbjogQ29sdW1uLCBmaWx0ZXI6IERhdG9HcmlkRmlsdGVyKSB7XG4gICAgY29uc3QgY29sRmllbGQgPSBnZXRDb2xGaWVsZChjb2x1bW4uZ2V0Q29sRGVmKCkpO1xuXG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLmZpbHRlcixcbiAgICAgICAgICAgIFtjb2xGaWVsZF06IGZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIHNldFNlYXJjaFRlcm0oc2VhcmNoVGVybTogc3RyaW5nKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBzZWFyY2hUZXJtXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgfVxuXG4gIHNldFNlcnZlclNpZGVQYWdpbmF0aW9uKGNvbmZpZzogUGFydGlhbDxTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmZpZz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXJ2ZXJTaWRlUGFnaW5hdGlvbjoge1xuICAgICAgICAgIC4uLnN0YXRlLnNlcnZlclNpZGVQYWdpbmF0aW9uLFxuICAgICAgICAgIC4uLmNvbmZpZ1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0TG9hZGluZyhzaG93OiBib29sZWFuKSB7XG4gICAgaWYgKHNob3cpIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuc2hvd0xvYWRpbmdPdmVybGF5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA9PT0gMCA/IHRoaXMuc2V0T3ZlcmxheSh0cnVlKSA6IHRoaXMuc2V0T3ZlcmxheShmYWxzZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHVzZSBzZXRPdmVybGF5IGluc3RlYWRcbiAgICogQHBhcmFtIHNob3dcbiAgICovXG4gIHNldE5vRGF0YShzaG93OiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXRPdmVybGF5KHNob3cpO1xuICB9XG5cbiAgc2V0T3ZlcmxheShzaG93OiBib29sZWFuKSB7XG4gICAgc2hvdyA/IHRoaXMuYXBpLmdyaWQuc2hvd05vUm93c092ZXJsYXkoKSA6IHRoaXMuYXBpLmdyaWQuaGlkZU92ZXJsYXkoKTtcbiAgfVxuXG4gIHVwZGF0ZVNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICAuLi5zZXR0aW5nc1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgZml0R3JpZCh0bzogJ2NvbnRhaW5lcicgfCAnY29udGVudCcpIHtcbiAgICB0byA9PT0gJ2NvbnRhaW5lcicgPyB0aGlzLmFwaS5ncmlkLnNpemVDb2x1bW5zVG9GaXQoKSA6IHRoaXMuYXBpLmNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IHRvID09PSAnY29udGFpbmVyJyA/IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05UQUlORVIgOiBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVDtcbiAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZ3JpZEFsaWdubWVudCwgY29sdW1uc1NpemVzOiBudWxsIH0pO1xuICB9XG5cbiAgc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICBjb25zdCBpc0dsb2JhbCA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuaXNHbG9iYWxTZXR0aW5ncztcbiAgICB0aGlzLnN0b3JhZ2VBUEkuc2V0KHRoaXMuZ3JpZE5hbWUsIHNldHRpbmdzLCBpc0dsb2JhbCk7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsIHVzZWQgdG8gbG9nIGdyaWQgZXZlbnRzIHRvIHRoZSBwbGF0Zm9ybSdzIGxvZ2dpbmcgc2VydmljZVxuICAgKi9cbiAgX2xvZ0V2ZW50KGV2ZW50VHlwZTogQ29yZUV2ZW50VHlwZXMsIGV2ZW50UHJvcGVydGllcz86IEhhc2hNYXA8YW55Pikge1xuICAgIHRoaXMubG9nZ2VyLmxvZ0V2ZW50KGV2ZW50VHlwZSwgeyB0YWJsZTogdGhpcy5ncmlkTmFtZSwgLi4uZXZlbnRQcm9wZXJ0aWVzIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwU3VjY2Vzc0NhbGxiYWNrKHsgc3VjY2Vzc0NiLCBwYWdlTnVtYmVyLCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgfTogU3VjY2Vzc1dyYXBwZXJQYXJhbXMpIHtcbiAgICByZXR1cm4gKHJvd3NUaGlzQmxvY2s6IGFueVtdLCB0b3RhbFJvd3M6IG51bWJlcikgPT4ge1xuICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IHRvdGFsUm93cywgaGFzRXJyb3I6IGZhbHNlIH0pO1xuICAgICAgc3VjY2Vzc0NiKHJvd3NUaGlzQmxvY2ssIHRvdGFsUm93cyk7XG4gICAgICB0aGlzLmdyaWRRdWVyeS5fc2VydmVyRGF0YUxvYWRlZC5uZXh0KHtcbiAgICAgICAgYXBpOiB0aGlzLmFwaS5ncmlkLFxuICAgICAgICBjb2x1bW5BcGk6IHRoaXMuYXBpLmNvbHVtbnMsXG4gICAgICAgIHR5cGU6ICdTZXJ2ZXJEYXRhTG9hZGVkJyxcbiAgICAgICAgcGFnaW5hdGlvblBhZ2U6IHBhZ2VOdW1iZXJcbiAgICAgIH0pO1xuICAgICAgaWYgKCFpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgdGhpcy5zZXRMb2FkaW5nKGZhbHNlKTtcbiAgICAgICAgLyoqIHNvIHRoZSBncmlkIGZpdHMgaW4gZXZlcnkgbmV3IGRhdGEgaW5wdXQgKi9cbiAgICAgICAgdHJpZ2dlcldpbmRvd1Jlc2l6ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5sYXN0VG90YWxSb3dzID0gdG90YWxSb3dzO1xuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHdyYXBHZXRSb3dzKG9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucywgZ2V0Um93cz86IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCkge1xuICAgIGNvbnN0IGdldFJvd3NDYiA9IGdldFJvd3MgfHwgb3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3M7XG4gICAgcmV0dXJuIChnZXRSb3dzUGFyYW1zOiBJR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgY29uc3QgeyBzdGFydFJvdywgZW5kUm93LCBzb3J0TW9kZWwsIHN1Y2Nlc3NDYWxsYmFjayB9ID0gZ2V0Um93c1BhcmFtcztcbiAgICAgIGNvbnN0IHBhZ2VTaXplID0gb3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemUgfHwgMTAwO1xuICAgICAgY29uc3QgaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgPSB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA+IDA7XG4gICAgICBjb25zdCBpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZCAmJiBzdGFydFJvdyA9PT0gMDtcblxuICAgICAgY29uc3QgcGFnZU51bWJlciA9IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkXG4gICAgICAgID8gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggKyAxXG4gICAgICAgIDogTWF0aC5jZWlsKGVuZFJvdyAvIHBhZ2VTaXplKTtcblxuICAgICAgdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPSAtMTtcblxuICAgICAgY29uc3QgZmlsdGVyID0gdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCk7XG4gICAgICBjb25zdCBuZXdQYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcyA9IHtcbiAgICAgICAgLi4uZ2V0Um93c1BhcmFtcyxcbiAgICAgICAgZmFpbENhbGxiYWNrOiAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGhhc0Vycm9yOiB0cnVlIH0pO1xuICAgICAgICAgIHRoaXMuc2V0T3ZlcmxheSh0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgc3VjY2Vzc0NhbGxiYWNrOiB0aGlzLndyYXBTdWNjZXNzQ2FsbGJhY2soeyBwYWdlTnVtYmVyLCBzdWNjZXNzQ2I6IHN1Y2Nlc3NDYWxsYmFjaywgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH0pLFxuICAgICAgICBzZXJ2ZXJDb25maWc6IHtcbiAgICAgICAgICBwYWdlU2l6ZSxcbiAgICAgICAgICBwYWdlTnVtYmVyLFxuICAgICAgICAgIGNvbHVtbkZpbHRlcnM6IGlzRW1wdHkoZmlsdGVyKSB8fCBvcHRpb25zLmVuYWJsZVYyXzEgPyBudWxsIDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlciksXG4gICAgICAgICAgZmlsdGVyOiBvcHRpb25zLmVuYWJsZVYyXzEgPyB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShvcHRpb25zLmNvbHVtbkRlZnMpIDogbnVsbCxcbiAgICAgICAgICBzb3J0OiB0aGlzLmJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsKVxuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgaWYgKGlzUGVuZGluZ1JldHVyblRvUGFnZSkge1xuICAgICAgICAvLyBTY2VuYXJpbyB0aGUgZm9sbG93aW5nIGhhbmRsZXMgLSBzZXJ2ZXIgcmVmcmVzaCB3aGVyZSBpdCB3YXMgcmVxdWVzdGVkIHRvIGtlZXAgdGhlIGN1cnJlbnQgcGFnZS5cbiAgICAgICAgLy8gVGhlIHByb2JsZW0gLSBnZXRSb3dzIHdpbGwgaW5pdGlhbGx5IGJlIGNhbGxlZCBmb3IgcGFnZSAxIChhdXRvbWF0aWNhbGx5IGhhcHBlbnMgd2hlbiBjYWxsaW5nIGFnLWdyaWQncyBzZXREYXRhU291cmNlKS5cbiAgICAgICAgLy8gSW4gb3JkZXIgdG8gdHJpZ2dlciBpdCBhZ2Fpbiwgc3VjY2Vzc0NhbGxiYWNrIGlzIGNhbGxlZCB3aXRoIHRoZSBkZXNpcmVkIHBhZ2UuXG4gICAgICAgIC8vIGZha2VHZXRSb3dzIGlzIHVzZWQgaW4gb3JkZXIgdG8gYXZvaWQgcmV0cmlldmluZyB0aGUgdW5uZWNlc3NhcnkgcmVhbCBkYXRhIGZvciBwYWdlIDEuXG4gICAgICAgIGNvbnN0IGZha2VHZXRSb3dzID0gKHsgc3VjY2Vzc0NhbGxiYWNrIH06IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4ge1xuICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhbXSwgdGhpcy5sYXN0VG90YWxSb3dzKTtcbiAgICAgICAgfTtcbiAgICAgICAgZmFrZUdldFJvd3MobmV3UGFyYW1zKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGdldFJvd3NDYihuZXdQYXJhbXMpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGluaXRFZGl0YWJsZUNvbHVtbnNDZWxsQ2xhc3MocGFyYW1zOiBOb3JtYWxpemVPcHRpb25zUGFyYW1zKSB7XG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmNvbHVtbkRlZnMuZm9yRWFjaChjb2xEZWYgPT4ge1xuICAgICAgaWYgKGNvbERlZi5lZGl0YWJsZSkge1xuICAgICAgICBpZiAoaXNGdW5jdGlvbihjb2xEZWYuZWRpdGFibGUpKSB7XG4gICAgICAgICAgY29uc3QgaW5pdGlhbENlbGxDbGFzcyA9IGNvbERlZi5jZWxsQ2xhc3M7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9IChjb2xEZWYuZWRpdGFibGUgYXMgRnVuY3Rpb24pKGNlbGxDbGFzc1BhcmFtcyBhcyBhbnkpO1xuICAgICAgICAgICAgaWYgKGlzRWRpdGFibGUpIHtcbiAgICAgICAgICAgICAgY29uc3QgZWRpdGFibGVSZXN1bHQgPSB0aGlzLmFkZEVkaXRhYmxlQ2VsbENsYXNzKGluaXRpYWxDZWxsQ2xhc3MpO1xuICAgICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihlZGl0YWJsZVJlc3VsdCkgPyBlZGl0YWJsZVJlc3VsdChjZWxsQ2xhc3NQYXJhbXMpIDogZWRpdGFibGVSZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaXNGdW5jdGlvbihpbml0aWFsQ2VsbENsYXNzKSA/IGluaXRpYWxDZWxsQ2xhc3MoY2VsbENsYXNzUGFyYW1zKSA6IGluaXRpYWxDZWxsQ2xhc3M7XG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2xEZWYuY2VsbENsYXNzID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhjb2xEZWYuY2VsbENsYXNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwQ29udGV4dE1lbnVCdWlsZGVyKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIGNvbnN0IHsgY3VzdG9tQ29udGV4dE1lbnUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBjb25zdCBhbGxBY3Rpb25zID0gaXNGdW5jdGlvbihjdXN0b21Db250ZXh0TWVudSkgPyBjdXN0b21Db250ZXh0TWVudShwYXJhbXMucm93QWN0aW9ucykgOiBwYXJhbXMucm93QWN0aW9ucztcbiAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhbGxBY3Rpb25zKTtcbiAgICBjb25zdCBjb3B5QWN0aW9uOiBSb3dBY3Rpb24gPSB7XG4gICAgICBsYWJlbDogdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLmNvcHktY2VsbCcpLFxuICAgICAgaWNvbjogJ2NvcHknLFxuICAgICAga2V5OiAnQ29weSBDZWxsJ1xuICAgIH07XG4gICAgcmV0dXJuICh7IG5vZGUsIGNvbHVtbiwgY29udGV4dCB9OiBHZXRDb250ZXh0TWVudUl0ZW1zUGFyYW1zKSA9PiB7XG4gICAgICBjb25zdCBvbkhvdmVyQWN0aW9uTWVudSA9IGNvbnRleHQgJiYgY29udGV4dC5jb250ZXh0TWVudSAmJiBjb250ZXh0LmNvbnRleHRNZW51LmZyb21PbkhvdmVyO1xuICAgICAgaWYgKCFub2RlKSByZXR1cm4gW107XG4gICAgICBsZXQgc2VsZWN0ZWQgPSBbbm9kZV07XG4gICAgICBsZXQgcm93c0NvdW50ID0gMTtcbiAgICAgIGlmIChvbkhvdmVyQWN0aW9uTWVudSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUdyaWRDb250ZXh0KHsgY29udGV4dE1lbnU6IHsgZnJvbU9uSG92ZXI6IGZhbHNlIH0gfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb3B5QWN0aW9uLm9uQ2xpY2sgPSAoW3Jvd10pID0+IHtcbiAgICAgICAgICBjb25zdCByYXdWYWx1ZSA9IHRoaXMuYXBpLmdyaWQuZ2V0VmFsdWUoY29sdW1uLmdldENvbElkKCksIHJvdyk7XG4gICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gY29sdW1uLmdldENvbERlZigpLnZhbHVlRm9ybWF0dGVyO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZm9ybWF0dGVyID8gZm9ybWF0dGVyKHJhd1ZhbHVlKSA6IHJhd1ZhbHVlO1xuICAgICAgICAgIGNvcHlUb0NsaXBib2FyZCh2YWx1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGlmIChub2RlLmlzU2VsZWN0ZWQoKSkge1xuICAgICAgICAgIHNlbGVjdGVkID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VsZWN0ZWRSb3dOb2RlcygpO1xuICAgICAgICAgIHJvd3NDb3VudCA9IHNpemUoc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCB2aXNpYmxlQWN0aW9ucyA9IGdldFZpc2libGVBY3Rpb25zKFxuICAgICAgICBhbGxBY3Rpb25zLFxuICAgICAgICByb3dzQ291bnQsXG4gICAgICAgIHNlbGVjdGVkLFxuICAgICAgICB0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkXG4gICAgICApLmZpbHRlcigoeyB2aXNpYmxlIH0pID0+IHZpc2libGUpO1xuICAgICAgbGV0IHRvb2xiYXJBY3Rpb25zID0gW2NvcHlBY3Rpb25dO1xuICAgICAgaWYgKG9uSG92ZXJBY3Rpb25NZW51KSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zID0gdmlzaWJsZUFjdGlvbnM7XG4gICAgICB9IGVsc2UgaWYgKHZpc2libGVBY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSBbeyAuLi5jb3B5QWN0aW9uLCBzZXBhcmF0b3I6IHRydWUgfSwgLi4udmlzaWJsZUFjdGlvbnNdO1xuICAgICAgfVxuICAgICAgY29uc3QgY29udmVydGVyUGFyYW1zOiBBY3Rpb25Db252ZXJ0ZXJQYXJhbXMgPSB7XG4gICAgICAgIHRvb2xiYXJBY3Rpb25zLFxuICAgICAgICBzZWxlY3RlZFJvd3M6IHNlbGVjdGVkLFxuICAgICAgICBpY29uUmVnaXN0cnk6IHRoaXMuc3ZnUmVnaXN0cnksXG4gICAgICAgIG5vZGUsXG4gICAgICAgIGxvZ2dlcjoge1xuICAgICAgICAgIGxvZzogdGhpcy5fbG9nRXZlbnQuYmluZCh0aGlzKSxcbiAgICAgICAgICBldmVudE9yaWdpbjogb25Ib3ZlckFjdGlvbk1lbnUgPyAnT24gSG92ZXInIDogJ0NvbnRleHQgTWVudSdcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uKGNvbnZlcnRlclBhcmFtcyk7XG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFsbEFjdGlvbnM6IFJvd0FjdGlvbltdKSB7XG4gICAgYWxsQWN0aW9ucy5mb3JFYWNoKGFjdGlvbiA9PiB7XG4gICAgICBhY3Rpb24ubGFiZWwgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oYWN0aW9uLmxhYmVsKTtcbiAgICAgIGlmIChhY3Rpb24uc3ViTWVudSkge1xuICAgICAgICB0aGlzLnRyYW5zbGF0ZUFjdGlvbkxhYmVscyhhY3Rpb24uc3ViTWVudSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBsb2FkU2F2ZWRTZXR0aW5ncyhzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIGNvbnN0IHtcbiAgICAgIHNvcnQsXG4gICAgICBoaWRkZW5Db2x1bW5zLFxuICAgICAgZmlsdGVyLFxuICAgICAgZ3JvdXBlZENvbHVtbnMsXG4gICAgICBjb2x1bW5zU2l6ZXMsXG4gICAgICBwaW5uZWRDb2x1bW5zLFxuICAgICAgY29sdW1uc09yZGVyLFxuICAgICAgZ3JpZEFsaWdubWVudFxuICAgIH0gPSBzZXR0aW5ncztcbiAgICBjb25zdCB7IGdyaWQsIGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIC8qIEhpZGUgY29sdW1ucyAqL1xuICAgIC8qIE5PVEU6IGNvbHVtbnMgb3JkZXIgYXJlIHRyZWF0ZWQgYXMgdGhlIGN1cnJlbnRseSB2aXNpYmxlIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHRoaXMuaW5pdGlhbFNldHRpbmdzLmNvbHVtbnNPcmRlciwgdHJ1ZSk7XG4gICAgY29uc3QgY29sdW1uVG9IaWRlID0gIWlzTmlsKGhpZGRlbkNvbHVtbnMpID8gaGlkZGVuQ29sdW1ucyA6IHRoaXMuaW5pdGlhbFNldHRpbmdzLmhpZGRlbkNvbHVtbnM7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShjb2x1bW5Ub0hpZGUsIGZhbHNlKTtcblxuICAgIC8qIEFwcGx5IGZpbHRlcnMgKi9cbiAgICBpZiAoZmlsdGVyKSB7XG4gICAgICBncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICAgIH1cblxuICAgIC8qIEdyb3VwIGNvbHVtbnMgKi9cbiAgICBjb25zdCBhbGxHcm91cGVkQ29sdW1ucyA9IGNvbHVtbnMuZ2V0Um93R3JvdXBDb2x1bW5zKCk7XG4gICAgbGV0IHJlbW92ZUdyb3VwZWQ7XG4gICAgaWYgKGdyb3VwZWRDb2x1bW5zKSB7XG4gICAgICByZW1vdmVHcm91cGVkID0gYWxsR3JvdXBlZENvbHVtbnMuZmlsdGVyKGNvbCA9PiAhZ3JvdXBlZENvbHVtbnMuaW5jbHVkZXMoY29sLmdldENvbElkKCkpKTtcbiAgICAgIGNvbHVtbnMuYWRkUm93R3JvdXBDb2x1bW5zKGdyb3VwZWRDb2x1bW5zKTtcbiAgICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUoZ3JvdXBlZENvbHVtbnMsIGZhbHNlKTtcbiAgICB9XG4gICAgY29sdW1ucy5yZW1vdmVSb3dHcm91cENvbHVtbnMocmVtb3ZlR3JvdXBlZCk7XG4gICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShyZW1vdmVHcm91cGVkLCB0cnVlKTtcblxuICAgIC8qIEFwcGx5IHNvcnQgKi9cbiAgICBjb25zdCBncmlkU29ydCA9IHNvcnQgfHwgdGhpcy5pbml0aWFsU2V0dGluZ3Muc29ydDtcbiAgICBncmlkLnNldFNvcnRNb2RlbChncmlkU29ydCA/IFtncmlkU29ydF0gOiBudWxsKTtcblxuICAgIC8qIEFsaWduIGdyaWQgKi9cbiAgICBpZiAoZ3JpZEFsaWdubWVudCA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuQ1VTVE9NKSB7XG4gICAgICAvKiBTZXQgY29sdW1uIHNpemVzICovXG4gICAgICBjb2x1bW5zU2l6ZXMgJiZcbiAgICAgICAgT2JqZWN0LmtleXMoY29sdW1uc1NpemVzKS5mb3JFYWNoKGNvbElkID0+IHtcbiAgICAgICAgICBpZiAoY29sdW1uc1NpemVzW2NvbElkXSA9PT0gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRFTlQpIHtcbiAgICAgICAgICAgIGNvbHVtbnMuYXV0b1NpemVDb2x1bW4oY29sSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb2x1bW5zLnNldENvbHVtbldpZHRoKGNvbElkLCBjb2x1bW5zU2l6ZXNbY29sSWRdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCA/IGNvbHVtbnMuYXV0b1NpemVBbGxDb2x1bW5zKCkgOiBncmlkLnNpemVDb2x1bW5zVG9GaXQoKTtcbiAgICB9XG5cbiAgICAvKiBQaW4gY29sdW1ucyBsZWZ0ICovXG4gICAgY29uc3QgZmlsdGVyZWRQaW5uZWRDb2x1bW5zID0gcGlubmVkQ29sdW1uc1xuICAgICAgPyBwaW5uZWRDb2x1bW5zLmZpbHRlcigoY29sOiBzdHJpbmcpID0+IGNvbCAhPT0gdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEKVxuICAgICAgOiBudWxsO1xuICAgIGNvbnN0IGZpbHRlcmVkQ29sdW1ucyA9IGNvbHVtbnNPcmRlclxuICAgICAgPyBjb2x1bW5zT3JkZXIuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgc2l6ZShmaWx0ZXJlZFBpbm5lZENvbHVtbnMpID4gMFxuICAgICAgPyBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRQaW5uZWRDb2x1bW5zLCAnbGVmdCcpXG4gICAgICA6IGZpbHRlcmVkQ29sdW1ucyAmJiBjb2x1bW5zLnNldENvbHVtbnNQaW5uZWQoZmlsdGVyZWRDb2x1bW5zLCBudWxsKTtcblxuICAgIC8qIE9yZGVyIGNvbHVtbnMgKi9cbiAgICBjb2x1bW5zT3JkZXIgJiYgY29sdW1ucy5tb3ZlQ29sdW1ucyhjb2x1bW5zT3JkZXIsIDApO1xuICB9XG5cbiAgZ2V0U2V0dGluZ3NEaWZmKCk6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4ge1xuICAgIGNvbnN0IGN1cnJlbnRTdGF0ZSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRHcmlkU2V0dGluZ3MoKTtcbiAgICByZXR1cm4gZGlmZihjdXJyZW50U3RhdGUsIHRoaXMuaW5pdGlhbFNldHRpbmdzKTtcbiAgfVxuXG4gIHJlc2V0VGFibGVTZXR0aW5ncygpIHtcbiAgICBjb25zdCB7IGZpbHRlciwgLi4ucmVzdCB9ID0gdGhpcy5pbml0aWFsU2V0dGluZ3M7XG4gICAgY29uc3QgeyBjb2x1bW5zIH0gPSB0aGlzLmFwaTtcbiAgICBjb25zdCBvcmlnaW5hbENvbFNpemVzID0gZ2V0Q29sdW1uc1NpemVzKGNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKSwgdHJ1ZSk7XG4gICAgY29uc3QgZ3JpZEFsaWdubWVudCA9IGlzRW1wdHkob3JpZ2luYWxDb2xTaXplcykgPyByZXN0LmdyaWRBbGlnbm1lbnQgOiBEYXRvR3JpZEFsaWdubWVudC5DVVNUT007XG4gICAgY29uc3QgbmV3U2V0dGluZ3MgPSB7IC4uLnJlc3QsIGNvbHVtbnNTaXplczogb3JpZ2luYWxDb2xTaXplcywgZ3JpZEFsaWdubWVudCB9O1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMubG9hZFNhdmVkU2V0dGluZ3MobmV3U2V0dGluZ3MpO1xuICAgIHRoaXMuc2F2ZVNldHRpbmdzVG9TZXJ2ZXIoeyBmaWx0ZXIgfSk7XG4gIH1cblxuICBpbml0U2V0dGluZ3Moc2F2ZWRTZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuaW5pdGlhbFNldHRpbmdzID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3Moc2F2ZWRTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgfVxuXG4gIG5vdGlmeUZpbHRlclVwZGF0ZSgpIHtcbiAgICBjb25zdCB3YXRjaCA9IFt0aGlzLmdyaWRSZWYuZmlsdGVyQ2hhbmdlZC5hc09ic2VydmFibGUoKV07XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2lkZSkge1xuICAgICAgd2F0Y2gucHVzaCh0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJEYXRhTG9hZGVkJCk7XG4gICAgICB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgfVxuICAgIGNvbWJpbmVMYXRlc3Qod2F0Y2gpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgdW50aWxEZXN0cm95ZWQodGhpcylcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICBjb25zdCByb3dzQWZ0ZXJGaWx0ZXIgPSB0aGlzLmFwaS5ncmlkLmdldERpc3BsYXllZFJvd0NvdW50KCk7XG4gICAgICAgIHRoaXMuc2V0T3ZlcmxheShyb3dzQWZ0ZXJGaWx0ZXIgPT09IDApO1xuICAgICAgfSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5vbkZpbHRlckNoYW5nZWQoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyB7XG4gICAgY29uc3QgY29sdW1uc0ZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyA9IHt9O1xuICAgIGZvciAoY29uc3QgW2NvbHVtbiwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGZpbHRlcikpIHtcbiAgICAgIGNvbnN0IHsgYnlWYWx1ZSwgY29uZGl0aW9uYWwgfSA9IHZhbHVlO1xuICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW2J5VmFsdWVdXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IGNvbmRpdGlvbmFsLm9wZXJhdG9yLFxuICAgICAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSU5fUkFOR0UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICAgICAgc3RhcnQ6IHZhbHVlLFxuICAgICAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmRcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtIGFzIERhdG9HcmlkRmlsdGVyQ29uZGl0aW9uO1xuICAgICAgICAgIH0pXG4gICAgICAgIH07XG4gICAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXS5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbnNGaWx0ZXJzW2NvbHVtbl0gPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb2x1bW5zRmlsdGVycztcbiAgfVxuXG4gIGJ1aWxkU2VydmVyUmVxdWVzdEZpbHRlcnNfdjJfMShncmlkQ29sdW1uczogRGF0b0dyaWRDb2x1bW5EZWZbXSk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyIHtcbiAgICBjb25zdCBmaWx0ZXIgPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICBjb25zdCBzZWFyY2hUZXJtID0gdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpO1xuXG4gICAgbGV0IGNvbHVtbkZpbHRlcnMgPSB0aGlzLmJ1aWxkU2VydmVyQ29sdW1uRmlsdGVyc192Ml8xKGZpbHRlcik7XG4gICAgaWYgKGNvbHVtbkZpbHRlcnMuZXZlcnkoKHsgb3BlcmF0b3IgfTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIpID0+IG9wZXJhdG9yID09PSBPcGVyYXRvclR5cGVzLkFORCkpIHtcbiAgICAgIGNvbnN0IGZsYXR0ZW5lZEZpbHRlcnMgPSBjb2x1bW5GaWx0ZXJzXG4gICAgICAgIC5tYXAoKHsgZmlsdGVycyB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gZmlsdGVycylcbiAgICAgICAgLnJlZHVjZSgoYXJyLCByZXMpID0+IHJlcy5jb25jYXQoYXJyKSwgW10pO1xuICAgICAgY29sdW1uRmlsdGVycyA9IFtcbiAgICAgICAge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBmbGF0dGVuZWRGaWx0ZXJzXG4gICAgICAgIH1cbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShjb2x1bW5GaWx0ZXJzKSA+IDFcbiAgICAgICAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogY29sdW1uRmlsdGVycyB9XG4gICAgICAgIDogc2l6ZShjb2x1bW5GaWx0ZXJzKSA9PT0gMVxuICAgICAgICA/IGNvbHVtbkZpbHRlcnNbMF1cbiAgICAgICAgOiBudWxsO1xuICAgIGlmICghc2VhcmNoVGVybSkge1xuICAgICAgcmV0dXJuIGNvbHVtbkZpbHRlcjtcbiAgICB9XG4gICAgY29uc3QgeyBpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpO1xuICAgIGNvbnN0IHNlYXJjaGFibGVDb2x1bW5zID0gZ3JpZENvbHVtbnMuZmlsdGVyKChjb2xEZWY6IERhdG9HcmlkQ29sdW1uRGVmKSA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjb2xEZWYuaW5jbHVkZUluU2VhcmNoICYmIChpbmNsdWRlSGlkZGVuQ29sdW1uc0luU2VhcmNoIHx8IHRoaXMuYXBpLmNvbHVtbnMuZ2V0Q29sdW1uKGNvbERlZi5jb2xJZCkuaXNWaXNpYmxlKCkpXG4gICAgICApO1xuICAgIH0pO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcnM6IFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZGl0aW9uW10gPSBzZWFyY2hhYmxlQ29sdW1ucy5tYXAoKHsgZmllbGQgfTogRGF0b0dyaWRDb2x1bW5EZWYpID0+ICh7XG4gICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLkNPTlRBSU5TLFxuICAgICAgdmFsdWU6IHNlYXJjaFRlcm0sXG4gICAgICBjb2x1bW46IGZpZWxkXG4gICAgfSkpO1xuICAgIGNvbnN0IHNlYXJjaEZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPVxuICAgICAgc2l6ZShzZWFyY2hGaWx0ZXJzKSA+IDAgPyB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLk9SLCBmaWx0ZXJzOiBzZWFyY2hGaWx0ZXJzIH0gOiBudWxsO1xuICAgIGlmICghY29sdW1uRmlsdGVyKSB7XG4gICAgICByZXR1cm4gc2VhcmNoRmlsdGVyO1xuICAgIH1cbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnM6IFtjb2x1bW5GaWx0ZXIsIHNlYXJjaEZpbHRlcl0gfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyOiBEYXRvR3JpZEZpbHRlcnNNYXApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdIHtcbiAgICBsZXQgY29sdW1uRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgbGV0IGNvbHVtbkZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIgPSBudWxsO1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5GaWx0ZXIgPSB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IFt7IGNvbHVtbiwgLi4uYnlWYWx1ZSB9XVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgaWYgKGNvbmRpdGlvbmFsKSB7XG4gICAgICAgIGNvbnN0IGNvbmRpdGlvbmFsRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IHRoaXMuZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoY29uZGl0aW9uYWwsIGNvbHVtbik7XG4gICAgICAgIGlmIChjb2x1bW5GaWx0ZXIpIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIuZmlsdGVycy5wdXNoKGNvbmRpdGlvbmFsRmlsdGVyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb2x1bW5GaWx0ZXIgPSBjb25kaXRpb25hbEZpbHRlcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29sdW1uRmlsdGVycy5wdXNoKGNvbHVtbkZpbHRlcik7XG4gICAgfVxuICAgIHJldHVybiBjb2x1bW5GaWx0ZXJzO1xuICB9XG5cbiAgZ2V0RmlsdGVyRm9yU2VydmVyQWN0aW9uT25TZWxlY3RBbGwoKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgIGNvbnN0IHsgY29sdW1uRGVmcywgaWRDb2x1bW5LZXkgfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3QgbWFpbkZpbHRlciA9IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGNvbHVtbkRlZnMpO1xuICAgIGlmIChpc0VtcHR5KGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCkpIHtcbiAgICAgIHJldHVybiBtYWluRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCBleGNsdWRlZFJvd3NGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uTGlzdENvbmRpdGlvbiA9IHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0lOX0xJU1QsXG4gICAgICB2YWx1ZXM6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCxcbiAgICAgIGNvbHVtbjogaWRDb2x1bW5LZXlcbiAgICB9O1xuICAgIGNvbnN0IGZpbHRlcnMgPSBtYWluRmlsdGVyID8gW21haW5GaWx0ZXIsIGV4Y2x1ZGVkUm93c0ZpbHRlcl0gOiBbZXhjbHVkZWRSb3dzRmlsdGVyXTtcbiAgICByZXR1cm4geyBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsIGZpbHRlcnMgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0U2VydmVyQ29uZGl0aW9uYWxGaWx0ZXIoXG4gICAgY29uZGl0aW9uYWxGaWx0ZXI6IERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gICAgY29sdW1uOiBzdHJpbmdcbiAgKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIHJldHVybiB7XG4gICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWxGaWx0ZXIub3BlcmF0b3IsXG4gICAgICBmaWx0ZXJzOiBjb25kaXRpb25hbEZpbHRlci5jb25kaXRpb25zLm1hcChpdGVtID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25kaXRpb24sIHZhbHVlIH0gPSBpdGVtO1xuICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb24sXG4gICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICBlbmQ6IChpdGVtIGFzIERhdG9HcmlkUmFuZ2VGaWx0ZXJDb25kaXRpb24pLnJhbmdlRW5kLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZIHx8IGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuTk9UX0VNUFRZKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFksXG4gICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSA/ICd0cnVlJyA6ICdmYWxzZScsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfTlVMTCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb25kaXRpb246IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwsXG4gICAgICAgICAgICB2YWx1ZTogY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19OVUxMID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgLi4uaXRlbSwgY29sdW1uIH0gYXMgU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb247XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkU2VydmVyUmVxdWVzdFNvcnQoc29ydE1vZGVsOiBEYXRvR3JpZFNvcnRbXSk6IERhdG9HcmlkU2VydmVyU29ydFtdIHtcbiAgICByZXR1cm4gc29ydE1vZGVsLm1hcCgoeyBjb2xJZCwgc29ydCB9KSA9PiAoe1xuICAgICAgY29sdW1uOiBjb2xJZCxcbiAgICAgIHNvcnRPcmRlcjogc29ydC50b1VwcGVyQ2FzZSgpIGFzIERhdG9HcmlkU2VydmVyU29ydERpcmVjdGlvblxuICAgIH0pKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRWRpdGFibGVDZWxsQ2xhc3MoXG4gICAgY2VsbENsYXNzVmFsdWU6IHN0cmluZyB8IHN0cmluZ1tdIHwgKChjZWxsQ2xhc3NQYXJhbXM6IENlbGxDbGFzc1BhcmFtcykgPT4gc3RyaW5nIHwgc3RyaW5nW10pXG4gICkge1xuICAgIGlmIChpc05pbChjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiAnZGF0by1lZGl0YWJsZS1jZWxsJztcbiAgICB9IGVsc2UgaWYgKGlzRnVuY3Rpb24oY2VsbENsYXNzVmFsdWUpKSB7XG4gICAgICByZXR1cm4gY2VsbENsYXNzUGFyYW1zID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKGNlbGxDbGFzc1BhcmFtcykpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZ2V0RWRpdGFibGVDbGFzc0FycmF5KGNlbGxDbGFzc1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RWRpdGFibGVDbGFzc0FycmF5KGN1cnJlbnRDbGFzczogc3RyaW5nIHwgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgY29uc3QgY2VsbENsYXNzID0gY29lcmNlQXJyYXkoY3VycmVudENsYXNzKTtcbiAgICBjZWxsQ2xhc3MucHVzaCgnZGF0by1lZGl0YWJsZS1jZWxsJyk7XG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHNlbGVjdEFsbEN1cnJlbnRQYWdlUm93cyhpc1NlbGVjdGVkID0gdHJ1ZSwgY29uc2lkZXJFeGNsdWRlZCA9IGZhbHNlKSB7XG4gICAgbGV0IHJvd3NGb3JTZWxlY3Rpb24gPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50UGFnZVJvd3MoKTtcbiAgICBpZiAoY29uc2lkZXJFeGNsdWRlZCkge1xuICAgICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgICBpZiAoIWlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgICByb3dzRm9yU2VsZWN0aW9uID0gcm93c0ZvclNlbGVjdGlvbi5maWx0ZXIoKHsgaWQgfTogUm93Tm9kZSkgPT4gIWV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5pbmNsdWRlcyhpZCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpc1NlbGVjdGVkID8gdGhpcy5zZWxlY3RSb3dzKHJvd3NGb3JTZWxlY3Rpb24pIDogdGhpcy5kZXNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbik7XG4gIH1cblxuICBkZXNlbGVjdEFsbFJvd3MoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5kZXNlbGVjdEFsbCgpO1xuICAgIGlmICh0aGlzLmdyaWRRdWVyeS5pc1NlcnZlclNlbGVjdEFsbFJvd3NFbmFibGVkKSB7XG4gICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgc2VsZWN0QWxsUm93c0VuYWJsZWQ6IGZhbHNlLCBleGNsdWRlZEZyb21TZWxlY3RBbGw6IFtdIH0pO1xuICAgIH1cbiAgfVxuXG4gIHJlc29sdmVSb3dBY3Rpb25zVmlzaWJpbGl0eSgpIHtcbiAgICB0aGlzLmdyaWRRdWVyeS5fcm93QWN0aW9uVmlzaWJpbGl0eUNoYW5nZWQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZW4gcGl2b3RpbmcsXG4gICAqIHdlIGFkZCB0aGUgZmllbGQgbmFtZSB0byB0aGUgY29sdW1uIGhlYWRlciBjbGFzcyBpbiBvcmRlciB0byBhY2Nlc3MgaXQgdGhyb3VnaCB0aGUgYXV0byBnZW5lcmF0ZWQgcGl2b3QgY29sdW1uLlxuICAgKi9cbiAgcHJpdmF0ZSBpbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2Vzcyh7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICAvKiogVXNlIHByb2Nlc3NQaXZvdFJlc3VsdENvbERlZiBmcm9tIHZlciAyOCAqL1xuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xEZWYgPSBjb2xEZWYgPT4ge1xuICAgICAgY29uc3QgdXNlclByb3ZpZGVkQ29sRGVmID0gY29sRGVmLnBpdm90VmFsdWVDb2x1bW4gJiYgY29sRGVmLnBpdm90VmFsdWVDb2x1bW4uZ2V0VXNlclByb3ZpZGVkQ29sRGVmKCk7XG5cbiAgICAgIGlmICh1c2VyUHJvdmlkZWRDb2xEZWYpIHtcbiAgICAgICAgY29sRGVmLmZpbHRlciA9IHVzZXJQcm92aWRlZENvbERlZi5maWx0ZXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChjb2xEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbERlZi5waXZvdEtleXMgPSBjb2xEZWYucGl2b3RLZXlzLm1hcChrZXkgPT4ge1xuICAgICAgICAgIGNvbnN0IHBhcnNlZEtleSA9IHRyeVBhcnNlUGl2b3RWYWx1ZShrZXkpO1xuXG4gICAgICAgICAgcmV0dXJuIChwYXJzZWRLZXkgJiYgcGFyc2VkS2V5LnZhbHVlKSB8fCAnJztcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sR3JvdXBEZSBmcm9tIHZlciAyOCAqL1xuICAgIGdyaWRPcHRpb25zLnByb2Nlc3NTZWNvbmRhcnlDb2xHcm91cERlZiA9IChjb2xHcm91cERlZjogQ29sR3JvdXBEZWYpID0+IHtcbiAgICAgIGlmIChjb2xHcm91cERlZi5oZWFkZXJOYW1lKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFZhbHVlID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpO1xuXG4gICAgICAgIGlmIChwYXJzZWRWYWx1ZSkge1xuICAgICAgICAgIGNvbnN0IHsgZmllbGQsIHZhbHVlIH0gPSBwYXJzZWRWYWx1ZTtcblxuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gW2ZpZWxkXTtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJOYW1lID0gdmFsdWU7XG5cbiAgICAgICAgICBpZiAoY29sR3JvdXBEZWYuY2hpbGRyZW4gJiYgY29sR3JvdXBEZWYuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MucHVzaCgnZ3JvdXAtcGl2b3QtY2VsbCcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBbY29sQ2hpbGRdOiBhbnkgPSBjb2xHcm91cERlZi5jaGlsZHJlbjtcbiAgICAgICAgY29uc3QgcGl2b3RUb3RhbENvbHVtbklkcyA9IGNvbENoaWxkICYmIGNvbENoaWxkLnBpdm90VG90YWxDb2x1bW5JZHM7XG5cbiAgICAgICAgaWYgKHBpdm90VG90YWxDb2x1bW5JZHMgJiYgcGl2b3RUb3RhbENvbHVtbklkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ3RvdGFsLXBpdm90LWNlbGwnXTtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJOYW1lID0gdGhpcy50cmFuc2xhdGUudHJhbnNmb3JtKCdjb3JlLnRvdGFsJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlckNsYXNzID0gWydlbXB0eS1waXZvdC1oZWFkZXInXTtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbEdyb3VwRGVmLnBpdm90S2V5cykge1xuICAgICAgICBjb2xHcm91cERlZi5waXZvdEtleXMgPSBjb2xHcm91cERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQaXZvdE1vZGVSb3dzPFQ+KGRhdGE6IFRbXSkge1xuICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbFBpdm90Q29sdW1ucygpO1xuICAgIGNvbnN0IGNvbnZlcnRlZERhdGEgPSBkYXRhLm1hcCgoY3VycmVudFZhbHVlLCBpbmRleCkgPT4ge1xuICAgICAgY29uc3QgbWFwcGVkVmFsdWVzID0geyAuLi5jdXJyZW50VmFsdWUgfTtcblxuICAgICAgZm9yIChjb25zdCBjb2wgb2YgcGl2b3RDb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGZpZWxkID0gY29sLmdldENvbERlZigpLmZpZWxkO1xuICAgICAgICBjb25zdCBwaXZvdFZhbHVlOiBQaXZvdENvbHVtbkRhdGEgPSB7IGZpZWxkLCB2YWx1ZTogY3VycmVudFZhbHVlW2ZpZWxkXSB9O1xuXG4gICAgICAgIG1hcHBlZFZhbHVlc1tmaWVsZF0gPSBKU09OLnN0cmluZ2lmeShwaXZvdFZhbHVlKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIG1hcHBlZFZhbHVlcztcbiAgICB9KTtcblxuICAgIHRoaXMuYXBpLmdyaWQuc2V0Um93RGF0YShjb252ZXJ0ZWREYXRhKTtcbiAgfVxuXG4gIC8qKiBObyBkZWNsYXJlZCBpbnRlcmZhY2UgaW4gY3VycmVudCBncmlkIHZlcnNpb24geWV0LlxuICAgKiAgUmVmZXIgZG9jcyAtIGh0dHBzOi8vd3d3LmFnLWdyaWQuY29tL2FuZ3VsYXItZGF0YS1ncmlkL2NlbGwtc3R5bGVzLyNjZWxsLWNsYXNzLXJ1bGVzICovXG4gIHByaXZhdGUgZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdwcmltYXJ5LTAtYmFja2dyb3VuZC1jb2xvcic6IHRoaXMuaXNMZWFmR3JvdXBFdmVuQ2VsbC5iaW5kKHRoaXMpLFxuICAgICAgJ3ByaW1hcnktMTAwLWJhY2tncm91bmQtY29sb3IgcG9pbnRlciBkYXRvLXNpbXBsZS1ib2xkJzogdGhpcy5pc1Jvd0dyb3VwVmFsdWVkQ2VsbC5iaW5kKHRoaXMpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgaXNMZWFmR3JvdXBFdmVuQ2VsbChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHsgbGVhZkdyb3VwLCBjaGlsZEluZGV4LCByb3dHcm91cEluZGV4IH0gPSBwYXJhbXMubm9kZTtcbiAgICBjb25zdCBjb2xJbmRleCA9IHRoaXMuZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtcyk7XG5cbiAgICByZXR1cm4gcm93R3JvdXBJbmRleCA8PSBjb2xJbmRleCAmJiBsZWFmR3JvdXAgJiYgY2hpbGRJbmRleCAlIDIgPT09IDA7XG4gIH1cblxuICBwcml2YXRlIGlzUm93R3JvdXBWYWx1ZWRDZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmICFsZWFmR3JvdXA7XG4gIH1cblxuICBwcml2YXRlIGdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXM6IENlbGxDbGFzc1BhcmFtcyk6IG51bWJlciB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuXG4gICAgaWYgKGdyaWRRdWVyeSAmJiBncmlkUXVlcnkuYXBpKSB7XG4gICAgICBjb25zdCB7IGNvbHVtbnMgfSA9IGdyaWRRdWVyeS5hcGkgYXMgRGF0b0dyaWRBcGk7XG4gICAgICBjb25zdCBhbGxEaXNwbGF5ZWRDb2x1bW5zID0gY29sdW1ucy5nZXRBbGxEaXNwbGF5ZWRDb2x1bW5zKCk7XG4gICAgICBjb25zdCBkaXNwbGF5ZWRDb2x1bW4gPSBhbGxEaXNwbGF5ZWRDb2x1bW5zLmZpbmQoY29sID0+IGNvbC5nZXRDb2xJZCgpID09PSBwYXJhbXMuY29sRGVmLmNvbElkKTtcblxuICAgICAgcmV0dXJuIGFsbERpc3BsYXllZENvbHVtbnMuaW5kZXhPZihkaXNwbGF5ZWRDb2x1bW4pO1xuICAgIH1cblxuICAgIHJldHVybiAtMTtcbiAgfVxufVxuIl19
1178
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JpZC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQGRhdG9yYW1hL2NvcmUvIiwic291cmNlcyI6WyJsaWIvZ3JpZC12Mi9ncmlkLXN0b3JlL2dyaWQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQXdCLE1BQU0sZUFBZSxDQUFDO0FBZXpFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM3QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV4RSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEMsT0FBTyxFQUNMLG9CQUFvQixFQUtwQixzQkFBc0IsRUFRdkIsTUFBTSxrQ0FBa0MsQ0FBQztBQUMxQyxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzlFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVqRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBU2xGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLHFCQUFxQixFQUFrQixNQUFNLGtCQUFrQixDQUFDO0FBQ3pFLE9BQU8sRUFJTCxtQkFBbUIsRUFPbkIsdUNBQXVDLEVBQ3ZDLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsMkJB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O1NBeHRDWSxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBPbkRlc3Ryb3ksIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGF0b0dyaWRBcGkgfSBmcm9tICcuLi9ncmlkLWNvbnRyb2xsZXIvZ3JpZC1jb250cm9sbGVyLnR5cGVzJztcbmltcG9ydCB7XG4gIENlbGxDbGFzc1BhcmFtcyxcbiAgQ29sR3JvdXBEZWYsXG4gIENvbHVtbixcbiAgR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcyxcbiAgR3JpZE9wdGlvbnMsXG4gIElDZWxsUmVuZGVyZXJQYXJhbXMsXG4gIElHZXRSb3dzUGFyYW1zLFxuICBSb3dEYXRhVHJhbnNhY3Rpb24sXG4gIFJvd05vZGUsXG4gIFJvd05vZGVUcmFuc2FjdGlvbixcbiAgUm93U2VsZWN0ZWRFdmVudFxufSBmcm9tICdAYWctZ3JpZC1jb21tdW5pdHkvY29yZSc7XG5pbXBvcnQgeyBHcmlkUXVlcnkgfSBmcm9tICcuL2dyaWQucXVlcnknO1xuaW1wb3J0IHsgRGF0b0NvcmVFcnJvciB9IGZyb20gJy4uLy4uL2Vycm9ycyc7XG5pbXBvcnQgeyBEYXRvVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3RyYW5zbGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IERhdG9DdXN0b21IZWFkZXJUZW1wbGF0ZUNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY3VzdG9tLWhlYWRlci9jdXN0b20taGVhZGVyLXRlbXBsYXRlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtcbiAgRGF0b0ZpbHRlckNvbmRpdGlvbnMsXG4gIERhdG9HcmlkQ29uZGl0aW9uYWxGaWx0ZXIsXG4gIERhdG9HcmlkRXh0ZXJuYWxGaWx0ZXIsXG4gIERhdG9HcmlkRmlsdGVyLFxuICBEYXRvR3JpZEZpbHRlckNvbmRpdGlvbixcbiAgRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucyxcbiAgRGF0b0dyaWRGaWx0ZXJzTWFwLFxuICBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbixcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIsXG4gIFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVycyxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uLFxuICBTZXJ2ZXJTaWRlUGFnaW5hdGlvblJhbmdlQ29uZGl0aW9uXG59IGZyb20gJy4uL2dyaWQtZmlsdGVyL2dyaWQtZmlsdGVyLnR5cGVzJztcbmltcG9ydCB7IGNvZXJjZUFycmF5IH0gZnJvbSAnLi4vLi4vdXRpbHMvY29lcmNpb24nO1xuaW1wb3J0IHsgaXNFbXB0eSwgaXNGdW5jdGlvbiwgaXNOaWwsIGlzU3RyaW5nIH0gZnJvbSAnLi4vLi4vdXRpbHMvdmFsaWRhdG9ycyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUZpbHRlciB9IGZyb20gJy4uL2dyaWQtZmlsdGVyL2ZpbHRlci12YWxpZGF0b3InO1xuaW1wb3J0IHsgQWdHcmlkQW5ndWxhciB9IGZyb20gJ0BhZy1ncmlkLWNvbW11bml0eS9hbmd1bGFyJztcbmltcG9ydCB7IEljb25SZWdpc3RyeSwgU3ZnUmVnaXN0cnkgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9pY29uLXJlZ2lzdHJ5JztcbmltcG9ydCB7IGdldFZpc2libGVBY3Rpb25zLCB0b29sYmFyQWN0aW9uVG9Db250ZXh0QWN0aW9uIH0gZnJvbSAnLi4vZ3JpZC12Mi51dGlsJztcbmltcG9ydCB7XG4gIERhdG9HcmlkU2V0dGluZ3MsXG4gIE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMsXG4gIFBpdm90Q29sdW1uRGF0YSxcbiAgU2VydmVyU2lkZVBhZ2luYXRpb25Db25maWcsXG4gIFN1Y2Nlc3NXcmFwcGVyUGFyYW1zXG59IGZyb20gJy4vZ3JpZC5zdG9yZS50eXBlcyc7XG5pbXBvcnQgeyBSb3dBY3Rpb24gfSBmcm9tICcuLi9ncmlkLXRvb2xiYXIvZ3JpZC10b29sYmFyLnR5cGVzJztcbmltcG9ydCB7IHdyaXRlVG9DbGlwYm9hcmQgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2NsaXBib2FyZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgR3JpZFN0b3JlIH0gZnJvbSAnLi9ncmlkLnN0b3JlJztcbmltcG9ydCB7IERBVE9fR1JJRF9TVE9SQUdFX0FQSSwgR3JpZFN0b3JhZ2VBUEkgfSBmcm9tICcuLi9ncmlkLXNldHRpbmdzJztcbmltcG9ydCB7XG4gIEFjdGlvbkNvbnZlcnRlclBhcmFtcyxcbiAgRGF0b0dyaWRBbGlnbm1lbnQsXG4gIERhdG9HcmlkQ29sdW1uRGVmLFxuICBEYXRvR3JpZENvbHVtblR5cGVzLFxuICBEYXRvR3JpZEdldFJvd3NQYXJhbXMsXG4gIERhdG9HcmlkT3B0aW9ucyxcbiAgRGF0b0dyaWRTZXJ2ZXJTb3J0LFxuICBEYXRvR3JpZFNlcnZlclNvcnREaXJlY3Rpb24sXG4gIERhdG9HcmlkU29ydCxcbiAgRGF0b0dyaWRUcmVlQ29uZmlnLFxuICBlZGl0YWJsZUNlbGxSZW5kZXJlcldpdGhTZWFyY2hIaWdobGlnaHQsXG4gIEdyaWRNaW5XaWR0aHMsXG4gIEdyaWRSb3dTZWxlY3Rpb25UeXBlLFxuICBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXJcbn0gZnJvbSAnLi4vZ3JpZC9ncmlkLXYyLnR5cGVzJztcblxuaW1wb3J0IHsgY29udmVydFRvVHJlZURhdGEsIGRlZmF1bHRHcmlkT3B0aW9ucywgZGVmYXVsdEdyaWRUcmVlTGFiZWwgfSBmcm9tICcuLi9ncmlkL2dyaWQtdjIuY29uZmlnJztcbmltcG9ydCB7IGRpZmYgfSBmcm9tICcuLi8uLi91dGlscy9vYmplY3QnO1xuaW1wb3J0IHsgdW50aWxEZXN0cm95ZWQgfSBmcm9tICduZ3gtdGFrZS11bnRpbC1kZXN0cm95JztcbmltcG9ydCB7IENvcmVFdmVudExvZ2dlciwgQ29yZUV2ZW50VHlwZXMsIERBVE9fQ09SRV9MT0dHRVIgfSBmcm9tICcuLi8uLi9ldmVudC1sb2dnZXInO1xuaW1wb3J0IHsgSGFzaE1hcCB9IGZyb20gJy4uLy4uL3V0aWxzL3R5cGVzJztcbmltcG9ydCB7IHNpemUgfSBmcm9tICcuLi8uLi91dGlscy9jb2xsZWN0aW9uJztcbmltcG9ydCB7IE9wZXJhdG9yVHlwZXMgfSBmcm9tICcuLi8uLi9vcGVyYXRvci10b2dnbGVyL29wZXJhdG9yLXRvZ2dsZXIudHlwZXMnO1xuaW1wb3J0IHsgZGVlcG1lcmdlIH0gZnJvbSAnLi4vLi4vaW50ZXJuYWwvZGVlcC1tZXJnZSc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyB0cmlnZ2VyV2luZG93UmVzaXplIH0gZnJvbSAnLi4vLi4vdXRpbHMvdXNlci1hZ2VudCc7XG5pbXBvcnQgeyBnZXRDb2xGaWVsZCwgZ2V0Q29sdW1uc1NpemVzLCBpc0h0bWxBbGxvd2VkRm9yQ29sLCB0cnlQYXJzZVBpdm90VmFsdWUgfSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHsgRGF0b0dyaWRNdWx0aVNlbGVjdENvbHVtbkhlYWRlckNvbXBvbmVudCB9IGZyb20gJy4uL2dyaWQtY29sdW1uLWhlYWRlci9ncmlkLW11bHRpLXNlbGVjdC1oZWFkZXIvZ3JpZC1tdWx0aS1zZWxlY3QtaGVhZGVyLmNvbXBvbmVudCc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBHcmlkU2VydmljZSBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIGFwaTogRGF0b0dyaWRBcGk7XG4gIHRyZWVDb25maWc6IERhdG9HcmlkVHJlZUNvbmZpZyA9IGRlZmF1bHRHcmlkVHJlZUxhYmVsO1xuICBpc1Bpdm90TW9kZTogYm9vbGVhbjtcblxuICAvKiogQGludGVybmFsIC0gdXNlZCBmb3Igc2VydmVyIHNpZGUgYnkgdmFsdWUgZmlsdGVyICovXG4gIF9vcmlnaW5hbEdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsU2V0dGluZ3M6IERhdG9HcmlkU2V0dGluZ3M7XG4gIHByaXZhdGUgZ3JpZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBncmlkUmVmOiBBZ0dyaWRBbmd1bGFyO1xuICBwcml2YXRlIGN1c3RvbUhlYWRlcnNUZW1wbGF0ZXM6IFF1ZXJ5TGlzdDxEYXRvQ3VzdG9tSGVhZGVyVGVtcGxhdGVDb21wb25lbnQ+O1xuICBwcml2YXRlIGlzVHJlZURhdGE6IGJvb2xlYW47XG4gIHByaXZhdGUgcGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG4gIHByaXZhdGUgbGFzdFRvdGFsUm93czogbnVtYmVyO1xuICBwcml2YXRlIHJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBDSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lEID0gJ2dyaWQtY2hlY2tib3gtc2VsZWN0aW9uJztcblxuICBzZXQgdHJlZURhdGEoaXNUcmVlRGF0YTogYm9vbGVhbikge1xuICAgIHRoaXMuaXNUcmVlRGF0YSA9IGlzVHJlZURhdGE7XG4gIH1cblxuICBnZXQgdHJlZURhdGEoKSB7XG4gICAgcmV0dXJuIHRoaXMuaXNUcmVlRGF0YTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgc3RvcmU6IEdyaWRTdG9yZSxcbiAgICBwcml2YXRlIGdyaWRRdWVyeTogR3JpZFF1ZXJ5LFxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBEYXRvVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGljb25SZWdpc3RyeTogSWNvblJlZ2lzdHJ5LFxuICAgIHByaXZhdGUgc3ZnUmVnaXN0cnk6IFN2Z1JlZ2lzdHJ5LFxuICAgIEBJbmplY3QoREFUT19HUklEX1NUT1JBR0VfQVBJKSBwcml2YXRlIHN0b3JhZ2VBUEk6IEdyaWRTdG9yYWdlQVBJLFxuICAgIEBJbmplY3QoREFUT19DT1JFX0xPR0dFUikgcHJpdmF0ZSBsb2dnZXI6IENvcmVFdmVudExvZ2dlclxuICApIHt9XG5cbiAgbmdPbkRlc3Ryb3koKSB7fVxuXG4gIC8qKiBAaW50ZXJuYWwgLSB1c2VkIHRvIGluaXQgdGhlIHNlcnZpY2UgKi9cbiAgX3NldEFwaShhcGk6IERhdG9HcmlkQXBpLCBncmlkUmVmOiBBZ0dyaWRBbmd1bGFyKSB7XG4gICAgdGhpcy5hcGkgPSBhcGk7XG4gICAgdGhpcy5ncmlkUmVmID0gZ3JpZFJlZjtcbiAgICB0aGlzLmdyaWROYW1lID0gKGdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS5ncmlkTmFtZTtcbiAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHtcbiAgICAgIGVuYWJsZWQ6IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkUmVmLmdyaWRPcHRpb25zKVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpc1NlcnZlclNpZGVQYWdpbmF0aW9uKGdyaWRPcHRpb25zOiBHcmlkT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBncmlkT3B0aW9ucy5yb3dNb2RlbFR5cGUgPT09ICdpbmZpbml0ZSc7XG4gIH1cblxuICB1cGRhdGVHcmlkQ29udGV4dChjb250ZXh0ID0ge30sIHJlcGxhY2UgPSBmYWxzZSkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCkuY29udGV4dCA9IHJlcGxhY2VcbiAgICAgID8gY29udGV4dFxuICAgICAgOiBkZWVwbWVyZ2UodGhpcy5ncmlkUmVmLmdyaWRPcHRpb25zLmNvbnRleHQgfHwge30sIGNvbnRleHQpO1xuICB9XG5cbiAgcmVsb2FkR3JpZEFjdGlvbnMoKTogdm9pZCB7XG4gICAgdGhpcy5yZWxvYWRHcmlkQWN0aW9uc1N1YmplY3QubmV4dCgpO1xuICB9XG5cbiAgb25SZWxvYWRHcmlkQWN0aW9ucygpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnJlbG9hZEdyaWRBY3Rpb25zU3ViamVjdC5hc09ic2VydmFibGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2Ugc2VsZWN0Um93cyBpbnN0ZWFkXG4gICAqIEBwYXJhbSByb3dcbiAgICovXG4gIHNldFNlbGVjdGVkUm93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIHRoaXMuc2VsZWN0Um93cyhyb3cpO1xuICB9XG5cbiAgc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiAhcm93Tm9kZS5pc1NlbGVjdGVkKCkpO1xuICAgIGNvbnN0IGxhc3ROb2RlID0gcm93Tm9kZXMucG9wKCk7XG4gICAgcm93Tm9kZXMuZm9yRWFjaChyb3dOb2RlID0+IHJvd05vZGUuc2V0U2VsZWN0ZWQodHJ1ZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKHRydWUpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VsZWN0Um93czxUPihyb3c6IChUICYgUm93Tm9kZSkgfCAoVFtdICYgUm93Tm9kZVtdKSkge1xuICAgIGNvbnN0IHJvd05vZGVzID0gY29lcmNlQXJyYXkocm93KS5maWx0ZXIocm93Tm9kZSA9PiByb3dOb2RlLmlzU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGFzdE5vZGUgPSByb3dOb2Rlcy5wb3AoKTtcbiAgICByb3dOb2Rlcy5mb3JFYWNoKHJvd05vZGUgPT4gcm93Tm9kZS5zZXRTZWxlY3RlZChmYWxzZSwgZmFsc2UsIHRydWUpKTtcbiAgICBpZiAobGFzdE5vZGUpIHtcbiAgICAgIGxhc3ROb2RlLnNldFNlbGVjdGVkKGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICBzZXRSb3dzPFQ+KGRhdGE6IFRbXSwgZml0Q29udGFpbmVyID0gZmFsc2UsIHRyZWVDb25maWc6IFBhcnRpYWw8RGF0b0dyaWRUcmVlQ29uZmlnPiA9IHt9KSB7XG4gICAgdGhpcy5ncmlkUXVlcnkuZ3JpZFJlYWR5JC5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5pc1RyZWVEYXRhKSB7XG4gICAgICAgIHRoaXMudHJlZUNvbmZpZyA9IHtcbiAgICAgICAgICAuLi5kZWZhdWx0R3JpZFRyZWVMYWJlbCxcbiAgICAgICAgICAuLi50cmVlQ29uZmlnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRyZWVEYXRlID0gY29udmVydFRvVHJlZURhdGEoZGF0YSwgdGhpcy50cmVlQ29uZmlnKTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKHRyZWVEYXRlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgICB0aGlzLnNldFBpdm90TW9kZVJvd3M8VD4oZGF0YSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwaS5ncmlkLnNldFJvd0RhdGEoZGF0YSk7XG4gICAgICB9XG4gICAgICBpZiAoZml0Q29udGFpbmVyKSB7XG4gICAgICAgIHRoaXMuZml0R3JpZCgnY29udGFpbmVyJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0cmlnZ2VyV2luZG93UmVzaXplKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzZXREYXRhc291cmNlKGdldFJvd3M6IChwYXJhbXM6IERhdG9HcmlkR2V0Um93c1BhcmFtcykgPT4gdm9pZCwgcmV0dXJuVG9DdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAgcmV0dXJuVG9DdXJyZW50UGFnZSAmJiB0aGlzLnVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCk7XG4gICAgc2hvd0xvYWRpbmcgJiYgdGhpcy5zZXRMb2FkaW5nKHRydWUpO1xuICAgIHRoaXMuX29yaWdpbmFsR2V0Um93cyA9IGdldFJvd3M7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy53cmFwR2V0Um93cyh0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLCBnZXRSb3dzKSB9KTtcbiAgfVxuXG4gIHJlZnJlc2hTZXJ2ZXJEYXRhKGtlZXBDdXJyZW50UGFnZSA9IGZhbHNlLCBzaG93TG9hZGluZyA9IGZhbHNlKSB7XG4gICAga2VlcEN1cnJlbnRQYWdlICYmIHRoaXMudXBkYXRlUGFnZVRvS2VlcE9uUmVmcmVzaFNlcnZlckRhdGEoKTtcbiAgICBzaG93TG9hZGluZyAmJiB0aGlzLnNldExvYWRpbmcodHJ1ZSk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXREYXRhc291cmNlKHsgZ2V0Um93czogdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5kYXRhc291cmNlLmdldFJvd3MgfSk7XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZVBhZ2VUb0tlZXBPblJlZnJlc2hTZXJ2ZXJEYXRhKCkge1xuICAgIC8vIEtlZXBpbmcgdGhlIGN1cnJlbnQgcGFnZSBvbiBzZXJ2ZXIgcmVmcmVzaCBpcyBjdXJyZW50bHkgYXZhaWxhYmxlIG9ubHkgd2hlbiBubyBwYWdlIGNsaWVudCBjYWNoaW5nIGlzIGVuYWJsZWRcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKS5tYXhCbG9ja3NJbkNhY2hlID09PSAxKSB7XG4gICAgICB0aGlzLnBhZ2VOdW1iZXJUb1JldHVybkFmdGVyUmVmcmVzaCA9IHRoaXMuYXBpLmdyaWQucGFnaW5hdGlvbkdldEN1cnJlbnRQYWdlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkUm93czxUPihyb3c6IFQsIGluZGV4PzogbnVtYmVyKTogUm93Tm9kZVRyYW5zYWN0aW9uIHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICBjb25zdCBkYXRhOiBSb3dEYXRhVHJhbnNhY3Rpb24gPSB7IGFkZDogcm93cyB9O1xuICAgIGlmICghaXNOaWwoaW5kZXgpKSB7XG4gICAgICBkYXRhLmFkZEluZGV4ID0gaW5kZXg7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmFwaS5ncmlkLnVwZGF0ZVJvd0RhdGEoZGF0YSk7XG4gIH1cblxuICB1cGRhdGVSb3dzPFQ+KHJvdzogVFtdKTogYW55IHtcbiAgICBjb25zdCByb3dzID0gY29lcmNlQXJyYXkocm93KTtcbiAgICByZXR1cm4gdGhpcy5hcGkuZ3JpZC51cGRhdGVSb3dEYXRhKHsgdXBkYXRlOiByb3dzIH0pO1xuICB9XG5cbiAgdXBkYXRlUm93VmFsdWU8VD4ocm93OiBSb3dOb2RlLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihpZDogc3RyaW5nLCBrZXk6IHN0cmluZywgbmV3VmFsdWU6IFQpO1xuICB1cGRhdGVSb3dWYWx1ZTxUPihyb3c6IHN0cmluZyB8IFJvd05vZGUsIGtleTogc3RyaW5nLCBuZXdWYWx1ZTogVCkge1xuICAgIGNvbnN0IHJvd05vZGUgPSBpc1N0cmluZyhyb3cpID8gdGhpcy5hcGkuZ3JpZC5nZXRSb3dOb2RlKHJvdykgOiByb3c7XG4gICAgcm93Tm9kZS5zZXREYXRhVmFsdWUoa2V5LCBuZXdWYWx1ZSk7XG4gIH1cblxuICByZW1vdmVSb3dzKHJvdzogUm93Tm9kZSB8IFJvd05vZGVbXSk6IFJvd05vZGVUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qgcm93cyA9IGNvZXJjZUFycmF5KHJvdykubWFwKCh7IGRhdGEgfSkgPT4gZGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuYXBpLmdyaWQudXBkYXRlUm93RGF0YSh7IHJlbW92ZTogcm93cyB9KTtcbiAgfVxuXG4gIHJlbW92ZVNlbGVjdGVkUm93cygpIHtcbiAgICBjb25zdCBzZWxlY3RlZFJvd3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgcmV0dXJuIHRoaXMucmVtb3ZlUm93cyhzZWxlY3RlZFJvd3MpO1xuICB9XG5cbiAgY2xlYXJUYWJsZSgpIHtcbiAgICB0aGlzLnNldFJvd3MoW10pO1xuICB9XG5cbiAgdXBkYXRlQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZiB8IERhdG9HcmlkQ29sdW1uRGVmW10sIHJlbG9hZFNldHRpbmdzID0gZmFsc2UpIHtcbiAgICBpZiAoIWNvbERlZnMpIHtcbiAgICAgIHRocm93IG5ldyBEYXRvQ29yZUVycm9yKCdObyBjb2x1bW5EZWZzIHdlcmUgcHJvdmlkZWQuIPCflbXwn4+74oCN4pmA77iPJyk7XG4gICAgfVxuICAgIGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNvbHVtbnMoY29lcmNlQXJyYXkoY29sRGVmcykpO1xuICAgIGNvbnN0IHNhdmVkU2V0dGluZ3MgPSByZWxvYWRTZXR0aW5ncyAmJiB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRDb2x1bW5EZWZzKG5vcm1hbGl6ZWQpO1xuICAgIGlmIChzYXZlZFNldHRpbmdzKSB7XG4gICAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGluaXRHcmlkT3B0aW9ucyhncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zKSB7XG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAuLi5ncmlkT3B0aW9uc1xuICAgIH07XG5cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZVNlYXJjaCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuZW5hYmxlU2VhcmNoID0gb3B0aW9ucy5lbmFibGVWMl8xO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGdyaWRPcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVuYWJsZUJhY2tncm91bmQgPSBvcHRpb25zLmVuYWJsZVYyXzE7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcyA9XG4gICAgICAgIGdyaWRPcHRpb25zLmVuYWJsZVYyXzEgJiYgb3B0aW9ucy5yb3dTZWxlY3Rpb24gIT09IEdyaWRSb3dTZWxlY3Rpb25UeXBlLlNJTkdMRTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvcHRpb25zLmVuYWJsZVNlYXJjaEhpZ2hsaWdodCA9IG9wdGlvbnMuZW5hYmxlU2VhcmNoICYmIGRlZmF1bHRHcmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHQ7XG4gICAgfVxuXG4gICAgaWYgKGdyaWRPcHRpb25zLnVzZVBpdm90R3JpZFN0eWxlKSB7XG4gICAgICBjb25zdCByb3dIZWlnaHQgPSAzMDtcblxuICAgICAgb3B0aW9ucy5yb3dIZWlnaHQgPSByb3dIZWlnaHQ7XG4gICAgICBvcHRpb25zLmRlZmF1bHRDb2xEZWYgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMuZGVmYXVsdENvbERlZixcbiAgICAgICAgY2VsbENsYXNzUnVsZXM6IHRoaXMuZ2V0UGl2b3RNb2RlQ2VsbENsYXNzUnVsZXMoKSxcbiAgICAgICAgaGVhZGVyQ2xhc3M6IHRoaXMuZ2V0UGl2b3RIZWFkZXJDbGFzcy5iaW5kKHRoaXMpLFxuICAgICAgICBjZWxsU3R5bGU6IHBhcmFtcyA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGU6IGFueSA9IHsgbGluZUhlaWdodDogYCR7cm93SGVpZ2h0fXB4YCB9O1xuXG4gICAgICAgICAgaWYgKHBhcmFtcy5jb2xEZWYudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5OdW1iZXIpIHtcbiAgICAgICAgICAgIHN0eWxlLnRleHRBbGlnbiA9ICdlbmQnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiBzdHlsZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgb3B0aW9ucy5hdXRvR3JvdXBDb2x1bW5EZWYgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmLFxuICAgICAgICBjZWxsQ2xhc3NSdWxlczogdGhpcy5nZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpLFxuICAgICAgICBoZWFkZXJDbGFzczogdGhpcy5nZXRQaXZvdEhlYWRlckNsYXNzLmJpbmQodGhpcylcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cblxuICBub3JtYWxpemVPcHRpb25zKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHRoaXMuY3VzdG9tSGVhZGVyc1RlbXBsYXRlcyA9IHBhcmFtcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzO1xuICAgIGNvbnN0IGhlYWRlckNvbXBvbmVudFBhcmFtcyA9IHsgZ3JpZFNlcnZpY2U6IHRoaXMsIGdyaWRRdWVyeTogdGhpcy5ncmlkUXVlcnkgfTtcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuYXV0b0dyb3VwQ29sdW1uRGVmID0ge1xuICAgICAgLi4uaGVhZGVyQ29tcG9uZW50UGFyYW1zLFxuICAgICAgLi4ucGFyYW1zLmdyaWRPcHRpb25zLmF1dG9Hcm91cENvbHVtbkRlZlxuICAgIH07XG5cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuZGVmYXVsdENvbERlZiA9IHtcbiAgICAgIC4uLnBhcmFtcy5ncmlkT3B0aW9ucy5kZWZhdWx0Q29sRGVmLFxuICAgICAgaGVhZGVyQ29tcG9uZW50UGFyYW1zXG4gICAgfTtcblxuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzID0gdGhpcy5ub3JtYWxpemVDb2x1bW5zKHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLCBwYXJhbXMuZ3JpZE9wdGlvbnMpO1xuXG4gICAgLyoqIEFkZCBjb3JlIGZpbHRlcnMgKi9cbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuaXNFeHRlcm5hbEZpbHRlclByZXNlbnQgPSAoKSA9PiB0cnVlO1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kb2VzRXh0ZXJuYWxGaWx0ZXJQYXNzID0gKHJvdzogUm93Tm9kZSkgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdmFsaWRhdGVGaWx0ZXIoeyByb3csIGFwaTogdGhpcy5ncmlkUXVlcnkuYXBpLmdyaWQgfSwgdGhpcy5ncmlkUXVlcnkuZ2V0RmlsdGVyKCkpICYmIHRoaXMucm93TWF0Y2hlc1NlYXJjaChyb3cpXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvKiogV3JhcCB0aGUgc2VydmVyIHNpZGUgcGFnaW5hdGlvbiBnZXQgcm93cyBmdW5jdGlvbiAqL1xuICAgIGlmICh0aGlzLmlzU2VydmVyU2lkZVBhZ2luYXRpb24ocGFyYW1zLmdyaWRPcHRpb25zKSkge1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLmJsb2NrTG9hZERlYm91bmNlTWlsbGlzID0gMzAwO1xuICAgICAgdGhpcy5fb3JpZ2luYWxHZXRSb3dzID0gcGFyYW1zLmdyaWRPcHRpb25zLmRhdGFzb3VyY2UuZ2V0Um93cztcbiAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5kYXRhc291cmNlLmdldFJvd3MgPSB0aGlzLndyYXBHZXRSb3dzKHBhcmFtcy5ncmlkT3B0aW9ucyk7XG4gICAgICAvKiBUaGUgY2FjaGUgc2l6ZSBpcyBzeW5jZWQgd2l0aCB0aGUgcGFnaW5hdGlvbiBwYWdlIHNpemUgKi9cbiAgICAgIGNvbnN0IGNhY2hlU2l6ZSA9IHBhcmFtcy5ncmlkT3B0aW9ucy5wYWdpbmF0aW9uUGFnZVNpemU7XG4gICAgICBpZiAoY2FjaGVTaXplKSB7XG4gICAgICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jYWNoZUJsb2NrU2l6ZSA9IGNhY2hlU2l6ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogRWRpdGFibGUgY2VsbCAqL1xuICAgIHRoaXMuaW5pdEVkaXRhYmxlQ29sdW1uc0NlbGxDbGFzcyhwYXJhbXMpO1xuXG4gICAgLyoqIFdyYXAgY29udGV4dCBtZW51ICovXG4gICAgcGFyYW1zLmdyaWRPcHRpb25zLmdldENvbnRleHRNZW51SXRlbXMgPSB0aGlzLndyYXBDb250ZXh0TWVudUJ1aWxkZXIocGFyYW1zKTtcblxuICAgIC8qKiBTYXZlIGdyaWQgc2V0dGluZ3MgKi9cbiAgICBjb25zdCB7IHNhdmVTZXR0aW5ncywgZ3JpZE5hbWUgfSA9IHBhcmFtcy5ncmlkT3B0aW9ucztcbiAgICBwYXJhbXMuZ3JpZE9wdGlvbnMuc2F2ZVNldHRpbmdzID0gc2F2ZVNldHRpbmdzICE9PSBmYWxzZSAmJiAhaXNOaWwoZ3JpZE5hbWUpO1xuXG4gICAgLyoqIFNlcnZlciBTaWRlIFBhZ2luYXRpb24gZm9yIHNlbGVjdCBhbGwgb3B0aW9uICovXG4gICAgdGhpcy5pbml0T25Sb3dTZWxlY3RlZEZvclNlcnZlclNpZGVQYWdpbmF0aW9uKHBhcmFtcyk7XG5cbiAgICAvKiogQWRkIHRyZWUgZ3JpZCBzcGVjaWZpYyByZXF1aXJlZCBzZXR0aW5ncyAqL1xuICAgIGlmICh0aGlzLmlzVHJlZURhdGEpIHtcbiAgICAgIGNvbnN0IGlucHV0Um93Q2xhc3NSdWxlcyA9IHBhcmFtcy5ncmlkT3B0aW9ucy5yb3dDbGFzc1J1bGVzO1xuXG4gICAgICBwYXJhbXMuZ3JpZE9wdGlvbnMucm93Q2xhc3NSdWxlcyA9IHtcbiAgICAgICAgLi4uaW5wdXRSb3dDbGFzc1J1bGVzLFxuICAgICAgICAnYWctZW1wdHktZm9sZGVyJzogcGFyYW1zID0+IHtcbiAgICAgICAgICByZXR1cm4gcGFyYW1zLmRhdGEuaXNGb2xkZXIgJiYgc2l6ZShwYXJhbXMubm9kZS5jaGlsZHJlbkFmdGVyR3JvdXApID09PSAwO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8qKiBBZGQgcGl2b3Qgc3BlY2lmaWMgcmVxdWlyZWQgc2V0dGluZ3MgKi9cbiAgICBpZiAodGhpcy5pc1Bpdm90TW9kZSkge1xuICAgICAgdGhpcy5pbml0UGl2b3RTZWNvbmRhcnlDb2xzUHJvY2VzcyhwYXJhbXMpO1xuICAgICAgcGFyYW1zLmdyaWRPcHRpb25zLnNhdmVTZXR0aW5ncyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIGdldFBpdm90SGVhZGVyQ2xhc3MocGFyYW1zKSB7XG4gICAgY29uc3QgZ3JpZFF1ZXJ5ID0gcGFyYW1zLmNvbERlZi5oZWFkZXJDb21wb25lbnRQYXJhbXMuZ3JpZFF1ZXJ5O1xuICAgIGxldCBjZWxsQ2xhc3MgPSAnJztcblxuICAgIGlmIChncmlkUXVlcnkgJiYgZ3JpZFF1ZXJ5LmFwaSkge1xuICAgICAgY29uc3QgeyBjb2x1bW5zIH0gPSBncmlkUXVlcnkuYXBpIGFzIERhdG9HcmlkQXBpO1xuICAgICAgLyoqIFVzZSBnZXRQaXZvdFJlc3VsdENvbHVtbnMgZnJvbSB2ZXIgMjggKi9cbiAgICAgIGNvbnN0IHBpdm90Q29sdW1ucyA9IGNvbHVtbnMuZ2V0U2Vjb25kYXJ5Q29sdW1ucygpO1xuXG4gICAgICBpZiAocGl2b3RDb2x1bW5zICYmIHBpdm90Q29sdW1ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNlbGxDbGFzcyArPSAndG9wLWJvcmRlcic7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNlbGxDbGFzcztcbiAgfVxuXG4gIHByaXZhdGUgbm9ybWFsaXplQ29sdW1ucyhjb2xEZWZzOiBEYXRvR3JpZENvbHVtbkRlZltdLCBncmlkT3B0aW9uczogRGF0b0dyaWRPcHRpb25zID0gbnVsbCk6IERhdG9HcmlkQ29sdW1uRGVmW10ge1xuICAgIGlmICghZ3JpZE9wdGlvbnMpIHtcbiAgICAgIGdyaWRPcHRpb25zID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICB9XG4gICAgY29uc3QgdXBkYXRlZENvbERlZnMgPSBjb2xEZWZzLm1hcCgoY29sOiBEYXRvR3JpZENvbHVtbkRlZikgPT4ge1xuICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IHtcbiAgICAgICAgLi4uY29sLFxuICAgICAgICBoZWFkZXJOYW1lOiB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oY29sLmhlYWRlck5hbWUpXG4gICAgICB9O1xuICAgICAgLyoqIEFkanVzdCB0aGUgd2lkdGggaW4gY2FzZSB0aGUgY29sdW1uIGhhcyBpbmZvICovXG4gICAgICBpZiAoY29sLmluZm8pIHtcbiAgICAgICAgbm9ybWFsaXplZC5taW5XaWR0aCA9IGNvbC5taW5XaWR0aCB8fCBHcmlkTWluV2lkdGhzLldpdGhfSW5mbztcbiAgICAgIH1cbiAgICAgIGlmICghY29sLmNvbElkKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuY29sSWQgPSBjb2wuZmllbGQ7XG4gICAgICB9XG4gICAgICBpZiAobm9ybWFsaXplZC50eXBlID09PSBEYXRvR3JpZENvbHVtblR5cGVzLkl0ZW1zICYmICFub3JtYWxpemVkLmZpbHRlcnNDb25maWcpIHtcbiAgICAgICAgbm9ybWFsaXplZC5maWx0ZXJzQ29uZmlnID0geyBzZWN0aW9uczogRGF0b0dyaWRGaWx0ZXJTZWN0aW9ucy5Db25kaXRpb25hbCB9O1xuICAgICAgfVxuICAgICAgdGhpcy5ub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoZ3JpZE9wdGlvbnMsIGNvbCwgbm9ybWFsaXplZCk7XG4gICAgICByZXR1cm4gbm9ybWFsaXplZDtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmFkZE11bHRpU2VsZWN0SGVhZGVyQ29sdW1uSWZSZXF1aXJlZCh1cGRhdGVkQ29sRGVmcywgZ3JpZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBub3JtYWxpemVDb2x1bW5TZWFyY2hDb25maWcoXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9ucyxcbiAgICBjb2w6IERhdG9HcmlkQ29sdW1uRGVmLFxuICAgIG5vcm1hbGl6ZWQ6IERhdG9HcmlkQ29sdW1uRGVmXG4gICkge1xuICAgIC8qKiBDaGVjayBpZiBjb2x1bW4gc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gc2VhcmNoICoqL1xuICAgIGNvbnN0IGlzU2VydmVyUGFnaW5hdGlvbiA9IHRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucyk7XG4gICAgaWYgKHR5cGVvZiBjb2wuaW5jbHVkZUluU2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgaWYgKGlzU2VydmVyUGFnaW5hdGlvbiAmJiBjb2wudHlwZSA9PT0gRGF0b0dyaWRDb2x1bW5UeXBlcy5EYXRlKSB7XG4gICAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoID0gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBub3JtYWxpemVkLmluY2x1ZGVJblNlYXJjaCA9XG4gICAgICAgICAgdHlwZW9mIGdyaWRPcHRpb25zLmNvbHVtbnNJbmNsdWRlZEluU2VhcmNoQnlEZWZhdWx0ICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgPyBncmlkT3B0aW9ucy5jb2x1bW5zSW5jbHVkZWRJblNlYXJjaEJ5RGVmYXVsdFxuICAgICAgICAgICAgOiBkZWZhdWx0R3JpZE9wdGlvbnMuY29sdW1uc0luY2x1ZGVkSW5TZWFyY2hCeURlZmF1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vcm1hbGl6ZWQuaW5jbHVkZUluU2VhcmNoICYmXG4gICAgICAhdGhpcy5oYXNDZWxsUmVuZGVyZXIobm9ybWFsaXplZCwgZ3JpZE9wdGlvbnMpICYmXG4gICAgICBncmlkT3B0aW9ucy5lbmFibGVTZWFyY2hIaWdobGlnaHRcbiAgICApIHtcbiAgICAgIG5vcm1hbGl6ZWQuY2VsbFJlbmRlcmVyID0gKHBhcmFtczogSUNlbGxSZW5kZXJlclBhcmFtcykgPT4ge1xuICAgICAgICBjb25zdCBhbGxvd0hUTUwgPSBpc0h0bWxBbGxvd2VkRm9yQ29sKGdyaWRPcHRpb25zLCBwYXJhbXMuY29sRGVmKTtcbiAgICAgICAgY29uc3QgaXNFZGl0YWJsZSA9XG4gICAgICAgICAgKGlzRnVuY3Rpb24obm9ybWFsaXplZC5lZGl0YWJsZSkgJiYgbm9ybWFsaXplZC5lZGl0YWJsZShwYXJhbXMpKSB8fFxuICAgICAgICAgICghaXNGdW5jdGlvbihub3JtYWxpemVkLmVkaXRhYmxlKSAmJiBub3JtYWxpemVkLmVkaXRhYmxlKTtcblxuICAgICAgICByZXR1cm4gaXNFZGl0YWJsZVxuICAgICAgICAgID8gZWRpdGFibGVDZWxsUmVuZGVyZXJXaXRoU2VhcmNoSGlnaGxpZ2h0KHBhcmFtcywgdGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpLCBhbGxvd0hUTUwpXG4gICAgICAgICAgOiBzZWFyY2hIaWdobGlnaHRDZWxsUmVuZGVyZXIocGFyYW1zLCB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCksIGFsbG93SFRNTCk7XG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaGFzQ2VsbFJlbmRlcmVyKGNvbHVtbjogRGF0b0dyaWRDb2x1bW5EZWYsIGdyaWRPcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMpOiBib29sZWFuIHtcbiAgICBpZiAoY29sdW1uLmNlbGxSZW5kZXJlcikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IHR5cGUgPSBjb2x1bW4udHlwZSBhcyBzdHJpbmc7XG4gICAgY29uc3QgY29sdW1uVHlwZUhhc0NlbGxSZW5kZXJlciA9IChvcHRpb25zOiBQYXJ0aWFsPERhdG9HcmlkT3B0aW9ucz4pOiBib29sZWFuID0+XG4gICAgICBvcHRpb25zLmNvbHVtblR5cGVzICYmICEhb3B0aW9ucy5jb2x1bW5UeXBlc1t0eXBlXSAmJiAhIW9wdGlvbnMuY29sdW1uVHlwZXNbdHlwZV0uY2VsbFJlbmRlcmVyO1xuXG4gICAgcmV0dXJuIGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZ3JpZE9wdGlvbnMpIHx8IGNvbHVtblR5cGVIYXNDZWxsUmVuZGVyZXIoZGVmYXVsdEdyaWRPcHRpb25zKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkTXVsdGlTZWxlY3RIZWFkZXJDb2x1bW5JZlJlcXVpcmVkKFxuICAgIGNvbHVtbkRlZnM6IERhdG9HcmlkQ29sdW1uRGVmW10sXG4gICAgZ3JpZE9wdGlvbnM6IERhdG9HcmlkT3B0aW9uc1xuICApOiBEYXRvR3JpZENvbHVtbkRlZltdIHtcbiAgICBjb25zdCBzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzID0gZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMuc2hvd011bHRpU2VsZWN0aW9uQ2hlY2tib3hlcztcbiAgICBjb25zdCByb3dTZWxlY3Rpb24gPVxuICAgICAgZ3JpZE9wdGlvbnMgJiYgZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uID8gZ3JpZE9wdGlvbnMucm93U2VsZWN0aW9uIDogZGVmYXVsdEdyaWRPcHRpb25zLnJvd1NlbGVjdGlvbjtcblxuICAgIGlmIChzaG93TXVsdGlTZWxlY3Rpb25DaGVja2JveGVzICYmIHJvd1NlbGVjdGlvbiA9PT0gR3JpZFJvd1NlbGVjdGlvblR5cGUuTVVMVElQTEUpIHtcbiAgICAgIGNvbnN0IGNoZWNrYm94ZXNDb2x1bW46IERhdG9HcmlkQ29sdW1uRGVmID0ge1xuICAgICAgICBjb2xJZDogdGhpcy5DSEVDS0JPWF9TRUxFQ1RJT05fQ09MX0lELFxuICAgICAgICBjaGVja2JveFNlbGVjdGlvbjogdHJ1ZSxcbiAgICAgICAgaGVhZGVyQ29tcG9uZW50RnJhbWV3b3JrOiBEYXRvR3JpZE11bHRpU2VsZWN0Q29sdW1uSGVhZGVyQ29tcG9uZW50LFxuICAgICAgICBtaW5XaWR0aDogMjksXG4gICAgICAgIHdpZHRoOiAyOSxcbiAgICAgICAgbWF4V2lkdGg6IDI5LFxuICAgICAgICBzdXBwcmVzc1NpemVUb0ZpdDogdHJ1ZSxcbiAgICAgICAgY2VsbENsYXNzOiAnY2hlY2tib3gtc2VsZWN0aW9uLWNlbGwnLFxuICAgICAgICBoZWFkZXJDbGFzczogJ2hlYWRlci1jaGVja2JveC1zZWxlY3Rpb24tY2VsbCcsXG4gICAgICAgIHJlc2l6YWJsZTogZmFsc2UsXG4gICAgICAgIHBpbm5lZDogJ2xlZnQnLFxuICAgICAgICBsb2NrUG9zaXRpb246IHRydWUsXG4gICAgICAgIGluY2x1ZGVJblNlYXJjaDogZmFsc2VcbiAgICAgIH07XG4gICAgICByZXR1cm4gW2NoZWNrYm94ZXNDb2x1bW4sIC4uLmNvbHVtbkRlZnNdO1xuICAgIH1cbiAgICByZXR1cm4gY29sdW1uRGVmcztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdE9uUm93U2VsZWN0ZWRGb3JTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7IGdyaWRPcHRpb25zIH06IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBpZiAoIXRoaXMuaXNTZXJ2ZXJTaWRlUGFnaW5hdGlvbihncmlkT3B0aW9ucykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ZXJuYWxPblJvd1NlbGVjdGVkID0gZ3JpZE9wdGlvbnMub25Sb3dTZWxlY3RlZDtcbiAgICBncmlkT3B0aW9ucy5vblJvd1NlbGVjdGVkID0gKGV2dDogUm93U2VsZWN0ZWRFdmVudCkgPT4ge1xuICAgICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgICAgY29uc3Qgbm9kZSA9IGV2dC5ub2RlO1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gbm9kZS5pc1NlbGVjdGVkKCk7XG4gICAgICAgIGNvbnN0IHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsIH0gPSB0aGlzLmdyaWRRdWVyeS5zZXJ2ZXJTaWRlQ29uZmlnO1xuICAgICAgICBjb25zdCBpc0V4Y2x1ZGVkID0gZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKG5vZGUuaWQpO1xuICAgICAgICBpZiAoaXNTZWxlY3RlZCAmJiBpc0V4Y2x1ZGVkKSB7XG4gICAgICAgICAgdGhpcy5zZXRTZXJ2ZXJTaWRlUGFnaW5hdGlvbih7XG4gICAgICAgICAgICBleGNsdWRlZEZyb21TZWxlY3RBbGw6IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbC5maWx0ZXIoKG5vZGVJZDogc3RyaW5nKSA9PiBub2RlSWQgIT09IG5vZGUuaWQpXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoIWlzU2VsZWN0ZWQgJiYgIWlzRXhjbHVkZWQpIHtcbiAgICAgICAgICB0aGlzLnNldFNlcnZlclNpZGVQYWdpbmF0aW9uKHsgZXhjbHVkZWRGcm9tU2VsZWN0QWxsOiBbLi4uZXhjbHVkZWRGcm9tU2VsZWN0QWxsLCBub2RlLmlkXSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGV4dGVybmFsT25Sb3dTZWxlY3RlZCkge1xuICAgICAgICBleHRlcm5hbE9uUm93U2VsZWN0ZWQoZXZ0KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSByb3dNYXRjaGVzU2VhcmNoKHJvdzogUm93Tm9kZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSAodGhpcy5ncmlkUXVlcnkuZ2V0U2VhcmNoVGVybSgpIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICBpZiAoaXNFbXB0eShzZWFyY2hUZXJtKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbnMgPSB0aGlzLmdyaWRRdWVyeS5nZXRHcmlkT3B0aW9ucygpLmluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2hcbiAgICAgID8gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsQ29sdW1ucygpXG4gICAgICA6IHRoaXMuZ3JpZFF1ZXJ5LmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICBmb3IgKGNvbnN0IGNvbCBvZiBjb2x1bW5zKSB7XG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmFwaS5ncmlkLmdldENvbHVtbkRlZihjb2wuZ2V0Q29sSWQoKSkgYXMgRGF0b0dyaWRDb2x1bW5EZWY7XG4gICAgICBpZiAoIWNvbERlZi5pbmNsdWRlSW5TZWFyY2gpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByb3dWYWx1ZSA9ICh0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbC5nZXRDb2xJZCgpLCByb3cpIHx8ICcnKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAocm93VmFsdWUuaW5jbHVkZXMoc2VhcmNoVGVybSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZCB1c2UgZml0R3JpZCgnY29udGFpbmVyJykgaW5zdGVhZFxuICAgKi9cbiAgZml0VG9Db250YWluZXIoKSB7XG4gICAgdGhpcy5hcGkuZ3JpZC5zaXplQ29sdW1uc1RvRml0KCk7XG4gIH1cblxuICBnZXRDdXN0b21IZWFkZXIoZmllbGQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmN1c3RvbUhlYWRlcnNUZW1wbGF0ZXMpIHtcbiAgICAgIGNvbnN0IHNwZWNpZmljID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+IGNvbHVtbiA9PT0gZmllbGQpO1xuICAgICAgY29uc3QgY29tbW9uID0gdGhpcy5jdXN0b21IZWFkZXJzVGVtcGxhdGVzLmZpbmQoKHsgY29sdW1uIH0pID0+ICFjb2x1bW4pO1xuICAgICAgaWYgKHNwZWNpZmljIHx8IGNvbW1vbikge1xuICAgICAgICBjb25zdCB7IG1vcmVNZW51LCBjdXN0b21IZWFkZXIgfSA9IHtcbiAgICAgICAgICBtb3JlTWVudTogKHNwZWNpZmljICYmIHNwZWNpZmljLm1vcmVNZW51KSB8fCAoY29tbW9uICYmIGNvbW1vbi5tb3JlTWVudSksXG4gICAgICAgICAgY3VzdG9tSGVhZGVyOiAoc3BlY2lmaWMgJiYgc3BlY2lmaWMuY3VzdG9tSGVhZGVyKSB8fCAoY29tbW9uICYmIGNvbW1vbi5jdXN0b21IZWFkZXIpXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IG1vcmVNZW51OiBtb3JlTWVudSAmJiBtb3JlTWVudS50cGwsIGN1c3RvbUhlYWRlcjogY3VzdG9tSGVhZGVyICYmIGN1c3RvbUhlYWRlci50cGwgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjbGVhckFsbEZpbHRlcnMoKSB7XG4gICAgdGhpcy5zdG9yZS51cGRhdGUoc3RhdGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAuLi5zdGF0ZS5zZXR0aW5ncyxcbiAgICAgICAgICBmaWx0ZXI6IHt9LFxuICAgICAgICAgIHNlYXJjaFRlcm06IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgY2xlYXJDb2x1bW5GaWx0ZXIoY29sdW1uRmllbGQ6IHN0cmluZykge1xuICAgIGNvbnN0IHsgW2NvbHVtbkZpZWxkXTogZGVsZXRlZCwgLi4uZmlsdGVyIH0gPSB0aGlzLmdyaWRRdWVyeS5nZXRGaWx0ZXIoKTtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlclxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICAgIHRoaXMubm90aWZ5RmlsdGVyVXBkYXRlKCk7XG4gIH1cblxuICBzZXRDb2x1bW5GaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIsIG5vdGlmeUdyaWQgPSB0cnVlKSB7XG4gICAgdGhpcy5fbG9nRXZlbnQoQ29yZUV2ZW50VHlwZXMuR1JJRF9GSUxURVJfQVBQTElFRCwge1xuICAgICAgY29sdW1uOiBjb2x1bW4uZ2V0Q29sSWQoKSxcbiAgICAgIG51bU9mQ29uZGl0aW9uczogKGZpbHRlci5jb25kaXRpb25hbCAmJiBmaWx0ZXIuY29uZGl0aW9uYWwuY29uZGl0aW9ucy5sZW5ndGgpIHx8IDAsXG4gICAgICBieVZhbHVlOiAhIWZpbHRlci5ieVZhbHVlID8gJ1llcycgOiAnTm8nXG4gICAgfSk7XG5cbiAgICB0aGlzLnVwZGF0ZUZpbHRlcihjb2x1bW4sIGZpbHRlcik7XG5cbiAgICBpZiAobm90aWZ5R3JpZCkge1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRHcmlkRmlsdGVycyhmaWx0ZXJzOiBEYXRvR3JpZEV4dGVybmFsRmlsdGVyW10pIHtcbiAgICBpZiAodGhpcy5hcGkgJiYgZmlsdGVycykge1xuICAgICAgbGV0IGFwcGxpZWRGaWx0ZXIgPSB7fTtcblxuICAgICAgZm9yIChjb25zdCB7IGZpbHRlciwgZmllbGQgfSBvZiBmaWx0ZXJzKSB7XG4gICAgICAgIGFwcGxpZWRGaWx0ZXJbZmllbGRdID0gZmlsdGVyO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnVwZGF0ZVNldHRpbmdzKHsgZmlsdGVyOiBhcHBsaWVkRmlsdGVyIH0pO1xuICAgICAgdGhpcy5ub3RpZnlGaWx0ZXJVcGRhdGUoKTtcbiAgICB9XG4gIH1cblxuICBzZXRTb3J0QnlDb2x1bW4oY29sSWQsIHNvcnQpIHtcbiAgICBjb25zdCBzb3J0VG9TZXQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTb3J0KHsgY29sSWQsIHNvcnQgfSk7XG5cbiAgICB0aGlzLnNldEdyaWRTb3J0KHNvcnRUb1NldCk7XG4gIH1cblxuICBzZXRHcmlkU29ydChncmlkU29ydDogRGF0b0dyaWRTb3J0KSB7XG4gICAgaWYgKGdyaWRTb3J0ICYmIHRoaXMuYXBpICYmIHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKSA+IDApIHtcbiAgICAgIGNvbnN0IHsgY29sSWQsIHNvcnQsIHNvcnRJbmRleCB9ID0gZ3JpZFNvcnQ7XG4gICAgICBjb25zdCBncmlkQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0QWxsR3JpZENvbHVtbnMoKTtcblxuICAgICAgaWYgKGdyaWRDb2x1bW5zKSB7XG4gICAgICAgIGxldCBzb3J0VG9BcHBseSA9IGdyaWRTb3J0O1xuICAgICAgICAvKiogU29ydCBieSBjb2x1bW4gaWQgKi9cbiAgICAgICAgY29uc3QgY29sdW1uQnlJZCA9IGdyaWRDb2x1bW5zLmZpbmQoKGNvbDogQ29sdW1uKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIChjb2wuZ2V0Q29sRGVmKCkuc2hvd1Jvd0dyb3VwIHx8IGNvbC5nZXRDb2xJZCgpKSA9PT0gY29sSWQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChjb2x1bW5CeUlkKSB7XG4gICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUlkLmdldENvbElkKCksIHNvcnQgfTtcbiAgICAgICAgfSBlbHNlIGlmICghaXNOaWwoc29ydEluZGV4KSkge1xuICAgICAgICAgIGNvbnN0IHZhbHVlQ29sdW1ucyA9IHRoaXMuYXBpLmNvbHVtbnMuZ2V0VmFsdWVDb2x1bW5zKCk7XG4gICAgICAgICAgY29uc3QgdmFsdWVDb2x1bW4gPSB2YWx1ZUNvbHVtbnMuZmluZCgoY29sOiBDb2x1bW4pID0+IGNvbC5nZXRDb2xJZCgpID09PSBjb2xJZCk7XG4gICAgICAgICAgY29uc3QgaXNQaXZvdENvbElkID0gY29sSWQuc3RhcnRzV2l0aCgncGl2b3QnKTtcblxuICAgICAgICAgIGlmIChpc1Bpdm90Q29sSWQgfHwgdmFsdWVDb2x1bW4pIHtcbiAgICAgICAgICAgIC8qKiBDb2x1bW4gaXMgcGl2b3QgdmFsdWUgY29sdW1uLCBzb3J0IGJ5IGluZGV4ICovXG4gICAgICAgICAgICBjb25zdCBjb2x1bW5CeUluZGV4ID0gZ3JpZENvbHVtbnNbc29ydEluZGV4XTtcblxuICAgICAgICAgICAgc29ydFRvQXBwbHkgPSB7IGNvbElkOiBjb2x1bW5CeUluZGV4LmdldENvbElkKCksIHNvcnQsIHNvcnRJbmRleCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBzb3J0OiBzb3J0VG9BcHBseSB9KTtcbiAgICAgICAgdGhpcy5hcGkuZ3JpZC5zZXRTb3J0TW9kZWwoW3NvcnRUb0FwcGx5XSk7XG5cbiAgICAgICAgaWYgKCh0aGlzLmdyaWRSZWYuZ3JpZE9wdGlvbnMgYXMgRGF0b0dyaWRPcHRpb25zKS51c2VQaXZvdEdyaWRTdHlsZSkge1xuICAgICAgICAgIHRoaXMuYXBpLmdyaWQucmVkcmF3Um93cygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVGaWx0ZXIoY29sdW1uOiBDb2x1bW4sIGZpbHRlcjogRGF0b0dyaWRGaWx0ZXIpIHtcbiAgICBjb25zdCBjb2xGaWVsZCA9IGdldENvbEZpZWxkKGNvbHVtbi5nZXRDb2xEZWYoKSk7XG5cbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIGZpbHRlcjoge1xuICAgICAgICAgICAgLi4uc3RhdGUuc2V0dGluZ3MuZmlsdGVyLFxuICAgICAgICAgICAgW2NvbEZpZWxkXTogZmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgc2V0U2VhcmNoVGVybShzZWFyY2hUZXJtOiBzdHJpbmcpIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIHNlYXJjaFRlcm1cbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLm5vdGlmeUZpbHRlclVwZGF0ZSgpO1xuICB9XG5cbiAgc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oY29uZmlnOiBQYXJ0aWFsPFNlcnZlclNpZGVQYWdpbmF0aW9uQ29uZmlnPikge1xuICAgIHRoaXMuc3RvcmUudXBkYXRlKHN0YXRlID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZlclNpZGVQYWdpbmF0aW9uOiB7XG4gICAgICAgICAgLi4uc3RhdGUuc2VydmVyU2lkZVBhZ2luYXRpb24sXG4gICAgICAgICAgLi4uY29uZmlnXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBzZXRMb2FkaW5nKHNob3c6IGJvb2xlYW4pIHtcbiAgICBpZiAoc2hvdykge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5zaG93TG9hZGluZ092ZXJsYXkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hcGkuZ3JpZC5nZXREaXNwbGF5ZWRSb3dDb3VudCgpID09PSAwID8gdGhpcy5zZXRPdmVybGF5KHRydWUpIDogdGhpcy5zZXRPdmVybGF5KGZhbHNlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgdXNlIHNldE92ZXJsYXkgaW5zdGVhZFxuICAgKiBAcGFyYW0gc2hvd1xuICAgKi9cbiAgc2V0Tm9EYXRhKHNob3c6IGJvb2xlYW4pIHtcbiAgICB0aGlzLnNldE92ZXJsYXkoc2hvdyk7XG4gIH1cblxuICBzZXRPdmVybGF5KHNob3c6IGJvb2xlYW4pIHtcbiAgICBzaG93ID8gdGhpcy5hcGkuZ3JpZC5zaG93Tm9Sb3dzT3ZlcmxheSgpIDogdGhpcy5hcGkuZ3JpZC5oaWRlT3ZlcmxheSgpO1xuICB9XG5cbiAgdXBkYXRlU2V0dGluZ3Moc2V0dGluZ3M6IFBhcnRpYWw8RGF0b0dyaWRTZXR0aW5ncz4pIHtcbiAgICB0aGlzLnN0b3JlLnVwZGF0ZShzdGF0ZSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgIC4uLnN0YXRlLnNldHRpbmdzLFxuICAgICAgICAgIC4uLnNldHRpbmdzXG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBmaXRHcmlkKHRvOiAnY29udGFpbmVyJyB8ICdjb250ZW50Jykge1xuICAgIHRvID09PSAnY29udGFpbmVyJyA/IHRoaXMuYXBpLmdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpIDogdGhpcy5hcGkuY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gdG8gPT09ICdjb250YWluZXInID8gRGF0b0dyaWRBbGlnbm1lbnQuRklUX1RPX0NPTlRBSU5FUiA6IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UO1xuICAgIHRoaXMudXBkYXRlU2V0dGluZ3MoeyBncmlkQWxpZ25tZW50LCBjb2x1bW5zU2l6ZXM6IG51bGwgfSk7XG4gIH1cblxuICBzYXZlU2V0dGluZ3NUb1NlcnZlcihzZXR0aW5nczogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPikge1xuICAgIHRoaXMuc3RvcmFnZUFQSS5zZXQodGhpcy5ncmlkTmFtZSwgc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbCB1c2VkIHRvIGxvZyBncmlkIGV2ZW50cyB0byB0aGUgcGxhdGZvcm0ncyBsb2dnaW5nIHNlcnZpY2VcbiAgICovXG4gIF9sb2dFdmVudChldmVudFR5cGU6IENvcmVFdmVudFR5cGVzLCBldmVudFByb3BlcnRpZXM/OiBIYXNoTWFwPGFueT4pIHtcbiAgICB0aGlzLmxvZ2dlci5sb2dFdmVudChldmVudFR5cGUsIHsgdGFibGU6IHRoaXMuZ3JpZE5hbWUsIC4uLmV2ZW50UHJvcGVydGllcyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcFN1Y2Nlc3NDYWxsYmFjayh7IHN1Y2Nlc3NDYiwgcGFnZU51bWJlciwgaXNQZW5kaW5nUmV0dXJuVG9QYWdlIH06IFN1Y2Nlc3NXcmFwcGVyUGFyYW1zKSB7XG4gICAgcmV0dXJuIChyb3dzVGhpc0Jsb2NrOiBhbnlbXSwgdG90YWxSb3dzOiBudW1iZXIpID0+IHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyB0b3RhbFJvd3MsIGhhc0Vycm9yOiBmYWxzZSB9KTtcbiAgICAgIHN1Y2Nlc3NDYihyb3dzVGhpc0Jsb2NrLCB0b3RhbFJvd3MpO1xuICAgICAgdGhpcy5ncmlkUXVlcnkuX3NlcnZlckRhdGFMb2FkZWQubmV4dCh7XG4gICAgICAgIGFwaTogdGhpcy5hcGkuZ3JpZCxcbiAgICAgICAgY29sdW1uQXBpOiB0aGlzLmFwaS5jb2x1bW5zLFxuICAgICAgICB0eXBlOiAnU2VydmVyRGF0YUxvYWRlZCcsXG4gICAgICAgIHBhZ2luYXRpb25QYWdlOiBwYWdlTnVtYmVyXG4gICAgICB9KTtcbiAgICAgIGlmICghaXNQZW5kaW5nUmV0dXJuVG9QYWdlKSB7XG4gICAgICAgIHRoaXMuc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIC8qKiBzbyB0aGUgZ3JpZCBmaXRzIGluIGV2ZXJ5IG5ldyBkYXRhIGlucHV0ICovXG4gICAgICAgIHRyaWdnZXJXaW5kb3dSZXNpemUoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMubGFzdFRvdGFsUm93cyA9IHRvdGFsUm93cztcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB3cmFwR2V0Um93cyhvcHRpb25zOiBEYXRvR3JpZE9wdGlvbnMsIGdldFJvd3M/OiAocGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHZvaWQpIHtcbiAgICBjb25zdCBnZXRSb3dzQ2IgPSBnZXRSb3dzIHx8IG9wdGlvbnMuZGF0YXNvdXJjZS5nZXRSb3dzO1xuICAgIHJldHVybiAoZ2V0Um93c1BhcmFtczogSUdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgIGNvbnN0IHsgc3RhcnRSb3csIGVuZFJvdywgc29ydE1vZGVsLCBzdWNjZXNzQ2FsbGJhY2sgfSA9IGdldFJvd3NQYXJhbXM7XG4gICAgICBjb25zdCBwYWdlU2l6ZSA9IG9wdGlvbnMucGFnaW5hdGlvblBhZ2VTaXplIHx8IDEwMDtcbiAgICAgIGNvbnN0IGlzUmV0dXJuVG9DdXJyZW50UGFnZVJlcXVpcmVkID0gdGhpcy5wYWdlTnVtYmVyVG9SZXR1cm5BZnRlclJlZnJlc2ggPiAwO1xuICAgICAgY29uc3QgaXNQZW5kaW5nUmV0dXJuVG9QYWdlID0gaXNSZXR1cm5Ub0N1cnJlbnRQYWdlUmVxdWlyZWQgJiYgc3RhcnRSb3cgPT09IDA7XG5cbiAgICAgIGNvbnN0IHBhZ2VOdW1iZXIgPSBpc1JldHVyblRvQ3VycmVudFBhZ2VSZXF1aXJlZFxuICAgICAgICA/IHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoICsgMVxuICAgICAgICA6IE1hdGguY2VpbChlbmRSb3cgLyBwYWdlU2l6ZSk7XG5cbiAgICAgIHRoaXMucGFnZU51bWJlclRvUmV0dXJuQWZ0ZXJSZWZyZXNoID0gLTE7XG5cbiAgICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgICAgY29uc3QgbmV3UGFyYW1zOiBEYXRvR3JpZEdldFJvd3NQYXJhbXMgPSB7XG4gICAgICAgIC4uLmdldFJvd3NQYXJhbXMsXG4gICAgICAgIGZhaWxDYWxsYmFjazogKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBoYXNFcnJvcjogdHJ1ZSB9KTtcbiAgICAgICAgICB0aGlzLnNldE92ZXJsYXkodHJ1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjazogdGhpcy53cmFwU3VjY2Vzc0NhbGxiYWNrKHsgcGFnZU51bWJlciwgc3VjY2Vzc0NiOiBzdWNjZXNzQ2FsbGJhY2ssIGlzUGVuZGluZ1JldHVyblRvUGFnZSB9KSxcbiAgICAgICAgc2VydmVyQ29uZmlnOiB7XG4gICAgICAgICAgcGFnZVNpemUsXG4gICAgICAgICAgcGFnZU51bWJlcixcbiAgICAgICAgICBjb2x1bW5GaWx0ZXJzOiBpc0VtcHR5KGZpbHRlcikgfHwgb3B0aW9ucy5lbmFibGVWMl8xID8gbnVsbCA6IHRoaXMuYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVycyhmaWx0ZXIpLFxuICAgICAgICAgIGZpbHRlcjogb3B0aW9ucy5lbmFibGVWMl8xID8gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEob3B0aW9ucy5jb2x1bW5EZWZzKSA6IG51bGwsXG4gICAgICAgICAgc29ydDogdGhpcy5idWlsZFNlcnZlclJlcXVlc3RTb3J0KHNvcnRNb2RlbClcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIGlmIChpc1BlbmRpbmdSZXR1cm5Ub1BhZ2UpIHtcbiAgICAgICAgLy8gU2NlbmFyaW8gdGhlIGZvbGxvd2luZyBoYW5kbGVzIC0gc2VydmVyIHJlZnJlc2ggd2hlcmUgaXQgd2FzIHJlcXVlc3RlZCB0byBrZWVwIHRoZSBjdXJyZW50IHBhZ2UuXG4gICAgICAgIC8vIFRoZSBwcm9ibGVtIC0gZ2V0Um93cyB3aWxsIGluaXRpYWxseSBiZSBjYWxsZWQgZm9yIHBhZ2UgMSAoYXV0b21hdGljYWxseSBoYXBwZW5zIHdoZW4gY2FsbGluZyBhZy1ncmlkJ3Mgc2V0RGF0YVNvdXJjZSkuXG4gICAgICAgIC8vIEluIG9yZGVyIHRvIHRyaWdnZXIgaXQgYWdhaW4sIHN1Y2Nlc3NDYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgZGVzaXJlZCBwYWdlLlxuICAgICAgICAvLyBmYWtlR2V0Um93cyBpcyB1c2VkIGluIG9yZGVyIHRvIGF2b2lkIHJldHJpZXZpbmcgdGhlIHVubmVjZXNzYXJ5IHJlYWwgZGF0YSBmb3IgcGFnZSAxLlxuICAgICAgICBjb25zdCBmYWtlR2V0Um93cyA9ICh7IHN1Y2Nlc3NDYWxsYmFjayB9OiBEYXRvR3JpZEdldFJvd3NQYXJhbXMpID0+IHtcbiAgICAgICAgICBzdWNjZXNzQ2FsbGJhY2soW10sIHRoaXMubGFzdFRvdGFsUm93cyk7XG4gICAgICAgIH07XG4gICAgICAgIGZha2VHZXRSb3dzKG5ld1BhcmFtcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBnZXRSb3dzQ2IobmV3UGFyYW1zKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0RWRpdGFibGVDb2x1bW5zQ2VsbENsYXNzKHBhcmFtczogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIHBhcmFtcy5ncmlkT3B0aW9ucy5jb2x1bW5EZWZzLmZvckVhY2goY29sRGVmID0+IHtcbiAgICAgIGlmIChjb2xEZWYuZWRpdGFibGUpIHtcbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oY29sRGVmLmVkaXRhYmxlKSkge1xuICAgICAgICAgIGNvbnN0IGluaXRpYWxDZWxsQ2xhc3MgPSBjb2xEZWYuY2VsbENsYXNzO1xuICAgICAgICAgIGNvbERlZi5jZWxsQ2xhc3MgPSAoY2VsbENsYXNzUGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGlzRWRpdGFibGUgPSAoY29sRGVmLmVkaXRhYmxlIGFzIEZ1bmN0aW9uKShjZWxsQ2xhc3NQYXJhbXMgYXMgYW55KTtcbiAgICAgICAgICAgIGlmIChpc0VkaXRhYmxlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUmVzdWx0ID0gdGhpcy5hZGRFZGl0YWJsZUNlbGxDbGFzcyhpbml0aWFsQ2VsbENsYXNzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZWRpdGFibGVSZXN1bHQpID8gZWRpdGFibGVSZXN1bHQoY2VsbENsYXNzUGFyYW1zKSA6IGVkaXRhYmxlUmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oaW5pdGlhbENlbGxDbGFzcykgPyBpbml0aWFsQ2VsbENsYXNzKGNlbGxDbGFzc1BhcmFtcykgOiBpbml0aWFsQ2VsbENsYXNzO1xuICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sRGVmLmNlbGxDbGFzcyA9IHRoaXMuYWRkRWRpdGFibGVDZWxsQ2xhc3MoY29sRGVmLmNlbGxDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgd3JhcENvbnRleHRNZW51QnVpbGRlcihwYXJhbXM6IE5vcm1hbGl6ZU9wdGlvbnNQYXJhbXMpIHtcbiAgICBjb25zdCB7IGN1c3RvbUNvbnRleHRNZW51IH0gPSBwYXJhbXMuZ3JpZE9wdGlvbnM7XG4gICAgY29uc3QgYWxsQWN0aW9ucyA9IGlzRnVuY3Rpb24oY3VzdG9tQ29udGV4dE1lbnUpID8gY3VzdG9tQ29udGV4dE1lbnUocGFyYW1zLnJvd0FjdGlvbnMpIDogcGFyYW1zLnJvd0FjdGlvbnM7XG4gICAgdGhpcy50cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9ucyk7XG4gICAgY29uc3QgY29weUFjdGlvbjogUm93QWN0aW9uID0ge1xuICAgICAgbGFiZWw6IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybSgnY29yZS5jb3B5LWNlbGwnKSxcbiAgICAgIGljb246ICdjb3B5JyxcbiAgICAgIGtleTogJ0NvcHkgQ2VsbCdcbiAgICB9O1xuICAgIHJldHVybiAoeyBub2RlLCBjb2x1bW4sIGNvbnRleHQgfTogR2V0Q29udGV4dE1lbnVJdGVtc1BhcmFtcykgPT4ge1xuICAgICAgY29uc3Qgb25Ib3ZlckFjdGlvbk1lbnUgPSBjb250ZXh0ICYmIGNvbnRleHQuY29udGV4dE1lbnUgJiYgY29udGV4dC5jb250ZXh0TWVudS5mcm9tT25Ib3ZlcjtcbiAgICAgIGlmICghbm9kZSkgcmV0dXJuIFtdO1xuICAgICAgbGV0IHNlbGVjdGVkID0gW25vZGVdO1xuICAgICAgbGV0IHJvd3NDb3VudCA9IDE7XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdGhpcy51cGRhdGVHcmlkQ29udGV4dCh7IGNvbnRleHRNZW51OiB7IGZyb21PbkhvdmVyOiBmYWxzZSB9IH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29weUFjdGlvbi5vbkNsaWNrID0gKFtyb3ddKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSB0aGlzLmFwaS5ncmlkLmdldFZhbHVlKGNvbHVtbi5nZXRDb2xJZCgpLCByb3cpO1xuICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IGNvbHVtbi5nZXRDb2xEZWYoKS52YWx1ZUZvcm1hdHRlcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyICE9PSAnc3RyaW5nJyA/IGZvcm1hdHRlcihyYXdWYWx1ZSkgOiByYXdWYWx1ZTtcbiAgICAgICAgICB3cml0ZVRvQ2xpcGJvYXJkKHZhbHVlKTtcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG5vZGUuaXNTZWxlY3RlZCgpKSB7XG4gICAgICAgICAgc2VsZWN0ZWQgPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWxlY3RlZFJvd05vZGVzKCk7XG4gICAgICAgICAgcm93c0NvdW50ID0gc2l6ZShzZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IHZpc2libGVBY3Rpb25zID0gZ2V0VmlzaWJsZUFjdGlvbnMoXG4gICAgICAgIGFsbEFjdGlvbnMsXG4gICAgICAgIHJvd3NDb3VudCxcbiAgICAgICAgc2VsZWN0ZWQsXG4gICAgICAgIHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWRcbiAgICAgICkuZmlsdGVyKCh7IHZpc2libGUgfSkgPT4gdmlzaWJsZSk7XG4gICAgICBsZXQgdG9vbGJhckFjdGlvbnMgPSBbY29weUFjdGlvbl07XG4gICAgICBpZiAob25Ib3ZlckFjdGlvbk1lbnUpIHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMgPSB2aXNpYmxlQWN0aW9ucztcbiAgICAgIH0gZWxzZSBpZiAodmlzaWJsZUFjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICB0b29sYmFyQWN0aW9ucyA9IFt7IC4uLmNvcHlBY3Rpb24sIHNlcGFyYXRvcjogdHJ1ZSB9LCAuLi52aXNpYmxlQWN0aW9uc107XG4gICAgICB9XG4gICAgICBjb25zdCBjb252ZXJ0ZXJQYXJhbXM6IEFjdGlvbkNvbnZlcnRlclBhcmFtcyA9IHtcbiAgICAgICAgdG9vbGJhckFjdGlvbnMsXG4gICAgICAgIHNlbGVjdGVkUm93czogc2VsZWN0ZWQsXG4gICAgICAgIGljb25SZWdpc3RyeTogdGhpcy5zdmdSZWdpc3RyeSxcbiAgICAgICAgbm9kZSxcbiAgICAgICAgbG9nZ2VyOiB7XG4gICAgICAgICAgbG9nOiB0aGlzLl9sb2dFdmVudC5iaW5kKHRoaXMpLFxuICAgICAgICAgIGV2ZW50T3JpZ2luOiBvbkhvdmVyQWN0aW9uTWVudSA/ICdPbiBIb3ZlcicgOiAnQ29udGV4dCBNZW51J1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIHRvb2xiYXJBY3Rpb25Ub0NvbnRleHRBY3Rpb24oY29udmVydGVyUGFyYW1zKTtcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSB0cmFuc2xhdGVBY3Rpb25MYWJlbHMoYWxsQWN0aW9uczogUm93QWN0aW9uW10pIHtcbiAgICBhbGxBY3Rpb25zLmZvckVhY2goYWN0aW9uID0+IHtcbiAgICAgIGFjdGlvbi5sYWJlbCA9IHRoaXMudHJhbnNsYXRlLnRyYW5zZm9ybShhY3Rpb24ubGFiZWwpO1xuICAgICAgaWYgKGFjdGlvbi5zdWJNZW51KSB7XG4gICAgICAgIHRoaXMudHJhbnNsYXRlQWN0aW9uTGFiZWxzKGFjdGlvbi5zdWJNZW51KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRTYXZlZFNldHRpbmdzKHNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgY29uc3Qge1xuICAgICAgc29ydCxcbiAgICAgIGhpZGRlbkNvbHVtbnMsXG4gICAgICBmaWx0ZXIsXG4gICAgICBncm91cGVkQ29sdW1ucyxcbiAgICAgIGNvbHVtbnNTaXplcyxcbiAgICAgIHBpbm5lZENvbHVtbnMsXG4gICAgICBjb2x1bW5zT3JkZXIsXG4gICAgICBncmlkQWxpZ25tZW50XG4gICAgfSA9IHNldHRpbmdzO1xuICAgIGNvbnN0IHsgZ3JpZCwgY29sdW1ucyB9ID0gdGhpcy5hcGk7XG4gICAgLyogSGlkZSBjb2x1bW5zICovXG4gICAgLyogTk9URTogY29sdW1ucyBvcmRlciBhcmUgdHJlYXRlZCBhcyB0aGUgY3VycmVudGx5IHZpc2libGUgY29sdW1ucyAqL1xuICAgIGNvbHVtbnMuc2V0Q29sdW1uc1Zpc2libGUodGhpcy5pbml0aWFsU2V0dGluZ3MuY29sdW1uc09yZGVyLCB0cnVlKTtcbiAgICBjb25zdCBjb2x1bW5Ub0hpZGUgPSAhaXNOaWwoaGlkZGVuQ29sdW1ucykgPyBoaWRkZW5Db2x1bW5zIDogdGhpcy5pbml0aWFsU2V0dGluZ3MuaGlkZGVuQ29sdW1ucztcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKGNvbHVtblRvSGlkZSwgZmFsc2UpO1xuXG4gICAgLyogQXBwbHkgZmlsdGVycyAqL1xuICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgIGdyaWQub25GaWx0ZXJDaGFuZ2VkKCk7XG4gICAgfVxuXG4gICAgLyogR3JvdXAgY29sdW1ucyAqL1xuICAgIGNvbnN0IGFsbEdyb3VwZWRDb2x1bW5zID0gY29sdW1ucy5nZXRSb3dHcm91cENvbHVtbnMoKTtcbiAgICBsZXQgcmVtb3ZlR3JvdXBlZDtcbiAgICBpZiAoZ3JvdXBlZENvbHVtbnMpIHtcbiAgICAgIHJlbW92ZUdyb3VwZWQgPSBhbGxHcm91cGVkQ29sdW1ucy5maWx0ZXIoY29sID0+ICFncm91cGVkQ29sdW1ucy5pbmNsdWRlcyhjb2wuZ2V0Q29sSWQoKSkpO1xuICAgICAgY29sdW1ucy5hZGRSb3dHcm91cENvbHVtbnMoZ3JvdXBlZENvbHVtbnMpO1xuICAgICAgY29sdW1ucy5zZXRDb2x1bW5zVmlzaWJsZShncm91cGVkQ29sdW1ucywgZmFsc2UpO1xuICAgIH1cbiAgICBjb2x1bW5zLnJlbW92ZVJvd0dyb3VwQ29sdW1ucyhyZW1vdmVHcm91cGVkKTtcbiAgICBjb2x1bW5zLnNldENvbHVtbnNWaXNpYmxlKHJlbW92ZUdyb3VwZWQsIHRydWUpO1xuXG4gICAgLyogQXBwbHkgc29ydCAqL1xuICAgIGNvbnN0IGdyaWRTb3J0ID0gc29ydCB8fCB0aGlzLmluaXRpYWxTZXR0aW5ncy5zb3J0O1xuICAgIGdyaWQuc2V0U29ydE1vZGVsKGdyaWRTb3J0ID8gW2dyaWRTb3J0XSA6IG51bGwpO1xuXG4gICAgLyogQWxpZ24gZ3JpZCAqL1xuICAgIGlmIChncmlkQWxpZ25tZW50ID09PSBEYXRvR3JpZEFsaWdubWVudC5DVVNUT00pIHtcbiAgICAgIC8qIFNldCBjb2x1bW4gc2l6ZXMgKi9cbiAgICAgIGNvbHVtbnNTaXplcyAmJlxuICAgICAgICBPYmplY3Qua2V5cyhjb2x1bW5zU2l6ZXMpLmZvckVhY2goY29sSWQgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW5zU2l6ZXNbY29sSWRdID09PSBEYXRvR3JpZEFsaWdubWVudC5GSVRfVE9fQ09OVEVOVCkge1xuICAgICAgICAgICAgY29sdW1ucy5hdXRvU2l6ZUNvbHVtbihjb2xJZCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbHVtbnMuc2V0Q29sdW1uV2lkdGgoY29sSWQsIGNvbHVtbnNTaXplc1tjb2xJZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdyaWRBbGlnbm1lbnQgPT09IERhdG9HcmlkQWxpZ25tZW50LkZJVF9UT19DT05URU5UID8gY29sdW1ucy5hdXRvU2l6ZUFsbENvbHVtbnMoKSA6IGdyaWQuc2l6ZUNvbHVtbnNUb0ZpdCgpO1xuICAgIH1cblxuICAgIC8qIFBpbiBjb2x1bW5zIGxlZnQgKi9cbiAgICBjb25zdCBmaWx0ZXJlZFBpbm5lZENvbHVtbnMgPSBwaW5uZWRDb2x1bW5zXG4gICAgICA/IHBpbm5lZENvbHVtbnMuZmlsdGVyKChjb2w6IHN0cmluZykgPT4gY29sICE9PSB0aGlzLkNIRUNLQk9YX1NFTEVDVElPTl9DT0xfSUQpXG4gICAgICA6IG51bGw7XG4gICAgY29uc3QgZmlsdGVyZWRDb2x1bW5zID0gY29sdW1uc09yZGVyXG4gICAgICA/IGNvbHVtbnNPcmRlci5maWx0ZXIoKGNvbDogc3RyaW5nKSA9PiBjb2wgIT09IHRoaXMuQ0hFQ0tCT1hfU0VMRUNUSU9OX0NPTF9JRClcbiAgICAgIDogbnVsbDtcbiAgICBzaXplKGZpbHRlcmVkUGlubmVkQ29sdW1ucykgPiAwXG4gICAgICA/IGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZFBpbm5lZENvbHVtbnMsICdsZWZ0JylcbiAgICAgIDogZmlsdGVyZWRDb2x1bW5zICYmIGNvbHVtbnMuc2V0Q29sdW1uc1Bpbm5lZChmaWx0ZXJlZENvbHVtbnMsIG51bGwpO1xuXG4gICAgLyogT3JkZXIgY29sdW1ucyAqL1xuICAgIGNvbHVtbnNPcmRlciAmJiBjb2x1bW5zLm1vdmVDb2x1bW5zKGNvbHVtbnNPcmRlciwgMCk7XG4gIH1cblxuICBnZXRTZXR0aW5nc0RpZmYoKTogUGFydGlhbDxEYXRvR3JpZFNldHRpbmdzPiB7XG4gICAgY29uc3QgY3VycmVudFN0YXRlID0gdGhpcy5ncmlkUXVlcnkuZ2V0Q3VycmVudEdyaWRTZXR0aW5ncygpO1xuICAgIHJldHVybiBkaWZmKGN1cnJlbnRTdGF0ZSwgdGhpcy5pbml0aWFsU2V0dGluZ3MpO1xuICB9XG5cbiAgcmVzZXRUYWJsZVNldHRpbmdzKCkge1xuICAgIGNvbnN0IHsgZmlsdGVyLCAuLi5yZXN0IH0gPSB0aGlzLmluaXRpYWxTZXR0aW5ncztcbiAgICBjb25zdCB7IGNvbHVtbnMgfSA9IHRoaXMuYXBpO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29sU2l6ZXMgPSBnZXRDb2x1bW5zU2l6ZXMoY29sdW1ucy5nZXRBbGxHcmlkQ29sdW1ucygpLCB0cnVlKTtcbiAgICBjb25zdCBncmlkQWxpZ25tZW50ID0gaXNFbXB0eShvcmlnaW5hbENvbFNpemVzKSA/IHJlc3QuZ3JpZEFsaWdubWVudCA6IERhdG9HcmlkQWxpZ25tZW50LkNVU1RPTTtcbiAgICBjb25zdCBuZXdTZXR0aW5ncyA9IHsgLi4ucmVzdCwgY29sdW1uc1NpemVzOiBvcmlnaW5hbENvbFNpemVzLCBncmlkQWxpZ25tZW50IH07XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5sb2FkU2F2ZWRTZXR0aW5ncyhuZXdTZXR0aW5ncyk7XG4gICAgdGhpcy5zYXZlU2V0dGluZ3NUb1NlcnZlcih7IGZpbHRlciB9KTtcbiAgfVxuXG4gIGluaXRTZXR0aW5ncyhzYXZlZFNldHRpbmdzOiBQYXJ0aWFsPERhdG9HcmlkU2V0dGluZ3M+KSB7XG4gICAgdGhpcy5pbml0aWFsU2V0dGluZ3MgPSB0aGlzLmdyaWRRdWVyeS5nZXRDdXJyZW50R3JpZFNldHRpbmdzKCk7XG4gICAgdGhpcy51cGRhdGVTZXR0aW5ncyhzYXZlZFNldHRpbmdzKTtcbiAgICB0aGlzLmxvYWRTYXZlZFNldHRpbmdzKHNhdmVkU2V0dGluZ3MpO1xuICB9XG5cbiAgbm90aWZ5RmlsdGVyVXBkYXRlKCkge1xuICAgIGNvbnN0IHdhdGNoID0gW3RoaXMuZ3JpZFJlZi5maWx0ZXJDaGFuZ2VkLmFzT2JzZXJ2YWJsZSgpXTtcbiAgICBpZiAodGhpcy5ncmlkUXVlcnkuaXNTZXJ2ZXJTaWRlKSB7XG4gICAgICB3YXRjaC5wdXNoKHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlckRhdGFMb2FkZWQkKTtcbiAgICAgIHRoaXMuc2V0TG9hZGluZyh0cnVlKTtcbiAgICB9XG4gICAgY29tYmluZUxhdGVzdCh3YXRjaClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICB1bnRpbERlc3Ryb3llZCh0aGlzKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IHJvd3NBZnRlckZpbHRlciA9IHRoaXMuYXBpLmdyaWQuZ2V0RGlzcGxheWVkUm93Q291bnQoKTtcbiAgICAgICAgdGhpcy5zZXRPdmVybGF5KHJvd3NBZnRlckZpbHRlciA9PT0gMCk7XG4gICAgICB9KTtcbiAgICB0aGlzLmFwaS5ncmlkLm9uRmlsdGVyQ2hhbmdlZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzKGZpbHRlcjogRGF0b0dyaWRGaWx0ZXJzTWFwKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzIHtcbiAgICBjb25zdCBjb2x1bW5zRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXJzID0ge307XG4gICAgZm9yIChjb25zdCBbY29sdW1uLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZmlsdGVyKSkge1xuICAgICAgY29uc3QgeyBieVZhbHVlLCBjb25kaXRpb25hbCB9ID0gdmFsdWU7XG4gICAgICBpZiAoYnlWYWx1ZSkge1xuICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dID0ge1xuICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCxcbiAgICAgICAgICBmaWx0ZXJzOiBbYnlWYWx1ZV1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb25kaXRpb25hbCkge1xuICAgICAgICBjb25zdCBjb25kaXRpb25hbEZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogY29uZGl0aW9uYWwub3BlcmF0b3IsXG4gICAgICAgICAgZmlsdGVyczogY29uZGl0aW9uYWwuY29uZGl0aW9ucy5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgICAgICBpZiAoY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JTl9SQU5HRSkge1xuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgICAgICBzdGFydDogdmFsdWUsXG4gICAgICAgICAgICAgICAgZW5kOiAoaXRlbSBhcyBEYXRvR3JpZFJhbmdlRmlsdGVyQ29uZGl0aW9uKS5yYW5nZUVuZFxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW0gYXMgRGF0b0dyaWRGaWx0ZXJDb25kaXRpb247XG4gICAgICAgICAgfSlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGJ5VmFsdWUpIHtcbiAgICAgICAgICBjb2x1bW5zRmlsdGVyc1tjb2x1bW5dLmZpbHRlcnMucHVzaChjb25kaXRpb25hbEZpbHRlcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29sdW1uc0ZpbHRlcnNbY29sdW1uXSA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbHVtbnNGaWx0ZXJzO1xuICB9XG5cbiAgYnVpbGRTZXJ2ZXJSZXF1ZXN0RmlsdGVyc192Ml8xKGdyaWRDb2x1bW5zOiBEYXRvR3JpZENvbHVtbkRlZltdKTogU2VydmVyU2lkZVBhZ2luYXRpb25GaWx0ZXIge1xuICAgIGNvbnN0IGZpbHRlciA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEZpbHRlcigpO1xuICAgIGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLmdyaWRRdWVyeS5nZXRTZWFyY2hUZXJtKCk7XG5cbiAgICBsZXQgY29sdW1uRmlsdGVycyA9IHRoaXMuYnVpbGRTZXJ2ZXJDb2x1bW5GaWx0ZXJzX3YyXzEoZmlsdGVyKTtcbiAgICBpZiAoY29sdW1uRmlsdGVycy5ldmVyeSgoeyBvcGVyYXRvciB9OiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcikgPT4gb3BlcmF0b3IgPT09IE9wZXJhdG9yVHlwZXMuQU5EKSkge1xuICAgICAgY29uc3QgZmxhdHRlbmVkRmlsdGVycyA9IGNvbHVtbkZpbHRlcnNcbiAgICAgICAgLm1hcCgoeyBmaWx0ZXJzIH06IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyKSA9PiBmaWx0ZXJzKVxuICAgICAgICAucmVkdWNlKChhcnIsIHJlcykgPT4gcmVzLmNvbmNhdChhcnIpLCBbXSk7XG4gICAgICBjb2x1bW5GaWx0ZXJzID0gW1xuICAgICAgICB7XG4gICAgICAgICAgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELFxuICAgICAgICAgIGZpbHRlcnM6IGZsYXR0ZW5lZEZpbHRlcnNcbiAgICAgICAgfVxuICAgICAgXTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKGNvbHVtbkZpbHRlcnMpID4gMVxuICAgICAgICA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuQU5ELCBmaWx0ZXJzOiBjb2x1bW5GaWx0ZXJzIH1cbiAgICAgICAgOiBzaXplKGNvbHVtbkZpbHRlcnMpID09PSAxXG4gICAgICAgID8gY29sdW1uRmlsdGVyc1swXVxuICAgICAgICA6IG51bGw7XG4gICAgaWYgKCFzZWFyY2hUZXJtKSB7XG4gICAgICByZXR1cm4gY29sdW1uRmlsdGVyO1xuICAgIH1cbiAgICBjb25zdCB7IGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfSA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEdyaWRPcHRpb25zKCk7XG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbnMgPSBncmlkQ29sdW1ucy5maWx0ZXIoKGNvbERlZjogRGF0b0dyaWRDb2x1bW5EZWYpID0+IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNvbERlZi5pbmNsdWRlSW5TZWFyY2ggJiYgKGluY2x1ZGVIaWRkZW5Db2x1bW5zSW5TZWFyY2ggfHwgdGhpcy5hcGkuY29sdW1ucy5nZXRDb2x1bW4oY29sRGVmLmNvbElkKS5pc1Zpc2libGUoKSlcbiAgICAgICk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyczogU2VydmVyU2lkZVBhZ2luYXRpb25Db25kaXRpb25bXSA9IHNlYXJjaGFibGVDb2x1bW5zLm1hcCgoeyBmaWVsZCB9OiBEYXRvR3JpZENvbHVtbkRlZikgPT4gKHtcbiAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuQ09OVEFJTlMsXG4gICAgICB2YWx1ZTogc2VhcmNoVGVybSxcbiAgICAgIGNvbHVtbjogZmllbGRcbiAgICB9KSk7XG4gICAgY29uc3Qgc2VhcmNoRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9XG4gICAgICBzaXplKHNlYXJjaEZpbHRlcnMpID4gMCA/IHsgb3BlcmF0b3I6IE9wZXJhdG9yVHlwZXMuT1IsIGZpbHRlcnM6IHNlYXJjaEZpbHRlcnMgfSA6IG51bGw7XG4gICAgaWYgKCFjb2x1bW5GaWx0ZXIpIHtcbiAgICAgIHJldHVybiBzZWFyY2hGaWx0ZXI7XG4gICAgfVxuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVyczogW2NvbHVtbkZpbHRlciwgc2VhcmNoRmlsdGVyXSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNlcnZlckNvbHVtbkZpbHRlcnNfdjJfMShmaWx0ZXI6IERhdG9HcmlkRmlsdGVyc01hcCk6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyW10ge1xuICAgIGxldCBjb2x1bW5GaWx0ZXJzOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlcltdID0gW107XG5cbiAgICBmb3IgKGNvbnN0IFtjb2x1bW4sIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhmaWx0ZXIpKSB7XG4gICAgICBsZXQgY29sdW1uRmlsdGVyOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciA9IG51bGw7XG4gICAgICBjb25zdCB7IGJ5VmFsdWUsIGNvbmRpdGlvbmFsIH0gPSB2YWx1ZTtcbiAgICAgIGlmIChieVZhbHVlKSB7XG4gICAgICAgIGNvbHVtbkZpbHRlciA9IHtcbiAgICAgICAgICBvcGVyYXRvcjogT3BlcmF0b3JUeXBlcy5BTkQsXG4gICAgICAgICAgZmlsdGVyczogW3sgY29sdW1uLCAuLi5ieVZhbHVlIH1dXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBpZiAoY29uZGl0aW9uYWwpIHtcbiAgICAgICAgY29uc3QgY29uZGl0aW9uYWxGaWx0ZXI6IFNlcnZlclNpZGVQYWdpbmF0aW9uRmlsdGVyID0gdGhpcy5nZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihjb25kaXRpb25hbCwgY29sdW1uKTtcbiAgICAgICAgaWYgKGNvbHVtbkZpbHRlcikge1xuICAgICAgICAgIGNvbHVtbkZpbHRlci5maWx0ZXJzLnB1c2goY29uZGl0aW9uYWxGaWx0ZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbHVtbkZpbHRlciA9IGNvbmRpdGlvbmFsRmlsdGVyO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb2x1bW5GaWx0ZXJzLnB1c2goY29sdW1uRmlsdGVyKTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbHVtbkZpbHRlcnM7XG4gIH1cblxuICBnZXRGaWx0ZXJGb3JTZXJ2ZXJBY3Rpb25PblNlbGVjdEFsbCgpOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgY29uc3QgeyBleGNsdWRlZEZyb21TZWxlY3RBbGwgfSA9IHRoaXMuZ3JpZFF1ZXJ5LnNlcnZlclNpZGVDb25maWc7XG4gICAgY29uc3QgeyBjb2x1bW5EZWZzLCBpZENvbHVtbktleSB9ID0gdGhpcy5ncmlkUXVlcnkuZ2V0R3JpZE9wdGlvbnMoKTtcbiAgICBjb25zdCBtYWluRmlsdGVyID0gdGhpcy5idWlsZFNlcnZlclJlcXVlc3RGaWx0ZXJzX3YyXzEoY29sdW1uRGVmcyk7XG4gICAgaWYgKGlzRW1wdHkoZXhjbHVkZWRGcm9tU2VsZWN0QWxsKSkge1xuICAgICAgcmV0dXJuIG1haW5GaWx0ZXI7XG4gICAgfVxuICAgIGNvbnN0IGV4Y2x1ZGVkUm93c0ZpbHRlcjogU2VydmVyU2lkZVBhZ2luYXRpb25MaXN0Q29uZGl0aW9uID0ge1xuICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfSU5fTElTVCxcbiAgICAgIHZhbHVlczogZXhjbHVkZWRGcm9tU2VsZWN0QWxsLFxuICAgICAgY29sdW1uOiBpZENvbHVtbktleVxuICAgIH07XG4gICAgY29uc3QgZmlsdGVycyA9IG1haW5GaWx0ZXIgPyBbbWFpbkZpbHRlciwgZXhjbHVkZWRSb3dzRmlsdGVyXSA6IFtleGNsdWRlZFJvd3NGaWx0ZXJdO1xuICAgIHJldHVybiB7IG9wZXJhdG9yOiBPcGVyYXRvclR5cGVzLkFORCwgZmlsdGVycyB9O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTZXJ2ZXJDb25kaXRpb25hbEZpbHRlcihcbiAgICBjb25kaXRpb25hbEZpbHRlcjogRGF0b0dyaWRDb25kaXRpb25hbEZpbHRlcixcbiAgICBjb2x1bW46IHN0cmluZ1xuICApOiBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkZpbHRlciB7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdG9yOiBjb25kaXRpb25hbEZpbHRlci5vcGVyYXRvcixcbiAgICAgIGZpbHRlcnM6IGNvbmRpdGlvbmFsRmlsdGVyLmNvbmRpdGlvbnMubWFwKGl0ZW0gPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmRpdGlvbiwgdmFsdWUgfSA9IGl0ZW07XG4gICAgICAgIGlmIChjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklOX1JBTkdFKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbixcbiAgICAgICAgICAgIHN0YXJ0OiB2YWx1ZSxcbiAgICAgICAgICAgIGVuZDogKGl0ZW0gYXMgRGF0b0dyaWRSYW5nZUZpbHRlckNvbmRpdGlvbikucmFuZ2VFbmQsXG4gICAgICAgICAgICBjb2x1bW5cbiAgICAgICAgICB9IGFzIFNlcnZlclNpZGVQYWdpbmF0aW9uUmFuZ2VDb25kaXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfRU1QVFkgfHwgY29uZGl0aW9uID09PSBEYXRvRmlsdGVyQ29uZGl0aW9ucy5OT1RfRU1QVFkpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29uZGl0aW9uOiBEYXRvRmlsdGVyQ29uZGl0aW9ucy5JU19FTVBUWSxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX0VNUFRZID8gJ3RydWUnIDogJ2ZhbHNlJyxcbiAgICAgICAgICAgIGNvbHVtblxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCB8fCBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLk5PVF9OVUxMKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGNvbmRpdGlvbjogRGF0b0ZpbHRlckNvbmRpdGlvbnMuSVNfTlVMTCxcbiAgICAgICAgICAgIHZhbHVlOiBjb25kaXRpb24gPT09IERhdG9GaWx0ZXJDb25kaXRpb25zLklTX05VTEwgPyAndHJ1ZScgOiAnZmFsc2UnLFxuICAgICAgICAgICAgY29sdW1uXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5pdGVtLCBjb2x1bW4gfSBhcyBTZXJ2ZXJTaWRlUGFnaW5hdGlvbkNvbmRpdGlvbjtcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRTZXJ2ZXJSZXF1ZXN0U29ydChzb3J0TW9kZWw6IERhdG9HcmlkU29ydFtdKTogRGF0b0dyaWRTZXJ2ZXJTb3J0W10ge1xuICAgIHJldHVybiBzb3J0TW9kZWwubWFwKCh7IGNvbElkLCBzb3J0IH0pID0+ICh7XG4gICAgICBjb2x1bW46IGNvbElkLFxuICAgICAgc29ydE9yZGVyOiBzb3J0LnRvVXBwZXJDYXNlKCkgYXMgRGF0b0dyaWRTZXJ2ZXJTb3J0RGlyZWN0aW9uXG4gICAgfSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRFZGl0YWJsZUNlbGxDbGFzcyhcbiAgICBjZWxsQ2xhc3NWYWx1ZTogc3RyaW5nIHwgc3RyaW5nW10gfCAoKGNlbGxDbGFzc1BhcmFtczogQ2VsbENsYXNzUGFyYW1zKSA9PiBzdHJpbmcgfCBzdHJpbmdbXSlcbiAgKSB7XG4gICAgaWYgKGlzTmlsKGNlbGxDbGFzc1ZhbHVlKSkge1xuICAgICAgcmV0dXJuICdkYXRvLWVkaXRhYmxlLWNlbGwnO1xuICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihjZWxsQ2xhc3NWYWx1ZSkpIHtcbiAgICAgIHJldHVybiBjZWxsQ2xhc3NQYXJhbXMgPT4ge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUoY2VsbENsYXNzUGFyYW1zKSk7XG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5nZXRFZGl0YWJsZUNsYXNzQXJyYXkoY2VsbENsYXNzVmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFZGl0YWJsZUNsYXNzQXJyYXkoY3VycmVudENsYXNzOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjZWxsQ2xhc3MgPSBjb2VyY2VBcnJheShjdXJyZW50Q2xhc3MpO1xuICAgIGNlbGxDbGFzcy5wdXNoKCdkYXRvLWVkaXRhYmxlLWNlbGwnKTtcbiAgICByZXR1cm4gY2VsbENsYXNzO1xuICB9XG5cbiAgc2VsZWN0QWxsQ3VycmVudFBhZ2VSb3dzKGlzU2VsZWN0ZWQgPSB0cnVlLCBjb25zaWRlckV4Y2x1ZGVkID0gZmFsc2UpIHtcbiAgICBsZXQgcm93c0ZvclNlbGVjdGlvbiA9IHRoaXMuZ3JpZFF1ZXJ5LmdldEN1cnJlbnRQYWdlUm93cygpO1xuICAgIGlmIChjb25zaWRlckV4Y2x1ZGVkKSB7XG4gICAgICBjb25zdCB7IGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbCB9ID0gdGhpcy5ncmlkUXVlcnkuc2VydmVyU2lkZUNvbmZpZztcbiAgICAgIGlmICghaXNFbXB0eShleGNsdWRlZEZyb21TZWxlY3RBbGwpKSB7XG4gICAgICAgIHJvd3NGb3JTZWxlY3Rpb24gPSByb3dzRm9yU2VsZWN0aW9uLmZpbHRlcigoeyBpZCB9OiBSb3dOb2RlKSA9PiAhZXhjbHVkZWRGcm9tU2VsZWN0QWxsLmluY2x1ZGVzKGlkKSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlzU2VsZWN0ZWQgPyB0aGlzLnNlbGVjdFJvd3Mocm93c0ZvclNlbGVjdGlvbikgOiB0aGlzLmRlc2VsZWN0Um93cyhyb3dzRm9yU2VsZWN0aW9uKTtcbiAgfVxuXG4gIGRlc2VsZWN0QWxsUm93cygpIHtcbiAgICB0aGlzLmFwaS5ncmlkLmRlc2VsZWN0QWxsKCk7XG4gICAgaWYgKHRoaXMuZ3JpZFF1ZXJ5LmlzU2VydmVyU2VsZWN0QWxsUm93c0VuYWJsZWQpIHtcbiAgICAgIHRoaXMuc2V0U2VydmVyU2lkZVBhZ2luYXRpb24oeyBzZWxlY3RBbGxSb3dzRW5hYmxlZDogZmFsc2UsIGV4Y2x1ZGVkRnJvbVNlbGVjdEFsbDogW10gfSk7XG4gICAgfVxuICB9XG5cbiAgcmVzb2x2ZVJvd0FjdGlvbnNWaXNpYmlsaXR5KCkge1xuICAgIHRoaXMuZ3JpZFF1ZXJ5Ll9yb3dBY3Rpb25WaXNpYmlsaXR5Q2hhbmdlZC5uZXh0KCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBwaXZvdGluZyxcbiAgICogd2UgYWRkIHRoZSBmaWVsZCBuYW1lIHRvIHRoZSBjb2x1bW4gaGVhZGVyIGNsYXNzIGluIG9yZGVyIHRvIGFjY2VzcyBpdCB0aHJvdWdoIHRoZSBhdXRvIGdlbmVyYXRlZCBwaXZvdCBjb2x1bW4uXG4gICAqL1xuICBwcml2YXRlIGluaXRQaXZvdFNlY29uZGFyeUNvbHNQcm9jZXNzKHsgZ3JpZE9wdGlvbnMgfTogTm9ybWFsaXplT3B0aW9uc1BhcmFtcykge1xuICAgIC8qKiBVc2UgcHJvY2Vzc1Bpdm90UmVzdWx0Q29sRGVmIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbERlZiA9IGNvbERlZiA9PiB7XG4gICAgICBjb25zdCB1c2VyUHJvdmlkZWRDb2xEZWYgPSBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbiAmJiBjb2xEZWYucGl2b3RWYWx1ZUNvbHVtbi5nZXRVc2VyUHJvdmlkZWRDb2xEZWYoKTtcblxuICAgICAgaWYgKHVzZXJQcm92aWRlZENvbERlZikge1xuICAgICAgICBjb2xEZWYuZmlsdGVyID0gdXNlclByb3ZpZGVkQ29sRGVmLmZpbHRlcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGNvbERlZi5waXZvdEtleXMpIHtcbiAgICAgICAgY29sRGVmLnBpdm90S2V5cyA9IGNvbERlZi5waXZvdEtleXMubWFwKGtleSA9PiB7XG4gICAgICAgICAgY29uc3QgcGFyc2VkS2V5ID0gdHJ5UGFyc2VQaXZvdFZhbHVlKGtleSk7XG5cbiAgICAgICAgICByZXR1cm4gKHBhcnNlZEtleSAmJiBwYXJzZWRLZXkudmFsdWUpIHx8ICcnO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgLyoqIFVzZSBwcm9jZXNzUGl2b3RSZXN1bHRDb2xHcm91cERlIGZyb20gdmVyIDI4ICovXG4gICAgZ3JpZE9wdGlvbnMucHJvY2Vzc1NlY29uZGFyeUNvbEdyb3VwRGVmID0gKGNvbEdyb3VwRGVmOiBDb2xHcm91cERlZikgPT4ge1xuICAgICAgaWYgKGNvbEdyb3VwRGVmLmhlYWRlck5hbWUpIHtcbiAgICAgICAgY29uc3QgcGFyc2VkVmFsdWUgPSB0cnlQYXJzZVBpdm90VmFsdWUoY29sR3JvdXBEZWYuaGVhZGVyTmFtZSk7XG5cbiAgICAgICAgaWYgKHBhcnNlZFZhbHVlKSB7XG4gICAgICAgICAgY29uc3QgeyBmaWVsZCwgdmFsdWUgfSA9IHBhcnNlZFZhbHVlO1xuXG4gICAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbZmllbGRdO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB2YWx1ZTtcblxuICAgICAgICAgIGlmIChjb2xHcm91cERlZi5jaGlsZHJlbiAmJiBjb2xHcm91cERlZi5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcy5wdXNoKCdncm91cC1waXZvdC1jZWxsJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKGNvbEdyb3VwRGVmLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IFtjb2xDaGlsZF06IGFueSA9IGNvbEdyb3VwRGVmLmNoaWxkcmVuO1xuICAgICAgICBjb25zdCBwaXZvdFRvdGFsQ29sdW1uSWRzID0gY29sQ2hpbGQgJiYgY29sQ2hpbGQucGl2b3RUb3RhbENvbHVtbklkcztcblxuICAgICAgICBpZiAocGl2b3RUb3RhbENvbHVtbklkcyAmJiBwaXZvdFRvdGFsQ29sdW1uSWRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICBjb2xHcm91cERlZi5oZWFkZXJDbGFzcyA9IFsndG90YWwtcGl2b3QtY2VsbCddO1xuICAgICAgICAgIGNvbEdyb3VwRGVmLmhlYWRlck5hbWUgPSB0aGlzLnRyYW5zbGF0ZS50cmFuc2Zvcm0oJ2NvcmUudG90YWwnKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29sR3JvdXBEZWYuaGVhZGVyQ2xhc3MgPSBbJ2VtcHR5LXBpdm90LWhlYWRlciddO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29sR3JvdXBEZWYucGl2b3RLZXlzKSB7XG4gICAgICAgIGNvbEdyb3VwRGVmLnBpdm90S2V5cyA9IGNvbEdyb3VwRGVmLnBpdm90S2V5cy5tYXAoa2V5ID0+IHtcbiAgICAgICAgICBjb25zdCBwYXJzZWRLZXkgPSB0cnlQYXJzZVBpdm90VmFsdWUoa2V5KTtcblxuICAgICAgICAgIHJldHVybiAocGFyc2VkS2V5ICYmIHBhcnNlZEtleS52YWx1ZSkgfHwgJyc7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIHNldFBpdm90TW9kZVJvd3M8VD4oZGF0YTogVFtdKSB7XG4gICAgY29uc3QgcGl2b3RDb2x1bW5zID0gdGhpcy5ncmlkUXVlcnkuZ2V0QWxsUGl2b3RDb2x1bW5zKCk7XG4gICAgY29uc3QgY29udmVydGVkRGF0YSA9IGRhdGEubWFwKChjdXJyZW50VmFsdWUsIGluZGV4KSA9PiB7XG4gICAgICBjb25zdCBtYXBwZWRWYWx1ZXMgPSB7IC4uLmN1cnJlbnRWYWx1ZSB9O1xuXG4gICAgICBmb3IgKGNvbnN0IGNvbCBvZiBwaXZvdENvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSBjb2wuZ2V0Q29sRGVmKCkuZmllbGQ7XG4gICAgICAgIGNvbnN0IHBpdm90VmFsdWU6IFBpdm90Q29sdW1uRGF0YSA9IHsgZmllbGQsIHZhbHVlOiBjdXJyZW50VmFsdWVbZmllbGRdIH07XG5cbiAgICAgICAgbWFwcGVkVmFsdWVzW2ZpZWxkXSA9IEpTT04uc3RyaW5naWZ5KHBpdm90VmFsdWUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbWFwcGVkVmFsdWVzO1xuICAgIH0pO1xuXG4gICAgdGhpcy5hcGkuZ3JpZC5zZXRSb3dEYXRhKGNvbnZlcnRlZERhdGEpO1xuICB9XG5cbiAgLyoqIE5vIGRlY2xhcmVkIGludGVyZmFjZSBpbiBjdXJyZW50IGdyaWQgdmVyc2lvbiB5ZXQuXG4gICAqICBSZWZlciBkb2NzIC0gaHR0cHM6Ly93d3cuYWctZ3JpZC5jb20vYW5ndWxhci1kYXRhLWdyaWQvY2VsbC1zdHlsZXMvI2NlbGwtY2xhc3MtcnVsZXMgKi9cbiAgcHJpdmF0ZSBnZXRQaXZvdE1vZGVDZWxsQ2xhc3NSdWxlcygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2V2ZW4tcm93LWdyb3VwLWxlYWYtY2VsbCc6IHRoaXMuaXNMZWFmR3JvdXBFdmVuQ2VsbC5iaW5kKHRoaXMpLFxuICAgICAgJ3Jvdy1ncm91cC1yb290LWNlbGwnOiB0aGlzLmlzUm93R3JvdXBWYWx1ZWRDZWxsLmJpbmQodGhpcylcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBpc0xlYWZHcm91cEV2ZW5DZWxsKHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogYm9vbGVhbiB7XG4gICAgY29uc3QgeyBsZWFmR3JvdXAsIGNoaWxkSW5kZXgsIHJvd0dyb3VwSW5kZXggfSA9IHBhcmFtcy5ub2RlO1xuICAgIGNvbnN0IGNvbEluZGV4ID0gdGhpcy5nZXRDZWxsQ2xhc3NSdWxlQ29sSW5kZXgocGFyYW1zKTtcblxuICAgIHJldHVybiByb3dHcm91cEluZGV4IDw9IGNvbEluZGV4ICYmIGxlYWZHcm91cCAmJiBjaGlsZEluZGV4ICUgMiA9PT0gMDtcbiAgfVxuXG4gIHByaXZhdGUgaXNSb3dHcm91cFZhbHVlZENlbGwocGFyYW1zOiBDZWxsQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgICBjb25zdCB7IGxlYWZHcm91cCwgcm93R3JvdXBJbmRleCB9ID0gcGFyYW1zLm5vZGU7XG4gICAgY29uc3QgY29sSW5kZXggPSB0aGlzLmdldENlbGxDbGFzc1J1bGVDb2xJbmRleChwYXJhbXMpO1xuXG4gICAgcmV0dXJuIHJvd0dyb3VwSW5kZXggPD0gY29sSW5kZXggJiYgIWxlYWZHcm91cDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q2VsbENsYXNzUnVsZUNvbEluZGV4KHBhcmFtczogQ2VsbENsYXNzUGFyYW1zKTogbnVtYmVyIHtcbiAgICBjb25zdCBncmlkUXVlcnkgPSBwYXJhbXMuY29sRGVmLmhlYWRlckNvbXBvbmVudFBhcmFtcy5ncmlkUXVlcnk7XG5cbiAgICBpZiAoZ3JpZFF1ZXJ5ICYmIGdyaWRRdWVyeS5hcGkpIHtcbiAgICAgIGNvbnN0IHsgY29sdW1ucyB9ID0gZ3JpZFF1ZXJ5LmFwaSBhcyBEYXRvR3JpZEFwaTtcbiAgICAgIGNvbnN0IGFsbERpc3BsYXllZENvbHVtbnMgPSBjb2x1bW5zLmdldEFsbERpc3BsYXllZENvbHVtbnMoKTtcbiAgICAgIGNvbnN0IGRpc3BsYXllZENvbHVtbiA9IGFsbERpc3BsYXllZENvbHVtbnMuZmluZChjb2wgPT4gY29sLmdldENvbElkKCkgPT09IHBhcmFtcy5jb2xEZWYuY29sSWQpO1xuXG4gICAgICByZXR1cm4gYWxsRGlzcGxheWVkQ29sdW1ucy5pbmRleE9mKGRpc3BsYXllZENvbHVtbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xuICB9XG59XG4iXX0=