@pmcretail/mapper-library 0.0.39 → 0.0.43

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 (69) hide show
  1. package/README.md +24 -24
  2. package/esm2022/lib/RJ-mapper.class.mjs +875 -0
  3. package/esm2022/lib/TransactionDocumentBuilder.mjs +1240 -0
  4. package/esm2022/lib/WebReturn-mapper.class.mjs +324 -0
  5. package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +410 -0
  6. package/esm2022/lib/basket.service.mjs +516 -0
  7. package/esm2022/lib/mapper-library.component.mjs +22 -0
  8. package/esm2022/lib/mapper-library.model.mjs +39 -0
  9. package/esm2022/lib/mapper-library.module.mjs +21 -0
  10. package/esm2022/lib/number-util.service.mjs +40 -0
  11. package/esm2022/pmcretail-mapper-library.mjs +5 -0
  12. package/esm2022/public-api.mjs +9 -0
  13. package/fesm2022/pmcretail-mapper-library.mjs +3482 -0
  14. package/fesm2022/pmcretail-mapper-library.mjs.map +1 -0
  15. package/index.d.ts +6 -0
  16. package/lib/RJ-mapper.class.d.ts +80 -79
  17. package/lib/RJ-mapper.class.d.ts.map +1 -0
  18. package/lib/TransactionDocumentBuilder.d.ts +271 -270
  19. package/lib/TransactionDocumentBuilder.d.ts.map +1 -0
  20. package/lib/WebReturn-mapper.class.d.ts +27 -26
  21. package/lib/WebReturn-mapper.class.d.ts.map +1 -0
  22. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
  23. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -0
  24. package/lib/basket.service.d.ts +105 -103
  25. package/lib/basket.service.d.ts.map +1 -0
  26. package/lib/mapper-library.component.d.ts +9 -5
  27. package/lib/mapper-library.component.d.ts.map +1 -0
  28. package/lib/mapper-library.model.d.ts +694 -693
  29. package/lib/mapper-library.model.d.ts.map +1 -0
  30. package/lib/mapper-library.module.d.ts +8 -2
  31. package/lib/mapper-library.module.d.ts.map +1 -0
  32. package/lib/number-util.service.d.ts +13 -9
  33. package/lib/number-util.service.d.ts.map +1 -0
  34. package/package.json +21 -17
  35. package/pmcretail-mapper-library.d.ts.map +1 -0
  36. package/public-api.d.ts +6 -5
  37. package/public-api.d.ts.map +1 -0
  38. package/bundles/pmcretail-mapper-library.umd.js +0 -8542
  39. package/bundles/pmcretail-mapper-library.umd.js.map +0 -1
  40. package/bundles/pmcretail-mapper-library.umd.min.js +0 -16
  41. package/bundles/pmcretail-mapper-library.umd.min.js.map +0 -1
  42. package/esm2015/lib/RJ-mapper.class.js +0 -1464
  43. package/esm2015/lib/TransactionDocumentBuilder.js +0 -1535
  44. package/esm2015/lib/WebReturn-mapper.class.js +0 -501
  45. package/esm2015/lib/WebReturnSalesforceMapper.class.js +0 -683
  46. package/esm2015/lib/basket.service.js +0 -851
  47. package/esm2015/lib/mapper-library.component.js +0 -27
  48. package/esm2015/lib/mapper-library.model.js +0 -1442
  49. package/esm2015/lib/mapper-library.module.js +0 -21
  50. package/esm2015/lib/number-util.service.js +0 -78
  51. package/esm2015/pmcretail-mapper-library.js +0 -10
  52. package/esm2015/public-api.js +0 -14
  53. package/esm5/lib/RJ-mapper.class.js +0 -1762
  54. package/esm5/lib/TransactionDocumentBuilder.js +0 -2469
  55. package/esm5/lib/WebReturn-mapper.class.js +0 -592
  56. package/esm5/lib/WebReturnSalesforceMapper.class.js +0 -857
  57. package/esm5/lib/basket.service.js +0 -1076
  58. package/esm5/lib/mapper-library.component.js +0 -29
  59. package/esm5/lib/mapper-library.model.js +0 -1442
  60. package/esm5/lib/mapper-library.module.js +0 -25
  61. package/esm5/lib/number-util.service.js +0 -95
  62. package/esm5/pmcretail-mapper-library.js +0 -10
  63. package/esm5/public-api.js +0 -14
  64. package/fesm2015/pmcretail-mapper-library.js +0 -6594
  65. package/fesm2015/pmcretail-mapper-library.js.map +0 -1
  66. package/fesm5/pmcretail-mapper-library.js +0 -8326
  67. package/fesm5/pmcretail-mapper-library.js.map +0 -1
  68. package/pmcretail-mapper-library.d.ts +0 -5
  69. package/pmcretail-mapper-library.metadata.json +0 -1
