@annalib/anna-core 20.5.5 → 20.6.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 (122) hide show
  1. package/README.md +28 -28
  2. package/esm2022/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.mjs +5 -5
  3. package/esm2022/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.mjs +4 -4
  4. package/esm2022/lib/anna-core-shared-lib/components/anna-est-icon-template/anna-est-icon-template.component.mjs +4 -4
  5. package/esm2022/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.mjs +14 -14
  6. package/esm2022/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.mjs +5 -5
  7. package/esm2022/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.mjs +7 -7
  8. package/esm2022/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.mjs +4 -4
  9. package/esm2022/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.mjs +5 -5
  10. package/esm2022/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.mjs +5 -5
  11. package/esm2022/lib/anna-core-shared-lib/constants/shared.constant.mjs +21 -21
  12. package/esm2022/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.mjs +52 -52
  13. package/esm2022/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.mjs +5 -5
  14. package/esm2022/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.mjs +7 -7
  15. package/esm2022/lib/anna-core-shared-lib/models/anna-generic-data-type.model.mjs +1 -1
  16. package/esm2022/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.mjs +1 -1
  17. package/esm2022/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.mjs +1 -1
  18. package/esm2022/lib/anna-core-shared-lib/models/anna-sort.model.mjs +1 -1
  19. package/esm2022/lib/anna-core-shared-lib/models/anna-tooltip.model.mjs +3 -3
  20. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.mjs +8 -8
  21. package/esm2022/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.mjs +5 -5
  22. package/esm2022/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.mjs +5 -5
  23. package/esm2022/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.mjs +6 -6
  24. package/esm2022/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.mjs +5 -5
  25. package/esm2022/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.mjs +3 -3
  26. package/esm2022/lib/anna-core-shared-lib/services/anna-date-time-format.service.mjs +84 -84
  27. package/esm2022/lib/anna-core-shared-lib/services/anna-filter.service.mjs +368 -359
  28. package/esm2022/lib/anna-core-shared-lib/services/anna-generic-table.service.mjs +20 -20
  29. package/esm2022/lib/anna-core-shared-lib/services/anna-global-config.service.mjs +32 -32
  30. package/esm2022/lib/anna-core-shared-lib/services/anna-number-format.service.mjs +9 -9
  31. package/esm2022/lib/anna-core-shared-lib/services/anna-persisting-filter.service.mjs +12 -12
  32. package/esm2022/lib/anna-core-shared-lib/services/anna-sort.service.mjs +32 -32
  33. package/esm2022/lib/anna-core.module.mjs +45 -45
  34. package/esm2022/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.mjs +15 -15
  35. package/esm2022/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.mjs +42 -42
  36. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.mjs +16 -16
  37. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.mjs +14 -14
  38. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.mjs +18 -18
  39. package/esm2022/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.mjs +16 -16
  40. package/esm2022/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.mjs +282 -273
  41. package/esm2022/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.mjs +11 -11
  42. package/esm2022/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.mjs +23 -23
  43. package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.mjs +10 -10
  44. package/esm2022/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.mjs +2 -2
  45. package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.mjs +12 -12
  46. package/esm2022/lib/anna-generic-table-lib/directives/anna-virtual-table/index.mjs +2 -2
  47. package/esm2022/public-api.mjs +43 -43
  48. package/fesm2022/annalib-anna-core.mjs +1030 -1012
  49. package/fesm2022/annalib-anna-core.mjs.map +1 -1
  50. package/lib/anna-core-shared-lib/components/anna-buyer-approval-icon-template/anna-buyer-approval-icon-template.component.d.ts +1 -1
  51. package/lib/anna-core-shared-lib/components/anna-deleted-order-icon-template/anna-deleted-order-icon-template.component.d.ts +1 -1
  52. package/lib/anna-core-shared-lib/components/anna-icon-column/anna-icon-column.component.d.ts +3 -3
  53. package/lib/anna-core-shared-lib/components/anna-live-icon-template/anna-live-icon-template.component.d.ts +1 -1
  54. package/lib/anna-core-shared-lib/components/anna-no-data/anna-no-data.component.d.ts +1 -1
  55. package/lib/anna-core-shared-lib/components/anna-notify-icon-template/anna-notify-icon-template.component.d.ts +1 -1
  56. package/lib/anna-core-shared-lib/components/anna-pay-for-performance-icon-template/anna-pay-for-performance-icon-template.component.d.ts +1 -1
  57. package/lib/anna-core-shared-lib/components/anna-rejected-icon-template/anna-rejected-icon-template.component.d.ts +1 -1
  58. package/lib/anna-core-shared-lib/directives/digits-only/digits-only.directive.d.ts +1 -1
  59. package/lib/anna-core-shared-lib/directives/fixed-rows-popup-table/fixed-rows-popup-table.directive.d.ts +1 -1
  60. package/lib/anna-core-shared-lib/directives/show-ellipsis-text/show-ellipsis-text.directive.d.ts +1 -1
  61. package/lib/anna-core-shared-lib/models/anna-global-dropdown-config.model.d.ts +3 -3
  62. package/lib/anna-core-shared-lib/models/anna-non-editable-gt-models.d.ts +7 -7
  63. package/lib/anna-core-shared-lib/models/anna-sort.model.d.ts +1 -1
  64. package/lib/anna-core-shared-lib/models/anna-tooltip.model.d.ts +1 -1
  65. package/lib/anna-core-shared-lib/pipes/annaConvertArrayToCommaSeperatedValue.pipe.d.ts +1 -1
  66. package/lib/anna-core-shared-lib/pipes/annaConvertZeroOrNullOrUndefined.pipe.d.ts +1 -1
  67. package/lib/anna-core-shared-lib/pipes/annaDateFormatter.pipe.d.ts +1 -1
  68. package/lib/anna-core-shared-lib/pipes/annaFilterSearchedText.pipe.d.ts +1 -1
  69. package/lib/anna-core-shared-lib/pipes/annaReplaceChar.pipe.d.ts +1 -1
  70. package/lib/anna-core-shared-lib/pipes/annaTypeOfData.pipe.d.ts +1 -1
  71. package/lib/anna-core-shared-lib/services/anna-date-time-format.service.d.ts +2 -2
  72. package/lib/anna-core-shared-lib/services/anna-filter.service.d.ts +6 -6
  73. package/lib/anna-core-shared-lib/services/anna-generic-table.service.d.ts +5 -5
  74. package/lib/anna-core-shared-lib/services/anna-global-config.service.d.ts +2 -2
  75. package/lib/anna-core-shared-lib/services/anna-sort.service.d.ts +3 -3
  76. package/lib/anna-dropdown-lib/components/anna-calendar-filter/anna-calendar-filter.component.d.ts +5 -5
  77. package/lib/anna-dropdown-lib/components/anna-week-calendar-filter/anna-week-calendar-filter.component.d.ts +7 -7
  78. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-checkbox-filter/anna-column-checkbox-filter.component.d.ts +7 -7
  79. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-date-range-filter/anna-column-date-range-filter.component.d.ts +8 -8
  80. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-slider-filter/anna-column-slider-filter.component.d.ts +8 -8
  81. package/lib/anna-generic-table-lib/components/anna-column-filters/anna-column-time-filter/anna-column-time-filter.component.d.ts +9 -9
  82. package/lib/anna-generic-table-lib/components/anna-non-editable-generic-table/anna-non-editable-generic-table.component.d.ts +9 -9
  83. package/lib/anna-generic-table-lib/components/anna-sort/anna-sort.component.d.ts +3 -3
  84. package/lib/anna-generic-table-lib/components/anna-table-virtual-scroll-viewport/anna-table-virtual-scroll-viewport.component.d.ts +9 -9
  85. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/anna-fixed-row-size-table-virtual-scroll-strategy.directive.d.ts +4 -4
  86. package/lib/anna-generic-table-lib/directives/anna-fixed-row-size-table-virtual-scroll-strategy/index.d.ts +1 -1
  87. package/lib/anna-generic-table-lib/directives/anna-virtual-table/anna-virtual-table.directive.d.ts +6 -6
  88. package/lib/anna-generic-table-lib/directives/anna-virtual-table/index.d.ts +1 -1
  89. package/package.json +1 -1
  90. package/public-api.d.ts +42 -42
  91. package/src/lib/anna-common-scss/_animate.scss +27 -27
  92. package/src/lib/anna-common-scss/_application-spacing.scss +7 -7
  93. package/src/lib/anna-common-scss/_bootstrap-tooltip.scss +27 -27
  94. package/src/lib/anna-common-scss/_button.scss +18 -18
  95. package/src/lib/anna-common-scss/_colors.scss +107 -107
  96. package/src/lib/anna-common-scss/_common-order-listing-table.scss +176 -176
  97. package/src/lib/anna-common-scss/_custom-anna-datepicker.scss +14 -14
  98. package/src/lib/anna-common-scss/_customDropdown.scss +123 -123
  99. package/src/lib/anna-common-scss/_dashboard-partials.scss +106 -106
  100. package/src/lib/anna-common-scss/_date-picker-form.scss +87 -87
  101. package/src/lib/anna-common-scss/_easy-filter.scss +138 -138
  102. package/src/lib/anna-common-scss/_edit-filter-popup.scss +70 -70
  103. package/src/lib/anna-common-scss/_filters.scss +712 -712
  104. package/src/lib/anna-common-scss/_font.scss +9 -9
  105. package/src/lib/anna-common-scss/_fonts.scss +86 -86
  106. package/src/lib/anna-common-scss/_generic-modal.scss +63 -63
  107. package/src/lib/anna-common-scss/_generic-table-common.scss +198 -198
  108. package/src/lib/anna-common-scss/_gt-table.scss +425 -425
  109. package/src/lib/anna-common-scss/_icons.scss +3 -3
  110. package/src/lib/anna-common-scss/_legend.scss +11 -11
  111. package/src/lib/anna-common-scss/_mat-button-toggle.scss +38 -38
  112. package/src/lib/anna-common-scss/_mat-menu.scss +17 -17
  113. package/src/lib/anna-common-scss/_mixins.scss +187 -187
  114. package/src/lib/anna-common-scss/_modal.scss +37 -37
  115. package/src/lib/anna-common-scss/_popup-filter-toggle-button.scss +36 -36
  116. package/src/lib/anna-common-scss/_scrollbar.scss +14 -14
  117. package/src/lib/anna-common-scss/_sort.scss +30 -30
  118. package/src/lib/anna-common-scss/_toggle.scss +86 -86
  119. package/src/lib/anna-common-scss/style.scss +1 -1
  120. package/src/lib/anna-common-scss/third-party-lib/_angular-material-mat-radio.scss +25 -25
  121. package/src/lib/anna-common-scss/third-party-lib/_anna-mat-button-toggle-group-size-lg.scss +34 -34
  122. package/src/lib/anna-common-scss/third-party-lib/_mat-autocomplete.scss +31 -31
@@ -1,15 +1,15 @@
1
- import { Injectable } from '@angular/core';
1
+ import { Injectable } from "@angular/core";
2
2
  // Third party import statements
3
- import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from 'lodash-es';
4
- import dayjs from 'dayjs';
5
- import CustomParseFormat from 'dayjs/plugin/customParseFormat';
6
- import minMax from 'dayjs/plugin/minMax';
7
- import isBetween from 'dayjs/plugin/isBetween';
8
- import { SortTypeEnum } from '../models/anna-sort.model';
3
+ import { min, max, map, sortBy, uniq, cloneDeep, isEqual } from "lodash-es";
4
+ import dayjs from "dayjs";
5
+ import CustomParseFormat from "dayjs/plugin/customParseFormat";
6
+ import minMax from "dayjs/plugin/minMax";
7
+ import isBetween from "dayjs/plugin/isBetween";
8
+ import { SortTypeEnum } from "../models/anna-sort.model";
9
9
  // User defined import statements
10
- import { AnnaDateTimeFormatService } from './anna-date-time-format.service';
11
- import { AnnaSortService } from './anna-sort.service';
12
- import { TooltipModel } from '../models/anna-tooltip.model';
10
+ import { AnnaDateTimeFormatService } from "./anna-date-time-format.service";
11
+ import { AnnaSortService } from "./anna-sort.service";
12
+ import { TooltipModel } from "../models/anna-tooltip.model";
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "./anna-date-time-format.service";
15
15
  import * as i2 from "./anna-sort.service";
@@ -22,53 +22,53 @@ export class AnnaFilterService {
22
22
  this.tooltipSelectedMap = new Map();
23
23
  this.appliedFiltersArray = [];
24
24
  this.sliderCurrencySet = new Set([
25
- 'booked',
26
- 'cpp',
27
- 'cpm',
28
- 'rcvPreempt',
29
- 'osPreempt',
30
- 'postedAdu',
31
- 'scheduledAdu',
32
- 'audienceDeficit',
33
- 'Rate',
34
- 'userADUs',
35
- 'buyerChanges',
36
- 'userChanges',
37
- 'userMG',
38
- 'udValue',
39
- 'odValue',
25
+ "booked",
26
+ "cpp",
27
+ "cpm",
28
+ "rcvPreempt",
29
+ "osPreempt",
30
+ "postedAdu",
31
+ "scheduledAdu",
32
+ "audienceDeficit",
33
+ "Rate",
34
+ "userADUs",
35
+ "buyerChanges",
36
+ "userChanges",
37
+ "userMG",
38
+ "udValue",
39
+ "odValue",
40
40
  ]);
41
41
  this.isFilterSortActive = {};
42
42
  this.resetFilterSortActiveStatus = true;
43
43
  this.percentTranslateFunction = (data) => {
44
44
  if (Math.abs(data) >= 1000) {
45
45
  let isNegVal = data < 0;
46
- const val = (Math.abs(data) / 1000).toFixed(1) + 'k%';
47
- return isNegVal ? '-' + val : val;
46
+ const val = (Math.abs(data) / 1000).toFixed(1) + "k%";
47
+ return isNegVal ? "-" + val : val;
48
48
  }
49
49
  else {
50
50
  let isNegVal = data < 0;
51
51
  let isWholeNum = parseInt(data.toString()) == data;
52
52
  let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
53
- return isNegVal ? '-' + val + '%' : val + '%';
53
+ return isNegVal ? "-" + val + "%" : val + "%";
54
54
  }
55
55
  };
56
56
  this.currencyTranslateFunction = (data) => {
57
57
  if (Math.abs(data) >= 1000) {
58
58
  let isNegVal = data < 0;
59
- const val = '$' + (Math.abs(data) / 1000).toFixed(1) + 'k';
60
- return isNegVal ? '-' + val : val;
59
+ const val = "$" + (Math.abs(data) / 1000).toFixed(1) + "k";
60
+ return isNegVal ? "-" + val : val;
61
61
  }
62
62
  else {
63
63
  let isNegVal = data < 0;
64
64
  let isWholeNum = parseInt(data.toString()) == data;
65
65
  let val = isWholeNum ? Math.abs(data).toString() : Math.abs(data).toFixed(1);
66
- return isNegVal ? '-$' + val : '$' + val;
66
+ return isNegVal ? "-$" + val : "$" + val;
67
67
  }
68
68
  };
69
69
  this.normalTranslateFunction = (data) => {
70
70
  if (data >= 1000) {
71
- const val = (data / 1000).toFixed(1) + 'k';
71
+ const val = (data / 1000).toFixed(1) + "k";
72
72
  return val;
73
73
  }
74
74
  else if (data != Math.floor(data)) {
@@ -80,167 +80,170 @@ export class AnnaFilterService {
80
80
  dayjs.extend(isBetween);
81
81
  dayjs.extend(CustomParseFormat);
82
82
  const sliderArr = [
83
- 'rcvPreempt',
84
- 'osPreempt',
85
- 'rcvUnderDly',
86
- 'postedAudPercent',
87
- 'booked',
88
- 'spots',
89
- 'grp',
90
- 'averageRateThisYear',
91
- 'averageRateLastYear',
92
- 'averageCPP',
93
- 'averageCPM',
94
- 'IMPSDiff',
95
- 'RTGDiff',
96
- 'cpp',
97
- 'imps',
98
- 'cpm',
99
- 'osUnderDly',
100
- 'totalWeeks',
101
- 'WeekNumber',
102
- 'Rate',
103
- 'OrderedRatingsOrImpressions',
104
- 'PostedRatingsOrImpressions',
83
+ "rcvPreempt",
84
+ "osPreempt",
85
+ "rcvUnderDly",
86
+ "postedAudPercent",
87
+ "booked",
88
+ "spots",
89
+ "grp",
90
+ "averageRateThisYear",
91
+ "averageRateLastYear",
92
+ "averageCPP",
93
+ "averageCPM",
94
+ "IMPSDiff",
95
+ "RTGDiff",
96
+ "cpp",
97
+ "imps",
98
+ "cpm",
99
+ "osUnderDly",
100
+ "totalWeeks",
101
+ "WeekNumber",
102
+ "Rate",
103
+ "OrderedRatingsOrImpressions",
104
+ "PostedRatingsOrImpressions",
105
105
  ,
106
- 'postedAudPercent',
107
- 'postedAdu',
108
- 'scheduledAdu',
109
- 'audienceDeficit',
110
- 'offeredMGs',
111
- 'outstandingPE',
112
- 'offeredADUs',
113
- 'udDeficitValue',
114
- 'bookedValue',
115
- 'bookedSpots',
116
- 'userChanges',
117
- 'UDGrp',
118
- 'UDImps',
119
- 'ODGrp',
120
- 'ODImps',
121
- 'udImpsPercent',
122
- 'udGrpPercent',
123
- 'odImpsPercent',
124
- 'odGrpPercent',
125
- 'userADUs',
126
- 'buyerChanges',
127
- 'userChanges',
128
- 'userMG',
129
- 'WeeklyAUR',
130
- 'WeeklyAURatingOrImpressions',
131
- 'MGsValue',
132
- 'ADUsValue',
133
- 'UserCreditedValue',
134
- 'UserUnresolvedValue',
135
- 'BuyerAddedValue',
136
- 'BuyerDeletedValue',
137
- 'BuyerChangesValue',
138
- 'UserChangesValue',
139
- 'BookedGRPOrIMPS',
140
- 'BookedCPPOrCPM',
141
- 'BookedValue',
142
- 'BookedSpots',
143
- 'BookedRate',
144
- 'averageRate',
145
- 'projectedIMPS',
146
- 'projectedRTG',
147
- 'desiredCPM',
148
- 'desiredCPP',
149
- 'inventoryFillPercentageSameWeek',
150
- 'inventoryFillPercentageFinal',
151
- 'inventoryFillPercentageTillDate',
152
- 'dollarRateImpact',
153
- 'dollarIMPSImpact',
154
- 'IMPSImpact',
155
- 'dollarRTGImpact',
156
- 'RTGImpact',
157
- 'BookedRTG',
158
- 'BookedIMPS',
159
- 'AURTG',
160
- 'AURTG',
161
- 'PostedRating',
162
- 'PostedImpressions',
163
- 'NormalizedOrderedRating',
164
- 'NormalizedOrderedImpressions',
165
- 'NormalizedPostedRating',
166
- 'NormalizedPostedImpressions',
167
- 'BookedGRP',
168
- 'BookedIMPSRevTab',
169
- 'BookedCPP',
170
- 'BookedCPM',
171
- 'AUIMPS',
172
- 'bookedAmountValue',
173
- 'equivalizedBookedAmountValue',
174
- 'IMPS',
175
- 'udValue',
176
- 'odValue',
177
- 'ViolatedBookedValue',
178
- 'ViolatedBookedEURValue',
179
- 'ViolatingBookedEURValue',
180
- 'ViolatingBookedValue',
181
- 'Rebate',
182
- 'WeeklyAUR',
183
- 'parentRowAnnaEstimatesRtg',
184
- 'parentRowPostedRtg',
185
- 'parentRowRollingAverageRtg',
186
- 'parentRowStationEstimatesRtg',
187
- 'parentRowAnnaEstimatesImps',
188
- 'parentRowPostedImps',
189
- 'parentRowRollingAverageImps',
190
- 'parentRowStationEstimatesImps',
191
- 'parentRowAnnaEstimatesShare',
192
- 'parentRowPostedShare',
193
- 'parentRowRollingAverageShare',
194
- 'parentRowAnnaEstimatesPutPer',
195
- 'parentRowPostedPutPer',
196
- 'parentRowRollingAveragePutPer',
197
- 'parentRowAnnaEstimatesPut',
198
- 'parentRowPostedPut',
199
- 'parentRowRollingAveragePut',
200
- 'ProjectedImpressions',
201
- 'ProjectedRtg',
106
+ "postedAudPercent",
107
+ "postedAdu",
108
+ "scheduledAdu",
109
+ "audienceDeficit",
110
+ "offeredMGs",
111
+ "outstandingPE",
112
+ "offeredADUs",
113
+ "udDeficitValue",
114
+ "bookedValue",
115
+ "bookedSpots",
116
+ "userChanges",
117
+ "UDGrp",
118
+ "UDImps",
119
+ "ODGrp",
120
+ "ODImps",
121
+ "udImpsPercent",
122
+ "udGrpPercent",
123
+ "odImpsPercent",
124
+ "odGrpPercent",
125
+ "userADUs",
126
+ "buyerChanges",
127
+ "userChanges",
128
+ "userMG",
129
+ "WeeklyAUR",
130
+ "WeeklyAURatingOrImpressions",
131
+ "MGsValue",
132
+ "ADUsValue",
133
+ "UserCreditedValue",
134
+ "UserUnresolvedValue",
135
+ "BuyerAddedValue",
136
+ "BuyerDeletedValue",
137
+ "BuyerChangesValue",
138
+ "UserChangesValue",
139
+ "BookedGRPOrIMPS",
140
+ "BookedCPPOrCPM",
141
+ "BookedValue",
142
+ "BookedSpots",
143
+ "BookedRate",
144
+ "averageRate",
145
+ "projectedIMPS",
146
+ "projectedRTG",
147
+ "desiredCPM",
148
+ "desiredCPP",
149
+ "inventoryFillPercentageSameWeek",
150
+ "inventoryFillPercentageFinal",
151
+ "inventoryFillPercentageTillDate",
152
+ "dollarRateImpact",
153
+ "dollarIMPSImpact",
154
+ "IMPSImpact",
155
+ "dollarRTGImpact",
156
+ "RTGImpact",
157
+ "BookedRTG",
158
+ "BookedIMPS",
159
+ "AURTG",
160
+ "AURTG",
161
+ "PostedRating",
162
+ "PostedImpressions",
163
+ "NormalizedOrderedRating",
164
+ "NormalizedOrderedImpressions",
165
+ "NormalizedPostedRating",
166
+ "NormalizedPostedImpressions",
167
+ "BookedGRP",
168
+ "BookedIMPSRevTab",
169
+ "BookedCPP",
170
+ "BookedCPM",
171
+ "AUIMPS",
172
+ "bookedAmountValue",
173
+ "equivalizedBookedAmountValue",
174
+ "IMPS",
175
+ "udValue",
176
+ "odValue",
177
+ "ViolatedBookedValue",
178
+ "ViolatedBookedEURValue",
179
+ "ViolatingBookedEURValue",
180
+ "ViolatingBookedValue",
181
+ "Rebate",
182
+ "WeeklyAUR",
183
+ "OtherAvailableSpotsTableWeeklyAUR",
184
+ "parentRowAnnaEstimatesRtg",
185
+ "parentRowPostedRtg",
186
+ "parentRowRollingAverageRtg",
187
+ "parentRowStationEstimatesRtg",
188
+ "parentRowAnnaEstimatesImps",
189
+ "parentRowPostedImps",
190
+ "parentRowRollingAverageImps",
191
+ "parentRowStationEstimatesImps",
192
+ "parentRowAnnaEstimatesShare",
193
+ "parentRowPostedShare",
194
+ "parentRowRollingAverageShare",
195
+ "parentRowAnnaEstimatesPutPer",
196
+ "parentRowPostedPutPer",
197
+ "parentRowRollingAveragePutPer",
198
+ "parentRowAnnaEstimatesPut",
199
+ "parentRowPostedPut",
200
+ "parentRowRollingAveragePut",
201
+ "ProjectedImpressions",
202
+ "ProjectedRtg",
202
203
  ];
203
204
  const calendarArr = [
204
- 'period',
205
- 'AirDate',
206
- 'flightStartDate',
207
- 'flightEndDate',
208
- 'date',
209
- 'startDate',
210
- 'endDate',
211
- 'revisionStartDate',
212
- 'GeneratedOn',
213
- 'Week',
214
- 'timeoutDate',
215
- 'ViolatingSpotDate',
216
- 'ViolatedSpotDate',
205
+ "period",
206
+ "AirDate",
207
+ "flightStartDate",
208
+ "flightEndDate",
209
+ "date",
210
+ "startDate",
211
+ "endDate",
212
+ "revisionStartDate",
213
+ "GeneratedOn",
214
+ "Week",
215
+ "timeoutDate",
216
+ "ViolatingSpotDate",
217
+ "ViolatedSpotDate",
217
218
  ];
218
219
  const timeArr = [
219
- 'StartTimeForFilter',
220
- 'EndTimeForFilter',
221
- 'time',
222
- 'startTimeForFilter',
223
- 'endTimeForFilter',
224
- 'start_time_for_filter',
225
- 'end_time_for_filter',
226
- 'startEndTimeMulti',
227
- 'startEndTime',
228
- 'timeoutTime',
229
- 'StartTime',
230
- 'EndTime',
220
+ "StartTimeForFilter",
221
+ "EndTimeForFilter",
222
+ "time",
223
+ "startTimeForFilter",
224
+ "endTimeForFilter",
225
+ "start_time_for_filter",
226
+ "end_time_for_filter",
227
+ "startEndTimeMulti",
228
+ "startEndTime",
229
+ "timeoutTime",
230
+ "OtherAvailableSpotsTableStartTime",
231
+ "OtherAvailableSpotsTableEndTime",
232
+ "StartTime",
233
+ "EndTime",
231
234
  ];
232
235
  this.sliderSet = new Set(sliderArr);
233
236
  this.calendarSet = new Set(calendarArr);
234
237
  this.timeSet = new Set(timeArr);
235
238
  }
236
239
  returnMaxAndMinValue(data, key, isMin) {
237
- data = data.filter((obj) => !['', '-', null].includes(obj[key]));
240
+ data = data.filter((obj) => !["", "-", null].includes(obj[key]));
238
241
  const values = data.map((x) => x[key]);
239
242
  let valueToReturn = isMin ? min(values) : max(values);
240
243
  return valueToReturn;
241
244
  }
242
245
  returnMinAndMaxDate(data, key) {
243
- data = data.filter((obj) => !['', '-', null].includes(obj[key]));
246
+ data = data.filter((obj) => !["", "-", null].includes(obj[key]));
244
247
  let DateArr = data.map((obj) => dayjs(obj[key]));
245
248
  let minDate = dayjs.min(DateArr);
246
249
  let maxDate = dayjs.max(DateArr);
@@ -278,10 +281,10 @@ export class AnnaFilterService {
278
281
  };
279
282
  }
280
283
  findUniqueDatesWithData(data) {
281
- let uniqueDates = uniq(data.map((u) => u['date']));
284
+ let uniqueDates = uniq(data.map((u) => u["date"]));
282
285
  let uniqueDatesInNgbDateFormat = [];
283
286
  uniqueDates.forEach((date) => {
284
- uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, 'MM/DD/YY').format('MM/DD/YYYY')));
287
+ uniqueDatesInNgbDateFormat.push(this.dateTimeFormatService.convertToNgbDateStandardFormat(dayjs(date, "MM/DD/YY").format("MM/DD/YYYY")));
285
288
  });
286
289
  return uniqueDatesInNgbDateFormat;
287
290
  }
@@ -291,26 +294,28 @@ export class AnnaFilterService {
291
294
  this.removeOrChangeLatestFilterIndex(isFiltered);
292
295
  }
