@pmcretail/mapper-library 0.0.39 → 0.0.41

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 (68) hide show
  1. package/esm2022/lib/RJ-mapper.class.mjs +875 -0
  2. package/esm2022/lib/TransactionDocumentBuilder.mjs +1240 -0
  3. package/esm2022/lib/WebReturn-mapper.class.mjs +324 -0
  4. package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +410 -0
  5. package/esm2022/lib/basket.service.mjs +516 -0
  6. package/esm2022/lib/mapper-library.component.mjs +22 -0
  7. package/esm2022/lib/mapper-library.model.mjs +39 -0
  8. package/esm2022/lib/mapper-library.module.mjs +21 -0
  9. package/esm2022/lib/number-util.service.mjs +40 -0
  10. package/esm2022/pmcretail-mapper-library.mjs +5 -0
  11. package/esm2022/public-api.mjs +9 -0
  12. package/fesm2022/pmcretail-mapper-library.mjs +3482 -0
  13. package/fesm2022/pmcretail-mapper-library.mjs.map +1 -0
  14. package/index.d.ts +6 -0
  15. package/lib/RJ-mapper.class.d.ts +80 -79
  16. package/lib/RJ-mapper.class.d.ts.map +1 -0
  17. package/lib/TransactionDocumentBuilder.d.ts +271 -270
  18. package/lib/TransactionDocumentBuilder.d.ts.map +1 -0
  19. package/lib/WebReturn-mapper.class.d.ts +27 -26
  20. package/lib/WebReturn-mapper.class.d.ts.map +1 -0
  21. package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
  22. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -0
  23. package/lib/basket.service.d.ts +105 -103
  24. package/lib/basket.service.d.ts.map +1 -0
  25. package/lib/mapper-library.component.d.ts +9 -5
  26. package/lib/mapper-library.component.d.ts.map +1 -0
  27. package/lib/mapper-library.model.d.ts +694 -693
  28. package/lib/mapper-library.model.d.ts.map +1 -0
  29. package/lib/mapper-library.module.d.ts +8 -2
  30. package/lib/mapper-library.module.d.ts.map +1 -0
  31. package/lib/number-util.service.d.ts +13 -9
  32. package/lib/number-util.service.d.ts.map +1 -0
  33. package/package.json +20 -16
  34. package/pmcretail-mapper-library.d.ts.map +1 -0
  35. package/public-api.d.ts +6 -5
  36. package/public-api.d.ts.map +1 -0
  37. package/bundles/pmcretail-mapper-library.umd.js +0 -8542
  38. package/bundles/pmcretail-mapper-library.umd.js.map +0 -1
  39. package/bundles/pmcretail-mapper-library.umd.min.js +0 -16
  40. package/bundles/pmcretail-mapper-library.umd.min.js.map +0 -1
  41. package/esm2015/lib/RJ-mapper.class.js +0 -1464
  42. package/esm2015/lib/TransactionDocumentBuilder.js +0 -1535
  43. package/esm2015/lib/WebReturn-mapper.class.js +0 -501
  44. package/esm2015/lib/WebReturnSalesforceMapper.class.js +0 -683
  45. package/esm2015/lib/basket.service.js +0 -851
  46. package/esm2015/lib/mapper-library.component.js +0 -27
  47. package/esm2015/lib/mapper-library.model.js +0 -1442
  48. package/esm2015/lib/mapper-library.module.js +0 -21
  49. package/esm2015/lib/number-util.service.js +0 -78
  50. package/esm2015/pmcretail-mapper-library.js +0 -10
  51. package/esm2015/public-api.js +0 -14
  52. package/esm5/lib/RJ-mapper.class.js +0 -1762
  53. package/esm5/lib/TransactionDocumentBuilder.js +0 -2469
  54. package/esm5/lib/WebReturn-mapper.class.js +0 -592
  55. package/esm5/lib/WebReturnSalesforceMapper.class.js +0 -857
  56. package/esm5/lib/basket.service.js +0 -1076
  57. package/esm5/lib/mapper-library.component.js +0 -29
  58. package/esm5/lib/mapper-library.model.js +0 -1442
  59. package/esm5/lib/mapper-library.module.js +0 -25
  60. package/esm5/lib/number-util.service.js +0 -95
  61. package/esm5/pmcretail-mapper-library.js +0 -10
  62. package/esm5/public-api.js +0 -14
  63. package/fesm2015/pmcretail-mapper-library.js +0 -6594
  64. package/fesm2015/pmcretail-mapper-library.js.map +0 -1
  65. package/fesm5/pmcretail-mapper-library.js +0 -8326
  66. package/fesm5/pmcretail-mapper-library.js.map +0 -1
  67. package/pmcretail-mapper-library.d.ts +0 -5
  68. package/pmcretail-mapper-library.metadata.json +0 -1