@@ -1,1076 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/basket.service.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import * as tslib_1 from "tslib";
7
- import { BehaviorSubject } from 'rxjs';
8
- import { DELIVERY_METHODS } from './mapper-library.model';
9
- var BasketService = /** @class */ (function () {
10
- function BasketService(numberUtilService) {
11
- this.numberUtilService = numberUtilService;
12
- this.currentBasket = {
13
- products: [],
14
- transactionDiscount: [],
15
- quantity: 0,
16
- total: 0,
17
- saleTotal: 0,
18
- baseCurrency: ''
19
- };
20
- this.basketSource = new BehaviorSubject(null);
21
- this.basket = this.basketSource.asObservable();
22
- this.productSource = new BehaviorSubject(null);
23
- this.product = this.productSource.asObservable();
24
- this.peerSource = new BehaviorSubject(false);
25
- this.peerSync = this.peerSource.asObservable();
26
- this.scanSource = new BehaviorSubject(false);
27
- this.scanner = this.scanSource.asObservable();
28
- }
29
- Object.defineProperty(BasketService.prototype, "isMixedBasketSales", {
30
- get: /**
31
- * @return {?}
32
- */
33
- function () {
34
- return this._isMixedBasketSales;
35
- },
36
- set: /**
37
- * @param {?} v
38
- * @return {?}
39
- */
40
- function (v) {
41
- this._isMixedBasketSales = v;
42
- },
43
- enumerable: true,
44
- configurable: true
45
- });
46
- /**
47
- * @param {?} basket
48
- * @return {?}
49
- */
50
- BasketService.prototype.updateBasket = /**
51
- * @param {?} basket
52
- * @return {?}
53
- */
54
- function (basket) {
55
- this.currentBasket = basket;
56
- this.isMixedBasketSales = this.filterProductListWithWebOrder(true).length > 0;
57
- this.basketSource.next(basket);
58
- };
59
- /**
60
- * calculates the total basket value and quantity
61
- * @param null
62
- * @returns void
63
- */
64
- /**
65
- * calculates the total basket value and quantity
66
- * @param {?} basketDetails
67
- * @param {?} basketState
68
- * @return {?} void
69
- */
70
- BasketService.prototype.updateBasketTotal = /**
71
- * calculates the total basket value and quantity
72
- * @param {?} basketDetails
73
- * @param {?} basketState
74
- * @return {?} void
75
- */
76
- function (basketDetails, basketState) {
77
- var e_1, _a;
78
- basketDetails.quantity = 0;
79
- basketDetails.total = 0;
80
- try {
81
- for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
82
- var p = _c.value;
83
- basketDetails.quantity = basketDetails.quantity + p.quantity;
84
- basketDetails.total =
85
- this.numberUtilService.trimTo2Decimal(basketDetails.total) +
86
- this.numberUtilService.trimTo2Decimal(p.total);
87
- }
88
- }
89
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
90
- finally {
91
- try {
92
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
93
- }
94
- finally { if (e_1) throw e_1.error; }
95
- }
96
- console.log("e:basket :basket service : basketDetails updated values for transaction id", basketDetails.transactionId, JSON.stringify(basketDetails));
97
- basketDetails.basketTotal = basketDetails.total;
98
- basketState.updateBasket(basketDetails);
99
- };
100
- /**
101
- * add Line promotion
102
- * @param null
103
- * @returns basketDetails
104
- */
105
- /**
106
- * add Line promotion
107
- * @param {?} promotionList
108
- * @param {?} basketDetails
109
- * @return {?} basketDetails
110
- */
111
- BasketService.prototype.addlinePromotion = /**
112
- * add Line promotion
113
- * @param {?} promotionList
114
- * @param {?} basketDetails
115
- * @return {?} basketDetails
116
- */
117
- function (promotionList, basketDetails) {
118
- var e_2, _a, e_3, _b;
119
- console.log("e:basket :basket Service : promotionList and basketDetails for linePromotions", JSON.stringify(promotionList), JSON.stringify(basketDetails));
120
- if (promotionList &&
121
- promotionList.result &&
122
- promotionList.result.linePromotions &&
123
- promotionList.result.linePromotions.length > 0) {
124
- try {
125
- for (var _c = tslib_1.__values(basketDetails.products), _d = _c.next(); !_d.done; _d = _c.next()) {
126
- var element = _d.value;
127
- try {
128
- for (var _e = (e_3 = void 0, tslib_1.__values(promotionList.result.linePromotions)), _f = _e.next(); !_f.done; _f = _e.next()) {
129
- var promotionelement = _f.value;
130
- if (element.itemLineId.toString() ===
131
- promotionelement.itemLineId.toString()) {
132
- element.linePromotions = promotionelement;
133
- }
134
- }
135
- }
136
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
137
- finally {
138
- try {
139
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
140
- }
141
- finally { if (e_3) throw e_3.error; }
142
- }
143
- }
144
- }
145
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
146
- finally {
147
- try {
148
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
149
- }
150
- finally { if (e_2) throw e_2.error; }
151
- }
152
- }
153
- return basketDetails;
154
- };
155
- /**
156
- * add Transaction promotion
157
- * @param null
158
- * @returns basketDetails
159
- */
160
- /**
161
- * add Transaction promotion
162
- * @param {?} promotionList
163
- * @param {?} basketdetails
164
- * @return {?} basketDetails
165
- */
166
- BasketService.prototype.addTransactionPromotion = /**
167
- * add Transaction promotion
168
- * @param {?} promotionList
169
- * @param {?} basketdetails
170
- * @return {?} basketDetails
171
- */
172
- function (promotionList, basketdetails) {
173
- var _this = this;
174
- console.log("e:basket :basket Service : promotionList and basketDetails for transactionPromotion", JSON.stringify(promotionList), JSON.stringify(basketdetails), JSON.stringify(basketdetails.transactionPromotion));
175
- if (promotionList &&
176
- promotionList.result &&
177
- promotionList.result.transactionPromotion &&
178
- promotionList.result.transactionPromotion.length > 0) {
179
- promotionList.result.transactionPromotion.forEach((/**
180
- * @param {?} tPromotion
181
- * @return {?}
182
- */
183
- function (tPromotion) {
184
- /** @type {?} */
185
- var transactionPromotionEntryUpdated = Object.assign({}, tPromotion);
186
- transactionPromotionEntryUpdated.itemLineIds = basketdetails.products.map((/**
187
- * @param {?} product
188
- * @return {?}
189
- */
190
- function (product) {
191
- return product.itemLineId;
192
- }));
193
- if (!basketdetails.transactionPromotion) {
194
- basketdetails.transactionPromotion = [];
195
- }
196
- basketdetails.transactionPromotion.push(transactionPromotionEntryUpdated);
197
- basketdetails = _this.transactionPromotionProductPortionCalc(basketdetails, transactionPromotionEntryUpdated);
198
- }));
199
- }
200
- console.log("basket details in refund calculation file", JSON.stringify(basketdetails));
201
- return basketdetails;
202
- };
203
- /**
204
- * @param {?} basketDetails
205
- * @return {?}
206
- */
207
- BasketService.prototype.updateProductTotalForSummary = /**
208
- * @param {?} basketDetails
209
- * @return {?}
210
- */
211
- function (basketDetails) {
212
- /*sale- product refundedQuantity = undefined
213
- partial refund - product refundedQuantity is > 0
214
- total refund - proudct refundedQuantity is > 0
215
- exchange - exchange product refundedQuantity is > 0
216
- new product refundedQuantity = undefined
217
- old product without exchange refundedQuantity = 0
218
- unreference refund-product refundedQuantity is > 0 */
219
- var e_4, _a;
220
- basketDetails.total = 0;
221
- basketDetails.quantity = 0;
222
- try {
223
- for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
224
- var product = _c.value;
225
- if (product.linePromotions) {
226
- product.total = product.linePromotions.promotionLinePrice;
227
- }
228
- else if (product.lineDiscount && !product.linePromotions) {
229
- product.total = product.lineDiscount.discountedLinePrice;
230
- }
231
- else {
232
- product.total = product.totalLinePrice;
233
- }
234
- product.total =
235
- product.total -
236
- Math.abs(product.refundedTotal ? product.refundedTotal : 0);
237
- basketDetails.total += product.total;
238
- basketDetails.quantity =
239
- basketDetails.quantity +
240
- (product.quantity -
241
- (product.refundedQuantity ? product.refundedQuantity : 0));
242
- console.log("e-basket:ExchangeSummaryScreen:update basketdetails total :" +
243
- basketDetails.total +
244
- " Product line ID : " +
245
- product.itemLineId +
246
- " product total : " +
247
- product.total, "quantity : " + basketDetails.quantity);
248
- }
249
- }
250
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
251
- finally {
252
- try {
253
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
254
- }
255
- finally { if (e_4) throw e_4.error; }
256
- }
257
- return this.updateBasketTotalForSummary(basketDetails);
258
- };
259
- /**
260
- * @param {?} basketDetails
261
- * @return {?}
262
- */
263
- BasketService.prototype.updateBasketTotalForSummary = /**
264
- * @param {?} basketDetails
265
- * @return {?}
266
- */
267
- function (basketDetails) {
268
- basketDetails.basketTotal = basketDetails.total;
269
- console.info("ebasket : basket Service : update Basket Total for transaction transactionDiscount ", JSON.stringify(basketDetails.transactionDiscount));
270
- console.info("ebasket : basket Service : update Basket Total for transaction transactionPromotion ", JSON.stringify(basketDetails.transactionPromotion));
271
- basketDetails = this.updateTransactionPromotion(basketDetails);
272
- basketDetails = this.updateTransactionDiscount(basketDetails);
273
- basketDetails.basketTotal = Number(basketDetails.basketTotal.toFixed(2));
274
- console.info("ebasket : basket Service : update Basket Total: basketTotal after promotion applied for basketTotal", basketDetails.basketTotal);
275
- return basketDetails;
276
- };
277
- /**
278
- * @param {?} basketDetails
279
- * @return {?}
280
- */
281
- BasketService.prototype.updateTransactionDiscount = /**
282
- * @param {?} basketDetails
283
- * @return {?}
284
- */
285
- function (basketDetails) {
286
- if (basketDetails.transactionDiscount &&
287
- basketDetails.transactionDiscount.length > 0) {
288
- /** @type {?} */
289
- var discountTotal = basketDetails.transactionDiscount.reduce((/**
290
- * @param {?} n
291
- * @param {?} __1
292
- * @return {?}
293
- */
294
- function (n, _a) {
295
- var discountAmount = _a.discountAmount;
296
- return n + discountAmount;
297
- }), 0);
298
- console.log("ebasket : basket Service : discountTotal ", discountTotal);
299
- basketDetails.basketTotal =
300
- basketDetails.basketTotal - Math.abs(discountTotal);
301
- }
302
- return basketDetails;
303
- };
304
- /**
305
- * @param {?} basketDetails
306
- * @return {?}
307
- */
308
- BasketService.prototype.updateTransactionPromotion = /**
309
- * @param {?} basketDetails
310
- * @return {?}
311
- */
312
- function (basketDetails) {
313
- if (basketDetails.transactionPromotion &&
314
- basketDetails.transactionPromotion.length > 0) {
315
- /** @type {?} */
316
- var discountTotal = basketDetails.transactionPromotion.reduce((/**
317
- * @param {?} n
318
- * @param {?} __1
319
- * @return {?}
320
- */
321
- function (n, _a) {
322
- var promotionAmount = _a.promotionAmount;
323
- return n + promotionAmount;
324
- }), 0);
325
- basketDetails.basketTotal =
326
- basketDetails.basketTotal - Math.abs(discountTotal);
327
- }
328
- return basketDetails;
329
- };
330
- /**
331
- * @param {?} basket
332
- * @return {?}
333
- */
334
- BasketService.prototype.updateBasketTotalWithoutDiscount = /**
335
- * @param {?} basket
336
- * @return {?}
337
- */
338
- function (basket) {
339
- var e_5, _a;
340
- basket.total = 0;
341
- basket.quantity = 0;
342
- try {
343
- for (var _b = tslib_1.__values(basket.products), _c = _b.next(); !_c.done; _c = _b.next()) {
344
- var product = _c.value;
345
- if (product.linePromotions) {
346
- product.total = product.linePromotions.promotionLinePrice;
347
- }
348
- else if (product.lineDiscount && !product.linePromotions) {
349
- product.total = product.lineDiscount.discountedLinePrice || 0;
350
- }
351
- else {
352
- product.total = product.totalLinePrice;
353
- }
354
- product.total =
355
- product.total -
356
- Math.abs(product.refundedTotal ? product.refundedTotal : 0);
357
- basket.total += product.total;
358
- basket.quantity =
359
- basket.quantity +
360
- (product.quantity -
361
- (product.refundedQuantity ? product.refundedQuantity : 0));
362
- console.log("e-basket:basket service:update basketdetails total :" +
363
- JSON.stringify(basket) +
364
- basket.total +
365
- " Product line ID : " +
366
- product.itemLineId +
367
- " product total : " +
368
- product.total);
369
- }
370
- }
371
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
372
- finally {
373
- try {
374
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
375
- }
376
- finally { if (e_5) throw e_5.error; }
377
- }
378
- basket.basketTotal = basket.total;
379
- return basket;
380
- };
381
- /**
382
- * @param {?} basket
383
- * @return {?}
384
- */
385
- BasketService.prototype.updateBasketTotalWithDiscounts = /**
386
- * @param {?} basket
387
- * @return {?}
388
- */
389
- function (basket) {
390
- console.log("e:basket :RefundBasketScreen : this.basketDetails new values", basket, JSON.stringify(basket.basketTotal));
391
- if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
392
- /** @type {?} */
393
- var discountTotal = basket.transactionPromotion.reduce((/**
394
- * @param {?} n
395
- * @param {?} __1
396
- * @return {?}
397
- */
398
- function (n, _a) {
399
- var promotionAmount = _a.promotionAmount;
400
- return n + promotionAmount;
401
- }), 0);
402
- basket.basketTotal = basket.basketTotal - discountTotal;
403
- }
404
- if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
405
- /** @type {?} */
406
- var discountTotal = basket.transactionDiscount.reduce((/**
407
- * @param {?} n
408
- * @param {?} __1
409
- * @return {?}
410
- */
411
- function (n, _a) {
412
- var discountAmount = _a.discountAmount;
413
- return n + discountAmount;
414
- }), 0);
415
- basket.basketTotal = basket.basketTotal - discountTotal;
416
- }
417
- console.log("e:basket :RefundBasketScreen : basket new values", JSON.stringify(basket));
418
- return basket;
419
- };
420
- /**
421
- * @param {?} basket
422
- * @return {?}
423
- */
424
- BasketService.prototype.transactionDiscountAndPromotionProductortionCalculation = /**
425
- * @param {?} basket
426
- * @return {?}
427
- */
428
- function (basket) {
429
- var _this = this;
430
- if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
431
- basket.transactionDiscount.forEach((/**
432
- * @param {?} discount
433
- * @return {?}
434
- */
435
- function (discount) {
436
- return (basket = _this.transactionDiscountProductPortionCalc(basket, discount));
437
- }));
438
- }
439
- if (basket.transactionPromotion && basket.transactionPromotion.length > 0) {
440
- basket.transactionPromotion.forEach((/**
441
- * @param {?} promotion
442
- * @return {?}
443
- */
444
- function (promotion) {
445
- basket = _this.transactionPromotionProductPortionCalc(basket, promotion);
446
- }));
447
- }
448
- console.log("ebasket: basket item discount protion calculation", basket, basket.products);
449
- return basket;
450
- };
451
- /**
452
- * @param {?} basket
453
- * @param {?} promotion
454
- * @return {?}
455
- */
456
- BasketService.prototype.transactionPromotionProductPortionCalc = /**
457
- * @param {?} basket
458
- * @param {?} promotion
459
- * @return {?}
460
- */
461
- function (basket, promotion) {
462
- var _this = this;
463
- /** @type {?} */
464
- var total = 0;
465
- /** @type {?} */
466
- var percentage = 0;
467
- {
468
- basket.products.forEach((/**
469
- * @param {?} p
470
- * @return {?}
471
- */
472
- function (p) {
473
- if (promotion.itemLineIds.includes(p.itemLineId)) {
474
- p = _this.validateProductItemDiscount(p);
475
- /** @type {?} */
476
- var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
477
- _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
478
- _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
479
- total += (p.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
480
- }
481
- }));
482
- console.log("ebasket: trnsactionPromotion: " + JSON.stringify(promotion) + ", selected products total: " + total);
483
- basket.products.forEach((/**
484
- * @param {?} product
485
- * @return {?}
486
- */
487
- function (product) {
488
- product = _this.validateProductItemDiscount(product);
489
- /** @type {?} */
490
- var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
491
- _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
492
- _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
493
- if (promotion.itemLineIds.includes(product.itemLineId)) {
494
- percentage = ((product.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
495
- product.itemDiscounts.trnPromotionsPortion +=
496
- (promotion.promotionAmount * percentage) / 100;
497
- product.itemDiscounts.trnPromotionsPortion = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion);
498
- }
499
- }));
500
- }
501
- return basket;
502
- };
503
- /**
504
- * @param {?} basket
505
- * @param {?} discount
506
- * @return {?}
507
- */
508
- BasketService.prototype.transactionDiscountProductPortionCalc = /**
509
- * @param {?} basket
510
- * @param {?} discount
511
- * @return {?}
512
- */
513
- function (basket, discount) {
514
- var _this = this;
515
- /** @type {?} */
516
- var total = 0;
517
- /** @type {?} */
518
- var percentage = 0;
519
- basket.products.forEach((/**
520
- * @param {?} p
521
- * @return {?}
522
- */
523
- function (p) {
524
- if (discount.itemLineIds.includes(p.itemLineId)) {
525
- p = _this.validateProductItemDiscount(p);
526
- /** @type {?} */
527
- var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnDiscountsPortion) +
528
- _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.trnPromotionsPortion) -
529
- _this.numberUtilService.trimTo2Decimal2(p.itemDiscounts.refundPortion);
530
- total += (p.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal));
531
- }
532
- }));
533
- console.log("ebasket: trnsactionDiscount: " + JSON.stringify(discount) + ", selected products total: " + total);
534
- basket.products.forEach((/**
535
- * @param {?} product
536
- * @return {?}
537
- */
538
- function (product) {
539
- product = _this.validateProductItemDiscount(product);
540
- console.log(product.discountable, "ebasket : basket service : discountable in basket service");
541
- /** @type {?} */
542
- var productContributionInTotal = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion) +
543
- _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnPromotionsPortion) -
544
- _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.refundPortion);
545
- if (discount.itemLineIds.includes(product.itemLineId) && product.discountable == true) {
546
- percentage = ((product.total - _this.numberUtilService.trimTo2Decimal2(productContributionInTotal)) / total) * 100;
547
- product.itemDiscounts.trnDiscountsPortion +=
548
- (discount.discountAmount * percentage) / 100;
549
- product.itemDiscounts.trnDiscountsPortion = _this.numberUtilService.trimTo2Decimal2(product.itemDiscounts.trnDiscountsPortion);
550
- }
551
- }));
552
- return basket;
553
- };
554
- /**
555
- * @param {?} product
556
- * @return {?}
557
- */
558
- BasketService.prototype.validateProductItemDiscount = /**
559
- * @param {?} product
560
- * @return {?}
561
- */
562
- function (product) {
563
- if (!product.itemDiscounts) {
564
- product.itemDiscounts = {
565
- trnDiscountsPortion: 0,
566
- trnPromotionsPortion: 0,
567
- refundPortion: 0,
568
- };
569
- }
570
- return product;
571
- };
572
- /**
573
- * @param {?} product
574
- * @return {?}
575
- */
576
- BasketService.prototype.markProduct = /**
577
- * @param {?} product
578
- * @return {?}
579
- */
580
- function (product) {
581
- this.productSource.next(product);
582
- };
583
- /**
584
- * @param {?} peerSync
585
- * @return {?}
586
- */
587
- BasketService.prototype.stopPeerSyncProcess = /**
588
- * @param {?} peerSync
589
- * @return {?}
590
- */
591
- function (peerSync) {
592
- this.peerSource.next(peerSync);
593
- };
594
- /**
595
- * @param {?} isScanning
596
- * @return {?}
597
- */
598
- BasketService.prototype.scanStart = /**
599
- * @param {?} isScanning
600
- * @return {?}
601
- */
602
- function (isScanning) {
603
- this.scanSource.next(isScanning);
604
- };
605
- /**
606
- * @param {?} promotion
607
- * @return {?}
608
- */
609
- BasketService.prototype.promotionRemainingCalculation = /**
610
- * @param {?} promotion
611
- * @return {?}
612
- */
613
- function (promotion) {
614
- /** @type {?} */
615
- var promotionValue = 0;
616
- promotion.forEach((/**
617
- * @param {?} element
618
- * @return {?}
619
- */
620
- function (element) {
621
- promotionValue += element.promotionAmount;
622
- }));
623
- return promotionValue;
624
- };
625
- /**
626
- * @param {?} discount
627
- * @return {?}
628
- */
629
- BasketService.prototype.discountRemainingCalculation = /**
630
- * @param {?} discount
631
- * @return {?}
632
- */
633
- function (discount) {
634
- /** @type {?} */
635
- var discountValue = 0;
636
- discount.forEach((/**
637
- * @param {?} element
638
- * @return {?}
639
- */
640
- function (element) {
641
- discountValue += element.discountAmount;
642
- }));
643
- return discountValue;
644
- };
645
- /**
646
- * @param {?} discount
647
- * @return {?}
648
- */
649
- BasketService.prototype.discountRefundedCalculation = /**
650
- * @param {?} discount
651
- * @return {?}
652
- */
653
- function (discount) {
654
- /** @type {?} */
655
- var discountValue = 0;
656
- discount.forEach((/**
657
- * @param {?} element
658
- * @return {?}
659
- */
660
- function (element) {
661
- if (element.discountAmount < 0) {
662
- discountValue += element.discountAmount;
663
- }
664
- }));
665
- return discountValue;
666
- };
667
- /**
668
- * @param {?} products
669
- * @return {?}
670
- */
671
- BasketService.prototype.generateNewItemLineId = /**
672
- * @param {?} products
673
- * @return {?}
674
- */
675
- function (products) {
676
- /** @type {?} */
677
- var largestNumber = 0;
678
- if (products.length > 0) {
679
- /** @type {?} */
680
- var itemLineIdArray = products.map((/**
681
- * @param {?} product
682
- * @return {?}
683
- */
684
- function (product) {
685
- return product.itemLineId;
686
- }));
687
- largestNumber = itemLineIdArray.reduce((/**
688
- * @param {?} a
689
- * @param {?} b
690
- * @return {?}
691
- */
692
- function (a, b) { return Math.max(a, b); }));
693
- }
694
- return largestNumber + 1;
695
- };
696
- /**
697
- * @param {?} product
698
- * @param {?} quantity
699
- * @return {?}
700
- */
701
- BasketService.prototype.updateBasketProductDataAsPerQuantity = /**
702
- * @param {?} product
703
- * @param {?} quantity
704
- * @return {?}
705
- */
706
- function (product, quantity) {
707
- console.log("ebasket: updateBasketProductDataAsPerQuantity : " + quantity + " product: " + JSON.stringify(product));
708
- product.quantity = quantity;
709
- if (product.hasOwnProperty("lineDiscount")) {
710
- // && this.product.quantity !== this.productDetailForm.controls.quantity.value
711
- product.lineDiscount.discountedLinePrice = Number(this.numberUtilService.getFlooredFixed(product.lineDiscount.unitPrice * quantity, 2));
712
- product.lineDiscount.discountAmount =
713
- product.totalLinePrice - product.lineDiscount.discountedLinePrice;
714
- }
715
- else {
716
- product.totalLinePrice =
717
- quantity * this.numberUtilService.trimTo2Decimal(product.selectedPrice);
718
- }
719
- if (product.lineDiscount) {
720
- product.total = product.lineDiscount.discountedLinePrice;
721
- }
722
- else {
723
- product.total = product.totalLinePrice;
724
- }
725
- console.log("ebasket: updateBasketProductDataAsPerQuantity : " + quantity + " product: " + JSON.stringify(product));
726
- return product;
727
- };
728
- /**
729
- * @param {?} isWebOrder
730
- * @return {?}
731
- */
732
- BasketService.prototype.filterProductListWithWebOrder = /**
733
- * @param {?} isWebOrder
734
- * @return {?}
735
- */
736
- function (isWebOrder) {
737
- console.log("ebasket: filterProductListWithWebOrder hit", JSON.stringify(this.currentBasket.products));
738
- if (isWebOrder)
739
- return this.currentBasket.products.filter((/**
740
- * @param {?} x
741
- * @return {?}
742
- */
743
- function (x) { return x.isWebOrder; }));
744
- else {
745
- return this.currentBasket.products.filter((/**
746
- * @param {?} x
747
- * @return {?}
748
- */
749
- function (x) { return !x.isWebOrder; }));
750
- }
751
- };
752
- /**
753
- * @return {?}
754
- */
755
- BasketService.prototype.filterProductListWithDelivery = /**
756
- * @return {?}
757
- */
758
- function () {
759
- console.log("ebasket: filterProductListWithDelivery hit", JSON.stringify(this.currentBasket.products));
760
- return this.currentBasket.products.filter((/**
761
- * @param {?} x
762
- * @return {?}
763
- */
764
- function (x) { return x.deliveryMethod === DELIVERY_METHODS.DELIVERY.toString(); }));
765
- };
766
- /**
767
- * @param {?} group
768
- * @param {?} products
769
- * @return {?}
770
- */
771
- BasketService.prototype.filterProductListWithDeliveryGroup = /**
772
- * @param {?} group
773
- * @param {?} products
774
- * @return {?}
775
- */
776
- function (group, products) {
777
- console.log("ebasket: filterProductListWithDeliveryGroup hit", JSON.stringify(products));
778
- return products.filter((/**
779
- * @param {?} x
780
- * @return {?}
781
- */
782
- function (x) { return x.deliveryGroup === group; }));
783
- };
784
- /**
785
- * @param {?} products
786
- * @return {?}
787
- */
788
- BasketService.prototype.generateNewDeliveryGroupNumber = /**
789
- * @param {?} products
790
- * @return {?}
791
- */
792
- function (products) {
793
- /** @type {?} */
794
- var largestNumber = 0;
795
- if (products.length > 0) {
796
- /** @type {?} */
797
- var deliveryGroupArr = products.map((/**
798
- * @param {?} product
799
- * @return {?}
800
- */
801
- function (product) {
802
- if (product.deliveryGroup) {
803
- return parseInt(product.deliveryGroup);
804
- }
805
- return 0;
806
- }));
807
- largestNumber = deliveryGroupArr.reduce((/**
808
- * @param {?} a
809
- * @param {?} b
810
- * @return {?}
811
- */
812
- function (a, b) { return Math.max(a, b); }));
813
- }
814
- return (largestNumber + 1).toString();
815
- };
816
- /**
817
- * @param {?} products
818
- * @return {?}
819
- */
820
- BasketService.prototype.getDeliveryGroupNumbers = /**
821
- * @param {?} products
822
- * @return {?}
823
- */
824
- function (products) {
825
- console.log("getDeliveryGroupNumbers initiating : ", JSON.stringify(products));
826
- /** @type {?} */
827
- var uniqueAndsortedResult = [];
828
- if (products.length > 0) {
829
- /** @type {?} */
830
- var deliveryGroupArr = products.map((/**
831
- * @param {?} product
832
- * @return {?}
833
- */
834
- function (product) {
835
- if (product.deliveryGroup) {
836
- return parseInt(product.deliveryGroup);
837
- }
838
- else if (product.deliveryMethod === "1") {
839
- return 1;
840
- }
841
- return 0;
842
- }));
843
- uniqueAndsortedResult = Array.from(new Set(deliveryGroupArr)).sort((/**
844
- * @param {?} a
845
- * @param {?} b
846
- * @return {?}
847
- */
848
- function (a, b) { return a - b; }));
849
- console.log("getDeliveryGroupNumbers : ", JSON.stringify(uniqueAndsortedResult));
850
- }
851
- return uniqueAndsortedResult;
852
- };
853
- /**
854
- * @param {?} products
855
- * @return {?}
856
- */
857
- BasketService.prototype.updateProductsWithNewDeliveryGroupNumber = /**
858
- * @param {?} products
859
- * @return {?}
860
- */
861
- function (products) {
862
- console.log("updateProductsWithNewDeliveryGroupNumber initiating : ", JSON.stringify(products));
863
- /** @type {?} */
864
- var newGroupNumber = this.generateNewDeliveryGroupNumber(this.currentBasket.products);
865
- if (products.length > 0) {
866
- this.currentBasket.products.forEach((/**
867
- * @param {?} cBProducts
868
- * @return {?}
869
- */
870
- function (cBProducts) {
871
- products.forEach((/**
872
- * @param {?} element
873
- * @return {?}
874
- */
875
- function (element) {
876
- if (cBProducts.itemLineId === element.itemLineId) {
877
- cBProducts.deliveryGroup = newGroupNumber;
878
- }
879
- }));
880
- }));
881
- }
882
- this.updateBasket(this.currentBasket);
883
- return;
884
- };
885
- /**
886
- * @param {?} products
887
- * @return {?}
888
- */
889
- BasketService.prototype.calculateEstimatedTime = /**
890
- * @param {?} products
891
- * @return {?}
892
- */
893
- function (products) {
894
- try {
895
- /** @type {?} */
896
- var time_1;
897
- /** @type {?} */
898
- var estmatedTime_1 = 0;
899
- /** @type {?} */
900
- var estimatedDays_1 = "Hours";
901
- products.forEach((/**
902
- * @param {?} element
903
- * @return {?}
904
- */
905
- function (element) {
906
- if (element.leadTime.type.toLocaleLowerCase() === "weeks") {
907
- time_1 = Number(element.leadTime.value) * 24 * 7;
908
- estmatedTime_1 = Math.max(estmatedTime_1, time_1);
909
- estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
910
- console.log("week", estmatedTime_1, estimatedDays_1);
911
- }
912
- else if (element.leadTime.type.toLocaleLowerCase() === "days") {
913
- time_1 = Number(element.leadTime.value) * 24;
914
- estmatedTime_1 = Math.max(estmatedTime_1, time_1);
915
- estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
916
- console.log("days", estmatedTime_1, estimatedDays_1);
917
- }
918
- else if (element.leadTime.type.toLocaleLowerCase() === "months") {
919
- time_1 = Number(element.leadTime.value) * 24 * 30;
920
- estmatedTime_1 = Math.max(estmatedTime_1, time_1);
921
- estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
922
- console.log("months", estmatedTime_1, estimatedDays_1);
923
- }
924
- else if (element.leadTime.type.toLocaleLowerCase() === "years") {
925
- time_1 = Number(element.leadTime.value) * 24 * 365;
926
- estmatedTime_1 = Math.max(estmatedTime_1, time_1);
927
- estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
928
- console.log("years", estmatedTime_1, estimatedDays_1);
929
- }
930
- else {
931
- time_1 = Number(element.leadTime.value);
932
- estmatedTime_1 = Math.max(estmatedTime_1, time_1);
933
- estimatedDays_1 = (estmatedTime_1 === time_1) ? element.leadTime.type : estimatedDays_1;
934
- console.log("hours", estmatedTime_1, estimatedDays_1);
935
- }
936
- }));
937
- if (estimatedDays_1.toLocaleLowerCase() === "days") {
938
- estmatedTime_1 = estmatedTime_1 / 24;
939
- }
940
- else if (estimatedDays_1.toLocaleLowerCase() === "weeks") {
941
- estmatedTime_1 = estmatedTime_1 / (24 * 7);
942
- }
943
- else if (estimatedDays_1.toLocaleLowerCase() === "months") {
944
- estmatedTime_1 = estmatedTime_1 / (24 * 30);
945
- }
946
- else if (estimatedDays_1.toLocaleLowerCase() === "years") {
947
- estmatedTime_1 = estmatedTime_1 / (24 * 365);
948
- }
949
- /** @type {?} */
950
- var estimate = {
951
- value: estmatedTime_1.toString(),
952
- type: estimatedDays_1
953
- };
954
- return estimate;
955
- }
956
- catch (error) {
957
- console.log("error in calculateEstimatedTime", error);
958
- }
959
- return 0;
960
- };
961
- /**
962
- * @param {?} oldGroup
963
- * @param {?} newGroup
964
- * @return {?}
965
- */
966
- BasketService.prototype.updateProductsWithDeliveryGroupNumber = /**
967
- * @param {?} oldGroup
968
- * @param {?} newGroup
969
- * @return {?}
970
- */
971
- function (oldGroup, newGroup) {
972
- console.log("updateProductsWithDeliveryGroupNumber initiating");
973
- this.currentBasket.products.forEach((/**
974
- * @param {?} cBProducts
975
- * @return {?}
976
- */
977
- function (cBProducts) {
978
- if (cBProducts.deliveryGroup === oldGroup) {
979
- cBProducts.deliveryGroup = newGroup;
980
- }
981
- }));
982
- this.updateBasket(this.currentBasket);
983
- return;
984
- };
985
- /**
986
- * @return {?}
987
- */
988
- BasketService.prototype.getDeliveryInfo = /**
989
- * @return {?}
990
- */
991
- function () {
992
- var _this = this;
993
- console.log("getDeliveryGroupInfor initiating");
994
- try {
995
- /** @type {?} */
996
- var groupInfo_1 = {
997
- groups: []
998
- };
999
- this.getDeliveryGroupNumbers(this.currentBasket.products).forEach((/**
1000
- * @param {?} groupNumber
1001
- * @return {?}
1002
- */
1003
- function (groupNumber) {
1004
- /** @type {?} */
1005
- var group = {
1006
- groupNumber: groupNumber,
1007
- items: [],
1008
- estimate: {
1009
- type: "Hours",
1010
- value: "0"
1011
- }
1012
- };
1013
- _this.currentBasket.products.forEach((/**
1014
- * @param {?} cBProducts
1015
- * @return {?}
1016
- */
1017
- function (cBProducts) {
1018
- if (cBProducts.deliveryGroup === groupNumber.toString()) {
1019
- group.items.push(cBProducts);
1020
- }
1021
- }));
1022
- group.estimate = _this.calculateEstimatedTime(group.items);
1023
- groupInfo_1.groups.push(group);
1024
- }));
1025
- return groupInfo_1;
1026
- }
1027
- catch (error) {
1028
- console.log("error", error);
1029
- }
1030
- };
1031
- return BasketService;
1032
- }());
1033
- export { BasketService };
1034
- if (false) {
1035
- /** @type {?} */
1036
- BasketService.prototype.currentBasket;
1037
- /**
1038
- * @type {?}
1039
- * @private
1040
- */
1041
- BasketService.prototype.basketSource;
1042
- /** @type {?} */
1043
- BasketService.prototype.basket;
1044
- /**
1045
- * @type {?}
1046
- * @private
1047
- */
1048
- BasketService.prototype.productSource;
1049
- /** @type {?} */
1050
- BasketService.prototype.product;
1051
- /**
1052
- * @type {?}
1053
- * @private
1054
- */
1055
- BasketService.prototype.peerSource;
1056
- /** @type {?} */
1057
- BasketService.prototype.peerSync;
1058
- /**
1059
- * @type {?}
1060
- * @private
1061
- */
1062
- BasketService.prototype.scanSource;
1063
- /** @type {?} */
1064
- BasketService.prototype.scanner;
1065
- /**
1066
- * @type {?}
1067
- * @private
1068
- */
1069
- BasketService.prototype._isMixedBasketSales;
1070
- /**
1071
- * @type {?}
1072
- * @private
1073
- */
1074
- BasketService.prototype.numberUtilService;
1075
- }
1076
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFza2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcG1jcmV0YWlsL21hcHBlci1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL2Jhc2tldC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFLMUQ7SUErQkUsdUJBQW9CLGlCQUFvQztRQUFwQyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBOUJ4RCxrQkFBYSxHQUFXO1lBQ3RCLFFBQVEsRUFBRSxFQUFFO1lBQ1osbUJBQW1CLEVBQUUsRUFBRTtZQUN2QixRQUFRLEVBQUUsQ0FBQztZQUNYLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLENBQUM7WUFDWixZQUFZLEVBQUUsRUFBRTtTQUNqQixDQUFDO1FBRU0saUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBTSxJQUFJLENBQUMsQ0FBQztRQUN0RCxXQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxrQkFBYSxHQUFHLElBQUksZUFBZSxDQUFNLElBQUksQ0FBQyxDQUFDO1FBQ3ZELFlBQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRXBDLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN6RCxhQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVsQyxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDekQsWUFBTyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsWUFBWSxFQUFFLENBQUM7SUFXbUIsQ0FBQztJQVI3RCxzQkFBVyw2Q0FBa0I7Ozs7UUFBN0I7WUFDRSxPQUFPLElBQUksQ0FBQyxtQkFB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LENBQUMsT0FBTzs7OztnQkFBQyxVQUFBLFVBQVU7b0JBQzVDLElBQUksVUFBVSxDQUFDLGFBQWEsS0FBSyxXQUFXLENBQUMsUUFBUSxFQUFFLEVBQUU7d0JBQ3ZELEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUM5QjtnQkFDSCxDQUFDLEVBQUMsQ0FBQztnQkFFSCxLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTFELFdBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRS9CLENBQUMsRUFBQyxDQUFDO1lBRUgsT0FBTyxXQUFTLENBQUM7U0FDbEI7UUFDRCxPQUFPLEtBQUssRUFBRTtZQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzdCO0lBQ0gsQ0FBQztJQUNILG9CQUFDO0FBQUQsQ0FBQyxBQTVyQkQsSUE0ckJDOzs7O0lBM3JCQyxzQ0FPRTs7Ozs7SUFFRixxQ0FBc0Q7O0lBQ3RELCtCQUEwQzs7Ozs7SUFFMUMsc0NBQXVEOztJQUN2RCxnQ0FBNEM7Ozs7O0lBRTVDLG1DQUF5RDs7SUFDekQsaUNBQTBDOzs7OztJQUUxQyxtQ0FBeUQ7O0lBQ3pELGdDQUF5Qzs7Ozs7SUFFekMsNENBQWlEOzs7OztJQVNyQywwQ0FBNEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBERUxJVkVSWV9NRVRIT0RTIH0gZnJvbSAnLi9tYXBwZXItbGlicmFyeS5tb2RlbCc7XHJcbmltcG9ydCB7IEJhc2tldCwgRGVsaXZlcnlHcm91cEluZm8sIERlbGl2ZXJ5SW5mbywgUHJvZHVjdCwgVHJhbnNhY3Rpb25Qcm9tb3Rpb24gfSBmcm9tICcuL21hcHBlci1saWJyYXJ5Lm1vZGVsJztcclxuaW1wb3J0IHsgVHJhbnNhY3Rpb25EaXNjb3VudCB9IGZyb20gJy4vbWFwcGVyLWxpYnJhcnkubW9kZWwnO1xyXG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gJy4vbnVtYmVyLXV0aWwuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgQmFza2V0U2VydmljZSB7XHJcbiAgY3VycmVudEJhc2tldDogQmFza2V0ID0ge1xyXG4gICAgcHJvZHVjdHM6IFtdLFxyXG4gICAgdHJhbnNhY3Rpb25EaXNjb3VudDogW10sXHJcbiAgICBxdWFudGl0eTogMCxcclxuICAgIHRvdGFsOiAwLFxyXG4gICAgc2FsZVRvdGFsOiAwLFxyXG4gICAgYmFzZUN1cnJlbmN5OiAnJ1xyXG4gIH07XHJcblxyXG4gIHByaXZhdGUgYmFza2V0U291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnk+KG51bGwpO1xyXG4gIGJhc2tldCA9IHRoaXMuYmFza2V0U291cmNlLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICBwcml2YXRlIHByb2R1Y3RTb3VyY2UgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueT4obnVsbCk7XHJcbiAgcHJvZHVjdCA9IHRoaXMucHJvZHVjdFNvdXJjZS5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBwZWVyU291cmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgcGVlclN5bmMgPSB0aGlzLnBlZXJTb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgc2NhblNvdXJjZSA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gIHNjYW5uZXIgPSB0aGlzLnNjYW5Tb3VyY2UuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gIHByaXZhdGUgX2lzTWl4ZWRCYXNrZXRTYWxlczogYm9vbGVhbiB8IHVuZGVmaW5lZDtcclxuICBwdWJsaWMgZ2V0IGlzTWl4ZWRCYXNrZXRTYWxlcygpOiBhbnkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2lzTWl4ZWRCYXNrZXRTYWxlcztcclxuICB9XHJcbiAgcHVibGljIHNldCBpc01peGVkQmFza2V0U2FsZXModjogYW55KSB7XHJcbiAgICB0aGlzLl9pc01peGVkQmFza2V0U2FsZXMgPSB2O1xyXG4gIH1cclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlKSB7IH1cclxuXHJcbiAgdXBkYXRlQmFza2V0KGJhc2tldDogQmFza2V0KSB7XHJcbiAgICB0aGlzLmN1cnJlbnRCYXNrZXQgPSBiYXNrZXQ7XHJcbiAgICB0aGlzLmlzTWl4ZWRCYXNrZXRTYWxlcyA9IHRoaXMuZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIodHJ1ZSkubGVuZ3RoID4gMDtcclxuICAgIHRoaXMuYmFza2V0U291cmNlLm5leHQoYmFza2V0KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGNhbGN1bGF0ZXMgdGhlIHRvdGFsIGJhc2tldCB2YWx1ZSBhbmQgcXVhbnRpdHlcclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyB2b2lkXHJcbiAgICovXHJcbiAgdXBkYXRlQmFza2V0VG90YWwoYmFza2V0RGV0YWlsczogeyBxdWFudGl0eTogbnVtYmVyOyB0b3RhbDogbnVtYmVyOyBwcm9kdWN0czogYW55OyB0cmFuc2FjdGlvbklkOiBhbnk7IGJhc2tldFRvdGFsOiBhbnk7IH0sIGJhc2tldFN0YXRlOiB7IHVwZGF0ZUJhc2tldDogKGFyZzA6IGFueSkgPT4gdm9pZDsgfSkge1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBiYXNrZXREZXRhaWxzLnRvdGFsID0gMDtcclxuICAgIGZvciAoY29uc3QgcCBvZiBiYXNrZXREZXRhaWxzLnByb2R1Y3RzKSB7XHJcbiAgICAgIGJhc2tldERldGFpbHMucXVhbnRpdHkgPSBiYXNrZXREZXRhaWxzLnF1YW50aXR5ICsgcC5xdWFudGl0eTtcclxuICAgICAgYmFza2V0RGV0YWlscy50b3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChiYXNrZXREZXRhaWxzLnRvdGFsKSArXHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbChwLnRvdGFsKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBcImU6YmFza2V0IDpiYXNrZXQgc2VydmljZSA6IGJhc2tldERldGFpbHMgdXBkYXRlZCB2YWx1ZXMgZm9yIHRyYW5zYWN0aW9uIGlkXCIsXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25JZCxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscylcclxuICAgICk7XHJcbiAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbDtcclxuICAgIGJhc2tldFN0YXRlLnVwZGF0ZUJhc2tldChiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZCBMaW5lIHByb21vdGlvblxyXG4gICAqIEBwYXJhbSAgbnVsbFxyXG4gICAqIEByZXR1cm5zIGJhc2tldERldGFpbHNcclxuICAgKi9cclxuICBhZGRsaW5lUHJvbW90aW9uKHByb21vdGlvbkxpc3Q6IHsgcmVzdWx0OiB7IGxpbmVQcm9tb3Rpb25zOiBzdHJpbmcgfCBhbnlbXTsgfTsgfSwgYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55OyB9KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6YmFza2V0IFNlcnZpY2UgOiBwcm9tb3Rpb25MaXN0IGFuZCBiYXNrZXREZXRhaWxzIGZvciBsaW5lUHJvbW90aW9uc1wiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscylcclxuICAgICk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHByb21vdGlvbkxpc3QgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMgJiZcclxuICAgICAgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMubGVuZ3RoID4gMFxyXG4gICAgKSB7XHJcbiAgICAgIGZvciAodmFyIGVsZW1lbnQgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xyXG4gICAgICAgIGZvciAodmFyIHByb21vdGlvbmVsZW1lbnQgb2YgcHJvbW90aW9uTGlzdC5yZXN1bHQubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICAgIGlmIChcclxuICAgICAgICAgICAgZWxlbWVudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgPT09XHJcbiAgICAgICAgICAgIHByb21vdGlvbmVsZW1lbnQuaXRlbUxpbmVJZC50b1N0cmluZygpXHJcbiAgICAgICAgICApIHtcclxuICAgICAgICAgICAgZWxlbWVudC5saW5lUHJvbW90aW9ucyA9IHByb21vdGlvbmVsZW1lbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFza2V0RGV0YWlscztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGFkZCBUcmFuc2FjdGlvbiBwcm9tb3Rpb25cclxuICAgKiBAcGFyYW0gIG51bGxcclxuICAgKiBAcmV0dXJucyBiYXNrZXREZXRhaWxzXHJcbiAgICovXHJcblxyXG4gIGFkZFRyYW5zYWN0aW9uUHJvbW90aW9uKHByb21vdGlvbkxpc3Q6IHsgcmVzdWx0OiB7IHRyYW5zYWN0aW9uUHJvbW90aW9uOiBhbnkgfTsgfSwgYmFza2V0ZGV0YWlsczogQmFza2V0KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6YmFza2V0IFNlcnZpY2UgOiBwcm9tb3Rpb25MaXN0IGFuZCBiYXNrZXREZXRhaWxzIGZvciB0cmFuc2FjdGlvblByb21vdGlvblwiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShwcm9tb3Rpb25MaXN0KSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscyksXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pXHJcbiAgICApO1xyXG4gICAgaWYgKFxyXG4gICAgICBwcm9tb3Rpb25MaXN0ICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0ICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXHJcbiAgICAgIHByb21vdGlvbkxpc3QucmVzdWx0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAgICkge1xyXG4gICAgICBwcm9tb3Rpb25MaXN0LnJlc3VsdC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0UHJvbW90aW9uOiBhbnkpID0+IHtcclxuICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWQ6IGFueSA9IE9iamVjdC5hc3NpZ24oXHJcbiAgICAgICAgICB7fSxcclxuICAgICAgICAgIHRQcm9tb3Rpb25cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZC5pdGVtTGluZUlkcyA9IGJhc2tldGRldGFpbHMucHJvZHVjdHMubWFwKFxyXG4gICAgICAgICAgKHByb2R1Y3QpID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZDtcclxuICAgICAgICAgIH1cclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBpZiAoIWJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcclxuICAgICAgICAgIGJhc2tldGRldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSBbXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYmFza2V0ZGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5wdXNoKFxyXG4gICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb25FbnRyeVVwZGF0ZWRcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBiYXNrZXRkZXRhaWxzID0gdGhpcy50cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldGRldGFpbHMsXHJcbiAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbkVudHJ5VXBkYXRlZFxyXG4gICAgICAgICk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coXHJcbiAgICAgIFwiYmFza2V0IGRldGFpbHMgaW4gcmVmdW5kIGNhbGN1bGF0aW9uIGZpbGVcIixcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0ZGV0YWlscylcclxuICAgICk7XHJcbiAgICByZXR1cm4gYmFza2V0ZGV0YWlscztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByb2R1Y3RUb3RhbEZvclN1bW1hcnkoYmFza2V0RGV0YWlsczogeyB0b3RhbDogc3RyaW5nIHwgbnVtYmVyOyBxdWFudGl0eTogc3RyaW5nIHwgbnVtYmVyOyBwcm9kdWN0czogYW55OyB9KSB7XHJcbiAgICAvKnNhbGUtICAgICAgICAgICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkXHJcbiAgICBwYXJ0aWFsIHJlZnVuZCAtICAgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMFxyXG4gICAgdG90YWwgcmVmdW5kIC0gICAgIHByb3VkY3QgcmVmdW5kZWRRdWFudGl0eSBpcyA+IDBcclxuICAgIGV4Y2hhbmdlIC0gICAgICAgICBleGNoYW5nZSBwcm9kdWN0IHJlZnVuZGVkUXVhbnRpdHkgaXMgPiAwICBcclxuICAgICAgICAgICAgICAgICAgICAgICBuZXcgcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5ID0gdW5kZWZpbmVkICBcclxuICAgICAgICAgICAgICAgICAgICAgICBvbGQgcHJvZHVjdCB3aXRob3V0IGV4Y2hhbmdlIHJlZnVuZGVkUXVhbnRpdHkgPSAwXHJcbiAgICB1bnJlZmVyZW5jZSByZWZ1bmQtcHJvZHVjdCByZWZ1bmRlZFF1YW50aXR5IGlzID4gMCAqL1xyXG5cclxuICAgIGJhc2tldERldGFpbHMudG90YWwgPSAwO1xyXG4gICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9IDA7XHJcbiAgICBmb3IgKHZhciBwcm9kdWN0IG9mIGJhc2tldERldGFpbHMucHJvZHVjdHMpIHtcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgfVxyXG4gICAgICBwcm9kdWN0LnRvdGFsID1cclxuICAgICAgICBwcm9kdWN0LnRvdGFsIC1cclxuICAgICAgICBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwgPyBwcm9kdWN0LnJlZnVuZGVkVG90YWwgOiAwKTtcclxuXHJcbiAgICAgIGJhc2tldERldGFpbHMudG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy5xdWFudGl0eSArXHJcbiAgICAgICAgKHByb2R1Y3QucXVhbnRpdHkgLVxyXG4gICAgICAgICAgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA6IDApKTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDpFeGNoYW5nZVN1bW1hcnlTY3JlZW46dXBkYXRlIGJhc2tldGRldGFpbHMgdG90YWwgOlwiICtcclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRvdGFsICtcclxuICAgICAgICBcIiBQcm9kdWN0IGxpbmUgSUQgOiBcIiArXHJcbiAgICAgICAgcHJvZHVjdC5pdGVtTGluZUlkICtcclxuICAgICAgICBcIiBwcm9kdWN0IHRvdGFsIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgXCJxdWFudGl0eSAgOiBcIiArIGJhc2tldERldGFpbHMucXVhbnRpdHlcclxuICAgICAgKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLnVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzKTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsRm9yU3VtbWFyeShiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBiYXNrZXREZXRhaWxzLnRvdGFsO1xyXG4gICAgY29uc29sZS5pbmZvKFxyXG4gICAgICBcImViYXNrZXQgOiBiYXNrZXQgU2VydmljZSA6IHVwZGF0ZSBCYXNrZXQgVG90YWwgZm9yIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uRGlzY291bnQgIFwiLFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQpXHJcbiAgICApO1xyXG5cclxuICAgIGNvbnNvbGUuaW5mbyhcclxuICAgICAgXCJlYmFza2V0IDogYmFza2V0IFNlcnZpY2UgOiB1cGRhdGUgQmFza2V0IFRvdGFsIGZvciB0cmFuc2FjdGlvbiB0cmFuc2FjdGlvblByb21vdGlvbiAgXCIsXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pXHJcbiAgICApO1xyXG5cclxuICAgIGJhc2tldERldGFpbHMgPSB0aGlzLnVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uKGJhc2tldERldGFpbHMpO1xyXG4gICAgYmFza2V0RGV0YWlscyA9IHRoaXMudXBkYXRlVHJhbnNhY3Rpb25EaXNjb3VudChiYXNrZXREZXRhaWxzKTtcclxuICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPSBOdW1iZXIoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbC50b0ZpeGVkKDIpKTtcclxuXHJcbiAgICBjb25zb2xlLmluZm8oXHJcbiAgICAgIFwiZWJhc2tldCA6IGJhc2tldCBTZXJ2aWNlIDogdXBkYXRlIEJhc2tldCBUb3RhbDogYmFza2V0VG90YWwgYWZ0ZXIgcHJvbW90aW9uIGFwcGxpZWQgIGZvciBiYXNrZXRUb3RhbFwiLFxyXG4gICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldERldGFpbHM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUcmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25EaXNjb3VudDogYW55W107IGJhc2tldFRvdGFsOiBudW1iZXI7IH0pIHtcclxuICAgIGlmIChcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyBkaXNjb3VudEFtb3VudCB9OiBhbnkpID0+IG4gKyBkaXNjb3VudEFtb3VudCxcclxuICAgICAgICAwXHJcbiAgICAgICk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldCA6IGJhc2tldCBTZXJ2aWNlIDogIGRpc2NvdW50VG90YWwgXCIsIGRpc2NvdW50VG90YWwpO1xyXG4gICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsID1cclxuICAgICAgICBiYXNrZXREZXRhaWxzLmJhc2tldFRvdGFsIC0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYmFza2V0RGV0YWlscztcclxuICB9XHJcblxyXG4gIHVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uKGJhc2tldERldGFpbHM6IHsgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IGFueVtdOyBiYXNrZXRUb3RhbDogbnVtYmVyOyB9KSB7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgcHJvbW90aW9uQW1vdW50IH06IGFueSkgPT4gbiArIHByb21vdGlvbkFtb3VudCxcclxuICAgICAgICAwXHJcbiAgICAgICk7XHJcbiAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgPVxyXG4gICAgICAgIGJhc2tldERldGFpbHMuYmFza2V0VG90YWwgLSBNYXRoLmFicyhkaXNjb3VudFRvdGFsKTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXREZXRhaWxzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlQmFza2V0VG90YWxXaXRob3V0RGlzY291bnQoYmFza2V0OiBCYXNrZXQpOiBCYXNrZXQge1xyXG4gICAgYmFza2V0LnRvdGFsID0gMDtcclxuICAgIGJhc2tldC5xdWFudGl0eSA9IDA7XHJcblxyXG4gICAgZm9yICh2YXIgcHJvZHVjdCBvZiBiYXNrZXQucHJvZHVjdHMpIHtcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgICAgIH0gZWxzZSBpZiAocHJvZHVjdC5saW5lRGlzY291bnQgJiYgIXByb2R1Y3QubGluZVByb21vdGlvbnMpIHtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBwcm9kdWN0LnRvdGFsID1cclxuICAgICAgICBwcm9kdWN0LnRvdGFsIC1cclxuICAgICAgICBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwgPyBwcm9kdWN0LnJlZnVuZGVkVG90YWwgOiAwKTtcclxuICAgICAgYmFza2V0LnRvdGFsICs9IHByb2R1Y3QudG90YWw7XHJcbiAgICAgIGJhc2tldC5xdWFudGl0eSA9XHJcbiAgICAgICAgYmFza2V0LnF1YW50aXR5ICtcclxuICAgICAgICAocHJvZHVjdC5xdWFudGl0eSAtXHJcbiAgICAgICAgICAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID8gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5IDogMCkpO1xyXG5cclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDpiYXNrZXQgc2VydmljZTp1cGRhdGUgYmFza2V0ZGV0YWlscyB0b3RhbCA6XCIgK1xyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldCkgK1xyXG4gICAgICAgIGJhc2tldC50b3RhbCArXHJcbiAgICAgICAgXCIgUHJvZHVjdCBsaW5lIElEIDogXCIgK1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbUxpbmVJZCArXHJcbiAgICAgICAgXCIgcHJvZHVjdCB0b3RhbCA6IFwiICtcclxuICAgICAgICBwcm9kdWN0LnRvdGFsXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgYmFza2V0LmJhc2tldFRvdGFsID0gYmFza2V0LnRvdGFsO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFRvdGFsV2l0aERpc2NvdW50cyhiYXNrZXQ6IGFueSk6IEJhc2tldCB7XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6UmVmdW5kQmFza2V0U2NyZWVuIDogdGhpcy5iYXNrZXREZXRhaWxzIG5ldyB2YWx1ZXNcIixcclxuICAgICAgYmFza2V0LFxyXG4gICAgICBKU09OLnN0cmluZ2lmeShiYXNrZXQuYmFza2V0VG90YWwpXHJcbiAgICApO1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiBiYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBjb25zdCBkaXNjb3VudFRvdGFsID0gYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSBkaXNjb3VudFRvdGFsO1xyXG4gICAgfVxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgY29uc3QgZGlzY291bnRUb3RhbCA9IGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IGRpc2NvdW50QW1vdW50IH06IGFueSkgPT4gbiArIGRpc2NvdW50QW1vdW50LFxyXG4gICAgICAgIDBcclxuICAgICAgKTtcclxuXHJcbiAgICAgIGJhc2tldC5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbCAtIGRpc2NvdW50VG90YWw7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlOmJhc2tldCA6UmVmdW5kQmFza2V0U2NyZWVuIDogYmFza2V0IG5ldyB2YWx1ZXNcIixcclxuICAgICAgSlNPTi5zdHJpbmdpZnkoYmFza2V0KVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gYmFza2V0O1xyXG4gIH1cclxuXHJcbiAgdHJhbnNhY3Rpb25EaXNjb3VudEFuZFByb21vdGlvblByb2R1Y3RvcnRpb25DYWxjdWxhdGlvbihiYXNrZXQ6IEJhc2tldCkge1xyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaChcclxuICAgICAgICAoZGlzY291bnQpID0+XHJcbiAgICAgICAgKGJhc2tldCA9IHRoaXMudHJhbnNhY3Rpb25EaXNjb3VudFByb2R1Y3RQb3J0aW9uQ2FsYyhcclxuICAgICAgICAgIGJhc2tldCxcclxuICAgICAgICAgIGRpc2NvdW50XHJcbiAgICAgICAgKSlcclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKChwcm9tb3Rpb24pID0+IHtcclxuICAgICAgICBiYXNrZXQgPSB0aGlzLnRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgcHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgXCJlYmFza2V0OiBiYXNrZXQgaXRlbSBkaXNjb3VudCBwcm90aW9uIGNhbGN1bGF0aW9uXCIsXHJcbiAgICAgIGJhc2tldCxcclxuICAgICAgYmFza2V0LnByb2R1Y3RzXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBwcm9tb3Rpb246IGFueVxyXG4gICkge1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGxldCBwZXJjZW50YWdlID0gMDtcclxuICAgIHtcclxuICAgICAgYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHA6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHByb21vdGlvbi5pdGVtTGluZUlkcy5pbmNsdWRlcyhwLml0ZW1MaW5lSWQpKSB7XHJcbiAgICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uKSArXHJcbiAgICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwLml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcbiAgICAgICAgICB0b3RhbCArPSAocC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25Qcm9tb3Rpb246ICR7SlNPTi5zdHJpbmdpZnkoXHJcbiAgICAgICAgICBwcm9tb3Rpb25cclxuICAgICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgICApO1xyXG4gICAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogYW55KSA9PiB7XHJcbiAgICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbikgK1xyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uKSAtXHJcbiAgICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICAgIGlmIChwcm9tb3Rpb24uaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gKz1cclxuICAgICAgICAgICAgKHByb21vdGlvbi5wcm9tb3Rpb25BbW91bnQgKiBwZXJjZW50YWdlKSAvIDEwMDtcclxuICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbik7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVybiBiYXNrZXQ7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKFxyXG4gICAgYmFza2V0OiBhbnksXHJcbiAgICBkaXNjb3VudDogYW55XHJcbiAgKSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IHBlcmNlbnRhZ2UgPSAwO1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwOiBhbnkpID0+IHtcclxuICAgICAgaWYgKGRpc2NvdW50Lml0ZW1MaW5lSWRzLmluY2x1ZGVzKHAuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICBwID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocCk7XHJcbiAgICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHAuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbikgLVxyXG4gICAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocC5pdGVtRGlzY291bnRzLnJlZnVuZFBvcnRpb24pO1xyXG5cclxuXHJcbiAgICAgICAgdG90YWwgKz0gKHAudG90YWwgLSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCkpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcclxuICAgICAgYGViYXNrZXQ6IHRybnNhY3Rpb25EaXNjb3VudDogJHtKU09OLnN0cmluZ2lmeShcclxuICAgICAgICBkaXNjb3VudFxyXG4gICAgICApfSwgc2VsZWN0ZWQgcHJvZHVjdHMgdG90YWw6ICR7dG90YWx9YFxyXG4gICAgKTtcclxuXHJcbiAgICBiYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDphbnkpID0+IHtcclxuICAgICAgcHJvZHVjdCA9IHRoaXMudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG4gICAgICBjb25zb2xlLmxvZyhwcm9kdWN0LmRpc2NvdW50YWJsZSwgXCJlYmFza2V0IDogYmFza2V0IHNlcnZpY2UgOiBkaXNjb3VudGFibGUgaW4gYmFza2V0IHNlcnZpY2VcIik7XHJcblxyXG4gICAgICBjb25zdCBwcm9kdWN0Q29udHJpYnV0aW9uSW5Ub3RhbCA9XHJcbiAgICAgICAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pICtcclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24pIC1cclxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihwcm9kdWN0Lml0ZW1EaXNjb3VudHMucmVmdW5kUG9ydGlvbik7XHJcblxyXG4gICAgICBpZiAoZGlzY291bnQuaXRlbUxpbmVJZHMuaW5jbHVkZXMocHJvZHVjdC5pdGVtTGluZUlkKSAmJiBwcm9kdWN0LmRpc2NvdW50YWJsZSA9PSB0cnVlKSB7XHJcbiAgICAgICAgcGVyY2VudGFnZSA9ICgocHJvZHVjdC50b3RhbCAtIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSkgLyB0b3RhbCkgKiAxMDA7XHJcbiAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24gKz1cclxuICAgICAgICAgIChkaXNjb3VudC5kaXNjb3VudEFtb3VudCAqIHBlcmNlbnRhZ2UpIC8gMTAwO1xyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIocHJvZHVjdC5pdGVtRGlzY291bnRzLnRybkRpc2NvdW50c1BvcnRpb24pXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyB2YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcclxuICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzID0ge1xyXG4gICAgICAgIHRybkRpc2NvdW50c1BvcnRpb246IDAsXHJcbiAgICAgICAgdHJuUHJvbW90aW9uc1BvcnRpb246IDAsXHJcbiAgICAgICAgcmVmdW5kUG9ydGlvbjogMCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICAgIHJldHVybiBwcm9kdWN0O1xyXG4gIH1cclxuXHJcbiAgbWFya1Byb2R1Y3QocHJvZHVjdDogUHJvZHVjdCkge1xyXG4gICAgdGhpcy5wcm9kdWN0U291cmNlLm5leHQocHJvZHVjdCk7XHJcbiAgfVxyXG4gIHN0b3BQZWVyU3luY1Byb2Nlc3MocGVlclN5bmM6IGJvb2xlYW4pIHtcclxuICAgIHRoaXMucGVlclNvdXJjZS5uZXh0KHBlZXJTeW5jKTtcclxuICB9XHJcblxyXG4gIHNjYW5TdGFydChpc1NjYW5uaW5nOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLnNjYW5Tb3VyY2UubmV4dChpc1NjYW5uaW5nKTtcclxuICB9XHJcblxyXG4gIHByb21vdGlvblJlbWFpbmluZ0NhbGN1bGF0aW9uKHByb21vdGlvbjogVHJhbnNhY3Rpb25Qcm9tb3Rpb25bXSkge1xyXG4gICAgdmFyIHByb21vdGlvblZhbHVlID0gMDtcclxuICAgIHByb21vdGlvbi5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIHByb21vdGlvblZhbHVlICs9IGVsZW1lbnQucHJvbW90aW9uQW1vdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gcHJvbW90aW9uVmFsdWU7XHJcbiAgfVxyXG5cclxuICBkaXNjb3VudFJlbWFpbmluZ0NhbGN1bGF0aW9uKGRpc2NvdW50OiBUcmFuc2FjdGlvbkRpc2NvdW50W10pIHtcclxuICAgIHZhciBkaXNjb3VudFZhbHVlID0gMDtcclxuICAgIGRpc2NvdW50LmZvckVhY2goKGVsZW1lbnQpID0+IHtcclxuICAgICAgZGlzY291bnRWYWx1ZSArPSBlbGVtZW50LmRpc2NvdW50QW1vdW50O1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlzY291bnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGRpc2NvdW50UmVmdW5kZWRDYWxjdWxhdGlvbihkaXNjb3VudDogVHJhbnNhY3Rpb25EaXNjb3VudFtdKSB7XHJcbiAgICB2YXIgZGlzY291bnRWYWx1ZSA9IDA7XHJcbiAgICBkaXNjb3VudC5mb3JFYWNoKChlbGVtZW50KSA9PiB7XHJcbiAgICAgIGlmIChlbGVtZW50LmRpc2NvdW50QW1vdW50IDwgMCkge1xyXG4gICAgICAgIGRpc2NvdW50VmFsdWUgKz0gZWxlbWVudC5kaXNjb3VudEFtb3VudDtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZGlzY291bnRWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdlbmVyYXRlTmV3SXRlbUxpbmVJZChwcm9kdWN0czogUHJvZHVjdFtdKSB7XHJcbiAgICBsZXQgbGFyZ2VzdE51bWJlcjogYW55ID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gcHJvZHVjdHMubWFwKChwcm9kdWN0KSA9PiB7XHJcbiAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gaXRlbUxpbmVJZEFycmF5LnJlZHVjZSgoYSA6YW55LCBiOmFueSkgPT4gTWF0aC5tYXgoYSwgYikpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBsYXJnZXN0TnVtYmVyICsgMTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eShcclxuICAgIHByb2R1Y3Q6IGFueSxcclxuICAgIHF1YW50aXR5OiBudW1iZXJcclxuICApOiBQcm9kdWN0IHtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhgZWJhc2tldDogdXBkYXRlQmFza2V0UHJvZHVjdERhdGFBc1BlclF1YW50aXR5IDogJHtxdWFudGl0eX0gcHJvZHVjdDogJHtKU09OLnN0cmluZ2lmeShwcm9kdWN0KX1gKTtcclxuICAgIHByb2R1Y3QucXVhbnRpdHkgPSBxdWFudGl0eTtcclxuICAgIGlmIChwcm9kdWN0Lmhhc093blByb3BlcnR5KFwibGluZURpc2NvdW50XCIpKSB7XHJcbiAgICAgIC8vICYmIHRoaXMucHJvZHVjdC5xdWFudGl0eSAhPT0gdGhpcy5wcm9kdWN0RGV0YWlsRm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZVxyXG4gICAgICBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlID0gTnVtYmVyKFxyXG4gICAgICAgIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UuZ2V0Rmxvb3JlZEZpeGVkKFxyXG4gICAgICAgICAgcHJvZHVjdC5saW5lRGlzY291bnQudW5pdFByaWNlICogcXVhbnRpdHksXHJcbiAgICAgICAgICAyXHJcbiAgICAgICAgKVxyXG4gICAgICApO1xyXG4gICAgICBwcm9kdWN0LmxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCA9XHJcbiAgICAgICAgcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb2R1Y3QubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsTGluZVByaWNlID1cclxuICAgICAgICBxdWFudGl0eSAqIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwocHJvZHVjdC5zZWxlY3RlZFByaWNlKTtcclxuICAgIH1cclxuICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCkge1xyXG4gICAgICBwcm9kdWN0LnRvdGFsID0gcHJvZHVjdC5saW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coYGViYXNrZXQ6IHVwZGF0ZUJhc2tldFByb2R1Y3REYXRhQXNQZXJRdWFudGl0eSA6ICR7cXVhbnRpdHl9IHByb2R1Y3Q6ICR7SlNPTi5zdHJpbmdpZnkocHJvZHVjdCl9YCk7XHJcblxyXG4gICAgcmV0dXJuIHByb2R1Y3Q7XHJcbiAgfVxyXG5cclxuICBmaWx0ZXJQcm9kdWN0TGlzdFdpdGhXZWJPcmRlcihpc1dlYk9yZGVyOiBib29sZWFuKTogUHJvZHVjdFtdIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogZmlsdGVyUHJvZHVjdExpc3RXaXRoV2ViT3JkZXIgaGl0XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cykpO1xyXG4gICAgaWYgKGlzV2ViT3JkZXIpXHJcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmlzV2ViT3JkZXIpO1xyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiAheC5pc1dlYk9yZGVyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5KCk6IFByb2R1Y3RbXSB7XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IGZpbHRlclByb2R1Y3RMaXN0V2l0aERlbGl2ZXJ5IGhpdFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpKTtcclxuICAgIHJldHVybiB0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMuZmlsdGVyKCh4KSA9PiB4LmRlbGl2ZXJ5TWV0aG9kID09PSBERUxJVkVSWV9NRVRIT0RTLkRFTElWRVJZLnRvU3RyaW5nKCkpO1xyXG4gIH1cclxuXHJcbiAgZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cChncm91cDogc3RyaW5nLCBwcm9kdWN0czogUHJvZHVjdFtdKTogUHJvZHVjdFtdIHtcclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogZmlsdGVyUHJvZHVjdExpc3RXaXRoRGVsaXZlcnlHcm91cCBoaXRcIiwgSlNPTi5zdHJpbmdpZnkocHJvZHVjdHMpKTtcclxuICAgIHJldHVybiBwcm9kdWN0cy5maWx0ZXIoKHgpID0+IHguZGVsaXZlcnlHcm91cCA9PT0gZ3JvdXApO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVOZXdEZWxpdmVyeUdyb3VwTnVtYmVyKHByb2R1Y3RzOiBQcm9kdWN0W10pIHtcclxuICAgIGxldCBsYXJnZXN0TnVtYmVyID0gMDtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBsYXJnZXN0TnVtYmVyID0gZGVsaXZlcnlHcm91cEFyci5yZWR1Y2UoKGEsIGIpID0+IE1hdGgubWF4KGEsIGIpKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gKGxhcmdlc3ROdW1iZXIgKyAxKS50b1N0cmluZygpO1xyXG4gIH1cclxuXHJcbiAgZ2V0RGVsaXZlcnlHcm91cE51bWJlcnMocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgY29uc29sZS5sb2coXCJnZXREZWxpdmVyeUdyb3VwTnVtYmVycyBpbml0aWF0aW5nIDogXCIsIEpTT04uc3RyaW5naWZ5KHByb2R1Y3RzKSk7XHJcblxyXG4gICAgbGV0IHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDogbnVtYmVyW10gPSBbXTtcclxuXHJcbiAgICBpZiAocHJvZHVjdHMubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgZGVsaXZlcnlHcm91cEFyciA9IHByb2R1Y3RzLm1hcCgocHJvZHVjdCkgPT4ge1xyXG4gICAgICAgIGlmIChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApIHtcclxuICAgICAgICAgIHJldHVybiBwYXJzZUludChwcm9kdWN0LmRlbGl2ZXJ5R3JvdXApO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kID09PSBcIjFcIikge1xyXG4gICAgICAgICAgcmV0dXJuIDE7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCA9IEFycmF5LmZyb20obmV3IFNldChkZWxpdmVyeUdyb3VwQXJyKSkuc29ydCgoYSwgYikgPT4gYSAtIGIpO1xyXG4gICAgICBjb25zb2xlLmxvZyhcImdldERlbGl2ZXJ5R3JvdXBOdW1iZXJzIDogXCIsIEpTT04uc3RyaW5naWZ5KHVuaXF1ZUFuZHNvcnRlZFJlc3VsdCkpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuaXF1ZUFuZHNvcnRlZFJlc3VsdDtcclxuICB9XHJcblxyXG4gIHVwZGF0ZVByb2R1Y3RzV2l0aE5ld0RlbGl2ZXJ5R3JvdXBOdW1iZXIocHJvZHVjdHM6IFByb2R1Y3RbXSkge1xyXG4gICAgY29uc29sZS5sb2coXCJ1cGRhdGVQcm9kdWN0c1dpdGhOZXdEZWxpdmVyeUdyb3VwTnVtYmVyIGluaXRpYXRpbmcgOiBcIiwgSlNPTi5zdHJpbmdpZnkocHJvZHVjdHMpKTtcclxuXHJcbiAgICBsZXQgbmV3R3JvdXBOdW1iZXIgPSB0aGlzLmdlbmVyYXRlTmV3RGVsaXZlcnlHcm91cE51bWJlcih0aGlzLmN1cnJlbnRCYXNrZXQucHJvZHVjdHMpO1xyXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgcHJvZHVjdHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgIGlmIChjQlByb2R1Y3RzLml0ZW1MaW5lSWQgPT09IGVsZW1lbnQuaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICBjQlByb2R1Y3RzLmRlbGl2ZXJ5R3JvdXAgPSBuZXdHcm91cE51bWJlcjtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLnVwZGF0ZUJhc2tldCh0aGlzLmN1cnJlbnRCYXNrZXQpO1xyXG4gICAgcmV0dXJuO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlRXN0aW1hdGVkVGltZShwcm9kdWN0czogYW55W10pIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCB0aW1lO1xyXG4gICAgICBsZXQgZXN0bWF0ZWRUaW1lOiBudW1iZXIgPSAwO1xyXG4gICAgICBsZXQgZXN0aW1hdGVkRGF5czogc3RyaW5nID0gXCJIb3Vyc1wiO1xyXG4gICAgICBwcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiB7IGxlYWRUaW1lOiB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IGFueTsgfTsgfSkgPT4ge1xyXG5cclxuICAgICAgICBpZiAoZWxlbWVudC5sZWFkVGltZS50eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwid2Vla3NcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogNztcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIndlZWtcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJkYXlzXCIpIHtcclxuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSkgKiAyNDtcclxuICAgICAgICAgIGVzdG1hdGVkVGltZSA9IE1hdGgubWF4KGVzdG1hdGVkVGltZSwgdGltZSk7XHJcbiAgICAgICAgICBlc3RpbWF0ZWREYXlzID0gKGVzdG1hdGVkVGltZSA9PT0gdGltZSkgPyBlbGVtZW50LmxlYWRUaW1lLnR5cGUgOiBlc3RpbWF0ZWREYXlzXHJcblxyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJkYXlzXCIsIGVzdG1hdGVkVGltZSwgZXN0aW1hdGVkRGF5cyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJtb250aHNcIikge1xyXG4gICAgICAgICAgdGltZSA9IE51bWJlcihlbGVtZW50LmxlYWRUaW1lLnZhbHVlKSAqIDI0ICogMzA7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwibW9udGhzXCIsIGVzdG1hdGVkVGltZSwgZXN0aW1hdGVkRGF5cyk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIGlmIChlbGVtZW50LmxlYWRUaW1lLnR5cGUudG9Mb2NhbGVMb3dlckNhc2UoKSA9PT0gXCJ5ZWFyc1wiKSB7XHJcbiAgICAgICAgICB0aW1lID0gTnVtYmVyKGVsZW1lbnQubGVhZFRpbWUudmFsdWUpICogMjQgKiAzNjU7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5c1xyXG5cclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwieWVhcnNcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRpbWUgPSBOdW1iZXIoZWxlbWVudC5sZWFkVGltZS52YWx1ZSk7XHJcbiAgICAgICAgICBlc3RtYXRlZFRpbWUgPSBNYXRoLm1heChlc3RtYXRlZFRpbWUsIHRpbWUpO1xyXG4gICAgICAgICAgZXN0aW1hdGVkRGF5cyA9IChlc3RtYXRlZFRpbWUgPT09IHRpbWUpID8gZWxlbWVudC5sZWFkVGltZS50eXBlIDogZXN0aW1hdGVkRGF5cztcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiaG91cnNcIiwgZXN0bWF0ZWRUaW1lLCBlc3RpbWF0ZWREYXlzKTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuXHJcbiAgICAgIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwiZGF5c1wiKSB7XHJcbiAgICAgICAgZXN0bWF0ZWRUaW1lID0gZXN0bWF0ZWRUaW1lIC8gMjQ7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcIndlZWtzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiA3KTtcclxuICAgICAgfSBlbHNlIGlmIChlc3RpbWF0ZWREYXlzLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT09IFwibW9udGhzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzMCk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZXN0aW1hdGVkRGF5cy50b0xvY2FsZUxvd2VyQ2FzZSgpID09PSBcInllYXJzXCIpIHtcclxuICAgICAgICBlc3RtYXRlZFRpbWUgPSBlc3RtYXRlZFRpbWUgLyAoMjQgKiAzNjUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBsZXQgZXN0aW1hdGUgPSB7XHJcbiAgICAgICAgdmFsdWU6IGVzdG1hdGVkVGltZS50b1N0cmluZygpLFxyXG4gICAgICAgIHR5cGU6IGVzdGltYXRlZERheXNcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gZXN0aW1hdGU7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yIGluIGNhbGN1bGF0ZUVzdGltYXRlZFRpbWVcIiwgZXJyb3IpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIDA7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVQcm9kdWN0c1dpdGhEZWxpdmVyeUdyb3VwTnVtYmVyKG9sZEdyb3VwOiBzdHJpbmcsIG5ld0dyb3VwOiBzdHJpbmcpIHtcclxuICAgIGNvbnNvbGUubG9nKFwidXBkYXRlUHJvZHVjdHNXaXRoRGVsaXZlcnlHcm91cE51bWJlciBpbml0aWF0aW5nXCIpO1xyXG5cclxuICAgIHRoaXMuY3VycmVudEJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKGNCUHJvZHVjdHMgPT4ge1xyXG4gICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBvbGRHcm91cCkge1xyXG4gICAgICAgIGNCUHJvZHVjdHMuZGVsaXZlcnlHcm91cCA9IG5ld0dyb3VwO1xyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy51cGRhdGVCYXNrZXQodGhpcy5jdXJyZW50QmFza2V0KTtcclxuICAgIHJldHVybjtcclxuICB9XHJcblxyXG4gIGdldERlbGl2ZXJ5SW5mbygpOiBhbnkge1xyXG4gICAgY29uc29sZS5sb2coXCJnZXREZWxpdmVyeUdyb3VwSW5mb3IgaW5pdGlhdGluZ1wiKTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGxldCBncm91cEluZm86IERlbGl2ZXJ5SW5mbyA9IHtcclxuICAgICAgICBncm91cHM6IFtdXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuZ2V0RGVsaXZlcnlHcm91cE51bWJlcnModGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzKS5mb3JFYWNoKChncm91cE51bWJlcikgPT4ge1xyXG4gICAgICAgIGxldCBncm91cDogYW55ID0ge1xyXG4gICAgICAgICAgZ3JvdXBOdW1iZXI6IGdyb3VwTnVtYmVyLFxyXG4gICAgICAgICAgaXRlbXM6IFtdLFxyXG4gICAgICAgICAgZXN0aW1hdGU6IHtcclxuICAgICAgICAgICAgdHlwZTogXCJIb3Vyc1wiLFxyXG4gICAgICAgICAgICB2YWx1ZTogXCIwXCJcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5jdXJyZW50QmFza2V0LnByb2R1Y3RzLmZvckVhY2goY0JQcm9kdWN0cyA9PiB7XHJcbiAgICAgICAgICBpZiAoY0JQcm9kdWN0cy5kZWxpdmVyeUdyb3VwID09PSBncm91cE51bWJlci50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgIGdyb3VwLml0ZW1zLnB1c2goY0JQcm9kdWN0cyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIGdyb3VwLmVzdGltYXRlID0gdGhpcy5jYWxjdWxhdGVFc3RpbWF0ZWRUaW1lKGdyb3VwLml0ZW1zKTtcclxuXHJcbiAgICAgICAgZ3JvdXBJbmZvLmdyb3Vwcy5wdXNoKGdyb3VwKTtcclxuXHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgcmV0dXJuIGdyb3VwSW5mbztcclxuICAgIH1cclxuICAgIGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLmxvZyhcImVycm9yXCIsIGVycm9yKTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19