gamma-app-controller 1.1.22 → 1.1.23

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.
@@ -1,357 +0,0 @@
1
- import { Component, ViewChild } from '@angular/core';
2
- import { confirm } from 'devextreme/ui/dialog';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../common";
5
- import * as i2 from "../../application-content.service";
6
- import * as i3 from "ngx-toastr";
7
- import * as i4 from "@angular/common";
8
- import * as i5 from "devextreme-angular/core";
9
- import * as i6 from "devextreme-angular/ui/nested";
10
- import * as i7 from "devextreme-angular/ui/data-grid";
11
- import * as i8 from "devextreme-angular/ui/select-box";
12
- import * as i9 from "devextreme-angular/ui/tag-box";
13
- import * as i10 from "devextreme-angular/ui/text-box";
14
- import * as i11 from "@angular/forms";
15
- import * as i12 from "@angular/material/icon";
16
- import * as i13 from "../../loading/loading.component";
17
- export class ExceptionOperationComponent {
18
- constructor(commonService, service, toastr) {
19
- this.commonService = commonService;
20
- this.service = service;
21
- this.toastr = toastr;
22
- this.contentType = "create";
23
- this.exceptionMainObject = {
24
- configId: "",
25
- configName: "",
26
- datasource: "",
27
- active: false,
28
- analyzerType: "",
29
- dbConfig: "",
30
- tableName: "",
31
- dataSelectionType: "",
32
- fileNameAttributeName: "",
33
- filterList: [{
34
- "columnName": "",
35
- "dataType": "",
36
- "operator": "",
37
- "windowFunctionName": "",
38
- "value": "",
39
- "dateFormat": "",
40
- }],
41
- patternList: [
42
- {
43
- "regex": "",
44
- "sample": "?_??_?",
45
- "fileAttributes": [],
46
- "analyzerKeys": [],
47
- "sequenceKey": "",
48
- "dynamicArgs": {}
49
- }
50
- ]
51
- };
52
- this.analyzer_type = [{ key: "numeric_sequence", name: "Numeric Sequence" }, { key: "date_sequence", name: "Date Sequence" }];
53
- this.isLoader = true;
54
- }
55
- ngOnInit() {
56
- this.getExceptionDataCongigs();
57
- this.service.getAppSqlFunctionList().subscribe(data => {
58
- this.functionNameContainer = data;
59
- });
60
- this.service.getCdrBrowserOperations().subscribe(data => {
61
- this.operator_list = data;
62
- });
63
- this.service.getAppDatasource().subscribe(data => {
64
- this.datasourcelist = (data['datasource']) ? data['datasource'] : data;
65
- });
66
- }
67
- getExceptionDataCongigs() {
68
- return new Promise((resolve) => {
69
- this.service.listFileSequenceAnalyzerGroups().subscribe((data) => {
70
- this.allExceptionConfigDataSource = data;
71
- this.isLoader = false;
72
- resolve();
73
- });
74
- });
75
- }
76
- editExceptionConfigConfig(data) {
77
- this.contentType = "edit";
78
- this.isExceptionConfigCreation = true;
79
- this.exceptionMainObject = data;
80
- }
81
- createExceptionConfig() {
82
- this.isExceptionConfigCreation = true;
83
- this.exceptionMainObject = {
84
- configId: "",
85
- configName: "",
86
- datasource: "",
87
- active: true,
88
- analyzerType: "",
89
- dbConfig: "",
90
- tableName: "",
91
- dataSelectionType: "",
92
- fileNameAttributeName: "",
93
- filterList: [{
94
- "columnName": "",
95
- "dataType": "",
96
- "operator": "",
97
- "windowFunctionName": "",
98
- "dateFormat": "",
99
- "value": ""
100
- }],
101
- patternList: [
102
- {
103
- "regex": "",
104
- "sample": "",
105
- "fileAttributes": [],
106
- "analyzerKeys": [],
107
- "sequenceKey": "",
108
- "dynamicArgs": {}
109
- }
110
- ]
111
- };
112
- }
113
- getCancleExceptionCreation() {
114
- this.isExceptionConfigCreation = false;
115
- this.exceptionMainObject = {
116
- configId: "",
117
- configName: "",
118
- datasource: "",
119
- active: true,
120
- analyzerType: "",
121
- dbConfig: "",
122
- tableName: "",
123
- dataSelectionType: "",
124
- fileNameAttributeName: "",
125
- filterList: [{
126
- "columnName": "",
127
- "dataType": "",
128
- "operator": "",
129
- "windowFunctionName": "",
130
- "value": "",
131
- "dateFormat": ""
132
- }],
133
- patternList: [
134
- {
135
- "regex": "",
136
- "sample": "",
137
- "fileAttributes": [],
138
- "analyzerKeys": [],
139
- "sequenceKey": "",
140
- "dynamicArgs": {}
141
- }
142
- ]
143
- };
144
- }
145
- getDataConfig(e) {
146
- }
147
- getProcessForConfig() {
148
- this.exceptionMainObject.filterList.push({
149
- "columnName": "",
150
- "dataType": "",
151
- "operator": "",
152
- "windowFunctionName": "",
153
- "dateFormat": "",
154
- "value": ""
155
- });
156
- }
157
- deleteColume(i) {
158
- this.exceptionMainObject.filterList.splice(i, 1);
159
- }
160
- deleteDynamicArguments(item, key, index) {
161
- delete this.exceptionMainObject.patternList[index]['dynamicArgs'][key];
162
- }
163
- addDynamicArgument(index) {
164
- let newKey = '';
165
- let newValue = '';
166
- this.exceptionMainObject.patternList[index]['dynamicArgs'][newKey] = newValue;
167
- }
168
- moveItemForColumns(index, direction) {
169
- if (index < 0 || index >= this.exceptionMainObject.filterList.length)
170
- return;
171
- const newPosition = direction === 'up' ? index - 1 : index + 1;
172
- if (newPosition < 0 || newPosition >= this.exceptionMainObject.filterList.length)
173
- return;
174
- const itemToMove = this.exceptionMainObject.filterList[index];
175
- this.exceptionMainObject.filterList.splice(index, 1);
176
- this.exceptionMainObject.filterList.splice(newPosition, 0, itemToMove);
177
- }
178
- getAddPatternsConfig() {
179
- this.exceptionMainObject.patternList.push({
180
- "regex": "",
181
- "sample": "",
182
- "sequenceKey": "",
183
- "fileAttributes": [],
184
- "analyzerKeys": [],
185
- "dynamicArgs": {}
186
- });
187
- }
188
- moveItemForpatterns(index, direction) {
189
- if (index < 0 || index >= this.exceptionMainObject.patternList.length)
190
- return;
191
- const newPosition = direction === 'up' ? index - 1 : index + 1;
192
- if (newPosition < 0 || newPosition >= this.exceptionMainObject.patternList.length)
193
- return;
194
- const itemToMove = this.exceptionMainObject.patternList[index];
195
- this.exceptionMainObject.patternList.splice(index, 1);
196
- this.exceptionMainObject.patternList.splice(newPosition, 0, itemToMove);
197
- }
198
- deletePatternsColume(i) {
199
- this.exceptionMainObject.patternList.splice(i, 1);
200
- }
201
- onCustomFileAttributesAdd(args) {
202
- const newValue = args.text;
203
- args.customItem = newValue;
204
- const isItemInDataSource = this.exceptionMainObject.patternList['fileAttributes'].some((item) => item === newValue);
205
- if (!isItemInDataSource) {
206
- this.exceptionMainObject.patternList['fileAttributes'].unshift(newValue);
207
- }
208
- }
209
- onCustomAnalizerKeyAdd(args) {
210
- const newValue = args.text;
211
- args.customItem = newValue;
212
- const isItemInDataSource = this.exceptionMainObject.patternList['analyzerKeys'].some((item) => item === newValue);
213
- if (!isItemInDataSource) {
214
- this.exceptionMainObject.patternList['analyzerKeys'].unshift(newValue);
215
- }
216
- }
217
- updateExceptionConfig() {
218
- this.loadingModal = true;
219
- this.service.editFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
220
- next: (data) => {
221
- this.isExceptionConfigCreation = false;
222
- this.loadingModal = false;
223
- this.isLoader = true;
224
- this.getExceptionDataCongigs();
225
- }, error: (err) => {
226
- this.loadingModal = false;
227
- this.isLoader = false;
228
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
229
- }
230
- });
231
- console.log(this.exceptionMainObject);
232
- }
233
- saveExceptionConfig() {
234
- for (const element of this.exceptionMainObject.patternList) {
235
- if (!element.fileAttributes.includes(element.sequenceKey)) {
236
- this.toastr.error('Sequence Key not valid');
237
- return;
238
- }
239
- const allMatch = element.analyzerKeys.every(item => element.fileAttributes.includes(item));
240
- const allKeysMatch = Object.keys(element.dynamicArgs).every(key => element.fileAttributes.includes(key));
241
- if (!allMatch) {
242
- this.toastr.error('Analyzer Keys not valid');
243
- return;
244
- }
245
- if (!allKeysMatch) {
246
- this.toastr.error('Filler not valid');
247
- return;
248
- }
249
- const updatedObj = Object.fromEntries(Object.entries(element.dynamicArgs).map(([key, value]) => [`default_${key}_filter`, value]));
250
- element.dynamicArgs = updatedObj;
251
- }
252
- this.loadingModal = true;
253
- this.service.saveFileSequenceAnalyzerGroup(this.exceptionMainObject).subscribe({
254
- next: (data) => {
255
- this.isExceptionConfigCreation = false;
256
- this.loadingModal = false;
257
- this.isLoader = true;
258
- this.getExceptionDataCongigs();
259
- }, error: (err) => {
260
- this.loadingModal = false;
261
- this.isLoader = false;
262
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Create Exception Config');
263
- }
264
- });
265
- }
266
- deleteExceptionConfig(data) {
267
- let result = confirm("<i>Are You Sure?</i>", "Delete Config");
268
- result.then((dialogResult) => {
269
- if (dialogResult) {
270
- this.loadingModal = true;
271
- this.service.deleteFileSequenceAnalyzerGroup(data.configId).subscribe({
272
- next: (data) => {
273
- const currentPageIndex = this.dataGrid?.instance.pageIndex();
274
- this.getExceptionDataCongigs().then(() => {
275
- if (currentPageIndex !== undefined) {
276
- this.dataGrid.instance.pageIndex(currentPageIndex);
277
- }
278
- this.isLoader = false;
279
- this.toastr.success(data.response);
280
- });
281
- }, error: (err) => {
282
- this.loadingModal = false;
283
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'CDR Config Delete');
284
- }
285
- });
286
- }
287
- });
288
- }
289
- activatedException(data) {
290
- let result = confirm("<i>Are You Sure?</i>", "Activate Config");
291
- result.then((dialogResult) => {
292
- if (dialogResult) {
293
- this.service.activateFileSequenceAnalyzerGroup(data.configId).subscribe({
294
- next: (data) => {
295
- const currentPageIndex = this.dataGrid?.instance.pageIndex();
296
- this.getExceptionDataCongigs().then(() => {
297
- if (currentPageIndex !== undefined) {
298
- this.dataGrid.instance.pageIndex(currentPageIndex);
299
- }
300
- this.isLoader = false;
301
- this.toastr.success(data.response);
302
- });
303
- }, error: (err) => {
304
- console.log(err);
305
- this.loadingModal = false;
306
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
307
- }
308
- });
309
- }
310
- });
311
- }
312
- deActivatedException(data) {
313
- let result = confirm("<i>Are You Sure?</i>", "Deactivate Config");
314
- result.then((dialogResult) => {
315
- if (dialogResult) {
316
- this.service.deactivateFileSequenceAnalyzerGroup(data.configId).subscribe({
317
- next: (data) => {
318
- const currentPageIndex = this.dataGrid?.instance.pageIndex();
319
- this.getExceptionDataCongigs().then(() => {
320
- if (currentPageIndex !== undefined) {
321
- this.dataGrid.instance.pageIndex(currentPageIndex);
322
- }
323
- this.isLoader = false;
324
- this.toastr.success(data.response);
325
- });
326
- }, error: (err) => {
327
- console.log(err);
328
- this.loadingModal = false;
329
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
330
- }
331
- });
332
- }
333
- });
334
- }
335
- updateFileSequenceAnalyzerJobs() {
336
- this.loadingModal = true;
337
- this.service.updateFileSequenceAnalyzerJobs().subscribe({
338
- next: (data) => {
339
- this.loadingModal = false;
340
- this.toastr.success("File Sequence Analyzer Jobs Updated");
341
- }, error: err => {
342
- this.loadingModal = false;
343
- this.toastr.error('Unexpected Server Exception. Please contact System Admin.', 'Exception Config');
344
- }
345
- });
346
- }
347
- }
348
- ExceptionOperationComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, deps: [{ token: i1.CommonService }, { token: i2.ApplicationContentService }, { token: i3.ToastrService }], target: i0.ɵɵFactoryTarget.Component });
349
- ExceptionOperationComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ExceptionOperationComponent, selector: "app-exception-operation", viewQueries: [{ propertyName: "dataGrid", first: true, predicate: ["gridContainer"], descendants: true }], ngImport: i0, template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>", styles: [""], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.DxTemplateDirective, selector: "[dxTemplate]", inputs: ["dxTemplateOf"] }, { kind: "component", type: i6.DxoExportComponent, selector: "dxo-export", inputs: ["backgroundColor", "enabled", "fileName", "formats", "margin", "printingEnabled", "proxyUrl", "svgToCanvas", "allowExportSelectedData", "customizeExcelCell", "excelFilterEnabled", "excelWrapTextEnabled", "ignoreExcelErrors", "texts"] }, { kind: "component", type: i7.DxDataGridComponent, selector: "dx-data-grid", inputs: ["accessKey", "activeStateEnabled", "allowColumnReordering", "allowColumnResizing", "autoNavigateToFocusedRow", "cacheEnabled", "cellHintEnabled", "columnAutoWidth", "columnChooser", "columnFixing", "columnHidingEnabled", "columnMinWidth", "columnResizingMode", "columns", "columnWidth", "customizeColumns", "customizeExportData", "dataRowTemplate", "dataSource", "dateSerializationFormat", "disabled", "editing", "elementAttr", "errorRowEnabled", "export", "filterBuilder", "filterBuilderPopup", "filterPanel", "filterRow", "filterSyncEnabled", "filterValue", "focusedColumnIndex", "focusedRowEnabled", "focusedRowIndex", "focusedRowKey", "focusStateEnabled", "grouping", "groupPanel", "headerFilter", "height", "highlightChanges", "hint", "hoverStateEnabled", "keyboardNavigation", "keyExpr", "loadPanel", "masterDetail", "noDataText", "pager", "paging", "remoteOperations", "renderAsync", "repaintChangesOnly", "rowAlternationEnabled", "rowDragging", "rowTemplate", "rtlEnabled", "scrolling", "searchPanel", "selectedRowKeys", "selection", "selectionFilter", "showBorders", "showColumnHeaders", "showColumnLines", "showRowLines", "sortByGroupSummaryInfo", "sorting", "stateStoring", "summary", "syncLookupFilterValues", "tabIndex", "toolbar", "twoWayBindingEnabled", "visible", "width", "wordWrapEnabled"], outputs: ["onAdaptiveDetailRowPreparing", "onCellClick", "onCellDblClick", "onCellHoverChanged", "onCellPrepared", "onContentReady", "onContextMenuPreparing", "onDataErrorOccurred", "onDisposing", "onEditCanceled", "onEditCanceling", "onEditingStart", "onEditorPrepared", "onEditorPreparing", "onExported", "onExporting", "onFileSaving", "onFocusedCellChanged", "onFocusedCellChanging", "onFocusedRowChanged", "onFocusedRowChanging", "onInitialized", "onInitNewRow", "onKeyDown", "onOptionChanged", "onRowClick", "onRowCollapsed", "onRowCollapsing", "onRowDblClick", "onRowExpanded", "onRowExpanding", "onRowInserted", "onRowInserting", "onRowPrepared", "onRowRemoved", "onRowRemoving", "onRowUpdated", "onRowUpdating", "onRowValidating", "onSaved", "onSaving", "onSelectionChanged", "onToolbarPreparing", "accessKeyChange", "activeStateEnabledChange", "allowColumnReorderingChange", "allowColumnResizingChange", "autoNavigateToFocusedRowChange", "cacheEnabledChange", "cellHintEnabledChange", "columnAutoWidthChange", "columnChooserChange", "columnFixingChange", "columnHidingEnabledChange", "columnMinWidthChange", "columnResizingModeChange", "columnsChange", "columnWidthChange", "customizeColumnsChange", "customizeExportDataChange", "dataRowTemplateChange", "dataSourceChange", "dateSerializationFormatChange", "disabledChange", "editingChange", "elementAttrChange", "errorRowEnabledChange", "exportChange", "filterBuilderChange", "filterBuilderPopupChange", "filterPanelChange", "filterRowChange", "filterSyncEnabledChange", "filterValueChange", "focusedColumnIndexChange", "focusedRowEnabledChange", "focusedRowIndexChange", "focusedRowKeyChange", "focusStateEnabledChange", "groupingChange", "groupPanelChange", "headerFilterChange", "heightChange", "highlightChangesChange", "hintChange", "hoverStateEnabledChange", "keyboardNavigationChange", "keyExprChange", "loadPanelChange", "masterDetailChange", "noDataTextChange", "pagerChange", "pagingChange", "remoteOperationsChange", "renderAsyncChange", "repaintChangesOnlyChange", "rowAlternationEnabledChange", "rowDraggingChange", "rowTemplateChange", "rtlEnabledChange", "scrollingChange", "searchPanelChange", "selectedRowKeysChange", "selectionChange", "selectionFilterChange", "showBordersChange", "showColumnHeadersChange", "showColumnLinesChange", "showRowLinesChange", "sortByGroupSummaryInfoChange", "sortingChange", "stateStoringChange", "summaryChange", "syncLookupFilterValuesChange", "tabIndexChange", "toolbarChange", "twoWayBindingEnabledChange", "visibleChange", "widthChange", "wordWrapEnabledChange"] }, { kind: "component", type: i6.DxiColumnComponent, selector: "dxi-column", inputs: ["alignment", "allowEditing", "allowExporting", "allowFiltering", "allowFixing", "allowGrouping", "allowHeaderFiltering", "allowHiding", "allowReordering", "allowResizing", "allowSearch", "allowSorting", "autoExpandGroup", "buttons", "calculateCellValue", "calculateDisplayValue", "calculateFilterExpression", "calculateGroupValue", "calculateSortValue", "caption", "cellTemplate", "columns", "cssClass", "customizeText", "dataField", "dataType", "editCellTemplate", "editorOptions", "encodeHtml", "falseText", "filterOperations", "filterType", "filterValue", "filterValues", "fixed", "fixedPosition", "format", "formItem", "groupCellTemplate", "groupIndex", "headerCellTemplate", "headerFilter", "hidingPriority", "isBand", "lookup", "minWidth", "name", "ownerBand", "renderAsync", "selectedFilterOperation", "setCellValue", "showEditorAlways", "showInColumnChooser", "showWhenGrouped", "sortIndex", "sortingMethod", "sortOrder", "trueText", "type", "validationRules", "visible", "visibleIndex", "width"], outputs: ["filterValueChange", "filterValuesChange", "groupIndexChange", "selectedFilterOperationChange", "sortIndexChange", "sortOrderChange", "visibleChange", "visibleIndexChange"] }, { kind: "component", type: i6.DxoPagerComponent, selector: "dxo-pager", inputs: ["allowedPageSizes", "displayMode", "infoText", "showInfo", "showNavigationButtons", "showPageSizeSelector", "visible"] }, { kind: "component", type: i6.DxoPagingComponent, selector: "dxo-paging", inputs: ["enabled", "pageIndex", "pageSize"], outputs: ["pageIndexChange", "pageSizeChange"] }, { kind: "component", type: i6.DxoSearchPanelComponent, selector: "dxo-search-panel", inputs: ["highlightCaseSensitive", "highlightSearchText", "placeholder", "searchVisibleColumnsOnly", "text", "visible", "width"], outputs: ["textChange"] }, { kind: "component", type: i8.DxSelectBoxComponent, selector: "dx-select-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "displayValue", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxLength", "minSearchLength", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectedItem", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showSelectionControls", "spellcheck", "stylingMode", "tabIndex", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCopy", "onCustomItemCreating", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onOpened", "onOptionChanged", "onPaste", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "displayValueChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxLengthChange", "minSearchLengthChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectedItemChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showSelectionControlsChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i9.DxTagBoxComponent, selector: "dx-tag-box", inputs: ["acceptCustomValue", "accessKey", "activeStateEnabled", "applyValueMode", "buttons", "dataSource", "deferRendering", "disabled", "displayExpr", "dropDownButtonTemplate", "dropDownOptions", "elementAttr", "fieldTemplate", "focusStateEnabled", "grouped", "groupTemplate", "height", "hideSelectedItems", "hint", "hoverStateEnabled", "inputAttr", "isValid", "items", "itemTemplate", "label", "labelMode", "maxDisplayedTags", "maxFilterQueryLength", "maxLength", "minSearchLength", "multiline", "name", "noDataText", "opened", "openOnFieldClick", "placeholder", "readOnly", "rtlEnabled", "searchEnabled", "searchExpr", "searchMode", "searchTimeout", "selectAllMode", "selectAllText", "selectedItems", "showClearButton", "showDataBeforeSearch", "showDropDownButton", "showMultiTagOnly", "showSelectionControls", "stylingMode", "tabIndex", "tagTemplate", "text", "useItemTextAsTitle", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueExpr", "visible", "width", "wrapItemText"], outputs: ["onChange", "onClosed", "onContentReady", "onCustomItemCreating", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onItemClick", "onKeyDown", "onKeyUp", "onMultiTagPreparing", "onOpened", "onOptionChanged", "onSelectAllValueChanged", "onSelectionChanged", "onValueChanged", "acceptCustomValueChange", "accessKeyChange", "activeStateEnabledChange", "applyValueModeChange", "buttonsChange", "dataSourceChange", "deferRenderingChange", "disabledChange", "displayExprChange", "dropDownButtonTemplateChange", "dropDownOptionsChange", "elementAttrChange", "fieldTemplateChange", "focusStateEnabledChange", "groupedChange", "groupTemplateChange", "heightChange", "hideSelectedItemsChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "itemsChange", "itemTemplateChange", "labelChange", "labelModeChange", "maxDisplayedTagsChange", "maxFilterQueryLengthChange", "maxLengthChange", "minSearchLengthChange", "multilineChange", "nameChange", "noDataTextChange", "openedChange", "openOnFieldClickChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "searchEnabledChange", "searchExprChange", "searchModeChange", "searchTimeoutChange", "selectAllModeChange", "selectAllTextChange", "selectedItemsChange", "showClearButtonChange", "showDataBeforeSearchChange", "showDropDownButtonChange", "showMultiTagOnlyChange", "showSelectionControlsChange", "stylingModeChange", "tabIndexChange", "tagTemplateChange", "textChange", "useItemTextAsTitleChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueExprChange", "visibleChange", "widthChange", "wrapItemTextChange", "onBlur"] }, { kind: "component", type: i10.DxTextBoxComponent, selector: "dx-text-box", inputs: ["accessKey", "activeStateEnabled", "buttons", "disabled", "elementAttr", "focusStateEnabled", "height", "hint", "hoverStateEnabled", "inputAttr", "isValid", "label", "labelMode", "mask", "maskChar", "maskInvalidMessage", "maskRules", "maxLength", "mode", "name", "placeholder", "readOnly", "rtlEnabled", "showClearButton", "showMaskMode", "spellcheck", "stylingMode", "tabIndex", "text", "useMaskedValue", "validationError", "validationErrors", "validationMessageMode", "validationStatus", "value", "valueChangeEvent", "visible", "width"], outputs: ["onChange", "onContentReady", "onCopy", "onCut", "onDisposing", "onEnterKey", "onFocusIn", "onFocusOut", "onInitialized", "onInput", "onKeyDown", "onKeyUp", "onOptionChanged", "onPaste", "onValueChanged", "accessKeyChange", "activeStateEnabledChange", "buttonsChange", "disabledChange", "elementAttrChange", "focusStateEnabledChange", "heightChange", "hintChange", "hoverStateEnabledChange", "inputAttrChange", "isValidChange", "labelChange", "labelModeChange", "maskChange", "maskCharChange", "maskInvalidMessageChange", "maskRulesChange", "maxLengthChange", "modeChange", "nameChange", "placeholderChange", "readOnlyChange", "rtlEnabledChange", "showClearButtonChange", "showMaskModeChange", "spellcheckChange", "stylingModeChange", "tabIndexChange", "textChange", "useMaskedValueChange", "validationErrorChange", "validationErrorsChange", "validationMessageModeChange", "validationStatusChange", "valueChange", "valueChangeEventChange", "visibleChange", "widthChange", "onBlur"] }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i12.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i13.LoadingComponent, selector: "app-loading" }, { kind: "pipe", type: i4.KeyValuePipe, name: "keyvalue" }] });
350
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExceptionOperationComponent, decorators: [{
351
- type: Component,
352
- args: [{ selector: 'app-exception-operation', template: "<app-loading *ngIf=\"loadingModal\"></app-loading>\n<div class=\"flex flex-col flex-auto w-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex justify-between border-b dark:bg-transparent\">\n <div class=\"flex flex-col ml-1\">\n <div class=\"flex items-center float-start\">\n <div class=\"flex items-center overflow-hidden\">\n <mat-icon class=\"icon-size-2\" [svgIcon]=\"'heroicons_solid:template'\"></mat-icon>\n </div>\n <h2\n class=\"text-2xl md:text-2xl py-3 font-extrabold items-center ml-2 tracking-tight leading-5 truncate capitalize\">\n Exception Configuration\n </h2>\n </div>\n <div class=\"\">\n </div>\n </div>\n <div class=\"flex justify-between items-center border-l-2 p-0 m-0\">\n\n\n <div class=\"w-1 h-full border-l-2\"></div>\n <div class=\"mx-2\">\n\n <div class=\"flex items-center p-1\">\n\n <div class=\"mx-2\">\n <button class=\"{{commonService.btn_primary_md}} cursor-pointer\"\n (click)=\"createExceptionConfig()\">Create Config\n </button>\n </div>\n </div>\n </div>\n </div>\n </div>\n\n </div>\n\n <div class=\"m-2\">\n <div class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6 class=\"mb-2 font-bold text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3\"><i\n class=\"fa fa-table mr-2\"></i> File Sequence Analyzer configs | \n <button class=\"{{commonService.btn_success_md}}\" (click)=\"updateFileSequenceAnalyzerJobs()\">Update</button>\n </h6>\n <!-- <app-loader *ngIf=\"isLoader\"></app-loader> -->\n <dx-data-grid [columnAutoWidth]=\"true\" [dataSource]=\"allExceptionConfigDataSource\" [selectedRowKeys]=\"[]\"\n [showBorders]=\"true\" [showRowLines]=\"true\" id=\"gridContainer\" [hoverStateEnabled]=\"true\"\n *ngIf=\"!isLoader\">\n\n <dxo-search-panel [highlightCaseSensitive]=\"true\" [visible]=\"true\">\n </dxo-search-panel>\n <dxo-export [enabled]=\"true\" fileName=\"alert_data_by_status\"></dxo-export>\n <dxo-paging [pageSize]=\"10\"></dxo-paging>\n <dxo-pager [showInfo]=\"true\" [showPageSizeSelector]=\"true\" [allowedPageSizes]=\"[10,20,50,100]\">\n </dxo-pager>\n <dxi-column dataField=\"configName\"></dxi-column>\n <dxi-column dataField=\"datasource\"></dxi-column>\n <dxi-column dataField=\"dbConfig\"></dxi-column>\n <dxi-column dataField=\"analyzerType\"></dxi-column>\n <dxi-column dataField=\"fileNameAttributeName\"></dxi-column>\n <dxi-column dataField=\"dataSelectionType\"></dxi-column>\n <dxi-column caption=\"Status\" dataField=\"active\" cellTemplate=\"cellTemplate1\"></dxi-column>\n\n <dxi-column dataField=\"action\" cellTemplate=\"cellTemplate\" [fixed]=\"true\"\n fixedPosition=\"right\"></dxi-column>\n <div *dxTemplate=\"let data of 'cellTemplate'\">\n <button class=\"{{commonService.btnPrimaryBlue}}\" (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button>\n <!-- <button class=\"{{commonService.btnPrimaryBlue}}\" *ngIf=\"data.data.active == false\"\n (click)=\"editExceptionConfigConfig(data.data)\">\n Edit\n </button> -->\n\n <button class=\"{{commonService.btn_danger_md}}\" (click)=\"deleteExceptionConfig(data.data)\">\n Delete\n </button>\n </div>\n <div *dxTemplate=\"let data of 'cellTemplate1'\">\n <button type=\"button\" *ngIf=\"data.data.active == true\" class=\"{{commonService.btnSuccessGreen}}\"\n (click)=\"deActivatedException(data.data)\">Active</button>\n\n <button type=\"button\" *ngIf=\"data.data.active == false\" class=\"{{commonService.btnWarningYellow}}\"\n (click)=\"activatedException(data.data)\">Inactive</button>\n\n\n </div>\n\n </dx-data-grid>\n\n </div>\n </div>\n <ng-container *ngIf=\"isExceptionConfigCreation\">\n <div class=\"m-2\">\n <div\n class=\"m-3 p-4 bg-white border border-gray-200 rounded-lg shadow-md dark:bg-gray-800 dark:border-gray-700\">\n <h6\n class=\"mb-2 text-lg tracking-tight text-gray-900 dark:text-white border-b pb-3 flex items-center capitalize\">\n {{contentType}} Exception Configurations\n\n <div class=\"ml-auto\">\n <button class=\"{{commonService.btnOthersPurple}}\" (click)=\"getCancleExceptionCreation()\">\n Back\n </button>\n </div>\n </h6>\n\n <!-- (onValueChanged)=\"valueChangeForDatabaseName($event)\" -->\n <div class=\"flex\">\n <div class=\"w-full border-r\">\n <div class=\"m-2\">\n <div class=\"flex flex-row mb-2\">\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Config Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.configName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Datasource</div>\n <dx-select-box [items]=\"datasourcelist\" [(ngModel)]=\"exceptionMainObject.datasource\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"mx-2 w-1/3\">\n <div class=\"text-md mb-2\">Analyzer Type</div>\n <dx-select-box [items]=\"analyzer_type\" valueExpr=\"key\" displayExpr=\"name\"\n [(ngModel)]=\"exceptionMainObject.analyzerType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col\">\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"pt-2\">\n <div class=\"flex flex-row p-2\">\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Db Config</div>\n <dx-select-box [items]=\"['mongo','impala','postgres','mysql','bigquery']\"\n (onValueChanged)=\"getDataConfig($event)\"\n [(ngModel)]=\"exceptionMainObject.dbConfig\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Table Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.tableName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> Data Selection Type</div>\n <dx-select-box [items]=\"['select','distinct']\"\n [(ngModel)]=\"exceptionMainObject.dataSelectionType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n <div class=\"px-2 mb-2 w-1/2\">\n <div class=\"text-md mb-2\"> File Column Name</div>\n <dx-text-box [(ngModel)]=\"exceptionMainObject.fileNameAttributeName\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Filter List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getProcessForConfig()\">\n Add Filter\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <div class=\"flex flex-row my-2\"\n *ngFor=\"let items of exceptionMainObject.filterList;let i = index;\">\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Column Name</p>\n <dx-text-box [(ngModel)]=\"items.columnName\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Operator</p>\n <dx-select-box [items]=\"operator_list\" valueExpr=\"value\"\n displayExpr=\"name\" [(ngModel)]=\"items.operator\"\n [searchEnabled]=\"true\">\n </dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Datatype</p>\n <dx-select-box\n [items]=\"['date','string','timestamp','int', 'double', 'boolean']\"\n [(ngModel)]=\"items.dataType\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Select Function</p>\n <dx-select-box [items]=\"functionNameContainer\"\n [(ngModel)]=\"items.windowFunctionName\" [searchEnabled]=\"true\"\n [readOnly]=\"contentType == 'view'\"></dx-select-box>\n </div>\n </div>\n <div class=\"w-full px-2\"\n *ngIf=\"items.dataType == 'date' || items.dataType == 'timestamp'\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Date Format</p>\n <dx-text-box [(ngModel)]=\"items.dateFormat\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Default Value</p>\n <dx-text-box [(ngModel)]=\"items.value\"\n [readOnly]=\"contentType == 'view'\"></dx-text-box>\n </div>\n </div>\n <div class=\"w-full px-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForColumns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"w-full border-b my-4\">\n <div class=\"m-2\">\n <div class=\"flex flex-col flex-auto min-w-0 my-2\">\n <div class=\"py-2 border-b border-b\">\n <div class=\"flex flex-row px-2\">\n <div class=\"w-1/2 px-2\">\n <div class=\"text-2xl font-extrabold\">Pattern List</div>\n </div>\n <div class=\"w-1/2 px-2\">\n <div class=\"flex justify-end\">\n <button class=\"{{commonService.btn_primary_md}}\"\n (click)=\"getAddPatternsConfig()\">\n Add Pattern\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"pt-2\">\n <ng-container *ngFor=\"let items of exceptionMainObject.patternList;let i = index;\">\n <div class=\"flex flex-wrap my-2\">\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Regex</p>\n <dx-text-box [(ngModel)]=\"items.regex\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/2 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">File Attributes</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomFileAttributesAdd($event)\"\n [(ngModel)]=\"items.fileAttributes\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">SequenceKey</p>\n <dx-text-box [(ngModel)]=\"items.sequenceKey\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n\n <div class=\"w-1/3 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Analyzer Keys</p>\n <dx-tag-box [multiline]=\"true\" [showSelectionControls]=\"true\"\n [acceptCustomValue]=\"true\"\n (onCustomItemCreating)=\"onCustomAnalizerKeyAdd($event)\"\n [(ngModel)]=\"items.analyzerKeys\" [searchEnabled]=\"true\">\n </dx-tag-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"dx-field\">\n <p class=\"mb-1\">Sample</p>\n <dx-text-box [(ngModel)]=\"items.sample\"\n [readOnly]=\"contentType == 'view'\">\n </dx-text-box>\n </div>\n </div>\n <div class=\"w-1/6 px-2 my-2\">\n <div class=\"mx-2\">\n <div class=\"flex flex-row\">\n <button *ngIf=\"i !== 0\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'up')\">\n <i class=\"fa fa-arrow-up\" aria-hidden=\"true\"></i>\n </button>\n\n <button *ngIf=\"i !== exceptionMainObject.filterList.length - 1\"\n class=\"{{commonService.btn_light_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"moveItemForpatterns(i, 'down')\">\n <i class=\"fa fa-arrow-down\" aria-hidden=\"true\"></i>\n </button>\n\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deletePatternsColume(i)\"><i class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i>\n </button>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-xl mb-2\">Dynamic Arguments |\n <button class=\"{{commonService.btn_primary_sm}}\"\n (click)=\"addDynamicArgument(i)\">Add Arguments</button>\n </div>\n <div class=\"m-5\">\n\n <div class=\"flex flex-wrap\">\n <ng-container *ngFor=\"let item of items.dynamicArgs | keyvalue\">\n <div class=\"w-1/2 p-2\">\n <div class=\"flex flex-row\">\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Key</div>\n <dx-text-box [(ngModel)]=\"item.key\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <div class=\"text-md\"> Argument Value</div>\n <dx-text-box\n [(ngModel)]=\"items.dynamicArgs[item.key]\"></dx-text-box>\n </div>\n <div class=\"m-1\">\n <button\n class=\"{{commonService.btn_danger_sm}} cursor-pointer mx-1 mt-6\"\n (click)=\"deleteDynamicArguments(item,item.key,i)\"><i\n class=\"fa fa-trash-o\"\n aria-hidden=\"true\"></i></button>\n </div>\n </div>\n </div>\n </ng-container>\n\n </div>\n </div>\n\n\n\n </ng-container>\n\n </div>\n </div>\n </div>\n </div>\n </div>\n <div class=\"flex w-full justify-end mt-5 border-t\" *ngIf=\"contentType !== 'view'\">\n\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"saveExceptionConfig()\" *ngIf=\"contentType == 'create'\">\n Create Exception Config\n </button>\n <button class=\"{{commonService.btn_success_md}} cursor-pointer mx-1 my-2\"\n (click)=\"updateExceptionConfig()\" *ngIf=\"contentType == 'edit'\">\n Update Exception Config\n </button>\n </div>\n </div>\n </div>\n </ng-container>\n</div>" }]
353
- }], ctorParameters: function () { return [{ type: i1.CommonService }, { type: i2.ApplicationContentService }, { type: i3.ToastrService }]; }, propDecorators: { dataGrid: [{
354
- type: ViewChild,
355
- args: ['gridContainer', { static: false }]
356
- }] } });
357
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYW1tYS1hcHAtY29udHJvbGxlci9zcmMvbGliL2FwcGxpY2F0aW9uLWNvbnRyb2xsZXIvcGFnZS1tb2R1bGUvZXhjZXB0aW9uLW9wZXJhdGlvbi9leGNlcHRpb24tb3BlcmF0aW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2dhbW1hLWFwcC1jb250cm9sbGVyL3NyYy9saWIvYXBwbGljYXRpb24tY29udHJvbGxlci9wYWdlLW1vZHVsZS9leGNlcHRpb24tb3BlcmF0aW9uL2V4Y2VwdGlvbi1vcGVyYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7QUFXL0MsTUFBTSxPQUFPLDJCQUEyQjtJQStDdEMsWUFDUyxhQUE0QixFQUMzQixPQUFrQyxFQUNsQyxNQUFxQjtRQUZ0QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUMzQixZQUFPLEdBQVAsT0FBTyxDQUEyQjtRQUNsQyxXQUFNLEdBQU4sTUFBTSxDQUFlO1FBOUMvQixnQkFBVyxHQUFHLFFBQVEsQ0FBQztRQUV2Qix3QkFBbUIsR0FBRztZQUNwQixRQUFRLEVBQUUsRUFBRTtZQUNaLFVBQVUsRUFBRSxFQUFFO1lBQ2QsVUFBVSxFQUFFLEVBQUU7WUFDZCxNQUFNLEVBQUUsS0FBSztZQUNiLFlBQVksRUFBRSxFQUFFO1lBQ2hCLFFBQVEsRUFBRSxFQUFFO1lBQ1osU0FBUyxFQUFFLEVBQUU7WUFDYixpQkFBaUIsRUFBRSxFQUFFO1lBQ3JCLHFCQUFxQixFQUFFLEVBQUU7WUFDekIsVUFB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QU0sQ0FBQyxLQUFLLENBQUMsMkRBQTJELEVBQUUsa0JBQWtCLENBQUMsQ0FBQztvQkFDckcsQ0FBQztpQkFDRixDQUFDLENBQUM7YUFDSjtRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELDhCQUE4QjtRQUM1QixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLDhCQUE4QixFQUFFLENBQUMsU0FBUyxDQUFDO1lBQ3RELElBQUksRUFBRSxDQUFDLElBQVMsRUFBRSxFQUFFO2dCQUNsQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztnQkFFMUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMscUNBQXFDLENBQUMsQ0FBQTtZQUM1RCxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFO2dCQUNkLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO2dCQUUxQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQywyREFBMkQsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1lBRXJHLENBQUM7U0FDRixDQUFDLENBQUE7SUFDSixDQUFDOzt3SEEzWVUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsMEtDYnhDLHUvMEJBMlpNOzJGRDlZTywyQkFBMkI7a0JBTHZDLFNBQVM7K0JBQ0UseUJBQXlCO3dLQUtZLFFBQVE7c0JBQXRELFNBQVM7dUJBQUMsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwcGxpY2F0aW9uQ29udGVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9hcHBsaWNhdGlvbi1jb250ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJ2RldmV4dHJlbWUvdWkvZGlhbG9nJztcbmltcG9ydCB7IFRvYXN0clNlcnZpY2UgfSBmcm9tICduZ3gtdG9hc3RyJztcbmltcG9ydCB7IER4RGF0YUdyaWRDb21wb25lbnQgfSBmcm9tICdkZXZleHRyZW1lLWFuZ3VsYXInO1xuLy8gaW1wb3J0IHsgRXhjZXB0aW9uQ29uZmlnc1NlcnZpY2UgfSBmcm9tICcuL2V4Y2VwdGlvbi1zZXJ2aWNlJztcbmltcG9ydCB7IENvbW1vblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb21tb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdhcHAtZXhjZXB0aW9uLW9wZXJhdGlvbicsXG4gIHRlbXBsYXRlVXJsOiAnLi9leGNlcHRpb24tb3BlcmF0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZXhjZXB0aW9uLW9wZXJhdGlvbi5jb21wb25lbnQuc2NzcyddXG59KVxuZXhwb3J0IGNsYXNzIEV4Y2VwdGlvbk9wZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoJ2dyaWRDb250YWluZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgZGF0YUdyaWQ6IER4RGF0YUdyaWRDb21wb25lbnQ7XG5cbiAgbG9hZGluZ01vZGFsOiBib29sZWFuO1xuICBjb250ZW50VHlwZSA9IFwiY3JlYXRlXCI7XG4gIGZ1bmN0aW9uTmFtZUNvbnRhaW5lcjogYW55O1xuICBleGNlcHRpb25NYWluT2JqZWN0ID0ge1xuICAgIGNvbmZpZ0lkOiBcIlwiLFxuICAgIGNvbmZpZ05hbWU6IFwiXCIsXG4gICAgZGF0YXNvdXJjZTogXCJcIixcbiAgICBhY3RpdmU6IGZhbHNlLFxuICAgIGFuYWx5emVyVHlwZTogXCJcIixcbiAgICBkYkNvbmZpZzogXCJcIixcbiAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgZGF0YVNlbGVjdGlvblR5cGU6IFwiXCIsXG4gICAgZmlsZU5hbWVBdHRyaWJ1dGVOYW1lOiBcIlwiLFxuICAgIGZpbHRlckxpc3Q6IFt7XG4gICAgICBcImNvbHVtbk5hbWVcIjogXCJcIixcbiAgICAgIFwiZGF0YVR5cGVcIjogXCJcIixcbiAgICAgIFwib3BlcmF0b3JcIjogXCJcIixcbiAgICAgIFwid2luZG93RnVuY3Rpb25OYW1lXCI6IFwiXCIsXG4gICAgICBcInZhbHVlXCI6IFwiXCIsXG4gICAgICBcImRhdGVGb3JtYXRcIjogXCJcIixcbiAgICB9XSxcbiAgICBwYXR0ZXJuTGlzdDogW1xuICAgICAge1xuICAgICAgICBcInJlZ2V4XCI6IFwiXCIsXG4gICAgICAgIFwic2FtcGxlXCI6IFwiP18/P18/XCIsXG4gICAgICAgIFwiZmlsZUF0dHJpYnV0ZXNcIjogW1xuXG4gICAgICAgIF0sXG4gICAgICAgIFwiYW5hbHl6ZXJLZXlzXCI6IFtcblxuICAgICAgICBdLFxuICAgICAgICBcInNlcXVlbmNlS2V5XCI6IFwiXCIsXG4gICAgICAgIFwiZHluYW1pY0FyZ3NcIjoge1xuXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBdXG4gIH1cbiAgYW5hbHl6ZXJfdHlwZSA9IFt7IGtleTogXCJudW1lcmljX3NlcXVlbmNlXCIsIG5hbWU6IFwiTnVtZXJpYyBTZXF1ZW5jZVwiIH0sIHsga2V5OiBcImRhdGVfc2VxdWVuY2VcIiwgbmFtZTogXCJEYXRlIFNlcXVlbmNlXCIgfV1cbiAgb3BlcmF0b3JfbGlzdDogYW55O1xuICBhbGxFeGNlcHRpb25Db25maWdEYXRhU291cmNlOiBhbnk7XG4gIGlzTG9hZGVyOiBib29sZWFuID0gdHJ1ZTtcbiAgaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbjogYm9vbGVhbjtcbiAgZGF0YXNvdXJjZWxpc3Q6IGFueTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGNvbW1vblNlcnZpY2U6IENvbW1vblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzZXJ2aWNlOiBBcHBsaWNhdGlvbkNvbnRlbnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdG9hc3RyOiBUb2FzdHJTZXJ2aWNlXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpO1xuICAgIHRoaXMuc2VydmljZS5nZXRBcHBTcWxGdW5jdGlvbkxpc3QoKS5zdWJzY3JpYmUoZGF0YSA9PiB7XG4gICAgICB0aGlzLmZ1bmN0aW9uTmFtZUNvbnRhaW5lciA9IGRhdGE7XG4gICAgfSlcblxuICAgIHRoaXMuc2VydmljZS5nZXRDZHJCcm93c2VyT3BlcmF0aW9ucygpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMub3BlcmF0b3JfbGlzdCA9IGRhdGE7XG4gICAgfSlcbiAgICB0aGlzLnNlcnZpY2UuZ2V0QXBwRGF0YXNvdXJjZSgpLnN1YnNjcmliZShkYXRhID0+IHtcbiAgICAgIHRoaXMuZGF0YXNvdXJjZWxpc3QgPSAoZGF0YVsnZGF0YXNvdXJjZSddKSA/IGRhdGFbJ2RhdGFzb3VyY2UnXSA6IGRhdGE7XG4gICAgfSlcbiAgfVxuXG4gIGdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5zZXJ2aWNlLmxpc3RGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwcygpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmFsbEV4Y2VwdGlvbkNvbmZpZ0RhdGFTb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHJlc29sdmUoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG4gIGVkaXRFeGNlcHRpb25Db25maWdDb25maWcoZGF0YSkge1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBcImVkaXRcIlxuICAgIHRoaXMuaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbiA9IHRydWU7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0ID0gZGF0YTtcbiAgfVxuXG5cblxuICBjcmVhdGVFeGNlcHRpb25Db25maWcoKSB7XG4gICAgdGhpcy5pc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uID0gdHJ1ZTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QgPSB7XG4gICAgICBjb25maWdJZDogXCJcIixcbiAgICAgIGNvbmZpZ05hbWU6IFwiXCIsXG4gICAgICBkYXRhc291cmNlOiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBcIlwiLFxuICAgICAgZGJDb25maWc6IFwiXCIsXG4gICAgICB0YWJsZU5hbWU6IFwiXCIsXG4gICAgICBkYXRhU2VsZWN0aW9uVHlwZTogXCJcIixcbiAgICAgIGZpbGVOYW1lQXR0cmlidXRlTmFtZTogXCJcIixcbiAgICAgIGZpbHRlckxpc3Q6IFt7XG4gICAgICAgIFwiY29sdW1uTmFtZVwiOiBcIlwiLFxuICAgICAgICBcImRhdGFUeXBlXCI6IFwiXCIsXG4gICAgICAgIFwib3BlcmF0b3JcIjogXCJcIixcbiAgICAgICAgXCJ3aW5kb3dGdW5jdGlvbk5hbWVcIjogXCJcIixcbiAgICAgICAgXCJkYXRlRm9ybWF0XCI6IFwiXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJcIlxuICAgICAgfV0sXG4gICAgICBwYXR0ZXJuTGlzdDogW1xuICAgICAgICB7XG4gICAgICAgICAgXCJyZWdleFwiOiBcIlwiLFxuICAgICAgICAgIFwic2FtcGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJmaWxlQXR0cmlidXRlc1wiOiBbXG5cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiYW5hbHl6ZXJLZXlzXCI6IFtcblxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJzZXF1ZW5jZUtleVwiOiBcIlwiLFxuICAgICAgICAgIFwiZHluYW1pY0FyZ3NcIjoge1xuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICBdXG4gICAgfVxuICB9XG5cbiAgZ2V0Q2FuY2xlRXhjZXB0aW9uQ3JlYXRpb24oKSB7XG4gICAgdGhpcy5pc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uID0gZmFsc2U7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0ID0ge1xuICAgICAgY29uZmlnSWQ6IFwiXCIsXG4gICAgICBjb25maWdOYW1lOiBcIlwiLFxuICAgICAgZGF0YXNvdXJjZTogXCJcIixcbiAgICAgIGFjdGl2ZTogdHJ1ZSxcbiAgICAgIGFuYWx5emVyVHlwZTogXCJcIixcbiAgICAgIGRiQ29uZmlnOiBcIlwiLFxuICAgICAgdGFibGVOYW1lOiBcIlwiLFxuICAgICAgZGF0YVNlbGVjdGlvblR5cGU6IFwiXCIsXG4gICAgICBmaWxlTmFtZUF0dHJpYnV0ZU5hbWU6IFwiXCIsXG4gICAgICBmaWx0ZXJMaXN0OiBbe1xuICAgICAgICBcImNvbHVtbk5hbWVcIjogXCJcIixcbiAgICAgICAgXCJkYXRhVHlwZVwiOiBcIlwiLFxuICAgICAgICBcIm9wZXJhdG9yXCI6IFwiXCIsXG4gICAgICAgIFwid2luZG93RnVuY3Rpb25OYW1lXCI6IFwiXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJcIixcbiAgICAgICAgXCJkYXRlRm9ybWF0XCI6IFwiXCJcbiAgICAgIH1dLFxuICAgICAgcGF0dGVybkxpc3Q6IFtcbiAgICAgICAge1xuICAgICAgICAgIFwicmVnZXhcIjogXCJcIixcbiAgICAgICAgICBcInNhbXBsZVwiOiBcIlwiLFxuICAgICAgICAgIFwiZmlsZUF0dHJpYnV0ZXNcIjogW1xuXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImFuYWx5emVyS2V5c1wiOiBbXG5cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwic2VxdWVuY2VLZXlcIjogXCJcIixcbiAgICAgICAgICBcImR5bmFtaWNBcmdzXCI6IHtcblxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH1cbiAgfVxuXG5cbiAgZ2V0RGF0YUNvbmZpZyhlKSB7XG5cbiAgfVxuXG5cbiAgZ2V0UHJvY2Vzc0ZvckNvbmZpZygpIHtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5wdXNoKHtcbiAgICAgIFwiY29sdW1uTmFtZVwiOiBcIlwiLFxuICAgICAgXCJkYXRhVHlwZVwiOiBcIlwiLFxuICAgICAgXCJvcGVyYXRvclwiOiBcIlwiLFxuICAgICAgXCJ3aW5kb3dGdW5jdGlvbk5hbWVcIjogXCJcIixcbiAgICAgIFwiZGF0ZUZvcm1hdFwiOiBcIlwiLFxuICAgICAgXCJ2YWx1ZVwiOiBcIlwiXG4gICAgfSlcbiAgfVxuXG4gIGRlbGV0ZUNvbHVtZShpKSB7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3Quc3BsaWNlKGksIDEpXG4gIH1cblxuICBkZWxldGVEeW5hbWljQXJndW1lbnRzKGl0ZW0sIGtleSwgaW5kZXgpIHtcbiAgICBkZWxldGUgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0W2luZGV4XVsnZHluYW1pY0FyZ3MnXVtrZXldO1xuICB9XG4gIGFkZER5bmFtaWNBcmd1bWVudChpbmRleCkge1xuICAgIGxldCBuZXdLZXkgPSAnJztcbiAgICBsZXQgbmV3VmFsdWUgPSAnJztcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbaW5kZXhdWydkeW5hbWljQXJncyddW25ld0tleV0gPSBuZXdWYWx1ZTtcbiAgfVxuXG5cblxuICBtb3ZlSXRlbUZvckNvbHVtbnMoaW5kZXg6IG51bWJlciwgZGlyZWN0aW9uOiAndXAnIHwgJ2Rvd24nKTogdm9pZCB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgY29uc3QgaXRlbVRvTW92ZSA9IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0W2luZGV4XTtcbiAgICB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QuZmlsdGVyTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0LnNwbGljZShuZXdQb3NpdGlvbiwgMCwgaXRlbVRvTW92ZSk7XG4gIH1cblxuXG5cbiAgZ2V0QWRkUGF0dGVybnNDb25maWcoKSB7XG4gICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0LnB1c2goe1xuICAgICAgXCJyZWdleFwiOiBcIlwiLFxuICAgICAgXCJzYW1wbGVcIjogXCJcIixcbiAgICAgIFwic2VxdWVuY2VLZXlcIjogXCJcIixcbiAgICAgIFwiZmlsZUF0dHJpYnV0ZXNcIjogW10sXG4gICAgICBcImFuYWx5emVyS2V5c1wiOiBbXSxcbiAgICAgIFwiZHluYW1pY0FyZ3NcIjoge31cbiAgICB9KVxuICB9XG5cbiAgbW92ZUl0ZW1Gb3JwYXR0ZXJucyhpbmRleDogbnVtYmVyLCBkaXJlY3Rpb246ICd1cCcgfCAnZG93bicpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBuZXdQb3NpdGlvbiA9IGRpcmVjdGlvbiA9PT0gJ3VwJyA/IGluZGV4IC0gMSA6IGluZGV4ICsgMTtcbiAgICBpZiAobmV3UG9zaXRpb24gPCAwIHx8IG5ld1Bvc2l0aW9uID49IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5sZW5ndGgpIHJldHVybjtcblxuICAgIGNvbnN0IGl0ZW1Ub01vdmUgPSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbaW5kZXhdO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5zcGxpY2UobmV3UG9zaXRpb24sIDAsIGl0ZW1Ub01vdmUpO1xuICB9XG5cbiAgZGVsZXRlUGF0dGVybnNDb2x1bWUoaSkge1xuICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdC5zcGxpY2UoaSwgMSlcbiAgfVxuXG4gIG9uQ3VzdG9tRmlsZUF0dHJpYnV0ZXNBZGQoYXJncykge1xuICAgIGNvbnN0IG5ld1ZhbHVlID0gYXJncy50ZXh0O1xuICAgIGFyZ3MuY3VzdG9tSXRlbSA9IG5ld1ZhbHVlO1xuICAgIGNvbnN0IGlzSXRlbUluRGF0YVNvdXJjZSA9IHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFsnZmlsZUF0dHJpYnV0ZXMnXS5zb21lKChpdGVtKSA9PiBpdGVtID09PSBuZXdWYWx1ZSk7XG4gICAgaWYgKCFpc0l0ZW1JbkRhdGFTb3VyY2UpIHtcbiAgICAgIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdFsnZmlsZUF0dHJpYnV0ZXMnXS51bnNoaWZ0KG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBvbkN1c3RvbUFuYWxpemVyS2V5QWRkKGFyZ3MpIHtcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGFyZ3MudGV4dDtcbiAgICBhcmdzLmN1c3RvbUl0ZW0gPSBuZXdWYWx1ZTtcbiAgICBjb25zdCBpc0l0ZW1JbkRhdGFTb3VyY2UgPSB0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QucGF0dGVybkxpc3RbJ2FuYWx5emVyS2V5cyddLnNvbWUoKGl0ZW0pID0+IGl0ZW0gPT09IG5ld1ZhbHVlKTtcbiAgICBpZiAoIWlzSXRlbUluRGF0YVNvdXJjZSkge1xuICAgICAgdGhpcy5leGNlcHRpb25NYWluT2JqZWN0LnBhdHRlcm5MaXN0WydhbmFseXplcktleXMnXS51bnNoaWZ0KG5ld1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuXG4gIHVwZGF0ZUV4Y2VwdGlvbkNvbmZpZygpIHtcbiAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWU7XG4gICAgdGhpcy5zZXJ2aWNlLmVkaXRGaWxlU2VxdWVuY2VBbmFseXplckdyb3VwKHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5pc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uID0gZmFsc2U7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSB0cnVlO1xuICAgICAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCk7XG4gICAgICB9LCBlcnJvcjogKGVycjogYW55KSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdDcmVhdGUgRXhjZXB0aW9uIENvbmZpZycpXG5cbiAgICAgIH1cbiAgICB9KVxuICAgIGNvbnNvbGUubG9nKHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdClcbiAgfVxuICBzYXZlRXhjZXB0aW9uQ29uZmlnKCkge1xuXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIHRoaXMuZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdCkge1xuICAgICAgaWYgKCFlbGVtZW50LmZpbGVBdHRyaWJ1dGVzLmluY2x1ZGVzKGVsZW1lbnQuc2VxdWVuY2VLZXkpKSB7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdTZXF1ZW5jZSBLZXkgbm90IHZhbGlkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWxsTWF0Y2ggPSBlbGVtZW50LmFuYWx5emVyS2V5cy5ldmVyeShpdGVtID0+IGVsZW1lbnQuZmlsZUF0dHJpYnV0ZXMuaW5jbHVkZXMoaXRlbSkpO1xuICAgICAgY29uc3QgYWxsS2V5c01hdGNoID0gT2JqZWN0LmtleXMoZWxlbWVudC5keW5hbWljQXJncykuZXZlcnkoa2V5ID0+IGVsZW1lbnQuZmlsZUF0dHJpYnV0ZXMuaW5jbHVkZXMoa2V5KSk7XG5cbiAgICAgIGlmICghYWxsTWF0Y2gpIHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ0FuYWx5emVyIEtleXMgbm90IHZhbGlkJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKCFhbGxLZXlzTWF0Y2gpIHtcbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ0ZpbGxlciBub3QgdmFsaWQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB1cGRhdGVkT2JqID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3QuZW50cmllcyhlbGVtZW50LmR5bmFtaWNBcmdzKS5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2BkZWZhdWx0XyR7a2V5fV9maWx0ZXJgLCB2YWx1ZV0pXG4gICAgICApO1xuICAgICAgZWxlbWVudC5keW5hbWljQXJncyA9IHVwZGF0ZWRPYmo7XG4gICAgfVxuXG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS5zYXZlRmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cCh0aGlzLmV4Y2VwdGlvbk1haW5PYmplY3QpLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuaXNFeGNlcHRpb25Db25maWdDcmVhdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5nZXRFeGNlcHRpb25EYXRhQ29uZ2lncygpO1xuICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgIHRoaXMudG9hc3RyLmVycm9yKCdVbmV4cGVjdGVkIFNlcnZlciBFeGNlcHRpb24uIFBsZWFzZSBjb250YWN0IFN5c3RlbSBBZG1pbi4nLCAnQ3JlYXRlIEV4Y2VwdGlvbiBDb25maWcnKVxuXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGRlbGV0ZUV4Y2VwdGlvbkNvbmZpZyhkYXRhKSB7XG4gICAgbGV0IHJlc3VsdCA9IGNvbmZpcm0oXCI8aT5BcmUgWW91IFN1cmU/PC9pPlwiLCBcIkRlbGV0ZSBDb25maWdcIik7XG4gICAgcmVzdWx0LnRoZW4oKGRpYWxvZ1Jlc3VsdCkgPT4ge1xuICAgICAgaWYgKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IHRydWVcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmRlbGV0ZUZpbGVTZXF1ZW5jZUFuYWx5emVyR3JvdXAoZGF0YS5jb25maWdJZCkuc3Vic2NyaWJlKHtcbiAgICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UGFnZUluZGV4ID0gdGhpcy5kYXRhR3JpZD8uaW5zdGFuY2UucGFnZUluZGV4KCk7XG4gICAgICAgICAgICB0aGlzLmdldEV4Y2VwdGlvbkRhdGFDb25naWdzKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjdXJyZW50UGFnZUluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnBhZ2VJbmRleChjdXJyZW50UGFnZUluZGV4KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0aGlzLmlzTG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoZGF0YS5yZXNwb25zZSlcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sIGVycm9yOiAoZXJyOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0NEUiBDb25maWcgRGVsZXRlJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVkRXhjZXB0aW9uKGRhdGEpIHtcbiAgICBsZXQgcmVzdWx0ID0gY29uZmlybShcIjxpPkFyZSBZb3UgU3VyZT88L2k+XCIsIFwiQWN0aXZhdGUgQ29uZmlnXCIpO1xuICAgIHJlc3VsdC50aGVuKChkaWFsb2dSZXN1bHQpID0+IHtcbiAgICAgIGlmIChkaWFsb2dSZXN1bHQpIHtcbiAgICAgICAgdGhpcy5zZXJ2aWNlLmFjdGl2YXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cChkYXRhLmNvbmZpZ0lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZS5wYWdlSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucGFnZUluZGV4KGN1cnJlbnRQYWdlSW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhkYXRhLnJlc3BvbnNlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0V4Y2VwdGlvbiBDb25maWcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cbiAgZGVBY3RpdmF0ZWRFeGNlcHRpb24oZGF0YSkge1xuICAgIGxldCByZXN1bHQgPSBjb25maXJtKFwiPGk+QXJlIFlvdSBTdXJlPzwvaT5cIiwgXCJEZWFjdGl2YXRlIENvbmZpZ1wiKTtcbiAgICByZXN1bHQudGhlbigoZGlhbG9nUmVzdWx0KSA9PiB7XG4gICAgICBpZiAoZGlhbG9nUmVzdWx0KSB7XG4gICAgICAgIHRoaXMuc2VydmljZS5kZWFjdGl2YXRlRmlsZVNlcXVlbmNlQW5hbHl6ZXJHcm91cChkYXRhLmNvbmZpZ0lkKS5zdWJzY3JpYmUoe1xuICAgICAgICAgIG5leHQ6IChkYXRhOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRQYWdlSW5kZXggPSB0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZS5wYWdlSW5kZXgoKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0RXhjZXB0aW9uRGF0YUNvbmdpZ3MoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQYWdlSW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucGFnZUluZGV4KGN1cnJlbnRQYWdlSW5kZXgpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMuaXNMb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgICAgICAgdGhpcy50b2FzdHIuc3VjY2VzcyhkYXRhLnJlc3BvbnNlKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSwgZXJyb3I6IChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLnRvYXN0ci5lcnJvcignVW5leHBlY3RlZCBTZXJ2ZXIgRXhjZXB0aW9uLiBQbGVhc2UgY29udGFjdCBTeXN0ZW0gQWRtaW4uJywgJ0V4Y2VwdGlvbiBDb25maWcnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICB1cGRhdGVGaWxlU2VxdWVuY2VBbmFseXplckpvYnMoKSB7XG4gICAgdGhpcy5sb2FkaW5nTW9kYWwgPSB0cnVlO1xuICAgIHRoaXMuc2VydmljZS51cGRhdGVGaWxlU2VxdWVuY2VBbmFseXplckpvYnMoKS5zdWJzY3JpYmUoe1xuICAgICAgbmV4dDogKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLmxvYWRpbmdNb2RhbCA9IGZhbHNlO1xuXG4gICAgICAgIHRoaXMudG9hc3RyLnN1Y2Nlc3MoXCJGaWxlIFNlcXVlbmNlIEFuYWx5emVyIEpvYnMgVXBkYXRlZFwiKVxuICAgICAgfSwgZXJyb3I6IGVyciA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZ01vZGFsID0gZmFsc2U7XG5cbiAgICAgICAgdGhpcy50b2FzdHIuZXJyb3IoJ1VuZXhwZWN0ZWQgU2VydmVyIEV4Y2VwdGlvbi4gUGxlYXNlIGNvbnRhY3QgU3lzdGVtIEFkbWluLicsICdFeGNlcHRpb24gQ29uZmlnJyk7XG5cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cblxufVxuIiwiPGFwcC1sb2FkaW5nICpuZ0lmPVwibG9hZGluZ01vZGFsXCI+PC9hcHAtbG9hZGluZz5cbjxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGZsZXgtYXV0byB3LWZ1bGxcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBqdXN0aWZ5LWJldHdlZW4gYm9yZGVyLWIgIGRhcms6YmctdHJhbnNwYXJlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4ICBmbGV4LWNvbCBtbC0xXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggIGl0ZW1zLWNlbnRlciBmbG9hdC1zdGFydFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgb3ZlcmZsb3ctaGlkZGVuXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJpY29uLXNpemUtMlwiIFtzdmdJY29uXT1cIidoZXJvaWNvbnNfc29saWQ6dGVtcGxhdGUnXCI+PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxoMlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LTJ4bCBtZDp0ZXh0LTJ4bCBweS0zIGZvbnQtZXh0cmFib2xkIGl0ZW1zLWNlbnRlciBtbC0yIHRyYWNraW5nLXRpZ2h0IGxlYWRpbmctNSB0cnVuY2F0ZSBjYXBpdGFsaXplXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb24gQ29uZmlndXJhdGlvblxuICAgICAgICAgICAgICAgICAgICA8L2gyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJcIj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1iZXR3ZWVuIGl0ZW1zLWNlbnRlciBib3JkZXItbC0yIHAtMCBtLTBcIj5cblxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMSBoLWZ1bGwgYm9yZGVyLWwtMlwiPjwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHAtMVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fSBjdXJzb3ItcG9pbnRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjcmVhdGVFeGNlcHRpb25Db25maWcoKVwiPkNyZWF0ZSBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibS0zIHAtNCBiZy13aGl0ZSBib3JkZXIgYm9yZGVyLWdyYXktMjAwIHJvdW5kZWQtbGcgc2hhZG93LW1kIGRhcms6YmctZ3JheS04MDAgZGFyazpib3JkZXItZ3JheS03MDBcIj5cbiAgICAgICAgICAgIDxoNiBjbGFzcz1cIm1iLTIgZm9udC1ib2xkIHRleHQtbGcgdHJhY2tpbmctdGlnaHQgdGV4dC1ncmF5LTkwMCBkYXJrOnRleHQtd2hpdGUgYm9yZGVyLWIgcGItM1wiPjxpXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtdGFibGUgbXItMlwiPjwvaT4gRmlsZSBTZXF1ZW5jZSBBbmFseXplciBjb25maWdzIHwgXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3N1Y2Nlc3NfbWR9fVwiIChjbGljayk9XCJ1cGRhdGVGaWxlU2VxdWVuY2VBbmFseXplckpvYnMoKVwiPlVwZGF0ZTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgIDwhLS0gPGFwcC1sb2FkZXIgKm5nSWY9XCJpc0xvYWRlclwiPjwvYXBwLWxvYWRlcj4gLS0+XG4gICAgICAgICAgICA8ZHgtZGF0YS1ncmlkIFtjb2x1bW5BdXRvV2lkdGhdPVwidHJ1ZVwiIFtkYXRhU291cmNlXT1cImFsbEV4Y2VwdGlvbkNvbmZpZ0RhdGFTb3VyY2VcIiBbc2VsZWN0ZWRSb3dLZXlzXT1cIltdXCJcbiAgICAgICAgICAgICAgICBbc2hvd0JvcmRlcnNdPVwidHJ1ZVwiIFtzaG93Um93TGluZXNdPVwidHJ1ZVwiIGlkPVwiZ3JpZENvbnRhaW5lclwiIFtob3ZlclN0YXRlRW5hYmxlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0xvYWRlclwiPlxuXG4gICAgICAgICAgICAgICAgPGR4by1zZWFyY2gtcGFuZWwgW2hpZ2hsaWdodENhc2VTZW5zaXRpdmVdPVwidHJ1ZVwiIFt2aXNpYmxlXT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICA8L2R4by1zZWFyY2gtcGFuZWw+XG4gICAgICAgICAgICAgICAgPGR4by1leHBvcnQgW2VuYWJsZWRdPVwidHJ1ZVwiIGZpbGVOYW1lPVwiYWxlcnRfZGF0YV9ieV9zdGF0dXNcIj48L2R4by1leHBvcnQ+XG4gICAgICAgICAgICAgICAgPGR4by1wYWdpbmcgW3BhZ2VTaXplXT1cIjEwXCI+PC9keG8tcGFnaW5nPlxuICAgICAgICAgICAgICAgIDxkeG8tcGFnZXIgW3Nob3dJbmZvXT1cInRydWVcIiBbc2hvd1BhZ2VTaXplU2VsZWN0b3JdPVwidHJ1ZVwiIFthbGxvd2VkUGFnZVNpemVzXT1cIlsxMCwyMCw1MCwxMDBdXCI+XG4gICAgICAgICAgICAgICAgPC9keG8tcGFnZXI+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiY29uZmlnTmFtZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJkYXRhc291cmNlXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImRiQ29uZmlnXCI+PC9keGktY29sdW1uPlxuICAgICAgICAgICAgICAgIDxkeGktY29sdW1uIGRhdGFGaWVsZD1cImFuYWx5emVyVHlwZVwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJmaWxlTmFtZUF0dHJpYnV0ZU5hbWVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gZGF0YUZpZWxkPVwiZGF0YVNlbGVjdGlvblR5cGVcIj48L2R4aS1jb2x1bW4+XG4gICAgICAgICAgICAgICAgPGR4aS1jb2x1bW4gY2FwdGlvbj1cIlN0YXR1c1wiIGRhdGFGaWVsZD1cImFjdGl2ZVwiIGNlbGxUZW1wbGF0ZT1cImNlbGxUZW1wbGF0ZTFcIj48L2R4aS1jb2x1bW4+XG5cbiAgICAgICAgICAgICAgICA8ZHhpLWNvbHVtbiBkYXRhRmllbGQ9XCJhY3Rpb25cIiBjZWxsVGVtcGxhdGU9XCJjZWxsVGVtcGxhdGVcIiBbZml4ZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGZpeGVkUG9zaXRpb249XCJyaWdodFwiPjwvZHhpLWNvbHVtbj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZSdcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5QcmltYXJ5Qmx1ZX19XCIgKGNsaWNrKT1cImVkaXRFeGNlcHRpb25Db25maWdDb25maWcoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0blByaW1hcnlCbHVlfX1cIiAqbmdJZj1cImRhdGEuZGF0YS5hY3RpdmUgPT0gZmFsc2VcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRFeGNlcHRpb25Db25maWdDb25maWcoZGF0YS5kYXRhKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgRWRpdFxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj4gLS0+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX21kfX1cIiAoY2xpY2spPVwiZGVsZXRlRXhjZXB0aW9uQ29uZmlnKGRhdGEuZGF0YSlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGRhdGEgb2YgJ2NlbGxUZW1wbGF0ZTEnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiICpuZ0lmPVwiZGF0YS5kYXRhLmFjdGl2ZSA9PSB0cnVlXCIgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuU3VjY2Vzc0dyZWVufX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlQWN0aXZhdGVkRXhjZXB0aW9uKGRhdGEuZGF0YSlcIj5BY3RpdmU8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiAqbmdJZj1cImRhdGEuZGF0YS5hY3RpdmUgPT0gZmFsc2VcIiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5XYXJuaW5nWWVsbG93fX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImFjdGl2YXRlZEV4Y2VwdGlvbihkYXRhLmRhdGEpXCI+SW5hY3RpdmU8L2J1dHRvbj5cblxuXG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwvZHgtZGF0YS1ncmlkPlxuXG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0V4Y2VwdGlvbkNvbmZpZ0NyZWF0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cIm0tMyBwLTQgYmctd2hpdGUgYm9yZGVyIGJvcmRlci1ncmF5LTIwMCByb3VuZGVkLWxnIHNoYWRvdy1tZCBkYXJrOmJnLWdyYXktODAwIGRhcms6Ym9yZGVyLWdyYXktNzAwXCI+XG4gICAgICAgICAgICAgICAgPGg2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibWItMiB0ZXh0LWxnIHRyYWNraW5nLXRpZ2h0IHRleHQtZ3JheS05MDAgZGFyazp0ZXh0LXdoaXRlIGJvcmRlci1iIHBiLTMgZmxleCBpdGVtcy1jZW50ZXIgY2FwaXRhbGl6ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnRUeXBlfX0gRXhjZXB0aW9uIENvbmZpZ3VyYXRpb25zXG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuT3RoZXJzUHVycGxlfX1cIiAoY2xpY2spPVwiZ2V0Q2FuY2xlRXhjZXB0aW9uQ3JlYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhY2tcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2g2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSAgKG9uVmFsdWVDaGFuZ2VkKT1cInZhbHVlQ2hhbmdlRm9yRGF0YWJhc2VOYW1lKCRldmVudClcIiAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGJvcmRlci1yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgbWItMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibXgtMiB3LTEvM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPkNvbmZpZyBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJleGNlcHRpb25NYWluT2JqZWN0LmNvbmZpZ05hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTIgdy0xLzNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj5EYXRhc291cmNlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtc2VsZWN0LWJveCBbaXRlbXNdPVwiZGF0YXNvdXJjZWxpc3RcIiBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuZGF0YXNvdXJjZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yIHctMS8zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1tZCBtYi0yXCI+QW5hbHl6ZXIgVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cImFuYWx5emVyX3R5cGVcIiB2YWx1ZUV4cHI9XCJrZXlcIiBkaXNwbGF5RXhwcj1cIm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5hbmFseXplclR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXNlbGVjdC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgYm9yZGVyLWIgbXktNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwdC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGIgQ29uZmlnPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIlsnbW9uZ28nLCdpbXBhbGEnLCdwb3N0Z3JlcycsJ215c3FsJywnYmlncXVlcnknXVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvblZhbHVlQ2hhbmdlZCk9XCJnZXREYXRhQ29uZmlnKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuZGJDb25maWdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBUYWJsZSBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC50YWJsZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB4LTIgbWItMiB3LTEvMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kIG1iLTJcIj4gRGF0YSBTZWxlY3Rpb24gVHlwZTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJbJ3NlbGVjdCcsJ2Rpc3RpbmN0J11cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImV4Y2VwdGlvbk1haW5PYmplY3QuZGF0YVNlbGVjdGlvblR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHgtMiBtYi0yIHctMS8yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtbWQgbWItMlwiPiBGaWxlIENvbHVtbiBOYW1lPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiZXhjZXB0aW9uTWFpbk9iamVjdC5maWxlTmFtZUF0dHJpYnV0ZU5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBib3JkZXItYiBteS00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZmxleC1hdXRvIG1pbi13LTAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHktMiBib3JkZXItYiBib3JkZXItYlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTJ4bCBmb250LWV4dHJhYm9sZFwiPkZpbHRlciBMaXN0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldFByb2Nlc3NGb3JDb25maWcoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZCBGaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInB0LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IG15LTJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBpdGVtcyBvZiBleGNlcHRpb25NYWluT2JqZWN0LmZpbHRlckxpc3Q7bGV0IGkgPSBpbmRleDtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5Db2x1bW4gTmFtZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLmNvbHVtbk5hbWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPk9wZXJhdG9yPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXNlbGVjdC1ib3ggW2l0ZW1zXT1cIm9wZXJhdG9yX2xpc3RcIiB2YWx1ZUV4cHI9XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUV4cHI9XCJuYW1lXCIgWyhuZ01vZGVsKV09XCJpdGVtcy5vcGVyYXRvclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5EYXRhdHlwZTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1zXT1cIlsnZGF0ZScsJ3N0cmluZycsJ3RpbWVzdGFtcCcsJ2ludCcsICdkb3VibGUnLCAnYm9vbGVhbiddXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW1zLmRhdGFUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcmVhZE9ubHldPVwiY29udGVudFR5cGUgPT0gJ3ZpZXcnXCI+PC9keC1zZWxlY3QtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LWZ1bGwgcHgtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPlNlbGVjdCBGdW5jdGlvbjwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC1zZWxlY3QtYm94IFtpdGVtc109XCJmdW5jdGlvbk5hbWVDb250YWluZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbXMud2luZG93RnVuY3Rpb25OYW1lXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPjwvZHgtc2VsZWN0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctZnVsbCBweC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJpdGVtcy5kYXRhVHlwZSA9PSAnZGF0ZScgfHwgaXRlbXMuZGF0YVR5cGUgPT0gJ3RpbWVzdGFtcCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5EYXRlIEZvcm1hdDwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLmRhdGVGb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImR4LWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5EZWZhdWx0IFZhbHVlPC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMudmFsdWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj48L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm14LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctdXBcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fbGlnaHRfc219fSBjdXJzb3ItcG9pbnRlciBteC0xIG10LTZcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwibW92ZUl0ZW1Gb3JDb2x1bW5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1hcnJvdy1kb3duXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fZGFuZ2VyX3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZUNvbHVtZShpKVwiPjxpIGNsYXNzPVwiZmEgZmEtdHJhc2gtb1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy1mdWxsIGJvcmRlci1iIG15LTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBmbGV4LWF1dG8gbWluLXctMCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJweS0yIGJvcmRlci1iIGJvcmRlci1iXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBweC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtMnhsIGZvbnQtZXh0cmFib2xkXCI+UGF0dGVybiBMaXN0PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHB4LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgganVzdGlmeS1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX3ByaW1hcnlfbWR9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImdldEFkZFBhdHRlcm5zQ29uZmlnKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGQgUGF0dGVyblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHQtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbXMgb2YgZXhjZXB0aW9uTWFpbk9iamVjdC5wYXR0ZXJuTGlzdDtsZXQgaSA9IGluZGV4O1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPlJlZ2V4PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW1zLnJlZ2V4XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMiBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkZpbGUgQXR0cmlidXRlczwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGFnLWJveCBbbXVsdGlsaW5lXT1cInRydWVcIiBbc2hvd1NlbGVjdGlvbkNvbnRyb2xzXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYWNjZXB0Q3VzdG9tVmFsdWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkN1c3RvbUl0ZW1DcmVhdGluZyk9XCJvbkN1c3RvbUZpbGVBdHRyaWJ1dGVzQWRkKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cIml0ZW1zLmZpbGVBdHRyaWJ1dGVzXCIgW3NlYXJjaEVuYWJsZWRdPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGFnLWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzMgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5TZXF1ZW5jZUtleTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZHgtdGV4dC1ib3ggWyhuZ01vZGVsKV09XCJpdGVtcy5zZXF1ZW5jZUtleVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyZWFkT25seV09XCJjb250ZW50VHlwZSA9PSAndmlldydcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2R4LXRleHQtYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvMyBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkeC1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMVwiPkFuYWx5emVyIEtleXM8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRhZy1ib3ggW211bHRpbGluZV09XCJ0cnVlXCIgW3Nob3dTZWxlY3Rpb25Db250cm9sc109XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FjY2VwdEN1c3RvbVZhbHVlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25DdXN0b21JdGVtQ3JlYXRpbmcpPVwib25DdXN0b21BbmFsaXplcktleUFkZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpdGVtcy5hbmFseXplcktleXNcIiBbc2VhcmNoRW5hYmxlZF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9keC10YWctYm94PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xLzYgcHgtMiBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZHgtZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cIm1iLTFcIj5TYW1wbGU8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94IFsobmdNb2RlbCldPVwiaXRlbXMuc2FtcGxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3JlYWRPbmx5XT1cImNvbnRlbnRUeXBlID09ICd2aWV3J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZHgtdGV4dC1ib3g+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEvNiBweC0yIG15LTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJteC0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImkgIT09IDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvcnBhdHRlcm5zKGksICd1cCcpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLWFycm93LXVwXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uICpuZ0lmPVwiaSAhPT0gZXhjZXB0aW9uTWFpbk9iamVjdC5maWx0ZXJMaXN0Lmxlbmd0aCAtIDFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2xpZ2h0X3NtfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBtdC02XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJtb3ZlSXRlbUZvcnBhdHRlcm5zKGksICdkb3duJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYXJyb3ctZG93blwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGVsZXRlUGF0dGVybnNDb2x1bWUoaSlcIj48aSBjbGFzcz1cImZhIGZhLXRyYXNoLW9cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteGwgbWItMlwiPkR5bmFtaWMgQXJndW1lbnRzIHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fcHJpbWFyeV9zbX19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJhZGREeW5hbWljQXJndW1lbnQoaSlcIj5BZGQgQXJndW1lbnRzPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tNVwiPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgaXRlbSBvZiBpdGVtcy5keW5hbWljQXJncyB8IGtleXZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMS8yIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+IEFyZ3VtZW50IEtleTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkeC10ZXh0LWJveCBbKG5nTW9kZWwpXT1cIml0ZW0ua2V5XCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LW1kXCI+IEFyZ3VtZW50IFZhbHVlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGR4LXRleHQtYm94XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiaXRlbXMuZHluYW1pY0FyZ3NbaXRlbS5rZXldXCI+PC9keC10ZXh0LWJveD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm0tMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ7e2NvbW1vblNlcnZpY2UuYnRuX2Rhbmdlcl9zbX19IGN1cnNvci1wb2ludGVyIG14LTEgbXQtNlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkZWxldGVEeW5hbWljQXJndW1lbnRzKGl0ZW0saXRlbS5rZXksaSlcIj48aVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS10cmFzaC1vXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggdy1mdWxsIGp1c3RpZnktZW5kIG10LTUgYm9yZGVyLXRcIiAqbmdJZj1cImNvbnRlbnRUeXBlICE9PSAndmlldydcIj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwie3tjb21tb25TZXJ2aWNlLmJ0bl9zdWNjZXNzX21kfX0gY3Vyc29yLXBvaW50ZXIgbXgtMSBteS0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzYXZlRXhjZXB0aW9uQ29uZmlnKClcIiAqbmdJZj1cImNvbnRlbnRUeXBlID09ICdjcmVhdGUnXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGUgRXhjZXB0aW9uIENvbmZpZ1xuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInt7Y29tbW9uU2VydmljZS5idG5fc3VjY2Vzc19tZH19IGN1cnNvci1wb2ludGVyIG14LTEgbXktMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwidXBkYXRlRXhjZXB0aW9uQ29uZmlnKClcIiAqbmdJZj1cImNvbnRlbnRUeXBlID09ICdlZGl0J1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlIEV4Y2VwdGlvbiBDb25maWdcbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj4iXX0=