@pmcretail/mapper-library 0.0.38 → 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.
- package/esm2022/lib/RJ-mapper.class.mjs +875 -0
- package/esm2022/lib/TransactionDocumentBuilder.mjs +1240 -0
- package/esm2022/lib/WebReturn-mapper.class.mjs +324 -0
- package/esm2022/lib/WebReturnSalesforceMapper.class.mjs +410 -0
- package/esm2022/lib/basket.service.mjs +516 -0
- package/esm2022/lib/mapper-library.component.mjs +22 -0
- package/esm2022/lib/mapper-library.model.mjs +39 -0
- package/esm2022/lib/mapper-library.module.mjs +21 -0
- package/esm2022/lib/number-util.service.mjs +40 -0
- package/esm2022/pmcretail-mapper-library.mjs +5 -0
- package/esm2022/public-api.mjs +9 -0
- package/fesm2022/pmcretail-mapper-library.mjs +3482 -0
- package/fesm2022/pmcretail-mapper-library.mjs.map +1 -0
- package/index.d.ts +6 -0
- package/lib/RJ-mapper.class.d.ts +80 -79
- package/lib/RJ-mapper.class.d.ts.map +1 -0
- package/lib/TransactionDocumentBuilder.d.ts +271 -270
- package/lib/TransactionDocumentBuilder.d.ts.map +1 -0
- package/lib/WebReturn-mapper.class.d.ts +27 -20
- package/lib/WebReturn-mapper.class.d.ts.map +1 -0
- package/lib/WebReturnSalesforceMapper.class.d.ts +35 -34
- package/lib/WebReturnSalesforceMapper.class.d.ts.map +1 -0
- package/lib/basket.service.d.ts +105 -103
- package/lib/basket.service.d.ts.map +1 -0
- package/lib/mapper-library.component.d.ts +9 -5
- package/lib/mapper-library.component.d.ts.map +1 -0
- package/lib/mapper-library.model.d.ts +694 -693
- package/lib/mapper-library.model.d.ts.map +1 -0
- package/lib/mapper-library.module.d.ts +8 -2
- package/lib/mapper-library.module.d.ts.map +1 -0
- package/lib/number-util.service.d.ts +13 -9
- package/lib/number-util.service.d.ts.map +1 -0
- package/package.json +20 -16
- package/pmcretail-mapper-library.d.ts.map +1 -0
- package/public-api.d.ts +6 -5
- package/public-api.d.ts.map +1 -0
- package/bundles/pmcretail-mapper-library.umd.js +0 -8323
- package/bundles/pmcretail-mapper-library.umd.js.map +0 -1
- package/bundles/pmcretail-mapper-library.umd.min.js +0 -16
- package/bundles/pmcretail-mapper-library.umd.min.js.map +0 -1
- package/esm2015/lib/RJ-mapper.class.js +0 -1464
- package/esm2015/lib/TransactionDocumentBuilder.js +0 -1535
- package/esm2015/lib/WebReturn-mapper.class.js +0 -296
- package/esm2015/lib/WebReturnSalesforceMapper.class.js +0 -683
- package/esm2015/lib/basket.service.js +0 -851
- package/esm2015/lib/mapper-library.component.js +0 -27
- package/esm2015/lib/mapper-library.model.js +0 -1442
- package/esm2015/lib/mapper-library.module.js +0 -21
- package/esm2015/lib/number-util.service.js +0 -78
- package/esm2015/pmcretail-mapper-library.js +0 -10
- package/esm2015/public-api.js +0 -14
- package/esm5/lib/RJ-mapper.class.js +0 -1762
- package/esm5/lib/TransactionDocumentBuilder.js +0 -2469
- package/esm5/lib/WebReturn-mapper.class.js +0 -371
- package/esm5/lib/WebReturnSalesforceMapper.class.js +0 -857
- package/esm5/lib/basket.service.js +0 -1076
- package/esm5/lib/mapper-library.component.js +0 -29
- package/esm5/lib/mapper-library.model.js +0 -1442
- package/esm5/lib/mapper-library.module.js +0 -25
- package/esm5/lib/number-util.service.js +0 -95
- package/esm5/pmcretail-mapper-library.js +0 -10
- package/esm5/public-api.js +0 -14
- package/fesm2015/pmcretail-mapper-library.js +0 -6391
- package/fesm2015/pmcretail-mapper-library.js.map +0 -1
- package/fesm5/pmcretail-mapper-library.js +0 -8107
- package/fesm5/pmcretail-mapper-library.js.map +0 -1
- package/pmcretail-mapper-library.d.ts +0 -5
- package/pmcretail-mapper-library.metadata.json +0 -1
|
@@ -0,0 +1,875 @@
|
|
|
1
|
+
import { DISCOUNTTYPE, TRANSACTION_TYPE } from "./mapper-library.model";
|
|
2
|
+
import { TransactionDocumentBuilder } from "./TransactionDocumentBuilder";
|
|
3
|
+
export class RJMapperBuilderClass {
|
|
4
|
+
constructor(transactionDoc) {
|
|
5
|
+
this.itemCount = 0;
|
|
6
|
+
this.largestNumber = 0;
|
|
7
|
+
this.rjObject = {};
|
|
8
|
+
if (transactionDoc) {
|
|
9
|
+
this.transactionDocument = transactionDoc;
|
|
10
|
+
}
|
|
11
|
+
else {
|
|
12
|
+
this.transactionDocument = {
|
|
13
|
+
transactionId: "",
|
|
14
|
+
offlineTransactionId: "",
|
|
15
|
+
transactionRef: "",
|
|
16
|
+
dateTime: "",
|
|
17
|
+
orgCode: "",
|
|
18
|
+
storeId: "",
|
|
19
|
+
storeNodeId: "",
|
|
20
|
+
storeNodeStructure: "",
|
|
21
|
+
deviceId: "",
|
|
22
|
+
terminalId: "",
|
|
23
|
+
userId: "",
|
|
24
|
+
initiatingModule: "eBasket",
|
|
25
|
+
export: false,
|
|
26
|
+
basket: {},
|
|
27
|
+
basketSummary: {},
|
|
28
|
+
baseCurrency: "",
|
|
29
|
+
type: "",
|
|
30
|
+
operationStatus: "",
|
|
31
|
+
createdAt: "",
|
|
32
|
+
updatedAt: "",
|
|
33
|
+
id: "",
|
|
34
|
+
currentTransactionDetails: {},
|
|
35
|
+
saleTotal: 0,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
this.initilizeItemCount();
|
|
39
|
+
this.setLineNumberForProducts();
|
|
40
|
+
this.createdAt = this.getDate(this.transactionDocument.createdAt);
|
|
41
|
+
this.updatedAt = this.getDate(this.transactionDocument.updatedAt);
|
|
42
|
+
}
|
|
43
|
+
getPosbasketInfo() {
|
|
44
|
+
this.rjObject['Keyword'] = this.generateKeyword();
|
|
45
|
+
this.rjObject['ID'] = this.generateId(this.createdAt);
|
|
46
|
+
this.rjObject['XMLSchemaVersion'] = '2';
|
|
47
|
+
this.rjObject['LastUpdated'] = this.updatedAt;
|
|
48
|
+
this.rjObject['MajorVersion'] = this.majorVersion;
|
|
49
|
+
this.rjObject['MinorVersion'] = this.minorVersion;
|
|
50
|
+
this.rjObject['ManifestVersion'] = this.manifestVersion;
|
|
51
|
+
this.rjObject['DatabaseSchemaVersion'] = this.databaseSchemaVersion;
|
|
52
|
+
this.rjObject['BasketType'] = this.basketType;
|
|
53
|
+
this.rjObject['State'] = this.getState();
|
|
54
|
+
this.rjObject['ExternalState'] = this.externalState;
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
getheaderInfo() {
|
|
58
|
+
this.rjObject['Header'] = {};
|
|
59
|
+
this.rjObject['Header'].TimeZoneOffset = this.convertToString(this.generateTimezoneoffset(this.transactionDocument.createdAt));
|
|
60
|
+
this.rjObject['Header'].DateTimeCreated = this.createdAt;
|
|
61
|
+
this.rjObject['Header'].OriginatedBy = {};
|
|
62
|
+
this.rjObject['Header'].OriginatedBy.DeviceID = this.deviceId;
|
|
63
|
+
this.rjObject['Header'].OriginatedBy.CashierID = this.cashierId;
|
|
64
|
+
this.rjObject['Header'].OriginatedBy.CompanyID = this.companyId;
|
|
65
|
+
this.rjObject['Header'].OriginatedBy.StoreID = this.transactionDocument.storeId;
|
|
66
|
+
this.rjObject['Header'].OriginatedBy.BranchID = this.branchId;
|
|
67
|
+
this.rjObject['Header'].OriginatedBy.TerminalNumber = this.terminalNumber;
|
|
68
|
+
this.rjObject['Header'].OriginatedBy.TransactionNumber = this.transactionNumber;
|
|
69
|
+
this.rjObject['Header'].TaxMethodID = this.taxMethodId;
|
|
70
|
+
this.rjObject['Header'].DynamicStockLookup = this.generateDynamicStockLookUp();
|
|
71
|
+
this.rjObject['Header'].BasketLanguageID = this.basketLanguageId; //todo
|
|
72
|
+
this.rjObject['Header'].BasketCountryID = this.basketCountryId; //todo
|
|
73
|
+
this.rjObject['Header'].BasketCurrencyID = this.transactionDocument.baseCurrency;
|
|
74
|
+
this.rjObject['Header'].TradingRegionID = this.tradingRegionId;
|
|
75
|
+
this.rjObject['Header'].Eurozone = " "; //unknown
|
|
76
|
+
this.rjObject['Header'].EuroBaseExchangeRate = ""; //unknown
|
|
77
|
+
this.rjObject['Header'].PrintableName = this.transactionDocument.userName; //unknown
|
|
78
|
+
return this;
|
|
79
|
+
}
|
|
80
|
+
rjMapper() {
|
|
81
|
+
var transactionDiscount = [];
|
|
82
|
+
if (this.transactionDocument.basket.transactionDiscount && this.transactionDocument.basket.transactionDiscount.length > 0) {
|
|
83
|
+
transactionDiscount = this.transactionDocument.basket.transactionDiscount;
|
|
84
|
+
}
|
|
85
|
+
if (this.transactionDocument.type === TRANSACTION_TYPE.SALE) {
|
|
86
|
+
this.rjObject['ProductSale'] = [];
|
|
87
|
+
this.rjObject['ModifierItem'] = [];
|
|
88
|
+
this.transactionDocument.basket.products.forEach((element) => {
|
|
89
|
+
let lineDiscount = [];
|
|
90
|
+
if (this.transactionDocument.basket.lineDiscount && this.transactionDocument.basket.lineDiscount.length > 0) {
|
|
91
|
+
lineDiscount = this.transactionDocument.basket.lineDiscount.filter((x) => x.itemLineId === element.itemLineId);
|
|
92
|
+
if (lineDiscount.length > 0) {
|
|
93
|
+
const index = this.transactionDocument.basket.lineDiscount.indexOf(lineDiscount[0]);
|
|
94
|
+
if (index > -1) {
|
|
95
|
+
this.transactionDocument.basket.lineDiscount.splice(index, 1);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
let data = this.addProduct(element, (lineDiscount.length > 0 ? lineDiscount[0] : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
100
|
+
this.rjObject['ProductSale'].push(data);
|
|
101
|
+
this.getModifierItem(lineDiscount.length > 0 ? lineDiscount[0] : null, element.itemLineId);
|
|
102
|
+
});
|
|
103
|
+
let transactionPromotion = [];
|
|
104
|
+
if (this.transactionDocument.basket.transactionPromotion && this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
105
|
+
transactionPromotion = this.transactionDocument.basket.transactionPromotion;
|
|
106
|
+
this.getTransactionPromotion(transactionPromotion);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
else if (this.transactionDocument.type === TRANSACTION_TYPE.REFUND) {
|
|
110
|
+
this.rjObject['ProductReturn'] = [];
|
|
111
|
+
this.rjObject['ModifierItem'] = [];
|
|
112
|
+
this.transactionDocument.basket.products.forEach((element) => {
|
|
113
|
+
let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
114
|
+
this.rjObject['ProductReturn'].push(data);
|
|
115
|
+
this.getModifierItem(element.lineDiscount, element.itemLineId);
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_REFUND) {
|
|
119
|
+
this.rjObject['ProductReturn'] = [];
|
|
120
|
+
this.rjObject['ModifierItem'] = [];
|
|
121
|
+
let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
|
|
122
|
+
transactionDoc.basket.products.forEach((element) => {
|
|
123
|
+
let data = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
124
|
+
let obj = {
|
|
125
|
+
"OriginalReceiptSupplied": 0,
|
|
126
|
+
"OriginalBranchID": 0,
|
|
127
|
+
"OriginalTerminalNumber": 0,
|
|
128
|
+
"OriginalTransactionNumber": 0,
|
|
129
|
+
"OriginalCashierNumber": 0
|
|
130
|
+
};
|
|
131
|
+
data['Return'] = { ...data['Return'], ...obj };
|
|
132
|
+
this.rjObject['ProductReturn'].push(data);
|
|
133
|
+
this.getModifierItem(element.lineDiscount, element.itemLineId);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else if (this.transactionDocument.type === TRANSACTION_TYPE.SALE_EXCHANGE) {
|
|
137
|
+
this.rjObject['ProductReturn'] = [];
|
|
138
|
+
this.rjObject['ProductSale'] = [];
|
|
139
|
+
this.rjObject['ModifierItem'] = [];
|
|
140
|
+
let transactionDoc = new TransactionDocumentBuilder().basket(this.transactionDocument.currentTransactionDetails).build();
|
|
141
|
+
transactionDoc.basket.products.forEach((element) => {
|
|
142
|
+
if (element.refundedQuantity > 0) {
|
|
143
|
+
let returnProduct = this.returnProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
144
|
+
let obj = {
|
|
145
|
+
"OriginalReceiptSupplied": 0,
|
|
146
|
+
"OriginalBranchID": 0,
|
|
147
|
+
"OriginalTerminalNumber": 0,
|
|
148
|
+
"OriginalTransactionNumber": 0,
|
|
149
|
+
"OriginalCashierNumber": 0
|
|
150
|
+
};
|
|
151
|
+
returnProduct['Return'] = { ...returnProduct['Return'], ...obj };
|
|
152
|
+
this.rjObject['ProductReturn'].push(returnProduct);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
let addProduct = this.addProduct(element, (element.hasOwnProperty('lineDiscount') ? element.lineDiscount : null), (transactionDiscount.length > 0 ? transactionDiscount : null));
|
|
156
|
+
this.rjObject['ProductSale'].push(addProduct);
|
|
157
|
+
}
|
|
158
|
+
this.getModifierItem(element.lineDiscount, element.itemLineId);
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
getBasketDiscount() {
|
|
164
|
+
if (!this.transactionDocument.basket.transactionDiscount)
|
|
165
|
+
return this;
|
|
166
|
+
this.rjObject['BasketDiscount'] = [];
|
|
167
|
+
this.transactionDocument.basket.transactionDiscount.forEach((element) => {
|
|
168
|
+
let obj = {};
|
|
169
|
+
obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
170
|
+
obj['DeviceID'] = this.deviceId;
|
|
171
|
+
obj['DateTimeCreated'] = this.updatedAt;
|
|
172
|
+
obj['NetValue'] = this.convertToString(element.discountAmount * -1);
|
|
173
|
+
obj['EffectiveNetValue'] = this.convertToString(element.discountAmount * -1);
|
|
174
|
+
obj['Description'] = element.reasonDisplayText;
|
|
175
|
+
obj['UserID'] = this.transactionDocument.userName;
|
|
176
|
+
obj['ReasonCodeID'] = element.reasonCode;
|
|
177
|
+
obj['DiscountType'] = this.convertToString(element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase() ? 0 : 1);
|
|
178
|
+
obj['RoundingRule'] = this.convertToString(2);
|
|
179
|
+
obj['ModifiedLineNumber'] = element.itemLineIds;
|
|
180
|
+
obj['LineNumber'] = this.convertToString(this.generateLineNumber());
|
|
181
|
+
obj['DiscountedValue'] = this.transactionDocument.basketSummary.basketTotal + this.transactionDocument.basketSummary.discountTotal;
|
|
182
|
+
if (element.discountType.toUpperCase() == DISCOUNTTYPE.PERCENT.toUpperCase()) {
|
|
183
|
+
obj['DiscountPercentage'] = this.convertToString((element.discountAmount / this.transactionDocument.basketSummary.basketTotal).toFixed(1));
|
|
184
|
+
}
|
|
185
|
+
if (this.transactionDocument.type === 'REFUND') {
|
|
186
|
+
obj['NetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
|
|
187
|
+
obj['EffectiveNetValue'] = this.convertToString(element.discountAmount < 0 ? -element.discountAmount : element.discountAmount);
|
|
188
|
+
}
|
|
189
|
+
this.rjObject['BasketDiscount'].push(obj);
|
|
190
|
+
});
|
|
191
|
+
return this;
|
|
192
|
+
}
|
|
193
|
+
getModifierItem(data, lineNo) {
|
|
194
|
+
if (data && lineNo) {
|
|
195
|
+
let obj = {};
|
|
196
|
+
obj.XMLSchemaVersion = 1;
|
|
197
|
+
obj.LineNumber = this.generateLineNumber();
|
|
198
|
+
obj.NetValue = 0;
|
|
199
|
+
obj.EffectiveNetValue = 0;
|
|
200
|
+
obj.Description = data.percentageDiscountReasonName ? data.percentageDiscountReasonName : data.priceOverrideReasonName;
|
|
201
|
+
obj.DeviceID = this.deviceId;
|
|
202
|
+
obj.UserID = this.transactionDocument.userName;
|
|
203
|
+
obj.DateTimeCreated = this.updatedAt;
|
|
204
|
+
obj.AuthorisingUserID = this.transactionDocument.userName;
|
|
205
|
+
obj.ReasonCodeID = data.percentageDiscountReasonCode ? data.percentageDiscountReasonCode : data.priceOverrideReasonCode;
|
|
206
|
+
obj.ModifiedLineNumber = lineNo;
|
|
207
|
+
obj.ModifiedIndex = 1;
|
|
208
|
+
this.rjObject['ModifierItem'].push(obj);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
getTrailerInfo() {
|
|
212
|
+
this.rjObject['Trailer'] = {};
|
|
213
|
+
this.rjObject.Trailer.DateTimeCompleted = this.updatedAt;
|
|
214
|
+
this.rjObject.Trailer.CompletedBy = {};
|
|
215
|
+
this.rjObject.Trailer.CompletedBy.DeviceID = this.deviceId;
|
|
216
|
+
this.rjObject.Trailer.CompletedBy.CashierID = this.cashierId;
|
|
217
|
+
this.rjObject.Trailer.CompletedBy.StoreID = this.transactionDocument.storeId;
|
|
218
|
+
this.rjObject.Trailer.CompletedBy.BranchID = this.branchId;
|
|
219
|
+
this.rjObject.Trailer.CompletedBy.TerminalNumber = this.terminalNumber;
|
|
220
|
+
this.rjObject.Trailer.CompletedBy.TransactionNumber = this.transactionNumber;
|
|
221
|
+
this.rjObject.Trailer.Total = this.convertToString(this.transactionDocument.basketSummary.basketTotal * 100);
|
|
222
|
+
this.rjObject.Trailer.ItemCount = this.itemCount; //gives total count for product
|
|
223
|
+
this.rjObject.Trailer.ItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
|
|
224
|
+
this.rjObject.Trailer.NetItemQuantity = this.convertToString(this.transactionDocument.basketSummary.totalItems);
|
|
225
|
+
this.rjObject.Trailer.TaxTotal = this.convertToString(this.removeDecimal(this.transactionDocument.basketSummary.VATTotal));
|
|
226
|
+
this.rjObject.Trailer.SequenceDeviceID = this.deviceId;
|
|
227
|
+
this.rjObject.Trailer.SequenceNumber = 'snsn'; //static for now
|
|
228
|
+
this.rjObject['Trailer']['TaxItem'] = [];
|
|
229
|
+
this.transactionDocument.basket.taxBreakdown.taxLines.forEach((element) => {
|
|
230
|
+
let obj = {};
|
|
231
|
+
obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
232
|
+
obj['TaxRate'] = this.convertToString(element.VATCode);
|
|
233
|
+
obj['TaxableTotal'] = this.convertToString(this.removeDecimal(element.taxableAmount));
|
|
234
|
+
obj['TaxTotal'] = this.convertToString(this.removeDecimal(this.removeDecimal(element.taxLineTotal)));
|
|
235
|
+
obj['TaxDescription'] = this.convertToString(element.VATCode);
|
|
236
|
+
obj['TaxIncluded'] = '1';
|
|
237
|
+
obj['TaxPercentage'] = this.addDecimal(element.VAT.toFixed(2)).toFixed(2);
|
|
238
|
+
this.rjObject['Trailer']['TaxItem'].push(obj);
|
|
239
|
+
});
|
|
240
|
+
if (this.transactionDocument.basket.linePromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
|
|
241
|
+
this.rjObject['Trailer']['PromotionItem'] = [];
|
|
242
|
+
if (this.transactionDocument.basket.linePromotion.length > 0) {
|
|
243
|
+
this.transactionDocument.basket.linePromotion.forEach((element) => {
|
|
244
|
+
let obj = {};
|
|
245
|
+
obj['PromotionID'] = element.promotionId;
|
|
246
|
+
obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
247
|
+
obj['PromotionQuantity'] = "1";
|
|
248
|
+
obj['PromotionDescription'] = element.displayText;
|
|
249
|
+
obj['PromotionHit'] = {};
|
|
250
|
+
obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
251
|
+
obj['PromotionHit']['HitNumber'] = "1";
|
|
252
|
+
obj['PromotionHit']['HitQuantity'] = "1";
|
|
253
|
+
obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
254
|
+
obj['PromotionHit']['PromotionTrigger'] = {};
|
|
255
|
+
let product = this.transactionDocument.basket.products.find((item) => item.itemLineId == element.itemLineId);
|
|
256
|
+
obj['PromotionHit']['PromotionTrigger']['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
257
|
+
obj['PromotionHit']['PromotionTrigger']['ProductID'] = product.SKU;
|
|
258
|
+
obj['PromotionHit']['PromotionTrigger']['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
|
|
259
|
+
obj['PromotionHit']['PromotionTrigger']['LineNumber'] = this.getNumber(product.SKU);
|
|
260
|
+
obj['PromotionHit']['PromotionTrigger']['Quantity'] = this.convertToString(product.quantity.toFixed(1));
|
|
261
|
+
obj['PromotionHit']['PromotionTrigger']['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == element.itemLineId).VATCode;
|
|
262
|
+
this.rjObject['Trailer']['PromotionItem'].push(obj);
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
if (this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
266
|
+
this.transactionDocument.basket.transactionPromotion.forEach((element) => {
|
|
267
|
+
let obj = {};
|
|
268
|
+
obj['PromotionID'] = element.promotionId;
|
|
269
|
+
obj['PromotionSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
270
|
+
obj['PromotionQuantity'] = "1";
|
|
271
|
+
obj['PromotionDescription'] = element.displayText;
|
|
272
|
+
obj['PromotionHit'] = {};
|
|
273
|
+
obj['PromotionHit']['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
274
|
+
obj['PromotionHit']['HitNumber'] = "1";
|
|
275
|
+
obj['PromotionHit']['HitQuantity'] = "1";
|
|
276
|
+
obj['PromotionHit']['HitSaving'] = element.promotionAmount < 0 ? element.promotionAmount : -element.promotionAmount;
|
|
277
|
+
obj['PromotionHit']['PromotionTrigger'] = [];
|
|
278
|
+
this.transactionDocument.basket.products.forEach((product) => {
|
|
279
|
+
let promotionTrigger = {};
|
|
280
|
+
element.itemLineIds.forEach((itemLineId) => {
|
|
281
|
+
if (JSON.stringify(itemLineId) === product.itemLineId) {
|
|
282
|
+
promotionTrigger['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
283
|
+
promotionTrigger['ProductID'] = product.SKU;
|
|
284
|
+
promotionTrigger['UnitValue'] = this.convertToString(element.promotionLinePrice / product.quantity);
|
|
285
|
+
promotionTrigger['LineNumber'] = this.getNumber(product.SKU);
|
|
286
|
+
promotionTrigger['Quantity'] = this.convertToString(product.quantity);
|
|
287
|
+
promotionTrigger['TaxCode'] = this.transactionDocument.basket.taxBreakdown.taxLines.find((item) => item.itemLineId == product.itemLineId).VATCode;
|
|
288
|
+
obj['PromotionHit']['PromotionTrigger'].push(promotionTrigger);
|
|
289
|
+
}
|
|
290
|
+
});
|
|
291
|
+
});
|
|
292
|
+
this.rjObject['Trailer']['PromotionItem'].push(obj);
|
|
293
|
+
});
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return this;
|
|
297
|
+
}
|
|
298
|
+
getTenderInfo() {
|
|
299
|
+
if (this.transactionDocument.paymentDetails && this.transactionDocument.paymentDetails.length > 0) {
|
|
300
|
+
this.transactionDocument.paymentDetails.forEach((element) => {
|
|
301
|
+
if (element.externalTenderKey) {
|
|
302
|
+
this.rjObject[element.externalTenderKey] = [];
|
|
303
|
+
if (element.paymentType.toUpperCase() === 'GIFT CARD') {
|
|
304
|
+
let obj = {
|
|
305
|
+
XMLSchemaVersion: this.xmlSchemaVersion,
|
|
306
|
+
LineNumber: this.generateLineNumber(),
|
|
307
|
+
NetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
308
|
+
EffectiveNetValue: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
309
|
+
Description: this.getDescription(element),
|
|
310
|
+
DeviceID: this.deviceId,
|
|
311
|
+
UserID: this.transactionDocument.userName,
|
|
312
|
+
DateTimeCreated: this.updatedAt,
|
|
313
|
+
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
314
|
+
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
315
|
+
TenderAmount: this.convertToString(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
316
|
+
CurrencyID: this.transactionDocument.baseCurrency,
|
|
317
|
+
CurrencyDescription: this.transactionDocument.baseCurrency,
|
|
318
|
+
GiftVoucherSalesAllowed: '', //todo
|
|
319
|
+
AllowRechargeableVoucherSales: '', //todo
|
|
320
|
+
GiftVoucherID: ''
|
|
321
|
+
};
|
|
322
|
+
this.rjObject[element.externalTenderKey].push(obj);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
let obj1 = {
|
|
326
|
+
XMLSchemaVersion: "1",
|
|
327
|
+
LineNumber: this.generateLineNumber(), //todo
|
|
328
|
+
NetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
|
|
329
|
+
EffectiveNetValue: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
|
|
330
|
+
Description: this.getDescription(element),
|
|
331
|
+
DeviceID: this.deviceId,
|
|
332
|
+
UserID: this.transactionDocument.userName,
|
|
333
|
+
DateTimeCreated: this.updatedAt,
|
|
334
|
+
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
335
|
+
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
336
|
+
TenderAmount: this.convertToString(-1 * this.removeDecimal(Math.round(element.amount))),
|
|
337
|
+
CurrencyID: this.transactionDocument.baseCurrency,
|
|
338
|
+
CurrencyDescription: this.transactionDocument.baseCurrency,
|
|
339
|
+
IncludeInTransactionTotalCheck: "1",
|
|
340
|
+
AllowRechargeableVoucherSales: "1",
|
|
341
|
+
OpenDrawerAtEnd: "1"
|
|
342
|
+
};
|
|
343
|
+
this.rjObject[element.externalTenderKey].push(obj1);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
this.rjObject['CashTender'] = [];
|
|
348
|
+
if (element.paymentType.toUpperCase() === 'GIFT CARD') {
|
|
349
|
+
let obj = {
|
|
350
|
+
XMLSchemaVersion: this.xmlSchemaVersion,
|
|
351
|
+
LineNumber: this.generateLineNumber(),
|
|
352
|
+
NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
353
|
+
EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
354
|
+
Description: this.getDescription(element),
|
|
355
|
+
DeviceID: this.deviceId,
|
|
356
|
+
UserID: this.transactionDocument.userName,
|
|
357
|
+
DateTimeCreated: this.updatedAt,
|
|
358
|
+
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
359
|
+
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
360
|
+
TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
361
|
+
CurrencyID: this.transactionDocument.baseCurrency,
|
|
362
|
+
CurrencyDescription: this.transactionDocument.baseCurrency,
|
|
363
|
+
GiftVoucherSalesAllowed: '', //todo
|
|
364
|
+
AllowRechargeableVoucherSales: '', //todo
|
|
365
|
+
GiftVoucherID: ''
|
|
366
|
+
};
|
|
367
|
+
this.rjObject['CashTender'].push(obj);
|
|
368
|
+
}
|
|
369
|
+
else {
|
|
370
|
+
let obj1 = {
|
|
371
|
+
XMLSchemaVersion: "1",
|
|
372
|
+
LineNumber: this.generateLineNumber(),
|
|
373
|
+
NetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
374
|
+
EffectiveNetValue: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
375
|
+
Description: this.getDescription(element),
|
|
376
|
+
DeviceID: this.deviceId,
|
|
377
|
+
UserID: this.transactionDocument.userName,
|
|
378
|
+
DateTimeCreated: this.updatedAt,
|
|
379
|
+
TenderType: element.externalTenderType ? element.externalTenderType : '',
|
|
380
|
+
TenderSubType: element.externalSubTenderType ? element.externalSubTenderType : '',
|
|
381
|
+
TenderAmount: JSON.stringify(-1 * this.removeDecimal((Math.round(element.amount)))),
|
|
382
|
+
CurrencyID: this.transactionDocument.baseCurrency,
|
|
383
|
+
CurrencyDescription: this.transactionDocument.baseCurrency,
|
|
384
|
+
IncludeInTransactionTotalCheck: "1",
|
|
385
|
+
AllowRechargeableVoucherSales: "1",
|
|
386
|
+
OpenDrawerAtEnd: "1"
|
|
387
|
+
};
|
|
388
|
+
this.rjObject['CashTender'].push(obj1);
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
return this;
|
|
394
|
+
}
|
|
395
|
+
getNumber(productId) {
|
|
396
|
+
let lineNumber;
|
|
397
|
+
for (let i = 0; i < this.rjObject['ProductSale'].length; i++) {
|
|
398
|
+
const element = this.rjObject['ProductSale'][i];
|
|
399
|
+
if (JSON.stringify(productId) === JSON.stringify(element.ProductID)) {
|
|
400
|
+
lineNumber = element.LineNumber;
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
return lineNumber;
|
|
405
|
+
}
|
|
406
|
+
setLineNumberForProducts() {
|
|
407
|
+
let itemLineIdArray = [];
|
|
408
|
+
itemLineIdArray = this.transactionDocument.basket.products.map((product) => {
|
|
409
|
+
return parseInt(product.itemLineId);
|
|
410
|
+
});
|
|
411
|
+
this.largestNumber = itemLineIdArray.reduce((a, b) => Math.max(a, b));
|
|
412
|
+
}
|
|
413
|
+
generateLineNumber() {
|
|
414
|
+
this.largestNumber += 1;
|
|
415
|
+
this.itemCount += 1;
|
|
416
|
+
return this.largestNumber;
|
|
417
|
+
}
|
|
418
|
+
initilizeItemCount() {
|
|
419
|
+
this.itemCount = this.transactionDocument.basket.products.length;
|
|
420
|
+
}
|
|
421
|
+
build() {
|
|
422
|
+
return this.rjObject;
|
|
423
|
+
}
|
|
424
|
+
getDescription(element) {
|
|
425
|
+
if (element.paymentType.toUpperCase() === 'CARD') {
|
|
426
|
+
return element.cardType;
|
|
427
|
+
}
|
|
428
|
+
else {
|
|
429
|
+
return element.paymentType;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
getMMGROUPID(attributes) {
|
|
433
|
+
if (attributes && attributes.length > 0) {
|
|
434
|
+
let filterValue = attributes.filter((attribute) => attribute.name === "MMGROUPID");
|
|
435
|
+
if (filterValue && filterValue.length > 0) {
|
|
436
|
+
return filterValue[0].value;
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
setDeviceInfo(id) {
|
|
441
|
+
this.deviceId = id;
|
|
442
|
+
return this;
|
|
443
|
+
}
|
|
444
|
+
removeDecimal(value) {
|
|
445
|
+
return value * 100;
|
|
446
|
+
}
|
|
447
|
+
addDecimal(value) {
|
|
448
|
+
return value / 100;
|
|
449
|
+
}
|
|
450
|
+
setTransactionNumber(value) {
|
|
451
|
+
this.transactionNumber = value;
|
|
452
|
+
return this;
|
|
453
|
+
}
|
|
454
|
+
setManifestVersion(value) {
|
|
455
|
+
this.manifestVersion = value;
|
|
456
|
+
return this;
|
|
457
|
+
}
|
|
458
|
+
setDatabaseSchemaVersion(value) {
|
|
459
|
+
this.databaseSchemaVersion = value;
|
|
460
|
+
return this;
|
|
461
|
+
}
|
|
462
|
+
setBasketType(value) {
|
|
463
|
+
this.basketType = value;
|
|
464
|
+
return this;
|
|
465
|
+
}
|
|
466
|
+
setTradingRegionID(value) {
|
|
467
|
+
this.tradingRegionId = value;
|
|
468
|
+
return this;
|
|
469
|
+
}
|
|
470
|
+
setCompanyID(value) {
|
|
471
|
+
this.companyId = value;
|
|
472
|
+
return this;
|
|
473
|
+
}
|
|
474
|
+
setTaxMethodID(value) {
|
|
475
|
+
this.taxMethodId = value;
|
|
476
|
+
return this;
|
|
477
|
+
}
|
|
478
|
+
setMajorVersion(value) {
|
|
479
|
+
this.majorVersion = value;
|
|
480
|
+
return this;
|
|
481
|
+
}
|
|
482
|
+
setMinorVersion(value) {
|
|
483
|
+
this.minorVersion = value;
|
|
484
|
+
return this;
|
|
485
|
+
}
|
|
486
|
+
setXMLSchemaVersion(value) {
|
|
487
|
+
this.xmlSchemaVersion = value;
|
|
488
|
+
return this;
|
|
489
|
+
}
|
|
490
|
+
setExternalState(value) {
|
|
491
|
+
this.externalState = value;
|
|
492
|
+
return this;
|
|
493
|
+
}
|
|
494
|
+
setCashierID() {
|
|
495
|
+
this.cashierId = (this.transactionDocument && this.transactionDocument.userName) ? this.transactionDocument.userName : '';
|
|
496
|
+
return this;
|
|
497
|
+
}
|
|
498
|
+
setTerminalNumber(value) {
|
|
499
|
+
this.terminalNumber = value;
|
|
500
|
+
return this;
|
|
501
|
+
}
|
|
502
|
+
setBasketLanguageID(value) {
|
|
503
|
+
this.basketLanguageId = value;
|
|
504
|
+
return this;
|
|
505
|
+
}
|
|
506
|
+
setBasketCountryID(value) {
|
|
507
|
+
this.basketCountryId = value;
|
|
508
|
+
return this;
|
|
509
|
+
}
|
|
510
|
+
setBasketCurrencyID(value) {
|
|
511
|
+
this.basketCurrencyId = value;
|
|
512
|
+
return this;
|
|
513
|
+
}
|
|
514
|
+
setBranchID(value) {
|
|
515
|
+
this.branchId = value;
|
|
516
|
+
return this;
|
|
517
|
+
}
|
|
518
|
+
setSalesPersonName(value) {
|
|
519
|
+
this.salesPersonName = value;
|
|
520
|
+
return this;
|
|
521
|
+
}
|
|
522
|
+
generateId(date) {
|
|
523
|
+
let newDateTime = date.replace(/[^0-9]/g, '');
|
|
524
|
+
let id = (this.deviceId + '|' + newDateTime + '|' + this.transactionNumber).toString();
|
|
525
|
+
return id;
|
|
526
|
+
}
|
|
527
|
+
generateTimezoneoffset(date) {
|
|
528
|
+
let x = date ? date : '';
|
|
529
|
+
return new Date(x).getTimezoneOffset();
|
|
530
|
+
}
|
|
531
|
+
generateKeyword() {
|
|
532
|
+
let x = (this.companyId + '|' + this.transactionDocument.storeId + '|' + this.terminalNumber + '|' + this.transactionNumber).toString();
|
|
533
|
+
return x;
|
|
534
|
+
}
|
|
535
|
+
getState() {
|
|
536
|
+
if (this.transactionDocument.operationStatus === 'PAY_SUCCESS') {
|
|
537
|
+
return 'Completed';
|
|
538
|
+
}
|
|
539
|
+
else {
|
|
540
|
+
return 'Cancelled';
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
returnProduct(element, lineDiscount, transactionDiscount) {
|
|
544
|
+
let obj = {};
|
|
545
|
+
let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
|
|
546
|
+
obj['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
547
|
+
obj['LineNumber'] = element['itemLineId'];
|
|
548
|
+
obj['NetValue'] = this.removeDecimal(element['refundedTotal']);
|
|
549
|
+
obj['EffectiveNetValue'] = this.removeDecimal(element['refundedTotal']);
|
|
550
|
+
obj['Description'] = element['description'];
|
|
551
|
+
obj['DeviceID'] = this.transactionDocument['terminalId'];
|
|
552
|
+
obj['UserID'] = this.transactionDocument.userName;
|
|
553
|
+
obj['DateTimeCreated'] = this.createdAt;
|
|
554
|
+
obj['ExtendedValue'] = this.removeDecimal(element['totalLinePrice'] * -1);
|
|
555
|
+
obj['UnitPrice'] = this.removeDecimal(element['price']);
|
|
556
|
+
obj['Quantity'] = this.getQuantity(element);
|
|
557
|
+
obj['OriginalTaxAmountSet'] = 1;
|
|
558
|
+
obj['ProductID'] = element['SKU'];
|
|
559
|
+
obj['HandKeyed'] = 1;
|
|
560
|
+
obj['LongDescription'] = element['description'];
|
|
561
|
+
obj['Return'] = {};
|
|
562
|
+
obj['Return']['ReturnReasonID'] = element['refundedReason'];
|
|
563
|
+
obj['Return']['ReturnDescription'] = element['refundedReasonDescription'];
|
|
564
|
+
obj['Return']['ReturnToStock'] = this.getQuantity(element);
|
|
565
|
+
obj['TaxCode'] = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode;
|
|
566
|
+
obj['DisplayTaxCode'] = ''; // todo
|
|
567
|
+
obj['ProductAttributes'] = ''; //todo - not required
|
|
568
|
+
obj['Perishable'] = this.getMMGROUPID(element.attributes);
|
|
569
|
+
//obj['MMGroupID'] = this.getCaregories(element);
|
|
570
|
+
obj['MMGroupID'] = this.getMMGROUPID(element.attributes);
|
|
571
|
+
obj['CustomerDetails'] = ""; // todo - blank
|
|
572
|
+
obj['TotalPromotionSaving'] = element['promotionAmount'] || -1; // TODO
|
|
573
|
+
obj['OriginalTaxAmount'] = this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT) * -1)).toFixed(2));
|
|
574
|
+
obj['taxAmount'] = this.removeDecimal(taxTotal.taxLineTotal < 0 ? (taxTotal.taxLineTotal) : (-taxTotal.taxLineTotal));
|
|
575
|
+
if (lineDiscount) {
|
|
576
|
+
if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
|
|
577
|
+
// line discount
|
|
578
|
+
obj['Discount'] = {};
|
|
579
|
+
obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
580
|
+
obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
|
|
581
|
+
obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
|
|
582
|
+
obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
|
|
583
|
+
obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
|
|
584
|
+
obj['Discount'].DiscountType = lineDiscount.discountType;
|
|
585
|
+
obj['Discount'].XMLSchemaVersion = 1;
|
|
586
|
+
obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
|
|
587
|
+
obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
|
|
588
|
+
obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
|
|
589
|
+
obj['Discount'].RoundingRule = 2;
|
|
590
|
+
}
|
|
591
|
+
if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
|
|
592
|
+
//price override
|
|
593
|
+
obj['PriceOverride'] = {};
|
|
594
|
+
obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
595
|
+
obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
|
|
596
|
+
obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
|
|
597
|
+
obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
|
|
598
|
+
obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
|
|
599
|
+
obj['PriceOverride'].XMLSchemaVersion = 1;
|
|
600
|
+
obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
|
|
601
|
+
obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
|
|
602
|
+
}
|
|
603
|
+
//update the product price
|
|
604
|
+
obj.NetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
605
|
+
obj.EffectiveNetValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
606
|
+
obj.ExtendedValue = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
607
|
+
obj.UnitPrice = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount) * -1;
|
|
608
|
+
}
|
|
609
|
+
if (transactionDiscount) {
|
|
610
|
+
obj['BasketDiscountModifier'] = [];
|
|
611
|
+
this.transactionDocument.basket.transactionDiscount.forEach((e) => {
|
|
612
|
+
let discountObj = {};
|
|
613
|
+
e.itemLineIds.forEach((x) => {
|
|
614
|
+
if (x == element.itemLineId) {
|
|
615
|
+
var discountAmount = this.convertToString(e.discountAmount * -1);
|
|
616
|
+
discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
|
|
617
|
+
discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
618
|
+
discountObj.DiscountedValue = this.getDiscountedValue(element.totalLinePrice, e.discountAmount);
|
|
619
|
+
obj['BasketDiscountModifier'].push(discountObj);
|
|
620
|
+
}
|
|
621
|
+
});
|
|
622
|
+
});
|
|
623
|
+
var totaltransactionDiscount = 0;
|
|
624
|
+
obj['BasketDiscountModifier'].forEach((value) => {
|
|
625
|
+
totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
|
|
626
|
+
});
|
|
627
|
+
//update the product price
|
|
628
|
+
obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
|
|
629
|
+
}
|
|
630
|
+
if (this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
631
|
+
obj['PromotionSaving'] = [];
|
|
632
|
+
this.transactionDocument.basket.transactionPromotion.forEach((transactionPromo) => {
|
|
633
|
+
let promotionObj = {};
|
|
634
|
+
transactionPromo.itemLineIds.forEach((itemLineId) => {
|
|
635
|
+
if (itemLineId == element.itemLineId) {
|
|
636
|
+
promotionObj.ModifierValue = transactionPromo.promotionAmount;
|
|
637
|
+
promotionObj.ModifierDateTime = this.transactionDocument.createdAt;
|
|
638
|
+
promotionObj.ModifierDescription = transactionPromo.displayText;
|
|
639
|
+
promotionObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
640
|
+
promotionObj.PromotionID = transactionPromo.promotionId;
|
|
641
|
+
promotionObj.PromotionDescription = transactionPromo.displayText;
|
|
642
|
+
promotionObj.HitNumber = '1';
|
|
643
|
+
promotionObj.PromotionHitProductQuantity = this.getQuantity(element);
|
|
644
|
+
promotionObj.PromotionHitQuantity = this.getQuantity(element) * -1;
|
|
645
|
+
obj['PromotionSaving'].push(promotionObj);
|
|
646
|
+
}
|
|
647
|
+
});
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
return obj;
|
|
651
|
+
}
|
|
652
|
+
addProduct(element, lineDiscount, transactionDiscount) {
|
|
653
|
+
let taxTotal = this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']);
|
|
654
|
+
let obj = {
|
|
655
|
+
XMLSchemaVersion: this.xmlSchemaVersion,
|
|
656
|
+
LineNumber: element.itemLineId,
|
|
657
|
+
NetValue: this.removeDecimal(element.totalLinePrice),
|
|
658
|
+
EffectiveNetValue: this.removeDecimal(element.totalLinePrice),
|
|
659
|
+
Description: element.description,
|
|
660
|
+
DeviceID: this.deviceId,
|
|
661
|
+
UserID: this.transactionDocument.userName,
|
|
662
|
+
DateTimeCreated: this.createdAt,
|
|
663
|
+
ExtendedValue: this.removeDecimal(element.price),
|
|
664
|
+
UnitPrice: this.removeDecimal(element.price),
|
|
665
|
+
//MMGroupID: this.getCaregories(element),
|
|
666
|
+
Quantity: element.quantity,
|
|
667
|
+
SalespersonID: this.transactionDocument.userName,
|
|
668
|
+
SalespersonName: this.salesPersonName,
|
|
669
|
+
TaxCode: this.transactionDocument.basket['taxBreakdown']['taxLines'].find((item) => item.itemLineId == element['itemLineId']).VATCode,
|
|
670
|
+
TaxModifiable: "1", //todo
|
|
671
|
+
OriginalTaxAmount: this.convertToString((this.removeDecimal(this.getOriginalTax(element, taxTotal.VAT)).toFixed(2))),
|
|
672
|
+
TaxAmount: this.convertToString(this.removeDecimal(taxTotal.taxLineTotal)),
|
|
673
|
+
OriginalTaxAmountSet: "1", //todo
|
|
674
|
+
ProductID: element.SKU,
|
|
675
|
+
HandKeyed: "1", //todo
|
|
676
|
+
CustomerDetails: "",
|
|
677
|
+
Perishable: this.getMMGROUPID(element.attributes),
|
|
678
|
+
MMGroupID: this.getMMGROUPID(element.attributes)
|
|
679
|
+
};
|
|
680
|
+
if (lineDiscount) {
|
|
681
|
+
if (lineDiscount.percentageDiscountReasonName && lineDiscount.percentageDiscountReasonCode) {
|
|
682
|
+
// line discount
|
|
683
|
+
obj['Discount'] = {};
|
|
684
|
+
obj['Discount'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
685
|
+
obj['Discount'].ModifierDateTime = obj.DateTimeCreated;
|
|
686
|
+
obj['Discount'].ModifierReasonID = lineDiscount.percentageDiscountReasonCode;
|
|
687
|
+
obj['Discount'].ModifierDescription = lineDiscount.percentageDiscountReasonName;
|
|
688
|
+
obj['Discount'].AuthorisingUserID = this.transactionDocument.userName;
|
|
689
|
+
obj['Discount'].DiscountType = lineDiscount.discountType;
|
|
690
|
+
obj['Discount'].XMLSchemaVersion = 1;
|
|
691
|
+
obj['Discount'].OriginalPrice = this.removeDecimal(lineDiscount.discountAmount + (lineDiscount.discountedLinePrice || 0));
|
|
692
|
+
obj['Discount'].DiscountedValue = this.removeDecimal(lineDiscount.unitPrice);
|
|
693
|
+
obj['Discount'].DiscountPercentage = lineDiscount.percentageDiscountValue;
|
|
694
|
+
obj['Discount'].RoundingRule = 2;
|
|
695
|
+
}
|
|
696
|
+
if (lineDiscount.priceOverrideReasonCode && lineDiscount.priceOverrideReasonName) {
|
|
697
|
+
//price override
|
|
698
|
+
obj['PriceOverride'] = {};
|
|
699
|
+
obj['PriceOverride'].ModifierValue = this.removeDecimal(lineDiscount.discountAmount) * -1;
|
|
700
|
+
obj['PriceOverride'].ModifierDateTime = obj.DateTimeCreated;
|
|
701
|
+
obj['PriceOverride'].ModifierReasonID = lineDiscount.priceOverrideReasonCode;
|
|
702
|
+
obj['PriceOverride'].ModifierReasonDescription = lineDiscount.priceOverrideReasonName;
|
|
703
|
+
obj['PriceOverride'].AuthorisingUserID = this.transactionDocument.userName;
|
|
704
|
+
obj['PriceOverride'].XMLSchemaVersion = this.xmlSchemaVersion;
|
|
705
|
+
obj['PriceOverride'].NewPrice = this.removeDecimal(lineDiscount.unitPrice);
|
|
706
|
+
obj['PriceOverride'].OriginalPrice = this.removeDecimal(lineDiscount.discountedLinePrice || 0 + lineDiscount.discountAmount);
|
|
707
|
+
}
|
|
708
|
+
//update the product price
|
|
709
|
+
obj['NetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
710
|
+
obj['EffectiveNetValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
711
|
+
obj['ExtendedValue'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
712
|
+
obj['UnitPrice'] = ((lineDiscount.discountedLinePrice || 0) + lineDiscount.discountAmount);
|
|
713
|
+
}
|
|
714
|
+
if (transactionDiscount) {
|
|
715
|
+
obj['BasketDiscountModifier'] = [];
|
|
716
|
+
this.transactionDocument.basket.transactionDiscount.forEach((e) => {
|
|
717
|
+
let discountObj = {};
|
|
718
|
+
e.itemLineIds.forEach((itemLineId) => {
|
|
719
|
+
if (itemLineId == element.itemLineId) {
|
|
720
|
+
let discountAmount = this.convertToString(e.discountAmount * -1);
|
|
721
|
+
discountObj.XMLSchemaVersion = this.xmlSchemaVersion;
|
|
722
|
+
discountObj.DiscountedValue = -(this.getDiscountedValue(element.totalLinePrice, e.discountAmount));
|
|
723
|
+
discountObj.BasketDiscountLineNumber = this.getLineNumber(e, discountAmount);
|
|
724
|
+
obj['BasketDiscountModifier'].push(discountObj);
|
|
725
|
+
}
|
|
726
|
+
});
|
|
727
|
+
});
|
|
728
|
+
let totaltransactionDiscount = 0;
|
|
729
|
+
obj['BasketDiscountModifier'].forEach((value) => {
|
|
730
|
+
totaltransactionDiscount = totaltransactionDiscount + value.DiscountedValue;
|
|
731
|
+
});
|
|
732
|
+
//update the product price
|
|
733
|
+
obj['EffectiveNetValue'] = obj.EffectiveNetValue + totaltransactionDiscount;
|
|
734
|
+
}
|
|
735
|
+
if (this.transactionDocument.basket.transactionPromotion.length > 0 || this.transactionDocument.basket.linePromotion.length > 0) {
|
|
736
|
+
obj['DistributedPromotionSaving'] = [];
|
|
737
|
+
if (this.transactionDocument.basket.transactionPromotion.length > 0) {
|
|
738
|
+
this.transactionDocument.basket.transactionPromotion.forEach((e) => {
|
|
739
|
+
let promotionObj = {};
|
|
740
|
+
e.itemLineIds.forEach((itemLineId) => {
|
|
741
|
+
if (itemLineId == element.itemLineId) {
|
|
742
|
+
promotionObj.PromotionID = e.promotionId;
|
|
743
|
+
promotionObj.Hit = '1';
|
|
744
|
+
promotionObj.Saving = this.getSaving(element.totalLinePrice, e.promotionAmount);
|
|
745
|
+
promotionObj.ISaving = this.getSaving(element.totalLinePrice, e.promotionAmount);
|
|
746
|
+
obj['DistributedPromotionSaving'].push(promotionObj);
|
|
747
|
+
}
|
|
748
|
+
});
|
|
749
|
+
});
|
|
750
|
+
}
|
|
751
|
+
if (this.transactionDocument.basket.linePromotion.length > 0) {
|
|
752
|
+
this.transactionDocument.basket.linePromotion.forEach((linePromotion) => {
|
|
753
|
+
let promotionObj = {};
|
|
754
|
+
if (element.itemLineId == linePromotion.itemLineId) {
|
|
755
|
+
promotionObj.PromotionID = linePromotion.promotionId;
|
|
756
|
+
promotionObj.Hit = "1";
|
|
757
|
+
promotionObj.Saving = linePromotion.promotionLinePrice;
|
|
758
|
+
promotionObj.ISaving = linePromotion.promotionLinePrice;
|
|
759
|
+
obj['DistributedPromotionSaving'].push(promotionObj);
|
|
760
|
+
}
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
let transactionPromotion = 0;
|
|
764
|
+
obj['DistributedPromotionSaving'].forEach((value) => {
|
|
765
|
+
transactionPromotion = transactionPromotion + value.Saving;
|
|
766
|
+
});
|
|
767
|
+
obj['EffectiveNetValue'] = obj.EffectiveNetValue + transactionPromotion;
|
|
768
|
+
}
|
|
769
|
+
return obj;
|
|
770
|
+
}
|
|
771
|
+
getSaving(price, promotionAmount) {
|
|
772
|
+
let Saving = (price * promotionAmount) / this.transactionDocument.basketSummary.saleTotal;
|
|
773
|
+
return Saving;
|
|
774
|
+
}
|
|
775
|
+
getLineNumber(value, discountAmount) {
|
|
776
|
+
let lineNumber;
|
|
777
|
+
for (let i = 0; i < this.rjObject['BasketDiscount'].length; i++) {
|
|
778
|
+
const element = this.rjObject['BasketDiscount'][i];
|
|
779
|
+
if (value.reasonCode === element.ReasonCodeID && discountAmount === element.NetValue) {
|
|
780
|
+
lineNumber = element.LineNumber;
|
|
781
|
+
break;
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
return lineNumber;
|
|
785
|
+
}
|
|
786
|
+
getDiscountedValue(price, discountAmount) {
|
|
787
|
+
let DiscountedValue = ((price * discountAmount) / this.transactionDocument.basketSummary.saleTotal) * 100;
|
|
788
|
+
return DiscountedValue;
|
|
789
|
+
}
|
|
790
|
+
getOriginalTax(element, VAT) {
|
|
791
|
+
let pricebeforetax = (element.price * 100) / (100 + VAT);
|
|
792
|
+
let originaltax = element.price - pricebeforetax;
|
|
793
|
+
return originaltax;
|
|
794
|
+
}
|
|
795
|
+
convertToString(value) {
|
|
796
|
+
try {
|
|
797
|
+
value = JSON.stringify(value);
|
|
798
|
+
return value;
|
|
799
|
+
}
|
|
800
|
+
catch (e) {
|
|
801
|
+
console.log(value, 'can not be converted in string', e);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
generateDynamicStockLookUp() {
|
|
805
|
+
let x = '0';
|
|
806
|
+
this.transactionDocument.basket.products.forEach((element) => {
|
|
807
|
+
if (element.deliveryMethod === '1' || element.deliveryMethod === '2') {
|
|
808
|
+
x = '1';
|
|
809
|
+
}
|
|
810
|
+
});
|
|
811
|
+
return x;
|
|
812
|
+
}
|
|
813
|
+
// getAttributes(){
|
|
814
|
+
// let name: string | any[] = []
|
|
815
|
+
// this.transactionDocument.basket.products.forEach((element: any) => {
|
|
816
|
+
// if (element && element.attributes && element.attributes.length > 0) {
|
|
817
|
+
// name = element.attributes.filter((x: any) => x.name.toUpperCase() === element.name.toUpperCase());
|
|
818
|
+
// }
|
|
819
|
+
// });
|
|
820
|
+
// if (name.length > 0) {
|
|
821
|
+
// return name[0].value
|
|
822
|
+
// }
|
|
823
|
+
// else{
|
|
824
|
+
// return ""
|
|
825
|
+
// }
|
|
826
|
+
// }
|
|
827
|
+
// getCaregories(element) {
|
|
828
|
+
// let MMGroupId = " ";
|
|
829
|
+
// if (element.categories && element.categories.length > 0) {
|
|
830
|
+
// let categories = element.categories.filter((x) => x.parentId != '');
|
|
831
|
+
// let value = categories.filter((x) => x.id != x.parentId);
|
|
832
|
+
// MMGroupId = value[0].name;
|
|
833
|
+
// }
|
|
834
|
+
// return MMGroupId;
|
|
835
|
+
// }
|
|
836
|
+
getDate(date) {
|
|
837
|
+
let offset = this.generateTimezoneoffset(date) * -1;
|
|
838
|
+
let offsetHours = Math.abs(Math.floor(offset / 60));
|
|
839
|
+
let offsetMinutes = Math.abs(offset) - offsetHours * 60;
|
|
840
|
+
let offsetSign = '+';
|
|
841
|
+
if (offset < 0) {
|
|
842
|
+
offsetSign = '-';
|
|
843
|
+
}
|
|
844
|
+
let newdate = date.substring(0, 19);
|
|
845
|
+
const x = (newdate + offsetSign + String(offsetHours).padStart(2, '0') + ':' + String(offsetMinutes).padStart(2, '0')).toString();
|
|
846
|
+
return x;
|
|
847
|
+
}
|
|
848
|
+
getTransactionPromotion(transactionPromotion) {
|
|
849
|
+
if (transactionPromotion && transactionPromotion.length > 0) {
|
|
850
|
+
this.rjObject['PromoVoucherItem'] = {};
|
|
851
|
+
this.rjObject['PromoVoucherItem']['XMLSchemaVersion'] = this.xmlSchemaVersion;
|
|
852
|
+
this.rjObject['PromoVoucherItem']['LineNumber'] = this.generateLineNumber();
|
|
853
|
+
this.rjObject['PromoVoucherItem']['NetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
|
|
854
|
+
this.rjObject['PromoVoucherItem']['EffectiveNetValue'] = this.removeDecimal(transactionPromotion[0].promotionLinePrice) * -1;
|
|
855
|
+
this.rjObject['PromoVoucherItem']['Description'] = transactionPromotion[0].promotionInfo;
|
|
856
|
+
this.rjObject['PromoVoucherItem']['DeviceID'] = this.deviceId;
|
|
857
|
+
this.rjObject['PromoVoucherItem']['UserID'] = this.transactionDocument.userName;
|
|
858
|
+
this.rjObject['PromoVoucherItem']['DateTimeCreated'] = this.createdAt;
|
|
859
|
+
this.rjObject['PromoVoucherItem']['ProductId'] = ""; //todo
|
|
860
|
+
this.rjObject['PromoVoucherItem']['SerialNumber'] = ""; //todo
|
|
861
|
+
this.rjObject['PromoVoucherItem']['MMGroupId'] = "";
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
getQuantity(element) {
|
|
865
|
+
let quantity;
|
|
866
|
+
if (this.transactionDocument.unreferencedRefund) {
|
|
867
|
+
quantity = element['quantity'] < 0 ? element['quantity'] : (-element['quantity']);
|
|
868
|
+
}
|
|
869
|
+
else {
|
|
870
|
+
quantity = element['refundedQuantity'] < 0 ? element['refundedQuantity'] : (-element['refundedQuantity']);
|
|
871
|
+
}
|
|
872
|
+
return quantity;
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUkotbWFwcGVyLmNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvbWFwcGVyLWxpYnJhcnkvc3JjL2xpYi9SSi1tYXBwZXIuY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBb0UsZ0JBQWdCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQTtBQUN6SSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRSxNQUFNLE9BQU8sb0JBQW9CO0lBNEI3QixZQUFZLGNBQW9DO1FBUnhDLGNBQVMsR0FBRyxDQUFDLENBQUM7UUFDZCxrQkFBYSxHQUFHLENBQUMsQ0FBQztRQUtsQixhQUFRLEdBQVEsRUFBRSxDQUFBO1FBR3RCLElBQUksY0FBYyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztRQUM5QyxDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksQ0FBQyxtQkFBbUIsR0FBRztnQkFDdkIsYUFBYSxFQUFFLEVBQUU7Z0JBQ2pCLG9CQUFvQixFQUFFLEVBQUU7Z0JBQ3hCLGNBQWMsRUFBRSxFQUFFO2dCQUNsQixRQUFRLEVBQUUsRUFBRTtnQkFDWixPQUFPLEVBQUUsRUFBRTtnQkFDWCxPQUFPLEVBQUUsRUFBRTtnQkFDWCxXQUFXLEVBQUUsRUFBRTtnQkFDZixrQkFBa0IsRUFBRSxFQUFFO2dCQUN0QixRQUFRLEVBQUUsRUFBRTtnQkFDWixVQUFVLEVBQUUsRUFBRTtnQkFDZCxNQUFNLEVBQUUsRUFBRTtnQkFDVixnQkFBZ0IsRUFBRSxTQUFTO2dCQUMzQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsRUFBUztnQkFDakIsYUFBYSxFQUFFLEVBQVM7Z0JBQ3hCLFlBQVksRUFBRSxFQUFFO2dCQUNoQixJQUFJLEVBQUUsRUFBRTtnQkFDUixlQUFlLEVBQUUsRUFBRTtnQkFDbkIsU0FBUyxFQUFFLEVB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QyxRQUFRLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDeEQsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBWTtRQUNwQixJQUFJLFFBQVEsQ0FBQTtRQUNaLElBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFDLENBQUM7WUFDNUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7YUFDRyxDQUFDO1lBQ0QsUUFBUSxHQUFHLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQzlHLENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNwQixDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBESVNDT1VOVFRZUEUsIExpbmVEaXNjb3VudCwgVFByb2R1Y3QsIFRyYW5zYWN0aW9uRGlzY291bnQsIFRyYW5zYWN0aW9uRG9jdW1lbnQsIFRSQU5TQUNUSU9OX1RZUEUgfSBmcm9tIFwiLi9tYXBwZXItbGlicmFyeS5tb2RlbFwiXHJcbmltcG9ydCB7IFRyYW5zYWN0aW9uRG9jdW1lbnRCdWlsZGVyIH0gZnJvbSBcIi4vVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXJcIjtcclxuZXhwb3J0IGNsYXNzIFJKTWFwcGVyQnVpbGRlckNsYXNzIHtcclxuXHJcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uRG9jdW1lbnQ6IFRyYW5zYWN0aW9uRG9jdW1lbnQ7XHJcbiAgICBwcml2YXRlIGRldmljZUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIHRyYW5zYWN0aW9uTnVtYmVyOiBhbnk7XHJcbiAgICBwcml2YXRlIG1hbmlmZXN0VmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBkYXRhYmFzZVNjaGVtYVZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgYmFza2V0VHlwZTogYW55O1xyXG4gICAgcHJpdmF0ZSB4bWxTY2hlbWFWZXJzaW9uOiBhbnk7XHJcbiAgICBwcml2YXRlIG1ham9yVmVyc2lvbjogYW55O1xyXG4gICAgcHJpdmF0ZSBtaW5vclZlcnNpb246IGFueTtcclxuICAgIHByaXZhdGUgZXh0ZXJuYWxTdGF0ZTogYW55O1xyXG4gICAgcHJpdmF0ZSBjYXNoaWVySWQ6IGFueTtcclxuICAgIHByaXZhdGUgY29tcGFueUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIHRlcm1pbmFsTnVtYmVyOiBhbnk7XHJcbiAgICBwcml2YXRlIHRheE1ldGhvZElkOiBhbnk7XHJcbiAgICBwcml2YXRlIHRyYWRpbmdSZWdpb25JZDogYW55O1xyXG4gICAgcHJpdmF0ZSBiYXNrZXRDdXJyZW5jeUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIGJhc2tldENvdW50cnlJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBiYXNrZXRMYW5ndWFnZUlkOiBhbnk7XHJcbiAgICBwcml2YXRlIGl0ZW1Db3VudCA9IDA7XHJcbiAgICBwcml2YXRlIGxhcmdlc3ROdW1iZXIgPSAwO1xyXG4gICAgcHJpdmF0ZSBicmFuY2hJZDogYW55O1xyXG4gICAgcHJpdmF0ZSBjcmVhdGVkQXQ6IGFueTtcclxuICAgIHByaXZhdGUgdXBkYXRlZEF0IDphbnk7XHJcbiAgICBwcml2YXRlIHNhbGVzUGVyc29uTmFtZTogYW55O1xyXG4gICAgcHJpdmF0ZSByak9iamVjdDogYW55ID0ge31cclxuXHJcbiAgICBjb25zdHJ1Y3Rvcih0cmFuc2FjdGlvbkRvYz86IFRyYW5zYWN0aW9uRG9jdW1lbnQpIHtcclxuICAgICAgICBpZiAodHJhbnNhY3Rpb25Eb2MpIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0gdHJhbnNhY3Rpb25Eb2M7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50ID0ge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZDogXCJcIixcclxuICAgICAgICAgICAgICAgIG9mZmxpbmVUcmFuc2FjdGlvbklkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25SZWY6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBkYXRlVGltZTogXCJcIixcclxuICAgICAgICAgICAgICAgIG9yZ0NvZGU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzdG9yZUlkOiBcIlwiLFxyXG4gICAgICAgICAgICAgICAgc3RvcmVOb2RlSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBzdG9yZU5vZGVTdHJ1Y3R1cmU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBkZXZpY2VJZDogXCJcIixcclxuICAgICAgICAgICAgICAgIHRlcm1pbmFsSWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB1c2VySWQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBpbml0aWF0aW5nTW9kdWxlOiBcImVCYXNrZXRcIixcclxuICAgICAgICAgICAgICAgIGV4cG9ydDogZmFsc2UsXHJcbiAgICAgICAgICAgICAgICBiYXNrZXQ6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgIGJhc2tldFN1bW1hcnk6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgIGJhc2VDdXJyZW5jeTogXCJcIixcclxuICAgICAgICAgICAgICAgIHR5cGU6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25TdGF0dXM6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICB1cGRhdGVkQXQ6IFwiXCIsXHJcbiAgICAgICAgICAgICAgICBpZDogXCJcIixcclxuICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHM6IHt9IGFzIGFueSxcclxuICAgICAgICAgICAgICAgIHNhbGVUb3RhbDogMCxcclxuICAgICAgICAgICAgfTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5pbml0aWxpemVJdGVtQ291bnQoKTtcclxuICAgICAgICB0aGlzLnNldExpbmVOdW1iZXJGb3JQcm9kdWN0cygpO1xyXG4gICAgICAgIHRoaXMuY3JlYXRlZEF0ID0gdGhpcy5nZXREYXRlKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlZEF0ID0gdGhpcy5nZXREYXRlKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51cGRhdGVkQXQpO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFBvc2Jhc2tldEluZm8oKSB7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnS2V5d29yZCddID0gdGhpcy5nZW5lcmF0ZUtleXdvcmQoKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydJRCddID0gdGhpcy5nZW5lcmF0ZUlkKHRoaXMuY3JlYXRlZEF0KTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydYTUxTY2hlbWFWZXJzaW9uJ10gPSAnMic7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTGFzdFVwZGF0ZWQnXSA9IHRoaXMudXBkYXRlZEF0O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ01ham9yVmVyc2lvbiddID0gdGhpcy5tYWpvclZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnTWlub3JWZXJzaW9uJ10gPSB0aGlzLm1pbm9yVmVyc2lvbjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydNYW5pZmVzdFZlcnNpb24nXSA9IHRoaXMubWFuaWZlc3RWZXJzaW9uO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0RhdGFiYXNlU2NoZW1hVmVyc2lvbiddID0gdGhpcy5kYXRhYmFzZVNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnQmFza2V0VHlwZSddID0gdGhpcy5iYXNrZXRUeXBlO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ1N0YXRlJ10gPSB0aGlzLmdldFN0YXRlKCk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnRXh0ZXJuYWxTdGF0ZSddID0gdGhpcy5leHRlcm5hbFN0YXRlO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcblxyXG4gICAgZ2V0aGVhZGVySW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXSA9IHt9O1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLlRpbWVab25lT2Zmc2V0ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5nZW5lcmF0ZVRpbWV6b25lb2Zmc2V0KHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5jcmVhdGVkQXQpKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5EYXRlVGltZUNyZWF0ZWQgPSB0aGlzLmNyZWF0ZWRBdDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkgPSB7fTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuRGV2aWNlSUQgPSB0aGlzLmRldmljZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5DYXNoaWVySUQgPSB0aGlzLmNhc2hpZXJJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuQ29tcGFueUlEID0gdGhpcy5jb21wYW55SWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LlN0b3JlSUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuc3RvcmVJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5PcmlnaW5hdGVkQnkuQnJhbmNoSUQgPSB0aGlzLmJyYW5jaElkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLk9yaWdpbmF0ZWRCeS5UZXJtaW5hbE51bWJlciA9IHRoaXMudGVybWluYWxOdW1iZXI7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uT3JpZ2luYXRlZEJ5LlRyYW5zYWN0aW9uTnVtYmVyID0gdGhpcy50cmFuc2FjdGlvbk51bWJlcjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UYXhNZXRob2RJRCA9IHRoaXMudGF4TWV0aG9kSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uRHluYW1pY1N0b2NrTG9va3VwID0gdGhpcy5nZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkJhc2tldExhbmd1YWdlSUQgPSB0aGlzLmJhc2tldExhbmd1YWdlSWQ7IC8vdG9kb1xyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkJhc2tldENvdW50cnlJRCA9IHRoaXMuYmFza2V0Q291bnRyeUlkOyAvL3RvZG9cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5CYXNrZXRDdXJyZW5jeUlEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5UcmFkaW5nUmVnaW9uSUQgPSB0aGlzLnRyYWRpbmdSZWdpb25JZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydIZWFkZXInXS5FdXJvem9uZSA9IFwiIFwiOy8vdW5rbm93blxyXG4gICAgICAgIHRoaXMucmpPYmplY3RbJ0hlYWRlciddLkV1cm9CYXNlRXhjaGFuZ2VSYXRlID0gXCJcIjsgLy91bmtub3duXHJcbiAgICAgICAgdGhpcy5yak9iamVjdFsnSGVhZGVyJ10uUHJpbnRhYmxlTmFtZSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTsgLy91bmtub3duXHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIHJqTWFwcGVyKCkge1xyXG4gICAgICAgIHZhciB0cmFuc2FjdGlvbkRpc2NvdW50OmFueSA9IFtdIDtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50ICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICB0cmFuc2FjdGlvbkRpc2NvdW50ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gVFJBTlNBQ1RJT05fVFlQRS5TQUxFKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RTYWxlJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGluZURpc2NvdW50ID0gW107XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGxpbmVEaXNjb3VudCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZURpc2NvdW50LmZpbHRlcigoeDogYW55KSA9PiB4Lml0ZW1MaW5lSWQgPT09IGVsZW1lbnQuaXRlbUxpbmVJZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmVEaXNjb3VudC5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQuaW5kZXhPZihsaW5lRGlzY291bnRbMF0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lRGlzY291bnQuc3BsaWNlKGluZGV4LCAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5hZGRQcm9kdWN0KGVsZW1lbnQsIChsaW5lRGlzY291bnQubGVuZ3RoID4gMCA/IGxpbmVEaXNjb3VudFswXSA6IG51bGwpLCh0cmFuc2FjdGlvbkRpc2NvdW50Lmxlbmd0aCA+IDAgPyB0cmFuc2FjdGlvbkRpc2NvdW50IDogbnVsbCkpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXS5wdXNoKGRhdGEpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNb2RpZmllckl0ZW0obGluZURpc2NvdW50Lmxlbmd0aCA+IDAgPyBsaW5lRGlzY291bnRbMF0gOiBudWxsLCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uUHJvbW90aW9uID0gW107XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uICYmIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5nZXRUcmFuc2FjdGlvblByb21vdGlvbih0cmFuc2FjdGlvblByb21vdGlvbik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlJFRlVORCkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10gPSBbXTsgICAgICAgICAgICBcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC50eXBlID09PSBUUkFOU0FDVElPTl9UWVBFLlNBTEVfUkVGVU5EKSB7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uRG9jOiBhbnkgPSBuZXcgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIoKS5iYXNrZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpLmJ1aWxkKCk7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdGhpcy5yZXR1cm5Qcm9kdWN0KGVsZW1lbnQsIChlbGVtZW50Lmhhc093blByb3BlcnR5KCdsaW5lRGlzY291bnQnKSA/IGVsZW1lbnQubGluZURpc2NvdW50IDogbnVsbCksKHRyYW5zYWN0aW9uRGlzY291bnQubGVuZ3RoID4gMCA/IHRyYW5zYWN0aW9uRGlzY291bnQgOiBudWxsKSk7XHJcbiAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxSZWNlaXB0U3VwcGxpZWRcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsQnJhbmNoSURcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVGVybWluYWxOdW1iZXJcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVHJhbnNhY3Rpb25OdW1iZXJcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsQ2FzaGllck51bWJlclwiOiAwXHJcbiAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgZGF0YVsnUmV0dXJuJ10gPSB7Li4uZGF0YVsnUmV0dXJuJ10sIC4uLm9ian07XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10ucHVzaChkYXRhKTtcclxuICAgICAgICAgICAgICAgIHRoaXMuZ2V0TW9kaWZpZXJJdGVtKGVsZW1lbnQubGluZURpc2NvdW50LCBlbGVtZW50Lml0ZW1MaW5lSWQpO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnR5cGUgPT09IFRSQU5TQUNUSU9OX1RZUEUuU0FMRV9FWENIQU5HRSkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0UmV0dXJuJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvZHVjdFNhbGUnXSA9IFtdO1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydNb2RpZmllckl0ZW0nXSA9IFtdO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgbGV0IHRyYW5zYWN0aW9uRG9jOiBhbnkgPSBuZXcgVHJhbnNhY3Rpb25Eb2N1bWVudEJ1aWxkZXIoKS5iYXNrZXQodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmN1cnJlbnRUcmFuc2FjdGlvbkRldGFpbHMpLmJ1aWxkKCk7XHJcbiAgICAgICAgICAgIHRyYW5zYWN0aW9uRG9jLmJhc2tldC5wcm9kdWN0cy5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnJlZnVuZGVkUXVhbnRpdHkgPiAwKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJldHVyblByb2R1Y3QgPSB0aGlzLnJldHVyblByb2R1Y3QoZWxlbWVudCwgKGVsZW1lbnQuaGFzT3duUHJvcGVydHkoJ2xpbmVEaXNjb3VudCcpID8gZWxlbWVudC5saW5lRGlzY291bnQgOiBudWxsKSwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsUmVjZWlwdFN1cHBsaWVkXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxCcmFuY2hJRFwiOiAwLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBcIk9yaWdpbmFsVGVybWluYWxOdW1iZXJcIjogMCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJPcmlnaW5hbFRyYW5zYWN0aW9uTnVtYmVyXCI6IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiT3JpZ2luYWxDYXNoaWVyTnVtYmVyXCI6IDBcclxuICAgICAgICAgICAgICAgICAgICB9O1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblByb2R1Y3RbJ1JldHVybiddID0gey4uLnJldHVyblByb2R1Y3RbJ1JldHVybiddLCAuLi5vYmp9O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb2R1Y3RSZXR1cm4nXS5wdXNoKHJldHVyblByb2R1Y3QpO1xyXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgYWRkUHJvZHVjdCA9IHRoaXMuYWRkUHJvZHVjdChlbGVtZW50LCAoZWxlbWVudC5oYXNPd25Qcm9wZXJ0eSgnbGluZURpc2NvdW50JykgPyBlbGVtZW50LmxpbmVEaXNjb3VudCA6IG51bGwpICwodHJhbnNhY3Rpb25EaXNjb3VudC5sZW5ndGggPiAwID8gdHJhbnNhY3Rpb25EaXNjb3VudCA6IG51bGwpKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLnB1c2goYWRkUHJvZHVjdCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLmdldE1vZGlmaWVySXRlbShlbGVtZW50LmxpbmVEaXNjb3VudCwgZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldEJhc2tldERpc2NvdW50KCkge1xyXG4gICAgICAgIGlmICghdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50KSByZXR1cm4gdGhpcztcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydCYXNrZXREaXNjb3VudCddID0gW107XHJcbiAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fVxyXG4gICAgICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgb2JqWydEZXZpY2VJRCddPXRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgICAgIG9ialsnRGF0ZVRpbWVDcmVhdGVkJ109dGhpcy51cGRhdGVkQXQ7XHJcbiAgICAgICAgICAgIG9ialsnTmV0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuZGlzY291bnRBbW91bnQgKiAtMSk7XHJcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9dGhpcy5jb252ZXJ0VG9TdHJpbmcoIGVsZW1lbnQuZGlzY291bnRBbW91bnQgKiAtMSk7XHJcbiAgICAgICAgICAgIG9ialsnRGVzY3JpcHRpb24nXSA9IGVsZW1lbnQucmVhc29uRGlzcGxheVRleHQ7XHJcbiAgICAgICAgICAgIG9ialsnVXNlcklEJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgIG9ialsnUmVhc29uQ29kZUlEJ10gPSBlbGVtZW50LnJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgIG9ialsnRGlzY291bnRUeXBlJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlbGVtZW50LmRpc2NvdW50VHlwZS50b1VwcGVyQ2FzZSgpID09IERJU0NPVU5UVFlQRS5QRVJDRU5ULnRvVXBwZXJDYXNlKCkgPyAwIDogMSk7IFxyXG4gICAgICAgICAgICBvYmpbJ1JvdW5kaW5nUnVsZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoMik7XHJcbiAgICAgICAgICAgIG9ialsnTW9kaWZpZWRMaW5lTnVtYmVyJ10gPSBlbGVtZW50Lml0ZW1MaW5lSWRzOyAgICAgICAgICAgXHJcbiAgICAgICAgICAgIG9ialsnTGluZU51bWJlciddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKSk7IFxyXG4gICAgICAgICAgICBvYmpbJ0Rpc2NvdW50ZWRWYWx1ZSddID0gIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsICsgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkuZGlzY291bnRUb3RhbDtcclxuICAgICAgICAgICAgaWYoZWxlbWVudC5kaXNjb3VudFR5cGUudG9VcHBlckNhc2UoKSA9PSBESVNDT1VOVFRZUEUuUEVSQ0VOVC50b1VwcGVyQ2FzZSgpKXtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnRQZXJjZW50YWdlJ10gPSAgdGhpcy5jb252ZXJ0VG9TdHJpbmcoKGVsZW1lbnQuZGlzY291bnRBbW91bnQgLyB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5iYXNrZXRUb3RhbCkudG9GaXhlZCgxKSlcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZih0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudHlwZSA9PT0gJ1JFRlVORCcpe1xyXG4gICAgICAgICAgICAgICAgb2JqWydOZXRWYWx1ZSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcoZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDAgPyAtZWxlbWVudC5kaXNjb3VudEFtb3VudCA6IGVsZW1lbnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID10aGlzLmNvbnZlcnRUb1N0cmluZyggZWxlbWVudC5kaXNjb3VudEFtb3VudCA8IDAgPyAtZWxlbWVudC5kaXNjb3VudEFtb3VudCA6IGVsZW1lbnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydCYXNrZXREaXNjb3VudCddLnB1c2gob2JqKTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBnZXRNb2RpZmllckl0ZW0oZGF0YTogYW55LCBsaW5lTm86IGFueSkge1xyXG4gICAgICAgIGlmIChkYXRhICYmIGxpbmVObykge1xyXG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgb2JqLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICBvYmouTGluZU51bWJlciA9IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCk7XHJcbiAgICAgICAgICAgIG9iai5OZXRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIG9iai5FZmZlY3RpdmVOZXRWYWx1ZSA9IDA7XHJcbiAgICAgICAgICAgIG9iai5EZXNjcmlwdGlvbiA9IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSA/IGRhdGEucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSA6IGRhdGEucHJpY2VPdmVycmlkZVJlYXNvbk5hbWU7XHJcbiAgICAgICAgICAgIG9iai5EZXZpY2VJRCA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgICAgIG9iai5Vc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgIG9iai5EYXRlVGltZUNyZWF0ZWQgPSB0aGlzLnVwZGF0ZWRBdDtcclxuICAgICAgICAgICAgb2JqLkF1dGhvcmlzaW5nVXNlcklEID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lO1xyXG4gICAgICAgICAgICBvYmouUmVhc29uQ29kZUlEID0gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlID8gZGF0YS5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlIDogZGF0YS5wcmljZU92ZXJyaWRlUmVhc29uQ29kZTtcclxuICAgICAgICAgICAgb2JqLk1vZGlmaWVkTGluZU51bWJlciA9IGxpbmVObztcclxuICAgICAgICAgICAgb2JqLk1vZGlmaWVkSW5kZXggPSAxO1xyXG5cclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnTW9kaWZpZXJJdGVtJ10ucHVzaChvYmopO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRUcmFpbGVySW5mbygpIHtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ10gPSB7fTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuRGF0ZVRpbWVDb21wbGV0ZWQgPSB0aGlzLnVwZGF0ZWRBdDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkgPSB7fTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuRGV2aWNlSUQgPSB0aGlzLmRldmljZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5DYXNoaWVySUQgPSB0aGlzLmNhc2hpZXJJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuU3RvcmVJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Db21wbGV0ZWRCeS5CcmFuY2hJRCA9IHRoaXMuYnJhbmNoSWQ7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLkNvbXBsZXRlZEJ5LlRlcm1pbmFsTnVtYmVyID0gdGhpcy50ZXJtaW5hbE51bWJlcjtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuQ29tcGxldGVkQnkuVHJhbnNhY3Rpb25OdW1iZXIgPSB0aGlzLnRyYW5zYWN0aW9uTnVtYmVyO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5Ub3RhbCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LmJhc2tldFRvdGFsICogMTAwKTtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbUNvdW50ID0gdGhpcy5pdGVtQ291bnQ7IC8vZ2l2ZXMgdG90YWwgY291bnQgZm9yIHByb2R1Y3RcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuSXRlbVF1YW50aXR5ID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFN1bW1hcnkudG90YWxJdGVtcyk7XHJcbiAgICAgICAgdGhpcy5yak9iamVjdC5UcmFpbGVyLk5ldEl0ZW1RdWFudGl0eSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnRvdGFsSXRlbXMpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5UYXhUb3RhbCA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5WQVRUb3RhbCkpO1xyXG4gICAgICAgIHRoaXMucmpPYmplY3QuVHJhaWxlci5TZXF1ZW5jZURldmljZUlEID0gdGhpcy5kZXZpY2VJZDtcclxuICAgICAgICB0aGlzLnJqT2JqZWN0LlRyYWlsZXIuU2VxdWVuY2VOdW1iZXIgPSAnc25zbicgLy9zdGF0aWMgZm9yIG5vd1xyXG5cclxuICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1RheEl0ZW0nXSA9IFtdO1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgICAgIG9ialsnWE1MU2NoZW1hVmVyc2lvbiddID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICBvYmpbJ1RheFJhdGUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuVkFUQ29kZSk7XHJcbiAgICAgICAgICAgIG9ialsnVGF4YWJsZVRvdGFsJ10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyh0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50YXhhYmxlQW1vdW50KSk7XHJcbiAgICAgICAgICAgIG9ialsnVGF4VG90YWwnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbCh0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC50YXhMaW5lVG90YWwpKSk7XHJcbiAgICAgICAgICAgIG9ialsnVGF4RGVzY3JpcHRpb24nXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQuVkFUQ29kZSk7XHJcbiAgICAgICAgICAgIG9ialsnVGF4SW5jbHVkZWQnXSA9ICcxJztcclxuICAgICAgICAgICAgb2JqWydUYXhQZXJjZW50YWdlJ10gPSB0aGlzLmFkZERlY2ltYWwoZWxlbWVudC5WQVQudG9GaXhlZCgyKSkudG9GaXhlZCgyKTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnVGF4SXRlbSddLnB1c2gob2JqKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMCB8fCB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LmxpbmVQcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXSA9IFtdO1xyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5mb3JFYWNoKChlbGVtZW50OiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqOiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25JRCddID0gZWxlbWVudC5wcm9tb3Rpb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25RdWFudGl0eSddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25EZXNjcmlwdGlvbiddID0gZWxlbWVudC5kaXNwbGF5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddID0ge31cclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0TnVtYmVyJ10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRRdWFudGl0eSddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0U2F2aW5nJ10gPSBlbGVtZW50LnByb21vdGlvbkFtb3VudCA8IDAgPyBlbGVtZW50LnByb21vdGlvbkFtb3VudCA6IC1lbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10gPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1Byb2R1Y3RJRCddID0gcHJvZHVjdC5TS1U7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydVbml0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQucHJvbW90aW9uTGluZVByaWNlIC8gcHJvZHVjdC5xdWFudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydMaW5lTnVtYmVyJ10gPSB0aGlzLmdldE51bWJlcihwcm9kdWN0LlNLVSk7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddWydRdWFudGl0eSddID0gdGhpcy5jb252ZXJ0VG9TdHJpbmcocHJvZHVjdC5xdWFudGl0eS50b0ZpeGVkKDEpKTtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ11bJ1RheENvZGUnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudGF4QnJlYWtkb3duLnRheExpbmVzLmZpbmQoKGl0ZW06IGFueSkgPT4gaXRlbS5pdGVtTGluZUlkID09IGVsZW1lbnQuaXRlbUxpbmVJZCkuVkFUQ29kZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydUcmFpbGVyJ11bJ1Byb21vdGlvbkl0ZW0nXS5wdXNoKG9iaik7XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24ubGVuZ3RoID4gMCkge1xyXG5cclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25JRCddID0gZWxlbWVudC5wcm9tb3Rpb25JZDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddID0gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgPCAwID8gZWxlbWVudC5wcm9tb3Rpb25BbW91bnQgOiAtZWxlbWVudC5wcm9tb3Rpb25BbW91bnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25RdWFudGl0eSddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25EZXNjcmlwdGlvbiddID0gZWxlbWVudC5kaXNwbGF5VGV4dDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddID0ge31cclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0TnVtYmVyJ10gPSBcIjFcIjtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydIaXRRdWFudGl0eSddID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnSGl0U2F2aW5nJ10gPSBlbGVtZW50LnByb21vdGlvbkFtb3VudCA8IDAgPyBlbGVtZW50LnByb21vdGlvbkFtb3VudCA6IC1lbGVtZW50LnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvbkhpdCddWydQcm9tb3Rpb25UcmlnZ2VyJ10gPSBbXTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uVHJpZ2dlciA9IHt9O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lml0ZW1MaW5lSWRzLmZvckVhY2goKGl0ZW1MaW5lSWQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTT04uc3RyaW5naWZ5KGl0ZW1MaW5lSWQpID09PSBwcm9kdWN0Lml0ZW1MaW5lSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnUHJvZHVjdElEJ10gPSBwcm9kdWN0LlNLVTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydVbml0VmFsdWUnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKGVsZW1lbnQucHJvbW90aW9uTGluZVByaWNlIC8gcHJvZHVjdC5xdWFudGl0eSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uVHJpZ2dlclsnTGluZU51bWJlciddID0gdGhpcy5nZXROdW1iZXIocHJvZHVjdC5TS1UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvblRyaWdnZXJbJ1F1YW50aXR5J10gPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhwcm9kdWN0LnF1YW50aXR5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25UcmlnZ2VyWydUYXhDb2RlJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRheEJyZWFrZG93bi50YXhMaW5lcy5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBwcm9kdWN0Lml0ZW1MaW5lSWQpLlZBVENvZGU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydQcm9tb3Rpb25IaXQnXVsnUHJvbW90aW9uVHJpZ2dlciddLnB1c2gocHJvbW90aW9uVHJpZ2dlcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1RyYWlsZXInXVsnUHJvbW90aW9uSXRlbSddLnB1c2gob2JqKTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFRlbmRlckluZm8oKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5wYXltZW50RGV0YWlscyAmJiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucGF5bWVudERldGFpbHMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQucGF5bWVudERldGFpbHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIGlmKGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJLZXkpe1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yak9iamVjdFtlbGVtZW50LmV4dGVybmFsVGVuZGVyS2V5XSA9IFtdO1xyXG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQucGF5bWVudFR5cGUudG9VcHBlckNhc2UoKSA9PT0gJ0dJRlQgQ0FSRCcpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBYTUxTY2hlbWFWZXJzaW9uOiB0aGlzLnhtbFNjaGVtYVZlcnNpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IHRoaXMuY29udmVydFRvU3RyaW5nKC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lEZXNjcmlwdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgR2lmdFZvdWNoZXJTYWxlc0FsbG93ZWQ6ICcnLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBBbGxvd1JlY2hhcmdlYWJsZVZvdWNoZXJTYWxlczogJycsLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdpZnRWb3VjaGVySUQ6ICcnXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbZWxlbWVudC5leHRlcm5hbFRlbmRlcktleV0ucHVzaChvYmopXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqMSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksLy90b2RvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiB0aGlzLmNvbnZlcnRUb1N0cmluZygtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb246IHRoaXMuZ2V0RGVzY3JpcHRpb24oZWxlbWVudCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERldmljZUlEOiB0aGlzLmRldmljZUlkLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVDcmVhdGVkOiB0aGlzLnVwZGF0ZWRBdCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyVHlwZTogZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJTdWJUeXBlOiBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlckFtb3VudDogdGhpcy5jb252ZXJ0VG9TdHJpbmcoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lEZXNjcmlwdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUluVHJhbnNhY3Rpb25Ub3RhbENoZWNrOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPcGVuRHJhd2VyQXRFbmQ6IFwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbZWxlbWVudC5leHRlcm5hbFRlbmRlcktleV0ucHVzaChvYmoxKVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2V7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10gPSBbXTtcclxuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnBheW1lbnRUeXBlLnRvVXBwZXJDYXNlKCkgPT09ICdHSUZUIENBUkQnKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iaiA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogdGhpcy54bWxTY2hlbWFWZXJzaW9uLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBMaW5lTnVtYmVyOiB0aGlzLmdlbmVyYXRlTGluZU51bWJlcigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogSlNPTi5zdHJpbmdpZnkoLTEgKiB0aGlzLnJlbW92ZURlY2ltYWwoKE1hdGgucm91bmQoZWxlbWVudC5hbW91bnQpKSkpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbjogdGhpcy5nZXREZXNjcmlwdGlvbihlbGVtZW50KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEYXRlVGltZUNyZWF0ZWQ6IHRoaXMudXBkYXRlZEF0LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJUeXBlOiBlbGVtZW50LmV4dGVybmFsVGVuZGVyVHlwZSA/IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlIDogJycsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclN1YlR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxTdWJUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyQW1vdW50OiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5SUQ6IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbmN5RGVzY3JpcHRpb246IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNlQ3VycmVuY3ksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEdpZnRWb3VjaGVyU2FsZXNBbGxvd2VkOiAnJywvL3RvZG9cclxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6ICcnLC8vdG9kb1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBHaWZ0Vm91Y2hlcklEOiAnJ1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydDYXNoVGVuZGVyJ10ucHVzaChvYmopXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqMSA9IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2NoZW1hVmVyc2lvbjogXCIxXCIsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIExpbmVOdW1iZXI6IHRoaXMuZ2VuZXJhdGVMaW5lTnVtYmVyKCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIE5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdGl2ZU5ldFZhbHVlOiBKU09OLnN0cmluZ2lmeSgtMSAqIHRoaXMucmVtb3ZlRGVjaW1hbCgoTWF0aC5yb3VuZChlbGVtZW50LmFtb3VudCkpKSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uOiB0aGlzLmdldERlc2NyaXB0aW9uKGVsZW1lbnQpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VJRDogdGhpcy5kZXZpY2VJZCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIERhdGVUaW1lQ3JlYXRlZDogdGhpcy51cGRhdGVkQXQsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFRlbmRlclR5cGU6IGVsZW1lbnQuZXh0ZXJuYWxUZW5kZXJUeXBlID8gZWxlbWVudC5leHRlcm5hbFRlbmRlclR5cGUgOiAnJyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgVGVuZGVyU3ViVHlwZTogZWxlbWVudC5leHRlcm5hbFN1YlRlbmRlclR5cGUgPyBlbGVtZW50LmV4dGVybmFsU3ViVGVuZGVyVHlwZSA6ICcnLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBUZW5kZXJBbW91bnQ6IEpTT04uc3RyaW5naWZ5KC0xICogdGhpcy5yZW1vdmVEZWNpbWFsKChNYXRoLnJvdW5kKGVsZW1lbnQuYW1vdW50KSkpKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVuY3lEZXNjcmlwdGlvbjogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2VDdXJyZW5jeSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZUluVHJhbnNhY3Rpb25Ub3RhbENoZWNrOiBcIjFcIixcclxuICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dSZWNoYXJnZWFibGVWb3VjaGVyU2FsZXM6IFwiMVwiLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBPcGVuRHJhd2VyQXRFbmQ6IFwiMVwiXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ0Nhc2hUZW5kZXInXS5wdXNoKG9iajEpXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE51bWJlcihwcm9kdWN0SWQpIHtcclxuICAgICAgICBsZXQgbGluZU51bWJlcjsgXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnJqT2JqZWN0WydQcm9kdWN0U2FsZSddW2ldO1xyXG4gICAgICAgICAgICBpZihKU09OLnN0cmluZ2lmeShwcm9kdWN0SWQpID09PSBKU09OLnN0cmluZ2lmeShlbGVtZW50LlByb2R1Y3RJRCkpe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsZW1lbnQuTGluZU51bWJlcjtcclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsaW5lTnVtYmVyO1xyXG4gICAgfVxyXG5cclxuICAgIHNldExpbmVOdW1iZXJGb3JQcm9kdWN0cygpIHtcclxuICAgICAgICBsZXQgaXRlbUxpbmVJZEFycmF5ID0gW107XHJcbiAgICAgICAgaXRlbUxpbmVJZEFycmF5ID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5wcm9kdWN0cy5tYXAoKHByb2R1Y3Q6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQocHJvZHVjdC5pdGVtTGluZUlkKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRoaXMubGFyZ2VzdE51bWJlciA9IGl0ZW1MaW5lSWRBcnJheS5yZWR1Y2UoKGE6IGFueSwgYjogYW55KSA9PiBNYXRoLm1heChhLCBiKSk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVMaW5lTnVtYmVyKCkge1xyXG4gICAgICAgIHRoaXMubGFyZ2VzdE51bWJlciArPSAxO1xyXG4gICAgICAgIHRoaXMuaXRlbUNvdW50ICs9IDE7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubGFyZ2VzdE51bWJlcjtcclxuICAgIH1cclxuXHJcbiAgICBpbml0aWxpemVJdGVtQ291bnQoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtQ291bnQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmxlbmd0aDtcclxuICAgIH1cclxuXHJcbiAgICBidWlsZCgpIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yak9iamVjdDtcclxuICAgIH1cclxuXHJcbiAgICBnZXREZXNjcmlwdGlvbihlbGVtZW50OiBhbnkpIHtcclxuICAgICAgICBpZiAoZWxlbWVudC5wYXltZW50VHlwZS50b1VwcGVyQ2FzZSgpID09PSAnQ0FSRCcpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuY2FyZFR5cGVcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnBheW1lbnRUeXBlO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZXRNTUdST1VQSUQoYXR0cmlidXRlcykge1xyXG4gICAgICAgIGlmIChhdHRyaWJ1dGVzICYmIGF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBsZXQgZmlsdGVyVmFsdWUgPSBhdHRyaWJ1dGVzLmZpbHRlcigoYXR0cmlidXRlKSA9PiBhdHRyaWJ1dGUubmFtZSA9PT0gXCJNTUdST1VQSURcIik7XHJcbiAgICAgICAgICAgIGlmKGZpbHRlclZhbHVlICYmIGZpbHRlclZhbHVlLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICByZXR1cm4gZmlsdGVyVmFsdWVbMF0udmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgc2V0RGV2aWNlSW5mbyhpZDogYW55KSB7XHJcbiAgICAgICAgdGhpcy5kZXZpY2VJZCA9IGlkXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICByZW1vdmVEZWNpbWFsKHZhbHVlOiBudW1iZXIpIHtcclxuICAgICAgICByZXR1cm4gdmFsdWUgKiAxMDA7XHJcbiAgICB9XHJcblxyXG4gICAgYWRkRGVjaW1hbCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIHZhbHVlIC8xMDA7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0VHJhbnNhY3Rpb25OdW1iZXIodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMudHJhbnNhY3Rpb25OdW1iZXIgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldE1hbmlmZXN0VmVyc2lvbih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5tYW5pZmVzdFZlcnNpb24gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldERhdGFiYXNlU2NoZW1hVmVyc2lvbih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5kYXRhYmFzZVNjaGVtYVZlcnNpb24gPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldEJhc2tldFR5cGUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYmFza2V0VHlwZSA9IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0VHJhZGluZ1JlZ2lvbklEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnRyYWRpbmdSZWdpb25JZCA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRDb21wYW55SUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuY29tcGFueUlkID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRheE1ldGhvZElEKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnRheE1ldGhvZElkID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldE1ham9yVmVyc2lvbih2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5tYWpvclZlcnNpb24gPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0TWlub3JWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLm1pbm9yVmVyc2lvbiA9IHZhbHVlXHJcbiAgICAgICAgcmV0dXJuIHRoaXNcclxuICAgIH1cclxuXHJcbiAgICBzZXRYTUxTY2hlbWFWZXJzaW9uKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnhtbFNjaGVtYVZlcnNpb24gPSB2YWx1ZVxyXG4gICAgICAgIHJldHVybiB0aGlzXHJcbiAgICB9XHJcblxyXG4gICAgc2V0RXh0ZXJuYWxTdGF0ZSh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5leHRlcm5hbFN0YXRlID0gdmFsdWVcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldENhc2hpZXJJRCgpIHtcclxuICAgICAgICB0aGlzLmNhc2hpZXJJZCA9ICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQgJiYgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lKSA/ICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWUgOiAnJztcclxuICAgICAgICByZXR1cm4gdGhpc1xyXG4gICAgfVxyXG5cclxuICAgIHNldFRlcm1pbmFsTnVtYmVyKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0aGlzLnRlcm1pbmFsTnVtYmVyID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFza2V0TGFuZ3VhZ2VJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRMYW5ndWFnZUlkID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcbiAgICBzZXRCYXNrZXRDb3VudHJ5SUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYmFza2V0Q291bnRyeUlkID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QmFza2V0Q3VycmVuY3lJRCh2YWx1ZTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5iYXNrZXRDdXJyZW5jeUlkID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgc2V0QnJhbmNoSUQodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuYnJhbmNoSWQgPSB2YWx1ZTtcclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICBzZXRTYWxlc1BlcnNvbk5hbWUodmFsdWU6IGFueSkge1xyXG4gICAgICAgIHRoaXMuc2FsZXNQZXJzb25OYW1lID0gdmFsdWU7XHJcbiAgICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgZ2VuZXJhdGVJZChkYXRlOiBhbnkpIHtcclxuICAgICAgICBsZXQgbmV3RGF0ZVRpbWUgPSBkYXRlLnJlcGxhY2UoL1teMC05XS9nLCAnJylcclxuICAgICAgICBsZXQgaWQgPSAodGhpcy5kZXZpY2VJZCArICd8JyArIG5ld0RhdGVUaW1lICsgJ3wnICsgdGhpcy50cmFuc2FjdGlvbk51bWJlcikudG9TdHJpbmcoKTtcclxuICAgICAgICByZXR1cm4gaWQ7XHJcbiAgICB9IFxyXG5cclxuICAgIGdlbmVyYXRlVGltZXpvbmVvZmZzZXQoZGF0ZTogYW55KSB7XHJcbiAgICAgICAgbGV0IHggPSBkYXRlID8gZGF0ZSA6ICcnO1xyXG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh4KS5nZXRUaW1lem9uZU9mZnNldCgpO1xyXG4gICAgfVxyXG5cclxuICAgIGdlbmVyYXRlS2V5d29yZCgpIHtcclxuICAgICAgICBsZXQgeCA9ICh0aGlzLmNvbXBhbnlJZCArICd8JyArIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5zdG9yZUlkICsgJ3wnICsgdGhpcy50ZXJtaW5hbE51bWJlciArICd8JyArIHRoaXMudHJhbnNhY3Rpb25OdW1iZXIpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuIHg7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0U3RhdGUoKSB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5vcGVyYXRpb25TdGF0dXMgPT09ICdQQVlfU1VDQ0VTUycpIHtcclxuICAgICAgICAgICAgcmV0dXJuICdDb21wbGV0ZWQnO1xyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgcmV0dXJuICdDYW5jZWxsZWQnO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm5Qcm9kdWN0KGVsZW1lbnQ6IGFueSwgbGluZURpc2NvdW50OiBMaW5lRGlzY291bnQgLCB0cmFuc2FjdGlvbkRpc2NvdW50OiBUcmFuc2FjdGlvbkRpc2NvdW50KSB7XHJcbiAgICAgICAgbGV0IG9iajogYW55ID0ge307XHJcbiAgICAgICAgbGV0IHRheFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKTtcclxuICAgICAgICBvYmpbJ1hNTFNjaGVtYVZlcnNpb24nXSA9IHRoaXMueG1sU2NoZW1hVmVyc2lvbjtcclxuICAgICAgICBvYmpbJ0xpbmVOdW1iZXInXSA9IGVsZW1lbnRbJ2l0ZW1MaW5lSWQnXTtcclxuICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsncmVmdW5kZWRUb3RhbCddKTtcclxuICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsncmVmdW5kZWRUb3RhbCddKTtcclxuICAgICAgICBvYmpbJ0Rlc2NyaXB0aW9uJ10gPSBlbGVtZW50WydkZXNjcmlwdGlvbiddO1xyXG4gICAgICAgIG9ialsnRGV2aWNlSUQnXSA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudFsndGVybWluYWxJZCddO1xyXG4gICAgICAgIG9ialsnVXNlcklEJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgb2JqWydEYXRlVGltZUNyZWF0ZWQnXSA9IHRoaXMuY3JlYXRlZEF0O1xyXG4gICAgICAgIG9ialsnRXh0ZW5kZWRWYWx1ZSddID0gdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnRbJ3RvdGFsTGluZVByaWNlJ10qLTEpO1xyXG4gICAgICAgIG9ialsnVW5pdFByaWNlJ10gPSB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudFsncHJpY2UnXSk7XHJcbiAgICAgICAgb2JqWydRdWFudGl0eSddID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KTtcclxuICAgICAgICBvYmpbJ09yaWdpbmFsVGF4QW1vdW50U2V0J10gPSAxO1xyXG4gICAgICAgIG9ialsnUHJvZHVjdElEJ10gPSBlbGVtZW50WydTS1UnXTtcclxuICAgICAgICBvYmpbJ0hhbmRLZXllZCddID0gMTtcclxuICAgICAgICBvYmpbJ0xvbmdEZXNjcmlwdGlvbiddID0gZWxlbWVudFsnZGVzY3JpcHRpb24nXTtcclxuICAgICAgICBvYmpbJ1JldHVybiddID0ge307XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuUmVhc29uSUQnXSA9IGVsZW1lbnRbJ3JlZnVuZGVkUmVhc29uJ107XHJcbiAgICAgICAgb2JqWydSZXR1cm4nXVsnUmV0dXJuRGVzY3JpcHRpb24nXSA9IGVsZW1lbnRbJ3JlZnVuZGVkUmVhc29uRGVzY3JpcHRpb24nXTtcclxuICAgICAgICBvYmpbJ1JldHVybiddWydSZXR1cm5Ub1N0b2NrJ10gPSB0aGlzLmdldFF1YW50aXR5KGVsZW1lbnQpO1xyXG4gICAgICAgIG9ialsnVGF4Q29kZSddID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKS5WQVRDb2RlO1xyXG5cclxuICAgICAgICBvYmpbJ0Rpc3BsYXlUYXhDb2RlJ10gPSAnJzsgLy8gdG9kb1xyXG4gICAgICAgIG9ialsnUHJvZHVjdEF0dHJpYnV0ZXMnXSA9ICcnOyAvL3RvZG8gLSBub3QgcmVxdWlyZWRcclxuICAgICAgICBvYmpbJ1BlcmlzaGFibGUnXSA9IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyk7XHJcbiAgICAgICAgLy9vYmpbJ01NR3JvdXBJRCddID0gdGhpcy5nZXRDYXJlZ29yaWVzKGVsZW1lbnQpO1xyXG4gICAgICAgIG9ialsnTU1Hcm91cElEJ10gPSB0aGlzLmdldE1NR1JPVVBJRChlbGVtZW50LmF0dHJpYnV0ZXMpO1xyXG4gICAgICAgIG9ialsnQ3VzdG9tZXJEZXRhaWxzJ10gPSBcIlwiOyAvLyB0b2RvIC0gYmxhbmtcclxuICAgICAgICBvYmpbJ1RvdGFsUHJvbW90aW9uU2F2aW5nJ10gPSBlbGVtZW50Wydwcm9tb3Rpb25BbW91bnQnXSB8fCAtMTsgLy8gVE9ET1xyXG4gICAgICAgIG9ialsnT3JpZ2luYWxUYXhBbW91bnQnXSA9IHRoaXMuY29udmVydFRvU3RyaW5nKCh0aGlzLnJlbW92ZURlY2ltYWwodGhpcy5nZXRPcmlnaW5hbFRheChlbGVtZW50LHRheFRvdGFsLlZBVCkgKiAtMSkpLnRvRml4ZWQoMikpO1xyXG4gICAgICAgIG9ialsndGF4QW1vdW50J10gPSB0aGlzLnJlbW92ZURlY2ltYWwodGF4VG90YWwudGF4TGluZVRvdGFsIDwgMCA/KHRheFRvdGFsLnRheExpbmVUb3RhbCkgOiAoLXRheFRvdGFsLnRheExpbmVUb3RhbCkpO1xyXG5cclxuICAgICAgICBpZiAobGluZURpc2NvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbGluZSBkaXNjb3VudFxyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJEYXRlVGltZSA9IG9iai5EYXRlVGltZUNyZWF0ZWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJSZWFzb25JRCA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudFR5cGUgPSBsaW5lRGlzY291bnQuZGlzY291bnRUeXBlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ICsgKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApKTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlJvdW5kaW5nUnVsZSA9IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGUgJiYgbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvL3ByaWNlIG92ZXJyaWRlXHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbkRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gMTtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk5ld1ByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC51bml0UHJpY2UpO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uT3JpZ2luYWxQcmljZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy91cGRhdGUgdGhlIHByb2R1Y3QgcHJpY2VcclxuICAgICAgICAgICAgb2JqLk5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgb2JqLkVmZmVjdGl2ZU5ldFZhbHVlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICAgICAgb2JqLkV4dGVuZGVkVmFsdWUgPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KSAqIC0xO1xyXG4gICAgICAgICAgICBvYmouVW5pdFByaWNlID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCkgKiAtMTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGU6IGFueSkgPT4geyAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRPYmo6IGFueSA9e31cclxuICAgICAgICAgICAgICAgICBlLml0ZW1MaW5lSWRzLmZvckVhY2goKHg6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmICh4ID09IGVsZW1lbnQuaXRlbUxpbmVJZCkgeyAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkaXNjb3VudEFtb3VudCA9IHRoaXMuY29udmVydFRvU3RyaW5nKGUuZGlzY291bnRBbW91bnQgKiAtMSk7ICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgZGlzY291bnRPYmouQmFza2V0RGlzY291bnRMaW5lTnVtYmVyID0gdGhpcy5nZXRMaW5lTnVtYmVyKGUsZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLmdldERpc2NvdW50ZWRWYWx1ZShlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10ucHVzaChkaXNjb3VudE9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdmFyIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IDA7XHJcbiAgICAgICAgICAgIG9ialsnQmFza2V0RGlzY291bnRNb2RpZmllciddLmZvckVhY2goKHZhbHVlOmFueSk9PntcclxuICAgICAgICAgICAgICAgIHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCA9IHRvdGFsdHJhbnNhY3Rpb25EaXNjb3VudCArIHZhbHVlLkRpc2NvdW50ZWRWYWx1ZTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBwcm9kdWN0IHByaWNlXHJcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9IG9iai5FZmZlY3RpdmVOZXRWYWx1ZSArICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIG9ialsnUHJvbW90aW9uU2F2aW5nJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvblByb21vdGlvbi5mb3JFYWNoKCh0cmFuc2FjdGlvblByb21vOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBwcm9tb3Rpb25PYmo6IGFueSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tby5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbUxpbmVJZCA9PSBlbGVtZW50Lml0ZW1MaW5lSWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLk1vZGlmaWVyVmFsdWUgPSB0cmFuc2FjdGlvblByb21vLnByb21vdGlvbkFtb3VudDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLk1vZGlmaWVyRGF0ZVRpbWUgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuY3JlYXRlZEF0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouTW9kaWZpZXJEZXNjcmlwdGlvbiA9IHRyYW5zYWN0aW9uUHJvbW8uZGlzcGxheVRleHQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uSUQgPSB0cmFuc2FjdGlvblByb21vLnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uRGVzY3JpcHRpb24gPSB0cmFuc2FjdGlvblByb21vLmRpc3BsYXlUZXh0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouSGl0TnVtYmVyID0gJzEnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uSGl0UHJvZHVjdFF1YW50aXR5ID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLlByb21vdGlvbkhpdFF1YW50aXR5ID0gdGhpcy5nZXRRdWFudGl0eShlbGVtZW50KSAqIC0xO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ1Byb21vdGlvblNhdmluZyddLnB1c2gocHJvbW90aW9uT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGFkZFByb2R1Y3QoZWxlbWVudDogVFByb2R1Y3QsIGxpbmVEaXNjb3VudDogTGluZURpc2NvdW50LCB0cmFuc2FjdGlvbkRpc2NvdW50OiBUcmFuc2FjdGlvbkRpc2NvdW50KSB7XHJcbiAgICAgICAgbGV0IHRheFRvdGFsID0gdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldFsndGF4QnJlYWtkb3duJ11bJ3RheExpbmVzJ10uZmluZCgoaXRlbTogYW55KSA9PiBpdGVtLml0ZW1MaW5lSWQgPT0gZWxlbWVudFsnaXRlbUxpbmVJZCddKTtcclxuICAgICAgICBsZXQgb2JqOiBhbnkgPSB7XHJcbiAgICAgICAgICAgIFhNTFNjaGVtYVZlcnNpb246IHRoaXMueG1sU2NoZW1hVmVyc2lvbixcclxuICAgICAgICAgICAgTGluZU51bWJlcjogZWxlbWVudC5pdGVtTGluZUlkLFxyXG4gICAgICAgICAgICBOZXRWYWx1ZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudG90YWxMaW5lUHJpY2UpLFxyXG4gICAgICAgICAgICBFZmZlY3RpdmVOZXRWYWx1ZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQudG90YWxMaW5lUHJpY2UpLFxyXG4gICAgICAgICAgICBEZXNjcmlwdGlvbjogZWxlbWVudC5kZXNjcmlwdGlvbixcclxuICAgICAgICAgICAgRGV2aWNlSUQ6IHRoaXMuZGV2aWNlSWQsXHJcbiAgICAgICAgICAgIFVzZXJJRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICBEYXRlVGltZUNyZWF0ZWQ6IHRoaXMuY3JlYXRlZEF0LFxyXG4gICAgICAgICAgICBFeHRlbmRlZFZhbHVlOiB0aGlzLnJlbW92ZURlY2ltYWwoZWxlbWVudC5wcmljZSksXHJcbiAgICAgICAgICAgIFVuaXRQcmljZTogdGhpcy5yZW1vdmVEZWNpbWFsKGVsZW1lbnQucHJpY2UpLFxyXG4gICAgICAgICAgICAvL01NR3JvdXBJRDogdGhpcy5nZXRDYXJlZ29yaWVzKGVsZW1lbnQpLFxyXG4gICAgICAgICAgICBRdWFudGl0eTogZWxlbWVudC5xdWFudGl0eSxcclxuICAgICAgICAgICAgU2FsZXNwZXJzb25JRDogdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LnVzZXJOYW1lLFxyXG4gICAgICAgICAgICBTYWxlc3BlcnNvbk5hbWU6IHRoaXMuc2FsZXNQZXJzb25OYW1lLFxyXG4gICAgICAgICAgICBUYXhDb2RlOiB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0Wyd0YXhCcmVha2Rvd24nXVsndGF4TGluZXMnXS5maW5kKChpdGVtOiBhbnkpID0+IGl0ZW0uaXRlbUxpbmVJZCA9PSBlbGVtZW50WydpdGVtTGluZUlkJ10pLlZBVENvZGUsXHJcbiAgICAgICAgICAgIFRheE1vZGlmaWFibGU6IFwiMVwiLCAvL3RvZG9cclxuICAgICAgICAgICAgT3JpZ2luYWxUYXhBbW91bnQgOiB0aGlzLmNvbnZlcnRUb1N0cmluZygodGhpcy5yZW1vdmVEZWNpbWFsKHRoaXMuZ2V0T3JpZ2luYWxUYXgoZWxlbWVudCx0YXhUb3RhbC5WQVQpKS50b0ZpeGVkKDIpKSksXHJcbiAgICAgICAgICAgIFRheEFtb3VudCA6IHRoaXMuY29udmVydFRvU3RyaW5nKHRoaXMucmVtb3ZlRGVjaW1hbCh0YXhUb3RhbC50YXhMaW5lVG90YWwpKSxcclxuICAgICAgICAgICAgT3JpZ2luYWxUYXhBbW91bnRTZXQ6IFwiMVwiLC8vdG9kb1xyXG4gICAgICAgICAgICBQcm9kdWN0SUQ6IGVsZW1lbnQuU0tVLFxyXG4gICAgICAgICAgICBIYW5kS2V5ZWQ6IFwiMVwiLC8vdG9kb1xyXG4gICAgICAgICAgICBDdXN0b21lckRldGFpbHM6IFwiXCIsXHJcbiAgICAgICAgICAgIFBlcmlzaGFibGU6IHRoaXMuZ2V0TU1HUk9VUElEKGVsZW1lbnQuYXR0cmlidXRlcyksXHJcbiAgICAgICAgICAgIE1NR3JvdXBJRDogdGhpcy5nZXRNTUdST1VQSUQoZWxlbWVudC5hdHRyaWJ1dGVzKVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAobGluZURpc2NvdW50KSB7XHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZSAmJiBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uQ29kZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gbGluZSBkaXNjb3VudFxyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddID0ge307XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJEYXRlVGltZSA9IG9iai5EYXRlVGltZUNyZWF0ZWQ7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uTW9kaWZpZXJSZWFzb25JRCA9IGxpbmVEaXNjb3VudC5wZXJjZW50YWdlRGlzY291bnRSZWFzb25Db2RlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk1vZGlmaWVyRGVzY3JpcHRpb24gPSBsaW5lRGlzY291bnQucGVyY2VudGFnZURpc2NvdW50UmVhc29uTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5BdXRob3Jpc2luZ1VzZXJJRCA9IHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51c2VyTmFtZTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudFR5cGUgPSBsaW5lRGlzY291bnQuZGlzY291bnRUeXBlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlhNTFNjaGVtYVZlcnNpb24gPSAxO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLk9yaWdpbmFsUHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50ICsgKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApKTtcclxuICAgICAgICAgICAgICAgIG9ialsnRGlzY291bnQnXS5EaXNjb3VudGVkVmFsdWUgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ0Rpc2NvdW50J10uRGlzY291bnRQZXJjZW50YWdlID0gbGluZURpc2NvdW50LnBlcmNlbnRhZ2VEaXNjb3VudFZhbHVlO1xyXG4gICAgICAgICAgICAgICAgb2JqWydEaXNjb3VudCddLlJvdW5kaW5nUnVsZSA9IDI7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmIChsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGUgJiYgbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lKSB7XHJcbiAgICAgICAgICAgICAgICAvL3ByaWNlIG92ZXJyaWRlXHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXSA9IHt9O1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTW9kaWZpZXJWYWx1ZSA9IHRoaXMucmVtb3ZlRGVjaW1hbChsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpICogLTE7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllckRhdGVUaW1lID0gb2JqLkRhdGVUaW1lQ3JlYXRlZDtcclxuICAgICAgICAgICAgICAgIG9ialsnUHJpY2VPdmVycmlkZSddLk1vZGlmaWVyUmVhc29uSUQgPSBsaW5lRGlzY291bnQucHJpY2VPdmVycmlkZVJlYXNvbkNvZGU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5Nb2RpZmllclJlYXNvbkRlc2NyaXB0aW9uID0gbGluZURpc2NvdW50LnByaWNlT3ZlcnJpZGVSZWFzb25OYW1lO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uQXV0aG9yaXNpbmdVc2VySUQgPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5YTUxTY2hlbWFWZXJzaW9uID0gdGhpcy54bWxTY2hlbWFWZXJzaW9uO1xyXG4gICAgICAgICAgICAgICAgb2JqWydQcmljZU92ZXJyaWRlJ10uTmV3UHJpY2UgPSB0aGlzLnJlbW92ZURlY2ltYWwobGluZURpc2NvdW50LnVuaXRQcmljZSk7XHJcbiAgICAgICAgICAgICAgICBvYmpbJ1ByaWNlT3ZlcnJpZGUnXS5PcmlnaW5hbFByaWNlID0gdGhpcy5yZW1vdmVEZWNpbWFsKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDAgKyBsaW5lRGlzY291bnQuZGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxyXG4gICAgICAgICAgICBvYmpbJ05ldFZhbHVlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICAgICAgb2JqWydFZmZlY3RpdmVOZXRWYWx1ZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnRXh0ZW5kZWRWYWx1ZSddID0gKChsaW5lRGlzY291bnQuZGlzY291bnRlZExpbmVQcmljZSB8fCAwKSArIGxpbmVEaXNjb3VudC5kaXNjb3VudEFtb3VudCk7XHJcbiAgICAgICAgICAgIG9ialsnVW5pdFByaWNlJ10gPSAoKGxpbmVEaXNjb3VudC5kaXNjb3VudGVkTGluZVByaWNlIHx8IDApICsgbGluZURpc2NvdW50LmRpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uRGlzY291bnQpIHtcclxuICAgICAgICAgICAgb2JqWydCYXNrZXREaXNjb3VudE1vZGlmaWVyJ10gPSBbXTtcclxuICAgICAgICAgICAgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC50cmFuc2FjdGlvbkRpc2NvdW50LmZvckVhY2goKGU6YW55KSA9PiB7ICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgbGV0IGRpc2NvdW50T2JqOiBhbnkgPXt9O1xyXG4gICAgICAgICAgICAgICAgIGUuaXRlbUxpbmVJZHMuZm9yRWFjaCgoaXRlbUxpbmVJZDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7IFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlzY291bnRBbW91bnQgPSB0aGlzLmNvbnZlcnRUb1N0cmluZyhlLmRpc2NvdW50QW1vdW50ICogLTEpOyAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLlhNTFNjaGVtYVZlcnNpb24gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdW50T2JqLkRpc2NvdW50ZWRWYWx1ZSA9IC0odGhpcy5nZXREaXNjb3VudGVkVmFsdWUoZWxlbWVudC50b3RhbExpbmVQcmljZSwgZS5kaXNjb3VudEFtb3VudCkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3VudE9iai5CYXNrZXREaXNjb3VudExpbmVOdW1iZXIgPSB0aGlzLmdldExpbmVOdW1iZXIoZSxkaXNjb3VudEFtb3VudCkgO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5wdXNoKGRpc2NvdW50T2JqKTsgXHJcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIGxldCB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSAwO1xyXG4gICAgICAgICAgICBvYmpbJ0Jhc2tldERpc2NvdW50TW9kaWZpZXInXS5mb3JFYWNoKCh2YWx1ZTphbnkpPT57XHJcbiAgICAgICAgICAgICAgICB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgPSB0b3RhbHRyYW5zYWN0aW9uRGlzY291bnQgKyB2YWx1ZS5EaXNjb3VudGVkVmFsdWU7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAvL3VwZGF0ZSB0aGUgcHJvZHVjdCBwcmljZVxyXG4gICAgICAgICAgICBvYmpbJ0VmZmVjdGl2ZU5ldFZhbHVlJ10gPSBvYmouRWZmZWN0aXZlTmV0VmFsdWUgKyAgdG90YWx0cmFuc2FjdGlvbkRpc2NvdW50OyAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDAgfHwgdGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddID0gW107XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQudHJhbnNhY3Rpb25Qcm9tb3Rpb24uZm9yRWFjaCgoZTogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb21vdGlvbk9iajogYW55ID0ge307XHJcbiAgICAgICAgICAgICAgICAgICAgZS5pdGVtTGluZUlkcy5mb3JFYWNoKChpdGVtTGluZUlkOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1MaW5lSWQgPT0gZWxlbWVudC5pdGVtTGluZUlkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uSUQgPSBlLnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLkhpdCA9ICcxJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5TYXZpbmcgPSB0aGlzLmdldFNhdmluZyhlbGVtZW50LnRvdGFsTGluZVByaWNlLCBlLnByb21vdGlvbkFtb3VudCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouSVNhdmluZyA9IHRoaXMuZ2V0U2F2aW5nKGVsZW1lbnQudG90YWxMaW5lUHJpY2UsIGUucHJvbW90aW9uQW1vdW50KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ialsnRGlzdHJpYnV0ZWRQcm9tb3Rpb25TYXZpbmcnXS5wdXNoKHByb21vdGlvbk9iaik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBpZiAodGhpcy50cmFuc2FjdGlvbkRvY3VtZW50LmJhc2tldC5saW5lUHJvbW90aW9uLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQubGluZVByb21vdGlvbi5mb3JFYWNoKChsaW5lUHJvbW90aW9uOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvbW90aW9uT2JqOiBhbnkgPSB7fTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5pdGVtTGluZUlkID09IGxpbmVQcm9tb3Rpb24uaXRlbUxpbmVJZCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouUHJvbW90aW9uSUQgPSBsaW5lUHJvbW90aW9uLnByb21vdGlvbklkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9tb3Rpb25PYmouSGl0ID0gXCIxXCI7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb21vdGlvbk9iai5TYXZpbmcgPSBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvbW90aW9uT2JqLklTYXZpbmcgPSBsaW5lUHJvbW90aW9uLnByb21vdGlvbkxpbmVQcmljZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqWydEaXN0cmlidXRlZFByb21vdGlvblNhdmluZyddLnB1c2gocHJvbW90aW9uT2JqKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSAwO1xyXG4gICAgICAgICAgICBvYmpbJ0Rpc3RyaWJ1dGVkUHJvbW90aW9uU2F2aW5nJ10uZm9yRWFjaCgodmFsdWU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25Qcm9tb3Rpb24gPSB0cmFuc2FjdGlvblByb21vdGlvbiArIHZhbHVlLlNhdmluZztcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIG9ialsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9IG9iai5FZmZlY3RpdmVOZXRWYWx1ZSArIHRyYW5zYWN0aW9uUHJvbW90aW9uO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gb2JqO1xyXG4gICAgfVxyXG5cclxuICAgIGdldFNhdmluZyhwcmljZSxwcm9tb3Rpb25BbW91bnQpOiBhbnkge1xyXG4gICAgICAgIGxldCBTYXZpbmcgPSAocHJpY2UqcHJvbW90aW9uQW1vdW50KS90aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0U3VtbWFyeS5zYWxlVG90YWw7XHJcbiAgICAgICAgcmV0dXJuIFNhdmluZztcclxuICAgIH1cclxuXHJcbiAgICBnZXRMaW5lTnVtYmVyKHZhbHVlOiBhbnksZGlzY291bnRBbW91bnQ6c3RyaW5nICl7XHJcbiAgICAgICAgbGV0IGxpbmVOdW1iZXI7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJqT2JqZWN0WydCYXNrZXREaXNjb3VudCddLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLnJqT2JqZWN0WydCYXNrZXREaXNjb3VudCddW2ldO1xyXG4gICAgICAgICAgICBpZiggdmFsdWUucmVhc29uQ29kZSA9PT0gZWxlbWVudC5SZWFzb25Db2RlSUQgJiYgZGlzY291bnRBbW91bnQgPT09IGVsZW1lbnQuTmV0VmFsdWUpe1xyXG4gICAgICAgICAgICAgICAgbGluZU51bWJlciA9IGVsZW1lbnQuTGluZU51bWJlcjtcclxuICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsaW5lTnVtYmVyOyAgICAgICAgXHJcbiAgICB9XHJcblxyXG5cclxuICAgIGdldERpc2NvdW50ZWRWYWx1ZShwcmljZTphbnkgLGRpc2NvdW50QW1vdW50OmFueSApIHtcclxuICAgICAgICBsZXQgRGlzY291bnRlZFZhbHVlID0oKHByaWNlICogZGlzY291bnRBbW91bnQpL3RoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXRTdW1tYXJ5LnNhbGVUb3RhbCkqMTAwIDtcclxuICAgICAgICByZXR1cm4gRGlzY291bnRlZFZhbHVlO1xyXG4gICAgfVxyXG5cclxuICAgIGdldE9yaWdpbmFsVGF4KGVsZW1lbnQ6IFRQcm9kdWN0LCBWQVQpIHtcclxuICAgICAgICBsZXQgcHJpY2ViZWZvcmV0YXggPSAoZWxlbWVudC5wcmljZSAqIDEwMCkvKDEwMCArIFZBVCApXHJcbiAgICAgICAgbGV0IG9yaWdpbmFsdGF4PSBlbGVtZW50LnByaWNlIC0gcHJpY2ViZWZvcmV0YXhcclxuICAgICAgICByZXR1cm4gb3JpZ2luYWx0YXg7XHJcbiAgICB9XHJcblxyXG4gICAgY29udmVydFRvU3RyaW5nKHZhbHVlOiBhbnkpIHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICB2YWx1ZSA9IEpTT04uc3RyaW5naWZ5KHZhbHVlKTtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyh2YWx1ZSwgJ2NhbiBub3QgYmUgY29udmVydGVkIGluIHN0cmluZycsIGUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBnZW5lcmF0ZUR5bmFtaWNTdG9ja0xvb2tVcCgpIHtcclxuICAgICAgICBsZXQgeCA9ICcwJztcclxuICAgICAgICB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQuYmFza2V0LnByb2R1Y3RzLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoZWxlbWVudC5kZWxpdmVyeU1ldGhvZCA9PT0gJzEnIHx8IGVsZW1lbnQuZGVsaXZlcnlNZXRob2QgPT09ICcyJykge1xyXG4gICAgICAgICAgICAgICAgeCA9ICcxJztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB4O1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGdldEF0dHJpYnV0ZXMoKXtcclxuICAgIC8vICAgICBsZXQgbmFtZTogc3RyaW5nIHwgYW55W10gPSBbXVxyXG4gICAgLy8gICAgIHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC5iYXNrZXQucHJvZHVjdHMuZm9yRWFjaCgoZWxlbWVudDogYW55KSA9PiB7XHJcbiAgICAvLyAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuYXR0cmlidXRlcyAmJiBlbGVtZW50LmF0dHJpYnV0ZXMubGVuZ3RoID4gMCkge1xyXG4gICAgLy8gICAgICAgICAgICAgbmFtZSA9IGVsZW1lbnQuYXR0cmlidXRlcy5maWx0ZXIoKHg6IGFueSkgPT4geC5uYW1lLnRvVXBwZXJDYXNlKCkgPT09IGVsZW1lbnQubmFtZS50b1VwcGVyQ2FzZSgpKTtcclxuICAgIC8vICAgICAgICAgfVxyXG4gICAgLy8gICAgIH0pO1xyXG4gICAgLy8gICAgIGlmIChuYW1lLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIG5hbWVbMF0udmFsdWVcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyAgICAgZWxzZXtcclxuICAgIC8vICAgICAgICAgcmV0dXJuIFwiXCJcclxuICAgIC8vICAgICB9XHJcbiAgICAvLyB9XHJcblxyXG4gICAgLy8gZ2V0Q2FyZWdvcmllcyhlbGVtZW50KSB7XHJcbiAgICAvLyAgICAgbGV0IE1NR3JvdXBJZCA9IFwiIFwiO1xyXG4gICAgLy8gICAgIGlmIChlbGVtZW50LmNhdGVnb3JpZXMgJiYgZWxlbWVudC5jYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcclxuICAgIC8vICAgICAgICAgbGV0IGNhdGVnb3JpZXMgPSBlbGVtZW50LmNhdGVnb3JpZXMuZmlsdGVyKCh4KSA9PiB4LnBhcmVudElkICE9ICcnKTtcclxuICAgIC8vICAgICAgICAgbGV0IHZhbHVlID0gY2F0ZWdvcmllcy5maWx0ZXIoKHgpID0+IHguaWQgIT0geC5wYXJlbnRJZCk7XHJcbiAgICAvLyAgICAgICAgIE1NR3JvdXBJZCA9IHZhbHVlWzBdLm5hbWU7XHJcbiAgICAvLyAgICAgfVxyXG4gICAgLy8gICAgIHJldHVybiBNTUdyb3VwSWQ7XHJcbiAgICAvLyB9XHJcblxyXG4gICAgZ2V0RGF0ZShkYXRlOnN0cmluZyl7XHJcbiAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuZ2VuZXJhdGVUaW1lem9uZW9mZnNldChkYXRlKSAqIC0xO1xyXG4gICAgICAgIGxldCBvZmZzZXRIb3VycyA9IE1hdGguYWJzKE1hdGguZmxvb3Iob2Zmc2V0IC8gNjApKTsgICAgICAgIFxyXG5cdCAgICBsZXQgb2Zmc2V0TWludXRlcyA9IE1hdGguYWJzKG9mZnNldCkgLSBvZmZzZXRIb3VycyAqIDYwO1xyXG5cclxuICAgICAgICBsZXQgb2Zmc2V0U2lnbiA9ICcrJztcclxuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xyXG4gICAgICAgICAgICBvZmZzZXRTaWduID0gJy0nO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGV0IG5ld2RhdGUgPSBkYXRlLnN1YnN0cmluZygwLDE5KTtcclxuICAgICAgICBjb25zdCB4ID0gKG5ld2RhdGUrIG9mZnNldFNpZ24gK1N0cmluZyhvZmZzZXRIb3VycykucGFkU3RhcnQoMiwgJzAnKSsnOicrU3RyaW5nKG9mZnNldE1pbnV0ZXMpLnBhZFN0YXJ0KDIsICcwJykpLnRvU3RyaW5nKCk7XHJcbiAgICAgICAgcmV0dXJuIHg7ICAgICAgICBcclxuICAgIH1cclxuICAgIFxyXG4gICAgZ2V0VHJhbnNhY3Rpb25Qcm9tb3Rpb24odHJhbnNhY3Rpb25Qcm9tb3Rpb24pe1xyXG4gICAgICAgIGlmKHRyYW5zYWN0aW9uUHJvbW90aW9uICYmIHRyYW5zYWN0aW9uUHJvbW90aW9uLmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ10gPSB7fTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydYTUxTY2hlbWFWZXJzaW9uJ10gPSB0aGlzLnhtbFNjaGVtYVZlcnNpb247XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnTGluZU51bWJlciddID0gdGhpcy5nZW5lcmF0ZUxpbmVOdW1iZXIoKTtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydOZXRWYWx1ZSddID0gIHRoaXMucmVtb3ZlRGVjaW1hbCh0cmFuc2FjdGlvblByb21vdGlvblswXS5wcm9tb3Rpb25MaW5lUHJpY2UpICogLTE7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRWZmZWN0aXZlTmV0VmFsdWUnXSA9IHRoaXMucmVtb3ZlRGVjaW1hbCh0cmFuc2FjdGlvblByb21vdGlvblswXS5wcm9tb3Rpb25MaW5lUHJpY2UpICogLTE7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGVzY3JpcHRpb24nXSA9IHRyYW5zYWN0aW9uUHJvbW90aW9uWzBdLnByb21vdGlvbkluZm87XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGV2aWNlSUQnXSA9IHRoaXMuZGV2aWNlSWQ7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnVXNlcklEJ10gPSB0aGlzLnRyYW5zYWN0aW9uRG9jdW1lbnQudXNlck5hbWU7XHJcbiAgICAgICAgICAgIHRoaXMucmpPYmplY3RbJ1Byb21vVm91Y2hlckl0ZW0nXVsnRGF0ZVRpbWVDcmVhdGVkJ10gPSB0aGlzLmNyZWF0ZWRBdDtcclxuICAgICAgICAgICAgdGhpcy5yak9iamVjdFsnUHJvbW9Wb3VjaGVySXRlbSddWydQcm9kdWN0SWQnXSA9IFwiXCI7IC8vdG9kb1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ1NlcmlhbE51bWJlciddID0gXCJcIiA7IC8vdG9kb1xyXG4gICAgICAgICAgICB0aGlzLnJqT2JqZWN0WydQcm9tb1ZvdWNoZXJJdGVtJ11bJ01NR3JvdXBJZCddID0gXCJcIjtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGdldFF1YW50aXR5KGVsZW1lbnQ6IGFueSkge1xyXG4gICAgICAgIGxldCBxdWFudGl0eVxyXG4gICAgICAgIGlmKHRoaXMudHJhbnNhY3Rpb25Eb2N1bWVudC51bnJlZmVyZW5jZWRSZWZ1bmQpe1xyXG4gICAgICAgICAgICBxdWFudGl0eSA9IGVsZW1lbnRbJ3F1YW50aXR5J10gPCAwID8gZWxlbWVudFsncXVhbnRpdHknXSA6ICgtZWxlbWVudFsncXVhbnRpdHknXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2V7XHJcbiAgICAgICAgICAgIHF1YW50aXR5ID0gZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddIDwgMCA/IGVsZW1lbnRbJ3JlZnVuZGVkUXVhbnRpdHknXSA6ICgtZWxlbWVudFsncmVmdW5kZWRRdWFudGl0eSddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHF1YW50aXR5O1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
|