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.
Files changed (113) hide show
  1. package/esm2020/ezlibrary_v2.mjs +5 -0
  2. package/esm2020/lib/admin-service/admin-service.service.mjs +36 -0
  3. package/esm2020/lib/analysis-search/analysis-search.component.mjs +1083 -0
  4. package/esm2020/lib/assort-service/assort-service.service.mjs +31 -0
  5. package/esm2020/lib/attribute-definition/attribute-definition.component.mjs +231 -0
  6. package/esm2020/lib/auth/auth.guard.mjs +40 -0
  7. package/esm2020/lib/bi-service/bi.service.mjs +58 -0
  8. package/esm2020/lib/call-info/callinfo.component.mjs +126 -0
  9. package/esm2020/lib/comman-service/comman-service.service.mjs +679 -0
  10. package/esm2020/lib/comman-service/share-data-service.service.mjs +23 -0
  11. package/esm2020/lib/contact-search/contact-search.component.mjs +679 -0
  12. package/esm2020/lib/contact-service/contact-service.service.mjs +47 -0
  13. package/esm2020/lib/ezheader/header.component.mjs +383 -0
  14. package/esm2020/lib/ezlib.module.mjs +220 -0
  15. package/esm2020/lib/file-upload/fileupload.component.mjs +920 -0
  16. package/esm2020/lib/file-upload-log/file-upload-log.component.mjs +175 -0
  17. package/esm2020/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.mjs +14 -0
  18. package/esm2020/lib/fileupload-module/fileupload-routing.module.mjs +28 -0
  19. package/esm2020/lib/footer/footer.component.mjs +18 -0
  20. package/esm2020/lib/globle/common-pdf.service.mjs +28 -0
  21. package/esm2020/lib/globle/globle-env.service.mjs +45 -0
  22. package/esm2020/lib/globle/memo-report.service.mjs +2800 -0
  23. package/esm2020/lib/globle/pdf-service.service.mjs +18848 -0
  24. package/esm2020/lib/globle/shared-services.service.mjs +27 -0
  25. package/esm2020/lib/globle/upload-service.service.mjs +69 -0
  26. package/esm2020/lib/header/header.component.mjs +179 -0
  27. package/esm2020/lib/invalid/invalid.component.mjs +71 -0
  28. package/esm2020/lib/logout/logout.component.mjs +107 -0
  29. package/esm2020/lib/menu-right/menu-right.component.mjs +252 -0
  30. package/esm2020/lib/pipes/number-with-commas.pipe.mjs +24 -0
  31. package/esm2020/lib/pipes/order-by-pipe.pipe.mjs +17 -0
  32. package/esm2020/lib/pipes/selectedCount.mjs +19 -0
  33. package/esm2020/lib/pipes/sum.pipe.mjs +16 -0
  34. package/esm2020/lib/pkt-data/pkt-data.component.mjs +1107 -0
  35. package/esm2020/lib/pricing-service/pricing.service.mjs +58 -0
  36. package/esm2020/lib/qa-analysis/qa-analysis.component.mjs +1035 -0
  37. package/esm2020/lib/report-format/report-format.component.mjs +400 -0
  38. package/esm2020/lib/sessionend/session-end.guard.mjs +28 -0
  39. package/esm2020/lib/stock-service/lazyload.service.mjs +21 -0
  40. package/esm2020/lib/stock-service/stock-service.service.mjs +62 -0
  41. package/esm2020/lib/system-module/subform/subform.component.mjs +2481 -0
  42. package/esm2020/lib/system-module/system/system.component.mjs +959 -0
  43. package/esm2020/lib/system-module/system-service/system-service.service.mjs +85 -0
  44. package/esm2020/lib/system-module/system-service/upload-file.service.mjs +86 -0
  45. package/esm2020/lib/utility/app-no-dbl-click.directive.mjs +23 -0
  46. package/esm2020/lib/utility/constants.mjs +5 -0
  47. package/esm2020/lib/utility/contact-table-search.pipe.mjs +25 -0
  48. package/esm2020/lib/utility/formate-num-field.pipe.mjs +19 -0
  49. package/esm2020/lib/utility/search-pipe.pipe.mjs +26 -0
  50. package/esm2020/lib/utility/selective-preloading-strategy.mjs +23 -0
  51. package/esm2020/lib/utility/table-search.pipe.mjs +25 -0
  52. package/esm2020/lib/utility/tranform.directive.mjs +27 -0
  53. package/esm2020/lib/websearch-history/websearch-history.component.mjs +273 -0
  54. package/esm2020/public_api.mjs +57 -0
  55. package/ezlibrary_v2.d.ts +5 -0
  56. package/fesm2015/ezlibrary_v2.mjs +33543 -0
  57. package/fesm2015/ezlibrary_v2.mjs.map +1 -0
  58. package/fesm2020/ezlibrary_v2.mjs +33533 -0
  59. package/fesm2020/ezlibrary_v2.mjs.map +1 -0
  60. package/lib/admin-service/admin-service.service.d.ts +13 -0
  61. package/lib/analysis-search/analysis-search.component.d.ts +122 -0
  62. package/lib/assort-service/assort-service.service.d.ts +12 -0
  63. package/lib/attribute-definition/attribute-definition.component.d.ts +47 -0
  64. package/lib/auth/auth.guard.d.ts +16 -0
  65. package/lib/bi-service/bi.service.d.ts +20 -0
  66. package/lib/call-info/callinfo.component.d.ts +30 -0
  67. package/lib/comman-service/comman-service.service.d.ts +111 -0
  68. package/lib/comman-service/share-data-service.service.d.ts +10 -0
  69. package/lib/contact-search/contact-search.component.d.ts +115 -0
  70. package/lib/contact-service/contact-service.service.d.ts +15 -0
  71. package/lib/ezheader/header.component.d.ts +61 -0
  72. package/lib/ezlib.module.d.ts +47 -0
  73. package/lib/file-upload/fileupload.component.d.ts +131 -0
  74. package/lib/file-upload-log/file-upload-log.component.d.ts +53 -0
  75. package/lib/fileupload-module/fileupload-dashboard/fileupload-dashboard.component.d.ts +8 -0
  76. package/lib/fileupload-module/fileupload-routing.module.d.ts +7 -0
  77. package/lib/footer/footer.component.d.ts +9 -0
  78. package/lib/globle/common-pdf.service.d.ts +9 -0
  79. package/lib/globle/globle-env.service.d.ts +16 -0
  80. package/lib/globle/memo-report.service.d.ts +107 -0
  81. package/lib/globle/pdf-service.service.d.ts +459 -0
  82. package/lib/globle/shared-services.service.d.ts +12 -0
  83. package/lib/globle/upload-service.service.d.ts +20 -0
  84. package/lib/header/header.component.d.ts +45 -0
  85. package/lib/invalid/invalid.component.d.ts +12 -0
  86. package/lib/logout/logout.component.d.ts +21 -0
  87. package/lib/menu-right/menu-right.component.d.ts +47 -0
  88. package/lib/pipes/number-with-commas.pipe.d.ts +7 -0
  89. package/lib/pipes/order-by-pipe.pipe.d.ts +7 -0
  90. package/lib/pipes/selectedCount.d.ts +7 -0
  91. package/lib/pipes/sum.pipe.d.ts +7 -0
  92. package/lib/pkt-data/pkt-data.component.d.ts +189 -0
  93. package/lib/pricing-service/pricing.service.d.ts +20 -0
  94. package/lib/qa-analysis/qa-analysis.component.d.ts +99 -0
  95. package/lib/report-format/report-format.component.d.ts +74 -0
  96. package/lib/sessionend/session-end.guard.d.ts +10 -0
  97. package/lib/stock-service/lazyload.service.d.ts +7 -0
  98. package/lib/stock-service/stock-service.service.d.ts +19 -0
  99. package/lib/system-module/subform/subform.component.d.ts +227 -0
  100. package/lib/system-module/system/system.component.d.ts +113 -0
  101. package/lib/system-module/system-service/system-service.service.d.ts +23 -0
  102. package/lib/system-module/system-service/upload-file.service.d.ts +12 -0
  103. package/lib/utility/app-no-dbl-click.directive.d.ts +7 -0
  104. package/lib/utility/constants.d.ts +4 -0
  105. package/lib/utility/contact-table-search.pipe.d.ts +7 -0
  106. package/lib/utility/formate-num-field.pipe.d.ts +7 -0
  107. package/lib/utility/search-pipe.pipe.d.ts +7 -0
  108. package/lib/utility/selective-preloading-strategy.d.ts +9 -0
  109. package/lib/utility/table-search.pipe.d.ts +7 -0
  110. package/lib/utility/tranform.directive.d.ts +10 -0
  111. package/lib/websearch-history/websearch-history.component.d.ts +62 -0
  112. package/package.json +48 -0
  113. package/public_api.d.ts +52 -0