@@ -1,2469 +0,0 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * Generated from: lib/TransactionDocumentBuilder.ts
4
- * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
5
- */
6
- import * as tslib_1 from "tslib";
7
- import { DELIVERY_METHODS } from "./mapper-library.model";
8
- import { TRANSACTION_TYPE } from "./mapper-library.model";
9
- import { BasketService } from "./basket.service";
10
- import { NumberUtilService } from "./number-util.service";
11
- /**
12
- * Transaction document builder
13
- */
14
- var /**
15
- * Transaction document builder
16
- */
17
- TransactionDocumentBuilder = /** @class */ (function () {
18
- function TransactionDocumentBuilder(transactionDoc, currencyPipe, basketService) {
19
- this.currencyPipe = currencyPipe;
20
- this.basketService = basketService;
21
- this.numberUtilService = new NumberUtilService(currencyPipe);
22
- this.basketService = new BasketService(this.numberUtilService);
23
- this.storeInfo = JSON.parse(localStorage.getItem('storeInfo') || '{}');
24
- if (transactionDoc) {
25
- this.transactionDocument = transactionDoc;
26
- }
27
- else {
28
- this.transactionDocument = {
29
- transactionId: "",
30
- offlineTransactionId: "",
31
- transactionRef: "",
32
- dateTime: "",
33
- orgCode: "",
34
- storeId: "",
35
- storeNodeId: "",
36
- storeNodeStructure: "",
37
- deviceId: "",
38
- terminalId: "",
39
- userId: "",
40
- initiatingModule: "eBasket",
41
- export: false,
42
- basket: (/** @type {?} */ ({})),
43
- basketSummary: (/** @type {?} */ ({})),
44
- baseCurrency: "",
45
- type: "",
46
- operationStatus: "",
47
- createdAt: "",
48
- updatedAt: "",
49
- id: "",
50
- currentTransactionDetails: (/** @type {?} */ ({})),
51
- saleTotal: 0,
52
- };
53
- }
54
- }
55
- /**
56
- * Transactions ref
57
- * @returns ref
58
- */
59
- /**
60
- * Transactions ref
61
- * @return {?} ref
62
- */
63
- TransactionDocumentBuilder.prototype.transactionRef = /**
64
- * Transactions ref
65
- * @return {?} ref
66
- */
67
- function () {
68
- /** @type {?} */
69
- var storeDetails = JSON.parse(localStorage.getItem('storeInfo') || '{}');
70
- /** @type {?} */
71
- var date = new Date();
72
- /** @type {?} */
73
- var random = (((1 + Math.random()) * 0x10000) | 0)
74
- .toString(16)
75
- .substring(1);
76
- this.transactionDocument.transactionRef =
77
- storeDetails.orgCode + storeDetails.storeId + date.toISOString() + random;
78
- console.log("ebasket: transaction ref created", this.transactionDocument.transactionRef);
79
- return this;
80
- };
81
- /**
82
- * Transactions id
83
- * @param transactionID
84
- * @returns id
85
- */
86
- /**
87
- * Transactions id
88
- * @param {?} transactionID
89
- * @param {?=} isOnline
90
- * @return {?} id
91
- */
92
- TransactionDocumentBuilder.prototype.transactionId = /**
93
- * Transactions id
94
- * @param {?} transactionID
95
- * @param {?=} isOnline
96
- * @return {?} id
97
- */
98
- function (transactionID, isOnline) {
99
- if (isOnline === void 0) { isOnline = true; }
100
- if (isOnline) {
101
- this.transactionDocument.transactionId = transactionID;
102
- }
103
- return this;
104
- };
105
- /**
106
- * Transactions id
107
- * @param transactionID
108
- * @returns id
109
- */
110
- /**
111
- * Transactions id
112
- * @param {?} transactionID
113
- * @param {?} isOnline
114
- * @return {?} id
115
- */
116
- TransactionDocumentBuilder.prototype.offlineTransactionId = /**
117
- * Transactions id
118
- * @param {?} transactionID
119
- * @param {?} isOnline
120
- * @return {?} id
121
- */
122
- function (transactionID, isOnline) {
123
- if (!isOnline) {
124
- this.transactionDocument.offlineTransactionId = transactionID;
125
- }
126
- return this;
127
- };
128
- /**
129
- * storeNode Id
130
- * @param storeNodeId
131
- * @returns id
132
- */
133
- /**
134
- * storeNode Id
135
- * @param {?} storeNodeId
136
- * @return {?} id
137
- */
138
- TransactionDocumentBuilder.prototype.storeNodeId = /**
139
- * storeNode Id
140
- * @param {?} storeNodeId
141
- * @return {?} id
142
- */
143
- function (storeNodeId) {
144
- this.transactionDocument.storeNodeId = storeNodeId;
145
- return this;
146
- };
147
- /**
148
- * storeNode structure
149
- * @param storeNodeStructure
150
- * @returns id
151
- */
152
- /**
153
- * storeNode structure
154
- * @param {?} storeNodeStructure
155
- * @return {?} id
156
- */
157
- TransactionDocumentBuilder.prototype.storeNodeStructure = /**
158
- * storeNode structure
159
- * @param {?} storeNodeStructure
160
- * @return {?} id
161
- */
162
- function (storeNodeStructure) {
163
- this.transactionDocument.storeNodeStructure = storeNodeStructure;
164
- return this;
165
- };
166
- /**
167
- * Orgs code
168
- * @param orgCode
169
- * @returns code
170
- */
171
- /**
172
- * Orgs code
173
- * @param {?} orgCode
174
- * @return {?} code
175
- */
176
- TransactionDocumentBuilder.prototype.orgCode = /**
177
- * Orgs code
178
- * @param {?} orgCode
179
- * @return {?} code
180
- */
181
- function (orgCode) {
182
- this.transactionDocument.orgCode = orgCode;
183
- return this;
184
- };
185
- /**
186
- * Stores id
187
- * @param storeId
188
- * @returns id
189
- */
190
- /**
191
- * Stores id
192
- * @param {?} storeId
193
- * @return {?} id
194
- */
195
- TransactionDocumentBuilder.prototype.storeId = /**
196
- * Stores id
197
- * @param {?} storeId
198
- * @return {?} id
199
- */
200
- function (storeId) {
201
- this.transactionDocument.storeId = storeId;
202
- return this;
203
- };
204
- /**
205
- * Dates time
206
- * @returns time
207
- */
208
- /**
209
- * Dates time
210
- * @return {?} time
211
- */
212
- TransactionDocumentBuilder.prototype.dateTime = /**
213
- * Dates time
214
- * @return {?} time
215
- */
216
- function () {
217
- /** @type {?} */
218
- var date = new Date();
219
- this.transactionDocument.dateTime = date.toISOString();
220
- return this;
221
- };
222
- /**
223
- * Devices id
224
- * @param deviceId
225
- * @returns id
226
- */
227
- /**
228
- * Devices id
229
- * @param {?} deviceId
230
- * @return {?} id
231
- */
232
- TransactionDocumentBuilder.prototype.deviceId = /**
233
- * Devices id
234
- * @param {?} deviceId
235
- * @return {?} id
236
- */
237
- function (deviceId) {
238
- this.transactionDocument.deviceId = deviceId;
239
- return this;
240
- };
241
- /**
242
- * terminal id
243
- * @param terminalId
244
- * @returns id
245
- */
246
- /**
247
- * terminal id
248
- * @param {?} terminalId
249
- * @return {?} id
250
- */
251
- TransactionDocumentBuilder.prototype.terminalId = /**
252
- * terminal id
253
- * @param {?} terminalId
254
- * @return {?} id
255
- */
256
- function (terminalId) {
257
- this.transactionDocument.terminalId = terminalId;
258
- return this;
259
- };
260
- /**
261
- * saleExport
262
- * @param saleExport
263
- * @returns id
264
- */
265
- /**
266
- * saleExport
267
- * @param {?} saleExport
268
- * @return {?} id
269
- */
270
- TransactionDocumentBuilder.prototype.export = /**
271
- * saleExport
272
- * @param {?} saleExport
273
- * @return {?} id
274
- */
275
- function (saleExport) {
276
- this.transactionDocument.export = saleExport;
277
- return this;
278
- };
279
- /* customer(): TransactionDocumentBuilder {
280
- const user = JSON.parse(localStorage.getItem('userDetails'));
281
- this.transactionDocument.customer = user;
282
- return this;
283
- } */
284
- /**
285
- * Baskets transaction document builder
286
- * @param basketDetails
287
- * @returns basket
288
- */
289
- /* customer(): TransactionDocumentBuilder {
290
- const user = JSON.parse(localStorage.getItem('userDetails'));
291
- this.transactionDocument.customer = user;
292
- return this;
293
- } */
294
- /**
295
- * Baskets transaction document builder
296
- * @param {?} basketDetails
297
- * @return {?} basket
298
- */
299
- TransactionDocumentBuilder.prototype.basket = /* customer(): TransactionDocumentBuilder {
300
- const user = JSON.parse(localStorage.getItem('userDetails'));
301
- this.transactionDocument.customer = user;
302
- return this;
303
- } */
304
- /**
305
- * Baskets transaction document builder
306
- * @param {?} basketDetails
307
- * @return {?} basket
308
- */
309
- function (basketDetails) {
310
- var _this = this;
311
- console.log("ebasket: basket details update in transaction document", JSON.stringify(basketDetails));
312
- this.transactionDocument.subsidiaryId = basketDetails.subsidiaryId || (localStorage.getItem('subsidiaryId') || '');
313
- this.transactionDocument.basket.products = (/** @type {?} */ ([]));
314
- this.transactionDocument.basket.lineDiscount = [];
315
- this.transactionDocument.basket.linePromotion = [];
316
- this.transactionDocument.basket.transactionPromotion = [];
317
- basketDetails.products.forEach((/**
318
- * @param {?} product
319
- * @param {?} index
320
- * @return {?}
321
- */
322
- function (product, index) {
323
- /** @type {?} */
324
- var p = (/** @type {?} */ ({}));
325
- p.itemDiscounts = (/** @type {?} */ ({}));
326
- p.SKU = product.SKU;
327
- p.excludePromotion = product.excludePromotion;
328
- p.barCode = product.barcode;
329
- p.barcodes = product.barcodes;
330
- p.description = product.description;
331
- p.itemLineId = product.itemLineId ? product.itemLineId.toString() : "" + (index + 1);
332
- p.price = product.selectedPrice;
333
- p.quantity = product.quantity;
334
- p.totalLinePrice = product.quantity * product.selectedPrice;
335
- p.imageUrls = product.imageUrls;
336
- p.selectedRRPPrice = product.selectedRRPPrice;
337
- //inventory fields
338
- p.fullfilmentId = product.fullfilmentId ? product.fullfilmentId : _this.storeInfo.storeId;
339
- p.fullfilmentLocationName = product.fullfilmentLocationName;
340
- p.deliveryGroup = product.deliveryGroup;
341
- p.leadTime = product.leadTime;
342
- p.deliveryMethod = product.deliveryMethod;
343
- p.giftCard = product.giftCard;
344
- p.giftCardExpiryDate = product.giftCardExpiryDate;
345
- p.giftCardNumberIssued = product.giftCardNumberIssued;
346
- p.giftCardRecipientEmail = product.giftCardRecipientEmail;
347
- p.giftCardRecipientName = product.giftCardRecipientName;
348
- if (product.refundedQuantity > 0) {
349
- p.refundedQuantity = product.refundedQuantity;
350
- p.refundedPromotionalQuantity = product.refundPromotionalQuantity;
351
- p.refunded = product.refunded;
352
- p.refundedReasonDescription = product.refundedReasonDescription;
353
- p.refundedReason = product.refundedReason;
354
- if (!p.refundedReasonDescription) {
355
- p.refundedReasonDescription = p.refundedReason;
356
- }
357
- p.refundedTotal = product.refundedTotal;
358
- p.isLastExchanged = product.isLastExchanged;
359
- }
360
- if (product.exchange) {
361
- p.exchange = product.exchange;
362
- }
363
- if (product.lineDiscount) {
364
- p.lineDiscount = product.lineDiscount;
365
- }
366
- p.itemDiscounts = (/** @type {?} */ (product.itemDiscounts));
367
- _this.transactionDocument.basket.products.push(p);
368
- _this.lineDiscount(basketDetails);
369
- }));
370
- console.info("ebasket: transactiondocument basket details updated", JSON.stringify(this.transactionDocument.basket));
371
- return this;
372
- };
373
- /**
374
- * current transaction Details Total(New Products)
375
- * @returns currentTransactionDetails
376
- */
377
- /**
378
- * current transaction Details Total(New Products)
379
- * @param {?} basket
380
- * @return {?} currentTransactionDetails
381
- */
382
- TransactionDocumentBuilder.prototype.currentTransactionDetails = /**
383
- * current transaction Details Total(New Products)
384
- * @param {?} basket
385
- * @return {?} currentTransactionDetails
386
- */
387
- function (basket) {
388
- var _a;
389
- var _this = this;
390
- console.log("ebasket: current transaction details for exchanges", basket);
391
- this.transactionDocument.currentTransactionDetails.products = (/** @type {?} */ ([]));
392
- this.transactionDocument.currentTransactionDetails.linePromotion = (/** @type {?} */ ([]));
393
- this.transactionDocument.currentTransactionDetails.lineDiscount = (/** @type {?} */ ([]));
394
- this.transactionDocument.currentTransactionDetails.transactionDiscount = [];
395
- this.transactionDocument.currentTransactionDetails.products = basket.products;
396
- this.transactionDocument.currentTransactionDetails.products = this.transactionDocument.currentTransactionDetails.products.filter((/**
397
- * @param {?} proj
398
- * @return {?}
399
- */
400
- function (proj) { return proj.refundedQuantity != 0; }));
401
- this.transactionDocument.currentTransactionDetails.products.forEach((/**
402
- * @param {?} product
403
- * @return {?}
404
- */
405
- function (product) {
406
- if (product.refundedQuantity) {
407
- product.quantity = product.refundedQuantity;
408
- // updating total line price with actual price to be refunded including the refunding qty
409
- product.totalLinePrice = Math.abs(product.refundedTotal);
410
- product.total = product.totalLinePrice;
411
- if (product.quantity === product.refundedQuantity) {
412
- product.refunded = true;
413
- }
414
- }
415
- //Updating line promotions and line discounts
416
- if (product.linePromotions && !product.refundedQuantity) {
417
- _this.transactionDocument.currentTransactionDetails.linePromotion.push(product.linePromotions);
418
- }
419
- if (product.lineDiscount && !product.refundedQuantity) {
420
- _this.transactionDocument.currentTransactionDetails.lineDiscount.push(product.lineDiscount);
421
- }
422
- }));
423
- console.log("ebasket: current transaction details after removing old products", this.transactionDocument.currentTransactionDetails.products);
424
- if (basket.transactionDiscount && basket.transactionDiscount.length > 0) {
425
- (_a = this.transactionDocument.currentTransactionDetails.transactionDiscount).push.apply(_a, tslib_1.__spread(basket.transactionDiscount));
426
- }
427
- this.transactionDocument.currentTransactionDetails.basketSummary = (/** @type {?} */ ({}));
428
- this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(this.transactionDocument.currentTransactionDetails));
429
- this.transactionDocument.currentTransactionDetails.basketSummary.totalItems = basket.quantity;
430
- this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal = basket.basketTotal;
431
- this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal = this.updateCurrentTransactionDetailsRefundTotal();
432
- // For partial refund discount is updatied in total line price so discountTotal will always be zero & in case of exchange discount total is calculated
433
- if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
434
- this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateCurrentTransactionDetailsDiscountTotal());
435
- }
436
- else {
437
- if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {
438
- /** @type {?} */
439
- var discountTotal_1 = 0;
440
- this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((/**
441
- * @param {?} discount
442
- * @return {?}
443
- */
444
- function (discount) {
445
- discountTotal_1 += discount.discountAmount;
446
- }));
447
- this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = Math.abs(discountTotal_1);
448
- }
449
- else {
450
- this.transactionDocument.currentTransactionDetails.basketSummary.discountTotal = 0;
451
- }
452
- }
453
- console.log("ebasket:this.transactionDocument.currentTransactionDetails", JSON.stringify(this.transactionDocument.currentTransactionDetails));
454
- return this;
455
- };
456
- /**
457
- * current transaction Tax Total
458
- * @returns Tax Total
459
- */
460
- /**
461
- * current transaction Tax Total
462
- * @param {?} basketDetails
463
- * @return {?} Tax Total
464
- */
465
- TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsTaxBreakdown = /**
466
- * current transaction Tax Total
467
- * @param {?} basketDetails
468
- * @return {?} Tax Total
469
- */
470
- function (basketDetails) {
471
- var _this = this;
472
- /** @type {?} */
473
- var transactionDiscountTotal = 0;
474
- /** @type {?} */
475
- var taxBreakdown = {
476
- taxLines: [],
477
- totalTaxableAmount: 0,
478
- };
479
- if (this.transactionDocument.currentTransactionDetails.transactionDiscount && this.transactionDocument.currentTransactionDetails.transactionDiscount.length > 0) {
480
- this.transactionDocument.currentTransactionDetails.transactionDiscount.forEach((/**
481
- * @param {?} discount
482
- * @return {?}
483
- */
484
- function (discount) {
485
- transactionDiscountTotal += discount.discountAmount;
486
- }));
487
- }
488
- if (this.transactionDocument.currentTransactionDetails.products && this.transactionDocument.currentTransactionDetails.products.length > 0) {
489
- this.transactionDocument.currentTransactionDetails.products.forEach((/**
490
- * @param {?} product
491
- * @return {?}
492
- */
493
- function (product) {
494
- /** @type {?} */
495
- var taxLine = {
496
- itemLineId: product.itemLineId,
497
- VAT: product.selectedVAT ? product.selectedVAT : 0,
498
- VATCode: product.selectedVATCode,
499
- taxLineTotal: 0,
500
- taxableAmount: product.total,
501
- PreTax: 0
502
- };
503
- console.info("Product contribution : item line ID :current transaction Details", product.itemLineId, "tax line :", JSON.stringify(taxLine), JSON.stringify(basketDetails.basketTotal));
504
- //step 1
505
- // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
506
- //If transaction discount/promotion is applied taxable amount should be deducting transaction promotion and transaction disacount portion
507
- if (product.refundedQuantity && product.refundedQuantity > 0) {
508
- taxLine.taxableAmount = -Math.abs(taxLine.taxableAmount - product.itemDiscounts.currentRefundPortion);
509
- }
510
- else {
511
- taxLine.taxableAmount = taxLine.taxableAmount - product.itemDiscounts.trnDiscountsPortion - product.itemDiscounts.trnPromotionsPortion;
512
- }
513
- //step 2 - find pre tax
514
- taxLine.PreTax = _this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));
515
- //step 3 - Update taxbreakdown
516
- taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;
517
- taxLine.taxableAmount = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);
518
- // step 4 - update tax Line total
519
- taxLine.taxLineTotal = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);
520
- taxBreakdown.taxLines.push(taxLine);
521
- }));
522
- }
523
- taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);
524
- this.transactionDocument.currentTransactionDetails.taxBreakdown = taxBreakdown;
525
- if (this.transactionDocument.currentTransactionDetails.taxBreakdown && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines && this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.length > 0) {
526
- this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.reduce((/**
527
- * @param {?} n
528
- * @param {?} __1
529
- * @return {?}
530
- */
531
- function (n, _a) {
532
- var taxLineTotal = _a.taxLineTotal;
533
- return n + taxLineTotal;
534
- }), 0));
535
- }
536
- else {
537
- this.transactionDocument.currentTransactionDetails.basketSummary.VATTotal = 0.00;
538
- }
539
- console.log("eBasket:after calculating tax currenttransactionDetails", this.transactionDocument.currentTransactionDetails);
540
- return this;
541
- };
542
- /**
543
- * @return {?}
544
- */
545
- TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsTotalTaxSummary = /**
546
- * @return {?}
547
- */
548
- function () {
549
- var _this = this;
550
- console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown));
551
- /** @type {?} */
552
- var totalTaxSummaryArray = [];
553
- /** @type {?} */
554
- var totalTaxSummaryGroup = [];
555
- console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines));
556
- this.transactionDocument.currentTransactionDetails.taxBreakdown.taxLines.forEach((/**
557
- * @param {?} element
558
- * @return {?}
559
- */
560
- function (element) {
561
- /** @type {?} */
562
- var TaxSummary = {
563
- VATCode: "",
564
- VAT: -12345,
565
- PreTaxSum: 0,
566
- TaxSum: 0,
567
- TXrateSum: 0
568
- };
569
- TaxSummary.VATCode = element.VATCode;
570
- TaxSummary.VAT = element.VAT;
571
- TaxSummary.PreTaxSum = _this.numberUtilService.trimTo2Decimal2(element.PreTax);
572
- TaxSummary.TaxSum = _this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);
573
- TaxSummary.TXrateSum = _this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
574
- totalTaxSummaryArray.push(TaxSummary);
575
- }));
576
- console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
577
- totalTaxSummaryGroup = totalTaxSummaryArray.reduce((/**
578
- * @param {?} preparedArray
579
- * @param {?} currentObj
580
- * @return {?}
581
- */
582
- function (preparedArray, currentObj) {
583
- /** @type {?} */
584
- var ind = preparedArray.findIndex((/**
585
- * @param {?} x
586
- * @return {?}
587
- */
588
- function (x) { return x.VAT === currentObj.VAT; }));
589
- if (ind === -1) {
590
- preparedArray.push(currentObj);
591
- }
592
- else {
593
- preparedArray[ind].VATCode = currentObj.VATCode;
594
- preparedArray[ind].VAT = currentObj.VAT;
595
- preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;
596
- preparedArray[ind].TaxSum += currentObj.TaxSum;
597
- preparedArray[ind].TXrateSum += currentObj.TXrateSum;
598
- }
599
- return preparedArray;
600
- }), []);
601
- // listOfTags.map(x => unique.filter(a => a.label == x.label && a.color == x.color).length > 0 ? null : unique.push(x));
602
- console.log("Total Tax Summer Group :", JSON.stringify(totalTaxSummaryGroup));
603
- this.transactionDocument.currentTransactionDetails.totalTaxSummary = totalTaxSummaryGroup;
604
- return this;
605
- };
606
- /**
607
- * current transaction Disocunt Total
608
- * @returns Discount Total
609
- */
610
- /**
611
- * current transaction Disocunt Total
612
- * @return {?} Discount Total
613
- */
614
- TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsDiscountTotal = /**
615
- * current transaction Disocunt Total
616
- * @return {?} Discount Total
617
- */
618
- function () {
619
- /** @type {?} */
620
- var refundTotal = this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal ? this.transactionDocument.currentTransactionDetails.basketSummary.refundTotal : 0;
621
- console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", refundTotal, this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal, this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal);
622
- /** @type {?} */
623
- var discountTotal = Math.abs(Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.saleTotal) -
624
- (Math.abs(this.transactionDocument.currentTransactionDetails.basketSummary.basketTotal) + Math.abs(refundTotal)));
625
- console.log("e-basket: transaction builder updateCurrentTransactionDetailsDiscountTotal: discountTotal", discountTotal);
626
- return Number(discountTotal.toFixed(2));
627
- };
628
- /**
629
- * current transaction Refund Total
630
- * @returns Refund Total
631
- */
632
- /**
633
- * current transaction Refund Total
634
- * @return {?} Refund Total
635
- */
636
- TransactionDocumentBuilder.prototype.updateCurrentTransactionDetailsRefundTotal = /**
637
- * current transaction Refund Total
638
- * @return {?} Refund Total
639
- */
640
- function () {
641
- /** @type {?} */
642
- var totalRefund = 0;
643
- for (var index = 0; index < this.transactionDocument.currentTransactionDetails.products.length; index++) {
644
- /** @type {?} */
645
- var product = this.transactionDocument.currentTransactionDetails.products[index];
646
- if (product.refundedTotal) {
647
- totalRefund = totalRefund + product.refundedTotal;
648
- }
649
- console.log("ebasket : transaction Service: totalRefund for Current TransactionDetails" + totalRefund);
650
- }
651
- return totalRefund;
652
- };
653
- /**
654
- * Baskets summary
655
- * @param basketDetails
656
- * @returns summary
657
- */
658
- /**
659
- * Baskets summary
660
- * @param {?} basketDetails
661
- * @return {?} summary
662
- */
663
- TransactionDocumentBuilder.prototype.basketSummary = /**
664
- * Baskets summary
665
- * @param {?} basketDetails
666
- * @return {?} summary
667
- */
668
- function (basketDetails) {
669
- this.transactionDocument.basketSummary.basketTotal = this.numberUtilService.trimTo2Decimal(basketDetails.basketTotal);
670
- this.transactionDocument.basketSummary.saleTotal = this.numberUtilService.trimTo2Decimal2(this.updateSaleTotal(basketDetails));
671
- this.transactionDocument.basketSummary.refundTotal = this.getRefundTotal();
672
- if (this.transactionDocument.basket.lineDiscount ||
673
- this.transactionDocument.basket.linePromotion) {
674
- this.transactionDocument.basketSummary.discountTotal = this.numberUtilService.trimTo2Decimal2(this.updateDiscountTotal());
675
- }
676
- this.transactionDocument.basketSummary.totalItems = basketDetails.quantity;
677
- if (this.transactionDocument.basket.taxBreakdown) {
678
- this.transactionDocument.basketSummary.VATTotal = this.numberUtilService.trimTo2Decimal2(this.transactionDocument.basket.taxBreakdown.taxLines.reduce((/**
679
- * @param {?} n
680
- * @param {?} __1
681
- * @return {?}
682
- */
683
- function (n, _a) {
684
- var taxLineTotal = _a.taxLineTotal;
685
- return n + taxLineTotal;
686
- }), 0));
687
- }
688
- else {
689
- this.transactionDocument.basketSummary.VATTotal = 0.00;
690
- }
691
- console.info("ebasket: basketsummary updated in transaction document: ", JSON.stringify(this.transactionDocument.basketSummary));
692
- return this;
693
- };
694
- /**
695
- * Line Discount
696
- * @param basketDetails
697
- * @returns line Discount
698
- */
699
- /**
700
- * Line Discount
701
- * @param {?} basketDetails
702
- * @return {?} line Discount
703
- */
704
- TransactionDocumentBuilder.prototype.lineDiscount = /**
705
- * Line Discount
706
- * @param {?} basketDetails
707
- * @return {?} line Discount
708
- */
709
- function (basketDetails) {
710
- this.transactionDocument.basket.lineDiscount = [];
711
- for (var index = 0; index < basketDetails.products.length; index++) {
712
- /** @type {?} */
713
- var element = basketDetails.products[index];
714
- if (element.lineDiscount) {
715
- this.transactionDocument.basket.lineDiscount.push(element.lineDiscount);
716
- this.transactionDocument.basket.lineDiscount = this.transactionDocument.basket.lineDiscount.reduce((/**
717
- * @param {?} acc
718
- * @param {?} val
719
- * @return {?}
720
- */
721
- function (acc, val) {
722
- if (!acc.find((/**
723
- * @param {?} el
724
- * @return {?}
725
- */
726
- function (el) { return el.itemLineId === val.itemLineId; }))) {
727
- acc.push(val);
728
- }
729
- return acc;
730
- }), []);
731
- }
732
- // console.info(
733
- // "e-basket :line discount updated in transaction document",
734
- // this.transactionDocument.basket.lineDiscount
735
- // );
736
- }
737
- return this;
738
- };
739
- /**
740
- * exchange
741
- * @param basketDetails
742
- * @returns exchange
743
- */
744
- /**
745
- * exchange
746
- * @param {?} basketDetails
747
- * @return {?} exchange
748
- */
749
- TransactionDocumentBuilder.prototype.exchange = /**
750
- * exchange
751
- * @param {?} basketDetails
752
- * @return {?} exchange
753
- */
754
- function (basketDetails) {
755
- this.transactionDocument.basket.exchange = basketDetails.exchange && basketDetails.exchange.length > 0 ? tslib_1.__spread(basketDetails.exchange) : [];
756
- var _loop_1 = function (index) {
757
- /** @type {?} */
758
- var element = basketDetails.products[index];
759
- if (element.exchange != undefined) {
760
- /** @type {?} */
761
- var isPresent = this_1.transactionDocument.basket.exchange.some((/**
762
- * @param {?} el
763
- * @return {?}
764
- */
765
- function (el) { return el.exchangeId === element.exchange.exchangeId; }));
766
- if (!isPresent) {
767
- /** @type {?} */
768
- var exchangeItems = [];
769
- for (var j = 0; j < element.exchange.newItems.length; j++) {
770
- /** @type {?} */
771
- var item = element.exchange.newItems[j];
772
- /** @type {?} */
773
- var newItems = { lineItemId: item.itemLineId, Quantity: item.quantity };
774
- exchangeItems.push(newItems);
775
- }
776
- element.exchange.newItems = tslib_1.__spread(exchangeItems);
777
- this_1.transactionDocument.basket.exchange.push(element.exchange);
778
- }
779
- }
780
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket exchange", JSON.stringify(this_1.transactionDocument.basket.exchange));
781
- };
782
- var this_1 = this;
783
- for (var index = 0; index < basketDetails.products.length; index++) {
784
- _loop_1(index);
785
- }
786
- return this;
787
- };
788
- /**
789
- * add previous exchange data
790
- * @param originalTransactionDocument
791
- * @returns line Promotions
792
- */
793
- /**
794
- * add previous exchange data
795
- * @param {?} originalTransactionDocument
796
- * @return {?} line Promotions
797
- */
798
- TransactionDocumentBuilder.prototype.addExchangeData = /**
799
- * add previous exchange data
800
- * @param {?} originalTransactionDocument
801
- * @return {?} line Promotions
802
- */
803
- function (originalTransactionDocument) {
804
- this.transactionDocument.basket.exchange = originalTransactionDocument.basket.exchange ? tslib_1.__spread(originalTransactionDocument.basket.exchange) : null;
805
- return this;
806
- };
807
- /**
808
- * line Promotions
809
- * @param basketDetails
810
- * @returns line Promotions
811
- */
812
- /**
813
- * line Promotions
814
- * @param {?} basketDetails
815
- * @return {?} line Promotions
816
- */
817
- TransactionDocumentBuilder.prototype.linePromotion = /**
818
- * line Promotions
819
- * @param {?} basketDetails
820
- * @return {?} line Promotions
821
- */
822
- function (basketDetails) {
823
- this.transactionDocument.basket.linePromotion = [];
824
- for (var index = 0; index < basketDetails.products.length; index++) {
825
- /** @type {?} */
826
- var element = basketDetails.products[index];
827
- if (element.linePromotions) {
828
- this.transactionDocument.basket.linePromotion.push(element.linePromotions);
829
- this.transactionDocument.basket.linePromotion = this.transactionDocument.basket.linePromotion.reduce((/**
830
- * @param {?} acc
831
- * @param {?} val
832
- * @return {?}
833
- */
834
- function (acc, val) {
835
- if (!acc.find((/**
836
- * @param {?} el
837
- * @return {?}
838
- */
839
- function (el) { return el.itemLineId === val.itemLineId; }))) {
840
- acc.push(val);
841
- }
842
- return acc;
843
- }), []);
844
- }
845
- }
846
- return this;
847
- };
848
- /**
849
- * transaction Promotion
850
- * @param basketDetails
851
- * @returns transaction Promotion
852
- */
853
- /**
854
- * transaction Promotion
855
- * @param {?} basketDetails
856
- * @return {?} transaction Promotion
857
- */
858
- TransactionDocumentBuilder.prototype.transactionPromotion = /**
859
- * transaction Promotion
860
- * @param {?} basketDetails
861
- * @return {?} transaction Promotion
862
- */
863
- function (basketDetails) {
864
- if (basketDetails.transactionPromotion) {
865
- this.transactionDocument.basket.transactionPromotion =
866
- basketDetails.transactionPromotion;
867
- // for (let index = 0; index < basketDetails.TransactionDiscount.length; index++) {
868
- // this.transactionDocument.basket.transactionPromotion.push(element.linePromotions)
869
- // this.transactionDocument.basket.transactionPromotion = this.transactionDocument.basket.linePromotions.reduce((acc, val) => {
870
- // if (!acc.find(el => el.itemLineId === val.itemLineId)) {
871
- // acc.push(val);
872
- // }
873
- // return acc;
874
- // }, []);
875
- // }
876
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.basket.transactionPromotion", JSON.stringify(this.transactionDocument.basket.transactionPromotion));
877
- }
878
- return this;
879
- };
880
- /**
881
- * @param {?} basketDetails
882
- * @return {?}
883
- */
884
- TransactionDocumentBuilder.prototype.transactionDiscount = /**
885
- * @param {?} basketDetails
886
- * @return {?}
887
- */
888
- function (basketDetails) {
889
- if (basketDetails.transactionDiscount) {
890
- this.transactionDocument.basket.transactionDiscount =
891
- basketDetails.transactionDiscount;
892
- console.log("e-basket :TransactionDocumentBuilder: transaction Discount", JSON.stringify(this.transactionDocument.basket.transactionDiscount));
893
- }
894
- return this;
895
- };
896
- /**
897
- * Payments details
898
- * @param paymentDetails
899
- * @returns
900
- */
901
- /**
902
- * Payments details
903
- * @template THIS
904
- * @this {THIS}
905
- * @param {?} paymentDetails
906
- * @return {THIS}
907
- */
908
- TransactionDocumentBuilder.prototype.paymentDetails = /**
909
- * Payments details
910
- * @template THIS
911
- * @this {THIS}
912
- * @param {?} paymentDetails
913
- * @return {THIS}
914
- */
915
- function (paymentDetails) {
916
- console.info("ebasket : payment details after transaction completed", JSON.stringify(paymentDetails));
917
- (/** @type {?} */ (this)).transactionDocument.paymentDetails = paymentDetails;
918
- return (/** @type {?} */ (this));
919
- };
920
- /**
921
- * Payments details
922
- * @param paymentDetails
923
- * @returns
924
- */
925
- /**
926
- * Payments details
927
- * @template THIS
928
- * @this {THIS}
929
- * @param {?} splitPayment
930
- * @return {THIS}
931
- */
932
- TransactionDocumentBuilder.prototype.splitPayment = /**
933
- * Payments details
934
- * @template THIS
935
- * @this {THIS}
936
- * @param {?} splitPayment
937
- * @return {THIS}
938
- */
939
- function (splitPayment) {
940
- (/** @type {?} */ (this)).transactionDocument.splitPayment = splitPayment;
941
- return (/** @type {?} */ (this));
942
- };
943
- /**
944
- * Payments details
945
- * @param paymentDetails
946
- * @returns
947
- */
948
- /**
949
- * Payments details
950
- * @template THIS
951
- * @this {THIS}
952
- * @param {?} isPaymentCompleted
953
- * @return {THIS}
954
- */
955
- TransactionDocumentBuilder.prototype.isPaymentCompleted = /**
956
- * Payments details
957
- * @template THIS
958
- * @this {THIS}
959
- * @param {?} isPaymentCompleted
960
- * @return {THIS}
961
- */
962
- function (isPaymentCompleted) {
963
- (/** @type {?} */ (this)).transactionDocument.isPaymentCompleted = isPaymentCompleted;
964
- return (/** @type {?} */ (this));
965
- };
966
- /**
967
- * Bases currency
968
- * @param currency
969
- * @returns currency
970
- */
971
- /**
972
- * Bases currency
973
- * @param {?} currency
974
- * @return {?} currency
975
- */
976
- TransactionDocumentBuilder.prototype.baseCurrency = /**
977
- * Bases currency
978
- * @param {?} currency
979
- * @return {?} currency
980
- */
981
- function (currency) {
982
- this.transactionDocument.baseCurrency = currency;
983
- return this;
984
- };
985
- /**
986
- * gift option at
987
- * @returns at
988
- */
989
- /**
990
- * gift option at
991
- * @param {?} gift
992
- * @return {?} at
993
- */
994
- TransactionDocumentBuilder.prototype.giftOption = /**
995
- * gift option at
996
- * @param {?} gift
997
- * @return {?} at
998
- */
999
- function (gift) {
1000
- console.log("e-basket :TransactionDocumentBuilder: this.transactionDocument.giftoption", gift);
1001
- if (gift) {
1002
- this.transactionDocument.giftedReceipt = gift;
1003
- }
1004
- return this;
1005
- };
1006
- /**
1007
-
1008
- /**
1009
- * manual Discount
1010
- * @param discountData
1011
- * @returns
1012
- */
1013
- // manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
1014
- // let saleTotal = this.transactionDocument.basketSummary.basketTotal;
1015
- // if(discountData.discountType =='Percent'){
1016
- // this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
1017
- // discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
1018
- // }else {
1019
- // this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
1020
- // discountData.discountAmount = -1*discountData.discountAmount;
1021
- // }
1022
- // this.transactionDocument.transactionDiscount.push(discountData);
1023
- // return this;
1024
- // }
1025
- /**
1026
- * Types transaction document builder
1027
- * @param t
1028
- * @returns type
1029
- */
1030
- /**
1031
-
1032
- /**
1033
- * manual Discount
1034
- * @param discountData
1035
- * @returns
1036
- */
1037
- // manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
1038
- // let saleTotal = this.transactionDocument.basketSummary.basketTotal;
1039
- // if(discountData.discountType =='Percent'){
1040
- // this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
1041
- // discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
1042
- // }else {
1043
- // this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
1044
- // discountData.discountAmount = -1*discountData.discountAmount;
1045
- // }
1046
- // this.transactionDocument.transactionDiscount.push(discountData);
1047
- // return this;
1048
- // }
1049
- /**
1050
- * Types transaction document builder
1051
- * @param {?} t
1052
- * @return {?} type
1053
- */
1054
- TransactionDocumentBuilder.prototype.type = /**
1055
-
1056
- /**
1057
- * manual Discount
1058
- * @param discountData
1059
- * @returns
1060
- */
1061
- // manualDiscount(discountData : basketDiscount):TransactionDocumentBuilder {
1062
- // let saleTotal = this.transactionDocument.basketSummary.basketTotal;
1063
- // if(discountData.discountType =='Percent'){
1064
- // this.transactionDocument.basketSummary.basketTotal = saleTotal-(saleTotal*(discountData.discountAmount/100));
1065
- // discountData.discountAmount = -1*(saleTotal-this.transactionDocument.basketSummary.basketTotal);
1066
- // }else {
1067
- // this.transactionDocument.basketSummary.basketTotal =saleTotal-discountData.discountAmount;
1068
- // discountData.discountAmount = -1*discountData.discountAmount;
1069
- // }
1070
- // this.transactionDocument.transactionDiscount.push(discountData);
1071
- // return this;
1072
- // }
1073
- /**
1074
- * Types transaction document builder
1075
- * @param {?} t
1076
- * @return {?} type
1077
- */
1078
- function (t) {
1079
- this.transactionDocument.type = t;
1080
- return this;
1081
- };
1082
- /**
1083
- * Operations status
1084
- * @param o
1085
- * @returns status
1086
- */
1087
- /**
1088
- * Operations status
1089
- * @param {?} o
1090
- * @return {?} status
1091
- */
1092
- TransactionDocumentBuilder.prototype.operationStatus = /**
1093
- * Operations status
1094
- * @param {?} o
1095
- * @return {?} status
1096
- */
1097
- function (o) {
1098
- this.transactionDocument.operationStatus = o;
1099
- return this;
1100
- };
1101
- /**
1102
- * Created at
1103
- * @returns at
1104
- */
1105
- /**
1106
- * Created at
1107
- * @return {?} at
1108
- */
1109
- TransactionDocumentBuilder.prototype.createdAt = /**
1110
- * Created at
1111
- * @return {?} at
1112
- */
1113
- function () {
1114
- /** @type {?} */
1115
- var date = new Date();
1116
- this.transactionDocument.createdAt = date.toISOString();
1117
- this.transactionDocument.updatedAt = date.toISOString();
1118
- return this;
1119
- };
1120
- /**
1121
- * Updated at
1122
- * @returns at
1123
- */
1124
- /**
1125
- * Updated at
1126
- * @return {?} at
1127
- */
1128
- TransactionDocumentBuilder.prototype.updatedAt = /**
1129
- * Updated at
1130
- * @return {?} at
1131
- */
1132
- function () {
1133
- /** @type {?} */
1134
- var date = new Date();
1135
- this.transactionDocument.updatedAt = date.toISOString();
1136
- return this;
1137
- };
1138
- /**
1139
- * transsaction completion at
1140
- * @returns transaction completion date
1141
- */
1142
- /**
1143
- * transsaction completion at
1144
- * @return {?} transaction completion date
1145
- */
1146
- TransactionDocumentBuilder.prototype.transactionCompletedAt = /**
1147
- * transsaction completion at
1148
- * @return {?} transaction completion date
1149
- */
1150
- function () {
1151
- /** @type {?} */
1152
- var date = new Date();
1153
- this.transactionDocument.transCompletedAt = date.toISOString();
1154
- return this;
1155
- };
1156
- /**
1157
- * Builds transaction document builder
1158
- * @returns build
1159
- */
1160
- /**
1161
- * Builds transaction document builder
1162
- * @return {?} build
1163
- */
1164
- TransactionDocumentBuilder.prototype.build = /**
1165
- * Builds transaction document builder
1166
- * @return {?} build
1167
- */
1168
- function () {
1169
- return this.transactionDocument;
1170
- };
1171
- /**
1172
- * Sales total in refund
1173
- * @param saleTotal
1174
- * @returns total in refund
1175
- */
1176
- /**
1177
- * Sales total in refund
1178
- * @param {?} saleTotal
1179
- * @return {?} total in refund
1180
- */
1181
- TransactionDocumentBuilder.prototype.saleTotalInRefund = /**
1182
- * Sales total in refund
1183
- * @param {?} saleTotal
1184
- * @return {?} total in refund
1185
- */
1186
- function (saleTotal) {
1187
- this.transactionDocument.saleTotal = saleTotal;
1188
- return this;
1189
- };
1190
- /**
1191
- * Gets basket details
1192
- * @returns basket details
1193
- */
1194
- /**
1195
- * Gets basket details
1196
- * @return {?} basket details
1197
- */
1198
- TransactionDocumentBuilder.prototype.getBasketDetails = /**
1199
- * Gets basket details
1200
- * @return {?} basket details
1201
- */
1202
- function () {
1203
- var _this = this;
1204
- console.info("ebasket: Getting Basket for transactionDocument", JSON.stringify(this.transactionDocument));
1205
- /** @type {?} */
1206
- var basket = {
1207
- subsidiaryId: this.transactionDocument.subsidiaryId,
1208
- transactionDiscount: this.transactionDocument.basket.transactionDiscount,
1209
- transactionPromotion: this.transactionDocument.basket.transactionPromotion,
1210
- transactionId: this.transactionDocument.transactionId,
1211
- offlineTransactionId: this.transactionDocument.offlineTransactionId,
1212
- total: this.transactionDocument.basketSummary.basketTotal,
1213
- basketTotal: this.transactionDocument.basketSummary.basketTotal,
1214
- discountTotal: this.transactionDocument.basketSummary.discountTotal,
1215
- saleTotal: this.transactionDocument.basketSummary.saleTotal,
1216
- refundTotal: this.transactionDocument.basketSummary.refundTotal,
1217
- quantity: this.transactionDocument.basketSummary.totalItems,
1218
- products: [],
1219
- baseCurrency: this.transactionDocument.baseCurrency,
1220
- customer: this.transactionDocument.customer,
1221
- };
1222
- basket.products = (/** @type {?} */ ([]));
1223
- this.transactionDocument.basket.products.forEach((/**
1224
- * @param {?} product
1225
- * @param {?} index
1226
- * @return {?}
1227
- */
1228
- function (product, index) {
1229
- console.log(JSON.stringify(product), "ebasket: basket detail update in basket");
1230
- /** @type {?} */
1231
- var p = (/** @type {?} */ ({}));
1232
- p.SKU = product.SKU;
1233
- p.barcode = product.barCode;
1234
- p.barcodes = product.barcodes;
1235
- p.description = product.description;
1236
- p.imageUrls = product.imageUrls;
1237
- p.currency = _this.transactionDocument.baseCurrency;
1238
- p.totalLinePrice = product.totalLinePrice;
1239
- p.itemLineId = Number(product.itemLineId);
1240
- p.excludePromotion = product.excludePromotion;
1241
- p.selectedPrice = product.price;
1242
- p.quantity = product.quantity;
1243
- p.total = product.totalLinePrice;
1244
- p.selectedRRPPrice = product.selectedRRPPrice;
1245
- p.fullfilmentId = product.fullfilmentId;
1246
- p.fullfilmentLocationName = product.fullfilmentLocationName;
1247
- p.deliveryGroup = product.deliveryGroup || "1";
1248
- p.leadTime = product.leadTime;
1249
- p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
1250
- if (p.fullfilmentId != _this.transactionDocument.storeId) {
1251
- p.isWebOrder = true;
1252
- }
1253
- p.giftCard = product.giftCard;
1254
- p.giftCardExpiryDate = product.giftCardExpiryDate;
1255
- p.giftCardNumberIssued = product.giftCardNumberIssued;
1256
- p.giftCardRecipientEmail = product.giftCardRecipientEmail;
1257
- p.giftCardRecipientName = product.giftCardRecipientName;
1258
- if (_this.transactionDocument.basket.lineDiscount &&
1259
- _this.transactionDocument.basket.lineDiscount.length > 0) {
1260
- _this.transactionDocument.basket.lineDiscount.forEach((/**
1261
- * @param {?} lineDiscount
1262
- * @return {?}
1263
- */
1264
- function (lineDiscount) {
1265
- if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1266
- p.lineDiscount = lineDiscount;
1267
- p.total = lineDiscount.discountedLinePrice;
1268
- }
1269
- }));
1270
- }
1271
- if (_this.transactionDocument.basket.linePromotion &&
1272
- _this.transactionDocument.basket.linePromotion.length > 0) {
1273
- _this.transactionDocument.basket.linePromotion.forEach((/**
1274
- * @param {?} linePromotion
1275
- * @return {?}
1276
- */
1277
- function (linePromotion) {
1278
- if (product.itemLineId === linePromotion.itemLineId.toString()) {
1279
- p.linePromotions = linePromotion;
1280
- p.total = linePromotion.promotionLinePrice;
1281
- }
1282
- }));
1283
- }
1284
- if (_this.transactionDocument.basket.taxBreakdown &&
1285
- _this.transactionDocument.basket.taxBreakdown.taxLines.length > 0) {
1286
- _this.transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
1287
- * @param {?} taxLine
1288
- * @return {?}
1289
- */
1290
- function (taxLine) {
1291
- if (product.itemLineId && product.itemLineId === taxLine.itemLineId.toString()) {
1292
- p.selectedVAT = taxLine.VAT;
1293
- p.selectedVATCode = taxLine.VATCode;
1294
- }
1295
- }));
1296
- }
1297
- if (_this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
1298
- p.total = product.refundedTotal;
1299
- }
1300
- else if ((_this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || TRANSACTION_TYPE.SALE_EXCHANGE) && product.refundedQuantity > 0) {
1301
- p.refundedReasonDescription = product.refundedReasonDescription;
1302
- p.refundedReason = product.refundedReason;
1303
- if (!p.refundedReasonDescription) {
1304
- p.refundedReasonDescription = p.refundedReason;
1305
- }
1306
- p.refundedQuantity = product.refundedQuantity;
1307
- p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
1308
- p.refundedTotal = product.refundedTotal;
1309
- p.total -= Math.abs(p.refundedTotal);
1310
- p.isLastExchanged = product.isLastExchanged;
1311
- }
1312
- if (_this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
1313
- if (p.total > 0) {
1314
- p.total *= -1;
1315
- }
1316
- }
1317
- basket.products.push(p);
1318
- }));
1319
- basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
1320
- basket.total = (basket.basketTotal || 0) + this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
1321
- if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
1322
- basket.quantity = this.getRefundedTotalWithQuantity(basket);
1323
- }
1324
- console.info("ebasket: Basket created successfully", JSON.stringify(basket));
1325
- return basket;
1326
- };
1327
- /**
1328
- * Gets basket details
1329
- * @returns refund basket details
1330
- */
1331
- // getRefundBasketDetails(): Basket {
1332
- // let basket: Basket = {
1333
- // subsidiaryId : this.transactionDocument.subsidiaryId,
1334
- // transactionDiscount: this.transactionDocument.basket.transactionDiscount,
1335
- // transactionPromotion: this.transactionDocument.basket.transactionPromotion,
1336
- // transactionId: this.transactionDocument.transactionId,
1337
- // total: this.transactionDocument.basketSummary.basketTotal,
1338
- // basketTotal: this.transactionDocument.basketSummary.basketTotal,
1339
- // discountTotal: this.transactionDocument.basketSummary.discountTotal,
1340
- // saleTotal: this.transactionDocument.basketSummary.saleTotal,
1341
- // quantity: this.transactionDocument.basketSummary.totalItems,
1342
- // products: [],
1343
- // baseCurrency: this.transactionDocument.baseCurrency,
1344
- // customer: this.transactionDocument.customer,
1345
- // };
1346
- // basket.products = [] as Product[];
1347
- // this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
1348
- // const p = {} as Product;
1349
- // p.SKU = product.SKU;
1350
- // p.barcode = product.barCode;
1351
- // p.barcodes = product.barcodes;
1352
- // p.description = product.description;
1353
- // p.imageUrls = product.imageUrls;
1354
- // p.currency = this.transactionDocument.baseCurrency;
1355
- // p.totalLinePrice = product.totalLinePrice;
1356
- // p.itemLineId = Number(product.itemLineId);
1357
- // p.excludePromotion = product.excludePromotion;
1358
- // p.selectedPrice = product.price;
1359
- // p.quantity = product.quantity;
1360
- // p.total = product.totalLinePrice;
1361
- // p.selectedRRPPrice = product.selectedRRPPrice;
1362
- // p.fullfilmentId = product.fullfilmentId;
1363
- // p.fullfilmentLocationName = product.fullfilmentLocationName;
1364
- // p.deliveryGroup = product.deliveryGroup || "1";
1365
- // p.leadTime = product.leadTime;
1366
- // p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
1367
- // p.giftCard = product.giftCard;
1368
- // p.giftCardExpiryDate = product.giftCardExpiryDate;
1369
- // p.giftCardNumberIssued = product.giftCardNumberIssued;
1370
- // p.giftCardRecipientEmail = product.giftCardRecipientEmail;
1371
- // p.giftCardRecipientName = product.giftCardRecipientName;
1372
- // if(p.fullfilmentId != this.transactionDocument.storeId)
1373
- // {
1374
- // p.isWebOrder = true;
1375
- // }
1376
- // if (product.itemDiscounts) {
1377
- // p.itemDiscounts = product.itemDiscounts as ItemDiscount;
1378
- // }
1379
- // // if(!p.itemDiscounts){
1380
- // // console.log(p.itemDiscounts);
1381
- // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
1382
- // // }
1383
- // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
1384
- // if (product.refundedQuantity) {
1385
- // p.quantity = p.quantity - product.refundedQuantity;
1386
- // p.totalLinePrice = (p.quantity * product.price);
1387
- // p.total = p.totalLinePrice;
1388
- // // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
1389
- // p.refunded = product.refunded;
1390
- // p.isLastExchanged = product.isLastExchanged;
1391
- // }
1392
- // if (product.exchange) {
1393
- // p.exchange = product.exchange;
1394
- // }
1395
- // if (
1396
- // this.transactionDocument.basket.lineDiscount &&
1397
- // this.transactionDocument.basket.lineDiscount.length > 0
1398
- // ) {
1399
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
1400
- // if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
1401
- // p.lineDiscount = Object.assign({}, lineDiscount);
1402
- // p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
1403
- // p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
1404
- // p.total = p.lineDiscount.discountedLinePrice;
1405
- // } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1406
- // p.lineDiscount = lineDiscount;
1407
- // p.total = lineDiscount.discountedLinePrice
1408
- // }
1409
- // });
1410
- // }
1411
- // if (
1412
- // this.transactionDocument.basket.linePromotion &&
1413
- // this.transactionDocument.basket.linePromotion.length > 0
1414
- // ) {
1415
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
1416
- // if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
1417
- // p.linePromotions = linePromotion;
1418
- // p.total = p.linePromotions.promotionLinePrice;
1419
- // p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
1420
- // }
1421
- // });
1422
- // }
1423
- // p.refundedQuantity = 0;
1424
- // p.refundedTotal = 0;
1425
- // if (
1426
- // this.transactionDocument.basket.taxBreakdown &&
1427
- // this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
1428
- // ) {
1429
- // this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
1430
- // if (product.itemLineId === taxLine.itemLineId.toString()) {
1431
- // p.selectedVAT = taxLine.VAT;
1432
- // p.selectedVATCode = taxLine.VATCode;
1433
- // }
1434
- // });
1435
- // }
1436
- // if (p.quantity > 0) {
1437
- // basket.products.push(p);
1438
- // }
1439
- // });
1440
- // // product.itemDiscounts
1441
- // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
1442
- // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
1443
- // }
1444
- // console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
1445
- // basket.quantity = basket.products.reduce(
1446
- // (n: any, { quantity }: any) => n + quantity,
1447
- // 0
1448
- // );
1449
- // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
1450
- // basket.basketTotal = basket.total;
1451
- // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
1452
- // console.log(
1453
- // "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
1454
- // basket.basketTotal
1455
- // );
1456
- // console.log(
1457
- // "e:basket :TransactionDocumentBuilder : basketDetails updated values",
1458
- // JSON.stringify(basket)
1459
- // );
1460
- // return basket;
1461
- // }
1462
- /**
1463
- * Gets basket details
1464
- * @param {?} basket
1465
- * @return {?} refund basket details
1466
- */
1467
- // getRefundBasketDetails(): Basket {
1468
- // let basket: Basket = {
1469
- // subsidiaryId : this.transactionDocument.subsidiaryId,
1470
- // transactionDiscount: this.transactionDocument.basket.transactionDiscount,
1471
- // transactionPromotion: this.transactionDocument.basket.transactionPromotion,
1472
- // transactionId: this.transactionDocument.transactionId,
1473
- // total: this.transactionDocument.basketSummary.basketTotal,
1474
- // basketTotal: this.transactionDocument.basketSummary.basketTotal,
1475
- // discountTotal: this.transactionDocument.basketSummary.discountTotal,
1476
- // saleTotal: this.transactionDocument.basketSummary.saleTotal,
1477
- // quantity: this.transactionDocument.basketSummary.totalItems,
1478
- // products: [],
1479
- // baseCurrency: this.transactionDocument.baseCurrency,
1480
- // customer: this.transactionDocument.customer,
1481
- // };
1482
- // basket.products = [] as Product[];
1483
- // this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
1484
- // const p = {} as Product;
1485
- // p.SKU = product.SKU;
1486
- // p.barcode = product.barCode;
1487
- // p.barcodes = product.barcodes;
1488
- // p.description = product.description;
1489
- // p.imageUrls = product.imageUrls;
1490
- // p.currency = this.transactionDocument.baseCurrency;
1491
- // p.totalLinePrice = product.totalLinePrice;
1492
- // p.itemLineId = Number(product.itemLineId);
1493
- // p.excludePromotion = product.excludePromotion;
1494
- // p.selectedPrice = product.price;
1495
- // p.quantity = product.quantity;
1496
- // p.total = product.totalLinePrice;
1497
- // p.selectedRRPPrice = product.selectedRRPPrice;
1498
- // p.fullfilmentId = product.fullfilmentId;
1499
- // p.fullfilmentLocationName = product.fullfilmentLocationName;
1500
- // p.deliveryGroup = product.deliveryGroup || "1";
1501
- // p.leadTime = product.leadTime;
1502
- // p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
1503
- // p.giftCard = product.giftCard;
1504
- // p.giftCardExpiryDate = product.giftCardExpiryDate;
1505
- // p.giftCardNumberIssued = product.giftCardNumberIssued;
1506
- // p.giftCardRecipientEmail = product.giftCardRecipientEmail;
1507
- // p.giftCardRecipientName = product.giftCardRecipientName;
1508
- // if(p.fullfilmentId != this.transactionDocument.storeId)
1509
- // {
1510
- // p.isWebOrder = true;
1511
- // }
1512
- // if (product.itemDiscounts) {
1513
- // p.itemDiscounts = product.itemDiscounts as ItemDiscount;
1514
- // }
1515
- // // if(!p.itemDiscounts){
1516
- // // console.log(p.itemDiscounts);
1517
- // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
1518
- // // }
1519
- // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
1520
- // if (product.refundedQuantity) {
1521
- // p.quantity = p.quantity - product.refundedQuantity;
1522
- // p.totalLinePrice = (p.quantity * product.price);
1523
- // p.total = p.totalLinePrice;
1524
- // // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
1525
- // p.refunded = product.refunded;
1526
- // p.isLastExchanged = product.isLastExchanged;
1527
- // }
1528
- // if (product.exchange) {
1529
- // p.exchange = product.exchange;
1530
- // }
1531
- // if (
1532
- // this.transactionDocument.basket.lineDiscount &&
1533
- // this.transactionDocument.basket.lineDiscount.length > 0
1534
- // ) {
1535
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
1536
- // if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
1537
- // p.lineDiscount = Object.assign({}, lineDiscount);
1538
- // p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
1539
- // p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
1540
- // p.total = p.lineDiscount.discountedLinePrice;
1541
- // } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1542
- // p.lineDiscount = lineDiscount;
1543
- // p.total = lineDiscount.discountedLinePrice
1544
- // }
1545
- // });
1546
- // }
1547
- // if (
1548
- // this.transactionDocument.basket.linePromotion &&
1549
- // this.transactionDocument.basket.linePromotion.length > 0
1550
- // ) {
1551
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
1552
- // if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
1553
- // p.linePromotions = linePromotion;
1554
- // p.total = p.linePromotions.promotionLinePrice;
1555
- // p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
1556
- // }
1557
- // });
1558
- // }
1559
- // p.refundedQuantity = 0;
1560
- // p.refundedTotal = 0;
1561
- // if (
1562
- // this.transactionDocument.basket.taxBreakdown &&
1563
- // this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
1564
- // ) {
1565
- // this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
1566
- // if (product.itemLineId === taxLine.itemLineId.toString()) {
1567
- // p.selectedVAT = taxLine.VAT;
1568
- // p.selectedVATCode = taxLine.VATCode;
1569
- // }
1570
- // });
1571
- // }
1572
- // if (p.quantity > 0) {
1573
- // basket.products.push(p);
1574
- // }
1575
- // });
1576
- // // product.itemDiscounts
1577
- // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
1578
- // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
1579
- // }
1580
- // console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
1581
- // basket.quantity = basket.products.reduce(
1582
- // (n: any, { quantity }: any) => n + quantity,
1583
- // 0
1584
- // );
1585
- // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
1586
- // basket.basketTotal = basket.total;
1587
- // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
1588
- // console.log(
1589
- // "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
1590
- // basket.basketTotal
1591
- // );
1592
- // console.log(
1593
- // "e:basket :TransactionDocumentBuilder : basketDetails updated values",
1594
- // JSON.stringify(basket)
1595
- // );
1596
- // return basket;
1597
- // }
1598
- TransactionDocumentBuilder.prototype.getTransactionDiscountAndTransactionPromotionPortion = /**
1599
- * Gets basket details
1600
- * @param {?} basket
1601
- * @return {?} refund basket details
1602
- */
1603
- // getRefundBasketDetails(): Basket {
1604
- // let basket: Basket = {
1605
- // subsidiaryId : this.transactionDocument.subsidiaryId,
1606
- // transactionDiscount: this.transactionDocument.basket.transactionDiscount,
1607
- // transactionPromotion: this.transactionDocument.basket.transactionPromotion,
1608
- // transactionId: this.transactionDocument.transactionId,
1609
- // total: this.transactionDocument.basketSummary.basketTotal,
1610
- // basketTotal: this.transactionDocument.basketSummary.basketTotal,
1611
- // discountTotal: this.transactionDocument.basketSummary.discountTotal,
1612
- // saleTotal: this.transactionDocument.basketSummary.saleTotal,
1613
- // quantity: this.transactionDocument.basketSummary.totalItems,
1614
- // products: [],
1615
- // baseCurrency: this.transactionDocument.baseCurrency,
1616
- // customer: this.transactionDocument.customer,
1617
- // };
1618
- // basket.products = [] as Product[];
1619
- // this.transactionDocument.basket.products.forEach((product: { SKU: any; barCode: any; barcodes: any; description: any; imageUrls: any; totalLinePrice: any; itemLineId: any; excludePromotion: any; price: number; quantity: any; selectedRRPPrice: any; fullfilmentId: any; fullfilmentLocationName: any; deliveryGroup: string; leadTime: any; deliveryMethod: any; giftCard: any; giftCardExpiryDate: any; giftCardNumberIssued: any; giftCardRecipientEmail: any; giftCardRecipientName: any; itemDiscounts: any; refundedPromotionalQuantity: any; refundedQuantity: number; refunded: any; isLastExchanged: any; exchange: any; refundedTotal: number; }, index: any) => {
1620
- // const p = {} as Product;
1621
- // p.SKU = product.SKU;
1622
- // p.barcode = product.barCode;
1623
- // p.barcodes = product.barcodes;
1624
- // p.description = product.description;
1625
- // p.imageUrls = product.imageUrls;
1626
- // p.currency = this.transactionDocument.baseCurrency;
1627
- // p.totalLinePrice = product.totalLinePrice;
1628
- // p.itemLineId = Number(product.itemLineId);
1629
- // p.excludePromotion = product.excludePromotion;
1630
- // p.selectedPrice = product.price;
1631
- // p.quantity = product.quantity;
1632
- // p.total = product.totalLinePrice;
1633
- // p.selectedRRPPrice = product.selectedRRPPrice;
1634
- // p.fullfilmentId = product.fullfilmentId;
1635
- // p.fullfilmentLocationName = product.fullfilmentLocationName;
1636
- // p.deliveryGroup = product.deliveryGroup || "1";
1637
- // p.leadTime = product.leadTime;
1638
- // p.deliveryMethod = product.deliveryMethod || DELIVERY_METHODS.COLLECT_FROM_STORE.toString();
1639
- // p.giftCard = product.giftCard;
1640
- // p.giftCardExpiryDate = product.giftCardExpiryDate;
1641
- // p.giftCardNumberIssued = product.giftCardNumberIssued;
1642
- // p.giftCardRecipientEmail = product.giftCardRecipientEmail;
1643
- // p.giftCardRecipientName = product.giftCardRecipientName;
1644
- // if(p.fullfilmentId != this.transactionDocument.storeId)
1645
- // {
1646
- // p.isWebOrder = true;
1647
- // }
1648
- // if (product.itemDiscounts) {
1649
- // p.itemDiscounts = product.itemDiscounts as ItemDiscount;
1650
- // }
1651
- // // if(!p.itemDiscounts){
1652
- // // console.log(p.itemDiscounts);
1653
- // // this.basketService.transactionDiscountAndPromotionProductortionCalculation(basket);
1654
- // // }
1655
- // p.refundPromotionalQuantity = product.refundedPromotionalQuantity ? product.refundedPromotionalQuantity : 0;
1656
- // if (product.refundedQuantity) {
1657
- // p.quantity = p.quantity - product.refundedQuantity;
1658
- // p.totalLinePrice = (p.quantity * product.price);
1659
- // p.total = p.totalLinePrice;
1660
- // // p.refundPromotionalQuantity = product.refundedPromotionalQuantity;
1661
- // p.refunded = product.refunded;
1662
- // p.isLastExchanged = product.isLastExchanged;
1663
- // }
1664
- // if (product.exchange) {
1665
- // p.exchange = product.exchange;
1666
- // }
1667
- // if (
1668
- // this.transactionDocument.basket.lineDiscount &&
1669
- // this.transactionDocument.basket.lineDiscount.length > 0
1670
- // ) {
1671
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount: { itemLineId: { toString: () => any; }; discountedLinePrice: any; }) => {
1672
- // if (product.itemLineId === lineDiscount.itemLineId.toString() && product.refundedQuantity > 0) {
1673
- // p.lineDiscount = Object.assign({}, lineDiscount);
1674
- // p.lineDiscount.discountedLinePrice = p.lineDiscount.unitPrice * p.quantity
1675
- // p.lineDiscount.discountAmount = p.total - p.lineDiscount.discountedLinePrice
1676
- // p.total = p.lineDiscount.discountedLinePrice;
1677
- // } else if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1678
- // p.lineDiscount = lineDiscount;
1679
- // p.total = lineDiscount.discountedLinePrice
1680
- // }
1681
- // });
1682
- // }
1683
- // if (
1684
- // this.transactionDocument.basket.linePromotion &&
1685
- // this.transactionDocument.basket.linePromotion.length > 0
1686
- // ) {
1687
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion: { itemLineId: { toString: () => any; }; refunded: any; }) => {
1688
- // if (product.itemLineId === linePromotion.itemLineId.toString() && !linePromotion.refunded) {
1689
- // p.linePromotions = linePromotion;
1690
- // p.total = p.linePromotions.promotionLinePrice;
1691
- // p.total = p.total - (product.refundedTotal ? Math.abs(product.refundedTotal) : 0);
1692
- // }
1693
- // });
1694
- // }
1695
- // p.refundedQuantity = 0;
1696
- // p.refundedTotal = 0;
1697
- // if (
1698
- // this.transactionDocument.basket.taxBreakdown &&
1699
- // this.transactionDocument.basket.taxBreakdown.taxLines.length > 0
1700
- // ) {
1701
- // this.transactionDocument.basket.taxBreakdown.taxLines.forEach((taxLine: { itemLineId: { toString: () => any; }; VAT: any; VATCode: any; }) => {
1702
- // if (product.itemLineId === taxLine.itemLineId.toString()) {
1703
- // p.selectedVAT = taxLine.VAT;
1704
- // p.selectedVATCode = taxLine.VATCode;
1705
- // }
1706
- // });
1707
- // }
1708
- // if (p.quantity > 0) {
1709
- // basket.products.push(p);
1710
- // }
1711
- // });
1712
- // // product.itemDiscounts
1713
- // if (!basket.products[0].hasOwnProperty('itemDiscounts')) {
1714
- // basket = this.getTransactionDiscountAndTransactionPromotionPortion(basket);
1715
- // }
1716
- // console.log("ebasket : TransactionDocumentBuilder :new created refunded basket", JSON.stringify(basket))
1717
- // basket.quantity = basket.products.reduce(
1718
- // (n: any, { quantity }: any) => n + quantity,
1719
- // 0
1720
- // );
1721
- // basket.total = this.getTotalWithLineDiscountAndLinePromotionApplied(basket);
1722
- // basket.basketTotal = basket.total;
1723
- // basket.basketTotal = basket.basketTotal - this.getTotalDiscountWithTransactionDiscountsAndPromotions(basket);
1724
- // console.log(
1725
- // "ebasket : TransactionDocumentBuilder : update Basket Total: after promotion :basketTotal",
1726
- // basket.basketTotal
1727
- // );
1728
- // console.log(
1729
- // "e:basket :TransactionDocumentBuilder : basketDetails updated values",
1730
- // JSON.stringify(basket)
1731
- // );
1732
- // return basket;
1733
- // }
1734
- function (basket) {
1735
- var _this = this;
1736
- if (basket.transactionDiscount &&
1737
- basket.transactionDiscount.length > 0) {
1738
- basket.transactionDiscount.forEach((/**
1739
- * @param {?} discount
1740
- * @return {?}
1741
- */
1742
- function (discount) {
1743
- if (!discount.itemLineIds) {
1744
- discount.itemLineIds = basket.products.map((/**
1745
- * @param {?} product
1746
- * @return {?}
1747
- */
1748
- function (product) {
1749
- return product.itemLineId;
1750
- }));
1751
- }
1752
- basket = _this.basketService.transactionDiscountProductPortionCalc(basket, discount);
1753
- }));
1754
- }
1755
- if (basket.transactionPromotion &&
1756
- basket.transactionPromotion.length > 0) {
1757
- basket.transactionPromotion.forEach((/**
1758
- * @param {?} tPromotion
1759
- * @return {?}
1760
- */
1761
- function (tPromotion) {
1762
- if (!tPromotion.itemLineIds) {
1763
- /** @type {?} */
1764
- var filteredData = basket.products.filter((/**
1765
- * @param {?} item
1766
- * @return {?}
1767
- */
1768
- function (item) {
1769
- return item.excludePromotion === false;
1770
- }));
1771
- tPromotion.itemLineIds =
1772
- filteredData.map((/**
1773
- * @param {?} product
1774
- * @return {?}
1775
- */
1776
- function (product) {
1777
- return product.itemLineId;
1778
- }));
1779
- }
1780
- basket = _this.basketService.transactionPromotionProductPortionCalc(basket, tPromotion);
1781
- }));
1782
- }
1783
- return basket;
1784
- };
1785
- /**
1786
- * @param {?} basketDetails
1787
- * @return {?}
1788
- */
1789
- TransactionDocumentBuilder.prototype.getTotalDiscountWithTransactionDiscountsAndPromotions = /**
1790
- * @param {?} basketDetails
1791
- * @return {?}
1792
- */
1793
- function (basketDetails) {
1794
- /** @type {?} */
1795
- var discountTotal = 0;
1796
- if (basketDetails.transactionPromotion &&
1797
- basketDetails.transactionPromotion.length > 0) {
1798
- discountTotal += basketDetails.transactionPromotion.reduce((/**
1799
- * @param {?} n
1800
- * @param {?} __1
1801
- * @return {?}
1802
- */
1803
- function (n, _a) {
1804
- var promotionAmount = _a.promotionAmount;
1805
- return n + promotionAmount;
1806
- }), 0);
1807
- }
1808
- if (basketDetails.transactionDiscount &&
1809
- basketDetails.transactionDiscount.length > 0) {
1810
- discountTotal += basketDetails.transactionDiscount.reduce((/**
1811
- * @param {?} n
1812
- * @param {?} __1
1813
- * @return {?}
1814
- */
1815
- function (n, _a) {
1816
- var discountAmount = _a.discountAmount;
1817
- return n + discountAmount;
1818
- }), 0);
1819
- }
1820
- console.log("ebasket : TransactionDocumentBuilder : Transaction discount Total:", discountTotal);
1821
- return discountTotal;
1822
- };
1823
- /**
1824
- * @param {?} currency
1825
- * @param {?} value
1826
- * @return {?}
1827
- */
1828
- TransactionDocumentBuilder.prototype.appendCurrencySymbol = /**
1829
- * @param {?} currency
1830
- * @param {?} value
1831
- * @return {?}
1832
- */
1833
- function (currency, value) {
1834
- // value=this.decimalpipe.transform(value,'1.2');
1835
- if (value >= 0) {
1836
- /** @type {?} */
1837
- var returnval = currency + value;
1838
- console.log(returnval, "ebasket: add currency with value");
1839
- return returnval;
1840
- }
1841
- else {
1842
- /** @type {?} */
1843
- var returnval = "-" + (currency + value * -1);
1844
- console.log(returnval, "-(currency+(value*-1))");
1845
- return returnval;
1846
- }
1847
- };
1848
- // /**
1849
- // * Updates total refund
1850
- // * @returns total refund
1851
- // */
1852
- // updateTotalRefund(): TransactionDocumentBuilder {
1853
- // this.transactionDocument.basket.products.forEach((product) => {
1854
- // product.refundedQuantity = product.quantity;
1855
- // product.refundedTotal = product.totalLinePrice * -1;
1856
- // console.log(
1857
- // "ebasket: Transaction price override :",
1858
- // this.transactionDocument.basket.lineDiscount
1859
- // );
1860
- // if (
1861
- // this.transactionDocument.basket.linePromotion &&
1862
- // this.transactionDocument.basket.linePromotion.length > 0
1863
- // ) {
1864
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
1865
- // console.log(
1866
- // "Promotion: basket linePromotion : ",
1867
- // this.transactionDocument.basket.linePromotion
1868
- // );
1869
- // console.log(
1870
- // "linePromotion.itemLineId.toString() : ",
1871
- // linePromotion.itemLineId.toString()
1872
- // );
1873
- // console.log(
1874
- // "condition : " +
1875
- // (product.itemLineId === linePromotion.itemLineId.toString())
1876
- // );
1877
- // if (product.itemLineId === linePromotion.itemLineId.toString()) {
1878
- // product.refundedTotal =
1879
- // linePromotion.promotionLinePrice * -1;
1880
- // }
1881
- // });
1882
- // } else
1883
- // if (
1884
- // this.transactionDocument.basket.lineDiscount &&
1885
- // this.transactionDocument.basket.lineDiscount.length > 0
1886
- // ) {
1887
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
1888
- // console.log(
1889
- // "product.itemLineId : " +
1890
- // this.transactionDocument.basket.lineDiscount
1891
- // );
1892
- // console.log(
1893
- // "lineDiscount.itemLineId.toString() : " +
1894
- // lineDiscount.itemLineId.toString()
1895
- // );
1896
- // console.log(
1897
- // "condition : " +
1898
- // (product.itemLineId === lineDiscount.itemLineId.toString())
1899
- // );
1900
- // if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1901
- // product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
1902
- // }
1903
- // });
1904
- // }
1905
- // console.log("Product description :" + product.description);
1906
- // console.log("Product total :" + product.refundedTotal);
1907
- // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
1908
- // // console.log(product.displayrefundedamount,"displayrefundedamount");
1909
- // product.refunded = true;
1910
- // });
1911
- // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
1912
- // // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
1913
- // const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
1914
- // // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
1915
- // (this.transactionDocument.basketSummary.VATTotal *= -1);
1916
- // return this;
1917
- // }
1918
- /**
1919
- * Sale Total
1920
- * @param basketDetails
1921
- * @returns Sale Total
1922
- */
1923
- // /**
1924
- // * Updates total refund
1925
- // * @returns total refund
1926
- // */
1927
- // updateTotalRefund(): TransactionDocumentBuilder {
1928
- // this.transactionDocument.basket.products.forEach((product) => {
1929
- // product.refundedQuantity = product.quantity;
1930
- // product.refundedTotal = product.totalLinePrice * -1;
1931
- // console.log(
1932
- // "ebasket: Transaction price override :",
1933
- // this.transactionDocument.basket.lineDiscount
1934
- // );
1935
- // if (
1936
- // this.transactionDocument.basket.linePromotion &&
1937
- // this.transactionDocument.basket.linePromotion.length > 0
1938
- // ) {
1939
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
1940
- // console.log(
1941
- // "Promotion: basket linePromotion : ",
1942
- // this.transactionDocument.basket.linePromotion
1943
- // );
1944
- // console.log(
1945
- // "linePromotion.itemLineId.toString() : ",
1946
- // linePromotion.itemLineId.toString()
1947
- // );
1948
- // console.log(
1949
- // "condition : " +
1950
- // (product.itemLineId === linePromotion.itemLineId.toString())
1951
- // );
1952
- // if (product.itemLineId === linePromotion.itemLineId.toString()) {
1953
- // product.refundedTotal =
1954
- // linePromotion.promotionLinePrice * -1;
1955
- // }
1956
- // });
1957
- // } else
1958
- // if (
1959
- // this.transactionDocument.basket.lineDiscount &&
1960
- // this.transactionDocument.basket.lineDiscount.length > 0
1961
- // ) {
1962
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
1963
- // console.log(
1964
- // "product.itemLineId : " +
1965
- // this.transactionDocument.basket.lineDiscount
1966
- // );
1967
- // console.log(
1968
- // "lineDiscount.itemLineId.toString() : " +
1969
- // lineDiscount.itemLineId.toString()
1970
- // );
1971
- // console.log(
1972
- // "condition : " +
1973
- // (product.itemLineId === lineDiscount.itemLineId.toString())
1974
- // );
1975
- // if (product.itemLineId === lineDiscount.itemLineId.toString()) {
1976
- // product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
1977
- // }
1978
- // });
1979
- // }
1980
- // console.log("Product description :" + product.description);
1981
- // console.log("Product total :" + product.refundedTotal);
1982
- // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
1983
- // // console.log(product.displayrefundedamount,"displayrefundedamount");
1984
- // product.refunded = true;
1985
- // });
1986
- // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
1987
- // // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
1988
- // const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
1989
- // // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
1990
- // (this.transactionDocument.basketSummary.VATTotal *= -1);
1991
- // return this;
1992
- // }
1993
- /**
1994
- * Sale Total
1995
- * @param {?} basketDetails
1996
- * @return {?} Sale Total
1997
- */
1998
- TransactionDocumentBuilder.prototype.updateSaleTotal =
1999
- // /**
2000
- // * Updates total refund
2001
- // * @returns total refund
2002
- // */
2003
- // updateTotalRefund(): TransactionDocumentBuilder {
2004
- // this.transactionDocument.basket.products.forEach((product) => {
2005
- // product.refundedQuantity = product.quantity;
2006
- // product.refundedTotal = product.totalLinePrice * -1;
2007
- // console.log(
2008
- // "ebasket: Transaction price override :",
2009
- // this.transactionDocument.basket.lineDiscount
2010
- // );
2011
- // if (
2012
- // this.transactionDocument.basket.linePromotion &&
2013
- // this.transactionDocument.basket.linePromotion.length > 0
2014
- // ) {
2015
- // this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
2016
- // console.log(
2017
- // "Promotion: basket linePromotion : ",
2018
- // this.transactionDocument.basket.linePromotion
2019
- // );
2020
- // console.log(
2021
- // "linePromotion.itemLineId.toString() : ",
2022
- // linePromotion.itemLineId.toString()
2023
- // );
2024
- // console.log(
2025
- // "condition : " +
2026
- // (product.itemLineId === linePromotion.itemLineId.toString())
2027
- // );
2028
- // if (product.itemLineId === linePromotion.itemLineId.toString()) {
2029
- // product.refundedTotal =
2030
- // linePromotion.promotionLinePrice * -1;
2031
- // }
2032
- // });
2033
- // } else
2034
- // if (
2035
- // this.transactionDocument.basket.lineDiscount &&
2036
- // this.transactionDocument.basket.lineDiscount.length > 0
2037
- // ) {
2038
- // this.transactionDocument.basket.lineDiscount.forEach((lineDiscount) => {
2039
- // console.log(
2040
- // "product.itemLineId : " +
2041
- // this.transactionDocument.basket.lineDiscount
2042
- // );
2043
- // console.log(
2044
- // "lineDiscount.itemLineId.toString() : " +
2045
- // lineDiscount.itemLineId.toString()
2046
- // );
2047
- // console.log(
2048
- // "condition : " +
2049
- // (product.itemLineId === lineDiscount.itemLineId.toString())
2050
- // );
2051
- // if (product.itemLineId === lineDiscount.itemLineId.toString()) {
2052
- // product.refundedTotal = lineDiscount.unitPrice * product.refundedQuantity * -1;
2053
- // }
2054
- // });
2055
- // }
2056
- // console.log("Product description :" + product.description);
2057
- // console.log("Product total :" + product.refundedTotal);
2058
- // // product.displayrefundedamount=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency],product.refundedTotal);
2059
- // // console.log(product.displayrefundedamount,"displayrefundedamount");
2060
- // product.refunded = true;
2061
- // });
2062
- // const baskettotal = (this.transactionDocument.basketSummary.basketTotal *= -1);
2063
- // // this.transactionDocument.basketSummary.displaybaskettotal=this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], baskettotal);
2064
- // const saletotal = (this.transactionDocument.basketSummary.saleTotal *= -1);
2065
- // // this.transactionDocument.basketSummary.displaysaletotal = this.appendCurrencySymbol(CURRENCY[this.transactionDocument.baseCurrency], saletotal);
2066
- // (this.transactionDocument.basketSummary.VATTotal *= -1);
2067
- // return this;
2068
- // }
2069
- /**
2070
- * Sale Total
2071
- * @param {?} basketDetails
2072
- * @return {?} Sale Total
2073
- */
2074
- function (basketDetails) {
2075
- /** @type {?} */
2076
- var saleTotal = basketDetails.products.reduce((/**
2077
- * @param {?} n
2078
- * @param {?} __1
2079
- * @return {?}
2080
- */
2081
- function (n, _a) {
2082
- var totalLinePrice = _a.totalLinePrice;
2083
- return n + totalLinePrice;
2084
- }), 0);
2085
- return saleTotal;
2086
- };
2087
- /**
2088
- * @param {?} basketDetails
2089
- * @return {?}
2090
- */
2091
- TransactionDocumentBuilder.prototype.getTotalWithLineDiscountAndLinePromotionApplied = /**
2092
- * @param {?} basketDetails
2093
- * @return {?}
2094
- */
2095
- function (basketDetails) {
2096
- var e_1, _a;
2097
- /** @type {?} */
2098
- var saletotal = 0.0;
2099
- try {
2100
- for (var _b = tslib_1.__values(basketDetails.products), _c = _b.next(); !_c.done; _c = _b.next()) {
2101
- var product = _c.value;
2102
- // if (product.linePromotions) {
2103
- // saletotal += product.linePromotions.promotionLinePrice;
2104
- // } else if (
2105
- // product.lineDiscount &&
2106
- // !product.linePromotions
2107
- // ) {
2108
- // saletotal +=
2109
- // product.quantity * Number(product.lineDiscount.unitPrice.toFixed(2));
2110
- // } else {
2111
- // saletotal +=
2112
- // product.quantity * Number(product.selectedPrice.toFixed(2));
2113
- // }
2114
- saletotal += product.total;
2115
- console.log("e-basket:update product Total:" + saletotal, JSON.stringify(product));
2116
- }
2117
- }
2118
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
2119
- finally {
2120
- try {
2121
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
2122
- }
2123
- finally { if (e_1) throw e_1.error; }
2124
- }
2125
- return saletotal;
2126
- };
2127
- /**
2128
- * @param {?} basketDetails
2129
- * @return {?}
2130
- */
2131
- TransactionDocumentBuilder.prototype.getRefundedTotalWithQuantity = /**
2132
- * @param {?} basketDetails
2133
- * @return {?}
2134
- */
2135
- function (basketDetails) {
2136
- /** @type {?} */
2137
- var quantity = 0;
2138
- for (var index = 0; index < basketDetails.products.length; index++) {
2139
- /** @type {?} */
2140
- var product = basketDetails.products[index];
2141
- if (!product.refundedReasonDescription) {
2142
- quantity = quantity + product.quantity;
2143
- }
2144
- else {
2145
- quantity = quantity + (product.quantity - product.refundedQuantity);
2146
- // basketDetails.total = basketDetails.total + product.refundedTotal;
2147
- }
2148
- }
2149
- return quantity;
2150
- };
2151
- /**
2152
- * Discount Total
2153
- * @returns Discount Total
2154
- */
2155
- /**
2156
- * Discount Total
2157
- * @return {?} Discount Total
2158
- */
2159
- TransactionDocumentBuilder.prototype.updateDiscountTotal = /**
2160
- * Discount Total
2161
- * @return {?} Discount Total
2162
- */
2163
- function () {
2164
- /** @type {?} */
2165
- var refundTotal = this.transactionDocument.basketSummary.refundTotal ? this.transactionDocument.basketSummary.refundTotal : 0;
2166
- console.info("e-basket: transaction builder: refundTotal", JSON.stringify(refundTotal), JSON.stringify(this.transactionDocument.basketSummary));
2167
- /** @type {?} */
2168
- var discountTotal = Math.abs(Math.abs(this.transactionDocument.basketSummary.saleTotal) -
2169
- (Math.abs(this.transactionDocument.basketSummary.basketTotal) + Math.abs(refundTotal)));
2170
- console.log("e-basket: transaction builder: discountTotal", JSON.stringify(discountTotal));
2171
- return Number(discountTotal.toFixed(2));
2172
- };
2173
- /**
2174
- * @param {?} reasonCode
2175
- * @return {?}
2176
- */
2177
- TransactionDocumentBuilder.prototype.updateReasonCode = /**
2178
- * @param {?} reasonCode
2179
- * @return {?}
2180
- */
2181
- function (reasonCode) {
2182
- this.transactionDocument.reasonCode = reasonCode.code;
2183
- this.transactionDocument.reasonDescription = reasonCode.name;
2184
- return this;
2185
- };
2186
- /**
2187
- * @param {?} useroverride
2188
- * @return {?}
2189
- */
2190
- TransactionDocumentBuilder.prototype.updateManagerOverride = /**
2191
- * @param {?} useroverride
2192
- * @return {?}
2193
- */
2194
- function (useroverride) {
2195
- this.transactionDocument.override = useroverride;
2196
- return this;
2197
- };
2198
- /**
2199
- * @param {?} userID
2200
- * @return {?}
2201
- */
2202
- TransactionDocumentBuilder.prototype.updateUserID = /**
2203
- * @param {?} userID
2204
- * @return {?}
2205
- */
2206
- function (userID) {
2207
- this.transactionDocument.userId = userID;
2208
- return this;
2209
- };
2210
- /**
2211
- * @param {?} name
2212
- * @return {?}
2213
- */
2214
- TransactionDocumentBuilder.prototype.updateUserName = /**
2215
- * @param {?} name
2216
- * @return {?}
2217
- */
2218
- function (name) {
2219
- this.transactionDocument.userName = name;
2220
- return this;
2221
- };
2222
- /**
2223
- * @param {?} customerDetail
2224
- * @return {?}
2225
- */
2226
- TransactionDocumentBuilder.prototype.addCustomerDetails = /**
2227
- * @param {?} customerDetail
2228
- * @return {?}
2229
- */
2230
- function (customerDetail) {
2231
- this.transactionDocument.customer = customerDetail;
2232
- return this;
2233
- };
2234
- /**
2235
- * @param {?} basketDetails
2236
- * @return {?}
2237
- */
2238
- TransactionDocumentBuilder.prototype.updateTaxBreakdown = /**
2239
- * @param {?} basketDetails
2240
- * @return {?}
2241
- */
2242
- function (basketDetails) {
2243
- var _this = this;
2244
- // let transactionDiscountTotal = 0;
2245
- /** @type {?} */
2246
- var taxBreakdown = {
2247
- taxLines: [],
2248
- totalTaxableAmount: 0,
2249
- };
2250
- // if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
2251
- // this.transactionDocument.basket.transactionDiscount.forEach((discount) => {
2252
- // transactionDiscountTotal += discount.discountAmount;
2253
- // });
2254
- // }
2255
- // if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
2256
- // this.transactionDocument.basket.transactionPromotion.forEach(
2257
- // (promotion) => {
2258
- // transactionDiscountTotal += promotion.promotionAmount;
2259
- // }
2260
- // );
2261
- // }
2262
- basketDetails.products.forEach((/**
2263
- * @param {?} product
2264
- * @return {?}
2265
- */
2266
- function (product) {
2267
- /** @type {?} */
2268
- var taxLine = {
2269
- itemLineId: product.itemLineId,
2270
- VAT: product.selectedVAT ? product.selectedVAT : 0,
2271
- VATCode: product.selectedVATCode,
2272
- taxLineTotal: 0,
2273
- taxableAmount: product.total,
2274
- PreTax: 0
2275
- };
2276
- console.info("Product contribution : item line ID :", product.itemLineId, "tax line :", JSON.stringify(taxLine));
2277
- // step 1
2278
- // if Transaction Discount and/or promotion applied, find net selling price of each product as taxableamount
2279
- // if (transactionDiscountTotal > 0) {
2280
- product = _this.basketService.validateProductItemDiscount(product);
2281
- /** @type {?} */
2282
- var productContributionInTotal = product.itemDiscounts.trnDiscountsPortion +
2283
- product.itemDiscounts.trnPromotionsPortion -
2284
- product.itemDiscounts.refundPortion;
2285
- // tp+td-rp;
2286
- console.info("Product contribution : item line ID :", product.itemLineId, "contribution :", JSON.stringify(productContributionInTotal));
2287
- // calculate net selling price after applying transaction discount as per product contribution
2288
- taxLine.taxableAmount -= productContributionInTotal;
2289
- // }
2290
- //step 2 - find pre tax
2291
- taxLine.PreTax = _this.numberUtilService.trimTo2Decimal2((taxLine.taxableAmount * 100) / (100 + taxLine.VAT));
2292
- //step 3 - Update taxbreakdown
2293
- taxBreakdown.totalTaxableAmount += taxLine.taxableAmount;
2294
- taxLine.taxableAmount = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount);
2295
- // step 4 - update tax Line total
2296
- taxLine.taxLineTotal = _this.numberUtilService.trimTo2Decimal2(taxLine.taxableAmount - taxLine.PreTax);
2297
- taxBreakdown.taxLines.push(taxLine);
2298
- }));
2299
- taxBreakdown.totalTaxableAmount = this.numberUtilService.trimTo2Decimal2(taxBreakdown.totalTaxableAmount);
2300
- this.transactionDocument.basket.taxBreakdown = taxBreakdown;
2301
- return this;
2302
- };
2303
- /**
2304
- * @return {?}
2305
- */
2306
- TransactionDocumentBuilder.prototype.updateTotalTaxSummary = /**
2307
- * @return {?}
2308
- */
2309
- function () {
2310
- var _this = this;
2311
- console.log("Total Tax Summery Request :", JSON.stringify(this.transactionDocument.basket.taxBreakdown));
2312
- /** @type {?} */
2313
- var totalTaxSummaryArray = [];
2314
- /** @type {?} */
2315
- var totalTaxSummaryGroup = [];
2316
- console.log("Tax Lines for Total Tax Summery :", JSON.stringify(this.transactionDocument.basket.taxBreakdown.taxLines));
2317
- this.transactionDocument.basket.taxBreakdown.taxLines.forEach((/**
2318
- * @param {?} element
2319
- * @return {?}
2320
- */
2321
- function (element) {
2322
- /** @type {?} */
2323
- var TaxSummary = {
2324
- VATCode: "",
2325
- VAT: -12345,
2326
- PreTaxSum: 0,
2327
- TaxSum: 0,
2328
- TXrateSum: 0
2329
- };
2330
- TaxSummary.VATCode = element.VATCode;
2331
- TaxSummary.VAT = element.VAT;
2332
- TaxSummary.PreTaxSum = _this.numberUtilService.trimTo2Decimal2(element.PreTax);
2333
- TaxSummary.TaxSum = _this.numberUtilService.trimTo2Decimal2(element.taxLineTotal);
2334
- TaxSummary.TXrateSum = _this.numberUtilService.trimTo2Decimal2(TaxSummary.PreTaxSum + TaxSummary.TaxSum);
2335
- totalTaxSummaryArray.push(TaxSummary);
2336
- }));
2337
- console.log("Total Tax Summery Without Grouped : ", JSON.stringify(totalTaxSummaryArray));
2338
- totalTaxSummaryGroup = totalTaxSummaryArray.reduce((/**
2339
- * @param {?} preparedArray
2340
- * @param {?} currentObj
2341
- * @return {?}
2342
- */
2343
- function (preparedArray, currentObj) {
2344
- /** @type {?} */
2345
- var ind = preparedArray.findIndex((/**
2346
- * @param {?} x
2347
- * @return {?}
2348
- */
2349
- function (x) { return x.VAT === currentObj.VAT; }));
2350
- if (ind === -1) {
2351
- preparedArray.push(currentObj);
2352
- }
2353
- else {
2354
- preparedArray[ind].VATCode = currentObj.VATCode;
2355
- preparedArray[ind].VAT = currentObj.VAT;
2356
- preparedArray[ind].PreTaxSum += currentObj.PreTaxSum;
2357
- preparedArray[ind].TaxSum += currentObj.TaxSum;
2358
- preparedArray[ind].TXrateSum += currentObj.TXrateSum;
2359
- }
2360
- return preparedArray;
2361
- }), []);
2362
- console.log("Total Tax Summer Group :", totalTaxSummaryGroup);
2363
- this.transactionDocument.basket.totalTaxSummary = totalTaxSummaryGroup;
2364
- return this;
2365
- };
2366
- /**
2367
- * TransactionId
2368
- * @returns OriginalTransactionId
2369
- */
2370
- /**
2371
- * TransactionId
2372
- * @param {?} tranDoc
2373
- * @return {?} OriginalTransactionId
2374
- */
2375
- TransactionDocumentBuilder.prototype.addOriginalTransId = /**
2376
- * TransactionId
2377
- * @param {?} tranDoc
2378
- * @return {?} OriginalTransactionId
2379
- */
2380
- function (tranDoc) {
2381
- if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND || this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
2382
- this.transactionDocument.originalTransId = tranDoc.transactionId;
2383
- if (tranDoc.apiResponse && tranDoc.apiResponse.internalId) {
2384
- this.transactionDocument.originalExternalId = tranDoc.apiResponse.internalId.toString();
2385
- }
2386
- }
2387
- return this;
2388
- };
2389
- /**
2390
- * unreferenced Refund
2391
- * @returns boolean value
2392
- */
2393
- /**
2394
- * unreferenced Refund
2395
- * @return {?} boolean value
2396
- */
2397
- TransactionDocumentBuilder.prototype.addUnreferencedRefund = /**
2398
- * unreferenced Refund
2399
- * @return {?} boolean value
2400
- */
2401
- function () {
2402
- this.transactionDocument.unreferencedRefund = true;
2403
- return this;
2404
- };
2405
- /**
2406
- * @return {?}
2407
- */
2408
- TransactionDocumentBuilder.prototype.getRefundTotal = /**
2409
- * @return {?}
2410
- */
2411
- function () {
2412
- /** @type {?} */
2413
- var totalRefund = 0;
2414
- for (var index = 0; index < this.transactionDocument.basket.products.length; index++) {
2415
- /** @type {?} */
2416
- var product = this.transactionDocument.basket.products[index];
2417
- if (product.refundedTotal) {
2418
- totalRefund = totalRefund + product.refundedTotal;
2419
- }
2420
- console.log("ebasket : transaction Service: totalRefund" + totalRefund);
2421
- }
2422
- return totalRefund;
2423
- };
2424
- /**
2425
- * @param {?} docId
2426
- * @return {?}
2427
- */
2428
- TransactionDocumentBuilder.prototype.docId = /**
2429
- * @param {?} docId
2430
- * @return {?}
2431
- */
2432
- function (docId) {
2433
- this.transactionDocument.id = docId;
2434
- return this;
2435
- };
2436
- return TransactionDocumentBuilder;
2437
- }());
2438
- /**
2439
- * Transaction document builder
2440
- */
2441
- export { TransactionDocumentBuilder };
2442
- if (false) {
2443
- /**
2444
- * @type {?}
2445
- * @private
2446
- */
2447
- TransactionDocumentBuilder.prototype.transactionDocument;
2448
- /**
2449
- * @type {?}
2450
- * @private
2451
- */
2452
- TransactionDocumentBuilder.prototype.numberUtilService;
2453
- /**
2454
- * @type {?}
2455
- * @private
2456
- */
2457
- TransactionDocumentBuilder.prototype.storeInfo;
2458
- /**
2459
- * @type {?}
2460
- * @private
2461
- */
2462
- TransactionDocumentBuilder.prototype.currencyPipe;
2463
- /**
2464
- * @type {?}
2465
- * @private
2466
- */
2467
- TransactionDocumentBuilder.prototype.basketService;
2468
- }
2469
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AcG1jcmV0YWlsL21hcHBlci1saWJyYXJ5LyIsInNvdXJjZXMiOlsibGliL1RyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUNBLE9BQU8sRUFBc0QsZ0JBQWdCLEVBQWlHLE1BQU0sd0JBQXdCLENBQUM7QUFDN00sT0FBTyxFQUFFLGdCQUFnQixFQUErRCxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZILE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQUsxRDs7OztJQUtFLG9DQUNFLGNBQW9DLEVBQzVCLFlBQTJCLEVBQzNCLGFBQW1DO1FBRG5DLGlCQUFZLEdBQVosWUFBWSxDQUFlO1FBQzNCLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUUzQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDO1FBQ3ZFLElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxjQUFjLENBQUM7U0FDM0M7YUFBTTtZQUNMLElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDekIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFD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V0FBVyxHQUFHLENBQUM7UUFDbkIsS0FBSyxJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRTs7Z0JBQzlFLE9BQU8sR0FBYSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7WUFDekUsSUFBSSxPQUFPLENBQUMsYUFBYSxFQUFFO2dCQUN6QixXQUFXLEdBQUcsV0FBVyxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUM7YUFDbkQ7WUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLDRDQUE0QyxHQUFHLFdBQVcsQ0FBQyxDQUFBO1NBQ3hFO1FBQ0QsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQzs7Ozs7SUFFRCwwQ0FBSzs7OztJQUFMLFVBQU0sS0FBVTtRQUNaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLEdBQUcsS0FBSyxDQUFDO1FBQ3RDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNILGlDQUFDO0FBQUQsQ0FBQyxBQXArQ0QsSUFvK0NDOzs7Ozs7Ozs7O0lBbitDQyx5REFBaUQ7Ozs7O0lBQ2pELHVEQUE2Qzs7Ozs7SUFDN0MsK0NBQXdCOzs7OztJQUl0QixrREFBbUM7Ozs7O0lBQ25DLG1EQUEyQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcclxuaW1wb3J0IHsgQmFza2V0U3VtbWFyeSwgQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlscywgQ3VzdG9tZXIsIERFTElWRVJZX01FVEhPRFMsIEl0ZW1EaXNjb3VudHMsIFRheEJyZWFrZG93biwgVGF4TGluZSwgVEJhc2tldCwgVG90YWxUYXhTdW1tYXJ5LCBUUHJvZHVjdCwgVHJhbnNhY3Rpb25Eb2N1bWVudCB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCI7XHJcbmltcG9ydCB7IFRSQU5TQUNUSU9OX1RZUEUsIEJhc2tldCwgTGluZURpc2NvdW50LCBMaW5lUHJvbW90aW9ucywgUHJvZHVjdCwgVXNlck92ZXJyaWRlIH0gZnJvbSBcIi4vbWFwcGVyLWxpYnJhcnkubW9kZWxcIjtcclxuaW1wb3J0IHsgQmFza2V0U2VydmljZSB9IGZyb20gXCIuL2Jhc2tldC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7IE51bWJlclV0aWxTZXJ2aWNlIH0gZnJvbSBcIi4vbnVtYmVyLXV0aWwuc2VydmljZVwiO1xyXG5cclxuLyoqXHJcbiAqIFRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICovXHJcbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgcHJpdmF0ZSB0cmFuc2FjdGlvbkRvY3VtZW50OiBUcmFuc2FjdGlvbkRvY3VtZW50O1xyXG4gIHByaXZhdGUgbnVtYmVyVXRpbFNlcnZpY2U6IE51bWJlclV0aWxTZXJ2aWNlO1xyXG4gIHByaXZhdGUgc3RvcmVJbmZvIDogYW55O1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgdHJhbnNhY3Rpb25Eb2M/OiBUcmFuc2FjdGlvbkRvY3VtZW50LFxyXG4gICAgcHJpdmF0ZSBjdXJyZW5jeVBpcGU/OiBDdXJyZW5jeVBpcGUsXHJcbiAgICBwcml2YXRlIGJhc2tldFNlcnZpY2U/OiBCYXNrZXRTZXJ2aWNlIHwgYW55LFxyXG4gICkge1xyXG4gICAgdGhpcy5udW1iZXJVdGlsU2VydmljZSA9IG5ldyBOdW1iZXJVdGlsU2VydmljZShjdXJyZW5jeVBpcGUpO1xyXG4gICAgdGhpcy5iYXNrZXRTZXJ2aWNlID0gbmV3IEJhc2tldFNlcnZpY2UodGhpcy5udW1iZXJVdGlsU2VydmljZSk7XHJcbiAgICB0aGlzLnN0b3JlSW5mbyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N0b3JlSW5mbycpIHx8ICd7fScpO1xyXG4gICAgaWYgKHRyYW5zYWN0aW9uRG9jKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCA9IHRyYW5zYWN0aW9uRG9jO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0ge1xyXG4gICAgICAgIHRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgb2ZmbGluZVRyYW5zYWN0aW9uSWQ6IFwiXCIsXHJcbiAgICAgICAgdHJhbnNhY3Rpb25SZWY6IFwiXCIsXHJcbiAgICAgICAgZGF0ZVRpbWU6IFwiXCIsXHJcbiAgICAgICAgb3JnQ29kZTogXCJcIixcclxuICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZUlkOiBcIlwiLFxyXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcclxuICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICB0ZXJtaW5hbElkOiBcIlwiLFxyXG4gICAgICAgIHVzZXJJZDogXCJcIixcclxuICAgICAgICBpbml0aWF0aW5nTW9kdWxlIDogXCJlQmFza2V0XCIsXHJcbiAgICAgICAgZXhwb3J0OiBmYWxzZSxcclxuICAgICAgICBiYXNrZXQ6IHt9IGFzIFRCYXNrZXQsXHJcbiAgICAgICAgYmFza2V0U3VtbWFyeToge30gYXMgQmFza2V0U3VtbWFyeSxcclxuICAgICAgICBiYXNlQ3VycmVuY3k6IFwiXCIsXHJcbiAgICAgICAgdHlwZTogXCJcIixcclxuICAgICAgICBvcGVyYXRpb25TdGF0dXM6IFwiXCIsXHJcbiAgICAgICAgY3JlYXRlZEF0OiBcIlwiLFxyXG4gICAgICAgIHVwZGF0ZWRBdDogXCJcIixcclxuICAgICAgICBpZDogXCJcIixcclxuICAgICAgICBjdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzOiB7fSBhcyBDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLFxyXG4gICAgICAgIHNhbGVUb3RhbDogMCxcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9ucyByZWZcclxuICAgKiBAcmV0dXJucyByZWZcclxuICAgKi9cclxuICB0cmFuc2FjdGlvblJlZigpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBzdG9yZURldGFpbHMgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzdG9yZUluZm8nKSB8fCAne30nKTtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgY29uc3QgcmFuZG9tID0gKCgoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMCkgfCAwKVxyXG4gICAgICAudG9TdHJpbmcoMTYpXHJcbiAgICAgIC5zdWJzdHJpbmcoMSk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYgPVxyXG4gICAgICBzdG9yZURldGFpbHMub3JnQ29kZSArIHN0b3JlRGV0YWlscy5zdG9yZUlkICsgZGF0ZS50b0lTT1N0cmluZygpICsgcmFuZG9tO1xyXG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OiB0cmFuc2FjdGlvbiByZWYgY3JlYXRlZFwiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHJhbnNhY3Rpb25SZWYpXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9ucyBpZFxyXG4gICAqIEBwYXJhbSB0cmFuc2FjdGlvbklEXHJcbiAgICogQHJldHVybnMgaWRcclxuICAgKi9cclxuICB0cmFuc2FjdGlvbklkKHRyYW5zYWN0aW9uSUQ6IHN0cmluZywgaXNPbmxpbmU6IGJvb2xlYW4gPSB0cnVlKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKGlzT25saW5lKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJhbnNhY3Rpb25zIGlkXHJcbiAgICogQHBhcmFtIHRyYW5zYWN0aW9uSURcclxuICAgKiBAcmV0dXJucyBpZFxyXG4gICAqL1xyXG4gIG9mZmxpbmVUcmFuc2FjdGlvbklkKHRyYW5zYWN0aW9uSUQ6IHN0cmluZywgaXNPbmxpbmU6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGlmICghaXNPbmxpbmUpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9mZmxpbmVUcmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JRDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgKiBzdG9yZU5vZGUgSWRcclxuICAqIEBwYXJhbSBzdG9yZU5vZGVJZFxyXG4gICogQHJldHVybnMgaWRcclxuICAqL1xyXG4gIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiogc3RvcmVOb2RlIHN0cnVjdHVyZVxyXG4qIEBwYXJhbSBzdG9yZU5vZGVTdHJ1Y3R1cmVcclxuKiBAcmV0dXJucyBpZFxyXG4qL1xyXG4gIHN0b3JlTm9kZVN0cnVjdHVyZShzdG9yZU5vZGVTdHJ1Y3R1cmU6IHN0cmluZyk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZU5vZGVTdHJ1Y3R1cmUgPSBzdG9yZU5vZGVTdHJ1Y3R1cmU7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9yZ3MgY29kZVxyXG4gICAqIEBwYXJhbSBvcmdDb2RlXHJcbiAgICogQHJldHVybnMgY29kZVxyXG4gICAqL1xyXG4gIG9yZ0NvZGUob3JnQ29kZTogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9yZ0NvZGUgPSBvcmdDb2RlO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFN0b3JlcyBpZFxyXG4gICAqIEBwYXJhbSBzdG9yZUlkXHJcbiAgICogQHJldHVybnMgaWRcclxuICAgKi9cclxuICBzdG9yZUlkKHN0b3JlSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkID0gc3RvcmVJZDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBEYXRlcyB0aW1lXHJcbiAgICogQHJldHVybnMgdGltZVxyXG4gICAqL1xyXG4gIGRhdGVUaW1lKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmRhdGVUaW1lID0gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIERldmljZXMgaWRcclxuICAgKiBAcGFyYW0gZGV2aWNlSWRcclxuICAgKiBAcmV0dXJucyBpZFxyXG4gICAqL1xyXG4gIGRldmljZUlkKGRldmljZUlkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuZGV2aWNlSWQgPSBkZXZpY2VJZDtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAgICogdGVybWluYWwgaWRcclxuICAgICAqIEBwYXJhbSB0ZXJtaW5hbElkXHJcbiAgICAgKiBAcmV0dXJucyBpZFxyXG4gICAgICovXHJcbiAgdGVybWluYWxJZCh0ZXJtaW5hbElkOiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudGVybWluYWxJZCA9IHRlcm1pbmFsSWQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAvKipcclxuICAgICogc2FsZUV4cG9ydFxyXG4gICAgKiBAcGFyYW0gc2FsZUV4cG9ydFxyXG4gICAgKiBAcmV0dXJucyBpZFxyXG4gICAgKi9cclxuICBleHBvcnQoc2FsZUV4cG9ydDogYW55KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmV4cG9ydCA9IHNhbGVFeHBvcnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyogIGN1c3RvbWVyKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IHVzZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd1c2VyRGV0YWlscycpKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lciA9IHVzZXI7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9ICovXHJcbiAgLyoqXHJcbiAgICogQmFza2V0cyB0cmFuc2FjdGlvbiBkb2N1bWVudCBidWlsZGVyXHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBiYXNrZXRcclxuICAgKi9cclxuICBiYXNrZXQoYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgY29uc29sZS5sb2coXCJlYmFza2V0OiBiYXNrZXQgZGV0YWlscyB1cGRhdGUgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnRcIiwgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscykpO1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdWJzaWRpYXJ5SWQgPSBiYXNrZXREZXRhaWxzLnN1YnNpZGlhcnlJZCB8fCAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3N1YnNpZGlhcnlJZCcpIHx8ICcnKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMgPSBbXSBhcyBUUHJvZHVjdFtdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQgPSBbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbiA9IFtdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9IFtdO1xyXG4gICAgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiBhbnksIGluZGV4KSA9PiB7XHJcbiAgICAgIGNvbnN0IHAgPSB7fSBhcyBUUHJvZHVjdDtcclxuICAgICAgcC5pdGVtRGlzY291bnRzID0ge30gYXMgSXRlbURpc2NvdW50cztcclxuICAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcclxuICAgICAgcC5leGNsdWRlUHJvbW90aW9uID0gcHJvZHVjdC5leGNsdWRlUHJvbW90aW9uO1xyXG4gICAgICBwLmJhckNvZGUgPSBwcm9kdWN0LmJhcmNvZGU7XHJcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xyXG4gICAgICBwLmRlc2NyaXB0aW9uID0gcHJvZHVjdC5kZXNjcmlwdGlvbjtcclxuICAgICAgcC5pdGVtTGluZUlkID0gcHJvZHVjdC5pdGVtTGluZUlkID8gcHJvZHVjdC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIlwiICsgKGluZGV4ICsgMSk7XHJcbiAgICAgIHAucHJpY2UgPSBwcm9kdWN0LnNlbGVjdGVkUHJpY2U7XHJcbiAgICAgIHAucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC5xdWFudGl0eSAqIHByb2R1Y3Quc2VsZWN0ZWRQcmljZTtcclxuICAgICAgcC5pbWFnZVVybHMgPSBwcm9kdWN0LmltYWdlVXJscztcclxuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xyXG5cclxuICAgICAgLy9pbnZlbnRvcnkgZmllbGRzXHJcbiAgICAgIFxyXG4gICAgICBwLmZ1bGxmaWxtZW50SWQgPSBwcm9kdWN0LmZ1bGxmaWxtZW50SWQ/IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDogdGhpcy5zdG9yZUluZm8uc3RvcmVJZDtcclxuXHJcbiAgICAgIHAuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWUgPSBwcm9kdWN0LmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lO1xyXG4gICAgICBwLmRlbGl2ZXJ5R3JvdXAgPSBwcm9kdWN0LmRlbGl2ZXJ5R3JvdXA7XHJcbiAgICAgIHAubGVhZFRpbWUgPSBwcm9kdWN0LmxlYWRUaW1lO1xyXG4gICAgICBwLmRlbGl2ZXJ5TWV0aG9kID0gcHJvZHVjdC5kZWxpdmVyeU1ldGhvZDtcclxuXHJcbiAgICAgIHAuZ2lmdENhcmQgPSBwcm9kdWN0LmdpZnRDYXJkO1xyXG4gICAgICBwLmdpZnRDYXJkRXhwaXJ5RGF0ZSA9IHByb2R1Y3QuZ2lmdENhcmRFeHBpcnlEYXRlO1xyXG4gICAgICBwLmdpZnRDYXJkTnVtYmVySXNzdWVkID0gcHJvZHVjdC5naWZ0Q2FyZE51bWJlcklzc3VlZDtcclxuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsID0gcHJvZHVjdC5naWZ0Q2FyZFJlY2lwaWVudEVtYWlsO1xyXG4gICAgICBwLmdpZnRDYXJkUmVjaXBpZW50TmFtZSA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnROYW1lO1xyXG5cclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSA+IDApIHtcclxuICAgICAgICBwLnJlZnVuZGVkUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHk7XHJcbiAgICAgICAgcC5yZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHk7XHJcbiAgICAgICAgcC5yZWZ1bmRlZCA9IHByb2R1Y3QucmVmdW5kZWQ7XHJcbiAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uO1xyXG4gICAgICAgIHAucmVmdW5kZWRSZWFzb24gPSBwcm9kdWN0LnJlZnVuZGVkUmVhc29uO1xyXG4gICAgICAgIGlmICghcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uKSB7XHJcbiAgICAgICAgICBwLnJlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24gPSBwLnJlZnVuZGVkUmVhc29uO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwLnJlZnVuZGVkVG90YWwgPSBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgICAgcC5pc0xhc3RFeGNoYW5nZWQgPSBwcm9kdWN0LmlzTGFzdEV4Y2hhbmdlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHByb2R1Y3QuZXhjaGFuZ2UpIHtcclxuICAgICAgICBwLmV4Y2hhbmdlID0gcHJvZHVjdC5leGNoYW5nZTtcclxuICAgICAgfVxyXG4gICAgICBpZiAocHJvZHVjdC5saW5lRGlzY291bnQpIHtcclxuICAgICAgICBwLmxpbmVEaXNjb3VudCA9IHByb2R1Y3QubGluZURpc2NvdW50O1xyXG4gICAgICB9XHJcbiAgICAgIHAuaXRlbURpc2NvdW50cyA9IHByb2R1Y3QuaXRlbURpc2NvdW50cyBhcyBJdGVtRGlzY291bnRzO1xyXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLnB1c2gocCk7XHJcbiAgICAgIHRoaXMubGluZURpc2NvdW50KGJhc2tldERldGFpbHMpO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiB0cmFuc2FjdGlvbmRvY3VtZW50IGJhc2tldCBkZXRhaWxzIHVwZGF0ZWRcIiwgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldCkpO1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICAgKiBjdXJyZW50IHRyYW5zYWN0aW9uIERldGFpbHMgVG90YWwoTmV3IFByb2R1Y3RzKVxyXG4gICAgICogQHJldHVybnMgY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1xyXG4gICAgICovXHJcblxyXG4gIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMoYmFza2V0OiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQ6IGN1cnJlbnQgdHJhbnNhY3Rpb24gZGV0YWlscyBmb3IgZXhjaGFuZ2VzXCIsIGJhc2tldCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVQcm9tb3Rpb24gPSBbXSBhcyBMaW5lUHJvbW90aW9uc1tdO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZURpc2NvdW50ID0gW10gYXMgTGluZURpc2NvdW50W107XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ID0gW107XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyA9IGJhc2tldC5wcm9kdWN0cztcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMucHJvZHVjdHMuZmlsdGVyKFxyXG4gICAgICAoICAgICAgcHJvajogeyByZWZ1bmRlZFF1YW50aXR5OiBudW1iZXI7IH0pID0+IHByb2oucmVmdW5kZWRRdWFudGl0eSAhPSAwXHJcbiAgICApO1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgcmVmdW5kZWRRdWFudGl0eTogYW55OyBxdWFudGl0eTogYW55OyB0b3RhbExpbmVQcmljZTogbnVtYmVyOyByZWZ1bmRlZFRvdGFsOiBudW1iZXI7IHRvdGFsOiBhbnk7IHJlZnVuZGVkOiBib29sZWFuOyBsaW5lUHJvbW90aW9uczogYW55OyBsaW5lRGlzY291bnQ6IGFueTsgfSkgPT4ge1xyXG4gICAgICBpZiAocHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XHJcbiAgICAgICAgcHJvZHVjdC5xdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcclxuICAgICAgICAvLyB1cGRhdGluZyB0b3RhbCBsaW5lIHByaWNlIHdpdGggYWN0dWFsIHByaWNlIHRvIGJlIHJlZnVuZGVkIGluY2x1ZGluZyB0aGUgcmVmdW5kaW5nIHF0eVxyXG4gICAgICAgIHByb2R1Y3QudG90YWxMaW5lUHJpY2UgPSBNYXRoLmFicyhwcm9kdWN0LnJlZnVuZGVkVG90YWwpO1xyXG4gICAgICAgIHByb2R1Y3QudG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlO1xyXG4gICAgICAgIGlmIChwcm9kdWN0LnF1YW50aXR5ID09PSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcclxuICAgICAgICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICAvL1VwZGF0aW5nIGxpbmUgcHJvbW90aW9ucyBhbmQgbGluZSBkaXNjb3VudHMgICAgICBcclxuICAgICAgaWYgKHByb2R1Y3QubGluZVByb21vdGlvbnMgJiYgIXByb2R1Y3QucmVmdW5kZWRRdWFudGl0eSkge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmxpbmVQcm9tb3Rpb24ucHVzaChwcm9kdWN0LmxpbmVQcm9tb3Rpb25zKVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9kdWN0LmxpbmVEaXNjb3VudCAmJiAhcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5KSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMubGluZURpc2NvdW50LnB1c2gocHJvZHVjdC5saW5lRGlzY291bnQpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDogY3VycmVudCB0cmFuc2FjdGlvbiBkZXRhaWxzIGFmdGVyIHJlbW92aW5nIG9sZCBwcm9kdWN0c1wiLCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyk7XHJcblxyXG4gICAgaWYgKGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIGJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudHJhbnNhY3Rpb25EaXNjb3VudC5wdXNoKC4uLmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KTtcclxuICAgIH1cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkgPSB7fSBhcyBCYXNrZXRTdW1tYXJ5O1xyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVTYWxlVG90YWwodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyA9IGJhc2tldC5xdWFudGl0eTtcclxuXHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9IGJhc2tldC5iYXNrZXRUb3RhbDtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLnVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNSZWZ1bmRUb3RhbCgpO1xyXG4gICAgLy8gRm9yIHBhcnRpYWwgcmVmdW5kIGRpc2NvdW50IGlzIHVwZGF0aWVkIGluIHRvdGFsIGxpbmUgcHJpY2Ugc28gZGlzY291bnRUb3RhbCB3aWxsIGFsd2F5cyBiZSB6ZXJvICYgaW4gY2FzZSBvZiBleGNoYW5nZSBkaXNjb3VudCB0b3RhbCBpcyBjYWxjdWxhdGVkXHJcblxyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfRVhDSEFOR0UpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzRGlzY291bnRUb3RhbCgpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIGxldCBkaXNjb3VudFRvdGFsID0gMDtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50OiB7IGRpc2NvdW50QW1vdW50OiBudW1iZXI7IH0pID0+IHtcclxuICAgICAgICAgIGRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gTWF0aC5hYnMoZGlzY291bnRUb3RhbCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsID0gMDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZWJhc2tldDp0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1wiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscykpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gVGF4IFRvdGFsXHJcbiAqIEByZXR1cm5zIFRheCBUb3RhbFxyXG4gKi9cclxuXHJcbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1RheEJyZWFrZG93bihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBsZXQgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsID0gMDtcclxuICAgIGxldCB0YXhCcmVha2Rvd246IFRheEJyZWFrZG93biA9IHtcclxuICAgICAgdGF4TGluZXM6IFtdLFxyXG4gICAgICB0b3RhbFRheGFibGVBbW91bnQ6IDAsXHJcbiAgICB9O1xyXG5cclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50OiB7IGRpc2NvdW50QW1vdW50OiBudW1iZXI7IH0pID0+IHtcclxuICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgKz0gZGlzY291bnQuZGlzY291bnRBbW91bnQ7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IHsgaXRlbUxpbmVJZDogYW55OyBzZWxlY3RlZFZBVDogYW55OyBzZWxlY3RlZFZBVENvZGU6IGFueTsgdG90YWw6IGFueTsgcmVmdW5kZWRRdWFudGl0eTogbnVtYmVyOyBpdGVtRGlzY291bnRzOiB7IGN1cnJlbnRSZWZ1bmRQb3J0aW9uOiBudW1iZXI7IHRybkRpc2NvdW50c1BvcnRpb246IG51bWJlcjsgdHJuUHJvbW90aW9uc1BvcnRpb246IG51bWJlcjsgfTsgfSkgPT4ge1xyXG4gICAgICAgIGxldCB0YXhMaW5lOiBUYXhMaW5lID0ge1xyXG4gICAgICAgICAgaXRlbUxpbmVJZDogcHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgICAgVkFUOiBwcm9kdWN0LnNlbGVjdGVkVkFUID8gcHJvZHVjdC5zZWxlY3RlZFZBVCA6IDAsXHJcbiAgICAgICAgICBWQVRDb2RlOiBwcm9kdWN0LnNlbGVjdGVkVkFUQ29kZSxcclxuICAgICAgICAgIHRheExpbmVUb3RhbDogMCxcclxuICAgICAgICAgIHRheGFibGVBbW91bnQ6IHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgICBQcmVUYXg6IDBcclxuXHJcbiAgICAgICAgfTtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJQcm9kdWN0IGNvbnRyaWJ1dGlvbiA6IGl0ZW0gbGluZSBJRCA6Y3VycmVudCB0cmFuc2FjdGlvbiBEZXRhaWxzXCIsXHJcbiAgICAgICAgICBwcm9kdWN0Lml0ZW1MaW5lSWQsIFwidGF4IGxpbmUgOlwiLCBKU09OLnN0cmluZ2lmeSh0YXhMaW5lKSwgSlNPTi5zdHJpbmdpZnkoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCkpO1xyXG5cclxuICAgICAgICAvL3N0ZXAgMVxyXG4gICAgICAgIC8vIGlmIFRyYW5zYWN0aW9uIERpc2NvdW50IGFuZC9vciBwcm9tb3Rpb24gYXBwbGllZCwgZmluZCBuZXQgc2VsbGluZyBwcmljZSBvZiBlYWNoIHByb2R1Y3QgYXMgdGF4YWJsZWFtb3VudFxyXG5cclxuICAgICAgICAvL0lmIHRyYW5zYWN0aW9uIGRpc2NvdW50L3Byb21vdGlvbiBpcyBhcHBsaWVkIHRheGFibGUgYW1vdW50IHNob3VsZCBiZSBkZWR1Y3RpbmcgdHJhbnNhY3Rpb24gcHJvbW90aW9uIGFuZCB0cmFuc2FjdGlvbiBkaXNhY291bnQgcG9ydGlvblxyXG4gICAgICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG5cclxuICAgICAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IC1NYXRoLmFicyh0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMuY3VycmVudFJlZnVuZFBvcnRpb24pO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgPSB0YXhMaW5lLnRheGFibGVBbW91bnQgLSBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuRGlzY291bnRzUG9ydGlvbiAtIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vc3RlcCAyIC0gZmluZCBwcmUgdGF4XHJcbiAgICAgICAgdGF4TGluZS5QcmVUYXggPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMigodGF4TGluZS50YXhhYmxlQW1vdW50ICogMTAwKSAvICgxMDAgKyB0YXhMaW5lLlZBVCkpO1xyXG5cclxuICAgICAgICAvL3N0ZXAgMyAtIFVwZGF0ZSB0YXhicmVha2Rvd25cclxuICAgICAgICB0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50ICs9IHRheExpbmUudGF4YWJsZUFtb3VudDtcclxuICAgICAgICB0YXhMaW5lLnRheGFibGVBbW91bnQgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhMaW5lLnRheGFibGVBbW91bnQpO1xyXG4gICAgICAgIFxyXG4gICAgICAgIC8vIHN0ZXAgNCAtIHVwZGF0ZSB0YXggTGluZSB0b3RhbFxyXG4gICAgICAgIHRheExpbmUudGF4TGluZVRvdGFsID0gIHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCAtIHRheExpbmUuUHJlVGF4KTtcclxuICAgICAgICB0YXhCcmVha2Rvd24udGF4TGluZXMucHVzaCh0YXhMaW5lKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duID0gdGF4QnJlYWtkb3duO1xyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93biAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMudGF4QnJlYWtkb3duLnRheExpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bi50YXhMaW5lcy5yZWR1Y2UoXHJcbiAgICAgICAgKG46IGFueSwgeyB0YXhMaW5lVG90YWwgfTogYW55KSA9PiBuICsgdGF4TGluZVRvdGFsLFxyXG4gICAgICAgIDBcclxuICAgICAgKSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCA9IDAuMDA7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc29sZS5sb2coXCJlQmFza2V0OmFmdGVyIGNhbGN1bGF0aW5nIHRheCBjdXJyZW50dHJhbnNhY3Rpb25EZXRhaWxzXCIsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzKVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzVG90YWxUYXhTdW1tYXJ5KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICBcclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnRheEJyZWFrZG93bikpO1xyXG5cclxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlBcnJheTogVG90YWxUYXhTdW1tYXJ5W10gPSBbXVxyXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRheCBMaW5lcyBmb3IgVG90YWwgVGF4IFN1bW1lcnkgOlwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMpKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgoZWxlbWVudDogeyBWQVRDb2RlOiBhbnk7IFZBVDogYW55OyBQcmVUYXg6IGFueTsgdGF4TGluZVRvdGFsOiBhbnk7IH0pID0+IHtcclxuICAgICAgbGV0IFRheFN1bW1hcnk6IFRvdGFsVGF4U3VtbWFyeSA9IHtcclxuICAgICAgICBWQVRDb2RlOlwiXCIsXHJcbiAgICAgICAgVkFUOiAtMTIzNDUsXHJcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxyXG4gICAgICAgIFRheFN1bTogMCxcclxuICAgICAgICBUWHJhdGVTdW06IDBcclxuICAgICAgfTtcclxuICAgICAgICBUYXhTdW1tYXJ5LlZBVENvZGU9ZWxlbWVudC5WQVRDb2RlO1xyXG4gICAgICAgIFRheFN1bW1hcnkuVkFUID0gZWxlbWVudC5WQVQ7ICAgICAgICBcclxuICAgICAgIFxyXG4gICAgICAgIFRheFN1bW1hcnkuUHJlVGF4U3VtID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIoZWxlbWVudC5QcmVUYXgpOyAgICAgICAgXHJcbiAgICAgICAgVGF4U3VtbWFyeS5UYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LnRheExpbmVUb3RhbCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgIFxyXG4gICAgICAgIHRvdGFsVGF4U3VtbWFyeUFycmF5LnB1c2goVGF4U3VtbWFyeSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgIFdpdGhvdXQgR3JvdXBlZCA6IFwiLCBKU09OLnN0cmluZ2lmeSh0b3RhbFRheFN1bW1hcnlBcnJheSkpO1xyXG4gICAgXHJcbiAgICB0b3RhbFRheFN1bW1hcnlHcm91cCA9IHRvdGFsVGF4U3VtbWFyeUFycmF5LnJlZHVjZSgocHJlcGFyZWRBcnJheTphbnksY3VycmVudE9iajphbnkpID0+IHtcclxuICAgICAgbGV0IGluZCA9IHByZXBhcmVkQXJyYXkuZmluZEluZGV4KCh4OiB7IFZBVDogYW55OyB9KSA9PiB4LlZBVCA9PT0gY3VycmVudE9iai5WQVQpO1xyXG4gICAgICBpZihpbmQgPT09IC0xKXtcclxuICAgICAgICBwcmVwYXJlZEFycmF5LnB1c2goY3VycmVudE9iailcclxuICAgICAgfWVsc2Uge1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVRDb2RlID0gY3VycmVudE9iai5WQVRDb2RlO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5WQVQgPSBjdXJyZW50T2JqLlZBVDtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uUHJlVGF4U3VtICs9IGN1cnJlbnRPYmouUHJlVGF4U3VtO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5UYXhTdW0gKz0gY3VycmVudE9iai5UYXhTdW07XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlRYcmF0ZVN1bSArPSBjdXJyZW50T2JqLlRYcmF0ZVN1bTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcHJlcGFyZWRBcnJheTtcclxuICAgIH0sW10pXHJcbiAgICAvLyBsaXN0T2ZUYWdzLm1hcCh4ID0+IHVuaXF1ZS5maWx0ZXIoYSA9PiBhLmxhYmVsID09IHgubGFiZWwgJiYgYS5jb2xvciA9PSB4LmNvbG9yKS5sZW5ndGggPiAwID8gbnVsbCA6IHVuaXF1ZS5wdXNoKHgpKTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsICBUYXggU3VtbWVyIEdyb3VwIDpcIiwgSlNPTi5zdHJpbmdpZnkodG90YWxUYXhTdW1tYXJ5R3JvdXApKTtcclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy50b3RhbFRheFN1bW1hcnkgPSB0b3RhbFRheFN1bW1hcnlHcm91cDtcclxuICAgIHJldHVybiB0aGlzO1xyXG5cclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGN1cnJlbnQgdHJhbnNhY3Rpb24gRGlzb2N1bnQgVG90YWxcclxuICAgKiBAcmV0dXJucyBEaXNjb3VudCBUb3RhbFxyXG4gICAqL1xyXG4gIHVwZGF0ZUN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNEaXNjb3VudFRvdGFsKCkge1xyXG4gICAgbGV0IHJlZnVuZFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMuYmFza2V0U3VtbWFyeS5yZWZ1bmRUb3RhbCA/IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXIgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWw6IGRpc2NvdW50VG90YWxcIiwgcmVmdW5kVG90YWwsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsKTtcclxuICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPVxyXG4gICAgICBNYXRoLmFicyhcclxuICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCkgLVxyXG4gICAgICAgIChNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKSArIE1hdGguYWJzKHJlZnVuZFRvdGFsKSlcclxuICAgICAgKTtcclxuICAgIGNvbnNvbGUubG9nKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXIgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc0Rpc2NvdW50VG90YWw6IGRpc2NvdW50VG90YWxcIiwgZGlzY291bnRUb3RhbClcclxuICAgIHJldHVybiBOdW1iZXIoZGlzY291bnRUb3RhbC50b0ZpeGVkKDIpKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogY3VycmVudCB0cmFuc2FjdGlvbiBSZWZ1bmQgVG90YWxcclxuICAqIEByZXR1cm5zIFJlZnVuZCBUb3RhbFxyXG4gICovXHJcbiAgdXBkYXRlQ3VycmVudFRyYW5zYWN0aW9uRGV0YWlsc1JlZnVuZFRvdGFsKCkge1xyXG4gICAgbGV0IHRvdGFsUmVmdW5kID0gMDtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VycmVudFRyYW5zYWN0aW9uRGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgcHJvZHVjdDogUHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXJyZW50VHJhbnNhY3Rpb25EZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkge1xyXG4gICAgICAgIHRvdGFsUmVmdW5kID0gdG90YWxSZWZ1bmQgKyBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogdHJhbnNhY3Rpb24gU2VydmljZTogdG90YWxSZWZ1bmQgZm9yIEN1cnJlbnQgVHJhbnNhY3Rpb25EZXRhaWxzXCIgKyB0b3RhbFJlZnVuZClcclxuICAgIH1cclxuICAgIHJldHVybiB0b3RhbFJlZnVuZDtcclxuICB9XHJcblxyXG5cclxuXHJcbiAgLyoqXHJcbiAgICogQmFza2V0cyBzdW1tYXJ5XHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBzdW1tYXJ5XHJcbiAgICovXHJcbiAgYmFza2V0U3VtbWFyeShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwoYmFza2V0RGV0YWlscy5iYXNrZXRUb3RhbCk7XHJcblxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuc2FsZVRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy51cGRhdGVTYWxlVG90YWwoXHJcbiAgICAgIGJhc2tldERldGFpbHNcclxuICAgICkpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgPSB0aGlzLmdldFJlZnVuZFRvdGFsKCk7XHJcbiAgICBpZiAoXHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50IHx8XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvblxyXG4gICAgKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmRpc2NvdW50VG90YWwgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0aGlzLnVwZGF0ZURpc2NvdW50VG90YWwoKSk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zID0gYmFza2V0RGV0YWlscy5xdWFudGl0eTtcclxuXHJcblxyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgdGF4TGluZVRvdGFsIH06IGFueSkgPT4gbiArIHRheExpbmVUb3RhbCxcclxuICAgICAgICAwXHJcbiAgICAgICkpO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LlZBVFRvdGFsID0gMC4wMDtcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmluZm8oXCJlYmFza2V0OiBiYXNrZXRzdW1tYXJ5IHVwZGF0ZWQgaW4gdHJhbnNhY3Rpb24gZG9jdW1lbnQ6IFwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeSkpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBMaW5lIERpc2NvdW50XHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBsaW5lIERpc2NvdW50XHJcbiAgICovXHJcbiAgbGluZURpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgZWxlbWVudCA9IGJhc2tldERldGFpbHMucHJvZHVjdHNbaW5kZXhdO1xyXG4gICAgICBpZiAoZWxlbWVudC5saW5lRGlzY291bnQpIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5wdXNoKGVsZW1lbnQubGluZURpc2NvdW50KTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LnJlZHVjZShcclxuICAgICAgICAgIChhY2M6IGFueVtdLCB2YWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICAgIGlmICghYWNjLmZpbmQoKGVsOiB7IGl0ZW1MaW5lSWQ6IGFueTsgfSkgPT4gZWwuaXRlbUxpbmVJZCA9PT0gdmFsLml0ZW1MaW5lSWQpKSB7XHJcbiAgICAgICAgICAgICAgYWNjLnB1c2godmFsKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm4gYWNjO1xyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIFtdXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gY29uc29sZS5pbmZvKFxyXG4gICAgICAvLyAgIFwiZS1iYXNrZXQgOmxpbmUgZGlzY291bnQgdXBkYXRlZCBpbiB0cmFuc2FjdGlvbiBkb2N1bWVudFwiLFxyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50XHJcbiAgICAgIC8vICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGV4Y2hhbmdlXHJcbiAgICogQHBhcmFtIGJhc2tldERldGFpbHNcclxuICAgKiBAcmV0dXJucyBleGNoYW5nZSBcclxuICAgKi9cclxuICBleGNoYW5nZShiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID0gYmFza2V0RGV0YWlscy5leGNoYW5nZSAmJiBiYXNrZXREZXRhaWxzLmV4Y2hhbmdlLmxlbmd0aCA+IDAgPyBbLi4uYmFza2V0RGV0YWlscy5leGNoYW5nZV0gOiBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG5cclxuICAgICAgY29uc3QgZWxlbWVudDogYW55ID0gYmFza2V0RGV0YWlscy5wcm9kdWN0c1tpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmV4Y2hhbmdlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIGNvbnN0IGlzUHJlc2VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2Uuc29tZSgoZWw6IHsgZXhjaGFuZ2VJZDogYW55OyB9KSA9PiBlbC5leGNoYW5nZUlkID09PSBlbGVtZW50LmV4Y2hhbmdlLmV4Y2hhbmdlSWQpO1xyXG4gICAgICAgIGlmICghaXNQcmVzZW50KSB7XHJcbiAgICAgICAgICBsZXQgZXhjaGFuZ2VJdGVtcyA9IFtdO1xyXG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zLmxlbmd0aDsgaisrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zW2pdO1xyXG4gICAgICAgICAgICBsZXQgbmV3SXRlbXM6IGFueSA9IHsgbGluZUl0ZW1JZDogaXRlbS5pdGVtTGluZUlkLCBRdWFudGl0eTogaXRlbS5xdWFudGl0eSB9XHJcbiAgICAgICAgICAgIGV4Y2hhbmdlSXRlbXMucHVzaChuZXdJdGVtcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbGVtZW50LmV4Y2hhbmdlLm5ld0l0ZW1zID0gWy4uLmV4Y2hhbmdlSXRlbXNdO1xyXG4gICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZS5wdXNoKGVsZW1lbnQuZXhjaGFuZ2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldCBleGNoYW5nZVwiLFxyXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQuZXhjaGFuZ2UpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAqIGFkZCBwcmV2aW91cyBleGNoYW5nZSBkYXRhXHJcbiAgKiBAcGFyYW0gb3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50XHJcbiAgKiBAcmV0dXJucyBsaW5lIFByb21vdGlvbnNcclxuICAqL1xyXG4gIGFkZEV4Y2hhbmdlRGF0YShvcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQ6IFRyYW5zYWN0aW9uRG9jdW1lbnQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlID0gb3JpZ2luYWxUcmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5leGNoYW5nZSA/IFsuLi5vcmlnaW5hbFRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmV4Y2hhbmdlXSA6IG51bGw7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIGxpbmUgUHJvbW90aW9uc1xyXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXHJcbiAgICogQHJldHVybnMgbGluZSBQcm9tb3Rpb25zXHJcbiAgICovXHJcbiAgbGluZVByb21vdGlvbihiYXNrZXREZXRhaWxzOiBCYXNrZXQpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSBbXTtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBlbGVtZW50ID0gYmFza2V0RGV0YWlscy5wcm9kdWN0c1tpbmRleF07XHJcbiAgICAgIGlmIChlbGVtZW50LmxpbmVQcm9tb3Rpb25zKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLnB1c2goXHJcbiAgICAgICAgICBlbGVtZW50LmxpbmVQcm9tb3Rpb25zXHJcbiAgICAgICAgKTtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ucmVkdWNlKFxyXG4gICAgICAgICAgKGFjYzogYW55W10sIHZhbDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgaWYgKCFhY2MuZmluZCgoZWw6IHsgaXRlbUxpbmVJZDogYW55OyB9KSA9PiBlbC5pdGVtTGluZUlkID09PSB2YWwuaXRlbUxpbmVJZCkpIHtcclxuICAgICAgICAgICAgICBhY2MucHVzaCh2YWwpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBhY2M7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgW11cclxuICAgICAgICApO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHRyYW5zYWN0aW9uIFByb21vdGlvblxyXG4gICAqIEBwYXJhbSBiYXNrZXREZXRhaWxzXHJcbiAgICogQHJldHVybnMgdHJhbnNhY3Rpb24gUHJvbW90aW9uXHJcbiAgICovXHJcbiAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24pIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiA9XHJcbiAgICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbjtcclxuICAgICAgLy8gICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgYmFza2V0RGV0YWlscy5UcmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaChlbGVtZW50LmxpbmVQcm9tb3Rpb25zKVxyXG4gICAgICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9ucy5yZWR1Y2UoKGFjYywgdmFsKSA9PiB7XHJcbiAgICAgIC8vICAgICBpZiAoIWFjYy5maW5kKGVsID0+IGVsLml0ZW1MaW5lSWQgPT09IHZhbC5pdGVtTGluZUlkKSkge1xyXG4gICAgICAvLyAgICAgICBhY2MucHVzaCh2YWwpO1xyXG4gICAgICAvLyAgICAgfVxyXG4gICAgICAvLyAgICAgcmV0dXJuIGFjYztcclxuICAgICAgLy8gICB9LCBbXSk7XHJcbiAgICAgIC8vIH1cclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXI6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb25cIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uKVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB0cmFuc2FjdGlvbkRpc2NvdW50KGJhc2tldERldGFpbHM6IEJhc2tldCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGlmIChiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ID1cclxuICAgICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQ7XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyhcclxuICAgICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdHJhbnNhY3Rpb24gRGlzY291bnRcIixcclxuICAgICAgICBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQpXHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFBheW1lbnRzIGRldGFpbHNcclxuICAgKiBAcGFyYW0gcGF5bWVudERldGFpbHNcclxuICAgKiBAcmV0dXJuc1xyXG4gICAqL1xyXG4gIHBheW1lbnREZXRhaWxzKHBheW1lbnREZXRhaWxzOiBhbnkpIHtcclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQgOiBwYXltZW50IGRldGFpbHMgYWZ0ZXIgdHJhbnNhY3Rpb24gY29tcGxldGVkXCIsSlNPTi5zdHJpbmdpZnkocGF5bWVudERldGFpbHMpKTtcclxuICAgIFxyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnBheW1lbnREZXRhaWxzID0gcGF5bWVudERldGFpbHM7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBQYXltZW50cyBkZXRhaWxzXHJcbiAgICogQHBhcmFtIHBheW1lbnREZXRhaWxzXHJcbiAgICogQHJldHVybnNcclxuICAgKi9cclxuICAgc3BsaXRQYXltZW50KHNwbGl0UGF5bWVudDogYm9vbGVhbikgeyAgICBcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zcGxpdFBheW1lbnQgPSBzcGxpdFBheW1lbnQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9IFxyXG5cclxuICAgLyoqXHJcbiAgICogUGF5bWVudHMgZGV0YWlsc1xyXG4gICAqIEBwYXJhbSBwYXltZW50RGV0YWlsc1xyXG4gICAqIEByZXR1cm5zXHJcbiAgICovXHJcbiAgICBpc1BheW1lbnRDb21wbGV0ZWQoaXNQYXltZW50Q29tcGxldGVkOiBib29sZWFuKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5pc1BheW1lbnRDb21wbGV0ZWQgPSBpc1BheW1lbnRDb21wbGV0ZWQ7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfSBcclxuICBcclxuXHJcblxyXG5cclxuICAvKipcclxuICAgKiBCYXNlcyBjdXJyZW5jeVxyXG4gICAqIEBwYXJhbSBjdXJyZW5jeVxyXG4gICAqIEByZXR1cm5zIGN1cnJlbmN5XHJcbiAgICovXHJcbiAgYmFzZUN1cnJlbmN5KGN1cnJlbmN5OiBhbnkpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5ID0gY3VycmVuY3k7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICogZ2lmdCBvcHRpb24gYXRcclxuICAqIEByZXR1cm5zIGF0XHJcbiAgKi9cclxuICBnaWZ0T3B0aW9uKGdpZnQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnNvbGUubG9nKFxyXG4gICAgICBcImUtYmFza2V0IDpUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlcjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmdpZnRvcHRpb25cIixcclxuICAgICAgZ2lmdFxyXG4gICAgKTtcclxuICAgIGlmIChnaWZ0KSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5naWZ0ZWRSZWNlaXB0ID0gZ2lmdDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuXHJcbi8qKlxyXG4gKiBtYW51YWwgRGlzY291bnRcclxuICogQHBhcmFtIGRpc2NvdW50RGF0YVxyXG4gKiBAcmV0dXJuc1xyXG4gKi9cclxuXHJcbiAgLy8gbWFudWFsRGlzY291bnQoZGlzY291bnREYXRhIDogYmFza2V0RGlzY291bnQpOlRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAvLyAgIGxldCBzYWxlVG90YWwgPSAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWw7XHJcbiAgLy8gICBpZihkaXNjb3VudERhdGEuZGlzY291bnRUeXBlID09J1BlcmNlbnQnKXtcclxuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPSBzYWxlVG90YWwtKHNhbGVUb3RhbCooZGlzY291bnREYXRhLmRpc2NvdW50QW1vdW50LzEwMCkpO1xyXG4gIC8vICAgICBkaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQgPSAtMSooc2FsZVRvdGFsLXRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsKTtcclxuICAvLyAgIH1lbHNlIHtcclxuICAvLyAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwgPXNhbGVUb3RhbC1kaXNjb3VudERhdGEuZGlzY291bnRBbW91bnQ7XHJcbiAgLy8gICAgIGRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudCA9IC0xKmRpc2NvdW50RGF0YS5kaXNjb3VudEFtb3VudDtcclxuICAvLyAgIH1cclxuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbkRpc2NvdW50LnB1c2goZGlzY291bnREYXRhKTtcclxuICAvLyAgIHJldHVybiB0aGlzO1xyXG5cclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFR5cGVzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICAgKiBAcGFyYW0gdFxyXG4gICAqIEByZXR1cm5zIHR5cGVcclxuICAgKi9cclxuICB0eXBlKHQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID0gdDtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuICAvKipcclxuICAgKiBPcGVyYXRpb25zIHN0YXR1c1xyXG4gICAqIEBwYXJhbSBvXHJcbiAgICogQHJldHVybnMgc3RhdHVzXHJcbiAgICovXHJcbiAgb3BlcmF0aW9uU3RhdHVzKG86IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcGVyYXRpb25TdGF0dXMgPSBvO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIENyZWF0ZWQgYXRcclxuICAgKiBAcmV0dXJucyBhdFxyXG4gICAqL1xyXG4gIGNyZWF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXBkYXRlZEF0ID0gZGF0ZS50b0lTT1N0cmluZygpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG4gIC8qKlxyXG4gICAqIFVwZGF0ZWQgYXRcclxuICAgKiBAcmV0dXJucyBhdFxyXG4gICAqL1xyXG4gIHVwZGF0ZWRBdCgpOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogdHJhbnNzYWN0aW9uIGNvbXBsZXRpb24gYXRcclxuICAgKiBAcmV0dXJucyB0cmFuc2FjdGlvbiBjb21wbGV0aW9uIGRhdGVcclxuICAgKi9cclxuICB0cmFuc2FjdGlvbkNvbXBsZXRlZEF0KCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zQ29tcGxldGVkQXQgPSBkYXRlLnRvSVNPU3RyaW5nKCk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbiAgLyoqXHJcbiAgICogQnVpbGRzIHRyYW5zYWN0aW9uIGRvY3VtZW50IGJ1aWxkZXJcclxuICAgKiBAcmV0dXJucyBidWlsZFxyXG4gICAqL1xyXG4gIGJ1aWxkKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnQge1xyXG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbGVzIHRvdGFsIGluIHJlZnVuZFxyXG4gICAqIEBwYXJhbSBzYWxlVG90YWxcclxuICAgKiBAcmV0dXJucyB0b3RhbCBpbiByZWZ1bmRcclxuICAgKi9cclxuICBzYWxlVG90YWxJblJlZnVuZChzYWxlVG90YWw6IG51bWJlcik6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zYWxlVG90YWwgPSBzYWxlVG90YWw7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcclxuICAgKiBAcmV0dXJucyBiYXNrZXQgZGV0YWlsc1xyXG4gICAqL1xyXG4gIGdldEJhc2tldERldGFpbHMoKTogQmFza2V0IHtcclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQ6IEdldHRpbmcgQmFza2V0IGZvciB0cmFuc2FjdGlvbkRvY3VtZW50XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudCkpO1xyXG5cclxuICAgIGxldCBiYXNrZXQ6IEJhc2tldCA9IHtcclxuICAgICAgc3Vic2lkaWFyeUlkIDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN1YnNpZGlhcnlJZCxcclxuICAgICAgdHJhbnNhY3Rpb25EaXNjb3VudDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LFxyXG4gICAgICB0cmFuc2FjdGlvblByb21vdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbixcclxuICAgICAgdHJhbnNhY3Rpb25JZDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnRyYW5zYWN0aW9uSWQsXHJcbiAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQub2ZmbGluZVRyYW5zYWN0aW9uSWQsXHJcbiAgICAgIHRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCxcclxuICAgICAgYmFza2V0VG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsLFxyXG4gICAgICBkaXNjb3VudFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNjb3VudFRvdGFsLFxyXG4gICAgICBzYWxlVG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCxcclxuICAgICAgcmVmdW5kVG90YWw6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsLFxyXG4gICAgICBxdWFudGl0eTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyxcclxuICAgICAgcHJvZHVjdHM6IFtdLFxyXG4gICAgICBiYXNlQ3VycmVuY3k6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgIGN1c3RvbWVyOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3VzdG9tZXIsXHJcbiAgICB9O1xyXG5cclxuICAgIGJhc2tldC5wcm9kdWN0cyA9IFtdIGFzIFByb2R1Y3RbXTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdDogeyBTS1U6IGFueTsgYmFyQ29kZTogYW55OyBiYXJjb2RlczogYW55OyBkZXNjcmlwdGlvbjogYW55OyBpbWFnZVVybHM6IGFueTsgdG90YWxMaW5lUHJpY2U6IGFueTsgaXRlbUxpbmVJZDogYW55OyBleGNsdWRlUHJvbW90aW9uOiBhbnk7IHByaWNlOiBhbnk7IHF1YW50aXR5OiBhbnk7IHNlbGVjdGVkUlJQUHJpY2U6IGFueTsgZnVsbGZpbG1lbnRJZDogYW55OyBmdWxsZmlsbWVudExvY2F0aW9uTmFtZTogYW55OyBkZWxpdmVyeUdyb3VwOiBzdHJpbmc7IGxlYWRUaW1lOiBhbnk7IGRlbGl2ZXJ5TWV0aG9kOiBhbnk7IGdpZnRDYXJkOiBhbnk7IGdpZnRDYXJkRXhwaXJ5RGF0ZTogYW55OyBnaWZ0Q2FyZE51bWJlcklzc3VlZDogYW55OyBnaWZ0Q2FyZFJlY2lwaWVudEVtYWlsOiBhbnk7IGdpZnRDYXJkUmVjaXBpZW50TmFtZTogYW55OyByZWZ1bmRlZFRvdGFsOiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgcmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjogYW55OyByZWZ1bmRlZFJlYXNvbjogYW55OyByZWZ1bmRlZFByb21vdGlvbmFsUXVhbnRpdHk6IGFueTsgaXNMYXN0RXhjaGFuZ2VkOiBhbnk7IH0sIGluZGV4OiBhbnkpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocHJvZHVjdCksIFwiZWJhc2tldDogYmFza2V0IGRldGFpbCB1cGRhdGUgaW4gYmFza2V0XCIpO1xyXG4gICAgICBjb25zdCBwID0ge30gYXMgYW55O1xyXG4gICAgICBwLlNLVSA9IHByb2R1Y3QuU0tVO1xyXG4gICAgICBwLmJhcmNvZGUgPSBwcm9kdWN0LmJhckNvZGU7XHJcbiAgICAgIHAuYmFyY29kZXMgPSBwcm9kdWN0LmJhcmNvZGVzO1xyXG5cclxuICAgICAgcC5kZXNjcmlwdGlvbiA9IHByb2R1Y3QuZGVzY3JpcHRpb247XHJcbiAgICAgIHAuaW1hZ2VVcmxzID0gcHJvZHVjdC5pbWFnZVVybHM7XHJcbiAgICAgIHAuY3VycmVuY3kgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5O1xyXG4gICAgICBwLnRvdGFsTGluZVByaWNlID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgcC5pdGVtTGluZUlkID0gTnVtYmVyKHByb2R1Y3QuaXRlbUxpbmVJZCk7XHJcbiAgICAgIHAuZXhjbHVkZVByb21vdGlvbiA9IHByb2R1Y3QuZXhjbHVkZVByb21vdGlvbjtcclxuXHJcbiAgICAgIHAuc2VsZWN0ZWRQcmljZSA9IHByb2R1Y3QucHJpY2U7XHJcbiAgICAgIHAucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gICAgICBwLnRvdGFsID0gcHJvZHVjdC50b3RhbExpbmVQcmljZTtcclxuICAgICAgcC5zZWxlY3RlZFJSUFByaWNlID0gcHJvZHVjdC5zZWxlY3RlZFJSUFByaWNlO1xyXG5cclxuICAgICAgcC5mdWxsZmlsbWVudElkID0gcHJvZHVjdC5mdWxsZmlsbWVudElkO1xyXG4gICAgICBwLmZ1bGxmaWxtZW50TG9jYXRpb25OYW1lID0gcHJvZHVjdC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZTtcclxuICAgICAgcC5kZWxpdmVyeUdyb3VwID0gcHJvZHVjdC5kZWxpdmVyeUdyb3VwIHx8IFwiMVwiO1xyXG4gICAgICBwLmxlYWRUaW1lID0gcHJvZHVjdC5sZWFkVGltZTtcclxuICAgICAgcC5kZWxpdmVyeU1ldGhvZCA9IHByb2R1Y3QuZGVsaXZlcnlNZXRob2QgfHwgREVMSVZFUllfTUVUSE9EUy5DT0xMRUNUX0ZST01fU1RPUkUudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgIGlmKHAuZnVsbGZpbG1lbnRJZCAhPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZClcclxuICAgICAge1xyXG4gICAgICAgIHAuaXNXZWJPcmRlciA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgIFxyXG4gICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcclxuICAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcclxuICAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XHJcbiAgICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcclxuICAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcclxuICAgICAgXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJlxyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAgICAgKSB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQuZm9yRWFjaCgobGluZURpc2NvdW50OiB7IGl0ZW1MaW5lSWQ6IHsgdG9TdHJpbmc6ICgpID0+IGFueTsgfTsgZGlzY291bnRlZExpbmVQcmljZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XHJcbiAgICAgICAgICAgIHAubGluZURpc2NvdW50ID0gbGluZURpc2NvdW50O1xyXG4gICAgICAgICAgICBwLnRvdGFsID0gbGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gJiZcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxyXG4gICAgICApIHtcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IHByb21vdGlvbkxpbmVQcmljZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gICAgICAgICAgICBwLmxpbmVQcm9tb3Rpb25zID0gbGluZVByb21vdGlvbjtcclxuICAgICAgICAgICAgcC50b3RhbCA9IGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoXHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24gJiZcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5sZW5ndGggPiAwXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKHRheExpbmU6IHsgaXRlbUxpbmVJZDogeyB0b1N0cmluZzogKCkgPT4gYW55OyB9OyBWQVQ6IGFueTsgVkFUQ29kZTogYW55OyB9KSA9PiB7XHJcbiAgICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkICYmIHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gdGF4TGluZS5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcclxuICAgICAgICAgICAgcC5zZWxlY3RlZFZBVCA9IHRheExpbmUuVkFUO1xyXG4gICAgICAgICAgICBwLnNlbGVjdGVkVkFUQ29kZSA9IHRheExpbmUuVkFUQ29kZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCkge1xyXG4gICAgICAgIHAudG90YWwgPSBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH0gZWxzZSBpZiAoKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EIHx8IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gICAgICAgIHAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbiA9IHByb2R1Y3QucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbjtcclxuICAgICAgICBwLnJlZnVuZGVkUmVhc29uID0gcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbjtcclxuICAgICAgICBpZiAoIXAucmVmdW5kZWRSZWFzb25EZXNjcmlwdGlvbikge1xyXG4gICAgICAgICAgcC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gcC5yZWZ1bmRlZFJlYXNvbjtcclxuICAgICAgICB9XHJcbiAgICAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5O1xyXG4gICAgICAgIHAucmVmdW5kUHJvbW90aW9uYWxRdWFudGl0eSA9IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5O1xyXG4gICAgICAgIHAucmVmdW5kZWRUb3RhbCA9IHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcclxuICAgICAgICBwLnRvdGFsIC09IE1hdGguYWJzKHAucmVmdW5kZWRUb3RhbCk7XHJcbiAgICAgICAgcC5pc0xhc3RFeGNoYW5nZWQgPSBwcm9kdWN0LmlzTGFzdEV4Y2hhbmdlZDtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCkge1xyXG4gICAgICAgIGlmIChwLnRvdGFsID4gMCkge1xyXG4gICAgICAgICAgcC50b3RhbCAqPSAtMTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGJhc2tldC5wcm9kdWN0cy5wdXNoKHApO1xyXG5cclxuICAgIH0pO1xyXG5cclxuICAgIGJhc2tldCA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25EaXNjb3VudEFuZFRyYW5zYWN0aW9uUHJvbW90aW9uUG9ydGlvbihiYXNrZXQpO1xyXG4gICAgYmFza2V0LnRvdGFsID0gKGJhc2tldC5iYXNrZXRUb3RhbCB8fCAwKSArIHRoaXMuZ2V0VG90YWxEaXNjb3VudFdpdGhUcmFuc2FjdGlvbkRpc2NvdW50c0FuZFByb21vdGlvbnMoYmFza2V0KTtcclxuICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCkge1xyXG4gICAgICBiYXNrZXQucXVhbnRpdHkgPSB0aGlzLmdldFJlZnVuZGVkVG90YWxXaXRoUXVhbnRpdHkoYmFza2V0KTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUuaW5mbyhcImViYXNrZXQ6IEJhc2tldCBjcmVhdGVkIHN1Y2Nlc3NmdWxseVwiLCBKU09OLnN0cmluZ2lmeShiYXNrZXQpKVxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEdldHMgYmFza2V0IGRldGFpbHNcclxuICAgKiBAcmV0dXJucyByZWZ1bmQgYmFza2V0IGRldGFpbHNcclxuICAgKi9cclxuICAvLyBnZXRSZWZ1bmRCYXNrZXREZXRhaWxzKCk6IEJhc2tldCB7XHJcbiAgLy8gICBsZXQgYmFza2V0OiBCYXNrZXQgPSB7XHJcbiAgLy8gICAgIHN1YnNpZGlhcnlJZCA6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdWJzaWRpYXJ5SWQsXHJcbiAgLy8gICAgIHRyYW5zYWN0aW9uRGlzY291bnQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCxcclxuICAvLyAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24sXHJcbiAgLy8gICAgIHRyYW5zYWN0aW9uSWQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50cmFuc2FjdGlvbklkLFxyXG4gIC8vICAgICB0b3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuYmFza2V0VG90YWwsXHJcbiAgLy8gICAgIGJhc2tldFRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCxcclxuICAvLyAgICAgZGlzY291bnRUb3RhbDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbCxcclxuICAvLyAgICAgc2FsZVRvdGFsOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwsXHJcbiAgLy8gICAgIHF1YW50aXR5OiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS50b3RhbEl0ZW1zLFxyXG4gIC8vICAgICBwcm9kdWN0czogW10sXHJcbiAgLy8gICAgIGJhc2VDdXJyZW5jeTogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAvLyAgICAgY3VzdG9tZXI6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lcixcclxuICAvLyAgIH07XHJcblxyXG4gIC8vICAgYmFza2V0LnByb2R1Y3RzID0gW10gYXMgUHJvZHVjdFtdO1xyXG4gIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChwcm9kdWN0OiB7IFNLVTogYW55OyBiYXJDb2RlOiBhbnk7IGJhcmNvZGVzOiBhbnk7IGRlc2NyaXB0aW9uOiBhbnk7IGltYWdlVXJsczogYW55OyB0b3RhbExpbmVQcmljZTogYW55OyBpdGVtTGluZUlkOiBhbnk7IGV4Y2x1ZGVQcm9tb3Rpb246IGFueTsgcHJpY2U6IG51bWJlcjsgcXVhbnRpdHk6IGFueTsgc2VsZWN0ZWRSUlBQcmljZTogYW55OyBmdWxsZmlsbWVudElkOiBhbnk7IGZ1bGxmaWxtZW50TG9jYXRpb25OYW1lOiBhbnk7IGRlbGl2ZXJ5R3JvdXA6IHN0cmluZzsgbGVhZFRpbWU6IGFueTsgZGVsaXZlcnlNZXRob2Q6IGFueTsgZ2lmdENhcmQ6IGFueTsgZ2lmdENhcmRFeHBpcnlEYXRlOiBhbnk7IGdpZnRDYXJkTnVtYmVySXNzdWVkOiBhbnk7IGdpZnRDYXJkUmVjaXBpZW50RW1haWw6IGFueTsgZ2lmdENhcmRSZWNpcGllbnROYW1lOiBhbnk7IGl0ZW1EaXNjb3VudHM6IGFueTsgcmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5OiBhbnk7IHJlZnVuZGVkUXVhbnRpdHk6IG51bWJlcjsgcmVmdW5kZWQ6IGFueTsgaXNMYXN0RXhjaGFuZ2VkOiBhbnk7IGV4Y2hhbmdlOiBhbnk7IHJlZnVuZGVkVG90YWw6IG51bWJlcjsgfSwgaW5kZXg6IGFueSkgPT4ge1xyXG4gIC8vICAgICBjb25zdCBwID0ge30gYXMgUHJvZHVjdDtcclxuICAvLyAgICAgcC5TS1UgPSBwcm9kdWN0LlNLVTtcclxuICAvLyAgICAgcC5iYXJjb2RlID0gcHJvZHVjdC5iYXJDb2RlO1xyXG4gIC8vICAgICBwLmJhcmNvZGVzID0gcHJvZHVjdC5iYXJjb2RlcztcclxuXHJcbiAgLy8gICAgIHAuZGVzY3JpcHRpb24gPSBwcm9kdWN0LmRlc2NyaXB0aW9uO1xyXG4gIC8vICAgICBwLmltYWdlVXJscyA9IHByb2R1Y3QuaW1hZ2VVcmxzO1xyXG4gIC8vICAgICBwLmN1cnJlbmN5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcclxuICAvLyAgICAgcC50b3RhbExpbmVQcmljZSA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgLy8gICAgIHAuaXRlbUxpbmVJZCA9IE51bWJlcihwcm9kdWN0Lml0ZW1MaW5lSWQpO1xyXG4gIC8vICAgICBwLmV4Y2x1ZGVQcm9tb3Rpb24gPSBwcm9kdWN0LmV4Y2x1ZGVQcm9tb3Rpb247XHJcblxyXG4gIC8vICAgICBwLnNlbGVjdGVkUHJpY2UgPSBwcm9kdWN0LnByaWNlO1xyXG4gIC8vICAgICBwLnF1YW50aXR5ID0gcHJvZHVjdC5xdWFudGl0eTtcclxuICAvLyAgICAgcC50b3RhbCA9IHByb2R1Y3QudG90YWxMaW5lUHJpY2U7XHJcbiAgLy8gICAgIHAuc2VsZWN0ZWRSUlBQcmljZSA9IHByb2R1Y3Quc2VsZWN0ZWRSUlBQcmljZTtcclxuXHJcbiAgLy8gICAgIHAuZnVsbGZpbG1lbnRJZCA9IHByb2R1Y3QuZnVsbGZpbG1lbnRJZDtcclxuICAvLyAgICAgcC5mdWxsZmlsbWVudExvY2F0aW9uTmFtZSA9IHByb2R1Y3QuZnVsbGZpbG1lbnRMb2NhdGlvbk5hbWU7XHJcbiAgLy8gICAgIHAuZGVsaXZlcnlHcm91cCA9IHByb2R1Y3QuZGVsaXZlcnlHcm91cCB8fCBcIjFcIjtcclxuICAvLyAgICAgcC5sZWFkVGltZSA9IHByb2R1Y3QubGVhZFRpbWU7XHJcbiAgLy8gICAgIHAuZGVsaXZlcnlNZXRob2QgPSBwcm9kdWN0LmRlbGl2ZXJ5TWV0aG9kIHx8IERFTElWRVJZX01FVEhPRFMuQ09MTEVDVF9GUk9NX1NUT1JFLnRvU3RyaW5nKCk7XHJcblxyXG4gIC8vICAgICBwLmdpZnRDYXJkID0gcHJvZHVjdC5naWZ0Q2FyZDtcclxuICAvLyAgICAgcC5naWZ0Q2FyZEV4cGlyeURhdGUgPSBwcm9kdWN0LmdpZnRDYXJkRXhwaXJ5RGF0ZTtcclxuICAvLyAgICAgcC5naWZ0Q2FyZE51bWJlcklzc3VlZCA9IHByb2R1Y3QuZ2lmdENhcmROdW1iZXJJc3N1ZWQ7XHJcbiAgLy8gICAgIHAuZ2lmdENhcmRSZWNpcGllbnRFbWFpbCA9IHByb2R1Y3QuZ2lmdENhcmRSZWNpcGllbnRFbWFpbDtcclxuICAvLyAgICAgcC5naWZ0Q2FyZFJlY2lwaWVudE5hbWUgPSBwcm9kdWN0LmdpZnRDYXJkUmVjaXBpZW50TmFtZTtcclxuICAgICAgXHJcbiAgICAgIFxyXG4gIC8vICAgICBpZihwLmZ1bGxmaWxtZW50SWQgIT0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnN0b3JlSWQpXHJcbiAgLy8gICAgIHtcclxuICAvLyAgICAgICBwLmlzV2ViT3JkZXIgPSB0cnVlO1xyXG4gIC8vICAgICB9XHJcbiAgICAgIFxyXG4gIC8vICAgICBpZiAocHJvZHVjdC5pdGVtRGlzY291bnRzKSB7XHJcbiAgLy8gICAgICAgcC5pdGVtRGlzY291bnRzID0gcHJvZHVjdC5pdGVtRGlzY291bnRzIGFzIEl0ZW1EaXNjb3VudDtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgLy8gaWYoIXAuaXRlbURpc2NvdW50cyl7XHJcbiAgLy8gICAgIC8vICAgY29uc29sZS5sb2cocC5pdGVtRGlzY291bnRzKTtcclxuXHJcbiAgLy8gICAgIC8vICAgdGhpcy5iYXNrZXRTZXJ2aWNlLnRyYW5zYWN0aW9uRGlzY291bnRBbmRQcm9tb3Rpb25Qcm9kdWN0b3J0aW9uQ2FsY3VsYXRpb24oYmFza2V0KTtcclxuICAvLyAgICAgLy8gfVxyXG4gIC8vICAgICBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eSA/IHByb2R1Y3QucmVmdW5kZWRQcm9tb3Rpb25hbFF1YW50aXR5IDogMDtcclxuXHJcbiAgLy8gICAgIGlmIChwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpIHtcclxuICAvLyAgICAgICBwLnF1YW50aXR5ID0gcC5xdWFudGl0eSAtIHByb2R1Y3QucmVmdW5kZWRRdWFudGl0eTtcclxuICAvLyAgICAgICBwLnRvdGFsTGluZVByaWNlID0gKHAucXVhbnRpdHkgKiBwcm9kdWN0LnByaWNlKTtcclxuICAvLyAgICAgICBwLnRvdGFsID0gcC50b3RhbExpbmVQcmljZTtcclxuICAvLyAgICAgICAvLyBwLnJlZnVuZFByb21vdGlvbmFsUXVhbnRpdHkgPSBwcm9kdWN0LnJlZnVuZGVkUHJvbW90aW9uYWxRdWFudGl0eTtcclxuICAvLyAgICAgICBwLnJlZnVuZGVkID0gcHJvZHVjdC5yZWZ1bmRlZDtcclxuICAvLyAgICAgICBwLmlzTGFzdEV4Y2hhbmdlZCA9IHByb2R1Y3QuaXNMYXN0RXhjaGFuZ2VkO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICAgIGlmIChwcm9kdWN0LmV4Y2hhbmdlKSB7XHJcbiAgLy8gICAgICAgcC5leGNoYW5nZSA9IHByb2R1Y3QuZXhjaGFuZ2U7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudCAmJlxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcblxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZvckVhY2goKGxpbmVEaXNjb3VudDogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IGRpc2NvdW50ZWRMaW5lUHJpY2U6IGFueTsgfSkgPT4ge1xyXG5cclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkgJiYgcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ID4gMCkge1xyXG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IE9iamVjdC5hc3NpZ24oe30sIGxpbmVEaXNjb3VudCk7XHJcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2UgPSBwLmxpbmVEaXNjb3VudC51bml0UHJpY2UgKiBwLnF1YW50aXR5XHJcbiAgLy8gICAgICAgICAgIHAubGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ID0gcC50b3RhbCAtIHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2VcclxuICAvLyAgICAgICAgICAgcC50b3RhbCA9IHAubGluZURpc2NvdW50LmRpc2NvdW50ZWRMaW5lUHJpY2U7XHJcbiAgLy8gICAgICAgICB9IGVsc2UgaWYgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gIC8vICAgICAgICAgICBwLmxpbmVEaXNjb3VudCA9IGxpbmVEaXNjb3VudDtcclxuICAvLyAgICAgICAgICAgcC50b3RhbCA9IGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlXHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24gJiZcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMFxyXG4gIC8vICAgICApIHtcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24uZm9yRWFjaCgobGluZVByb21vdGlvbjogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IHJlZnVuZGVkOiBhbnk7IH0pID0+IHtcclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpICYmICFsaW5lUHJvbW90aW9uLnJlZnVuZGVkKSB7XHJcbiAgLy8gICAgICAgICAgIHAubGluZVByb21vdGlvbnMgPSBsaW5lUHJvbW90aW9uO1xyXG4gIC8vICAgICAgICAgICBwLnRvdGFsID0gcC5saW5lUHJvbW90aW9ucy5wcm9tb3Rpb25MaW5lUHJpY2U7XHJcbiAgLy8gICAgICAgICAgIHAudG90YWwgPSBwLnRvdGFsIC0gKHByb2R1Y3QucmVmdW5kZWRUb3RhbCA/IE1hdGguYWJzKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkgOiAwKTtcclxuICAvLyAgICAgICAgIH1cclxuICAvLyAgICAgICB9KTtcclxuICAvLyAgICAgfVxyXG5cclxuICAvLyAgICAgcC5yZWZ1bmRlZFF1YW50aXR5ID0gMDtcclxuICAvLyAgICAgcC5yZWZ1bmRlZFRvdGFsID0gMDtcclxuXHJcbiAgLy8gICAgIGlmIChcclxuICAvLyAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93biAmJlxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50YXhCcmVha2Rvd24udGF4TGluZXMuZm9yRWFjaCgodGF4TGluZTogeyBpdGVtTGluZUlkOiB7IHRvU3RyaW5nOiAoKSA9PiBhbnk7IH07IFZBVDogYW55OyBWQVRDb2RlOiBhbnk7IH0pID0+IHtcclxuICAvLyAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IHRheExpbmUuaXRlbUxpbmVJZC50b1N0cmluZygpKSB7XHJcbiAgLy8gICAgICAgICAgIHAuc2VsZWN0ZWRWQVQgPSB0YXhMaW5lLlZBVDtcclxuICAvLyAgICAgICAgICAgcC5zZWxlY3RlZFZBVENvZGUgPSB0YXhMaW5lLlZBVENvZGU7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH1cclxuXHJcbiAgLy8gICAgIGlmIChwLnF1YW50aXR5ID4gMCkge1xyXG4gIC8vICAgICAgIGJhc2tldC5wcm9kdWN0cy5wdXNoKHApO1xyXG4gIC8vICAgICB9XHJcbiAgLy8gICB9KTtcclxuICAvLyAgIC8vIHByb2R1Y3QuaXRlbURpc2NvdW50c1xyXG4gIC8vICAgaWYgKCFiYXNrZXQucHJvZHVjdHNbMF0uaGFzT3duUHJvcGVydHkoJ2l0ZW1EaXNjb3VudHMnKSkge1xyXG4gIC8vICAgICBiYXNrZXQgPSB0aGlzLmdldFRyYW5zYWN0aW9uRGlzY291bnRBbmRUcmFuc2FjdGlvblByb21vdGlvblBvcnRpb24oYmFza2V0KTtcclxuXHJcbiAgLy8gICB9XHJcblxyXG4gIC8vICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgIDpuZXcgY3JlYXRlZCByZWZ1bmRlZCBiYXNrZXRcIiwgSlNPTi5zdHJpbmdpZnkoYmFza2V0KSlcclxuICAvLyAgIGJhc2tldC5xdWFudGl0eSA9IGJhc2tldC5wcm9kdWN0cy5yZWR1Y2UoXHJcbiAgLy8gICAgIChuOiBhbnksIHsgcXVhbnRpdHkgfTogYW55KSA9PiBuICsgcXVhbnRpdHksXHJcbiAgLy8gICAgIDBcclxuICAvLyAgICk7XHJcbiAgLy8gICBiYXNrZXQudG90YWwgPSB0aGlzLmdldFRvdGFsV2l0aExpbmVEaXNjb3VudEFuZExpbmVQcm9tb3Rpb25BcHBsaWVkKGJhc2tldCk7XHJcbiAgLy8gICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQudG90YWw7XHJcbiAgLy8gICBiYXNrZXQuYmFza2V0VG90YWwgPSBiYXNrZXQuYmFza2V0VG90YWwgLSB0aGlzLmdldFRvdGFsRGlzY291bnRXaXRoVHJhbnNhY3Rpb25EaXNjb3VudHNBbmRQcm9tb3Rpb25zKGJhc2tldCk7XHJcbiAgLy8gICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgXCJlYmFza2V0IDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgOiB1cGRhdGUgQmFza2V0IFRvdGFsOiBhZnRlciBwcm9tb3Rpb24gOmJhc2tldFRvdGFsXCIsXHJcbiAgLy8gICAgIGJhc2tldC5iYXNrZXRUb3RhbFxyXG4gIC8vICAgKTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgXCJlOmJhc2tldCA6VHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIgOiBiYXNrZXREZXRhaWxzIHVwZGF0ZWQgdmFsdWVzXCIsXHJcbiAgLy8gICAgIEpTT04uc3RyaW5naWZ5KGJhc2tldClcclxuICAvLyAgICk7XHJcbiAgLy8gICByZXR1cm4gYmFza2V0O1xyXG4gIC8vIH1cclxuXHJcblxyXG4gIGdldFRyYW5zYWN0aW9uRGlzY291bnRBbmRUcmFuc2FjdGlvblByb21vdGlvblBvcnRpb24oYmFza2V0OmFueSkge1xyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudCAmJlxyXG4gICAgICBiYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQuZm9yRWFjaCgoZGlzY291bnQ6IHsgaXRlbUxpbmVJZHM6IGFueTsgfSkgPT4ge1xyXG4gICAgICAgIGlmICghZGlzY291bnQuaXRlbUxpbmVJZHMpIHtcclxuICAgICAgICAgIGRpc2NvdW50Lml0ZW1MaW5lSWRzID0gYmFza2V0LnByb2R1Y3RzLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgcmV0dXJuIHByb2R1Y3QuaXRlbUxpbmVJZFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJhc2tldCA9IHRoaXMuYmFza2V0U2VydmljZS50cmFuc2FjdGlvbkRpc2NvdW50UHJvZHVjdFBvcnRpb25DYWxjKGJhc2tldCwgZGlzY291bnQpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIGlmIChcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmXHJcbiAgICAgIGJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmZvckVhY2goKHRQcm9tb3Rpb246IHsgaXRlbUxpbmVJZHM6IGFueTsgfSkgPT4ge1xyXG4gICAgICAgIGlmICghdFByb21vdGlvbi5pdGVtTGluZUlkcykge1xyXG4gICAgICAgICAgY29uc3QgZmlsdGVyZWREYXRhID0gYmFza2V0LnByb2R1Y3RzLmZpbHRlcihcclxuICAgICAgICAgICAgKGl0ZW06IHsgZXhjbHVkZVByb21vdGlvbjogYm9vbGVhbjsgfSkgPT4ge1xyXG4gICAgICAgICAgICAgIHJldHVybiBpdGVtLmV4Y2x1ZGVQcm9tb3Rpb24gPT09IGZhbHNlO1xyXG4gICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0UHJvbW90aW9uLml0ZW1MaW5lSWRzID1cclxuICAgICAgICAgICAgZmlsdGVyZWREYXRhLm1hcCgocHJvZHVjdDogeyBpdGVtTGluZUlkOiBhbnk7IH0pID0+IHtcclxuICAgICAgICAgICAgICByZXR1cm4gcHJvZHVjdC5pdGVtTGluZUlkXHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBiYXNrZXQgPSB0aGlzLmJhc2tldFNlcnZpY2UudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGMoYmFza2V0LCB0UHJvbW90aW9uKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGJhc2tldDtcclxuICB9XHJcblxyXG5cclxuICBnZXRUb3RhbERpc2NvdW50V2l0aFRyYW5zYWN0aW9uRGlzY291bnRzQW5kUHJvbW90aW9ucyhiYXNrZXREZXRhaWxzOiBhbnkpIHtcclxuXHJcbiAgICBsZXQgZGlzY291bnRUb3RhbCA9IDA7XHJcbiAgICBpZiAoXHJcbiAgICAgIGJhc2tldERldGFpbHMudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwXHJcbiAgICApIHtcclxuICAgICAgZGlzY291bnRUb3RhbCArPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uUHJvbW90aW9uLnJlZHVjZShcclxuICAgICAgICAobjogYW55LCB7IHByb21vdGlvbkFtb3VudCB9OiBhbnkpID0+IG4gKyBwcm9tb3Rpb25BbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgaWYgKFxyXG4gICAgICBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQgJiZcclxuICAgICAgYmFza2V0RGV0YWlscy50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDBcclxuICAgICkge1xyXG5cclxuICAgICAgZGlzY291bnRUb3RhbCArPSBiYXNrZXREZXRhaWxzLnRyYW5zYWN0aW9uRGlzY291bnQucmVkdWNlKFxyXG4gICAgICAgIChuOiBhbnksIHsgZGlzY291bnRBbW91bnQgfTogYW55KSA9PiBuICsgZGlzY291bnRBbW91bnQsXHJcbiAgICAgICAgMFxyXG4gICAgICApO1xyXG5cclxuXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyhcImViYXNrZXQgOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciA6IFRyYW5zYWN0aW9uIGRpc2NvdW50IFRvdGFsOlwiLCBkaXNjb3VudFRvdGFsKTtcclxuXHJcbiAgICByZXR1cm4gZGlzY291bnRUb3RhbDtcclxuICB9XHJcblxyXG5cclxuICBhcHBlbmRDdXJyZW5jeVN5bWJvbChjdXJyZW5jeTogbnVtYmVyLCB2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAvLyAgdmFsdWU9dGhpcy5kZWNpbWFscGlwZS50cmFuc2Zvcm0odmFsdWUsJzEuMicpO1xyXG4gICAgaWYgKHZhbHVlID49IDApIHtcclxuICAgICAgY29uc3QgcmV0dXJudmFsID0gY3VycmVuY3kgKyB2YWx1ZTtcclxuICAgICAgY29uc29sZS5sb2cocmV0dXJudmFsLCBcImViYXNrZXQ6IGFkZCBjdXJyZW5jeSB3aXRoIHZhbHVlXCIpO1xyXG4gICAgICByZXR1cm4gcmV0dXJudmFsO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc3QgcmV0dXJudmFsID0gXCItXCIgKyAoY3VycmVuY3kgKyB2YWx1ZSAqIC0xKTtcclxuICAgICAgY29uc29sZS5sb2cocmV0dXJudmFsLCBcIi0oY3VycmVuY3krKHZhbHVlKi0xKSlcIik7XHJcbiAgICAgIHJldHVybiByZXR1cm52YWw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvLyAvKipcclxuICAvLyAgKiBVcGRhdGVzIHRvdGFsIHJlZnVuZFxyXG4gIC8vICAqIEByZXR1cm5zIHRvdGFsIHJlZnVuZFxyXG4gIC8vICAqL1xyXG4gIC8vIHVwZGF0ZVRvdGFsUmVmdW5kKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAvLyAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xyXG4gIC8vICAgICBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5O1xyXG4gIC8vICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBwcm9kdWN0LnRvdGFsTGluZVByaWNlICogLTE7XHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFxyXG4gIC8vICAgICAgIFwiZWJhc2tldDogVHJhbnNhY3Rpb24gcHJpY2Ugb3ZlcnJpZGUgOlwiLFxyXG4gIC8vICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50XHJcbiAgLy8gICAgICk7XHJcblxyXG4gIC8vICAgICBpZiAoXHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uICYmXHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDBcclxuICAvLyAgICAgKSB7XHJcbiAgLy8gICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmZvckVhY2goKGxpbmVQcm9tb3Rpb24pID0+IHtcclxuICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFxyXG4gIC8vICAgICAgICAgICBcIlByb21vdGlvbjogYmFza2V0IGxpbmVQcm9tb3Rpb24gOiBcIixcclxuICAvLyAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uXHJcbiAgLy8gICAgICAgICApO1xyXG4gIC8vICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgIFwibGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKCkgOiBcIixcclxuICAvLyAgICAgICAgICAgbGluZVByb21vdGlvbi5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAvLyAgICAgICAgICk7XHJcbiAgLy8gICAgICAgICBjb25zb2xlLmxvZyhcclxuICAvLyAgICAgICAgICAgXCJjb25kaXRpb24gOiBcIiArXHJcbiAgLy8gICAgICAgICAgIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZC50b1N0cmluZygpKVxyXG4gIC8vICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICBpZiAocHJvZHVjdC5pdGVtTGluZUlkID09PSBsaW5lUHJvbW90aW9uLml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xyXG4gIC8vICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPVxyXG4gIC8vICAgICAgICAgICAgIGxpbmVQcm9tb3Rpb24ucHJvbW90aW9uTGluZVByaWNlICogLTE7XHJcbiAgLy8gICAgICAgICB9XHJcbiAgLy8gICAgICAgfSk7XHJcbiAgLy8gICAgIH0gZWxzZVxyXG4gIC8vICAgICAgIGlmIChcclxuICAvLyAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50ICYmXHJcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5sZW5ndGggPiAwXHJcbiAgLy8gICAgICAgKSB7XHJcbiAgLy8gICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVEaXNjb3VudC5mb3JFYWNoKChsaW5lRGlzY291bnQpID0+IHtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJwcm9kdWN0Lml0ZW1MaW5lSWQgOiBcIiArXHJcbiAgLy8gICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnRcclxuICAvLyAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJsaW5lRGlzY291bnQuaXRlbUxpbmVJZC50b1N0cmluZygpIDogXCIgK1xyXG4gIC8vICAgICAgICAgICAgIGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKClcclxuICAvLyAgICAgICAgICAgKTtcclxuICAvLyAgICAgICAgICAgY29uc29sZS5sb2coXHJcbiAgLy8gICAgICAgICAgICAgXCJjb25kaXRpb24gOiBcIiArXHJcbiAgLy8gICAgICAgICAgICAgKHByb2R1Y3QuaXRlbUxpbmVJZCA9PT0gbGluZURpc2NvdW50Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSlcclxuICAvLyAgICAgICAgICAgKTtcclxuXHJcbiAgLy8gICAgICAgICAgIGlmIChwcm9kdWN0Lml0ZW1MaW5lSWQgPT09IGxpbmVEaXNjb3VudC5pdGVtTGluZUlkLnRvU3RyaW5nKCkpIHtcclxuICAvLyAgICAgICAgICAgICBwcm9kdWN0LnJlZnVuZGVkVG90YWwgPSBsaW5lRGlzY291bnQudW5pdFByaWNlICogcHJvZHVjdC5yZWZ1bmRlZFF1YW50aXR5ICogLTE7XHJcbiAgLy8gICAgICAgICAgIH1cclxuICAvLyAgICAgICAgIH0pO1xyXG4gIC8vICAgICAgIH1cclxuXHJcbiAgLy8gICAgIGNvbnNvbGUubG9nKFwiUHJvZHVjdCBkZXNjcmlwdGlvbiA6XCIgKyBwcm9kdWN0LmRlc2NyaXB0aW9uKTtcclxuICAvLyAgICAgY29uc29sZS5sb2coXCJQcm9kdWN0IHRvdGFsIDpcIiArIHByb2R1Y3QucmVmdW5kZWRUb3RhbCk7XHJcbiAgLy8gICAgIC8vIHByb2R1Y3QuZGlzcGxheXJlZnVuZGVkYW1vdW50PXRoaXMuYXBwZW5kQ3VycmVuY3lTeW1ib2woQ1VSUkVOQ1lbdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeV0scHJvZHVjdC5yZWZ1bmRlZFRvdGFsKTtcclxuICAvLyAgICAgLy8gY29uc29sZS5sb2cocHJvZHVjdC5kaXNwbGF5cmVmdW5kZWRhbW91bnQsXCJkaXNwbGF5cmVmdW5kZWRhbW91bnRcIik7XHJcbiAgLy8gICAgIHByb2R1Y3QucmVmdW5kZWQgPSB0cnVlO1xyXG4gIC8vICAgfSk7XHJcbiAgLy8gICBjb25zdCBiYXNrZXR0b3RhbCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5YmFza2V0dG90YWw9dGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgYmFza2V0dG90YWwpO1xyXG4gIC8vICAgY29uc3Qgc2FsZXRvdGFsID0gKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICAvLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5kaXNwbGF5c2FsZXRvdGFsID0gdGhpcy5hcHBlbmRDdXJyZW5jeVN5bWJvbChDVVJSRU5DWVt0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFzZUN1cnJlbmN5XSwgc2FsZXRvdGFsKTtcclxuICAvLyAgICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCAqPSAtMSk7XHJcbiAgLy8gICByZXR1cm4gdGhpcztcclxuICAvLyB9XHJcblxyXG4gIC8qKlxyXG4gICAqIFNhbGUgVG90YWxcclxuICAgKiBAcGFyYW0gYmFza2V0RGV0YWlsc1xyXG4gICAqIEByZXR1cm5zIFNhbGUgVG90YWxcclxuICAgKi9cclxuICB1cGRhdGVTYWxlVG90YWwoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55W107IH0pIHtcclxuICAgIGNvbnN0IHNhbGVUb3RhbCA9IGJhc2tldERldGFpbHMucHJvZHVjdHMucmVkdWNlKFxyXG4gICAgICAobjogYW55LCB7IHRvdGFsTGluZVByaWNlIH06IGFueSkgPT4gbiArIHRvdGFsTGluZVByaWNlLFxyXG4gICAgICAwXHJcbiAgICApO1xyXG4gICAgcmV0dXJuIHNhbGVUb3RhbFxyXG4gIH1cclxuXHJcbiAgZ2V0VG90YWxXaXRoTGluZURpc2NvdW50QW5kTGluZVByb21vdGlvbkFwcGxpZWQoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogYW55OyB9KTogbnVtYmVyIHtcclxuICAgIGxldCBzYWxldG90YWw6IG51bWJlciA9IDAuMDtcclxuICAgIGZvciAobGV0IHByb2R1Y3Qgb2YgYmFza2V0RGV0YWlscy5wcm9kdWN0cykge1xyXG4gICAgICAvLyBpZiAocHJvZHVjdC5saW5lUHJvbW90aW9ucykge1xyXG4gICAgICAvLyAgIHNhbGV0b3RhbCArPSBwcm9kdWN0LmxpbmVQcm9tb3Rpb25zLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgLy8gfSBlbHNlIGlmIChcclxuICAgICAgLy8gICBwcm9kdWN0LmxpbmVEaXNjb3VudCAmJlxyXG4gICAgICAvLyAgICFwcm9kdWN0LmxpbmVQcm9tb3Rpb25zXHJcbiAgICAgIC8vICkge1xyXG4gICAgICAvLyAgIHNhbGV0b3RhbCArPVxyXG4gICAgICAvLyAgICAgcHJvZHVjdC5xdWFudGl0eSAqIE51bWJlcihwcm9kdWN0LmxpbmVEaXNjb3VudC51bml0UHJpY2UudG9GaXhlZCgyKSk7XHJcbiAgICAgIC8vIH0gZWxzZSB7XHJcbiAgICAgIC8vICAgc2FsZXRvdGFsICs9XHJcbiAgICAgIC8vICAgICBwcm9kdWN0LnF1YW50aXR5ICogTnVtYmVyKHByb2R1Y3Quc2VsZWN0ZWRQcmljZS50b0ZpeGVkKDIpKTtcclxuICAgICAgLy8gfVxyXG4gICAgICBzYWxldG90YWwgKz0gcHJvZHVjdC50b3RhbDtcclxuICAgICAgY29uc29sZS5sb2coXHJcbiAgICAgICAgXCJlLWJhc2tldDp1cGRhdGUgcHJvZHVjdCBUb3RhbDpcIiArIHNhbGV0b3RhbCxcclxuICAgICAgICBKU09OLnN0cmluZ2lmeShwcm9kdWN0KVxyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHNhbGV0b3RhbDtcclxuICB9XHJcblxyXG4gIGdldFJlZnVuZGVkVG90YWxXaXRoUXVhbnRpdHkoYmFza2V0RGV0YWlsczogeyBwcm9kdWN0czogc3RyaW5nIHwgYW55W107IH0pOiBudW1iZXIge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBjb25zdCBwcm9kdWN0OiBhbnkgPSBiYXNrZXREZXRhaWxzLnByb2R1Y3RzW2luZGV4XTtcclxuXHJcbiAgICAgIGlmICghcHJvZHVjdC5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uKSB7XHJcblxyXG4gICAgICAgIHF1YW50aXR5ID0gcXVhbnRpdHkgKyBwcm9kdWN0LnF1YW50aXR5O1xyXG5cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBxdWFudGl0eSA9IHF1YW50aXR5ICsgKHByb2R1Y3QucXVhbnRpdHkgLSBwcm9kdWN0LnJlZnVuZGVkUXVhbnRpdHkpO1xyXG5cclxuICAgICAgICAvLyBiYXNrZXREZXRhaWxzLnRvdGFsID0gYmFza2V0RGV0YWlscy50b3RhbCArIHByb2R1Y3QucmVmdW5kZWRUb3RhbDtcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBxdWFudGl0eTtcclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEaXNjb3VudCBUb3RhbFxyXG4gICAqIEByZXR1cm5zIERpc2NvdW50IFRvdGFsXHJcbiAgICovXHJcbiAgdXBkYXRlRGlzY291bnRUb3RhbCgpIHtcclxuICAgIGxldCByZWZ1bmRUb3RhbCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnJlZnVuZFRvdGFsID8gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkucmVmdW5kVG90YWwgOiAwO1xyXG4gICAgY29uc29sZS5pbmZvKFwiZS1iYXNrZXQ6IHRyYW5zYWN0aW9uIGJ1aWxkZXI6IHJlZnVuZFRvdGFsXCIsIEpTT04uc3RyaW5naWZ5KHJlZnVuZFRvdGFsKSxcclxuICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkpKTtcclxuICAgIGNvbnN0IGRpc2NvdW50VG90YWwgPVxyXG4gICAgICBNYXRoLmFicyhcclxuICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWwpIC1cclxuICAgICAgICAoXHJcbiAgICAgICAgICBNYXRoLmFicyh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCkgKyBNYXRoLmFicyhyZWZ1bmRUb3RhbClcclxuICAgICAgICApXHJcbiAgICAgICk7XHJcbiAgICBjb25zb2xlLmxvZyhcImUtYmFza2V0OiB0cmFuc2FjdGlvbiBidWlsZGVyOiBkaXNjb3VudFRvdGFsXCIsIEpTT04uc3RyaW5naWZ5KGRpc2NvdW50VG90YWwpKVxyXG4gICAgcmV0dXJuIE51bWJlcihkaXNjb3VudFRvdGFsLnRvRml4ZWQoMikpO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlUmVhc29uQ29kZShyZWFzb25Db2RlOiB7XHJcbiAgICBjb2RlOiBzdHJpbmc7XHJcbiAgICBuYW1lOiBzdHJpbmc7XHJcbiAgfSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5yZWFzb25Db2RlID0gcmVhc29uQ29kZS5jb2RlO1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnJlYXNvbkRlc2NyaXB0aW9uID0gcmVhc29uQ29kZS5uYW1lO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVNYW5hZ2VyT3ZlcnJpZGUoXHJcbiAgICB1c2Vyb3ZlcnJpZGU6IFVzZXJPdmVycmlkZVxyXG4gICk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vdmVycmlkZSA9IHVzZXJvdmVycmlkZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVXNlcklEKFxyXG4gICAgdXNlcklEOiBzdHJpbmdcclxuICApOiBUcmFuc2FjdGlvbkRvY3VtZW50QnVpbGRlciB7XHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlcklkID0gdXNlcklEO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVVc2VyTmFtZShuYW1lOiBhbnkpIDogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lID0gbmFtZTtcclxuICAgIHJldHVybiB0aGlzO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgYWRkQ3VzdG9tZXJEZXRhaWxzKGN1c3RvbWVyRGV0YWlsOiBDdXN0b21lcik6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jdXN0b21lciA9IGN1c3RvbWVyRGV0YWlsO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUYXhCcmVha2Rvd24oYmFza2V0RGV0YWlsczogQmFza2V0KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgLy8gbGV0IHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCA9IDA7XHJcbiAgICBsZXQgdGF4QnJlYWtkb3duOiBUYXhCcmVha2Rvd24gPSB7XHJcbiAgICAgIHRheExpbmVzOiBbXSxcclxuICAgICAgdG90YWxUYXhhYmxlQW1vdW50OiAwLFxyXG4gICAgfTtcclxuXHJcblxyXG5cclxuICAgIC8vIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGRpc2NvdW50KSA9PiB7XHJcbiAgICAvLyAgICAgdHJhbnNhY3Rpb25EaXNjb3VudFRvdGFsICs9IGRpc2NvdW50LmRpc2NvdW50QW1vdW50O1xyXG4gICAgLy8gICB9KTtcclxuICAgIC8vIH1cclxuXHJcbiAgICAvLyBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKFxyXG4gICAgLy8gICAgIChwcm9tb3Rpb24pID0+IHtcclxuICAgIC8vICAgICAgIHRyYW5zYWN0aW9uRGlzY291bnRUb3RhbCArPSBwcm9tb3Rpb24ucHJvbW90aW9uQW1vdW50O1xyXG4gICAgLy8gICAgIH1cclxuICAgIC8vICAgKTtcclxuICAgIC8vIH1cclxuXHJcbiAgICBiYXNrZXREZXRhaWxzLnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICBsZXQgdGF4TGluZTogVGF4TGluZSA9IHtcclxuICAgICAgICBpdGVtTGluZUlkOiBwcm9kdWN0Lml0ZW1MaW5lSWQsXHJcbiAgICAgICAgVkFUOiBwcm9kdWN0LnNlbGVjdGVkVkFUID8gcHJvZHVjdC5zZWxlY3RlZFZBVCA6IDAsXHJcbiAgICAgICAgVkFUQ29kZTogcHJvZHVjdC5zZWxlY3RlZFZBVENvZGUsXHJcbiAgICAgICAgdGF4TGluZVRvdGFsOiAwLFxyXG4gICAgICAgIHRheGFibGVBbW91bnQ6IHByb2R1Y3QudG90YWwsXHJcbiAgICAgICAgUHJlVGF4OiAwXHJcbiAgICAgIH07XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIlByb2R1Y3QgY29udHJpYnV0aW9uIDogaXRlbSBsaW5lIElEIDpcIiwgcHJvZHVjdC5pdGVtTGluZUlkLFxyXG4gICAgICAgIFwidGF4IGxpbmUgOlwiLCBKU09OLnN0cmluZ2lmeSh0YXhMaW5lKSk7XHJcblxyXG4gICAgICAvLyBzdGVwIDFcclxuICAgICAgLy8gaWYgVHJhbnNhY3Rpb24gRGlzY291bnQgYW5kL29yIHByb21vdGlvbiBhcHBsaWVkLCBmaW5kIG5ldCBzZWxsaW5nIHByaWNlIG9mIGVhY2ggcHJvZHVjdCBhcyB0YXhhYmxlYW1vdW50XHJcbiAgICAgIC8vIGlmICh0cmFuc2FjdGlvbkRpc2NvdW50VG90YWwgPiAwKSB7XHJcbiAgICAgIHByb2R1Y3QgPSB0aGlzLmJhc2tldFNlcnZpY2UudmFsaWRhdGVQcm9kdWN0SXRlbURpc2NvdW50KHByb2R1Y3QpO1xyXG5cclxuICAgICAgY29uc3QgcHJvZHVjdENvbnRyaWJ1dGlvbkluVG90YWwgPVxyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5EaXNjb3VudHNQb3J0aW9uICtcclxuICAgICAgICBwcm9kdWN0Lml0ZW1EaXNjb3VudHMudHJuUHJvbW90aW9uc1BvcnRpb24gLVxyXG4gICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy5yZWZ1bmRQb3J0aW9uO1xyXG4gICAgICAvLyAgdHArdGQtcnA7XHJcblxyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9kdWN0IGNvbnRyaWJ1dGlvbiA6IGl0ZW0gbGluZSBJRCA6XCIsIHByb2R1Y3QuaXRlbUxpbmVJZCxcclxuICAgICAgICBcImNvbnRyaWJ1dGlvbiA6XCIsIEpTT04uc3RyaW5naWZ5KHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsKSk7XHJcbiAgICAgIC8vIGNhbGN1bGF0ZSBuZXQgc2VsbGluZyBwcmljZSBhZnRlciBhcHBseWluZyB0cmFuc2FjdGlvbiBkaXNjb3VudCBhcyBwZXIgcHJvZHVjdCBjb250cmlidXRpb25cclxuICAgICAgdGF4TGluZS50YXhhYmxlQW1vdW50IC09IHByb2R1Y3RDb250cmlidXRpb25JblRvdGFsO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvL3N0ZXAgMiAtIGZpbmQgcHJlIHRheFxyXG4gICAgICB0YXhMaW5lLlByZVRheCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKCh0YXhMaW5lLnRheGFibGVBbW91bnQgKiAxMDApIC8gKDEwMCArIHRheExpbmUuVkFUKSk7XHJcblxyXG4gICAgICAvL3N0ZXAgMyAtIFVwZGF0ZSB0YXhicmVha2Rvd25cclxuICAgICAgdGF4QnJlYWtkb3duLnRvdGFsVGF4YWJsZUFtb3VudCArPSB0YXhMaW5lLnRheGFibGVBbW91bnQ7XHJcbiAgICAgIHRheExpbmUudGF4YWJsZUFtb3VudCA9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRheExpbmUudGF4YWJsZUFtb3VudCk7XHJcbiAgICAgIFxyXG4gICAgICAvLyBzdGVwIDQgLSB1cGRhdGUgdGF4IExpbmUgdG90YWxcclxuICAgICAgdGF4TGluZS50YXhMaW5lVG90YWwgPSAgdGhpcy5udW1iZXJVdGlsU2VydmljZS50cmltVG8yRGVjaW1hbDIodGF4TGluZS50YXhhYmxlQW1vdW50IC0gdGF4TGluZS5QcmVUYXgpO1xyXG4gICAgICB0YXhCcmVha2Rvd24udGF4TGluZXMucHVzaCh0YXhMaW5lKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRheEJyZWFrZG93bi50b3RhbFRheGFibGVBbW91bnQgPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMih0YXhCcmVha2Rvd24udG90YWxUYXhhYmxlQW1vdW50KTtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duID0gdGF4QnJlYWtkb3duO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVUb3RhbFRheFN1bW1hcnkoKTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG5cclxuICAgIGNvbnNvbGUubG9nKFwiVG90YWwgVGF4IFN1bW1lcnkgUmVxdWVzdCA6XCIsIEpTT04uc3RyaW5naWZ5KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duKSk7XHJcblxyXG5cclxuICAgIGxldCB0b3RhbFRheFN1bW1hcnlBcnJheTogVG90YWxUYXhTdW1tYXJ5W10gPSBbXVxyXG4gICAgbGV0IHRvdGFsVGF4U3VtbWFyeUdyb3VwID0gW11cclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRheCBMaW5lcyBmb3IgVG90YWwgVGF4IFN1bW1lcnkgOlwiLCBKU09OLnN0cmluZ2lmeSh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcykpO1xyXG5cclxuXHJcbiAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5mb3JFYWNoKChlbGVtZW50OiB7IFZBVENvZGU6IGFueTsgVkFUOiBhbnk7IFByZVRheDogYW55OyB0YXhMaW5lVG90YWw6IGFueTsgfSkgPT4ge1xyXG4gICAgICBsZXQgVGF4U3VtbWFyeTogVG90YWxUYXhTdW1tYXJ5ID0ge1xyXG4gICAgICAgIFZBVENvZGU6IFwiXCIsXHJcbiAgICAgICAgVkFUOiAtMTIzNDUsXHJcbiAgICAgICAgUHJlVGF4U3VtOiAwLFxyXG4gICAgICAgIFRheFN1bTogMCxcclxuICAgICAgICBUWHJhdGVTdW06IDBcclxuICBcclxuICAgICAgfTtcclxuICAgICAgIFRheFN1bW1hcnkuVkFUQ29kZSA9IGVsZW1lbnQuVkFUQ29kZTtcclxuICAgICAgICBUYXhTdW1tYXJ5LlZBVCA9IGVsZW1lbnQuVkFUOyAgICAgICAgXHJcbiAgICAgICAgVGF4U3VtbWFyeS5QcmVUYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LlByZVRheCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UYXhTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihlbGVtZW50LnRheExpbmVUb3RhbCk7XHJcbiAgICAgICAgVGF4U3VtbWFyeS5UWHJhdGVTdW0gPSB0aGlzLm51bWJlclV0aWxTZXJ2aWNlLnRyaW1UbzJEZWNpbWFsMihUYXhTdW1tYXJ5LlByZVRheFN1bSArIFRheFN1bW1hcnkuVGF4U3VtKTsgICAgICBcclxuICAgICAgICB0b3RhbFRheFN1bW1hcnlBcnJheS5wdXNoKFRheFN1bW1hcnkpO1xyXG4gICAgfSlcclxuXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsIFRheCBTdW1tZXJ5ICBXaXRob3V0IEdyb3VwZWQgOiBcIiwgSlNPTi5zdHJpbmdpZnkodG90YWxUYXhTdW1tYXJ5QXJyYXkpKTtcclxuICAgIFxyXG4gICAgdG90YWxUYXhTdW1tYXJ5R3JvdXAgPSB0b3RhbFRheFN1bW1hcnlBcnJheS5yZWR1Y2UoKHByZXBhcmVkQXJyYXk6YW55LGN1cnJlbnRPYmopID0+IHtcclxuXHJcbiAgICAgIGxldCBpbmQgPSBwcmVwYXJlZEFycmF5LmZpbmRJbmRleCgoeDogeyBWQVQ6IGFueTsgfSkgPT4geC5WQVQgPT09IGN1cnJlbnRPYmouVkFUKTtcclxuICAgICAgaWYoaW5kID09PSAtMSl7XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheS5wdXNoKGN1cnJlbnRPYmopXHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUQ29kZSA9IGN1cnJlbnRPYmouVkFUQ29kZTtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVkFUID0gY3VycmVudE9iai5WQVQ7XHJcbiAgICAgICAgcHJlcGFyZWRBcnJheVtpbmRdLlByZVRheFN1bSArPSBjdXJyZW50T2JqLlByZVRheFN1bTtcclxuICAgICAgICBwcmVwYXJlZEFycmF5W2luZF0uVGF4U3VtICs9IGN1cnJlbnRPYmouVGF4U3VtO1xyXG4gICAgICAgIHByZXBhcmVkQXJyYXlbaW5kXS5UWHJhdGVTdW0gKz0gY3VycmVudE9iai5UWHJhdGVTdW07XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHByZXBhcmVkQXJyYXk7XHJcbiAgICB9LFtdKVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhcIlRvdGFsICBUYXggU3VtbWVyIEdyb3VwIDpcIix0b3RhbFRheFN1bW1hcnlHcm91cCk7XHJcblxyXG5cclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudG90YWxUYXhTdW1tYXJ5ID0gdG90YWxUYXhTdW1tYXJ5R3JvdXA7XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIC8qKlxyXG4gICAqIFRyYW5zYWN0aW9uSWRcclxuICAgKiBAcmV0dXJucyBPcmlnaW5hbFRyYW5zYWN0aW9uSWRcclxuICAgKi9cclxuICBhZGRPcmlnaW5hbFRyYW5zSWQodHJhbkRvYzpUcmFuc2FjdGlvbkRvY3VtZW50KTogVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIge1xyXG4gICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX1JFRlVORCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFX0VYQ0hBTkdFKSB7XHJcbiAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcmlnaW5hbFRyYW5zSWQgPSB0cmFuRG9jLnRyYW5zYWN0aW9uSWQ7XHJcbiAgICAgIGlmKHRyYW5Eb2MuYXBpUmVzcG9uc2UgJiYgdHJhbkRvYy5hcGlSZXNwb25zZS5pbnRlcm5hbElkKVxyXG4gICAgICB7XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50Lm9yaWdpbmFsRXh0ZXJuYWxJZCA9IHRyYW5Eb2MuYXBpUmVzcG9uc2UuaW50ZXJuYWxJZC50b1N0cmluZygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIHVucmVmZXJlbmNlZCBSZWZ1bmRcclxuICAgKiBAcmV0dXJucyBib29sZWFuIHZhbHVlXHJcbiAgICovXHJcbiAgYWRkVW5yZWZlcmVuY2VkUmVmdW5kKCk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQgPSB0cnVlO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICBnZXRSZWZ1bmRUb3RhbCgpIHtcclxuICAgIGxldCB0b3RhbFJlZnVuZCA9IDA7XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgY29uc3QgcHJvZHVjdDogVFByb2R1Y3QgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzW2luZGV4XTtcclxuICAgICAgaWYgKHByb2R1Y3QucmVmdW5kZWRUb3RhbCkge1xyXG4gICAgICAgIHRvdGFsUmVmdW5kID0gdG90YWxSZWZ1bmQgKyBwcm9kdWN0LnJlZnVuZGVkVG90YWw7XHJcbiAgICAgIH1cclxuICAgICAgY29uc29sZS5sb2coXCJlYmFza2V0IDogdHJhbnNhY3Rpb24gU2VydmljZTogdG90YWxSZWZ1bmRcIiArIHRvdGFsUmVmdW5kKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvdGFsUmVmdW5kO1xyXG4gIH1cclxuXHJcbiAgZG9jSWQoZG9jSWQ6IGFueSk6IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIHtcclxuICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmlkID0gZG9jSWQ7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcbn1cclxuIl19