@sabstravtech/obtservices 0.0.22051001 → 0.1.6161600

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 (166) hide show
  1. package/angular/components/basket-panel.d.ts +1 -0
  2. package/angular/fetchers.d.ts +5 -0
  3. package/angular/lib/vendor/fetchers/get-companies.fetcher.d.ts +7 -0
  4. package/angular/lib/vendor/fetchers/get-company.fetcher.d.ts +7 -0
  5. package/angular/lib/vendor/fetchers/get-office.fetcher.d.ts +7 -0
  6. package/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +7 -0
  7. package/angular/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +7 -0
  8. package/angular/lib/vendor/services/enterprise-basket.service.d.ts +4 -3
  9. package/angular/lib/vendor/services/logon.service.d.ts +2 -1
  10. package/angular/lib/vendor/services/user.service.d.ts +9 -3
  11. package/angular/lib/vendor/types/graphql.angular.types.d.ts +614 -550
  12. package/angular/lib/vendor/updaters/create-guest-updater.d.ts +6 -0
  13. package/angular/sabstravtech-obtservices-angular.metadata.json +1 -1
  14. package/angular/updaters.d.ts +1 -0
  15. package/base/fetchers.d.ts +5 -0
  16. package/base/lib/vendor/classes/base-enterprise.d.ts +7 -1
  17. package/base/lib/vendor/classes/basket-info-mi-details.impl.d.ts +2 -0
  18. package/base/lib/vendor/classes/bookable-basket.d.ts +2 -0
  19. package/base/lib/vendor/classes/cabhire-enterprise-search.d.ts +9 -4
  20. package/base/lib/vendor/classes/carhire-enterprise-search.d.ts +12 -4
  21. package/base/lib/vendor/classes/eurostar-enterprise-search.d.ts +14 -7
  22. package/base/lib/vendor/classes/fast-track-enterprise-search.d.ts +5 -4
  23. package/base/lib/vendor/classes/flight-enterprise-search.d.ts +16 -5
  24. package/base/lib/vendor/classes/helpers.d.ts +6 -1
  25. package/base/lib/vendor/classes/hotel-enterprise-search.d.ts +10 -3
  26. package/base/lib/vendor/classes/irl-enterprise-search.d.ts +13 -8
  27. package/base/lib/vendor/classes/lounges-enterprise-search.d.ts +5 -4
  28. package/base/lib/vendor/classes/management-info-and-valid.d.ts +3 -3
  29. package/base/lib/vendor/classes/modal-types.enum.d.ts +1 -0
  30. package/base/lib/vendor/classes/parking-enterprise-search.d.ts +5 -4
  31. package/base/lib/vendor/classes/rail-enterprise-search.d.ts +10 -8
  32. package/base/lib/vendor/classes/supplementary-booking-info-impl.d.ts +5 -3
  33. package/base/lib/vendor/classes/user-favourite.enum.d.ts +1 -0
  34. package/base/lib/vendor/fetchers/eurostar-quote.fetcher.d.ts +3 -1
  35. package/base/lib/vendor/fetchers/flight-quote.fetcher.d.ts +1 -0
  36. package/base/lib/vendor/fetchers/get-companies.fetcher.d.ts +21 -0
  37. package/base/lib/vendor/fetchers/get-company.fetcher.d.ts +20 -0
  38. package/base/lib/vendor/fetchers/get-office.fetcher.d.ts +20 -0
  39. package/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.d.ts +21 -0
  40. package/base/lib/vendor/fetchers/get-user-guests.fetcher.d.ts +20 -0
  41. package/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.d.ts +2 -2
  42. package/base/lib/vendor/interfaces/Icabhire-enterprise-search.d.ts +2 -0
  43. package/base/lib/vendor/interfaces/Icarhire-enterprise-search.d.ts +5 -2
  44. package/base/lib/vendor/interfaces/Ienterprise-basket.service.d.ts +8 -6
  45. package/base/lib/vendor/interfaces/Ieurostar-enterprise-search.d.ts +1 -0
  46. package/base/lib/vendor/interfaces/Ifast-track-enterprise-search.d.ts +7 -5
  47. package/base/lib/vendor/interfaces/Iflight-enterprise-search.d.ts +8 -1
  48. package/base/lib/vendor/interfaces/Ihotel-enterprise-search.d.ts +8 -2
  49. package/base/lib/vendor/interfaces/Iirl-enterprise-search.d.ts +8 -7
  50. package/base/lib/vendor/interfaces/Ilounges-enterprise-search.d.ts +1 -0
  51. package/base/lib/vendor/interfaces/Imybookings.service.d.ts +3 -2
  52. package/base/lib/vendor/interfaces/Iparking-enterprise-search.d.ts +1 -0
  53. package/base/lib/vendor/interfaces/Irail-enterprise-search.d.ts +5 -2
  54. package/base/lib/vendor/interfaces/Isearch.service.d.ts +5 -2
  55. package/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.d.ts +3 -2
  56. package/base/lib/vendor/interfaces/Iuser.service.d.ts +11 -3
  57. package/base/lib/vendor/interfaces/car-hire-search-arg.interface.d.ts +2 -3
  58. package/base/lib/vendor/interfaces/rail-basket-item.interface.d.ts +2 -0
  59. package/base/lib/vendor/interfaces/summary-interface.d.ts +6 -0
  60. package/base/lib/vendor/interfaces/user.data.d.ts +1 -0
  61. package/base/lib/vendor/models/traveller.object.d.ts +12 -2
  62. package/base/lib/vendor/services/enterprise-basket.service.d.ts +22 -9
  63. package/base/lib/vendor/services/logon.service.d.ts +5 -1
  64. package/base/lib/vendor/services/my-bookings.service.d.ts +3 -2
  65. package/base/lib/vendor/services/search.service.d.ts +27 -23
  66. package/base/lib/vendor/services/url.service.d.ts +2 -0
  67. package/base/lib/vendor/services/user.service.d.ts +36 -5
  68. package/base/lib/vendor/services/webtoken.service.d.ts +6 -0
  69. package/base/lib/vendor/types/graphql.types.d.ts +581 -549
  70. package/base/lib/vendor/types/types.d.ts +48 -6
  71. package/base/lib/vendor/updaters/create-guest-updater.d.ts +19 -0
  72. package/base/sabstravtech-obtservices-base.d.ts +1 -1
  73. package/base/sabstravtech-obtservices-base.metadata.json +1 -1
  74. package/base/updaters.d.ts +1 -0
  75. package/bundles/sabstravtech-obtservices-angular.umd.js +541 -252
  76. package/bundles/sabstravtech-obtservices-angular.umd.js.map +1 -1
  77. package/bundles/sabstravtech-obtservices-angular.umd.min.js +1 -1
  78. package/bundles/sabstravtech-obtservices-angular.umd.min.js.map +1 -1
  79. package/bundles/sabstravtech-obtservices-base.umd.js +4080 -1471
  80. package/bundles/sabstravtech-obtservices-base.umd.js.map +1 -1
  81. package/bundles/sabstravtech-obtservices-base.umd.min.js +2 -2
  82. package/bundles/sabstravtech-obtservices-base.umd.min.js.map +1 -1
  83. package/esm2015/angular/components/basket-panel.js +16 -7
  84. package/esm2015/angular/fetchers.js +6 -1
  85. package/esm2015/angular/lib/vendor/fetchers/get-companies.fetcher.js +25 -0
  86. package/esm2015/angular/lib/vendor/fetchers/get-company.fetcher.js +25 -0
  87. package/esm2015/angular/lib/vendor/fetchers/get-office.fetcher.js +25 -0
  88. package/esm2015/angular/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +25 -0
  89. package/esm2015/angular/lib/vendor/fetchers/get-user-guests.fetcher.js +25 -0
  90. package/esm2015/angular/lib/vendor/services/enterprise-basket.service.js +24 -21
  91. package/esm2015/angular/lib/vendor/services/http-call.service.js +1 -1
  92. package/esm2015/angular/lib/vendor/services/logon.service.js +8 -5
  93. package/esm2015/angular/lib/vendor/services/search.service.js +1 -1
  94. package/esm2015/angular/lib/vendor/services/ticket-queue.service.js +4 -1
  95. package/esm2015/angular/lib/vendor/services/user.service.js +28 -10
  96. package/esm2015/angular/lib/vendor/services/webtoken.service.js +6 -2
  97. package/esm2015/angular/lib/vendor/types/graphql.angular.types.js +1023 -1220
  98. package/esm2015/angular/lib/vendor/updaters/create-guest-updater.js +22 -0
  99. package/esm2015/angular/updaters.js +2 -1
  100. package/esm2015/base/fetchers.js +6 -1
  101. package/esm2015/base/lib/vendor/classes/base-enterprise.js +12 -3
  102. package/esm2015/base/lib/vendor/classes/basket-info-mi-details.impl.js +14 -1
  103. package/esm2015/base/lib/vendor/classes/bookable-basket.js +27 -8
  104. package/esm2015/base/lib/vendor/classes/cabhire-enterprise-search.js +219 -18
  105. package/esm2015/base/lib/vendor/classes/carhire-enterprise-search.js +235 -67
  106. package/esm2015/base/lib/vendor/classes/eurostar-enterprise-search.js +462 -49
  107. package/esm2015/base/lib/vendor/classes/fast-track-enterprise-search.js +37 -13
  108. package/esm2015/base/lib/vendor/classes/flight-enterprise-search.js +281 -62
  109. package/esm2015/base/lib/vendor/classes/helpers.js +32 -3
  110. package/esm2015/base/lib/vendor/classes/hotel-enterprise-search.js +228 -54
  111. package/esm2015/base/lib/vendor/classes/irl-enterprise-search.js +221 -46
  112. package/esm2015/base/lib/vendor/classes/lounges-enterprise-search.js +101 -14
  113. package/esm2015/base/lib/vendor/classes/management-info-and-valid.js +67 -40
  114. package/esm2015/base/lib/vendor/classes/modal-types.enum.js +2 -1
  115. package/esm2015/base/lib/vendor/classes/parking-enterprise-search.js +146 -11
  116. package/esm2015/base/lib/vendor/classes/rail-enterprise-search.js +210 -25
  117. package/esm2015/base/lib/vendor/classes/supplementary-booking-info-impl.js +58 -4
  118. package/esm2015/base/lib/vendor/classes/user-favourite.enum.js +2 -1
  119. package/esm2015/base/lib/vendor/data/countries.json +484 -242
  120. package/esm2015/base/lib/vendor/fetchers/eurostar-quote.fetcher.js +3 -3
  121. package/esm2015/base/lib/vendor/fetchers/flight-quote.fetcher.js +3 -3
  122. package/esm2015/base/lib/vendor/fetchers/get-companies.fetcher.js +11 -0
  123. package/esm2015/base/lib/vendor/fetchers/get-company.fetcher.js +11 -0
  124. package/esm2015/base/lib/vendor/fetchers/get-office.fetcher.js +11 -0
  125. package/esm2015/base/lib/vendor/fetchers/get-user-default-mi-value.fetcher.js +10 -0
  126. package/esm2015/base/lib/vendor/fetchers/get-user-guests.fetcher.js +11 -0
  127. package/esm2015/base/lib/vendor/fetchers/search-users-can-book-for-fetcher.js +1 -1
  128. package/esm2015/base/lib/vendor/interfaces/Icabhire-enterprise-search.js +1 -1
  129. package/esm2015/base/lib/vendor/interfaces/Icarhire-enterprise-search.js +1 -1
  130. package/esm2015/base/lib/vendor/interfaces/Ienterprise-basket.service.js +1 -1
  131. package/esm2015/base/lib/vendor/interfaces/Ieurostar-enterprise-search.js +1 -1
  132. package/esm2015/base/lib/vendor/interfaces/Ifast-track-enterprise-search.js +1 -1
  133. package/esm2015/base/lib/vendor/interfaces/Iflight-enterprise-search.js +1 -1
  134. package/esm2015/base/lib/vendor/interfaces/Ihotel-enterprise-search.js +2 -1
  135. package/esm2015/base/lib/vendor/interfaces/Iirl-enterprise-search.js +1 -1
  136. package/esm2015/base/lib/vendor/interfaces/Ilounges-enterprise-search.js +1 -1
  137. package/esm2015/base/lib/vendor/interfaces/Imybookings.service.js +1 -1
  138. package/esm2015/base/lib/vendor/interfaces/Iparking-enterprise-search.js +1 -1
  139. package/esm2015/base/lib/vendor/interfaces/Irail-enterprise-search.js +1 -1
  140. package/esm2015/base/lib/vendor/interfaces/Isearch.service.js +1 -1
  141. package/esm2015/base/lib/vendor/interfaces/Isupplementary-booking-info-impl.js +1 -1
  142. package/esm2015/base/lib/vendor/interfaces/Iuser.service.js +1 -1
  143. package/esm2015/base/lib/vendor/interfaces/car-hire-search-arg.interface.js +1 -1
  144. package/esm2015/base/lib/vendor/interfaces/rail-basket-item.interface.js +1 -1
  145. package/esm2015/base/lib/vendor/interfaces/summary-interface.js +1 -1
  146. package/esm2015/base/lib/vendor/interfaces/user.data.js +1 -1
  147. package/esm2015/base/lib/vendor/models/traveller.object.js +21 -3
  148. package/esm2015/base/lib/vendor/services/enterprise-basket.service.js +129 -43
  149. package/esm2015/base/lib/vendor/services/http-call.service.js +1 -1
  150. package/esm2015/base/lib/vendor/services/logon.service.js +40 -3
  151. package/esm2015/base/lib/vendor/services/my-bookings.service.js +3 -2
  152. package/esm2015/base/lib/vendor/services/requires-reason.service.js +14 -10
  153. package/esm2015/base/lib/vendor/services/search.service.js +100 -117
  154. package/esm2015/base/lib/vendor/services/url.service.js +3 -1
  155. package/esm2015/base/lib/vendor/services/user.service.js +90 -12
  156. package/esm2015/base/lib/vendor/services/webtoken.service.js +14 -1
  157. package/esm2015/base/lib/vendor/types/graphql.types.js +21 -2
  158. package/esm2015/base/lib/vendor/types/types.js +32 -14
  159. package/esm2015/base/lib/vendor/updaters/create-guest-updater.js +11 -0
  160. package/esm2015/base/sabstravtech-obtservices-base.js +1 -1
  161. package/esm2015/base/updaters.js +2 -1
  162. package/fesm2015/sabstravtech-obtservices-angular.js +1254 -1332
  163. package/fesm2015/sabstravtech-obtservices-angular.js.map +1 -1
  164. package/fesm2015/sabstravtech-obtservices-base.js +3324 -839
  165. package/fesm2015/sabstravtech-obtservices-base.js.map +1 -1
  166. package/package.json +1 -1