@@ -0,0 +1,679 @@
1
+ import { Component, ElementRef, ViewChild } from '@angular/core';
2
+ import { HttpHeaders } from '@angular/common/http';
3
+ import { Router, ActivatedRoute } from '@angular/router';
4
+ import { ToastrService } from 'ngx-toastr';
5
+ import { Cookie } from 'ng2-cookies/ng2-cookies';
6
+ import { NgxSpinnerService } from "ngx-spinner";
7
+ import { ContactServiceService } from '../contact-service/contact-service.service';
8
+ import { StockServiceService } from '../stock-service/stock-service.service';
9
+ import { CommanServiceService } from '../comman-service/comman-service.service';
10
+ //import { ToolbarService, LinkService, ImageService, HtmlEditorService, TableService, QuickToolbarService } from '@syncfusion/ej2-angular-richtexteditor';
11
+ //import * as ClassicEditor from '@ckeditor/ckeditor5-build-classic';
12
+ import { FormBuilder, Validators } from '@angular/forms';
13
+ import * as i0 from "@angular/core";
14
+ import * as i1 from "@angular/router";
15
+ import * as i2 from "ngx-toastr";
16
+ import * as i3 from "../contact-service/contact-service.service";
17
+ import * as i4 from "../stock-service/stock-service.service";
18
+ import * as i5 from "ngx-spinner";
19
+ import * as i6 from "../comman-service/comman-service.service";
20
+ import * as i7 from "@angular/forms";
21
+ import * as i8 from "ng-select";
22
+ import * as i9 from "@kolkov/angular-editor";
23
+ import * as i10 from "@angular/common";
24
+ import * as i11 from "../utility/contact-table-search.pipe";
25
+ export class ContactSearchComponent {
26
+ constructor(router, route, toastr, cs, ss, spinnerService, cmncs, fb) {
27
+ this.router = router;
28
+ this.route = route;
29
+ this.toastr = toastr;
30
+ this.cs = cs;
31
+ this.ss = ss;
32
+ this.spinnerService = spinnerService;
33
+ this.cmncs = cmncs;
34
+ this.fb = fb;
35
+ this.config = {
36
+ editable: true,
37
+ spellcheck: true,
38
+ height: '15rem',
39
+ minHeight: '5rem',
40
+ placeholder: 'Enter text here...',
41
+ translate: 'no',
42
+ defaultParagraphSeparator: 'p',
43
+ defaultFontName: 'Arial'
44
+ };
45
+ this.noticonfig = {
46
+ editable: true,
47
+ spellcheck: true,
48
+ height: '5rem',
49
+ minHeight: '3rem',
50
+ placeholder: 'Enter text here...',
51
+ translate: 'no',
52
+ defaultParagraphSeparator: '',
53
+ defaultFontName: '',
54
+ toolbarHiddenButtons: [
55
+ [
56
+ 'bold',
57
+ 'italic',
58
+ 'underline',
59
+ 'strikeThrough',
60
+ 'subscript',
61
+ 'superscript',
62
+ 'justifyLeft',
63
+ 'justifyCenter',
64
+ 'justifyRight',
65
+ 'justifyFull',
66
+ 'indent',
67
+ 'outdent',
68
+ 'insertUnorderedList',
69
+ 'insertOrderedList',
70
+ 'heading',
71
+ 'fontName'
72
+ ],
73
+ [
74
+ 'fontSize',
75
+ 'textColor',
76
+ 'backgroundColor',
77
+ 'customClasses',
78
+ 'insertImage',
79
+ 'insertVideo',
80
+ 'insertHorizontalRule',
81
+ 'removeFormat',
82
+ 'toggleEditorMode'
83
+ ]
84
+ ]
85
+ };
86
+ this.cDt = new Date();
87
+ this.employeeList = [];
88
+ this.countryList = [];
89
+ this.buyerList = [];
90
+ this.saleExecutiveList = [];
91
+ this.cityList = [];
92
+ this.contactType = '';
93
+ this.actions = [];
94
+ this.Terms = '';
95
+ this.currency = '';
96
+ this.City = '';
97
+ this.dataHeader = [];
98
+ this.dataList = [];
99
+ this.notificationMdlList = [];
100
+ this.mmtimeList = [];
101
+ this.hhtimeList = [];
102
+ this.EmployeeList = [];
103
+ this.selectedObj = [];
104
+ this.selectedItm = [];
105
+ this.selectedCrtWeight = 0;
106
+ }
107
+ loadProcess() {
108
+ this.status = "0";
109
+ this.spinnerService.show();
110
+ let reqObj = {};
111
+ reqObj['formNme'] = this.route.snapshot.params['frm']; //'contactSearchForm';//;
112
+ this.header['method'] = 'load';
113
+ let options = ({ headers: new HttpHeaders(this.header) });
114
+ console.log(JSON.stringify(reqObj));
115
+ this.cs.load(reqObj, options, 'contact/loadContact').then((response) => {
116
+ if (response.status == 'SUCCESS') {
117
+ console.log(response);
118
+ this.spinnerService.hide();
119
+ this.contactTypeList = response.contactTypeList;
120
+ this.currencyList = response.currencyList;
121
+ this.termsList = response.termsList;
122
+ this.countryList = response.countryList;
123
+ // this.buyerList = response.buyerList;
124
+ this.saleExecutiveList = response.saleExecutiveList.map(option => ({
125
+ value: option.k,
126
+ label: option.v
127
+ }));
128
+ this.actions = response.pageDefination.action || [];
129
+ this.tabs = response.pageDefination.tabs || [];
130
+ this.trns_buttons = response.pageDefination.trns_buttons || [];
131
+ }
132
+ else {
133
+ this.spinnerService.hide();
134
+ this.toastr.error(response.message);
135
+ }
136
+ }).catch((err) => {
137
+ this.spinnerService.hide();
138
+ this.toastr.error(err.message);
139
+ });
140
+ }
141
+ addNewContact(dtl) {
142
+ console.log(dtl);
143
+ this.router.navigate([dtl.lov_qry]);
144
+ }
145
+ loadBuyer(searchTerm) {
146
+ this.spinnerService.show();
147
+ let reqObj = {};
148
+ reqObj['likeStr'] = searchTerm;
149
+ reqObj['typ'] = 'All';
150
+ this.header['method'] = 'loadBuyer';
151
+ let options = ({ headers: new HttpHeaders(this.header) });
152
+ this.ss.load(reqObj, options, 'marketing/search').then((response) => {
153
+ if (response.status == 'SUCCESS') {
154
+ let result = response.result;
155
+ this.buyerList = result.buyerList.map(option => ({
156
+ value: option.k,
157
+ label: option.v
158
+ }));
159
+ this.spinnerService.hide();
160
+ }
161
+ else {
162
+ this.spinnerService.hide();
163
+ this.toastr.error(response.message);
164
+ }
165
+ }).catch((err) => {
166
+ this.spinnerService.hide();
167
+ this.toastr.error(err.message);
168
+ });
169
+ }
170
+ loadSaleExcutive(searchTerm) {
171
+ this.spinnerService.show();
172
+ let reqObj = {};
173
+ reqObj['likeStr'] = searchTerm;
174
+ reqObj['typ'] = 'employee';
175
+ this.header['method'] = 'loadBuyer';
176
+ let options = ({ headers: new HttpHeaders(this.header) });
177
+ this.ss.load(reqObj, options, 'marketing/search').then((response) => {
178
+ if (response.status == 'SUCCESS') {
179
+ let result = response.result;
180
+ this.EmployeeList = result.buyerList.map(option => ({
181
+ value: option.k,
182
+ label: option.v
183
+ }));
184
+ this.spinnerService.hide();
185
+ }
186
+ else {
187
+ this.spinnerService.hide();
188
+ this.toastr.error(response.message);
189
+ }
190
+ }).catch((err) => {
191
+ this.spinnerService.hide();
192
+ this.toastr.error(err.message);
193
+ });
194
+ }
195
+ getCity(counrytId) {
196
+ if (counrytId == undefined || counrytId == '')
197
+ return;
198
+ this.spinnerService.show();
199
+ let reqObj = {};
200
+ reqObj['formNme'] = this.route.snapshot.params['frm'];
201
+ reqObj['countryIdn'] = counrytId;
202
+ this.header['method'] = 'getCityBasedOnCountry';
203
+ let options = ({ headers: new HttpHeaders(this.header) });
204
+ this.cs.load(reqObj, options, 'contact/loadContact').then((response) => {
205
+ if (response.status == 'SUCCESS') {
206
+ this.cityList = [];
207
+ this.City = '';
208
+ console.log(response);
209
+ this.spinnerService.hide();
210
+ this.cityList = response.cityList;
211
+ }
212
+ else {
213
+ this.spinnerService.hide();
214
+ this.toastr.error(response.message);
215
+ }
216
+ }).catch((err) => {
217
+ this.spinnerService.hide();
218
+ this.toastr.error(err.message);
219
+ });
220
+ }
221
+ onSubmit(formVal, subBtn) {
222
+ var t = Object.keys(formVal.form.controls).forEach(field => {
223
+ const control = formVal.form.get(field);
224
+ });
225
+ // this.searchContact(formVal.value, subBtn);
226
+ }
227
+ searchContact() {
228
+ debugger;
229
+ //console.log(frmFld);
230
+ // "formNme":"contactSearchForm",
231
+ // "tableNameVar":"nme_m#nme_m#nme_m#buyer_terms#buyer_terms",
232
+ // "tableFieldVar":"emp_idn#nme_idn#typ#currency_idn#terms_idn",
233
+ // "typeVar":"n#n#n#n#n",
234
+ // "attrVar":"emp_idn#nme_idn#typ#currency_idn#terms_idn",
235
+ // "valuesVar":"27588#28173#buyer#206#246",
236
+ // "dataTypeVar":"n#n#c#n#n"
237
+ //*****for username******** ///
238
+ // "tableNameVar":"appl_user",
239
+ // "tableFieldVar":"username",
240
+ // "typeVar":"n",
241
+ // "attrVar":"username",
242
+ // "valuesVar":"nilamweb",
243
+ // "dataTypeVar":"c"
244
+ this.spinnerService.show();
245
+ let tableNameVar = '';
246
+ let tableFieldVar = '';
247
+ let typeVar = '';
248
+ let attrVar = '';
249
+ let valuesVar = '';
250
+ let dataTypeVar = '';
251
+ if (this.userName != null && this.userName != "" && this.userName != undefined) {
252
+ tableNameVar += 'appl_user' + '#';
253
+ tableFieldVar += 'username' + '#';
254
+ typeVar += 'n' + '#';
255
+ attrVar += 'username' + '#';
256
+ valuesVar += this.userName + '#';
257
+ dataTypeVar += 'c' + '#';
258
+ }
259
+ if (this.contactType != null && this.contactType != "" && this.contactType != undefined) {
260
+ tableNameVar += 'nme_m' + '#';
261
+ tableFieldVar += 'typ' + '#';
262
+ typeVar += 'n' + '#';
263
+ attrVar += 'typ' + '#';
264
+ valuesVar += this.contactType + '#';
265
+ dataTypeVar += 'c' + '#';
266
+ }
267
+ if (this.buyer != null && this.buyer != "" && this.buyer != undefined) {
268
+ tableNameVar += 'nme_m' + '#';
269
+ tableFieldVar += 'nme_idn' + '#';
270
+ typeVar += 'n' + '#';
271
+ attrVar += 'nme_idn' + '#';
272
+ valuesVar += this.buyer + '#';
273
+ dataTypeVar += 'n' + '#';
274
+ }
275
+ if (this.empId != null && this.empId != "" && this.empId != undefined) {
276
+ tableNameVar += 'nme_m' + '#';
277
+ tableFieldVar += 'emp_idn' + '#';
278
+ typeVar += 'n' + '#';
279
+ attrVar += 'emp_idn' + '#';
280
+ valuesVar += this.empId + '#';
281
+ dataTypeVar += 'n' + '#';
282
+ }
283
+ if (this.Terms != null && this.Terms != "" && this.Terms != undefined) {
284
+ tableNameVar += 'buyer_terms' + '#';
285
+ tableFieldVar += 'terms_idn' + '#';
286
+ typeVar += 'n' + '#';
287
+ attrVar += 'terms_idn' + '#';
288
+ valuesVar += this.Terms + '#';
289
+ dataTypeVar += 'n' + '#';
290
+ }
291
+ if (this.currency != null && this.currency != "" && this.currency != undefined) {
292
+ tableNameVar += 'buyer_terms' + '#';
293
+ tableFieldVar += 'currency_idn' + '#';
294
+ typeVar += 'n' + '#';
295
+ attrVar += 'currency_idn' + '#';
296
+ valuesVar += this.currency + '#';
297
+ dataTypeVar += 'n' + '#';
298
+ }
299
+ this.spinnerService.show();
300
+ let reqObj = {};
301
+ reqObj['formNme'] = this.route.snapshot.params['frm'];
302
+ reqObj['tableNameVar'] = tableNameVar.slice(0, -1); //'nme_m';
303
+ reqObj['tableFieldVar'] = tableFieldVar.slice(0, -1); //'typ';
304
+ reqObj['typeVar'] = typeVar.slice(0, -1); //'n';
305
+ reqObj['attrVar'] = attrVar.slice(0, -1); //'typ';
306
+ reqObj['valuesVar'] = valuesVar.slice(0, -1); //contactType.print.toLowerCase();
307
+ reqObj['dataTypeVar'] = dataTypeVar.slice(0, -1); //'c';
308
+ if (this.nameIdnList != "" && this.nameIdnList != undefined && this.nameIdnList != null) {
309
+ this.nameIdnList = this.nameIdnList.trim();
310
+ let spaceTocomma = this.nameIdnList.replace(/[ ,]+/g, ",");
311
+ let newLineToComma = spaceTocomma.replace(/\n/g, ",");
312
+ reqObj['nmeIdnList'] = newLineToComma.split(',');
313
+ }
314
+ this.header['method'] = 'searchContact';
315
+ console.log(JSON.stringify(reqObj));
316
+ let options = ({ headers: new HttpHeaders(this.header) });
317
+ this.cs.load(reqObj, options, 'contact/loadContact').then((response) => {
318
+ if (response.status == 'SUCCESS') {
319
+ console.log(response);
320
+ this.spinnerService.hide();
321
+ this.dataHeader = response.dataHeader;
322
+ this.dataList = response.dataList;
323
+ this.dataHeaderPrint = response.dataHeaderPrint;
324
+ this.pageDefination = response.pageDefination;
325
+ this.selectedItm = [];
326
+ this.nameIdnList = "";
327
+ document.getElementById("wrap").addEventListener("scroll", function () {
328
+ var translate = "translate(0," + this.scrollTop + "px)";
329
+ this.querySelector("thead").style.transform = translate;
330
+ });
331
+ }
332
+ else {
333
+ this.spinnerService.hide();
334
+ this.toastr.error(response.message);
335
+ }
336
+ }).catch((err) => {
337
+ this.spinnerService.hide();
338
+ this.toastr.error(err.message);
339
+ });
340
+ }
341
+ userAction(ua, c, a) {
342
+ debugger;
343
+ if (ua && c.trim() == 'subform') {
344
+ this.router.navigate([a.lov_qry.trim(), a.column_key, ua.nme_idn]);
345
+ }
346
+ }
347
+ toolactions(tab) {
348
+ console.log("process", process);
349
+ switch (tab.form_field) {
350
+ case "addnotification": {
351
+ this.NotificationPopup();
352
+ break;
353
+ }
354
+ default: {
355
+ console.log("Invalid choice");
356
+ break;
357
+ }
358
+ }
359
+ }
360
+ NotificationPopup() {
361
+ if (this.selectedItm.length > 0) {
362
+ this.notificationFormreset();
363
+ this.spinnerService.show();
364
+ let reqObj = {};
365
+ reqObj['formNme'] = this.route.snapshot.params['frm'];
366
+ this.header['method'] = 'loadNotification';
367
+ let options = ({ headers: new HttpHeaders(this.header) });
368
+ this.cs.load(reqObj, options, 'contact/notification').then((response) => {
369
+ if (response.status == 'SUCCESS') {
370
+ let result = response.result || {};
371
+ this.notificationMdlList = result.notificationMdlList || [];
372
+ document.getElementById('btnNotification').click();
373
+ this.spinnerService.hide();
374
+ }
375
+ else {
376
+ this.spinnerService.hide();
377
+ this.toastr.error(response.message);
378
+ }
379
+ }).catch((err) => {
380
+ this.spinnerService.hide();
381
+ this.toastr.error(err.message);
382
+ });
383
+ }
384
+ else {
385
+ this.toastr.error("Please select contacts");
386
+ }
387
+ }
388
+ AddNotification() {
389
+ if (this.myNotification.valid) {
390
+ let formsVal = this.myNotification.value;
391
+ let buyerList = [];
392
+ this.selectedItm.forEach(element => {
393
+ let nme_idn = element.nme_idn || [];
394
+ buyerList.push(nme_idn);
395
+ });
396
+ debugger;
397
+ let dateString = formsVal['logdate'] + ' ' + formsVal['hh'] + ':' + formsVal['mm'] + ':00';
398
+ let reqObj = {};
399
+ reqObj['formNme'] = this.route.snapshot.params['frm'];
400
+ reqObj['log_ts'] = dateString;
401
+ reqObj['pub_pvt'] = formsVal['pub_pvt'];
402
+ reqObj['mdl'] = formsVal['mdl'];
403
+ reqObj['src'] = formsVal['src'];
404
+ reqObj['msg'] = formsVal['massage'];
405
+ reqObj['status'] = formsVal['status'];
406
+ reqObj['buyerList'] = buyerList;
407
+ reqObj['action'] = 'add';
408
+ console.log(JSON.stringify(reqObj));
409
+ this.header['method'] = 'saveNotification';
410
+ let options = ({ headers: new HttpHeaders(this.header) });
411
+ this.cs.load(reqObj, options, 'contact/notification').then((response) => {
412
+ if (response.status == 'SUCCESS') {
413
+ let result = response.result || {};
414
+ this.notificationFormreset();
415
+ this.selectedItm = [];
416
+ this.spinnerService.hide();
417
+ this.notificlosebtn.nativeElement.click();
418
+ this.toastr.success("Notification added successfully.");
419
+ }
420
+ else {
421
+ this.spinnerService.hide();
422
+ this.toastr.error(response.message);
423
+ }
424
+ }).catch((err) => {
425
+ this.spinnerService.hide();
426
+ this.toastr.error(err.message);
427
+ });
428
+ }
429
+ else {
430
+ this.toastr.error("Please specify all required field");
431
+ }
432
+ }
433
+ exportExcel() {
434
+ this.cmncs.CSVConvertor(this.dataList, 'Contact_Search_', true);
435
+ }
436
+ MailPopup() {
437
+ if (this.selectedItm.length > 0) {
438
+ document.getElementById('btnsendMail').click();
439
+ }
440
+ else {
441
+ this.toastr.error("Please select contacts");
442
+ }
443
+ }
444
+ UpdateSaleExecutivePop() {
445
+ if (this.selectedItm.length > 0) {
446
+ document.getElementById('btnsaleex').click();
447
+ }
448
+ else {
449
+ this.toastr.error("Please select contacts");
450
+ }
451
+ }
452
+ UpdateSaleExecutive() {
453
+ let nmeIdnList = [];
454
+ this.selectedItm.forEach(element => {
455
+ let nme_idn = element.nme_idn || [];
456
+ nmeIdnList.push(nme_idn);
457
+ });
458
+ this.saleExcute = this.saleExcute || "";
459
+ if (this.saleExcute != "") {
460
+ this.spinnerService.show();
461
+ let reqObj = {};
462
+ reqObj['formNme'] = this.route.snapshot.params['frm'];
463
+ reqObj['nmeIdnList'] = nmeIdnList;
464
+ reqObj['emp_idn'] = this.saleExcute;
465
+ console.log(JSON.stringify(reqObj));
466
+ this.header['method'] = 'assignSaleExecutive';
467
+ let options = ({ headers: new HttpHeaders(this.header) });
468
+ this.cs.load(reqObj, options, 'contact/loadContact').then((response) => {
469
+ if (response.status == 'SUCCESS') {
470
+ this.saleExcute = "";
471
+ this.slexclosebtn.nativeElement.click();
472
+ this.toastr.success("Update done successfully");
473
+ this.spinnerService.hide();
474
+ }
475
+ else {
476
+ this.spinnerService.hide();
477
+ this.toastr.error(response.message);
478
+ }
479
+ }).catch((err) => {
480
+ this.spinnerService.hide();
481
+ this.toastr.error(err.message);
482
+ });
483
+ }
484
+ else {
485
+ this.toastr.error("Please Specify Sale Executive");
486
+ }
487
+ }
488
+ SendMail() {
489
+ let formsVal = this.myFormmm.value;
490
+ debugger;
491
+ let isValid = true;
492
+ let massage = "";
493
+ let htmlcontent = formsVal['htmlcontent'] || '';
494
+ let subject = formsVal['subject'] || '';
495
+ let senderName = formsVal['senderName'] || '';
496
+ if (this.selectedItm.length == 0) {
497
+ isValid = false;
498
+ massage = "Please select contacts for mail";
499
+ }
500
+ if (subject == '') {
501
+ isValid = false;
502
+ massage = "Please Specify Subject";
503
+ }
504
+ if (htmlcontent == '') {
505
+ isValid = false;
506
+ massage = "Please Specify Mail Body";
507
+ }
508
+ if (senderName == '') {
509
+ isValid = false;
510
+ massage = "Please Specify Sender Name";
511
+ }
512
+ if (isValid) {
513
+ let CClst = formsVal['CC'] || '';
514
+ let BCClst = formsVal['BCC'] || '';
515
+ let cc = [];
516
+ let bcc = [];
517
+ this.spinnerService.show();
518
+ if (CClst != '') {
519
+ let spaceTocomma = CClst.replace(/[ ,]+/g, ",");
520
+ let newLineToComma = spaceTocomma.replace(/\n/g, ",");
521
+ cc = newLineToComma.split(',');
522
+ }
523
+ if (BCClst != '') {
524
+ let spaceTocomma = BCClst.replace(/[ ,]+/g, ",");
525
+ let newLineToComma = spaceTocomma.replace(/\n/g, ",");
526
+ bcc = newLineToComma.split(',');
527
+ }
528
+ let emailDetails = [];
529
+ this.selectedItm.forEach(element => {
530
+ let emailIdns = element.emailIdns || [];
531
+ let nme_idn = element.nme_idn;
532
+ let emp_idn = element.emp_idn;
533
+ if (emailIdns.length > 0) {
534
+ emailDetails.push({
535
+ "emails": emailIdns,
536
+ "nme_idn": nme_idn,
537
+ "emp_idn": emp_idn
538
+ });
539
+ }
540
+ });
541
+ debugger;
542
+ let reqObj = {};
543
+ reqObj['formNme'] = "ContactMassMail";
544
+ reqObj['sendername'] = senderName;
545
+ reqObj['subject'] = subject;
546
+ reqObj['maildetails'] = emailDetails;
547
+ reqObj['cc'] = cc;
548
+ reqObj['bcc'] = bcc;
549
+ reqObj['mailBody'] = htmlcontent;
550
+ console.log(JSON.stringify(reqObj));
551
+ this.header['method'] = 'sendBulkMail';
552
+ let options = ({ headers: new HttpHeaders(this.header) });
553
+ this.cs.load(reqObj, options, 'contact/loadContact').then((response) => {
554
+ if (response.status == 'SUCCESS') {
555
+ this.myFormmm = this.fb.group({
556
+ senderName: ['', Validators.required],
557
+ subject: ['', Validators.required],
558
+ htmlcontent: ['', [Validators.required]],
559
+ CC: "",
560
+ BCC: ""
561
+ });
562
+ this.mailclosebtn.nativeElement.click();
563
+ this.toastr.error(response.message);
564
+ this.spinnerService.hide();
565
+ }
566
+ else {
567
+ this.spinnerService.hide();
568
+ this.toastr.error(response.message);
569
+ }
570
+ }).catch((err) => {
571
+ this.spinnerService.hide();
572
+ this.toastr.error(err.message);
573
+ });
574
+ }
575
+ else {
576
+ this.spinnerService.hide();
577
+ this.toastr.error(massage);
578
+ }
579
+ }
580
+ get notificationControl() {
581
+ return this.myNotification.controls;
582
+ }
583
+ selectRow(nme_idn) {
584
+ document.getElementById('cb_' + nme_idn).click();
585
+ }
586
+ selectAll(e) {
587
+ this.dataList.forEach(ele => {
588
+ debugger;
589
+ this.selectRow(ele.nme_idn);
590
+ });
591
+ }
592
+ checkedRow(data, nme_idn) {
593
+ debugger;
594
+ if (document.getElementById('cb_' + nme_idn).checked == false) {
595
+ let element = document.getElementById('cb_' + nme_idn); //pktId
596
+ element.parentElement.parentElement.classList.remove("selectedRow");
597
+ element.parentElement.parentElement.classList.add("notselectedRow");
598
+ this.selectedItm.forEach((element, index) => {
599
+ if (element.nme_idn == nme_idn) {
600
+ this.selectedItm.splice(index, 1);
601
+ }
602
+ });
603
+ }
604
+ else {
605
+ var element = document.getElementById('cb_' + nme_idn); //pktId
606
+ element.parentElement.parentElement.classList.remove("notselectedRow");
607
+ element.parentElement.parentElement.classList.add("selectedRow");
608
+ this.selectedItm.push(data);
609
+ }
610
+ console.log(this.selectedItm);
611
+ }
612
+ ngOnInit() {
613
+ this.editorConfig = this.cmncs.editorConfig;
614
+ let mdlk = JSON.parse(localStorage.getItem('mdlKey'));
615
+ this.cUrl = this.router.url;
616
+ console.log(this.cUrl.split('/')[1]);
617
+ this.header = {
618
+ 'clientkey': Cookie.get('_ck'),
619
+ 'Content-Type': 'application/json',
620
+ 'modulekey': mdlk[this.cUrl.split('/')[1]],
621
+ 'loginid': Cookie.get('_logid'),
622
+ 'source': 'qs'
623
+ };
624
+ this.myFormmm = this.fb.group({
625
+ senderName: ['', Validators.required],
626
+ subject: ['', Validators.required],
627
+ htmlcontent: ['', [Validators.required]],
628
+ CC: "",
629
+ BCC: ""
630
+ });
631
+ this.mmtimeList = [];
632
+ for (var i = 0; i < 24; i++) {
633
+ if (i < 10)
634
+ this.mmtimeList.push("0" + i);
635
+ else
636
+ this.mmtimeList.push("" + i);
637
+ }
638
+ this.hhtimeList = [];
639
+ for (var i = 0; i < 60; i++) {
640
+ if (i < 10)
641
+ this.hhtimeList.push("0" + i);
642
+ else
643
+ this.hhtimeList.push("" + i);
644
+ }
645
+ this.notificationFormreset();
646
+ this.loadProcess();
647
+ }
648
+ notificationFormreset() {
649
+ this.myNotification = this.fb.group({
650
+ logdate: ['', Validators.required],
651
+ pub_pvt: "PVT",
652
+ mdl: ['', Validators.required],
653
+ src: "ez",
654
+ hh: "00",
655
+ mm: "00",
656
+ massage: ['', Validators.required],
657
+ status: "P"
658
+ });
659
+ }
660
+ }
661
+ /** @nocollapse */ /** @nocollapse */ ContactSearchComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ContactSearchComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: i2.ToastrService }, { token: i3.ContactServiceService }, { token: i4.StockServiceService }, { token: i5.NgxSpinnerService }, { token: i6.CommanServiceService }, { token: i7.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
662
+ /** @nocollapse */ /** @nocollapse */ ContactSearchComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.4.0", type: ContactSearchComponent, selector: "app-contact-search", viewQueries: [{ propertyName: "submitbtn", first: true, predicate: ["submitBtn"], descendants: true }, { propertyName: "slexclosebtn", first: true, predicate: ["slexclosebtn"], descendants: true }, { propertyName: "mailclosebtn", first: true, predicate: ["mailclosebtn"], descendants: true }, { propertyName: "notificlosebtn", first: true, predicate: ["notificlosebtn"], 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\"> Back</span>&nbsp;&nbsp;&nbsp; Contact Search&nbsp;&nbsp;&nbsp;\r\n <span class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n </h3>\r\n <div class=\"pull-right\" *ngIf=\"trns_buttons.length>0\">\r\n <button type=\"button\" (click)=\"addNewContact(trns_buttons[0])\" class=\"btn btn-success\" style=\"background-color:#3c5998;border-color: #3c5998;\">Add New Contact</button>\r\n </div> \r\n </div>\r\n </div>\r\n <div class=\"content-frame\" style=\"background: #fff;height: calc(100vh - 100px);\">\r\n <div class=\"innerD\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"row\" style=\"margin: 10px 0;\">\r\n \r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"contactType\" [(ngModel)]=\"contactType\" style=\"height: 100%;\">\r\n <option value=\"\">Select ContactType</option>\r\n <option *ngFor=\"let type of contactTypeList\" [ngValue]=\"type.val\">{{type.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"buyerList\" [searchable]=\"false\" name=\"buyerSugg\" [(ngModel)]=\"buyerSugg\"\r\n bindLabel=\"v\" bindValue=\"k\" placeholder=\"Select Buyer\">\r\n <ng-template ng-header-tmp>\r\n <input style=\"width: 100%; line-height: 24px\" #buyer type=\"text\" (keyup)=\"loadBuyer(buyer.value);\"\r\n [autofocus]=\"testt\" />\r\n </ng-template>\r\n </ng-select> -->\r\n <ng-select style=\"z-index: 5;\" placeholder=\"Select Buyer\" [options]=\"buyerList\"\r\n [(ngModel)]=\"buyer\" name=\"buyer\" (filterInputChanged)=\"loadBuyer($event)\" [allowClear]=\"true\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select employee\" name=\"empId\"\r\n [options]=\"saleExecutiveList\"\r\n [(ngModel)]=\"empId\" [allowClear]=\"true\">\r\n </ng-select>\r\n <!-- <ng-select [items]=\"saleExecutiveList\" [(ngModel)]=\"empId\" bindLabel=\"v\" name=\"empId\" bindValue=\"k\"\r\n placeholder=\"Select employee\" #buyerFil=\"ngModel\" required>\r\n <ng-template ng-header-tmp>\r\n </ng-template>\r\n </ng-select> -->\r\n </div>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"Terms\" [(ngModel)]=\"Terms\" style=\"height: 100%;\">\r\n <option value=\"\">Select Terms</option>\r\n <option *ngFor=\"let term of termsList\" value=\"{{term.terms_idn}}\">{{term.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"currency\" [(ngModel)]=\"currency\" style=\"height: 100%;\">\r\n <option value=\"\">Select currency</option>\r\n <option *ngFor=\"let currency of currencyList\" value=\"{{currency.currency_idn}}\">{{currency.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <input class=\"form-control w-100\" placeholder=\"User Name\" type=\"text\" name=\"userName\" [(ngModel)]=\"userName\" />\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <textarea style=\"white-space: pre;\" class=\"form-control\" placeholder=\"NameIdn List\" \r\n [(ngModel)]=\"nameIdnList\" id=\"nameIdnList\" name=\"nameIdnList\" cols=\"38\" rows=\"3\" ></textarea>\r\n </div>\r\n \r\n <div class=\" w-100\" style=\"padding-top: 10px;\">\r\n <button id=\"savebtn\" (click)=\"searchContact()\" type=\"button\" style=\"background-color:#3c5998;border-color: #3c5998\"\r\n class=\"btn btn-success pull-left\">submit</button>\r\n <!-- (click)=\"searchContact(contactType,buyerSugg,empId,Terms,currency,userName)\" -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9 custCls\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"row\" *ngIf=\"dataList?.length > 0\">\r\n <div class=\"col-md-1 pull-right\">\r\n <!-- <button type=\"submit\" class=\"btn btn-success\" (click)=\"togtsl();\" style=\"background-color:#3c5998;border-color: #3c5998;margin-top: 7px;margin-bottom: 7px\">tools</button> -->\r\n <!-- <div class=\"tlsdrp\" *ngIf=\"tsl\">\r\n <ul class=\"tlsul\">\r\n <li *ngFor=\"let action of actions\">\r\n <span class=\"{{action?.form_field_icon}} tslico\"></span>{{action?.form_field_title}}</li>\r\n </ul>\r\n </div> -->\r\n <div class=\"dropdown\">\r\n <button type=\"submit\" class=\"btn btn-success\" style=\"background-color:#3c5998;border-color: #3c5998;margin-top: 7px;margin-bottom: 7px\"\r\n data-toggle=\"dropdown\">tools\r\n <span class=\"caret\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-right\">\r\n <li *ngFor=\"let tab of tabs\" (click)=\"toolactions(tab);\" style=\"padding: 10px;\">\r\n <span class=\"{{tab?.form_field_icon}} tslico\"></span>{{tab?.form_field_title}}</li>\r\n\r\n <li style=\"padding: 10px;cursor: pointer;\" (click)=\"exportExcel();\">\r\n Excel</li>\r\n \r\n <li style=\"padding: 10px;cursor: pointer;\" (click)=\"UpdateSaleExecutivePop();\">\r\n Update Sales Executive\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6 pull-left\">\r\n <div class=\"form-group\" style=\"padding-top: 10px;\">\r\n <div class=\"col-md-2\">\r\n <label for=\"exampleInputName2\" style=\"padding-top: 5px;\">Search &nbsp;&nbsp;</label>\r\n </div>\r\n\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"table-responsive\" style=\"height: calc(100vh - 100px);\" id=\"wrap\">\r\n <table class=\"displayTable\" *ngIf=\"dataList?.length > 0\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th>SR No<input type=\"checkbox\" (click)=\"selectAll($event);\"></th>\r\n <th>Action</th>\r\n <th *ngFor=\"let hdr of dataHeader\">{{dataHeaderPrint[hdr]}}</th>\r\n <th>Add.Emails</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let data of dataList | ContactTableSrcPipe:searchF; let i = index\">\r\n <!-- | searchPipe:searchF -->\r\n <td (click)=\"selectRow(data.nme_idn)\">{{i + 1}}\r\n\r\n <input type=\"checkbox\" [hidden]=\"true\" id=\"cb_{{data.nme_idn}}\"\r\n (click)=\"checkedRow(data,data.nme_idn)\" value=\"{{data.nme_idn}}\" />\r\n </td>\r\n <td (click)=\"selectRow(data.nme_idn)\">\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\" class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of pageDefination.action\">\r\n <a href=\"javascript:void(0)\" (click)=\"userAction(data,action.form_field_typ,action);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let hdr of dataHeader\" (click)=\"selectRow(data.nme_idn)\">{{data[hdr]}}</td>\r\n <td>{{data['emailIdns']}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter pull-right\">\r\n <div class=\"row\">\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"modal\" id=\"modelSaleEx\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"mailModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-md\" >\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\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Update Sale Executive</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"form-group\">\r\n <label class=\"col-md-3 control-label\">Sale Executive\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <ng-select style=\"z-index: 5;\" placeholder=\"Select Buyer\" [options]=\"EmployeeList\"\r\n [(ngModel)]=\"saleExcute\" name=\"saleExcute\" (filterInputChanged)=\"loadSaleExcutive($event)\" [allowClear]=\"true\">\r\n </ng-select> \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"button\" (click)=\"UpdateSaleExecutive()\" class=\"btn btn-success\">Update</button>\r\n <button type=\"button\" #slexclosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<div class=\"modal\" id=\"modelMail\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"mailModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-lg\" style=\"width: 705px\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" [formGroup]=\"myFormmm\" (ngSubmit)=\"SendMail()\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Send Mail</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n \r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">Sender Name\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"senderName\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">Subject\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"subject\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">CC\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"CC\" name=\"CC\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">BCC\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"BCC\" name=\"BCC\" />\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <angular-editor [placeholder]=\"'Enter text here...'\" [config]=\"config\" formControlName=\"htmlcontent\"></angular-editor>\r\n <!-- <ejs-richtexteditor id='defaultRTE' [(value)]='value' ></ejs-richtexteditor> -->\r\n\r\n <!-- <ckeditor [(ngModel)]=\"value\" ></ckeditor> -->\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"submit\" class=\"btn btn-success\">Send</button>\r\n <button type=\"button\" #mailclosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"modal\" id=\"modelNotification\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-lg\" style=\"width: 705px\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" [formGroup]=\"myNotification\" (ngSubmit)=\"AddNotification()\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Add Notification</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n \r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span> Date\r\n </label>\r\n <div class=\"col-md-4\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input\r\n formControlName=\"logdate\"\r\n onfocus=\"(this.type='date')\"\r\n onblur=\"(this.type='text')\"\r\n class=\"form-control\"\r\n placeholder=\"dd/mm/yyyy\" \r\n />\r\n\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.logdate.invalid && (notificationControl.logdate.dirty || notificationControl.logdate.touched) && notificationControl.logdate.errors.required\">\r\n Date is required\r\n </span>\r\n </div>\r\n </div>\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span>Time(HH:MM)\r\n </label>\r\n <div class=\"col-md-1\" style=\"padding:2px;margin:0px;\">\r\n \r\n <select formControlName=\"hh\" style=\"padding:5px 5px\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let mmt of mmtimeList\" [ngValue]=\"mmt\">{{mmt}}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-1\" style=\"padding:2px;margin:0px;\">\r\n \r\n <select formControlName=\"mm\" style=\"padding:5px 5px\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let hht of hhtimeList\" [ngValue]=\"hht\">{{hht}}</option>\r\n </select>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span>Module\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <select formControlName=\"mdl\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let notificate of notificationMdlList\" [ngValue]=\"notificate.k\">{{notificate['v']}}</option>\r\n \r\n \r\n </select>\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.mdl.invalid && (notificationControl.mdl.dirty || notificationControl.mdl.touched) && notificationControl.mdl.errors.required\">\r\n Module is required\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n \r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"><span style=\"color:red\">*</span>Massage</label>\r\n <div class=\"col-md-10\">\r\n <angular-editor [placeholder]=\"\" [config]=\"noticonfig\" formControlName=\"massage\"></angular-editor>\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.massage.invalid && (notificationControl.massage.dirty || notificationControl.massage.touched) && notificationControl.massage.errors.required\">\r\n Notification massage is required\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"submit\" class=\"btn btn-success\">Add</button>\r\n <button type=\"button\" #notificlosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<button id=\"btnNotification\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelNotification\"></button>\r\n\r\n\r\n<button id=\"btnsaleex\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelSaleEx\"></button>\r\n\r\n<button id=\"btnsendMail\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelMail\"></button>\r\n", styles: [".selectedRow{background-color:#3c59983b!important;cursor:pointer}.notselectedRow{background-color:#fff}:host ::ng-deep .ck-editor__editable_inline{min-height:300px}\n"], components: [{ type: i8.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"] }, { type: i9.AngularEditorComponent, selector: "angular-editor", inputs: ["id", "config", "placeholder", "tabIndex"], outputs: ["viewMode", "blur", "focus", "html"] }], directives: [{ type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i7.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i7.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i7.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i10.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i7.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: i7.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i7.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i7.NgForm, selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i7.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }], pipes: { "date": i10.DatePipe, "ContactTableSrcPipe": i11.ContacttableSearch } });
663
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.4.0", ngImport: i0, type: ContactSearchComponent, decorators: [{
664
+ type: Component,
665
+ args: [{ selector: 'app-contact-search', 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\"> Back</span>&nbsp;&nbsp;&nbsp; Contact Search&nbsp;&nbsp;&nbsp;\r\n <span class=\"f-12\">({{cDt | date:'medium'}})</span>\r\n </h3>\r\n <div class=\"pull-right\" *ngIf=\"trns_buttons.length>0\">\r\n <button type=\"button\" (click)=\"addNewContact(trns_buttons[0])\" class=\"btn btn-success\" style=\"background-color:#3c5998;border-color: #3c5998;\">Add New Contact</button>\r\n </div> \r\n </div>\r\n </div>\r\n <div class=\"content-frame\" style=\"background: #fff;height: calc(100vh - 100px);\">\r\n <div class=\"innerD\">\r\n <div class=\"row\">\r\n <div class=\"col-md-3\">\r\n <div class=\"row\" style=\"margin: 10px 0;\">\r\n \r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"contactType\" [(ngModel)]=\"contactType\" style=\"height: 100%;\">\r\n <option value=\"\">Select ContactType</option>\r\n <option *ngFor=\"let type of contactTypeList\" [ngValue]=\"type.val\">{{type.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <!-- <ng-select [items]=\"buyerList\" [searchable]=\"false\" name=\"buyerSugg\" [(ngModel)]=\"buyerSugg\"\r\n bindLabel=\"v\" bindValue=\"k\" placeholder=\"Select Buyer\">\r\n <ng-template ng-header-tmp>\r\n <input style=\"width: 100%; line-height: 24px\" #buyer type=\"text\" (keyup)=\"loadBuyer(buyer.value);\"\r\n [autofocus]=\"testt\" />\r\n </ng-template>\r\n </ng-select> -->\r\n <ng-select style=\"z-index: 5;\" placeholder=\"Select Buyer\" [options]=\"buyerList\"\r\n [(ngModel)]=\"buyer\" name=\"buyer\" (filterInputChanged)=\"loadBuyer($event)\" [allowClear]=\"true\">\r\n </ng-select>\r\n </div>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <div class=\"input-group w-100\">\r\n <ng-select placeholder=\"Select employee\" name=\"empId\"\r\n [options]=\"saleExecutiveList\"\r\n [(ngModel)]=\"empId\" [allowClear]=\"true\">\r\n </ng-select>\r\n <!-- <ng-select [items]=\"saleExecutiveList\" [(ngModel)]=\"empId\" bindLabel=\"v\" name=\"empId\" bindValue=\"k\"\r\n placeholder=\"Select employee\" #buyerFil=\"ngModel\" required>\r\n <ng-template ng-header-tmp>\r\n </ng-template>\r\n </ng-select> -->\r\n </div>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"Terms\" [(ngModel)]=\"Terms\" style=\"height: 100%;\">\r\n <option value=\"\">Select Terms</option>\r\n <option *ngFor=\"let term of termsList\" value=\"{{term.terms_idn}}\">{{term.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <select class=\"form-control w-100\" name=\"currency\" [(ngModel)]=\"currency\" style=\"height: 100%;\">\r\n <option value=\"\">Select currency</option>\r\n <option *ngFor=\"let currency of currencyList\" value=\"{{currency.currency_idn}}\">{{currency.print}}</option>\r\n </select>\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <input class=\"form-control w-100\" placeholder=\"User Name\" type=\"text\" name=\"userName\" [(ngModel)]=\"userName\" />\r\n </div>\r\n <div class=\"form-group w-100\">\r\n <textarea style=\"white-space: pre;\" class=\"form-control\" placeholder=\"NameIdn List\" \r\n [(ngModel)]=\"nameIdnList\" id=\"nameIdnList\" name=\"nameIdnList\" cols=\"38\" rows=\"3\" ></textarea>\r\n </div>\r\n \r\n <div class=\" w-100\" style=\"padding-top: 10px;\">\r\n <button id=\"savebtn\" (click)=\"searchContact()\" type=\"button\" style=\"background-color:#3c5998;border-color: #3c5998\"\r\n class=\"btn btn-success pull-left\">submit</button>\r\n <!-- (click)=\"searchContact(contactType,buyerSugg,empId,Terms,currency,userName)\" -->\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"col-md-9 custCls\">\r\n <form class=\"form-horizontal\">\r\n <div class=\"row\" *ngIf=\"dataList?.length > 0\">\r\n <div class=\"col-md-1 pull-right\">\r\n <!-- <button type=\"submit\" class=\"btn btn-success\" (click)=\"togtsl();\" style=\"background-color:#3c5998;border-color: #3c5998;margin-top: 7px;margin-bottom: 7px\">tools</button> -->\r\n <!-- <div class=\"tlsdrp\" *ngIf=\"tsl\">\r\n <ul class=\"tlsul\">\r\n <li *ngFor=\"let action of actions\">\r\n <span class=\"{{action?.form_field_icon}} tslico\"></span>{{action?.form_field_title}}</li>\r\n </ul>\r\n </div> -->\r\n <div class=\"dropdown\">\r\n <button type=\"submit\" class=\"btn btn-success\" style=\"background-color:#3c5998;border-color: #3c5998;margin-top: 7px;margin-bottom: 7px\"\r\n data-toggle=\"dropdown\">tools\r\n <span class=\"caret\"></span>\r\n </button>\r\n <ul class=\"dropdown-menu dropdown-menu-right\">\r\n <li *ngFor=\"let tab of tabs\" (click)=\"toolactions(tab);\" style=\"padding: 10px;\">\r\n <span class=\"{{tab?.form_field_icon}} tslico\"></span>{{tab?.form_field_title}}</li>\r\n\r\n <li style=\"padding: 10px;cursor: pointer;\" (click)=\"exportExcel();\">\r\n Excel</li>\r\n \r\n <li style=\"padding: 10px;cursor: pointer;\" (click)=\"UpdateSaleExecutivePop();\">\r\n Update Sales Executive\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n\r\n <div class=\"col-md-6 pull-left\">\r\n <div class=\"form-group\" style=\"padding-top: 10px;\">\r\n <div class=\"col-md-2\">\r\n <label for=\"exampleInputName2\" style=\"padding-top: 5px;\">Search &nbsp;&nbsp;</label>\r\n </div>\r\n\r\n <div class=\"col-md-5\">\r\n <input type=\"text\" class=\"form-control\" id=\"exampleInputName2\" name=\"schtxt\" [(ngModel)]=\"searchF\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"row\">\r\n <div class=\"table-responsive\" style=\"height: calc(100vh - 100px);\" id=\"wrap\">\r\n <table class=\"displayTable\" *ngIf=\"dataList?.length > 0\">\r\n <thead>\r\n <tr class=\"posrel\">\r\n <th>SR No<input type=\"checkbox\" (click)=\"selectAll($event);\"></th>\r\n <th>Action</th>\r\n <th *ngFor=\"let hdr of dataHeader\">{{dataHeaderPrint[hdr]}}</th>\r\n <th>Add.Emails</th>\r\n </tr>\r\n </thead>\r\n <tbody >\r\n <tr *ngFor=\"let data of dataList | ContactTableSrcPipe:searchF; let i = index\">\r\n <!-- | searchPipe:searchF -->\r\n <td (click)=\"selectRow(data.nme_idn)\">{{i + 1}}\r\n\r\n <input type=\"checkbox\" [hidden]=\"true\" id=\"cb_{{data.nme_idn}}\"\r\n (click)=\"checkedRow(data,data.nme_idn)\" value=\"{{data.nme_idn}}\" />\r\n </td>\r\n <td (click)=\"selectRow(data.nme_idn)\">\r\n <div class=\"btn-group\">\r\n <a href=\"#\" data-toggle=\"dropdown\" class=\"btn btn-info dropdown-toggle\">Action\r\n <span class=\"caret\"></span>\r\n </a>\r\n <ul class=\"dropdown-menu\" role=\"menu\">\r\n <li *ngFor=\"let action of pageDefination.action\">\r\n <a href=\"javascript:void(0)\" (click)=\"userAction(data,action.form_field_typ,action);\">\r\n {{action.form_field_title}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </td>\r\n <td *ngFor=\"let hdr of dataHeader\" (click)=\"selectRow(data.nme_idn)\">{{data[hdr]}}</td>\r\n <td>{{data['emailIdns']}}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"actionFooter pull-right\">\r\n <div class=\"row\">\r\n </div>\r\n </div>\r\n</div>\r\n<div class=\"modal\" id=\"modelSaleEx\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"mailModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-md\" >\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\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Update Sale Executive</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"form-group\">\r\n <label class=\"col-md-3 control-label\">Sale Executive\r\n </label>\r\n <div class=\"col-md-9\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <ng-select style=\"z-index: 5;\" placeholder=\"Select Buyer\" [options]=\"EmployeeList\"\r\n [(ngModel)]=\"saleExcute\" name=\"saleExcute\" (filterInputChanged)=\"loadSaleExcutive($event)\" [allowClear]=\"true\">\r\n </ng-select> \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"button\" (click)=\"UpdateSaleExecutive()\" class=\"btn btn-success\">Update</button>\r\n <button type=\"button\" #slexclosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n<div class=\"modal\" id=\"modelMail\" tabindex=\"-1\" role=\"dialog\" aria-labelledby=\"mailModalHead\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-lg\" style=\"width: 705px\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" [formGroup]=\"myFormmm\" (ngSubmit)=\"SendMail()\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Send Mail</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n \r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">Sender Name\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"senderName\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">Subject\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"subject\" />\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">CC\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"CC\" name=\"CC\" />\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\">BCC\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <input type=\"text\" class=\"form-control posrel\" formControlName=\"BCC\" name=\"BCC\" />\r\n </div>\r\n </div>\r\n </div>\r\n \r\n \r\n\r\n <div class=\"form-group\">\r\n <div class=\"col-md-12\">\r\n <angular-editor [placeholder]=\"'Enter text here...'\" [config]=\"config\" formControlName=\"htmlcontent\"></angular-editor>\r\n <!-- <ejs-richtexteditor id='defaultRTE' [(value)]='value' ></ejs-richtexteditor> -->\r\n\r\n <!-- <ckeditor [(ngModel)]=\"value\" ></ckeditor> -->\r\n \r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"submit\" class=\"btn btn-success\">Send</button>\r\n <button type=\"button\" #mailclosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n\r\n\r\n<div class=\"modal\" id=\"modelNotification\" tabindex=\"-1\" role=\"dialog\" aria-hidden=\"true\"\r\n data-backdrop=\"static\" data-keyboard=\"true\">\r\n <div class=\"modal-dialog modal-lg\" style=\"width: 705px\">\r\n <div class=\"modal-content\">\r\n <form class=\"form-horizontal\" [formGroup]=\"myNotification\" (ngSubmit)=\"AddNotification()\">\r\n <div class=\"modal-header\">\r\n <button type=\"button\" class=\"close\" data-dismiss=\"modal\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n <span class=\"sr-only\">Close</span>\r\n </button>\r\n <h4 class=\"modal-title\" id=\"mailModalHead\">Add Notification</h4>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div class=\"row\">\r\n <div class=\"col-md-12\">\r\n \r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span> Date\r\n </label>\r\n <div class=\"col-md-4\">\r\n <div class=\"input-group input-group-sm w-100\">\r\n <input\r\n formControlName=\"logdate\"\r\n onfocus=\"(this.type='date')\"\r\n onblur=\"(this.type='text')\"\r\n class=\"form-control\"\r\n placeholder=\"dd/mm/yyyy\" \r\n />\r\n\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.logdate.invalid && (notificationControl.logdate.dirty || notificationControl.logdate.touched) && notificationControl.logdate.errors.required\">\r\n Date is required\r\n </span>\r\n </div>\r\n </div>\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span>Time(HH:MM)\r\n </label>\r\n <div class=\"col-md-1\" style=\"padding:2px;margin:0px;\">\r\n \r\n <select formControlName=\"hh\" style=\"padding:5px 5px\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let mmt of mmtimeList\" [ngValue]=\"mmt\">{{mmt}}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-1\" style=\"padding:2px;margin:0px;\">\r\n \r\n <select formControlName=\"mm\" style=\"padding:5px 5px\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let hht of hhtimeList\" [ngValue]=\"hht\">{{hht}}</option>\r\n </select>\r\n </div>\r\n \r\n \r\n \r\n </div>\r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"> <span style=\"color:red\">*</span>Module\r\n </label>\r\n <div class=\"col-md-10\">\r\n <div class=\"input-group w-100\">\r\n <select formControlName=\"mdl\" class=\"form-control\" >\r\n \r\n <option *ngFor=\"let notificate of notificationMdlList\" [ngValue]=\"notificate.k\">{{notificate['v']}}</option>\r\n \r\n \r\n </select>\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.mdl.invalid && (notificationControl.mdl.dirty || notificationControl.mdl.touched) && notificationControl.mdl.errors.required\">\r\n Module is required\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n \r\n\r\n <div class=\"form-group\">\r\n <label class=\"col-md-2 control-label\"><span style=\"color:red\">*</span>Massage</label>\r\n <div class=\"col-md-10\">\r\n <angular-editor [placeholder]=\"\" [config]=\"noticonfig\" formControlName=\"massage\"></angular-editor>\r\n <span class=\"text-danger\"\r\n *ngIf=\"notificationControl.massage.invalid && (notificationControl.massage.dirty || notificationControl.massage.touched) && notificationControl.massage.errors.required\">\r\n Notification massage is required\r\n </span>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <!-- <p> dff {{htmlContent}}</p> -->\r\n <button type=\"submit\" class=\"btn btn-success\">Add</button>\r\n <button type=\"button\" #notificlosebtn class=\"btn btn-default\" data-dismiss=\"modal\">Close</button>\r\n </div>\r\n </form>\r\n </div>\r\n\r\n </div>\r\n</div>\r\n<button id=\"btnNotification\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelNotification\"></button>\r\n\r\n\r\n<button id=\"btnsaleex\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelSaleEx\"></button>\r\n\r\n<button id=\"btnsendMail\" [hidden]=\"true\" data-toggle=\"modal\" data-target=\"#modelMail\"></button>\r\n", styles: [".selectedRow{background-color:#3c59983b!important;cursor:pointer}.notselectedRow{background-color:#fff}:host ::ng-deep .ck-editor__editable_inline{min-height:300px}\n"] }]
666
+ }], ctorParameters: function () { return [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: i2.ToastrService }, { type: i3.ContactServiceService }, { type: i4.StockServiceService }, { type: i5.NgxSpinnerService }, { type: i6.CommanServiceService }, { type: i7.FormBuilder }]; }, propDecorators: { submitbtn: [{
667
+ type: ViewChild,
668
+ args: ['submitBtn']
669
+ }], slexclosebtn: [{
670
+ type: ViewChild,
671
+ args: ['slexclosebtn']
672
+ }], mailclosebtn: [{
673
+ type: ViewChild,
674
+ args: ['mailclosebtn']
675
+ }], notificlosebtn: [{
676
+ type: ViewChild,
677
+ args: ['notificlosebtn']
678
+ }] } });
679
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFjdC1zZWFyY2guY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXpsaWIvc3JjL2xpYi9jb250YWN0LXNlYXJjaC9jb250YWN0LXNlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lemxpYi9zcmMvbGliL2NvbnRhY3Qtc2VhcmNoL2NvbnRhY3Qtc2VhcmNoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsVUFBVSxFQUFFLFNBQVMsRUFBdUIsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLFdBQVcsRUFBRyxNQUFNLHNCQUFzQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQzdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRWhGLDJKQUEySjtBQUMzSixxRUFBcUU7QUFDckUsT0FBTyxFQUFhLFdBQVcsRUFBQyxVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7OztBQVNuRSxNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQ1MsTUFBYyxFQUNiLEtBQXFCLEVBQ3JCLE1BQXFCLEVBQ3JCLEVBQXlCLEVBQ3pCLEVBQXVCLEVBQ3ZCLGNBQWlDLEVBQ2pDLEtBQTJCLEVBQzNCLEVBQWU7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LEVBQUUsRUFBQyxDQUFDLEVBQUUsRUFBQztZQUNuQixJQUFHLENBQUMsR0FBQyxFQUFFO2dCQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBQyxDQUFDLENBQUMsQ0FBQzs7Z0JBRTVCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjtRQUVDLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBQ0QscUJBQXFCO1FBQ25CLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbEMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDbEMsT0FBTyxFQUFFLEtBQUs7WUFDZCxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM5QixHQUFHLEVBQUMsSUFBSTtZQUNSLEVBQUUsRUFBQyxJQUFJO1lBQ1AsRUFBRSxFQUFDLElBQUk7WUFDUCxPQUFPLEVBQUMsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNqQyxNQUFNLEVBQUMsR0FBRztTQUNULENBQUMsQ0FBQztJQUNQLENBQUM7O3lKQS9zQlUsc0JBQXNCOzZJQUF0QixzQkFBc0IsbWNDckJuQyw2MG5CQTBZQTsyRkRyWGEsc0JBQXNCO2tCQUxsQyxTQUFTOytCQUNFLG9CQUFvQjt5VEFvQk4sU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNLLFlBQVk7c0JBQXRDLFNBQVM7dUJBQUMsY0FBYztnQkFDRSxZQUFZO3NCQUF0QyxTQUFTO3VCQUFDLGNBQWM7Z0JBQ0ksY0FBYztzQkFBMUMsU0FBUzt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgRWxlbWVudFJlZiwgVmlld0NoaWxkLCBQaXBlLCBBZnRlclZpZXdJbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBIZWFkZXJzICB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuaW1wb3J0IHsgUm91dGVyLCBBY3RpdmF0ZWRSb3V0ZSwgUGFyYW1zIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgVG9hc3RyU2VydmljZSB9IGZyb20gJ25neC10b2FzdHInO1xyXG5pbXBvcnQgeyBDb29raWUgfSBmcm9tICduZzItY29va2llcy9uZzItY29va2llcyc7XHJcbmltcG9ydCB7IE5neFNwaW5uZXJTZXJ2aWNlIH0gZnJvbSBcIm5neC1zcGlubmVyXCI7XHJcbmltcG9ydCB7IENvbnRhY3RTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uL2NvbnRhY3Qtc2VydmljZS9jb250YWN0LXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b2NrU2VydmljZVNlcnZpY2UgfSBmcm9tICcuLi9zdG9jay1zZXJ2aWNlL3N0b2NrLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IENvbW1hblNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vY29tbWFuLXNlcnZpY2UvY29tbWFuLXNlcnZpY2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuLy9pbXBvcnQgeyBUb29sYmFyU2VydmljZSwgTGlua1NlcnZpY2UsIEltYWdlU2VydmljZSwgSHRtbEVkaXRvclNlcnZpY2UsIFRhYmxlU2VydmljZSwgUXVpY2tUb29sYmFyU2VydmljZSB9IGZyb20gJ0BzeW5jZnVzaW9uL2VqMi1hbmd1bGFyLXJpY2h0ZXh0ZWRpdG9yJztcclxuLy9pbXBvcnQgKiBhcyBDbGFzc2ljRWRpdG9yIGZyb20gJ0Bja2VkaXRvci9ja2VkaXRvcjUtYnVpbGQtY2xhc3NpYyc7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCwgRm9ybUJ1aWxkZXIsVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuXHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY29udGFjdC1zZWFyY2gnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb250YWN0LXNlYXJjaC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vY29udGFjdC1zZWFyY2guY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250YWN0U2VhcmNoQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcblxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjczogQ29udGFjdFNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzczogU3RvY2tTZXJ2aWNlU2VydmljZSxcclxuICAgIHByaXZhdGUgc3Bpbm5lclNlcnZpY2U6IE5neFNwaW5uZXJTZXJ2aWNlICxcclxuICAgIHByaXZhdGUgY21uY3M6IENvbW1hblNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXJcclxuICApIHsgfVxyXG5cclxuICBAVmlld0NoaWxkKCdzdWJtaXRCdG4nKSBzdWJtaXRidG46IEVsZW1lbnRSZWY7XHJcbiAgQFZpZXdDaGlsZCgnc2xleGNsb3NlYnRuJykgc2xleGNsb3NlYnRuOiBFbGVtZW50UmVmO1xyXG4gIEBWaWV3Q2hpbGQoJ21haWxjbG9zZWJ0bicpIG1haWxjbG9zZWJ0bjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdub3RpZmljbG9zZWJ0bicpIG5vdGlmaWNsb3NlYnRuOiBFbGVtZW50UmVmO1xyXG5cclxucHVibGljIGNvbmZpZyA9IHtcclxuICBlZGl0YWJsZTogdHJ1ZSxcclxuICBzcGVsbGNoZWNrOiB0cnVlLFxyXG4gIGhlaWdodDogJzE1cmVtJyxcclxuICBtaW5IZWlnaHQ6ICc1cmVtJyxcclxuICBwbGFjZWhvbGRlcjogJ0VudGVyIHRleHQgaGVyZS4uLicsXHJcbiAgdHJhbnNsYXRlOiAnbm8nLFxyXG4gIGRlZmF1bHRQYXJhZ3JhcGhTZXBhcmF0b3I6ICdwJyxcclxuICBkZWZhdWx0Rm9udE5hbWU6ICdBcmlhbCdcclxuICBcclxufTtcclxuXHJcbnB1YmxpYyBub3RpY29uZmlnID0ge1xyXG4gIGVkaXRhYmxlOiB0cnVlLFxyXG4gIHNwZWxsY2hlY2s6IHRydWUsXHJcbiAgaGVpZ2h0OiAnNXJlbScsXHJcbiAgbWluSGVpZ2h0OiAnM3JlbScsXHJcbiAgcGxhY2Vob2xkZXI6ICdFbnRlciB0ZXh0IGhlcmUuLi4nLFxyXG4gIHRyYW5zbGF0ZTogJ25vJyxcclxuICBkZWZhdWx0UGFyYWdyYXBoU2VwYXJhdG9yOiAnJyxcclxuICBkZWZhdWx0Rm9udE5hbWU6ICcnLFxyXG4gIHRvb2xiYXJIaWRkZW5CdXR0b25zOiBbXHJcbiAgICBbXHJcbiAgICAgICdib2xkJyxcclxuICAgICAgJ2l0YWxpYycsXHJcbiAgICAgICd1bmRlcmxpbmUnLFxyXG4gICAgICAnc3RyaWtlVGhyb3VnaCcsXHJcbiAgICAgICdzdWJzY3JpcHQnLFxyXG4gICAgICAnc3VwZXJzY3JpcHQnLFxyXG4gICAgICAnanVzdGlmeUxlZnQnLFxyXG4gICAgICAnanVzdGlmeUNlbnRlcicsXHJcbiAgICAgICdqdXN0aWZ5UmlnaHQnLFxyXG4gICAgICAnanVzdGlmeUZ1bGwnLFxyXG4gICAgICAnaW5kZW50JyxcclxuICAgICAgJ291dGRlbnQnLFxyXG4gICAgICAnaW5zZXJ0VW5vcmRlcmVkTGlzdCcsXHJcbiAgICAgICdpbnNlcnRPcmRlcmVkTGlzdCcsXHJcbiAgICAgICdoZWFkaW5nJyxcclxuICAgICAgJ2ZvbnROYW1lJ1xyXG4gICAgXSxcclxuICAgIFtcclxuICAgICAgJ2ZvbnRTaXplJyxcclxuICAgICAgJ3RleHRDb2xvcicsXHJcbiAgICAgICdiYWNrZ3JvdW5kQ29sb3InLFxyXG4gICAgICAnY3VzdG9tQ2xhc3NlcycsXHJcbiAgICAgICdpbnNlcnRJbWFnZScsXHJcbiAgICAgICdpbnNlcnRWaWRlbycsXHJcbiAgICAgICdpbnNlcnRIb3Jpem9udGFsUnVsZScsXHJcbiAgICAgICdyZW1vdmVGb3JtYXQnLFxyXG4gICAgICAndG9nZ2xlRWRpdG9yTW9kZSdcclxuICAgIF1cclxuICBdXHJcbn07XHJcblxyXG5cclxuICBjVXJsO1xyXG4gIGhlYWRlcjtcclxuICBjRHQgPSBuZXcgRGF0ZSgpO1xyXG4gIGVkaXRvckNvbmZpZztcclxuXHJcbiAgY29udGFjdFR5cGVMaXN0O1xyXG4gIGN1cnJlbmN5TGlzdDtcclxuICB0ZXJtc0xpc3Q7XHJcbiAgcGFnZURlZmluYXRpb247XHJcbiAgaHRtbGNvbnRlbnQ7XHJcbiAgc2VhcmNoRjtcclxuXHJcbiAgZW1wbG95ZWVMaXN0ID0gW107XHJcbiAgY291bnRyeUxpc3QgPSBbXTtcclxuICBidXllckxpc3QgPSBbXTtcclxuICBzYWxlRXhlY3V0aXZlTGlzdCA9IFtdO1xyXG4gIGNpdHlMaXN0ID0gW107XHJcbiAgY29udGFjdFR5cGUgPSAnJztcclxuICBhY3Rpb25zID0gW107XHJcbiAgYnV5ZXJTdWdnO1xyXG4gIGVtcElkO1xyXG4gIFRlcm1zID0gJyc7XHJcbiAgY3VycmVuY3kgPSAnJztcclxuICB1c2VyTmFtZTtcclxuICBDaXR5ID0gJyc7XHJcbiAgdHJuc19idXR0b25zO1xyXG4gIGRhdGFIZWFkZXIgPSBbXTtcclxuICBkYXRhTGlzdCA9IFtdO1xyXG4gIGRhdGFIZWFkZXJQcmludDtcclxuICBidXR0b25zO1xyXG4gIHRhYnM7XHJcbiAgc3RhdHVzO1xyXG5cclxuICBNYWlsTXNnO1xyXG4gIHNhbGVFeGN1dGU7XHJcbiAgbmFtZUlkbkxpc3Q7XHJcbiAgbXlGb3JtbW06IEZvcm1Hcm91cDtcclxuICBteU5vdGlmaWNhdGlvbjogRm9ybUdyb3VwO1xyXG4gIG5vdGlmaWNhdGlvbk1kbExpc3Q9W107XHJcbiAgYnV5ZXI7XHJcbiAgbW10aW1lTGlzdD1bXTtcclxuICBoaHRpbWVMaXN0PVtdO1xyXG4gIGxvYWRQcm9jZXNzKCkge1xyXG4gICAgdGhpcy5zdGF0dXM9XCIwXCI7XHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybSddOyAvLydjb250YWN0U2VhcmNoRm9ybSc7Ly87XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZCc7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdjb250YWN0L2xvYWRDb250YWN0JykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLmNvbnRhY3RUeXBlTGlzdCA9IHJlc3BvbnNlLmNvbnRhY3RUeXBlTGlzdDtcclxuICAgICAgICB0aGlzLmN1cnJlbmN5TGlzdCA9IHJlc3BvbnNlLmN1cnJlbmN5TGlzdDtcclxuICAgICAgICB0aGlzLnRlcm1zTGlzdCA9IHJlc3BvbnNlLnRlcm1zTGlzdDtcclxuICAgICAgICB0aGlzLmNvdW50cnlMaXN0ID0gcmVzcG9uc2UuY291bnRyeUxpc3Q7XHJcbiAgICAgIC8vICB0aGlzLmJ1eWVyTGlzdCA9IHJlc3BvbnNlLmJ1eWVyTGlzdDtcclxuICAgICAgICB0aGlzLnNhbGVFeGVjdXRpdmVMaXN0ID0gcmVzcG9uc2Uuc2FsZUV4ZWN1dGl2ZUxpc3QubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbi52XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuYWN0aW9ucyA9IHJlc3BvbnNlLnBhZ2VEZWZpbmF0aW9uLmFjdGlvbnx8W107XHJcbiAgICAgICAgdGhpcy50YWJzICA9IHJlc3BvbnNlLnBhZ2VEZWZpbmF0aW9uLnRhYnN8fFtdXHJcbiAgICAgICAgdGhpcy50cm5zX2J1dHRvbnM9cmVzcG9uc2UucGFnZURlZmluYXRpb24udHJuc19idXR0b25zfHxbXTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihyZXNwb25zZS5tZXNzYWdlKTtcclxuICAgICAgfVxyXG4gICAgfSkuY2F0Y2goKGVycjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbiAgYWRkTmV3Q29udGFjdChkdGwpe1xyXG4gICAgY29uc29sZS5sb2coZHRsKTtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtkdGwubG92X3FyeV0pO1xyXG4gIH1cclxuXHJcbiBcclxuXHJcbiAgbG9hZEJ1eWVyKHNlYXJjaFRlcm0pIHtcclxuICAgXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnbGlrZVN0ciddID0gc2VhcmNoVGVybTtcclxuICAgIHJlcU9ialsndHlwJ10gPSAnQWxsJztcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkQnV5ZXInO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy9zZWFyY2gnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICB0aGlzLmJ1eWVyTGlzdCA9IHJlc3VsdC5idXllckxpc3QubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbi52XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgRW1wbG95ZWVMaXN0PVtdO1xyXG4gIGxvYWRTYWxlRXhjdXRpdmUoc2VhcmNoVGVybSkge1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2xpa2VTdHInXSA9IHNlYXJjaFRlcm07XHJcbiAgICByZXFPYmpbJ3R5cCddID0gJ2VtcGxveWVlJztcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdsb2FkQnV5ZXInO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5zcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ21hcmtldGluZy9zZWFyY2gnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcclxuICAgICAgICB0aGlzLkVtcGxveWVlTGlzdCA9IHJlc3VsdC5idXllckxpc3QubWFwKG9wdGlvbiA9PiAoe1xyXG4gICAgICAgICAgdmFsdWU6IG9wdGlvbi5rLFxyXG4gICAgICAgICAgbGFiZWw6IG9wdGlvbi52XHJcbiAgICAgICAgfSkpO1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZ2V0Q2l0eShjb3Vucnl0SWQpIHtcclxuICAgIGlmIChjb3Vucnl0SWQgPT0gdW5kZWZpbmVkIHx8IGNvdW5yeXRJZCA9PSAnJykgcmV0dXJuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm0nXTsgXHJcbiAgICByZXFPYmpbJ2NvdW50cnlJZG4nXSA9IGNvdW5yeXRJZDtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdnZXRDaXR5QmFzZWRPbkNvdW50cnknO1xyXG4gICAgbGV0IG9wdGlvbnMgPSAoeyBoZWFkZXJzOiBuZXcgSHR0cEhlYWRlcnModGhpcy5oZWFkZXIpIH0pO1xyXG4gICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ2NvbnRhY3QvbG9hZENvbnRhY3QnKS50aGVuKChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy5jaXR5TGlzdCA9IFtdO1xyXG4gICAgICAgIHRoaXMuQ2l0eSA9ICcnO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLmNpdHlMaXN0ID0gcmVzcG9uc2UuY2l0eUxpc3Q7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBvblN1Ym1pdChmb3JtVmFsLCBzdWJCdG4pIHtcclxuICAgIFxyXG4gICAgdmFyIHQgPSBPYmplY3Qua2V5cyhmb3JtVmFsLmZvcm0uY29udHJvbHMpLmZvckVhY2goZmllbGQgPT4ge1xyXG4gICAgICBjb25zdCBjb250cm9sID0gZm9ybVZhbC5mb3JtLmdldChmaWVsZCk7XHJcbiAgICB9KTtcclxuICAgLy8gdGhpcy5zZWFyY2hDb250YWN0KGZvcm1WYWwudmFsdWUsIHN1YkJ0bik7XHJcbiAgfVxyXG5cclxuICBzZWFyY2hDb250YWN0KCkge1xyXG4gICAgZGVidWdnZXJcclxuICAgIC8vY29uc29sZS5sb2coZnJtRmxkKTtcclxuICAgIC8vIFwiZm9ybU5tZVwiOlwiY29udGFjdFNlYXJjaEZvcm1cIixcclxuICAgIC8vIFwidGFibGVOYW1lVmFyXCI6XCJubWVfbSNubWVfbSNubWVfbSNidXllcl90ZXJtcyNidXllcl90ZXJtc1wiLFxyXG4gICAgLy8gXCJ0YWJsZUZpZWxkVmFyXCI6XCJlbXBfaWRuI25tZV9pZG4jdHlwI2N1cnJlbmN5X2lkbiN0ZXJtc19pZG5cIixcclxuICAgIC8vIFwidHlwZVZhclwiOlwibiNuI24jbiNuXCIsXHJcbiAgICAvLyBcImF0dHJWYXJcIjpcImVtcF9pZG4jbm1lX2lkbiN0eXAjY3VycmVuY3lfaWRuI3Rlcm1zX2lkblwiLFxyXG4gICAgLy8gXCJ2YWx1ZXNWYXJcIjpcIjI3NTg4IzI4MTczI2J1eWVyIzIwNiMyNDZcIixcclxuICAgIC8vIFwiZGF0YVR5cGVWYXJcIjpcIm4jbiNjI24jblwiXHJcblxyXG4gICAgLy8qKioqKmZvciB1c2VybmFtZSoqKioqKioqIC8vL1xyXG4gICAgLy8gXCJ0YWJsZU5hbWVWYXJcIjpcImFwcGxfdXNlclwiLFxyXG4gICAgLy8gIFwidGFibGVGaWVsZFZhclwiOlwidXNlcm5hbWVcIixcclxuICAgIC8vICBcInR5cGVWYXJcIjpcIm5cIixcclxuICAgIC8vICBcImF0dHJWYXJcIjpcInVzZXJuYW1lXCIsXHJcbiAgICAvLyAgXCJ2YWx1ZXNWYXJcIjpcIm5pbGFtd2ViXCIsXHJcbiAgICAvLyAgXCJkYXRhVHlwZVZhclwiOlwiY1wiXHJcblxyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcblxyXG4gICAgbGV0IHRhYmxlTmFtZVZhciA9ICcnO1xyXG4gICAgbGV0IHRhYmxlRmllbGRWYXIgPSAnJztcclxuICAgIGxldCB0eXBlVmFyID0gJyc7XHJcbiAgICBsZXQgYXR0clZhciA9ICcnO1xyXG4gICAgbGV0IHZhbHVlc1ZhciA9ICcnO1xyXG4gICAgbGV0IGRhdGFUeXBlVmFyID0gJyc7XHJcbiAgICBpZiAodGhpcy51c2VyTmFtZSAhPSBudWxsICYmIHRoaXMudXNlck5hbWUgIT0gXCJcIiAmJiB0aGlzLnVzZXJOYW1lICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0YWJsZU5hbWVWYXIgKz0gJ2FwcGxfdXNlcicgKyAnIyc7XHJcbiAgICAgIHRhYmxlRmllbGRWYXIgKz0gJ3VzZXJuYW1lJyArICcjJztcclxuICAgICAgdHlwZVZhciArPSAnbicgKyAnIyc7XHJcbiAgICAgIGF0dHJWYXIgKz0gJ3VzZXJuYW1lJyArICcjJztcclxuICAgICAgdmFsdWVzVmFyICs9IHRoaXMudXNlck5hbWUgKyAnIyc7XHJcbiAgICAgIGRhdGFUeXBlVmFyICs9ICdjJyArICcjJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jb250YWN0VHlwZSAhPSBudWxsICYmIHRoaXMuY29udGFjdFR5cGUgIT0gXCJcIiAmJiB0aGlzLmNvbnRhY3RUeXBlICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0YWJsZU5hbWVWYXIgKz0gJ25tZV9tJyArICcjJztcclxuICAgICAgdGFibGVGaWVsZFZhciArPSAndHlwJyArICcjJztcclxuICAgICAgdHlwZVZhciArPSAnbicgKyAnIyc7XHJcbiAgICAgIGF0dHJWYXIgKz0gJ3R5cCcgKyAnIyc7XHJcbiAgICAgIHZhbHVlc1ZhciArPSB0aGlzLmNvbnRhY3RUeXBlKyAnIyc7XHJcbiAgICAgIGRhdGFUeXBlVmFyICs9ICdjJyArICcjJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5idXllciAhPSBudWxsICYmIHRoaXMuYnV5ZXIgIT0gXCJcIiAmJiB0aGlzLmJ1eWVyICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0YWJsZU5hbWVWYXIgKz0gJ25tZV9tJyArICcjJztcclxuICAgICAgdGFibGVGaWVsZFZhciArPSAnbm1lX2lkbicgKyAnIyc7XHJcbiAgICAgIHR5cGVWYXIgKz0gJ24nICsgJyMnO1xyXG4gICAgICBhdHRyVmFyICs9ICdubWVfaWRuJyArICcjJztcclxuICAgICAgdmFsdWVzVmFyICs9IHRoaXMuYnV5ZXIgKyAnIyc7XHJcbiAgICAgIGRhdGFUeXBlVmFyICs9ICduJyArICcjJztcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmVtcElkICE9IG51bGwgJiYgdGhpcy5lbXBJZCAhPSBcIlwiICYmIHRoaXMuZW1wSWQgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRhYmxlTmFtZVZhciArPSAnbm1lX20nICsgJyMnO1xyXG4gICAgICB0YWJsZUZpZWxkVmFyICs9ICdlbXBfaWRuJyArICcjJztcclxuICAgICAgdHlwZVZhciArPSAnbicgKyAnIyc7XHJcbiAgICAgIGF0dHJWYXIgKz0gJ2VtcF9pZG4nICsgJyMnO1xyXG4gICAgICB2YWx1ZXNWYXIgKz0gdGhpcy5lbXBJZCArICcjJztcclxuICAgICAgZGF0YVR5cGVWYXIgKz0gJ24nICsgJyMnO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLlRlcm1zICE9IG51bGwgJiYgdGhpcy5UZXJtcyAhPSBcIlwiICYmIHRoaXMuVGVybXMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRhYmxlTmFtZVZhciArPSAnYnV5ZXJfdGVybXMnICsgJyMnO1xyXG4gICAgICB0YWJsZUZpZWxkVmFyICs9ICd0ZXJtc19pZG4nICsgJyMnO1xyXG4gICAgICB0eXBlVmFyICs9ICduJyArICcjJztcclxuICAgICAgYXR0clZhciArPSAndGVybXNfaWRuJyArICcjJztcclxuICAgICAgdmFsdWVzVmFyICs9IHRoaXMuVGVybXMgKyAnIyc7XHJcbiAgICAgIGRhdGFUeXBlVmFyICs9ICduJyArICcjJztcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5jdXJyZW5jeSAhPSBudWxsICYmIHRoaXMuY3VycmVuY3kgIT0gXCJcIiAmJiB0aGlzLmN1cnJlbmN5ICE9IHVuZGVmaW5lZCkge1xyXG4gICAgICB0YWJsZU5hbWVWYXIgKz0gJ2J1eWVyX3Rlcm1zJyArICcjJztcclxuICAgICAgdGFibGVGaWVsZFZhciArPSAnY3VycmVuY3lfaWRuJyArICcjJztcclxuICAgICAgdHlwZVZhciArPSAnbicgKyAnIyc7XHJcbiAgICAgIGF0dHJWYXIgKz0gJ2N1cnJlbmN5X2lkbicgKyAnIyc7XHJcbiAgICAgIHZhbHVlc1ZhciArPSB0aGlzLmN1cnJlbmN5ICsgJyMnO1xyXG4gICAgICBkYXRhVHlwZVZhciArPSAnbicgKyAnIyc7XHJcbiAgICB9XHJcblxyXG4gICBcclxuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gIHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm0nXTsgXHJcbiAgICByZXFPYmpbJ3RhYmxlTmFtZVZhciddID0gdGFibGVOYW1lVmFyLnNsaWNlKDAsIC0xKTsvLydubWVfbSc7XHJcbiAgICByZXFPYmpbJ3RhYmxlRmllbGRWYXInXSA9IHRhYmxlRmllbGRWYXIuc2xpY2UoMCwgLTEpOy8vJ3R5cCc7XHJcbiAgICByZXFPYmpbJ3R5cGVWYXInXSA9IHR5cGVWYXIuc2xpY2UoMCwgLTEpOy8vJ24nO1xyXG4gICAgcmVxT2JqWydhdHRyVmFyJ10gPSBhdHRyVmFyLnNsaWNlKDAsIC0xKTsvLyd0eXAnO1xyXG4gICAgcmVxT2JqWyd2YWx1ZXNWYXInXSA9IHZhbHVlc1Zhci5zbGljZSgwLCAtMSk7IC8vY29udGFjdFR5cGUucHJpbnQudG9Mb3dlckNhc2UoKTtcclxuICAgIHJlcU9ialsnZGF0YVR5cGVWYXInXSA9IGRhdGFUeXBlVmFyLnNsaWNlKDAsIC0xKTsvLydjJztcclxuICAgIGlmICh0aGlzLm5hbWVJZG5MaXN0ICE9IFwiXCIgJiYgdGhpcy5uYW1lSWRuTGlzdCAhPSB1bmRlZmluZWQgJiYgdGhpcy5uYW1lSWRuTGlzdCAhPSBudWxsKSB7XHJcbiAgICAgIHRoaXMubmFtZUlkbkxpc3Q9dGhpcy5uYW1lSWRuTGlzdC50cmltKCk7XHJcbiAgICAgIGxldCBzcGFjZVRvY29tbWEgPSB0aGlzLm5hbWVJZG5MaXN0LnJlcGxhY2UoL1sgLF0rL2csIFwiLFwiKTtcclxuICAgICAgbGV0IG5ld0xpbmVUb0NvbW1hID0gc3BhY2VUb2NvbW1hLnJlcGxhY2UoL1xcbi9nLCBcIixcIik7XHJcbiAgICAgIHJlcU9ialsnbm1lSWRuTGlzdCddPSBuZXdMaW5lVG9Db21tYS5zcGxpdCgnLCcpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5oZWFkZXJbJ21ldGhvZCddID0gJ3NlYXJjaENvbnRhY3QnO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICBcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdjb250YWN0L2xvYWRDb250YWN0JykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZiAocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlKTtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLmRhdGFIZWFkZXIgPSByZXNwb25zZS5kYXRhSGVhZGVyO1xyXG4gICAgICAgIHRoaXMuZGF0YUxpc3QgPSByZXNwb25zZS5kYXRhTGlzdDtcclxuICAgICAgICB0aGlzLmRhdGFIZWFkZXJQcmludCA9IHJlc3BvbnNlLmRhdGFIZWFkZXJQcmludDtcclxuICAgICAgICB0aGlzLnBhZ2VEZWZpbmF0aW9uID0gcmVzcG9uc2UucGFnZURlZmluYXRpb247XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0bT1bXTtcclxuICAgICAgICB0aGlzLm5hbWVJZG5MaXN0PVwiXCI7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ3cmFwXCIpLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgdmFyIHRyYW5zbGF0ZSA9IFwidHJhbnNsYXRlKDAsXCIgKyB0aGlzLnNjcm9sbFRvcCArIFwicHgpXCI7XHJcbiAgICAgICAgICB0aGlzLnF1ZXJ5U2VsZWN0b3IoXCJ0aGVhZFwiKS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2xhdGU7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIHVzZXJBY3Rpb24odWEsIGMsIGEpIHtcclxuICAgIGRlYnVnZ2VyXHJcbiAgICBpZiAodWEgJiYgYy50cmltKCkgPT0gJ3N1YmZvcm0nKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFthLmxvdl9xcnkudHJpbSgpLCBhLmNvbHVtbl9rZXksIHVhLm5tZV9pZG5dKTtcclxuICAgIH1cclxuICB9XHJcbiAgdG9vbGFjdGlvbnModGFiKXtcclxuICBcclxuICAgICAgY29uc29sZS5sb2coXCJwcm9jZXNzXCIsIHByb2Nlc3MpO1xyXG4gICAgICBzd2l0Y2ggKHRhYi5mb3JtX2ZpZWxkKSB7XHJcblxyXG4gICAgICAgIGNhc2UgXCJhZGRub3RpZmljYXRpb25cIjoge1xyXG4gICAgICAgICAgdGhpcy5Ob3RpZmljYXRpb25Qb3B1cCgpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfSBkZWZhdWx0OiB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZyhcIkludmFsaWQgY2hvaWNlXCIpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICBcclxuICBcclxuICB9XHJcblxyXG4gIE5vdGlmaWNhdGlvblBvcHVwKCl7XHJcbiAgICBpZih0aGlzLnNlbGVjdGVkSXRtLmxlbmd0aD4wKXtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25Gb3JtcmVzZXQoKTtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgICAgcmVxT2JqWydmb3JtTm1lJ10gPSAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybSddO1xyXG4gICAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnbG9hZE5vdGlmaWNhdGlvbic7XHJcbiAgICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgICAgdGhpcy5jcy5sb2FkKHJlcU9iaiwgb3B0aW9ucywgJ2NvbnRhY3Qvbm90aWZpY2F0aW9uJykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0fHx7fTtcclxuICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWRsTGlzdCA9IHJlc3VsdC5ub3RpZmljYXRpb25NZGxMaXN0fHxbXTtcclxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdidG5Ob3RpZmljYXRpb24nKS5jbGljaygpO1xyXG4gICAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihlcnIubWVzc2FnZSk7XHJcbiAgICAgIH0pO1xyXG5cclxuICAgICAgXHJcbiAgICAgfWVsc2V7XHJcbiAgICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBzZWxlY3QgY29udGFjdHNcIik7XHJcbiBcclxuICAgICB9XHJcbiAgfVxyXG5cclxuICBBZGROb3RpZmljYXRpb24oKXtcclxuICAgIGlmICh0aGlzLm15Tm90aWZpY2F0aW9uLnZhbGlkKSB7XHJcbiAgICBsZXQgZm9ybXNWYWwgPSB0aGlzLm15Tm90aWZpY2F0aW9uLnZhbHVlO1xyXG4gICAgbGV0IGJ1eWVyTGlzdD1bXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdG0uZm9yRWFjaChlbGVtZW50PT57XHJcbiAgICAgIGxldCBubWVfaWRuID0gZWxlbWVudC5ubWVfaWRufHxbXTtcclxuICAgICAgYnV5ZXJMaXN0LnB1c2gobm1lX2lkbik7XHJcbiAgICB9KVxyXG4gICAgZGVidWdnZXJcclxuICAgIGxldCBkYXRlU3RyaW5nID0gZm9ybXNWYWxbJ2xvZ2RhdGUnXSsnICcrZm9ybXNWYWxbJ2hoJ10rJzonK2Zvcm1zVmFsWydtbSddKyc6MDAnO1xyXG4gICAgbGV0IHJlcU9iaiA9IHt9O1xyXG4gICAgcmVxT2JqWydmb3JtTm1lJ10gPSAgdGhpcy5yb3V0ZS5zbmFwc2hvdC5wYXJhbXNbJ2ZybSddO1xyXG4gICAgcmVxT2JqWydsb2dfdHMnXSA9ZGF0ZVN0cmluZztcclxuICAgIHJlcU9ialsncHViX3B2dCddID0gZm9ybXNWYWxbJ3B1Yl9wdnQnXTtcclxuICAgIHJlcU9ialsnbWRsJ10gPSBmb3Jtc1ZhbFsnbWRsJ107XHJcbiAgICByZXFPYmpbJ3NyYyddID0gZm9ybXNWYWxbJ3NyYyddO1xyXG4gICAgcmVxT2JqWydtc2cnXSA9IGZvcm1zVmFsWydtYXNzYWdlJ107XHJcbiAgICByZXFPYmpbJ3N0YXR1cyddID0gZm9ybXNWYWxbJ3N0YXR1cyddO1xyXG4gICAgcmVxT2JqWydidXllckxpc3QnXSA9IGJ1eWVyTGlzdDtcclxuICAgIHJlcU9ialsnYWN0aW9uJ10gPSAnYWRkJyA7XHJcbiAgICBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShyZXFPYmopKTtcclxuICAgIHRoaXMuaGVhZGVyWydtZXRob2QnXSA9ICdzYXZlTm90aWZpY2F0aW9uJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdjb250YWN0L25vdGlmaWNhdGlvbicpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PSAnU1VDQ0VTUycpIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0fHx7fTtcclxuICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbkZvcm1yZXNldCgpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdG09W107XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy5ub3RpZmljbG9zZWJ0bi5uYXRpdmVFbGVtZW50LmNsaWNrKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIk5vdGlmaWNhdGlvbiBhZGRlZCBzdWNjZXNzZnVsbHkuXCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1lbHNle1xyXG4gICAgdGhpcy50b2FzdHIuZXJyb3IoXCJQbGVhc2Ugc3BlY2lmeSBhbGwgcmVxdWlyZWQgZmllbGRcIik7XHJcblxyXG4gIH1cclxuXHJcbiAgfVxyXG5cclxuICBleHBvcnRFeGNlbCgpIHtcclxuICAgIHRoaXMuY21uY3MuQ1NWQ29udmVydG9yKHRoaXMuZGF0YUxpc3QsICdDb250YWN0X1NlYXJjaF8nLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIE1haWxQb3B1cCgpe1xyXG4gICAgaWYodGhpcy5zZWxlY3RlZEl0bS5sZW5ndGg+MCl7XHJcbiAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bnNlbmRNYWlsJykuY2xpY2soKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBzZWxlY3QgY29udGFjdHNcIik7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgVXBkYXRlU2FsZUV4ZWN1dGl2ZVBvcCgpe1xyXG4gICAgaWYodGhpcy5zZWxlY3RlZEl0bS5sZW5ndGg+MCl7XHJcbiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnRuc2FsZWV4JykuY2xpY2soKTtcclxuICAgIH1lbHNle1xyXG4gICAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBzZWxlY3QgY29udGFjdHNcIik7XHJcblxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgVXBkYXRlU2FsZUV4ZWN1dGl2ZSgpe1xyXG4gICAgbGV0IG5tZUlkbkxpc3Q9W107XHJcbiAgICB0aGlzLnNlbGVjdGVkSXRtLmZvckVhY2goZWxlbWVudD0+e1xyXG4gICAgICBsZXQgbm1lX2lkbiA9IGVsZW1lbnQubm1lX2lkbnx8W107XHJcbiAgICAgICAgbm1lSWRuTGlzdC5wdXNoKG5tZV9pZG4pO1xyXG4gICAgfSlcclxuICAgIHRoaXMuc2FsZUV4Y3V0ZT10aGlzLnNhbGVFeGN1dGV8fFwiXCI7XHJcbiAgICBpZih0aGlzLnNhbGVFeGN1dGUhPVwiXCIpe1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5zaG93KCk7XHJcbiAgICBsZXQgcmVxT2JqID0ge307XHJcbiAgICByZXFPYmpbJ2Zvcm1ObWUnXSA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zWydmcm0nXTsgXHJcbiAgICByZXFPYmpbJ25tZUlkbkxpc3QnXT1ubWVJZG5MaXN0O1xyXG4gICAgcmVxT2JqWydlbXBfaWRuJ109dGhpcy5zYWxlRXhjdXRlO1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnYXNzaWduU2FsZUV4ZWN1dGl2ZSc7XHJcbiAgICBsZXQgb3B0aW9ucyA9ICh7IGhlYWRlcnM6IG5ldyBIdHRwSGVhZGVycyh0aGlzLmhlYWRlcikgfSk7XHJcbiAgICB0aGlzLmNzLmxvYWQocmVxT2JqLCBvcHRpb25zLCAnY29udGFjdC9sb2FkQ29udGFjdCcpLnRoZW4oKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgaWYocmVzcG9uc2Uuc3RhdHVzID09ICdTVUNDRVNTJykge1xyXG4gICAgICAgIHRoaXMuc2FsZUV4Y3V0ZT1cIlwiO1xyXG4gICAgICAgIHRoaXMuc2xleGNsb3NlYnRuLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhcIlVwZGF0ZSBkb25lIHN1Y2Nlc3NmdWxseVwiKTtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIH1cclxuICAgIH0pLmNhdGNoKChlcnI6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLmhpZGUoKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IoZXJyLm1lc3NhZ2UpO1xyXG4gICAgfSk7XHJcbiAgfWVsc2V7XHJcbiAgICB0aGlzLnRvYXN0ci5lcnJvcihcIlBsZWFzZSBTcGVjaWZ5IFNhbGUgRXhlY3V0aXZlXCIpO1xyXG5cclxuICB9XHJcbiAgXHJcbiAgfVxyXG5cclxuICBTZW5kTWFpbCgpe1xyXG4gICAgbGV0IGZvcm1zVmFsID0gdGhpcy5teUZvcm1tbS52YWx1ZTtcclxuZGVidWdnZXJcclxuICAgIGxldCBpc1ZhbGlkID0gdHJ1ZTtcclxuICAgIGxldCBtYXNzYWdlPVwiXCI7XHJcbiAgICBsZXQgaHRtbGNvbnRlbnQgPWZvcm1zVmFsWydodG1sY29udGVudCddfHwnJztcclxuICAgIGxldCBzdWJqZWN0PWZvcm1zVmFsWydzdWJqZWN0J118fCcnO1xyXG4gICAgbGV0IHNlbmRlck5hbWU9Zm9ybXNWYWxbJ3NlbmRlck5hbWUnXXx8Jyc7XHJcbiAgICBpZih0aGlzLnNlbGVjdGVkSXRtLmxlbmd0aD09MCl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgbWFzc2FnZT1cIlBsZWFzZSBzZWxlY3QgY29udGFjdHMgZm9yIG1haWxcIjtcclxuXHJcbiAgICB9XHJcbiAgICBpZihzdWJqZWN0PT0nJyl7XHJcbiAgICAgIGlzVmFsaWQgPSBmYWxzZTtcclxuICAgICAgbWFzc2FnZT1cIlBsZWFzZSBTcGVjaWZ5IFN1YmplY3RcIjtcclxuXHJcbiAgICB9XHJcbiAgICBpZihodG1sY29udGVudD09Jycpe1xyXG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIG1hc3NhZ2U9XCJQbGVhc2UgU3BlY2lmeSBNYWlsIEJvZHlcIjtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgaWYoc2VuZGVyTmFtZT09Jycpe1xyXG4gICAgICBpc1ZhbGlkID0gZmFsc2U7XHJcbiAgICAgIG1hc3NhZ2U9XCJQbGVhc2UgU3BlY2lmeSBTZW5kZXIgTmFtZVwiO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBpZihpc1ZhbGlkKXtcclxuICAgIGxldCBDQ2xzdCA9Zm9ybXNWYWxbJ0NDJ10gfHwnJztcclxuICAgIGxldCBCQ0Nsc3QgPSBmb3Jtc1ZhbFsnQkNDJ118fCcnO1xyXG4gICAgbGV0IGNjPVtdO1xyXG4gICAgbGV0IGJjYz1bXTtcclxuXHJcbiAgICB0aGlzLnNwaW5uZXJTZXJ2aWNlLnNob3coKTtcclxuICAgXHJcblxyXG4gICAgaWYoQ0Nsc3QhPScnKXtcclxuICAgbGV0IHNwYWNlVG9jb21tYSA9IENDbHN0LnJlcGxhY2UoL1sgLF0rL2csIFwiLFwiKTtcclxuICAgICBsZXQgbmV3TGluZVRvQ29tbWEgPSBzcGFjZVRvY29tbWEucmVwbGFjZSgvXFxuL2csIFwiLFwiKTtcclxuICAgICBjYyA9IG5ld0xpbmVUb0NvbW1hLnNwbGl0KCcsJyk7XHJcbiAgICB9XHJcbiAgICBpZihCQ0Nsc3QhPScnKXtcclxuICAgbGV0IHNwYWNlVG9jb21tYSA9IEJDQ2xzdC5yZXBsYWNlKC9bICxdKy9nLCBcIixcIik7XHJcbiAgICBsZXQgbmV3TGluZVRvQ29tbWEgPSBzcGFjZVRvY29tbWEucmVwbGFjZSgvXFxuL2csIFwiLFwiKTtcclxuICAgICBiY2MgPSBuZXdMaW5lVG9Db21tYS5zcGxpdCgnLCcpO1xyXG4gICAgfVxyXG4gICAgbGV0IGVtYWlsRGV0YWlscz1bXTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdG0uZm9yRWFjaChlbGVtZW50PT57XHJcbiAgICAgIGxldCBlbWFpbElkbnMgPSBlbGVtZW50LmVtYWlsSWRuc3x8W107XHJcbiAgICAgIGxldCBubWVfaWRuPWVsZW1lbnQubm1lX2lkbjtcclxuICAgICAgbGV0IGVtcF9pZG49ZWxlbWVudC5lbXBfaWRuO1xyXG4gICAgICBpZihlbWFpbElkbnMubGVuZ3RoPjApe1xyXG4gICAgICBlbWFpbERldGFpbHMucHVzaCh7XHJcbiAgICAgICAgXCJlbWFpbHNcIjplbWFpbElkbnMsXHJcbiAgICAgICAgXCJubWVfaWRuXCI6bm1lX2lkbixcclxuICAgICAgICBcImVtcF9pZG5cIjplbXBfaWRuXHJcbiAgICAgIH0pXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICBkZWJ1Z2dlclxyXG4gICBcclxuICAgIGxldCByZXFPYmogPSB7fTtcclxuICAgIHJlcU9ialsnZm9ybU5tZSddID0gXCJDb250YWN0TWFzc01haWxcIjtcclxuICAgIHJlcU9ialsnc2VuZGVybmFtZSddPXNlbmRlck5hbWU7XHJcbiAgICByZXFPYmpbJ3N1YmplY3QnXT1zdWJqZWN0O1xyXG4gICAgcmVxT2JqWydtYWlsZGV0YWlscyddPWVtYWlsRGV0YWlscztcclxuICAgIHJlcU9ialsnY2MnXT1jYztcclxuICAgIHJlcU9ialsnYmNjJ109YmNjO1xyXG4gICAgcmVxT2JqWydtYWlsQm9keSddPWh0bWxjb250ZW50O1xyXG4gICAgY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkocmVxT2JqKSk7XHJcbiAgICB0aGlzLmhlYWRlclsnbWV0aG9kJ10gPSAnc2VuZEJ1bGtNYWlsJztcclxuICAgIGxldCBvcHRpb25zID0gKHsgaGVhZGVyczogbmV3IEh0dHBIZWFkZXJzKHRoaXMuaGVhZGVyKSB9KTtcclxuICAgIHRoaXMuY3MubG9hZChyZXFPYmosIG9wdGlvbnMsICdjb250YWN0L2xvYWRDb250YWN0JykudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICBpZihyZXNwb25zZS5zdGF0dXMgPT0gJ1NVQ0NFU1MnKSB7XHJcbiAgICAgICAgdGhpcy5teUZvcm1tbSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICAgICAgc2VuZGVyTmFtZTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcclxuICAgICAgICAgIHN1YmplY3Q6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgICAgICBodG1sY29udGVudDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICAgICAgQ0M6IFwiXCIsXHJcbiAgICAgICAgICBCQ0M6XCJcIlxyXG4gICAgICAgfSk7XHJcbiAgICAgIHRoaXMubWFpbGNsb3NlYnRuLm5hdGl2ZUVsZW1lbnQuY2xpY2soKTtcclxuICAgICAgdGhpcy50b2FzdHIuZXJyb3IocmVzcG9uc2UubWVzc2FnZSk7XHJcbiAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc3Bpbm5lclNlcnZpY2UuaGlkZSgpO1xyXG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKHJlc3BvbnNlLm1lc3NhZ2UpO1xyXG4gICAgICB9XHJcbiAgICB9KS5jYXRjaCgoZXJyOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICAgIHRoaXMudG9hc3RyLmVycm9yKGVyci5tZXNzYWdlKTtcclxuICAgIH0pO1xyXG4gIH1lbHNle1xyXG4gICAgdGhpcy5zcGlubmVyU2VydmljZS5oaWRlKCk7XHJcbiAgICB0aGlzLnRvYXN0ci5lcnJvcihtYXNzYWdlKTtcclxuICB9XHJcblxyXG4gIH1cclxuXHJcblxyXG4gIGdldCBub3RpZmljYXRpb25Db250cm9sKCkge1xyXG4gICAgcmV0dXJuIHRoaXMubXlOb3RpZmljYXRpb24uY29udHJvbHM7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RSb3cobm1lX2lkbikge1xyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NiXycrbm1lX2lkbikuY2xpY2soKTtcclxuICB9XHJcbiAgc2VsZWN0QWxsKGUpIHtcclxuICAgICAgdGhpcy5kYXRhTGlzdC5mb3JFYWNoKGVsZT0+e1xyXG4gICAgICAgIGRlYnVnZ2VyXHJcbiAgICAgICAgdGhpcy5zZWxlY3RSb3coZWxlLm5tZV9pZG4pO1xyXG4gICAgICB9KVxyXG4gICAgXHJcbiAgfVxyXG5cclxuICBzZWxlY3RlZE9iaiA9IFtdO1xyXG4gIHNlbGVjdGVkSXRtID0gW107XHJcbiAgc2VsZWN0ZWRDcnRXZWlnaHQgPSAwO1xyXG4gIGNoZWNrZWRSb3coZGF0YSwgbm1lX2lkbikge1xyXG4gICAgZGVidWdnZXJcclxuICAgIGlmICgoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NiXycrbm1lX2lkbikgYXMgYW55KS5jaGVja2VkID09IGZhbHNlKSB7XHJcbiAgICAgIGxldCBlbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NiXycrbm1lX2lkbik7Ly9wa3RJZFxyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIGVsZW1lbnQucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50LmNsYXNzTGlzdC5hZGQoXCJub3RzZWxlY3RlZFJvd1wiKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0bS5mb3JFYWNoKChlbGVtZW50LCBpbmRleCkgPT4ge1xyXG4gICAgICAgIGlmIChlbGVtZW50Lm5tZV9pZG4gPT0gbm1lX2lkbikge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0bS5zcGxpY2UoaW5kZXgsIDEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYl8nK25tZV9pZG4pOy8vcGt0SWRcclxuICAgICAgZWxlbWVudC5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZShcIm5vdHNlbGVjdGVkUm93XCIpO1xyXG4gICAgICBlbGVtZW50LnBhcmVudEVsZW1lbnQucGFyZW50RWxlbWVudC5jbGFzc0xpc3QuYWRkKFwic2VsZWN0ZWRSb3dcIik7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdG0ucHVzaChkYXRhKTtcclxuICAgIH1cclxuY29uc29sZS5sb2codGhpcy5zZWxlY3RlZEl0bSk7XHJcblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmVkaXRvckNvbmZpZyA9IHRoaXMuY21uY3MuZWRpdG9yQ29uZmlnO1xyXG5cclxuICAgIGxldCBtZGxrID0gSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnbWRsS2V5JykpO1xyXG4gICAgdGhpcy5jVXJsID0gdGhpcy5yb3V0ZXIudXJsO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5jVXJsLnNwbGl0KCcvJylbMV0pO1xyXG4gICAgdGhpcy5oZWFkZXIgPSB7XHJcbiAgICAgICdjbGllbnRrZXknOiBDb29raWUuZ2V0KCdfY2snKSxcclxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcclxuICAgICAgJ21vZHVsZWtleSc6IG1kbGtbdGhpcy5jVXJsLnNwbGl0KCcvJylbMV1dLFxyXG4gICAgICAnbG9naW5pZCc6IENvb2tpZS5nZXQoJ19sb2dpZCcpLFxyXG4gICAgICAnc291cmNlJzogJ3FzJ1xyXG4gICAgfTtcclxuICAgXHJcbiAgICB0aGlzLm15Rm9ybW1tID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHNlbmRlck5hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN1YmplY3Q6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIGh0bWxjb250ZW50OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIENDOiBcIlwiLFxyXG4gICAgICBCQ0M6XCJcIlxyXG4gIH0pO1xyXG4gIHRoaXMubW10aW1lTGlzdD1bXTtcclxuICBmb3IodmFyIGk9MDtpPDI0O2krKyl7XHJcbiAgICBpZihpPDEwKVxyXG4gICAgdGhpcy5tbXRpbWVMaXN0LnB1c2goXCIwXCIraSk7XHJcbiAgICBlbHNlXHJcbiAgICB0aGlzLm1tdGltZUxpc3QucHVzaChcIlwiK2kpO1xyXG4gIH1cclxuXHJcbiAgdGhpcy5oaHRpbWVMaXN0PVtdO1xyXG4gIGZvcih2YXIgaT0wO2k8NjA7aSsrKXtcclxuICAgIGlmKGk8MTApXHJcbiAgICB0aGlzLmhodGltZUxpc3QucHVzaChcIjBcIitpKTtcclxuICAgIGVsc2VcclxuICAgIHRoaXMuaGh0aW1lTGlzdC5wdXNoKFwiXCIraSk7XHJcbiAgfVxyXG5cclxuICAgIHRoaXMubm90aWZpY2F0aW9uRm9ybXJlc2V0KCk7XHJcbiAgICB0aGlzLmxvYWRQcm9jZXNzKCk7XHJcbiAgfVxyXG4gIG5vdGlmaWNhdGlvbkZvcm1yZXNldCgpe1xyXG4gICAgdGhpcy5teU5vdGlmaWNhdGlvbiA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBsb2dkYXRlOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxyXG4gICAgICBwdWJfcHZ0OiBcIlBWVFwiLFxyXG4gICAgICBtZGw6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHNyYzpcImV6XCIsXHJcbiAgICAgIGhoOlwiMDBcIixcclxuICAgICAgbW06XCIwMFwiLFxyXG4gICAgICBtYXNzYWdlOlsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXHJcbiAgICAgIHN0YXR1czpcIlBcIlxyXG4gICAgICB9KTtcclxuICB9XHJcbn1cclxuIiwiPGRpdiBjbGFzcz1cIm10XCI+XHJcbiAgPGRpdiBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJwYW5lbC1oZWFkaW5nXCI+XHJcbiAgICAgIDxoMyBjbGFzcz1cInBhbmVsLXRpdGxlXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1jaGV2cm9uLWxlZnQgY3BcIj4gQmFjazwvc3Bhbj4mbmJzcDsmbmJzcDsmbmJzcDsgQ29udGFjdCBTZWFyY2gmbmJzcDsmbmJzcDsmbmJzcDtcclxuICAgICAgICA8c3BhbiBjbGFzcz1cImYtMTJcIj4oe3tjRHQgfCBkYXRlOidtZWRpdW0nfX0pPC9zcGFuPlxyXG4gICAgICA8L2gzPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicHVsbC1yaWdodFwiICpuZ0lmPVwidHJuc19idXR0b25zLmxlbmd0aD4wXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgKGNsaWNrKT1cImFkZE5ld0NvbnRhY3QodHJuc19idXR0b25zWzBdKVwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjojM2M1OTk4O2JvcmRlci1jb2xvcjogIzNjNTk5ODtcIj5BZGQgTmV3IENvbnRhY3Q8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+IFxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZnJhbWVcIiBzdHlsZT1cImJhY2tncm91bmQ6ICNmZmY7aGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTAwcHgpO1wiPlxyXG4gICAgPGRpdiBjbGFzcz1cImlubmVyRFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0zXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiBzdHlsZT1cIm1hcmdpbjogMTBweCAwO1wiPlxyXG4gICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sIHctMTAwXCIgbmFtZT1cImNvbnRhY3RUeXBlXCIgWyhuZ01vZGVsKV09XCJjb250YWN0VHlwZVwiIHN0eWxlPVwiaGVpZ2h0OiAxMDAlO1wiPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uIHZhbHVlPVwiXCI+U2VsZWN0IENvbnRhY3RUeXBlPC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IHR5cGUgb2YgY29udGFjdFR5cGVMaXN0XCIgW25nVmFsdWVdPVwidHlwZS52YWxcIj57e3R5cGUucHJpbnR9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8IS0tIDxuZy1zZWxlY3QgW2l0ZW1zXT1cImJ1eWVyTGlzdFwiIFtzZWFyY2hhYmxlXT1cImZhbHNlXCIgbmFtZT1cImJ1eWVyU3VnZ1wiIFsobmdNb2RlbCldPVwiYnV5ZXJTdWdnXCJcclxuICAgICAgICAgICAgICAgICAgICBiaW5kTGFiZWw9XCJ2XCIgYmluZFZhbHVlPVwia1wiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEJ1eWVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWhlYWRlci10bXA+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgc3R5bGU9XCJ3aWR0aDogMTAwJTsgbGluZS1oZWlnaHQ6IDI0cHhcIiAjYnV5ZXIgdHlwZT1cInRleHRcIiAoa2V5dXApPVwibG9hZEJ1eWVyKGJ1eWVyLnZhbHVlKTtcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbYXV0b2ZvY3VzXT1cInRlc3R0XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD4gLS0+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3Qgc3R5bGU9XCJ6LWluZGV4OiA1O1wiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEJ1eWVyXCIgW29wdGlvbnNdPVwiYnV5ZXJMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImJ1eWVyXCIgbmFtZT1cImJ1eWVyXCIgKGZpbHRlcklucHV0Q2hhbmdlZCk9XCJsb2FkQnV5ZXIoJGV2ZW50KVwiIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXNlbGVjdCBwbGFjZWhvbGRlcj1cIlNlbGVjdCBlbXBsb3llZVwiIG5hbWU9XCJlbXBJZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwic2FsZUV4ZWN1dGl2ZUxpc3RcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZW1wSWRcIiBbYWxsb3dDbGVhcl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICA8L25nLXNlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgPCEtLSA8bmctc2VsZWN0IFtpdGVtc109XCJzYWxlRXhlY3V0aXZlTGlzdFwiIFsobmdNb2RlbCldPVwiZW1wSWRcIiBiaW5kTGFiZWw9XCJ2XCIgbmFtZT1cImVtcElkXCIgYmluZFZhbHVlPVwia1wiXHJcbiAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJTZWxlY3QgZW1wbG95ZWVcIiAjYnV5ZXJGaWw9XCJuZ01vZGVsXCIgcmVxdWlyZWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlIG5nLWhlYWRlci10bXA+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgICAgICAgPC9uZy1zZWxlY3Q+IC0tPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy0xMDBcIiBuYW1lPVwiVGVybXNcIiBbKG5nTW9kZWwpXT1cIlRlcm1zXCIgc3R5bGU9XCJoZWlnaHQ6IDEwMCU7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCJcIj5TZWxlY3QgVGVybXM8L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdGVybSBvZiB0ZXJtc0xpc3RcIiB2YWx1ZT1cInt7dGVybS50ZXJtc19pZG59fVwiPnt7dGVybS5wcmludH19PC9vcHRpb24+XHJcbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbCB3LTEwMFwiIG5hbWU9XCJjdXJyZW5jeVwiIFsobmdNb2RlbCldPVwiY3VycmVuY3lcIiBzdHlsZT1cImhlaWdodDogMTAwJTtcIj5cclxuICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIlwiPlNlbGVjdCBjdXJyZW5jeTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBjdXJyZW5jeSBvZiBjdXJyZW5jeUxpc3RcIiB2YWx1ZT1cInt7Y3VycmVuY3kuY3VycmVuY3lfaWRufX1cIj57e2N1cnJlbmN5LnByaW50fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgdy0xMDBcIiBwbGFjZWhvbGRlcj1cIlVzZXIgTmFtZVwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInVzZXJOYW1lXCIgWyhuZ01vZGVsKV09XCJ1c2VyTmFtZVwiIC8+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgPHRleHRhcmVhIHN0eWxlPVwid2hpdGUtc3BhY2U6IHByZTtcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHBsYWNlaG9sZGVyPVwiTmFtZUlkbiBMaXN0XCIgXHJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmFtZUlkbkxpc3RcIiAgaWQ9XCJuYW1lSWRuTGlzdFwiICBuYW1lPVwibmFtZUlkbkxpc3RcIiBjb2xzPVwiMzhcIiByb3dzPVwiM1wiICA+PC90ZXh0YXJlYT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiB3LTEwMFwiIHN0eWxlPVwicGFkZGluZy10b3A6IDEwcHg7XCI+XHJcbiAgICAgICAgICAgICAgICA8YnV0dG9uIGlkPVwic2F2ZWJ0blwiIChjbGljayk9XCJzZWFyY2hDb250YWN0KClcIiB0eXBlPVwiYnV0dG9uXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMzYzU5OTg7Ym9yZGVyLWNvbG9yOiAjM2M1OTk4XCJcclxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3MgcHVsbC1sZWZ0XCI+c3VibWl0PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8IS0tIChjbGljayk9XCJzZWFyY2hDb250YWN0KGNvbnRhY3RUeXBlLGJ1eWVyU3VnZyxlbXBJZCxUZXJtcyxjdXJyZW5jeSx1c2VyTmFtZSlcIiAtLT5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC05IGN1c3RDbHNcIj5cclxuICAgICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIiAqbmdJZj1cImRhdGFMaXN0Py5sZW5ndGggPiAwXCI+XHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIHB1bGwtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIiAoY2xpY2spPVwidG9ndHNsKCk7XCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMzYzU5OTg7Ym9yZGVyLWNvbG9yOiAjM2M1OTk4O21hcmdpbi10b3A6IDdweDttYXJnaW4tYm90dG9tOiA3cHhcIj50b29sczwvYnV0dG9uPiAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiBjbGFzcz1cInRsc2RycFwiICpuZ0lmPVwidHNsXCI+XHJcbiAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cInRsc3VsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgYWN0aW9uc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ7e2FjdGlvbj8uZm9ybV9maWVsZF9pY29ufX0gdHNsaWNvXCI+PC9zcGFuPnt7YWN0aW9uPy5mb3JtX2ZpZWxkX3RpdGxlfX08L2xpPlxyXG4gICAgICAgICAgICAgICAgICA8L3VsPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRyb3Bkb3duXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCIgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiMzYzU5OTg7Ym9yZGVyLWNvbG9yOiAjM2M1OTk4O21hcmdpbi10b3A6IDdweDttYXJnaW4tYm90dG9tOiA3cHhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIj50b29sc1xyXG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZXRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICA8dWwgY2xhc3M9XCJkcm9wZG93bi1tZW51IGRyb3Bkb3duLW1lbnUtcmlnaHRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHRhYiBvZiB0YWJzXCIgIChjbGljayk9XCJ0b29sYWN0aW9ucyh0YWIpO1wiIHN0eWxlPVwicGFkZGluZzogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwie3t0YWI/LmZvcm1fZmllbGRfaWNvbn19IHRzbGljb1wiPjwvc3Bhbj57e3RhYj8uZm9ybV9maWVsZF90aXRsZX19PC9saT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGxpIHN0eWxlPVwicGFkZGluZzogMTBweDtjdXJzb3I6IHBvaW50ZXI7XCIgKGNsaWNrKT1cImV4cG9ydEV4Y2VsKCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgIEV4Y2VsPC9saT5cclxuICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgIDxsaSBzdHlsZT1cInBhZGRpbmc6IDEwcHg7Y3Vyc29yOiBwb2ludGVyO1wiIChjbGljayk9XCJVcGRhdGVTYWxlRXhlY3V0aXZlUG9wKCk7XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlIFNhbGVzIEV4ZWN1dGl2ZVxyXG4gICAgICAgICAgICAgICAgICAgICAgPC9saT5cclxuICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgcHVsbC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogMTBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImV4YW1wbGVJbnB1dE5hbWUyXCIgc3R5bGU9XCJwYWRkaW5nLXRvcDogNXB4O1wiPlNlYXJjaCAmbmJzcDsmbmJzcDs8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTVcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBpZD1cImV4YW1wbGVJbnB1dE5hbWUyXCIgbmFtZT1cInNjaHR4dFwiIFsobmdNb2RlbCldPVwic2VhcmNoRlwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGFibGUtcmVzcG9uc2l2ZVwiIHN0eWxlPVwiaGVpZ2h0OiBjYWxjKDEwMHZoIC0gMTAwcHgpO1wiIGlkPVwid3JhcFwiPlxyXG4gICAgICAgICAgICAgICAgPHRhYmxlIGNsYXNzPVwiZGlzcGxheVRhYmxlXCIgKm5nSWY9XCJkYXRhTGlzdD8ubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8dGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyIGNsYXNzPVwicG9zcmVsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+U1IgTm88aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNsaWNrKT1cInNlbGVjdEFsbCgkZXZlbnQpO1wiPjwvdGg+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGg+QWN0aW9uPC90aD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0aCAqbmdGb3I9XCJsZXQgaGRyIG9mIGRhdGFIZWFkZXJcIj57e2RhdGFIZWFkZXJQcmludFtoZHJdfX08L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRoPkFkZC5FbWFpbHM8L3RoPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGhlYWQ+XHJcbiAgICAgICAgICAgICAgICAgIDx0Ym9keSA+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBkYXRhIG9mIGRhdGFMaXN0IHwgQ29udGFjdFRhYmxlU3JjUGlwZTpzZWFyY2hGOyBsZXQgaSA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8IS0tIHwgc2VhcmNoUGlwZTpzZWFyY2hGIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgICAgPHRkIChjbGljayk9XCJzZWxlY3RSb3coZGF0YS5ubWVfaWRuKVwiPnt7aSArIDF9fVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFtoaWRkZW5dPVwidHJ1ZVwiIGlkPVwiY2Jfe3tkYXRhLm5tZV9pZG59fVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNoZWNrZWRSb3coZGF0YSxkYXRhLm5tZV9pZG4pXCIgdmFsdWU9XCJ7e2RhdGEubm1lX2lkbn19XCIgLz5cclxuICAgICAgICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8dGQgKGNsaWNrKT1cInNlbGVjdFJvdyhkYXRhLm5tZV9pZG4pXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGRhdGEtdG9nZ2xlPVwiZHJvcGRvd25cIiBjbGFzcz1cImJ0biBidG4taW5mbyBkcm9wZG93bi10b2dnbGVcIj5BY3Rpb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2FyZXRcIj48L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz1cImRyb3Bkb3duLW1lbnVcIiByb2xlPVwibWVudVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBhY3Rpb24gb2YgcGFnZURlZmluYXRpb24uYWN0aW9uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIiAoY2xpY2spPVwidXNlckFjdGlvbihkYXRhLGFjdGlvbi5mb3JtX2ZpZWxkX3R5cCxhY3Rpb24pO1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7YWN0aW9uLmZvcm1fZmllbGRfdGl0bGV9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZCAqbmdGb3I9XCJsZXQgaGRyIG9mIGRhdGFIZWFkZXJcIiAoY2xpY2spPVwic2VsZWN0Um93KGRhdGEubm1lX2lkbilcIj57e2RhdGFbaGRyXX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICAgIDx0ZD57e2RhdGFbJ2VtYWlsSWRucyddfX08L3RkPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgICAgICAgIDwvdGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8L3RhYmxlPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZm9ybT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiYWN0aW9uRm9vdGVyIHB1bGwtcmlnaHRcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGRpdiBjbGFzcz1cIm1vZGFsXCIgaWQ9XCJtb2RlbFNhbGVFeFwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiZGlhbG9nXCIgYXJpYS1sYWJlbGxlZGJ5PVwibWFpbE1vZGFsSGVhZFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIGRhdGEta2V5Ym9hcmQ9XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1tZFwiID5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImNsb3NlXCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5cclxuICAgICAgICAgIDxzcGFuIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPiZ0aW1lczs8L3NwYW4+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8aDQgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwibWFpbE1vZGFsSGVhZFwiPlVwZGF0ZSBTYWxlIEV4ZWN1dGl2ZTwvaDQ+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0zIGNvbnRyb2wtbGFiZWxcIj5TYWxlIEV4ZWN1dGl2ZVxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTlcIj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtc20gIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxuZy1zZWxlY3Qgc3R5bGU9XCJ6LWluZGV4OiA1O1wiIHBsYWNlaG9sZGVyPVwiU2VsZWN0IEJ1eWVyXCIgW29wdGlvbnNdPVwiRW1wbG95ZWVMaXN0XCJcclxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzYWxlRXhjdXRlXCIgbmFtZT1cInNhbGVFeGN1dGVcIiAoZmlsdGVySW5wdXRDaGFuZ2VkKT1cImxvYWRTYWxlRXhjdXRpdmUoJGV2ZW50KVwiIFthbGxvd0NsZWFyXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxyXG4gICAgICAgICAgPCEtLSA8cD4gZGZmIHt7aHRtbENvbnRlbnR9fTwvcD4gLS0+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAoY2xpY2spPVwiVXBkYXRlU2FsZUV4ZWN1dGl2ZSgpXCIgICBjbGFzcz1cImJ0biBidG4tc3VjY2Vzc1wiPlVwZGF0ZTwvYnV0dG9uPlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI3NsZXhjbG9zZWJ0biBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibW9kZWxNYWlsXCIgdGFiaW5kZXg9XCItMVwiIHJvbGU9XCJkaWFsb2dcIiBhcmlhLWxhYmVsbGVkYnk9XCJtYWlsTW9kYWxIZWFkXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcclxuICBkYXRhLWJhY2tkcm9wPVwic3RhdGljXCIgZGF0YS1rZXlib2FyZD1cInRydWVcIj5cclxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZGlhbG9nIG1vZGFsLWxnXCIgc3R5bGU9XCJ3aWR0aDogNzA1cHhcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250ZW50XCI+XHJcbiAgICAgICAgPGZvcm0gY2xhc3M9XCJmb3JtLWhvcml6b250YWxcIiAgW2Zvcm1Hcm91cF09XCJteUZvcm1tbVwiICAgKG5nU3VibWl0KT1cIlNlbmRNYWlsKClcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiPlxyXG4gICAgICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+JnRpbWVzOzwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiPkNsb3NlPC9zcGFuPlxyXG4gICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCIgaWQ9XCJtYWlsTW9kYWxIZWFkXCI+U2VuZCBNYWlsPC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj5TZW5kZXIgTmFtZVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLXNtICB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBvc3JlbFwiIGZvcm1Db250cm9sTmFtZT1cInNlbmRlck5hbWVcIiAgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj5TdWJqZWN0XHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBwb3NyZWxcIiBmb3JtQ29udHJvbE5hbWU9XCJzdWJqZWN0XCIgIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsXCI+Q0NcclxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTEwXCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIHBvc3JlbFwiIGZvcm1Db250cm9sTmFtZT1cIkNDXCIgbmFtZT1cIkNDXCIgLz5cclxuICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29sLW1kLTIgY29udHJvbC1sYWJlbFwiPkJDQ1xyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgcG9zcmVsXCIgZm9ybUNvbnRyb2xOYW1lPVwiQkNDXCIgbmFtZT1cIkJDQ1wiIC8+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgIFxyXG4gICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhbmd1bGFyLWVkaXRvciBbcGxhY2Vob2xkZXJdPVwiJ0VudGVyIHRleHQgaGVyZS4uLidcIiBbY29uZmlnXT1cImNvbmZpZ1wiIGZvcm1Db250cm9sTmFtZT1cImh0bWxjb250ZW50XCI+PC9hbmd1bGFyLWVkaXRvcj5cclxuICAgICAgICAgICAgICAgICAgPCEtLSA8ZWpzLXJpY2h0ZXh0ZWRpdG9yIGlkPSdkZWZhdWx0UlRFJyBbKHZhbHVlKV09J3ZhbHVlJyA+PC9lanMtcmljaHRleHRlZGl0b3I+IC0tPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSA8Y2tlZGl0b3IgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiID48L2NrZWRpdG9yPiAtLT5cclxuICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICA8IS0tIDxwPiBkZmYge3todG1sQ29udGVudH19PC9wPiAtLT5cclxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiAgY2xhc3M9XCJidG4gYnRuLXN1Y2Nlc3NcIj5TZW5kPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI21haWxjbG9zZWJ0biBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+Q2xvc2U8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Zvcm0+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcbjxkaXYgY2xhc3M9XCJtb2RhbFwiIGlkPVwibW9kZWxOb3RpZmljYXRpb25cIiB0YWJpbmRleD1cIi0xXCIgcm9sZT1cImRpYWxvZ1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXHJcbiAgZGF0YS1iYWNrZHJvcD1cInN0YXRpY1wiIGRhdGEta2V5Ym9hcmQ9XCJ0cnVlXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiIHN0eWxlPVwid2lkdGg6IDcwNXB4XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgIDxmb3JtIGNsYXNzPVwiZm9ybS1ob3Jpem9udGFsXCIgIFtmb3JtR3JvdXBdPVwibXlOb3RpZmljYXRpb25cIiAgIChuZ1N1Ym1pdCk9XCJBZGROb3RpZmljYXRpb24oKVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjbG9zZVwiIGRhdGEtZGlzbWlzcz1cIm1vZGFsXCI+XHJcbiAgICAgICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj4mdGltZXM7PC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzci1vbmx5XCI+Q2xvc2U8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGVcIiBpZD1cIm1haWxNb2RhbEhlYWRcIj5BZGQgTm90aWZpY2F0aW9uPC9oND5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMlwiPlxyXG4gICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIj4qPC9zcGFuPiBEYXRlXHJcbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XHJcbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpbnB1dC1ncm91cCBpbnB1dC1ncm91cC1zbSAgdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsb2dkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICBvbmZvY3VzPVwiKHRoaXMudHlwZT0nZGF0ZScpXCJcclxuICAgICAgICAgICAgICAgICAgICBvbmJsdXI9XCIodGhpcy50eXBlPSd0ZXh0JylcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cImRkL21tL3l5eXlcIiBcclxuICAgICAgICAgICAgICAgICAgIC8+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAqbmdJZj1cIm5vdGlmaWNhdGlvbkNvbnRyb2wubG9nZGF0ZS5pbnZhbGlkICYmIChub3RpZmljYXRpb25Db250cm9sLmxvZ2RhdGUuZGlydHkgfHwgbm90aWZpY2F0aW9uQ29udHJvbC5sb2dkYXRlLnRvdWNoZWQpICYmIG5vdGlmaWNhdGlvbkNvbnRyb2wubG9nZGF0ZS5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsXCI+IDxzcGFuIHN0eWxlPVwiY29sb3I6cmVkXCI+Kjwvc3Bhbj5UaW1lKEhIOk1NKVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiIHN0eWxlPVwicGFkZGluZzoycHg7bWFyZ2luOjBweDtcIj5cclxuICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IGZvcm1Db250cm9sTmFtZT1cImhoXCIgc3R5bGU9XCJwYWRkaW5nOjVweCA1cHhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBtbXQgb2YgbW10aW1lTGlzdFwiIFtuZ1ZhbHVlXT1cIm1tdFwiPnt7bW10fX08L29wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCIgc3R5bGU9XCJwYWRkaW5nOjJweDttYXJnaW46MHB4O1wiPlxyXG4gICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgZm9ybUNvbnRyb2xOYW1lPVwibW1cIiBzdHlsZT1cInBhZGRpbmc6NXB4IDVweFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IGhodCBvZiBoaHRpbWVMaXN0XCIgW25nVmFsdWVdPVwiaGh0XCI+e3toaHR9fTwvb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXBcIj5cclxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbC1tZC0yIGNvbnRyb2wtbGFiZWxcIj4gPHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIj4qPC9zcGFuPk1vZHVsZVxyXG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMTBcIj5cclxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIHctMTAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBmb3JtQ29udHJvbE5hbWU9XCJtZGxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiID5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG5vdGlmaWNhdGUgb2Ygbm90aWZpY2F0aW9uTWRsTGlzdFwiIFtuZ1ZhbHVlXT1cIm5vdGlmaWNhdGUua1wiPnt7bm90aWZpY2F0ZVsndiddfX08L29wdGlvbj5cclxuICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJub3RpZmljYXRpb25Db250cm9sLm1kbC5pbnZhbGlkICYmIChub3RpZmljYXRpb25Db250cm9sLm1kbC5kaXJ0eSB8fCBub3RpZmljYXRpb25Db250cm9sLm1kbC50b3VjaGVkKSAmJiBub3RpZmljYXRpb25Db250cm9sLm1kbC5lcnJvcnMucmVxdWlyZWRcIj5cclxuICAgICAgICAgICAgICAgICAgICBNb2R1bGUgaXMgcmVxdWlyZWRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgIFxyXG5cclxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJjb2wtbWQtMiBjb250cm9sLWxhYmVsXCI+PHNwYW4gc3R5bGU9XCJjb2xvcjpyZWRcIj4qPC9zcGFuPk1hc3NhZ2U8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMFwiPlxyXG4gICAgICAgICAgICAgICAgICA8YW5ndWxhci1lZGl0b3IgW3BsYWNlaG9sZGVyXT1cIlwiIFtjb25maWddPVwibm90aWNvbmZpZ1wiIGZvcm1Db250cm9sTmFtZT1cIm1hc3NhZ2VcIj48L2FuZ3VsYXItZWRpdG9yPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCJcclxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJub3RpZmljYXRpb25Db250cm9sLm1hc3NhZ2UuaW52YWxpZCAmJiAobm90aWZpY2F0aW9uQ29udHJvbC5tYXNzYWdlLmRpcnR5IHx8IG5vdGlmaWNhdGlvbkNvbnRyb2wubWFzc2FnZS50b3VjaGVkKSAmJiBub3RpZmljYXRpb25Db250cm9sLm1hc3NhZ2UuZXJyb3JzLnJlcXVpcmVkXCI+XHJcbiAgICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBtYXNzYWdlIGlzIHJlcXVpcmVkXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XHJcbiAgICAgICAgPCEtLSA8cD4gZGZmIHt7aHRtbENvbnRlbnR9fTwvcD4gLS0+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCIgIGNsYXNzPVwiYnRuIGJ0bi1zdWNjZXNzXCI+QWRkPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgI25vdGlmaWNsb3NlYnRuIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0XCIgZGF0YS1kaXNtaXNzPVwibW9kYWxcIj5DbG9zZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZm9ybT5cclxuICAgIDwvZGl2PlxyXG5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbjxidXR0b24gaWQ9XCJidG5Ob3RpZmljYXRpb25cIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjbW9kZWxOb3RpZmljYXRpb25cIj48L2J1dHRvbj5cclxuXHJcblxyXG48YnV0dG9uIGlkPVwiYnRuc2FsZWV4XCIgW2hpZGRlbl09XCJ0cnVlXCIgZGF0YS10b2dnbGU9XCJtb2RhbFwiIGRhdGEtdGFyZ2V0PVwiI21vZGVsU2FsZUV4XCI+PC9idXR0b24+XHJcblxyXG48YnV0dG9uIGlkPVwiYnRuc2VuZE1haWxcIiBbaGlkZGVuXT1cInRydWVcIiBkYXRhLXRvZ2dsZT1cIm1vZGFsXCIgZGF0YS10YXJnZXQ9XCIjbW9kZWxNYWlsXCI+PC9idXR0b24+XHJcbiJdfQ==