293
296
  checkIfDataIsFiltered(isFiltered, isHierarchialUserFiltered, date) {
294
- if (this.selectedRadio == 'user' && !this.tooltipMap.has('user')) {
297
+ if (this.selectedRadio == "user" && !this.tooltipMap.has("user")) {
295
298
  isFiltered = cloneDeep(isHierarchialUserFiltered);
296
299
  }
297
- else if (this.selectedRadio == 'StartTimeForFilter' ||
298
- this.selectedRadio == 'EndTimeForFilter' ||
299
- this.selectedRadio == 'startTimeForFilter' ||
300
- this.selectedRadio == 'endTimeForFilter' ||
301
- this.selectedRadio == 'time' ||
302
- this.selectedRadio == 'timeoutTime' ||
303
- this.selectedRadio == 'StartTime' ||
304
- this.selectedRadio == 'EndTime' ||
305
- this.selectedRadio == 'start_time_for_filter' ||
306
- this.selectedRadio == 'end_time_for_filter' ||
307
- this.selectedRadio == 'startEndTimeMulti') {
300
+ else if (this.selectedRadio == "StartTimeForFilter" ||
301
+ this.selectedRadio == "EndTimeForFilter" ||
302
+ this.selectedRadio == "startTimeForFilter" ||
303
+ this.selectedRadio == "endTimeForFilter" ||
304
+ this.selectedRadio == "time" ||
305
+ this.selectedRadio == "timeoutTime" ||
306
+ this.selectedRadio == "OtherAvailableSpotsTableStartTime" ||
307
+ this.selectedRadio == "OtherAvailableSpotsTableEndTime" ||
308
+ this.selectedRadio == "StartTime" ||
309
+ this.selectedRadio == "EndTime" ||
310
+ this.selectedRadio == "start_time_for_filter" ||
311
+ this.selectedRadio == "end_time_for_filter" ||
312
+ this.selectedRadio == "startEndTimeMulti") {
308
313
  isFiltered =
309
314
  !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
310
315
  !this.includeZeroTime ||
311
316
  !this.includeMultiTime;
312
317
  }
313
- else if (this.selectedRadio == 'startEndTime' || this.selectedRadio == 'TimeBand') {
318
+ else if (this.selectedRadio == "startEndTime" || this.selectedRadio == "TimeBand") {
314
319
  isFiltered =
315
320
  !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) ||
316
321
  !this.includeZeroTime ||
@@ -319,24 +324,24 @@ export class AnnaFilterService {
319
324
  else if (this.sliderSet.has(this.selectedRadio)) {
320
325
  isFiltered =
321
326
  !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.sliderData);
322
- if (this.selectedRadio == 'postedAdu' && this.subRadioButton == 'notRequired') {
327
+ if (this.selectedRadio == "postedAdu" && this.subRadioButton == "notRequired") {
323
328
  isFiltered = true;
324
329
  }
325
330
  if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
326
331
  this.tooltipSelectedMap.delete(this.selectedRadio);
327
332
  }
328
333
  }
329
- else if (this.selectedRadio == 'startDate' ||
330
- this.selectedRadio == 'endDate' ||
331
- this.selectedRadio == 'period' ||
332
- this.selectedRadio == 'AirDate' ||
333
- this.selectedRadio == 'timeoutDate' ||
334
- this.selectedRadio === 'flightStartDate' ||
335
- this.selectedRadio === 'flightEndDate' ||
336
- this.selectedRadio == 'date' ||
337
- this.selectedRadio == 'revisionStartDate' ||
338
- this.selectedRadio == 'GeneratedOn' ||
339
- this.selectedRadio == 'Week') {
334
+ else if (this.selectedRadio == "startDate" ||
335
+ this.selectedRadio == "endDate" ||
336
+ this.selectedRadio == "period" ||
337
+ this.selectedRadio == "AirDate" ||
338
+ this.selectedRadio == "timeoutDate" ||
339
+ this.selectedRadio === "flightStartDate" ||
340
+ this.selectedRadio === "flightEndDate" ||
341
+ this.selectedRadio == "date" ||
342
+ this.selectedRadio == "revisionStartDate" ||
343
+ this.selectedRadio == "GeneratedOn" ||
344
+ this.selectedRadio == "Week") {
340
345
  isFiltered =
341
346
  !isEqual(this.initialValueMap.get(this.selectedRadio), this.tooltipSelectedMap.get(this.selectedRadio)) && !isEqual(this.tooltipSelectedMap.get(this.selectedRadio), this.flightDateRange);
342
347
  if (!isFiltered && this.tooltipSelectedMap.has(this.selectedRadio)) {
@@ -370,10 +375,10 @@ export class AnnaFilterService {
370
375
  if (!this.annaSortService?.columnSortState)
371
376
  return originalData;
372
377
  for (let [key, value] of this.annaSortService.columnSortState.entries()) {
373
- if (value == 'ASC') {
378
+ if (value == "ASC") {
374
379
  originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(true, originalData, key));
375
380
  }
376
- else if (value == 'DESC') {
381
+ else if (value == "DESC") {
377
382
  originalData = cloneDeep(this.annaSortService.sortDataForComponentOtherThanLurAndCsrPage(false, originalData, key));
378
383
  }
379
384
  }
@@ -389,37 +394,39 @@ export class AnnaFilterService {
389
394
  if (this.sliderSet.has(key)) {
390
395
  filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
391
396
  }
392
- else if (key === 'startDate' ||
393
- key === 'endDate' ||
394
- key === 'AirDate' ||
395
- key === 'timeoutDate' ||
396
- key === 'flightStartDate' ||
397
- key === 'flightEndDate' ||
398
- key == 'date' ||
399
- key == 'Date' ||
400
- key == 'revisionStartDate' ||
401
- key == 'GeneratedOn' ||
402
- key === 'Week' ||
403
- key === 'ViolatedSpotDate' ||
404
- key === 'ViolatingSpotDate') {
397
+ else if (key === "startDate" ||
398
+ key === "endDate" ||
399
+ key === "AirDate" ||
400
+ key === "timeoutDate" ||
401
+ key === "flightStartDate" ||
402
+ key === "flightEndDate" ||
403
+ key == "date" ||
404
+ key == "Date" ||
405
+ key == "revisionStartDate" ||
406
+ key == "GeneratedOn" ||
407
+ key === "Week" ||
408
+ key === "ViolatedSpotDate" ||
409
+ key === "ViolatingSpotDate") {
405
410
  filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
406
411
  }
407
- else if (key === 'period') {
412
+ else if (key === "period") {
408
413
  filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
409
414
  }
410
- else if (key === 'StartTimeForFilter' ||
411
- key === 'EndTimeForFilter' ||
412
- key == 'timeoutTime' ||
413
- key === 'startTimeForFilter' ||
414
- key === 'endTimeForFilter' ||
415
- key === 'StartTime' ||
416
- key == 'EndTime' ||
417
- key === 'start_time_for_filter' ||
418
- key === 'end_time_for_filter' ||
419
- key == 'time') {
415
+ else if (key === "StartTimeForFilter" ||
416
+ key === "EndTimeForFilter" ||
417
+ key == "timeoutTime" ||
418
+ key === "startTimeForFilter" ||
419
+ key === "endTimeForFilter" ||
420
+ key === "OtherAvailableSpotsTableStartTime" ||
421
+ key == "OtherAvailableSpotsTableEndTime" ||
422
+ key === "StartTime" ||
423
+ key == "EndTime" ||
424
+ key === "start_time_for_filter" ||
425
+ key === "end_time_for_filter" ||
426
+ key == "time") {
420
427
  filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
421
428
  }
422
- else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
429
+ else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
423
430
  filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
424
431
  }
425
432
  else if (value.length > 0) {
@@ -436,7 +443,7 @@ export class AnnaFilterService {
436
443
  return isDateBetweenTheSelectedRange || isDateSameAsTheMinSelectedDate || isDateSameAsTheMaxSelectedDate;
437
444
  }
438
445
  returnDataForTimeRange(obj, selectedData) {
439
- let format = 'HH:mm:ss';
446
+ let format = "HH:mm:ss";
440
447
  let selectedStartDate = dayjs(selectedData.startTime, format);
441
448
  let selectedEndDate = dayjs(selectedData.endTime, format);
442
449
  let startTime = dayjs(obj.startTime, format);
@@ -451,29 +458,29 @@ export class AnnaFilterService {
451
458
  (isStartTimeBetweenSelectedStartAndEndTime && isEndTimeSameAsSelectedEndTime));
452
459
  }
453
460
  returnDataForFromAndToTimeRange(obj, selectedData, key) {
454
- let format = 'MM/DD/YYYY HH:mm:ss';
455
- let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
456
- let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
461
+ let format = "MM/DD/YYYY HH:mm:ss";
462
+ let selectedFromTime = dayjs("01/01/2001 " + selectedData.fromTime, format);
463
+ let selectedToTime = dayjs("01/01/2001 " + selectedData.toTime, format);
457
464
  let objTime = obj[key];
458
- if (['', '-', null].includes(objTime)) {
465
+ if (["", "-", null].includes(objTime)) {
459
466
  return false;
460
467
  }
461
- if (selectedData.includeMulti && obj[key] == '<multi>') {
468
+ if (selectedData.includeMulti && obj[key] == "<multi>") {
462
469
  return true;
463
470
  }
464
- if (!selectedData.includeMulti && obj[key] == '<multi>') {
471
+ if (!selectedData.includeMulti && obj[key] == "<multi>") {
465
472
  return false;
466
473
  }
467
- if (selectedData.includeZero && obj[key] == '0') {
474
+ if (selectedData.includeZero && obj[key] == "0") {
468
475
  return true;
469
476
  }
470
- if (!selectedData.includeZero && obj[key] == '0') {
477
+ if (!selectedData.includeZero && obj[key] == "0") {
471
478
  return false;
472
479
  }
473
480
  if (!selectedData.includeTimeRange) {
474
481
  return false;
475
482
  }
476
- let dayjsTime = dayjs('01/01/2001 ' + objTime, format);
483
+ let dayjsTime = dayjs("01/01/2001 " + objTime, format);
477
484
  let isObjTimeSameAsSelectedFromTime = dayjsTime.isSame(selectedFromTime);
478
485
  let isObjTimeSameAsSelectedToTime = dayjsTime.isSame(selectedToTime);
479
486
  let isObjTimeBetweenSelectedFromTimeAndToTime = dayjsTime.isBetween(selectedFromTime, selectedToTime);
@@ -482,26 +489,26 @@ export class AnnaFilterService {
482
489
  isObjTimeBetweenSelectedFromTimeAndToTime);
483
490
  }
484
491
  returnDataForStartAndEndTimeRange(obj, selectedData, key) {
485
- let format = 'MM/DD/YYYY HH:mm:ss';
486
- let selectedFromTime = dayjs('01/01/2001 ' + selectedData.fromTime, format);
487
- let selectedToTime = dayjs('01/01/2001 ' + selectedData.toTime, format);
488
- if (selectedData.includeMulti && obj[key][0] == '<multi>') {
492
+ let format = "MM/DD/YYYY HH:mm:ss";
493
+ let selectedFromTime = dayjs("01/01/2001 " + selectedData.fromTime, format);
494
+ let selectedToTime = dayjs("01/01/2001 " + selectedData.toTime, format);
495
+ if (selectedData.includeMulti && obj[key][0] == "<multi>") {
489
496
  return true;
490
497
  }
491
- if (!selectedData.includeMulti && obj[key][0] == '<multi>') {
498
+ if (!selectedData.includeMulti && obj[key][0] == "<multi>") {
492
499
  return false;
493
500
  }
494
- if (selectedData.includeZero && obj[key][0] == '0') {
501
+ if (selectedData.includeZero && obj[key][0] == "0") {
495
502
  return true;
496
503
  }
497
- if (!selectedData.includeZero && obj[key][0] == '0') {
504
+ if (!selectedData.includeZero && obj[key][0] == "0") {
498
505
  return false;
499
506
  }
500
507
  if (!selectedData.includeTimeRange) {
501
508
  return false;
502
509
  }
503
- let startTime = dayjs('01/01/2001 ' + obj[key][1], format);
504
- let endTime = dayjs('01/01/2001 ' + obj[key][2], format);
510
+ let startTime = dayjs("01/01/2001 " + obj[key][1], format);
511
+ let endTime = dayjs("01/01/2001 " + obj[key][2], format);
505
512
  let isStartTimeSameAsSelectedStartTime = startTime.isSame(selectedFromTime);
506
513
  let isStartTimeBetweenSelectedStartAndEndTime = startTime.isBetween(selectedFromTime, selectedToTime);
507
514
  let isEndTimeSameAsSelectedEndTime = endTime.isSame(selectedToTime);
@@ -513,8 +520,8 @@ export class AnnaFilterService {
513
520
  }
514
521
  getDataInTheDateRange(obj, value, key) {
515
522
  let parsingFormat;
516
- if (key === 'period') {
517
- parsingFormat = 'YYYY-MM-DD';
523
+ if (key === "period") {
524
+ parsingFormat = "YYYY-MM-DD";
518
525
  let dayjsStartDate = dayjs(obj.startDate);
519
526
  let dayjsEndDate = dayjs(obj.endDate);
520
527
  let startDateIsBetweenSelDate = dayjsStartDate.isBetween(value.fromDate, value.toDate);
@@ -524,21 +531,21 @@ export class AnnaFilterService {
524
531
  return ((startDateIsBetweenSelDate || startDateIsSameAsSelStartDate) &&
525
532
  (endDateIsBetweenSelDate || endDateIsSameAsSelEndDate));
526
533
  }
527
- else if (key === 'AirDate' ||
528
- key === 'flightStartDate' ||
529
- key === 'flightEndDate' ||
530
- key === 'Week' ||
531
- key === 'timeoutDate') {
532
- parsingFormat = 'MM/DD/YYYY';
534
+ else if (key === "AirDate" ||
535
+ key === "flightStartDate" ||
536
+ key === "flightEndDate" ||
537
+ key === "Week" ||
538
+ key === "timeoutDate") {
539
+ parsingFormat = "MM/DD/YYYY";
533
540
  let dateIsBetweenSelDate = dayjs(obj[key], parsingFormat).isBetween(value.minSelectedDate, value.maxSelectedDate);
534
541
  let dateIsSameAsSelStartDate = dayjs(obj[key], parsingFormat).isSame(value.minSelectedDate);
535
542
  let dateIsSameAsSelEndDate = dayjs(obj[key], parsingFormat).isSame(value.maxSelectedDate);
536
543
  return dateIsBetweenSelDate || dateIsSameAsSelStartDate || dateIsSameAsSelEndDate;
537
544
  }
538
545
  }
539
- initializeTimeFilterData(clonedData, key = 'startEndTime') {
540
- let startTimeArr = map(clonedData, 'startTime');
541
- let endTimeArr = map(clonedData, 'endTime');
546
+ initializeTimeFilterData(clonedData, key = "startEndTime") {
547
+ let startTimeArr = map(clonedData, "startTime");
548
+ let endTimeArr = map(clonedData, "endTime");
542
549
  startTimeArr.sort((a, b) => {
543
550
  return this.dateTimeFormatService.sortByTimeAscending(a, b);
544
551
  });
@@ -552,7 +559,7 @@ export class AnnaFilterService {
552
559
  this.initialValueMap.set(key, initialStartEndTime);
553
560
  }
554
561
  returnColumnFilterStatus(data, headerName) {
555
- if (headerName == 'startEndTime') {
562
+ if (headerName == "startEndTime") {
556
563
  let time = data.map((u) => u[headerName][0]);
557
564
  let uniqTime = uniq(time);
558
565
  return uniqTime.length == 0;
@@ -586,37 +593,39 @@ export class AnnaFilterService {
586
593
  if (this.sliderSet.has(key)) {
587
594
  filteredData = filteredData.filter((obj) => obj[key] >= value.min && obj[key] <= value.max);
588
595
  }
589
- else if (key === 'startDate' ||
590
- key === 'endDate' ||
591
- key === 'AirDate' ||
592
- key === 'timeoutDate' ||
593
- key === 'flightStartDate' ||
594
- key === 'flightEndDate' ||
595
- key == 'date' ||
596
- key == 'Date' ||
597
- key == 'revisionStartDate' ||
598
- key == 'GeneratedOn' ||
599
- key === 'Week' ||
600
- key === 'ViolatedSpotDate' ||
601
- key === 'ViolatingSpotDate') {
596
+ else if (key === "startDate" ||
597
+ key === "endDate" ||
598
+ key === "AirDate" ||
599
+ key === "timeoutDate" ||
600
+ key === "flightStartDate" ||
601
+ key === "flightEndDate" ||
602
+ key == "date" ||
603
+ key == "Date" ||
604
+ key == "revisionStartDate" ||
605
+ key == "GeneratedOn" ||
606
+ key === "Week" ||
607
+ key === "ViolatedSpotDate" ||
608
+ key === "ViolatingSpotDate") {
602
609
  filteredData = filteredData.filter((obj) => this.isObjectInTheRange(obj, value, key));
603
610
  }
604
- else if (key === 'period') {
611
+ else if (key === "period") {
605
612
  filteredData = filteredData.filter((obj) => this.getDataInTheDateRange(obj, value, key));
606
613
  }
607
- else if (key === 'StartTimeForFilter' ||
608
- key === 'EndTimeForFilter' ||
609
- key == 'timeoutTime' ||
610
- key === 'startTimeForFilter' ||
611
- key === 'endTimeForFilter' ||
612
- key === 'start_time_for_filter' ||
613
- key === 'end_time_for_filter' ||
614
- key == 'time' ||
615
- key == 'StartTime' ||
616
- key == 'EndTime') {
614
+ else if (key === "StartTimeForFilter" ||
615
+ key === "EndTimeForFilter" ||
616
+ key == "timeoutTime" ||
617
+ key === "startTimeForFilter" ||
618
+ key === "endTimeForFilter" ||
619
+ key === "start_time_for_filter" ||
620
+ key === "end_time_for_filter" ||
621
+ key == "time" ||
622
+ key == "OtherAvailableSpotsTableStartTime" ||
623
+ key == "OtherAvailableSpotsTableEndTime" ||
624
+ key == "StartTime" ||
625
+ key == "EndTime") {
617
626
  filteredData = filteredData.filter((obj) => this.returnDataForFromAndToTimeRange(obj, value, key));
618
627
  }
619
- else if (key === 'startEndTimeMulti' || key == 'startEndTime' || key === 'TimeBand') {
628
+ else if (key === "startEndTimeMulti" || key == "startEndTime" || key === "TimeBand") {
620
629
  filteredData = filteredData.filter((obj) => this.returnDataForStartAndEndTimeRange(obj, value, key));
621
630
  }
622
631
  else if (value.length > 0) {
@@ -627,9 +636,9 @@ export class AnnaFilterService {
627
636
  isObjectInTheRange(obj, value, key) {
628
637
  let objVal = obj[key];
629
638
  let dayjsDate = dayjs(objVal);
630
- if (typeof value.fromDate === 'string' && typeof value.toDate === 'string') {
631
- value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, 'DD/MM/YYYY')));
632
- value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, 'DD/MM/YYYY')));
639
+ if (typeof value.fromDate === "string" && typeof value.toDate === "string") {
640
+ value.fromDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.fromDate, "DD/MM/YYYY")));
641
+ value.toDate = dayjs(this.dateTimeFormatService.convertNgbDateToMoment(this.dateTimeFormatService.convertToNgbDate(value.toDate, "DD/MM/YYYY")));
633
642
  }
634
643
  let isDateSameAsStartOfTheRange = value.fromDate.isSame(objVal);
635
644
  let isDateSameAsEndOfTheRange = value.toDate.isSame(objVal);
@@ -641,19 +650,19 @@ export class AnnaFilterService {
641
650
  let keyArr = [];
642
651
  Object.keys(this.isFilterSortActive).forEach((key) => {
643
652
  if (key.includes(activeKey)) {
644
- keyArr = key.split(',');
653
+ keyArr = key.split(",");
645
654
  this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
646
655
  }
647
656
  });
648
657
  }
649
658
  updateStateOfAllTheKeys(sortMap) {
650
659
  Object.keys(this.isFilterSortActive).forEach((key) => {
651
- let keyArr = key.split(',');
660
+ let keyArr = key.split(",");
652
661
  this.isFilterSortActive[key] = this.isTooltipActive(keyArr, sortMap);
653
662
  });
654
663
  }
655
664
  incrementHour(value) {
656
- if (value == '') {
665
+ if (value == "") {
657
666
  value = 1;
658
667
  }
659
668
  else if (parseInt(value) < 12) {
@@ -665,7 +674,7 @@ export class AnnaFilterService {
665
674
  return value;
666
675
  }
667
676
  decrementHour(value) {
668
- if (value == '') {
677
+ if (value == "") {
669
678
  value = 12;
670
679
  }
671
680
  else if (parseInt(value) > 1) {
@@ -680,32 +689,32 @@ export class AnnaFilterService {
680
689
  // increment to nearest proper interval(15,30,45)
681
690
  let min = parseInt(value);
682
691
  if (min <= 14) {
683
- value = '15';
692
+ value = "15";
684
693
  }
685
694
  else if (min >= 15 && min <= 29) {
686
- value = '30';
695
+ value = "30";
687
696
  }
688
697
  else if (min >= 30 && min <= 44) {
689
- value = '45';
698
+ value = "45";
690
699
  }
691
700
  else if (min >= 45) {
692
- value = '00';
701
+ value = "00";
693
702
  }
694
703
  return value;
695
704
  }
696
705
  decrementMinute(value) {
697
706
  let min = parseInt(value);
698
707
  if (min > 0 && min <= 15) {
699
- value = '00';
708
+ value = "00";
700
709
  }
701
710
  else if (min >= 16 && min <= 30) {
702
- value = '15';
711
+ value = "15";
703
712
  }
704
713
  else if (min >= 31 && min <= 45) {
705
- value = '30';
714
+ value = "30";
706
715
  }
707
716
  else if (min > 45 || min == 0) {
708
- value = '45';
717
+ value = "45";
709
718
  }
710
719
  return value;
711
720
  }
@@ -728,7 +737,7 @@ export class AnnaFilterService {
728
737
  createListForCheckboxFilter(header, optionData) {
729
738
  let tooltipOptions = this.getTooltipModelFromOptionData(optionData, header);
730
739
  this.selectUnselectListCheckbox(tooltipOptions, header);
731
- this.formatNullOptionToSpecifiedString(tooltipOptions, '-');
740
+ this.formatNullOptionToSpecifiedString(tooltipOptions, "-");
732
741
  return tooltipOptions;
733
742
  }
734
743
  getTooltipModelFromOptionData(optionData, header) {
@@ -837,7 +846,7 @@ export class AnnaFilterService {
837
846
  let startIndex = item + index * 7; //Multiplying by 7 as there are 7char: <b></b>
838
847
  let endIndex = startIndex + find.length;
839
848
  let strToBeReplaced = str.substring(startIndex, endIndex);
840
- str = str.replace(strToBeReplaced, '<b>' + strToBeReplaced + '</b>');
849
+ str = str.replace(strToBeReplaced, "<b>" + strToBeReplaced + "</b>");
841
850
  });
842
851
  return str;
843
852
  }
@@ -865,9 +874,9 @@ export class AnnaFilterService {
865
874
  createRangeForTheDateFilter(optionData) {
866
875
  let minMaxDate;
867
876
  //When you want to use startDate and endDate combined as single column then use Period.
868
- if (this.selectedRadio == 'period' ||
869
- this.selectedRadio == 'buyerFlightDates' ||
870
- this.selectedRadio == 'trafficFlightDates') {
877
+ if (this.selectedRadio == "period" ||
878
+ this.selectedRadio == "buyerFlightDates" ||
879
+ this.selectedRadio == "trafficFlightDates") {
871
880
  minMaxDate = this.createStartEndDateRange(optionData);
872
881
  }
873
882
  else {
@@ -876,8 +885,8 @@ export class AnnaFilterService {
876
885
  return minMaxDate;
877
886
  }
878
887
  createStartEndDateRange(optionData) {
879
- let minStartDate = this.returnMinAndMaxDate(optionData, 'startDate');
880
- let maxEndDate = this.returnMinAndMaxDate(optionData, 'endDate');
888
+ let minStartDate = this.returnMinAndMaxDate(optionData, "startDate");
889
+ let maxEndDate = this.returnMinAndMaxDate(optionData, "endDate");
881
890
  return [minStartDate[0], maxEndDate[1]];
882
891
  }
883
892
  getMinAndMaxDateRangeForCalendar(minMaxDate, parsingFormat) {
@@ -955,13 +964,13 @@ export class AnnaFilterService {
955
964
  getSliderTranslateFuncVal(header, currencySet) {
956
965
  let translateFunc;
957
966
  if (currencySet.has(header)) {
958
- translateFunc = 'currency';
967
+ translateFunc = "currency";
959
968
  }
960
- else if (header == 'postedAudPercent' || header == 'parentRowShares' || header == 'parentRowPutPercent') {
961
- translateFunc = 'percent';
969
+ else if (header == "postedAudPercent" || header == "parentRowShares" || header == "parentRowPutPercent") {
970
+ translateFunc = "percent";
962
971
  }
963
972
  else {
964
- translateFunc = 'normal';
973
+ translateFunc = "normal";
965
974
  }
966
975
  return translateFunc;
967
976
  }
@@ -969,13 +978,13 @@ export class AnnaFilterService {
969
978
  let minValue = this.returnMaxAndMinValue(optionsData, header, true);
970
979
  let maxValue = this.returnMaxAndMinValue(optionsData, header, false);
971
980
  let obj = this.setOptionValues(minValue, maxValue);
972
- if (translateFunc === 'normal') {
981
+ if (translateFunc === "normal") {
973
982
  obj.translate = this.normalTranslateFunction;
974
983
  }
975
- else if (translateFunc === 'percent') {
984
+ else if (translateFunc === "percent") {
976
985
  obj.translate = this.percentTranslateFunction;
977
986
  }
978
- else if (translateFunc === 'currency') {
987
+ else if (translateFunc === "currency") {
979
988
  obj.translate = this.currencyTranslateFunction;
980
989
  }
981
990
  return obj;
@@ -998,7 +1007,7 @@ export class AnnaFilterService {
998
1007
  return options.floor <= val && val <= options.ceil;
999
1008
  }
1000
1009
  getPreviousSelectedValueForSlider(clonedData) {
1001
- let previousSliderData = { min: '', max: '' };
1010
+ let previousSliderData = { min: "", max: "" };
1002
1011
  if (this.tooltipSelectedMap.has(this.selectedRadio)) {
1003
1012
  previousSliderData = this.tooltipSelectedMap.get(this.selectedRadio);
1004
1013
  if (!this.initialValueMap.has(this.selectedRadio)) {
@@ -1049,13 +1058,13 @@ export class AnnaFilterService {
1049
1058
  selectedToTime = AnnaDateTimeFormatService.formatToTwelveHrs(selectedToTime, true);
1050
1059
  }
1051
1060
  else {
1052
- selectedFromTime = ['-', '-', '-'];
1053
- selectedToTime = ['-', '-', '-'];
1061
+ selectedFromTime = ["-", "-", "-"];
1062
+ selectedToTime = ["-", "-", "-"];
1054
1063
  }
1055
1064
  return [selectedFromTime, selectedToTime];
1056
1065
  }
1057
1066
  setInitialValueMapForTimeFilter(clonedData, key) {
1058
- if (key == 'startEndTime' || key == 'TimeBand') {
1067
+ if (key == "startEndTime" || key == "TimeBand") {
1059
1068
  this.setInitialValueForStartAndEndTimeRange(clonedData, key);
1060
1069
  }
1061
1070
  else {
@@ -1065,13 +1074,13 @@ export class AnnaFilterService {
1065
1074
  //use for filter where we have start and end time range in one filter
1066
1075
  //startEndTime: ["6 - 7A", "06: 00 : 00" , "07:00:00"]
1067
1076
  setInitialValueForStartAndEndTimeRange(clonedData, key) {
1068
- let includeMulti = clonedData.findIndex((obj) => obj[key][0] == '<multi>') != -1;
1069
- let includeZero = clonedData.findIndex((obj) => obj[key][0] == '0') != -1;
1070
- let includeTimeRange = clonedData.findIndex((obj) => obj[key][0] != '0' && obj[key][0] != '<multi>') != -1;
1071
- let filteredStartTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['startTime']));
1072
- let filteredEndTime = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj['endTime']));
1073
- let startTimeArr = map(filteredStartTime, 'startTime');
1074
- let endTimeArr = map(filteredEndTime, 'endTime');
1077
+ let includeMulti = clonedData.findIndex((obj) => obj[key][0] == "<multi>") != -1;
1078
+ let includeZero = clonedData.findIndex((obj) => obj[key][0] == "0") != -1;
1079
+ let includeTimeRange = clonedData.findIndex((obj) => obj[key][0] != "0" && obj[key][0] != "<multi>") != -1;
1080
+ let filteredStartTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj["startTime"]));
1081
+ let filteredEndTime = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj["endTime"]));
1082
+ let startTimeArr = map(filteredStartTime, "startTime");
1083
+ let endTimeArr = map(filteredEndTime, "endTime");
1075
1084
  startTimeArr.sort((a, b) => {
1076
1085
  return this.dateTimeFormatService.sortByTimeAscending(a, b);
1077
1086
  });
@@ -1090,10 +1099,10 @@ export class AnnaFilterService {
1090
1099
  //use for the filters where we have different filter for start and end time
1091
1100
  //startTime: "06:00:00"
1092
1101
  setInitialValueForStartOrEndTimeRange(clonedData, key) {
1093
- let includeMulti = clonedData.findIndex((obj) => obj[key] == '<multi>') != -1;
1094
- let includeZero = clonedData.findIndex((obj) => obj[key] == '0') != -1;
1095
- let includeTimeRange = clonedData.findIndex((obj) => obj[key] != '0' && obj[key] != '<multi>') != -1;
1096
- let data = clonedData.filter((obj) => !['', '-', null, '0', '<multi>'].includes(obj[key]));
1102
+ let includeMulti = clonedData.findIndex((obj) => obj[key] == "<multi>") != -1;
1103
+ let includeZero = clonedData.findIndex((obj) => obj[key] == "0") != -1;
1104
+ let includeTimeRange = clonedData.findIndex((obj) => obj[key] != "0" && obj[key] != "<multi>") != -1;
1105
+ let data = clonedData.filter((obj) => !["", "-", null, "0", "<multi>"].includes(obj[key]));
1097
1106
  let timeArr = map(data, key);
1098
1107
  timeArr.sort((a, b) => {
1099
1108
  return this.dateTimeFormatService.sortByTimeAscending(a, b);
@@ -1122,24 +1131,24 @@ export class AnnaFilterService {
1122
1131
  selectedTimeObj = this.initialValueMap.get(key);
1123
1132
  }
1124
1133
  let timeArr;
1125
- if (key == 'startEndTime' || key == 'TimeBand') {
1134
+ if (key == "startEndTime" || key == "TimeBand") {
1126
1135
  timeArr = optionsData.map((item) => item[key][0]);
1127
1136
  }
1128
1137
  else {
1129
1138
  timeArr = optionsData.map((item) => item[key]);
1130
1139
  }
1131
- if (timeArr.findIndex((val) => val == '0') != -1) {
1140
+ if (timeArr.findIndex((val) => val == "0") != -1) {
1132
1141
  showZeroTimeCheckbox = true;
1133
1142
  zeroTimeCheckboxChecked = selectedTimeObj.includeZero;
1134
1143
  }
1135
- if (timeArr.findIndex((val) => val == '<multi>') != -1) {
1144
+ if (timeArr.findIndex((val) => val == "<multi>") != -1) {
1136
1145
  showMultiTimeCheckbox = true;
1137
1146
  multiTimeCheckboxChecked = selectedTimeObj.includeMulti;
1138
1147
  }
1139
1148
  if (showZeroTimeCheckbox || showMultiTimeCheckbox) {
1140
1149
  showEnterTimeCheckbox = true;
1141
1150
  }
1142
- if (timeArr.findIndex((val) => val != '<multi>' && val != '0') != -1) {
1151
+ if (timeArr.findIndex((val) => val != "<multi>" && val != "0") != -1) {
1143
1152
  enterTimeCheckboxChecked = selectedTimeObj?.includeTimeRange;
1144
1153
  }
1145
1154
  return {
@@ -1152,11 +1161,11 @@ export class AnnaFilterService {
1152
1161
  };
1153
1162
  }
1154
1163
  checkIfStartTimeIsAfterEndTime(startTime, endTime) {
1155
- let timeFormat = 'HH:mm:ss';
1156
- let startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
1157
- let startTime24HrFormat = startTime24HrFormatArr[0] + ':' + startTime24HrFormatArr[1] + ':00';
1158
- let endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
1159
- let endTime24HrFormat = endTime24HrFormatArr[0] + ':' + endTime24HrFormatArr[1] + ':00';
1164
+ let timeFormat = "HH:mm:ss";
1165
+ let startTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ":" + startTime[1] + " " + startTime[2], true);
1166
+ let startTime24HrFormat = startTime24HrFormatArr[0] + ":" + startTime24HrFormatArr[1] + ":00";
1167
+ let endTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ":" + endTime[1] + " " + endTime[2], true);
1168
+ let endTime24HrFormat = endTime24HrFormatArr[0] + ":" + endTime24HrFormatArr[1] + ":00";
1160
1169
  return dayjs(startTime24HrFormat, timeFormat).isAfter(dayjs(endTime24HrFormat, timeFormat));
1161
1170
  }
1162
1171
  getPreviousSelectedTimeFilter() {
@@ -1171,10 +1180,10 @@ export class AnnaFilterService {
1171
1180
  }
1172
1181
  getCurrentSelectedTimeFilter(startTime, endTime, includeMulti, includeZero, includeTimeRange) {
1173
1182
  let currentSelectedTimeFilter;
1174
- let fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ':' + startTime[1] + ' ' + startTime[2], true);
1175
- let fromTime24HrFormat = fromTime24HrFormatArr[0] + ':' + fromTime24HrFormatArr[1] + ':00';
1176
- let toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ':' + endTime[1] + ' ' + endTime[2], true);
1177
- let toTime24HrFormat = toTime24HrFormatArr[0] + ':' + toTime24HrFormatArr[1] + ':00';
1183
+ let fromTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(startTime[0] + ":" + startTime[1] + " " + startTime[2], true);
1184
+ let fromTime24HrFormat = fromTime24HrFormatArr[0] + ":" + fromTime24HrFormatArr[1] + ":00";
1185
+ let toTime24HrFormatArr = this.dateTimeFormatService.convertTotwentyFourHrsFormat(endTime[0] + ":" + endTime[1] + " " + endTime[2], true);
1186
+ let toTime24HrFormat = toTime24HrFormatArr[0] + ":" + toTime24HrFormatArr[1] + ":00";
1178
1187
  currentSelectedTimeFilter = {
1179
1188
  fromTime: fromTime24HrFormat,
1180
1189
  toTime: toTime24HrFormat,
@@ -1185,7 +1194,7 @@ export class AnnaFilterService {
1185
1194
  return currentSelectedTimeFilter;
1186
1195
  }
1187
1196
  incrementHourInput(arr) {
1188
- if (arr[0] == '') {
1197
+ if (arr[0] == "") {
1189
1198
  arr[0] = 1;
1190
1199
  }
1191
1200
  else if (parseInt(arr[0]) < 12) {
@@ -1196,7 +1205,7 @@ export class AnnaFilterService {
1196
1205
  }
1197
1206
  }
1198
1207
  decrementHourInput(arr) {
1199
- if (arr[0] == '') {
1208
+ if (arr[0] == "") {
1200
1209
  arr[0] = 12;
1201
1210
  }
1202
1211
  else if (parseInt(arr[0]) > 1) {
@@ -1210,31 +1219,31 @@ export class AnnaFilterService {
1210
1219
  // increment to nearest proper interval(15,30,45)
1211
1220
  let min = parseInt(arr[1]);
1212
1221
  if (min <= 14) {
1213
- arr[1] = '15';
1222
+ arr[1] = "15";
1214
1223
  }
1215
1224
  else if (min >= 15 && min <= 29) {
1216
- arr[1] = '30';
1225
+ arr[1] = "30";
1217
1226
  }
1218
1227
  else if (min >= 30 && min <= 44) {
1219
- arr[1] = '45';
1228
+ arr[1] = "45";
1220
1229
  }
1221
1230
  else if (min >= 45) {
1222
- arr[1] = '00';
1231
+ arr[1] = "00";
1223
1232
  }
1224
1233
  }
1225
1234
  decrementMinuteInput(arr) {
1226
1235
  let min = parseInt(arr[1]);
1227
1236
  if (min > 0 && min <= 15) {
1228
- arr[1] = '00';
1237
+ arr[1] = "00";
1229
1238
  }
1230
1239
  else if (min >= 16 && min <= 30) {
1231
- arr[1] = '15';
1240
+ arr[1] = "15";
1232
1241
  }
1233
1242
  else if (min >= 31 && min <= 45) {
1234
- arr[1] = '30';
1243
+ arr[1] = "30";
1235
1244
  }
1236
1245
  else if (min > 45 || min == 0) {
1237
- arr[1] = '45';
1246
+ arr[1] = "45";
1238
1247
  }
1239
1248
  }
1240
1249
  incrementOrDecrementHour(increment, time) {
@@ -1254,10 +1263,10 @@ export class AnnaFilterService {
1254
1263
  }
1255
1264
  }
1256
1265
  isHourValueInvalid(hr) {
1257
- return hr.length == 0 || !+hr || 1 > parseInt(hr) || parseInt(hr) > 12 || hr.includes('.');
1266
+ return hr.length == 0 || !+hr || 1 > parseInt(hr) || parseInt(hr) > 12 || hr.includes(".");
1258
1267
  }
1259
1268
  isMinuteValueInvalid(min) {
1260
- return (min.length != 2 || (!+min && min != '00') || 0 > parseInt(min) || parseInt(min) > 59 || min.includes('.'));
1269
+ return (min.length != 2 || (!+min && min != "00") || 0 > parseInt(min) || parseInt(min) > 59 || min.includes("."));
1261
1270
  }
1262
1271
  //=============================================================SORT======================================================================//
1263
1272
  updateSortMap(tempSortOrder, tableData, isLurAndCsrComponent) {
@@ -1267,12 +1276,12 @@ export class AnnaFilterService {
1267
1276
  return sortedTableData;
1268
1277
  }
1269
1278
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, deps: [{ token: i1.AnnaDateTimeFormatService }, { token: i2.AnnaSortService }], target: i0.ɵɵFactoryTarget.Injectable }); }
1270
- static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, providedIn: 'root' }); }
1279
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, providedIn: "root" }); }
1271
1280
  }
1272
1281
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AnnaFilterService, decorators: [{
1273
1282
  type: Injectable,
1274
1283
  args: [{
1275
- providedIn: 'root',
1284
+ providedIn: "root",
1276
1285
  }]
1277
1286
  }], ctorParameters: function () { return [{ type: i1.AnnaDateTimeFormatService }, { type: i2.AnnaSortService }]; } });
1278
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjthQXNDWixlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07SUFJOUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JB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QUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDL0YsQ0FBQztJQUVELG9CQUFvQixDQUFDLEdBQVc7UUFDNUIsT0FBTyxDQUNILEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQzVHLENBQUM7SUFDTixDQUFDO0lBRUQsMklBQTJJO0lBQzNJLGFBQWEsQ0FBQyxhQUF1QixFQUFFLFNBQWdCLEVBQUUsb0JBQTZCO1FBQ2xGLElBQUksQ0FBQyxlQUFlLENBQUMsZUFBZSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUUsSUFBSSxlQUFlLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ25ELElBQUksQ0FBQyxhQUFhLEVBQ2xCLGFBQWEsRUFDYixTQUFTLEVBQ1Qsb0JBQW9CLENBQ3ZCLENBQUM7UUFDRixPQUFPLGVBQWUsQ0FBQztJQUMzQixDQUFDOytHQXY4Q1EsaUJBQWlCO21IQUFqQixpQkFBaUIsY0FGZCxNQUFNOzs0RkFFVCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1IsVUFBVSxFQUFFLE1BQU07aUJBQ3JCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBPcHRpb25zIH0gZnJvbSAnQGFuZ3VsYXItc2xpZGVyL25neC1zbGlkZXInO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG4vLyBUaGlyZCBwYXJ0eSBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBtaW4sIG1heCwgbWFwLCBzb3J0QnksIHVuaXEsIGNsb25lRGVlcCwgaXNFcXVhbCB9IGZyb20gJ2xvZGFzaC1lcyc7XHJcbmltcG9ydCBkYXlqcyBmcm9tICdkYXlqcyc7XHJcbmltcG9ydCBDdXN0b21QYXJzZUZvcm1hdCBmcm9tICdkYXlqcy9wbHVnaW4vY3VzdG9tUGFyc2VGb3JtYXQnO1xyXG5pbXBvcnQgbWluTWF4IGZyb20gJ2RheWpzL3BsdWdpbi9taW5NYXgnO1xyXG5pbXBvcnQgaXNCZXR3ZWVuIGZyb20gJ2RheWpzL3BsdWdpbi9pc0JldHdlZW4nO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSAnLi4vbW9kZWxzL2FubmEtc29ydC5tb2RlbCc7XHJcblxyXG4vLyBVc2VyIGRlZmluZWQgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSwgTmdiRGF0ZVR5cGUgfSBmcm9tICcuL2FubmEtZGF0ZS10aW1lLWZvcm1hdC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQW5uYVNvcnRTZXJ2aWNlIH0gZnJvbSAnLi9hbm5hLXNvcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2RlbCB9IGZyb20gJy4uL21vZGVscy9hbm5hLXRvb2x0aXAubW9kZWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQW5uYUZpbHRlclNlcnZpY2Uge1xyXG4gICAgdG9vbHRpcE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIHRvb2x0aXBTZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTtcclxuICAgIGluaXRpYWxWYWx1ZU1hcDogTWFwPHN0cmluZywgYW55PjtcclxuICAgIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZztcclxuICAgIHNlbGVjdGVkUmFkaW86IHN0cmluZztcclxuICAgIHN1YlJhZGlvQnV0dG9uOiBzdHJpbmc7XHJcblxyXG4gICAgY2FsZW5kYXJTZXQ6IFNldDxzdHJpbmc+O1xyXG4gICAgc2xpZGVyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHRpbWVTZXQ6IFNldDxzdHJpbmc+O1xyXG5cclxuICAgIGluY2x1ZGVNdWx0aVRpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlWmVyb1RpbWU6IGJvb2xlYW47XHJcbiAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuO1xyXG5cclxuICAgIGFwcGxpZWRGaWx0ZXJzQXJyYXk6IHN0cmluZ1tdID0gW107XHJcbiAgICBmbGlnaHREYXRlUmFuZ2U6IHsgbWluU2VsZWN0ZWREYXRlOiBhbnk7IG1heFNlbGVjdGVkRGF0ZTogYW55IH07XHJcbiAgICBzbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9O1xyXG4gICAgbmd4U2xpZGVyT2JqOiBPcHRpb25zO1xyXG4gICAgc2xpZGVyQ3VycmVuY3lTZXQgPSBuZXcgU2V0KFtcclxuICAgICAgICAnYm9va2VkJyxcclxuICAgICAgICAnY3BwJyxcclxuICAgICAgICAnY3BtJyxcclxuICAgICAgICAncmN2UHJlZW1wdCcsXHJcbiAgICAgICAgJ29zUHJlZW1wdCcsXHJcbiAgICAgICAgJ3Bvc3RlZEFkdScsXHJcbiAgICAgICAgJ3NjaGVkdWxlZEFkdScsXHJcbiAgICAgICAgJ2F1ZGllbmNlRGVmaWNpdCcsXHJcbiAgICAgICAgJ1JhdGUnLFxyXG4gICAgICAgICd1c2VyQURVcycsXHJcbiAgICAgICAgJ2J1eWVyQ2hhbmdlcycsXHJcbiAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAndXNlck1HJyxcclxuICAgICAgICAndWRWYWx1ZScsXHJcbiAgICAgICAgJ29kVmFsdWUnLFxyXG4gICAgXSk7XHJcblxyXG4gICAgcHVibGljIHN0YXRpYyBidWZmZXJTaXplID0gMjA7XHJcbiAgICBpc0ZpbHRlclNvcnRBY3RpdmU6IGFueSA9IHt9O1xyXG4gICAgcmVzZXRGaWx0ZXJTb3J0QWN0aXZlU3RhdHVzOiBib29sZWFuID0gdHJ1ZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcihcclxuICAgICAgICBwcml2YXRlIGRhdGVUaW1lRm9ybWF0U2VydmljZTogQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZSxcclxuICAgICAgICBwcml2YXRlIGFubmFTb3J0U2VydmljZTogQW5uYVNvcnRTZXJ2aWNlLFxyXG4gICAgKSB7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKG1pbk1heCk7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKGlzQmV0d2Vlbik7XHJcbiAgICAgICAgZGF5anMuZXh0ZW5kKEN1c3RvbVBhcnNlRm9ybWF0KTtcclxuICAgICAgICBjb25zdCBzbGlkZXJBcnIgPSBbXHJcbiAgICAgICAgICAgICdyY3ZQcmVlbXB0JyxcclxuICAgICAgICAgICAgJ29zUHJlZW1wdCcsXHJcbiAgICAgICAgICAgICdyY3ZVbmRlckRseScsXHJcbiAgICAgICAgICAgICdwb3N0ZWRBdWRQZXJjZW50JyxcclxuICAgICAgICAgICAgJ2Jvb2tlZCcsXHJcbiAgICAgICAgICAgICdzcG90cycsXHJcbiAgICAgICAgICAgICdncnAnLFxyXG4gICAgICAgICAgICAnYXZlcmFnZVJhdGVUaGlzWWVhcicsXHJcbiAgICAgICAgICAgICdhdmVyYWdlUmF0ZUxhc3RZZWFyJyxcclxuICAgICAgICAgICAgJ2F2ZXJhZ2VDUFAnLFxyXG4gICAgICAgICAgICAnYXZlcmFnZUNQTScsXHJcbiAgICAgICAgICAgICdJTVBTRGlmZicsXHJcbiAgICAgICAgICAgICdSVEdEaWZmJyxcclxuICAgICAgICAgICAgJ2NwcCcsXHJcbiAgICAgICAgICAgICdpbXBzJyxcclxuICAgICAgICAgICAgJ2NwbScsXHJcbiAgICAgICAgICAgICdvc1VuZGVyRGx5JyxcclxuICAgICAgICAgICAgJ3RvdGFsV2Vla3MnLFxyXG4gICAgICAgICAgICAnV2Vla051bWJlcicsXHJcbiAgICAgICAgICAgICdSYXRlJyxcclxuICAgICAgICAgICAgJ09yZGVyZWRSYXRpbmdzT3JJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdQb3N0ZWRSYXRpbmdzT3JJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICxcclxuICAgICAgICAgICAgJ3Bvc3RlZEF1ZFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAncG9zdGVkQWR1JyxcclxuICAgICAgICAgICAgJ3NjaGVkdWxlZEFkdScsXHJcbiAgICAgICAgICAgICdhdWRpZW5jZURlZmljaXQnLFxyXG4gICAgICAgICAgICAnb2ZmZXJlZE1HcycsXHJcbiAgICAgICAgICAgICdvdXRzdGFuZGluZ1BFJyxcclxuICAgICAgICAgICAgJ29mZmVyZWRBRFVzJyxcclxuICAgICAgICAgICAgJ3VkRGVmaWNpdFZhbHVlJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZFNwb3RzJyxcclxuICAgICAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ1VER3JwJyxcclxuICAgICAgICAgICAgJ1VESW1wcycsXHJcbiAgICAgICAgICAgICdPREdycCcsXHJcbiAgICAgICAgICAgICdPREltcHMnLFxyXG4gICAgICAgICAgICAndWRJbXBzUGVyY2VudCcsXHJcbiAgICAgICAgICAgICd1ZEdycFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAnb2RJbXBzUGVyY2VudCcsXHJcbiAgICAgICAgICAgICdvZEdycFBlcmNlbnQnLFxyXG4gICAgICAgICAgICAndXNlckFEVXMnLFxyXG4gICAgICAgICAgICAnYnV5ZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ3VzZXJDaGFuZ2VzJyxcclxuICAgICAgICAgICAgJ3VzZXJNRycsXHJcbiAgICAgICAgICAgICdXZWVrbHlBVVInLFxyXG4gICAgICAgICAgICAnV2Vla2x5QVVSYXRpbmdPckltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ01Hc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ0FEVXNWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyQ3JlZGl0ZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyVW5yZXNvbHZlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ0J1eWVyQWRkZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCdXllckRlbGV0ZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCdXllckNoYW5nZXNWYWx1ZScsXHJcbiAgICAgICAgICAgICdVc2VyQ2hhbmdlc1ZhbHVlJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZEdSUE9ySU1QUycsXHJcbiAgICAgICAgICAgICdCb29rZWRDUFBPckNQTScsXHJcbiAgICAgICAgICAgICdCb29rZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdCb29rZWRTcG90cycsXHJcbiAgICAgICAgICAgICdCb29rZWRSYXRlJyxcclxuICAgICAgICAgICAgJ2F2ZXJhZ2VSYXRlJyxcclxuICAgICAgICAgICAgJ3Byb2plY3RlZElNUFMnLFxyXG4gICAgICAgICAgICAncHJvamVjdGVkUlRHJyxcclxuICAgICAgICAgICAgJ2Rlc2lyZWRDUE0nLFxyXG4gICAgICAgICAgICAnZGVzaXJlZENQUCcsXHJcbiAgICAgICAgICAgICdpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVNhbWVXZWVrJyxcclxuICAgICAgICAgICAgJ2ludmVudG9yeUZpbGxQZXJjZW50YWdlRmluYWwnLFxyXG4gICAgICAgICAgICAnaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VUaWxsRGF0ZScsXHJcbiAgICAgICAgICAgICdkb2xsYXJSYXRlSW1wYWN0JyxcclxuICAgICAgICAgICAgJ2RvbGxhcklNUFNJbXBhY3QnLFxyXG4gICAgICAgICAgICAnSU1QU0ltcGFjdCcsXHJcbiAgICAgICAgICAgICdkb2xsYXJSVEdJbXBhY3QnLFxyXG4gICAgICAgICAgICAnUlRHSW1wYWN0JyxcclxuICAgICAgICAgICAgJ0Jvb2tlZFJURycsXHJcbiAgICAgICAgICAgICdCb29rZWRJTVBTJyxcclxuICAgICAgICAgICAgJ0FVUlRHJyxcclxuICAgICAgICAgICAgJ0FVUlRHJyxcclxuICAgICAgICAgICAgJ1Bvc3RlZFJhdGluZycsXHJcbiAgICAgICAgICAgICdQb3N0ZWRJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdOb3JtYWxpemVkT3JkZXJlZFJhdGluZycsXHJcbiAgICAgICAgICAgICdOb3JtYWxpemVkT3JkZXJlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ05vcm1hbGl6ZWRQb3N0ZWRSYXRpbmcnLFxyXG4gICAgICAgICAgICAnTm9ybWFsaXplZFBvc3RlZEltcHJlc3Npb25zJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZEdSUCcsXHJcbiAgICAgICAgICAgICdCb29rZWRJTVBTUmV2VGFiJyxcclxuICAgICAgICAgICAgJ0Jvb2tlZENQUCcsXHJcbiAgICAgICAgICAgICdCb29rZWRDUE0nLFxyXG4gICAgICAgICAgICAnQVVJTVBTJyxcclxuICAgICAgICAgICAgJ2Jvb2tlZEFtb3VudFZhbHVlJyxcclxuICAgICAgICAgICAgJ2VxdWl2YWxpemVkQm9va2VkQW1vdW50VmFsdWUnLFxyXG4gICAgICAgICAgICAnSU1QUycsXHJcbiAgICAgICAgICAgICd1ZFZhbHVlJyxcclxuICAgICAgICAgICAgJ29kVmFsdWUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0ZWRCb29rZWRWYWx1ZScsXHJcbiAgICAgICAgICAgICdWaW9sYXRlZEJvb2tlZEVVUlZhbHVlJyxcclxuICAgICAgICAgICAgJ1Zpb2xhdGluZ0Jvb2tlZEVVUlZhbHVlJyxcclxuICAgICAgICAgICAgJ1Zpb2xhdGluZ0Jvb2tlZFZhbHVlJyxcclxuICAgICAgICAgICAgJ1JlYmF0ZScsXHJcbiAgICAgICAgICAgICdXZWVrbHlBVVInLFxyXG4gICAgICAgICAgICAncGFyZW50Um93QW5uYUVzdGltYXRlc1J0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRSdGcnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VSdGcnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93U3RhdGlvbkVzdGltYXRlc1J0ZycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dQb3N0ZWRJbXBzJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1JvbGxpbmdBdmVyYWdlSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzSW1wcycsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzU2hhcmUnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93UG9zdGVkU2hhcmUnLFxyXG4gICAgICAgICAgICAncGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VTaGFyZScsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0UGVyJyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZFB1dFBlcicsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dFBlcicsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0JyxcclxuICAgICAgICAgICAgJ3BhcmVudFJvd1Bvc3RlZFB1dCcsXHJcbiAgICAgICAgICAgICdwYXJlbnRSb3dSb2xsaW5nQXZlcmFnZVB1dCcsXHJcbiAgICAgICAgICAgICdQcm9qZWN0ZWRJbXByZXNzaW9ucycsXHJcbiAgICAgICAgICAgICdQcm9qZWN0ZWRSdGcnLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXHJcbiAgICAgICAgICAgICdwZXJpb2QnLFxyXG4gICAgICAgICAgICAnQWlyRGF0ZScsXHJcbiAgICAgICAgICAgICdmbGlnaHRTdGFydERhdGUnLFxyXG4gICAgICAgICAgICAnZmxpZ2h0RW5kRGF0ZScsXHJcbiAgICAgICAgICAgICdkYXRlJyxcclxuICAgICAgICAgICAgJ3N0YXJ0RGF0ZScsXHJcbiAgICAgICAgICAgICdlbmREYXRlJyxcclxuICAgICAgICAgICAgJ3JldmlzaW9uU3RhcnREYXRlJyxcclxuICAgICAgICAgICAgJ0dlbmVyYXRlZE9uJyxcclxuICAgICAgICAgICAgJ1dlZWsnLFxyXG4gICAgICAgICAgICAndGltZW91dERhdGUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0aW5nU3BvdERhdGUnLFxyXG4gICAgICAgICAgICAnVmlvbGF0ZWRTcG90RGF0ZScsXHJcbiAgICAgICAgXTtcclxuICAgICAgICBjb25zdCB0aW1lQXJyID0gW1xyXG4gICAgICAgICAgICAnU3RhcnRUaW1lRm9yRmlsdGVyJyxcclxuICAgICAgICAgICAgJ0VuZFRpbWVGb3JGaWx0ZXInLFxyXG4gICAgICAgICAgICAndGltZScsXHJcbiAgICAgICAgICAgICdzdGFydFRpbWVGb3JGaWx0ZXInLFxyXG4gICAgICAgICAgICAnZW5kVGltZUZvckZpbHRlcicsXHJcbiAgICAgICAgICAgICdzdGFydF90aW1lX2Zvcl9maWx0ZXInLFxyXG4gICAgICAgICAgICAnZW5kX3RpbWVfZm9yX2ZpbHRlcicsXHJcbiAgICAgICAgICAgICdzdGFydEVuZFRpbWVNdWx0aScsXHJcbiAgICAgICAgICAgICdzdGFydEVuZFRpbWUnLFxyXG4gICAgICAgICAgICAndGltZW91dFRpbWUnLFxyXG4gICAgICAgICAgICAnU3RhcnRUaW1lJyxcclxuICAgICAgICAgICAgJ0VuZFRpbWUnLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5zbGlkZXJTZXQgPSBuZXcgU2V0KHNsaWRlckFycik7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgICAgIHRoaXMudGltZVNldCA9IG5ldyBTZXQodGltZUFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWF4QW5kTWluVmFsdWUoZGF0YTogYW55W10sIGtleTogc3RyaW5nLCBpc01pbjogYm9vbGVhbikge1xyXG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVzID0gZGF0YS5tYXAoKHgpID0+IHhba2V5XSk7XHJcbiAgICAgICAgbGV0IHZhbHVlVG9SZXR1cm4gPSBpc01pbiA/IG1pbih2YWx1ZXMpIDogbWF4KHZhbHVlcyk7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlVG9SZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWluQW5kTWF4RGF0ZShkYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGxldCBEYXRlQXJyID0gZGF0YS5tYXAoKG9iaikgPT4gZGF5anMob2JqW2tleV0pKTtcclxuICAgICAgICBsZXQgbWluRGF0ZSA9IGRheWpzLm1pbihEYXRlQXJyKTtcclxuICAgICAgICBsZXQgbWF4RGF0ZSA9IGRheWpzLm1heChEYXRlQXJyKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFttaW5EYXRlLCBtYXhEYXRlXTtcclxuICAgIH1cclxuXHJcbiAgICBpc1Rvb2x0aXBBY3RpdmUoaGVhZGVyOiBzdHJpbmdbXSwgc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KTogYm9vbGVhbiB7XHJcbiAgICAgICAgbGV0IHNldDogU2V0PHN0cmluZz4gPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcbiAgICAgICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMF0pICYmIHNvcnRNYXAuZ2V0KGhlYWRlclswXSkgIT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgbGV0IGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUgPSBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIHNvcnRNYXAuZ2V0KGhlYWRlclsxXSkgIT0gU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcblxyXG4gICAgICAgIGlmIChoZWFkZXIubGVuZ3RoID09IDEpIHtcclxuICAgICAgICAgICAgcmV0dXJuIChzb3J0TWFwLnNpemUgPiAwICYmIGlzU29ydE1hcEZvckhlYWRlcjBBY3RpdmUpIHx8IHNldC5oYXMoaGVhZGVyWzBdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChzb3J0TWFwLnNpemUgPiAwICYmIHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHxcclxuICAgICAgICAgICAgKHNvcnRNYXAuc2l6ZSA+IDAgJiYgc29ydE1hcC5oYXMoaGVhZGVyWzFdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIxQWN0aXZlKSB8fFxyXG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclswXSkgfHxcclxuICAgICAgICAgICAgc2V0LmhhcyhoZWFkZXJbMV0pXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBjbGVhckNvbHVtbkZpbHRlcigpIHtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIGxldCBhcHBsaWVkRmlsdGVyU2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICAgICAgYXBwbGllZEZpbHRlclNldC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgdGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5ID0gWy4uLmFwcGxpZWRGaWx0ZXJTZXRdO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHNldE9wdGlvblZhbHVlcyhtaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgZmxvb3I6IG1pblZhbHVlLFxyXG4gICAgICAgICAgICBjZWlsOiBtYXhWYWx1ZSxcclxuICAgICAgICAgICAgZGlzYWJsZWQ6IHRydWUsXHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZTogdGhpcy5ub3JtYWxUcmFuc2xhdGVGdW5jdGlvbixcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIHBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2slJztcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0nICsgdmFsIDogdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBsZXQgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSkgPT0gZGF0YTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gJy0nICsgdmFsICsgJyUnIDogdmFsICsgJyUnO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAnJCcgKyAoTWF0aC5hYnMoZGF0YSkgLyAxMDAwKS50b0ZpeGVkKDEpICsgJ2snO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLScgKyB2YWwgOiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyAnLSQnICsgdmFsIDogJyQnICsgdmFsO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgbm9ybWFsVHJhbnNsYXRlRnVuY3Rpb24gPSAoZGF0YTogbnVtYmVyKTogc3RyaW5nID0+IHtcclxuICAgICAgICBpZiAoZGF0YSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChkYXRhIC8gMTAwMCkudG9GaXhlZCgxKSArICdrJztcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVsnZGF0ZSddKSk7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0OiBOZ2JEYXRlVHlwZVtdID0gW107XHJcbiAgICAgICAgdW5pcXVlRGF0ZXMuZm9yRWFjaCgoZGF0ZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHVuaXF1ZURhdGVzSW5OZ2JEYXRlRm9ybWF0LnB1c2goXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlU3RhbmRhcmRGb3JtYXQoZGF5anMoZGF0ZSwgJ01NL0REL1lZJykuZm9ybWF0KCdNTS9ERC9ZWVlZJykpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNBcnJheShpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkLCBkYXRlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICd1c2VyJyAmJiAhdGhpcy50b29sdGlwTWFwLmhhcygndXNlcicpKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPSBjbG9uZURlZXAoaXNIaWVyYXJjaGlhbFVzZXJGaWx0ZXJlZCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdTdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnRW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnZW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICd0aW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3RpbWVvdXRUaW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ1N0YXJ0VGltZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdFbmRUaW1lJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0RW5kVGltZU11bHRpJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09ICdzdGFydEVuZFRpbWUnIHx8IHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgIGlzRmlsdGVyZWQgPVxyXG4gICAgICAgICAgICAgICAgIWlzRXF1YWwoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksXHJcbiAgICAgICAgICAgICAgICApIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlWmVyb1RpbWUgfHxcclxuICAgICAgICAgICAgICAgICF0aGlzLmluY2x1ZGVNdWx0aVRpbWU7XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNsaWRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5zbGlkZXJEYXRhKTtcclxuICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncG9zdGVkQWR1JyAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09ICdub3RSZXF1aXJlZCcpIHtcclxuICAgICAgICAgICAgICAgIGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICghaXNGaWx0ZXJlZCAmJiB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3N0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdlbmREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3BlcmlvZCcgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdBaXJEYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ3RpbWVvdXREYXRlJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PT0gJ2ZsaWdodEVuZERhdGUnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAnZGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdyZXZpc2lvblN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdHZW5lcmF0ZWRPbicgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09ICdXZWVrJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5mbGlnaHREYXRlUmFuZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCAhPSB0b3RhbE9wdGlvbnNDb3VudCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgaWYgKGlzRmlsdGVyZWQgJiYgIXNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpbHRlcmVkICYmIHNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5zZXRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YTogYW55W10pIHtcclxuICAgICAgICBpZiAoIXRoaXMuYW5uYVNvcnRTZXJ2aWNlPy5jb2x1bW5Tb3J0U3RhdGUpIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09ICdBU0MnKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKHRydWUsIG9yaWdpbmFsRGF0YSwga2V5KSxcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gJ0RFU0MnKSB7XHJcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERhdGEgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2Uuc29ydERhdGFGb3JDb21wb25lbnRPdGhlclRoYW5MdXJBbmRDc3JQYWdlKGZhbHNlLCBvcmlnaW5hbERhdGEsIGtleSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgZmlsdGVyRGF0YShvcmlnaW5hbERhdGE6IGFueVtdLCBrZXlUb1NraXA6IHN0cmluZywgaXNMdXJDc3JQYWdlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gWy4uLm9yaWdpbmFsRGF0YV07XHJcbiAgICAgICAgaWYgKCFpc0x1ckNzclBhZ2UpIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gdGhpcy5jaGVja0lmU29ydGluZ0lzQXBwbGllZFRoZW5Tb3J0VGhlRGF0YShvcmlnaW5hbERhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkgIT0ga2V5VG9Ta2lwICYmIG9yaWdpbmFsRGF0YS5sZW5ndGggPiAwICYmIE9iamVjdC5rZXlzKG9yaWdpbmFsRGF0YVswXSkuaW5jbHVkZXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiBvYmpba2V5XSA+PSB2YWx1ZS5taW4gJiYgb2JqW2tleV0gPD0gdmFsdWUubWF4KTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnc3RhcnREYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ2VuZERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnQWlyRGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICd0aW1lb3V0RGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdmbGlnaHRTdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ2RhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdEYXRlJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAncmV2aXNpb25TdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdHZW5lcmF0ZWRPbicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdXZWVrJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGVkU3BvdERhdGUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnVmlvbGF0aW5nU3BvdERhdGUnXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdwZXJpb2QnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmdldERhdGFJblRoZURhdGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnU3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ0VuZFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICd0aW1lb3V0VGltZScgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdzdGFydFRpbWVGb3JGaWx0ZXInIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSAnZW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdTdGFydFRpbWUnIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09ICdFbmRUaW1lJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0X3RpbWVfZm9yX2ZpbHRlcicgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09ICdlbmRfdGltZV9mb3JfZmlsdGVyJyB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSAndGltZSdcclxuICAgICAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gdGhpcy5yZXR1cm5EYXRhRm9yRnJvbUFuZFRvVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGFydEVuZFRpbWVNdWx0aScgfHwga2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PT0gJ1RpbWVCYW5kJykge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSxcclxuICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigodSkgPT4gdmFsdWUuaW5jbHVkZXModVtrZXldKSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gZmlsdGVyZWREYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk9yZGVyc0luVGhlUmFuZ2Uob3JkZXI6IGFueSwgcmFuZ2U6IGFueSwga2V5OiBhbnkpIHtcclxuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVNlbGVjdGVkUmFuZ2UgPSBkYXlqcyhvcmRlcltrZXldKS5pc0JldHdlZW4ocmFuZ2UubWluU2VsZWN0ZWREYXRlLCByYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgPSBkYXlqcyhvcmRlcltrZXldKS5pc1NhbWUocmFuZ2UubWluU2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlID0gZGF5anMob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1heFNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlIHx8IGlzRGF0ZVNhbWVBc1RoZU1pblNlbGVjdGVkRGF0ZSB8fCBpc0RhdGVTYW1lQXNUaGVNYXhTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvclRpbWVSYW5nZShvYmo6IGFueSwgc2VsZWN0ZWREYXRhOiBhbnkpIHtcclxuICAgICAgICBsZXQgZm9ybWF0ID0gJ0hIOm1tOnNzJztcclxuICAgICAgICBsZXQgc2VsZWN0ZWRTdGFydERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEVuZERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gZGF5anMob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IGRheWpzKG9iai5lbmRUaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkU3RhcnREYXRlLCBzZWxlY3RlZEVuZERhdGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSAnTU0vREQvWVlZWSBISDptbTpzcyc7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRnJvbVRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgc2VsZWN0ZWREYXRhLmZyb21UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZSA9IGRheWpzKCcwMS8wMS8yMDAxICcgKyBzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcblxyXG4gICAgICAgIGlmIChbJycsICctJywgbnVsbF0uaW5jbHVkZXMob2JqVGltZSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSAnPG11bHRpPicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSAnPG11bHRpPicpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gJzAnKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGF5anNUaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIG9ialRpbWUsIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lID0gZGF5anNUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBsZXQgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRUb1RpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBsZXQgaXNPYmpUaW1lQmV0d2VlblNlbGVjdGVkRnJvbVRpbWVBbmRUb1RpbWUgPSBkYXlqc1RpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgaXNPYmpUaW1lU2FtZUFzU2VsZWN0ZWRGcm9tVGltZSB8fFxyXG4gICAgICAgICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSB8fFxyXG4gICAgICAgICAgICBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iajogYW55LCBzZWxlY3RlZERhdGE6IGFueSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgZm9ybWF0ID0gJ01NL0REL1lZWVkgSEg6bW06c3MnO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZyb21UaW1lID0gZGF5anMoJzAxLzAxLzIwMDEgJyArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgc2VsZWN0ZWREYXRhLnRvVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV1bMF0gPT0gJzxtdWx0aT4nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZU11bHRpICYmIG9ialtrZXldWzBdID09ICc8bXVsdGk+Jykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09ICcwJykge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXNlbGVjdGVkRGF0YS5pbmNsdWRlVGltZVJhbmdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqW2tleV1bMV0sIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBkYXlqcygnMDEvMDEvMjAwMSAnICsgb2JqW2tleV1bMl0sIGZvcm1hdCk7XHJcblxyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lID0gc3RhcnRUaW1lLmlzU2FtZShzZWxlY3RlZEZyb21UaW1lKTtcclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBzdGFydFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuICAgICAgICBsZXQgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lID0gZW5kVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgPSBlbmRUaW1lLmlzQmV0d2VlbihzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZSk7XHJcblxyXG4gICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iajogYW55LCB2YWx1ZTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBwYXJzaW5nRm9ybWF0OiBzdHJpbmc7XHJcbiAgICAgICAgaWYgKGtleSA9PT0gJ3BlcmlvZCcpIHtcclxuICAgICAgICAgICAgcGFyc2luZ0Zvcm1hdCA9ICdZWVlZLU1NLUREJztcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXlqc1N0YXJ0RGF0ZSA9IGRheWpzKG9iai5zdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF5anNFbmREYXRlID0gZGF5anMob2JqLmVuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqc1N0YXJ0RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzRW5kRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUoZGF5anNTdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAgICAgICAgIChlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ0FpckRhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnV2VlaycgfHxcclxuICAgICAgICAgICAga2V5ID09PSAndGltZW91dERhdGUnXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSAnTU0vREQvWVlZWSc7XHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4oXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5taW5TZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5tYXhTZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRpYWxpemVUaW1lRmlsdGVyRGF0YShjbG9uZWREYXRhOiBhbnlbXSwga2V5ID0gJ3N0YXJ0RW5kVGltZScpIHtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGNsb25lZERhdGEsICdzdGFydFRpbWUnKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcChjbG9uZWREYXRhLCAnZW5kVGltZScpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09ICdzdGFydEVuZFRpbWUnKSB7XHJcbiAgICAgICAgICAgIGxldCB0aW1lID0gZGF0YS5tYXAoKHUpID0+IHVbaGVhZGVyTmFtZV1bMF0pO1xyXG4gICAgICAgICAgICBsZXQgdW5pcVRpbWUgPSB1bmlxKHRpbWUpO1xyXG4gICAgICAgICAgICByZXR1cm4gdW5pcVRpbWUubGVuZ3RoID09IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXSkpLmxlbmd0aCA+IDEgPyBmYWxzZSA6IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyT3B0aW9uc0RhdGEoZGF0YTogYW55W10sIGNsb25lZERhdGE6IGFueVtdLCBrZXk/OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgYXBwbGllZEZpbHRlclNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICBrZXkgPSBrZXkgPyBrZXkgOiB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKGFwcGxpZWRGaWx0ZXJTZXQuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsdGVyRGF0YShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNTdGF0ZShjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBpc0ZpbHRlcmVkID0gdHJ1ZTtcclxuICAgICAgICBpc0ZpbHRlcmVkID0gdGhpcy5jaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGEsIHZhbHVlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkZpbHRlcklzQXBwbGllZChjbG9uZWREYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBpbml0aWFsVmFsdWVPZkNvbHVtbiA9IHNvcnRCeShjbG9uZWREYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSk7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KHRoaXMuYXBwbHlGaWx0ZXIoY2xvbmVkRGF0YSwgdmFsdWUpLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSk7XHJcbiAgICAgICAgcmV0dXJuICFpc0VxdWFsKGluaXRpYWxWYWx1ZU9mQ29sdW1uLCBjdXJyZW50VmFsdWVPZkNvbHVtbik7XHJcbiAgICB9XHJcblxyXG4gICAgYXBwbHlGaWx0ZXIoZGF0YTogYW55W10sIHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBsZXQgZmlsdGVyZWREYXRhID0gZGF0YTtcclxuICAgICAgICBsZXQga2V5ID0gdGhpcy5zZWxlY3RlZFJhZGlvO1xyXG4gICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IG9ialtrZXldID49IHZhbHVlLm1pbiAmJiBvYmpba2V5XSA8PSB2YWx1ZS5tYXgpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ3N0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnQWlyRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAndGltZW91dERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2ZsaWdodFN0YXJ0RGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnZmxpZ2h0RW5kRGF0ZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdkYXRlJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gJ0RhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAncmV2aXNpb25TdGFydERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAnR2VuZXJhdGVkT24nIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1dlZWsnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGVkU3BvdERhdGUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1Zpb2xhdGluZ1Nwb3REYXRlJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAncGVyaW9kJykge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gJ1N0YXJ0VGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnRW5kVGltZUZvckZpbHRlcicgfHxcclxuICAgICAgICAgICAga2V5ID09ICd0aW1lb3V0VGltZScgfHxcclxuICAgICAgICAgICAga2V5ID09PSAnc3RhcnRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdlbmRUaW1lRm9yRmlsdGVyJyB8fFxyXG4gICAgICAgICAgICBrZXkgPT09ICdzdGFydF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gJ2VuZF90aW1lX2Zvcl9maWx0ZXInIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAndGltZScgfHxcclxuICAgICAgICAgICAga2V5ID09ICdTdGFydFRpbWUnIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSAnRW5kVGltZSdcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdzdGFydEVuZFRpbWVNdWx0aScgfHwga2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PT0gJ1RpbWVCYW5kJykge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBpc09iamVjdEluVGhlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGxldCBkYXlqc0RhdGUgPSBkYXlqcyhvYmpWYWwpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZnJvbURhdGUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiB2YWx1ZS50b0RhdGUgPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICAgIHZhbHVlLmZyb21EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUodmFsdWUuZnJvbURhdGUsICdERC9NTS9ZWVlZJyksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YWx1ZS50b0RhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS50b0RhdGUsICdERC9NTS9ZWVlZJyksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzU3RhcnRPZlRoZVJhbmdlID0gdmFsdWUuZnJvbURhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc0VuZE9mVGhlUmFuZ2UgPSB2YWx1ZS50b0RhdGUuaXNTYW1lKG9ialZhbCk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2UgPSBkYXlqc0RhdGUuaXNCZXR3ZWVuKHZhbHVlLmZyb21EYXRlLCB2YWx1ZS50b0RhdGUpO1xyXG4gICAgICAgIHJldHVybiBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgfHwgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSB8fCBpc0RhdGVCZXR3ZWVuVGhlU3RhcnRBbmRFbmRPZlJhbmdlO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZUaGVDdXJyZW50RmlsdGVyVGFiKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIGxldCBhY3RpdmVLZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgbGV0IGtleUFycjogc3RyaW5nW10gPSBbXTtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGlmIChrZXkuaW5jbHVkZXMoYWN0aXZlS2V5KSkge1xyXG4gICAgICAgICAgICAgICAga2V5QXJyID0ga2V5LnNwbGl0KCcsJyk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHVwZGF0ZVN0YXRlT2ZBbGxUaGVLZXlzKHNvcnRNYXA6IE1hcDxzdHJpbmcsIFNvcnRUeXBlPikge1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgbGV0IGtleUFyciA9IGtleS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRIb3VyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT0gJycpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUpIDwgMTIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSkgKyAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudEhvdXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIGlmICh2YWx1ZSA9PSAnJykge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDEyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQodmFsdWUpID4gMSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKSAtIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxMjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5lYXJlc3QgcHJvcGVyIGludGVydmFsKDE1LDMwLDQ1KVxyXG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludCh2YWx1ZSk7XHJcbiAgICAgICAgaWYgKG1pbiA8PSAxNCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTUgJiYgbWluIDw9IDI5KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzMwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAzMCAmJiBtaW4gPD0gNDQpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnNDUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDQ1KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzAwJztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAobWluID4gMCAmJiBtaW4gPD0gMTUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAnMDAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE2ICYmIG1pbiA8PSAzMCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzMwJztcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IDQ1IHx8IG1pbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gJzQ1JztcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNoZWNrYm94IG1ldGhvZD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGRpc2FibGVBY3RpdmVGaWx0ZXJDbGVhckJ1dHRvbigpIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGaWx0ZXJTZXQgPSBuZXcgU2V0KHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSk7XHJcblxyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpO1xyXG4gICAgICAgIGxldCBpc1NvcnRQcmVzZW50ID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zaXplID4gMCAmJlxyXG4gICAgICAgICAgICBjdXJyZW50Q29sdW1uU29ydEZpbHRlciAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgcmV0dXJuICEoc2VsZWN0ZWRGaWx0ZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgfHwgaXNTb3J0UHJlc2VudCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpOiBzdHJpbmcge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPyBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA6IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG4gICAgICAgIHJldHVybiBjdXJyZW50Q29sdW1uU29ydEZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVMaXN0Rm9yQ2hlY2tib3hGaWx0ZXIoaGVhZGVyOiBzdHJpbmcsIG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHRvb2x0aXBPcHRpb25zID0gdGhpcy5nZXRUb29sdGlwTW9kZWxGcm9tT3B0aW9uRGF0YShvcHRpb25EYXRhLCBoZWFkZXIpO1xyXG5cclxuICAgICAgICB0aGlzLnNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zLCBoZWFkZXIpO1xyXG4gICAgICAgIHRoaXMuZm9ybWF0TnVsbE9wdGlvblRvU3BlY2lmaWVkU3RyaW5nKHRvb2x0aXBPcHRpb25zLCAnLScpO1xyXG5cclxuICAgICAgICByZXR1cm4gdG9vbHRpcE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0VG9vbHRpcE1vZGVsRnJvbU9wdGlvbkRhdGEob3B0aW9uRGF0YTogYW55W10sIGhlYWRlcjogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IHVuaXFPcHRpb25EYXRhID0gdW5pcShvcHRpb25EYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtoZWFkZXJdKSk7XHJcbiAgICAgICAgcmV0dXJuIHVuaXFPcHRpb25EYXRhLm1hcCgoaXRlbSwgaW5kZXgpID0+IG5ldyBUb29sdGlwTW9kZWwoaXRlbSwgaW5kZXggKyAxKSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRWYWx1ZVNldCA9IG5ldyBTZXQodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcikpO1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc1NlbGVjdGVkID0gc2VsZWN0ZWRWYWx1ZVNldC5oYXMoaXRlbS52YWx1ZSkgPyB0cnVlIDogZmFsc2UpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiAoaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZSkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBmb3JtYXR0ZWRTdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS52YWx1ZSA9PSBudWxsKTtcclxuXHJcbiAgICAgICAgaWYgKGluZGV4ICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHRvb2x0aXBPcHRpb25zW2luZGV4XS5sYWJlbCA9IGZvcm1hdHRlZFN0cmluZztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q2xvbmVkVG9vbHRpcEFuZFRvb2x0aXBPcHRpb24odG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBzb3J0QnlTdHJpbmc6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXSA9IHRoaXMuZ2V0U2VsZWN0ZWRBbmRVbnNlbGVjdGVkSXRlbXModG9vbHRpcE9wdGlvbnMpO1xyXG4gICAgICAgIGxldCBzb3J0ZWRTZWxlY3RlZEl0ZW1zID0gc29ydEJ5KHNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcbiAgICAgICAgbGV0IHNvcnRlZFVuc2VsZWN0ZWRJdGVtcyA9IHNvcnRCeSh1bnNlbGVjdGVkSXRlbXMsIHNvcnRCeVN0cmluZyk7XHJcblxyXG4gICAgICAgIGxldCBjbG9uZWRUb29sdGlwT3B0aW9ucyA9IFsuLi5zb3J0ZWRTZWxlY3RlZEl0ZW1zLCAuLi5zb3J0ZWRVbnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgICAgIGxldCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoY2xvbmVkVG9vbHRpcE9wdGlvbnMpO1xyXG5cclxuICAgICAgICByZXR1cm4gW2Nsb25lZFRvb2x0aXBPcHRpb25zLCB1cGRhdGVkVG9vbHRpcE9wdGlvbnMsIHNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc107XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0SGVpZ2h0T2ZDaGVja2JveFRvb2x0aXBGaWx0ZXIoZGF0YUxlbmd0aDogbnVtYmVyLCBtYXJnaW46IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBkYXRhTGVuZ3RoID4gNiA/IDIwMCA6IDI2LjAzICogZGF0YUxlbmd0aCArIG1hcmdpbiAqIGRhdGFMZW5ndGggKyBtYXJnaW47XHJcbiAgICB9XHJcblxyXG4gICAgdW5DaGVja0FsbENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICAgICAgICBpdGVtLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChvcHQpID0+IG9wdC5pZCA9PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RBbGxDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgbGV0IGluZGV4ID0gY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmluZEluZGV4KChvcHQpID0+IG9wdC5pZCA9PSBpdGVtLmlkKTtcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0Q2hlY2tib3goZGF0YTogVG9vbHRpcE1vZGVsLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBkYXRhLmlzU2VsZWN0ZWQgPSAhZGF0YS5pc1NlbGVjdGVkO1xyXG4gICAgICAgIGxldCBpbmRleCA9IGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgoaXRlbSkgPT4gaXRlbS5pZCA9PSBkYXRhLmlkKTtcclxuICAgICAgICBjbG9uZWRUb29sdGlwT3B0aW9uc1tpbmRleF0uaXNTZWxlY3RlZCA9IGRhdGEuaXNTZWxlY3RlZDtcclxuICAgIH1cclxuXHJcbiAgICBnZXRTZWxlY3RlZEFuZFVuc2VsZWN0ZWRJdGVtcyh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRJdGVtcyA9IHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5pc1NlbGVjdGVkKTtcclxuICAgICAgICBsZXQgdW5zZWxlY3RlZEl0ZW1zID0gdG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiAhaXRlbS5pc1NlbGVjdGVkKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94UHJldmlvdXNTZWxlY3RlZFZhbHVlKGNsb25lZFRhYmxlRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBpbml0aWFsVmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVmFsdWUgPSBzb3J0QnkodW5pcShjbG9uZWRUYWJsZURhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKSk7XHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldENoZWNrYm94Q3VycmVudFNlbGVjdGVkVmFsdWUoc2VhcmNoZWRTdHJpbmc6IHN0cmluZywgdG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gW107XHJcblxyXG4gICAgICAgIGlmICh0b29sdGlwT3B0aW9ucykge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeSh0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCkubWFwKChpdGVtKSA9PiBpdGVtLnZhbHVlKSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgICAgICAhc2VhcmNoZWRTdHJpbmcgJiZcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlLmxlbmd0aCA9PSB0b29sdGlwT3B0aW9ucy5sZW5ndGggJiZcclxuICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgICAgICkge1xyXG4gICAgICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IGJsYW5rSW5kZXggPSBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5maW5kSW5kZXgoKGl0ZW06IHN0cmluZykgPT4gaXRlbSA9PSBudWxsKTtcclxuICAgICAgICBpZiAoYmxhbmtJbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IHNvcnRCeShjdXJyZW50U2VsZWN0ZWRWYWx1ZSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdGVkVmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlNvcnRpbmdDaGFuZ2VkKHRlbXBTb3J0T3JkZXI6IFNvcnRUeXBlKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcblxyXG4gICAgICAgIGxldCBpc1NvcnRDaGFuZ2VkID0gdGVtcFNvcnRPcmRlciAhPSBudWxsICYmIHRlbXBTb3J0T3JkZXIgIT0gY3VycmVudENvbHVtblNvcnRGaWx0ZXI7XHJcbiAgICAgICAgcmV0dXJuIGlzU29ydENoYW5nZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0RmlsdGVyZWRPcHRpb25Bc0JvbGRTdHJpbmcoc3RyOiBzdHJpbmcsIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGxldCB0b29sdGlwT3B0aW9ucyA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmxhYmVsLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhzdHIudG9Mb3dlckNhc2UoKSkpLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xyXG4gICAgICAgICAgICBlbGVtZW50LmxhYmVsID0gdGhpcy5ib2xkU3RyaW5nKGVsZW1lbnQubGFiZWwsIHN0cik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0b29sdGlwT3B0aW9ucztcclxuICAgIH1cclxuXHJcbiAgICBib2xkU3RyaW5nKHN0cjogc3RyaW5nLCBmaW5kOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgaW5kZXhlcyA9IHRoaXMuZ2V0SW5kaWNlc09mKGZpbmQsIHN0ciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBpbmRleGVzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBzdGFydEluZGV4ID0gaXRlbSArIGluZGV4ICogNzsgLy9NdWx0aXBseWluZyBieSA3IGFzIHRoZXJlIGFyZSA3Y2hhcjogPGI+PC9iPlxyXG4gICAgICAgICAgICBsZXQgZW5kSW5kZXggPSBzdGFydEluZGV4ICsgZmluZC5sZW5ndGg7XHJcbiAgICAgICAgICAgIGxldCBzdHJUb0JlUmVwbGFjZWQgPSBzdHIuc3Vic3RyaW5nKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTtcclxuICAgICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2Uoc3RyVG9CZVJlcGxhY2VkLCAnPGI+JyArIHN0clRvQmVSZXBsYWNlZCArICc8L2I+Jyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIHN0cjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRJbmRpY2VzT2Yoc2VhcmNoU3RyOiBzdHJpbmcsIHN0cjogc3RyaW5nLCBjYXNlU2Vuc2l0aXZlOiBib29sZWFuKSB7XHJcbiAgICAgICAgdmFyIHNlYXJjaFN0ckxlbiA9IHNlYXJjaFN0ci5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdmFyIHN0YXJ0SW5kZXggPSAwLFxyXG4gICAgICAgICAgICBpbmRleCxcclxuICAgICAgICAgICAgaW5kaWNlcyA9IFtdO1xyXG4gICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgICBzdHIgPSBzdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICAgICAgc2VhcmNoU3RyID0gc2VhcmNoU3RyLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdoaWxlICgoaW5kZXggPSBzdHIuaW5kZXhPZihzZWFyY2hTdHIsIHN0YXJ0SW5kZXgpKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIGluZGljZXMucHVzaChpbmRleCk7XHJcbiAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGluZGljZXM7XHJcbiAgICB9XHJcblxyXG4gICAgZGlzYWJsZUFsbEJ0bnNXaGVuVGhlcmVBcmVOb0ZpbHRlcmVkUmVzdWx0cygpOiBbbnVtYmVyLCBib29sZWFuLCBib29sZWFuLCBib29sZWFuXSB7XHJcbiAgICAgICAgLy8gW3NlbGVjdGVkQ2hlY2tib3hPcHRpb25zQ291bnQsIGRpc2FibGVDaGVja2JveEFwcGx5LCBkaXNhYmxlQ2xlYXJBbGwsIGRpc2FibGVTZWxlY3RBbGxdO1xyXG4gICAgICAgIHJldHVybiBbMCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1DYWxlbmRhciBmaWx0ZXI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBjcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluTWF4RGF0ZTtcclxuICAgICAgICAvL1doZW4geW91IHdhbnQgdG8gdXNlIHN0YXJ0RGF0ZSBhbmQgZW5kRGF0ZSBjb21iaW5lZCBhcyBzaW5nbGUgY29sdW1uIHRoZW4gdXNlIFBlcmlvZC5cclxuICAgICAgICBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAncGVyaW9kJyB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gJ2J1eWVyRmxpZ2h0RGF0ZXMnIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSAndHJhZmZpY0ZsaWdodERhdGVzJ1xyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBtaW5NYXhEYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gbWluTWF4RGF0ZTtcclxuICAgIH1cclxuXHJcbiAgICBjcmVhdGVTdGFydEVuZERhdGVSYW5nZShvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5TdGFydERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgJ3N0YXJ0RGF0ZScpO1xyXG4gICAgICAgIGxldCBtYXhFbmREYXRlID0gdGhpcy5yZXR1cm5NaW5BbmRNYXhEYXRlKG9wdGlvbkRhdGEsICdlbmREYXRlJyk7XHJcbiAgICAgICAgcmV0dXJuIFttaW5TdGFydERhdGVbMF0sIG1heEVuZERhdGVbMV1dO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1pbkFuZE1heERhdGVSYW5nZUZvckNhbGVuZGFyKG1pbk1heERhdGU6IGFueVtdLCBwYXJzaW5nRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgbGV0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBbY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSwgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWREYXRlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZywgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWluRGF0ZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLnRvRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMV0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShzZWxlY3RlZERhdGVPYmoudG9EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IGNsb25lRGVlcChtaW5EYXRlKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gY2xvbmVEZWVwKG1heERhdGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZE1pbkRhdGUsIHNlbGVjdGVkTWF4RGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZERhdGU6IHsgZnJvbURhdGU6IGFueTsgdG9EYXRlOiBhbnkgfSA9IHsgZnJvbURhdGU6IG51bGwsIHRvRGF0ZTogbnVsbCB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGUgPSB7IGZyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV0gfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIoY3VycmVudFNlbGVjdGVkRGF0ZTogYW55LCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgZnJvbURhdGUgPSB7XHJcbiAgICAgICAgICAgIHllYXI6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUueWVhcixcclxuICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5kYXksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgdG9EYXRlID0ge1xyXG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUuZGF5LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChpc0VxdWFsKG1pbkRhdGUsIGZyb21EYXRlKSAmJiBpc0VxdWFsKG1heERhdGUsIHRvRGF0ZSkgJiYgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U0xJREVSPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGdldFNsaWRlclRyYW5zbGF0ZUZ1bmNWYWwoaGVhZGVyOiBzdHJpbmcsIGN1cnJlbmN5U2V0OiBTZXQ8c3RyaW5nPikge1xyXG4gICAgICAgIGxldCB0cmFuc2xhdGVGdW5jO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVuY3lTZXQuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9ICdjdXJyZW5jeSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChoZWFkZXIgPT0gJ3Bvc3RlZEF1ZFBlcmNlbnQnIHx8IGhlYWRlciA9PSAncGFyZW50Um93U2hhcmVzJyB8fCBoZWFkZXIgPT0gJ3BhcmVudFJvd1B1dFBlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSAncGVyY2VudCc7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9ICdub3JtYWwnO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUZ1bmM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2xpZGVyT3B0aW9ucyhvcHRpb25zRGF0YTogYW55W10sIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZywgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIHRydWUpO1xyXG4gICAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdub3JtYWwnKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodHJhbnNsYXRlRnVuYyA9PT0gJ3BlcmNlbnQnKSB7XHJcbiAgICAgICAgICAgIG9iai50cmFuc2xhdGUgPSB0aGlzLnBlcmNlbnRUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9IGVsc2UgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09ICdjdXJyZW5jeScpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMuY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRSYW5nZUZvclNsaWRlcihoZWFkZXI6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgICAgIGxldCBzbGlkZXJNaW5WYWx1ZTtcclxuICAgICAgICBsZXQgc2xpZGVyTWF4VmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKTtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBzZWxlY3RlZE9iai5taW4gPCBvcHRpb25zLmZsb29yID8gb3B0aW9ucy5mbG9vciA6IHNlbGVjdGVkT2JqLm1pbjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBzZWxlY3RlZE9iai5tYXggPCBvcHRpb25zLmNlaWwgPyBzZWxlY3RlZE9iai5tYXggOiBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBvcHRpb25zLmZsb29yO1xyXG4gICAgICAgICAgICBzbGlkZXJNYXhWYWx1ZSA9IG9wdGlvbnMuY2VpbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2xpZGVyTWluVmFsdWUsIHNsaWRlck1heFZhbHVlXTtcclxuICAgIH1cclxuXHJcbiAgICBpc1ZhbHVlSW5SYW5nZShvcHRpb25zOiBPcHRpb25zLCB2YWw6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zLmZsb29yIDw9IHZhbCAmJiB2YWwgPD0gb3B0aW9ucy5jZWlsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogJycsIG1heDogJycgfTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvclNsaWRlckZpbHRlcihjbG9uZWREYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YSk7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2xpZGVyRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKGNsb25lZERhdGEsIHRoaXMuc2VsZWN0ZWRSYWRpbywgdHJ1ZSk7XHJcbiAgICAgICAgbGV0IG1heFZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIGZhbHNlKTtcclxuICAgICAgICBsZXQgc2xpZGVyRGF0YSA9IHsgbWluOiBtaW5WYWx1ZSwgbWF4OiBtYXhWYWx1ZSB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHNsaWRlckRhdGEpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZFZhbHVlRm9yU2xpZGVyKG1pbkVudGVyZWRWYWw6IG51bWJlciwgbWF4RW50ZXJlZFZhbDogbnVtYmVyLCBvcHRpb25zOiBPcHRpb25zKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTbGlkZXJEYXRhOiB7IG1pbjogYW55OyBtYXg6IGFueSB9ID0geyBtaW46IG51bGwsIG1heDogbnVsbCB9O1xyXG4gICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1heCA9IG1heEVudGVyZWRWYWw7XHJcbiAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID0gbWluRW50ZXJlZFZhbDtcclxuXHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5taW4gPT0gb3B0aW9ucy5mbG9vciAmJlxyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPT0gb3B0aW9ucy5jZWlsICYmXHJcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gY3VycmVudFNsaWRlckRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVRJTUU9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcbiAgICBnZXRTZWxlY3RlZFRpbWVSYW5nZShoZWFkZXI6IHN0cmluZywgY2xvbmVkRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZTogYW55W107XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVG9UaW1lOiBhbnlbXTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhoZWFkZXIpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JUaW1lRmlsdGVyKGNsb25lZERhdGEsIGhlYWRlcik7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS5mcm9tVGltZTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQoaGVhZGVyKS50b1RpbWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWRGcm9tVGltZSAhPSB1bmRlZmluZWQgfHwgc2VsZWN0ZWRUb1RpbWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKHNlbGVjdGVkRnJvbVRpbWUsIHRydWUpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UuZm9ybWF0VG9Ud2VsdmVIcnMoc2VsZWN0ZWRUb1RpbWUsIHRydWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkRnJvbVRpbWUgPSBbJy0nLCAnLScsICctJ107XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gWyctJywgJy0nLCAnLSddO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZEZyb21UaW1lLCBzZWxlY3RlZFRvVGltZV07XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAoa2V5ID09ICdzdGFydEVuZFRpbWUnIHx8IGtleSA9PSAnVGltZUJhbmQnKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZUZvclN0YXJ0T3JFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YSwga2V5KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLy91c2UgZm9yIGZpbHRlciB3aGVyZSB3ZSBoYXZlIHN0YXJ0IGFuZCBlbmQgdGltZSByYW5nZSBpbiBvbmUgZmlsdGVyXHJcbiAgICAvL3N0YXJ0RW5kVGltZTogW1wiNiAtIDdBXCIsIFwiMDY6IDAwIDogMDBcIiAsIFwiMDc6MDA6MDBcIl1cclxuICAgIHNldEluaXRpYWxWYWx1ZUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PSAnPG11bHRpPicpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09ICcwJykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSAhPSAnMCcgJiYgb2JqW2tleV1bMF0gIT0gJzxtdWx0aT4nKSAhPSAtMTtcclxuXHJcbiAgICAgICAgbGV0IGZpbHRlcmVkU3RhcnRUaW1lID0gY2xvbmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gIVsnJywgJy0nLCBudWxsLCAnMCcsICc8bXVsdGk+J10uaW5jbHVkZXMob2JqWydzdGFydFRpbWUnXSkpO1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZEVuZFRpbWUgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGwsICcwJywgJzxtdWx0aT4nXS5pbmNsdWRlcyhvYmpbJ2VuZFRpbWUnXSkpO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGZpbHRlcmVkU3RhcnRUaW1lLCAnc3RhcnRUaW1lJyk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoZmlsdGVyZWRFbmRUaW1lLCAnZW5kVGltZScpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgZW5kVGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lRGVzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHN0YXJ0VGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiBlbmRUaW1lQXJyWzBdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgLy91c2UgZm9yIHRoZSBmaWx0ZXJzIHdoZXJlIHdlIGhhdmUgZGlmZmVyZW50IGZpbHRlciBmb3Igc3RhcnQgYW5kIGVuZCB0aW1lXHJcbiAgICAvL3N0YXJ0VGltZTogXCIwNjowMDowMFwiXHJcbiAgICBzZXRJbml0aWFsVmFsdWVGb3JTdGFydE9yRW5kVGltZVJhbmdlKGNsb25lZERhdGE6IGFueVtdLCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBpbmNsdWRlTXVsdGkgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSA9PSAnPG11bHRpPicpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09ICcwJykgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XSAhPSAnMCcgJiYgb2JqW2tleV0gIT0gJzxtdWx0aT4nKSAhPSAtMTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhWycnLCAnLScsIG51bGwsICcwJywgJzxtdWx0aT4nXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG5cclxuICAgICAgICBsZXQgdGltZUFyciA9IG1hcChkYXRhLCBrZXkpO1xyXG4gICAgICAgIHRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZUFzY2VuZGluZyhhLCBiKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgZnJvbVRpbWU6IHRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIHRvVGltZTogdGltZUFyclt0aW1lQXJyLmxlbmd0aCAtIDFdLFxyXG4gICAgICAgICAgICBpbmNsdWRlTXVsdGk6IGluY2x1ZGVNdWx0aSxcclxuICAgICAgICAgICAgaW5jbHVkZVplcm86IGluY2x1ZGVaZXJvLFxyXG4gICAgICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBpbmNsdWRlVGltZVJhbmdlLFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLnNldChrZXksIG9iaik7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0VW5zZWxlY3RUaW1lRmlsdGVyQ2hlY2tib3goa2V5OiBzdHJpbmcsIG9wdGlvbnNEYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBzaG93TXVsdGlUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBlbnRlclRpbWVDaGVja2JveENoZWNrZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgbGV0IHNlbGVjdGVkVGltZU9iajtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVGltZU9iaiA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldChrZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IHRpbWVBcnI6IHN0cmluZ1tdO1xyXG4gICAgICAgIGlmIChrZXkgPT0gJ3N0YXJ0RW5kVGltZScgfHwga2V5ID09ICdUaW1lQmFuZCcpIHtcclxuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVBcnIuZmluZEluZGV4KCh2YWwpID0+IHZhbCA9PSAnMCcpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQgPSBzZWxlY3RlZFRpbWVPYmouaW5jbHVkZVplcm87XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsID09ICc8bXVsdGk+JykgIT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICAgICAgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqLmluY2x1ZGVNdWx0aTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChzaG93WmVyb1RpbWVDaGVja2JveCB8fCBzaG93TXVsdGlUaW1lQ2hlY2tib3gpIHtcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94ID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgIT0gJzxtdWx0aT4nICYmIHZhbCAhPSAnMCcpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iaj8uaW5jbHVkZVRpbWVSYW5nZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveDogc2hvd011bHRpVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBzaG93WmVyb1RpbWVDaGVja2JveDogc2hvd1plcm9UaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3dFbnRlclRpbWVDaGVja2JveDogc2hvd0VudGVyVGltZUNoZWNrYm94LFxyXG4gICAgICAgICAgICBtdWx0aVRpbWVDaGVja2JveENoZWNrZWQ6IG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICAgICAgemVyb1RpbWVDaGVja2JveENoZWNrZWQ6IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICBlbnRlclRpbWVDaGVja2JveENoZWNrZWQ6IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCxcclxuICAgICAgICB9O1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTdGFydFRpbWVJc0FmdGVyRW5kVGltZShzdGFydFRpbWU6IHN0cmluZ1tdLCBlbmRUaW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGxldCB0aW1lRm9ybWF0ID0gJ0hIOm1tOnNzJztcclxuXHJcbiAgICAgICAgbGV0IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyAnOicgKyBzdGFydFRpbWVbMV0gKyAnICcgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lMjRIckZvcm1hdCA9IHN0YXJ0VGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBzdGFydFRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgZW5kVGltZVswXSArICc6JyArIGVuZFRpbWVbMV0gKyAnICcgKyBlbmRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0ID0gZW5kVGltZTI0SHJGb3JtYXRBcnJbMF0gKyAnOicgKyBlbmRUaW1lMjRIckZvcm1hdEFyclsxXSArICc6MDAnO1xyXG4gICAgICAgIHJldHVybiBkYXlqcyhzdGFydFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KS5pc0FmdGVyKGRheWpzKGVuZFRpbWUyNEhyRm9ybWF0LCB0aW1lRm9ybWF0KSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIoKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWRUaW1lRmlsdGVyID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0Q3VycmVudFNlbGVjdGVkVGltZUZpbHRlcihcclxuICAgICAgICBzdGFydFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGVuZFRpbWU6IHN0cmluZ1tdLFxyXG4gICAgICAgIGluY2x1ZGVNdWx0aTogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlWmVybzogYm9vbGVhbixcclxuICAgICAgICBpbmNsdWRlVGltZVJhbmdlOiBib29sZWFuLFxyXG4gICAgKSB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGxldCBmcm9tVGltZTI0SHJGb3JtYXRBcnIgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG90d2VudHlGb3VySHJzRm9ybWF0KFxyXG4gICAgICAgICAgICBzdGFydFRpbWVbMF0gKyAnOicgKyBzdGFydFRpbWVbMV0gKyAnICcgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgZnJvbVRpbWUyNEhyRm9ybWF0ID0gZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzBdICsgJzonICsgZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzFdICsgJzowMCc7XHJcblxyXG4gICAgICAgIGxldCB0b1RpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgZW5kVGltZVswXSArICc6JyArIGVuZFRpbWVbMV0gKyAnICcgKyBlbmRUaW1lWzJdLFxyXG4gICAgICAgICAgICB0cnVlLFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgbGV0IHRvVGltZTI0SHJGb3JtYXQgPSB0b1RpbWUyNEhyRm9ybWF0QXJyWzBdICsgJzonICsgdG9UaW1lMjRIckZvcm1hdEFyclsxXSArICc6MDAnO1xyXG5cclxuICAgICAgICBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogZnJvbVRpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICB0b1RpbWU6IHRvVGltZTI0SHJGb3JtYXQsXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09ICcnKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludChhcnJbMF0pIDwgMTIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09ICcnKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDEyO1xyXG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VJbnQoYXJyWzBdKSA+IDEpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gcGFyc2VJbnQoYXJyWzBdKSAtIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICAvLyBpbmNyZW1lbnQgdG8gbmVhcmVzdCBwcm9wZXIgaW50ZXJ2YWwoMTUsMzAsNDUpXHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XHJcbiAgICAgICAgaWYgKG1pbiA8PSAxNCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnMTUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE1ICYmIG1pbiA8PSAyOSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnMzAnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMwICYmIG1pbiA8PSA0NCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDQ1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcwMCc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XHJcbiAgICAgICAgaWYgKG1pbiA+IDAgJiYgbWluIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcwMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTYgJiYgbWluIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICcxNSc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzEgJiYgbWluIDw9IDQ1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9ICczMCc7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiA0NSB8fCBtaW4gPT0gMCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSAnNDUnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRPckRlY3JlbWVudEhvdXIoaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRIb3VySW5wdXQodGltZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50TWluKGluY3JlbWVudDogYm9vbGVhbiwgdGltZTogc3RyaW5nW10pIHtcclxuICAgICAgICBpZiAoaW5jcmVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5jcmVtZW50TWludXRlSW5wdXQodGltZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaXNIb3VyVmFsdWVJbnZhbGlkKGhyOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gaHIubGVuZ3RoID09IDAgfHwgIStociB8fCAxID4gcGFyc2VJbnQoaHIpIHx8IHBhcnNlSW50KGhyKSA+IDEyIHx8IGhyLmluY2x1ZGVzKCcuJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaXNNaW51dGVWYWx1ZUludmFsaWQobWluOiBzdHJpbmcpIHtcclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBtaW4ubGVuZ3RoICE9IDIgfHwgKCErbWluICYmIG1pbiAhPSAnMDAnKSB8fCAwID4gcGFyc2VJbnQobWluKSB8fCBwYXJzZUludChtaW4pID4gNTkgfHwgbWluLmluY2x1ZGVzKCcuJylcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVNPUlQ9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIHVwZGF0ZVNvcnRNYXAodGVtcFNvcnRPcmRlcjogU29ydFR5cGUsIHRhYmxlRGF0YTogYW55W10sIGlzTHVyQW5kQ3NyQ29tcG9uZW50OiBib29sZWFuKSB7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCB0ZW1wU29ydE9yZGVyKTtcclxuICAgICAgICBsZXQgc29ydGVkVGFibGVEYXRhID0gdGhpcy5hbm5hU29ydFNlcnZpY2UuYXBwbHlTb3J0aW5nKFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8sXHJcbiAgICAgICAgICAgIHRlbXBTb3J0T3JkZXIsXHJcbiAgICAgICAgICAgIHRhYmxlRGF0YSxcclxuICAgICAgICAgICAgaXNMdXJBbmRDc3JDb21wb25lbnQsXHJcbiAgICAgICAgKTtcclxuICAgICAgICByZXR1cm4gc29ydGVkVGFibGVEYXRhO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
1287
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5uYS1maWx0ZXIuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FubmEtY29yZS9zcmMvbGliL2FubmEtY29yZS1zaGFyZWQtbGliL3NlcnZpY2VzL2FubmEtZmlsdGVyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxnQ0FBZ0M7QUFDaEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1RSxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxpQkFBaUIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUMvRCxPQUFPLE1BQU0sTUFBTSxxQkFBcUIsQ0FBQztBQUN6QyxPQUFPLFNBQVMsTUFBTSx3QkFBd0IsQ0FBQztBQUMvQyxPQUFPLEVBQVksWUFBWSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFbkUsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBRSx5QkFBeUIsRUFBZSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3pGLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7Ozs7QUFLNUQsTUFBTSxPQUFPLGlCQUFpQjthQXNDWixlQUFVLEdBQUcsRUFBRSxBQUFMLENBQU07SUFJOUIsWUFDWSxxQkFBZ0QsRUFDaEQsZUFBZ0M7UUFEaEMsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEyQjtRQUNoRCxvQkFBZSxHQUFmLGVBQWUsQ0FBaUI7UUEzQzVDLGVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLHVCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFjL0Isd0JB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RUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEFuZ3VsYXIgaW1wb3J0IHN0YXRlbWVudHNcclxuaW1wb3J0IHsgT3B0aW9ucyB9IGZyb20gXCJAYW5ndWxhci1zbGlkZXIvbmd4LXNsaWRlclwiO1xyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIFRoaXJkIHBhcnR5IGltcG9ydCBzdGF0ZW1lbnRzXHJcbmltcG9ydCB7IG1pbiwgbWF4LCBtYXAsIHNvcnRCeSwgdW5pcSwgY2xvbmVEZWVwLCBpc0VxdWFsIH0gZnJvbSBcImxvZGFzaC1lc1wiO1xyXG5pbXBvcnQgZGF5anMgZnJvbSBcImRheWpzXCI7XHJcbmltcG9ydCBDdXN0b21QYXJzZUZvcm1hdCBmcm9tIFwiZGF5anMvcGx1Z2luL2N1c3RvbVBhcnNlRm9ybWF0XCI7XHJcbmltcG9ydCBtaW5NYXggZnJvbSBcImRheWpzL3BsdWdpbi9taW5NYXhcIjtcclxuaW1wb3J0IGlzQmV0d2VlbiBmcm9tIFwiZGF5anMvcGx1Z2luL2lzQmV0d2VlblwiO1xyXG5pbXBvcnQgeyBTb3J0VHlwZSwgU29ydFR5cGVFbnVtIH0gZnJvbSBcIi4uL21vZGVscy9hbm5hLXNvcnQubW9kZWxcIjtcclxuXHJcbi8vIFVzZXIgZGVmaW5lZCBpbXBvcnQgc3RhdGVtZW50c1xyXG5pbXBvcnQgeyBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLCBOZ2JEYXRlVHlwZSB9IGZyb20gXCIuL2FubmEtZGF0ZS10aW1lLWZvcm1hdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IEFubmFTb3J0U2VydmljZSB9IGZyb20gXCIuL2FubmEtc29ydC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2RlbCB9IGZyb20gXCIuLi9tb2RlbHMvYW5uYS10b29sdGlwLm1vZGVsXCI7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiBcInJvb3RcIixcclxufSlcclxuZXhwb3J0IGNsYXNzIEFubmFGaWx0ZXJTZXJ2aWNlIHtcclxuICAgIHRvb2x0aXBNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICB0b29sdGlwU2VsZWN0ZWRNYXAgPSBuZXcgTWFwKCk7XHJcbiAgICBpbml0aWFsVmFsdWVNYXA6IE1hcDxzdHJpbmcsIGFueT47XHJcbiAgICB0cmFuc2xhdGVGdW5jOiBzdHJpbmc7XHJcbiAgICBzZWxlY3RlZFJhZGlvOiBzdHJpbmc7XHJcbiAgICBzdWJSYWRpb0J1dHRvbjogc3RyaW5nO1xyXG5cclxuICAgIGNhbGVuZGFyU2V0OiBTZXQ8c3RyaW5nPjtcclxuICAgIHNsaWRlclNldDogU2V0PHN0cmluZz47XHJcbiAgICB0aW1lU2V0OiBTZXQ8c3RyaW5nPjtcclxuXHJcbiAgICBpbmNsdWRlTXVsdGlUaW1lOiBib29sZWFuO1xyXG4gICAgaW5jbHVkZVplcm9UaW1lOiBib29sZWFuO1xyXG4gICAgaW5jbHVkZVRpbWVSYW5nZTogYm9vbGVhbjtcclxuXHJcbiAgICBhcHBsaWVkRmlsdGVyc0FycmF5OiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgZmxpZ2h0RGF0ZVJhbmdlOiB7IG1pblNlbGVjdGVkRGF0ZTogYW55OyBtYXhTZWxlY3RlZERhdGU6IGFueSB9O1xyXG4gICAgc2xpZGVyRGF0YTogeyBtaW46IGFueTsgbWF4OiBhbnkgfTtcclxuICAgIG5neFNsaWRlck9iajogT3B0aW9ucztcclxuICAgIHNsaWRlckN1cnJlbmN5U2V0ID0gbmV3IFNldChbXHJcbiAgICAgICAgXCJib29rZWRcIixcclxuICAgICAgICBcImNwcFwiLFxyXG4gICAgICAgIFwiY3BtXCIsXHJcbiAgICAgICAgXCJyY3ZQcmVlbXB0XCIsXHJcbiAgICAgICAgXCJvc1ByZWVtcHRcIixcclxuICAgICAgICBcInBvc3RlZEFkdVwiLFxyXG4gICAgICAgIFwic2NoZWR1bGVkQWR1XCIsXHJcbiAgICAgICAgXCJhdWRpZW5jZURlZmljaXRcIixcclxuICAgICAgICBcIlJhdGVcIixcclxuICAgICAgICBcInVzZXJBRFVzXCIsXHJcbiAgICAgICAgXCJidXllckNoYW5nZXNcIixcclxuICAgICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgICAgXCJ1c2VyTUdcIixcclxuICAgICAgICBcInVkVmFsdWVcIixcclxuICAgICAgICBcIm9kVmFsdWVcIixcclxuICAgIF0pO1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgYnVmZmVyU2l6ZSA9IDIwO1xyXG4gICAgaXNGaWx0ZXJTb3J0QWN0aXZlOiBhbnkgPSB7fTtcclxuICAgIHJlc2V0RmlsdGVyU29ydEFjdGl2ZVN0YXR1czogYm9vbGVhbiA9IHRydWU7XHJcblxyXG4gICAgY29uc3RydWN0b3IoXHJcbiAgICAgICAgcHJpdmF0ZSBkYXRlVGltZUZvcm1hdFNlcnZpY2U6IEFubmFEYXRlVGltZUZvcm1hdFNlcnZpY2UsXHJcbiAgICAgICAgcHJpdmF0ZSBhbm5hU29ydFNlcnZpY2U6IEFubmFTb3J0U2VydmljZSxcclxuICAgICkge1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChtaW5NYXgpO1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChpc0JldHdlZW4pO1xyXG4gICAgICAgIGRheWpzLmV4dGVuZChDdXN0b21QYXJzZUZvcm1hdCk7XHJcbiAgICAgICAgY29uc3Qgc2xpZGVyQXJyID0gW1xyXG4gICAgICAgICAgICBcInJjdlByZWVtcHRcIixcclxuICAgICAgICAgICAgXCJvc1ByZWVtcHRcIixcclxuICAgICAgICAgICAgXCJyY3ZVbmRlckRseVwiLFxyXG4gICAgICAgICAgICBcInBvc3RlZEF1ZFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJib29rZWRcIixcclxuICAgICAgICAgICAgXCJzcG90c1wiLFxyXG4gICAgICAgICAgICBcImdycFwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VSYXRlVGhpc1llYXJcIixcclxuICAgICAgICAgICAgXCJhdmVyYWdlUmF0ZUxhc3RZZWFyXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZUNQUFwiLFxyXG4gICAgICAgICAgICBcImF2ZXJhZ2VDUE1cIixcclxuICAgICAgICAgICAgXCJJTVBTRGlmZlwiLFxyXG4gICAgICAgICAgICBcIlJUR0RpZmZcIixcclxuICAgICAgICAgICAgXCJjcHBcIixcclxuICAgICAgICAgICAgXCJpbXBzXCIsXHJcbiAgICAgICAgICAgIFwiY3BtXCIsXHJcbiAgICAgICAgICAgIFwib3NVbmRlckRseVwiLFxyXG4gICAgICAgICAgICBcInRvdGFsV2Vla3NcIixcclxuICAgICAgICAgICAgXCJXZWVrTnVtYmVyXCIsXHJcbiAgICAgICAgICAgIFwiUmF0ZVwiLFxyXG4gICAgICAgICAgICBcIk9yZGVyZWRSYXRpbmdzT3JJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIlBvc3RlZFJhdGluZ3NPckltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgICxcclxuICAgICAgICAgICAgXCJwb3N0ZWRBdWRQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwicG9zdGVkQWR1XCIsXHJcbiAgICAgICAgICAgIFwic2NoZWR1bGVkQWR1XCIsXHJcbiAgICAgICAgICAgIFwiYXVkaWVuY2VEZWZpY2l0XCIsXHJcbiAgICAgICAgICAgIFwib2ZmZXJlZE1Hc1wiLFxyXG4gICAgICAgICAgICBcIm91dHN0YW5kaW5nUEVcIixcclxuICAgICAgICAgICAgXCJvZmZlcmVkQURVc1wiLFxyXG4gICAgICAgICAgICBcInVkRGVmaWNpdFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiYm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJib29rZWRTcG90c1wiLFxyXG4gICAgICAgICAgICBcInVzZXJDaGFuZ2VzXCIsXHJcbiAgICAgICAgICAgIFwiVURHcnBcIixcclxuICAgICAgICAgICAgXCJVREltcHNcIixcclxuICAgICAgICAgICAgXCJPREdycFwiLFxyXG4gICAgICAgICAgICBcIk9ESW1wc1wiLFxyXG4gICAgICAgICAgICBcInVkSW1wc1BlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJ1ZEdycFBlcmNlbnRcIixcclxuICAgICAgICAgICAgXCJvZEltcHNQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwib2RHcnBQZXJjZW50XCIsXHJcbiAgICAgICAgICAgIFwidXNlckFEVXNcIixcclxuICAgICAgICAgICAgXCJidXllckNoYW5nZXNcIixcclxuICAgICAgICAgICAgXCJ1c2VyQ2hhbmdlc1wiLFxyXG4gICAgICAgICAgICBcInVzZXJNR1wiLFxyXG4gICAgICAgICAgICBcIldlZWtseUFVUlwiLFxyXG4gICAgICAgICAgICBcIldlZWtseUFVUmF0aW5nT3JJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIk1Hc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQURVc1ZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVXNlckNyZWRpdGVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJVc2VyVW5yZXNvbHZlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQnV5ZXJBZGRlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQnV5ZXJEZWxldGVkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCdXllckNoYW5nZXNWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlVzZXJDaGFuZ2VzVmFsdWVcIixcclxuICAgICAgICAgICAgXCJCb29rZWRHUlBPcklNUFNcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUFBPckNQTVwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiQm9va2VkU3BvdHNcIixcclxuICAgICAgICAgICAgXCJCb29rZWRSYXRlXCIsXHJcbiAgICAgICAgICAgIFwiYXZlcmFnZVJhdGVcIixcclxuICAgICAgICAgICAgXCJwcm9qZWN0ZWRJTVBTXCIsXHJcbiAgICAgICAgICAgIFwicHJvamVjdGVkUlRHXCIsXHJcbiAgICAgICAgICAgIFwiZGVzaXJlZENQTVwiLFxyXG4gICAgICAgICAgICBcImRlc2lyZWRDUFBcIixcclxuICAgICAgICAgICAgXCJpbnZlbnRvcnlGaWxsUGVyY2VudGFnZVNhbWVXZWVrXCIsXHJcbiAgICAgICAgICAgIFwiaW52ZW50b3J5RmlsbFBlcmNlbnRhZ2VGaW5hbFwiLFxyXG4gICAgICAgICAgICBcImludmVudG9yeUZpbGxQZXJjZW50YWdlVGlsbERhdGVcIixcclxuICAgICAgICAgICAgXCJkb2xsYXJSYXRlSW1wYWN0XCIsXHJcbiAgICAgICAgICAgIFwiZG9sbGFySU1QU0ltcGFjdFwiLFxyXG4gICAgICAgICAgICBcIklNUFNJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJkb2xsYXJSVEdJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJSVEdJbXBhY3RcIixcclxuICAgICAgICAgICAgXCJCb29rZWRSVEdcIixcclxuICAgICAgICAgICAgXCJCb29rZWRJTVBTXCIsXHJcbiAgICAgICAgICAgIFwiQVVSVEdcIixcclxuICAgICAgICAgICAgXCJBVVJUR1wiLFxyXG4gICAgICAgICAgICBcIlBvc3RlZFJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIlBvc3RlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZE9yZGVyZWRSYXRpbmdcIixcclxuICAgICAgICAgICAgXCJOb3JtYWxpemVkT3JkZXJlZEltcHJlc3Npb25zXCIsXHJcbiAgICAgICAgICAgIFwiTm9ybWFsaXplZFBvc3RlZFJhdGluZ1wiLFxyXG4gICAgICAgICAgICBcIk5vcm1hbGl6ZWRQb3N0ZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZEdSUFwiLFxyXG4gICAgICAgICAgICBcIkJvb2tlZElNUFNSZXZUYWJcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUFBcIixcclxuICAgICAgICAgICAgXCJCb29rZWRDUE1cIixcclxuICAgICAgICAgICAgXCJBVUlNUFNcIixcclxuICAgICAgICAgICAgXCJib29rZWRBbW91bnRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcImVxdWl2YWxpemVkQm9va2VkQW1vdW50VmFsdWVcIixcclxuICAgICAgICAgICAgXCJJTVBTXCIsXHJcbiAgICAgICAgICAgIFwidWRWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIm9kVmFsdWVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRlZEJvb2tlZFZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0ZWRCb29rZWRFVVJWYWx1ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGluZ0Jvb2tlZEVVUlZhbHVlXCIsXHJcbiAgICAgICAgICAgIFwiVmlvbGF0aW5nQm9va2VkVmFsdWVcIixcclxuICAgICAgICAgICAgXCJSZWJhdGVcIixcclxuICAgICAgICAgICAgXCJXZWVrbHlBVVJcIixcclxuICAgICAgICAgICAgXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVXZWVrbHlBVVJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VSdGdcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dTdGF0aW9uRXN0aW1hdGVzUnRnXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93QW5uYUVzdGltYXRlc0ltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VJbXBzXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93U3RhdGlvbkVzdGltYXRlc0ltcHNcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzU2hhcmVcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dQb3N0ZWRTaGFyZVwiLFxyXG4gICAgICAgICAgICBcInBhcmVudFJvd1JvbGxpbmdBdmVyYWdlU2hhcmVcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0UGVyXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUHV0UGVyXCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VQdXRQZXJcIixcclxuICAgICAgICAgICAgXCJwYXJlbnRSb3dBbm5hRXN0aW1hdGVzUHV0XCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93UG9zdGVkUHV0XCIsXHJcbiAgICAgICAgICAgIFwicGFyZW50Um93Um9sbGluZ0F2ZXJhZ2VQdXRcIixcclxuICAgICAgICAgICAgXCJQcm9qZWN0ZWRJbXByZXNzaW9uc1wiLFxyXG4gICAgICAgICAgICBcIlByb2plY3RlZFJ0Z1wiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgY29uc3QgY2FsZW5kYXJBcnIgPSBbXHJcbiAgICAgICAgICAgIFwicGVyaW9kXCIsXHJcbiAgICAgICAgICAgIFwiQWlyRGF0ZVwiLFxyXG4gICAgICAgICAgICBcImZsaWdodFN0YXJ0RGF0ZVwiLFxyXG4gICAgICAgICAgICBcImZsaWdodEVuZERhdGVcIixcclxuICAgICAgICAgICAgXCJkYXRlXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiZW5kRGF0ZVwiLFxyXG4gICAgICAgICAgICBcInJldmlzaW9uU3RhcnREYXRlXCIsXHJcbiAgICAgICAgICAgIFwiR2VuZXJhdGVkT25cIixcclxuICAgICAgICAgICAgXCJXZWVrXCIsXHJcbiAgICAgICAgICAgIFwidGltZW91dERhdGVcIixcclxuICAgICAgICAgICAgXCJWaW9sYXRpbmdTcG90RGF0ZVwiLFxyXG4gICAgICAgICAgICBcIlZpb2xhdGVkU3BvdERhdGVcIixcclxuICAgICAgICBdO1xyXG4gICAgICAgIGNvbnN0IHRpbWVBcnIgPSBbXHJcbiAgICAgICAgICAgIFwiU3RhcnRUaW1lRm9yRmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwiRW5kVGltZUZvckZpbHRlclwiLFxyXG4gICAgICAgICAgICBcInRpbWVcIixcclxuICAgICAgICAgICAgXCJzdGFydFRpbWVGb3JGaWx0ZXJcIixcclxuICAgICAgICAgICAgXCJlbmRUaW1lRm9yRmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIsXHJcbiAgICAgICAgICAgIFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiLFxyXG4gICAgICAgICAgICBcInN0YXJ0RW5kVGltZU11bHRpXCIsXHJcbiAgICAgICAgICAgIFwic3RhcnRFbmRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwidGltZW91dFRpbWVcIixcclxuICAgICAgICAgICAgXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVTdGFydFRpbWVcIixcclxuICAgICAgICAgICAgXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiU3RhcnRUaW1lXCIsXHJcbiAgICAgICAgICAgIFwiRW5kVGltZVwiLFxyXG4gICAgICAgIF07XHJcbiAgICAgICAgdGhpcy5zbGlkZXJTZXQgPSBuZXcgU2V0KHNsaWRlckFycik7XHJcbiAgICAgICAgdGhpcy5jYWxlbmRhclNldCA9IG5ldyBTZXQoY2FsZW5kYXJBcnIpO1xyXG4gICAgICAgIHRoaXMudGltZVNldCA9IG5ldyBTZXQodGltZUFycik7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuTWF4QW5kTWluVmFsdWUoZGF0YTogYW55W10sIGtleTogc3RyaW5nLCBpc01pbjogYm9vbGVhbikge1xyXG4gICAgICAgIGRhdGEgPSBkYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsXS5pbmNsdWRlcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGNvbnN0IHZhbHVlcyA9IGRhdGEubWFwKCh4KSA9PiB4W2tleV0pO1xyXG4gICAgICAgIGxldCB2YWx1ZVRvUmV0dXJuID0gaXNNaW4gPyBtaW4odmFsdWVzKSA6IG1heCh2YWx1ZXMpO1xyXG4gICAgICAgIHJldHVybiB2YWx1ZVRvUmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybk1pbkFuZE1heERhdGUoZGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgZGF0YSA9IGRhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcbiAgICAgICAgbGV0IERhdGVBcnIgPSBkYXRhLm1hcCgob2JqKSA9PiBkYXlqcyhvYmpba2V5XSkpO1xyXG4gICAgICAgIGxldCBtaW5EYXRlID0gZGF5anMubWluKERhdGVBcnIpO1xyXG4gICAgICAgIGxldCBtYXhEYXRlID0gZGF5anMubWF4KERhdGVBcnIpO1xyXG5cclxuICAgICAgICByZXR1cm4gW21pbkRhdGUsIG1heERhdGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlzVG9vbHRpcEFjdGl2ZShoZWFkZXI6IHN0cmluZ1tdLCBzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pOiBib29sZWFuIHtcclxuICAgICAgICBsZXQgc2V0OiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclswXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzBdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuICAgICAgICBsZXQgaXNTb3J0TWFwRm9ySGVhZGVyMUFjdGl2ZSA9IHNvcnRNYXAuaGFzKGhlYWRlclsxXSkgJiYgc29ydE1hcC5nZXQoaGVhZGVyWzFdKSAhPSBTb3J0VHlwZUVudW0uREVGQVVMVDtcclxuXHJcbiAgICAgICAgaWYgKGhlYWRlci5sZW5ndGggPT0gMSkge1xyXG4gICAgICAgICAgICByZXR1cm4gKHNvcnRNYXAuc2l6ZSA+IDAgJiYgaXNTb3J0TWFwRm9ySGVhZGVyMEFjdGl2ZSkgfHwgc2V0LmhhcyhoZWFkZXJbMF0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKHNvcnRNYXAuc2l6ZSA+IDAgJiYgc29ydE1hcC5oYXMoaGVhZGVyWzBdKSAmJiBpc1NvcnRNYXBGb3JIZWFkZXIwQWN0aXZlKSB8fFxyXG4gICAgICAgICAgICAoc29ydE1hcC5zaXplID4gMCAmJiBzb3J0TWFwLmhhcyhoZWFkZXJbMV0pICYmIGlzU29ydE1hcEZvckhlYWRlcjFBY3RpdmUpIHx8XHJcbiAgICAgICAgICAgIHNldC5oYXMoaGVhZGVyWzBdKSB8fFxyXG4gICAgICAgICAgICBzZXQuaGFzKGhlYWRlclsxXSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIGNsZWFyQ29sdW1uRmlsdGVyKCkge1xyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgbGV0IGFwcGxpZWRGaWx0ZXJTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgICAgICAgICBhcHBsaWVkRmlsdGVyU2V0LmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkgPSBbLi4uYXBwbGllZEZpbHRlclNldF07XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0T3B0aW9uVmFsdWVzKG1pblZhbHVlOiBudW1iZXIsIG1heFZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBmbG9vcjogbWluVmFsdWUsXHJcbiAgICAgICAgICAgIGNlaWw6IG1heFZhbHVlLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZSxcclxuICAgICAgICAgICAgdHJhbnNsYXRlOiB0aGlzLm5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgcGVyY2VudFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKE1hdGguYWJzKGRhdGEpID49IDEwMDApIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImslXCI7XHJcbiAgICAgICAgICAgIHJldHVybiBpc05lZ1ZhbCA/IFwiLVwiICsgdmFsIDogdmFsO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBsZXQgaXNXaG9sZU51bSA9IHBhcnNlSW50KGRhdGEudG9TdHJpbmcoKSkgPT0gZGF0YTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IGlzV2hvbGVOdW0gPyBNYXRoLmFicyhkYXRhKS50b1N0cmluZygpIDogTWF0aC5hYnMoZGF0YSkudG9GaXhlZCgxKTtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgKyBcIiVcIiA6IHZhbCArIFwiJVwiO1xyXG4gICAgICAgIH1cclxuICAgIH07XHJcblxyXG4gICAgY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbiA9IChkYXRhOiBudW1iZXIpOiBzdHJpbmcgPT4ge1xyXG4gICAgICAgIGlmIChNYXRoLmFicyhkYXRhKSA+PSAxMDAwKSB7XHJcbiAgICAgICAgICAgIGxldCBpc05lZ1ZhbCA9IGRhdGEgPCAwO1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSBcIiRcIiArIChNYXRoLmFicyhkYXRhKSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgICAgICAgcmV0dXJuIGlzTmVnVmFsID8gXCItXCIgKyB2YWwgOiB2YWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IGlzTmVnVmFsID0gZGF0YSA8IDA7XHJcbiAgICAgICAgICAgIGxldCBpc1dob2xlTnVtID0gcGFyc2VJbnQoZGF0YS50b1N0cmluZygpKSA9PSBkYXRhO1xyXG4gICAgICAgICAgICBsZXQgdmFsID0gaXNXaG9sZU51bSA/IE1hdGguYWJzKGRhdGEpLnRvU3RyaW5nKCkgOiBNYXRoLmFicyhkYXRhKS50b0ZpeGVkKDEpO1xyXG4gICAgICAgICAgICByZXR1cm4gaXNOZWdWYWwgPyBcIi0kXCIgKyB2YWwgOiBcIiRcIiArIHZhbDtcclxuICAgICAgICB9XHJcbiAgICB9O1xyXG5cclxuICAgIG5vcm1hbFRyYW5zbGF0ZUZ1bmN0aW9uID0gKGRhdGE6IG51bWJlcik6IHN0cmluZyA9PiB7XHJcbiAgICAgICAgaWYgKGRhdGEgPj0gMTAwMCkge1xyXG4gICAgICAgICAgICBjb25zdCB2YWwgPSAoZGF0YSAvIDEwMDApLnRvRml4ZWQoMSkgKyBcImtcIjtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbDtcclxuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgIT0gTWF0aC5mbG9vcihkYXRhKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YS50b0ZpeGVkKDEpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7XHJcbiAgICB9O1xyXG5cclxuICAgIGZpbmRVbmlxdWVEYXRlc1dpdGhEYXRhKGRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHVuaXF1ZURhdGVzID0gdW5pcShkYXRhLm1hcCgodSkgPT4gdVtcImRhdGVcIl0pKTtcclxuICAgICAgICBsZXQgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQ6IE5nYkRhdGVUeXBlW10gPSBbXTtcclxuICAgICAgICB1bmlxdWVEYXRlcy5mb3JFYWNoKChkYXRlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgdW5pcXVlRGF0ZXNJbk5nYkRhdGVGb3JtYXQucHVzaChcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGVTdGFuZGFyZEZvcm1hdChkYXlqcyhkYXRlLCBcIk1NL0REL1lZXCIpLmZvcm1hdChcIk1NL0REL1lZWVlcIikpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB1bmlxdWVEYXRlc0luTmdiRGF0ZUZvcm1hdDtcclxuICAgIH1cclxuXHJcbiAgICByZU9yZGVyQXBwbGllZEZpbHRlcnNBcnJheShpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkOiBib29sZWFuLCBkYXRlPzogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZEYXRhSXNGaWx0ZXJlZChpc0ZpbHRlcmVkLCBpc0hpZXJhcmNoaWFsVXNlckZpbHRlcmVkLCBkYXRlKTtcclxuICAgICAgICB0aGlzLnJlbW92ZU9yQ2hhbmdlTGF0ZXN0RmlsdGVySW5kZXgoaXNGaWx0ZXJlZCk7XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZkRhdGFJc0ZpbHRlcmVkKGlzRmlsdGVyZWQ6IGJvb2xlYW4sIGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQ6IGJvb2xlYW4sIGRhdGU/OiBhbnkpIHtcclxuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09IFwidXNlclwiICYmICF0aGlzLnRvb2x0aXBNYXAuaGFzKFwidXNlclwiKSkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID0gY2xvbmVEZWVwKGlzSGllcmFyY2hpYWxVc2VyRmlsdGVyZWQpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwidGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInRpbWVvdXRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlRW5kVGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIlN0YXJ0VGltZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIkVuZFRpbWVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJzdGFydF90aW1lX2Zvcl9maWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRFbmRUaW1lTXVsdGlcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZFJhZGlvID09IFwic3RhcnRFbmRUaW1lXCIgfHwgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSB8fFxyXG4gICAgICAgICAgICAgICAgIXRoaXMuaW5jbHVkZVplcm9UaW1lIHx8XHJcbiAgICAgICAgICAgICAgICAhdGhpcy5pbmNsdWRlTXVsdGlUaW1lO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zbGlkZXJTZXQuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9XHJcbiAgICAgICAgICAgICAgICAhaXNFcXVhbChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSxcclxuICAgICAgICAgICAgICAgICkgJiYgIWlzRXF1YWwodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyksIHRoaXMuc2xpZGVyRGF0YSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwb3N0ZWRBZHVcIiAmJiB0aGlzLnN1YlJhZGlvQnV0dG9uID09IFwibm90UmVxdWlyZWRcIikge1xyXG4gICAgICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKCFpc0ZpbHRlcmVkICYmIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5kZWxldGUodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcImVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJwZXJpb2RcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwidGltZW91dERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPT0gXCJHZW5lcmF0ZWRPblwiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcIldlZWtcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBpc0ZpbHRlcmVkID1cclxuICAgICAgICAgICAgICAgICFpc0VxdWFsKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLFxyXG4gICAgICAgICAgICAgICAgKSAmJiAhaXNFcXVhbCh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKSwgdGhpcy5mbGlnaHREYXRlUmFuZ2UpO1xyXG4gICAgICAgICAgICBpZiAoIWlzRmlsdGVyZWQgJiYgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmRlbGV0ZSh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgbGV0IHRvdGFsT3B0aW9uc0NvdW50ID0gdGhpcy50b29sdGlwTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbikubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPcHRpb25zQ291bnQgPSB0aGlzLnRvb2x0aXBNYXBcclxuICAgICAgICAgICAgICAgIC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICAgICAgLmZpbHRlcigoeDogYW55KSA9PiAheC5pc0hpZGRlbiAmJiB4LmlzU2VsZWN0ZWQpLmxlbmd0aDtcclxuICAgICAgICAgICAgaXNGaWx0ZXJlZCA9IHNlbGVjdGVkT3B0aW9uc0NvdW50ID4gMCAmJiBzZWxlY3RlZE9wdGlvbnNDb3VudCAhPSB0b3RhbE9wdGlvbnNDb3VudCA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGlzRmlsdGVyZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IHNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgaWYgKGlzRmlsdGVyZWQgJiYgIXNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuYWRkKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChpc0ZpbHRlcmVkICYmIHNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIHNldC5hZGQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZXQuZGVsZXRlKHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuYXBwbGllZEZpbHRlcnNBcnJheSA9IFsuLi5zZXRdO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nSXNBcHBsaWVkVGhlblNvcnRUaGVEYXRhKG9yaWdpbmFsRGF0YTogYW55W10pIHtcclxuICAgICAgICBpZiAoIXRoaXMuYW5uYVNvcnRTZXJ2aWNlPy5jb2x1bW5Tb3J0U3RhdGUpIHJldHVybiBvcmlnaW5hbERhdGE7XHJcbiAgICAgICAgZm9yIChsZXQgW2tleSwgdmFsdWVdIG9mIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5lbnRyaWVzKCkpIHtcclxuICAgICAgICAgICAgaWYgKHZhbHVlID09IFwiQVNDXCIpIHtcclxuICAgICAgICAgICAgICAgIG9yaWdpbmFsRGF0YSA9IGNsb25lRGVlcChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5zb3J0RGF0YUZvckNvbXBvbmVudE90aGVyVGhhbkx1ckFuZENzclBhZ2UodHJ1ZSwgb3JpZ2luYWxEYXRhLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBcIkRFU0NcIikge1xyXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhID0gY2xvbmVEZWVwKFxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLnNvcnREYXRhRm9yQ29tcG9uZW50T3RoZXJUaGFuTHVyQW5kQ3NyUGFnZShmYWxzZSwgb3JpZ2luYWxEYXRhLCBrZXkpLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb3JpZ2luYWxEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIGZpbHRlckRhdGEob3JpZ2luYWxEYXRhOiBhbnlbXSwga2V5VG9Ta2lwOiBzdHJpbmcsIGlzTHVyQ3NyUGFnZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkRGF0YSA9IFsuLi5vcmlnaW5hbERhdGFdO1xyXG4gICAgICAgIGlmICghaXNMdXJDc3JQYWdlKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IHRoaXMuY2hlY2tJZlNvcnRpbmdJc0FwcGxpZWRUaGVuU29ydFRoZURhdGEob3JpZ2luYWxEYXRhKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoa2V5ICE9IGtleVRvU2tpcCAmJiBvcmlnaW5hbERhdGEubGVuZ3RoID4gMCAmJiBPYmplY3Qua2V5cyhvcmlnaW5hbERhdGFbMF0pLmluY2x1ZGVzKGtleSkpIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNsaWRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiQWlyRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcInRpbWVvdXREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0RW5kRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwiZGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwiRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwicmV2aXNpb25TdGFydERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PSBcIkdlbmVyYXRlZE9uXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGVkU3BvdERhdGVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJWaW9sYXRpbmdTcG90RGF0ZVwiXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuaXNPYmplY3RJblRoZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwicGVyaW9kXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiU3RhcnRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwidGltZW91dFRpbWVcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJzdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICAgICAgICAgIGtleSA9PT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiT3RoZXJBdmFpbGFibGVTcG90c1RhYmxlU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJPdGhlckF2YWlsYWJsZVNwb3RzVGFibGVFbmRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiU3RhcnRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT0gXCJFbmRUaW1lXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwic3RhcnRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAgICAgICAgICBrZXkgPT09IFwiZW5kX3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgICAgICAgICAga2V5ID09IFwidGltZVwiXHJcbiAgICAgICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvckZyb21BbmRUb1RpbWVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSBcInN0YXJ0RW5kVGltZU11bHRpXCIgfHwga2V5ID09IFwic3RhcnRFbmRUaW1lXCIgfHwga2V5ID09PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSksXHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKHUpID0+IHZhbHVlLmluY2x1ZGVzKHVba2V5XSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5PcmRlcnNJblRoZVJhbmdlKG9yZGVyOiBhbnksIHJhbmdlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRGF0ZUJldHdlZW5UaGVTZWxlY3RlZFJhbmdlID0gZGF5anMob3JkZXJba2V5XSkuaXNCZXR3ZWVuKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSwgcmFuZ2UubWF4U2VsZWN0ZWREYXRlKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzVGhlTWluU2VsZWN0ZWREYXRlID0gZGF5anMob3JkZXJba2V5XSkuaXNTYW1lKHJhbmdlLm1pblNlbGVjdGVkRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRGF0ZVNhbWVBc1RoZU1heFNlbGVjdGVkRGF0ZSA9IGRheWpzKG9yZGVyW2tleV0pLmlzU2FtZShyYW5nZS5tYXhTZWxlY3RlZERhdGUpO1xyXG4gICAgICAgIHJldHVybiBpc0RhdGVCZXR3ZWVuVGhlU2VsZWN0ZWRSYW5nZSB8fCBpc0RhdGVTYW1lQXNUaGVNaW5TZWxlY3RlZERhdGUgfHwgaXNEYXRlU2FtZUFzVGhlTWF4U2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55KSB7XHJcbiAgICAgICAgbGV0IGZvcm1hdCA9IFwiSEg6bW06c3NcIjtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRTdGFydERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuc3RhcnRUaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEVuZERhdGUgPSBkYXlqcyhzZWxlY3RlZERhdGEuZW5kVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gZGF5anMob2JqLnN0YXJ0VGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgZW5kVGltZSA9IGRheWpzKG9iai5lbmRUaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBsZXQgaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSA9IHN0YXJ0VGltZS5pc1NhbWUoc2VsZWN0ZWRTdGFydERhdGUpO1xyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRTdGFydERhdGUsIHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSA9IGVuZFRpbWUuaXNTYW1lKHNlbGVjdGVkRW5kRGF0ZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkU3RhcnREYXRlLCBzZWxlY3RlZEVuZERhdGUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUgJiYgaXNFbmRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZVNhbWVBc1NlbGVjdGVkU3RhcnRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZVNhbWVBc1NlbGVjdGVkRW5kVGltZSlcclxuICAgICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IGFueSkge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSBcIk1NL0REL1lZWVkgSEg6bW06c3NcIjtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKFwiMDEvMDEvMjAwMSBcIiArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBkYXlqcyhcIjAxLzAxLzIwMDEgXCIgKyBzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG4gICAgICAgIGxldCBvYmpUaW1lID0gb2JqW2tleV07XHJcblxyXG4gICAgICAgIGlmIChbXCJcIiwgXCItXCIsIG51bGxdLmluY2x1ZGVzKG9ialRpbWUpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRGF0YS5pbmNsdWRlTXVsdGkgJiYgb2JqW2tleV0gPT0gXCI8bXVsdGk+XCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV0gPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldID09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgZGF5anNUaW1lID0gZGF5anMoXCIwMS8wMS8yMDAxIFwiICsgb2JqVGltZSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgbGV0IGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkRnJvbVRpbWUgPSBkYXlqc1RpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgICAgIGxldCBpc09ialRpbWVTYW1lQXNTZWxlY3RlZFRvVGltZSA9IGRheWpzVGltZS5pc1NhbWUoc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc09ialRpbWVCZXR3ZWVuU2VsZWN0ZWRGcm9tVGltZUFuZFRvVGltZSA9IGRheWpzVGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG5cclxuICAgICAgICByZXR1cm4gKFxyXG4gICAgICAgICAgICBpc09ialRpbWVTYW1lQXNTZWxlY3RlZEZyb21UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZVNhbWVBc1NlbGVjdGVkVG9UaW1lIHx8XHJcbiAgICAgICAgICAgIGlzT2JqVGltZUJldHdlZW5TZWxlY3RlZEZyb21UaW1lQW5kVG9UaW1lXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5EYXRhRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2Uob2JqOiBhbnksIHNlbGVjdGVkRGF0YTogYW55LCBrZXk6IHN0cmluZykge1xyXG4gICAgICAgIGxldCBmb3JtYXQgPSBcIk1NL0REL1lZWVkgSEg6bW06c3NcIjtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRGcm9tVGltZSA9IGRheWpzKFwiMDEvMDEvMjAwMSBcIiArIHNlbGVjdGVkRGF0YS5mcm9tVGltZSwgZm9ybWF0KTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRUb1RpbWUgPSBkYXlqcyhcIjAxLzAxLzIwMDEgXCIgKyBzZWxlY3RlZERhdGEudG9UaW1lLCBmb3JtYXQpO1xyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XVswXSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICghc2VsZWN0ZWREYXRhLmluY2x1ZGVNdWx0aSAmJiBvYmpba2V5XVswXSA9PSBcIjxtdWx0aT5cIikge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0ZWREYXRhLmluY2x1ZGVaZXJvICYmIG9ialtrZXldWzBdID09IFwiMFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVplcm8gJiYgb2JqW2tleV1bMF0gPT0gXCIwXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKCFzZWxlY3RlZERhdGEuaW5jbHVkZVRpbWVSYW5nZSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lID0gZGF5anMoXCIwMS8wMS8yMDAxIFwiICsgb2JqW2tleV1bMV0sIGZvcm1hdCk7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUgPSBkYXlqcyhcIjAxLzAxLzIwMDEgXCIgKyBvYmpba2V5XVsyXSwgZm9ybWF0KTtcclxuXHJcbiAgICAgICAgbGV0IGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgPSBzdGFydFRpbWUuaXNTYW1lKHNlbGVjdGVkRnJvbVRpbWUpO1xyXG4gICAgICAgIGxldCBpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IHN0YXJ0VGltZS5pc0JldHdlZW4oc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWUpO1xyXG4gICAgICAgIGxldCBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUgPSBlbmRUaW1lLmlzU2FtZShzZWxlY3RlZFRvVGltZSk7XHJcbiAgICAgICAgbGV0IGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSA9IGVuZFRpbWUuaXNCZXR3ZWVuKHNlbGVjdGVkRnJvbVRpbWUsIHNlbGVjdGVkVG9UaW1lKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lQmV0d2VlblNlbGVjdGVkU3RhcnRBbmRFbmRUaW1lICYmIGlzRW5kVGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSkgfHxcclxuICAgICAgICAgICAgKGlzU3RhcnRUaW1lU2FtZUFzU2VsZWN0ZWRTdGFydFRpbWUgJiYgaXNFbmRUaW1lU2FtZUFzU2VsZWN0ZWRFbmRUaW1lKSB8fFxyXG4gICAgICAgICAgICAoaXNTdGFydFRpbWVTYW1lQXNTZWxlY3RlZFN0YXJ0VGltZSAmJiBpc0VuZFRpbWVCZXR3ZWVuU2VsZWN0ZWRTdGFydEFuZEVuZFRpbWUpIHx8XHJcbiAgICAgICAgICAgIChpc1N0YXJ0VGltZUJldHdlZW5TZWxlY3RlZFN0YXJ0QW5kRW5kVGltZSAmJiBpc0VuZFRpbWVTYW1lQXNTZWxlY3RlZEVuZFRpbWUpXHJcbiAgICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXREYXRhSW5UaGVEYXRlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogYW55KSB7XHJcbiAgICAgICAgbGV0IHBhcnNpbmdGb3JtYXQ6IHN0cmluZztcclxuICAgICAgICBpZiAoa2V5ID09PSBcInBlcmlvZFwiKSB7XHJcbiAgICAgICAgICAgIHBhcnNpbmdGb3JtYXQgPSBcIllZWVktTU0tRERcIjtcclxuXHJcbiAgICAgICAgICAgIGxldCBkYXlqc1N0YXJ0RGF0ZSA9IGRheWpzKG9iai5zdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF5anNFbmREYXRlID0gZGF5anMob2JqLmVuZERhdGUpO1xyXG5cclxuICAgICAgICAgICAgbGV0IHN0YXJ0RGF0ZUlzQmV0d2VlblNlbERhdGUgPSBkYXlqc1N0YXJ0RGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgICAgIGxldCBlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzRW5kRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcblxyXG4gICAgICAgICAgICBsZXQgc3RhcnREYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUoZGF5anNTdGFydERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZW5kRGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUoZGF5anNFbmREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiAoXHJcbiAgICAgICAgICAgICAgICAoc3RhcnREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBzdGFydERhdGVJc1NhbWVBc1NlbFN0YXJ0RGF0ZSkgJiZcclxuICAgICAgICAgICAgICAgIChlbmREYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBlbmREYXRlSXNTYW1lQXNTZWxFbmREYXRlKVxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJBaXJEYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImZsaWdodFN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJmbGlnaHRFbmREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIldlZWtcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwidGltZW91dERhdGVcIlxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBwYXJzaW5nRm9ybWF0ID0gXCJNTS9ERC9ZWVlZXCI7XHJcbiAgICAgICAgICAgIGxldCBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc0JldHdlZW4oXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5taW5TZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICAgICB2YWx1ZS5tYXhTZWxlY3RlZERhdGUsXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsU3RhcnREYXRlID0gZGF5anMob2JqW2tleV0sIHBhcnNpbmdGb3JtYXQpLmlzU2FtZSh2YWx1ZS5taW5TZWxlY3RlZERhdGUpO1xyXG4gICAgICAgICAgICBsZXQgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZSA9IGRheWpzKG9ialtrZXldLCBwYXJzaW5nRm9ybWF0KS5pc1NhbWUodmFsdWUubWF4U2VsZWN0ZWREYXRlKTtcclxuXHJcbiAgICAgICAgICAgIHJldHVybiBkYXRlSXNCZXR3ZWVuU2VsRGF0ZSB8fCBkYXRlSXNTYW1lQXNTZWxTdGFydERhdGUgfHwgZGF0ZUlzU2FtZUFzU2VsRW5kRGF0ZTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGluaXRpYWxpemVUaW1lRmlsdGVyRGF0YShjbG9uZWREYXRhOiBhbnlbXSwga2V5ID0gXCJzdGFydEVuZFRpbWVcIikge1xyXG4gICAgICAgIGxldCBzdGFydFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJzdGFydFRpbWVcIik7XHJcbiAgICAgICAgbGV0IGVuZFRpbWVBcnIgPSBtYXAoY2xvbmVkRGF0YSwgXCJlbmRUaW1lXCIpO1xyXG5cclxuICAgICAgICBzdGFydFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYTogYW55LCBiOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVEZXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgaW5pdGlhbFN0YXJ0RW5kVGltZSA9IHtcclxuICAgICAgICAgICAgc3RhcnRUaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIGVuZFRpbWU6IGVuZFRpbWVBcnJbMF0sXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBpbml0aWFsU3RhcnRFbmRUaW1lKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Db2x1bW5GaWx0ZXJTdGF0dXMoZGF0YTogYW55W10sIGhlYWRlck5hbWU6IHN0cmluZyB8IG51bWJlcikge1xyXG4gICAgICAgIGlmIChoZWFkZXJOYW1lID09IFwic3RhcnRFbmRUaW1lXCIpIHtcclxuICAgICAgICAgICAgbGV0IHRpbWUgPSBkYXRhLm1hcCgodSkgPT4gdVtoZWFkZXJOYW1lXVswXSk7XHJcbiAgICAgICAgICAgIGxldCB1bmlxVGltZSA9IHVuaXEodGltZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB1bmlxVGltZS5sZW5ndGggPT0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB1bmlxKGRhdGEubWFwKCh1KSA9PiB1W2hlYWRlck5hbWVdKSkubGVuZ3RoID4gMSA/IGZhbHNlIDogdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRGaWx0ZXJPcHRpb25zRGF0YShkYXRhOiBhbnlbXSwgY2xvbmVkRGF0YTogYW55W10sIGtleT86IHN0cmluZykge1xyXG4gICAgICAgIGxldCBhcHBsaWVkRmlsdGVyU2V0ID0gbmV3IFNldCh0aGlzLmFwcGxpZWRGaWx0ZXJzQXJyYXkpO1xyXG4gICAgICAgIGtleSA9IGtleSA/IGtleSA6IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBpZiAoYXBwbGllZEZpbHRlclNldC5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJEYXRhKGNsb25lZERhdGEsIGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJlT3JkZXJBcHBsaWVkRmlsdGVyc1N0YXRlKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGlzRmlsdGVyZWQgPSB0cnVlO1xyXG4gICAgICAgIGlzRmlsdGVyZWQgPSB0aGlzLmNoZWNrSWZGaWx0ZXJJc0FwcGxpZWQoY2xvbmVkRGF0YSwgdmFsdWUpO1xyXG4gICAgICAgIHRoaXMucmVtb3ZlT3JDaGFuZ2VMYXRlc3RGaWx0ZXJJbmRleChpc0ZpbHRlcmVkKTtcclxuICAgICAgICByZXR1cm4gaXNGaWx0ZXJlZDtcclxuICAgIH1cclxuXHJcbiAgICBjaGVja0lmRmlsdGVySXNBcHBsaWVkKGNsb25lZERhdGE6IGFueVtdLCB2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IGluaXRpYWxWYWx1ZU9mQ29sdW1uID0gc29ydEJ5KGNsb25lZERhdGEubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgICAgICBsZXQgY3VycmVudFZhbHVlT2ZDb2x1bW4gPSBzb3J0QnkodGhpcy5hcHBseUZpbHRlcihjbG9uZWREYXRhLCB2YWx1ZSkubWFwKChpdGVtKSA9PiBpdGVtW3RoaXMuc2VsZWN0ZWRSYWRpb10pKTtcclxuICAgICAgICByZXR1cm4gIWlzRXF1YWwoaW5pdGlhbFZhbHVlT2ZDb2x1bW4sIGN1cnJlbnRWYWx1ZU9mQ29sdW1uKTtcclxuICAgIH1cclxuXHJcbiAgICBhcHBseUZpbHRlcihkYXRhOiBhbnlbXSwgdmFsdWU6IGFueSkge1xyXG4gICAgICAgIGxldCBmaWx0ZXJlZERhdGEgPSBkYXRhO1xyXG4gICAgICAgIGxldCBrZXkgPSB0aGlzLnNlbGVjdGVkUmFkaW87XHJcbiAgICAgICAgaWYgKHRoaXMuc2xpZGVyU2V0LmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIGZpbHRlcmVkRGF0YSA9IGZpbHRlcmVkRGF0YS5maWx0ZXIoKG9iaikgPT4gb2JqW2tleV0gPj0gdmFsdWUubWluICYmIG9ialtrZXldIDw9IHZhbHVlLm1heCk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChcclxuICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0RGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJlbmREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIkFpckRhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwidGltZW91dERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiZmxpZ2h0U3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcImZsaWdodEVuZERhdGVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJkYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwiRGF0ZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSBcInJldmlzaW9uU3RhcnREYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwiR2VuZXJhdGVkT25cIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiV2Vla1wiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJWaW9sYXRlZFNwb3REYXRlXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcIlZpb2xhdGluZ1Nwb3REYXRlXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLmlzT2JqZWN0SW5UaGVSYW5nZShvYmosIHZhbHVlLCBrZXkpKTtcclxuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gXCJwZXJpb2RcIikge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMuZ2V0RGF0YUluVGhlRGF0ZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJTdGFydFRpbWVGb3JGaWx0ZXJcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT09IFwiRW5kVGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSBcInRpbWVvdXRUaW1lXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0VGltZUZvckZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJlbmRUaW1lRm9yRmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09PSBcInN0YXJ0X3RpbWVfZm9yX2ZpbHRlclwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PT0gXCJlbmRfdGltZV9mb3JfZmlsdGVyXCIgfHxcclxuICAgICAgICAgICAga2V5ID09IFwidGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZVN0YXJ0VGltZVwiIHx8XHJcbiAgICAgICAgICAgIGtleSA9PSBcIk90aGVyQXZhaWxhYmxlU3BvdHNUYWJsZUVuZFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJTdGFydFRpbWVcIiB8fFxyXG4gICAgICAgICAgICBrZXkgPT0gXCJFbmRUaW1lXCJcclxuICAgICAgICApIHtcclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhID0gZmlsdGVyZWREYXRhLmZpbHRlcigob2JqKSA9PiB0aGlzLnJldHVybkRhdGFGb3JGcm9tQW5kVG9UaW1lUmFuZ2Uob2JqLCB2YWx1ZSwga2V5KSk7XHJcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09IFwic3RhcnRFbmRUaW1lTXVsdGlcIiB8fCBrZXkgPT0gXCJzdGFydEVuZFRpbWVcIiB8fCBrZXkgPT09IFwiVGltZUJhbmRcIikge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKChvYmopID0+IHRoaXMucmV0dXJuRGF0YUZvclN0YXJ0QW5kRW5kVGltZVJhbmdlKG9iaiwgdmFsdWUsIGtleSkpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodmFsdWUubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBmaWx0ZXJlZERhdGEgPSBmaWx0ZXJlZERhdGEuZmlsdGVyKCh1KSA9PiB2YWx1ZS5pbmNsdWRlcyh1W2tleV0pKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YTtcclxuICAgIH1cclxuXHJcbiAgICBpc09iamVjdEluVGhlUmFuZ2Uob2JqOiBhbnksIHZhbHVlOiBhbnksIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IG9ialZhbCA9IG9ialtrZXldO1xyXG4gICAgICAgIGxldCBkYXlqc0RhdGUgPSBkYXlqcyhvYmpWYWwpO1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUuZnJvbURhdGUgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHZhbHVlLnRvRGF0ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgICAgICB2YWx1ZS5mcm9tRGF0ZSA9IGRheWpzKFxyXG4gICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydE5nYkRhdGVUb01vbWVudChcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHZhbHVlLmZyb21EYXRlLCBcIkREL01NL1lZWVlcIiksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB2YWx1ZS50b0RhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZSh2YWx1ZS50b0RhdGUsIFwiREQvTU0vWVlZWVwiKSxcclxuICAgICAgICAgICAgICAgICksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBpc0RhdGVTYW1lQXNTdGFydE9mVGhlUmFuZ2UgPSB2YWx1ZS5mcm9tRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgICAgICBsZXQgaXNEYXRlU2FtZUFzRW5kT2ZUaGVSYW5nZSA9IHZhbHVlLnRvRGF0ZS5pc1NhbWUob2JqVmFsKTtcclxuICAgICAgICBsZXQgaXNEYXRlQmV0d2VlblRoZVN0YXJ0QW5kRW5kT2ZSYW5nZSA9IGRheWpzRGF0ZS5pc0JldHdlZW4odmFsdWUuZnJvbURhdGUsIHZhbHVlLnRvRGF0ZSk7XHJcbiAgICAgICAgcmV0dXJuIGlzRGF0ZVNhbWVBc1N0YXJ0T2ZUaGVSYW5nZSB8fCBpc0RhdGVTYW1lQXNFbmRPZlRoZVJhbmdlIHx8IGlzRGF0ZUJldHdlZW5UaGVTdGFydEFuZEVuZE9mUmFuZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgdXBkYXRlU3RhdGVPZlRoZUN1cnJlbnRGaWx0ZXJUYWIoc29ydE1hcDogTWFwPHN0cmluZywgU29ydFR5cGU+KSB7XHJcbiAgICAgICAgbGV0IGFjdGl2ZUtleSA9IHRoaXMuc2VsZWN0ZWRSYWRpbztcclxuICAgICAgICBsZXQga2V5QXJyOiBzdHJpbmdbXSA9IFtdO1xyXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuaXNGaWx0ZXJTb3J0QWN0aXZlKS5mb3JFYWNoKChrZXkpID0+IHtcclxuICAgICAgICAgICAgaWYgKGtleS5pbmNsdWRlcyhhY3RpdmVLZXkpKSB7XHJcbiAgICAgICAgICAgICAgICBrZXlBcnIgPSBrZXkuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pc0ZpbHRlclNvcnRBY3RpdmVba2V5XSA9IHRoaXMuaXNUb29sdGlwQWN0aXZlKGtleUFyciwgc29ydE1hcCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICB1cGRhdGVTdGF0ZU9mQWxsVGhlS2V5cyhzb3J0TWFwOiBNYXA8c3RyaW5nLCBTb3J0VHlwZT4pIHtcclxuICAgICAgICBPYmplY3Qua2V5cyh0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZSkuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgICAgICAgIGxldCBrZXlBcnIgPSBrZXkuc3BsaXQoXCIsXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmlzRmlsdGVyU29ydEFjdGl2ZVtrZXldID0gdGhpcy5pc1Rvb2x0aXBBY3RpdmUoa2V5QXJyLCBzb3J0TWFwKTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRIb3VyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICBpZiAodmFsdWUgPT0gXCJcIikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IDE7XHJcbiAgICAgICAgfSBlbHNlIGlmIChwYXJzZUludCh2YWx1ZSkgPCAxMikge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IHBhcnNlSW50KHZhbHVlKSArIDE7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgZGVjcmVtZW50SG91cih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgaWYgKHZhbHVlID09IFwiXCIpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSAxMjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHZhbHVlKSA+IDEpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUludCh2YWx1ZSkgLSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gMTI7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRNaW51dGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIC8vIGluY3JlbWVudCB0byBuZWFyZXN0IHByb3BlciBpbnRlcnZhbCgxNSwzMCw0NSlcclxuICAgICAgICBsZXQgbWluID0gcGFyc2VJbnQodmFsdWUpO1xyXG4gICAgICAgIGlmIChtaW4gPD0gMTQpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBcIjE1XCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTUgJiYgbWluIDw9IDI5KSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gXCIzMFwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMwICYmIG1pbiA8PSA0NCkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiNDVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSA0NSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiMDBcIjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KHZhbHVlKTtcclxuICAgICAgICBpZiAobWluID4gMCAmJiBtaW4gPD0gMTUpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSBcIjAwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMTYgJiYgbWluIDw9IDMwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMxICYmIG1pbiA8PSA0NSkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IFwiMzBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+IDQ1IHx8IG1pbiA9PSAwKSB7XHJcbiAgICAgICAgICAgIHZhbHVlID0gXCI0NVwiO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Q2hlY2tib3ggbWV0aG9kPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS8vXHJcblxyXG4gICAgZGlzYWJsZUFjdGl2ZUZpbHRlckNsZWFyQnV0dG9uKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3RlZEZpbHRlclNldCA9IG5ldyBTZXQodGhpcy5hcHBsaWVkRmlsdGVyc0FycmF5KTtcclxuXHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID0gdGhpcy5nZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk7XHJcbiAgICAgICAgbGV0IGlzU29ydFByZXNlbnQgPVxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgJiZcclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNpemUgPiAwICYmXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyICE9IFNvcnRUeXBlRW51bS5ERUZBVUxUO1xyXG5cclxuICAgICAgICByZXR1cm4gIShzZWxlY3RlZEZpbHRlclNldC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSB8fCBpc1NvcnRQcmVzZW50KTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDb2x1bW5Tb3J0U3RhdGVGb3JTZWxlY3RlZFJhZGlvKCk6IHN0cmluZyB7XHJcbiAgICAgICAgbGV0IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyID1cclxuICAgICAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlICYmXHJcbiAgICAgICAgICAgIHRoaXMuYW5uYVNvcnRTZXJ2aWNlLmNvbHVtblNvcnRTdGF0ZS5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSAmJlxyXG4gICAgICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgY3VycmVudENvbHVtblNvcnRGaWx0ZXIgPSBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA/IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyIDogU29ydFR5cGVFbnVtLkRFRkFVTFQ7XHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZUxpc3RGb3JDaGVja2JveEZpbHRlcihoZWFkZXI6IHN0cmluZywgb3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgdG9vbHRpcE9wdGlvbnMgPSB0aGlzLmdldFRvb2x0aXBNb2RlbEZyb21PcHRpb25EYXRhKG9wdGlvbkRhdGEsIGhlYWRlcik7XHJcblxyXG4gICAgICAgIHRoaXMuc2VsZWN0VW5zZWxlY3RMaXN0Q2hlY2tib3godG9vbHRpcE9wdGlvbnMsIGhlYWRlcik7XHJcbiAgICAgICAgdGhpcy5mb3JtYXROdWxsT3B0aW9uVG9TcGVjaWZpZWRTdHJpbmcodG9vbHRpcE9wdGlvbnMsIFwiLVwiKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRvb2x0aXBPcHRpb25zO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRvb2x0aXBNb2RlbEZyb21PcHRpb25EYXRhKG9wdGlvbkRhdGE6IGFueVtdLCBoZWFkZXI6IHN0cmluZykge1xyXG4gICAgICAgIGxldCB1bmlxT3B0aW9uRGF0YSA9IHVuaXEob3B0aW9uRGF0YS5tYXAoKGl0ZW0pID0+IGl0ZW1baGVhZGVyXSkpO1xyXG4gICAgICAgIHJldHVybiB1bmlxT3B0aW9uRGF0YS5tYXAoKGl0ZW0sIGluZGV4KSA9PiBuZXcgVG9vbHRpcE1vZGVsKGl0ZW0sIGluZGV4ICsgMSkpO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdFVuc2VsZWN0TGlzdENoZWNrYm94KHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkVmFsdWVTZXQgPSBuZXcgU2V0KHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldChoZWFkZXIpKTtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaXNTZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWVTZXQuaGFzKGl0ZW0udmFsdWUpID8gdHJ1ZSA6IGZhbHNlKSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdG9vbHRpcE9wdGlvbnMuZm9yRWFjaCgoaXRlbSkgPT4gKGl0ZW0uaXNTZWxlY3RlZCA9IHRydWUpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgZm9ybWF0TnVsbE9wdGlvblRvU3BlY2lmaWVkU3RyaW5nKHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgZm9ybWF0dGVkU3RyaW5nOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0b29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0udmFsdWUgPT0gbnVsbCk7XHJcblxyXG4gICAgICAgIGlmIChpbmRleCAhPSAtMSkge1xyXG4gICAgICAgICAgICB0b29sdGlwT3B0aW9uc1tpbmRleF0ubGFiZWwgPSBmb3JtYXR0ZWRTdHJpbmc7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGdldENsb25lZFRvb2x0aXBBbmRUb29sdGlwT3B0aW9uKHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSwgc29ydEJ5U3RyaW5nOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgW3NlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtc10gPSB0aGlzLmdldFNlbGVjdGVkQW5kVW5zZWxlY3RlZEl0ZW1zKHRvb2x0aXBPcHRpb25zKTtcclxuICAgICAgICBsZXQgc29ydGVkU2VsZWN0ZWRJdGVtcyA9IHNvcnRCeShzZWxlY3RlZEl0ZW1zLCBzb3J0QnlTdHJpbmcpO1xyXG4gICAgICAgIGxldCBzb3J0ZWRVbnNlbGVjdGVkSXRlbXMgPSBzb3J0QnkodW5zZWxlY3RlZEl0ZW1zLCBzb3J0QnlTdHJpbmcpO1xyXG5cclxuICAgICAgICBsZXQgY2xvbmVkVG9vbHRpcE9wdGlvbnMgPSBbLi4uc29ydGVkU2VsZWN0ZWRJdGVtcywgLi4uc29ydGVkVW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgICAgICBsZXQgdXBkYXRlZFRvb2x0aXBPcHRpb25zID0gY2xvbmVEZWVwKGNsb25lZFRvb2x0aXBPcHRpb25zKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIFtjbG9uZWRUb29sdGlwT3B0aW9ucywgdXBkYXRlZFRvb2x0aXBPcHRpb25zLCBzZWxlY3RlZEl0ZW1zLCB1bnNlbGVjdGVkSXRlbXNdO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEhlaWdodE9mQ2hlY2tib3hUb29sdGlwRmlsdGVyKGRhdGFMZW5ndGg6IG51bWJlciwgbWFyZ2luOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gZGF0YUxlbmd0aCA+IDYgPyAyMDAgOiAyNi4wMyAqIGRhdGFMZW5ndGggKyBtYXJnaW4gKiBkYXRhTGVuZ3RoICsgbWFyZ2luO1xyXG4gICAgfVxyXG5cclxuICAgIHVuQ2hlY2tBbGxDaGVja2JveCh0b29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10sIGNsb25lZFRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGl0ZW0pID0+IHtcclxuICAgICAgICAgICAgaXRlbS5pc1NlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgob3B0KSA9PiBvcHQuaWQgPT0gaXRlbS5pZCk7XHJcbiAgICAgICAgICAgIGNsb25lZFRvb2x0aXBPcHRpb25zW2luZGV4XS5pc1NlbGVjdGVkID0gZmFsc2U7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgc2VsZWN0QWxsQ2hlY2tib3godG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICB0b29sdGlwT3B0aW9ucy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgICAgICAgIGl0ZW0uaXNTZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbmRJbmRleCgob3B0KSA9PiBvcHQuaWQgPT0gaXRlbS5pZCk7XHJcbiAgICAgICAgICAgIGNsb25lZFRvb2x0aXBPcHRpb25zW2luZGV4XS5pc1NlbGVjdGVkID0gdHJ1ZTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdENoZWNrYm94KGRhdGE6IFRvb2x0aXBNb2RlbCwgY2xvbmVkVG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgZGF0YS5pc1NlbGVjdGVkID0gIWRhdGEuaXNTZWxlY3RlZDtcclxuICAgICAgICBsZXQgaW5kZXggPSBjbG9uZWRUb29sdGlwT3B0aW9ucy5maW5kSW5kZXgoKGl0ZW0pID0+IGl0ZW0uaWQgPT0gZGF0YS5pZCk7XHJcbiAgICAgICAgY2xvbmVkVG9vbHRpcE9wdGlvbnNbaW5kZXhdLmlzU2VsZWN0ZWQgPSBkYXRhLmlzU2VsZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWRBbmRVbnNlbGVjdGVkSXRlbXModG9vbHRpcE9wdGlvbnM6IFRvb2x0aXBNb2RlbFtdKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkSXRlbXMgPSB0b29sdGlwT3B0aW9ucy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0uaXNTZWxlY3RlZCk7XHJcbiAgICAgICAgbGV0IHVuc2VsZWN0ZWRJdGVtcyA9IHRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gIWl0ZW0uaXNTZWxlY3RlZCk7XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zXTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja2JveFByZXZpb3VzU2VsZWN0ZWRWYWx1ZShjbG9uZWRUYWJsZURhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHByZXZpb3VzU2VsZWN0ZWRWYWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcblxyXG4gICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbFZhbHVlID0gc29ydEJ5KHVuaXEoY2xvbmVkVGFibGVEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KHRoaXMuc2VsZWN0ZWRSYWRpbywgaW5pdGlhbFZhbHVlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gc29ydEJ5KHVuaXEoY2xvbmVkVGFibGVEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVt0aGlzLnNlbGVjdGVkUmFkaW9dKSkpO1xyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBwcmV2aW91c1NlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHByZXZpb3VzU2VsZWN0ZWRWYWx1ZTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDaGVja2JveEN1cnJlbnRTZWxlY3RlZFZhbHVlKHNlYXJjaGVkU3RyaW5nOiBzdHJpbmcsIHRvb2x0aXBPcHRpb25zOiBUb29sdGlwTW9kZWxbXSkge1xyXG4gICAgICAgIGxldCBjdXJyZW50U2VsZWN0ZWRWYWx1ZSA9IFtdO1xyXG5cclxuICAgICAgICBpZiAodG9vbHRpcE9wdGlvbnMpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkodG9vbHRpcE9wdGlvbnMuZmlsdGVyKChpdGVtKSA9PiBpdGVtLmlzU2VsZWN0ZWQpLm1hcCgoaXRlbSkgPT4gaXRlbS52YWx1ZSkpO1xyXG5cclxuICAgICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAgICAgIXNlYXJjaGVkU3RyaW5nICYmXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50U2VsZWN0ZWRWYWx1ZS5sZW5ndGggPT0gdG9vbHRpcE9wdGlvbnMubGVuZ3RoICYmXHJcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICAgICApIHtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZFZhbHVlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBibGFua0luZGV4ID0gY3VycmVudFNlbGVjdGVkVmFsdWUuZmluZEluZGV4KChpdGVtOiBzdHJpbmcpID0+IGl0ZW0gPT0gbnVsbCk7XHJcbiAgICAgICAgaWYgKGJsYW5rSW5kZXggIT0gLTEpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkVmFsdWUgPSBzb3J0QnkoY3VycmVudFNlbGVjdGVkVmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGNoZWNrSWZTb3J0aW5nQ2hhbmdlZCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSkge1xyXG4gICAgICAgIGxldCBjdXJyZW50Q29sdW1uU29ydEZpbHRlciA9IHRoaXMuZ2V0Q29sdW1uU29ydFN0YXRlRm9yU2VsZWN0ZWRSYWRpbygpO1xyXG5cclxuICAgICAgICBsZXQgaXNTb3J0Q2hhbmdlZCA9IHRlbXBTb3J0T3JkZXIgIT0gbnVsbCAmJiB0ZW1wU29ydE9yZGVyICE9IGN1cnJlbnRDb2x1bW5Tb3J0RmlsdGVyO1xyXG4gICAgICAgIHJldHVybiBpc1NvcnRDaGFuZ2VkO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEZpbHRlcmVkT3B0aW9uQXNCb2xkU3RyaW5nKHN0cjogc3RyaW5nLCBjbG9uZWRUb29sdGlwT3B0aW9uczogVG9vbHRpcE1vZGVsW10pIHtcclxuICAgICAgICBsZXQgdG9vbHRpcE9wdGlvbnMgPSBjbG9uZURlZXAoXHJcbiAgICAgICAgICAgIGNsb25lZFRvb2x0aXBPcHRpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5sYWJlbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoc3RyLnRvTG93ZXJDYXNlKCkpKSxcclxuICAgICAgICApO1xyXG4gICAgICAgIHRvb2x0aXBPcHRpb25zLmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgICAgICAgZWxlbWVudC5sYWJlbCA9IHRoaXMuYm9sZFN0cmluZyhlbGVtZW50LmxhYmVsLCBzdHIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gdG9vbHRpcE9wdGlvbnM7XHJcbiAgICB9XHJcblxyXG4gICAgYm9sZFN0cmluZyhzdHI6IHN0cmluZywgZmluZDogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluZGV4ZXMgPSB0aGlzLmdldEluZGljZXNPZihmaW5kLCBzdHIsIGZhbHNlKTtcclxuXHJcbiAgICAgICAgaW5kZXhlcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IGl0ZW0gKyBpbmRleCAqIDc7IC8vTXVsdGlwbHlpbmcgYnkgNyBhcyB0aGVyZSBhcmUgN2NoYXI6IDxiPjwvYj5cclxuICAgICAgICAgICAgbGV0IGVuZEluZGV4ID0gc3RhcnRJbmRleCArIGZpbmQubGVuZ3RoO1xyXG4gICAgICAgICAgICBsZXQgc3RyVG9CZVJlcGxhY2VkID0gc3RyLnN1YnN0cmluZyhzdGFydEluZGV4LCBlbmRJbmRleCk7XHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKHN0clRvQmVSZXBsYWNlZCwgXCI8Yj5cIiArIHN0clRvQmVSZXBsYWNlZCArIFwiPC9iPlwiKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gc3RyO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEluZGljZXNPZihzZWFyY2hTdHI6IHN0cmluZywgc3RyOiBzdHJpbmcsIGNhc2VTZW5zaXRpdmU6IGJvb2xlYW4pIHtcclxuICAgICAgICB2YXIgc2VhcmNoU3RyTGVuID0gc2VhcmNoU3RyLmxlbmd0aDtcclxuICAgICAgICBpZiAoc2VhcmNoU3RyTGVuID09IDApIHtcclxuICAgICAgICAgICAgcmV0dXJuIFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB2YXIgc3RhcnRJbmRleCA9IDAsXHJcbiAgICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgICBpbmRpY2VzID0gW107XHJcbiAgICAgICAgaWYgKCFjYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgICBzZWFyY2hTdHIgPSBzZWFyY2hTdHIudG9Mb3dlckNhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcclxuICAgICAgICAgICAgaW5kaWNlcy5wdXNoKGluZGV4KTtcclxuICAgICAgICAgICAgc3RhcnRJbmRleCA9IGluZGV4ICsgc2VhcmNoU3RyTGVuO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gaW5kaWNlcztcclxuICAgIH1cclxuXHJcbiAgICBkaXNhYmxlQWxsQnRuc1doZW5UaGVyZUFyZU5vRmlsdGVyZWRSZXN1bHRzKCk6IFtudW1iZXIsIGJvb2xlYW4sIGJvb2xlYW4sIGJvb2xlYW5dIHtcclxuICAgICAgICAvLyBbc2VsZWN0ZWRDaGVja2JveE9wdGlvbnNDb3VudCwgZGlzYWJsZUNoZWNrYm94QXBwbHksIGRpc2FibGVDbGVhckFsbCwgZGlzYWJsZVNlbGVjdEFsbF07XHJcbiAgICAgICAgcmV0dXJuIFswLCB0cnVlLCB0cnVlLCB0cnVlXTtcclxuICAgIH1cclxuXHJcbiAgICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PUNhbGVuZGFyIGZpbHRlcj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ly9cclxuICAgIGNyZWF0ZVJhbmdlRm9yVGhlRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlO1xyXG4gICAgICAgIC8vV2hlbiB5b3Ugd2FudCB0byB1c2Ugc3RhcnREYXRlIGFuZCBlbmREYXRlIGNvbWJpbmVkIGFzIHNpbmdsZSBjb2x1bW4gdGhlbiB1c2UgUGVyaW9kLlxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwicGVyaW9kXCIgfHxcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFJhZGlvID09IFwiYnV5ZXJGbGlnaHREYXRlc1wiIHx8XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyA9PSBcInRyYWZmaWNGbGlnaHREYXRlc1wiXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLmNyZWF0ZVN0YXJ0RW5kRGF0ZVJhbmdlKG9wdGlvbkRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIG1pbk1heERhdGUgPSB0aGlzLnJldHVybk1pbkFuZE1heERhdGUob3B0aW9uRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBtaW5NYXhEYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIGNyZWF0ZVN0YXJ0RW5kRGF0ZVJhbmdlKG9wdGlvbkRhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IG1pblN0YXJ0RGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCBcInN0YXJ0RGF0ZVwiKTtcclxuICAgICAgICBsZXQgbWF4RW5kRGF0ZSA9IHRoaXMucmV0dXJuTWluQW5kTWF4RGF0ZShvcHRpb25EYXRhLCBcImVuZERhdGVcIik7XHJcbiAgICAgICAgcmV0dXJuIFttaW5TdGFydERhdGVbMF0sIG1heEVuZERhdGVbMV1dO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE1pbkFuZE1heERhdGVSYW5nZUZvckNhbGVuZGFyKG1pbk1heERhdGU6IGFueVtdLCBwYXJzaW5nRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb05nYkRhdGUobWluTWF4RGF0ZVswXSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgbGV0IGNhbGVuZGFyTWF4RW5hYmxlZERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgIHJldHVybiBbY2FsZW5kYXJNaW5FbmFibGVkRGF0ZSwgY2FsZW5kYXJNYXhFbmFibGVkRGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2VsZWN0ZWREYXRlRm9yQ2FsZW5kYXIobWluTWF4RGF0ZTogYW55W10sIHBhcnNpbmdGb3JtYXQ6IHN0cmluZywgbWluRGF0ZTogTmdiRGF0ZVR5cGUsIG1heERhdGU6IE5nYkRhdGVUeXBlKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkTWluRGF0ZTtcclxuICAgICAgICBsZXQgc2VsZWN0ZWRNYXhEYXRlO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGF0ZU9iaiA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG5cclxuICAgICAgICAgICAgaWYgKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKHNlbGVjdGVkRGF0ZU9iai5mcm9tRGF0ZSwgcGFyc2luZ0Zvcm1hdCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1pbkRhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMF0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0ZWREYXRlT2JqLnRvRGF0ZS5pc0FmdGVyKG1pbk1heERhdGVbMV0pKSB7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZE1heERhdGUgPSB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0VG9OZ2JEYXRlKG1pbk1heERhdGVbMV0sIHBhcnNpbmdGb3JtYXQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvTmdiRGF0ZShzZWxlY3RlZERhdGVPYmoudG9EYXRlLCBwYXJzaW5nRm9ybWF0KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkTWluRGF0ZSA9IGNsb25lRGVlcChtaW5EYXRlKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRNYXhEYXRlID0gY2xvbmVEZWVwKG1heERhdGUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIFtzZWxlY3RlZE1pbkRhdGUsIHNlbGVjdGVkTWF4RGF0ZV07XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0UHJldmlvdXNTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIob3B0aW9uRGF0YTogYW55W10pIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZERhdGU6IHsgZnJvbURhdGU6IGFueTsgdG9EYXRlOiBhbnkgfSA9IHsgZnJvbURhdGU6IG51bGwsIHRvRGF0ZTogbnVsbCB9O1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZERhdGUgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLnNldEluaXRpYWxWYWx1ZU1hcEZvckRhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2VsZWN0ZWREYXRlID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KHRoaXMuc2VsZWN0ZWRSYWRpbyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gcHJldmlvdXNTZWxlY3RlZERhdGU7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yRGF0ZUZpbHRlcihvcHRpb25EYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBtaW5NYXhEYXRlID0gdGhpcy5jcmVhdGVSYW5nZUZvclRoZURhdGVGaWx0ZXIob3B0aW9uRGF0YSk7XHJcblxyXG4gICAgICAgIGxldCBzZWxlY3RlZERhdGUgPSB7IGZyb21EYXRlOiBtaW5NYXhEYXRlWzBdLCB0b0RhdGU6IG1pbk1heERhdGVbMV0gfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzZWxlY3RlZERhdGUpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEN1cnJlbnRTZWxlY3RlZERhdGVzRm9yQ2FsZW5kYXIoY3VycmVudFNlbGVjdGVkRGF0ZTogYW55LCBtaW5EYXRlOiBOZ2JEYXRlVHlwZSwgbWF4RGF0ZTogTmdiRGF0ZVR5cGUpIHtcclxuICAgICAgICBsZXQgZnJvbURhdGUgPSB7XHJcbiAgICAgICAgICAgIHllYXI6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUueWVhcixcclxuICAgICAgICAgICAgbW9udGg6IGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZS5kYXksXHJcbiAgICAgICAgfTtcclxuICAgICAgICBsZXQgdG9EYXRlID0ge1xyXG4gICAgICAgICAgICB5ZWFyOiBjdXJyZW50U2VsZWN0ZWREYXRlLnRvRGF0ZS55ZWFyLFxyXG4gICAgICAgICAgICBtb250aDogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUubW9udGgsXHJcbiAgICAgICAgICAgIGRheTogY3VycmVudFNlbGVjdGVkRGF0ZS50b0RhdGUuZGF5LFxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGlmIChpc0VxdWFsKG1pbkRhdGUsIGZyb21EYXRlKSAmJiBpc0VxdWFsKG1heERhdGUsIHRvRGF0ZSkgJiYgdGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgY3VycmVudFNlbGVjdGVkRGF0ZSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUuZnJvbURhdGUgPSBkYXlqcyhcclxuICAgICAgICAgICAgICAgIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnROZ2JEYXRlVG9Nb21lbnQoY3VycmVudFNlbGVjdGVkRGF0ZS5mcm9tRGF0ZSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlID0gZGF5anMoXHJcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5jb252ZXJ0TmdiRGF0ZVRvTW9tZW50KGN1cnJlbnRTZWxlY3RlZERhdGUudG9EYXRlKSxcclxuICAgICAgICAgICAgKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBjdXJyZW50U2VsZWN0ZWREYXRlO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U0xJREVSPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG5cclxuICAgIGdldFNsaWRlclRyYW5zbGF0ZUZ1bmNWYWwoaGVhZGVyOiBzdHJpbmcsIGN1cnJlbmN5U2V0OiBTZXQ8c3RyaW5nPikge1xyXG4gICAgICAgIGxldCB0cmFuc2xhdGVGdW5jO1xyXG5cclxuICAgICAgICBpZiAoY3VycmVuY3lTZXQuaGFzKGhlYWRlcikpIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9IFwiY3VycmVuY3lcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKGhlYWRlciA9PSBcInBvc3RlZEF1ZFBlcmNlbnRcIiB8fCBoZWFkZXIgPT0gXCJwYXJlbnRSb3dTaGFyZXNcIiB8fCBoZWFkZXIgPT0gXCJwYXJlbnRSb3dQdXRQZXJjZW50XCIpIHtcclxuICAgICAgICAgICAgdHJhbnNsYXRlRnVuYyA9IFwicGVyY2VudFwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRyYW5zbGF0ZUZ1bmMgPSBcIm5vcm1hbFwiO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUZ1bmM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U2xpZGVyT3B0aW9ucyhvcHRpb25zRGF0YTogYW55W10sIHRyYW5zbGF0ZUZ1bmM6IHN0cmluZywgaGVhZGVyOiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgbWluVmFsdWUgPSB0aGlzLnJldHVybk1heEFuZE1pblZhbHVlKG9wdGlvbnNEYXRhLCBoZWFkZXIsIHRydWUpO1xyXG4gICAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUob3B0aW9uc0RhdGEsIGhlYWRlciwgZmFsc2UpO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0gdGhpcy5zZXRPcHRpb25WYWx1ZXMobWluVmFsdWUsIG1heFZhbHVlKTtcclxuXHJcbiAgICAgICAgaWYgKHRyYW5zbGF0ZUZ1bmMgPT09IFwibm9ybWFsXCIpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMubm9ybWFsVHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGVGdW5jID09PSBcInBlcmNlbnRcIikge1xyXG4gICAgICAgICAgICBvYmoudHJhbnNsYXRlID0gdGhpcy5wZXJjZW50VHJhbnNsYXRlRnVuY3Rpb247XHJcbiAgICAgICAgfSBlbHNlIGlmICh0cmFuc2xhdGVGdW5jID09PSBcImN1cnJlbmN5XCIpIHtcclxuICAgICAgICAgICAgb2JqLnRyYW5zbGF0ZSA9IHRoaXMuY3VycmVuY3lUcmFuc2xhdGVGdW5jdGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvYmo7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0U2VsZWN0ZWRSYW5nZUZvclNsaWRlcihoZWFkZXI6IHN0cmluZywgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgICAgIGxldCBzbGlkZXJNaW5WYWx1ZTtcclxuICAgICAgICBsZXQgc2xpZGVyTWF4VmFsdWU7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBsZXQgc2VsZWN0ZWRPYmogPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQoaGVhZGVyKTtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBzZWxlY3RlZE9iai5taW4gPCBvcHRpb25zLmZsb29yID8gb3B0aW9ucy5mbG9vciA6IHNlbGVjdGVkT2JqLm1pbjtcclxuICAgICAgICAgICAgc2xpZGVyTWF4VmFsdWUgPSBzZWxlY3RlZE9iai5tYXggPCBvcHRpb25zLmNlaWwgPyBzZWxlY3RlZE9iai5tYXggOiBvcHRpb25zLmNlaWw7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2xpZGVyTWluVmFsdWUgPSBvcHRpb25zLmZsb29yO1xyXG4gICAgICAgICAgICBzbGlkZXJNYXhWYWx1ZSA9IG9wdGlvbnMuY2VpbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2xpZGVyTWluVmFsdWUsIHNsaWRlck1heFZhbHVlXTtcclxuICAgIH1cclxuXHJcbiAgICBpc1ZhbHVlSW5SYW5nZShvcHRpb25zOiBPcHRpb25zLCB2YWw6IG51bWJlcikge1xyXG4gICAgICAgIHJldHVybiBvcHRpb25zLmZsb29yIDw9IHZhbCAmJiB2YWwgPD0gb3B0aW9ucy5jZWlsO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFByZXZpb3VzU2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihjbG9uZWREYXRhOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCBwcmV2aW91c1NsaWRlckRhdGE6IHsgbWluOiBhbnk7IG1heDogYW55IH0gPSB7IG1pbjogXCJcIiwgbWF4OiBcIlwiIH07XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVNYXBGb3JTbGlkZXJGaWx0ZXIoY2xvbmVkRGF0YSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5pdGlhbFZhbHVlTWFwLmhhcyh0aGlzLnNlbGVjdGVkUmFkaW8pKSB7XHJcbiAgICAgICAgICAgIHByZXZpb3VzU2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGEpO1xyXG4gICAgICAgICAgICBwcmV2aW91c1NsaWRlckRhdGEgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NsaWRlckRhdGE7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0SW5pdGlhbFZhbHVlTWFwRm9yU2xpZGVyRmlsdGVyKGNsb25lZERhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IG1pblZhbHVlID0gdGhpcy5yZXR1cm5NYXhBbmRNaW5WYWx1ZShjbG9uZWREYXRhLCB0aGlzLnNlbGVjdGVkUmFkaW8sIHRydWUpO1xyXG4gICAgICAgIGxldCBtYXhWYWx1ZSA9IHRoaXMucmV0dXJuTWF4QW5kTWluVmFsdWUoY2xvbmVkRGF0YSwgdGhpcy5zZWxlY3RlZFJhZGlvLCBmYWxzZSk7XHJcbiAgICAgICAgbGV0IHNsaWRlckRhdGEgPSB7IG1pbjogbWluVmFsdWUsIG1heDogbWF4VmFsdWUgfTtcclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQodGhpcy5zZWxlY3RlZFJhZGlvLCBzbGlkZXJEYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRWYWx1ZUZvclNsaWRlcihtaW5FbnRlcmVkVmFsOiBudW1iZXIsIG1heEVudGVyZWRWYWw6IG51bWJlciwgb3B0aW9uczogT3B0aW9ucykge1xyXG4gICAgICAgIGxldCBjdXJyZW50U2xpZGVyRGF0YTogeyBtaW46IGFueTsgbWF4OiBhbnkgfSA9IHsgbWluOiBudWxsLCBtYXg6IG51bGwgfTtcclxuICAgICAgICBjdXJyZW50U2xpZGVyRGF0YS5tYXggPSBtYXhFbnRlcmVkVmFsO1xyXG4gICAgICAgIGN1cnJlbnRTbGlkZXJEYXRhLm1pbiA9IG1pbkVudGVyZWRWYWw7XHJcblxyXG4gICAgICAgIGlmIChcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWluID09IG9wdGlvbnMuZmxvb3IgJiZcclxuICAgICAgICAgICAgY3VycmVudFNsaWRlckRhdGEubWF4ID09IG9wdGlvbnMuY2VpbCAmJlxyXG4gICAgICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKVxyXG4gICAgICAgICkge1xyXG4gICAgICAgICAgICBjdXJyZW50U2xpZGVyRGF0YSA9IHRoaXMuaW5pdGlhbFZhbHVlTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTbGlkZXJEYXRhO1xyXG4gICAgfVxyXG5cclxuICAgIC8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1USU1FPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG4gICAgZ2V0U2VsZWN0ZWRUaW1lUmFuZ2UoaGVhZGVyOiBzdHJpbmcsIGNsb25lZERhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGVkRnJvbVRpbWU6IGFueVtdO1xyXG4gICAgICAgIGxldCBzZWxlY3RlZFRvVGltZTogYW55W107XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXMoaGVhZGVyKSkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcikuZnJvbVRpbWU7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGhlYWRlcikudG9UaW1lO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlTWFwRm9yVGltZUZpbHRlcihjbG9uZWREYXRhLCBoZWFkZXIpO1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGhlYWRlcikuZnJvbVRpbWU7XHJcbiAgICAgICAgICAgIHNlbGVjdGVkVG9UaW1lID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGhlYWRlcikudG9UaW1lO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGVkRnJvbVRpbWUgIT0gdW5kZWZpbmVkIHx8IHNlbGVjdGVkVG9UaW1lICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gQW5uYURhdGVUaW1lRm9ybWF0U2VydmljZS5mb3JtYXRUb1R3ZWx2ZUhycyhzZWxlY3RlZEZyb21UaW1lLCB0cnVlKTtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUb1RpbWUgPSBBbm5hRGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmZvcm1hdFRvVHdlbHZlSHJzKHNlbGVjdGVkVG9UaW1lLCB0cnVlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBzZWxlY3RlZEZyb21UaW1lID0gW1wiLVwiLCBcIi1cIiwgXCItXCJdO1xyXG4gICAgICAgICAgICBzZWxlY3RlZFRvVGltZSA9IFtcIi1cIiwgXCItXCIsIFwiLVwiXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBbc2VsZWN0ZWRGcm9tVGltZSwgc2VsZWN0ZWRUb1RpbWVdO1xyXG4gICAgfVxyXG5cclxuICAgIHNldEluaXRpYWxWYWx1ZU1hcEZvclRpbWVGaWx0ZXIoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5zZXRJbml0aWFsVmFsdWVGb3JTdGFydEFuZEVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRPckVuZFRpbWVSYW5nZShjbG9uZWREYXRhLCBrZXkpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvL3VzZSBmb3IgZmlsdGVyIHdoZXJlIHdlIGhhdmUgc3RhcnQgYW5kIGVuZCB0aW1lIHJhbmdlIGluIG9uZSBmaWx0ZXJcclxuICAgIC8vc3RhcnRFbmRUaW1lOiBbXCI2IC0gN0FcIiwgXCIwNjogMDAgOiAwMFwiICwgXCIwNzowMDowMFwiXVxyXG4gICAgc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRBbmRFbmRUaW1lUmFuZ2UoY2xvbmVkRGF0YTogYW55W10sIGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVNdWx0aSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldWzBdID09IFwiPG11bHRpPlwiKSAhPSAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVplcm8gPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSA9PSBcIjBcIikgIT0gLTE7XHJcbiAgICAgICAgbGV0IGluY2x1ZGVUaW1lUmFuZ2UgPSBjbG9uZWREYXRhLmZpbmRJbmRleCgob2JqKSA9PiBvYmpba2V5XVswXSAhPSBcIjBcIiAmJiBvYmpba2V5XVswXSAhPSBcIjxtdWx0aT5cIikgIT0gLTE7XHJcblxyXG4gICAgICAgIGxldCBmaWx0ZXJlZFN0YXJ0VGltZSA9IGNsb25lZERhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGwsIFwiMFwiLCBcIjxtdWx0aT5cIl0uaW5jbHVkZXMob2JqW1wic3RhcnRUaW1lXCJdKSk7XHJcbiAgICAgICAgbGV0IGZpbHRlcmVkRW5kVGltZSA9IGNsb25lZERhdGEuZmlsdGVyKChvYmopID0+ICFbXCJcIiwgXCItXCIsIG51bGwsIFwiMFwiLCBcIjxtdWx0aT5cIl0uaW5jbHVkZXMob2JqW1wiZW5kVGltZVwiXSkpO1xyXG5cclxuICAgICAgICBsZXQgc3RhcnRUaW1lQXJyID0gbWFwKGZpbHRlcmVkU3RhcnRUaW1lLCBcInN0YXJ0VGltZVwiKTtcclxuICAgICAgICBsZXQgZW5kVGltZUFyciA9IG1hcChmaWx0ZXJlZEVuZFRpbWUsIFwiZW5kVGltZVwiKTtcclxuXHJcbiAgICAgICAgc3RhcnRUaW1lQXJyLnNvcnQoKGEsIGIpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLnNvcnRCeVRpbWVBc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGVuZFRpbWVBcnIuc29ydCgoYSwgYikgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2Uuc29ydEJ5VGltZURlc2NlbmRpbmcoYSwgYik7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGxldCBvYmogPSB7XHJcbiAgICAgICAgICAgIGZyb21UaW1lOiBzdGFydFRpbWVBcnJbMF0sXHJcbiAgICAgICAgICAgIHRvVGltZTogZW5kVGltZUFyclswXSxcclxuICAgICAgICAgICAgaW5jbHVkZU11bHRpOiBpbmNsdWRlTXVsdGksXHJcbiAgICAgICAgICAgIGluY2x1ZGVaZXJvOiBpbmNsdWRlWmVybyxcclxuICAgICAgICAgICAgaW5jbHVkZVRpbWVSYW5nZTogaW5jbHVkZVRpbWVSYW5nZSxcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmluaXRpYWxWYWx1ZU1hcC5zZXQoa2V5LCBvYmopO1xyXG4gICAgfVxyXG5cclxuICAgIC8vdXNlIGZvciB0aGUgZmlsdGVycyB3aGVyZSB3ZSBoYXZlIGRpZmZlcmVudCBmaWx0ZXIgZm9yIHN0YXJ0IGFuZCBlbmQgdGltZVxyXG4gICAgLy9zdGFydFRpbWU6IFwiMDY6MDA6MDBcIlxyXG4gICAgc2V0SW5pdGlhbFZhbHVlRm9yU3RhcnRPckVuZFRpbWVSYW5nZShjbG9uZWREYXRhOiBhbnlbXSwga2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBsZXQgaW5jbHVkZU11bHRpID0gY2xvbmVkRGF0YS5maW5kSW5kZXgoKG9iaikgPT4gb2JqW2tleV0gPT0gXCI8bXVsdGk+XCIpICE9IC0xO1xyXG4gICAgICAgIGxldCBpbmNsdWRlWmVybyA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldID09IFwiMFwiKSAhPSAtMTtcclxuICAgICAgICBsZXQgaW5jbHVkZVRpbWVSYW5nZSA9IGNsb25lZERhdGEuZmluZEluZGV4KChvYmopID0+IG9ialtrZXldICE9IFwiMFwiICYmIG9ialtrZXldICE9IFwiPG11bHRpPlwiKSAhPSAtMTtcclxuXHJcbiAgICAgICAgbGV0IGRhdGEgPSBjbG9uZWREYXRhLmZpbHRlcigob2JqKSA9PiAhW1wiXCIsIFwiLVwiLCBudWxsLCBcIjBcIiwgXCI8bXVsdGk+XCJdLmluY2x1ZGVzKG9ialtrZXldKSk7XHJcblxyXG4gICAgICAgIGxldCB0aW1lQXJyID0gbWFwKGRhdGEsIGtleSk7XHJcbiAgICAgICAgdGltZUFyci5zb3J0KChhLCBiKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGVUaW1lRm9ybWF0U2VydmljZS5zb3J0QnlUaW1lQXNjZW5kaW5nKGEsIGIpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogdGltZUFyclswXSxcclxuICAgICAgICAgICAgdG9UaW1lOiB0aW1lQXJyW3RpbWVBcnIubGVuZ3RoIC0gMV0sXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWVNYXAuc2V0KGtleSwgb2JqKTtcclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3RVbnNlbGVjdFRpbWVGaWx0ZXJDaGVja2JveChrZXk6IHN0cmluZywgb3B0aW9uc0RhdGE6IGFueVtdKSB7XHJcbiAgICAgICAgbGV0IHNob3dNdWx0aVRpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93WmVyb1RpbWVDaGVja2JveCA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzaG93RW50ZXJUaW1lQ2hlY2tib3ggPSBmYWxzZTtcclxuICAgICAgICBsZXQgbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IHplcm9UaW1lQ2hlY2tib3hDaGVja2VkID0gZmFsc2U7XHJcbiAgICAgICAgbGV0IGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZCA9IGZhbHNlO1xyXG5cclxuICAgICAgICBsZXQgc2VsZWN0ZWRUaW1lT2JqO1xyXG5cclxuICAgICAgICBpZiAodGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuaGFzKGtleSkpIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy50b29sdGlwU2VsZWN0ZWRNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgc2VsZWN0ZWRUaW1lT2JqID0gdGhpcy5pbml0aWFsVmFsdWVNYXAuZ2V0KGtleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgdGltZUFycjogc3RyaW5nW107XHJcbiAgICAgICAgaWYgKGtleSA9PSBcInN0YXJ0RW5kVGltZVwiIHx8IGtleSA9PSBcIlRpbWVCYW5kXCIpIHtcclxuICAgICAgICAgICAgdGltZUFyciA9IG9wdGlvbnNEYXRhLm1hcCgoaXRlbSkgPT4gaXRlbVtrZXldWzBdKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aW1lQXJyID0gb3B0aW9uc0RhdGEubWFwKChpdGVtKSA9PiBpdGVtW2tleV0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRpbWVBcnIuZmluZEluZGV4KCh2YWwpID0+IHZhbCA9PSBcIjBcIikgIT0gLTEpIHtcclxuICAgICAgICAgICAgc2hvd1plcm9UaW1lQ2hlY2tib3ggPSB0cnVlO1xyXG4gICAgICAgICAgICB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iai5pbmNsdWRlWmVybztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh0aW1lQXJyLmZpbmRJbmRleCgodmFsKSA9PiB2YWwgPT0gXCI8bXVsdGk+XCIpICE9IC0xKSB7XHJcbiAgICAgICAgICAgIHNob3dNdWx0aVRpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZCA9IHNlbGVjdGVkVGltZU9iai5pbmNsdWRlTXVsdGk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2hvd1plcm9UaW1lQ2hlY2tib3ggfHwgc2hvd011bHRpVGltZUNoZWNrYm94KSB7XHJcbiAgICAgICAgICAgIHNob3dFbnRlclRpbWVDaGVja2JveCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGltZUFyci5maW5kSW5kZXgoKHZhbCkgPT4gdmFsICE9IFwiPG11bHRpPlwiICYmIHZhbCAhPSBcIjBcIikgIT0gLTEpIHtcclxuICAgICAgICAgICAgZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkID0gc2VsZWN0ZWRUaW1lT2JqPy5pbmNsdWRlVGltZVJhbmdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgc2hvd011bHRpVGltZUNoZWNrYm94OiBzaG93TXVsdGlUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIHNob3daZXJvVGltZUNoZWNrYm94OiBzaG93WmVyb1RpbWVDaGVja2JveCxcclxuICAgICAgICAgICAgc2hvd0VudGVyVGltZUNoZWNrYm94OiBzaG93RW50ZXJUaW1lQ2hlY2tib3gsXHJcbiAgICAgICAgICAgIG11bHRpVGltZUNoZWNrYm94Q2hlY2tlZDogbXVsdGlUaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgICAgICB6ZXJvVGltZUNoZWNrYm94Q2hlY2tlZDogemVyb1RpbWVDaGVja2JveENoZWNrZWQsXHJcbiAgICAgICAgICAgIGVudGVyVGltZUNoZWNrYm94Q2hlY2tlZDogZW50ZXJUaW1lQ2hlY2tib3hDaGVja2VkLFxyXG4gICAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgY2hlY2tJZlN0YXJ0VGltZUlzQWZ0ZXJFbmRUaW1lKHN0YXJ0VGltZTogc3RyaW5nW10sIGVuZFRpbWU6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgbGV0IHRpbWVGb3JtYXQgPSBcIkhIOm1tOnNzXCI7XHJcblxyXG4gICAgICAgIGxldCBzdGFydFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgc3RhcnRUaW1lWzBdICsgXCI6XCIgKyBzdGFydFRpbWVbMV0gKyBcIiBcIiArIHN0YXJ0VGltZVsyXSxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBzdGFydFRpbWUyNEhyRm9ybWF0ID0gc3RhcnRUaW1lMjRIckZvcm1hdEFyclswXSArIFwiOlwiICsgc3RhcnRUaW1lMjRIckZvcm1hdEFyclsxXSArIFwiOjAwXCI7XHJcbiAgICAgICAgbGV0IGVuZFRpbWUyNEhyRm9ybWF0QXJyID0gdGhpcy5kYXRlVGltZUZvcm1hdFNlcnZpY2UuY29udmVydFRvdHdlbnR5Rm91ckhyc0Zvcm1hdChcclxuICAgICAgICAgICAgZW5kVGltZVswXSArIFwiOlwiICsgZW5kVGltZVsxXSArIFwiIFwiICsgZW5kVGltZVsyXSxcclxuICAgICAgICAgICAgdHJ1ZSxcclxuICAgICAgICApO1xyXG4gICAgICAgIGxldCBlbmRUaW1lMjRIckZvcm1hdCA9IGVuZFRpbWUyNEhyRm9ybWF0QXJyWzBdICsgXCI6XCIgKyBlbmRUaW1lMjRIckZvcm1hdEFyclsxXSArIFwiOjAwXCI7XHJcbiAgICAgICAgcmV0dXJuIGRheWpzKHN0YXJ0VGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpLmlzQWZ0ZXIoZGF5anMoZW5kVGltZTI0SHJGb3JtYXQsIHRpbWVGb3JtYXQpKTtcclxuICAgIH1cclxuXHJcbiAgICBnZXRQcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcigpIHtcclxuICAgICAgICBsZXQgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnRvb2x0aXBTZWxlY3RlZE1hcC5oYXModGhpcy5zZWxlY3RlZFJhZGlvKSkge1xyXG4gICAgICAgICAgICBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlciA9IHRoaXMudG9vbHRpcFNlbGVjdGVkTWFwLmdldCh0aGlzLnNlbGVjdGVkUmFkaW8pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbml0aWFsVmFsdWVNYXAuaGFzKHRoaXMuc2VsZWN0ZWRSYWRpbykpIHtcclxuICAgICAgICAgICAgcHJldmlvdXNTZWxlY3RlZFRpbWVGaWx0ZXIgPSB0aGlzLmluaXRpYWxWYWx1ZU1hcC5nZXQodGhpcy5zZWxlY3RlZFJhZGlvKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBwcmV2aW91c1NlbGVjdGVkVGltZUZpbHRlcjtcclxuICAgIH1cclxuXHJcbiAgICBnZXRDdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyKFxyXG4gICAgICAgIHN0YXJ0VGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgZW5kVGltZTogc3RyaW5nW10sXHJcbiAgICAgICAgaW5jbHVkZU11bHRpOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVaZXJvOiBib29sZWFuLFxyXG4gICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGJvb2xlYW4sXHJcbiAgICApIHtcclxuICAgICAgICBsZXQgY3VycmVudFNlbGVjdGVkVGltZUZpbHRlcjtcclxuXHJcbiAgICAgICAgbGV0IGZyb21UaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIHN0YXJ0VGltZVswXSArIFwiOlwiICsgc3RhcnRUaW1lWzFdICsgXCIgXCIgKyBzdGFydFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgZnJvbVRpbWUyNEhyRm9ybWF0ID0gZnJvbVRpbWUyNEhyRm9ybWF0QXJyWzBdICsgXCI6XCIgKyBmcm9tVGltZTI0SHJGb3JtYXRBcnJbMV0gKyBcIjowMFwiO1xyXG5cclxuICAgICAgICBsZXQgdG9UaW1lMjRIckZvcm1hdEFyciA9IHRoaXMuZGF0ZVRpbWVGb3JtYXRTZXJ2aWNlLmNvbnZlcnRUb3R3ZW50eUZvdXJIcnNGb3JtYXQoXHJcbiAgICAgICAgICAgIGVuZFRpbWVbMF0gKyBcIjpcIiArIGVuZFRpbWVbMV0gKyBcIiBcIiArIGVuZFRpbWVbMl0sXHJcbiAgICAgICAgICAgIHRydWUsXHJcbiAgICAgICAgKTtcclxuICAgICAgICBsZXQgdG9UaW1lMjRIckZvcm1hdCA9IHRvVGltZTI0SHJGb3JtYXRBcnJbMF0gKyBcIjpcIiArIHRvVGltZTI0SHJGb3JtYXRBcnJbMV0gKyBcIjowMFwiO1xyXG5cclxuICAgICAgICBjdXJyZW50U2VsZWN0ZWRUaW1lRmlsdGVyID0ge1xyXG4gICAgICAgICAgICBmcm9tVGltZTogZnJvbVRpbWUyNEhyRm9ybWF0LFxyXG4gICAgICAgICAgICB0b1RpbWU6IHRvVGltZTI0SHJGb3JtYXQsXHJcbiAgICAgICAgICAgIGluY2x1ZGVNdWx0aTogaW5jbHVkZU11bHRpLFxyXG4gICAgICAgICAgICBpbmNsdWRlWmVybzogaW5jbHVkZVplcm8sXHJcbiAgICAgICAgICAgIGluY2x1ZGVUaW1lUmFuZ2U6IGluY2x1ZGVUaW1lUmFuZ2UsXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRTZWxlY3RlZFRpbWVGaWx0ZXI7XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50SG91cklucHV0KGFycjogYW55W10pIHtcclxuICAgICAgICBpZiAoYXJyWzBdID09IFwiXCIpIHtcclxuICAgICAgICAgICAgYXJyWzBdID0gMTtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclswXSkgPCAxMikge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSBwYXJzZUludChhcnJbMF0pICsgMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBkZWNyZW1lbnRIb3VySW5wdXQoYXJyOiBhbnlbXSkge1xyXG4gICAgICAgIGlmIChhcnJbMF0gPT0gXCJcIikge1xyXG4gICAgICAgICAgICBhcnJbMF0gPSAxMjtcclxuICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KGFyclswXSkgPiAxKSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IHBhcnNlSW50KGFyclswXSkgLSAxO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGFyclswXSA9IDEyO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpbmNyZW1lbnRNaW51dGVJbnB1dChhcnI6IGFueVtdKSB7XHJcbiAgICAgICAgLy8gaW5jcmVtZW50IHRvIG5lYXJlc3QgcHJvcGVyIGludGVydmFsKDE1LDMwLDQ1KVxyXG4gICAgICAgIGxldCBtaW4gPSBwYXJzZUludChhcnJbMV0pO1xyXG4gICAgICAgIGlmIChtaW4gPD0gMTQpIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDE1ICYmIG1pbiA8PSAyOSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPj0gMzAgJiYgbWluIDw9IDQ0KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiNDVcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSA0NSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjAwXCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGRlY3JlbWVudE1pbnV0ZUlucHV0KGFycjogYW55KSB7XHJcbiAgICAgICAgbGV0IG1pbiA9IHBhcnNlSW50KGFyclsxXSk7XHJcbiAgICAgICAgaWYgKG1pbiA+IDAgJiYgbWluIDw9IDE1KSB7XHJcbiAgICAgICAgICAgIGFyclsxXSA9IFwiMDBcIjtcclxuICAgICAgICB9IGVsc2UgaWYgKG1pbiA+PSAxNiAmJiBtaW4gPD0gMzApIHtcclxuICAgICAgICAgICAgYXJyWzFdID0gXCIxNVwiO1xyXG4gICAgICAgIH0gZWxzZSBpZiAobWluID49IDMxICYmIG1pbiA8PSA0NSkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjMwXCI7XHJcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiA0NSB8fCBtaW4gPT0gMCkge1xyXG4gICAgICAgICAgICBhcnJbMV0gPSBcIjQ1XCI7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGluY3JlbWVudE9yRGVjcmVtZW50SG91cihpbmNyZW1lbnQ6IGJvb2xlYW4sIHRpbWU6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgaWYgKGluY3JlbWVudCkge1xyXG4gICAgICAgICAgICB0aGlzLmluY3JlbWVudEhvdXJJbnB1dCh0aW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudEhvdXJJbnB1dCh0aW1lKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaW5jcmVtZW50T3JEZWNyZW1lbnRNaW4oaW5jcmVtZW50OiBib29sZWFuLCB0aW1lOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIGlmIChpbmNyZW1lbnQpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmNyZW1lbnRNaW51dGVJbnB1dCh0aW1lKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICB0aGlzLmRlY3JlbWVudE1pbnV0ZUlucHV0KHRpbWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpc0hvdXJWYWx1ZUludmFsaWQoaHI6IHN0cmluZykge1xyXG4gICAgICAgIHJldHVybiBoci5sZW5ndGggPT0gMCB8fCAhK2hyIHx8IDEgPiBwYXJzZUludChocikgfHwgcGFyc2VJbnQoaHIpID4gMTIgfHwgaHIuaW5jbHVkZXMoXCIuXCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlzTWludXRlVmFsdWVJbnZhbGlkKG1pbjogc3RyaW5nKSB7XHJcbiAgICAgICAgcmV0dXJuIChcclxuICAgICAgICAgICAgbWluLmxlbmd0aCAhPSAyIHx8ICghK21pbiAmJiBtaW4gIT0gXCIwMFwiKSB8fCAwID4gcGFyc2VJbnQobWluKSB8fCBwYXJzZUludChtaW4pID4gNTkgfHwgbWluLmluY2x1ZGVzKFwiLlwiKVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09U09SVD09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0vL1xyXG4gICAgdXBkYXRlU29ydE1hcCh0ZW1wU29ydE9yZGVyOiBTb3J0VHlwZSwgdGFibGVEYXRhOiBhbnlbXSwgaXNMdXJBbmRDc3JDb21wb25lbnQ6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmFubmFTb3J0U2VydmljZS5jb2x1bW5Tb3J0U3RhdGUgPSBuZXcgTWFwKCk7XHJcbiAgICAgICAgdGhpcy5hbm5hU29ydFNlcnZpY2UuY29sdW1uU29ydFN0YXRlLnNldCh0aGlzLnNlbGVjdGVkUmFkaW8sIHRlbXBTb3J0T3JkZXIpO1xyXG4gICAgICAgIGxldCBzb3J0ZWRUYWJsZURhdGEgPSB0aGlzLmFubmFTb3J0U2VydmljZS5hcHBseVNvcnRpbmcoXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRSYWRpbyxcclxuICAgICAgICAgICAgdGVtcFNvcnRPcmRlcixcclxuICAgICAgICAgICAgdGFibGVEYXRhLFxyXG4gICAgICAgICAgICBpc0x1ckFuZENzckNvbXBvbmVudCxcclxuICAgICAgICApO1xyXG4gICAgICAgIHJldHVybiBzb3J0ZWRUYWJsZURhdGE7XHJcbiAgICB9XHJcbn1cclxuIl19