@pmcretail/mapper-library 0.0.43 → 0.0.45

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 (39) hide show
  1. package/bundles/pmcretail-mapper-library.umd.js +4165 -0
  2. package/bundles/pmcretail-mapper-library.umd.js.map +1 -0
  3. package/esm2015/lib/RJ-mapper.class.js +877 -0
  4. package/esm2015/lib/TransactionDocumentBuilder.js +1244 -0
  5. package/esm2015/lib/WebReturn-mapper.class.js +326 -0
  6. package/esm2015/lib/WebReturnSalesforceMapper.class.js +409 -0
  7. package/esm2015/lib/basket.service.js +527 -0
  8. package/esm2015/lib/mapper-library.component.js +26 -0
  9. package/esm2015/lib/mapper-library.module.js +21 -0
  10. package/esm2015/lib/number-util.service.js +42 -0
  11. package/{fesm2022/pmcretail-mapper-library.mjs → fesm2015/pmcretail-mapper-library.js} +173 -154
  12. package/fesm2015/pmcretail-mapper-library.js.map +1 -0
  13. package/lib/RJ-mapper.class.d.ts +1 -0
  14. package/lib/RJ-mapper.class.d.ts.map +1 -1
  15. package/lib/TransactionDocumentBuilder.d.ts +1 -0
  16. package/lib/TransactionDocumentBuilder.d.ts.map +1 -1
  17. package/lib/WebReturn-mapper.class.d.ts +1 -0
  18. package/lib/WebReturn-mapper.class.d.ts.map +1 -1
  19. package/lib/WebReturnSalesforceMapper.class.d.ts +1 -0
  20. package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -1
  21. package/lib/basket.service.d.ts +1 -0
  22. package/lib/basket.service.d.ts.map +1 -1
  23. package/lib/mapper-library.component.d.ts +1 -1
  24. package/lib/number-util.service.d.ts +1 -0
  25. package/lib/number-util.service.d.ts.map +1 -1
  26. package/package.json +9 -16
  27. package/esm2022/lib/RJ-mapper.class.mjs +0 -875
  28. package/esm2022/lib/TransactionDocumentBuilder.mjs +0 -1240
  29. package/esm2022/lib/WebReturn-mapper.class.mjs +0 -324
  30. package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +0 -410
  31. package/esm2022/lib/basket.service.mjs +0 -516
  32. package/esm2022/lib/mapper-library.component.mjs +0 -22
  33. package/esm2022/lib/mapper-library.module.mjs +0 -21
  34. package/esm2022/lib/number-util.service.mjs +0 -40
  35. package/fesm2022/pmcretail-mapper-library.mjs.map +0 -1
  36. /package/{esm2022/lib/mapper-library.model.mjs → esm2015/lib/mapper-library.model.js} +0 -0
  37. /package/{esm2022/pmcretail-mapper-library.mjs → esm2015/pmcretail-mapper-library.js} +0 -0
  38. /package/{esm2022/public-api.mjs → esm2015/public-api.js} +0 -0
  39. /package/{index.d.ts → pmcretail-mapper-library.d.ts} +0 -0
