ezlibrary_v2 0.0.1
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/esm2020/ezlibrary_v2.mjs +5 -0
- package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
- package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
- package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
- package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
- package/esm2020/lib/auth/auth.guard.mjs +40 -0
- package/esm2020/lib/bi-service/bi.service.mjs +58 -0
- package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
- package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
- package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
- package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
- package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
- package/esm2020/lib/ezheader/header.component.mjs +383 -0
- package/esm2020/lib/ezlib.module.mjs +220 -0
- package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
- package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
- package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
- package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
- package/esm2020/lib/footer/footer.component.mjs +18 -0
- package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
- package/esm2020/lib/globle/globle-env.service.mjs +45 -0
- package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
- package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
- package/esm2020/lib/globle/shared-services.service.mjs +27 -0
- package/esm2020/lib/globle/upload-service.service.mjs +69 -0
- package/esm2020/lib/header/header.component.mjs +179 -0
- package/esm2020/lib/invalid/invalid.component.mjs +71 -0
- package/esm2020/lib/logout/logout.component.mjs +107 -0
- package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
- package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
- package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
- package/esm2020/lib/pipes/selectedCount.mjs +19 -0
- package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
- package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
- package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
- package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
- package/esm2020/lib/report-format/report-format.component.mjs +400 -0
- package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
- package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
- package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
- package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
- package/esm2020/lib/system-module/system/system.component.mjs +959 -0
- package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
- package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
- package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
- package/esm2020/lib/utility/constants.mjs +5 -0
- package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
- package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
- package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
- package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
- package/esm2020/lib/utility/tranform.directive.mjs +27 -0
- package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
- package/esm2020/public_api.mjs +57 -0
- package/ezlibrary_v2.d.ts +5 -0
- package/fesm2015/ezlibrary_v2.mjs +33543 -0
- package/fesm2015/ezlibrary_v2.mjs.map +1 -0
- package/fesm2020/ezlibrary_v2.mjs +33533 -0
- package/fesm2020/ezlibrary_v2.mjs.map +1 -0
- package/lib/admin-service/admin-service.service.d.ts +13 -0
- package/lib/analysis-search/analysis-search.component.d.ts +122 -0
- package/lib/assort-service/assort-service.service.d.ts +12 -0
- package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
- package/lib/auth/auth.guard.d.ts +16 -0
- package/lib/bi-service/bi.service.d.ts +20 -0
- package/lib/call-info/callinfo.component.d.ts +30 -0
- package/lib/comman-service/comman-service.service.d.ts +111 -0
- package/lib/comman-service/share-data-service.service.d.ts +10 -0
- package/lib/contact-search/contact-search.component.d.ts +115 -0
- package/lib/contact-service/contact-service.service.d.ts +15 -0
- package/lib/ezheader/header.component.d.ts +61 -0
- package/lib/ezlib.module.d.ts +47 -0
- package/lib/file-upload/fileupload.component.d.ts +131 -0
- package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
- package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
- package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
- package/lib/footer/footer.component.d.ts +9 -0
- package/lib/globle/common-pdf.service.d.ts +9 -0
- package/lib/globle/globle-env.service.d.ts +16 -0
- package/lib/globle/memo-report.service.d.ts +107 -0
- package/lib/globle/pdf-service.service.d.ts +459 -0
- package/lib/globle/shared-services.service.d.ts +12 -0
- package/lib/globle/upload-service.service.d.ts +20 -0
- package/lib/header/header.component.d.ts +45 -0
- package/lib/invalid/invalid.component.d.ts +12 -0
- package/lib/logout/logout.component.d.ts +21 -0
- package/lib/menu-right/menu-right.component.d.ts +47 -0
- package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
- package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
- package/lib/pipes/selectedCount.d.ts +7 -0
- package/lib/pipes/sum.pipe.d.ts +7 -0
- package/lib/pkt-data/pkt-data.component.d.ts +189 -0
- package/lib/pricing-service/pricing.service.d.ts +20 -0
- package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
- package/lib/report-format/report-format.component.d.ts +74 -0
- package/lib/sessionend/session-end.guard.d.ts +10 -0
- package/lib/stock-service/lazyload.service.d.ts +7 -0
- package/lib/stock-service/stock-service.service.d.ts +19 -0
- package/lib/system-module/subform/subform.component.d.ts +227 -0
- package/lib/system-module/system/system.component.d.ts +113 -0
- package/lib/system-module/system-service/system-service.service.d.ts +23 -0
- package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
- package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
- package/lib/utility/constants.d.ts +4 -0
- package/lib/utility/contact-table-search.pipe.d.ts +7 -0
- package/lib/utility/formate-num-field.pipe.d.ts +7 -0
- package/lib/utility/search-pipe.pipe.d.ts +7 -0
- package/lib/utility/selective-preloading-strategy.d.ts +9 -0
- package/lib/utility/table-search.pipe.d.ts +7 -0
- package/lib/utility/tranform.directive.d.ts +10 -0
- package/lib/websearch-history/websearch-history.component.d.ts +62 -0
- package/package.json +48 -0
- package/public_api.d.ts +52 -0
|
@@ -0,0 +1,1107 @@
|
|
|
1
|
+
import { ToastrService } from 'ngx-toastr';
|
|
2
|
+
import { NgxSpinnerService } from "ngx-spinner";
|
|
3
|
+
import { BiService } from './../bi-service/bi.service';
|
|
4
|
+
import { CommanServiceService } from '../comman-service/comman-service.service';
|
|
5
|
+
import { Component, ViewChild } from '@angular/core';
|
|
6
|
+
import { Router, ActivatedRoute } from '@angular/router';
|
|
7
|
+
import { Cookie } from 'ng2-cookies/ng2-cookies';
|
|
8
|
+
import * as _ from 'lodash';
|
|
9
|
+
import { BaseChartDirective } from 'ng2-charts';
|
|
10
|
+
import * as pluginDataLabels from 'chartjs-plugin-labels';
|
|
11
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
12
|
+
// import * as Rx from 'rxjs/Rx';
|
|
13
|
+
import { from } from 'rxjs';
|
|
14
|
+
import { groupBy, toArray, map, mergeMap } from 'rxjs/operators';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "../comman-service/comman-service.service";
|
|
17
|
+
import * as i2 from "./../bi-service/bi.service";
|
|
18
|
+
import * as i3 from "ngx-spinner";
|
|
19
|
+
import * as i4 from "ngx-toastr";
|
|
20
|
+
import * as i5 from "@angular/router";
|
|
21
|
+
import * as i6 from "ng-select";
|
|
22
|
+
import * as i7 from "@angular/common";
|
|
23
|
+
import * as i8 from "@angular/forms";
|
|
24
|
+
import * as i9 from "ngx-infinite-scroll";
|
|
25
|
+
import * as i10 from "ng2-charts";
|
|
26
|
+
import * as i11 from "../utility/app-no-dbl-click.directive";
|
|
27
|
+
import * as i12 from "../utility/table-search.pipe";
|
|
28
|
+
// import { sumBy } from 'lodash';
|
|
29
|
+
export class PktDataComponent {
|
|
30
|
+
constructor(cs, bis, _spinnerService, toastr, router, route) {
|
|
31
|
+
this.cs = cs;
|
|
32
|
+
this.bis = bis;
|
|
33
|
+
this._spinnerService = _spinnerService;
|
|
34
|
+
this.toastr = toastr;
|
|
35
|
+
this.router = router;
|
|
36
|
+
this.route = route;
|
|
37
|
+
this.pkts = [];
|
|
38
|
+
this.headerKey = [];
|
|
39
|
+
this.header = [];
|
|
40
|
+
this.totalWeight = 0;
|
|
41
|
+
this.scrollDistance = 1;
|
|
42
|
+
this.scrollUpDistance = 2;
|
|
43
|
+
this.startIndex = 0;
|
|
44
|
+
this.endIndex = 30;
|
|
45
|
+
this.groupstartIndex = 0;
|
|
46
|
+
this.groupendIndex = 30;
|
|
47
|
+
this.loadResult = [];
|
|
48
|
+
this.resultlength = 0;
|
|
49
|
+
this.totAvg = 0;
|
|
50
|
+
this.totDis = 0;
|
|
51
|
+
this.selectedItm = [];
|
|
52
|
+
this.selectwt = 0;
|
|
53
|
+
this.selectAvg = 0;
|
|
54
|
+
this.selectDis = 0;
|
|
55
|
+
this.selectAmt = 0;
|
|
56
|
+
this.sttWiseSummary = new Map();
|
|
57
|
+
// anaAllGrpStt = ['asrt', 'lab', 'mkt', 'sold'];
|
|
58
|
+
this.anaAllGrpStt = [];
|
|
59
|
+
this.legendList = [];
|
|
60
|
+
this.newwindow = "YES";
|
|
61
|
+
this.staticLov = [];
|
|
62
|
+
this.defaultGrpList = [];
|
|
63
|
+
this.stObj = {};
|
|
64
|
+
this.totAmt = 0;
|
|
65
|
+
this.nodata = true;
|
|
66
|
+
this.viewdisType = "group";
|
|
67
|
+
this.summaryList = [];
|
|
68
|
+
this.coPuattributeStr = [];
|
|
69
|
+
this.groupBypktList = [];
|
|
70
|
+
this.loadgroupBypktList = [];
|
|
71
|
+
this.sttwise = false;
|
|
72
|
+
this.grp = [];
|
|
73
|
+
this.GrpVals = [];
|
|
74
|
+
this.finalGrpVal = {};
|
|
75
|
+
this.finalSummaryDtl = {};
|
|
76
|
+
this.data = [];
|
|
77
|
+
this.summaryDtl = {};
|
|
78
|
+
this.headList = [];
|
|
79
|
+
this.GrpValsPie = [];
|
|
80
|
+
this.grpPie = [];
|
|
81
|
+
this.finalGrpValPie = {};
|
|
82
|
+
this.summaryDtlPie = {};
|
|
83
|
+
this.byrvalGrp = []; //{};
|
|
84
|
+
this.isBuyerwise = false;
|
|
85
|
+
this.isGrpwise = false;
|
|
86
|
+
this.grpWiseQty = [];
|
|
87
|
+
this.dataType = "";
|
|
88
|
+
this.dynamicColors = [];
|
|
89
|
+
this.byrValArr = [];
|
|
90
|
+
this.pieChartPlugins = [pluginDataLabels];
|
|
91
|
+
this.doughnutChartType = 'pie';
|
|
92
|
+
this.doughnutChartLabels = [];
|
|
93
|
+
this.doughnutChartData = [];
|
|
94
|
+
this.pieChartColors = [];
|
|
95
|
+
this.pieChartLegend = true;
|
|
96
|
+
this.chartColors = [
|
|
97
|
+
{
|
|
98
|
+
backgroundColor: this.generate(),
|
|
99
|
+
fillColor: this.generate(),
|
|
100
|
+
strokeColor: this.generate()
|
|
101
|
+
//["#000080", "#0020C2", "#1569C7", "#357EC7", "#368BC1","659EC7"]
|
|
102
|
+
}
|
|
103
|
+
];
|
|
104
|
+
this.labels = {
|
|
105
|
+
labels: {
|
|
106
|
+
render: 'percentage',
|
|
107
|
+
// fontColor: ['green', 'white', 'red'],
|
|
108
|
+
precision: 2
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
this.chartOptions = {
|
|
112
|
+
plugins: {
|
|
113
|
+
labels: {
|
|
114
|
+
render: 'percentage',
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
legend: {
|
|
118
|
+
position: 'right',
|
|
119
|
+
labels: {
|
|
120
|
+
fontColor: 'black',
|
|
121
|
+
boxWidth: 10,
|
|
122
|
+
padding: 10,
|
|
123
|
+
fontSize: 10,
|
|
124
|
+
render: 'percentage',
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
this.pieChartOptions = {
|
|
129
|
+
//legend: {position: 'left',fontColor:'white'},
|
|
130
|
+
//plugins: {labels: { render: 'percentage',position: 'border', textMargin: 4}}
|
|
131
|
+
legend: {
|
|
132
|
+
position: 'right',
|
|
133
|
+
labels: {
|
|
134
|
+
fontColor: 'black',
|
|
135
|
+
boxWidth: 10,
|
|
136
|
+
padding: 10,
|
|
137
|
+
fontSize: 10,
|
|
138
|
+
render: 'percentage'
|
|
139
|
+
}
|
|
140
|
+
},
|
|
141
|
+
plugins: {
|
|
142
|
+
datalabels: {
|
|
143
|
+
formatter: (value, ctx) => {
|
|
144
|
+
const label = ctx.chart.data.labels[ctx.dataIndex];
|
|
145
|
+
return label;
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
this.pie = {
|
|
151
|
+
legend: { position: 'left', fontColor: 'white' },
|
|
152
|
+
plugins: {
|
|
153
|
+
labels: {
|
|
154
|
+
// render 'label', 'value', 'percentage', 'image' or custom function, default is 'percentage'
|
|
155
|
+
render: 'percentage',
|
|
156
|
+
precision: 0,
|
|
157
|
+
arc: true,
|
|
158
|
+
showActualPercentages: true,
|
|
159
|
+
position: 'outside'
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
tooltips: {
|
|
163
|
+
mode: 'label',
|
|
164
|
+
callbacks: {
|
|
165
|
+
label: function (tooltipItem, data) {
|
|
166
|
+
// let label = data.datasets[tooltipItem.datasetIndex].label;
|
|
167
|
+
// let value = data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
|
|
168
|
+
return [data.labels[tooltipItem.index]
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
};
|
|
174
|
+
this.TotAvgObj = {};
|
|
175
|
+
this.anaSttLbl = [];
|
|
176
|
+
}
|
|
177
|
+
lpad(lStr, ln) {
|
|
178
|
+
let str = lStr;
|
|
179
|
+
while (str.length < ln) {
|
|
180
|
+
str = '0' + str;
|
|
181
|
+
}
|
|
182
|
+
return str;
|
|
183
|
+
}
|
|
184
|
+
getSearchResult() {
|
|
185
|
+
this.cObj = {};
|
|
186
|
+
this.groupBypktList = [];
|
|
187
|
+
this._spinnerService.show();
|
|
188
|
+
this.pkts = [];
|
|
189
|
+
this.grp = [];
|
|
190
|
+
this.headerKey = [];
|
|
191
|
+
this.legendList = [];
|
|
192
|
+
this.viewdisType = "group";
|
|
193
|
+
let reqObj = {};
|
|
194
|
+
this.formname = this.route.snapshot.params['frmnme'];
|
|
195
|
+
reqObj['searchIdnList'] = localStorage.getItem('srcIdns').split(',');
|
|
196
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme'];
|
|
197
|
+
console.log(JSON.stringify(reqObj));
|
|
198
|
+
this.startIndex = 0;
|
|
199
|
+
this.endIndex = 30;
|
|
200
|
+
this.loadResult = [];
|
|
201
|
+
this.bis.data(reqObj, 'search', 'marketing/search')
|
|
202
|
+
.subscribe(data => {
|
|
203
|
+
if (data.status == 'SUCCESS') {
|
|
204
|
+
let res = data.result;
|
|
205
|
+
console.log("res", res);
|
|
206
|
+
this.pageDefination = res.pageDefination || {};
|
|
207
|
+
this.links = this.pageDefination.link || [];
|
|
208
|
+
this.pkts = res.searchResultDtl || [];
|
|
209
|
+
this.anaAllGrpStt = Array.from(new Set(this.pkts.map(element => element.dsp_stt)));
|
|
210
|
+
this.resultlength = this.pkts.length;
|
|
211
|
+
this.coPuattributeStr = res.copuStructureDtl || [];
|
|
212
|
+
this.headerKey = res.resultView;
|
|
213
|
+
this.header = res.resultViewDtl;
|
|
214
|
+
this.legendList = res.legendList;
|
|
215
|
+
this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
216
|
+
let rapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.rap_vlu), 0));
|
|
217
|
+
let totAmt = 0;
|
|
218
|
+
this.pkts.forEach(element => {
|
|
219
|
+
if (element.grp_stt == 'sold') {
|
|
220
|
+
totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
this.totAmt = this.cs.splitToTwoDecimal(totAmt);
|
|
227
|
+
this.totAvg = this.cs.splitToTwoDecimal(this.totAmt / this.totalWeight);
|
|
228
|
+
this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(rapVal)) - 100);
|
|
229
|
+
if (this.endIndex > this.resultlength)
|
|
230
|
+
this.endIndex = this.resultlength;
|
|
231
|
+
this.addItems();
|
|
232
|
+
debugger;
|
|
233
|
+
// this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
|
|
234
|
+
// this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
|
|
235
|
+
this.getSummary(this.pkts);
|
|
236
|
+
// this.createGrp(this.pkts, this.defaultGrpList);
|
|
237
|
+
// localStorage.setItem('BI-PKT_GROUP_BY',JSON.stringify(res.pageDefination.form_field[0].lov_qry))
|
|
238
|
+
// let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY'));
|
|
239
|
+
this.getStaticKV(res.pageDefination.form_field[0].lov_qry);
|
|
240
|
+
let avgFields = res.pageDefination.tabs[0].lov_qry.split(',');
|
|
241
|
+
this.getTotals(avgFields, this.pkts);
|
|
242
|
+
let ttlFields = res.pageDefination.others[0].lov_qry.split(',');
|
|
243
|
+
this.getTotalsTtl(ttlFields, this.pkts);
|
|
244
|
+
this._spinnerService.hide();
|
|
245
|
+
}
|
|
246
|
+
else {
|
|
247
|
+
this._spinnerService.hide();
|
|
248
|
+
this.toastr.error(data.message);
|
|
249
|
+
}
|
|
250
|
+
}, error => {
|
|
251
|
+
this._spinnerService.hide();
|
|
252
|
+
this.toastr.error(error);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
selectRow(pktId) {
|
|
256
|
+
var checkboxId = "cb_" + pktId;
|
|
257
|
+
document.getElementById(checkboxId).click();
|
|
258
|
+
}
|
|
259
|
+
checkedRow(obj, stockidn, status) {
|
|
260
|
+
let cbId = 'cb_' + obj.stock_idn;
|
|
261
|
+
if (status == false) {
|
|
262
|
+
var element = document.getElementById(cbId); //pktId
|
|
263
|
+
element.parentElement.parentElement.classList.remove("selectedRow");
|
|
264
|
+
element.parentElement.parentElement.classList.add("notselectedRow");
|
|
265
|
+
this.selectedItm.forEach((e, index) => {
|
|
266
|
+
if (e.stock_idn == stockidn) {
|
|
267
|
+
this.selectedItm.splice(index, 1);
|
|
268
|
+
}
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
else {
|
|
272
|
+
var element = document.getElementById(cbId); //pktId
|
|
273
|
+
element.parentElement.parentElement.classList.remove("notselectedRow");
|
|
274
|
+
element.parentElement.parentElement.classList.add("selectedRow");
|
|
275
|
+
this.selectedItm.push(obj);
|
|
276
|
+
}
|
|
277
|
+
this.selectwt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
278
|
+
// let totAmt = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.sal_amount, 0));
|
|
279
|
+
let totweight = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
280
|
+
let totrapVal = this.cs.splitToTwoDecimal(this.selectedItm.reduce((a, b) => +a + +b.rap_vlu, 0));
|
|
281
|
+
let totAmt = 0;
|
|
282
|
+
this.selectedItm.forEach(element => {
|
|
283
|
+
if (element.grp_stt == 'sold') {
|
|
284
|
+
totAmt += parseFloat(element['sal_rte'] || 0) * parseFloat(element['crtwt']);
|
|
285
|
+
}
|
|
286
|
+
else {
|
|
287
|
+
totAmt += parseFloat(element['rte'] || 0) * parseFloat(element['crtwt']);
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
this.selectAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
|
|
291
|
+
this.selectDis = this.cs.splitToTwoDecimal((totAmt / parseFloat(totrapVal) * 100) - 100);
|
|
292
|
+
this.selectAmt = this.cs.splitToTwoDecimal(totAmt);
|
|
293
|
+
}
|
|
294
|
+
statusWiseDisplay(e, m) {
|
|
295
|
+
debugger;
|
|
296
|
+
this.sttwise = true;
|
|
297
|
+
let gArr = [];
|
|
298
|
+
for (let key in m) {
|
|
299
|
+
if (m[key] == true) {
|
|
300
|
+
debugger;
|
|
301
|
+
let pk = this.pkts.filter(e => e.grp_stt == key);
|
|
302
|
+
gArr = gArr.concat(pk);
|
|
303
|
+
}
|
|
304
|
+
else {
|
|
305
|
+
let pk = gArr.filter(e => e.grp_stt != key);
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
debugger;
|
|
309
|
+
this.finalGrpVal[""] = gArr;
|
|
310
|
+
this.loadResult = gArr;
|
|
311
|
+
if (this.finalGrpVal[""].length > 0) {
|
|
312
|
+
this.totalWeight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
313
|
+
let totweight = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
314
|
+
let totrapVal = this.cs.splitToTwoDecimal(this.finalGrpVal[""].reduce((a, b) => +a + +b.rap_vlu, 0));
|
|
315
|
+
let totAmt = 0;
|
|
316
|
+
this.finalGrpVal[""].forEach(element => {
|
|
317
|
+
if (element.grp_stt == 'sold') {
|
|
318
|
+
totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
|
|
319
|
+
}
|
|
320
|
+
else {
|
|
321
|
+
totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
|
|
322
|
+
}
|
|
323
|
+
});
|
|
324
|
+
this.totAmt = this.cs.splitToTwoDecimal(totAmt);
|
|
325
|
+
this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
|
|
326
|
+
this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
|
|
327
|
+
}
|
|
328
|
+
// let grpBy = e.target.value;
|
|
329
|
+
// if (e.target.checked) {
|
|
330
|
+
// let pk = this.pkts.filter(e => e.grp_stt == grpBy);
|
|
331
|
+
// this.finalGrpVal[""] = pk;
|
|
332
|
+
// }
|
|
333
|
+
// else {
|
|
334
|
+
// let pk = this.pkts.filter(e => e.grp_stt !== grpBy);
|
|
335
|
+
// this.finalGrpVal[""] = pk;
|
|
336
|
+
// }
|
|
337
|
+
console.log(this.finalGrpVal);
|
|
338
|
+
}
|
|
339
|
+
OnLinkClick(lnk, pktdtl) {
|
|
340
|
+
if (lnk.form_field == 'priceupdate') {
|
|
341
|
+
this.cObj = pktdtl;
|
|
342
|
+
document.getElementById("bidMdBBtn").click();
|
|
343
|
+
}
|
|
344
|
+
}
|
|
345
|
+
calculatRteDis(objdtl, typ) {
|
|
346
|
+
debugger;
|
|
347
|
+
if (typ == 'rte') {
|
|
348
|
+
let dis = this.cs.splitToTwoDecimal(((parseFloat(objdtl.new_rte) * 100) / parseFloat(objdtl.rap_rte)) - 100);
|
|
349
|
+
objdtl["new_rap_dis"] = dis;
|
|
350
|
+
}
|
|
351
|
+
if (typ == 'dis') {
|
|
352
|
+
let rte = this.cs.splitToTwoDecimal((parseFloat(objdtl.rap_rte) * (100 + parseFloat(objdtl.new_rap_dis)) / 100));
|
|
353
|
+
objdtl["new_rte"] = rte;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
ChangesPrice() {
|
|
357
|
+
let nmeIdn = JSON.parse(localStorage.getItem('nmeIdn'));
|
|
358
|
+
let pktDataList = [];
|
|
359
|
+
let updateObj = {};
|
|
360
|
+
updateObj["id"] = this.cObj.pkt_code;
|
|
361
|
+
updateObj["issue"] = { "rte": "" };
|
|
362
|
+
updateObj["rtn"] = { "rte": this.cObj.new_rte };
|
|
363
|
+
updateObj["emp"] = {};
|
|
364
|
+
pktDataList.push(updateObj);
|
|
365
|
+
let reqObj = {};
|
|
366
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'bulkUpdateForm';
|
|
367
|
+
reqObj['attr'] = "rte";
|
|
368
|
+
reqObj['reissue'] = 'Y';
|
|
369
|
+
reqObj['empIdn'] = nmeIdn;
|
|
370
|
+
reqObj['grp'] = "bulkupdate";
|
|
371
|
+
reqObj['processName'] = "bulkMemPriceUpdate"; //'bulkPrepertiesUpdate';
|
|
372
|
+
reqObj['pktDataList'] = pktDataList;
|
|
373
|
+
console.log(JSON.stringify(reqObj));
|
|
374
|
+
this.reqheader['method'] = 'returnIssue';
|
|
375
|
+
let options = ({ headers: new HttpHeaders(this.reqheader) });
|
|
376
|
+
this.cs.load(reqObj, options, 'preMarketing/issueReturn').then((response) => {
|
|
377
|
+
if (response.status == 'SUCCESS') {
|
|
378
|
+
this.cObj.rte = this.cObj.new_rte;
|
|
379
|
+
this.cObj.rap_dis = this.cObj.new_rap_dis;
|
|
380
|
+
this.getSummary(this.pkts);
|
|
381
|
+
this.toastr.success(response.message);
|
|
382
|
+
this._spinnerService.hide();
|
|
383
|
+
}
|
|
384
|
+
else {
|
|
385
|
+
this._spinnerService.hide();
|
|
386
|
+
this.toastr.error(response.message);
|
|
387
|
+
}
|
|
388
|
+
}).catch((err) => {
|
|
389
|
+
this._spinnerService.hide();
|
|
390
|
+
this.toastr.error(err.message);
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
addItems() {
|
|
394
|
+
for (let i = this.startIndex; i < this.endIndex; i++) {
|
|
395
|
+
this.loadResult[i] = this.pkts[i];
|
|
396
|
+
}
|
|
397
|
+
this.startIndex = this.endIndex;
|
|
398
|
+
this.endIndex = this.endIndex + 30;
|
|
399
|
+
if (this.endIndex > this.resultlength) {
|
|
400
|
+
this.endIndex = this.resultlength;
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
onScrollDown() {
|
|
404
|
+
if (this.endIndex <= this.resultlength)
|
|
405
|
+
this.addItems();
|
|
406
|
+
document.getElementById("wrap").addEventListener("scroll", function () {
|
|
407
|
+
var translate = "translate(0," + this.scrollTop + "px)";
|
|
408
|
+
this.querySelector("thead").style.transform = translate;
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
createGrp(datas, selected) {
|
|
412
|
+
this._spinnerService.show();
|
|
413
|
+
this.data = [...datas];
|
|
414
|
+
// let grpvalues = "pu";
|
|
415
|
+
// let grpvaluesArr = grpvalues.split(',');
|
|
416
|
+
// let resutArr = [];
|
|
417
|
+
let grpvaluesArr = selected;
|
|
418
|
+
var final = [];
|
|
419
|
+
var output = _.groupBy(this.data, function (entry) {
|
|
420
|
+
var strs = '';
|
|
421
|
+
for (let i = 0; i < grpvaluesArr.length; i++) {
|
|
422
|
+
strs += entry[grpvaluesArr[i]] + '#';
|
|
423
|
+
}
|
|
424
|
+
return strs;
|
|
425
|
+
// return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
|
|
426
|
+
});
|
|
427
|
+
// console.log(output);
|
|
428
|
+
final.push(output);
|
|
429
|
+
console.log(final);
|
|
430
|
+
var Keys = Object.keys(final[0]);
|
|
431
|
+
console.log(Keys);
|
|
432
|
+
var Vals = Object.values(final[0]);
|
|
433
|
+
console.log(Vals);
|
|
434
|
+
let grpNamearr = [];
|
|
435
|
+
Keys.map(ele => {
|
|
436
|
+
grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
|
|
437
|
+
});
|
|
438
|
+
this.grp = grpNamearr;
|
|
439
|
+
this.GrpVals = Vals;
|
|
440
|
+
for (let i = 0; i < grpNamearr.length; i++) {
|
|
441
|
+
var grpNme = grpNamearr[i];
|
|
442
|
+
this.finalGrpVal[grpNme] = Vals[i];
|
|
443
|
+
console.log(this.finalGrpVal[grpNme]);
|
|
444
|
+
}
|
|
445
|
+
this.getTotal();
|
|
446
|
+
this.grp.sort();
|
|
447
|
+
this._spinnerService.hide();
|
|
448
|
+
}
|
|
449
|
+
onGrpSelect(selected) {
|
|
450
|
+
if (this.viewdisType == 'group')
|
|
451
|
+
this.groupPktsList(this.pkts, selected);
|
|
452
|
+
else
|
|
453
|
+
this.summaryDetails(selected);
|
|
454
|
+
}
|
|
455
|
+
groupPktsList(pkts, selected) {
|
|
456
|
+
if (selected.length == 1) {
|
|
457
|
+
let attr = selected[0];
|
|
458
|
+
// this.finalGrpVal = _.groupBy(pkts, attr);
|
|
459
|
+
//this.grp = Object.keys(this.finalGrpVal);
|
|
460
|
+
from(pkts).pipe(groupBy(x => x[attr]), mergeMap(group => group.pipe(toArray())), map(g => {
|
|
461
|
+
return {
|
|
462
|
+
value: g[0][attr],
|
|
463
|
+
pktList: g,
|
|
464
|
+
count: _.sumBy(g, 'qty_on_handint'),
|
|
465
|
+
rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
|
|
466
|
+
crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
|
|
467
|
+
vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
|
|
468
|
+
salvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
|
|
469
|
+
avg: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint') / _.sumBy(g, 'crtwtint')),
|
|
470
|
+
salavg: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint') / _.sumBy(g, 'crtwtint')),
|
|
471
|
+
dis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100),
|
|
472
|
+
saldis: this.cs.splitToTwoDecimal(((_.sumBy(g, 'sal_amountint') * 100) / (_.sumBy(g, 'rap_vlu'))) - 100)
|
|
473
|
+
};
|
|
474
|
+
}), toArray())
|
|
475
|
+
.subscribe(d => {
|
|
476
|
+
this.groupBypktList = d;
|
|
477
|
+
this.groupstartIndex = 0;
|
|
478
|
+
this.groupendIndex = this.groupBypktList.length;
|
|
479
|
+
this.groupaddItems();
|
|
480
|
+
});
|
|
481
|
+
}
|
|
482
|
+
else {
|
|
483
|
+
this.startIndex = 0;
|
|
484
|
+
this.endIndex = 30;
|
|
485
|
+
this.loadResult = [];
|
|
486
|
+
this.groupBypktList = [];
|
|
487
|
+
if (this.endIndex > this.resultlength)
|
|
488
|
+
this.endIndex = this.resultlength;
|
|
489
|
+
this.addItems();
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
groupaddItems() {
|
|
493
|
+
let pktcnt = 0;
|
|
494
|
+
for (let i = this.groupstartIndex; i < this.groupendIndex; i++) {
|
|
495
|
+
debugger;
|
|
496
|
+
this.loadgroupBypktList[i] = this.groupBypktList[i];
|
|
497
|
+
let pktlist = this.groupBypktList[i]['pktList'] || [];
|
|
498
|
+
pktcnt = pktcnt + pktlist.length;
|
|
499
|
+
if (pktcnt > 30) {
|
|
500
|
+
this.groupstartIndex = i + 1;
|
|
501
|
+
break;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
grouponScrollDown() {
|
|
506
|
+
if (this.groupstartIndex < this.groupendIndex)
|
|
507
|
+
this.groupaddItems();
|
|
508
|
+
document.getElementById("wrap").addEventListener("scroll", function () {
|
|
509
|
+
var translate = "translate(0," + this.scrollTop + "px)";
|
|
510
|
+
this.querySelector("thead").style.transform = translate;
|
|
511
|
+
});
|
|
512
|
+
}
|
|
513
|
+
summaryDetails(selected) {
|
|
514
|
+
if (selected.length == 1) {
|
|
515
|
+
this.headList = [];
|
|
516
|
+
let summaryData = [];
|
|
517
|
+
let attribue = selected[0];
|
|
518
|
+
from(this.pkts).pipe(groupBy(x => x[attribue] + "#" + x['dsp_stt']), mergeMap(group => group.pipe(toArray())), map(g => {
|
|
519
|
+
return {
|
|
520
|
+
key: g[0][attribue] + "#" + g[0]['dsp_stt'],
|
|
521
|
+
value: g[0][attribue],
|
|
522
|
+
sort: g[0][attribue + "_srt"] || 10000,
|
|
523
|
+
dspstt: g[0]['dsp_stt'],
|
|
524
|
+
count: _.sumBy(g, 'qty_on_handint'),
|
|
525
|
+
rapvlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'rap_vlu')),
|
|
526
|
+
crtwt: this.cs.splitToTwoDecimal(_.sumBy(g, 'crtwtint')),
|
|
527
|
+
vlurte: this.cs.splitToTwoDecimal(_.sumBy(g, 'amountint')),
|
|
528
|
+
vlu: this.cs.splitToTwoDecimal(_.sumBy(g, 'sal_amountint')),
|
|
529
|
+
};
|
|
530
|
+
}), toArray())
|
|
531
|
+
.subscribe(d => {
|
|
532
|
+
summaryData = d;
|
|
533
|
+
});
|
|
534
|
+
let summaryMap = {};
|
|
535
|
+
let sideList = [];
|
|
536
|
+
let headList = [];
|
|
537
|
+
summaryData.forEach(element => {
|
|
538
|
+
summaryMap[element.key] = element;
|
|
539
|
+
let value = element.value || '';
|
|
540
|
+
let dspstt = element.dspstt;
|
|
541
|
+
if ((selected == 'sal_byr' || selected == 'sal_emp') && dspstt != 'sold')
|
|
542
|
+
value = '';
|
|
543
|
+
if (value != '') {
|
|
544
|
+
if (headList.indexOf(dspstt) == -1)
|
|
545
|
+
headList.push(dspstt);
|
|
546
|
+
if (sideList.indexOf(value) == -1)
|
|
547
|
+
sideList.push(value);
|
|
548
|
+
}
|
|
549
|
+
});
|
|
550
|
+
this.summaryList = [];
|
|
551
|
+
sideList.forEach(side => {
|
|
552
|
+
let summry = {};
|
|
553
|
+
headList.forEach(head => {
|
|
554
|
+
let summryData = summaryMap[side + "#" + head] || '';
|
|
555
|
+
if (summryData != '') {
|
|
556
|
+
let stt = summryData['dspstt'];
|
|
557
|
+
let vlu = parseFloat(summryData.vlurte || 0);
|
|
558
|
+
let rapvlu = parseFloat(summryData.rapvlu || 0);
|
|
559
|
+
let crtwt = parseFloat(summryData.crtwt || 0);
|
|
560
|
+
summry['value'] = side;
|
|
561
|
+
summry['valueSort'] = summryData.sort;
|
|
562
|
+
summry['count_' + stt] = summryData.count;
|
|
563
|
+
summry['crtwt_' + stt] = summryData.crtwt;
|
|
564
|
+
summry['vlu_' + stt] = summryData.vlurte;
|
|
565
|
+
summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
|
|
566
|
+
summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
|
|
567
|
+
if (stt == 'sold') {
|
|
568
|
+
vlu = parseFloat(summryData.vlu || 0);
|
|
569
|
+
summry['vlu_' + stt] = vlu;
|
|
570
|
+
summry['avg_' + stt] = this.cs.splitToTwoDecimal(vlu / crtwt);
|
|
571
|
+
summry['dis_' + stt] = this.cs.splitToTwoDecimal(((vlu * 100) / rapvlu) - 100);
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
});
|
|
575
|
+
this.summaryList.push(summry);
|
|
576
|
+
});
|
|
577
|
+
if (selected == 'sal_byr' || selected == 'sal_emp') {
|
|
578
|
+
this.summaryList.sort((val1, val2) => {
|
|
579
|
+
return (val2['vlu_sold']) - (val1['vlu_sold']);
|
|
580
|
+
});
|
|
581
|
+
}
|
|
582
|
+
else {
|
|
583
|
+
console.log("this.summaryList", this.summaryList);
|
|
584
|
+
this.summaryList.sort((val1, val2) => {
|
|
585
|
+
return (val1['valueSort']) - (val2['valueSort']);
|
|
586
|
+
});
|
|
587
|
+
console.log("this.summaryList", this.summaryList);
|
|
588
|
+
}
|
|
589
|
+
this.headList = headList;
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
if (selected.length > 1) {
|
|
593
|
+
this.toastr.error("Summary need only one attribute");
|
|
594
|
+
}
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
exportToCSVSummary() {
|
|
598
|
+
let modifiedObjArr = [];
|
|
599
|
+
this.summaryList.forEach((data, index) => {
|
|
600
|
+
let obj = {};
|
|
601
|
+
obj["Sr. No"] = index + 1;
|
|
602
|
+
obj["Attribute"] = data.value || '';
|
|
603
|
+
this.headList.forEach(hdr => {
|
|
604
|
+
obj["Qty(" + hdr + ")"] = data["count_" + hdr] || '';
|
|
605
|
+
obj["Carat(" + hdr + ")"] = data["crtwt_" + hdr] || '';
|
|
606
|
+
obj["Avg(" + hdr + ")"] = data["avg_" + hdr] || '';
|
|
607
|
+
obj["Dis(" + hdr + ")"] = data["dis_" + hdr] || '';
|
|
608
|
+
obj["Value(" + hdr + ")"] = data["vlu_" + hdr] || '';
|
|
609
|
+
});
|
|
610
|
+
modifiedObjArr.push(obj);
|
|
611
|
+
});
|
|
612
|
+
this.cs.CSVConvertor(modifiedObjArr, "Summary_details", true);
|
|
613
|
+
}
|
|
614
|
+
getTotal() {
|
|
615
|
+
let indexVal = 0;
|
|
616
|
+
let qs = 0;
|
|
617
|
+
this.GrpVals.forEach(element => {
|
|
618
|
+
let totAmt = 0;
|
|
619
|
+
let totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
620
|
+
let rapVal = _.sumBy(element, 'rap_vlu');
|
|
621
|
+
element.forEach(pkt => {
|
|
622
|
+
if (pkt.grp_stt == 'sold') {
|
|
623
|
+
totAmt += parseFloat(pkt['sal_rte'] || 0) * parseFloat(pkt['crtwt']);
|
|
624
|
+
}
|
|
625
|
+
else {
|
|
626
|
+
totAmt += parseFloat(pkt['rte'] || 0) * parseFloat(pkt['crtwt']);
|
|
627
|
+
}
|
|
628
|
+
});
|
|
629
|
+
totAmt = this.cs.splitToTwoDecimal(totAmt);
|
|
630
|
+
var key = this.grp[indexVal];
|
|
631
|
+
this.summaryDtl[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
|
|
632
|
+
this.summaryDtl[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
|
|
633
|
+
this.summaryDtl[key + "_RTE"] = this.cs.splitToTwoDecimal(totAmt / totweight);
|
|
634
|
+
this.summaryDtl[key + "_DIS"] = this.cs.splitToTwoDecimal(((totAmt * 100) / rapVal) - 100);
|
|
635
|
+
indexVal++;
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
generatePie(Datatype, ChartType) {
|
|
639
|
+
if (ChartType == 'qty') {
|
|
640
|
+
document.getElementById('btnQty').classList.remove('btn-default');
|
|
641
|
+
document.getElementById('btnQty').classList.add('active');
|
|
642
|
+
document.getElementById('btnVal').classList.remove('active');
|
|
643
|
+
document.getElementById('btnVal').classList.add('btn-default');
|
|
644
|
+
}
|
|
645
|
+
else {
|
|
646
|
+
document.getElementById('btnVal').classList.remove('btn-default');
|
|
647
|
+
document.getElementById('btnVal').classList.add('active');
|
|
648
|
+
document.getElementById('btnQty').classList.remove('active');
|
|
649
|
+
document.getElementById('btnQty').classList.add('btn-default');
|
|
650
|
+
}
|
|
651
|
+
this.grpWiseQty = [];
|
|
652
|
+
this.byrvalGrp = [];
|
|
653
|
+
this.dataType = Datatype;
|
|
654
|
+
this._spinnerService.show();
|
|
655
|
+
this.finalGrpValPie = {};
|
|
656
|
+
this.byrvalGrp = [];
|
|
657
|
+
this.data = [...this.pkts];
|
|
658
|
+
this.data = this.data.filter(x => x.grp_stt == 'sold');
|
|
659
|
+
let grpvalues;
|
|
660
|
+
let grpvaluesArr;
|
|
661
|
+
let resutArr = [];
|
|
662
|
+
// type = 'qty';
|
|
663
|
+
if (Datatype == 'buyer') {
|
|
664
|
+
this.type = "Buyer";
|
|
665
|
+
this.isBuyerwise = true;
|
|
666
|
+
this.isGrpwise = false;
|
|
667
|
+
grpvalues = "sal_byr";
|
|
668
|
+
grpvaluesArr = grpvalues.split(',');
|
|
669
|
+
resutArr = [];
|
|
670
|
+
}
|
|
671
|
+
else {
|
|
672
|
+
this.type = this.defaultGrpList;
|
|
673
|
+
this.isBuyerwise = false;
|
|
674
|
+
this.isGrpwise = true;
|
|
675
|
+
grpvaluesArr = this.defaultGrpList; //selected;
|
|
676
|
+
}
|
|
677
|
+
//let grpvaluesArr = selected;
|
|
678
|
+
var final = [];
|
|
679
|
+
var output = _.groupBy(this.data, function (entry) {
|
|
680
|
+
var strs = '';
|
|
681
|
+
for (let i = 0; i < grpvaluesArr.length; i++) {
|
|
682
|
+
strs += entry[grpvaluesArr[i]] + '#';
|
|
683
|
+
}
|
|
684
|
+
return strs;
|
|
685
|
+
// return entry[grpvaluesArr[0]] + '#' + entry[grpvaluesArr[1]];// + '#' + entry.pu;
|
|
686
|
+
});
|
|
687
|
+
// console.log(output);
|
|
688
|
+
final.push(output);
|
|
689
|
+
var Keys = Object.keys(final[0]);
|
|
690
|
+
var Vals = Object.values(final[0]);
|
|
691
|
+
let grpNamearr = [];
|
|
692
|
+
Keys.map(ele => {
|
|
693
|
+
grpNamearr.push(ele.split('#').filter(e => e != undefined).join(' / '));
|
|
694
|
+
});
|
|
695
|
+
this.grpPie = grpNamearr;
|
|
696
|
+
this.GrpValsPie = Vals;
|
|
697
|
+
for (let i = 0; i < grpNamearr.length; i++) {
|
|
698
|
+
var grpNme = grpNamearr[i];
|
|
699
|
+
this.finalGrpValPie[grpNme] = Vals[i];
|
|
700
|
+
let totAmt = this.cs.splitToTwoDecimal(this.finalGrpValPie[grpNme].reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
|
|
701
|
+
let byrObj = {};
|
|
702
|
+
byrObj['k'] = grpNme;
|
|
703
|
+
byrObj['v'] = parseFloat(totAmt); //this.byrvalGrp[grpNme].length;
|
|
704
|
+
this.byrvalGrp.push(byrObj);
|
|
705
|
+
byrObj = {};
|
|
706
|
+
// this.byrvalGrp[grpNme] = totAmt;
|
|
707
|
+
let qtyObj = {};
|
|
708
|
+
qtyObj['k'] = grpNme;
|
|
709
|
+
qtyObj['v'] = this.finalGrpValPie[grpNme].length;
|
|
710
|
+
this.grpWiseQty.push(qtyObj);
|
|
711
|
+
qtyObj = {};
|
|
712
|
+
// this.grpWiseQty[grpNme] = this.finalGrpValPie[grpNme].length;
|
|
713
|
+
}
|
|
714
|
+
console.log(this.grpWiseQty);
|
|
715
|
+
if (ChartType == 'qty') {
|
|
716
|
+
this.drawPie(this.grpWiseQty, ChartType, Datatype);
|
|
717
|
+
}
|
|
718
|
+
else {
|
|
719
|
+
this.drawPie(this.byrvalGrp, ChartType, Datatype);
|
|
720
|
+
}
|
|
721
|
+
// this.getTotalPie();
|
|
722
|
+
// this.grpPie.sort();
|
|
723
|
+
}
|
|
724
|
+
generate() {
|
|
725
|
+
this.dynamicColors = [];
|
|
726
|
+
for (var i = 1; i < 7; i++) {
|
|
727
|
+
// this.LightenDarkenColor("7cb5ec", i * 10);
|
|
728
|
+
let col = 'c6e896';
|
|
729
|
+
let amt = (i * 20) * -1;
|
|
730
|
+
var usePound = false;
|
|
731
|
+
if (col[0] == "#") {
|
|
732
|
+
col = col.slice(1);
|
|
733
|
+
usePound = true;
|
|
734
|
+
}
|
|
735
|
+
var num = parseInt(col, 16);
|
|
736
|
+
var r = (num >> 16) + amt;
|
|
737
|
+
if (r > 255)
|
|
738
|
+
r = 255;
|
|
739
|
+
else if (r < 0)
|
|
740
|
+
r = 0;
|
|
741
|
+
var b = ((num >> 8) & 0x00FF) + amt;
|
|
742
|
+
if (b > 255)
|
|
743
|
+
b = 255;
|
|
744
|
+
else if (b < 0)
|
|
745
|
+
b = 0;
|
|
746
|
+
var g = (num & 0x0000FF) + amt;
|
|
747
|
+
if (g > 255)
|
|
748
|
+
g = 255;
|
|
749
|
+
else if (g < 0)
|
|
750
|
+
g = 0;
|
|
751
|
+
// return (usePound ? "#" : "") + (g | (b << 8) | (r << 16)).toString(16);
|
|
752
|
+
this.dynamicColors.push((usePound ? "#" : "#") + (g | (b << 8) | (r << 16)).toString(16));
|
|
753
|
+
}
|
|
754
|
+
console.log(this.dynamicColors);
|
|
755
|
+
return this.dynamicColors;
|
|
756
|
+
}
|
|
757
|
+
getTotalPie() {
|
|
758
|
+
let indexVal = 0;
|
|
759
|
+
let AmtArr = [];
|
|
760
|
+
this.GrpValsPie.forEach(element => {
|
|
761
|
+
let byrwiseVal = {};
|
|
762
|
+
let totAmt = 0;
|
|
763
|
+
let totweight = 0;
|
|
764
|
+
totweight = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
765
|
+
totAmt = this.cs.splitToTwoDecimal(element.reduce((a, b) => +a + +parseFloat(b.sal_amountint), 0));
|
|
766
|
+
AmtArr.push(totAmt);
|
|
767
|
+
var key = this.grp[indexVal];
|
|
768
|
+
// this.summaryDtl[key + "_QTY"] = this.cs.splitToTwoDecimal(qty);
|
|
769
|
+
this.summaryDtlPie[key + "_CTS"] = this.cs.splitToTwoDecimal(totweight);
|
|
770
|
+
this.summaryDtlPie[key + "_AMT"] = this.cs.splitToTwoDecimal(totAmt);
|
|
771
|
+
indexVal++;
|
|
772
|
+
if (indexVal == 1) {
|
|
773
|
+
byrwiseVal[this.grp[indexVal]] = totAmt;
|
|
774
|
+
this.byrValArr.push(byrwiseVal);
|
|
775
|
+
byrwiseVal = {};
|
|
776
|
+
}
|
|
777
|
+
// console.log(qs);
|
|
778
|
+
// console.log(amount);
|
|
779
|
+
});
|
|
780
|
+
console.log(this.byrValArr);
|
|
781
|
+
AmtArr = AmtArr.map(function (x) {
|
|
782
|
+
return parseFloat(x);
|
|
783
|
+
});
|
|
784
|
+
AmtArr.sort(function (a, b) { return a - b; });
|
|
785
|
+
console.log(AmtArr);
|
|
786
|
+
AmtArr.reverse();
|
|
787
|
+
// this.drawPie(AmtArr);
|
|
788
|
+
}
|
|
789
|
+
drawPie(salesData, type, ChartType) {
|
|
790
|
+
this.doughnutChartData = [];
|
|
791
|
+
this.doughnutChartLabels = [];
|
|
792
|
+
let AmtArr = salesData.sort((a, b) => (a.v > b.v) ? 1 : -1).reverse();
|
|
793
|
+
if (ChartType == "buyer") {
|
|
794
|
+
this.doughnutChartData = AmtArr.slice(0, 5).map(a => a.v);
|
|
795
|
+
this.doughnutChartLabels = AmtArr.slice(0, 5).map(a => a.k);
|
|
796
|
+
let sums = 0;
|
|
797
|
+
let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
|
|
798
|
+
if (type == 'qty')
|
|
799
|
+
otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('count'));
|
|
800
|
+
let tArr = [];
|
|
801
|
+
tArr = AmtArr.slice(0, 5).map(function (x) {
|
|
802
|
+
return parseFloat(x.v);
|
|
803
|
+
});
|
|
804
|
+
sums = _.sumBy(tArr);
|
|
805
|
+
let maxinArr = Math.max(Math.max(...this.doughnutChartData));
|
|
806
|
+
debugger;
|
|
807
|
+
let otherval = this.cs.splitToTwoDecimal(otherSum - sums) || 0;
|
|
808
|
+
if (maxinArr > otherval) {
|
|
809
|
+
this.doughnutChartData.push(otherval);
|
|
810
|
+
this.doughnutChartLabels.push('Other');
|
|
811
|
+
}
|
|
812
|
+
else {
|
|
813
|
+
this.doughnutChartData.unshift(otherval);
|
|
814
|
+
this.doughnutChartLabels.unshift('Other');
|
|
815
|
+
}
|
|
816
|
+
}
|
|
817
|
+
else {
|
|
818
|
+
this.doughnutChartData = AmtArr.map(a => a.v);
|
|
819
|
+
this.doughnutChartLabels = AmtArr.map(a => a.k);
|
|
820
|
+
console.log("this.doughnutChartData", this.doughnutChartData);
|
|
821
|
+
let sums = 0;
|
|
822
|
+
let otherSum = this.cs.splitToTwoDecimal(this.sttWiseSummary.get('sold').get('rate'));
|
|
823
|
+
sums = _.sumBy(Object.values(AmtArr), 'v');
|
|
824
|
+
}
|
|
825
|
+
// this.doughnutChartData.sort(function (a, b) { return a - b; });
|
|
826
|
+
// this.doughnutChartData = this.doughnutChartData.reverse();
|
|
827
|
+
for (let i = 0; i < this.doughnutChartLabels.length; i++) {
|
|
828
|
+
this.doughnutChartLabels[i] = this.doughnutChartLabels[i] + " " + this.doughnutChartData[i].toString();
|
|
829
|
+
}
|
|
830
|
+
// console.log(this.doughnutChartLabels);
|
|
831
|
+
this.refreshChart(ChartType);
|
|
832
|
+
this.doughnutChartType = 'pie';
|
|
833
|
+
// document.getElementById('PiechartModelBtn').click();
|
|
834
|
+
this._spinnerService.hide();
|
|
835
|
+
}
|
|
836
|
+
refreshChart(ChartType) {
|
|
837
|
+
this.isBuyerwise = false;
|
|
838
|
+
this.isGrpwise = false;
|
|
839
|
+
setTimeout(() => {
|
|
840
|
+
if (ChartType == "buyer") {
|
|
841
|
+
this.isBuyerwise = true;
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
this.isGrpwise = true;
|
|
845
|
+
}
|
|
846
|
+
}, 1);
|
|
847
|
+
}
|
|
848
|
+
sortBy(key, g) {
|
|
849
|
+
this.sorted = this.sorted == 'desc' ? 'asc' : 'desc';
|
|
850
|
+
console.log(this.sorted);
|
|
851
|
+
let srted = _.orderBy(this.finalGrpVal[g], key, [this.sorted]);
|
|
852
|
+
this.finalGrpVal[g] = srted;
|
|
853
|
+
this.sortOn = g;
|
|
854
|
+
this.clmn = key;
|
|
855
|
+
}
|
|
856
|
+
exportToCSV(FileName) {
|
|
857
|
+
let d = this.cs.cDate, month = '' + (d.getMonth() + 1), day = '' + d.getDate(), year = d.getFullYear();
|
|
858
|
+
let dt = [day, month, year].join('-');
|
|
859
|
+
let fileNme = FileName + '__' + dt;
|
|
860
|
+
this.headerKey = ["dsp_stt", ...this.headerKey];
|
|
861
|
+
let modifiedObjArr = this.cs.modifyDataByHeader(this.pkts, this.headerKey, this.header);
|
|
862
|
+
this.cs.CSVConvertor(modifiedObjArr, fileNme, true);
|
|
863
|
+
}
|
|
864
|
+
getSummary(p) {
|
|
865
|
+
let summary;
|
|
866
|
+
p.forEach(element => {
|
|
867
|
+
// let stt = '';
|
|
868
|
+
// if (element.grp_stt == 'sold') {
|
|
869
|
+
// stt = 'Sold';
|
|
870
|
+
// }
|
|
871
|
+
// else if (element.grp_stt == 'mkt') {
|
|
872
|
+
// stt = 'Marketing';
|
|
873
|
+
// }
|
|
874
|
+
// else if (element.grp_stt == 'lab') {
|
|
875
|
+
// stt = 'Lab';
|
|
876
|
+
// }
|
|
877
|
+
// else {
|
|
878
|
+
// stt = element.grp_stt;
|
|
879
|
+
// }
|
|
880
|
+
// summary = this.sttWiseSummary.get(element.grp_stt);
|
|
881
|
+
summary = this.sttWiseSummary.get(element.grp_stt); //stt
|
|
882
|
+
let count = 0;
|
|
883
|
+
let gridWt = 0;
|
|
884
|
+
let gridavg = 0;
|
|
885
|
+
let disc = 0;
|
|
886
|
+
let gridRate = 0;
|
|
887
|
+
let totAmt = 0;
|
|
888
|
+
let gridRap = 0;
|
|
889
|
+
// this.totAvg = this.cs.splitToTwoDecimal(parseFloat(totAmt) / parseFloat(totweight));
|
|
890
|
+
// this.totDis = this.cs.splitToTwoDecimal(((parseFloat(totAmt) * 100) / parseFloat(totrapVal)) - 100);
|
|
891
|
+
let wt = parseFloat(element.crtwt);
|
|
892
|
+
let rate = 0;
|
|
893
|
+
let rapval = parseFloat(element.rap_vlu);
|
|
894
|
+
if (element.grp_stt == 'sold') {
|
|
895
|
+
rate = parseFloat((element.sal_rte == undefined || element.sal_rte == "") ? element.rte : element.sal_rte) * parseFloat(element.crtwt);
|
|
896
|
+
}
|
|
897
|
+
else {
|
|
898
|
+
rate = parseFloat(element.rte) * parseFloat(element.crtwt);
|
|
899
|
+
}
|
|
900
|
+
if (summary != null) {
|
|
901
|
+
count = parseInt(summary.get('count'));
|
|
902
|
+
gridWt = parseFloat(summary.get('wt'));
|
|
903
|
+
gridRate = parseFloat(summary.get('rate'));
|
|
904
|
+
gridRap = parseFloat(summary.get('rap'));
|
|
905
|
+
}
|
|
906
|
+
else {
|
|
907
|
+
summary = new Map();
|
|
908
|
+
}
|
|
909
|
+
summary.set('count', count + 1);
|
|
910
|
+
summary.set('wt', gridWt + wt);
|
|
911
|
+
summary.set('rate', gridRate + rate);
|
|
912
|
+
summary.set('rap', gridRap + rapval);
|
|
913
|
+
// this.sttWiseSummary.set(element.grp_stt == 'sold' ? 'Sold' : element.grp_stt, summary);
|
|
914
|
+
this.sttWiseSummary.set(element.grp_stt, summary); //stt
|
|
915
|
+
});
|
|
916
|
+
console.log('@presum:', this.sttWiseSummary);
|
|
917
|
+
this.anaAllGrpStt.forEach(ele => {
|
|
918
|
+
console.log(ele);
|
|
919
|
+
let count = 0;
|
|
920
|
+
let gridWt = 0;
|
|
921
|
+
let gridavg = 0;
|
|
922
|
+
let disc = 0;
|
|
923
|
+
let gridRate = 0;
|
|
924
|
+
let totAmt = 0;
|
|
925
|
+
let rap = 0;
|
|
926
|
+
let gridRap = 0;
|
|
927
|
+
//if (ele == 'Marketing' || ele == 'Sold') {
|
|
928
|
+
// ele = (ele == 'Marketing' || ele == 'Sold') ? ele : ele.toLowerCase();
|
|
929
|
+
let summary = this.sttWiseSummary.get(ele) || new Map();
|
|
930
|
+
count = parseInt(summary.get('count')) || 0;
|
|
931
|
+
gridWt = parseFloat(summary.get('wt')) || 0.00;
|
|
932
|
+
gridRate = parseFloat(summary.get('rate')) || 0;
|
|
933
|
+
gridRap = parseFloat(summary.get('rap')) || 1;
|
|
934
|
+
disc = this.cs.splitToTwoDecimal(((gridRate * 100) / gridRap) - 100);
|
|
935
|
+
gridavg = this.cs.splitToTwoDecimal(gridRate / gridWt);
|
|
936
|
+
summary.set('disc', disc);
|
|
937
|
+
summary.set('avg', gridavg);
|
|
938
|
+
this.sttWiseSummary.set(ele, summary);
|
|
939
|
+
//}
|
|
940
|
+
});
|
|
941
|
+
console.log(this.sttWiseSummary);
|
|
942
|
+
}
|
|
943
|
+
getTotals(fields, pkts) {
|
|
944
|
+
debugger;
|
|
945
|
+
fields.forEach(element => {
|
|
946
|
+
debugger;
|
|
947
|
+
let tavg = 0;
|
|
948
|
+
let total = 0;
|
|
949
|
+
if (element.trim() == 'age') {
|
|
950
|
+
total = this.cs.splitToTwoDecimal(pkts.reduce((a, b) => +a + +b.age, 0));
|
|
951
|
+
}
|
|
952
|
+
else {
|
|
953
|
+
total = _.sumBy(pkts, item => Number(item[element.trim()]));
|
|
954
|
+
}
|
|
955
|
+
let zeroVals = pkts.filter(x => (x[element.trim()] === "0" || 0)).length;
|
|
956
|
+
if (element.trim() != 'age') {
|
|
957
|
+
tavg = total / _.sumBy(pkts, item => Number(item['crtwt']));
|
|
958
|
+
tavg = this.cs.numbertofixed(tavg, 2);
|
|
959
|
+
}
|
|
960
|
+
else {
|
|
961
|
+
tavg = total / pkts.length;
|
|
962
|
+
}
|
|
963
|
+
this.TotAvgObj[element.trim()] = tavg;
|
|
964
|
+
});
|
|
965
|
+
console.log(this.TotAvgObj);
|
|
966
|
+
}
|
|
967
|
+
getTotalsTtl(fields, pkts) {
|
|
968
|
+
debugger;
|
|
969
|
+
fields.forEach(element => {
|
|
970
|
+
debugger;
|
|
971
|
+
let total = 0;
|
|
972
|
+
total = _.sumBy(pkts, item => Number(item[element.trim()]));
|
|
973
|
+
this.TotAvgObj[element.trim()] = this.cs.numbertofixed(total, 2);
|
|
974
|
+
});
|
|
975
|
+
}
|
|
976
|
+
modifySearch() {
|
|
977
|
+
localStorage.setItem('BIcall', 'BImodify');
|
|
978
|
+
this.router.navigate([this.modulename + '/analysis-search/' + this.route.snapshot.params['frmnme']]);
|
|
979
|
+
}
|
|
980
|
+
ngOnInit() {
|
|
981
|
+
// this.LightenDarkenColor("7cb5ec", 10);
|
|
982
|
+
let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
|
|
983
|
+
this.cObj = {};
|
|
984
|
+
this.cUrl = this.router.url;
|
|
985
|
+
this.reqheader = {
|
|
986
|
+
'clientkey': Cookie.get('_ck'),
|
|
987
|
+
'Content-Type': 'application/json',
|
|
988
|
+
'modulekey': mdlk[this.cUrl.split('/')[1]],
|
|
989
|
+
'loginid': Cookie.get('_logid'),
|
|
990
|
+
'source': 'qs'
|
|
991
|
+
};
|
|
992
|
+
this.viewdisType = "group";
|
|
993
|
+
this.newwindow = "YES";
|
|
994
|
+
this.grp = [];
|
|
995
|
+
this.loadResult = [];
|
|
996
|
+
this.startIndex = 0;
|
|
997
|
+
this.endIndex = 30;
|
|
998
|
+
this.cUrl = this.router.url;
|
|
999
|
+
this.modulename = this.cUrl.split('/')[1];
|
|
1000
|
+
this.ck = encodeURIComponent(Cookie.get('_ck'));
|
|
1001
|
+
this.route.params.subscribe(map => {
|
|
1002
|
+
this.loadDefination();
|
|
1003
|
+
let viewType = localStorage.getItem('viewType');
|
|
1004
|
+
let anaArr = JSON.parse(localStorage.getItem('BIanaStt'));
|
|
1005
|
+
let anasttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
|
|
1006
|
+
if (anaArr != null) {
|
|
1007
|
+
this.anaAllGrpStt = JSON.parse(localStorage.getItem('BIanaStt'));
|
|
1008
|
+
this.anaSttLbl = JSON.parse(localStorage.getItem('BIanaSttLBL'));
|
|
1009
|
+
this.anaAllGrpStt.forEach(element => {
|
|
1010
|
+
this.stObj[element] = true;
|
|
1011
|
+
});
|
|
1012
|
+
}
|
|
1013
|
+
if (viewType == 'listView') {
|
|
1014
|
+
this.getSearchResult();
|
|
1015
|
+
}
|
|
1016
|
+
else {
|
|
1017
|
+
let pkts = JSON.parse(localStorage.getItem('pktData'));
|
|
1018
|
+
this.headerKey = JSON.parse(localStorage.getItem('resultView'));
|
|
1019
|
+
this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
|
|
1020
|
+
this.header = JSON.parse(localStorage.getItem('resultViewDtl'));
|
|
1021
|
+
let legends = JSON.parse(localStorage.getItem('BILegends'));
|
|
1022
|
+
if (legends != null && legends != undefined && legends != "") {
|
|
1023
|
+
this.legendList = legends;
|
|
1024
|
+
}
|
|
1025
|
+
this.pkts = [...pkts];
|
|
1026
|
+
this.totalWeight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
1027
|
+
this.getSummary(this.pkts);
|
|
1028
|
+
// let totAmt = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.sal_rec_rte * parseFloat(b.crtwt), 0));
|
|
1029
|
+
let totweight = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +parseFloat(b.crtwt), 0));
|
|
1030
|
+
let totrapVal = this.cs.splitToTwoDecimal(this.pkts.reduce((a, b) => +a + +b.rap_vlu, 0));
|
|
1031
|
+
let totAmt = 0;
|
|
1032
|
+
this.pkts.forEach(element => {
|
|
1033
|
+
if (element.grp_stt == 'sold') {
|
|
1034
|
+
totAmt += parseFloat(element['sal_rte']) * parseFloat(element['crtwt']);
|
|
1035
|
+
}
|
|
1036
|
+
else {
|
|
1037
|
+
totAmt += parseFloat(element['rte']) * parseFloat(element['crtwt']);
|
|
1038
|
+
}
|
|
1039
|
+
});
|
|
1040
|
+
this.totAvg = this.cs.splitToTwoDecimal(totAmt / parseFloat(totweight));
|
|
1041
|
+
this.totDis = this.cs.splitToTwoDecimal(((totAmt * 100) / parseFloat(totrapVal)) - 100);
|
|
1042
|
+
this.resultlength = this.pkts.length;
|
|
1043
|
+
if (this.endIndex > this.resultlength)
|
|
1044
|
+
this.endIndex = this.resultlength;
|
|
1045
|
+
this.addItems();
|
|
1046
|
+
}
|
|
1047
|
+
});
|
|
1048
|
+
let GRPby = JSON.parse(localStorage.getItem('BI-PKT_GROUP_BY')) || '';
|
|
1049
|
+
this.getStaticKV(GRPby);
|
|
1050
|
+
// this.createGrp(this.pkts, this.defaultGrpList);
|
|
1051
|
+
let avgFields = JSON.parse(localStorage.getItem('BI-gridAvg')) || '';
|
|
1052
|
+
if (avgFields != '')
|
|
1053
|
+
this.getTotals(avgFields, this.pkts);
|
|
1054
|
+
}
|
|
1055
|
+
getStaticKV(qry) {
|
|
1056
|
+
this.staticLov = [];
|
|
1057
|
+
let arrkv = qry.split(',');
|
|
1058
|
+
let obj = {}, staticLov = [];
|
|
1059
|
+
for (let i = 0; i < arrkv.length; i += 2) {
|
|
1060
|
+
let key = arrkv[i], value = arrkv[i + 1];
|
|
1061
|
+
obj['k'] = key;
|
|
1062
|
+
obj['v'] = value;
|
|
1063
|
+
// if (i == 0) {
|
|
1064
|
+
// qry.default_value = value;//key
|
|
1065
|
+
// }
|
|
1066
|
+
this.staticLov.push(obj);
|
|
1067
|
+
obj = {};
|
|
1068
|
+
}
|
|
1069
|
+
this.staticLov = this.staticLov.map(option => ({
|
|
1070
|
+
value: option.v,
|
|
1071
|
+
label: option.k
|
|
1072
|
+
}));
|
|
1073
|
+
console.log(this.staticLov);
|
|
1074
|
+
}
|
|
1075
|
+
loadDefination() {
|
|
1076
|
+
this._spinnerService.show();
|
|
1077
|
+
let reqObj = {};
|
|
1078
|
+
reqObj['formNme'] = this.route.snapshot.params['frmnme']; //'searchDtlDscrForm';
|
|
1079
|
+
this.reqheader['method'] = 'loadDefination';
|
|
1080
|
+
let options = ({ headers: new HttpHeaders(this.reqheader) });
|
|
1081
|
+
this.cs.load(reqObj, options, 'marketing/search').then((response) => {
|
|
1082
|
+
if (response.status == 'SUCCESS') {
|
|
1083
|
+
let result = response.result;
|
|
1084
|
+
this.pageDefination = result.pageDefination || {};
|
|
1085
|
+
this.links = this.pageDefination.link || [];
|
|
1086
|
+
this._spinnerService.hide();
|
|
1087
|
+
}
|
|
1088
|
+
else {
|
|
1089
|
+
this._spinnerService.hide();
|
|
1090
|
+
this.toastr.error(response.message);
|
|
1091
|
+
}
|
|
1092
|
+
}).catch((err) => {
|
|
1093
|
+
this._spinnerService.hide();
|
|
1094
|
+
this.toastr.error(err.message);
|
|
1095
|
+
});
|
|
1096
|
+
}
|
|
1097
|
+
}
|
|
1098
|
+
/** @nocollapse */ /** @nocollapse */ PktDataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PktDataComponent, deps: [{ token: i1.CommanServiceService }, { token: i2.BiService }, { token: i3.NgxSpinnerService }, { token: i4.ToastrService }, { token: i5.Router }, { token: i5.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
|
|
1099
|
+
/** @nocollapse */ /** @nocollapse */ PktDataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: PktDataComponent, selector: "app-pkt-data", viewQueries: [{ propertyName: "chart", first: true, predicate: BaseChartDirective, descendants: true }], ngImport: i0, template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span> Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} \r\n Qty : {{groupdtl['count']}} Carats :\r\n {{groupdtl['crtwt']}}\r\n Avg :{{groupdtl['salavg']}}\r\n Dis% : {{groupdtl['saldis']}}\r\n\r\n Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} \r\n Qty : {{finalGrpVal[g].length}} Carats :\r\n {{totalWeight}}\r\n\r\n Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n \r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}} </td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> | Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}} </td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\"> </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"], components: [{ type: i6.SelectComponent, selector: "ng-select", inputs: ["options", "allowClear", "disabled", "multiple", "noFilter", "notFoundMsg", "placeholder", "filterPlaceholder", "label", "highlightColor", "highlightTextColor"], outputs: ["opened", "closed", "selected", "deselected", "focus", "blur", "noOptionsFound", "filterInputChanged"] }], directives: [{ type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i8.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i8.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i8.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i8.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { type: i8.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i8.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i8.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i8.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i8.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { type: i8.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i9.InfiniteScrollDirective, selector: "[infiniteScroll], [infinite-scroll], [data-infinite-scroll]", inputs: ["infiniteScrollDistance", "infiniteScrollUpDistance", "infiniteScrollThrottle", "infiniteScrollDisabled", "infiniteScrollContainer", "scrollWindow", "immediateCheck", "horizontal", "alwaysCallback", "fromRoot"], outputs: ["scrolled", "scrolledUp"] }, { type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i10.BaseChartDirective, selector: "canvas[baseChart]", inputs: ["options", "data", "datasets", "labels", "chartType", "colors", "legend", "plugins"], outputs: ["chartClick", "chartHover"], exportAs: ["base-chart"] }, { type: i11.AppNoDblClickDirective, selector: "[appAppNoDblClick]" }], pipes: { "date": i7.DatePipe, "tableSearch": i12.TableSearchPipe } });
|
|
1100
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: PktDataComponent, decorators: [{
|
|
1101
|
+
type: Component,
|
|
1102
|
+
args: [{ selector: 'app-pkt-data', template: "<div class=\"mt\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-heading\">\r\n <h3 class=\"panel-title\">\r\n <span class=\"fa fa-chevron-left cp\" (click)=\"cs.pageBck();\"> Back</span> Packet List\r\n <span class=\"f-12\">({{cs.cDate | date: 'medium'}})</span>\r\n </h3>\r\n </div>\r\n </div>\r\n <div class=\"content-frame\">\r\n <div class=\"innerD\">\r\n <div class=\"content-frame-left\" *ngIf=\"false\">\r\n <div class=\"panel panel-default\">\r\n <div class=\"panel-body\">\r\n <!-- <div class=\"list-group border-bottom\">\r\n <a href=\"javascript:void(0)\" class=\"list-group-item\" [ngClass]=\"{'active' :i == cLink}\" *ngFor=\"let nav of navigation;let i=index\"\r\n (click)=\"navigationFun(nav,i);\">{{nav.form_field_title}} </a>\r\n </div> -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"content-frame-body\" style=\"margin-left:0\">\r\n <div class=\"panel panel-default custom-panel\">\r\n <div class=\"panel-body\" style=\"padding:0;\">\r\n <div class=\"infoSec\">\r\n <div class=\"row\">\r\n <div class=\"col-sm-6\">\r\n <form class=\"form-inline pull-left\">\r\n </form>\r\n </div>\r\n <div class=\"col-sm-6\">\r\n <div class=\"dropdown text-right\">\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\">\r\n <div class=\"\" style=\"margin-bottom: 10px;\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr>\r\n <th>Status</th>\r\n <th>Count</th>\r\n <th>Cts</th>\r\n <th>Avg</th>\r\n <th *ngIf=\"formname!='mixAnalysisReportForm'\">Disc</th>\r\n <th>Amount</th>\r\n\r\n </thead>\r\n <tbody>\r\n <ng-container *ngFor=\"let st of anaAllGrpStt;let i = index;\">\r\n <tr>\r\n <td>\r\n <!-- <label for=\"{{st}}\" class=\"text-capitalize\">S</label> -->\r\n <!-- *ngIf=\"defaultGrpList.length==0\" -->\r\n <input *ngIf=\"defaultGrpList.length==0\" type=\"checkbox\" id=\"{{st}}\" value=\"{{st}}\"\r\n name=\"{{st}}\" [(ngModel)]=\"stObj[st]\" [checked]=\"true\"\r\n (change)=\"statusWiseDisplay($event,stObj)\" />\r\n {{anaSttLbl[i]||st}}\r\n </td>\r\n <!-- anaSttLbl -->\r\n <td> {{sttWiseSummary?.get(st)?.get('count')}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('wt'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('avg'))}}</td>\r\n <td *ngIf=\"formname!='mixAnalysisReportForm'\"> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('disc'))}}</td>\r\n <td> {{this.cs.splitToTwoDecimal(sttWiseSummary?.get(st)?.get('rate'))}}</td>\r\n\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n\r\n \r\n \r\n <div class=\"col-md-3\">\r\n <div class=\"form-group w-100\">\r\n <div class=\"col-md-5\">\r\n \r\n <select class=\"formcontrol\" name=\"viewdisType\" (change)=\"onGrpSelect(defaultGrpList)\" [(ngModel)]=\"viewdisType\">\r\n <option value=\"group\">Group By</option>\r\n <option value=\"summary\">Summary By</option>\r\n \r\n </select>\r\n </div>\r\n <div class=\"col-md-7\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select Group\" [options]=\"staticLov\" [(ngModel)]=\"defaultGrpList\"\r\n name=\"status\" [multiple]=\"true\" [allowClear]=\"true\" (selected)=\"onGrpSelect(defaultGrpList)\"\r\n (deselected)=\"onGrpSelect(defaultGrpList)\">\r\n <ng-template #optionTemplate let-option=\"option\">\r\n <div class=\"famfamfam-flags {{option?.value.toLowerCase()}}\"></div>\r\n {{option?.label}}\r\n </ng-template>\r\n </ng-select>\r\n </div>\r\n\r\n </div>\r\n\r\n </div>\r\n <p>\r\n <b>Buyer Pie chart</b>\r\n <i title=\"Buyer wise pie chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('buyer','value')\"></i>\r\n </p>\r\n </div>\r\n\r\n \r\n <div class=\"col-md-2\">\r\n <p *ngIf=\"defaultGrpList.length>0\">\r\n <i title=\"Group wise chart\"\r\n style=\"cursor: pointer;padding: 5px;margin-left: 10px; text-align: center;font-size: 20px;color: #3a5898;\"\r\n type=\"button\" class=\"fa fa-pie-chart\" aria-hidden=\"true\" data-toggle=\"modal\"\r\n data-target=\"#PiechartModel\" (click)=\"generatePie('group','value')\"></i>\r\n </p>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul>\r\n </div>\r\n <div class=\"col-md-3 pull-right\">\r\n <form class=\"form-inline pull-right\">\r\n <div class=\"form-group\">\r\n <label for=\"exampleInputName2\">Search </label>\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n <button class=\"btn btn-default\" style=\"padding: 4px 15px 4px 20px;margin-left: 10px;float: right;\"\r\n data-toggle=\"tooltip\" data-placement=\"left\" title=\"Download Excel\"\r\n (click)=\"exportToCSV('Packet list');\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button>\r\n\r\n </form>\r\n </div>\r\n\r\n </div>\r\n \r\n \r\n\r\n <!-- <div class=\"col-md-2\">\r\n <div class=\"form-group\">\r\n <button class=\"btn btn-success\" style=\"margin-left: 5px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n <ul class=\"cul\">\r\n <li *ngFor=\"let legend of legendList\">\r\n <p\r\n [ngStyle]=\"{'background-color': legend.k ,'height':'9px', 'width':'9px', 'margin': '0', 'display' : 'inline-block'}\">\r\n </p>\r\n {{legend.v}}\r\n </li>\r\n </ul> \r\n </div>\r\n </div>\r\n -->\r\n <div class=\"row\">\r\n <ng-container *ngIf=\"viewdisType=='group'\">\r\n <div *ngIf=\"groupBypktList.length >0\" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"grouponScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th (click)=\"sortBy(hrdKey,g)\" style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">\r\n {{header[hrdKey]}}\r\n \r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n \r\n <ng-container *ngFor=\"let groupdtl of loadgroupBypktList let j=index;\">\r\n <tr>\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{groupdtl.value}} \r\n Qty : {{groupdtl['count']}} Carats :\r\n {{groupdtl['crtwt']}}\r\n Avg :{{groupdtl['salavg']}}\r\n Dis% : {{groupdtl['saldis']}}\r\n\r\n Amount : {{groupdtl['salvlu']}} \r\n </td>\r\n </tr> \r\n <!-- <tr *ngIf=\"sttwise\" >\r\n <td [attr.colspan]=\"headerKey.length+1\" style=\"font-weight:bold;text-align: left; \">\r\n {{g}} \r\n Qty : {{finalGrpVal[g].length}} Carats :\r\n {{totalWeight}}\r\n\r\n Amount :{{totAmt}}\r\n </td>\r\n </tr> -->\r\n\r\n\r\n\r\n <tr *ngFor=\"let pktdtl of groupdtl['pktList'] | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n\r\n \r\n \r\n <div *ngIf=\"pkts.length > 0 && groupBypktList.length==0 \" class=\"table-responsive\" id=\"wrap\" style=\"overflow: auto;width: 100%;height: calc(100vh - 250px);\"\r\n infinite-scroll [infiniteScrollDistance]=\"scrollDistance\" [infiniteScrollUpDistance]=\"scrollUpDistance\"\r\n [infiniteScrollThrottle]=\"50\" (scrolled)=\"onScrollDown()\" [scrollWindow]=\"false\">\r\n <table class=\"displayTable\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th class=\"cTh\" style=\"width:75px;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n DNA</th>\r\n <th> \r\n Actions\r\n </th>\r\n <th style=\"text-align: center;\">Status</th>\r\n <th style=\"text-align: center;\" *ngFor=\"let hrdKey of headerKey\">{{header[hrdKey]}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr>\r\n <td></td>\r\n <td></td>\r\n <td><b>Average </b></td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td>\r\n <b>{{cs.splitToTwoDecimal(TotAvgObj[hrdKey])}}</b>\r\n </td>\r\n \r\n </ng-container>\r\n \r\n </tr>\r\n <tr *ngFor=\"let pktdtl of loadResult | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"width:75px;position: relative;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <a href=\"https://kapugems.com/kweb/#/dna/{{pktdtl.stock_idn}}/?key={{ck}}\" target=\"_blank\">\r\n <i class=\"fa fa-diamond\" aria-hidden=\"true\"></i>\r\n </a>\r\n <input type=\"checkbox\" value=\"{{pktdtl.stock_idn}}\" [hidden]=\"true\" id=\"cb_{{pktdtl.stock_idn}}\"\r\n (click)=\"checkedRow(pktdtl,pktdtl.stock_idn,$event.target.checked)\">\r\n </td>\r\n <td> \r\n <ng-container *ngFor=\"let lnk of links\">\r\n <i class=\"{{lnk.form_field_icon}}\" *ngIf=\"pktdtl.dsp_stt!='sold'\" (click)=\"OnLinkClick(lnk,pktdtl)\" aria-hidden=\"true\"></i>\r\n \r\n </ng-container>\r\n \r\n </td>\r\n\r\n <td style=\"text-align: center;\" [ngStyle]=\"{'color': pktdtl.dsp_stt}\">{{pktdtl.dsp_stt}}</td>\r\n <ng-container *ngFor=\"let hrdKey of headerKey\">\r\n <td *ngIf=\"hrdKey!='co' && hrdKey!='pu'\" style=\"text-align: center\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey]}}</td>\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='co'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n\r\n\r\n <td style=\"text-align: center\" *ngIf=\"hrdKey=='pu'\" (click)=\"selectRow(pktdtl.stock_idn);\"\r\n [ngStyle]=\"{'color': pktdtl.dsp_stt_color == '#FFFFFF' ? 'black':pktdtl.dsp_stt_color}\">\r\n {{pktdtl[hrdKey+\"_p\"]}}</td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"viewdisType=='summary' && summaryList.length>0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\"> <button class=\"btn btn-default\"\r\n style=\"padding: 4px 15px 4px 20px;margin-left: 10px;\" data-toggle=\"tooltip\" data-placement=\"right\"\r\n title=\"Download Excel\" (click)=\"exportToCSVSummary();\">\r\n <span class=\"fa fa-file-excel-o\" style=\"color:green;\"></span>\r\n </button></div>\r\n </div>\r\n <div class=\"row\">\r\n <table class=\"displayTable\" style=\"text-align: center;padding:10px ;\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th style=\"text-align: center;\">Sr. No</th>\r\n <th style=\"text-align: center;\">Attribute</th>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <th style=\"text-align: center;\" colspan=\"5\">{{hdr}}</th>\r\n </ng-container>\r\n </tr>\r\n <tr class=\"posrel\">\r\n <td style=\"text-align: center;\"></td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">Qty</td>\r\n <td style=\"text-align: center;\">Carat</td>\r\n <td style=\"text-align: center;\">Avg</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">Dis</td>\r\n <td style=\"text-align: center;\">Value</td>\r\n </ng-container>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let summaryDtl of summaryList | tableSearch:searchF:pkts;let pkti = index\"\r\n [ngClass]=\"{'even':pkti%2==0,'odd':pkti%2==1}\">\r\n <td style=\"text-align: center;\">{{pkti+1}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['value']}}</td>\r\n <ng-container *ngFor=\"let hdr of headList\">\r\n <td style=\"text-align: center;\">{{summaryDtl['count_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['crtwt_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['avg_'+hdr]}}</td>\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">{{summaryDtl['dis_'+hdr]}}</td>\r\n <td style=\"text-align: center;\">{{summaryDtl['vlu_'+hdr]}}</td>\r\n </ng-container>\r\n </tr> \r\n\r\n </tbody>\r\n </table>\r\n </div>\r\n </ng-container>\r\n</div>\r\n\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter\">\r\n <div class=\"row\">\r\n <div class=\"calsec pull-left\" style=\"padding: 5px;\">\r\n <table>\r\n <tr>\r\n <td style=\"text-align: center;\">\r\n <strong> Total: </strong>\r\n </td>\r\n <td style=\"text-align: center;\">\r\n {{finalGrpVal[\"\"]?.length>0 ? finalGrpVal[\"\"]?.length : pkts?.length}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Weight: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{totalWeight}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Avg: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totAvg}} </td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Dis: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totDis}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Amount: </strong> </td>\r\n <td style=\"text-align: center;\"> {{totAmt}}</td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> | Selected Pkts : </strong> </td>\r\n <td style=\"text-align: center;\"> {{selectedItm?.length}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Weight: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectwt}} </td>\r\n\r\n <td style=\"text-align: center;\">\r\n <strong> Avg: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAvg}} </td>\r\n\r\n <td style=\"text-align: center;\" *ngIf=\"formname!='mixAnalysisReportForm'\">\r\n <strong> Disc: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectDis}} </td>\r\n <td style=\"text-align: center;\">\r\n <strong> Amount: </strong>\r\n </td>\r\n <td style=\"text-align: center;\"> {{selectAmt}}</td>\r\n\r\n </tr>\r\n </table>\r\n </div>\r\n\r\n <div>\r\n <button class=\"btn btn-success\" style=\"margin-right: 80px;\" (click)=\"modifySearch()\">Modify\r\n Search</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n\r\n\r\n\r\n\r\n <div class=\"modal fade\" id=\"PiechartModel\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"exampleModalLabel\"\r\n aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" role=\"document\" >\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Top {{type}} Pie Chart</h4>\r\n </div>\r\n <div class=\"modal-body\" >\r\n <div class=\"row\">\r\n <div class=\"col-md-3 pull-right\">\r\n <div class=\"form-group\">\r\n <button id=\"btnQty\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'qty')\">QTY </button>\r\n <button id=\"btnVal\" class=\"btn btn-default\" type=\"button\" (click)=\"generatePie(dataType,'value')\">VALUE </button>\r\n </div>\r\n </div>\r\n </div>\r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isBuyerwise\" >\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [colors]=\"chartColors\" [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"card-footer row\" *ngIf=\"isGrpwise\" >\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('rate'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div>\r\n \r\n\r\n <!-- <div class=\"card-footer row\" *ngIf=\"isQtyWise\">\r\n <label class=\"control-label\"><b> Total sold value:\r\n {{this.cs.splitToTwoDecimal(sttWiseSummary?.get('sold')?.get('count'))}}</b></label>\r\n <canvas baseChart [data]=\"doughnutChartData\" [labels]=\"doughnutChartLabels\" [legend]=\"pieChartLegend\"\r\n [chartType]=\"doughnutChartType\" [options]=\"pie\"></canvas>\r\n </div> -->\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary btn-sm\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"modal fade\" id=\"bidMd\" tabindex=\"-1\" style=\"z-index: 1400\" role=\"dialog\"\r\n aria-labelledby=\"exampleModalLabel\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog\" role=\"document\">\r\n <form name=\"appForm\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h5 class=\"modal-title text-uppercase\" id=\"exampleModalLabel\">\r\n Price Change</h5>\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\" >\r\n <span aria-hidden=\"true\">×</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n \r\n <div class=\"row\" style=\"padding:10px\">\r\n <div class=\"col-md-12\">\r\n <span style=\"font-size: 16px;font-weight:bold\">{{cObj?.pkt_code}} {{cObj?.sh}} {{cObj?.crtwt}} {{cObj?.co}} {{cObj?.pu}} {{cObj?.ct}} {{cObj?.po}} {{cObj?.sy}} {{cObj?.fl}}</span>\r\n \r\n\r\n </div>\r\n \r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" > Rap: </label>\r\n </div>\r\n <div class=\"col-md-3\"><span class=\"clbl\">{{cObj?.benchmark_rte}}</span></div>\r\n <div class=\"col-md-7\"> </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n \r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" >Discount:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rap_dis}}</span>\r\n </div>\r\n <div class=\"col-md-5\" style=\"text-align: left;\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'dis')\" style=\"width:100px\" class=\"form-control\" name=\"new_rap_dis\" [(ngModel)]=\"cObj['new_rap_dis']\" />\r\n\r\n </div>\r\n </div>\r\n <div class=\"row\" style=\"padding-left: 20px;padding-top: 3px\">\r\n <div class=\"col-md-2\">\r\n <label class=\"clbl\" style=\"text-align: right;\">Price:</label>\r\n </div>\r\n <div class=\"col-md-3\">\r\n <span class=\"clbl\">{{cObj?.rte}}</span>\r\n </div>\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" (change)=\"calculatRteDis(cObj,'rte')\" style=\"width:100px\" class=\"form-control\" name=\"new_rte\" [(ngModel)]=\"cObj['new_rte']\" />\r\n\r\n </div>\r\n \r\n </div>\r\n \r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-default\" data-dismiss=\"modal\" >Close</button>\r\n <button type=\"button\" class=\"btn btn-success\" data-dismiss=\"modal\" appAppNoDblClick\r\n (click)=\"ChangesPrice()\">Update Price</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n</div> \r\n<button id=\"bidMdBBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#bidMd\"></button>\r\n\r\n <button id=\"PiechartModelBtn\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#PiechartModel\"></button>\r\n\r\n\r\n</div>", styles: [".actionFooter{position:fixed;bottom:0;width:100%;text-align:right;padding:10px 10px 10px 0;background:#1b1e24}.calsec table{color:#fff}.selectedRow{background-color:#3c59983b!important}.notselectedRow{background-color:#fff!important}.legendsList{list-style:none;font-size:14px;padding:5px;display:flex;margin:0 0 0 80px}.formcontrol{height:30px;font-size:12px;line-height:18px;box-shadow:none;padding:5px 12px;border:1px solid #D5D5D5;background:#F9F9F9;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;box-shadow:inset 0 1px 1px #00000013;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}\n"] }]
|
|
1103
|
+
}], ctorParameters: function () { return [{ type: i1.CommanServiceService }, { type: i2.BiService }, { type: i3.NgxSpinnerService }, { type: i4.ToastrService }, { type: i5.Router }, { type: i5.ActivatedRoute }]; }, propDecorators: { chart: [{
|
|
1104
|
+
type: ViewChild,
|
|
1105
|
+
args: [BaseChartDirective]
|
|
1106
|
+
}] } });
|
|
1107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGt0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9wa3QtZGF0YS9wa3QtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL3BrdC1kYXRhL3BrdC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDM0MsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUNoRixPQUFPLEVBQUUsU0FBUyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3RCxPQUFPLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssQ0FBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDaEQsT0FBTyxLQUFLLGdCQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBRSxXQUFXLEVBQUcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxpQ0FBaUM7QUFDakMsT0FBTyxFQUFjLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN4QyxPQUFPLEVBQUUsT0FBTyxFQUFHLE9BQU8sRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBQ2xFLGtDQUFrQztBQU9sQyxNQUFNLE9BQU8sZ0JBQWdCO0lBd0Qz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QzlDLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxJQUFJLENBQUM7d0JBQ3ZCLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO3dCQUN0QyxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7d0JBQzFDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzt3QkFDMUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO3dCQUN6QyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDO3dCQUM5RCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt3QkFDL0UsSUFBSSxHQUFHLElBQUksTUFBTSxFQUFFOzRCQUNqQixHQUFHLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUM7NEJBQ3RDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDOzRCQUMzQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDOzRCQUM5RCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQzt5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RSxDQUFDO2dCQUU1QyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUNyQztRQUNILENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ3BCLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDNUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7bUpBMXZDVSxnQkFBZ0I7dUlBQWhCLGdCQUFnQiwyRkFxRGhCLGtCQUFrQixnREMxRS9CLGsxM0JBc2lCTTsyRkRqaEJPLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxjQUFjO2lQQTBEakIsS0FBSztzQkFEWCxTQUFTO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcclxuaW1wb3J0IHsgTmd4U3Bpbm5lclNlcnZpY2UgfSBmcm9tIFwibmd4LXNwaW5uZXJcIjtcclxuaW1wb3J0IHsgQmlTZXJ2aWNlIH0gZnJvbSAnLi8uLi9iaS1zZXJ2aWNlL2JpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tYW5TZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2NvbW1hbi1zZXJ2aWNlL2NvbW1hbi1zZXJ2aWNlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgQWN0aXZhdGVkUm91dGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICduZzItY29va2llcy9uZzItY29va2llcyc7XHJcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcclxuaW1wb3J0IHsgQmFzZUNoYXJ0RGlyZWN0aXZlIH0gZnJvbSAnbmcyLWNoYXJ0cyc7XHJcbmltcG9ydCAqIGFzIHBsdWdpbkRhdGFMYWJlbHMgZnJvbSAnY2hhcnRqcy1wbHVnaW4tbGFiZWxzJztcclxuaW1wb3J0IHsgSHR0cEhlYWRlcnMgIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG4vLyBpbXBvcnQgKiBhcyBSeCBmcm9tICdyeGpzL1J4JztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgZnJvbSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBncm91cEJ5ICwgdG9BcnJheSwgbWFwLCBtZXJnZU1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuLy8gaW1wb3J0IHsgc3VtQnkgfSBmcm9tICdsb2Rhc2gnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGt0LWRhdGEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9wa3QtZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vcGt0LWRhdGEuY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQa3REYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgcGt0cyA9IFtdO1xyXG4gIGhlYWRlcktleSA9IFtdO1xyXG4gIGhlYWRlciA9IFtdO1xyXG4gIGNrO1xyXG4gIHRvdGFsV2VpZ2h0ID0gMDtcclxuICByZXFoZWFkZXI7XHJcbiAgc2Nyb2xsRGlzdGFuY2UgPSAxO1xyXG4gIHNjcm9sbFVwRGlzdGFuY2UgPSAyO1xyXG4gIHN0YXJ0SW5kZXggPSAwO1xyXG4gIGVuZEluZGV4ID0gMzA7XHJcbiAgZ3JvdXBzdGFydEluZGV4ID0gMDtcclxuICBncm91cGVuZEluZGV4ID0gMzA7XHJcbiAgbG9hZFJlc3VsdCA9IFtdO1xyXG4gIHJlc3VsdGxlbmd0aCA9IDA7XHJcbiAgdG90QXZnID0gMDtcclxuICB0b3REaXMgPSAwO1xyXG4gIHNlbGVjdGVkSXRtID0gW107XHJcbiAgc2VsZWN0d3QgPSAwO1xyXG4gIHNlbGVjdEF2ZyA9IDA7XHJcbiAgc2VsZWN0RGlzID0gMDtcclxuICBzZWxlY3RBbXQgPSAwO1xyXG4gIHNlYXJjaEY7XHJcbiAgZHJvcGRvd25TZXR0aW5ncztcclxuICBzdHRXaXNlU3VtbWFyeSA9IG5ldyBNYXAoKTtcclxuICAvLyBhbmFBbGxHcnBTdHQgPSBbJ2FzcnQnLCAnbGFiJywgJ21rdCcsICdzb2xkJ107XHJcbiAgYW5hQWxsR3JwU3R0ID0gW107XHJcbiAgZztcclxuXHJcbiAgbGVnZW5kTGlzdCA9IFtdO1xyXG4gIG5ld3dpbmRvdyA9IFwiWUVTXCI7XHJcbiAgcGFnZURlZmluYXRpb247XHJcbiAgc29ydGVkO1xyXG4gIHNvcnRPbjtcclxuICBjbG1uO1xyXG4gIHN0YXRpY0xvdiA9IFtdO1xyXG4gIGRlZmF1bHRHcnBMaXN0ID0gW107XHJcbiAgc3RPYmogPSB7fTtcclxuICB0b3RBbXQgPSAwO1xyXG4gIG5vZGF0YSA9IHRydWU7XHJcbiAgdmlld2Rpc1R5cGUgPSBcImdyb3VwXCI7XHJcbiAgc3VtbWFyeUxpc3QgPSBbXTtcclxuICBjb1B1YXR0cmlidXRlU3RyID0gW107XHJcbiAgZm9ybW5hbWU7XHJcbiAgbW9kdWxlbmFtZTtcclxuICBjVXJsO1xyXG4gIGxpbmtzO1xyXG4gIGNPYmo7XHJcbiAgZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuICBsb2FkZ3JvdXBCeXBrdExpc3QgPSBbXTtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKVxyXG4gIHB1YmxpYyBjaGFydDogQmFzZUNoYXJ0RGlyZWN0aXZlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBjczogQ29tbWFuU2VydmljZVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJpczogQmlTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlXHJcbiAgKSB7IH1cclxuXHJcbiAgbHBhZChsU3RyLCBsbikge1xyXG4gICAgbGV0IHN0ciA9IGxTdHI7XHJcbiAgICB3aGlsZSAoc3RyLmxlbmd0aCA8IGxuKSB7IHN0ciA9ICcwJyArIHN0cjsgfVxyXG4gICAgcmV0dXJuIHN0cjtcclxuICB9XHJcblxyXG4gIGdldFNlYXJjaFJlc3VsdCgpIHtcclxuICAgIHRoaXMuY09iaiA9IHt9O1xyXG4gICAgdGhpcy5ncm91cEJ5cGt0TGlzdCA9IFtdO1xyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgdGhpcy5wa3RzID0gW107XHJcbiAgICB0aGlzLmdycCA9IFtdO1xyXG4gICAgdGhpcy5oZWFkZXJLZXkgPSBbXTtcclxuICAgIHRoaXMubGVnZW5kTGlzdCA9IFtdO1xyXG4gICAgdGhpcy52aWV3ZGlzVHlwZSA9IFwiZ3JvdXBcIjtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHRoaXMuZm9ybW5hbWUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107XHJcbiAgICByZXFPYmpbJ3NlYXJjaElkbkxpc3QnXSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdzcmNJZG5zJykuc3BsaXQoJywnKTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybW5tZSddO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IDMwO1xyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0gW107XHJcbiAgICB0aGlzLmJpcy5kYXRhKHJlcU9iaiwgJ3NlYXJjaCcsICdtYXJrZXRpbmcvc2VhcmNoJylcclxuICAgICAgLnN1YnNjcmliZShkYXRhID0+IHtcclxuICAgICAgICBpZiAoZGF0YS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBsZXQgcmVzID0gZGF0YS5yZXN1bHQ7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInJlc1wiLCByZXMpO1xyXG4gICAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlcy5wYWdlRGVmaW5hdGlvbiB8fCB7fTtcclxuICAgICAgICAgIHRoaXMubGlua3MgPSB0aGlzLnBhZ2VEZWZpbmF0aW9uLmxpbmsgfHwgW107XHJcbiAgICAgICAgICB0aGlzLnBrdHMgPSByZXMuc2VhcmNoUmVzdWx0RHRsIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5hbmFBbGxHcnBTdHQgPSBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5wa3RzLm1hcChlbGVtZW50ID0+IGVsZW1lbnQuZHNwX3N0dCkpKTtcclxuICAgICAgICAgIHRoaXMucmVzdWx0bGVuZ3RoID0gdGhpcy5wa3RzLmxlbmd0aDtcclxuICAgICAgICAgIHRoaXMuY29QdWF0dHJpYnV0ZVN0ciA9IHJlcy5jb3B1U3RydWN0dXJlRHRsIHx8IFtdO1xyXG4gICAgICAgICAgdGhpcy5oZWFkZXJLZXkgPSByZXMucmVzdWx0VmlldztcclxuICAgICAgICAgIHRoaXMuaGVhZGVyID0gcmVzLnJlc3VsdFZpZXdEdGw7XHJcbiAgICAgICAgICB0aGlzLmxlZ2VuZExpc3QgPSByZXMubGVnZW5kTGlzdDtcclxuICAgICAgICAgIHRoaXMudG90YWxXZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgICAgIGxldCByYXBWYWwgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMucGt0cy5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5yYXBfdmx1KSwgMCkpO1xyXG4gICAgICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgICAgICB0aGlzLnBrdHMuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLnRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10KTtcclxuICAgICAgICAgIHRoaXMudG90QXZnID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnRvdEFtdCAvIHRoaXMudG90YWxXZWlnaHQpO1xyXG4gICAgICAgICAgdGhpcy50b3REaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgodG90QW10ICogMTAwKSAvIHBhcnNlRmxvYXQocmFwVmFsKSkgLSAxMDApO1xyXG4gICAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXggPiB0aGlzLnJlc3VsdGxlbmd0aClcclxuICAgICAgICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoXHJcbiAgICAgICAgICB0aGlzLmFkZEl0ZW1zKCk7XHJcbiAgICAgICAgICBkZWJ1Z2dlclxyXG4gICAgICAgICAgLy8gICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgICAgIC8vICB0aGlzLnRvdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcGFyc2VGbG9hdCh0b3RyYXBWYWwpKSAtIDEwMCk7XHJcbiAgICAgICAgICB0aGlzLmdldFN1bW1hcnkodGhpcy5wa3RzKTtcclxuICAgICAgICAgIC8vIHRoaXMuY3JlYXRlR3JwKHRoaXMucGt0cywgdGhpcy5kZWZhdWx0R3JwTGlzdCk7XHJcbiAgICAgICAgICAvLyBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnQkktUEtUX0dST1VQX0JZJyxKU09OLnN0cmluZ2lmeShyZXMucGFnZURlZmluYXRpb24uZm9ybV9maWVsZFswXS5sb3ZfcXJ5KSlcclxuICAgICAgICAgIC8vIGxldCBHUlBieSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJLVBLVF9HUk9VUF9CWScpKTtcclxuICAgICAgICAgIHRoaXMuZ2V0U3RhdGljS1YocmVzLnBhZ2VEZWZpbmF0aW9uLmZvcm1fZmllbGRbMF0ubG92X3FyeSk7XHJcbiAgICAgICAgICBsZXQgYXZnRmllbGRzID0gcmVzLnBhZ2VEZWZpbmF0aW9uLnRhYnNbMF0ubG92X3FyeS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUb3RhbHMoYXZnRmllbGRzLCB0aGlzLnBrdHMpO1xyXG4gICAgICAgICAgbGV0IHR0bEZpZWxkcyA9IHJlcy5wYWdlRGVmaW5hdGlvbi5vdGhlcnNbMF0ubG92X3FyeS5zcGxpdCgnLCcpO1xyXG4gICAgICAgICAgdGhpcy5nZXRUb3RhbHNUdGwodHRsRmllbGRzLCB0aGlzLnBrdHMpO1xyXG5cclxuXHJcblxyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZGF0YS5tZXNzYWdlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0sIGVycm9yID0+IHtcclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyb3IpO1xyXG4gICAgICB9KTtcclxuICB9XHJcbiAgc2VsZWN0Um93KHBrdElkKSB7XHJcbiAgICB2YXIgY2hlY2tib3hJZCA9IFwiY2JfXCIgKyBwa3RJZDtcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNoZWNrYm94SWQpLmNsaWNrKCk7XHJcbiAgfVxyXG5cclxuICBjaGVja2VkUm93KG9iaiwgc3RvY2tpZG4sIHN0YXR1cykge1xyXG4gICAgbGV0IGNiSWQgPSAnY2JfJyArIG9iai5zdG9ja19pZG47XHJcbiAgICBpZiAoc3RhdHVzID09IGZhbHNlKSB7XHJcbiAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoY2JJZCk7Ly9wa3RJZFxyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJub3RzZWxlY3RlZFJvd1wiKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0bS5mb3JFYWNoKChlLCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChlLnN0b2NrX2lkbiA9PSBzdG9ja2lkbikge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0bS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGNiSWQpOy8vcGt0SWRcclxuICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcIm5vdHNlbGVjdGVkUm93XCIpO1xyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdG0ucHVzaChvYmopO1xyXG4gICAgfVxyXG4gICAgdGhpcy5zZWxlY3R3dCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zZWxlY3RlZEl0bS5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuXHJcbiAgICAvLyBsZXQgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5zYWxfYW1vdW50LCAwKSk7XHJcbiAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnNlbGVjdGVkSXRtLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgbGV0IHRvdHJhcFZhbCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zZWxlY3RlZEl0bS5yZWR1Y2UoKGEsIGIpID0+ICthICsgK2IucmFwX3ZsdSwgMCkpO1xyXG5cclxuXHJcbiAgICBsZXQgdG90QW10ID0gMDtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdG0uZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10gfHwgMCkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRvdEFtdCArPSBwYXJzZUZsb2F0KGVsZW1lbnRbJ3J0ZSddIHx8IDApICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5zZWxlY3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICB0aGlzLnNlbGVjdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90cmFwVmFsKSAqIDEwMCkgLSAxMDApO1xyXG4gICAgdGhpcy5zZWxlY3RBbXQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3R0d2lzZSA9IGZhbHNlO1xyXG4gIHN0YXR1c1dpc2VEaXNwbGF5KGUsIG0pIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICB0aGlzLnN0dHdpc2UgPSB0cnVlO1xyXG4gICAgbGV0IGdBcnIgPSBbXTtcclxuICAgIGZvciAobGV0IGtleSBpbiBtKSB7XHJcbiAgICAgIGlmIChtW2tleV0gPT0gdHJ1ZSkge1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgbGV0IHBrID0gdGhpcy5wa3RzLmZpbHRlcihlID0+IGUuZ3JwX3N0dCA9PSBrZXkpO1xyXG4gICAgICAgIGdBcnIgPSBnQXJyLmNvbmNhdChwayk7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSB7XHJcbiAgICAgICAgbGV0IHBrID0gZ0Fyci5maWx0ZXIoZSA9PiBlLmdycF9zdHQgIT0ga2V5KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZGVidWdnZXJcclxuICAgIHRoaXMuZmluYWxHcnBWYWxbXCJcIl0gPSBnQXJyO1xyXG4gICAgdGhpcy5sb2FkUmVzdWx0ID0gZ0FycjtcclxuXHJcbiAgICBpZiAodGhpcy5maW5hbEdycFZhbFtcIlwiXS5sZW5ndGggPiAwKSB7XHJcbiAgICAgIHRoaXMudG90YWxXZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuZmluYWxHcnBWYWxbXCJcIl0ucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcblxyXG4gICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgICBsZXQgdG90cmFwVmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLmZpbmFsR3JwVmFsW1wiXCJdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5yYXBfdmx1LCAwKSk7XHJcblxyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgdGhpcy5maW5hbEdycFZhbFtcIlwiXS5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydzYWxfcnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0b3RBbXQgKz0gcGFyc2VGbG9hdChlbGVtZW50WydydGUnXSkgKiBwYXJzZUZsb2F0KGVsZW1lbnRbJ2NydHd0J10pO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMudG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgdGhpcy50b3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRvdEFtdCAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICAgIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHRvdEFtdCAqIDEwMCkgLyBwYXJzZUZsb2F0KHRvdHJhcFZhbCkpIC0gMTAwKTtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgICAvLyBsZXQgZ3JwQnkgPSBlLnRhcmdldC52YWx1ZTtcclxuICAgIC8vIGlmIChlLnRhcmdldC5jaGVja2VkKSB7XHJcbiAgICAvLyAgIGxldCBwayA9IHRoaXMucGt0cy5maWx0ZXIoZSA9PiBlLmdycF9zdHQgPT0gZ3JwQnkpO1xyXG4gICAgLy8gICB0aGlzLmZpbmFsR3JwVmFsW1wiXCJdID0gcGs7XHJcbiAgICAvLyB9XHJcbiAgICAvLyBlbHNlIHtcclxuICAgIC8vICAgbGV0IHBrID0gdGhpcy5wa3RzLmZpbHRlcihlID0+IGUuZ3JwX3N0dCAhPT0gZ3JwQnkpO1xyXG4gICAgLy8gICB0aGlzLmZpbmFsR3JwVmFsW1wiXCJdID0gcGs7XHJcbiAgICAvLyB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmZpbmFsR3JwVmFsKTtcclxuXHJcbiAgfVxyXG4gIE9uTGlua0NsaWNrKGxuaywgcGt0ZHRsKSB7XHJcblxyXG4gICAgaWYgKGxuay5mb3JtX2ZpZWxkID09ICdwcmljZXVwZGF0ZScpIHtcclxuICAgICAgdGhpcy5jT2JqID0gcGt0ZHRsO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImJpZE1kQkJ0blwiKS5jbGljaygpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRSdGVEaXMob2JqZHRsLCB0eXApIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBpZiAodHlwID09ICdydGUnKSB7XHJcbiAgICAgIGxldCBkaXMgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKCgocGFyc2VGbG9hdChvYmpkdGwubmV3X3J0ZSkgKiAxMDApIC8gcGFyc2VGbG9hdChvYmpkdGwucmFwX3J0ZSkpIC0gMTAwKTtcclxuICAgICAgb2JqZHRsW1wibmV3X3JhcF9kaXNcIl0gPSBkaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cCA9PSAnZGlzJykge1xyXG4gICAgICBsZXQgcnRlID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgocGFyc2VGbG9hdChvYmpkdGwucmFwX3J0ZSkgKiAoMTAwICsgcGFyc2VGbG9hdChvYmpkdGwubmV3X3JhcF9kaXMpKSAvIDEwMCkpO1xyXG4gICAgICBvYmpkdGxbXCJuZXdfcnRlXCJdID0gcnRlO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIENoYW5nZXNQcmljZSgpIHtcclxuXHJcblxyXG4gICAgbGV0IG5tZUlkbiA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ25tZUlkbicpKTtcclxuICAgIGxldCBwa3REYXRhTGlzdCA9IFtdO1xyXG4gICAgbGV0IHVwZGF0ZU9iaiA9IHt9O1xyXG4gICAgdXBkYXRlT2JqW1wiaWRcIl0gPSB0aGlzLmNPYmoucGt0X2NvZGU7XHJcbiAgICB1cGRhdGVPYmpbXCJpc3N1ZVwiXSA9IHsgXCJydGVcIjogXCJcIiB9O1xyXG4gICAgdXBkYXRlT2JqW1wicnRuXCJdID0geyBcInJ0ZVwiOiB0aGlzLmNPYmoubmV3X3J0ZSB9O1xyXG4gICAgdXBkYXRlT2JqW1wiZW1wXCJdID0ge307XHJcbiAgICBwa3REYXRhTGlzdC5wdXNoKHVwZGF0ZU9iaik7XHJcblxyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107Ly8nYnVsa1VwZGF0ZUZvcm0nO1xyXG4gICAgcmVxT2JqWydhdHRyJ10gPSBcInJ0ZVwiO1xyXG4gICAgcmVxT2JqWydyZWlzc3VlJ10gPSAnWSc7XHJcbiAgICByZXFPYmpbJ2VtcElkbiddID0gbm1lSWRuO1xyXG4gICAgcmVxT2JqWydncnAnXSA9IFwiYnVsa3VwZGF0ZVwiO1xyXG4gICAgcmVxT2JqWydwcm9jZXNzTmFtZSddID0gXCJidWxrTWVtUHJpY2VVcGRhdGVcIi8vJ2J1bGtQcmVwZXJ0aWVzVXBkYXRlJztcclxuICAgIHJlcU9ialsncGt0RGF0YUxpc3QnXSA9IHBrdERhdGFMaXN0O1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLnJlcWhlYWRlclsnbWV0aG9kJ10gPSAncmV0dXJuSXNzdWUnO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5yZXFoZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ3ByZU1hcmtldGluZy9pc3N1ZVJldHVybicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuXHJcbiAgICAgICAgdGhpcy5jT2JqLnJ0ZSA9IHRoaXMuY09iai5uZXdfcnRlO1xyXG4gICAgICAgIHRoaXMuY09iai5yYXBfZGlzID0gdGhpcy5jT2JqLm5ld19yYXBfZGlzO1xyXG4gICAgICAgIHRoaXMuZ2V0U3VtbWFyeSh0aGlzLnBrdHMpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG5cclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG4gIGFkZEl0ZW1zKCkge1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuc3RhcnRJbmRleDsgaSA8IHRoaXMuZW5kSW5kZXg7IGkrKykge1xyXG4gICAgICB0aGlzLmxvYWRSZXN1bHRbaV0gPSB0aGlzLnBrdHNbaV07XHJcbiAgICB9XHJcbiAgICB0aGlzLnN0YXJ0SW5kZXggPSB0aGlzLmVuZEluZGV4O1xyXG4gICAgdGhpcy5lbmRJbmRleCA9IHRoaXMuZW5kSW5kZXggKyAzMDtcclxuICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpIHtcclxuICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25TY3JvbGxEb3duKCkge1xyXG5cclxuICAgIGlmICh0aGlzLmVuZEluZGV4IDw9IHRoaXMucmVzdWx0bGVuZ3RoKVxyXG4gICAgICB0aGlzLmFkZEl0ZW1zKClcclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwid3JhcFwiKS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsIGZ1bmN0aW9uICgpIHtcclxuICAgICAgdmFyIHRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKDAsXCIgKyB0aGlzLnNjcm9sbFRvcCArIFwicHgpXCI7XHJcbiAgICAgIHRoaXMucXVlcnlTZWxlY3RvcihcInRoZWFkXCIpLnN0eWxlLnRyYW5zZm9ybSA9IHRyYW5zbGF0ZTtcclxuICAgIH0pO1xyXG4gIH1cclxuICBncnAgPSBbXTtcclxuICBHcnBWYWxzID0gW107XHJcbiAgZmluYWxHcnBWYWwgPSB7fVxyXG4gIGZpbmFsU3VtbWFyeUR0bCA9IHt9O1xyXG4gIGRhdGEgPSBbXTtcclxuICBzdW1tYXJ5RHRsID0ge307XHJcblxyXG4gIGNyZWF0ZUdycChkYXRhcywgc2VsZWN0ZWQpIHtcclxuICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZGF0YSA9IFsuLi5kYXRhc107XHJcbiAgICAvLyBsZXQgZ3JwdmFsdWVzID0gXCJwdVwiO1xyXG4gICAgLy8gbGV0IGdycHZhbHVlc0FyciA9IGdycHZhbHVlcy5zcGxpdCgnLCcpO1xyXG4gICAgLy8gbGV0IHJlc3V0QXJyID0gW107XHJcblxyXG4gICAgbGV0IGdycHZhbHVlc0FyciA9IHNlbGVjdGVkO1xyXG5cclxuICAgIHZhciBmaW5hbCA9IFtdO1xyXG4gICAgdmFyIG91dHB1dCA9IF8uZ3JvdXBCeSh0aGlzLmRhdGEsIGZ1bmN0aW9uIChlbnRyeSkge1xyXG4gICAgICB2YXIgc3RycyA9ICcnO1xyXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycHZhbHVlc0Fyci5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgIHN0cnMgKz0gZW50cnlbZ3JwdmFsdWVzQXJyW2ldXSArICcjJztcclxuICAgICAgfVxyXG5cclxuICAgICAgcmV0dXJuIHN0cnM7XHJcbiAgICAgIC8vIHJldHVybiBlbnRyeVtncnB2YWx1ZXNBcnJbMF1dICsgJyMnICsgZW50cnlbZ3JwdmFsdWVzQXJyWzFdXTsvLyArICcjJyArIGVudHJ5LnB1O1xyXG4gICAgfSk7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhvdXRwdXQpO1xyXG5cclxuICAgIGZpbmFsLnB1c2gob3V0cHV0KTtcclxuICAgIGNvbnNvbGUubG9nKGZpbmFsKTtcclxuXHJcbiAgICB2YXIgS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsWzBdKTtcclxuICAgIGNvbnNvbGUubG9nKEtleXMpO1xyXG5cclxuICAgIHZhciBWYWxzID0gT2JqZWN0LnZhbHVlcyhmaW5hbFswXSk7XHJcbiAgICBjb25zb2xlLmxvZyhWYWxzKTtcclxuXHJcbiAgICBsZXQgZ3JwTmFtZWFyciA9IFtdO1xyXG4gICAgS2V5cy5tYXAoZWxlID0+IHtcclxuICAgICAgZ3JwTmFtZWFyci5wdXNoKGVsZS5zcGxpdCgnIycpLmZpbHRlcihlID0+IGUgIT0gdW5kZWZpbmVkKS5qb2luKCcgIC8gICcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3JwID0gZ3JwTmFtZWFycjtcclxuICAgIHRoaXMuR3JwVmFscyA9IFZhbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycE5hbWVhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGdycE5tZSA9IGdycE5hbWVhcnJbaV07XHJcbiAgICAgIHRoaXMuZmluYWxHcnBWYWxbZ3JwTm1lXSA9IFZhbHNbaV07XHJcblxyXG4gICAgICBjb25zb2xlLmxvZyh0aGlzLmZpbmFsR3JwVmFsW2dycE5tZV0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmdldFRvdGFsKCk7XHJcbiAgICB0aGlzLmdycC5zb3J0KCk7XHJcblxyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBvbkdycFNlbGVjdChzZWxlY3RlZCkge1xyXG4gICAgaWYgKHRoaXMudmlld2Rpc1R5cGUgPT0gJ2dyb3VwJylcclxuICAgICAgdGhpcy5ncm91cFBrdHNMaXN0KHRoaXMucGt0cywgc2VsZWN0ZWQpO1xyXG4gICAgZWxzZVxyXG4gICAgICB0aGlzLnN1bW1hcnlEZXRhaWxzKHNlbGVjdGVkKTtcclxuICB9XHJcbiAgaGVhZExpc3QgPSBbXTtcclxuICBncm91cFBrdHNMaXN0KHBrdHMsIHNlbGVjdGVkKSB7XHJcbiAgICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09IDEpIHtcclxuICAgICAgbGV0IGF0dHIgPSBzZWxlY3RlZFswXTtcclxuICAgICAgLy8gdGhpcy5maW5hbEdycFZhbCA9IF8uZ3JvdXBCeShwa3RzLCBhdHRyKTtcclxuICAgICAgLy90aGlzLmdycCA9IE9iamVjdC5rZXlzKHRoaXMuZmluYWxHcnBWYWwpO1xyXG4gICAgICBmcm9tKHBrdHMpLnBpcGUoXHJcbiAgICAgICAgZ3JvdXBCeSh4ID0+IHhbYXR0cl0pLFxyXG4gICAgICAgIG1lcmdlTWFwKGdyb3VwID0+IGdyb3VwLnBpcGUodG9BcnJheSgpKSksXHJcbiAgICAgICAgbWFwKGcgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgICAgdmFsdWU6IGdbMF1bYXR0cl0sXHJcbiAgICAgICAgICAgIHBrdExpc3Q6IGcsXHJcbiAgICAgICAgICAgIGNvdW50OiBfLnN1bUJ5KGcsICdxdHlfb25faGFuZGludCcpLFxyXG4gICAgICAgICAgICByYXB2bHU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAncmFwX3ZsdScpKSxcclxuICAgICAgICAgICAgY3J0d3Q6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnY3J0d3RpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSksXHJcbiAgICAgICAgICAgIHNhbHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykpLFxyXG4gICAgICAgICAgICBhdmc6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnYW1vdW50aW50JykgLyBfLnN1bUJ5KGcsICdjcnR3dGludCcpKSxcclxuICAgICAgICAgICAgc2FsYXZnOiB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKF8uc3VtQnkoZywgJ3NhbF9hbW91bnRpbnQnKSAvIF8uc3VtQnkoZywgJ2NydHd0aW50JykpLFxyXG4gICAgICAgICAgICBkaXM6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSAqIDEwMCkgLyAoXy5zdW1CeShnLCAncmFwX3ZsdScpKSkgLSAxMDApLFxyXG4gICAgICAgICAgICBzYWxkaXM6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykgKiAxMDApIC8gKF8uc3VtQnkoZywgJ3JhcF92bHUnKSkpIC0gMTAwKVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0b0FycmF5KCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShkID0+IHtcclxuICAgICAgICAgIHRoaXMuZ3JvdXBCeXBrdExpc3QgPSBkO1xyXG4gICAgICAgICAgdGhpcy5ncm91cHN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICAgICAgdGhpcy5ncm91cGVuZEluZGV4ID0gdGhpcy5ncm91cEJ5cGt0TGlzdC5sZW5ndGg7XHJcbiAgICAgICAgICB0aGlzLmdyb3VwYWRkSXRlbXMoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnN0YXJ0SW5kZXggPSAwO1xyXG4gICAgICB0aGlzLmVuZEluZGV4ID0gMzA7XHJcbiAgICAgIHRoaXMubG9hZFJlc3VsdCA9IFtdO1xyXG4gICAgICB0aGlzLmdyb3VwQnlwa3RMaXN0ID0gW107XHJcbiAgICAgIGlmICh0aGlzLmVuZEluZGV4ID4gdGhpcy5yZXN1bHRsZW5ndGgpXHJcbiAgICAgICAgdGhpcy5lbmRJbmRleCA9IHRoaXMucmVzdWx0bGVuZ3RoXHJcbiAgICAgIHRoaXMuYWRkSXRlbXMoKTtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ3JvdXBhZGRJdGVtcygpIHtcclxuICAgIGxldCBwa3RjbnQgPSAwO1xyXG4gICAgZm9yIChsZXQgaSA9IHRoaXMuZ3JvdXBzdGFydEluZGV4OyBpIDwgdGhpcy5ncm91cGVuZEluZGV4OyBpKyspIHtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgdGhpcy5sb2FkZ3JvdXBCeXBrdExpc3RbaV0gPSB0aGlzLmdyb3VwQnlwa3RMaXN0W2ldO1xyXG4gICAgICBsZXQgcGt0bGlzdCA9IHRoaXMuZ3JvdXBCeXBrdExpc3RbaV1bJ3BrdExpc3QnXSB8fCBbXTtcclxuICAgICAgcGt0Y250ID0gcGt0Y250ICsgcGt0bGlzdC5sZW5ndGg7XHJcbiAgICAgIGlmIChwa3RjbnQgPiAzMCkge1xyXG4gICAgICAgIHRoaXMuZ3JvdXBzdGFydEluZGV4ID0gaSArIDE7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBncm91cG9uU2Nyb2xsRG93bigpIHtcclxuXHJcbiAgICBpZiAodGhpcy5ncm91cHN0YXJ0SW5kZXggPCB0aGlzLmdyb3VwZW5kSW5kZXgpXHJcbiAgICAgIHRoaXMuZ3JvdXBhZGRJdGVtcygpXHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIndyYXBcIikuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBmdW5jdGlvbiAoKSB7XHJcbiAgICAgIHZhciB0cmFuc2xhdGUgPSBcInRyYW5zbGF0ZSgwLFwiICsgdGhpcy5zY3JvbGxUb3AgKyBcInB4KVwiO1xyXG4gICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoXCJ0aGVhZFwiKS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHN1bW1hcnlEZXRhaWxzKHNlbGVjdGVkKSB7XHJcblxyXG5cclxuICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPT0gMSkge1xyXG5cclxuICAgICAgdGhpcy5oZWFkTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgc3VtbWFyeURhdGEgPSBbXTtcclxuICAgICAgbGV0IGF0dHJpYnVlID0gc2VsZWN0ZWRbMF07XHJcblxyXG4gICAgICBmcm9tKHRoaXMucGt0cykucGlwZShcclxuICAgICAgICBncm91cEJ5KHggPT4geFthdHRyaWJ1ZV0gKyBcIiNcIiArIHhbJ2RzcF9zdHQnXSksXHJcbiAgICAgICAgbWVyZ2VNYXAoZ3JvdXAgPT4gZ3JvdXAucGlwZSh0b0FycmF5KCkpKSxcclxuICAgICAgICBtYXAoZyA9PiB7XHJcbiAgICAgICAgICByZXR1cm4ge1xyXG4gICAgICAgICAgICBrZXk6IGdbMF1bYXR0cmlidWVdICsgXCIjXCIgKyBnWzBdWydkc3Bfc3R0J10sXHJcbiAgICAgICAgICAgIHZhbHVlOiBnWzBdW2F0dHJpYnVlXSxcclxuICAgICAgICAgICAgc29ydDogZ1swXVthdHRyaWJ1ZSArIFwiX3NydFwiXSB8fCAxMDAwMCxcclxuICAgICAgICAgICAgZHNwc3R0OiBnWzBdWydkc3Bfc3R0J10sXHJcbiAgICAgICAgICAgIGNvdW50OiBfLnN1bUJ5KGcsICdxdHlfb25faGFuZGludCcpLFxyXG4gICAgICAgICAgICByYXB2bHU6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAncmFwX3ZsdScpKSxcclxuICAgICAgICAgICAgY3J0d3Q6IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoXy5zdW1CeShnLCAnY3J0d3RpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdXJ0ZTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdhbW91bnRpbnQnKSksXHJcbiAgICAgICAgICAgIHZsdTogdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChfLnN1bUJ5KGcsICdzYWxfYW1vdW50aW50JykpLFxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KSxcclxuICAgICAgICB0b0FycmF5KCkpXHJcbiAgICAgICAgLnN1YnNjcmliZShkID0+IHtcclxuICAgICAgICAgIHN1bW1hcnlEYXRhID0gZDtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgIGxldCBzdW1tYXJ5TWFwID0ge307XHJcbiAgICAgIGxldCBzaWRlTGlzdCA9IFtdO1xyXG4gICAgICBsZXQgaGVhZExpc3QgPSBbXTtcclxuICAgICAgc3VtbWFyeURhdGEuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgICBzdW1tYXJ5TWFwW2VsZW1lbnQua2V5XSA9IGVsZW1lbnQ7XHJcbiAgICAgICAgbGV0IHZhbHVlID0gZWxlbWVudC52YWx1ZSB8fCAnJztcclxuICAgICAgICBsZXQgZHNwc3R0ID0gZWxlbWVudC5kc3BzdHQ7XHJcbiAgICAgICAgaWYgKChzZWxlY3RlZCA9PSAnc2FsX2J5cicgfHwgc2VsZWN0ZWQgPT0gJ3NhbF9lbXAnKSAmJiBkc3BzdHQgIT0gJ3NvbGQnKVxyXG4gICAgICAgICAgdmFsdWUgPSAnJztcclxuICAgICAgICBpZiAodmFsdWUgIT0gJycpIHtcclxuXHJcblxyXG4gICAgICAgICAgaWYgKGhlYWRMaXN0LmluZGV4T2YoZHNwc3R0KSA9PSAtMSlcclxuICAgICAgICAgICAgaGVhZExpc3QucHVzaChkc3BzdHQpO1xyXG4gICAgICAgICAgaWYgKHNpZGVMaXN0LmluZGV4T2YodmFsdWUpID09IC0xKVxyXG4gICAgICAgICAgICBzaWRlTGlzdC5wdXNoKHZhbHVlKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcblxyXG4gICAgICB0aGlzLnN1bW1hcnlMaXN0ID0gW107XHJcbiAgICAgIHNpZGVMaXN0LmZvckVhY2goc2lkZSA9PiB7XHJcbiAgICAgICAgbGV0IHN1bW1yeSA9IHt9O1xyXG4gICAgICAgIGhlYWRMaXN0LmZvckVhY2goaGVhZCA9PiB7XHJcbiAgICAgICAgICBsZXQgc3VtbXJ5RGF0YSA9IHN1bW1hcnlNYXBbc2lkZSArIFwiI1wiICsgaGVhZF0gfHwgJyc7XHJcbiAgICAgICAgICBpZiAoc3VtbXJ5RGF0YSAhPSAnJykge1xyXG4gICAgICAgICAgICBsZXQgc3R0ID0gc3VtbXJ5RGF0YVsnZHNwc3R0J107XHJcblxyXG4gICAgICAgICAgICBsZXQgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdXJ0ZSB8fCAwKTtcclxuICAgICAgICAgICAgbGV0IHJhcHZsdSA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5yYXB2bHUgfHwgMCk7XHJcbiAgICAgICAgICAgIGxldCBjcnR3dCA9IHBhcnNlRmxvYXQoc3VtbXJ5RGF0YS5jcnR3dCB8fCAwKTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZSddID0gc2lkZTtcclxuICAgICAgICAgICAgc3VtbXJ5Wyd2YWx1ZVNvcnQnXSA9IHN1bW1yeURhdGEuc29ydDtcclxuICAgICAgICAgICAgc3VtbXJ5Wydjb3VudF8nICsgc3R0XSA9IHN1bW1yeURhdGEuY291bnQ7XHJcbiAgICAgICAgICAgIHN1bW1yeVsnY3J0d3RfJyArIHN0dF0gPSBzdW1tcnlEYXRhLmNydHd0O1xyXG4gICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHN1bW1yeURhdGEudmx1cnRlO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICBzdW1tcnlbJ2Rpc18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh2bHUgKiAxMDApIC8gcmFwdmx1KSAtIDEwMCk7XHJcbiAgICAgICAgICAgIGlmIChzdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgICAgICAgdmx1ID0gcGFyc2VGbG9hdChzdW1tcnlEYXRhLnZsdSB8fCAwKTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ3ZsdV8nICsgc3R0XSA9IHZsdTtcclxuICAgICAgICAgICAgICBzdW1tcnlbJ2F2Z18nICsgc3R0XSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodmx1IC8gY3J0d3QpO1xyXG4gICAgICAgICAgICAgIHN1bW1yeVsnZGlzXycgKyBzdHRdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHZsdSAqIDEwMCkgLyByYXB2bHUpIC0gMTAwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgdGhpcy5zdW1tYXJ5TGlzdC5wdXNoKHN1bW1yeSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgaWYgKHNlbGVjdGVkID09ICdzYWxfYnlyJyB8fCBzZWxlY3RlZCA9PSAnc2FsX2VtcCcpIHtcclxuICAgICAgICB0aGlzLnN1bW1hcnlMaXN0LnNvcnQoKHZhbDEsIHZhbDIpID0+IHtcclxuICAgICAgICAgIHJldHVybiAodmFsMlsndmx1X3NvbGQnXSkgLSAodmFsMVsndmx1X3NvbGQnXSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc29sZS5sb2coXCJ0aGlzLnN1bW1hcnlMaXN0XCIsIHRoaXMuc3VtbWFyeUxpc3QpO1xyXG4gICAgICAgIHRoaXMuc3VtbWFyeUxpc3Quc29ydCgodmFsMSwgdmFsMikgPT4ge1xyXG4gICAgICAgICAgcmV0dXJuICh2YWwxWyd2YWx1ZVNvcnQnXSkgLSAodmFsMlsndmFsdWVTb3J0J10pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5zdW1tYXJ5TGlzdFwiLCB0aGlzLnN1bW1hcnlMaXN0KTtcclxuICAgICAgfVxyXG5cclxuICAgICAgdGhpcy5oZWFkTGlzdCA9IGhlYWRMaXN0O1xyXG5cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChzZWxlY3RlZC5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoXCJTdW1tYXJ5IG5lZWQgb25seSBvbmUgYXR0cmlidXRlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnRUb0NTVlN1bW1hcnkoKSB7XHJcblxyXG4gICAgbGV0IG1vZGlmaWVkT2JqQXJyID0gW107XHJcblxyXG4gICAgdGhpcy5zdW1tYXJ5TGlzdC5mb3JFYWNoKChkYXRhLCBpbmRleCkgPT4ge1xyXG4gICAgICBsZXQgb2JqID0ge307XHJcbiAgICAgIG9ialtcIlNyLiBOb1wiXSA9IGluZGV4ICsgMTtcclxuICAgICAgb2JqW1wiQXR0cmlidXRlXCJdID0gZGF0YS52YWx1ZSB8fCAnJztcclxuICAgICAgdGhpcy5oZWFkTGlzdC5mb3JFYWNoKGhkciA9PiB7XHJcbiAgICAgICAgb2JqW1wiUXR5KFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImNvdW50X1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgICBvYmpbXCJDYXJhdChcIiArIGhkciArIFwiKVwiXSA9IGRhdGFbXCJjcnR3dF9cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiQXZnKFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImF2Z19cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiRGlzKFwiICsgaGRyICsgXCIpXCJdID0gZGF0YVtcImRpc19cIiArIGhkcl0gfHwgJyc7XHJcbiAgICAgICAgb2JqW1wiVmFsdWUoXCIgKyBoZHIgKyBcIilcIl0gPSBkYXRhW1widmx1X1wiICsgaGRyXSB8fCAnJztcclxuICAgICAgfSk7XHJcblxyXG4gICAgICBtb2RpZmllZE9iakFyci5wdXNoKG9iaik7XHJcblxyXG4gICAgfSk7XHJcbiAgICB0aGlzLmNzLkNTVkNvbnZlcnRvcihtb2RpZmllZE9iakFyciwgXCJTdW1tYXJ5X2RldGFpbHNcIiwgdHJ1ZSlcclxuICB9XHJcblxyXG4gIGdldFRvdGFsKCkge1xyXG4gICAgbGV0IGluZGV4VmFsID0gMDtcclxuICAgIGxldCBxcyA9IDA7XHJcblxyXG4gICAgdGhpcy5HcnBWYWxzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChlbGVtZW50LnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLmNydHd0KSwgMCkpO1xyXG4gICAgICBsZXQgcmFwVmFsID0gXy5zdW1CeShlbGVtZW50LCAncmFwX3ZsdScpO1xyXG4gICAgICBlbGVtZW50LmZvckVhY2gocGt0ID0+IHtcclxuXHJcbiAgICAgICAgaWYgKHBrdC5ncnBfc3R0ID09ICdzb2xkJykge1xyXG4gICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQocGt0WydzYWxfcnRlJ10gfHwgMCkgKiBwYXJzZUZsb2F0KHBrdFsnY3J0d3QnXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQocGt0WydydGUnXSB8fCAwKSAqIHBhcnNlRmxvYXQocGt0WydjcnR3dCddKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgdG90QW10ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgdmFyIGtleSA9IHRoaXMuZ3JwW2luZGV4VmFsXTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0NUU1wiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90d2VpZ2h0KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0FNVFwiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX1JURVwiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gdG90d2VpZ2h0KTtcclxuICAgICAgdGhpcy5zdW1tYXJ5RHRsW2tleSArIFwiX0RJU1wiXSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcmFwVmFsKSAtIDEwMCk7XHJcbiAgICAgIGluZGV4VmFsKys7XHJcblxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIEdycFZhbHNQaWUgPSBbXTtcclxuICBncnBQaWUgPSBbXTtcclxuICBmaW5hbEdycFZhbFBpZSA9IHt9O1xyXG4gIHN1bW1hcnlEdGxQaWUgPSB7fTtcclxuICBieXJ2YWxHcnAgPSBbXTsvL3t9O1xyXG4gIGlzQnV5ZXJ3aXNlID0gZmFsc2U7XHJcbiAgaXNHcnB3aXNlID0gZmFsc2U7XHJcbiAgdHlwZTtcclxuICBncnBXaXNlUXR5ID0gW107XHJcbiAgZGF0YVR5cGUgPSBcIlwiO1xyXG4gIGdlbmVyYXRlUGllKERhdGF0eXBlLCBDaGFydFR5cGUpIHtcclxuICAgIGlmIChDaGFydFR5cGUgPT0gJ3F0eScpIHtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blF0eScpLmNsYXNzTGlzdC5yZW1vdmUoJ2J0bi1kZWZhdWx0Jyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5RdHknKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blZhbCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LmFkZCgnYnRuLWRlZmF1bHQnKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuVmFsJykuY2xhc3NMaXN0LnJlbW92ZSgnYnRuLWRlZmF1bHQnKTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0blZhbCcpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xyXG4gICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuUXR5JykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5RdHknKS5jbGFzc0xpc3QuYWRkKCdidG4tZGVmYXVsdCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5ncnBXaXNlUXR5ID0gW107XHJcbiAgICB0aGlzLmJ5cnZhbEdycCA9IFtdO1xyXG5cclxuICAgIHRoaXMuZGF0YVR5cGUgPSBEYXRhdHlwZTtcclxuICAgIHRoaXMuX3NwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIHRoaXMuZmluYWxHcnBWYWxQaWUgPSB7fTtcclxuICAgIHRoaXMuYnlydmFsR3JwID0gW107XHJcbiAgICB0aGlzLmRhdGEgPSBbLi4udGhpcy5wa3RzXTtcclxuICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YS5maWx0ZXIoeCA9PiB4LmdycF9zdHQgPT0gJ3NvbGQnKTtcclxuICAgIGxldCBncnB2YWx1ZXM7XHJcbiAgICBsZXQgZ3JwdmFsdWVzQXJyO1xyXG4gICAgbGV0IHJlc3V0QXJyID0gW107XHJcbiAgICAvLyB0eXBlID0gJ3F0eSc7XHJcbiAgICBpZiAoRGF0YXR5cGUgPT0gJ2J1eWVyJykge1xyXG4gICAgICB0aGlzLnR5cGUgPSBcIkJ1eWVyXCI7XHJcbiAgICAgIHRoaXMuaXNCdXllcndpc2UgPSB0cnVlO1xyXG4gICAgICB0aGlzLmlzR3Jwd2lzZSA9IGZhbHNlO1xyXG4gICAgICBncnB2YWx1ZXMgPSBcInNhbF9ieXJcIjtcclxuICAgICAgZ3JwdmFsdWVzQXJyID0gZ3JwdmFsdWVzLnNwbGl0KCcsJyk7XHJcbiAgICAgIHJlc3V0QXJyID0gW107XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGUgPSB0aGlzLmRlZmF1bHRHcnBMaXN0O1xyXG4gICAgICB0aGlzLmlzQnV5ZXJ3aXNlID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuaXNHcnB3aXNlID0gdHJ1ZTtcclxuICAgICAgZ3JwdmFsdWVzQXJyID0gdGhpcy5kZWZhdWx0R3JwTGlzdDsvL3NlbGVjdGVkO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICAvL2xldCBncnB2YWx1ZXNBcnIgPSBzZWxlY3RlZDtcclxuXHJcbiAgICB2YXIgZmluYWwgPSBbXTtcclxuICAgIHZhciBvdXRwdXQgPSBfLmdyb3VwQnkodGhpcy5kYXRhLCBmdW5jdGlvbiAoZW50cnkpIHtcclxuICAgICAgdmFyIHN0cnMgPSAnJztcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncnB2YWx1ZXNBcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBzdHJzICs9IGVudHJ5W2dycHZhbHVlc0FycltpXV0gKyAnIyc7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHJldHVybiBzdHJzO1xyXG4gICAgICAvLyByZXR1cm4gZW50cnlbZ3JwdmFsdWVzQXJyWzBdXSArICcjJyArIGVudHJ5W2dycHZhbHVlc0FyclsxXV07Ly8gKyAnIycgKyBlbnRyeS5wdTtcclxuICAgIH0pO1xyXG4gICAgLy8gY29uc29sZS5sb2cob3V0cHV0KTtcclxuXHJcbiAgICBmaW5hbC5wdXNoKG91dHB1dCk7XHJcblxyXG4gICAgdmFyIEtleXMgPSBPYmplY3Qua2V5cyhmaW5hbFswXSk7XHJcblxyXG4gICAgdmFyIFZhbHMgPSBPYmplY3QudmFsdWVzKGZpbmFsWzBdKTtcclxuXHJcbiAgICBsZXQgZ3JwTmFtZWFyciA9IFtdO1xyXG4gICAgS2V5cy5tYXAoZWxlID0+IHtcclxuICAgICAgZ3JwTmFtZWFyci5wdXNoKGVsZS5zcGxpdCgnIycpLmZpbHRlcihlID0+IGUgIT0gdW5kZWZpbmVkKS5qb2luKCcgIC8gICcpKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuZ3JwUGllID0gZ3JwTmFtZWFycjtcclxuICAgIHRoaXMuR3JwVmFsc1BpZSA9IFZhbHM7XHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdycE5hbWVhcnIubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdmFyIGdycE5tZSA9IGdycE5hbWVhcnJbaV07XHJcblxyXG4gICAgICB0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0gPSBWYWxzW2ldO1xyXG5cclxuICAgICAgbGV0IHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5maW5hbEdycFZhbFBpZVtncnBObWVdLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArcGFyc2VGbG9hdChiLnNhbF9hbW91bnRpbnQpLCAwKSk7XHJcblxyXG4gICAgICBsZXQgYnlyT2JqID0ge307XHJcbiAgICAgIGJ5ck9ialsnayddID0gZ3JwTm1lO1xyXG4gICAgICBieXJPYmpbJ3YnXSA9IHBhcnNlRmxvYXQodG90QW10KTsvL3RoaXMuYnlydmFsR3JwW2dycE5tZV0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLmJ5cnZhbEdycC5wdXNoKGJ5ck9iaik7XHJcbiAgICAgIGJ5ck9iaiA9IHt9O1xyXG4gICAgICAvLyB0aGlzLmJ5cnZhbEdycFtncnBObWVdID0gdG90QW10O1xyXG5cclxuICAgICAgbGV0IHF0eU9iaiA9IHt9O1xyXG4gICAgICBxdHlPYmpbJ2snXSA9IGdycE5tZTtcclxuICAgICAgcXR5T2JqWyd2J10gPSB0aGlzLmZpbmFsR3JwVmFsUGllW2dycE5tZV0ubGVuZ3RoO1xyXG4gICAgICB0aGlzLmdycFdpc2VRdHkucHVzaChxdHlPYmopO1xyXG4gICAgICBxdHlPYmogPSB7fTtcclxuXHJcbiAgICAgIC8vIHRoaXMuZ3JwV2lzZVF0eVtncnBObWVdID0gdGhpcy5maW5hbEdycFZhbFBpZVtncnBObWVdLmxlbmd0aDtcclxuXHJcbiAgICB9XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmdycFdpc2VRdHkpO1xyXG5cclxuICAgIGlmIChDaGFydFR5cGUgPT0gJ3F0eScpIHtcclxuICAgICAgdGhpcy5kcmF3UGllKHRoaXMuZ3JwV2lzZVF0eSwgQ2hhcnRUeXBlLCBEYXRhdHlwZSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIHtcclxuICAgICAgdGhpcy5kcmF3UGllKHRoaXMuYnlydmFsR3JwLCBDaGFydFR5cGUsIERhdGF0eXBlKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyB0aGlzLmdldFRvdGFsUGllKCk7XHJcbiAgICAvLyB0aGlzLmdycFBpZS5zb3J0KCk7XHJcblxyXG4gIH1cclxuXHJcbiAgZHluYW1pY0NvbG9ycyA9IFtdO1xyXG4gIGdlbmVyYXRlKCkge1xyXG4gICAgdGhpcy5keW5hbWljQ29sb3JzID0gW107XHJcbiAgICBmb3IgKHZhciBpID0gMTsgaSA8IDc7IGkrKykge1xyXG4gICAgICAvLyB0aGlzLkxpZ2h0ZW5EYXJrZW5Db2xvcihcIjdjYjVlY1wiLCBpICogMTApO1xyXG4gICAgICBsZXQgY29sID0gJ2M2ZTg5Nic7XHJcbiAgICAgIGxldCBhbXQgPSAoaSAqIDIwKSAqIC0xO1xyXG4gICAgICB2YXIgdXNlUG91bmQgPSBmYWxzZTtcclxuXHJcbiAgICAgIGlmIChjb2xbMF0gPT0gXCIjXCIpIHtcclxuICAgICAgICBjb2wgPSBjb2wuc2xpY2UoMSk7XHJcbiAgICAgICAgdXNlUG91bmQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB2YXIgbnVtID0gcGFyc2VJbnQoY29sLCAxNik7XHJcblxyXG4gICAgICB2YXIgciA9IChudW0gPj4gMTYpICsgYW10O1xyXG5cclxuICAgICAgaWYgKHIgPiAyNTUpIHIgPSAyNTU7XHJcbiAgICAgIGVsc2UgaWYgKHIgPCAwKSByID0gMDtcclxuXHJcbiAgICAgIHZhciBiID0gKChudW0gPj4gOCkgJiAweDAwRkYpICsgYW10O1xyXG5cclxuICAgICAgaWYgKGIgPiAyNTUpIGIgPSAyNTU7XHJcbiAgICAgIGVsc2UgaWYgKGIgPCAwKSBiID0gMDtcclxuXHJcbiAgICAgIHZhciBnID0gKG51bSAmIDB4MDAwMEZGKSArIGFtdDtcclxuXHJcbiAgICAgIGlmIChnID4gMjU1KSBnID0gMjU1O1xyXG4gICAgICBlbHNlIGlmIChnIDwgMCkgZyA9IDA7XHJcblxyXG4gICAgICAvLyByZXR1cm4gKHVzZVBvdW5kID8gXCIjXCIgOiBcIlwiKSArIChnIHwgKGIgPDwgOCkgfCAociA8PCAxNikpLnRvU3RyaW5nKDE2KTtcclxuICAgICAgdGhpcy5keW5hbWljQ29sb3JzLnB1c2goKHVzZVBvdW5kID8gXCIjXCIgOiBcIiNcIikgKyAoZyB8IChiIDw8IDgpIHwgKHIgPDwgMTYpKS50b1N0cmluZygxNikpO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2codGhpcy5keW5hbWljQ29sb3JzKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcy5keW5hbWljQ29sb3JzO1xyXG4gIH1cclxuICBieXJWYWxBcnIgPSBbXTtcclxuICBnZXRUb3RhbFBpZSgpIHtcclxuICAgIGxldCBpbmRleFZhbCA9IDA7XHJcbiAgICBsZXQgQW10QXJyID0gW107XHJcbiAgICB0aGlzLkdycFZhbHNQaWUuZm9yRWFjaChlbGVtZW50ID0+IHtcclxuICAgICAgbGV0IGJ5cndpc2VWYWwgPSB7fTtcclxuICAgICAgbGV0IHRvdEFtdCA9IDA7XHJcbiAgICAgIGxldCB0b3R3ZWlnaHQgPSAwO1xyXG4gICAgICB0b3R3ZWlnaHQgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKGVsZW1lbnQucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgIHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoZWxlbWVudC5yZWR1Y2UoKGEsIGIpID0+ICthICsgK3BhcnNlRmxvYXQoYi5zYWxfYW1vdW50aW50KSwgMCkpO1xyXG4gICAgICBBbXRBcnIucHVzaCh0b3RBbXQpO1xyXG4gICAgICB2YXIga2V5ID0gdGhpcy5ncnBbaW5kZXhWYWxdO1xyXG4gICAgICAvLyB0aGlzLnN1bW1hcnlEdGxba2V5ICsgXCJfUVRZXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChxdHkpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxQaWVba2V5ICsgXCJfQ1RTXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3R3ZWlnaHQpO1xyXG4gICAgICB0aGlzLnN1bW1hcnlEdGxQaWVba2V5ICsgXCJfQU1UXCJdID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0b3RBbXQpO1xyXG5cclxuICAgICAgaW5kZXhWYWwrKztcclxuXHJcbiAgICAgIGlmIChpbmRleFZhbCA9PSAxKSB7XHJcbiAgICAgICAgYnlyd2lzZVZhbFt0aGlzLmdycFtpbmRleFZhbF1dID0gdG90QW10O1xyXG4gICAgICAgIHRoaXMuYnlyVmFsQXJyLnB1c2goYnlyd2lzZVZhbCk7XHJcbiAgICAgICAgYnlyd2lzZVZhbCA9IHt9O1xyXG4gICAgICB9XHJcbiAgICAgIC8vIGNvbnNvbGUubG9nKHFzKTtcclxuICAgICAgLy8gY29uc29sZS5sb2coYW1vdW50KTtcclxuXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLmJ5clZhbEFycik7XHJcblxyXG4gICAgQW10QXJyID0gQW10QXJyLm1hcChmdW5jdGlvbiAoeCkge1xyXG4gICAgICByZXR1cm4gcGFyc2VGbG9hdCh4KTtcclxuICAgIH0pO1xyXG5cclxuICAgIEFtdEFyci5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhBbXRBcnIpO1xyXG4gICAgQW10QXJyLnJldmVyc2UoKTtcclxuXHJcbiAgICAvLyB0aGlzLmRyYXdQaWUoQW10QXJyKTtcclxuXHJcbiAgfVxyXG4gIHB1YmxpYyBwaWVDaGFydFBsdWdpbnMgPSBbcGx1Z2luRGF0YUxhYmVsc107XHJcbiAgZG91Z2hudXRDaGFydFR5cGUgPSAncGllJztcclxuICBkb3VnaG51dENoYXJ0TGFiZWxzID0gW107XHJcbiAgZG91Z2hudXRDaGFydERhdGEgPSBbXTtcclxuICBwaWVDaGFydENvbG9ycyA9IFtdO1xyXG4gIHBpZUNoYXJ0TGVnZW5kID0gdHJ1ZTtcclxuXHJcblxyXG4gIHB1YmxpYyBjaGFydENvbG9yczogYW55W10gPSBbXHJcbiAgICB7XHJcbiAgICAgIGJhY2tncm91bmRDb2xvcjogdGhpcy5nZW5lcmF0ZSgpLFxyXG4gICAgICBmaWxsQ29sb3I6IHRoaXMuZ2VuZXJhdGUoKSxcclxuICAgICAgc3Ryb2tlQ29sb3I6IHRoaXMuZ2VuZXJhdGUoKVxyXG4gICAgICAvL1tcIiMwMDAwODBcIiwgXCIjMDAyMEMyXCIsIFwiIzE1NjlDN1wiLCBcIiMzNTdFQzdcIiwgXCIjMzY4QkMxXCIsXCI2NTlFQzdcIl0gXHJcbiAgICB9XTtcclxuICBsYWJlbHMgPSB7XHJcbiAgICBsYWJlbHM6IHtcclxuICAgICAgcmVuZGVyOiAncGVyY2VudGFnZScsXHJcbiAgICAgIC8vIMKgwqDCoMKgZm9udENvbG9yOiBbJ2dyZWVuJywgJ3doaXRlJywgJ3JlZCddLFxyXG4gICAgICBwcmVjaXNpb246IDJcclxuICAgIH1cclxuICB9XHJcbiAgY2hhcnRPcHRpb25zID0ge1xyXG4gICAgcGx1Z2luczoge1xyXG4gICAgICBsYWJlbHM6IHtcclxuICAgICAgICByZW5kZXI6ICdwZXJjZW50YWdlJyxcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGxlZ2VuZDoge1xyXG4gICAgICBwb3NpdGlvbjogJ3JpZ2h0JyxcclxuICAgICAgbGFiZWxzOiB7XHJcbiAgICAgICAgZm9udENvbG9yOiAnYmxhY2snLFxyXG4gICAgICAgIGJveFdpZHRoOiAxMCxcclxuICAgICAgICBwYWRkaW5nOiAxMCxcclxuICAgICAgICBmb250U2l6ZTogMTAsXHJcbiAgICAgICAgcmVuZGVyOiAncGVyY2VudGFnZScsXHJcblxyXG4gICAgICB9XHJcbiAgICB9LFxyXG5cclxuXHJcblxyXG4gIH1cclxuICBwaWVDaGFydE9wdGlvbnMgPSB7XHJcbiAgICAvL2xlZ2VuZDoge3Bvc2l0aW9uOiAnbGVmdCcsZm9udENvbG9yOid3aGl0ZSd9LFxyXG4gICAgLy9wbHVnaW5zOiB7bGFiZWxzOiB7IHJlbmRlcjogJ3BlcmNlbnRhZ2UnLHBvc2l0aW9uOiAnYm9yZGVyJywgdGV4dE1hcmdpbjogNH19XHJcblxyXG4gICAgbGVnZW5kOiB7XHJcbiAgICAgIHBvc2l0aW9uOiAncmlnaHQnLFxyXG4gICAgICBsYWJlbHM6IHtcclxuICAgICAgICBmb250Q29sb3I6ICdibGFjaycsXHJcbiAgICAgICAgYm94V2lkdGg6IDEwLFxyXG4gICAgICAgIHBhZGRpbmc6IDEwLFxyXG4gICAgICAgIGZvbnRTaXplOiAxMCxcclxuICAgICAgICByZW5kZXI6ICdwZXJjZW50YWdlJ1xyXG4gICAgICB9XHJcblxyXG4gICAgfSxcclxuICAgIHBsdWdpbnM6IHtcclxuICAgICAgZGF0YWxhYmVsczoge1xyXG4gICAgICAgIGZvcm1hdHRlcjogKHZhbHVlLCBjdHgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGxhYmVsID0gY3R4LmNoYXJ0LmRhdGEubGFiZWxzW2N0eC5kYXRhSW5kZXhdO1xyXG4gICAgICAgICAgcmV0dXJuIGxhYmVsO1xyXG4gICAgICAgIH0sXHJcbiAgICAgIH0sXHJcbiAgICB9XHJcbiAgfTtcclxuICBwaWUgPSB7XHJcbiAgICBsZWdlbmQ6IHsgcG9zaXRpb246ICdsZWZ0JywgZm9udENvbG9yOiAnd2hpdGUnIH0sXHJcbiAgICBwbHVnaW5zOiB7XHJcbiAgICAgIGxhYmVsczoge1xyXG4gICAgICAgIC8vIHJlbmRlciAnbGFiZWwnLCAndmFsdWUnLCAncGVyY2VudGFnZScsICdpbWFnZScgb3IgY3VzdG9tIGZ1bmN0aW9uLCBkZWZhdWx0IGlzICdwZXJjZW50YWdlJ1xyXG4gICAgICAgIHJlbmRlcjogJ3BlcmNlbnRhZ2UnLFxyXG4gICAgICAgIHByZWNpc2lvbjogMCxcclxuICAgICAgICBhcmM6IHRydWUsXHJcbiAgICAgICAgc2hvd0FjdHVhbFBlcmNlbnRhZ2VzOiB0cnVlLFxyXG4gICAgICAgIHBvc2l0aW9uOiAnb3V0c2lkZSdcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIHRvb2x0aXBzOiB7XHJcbiAgICAgIG1vZGU6ICdsYWJlbCcsXHJcbiAgICAgIGNhbGxiYWNrczoge1xyXG4gICAgICAgIGxhYmVsOiBmdW5jdGlvbiAodG9vbHRpcEl0ZW0sIGRhdGEpIHtcclxuICAgICAgICAgIC8vICBsZXQgbGFiZWwgPSBkYXRhLmRhdGFzZXRzW3Rvb2x0aXBJdGVtLmRhdGFzZXRJbmRleF0ubGFiZWw7XHJcbiAgICAgICAgICAvLyAgbGV0IHZhbHVlID0gZGF0YS5kYXRhc2V0c1t0b29sdGlwSXRlbS5kYXRhc2V0SW5kZXhdLmRhdGFbdG9vbHRpcEl0ZW0uaW5kZXhdO1xyXG4gICAgICAgICAgcmV0dXJuIFtkYXRhLmxhYmVsc1t0b29sdGlwSXRlbS5pbmRleF1cclxuICAgICAgICAgIF07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIGRyYXdQaWUoc2FsZXNEYXRhLCB0eXBlLCBDaGFydFR5cGUpIHtcclxuICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEgPSBbXTtcclxuICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscyA9IFtdO1xyXG5cclxuICAgIGxldCBBbXRBcnIgPSBzYWxlc0RhdGEuc29ydCgoYSwgYikgPT4gKGEudiA+IGIudikgPyAxIDogLTEpLnJldmVyc2UoKTtcclxuXHJcblxyXG4gICAgaWYgKENoYXJ0VHlwZSA9PSBcImJ1eWVyXCIpIHtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YSA9IEFtdEFyci5zbGljZSgwLCA1KS5tYXAoYSA9PiBhLnYpO1xyXG4gICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMgPSBBbXRBcnIuc2xpY2UoMCwgNSkubWFwKGEgPT4gYS5rKTtcclxuICAgICAgbGV0IHN1bXMgPSAwO1xyXG4gICAgICBsZXQgb3RoZXJTdW0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc3R0V2lzZVN1bW1hcnkuZ2V0KCdzb2xkJykuZ2V0KCdyYXRlJykpO1xyXG4gICAgICBpZiAodHlwZSA9PSAncXR5JylcclxuICAgICAgICBvdGhlclN1bSA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoJ3NvbGQnKS5nZXQoJ2NvdW50JykpO1xyXG5cclxuICAgICAgbGV0IHRBcnIgPSBbXTtcclxuICAgICAgdEFyciA9IEFtdEFyci5zbGljZSgwLCA1KS5tYXAoZnVuY3Rpb24gKHgpIHtcclxuICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh4LnYpO1xyXG4gICAgICB9KTtcclxuICAgICAgc3VtcyA9IF8uc3VtQnkodEFycik7XHJcbiAgICAgIGxldCBtYXhpbkFyciA9IE1hdGgubWF4KE1hdGgubWF4KC4uLnRoaXMuZG91Z2hudXRDaGFydERhdGEpKTtcclxuICAgICAgZGVidWdnZXJcclxuICAgICAgbGV0IG90aGVydmFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChvdGhlclN1bSAtIHN1bXMpIHx8IDA7XHJcbiAgICAgIGlmIChtYXhpbkFyciA+IG90aGVydmFsKSB7XHJcbiAgICAgICAgdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5wdXNoKG90aGVydmFsKTtcclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMucHVzaCgnT3RoZXInKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0aGlzLmRvdWdobnV0Q2hhcnREYXRhLnVuc2hpZnQob3RoZXJ2YWwpO1xyXG4gICAgICAgIHRoaXMuZG91Z2hudXRDaGFydExhYmVscy51bnNoaWZ0KCdPdGhlcicpO1xyXG4gICAgICB9XHJcblxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMuZG91Z2hudXRDaGFydERhdGEgPSBBbXRBcnIubWFwKGEgPT4gYS52KTtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzID0gQW10QXJyLm1hcChhID0+IGEuayk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5kb3VnaG51dENoYXJ0RGF0YVwiLCB0aGlzLmRvdWdobnV0Q2hhcnREYXRhKTtcclxuICAgICAgbGV0IHN1bXMgPSAwO1xyXG4gICAgICBsZXQgb3RoZXJTdW0gPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHRoaXMuc3R0V2lzZVN1bW1hcnkuZ2V0KCdzb2xkJykuZ2V0KCdyYXRlJykpO1xyXG4gICAgICBzdW1zID0gXy5zdW1CeShPYmplY3QudmFsdWVzKEFtdEFyciksICd2Jyk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhIC0gYjsgfSk7XHJcbiAgICAvLyB0aGlzLmRvdWdobnV0Q2hhcnREYXRhID0gdGhpcy5kb3VnaG51dENoYXJ0RGF0YS5yZXZlcnNlKCk7XHJcblxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRvdWdobnV0Q2hhcnRMYWJlbHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzW2ldID0gdGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzW2ldICsgXCIgXCIgKyB0aGlzLmRvdWdobnV0Q2hhcnREYXRhW2ldLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5kb3VnaG51dENoYXJ0TGFiZWxzKTtcclxuICAgIHRoaXMucmVmcmVzaENoYXJ0KENoYXJ0VHlwZSk7XHJcbiAgICB0aGlzLmRvdWdobnV0Q2hhcnRUeXBlID0gJ3BpZSc7XHJcbiAgICAvLyBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnUGllY2hhcnRNb2RlbEJ0bicpLmNsaWNrKCk7XHJcbiAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcblxyXG4gIH1cclxuXHJcbiAgcmVmcmVzaENoYXJ0KENoYXJ0VHlwZSkge1xyXG4gICAgdGhpcy5pc0J1eWVyd2lzZSA9IGZhbHNlO1xyXG4gICAgdGhpcy5pc0dycHdpc2UgPSBmYWxzZTtcclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICBpZiAoQ2hhcnRUeXBlID09IFwiYnV5ZXJcIikge1xyXG4gICAgICAgIHRoaXMuaXNCdXllcndpc2UgPSB0cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuaXNHcnB3aXNlID0gdHJ1ZTtcclxuICAgICAgfVxyXG5cclxuICAgIH0sIDEpO1xyXG4gIH1cclxuXHJcbiAgc29ydEJ5KGtleSwgZykge1xyXG4gICAgdGhpcy5zb3J0ZWQgPSB0aGlzLnNvcnRlZCA9PSAnZGVzYycgPyAnYXNjJyA6ICdkZXNjJztcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuc29ydGVkKTtcclxuICAgIGxldCBzcnRlZCA9IF8ub3JkZXJCeSh0aGlzLmZpbmFsR3JwVmFsW2ddLCBrZXksIFt0aGlzLnNvcnRlZF0pO1xyXG4gICAgdGhpcy5maW5hbEdycFZhbFtnXSA9IHNydGVkO1xyXG4gICAgdGhpcy5zb3J0T24gPSBnO1xyXG4gICAgdGhpcy5jbG1uID0ga2V5O1xyXG4gIH1cclxuICBleHBvcnRUb0NTVihGaWxlTmFtZSkge1xyXG4gICAgbGV0IGQgPSB0aGlzLmNzLmNEYXRlLFxyXG4gICAgICBtb250aCA9ICcnICsgKGQuZ2V0TW9udGgoKSArIDEpLFxyXG4gICAgICBkYXkgPSAnJyArIGQuZ2V0RGF0ZSgpLFxyXG4gICAgICB5ZWFyID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgbGV0IGR0ID0gW2RheSwgbW9udGgsIHllYXJdLmpvaW4oJy0nKTtcclxuICAgIGxldCBmaWxlTm1lID0gRmlsZU5hbWUgKyAnX18nICsgZHQ7XHJcbiAgICB0aGlzLmhlYWRlcktleSA9IFtcImRzcF9zdHRcIiwgLi4udGhpcy5oZWFkZXJLZXldO1xyXG4gICAgbGV0IG1vZGlmaWVkT2JqQXJyID0gdGhpcy5jcy5tb2RpZnlEYXRhQnlIZWFkZXIodGhpcy5wa3RzLCB0aGlzLmhlYWRlcktleSwgdGhpcy5oZWFkZXIpO1xyXG4gICAgdGhpcy5jcy5DU1ZDb252ZXJ0b3IobW9kaWZpZWRPYmpBcnIsIGZpbGVObWUsIHRydWUpO1xyXG4gIH1cclxuICBnZXRTdW1tYXJ5KHApIHtcclxuICAgIGxldCBzdW1tYXJ5O1xyXG4gICAgcC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAvLyBsZXQgc3R0ID0gJyc7XHJcbiAgICAgIC8vIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgIC8vICAgc3R0ID0gJ1NvbGQnO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2UgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnbWt0Jykge1xyXG4gICAgICAvLyAgIHN0dCA9ICdNYXJrZXRpbmcnO1xyXG4gICAgICAvLyB9XHJcbiAgICAgIC8vIGVsc2UgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnbGFiJykge1xyXG4gICAgICAvLyAgIHN0dCA9ICdMYWInO1xyXG4gICAgICAvLyB9XHJcblxyXG4gICAgICAvLyBlbHNlIHtcclxuICAgICAgLy8gICBzdHQgPSBlbGVtZW50LmdycF9zdHQ7XHJcbiAgICAgIC8vIH1cclxuXHJcbiAgICAgIC8vIHN1bW1hcnkgPSB0aGlzLnN0dFdpc2VTdW1tYXJ5LmdldChlbGVtZW50LmdycF9zdHQpO1xyXG4gICAgICBzdW1tYXJ5ID0gdGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoZWxlbWVudC5ncnBfc3R0KTsvL3N0dFxyXG5cclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgbGV0IGdyaWRXdCA9IDA7XHJcbiAgICAgIGxldCBncmlkYXZnID0gMDtcclxuICAgICAgbGV0IGRpc2MgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJhdGUgPSAwO1xyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgbGV0IGdyaWRSYXAgPSAwO1xyXG5cclxuICAgICAgLy8gdGhpcy50b3RBdmcgPSB0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHBhcnNlRmxvYXQodG90QW10KSAvIHBhcnNlRmxvYXQodG90d2VpZ2h0KSk7XHJcbiAgICAgIC8vIHRoaXMudG90RGlzID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCgoKHBhcnNlRmxvYXQodG90QW10KSAqIDEwMCkgLyBwYXJzZUZsb2F0KHRvdHJhcFZhbCkpIC0gMTAwKTtcclxuXHJcblxyXG4gICAgICBsZXQgd3QgPSBwYXJzZUZsb2F0KGVsZW1lbnQuY3J0d3QpO1xyXG4gICAgICBsZXQgcmF0ZSA9IDA7XHJcbiAgICAgIGxldCByYXB2YWwgPSBwYXJzZUZsb2F0KGVsZW1lbnQucmFwX3ZsdSk7XHJcbiAgICAgIGlmIChlbGVtZW50LmdycF9zdHQgPT0gJ3NvbGQnKSB7XHJcbiAgICAgICAgcmF0ZSA9IHBhcnNlRmxvYXQoKGVsZW1lbnQuc2FsX3J0ZSA9PSB1bmRlZmluZWQgfHwgZWxlbWVudC5zYWxfcnRlID09IFwiXCIpID8gZWxlbWVudC5ydGUgOiBlbGVtZW50LnNhbF9ydGUpICogcGFyc2VGbG9hdChlbGVtZW50LmNydHd0KTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICByYXRlID0gcGFyc2VGbG9hdChlbGVtZW50LnJ0ZSkgKiBwYXJzZUZsb2F0KGVsZW1lbnQuY3J0d3QpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoc3VtbWFyeSAhPSBudWxsKSB7XHJcbiAgICAgICAgY291bnQgPSBwYXJzZUludChzdW1tYXJ5LmdldCgnY291bnQnKSk7XHJcbiAgICAgICAgZ3JpZFd0ID0gcGFyc2VGbG9hdChzdW1tYXJ5LmdldCgnd3QnKSk7XHJcbiAgICAgICAgZ3JpZFJhdGUgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCdyYXRlJykpO1xyXG4gICAgICAgIGdyaWRSYXAgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCdyYXAnKSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgc3VtbWFyeSA9IG5ldyBNYXAoKTtcclxuICAgICAgfVxyXG4gICAgICBzdW1tYXJ5LnNldCgnY291bnQnLCBjb3VudCArIDEpO1xyXG4gICAgICBzdW1tYXJ5LnNldCgnd3QnLCBncmlkV3QgKyB3dCk7XHJcbiAgICAgIHN1bW1hcnkuc2V0KCdyYXRlJywgZ3JpZFJhdGUgKyByYXRlKTtcclxuICAgICAgc3VtbWFyeS5zZXQoJ3JhcCcsIGdyaWRSYXAgKyByYXB2YWwpO1xyXG5cclxuICAgICAgLy8gdGhpcy5zdHRXaXNlU3VtbWFyeS5zZXQoZWxlbWVudC5ncnBfc3R0ID09ICdzb2xkJyA/ICdTb2xkJyA6IGVsZW1lbnQuZ3JwX3N0dCwgc3VtbWFyeSk7XHJcbiAgICAgIHRoaXMuc3R0V2lzZVN1bW1hcnkuc2V0KGVsZW1lbnQuZ3JwX3N0dCwgc3VtbWFyeSk7Ly9zdHRcclxuXHJcbiAgICB9KTtcclxuICAgIGNvbnNvbGUubG9nKCdAcHJlc3VtOicsIHRoaXMuc3R0V2lzZVN1bW1hcnkpO1xyXG5cclxuICAgIHRoaXMuYW5hQWxsR3JwU3R0LmZvckVhY2goZWxlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coZWxlKTtcclxuICAgICAgbGV0IGNvdW50ID0gMDtcclxuICAgICAgbGV0IGdyaWRXdCA9IDA7XHJcbiAgICAgIGxldCBncmlkYXZnID0gMDtcclxuICAgICAgbGV0IGRpc2MgPSAwO1xyXG4gICAgICBsZXQgZ3JpZFJhdGUgPSAwO1xyXG4gICAgICBsZXQgdG90QW10ID0gMDtcclxuICAgICAgbGV0IHJhcCA9IDA7XHJcbiAgICAgIGxldCBncmlkUmFwID0gMDtcclxuXHJcblxyXG4gICAgICAvL2lmIChlbGUgPT0gJ01hcmtldGluZycgfHwgZWxlID09ICdTb2xkJykge1xyXG4gICAgICAvLyBlbGUgPSAoZWxlID09ICdNYXJrZXRpbmcnIHx8IGVsZSA9PSAnU29sZCcpID8gZWxlIDogZWxlLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGxldCBzdW1tYXJ5ID0gdGhpcy5zdHRXaXNlU3VtbWFyeS5nZXQoZWxlKSB8fCBuZXcgTWFwKCk7XHJcblxyXG4gICAgICBjb3VudCA9IHBhcnNlSW50KHN1bW1hcnkuZ2V0KCdjb3VudCcpKSB8fCAwO1xyXG4gICAgICBncmlkV3QgPSBwYXJzZUZsb2F0KHN1bW1hcnkuZ2V0KCd3dCcpKSB8fCAwLjAwO1xyXG4gICAgICBncmlkUmF0ZSA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhdGUnKSkgfHwgMDtcclxuICAgICAgZ3JpZFJhcCA9IHBhcnNlRmxvYXQoc3VtbWFyeS5nZXQoJ3JhcCcpKSB8fCAxO1xyXG5cclxuICAgICAgZGlzYyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKChncmlkUmF0ZSAqIDEwMCkgLyBncmlkUmFwKSAtIDEwMCk7XHJcblxyXG4gICAgICBncmlkYXZnID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChncmlkUmF0ZSAvIGdyaWRXdCk7XHJcblxyXG4gICAgICBzdW1tYXJ5LnNldCgnZGlzYycsIGRpc2MpO1xyXG4gICAgICBzdW1tYXJ5LnNldCgnYXZnJywgZ3JpZGF2Zyk7XHJcblxyXG4gICAgICB0aGlzLnN0dFdpc2VTdW1tYXJ5LnNldChlbGUsIHN1bW1hcnkpO1xyXG4gICAgICAvL31cclxuXHJcbiAgICB9KVxyXG4gICAgY29uc29sZS5sb2codGhpcy5zdHRXaXNlU3VtbWFyeSk7XHJcblxyXG4gIH1cclxuXHJcbiAgVG90QXZnT2JqID0ge307XHJcbiAgZ2V0VG90YWxzKGZpZWxkcywgcGt0cykge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGZpZWxkcy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICBkZWJ1Z2dlclxyXG4gICAgICBsZXQgdGF2ZyA9IDA7XHJcbiAgICAgIGxldCB0b3RhbCA9IDA7XHJcbiAgICAgIGlmIChlbGVtZW50LnRyaW0oKSA9PSAnYWdlJykge1xyXG4gICAgICAgIHRvdGFsID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChwa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5hZ2UsIDApKTtcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0b3RhbCA9IF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVtlbGVtZW50LnRyaW0oKV0pKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHplcm9WYWxzID0gcGt0cy5maWx0ZXIoeCA9PiAoeFtlbGVtZW50LnRyaW0oKV0gPT09IFwiMFwiIHx8IDApKS5sZW5ndGg7XHJcbiAgICAgIGlmIChlbGVtZW50LnRyaW0oKSAhPSAnYWdlJykge1xyXG4gICAgICAgIHRhdmcgPSB0b3RhbCAvIF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVsnY3J0d3QnXSkpO1xyXG4gICAgICAgIHRhdmcgPSB0aGlzLmNzLm51bWJlcnRvZml4ZWQodGF2ZywgMilcclxuICAgICAgfVxyXG4gICAgICBlbHNlIHtcclxuICAgICAgICB0YXZnID0gdG90YWwgLyBwa3RzLmxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLlRvdEF2Z09ialtlbGVtZW50LnRyaW0oKV0gPSB0YXZnO1xyXG4gICAgfSk7XHJcbiAgICBjb25zb2xlLmxvZyh0aGlzLlRvdEF2Z09iaik7XHJcbiAgfVxyXG5cclxuICBnZXRUb3RhbHNUdGwoZmllbGRzLCBwa3RzKSB7XHJcbiAgICBkZWJ1Z2dlclxyXG4gICAgZmllbGRzLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgIGRlYnVnZ2VyXHJcbiAgICAgIGxldCB0b3RhbCA9IDA7XHJcblxyXG4gICAgICB0b3RhbCA9IF8uc3VtQnkocGt0cywgaXRlbSA9PiBOdW1iZXIoaXRlbVtlbGVtZW50LnRyaW0oKV0pKTtcclxuXHJcbiAgICAgIHRoaXMuVG90QXZnT2JqW2VsZW1lbnQudHJpbSgpXSA9IHRoaXMuY3MubnVtYmVydG9maXhlZCh0b3RhbCwgMik7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgbW9kaWZ5U2VhcmNoKCkge1xyXG4gICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ0JJY2FsbCcsICdCSW1vZGlmeScpO1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3RoaXMubW9kdWxlbmFtZSArICcvYW5hbHlzaXMtc2VhcmNoLycgKyB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ11dKTtcclxuICB9XHJcbiAgYW5hU3R0TGJsID0gW107XHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICAvLyB0aGlzLkxpZ2h0ZW5EYXJrZW5Db2xvcihcIjdjYjVlY1wiLCAxMCk7XHJcbiAgICBsZXQgbWRsayA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ21kbEtleScpKTtcclxuICAgIHRoaXMuY09iaiA9IHt9O1xyXG4gICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG5cclxuICAgIHRoaXMucmVxaGVhZGVyID0ge1xyXG4gICAgICAnY2xpZW50a2V5JzogQ29va2llLmdldCgnX2NrJyksXHJcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXHJcbiAgICAgICdtb2R1bGVrZXknOiBtZGxrW3RoaXMuY1VybC5zcGxpdCgnLycpWzFdXSxcclxuICAgICAgJ2xvZ2luaWQnOiBDb29raWUuZ2V0KCdfbG9naWQnKSxcclxuICAgICAgJ3NvdXJjZSc6ICdxcydcclxuICAgIH07XHJcbiAgICB0aGlzLnZpZXdkaXNUeXBlID0gXCJncm91cFwiO1xyXG4gICAgdGhpcy5uZXd3aW5kb3cgPSBcIllFU1wiO1xyXG4gICAgdGhpcy5ncnAgPSBbXTtcclxuICAgIHRoaXMubG9hZFJlc3VsdCA9IFtdO1xyXG4gICAgdGhpcy5zdGFydEluZGV4ID0gMDtcclxuICAgIHRoaXMuZW5kSW5kZXggPSAzMDtcclxuICAgIHRoaXMuY1VybCA9IHRoaXMucm91dGVyLnVybDtcclxuICAgIHRoaXMubW9kdWxlbmFtZSA9IHRoaXMuY1VybC5zcGxpdCgnLycpWzFdO1xyXG4gICAgdGhpcy5jayA9IGVuY29kZVVSSUNvbXBvbmVudChDb29raWUuZ2V0KCdfY2snKSk7XHJcbiAgICB0aGlzLnJvdXRlLnBhcmFtcy5zdWJzY3JpYmUobWFwID0+IHtcclxuICAgICAgdGhpcy5sb2FkRGVmaW5hdGlvbigpO1xyXG4gICAgICBsZXQgdmlld1R5cGUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndmlld1R5cGUnKTtcclxuICAgICAgbGV0IGFuYUFyciA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJYW5hU3R0JykpO1xyXG4gICAgICBsZXQgYW5hc3R0TGJsID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklhbmFTdHRMQkwnKSk7XHJcbiAgICAgIGlmIChhbmFBcnIgIT0gbnVsbCkge1xyXG4gICAgICAgIHRoaXMuYW5hQWxsR3JwU3R0ID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnQklhbmFTdHQnKSk7XHJcbiAgICAgICAgdGhpcy5hbmFTdHRMYmwgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSWFuYVN0dExCTCcpKTtcclxuICAgICAgICB0aGlzLmFuYUFsbEdycFN0dC5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zdE9ialtlbGVtZW50XSA9IHRydWU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZpZXdUeXBlID09ICdsaXN0VmlldycpIHtcclxuICAgICAgICB0aGlzLmdldFNlYXJjaFJlc3VsdCgpO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIGxldCBwa3RzID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncGt0RGF0YScpKTtcclxuICAgICAgICB0aGlzLmhlYWRlcktleSA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3Jlc3VsdFZpZXcnKSk7XHJcbiAgICAgICAgdGhpcy5oZWFkZXIgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZXN1bHRWaWV3RHRsJykpO1xyXG4gICAgICAgIHRoaXMuaGVhZGVyID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVzdWx0Vmlld0R0bCcpKTtcclxuICAgICAgICBsZXQgbGVnZW5kcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJTGVnZW5kcycpKTtcclxuICAgICAgICBpZiAobGVnZW5kcyAhPSBudWxsICYmIGxlZ2VuZHMgIT0gdW5kZWZpbmVkICYmIGxlZ2VuZHMgIT0gXCJcIikge1xyXG4gICAgICAgICAgdGhpcy5sZWdlbmRMaXN0ID0gbGVnZW5kcztcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5wa3RzID0gWy4uLnBrdHNdO1xyXG5cclxuICAgICAgICB0aGlzLnRvdGFsV2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcblxyXG4gICAgICAgIHRoaXMuZ2V0U3VtbWFyeSh0aGlzLnBrdHMpO1xyXG5cclxuICAgICAgICAvLyAgbGV0IHRvdEFtdCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5wa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5zYWxfcmVjX3J0ZSAqIHBhcnNlRmxvYXQoYi5jcnR3dCksIDApKTtcclxuICAgICAgICBsZXQgdG90d2VpZ2h0ID0gdGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbCh0aGlzLnBrdHMucmVkdWNlKChhLCBiKSA9PiArYSArICtwYXJzZUZsb2F0KGIuY3J0d3QpLCAwKSk7XHJcbiAgICAgICAgbGV0IHRvdHJhcFZhbCA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodGhpcy5wa3RzLnJlZHVjZSgoYSwgYikgPT4gK2EgKyArYi5yYXBfdmx1LCAwKSk7XHJcblxyXG4gICAgICAgIGxldCB0b3RBbXQgPSAwO1xyXG4gICAgICAgIHRoaXMucGt0cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xyXG4gICAgICAgICAgaWYgKGVsZW1lbnQuZ3JwX3N0dCA9PSAnc29sZCcpIHtcclxuICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsnc2FsX3J0ZSddKSAqIHBhcnNlRmxvYXQoZWxlbWVudFsnY3J0d3QnXSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdG90QW10ICs9IHBhcnNlRmxvYXQoZWxlbWVudFsncnRlJ10pICogcGFyc2VGbG9hdChlbGVtZW50WydjcnR3dCddKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuXHJcblxyXG5cclxuICAgICAgICB0aGlzLnRvdEF2ZyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwodG90QW10IC8gcGFyc2VGbG9hdCh0b3R3ZWlnaHQpKTtcclxuICAgICAgICB0aGlzLnRvdERpcyA9IHRoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoKCh0b3RBbXQgKiAxMDApIC8gcGFyc2VGbG9hdCh0b3RyYXBWYWwpKSAtIDEwMCk7XHJcblxyXG5cclxuICAgICAgICB0aGlzLnJlc3VsdGxlbmd0aCA9IHRoaXMucGt0cy5sZW5ndGg7XHJcbiAgICAgICAgaWYgKHRoaXMuZW5kSW5kZXggPiB0aGlzLnJlc3VsdGxlbmd0aClcclxuICAgICAgICAgIHRoaXMuZW5kSW5kZXggPSB0aGlzLnJlc3VsdGxlbmd0aFxyXG4gICAgICAgIHRoaXMuYWRkSXRlbXMoKTtcclxuXHJcblxyXG4gICAgICB9XHJcblxyXG4gICAgfSk7XHJcbiAgICBsZXQgR1JQYnkgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdCSS1QS1RfR1JPVVBfQlknKSkgfHwgJyc7XHJcbiAgICB0aGlzLmdldFN0YXRpY0tWKEdSUGJ5KTtcclxuICAgIC8vICB0aGlzLmNyZWF0ZUdycCh0aGlzLnBrdHMsIHRoaXMuZGVmYXVsdEdycExpc3QpO1xyXG4gICAgbGV0IGF2Z0ZpZWxkcyA9IEpTT04ucGFyc2UobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ0JJLWdyaWRBdmcnKSkgfHwgJyc7XHJcbiAgICBpZiAoYXZnRmllbGRzICE9ICcnKVxyXG4gICAgICB0aGlzLmdldFRvdGFscyhhdmdGaWVsZHMsIHRoaXMucGt0cyk7XHJcbiAgfVxyXG4gIGdldFN0YXRpY0tWKHFyeSkge1xyXG4gICAgdGhpcy5zdGF0aWNMb3YgPSBbXTtcclxuICAgIGxldCBhcnJrdiA9IHFyeS5zcGxpdCgnLCcpO1xyXG4gICAgbGV0IG9iaiA9IHt9LCBzdGF0aWNMb3YgPSBbXTtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJya3YubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgbGV0IGtleSA9IGFycmt2W2ldLCB2YWx1ZSA9IGFycmt2W2kgKyAxXTtcclxuICAgICAgb2JqWydrJ10gPSBrZXk7XHJcbiAgICAgIG9ialsndiddID0gdmFsdWU7XHJcbiAgICAgIC8vIGlmIChpID09IDApIHtcclxuICAgICAgLy8gICBxcnkuZGVmYXVsdF92YWx1ZSA9IHZhbHVlOy8va2V5XHJcbiAgICAgIC8vIH1cclxuICAgICAgdGhpcy5zdGF0aWNMb3YucHVzaChvYmopO1xyXG4gICAgICBvYmogPSB7fTtcclxuICAgIH1cclxuICAgIHRoaXMuc3RhdGljTG92ID0gdGhpcy5zdGF0aWNMb3YubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICB2YWx1ZTogb3B0aW9uLnYsXHJcbiAgICAgIGxhYmVsOiBvcHRpb24ua1xyXG4gICAgfSkpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zdGF0aWNMb3YpO1xyXG4gIH1cclxuXHJcbiAgbG9hZERlZmluYXRpb24oKSB7XHJcblxyXG4gICAgdGhpcy5fc3Bpbm5lclNlcnZpY2Uuc2hvdygpO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtc1snZnJtbm1lJ107Ly8nc2VhcmNoRHRsRHNjckZvcm0nO1xyXG4gICAgdGhpcy5yZXFoZWFkZXJbJ21ldGhvZCddID0gJ2xvYWREZWZpbmF0aW9uJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMucmVxaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdtYXJrZXRpbmcvc2VhcmNoJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGxldCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQ7XHJcbiAgICAgICAgdGhpcy5wYWdlRGVmaW5hdGlvbiA9IHJlc3VsdC5wYWdlRGVmaW5hdGlvbiB8fCB7fTtcclxuICAgICAgICB0aGlzLmxpbmtzID0gdGhpcy5wYWdlRGVmaW5hdGlvbi5saW5rIHx8IFtdO1xyXG5cclxuICAgICAgICB0aGlzLl9zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5fc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iLCI8ZGl2IGNsYXNzPVwibXRcIj5cclxuICA8ZGl2IGNsYXNzPVwicGFuZWwgcGFuZWwtZGVmYXVsdFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmdcIj5cclxuICAgICAgPGgzIGNsYXNzPVwicGFuZWwtdGl0bGVcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImZhIGZhLWNoZXZyb24tbGVmdCBjcFwiIChjbGljayk9XCJjcy5wYWdlQmNrKCk7XCI+IEJhY2s8L3NwYW4+Jm5ic3A7Jm5ic3A7Jm5ic3A7IFBhY2tldCBMaXN0XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmLTEyXCI+KHt7Y3MuY0RhdGUgfCBkYXRlOiAnbWVkaXVtJ319KTwvc3Bhbj5cclxuICAgICAgPC9oMz5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5uZXJEXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWZyYW1lLWxlZnRcIiAqbmdJZj1cImZhbHNlXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1ib2R5XCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImxpc3QtZ3JvdXAgYm9yZGVyLWJvdHRvbVwiPlxyXG4gICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiBjbGFzcz1cImxpc3QtZ3JvdXAtaXRlbVwiIFtuZ0NsYXNzXT1cInsnYWN0aXZlJyA6aSA9PSBjTGlua31cIiAqbmdGb3I9XCJsZXQgbmF2IG9mIG5hdmlnYXRpb247bGV0IGk9aW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRpb25GdW4obmF2LGkpO1wiPnt7bmF2LmZvcm1fZmllbGRfdGl0bGV9fSA8L2E+XHJcbiAgICAgICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWUtYm9keVwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6MFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwYW5lbCBwYW5lbC1kZWZhdWx0IGN1c3RvbS1wYW5lbFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInBhbmVsLWJvZHlcIiBzdHlsZT1cInBhZGRpbmc6MDtcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImluZm9TZWNcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cclxuICAgICAgICAgICAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWlubGluZSBwdWxsLWxlZnRcIj5cclxuICAgICAgICAgICAgICAgICAgPC9mb3JtPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLXNtLTZcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duIHRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIHN0eWxlPVwibWFyZ2luLWJvdHRvbTogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgIDx0YWJsZSBjbGFzcz1cImRpc3BsYXlUYWJsZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPlN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+Q291bnQ8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkN0czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+QXZnPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPkRpc2M8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkFtb3VudDwvdGg+XHJcblxyXG4gICAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Qgb2YgYW5hQWxsR3JwU3R0O2xldCBpID0gaW5kZXg7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIDxsYWJlbCBmb3I9XCJ7e3N0fX1cIiBjbGFzcz1cInRleHQtY2FwaXRhbGl6ZVwiPlM8L2xhYmVsPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICpuZ0lmPVwiZGVmYXVsdEdycExpc3QubGVuZ3RoPT0wXCIgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0ICpuZ0lmPVwiZGVmYXVsdEdycExpc3QubGVuZ3RoPT0wXCIgdHlwZT1cImNoZWNrYm94XCIgaWQ9XCJ7e3N0fX1cIiB2YWx1ZT1cInt7c3R9fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3tzdH19XCIgWyhuZ01vZGVsKV09XCJzdE9ialtzdF1cIiBbY2hlY2tlZF09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwic3RhdHVzV2lzZURpc3BsYXkoJGV2ZW50LHN0T2JqKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3thbmFTdHRMYmxbaV18fHN0fX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhbmFTdHRMYmwgLS0+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4ge3tzdHRXaXNlU3VtbWFyeT8uZ2V0KHN0KT8uZ2V0KCdjb3VudCcpfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+IHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KHN0KT8uZ2V0KCd3dCcpKX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPiB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldChzdCk/LmdldCgnYXZnJykpfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj4ge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ2Rpc2MnKSl9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZD4ge3t0aGlzLmNzLnNwbGl0VG9Ud29EZWNpbWFsKHN0dFdpc2VTdW1tYXJ5Py5nZXQoc3QpPy5nZXQoJ3JhdGUnKSl9fTwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIFxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtY29udHJvbFwiIG5hbWU9XCJ2aWV3ZGlzVHlwZVwiIChjaGFuZ2UpPVwib25HcnBTZWxlY3QoZGVmYXVsdEdycExpc3QpXCIgWyhuZ01vZGVsKV09XCJ2aWV3ZGlzVHlwZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJncm91cFwiPkdyb3VwIEJ5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cInN1bW1hcnlcIj5TdW1tYXJ5IEJ5PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBHcm91cFwiIFtvcHRpb25zXT1cInN0YXRpY0xvdlwiIFsobmdNb2RlbCldPVwiZGVmYXVsdEdycExpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInN0YXR1c1wiIFttdWx0aXBsZV09XCJ0cnVlXCIgW2FsbG93Q2xlYXJdPVwidHJ1ZVwiIChzZWxlY3RlZCk9XCJvbkdycFNlbGVjdChkZWZhdWx0R3JwTGlzdClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgKGRlc2VsZWN0ZWQpPVwib25HcnBTZWxlY3QoZGVmYXVsdEdycExpc3QpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI29wdGlvblRlbXBsYXRlIGxldC1vcHRpb249XCJvcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZhbWZhbWZhbS1mbGFncyB7e29wdGlvbj8udmFsdWUudG9Mb3dlckNhc2UoKX19XCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7b3B0aW9uPy5sYWJlbH19XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPHA+XHJcbiAgICAgICAgICAgICAgICA8Yj5CdXllciBQaWUgY2hhcnQ8L2I+XHJcbiAgICAgICAgICAgICAgICA8aSB0aXRsZT1cIkJ1eWVyIHdpc2UgcGllIGNoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7cGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAyMHB4O2NvbG9yOiAjM2E1ODk4O1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXRhcmdldD1cIiNQaWVjaGFydE1vZGVsXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKCdidXllcicsJ3ZhbHVlJylcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICBcclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPHAgKm5nSWY9XCJkZWZhdWx0R3JwTGlzdC5sZW5ndGg+MFwiPlxyXG4gICAgICAgICAgICAgICAgPGkgdGl0bGU9XCJHcm91cCB3aXNlIGNoYXJ0XCJcclxuICAgICAgICAgICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXI7cGFkZGluZzogNXB4O21hcmdpbi1sZWZ0OiAxMHB4OyB0ZXh0LWFsaWduOiBjZW50ZXI7Zm9udC1zaXplOiAyMHB4O2NvbG9yOiAjM2E1ODk4O1wiXHJcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImZhIGZhLXBpZS1jaGFydFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiIGRhdGEtdG9nZ2xlPVwibW9kYWxcIlxyXG4gICAgICAgICAgICAgICAgICBkYXRhLXRhcmdldD1cIiNQaWVjaGFydE1vZGVsXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKCdncm91cCcsJ3ZhbHVlJylcIj48L2k+XHJcbiAgICAgICAgICAgICAgPC9wPlxyXG4gICAgICAgICAgICAgIDx1bCBjbGFzcz1cImN1bFwiPlxyXG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBsZWdlbmQgb2YgbGVnZW5kTGlzdFwiPlxyXG4gICAgICAgICAgICAgICAgICA8cFxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnYmFja2dyb3VuZC1jb2xvcic6IGxlZ2VuZC5rICwnaGVpZ2h0JzonOXB4JywgJ3dpZHRoJzonOXB4JywgJ21hcmdpbic6ICcwJywgJ2Rpc3BsYXknIDogJ2lubGluZS1ibG9jayd9XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvcD5cclxuICAgICAgICAgICAgICAgICAge3tsZWdlbmQudn19XHJcbiAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTMgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1pbmxpbmUgcHVsbC1yaWdodFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWUyXCI+U2VhcmNoICZuYnNwOyZuYnNwOzwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgaWQ9XCJleGFtcGxlSW5wdXROYW1lMlwiIG5hbWU9XCJzY2h0eHRcIiBbKG5nTW9kZWwpXT1cInNlYXJjaEZcIiAvPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgc3R5bGU9XCJwYWRkaW5nOiA0cHggMTVweCA0cHggMjBweDttYXJnaW4tbGVmdDogMTBweDtmbG9hdDogcmlnaHQ7XCJcclxuICAgICAgICAgICAgICAgICAgZGF0YS10b2dnbGU9XCJ0b29sdGlwXCIgZGF0YS1wbGFjZW1lbnQ9XCJsZWZ0XCIgdGl0bGU9XCJEb3dubG9hZCBFeGNlbFwiXHJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJleHBvcnRUb0NTVignUGFja2V0IGxpc3QnKTtcIj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIiBzdHlsZT1cImNvbG9yOmdyZWVuO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG5cclxuICAgICAgICAgICAgICA8L2Zvcm0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgXHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OiA1cHg7XCIgKGNsaWNrKT1cIm1vZGlmeVNlYXJjaCgpXCI+TW9kaWZ5XHJcbiAgICAgICAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJjdWxcIj5cclxuICAgICAgICAgICAgICAgIDxsaSAqbmdGb3I9XCJsZXQgbGVnZW5kIG9mIGxlZ2VuZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgPHBcclxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7J2JhY2tncm91bmQtY29sb3InOiBsZWdlbmQuayAsJ2hlaWdodCc6JzlweCcsICd3aWR0aCc6JzlweCcsICdtYXJnaW4nOiAnMCcsICdkaXNwbGF5JyA6ICdpbmxpbmUtYmxvY2snfVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICAgIHt7bGVnZW5kLnZ9fVxyXG4gICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICA8L3VsPiBcclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIC0tPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInZpZXdkaXNUeXBlPT0nZ3JvdXAnXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cImdyb3VwQnlwa3RMaXN0Lmxlbmd0aCA+MFwiIGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIGlkPVwid3JhcFwiIHN0eWxlPVwib3ZlcmZsb3c6IGF1dG87d2lkdGg6IDEwMCU7aGVpZ2h0OiBjYWxjKDEwMHZoIC0gMjUwcHgpO1wiXHJcbiAgICAgICAgICAgICAgICAgIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgICAgIFtpbmZpbml0ZVNjcm9sbFRocm90dGxlXT1cIjUwXCIgKHNjcm9sbGVkKT1cImdyb3Vwb25TY3JvbGxEb3duKClcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNUaFwiIHN0eWxlPVwid2lkdGg6NzVweDtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgRE5BPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+U3RhdHVzPC90aD5cclxuICAgICAgICAgICAgICAgICAgICA8dGggKGNsaWNrKT1cInNvcnRCeShocmRLZXksZylcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiAqbmdGb3I9XCJsZXQgaHJkS2V5IG9mIGhlYWRlcktleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAge3toZWFkZXJbaHJkS2V5XX19XHJcbiAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICA8L3RoZWFkPlxyXG4gICAgICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGdyb3VwZHRsIG9mIGxvYWRncm91cEJ5cGt0TGlzdCBsZXQgaj1pbmRleDtcIj5cclxuICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIFthdHRyLmNvbHNwYW5dPVwiaGVhZGVyS2V5Lmxlbmd0aCsxXCIgc3R5bGU9XCJmb250LXdlaWdodDpib2xkO3RleHQtYWxpZ246IGxlZnQ7IFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e2dyb3VwZHRsLnZhbHVlfX0gJm5ic3A7ICZuYnNwO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgUXR5IDoge3tncm91cGR0bFsnY291bnQnXX19ICZuYnNwOyAmbmJzcDsgQ2FyYXRzIDpcclxuICAgICAgICAgICAgICAgICAgICAgICAge3tncm91cGR0bFsnY3J0d3QnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyAmbmJzcDsgQXZnIDp7e2dyb3VwZHRsWydzYWxhdmcnXX19XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyAmbmJzcDsgRGlzJSA6IHt7Z3JvdXBkdGxbJ3NhbGRpcyddfX1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICZuYnNwOyZuYnNwOyBBbW91bnQgOiB7e2dyb3VwZHRsWydzYWx2bHUnXX19IFxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPiBcclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDx0ciAqbmdJZj1cInN0dHdpc2VcIiA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCJoZWFkZXJLZXkubGVuZ3RoKzFcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OmJvbGQ7dGV4dC1hbGlnbjogbGVmdDsgXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7Z319ICZuYnNwOyAmbmJzcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgUXR5IDoge3tmaW5hbEdycFZhbFtnXS5sZW5ndGh9fSAmbmJzcDsgJm5ic3A7IENhcmF0cyA6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHt7dG90YWxXZWlnaHR9fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7Jm5ic3A7IEFtb3VudCA6e3t0b3RBbXR9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPiAtLT5cclxuXHJcblxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IHBrdGR0bCBvZiBncm91cGR0bFsncGt0TGlzdCddIHwgdGFibGVTZWFyY2g6c2VhcmNoRjpwa3RzO2xldCBwa3RpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydldmVuJzpwa3RpJTI9PTAsJ29kZCc6cGt0aSUyPT0xfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwid2lkdGg6NzVweDtwb3NpdGlvbjogcmVsYXRpdmU7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cImh0dHBzOi8va2FwdWdlbXMuY29tL2t3ZWIvIy9kbmEve3twa3RkdGwuc3RvY2tfaWRufX0vP2tleT17e2NrfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRpYW1vbmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIHZhbHVlPVwie3twa3RkdGwuc3RvY2tfaWRufX1cIiBbaGlkZGVuXT1cInRydWVcIiBpZD1cImNiX3t7cGt0ZHRsLnN0b2NrX2lkbn19XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tlZFJvdyhwa3RkdGwscGt0ZHRsLnN0b2NrX2lkbiwkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dH1cIj57e3BrdGR0bC5kc3Bfc3R0fX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaHJkS2V5IG9mIGhlYWRlcktleVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJocmRLZXkhPSdjbycgJiYgaHJkS2V5IT0ncHUnXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5XX19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdjbydcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5K1wiX3BcIl19fTwvdGQ+XHJcblxyXG5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdwdSdcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieydjb2xvcic6IHBrdGR0bC5kc3Bfc3R0X2NvbG9yID09ICcjRkZGRkZGJyA/ICdibGFjayc6cGt0ZHRsLmRzcF9zdHRfY29sb3J9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAge3twa3RkdGxbaHJkS2V5K1wiX3BcIl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwicGt0cy5sZW5ndGggPiAwICYmIGdyb3VwQnlwa3RMaXN0Lmxlbmd0aD09MCBcIiBjbGFzcz1cInRhYmxlLXJlc3BvbnNpdmVcIiBpZD1cIndyYXBcIiBzdHlsZT1cIm92ZXJmbG93OiBhdXRvO3dpZHRoOiAxMDAlO2hlaWdodDogY2FsYygxMDB2aCAtIDI1MHB4KTtcIlxyXG4gICAgICAgICAgICAgIGluZmluaXRlLXNjcm9sbCBbaW5maW5pdGVTY3JvbGxEaXN0YW5jZV09XCJzY3JvbGxEaXN0YW5jZVwiIFtpbmZpbml0ZVNjcm9sbFVwRGlzdGFuY2VdPVwic2Nyb2xsVXBEaXN0YW5jZVwiXHJcbiAgICAgICAgICAgICAgW2luZmluaXRlU2Nyb2xsVGhyb3R0bGVdPVwiNTBcIiAoc2Nyb2xsZWQpPVwib25TY3JvbGxEb3duKClcIiBbc2Nyb2xsV2luZG93XT1cImZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCI+XHJcbiAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0aCBjbGFzcz1cImNUaFwiIHN0eWxlPVwid2lkdGg6NzVweDtcIiAqbmdJZj1cImZvcm1uYW1lIT0nbWl4QW5hbHlzaXNSZXBvcnRGb3JtJ1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgRE5BPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aD4gXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbnNcclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlN0YXR1czwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+e3toZWFkZXJbaHJkS2V5XX19PC90aD5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgIDx0ZD48L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQ+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkPjxiPkF2ZXJhZ2UgPC9iPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGhyZEtleSBvZiBoZWFkZXJLZXlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Yj57e2NzLnNwbGl0VG9Ud29EZWNpbWFsKFRvdEF2Z09ialtocmRLZXldKX19PC9iPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICBcclxuICAgICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDx0ciAqbmdGb3I9XCJsZXQgcGt0ZHRsIG9mIGxvYWRSZXN1bHQgfCB0YWJsZVNlYXJjaDpzZWFyY2hGOnBrdHM7bGV0IHBrdGkgPSBpbmRleFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydldmVuJzpwa3RpJTI9PTAsJ29kZCc6cGt0aSUyPT0xfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cIndpZHRoOjc1cHg7cG9zaXRpb246IHJlbGF0aXZlO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiaHR0cHM6Ly9rYXB1Z2Vtcy5jb20va3dlYi8jL2RuYS97e3BrdGR0bC5zdG9ja19pZG59fS8/a2V5PXt7Y2t9fVwiIHRhcmdldD1cIl9ibGFua1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWRpYW1vbmRcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgdmFsdWU9XCJ7e3BrdGR0bC5zdG9ja19pZG59fVwiIFtoaWRkZW5dPVwidHJ1ZVwiIGlkPVwiY2Jfe3twa3RkdGwuc3RvY2tfaWRufX1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2hlY2tlZFJvdyhwa3RkdGwscGt0ZHRsLnN0b2NrX2lkbiwkZXZlbnQudGFyZ2V0LmNoZWNrZWQpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQ+IFxyXG4gICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAgKm5nRm9yPVwibGV0IGxuayBvZiBsaW5rc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwie3tsbmsuZm9ybV9maWVsZF9pY29ufX1cIiAqbmdJZj1cInBrdGR0bC5kc3Bfc3R0IT0nc29sZCdcIiAoY2xpY2spPVwiT25MaW5rQ2xpY2sobG5rLHBrdGR0bClcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgJm5ic3A7XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIiBbbmdTdHlsZV09XCJ7J2NvbG9yJzogcGt0ZHRsLmRzcF9zdHR9XCI+e3twa3RkdGwuZHNwX3N0dH19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBocmRLZXkgb2YgaGVhZGVyS2V5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKm5nSWY9XCJocmRLZXkhPSdjbycgJiYgaHJkS2V5IT0ncHUnXCIgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXldfX08L3RkPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyXCIgKm5nSWY9XCJocmRLZXk9PSdjbydcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXJcIiAgKm5nSWY9XCJocmRLZXk9PSdwdSdcIiAoY2xpY2spPVwic2VsZWN0Um93KHBrdGR0bC5zdG9ja19pZG4pO1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnY29sb3InOiBwa3RkdGwuZHNwX3N0dF9jb2xvciA9PSAnI0ZGRkZGRicgPyAnYmxhY2snOnBrdGR0bC5kc3Bfc3R0X2NvbG9yfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7e3BrdGR0bFtocmRLZXkrXCJfcFwiXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ2aWV3ZGlzVHlwZT09J3N1bW1hcnknICYmIHN1bW1hcnlMaXN0Lmxlbmd0aD4wXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEyXCI+IDxidXR0b24gIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCJcclxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cInBhZGRpbmc6IDRweCAxNXB4IDRweCAyMHB4O21hcmdpbi1sZWZ0OiAxMHB4O1wiIGRhdGEtdG9nZ2xlPVwidG9vbHRpcFwiIGRhdGEtcGxhY2VtZW50PVwicmlnaHRcIlxyXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwiRG93bmxvYWQgRXhjZWxcIiAoY2xpY2spPVwiZXhwb3J0VG9DU1ZTdW1tYXJ5KCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1maWxlLWV4Y2VsLW9cIiBzdHlsZT1cImNvbG9yOmdyZWVuO1wiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+PC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8dGFibGUgY2xhc3M9XCJkaXNwbGF5VGFibGVcIiBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtwYWRkaW5nOjEwcHggO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dHIgY2xhc3M9XCJwb3NyZWxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+U3IuIE5vPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8dGggc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+QXR0cmlidXRlPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiIGNvbHNwYW49XCI1XCI+e3toZHJ9fTwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ciBjbGFzcz1cInBvc3JlbFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaGRyIG9mIGhlYWRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5RdHk8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+Q2FyYXQ8L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+QXZnPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+RGlzPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlZhbHVlPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBzdW1tYXJ5RHRsIG9mIHN1bW1hcnlMaXN0IHwgdGFibGVTZWFyY2g6c2VhcmNoRjpwa3RzO2xldCBwa3RpID0gaW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnZXZlbic6cGt0aSUyPT0wLCdvZGQnOnBrdGklMj09MX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3twa3RpKzF9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsndmFsdWUnXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBoZHIgb2YgaGVhZExpc3RcIj5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+e3tzdW1tYXJ5RHRsWydjb3VudF8nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPnt7c3VtbWFyeUR0bFsnY3J0d3RfJytoZHJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3N1bW1hcnlEdGxbJ2F2Z18nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+e3tzdW1tYXJ5RHRsWydkaXNfJytoZHJdfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj57e3N1bW1hcnlEdGxbJ3ZsdV8nK2hkcl19fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+IFxyXG5cclxuICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgPC90YWJsZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbjwvZGl2PlxyXG5cclxuICAgICAgICAgIFxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImFjdGlvbkZvb3RlclwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhbHNlYyBwdWxsLWxlZnRcIiBzdHlsZT1cInBhZGRpbmc6IDVweDtcIj5cclxuICAgICAgICAgIDx0YWJsZT5cclxuICAgICAgICAgICAgPHRyPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IFRvdGFsOiAmbmJzcDsgPC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICB7e2ZpbmFsR3JwVmFsW1wiXCJdPy5sZW5ndGg+MCA/IGZpbmFsR3JwVmFsW1wiXCJdPy5sZW5ndGggOiBwa3RzPy5sZW5ndGh9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gV2VpZ2h0OiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3RvdGFsV2VpZ2h0fX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IEF2ZzombmJzcDs8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90QXZnfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCIgKm5nSWY9XCJmb3JtbmFtZSE9J21peEFuYWx5c2lzUmVwb3J0Rm9ybSdcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IERpczombmJzcDs8L3N0cm9uZz4gPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7dG90RGlzfX0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPlxyXG5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBBbW91bnQ6Jm5ic3A7PC9zdHJvbmc+IDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3RvdEFtdH19PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gJm5ic3A7Jm5ic3A7Jm5ic3A7fCAmbmJzcDsmbmJzcDtTZWxlY3RlZCBQa3RzIDogPC9zdHJvbmc+IDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdGVkSXRtPy5sZW5ndGh9fSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+XHJcblxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj5cclxuICAgICAgICAgICAgICAgIDxzdHJvbmc+IFdlaWdodDombmJzcDs8L3N0cm9uZz5cclxuICAgICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZCBzdHlsZT1cInRleHQtYWxpZ246IGNlbnRlcjtcIj4ge3tzZWxlY3R3dH19Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPlxyXG4gICAgICAgICAgICAgICAgPHN0cm9uZz4gQXZnOiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdEF2Z319Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuXHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiZm9ybW5hbWUhPSdtaXhBbmFseXNpc1JlcG9ydEZvcm0nXCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBEaXNjOiZuYnNwOzwvc3Ryb25nPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiPiB7e3NlbGVjdERpc319Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICAgICAgICA8c3Ryb25nPiBBbW91bnQ6Jm5ic3A7PC9zdHJvbmc+XHJcbiAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICA8dGQgc3R5bGU9XCJ0ZXh0LWFsaWduOiBjZW50ZXI7XCI+IHt7c2VsZWN0QW10fX08L3RkPlxyXG5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgIDwvdGFibGU+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgc3R5bGU9XCJtYXJnaW4tcmlnaHQ6IDgwcHg7XCIgKGNsaWNrKT1cIm1vZGlmeVNlYXJjaCgpXCI+TW9kaWZ5XHJcbiAgICAgICAgICAgIFNlYXJjaDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cIlBpZWNoYXJ0TW9kZWxcIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtbGFiZWxsZWRieT1cImV4YW1wbGVNb2RhbExhYmVsXCJcclxuICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHJvbGU9XCJkb2N1bWVudFwiICA+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1haWxNb2RhbEhlYWRcIj5Ub3Age3t0eXBlfX0gUGllIENoYXJ0PC9oND5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiID5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBpZD1cImJ0blF0eVwiIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgdHlwZT1cImJ1dHRvblwiIChjbGljayk9XCJnZW5lcmF0ZVBpZShkYXRhVHlwZSwncXR5JylcIj5RVFkgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwiYnRuVmFsXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImdlbmVyYXRlUGllKGRhdGFUeXBlLCd2YWx1ZScpXCI+VkFMVUUgPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciByb3dcIiAqbmdJZj1cImlzQnV5ZXJ3aXNlXCIgPlxyXG4gICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb250cm9sLWxhYmVsXCI+PGI+Jm5ic3A7Jm5ic3A7ICZuYnNwO1RvdGFsIHNvbGQgdmFsdWU6XHJcbiAgICAgICAgICAgICAgICB7e3RoaXMuY3Muc3BsaXRUb1R3b0RlY2ltYWwoc3R0V2lzZVN1bW1hcnk/LmdldCgnc29sZCcpPy5nZXQoJ3JhdGUnKSl9fTwvYj48L2xhYmVsPlxyXG4gICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJkb3VnaG51dENoYXJ0RGF0YVwiICBbbGFiZWxzXT1cImRvdWdobnV0Q2hhcnRMYWJlbHNcIiAgW2xlZ2VuZF09XCJwaWVDaGFydExlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW2NvbG9yc109XCJjaGFydENvbG9yc1wiICBbY2hhcnRUeXBlXT1cImRvdWdobnV0Q2hhcnRUeXBlXCIgW29wdGlvbnNdPVwicGllXCI+PC9jYW52YXM+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgXHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWZvb3RlciByb3dcIiAqbmdJZj1cImlzR3Jwd2lzZVwiICA+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj48Yj4mbmJzcDsmbmJzcDsgJm5ic3A7VG90YWwgc29sZCB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KCdzb2xkJyk/LmdldCgncmF0ZScpKX19PC9iPjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxjYW52YXMgYmFzZUNoYXJ0IFtkYXRhXT1cImRvdWdobnV0Q2hhcnREYXRhXCIgW2xhYmVsc109XCJkb3VnaG51dENoYXJ0TGFiZWxzXCIgW2xlZ2VuZF09XCJwaWVDaGFydExlZ2VuZFwiXHJcbiAgICAgICAgICAgICAgW2NoYXJ0VHlwZV09XCJkb3VnaG51dENoYXJ0VHlwZVwiIFtvcHRpb25zXT1cInBpZVwiPjwvY2FudmFzPlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIFxyXG5cclxuICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cImNhcmQtZm9vdGVyIHJvd1wiICpuZ0lmPVwiaXNRdHlXaXNlXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj48Yj4mbmJzcDsmbmJzcDsgJm5ic3A7VG90YWwgc29sZCB2YWx1ZTpcclxuICAgICAgICAgICAgICAgIHt7dGhpcy5jcy5zcGxpdFRvVHdvRGVjaW1hbChzdHRXaXNlU3VtbWFyeT8uZ2V0KCdzb2xkJyk/LmdldCgnY291bnQnKSl9fTwvYj48L2xhYmVsPlxyXG4gICAgICAgICAgICA8Y2FudmFzIGJhc2VDaGFydCBbZGF0YV09XCJkb3VnaG51dENoYXJ0RGF0YVwiIFtsYWJlbHNdPVwiZG91Z2hudXRDaGFydExhYmVsc1wiIFtsZWdlbmRdPVwicGllQ2hhcnRMZWdlbmRcIlxyXG4gICAgICAgICAgICAgIFtjaGFydFR5cGVdPVwiZG91Z2hudXRDaGFydFR5cGVcIiBbb3B0aW9uc109XCJwaWVcIj48L2NhbnZhcz5cclxuICAgICAgICAgIDwvZGl2PiAtLT5cclxuXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBidG4tc21cIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPkNsb3NlPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbCBmYWRlXCIgaWQ9XCJiaWRNZFwiIHRhYmluZGV4PVwiLTFcIiBzdHlsZT1cInotaW5kZXg6IDE0MDBcIiByb2xlPVwiZGlhbG9nXCJcclxuICBhcmlhLWxhYmVsbGVkYnk9XCJleGFtcGxlTW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2dcIiByb2xlPVwiZG9jdW1lbnRcIj5cclxuICAgIDxmb3JtIG5hbWU9XCJhcHBGb3JtXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGUgdGV4dC11cHBlcmNhc2VcIiBpZD1cImV4YW1wbGVNb2RhbExhYmVsXCI+XHJcbiAgICAgICAgICBQcmljZSBDaGFuZ2U8L2g1PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCIgPlxyXG4gICAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgIFxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwicGFkZGluZzoxMHB4XCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICA8c3BhbiAgc3R5bGU9XCJmb250LXNpemU6IDE2cHg7Zm9udC13ZWlnaHQ6Ym9sZFwiPnt7Y09iaj8ucGt0X2NvZGV9fSB7e2NPYmo/LnNofX0ge3tjT2JqPy5jcnR3dH19IHt7Y09iaj8uY299fSB7e2NPYmo/LnB1fX0ge3tjT2JqPy5jdH19IHt7Y09iaj8ucG99fSAge3tjT2JqPy5zeX19ICB7e2NPYmo/LmZsfX08L3NwYW4+XHJcbiAgICAgICAgICBcclxuXHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDIwcHg7cGFkZGluZy10b3A6IDNweFwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjbGJsXCIgPiBSYXA6ICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+PHNwYW4gY2xhc3M9XCJjbGJsXCI+e3tjT2JqPy5iZW5jaG1hcmtfcnRlfX08L3NwYW4+PC9kaXY+XHJcbiAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPiZuYnNwOzwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCIgc3R5bGU9XCJwYWRkaW5nLWxlZnQ6IDIwcHg7cGFkZGluZy10b3A6IDNweFwiPlxyXG4gICAgICAgICAgIFxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjbGJsXCIgPkRpc2NvdW50OjwvbGFiZWw+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTNcIj5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNsYmxcIj57e2NPYmo/LnJhcF9kaXN9fTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiIHN0eWxlPVwidGV4dC1hbGlnbjogbGVmdDtcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cInRleHRcIiAgKGNoYW5nZSk9XCJjYWxjdWxhdFJ0ZURpcyhjT2JqLCdkaXMnKVwiIHN0eWxlPVwid2lkdGg6MTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJuZXdfcmFwX2Rpc1wiIFsobmdNb2RlbCldPVwiY09ialsnbmV3X3JhcF9kaXMnXVwiIC8+XHJcblxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiIHN0eWxlPVwicGFkZGluZy1sZWZ0OiAyMHB4O3BhZGRpbmctdG9wOiAzcHhcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+XHJcbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2xibFwiIHN0eWxlPVwidGV4dC1hbGlnbjogcmlnaHQ7XCI+UHJpY2U6PC9sYWJlbD5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPlxyXG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2xibFwiPnt7Y09iaj8ucnRlfX08L3NwYW4+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCAgdHlwZT1cInRleHRcIiAgKGNoYW5nZSk9XCJjYWxjdWxhdFJ0ZURpcyhjT2JqLCdydGUnKVwiIHN0eWxlPVwid2lkdGg6MTAwcHhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIG5hbWU9XCJuZXdfcnRlXCIgWyhuZ01vZGVsKV09XCJjT2JqWyduZXdfcnRlJ11cIiAvPlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHRcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiID5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIGFwcEFwcE5vRGJsQ2xpY2tcclxuICAgICAgICAgICAgICAoY2xpY2spPVwiQ2hhbmdlc1ByaWNlKClcIj5VcGRhdGUgUHJpY2U8L2J1dHRvbj5cclxuICAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9mb3JtPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj4gXHJcbjxidXR0b24gaWQ9XCJiaWRNZEJCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjYmlkTWRcIj48L2J1dHRvbj5cclxuXHJcbiAgPGJ1dHRvbiBpZD1cIlBpZWNoYXJ0TW9kZWxCdG5cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjUGllY2hhcnRNb2RlbFwiPjwvYnV0dG9uPlxyXG5cclxuXHJcbjwvZGl2PiJdfQ==
|