@@ -1,13 +1,13 @@
1
1
  import { __awaiter } from "tslib";
2
2
  import moment from 'moment';
3
3
  import { ServiceType } from '../types/graphql.types';
4
+ import { DifferentInvokdedUserReasons } from '../types/types';
4
5
  import { BaseEnterpriseSearch } from './base-enterprise';
5
6
  export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
6
- constructor(fasttrackFetcher, helpers, basketService, storageService, searchService) {
7
- super(storageService, helpers);
7
+ constructor(fasttrackFetcher, helpers, basketService, storageService, searchService, userService) {
8
+ super(storageService, helpers, searchService, userService);
8
9
  this.fasttrackFetcher = fasttrackFetcher;
9
10
  this.basketService = basketService;
10
- this.searchService = searchService;
11
11
  this.type = ServiceType.FastTrack;
12
12
  this._date = null;
13
13
  this._time = null;
@@ -141,7 +141,7 @@ export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
141
141
  getSearchQuery() {
142
142
  const query = {
143
143
  adults: this.tempParams.adults,
144
- children: this.tempParams.children,
144
+ children: this.tempParams.children ? this.tempParams.children : null,
145
145
  locationCode: this._locationCode,
146
146
  arrivalDatetime: this.tempParams.arrivalDatetime
147
147
  };
@@ -175,6 +175,25 @@ export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
175
175
  });
176
176
  this.searchService.startSearches();
177
177
  }
178
+ updateSearchFromExpiredBasketItem(basketItem) {
179
+ const searchFastTrackQuery = basketItem.searchQuery;
180
+ this.arrivalDatetime = moment(searchFastTrackQuery.arrivalDatetime);
181
+ this.searchService
182
+ .getAirportByCode(searchFastTrackQuery.locationCode)
183
+ .subscribe((airport) => {
184
+ var _a, _b, _c, _d, _e, _f;
185
+ if (airport) {
186
+ this.locationCode = {
187
+ country: (_b = (_a = airport.iataMatch) === null || _a === void 0 ? void 0 : _a.locationDetails) === null || _b === void 0 ? void 0 : _b.country,
188
+ countryCode: (_d = (_c = airport.iataMatch) === null || _c === void 0 ? void 0 : _c.locationDetails) === null || _d === void 0 ? void 0 : _d.countryCode,
189
+ destination: airport.iataMatch.name,
190
+ gateway: airport.iataMatch.iata,
191
+ postcode: (_f = (_e = airport.iataMatch) === null || _e === void 0 ? void 0 : _e.locationDetails) === null || _f === void 0 ? void 0 : _f.postcode,
192
+ terminals: this.searchService.processTerminals(airport.iataMatch.terminals)
193
+ };
194
+ }
195
+ });
196
+ }
178
197
  updateFromPreviousSearches(previousItems) {
179
198
  var _a;
180
199
  console.log('PREPOPULATING LOUNGE FORM');
@@ -207,16 +226,16 @@ export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
207
226
  }, { amount: Number.MAX_SAFE_INTEGER, currencyCode: currency });
208
227
  }
209
228
  addFastTrackToBasket(fasttrackQuote, fasttrackQuery) {
210
- var _a;
229
+ var _a, _b, _c, _d, _e, _f, _g;
211
230
  return __awaiter(this, void 0, void 0, function* () {
212
231
  if (fasttrackQuote.unavailable) {
213
- return Promise.resolve(false);
232
+ return Promise.resolve(DifferentInvokdedUserReasons.cancel);
214
233
  }
215
234
  const intBasket = yield this.basketService.getDefaultBasket();
216
235
  const basket = intBasket === null || intBasket === void 0 ? void 0 : intBasket.subject.value;
217
236
  const termsAndConditions = this.getTermsAndCond(fasttrackQuote);
218
237
  if (basket) {
219
- return this.basketService.addToBasket({
238
+ const whatHappened = yield this.basketService.addToBasket({
220
239
  adults: fasttrackQuery.adults,
221
240
  children: fasttrackQuery.children,
222
241
  basket: basket.id,
@@ -226,17 +245,22 @@ export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
226
245
  locationCode: fasttrackQuote.code,
227
246
  name: fasttrackQuote.name,
228
247
  airportIata: fasttrackQuery === null || fasttrackQuery === void 0 ? void 0 : fasttrackQuery.locationCode,
229
- logo: fasttrackQuote.logo,
230
- terminal: (_a = fasttrackQuote.terminal) === null || _a === void 0 ? void 0 : _a.toString(),
231
- termsAndCond: termsAndConditions
248
+ terminal: (_a = fasttrackQuote.terminal) === null || _a === void 0 ? void 0 : _a.toString()
232
249
  },
233
250
  price: fasttrackQuote.price,
234
251
  currency: fasttrackQuote.currency,
235
252
  searchQuery: fasttrackQuery,
236
- outboundDate: fasttrackQuery.arrivalDatetime.format()
253
+ outboundDate: fasttrackQuery.arrivalDatetime.format(),
254
+ lowestPrice: ((_b = this.cheapestPrice) === null || _b === void 0 ? void 0 : _b.amount) != fasttrackQuote.price || ((_c = this.cheapestPrice) === null || _c === void 0 ? void 0 : _c.currencyCode) != fasttrackQuote.currency ? (_d = this.cheapestPrice) === null || _d === void 0 ? void 0 : _d.amount : null,
255
+ lowestPriceCurrency: ((_e = this.cheapestPrice) === null || _e === void 0 ? void 0 : _e.amount) != fasttrackQuote.price || ((_f = this.cheapestPrice) === null || _f === void 0 ? void 0 : _f.currencyCode) != fasttrackQuote.currency ?
256
+ (_g = this.cheapestPrice) === null || _g === void 0 ? void 0 : _g.currencyCode : null
237
257
  }, intBasket, this.searchService, this.travellers, fasttrackQuote.requiresReason);
258
+ if (whatHappened === DifferentInvokdedUserReasons.research) {
259
+ this.performSearch();
260
+ }
261
+ return whatHappened;
238
262
  }
239
- return Promise.resolve(false); // TODO should this throw an error?
263
+ return DifferentInvokdedUserReasons.cancel;
240
264
  });
241
265
  }
242
266
  getTermsAndCond(fasttrackQuote) {
@@ -293,4 +317,4 @@ export class FastTrackEnterpriseSearch extends BaseEnterpriseSearch {
293
317
  }
294
318
  FastTrackEnterpriseSearch.STORAGE_SESSION_PARAMS = 'search_fasttrack';
295
319
  FastTrackEnterpriseSearch.STORAGE_SESSION_RESULTS = 'results_fasttrack';
296
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC10cmFjay1lbnRlcnByaXNlLXNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9mYXN0LXRyYWNrLWVudGVycHJpc2Utc2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFtQjVCLE9BQU8sRUFRTCxXQUFXLEVBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQVNoQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxNQUFNLE9BQU8seUJBQ1gsU0FBUSxvQkFJUDtJQTBIRCxZQUNVLGdCQUFrRCxFQUMxRCxPQUEyQixFQUNuQixhQUErQyxFQUN2RCxjQUFrQyxFQUMxQixhQUErQztRQUV2RCxLQUFLLENBQUMsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBTnZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0M7UUFFbEQsa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBRS9DLGtCQUFhLEdBQWIsYUFBYSxDQUFrQztRQTFIbEQsU0FBSSxHQUFnQixXQUFXLENBQUMsU0FBUyxDQUFDO1FBdUJ6QyxVQUFLLEdBQWtCLElBQUksQ0FBQztRQVU1QixVQUFLLEdBQVcsSUFBSSxDQUFDO1FBK0VuQix1QkFBa0IsR0FDMUIseUJBQXlCLENBQUMsdUJBQXVCLENBQUM7UUFDMUMsNEJBQXVCLEdBQy9CLHlCQUF5QixDQUFDLHVCQUF1QixDQUFDO1FBVWxELE1BQU0sSUFBSSxHQUdOLGNBQWMsQ0FBQyxjQUFjLENBQy9CLHlCQUF5QixDQUFDLHNCQUFzQixDQUNqRCxJQUFJO1lBQ0gsVUFBVSxFQUFFLEVBQXlCO1lBQ3JDLGtCQUFrQixFQUFFLEVBQXlCO1NBQzlDLENBQUM7UUFDRixJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFD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QUFHLGtCQUFrQixDQUFDO0FBQzVDLGlEQUF1QixHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBCYXNlRmFzdFRyYWNrUXVvdGVGZXRjaGVyLFxyXG4gIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9mYXN0LXRyYWNrLXF1b3RlLmZldGNoZXInO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBGYXN0VHJhY2tGaWx0ZXJzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mYXN0LXRyYWNrLWZpbHRlcnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgRmFzdFRyYWNrVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWZhc3QtdHJhY2stZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVHJhdmVsbGVyIH0gZnJvbSAnLi4vbW9kZWxzL3RyYXZlbGxlci5vYmplY3QnO1xyXG5pbXBvcnQgeyBCYXNlU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdG9yYWdlLnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEFpcnBvcnRSZXN1bHRzLFxyXG4gIEJhc2tldEl0ZW0sXHJcbiAgQ3VycmVuY3lDb2RlLFxyXG4gIEZhc3RUcmFja1F1b3RlLFxyXG4gIFNhdmVSZWNlbnRTZWFyY2hNdXRhdGlvblZhcmlhYmxlcyxcclxuICBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcyxcclxuICBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyxcclxuICBTZXJ2aWNlVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL2dyYXBocWwudHlwZXMnO1xyXG5pbXBvcnQge1xyXG4gIEZhc3RUcmFja1F1b3RlUmVzdWx0LFxyXG4gIEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXksXHJcbiAgTmdiRGF0ZVN0cnVjdCxcclxuICBPQlRBaXJwb3J0RGV0YWlscyxcclxuICBSZWNlbnRTZWFyY2gsXHJcbiAgVGVybWluYWxzVHlwZVxyXG59IGZyb20gJy4uL3R5cGVzL3R5cGVzJztcclxuaW1wb3J0IHsgQmFzZUVudGVycHJpc2VTZWFyY2ggfSBmcm9tICcuL2Jhc2UtZW50ZXJwcmlzZSc7XHJcbmltcG9ydCB7IEJhc2VIZWxwZXJSb3V0aW5lcyB9IGZyb20gJy4vaGVscGVycyc7XHJcblxyXG5leHBvcnQgY2xhc3MgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaDxGVFFfUSBleHRlbmRzIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGU+XHJcbiAgZXh0ZW5kcyBCYXNlRW50ZXJwcmlzZVNlYXJjaDxcclxuICAgIEZhc3RUcmFja1RlbXBQYXJhbXMsXHJcbiAgICBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5LFxyXG4gICAgRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheVxyXG4gID5cclxuICBpbXBsZW1lbnRzIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2hJbnRlcmZhY2Vcclxue1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUEFSQU1TID0gJ3NlYXJjaF9mYXN0dHJhY2snO1xyXG4gIHN0YXRpYyByZWFkb25seSBTVE9SQUdFX1NFU1NJT05fUkVTVUxUUyA9ICdyZXN1bHRzX2Zhc3R0cmFjayc7XHJcbiAgcHVibGljIHR5cGU6IFNlcnZpY2VUeXBlID0gU2VydmljZVR5cGUuRmFzdFRyYWNrO1xyXG5cclxuICBwcml2YXRlIF9sb2NhdGlvbkNvZGU6IHN0cmluZztcclxuICBwcml2YXRlIHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdO1xyXG5cclxuICBnZXQgYWR1bHRzKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBhZHVsdHModmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGNoaWxkcmVuKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmFkdWx0cztcclxuICB9XHJcblxyXG4gIHNldCBjaGlsZHJlbih2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzID0gdmFsdWU7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9kYXRlOiBOZ2JEYXRlU3RydWN0ID0gbnVsbDtcclxuICBnZXQgZGF0ZSgpOiBOZ2JEYXRlU3RydWN0IHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlO1xyXG4gIH1cclxuXHJcbiAgc2V0IGRhdGUodmFsdWU6IE5nYkRhdGVTdHJ1Y3QpIHtcclxuICAgIHRoaXMuX2RhdGUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF90aW1lOiBzdHJpbmcgPSBudWxsO1xyXG4gIGdldCB0aW1lKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5fdGltZTtcclxuICB9XHJcblxyXG4gIHNldCB0aW1lKHZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuX3RpbWUgPSB2YWx1ZTtcclxuICAgIHRoaXMuX3VwZGF0ZURhdGVUaW1lKCk7XHJcbiAgfVxyXG5cclxuICBnZXQgYXJyaXZhbERhdGV0aW1lKCk6IG1vbWVudC5Nb21lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgYXJyaXZhbERhdGV0aW1lKHZhbHVlOiBtb21lbnQuTW9tZW50KSB7XHJcbiAgICBpZiAodmFsdWUuaXNWYWxpZCgpKSB7XHJcbiAgICAgIHRoaXMudGVtcFBhcmFtcy5hcnJpdmFsRGF0ZXRpbWUgPSB2YWx1ZTtcclxuXHJcbiAgICAgIHRoaXMuX2RhdGUgPSB0aGlzLmhlbHBlcnMubW9tZW50VG9OZ0RhdGUodmFsdWUpO1xyXG4gICAgICB0aGlzLl90aW1lID0gdGhpcy5oZWxwZXJzLmZvcm1hdFRpbWVDb2xvbih2YWx1ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX3VwZGF0ZURhdGVUaW1lKCkge1xyXG4gICAgaWYgKHRoaXMuX2RhdGUgJiYgdGhpcy5fdGltZSkge1xyXG4gICAgICBjb25zdCB0aW1lID0gdGhpcy5oZWxwZXJzLm5nRGF0ZVRvTW9tZW50KHRoaXMuX2RhdGUsIHRoaXMuX3RpbWUpO1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gdGltZS5pc1ZhbGlkKCkgPyB0aW1lIDogbnVsbDtcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGxvY2F0aW9uQ29kZSgpOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscyB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uQ29kZTtcclxuICB9XHJcblxyXG4gIHNldCBsb2NhdGlvbkNvZGUodmFsdWU6IHN0cmluZyB8IE9CVEFpcnBvcnREZXRhaWxzKSB7XHJcbiAgICB0aGlzLnRlbXBQYXJhbXMubG9jYXRpb25Db2RlID0gdmFsdWU7XHJcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSAnJztcclxuICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgfSBlbHNlIGlmICh2YWx1ZSAmJiB2YWx1ZS5nYXRld2F5KSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IHZhbHVlLmdhdGV3YXk7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2xvY2F0aW9uQ29kZSA9IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzVmFsaWQoKSB7XHJcbiAgICBpZiAoIXRoaXMuZG9DaGVja3MpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuc3RvcmFnZVNlcnZpY2Uuc2V0U2Vzc2lvbkl0ZW0oXHJcbiAgICAgIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyxcclxuICAgICAge1xyXG4gICAgICAgIHRlbXBQYXJhbXM6IHRoaXMudGVtcFBhcmFtcyxcclxuICAgICAgICBvcmlnaW5hbFVzZXJTZWFyY2g6IHRoaXMub3JpZ2luYWxVc2VyU2VhcmNoXHJcbiAgICAgIH1cclxuICAgICk7XHJcblxyXG4gICAgdGhpcy52YWxpZGF0aW9uTWVzc2FnZXMgPSBbXTtcclxuXHJcbiAgICBpZiAoIXRoaXMubG9jYXRpb25Db2RlKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ1BsZWFzZSBhZGQgaW4gYSBhaXJwb3J0IGxvY2F0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCF0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lLmlzQWZ0ZXIobW9tZW50KCkpKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzLnB1c2goJ0RlcGFydHVyZSBkYXRlIGNhbiBub3QgYmUgaW4gdGhlIHBhc3QnKTtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmlzVmFsaWQubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5sZW5ndGggPT09IDApO1xyXG4gICAgdGhpcy5tZXNzYWdlcy5uZXh0KHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuICBwcm90ZWN0ZWQgbXVsdGlSZXN1bHRzU2Vzc2lvbk5hbWUgPVxyXG4gICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUkVTVUxUUztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZhc3R0cmFja0ZldGNoZXI6IEJhc2VGYXN0VHJhY2tRdW90ZUZldGNoZXI8RlRRX1E+LFxyXG4gICAgaGVscGVyczogQmFzZUhlbHBlclJvdXRpbmVzLFxyXG4gICAgcHJpdmF0ZSBiYXNrZXRTZXJ2aWNlOiBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICAgIHN0b3JhZ2VTZXJ2aWNlOiBCYXNlU3RvcmFnZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHNlYXJjaFNlcnZpY2U6IEVudGVycHJpc2VTZWFyY2hTZXJ2aWNlSW50ZXJmYWNlXHJcbiAgKSB7XHJcbiAgICBzdXBlcihzdG9yYWdlU2VydmljZSwgaGVscGVycyk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEZhc3RUcmFja1RlbXBQYXJhbXM7XHJcbiAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogRmFzdFRyYWNrVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgRmFzdFRyYWNrVGVtcFBhcmFtcyxcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBGYXN0VHJhY2tUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gZGF0YS5vcmlnaW5hbFVzZXJTZWFyY2g7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5GYXN0VHJhY2tcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gc3BsaXRUcmF2ZWxsZXJzLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcblxyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzIHx8IFtdKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCkge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoKSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMudGVtcFBhcmFtcylcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgICBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaCh0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5KSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydFNlYXJjaCh0aGlzLmZhc3R0cmFja0ZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgYWR1bHRzOiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzLFxyXG4gICAgICBjaGlsZHJlbjogdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuLFxyXG4gICAgICBsb2NhdGlvbkNvZGU6IHRoaXMuX2xvY2F0aW9uQ29kZSxcclxuICAgICAgYXJyaXZhbERhdGV0aW1lOiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lXHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIHRoaXMuaGVscGVycy5yZW1vdmVOdWxsczxTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcz4ocXVlcnkpO1xyXG4gIH1cclxuXHJcbiAgZ2V0UmVjZW50U2VhcmNoUXVlcnkoXHJcbiAgICBxdWVyeTogU2VhcmNoRmFzdFRyYWNrUXVlcnlWYXJpYWJsZXNcclxuICApOiBTYXZlUmVjZW50U2VhcmNoTXV0YXRpb25WYXJpYWJsZXMge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgc2VydmljZVR5cGU6IFNlcnZpY2VUeXBlLkZhc3RUcmFjayxcclxuICAgICAgc2VhcmNoQXJnczogcXVlcnksXHJcbiAgICAgIHRyYXZlbERhdGU6IHRoaXMuYXJyaXZhbERhdGV0aW1lLmZvcm1hdCgpLFxyXG4gICAgICB0cmF2ZWxsZXJzOiB0aGlzLmhlbHBlcnMuZ2V0VHJhdmVsbGVyc0lkKHRoaXMudHJhdmVsbGVycylcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc3RhcnRSZWNlbnRTZWFyY2gocmVjZW50U2VhcmNoOiBSZWNlbnRTZWFyY2gpOiB2b2lkIHtcclxuICAgIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgLmdldEFpcnBvcnRCeUNvZGUocmVjZW50U2VhcmNoLnNlYXJjaEFyZ3MubG9jYXRpb25Db2RlKVxyXG4gICAgICAuc3Vic2NyaWJlKChhaXJwb3J0OiBBaXJwb3J0UmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGlmIChhaXJwb3J0KSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHtcclxuICAgICAgICAgICAgY291bnRyeTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5pYXRhTWF0Y2gubmFtZSxcclxuICAgICAgICAgICAgZ2F0ZXdheTogYWlycG9ydC5pYXRhTWF0Y2guaWF0YSxcclxuICAgICAgICAgICAgcG9zdGNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMuc2VhcmNoU2VydmljZS5wcm9jZXNzVGVybWluYWxzKFxyXG4gICAgICAgICAgICAgIGFpcnBvcnQuaWF0YU1hdGNoLnRlcm1pbmFsc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnN0YXJ0U2VhcmNoZXMoKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUZyb21QcmV2aW91c1NlYXJjaGVzKFxyXG4gICAgcHJldmlvdXNJdGVtczogUmVjb3JkPFNlcnZpY2VUeXBlLCBCYXNrZXRJdGVtPlxyXG4gICk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ1BSRVBPUFVMQVRJTkcgTE9VTkdFIEZPUk0nKTtcclxuICAgIGNvbnN0IGZsaWdodEl0ZW06IFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgcHJldmlvdXNJdGVtc1tTZXJ2aWNlVHlwZS5GbGlnaHRdPy5zZWFyY2hRdWVyeTtcclxuICAgIGlmIChmbGlnaHRJdGVtKSB7XHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgY29uc3QgZGF0ZSA9XHJcbiAgICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XS5vdXRCb3VuZERhdGUudG9EYXRlKCk7XHJcbiAgICAgICAgdGhpcy5kYXRlID0ge1xyXG4gICAgICAgICAgZGF5OiBkYXRlLmdldFVUQ0RhdGUoKSxcclxuICAgICAgICAgIG1vbnRoOiBkYXRlLmdldFVUQ01vbnRoKCkgKyAxLFxyXG4gICAgICAgICAgeWVhcjogZGF0ZS5nZXRVVENGdWxsWWVhcigpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHRoaXMuc2VhcmNoU2VydmljZS5zZWFyY2hlc1tTZXJ2aWNlVHlwZS5GbGlnaHRdXHJcbiAgICAgICAgICAuYXJyaXZlTG9jYXRpb24gYXMgT0JUQWlycG9ydERldGFpbHM7XHJcbiAgICAgIH0gY2F0Y2gge1xyXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIHRyeWluZyB0byBwcmVwb3B1bGF0ZSBwYXJraW5nIGZyb20gbG91bmdlIGl0ZW0nKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0czogRmFzdFRyYWNrUXVvdGVbXSk6IElDaGVhcGVzdFByaWNlIHtcclxuICAgIGlmICghcmVzdWx0cy5sZW5ndGgpIHJldHVybiBudWxsO1xyXG4gICAgY29uc3QgY3VycmVuY3kgPSByZXN1bHRzWzBdLmN1cnJlbmN5O1xyXG4gICAgcmV0dXJuIHJlc3VsdHMucmVkdWNlKFxyXG4gICAgICAoY2hlYXBlc3RQcmljZTogSUNoZWFwZXN0UHJpY2UsIHJlc3VsdDogRmFzdFRyYWNrUXVvdGUpID0+IHtcclxuICAgICAgICBjb25zdCBwcmljZSA9IHJlc3VsdC5wcmljZTtcclxuICAgICAgICBpZiAoY2hlYXBlc3RQcmljZS5hbW91bnQgPiBwcmljZSkgY2hlYXBlc3RQcmljZS5hbW91bnQgPSBwcmljZTtcclxuICAgICAgICByZXR1cm4gY2hlYXBlc3RQcmljZTtcclxuICAgICAgfSxcclxuICAgICAgeyBhbW91bnQ6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLCBjdXJyZW5jeUNvZGU6IGN1cnJlbmN5IH1cclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBhZGRGYXN0VHJhY2tUb0Jhc2tldChcclxuICAgIGZhc3R0cmFja1F1b3RlOiBGYXN0VHJhY2tRdW90ZSxcclxuICAgIGZhc3R0cmFja1F1ZXJ5OiBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlc1xyXG4gICk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgaWYgKGZhc3R0cmFja1F1b3RlLnVuYXZhaWxhYmxlKSB7XHJcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoZmFsc2UpO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaW50QmFza2V0OiBJbnRlcm5hbEJhc2tldEludGVyZmFjZSA9XHJcbiAgICAgIGF3YWl0IHRoaXMuYmFza2V0U2VydmljZS5nZXREZWZhdWx0QmFza2V0KCk7XHJcbiAgICBjb25zdCBiYXNrZXQgPSBpbnRCYXNrZXQ/LnN1YmplY3QudmFsdWU7XHJcbiAgICBjb25zdCB0ZXJtc0FuZENvbmRpdGlvbnMgPSB0aGlzLmdldFRlcm1zQW5kQ29uZChmYXN0dHJhY2tRdW90ZSk7XHJcbiAgICBpZiAoYmFza2V0KSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWR1bHRzOiBmYXN0dHJhY2tRdWVyeS5hZHVsdHMsXHJcbiAgICAgICAgICBjaGlsZHJlbjogZmFzdHRyYWNrUXVlcnkuY2hpbGRyZW4sXHJcbiAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgIHNlcnZpY2U6IGZhc3R0cmFja1F1b3RlLnNvdXJjZUlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgYXJyaXZhbERhdGV0aW1lOiBmYXN0dHJhY2tRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGxvY2F0aW9uQ29kZTogZmFzdHRyYWNrUXVvdGUuY29kZSxcclxuICAgICAgICAgICAgbmFtZTogZmFzdHRyYWNrUXVvdGUubmFtZSxcclxuICAgICAgICAgICAgYWlycG9ydElhdGE6IGZhc3R0cmFja1F1ZXJ5Py5sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgICAgIGxvZ286IGZhc3R0cmFja1F1b3RlLmxvZ28sXHJcbiAgICAgICAgICAgIHRlcm1pbmFsOiBmYXN0dHJhY2tRdW90ZS50ZXJtaW5hbD8udG9TdHJpbmcoKSxcclxuICAgICAgICAgICAgdGVybXNBbmRDb25kOiB0ZXJtc0FuZENvbmRpdGlvbnNcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBwcmljZTogZmFzdHRyYWNrUXVvdGUucHJpY2UsXHJcbiAgICAgICAgICBjdXJyZW5jeTogZmFzdHRyYWNrUXVvdGUuY3VycmVuY3kgYXMgQ3VycmVuY3lDb2RlLFxyXG4gICAgICAgICAgc2VhcmNoUXVlcnk6IGZhc3R0cmFja1F1ZXJ5LFxyXG4gICAgICAgICAgb3V0Ym91bmREYXRlOiBmYXN0dHJhY2tRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KClcclxuICAgICAgICB9LFxyXG4gICAgICAgIGludEJhc2tldCxcclxuICAgICAgICB0aGlzLnNlYXJjaFNlcnZpY2UsXHJcbiAgICAgICAgdGhpcy50cmF2ZWxsZXJzLFxyXG4gICAgICAgIGZhc3R0cmFja1F1b3RlLnJlcXVpcmVzUmVhc29uXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTsgLy8gVE9ETyBzaG91bGQgdGhpcyB0aHJvdyBhbiBlcnJvcj9cclxuICAgIH1cclxuICBcclxuXHJcbiAgZ2V0VGVybXNBbmRDb25kKGZhc3R0cmFja1F1b3RlOiBGYXN0VHJhY2tRdW90ZSkge1xyXG4gICAgcmV0dXJuIFtcclxuICAgICAge1xyXG4gICAgICAgIG5hbWU6ICdOYW1lJyxcclxuICAgICAgICB2YWx1ZTogZmFzdHRyYWNrUXVvdGUubmFtZVxyXG4gICAgICB9LFxyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ0ltcG9ydGFudCBJbmZvcm1hdGlvbicsXHJcbiAgICAgICAgdmFsdWU6IGZhc3R0cmFja1F1b3RlLmltcG9ydGFudEluZm9cclxuICAgICAgfVxyXG4gICAgXTtcclxuICB9XHJcblxyXG4gIGFwcGx5RmlsdGVycyhhcHBsaWVkRmlsdGVyczogRmFzdFRyYWNrRmlsdGVycywgc2VsZWN0ZWRTb3J0OiBudW1iZXIpOiB2b2lkIHtcclxuICAgIGxldCBmdWxsUmVzdWx0czogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSA9IHRoaXMuaGVscGVycy5jbG9uZShcclxuICAgICAgdGhpcy5mdWxsUmVzdWx0c1xyXG4gICAgKTtcclxuXHJcbiAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLmZpbHRlcigocmVzdWx0OiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT4ge1xyXG4gICAgICByZXR1cm4gKFxyXG4gICAgICAgIHJlc3VsdC5wcmljZSA+PSBhcHBsaWVkRmlsdGVycy5taW5QcmljZSAmJlxyXG4gICAgICAgIHJlc3VsdC5wcmljZSA8PSBhcHBsaWVkRmlsdGVycy5tYXhQcmljZVxyXG4gICAgICApO1xyXG4gICAgfSk7XHJcblxyXG4gICAgZnVsbFJlc3VsdHMgPSB0aGlzLnNvcnRSZXN1bHRzKHNlbGVjdGVkU29ydCwgZnVsbFJlc3VsdHMpO1xyXG5cclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KGZ1bGxSZXN1bHRzKTtcclxuICB9XHJcblxyXG4gIHNvcnRSZXN1bHRzKFxyXG4gICAgc2VsZWN0ZWRTb3J0OiBudW1iZXIsXHJcbiAgICByZXN1bHRzPzogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheVxyXG4gICk6IEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXkge1xyXG4gICAgbGV0IGZ1bGxSZXN1bHRzID0gdGhpcy5oZWxwZXJzLmNsb25lKFxyXG4gICAgICByZXN1bHRzID8gcmVzdWx0cyA6IHRoaXMucmVzdWx0cy52YWx1ZVxyXG4gICAgKTtcclxuICAgIHN3aXRjaCAoc2VsZWN0ZWRTb3J0KSB7XHJcbiAgICAgIGNhc2UgMDogLy8gY2hlYXBlc3RcclxuICAgICAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLnNvcnQoXHJcbiAgICAgICAgICAoYTogRmFzdFRyYWNrUXVvdGVSZXN1bHQsIGI6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PlxyXG4gICAgICAgICAgICBhLnByaWNlIC0gYi5wcmljZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMTogLy8gZXhwZW5zaXZlXHJcbiAgICAgICAgZnVsbFJlc3VsdHMgPSBmdWxsUmVzdWx0cy5zb3J0KFxyXG4gICAgICAgICAgKGE6IEZhc3RUcmFja1F1b3RlUmVzdWx0LCBiOiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT5cclxuICAgICAgICAgICAgYi5wcmljZSAtIGEucHJpY2VcclxuICAgICAgICApO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGZhbGxiYWNrIHRvIHdoYXRldmVyIHdhcyBiZWZvcmVcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KGZ1bGxSZXN1bHRzKTtcclxuICAgIHJldHVybiBmdWxsUmVzdWx0cztcclxuICB9XHJcblxyXG4gIGdldE1pblByaWNlKGZ0czogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gZnRzLnJlZHVjZSgobWluOiBudW1iZXIsIGZ0OiBGYXN0VHJhY2tRdW90ZVJlc3VsdCkgPT4ge1xyXG4gICAgICBpZiAoZnQucHJpY2UgPCBtaW4pIHtcclxuICAgICAgICBtaW4gPSBmdC5wcmljZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbWluO1xyXG4gICAgfSwgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWF4UHJpY2UoZnRzOiBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBmdHMucmVkdWNlKChtYXg6IG51bWJlciwgZnQ6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChmdC5wcmljZSA+IG1heCkge1xyXG4gICAgICAgIG1heCA9IGZ0LnByaWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtYXg7XHJcbiAgICB9LCBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUik7XHJcbiAgfVxyXG59XHJcbiJdfQ==
320
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdC10cmFjay1lbnRlcnByaXNlLXNlYXJjaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29idHNlcnZpY2VzL2Jhc2Uvc3JjL2xpYi92ZW5kb3IvY2xhc3Nlcy9mYXN0LXRyYWNrLWVudGVycHJpc2Utc2VhcmNoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFvQjVCLE9BQU8sRUFRTCxXQUFXLEVBQ1osTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQ0wsNEJBQTRCLEVBTzdCLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFHekQsTUFBTSxPQUFPLHlCQUNYLFNBQVEsb0JBSVA7SUEwSEQsWUFDVSxnQkFBa0QsRUFDMUQsT0FBMkIsRUFDbkIsYUFBK0MsRUFDdkQsY0FBa0MsRUFDbEMsYUFBK0MsRUFDL0MsV0FBaUM7UUFFakMsS0FBSyxDQUFDLGNBQWMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBUG5ELHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0M7UUFFbEQsa0JBQWEsR0FBYixhQUFhLENBQWtDO1FBeEhsRCxTQUFJLEdBQWdCLFdBQVcsQ0FBQyxTQUFTLENBQUM7UUF1QnpDLFVBQUssR0FBa0IsSUFBSSxDQUFDO1FBVTVCLFVBQUssR0FBVyxJQUFJLENBQUM7UUErRW5CLHVCQUFrQixHQUMxQix5QkFBeUIsQ0FBQyx1QkFBdUIsQ0FBQztRQUMxQyw0QkFBdUIsR0FDL0IseUJBQXlCLENBQUMsdUJBQXVCLENBQUM7UUFXbEQsTUFBTSxJQUFJLEdBR04sY0FBYyxDQUFDLGNBQWMsQ0FDL0IseUJBQXlCLENBQUMsc0JBQXNCLENBQ2pELElBQUk7WUFDSCxVQUFVLEVBQUUsRUFBeUI7WUFDckMsa0JBQWtCLEVBQUUsRUFB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Q0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxXQUFXLENBQUMsR0FBOEI7UUFDeEMsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBVyxFQUFFLEVBQXdCLEVBQUUsRUFBRTtZQUMxRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEdBQUcsR0FBRyxFQUFFO2dCQUNsQixHQUFHLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQzthQUNoQjtZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzlCLENBQUM7O0FBOVplLGdEQUFzQixHQUFHLGtCQUFrQixDQUFDO0FBQzVDLGlEQUF1QixHQUFHLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHtcclxuICBCYXNlRmFzdFRyYWNrUXVvdGVGZXRjaGVyLFxyXG4gIEZhc3RUcmFja1F1b3RlRmV0Y2hlclR5cGVcclxufSBmcm9tICcuLi9mZXRjaGVycy9mYXN0LXRyYWNrLXF1b3RlLmZldGNoZXInO1xyXG5pbXBvcnQgeyBJQ2hlYXBlc3RQcmljZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvY2hlYXBlc3QtcHJpY2UnO1xyXG5pbXBvcnQgeyBGYXN0VHJhY2tGaWx0ZXJzIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9mYXN0LXRyYWNrLWZpbHRlcnMuaW50ZXJmYWNlJztcclxuaW1wb3J0IHtcclxuICBFbnRlcnByaXNlQmFza2V0U2VydmljZUludGVyZmFjZSxcclxuICBJbnRlcm5hbEJhc2tldEludGVyZmFjZVxyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWVudGVycHJpc2UtYmFza2V0LnNlcnZpY2UnO1xyXG5pbXBvcnQge1xyXG4gIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2hJbnRlcmZhY2UsXHJcbiAgRmFzdFRyYWNrVGVtcFBhcmFtc1xyXG59IGZyb20gJy4uL2ludGVyZmFjZXMvSWZhc3QtdHJhY2stZW50ZXJwcmlzZS1zZWFyY2gnO1xyXG5pbXBvcnQgeyBFbnRlcnByaXNlU2VhcmNoU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvSXNlYXJjaC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVXNlclNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0l1c2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBUcmF2ZWxsZXIgfSBmcm9tICcuLi9tb2RlbHMvdHJhdmVsbGVyLm9iamVjdCc7XHJcbmltcG9ydCB7IEJhc2VTdG9yYWdlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7XHJcbiAgQWlycG9ydFJlc3VsdHMsXHJcbiAgQmFza2V0SXRlbSxcclxuICBDdXJyZW5jeUNvZGUsXHJcbiAgRmFzdFRyYWNrUXVvdGUsXHJcbiAgU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzLFxyXG4gIFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlYXJjaEZsaWdodHNWMlF1ZXJ5VmFyaWFibGVzLFxyXG4gIFNlcnZpY2VUeXBlXHJcbn0gZnJvbSAnLi4vdHlwZXMvZ3JhcGhxbC50eXBlcyc7XHJcbmltcG9ydCB7XHJcbiAgRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucyxcclxuICBGYXN0VHJhY2tRdW90ZVJlc3VsdCxcclxuICBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5LFxyXG4gIE5nYkRhdGVTdHJ1Y3QsXHJcbiAgT0JUQWlycG9ydERldGFpbHMsXHJcbiAgUmVjZW50U2VhcmNoLFxyXG4gIFRlcm1pbmFsc1R5cGVcclxufSBmcm9tICcuLi90eXBlcy90eXBlcyc7XHJcbmltcG9ydCB7IEJhc2VFbnRlcnByaXNlU2VhcmNoIH0gZnJvbSAnLi9iYXNlLWVudGVycHJpc2UnO1xyXG5pbXBvcnQgeyBCYXNlSGVscGVyUm91dGluZXMgfSBmcm9tICcuL2hlbHBlcnMnO1xyXG5cclxuZXhwb3J0IGNsYXNzIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2g8RlRRX1EgZXh0ZW5kcyBGYXN0VHJhY2tRdW90ZUZldGNoZXJUeXBlPlxyXG4gIGV4dGVuZHMgQmFzZUVudGVycHJpc2VTZWFyY2g8XHJcbiAgICBGYXN0VHJhY2tUZW1wUGFyYW1zLFxyXG4gICAgRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSxcclxuICAgIEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXlcclxuICA+XHJcbiAgaW1wbGVtZW50cyBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoSW50ZXJmYWNlXHJcbntcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1BBUkFNUyA9ICdzZWFyY2hfZmFzdHRyYWNrJztcclxuICBzdGF0aWMgcmVhZG9ubHkgU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFMgPSAncmVzdWx0c19mYXN0dHJhY2snO1xyXG4gIHB1YmxpYyB0eXBlOiBTZXJ2aWNlVHlwZSA9IFNlcnZpY2VUeXBlLkZhc3RUcmFjaztcclxuXHJcbiAgcHJpdmF0ZSBfbG9jYXRpb25Db2RlOiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSB0cmF2ZWxsZXJzOiBUcmF2ZWxsZXJbXTtcclxuXHJcbiAgZ2V0IGFkdWx0cygpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hZHVsdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgYWR1bHRzKHZhbHVlOiBudW1iZXIpIHtcclxuICAgIHRoaXMudGVtcFBhcmFtcy5hZHVsdHMgPSB2YWx1ZTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICB9XHJcblxyXG4gIGdldCBjaGlsZHJlbigpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5hZHVsdHM7XHJcbiAgfVxyXG5cclxuICBzZXQgY2hpbGRyZW4odmFsdWU6IG51bWJlcikge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHZhbHVlO1xyXG4gICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZGF0ZTogTmdiRGF0ZVN0cnVjdCA9IG51bGw7XHJcbiAgZ2V0IGRhdGUoKTogTmdiRGF0ZVN0cnVjdCB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGF0ZTtcclxuICB9XHJcblxyXG4gIHNldCBkYXRlKHZhbHVlOiBOZ2JEYXRlU3RydWN0KSB7XHJcbiAgICB0aGlzLl9kYXRlID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVEYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdGltZTogc3RyaW5nID0gbnVsbDtcclxuICBnZXQgdGltZSgpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuX3RpbWU7XHJcbiAgfVxyXG5cclxuICBzZXQgdGltZSh2YWx1ZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLl90aW1lID0gdmFsdWU7XHJcbiAgICB0aGlzLl91cGRhdGVEYXRlVGltZSgpO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGFycml2YWxEYXRldGltZSgpOiBtb21lbnQuTW9tZW50IHtcclxuICAgIHJldHVybiB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lO1xyXG4gIH1cclxuXHJcbiAgc2V0IGFycml2YWxEYXRldGltZSh2YWx1ZTogbW9tZW50Lk1vbWVudCkge1xyXG4gICAgaWYgKHZhbHVlLmlzVmFsaWQoKSkge1xyXG4gICAgICB0aGlzLnRlbXBQYXJhbXMuYXJyaXZhbERhdGV0aW1lID0gdmFsdWU7XHJcblxyXG4gICAgICB0aGlzLl9kYXRlID0gdGhpcy5oZWxwZXJzLm1vbWVudFRvTmdEYXRlKHZhbHVlKTtcclxuICAgICAgdGhpcy5fdGltZSA9IHRoaXMuaGVscGVycy5mb3JtYXRUaW1lQ29sb24odmFsdWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF91cGRhdGVEYXRlVGltZSgpIHtcclxuICAgIGlmICh0aGlzLl9kYXRlICYmIHRoaXMuX3RpbWUpIHtcclxuICAgICAgY29uc3QgdGltZSA9IHRoaXMuaGVscGVycy5uZ0RhdGVUb01vbWVudCh0aGlzLl9kYXRlLCB0aGlzLl90aW1lKTtcclxuICAgICAgdGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZSA9IHRpbWUuaXNWYWxpZCgpID8gdGltZSA6IG51bGw7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBsb2NhdGlvbkNvZGUoKTogc3RyaW5nIHwgT0JUQWlycG9ydERldGFpbHMge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcFBhcmFtcy5sb2NhdGlvbkNvZGU7XHJcbiAgfVxyXG5cclxuICBzZXQgbG9jYXRpb25Db2RlKHZhbHVlOiBzdHJpbmcgfCBPQlRBaXJwb3J0RGV0YWlscykge1xyXG4gICAgdGhpcy50ZW1wUGFyYW1zLmxvY2F0aW9uQ29kZSA9IHZhbHVlO1xyXG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcclxuICAgICAgdGhpcy5fbG9jYXRpb25Db2RlID0gJyc7XHJcbiAgICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdmFsdWUuZ2F0ZXdheSkge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSB2YWx1ZS5nYXRld2F5O1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9sb2NhdGlvbkNvZGUgPSBudWxsO1xyXG4gICAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1ZhbGlkKCkge1xyXG4gICAgaWYgKCF0aGlzLmRvQ2hlY2tzKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnN0b3JhZ2VTZXJ2aWNlLnNldFNlc3Npb25JdGVtKFxyXG4gICAgICBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgIHtcclxuICAgICAgICB0ZW1wUGFyYW1zOiB0aGlzLnRlbXBQYXJhbXMsXHJcbiAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICB9XHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudmFsaWRhdGlvbk1lc3NhZ2VzID0gW107XHJcblxyXG4gICAgaWYgKCF0aGlzLmxvY2F0aW9uQ29kZSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdQbGVhc2UgYWRkIGluIGEgYWlycG9ydCBsb2NhdGlvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZS5pc0FmdGVyKG1vbWVudCgpKSkge1xyXG4gICAgICB0aGlzLnZhbGlkYXRpb25NZXNzYWdlcy5wdXNoKCdEZXBhcnR1cmUgZGF0ZSBjYW4gbm90IGJlIGluIHRoZSBwYXN0Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5pc1ZhbGlkLm5leHQodGhpcy52YWxpZGF0aW9uTWVzc2FnZXMubGVuZ3RoID09PSAwKTtcclxuICAgIHRoaXMubWVzc2FnZXMubmV4dCh0aGlzLnZhbGlkYXRpb25NZXNzYWdlcyk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcbiAgcHJvdGVjdGVkIG11bHRpUmVzdWx0c1Nlc3Npb25OYW1lID1cclxuICAgIEZhc3RUcmFja0VudGVycHJpc2VTZWFyY2guU1RPUkFHRV9TRVNTSU9OX1JFU1VMVFM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYXN0dHJhY2tGZXRjaGVyOiBCYXNlRmFzdFRyYWNrUXVvdGVGZXRjaGVyPEZUUV9RPixcclxuICAgIGhlbHBlcnM6IEJhc2VIZWxwZXJSb3V0aW5lcyxcclxuICAgIHByaXZhdGUgYmFza2V0U2VydmljZTogRW50ZXJwcmlzZUJhc2tldFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICBzdG9yYWdlU2VydmljZTogQmFzZVN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgc2VhcmNoU2VydmljZTogRW50ZXJwcmlzZVNlYXJjaFNlcnZpY2VJbnRlcmZhY2UsXHJcbiAgICB1c2VyU2VydmljZTogVXNlclNlcnZpY2VJbnRlcmZhY2VcclxuICApIHtcclxuICAgIHN1cGVyKHN0b3JhZ2VTZXJ2aWNlLCBoZWxwZXJzLCBzZWFyY2hTZXJ2aWNlLCB1c2VyU2VydmljZSk7XHJcbiAgICBjb25zdCBkYXRhOiB7XHJcbiAgICAgIHRlbXBQYXJhbXM6IEZhc3RUcmFja1RlbXBQYXJhbXM7XHJcbiAgICAgIG9yaWdpbmFsVXNlclNlYXJjaDogRmFzdFRyYWNrVGVtcFBhcmFtcztcclxuICAgIH0gPSBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbShcclxuICAgICAgRmFzdFRyYWNrRW50ZXJwcmlzZVNlYXJjaC5TVE9SQUdFX1NFU1NJT05fUEFSQU1TXHJcbiAgICApIHx8IHtcclxuICAgICAgdGVtcFBhcmFtczoge30gYXMgRmFzdFRyYWNrVGVtcFBhcmFtcyxcclxuICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB7fSBhcyBGYXN0VHJhY2tUZW1wUGFyYW1zXHJcbiAgICB9O1xyXG4gICAgdGhpcy5fb3JpZ2luYWxVc2VyU2VhcmNoID0gZGF0YS5vcmlnaW5hbFVzZXJTZWFyY2g7XHJcbiAgICB0aGlzLnVwZGF0ZVRlbXBQYXJhbXMoc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoZGF0YS50ZW1wUGFyYW1zKSk7XHJcblxyXG4gICAgaWYgKHNlYXJjaFNlcnZpY2Uuc2hvdWxkQWRkVHJhdmVsbGVyU3Vic2NyaXB0aW9uKCkpIHtcclxuICAgICAgc2VhcmNoU2VydmljZS50cmF2ZWxsZXJJbmZvcm1hdGlvbi5zdWJzY3JpYmUoXHJcbiAgICAgICAgKHRyYXZlbGxlcnM6IFRyYXZlbGxlcltdKSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBzcGxpdFRyYXZlbGxlcnMgPSB0aGlzLmhlbHBlcnMuc2VsZWN0ZWRUcmF2ZWxsZXJzKFxyXG4gICAgICAgICAgICB0cmF2ZWxsZXJzLFxyXG4gICAgICAgICAgICBTZXJ2aWNlVHlwZS5GYXN0VHJhY2tcclxuICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmFkdWx0cyA9IHNwbGl0VHJhdmVsbGVycy5hZHVsdHMubGVuZ3RoO1xyXG4gICAgICAgICAgdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID0gc3BsaXRUcmF2ZWxsZXJzLmNoaWxkcmVuLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMudHJhdmVsbGVycyA9IHRyYXZlbGxlcnM7XHJcblxyXG4gICAgICAgICAgdGhpcy5faXNWYWxpZCgpO1xyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIGNvbnN0IHJlc3VsdHMgPVxyXG4gICAgICBzdG9yYWdlU2VydmljZS5nZXRTZXNzaW9uSXRlbUFzTGlzdDxGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5PihcclxuICAgICAgICB0aGlzLnJlc3VsdHNTZXNzaW9uTmFtZVxyXG4gICAgICApIHx8IFtdO1xyXG4gICAgdGhpcy5fY2hlYXBlc3RSZXN1bHRQcmljZSA9IHRoaXMudXBkYXRlTG93ZXN0UHJpY2UocmVzdWx0cyk7XHJcbiAgICB0aGlzLnJlc3VsdHMubmV4dChyZXN1bHRzIHx8IFtdKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZXNldFF1ZXJ5KCkge1xyXG4gICAgdGhpcy51cGRhdGVUZW1wUGFyYW1zKHRoaXMuc2VhcmNoU2VydmljZS5tYWtlRmFzdFRyYWNrUXVlcnkoKSk7XHJcbiAgICB0aGlzLl9pc1ZhbGlkKCk7XHJcbiAgfVxyXG5cclxuICBzdGFydFNlYXJjaCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcclxuICAgIHRoaXMucmVzdWx0cy5uZXh0KFtdKTtcclxuICAgIHRoaXMuX2lzVmFsaWQoKTtcclxuXHJcbiAgICBpZiAodGhpcy5pc1ZhbGlkLnZhbHVlKSB7XHJcbiAgICAgIHRoaXMuX29yaWdpbmFsVXNlclNlYXJjaCA9IE9iamVjdC5mcmVlemUoXHJcbiAgICAgICAgdGhpcy5oZWxwZXJzLmNsb25lKHRoaXMudGVtcFBhcmFtcylcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zdG9yYWdlU2VydmljZS5zZXRTZXNzaW9uSXRlbShcclxuICAgICAgICBGYXN0VHJhY2tFbnRlcnByaXNlU2VhcmNoLlNUT1JBR0VfU0VTU0lPTl9QQVJBTVMsXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGVtcFBhcmFtczogdGhpcy50ZW1wUGFyYW1zLFxyXG4gICAgICAgICAgb3JpZ2luYWxVc2VyU2VhcmNoOiB0aGlzLm9yaWdpbmFsVXNlclNlYXJjaFxyXG4gICAgICAgIH1cclxuICAgICAgKTtcclxuXHJcbiAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5nZXRTZWFyY2hRdWVyeSgpO1xyXG4gICAgICB0aGlzLnNlYXJjaFNlcnZpY2Uuc2F2ZVJlY2VudFNlYXJjaCh0aGlzLmdldFJlY2VudFNlYXJjaFF1ZXJ5KHF1ZXJ5KSk7XHJcbiAgICAgIHJldHVybiB0aGlzLl9zdGFydFNlYXJjaCh0aGlzLmZhc3R0cmFja0ZldGNoZXIuZmV0Y2hMaXN0KHF1ZXJ5KSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFF1ZXJ5KCk6IFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzIHtcclxuICAgIGNvbnN0IHF1ZXJ5OiBTZWFyY2hGYXN0VHJhY2tRdWVyeVZhcmlhYmxlcyA9IHtcclxuICAgICAgYWR1bHRzOiB0aGlzLnRlbXBQYXJhbXMuYWR1bHRzLFxyXG4gICAgICBjaGlsZHJlbjogdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuID8gdGhpcy50ZW1wUGFyYW1zLmNoaWxkcmVuIDogbnVsbCxcclxuICAgICAgbG9jYXRpb25Db2RlOiB0aGlzLl9sb2NhdGlvbkNvZGUsXHJcbiAgICAgIGFycml2YWxEYXRldGltZTogdGhpcy50ZW1wUGFyYW1zLmFycml2YWxEYXRldGltZVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmhlbHBlcnMucmVtb3ZlTnVsbHM8U2VhcmNoRmFzdFRyYWNrUXVlcnlWYXJpYWJsZXM+KHF1ZXJ5KTtcclxuICB9XHJcblxyXG4gIGdldFJlY2VudFNlYXJjaFF1ZXJ5KFxyXG4gICAgcXVlcnk6IFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzXHJcbiAgKTogU2F2ZVJlY2VudFNlYXJjaE11dGF0aW9uVmFyaWFibGVzIHtcclxuICAgIHJldHVybiB7XHJcbiAgICAgIHNlcnZpY2VUeXBlOiBTZXJ2aWNlVHlwZS5GYXN0VHJhY2ssXHJcbiAgICAgIHNlYXJjaEFyZ3M6IHF1ZXJ5LFxyXG4gICAgICB0cmF2ZWxEYXRlOiB0aGlzLmFycml2YWxEYXRldGltZS5mb3JtYXQoKSxcclxuICAgICAgdHJhdmVsbGVyczogdGhpcy5oZWxwZXJzLmdldFRyYXZlbGxlcnNJZCh0aGlzLnRyYXZlbGxlcnMpXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0YXJ0UmVjZW50U2VhcmNoKHJlY2VudFNlYXJjaDogUmVjZW50U2VhcmNoKTogdm9pZCB7XHJcbiAgICB0aGlzLmFycml2YWxEYXRldGltZSA9IG1vbWVudChyZWNlbnRTZWFyY2guc2VhcmNoQXJncy5hcnJpdmFsRGF0ZXRpbWUpO1xyXG4gICAgdGhpcy5zZWFyY2hTZXJ2aWNlXHJcbiAgICAgIC5nZXRBaXJwb3J0QnlDb2RlKHJlY2VudFNlYXJjaC5zZWFyY2hBcmdzLmxvY2F0aW9uQ29kZSlcclxuICAgICAgLnN1YnNjcmliZSgoYWlycG9ydDogQWlycG9ydFJlc3VsdHMpID0+IHtcclxuICAgICAgICBpZiAoYWlycG9ydCkge1xyXG4gICAgICAgICAgdGhpcy5sb2NhdGlvbkNvZGUgPSB7XHJcbiAgICAgICAgICAgIGNvdW50cnk6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnksXHJcbiAgICAgICAgICAgIGNvdW50cnlDb2RlOiBhaXJwb3J0LmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5jb3VudHJ5Q29kZSxcclxuICAgICAgICAgICAgZGVzdGluYXRpb246IGFpcnBvcnQuaWF0YU1hdGNoLm5hbWUsXHJcbiAgICAgICAgICAgIGdhdGV3YXk6IGFpcnBvcnQuaWF0YU1hdGNoLmlhdGEsXHJcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBhaXJwb3J0LmlhdGFNYXRjaD8ubG9jYXRpb25EZXRhaWxzPy5wb3N0Y29kZSxcclxuICAgICAgICAgICAgdGVybWluYWxzOiB0aGlzLnNlYXJjaFNlcnZpY2UucHJvY2Vzc1Rlcm1pbmFscyhcclxuICAgICAgICAgICAgICBhaXJwb3J0LmlhdGFNYXRjaC50ZXJtaW5hbHNcclxuICAgICAgICAgICAgKVxyXG4gICAgICAgICAgfTtcclxuICAgICAgICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIHRoaXMuc2VhcmNoU2VydmljZS5zdGFydFNlYXJjaGVzKCk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVTZWFyY2hGcm9tRXhwaXJlZEJhc2tldEl0ZW0oYmFza2V0SXRlbTogQmFza2V0SXRlbSk6IHZvaWQge1xyXG4gICAgY29uc3Qgc2VhcmNoRmFzdFRyYWNrUXVlcnk6IFNlYXJjaEZhc3RUcmFja1F1ZXJ5VmFyaWFibGVzID1cclxuICAgICAgYmFza2V0SXRlbS5zZWFyY2hRdWVyeTtcclxuICAgIHRoaXMuYXJyaXZhbERhdGV0aW1lID0gbW9tZW50KHNlYXJjaEZhc3RUcmFja1F1ZXJ5LmFycml2YWxEYXRldGltZSk7XHJcbiAgICB0aGlzLnNlYXJjaFNlcnZpY2VcclxuICAgICAgLmdldEFpcnBvcnRCeUNvZGUoc2VhcmNoRmFzdFRyYWNrUXVlcnkubG9jYXRpb25Db2RlKVxyXG4gICAgICAuc3Vic2NyaWJlKChhaXJwb3J0OiBBaXJwb3J0UmVzdWx0cykgPT4ge1xyXG4gICAgICAgIGlmIChhaXJwb3J0KSB7XHJcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uQ29kZSA9IHtcclxuICAgICAgICAgICAgY291bnRyeTogYWlycG9ydC5pYXRhTWF0Y2g/LmxvY2F0aW9uRGV0YWlscz8uY291bnRyeSxcclxuICAgICAgICAgICAgY291bnRyeUNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LmNvdW50cnlDb2RlLFxyXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogYWlycG9ydC5pYXRhTWF0Y2gubmFtZSxcclxuICAgICAgICAgICAgZ2F0ZXdheTogYWlycG9ydC5pYXRhTWF0Y2guaWF0YSxcclxuICAgICAgICAgICAgcG9zdGNvZGU6IGFpcnBvcnQuaWF0YU1hdGNoPy5sb2NhdGlvbkRldGFpbHM/LnBvc3Rjb2RlLFxyXG4gICAgICAgICAgICB0ZXJtaW5hbHM6IHRoaXMuc2VhcmNoU2VydmljZS5wcm9jZXNzVGVybWluYWxzKFxyXG4gICAgICAgICAgICAgIGFpcnBvcnQuaWF0YU1hdGNoLnRlcm1pbmFsc1xyXG4gICAgICAgICAgICApXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVGcm9tUHJldmlvdXNTZWFyY2hlcyhcclxuICAgIHByZXZpb3VzSXRlbXM6IFJlY29yZDxTZXJ2aWNlVHlwZSwgQmFza2V0SXRlbT5cclxuICApOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdQUkVQT1BVTEFUSU5HIExPVU5HRSBGT1JNJyk7XHJcbiAgICBjb25zdCBmbGlnaHRJdGVtOiBTZWFyY2hGbGlnaHRzVjJRdWVyeVZhcmlhYmxlcyA9XHJcbiAgICAgIHByZXZpb3VzSXRlbXNbU2VydmljZVR5cGUuRmxpZ2h0XT8uc2VhcmNoUXVlcnk7XHJcbiAgICBpZiAoZmxpZ2h0SXRlbSkge1xyXG4gICAgICB0cnkge1xyXG4gICAgICAgIGNvbnN0IGRhdGUgPVxyXG4gICAgICAgICAgdGhpcy5zZWFyY2hTZXJ2aWNlLnNlYXJjaGVzW1NlcnZpY2VUeXBlLkZsaWdodF0ub3V0Qm91bmREYXRlLnRvRGF0ZSgpO1xyXG4gICAgICAgIHRoaXMuZGF0ZSA9IHtcclxuICAgICAgICAgIGRheTogZGF0ZS5nZXRVVENEYXRlKCksXHJcbiAgICAgICAgICBtb250aDogZGF0ZS5nZXRVVENNb250aCgpICsgMSxcclxuICAgICAgICAgIHllYXI6IGRhdGUuZ2V0VVRDRnVsbFllYXIoKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5sb2NhdGlvbkNvZGUgPSB0aGlzLnNlYXJjaFNlcnZpY2Uuc2VhcmNoZXNbU2VydmljZVR5cGUuRmxpZ2h0XVxyXG4gICAgICAgICAgLmFycml2ZUxvY2F0aW9uIGFzIE9CVEFpcnBvcnREZXRhaWxzO1xyXG4gICAgICB9IGNhdGNoIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciB0cnlpbmcgdG8gcHJlcG9wdWxhdGUgcGFya2luZyBmcm9tIGxvdW5nZSBpdGVtJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHVwZGF0ZUxvd2VzdFByaWNlKHJlc3VsdHM6IEZhc3RUcmFja1F1b3RlW10pOiBJQ2hlYXBlc3RQcmljZSB7XHJcbiAgICBpZiAoIXJlc3VsdHMubGVuZ3RoKSByZXR1cm4gbnVsbDtcclxuICAgIGNvbnN0IGN1cnJlbmN5ID0gcmVzdWx0c1swXS5jdXJyZW5jeTtcclxuICAgIHJldHVybiByZXN1bHRzLnJlZHVjZShcclxuICAgICAgKGNoZWFwZXN0UHJpY2U6IElDaGVhcGVzdFByaWNlLCByZXN1bHQ6IEZhc3RUcmFja1F1b3RlKSA9PiB7XHJcbiAgICAgICAgY29uc3QgcHJpY2UgPSByZXN1bHQucHJpY2U7XHJcbiAgICAgICAgaWYgKGNoZWFwZXN0UHJpY2UuYW1vdW50ID4gcHJpY2UpIGNoZWFwZXN0UHJpY2UuYW1vdW50ID0gcHJpY2U7XHJcbiAgICAgICAgcmV0dXJuIGNoZWFwZXN0UHJpY2U7XHJcbiAgICAgIH0sXHJcbiAgICAgIHsgYW1vdW50OiBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiwgY3VycmVuY3lDb2RlOiBjdXJyZW5jeSB9XHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgYWRkRmFzdFRyYWNrVG9CYXNrZXQoXHJcbiAgICBmYXN0dHJhY2tRdW90ZTogRmFzdFRyYWNrUXVvdGUsXHJcbiAgICBmYXN0dHJhY2tRdWVyeTogU2VhcmNoRmFzdFRyYWNrUXVlcnlWYXJpYWJsZXNcclxuICApOiBQcm9taXNlPERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnM+IHtcclxuICAgIGlmIChmYXN0dHJhY2tRdW90ZS51bmF2YWlsYWJsZSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKERpZmZlcmVudEludm9rZGVkVXNlclJlYXNvbnMuY2FuY2VsKTtcclxuICAgIH1cclxuICAgIGNvbnN0IGludEJhc2tldDogSW50ZXJuYWxCYXNrZXRJbnRlcmZhY2UgPVxyXG4gICAgICBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuZ2V0RGVmYXVsdEJhc2tldCgpO1xyXG4gICAgY29uc3QgYmFza2V0ID0gaW50QmFza2V0Py5zdWJqZWN0LnZhbHVlO1xyXG4gICAgY29uc3QgdGVybXNBbmRDb25kaXRpb25zID0gdGhpcy5nZXRUZXJtc0FuZENvbmQoZmFzdHRyYWNrUXVvdGUpO1xyXG4gICAgaWYgKGJhc2tldCkge1xyXG4gICAgICBjb25zdCB3aGF0SGFwcGVuZWQgPSBhd2FpdCB0aGlzLmJhc2tldFNlcnZpY2UuYWRkVG9CYXNrZXQoXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgYWR1bHRzOiBmYXN0dHJhY2tRdWVyeS5hZHVsdHMsXHJcbiAgICAgICAgICBjaGlsZHJlbjogZmFzdHRyYWNrUXVlcnkuY2hpbGRyZW4sXHJcbiAgICAgICAgICBiYXNrZXQ6IGJhc2tldC5pZCxcclxuICAgICAgICAgIHNlcnZpY2U6IGZhc3R0cmFja1F1b3RlLnNvdXJjZUlkLnRvU3RyaW5nKCksXHJcbiAgICAgICAgICBkZXRhaWw6IHtcclxuICAgICAgICAgICAgYXJyaXZhbERhdGV0aW1lOiBmYXN0dHJhY2tRdWVyeS5hcnJpdmFsRGF0ZXRpbWUuZm9ybWF0KCksXHJcbiAgICAgICAgICAgIGxvY2F0aW9uQ29kZTogZmFzdHRyYWNrUXVvdGUuY29kZSxcclxuICAgICAgICAgICAgbmFtZTogZmFzdHRyYWNrUXVvdGUubmFtZSxcclxuICAgICAgICAgICAgYWlycG9ydElhdGE6IGZhc3R0cmFja1F1ZXJ5Py5sb2NhdGlvbkNvZGUsXHJcbiAgICAgICAgICAgIHRlcm1pbmFsOiBmYXN0dHJhY2tRdW90ZS50ZXJtaW5hbD8udG9TdHJpbmcoKVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIHByaWNlOiBmYXN0dHJhY2tRdW90ZS5wcmljZSxcclxuICAgICAgICAgIGN1cnJlbmN5OiBmYXN0dHJhY2tRdW90ZS5jdXJyZW5jeSBhcyBDdXJyZW5jeUNvZGUsXHJcbiAgICAgICAgICBzZWFyY2hRdWVyeTogZmFzdHRyYWNrUXVlcnksXHJcbiAgICAgICAgICBvdXRib3VuZERhdGU6IGZhc3R0cmFja1F1ZXJ5LmFycml2YWxEYXRldGltZS5mb3JtYXQoKSxcclxuICAgICAgICAgIGxvd2VzdFByaWNlOiB0aGlzLmNoZWFwZXN0UHJpY2U/LmFtb3VudCAhPSBmYXN0dHJhY2tRdW90ZS5wcmljZSB8fCB0aGlzLmNoZWFwZXN0UHJpY2U/LmN1cnJlbmN5Q29kZSAhPSBmYXN0dHJhY2tRdW90ZS5jdXJyZW5jeSA/IFxyXG4gICAgICAgICAgICB0aGlzLmNoZWFwZXN0UHJpY2U/LmFtb3VudCA6IG51bGwsXHJcbiAgICAgICAgICBsb3dlc3RQcmljZUN1cnJlbmN5OiB0aGlzLmNoZWFwZXN0UHJpY2U/LmFtb3VudCAhPSBmYXN0dHJhY2tRdW90ZS5wcmljZSB8fCB0aGlzLmNoZWFwZXN0UHJpY2U/LmN1cnJlbmN5Q29kZSAhPSBmYXN0dHJhY2tRdW90ZS5jdXJyZW5jeSA/IFxyXG4gICAgICAgICAgICA8Q3VycmVuY3lDb2RlPnRoaXMuY2hlYXBlc3RQcmljZT8uY3VycmVuY3lDb2RlIDogbnVsbFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgaW50QmFza2V0LFxyXG4gICAgICAgIHRoaXMuc2VhcmNoU2VydmljZSxcclxuICAgICAgICB0aGlzLnRyYXZlbGxlcnMsXHJcbiAgICAgICAgZmFzdHRyYWNrUXVvdGUucmVxdWlyZXNSZWFzb25cclxuICAgICAgKTtcclxuICAgICAgaWYgKHdoYXRIYXBwZW5lZCA9PT0gRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5yZXNlYXJjaCkge1xyXG4gICAgICAgIHRoaXMucGVyZm9ybVNlYXJjaCgpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB3aGF0SGFwcGVuZWQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gRGlmZmVyZW50SW52b2tkZWRVc2VyUmVhc29ucy5jYW5jZWw7XHJcbiAgfVxyXG5cclxuICBnZXRUZXJtc0FuZENvbmQoZmFzdHRyYWNrUXVvdGU6IEZhc3RUcmFja1F1b3RlKSB7XHJcbiAgICByZXR1cm4gW1xyXG4gICAgICB7XHJcbiAgICAgICAgbmFtZTogJ05hbWUnLFxyXG4gICAgICAgIHZhbHVlOiBmYXN0dHJhY2tRdW90ZS5uYW1lXHJcbiAgICAgIH0sXHJcbiAgICAgIHtcclxuICAgICAgICBuYW1lOiAnSW1wb3J0YW50IEluZm9ybWF0aW9uJyxcclxuICAgICAgICB2YWx1ZTogZmFzdHRyYWNrUXVvdGUuaW1wb3J0YW50SW5mb1xyXG4gICAgICB9XHJcbiAgICBdO1xyXG4gIH1cclxuXHJcbiAgYXBwbHlGaWx0ZXJzKGFwcGxpZWRGaWx0ZXJzOiBGYXN0VHJhY2tGaWx0ZXJzLCBzZWxlY3RlZFNvcnQ6IG51bWJlcik6IHZvaWQge1xyXG4gICAgbGV0IGZ1bGxSZXN1bHRzOiBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5ID0gdGhpcy5oZWxwZXJzLmNsb25lKFxyXG4gICAgICB0aGlzLmZ1bGxSZXN1bHRzXHJcbiAgICApO1xyXG5cclxuICAgIGZ1bGxSZXN1bHRzID0gZnVsbFJlc3VsdHMuZmlsdGVyKChyZXN1bHQ6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PiB7XHJcbiAgICAgIHJldHVybiAoXHJcbiAgICAgICAgcmVzdWx0LnByaWNlID49IGFwcGxpZWRGaWx0ZXJzLm1pblByaWNlICYmXHJcbiAgICAgICAgcmVzdWx0LnByaWNlIDw9IGFwcGxpZWRGaWx0ZXJzLm1heFByaWNlXHJcbiAgICAgICk7XHJcbiAgICB9KTtcclxuXHJcbiAgICBmdWxsUmVzdWx0cyA9IHRoaXMuc29ydFJlc3VsdHMoc2VsZWN0ZWRTb3J0LCBmdWxsUmVzdWx0cyk7XHJcblxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoZnVsbFJlc3VsdHMpO1xyXG4gIH1cclxuXHJcbiAgc29ydFJlc3VsdHMoXHJcbiAgICBzZWxlY3RlZFNvcnQ6IG51bWJlcixcclxuICAgIHJlc3VsdHM/OiBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5XHJcbiAgKTogRmFzdFRyYWNrUXVvdGVSZXN1bHRBcnJheSB7XHJcbiAgICBsZXQgZnVsbFJlc3VsdHMgPSB0aGlzLmhlbHBlcnMuY2xvbmUoXHJcbiAgICAgIHJlc3VsdHMgPyByZXN1bHRzIDogdGhpcy5yZXN1bHRzLnZhbHVlXHJcbiAgICApO1xyXG4gICAgc3dpdGNoIChzZWxlY3RlZFNvcnQpIHtcclxuICAgICAgY2FzZSAwOiAvLyBjaGVhcGVzdFxyXG4gICAgICAgIGZ1bGxSZXN1bHRzID0gZnVsbFJlc3VsdHMuc29ydChcclxuICAgICAgICAgIChhOiBGYXN0VHJhY2tRdW90ZVJlc3VsdCwgYjogRmFzdFRyYWNrUXVvdGVSZXN1bHQpID0+XHJcbiAgICAgICAgICAgIGEucHJpY2UgLSBiLnByaWNlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAxOiAvLyBleHBlbnNpdmVcclxuICAgICAgICBmdWxsUmVzdWx0cyA9IGZ1bGxSZXN1bHRzLnNvcnQoXHJcbiAgICAgICAgICAoYTogRmFzdFRyYWNrUXVvdGVSZXN1bHQsIGI6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PlxyXG4gICAgICAgICAgICBiLnByaWNlIC0gYS5wcmljZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gZmFsbGJhY2sgdG8gd2hhdGV2ZXIgd2FzIGJlZm9yZVxyXG4gICAgdGhpcy5yZXN1bHRzLm5leHQoZnVsbFJlc3VsdHMpO1xyXG4gICAgcmV0dXJuIGZ1bGxSZXN1bHRzO1xyXG4gIH1cclxuXHJcbiAgZ2V0TWluUHJpY2UoZnRzOiBGYXN0VHJhY2tRdW90ZVJlc3VsdEFycmF5KTogbnVtYmVyIHtcclxuICAgIHJldHVybiBmdHMucmVkdWNlKChtaW46IG51bWJlciwgZnQ6IEZhc3RUcmFja1F1b3RlUmVzdWx0KSA9PiB7XHJcbiAgICAgIGlmIChmdC5wcmljZSA8IG1pbikge1xyXG4gICAgICAgIG1pbiA9IGZ0LnByaWNlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBtaW47XHJcbiAgICB9LCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7XHJcbiAgfVxyXG5cclxuICBnZXRNYXhQcmljZShmdHM6IEZhc3RUcmFja1F1b3RlUmVzdWx0QXJyYXkpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIGZ0cy5yZWR1Y2UoKG1heDogbnVtYmVyLCBmdDogRmFzdFRyYWNrUXVvdGVSZXN1bHQpID0+IHtcclxuICAgICAgaWYgKGZ0LnByaWNlID4gbWF4KSB7XHJcbiAgICAgICAgbWF4ID0gZnQucHJpY2U7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG1heDtcclxuICAgIH0sIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSKTtcclxuICB9XHJcbn1cclxuIl19