@@ -1,324 +0,0 @@
1
- import { PROMOTION_LEVEL, PROMOTION_TYPE } from "./mapper-library.model";
2
- import { NumberUtilService } from "./number-util.service";
3
- export class WebReturnMapperBuilderClass {
4
- constructor(document, currencyPipe) {
5
- this.currencyPipe = currencyPipe;
6
- this.webReturnObject = {
7
- id: '',
8
- orgCode: "",
9
- storeId: "",
10
- storeNodeId: "",
11
- storeNodeStructure: "",
12
- deviceId: "",
13
- terminalId: "",
14
- initiatingModule: "",
15
- export: false,
16
- isInStoreOrder: false,
17
- basket: {},
18
- basketSummary: {},
19
- baseCurrency: "",
20
- customer: {
21
- firstName: '',
22
- lastName: '',
23
- email: '',
24
- postCode: '',
25
- id: '',
26
- billingAddress: {},
27
- shippingAddress: {},
28
- },
29
- currentTransactionDetails: {}
30
- };
31
- if (document) {
32
- this.document = document;
33
- }
34
- this.numberUtilService = new NumberUtilService(currencyPipe);
35
- }
36
- WebReturnMapper() {
37
- this.webReturnObject['type'] = 'WEB_RETURNS';
38
- this.webReturnObject['datetime'] = this.getUTCDateTime(this.getText(this.document.updated_at));
39
- this.webReturnObject.baseCurrency = this.getText(this.document.base_currency_code);
40
- this.webReturnObject.storeId = this.getText(this.document.store_id);
41
- this.webReturnObject.subsidiaryId = '1';
42
- this.webReturnObject.initiatingModule = 'MAGENTO';
43
- this.webReturnObject.createdAt = this.getUTCDateTime(this.getText(this.document.created_at));
44
- this.webReturnObject.updatedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
45
- this.webReturnObject.export = true;
46
- this.webReturnObject.transCompletedAt = this.getUTCDateTime(this.getText(this.document.updated_at));
47
- this.webReturnObject['externalTransactionId'] = this.getText(this.document.order_id);
48
- // customer
49
- this.webReturnObject['customer']['firstName'] = this.getText(this.document.customer_firstname) || '';
50
- this.webReturnObject['customer']['lastName'] = this.getText(this.document.customer_lastname) || '';
51
- this.webReturnObject['customer']['email'] = this.getText(this.document.customer_email) || '';
52
- this.webReturnObject['customer']['postCode'] = '';
53
- // Billing address
54
- this.webReturnObject['customer']['billingAddress']['address1'] = (this.document.billing_address && this.document.billing_address.street) ? this.getText(this.document.billing_address.street) : '';
55
- this.webReturnObject['customer']['billingAddress']['city'] = (this.document.billing_address && this.document.billing_address.city) ? this.getText(this.document.billing_address.city) : '';
56
- this.webReturnObject['customer']['billingAddress']['county'] = (this.document.billing_address && this.document.billing_address.region) ? this.getText(this.document.billing_address.region) : '';
57
- this.webReturnObject['customer']['billingAddress']['postCode'] = (this.document.billing_address && this.document.billing_address.postcode) ? this.getText(this.document.billing_address.postcode) : '';
58
- this.webReturnObject['customer']['billingAddress']['country'] = (this.document.billing_address && this.document.billing_address.country) ? this.getText(this.document.billing_address.country) : '';
59
- // Shipping address
60
- this.webReturnObject['customer']['shippingAddress']['address1'] = (this.document.shipping_address && this.document.shipping_address.street) ? this.getText(this.document.shipping_address.street) : '';
61
- this.webReturnObject['customer']['shippingAddress']['city'] = (this.document.shipping_address && this.document.shipping_address.city) ? this.getText(this.document.shipping_address.city) : '';
62
- this.webReturnObject['customer']['shippingAddress']['county'] = (this.document.shipping_address && this.document.shipping_address.region) ? this.getText(this.document.shipping_address.region) : '';
63
- this.webReturnObject['customer']['shippingAddress']['postCode'] = (this.document.shipping_address && this.document.shipping_address.postcode) ? this.getText(this.document.shipping_address.postcode) : '';
64
- this.webReturnObject['customer']['shippingAddress']['country'] = (this.document.shipping_address && this.document.shipping_address.country) ? this.getText(this.document.shipping_address.country) : '';
65
- // basketSummary
66
- this.webReturnObject.basketSummary['discountTotal'] = Math.abs(Number(this.document.discount_amount ? this.getText(this.document.discount_amount) : 0));
67
- this.webReturnObject.basketSummary['VATTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
68
- this.webReturnObject.basketSummary['saleTotal'] = Number(this.document.base_total_invoiced ? this.getText(this.document.base_total_invoiced) : 0);
69
- this.webReturnObject.basketSummary['basketTotal'] = Number(this.document.base_total_paid ? this.getText(this.document.base_total_paid) : 0);
70
- this.webReturnObject.basketSummary['totalItems'] = Number(this.document.total_qty_ordered ? this.getText(this.document.total_qty_ordered) : 0);
71
- this.webReturnObject.basketSummary['refundTotal'] = Number(this.document.base_total_refunded ? this.getText(this.document.base_total_refunded) : 0);
72
- // // basket line discount
73
- // this.webReturnObject.basket['lineDiscount'] = [];
74
- // let lineDiscount = {
75
- // itemLineId: (this.document.items && this.document.items.item && this.document.items.item.item_id) ? this.getText(this.document.items.item.item_id) : 0,
76
- // discountAmount: (this.document.items && this.document.items.item && this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0
77
- // }
78
- // this.webReturnObject.basket['lineDiscount'].push(lineDiscount);
79
- // basket transaction discount
80
- // basket products
81
- this.webReturnObject.basket['products'] = [];
82
- this.webReturnObject.basket['linePromotion'] = [];
83
- this.webReturnObject.basket['transactionDiscount'] = [];
84
- this.webReturnObject.basket['transactionPromotion'] = [];
85
- // let transactionDiscount = {
86
- // discountAmount: (this.document && this.document.discount_amount) ? Number(this.getText(this.document.discount_amount)) : 0
87
- // }
88
- // this.webReturnObject.basket['transactionDiscount'].push(transactionDiscount);
89
- let product = {};
90
- if (this.document.items && this.document.items.item) {
91
- if (this.document.items.item instanceof Array) {
92
- this.document.items.item.forEach((element, index) => {
93
- let qty = this.getText(element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0;
94
- let refundQty = this.getText(element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0;
95
- let price = this.getText(element.price_incl_tax) ? Number(this.getText(element.price_incl_tax)) : 0;
96
- product = {
97
- description: (element.name) ? this.getText(element.name) : '',
98
- SKU: (element.sku) ? this.getText(element.sku) : '',
99
- quantity: (element.qty_ordered) ? Number(this.getText(element.qty_ordered)) : 0,
100
- refundedQuantity: (element.qty_refunded) ? Number(this.getText(element.qty_refunded)) : 0,
101
- //price: (element.original_price) ? Number(this.getText(element.original_price)) : 0,
102
- price: price,
103
- itemLineId: (index + 1).toString(),
104
- // totalLinePrice: (element.row_invoiced) ? Number(this.getText(element.row_invoiced)) : 0,
105
- totalLinePrice: ((qty - refundQty) * price),
106
- };
107
- let promotionAmount = this.getText(element.discount_amount) ? Number(this.getText(element.discount_amount)) : 0;
108
- let appliedIDs = this.getText(element.applied_rule_ids) ? this.getText(element.applied_rule_ids) : '';
109
- if (product && product.price != 0) {
110
- if (promotionAmount) {
111
- let trigger = {};
112
- trigger.itemLineId = product.itemLineId;
113
- trigger.quantity = product.quantity ? product.quantity : 0;
114
- let promotion = {
115
- promotionAmount: promotionAmount,
116
- promotionId: appliedIDs,
117
- itemLineId: product.itemLineId,
118
- promotionLinePrice: product.totalLinePrice - promotionAmount,
119
- trigger: trigger
120
- };
121
- this.webReturnObject.basket['linePromotion'].push(promotion);
122
- }
123
- this.webReturnObject.basket['products'].push(product);
124
- }
125
- });
126
- }
127
- else {
128
- let qty = (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0;
129
- let refundQty = (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0;
130
- let price = (this.document.items && this.document.items.item && this.document.items.item.price_incl_tax) ? Number(this.getText(this.document.items.item.price_incl_tax)) : 0;
131
- product = {
132
- description: (this.document.items && this.document.items.item && this.document.items.item.name) ? this.getText(this.document.items.item.name) : '',
133
- SKU: (this.document.items && this.document.items.item && this.document.items.item.sku) ? this.getText(this.document.items.item.sku) : '',
134
- quantity: (this.document.items && this.document.items.item && this.document.items.item.qty_ordered) ? Number(this.getText(this.document.items.item.qty_ordered)) : 0,
135
- refundedQuantity: (this.document.items && this.document.items.item && this.document.items.item.qty_refunded) ? Number(this.getText(this.document.items.item.qty_refunded)) : 0,
136
- // price: (this.document.items && this.document.items.item && this.document.items.item.original_price) ? Number(this.getText(this.document.items.item.original_price)) : 0,
137
- price: price,
138
- itemLineId: "1",
139
- // totalLinePrice: (this.document.items && this.document.items.item && this.document.items.item.row_invoiced) ? Number(this.getText(this.document.items.item.row_invoiced)) : 0,
140
- totalLinePrice: ((qty - refundQty) * price),
141
- };
142
- let promotionAmount = this.getText(this.document.items.item.discount_amount) ? Number(this.getText(this.document.items.item.discount_amount)) : 0;
143
- let appliedIDs = this.getText(this.document.items.item.applied_rule_ids) ? this.getText(this.document.items.item.applied_rule_ids) : '';
144
- if (product && product.price != 0) {
145
- if (promotionAmount) {
146
- let trigger = {};
147
- trigger.itemLineId = product.itemLineId;
148
- trigger.quantity = product.quantity ? product.quantity : 0;
149
- let promotion = {
150
- promotionAmount: promotionAmount,
151
- promotionId: appliedIDs,
152
- itemLineId: product.itemLineId,
153
- promotionLinePrice: product.totalLinePrice - promotionAmount,
154
- trigger: trigger
155
- };
156
- this.webReturnObject.basket['linePromotion'].push(promotion);
157
- }
158
- this.webReturnObject.basket['products'].push(product);
159
- }
160
- }
161
- let couponCode = this.getText(this.document.coupon_code) ? this.getText(this.document.coupon_code) : 0;
162
- let appliedIDs = this.getText(this.document.applied_rule_ids) ? this.getText(this.document.applied_rule_ids) : '';
163
- let discountDescription = this.getText(this.document.discount_description) ? this.getText(this.document.discount_description) : '';
164
- let couponTriggerPromotions = [];
165
- if (couponCode && appliedIDs) {
166
- let transactionPromotion = {};
167
- if (this.webReturnObject.basket['linePromotion'] && this.webReturnObject.basket['linePromotion'].length > 0) {
168
- this.webReturnObject.basket['linePromotion'].forEach((promotion) => {
169
- if (promotion.promotionId === appliedIDs) {
170
- let trigger = {};
171
- trigger.itemLineId = promotion.itemLineId;
172
- trigger.quantity = promotion.trigger.quantity;
173
- trigger.totalQuantity = promotion.trigger.quantity;
174
- trigger.promotionAmount = promotion.promotionAmount;
175
- trigger.refundedReason = couponCode;
176
- trigger.refundedReasonDescription = discountDescription;
177
- trigger.promotionId = promotion.promotionId;
178
- couponTriggerPromotions.push(trigger);
179
- this.webReturnObject.basket['linePromotion'] = this.webReturnObject.basket['linePromotion'].filter((x) => x.itemLineId !== promotion.itemLineId);
180
- }
181
- });
182
- }
183
- if (couponTriggerPromotions.length > 0) {
184
- transactionPromotion.displayText = couponTriggerPromotions[0].refundedReasonDescription;
185
- transactionPromotion.name = couponTriggerPromotions[0].refundedReason;
186
- transactionPromotion.promotionAmount = -(couponTriggerPromotions.reduce((n, { promotionAmount }) => n + promotionAmount, 0));
187
- transactionPromotion.promotionId = couponTriggerPromotions[0].promotionId;
188
- transactionPromotion.promotionInfo = couponTriggerPromotions[0].refundedReasonDescription;
189
- transactionPromotion.couponCode = couponCode;
190
- transactionPromotion.itemLineIds = [];
191
- transactionPromotion.type = PROMOTION_TYPE.COUPON;
192
- transactionPromotion.subLevelType = PROMOTION_LEVEL.LINE;
193
- transactionPromotion.trigger = couponTriggerPromotions;
194
- }
195
- console.log("e-basket: update LinePromotion With Coupon", JSON.stringify(transactionPromotion));
196
- if (!this.webReturnObject.basket.transactionPromotion) {
197
- this.webReturnObject.basket.transactionPromotion = [];
198
- }
199
- if (transactionPromotion && transactionPromotion.promotionId) {
200
- this.webReturnObject.basket.transactionPromotion.push(transactionPromotion);
201
- }
202
- }
203
- this.updateTransactionPromotionPrtionCalc();
204
- }
205
- return this;
206
- }
207
- validateProductItemDiscount(product) {
208
- if (!product.itemDiscounts) {
209
- product.itemDiscounts = {
210
- trnDiscountsPortion: 0,
211
- trnPromotionsPortion: 0,
212
- refundPortion: 0,
213
- };
214
- }
215
- return product;
216
- }
217
- transactionPromotionProductPortionCalc(txDoc, promotion) {
218
- console.log(`ebasket: transactionPromotionProductPortionCalc: trnsactionPromotion: ${JSON.stringify(promotion)}`);
219
- if (promotion.type === PROMOTION_TYPE.COUPON && promotion.subLevelType === PROMOTION_LEVEL.LINE) {
220
- txDoc.basket.products.forEach((product) => {
221
- product = this.validateProductItemDiscount(product);
222
- if (promotion.trigger && promotion.trigger.length > 0) {
223
- promotion.trigger.forEach((t) => {
224
- if (t.itemLineId === product.itemLineId.toString()) {
225
- product.itemDiscounts.trnPromotionsPortion += t.promotionAmount;
226
- }
227
- });
228
- }
229
- });
230
- }
231
- else {
232
- txDoc.basket.products.forEach((product) => {
233
- product = this.validateProductItemDiscount(product);
234
- if (promotion.itemLineIds.includes(+product.itemLineId)) {
235
- let discountAmount = 0;
236
- if (this.document.items.item instanceof Array) {
237
- const productItem = this.document.items.item.find(productItem => productItem.sku === product.SKU);
238
- discountAmount = productItem.discount_amount ? +productItem.discount_amount : 0;
239
- }
240
- else {
241
- discountAmount = this.document.items.item.sku === product.SKU && this.document.items.item.discount_amount ?
242
- +this.document.items.item.discount_amount : 0;
243
- }
244
- const transactionPromotionPortion = discountAmount;
245
- product.itemDiscounts.trnPromotionsPortion += this.numberUtilService.trimTo2Decimal2(transactionPromotionPortion);
246
- }
247
- });
248
- }
249
- return txDoc;
250
- }
251
- updateTransactionPromotionPrtionCalc() {
252
- try {
253
- if (this.webReturnObject.basket.transactionPromotion && this.webReturnObject.basket.transactionPromotion.length > 0) {
254
- this.webReturnObject.basket.transactionPromotion.forEach(tr => {
255
- this.transactionPromotionProductPortionCalc(this.webReturnObject, tr);
256
- });
257
- }
258
- }
259
- catch (error) {
260
- console.log("updateTransactionPromotionPrtionCalc => failed:", JSON.stringify(error));
261
- }
262
- }
263
- deviceId(deviceId) {
264
- this.webReturnObject.deviceId = deviceId;
265
- return this;
266
- }
267
- terminalId(terminalId) {
268
- this.webReturnObject.terminalId = terminalId;
269
- return this;
270
- }
271
- orgCode(orgCode) {
272
- this.webReturnObject.orgCode = orgCode;
273
- return this;
274
- }
275
- storeId(storeId) {
276
- this.webReturnObject.storeId = storeId;
277
- return this;
278
- }
279
- storeNodeId(storeNodeId) {
280
- this.webReturnObject.storeNodeId = storeNodeId;
281
- return this;
282
- }
283
- storeNodeStructure(storeNodeStructure) {
284
- this.webReturnObject.storeNodeStructure = storeNodeStructure;
285
- return this;
286
- }
287
- docId(docId) {
288
- this.webReturnObject.id = docId;
289
- return this;
290
- }
291
- updateUserID(userID) {
292
- this.webReturnObject.userId = userID;
293
- return this;
294
- }
295
- updateUserName(name) {
296
- this.webReturnObject.userName = name;
297
- return this;
298
- }
299
- build() {
300
- return this.webReturnObject;
301
- }
302
- getText(obj) {
303
- if (obj && obj.text) {
304
- return obj.text;
305
- }
306
- else {
307
- return obj;
308
- }
309
- }
310
- getUTCDateTime(date) {
311
- if (date) {
312
- return new Date(date).toISOString();
313
- }
314
- }
315
- isInStoreOrder() {
316
- console.log("Mapper library: WebReturnMapperBuilderClass: isInStoreOrder mapping started...");
317
- if (this.document.payment && this.document.payment.method && this.document.payment.method === 'pos_order') {
318
- this.webReturnObject.isInStoreOrder = true;
319
- }
320
- console.log("Mapper library: WebReturnMapperBuilderClass: isInStoreOrder mapping ended...");
321
- return this;
322
- }
323
- }
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiV2ViUmV0dXJuLW1hcHBlci5jbGFzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL21hcHBlci1saWJyYXJ5L3NyYy9saWIvV2ViUmV0dXJuLW1hcHBlci5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQTJELGVBQWUsRUFBRSxjQUFjLEVBQWtDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEssT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFMUQsTUFBTSxPQUFPLDJCQUEyQjtJQStCcEMsWUFBWSxRQUFRLEVBQVUsWUFBMkI7UUFBM0IsaUJBQVksR0FBWixZQUFZLENBQWU7UUE1QmpELG9CQUFlLEdBQXdCO1lBQzNDLEVBQUUsRUFBRSxFQUFFO1lBQ04sT0FBTyxFQUFFLEVBQUU7WUFDWCxPQUFPLEVBQUUsRUFBRTtZQUNYLFdBQVcsRUFBRSxFQUFFO1lBQ2Ysa0JBQWtCLEVBQUUsRUFBRTtZQUN0QixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixNQUFNLEVBQUUsS0FBSztZQUNiLGNBQWMsRUFBRSxLQUFLO1lBQ3JCLE1BQU0sRUFBRSxFQUFFO1lBQ1YsYUFBYSxFQUFFLEVBQUU7WUFDakIsWUFBWSxFQUFFLEVBQUU7WUFDaEIsUUFBUSxFQUFFO2dCQUNOLFNBQVMsRUFBRSxFQUFFO2dCQUNiLFFBQVEsRUFBRSxFQUFFO2dCQUNaLEtBQUssRUFBRSxFQUFFO2dCQUNULFFBQVEsRUFBRSxFQUFFO2dCQUNaLEVBQUUsRUFBRSxFQUFFO2dCQUNOLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixlQUFlLEVBQUUsRUFBRTthQUV0QjtZQUNELHlCQUF5QixFQUFFLEVBQStCO1NBQzdELENBQUE7UUFJRyxJQUFJLFFBQVEsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7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LEVBQUUsQ0FBQztRQUN4QyxDQUFDO0lBQ0wsQ0FBQztJQUVELGNBQWM7UUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLGdGQUFnRixDQUFDLENBQUM7UUFDOUYsSUFBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLFdBQVcsRUFBQyxDQUFDO1lBQ3RHLElBQUksQ0FBQyxlQUFlLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw4RUFBOEUsQ0FBQyxDQUFDO1FBQzVGLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEN1cnJlbmN5UGlwZSB9IGZyb20gXCJAYW5ndWxhci9jb21tb25cIjtcbmltcG9ydCB7IEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMsIFRyYW5zYWN0aW9uRG9jdW1lbnQsIFRyaWdnZXIsIFBST01PVElPTl9MRVZFTCwgUFJPTU9USU9OX1RZUEUsIFRQcm9kdWN0LCBUcmFuc2FjdGlvblByb21vdGlvbiB9IGZyb20gXCIuL21hcHBlci1saWJyYXJ5Lm1vZGVsXCI7XG5pbXBvcnQgeyBOdW1iZXJVdGlsU2VydmljZSB9IGZyb20gXCIuL251bWJlci11dGlsLnNlcnZpY2VcIjtcblxuZXhwb3J0IGNsYXNzIFdlYlJldHVybk1hcHBlckJ1aWxkZXJDbGFzcyB7XG5cbiAgICBwcml2YXRlIGRvY3VtZW50OiBhbnk7XG4gICAgcHJpdmF0ZSB3ZWJSZXR1cm5PYmplY3Q6IFRyYW5zYWN0aW9uRG9jdW1lbnQgPSB7XG4gICAgICAgIGlkOiAnJyxcbiAgICAgICAgb3JnQ29kZTogXCJcIixcbiAgICAgICAgc3RvcmVJZDogXCJcIixcbiAgICAgICAgc3RvcmVOb2RlSWQ6IFwiXCIsXG4gICAgICAgIHN0b3JlTm9kZVN0cnVjdHVyZTogXCJcIixcbiAgICAgICAgZGV2aWNlSWQ6IFwiXCIsXG4gICAgICAgIHRlcm1pbmFsSWQ6IFwiXCIsXG4gICAgICAgIGluaXRpYXRpbmdNb2R1bGU6IFwiXCIsXG4gICAgICAgIGV4cG9ydDogZmFsc2UsXG4gICAgICAgIGlzSW5TdG9yZU9yZGVyOiBmYWxzZSxcbiAgICAgICAgYmFza2V0OiB7fSxcbiAgICAgICAgYmFza2V0U3VtbWFyeToge30sXG4gICAgICAgIGJhc2VDdXJyZW5jeTogXCJcIixcbiAgICAgICAgY3VzdG9tZXI6IHtcbiAgICAgICAgICAgIGZpcnN0TmFtZTogJycsXG4gICAgICAgICAgICBsYXN0TmFtZTogJycsXG4gICAgICAgICAgICBlbWFpbDogJycsXG4gICAgICAgICAgICBwb3N0Q29kZTogJycsXG4gICAgICAgICAgICBpZDogJycsXG4gICAgICAgICAgICBiaWxsaW5nQWRkcmVzczoge30sXG4gICAgICAgICAgICBzaGlwcGluZ0FkZHJlc3M6IHt9LFxuXG4gICAgICAgIH0sXG4gICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIEN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHNcbiAgICB9XG4gICAgbnVtYmVyVXRpbFNlcnZpY2U6IGFueTtcblxuICAgIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBwcml2YXRlIGN1cnJlbmN5UGlwZT86IEN1cnJlbmN5UGlwZSkge1xuICAgICAgICBpZiAoZG9jdW1lbnQpIHtcbiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm51bWJlclV0aWxTZXJ2aWNlID0gbmV3IE51bWJlclV0aWxTZXJ2aWNlKGN1cnJlbmN5UGlwZSk7XG4gICAgfVxuXG4gICAgV2ViUmV0dXJuTWFwcGVyKCkge1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsndHlwZSddID0gJ1dFQl9SRVRVUk5TJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2RhdGV0aW1lJ10gPSB0aGlzLmdldFVUQ0RhdGVUaW1lKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnVwZGF0ZWRfYXQpKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFzZUN1cnJlbmN5ID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmFzZV9jdXJyZW5jeV9jb2RlKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVJZCA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnN0b3JlX2lkKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3Vic2lkaWFyeUlkID0gJzEnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5pbml0aWF0aW5nTW9kdWxlID0gJ01BR0VOVE8nO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5jcmVhdGVkQXQgPSB0aGlzLmdldFVUQ0RhdGVUaW1lKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmNyZWF0ZWRfYXQpKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QudXBkYXRlZEF0ID0gdGhpcy5nZXRVVENEYXRlVGltZSh0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC51cGRhdGVkX2F0KSk7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmV4cG9ydCA9IHRydWU7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnRyYW5zQ29tcGxldGVkQXQgPSB0aGlzLmdldFVUQ0RhdGVUaW1lKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnVwZGF0ZWRfYXQpKTtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2V4dGVybmFsVHJhbnNhY3Rpb25JZCddID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQub3JkZXJfaWQpO1xuXG4gICAgICAgIC8vIGN1c3RvbWVyXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydmaXJzdE5hbWUnXSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmN1c3RvbWVyX2ZpcnN0bmFtZSkgfHwgJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydsYXN0TmFtZSddID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY3VzdG9tZXJfbGFzdG5hbWUpIHx8ICcnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnZW1haWwnXSA9IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmN1c3RvbWVyX2VtYWlsKSB8fCAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3Bvc3RDb2RlJ10gPSAnJztcblxuICAgICAgICAvLyBCaWxsaW5nIGFkZHJlc3NcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ2JpbGxpbmdBZGRyZXNzJ11bJ2FkZHJlc3MxJ10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3Muc3RyZWV0KSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcy5zdHJlZXQpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydjaXR5J10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY2l0eSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY2l0eSkgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ2JpbGxpbmdBZGRyZXNzJ11bJ2NvdW50eSddID0gKHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuYmlsbGluZ19hZGRyZXNzLnJlZ2lvbikgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MucmVnaW9uKSA6ICcnO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdFsnY3VzdG9tZXInXVsnYmlsbGluZ0FkZHJlc3MnXVsncG9zdENvZGUnXSA9ICh0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LmJpbGxpbmdfYWRkcmVzcy5wb3N0Y29kZSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MucG9zdGNvZGUpIDogJyc7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydiaWxsaW5nQWRkcmVzcyddWydjb3VudHJ5J10gPSAodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iaWxsaW5nX2FkZHJlc3MuY291bnRyeSkgOiAnJztcblxuICAgICAgICAvLyBTaGlwcGluZyBhZGRyZXNzXG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0WydjdXN0b21lciddWydzaGlwcGluZ0FkZHJlc3MnXVsnYWRkcmVzczEnXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnN0cmVldCkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnN0cmVldCkgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3NoaXBwaW5nQWRkcmVzcyddWydjaXR5J10gPSAodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5jaXR5KSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MuY2l0eSkgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3NoaXBwaW5nQWRkcmVzcyddWydjb3VudHknXSA9ICh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MgJiYgdGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnJlZ2lvbikgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzLnJlZ2lvbikgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3NoaXBwaW5nQWRkcmVzcyddWydwb3N0Q29kZSddID0gKHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcyAmJiB0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MucG9zdGNvZGUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5wb3N0Y29kZSkgOiAnJztcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3RbJ2N1c3RvbWVyJ11bJ3NoaXBwaW5nQWRkcmVzcyddWydjb3VudHJ5J10gPSAodGhpcy5kb2N1bWVudC5zaGlwcGluZ19hZGRyZXNzICYmIHRoaXMuZG9jdW1lbnQuc2hpcHBpbmdfYWRkcmVzcy5jb3VudHJ5KSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnNoaXBwaW5nX2FkZHJlc3MuY291bnRyeSkgOiAnJztcblxuICAgICAgICAvLyBiYXNrZXRTdW1tYXJ5IFxuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydkaXNjb3VudFRvdGFsJ10gPSBNYXRoLmFicyhOdW1iZXIodGhpcy5kb2N1bWVudC5kaXNjb3VudF9hbW91bnQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5kaXNjb3VudF9hbW91bnQpIDogMCkpO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydWQVRUb3RhbCddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9wYWlkID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9wYWlkKSA6IDApO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydzYWxlVG90YWwnXSA9IE51bWJlcih0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfaW52b2ljZWQgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5iYXNlX3RvdGFsX2ludm9pY2VkKSA6IDApO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydiYXNrZXRUb3RhbCddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9wYWlkID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9wYWlkKSA6IDApO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5Wyd0b3RhbEl0ZW1zJ10gPSBOdW1iZXIodGhpcy5kb2N1bWVudC50b3RhbF9xdHlfb3JkZXJlZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LnRvdGFsX3F0eV9vcmRlcmVkKSA6IDApO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRTdW1tYXJ5WydyZWZ1bmRUb3RhbCddID0gTnVtYmVyKHRoaXMuZG9jdW1lbnQuYmFzZV90b3RhbF9yZWZ1bmRlZCA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50LmJhc2VfdG90YWxfcmVmdW5kZWQpIDogMCk7XG5cbiAgICAgICAgLy8gLy8gYmFza2V0IGxpbmUgZGlzY291bnRcbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lRGlzY291bnQnXSA9IFtdO1xuXG4gICAgICAgIC8vIGxldCBsaW5lRGlzY291bnQgPSB7XG4gICAgICAgIC8vICAgICBpdGVtTGluZUlkOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLml0ZW1faWQpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5pdGVtX2lkKSA6IDAsXG4gICAgICAgIC8vICAgICBkaXNjb3VudEFtb3VudDogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZGlzY291bnRfYW1vdW50KSkgOiAwXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lRGlzY291bnQnXS5wdXNoKGxpbmVEaXNjb3VudCk7XG5cbiAgICAgICAgLy8gYmFza2V0IHRyYW5zYWN0aW9uIGRpc2NvdW50XG4gICAgICAgIFxuXG4gICAgICAgIC8vIGJhc2tldCBwcm9kdWN0cyBcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wydwcm9kdWN0cyddID0gW107XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsnbGluZVByb21vdGlvbiddPVtdO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ3RyYW5zYWN0aW9uRGlzY291bnQnXSA9IFtdO1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ3RyYW5zYWN0aW9uUHJvbW90aW9uJ10gPSBbXTtcblxuICAgICAgICAvLyBsZXQgdHJhbnNhY3Rpb25EaXNjb3VudCA9IHtcbiAgICAgICAgLy8gICAgIGRpc2NvdW50QW1vdW50OiAodGhpcy5kb2N1bWVudCAmJiB0aGlzLmRvY3VtZW50LmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfYW1vdW50KSkgOiAwXG4gICAgICAgIC8vIH1cbiAgICAgICAgLy8gdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0Wyd0cmFuc2FjdGlvbkRpc2NvdW50J10ucHVzaCh0cmFuc2FjdGlvbkRpc2NvdW50KTtcblxuXG4gICAgICAgIGxldCBwcm9kdWN0IDogYW55PSB7fTtcbiAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZm9yRWFjaCgoZWxlbWVudCwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF0eSA9IHRoaXMuZ2V0VGV4dChlbGVtZW50LnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfb3JkZXJlZCkpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZnVuZFF0eSA9IHRoaXMuZ2V0VGV4dChlbGVtZW50LnF0eV9yZWZ1bmRlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucXR5X3JlZnVuZGVkKSkgOiAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJpY2UgPSB0aGlzLmdldFRleHQoZWxlbWVudC5wcmljZV9pbmNsX3RheCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucHJpY2VfaW5jbF90YXgpKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHByb2R1Y3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogKGVsZW1lbnQubmFtZSkgPyB0aGlzLmdldFRleHQoZWxlbWVudC5uYW1lKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgU0tVOiAoZWxlbWVudC5za3UpID8gdGhpcy5nZXRUZXh0KGVsZW1lbnQuc2t1KSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6IChlbGVtZW50LnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQoZWxlbWVudC5xdHlfb3JkZXJlZCkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlZnVuZGVkUXVhbnRpdHk6IChlbGVtZW50LnF0eV9yZWZ1bmRlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucXR5X3JlZnVuZGVkKSkgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy9wcmljZTogKGVsZW1lbnQub3JpZ2luYWxfcHJpY2UpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50Lm9yaWdpbmFsX3ByaWNlKSkgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJpY2U6IHByaWNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtTGluZUlkOiAoaW5kZXggKyAxKS50b1N0cmluZygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG90YWxMaW5lUHJpY2U6IChlbGVtZW50LnJvd19pbnZvaWNlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KGVsZW1lbnQucm93X2ludm9pY2VkKSkgOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxMaW5lUHJpY2U6ICgocXR5IC0gcmVmdW5kUXR5KSAqIHByaWNlKSxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25BbW91bnQgPSB0aGlzLmdldFRleHQoZWxlbWVudC5kaXNjb3VudF9hbW91bnQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dChlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkpIDogMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwcGxpZWRJRHMgPSB0aGlzLmdldFRleHQoZWxlbWVudC5hcHBsaWVkX3J1bGVfaWRzKSA/IHRoaXMuZ2V0VGV4dChlbGVtZW50LmFwcGxpZWRfcnVsZV9pZHMpOicnO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0ICYmIHByb2R1Y3QucHJpY2UgIT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJvbW90aW9uQW1vdW50KVxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cmlnZ2VyID0ge30gYXMgVHJpZ2dlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIuaXRlbUxpbmVJZCA9IHByb2R1Y3QuaXRlbUxpbmVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXIucXVhbnRpdHkgPSBwcm9kdWN0LnF1YW50aXR5ID8gcHJvZHVjdC5xdWFudGl0eSA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uICA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uQW1vdW50OnByb21vdGlvbkFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uSWQ6YXBwbGllZElEcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbUxpbmVJZDpwcm9kdWN0Lml0ZW1MaW5lSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbkxpbmVQcmljZTogcHJvZHVjdC50b3RhbExpbmVQcmljZSAtIHByb21vdGlvbkFtb3VudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcjp0cmlnZ2VyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10ucHVzaChwcm9tb3Rpb24pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ3Byb2R1Y3RzJ10ucHVzaChwcm9kdWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBxdHkgPSAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9vcmRlcmVkKSkgOiAwO1xuICAgICAgICAgICAgICAgIGxldCByZWZ1bmRRdHkgPSAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9yZWZ1bmRlZCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5xdHlfcmVmdW5kZWQpKSA6IDA7XG4gICAgICAgICAgICAgICAgbGV0IHByaWNlID0gKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5wcmljZV9pbmNsX3RheCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5wcmljZV9pbmNsX3RheCkpIDogMDtcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0ge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogKHRoaXMuZG9jdW1lbnQuaXRlbXMgJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5uYW1lKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ubmFtZSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgU0tVOiAodGhpcy5kb2N1bWVudC5pdGVtcyAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gJiYgdGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnNrdSkgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnNrdSkgOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgcXVhbnRpdHk6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X29yZGVyZWQpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X29yZGVyZWQpKSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlZnVuZGVkUXVhbnRpdHk6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucXR5X3JlZnVuZGVkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnF0eV9yZWZ1bmRlZCkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gcHJpY2U6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ub3JpZ2luYWxfcHJpY2UpID8gTnVtYmVyKHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ub3JpZ2luYWxfcHJpY2UpKSA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHByaWNlOiBwcmljZSxcblxuICAgICAgICAgICAgICAgICAgICBpdGVtTGluZUlkOiBcIjFcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gdG90YWxMaW5lUHJpY2U6ICh0aGlzLmRvY3VtZW50Lml0ZW1zICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbSAmJiB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0ucm93X2ludm9pY2VkKSA/IE51bWJlcih0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLnJvd19pbnZvaWNlZCkpIDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxMaW5lUHJpY2U6ICgocXR5IC0gcmVmdW5kUXR5KSAqIHByaWNlKSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25BbW91bnQgPSB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5pdGVtcy5pdGVtLmRpc2NvdW50X2Ftb3VudCkgPyBOdW1iZXIodGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQpKSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcHBsaWVkSURzID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5hcHBsaWVkX3J1bGVfaWRzKSA/IHRoaXMuZ2V0VGV4dCh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uYXBwbGllZF9ydWxlX2lkcyk6Jyc7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb2R1Y3QgJiYgcHJvZHVjdC5wcmljZSAhPSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZihwcm9tb3Rpb25BbW91bnQpXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaWdnZXIgPSB7fSBhcyBUcmlnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5pdGVtTGluZUlkID0gcHJvZHVjdC5pdGVtTGluZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5xdWFudGl0eSA9IHByb2R1Y3QucXVhbnRpdHkgPyBwcm9kdWN0LnF1YW50aXR5IDogMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb24gID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25BbW91bnQ6cHJvbW90aW9uQW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25JZDphcHBsaWVkSURzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtTGluZUlkOnByb2R1Y3QuaXRlbUxpbmVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uTGluZVByaWNlOiBwcm9kdWN0LnRvdGFsTGluZVByaWNlIC0gcHJvbW90aW9uQW1vdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOnRyaWdnZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXS5wdXNoKHByb21vdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldFsncHJvZHVjdHMnXS5wdXNoKHByb2R1Y3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjb3Vwb25Db2RlID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY291cG9uX2NvZGUpID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuY291cG9uX2NvZGUpIDogMDtcbiAgICAgICAgICAgIGxldCBhcHBsaWVkSURzID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuYXBwbGllZF9ydWxlX2lkcykgPyB0aGlzLmdldFRleHQodGhpcy5kb2N1bWVudC5hcHBsaWVkX3J1bGVfaWRzKTonJztcbiAgICAgICAgICAgIGxldCBkaXNjb3VudERlc2NyaXB0aW9uID0gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfZGVzY3JpcHRpb24pID8gdGhpcy5nZXRUZXh0KHRoaXMuZG9jdW1lbnQuZGlzY291bnRfZGVzY3JpcHRpb24pOicnO1xuXG4gICAgICAgICAgICBsZXQgY291cG9uVHJpZ2dlclByb21vdGlvbnMgPSBbXSBhcyBUcmlnZ2VyW107XG4gICAgICAgICAgICBpZihjb3Vwb25Db2RlICYmIGFwcGxpZWRJRHMpXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uID0ge30gYXMgVHJhbnNhY3Rpb25Qcm9tb3Rpb247XG5cbiAgICAgICAgICAgICAgICBpZih0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXSAmJiB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXS5sZW5ndGggPiAwKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10uZm9yRWFjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIChwcm9tb3Rpb24pPT57XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJvbW90aW9uLnByb21vdGlvbklkID09PSBhcHBsaWVkSURzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRyaWdnZXIgPSB7fSBhcyBUcmlnZ2VyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLml0ZW1MaW5lSWQgPSBwcm9tb3Rpb24uaXRlbUxpbmVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5xdWFudGl0eSA9IHByb21vdGlvbi50cmlnZ2VyLnF1YW50aXR5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnRvdGFsUXVhbnRpdHkgPSBwcm9tb3Rpb24udHJpZ2dlci5xdWFudGl0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5wcm9tb3Rpb25BbW91bnQgPSBwcm9tb3Rpb24ucHJvbW90aW9uQW1vdW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyLnJlZnVuZGVkUmVhc29uID0gY291cG9uQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uID0gZGlzY291bnREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5wcm9tb3Rpb25JZCA9IHByb21vdGlvbi5wcm9tb3Rpb25JZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291cG9uVHJpZ2dlclByb21vdGlvbnMucHVzaCh0cmlnZ2VyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0WydsaW5lUHJvbW90aW9uJ10gPSB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXRbJ2xpbmVQcm9tb3Rpb24nXS5maWx0ZXIoKHgpPT54Lml0ZW1MaW5lSWQgIT09IHByb21vdGlvbi5pdGVtTGluZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGNvdXBvblRyaWdnZXJQcm9tb3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24uZGlzcGxheVRleHQgPSBjb3Vwb25UcmlnZ2VyUHJvbW90aW9uc1swXS5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5uYW1lID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucmVmdW5kZWRSZWFzb247XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnByb21vdGlvbkFtb3VudCA9IC0oY291cG9uVHJpZ2dlclByb21vdGlvbnMucmVkdWNlKChuLCB7IHByb21vdGlvbkFtb3VudCB9KSA9PiBuICsgcHJvbW90aW9uQW1vdW50LCAwKSk7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnByb21vdGlvbklkID0gY291cG9uVHJpZ2dlclByb21vdGlvbnNbMF0ucHJvbW90aW9uSWQ7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnByb21vdGlvbkluZm8gPSBjb3Vwb25UcmlnZ2VyUHJvbW90aW9uc1swXS5yZWZ1bmRlZFJlYXNvbkRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvblByb21vdGlvbi5jb3Vwb25Db2RlID0gY291cG9uQ29kZTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24uaXRlbUxpbmVJZHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24udHlwZSA9IFBST01PVElPTl9UWVBFLkNPVVBPTjtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24uc3ViTGV2ZWxUeXBlID0gUFJPTU9USU9OX0xFVkVMLkxJTkU7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uLnRyaWdnZXIgPSBjb3Vwb25UcmlnZ2VyUHJvbW90aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJlLWJhc2tldDogdXBkYXRlIExpbmVQcm9tb3Rpb24gV2l0aCBDb3Vwb25cIiwgSlNPTi5zdHJpbmdpZnkodHJhbnNhY3Rpb25Qcm9tb3Rpb24pKTtcbiAgICBcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMud2ViUmV0dXJuT2JqZWN0LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbiApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XG4gICAgICAgICAgICAgICAgfVxuICAgIFxuICAgICAgICAgICAgICAgIGlmICh0cmFuc2FjdGlvblByb21vdGlvbiAmJiB0cmFuc2FjdGlvblByb21vdGlvbi5wcm9tb3Rpb25JZCApIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ucHVzaCh0cmFuc2FjdGlvblByb21vdGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uUHJ0aW9uQ2FsYygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHB1YmxpYyB2YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdDogVFByb2R1Y3QpIHtcbiAgICAgICAgaWYgKCFwcm9kdWN0Lml0ZW1EaXNjb3VudHMpIHtcbiAgICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cyA9IHtcbiAgICAgICAgICAgICAgICB0cm5EaXNjb3VudHNQb3J0aW9uOiAwLFxuICAgICAgICAgICAgICAgIHRyblByb21vdGlvbnNQb3J0aW9uOiAwLFxuICAgICAgICAgICAgICAgIHJlZnVuZFBvcnRpb246IDAsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwcm9kdWN0O1xuICAgIH1cblxuICAgIHRyYW5zYWN0aW9uUHJvbW90aW9uUHJvZHVjdFBvcnRpb25DYWxjKFxuICAgICAgICB0eERvYzogVHJhbnNhY3Rpb25Eb2N1bWVudCxcbiAgICAgICAgcHJvbW90aW9uOiBUcmFuc2FjdGlvblByb21vdGlvblxuICAgICkge1xuICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgIGBlYmFza2V0OiB0cmFuc2FjdGlvblByb21vdGlvblByb2R1Y3RQb3J0aW9uQ2FsYzogdHJuc2FjdGlvblByb21vdGlvbjogJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgICAgICAgICBwcm9tb3Rpb25cbiAgICAgICAgICAgICl9YFxuICAgICAgICApO1xuICAgICAgICBpZiAocHJvbW90aW9uLnR5cGUgPT09IFBST01PVElPTl9UWVBFLkNPVVBPTiAmJiBwcm9tb3Rpb24uc3ViTGV2ZWxUeXBlID09PSBQUk9NT1RJT05fTEVWRUwuTElORSkge1xuICAgICAgICAgICAgdHhEb2MuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3QpID0+IHtcbiAgICAgICAgICAgICAgICBwcm9kdWN0ID0gdGhpcy52YWxpZGF0ZVByb2R1Y3RJdGVtRGlzY291bnQocHJvZHVjdCk7XG5cbiAgICAgICAgICAgICAgICBpZiAocHJvbW90aW9uLnRyaWdnZXIgJiYgcHJvbW90aW9uLnRyaWdnZXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb24udHJpZ2dlci5mb3JFYWNoKCh0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodC5pdGVtTGluZUlkID09PSBwcm9kdWN0Lml0ZW1MaW5lSWQudG9TdHJpbmcoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3QuaXRlbURpc2NvdW50cy50cm5Qcm9tb3Rpb25zUG9ydGlvbiArPSB0LnByb21vdGlvbkFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0eERvYy5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgocHJvZHVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHByb2R1Y3QgPSB0aGlzLnZhbGlkYXRlUHJvZHVjdEl0ZW1EaXNjb3VudChwcm9kdWN0KTtcbiAgICAgICAgICAgICAgICBpZiAocHJvbW90aW9uLml0ZW1MaW5lSWRzLmluY2x1ZGVzKCtwcm9kdWN0Lml0ZW1MaW5lSWQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaXNjb3VudEFtb3VudCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvZHVjdEl0ZW0gPSB0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZmluZChwcm9kdWN0SXRlbSA9PiBwcm9kdWN0SXRlbS5za3UgPT09IHByb2R1Y3QuU0tVKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50QW1vdW50ID0gcHJvZHVjdEl0ZW0uZGlzY291bnRfYW1vdW50ID8gK3Byb2R1Y3RJdGVtLmRpc2NvdW50X2Ftb3VudCA6IDA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudEFtb3VudCA9IHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5za3UgPT09IHByb2R1Y3QuU0tVICYmIHRoaXMuZG9jdW1lbnQuaXRlbXMuaXRlbS5kaXNjb3VudF9hbW91bnQgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICt0aGlzLmRvY3VtZW50Lml0ZW1zLml0ZW0uZGlzY291bnRfYW1vdW50IDogMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2FjdGlvblByb21vdGlvblBvcnRpb24gPSBkaXNjb3VudEFtb3VudDtcbiAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5pdGVtRGlzY291bnRzLnRyblByb21vdGlvbnNQb3J0aW9uICs9IHRoaXMubnVtYmVyVXRpbFNlcnZpY2UudHJpbVRvMkRlY2ltYWwyKHRyYW5zYWN0aW9uUHJvbW90aW9uUG9ydGlvbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR4RG9jO1xuICAgIH1cblxuICAgIHVwZGF0ZVRyYW5zYWN0aW9uUHJvbW90aW9uUHJ0aW9uQ2FsYygpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmICh0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24gJiYgdGhpcy53ZWJSZXR1cm5PYmplY3QuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCh0ciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Qcm9tb3Rpb25Qcm9kdWN0UG9ydGlvbkNhbGModGhpcy53ZWJSZXR1cm5PYmplY3QsIHRyKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwidXBkYXRlVHJhbnNhY3Rpb25Qcm9tb3Rpb25QcnRpb25DYWxjID0+IGZhaWxlZDpcIiwgSlNPTi5zdHJpbmdpZnkoZXJyb3IpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRldmljZUlkKGRldmljZUlkKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LmRldmljZUlkID0gZGV2aWNlSWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRlcm1pbmFsSWQodGVybWluYWxJZCkge1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC50ZXJtaW5hbElkID0gdGVybWluYWxJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgb3JnQ29kZShvcmdDb2RlKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0Lm9yZ0NvZGUgPSBvcmdDb2RlO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBzdG9yZUlkKHN0b3JlSWQpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVJZCA9IHN0b3JlSWQ7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHN0b3JlTm9kZUlkKHN0b3JlTm9kZUlkOiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3Quc3RvcmVOb2RlSWQgPSBzdG9yZU5vZGVJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc3RvcmVOb2RlU3RydWN0dXJlKHN0b3JlTm9kZVN0cnVjdHVyZTogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnN0b3JlTm9kZVN0cnVjdHVyZSA9IHN0b3JlTm9kZVN0cnVjdHVyZTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZG9jSWQoZG9jSWQpIHtcbiAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuaWQgPSBkb2NJZDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlcklEKHVzZXJJRDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMud2ViUmV0dXJuT2JqZWN0LnVzZXJJZCA9IHVzZXJJRDtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgdXBkYXRlVXNlck5hbWUobmFtZSkge1xuICAgICAgICB0aGlzLndlYlJldHVybk9iamVjdC51c2VyTmFtZSA9IG5hbWU7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGJ1aWxkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWJSZXR1cm5PYmplY3Q7XG4gICAgfVxuXG4gICAgZ2V0VGV4dChvYmopIHtcbiAgICAgICAgaWYgKG9iaiAmJiBvYmoudGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIG9iai50ZXh0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9iajtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldFVUQ0RhdGVUaW1lKGRhdGUpIHtcbiAgICAgICAgaWYgKGRhdGUpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShkYXRlKS50b0lTT1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaXNJblN0b3JlT3JkZXIoKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWFwcGVyIGxpYnJhcnk6IFdlYlJldHVybk1hcHBlckJ1aWxkZXJDbGFzczogaXNJblN0b3JlT3JkZXIgbWFwcGluZyBzdGFydGVkLi4uXCIpOyBcbiAgICAgICAgaWYodGhpcy5kb2N1bWVudC5wYXltZW50ICYmIHRoaXMuZG9jdW1lbnQucGF5bWVudC5tZXRob2QgJiYgdGhpcy5kb2N1bWVudC5wYXltZW50Lm1ldGhvZCA9PT0gJ3Bvc19vcmRlcicpe1xuICAgICAgICAgICAgdGhpcy53ZWJSZXR1cm5PYmplY3QuaXNJblN0b3JlT3JkZXIgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKFwiTWFwcGVyIGxpYnJhcnk6IFdlYlJldHVybk1hcHBlckJ1aWxkZXJDbGFzczogaXNJblN0b3JlT3JkZXIgbWFwcGluZyBlbmRlZC4uLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIl19