client-core-services 1.0.0
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/README.md +24 -0
- package/esm2020/client-core-services.mjs +5 -0
- package/esm2020/lib/my-lib.module.mjs +98 -0
- package/esm2020/lib/services/api/api-call/api-call.service.mjs +766 -0
- package/esm2020/lib/services/api/api-call-responce/api-call-responce.service.mjs +191 -0
- package/esm2020/lib/services/api/api.service.mjs +611 -0
- package/esm2020/lib/services/api/auth/auth-guard.service.mjs +37 -0
- package/esm2020/lib/services/api/auth/auth.service.mjs +500 -0
- package/esm2020/lib/services/api/aws-secret-manager/aws-secret-manager.service.mjs +78 -0
- package/esm2020/lib/services/api/common-api/common-api.service.mjs +97 -0
- package/esm2020/lib/services/api/doc-api/doc-api.service.mjs +221 -0
- package/esm2020/lib/services/api/public-api/public-api.service.mjs +37 -0
- package/esm2020/lib/services/chart/chart.service.mjs +166 -0
- package/esm2020/lib/services/check-if/check-if.service.mjs +830 -0
- package/esm2020/lib/services/common-utils/common-function.service.mjs +1277 -0
- package/esm2020/lib/services/common-utils/core-function/core-function.service.mjs +283 -0
- package/esm2020/lib/services/customvalidation/customvalidation.service.mjs +202 -0
- package/esm2020/lib/services/data-share/auth-data-share/auth-data-share.service.mjs +70 -0
- package/esm2020/lib/services/data-share/common-app-data-share/common-app-data-share.service.mjs +82 -0
- package/esm2020/lib/services/data-share/data-share.service.mjs +370 -0
- package/esm2020/lib/services/data-share/doc-data-share/doc-data-share.service.mjs +81 -0
- package/esm2020/lib/services/data-share/public-data-share/public-data-share.service.mjs +25 -0
- package/esm2020/lib/services/download/download.service.mjs +151 -0
- package/esm2020/lib/services/encryption/encryption.service.mjs +20 -0
- package/esm2020/lib/services/env/env.service.mjs +232 -0
- package/esm2020/lib/services/env/serverHostList.mjs +56 -0
- package/esm2020/lib/services/fileHandler/file-handler.service.mjs +136 -0
- package/esm2020/lib/services/form/form-control/form-control.service.mjs +654 -0
- package/esm2020/lib/services/form/form-creation/form-creation.service.mjs +880 -0
- package/esm2020/lib/services/form/form-value/form-value.service.mjs +464 -0
- package/esm2020/lib/services/form/multiple-form/multiple-form.service.mjs +346 -0
- package/esm2020/lib/services/grid/grid-common-function/grid-common-function.service.mjs +875 -0
- package/esm2020/lib/services/grid/grid-selection/grid-selection.service.mjs +84 -0
- package/esm2020/lib/services/lims-calculations/lims-calculations.service.mjs +2304 -0
- package/esm2020/lib/services/loader/loader.service.mjs +17 -0
- package/esm2020/lib/services/menu-or-module-common/menu-or-module-common.service.mjs +558 -0
- package/esm2020/lib/services/model/model.service.mjs +30 -0
- package/esm2020/lib/services/notify/notification.service.mjs +84 -0
- package/esm2020/lib/services/operator/operator.service.mjs +58 -0
- package/esm2020/lib/services/permission/permission.service.mjs +88 -0
- package/esm2020/lib/services/router/router.service.mjs +78 -0
- package/esm2020/lib/services/storage/cookies.service.mjs +56 -0
- package/esm2020/lib/services/storage/storage.service.mjs +749 -0
- package/esm2020/lib/services/tree-component/interface.mjs +6 -0
- package/esm2020/lib/services/tree-component/tree-component.service.mjs +394 -0
- package/esm2020/lib/services/userPrefrence/user-prefrence.service.mjs +767 -0
- package/esm2020/lib/services/voice-recognition/voice-recognition.service.mjs +97 -0
- package/esm2020/lib/shared/configuration/config.mjs +76 -0
- package/esm2020/lib/shared/configuration/editor-config.mjs +121 -0
- package/esm2020/lib/shared/enums/common.enum.mjs +18 -0
- package/esm2020/lib/shared/enums/config.enum.mjs +56 -0
- package/esm2020/lib/shared/enums/end-point.enum.mjs +69 -0
- package/esm2020/lib/shared/enums/flags.enum.mjs +20 -0
- package/esm2020/lib/shared/enums/keycodes.enum.mjs +122 -0
- package/esm2020/lib/shared/enums/operator_type.enum.mjs +13 -0
- package/esm2020/lib/shared/enums/storage-token-status.enum.mjs +10 -0
- package/esm2020/lib/shared/platform.mjs +2 -0
- package/esm2020/public-api.mjs +53 -0
- package/fesm2015/client-core-services.mjs +15487 -0
- package/fesm2015/client-core-services.mjs.map +1 -0
- package/fesm2020/client-core-services.mjs +15482 -0
- package/fesm2020/client-core-services.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/my-lib.module.d.ts +18 -0
- package/lib/services/api/api-call/api-call.service.d.ts +60 -0
- package/lib/services/api/api-call-responce/api-call-responce.service.d.ts +43 -0
- package/lib/services/api/api.service.d.ts +88 -0
- package/lib/services/api/auth/auth-guard.service.d.ts +13 -0
- package/lib/services/api/auth/auth.service.d.ts +50 -0
- package/lib/services/api/aws-secret-manager/aws-secret-manager.service.d.ts +22 -0
- package/lib/services/api/common-api/common-api.service.d.ts +22 -0
- package/lib/services/api/doc-api/doc-api.service.d.ts +35 -0
- package/lib/services/api/public-api/public-api.service.d.ts +14 -0
- package/lib/services/chart/chart.service.d.ts +21 -0
- package/lib/services/check-if/check-if.service.d.ts +50 -0
- package/lib/services/common-utils/common-function.service.d.ts +84 -0
- package/lib/services/common-utils/core-function/core-function.service.d.ts +21 -0
- package/lib/services/customvalidation/customvalidation.service.d.ts +21 -0
- package/lib/services/data-share/auth-data-share/auth-data-share.service.d.ts +33 -0
- package/lib/services/data-share/common-app-data-share/common-app-data-share.service.d.ts +36 -0
- package/lib/services/data-share/data-share.service.d.ts +174 -0
- package/lib/services/data-share/doc-data-share/doc-data-share.service.d.ts +33 -0
- package/lib/services/data-share/public-data-share/public-data-share.service.d.ts +12 -0
- package/lib/services/download/download.service.d.ts +35 -0
- package/lib/services/encryption/encryption.service.d.ts +8 -0
- package/lib/services/env/env.service.d.ts +44 -0
- package/lib/services/env/serverHostList.d.ts +9 -0
- package/lib/services/fileHandler/file-handler.service.d.ts +17 -0
- package/lib/services/form/form-control/form-control.service.d.ts +44 -0
- package/lib/services/form/form-creation/form-creation.service.d.ts +41 -0
- package/lib/services/form/form-value/form-value.service.d.ts +32 -0
- package/lib/services/form/multiple-form/multiple-form.service.d.ts +54 -0
- package/lib/services/grid/grid-common-function/grid-common-function.service.d.ts +74 -0
- package/lib/services/grid/grid-selection/grid-selection.service.d.ts +16 -0
- package/lib/services/lims-calculations/lims-calculations.service.d.ts +87 -0
- package/lib/services/loader/loader.service.d.ts +8 -0
- package/lib/services/menu-or-module-common/menu-or-module-common.service.d.ts +59 -0
- package/lib/services/model/model.service.d.ts +11 -0
- package/lib/services/notify/notification.service.d.ts +22 -0
- package/lib/services/operator/operator.service.d.ts +27 -0
- package/lib/services/permission/permission.service.d.ts +18 -0
- package/lib/services/router/router.service.d.ts +14 -0
- package/lib/services/storage/cookies.service.d.ts +11 -0
- package/lib/services/storage/storage.service.d.ts +132 -0
- package/lib/services/tree-component/interface.d.ts +13 -0
- package/lib/services/tree-component/tree-component.service.d.ts +38 -0
- package/lib/services/userPrefrence/user-prefrence.service.d.ts +75 -0
- package/lib/services/voice-recognition/voice-recognition.service.d.ts +36 -0
- package/lib/shared/configuration/config.d.ts +144 -0
- package/lib/shared/configuration/editor-config.d.ts +72 -0
- package/lib/shared/enums/common.enum.d.ts +16 -0
- package/lib/shared/enums/config.enum.d.ts +54 -0
- package/lib/shared/enums/end-point.enum.d.ts +66 -0
- package/lib/shared/enums/flags.enum.d.ts +18 -0
- package/lib/shared/enums/keycodes.enum.d.ts +120 -0
- package/lib/shared/enums/operator_type.enum.d.ts +9 -0
- package/lib/shared/enums/storage-token-status.enum.d.ts +8 -0
- package/lib/shared/platform.d.ts +1 -0
- package/package.json +40 -0
- package/public-api.d.ts +49 -0
|
@@ -0,0 +1,2304 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { UntypedFormControl } from '@angular/forms';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../../services/common-utils/common-function.service";
|
|
5
|
+
import * as i2 from "../common-utils/core-function/core-function.service";
|
|
6
|
+
import * as i3 from "../notify/notification.service";
|
|
7
|
+
import * as i4 from "../storage/storage.service";
|
|
8
|
+
import * as i5 from "./../api/api-call/api-call.service";
|
|
9
|
+
export class LimsCalculationsService {
|
|
10
|
+
constructor(commonFunctionService, coreFunctionService, notificationService, storageService, apiCallService) {
|
|
11
|
+
this.commonFunctionService = commonFunctionService;
|
|
12
|
+
this.coreFunctionService = coreFunctionService;
|
|
13
|
+
this.notificationService = notificationService;
|
|
14
|
+
this.storageService = storageService;
|
|
15
|
+
this.apiCallService = apiCallService;
|
|
16
|
+
}
|
|
17
|
+
calculateBalanceAmountEngLetter(tamplateFormValue, multiFormValue) {
|
|
18
|
+
let list = tamplateFormValue['billingPlan'];
|
|
19
|
+
let fees = +multiFormValue['totalFees'];
|
|
20
|
+
let milestoneAchievedtotal = 0;
|
|
21
|
+
let total = 0;
|
|
22
|
+
if (list != null && list != undefined) {
|
|
23
|
+
for (let i = 0; i < list.length; i++) {
|
|
24
|
+
milestoneAchievedtotal += list[i]['feesOnMilestoneAchieved'];
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
total = milestoneAchievedtotal + tamplateFormValue['feesOnMilestoneAchieved'];
|
|
28
|
+
let remaningAmount = fees - total;
|
|
29
|
+
let obj = {
|
|
30
|
+
balanceAmount: remaningAmount
|
|
31
|
+
};
|
|
32
|
+
return obj;
|
|
33
|
+
}
|
|
34
|
+
getTaWithCalculation(value) {
|
|
35
|
+
let localTas = 0;
|
|
36
|
+
let claimSheet = value.claimSheet;
|
|
37
|
+
let priceInKm = claimSheet.priceInKm;
|
|
38
|
+
let distanceInkm = claimSheet.distanceInKm;
|
|
39
|
+
localTas = priceInKm * distanceInkm;
|
|
40
|
+
let obj1 = {
|
|
41
|
+
localTa: localTas
|
|
42
|
+
};
|
|
43
|
+
let obj = {
|
|
44
|
+
claimSheet: obj1
|
|
45
|
+
};
|
|
46
|
+
return obj;
|
|
47
|
+
}
|
|
48
|
+
calculateTotalAmount(formValue) {
|
|
49
|
+
let list = formValue['claimSheet'];
|
|
50
|
+
let total = 0;
|
|
51
|
+
for (let i = 0; i < list.length; i++) {
|
|
52
|
+
total += list[i]['totalForTheDay'];
|
|
53
|
+
}
|
|
54
|
+
let obj = {
|
|
55
|
+
totalAmountOfTravelCliam: total
|
|
56
|
+
};
|
|
57
|
+
return obj;
|
|
58
|
+
}
|
|
59
|
+
calculateTotalFair(value) {
|
|
60
|
+
let totalFair = 0;
|
|
61
|
+
let curValue = {};
|
|
62
|
+
let checkClaimSheet = false;
|
|
63
|
+
let calculateObject = {
|
|
64
|
+
totalForTheDay: 0
|
|
65
|
+
};
|
|
66
|
+
if (value && value.claimSheet) {
|
|
67
|
+
curValue = value.claimSheet;
|
|
68
|
+
checkClaimSheet = true;
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
curValue = value;
|
|
72
|
+
}
|
|
73
|
+
let localTa = curValue.localTa;
|
|
74
|
+
let travelFair = curValue.travelFare;
|
|
75
|
+
let dailyAllowance = curValue.dailyAllowance;
|
|
76
|
+
let food = curValue.food;
|
|
77
|
+
let hotel = curValue.hotel;
|
|
78
|
+
let parking = curValue.parking;
|
|
79
|
+
let toolCharge = curValue.tollCharge;
|
|
80
|
+
let miscellaneous = curValue.miscellaneous;
|
|
81
|
+
totalFair = (+travelFair) + (+localTa) + (+dailyAllowance) + (+food) + (+hotel) + (+parking) + (+toolCharge) + (+miscellaneous);
|
|
82
|
+
calculateObject.totalForTheDay = totalFair;
|
|
83
|
+
if (checkClaimSheet) {
|
|
84
|
+
return {
|
|
85
|
+
claimSheet: calculateObject
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
return calculateObject;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
buggetForcastCalc(templateForm) {
|
|
93
|
+
let templateValue = templateForm.getRawValue();
|
|
94
|
+
let actualCurYr = templateValue.actual_current;
|
|
95
|
+
let actualLastYr = templateValue.actuals;
|
|
96
|
+
let budget = templateValue.this_year;
|
|
97
|
+
let growthpers = {};
|
|
98
|
+
let budgetpers = {};
|
|
99
|
+
let value = [];
|
|
100
|
+
let value1 = [];
|
|
101
|
+
Object.keys(actualCurYr).forEach(key => {
|
|
102
|
+
let growthper = 0;
|
|
103
|
+
let budgetper = 0;
|
|
104
|
+
let actualCurYrMonth = actualCurYr[key];
|
|
105
|
+
let actualLastYrMonth = actualLastYr[key];
|
|
106
|
+
if (actualLastYrMonth != 0) {
|
|
107
|
+
growthper = actualCurYrMonth / actualLastYrMonth;
|
|
108
|
+
}
|
|
109
|
+
let budgetcurYrMonth = budget[key];
|
|
110
|
+
if (budgetcurYrMonth != 0) {
|
|
111
|
+
budgetper = actualCurYrMonth / budgetcurYrMonth;
|
|
112
|
+
}
|
|
113
|
+
growthpers[key] = growthper;
|
|
114
|
+
let obj = {
|
|
115
|
+
field: key, value: growthpers[key]
|
|
116
|
+
};
|
|
117
|
+
value.push(obj);
|
|
118
|
+
budgetpers[key] = budgetper;
|
|
119
|
+
let obj1 = {
|
|
120
|
+
field: key, value: budgetpers[key]
|
|
121
|
+
};
|
|
122
|
+
value1.push(obj1);
|
|
123
|
+
});
|
|
124
|
+
const fieldWithValueforgrowth = {
|
|
125
|
+
field: 'growth_per', value: value
|
|
126
|
+
};
|
|
127
|
+
fieldWithValueforgrowth.value.forEach((element) => {
|
|
128
|
+
templateForm.controls[fieldWithValueforgrowth.field].controls[element.field].patchValue(element.value);
|
|
129
|
+
});
|
|
130
|
+
const fieldWithValueforBudget = {
|
|
131
|
+
field: 'budget_per', value: value1
|
|
132
|
+
};
|
|
133
|
+
fieldWithValueforBudget.value.forEach((element) => {
|
|
134
|
+
templateForm.controls[fieldWithValueforBudget.field].controls[element.field].patchValue(element.value);
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
calculateAutoEffRate(data) {
|
|
138
|
+
data.forEach((element) => {
|
|
139
|
+
element["per_sample_net_rate"] = element["no_of_samples"] * element["quotation_effective_rate"];
|
|
140
|
+
});
|
|
141
|
+
return data;
|
|
142
|
+
}
|
|
143
|
+
calculate_next_calibration_due_date(templateForm) {
|
|
144
|
+
const objectValue = templateForm.getRawValue();
|
|
145
|
+
let calibration_date = objectValue['calibration_date'];
|
|
146
|
+
let calibration_frequency = objectValue['calibration_frequency'];
|
|
147
|
+
if (calibration_date != null && calibration_date !== undefined && calibration_frequency != null && calibration_frequency !== undefined && calibration_date !== "" && calibration_frequency !== "") {
|
|
148
|
+
let date = new Date();
|
|
149
|
+
date.setDate(calibration_date.getDate() + calibration_frequency);
|
|
150
|
+
templateForm.controls['next_date'].setValue(date);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
calculation_of_script_for_tds(object, field) {
|
|
154
|
+
const staticModal = [];
|
|
155
|
+
staticModal.push(this.apiCallService.getPaylodWithCriteria('QTMP:CALCULATION_SCRIPT', field.onchange_call_back_field, field.onchange_api_params_criteria, object));
|
|
156
|
+
staticModal[0]['data'] = object;
|
|
157
|
+
return staticModal;
|
|
158
|
+
}
|
|
159
|
+
getDecimalAmount(value) {
|
|
160
|
+
let decimaldigitNo = this.storageService.getApplicationSetting().roundValueNoOfDigits;
|
|
161
|
+
let decimalno = 2;
|
|
162
|
+
if (decimaldigitNo != undefined && decimaldigitNo != null) {
|
|
163
|
+
decimalno = decimaldigitNo;
|
|
164
|
+
}
|
|
165
|
+
if (typeof (value) == 'number' && value != undefined && value != null) {
|
|
166
|
+
return Number(value.toFixed(decimalno));
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
legacyQuotationParameterCalculation(data, fieldName) {
|
|
173
|
+
let quantity = 0;
|
|
174
|
+
let discount_percent = 0;
|
|
175
|
+
let cost_rate = 0;
|
|
176
|
+
let net_amount = 0;
|
|
177
|
+
let param_quantom = 0;
|
|
178
|
+
let Base_quotation_rate = 0;
|
|
179
|
+
let incoming_field = fieldName.field_name;
|
|
180
|
+
let gross_amount = 0;
|
|
181
|
+
let dis_amt = 0;
|
|
182
|
+
switch (incoming_field) {
|
|
183
|
+
case "claim_unit":
|
|
184
|
+
case "claim_percent":
|
|
185
|
+
this.calculate_pharma_claim_values(data);
|
|
186
|
+
break;
|
|
187
|
+
case "parameter_quantum":
|
|
188
|
+
if (data.parameter_quantum) {
|
|
189
|
+
data['quantum_rate'] = (+data.quotation_rate) * (+data.parameter_quantum);
|
|
190
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
191
|
+
net_amount = +data.quotation_effective_rate;
|
|
192
|
+
if (data.discount_percent) {
|
|
193
|
+
let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
194
|
+
data['discount_amount'] = discount;
|
|
195
|
+
net_amount = (+data.quotation_effective_rate) - discount;
|
|
196
|
+
}
|
|
197
|
+
data['net_amount'] = net_amount;
|
|
198
|
+
}
|
|
199
|
+
break;
|
|
200
|
+
case "qty":
|
|
201
|
+
if (data.qty) {
|
|
202
|
+
if (data.branch && data.branch.name && data.branch.name === "Pune") {
|
|
203
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.offer_rate);
|
|
207
|
+
}
|
|
208
|
+
if (data.no_of_injection > 0) {
|
|
209
|
+
// this.calculateParameterAmtOnInjection(data);
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
net_amount = +data.quotation_effective_rate;
|
|
213
|
+
if (data.discount_percent) {
|
|
214
|
+
let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
215
|
+
data['discount_amount'] = discount;
|
|
216
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
|
|
217
|
+
}
|
|
218
|
+
data['net_amount'] = net_amount;
|
|
219
|
+
data['total'] = +data.quotation_effective_rate;
|
|
220
|
+
data['qty'] = data.qty;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
break;
|
|
224
|
+
case "discount_percent":
|
|
225
|
+
if (!data.discount_percent) {
|
|
226
|
+
data.discount_percent = 0;
|
|
227
|
+
}
|
|
228
|
+
if (data.no_of_injection > 0) {
|
|
229
|
+
// this.calculateParameterAmtOnInjection(data);
|
|
230
|
+
}
|
|
231
|
+
else if (data.branch && data.branch.name && data.branch.name === "Pune") {
|
|
232
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.offer_rate);
|
|
236
|
+
}
|
|
237
|
+
net_amount = +data.quotation_effective_rate;
|
|
238
|
+
let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+data.discount_percent)) / 100);
|
|
239
|
+
data['discount_amount'] = discount;
|
|
240
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
|
|
241
|
+
data['discount_percent'] = data.discount_percent;
|
|
242
|
+
data['net_amount'] = net_amount;
|
|
243
|
+
data['total'] = +data.quotation_effective_rate;
|
|
244
|
+
data['qty'] = data.qty;
|
|
245
|
+
data['discount_percent'] = +data['discount_percent'];
|
|
246
|
+
break;
|
|
247
|
+
case "offer_rate":
|
|
248
|
+
if (data.no_of_injection > 0) {
|
|
249
|
+
if (data.offer_rate) {
|
|
250
|
+
data["rate_per_injection"] = data.offer_rate;
|
|
251
|
+
}
|
|
252
|
+
// this.calculateParameterAmtOnInjection(data);
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
if (data.offer_rate) {
|
|
256
|
+
gross_amount = this.getDecimalAmount(data.offer_rate * data.qty);
|
|
257
|
+
if (data.discount_percent && data.discount_percent > 0) {
|
|
258
|
+
dis_amt = this.getDecimalAmount((gross_amount * data.discount_percent) / 100);
|
|
259
|
+
}
|
|
260
|
+
net_amount = gross_amount - dis_amt;
|
|
261
|
+
}
|
|
262
|
+
data['net_amount'] = net_amount;
|
|
263
|
+
data['discount_amount'] = dis_amt;
|
|
264
|
+
data['total'] = gross_amount;
|
|
265
|
+
data['quotation_effective_rate'] = gross_amount;
|
|
266
|
+
}
|
|
267
|
+
break;
|
|
268
|
+
case "discount_amount":
|
|
269
|
+
if ((data.discount_amount == 0) || (data.discount_amount)) {
|
|
270
|
+
net_amount = (+data.quotation_effective_rate) - (+data.discount_amount);
|
|
271
|
+
let discount_per = this.getDecimalAmount(((+data.discount_amount) * 100) / (+data.quotation_effective_rate));
|
|
272
|
+
data['net_amount'] = net_amount;
|
|
273
|
+
data['discount_percent'] = discount_per;
|
|
274
|
+
data['discount_amount'] = +data['discount_amount'];
|
|
275
|
+
}
|
|
276
|
+
break;
|
|
277
|
+
}
|
|
278
|
+
if (data['qty'] > 0) {
|
|
279
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
|
|
280
|
+
}
|
|
281
|
+
let amountFields = [
|
|
282
|
+
'quotation_effective_rate',
|
|
283
|
+
'discount_amount',
|
|
284
|
+
'discount_percent',
|
|
285
|
+
'net_amount',
|
|
286
|
+
'total',
|
|
287
|
+
'per_sample_net_rate'
|
|
288
|
+
];
|
|
289
|
+
amountFields.forEach(column => {
|
|
290
|
+
data[column] = this.getDecimalAmount(data[column]);
|
|
291
|
+
});
|
|
292
|
+
}
|
|
293
|
+
calculate_pharma_claim_values(new_element) {
|
|
294
|
+
if (new_element.claim_dependent && !isNaN(new_element.claim_percent)) {
|
|
295
|
+
if (!isNaN(+new_element.limit_from)) {
|
|
296
|
+
if (this.coreFunctionService.isNotBlank(new_element.claim_percent)) {
|
|
297
|
+
new_element.claim_limit_from = (+new_element.limit_from) * (new_element.claim_percent) / 100;
|
|
298
|
+
if (new_element.claim_unit) {
|
|
299
|
+
new_element.claim_limit_from = new_element.claim_limit_from + " " + new_element.claim_unit;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else {
|
|
303
|
+
new_element.claim_limit_from = new_element.limit_from;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
if (!isNaN(+new_element.limit_to)) {
|
|
307
|
+
if (this.coreFunctionService.isNotBlank(new_element.claim_percent)) {
|
|
308
|
+
new_element.claim_limit_to = (+new_element.limit_to) * (new_element.claim_percent) / 100;
|
|
309
|
+
if (new_element.claim_unit) {
|
|
310
|
+
new_element.claim_limit_to = new_element.claim_limit_to + " " + new_element.claim_unit;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
new_element.claim_limit_to = new_element.limit_to;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
calculatePharamaParameterAmount(data, offer_rate, quantity, field_name) {
|
|
320
|
+
let gross_amount = this.calculateParameterAmtOnInjection(data, data["rate_per_injection"], quantity);
|
|
321
|
+
let effectiveTotal = this.calculateParameterAmtOnInjection(data, offer_rate, quantity);
|
|
322
|
+
let dis_amt = gross_amount - effectiveTotal;
|
|
323
|
+
switch (field_name) {
|
|
324
|
+
case 'discount_amount':
|
|
325
|
+
effectiveTotal = gross_amount - data['discount_amount'];
|
|
326
|
+
dis_amt = data['discount_amount'];
|
|
327
|
+
break;
|
|
328
|
+
default:
|
|
329
|
+
}
|
|
330
|
+
let discount_percent = 0;
|
|
331
|
+
if (gross_amount > 0) {
|
|
332
|
+
discount_percent = (dis_amt / gross_amount) * 100;
|
|
333
|
+
}
|
|
334
|
+
else {
|
|
335
|
+
discount_percent = 0;
|
|
336
|
+
}
|
|
337
|
+
this.populateParameterAmount(data, effectiveTotal, discount_percent, dis_amt, quantity, gross_amount);
|
|
338
|
+
}
|
|
339
|
+
calculateParameterAmtOnInjection(data, rate, quantity) {
|
|
340
|
+
let totalInjection = data.no_of_injection;
|
|
341
|
+
if (!this.coreFunctionService.isNotBlank(totalInjection)) {
|
|
342
|
+
totalInjection = 0;
|
|
343
|
+
}
|
|
344
|
+
if (!this.coreFunctionService.isNotBlank(rate)) {
|
|
345
|
+
rate = 0;
|
|
346
|
+
}
|
|
347
|
+
let rate_per_injection = rate;
|
|
348
|
+
let totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
|
|
349
|
+
if (data.no_of_injection2 > 0) {
|
|
350
|
+
let no_of_injection2 = data.no_of_injection2;
|
|
351
|
+
if (quantity > 1 && no_of_injection2 > 0) {
|
|
352
|
+
totalInjection = this.getDecimalAmount(totalInjection + (quantity - 1) * no_of_injection2);
|
|
353
|
+
totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
else if (data.no_of_injection > 0 && data.no_of_injection2 <= 0) {
|
|
357
|
+
let no_of_injection = data.no_of_injection;
|
|
358
|
+
if (quantity > 1 && no_of_injection > 0) {
|
|
359
|
+
totalInjection = this.getDecimalAmount(totalInjection + (quantity - 1) * no_of_injection);
|
|
360
|
+
totalAmount = this.getDecimalAmount(totalInjection * rate_per_injection);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
else {
|
|
364
|
+
totalAmount = this.getDecimalAmount(quantity * totalInjection * rate_per_injection);
|
|
365
|
+
}
|
|
366
|
+
// data["quotation_effective_rate"]= totalAmount;
|
|
367
|
+
// data["total"] = totalAmount;
|
|
368
|
+
// data["discount_amount"] = this.getDecimalAmount((data.total* data.discount_percent)/100);
|
|
369
|
+
// data["net_amount"] = this.getDecimalAmount(data.total- data.discount_amount);
|
|
370
|
+
data["total_injection"] = totalInjection;
|
|
371
|
+
return totalAmount;
|
|
372
|
+
}
|
|
373
|
+
getDiscountPercentage(current_disount, discount_amount, gross_amount, quantity) {
|
|
374
|
+
if (quantity > 0 && gross_amount > 0) {
|
|
375
|
+
current_disount = discount_amount * 100 / gross_amount;
|
|
376
|
+
}
|
|
377
|
+
return current_disount;
|
|
378
|
+
}
|
|
379
|
+
calculateQuotationParameterAmountForAutomotiveLims(data, fieldName) {
|
|
380
|
+
let quantity = 0;
|
|
381
|
+
let discount_percent = 0;
|
|
382
|
+
let cost_rate = 0;
|
|
383
|
+
let net_amount = 0;
|
|
384
|
+
let param_quantom = 0;
|
|
385
|
+
let Base_quotation_rate = 0;
|
|
386
|
+
let incoming_field = fieldName;
|
|
387
|
+
let gross_amount = 0;
|
|
388
|
+
let dis_amt = 0;
|
|
389
|
+
switch (incoming_field) {
|
|
390
|
+
case "parameter_quantum":
|
|
391
|
+
let parameterQuantum = data.parameter_quantum;
|
|
392
|
+
if (!this.coreFunctionService.isNotBlank(parameterQuantum)) {
|
|
393
|
+
parameterQuantum = 0;
|
|
394
|
+
}
|
|
395
|
+
data['quantum_rate'] = (+data.quotation_rate) * (+parameterQuantum);
|
|
396
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
397
|
+
net_amount = +data.quotation_effective_rate;
|
|
398
|
+
if (data.discount_percent) {
|
|
399
|
+
let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
400
|
+
data['discount_amount'] = discount;
|
|
401
|
+
net_amount = (+data.quotation_effective_rate) - discount;
|
|
402
|
+
}
|
|
403
|
+
data['net_amount'] = net_amount;
|
|
404
|
+
break;
|
|
405
|
+
case "qty":
|
|
406
|
+
let quantity = data.qty;
|
|
407
|
+
if (!this.coreFunctionService.isNotBlank(quantity)) {
|
|
408
|
+
quantity = 0;
|
|
409
|
+
}
|
|
410
|
+
data['quotation_effective_rate'] = (+quantity) * (+data.quantum_rate);
|
|
411
|
+
if (data.discount_percent) {
|
|
412
|
+
let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
413
|
+
data['discount_amount'] = discount;
|
|
414
|
+
}
|
|
415
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - data['discount_amount']);
|
|
416
|
+
data['net_amount'] = net_amount;
|
|
417
|
+
data['total'] = +data.quotation_effective_rate;
|
|
418
|
+
data['qty'] = data.qty;
|
|
419
|
+
break;
|
|
420
|
+
case "discount_percent":
|
|
421
|
+
let discount_per = data.discount_percent;
|
|
422
|
+
if (!this.coreFunctionService.isNotBlank(discount_per)) {
|
|
423
|
+
discount_per = 0;
|
|
424
|
+
}
|
|
425
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
426
|
+
net_amount = +data.quotation_effective_rate;
|
|
427
|
+
let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+discount_per)) / 100);
|
|
428
|
+
data['discount_amount'] = discount;
|
|
429
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
|
|
430
|
+
data['net_amount'] = net_amount;
|
|
431
|
+
data['total'] = +data.quotation_effective_rate;
|
|
432
|
+
data['qty'] = data.qty;
|
|
433
|
+
data['discount_percent'] = +discount_per;
|
|
434
|
+
break;
|
|
435
|
+
case "discount_amount":
|
|
436
|
+
let discount_amt = data.discount_amount;
|
|
437
|
+
if (!this.coreFunctionService.isNotBlank(discount_amt)) {
|
|
438
|
+
discount_amt = 0;
|
|
439
|
+
}
|
|
440
|
+
net_amount = (+data.quotation_effective_rate) - (+discount_amt);
|
|
441
|
+
let discount_perc = this.getDecimalAmount(((+discount_amt) * 100) / (+data.quotation_effective_rate));
|
|
442
|
+
data['net_amount'] = net_amount;
|
|
443
|
+
data['discount_percent'] = discount_perc;
|
|
444
|
+
data['discount_amount'] = +data['discount_amount'];
|
|
445
|
+
break;
|
|
446
|
+
default:
|
|
447
|
+
}
|
|
448
|
+
if (data['qty'] > 0) {
|
|
449
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
|
|
450
|
+
}
|
|
451
|
+
else {
|
|
452
|
+
data['per_sample_net_rate'] = 0;
|
|
453
|
+
}
|
|
454
|
+
this.sanitizeParameterAmount(data);
|
|
455
|
+
}
|
|
456
|
+
sanitizeParameterAmount(data) {
|
|
457
|
+
let amountFields = [
|
|
458
|
+
'quotation_effective_rate',
|
|
459
|
+
'discount_amount',
|
|
460
|
+
'discount_percent',
|
|
461
|
+
'net_amount',
|
|
462
|
+
'total',
|
|
463
|
+
'per_sample_net_rate'
|
|
464
|
+
];
|
|
465
|
+
amountFields.forEach(column => {
|
|
466
|
+
data[column] = this.getDecimalAmount(data[column]);
|
|
467
|
+
if (typeof (data[column]) != 'number') {
|
|
468
|
+
data[column] = 0;
|
|
469
|
+
}
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
calculateQuotationParameterAmountForLims(data, fieldName) {
|
|
473
|
+
let quantity = 0;
|
|
474
|
+
let discount_percent = 0;
|
|
475
|
+
let cost_rate = 0;
|
|
476
|
+
let net_amount = 0;
|
|
477
|
+
let discount_amount = 0;
|
|
478
|
+
let param_quantom = 0;
|
|
479
|
+
let Base_quotation_rate = 0;
|
|
480
|
+
let incoming_field = fieldName;
|
|
481
|
+
let sale_rate = data['sale_rate'];
|
|
482
|
+
let gross_amount = 0;
|
|
483
|
+
let effectiveTotal = 0;
|
|
484
|
+
let dis_amt = 0;
|
|
485
|
+
quantity = data.qty;
|
|
486
|
+
if (!this.coreFunctionService.isNotBlank(quantity)) {
|
|
487
|
+
quantity = 0;
|
|
488
|
+
}
|
|
489
|
+
gross_amount = quantity * sale_rate;
|
|
490
|
+
switch (incoming_field) {
|
|
491
|
+
case "qty":
|
|
492
|
+
effectiveTotal = (+quantity) * (+data.offer_rate);
|
|
493
|
+
if (data.no_of_injection > 0) {
|
|
494
|
+
this.calculatePharamaParameterAmount(data, data.offer_rate, quantity);
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
dis_amt = gross_amount - effectiveTotal;
|
|
498
|
+
if (gross_amount > 0) {
|
|
499
|
+
discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
|
|
500
|
+
}
|
|
501
|
+
else {
|
|
502
|
+
discount_percent = 0;
|
|
503
|
+
}
|
|
504
|
+
net_amount = effectiveTotal;
|
|
505
|
+
this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
|
|
506
|
+
}
|
|
507
|
+
break;
|
|
508
|
+
case "discount_percent":
|
|
509
|
+
discount_percent = data.discount_percent;
|
|
510
|
+
if (!this.coreFunctionService.isNotBlank(discount_percent)) {
|
|
511
|
+
discount_percent = 0;
|
|
512
|
+
}
|
|
513
|
+
if (data.no_of_injection > 0) {
|
|
514
|
+
let offeringRate = data.rate_per_injection * (1 - discount_percent / 100);
|
|
515
|
+
this.calculatePharamaParameterAmount(data, offeringRate, quantity);
|
|
516
|
+
}
|
|
517
|
+
else {
|
|
518
|
+
dis_amt = this.getDecimalAmount(((+gross_amount) * (+discount_percent)) / 100);
|
|
519
|
+
net_amount = this.getDecimalAmount((+gross_amount) - dis_amt);
|
|
520
|
+
this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
|
|
521
|
+
}
|
|
522
|
+
break;
|
|
523
|
+
case "unit_price":
|
|
524
|
+
discount_percent = data.discount_percent;
|
|
525
|
+
if (!this.coreFunctionService.isNotBlank(discount_percent)) {
|
|
526
|
+
discount_percent = 0;
|
|
527
|
+
}
|
|
528
|
+
if (data.no_of_injection > 0) {
|
|
529
|
+
let offeringRate = data.rate_per_injection * (1 - discount_percent / 100);
|
|
530
|
+
this.calculatePharamaParameterAmount(data, offeringRate, quantity);
|
|
531
|
+
}
|
|
532
|
+
else {
|
|
533
|
+
dis_amt = this.getDecimalAmount(((+gross_amount) * (+discount_percent)) / 100);
|
|
534
|
+
net_amount = this.getDecimalAmount((+gross_amount) - dis_amt);
|
|
535
|
+
this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
|
|
536
|
+
}
|
|
537
|
+
break;
|
|
538
|
+
case "offer_rate":
|
|
539
|
+
let offer_rate = data.offer_rate;
|
|
540
|
+
if (!this.coreFunctionService.isNotBlank(offer_rate)) {
|
|
541
|
+
offer_rate = 0;
|
|
542
|
+
}
|
|
543
|
+
if (data.no_of_injection > 0) {
|
|
544
|
+
this.calculatePharamaParameterAmount(data, offer_rate, quantity);
|
|
545
|
+
}
|
|
546
|
+
else {
|
|
547
|
+
if (offer_rate) {
|
|
548
|
+
effectiveTotal = quantity * offer_rate;
|
|
549
|
+
dis_amt = gross_amount - effectiveTotal;
|
|
550
|
+
if (gross_amount > 0) {
|
|
551
|
+
discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
|
|
552
|
+
}
|
|
553
|
+
else {
|
|
554
|
+
discount_percent = 0;
|
|
555
|
+
}
|
|
556
|
+
net_amount = gross_amount - dis_amt;
|
|
557
|
+
}
|
|
558
|
+
this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
|
|
559
|
+
data["offer_rate"] = offer_rate;
|
|
560
|
+
}
|
|
561
|
+
break;
|
|
562
|
+
case "discount_amount":
|
|
563
|
+
dis_amt = data.discount_amount;
|
|
564
|
+
if (!this.coreFunctionService.isNotBlank(dis_amt)) {
|
|
565
|
+
dis_amt = 0;
|
|
566
|
+
}
|
|
567
|
+
if (data.no_of_injection > 0) {
|
|
568
|
+
if (!this.coreFunctionService.isNotBlank(data['rate_per_injection'])) {
|
|
569
|
+
data['rate_per_injection'] = 0;
|
|
570
|
+
}
|
|
571
|
+
let offeringRate = data['rate_per_injection'] - dis_amt;
|
|
572
|
+
this.calculatePharamaParameterAmount(data, offeringRate, quantity, incoming_field);
|
|
573
|
+
}
|
|
574
|
+
else {
|
|
575
|
+
effectiveTotal = gross_amount - dis_amt;
|
|
576
|
+
net_amount = effectiveTotal;
|
|
577
|
+
if (gross_amount > 0) {
|
|
578
|
+
discount_percent = this.getDecimalAmount(((+dis_amt) * 100) / (+gross_amount));
|
|
579
|
+
}
|
|
580
|
+
else {
|
|
581
|
+
discount_percent = 0;
|
|
582
|
+
}
|
|
583
|
+
this.populateParameterAmount(data, net_amount, discount_percent, dis_amt, quantity, gross_amount);
|
|
584
|
+
}
|
|
585
|
+
break;
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
calculate_invoice_amount_row_wise(data, fieldName) {
|
|
589
|
+
let total = 0;
|
|
590
|
+
let disc_per = 0;
|
|
591
|
+
let disc_amt = 0;
|
|
592
|
+
let final_amt = 0;
|
|
593
|
+
let net_amount = 0;
|
|
594
|
+
let surcharge = 0;
|
|
595
|
+
if (this.coreFunctionService.isNotBlank(data.total)) {
|
|
596
|
+
total = data.total;
|
|
597
|
+
}
|
|
598
|
+
if (this.coreFunctionService.isNotBlank(data.discount_amount)) {
|
|
599
|
+
disc_amt = data.discount_amount;
|
|
600
|
+
}
|
|
601
|
+
if (this.coreFunctionService.isNotBlank(data.sampling_charge)) {
|
|
602
|
+
surcharge = data.sampling_charge;
|
|
603
|
+
}
|
|
604
|
+
if (this.coreFunctionService.isNotBlank(data.discount_percent)) {
|
|
605
|
+
disc_per = data.discount_percent;
|
|
606
|
+
}
|
|
607
|
+
let incoming_field = fieldName;
|
|
608
|
+
switch (incoming_field) {
|
|
609
|
+
case "total":
|
|
610
|
+
disc_amt = disc_per * total / 100;
|
|
611
|
+
net_amount = total - disc_amt;
|
|
612
|
+
final_amt = surcharge + net_amount;
|
|
613
|
+
// disc_per = (disc_amt/(data.total))*100;
|
|
614
|
+
break;
|
|
615
|
+
case "discount_percent":
|
|
616
|
+
disc_amt = disc_per * total / 100;
|
|
617
|
+
net_amount = total - disc_amt;
|
|
618
|
+
final_amt = surcharge + net_amount;
|
|
619
|
+
break;
|
|
620
|
+
case "discount_amount":
|
|
621
|
+
disc_per = (100 * disc_amt) / total;
|
|
622
|
+
net_amount = total - disc_amt;
|
|
623
|
+
final_amt = surcharge + net_amount;
|
|
624
|
+
break;
|
|
625
|
+
case "sampling_charge":
|
|
626
|
+
disc_per = (100 * disc_amt) / total;
|
|
627
|
+
net_amount = total - disc_amt;
|
|
628
|
+
final_amt = surcharge + net_amount;
|
|
629
|
+
break;
|
|
630
|
+
}
|
|
631
|
+
data["discount_percent"] = disc_per;
|
|
632
|
+
data["discount_amount"] = disc_amt;
|
|
633
|
+
data["final_amount"] = final_amt;
|
|
634
|
+
data["net_amount"] = net_amount;
|
|
635
|
+
}
|
|
636
|
+
calculateNetAmount(data, fieldName, grid_cell_function) {
|
|
637
|
+
switch (grid_cell_function) {
|
|
638
|
+
case "calculateQuotationParameterAmountForAutomotiveLims":
|
|
639
|
+
this.calculateQuotationParameterAmountForAutomotiveLims(data, fieldName["field_name"]);
|
|
640
|
+
break;
|
|
641
|
+
case "calculateQuotationParameterAmountForLims":
|
|
642
|
+
this.calculateQuotationParameterAmountForLims(data, fieldName["field_name"]);
|
|
643
|
+
break;
|
|
644
|
+
case "calculateQuotationParameterAmountForLimsWithSubsequent":
|
|
645
|
+
this.calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName["field_name"]);
|
|
646
|
+
break;
|
|
647
|
+
case "calculate_pharma_claim_values":
|
|
648
|
+
this.calculate_pharma_claim_values(data);
|
|
649
|
+
break;
|
|
650
|
+
case "calculate_invoice_amount_row_wise":
|
|
651
|
+
this.calculate_invoice_amount_row_wise(data, fieldName["field_name"]);
|
|
652
|
+
break;
|
|
653
|
+
default:
|
|
654
|
+
this.legacyQuotationParameterCalculation(data, fieldName["field_name"]);
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
calculateQquoteAmount(templateValue, field) {
|
|
658
|
+
var total = 0;
|
|
659
|
+
let discount_percent = 0;
|
|
660
|
+
let net_amount = 0;
|
|
661
|
+
let sampling_amount = 0;
|
|
662
|
+
let final_amount = 0;
|
|
663
|
+
let discount_amount = 0;
|
|
664
|
+
let quotation_param_methods = [];
|
|
665
|
+
let unit_price = 0;
|
|
666
|
+
if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
|
|
667
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
668
|
+
total = total + element.quotation_effective_rate;
|
|
669
|
+
});
|
|
670
|
+
}
|
|
671
|
+
if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
|
|
672
|
+
sampling_amount = templateValue['sampling_charge'];
|
|
673
|
+
}
|
|
674
|
+
if (total > 0) {
|
|
675
|
+
if (templateValue[field.field_name] != '') {
|
|
676
|
+
if (field.field_name === 'discount_percent') {
|
|
677
|
+
discount_percent = templateValue[field.field_name];
|
|
678
|
+
discount_amount = total * discount_percent / 100;
|
|
679
|
+
net_amount = total - discount_amount;
|
|
680
|
+
quotation_param_methods = [];
|
|
681
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
682
|
+
const new_element = { ...element };
|
|
683
|
+
new_element.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
684
|
+
this.calculateNetAmount(new_element, "qty", "");
|
|
685
|
+
quotation_param_methods.push(new_element);
|
|
686
|
+
});
|
|
687
|
+
templateValue['quotation_param_methods'].setValue(quotation_param_methods);
|
|
688
|
+
this.calculateQquoteAmount(templateValue, { field_name: "quotation_param_methods" });
|
|
689
|
+
}
|
|
690
|
+
else if (field.field_name === 'net_amount') {
|
|
691
|
+
discount_percent = 0;
|
|
692
|
+
net_amount = templateValue[field.field_name];
|
|
693
|
+
discount_amount = total - net_amount;
|
|
694
|
+
discount_percent = this.getDecimalAmount(100 * discount_amount / total);
|
|
695
|
+
templateValue["discount_percent"] = discount_percent;
|
|
696
|
+
let updatedData = this.quote_amount_via_discount_percent(templateValue["quotation_param_methods"], templateValue);
|
|
697
|
+
updatedData[field.field_name] = net_amount;
|
|
698
|
+
return updatedData;
|
|
699
|
+
}
|
|
700
|
+
else if (field.field_name === 'quotation_param_methods') {
|
|
701
|
+
let list = templateValue[field.field_name];
|
|
702
|
+
list.forEach((element) => {
|
|
703
|
+
const new_element = { ...element };
|
|
704
|
+
discount_amount = discount_amount + element.discount_amount;
|
|
705
|
+
net_amount = net_amount + element.net_amount;
|
|
706
|
+
});
|
|
707
|
+
discount_percent = 100 * discount_amount / total;
|
|
708
|
+
}
|
|
709
|
+
else {
|
|
710
|
+
total = templateValue['total'];
|
|
711
|
+
discount_amount = templateValue['discount_amount'];
|
|
712
|
+
net_amount = templateValue['net_amount'];
|
|
713
|
+
discount_percent = templateValue['discount_percent'];
|
|
714
|
+
}
|
|
715
|
+
final_amount = net_amount + sampling_amount;
|
|
716
|
+
unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
|
|
717
|
+
quotation_param_methods = [];
|
|
718
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
719
|
+
const new_element = { ...element };
|
|
720
|
+
new_element.discount_percent = this.getDecimalAmount(+element.discount_percent);
|
|
721
|
+
new_element.net_amount = this.getDecimalAmount(+(element.quotation_effective_rate * (1 - element.discount_percent / 100)));
|
|
722
|
+
new_element.discount_amount = this.getDecimalAmount(+(element.quotation_effective_rate * element.discount_percent / 100));
|
|
723
|
+
if (new_element.qty > 0) {
|
|
724
|
+
new_element.per_sample_net_rate = this.getDecimalAmount(+(new_element.net_amount / new_element.qty));
|
|
725
|
+
}
|
|
726
|
+
quotation_param_methods.push(new_element);
|
|
727
|
+
});
|
|
728
|
+
templateValue['total'] = total;
|
|
729
|
+
templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
730
|
+
templateValue['net_amount'] = this.getDecimalAmount(net_amount);
|
|
731
|
+
templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
732
|
+
templateValue['final_amount'] = this.getDecimalAmount(final_amount);
|
|
733
|
+
templateValue['unit_price'] = unit_price;
|
|
734
|
+
if (quotation_param_methods.length > 0) {
|
|
735
|
+
templateValue['quotation_param_methods'] = quotation_param_methods;
|
|
736
|
+
}
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
return templateValue;
|
|
740
|
+
}
|
|
741
|
+
calculate_lims_invoice_with_manual_items(templateValue, lims_segment, calculate_on_field) {
|
|
742
|
+
let calculateOnField = "";
|
|
743
|
+
if (calculate_on_field == null || calculate_on_field == '') {
|
|
744
|
+
calculateOnField = 'manualItemsList';
|
|
745
|
+
}
|
|
746
|
+
else {
|
|
747
|
+
calculateOnField = calculate_on_field['field_name'];
|
|
748
|
+
}
|
|
749
|
+
let surcharge = 0;
|
|
750
|
+
let gross_amount = 0;
|
|
751
|
+
let discount_percent = 0;
|
|
752
|
+
let discount_amount = 0;
|
|
753
|
+
let taxable_amount = 0;
|
|
754
|
+
let net_amount = 0;
|
|
755
|
+
if (this.coreFunctionService.isNotBlank(templateValue[calculateOnField]) && templateValue[calculateOnField].length > 0) {
|
|
756
|
+
templateValue[calculateOnField].forEach((element) => {
|
|
757
|
+
if (this.coreFunctionService.isNotBlank(element.sampleTotal)) {
|
|
758
|
+
// gross_amount=gross_amount+element.gross_amount
|
|
759
|
+
gross_amount = gross_amount + element.sampleTotal;
|
|
760
|
+
}
|
|
761
|
+
if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
|
|
762
|
+
// surcharge=surcharge+element.surcharge
|
|
763
|
+
surcharge = surcharge + element.sampling_charge;
|
|
764
|
+
}
|
|
765
|
+
if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
|
|
766
|
+
discount_amount = discount_amount + element.discount_amount;
|
|
767
|
+
}
|
|
768
|
+
if (this.coreFunctionService.isNotBlank(element.net_amount)) {
|
|
769
|
+
net_amount = net_amount + element.net_amount;
|
|
770
|
+
}
|
|
771
|
+
else {
|
|
772
|
+
net_amount = net_amount + element.sampleTotal;
|
|
773
|
+
}
|
|
774
|
+
taxable_amount = net_amount + surcharge;
|
|
775
|
+
});
|
|
776
|
+
}
|
|
777
|
+
templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount);
|
|
778
|
+
return templateValue;
|
|
779
|
+
}
|
|
780
|
+
calculate_lims_invoice_with_po_items(templateValue, lims_segment, calculate_on_field) {
|
|
781
|
+
return this.calculate_lims_invoice(templateValue, lims_segment, 'po_items');
|
|
782
|
+
}
|
|
783
|
+
calculate_manual_row_item(templateValue, lims_segment, calculate_on_field) {
|
|
784
|
+
var manualItemsList = templateValue['manualItemsList'];
|
|
785
|
+
var qty = manualItemsList['sampleQty'];
|
|
786
|
+
var cost = manualItemsList['sampleCost'];
|
|
787
|
+
if (qty && cost) {
|
|
788
|
+
manualItemsList['sampleTotal'] = qty * cost;
|
|
789
|
+
}
|
|
790
|
+
else {
|
|
791
|
+
manualItemsList['sampleTotal'] = 0;
|
|
792
|
+
}
|
|
793
|
+
manualItemsList['discount_amount'] = 0;
|
|
794
|
+
manualItemsList['net_amount'] = manualItemsList['sampleTotal'];
|
|
795
|
+
templateValue['manualItemsList'] = manualItemsList;
|
|
796
|
+
return templateValue;
|
|
797
|
+
}
|
|
798
|
+
calculate_po_row_item(templateValue, lims_segment, calculate_on_field) {
|
|
799
|
+
var po_items = templateValue['po_items'];
|
|
800
|
+
var qty = po_items['qty'];
|
|
801
|
+
var cost = po_items['cost'];
|
|
802
|
+
if (qty && cost) {
|
|
803
|
+
po_items['total'] = qty * cost;
|
|
804
|
+
}
|
|
805
|
+
else {
|
|
806
|
+
po_items['total'] = 0;
|
|
807
|
+
}
|
|
808
|
+
po_items['discount_amount'] = 0;
|
|
809
|
+
po_items['net_amount'] = po_items['total'];
|
|
810
|
+
templateValue['po_items'] = po_items;
|
|
811
|
+
return templateValue;
|
|
812
|
+
}
|
|
813
|
+
credit_note_invoice_calculation(templateValue, lims_segment, calculate_on_field) {
|
|
814
|
+
let surcharge = 0;
|
|
815
|
+
let gross_amount = 0;
|
|
816
|
+
let discount_percent = 0;
|
|
817
|
+
let discount_amount = 0;
|
|
818
|
+
let taxable_amount = 0;
|
|
819
|
+
let net_amount = 0;
|
|
820
|
+
let gst_amount = 0;
|
|
821
|
+
let cgst_amount = 0;
|
|
822
|
+
let sgst_amount = 0;
|
|
823
|
+
let igst_amount = 0;
|
|
824
|
+
let tax_amount = 0;
|
|
825
|
+
let sez_amount = 0;
|
|
826
|
+
let net_payble = 0;
|
|
827
|
+
let igst_percent = 0;
|
|
828
|
+
let gst_percent = 0;
|
|
829
|
+
let sez_percent = 0;
|
|
830
|
+
let cgst_percent = 0;
|
|
831
|
+
let sgst_percent = 0;
|
|
832
|
+
let tax_percentage = 0;
|
|
833
|
+
let tax_type = templateValue['tax_type'];
|
|
834
|
+
let parentObjectValue = templateValue[calculate_on_field.parent];
|
|
835
|
+
if (this.coreFunctionService.isNotBlank(parentObjectValue)) {
|
|
836
|
+
if (this.coreFunctionService.isNotBlank(parentObjectValue[calculate_on_field.field_name])) {
|
|
837
|
+
taxable_amount = parentObjectValue[calculate_on_field.field_name];
|
|
838
|
+
}
|
|
839
|
+
}
|
|
840
|
+
if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
|
|
841
|
+
tax_percentage = templateValue.tax_percentage;
|
|
842
|
+
}
|
|
843
|
+
if ((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) {
|
|
844
|
+
net_payble = taxable_amount;
|
|
845
|
+
}
|
|
846
|
+
else {
|
|
847
|
+
switch (tax_type) {
|
|
848
|
+
case "GST":
|
|
849
|
+
gst_amount = taxable_amount * tax_percentage / 100;
|
|
850
|
+
gst_percent = tax_percentage;
|
|
851
|
+
cgst_percent = gst_percent / 2;
|
|
852
|
+
sgst_percent = gst_percent / 2;
|
|
853
|
+
cgst_amount = gst_amount / 2;
|
|
854
|
+
sgst_amount = gst_amount / 2;
|
|
855
|
+
net_payble = taxable_amount + gst_amount;
|
|
856
|
+
tax_amount = gst_amount;
|
|
857
|
+
igst_amount = 0;
|
|
858
|
+
igst_percent = 0;
|
|
859
|
+
break;
|
|
860
|
+
case "IGST":
|
|
861
|
+
igst_amount = taxable_amount * tax_percentage / 100;
|
|
862
|
+
igst_percent = tax_percentage;
|
|
863
|
+
net_payble = taxable_amount + igst_amount;
|
|
864
|
+
tax_amount = igst_amount;
|
|
865
|
+
break;
|
|
866
|
+
default:
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
if (gross_amount > 0) {
|
|
870
|
+
discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
|
|
871
|
+
}
|
|
872
|
+
let total = {};
|
|
873
|
+
total['surcharge'] = this.getDecimalAmount(surcharge);
|
|
874
|
+
total['igst_percent'] = this.getDecimalAmount(igst_percent);
|
|
875
|
+
total['gst_percent'] = this.getDecimalAmount(gst_percent);
|
|
876
|
+
total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
|
|
877
|
+
total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
|
|
878
|
+
total['sez_percent'] = this.getDecimalAmount(sez_percent);
|
|
879
|
+
total['gross_amount'] = this.getDecimalAmount(gross_amount);
|
|
880
|
+
total['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
881
|
+
total['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
882
|
+
total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
|
|
883
|
+
total['gst_amount'] = this.getDecimalAmount(gst_amount);
|
|
884
|
+
total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
|
|
885
|
+
total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
|
|
886
|
+
total['igst_amount'] = this.getDecimalAmount(igst_amount);
|
|
887
|
+
total['tax_amount'] = this.getDecimalAmount(tax_amount);
|
|
888
|
+
total['sez_amount'] = this.getDecimalAmount(sez_amount);
|
|
889
|
+
// total['net_amount'] = this.getDecimalAmount(net_amount);
|
|
890
|
+
total['net_payble'] = this.getDecimalAmount(net_payble);
|
|
891
|
+
templateValue = {};
|
|
892
|
+
templateValue['total_amount'] = total;
|
|
893
|
+
return templateValue;
|
|
894
|
+
}
|
|
895
|
+
calculate_lims_invoice(templateValue, lims_segment, calculate_on_field) {
|
|
896
|
+
if (calculate_on_field == null || calculate_on_field == '') {
|
|
897
|
+
calculate_on_field = 'items_list';
|
|
898
|
+
}
|
|
899
|
+
let surcharge = 0;
|
|
900
|
+
let gross_amount = 0;
|
|
901
|
+
let discount_percent = 0;
|
|
902
|
+
let discount_amount = 0;
|
|
903
|
+
let taxable_amount = 0;
|
|
904
|
+
let net_amount = 0;
|
|
905
|
+
if (this.coreFunctionService.isNotBlank(templateValue[calculate_on_field]) && templateValue[calculate_on_field].length > 0) {
|
|
906
|
+
templateValue[calculate_on_field].forEach((element) => {
|
|
907
|
+
if (this.coreFunctionService.isNotBlank(element.total)) {
|
|
908
|
+
// gross_amount=gross_amount+element.gross_amount
|
|
909
|
+
gross_amount = gross_amount + element.total;
|
|
910
|
+
}
|
|
911
|
+
if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
|
|
912
|
+
// surcharge=surcharge+element.surcharge
|
|
913
|
+
surcharge = surcharge + element.sampling_charge;
|
|
914
|
+
}
|
|
915
|
+
if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
|
|
916
|
+
discount_amount = discount_amount + element.discount_amount;
|
|
917
|
+
}
|
|
918
|
+
if (this.coreFunctionService.isNotBlank(element.net_amount)) {
|
|
919
|
+
net_amount = net_amount + element.net_amount;
|
|
920
|
+
}
|
|
921
|
+
else {
|
|
922
|
+
net_amount = net_amount + element.total;
|
|
923
|
+
}
|
|
924
|
+
taxable_amount = net_amount + surcharge;
|
|
925
|
+
});
|
|
926
|
+
}
|
|
927
|
+
templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount);
|
|
928
|
+
return templateValue;
|
|
929
|
+
}
|
|
930
|
+
calculate_lims_invoice_extra_amount(templateValue, lims_segment, calculate_on_field) {
|
|
931
|
+
if (calculate_on_field == null || calculate_on_field == '') {
|
|
932
|
+
calculate_on_field = 'items_list';
|
|
933
|
+
}
|
|
934
|
+
let surcharge = 0;
|
|
935
|
+
let gross_amount = 0;
|
|
936
|
+
let discount_percent = 0;
|
|
937
|
+
let discount_amount = 0;
|
|
938
|
+
let taxable_amount = 0;
|
|
939
|
+
let net_amount = 0;
|
|
940
|
+
let extraAmount = 0;
|
|
941
|
+
if (this.coreFunctionService.isNotBlank(templateValue[calculate_on_field]) && templateValue[calculate_on_field].length > 0) {
|
|
942
|
+
templateValue[calculate_on_field].forEach((element) => {
|
|
943
|
+
if (this.coreFunctionService.isNotBlank(element.total)) {
|
|
944
|
+
// gross_amount=gross_amount+element.gross_amount
|
|
945
|
+
gross_amount = gross_amount + element.total;
|
|
946
|
+
}
|
|
947
|
+
if (this.coreFunctionService.isNotBlank(element.sampling_charge)) {
|
|
948
|
+
// surcharge=surcharge+element.surcharge
|
|
949
|
+
surcharge = surcharge + element.sampling_charge;
|
|
950
|
+
}
|
|
951
|
+
if (this.coreFunctionService.isNotBlank(element.discount_amount)) {
|
|
952
|
+
discount_amount = discount_amount + element.discount_amount;
|
|
953
|
+
}
|
|
954
|
+
if (this.coreFunctionService.isNotBlank(element.net_amount)) {
|
|
955
|
+
net_amount = net_amount + element.net_amount;
|
|
956
|
+
}
|
|
957
|
+
else {
|
|
958
|
+
net_amount = net_amount + element.total;
|
|
959
|
+
}
|
|
960
|
+
if (element && element.extra_amount) {
|
|
961
|
+
extraAmount = Number(extraAmount) + Number(element.extra_amount);
|
|
962
|
+
}
|
|
963
|
+
taxable_amount = net_amount + surcharge + extraAmount;
|
|
964
|
+
});
|
|
965
|
+
}
|
|
966
|
+
templateValue = this.update_invoice_totatl_extra_amount(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, extraAmount, taxable_amount);
|
|
967
|
+
return templateValue;
|
|
968
|
+
}
|
|
969
|
+
getPercent(templateValue, parent, field) {
|
|
970
|
+
const calculateValue = {};
|
|
971
|
+
if (field && field.calSourceTarget && field.calSourceTarget.length >= 1) {
|
|
972
|
+
let source = field.calSourceTarget[0].source;
|
|
973
|
+
let target = field.calSourceTarget[0].target;
|
|
974
|
+
let sourceValue = this.commonFunctionService.getObjectValue(source, templateValue);
|
|
975
|
+
if (sourceValue && sourceValue != '') {
|
|
976
|
+
if (typeof sourceValue == 'number') {
|
|
977
|
+
let fileName = field.field_name;
|
|
978
|
+
let percent;
|
|
979
|
+
if (parent != '') {
|
|
980
|
+
percent = templateValue[parent.field_name][fileName];
|
|
981
|
+
}
|
|
982
|
+
else {
|
|
983
|
+
percent = templateValue[fileName];
|
|
984
|
+
}
|
|
985
|
+
if (typeof sourceValue == 'number' && percent && percent >= 1) {
|
|
986
|
+
let percentValue = sourceValue * percent / 100;
|
|
987
|
+
let targetFields = target.split('.');
|
|
988
|
+
if (targetFields && targetFields.length == 2) {
|
|
989
|
+
const parent = targetFields[0];
|
|
990
|
+
const child = targetFields[1];
|
|
991
|
+
calculateValue[parent] = {};
|
|
992
|
+
calculateValue[parent][child] = percentValue;
|
|
993
|
+
}
|
|
994
|
+
else {
|
|
995
|
+
const child = targetFields[0];
|
|
996
|
+
calculateValue[child] = percentValue;
|
|
997
|
+
}
|
|
998
|
+
}
|
|
999
|
+
}
|
|
1000
|
+
else {
|
|
1001
|
+
this.notificationService.notify('bg-danger', 'Source Value is not a number.');
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
else {
|
|
1005
|
+
this.notificationService.notify('bg-danger', 'Source Field is Required.');
|
|
1006
|
+
}
|
|
1007
|
+
}
|
|
1008
|
+
return calculateValue;
|
|
1009
|
+
}
|
|
1010
|
+
calculate_quotation(templateValue, lims_segment, field) {
|
|
1011
|
+
var total = 0;
|
|
1012
|
+
let discount_percent = 0;
|
|
1013
|
+
let net_amount = 0;
|
|
1014
|
+
let sampling_amount = 0;
|
|
1015
|
+
let final_amount = 0;
|
|
1016
|
+
let discount_amount = 0;
|
|
1017
|
+
let quotation_param_methods = [];
|
|
1018
|
+
let unit_price = 0;
|
|
1019
|
+
let paramArray = [];
|
|
1020
|
+
let gross_amount = 0;
|
|
1021
|
+
let field_name = field.field_name;
|
|
1022
|
+
let qty = 0;
|
|
1023
|
+
let product_wise_pricing = templateValue['product_wise_pricing'];
|
|
1024
|
+
let current_disount = 0;
|
|
1025
|
+
if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
|
|
1026
|
+
current_disount = templateValue['discount_percent'];
|
|
1027
|
+
}
|
|
1028
|
+
if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
|
|
1029
|
+
qty = templateValue.qty;
|
|
1030
|
+
}
|
|
1031
|
+
if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
|
|
1032
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
1033
|
+
let data = { ...element };
|
|
1034
|
+
paramArray.push(data);
|
|
1035
|
+
});
|
|
1036
|
+
}
|
|
1037
|
+
if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
|
|
1038
|
+
sampling_amount = templateValue['sampling_charge'];
|
|
1039
|
+
}
|
|
1040
|
+
// if(gross_amount>0){
|
|
1041
|
+
if (true) {
|
|
1042
|
+
switch (field_name) {
|
|
1043
|
+
case 'parameter_array':
|
|
1044
|
+
unit_price = 0;
|
|
1045
|
+
if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
|
|
1046
|
+
unit_price = templateValue.unit_price;
|
|
1047
|
+
}
|
|
1048
|
+
if (product_wise_pricing) {
|
|
1049
|
+
net_amount = qty * unit_price;
|
|
1050
|
+
paramArray.forEach((data) => {
|
|
1051
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
|
|
1052
|
+
gross_amount = gross_amount + data['total'];
|
|
1053
|
+
});
|
|
1054
|
+
discount_amount = gross_amount - net_amount;
|
|
1055
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1056
|
+
paramArray.forEach((data) => {
|
|
1057
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1058
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
|
|
1059
|
+
});
|
|
1060
|
+
}
|
|
1061
|
+
else {
|
|
1062
|
+
if (paramArray.length > 0) {
|
|
1063
|
+
discount_amount = 0;
|
|
1064
|
+
net_amount = 0;
|
|
1065
|
+
total = 0;
|
|
1066
|
+
gross_amount = 0;
|
|
1067
|
+
if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
|
|
1068
|
+
qty = templateValue.qty;
|
|
1069
|
+
}
|
|
1070
|
+
paramArray.forEach((data) => {
|
|
1071
|
+
if (lims_segment == 'standard') {
|
|
1072
|
+
data['qty'] = qty;
|
|
1073
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, 'qty');
|
|
1074
|
+
}
|
|
1075
|
+
gross_amount = gross_amount + data['total'];
|
|
1076
|
+
net_amount = net_amount + data['net_amount'];
|
|
1077
|
+
discount_amount = discount_amount + data['discount_amount'];
|
|
1078
|
+
});
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1082
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1083
|
+
templateValue['net_amount'] = net_amount;
|
|
1084
|
+
templateValue['discount_percent'] = discount_percent;
|
|
1085
|
+
break;
|
|
1086
|
+
case 'discount_percent':
|
|
1087
|
+
discount_percent = templateValue[field_name];
|
|
1088
|
+
paramArray.forEach((data) => {
|
|
1089
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1090
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
|
|
1091
|
+
gross_amount = gross_amount + data['total'];
|
|
1092
|
+
});
|
|
1093
|
+
discount_amount = gross_amount * discount_percent / 100;
|
|
1094
|
+
net_amount = gross_amount - discount_amount;
|
|
1095
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1096
|
+
templateValue['net_amount'] = net_amount;
|
|
1097
|
+
templateValue['discount_percent'] = discount_percent;
|
|
1098
|
+
break;
|
|
1099
|
+
case 'discount_amount':
|
|
1100
|
+
discount_amount = templateValue[field_name];
|
|
1101
|
+
paramArray.forEach((data) => {
|
|
1102
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1103
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
|
|
1104
|
+
gross_amount = gross_amount + data['total'];
|
|
1105
|
+
});
|
|
1106
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1107
|
+
net_amount = gross_amount - discount_amount;
|
|
1108
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1109
|
+
templateValue['net_amount'] = net_amount;
|
|
1110
|
+
templateValue['discount_percent'] = discount_percent;
|
|
1111
|
+
break;
|
|
1112
|
+
case 'net_amount':
|
|
1113
|
+
discount_percent = 0;
|
|
1114
|
+
net_amount = templateValue[field_name];
|
|
1115
|
+
paramArray.forEach((data) => {
|
|
1116
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1117
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
|
|
1118
|
+
gross_amount = gross_amount + data['total'];
|
|
1119
|
+
});
|
|
1120
|
+
discount_amount = gross_amount - net_amount;
|
|
1121
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1122
|
+
paramArray.forEach((data) => {
|
|
1123
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1124
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "discount_percent");
|
|
1125
|
+
});
|
|
1126
|
+
templateValue["discount_percent"] = discount_percent;
|
|
1127
|
+
templateValue["discount_amount"] = discount_amount;
|
|
1128
|
+
templateValue['net_amount'] = net_amount;
|
|
1129
|
+
break;
|
|
1130
|
+
case 'unit_price':
|
|
1131
|
+
unit_price = 0;
|
|
1132
|
+
if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
|
|
1133
|
+
unit_price = templateValue.unit_price;
|
|
1134
|
+
}
|
|
1135
|
+
net_amount = qty * unit_price;
|
|
1136
|
+
paramArray.forEach((data) => {
|
|
1137
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1138
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "qty");
|
|
1139
|
+
gross_amount = gross_amount + data['total'];
|
|
1140
|
+
});
|
|
1141
|
+
discount_amount = gross_amount - net_amount;
|
|
1142
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1143
|
+
paramArray.forEach((data) => {
|
|
1144
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
1145
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
|
|
1146
|
+
});
|
|
1147
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1148
|
+
templateValue['net_amount'] = net_amount;
|
|
1149
|
+
templateValue['discount_percent'] = discount_percent;
|
|
1150
|
+
break;
|
|
1151
|
+
default:
|
|
1152
|
+
discount_amount = 0;
|
|
1153
|
+
net_amount = 0;
|
|
1154
|
+
if (paramArray.length > 0) {
|
|
1155
|
+
paramArray.forEach((data) => {
|
|
1156
|
+
data['qty'] = qty;
|
|
1157
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
|
|
1158
|
+
gross_amount = gross_amount + data['total'];
|
|
1159
|
+
net_amount = net_amount + data['net_amount'];
|
|
1160
|
+
discount_amount = discount_amount + data['discount_amount'];
|
|
1161
|
+
});
|
|
1162
|
+
}
|
|
1163
|
+
if (product_wise_pricing) {
|
|
1164
|
+
unit_price = templateValue["unit_price"];
|
|
1165
|
+
net_amount = unit_price * qty;
|
|
1166
|
+
discount_amount = gross_amount - net_amount;
|
|
1167
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1168
|
+
if (paramArray.length > 0) {
|
|
1169
|
+
paramArray.forEach((data) => {
|
|
1170
|
+
data['discount_percent'] = discount_percent;
|
|
1171
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
|
|
1172
|
+
});
|
|
1173
|
+
}
|
|
1174
|
+
}
|
|
1175
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1176
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1177
|
+
templateValue['net_amount'] = net_amount;
|
|
1178
|
+
templateValue['discount_percent'] = discount_percent;
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
final_amount = net_amount + sampling_amount;
|
|
1182
|
+
if (templateValue['qty'] > 0) {
|
|
1183
|
+
unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
|
|
1184
|
+
}
|
|
1185
|
+
else {
|
|
1186
|
+
unit_price = templateValue["unit_price"];
|
|
1187
|
+
}
|
|
1188
|
+
templateValue['total'] = gross_amount;
|
|
1189
|
+
templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
1190
|
+
templateValue['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1191
|
+
templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1192
|
+
templateValue['final_amount'] = this.getDecimalAmount(final_amount);
|
|
1193
|
+
templateValue['unit_price'] = unit_price;
|
|
1194
|
+
if (paramArray.length > 0) {
|
|
1195
|
+
templateValue['quotation_param_methods'] = paramArray;
|
|
1196
|
+
}
|
|
1197
|
+
return templateValue;
|
|
1198
|
+
}
|
|
1199
|
+
calculate_quotation_for_lims(templateValue, lims_segment, field) {
|
|
1200
|
+
var total = 0;
|
|
1201
|
+
let discount_percent = 0;
|
|
1202
|
+
let net_amount = 0;
|
|
1203
|
+
let sampling_amount = 0;
|
|
1204
|
+
let final_amount = 0;
|
|
1205
|
+
let discount_amount = 0;
|
|
1206
|
+
let quotation_param_methods = [];
|
|
1207
|
+
let unit_price = 0;
|
|
1208
|
+
let paramArray = [];
|
|
1209
|
+
let gross_amount = 0;
|
|
1210
|
+
let field_name = field.field_name;
|
|
1211
|
+
let qty = 0;
|
|
1212
|
+
let product_wise_pricing = templateValue['product_wise_pricing'];
|
|
1213
|
+
let current_disount = 0;
|
|
1214
|
+
if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
|
|
1215
|
+
current_disount = templateValue['discount_percent'];
|
|
1216
|
+
}
|
|
1217
|
+
if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
|
|
1218
|
+
qty = templateValue.qty;
|
|
1219
|
+
}
|
|
1220
|
+
if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
|
|
1221
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
1222
|
+
let data = { ...element };
|
|
1223
|
+
paramArray.push(data);
|
|
1224
|
+
});
|
|
1225
|
+
}
|
|
1226
|
+
// if(gross_amount>0){
|
|
1227
|
+
if (true) {
|
|
1228
|
+
discount_amount = 0;
|
|
1229
|
+
net_amount = 0;
|
|
1230
|
+
if (paramArray.length > 0) {
|
|
1231
|
+
paramArray.forEach((data) => {
|
|
1232
|
+
data['qty'] = qty;
|
|
1233
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, field_name);
|
|
1234
|
+
gross_amount = gross_amount + data['total'];
|
|
1235
|
+
net_amount = net_amount + data['net_amount'];
|
|
1236
|
+
discount_amount = discount_amount + data['discount_amount'];
|
|
1237
|
+
});
|
|
1238
|
+
}
|
|
1239
|
+
if (product_wise_pricing) {
|
|
1240
|
+
unit_price = templateValue["unit_price"];
|
|
1241
|
+
net_amount = unit_price * qty;
|
|
1242
|
+
discount_amount = gross_amount - net_amount;
|
|
1243
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
1244
|
+
if (paramArray.length > 0) {
|
|
1245
|
+
paramArray.forEach((data) => {
|
|
1246
|
+
data['discount_percent'] = discount_percent;
|
|
1247
|
+
this.calculateParameterLimsSegmentWise(lims_segment, data, "unit_price");
|
|
1248
|
+
});
|
|
1249
|
+
}
|
|
1250
|
+
}
|
|
1251
|
+
}
|
|
1252
|
+
templateValue['total'] = gross_amount;
|
|
1253
|
+
templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
1254
|
+
templateValue['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1255
|
+
templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1256
|
+
templateValue['unit_price'] = unit_price;
|
|
1257
|
+
return templateValue;
|
|
1258
|
+
}
|
|
1259
|
+
calculateParameterLimsSegmentWise(lims_segment, data, fieldName) {
|
|
1260
|
+
switch (lims_segment) {
|
|
1261
|
+
case 'standard':
|
|
1262
|
+
this.calculateQuotationParameterAmountForLims(data, fieldName);
|
|
1263
|
+
break;
|
|
1264
|
+
case 'automotive':
|
|
1265
|
+
this.calculateQuotationParameterAmountForAutomotiveLims(data, fieldName);
|
|
1266
|
+
break;
|
|
1267
|
+
}
|
|
1268
|
+
}
|
|
1269
|
+
samplingAmountAddition(templateValue) {
|
|
1270
|
+
let net_amount = templateValue['net_amount'];
|
|
1271
|
+
let sampling_charge = templateValue['sampling_charge'];
|
|
1272
|
+
let totl = net_amount + sampling_charge;
|
|
1273
|
+
templateValue['final_amount'] = totl;
|
|
1274
|
+
return templateValue;
|
|
1275
|
+
}
|
|
1276
|
+
quote_amount_via_discount_percent(listOfParm, templateValue) {
|
|
1277
|
+
let discount = templateValue.discount_percent;
|
|
1278
|
+
let quantity = templateValue.qty;
|
|
1279
|
+
let updatedParamsList = [];
|
|
1280
|
+
listOfParm.forEach((element) => {
|
|
1281
|
+
const data = JSON.parse(JSON.stringify(element));
|
|
1282
|
+
data['discount_percent'] = discount;
|
|
1283
|
+
data['qty'] = quantity;
|
|
1284
|
+
this.calculateNetAmount(data, "discount_percent", "");
|
|
1285
|
+
updatedParamsList.push(data);
|
|
1286
|
+
});
|
|
1287
|
+
templateValue["quotation_param_methods"] = updatedParamsList;
|
|
1288
|
+
let total = templateValue["total"];
|
|
1289
|
+
let discount_amount = this.getDecimalAmount(total * discount / 100);
|
|
1290
|
+
let net_amount = total - discount_amount;
|
|
1291
|
+
let final_amount = net_amount + templateValue["sampling_charge"];
|
|
1292
|
+
let unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
|
|
1293
|
+
templateValue['total'] = total;
|
|
1294
|
+
templateValue['discount_amount'] = discount_amount;
|
|
1295
|
+
templateValue['net_amount'] = net_amount;
|
|
1296
|
+
templateValue['final_amount'] = final_amount;
|
|
1297
|
+
templateValue['unit_price'] = unit_price;
|
|
1298
|
+
return templateValue;
|
|
1299
|
+
}
|
|
1300
|
+
calculateInvoiceTotalAmount(formValue, invoiceInfos) {
|
|
1301
|
+
let list = invoiceInfos;
|
|
1302
|
+
let total = 0;
|
|
1303
|
+
for (let i = 0; i < list.length; i++) {
|
|
1304
|
+
total += list[i]['netpayableAmount'];
|
|
1305
|
+
}
|
|
1306
|
+
let lumpSumAmount = formValue['lumpSumAmount'];
|
|
1307
|
+
let advanceAmount = formValue['advanceAmount'];
|
|
1308
|
+
let toatallumsumOrAdvance = lumpSumAmount + advanceAmount;
|
|
1309
|
+
let totalFair = total - toatallumsumOrAdvance;
|
|
1310
|
+
let obj = {
|
|
1311
|
+
totalAmount: (total).toFixed(2),
|
|
1312
|
+
payAmount: (totalFair).toFixed(2)
|
|
1313
|
+
};
|
|
1314
|
+
return obj;
|
|
1315
|
+
}
|
|
1316
|
+
quote_amount_via_sample_no(templateValue, listOfParm) {
|
|
1317
|
+
let quantity = templateValue.qty;
|
|
1318
|
+
let discount = templateValue.discount_percent;
|
|
1319
|
+
let updatedParamsList = [];
|
|
1320
|
+
listOfParm.forEach((element) => {
|
|
1321
|
+
const data = JSON.parse(JSON.stringify(element));
|
|
1322
|
+
data['discount_percent'] = discount;
|
|
1323
|
+
data['qty'] = quantity;
|
|
1324
|
+
this.calculateNetAmount(data, "qty", "");
|
|
1325
|
+
updatedParamsList.push(data);
|
|
1326
|
+
});
|
|
1327
|
+
templateValue["quotation_param_methods"] = updatedParamsList;
|
|
1328
|
+
return this.calculateQquoteAmount(templateValue, { field_name: "quotation_param_methods" });
|
|
1329
|
+
}
|
|
1330
|
+
calculateInvoiceOrderAmount(templateForm, field) {
|
|
1331
|
+
var net_amount = 0;
|
|
1332
|
+
var discount_amount = 0;
|
|
1333
|
+
var igst_amount = 0;
|
|
1334
|
+
var sgst_amount = 0;
|
|
1335
|
+
var cgst_amount = 0;
|
|
1336
|
+
var netPayable = 0;
|
|
1337
|
+
var surcharge = 0;
|
|
1338
|
+
var sez_amount = 0;
|
|
1339
|
+
var total = 0;
|
|
1340
|
+
let templateValue = templateForm.getRawValue();
|
|
1341
|
+
if (templateValue['items_list'] != '' && templateValue['items_list'].length > 0) {
|
|
1342
|
+
templateValue['items_list'].forEach((element) => {
|
|
1343
|
+
net_amount = net_amount + element.net_amount;
|
|
1344
|
+
discount_amount = discount_amount + element.discount_amount;
|
|
1345
|
+
surcharge = surcharge + element.surcharge;
|
|
1346
|
+
total = total + element.total;
|
|
1347
|
+
});
|
|
1348
|
+
if (templateValue['tax_type'] != '' && templateValue['tax_type'] == "GST") {
|
|
1349
|
+
sgst_amount = (net_amount * templateValue['tax_percentage']) / 200;
|
|
1350
|
+
cgst_amount = sgst_amount;
|
|
1351
|
+
}
|
|
1352
|
+
else if (templateValue['tax_type'] != '' && templateValue['tax_type'] == "IGST") {
|
|
1353
|
+
igst_amount = (net_amount * templateValue['tax_percentage']) / 100;
|
|
1354
|
+
}
|
|
1355
|
+
}
|
|
1356
|
+
netPayable = net_amount + igst_amount + sgst_amount + cgst_amount + sez_amount;
|
|
1357
|
+
const fieldWithValue = {
|
|
1358
|
+
field: 'total_amount', value: [
|
|
1359
|
+
{ field: 'taxable_amount', value: net_amount },
|
|
1360
|
+
{ field: 'sgst_amount', value: sgst_amount },
|
|
1361
|
+
{ field: 'cgst_amount', value: cgst_amount },
|
|
1362
|
+
{ field: 'igst_amount', value: igst_amount },
|
|
1363
|
+
{ field: 'net_payble', value: netPayable },
|
|
1364
|
+
{ field: 'discount_amount', value: discount_amount },
|
|
1365
|
+
]
|
|
1366
|
+
};
|
|
1367
|
+
return this.setValueInVieldsForChild(templateForm, fieldWithValue);
|
|
1368
|
+
}
|
|
1369
|
+
setValueInVieldsForChild(templateForm, field) {
|
|
1370
|
+
templateForm.controls['total_amount'].addControl('discount_amount', new UntypedFormControl(''));
|
|
1371
|
+
field.value.forEach((element) => {
|
|
1372
|
+
templateForm.controls[field.field].controls[element.field].patchValue(element.value);
|
|
1373
|
+
});
|
|
1374
|
+
return templateForm;
|
|
1375
|
+
}
|
|
1376
|
+
calculateAdditionalCost(obj) {
|
|
1377
|
+
let list = obj['additional_cost'];
|
|
1378
|
+
let sum = 0;
|
|
1379
|
+
let net_amt = obj['net_amount'];
|
|
1380
|
+
if (list != null && list.length > 0) {
|
|
1381
|
+
list.forEach((element) => {
|
|
1382
|
+
sum += +(element.amount);
|
|
1383
|
+
});
|
|
1384
|
+
}
|
|
1385
|
+
let final_amt = sum + net_amt;
|
|
1386
|
+
obj['sampling_charge'] = sum;
|
|
1387
|
+
obj['final_amount'] = final_amt;
|
|
1388
|
+
return obj;
|
|
1389
|
+
}
|
|
1390
|
+
update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount, field) {
|
|
1391
|
+
let gst_amount = 0;
|
|
1392
|
+
let cgst_amount = 0;
|
|
1393
|
+
let sgst_amount = 0;
|
|
1394
|
+
let igst_amount = 0;
|
|
1395
|
+
let tax_amount = 0;
|
|
1396
|
+
let sez_amount = 0;
|
|
1397
|
+
let net_payble = 0;
|
|
1398
|
+
let igst_percent = 0;
|
|
1399
|
+
let gst_percent = 0;
|
|
1400
|
+
let sez_percent = 0;
|
|
1401
|
+
let cgst_percent = 0;
|
|
1402
|
+
let sgst_percent = 0;
|
|
1403
|
+
let tax_percentage = 0;
|
|
1404
|
+
let tax_type = templateValue['tax_type'];
|
|
1405
|
+
if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
|
|
1406
|
+
tax_percentage = templateValue.tax_percentage;
|
|
1407
|
+
}
|
|
1408
|
+
if (((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) || tax_type == 'Not Applicable') {
|
|
1409
|
+
net_payble = taxable_amount;
|
|
1410
|
+
}
|
|
1411
|
+
else {
|
|
1412
|
+
switch (tax_type) {
|
|
1413
|
+
case "GST":
|
|
1414
|
+
gst_amount = taxable_amount * tax_percentage / 100;
|
|
1415
|
+
gst_percent = tax_percentage;
|
|
1416
|
+
cgst_percent = gst_percent / 2;
|
|
1417
|
+
sgst_percent = gst_percent / 2;
|
|
1418
|
+
cgst_amount = gst_amount / 2;
|
|
1419
|
+
sgst_amount = gst_amount / 2;
|
|
1420
|
+
net_payble = taxable_amount + gst_amount;
|
|
1421
|
+
tax_amount = gst_amount;
|
|
1422
|
+
igst_amount = 0;
|
|
1423
|
+
igst_percent = 0;
|
|
1424
|
+
break;
|
|
1425
|
+
case "IGST":
|
|
1426
|
+
igst_amount = taxable_amount * tax_percentage / 100;
|
|
1427
|
+
igst_percent = tax_percentage;
|
|
1428
|
+
net_payble = taxable_amount + igst_amount;
|
|
1429
|
+
tax_amount = igst_amount;
|
|
1430
|
+
break;
|
|
1431
|
+
default:
|
|
1432
|
+
}
|
|
1433
|
+
}
|
|
1434
|
+
if (gross_amount > 0) {
|
|
1435
|
+
discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
|
|
1436
|
+
}
|
|
1437
|
+
let total = {};
|
|
1438
|
+
total['surcharge'] = this.getDecimalAmount(surcharge);
|
|
1439
|
+
total['igst_percent'] = this.getDecimalAmount(igst_percent);
|
|
1440
|
+
total['gst_percent'] = this.getDecimalAmount(gst_percent);
|
|
1441
|
+
total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
|
|
1442
|
+
total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
|
|
1443
|
+
total['sez_percent'] = this.getDecimalAmount(sez_percent);
|
|
1444
|
+
total['gross_amount'] = this.getDecimalAmount(gross_amount);
|
|
1445
|
+
total['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1446
|
+
total['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
1447
|
+
total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
|
|
1448
|
+
total['gst_amount'] = this.getDecimalAmount(gst_amount);
|
|
1449
|
+
total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
|
|
1450
|
+
total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
|
|
1451
|
+
total['igst_amount'] = this.getDecimalAmount(igst_amount);
|
|
1452
|
+
total['tax_amount'] = this.getDecimalAmount(tax_amount);
|
|
1453
|
+
total['sez_amount'] = this.getDecimalAmount(sez_amount);
|
|
1454
|
+
total['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1455
|
+
total['net_payble'] = this.getDecimalAmount(net_payble);
|
|
1456
|
+
if (field != null && field.field_name != null && field != "") {
|
|
1457
|
+
delete total[field.field_name];
|
|
1458
|
+
}
|
|
1459
|
+
templateValue = {};
|
|
1460
|
+
templateValue['total_amount'] = total;
|
|
1461
|
+
return templateValue;
|
|
1462
|
+
}
|
|
1463
|
+
update_invoice_totatl_extra_amount(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, extraAmount, taxable_amount, field) {
|
|
1464
|
+
let gst_amount = 0;
|
|
1465
|
+
let cgst_amount = 0;
|
|
1466
|
+
let sgst_amount = 0;
|
|
1467
|
+
let igst_amount = 0;
|
|
1468
|
+
let tax_amount = 0;
|
|
1469
|
+
let sez_amount = 0;
|
|
1470
|
+
let net_payble = 0;
|
|
1471
|
+
let igst_percent = 0;
|
|
1472
|
+
let gst_percent = 0;
|
|
1473
|
+
let sez_percent = 0;
|
|
1474
|
+
let cgst_percent = 0;
|
|
1475
|
+
let sgst_percent = 0;
|
|
1476
|
+
let tax_percentage = 0;
|
|
1477
|
+
let tax_type = templateValue['tax_type'];
|
|
1478
|
+
if (this.coreFunctionService.isNotBlank(templateValue.tax_percentage)) {
|
|
1479
|
+
tax_percentage = templateValue.tax_percentage;
|
|
1480
|
+
}
|
|
1481
|
+
if (((tax_type == null || tax_type == undefined || tax_type == 'NA') && tax_percentage == 0) || tax_type == 'Not Applicable') {
|
|
1482
|
+
net_payble = taxable_amount;
|
|
1483
|
+
}
|
|
1484
|
+
else {
|
|
1485
|
+
switch (tax_type) {
|
|
1486
|
+
case "GST":
|
|
1487
|
+
gst_amount = taxable_amount * tax_percentage / 100;
|
|
1488
|
+
gst_percent = tax_percentage;
|
|
1489
|
+
cgst_percent = gst_percent / 2;
|
|
1490
|
+
sgst_percent = gst_percent / 2;
|
|
1491
|
+
cgst_amount = gst_amount / 2;
|
|
1492
|
+
sgst_amount = gst_amount / 2;
|
|
1493
|
+
net_payble = taxable_amount + gst_amount;
|
|
1494
|
+
tax_amount = gst_amount;
|
|
1495
|
+
igst_amount = 0;
|
|
1496
|
+
igst_percent = 0;
|
|
1497
|
+
break;
|
|
1498
|
+
case "IGST":
|
|
1499
|
+
igst_amount = taxable_amount * tax_percentage / 100;
|
|
1500
|
+
igst_percent = tax_percentage;
|
|
1501
|
+
net_payble = taxable_amount + igst_amount;
|
|
1502
|
+
tax_amount = igst_amount;
|
|
1503
|
+
break;
|
|
1504
|
+
default:
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
if (gross_amount > 0) {
|
|
1508
|
+
discount_percent = this.getDecimalAmount(100 * discount_amount / gross_amount);
|
|
1509
|
+
}
|
|
1510
|
+
let total = {};
|
|
1511
|
+
total['surcharge'] = this.getDecimalAmount(surcharge);
|
|
1512
|
+
total['igst_percent'] = this.getDecimalAmount(igst_percent);
|
|
1513
|
+
total['gst_percent'] = this.getDecimalAmount(gst_percent);
|
|
1514
|
+
total['cgst_percent'] = this.getDecimalAmount(cgst_percent);
|
|
1515
|
+
total['sgst_percent'] = this.getDecimalAmount(sgst_percent);
|
|
1516
|
+
total['sez_percent'] = this.getDecimalAmount(sez_percent);
|
|
1517
|
+
total['gross_amount'] = this.getDecimalAmount(gross_amount);
|
|
1518
|
+
total['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1519
|
+
total['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
1520
|
+
total['taxable_amount'] = this.getDecimalAmount(taxable_amount);
|
|
1521
|
+
total['gst_amount'] = this.getDecimalAmount(gst_amount);
|
|
1522
|
+
total['cgst_amount'] = this.getDecimalAmount(cgst_amount);
|
|
1523
|
+
total['sgst_amount'] = this.getDecimalAmount(sgst_amount);
|
|
1524
|
+
total['igst_amount'] = this.getDecimalAmount(igst_amount);
|
|
1525
|
+
total['tax_amount'] = this.getDecimalAmount(tax_amount);
|
|
1526
|
+
total['sez_amount'] = this.getDecimalAmount(sez_amount);
|
|
1527
|
+
total['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1528
|
+
total['net_payble'] = this.getDecimalAmount(net_payble);
|
|
1529
|
+
total['extraAmount'] = this.getDecimalAmount(extraAmount);
|
|
1530
|
+
if (field != null && field.field_name != null && field != "") {
|
|
1531
|
+
delete total[field.field_name];
|
|
1532
|
+
}
|
|
1533
|
+
templateValue = {};
|
|
1534
|
+
templateValue['total_amount'] = total;
|
|
1535
|
+
return templateValue;
|
|
1536
|
+
}
|
|
1537
|
+
update_invoice_total_on_custom_field(templateValue, lims_segment, field) {
|
|
1538
|
+
let total = templateValue['total_amount'];
|
|
1539
|
+
let surcharge = total['surcharge'];
|
|
1540
|
+
let gross_amount = total['gross_amount'];
|
|
1541
|
+
let discount_percent = total['discount_percent'];
|
|
1542
|
+
let discount_amount = total['discount_amount'];
|
|
1543
|
+
let taxable_amount = total['taxable_amount'];
|
|
1544
|
+
let net_amount = total['net_amount'];
|
|
1545
|
+
if (gross_amount) {
|
|
1546
|
+
switch (field.field_name) {
|
|
1547
|
+
case 'discount_percent':
|
|
1548
|
+
if (discount_percent != 0) {
|
|
1549
|
+
discount_amount = gross_amount * discount_percent / 100;
|
|
1550
|
+
}
|
|
1551
|
+
else {
|
|
1552
|
+
discount_amount = 0;
|
|
1553
|
+
}
|
|
1554
|
+
break;
|
|
1555
|
+
case 'surcharge':
|
|
1556
|
+
if (!surcharge) {
|
|
1557
|
+
surcharge = 0;
|
|
1558
|
+
}
|
|
1559
|
+
break;
|
|
1560
|
+
case 'discount_amount':
|
|
1561
|
+
if (discount_amount) {
|
|
1562
|
+
discount_percent = discount_amount * 100 / gross_amount;
|
|
1563
|
+
}
|
|
1564
|
+
else {
|
|
1565
|
+
discount_percent = 0;
|
|
1566
|
+
}
|
|
1567
|
+
break;
|
|
1568
|
+
}
|
|
1569
|
+
}
|
|
1570
|
+
else {
|
|
1571
|
+
discount_percent = 0;
|
|
1572
|
+
discount_amount = 0;
|
|
1573
|
+
}
|
|
1574
|
+
net_amount = gross_amount - discount_amount;
|
|
1575
|
+
taxable_amount = gross_amount - discount_amount + surcharge;
|
|
1576
|
+
templateValue = this.update_invoice_totatl(templateValue, gross_amount, discount_amount, discount_percent, net_amount, surcharge, taxable_amount, field);
|
|
1577
|
+
return templateValue;
|
|
1578
|
+
}
|
|
1579
|
+
populateParameterAmount(data, net_amount, discount_percent, discount_amount, quantity, gross_amount) {
|
|
1580
|
+
data['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1581
|
+
if (data['total_injection'] && data['total_injection'] > 0) {
|
|
1582
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['total_injection']);
|
|
1583
|
+
data["offer_rate"] = data["per_sample_net_rate"];
|
|
1584
|
+
}
|
|
1585
|
+
else if (data['qty'] > 0) {
|
|
1586
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
|
|
1587
|
+
data["offer_rate"] = data["per_sample_net_rate"];
|
|
1588
|
+
}
|
|
1589
|
+
else {
|
|
1590
|
+
data['per_sample_net_rate'] = 0;
|
|
1591
|
+
}
|
|
1592
|
+
data['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1593
|
+
data['discount_amount'] = this.getDecimalAmount(+discount_amount);
|
|
1594
|
+
data['qty'] = quantity;
|
|
1595
|
+
data['total'] = this.getDecimalAmount(gross_amount);
|
|
1596
|
+
data['quotation_effective_rate'] = this.getDecimalAmount(gross_amount);
|
|
1597
|
+
}
|
|
1598
|
+
setValueInVields(templateForm, field) {
|
|
1599
|
+
field.forEach((element) => {
|
|
1600
|
+
if (templateForm.controls[element.field] !== undefined) {
|
|
1601
|
+
if (typeof (element.value) == 'string') {
|
|
1602
|
+
templateForm.controls[element.field].setValue(element.value);
|
|
1603
|
+
}
|
|
1604
|
+
else {
|
|
1605
|
+
templateForm.controls[element.field].setValue(this.getDecimalAmount(element.value));
|
|
1606
|
+
}
|
|
1607
|
+
}
|
|
1608
|
+
});
|
|
1609
|
+
return templateForm;
|
|
1610
|
+
}
|
|
1611
|
+
create_professional_email(templateForm) {
|
|
1612
|
+
let templateValue = templateForm.getRawValue();
|
|
1613
|
+
let name = templateValue.name;
|
|
1614
|
+
let prof_email = "";
|
|
1615
|
+
let strt = name.substring(0, 2);
|
|
1616
|
+
let last = name.slice(-2);
|
|
1617
|
+
prof_email = strt + last + "@gmail.com";
|
|
1618
|
+
const fieldWithValue = [
|
|
1619
|
+
{ field: 'prof_email', value: prof_email },
|
|
1620
|
+
];
|
|
1621
|
+
this.setValueInVields(templateForm, fieldWithValue);
|
|
1622
|
+
}
|
|
1623
|
+
autopopulateFields(templateForm) {
|
|
1624
|
+
let templateValue = templateForm.getRawValue();
|
|
1625
|
+
let product = templateValue.product.name;
|
|
1626
|
+
const fieldWithValue = [
|
|
1627
|
+
{ field: 'sample_name', value: product },
|
|
1628
|
+
];
|
|
1629
|
+
this.setValueInVields(templateForm, fieldWithValue);
|
|
1630
|
+
}
|
|
1631
|
+
/**
|
|
1632
|
+
* start point for subsequet calculation for quotation
|
|
1633
|
+
*/
|
|
1634
|
+
populateParameterAmountWithSubsequent(data, net_amount, discount_percent, discount_amount, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent) {
|
|
1635
|
+
data['net_amount'] = this.getDecimalAmount(net_amount);
|
|
1636
|
+
if (data['qty'] > 0) {
|
|
1637
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
|
|
1638
|
+
}
|
|
1639
|
+
else {
|
|
1640
|
+
data['per_sample_net_rate'] = 0;
|
|
1641
|
+
}
|
|
1642
|
+
data['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
1643
|
+
data['discount_amount'] = this.getDecimalAmount(+discount_amount);
|
|
1644
|
+
if (subsequent_discount_amount || subsequent_discount_amount == 0) {
|
|
1645
|
+
data["subsequent_discount_amount"] = this.getDecimalAmount(subsequent_discount_amount);
|
|
1646
|
+
}
|
|
1647
|
+
if (subsequent_discount_percent || subsequent_discount_percent == 0) {
|
|
1648
|
+
data["subsequent_discount_percent"] = this.getDecimalAmount(subsequent_discount_percent);
|
|
1649
|
+
}
|
|
1650
|
+
data['qty'] = this.getDecimalAmount(quantity);
|
|
1651
|
+
data['total'] = this.getDecimalAmount(gross_amount);
|
|
1652
|
+
data['quotation_effective_rate'] = this.getDecimalAmount(gross_amount);
|
|
1653
|
+
}
|
|
1654
|
+
calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName) {
|
|
1655
|
+
let quantity = 0;
|
|
1656
|
+
let discount_percent = 0;
|
|
1657
|
+
let net_amount = 0;
|
|
1658
|
+
let incoming_field = fieldName;
|
|
1659
|
+
let sale_rate = data['sale_rate'];
|
|
1660
|
+
let gross_amount = 0;
|
|
1661
|
+
let effectiveTotal = 0;
|
|
1662
|
+
let dis_amt = 0;
|
|
1663
|
+
let subsequent_discount_amount = 0;
|
|
1664
|
+
let subsequent_discount_percent = 0;
|
|
1665
|
+
let totalDiscountAmount = 0;
|
|
1666
|
+
quantity = data.qty;
|
|
1667
|
+
if (!this.coreFunctionService.isNotBlank(quantity)) {
|
|
1668
|
+
quantity = 0;
|
|
1669
|
+
}
|
|
1670
|
+
if (quantity > 0) {
|
|
1671
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1672
|
+
gross_amount = ((quantity - 1) * data.no_of_injection2) + sale_rate;
|
|
1673
|
+
}
|
|
1674
|
+
else {
|
|
1675
|
+
gross_amount = quantity * sale_rate;
|
|
1676
|
+
}
|
|
1677
|
+
}
|
|
1678
|
+
switch (incoming_field) {
|
|
1679
|
+
case "qty":
|
|
1680
|
+
//effectiveTotal = (+quantity) * (+data.offer_rate);
|
|
1681
|
+
if (data.subsequent_offer_rate && data.subsequent_offer_rate > 0 && data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1682
|
+
effectiveTotal = ((quantity - 1) * data.subsequent_offer_rate) + data.offer_rate;
|
|
1683
|
+
if (sale_rate > 0) {
|
|
1684
|
+
dis_amt = sale_rate - data.offer_rate;
|
|
1685
|
+
discount_percent = this.getDecimalAmount(100 * dis_amt / sale_rate);
|
|
1686
|
+
}
|
|
1687
|
+
else {
|
|
1688
|
+
discount_percent = 0;
|
|
1689
|
+
dis_amt = 0;
|
|
1690
|
+
}
|
|
1691
|
+
let subseqGrossAmount = ((quantity - 1) * data.no_of_injection2);
|
|
1692
|
+
let subseqEffectiveAmount = ((quantity - 1) * data.subsequent_offer_rate);
|
|
1693
|
+
if (subseqGrossAmount > 0) {
|
|
1694
|
+
subsequent_discount_amount = subseqGrossAmount - subseqEffectiveAmount;
|
|
1695
|
+
subsequent_discount_percent = this.getDecimalAmount(100 * subsequent_discount_amount / subseqGrossAmount);
|
|
1696
|
+
}
|
|
1697
|
+
else {
|
|
1698
|
+
subsequent_discount_amount = 0;
|
|
1699
|
+
subsequent_discount_percent = 0;
|
|
1700
|
+
}
|
|
1701
|
+
}
|
|
1702
|
+
else {
|
|
1703
|
+
if (sale_rate && sale_rate > 0) {
|
|
1704
|
+
effectiveTotal = quantity * data.offer_rate;
|
|
1705
|
+
}
|
|
1706
|
+
dis_amt = gross_amount - effectiveTotal;
|
|
1707
|
+
if (gross_amount > 0) {
|
|
1708
|
+
discount_percent = this.getDecimalAmount(100 * dis_amt / gross_amount);
|
|
1709
|
+
}
|
|
1710
|
+
else {
|
|
1711
|
+
discount_percent = 0;
|
|
1712
|
+
}
|
|
1713
|
+
}
|
|
1714
|
+
net_amount = effectiveTotal;
|
|
1715
|
+
this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
|
|
1716
|
+
break;
|
|
1717
|
+
case "discount_percent":
|
|
1718
|
+
case "subsequent_discount_percent":
|
|
1719
|
+
if (sale_rate && sale_rate > 0) {
|
|
1720
|
+
discount_percent = data.discount_percent;
|
|
1721
|
+
if (!this.coreFunctionService.isNotBlank(discount_percent)) {
|
|
1722
|
+
discount_percent = 0;
|
|
1723
|
+
}
|
|
1724
|
+
let effectiveGrossAmount = 0;
|
|
1725
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1726
|
+
effectiveGrossAmount = sale_rate;
|
|
1727
|
+
}
|
|
1728
|
+
else {
|
|
1729
|
+
effectiveGrossAmount = quantity * sale_rate;
|
|
1730
|
+
}
|
|
1731
|
+
dis_amt = this.getDecimalAmount(((+effectiveGrossAmount) * (+discount_percent)) / 100);
|
|
1732
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1733
|
+
data['offer_rate'] = (effectiveGrossAmount - dis_amt);
|
|
1734
|
+
}
|
|
1735
|
+
else {
|
|
1736
|
+
data['offer_rate'] = (effectiveGrossAmount - dis_amt) / quantity;
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
else {
|
|
1740
|
+
discount_percent = 0;
|
|
1741
|
+
dis_amt = 0;
|
|
1742
|
+
}
|
|
1743
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1744
|
+
subsequent_discount_percent = data.subsequent_discount_percent;
|
|
1745
|
+
if (!this.coreFunctionService.isNotBlank(subsequent_discount_percent)) {
|
|
1746
|
+
subsequent_discount_percent = 0;
|
|
1747
|
+
}
|
|
1748
|
+
let subsequentGrossAmount = 0;
|
|
1749
|
+
if (quantity > 1) {
|
|
1750
|
+
subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
|
|
1751
|
+
}
|
|
1752
|
+
else {
|
|
1753
|
+
subsequentGrossAmount = data.no_of_injection2;
|
|
1754
|
+
}
|
|
1755
|
+
subsequent_discount_amount = this.getDecimalAmount(((+subsequentGrossAmount) * (+subsequent_discount_percent)) / 100);
|
|
1756
|
+
if (quantity > 1) {
|
|
1757
|
+
data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount) / (quantity - 1);
|
|
1758
|
+
}
|
|
1759
|
+
else {
|
|
1760
|
+
data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount);
|
|
1761
|
+
}
|
|
1762
|
+
}
|
|
1763
|
+
else {
|
|
1764
|
+
subsequent_discount_amount = 0;
|
|
1765
|
+
subsequent_discount_percent = 0;
|
|
1766
|
+
}
|
|
1767
|
+
if (quantity > 1) {
|
|
1768
|
+
totalDiscountAmount = subsequent_discount_amount + dis_amt;
|
|
1769
|
+
}
|
|
1770
|
+
else {
|
|
1771
|
+
totalDiscountAmount = dis_amt;
|
|
1772
|
+
}
|
|
1773
|
+
net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
|
|
1774
|
+
this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
|
|
1775
|
+
break;
|
|
1776
|
+
case "unit_price":
|
|
1777
|
+
if (data.sale_rate && data.sale_rate > 0) {
|
|
1778
|
+
discount_percent = data.discount_percent;
|
|
1779
|
+
if (!this.coreFunctionService.isNotBlank(discount_percent)) {
|
|
1780
|
+
discount_percent = 0;
|
|
1781
|
+
}
|
|
1782
|
+
let effectiveGrossAmount = 0;
|
|
1783
|
+
if (quantity > 1) {
|
|
1784
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1785
|
+
effectiveGrossAmount = data.sale_rate;
|
|
1786
|
+
}
|
|
1787
|
+
else {
|
|
1788
|
+
effectiveGrossAmount = data.sale_rate * quantity;
|
|
1789
|
+
}
|
|
1790
|
+
}
|
|
1791
|
+
else {
|
|
1792
|
+
effectiveGrossAmount = data.sale_rate * quantity;
|
|
1793
|
+
}
|
|
1794
|
+
dis_amt = this.getDecimalAmount(((+effectiveGrossAmount) * (+discount_percent)) / 100);
|
|
1795
|
+
let offerRate = 0;
|
|
1796
|
+
if (quantity > 1) {
|
|
1797
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1798
|
+
offerRate = data.sale_rate - dis_amt;
|
|
1799
|
+
}
|
|
1800
|
+
else {
|
|
1801
|
+
offerRate = data.sale_rate - (dis_amt / quantity);
|
|
1802
|
+
}
|
|
1803
|
+
}
|
|
1804
|
+
else {
|
|
1805
|
+
offerRate = data.sale_rate - dis_amt;
|
|
1806
|
+
}
|
|
1807
|
+
data['offer_rate'] = offerRate;
|
|
1808
|
+
}
|
|
1809
|
+
else {
|
|
1810
|
+
dis_amt = 0;
|
|
1811
|
+
discount_percent = 0;
|
|
1812
|
+
data['offer_rate'] = 0;
|
|
1813
|
+
}
|
|
1814
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1815
|
+
subsequent_discount_percent = data.subsequent_discount_percent;
|
|
1816
|
+
if (!this.coreFunctionService.isNotBlank(subsequent_discount_percent)) {
|
|
1817
|
+
subsequent_discount_percent = 0;
|
|
1818
|
+
}
|
|
1819
|
+
let subsequentGrossAmount = 0;
|
|
1820
|
+
if (quantity > 1) {
|
|
1821
|
+
subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
|
|
1822
|
+
}
|
|
1823
|
+
else {
|
|
1824
|
+
subsequentGrossAmount = data.no_of_injection2;
|
|
1825
|
+
}
|
|
1826
|
+
subsequent_discount_amount = this.getDecimalAmount(((+subsequentGrossAmount) * (+subsequent_discount_percent)) / 100);
|
|
1827
|
+
let offerRate = 0;
|
|
1828
|
+
if (quantity > 1) {
|
|
1829
|
+
offerRate = data.no_of_injection2 - (subsequent_discount_amount / (quantity - 1));
|
|
1830
|
+
}
|
|
1831
|
+
else {
|
|
1832
|
+
offerRate = data.no_of_injection2 - subsequent_discount_amount;
|
|
1833
|
+
}
|
|
1834
|
+
data['subsequent_offer_rate'] = offerRate;
|
|
1835
|
+
}
|
|
1836
|
+
else {
|
|
1837
|
+
subsequent_discount_percent = 0;
|
|
1838
|
+
subsequent_discount_amount = 0;
|
|
1839
|
+
data['subsequent_offer_rate'] = 0;
|
|
1840
|
+
}
|
|
1841
|
+
if (quantity > 1) {
|
|
1842
|
+
totalDiscountAmount = dis_amt + subsequent_discount_amount;
|
|
1843
|
+
}
|
|
1844
|
+
else {
|
|
1845
|
+
totalDiscountAmount = dis_amt;
|
|
1846
|
+
}
|
|
1847
|
+
net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
|
|
1848
|
+
this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
|
|
1849
|
+
break;
|
|
1850
|
+
case "offer_rate":
|
|
1851
|
+
case "subsequent_offer_rate":
|
|
1852
|
+
let offer_rate = 0;
|
|
1853
|
+
if (incoming_field == "subsequent_offer_rate") {
|
|
1854
|
+
offer_rate = this.getDecimalAmount(data.subsequent_offer_rate);
|
|
1855
|
+
}
|
|
1856
|
+
else {
|
|
1857
|
+
offer_rate = this.getDecimalAmount(data.offer_rate);
|
|
1858
|
+
}
|
|
1859
|
+
if (!this.coreFunctionService.isNotBlank(offer_rate)) {
|
|
1860
|
+
offer_rate = 0;
|
|
1861
|
+
}
|
|
1862
|
+
// if (offer_rate >= 0 ) {
|
|
1863
|
+
if (data.subsequent_offer_rate && data.subsequent_offer_rate > 0 && data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1864
|
+
effectiveTotal = ((quantity - 1) * data.subsequent_offer_rate) + data.offer_rate;
|
|
1865
|
+
}
|
|
1866
|
+
else {
|
|
1867
|
+
if (sale_rate && sale_rate > 0) {
|
|
1868
|
+
effectiveTotal = quantity * data.offer_rate;
|
|
1869
|
+
}
|
|
1870
|
+
}
|
|
1871
|
+
totalDiscountAmount = gross_amount - effectiveTotal;
|
|
1872
|
+
net_amount = gross_amount - totalDiscountAmount;
|
|
1873
|
+
//if(incoming_field == 'offer_rate'){
|
|
1874
|
+
let effectiveGrossAmount = 0;
|
|
1875
|
+
if (sale_rate && sale_rate > 0) {
|
|
1876
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1877
|
+
effectiveGrossAmount = sale_rate;
|
|
1878
|
+
dis_amt = effectiveGrossAmount - data.offer_rate;
|
|
1879
|
+
}
|
|
1880
|
+
else {
|
|
1881
|
+
effectiveGrossAmount = sale_rate * quantity;
|
|
1882
|
+
dis_amt = effectiveGrossAmount - (data.offer_rate * quantity);
|
|
1883
|
+
}
|
|
1884
|
+
}
|
|
1885
|
+
else {
|
|
1886
|
+
data["offer_rate"] = 0;
|
|
1887
|
+
}
|
|
1888
|
+
if (effectiveGrossAmount > 0) {
|
|
1889
|
+
discount_percent = this.getDecimalAmount(100 * dis_amt / effectiveGrossAmount);
|
|
1890
|
+
}
|
|
1891
|
+
else {
|
|
1892
|
+
discount_percent = 0;
|
|
1893
|
+
}
|
|
1894
|
+
//}
|
|
1895
|
+
//if (incoming_field == 'subsequent_offer_rate' && data.no_of_injection2 > 0) {
|
|
1896
|
+
let subsequentGrossAmount = 0;
|
|
1897
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1898
|
+
if (quantity == 1) {
|
|
1899
|
+
subsequentGrossAmount = data.no_of_injection2;
|
|
1900
|
+
subsequent_discount_amount = this.getDecimalAmount(subsequentGrossAmount - data.subsequent_offer_rate);
|
|
1901
|
+
}
|
|
1902
|
+
else {
|
|
1903
|
+
subsequentGrossAmount = this.getDecimalAmount(gross_amount - effectiveGrossAmount);
|
|
1904
|
+
subsequent_discount_amount = subsequentGrossAmount - (effectiveTotal - data.offer_rate);
|
|
1905
|
+
}
|
|
1906
|
+
}
|
|
1907
|
+
else {
|
|
1908
|
+
data["subsequent_offer_rate"] = 0;
|
|
1909
|
+
}
|
|
1910
|
+
if (subsequentGrossAmount > 0) {
|
|
1911
|
+
subsequent_discount_percent = this.getDecimalAmount(100 * subsequent_discount_amount / subsequentGrossAmount);
|
|
1912
|
+
}
|
|
1913
|
+
else {
|
|
1914
|
+
subsequent_discount_percent = 0;
|
|
1915
|
+
}
|
|
1916
|
+
//}
|
|
1917
|
+
this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
|
|
1918
|
+
// }else{
|
|
1919
|
+
// if(incoming_field == "subsequent_offer_rate"){
|
|
1920
|
+
// data["subsequent_offer_rate"] = offer_rate;
|
|
1921
|
+
// }else{
|
|
1922
|
+
// data["offer_rate"] = offer_rate;
|
|
1923
|
+
// }
|
|
1924
|
+
// }
|
|
1925
|
+
break;
|
|
1926
|
+
case "discount_amount":
|
|
1927
|
+
case "subsequent_discount_amount":
|
|
1928
|
+
if (incoming_field == 'discount_amount') {
|
|
1929
|
+
if (sale_rate && sale_rate > 0) {
|
|
1930
|
+
dis_amt = data.discount_amount;
|
|
1931
|
+
if (!this.coreFunctionService.isNotBlank(dis_amt)) {
|
|
1932
|
+
dis_amt = 0;
|
|
1933
|
+
}
|
|
1934
|
+
let effectiveGrossAmount = 0;
|
|
1935
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1936
|
+
effectiveGrossAmount = sale_rate;
|
|
1937
|
+
}
|
|
1938
|
+
else {
|
|
1939
|
+
effectiveGrossAmount = quantity * sale_rate;
|
|
1940
|
+
}
|
|
1941
|
+
discount_percent = this.getDecimalAmount(((+dis_amt) * 100) / (+effectiveGrossAmount));
|
|
1942
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0 && quantity > 1) {
|
|
1943
|
+
data['offer_rate'] = (effectiveGrossAmount - dis_amt);
|
|
1944
|
+
}
|
|
1945
|
+
else {
|
|
1946
|
+
data['offer_rate'] = (effectiveGrossAmount - dis_amt) / quantity;
|
|
1947
|
+
}
|
|
1948
|
+
subsequent_discount_amount = data.subsequent_discount_amount;
|
|
1949
|
+
subsequent_discount_percent = data.subsequent_discount_percent;
|
|
1950
|
+
}
|
|
1951
|
+
else {
|
|
1952
|
+
discount_percent = 0;
|
|
1953
|
+
dis_amt = 0;
|
|
1954
|
+
subsequent_discount_amount = data.subsequent_discount_amount;
|
|
1955
|
+
subsequent_discount_percent = data.subsequent_discount_percent;
|
|
1956
|
+
}
|
|
1957
|
+
}
|
|
1958
|
+
else {
|
|
1959
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
1960
|
+
subsequent_discount_amount = this.getDecimalAmount(data.subsequent_discount_amount);
|
|
1961
|
+
if (!this.coreFunctionService.isNotBlank(subsequent_discount_amount)) {
|
|
1962
|
+
subsequent_discount_amount = 0;
|
|
1963
|
+
}
|
|
1964
|
+
let subsequentGrossAmount = 0;
|
|
1965
|
+
if (quantity > 1) {
|
|
1966
|
+
subsequentGrossAmount = data.no_of_injection2 * (quantity - 1);
|
|
1967
|
+
}
|
|
1968
|
+
else {
|
|
1969
|
+
subsequentGrossAmount = data.no_of_injection2;
|
|
1970
|
+
}
|
|
1971
|
+
subsequent_discount_percent = this.getDecimalAmount(((+subsequent_discount_amount) * 100) / (+subsequentGrossAmount));
|
|
1972
|
+
if (quantity > 1) {
|
|
1973
|
+
data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount) / (quantity - 1);
|
|
1974
|
+
}
|
|
1975
|
+
else {
|
|
1976
|
+
data['subsequent_offer_rate'] = (subsequentGrossAmount - subsequent_discount_amount);
|
|
1977
|
+
}
|
|
1978
|
+
discount_percent = data.discount_percent;
|
|
1979
|
+
dis_amt = data.discount_amount;
|
|
1980
|
+
}
|
|
1981
|
+
else {
|
|
1982
|
+
subsequent_discount_amount = 0;
|
|
1983
|
+
subsequent_discount_percent = 0;
|
|
1984
|
+
discount_percent = data.discount_percent;
|
|
1985
|
+
dis_amt = data.discount_amount;
|
|
1986
|
+
}
|
|
1987
|
+
}
|
|
1988
|
+
if (quantity > 1) {
|
|
1989
|
+
totalDiscountAmount = subsequent_discount_amount + dis_amt;
|
|
1990
|
+
}
|
|
1991
|
+
else {
|
|
1992
|
+
totalDiscountAmount = dis_amt;
|
|
1993
|
+
}
|
|
1994
|
+
net_amount = this.getDecimalAmount((+gross_amount) - totalDiscountAmount);
|
|
1995
|
+
this.populateParameterAmountWithSubsequent(data, net_amount, discount_percent, dis_amt, quantity, gross_amount, subsequent_discount_amount, subsequent_discount_percent);
|
|
1996
|
+
break;
|
|
1997
|
+
}
|
|
1998
|
+
}
|
|
1999
|
+
calculateQuotationParameterAmountForAutomotiveLimsWithSubsequent(data, fieldName) {
|
|
2000
|
+
let quantity = 0;
|
|
2001
|
+
let discount_percent = 0;
|
|
2002
|
+
let cost_rate = 0;
|
|
2003
|
+
let net_amount = 0;
|
|
2004
|
+
let param_quantom = 0;
|
|
2005
|
+
let Base_quotation_rate = 0;
|
|
2006
|
+
let incoming_field = fieldName;
|
|
2007
|
+
let gross_amount = 0;
|
|
2008
|
+
let dis_amt = 0;
|
|
2009
|
+
switch (incoming_field) {
|
|
2010
|
+
case "parameter_quantum":
|
|
2011
|
+
let parameterQuantum = data.parameter_quantum;
|
|
2012
|
+
if (!this.coreFunctionService.isNotBlank(parameterQuantum)) {
|
|
2013
|
+
parameterQuantum = 0;
|
|
2014
|
+
}
|
|
2015
|
+
data['quantum_rate'] = (+data.quotation_rate) * (+parameterQuantum);
|
|
2016
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
2017
|
+
net_amount = +data.quotation_effective_rate;
|
|
2018
|
+
if (data.discount_percent) {
|
|
2019
|
+
let discount = ((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
2020
|
+
data['discount_amount'] = discount;
|
|
2021
|
+
net_amount = (+data.quotation_effective_rate) - discount;
|
|
2022
|
+
}
|
|
2023
|
+
data['net_amount'] = net_amount;
|
|
2024
|
+
break;
|
|
2025
|
+
case "qty":
|
|
2026
|
+
let quantity = data.qty;
|
|
2027
|
+
if (!this.coreFunctionService.isNotBlank(quantity)) {
|
|
2028
|
+
quantity = 0;
|
|
2029
|
+
}
|
|
2030
|
+
data['quotation_effective_rate'] = (+quantity) * (+data.quantum_rate);
|
|
2031
|
+
if (data.discount_percent) {
|
|
2032
|
+
let discount = this.getDecimalAmount((+data.quotation_effective_rate) * (+data.discount_percent)) / 100;
|
|
2033
|
+
data['discount_amount'] = discount;
|
|
2034
|
+
}
|
|
2035
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - data['discount_amount']);
|
|
2036
|
+
data['net_amount'] = net_amount;
|
|
2037
|
+
data['total'] = +data.quotation_effective_rate;
|
|
2038
|
+
data['qty'] = data.qty;
|
|
2039
|
+
break;
|
|
2040
|
+
case "discount_percent":
|
|
2041
|
+
let discount_per = data.discount_percent;
|
|
2042
|
+
if (!this.coreFunctionService.isNotBlank(discount_per)) {
|
|
2043
|
+
discount_per = 0;
|
|
2044
|
+
}
|
|
2045
|
+
data['quotation_effective_rate'] = (+data.qty) * (+data.quantum_rate);
|
|
2046
|
+
net_amount = +data.quotation_effective_rate;
|
|
2047
|
+
let discount = this.getDecimalAmount(((+data.quotation_effective_rate) * (+discount_per)) / 100);
|
|
2048
|
+
data['discount_amount'] = discount;
|
|
2049
|
+
net_amount = this.getDecimalAmount((+data.quotation_effective_rate) - discount);
|
|
2050
|
+
data['net_amount'] = net_amount;
|
|
2051
|
+
data['total'] = +data.quotation_effective_rate;
|
|
2052
|
+
data['qty'] = data.qty;
|
|
2053
|
+
data['discount_percent'] = +discount_per;
|
|
2054
|
+
break;
|
|
2055
|
+
case "discount_amount":
|
|
2056
|
+
let discount_amt = data.discount_amount;
|
|
2057
|
+
if (!this.coreFunctionService.isNotBlank(discount_amt)) {
|
|
2058
|
+
discount_amt = 0;
|
|
2059
|
+
}
|
|
2060
|
+
net_amount = (+data.quotation_effective_rate) - (+discount_amt);
|
|
2061
|
+
let discount_perc = this.getDecimalAmount(((+discount_amt) * 100) / (+data.quotation_effective_rate));
|
|
2062
|
+
data['net_amount'] = net_amount;
|
|
2063
|
+
data['discount_percent'] = discount_perc;
|
|
2064
|
+
data['discount_amount'] = +data['discount_amount'];
|
|
2065
|
+
break;
|
|
2066
|
+
default:
|
|
2067
|
+
}
|
|
2068
|
+
if (data['qty'] > 0) {
|
|
2069
|
+
data['per_sample_net_rate'] = this.getDecimalAmount(data['net_amount'] / data['qty']);
|
|
2070
|
+
}
|
|
2071
|
+
else {
|
|
2072
|
+
data['per_sample_net_rate'] = 0;
|
|
2073
|
+
}
|
|
2074
|
+
this.sanitizeParameterAmount(data);
|
|
2075
|
+
}
|
|
2076
|
+
calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, fieldName) {
|
|
2077
|
+
switch (lims_segment) {
|
|
2078
|
+
case 'standard':
|
|
2079
|
+
this.calculateQuotationParameterAmountForLimsWithSubsequent(data, fieldName);
|
|
2080
|
+
break;
|
|
2081
|
+
case 'automotive':
|
|
2082
|
+
this.calculateQuotationParameterAmountForAutomotiveLimsWithSubsequent(data, fieldName);
|
|
2083
|
+
break;
|
|
2084
|
+
}
|
|
2085
|
+
}
|
|
2086
|
+
calculate_quotation_with_subsequent(templateValue, lims_segment, field) {
|
|
2087
|
+
var total = 0;
|
|
2088
|
+
let discount_percent = 0;
|
|
2089
|
+
let net_amount = 0;
|
|
2090
|
+
let sampling_amount = 0;
|
|
2091
|
+
let final_amount = 0;
|
|
2092
|
+
let discount_amount = 0;
|
|
2093
|
+
let quotation_param_methods = [];
|
|
2094
|
+
let unit_price = 0;
|
|
2095
|
+
let paramArray = [];
|
|
2096
|
+
let gross_amount = 0;
|
|
2097
|
+
let field_name = field.field_name;
|
|
2098
|
+
let qty = 0;
|
|
2099
|
+
let product_wise_pricing = templateValue['product_wise_pricing'];
|
|
2100
|
+
let current_disount = 0;
|
|
2101
|
+
if (this.coreFunctionService.isNotBlank(templateValue['discount_percent'])) {
|
|
2102
|
+
current_disount = templateValue['discount_percent'];
|
|
2103
|
+
}
|
|
2104
|
+
if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
|
|
2105
|
+
qty = templateValue.qty;
|
|
2106
|
+
}
|
|
2107
|
+
if (templateValue['quotation_param_methods'] != '' && templateValue['quotation_param_methods'].length > 0) {
|
|
2108
|
+
templateValue['quotation_param_methods'].forEach((element) => {
|
|
2109
|
+
let data = { ...element };
|
|
2110
|
+
paramArray.push(data);
|
|
2111
|
+
});
|
|
2112
|
+
}
|
|
2113
|
+
if (templateValue['sampling_charge'] && templateValue['sampling_charge'] != null) {
|
|
2114
|
+
sampling_amount = templateValue['sampling_charge'];
|
|
2115
|
+
}
|
|
2116
|
+
// if(gross_amount>0){
|
|
2117
|
+
if (true) {
|
|
2118
|
+
switch (field_name) {
|
|
2119
|
+
case 'parameter_array':
|
|
2120
|
+
unit_price = 0;
|
|
2121
|
+
if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
|
|
2122
|
+
unit_price = templateValue.unit_price;
|
|
2123
|
+
}
|
|
2124
|
+
if (product_wise_pricing) {
|
|
2125
|
+
net_amount = qty * unit_price;
|
|
2126
|
+
paramArray.forEach((data) => {
|
|
2127
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
|
|
2128
|
+
gross_amount = gross_amount + data['total'];
|
|
2129
|
+
});
|
|
2130
|
+
discount_amount = gross_amount - net_amount;
|
|
2131
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2132
|
+
paramArray.forEach((data) => {
|
|
2133
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2134
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
|
|
2135
|
+
});
|
|
2136
|
+
}
|
|
2137
|
+
else {
|
|
2138
|
+
if (paramArray.length > 0) {
|
|
2139
|
+
discount_amount = 0;
|
|
2140
|
+
net_amount = 0;
|
|
2141
|
+
total = 0;
|
|
2142
|
+
gross_amount = 0;
|
|
2143
|
+
if (this.coreFunctionService.isNotBlank(templateValue.qty)) {
|
|
2144
|
+
qty = templateValue.qty;
|
|
2145
|
+
}
|
|
2146
|
+
paramArray.forEach((data) => {
|
|
2147
|
+
if (lims_segment == 'standard') {
|
|
2148
|
+
data['qty'] = qty;
|
|
2149
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, 'qty');
|
|
2150
|
+
}
|
|
2151
|
+
gross_amount = gross_amount + data['total'];
|
|
2152
|
+
net_amount = net_amount + data['net_amount'];
|
|
2153
|
+
discount_amount = discount_amount + data['discount_amount'];
|
|
2154
|
+
});
|
|
2155
|
+
}
|
|
2156
|
+
}
|
|
2157
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2158
|
+
templateValue['discount_amount'] = discount_amount;
|
|
2159
|
+
templateValue['net_amount'] = net_amount;
|
|
2160
|
+
templateValue['discount_percent'] = discount_percent;
|
|
2161
|
+
break;
|
|
2162
|
+
case 'discount_percent':
|
|
2163
|
+
discount_percent = templateValue[field_name];
|
|
2164
|
+
paramArray.forEach((data) => {
|
|
2165
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2166
|
+
data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2167
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, field_name);
|
|
2168
|
+
gross_amount = gross_amount + data['total'];
|
|
2169
|
+
});
|
|
2170
|
+
discount_amount = gross_amount * discount_percent / 100;
|
|
2171
|
+
net_amount = gross_amount - discount_amount;
|
|
2172
|
+
templateValue['discount_amount'] = discount_amount;
|
|
2173
|
+
templateValue['net_amount'] = net_amount;
|
|
2174
|
+
templateValue['unit_price'] = net_amount / templateValue['qty'];
|
|
2175
|
+
break;
|
|
2176
|
+
case 'discount_amount':
|
|
2177
|
+
discount_amount = templateValue[field_name];
|
|
2178
|
+
paramArray.forEach((data) => {
|
|
2179
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
|
|
2180
|
+
gross_amount = gross_amount + data['total'];
|
|
2181
|
+
});
|
|
2182
|
+
net_amount = gross_amount - discount_amount;
|
|
2183
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2184
|
+
paramArray.forEach((data) => {
|
|
2185
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2186
|
+
data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2187
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
|
|
2188
|
+
});
|
|
2189
|
+
templateValue['unit_price'] = net_amount / templateValue['qty'];
|
|
2190
|
+
templateValue['net_amount'] = net_amount;
|
|
2191
|
+
templateValue['discount_percent'] = discount_percent;
|
|
2192
|
+
break;
|
|
2193
|
+
case 'net_amount':
|
|
2194
|
+
discount_percent = 0;
|
|
2195
|
+
net_amount = templateValue[field_name];
|
|
2196
|
+
paramArray.forEach((data) => {
|
|
2197
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
|
|
2198
|
+
gross_amount = gross_amount + data['total'];
|
|
2199
|
+
});
|
|
2200
|
+
discount_amount = gross_amount - net_amount;
|
|
2201
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2202
|
+
paramArray.forEach((data) => {
|
|
2203
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2204
|
+
data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2205
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "discount_percent");
|
|
2206
|
+
});
|
|
2207
|
+
templateValue["discount_percent"] = discount_percent;
|
|
2208
|
+
templateValue["discount_amount"] = discount_amount;
|
|
2209
|
+
templateValue['unit_price'] = net_amount / templateValue['qty'];
|
|
2210
|
+
break;
|
|
2211
|
+
case 'unit_price':
|
|
2212
|
+
unit_price = 0;
|
|
2213
|
+
if (this.coreFunctionService.isNotBlank(templateValue.unit_price)) {
|
|
2214
|
+
unit_price = this.getDecimalAmount(templateValue.unit_price);
|
|
2215
|
+
}
|
|
2216
|
+
net_amount = qty * unit_price;
|
|
2217
|
+
paramArray.forEach((data) => {
|
|
2218
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "qty");
|
|
2219
|
+
gross_amount = gross_amount + data['total'];
|
|
2220
|
+
});
|
|
2221
|
+
discount_amount = gross_amount - net_amount;
|
|
2222
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2223
|
+
paramArray.forEach((data) => {
|
|
2224
|
+
if (data.sale_rate && data.sale_rate > 0) {
|
|
2225
|
+
data.discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2226
|
+
}
|
|
2227
|
+
else {
|
|
2228
|
+
data.discount_percent = 0;
|
|
2229
|
+
}
|
|
2230
|
+
if (data.no_of_injection2 && data.no_of_injection2 > 0) {
|
|
2231
|
+
data.subsequent_discount_percent = this.getDecimalAmount(+discount_percent);
|
|
2232
|
+
}
|
|
2233
|
+
else {
|
|
2234
|
+
data.subsequent_discount_percent = 0;
|
|
2235
|
+
}
|
|
2236
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "unit_price");
|
|
2237
|
+
});
|
|
2238
|
+
templateValue['discount_amount'] = discount_amount;
|
|
2239
|
+
templateValue['net_amount'] = net_amount;
|
|
2240
|
+
templateValue['discount_percent'] = discount_percent;
|
|
2241
|
+
break;
|
|
2242
|
+
default:
|
|
2243
|
+
discount_amount = 0;
|
|
2244
|
+
net_amount = 0;
|
|
2245
|
+
if (paramArray.length > 0) {
|
|
2246
|
+
paramArray.forEach((data) => {
|
|
2247
|
+
data['qty'] = this.getDecimalAmount(qty);
|
|
2248
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, field_name);
|
|
2249
|
+
gross_amount = gross_amount + data['total'];
|
|
2250
|
+
net_amount = net_amount + data['net_amount'];
|
|
2251
|
+
if (data['qty'] > 1) {
|
|
2252
|
+
discount_amount = discount_amount + data['discount_amount'] + data['subsequent_discount_amount'];
|
|
2253
|
+
}
|
|
2254
|
+
else {
|
|
2255
|
+
discount_amount = discount_amount + data['discount_amount'];
|
|
2256
|
+
}
|
|
2257
|
+
});
|
|
2258
|
+
}
|
|
2259
|
+
if (product_wise_pricing) {
|
|
2260
|
+
unit_price = templateValue["unit_price"];
|
|
2261
|
+
net_amount = unit_price * qty;
|
|
2262
|
+
discount_amount = gross_amount - net_amount;
|
|
2263
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2264
|
+
if (paramArray.length > 0) {
|
|
2265
|
+
paramArray.forEach((data) => {
|
|
2266
|
+
data['discount_percent'] = discount_percent;
|
|
2267
|
+
this.calculateParameterLimsSegmentWiseForSubsequent(lims_segment, data, "unit_price");
|
|
2268
|
+
});
|
|
2269
|
+
}
|
|
2270
|
+
}
|
|
2271
|
+
discount_percent = this.getDiscountPercentage(current_disount, discount_amount, gross_amount, qty);
|
|
2272
|
+
templateValue['discount_amount'] = discount_amount;
|
|
2273
|
+
templateValue['net_amount'] = net_amount;
|
|
2274
|
+
templateValue['discount_percent'] = discount_percent;
|
|
2275
|
+
}
|
|
2276
|
+
}
|
|
2277
|
+
final_amount = net_amount + sampling_amount;
|
|
2278
|
+
if (templateValue['qty'] > 0) {
|
|
2279
|
+
unit_price = this.getDecimalAmount(net_amount / templateValue['qty']);
|
|
2280
|
+
}
|
|
2281
|
+
else {
|
|
2282
|
+
unit_price = templateValue["unit_price"];
|
|
2283
|
+
}
|
|
2284
|
+
templateValue['total'] = this.getDecimalAmount(gross_amount);
|
|
2285
|
+
templateValue['discount_amount'] = this.getDecimalAmount(discount_amount);
|
|
2286
|
+
templateValue['net_amount'] = this.getDecimalAmount(net_amount);
|
|
2287
|
+
templateValue['discount_percent'] = this.getDecimalAmount(discount_percent);
|
|
2288
|
+
templateValue['final_amount'] = this.getDecimalAmount(final_amount);
|
|
2289
|
+
templateValue['unit_price'] = this.getDecimalAmount(unit_price);
|
|
2290
|
+
if (paramArray.length > 0) {
|
|
2291
|
+
templateValue['quotation_param_methods'] = paramArray;
|
|
2292
|
+
}
|
|
2293
|
+
return templateValue;
|
|
2294
|
+
}
|
|
2295
|
+
}
|
|
2296
|
+
LimsCalculationsService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, deps: [{ token: i1.CommonFunctionService }, { token: i2.CoreFunctionService }, { token: i3.NotificationService }, { token: i4.StorageService }, { token: i5.ApiCallService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
2297
|
+
LimsCalculationsService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, providedIn: 'root' });
|
|
2298
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: LimsCalculationsService, decorators: [{
|
|
2299
|
+
type: Injectable,
|
|
2300
|
+
args: [{
|
|
2301
|
+
providedIn: 'root'
|
|
2302
|
+
}]
|
|
2303
|
+
}], ctorParameters: function () { return [{ type: i1.CommonFunctionService }, { type: i2.CoreFunctionService }, { type: i3.NotificationService }, { type: i4.StorageService }, { type: i5.ApiCallService }]; } });
|
|
2304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltcy1jYWxjdWxhdGlvbnMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaWVudC1jb3JlL3NyYy9saWIvc2VydmljZXMvbGltcy1jYWxjdWxhdGlvbnMvbGltcy1jYWxjdWxhdGlvbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsVUFBVSxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3RELE9BQU8sRUFBaUMsa0JBQWtCLEVBQXlCLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFVMUcsTUFBTSxPQUFPLHVCQUF1QjtJQUVsQyxZQUNVLHFCQUE0QyxFQUM1QyxtQkFBd0MsRUFDeEMsbUJBQXdDLEVBQ3hDLGNBQTZCLEVBQzdCLGNBQTZCO1FBSjdCLDBCQUFxQixHQUFyQixxQkFBcUIsQ0FBdUI7UUFDNUMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFxQjtRQUN4Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLG1CQUFjLEdBQWQsY0FBYyxDQUFlO1FBQzdCLG1CQUFjLEdBQWQsY0FBYyxDQUFlO0lBQ25DLENBQUM7SUFHTCwrQkFBK0IsQ0FBQyxpQkFBcUIsRUFBRSxjQUFrQjtRQUN2RSxJQUFJLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM1QyxJQUFJLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QyxJQUFJLHNCQUFzQixHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRTtZQUNyQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDcEMsc0JBQXNCLElBQUks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QUNoRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1RSxhQUFhLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLGFBQWEsQ0FBQyxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDaEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUN6QixhQUFhLENBQUMseUJBQXlCLENBQUMsR0FBRyxVQUFVLENBQUM7U0FDdkQ7UUFFRCxPQUFPLGFBQWEsQ0FBQztJQUV2QixDQUFDOztxSEE3NEVZLHVCQUF1Qjt5SEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07NEZBRVAsdUJBQXVCO2tCQUhuQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwaUNhbGxTZXJ2aWNlIH0gZnJvbSAnLi8uLi9hcGkvYXBpLWNhbGwvYXBpLWNhbGwuc2VydmljZSc7XHJcbmltcG9ydCB7IEluamVjdGFibGUsIFF1ZXJ5TGlzdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBGb3JtQnVpbGRlciwgVW50eXBlZEZvcm1Hcm91cCwgVW50eXBlZEZvcm1Db250cm9sLCBGb3JtQXJyYXksIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbW1vbkZ1bmN0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2NvbW1vbi11dGlscy9jb21tb24tZnVuY3Rpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IENvcmVGdW5jdGlvblNlcnZpY2UgfSBmcm9tICcuLi9jb21tb24tdXRpbHMvY29yZS1mdW5jdGlvbi9jb3JlLWZ1bmN0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vbm90aWZ5L25vdGlmaWNhdGlvbi5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yYWdlL3N0b3JhZ2Uuc2VydmljZSc7XHJcblxyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgTGltc0NhbGN1bGF0aW9uc1NlcnZpY2Uge1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY29tbW9uRnVuY3Rpb25TZXJ2aWNlOiBDb21tb25GdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcmVGdW5jdGlvblNlcnZpY2U6IENvcmVGdW5jdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHN0b3JhZ2VTZXJ2aWNlOlN0b3JhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhcGlDYWxsU2VydmljZTpBcGlDYWxsU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG5cclxuICBjYWxjdWxhdGVCYWxhbmNlQW1vdW50RW5nTGV0dGVyKHRhbXBsYXRlRm9ybVZhbHVlOmFueSwgbXVsdGlGb3JtVmFsdWU6YW55KSB7XHJcbiAgICBsZXQgbGlzdCA9IHRhbXBsYXRlRm9ybVZhbHVlWydiaWxsaW5nUGxhbiddO1xyXG4gICAgbGV0IGZlZXMgPSArbXVsdGlGb3JtVmFsdWVbJ3RvdGFsRmVlcyddO1xyXG4gICAgbGV0IG1pbGVzdG9uZUFjaGlldmVkdG90YWwgPSAwO1xyXG4gICAgbGV0IHRvdGFsID0gMDtcclxuICAgIGlmIChsaXN0ICE9IG51bGwgJiYgbGlzdCAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbWlsZXN0b25lQWNoaWV2ZWR0b3RhbCArPSBsaXN0W2ldWydmZWVzT25NaWxlc3RvbmVBY2hpZXZlZCddXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHRvdGFsID0gbWlsZXN0b25lQWNoaWV2ZWR0b3RhbCArIHRhbXBsYXRlRm9ybVZhbHVlWydmZWVzT25NaWxlc3RvbmVBY2hpZXZlZCddO1xyXG4gICAgbGV0IHJlbWFuaW5nQW1vdW50ID0gZmVlcyAtIHRvdGFsO1xyXG5cclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIGJhbGFuY2VBbW91bnQ6IHJlbWFuaW5nQW1vdW50XHJcbiAgICB9XHJcbiAgICByZXR1cm4gb2JqO1xyXG4gIH1cclxuICBnZXRUYVdpdGhDYWxjdWxhdGlvbih2YWx1ZTphbnkpIHtcclxuICAgIGxldCBsb2NhbFRhcyA9IDA7XHJcbiAgICBsZXQgY2xhaW1TaGVldCA9IHZhbHVlLmNsYWltU2hlZXQ7XHJcbiAgICBsZXQgcHJpY2VJbkttID0gY2xhaW1TaGVldC5wcmljZUluS207XHJcbiAgICBsZXQgZGlzdGFuY2VJbmttID0gY2xhaW1TaGVldC5kaXN0YW5jZUluS207XHJcbiAgICBsb2NhbFRhcyA9IHByaWNlSW5LbSAqIGRpc3RhbmNlSW5rbTtcclxuICAgIGxldCBvYmoxID0ge1xyXG4gICAgICBsb2NhbFRhOiBsb2NhbFRhc1xyXG4gICAgfVxyXG4gICAgbGV0IG9iaiA9IHtcclxuICAgICAgY2xhaW1TaGVldDogb2JqMVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZVRvdGFsQW1vdW50KGZvcm1WYWx1ZTphbnkpIHtcclxuICAgIGxldCBsaXN0ID0gZm9ybVZhbHVlWydjbGFpbVNoZWV0J107XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRvdGFsICs9IGxpc3RbaV1bJ3RvdGFsRm9yVGhlRGF5J11cclxuICAgIH1cclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIHRvdGFsQW1vdW50T2ZUcmF2ZWxDbGlhbTogdG90YWxcclxuICAgIH1cclxuICAgIHJldHVybiBvYmo7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVUb3RhbEZhaXIodmFsdWU6YW55KSB7XHJcbiAgICBsZXQgdG90YWxGYWlyID0gMDtcclxuICAgIGxldCBjdXJWYWx1ZTphbnkgPSB7fTtcclxuICAgIGxldCBjaGVja0NsYWltU2hlZXQgPSBmYWxzZTtcclxuICAgIGxldCBjYWxjdWxhdGVPYmplY3QgPSB7XHJcbiAgICAgIHRvdGFsRm9yVGhlRGF5IDogMFxyXG4gICAgfVxyXG4gICAgaWYodmFsdWUgJiYgdmFsdWUuY2xhaW1TaGVldCl7XHJcbiAgICAgIGN1clZhbHVlID0gdmFsdWUuY2xhaW1TaGVldDtcclxuICAgICAgY2hlY2tDbGFpbVNoZWV0ID0gdHJ1ZTtcclxuICAgIH1lbHNle1xyXG4gICAgICBjdXJWYWx1ZSA9IHZhbHVlO1xyXG4gICAgfVxyXG4gICAgbGV0IGxvY2FsVGEgPSBjdXJWYWx1ZS5sb2NhbFRhO1xyXG4gICAgbGV0IHRyYXZlbEZhaXIgPSBjdXJWYWx1ZS50cmF2ZWxGYXJlO1xyXG4gICAgbGV0IGRhaWx5QWxsb3dhbmNlID0gY3VyVmFsdWUuZGFpbHlBbGxvd2FuY2U7XHJcbiAgICBsZXQgZm9vZCA9IGN1clZhbHVlLmZvb2Q7XHJcbiAgICBsZXQgaG90ZWwgPSBjdXJWYWx1ZS5ob3RlbDtcclxuICAgIGxldCBwYXJraW5nID0gY3VyVmFsdWUucGFya2luZztcclxuICAgIGxldCB0b29sQ2hhcmdlID0gY3VyVmFsdWUudG9sbENoYXJnZTtcclxuICAgIGxldCBtaXNjZWxsYW5lb3VzID0gY3VyVmFsdWUubWlzY2VsbGFuZW91cztcclxuICAgIHRvdGFsRmFpciA9ICgrdHJhdmVsRmFpcikgKyAoK2xvY2FsVGEpICsgKCtkYWlseUFsbG93YW5jZSkgKyAoK2Zvb2QpICsgKCtob3RlbCkgKyAoK3BhcmtpbmcpICsgKCt0b29sQ2hhcmdlKSArICgrbWlzY2VsbGFuZW91cyk7XHJcblxyXG4gICAgY2FsY3VsYXRlT2JqZWN0LnRvdGFsRm9yVGhlRGF5ID0gdG90YWxGYWlyO1xyXG4gICAgaWYoY2hlY2tDbGFpbVNoZWV0KXtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBjbGFpbVNoZWV0OiBjYWxjdWxhdGVPYmplY3RcclxuICAgICAgfVxyXG4gICAgfWVsc2V7XHJcbiAgICAgIHJldHVybiBjYWxjdWxhdGVPYmplY3RcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGJ1Z2dldEZvcmNhc3RDYWxjKHRlbXBsYXRlRm9ybTogYW55KSB7XHJcbiAgICBsZXQgdGVtcGxhdGVWYWx1ZSA9IHRlbXBsYXRlRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gICAgbGV0IGFjdHVhbEN1cllyID0gdGVtcGxhdGVWYWx1ZS5hY3R1YWxfY3VycmVudDtcclxuICAgIGxldCBhY3R1YWxMYXN0WXIgPSB0ZW1wbGF0ZVZhbHVlLmFjdHVhbHM7XHJcbiAgICBsZXQgYnVkZ2V0ID0gdGVtcGxhdGVWYWx1ZS50aGlzX3llYXI7XHJcbiAgICBsZXQgZ3Jvd3RocGVyczphbnkgPSB7fTtcclxuICAgIGxldCBidWRnZXRwZXJzOmFueSA9IHt9O1xyXG4gICAgbGV0IHZhbHVlOmFueSA9IFtdO1xyXG4gICAgbGV0IHZhbHVlMTphbnkgPSBbXTtcclxuICAgIE9iamVjdC5rZXlzKGFjdHVhbEN1cllyKS5mb3JFYWNoKGtleSA9PiB7XHJcbiAgICAgIGxldCBncm93dGhwZXIgPSAwO1xyXG4gICAgICBsZXQgYnVkZ2V0cGVyID0gMDtcclxuICAgICAgbGV0IGFjdHVhbEN1cllyTW9udGggPSBhY3R1YWxDdXJZcltrZXldO1xyXG4gICAgICBsZXQgYWN0dWFsTGFzdFlyTW9udGggPSBhY3R1YWxMYXN0WXJba2V5XTtcclxuICAgICAgaWYgKGFjdHVhbExhc3RZck1vbnRoICE9IDApIHtcclxuICAgICAgICBncm93dGhwZXIgPSBhY3R1YWxDdXJZck1vbnRoIC8gYWN0dWFsTGFzdFlyTW9udGg7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGxldCBidWRnZXRjdXJZck1vbnRoID0gYnVkZ2V0W2tleV07XHJcbiAgICAgIGlmIChidWRnZXRjdXJZck1vbnRoICE9IDApIHtcclxuICAgICAgICBidWRnZXRwZXIgPSBhY3R1YWxDdXJZck1vbnRoIC8gYnVkZ2V0Y3VyWXJNb250aDtcclxuICAgICAgfVxyXG5cclxuICAgICAgZ3Jvd3RocGVyc1trZXldID0gZ3Jvd3RocGVyO1xyXG4gICAgICBsZXQgb2JqID0ge1xyXG4gICAgICAgIGZpZWxkOiBrZXksIHZhbHVlOiBncm93dGhwZXJzW2tleV1cclxuICAgICAgfVxyXG4gICAgICB2YWx1ZS5wdXNoKG9iailcclxuXHJcbiAgICAgIGJ1ZGdldHBlcnNba2V5XSA9IGJ1ZGdldHBlcjtcclxuICAgICAgbGV0IG9iajEgPSB7XHJcbiAgICAgICAgZmllbGQ6IGtleSwgdmFsdWU6IGJ1ZGdldHBlcnNba2V5XVxyXG4gICAgICB9XHJcbiAgICAgIHZhbHVlMS5wdXNoKG9iajEpXHJcbiAgICB9KVxyXG4gICAgY29uc3QgZmllbGRXaXRoVmFsdWVmb3Jncm93dGggPSB7XHJcbiAgICAgIGZpZWxkOiAnZ3Jvd3RoX3BlcicsIHZhbHVlOiB2YWx1ZVxyXG4gICAgfVxyXG4gICAgZmllbGRXaXRoVmFsdWVmb3Jncm93dGgudmFsdWUuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgKDxVbnR5cGVkRm9ybUdyb3VwPnRlbXBsYXRlRm9ybS5jb250cm9sc1tmaWVsZFdpdGhWYWx1ZWZvcmdyb3d0aC5maWVsZF0pLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRdLnBhdGNoVmFsdWUoZWxlbWVudC52YWx1ZSk7XHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IGZpZWxkV2l0aFZhbHVlZm9yQnVkZ2V0ID0ge1xyXG4gICAgICBmaWVsZDogJ2J1ZGdldF9wZXInLCB2YWx1ZTogdmFsdWUxXHJcbiAgICB9XHJcbiAgICBmaWVsZFdpdGhWYWx1ZWZvckJ1ZGdldC52YWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkV2l0aFZhbHVlZm9yQnVkZ2V0LmZpZWxkXSkuY29udHJvbHNbZWxlbWVudC5maWVsZF0ucGF0Y2hWYWx1ZShlbGVtZW50LnZhbHVlKTtcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVBdXRvRWZmUmF0ZShkYXRhOmFueSkge1xyXG4gICAgZGF0YS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBlbGVtZW50W1wicGVyX3NhbXBsZV9uZXRfcmF0ZVwiXSA9IGVsZW1lbnRbXCJub19vZl9zYW1wbGVzXCJdICogZWxlbWVudFtcInF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZVwiXTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGRhdGE7XHJcbiAgfVxyXG4gIGNhbGN1bGF0ZV9uZXh0X2NhbGlicmF0aW9uX2R1ZV9kYXRlKHRlbXBsYXRlRm9ybTphbnkpIHtcclxuICAgIGNvbnN0IG9iamVjdFZhbHVlID0gdGVtcGxhdGVGb3JtLmdldFJhd1ZhbHVlKCk7XHJcbiAgICBsZXQgY2FsaWJyYXRpb25fZGF0ZSA9IG9iamVjdFZhbHVlWydjYWxpYnJhdGlvbl9kYXRlJ11cclxuICAgIGxldCBjYWxpYnJhdGlvbl9mcmVxdWVuY3kgPSBvYmplY3RWYWx1ZVsnY2FsaWJyYXRpb25fZnJlcXVlbmN5J11cclxuICAgIGlmIChjYWxpYnJhdGlvbl9kYXRlICE9IG51bGwgJiYgY2FsaWJyYXRpb25fZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbGlicmF0aW9uX2ZyZXF1ZW5jeSAhPSBudWxsICYmIGNhbGlicmF0aW9uX2ZyZXF1ZW5jeSAhPT0gdW5kZWZpbmVkICYmIGNhbGlicmF0aW9uX2RhdGUgIT09IFwiXCIgJiYgY2FsaWJyYXRpb25fZnJlcXVlbmN5ICE9PSBcIlwiKSB7XHJcbiAgICAgIGxldCBkYXRlID0gbmV3IERhdGUoKTtcclxuICAgICAgZGF0ZS5zZXREYXRlKGNhbGlicmF0aW9uX2RhdGUuZ2V0RGF0ZSgpICsgY2FsaWJyYXRpb25fZnJlcXVlbmN5KTtcclxuICAgICAgdGVtcGxhdGVGb3JtLmNvbnRyb2xzWyduZXh0X2RhdGUnXS5zZXRWYWx1ZShkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0aW9uX29mX3NjcmlwdF9mb3JfdGRzKG9iamVjdDphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIGNvbnN0IHN0YXRpY01vZGFsID0gW11cclxuICAgIHN0YXRpY01vZGFsLnB1c2godGhpcy5hcGlDYWxsU2VydmljZS5nZXRQYXlsb2RXaXRoQ3JpdGVyaWEoJ1FUTVA6Q0FMQ1VMQVRJT05fU0NSSVBUJywgZmllbGQub25jaGFuZ2VfY2FsbF9iYWNrX2ZpZWxkLCBmaWVsZC5vbmNoYW5nZV9hcGlfcGFyYW1zX2NyaXRlcmlhLCBvYmplY3QpKTtcclxuICAgIHN0YXRpY01vZGFsWzBdWydkYXRhJ10gPSBvYmplY3Q7XHJcbiAgICByZXR1cm4gc3RhdGljTW9kYWw7XHJcbiAgfVxyXG4gIGdldERlY2ltYWxBbW91bnQodmFsdWU6YW55KTogYW55IHtcclxuICAgIGxldCBkZWNpbWFsZGlnaXRObzpudW1iZXIgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldEFwcGxpY2F0aW9uU2V0dGluZygpLnJvdW5kVmFsdWVOb09mRGlnaXRzO1xyXG4gICAgbGV0IGRlY2ltYWxubzpudW1iZXIgPSAyO1xyXG4gICAgaWYoZGVjaW1hbGRpZ2l0Tm8gIT0gdW5kZWZpbmVkICYmIGRlY2ltYWxkaWdpdE5vICE9IG51bGwpIHtcclxuICAgICAgZGVjaW1hbG5vID0gZGVjaW1hbGRpZ2l0Tm87XHJcbiAgICB9XHJcbiAgICBpZiAodHlwZW9mICh2YWx1ZSkgPT0gJ251bWJlcicgJiYgdmFsdWUgIT0gdW5kZWZpbmVkICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b0ZpeGVkKGRlY2ltYWxubykpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gIH1cclxuICBsZWdhY3lRdW90YXRpb25QYXJhbWV0ZXJDYWxjdWxhdGlvbihkYXRhOmFueSwgZmllbGROYW1lOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbV9xdWFudG9tID0gMDtcclxuICAgIGxldCBCYXNlX3F1b3RhdGlvbl9yYXRlID0gMDtcclxuICAgIGxldCBpbmNvbWluZ19maWVsZCA9IGZpZWxkTmFtZS5maWVsZF9uYW1lO1xyXG5cclxuICAgIGxldCBncm9zc19hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBkaXNfYW10OmFueSA9IDA7XHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcbiAgICAgIGNhc2UgXCJjbGFpbV91bml0XCI6XHJcbiAgICAgIGNhc2UgXCJjbGFpbV9wZXJjZW50XCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVfcGhhcm1hX2NsYWltX3ZhbHVlcyhkYXRhKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInBhcmFtZXRlcl9xdWFudHVtXCI6XHJcbiAgICAgICAgaWYgKGRhdGEucGFyYW1ldGVyX3F1YW50dW0pIHtcclxuICAgICAgICAgIGRhdGFbJ3F1YW50dW1fcmF0ZSddID0gKCtkYXRhLnF1b3RhdGlvbl9yYXRlKSAqICgrZGF0YS5wYXJhbWV0ZXJfcXVhbnR1bSk7XHJcbiAgICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgICBpZiAoZGF0YS5kaXNjb3VudF9wZXJjZW50KSB7XHJcbiAgICAgICAgICAgIGxldCBkaXNjb3VudCA9ICgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInF0eVwiOlxyXG4gICAgICAgIGlmIChkYXRhLnF0eSkge1xyXG4gICAgICAgICAgaWYgKGRhdGEuYnJhbmNoICYmIGRhdGEuYnJhbmNoLm5hbWUgJiYgZGF0YS5icmFuY2gubmFtZSA9PT0gXCJQdW5lXCIpIHtcclxuICAgICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICAgIH1cclxuXHJcblxyXG4gICAgICAgICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uID4gMCkge1xyXG4gICAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcclxuICAgICAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgICAgIGxldCBkaXNjb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudDtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICAgICAgZGF0YVsndG90YWwnXSA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkaXNjb3VudF9wZXJjZW50XCI6XHJcbiAgICAgICAgaWYgKCFkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgfSBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YS5icmFuY2ggJiYgZGF0YS5icmFuY2gubmFtZSAmJiBkYXRhLmJyYW5jaC5uYW1lID09PSBcIlB1bmVcIikge1xyXG4gICAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLm9mZmVyX3JhdGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDApO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50KTtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkYXRhLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIGRhdGFbJ3RvdGFsJ10gPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGU7XHJcbiAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eTtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSArZGF0YVsnZGlzY291bnRfcGVyY2VudCddO1xyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJvZmZlcl9yYXRlXCI6XHJcbiAgICAgICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uID4gMCkge1xyXG4gICAgICAgICAgaWYgKGRhdGEub2ZmZXJfcmF0ZSkge1xyXG4gICAgICAgICAgICBkYXRhW1wicmF0ZV9wZXJfaW5qZWN0aW9uXCJdID0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyQW10T25JbmplY3Rpb24oZGF0YSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChkYXRhLm9mZmVyX3JhdGUpIHtcclxuICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEub2ZmZXJfcmF0ZSAqIGRhdGEucXR5KTtcclxuICAgICAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCAmJiBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzX2FtdCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoZ3Jvc3NfYW1vdW50ICogZGF0YS5kaXNjb3VudF9wZXJjZW50KSAvIDEwMCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc19hbXQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNfYW10O1xyXG4gICAgICAgICAgZGF0YVsndG90YWwnXSA9IGdyb3NzX2Ftb3VudDtcclxuICAgICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gZ3Jvc3NfYW1vdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGlmICgoZGF0YS5kaXNjb3VudF9hbW91bnQgPT0gMCkgfHwgKGRhdGEuZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9ICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gKCtkYXRhLmRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgICBsZXQgZGlzY291bnRfcGVyID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEuZGlzY291bnRfYW1vdW50KSAqIDEwMCkgLyAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSk7XHJcbiAgICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyO1xyXG4gICAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSArZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgIH1cclxuICAgIGlmIChkYXRhWydxdHknXSA+IDApIHtcclxuICAgICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIH1cclxuICAgIGxldCBhbW91bnRGaWVsZHMgPSBbXHJcbiAgICAgICdxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnLFxyXG4gICAgICAnZGlzY291bnRfYW1vdW50JyxcclxuICAgICAgJ2Rpc2NvdW50X3BlcmNlbnQnLFxyXG4gICAgICAnbmV0X2Ftb3VudCcsXHJcbiAgICAgICd0b3RhbCcsXHJcbiAgICAgICdwZXJfc2FtcGxlX25ldF9yYXRlJ1xyXG4gICAgXTtcclxuICAgIGFtb3VudEZpZWxkcy5mb3JFYWNoKGNvbHVtbiA9PiB7XHJcbiAgICAgIGRhdGFbY29sdW1uXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhW2NvbHVtbl0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3BoYXJtYV9jbGFpbV92YWx1ZXMobmV3X2VsZW1lbnQ6IGFueSkge1xyXG4gICAgaWYgKG5ld19lbGVtZW50LmNsYWltX2RlcGVuZGVudCAmJiAhaXNOYU4obmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgaWYgKCFpc05hTigrbmV3X2VsZW1lbnQubGltaXRfZnJvbSkpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gPSAoK25ld19lbGVtZW50LmxpbWl0X2Zyb20pICogKG5ld19lbGVtZW50LmNsYWltX3BlcmNlbnQpIC8gMTAwO1xyXG4gICAgICAgICAgaWYgKG5ld19lbGVtZW50LmNsYWltX3VuaXQpIHtcclxuICAgICAgICAgICAgbmV3X2VsZW1lbnQuY2xhaW1fbGltaXRfZnJvbSA9IG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gKyBcIiBcIiArIG5ld19lbGVtZW50LmNsYWltX3VuaXQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X2Zyb20gPSBuZXdfZWxlbWVudC5saW1pdF9mcm9tO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWlzTmFOKCtuZXdfZWxlbWVudC5saW1pdF90bykpIHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkpIHtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmNsYWltX2xpbWl0X3RvID0gKCtuZXdfZWxlbWVudC5saW1pdF90bykgKiAobmV3X2VsZW1lbnQuY2xhaW1fcGVyY2VudCkgLyAxMDA7XHJcbiAgICAgICAgICBpZiAobmV3X2VsZW1lbnQuY2xhaW1fdW5pdCkge1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5jbGFpbV9saW1pdF90byA9IG5ld19lbGVtZW50LmNsYWltX2xpbWl0X3RvICsgXCIgXCIgKyBuZXdfZWxlbWVudC5jbGFpbV91bml0O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXdfZWxlbWVudC5jbGFpbV9saW1pdF90byA9IG5ld19lbGVtZW50LmxpbWl0X3RvO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlUGhhcmFtYVBhcmFtZXRlckFtb3VudChkYXRhOmFueSwgb2ZmZXJfcmF0ZTogbnVtYmVyLCBxdWFudGl0eTogbnVtYmVyLCBmaWVsZF9uYW1lPzphbnkpIHtcclxuICAgIGxldCBncm9zc19hbW91bnQ6YW55ID0gdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJBbXRPbkluamVjdGlvbihkYXRhLCBkYXRhW1wicmF0ZV9wZXJfaW5qZWN0aW9uXCJdLCBxdWFudGl0eSlcclxuICAgIGxldCBlZmZlY3RpdmVUb3RhbDphbnkgPSB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGEsIG9mZmVyX3JhdGUsIHF1YW50aXR5KVxyXG4gICAgbGV0IGRpc19hbXQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbDtcclxuICAgIHN3aXRjaCAoZmllbGRfbmFtZSkge1xyXG4gICAgICBjYXNlICdkaXNjb3VudF9hbW91bnQnOlxyXG4gICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gZ3Jvc3NfYW1vdW50IC0gZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgZGlzX2FtdCA9IGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgIH1cclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAoZGlzX2FtdCAvIGdyb3NzX2Ftb3VudCkgKiAxMDA7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIGVmZmVjdGl2ZVRvdGFsLCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50KVxyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVBhcmFtZXRlckFtdE9uSW5qZWN0aW9uKGRhdGE6YW55LCByYXRlOmFueSwgcXVhbnRpdHk6YW55KSB7XHJcbiAgICBsZXQgdG90YWxJbmplY3Rpb24gPSBkYXRhLm5vX29mX2luamVjdGlvbjtcclxuICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodG90YWxJbmplY3Rpb24pKSB7XHJcbiAgICAgIHRvdGFsSW5qZWN0aW9uID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHJhdGUpKSB7XHJcbiAgICAgIHJhdGUgPSAwO1xyXG4gICAgfVxyXG4gICAgbGV0IHJhdGVfcGVyX2luamVjdGlvbiA9IHJhdGU7XHJcbiAgICBsZXQgdG90YWxBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWxJbmplY3Rpb24gKiByYXRlX3Blcl9pbmplY3Rpb24pO1xyXG4gICAgaWYgKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDApIHtcclxuICAgICAgbGV0IG5vX29mX2luamVjdGlvbjIgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgIGlmIChxdWFudGl0eSA+IDEgJiYgbm9fb2ZfaW5qZWN0aW9uMiA+IDApIHtcclxuICAgICAgICB0b3RhbEluamVjdGlvbiA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiArIChxdWFudGl0eSAtIDEpICogbm9fb2ZfaW5qZWN0aW9uMik7XHJcbiAgICAgICAgdG90YWxBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWxJbmplY3Rpb24gKiByYXRlX3Blcl9pbmplY3Rpb24pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChkYXRhLm5vX29mX2luamVjdGlvbiA+IDAgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yIDw9IDApIHtcclxuICAgICAgbGV0IG5vX29mX2luamVjdGlvbiA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uO1xyXG4gICAgICBpZiAocXVhbnRpdHkgPiAxICYmIG5vX29mX2luamVjdGlvbiA+IDApIHtcclxuICAgICAgICB0b3RhbEluamVjdGlvbiA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiArIChxdWFudGl0eSAtIDEpICogbm9fb2ZfaW5qZWN0aW9uKTtcclxuICAgICAgICB0b3RhbEFtb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0b3RhbEluamVjdGlvbiAqIHJhdGVfcGVyX2luamVjdGlvbik7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICB0b3RhbEFtb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChxdWFudGl0eSAqIHRvdGFsSW5qZWN0aW9uICogcmF0ZV9wZXJfaW5qZWN0aW9uKTtcclxuICAgIH1cclxuICAgIC8vIGRhdGFbXCJxdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcIl09IHRvdGFsQW1vdW50O1xyXG4gICAgLy8gZGF0YVtcInRvdGFsXCJdID0gdG90YWxBbW91bnQ7XHJcbiAgICAvLyBkYXRhW1wiZGlzY291bnRfYW1vdW50XCJdID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KChkYXRhLnRvdGFsKiBkYXRhLmRpc2NvdW50X3BlcmNlbnQpLzEwMCk7XHJcbiAgICAvLyBkYXRhW1wibmV0X2Ftb3VudFwiXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhLnRvdGFsLSBkYXRhLmRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICBkYXRhW1widG90YWxfaW5qZWN0aW9uXCJdID0gdG90YWxJbmplY3Rpb247XHJcbiAgICByZXR1cm4gdG90YWxBbW91bnQ7XHJcbiAgfVxyXG5cclxuICBnZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50OiBudW1iZXIsIGRpc2NvdW50X2Ftb3VudDogbnVtYmVyLCBncm9zc19hbW91bnQ6IG51bWJlciwgcXVhbnRpdHk6IG51bWJlcikge1xyXG4gICAgaWYgKHF1YW50aXR5ID4gMCAmJiBncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgIGN1cnJlbnRfZGlzb3VudCA9IGRpc2NvdW50X2Ftb3VudCAqIDEwMCAvIGdyb3NzX2Ftb3VudDtcclxuICAgIH1cclxuICAgIHJldHVybiBjdXJyZW50X2Rpc291bnQ7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JBdXRvbW90aXZlTGltcyhkYXRhOmFueSwgZmllbGROYW1lOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbV9xdWFudG9tID0gMDtcclxuICAgIGxldCBCYXNlX3F1b3RhdGlvbl9yYXRlID0gMDtcclxuICAgIGxldCBpbmNvbWluZ19maWVsZCA9IGZpZWxkTmFtZTtcclxuXHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNfYW10ID0gMDtcclxuICAgIHN3aXRjaCAoaW5jb21pbmdfZmllbGQpIHtcclxuICAgICAgY2FzZSBcInBhcmFtZXRlcl9xdWFudHVtXCI6XHJcbiAgICAgICAgbGV0IHBhcmFtZXRlclF1YW50dW0gPSBkYXRhLnBhcmFtZXRlcl9xdWFudHVtO1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocGFyYW1ldGVyUXVhbnR1bSkpIHtcclxuICAgICAgICAgIHBhcmFtZXRlclF1YW50dW0gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBkYXRhWydxdWFudHVtX3JhdGUnXSA9ICgrZGF0YS5xdW90YXRpb25fcmF0ZSkgKiAoK3BhcmFtZXRlclF1YW50dW0pO1xyXG4gICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gKCtkYXRhLnF0eSkgKiAoK2RhdGEucXVhbnR1bV9yYXRlKTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgbGV0IGRpc2NvdW50ID0gKCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkYXRhLmRpc2NvdW50X3BlcmNlbnQpKSAvIDEwMDtcclxuICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSBkaXNjb3VudDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcInF0eVwiOlxyXG4gICAgICAgIGxldCBxdWFudGl0eSA9IGRhdGEucXR5O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocXVhbnRpdHkpKSB7XHJcbiAgICAgICAgICBxdWFudGl0eSA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrcXVhbnRpdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgaWYgKGRhdGEuZGlzY291bnRfcGVyY2VudCkge1xyXG4gICAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkYXRhLmRpc2NvdW50X3BlcmNlbnQpKSAvIDEwMDtcclxuICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIG5ldF9hbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSBkYXRhWydkaXNjb3VudF9hbW91bnQnXSk7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudFxyXG4gICAgICAgIGRhdGFbJ3RvdGFsJ10gPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGU7XHJcbiAgICAgICAgZGF0YVsncXR5J10gPSBkYXRhLnF0eVxyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X3BlcmNlbnRcIjpcclxuICAgICAgICBsZXQgZGlzY291bnRfcGVyID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyKSkge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK2RhdGEucXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSArZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGVcclxuICAgICAgICBsZXQgZGlzY291bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpICogKCtkaXNjb3VudF9wZXIpKSAvIDEwMCk7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQpO1xyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICBkYXRhWyd0b3RhbCddID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlO1xyXG4gICAgICAgIGRhdGFbJ3F0eSddID0gZGF0YS5xdHk7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gK2Rpc2NvdW50X3BlcjtcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiZGlzY291bnRfYW1vdW50XCI6XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X2FtdCA9IGRhdGEuZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfYW10KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfYW10ID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIG5ldF9hbW91bnQgPSAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtICgrZGlzY291bnRfYW10KTtcclxuICAgICAgICBsZXQgZGlzY291bnRfcGVyYyA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNjb3VudF9hbXQpICogMTAwKSAvICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpKTtcclxuICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmM7XHJcbiAgICAgICAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSArZGF0YVsnZGlzY291bnRfYW1vdW50J107XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG5cclxuICAgIH1cclxuICAgIGlmIChkYXRhWydxdHknXSA+IDApIHtcclxuICAgICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9IDA7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNhbml0aXplUGFyYW1ldGVyQW1vdW50KGRhdGEpO1xyXG4gIH1cclxuXHJcbiAgc2FuaXRpemVQYXJhbWV0ZXJBbW91bnQoZGF0YTphbnkpe1xyXG4gICAgbGV0IGFtb3VudEZpZWxkcyA9IFtcclxuICAgICAgJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZScsXHJcbiAgICAgICdkaXNjb3VudF9hbW91bnQnLFxyXG4gICAgICAnZGlzY291bnRfcGVyY2VudCcsXHJcbiAgICAgICduZXRfYW1vdW50JyxcclxuICAgICAgJ3RvdGFsJyxcclxuICAgICAgJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXHJcbiAgICBdO1xyXG4gICAgYW1vdW50RmllbGRzLmZvckVhY2goY29sdW1uID0+IHtcclxuICAgICAgZGF0YVtjb2x1bW5dID0gICB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YVtjb2x1bW5dKTtcclxuICAgICAgaWYodHlwZW9mKGRhdGFbY29sdW1uXSkgIT0gJ251bWJlcicpe1xyXG4gICAgICAgIGRhdGFbY29sdW1uXT0wO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG5cclxuICBjYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JMaW1zKGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgcXVhbnRpdHkgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQ6YW55ID0gMDtcclxuICAgIGxldCBjb3N0X3JhdGUgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQ6YW55ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHBhcmFtX3F1YW50b20gPSAwO1xyXG4gICAgbGV0IEJhc2VfcXVvdGF0aW9uX3JhdGUgPSAwO1xyXG4gICAgbGV0IGluY29taW5nX2ZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgbGV0IHNhbGVfcmF0ZSA9IGRhdGFbJ3NhbGVfcmF0ZSddO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZWZmZWN0aXZlVG90YWwgPSAwO1xyXG4gICAgbGV0IGRpc19hbXQ6YW55ID0gMDtcclxuICAgIHF1YW50aXR5ID0gZGF0YS5xdHk7XHJcbiAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHF1YW50aXR5KSkge1xyXG4gICAgICBxdWFudGl0eSA9IDA7XHJcbiAgICB9XHJcbiAgICBncm9zc19hbW91bnQgPSBxdWFudGl0eSAqIHNhbGVfcmF0ZTtcclxuXHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcblxyXG4gICAgICBjYXNlIFwicXR5XCI6XHJcbiAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoK3F1YW50aXR5KSAqICgrZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBoYXJhbWFQYXJhbWV0ZXJBbW91bnQoZGF0YSwgZGF0YS5vZmZlcl9yYXRlLCBxdWFudGl0eSk7XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgIGRpc19hbXQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbDtcclxuICAgICAgICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwICogZGlzX2FtdCAvIGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBlZmZlY3RpdmVUb3RhbDtcclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudClcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfcGVyY2VudFwiOlxyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSBkYXRhLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkaXNjb3VudF9wZXJjZW50KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmIChkYXRhLm5vX29mX2luamVjdGlvbiA+IDApIHtcclxuICAgICAgICAgIGxldCBvZmZlcmluZ1JhdGUgPSBkYXRhLnJhdGVfcGVyX2luamVjdGlvbiAqICgxIC0gZGlzY291bnRfcGVyY2VudCAvIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBoYXJhbWFQYXJhbWV0ZXJBbW91bnQoZGF0YSwgb2ZmZXJpbmdSYXRlLCBxdWFudGl0eSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGRpc19hbXQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZ3Jvc3NfYW1vdW50KSAqICgrZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCtncm9zc19hbW91bnQpIC0gZGlzX2FtdCk7XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInVuaXRfcHJpY2VcIjpcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICBsZXQgb2ZmZXJpbmdSYXRlID0gZGF0YS5yYXRlX3Blcl9pbmplY3Rpb24gKiAoMSAtIGRpc2NvdW50X3BlcmNlbnQgLyAxMDApO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyaW5nUmF0ZSwgcXVhbnRpdHkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBkaXNfYW10ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2dyb3NzX2Ftb3VudCkgKiAoK2Rpc2NvdW50X3BlcmNlbnQpKSAvIDEwMCk7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZ3Jvc3NfYW1vdW50KSAtIGRpc19hbXQpO1xyXG5cclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudClcclxuICAgICAgICB9XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwib2ZmZXJfcmF0ZVwiOlxyXG4gICAgICAgIGxldCBvZmZlcl9yYXRlID0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90Qmxhbmsob2ZmZXJfcmF0ZSkpIHtcclxuICAgICAgICAgIG9mZmVyX3JhdGUgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcblxyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyX3JhdGUsIHF1YW50aXR5KTtcclxuXHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChvZmZlcl9yYXRlKSB7XHJcbiAgICAgICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gcXVhbnRpdHkgKiBvZmZlcl9yYXRlO1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZ3Jvc3NfYW1vdW50IC0gZWZmZWN0aXZlVG90YWw7XHJcbiAgICAgICAgICAgIGlmIChncm9zc19hbW91bnQgPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNfYW10IC8gZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gZGlzX2FtdDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgICAgICBkYXRhW1wib2ZmZXJfcmF0ZVwiXSA9IG9mZmVyX3JhdGU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfYW1vdW50XCI6XHJcbiAgICAgICAgZGlzX2FtdCA9IGRhdGEuZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzX2FtdCkpIHtcclxuICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoZGF0YS5ub19vZl9pbmplY3Rpb24gPiAwKSB7XHJcbiAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRhdGFbJ3JhdGVfcGVyX2luamVjdGlvbiddKSkge1xyXG4gICAgICAgICAgICBkYXRhWydyYXRlX3Blcl9pbmplY3Rpb24nXSA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgb2ZmZXJpbmdSYXRlID0gZGF0YVsncmF0ZV9wZXJfaW5qZWN0aW9uJ10gLSBkaXNfYW10O1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQaGFyYW1hUGFyYW1ldGVyQW1vdW50KGRhdGEsIG9mZmVyaW5nUmF0ZSwgcXVhbnRpdHksIGluY29taW5nX2ZpZWxkKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSBncm9zc19hbW91bnQgLSBkaXNfYW10O1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgICAgaWYgKGdyb3NzX2Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNfYW10KSAqIDEwMCkgLyAoK2dyb3NzX2Ftb3VudCkpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQpXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX2ludm9pY2VfYW1vdW50X3Jvd193aXNlKGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgbGV0IGRpc2NfcGVyID0gMDtcclxuICAgIGxldCBkaXNjX2FtdCA9IDA7XHJcbiAgICBsZXQgZmluYWxfYW10ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRhdGEudG90YWwpKSB7XHJcbiAgICAgIHRvdGFsID0gZGF0YS50b3RhbDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkYXRhLmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgZGlzY19hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkYXRhLnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgc3VyY2hhcmdlID0gZGF0YS5zYW1wbGluZ19jaGFyZ2U7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGF0YS5kaXNjb3VudF9wZXJjZW50KSkge1xyXG4gICAgICBkaXNjX3BlciA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgIH1cclxuXHJcblxyXG4gICAgbGV0IGluY29taW5nX2ZpZWxkID0gZmllbGROYW1lO1xyXG4gICAgc3dpdGNoIChpbmNvbWluZ19maWVsZCkge1xyXG4gICAgICBjYXNlIFwidG90YWxcIjpcclxuICAgICAgICBkaXNjX2FtdCA9IGRpc2NfcGVyICogdG90YWwgLyAxMDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY19hbXQ7XHJcbiAgICAgICAgZmluYWxfYW10ID0gc3VyY2hhcmdlICsgbmV0X2Ftb3VudDtcclxuICAgICAgICAvLyBkaXNjX3BlciA9IChkaXNjX2FtdC8oZGF0YS50b3RhbCkpKjEwMDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X3BlcmNlbnRcIjpcclxuICAgICAgICBkaXNjX2FtdCA9IGRpc2NfcGVyICogdG90YWwgLyAxMDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY19hbXQ7XHJcbiAgICAgICAgZmluYWxfYW10ID0gc3VyY2hhcmdlICsgbmV0X2Ftb3VudDtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGRpc2NfcGVyID0gKDEwMCAqIGRpc2NfYW10KSAvIHRvdGFsO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSB0b3RhbCAtIGRpc2NfYW10O1xyXG4gICAgICAgIGZpbmFsX2FtdCA9IHN1cmNoYXJnZSArIG5ldF9hbW91bnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJzYW1wbGluZ19jaGFyZ2VcIjpcclxuICAgICAgICBkaXNjX3BlciA9ICgxMDAgKiBkaXNjX2FtdCkgLyB0b3RhbDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdG90YWwgLSBkaXNjX2FtdDtcclxuICAgICAgICBmaW5hbF9hbXQgPSBzdXJjaGFyZ2UgKyBuZXRfYW1vdW50O1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gICAgZGF0YVtcImRpc2NvdW50X3BlcmNlbnRcIl0gPSBkaXNjX3BlcjtcclxuICAgIGRhdGFbXCJkaXNjb3VudF9hbW91bnRcIl0gPSBkaXNjX2FtdDtcclxuICAgIGRhdGFbXCJmaW5hbF9hbW91bnRcIl0gPSBmaW5hbF9hbXQ7XHJcbiAgICBkYXRhW1wibmV0X2Ftb3VudFwiXSA9IG5ldF9hbW91bnQ7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlTmV0QW1vdW50KGRhdGE6YW55LCBmaWVsZE5hbWU6YW55LCBncmlkX2NlbGxfZnVuY3Rpb246YW55KSB7XHJcbiAgICBzd2l0Y2ggKGdyaWRfY2VsbF9mdW5jdGlvbikge1xyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXNcIjpcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckF1dG9tb3RpdmVMaW1zKGRhdGEsIGZpZWxkTmFtZVtcImZpZWxkX25hbWVcIl0pO1xyXG4gICAgICAgIGJyZWFrXHJcblxyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1wiOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltcyhkYXRhLCBmaWVsZE5hbWVbXCJmaWVsZF9uYW1lXCJdKVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1dpdGhTdWJzZXF1ZW50XCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVRdW90YXRpb25QYXJhbWV0ZXJBbW91bnRGb3JMaW1zV2l0aFN1YnNlcXVlbnQoZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSlcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJjYWxjdWxhdGVfcGhhcm1hX2NsYWltX3ZhbHVlc1wiOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlX3BoYXJtYV9jbGFpbV92YWx1ZXMoZGF0YSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlIFwiY2FsY3VsYXRlX2ludm9pY2VfYW1vdW50X3Jvd193aXNlXCI6XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVfaW52b2ljZV9hbW91bnRfcm93X3dpc2UoZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMubGVnYWN5UXVvdGF0aW9uUGFyYW1ldGVyQ2FsY3VsYXRpb24oZGF0YSwgZmllbGROYW1lW1wiZmllbGRfbmFtZVwiXSk7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuICBjYWxjdWxhdGVRcXVvdGVBbW91bnQodGVtcGxhdGVWYWx1ZTphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudDphbnkgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHNhbXBsaW5nX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZmluYWxfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzOmFueSA9IFtdO1xyXG4gICAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuXHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIHRvdGFsID0gdG90YWwgKyBlbGVtZW50LnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICYmIHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICE9IG51bGwpIHtcclxuICAgICAgc2FtcGxpbmdfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICB9XHJcbiAgICBpZiAodG90YWwgPiAwKSB7XHJcbiAgICAgIGlmICh0ZW1wbGF0ZVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdICE9ICcnKSB7XHJcbiAgICAgICAgaWYgKGZpZWxkLmZpZWxkX25hbWUgPT09ICdkaXNjb3VudF9wZXJjZW50Jykge1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGQuZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSB0b3RhbCAqIGRpc2NvdW50X3BlcmNlbnQgLyAxMDA7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdG90YWwgLSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICBxdW90YXRpb25fcGFyYW1fbWV0aG9kcyA9IFtdO1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBuZXdfZWxlbWVudCA9IHsgLi4uZWxlbWVudCB9O1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVOZXRBbW91bnQobmV3X2VsZW1lbnQsIFwicXR5XCIsIFwiXCIpO1xyXG4gICAgICAgICAgICBxdW90YXRpb25fcGFyYW1fbWV0aG9kcy5wdXNoKG5ld19lbGVtZW50KTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLnNldFZhbHVlKHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzKTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUXF1b3RlQW1vdW50KHRlbXBsYXRlVmFsdWUsIHsgZmllbGRfbmFtZTogXCJxdW90YXRpb25fcGFyYW1fbWV0aG9kc1wiIH0pO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZmllbGRfbmFtZSA9PT0gJ25ldF9hbW91bnQnKSB7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gdG90YWwgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNjb3VudF9hbW91bnQgLyB0b3RhbCk7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBsZXQgdXBkYXRlZERhdGEgPSB0aGlzLnF1b3RlX2Ftb3VudF92aWFfZGlzY291bnRfcGVyY2VudCh0ZW1wbGF0ZVZhbHVlW1wicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIl0sIHRlbXBsYXRlVmFsdWUpXHJcbiAgICAgICAgICB1cGRhdGVkRGF0YVtmaWVsZC5maWVsZF9uYW1lXSA9IG5ldF9hbW91bnRcclxuICAgICAgICAgIHJldHVybiB1cGRhdGVkRGF0YTtcclxuICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmZpZWxkX25hbWUgPT09ICdxdW90YXRpb25fcGFyYW1fbWV0aG9kcycpIHtcclxuICAgICAgICAgIGxldCBsaXN0ID0gdGVtcGxhdGVWYWx1ZVtmaWVsZC5maWVsZF9uYW1lXTtcclxuICAgICAgICAgIGxpc3QuZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgbmV3X2VsZW1lbnQgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnRcclxuICAgICAgICAgICAgbmV0X2Ftb3VudCA9IG5ldF9hbW91bnQgKyBlbGVtZW50Lm5ldF9hbW91bnQ7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAxMDAgKiBkaXNjb3VudF9hbW91bnQgLyB0b3RhbDtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdG90YWwgPSB0ZW1wbGF0ZVZhbHVlWyd0b3RhbCddO1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddO1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXTtcclxuXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGZpbmFsX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19hbW91bnQ7XHJcbiAgICAgICAgdW5pdF9wcmljZSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J10pO1xyXG4gICAgICAgIHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzID0gW107XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgbmV3X2VsZW1lbnQgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2VsZW1lbnQuZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICBuZXdfZWxlbWVudC5uZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCsoZWxlbWVudC5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUgKiAoMSAtIGVsZW1lbnQuZGlzY291bnRfcGVyY2VudCAvIDEwMCkpKTtcclxuICAgICAgICAgIG5ld19lbGVtZW50LmRpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrKGVsZW1lbnQucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlICogZWxlbWVudC5kaXNjb3VudF9wZXJjZW50IC8gMTAwKSk7XHJcbiAgICAgICAgICBpZiAobmV3X2VsZW1lbnQucXR5ID4gMCkge1xyXG4gICAgICAgICAgICBuZXdfZWxlbWVudC5wZXJfc2FtcGxlX25ldF9yYXRlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCsobmV3X2VsZW1lbnQubmV0X2Ftb3VudCAvIG5ld19lbGVtZW50LnF0eSkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcXVvdGF0aW9uX3BhcmFtX21ldGhvZHMucHVzaChuZXdfZWxlbWVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IHRvdGFsO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWydmaW5hbF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChmaW5hbF9hbW91bnQpO1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IHVuaXRfcHJpY2U7XHJcbiAgICAgICAgaWYgKHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10gPSBxdW90YXRpb25fcGFyYW1fbWV0aG9kcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuXHJcblxyXG5cclxuICBjYWxjdWxhdGVfbGltc19pbnZvaWNlX3dpdGhfbWFudWFsX2l0ZW1zKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgbGV0IGNhbGN1bGF0ZU9uRmllbGQgPSBcIlwiO1xyXG4gICAgaWYgKGNhbGN1bGF0ZV9vbl9maWVsZCA9PSBudWxsIHx8IGNhbGN1bGF0ZV9vbl9maWVsZCA9PSAnJykge1xyXG4gICAgICBjYWxjdWxhdGVPbkZpZWxkID0gJ21hbnVhbEl0ZW1zTGlzdCc7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjYWxjdWxhdGVPbkZpZWxkID0gY2FsY3VsYXRlX29uX2ZpZWxkWydmaWVsZF9uYW1lJ11cclxuICAgIH1cclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCB0YXhhYmxlX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlT25GaWVsZF0pICYmIHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlT25GaWVsZF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZU9uRmllbGRdLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuc2FtcGxlVG90YWwpKSB7XHJcbiAgICAgICAgICAvLyBncm9zc19hbW91bnQ9Z3Jvc3NfYW1vdW50K2VsZW1lbnQuZ3Jvc3NfYW1vdW50XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBlbGVtZW50LnNhbXBsZVRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgICAgIC8vIHN1cmNoYXJnZT1zdXJjaGFyZ2UrZWxlbWVudC5zdXJjaGFyZ2VcclxuICAgICAgICAgIHN1cmNoYXJnZSA9IHN1cmNoYXJnZSArIGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGVsZW1lbnQuZGlzY291bnRfYW1vdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50Lm5ldF9hbW91bnQpKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQubmV0X2Ftb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQuc2FtcGxlVG90YWxcclxuICAgICAgICB9XHJcbiAgICAgICAgdGF4YWJsZV9hbW91bnQgPSBuZXRfYW1vdW50ICsgc3VyY2hhcmdlO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHRlbXBsYXRlVmFsdWUgPSB0aGlzLnVwZGF0ZV9pbnZvaWNlX3RvdGF0bCh0ZW1wbGF0ZVZhbHVlLCBncm9zc19hbW91bnQsIGRpc2NvdW50X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgbmV0X2Ftb3VudCwgc3VyY2hhcmdlLCB0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZV93aXRoX3BvX2l0ZW1zKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlX2xpbXNfaW52b2ljZSh0ZW1wbGF0ZVZhbHVlLCBsaW1zX3NlZ21lbnQsICdwb19pdGVtcycpXHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVfbWFudWFsX3Jvd19pdGVtKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIG1hbnVhbEl0ZW1zTGlzdCA9IHRlbXBsYXRlVmFsdWVbJ21hbnVhbEl0ZW1zTGlzdCddO1xyXG4gICAgdmFyIHF0eSA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlUXR5J107XHJcbiAgICB2YXIgY29zdCA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlQ29zdCddO1xyXG4gICAgaWYgKHF0eSAmJiBjb3N0KSB7XHJcbiAgICAgIG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlVG90YWwnXSA9IHF0eSAqIGNvc3Q7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBtYW51YWxJdGVtc0xpc3RbJ3NhbXBsZVRvdGFsJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgbWFudWFsSXRlbXNMaXN0WydkaXNjb3VudF9hbW91bnQnXSA9IDA7XHJcbiAgICBtYW51YWxJdGVtc0xpc3RbJ25ldF9hbW91bnQnXSA9IG1hbnVhbEl0ZW1zTGlzdFsnc2FtcGxlVG90YWwnXTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ21hbnVhbEl0ZW1zTGlzdCddID0gbWFudWFsSXRlbXNMaXN0O1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3BvX3Jvd19pdGVtKHRlbXBsYXRlVmFsdWU6YW55LCBsaW1zX3NlZ21lbnQ6YW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIHBvX2l0ZW1zID0gdGVtcGxhdGVWYWx1ZVsncG9faXRlbXMnXTtcclxuICAgIHZhciBxdHkgPSBwb19pdGVtc1sncXR5J107XHJcbiAgICB2YXIgY29zdCA9IHBvX2l0ZW1zWydjb3N0J107XHJcbiAgICBpZiAocXR5ICYmIGNvc3QpIHtcclxuICAgICAgcG9faXRlbXNbJ3RvdGFsJ10gPSBxdHkgKiBjb3N0O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcG9faXRlbXNbJ3RvdGFsJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgcG9faXRlbXNbJ2Rpc2NvdW50X2Ftb3VudCddID0gMDtcclxuICAgIHBvX2l0ZW1zWyduZXRfYW1vdW50J10gPSBwb19pdGVtc1sndG90YWwnXTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3BvX2l0ZW1zJ10gPSBwb19pdGVtcztcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY3JlZGl0X25vdGVfaW52b2ljZV9jYWxjdWxhdGlvbih0ZW1wbGF0ZVZhbHVlOiBhbnksIGxpbXNfc2VnbWVudDogYW55LCBjYWxjdWxhdGVfb25fZmllbGQ6IGFueSl7XHJcbiAgICBsZXQgc3VyY2hhcmdlID0gMDtcclxuICAgIGxldCBncm9zc19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgdGF4YWJsZV9hbW91bnQgPSAwO1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSAwO1xyXG4gICAgbGV0XHRnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0Y2dzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRzZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdGlnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0dGF4X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9hbW91bnRcdD0wO1xyXG5cclxuICAgIGxldFx0bmV0X3BheWJsZVx0PTA7XHJcblxyXG4gICAgbGV0XHRpZ3N0X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0XHRnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9wZXJjZW50XHQ9MDtcclxuICAgIGxldCBjZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCBzZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCB0YXhfcGVyY2VudGFnZSA9IDA7XHJcbiAgICBsZXQgdGF4X3R5cGUgPSB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddO1xyXG5cclxuICAgIGxldCBwYXJlbnRPYmplY3RWYWx1ZSA9IHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkLnBhcmVudF07XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocGFyZW50T2JqZWN0VmFsdWUpKSB7XHJcbiAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhwYXJlbnRPYmplY3RWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGQuZmllbGRfbmFtZV0pKXtcclxuICAgICAgICAgIHRheGFibGVfYW1vdW50ID0gcGFyZW50T2JqZWN0VmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkLmZpZWxkX25hbWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2UpKXtcclxuICAgICAgdGF4X3BlcmNlbnRhZ2UgPSB0ZW1wbGF0ZVZhbHVlLnRheF9wZXJjZW50YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCh0YXhfdHlwZT09bnVsbCB8fCB0YXhfdHlwZT09dW5kZWZpbmVkIHx8IHRheF90eXBlPT0nTkEnKSAmJiB0YXhfcGVyY2VudGFnZT09MClcclxuICAgIHtcclxuICAgICAgbmV0X3BheWJsZSA9IHRheGFibGVfYW1vdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2godGF4X3R5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJHU1RcIiA6XHJcbiAgICAgICAgIGdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgIGNnc3RfcGVyY2VudCA9IGdzdF9wZXJjZW50LzI7XHJcbiAgICAgICAgIHNnc3RfcGVyY2VudD0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgY2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIHNnc3RfYW1vdW50ID0gZ3N0X2Ftb3VudC8yO1xyXG4gICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQrZ3N0X2Ftb3VudDtcclxuICAgICAgICAgdGF4X2Ftb3VudD1nc3RfYW1vdW50O1xyXG4gICAgICAgICBpZ3N0X2Ftb3VudD0wO1xyXG4gICAgICAgICBpZ3N0X3BlcmNlbnQ9MDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiSUdTVFwiIDpcclxuICAgICAgICAgIGlnc3RfYW1vdW50ID0gdGF4YWJsZV9hbW91bnQgKiB0YXhfcGVyY2VudGFnZS8xMDA7XHJcbiAgICAgICAgICBpZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQraWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICB0YXhfYW1vdW50PWlnc3RfYW1vdW50O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0IDpcclxuXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICAgIGlmKGdyb3NzX2Ftb3VudD4wKXtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCpkaXNjb3VudF9hbW91bnQvZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgdG90YWw6YW55ID17fTtcclxuICAgICAgdG90YWxbJ3N1cmNoYXJnZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHN1cmNoYXJnZSk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChjZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9wZXJjZW50KTtcclxuXHJcbiAgICAgIHRvdGFsWydzZXpfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHNlel9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2dyb3NzX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsndGF4YWJsZV9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnaWdzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodGF4X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydzZXpfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X2Ftb3VudCk7XHJcbiAgICAgIC8vIHRvdGFsWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfcGF5YmxlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X3BheWJsZSk7XHJcbiAgICAgIHRlbXBsYXRlVmFsdWUgPSB7fTtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWxfYW1vdW50J10gPSB0b3RhbDtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZSh0ZW1wbGF0ZVZhbHVlOmFueSwgbGltc19zZWdtZW50OmFueSwgY2FsY3VsYXRlX29uX2ZpZWxkOiBhbnkpIHtcclxuICAgIGlmIChjYWxjdWxhdGVfb25fZmllbGQgPT0gbnVsbCB8fCBjYWxjdWxhdGVfb25fZmllbGQgPT0gJycpIHtcclxuICAgICAgY2FsY3VsYXRlX29uX2ZpZWxkID0gJ2l0ZW1zX2xpc3QnO1xyXG4gICAgfVxyXG4gICAgbGV0IHN1cmNoYXJnZSA9IDA7XHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IHRheGFibGVfYW1vdW50ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuXHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdKSAmJiB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZV9vbl9maWVsZF0ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlW2NhbGN1bGF0ZV9vbl9maWVsZF0uZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZWxlbWVudC50b3RhbCkpIHtcclxuICAgICAgICAgIC8vIGdyb3NzX2Ftb3VudD1ncm9zc19hbW91bnQrZWxlbWVudC5ncm9zc19hbW91bnRcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGVsZW1lbnQudG90YWxcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlKSkge1xyXG4gICAgICAgICAgLy8gc3VyY2hhcmdlPXN1cmNoYXJnZStlbGVtZW50LnN1cmNoYXJnZVxyXG4gICAgICAgICAgc3VyY2hhcmdlID0gc3VyY2hhcmdlICsgZWxlbWVudC5zYW1wbGluZ19jaGFyZ2VcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQuZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnRcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQubmV0X2Ftb3VudCkpIHtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBuZXRfYW1vdW50ICsgZWxlbWVudC5uZXRfYW1vdW50XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBuZXRfYW1vdW50ICsgZWxlbWVudC50b3RhbFxyXG4gICAgICAgIH1cclxuICAgICAgICB0YXhhYmxlX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzdXJjaGFyZ2U7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gICAgdGVtcGxhdGVWYWx1ZSA9IHRoaXMudXBkYXRlX2ludm9pY2VfdG90YXRsKHRlbXBsYXRlVmFsdWUsIGdyb3NzX2Ftb3VudCwgZGlzY291bnRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBuZXRfYW1vdW50LCBzdXJjaGFyZ2UsIHRheGFibGVfYW1vdW50KTtcclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlX2xpbXNfaW52b2ljZV9leHRyYV9hbW91bnQodGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGNhbGN1bGF0ZV9vbl9maWVsZDogYW55KSB7XHJcbiAgICBpZiAoY2FsY3VsYXRlX29uX2ZpZWxkID09IG51bGwgfHwgY2FsY3VsYXRlX29uX2ZpZWxkID09ICcnKSB7XHJcbiAgICAgIGNhbGN1bGF0ZV9vbl9maWVsZCA9ICdpdGVtc19saXN0JztcclxuICAgIH1cclxuICAgIGxldCBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCB0YXhhYmxlX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZXh0cmFBbW91bnQgPSAwXHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWVbY2FsY3VsYXRlX29uX2ZpZWxkXSkgJiYgdGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVtjYWxjdWxhdGVfb25fZmllbGRdLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGVsZW1lbnQudG90YWwpKSB7XHJcbiAgICAgICAgICAvLyBncm9zc19hbW91bnQ9Z3Jvc3NfYW1vdW50K2VsZW1lbnQuZ3Jvc3NfYW1vdW50XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBlbGVtZW50LnRvdGFsXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LnNhbXBsaW5nX2NoYXJnZSkpIHtcclxuICAgICAgICAgIC8vIHN1cmNoYXJnZT1zdXJjaGFyZ2UrZWxlbWVudC5zdXJjaGFyZ2VcclxuICAgICAgICAgIHN1cmNoYXJnZSA9IHN1cmNoYXJnZSArIGVsZW1lbnQuc2FtcGxpbmdfY2hhcmdlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50LmRpc2NvdW50X2Ftb3VudCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGVsZW1lbnQuZGlzY291bnRfYW1vdW50XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhlbGVtZW50Lm5ldF9hbW91bnQpKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQubmV0X2Ftb3VudFxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGVsZW1lbnQudG90YWxcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50LmV4dHJhX2Ftb3VudCkge1xyXG4gICAgICAgICAgZXh0cmFBbW91bnQgPSBOdW1iZXIoZXh0cmFBbW91bnQpICsgTnVtYmVyKGVsZW1lbnQuZXh0cmFfYW1vdW50KVxyXG4gICAgICAgIH1cclxuICAgICAgICB0YXhhYmxlX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzdXJjaGFyZ2UgKyBleHRyYUFtb3VudDtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICB0ZW1wbGF0ZVZhbHVlID0gdGhpcy51cGRhdGVfaW52b2ljZV90b3RhdGxfZXh0cmFfYW1vdW50KHRlbXBsYXRlVmFsdWUsIGdyb3NzX2Ftb3VudCwgZGlzY291bnRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBuZXRfYW1vdW50LCBzdXJjaGFyZ2UsIGV4dHJhQW1vdW50LCB0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcblxyXG4gIGdldFBlcmNlbnQodGVtcGxhdGVWYWx1ZTphbnksIHBhcmVudDphbnksIGZpZWxkOmFueSkge1xyXG4gICAgY29uc3QgY2FsY3VsYXRlVmFsdWU6YW55ID0ge307XHJcbiAgICBpZiAoZmllbGQgJiYgZmllbGQuY2FsU291cmNlVGFyZ2V0ICYmIGZpZWxkLmNhbFNvdXJjZVRhcmdldC5sZW5ndGggPj0gMSkge1xyXG4gICAgICBsZXQgc291cmNlID0gZmllbGQuY2FsU291cmNlVGFyZ2V0WzBdLnNvdXJjZTtcclxuICAgICAgbGV0IHRhcmdldCA9IGZpZWxkLmNhbFNvdXJjZVRhcmdldFswXS50YXJnZXQ7XHJcbiAgICAgIGxldCBzb3VyY2VWYWx1ZSA9IHRoaXMuY29tbW9uRnVuY3Rpb25TZXJ2aWNlLmdldE9iamVjdFZhbHVlKHNvdXJjZSwgdGVtcGxhdGVWYWx1ZSk7XHJcbiAgICAgIGlmIChzb3VyY2VWYWx1ZSAmJiBzb3VyY2VWYWx1ZSAhPSAnJykge1xyXG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT0gJ251bWJlcicpIHtcclxuICAgICAgICAgIGxldCBmaWxlTmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgICAgICAgICBsZXQgcGVyY2VudDogYW55O1xyXG4gICAgICAgICAgaWYgKHBhcmVudCAhPSAnJykge1xyXG4gICAgICAgICAgICBwZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtwYXJlbnQuZmllbGRfbmFtZV1bZmlsZU5hbWVdXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBwZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtmaWxlTmFtZV1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0eXBlb2Ygc291cmNlVmFsdWUgPT0gJ251bWJlcicgJiYgcGVyY2VudCAmJiBwZXJjZW50ID49IDEpIHtcclxuICAgICAgICAgICAgbGV0IHBlcmNlbnRWYWx1ZSA9IHNvdXJjZVZhbHVlICogcGVyY2VudCAvIDEwMDtcclxuICAgICAgICAgICAgbGV0IHRhcmdldEZpZWxkcyA9IHRhcmdldC5zcGxpdCgnLicpO1xyXG4gICAgICAgICAgICBpZiAodGFyZ2V0RmllbGRzICYmIHRhcmdldEZpZWxkcy5sZW5ndGggPT0gMikge1xyXG4gICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRhcmdldEZpZWxkc1swXTtcclxuICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRhcmdldEZpZWxkc1sxXTtcclxuICAgICAgICAgICAgICBjYWxjdWxhdGVWYWx1ZVtwYXJlbnRdID0ge307XHJcbiAgICAgICAgICAgICAgY2FsY3VsYXRlVmFsdWVbcGFyZW50XVtjaGlsZF0gPSBwZXJjZW50VmFsdWVcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRhcmdldEZpZWxkc1swXTtcclxuICAgICAgICAgICAgICBjYWxjdWxhdGVWYWx1ZVtjaGlsZF0gPSBwZXJjZW50VmFsdWVcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCAnU291cmNlIFZhbHVlIGlzIG5vdCBhIG51bWJlci4nKVxyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uubm90aWZ5KCdiZy1kYW5nZXInLCAnU291cmNlIEZpZWxkIGlzIFJlcXVpcmVkLicpXHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gY2FsY3VsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY2FsY3VsYXRlX3F1b3RhdGlvbih0ZW1wbGF0ZVZhbHVlOmFueSwgbGltc19zZWdtZW50OmFueSwgZmllbGQ6IGFueSkge1xyXG4gICAgdmFyIHRvdGFsID0gMDtcclxuICAgIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50ID0gMDtcclxuICAgIGxldCBzYW1wbGluZ19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGZpbmFsX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgIGxldCBxdW90YXRpb25fcGFyYW1fbWV0aG9kcyA9IFtdO1xyXG4gICAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuICAgIGxldCBwYXJhbUFycmF5OmFueSA9IFtdO1xyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZmllbGRfbmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgICBsZXQgcXR5ID0gMDtcclxuICAgIGxldCBwcm9kdWN0X3dpc2VfcHJpY2luZyA9IHRlbXBsYXRlVmFsdWVbJ3Byb2R1Y3Rfd2lzZV9wcmljaW5nJ107XHJcbiAgICBsZXQgY3VycmVudF9kaXNvdW50ID0gMDtcclxuICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayh0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10pKSB7XHJcbiAgICAgIGN1cnJlbnRfZGlzb3VudCA9IHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS5xdHkpKSB7XHJcbiAgICAgIHF0eSA9IHRlbXBsYXRlVmFsdWUucXR5O1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddICE9ICcnICYmIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgbGV0IGRhdGEgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgICBwYXJhbUFycmF5LnB1c2goZGF0YSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuXHJcblxyXG4gICAgaWYgKHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICYmIHRlbXBsYXRlVmFsdWVbJ3NhbXBsaW5nX2NoYXJnZSddICE9IG51bGwpIHtcclxuICAgICAgc2FtcGxpbmdfYW1vdW50ID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICB9XHJcbiAgICAvLyBpZihncm9zc19hbW91bnQ+MCl7XHJcbiAgICBpZiAodHJ1ZSkge1xyXG4gICAgICBzd2l0Y2ggKGZpZWxkX25hbWUpIHtcclxuICAgICAgICBjYXNlICdwYXJhbWV0ZXJfYXJyYXknOlxyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IDA7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgICB1bml0X3ByaWNlID0gdGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSBxdHkgKiB1bml0X3ByaWNlO1xyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBcInF0eVwiKTtcclxuICAgICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS5xdHkpKSB7XHJcbiAgICAgICAgICAgICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKGxpbXNfc2VnbWVudCA9PSAnc3RhbmRhcmQnKSB7XHJcbiAgICAgICAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsICdxdHknKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZGlzY291bnRfcGVyY2VudCc6XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGVtcGxhdGVWYWx1ZVtmaWVsZF9uYW1lXTtcclxuICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgKiBkaXNjb3VudF9wZXJjZW50IC8gMTAwO1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgY2FzZSAnZGlzY291bnRfYW1vdW50JzpcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuXHJcbiAgICAgICAgY2FzZSAnbmV0X2Ftb3VudCc6XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkX25hbWVdO1xyXG4gICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwicXR5XCIpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgfSlcclxuXHJcblxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgICAgfSlcclxuXHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfYW1vdW50XCJdID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICBjYXNlICd1bml0X3ByaWNlJzpcclxuICAgICAgICAgIHVuaXRfcHJpY2UgPSAwO1xyXG4gICAgICAgICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZSkpIHtcclxuICAgICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIG5ldF9hbW91bnQgPSBxdHkgKiB1bml0X3ByaWNlO1xyXG5cclxuXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgXCJ1bml0X3ByaWNlXCIpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICAgIGlmIChwYXJhbUFycmF5Lmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlKGxpbXNfc2VnbWVudCwgZGF0YSwgZmllbGRfbmFtZSk7XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAocHJvZHVjdF93aXNlX3ByaWNpbmcpIHtcclxuICAgICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWVbXCJ1bml0X3ByaWNlXCJdO1xyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGlzY291bnRQZXJjZW50YWdlKGN1cnJlbnRfZGlzb3VudCwgZGlzY291bnRfYW1vdW50LCBncm9zc19hbW91bnQsIHF0eSlcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG5cclxuICAgIGZpbmFsX2Ftb3VudCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19hbW91bnQ7XHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXR5J10gPiAwKSB7XHJcbiAgICAgIHVuaXRfcHJpY2UgPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCAvIHRlbXBsYXRlVmFsdWVbJ3F0eSddKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICAgIH1cclxuICAgIHRlbXBsYXRlVmFsdWVbJ3RvdGFsJ10gPSBncm9zc19hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZmluYWxfYW1vdW50KTtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IHVuaXRfcHJpY2U7XHJcbiAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10gPSBwYXJhbUFycmF5O1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0ZW1wbGF0ZVZhbHVlO1xyXG5cclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZV9xdW90YXRpb25fZm9yX2xpbXModGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciB0b3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgc2FtcGxpbmdfYW1vdW50ID0gMDtcclxuICAgIGxldCBmaW5hbF9hbW91bnQgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgcXVvdGF0aW9uX3BhcmFtX21ldGhvZHMgPSBbXTtcclxuICAgIGxldCB1bml0X3ByaWNlOmFueSA9IDA7XHJcbiAgICBsZXQgcGFyYW1BcnJheTphbnkgPSBbXTtcclxuICAgIGxldCBncm9zc19hbW91bnQgPSAwO1xyXG4gICAgbGV0IGZpZWxkX25hbWUgPSBmaWVsZC5maWVsZF9uYW1lO1xyXG4gICAgbGV0IHF0eSA9IDA7XHJcbiAgICBsZXQgcHJvZHVjdF93aXNlX3ByaWNpbmcgPSB0ZW1wbGF0ZVZhbHVlWydwcm9kdWN0X3dpc2VfcHJpY2luZyddO1xyXG4gICAgbGV0IGN1cnJlbnRfZGlzb3VudCA9IDA7XHJcbiAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddKSkge1xyXG4gICAgICBjdXJyZW50X2Rpc291bnQgPSB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J107XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUucXR5KSkge1xyXG4gICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIGxldCBkYXRhID0geyAuLi5lbGVtZW50IH07XHJcbiAgICAgICAgcGFyYW1BcnJheS5wdXNoKGRhdGEpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvLyBpZihncm9zc19hbW91bnQ+MCl7XHJcbiAgICBpZiAodHJ1ZSkge1xyXG4gICAgICBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGRhdGFbJ3F0eSddID0gcXR5O1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2UobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICAgIGlmIChwcm9kdWN0X3dpc2VfcHJpY2luZykge1xyXG4gICAgICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IGdyb3NzX2Ftb3VudDtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB1bml0X3ByaWNlO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZShsaW1zX3NlZ21lbnQ6IGFueSwgZGF0YTogYW55LCBmaWVsZE5hbWU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoIChsaW1zX3NlZ21lbnQpIHtcclxuICAgICAgY2FzZSAnc3RhbmRhcmQnOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltcyhkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ2F1dG9tb3RpdmUnOlxyXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXMoZGF0YSwgZmllbGROYW1lKVxyXG4gICAgICAgIGJyZWFrXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgc2FtcGxpbmdBbW91bnRBZGRpdGlvbih0ZW1wbGF0ZVZhbHVlOmFueSkge1xyXG4gICAgbGV0IG5ldF9hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J107XHJcbiAgICBsZXQgc2FtcGxpbmdfY2hhcmdlID0gdGVtcGxhdGVWYWx1ZVsnc2FtcGxpbmdfY2hhcmdlJ107XHJcbiAgICBsZXQgdG90bCA9IG5ldF9hbW91bnQgKyBzYW1wbGluZ19jaGFyZ2U7XHJcblxyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0b3RsXHJcbiAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuICB9XHJcblxyXG4gIHF1b3RlX2Ftb3VudF92aWFfZGlzY291bnRfcGVyY2VudChsaXN0T2ZQYXJtOmFueSwgdGVtcGxhdGVWYWx1ZTphbnkpIHtcclxuICAgIGxldCBkaXNjb3VudCA9IHRlbXBsYXRlVmFsdWUuZGlzY291bnRfcGVyY2VudDtcclxuICAgIGxldCBxdWFudGl0eSA9IHRlbXBsYXRlVmFsdWUucXR5O1xyXG4gICAgbGV0IHVwZGF0ZWRQYXJhbXNMaXN0OmFueSA9IFtdO1xyXG4gICAgbGlzdE9mUGFybS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XHJcbiAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICBkYXRhWydxdHknXSA9IHF1YW50aXR5O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZU5ldEFtb3VudChkYXRhLCBcImRpc2NvdW50X3BlcmNlbnRcIiwgXCJcIik7XHJcbiAgICAgIHVwZGF0ZWRQYXJhbXNMaXN0LnB1c2goZGF0YSk7XHJcbiAgICB9KTtcclxuICAgIHRlbXBsYXRlVmFsdWVbXCJxdW90YXRpb25fcGFyYW1fbWV0aG9kc1wiXSA9IHVwZGF0ZWRQYXJhbXNMaXN0O1xyXG4gICAgbGV0IHRvdGFsID0gdGVtcGxhdGVWYWx1ZVtcInRvdGFsXCJdO1xyXG4gICAgbGV0IGRpc2NvdW50X2Ftb3VudDphbnkgPSB0aGlzLmdldERlY2ltYWxBbW91bnQodG90YWwgKiBkaXNjb3VudCAvIDEwMCk7XHJcbiAgICBsZXQgbmV0X2Ftb3VudCA9IHRvdGFsIC0gZGlzY291bnRfYW1vdW50O1xyXG5cclxuICAgIGxldCBmaW5hbF9hbW91bnQgPSBuZXRfYW1vdW50ICsgdGVtcGxhdGVWYWx1ZVtcInNhbXBsaW5nX2NoYXJnZVwiXTtcclxuICAgIGxldCB1bml0X3ByaWNlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXSk7XHJcblxyXG4gICAgdGVtcGxhdGVWYWx1ZVsndG90YWwnXSA9IHRvdGFsO1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSBmaW5hbF9hbW91bnQ7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB1bml0X3ByaWNlO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcbiAgfVxyXG5cclxuICBjYWxjdWxhdGVJbnZvaWNlVG90YWxBbW91bnQoZm9ybVZhbHVlOmFueSwgaW52b2ljZUluZm9zOmFueSkge1xyXG4gICAgbGV0IGxpc3QgPSBpbnZvaWNlSW5mb3M7XHJcbiAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIHRvdGFsICs9IGxpc3RbaV1bJ25ldHBheWFibGVBbW91bnQnXVxyXG4gICAgfVxyXG4gICAgbGV0IGx1bXBTdW1BbW91bnQgPSBmb3JtVmFsdWVbJ2x1bXBTdW1BbW91bnQnXVxyXG4gICAgbGV0IGFkdmFuY2VBbW91bnQgPSBmb3JtVmFsdWVbJ2FkdmFuY2VBbW91bnQnXTtcclxuICAgIGxldCB0b2F0YWxsdW1zdW1PckFkdmFuY2UgPSBsdW1wU3VtQW1vdW50ICsgYWR2YW5jZUFtb3VudDtcclxuICAgIGxldCB0b3RhbEZhaXIgPSB0b3RhbCAtIHRvYXRhbGx1bXN1bU9yQWR2YW5jZTtcclxuICAgIGxldCBvYmogPSB7XHJcbiAgICAgIHRvdGFsQW1vdW50OiAodG90YWwpLnRvRml4ZWQoMiksXHJcbiAgICAgIHBheUFtb3VudDogKHRvdGFsRmFpcikudG9GaXhlZCgyKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHF1b3RlX2Ftb3VudF92aWFfc2FtcGxlX25vKHRlbXBsYXRlVmFsdWU6YW55LCBsaXN0T2ZQYXJtOmFueSkge1xyXG4gICAgbGV0IHF1YW50aXR5ID0gdGVtcGxhdGVWYWx1ZS5xdHk7XHJcbiAgICBsZXQgZGlzY291bnQgPSB0ZW1wbGF0ZVZhbHVlLmRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICBsZXQgdXBkYXRlZFBhcmFtc0xpc3Q6YW55ID0gW107XHJcbiAgICBsaXN0T2ZQYXJtLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShlbGVtZW50KSk7XHJcbiAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICBkYXRhWydxdHknXSA9IHF1YW50aXR5O1xyXG4gICAgICB0aGlzLmNhbGN1bGF0ZU5ldEFtb3VudChkYXRhLCBcInF0eVwiLCBcIlwiKTtcclxuICAgICAgdXBkYXRlZFBhcmFtc0xpc3QucHVzaChkYXRhKVxyXG4gICAgfSk7XHJcbiAgICB0ZW1wbGF0ZVZhbHVlW1wicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIl0gPSB1cGRhdGVkUGFyYW1zTGlzdDtcclxuICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZVFxdW90ZUFtb3VudCh0ZW1wbGF0ZVZhbHVlLCB7IGZpZWxkX25hbWU6IFwicXVvdGF0aW9uX3BhcmFtX21ldGhvZHNcIiB9KTtcclxuICB9XHJcblxyXG4gIGNhbGN1bGF0ZUludm9pY2VPcmRlckFtb3VudCh0ZW1wbGF0ZUZvcm06IFVudHlwZWRGb3JtR3JvdXAsIGZpZWxkOiBhbnkpIHtcclxuICAgIHZhciBuZXRfYW1vdW50ID0gMDtcclxuICAgIHZhciBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgdmFyIGlnc3RfYW1vdW50ID0gMDtcclxuICAgIHZhciBzZ3N0X2Ftb3VudCA9IDA7XHJcbiAgICB2YXIgY2dzdF9hbW91bnQgPSAwO1xyXG4gICAgdmFyIG5ldFBheWFibGUgPSAwO1xyXG4gICAgdmFyIHN1cmNoYXJnZSA9IDA7XHJcbiAgICB2YXIgc2V6X2Ftb3VudCA9IDA7XHJcbiAgICB2YXIgdG90YWwgPSAwO1xyXG4gICAgbGV0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZUZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICAgIGlmICh0ZW1wbGF0ZVZhbHVlWydpdGVtc19saXN0J10gIT0gJycgJiYgdGVtcGxhdGVWYWx1ZVsnaXRlbXNfbGlzdCddLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsnaXRlbXNfbGlzdCddLmZvckVhY2goKGVsZW1lbnQ6YW55KSA9PiB7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IG5ldF9hbW91bnQgKyBlbGVtZW50Lm5ldF9hbW91bnQ7XHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZGlzY291bnRfYW1vdW50ICsgZWxlbWVudC5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgc3VyY2hhcmdlID0gc3VyY2hhcmdlICsgZWxlbWVudC5zdXJjaGFyZ2U7XHJcbiAgICAgICAgdG90YWwgPSB0b3RhbCArIGVsZW1lbnQudG90YWw7XHJcbiAgICAgIH0pO1xyXG4gICAgICBpZiAodGVtcGxhdGVWYWx1ZVsndGF4X3R5cGUnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddID09IFwiR1NUXCIpIHtcclxuICAgICAgICBzZ3N0X2Ftb3VudCA9IChuZXRfYW1vdW50ICogdGVtcGxhdGVWYWx1ZVsndGF4X3BlcmNlbnRhZ2UnXSkgLyAyMDA7XHJcbiAgICAgICAgY2dzdF9hbW91bnQgPSBzZ3N0X2Ftb3VudDtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmICh0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddICE9ICcnICYmIHRlbXBsYXRlVmFsdWVbJ3RheF90eXBlJ10gPT0gXCJJR1NUXCIpIHtcclxuICAgICAgICBpZ3N0X2Ftb3VudCA9IChuZXRfYW1vdW50ICogdGVtcGxhdGVWYWx1ZVsndGF4X3BlcmNlbnRhZ2UnXSkgLyAxMDA7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIG5ldFBheWFibGUgPSBuZXRfYW1vdW50ICsgaWdzdF9hbW91bnQgKyBzZ3N0X2Ftb3VudCArIGNnc3RfYW1vdW50ICsgc2V6X2Ftb3VudDtcclxuICAgIGNvbnN0IGZpZWxkV2l0aFZhbHVlID0ge1xyXG4gICAgICBmaWVsZDogJ3RvdGFsX2Ftb3VudCcsIHZhbHVlOiBbXHJcbiAgICAgICAgeyBmaWVsZDogJ3RheGFibGVfYW1vdW50JywgdmFsdWU6IG5ldF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnc2dzdF9hbW91bnQnLCB2YWx1ZTogc2dzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnY2dzdF9hbW91bnQnLCB2YWx1ZTogY2dzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnaWdzdF9hbW91bnQnLCB2YWx1ZTogaWdzdF9hbW91bnQgfSxcclxuICAgICAgICB7IGZpZWxkOiAnbmV0X3BheWJsZScsIHZhbHVlOiBuZXRQYXlhYmxlIH0sXHJcbiAgICAgICAgeyBmaWVsZDogJ2Rpc2NvdW50X2Ftb3VudCcsIHZhbHVlOiBkaXNjb3VudF9hbW91bnQgfSxcclxuICAgICAgXVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuc2V0VmFsdWVJblZpZWxkc0ZvckNoaWxkKHRlbXBsYXRlRm9ybSwgZmllbGRXaXRoVmFsdWUpO1xyXG4gIH1cclxuICBzZXRWYWx1ZUluVmllbGRzRm9yQ2hpbGQodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwLCBmaWVsZDogYW55KSB7XHJcbiAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzWyd0b3RhbF9hbW91bnQnXSkuYWRkQ29udHJvbCgnZGlzY291bnRfYW1vdW50JywgbmV3IFVudHlwZWRGb3JtQ29udHJvbCgnJykpXHJcbiAgICBmaWVsZC52YWx1ZS5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAoPFVudHlwZWRGb3JtR3JvdXA+dGVtcGxhdGVGb3JtLmNvbnRyb2xzW2ZpZWxkLmZpZWxkXSkuY29udHJvbHNbZWxlbWVudC5maWVsZF0ucGF0Y2hWYWx1ZShlbGVtZW50LnZhbHVlKTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIHRlbXBsYXRlRm9ybTtcclxuICB9XHJcbiAgY2FsY3VsYXRlQWRkaXRpb25hbENvc3Qob2JqOmFueSl7XHJcbiAgICBsZXQgbGlzdCA9IG9ialsnYWRkaXRpb25hbF9jb3N0J107XHJcbiAgICBsZXQgc3VtID0gMDtcclxuICAgIGxldCBuZXRfYW10ID0gb2JqWyduZXRfYW1vdW50J107XHJcbiAgICBpZihsaXN0ICE9IG51bGwgJiYgbGlzdC5sZW5ndGggPiAwKXtcclxuICAgICAgbGlzdC5mb3JFYWNoKChlbGVtZW50OmFueSkgPT4ge1xyXG4gICAgICAgIHN1bSArPSArKGVsZW1lbnQuYW1vdW50KTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgICBsZXQgZmluYWxfYW10ID0gc3VtK25ldF9hbXQ7XHJcbiAgICBvYmpbJ3NhbXBsaW5nX2NoYXJnZSddID0gc3VtO1xyXG4gICAgb2JqWydmaW5hbF9hbW91bnQnXSA9IGZpbmFsX2FtdDtcclxuICAgcmV0dXJuIG9iajtcclxuICB9XHJcblxyXG4gIHVwZGF0ZV9pbnZvaWNlX3RvdGF0bCh0ZW1wbGF0ZVZhbHVlOmFueSxncm9zc19hbW91bnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIsZGlzY291bnRfcGVyY2VudDphbnksbmV0X2Ftb3VudDpudW1iZXIsc3VyY2hhcmdlOm51bWJlcix0YXhhYmxlX2Ftb3VudDpudW1iZXIsZmllbGQ/OmFueSl7XHJcbiAgICBsZXRcdGdzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRjZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0aWdzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHR0YXhfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0c2V6X2Ftb3VudFx0PTA7XHJcblxyXG4gICAgbGV0XHRuZXRfcGF5YmxlXHQ9MDtcclxuXHJcbiAgICBsZXRcdGlnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdGdzdF9wZXJjZW50XHQ9MDtcclxuICAgIGxldFx0c2V6X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0IGNnc3RfcGVyY2VudD0wO1xyXG4gICAgbGV0IHNnc3RfcGVyY2VudD0wO1xyXG4gICAgbGV0IHRheF9wZXJjZW50YWdlID0gMDtcclxuICAgIGxldCB0YXhfdHlwZSA9IHRlbXBsYXRlVmFsdWVbJ3RheF90eXBlJ107XHJcblxyXG4gICAgaWYodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS50YXhfcGVyY2VudGFnZSkpe1xyXG4gICAgICB0YXhfcGVyY2VudGFnZSA9IHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYoKCh0YXhfdHlwZT09bnVsbCB8fCB0YXhfdHlwZT09dW5kZWZpbmVkIHx8IHRheF90eXBlPT0nTkEnKSAmJiB0YXhfcGVyY2VudGFnZT09MCkgfHwgIHRheF90eXBlPT0nTm90IEFwcGxpY2FibGUnKVxyXG4gICAge1xyXG4gICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQ7XHJcbiAgICB9XHJcbiAgICBlbHNlXHJcbiAgICB7XHJcbiAgICAgIHN3aXRjaCh0YXhfdHlwZSl7XHJcbiAgICAgICAgY2FzZSBcIkdTVFwiIDpcclxuICAgICAgICAgZ3N0X2Ftb3VudCA9IHRheGFibGVfYW1vdW50ICogdGF4X3BlcmNlbnRhZ2UvMTAwO1xyXG4gICAgICAgICBnc3RfcGVyY2VudD10YXhfcGVyY2VudGFnZTtcclxuICAgICAgICAgY2dzdF9wZXJjZW50ID0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgc2dzdF9wZXJjZW50PSBnc3RfcGVyY2VudC8yO1xyXG4gICAgICAgICBjZ3N0X2Ftb3VudCA9IGdzdF9hbW91bnQvMjtcclxuICAgICAgICAgc2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIG5ldF9wYXlibGUgPSB0YXhhYmxlX2Ftb3VudCtnc3RfYW1vdW50O1xyXG4gICAgICAgICB0YXhfYW1vdW50PWdzdF9hbW91bnQ7XHJcbiAgICAgICAgIGlnc3RfYW1vdW50PTA7XHJcbiAgICAgICAgIGlnc3RfcGVyY2VudD0wO1xyXG5cclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgXCJJR1NUXCIgOlxyXG4gICAgICAgICAgaWdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgIGlnc3RfcGVyY2VudD10YXhfcGVyY2VudGFnZTtcclxuICAgICAgICAgIG5ldF9wYXlibGUgPSB0YXhhYmxlX2Ftb3VudCtpZ3N0X2Ftb3VudDtcclxuICAgICAgICAgIHRheF9hbW91bnQ9aWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICAgIGRlZmF1bHQgOlxyXG5cclxuICAgIH1cclxuICAgIH1cclxuICAgICAgaWYoZ3Jvc3NfYW1vdW50PjApe1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwKmRpc2NvdW50X2Ftb3VudC9ncm9zc19hbW91bnQpO1xyXG4gICAgICB9XHJcbiAgICAgIGxldCB0b3RhbDphbnkgPXt9O1xyXG4gICAgICB0b3RhbFsnc3VyY2hhcmdlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc3VyY2hhcmdlKTtcclxuICAgICAgdG90YWxbJ2lnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGlnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdzdF9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2Nnc3RfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydzZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZ3N0X3BlcmNlbnQpO1xyXG5cclxuICAgICAgdG90YWxbJ3Nlel9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3Jvc3NfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2Rpc2NvdW50X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhhYmxlX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHRheGFibGVfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2dzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ2Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoY2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGlnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3RheF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nlel9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzZXpfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ25ldF9wYXlibGUnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfcGF5YmxlKTtcclxuXHJcbiAgICAgIGlmKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZmllbGRfbmFtZSAhPSBudWxsICYmIGZpZWxkICE9IFwiXCIpe1xyXG4gICAgICAgIGRlbGV0ZSB0b3RhbFtmaWVsZC5maWVsZF9uYW1lXVxyXG4gICAgICB9XHJcbiAgICAgIHRlbXBsYXRlVmFsdWUgPSB7fTtcclxuICAgICAgdGVtcGxhdGVWYWx1ZVsndG90YWxfYW1vdW50J10gPSB0b3RhbDtcclxuICAgICAgcmV0dXJuIHRlbXBsYXRlVmFsdWU7XHJcblxyXG4gIH1cclxuXHJcblxyXG5cclxuXHJcbiAgdXBkYXRlX2ludm9pY2VfdG90YXRsX2V4dHJhX2Ftb3VudCh0ZW1wbGF0ZVZhbHVlOmFueSxncm9zc19hbW91bnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIsZGlzY291bnRfcGVyY2VudDphbnksbmV0X2Ftb3VudDpudW1iZXIsc3VyY2hhcmdlOm51bWJlcixleHRyYUFtb3VudDpudW1iZXIsdGF4YWJsZV9hbW91bnQ6bnVtYmVyLGZpZWxkPzphbnkpe1xyXG4gICAgbGV0XHRnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0Y2dzdF9hbW91bnRcdD0wO1xyXG4gICAgbGV0XHRzZ3N0X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdGlnc3RfYW1vdW50XHQ9MDtcclxuICAgIGxldFx0dGF4X2Ftb3VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9hbW91bnRcdD0wO1xyXG5cclxuICAgIGxldFx0bmV0X3BheWJsZVx0PTA7XHJcblxyXG4gICAgbGV0XHRpZ3N0X3BlcmNlbnRcdD0wO1xyXG4gICAgbGV0XHRnc3RfcGVyY2VudFx0PTA7XHJcbiAgICBsZXRcdHNlel9wZXJjZW50XHQ9MDtcclxuICAgIGxldCBjZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCBzZ3N0X3BlcmNlbnQ9MDtcclxuICAgIGxldCB0YXhfcGVyY2VudGFnZSA9IDA7XHJcbiAgICBsZXQgdGF4X3R5cGUgPSB0ZW1wbGF0ZVZhbHVlWyd0YXhfdHlwZSddO1xyXG5cclxuICAgIGlmKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUudGF4X3BlcmNlbnRhZ2UpKXtcclxuICAgICAgdGF4X3BlcmNlbnRhZ2UgPSB0ZW1wbGF0ZVZhbHVlLnRheF9wZXJjZW50YWdlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKCgodGF4X3R5cGU9PW51bGwgfHwgdGF4X3R5cGU9PXVuZGVmaW5lZCB8fCB0YXhfdHlwZT09J05BJykgJiYgdGF4X3BlcmNlbnRhZ2U9PTAgKSB8fCB0YXhfdHlwZT09J05vdCBBcHBsaWNhYmxlJylcclxuICAgIHtcclxuICAgICAgbmV0X3BheWJsZSA9IHRheGFibGVfYW1vdW50O1xyXG4gICAgfVxyXG4gICAgZWxzZVxyXG4gICAge1xyXG4gICAgICBzd2l0Y2godGF4X3R5cGUpe1xyXG4gICAgICAgIGNhc2UgXCJHU1RcIiA6XHJcbiAgICAgICAgIGdzdF9hbW91bnQgPSB0YXhhYmxlX2Ftb3VudCAqIHRheF9wZXJjZW50YWdlLzEwMDtcclxuICAgICAgICAgZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgIGNnc3RfcGVyY2VudCA9IGdzdF9wZXJjZW50LzI7XHJcbiAgICAgICAgIHNnc3RfcGVyY2VudD0gZ3N0X3BlcmNlbnQvMjtcclxuICAgICAgICAgY2dzdF9hbW91bnQgPSBnc3RfYW1vdW50LzI7XHJcbiAgICAgICAgIHNnc3RfYW1vdW50ID0gZ3N0X2Ftb3VudC8yO1xyXG4gICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQrZ3N0X2Ftb3VudDtcclxuICAgICAgICAgdGF4X2Ftb3VudD1nc3RfYW1vdW50O1xyXG4gICAgICAgICBpZ3N0X2Ftb3VudD0wO1xyXG4gICAgICAgICBpZ3N0X3BlcmNlbnQ9MDtcclxuXHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIFwiSUdTVFwiIDpcclxuICAgICAgICAgIGlnc3RfYW1vdW50ID0gdGF4YWJsZV9hbW91bnQgKiB0YXhfcGVyY2VudGFnZS8xMDA7XHJcbiAgICAgICAgICBpZ3N0X3BlcmNlbnQ9dGF4X3BlcmNlbnRhZ2U7XHJcbiAgICAgICAgICBuZXRfcGF5YmxlID0gdGF4YWJsZV9hbW91bnQraWdzdF9hbW91bnQ7XHJcbiAgICAgICAgICB0YXhfYW1vdW50PWlnc3RfYW1vdW50O1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0IDpcclxuXHJcbiAgICB9XHJcbiAgICB9XHJcbiAgICAgIGlmKGdyb3NzX2Ftb3VudD4wKXtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCpkaXNjb3VudF9hbW91bnQvZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgfVxyXG4gICAgICBsZXQgdG90YWw6YW55ID17fTtcclxuICAgICAgdG90YWxbJ3N1cmNoYXJnZSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHN1cmNoYXJnZSk7XHJcbiAgICAgIHRvdGFsWydpZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChnc3RfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X3BlcmNlbnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChjZ3N0X3BlcmNlbnQpO1xyXG4gICAgICB0b3RhbFsnc2dzdF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9wZXJjZW50KTtcclxuXHJcbiAgICAgIHRvdGFsWydzZXpfcGVyY2VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHNlel9wZXJjZW50KTtcclxuICAgICAgdG90YWxbJ2dyb3NzX2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgIHRvdGFsWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsndGF4YWJsZV9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0YXhhYmxlX2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydjZ3N0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGNnc3RfYW1vdW50KTtcclxuICAgICAgdG90YWxbJ3Nnc3RfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2dzdF9hbW91bnQpO1xyXG4gICAgICB0b3RhbFsnaWdzdF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChpZ3N0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyd0YXhfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodGF4X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWydzZXpfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc2V6X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X2Ftb3VudCk7XHJcbiAgICAgIHRvdGFsWyduZXRfcGF5YmxlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQobmV0X3BheWJsZSk7XHJcbiAgICAgIHRvdGFsWydleHRyYUFtb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGV4dHJhQW1vdW50KTtcclxuICAgICAgaWYoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5maWVsZF9uYW1lICE9IG51bGwgJiYgZmllbGQgIT0gXCJcIil7XHJcbiAgICAgICAgZGVsZXRlIHRvdGFsW2ZpZWxkLmZpZWxkX25hbWVdXHJcbiAgICAgIH1cclxuICAgICAgdGVtcGxhdGVWYWx1ZSA9IHt9O1xyXG4gICAgICB0ZW1wbGF0ZVZhbHVlWyd0b3RhbF9hbW91bnQnXSA9IHRvdGFsO1xyXG4gICAgICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbiAgfVxyXG5cclxuICB1cGRhdGVfaW52b2ljZV90b3RhbF9vbl9jdXN0b21fZmllbGQodGVtcGxhdGVWYWx1ZTphbnksbGltc19zZWdtZW50OiBhbnksIGZpZWxkOiBhbnkpe1xyXG4gICAgbGV0IHRvdGFsID10ZW1wbGF0ZVZhbHVlWyd0b3RhbF9hbW91bnQnXTtcclxuICAgIGxldFx0c3VyY2hhcmdlXHQ9dG90YWxbJ3N1cmNoYXJnZSddO1xyXG4gICAgbGV0XHRncm9zc19hbW91bnRcdD10b3RhbFsnZ3Jvc3NfYW1vdW50J107XHJcbiAgICBsZXRcdGRpc2NvdW50X3BlcmNlbnRcdD10b3RhbFsnZGlzY291bnRfcGVyY2VudCddO1xyXG4gICAgbGV0XHRkaXNjb3VudF9hbW91bnQ9XHR0b3RhbFsnZGlzY291bnRfYW1vdW50J107XHJcbiAgICBsZXRcdHRheGFibGVfYW1vdW50PVx0dG90YWxbJ3RheGFibGVfYW1vdW50J107XHJcbiAgICBsZXRcdG5ldF9hbW91bnRcdD10b3RhbFsnbmV0X2Ftb3VudCddO1xyXG5cclxuIGlmKGdyb3NzX2Ftb3VudCl7XHJcbiAgc3dpdGNoKGZpZWxkLmZpZWxkX25hbWUpe1xyXG4gICAgY2FzZSAnZGlzY291bnRfcGVyY2VudCc6XHJcbiAgICAgICAgICBpZihkaXNjb3VudF9wZXJjZW50IT0wKXtcclxuICAgICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50KmRpc2NvdW50X3BlcmNlbnQvMTAwO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgYnJlYWs7XHJcbiAgICBjYXNlICdzdXJjaGFyZ2UnOlxyXG4gICAgaWYoIXN1cmNoYXJnZSl7XHJcbiAgICAgICBzdXJjaGFyZ2UgPSAwO1xyXG4gICAgfVxyXG5icmVhaztcclxuICAgIGNhc2UgJ2Rpc2NvdW50X2Ftb3VudCc6XHJcbiAgICAgICAgICBpZihkaXNjb3VudF9hbW91bnQpe1xyXG4gICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IGRpc2NvdW50X2Ftb3VudCoxMDAvZ3Jvc3NfYW1vdW50O1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQ9MDtcclxuICAgICAgICAgIH1cclxuICAgIGJyZWFrO1xyXG4gfVxyXG59ZWxzZXtcclxuXHJcbiAgZGlzY291bnRfcGVyY2VudD0wO1xyXG4gIGRpc2NvdW50X2Ftb3VudD0wO1xyXG59XHJcblxyXG4gIG5ldF9hbW91bnQgPWdyb3NzX2Ftb3VudC1kaXNjb3VudF9hbW91bnQ7XHJcbiAgdGF4YWJsZV9hbW91bnQgPSBncm9zc19hbW91bnQtZGlzY291bnRfYW1vdW50K3N1cmNoYXJnZTtcclxuICB0ZW1wbGF0ZVZhbHVlID0gdGhpcy51cGRhdGVfaW52b2ljZV90b3RhdGwodGVtcGxhdGVWYWx1ZSxncm9zc19hbW91bnQsZGlzY291bnRfYW1vdW50LGRpc2NvdW50X3BlcmNlbnQsbmV0X2Ftb3VudCxzdXJjaGFyZ2UsdGF4YWJsZV9hbW91bnQsZmllbGQpO1xyXG5cclxuICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuIH1cclxuXHJcblxyXG5cclxuIHBvcHVsYXRlUGFyYW1ldGVyQW1vdW50KGRhdGE6YW55LG5ldF9hbW91bnQ6bnVtYmVyLGRpc2NvdW50X3BlcmNlbnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIscXVhbnRpdHk6bnVtYmVyLGdyb3NzX2Ftb3VudDpudW1iZXIpe1xyXG4gIGRhdGFbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICBpZihkYXRhWyd0b3RhbF9pbmplY3Rpb24nXSAmJiBkYXRhWyd0b3RhbF9pbmplY3Rpb24nXSA+IDApe1xyXG4gICAgZGF0YVsncGVyX3NhbXBsZV9uZXRfcmF0ZSddID0gICB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YVsnbmV0X2Ftb3VudCddIC8gZGF0YVsndG90YWxfaW5qZWN0aW9uJ10pO1xyXG4gICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSBkYXRhW1wicGVyX3NhbXBsZV9uZXRfcmF0ZVwiXTtcclxuICB9XHJcbiAgZWxzZSBpZihkYXRhWydxdHknXT4wKXtcclxuICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9ICAgdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGFbJ25ldF9hbW91bnQnXSAvIGRhdGFbJ3F0eSddKTtcclxuICAgIGRhdGFbXCJvZmZlcl9yYXRlXCJdID0gZGF0YVtcInBlcl9zYW1wbGVfbmV0X3JhdGVcIl07XHJcbiAgfWVsc2V7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPTA7XHJcbiAgfVxyXG5cclxuICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgZGF0YVsncXR5J10gPSBxdWFudGl0eTtcclxuICBkYXRhWyd0b3RhbCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcbiAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAgdGhpcy5nZXREZWNpbWFsQW1vdW50KGdyb3NzX2Ftb3VudCk7XHJcblxyXG59XHJcblxyXG5zZXRWYWx1ZUluVmllbGRzKHRlbXBsYXRlRm9ybTogVW50eXBlZEZvcm1Hcm91cCwgZmllbGQ6IGFueSkge1xyXG4gIGZpZWxkLmZvckVhY2goKGVsZW1lbnQ6IGFueSkgPT4ge1xyXG4gICAgaWYodGVtcGxhdGVGb3JtLmNvbnRyb2xzW2VsZW1lbnQuZmllbGRdIT09dW5kZWZpbmVkKXtcclxuICAgICAgaWYodHlwZW9mKGVsZW1lbnQudmFsdWUpID09ICdzdHJpbmcnKXtcclxuICAgICAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF0uc2V0VmFsdWUoZWxlbWVudC52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZXtcclxuICAgICAgICB0ZW1wbGF0ZUZvcm0uY29udHJvbHNbZWxlbWVudC5maWVsZF0uc2V0VmFsdWUodGhpcy5nZXREZWNpbWFsQW1vdW50KGVsZW1lbnQudmFsdWUpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0pO1xyXG4gIHJldHVybiB0ZW1wbGF0ZUZvcm07XHJcbn1cclxuXHJcbmNyZWF0ZV9wcm9mZXNzaW9uYWxfZW1haWwodGVtcGxhdGVGb3JtOiBVbnR5cGVkRm9ybUdyb3VwKXtcclxuICBsZXQgdGVtcGxhdGVWYWx1ZSA9IHRlbXBsYXRlRm9ybS5nZXRSYXdWYWx1ZSgpO1xyXG4gIGxldCBuYW1lID0gdGVtcGxhdGVWYWx1ZS5uYW1lO1xyXG4gIGxldCBwcm9mX2VtYWlsID0gXCJcIjtcclxuICBsZXQgc3RydCA9IG5hbWUuc3Vic3RyaW5nKDAsIDIpO1xyXG4gIGxldCBsYXN0ID0gbmFtZS5zbGljZSgtMik7XHJcbiAgcHJvZl9lbWFpbCA9IHN0cnQrbGFzdCtcIkBnbWFpbC5jb21cIjtcclxuICBjb25zdCBmaWVsZFdpdGhWYWx1ZSA9IFtcclxuICAgIHsgZmllbGQ6ICdwcm9mX2VtYWlsJywgdmFsdWU6IHByb2ZfZW1haWwgfSxcclxuICBdXHJcblxyXG4gIHRoaXMuc2V0VmFsdWVJblZpZWxkcyh0ZW1wbGF0ZUZvcm0sIGZpZWxkV2l0aFZhbHVlKTtcclxufVxyXG5hdXRvcG9wdWxhdGVGaWVsZHModGVtcGxhdGVGb3JtOmFueSl7XHJcbiAgbGV0IHRlbXBsYXRlVmFsdWUgPSB0ZW1wbGF0ZUZvcm0uZ2V0UmF3VmFsdWUoKTtcclxuICBsZXQgcHJvZHVjdCA9IHRlbXBsYXRlVmFsdWUucHJvZHVjdC5uYW1lO1xyXG4gIGNvbnN0IGZpZWxkV2l0aFZhbHVlID0gW1xyXG4gICAgeyBmaWVsZDogJ3NhbXBsZV9uYW1lJywgdmFsdWU6IHByb2R1Y3QgfSxcclxuICBdXHJcblxyXG4gIHRoaXMuc2V0VmFsdWVJblZpZWxkcyh0ZW1wbGF0ZUZvcm0sIGZpZWxkV2l0aFZhbHVlKTtcclxufVxyXG5cclxuXHJcbi8qKlxyXG4gKiBzdGFydCBwb2ludCBmb3Igc3Vic2VxdWV0IGNhbGN1bGF0aW9uIGZvciBxdW90YXRpb25cclxuICovXHJcblxyXG5wb3B1bGF0ZVBhcmFtZXRlckFtb3VudFdpdGhTdWJzZXF1ZW50KGRhdGE6YW55LG5ldF9hbW91bnQ6bnVtYmVyLGRpc2NvdW50X3BlcmNlbnQ6bnVtYmVyLGRpc2NvdW50X2Ftb3VudDpudW1iZXIscXVhbnRpdHk6bnVtYmVyLGdyb3NzX2Ftb3VudDpudW1iZXIsc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQ/Om51bWJlcixzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQ/Om51bWJlcil7XHJcbiAgZGF0YVsnbmV0X2Ftb3VudCddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQpO1xyXG4gaWYoZGF0YVsncXR5J10+MCl7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPSAgIHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhWyduZXRfYW1vdW50J10gLyBkYXRhWydxdHknXSk7XHJcbiAgfWVsc2V7XHJcbiAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPTA7XHJcbiAgfVxyXG5cclxuICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgZGF0YVsnZGlzY291bnRfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgaWYoc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgfHwgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPT0gMCl7XHJcbiAgICBkYXRhW1wic3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnRcIl0gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpO1xyXG4gIH1cclxuICBpZihzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgfHwgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID09IDApe1xyXG4gICAgZGF0YVtcInN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudFwiXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gIH1cclxuICBkYXRhWydxdHknXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChxdWFudGl0eSk7XHJcbiAgZGF0YVsndG90YWwnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChncm9zc19hbW91bnQpO1xyXG4gIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gIHRoaXMuZ2V0RGVjaW1hbEFtb3VudChncm9zc19hbW91bnQpO1xyXG5cclxufVxyXG5cclxuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yTGltc1dpdGhTdWJzZXF1ZW50KGRhdGE6YW55LCBmaWVsZE5hbWU6YW55KSB7XHJcbiAgICBsZXQgcXVhbnRpdHkgPSAwO1xyXG4gICAgbGV0IGRpc2NvdW50X3BlcmNlbnQ6YW55ID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50OmFueSA9IDA7XHJcbiAgICBsZXQgaW5jb21pbmdfZmllbGQgPSBmaWVsZE5hbWU7XHJcbiAgICBsZXQgc2FsZV9yYXRlID0gZGF0YVsnc2FsZV9yYXRlJ107XHJcbiAgICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICAgIGxldCBlZmZlY3RpdmVUb3RhbCA9IDA7XHJcbiAgICBsZXQgZGlzX2FtdDphbnkgPSAwO1xyXG4gICAgbGV0IHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50OmFueT0wO1xyXG4gICAgbGV0IHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudDphbnk9MDtcclxuICAgIGxldCB0b3RhbERpc2NvdW50QW1vdW50OmFueT0wO1xyXG4gICAgcXVhbnRpdHkgPSBkYXRhLnF0eTtcclxuICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsocXVhbnRpdHkpKSB7XHJcbiAgICAgIHF1YW50aXR5ID0gMDtcclxuICAgIH1cclxuICAgIGlmKHF1YW50aXR5ID4gMCl7XHJcbiAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgZ3Jvc3NfYW1vdW50ID0gKChxdWFudGl0eSAtIDEpICogZGF0YS5ub19vZl9pbmplY3Rpb24yKSArIHNhbGVfcmF0ZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgZ3Jvc3NfYW1vdW50ID0gcXVhbnRpdHkgKiBzYWxlX3JhdGU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcblxyXG4gICAgICBjYXNlIFwicXR5XCI6XHJcbiAgICAgICAgLy9lZmZlY3RpdmVUb3RhbCA9ICgrcXVhbnRpdHkpICogKCtkYXRhLm9mZmVyX3JhdGUpO1xyXG4gICAgICAgIGlmKGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlICYmIGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlID4gMCAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCAmJiBxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSkgKyBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICBpZiAoc2FsZV9yYXRlID4gMCkge1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gc2FsZV9yYXRlIC0gZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCAqIGRpc19hbXQgLyBzYWxlX3JhdGUpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgbGV0IHN1YnNlcUdyb3NzQW1vdW50ID0gKChxdWFudGl0eSAtIDEpICogZGF0YS5ub19vZl9pbmplY3Rpb24yKTtcclxuICAgICAgICAgIGxldCBzdWJzZXFFZmZlY3RpdmVBbW91bnQgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSk7XHJcbiAgICAgICAgICBpZihzdWJzZXFHcm9zc0Ftb3VudCA+IDApe1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHN1YnNlcUdyb3NzQW1vdW50IC0gc3Vic2VxRWZmZWN0aXZlQW1vdW50O1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoMTAwICogc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgLyBzdWJzZXFHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICBlZmZlY3RpdmVUb3RhbCA9IHF1YW50aXR5ICogZGF0YS5vZmZlcl9yYXRlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGlzX2FtdCA9IGdyb3NzX2Ftb3VudCAtIGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgICAgaWYgKGdyb3NzX2Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBkaXNfYW10IC8gZ3Jvc3NfYW1vdW50KTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IGVmZmVjdGl2ZVRvdGFsO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnRXaXRoU3Vic2VxdWVudChkYXRhLCBuZXRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudClcclxuXHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIFwiZGlzY291bnRfcGVyY2VudFwiOlxyXG4gICAgICBjYXNlIFwic3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50XCI6XHJcblxyXG4gICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X3BlcmNlbnQpKSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgbGV0IGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSBxdWFudGl0eSAqIHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaXNfYW10ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2VmZmVjdGl2ZUdyb3NzQW1vdW50KSAqICgrZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBkYXRhWydvZmZlcl9yYXRlJ10gPSAoZWZmZWN0aXZlR3Jvc3NBbW91bnQgLSBkaXNfYW10KTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gKGVmZmVjdGl2ZUdyb3NzQW1vdW50IC0gZGlzX2FtdCkgLyBxdWFudGl0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gMDtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAqIChxdWFudGl0eSAtMSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtzdWJzZXF1ZW50R3Jvc3NBbW91bnQpICogKCtzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpKSAvIDEwMCk7XHJcbiAgICAgICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSAoc3Vic2VxdWVudEdyb3NzQW1vdW50IC0gc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpIC8gKHF1YW50aXR5LTEpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBkYXRhWydzdWJzZXF1ZW50X29mZmVyX3JhdGUnXSA9IChzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ICsgZGlzX2FtdDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBkaXNfYW10O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2dyb3NzX2Ftb3VudCkgLSB0b3RhbERpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50V2l0aFN1YnNlcXVlbnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcInVuaXRfcHJpY2VcIjpcclxuICAgICAgICBpZihkYXRhLnNhbGVfcmF0ZSAmJiBkYXRhLnNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIGlmICghdGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsoZGlzY291bnRfcGVyY2VudCkpIHtcclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgaWYoZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDApe1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGUgKiBxdWFudGl0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gZGF0YS5zYWxlX3JhdGUgKiBxdWFudGl0eTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGRpc19hbXQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZWZmZWN0aXZlR3Jvc3NBbW91bnQpICogKCtkaXNjb3VudF9wZXJjZW50KSkgLyAxMDApO1xyXG4gICAgICAgICAgbGV0IG9mZmVyUmF0ZSA9IDA7XHJcbiAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5zYWxlX3JhdGUgLSBkaXNfYW10O1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBvZmZlclJhdGUgPSBkYXRhLnNhbGVfcmF0ZSAtIChkaXNfYW10IC8gcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5zYWxlX3JhdGUgLSBkaXNfYW10O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gb2ZmZXJSYXRlO1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgZGlzX2FtdCA9IDA7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIGRhdGFbJ29mZmVyX3JhdGUnXSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKXtcclxuICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpKSB7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBsZXQgc3Vic2VxdWVudEdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAqIChxdWFudGl0eSAtIDEpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK3N1YnNlcXVlbnRHcm9zc0Ftb3VudCkgKiAoK3N1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCkpIC8gMTAwKTtcclxuICAgICAgICAgIGxldCBvZmZlclJhdGUgPSAwO1xyXG4gICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgb2ZmZXJSYXRlID0gZGF0YS5ub19vZl9pbmplY3Rpb24yIC0gKHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50IC8gKHF1YW50aXR5IC0gMSkpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIG9mZmVyUmF0ZSA9IGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSBvZmZlclJhdGU7XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgZGF0YVsnc3Vic2VxdWVudF9vZmZlcl9yYXRlJ10gPSAwO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IGRpc19hbXQgKyBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBkaXNfYW10O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2dyb3NzX2Ftb3VudCkgLSB0b3RhbERpc2NvdW50QW1vdW50KTtcclxuICAgICAgICB0aGlzLnBvcHVsYXRlUGFyYW1ldGVyQW1vdW50V2l0aFN1YnNlcXVlbnQoZGF0YSwgbmV0X2Ftb3VudCwgZGlzY291bnRfcGVyY2VudCwgZGlzX2FtdCwgcXVhbnRpdHksIGdyb3NzX2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCxzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQpO1xyXG5cclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgXCJvZmZlcl9yYXRlXCI6XHJcbiAgICAgIGNhc2UgXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIjpcclxuICAgICAgICBsZXQgb2ZmZXJfcmF0ZSA9IDA7XHJcbiAgICAgICAgaWYoaW5jb21pbmdfZmllbGQgPT0gXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIil7XHJcbiAgICAgICAgICBvZmZlcl9yYXRlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEuc3Vic2VxdWVudF9vZmZlcl9yYXRlKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIG9mZmVyX3JhdGUgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhvZmZlcl9yYXRlKSkge1xyXG4gICAgICAgICAgb2ZmZXJfcmF0ZSA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIC8vIGlmIChvZmZlcl9yYXRlID49IDAgKSB7XHJcbiAgICAgICAgICBpZihkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSAmJiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSA+IDAgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yICYmIGRhdGEubm9fb2ZfaW5qZWN0aW9uMiA+IDAgJiYgcXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgZWZmZWN0aXZlVG90YWwgPSAoKHF1YW50aXR5IC0gMSkgKiBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSkgKyBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgaWYoc2FsZV9yYXRlICYmIHNhbGVfcmF0ZSA+IDApe1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZVRvdGFsID0gcXVhbnRpdHkgKiBkYXRhLm9mZmVyX3JhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRvdGFsRGlzY291bnRBbW91bnQgPSBncm9zc19hbW91bnQgLSBlZmZlY3RpdmVUb3RhbFxyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIHRvdGFsRGlzY291bnRBbW91bnQ7XHJcbiAgICAgICAgICAvL2lmKGluY29taW5nX2ZpZWxkID09ICdvZmZlcl9yYXRlJyl7XHJcbiAgICAgICAgICAgIGxldCBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmKHNhbGVfcmF0ZSAmJiBzYWxlX3JhdGUgPiAwKXtcclxuICAgICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgICBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IHNhbGVfcmF0ZTtcclxuICAgICAgICAgICAgICAgIGRpc19hbXQgPSBlZmZlY3RpdmVHcm9zc0Ftb3VudCAtIGRhdGEub2ZmZXJfcmF0ZTtcclxuICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gc2FsZV9yYXRlICogcXVhbnRpdHk7XHJcbiAgICAgICAgICAgICAgICBkaXNfYW10ID0gZWZmZWN0aXZlR3Jvc3NBbW91bnQgLSAoZGF0YS5vZmZlcl9yYXRlICogcXVhbnRpdHkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChlZmZlY3RpdmVHcm9zc0Ftb3VudCA+IDApIHtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KDEwMCAqIGRpc19hbXQgLyBlZmZlY3RpdmVHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAvL31cclxuXHJcbiAgICAgICAgICAvL2lmIChpbmNvbWluZ19maWVsZCA9PSAnc3Vic2VxdWVudF9vZmZlcl9yYXRlJyAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKSB7XHJcbiAgICAgICAgICAgIGxldCBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgICAgaWYocXVhbnRpdHkgPT0gMSl7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSBkYXRhLnN1YnNlcXVlbnRfb2ZmZXJfcmF0ZSk7XHJcbiAgICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50IC0gZWZmZWN0aXZlR3Jvc3NBbW91bnQpO1xyXG4gICAgICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgLSAoIGVmZmVjdGl2ZVRvdGFsIC0gZGF0YS5vZmZlcl9yYXRlKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbXCJzdWJzZXF1ZW50X29mZmVyX3JhdGVcIl0gPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCA+IDApe1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgxMDAgKiBzdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudCAvIHN1YnNlcXVlbnRHcm9zc0Ftb3VudCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIC8vfVxyXG4gICAgICAgICAgdGhpcy5wb3B1bGF0ZVBhcmFtZXRlckFtb3VudFdpdGhTdWJzZXF1ZW50KGRhdGEsIG5ldF9hbW91bnQsIGRpc2NvdW50X3BlcmNlbnQsIGRpc19hbXQsIHF1YW50aXR5LCBncm9zc19hbW91bnQsc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQsc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50KTtcclxuXHJcbiAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgLy8gICBpZihpbmNvbWluZ19maWVsZCA9PSBcInN1YnNlcXVlbnRfb2ZmZXJfcmF0ZVwiKXtcclxuICAgICAgICAvLyAgICAgZGF0YVtcInN1YnNlcXVlbnRfb2ZmZXJfcmF0ZVwiXSA9IG9mZmVyX3JhdGU7XHJcbiAgICAgICAgLy8gICB9ZWxzZXtcclxuICAgICAgICAvLyAgICAgZGF0YVtcIm9mZmVyX3JhdGVcIl0gPSBvZmZlcl9yYXRlO1xyXG4gICAgICAgIC8vICAgfVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICBjYXNlIFwic3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnRcIjpcclxuICAgICAgICBpZihpbmNvbWluZ19maWVsZCA9PSAnZGlzY291bnRfYW1vdW50Jyl7XHJcbiAgICAgICAgICBpZihzYWxlX3JhdGUgJiYgc2FsZV9yYXRlID4gMCl7XHJcbiAgICAgICAgICAgIGRpc19hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayhkaXNfYW10KSkge1xyXG4gICAgICAgICAgICAgIGRpc19hbXQgPSAwO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCBlZmZlY3RpdmVHcm9zc0Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZWZmZWN0aXZlR3Jvc3NBbW91bnQgPSBzYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGVmZmVjdGl2ZUdyb3NzQW1vdW50ID0gcXVhbnRpdHkgKiBzYWxlX3JhdGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoKCtkaXNfYW10KSAqIDEwMCkgLyAoK2VmZmVjdGl2ZUdyb3NzQW1vdW50KSk7XHJcbiAgICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwICYmIHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICAgICAgZGF0YVsnb2ZmZXJfcmF0ZSddID0gKGVmZmVjdGl2ZUdyb3NzQW1vdW50IC0gZGlzX2FtdCk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbJ29mZmVyX3JhdGUnXSA9IChlZmZlY3RpdmVHcm9zc0Ftb3VudCAtIGRpc19hbXQpIC8gcXVhbnRpdHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgICAgZGlzX2FtdCA9IDA7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBpZihkYXRhLm5vX29mX2luamVjdGlvbjIgJiYgZGF0YS5ub19vZl9pbmplY3Rpb24yID4gMCl7XHJcbiAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQpO1xyXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSkge1xyXG4gICAgICAgICAgICAgIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBsZXQgc3Vic2VxdWVudEdyb3NzQW1vdW50ID0gMDtcclxuICAgICAgICAgICAgaWYocXVhbnRpdHkgPiAxKXtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjIgKiAocXVhbnRpdHkgLTEpO1xyXG4gICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICBzdWJzZXF1ZW50R3Jvc3NBbW91bnQgPSBkYXRhLm5vX29mX2luamVjdGlvbjI7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK3N1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSAqIDEwMCkgLyAoK3N1YnNlcXVlbnRHcm9zc0Ftb3VudCkpO1xyXG4gICAgICAgICAgICBpZihxdWFudGl0eSA+IDEpe1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3N1YnNlcXVlbnRfb2ZmZXJfcmF0ZSddID0gKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KSAvIChxdWFudGl0eSAtMSk7XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRhdGFbJ3N1YnNlcXVlbnRfb2ZmZXJfcmF0ZSddID0gKHN1YnNlcXVlbnRHcm9zc0Ftb3VudCAtIHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZGF0YS5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICBzdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSAwO1xyXG4gICAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gZGF0YS5kaXNjb3VudF9wZXJjZW50O1xyXG4gICAgICAgICAgICBkaXNfYW10ID0gZGF0YS5kaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmKHF1YW50aXR5ID4gMSl7XHJcbiAgICAgICAgICB0b3RhbERpc2NvdW50QW1vdW50ID0gc3Vic2VxdWVudF9kaXNjb3VudF9hbW91bnQgKyBkaXNfYW10O1xyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdG90YWxEaXNjb3VudEFtb3VudCA9IGRpc19hbXQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZ3Jvc3NfYW1vdW50KSAtIHRvdGFsRGlzY291bnRBbW91bnQpO1xyXG4gICAgICAgIHRoaXMucG9wdWxhdGVQYXJhbWV0ZXJBbW91bnRXaXRoU3Vic2VxdWVudChkYXRhLCBuZXRfYW1vdW50LCBkaXNjb3VudF9wZXJjZW50LCBkaXNfYW10LCBxdWFudGl0eSwgZ3Jvc3NfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50LHN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCk7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG59XHJcbmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckF1dG9tb3RpdmVMaW1zV2l0aFN1YnNlcXVlbnQoZGF0YTphbnksIGZpZWxkTmFtZTphbnkpIHtcclxuICAgIGxldCBxdWFudGl0eSA9IDA7XHJcbiAgICBsZXQgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICBsZXQgY29zdF9yYXRlID0gMDtcclxuICAgIGxldCBuZXRfYW1vdW50OmFueSA9IDA7XHJcbiAgICBsZXQgcGFyYW1fcXVhbnRvbSA9IDA7XHJcbiAgICBsZXQgQmFzZV9xdW90YXRpb25fcmF0ZSA9IDA7XHJcbiAgICBsZXQgaW5jb21pbmdfZmllbGQgPSBmaWVsZE5hbWU7XHJcblxyXG4gICAgbGV0IGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICBsZXQgZGlzX2FtdCA9IDA7XHJcbiAgICBzd2l0Y2ggKGluY29taW5nX2ZpZWxkKSB7XHJcbiAgICAgIGNhc2UgXCJwYXJhbWV0ZXJfcXVhbnR1bVwiOlxyXG4gICAgICAgIGxldCBwYXJhbWV0ZXJRdWFudHVtID0gZGF0YS5wYXJhbWV0ZXJfcXVhbnR1bTtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHBhcmFtZXRlclF1YW50dW0pKSB7XHJcbiAgICAgICAgICBwYXJhbWV0ZXJRdWFudHVtID0gMDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZGF0YVsncXVhbnR1bV9yYXRlJ10gPSAoK2RhdGEucXVvdGF0aW9uX3JhdGUpICogKCtwYXJhbWV0ZXJRdWFudHVtKTtcclxuICAgICAgICBkYXRhWydxdW90YXRpb25fZWZmZWN0aXZlX3JhdGUnXSA9ICgrZGF0YS5xdHkpICogKCtkYXRhLnF1YW50dW1fcmF0ZSk7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZVxyXG4gICAgICAgIGlmIChkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGxldCBkaXNjb3VudCA9ICgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICBkYXRhWydkaXNjb3VudF9hbW91bnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICAgICAgbmV0X2Ftb3VudCA9ICgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGlzY291bnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJxdHlcIjpcclxuICAgICAgICBsZXQgcXVhbnRpdHkgPSBkYXRhLnF0eTtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHF1YW50aXR5KSkge1xyXG4gICAgICAgICAgcXVhbnRpdHkgPSAwO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZGF0YVsncXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlJ10gPSAoK3F1YW50aXR5KSAqICgrZGF0YS5xdWFudHVtX3JhdGUpO1xyXG4gICAgICAgIGlmIChkYXRhLmRpc2NvdW50X3BlcmNlbnQpIHtcclxuICAgICAgICAgIGxldCBkaXNjb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGF0YS5kaXNjb3VudF9wZXJjZW50KSkgLyAxMDA7XHJcbiAgICAgICAgICBkYXRhWydkaXNjb3VudF9hbW91bnQnXSA9IGRpc2NvdW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgrZGF0YS5xdW90YXRpb25fZWZmZWN0aXZlX3JhdGUpIC0gZGF0YVsnZGlzY291bnRfYW1vdW50J10pO1xyXG4gICAgICAgIGRhdGFbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnRcclxuICAgICAgICBkYXRhWyd0b3RhbCddID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlO1xyXG4gICAgICAgIGRhdGFbJ3F0eSddID0gZGF0YS5xdHlcclxuXHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgXCJkaXNjb3VudF9wZXJjZW50XCI6XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X3BlciA9IGRhdGEuZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X3BlcikpIHtcclxuICAgICAgICAgIGRpc2NvdW50X3BlciA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRhdGFbJ3F1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSddID0gKCtkYXRhLnF0eSkgKiAoK2RhdGEucXVhbnR1bV9yYXRlKTtcclxuICAgICAgICBuZXRfYW1vdW50ID0gK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlXHJcbiAgICAgICAgbGV0IGRpc2NvdW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAqICgrZGlzY291bnRfcGVyKSkgLyAxMDApO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnQ7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSAtIGRpc2NvdW50KTtcclxuICAgICAgICBkYXRhWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50XHJcbiAgICAgICAgZGF0YVsndG90YWwnXSA9ICtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZTtcclxuICAgICAgICBkYXRhWydxdHknXSA9IGRhdGEucXR5O1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9ICtkaXNjb3VudF9wZXI7XHJcblxyXG4gICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgY2FzZSBcImRpc2NvdW50X2Ftb3VudFwiOlxyXG4gICAgICAgIGxldCBkaXNjb3VudF9hbXQgPSBkYXRhLmRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICBpZiAoIXRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKGRpc2NvdW50X2FtdCkpIHtcclxuICAgICAgICAgIGRpc2NvdW50X2FtdCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBuZXRfYW1vdW50ID0gKCtkYXRhLnF1b3RhdGlvbl9lZmZlY3RpdmVfcmF0ZSkgLSAoK2Rpc2NvdW50X2FtdCk7XHJcbiAgICAgICAgbGV0IGRpc2NvdW50X3BlcmMgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoKCgrZGlzY291bnRfYW10KSAqIDEwMCkgLyAoK2RhdGEucXVvdGF0aW9uX2VmZmVjdGl2ZV9yYXRlKSk7XHJcbiAgICAgICAgZGF0YVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICBkYXRhWydkaXNjb3VudF9wZXJjZW50J10gPSBkaXNjb3VudF9wZXJjO1xyXG4gICAgICAgIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddID0gK2RhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG5cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuXHJcbiAgICB9XHJcbiAgICBpZiAoZGF0YVsncXR5J10gPiAwKSB7XHJcbiAgICAgIGRhdGFbJ3Blcl9zYW1wbGVfbmV0X3JhdGUnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkYXRhWyduZXRfYW1vdW50J10gLyBkYXRhWydxdHknXSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBkYXRhWydwZXJfc2FtcGxlX25ldF9yYXRlJ10gPSAwO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zYW5pdGl6ZVBhcmFtZXRlckFtb3VudChkYXRhKTtcclxuICB9XHJcbmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50OiBhbnksIGRhdGE6IGFueSwgZmllbGROYW1lOiBzdHJpbmcpIHtcclxuICBzd2l0Y2ggKGxpbXNfc2VnbWVudCkge1xyXG4gICAgY2FzZSAnc3RhbmRhcmQnOlxyXG4gICAgICB0aGlzLmNhbGN1bGF0ZVF1b3RhdGlvblBhcmFtZXRlckFtb3VudEZvckxpbXNXaXRoU3Vic2VxdWVudChkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgIGJyZWFrO1xyXG4gICAgY2FzZSAnYXV0b21vdGl2ZSc6XHJcbiAgICAgIHRoaXMuY2FsY3VsYXRlUXVvdGF0aW9uUGFyYW1ldGVyQW1vdW50Rm9yQXV0b21vdGl2ZUxpbXNXaXRoU3Vic2VxdWVudChkYXRhLCBmaWVsZE5hbWUpXHJcbiAgICAgIGJyZWFrXHJcbiAgfVxyXG5cclxufVxyXG5cclxuY2FsY3VsYXRlX3F1b3RhdGlvbl93aXRoX3N1YnNlcXVlbnQodGVtcGxhdGVWYWx1ZTphbnksIGxpbXNfc2VnbWVudDphbnksIGZpZWxkOiBhbnkpIHtcclxuICB2YXIgdG90YWwgPSAwO1xyXG4gIGxldCBkaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICBsZXQgbmV0X2Ftb3VudCA9IDA7XHJcbiAgbGV0IHNhbXBsaW5nX2Ftb3VudCA9IDA7XHJcbiAgbGV0IGZpbmFsX2Ftb3VudCA9IDA7XHJcbiAgbGV0IGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgbGV0IHF1b3RhdGlvbl9wYXJhbV9tZXRob2RzID0gW107XHJcbiAgbGV0IHVuaXRfcHJpY2U6YW55ID0gMDtcclxuICBsZXQgcGFyYW1BcnJheTphbnkgPSBbXTtcclxuICBsZXQgZ3Jvc3NfYW1vdW50ID0gMDtcclxuICBsZXQgZmllbGRfbmFtZSA9IGZpZWxkLmZpZWxkX25hbWU7XHJcbiAgbGV0IHF0eSA9IDA7XHJcbiAgbGV0IHByb2R1Y3Rfd2lzZV9wcmljaW5nID0gdGVtcGxhdGVWYWx1ZVsncHJvZHVjdF93aXNlX3ByaWNpbmcnXTtcclxuICBsZXQgY3VycmVudF9kaXNvdW50ID0gMDtcclxuICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddKSkge1xyXG4gICAgY3VycmVudF9kaXNvdW50ID0gdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddO1xyXG4gIH1cclxuXHJcbiAgaWYgKHRoaXMuY29yZUZ1bmN0aW9uU2VydmljZS5pc05vdEJsYW5rKHRlbXBsYXRlVmFsdWUucXR5KSkge1xyXG4gICAgcXR5ID0gdGVtcGxhdGVWYWx1ZS5xdHk7XHJcbiAgfVxyXG5cclxuICBpZiAodGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSAhPSAnJyAmJiB0ZW1wbGF0ZVZhbHVlWydxdW90YXRpb25fcGFyYW1fbWV0aG9kcyddLmxlbmd0aCA+IDApIHtcclxuICAgIHRlbXBsYXRlVmFsdWVbJ3F1b3RhdGlvbl9wYXJhbV9tZXRob2RzJ10uZm9yRWFjaCgoZWxlbWVudDphbnkpID0+IHtcclxuICAgICAgbGV0IGRhdGEgPSB7IC4uLmVsZW1lbnQgfTtcclxuICAgICAgcGFyYW1BcnJheS5wdXNoKGRhdGEpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcblxyXG4gIGlmICh0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXSAmJiB0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXSAhPSBudWxsKSB7XHJcbiAgICBzYW1wbGluZ19hbW91bnQgPSB0ZW1wbGF0ZVZhbHVlWydzYW1wbGluZ19jaGFyZ2UnXTtcclxuICB9XHJcbiAgLy8gaWYoZ3Jvc3NfYW1vdW50PjApe1xyXG4gIGlmICh0cnVlKSB7XHJcbiAgICBzd2l0Y2ggKGZpZWxkX25hbWUpIHtcclxuICAgICAgY2FzZSAncGFyYW1ldGVyX2FycmF5JzpcclxuICAgICAgICB1bml0X3ByaWNlID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IHRlbXBsYXRlVmFsdWUudW5pdF9wcmljZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gcXR5ICogdW5pdF9wcmljZTtcclxuICAgICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICAgIH0pXHJcblxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIG5ldF9hbW91bnQgPSAwO1xyXG4gICAgICAgICAgICB0b3RhbCA9IDA7XHJcbiAgICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IDA7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmNvcmVGdW5jdGlvblNlcnZpY2UuaXNOb3RCbGFuayh0ZW1wbGF0ZVZhbHVlLnF0eSkpIHtcclxuICAgICAgICAgICAgICBxdHkgPSB0ZW1wbGF0ZVZhbHVlLnF0eTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGxpbXNfc2VnbWVudCA9PSAnc3RhbmRhcmQnKSB7XHJcbiAgICAgICAgICAgICAgICBkYXRhWydxdHknXSA9IHF0eTtcclxuICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsICdxdHknKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgZ3Jvc3NfYW1vdW50ID0gZ3Jvc3NfYW1vdW50ICsgZGF0YVsndG90YWwnXTtcclxuICAgICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXTtcclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGNhc2UgJ2Rpc2NvdW50X3BlcmNlbnQnOlxyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0ZW1wbGF0ZVZhbHVlW2ZpZWxkX25hbWVdO1xyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICBkYXRhLnN1YnNlcXVlbnRfZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50LCBkYXRhLCBmaWVsZF9uYW1lKTtcclxuICAgICAgICAgIGdyb3NzX2Ftb3VudCA9IGdyb3NzX2Ftb3VudCArIGRhdGFbJ3RvdGFsJ107XHJcbiAgICAgICAgfSlcclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgKiBkaXNjb3VudF9wZXJjZW50IC8gMTAwO1xyXG4gICAgICAgIG5ldF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfYW1vdW50J10gPSBkaXNjb3VudF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnbmV0X2Ftb3VudCddID0gbmV0X2Ftb3VudDtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSBuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J107XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICdkaXNjb3VudF9hbW91bnQnOlxyXG4gICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KTtcclxuICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICBkYXRhLmRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJkaXNjb3VudF9wZXJjZW50XCIpO1xyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ3VuaXRfcHJpY2UnXSA9IG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXTtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyduZXRfYW1vdW50J10gPSBuZXRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X3BlcmNlbnQnXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG5cclxuICAgICAgY2FzZSAnbmV0X2Ftb3VudCc6XHJcbiAgICAgICAgZGlzY291bnRfcGVyY2VudCA9IDA7XHJcbiAgICAgICAgbmV0X2Ftb3VudCA9IHRlbXBsYXRlVmFsdWVbZmllbGRfbmFtZV07XHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcblxyXG5cclxuICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBncm9zc19hbW91bnQgLSBuZXRfYW1vdW50O1xyXG4gICAgICAgIGRpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERpc2NvdW50UGVyY2VudGFnZShjdXJyZW50X2Rpc291bnQsIGRpc2NvdW50X2Ftb3VudCwgZ3Jvc3NfYW1vdW50LCBxdHkpXHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgIGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KCtkaXNjb3VudF9wZXJjZW50KTtcclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwiZGlzY291bnRfcGVyY2VudFwiKTtcclxuICAgICAgICB9KVxyXG5cclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlW1wiZGlzY291bnRfcGVyY2VudFwiXSA9IGRpc2NvdW50X3BlcmNlbnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVtcImRpc2NvdW50X2Ftb3VudFwiXSA9IGRpc2NvdW50X2Ftb3VudDtcclxuICAgICAgICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSBuZXRfYW1vdW50IC8gdGVtcGxhdGVWYWx1ZVsncXR5J107XHJcbiAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICBjYXNlICd1bml0X3ByaWNlJzpcclxuICAgICAgICB1bml0X3ByaWNlID0gMDtcclxuICAgICAgICBpZiAodGhpcy5jb3JlRnVuY3Rpb25TZXJ2aWNlLmlzTm90QmxhbmsodGVtcGxhdGVWYWx1ZS51bml0X3ByaWNlKSkge1xyXG4gICAgICAgICAgdW5pdF9wcmljZSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCh0ZW1wbGF0ZVZhbHVlLnVuaXRfcHJpY2UpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBuZXRfYW1vdW50ID0gcXR5ICogdW5pdF9wcmljZTtcclxuXHJcbiAgICAgICAgcGFyYW1BcnJheS5mb3JFYWNoKChkYXRhOmFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5jYWxjdWxhdGVQYXJhbWV0ZXJMaW1zU2VnbWVudFdpc2VGb3JTdWJzZXF1ZW50KGxpbXNfc2VnbWVudCwgZGF0YSwgXCJxdHlcIik7XHJcbiAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgIH0pXHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gZ3Jvc3NfYW1vdW50IC0gbmV0X2Ftb3VudDtcclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHBhcmFtQXJyYXkuZm9yRWFjaCgoZGF0YTphbnkpID0+IHtcclxuICAgICAgICAgIGlmKGRhdGEuc2FsZV9yYXRlICYmIGRhdGEuc2FsZV9yYXRlID4gMCl7XHJcbiAgICAgICAgICAgIGRhdGEuZGlzY291bnRfcGVyY2VudCA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudCgrZGlzY291bnRfcGVyY2VudCk7XHJcbiAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgZGF0YS5kaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmKGRhdGEubm9fb2ZfaW5qZWN0aW9uMiAmJiBkYXRhLm5vX29mX2luamVjdGlvbjIgPiAwKXtcclxuICAgICAgICAgICAgZGF0YS5zdWJzZXF1ZW50X2Rpc2NvdW50X3BlcmNlbnQgPSB0aGlzLmdldERlY2ltYWxBbW91bnQoK2Rpc2NvdW50X3BlcmNlbnQpO1xyXG4gICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgIGRhdGEuc3Vic2VxdWVudF9kaXNjb3VudF9wZXJjZW50ID0gMDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIFwidW5pdF9wcmljZVwiKTtcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICBicmVhaztcclxuXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgZGlzY291bnRfYW1vdW50ID0gMDtcclxuICAgICAgICBuZXRfYW1vdW50ID0gMDtcclxuICAgICAgICBpZiAocGFyYW1BcnJheS5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgIGRhdGFbJ3F0eSddID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KHF0eSk7XHJcbiAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUGFyYW1ldGVyTGltc1NlZ21lbnRXaXNlRm9yU3Vic2VxdWVudChsaW1zX3NlZ21lbnQsIGRhdGEsIGZpZWxkX25hbWUpO1xyXG4gICAgICAgICAgICBncm9zc19hbW91bnQgPSBncm9zc19hbW91bnQgKyBkYXRhWyd0b3RhbCddO1xyXG4gICAgICAgICAgICBuZXRfYW1vdW50ID0gbmV0X2Ftb3VudCArIGRhdGFbJ25ldF9hbW91bnQnXTtcclxuICAgICAgICAgICAgaWYoZGF0YVsncXR5J10gPiAxKXtcclxuICAgICAgICAgICAgICBkaXNjb3VudF9hbW91bnQgPSBkaXNjb3VudF9hbW91bnQgKyBkYXRhWydkaXNjb3VudF9hbW91bnQnXSArIGRhdGFbJ3N1YnNlcXVlbnRfZGlzY291bnRfYW1vdW50J107XHJcbiAgICAgICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGRpc2NvdW50X2Ftb3VudCArIGRhdGFbJ2Rpc2NvdW50X2Ftb3VudCddO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHByb2R1Y3Rfd2lzZV9wcmljaW5nKSB7XHJcbiAgICAgICAgICB1bml0X3ByaWNlID0gdGVtcGxhdGVWYWx1ZVtcInVuaXRfcHJpY2VcIl07XHJcbiAgICAgICAgICBuZXRfYW1vdW50ID0gdW5pdF9wcmljZSAqIHF0eTtcclxuICAgICAgICAgIGRpc2NvdW50X2Ftb3VudCA9IGdyb3NzX2Ftb3VudCAtIG5ldF9hbW91bnQ7XHJcbiAgICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgICAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgICBwYXJhbUFycmF5LmZvckVhY2goKGRhdGE6YW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgZGF0YVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBhcmFtZXRlckxpbXNTZWdtZW50V2lzZUZvclN1YnNlcXVlbnQobGltc19zZWdtZW50LCBkYXRhLCBcInVuaXRfcHJpY2VcIik7XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBkaXNjb3VudF9wZXJjZW50ID0gdGhpcy5nZXREaXNjb3VudFBlcmNlbnRhZ2UoY3VycmVudF9kaXNvdW50LCBkaXNjb3VudF9hbW91bnQsIGdyb3NzX2Ftb3VudCwgcXR5KVxyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ2Rpc2NvdW50X2Ftb3VudCddID0gZGlzY291bnRfYW1vdW50O1xyXG4gICAgICAgIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IG5ldF9hbW91bnQ7XHJcbiAgICAgICAgdGVtcGxhdGVWYWx1ZVsnZGlzY291bnRfcGVyY2VudCddID0gZGlzY291bnRfcGVyY2VudDtcclxuXHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZmluYWxfYW1vdW50ID0gbmV0X2Ftb3VudCArIHNhbXBsaW5nX2Ftb3VudDtcclxuICBpZiAodGVtcGxhdGVWYWx1ZVsncXR5J10gPiAwKSB7XHJcbiAgICB1bml0X3ByaWNlID0gdGhpcy5nZXREZWNpbWFsQW1vdW50KG5ldF9hbW91bnQgLyB0ZW1wbGF0ZVZhbHVlWydxdHknXSk7XHJcbiAgfSBlbHNlIHtcclxuICAgIHVuaXRfcHJpY2UgPSB0ZW1wbGF0ZVZhbHVlW1widW5pdF9wcmljZVwiXTtcclxuICB9XHJcblxyXG4gIHRlbXBsYXRlVmFsdWVbJ3RvdGFsJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZ3Jvc3NfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChkaXNjb3VudF9hbW91bnQpO1xyXG4gIHRlbXBsYXRlVmFsdWVbJ25ldF9hbW91bnQnXSA9IHRoaXMuZ2V0RGVjaW1hbEFtb3VudChuZXRfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWydkaXNjb3VudF9wZXJjZW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZGlzY291bnRfcGVyY2VudCk7XHJcbiAgdGVtcGxhdGVWYWx1ZVsnZmluYWxfYW1vdW50J10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQoZmluYWxfYW1vdW50KTtcclxuICB0ZW1wbGF0ZVZhbHVlWyd1bml0X3ByaWNlJ10gPSB0aGlzLmdldERlY2ltYWxBbW91bnQodW5pdF9wcmljZSk7XHJcbiAgaWYgKHBhcmFtQXJyYXkubGVuZ3RoID4gMCkge1xyXG4gICAgdGVtcGxhdGVWYWx1ZVsncXVvdGF0aW9uX3BhcmFtX21ldGhvZHMnXSA9IHBhcmFtQXJyYXk7XHJcbiAgfVxyXG5cclxuICByZXR1cm4gdGVtcGxhdGVWYWx1ZTtcclxuXHJcbn1cclxuXHJcbi8qKlxyXG4gKiBFbmQgcG9pbnQgZm9yIHN1YnNlcXVldCBjYWxjdWxhdGlvbiBmb3IgcXVvdGF0aW9uXHJcbiAqL1xyXG5cclxuXHJcbn1cclxuIl19
|