sf-crud 12.0.5 → 12.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/sf-crud.umd.js +2563 -1306
- package/bundles/sf-crud.umd.js.map +1 -1
- package/esm2015/lib/components/control/control.component.js +285 -73
- package/esm2015/lib/components/file-upload/file-upload.component.js +143 -0
- package/esm2015/lib/components/form/form.component.js +267 -0
- package/esm2015/lib/components/registro/registro.component.js +507 -407
- package/esm2015/lib/components/step/step.component.js +79 -0
- package/esm2015/lib/components/tablero/tablero.component.js +87 -27
- package/esm2015/lib/sf-crud.module.js +27 -15
- package/esm2015/lib/sf-crud.routing.module.js +23 -0
- package/esm2015/lib/sf-crud.service.js +486 -12
- package/esm2015/lib/shared/models/Conditions.model.js +81 -0
- package/esm2015/lib/shared/models/Empresa.model.js +2 -0
- package/esm2015/lib/shared/models/Reason.model.js +7 -0
- package/esm2015/lib/shared/models/crud-config.model.js +36 -13
- package/esm2015/lib/shared/models/shema.model.js +5 -1
- package/esm2015/lib/shared/services/general.service.js +41 -17
- package/esm2015/lib/shared/services/notification.service.js +83 -0
- package/esm2015/lib/shared/services/step.service.js +65 -0
- package/esm2015/public-api.js +7 -1
- package/fesm2015/sf-crud.js +2194 -1151
- package/fesm2015/sf-crud.js.map +1 -1
- package/lib/components/control/control.component.d.ts +39 -10
- package/lib/components/file-upload/file-upload.component.d.ts +34 -0
- package/lib/components/form/form.component.d.ts +58 -0
- package/lib/components/registro/registro.component.d.ts +81 -54
- package/lib/components/step/step.component.d.ts +27 -0
- package/lib/components/tablero/tablero.component.d.ts +15 -5
- package/lib/sf-crud.module.d.ts +80 -76
- package/lib/sf-crud.routing.module.d.ts +7 -0
- package/lib/sf-crud.service.d.ts +115 -5
- package/lib/shared/models/Conditions.model.d.ts +32 -0
- package/lib/shared/models/Empresa.model.d.ts +11 -0
- package/lib/shared/models/Reason.model.d.ts +5 -0
- package/lib/shared/models/crud-config.model.d.ts +76 -24
- package/lib/shared/models/shema.model.d.ts +27 -0
- package/lib/shared/services/general.service.d.ts +8 -1
- package/lib/shared/services/notification.service.d.ts +27 -0
- package/lib/shared/services/step.service.d.ts +27 -0
- package/package.json +9 -2
- package/public-api.d.ts +6 -0
- package/esm2015/lib/components/registro-child/registro-child.component.js +0 -348
- package/esm2015/lib/components/registro-detalle/registro-detalle.component.js +0 -232
- package/esm2015/lib/shared/models/data-temp-crud.model.js +0 -6
- package/lib/components/registro-child/registro-child.component.d.ts +0 -48
- package/lib/components/registro-detalle/registro-detalle.component.d.ts +0 -36
- package/lib/shared/models/data-temp-crud.model.d.ts +0 -4
|
@@ -1,47 +1,175 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
1
|
+
import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy, ViewChildren } from '@angular/core';
|
|
2
2
|
import { Shema } from '../../shared/models/shema.model';
|
|
3
|
+
import { RequestChecking } from '../../shared/models/crud-config.model';
|
|
4
|
+
import { Tooltip } from 'primeng/tooltip';
|
|
3
5
|
import * as moment from 'moment';
|
|
6
|
+
import * as jsonpath from 'jsonpath';
|
|
4
7
|
import * as i0 from "@angular/core";
|
|
5
8
|
import * as i1 from "../../shared/services/general.service";
|
|
6
|
-
import * as i2 from "
|
|
7
|
-
import * as i3 from "
|
|
8
|
-
import * as i4 from "primeng/
|
|
9
|
-
import * as i5 from "primeng/
|
|
10
|
-
import * as i6 from "primeng/
|
|
11
|
-
import * as i7 from "
|
|
12
|
-
import * as i8 from "primeng/
|
|
13
|
-
import * as i9 from "
|
|
14
|
-
import * as i10 from "
|
|
15
|
-
import * as i11 from "primeng/
|
|
16
|
-
import * as i12 from "
|
|
17
|
-
import * as i13 from "primeng/
|
|
18
|
-
import * as i14 from "
|
|
9
|
+
import * as i2 from "../../sf-crud.service";
|
|
10
|
+
import * as i3 from "../../shared/services/notification.service";
|
|
11
|
+
import * as i4 from "primeng/inputmask";
|
|
12
|
+
import * as i5 from "primeng/dropdown";
|
|
13
|
+
import * as i6 from "primeng/autocomplete";
|
|
14
|
+
import * as i7 from "../file-upload/file-upload.component";
|
|
15
|
+
import * as i8 from "primeng/calendar";
|
|
16
|
+
import * as i9 from "primeng/inputnumber";
|
|
17
|
+
import * as i10 from "primeng/multiselect";
|
|
18
|
+
import * as i11 from "primeng/inputswitch";
|
|
19
|
+
import * as i12 from "@angular/common";
|
|
20
|
+
import * as i13 from "primeng/tooltip";
|
|
21
|
+
import * as i14 from "@angular/forms";
|
|
22
|
+
import * as i15 from "primeng/inputtext";
|
|
23
|
+
import * as i16 from "primeng/inputtextarea";
|
|
24
|
+
import * as i17 from "primeng/button";
|
|
19
25
|
export class ControlComponent {
|
|
20
|
-
constructor(generalService) {
|
|
26
|
+
constructor(generalService, crudService, cdr, notificationService) {
|
|
21
27
|
this.generalService = generalService;
|
|
28
|
+
this.crudService = crudService;
|
|
29
|
+
this.cdr = cdr;
|
|
30
|
+
this.notificationService = notificationService;
|
|
31
|
+
this.showTempValue = false;
|
|
22
32
|
this.control = new Shema();
|
|
23
33
|
this.label = '';
|
|
24
34
|
this.setValue = new EventEmitter();
|
|
25
|
-
this.sendNotification = new EventEmitter();
|
|
26
35
|
this.sendObject = new EventEmitter();
|
|
27
36
|
this.isLoading = false;
|
|
28
37
|
this.dataFromService = [];
|
|
29
38
|
this.uploadedFiles = [];
|
|
30
39
|
this.displayAdd = false;
|
|
31
|
-
this.
|
|
40
|
+
this.uploadingFiles = false;
|
|
41
|
+
}
|
|
42
|
+
ngOnChanges(changes) {
|
|
32
43
|
}
|
|
33
44
|
ngOnInit() {
|
|
34
|
-
var _a;
|
|
35
|
-
|
|
45
|
+
var _a, _b;
|
|
46
|
+
this.loadDefaultValues();
|
|
47
|
+
if ((_b = (_a = this.control) === null || _a === void 0 ? void 0 : _a.config) === null || _b === void 0 ? void 0 : _b.depends) {
|
|
48
|
+
this.crudService.changeData$.subscribe(res => {
|
|
49
|
+
var _a, _b;
|
|
50
|
+
if (res) {
|
|
51
|
+
let registro = this.crudService.getRegistro(this.crudService.index);
|
|
52
|
+
let keyFound = (_a = registro.keys) === null || _a === void 0 ? void 0 : _a.find(k => k.scope === res.scope
|
|
53
|
+
&& this.control.config.depends.includes(k.key) &&
|
|
54
|
+
(res.index === k.indexData || res.index === k.indexAnswer));
|
|
55
|
+
if (keyFound === null || keyFound === void 0 ? void 0 : keyFound.overrideControl) {
|
|
56
|
+
let override = keyFound.overrideControl;
|
|
57
|
+
let completed = this.crudService.isConditionsCompleted((_b = override.conditions) !== null && _b !== void 0 ? _b : [], registro.conditions || [], this.crudService.getData(this.crudService.index));
|
|
58
|
+
jsonpath.value(this.control, override.property, completed ? override.value : override.elseValue);
|
|
59
|
+
this.value = this.getNewValue(override, completed);
|
|
60
|
+
this.tempValue = null;
|
|
61
|
+
this.sendValue();
|
|
62
|
+
if (this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
|
|
63
|
+
this.loadDataFromService();
|
|
64
|
+
//this.cdr.detectChanges()
|
|
65
|
+
}
|
|
66
|
+
else if (keyFound) {
|
|
67
|
+
this.value = null;
|
|
68
|
+
this.sendValue();
|
|
69
|
+
this.loadDefaultValues();
|
|
70
|
+
//this.cdr.detectChanges()
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
getNewValue(override, completed) {
|
|
77
|
+
const newValue = completed ? override.newPropertyValue : override.elseNewPropertyValue;
|
|
78
|
+
if (newValue && typeof (newValue) == "string") {
|
|
79
|
+
if (!newValue.startsWith('$') && !newValue.startsWith('@')) {
|
|
80
|
+
return newValue;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
loadDefaultValues() {
|
|
86
|
+
var _a, _b, _c, _d, _e;
|
|
87
|
+
if (((_a = this.control) === null || _a === void 0 ? void 0 : _a.config) && this.control.subtype == 'dropdown' || this.control.subtype == 'multiselect')
|
|
36
88
|
this.loadDataFromService();
|
|
37
|
-
if (
|
|
38
|
-
this.
|
|
89
|
+
if (((_b = this.control) === null || _b === void 0 ? void 0 : _b.subtype) == 'autocomplete')
|
|
90
|
+
this.extracValueFromControlBusqueda();
|
|
39
91
|
if (this.value && this.control.type == 'date')
|
|
40
|
-
this.
|
|
92
|
+
this.instanceDate();
|
|
93
|
+
if (((_c = this.control) === null || _c === void 0 ? void 0 : _c.subtype) == "file") {
|
|
94
|
+
this.loadFiles();
|
|
95
|
+
}
|
|
96
|
+
if (((_d = this.control) === null || _d === void 0 ? void 0 : _d.type) == 'string')
|
|
97
|
+
this.lenghtWord = this.value ? this.value.length : 0;
|
|
98
|
+
if (((_e = this.control) === null || _e === void 0 ? void 0 : _e.subtype) == 'switch')
|
|
99
|
+
this.instanceBoolField();
|
|
100
|
+
}
|
|
101
|
+
instanceBoolField() {
|
|
102
|
+
this.tempValue = this.value;
|
|
103
|
+
if (this.value == true && this.control.trueValue !== undefined) {
|
|
104
|
+
this.value = this.control.trueValue;
|
|
105
|
+
this.sendValue();
|
|
106
|
+
}
|
|
107
|
+
else if (this.value == false && this.control.falseValue !== undefined) {
|
|
108
|
+
this.value = this.control.falseValue;
|
|
109
|
+
this.sendValue();
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
onChangeSwitch() {
|
|
113
|
+
this.value = this.tempValue;
|
|
114
|
+
this.sendValue();
|
|
115
|
+
}
|
|
116
|
+
loadFiles() {
|
|
117
|
+
this.isLoading = true;
|
|
118
|
+
this.uploadedFiles = [];
|
|
119
|
+
if (!this.value) {
|
|
120
|
+
this.isLoading = false;
|
|
121
|
+
this.cdr.detectChanges();
|
|
122
|
+
}
|
|
123
|
+
else if (this.control.config.namePattern && this.control.type == "string") {
|
|
124
|
+
let urls = this.control.config.separator ? this.value.split(",") : [this.value];
|
|
125
|
+
urls.forEach(url => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
|
|
126
|
+
this.isLoading = false;
|
|
127
|
+
this.cdr.detectChanges();
|
|
128
|
+
}
|
|
129
|
+
else if (this.control.config.namePattern && this.control.type == "array") {
|
|
130
|
+
this.value.forEach((url) => this.uploadedFiles.push({ url: url, name: this.getNameFile(this.control.config.namePattern, url) }));
|
|
131
|
+
this.isLoading = false;
|
|
132
|
+
this.cdr.detectChanges();
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
onDeleteFile(index) {
|
|
136
|
+
var _a, _b;
|
|
137
|
+
if ((!((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.limit) || ((_b = this.control.config) === null || _b === void 0 ? void 0 : _b.limit) == 1) && this.control.type == "string")
|
|
138
|
+
this.value = null;
|
|
139
|
+
else if (this.control.type == "array")
|
|
140
|
+
this.value.splice(index, 1);
|
|
141
|
+
}
|
|
142
|
+
getNameFile(namePattern, url) {
|
|
143
|
+
const regexObj = new RegExp(namePattern);
|
|
144
|
+
const match = regexObj.exec(url);
|
|
145
|
+
if (!match)
|
|
146
|
+
throw new Error("El pattern no coincide con la url. " + url);
|
|
147
|
+
return match[0];
|
|
41
148
|
}
|
|
42
149
|
sendValue() {
|
|
150
|
+
var _a;
|
|
151
|
+
if (this.control.type == "string" && this.value == "" && ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.allowEmpty) == false)
|
|
152
|
+
this.value = null;
|
|
43
153
|
this.setValue.emit(this.value);
|
|
44
154
|
}
|
|
155
|
+
sendNumberValue($event) {
|
|
156
|
+
this.value = $event.value;
|
|
157
|
+
this.sendValue();
|
|
158
|
+
}
|
|
159
|
+
onInputEmail(force) {
|
|
160
|
+
const aux = Math.abs(this.lenghtWord - this.value.length);
|
|
161
|
+
this.lenghtWord = this.value.length;
|
|
162
|
+
if (aux > 1 || force) {
|
|
163
|
+
const regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
|
|
164
|
+
if (regex.test(this.value))
|
|
165
|
+
this.sendValue();
|
|
166
|
+
else {
|
|
167
|
+
this.value = null;
|
|
168
|
+
this.sendValue();
|
|
169
|
+
this.notificationService.addNotification({ severity: 'warn', detail: 'El correo no es válido' }, this.primeChecking());
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
45
173
|
sendValueFromObject(event) {
|
|
46
174
|
switch (typeof (this.control.config.optionValue)) {
|
|
47
175
|
case 'object':
|
|
@@ -53,59 +181,86 @@ export class ControlComponent {
|
|
|
53
181
|
break;
|
|
54
182
|
}
|
|
55
183
|
}
|
|
56
|
-
validateValue(type) {
|
|
57
|
-
switch (type) {
|
|
58
|
-
case 'email':
|
|
59
|
-
let regex = new RegExp(/([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}/igm);
|
|
60
|
-
if (regex.test(this.value))
|
|
61
|
-
this.sendValue();
|
|
62
|
-
else {
|
|
63
|
-
this.value = null;
|
|
64
|
-
this.sendValue();
|
|
65
|
-
this.sendNotification.emit({ severity: 'warn', detail: 'El correo no es válido' });
|
|
66
|
-
}
|
|
67
|
-
break;
|
|
68
|
-
default:
|
|
69
|
-
break;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
184
|
loadDataFromService() {
|
|
73
185
|
this.isLoading = true;
|
|
74
186
|
this.dataFromService = [];
|
|
75
|
-
|
|
187
|
+
const op = this.control.config;
|
|
188
|
+
const url = this.crudService.getURL(op, undefined, undefined);
|
|
189
|
+
this.generalService.genericRequest(this.control.config.method, url)
|
|
76
190
|
.then((res) => {
|
|
77
191
|
this.dataFromService = res.data;
|
|
192
|
+
}).finally(() => {
|
|
78
193
|
this.isLoading = false;
|
|
194
|
+
this.cdr.detectChanges();
|
|
79
195
|
});
|
|
80
196
|
}
|
|
81
197
|
loadDataFromControlBusquedaService(event) {
|
|
82
198
|
this.isLoading = true;
|
|
83
|
-
|
|
199
|
+
const op = this.control.config;
|
|
200
|
+
let url = this.crudService.getURL(op);
|
|
201
|
+
url = url.replace('@query', (event === null || event === void 0 ? void 0 : event.query) || '');
|
|
202
|
+
this.generalService.genericRequest(this.control.config.method, url)
|
|
84
203
|
.then((res) => {
|
|
204
|
+
var _a;
|
|
85
205
|
this.dataFromService = res.data;
|
|
206
|
+
if (((_a = this.dataFromService) === null || _a === void 0 ? void 0 : _a.length) == 0 && this.control.allowCustomOption) {
|
|
207
|
+
//agregar un campo que el usuario haya digitado
|
|
208
|
+
let newItem = {};
|
|
209
|
+
newItem[this.control.field] = this.tempValue;
|
|
210
|
+
newItem[this.control.config.optionValue] = this.tempValue;
|
|
211
|
+
this.dataFromService.push(newItem);
|
|
212
|
+
}
|
|
213
|
+
}).finally(() => {
|
|
86
214
|
this.isLoading = false;
|
|
215
|
+
this.cdr.detectChanges();
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
extracValueFromControlBusqueda() {
|
|
219
|
+
const op = this.control.config;
|
|
220
|
+
let url = this.crudService.getURL(op);
|
|
221
|
+
url = url.replace('@query', this.value);
|
|
222
|
+
this.generalService.genericRequest(this.control.config.method, url)
|
|
223
|
+
.then((res) => {
|
|
224
|
+
var _a;
|
|
225
|
+
if (((_a = res.data) === null || _a === void 0 ? void 0 : _a.length) == 1 && res.data[0][this.control.field]) {
|
|
226
|
+
this.tempValue = res.data[0];
|
|
227
|
+
this.value = res.data[0][this.control.field];
|
|
228
|
+
}
|
|
229
|
+
else
|
|
230
|
+
this.setDefaultValue();
|
|
231
|
+
}).finally(() => {
|
|
232
|
+
this.cdr.detectChanges();
|
|
233
|
+
}).catch(() => {
|
|
234
|
+
this.setDefaultValue();
|
|
87
235
|
});
|
|
88
236
|
}
|
|
89
237
|
onUpload(event) {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
formData.append('uploadFile', file);
|
|
238
|
+
this.uploadingFiles = true;
|
|
239
|
+
const formData = new FormData();
|
|
240
|
+
const path = this.control.config.path || 'Imagenes/CRUD/temp';
|
|
94
241
|
formData.append('Ruta', `/${path}`);
|
|
95
|
-
|
|
96
|
-
|
|
242
|
+
for (let i = 0; i < event.length; i++)
|
|
243
|
+
formData.append(`uploadFile_${i}`, event[i]);
|
|
244
|
+
const op = this.control.config;
|
|
245
|
+
const url = this.crudService.getURL(op);
|
|
246
|
+
this.generalService.genericRequest(this.control.config.method, url, formData)
|
|
97
247
|
.then(() => {
|
|
98
|
-
|
|
99
|
-
this.
|
|
100
|
-
|
|
101
|
-
this.
|
|
248
|
+
var _a;
|
|
249
|
+
let separator = ((_a = this.control.config) === null || _a === void 0 ? void 0 : _a.separator) || ",";
|
|
250
|
+
//se asume que viene namePattern
|
|
251
|
+
if (this.control.type == "string")
|
|
252
|
+
this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`).join(separator);
|
|
253
|
+
else if (this.control.type == "array")
|
|
254
|
+
this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`);
|
|
255
|
+
// SI NO TRAE namePattern, debe retornar un objeto con el nombre y href
|
|
256
|
+
//else if (this.control.config.namePattern && this.control.type == "array") this.value = event.map(x => x.name)
|
|
257
|
+
//else if (!this.control.config.namePattern && this.control.type == "array") this.value = event.map(f => `${this.generalService.jsonConfig.Server}${path}/${f.name}`)
|
|
102
258
|
this.sendValue();
|
|
259
|
+
let msg = !this.control.config.limit || this.control.config.limit == 1 ? "Archivo cargado correctamente!" : "Archivos cargados correctamente!";
|
|
260
|
+
this.notificationService.addNotification({ severity: 'info', detail: msg }, this.primeChecking());
|
|
103
261
|
})
|
|
104
|
-
.catch(
|
|
105
|
-
|
|
106
|
-
this.isLoading = false;
|
|
107
|
-
this.sendNotification.emit({ severity: 'error', detail: `Error al cargar el archivo!` });
|
|
108
|
-
});
|
|
262
|
+
.catch(() => this.notificationService.addNotification({ severity: 'error', detail: `Error al cargar el archivo!` }, this.primeChecking()))
|
|
263
|
+
.finally(() => this.uploadingFiles = false);
|
|
109
264
|
}
|
|
110
265
|
refresData() {
|
|
111
266
|
var _a, _b;
|
|
@@ -113,44 +268,100 @@ export class ControlComponent {
|
|
|
113
268
|
this.loadDataFromService();
|
|
114
269
|
}
|
|
115
270
|
setDefaultValue() {
|
|
116
|
-
|
|
117
|
-
|
|
271
|
+
this.tempValue = {};
|
|
272
|
+
if (!this.control.config.optionLabel)
|
|
273
|
+
console.error("No esta bien configurado el control ", this.control);
|
|
274
|
+
else
|
|
275
|
+
this.tempValue[this.control.config.optionLabel] = this.value ? this.value : "";
|
|
118
276
|
}
|
|
119
277
|
searchValue(value) {
|
|
120
|
-
|
|
121
|
-
this.
|
|
278
|
+
const op = this.control.config;
|
|
279
|
+
let url = this.crudService.getURL(op, undefined, undefined);
|
|
280
|
+
url = url.replace('@id', value);
|
|
281
|
+
this.generalService.genericRequest(this.control.config.method, url)
|
|
122
282
|
.then((res) => {
|
|
123
283
|
var _a;
|
|
124
284
|
if (((_a = res === null || res === void 0 ? void 0 : res.data) === null || _a === void 0 ? void 0 : _a.length) > 0) {
|
|
125
285
|
this.sendObject.emit({ data: res.data[0], optionValue: this.control.config.optionValue });
|
|
126
286
|
}
|
|
127
287
|
else {
|
|
128
|
-
this.
|
|
288
|
+
this.notificationService.addNotification({ severity: 'warn', detail: `Valor no encontrado.` }, this.primeChecking());
|
|
129
289
|
this.sendObject.emit({ data: null, optionValue: this.control.config.optionValue });
|
|
130
290
|
}
|
|
131
291
|
})
|
|
132
292
|
.catch(err => {
|
|
133
|
-
|
|
134
|
-
this.sendNotification.emit({ severity: 'error', detail: `Error al consumir el servicio.` });
|
|
293
|
+
this.notificationService.addNotification({ severity: 'error', detail: `Error al consumir el servicio.` }, this.primeChecking());
|
|
135
294
|
});
|
|
136
295
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
296
|
+
primeChecking() {
|
|
297
|
+
return new RequestChecking(undefined, undefined, false, undefined, undefined, false, undefined);
|
|
298
|
+
}
|
|
299
|
+
instanceDate() {
|
|
300
|
+
const format = this.control.formatMoment;
|
|
301
|
+
if (this.value) {
|
|
302
|
+
if (typeof (this.value) == "string" && this.value.includes("T"))
|
|
303
|
+
this.value = new Date(this.value);
|
|
304
|
+
else if (typeof (this.value) == "string")
|
|
305
|
+
this.value = moment(this.value, format).toDate();
|
|
306
|
+
this.tempValue = moment(this.value).format("DD/MM/YYYY");
|
|
307
|
+
}
|
|
308
|
+
else {
|
|
309
|
+
this.tempValue = null;
|
|
310
|
+
this.value = null;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Cast tempValue to date
|
|
315
|
+
*/
|
|
316
|
+
onChangeSDate() {
|
|
317
|
+
const aux = moment(this.tempValue, "DD/MM/YYYY");
|
|
318
|
+
if (aux.isValid()) {
|
|
319
|
+
this.value = aux.toDate();
|
|
141
320
|
this.sendValue();
|
|
142
321
|
}
|
|
322
|
+
else {
|
|
323
|
+
this.tempValue = null;
|
|
324
|
+
this.notificationService.addNotification({ severity: 'warn', detail: 'La fecha no es válida' }, this.primeChecking());
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
onChangeDate() {
|
|
328
|
+
this.tempValue = moment(this.value).format("DD/MM/YYYY");
|
|
329
|
+
this.sendValue();
|
|
330
|
+
}
|
|
331
|
+
onTouchDescription() {
|
|
332
|
+
var _a;
|
|
333
|
+
try {
|
|
334
|
+
(_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.activate();
|
|
335
|
+
}
|
|
336
|
+
catch (ex) { }
|
|
337
|
+
}
|
|
338
|
+
onUnTouchDescription() {
|
|
339
|
+
var _a;
|
|
340
|
+
try {
|
|
341
|
+
(_a = this.tooltips.get(0)) === null || _a === void 0 ? void 0 : _a.deactivate();
|
|
342
|
+
}
|
|
343
|
+
catch (ex) { }
|
|
344
|
+
}
|
|
345
|
+
doFocusOut() {
|
|
346
|
+
if (document.activeElement) {
|
|
347
|
+
document.activeElement.blur();
|
|
348
|
+
}
|
|
349
|
+
this.cdr.detectChanges();
|
|
143
350
|
}
|
|
144
351
|
}
|
|
145
|
-
ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }], target: i0.ɵɵFactoryTarget.Component });
|
|
146
|
-
ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendNotification: "sendNotification", sendObject: "sendObject" }, ngImport: i0, template: "<ng-container [ngSwitch]=\"control.type\" #cc>\r\n <label [for]=\"label\" style=\"width: -webkit-fill-available;\">{{label}}</label>\r\n <ng-container *ngSwitchCase=\"'string'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [rows]=\"control?.rows ? control.rows : 4\" \r\n [(ngModel)]=\"value\" (focusout)=\"sendValue()\" pInputTextarea \r\n [disabled]=\"control?.disabled || false\" [autoResize]=\"control?.autoresize || false\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n (focusout)=\"validateValue('email')\" [disabled]=\"control?.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n (focusout)=\"sendValue()\" [disabled]=\"control?.disabled || false\" [unmask]=\"control.unmask || false\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\"\r\n [optionValue]=\"control?.field || control.config.optionValue\" (onClick)=\"refresData()\"\r\n appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown:replace'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\"\r\n (onChange)=\"sendValueFromObject($event)\" [optionLabel]=\"control.config.optionLabel\"\r\n (onClick)=\"refresData()\" appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control?.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" appendTo=\"body\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\" [(ngModel)]=\"tempValue\"\r\n [disabled]=\"control?.disabled || false\"></p-autoComplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'input:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"text\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <p-calendar [(ngModel)]=\"value\" (onSelect)=\"sendValue()\" (onBlur)=\"sendValue()\" [monthNavigator]=\"true\"\r\n [yearNavigator]=\"true\" yearRange=\"1900:2035\" [dateFormat]=\"control?.format || 'yy-mm-dd'\"\r\n appendTo=\"body\" [disabled]=\"control?.disabled || false\" [showOnFocus]=\"!control?.hide\"\r\n [placeholder]=\"control?.placeholder || 'aaaa-mm-dd'\" [touchUI]=\"control?.touchUI || false\"\r\n [showIcon]=\"control?.showIcon || false\"></p-calendar>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"currency\" [minFractionDigits]=\"control?.minFractionDigits || 0\"\r\n [min]=\"control?.min || null\" [max]=\"control?.max || null\" (focusout)=\"sendValue()\" [locale]=\"control?.locale || undefined\"\r\n [currency]=\"control?.currency || 'USD'\" [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [(ngModel)]=\"value\" mode=\"decimal\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 0\" [locale]=\"control?.locale || undefined\"\r\n [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [(ngModel)]=\"value\" suffix=\" %\" (focusout)=\"sendValue()\" [min]=\"control?.min || null\"\r\n [max]=\"control?.max || null\" [minFractionDigits]=\"control?.minFractionDigits || 2\" [locale]=\"control?.locale || undefined\"\r\n [disabled]=\"control?.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"number\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'filetmp'\">\r\n <p-fileUpload [accept]=\"control.config.accept\" [customUpload]=\"true\" (uploadHandler)=\"onUpload($event)\"\r\n [maxFileSize]=\"control.config?.maxFileSize || null\" fileLimit=\"1\">\r\n <ng-template pTemplate=\"content\">\r\n <ul *ngIf=\"uploadedFiles.length\">\r\n <li *ngFor=\"let file of uploadedFiles\">{{file.name}} - {{file.size}} bytes</li>\r\n </ul>\r\n </ng-template>\r\n </p-fileUpload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"value\" (onChange)=\"sendValue()\" [id]=\"label\"></p-inputSwitch>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-container>", components: [{ type: i2.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i3.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i4.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i5.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i6.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i7.FileUpload, selector: "p-fileUpload", inputs: ["name", "url", "method", "multiple", "accept", "disabled", "auto", "withCredentials", "maxFileSize", "invalidFileSizeMessageSummary", "invalidFileSizeMessageDetail", "invalidFileTypeMessageSummary", "invalidFileTypeMessageDetail", "invalidFileLimitMessageDetail", "invalidFileLimitMessageSummary", "style", "styleClass", "previewWidth", "chooseLabel", "uploadLabel", "cancelLabel", "chooseIcon", "uploadIcon", "cancelIcon", "showUploadButton", "showCancelButton", "mode", "headers", "customUpload", "fileLimit", "files"], outputs: ["onBeforeUpload", "onSend", "onUpload", "onError", "onClear", "onRemove", "onSelect", "onProgress", "uploadHandler"] }, { type: i8.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "ariaLabelledBy"], outputs: ["onChange"] }], directives: [{ type: i9.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i9.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i11.InputText, selector: "[pInputText]" }, { type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i12.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { type: i13.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i10.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i14.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }] });
|
|
352
|
+
ControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, deps: [{ token: i1.GeneralService }, { token: i2.SfCrudService }, { token: i0.ChangeDetectorRef }, { token: i3.NotificationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
353
|
+
ControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.2.17", type: ControlComponent, selector: "sf-control", inputs: { showTempValue: "showTempValue", control: "control", label: "label", value: "value", appendTo: "appendTo" }, outputs: { setValue: "setValue", sendObject: "sendObject" }, viewQueries: [{ propertyName: "tooltips", predicate: Tooltip, descendants: true }], usesOnChanges: true, ngImport: i0, template: "<p *ngIf=\"showTempValue && tempValue\">{{tempValue[control.field]}}</p>\r\n\r\n<div *ngIf=\"!showTempValue\" [ngSwitch]=\"control.type\" #cc class=\"control-container\">\r\n <div class=\"label-container\">\r\n <label [for]=\"label\">{{label}}</label>\r\n <i #tooltip *ngIf=\"control.tooltip\" class=\"pi pi-question-circle\"\r\n [tooltipPosition]=\"control.tooltipPosition || 'top'\" [pTooltip]=\"control.tooltip\"\r\n (touchstart)=\"onTouchDescription()\" (touchend)=\"onUnTouchDescription()\"></i>\r\n </div>\r\n\r\n <ng-container *ngSwitchCase=\"'string'\" >\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'input'\">\r\n <input pInputText [name]=\"label\" type=\"text\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\" [autocomplete]=\"control.autocomplete || 'off'\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'textarea'\">\r\n <textarea [rows]=\"control.config?.rows ? control.config.rows : 4\" [(ngModel)]=\"value\"\r\n (input)=\"sendValue()\" pInputTextarea [disabled]=\"control.config?.disabled || false\"\r\n [autoResize]=\"control.config?.autoresize || false\"></textarea>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'password'\">\r\n <input pInputText type=\"password\" [(ngModel)]=\"value\" (input)=\"sendValue()\"\r\n [disabled]=\"control.disabled || false\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'email'\">\r\n <input pInputText type=\"text\" [(ngModel)]=\"value\" placeholder=\"email@example.com\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"email\" (input)=\"onInputEmail(false)\"\r\n (focusout)=\"onInputEmail(true)\" (keyup.enter)=\"doFocusOut()\">\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'phone'\">\r\n <p-inputMask mask=\"(999) 999-9999\" [(ngModel)]=\"value\" placeholder=\"(999) 999-9999\"\r\n [disabled]=\"control.disabled || false\" autocomplete=\"tel-national\"\r\n [unmask]=\"control.unmask || false\" (onComplete)=\"sendValue()\"></p-inputMask>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'enum'\">\r\n <p-dropdown [options]=\"control.enum\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config.optionLabel\"\r\n [optionValue]=\"control.field || control.config.optionValue\" appendTo=\"body\"\r\n placeholder=\"Seleccione una opci\u00F3n\" [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'dropdown:replace'\">\r\n <p-dropdown [lazy]=\"isLoading\" [options]=\"dataFromService\"\r\n (onChange)=\"sendValueFromObject($event)\" [optionLabel]=\"control.config.optionLabel\"\r\n appendTo=\"body\" placeholder=\"Seleccione una opci\u00F3n\"\r\n [disabled]=\"control.disabled || false\"></p-dropdown>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'autocomplete'\">\r\n <p-autoComplete [showEmptyMessage]=\"true\" [suggestions]=\"dataFromService\" appendTo=\"body\"\r\n (completeMethod)=\"loadDataFromControlBusquedaService($event)\" [field]=\"control.field\"\r\n [minLength]=\"1\" (onSelect)=\"sendValueFromObject($event)\" [(ngModel)]=\"tempValue\"\r\n [disabled]=\"control.disabled || false\"></p-autoComplete>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'input:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"text\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [accept]=\"control.config?.accept || 'image/*,application/pdf'\"\r\n [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\" [configName]=\"control.config?.configName\"\r\n [limit]=\"control.config?.limit || 1\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'date'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'calendar'\">\r\n <div class=\"p-col-12\">\r\n <div class=\"p-inputgroup\">\r\n <p-inputMask [(ngModel)]=\"tempValue\" mask=\"99/99/9999\" [placeholder]=\"control.placeholder\"\r\n (onComplete)=\"onChangeSDate()\" [disabled]=\"control.disabled || false\"></p-inputMask>\r\n <p-calendar [(ngModel)]=\"value\" class=\"only-icon\" [monthNavigator]=\"true\" [yearNavigator]=\"true\" yearRange=\"1900:2035\"\r\n [dateFormat]=\"control.format || 'yy-mm-dd'\" appendTo=\"body\" [disabled]=\"control.disabled || false\"\r\n [showOnFocus]=\"!control.hide\" [placeholder]=\"control.placeholder || 'aaaa-mm-dd'\"\r\n [touchUI]=\"control.touchUI || false\" [showIcon]=\"control.showIcon || false\" (onSelect)=\"onChangeDate()\"\r\n (onBlur)=\"onChangeDate()\"></p-calendar>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'numeric'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'currency'\">\r\n <p-inputNumber [ngModel]=\"value\" (ngModelChange)=\"value = $event; sendValue()\" mode=\"decimal\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [min]=\"control.min || null\" [max]=\"control.max || null\" (onInput)=\"sendNumberValue($event)\"\r\n [prefix]=\"control.currency || '$ '\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal'\">\r\n <p-inputNumber [ngModel]=\"value\" mode=\"decimal\" (ngModelChange)=\"value = $event; sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 0\"\r\n [locale]=\"control.locale || undefined\" [useGrouping]=\"control.useGrouping || false\"\r\n [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'percentage'\">\r\n <p-inputNumber [ngModel]=\"value\" suffix=\" %\" (ngModelChange)=\"value = $event; sendValue()\" (onInput)=\"sendValue()\" [min]=\"control.min || null\"\r\n [max]=\"control.max || null\" [minFractionDigits]=\"control.minFractionDigits || 2\"\r\n [locale]=\"control.locale || undefined\" [disabled]=\"control.disabled || false\"></p-inputNumber>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'decimal:search'\">\r\n <div class=\"p-inputgroup\">\r\n <input type=\"number\" pInputText [(ngModel)]=\"value\" (focusout)=\"sendValue()\"\r\n (keyup.enter)=\"doFocusOut()\" />\r\n <button type=\"button\" pButton icon=\"pi pi-search\" (click)=\"searchValue(value)\"></button>\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'array'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'file'\">\r\n <sf-file-upload *ngIf=\"!isLoading\" [loading]=\"uploadingFiles\" [files]=\"uploadedFiles\"\r\n [configName]=\"control.config?.configName\" [limit]=\"control.config?.limit || 1\"\r\n [accept]=\"control.config?.accept || 'image/*,application/pdf'\" (onUpload)=\"onUpload($event)\"\r\n (onDeleteFile)=\"onDeleteFile($event)\"></sf-file-upload>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'multiselect'\">\r\n <p-multiSelect [options]=\"dataFromService\" [(ngModel)]=\"value\" (onChange)=\"sendValue()\"\r\n [optionLabel]=\"control.config?.optionLabel\" [optionValue]=\"control.config?.optionValue\"\r\n [placeholder]=\"control.config?.placeholder\"\r\n [display]=\"control.config?.display || 'chip'\"></p-multiSelect>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngSwitchCase=\"'boolean'\">\r\n <ng-container [ngSwitch]=\"control.subtype\">\r\n <ng-container *ngSwitchCase=\"'switch'\">\r\n <p-inputSwitch [(ngModel)]=\"tempValue\" (onChange)=\"onChangeSwitch()\" [id]=\"label\"\r\n [trueValue]=\"control?.trueValue !== undefined ? control?.trueValue: null\"\r\n [falseValue]=\"control?.falseValue !== undefined ? control?.falseValue: null\"></p-inputSwitch>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n", styles: ["::ng-deep .label-container{& label{margin-right:10px;color:#55585b;font-size:17px}& i{font-size:1.1rem}}::ng-deep .p-tooltip{max-width:15rem;font-size:.85rem;text-align:center}.control-container ::ng-deep .p-button:hover{background:var(--secondary-color)!important;border-color:var(--secondary-color)!important;filter:brightness(85%)}.control-container ::ng-deep .p-component,.control-container ::ng-deep .p-component *{border-radius:6px}.control-container ::ng-deep .p-inputtext{font-size:17px;border:1px solid #d1d5db;border-radius:6px}.control-container ::ng-deep .p-inputtext:focus,.control-container ::ng-deep .p-inputtext:active,.control-container ::ng-deep .p-inputwrapper:focus,.control-container ::ng-deep .p-inputwrapper:active{border-color:var(--button-color)}.control-container ::ng-deep .p-inputtext:enabled:focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep input.p-inputtext::placeholder{color:#6b7280;font-family:sans-serif;font-size:18px}.control-container ::ng-deep .p-dropdown{background:#ffffff;border:1px solid #d1d5db;transition:background-color .2s,color .2s,border-color .2s,box-shadow .2s;border-radius:6px}.control-container ::ng-deep .p-dropdown:not(.p-disabled):hover{border-color:var(--secondary-color)!important}.control-container ::ng-deep .p-dropdown:not(.p-disabled).p-focus{border-color:var(--secondary-color)!important;box-shadow:inset 0 0 0 1px #fff}.control-container ::ng-deep .p-dropdown .p-inputtext{border:none}.control-container ::ng-deep .p-dropdown .p-dropdown-label.p-placeholder{font-family:sans-serif;color:#6b7280}.control-container ::ng-deep .p-button.p-button-danger,.control-container ::ng-deep .p-buttonset.p-button-danger>.p-button,.control-container ::ng-deep .p-splitbutton.p-button-danger>.p-button{border-color:var(--secondary-color)!important;background:var(--secondary-color)!important}.control-container ::ng-deep .p-inputgroup button:last-child{border-top-right-radius:6px;border-bottom-right-radius:6px}.control-container ::ng-deep .p-inputgroup input:last-child{border-top-right-radius:0;border-bottom-right-radius:0}.control-container ::ng-deep .p-inputgroup input:first-child{border-top-left-radius:6px;border-bottom-left-radius:6px}.control-container ::ng-deep .p-datepicker-touch-ui .p-datepicker-title{padding:3px}.control-container ::ng-deep .p-datepicker-month,.control-container ::ng-deep .p-datepicker-month:focus,.control-container ::ng-deep .p-datepicker-year:focus,.control-container ::ng-deep .p-datepicker-year{border:none}.p-inputgroup{& p-calendar{display:contents;& input{display:none}& .p-button-icon-only{border-top-left-radius:0;border-bottom-left-radius:0}}& p-inputMask{display:contents;& ::ng-deep input{border-top-right-radius:0;border-bottom-right-radius:0}}}@media (max-width <=768px){:host{font-size:14px}}\n"], components: [{ type: i4.InputMask, selector: "p-inputMask", inputs: ["type", "slotChar", "autoClear", "style", "inputId", "styleClass", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "disabled", "readonly", "unmask", "name", "required", "characterPattern", "autoFocus", "autocomplete", "mask"], outputs: ["onComplete", "onFocus", "onBlur", "onInput", "onKeydown"] }, { type: i5.Dropdown, selector: "p-dropdown", inputs: ["scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "filterPlaceholder", "filterLocale", "inputId", "selectId", "dataKey", "filterBy", "autofocus", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "virtualScroll", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "disabled", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide"] }, { type: i6.AutoComplete, selector: "p-autoComplete", inputs: ["minLength", "delay", "style", "panelStyle", "styleClass", "panelStyleClass", "inputStyle", "inputId", "inputStyleClass", "placeholder", "readonly", "disabled", "virtualScroll", "itemSize", "maxlength", "name", "required", "size", "appendTo", "autoHighlight", "forceSelection", "type", "autoZIndex", "baseZIndex", "ariaLabel", "ariaLabelledBy", "dropdownIcon", "unique", "group", "completeOnFocus", "field", "scrollHeight", "dropdown", "showEmptyMessage", "dropdownMode", "multiple", "tabindex", "dataKey", "emptyMessage", "showTransitionOptions", "hideTransitionOptions", "autofocus", "autocomplete", "optionGroupChildren", "optionGroupLabel", "suggestions"], outputs: ["completeMethod", "onSelect", "onUnselect", "onFocus", "onBlur", "onDropdownClick", "onClear", "onKeyUp", "onShow", "onHide"] }, { type: i7.FileUploadComponent, selector: "sf-file-upload", inputs: ["limit", "files", "loading", "configName", "accept"], outputs: ["onUpload", "onDeleteFile"] }, { type: i8.Calendar, selector: "p-calendar", inputs: ["style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "numberOfMonths", "view", "touchUI", "timeSeparator", "focusTrap", "firstDayOfWeek", "showTransitionOptions", "hideTransitionOptions", "tabindex", "defaultDate", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "locale"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { type: i9.InputNumber, selector: "p-inputNumber", inputs: ["showButtons", "format", "buttonLayout", "inputId", "styleClass", "style", "placeholder", "size", "maxlength", "tabindex", "title", "ariaLabel", "ariaRequired", "name", "required", "autocomplete", "min", "max", "incrementButtonClass", "decrementButtonClass", "incrementButtonIcon", "decrementButtonIcon", "step", "inputStyle", "inputStyleClass", "locale", "localeMatcher", "mode", "currency", "currencyDisplay", "useGrouping", "minFractionDigits", "maxFractionDigits", "prefix", "suffix", "disabled"], outputs: ["onInput", "onFocus", "onBlur", "onKeyDown"] }, { type: i10.MultiSelect, selector: "p-multiSelect", inputs: ["style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "autoZIndex", "baseZIndex", "filterBy", "virtualScroll", "itemSize", "showTransitionOptions", "hideTransitionOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "scrollHeight", "defaultLabel", "placeholder", "options", "filterValue"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onPanelShow", "onPanelHide"] }, { type: i11.InputSwitch, selector: "p-inputSwitch", inputs: ["style", "styleClass", "tabindex", "inputId", "name", "disabled", "readonly", "ariaLabelledBy"], outputs: ["onChange"] }], directives: [{ type: i12.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i12.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { type: i13.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { type: i12.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { type: i14.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i15.InputText, selector: "[pInputText]" }, { type: i14.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i14.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i16.InputTextarea, selector: "[pInputTextarea]", inputs: ["autoResize"], outputs: ["onResize"] }, { type: i17.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }, { type: i14.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
147
354
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImport: i0, type: ControlComponent, decorators: [{
|
|
148
355
|
type: Component,
|
|
149
356
|
args: [{
|
|
150
357
|
selector: 'sf-control',
|
|
151
|
-
templateUrl: './control.component.html'
|
|
358
|
+
templateUrl: './control.component.html',
|
|
359
|
+
styleUrls: ['./control.component.css'],
|
|
360
|
+
changeDetection: ChangeDetectionStrategy.OnPush
|
|
152
361
|
}]
|
|
153
|
-
}], ctorParameters: function () { return [{ type: i1.GeneralService }]; }, propDecorators: {
|
|
362
|
+
}], ctorParameters: function () { return [{ type: i1.GeneralService }, { type: i2.SfCrudService }, { type: i0.ChangeDetectorRef }, { type: i3.NotificationService }]; }, propDecorators: { showTempValue: [{
|
|
363
|
+
type: Input
|
|
364
|
+
}], control: [{
|
|
154
365
|
type: Input
|
|
155
366
|
}], label: [{
|
|
156
367
|
type: Input
|
|
@@ -160,9 +371,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.2.17", ngImpo
|
|
|
160
371
|
type: Input
|
|
161
372
|
}], setValue: [{
|
|
162
373
|
type: Output
|
|
163
|
-
}], sendNotification: [{
|
|
164
|
-
type: Output
|
|
165
374
|
}], sendObject: [{
|
|
166
375
|
type: Output
|
|
376
|
+
}], tooltips: [{
|
|
377
|
+
type: ViewChildren,
|
|
378
|
+
args: [Tooltip]
|
|
167
379
|
}] } });
|
|
168
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O0FBTWpDLE1BQU0sT0FBTyxnQkFBZ0I7SUFnQjNCLFlBQ1UsY0FBOEI7UUFBOUIsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBZi9CLFlBQU8sR0FBVSxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzdCLFVBQUssR0FBVyxFQUFFLENBQUM7UUFHbEIsYUFBUSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3RELHFCQUFnQixHQUEwQixJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3RFLGVBQVUsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUUzRCxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQzNCLG9CQUFlLEdBQVUsRUFBRSxDQUFDO1FBQzVCLGtCQUFhLEdBQVUsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsY0FBUyxHQUFRLEVBQUUsQ0FBQTtJQUl0QixDQUFDO0lBRUwsUUFBUTs7UUFDTixJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxNQUFNLEtBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxP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QUksQ0FBQyxLQUFLLFlBQVksSUFBSSxDQUFDLEVBQUM7WUFDdkQsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7U0FFakI7SUFDSCxDQUFDOzs4R0FwSVUsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsMk9DVjdCLG8zUEFpSGU7NEZEdkdGLGdCQUFnQjtrQkFKNUIsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUsWUFBWTtvQkFDdEIsV0FBVyxFQUFFLDBCQUEwQjtpQkFDeEM7cUdBR1UsT0FBTztzQkFBZixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBHZW5lcmFsU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9nZW5lcmFsLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xyXG5pbXBvcnQgeyBTaGVtYSB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvc2hlbWEubW9kZWwnO1xyXG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtY29udHJvbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRyb2wuY29tcG9uZW50Lmh0bWwnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgY29udHJvbDogU2hlbWEgPSBuZXcgU2hlbWEoKTtcclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gJyc7XHJcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKSBhcHBlbmRUbzogYW55O1xyXG4gIEBPdXRwdXQoKSBzZXRWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2VuZE5vdGlmaWNhdGlvbjogRXZlbnRFbWl0dGVyPE1lc3NhZ2U+ID0gbmV3IEV2ZW50RW1pdHRlcjxNZXNzYWdlPigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kT2JqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG5cclxuICBwdWJsaWMgaXNMb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIGRhdGFGcm9tU2VydmljZTogYW55W10gPSBbXTtcclxuICBwdWJsaWMgdXBsb2FkZWRGaWxlczogYW55W10gPSBbXTtcclxuICBwdWJsaWMgZGlzcGxheUFkZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0ZW1wVmFsdWU6IGFueSA9IHt9XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2VcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZyAmJiB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdhdXRvY29tcGxldGUnKSB0aGlzLnNldERlZmF1bHRWYWx1ZSgpO1xyXG4gICAgaWYgKHRoaXMudmFsdWUgJiYgdGhpcy5jb250cm9sLnR5cGUgPT0gJ2RhdGUnKSB0aGlzLnNldERhdGUoKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZSgpIHtcclxuICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNlbmRWYWx1ZUZyb21PYmplY3QoZXZlbnQ6IGFueSkge1xyXG4gICAgc3dpdGNoICh0eXBlb2YgKHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpKSB7XHJcbiAgICAgIGNhc2UgJ29iamVjdCc6XHJcbiAgICAgICAgdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZS5mb3JFYWNoKChvcDogYW55KSA9PiBvcFsndmFsdWUnXSA9IGV2ZW50W29wLmtleV0pXHJcbiAgICAgICAgdGhpcy5zZXRWYWx1ZS5lbWl0KHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUuZW1pdChldmVudFt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlXSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZVZhbHVlKHR5cGU6IHN0cmluZykge1xyXG4gICAgc3dpdGNoICh0eXBlKSB7XHJcbiAgICAgIGNhc2UgJ2VtYWlsJzpcclxuICAgICAgICBsZXQgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoLyhbXFx3XFwuXFwtX10rKT9cXHcrQFtcXHctX10rKFxcLlxcdyspezEsfS9pZ20pO1xyXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMudmFsdWUpKSB0aGlzLnNlbmRWYWx1ZSgpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0VsIGNvcnJlbyBubyBlcyB2w6FsaWRvJyB9KVxyXG4gICAgICAgIH1cclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbVNlcnZpY2UoKSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IFtdO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdGhpcy5jb250cm9sLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0YUZyb21TZXJ2aWNlID0gcmVzLmRhdGE7XHJcbiAgICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZTtcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGxvYWREYXRhRnJvbUNvbnRyb2xCdXNxdWVkYVNlcnZpY2UoZXZlbnQ6IGFueSkge1xyXG4gICAgdGhpcy5pc0xvYWRpbmcgPSB0cnVlO1xyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdGhpcy5jb250cm9sLmNvbmZpZy5zZXJ2ZXIsIHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQucmVwbGFjZSgnQHF1ZXJ5JywgZXZlbnQ/LnF1ZXJ5IHx8ICcnKSlcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSByZXMuZGF0YTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25VcGxvYWQoZXZlbnQ6IGFueSkge1xyXG4gICAgbGV0IGZpbGUgPSBldmVudC5maWxlc1swXTtcclxuICAgIGxldCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgbGV0IHBhdGggPSAnSW1hZ2VuZXMvQ1JVRC90ZW1wJztcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgndXBsb2FkRmlsZScsIGZpbGUpO1xyXG4gICAgZm9ybURhdGEuYXBwZW5kKCdSdXRhJywgYC8ke3BhdGh9YCk7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgdGhpcy5jb250cm9sLmNvbmZpZy5lbmRwb2ludCwgZm9ybURhdGEpXHJcbiAgICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnaW5mbycsIGRldGFpbDogYEFyY2hpdm8gY2FyZ2FkbyBjb3JyZWN0YW1lbnRlIWAgfSlcclxuICAgICAgICB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaChmaWxlKTtcclxuICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMudmFsdWUgPSBgJHt0aGlzLmdlbmVyYWxTZXJ2aWNlLmpzb25Db25maWcuU2VydmVyfSR7cGF0aH0vJHtmaWxlLm5hbWV9YFxyXG4gICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgfSlcclxuICAgICAgLmNhdGNoKGVyciA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7IHNldmVyaXR5OiAnZXJyb3InLCBkZXRhaWw6IGBFcnJvciBhbCBjYXJnYXIgZWwgYXJjaGl2byFgIH0pXHJcbiAgICAgIH0pXHJcbiAgfVxyXG5cclxuICByZWZyZXNEYXRhKCkge1xyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uY29uZmlnPy5lbmRwb2ludHRlbXApIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gIH1cclxuXHJcbiAgc2V0RGVmYXVsdFZhbHVlKCl7XHJcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy50ZW1wVmFsdWUsIHRoaXMuY29udHJvbC5jb25maWc/Lm9wdGlvbkxhYmVsLCB7IHZhbHVlOiB0aGlzLnZhbHVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pXHJcbiAgfVxyXG5cclxuICBzZWFyY2hWYWx1ZSh2YWx1ZTogc3RyaW5nKXtcclxuICAgIGxldCBlbmRwb2ludCA9IHRoaXMuY29udHJvbC5jb25maWcuZW5kcG9pbnQucmVwbGFjZSgnQGlkJywgdmFsdWUpXHJcbiAgICB0aGlzLmdlbmVyYWxTZXJ2aWNlLmdlbmVyaWNSZXF1ZXN0KHRoaXMuY29udHJvbC5jb25maWcubWV0aG9kLCB0aGlzLmNvbnRyb2wuY29uZmlnLnNlcnZlciwgZW5kcG9pbnQpXHJcbiAgICAgIC50aGVuKChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXM/LmRhdGE/Lmxlbmd0aCA+IDApe1xyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiByZXMuZGF0YVswXSwgb3B0aW9uVmFsdWU6IHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUgfSApXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICB0aGlzLnNlbmROb3RpZmljYXRpb24uZW1pdCh7c2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOmBWYWxvciBubyBlbmNvbnRyYWRvLmB9KVxyXG4gICAgICAgICAgdGhpcy5zZW5kT2JqZWN0LmVtaXQoeyBkYXRhOiBudWxsLCBvcHRpb25WYWx1ZTogdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZSB9IClcclxuICAgICAgICB9XHJcbiAgICAgIH0pXHJcbiAgICAgIC5jYXRjaChlcnI9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coZXJyKVxyXG4gICAgICAgIHRoaXMuc2VuZE5vdGlmaWNhdGlvbi5lbWl0KHtzZXZlcml0eTogJ2Vycm9yJywgZGV0YWlsOmBFcnJvciBhbCBjb25zdW1pciBlbCBzZXJ2aWNpby5gfSlcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIHNldERhdGUoKXtcclxuICAgIGxldCBmb3JtYXQgPSAodGhpcy5jb250cm9sIGFzIGFueSkuZm9ybWF0TW9tZW50XHJcbiAgICBcclxuICAgIGlmKGZvcm1hdCAmJiB0aGlzLnZhbHVlICYmICEodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGUpKXtcclxuICAgICAgdGhpcy52YWx1ZSA9IG1vbWVudCh0aGlzLnZhbHVlLCBmb3JtYXQpLnRvRGF0ZSgpO1xyXG4gICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcblxyXG4gICAgfSBcclxuICB9XHJcbn1cclxuIiwiPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC50eXBlXCIgI2NjPlxyXG4gICAgPGxhYmVsIFtmb3JdPVwibGFiZWxcIiBzdHlsZT1cIndpZHRoOiAtd2Via2l0LWZpbGwtYXZhaWxhYmxlO1wiPnt7bGFiZWx9fTwvbGFiZWw+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInc3RyaW5nJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInaW5wdXQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3RleHRhcmVhJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHRleHRhcmVhIFtyb3dzXT1cImNvbnRyb2w/LnJvd3MgPyBjb250cm9sLnJvd3MgOiA0XCIgIFxyXG4gICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIHBJbnB1dFRleHRhcmVhIFxyXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCIgW2F1dG9SZXNpemVdPVwiY29udHJvbD8uYXV0b3Jlc2l6ZSB8fCBmYWxzZVwiPjwvdGV4dGFyZWE+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGFzc3dvcmQnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwicGFzc3dvcmRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidlbWFpbCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiZW1haWxAZXhhbXBsZS5jb21cIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJ2YWxpZGF0ZVZhbHVlKCdlbWFpbCcpXCIgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE1hc2sgbWFzaz1cIig5OTkpIDk5OS05OTk5XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiKDk5OSkgOTk5LTk5OTlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiIFt1bm1hc2tdPVwiY29udHJvbC51bm1hc2sgfHwgZmFsc2VcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VudW0nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjb250cm9sLmVudW1cIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIiBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd24nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbbGF6eV09XCJpc0xvYWRpbmdcIiBbb3B0aW9uc109XCJkYXRhRnJvbVNlcnZpY2VcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbb3B0aW9uTGFiZWxdPVwiY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25WYWx1ZV09XCJjb250cm9sPy5maWVsZCB8fCBjb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZVwiIChvbkNsaWNrKT1cInJlZnJlc0RhdGEoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgYXBwZW5kVG89XCJib2R5XCIgcGxhY2Vob2xkZXI9XCJTZWxlY2Npb25lIHVuYSBvcGNpw7NuXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZHJvcGRvd246cmVwbGFjZSdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtsYXp5XT1cImlzTG9hZGluZ1wiIFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZUZyb21PYmplY3QoJGV2ZW50KVwiIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZy5vcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgKG9uQ2xpY2spPVwicmVmcmVzRGF0YSgpXCIgYXBwZW5kVG89XCJib2R5XCIgcGxhY2Vob2xkZXI9XCJTZWxlY2Npb25lIHVuYSBvcGNpw7NuXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXV0b2NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzaG93RW1wdHlNZXNzYWdlXT1cInRydWVcIiBbc3VnZ2VzdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwibG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZSgkZXZlbnQpXCIgW2ZpZWxkXT1cImNvbnRyb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5MZW5ndGhdPVwiMVwiIChvblNlbGVjdCk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWF1dG9Db21wbGV0ZT5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dDpzZWFyY2gnXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoVmFsdWUodmFsdWUpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uU2VsZWN0KT1cInNlbmRWYWx1ZSgpXCIgKG9uQmx1cik9XCJzZW5kVmFsdWUoKVwiIFttb250aE5hdmlnYXRvcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbeWVhck5hdmlnYXRvcl09XCJ0cnVlXCIgeWVhclJhbmdlPVwiMTkwMDoyMDM1XCIgW2RhdGVGb3JtYXRdPVwiY29udHJvbD8uZm9ybWF0IHx8ICd5eS1tbS1kZCdcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiIFtzaG93T25Gb2N1c109XCIhY29udHJvbD8uaGlkZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2w/LnBsYWNlaG9sZGVyIHx8ICdhYWFhLW1tLWRkJ1wiIFt0b3VjaFVJXT1cImNvbnRyb2w/LnRvdWNoVUkgfHwgZmFsc2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SWNvbl09XCJjb250cm9sPy5zaG93SWNvbiB8fCBmYWxzZVwiPjwvcC1jYWxlbmRhcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1lcmljJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgbW9kZT1cImN1cnJlbmN5XCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbnRyb2w/Lm1pbkZyYWN0aW9uRGlnaXRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5dPVwiY29udHJvbD8ubWluIHx8IG51bGxcIiBbbWF4XT1cImNvbnRyb2w/Lm1heCB8fCBudWxsXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCIgW2xvY2FsZV09XCJjb250cm9sPy5sb2NhbGUgfHwgdW5kZWZpbmVkXCJcclxuICAgICAgICAgICAgICAgICAgICBbY3VycmVuY3ldPVwiY29udHJvbD8uY3VycmVuY3kgfHwgJ1VTRCdcIiBbZGlzYWJsZWRdPVwiY29udHJvbD8uZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtaW5wdXROdW1iZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjaW1hbCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0TnVtYmVyIFsobmdNb2RlbCldPVwidmFsdWVcIiBtb2RlPVwiZGVjaW1hbFwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIFttaW5dPVwiY29udHJvbD8ubWluIHx8IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttYXhdPVwiY29udHJvbD8ubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbD8ubWluRnJhY3Rpb25EaWdpdHMgfHwgMFwiIFtsb2NhbGVdPVwiY29udHJvbD8ubG9jYWxlIHx8IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2w/LmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3BlcmNlbnRhZ2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgc3VmZml4PVwiICVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIiBbbWluXT1cImNvbnRyb2w/Lm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2w/Lm1heCB8fCBudWxsXCIgW21pbkZyYWN0aW9uRGlnaXRzXT1cImNvbnRyb2w/Lm1pbkZyYWN0aW9uRGlnaXRzIHx8IDJcIiBbbG9jYWxlXT1cImNvbnRyb2w/LmxvY2FsZSB8fCB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sPy5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkZWNpbWFsOnNlYXJjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cIm51bWJlclwiIHBJbnB1dFRleHQgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIChmb2N1c291dCk9XCJzZW5kVmFsdWUoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZmlsZSdcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2ZpbGV0bXAnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1maWxlVXBsb2FkIFthY2NlcHRdPVwiY29udHJvbC5jb25maWcuYWNjZXB0XCIgW2N1c3RvbVVwbG9hZF09XCJ0cnVlXCIgKHVwbG9hZEhhbmRsZXIpPVwib25VcGxvYWQoJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW21heEZpbGVTaXplXT1cImNvbnRyb2wuY29uZmlnPy5tYXhGaWxlU2l6ZSB8fCBudWxsXCIgZmlsZUxpbWl0PVwiMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDx1bCAqbmdJZj1cInVwbG9hZGVkRmlsZXMubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGZpbGUgb2YgdXBsb2FkZWRGaWxlc1wiPnt7ZmlsZS5uYW1lfX0gLSB7e2ZpbGUuc2l6ZX19IGJ5dGVzPC9saT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bD5cclxuICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICAgICAgPC9wLWZpbGVVcGxvYWQ+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIiBbaWRdPVwibGFiZWxcIj48L3AtaW5wdXRTd2l0Y2g+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbjwvbmctY29udGFpbmVyPiJdfQ==
|
|
380
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zZi1jcnVkL3NyYy9saWIvY29tcG9uZW50cy9jb250cm9sL2NvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2YtY3J1ZC9zcmMvbGliL2NvbXBvbmVudHMvY29udHJvbC9jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsdUJBQXVCLEVBQXFCLFlBQVksRUFBdUMsTUFBTSxlQUFlLENBQUM7QUFFOUssT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ3hELE9BQU8sRUFBNkIsZUFBZSxFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFFbkcsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBR2pDLE9BQU8sS0FBSyxRQUFRLE1BQU0sVUFBVSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBUXJDLE1BQU0sT0FBTyxnQkFBZ0I7SUFxQjNCLFlBQ1UsY0FBOEIsRUFDOUIsV0FBMEIsRUFDMUIsR0FBc0IsRUFDdEIsbUJBQXdDO1FBSHhDLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixnQkFBVyxHQUFYLFdBQVcsQ0FBZTtRQUMxQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0Qix3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBdkJ6QyxrQkFBYSxHQUFXLEtBQUssQ0FBQztRQUM5QixZQUFPLEdBQVUsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUM3QixVQUFLLEdBQVcsRUFBRSxDQUFDO1FBR2xCLGFBQVEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUN0RCxlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFJM0QsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUMzQixvQkFBZSxHQUFVLEVBQUUsQ0FBQztRQUM1QixrQkFBYSxHQUFjLEVBQUUsQ0FBQztRQUM5QixlQUFVLEdBQVksS0FBSyxDQUFDO1FBRzVCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO0lBUTFCLENBQUM7SUFFTCxXQUFXLENBQUMsT0FBc0I7SUFFbEMsQ0FBQztJQUVELFFBQVE7O1FBQ04sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFDeEIsSUFBSSxNQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsTUFBTSwwQ0FBRSxPQUFPLEVBQUM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFOztnQkFDM0MsSUFBSSxHQUFHLEVBQUM7b0JBQ04sSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDbkUsSUFBSSxRQUFRLEdBQUcsTUFBQSxRQUFRLENBQUMsSUFBSSwwQ0FBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLEdBQUcsQ0FBQyxLQUFLOzJCQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFvQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO3dCQUM3RCxDQUFDLEdBQUcsQ0FBQyxLQUFLLEtBQUssQ0FBQyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO29CQUMzRCxJQUFJLFFBQVEsYUFBUixRQUFRLHVCQUFSLFFBQVEsQ0FBRSxlQUFlLEVBQUM7d0JBQzVCLElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxlQUFlLENBQUE7d0JBQ3ZDLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMscUJBQXFCLENBQUMsTUFBQSxRQUFRLENBQUMsVUFBVSxtQ0FBSSxFQUFFLEVBQUUsUUFBUSxDQUFDLFVBQVUsSUFBSSxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFBO3dCQUM5SixRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQTt3QkFDaEcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7d0JBQ3JCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTt3QkFDaEIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLElBQUksYUFBYTs0QkFBRSxJQUFJLENBQUMsbUJBQW1CLEVBQUUsQ0FBQTt3QkFDM0csMEJBQTBCO3FCQUMzQjt5QkFDSSxJQUFJLFFBQVEsRUFBRTt3QkFDakIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7d0JBQ2pCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTt3QkFDaEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7d0JBQ3hCLDBCQUEwQjtxQkFDM0I7aUJBRUY7WUFDSCxDQUFDLENBQUMsQ0FBQTtTQUNIO0lBQ0gsQ0FBQztJQUVPLFdBQVcsQ0FBQyxRQUF3QixFQUFFLFNBQWtCO1FBQzlELE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFBLENBQUMsQ0FBQyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFDdEYsSUFBSSxRQUFRLElBQUksT0FBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsRUFBQztZQUMzQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUM7Z0JBQ3pELE9BQU8sUUFBUSxDQUFDO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxpQkFBaUI7O1FBQ2YsSUFBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsTUFBTSxLQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxhQUFhO1lBQUUsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDcEksSUFBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsT0FBTyxLQUFJLGNBQWM7WUFBRSxJQUFJLENBQUMsOEJBQThCLEVBQUUsQ0FBQztRQUNuRixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksTUFBTTtZQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNuRSxJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxPQUFPLEtBQUksTUFBTSxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztTQUNsQjtRQUNELElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLElBQUksS0FBSSxRQUFRO1lBQUUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBQ3hGLElBQUksQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLE9BQU8sS0FBSSxRQUFRO1lBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7SUFDakUsQ0FBQztJQUNELGlCQUFpQjtRQUNmLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQTtRQUMzQixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUM5RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFBO1lBQ25DLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtTQUNqQjthQUNJLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxLQUFLLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssU0FBUyxFQUFFO1lBQ3JFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUE7WUFDcEMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1NBQ2pCO0lBQ0gsQ0FBQztJQUVELGNBQWM7UUFDWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUE7UUFDM0IsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xCLENBQUM7SUFFRCxTQUFTO1FBQ1AsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDckIsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQTtZQUN0QixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1NBQ3pCO2FBQ0ksSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksUUFBUSxFQUFFO1lBQ3pFLElBQUksSUFBSSxHQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQ3pGLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxFQUFDLEdBQUcsRUFBQyxHQUFHLEVBQUcsSUFBSSxFQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ3JILElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7U0FDekI7YUFDSSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPLEVBQUU7WUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFVLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxFQUFDLEdBQUcsRUFBRyxJQUFJLEVBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUE7WUFDcEksSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtTQUN6QjtJQUNILENBQUM7SUFFRCxZQUFZLENBQUMsS0FBYTs7UUFDeEIsSUFBSSxDQUFDLENBQUMsQ0FBQSxNQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSwwQ0FBRSxLQUFLLENBQUEsSUFBSSxDQUFBLE1BQUEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLDBDQUFFLEtBQUssS0FBSSxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxRQUFRO1lBQUUsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUE7YUFDbkgsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxPQUFPO1lBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFBO0lBQ3BFLENBQUM7SUFFRCxXQUFXLENBQUMsV0FBbUIsRUFBRSxHQUFXO1FBQzFDLE1BQU0sUUFBUSxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3pDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLEtBQUs7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxTQUFTOztRQUNQLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sMENBQUUsVUFBVSxLQUFJLEtBQUs7WUFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQTtRQUNwSCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELGVBQWUsQ0FBQyxNQUFXO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtRQUN6QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUE7SUFDbEIsQ0FBQztJQUVELFlBQVksQ0FBQyxLQUFhO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFBO1FBQ3pELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUE7UUFDbkMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEtBQUssRUFBQztZQUNqQixNQUFNLEtBQUssR0FBVyxJQUFJLE1BQU0sQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzNFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUFFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztpQkFDeEM7Z0JBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtnQkFDaEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHdCQUF3QixFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUM7YUFDeEg7U0FDSjtJQUNILENBQUM7SUFFRCxtQkFBbUIsQ0FBQyxLQUFVO1FBQzVCLFFBQVEsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1lBQ2hELEtBQUssUUFBUTtnQkFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFBO2dCQUNqRixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDcEQsTUFBTTtZQUNSO2dCQUNFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUMzRCxNQUFNO1NBQ1Q7SUFDSCxDQUFDO0lBRUQsbUJBQW1CO1FBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLE1BQU0sRUFBRSxHQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBQ3pDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDN0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQzthQUNoRSxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNqQixJQUFJLENBQUMsZUFBZSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDbEMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFBO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7UUFDNUIsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO0lBRUQsa0NBQWtDLENBQUMsS0FBVTtRQUMzQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixNQUFNLEVBQUUsR0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUN6QyxJQUFJLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNyQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQSxLQUFLLGFBQUwsS0FBSyx1QkFBTCxLQUFLLENBQUUsS0FBSyxLQUFJLEVBQUUsQ0FBQyxDQUFBO1FBQy9DLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDaEUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7O1lBQ2pCLElBQUksQ0FBQyxlQUFlLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQztZQUNoQyxJQUFJLENBQUEsTUFBQSxJQUFJLENBQUMsZUFBZSwwQ0FBRSxNQUFNLEtBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3ZFLCtDQUErQztnQkFDL0MsSUFBSSxPQUFPLEdBQVEsRUFBRSxDQUFBO2dCQUNyQixPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFBO2dCQUM1QyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtnQkFDekQsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUE7YUFDbkM7UUFDSCxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1lBQ1osSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUE7WUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUM1QixDQUFDLENBQUMsQ0FBQTtJQUNOLENBQUM7SUFFRCw4QkFBOEI7UUFDNUIsTUFBTSxFQUFFLEdBQWMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUE7UUFDekMsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDckMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2FBQ2hFLElBQUksQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFOztZQUNqQixJQUFJLENBQUEsTUFBQSxHQUFHLENBQUMsSUFBSSwwQ0FBRSxNQUFNLEtBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBQztnQkFDM0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFBO2dCQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQTthQUM3Qzs7Z0JBQ0ksSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO1FBQzdCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQzVCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7UUFDeEIsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBR0QsUUFBUSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUE7UUFDMUIsTUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksb0JBQW9CLENBQUM7UUFDOUQsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtZQUFFLFFBQVEsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRixNQUFNLEVBQUUsR0FBYyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQTtRQUN6QyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUN2QyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQzthQUM1RSxJQUFJLENBQUMsR0FBRyxFQUFFOztZQUNULElBQUksU0FBUyxHQUFHLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sMENBQUUsU0FBUyxLQUFJLEdBQUcsQ0FBQTtZQUNyRCxnQ0FBZ0M7WUFDaEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksSUFBSSxRQUFRO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7aUJBQ3RJLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLElBQUksT0FBTztnQkFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7WUFDL0gsdUVBQXVFO1lBQ3ZFLCtHQUErRztZQUMvRyxxS0FBcUs7WUFDckssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO1lBQ2hCLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLGdDQUFnQyxDQUFBLENBQUMsQ0FBQyxrQ0FBa0MsQ0FBQTtZQUM3SSxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7UUFDbkcsQ0FBQyxDQUFDO2FBQ0QsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSw2QkFBNkIsRUFBRSxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO2FBQ3pJLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQyxDQUFBO0lBRTdDLENBQUM7SUFFRCxVQUFVOztRQUNSLElBQUksTUFBQSxNQUFBLElBQUksQ0FBQyxPQUFPLDBDQUFFLE1BQU0sMENBQUUsWUFBWTtZQUFFLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3JFLENBQUM7SUFDRCxlQUFlO1FBQ2IsSUFBSSxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUE7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVc7WUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLHNDQUFzQyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQTs7WUFDcEcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFBLENBQUMsQ0FBQyxFQUFFLENBQUE7SUFFcEYsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFhO1FBQ3ZCLE1BQU0sRUFBRSxHQUFjLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFBO1FBQ3pDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUE7UUFDM0QsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFBO1FBRy9CLElBQUksQ0FBQyxjQUFjLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUM7YUFDaEUsSUFBSSxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7O1lBQ2pCLElBQUksQ0FBQSxNQUFBLEdBQUcsYUFBSCxHQUFHLHVCQUFILEdBQUcsQ0FBRSxJQUFJLDBDQUFFLE1BQU0sSUFBRyxDQUFDLEVBQUM7Z0JBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxDQUFFLENBQUE7YUFDM0Y7aUJBQUk7Z0JBQ0gsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFDLHNCQUFzQixFQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7Z0JBQ2pILElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUUsQ0FBQTthQUNwRjtRQUNILENBQUMsQ0FBQzthQUNELEtBQUssQ0FBQyxHQUFHLENBQUEsRUFBRTtZQUNWLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxlQUFlLENBQUMsRUFBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxnQ0FBZ0MsRUFBQyxFQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFBO1FBQzdILENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQztJQUVELGFBQWE7UUFDWCxPQUFPLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFBO0lBQ2pHLENBQUM7SUFFRCxZQUFZO1FBQ1YsTUFBTSxNQUFNLEdBQUksSUFBSSxDQUFDLE9BQWUsQ0FBQyxZQUFZLENBQUE7UUFFakQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFDO1lBQ2IsSUFBSSxPQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLFFBQVEsSUFBSyxJQUFJLENBQUMsS0FBZ0IsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO2dCQUFFLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO2lCQUN4RyxJQUFJLE9BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksUUFBUTtnQkFBRSxJQUFJLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFGLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7U0FDekQ7YUFBSztZQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFBO1lBQ3JCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFBO1NBQ2xCO0lBQ0gsQ0FBQztJQUdEOztPQUVHO0lBQ0gsYUFBYTtRQUNYLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFBO1FBQ2hELElBQUksR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFDO1lBQ2hCLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQTtTQUNqQjthQUNJO1lBQ0gsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDdEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUE7U0FDdEg7SUFDSCxDQUFDO0lBR0QsWUFBWTtRQUNWLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDeEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFBO0lBQ2xCLENBQUM7SUFFQyxrQkFBa0I7O1FBQ2hCLElBQUc7WUFDRCxNQUFBLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxRQUFRLEVBQUUsQ0FBQTtTQUNqQztRQUFBLE9BQU0sRUFBRSxFQUFDLEdBQUU7SUFFaEIsQ0FBQztJQUVELG9CQUFvQjs7UUFDaEIsSUFBRztZQUNELE1BQUEsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLDBDQUFFLFVBQVUsRUFBRSxDQUFBO1NBQ25DO1FBQUEsT0FBTSxFQUFFLEVBQUMsR0FBRTtJQUNsQixDQUFDO0lBRUMsVUFBVTtRQUNSLElBQUksUUFBUSxDQUFDLGFBQWEsRUFBRTtZQUN2QixRQUFRLENBQUMsYUFBNkIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUE7SUFDMUIsQ0FBQzs7OEdBaFZVLGdCQUFnQjtrR0FBaEIsZ0JBQWdCLGtRQVNiLE9BQU8scUVDMUJ2Qixvb1VBOElBOzRGRDdIYSxnQkFBZ0I7a0JBTjVCLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLFlBQVk7b0JBQ3RCLFdBQVcsRUFBRSwwQkFBMEI7b0JBQ3ZDLFNBQVMsRUFBRSxDQUFDLHlCQUF5QixDQUFDO29CQUN0QyxlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTtpQkFDaEQ7bU1BR1UsYUFBYTtzQkFBckIsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDZ0IsUUFBUTtzQkFBOUIsWUFBWTt1QkFBQyxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBWaWV3Q2hpbGRyZW4sIFF1ZXJ5TGlzdCwgT25DaGFuZ2VzLCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEdlbmVyYWxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2dlbmVyYWwuc2VydmljZSc7XHJcbmltcG9ydCB7IFNoZW1hIH0gZnJvbSAnLi4vLi4vc2hhcmVkL21vZGVscy9zaGVtYS5tb2RlbCc7XHJcbmltcG9ydCB7IE9wZXJhdGlvbiwgT3ZlcnJpZGVDb25maWcsIFJlcXVlc3RDaGVja2luZyB9IGZyb20gJy4uLy4uL3NoYXJlZC9tb2RlbHMvY3J1ZC1jb25maWcubW9kZWwnO1xyXG5pbXBvcnQgeyBTZkNydWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2YtY3J1ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVG9vbHRpcCB9IGZyb20gJ3ByaW1lbmcvdG9vbHRpcCc7XHJcbmltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xyXG5pbXBvcnQgeyBBcmNoaXZvIH0gZnJvbSAnLi4vZmlsZS11cGxvYWQvZmlsZS11cGxvYWQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uLy4uL3NoYXJlZC9zZXJ2aWNlcy9ub3RpZmljYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCAqIGFzIGpzb25wYXRoIGZyb20gJ2pzb25wYXRoJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2YtY29udHJvbCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2NvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvbnRyb2wuY29tcG9uZW50LmNzcyddLFxyXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMge1xyXG5cclxuICBASW5wdXQoKSBzaG93VGVtcFZhbHVlOkJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBjb250cm9sOiBTaGVtYSA9IG5ldyBTaGVtYSgpO1xyXG4gIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcclxuICBASW5wdXQoKSB2YWx1ZTogYW55O1xyXG4gIEBJbnB1dCgpIGFwcGVuZFRvOiBhbnk7XHJcbiAgQE91dHB1dCgpIHNldFZhbHVlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzZW5kT2JqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBWaWV3Q2hpbGRyZW4oVG9vbHRpcCkgdG9vbHRpcHMhOiBRdWVyeUxpc3QgPFRvb2x0aXA+O1xyXG5cclxuICBwcml2YXRlIGxlbmdodFdvcmQhOiBudW1iZXI7XHJcbiAgcHVibGljIGlzTG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBkYXRhRnJvbVNlcnZpY2U6IGFueVtdID0gW107XHJcbiAgcHVibGljIHVwbG9hZGVkRmlsZXM6IEFyY2hpdm9bXSA9IFtdO1xyXG4gIHB1YmxpYyBkaXNwbGF5QWRkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHRlbXBWYWx1ZTogYW55O1xyXG5cclxuICBwdWJsaWMgdXBsb2FkaW5nRmlsZXMgPSBmYWxzZTtcclxuXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBnZW5lcmFsU2VydmljZTogR2VuZXJhbFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNydWRTZXJ2aWNlOiBTZkNydWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xyXG5cclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5sb2FkRGVmYXVsdFZhbHVlcygpXHJcbiAgICBpZiAodGhpcy5jb250cm9sPy5jb25maWc/LmRlcGVuZHMpe1xyXG4gICAgICB0aGlzLmNydWRTZXJ2aWNlLmNoYW5nZURhdGEkLnN1YnNjcmliZShyZXMgPT4ge1xyXG4gICAgICAgIGlmIChyZXMpe1xyXG4gICAgICAgICAgbGV0IHJlZ2lzdHJvID0gdGhpcy5jcnVkU2VydmljZS5nZXRSZWdpc3Rybyh0aGlzLmNydWRTZXJ2aWNlLmluZGV4KVxyXG4gICAgICAgICAgbGV0IGtleUZvdW5kID0gcmVnaXN0cm8ua2V5cz8uZmluZChrID0+IGsuc2NvcGUgPT09IHJlcy5zY29wZVxyXG4gICAgICAgICAgJiYgICh0aGlzLmNvbnRyb2wuY29uZmlnLmRlcGVuZHMgYXMgc3RyaW5nW10pLmluY2x1ZGVzKGsua2V5KSAmJlxyXG4gICAgICAgICAgKHJlcy5pbmRleCA9PT0gay5pbmRleERhdGEgfHwgcmVzLmluZGV4ID09PSBrLmluZGV4QW5zd2VyKSlcclxuICAgICAgICAgIGlmIChrZXlGb3VuZD8ub3ZlcnJpZGVDb250cm9sKXtcclxuICAgICAgICAgICAgbGV0IG92ZXJyaWRlID0ga2V5Rm91bmQub3ZlcnJpZGVDb250cm9sXHJcbiAgICAgICAgICAgIGxldCBjb21wbGV0ZWQgPSB0aGlzLmNydWRTZXJ2aWNlLmlzQ29uZGl0aW9uc0NvbXBsZXRlZChvdmVycmlkZS5jb25kaXRpb25zID8/IFtdLCByZWdpc3Ryby5jb25kaXRpb25zIHx8IFtdLCB0aGlzLmNydWRTZXJ2aWNlLmdldERhdGEodGhpcy5jcnVkU2VydmljZS5pbmRleCkpXHJcbiAgICAgICAgICAgIGpzb25wYXRoLnZhbHVlKHRoaXMuY29udHJvbCwgb3ZlcnJpZGUucHJvcGVydHksIGNvbXBsZXRlZCA/IG92ZXJyaWRlLnZhbHVlIDogb3ZlcnJpZGUuZWxzZVZhbHVlKVxyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5nZXROZXdWYWx1ZShvdmVycmlkZSwgY29tcGxldGVkKTtcclxuICAgICAgICAgICAgdGhpcy50ZW1wVmFsdWUgPSBudWxsXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdkcm9wZG93bicgfHwgdGhpcy5jb250cm9sLnN1YnR5cGUgPT0gJ211bHRpc2VsZWN0JykgdGhpcy5sb2FkRGF0YUZyb21TZXJ2aWNlKClcclxuICAgICAgICAgICAgLy90aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2UgaWYgKGtleUZvdW5kKSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsXHJcbiAgICAgICAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgICAgICAgdGhpcy5sb2FkRGVmYXVsdFZhbHVlcygpXHJcbiAgICAgICAgICAgIC8vdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TmV3VmFsdWUob3ZlcnJpZGU6IE92ZXJyaWRlQ29uZmlnLCBjb21wbGV0ZWQ6IGJvb2xlYW4pOiBhbnkge1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSBjb21wbGV0ZWQgPyBvdmVycmlkZS5uZXdQcm9wZXJ0eVZhbHVlOiBvdmVycmlkZS5lbHNlTmV3UHJvcGVydHlWYWx1ZTtcclxuICAgIGlmIChuZXdWYWx1ZSAmJiB0eXBlb2YobmV3VmFsdWUpID09IFwic3RyaW5nXCIpe1xyXG4gICAgICBpZiAoIW5ld1ZhbHVlLnN0YXJ0c1dpdGgoJyQnKSAmJiAhbmV3VmFsdWUuc3RhcnRzV2l0aCgnQCcpKXtcclxuICAgICAgICByZXR1cm4gbmV3VmFsdWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbG9hZERlZmF1bHRWYWx1ZXMoKXtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZyAmJiB0aGlzLmNvbnRyb2wuc3VidHlwZSA9PSAnZHJvcGRvd24nIHx8IHRoaXMuY29udHJvbC5zdWJ0eXBlID09ICdtdWx0aXNlbGVjdCcpIHRoaXMubG9hZERhdGFGcm9tU2VydmljZSgpO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbD8uc3VidHlwZSA9PSAnYXV0b2NvbXBsZXRlJykgdGhpcy5leHRyYWNWYWx1ZUZyb21Db250cm9sQnVzcXVlZGEoKTtcclxuICAgIGlmICh0aGlzLnZhbHVlICYmIHRoaXMuY29udHJvbC50eXBlID09ICdkYXRlJykgdGhpcy5pbnN0YW5jZURhdGUoKTtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnN1YnR5cGUgPT0gXCJmaWxlXCIpIHtcclxuICAgICAgdGhpcy5sb2FkRmlsZXMoKTtcclxuICAgIH1cclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnR5cGUgPT0gJ3N0cmluZycpIHRoaXMubGVuZ2h0V29yZCA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmxlbmd0aCA6IDBcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LnN1YnR5cGUgPT0gJ3N3aXRjaCcpIHRoaXMuaW5zdGFuY2VCb29sRmllbGQoKVxyXG4gIH1cclxuICBpbnN0YW5jZUJvb2xGaWVsZCgpIHtcclxuICAgIHRoaXMudGVtcFZhbHVlID0gdGhpcy52YWx1ZVxyXG4gICAgaWYgKHRoaXMudmFsdWUgPT0gdHJ1ZSAmJiB0aGlzLmNvbnRyb2wudHJ1ZVZhbHVlICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuY29udHJvbC50cnVlVmFsdWVcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy52YWx1ZSA9PSBmYWxzZSAmJiB0aGlzLmNvbnRyb2wuZmFsc2VWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmNvbnRyb2wuZmFsc2VWYWx1ZVxyXG4gICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkNoYW5nZVN3aXRjaCgpe1xyXG4gICAgdGhpcy52YWx1ZSA9IHRoaXMudGVtcFZhbHVlXHJcbiAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgfVxyXG5cclxuICBsb2FkRmlsZXMoKXtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZVxyXG4gICAgdGhpcy51cGxvYWRlZEZpbGVzID0gW11cclxuICAgIGlmICghdGhpcy52YWx1ZSkge1xyXG4gICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGxldCB1cmxzOiBzdHJpbmdbXSA9IHRoaXMuY29udHJvbC5jb25maWcuc2VwYXJhdG9yID8gdGhpcy52YWx1ZS5zcGxpdChcIixcIikgOiBbdGhpcy52YWx1ZV1cclxuICAgICAgdXJscy5mb3JFYWNoKHVybCA9PiB0aGlzLnVwbG9hZGVkRmlsZXMucHVzaCh7dXJsOnVybCwgIG5hbWU6dGhpcy5nZXROYW1lRmlsZSh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuLCB1cmwpfSkpXHJcbiAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wuY29uZmlnLm5hbWVQYXR0ZXJuICYmIHRoaXMuY29udHJvbC50eXBlID09IFwiYXJyYXlcIikge1xyXG4gICAgICB0aGlzLnZhbHVlLmZvckVhY2goKHVybDpzdHJpbmcpID0+IHRoaXMudXBsb2FkZWRGaWxlcy5wdXNoKHt1cmw6dXJsLCAgbmFtZTp0aGlzLmdldE5hbWVGaWxlKHRoaXMuY29udHJvbC5jb25maWcubmFtZVBhdHRlcm4sIHVybCl9KSlcclxuICAgICAgdGhpcy5pc0xvYWRpbmcgPSBmYWxzZVxyXG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uRGVsZXRlRmlsZShpbmRleDogbnVtYmVyKXtcclxuICAgIGlmICgoIXRoaXMuY29udHJvbC5jb25maWc/LmxpbWl0IHx8IHRoaXMuY29udHJvbC5jb25maWc/LmxpbWl0ID09IDEpICYmIHRoaXMuY29udHJvbC50eXBlID09IFwic3RyaW5nXCIpIHRoaXMudmFsdWUgPSBudWxsXHJcbiAgICBlbHNlIGlmICh0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUuc3BsaWNlKGluZGV4LCAxKVxyXG4gIH1cclxuXHJcbiAgZ2V0TmFtZUZpbGUobmFtZVBhdHRlcm46IHN0cmluZywgdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgcmVnZXhPYmogPSBuZXcgUmVnRXhwKG5hbWVQYXR0ZXJuKTtcclxuICAgIGNvbnN0IG1hdGNoID0gcmVnZXhPYmouZXhlYyh1cmwpO1xyXG4gICAgaWYgKCFtYXRjaCkgdGhyb3cgbmV3IEVycm9yKFwiRWwgcGF0dGVybiBubyBjb2luY2lkZSBjb24gbGEgdXJsLiBcIiArIHVybCk7XHJcbiAgICByZXR1cm4gbWF0Y2hbMF07XHJcbiAgfVxyXG5cclxuICBzZW5kVmFsdWUoKSB7XHJcbiAgICBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJzdHJpbmdcIiAmJiB0aGlzLnZhbHVlID09IFwiXCIgJiYgdGhpcy5jb250cm9sLmNvbmZpZz8uYWxsb3dFbXB0eSA9PSBmYWxzZSkgdGhpcy52YWx1ZSA9IG51bGxcclxuICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLnZhbHVlKTtcclxuICB9XHJcblxyXG4gIHNlbmROdW1iZXJWYWx1ZSgkZXZlbnQ6IGFueSl7XHJcbiAgICB0aGlzLnZhbHVlID0gJGV2ZW50LnZhbHVlXHJcbiAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgfVxyXG5cclxuICBvbklucHV0RW1haWwoZm9yY2U6Ym9vbGVhbil7XHJcbiAgICBjb25zdCBhdXggPSBNYXRoLmFicyh0aGlzLmxlbmdodFdvcmQgLSB0aGlzLnZhbHVlLmxlbmd0aClcclxuICAgIHRoaXMubGVuZ2h0V29yZCA9IHRoaXMudmFsdWUubGVuZ3RoXHJcbiAgICBpZiAoYXV4ID4gMSB8fCBmb3JjZSl7XHJcbiAgICAgICAgY29uc3QgcmVnZXg6IFJlZ0V4cCA9IG5ldyBSZWdFeHAoLyhbXFx3XFwuXFwtX10rKT9cXHcrQFtcXHctX10rKFxcLlxcdyspezEsfS9pZ20pO1xyXG4gICAgICAgIGlmIChyZWdleC50ZXN0KHRoaXMudmFsdWUpKSB0aGlzLnNlbmRWYWx1ZSgpO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XHJcbiAgICAgICAgICB0aGlzLnNlbmRWYWx1ZSgpXHJcbiAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHsgc2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOiAnRWwgY29ycmVvIG5vIGVzIHbDoWxpZG8nIH0sIHRoaXMucHJpbWVDaGVja2luZygpKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZW5kVmFsdWVGcm9tT2JqZWN0KGV2ZW50OiBhbnkpIHtcclxuICAgIHN3aXRjaCAodHlwZW9mICh0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlKSkge1xyXG4gICAgICBjYXNlICdvYmplY3QnOlxyXG4gICAgICAgIHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUuZm9yRWFjaCgob3A6IGFueSkgPT4gb3BbJ3ZhbHVlJ10gPSBldmVudFtvcC5rZXldKVxyXG4gICAgICAgIHRoaXMuc2V0VmFsdWUuZW1pdCh0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aGlzLnNldFZhbHVlLmVtaXQoZXZlbnRbdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZV0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tU2VydmljZSgpIHtcclxuICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcclxuICAgIHRoaXMuZGF0YUZyb21TZXJ2aWNlID0gW107XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5jcnVkU2VydmljZS5nZXRVUkwob3AsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICB0aGlzLmRhdGFGcm9tU2VydmljZSA9IHJlcy5kYXRhO1xyXG4gICAgICB9KS5maW5hbGx5KCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2VcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgbG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZShldmVudDogYW55KSB7XHJcbiAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wKVxyXG4gICAgdXJsID0gdXJsLnJlcGxhY2UoJ0BxdWVyeScsIGV2ZW50Py5xdWVyeSB8fCAnJylcclxuICAgIHRoaXMuZ2VuZXJhbFNlcnZpY2UuZ2VuZXJpY1JlcXVlc3QodGhpcy5jb250cm9sLmNvbmZpZy5tZXRob2QsIHVybClcclxuICAgICAgLnRoZW4oKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UgPSByZXMuZGF0YTtcclxuICAgICAgICBpZiAodGhpcy5kYXRhRnJvbVNlcnZpY2U/Lmxlbmd0aCA9PSAwICYmIHRoaXMuY29udHJvbC5hbGxvd0N1c3RvbU9wdGlvbikge1xyXG4gICAgICAgICAgLy9hZ3JlZ2FyIHVuIGNhbXBvIHF1ZSBlbCB1c3VhcmlvIGhheWEgZGlnaXRhZG9cclxuICAgICAgICAgIGxldCBuZXdJdGVtOiBhbnkgPSB7fVxyXG4gICAgICAgICAgbmV3SXRlbVt0aGlzLmNvbnRyb2wuZmllbGRdID0gdGhpcy50ZW1wVmFsdWVcclxuICAgICAgICAgIG5ld0l0ZW1bdGhpcy5jb250cm9sLmNvbmZpZy5vcHRpb25WYWx1ZV0gPSB0aGlzLnRlbXBWYWx1ZVxyXG4gICAgICAgICAgdGhpcy5kYXRhRnJvbVNlcnZpY2UucHVzaChuZXdJdGVtKVxyXG4gICAgICAgIH1cclxuICAgICAgfSkuZmluYWxseSgoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlXHJcbiAgICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKClcclxuICAgICAgfSlcclxuICB9XHJcblxyXG4gIGV4dHJhY1ZhbHVlRnJvbUNvbnRyb2xCdXNxdWVkYSgpe1xyXG4gICAgY29uc3Qgb3A6IE9wZXJhdGlvbiA9IHRoaXMuY29udHJvbC5jb25maWdcclxuICAgIGxldCB1cmwgPSB0aGlzLmNydWRTZXJ2aWNlLmdldFVSTChvcClcclxuICAgIHVybCA9IHVybC5yZXBsYWNlKCdAcXVlcnknLCB0aGlzLnZhbHVlKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzLmRhdGE/Lmxlbmd0aCA9PSAxICYmIHJlcy5kYXRhWzBdW3RoaXMuY29udHJvbC5maWVsZF0pe1xyXG4gICAgICAgICAgdGhpcy50ZW1wVmFsdWUgPSByZXMuZGF0YVswXVxyXG4gICAgICAgICAgdGhpcy52YWx1ZSA9IHJlcy5kYXRhWzBdW3RoaXMuY29udHJvbC5maWVsZF1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB0aGlzLnNldERlZmF1bHRWYWx1ZSgpXHJcbiAgICAgIH0pLmZpbmFsbHkoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKVxyXG4gICAgfSkuY2F0Y2goKCkgPT4ge1xyXG4gICAgICB0aGlzLnNldERlZmF1bHRWYWx1ZSgpXHJcbiAgICB9KVxyXG4gIH1cclxuXHJcblxyXG4gIG9uVXBsb2FkKGV2ZW50OiBGaWxlW10pIHtcclxuICAgIHRoaXMudXBsb2FkaW5nRmlsZXMgPSB0cnVlXHJcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xyXG4gICAgY29uc3QgcGF0aCA9IHRoaXMuY29udHJvbC5jb25maWcucGF0aCB8fCAnSW1hZ2VuZXMvQ1JVRC90ZW1wJztcclxuICAgIGZvcm1EYXRhLmFwcGVuZCgnUnV0YScsIGAvJHtwYXRofWApO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXZlbnQubGVuZ3RoOyBpKyspIGZvcm1EYXRhLmFwcGVuZChgdXBsb2FkRmlsZV8ke2l9YCwgZXZlbnRbaV0pO1xyXG4gICAgY29uc3Qgb3A6IE9wZXJhdGlvbiA9IHRoaXMuY29udHJvbC5jb25maWdcclxuICAgIGNvbnN0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wKVxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsLCBmb3JtRGF0YSlcclxuICAgIC50aGVuKCgpID0+IHtcclxuICAgICAgbGV0IHNlcGFyYXRvciA9IHRoaXMuY29udHJvbC5jb25maWc/LnNlcGFyYXRvciB8fCBcIixcIlxyXG4gICAgICAvL3NlIGFzdW1lIHF1ZSB2aWVuZSBuYW1lUGF0dGVyblxyXG4gICAgICBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJzdHJpbmdcIikgdGhpcy52YWx1ZSA9IGV2ZW50Lm1hcChmID0+IGAke3RoaXMuZ2VuZXJhbFNlcnZpY2UuanNvbkNvbmZpZy5TZXJ2ZXJ9JHtwYXRofS8ke2YubmFtZX1gKS5qb2luKHNlcGFyYXRvcilcclxuICAgICAgZWxzZSBpZiAodGhpcy5jb250cm9sLnR5cGUgPT0gXCJhcnJheVwiKSB0aGlzLnZhbHVlID0gZXZlbnQubWFwKGYgPT4gYCR7dGhpcy5nZW5lcmFsU2VydmljZS5qc29uQ29uZmlnLlNlcnZlcn0ke3BhdGh9LyR7Zi5uYW1lfWApXHJcbiAgICAgIC8vIFNJIE5PIFRSQUUgbmFtZVBhdHRlcm4sIGRlYmUgcmV0b3JuYXIgdW4gb2JqZXRvIGNvbiBlbCBub21icmUgeSBocmVmXHJcbiAgICAgIC8vZWxzZSBpZiAodGhpcy5jb250cm9sLmNvbmZpZy5uYW1lUGF0dGVybiAmJiB0aGlzLmNvbnRyb2wudHlwZSA9PSBcImFycmF5XCIpIHRoaXMudmFsdWUgPSBldmVudC5tYXAoeCA9PiB4Lm5hbWUpXHJcbiAgICAgIC8vZWxzZSBpZiAoIXRoaXMuY29udHJvbC5jb25maWcubmFtZVBhdHRlcm4gJiYgdGhpcy5jb250cm9sLnR5cGUgPT0gXCJhcnJheVwiKSB0aGlzLnZhbHVlID0gZXZlbnQubWFwKGYgPT4gYCR7dGhpcy5nZW5lcmFsU2VydmljZS5qc29uQ29uZmlnLlNlcnZlcn0ke3BhdGh9LyR7Zi5uYW1lfWApXHJcbiAgICAgIHRoaXMuc2VuZFZhbHVlKClcclxuICAgICAgbGV0IG1zZyA9ICF0aGlzLmNvbnRyb2wuY29uZmlnLmxpbWl0IHx8IHRoaXMuY29udHJvbC5jb25maWcubGltaXQgPT0gMSA/IFwiQXJjaGl2byBjYXJnYWRvIGNvcnJlY3RhbWVudGUhXCI6IFwiQXJjaGl2b3MgY2FyZ2Fkb3MgY29ycmVjdGFtZW50ZSFcIlxyXG4gICAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2UuYWRkTm90aWZpY2F0aW9uKHsgc2V2ZXJpdHk6ICdpbmZvJywgZGV0YWlsOiBtc2cgfSwgdGhpcy5wcmltZUNoZWNraW5nKCkpXHJcbiAgICB9KVxyXG4gICAgLmNhdGNoKCgpID0+IHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oeyBzZXZlcml0eTogJ2Vycm9yJywgZGV0YWlsOiBgRXJyb3IgYWwgY2FyZ2FyIGVsIGFyY2hpdm8hYCB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSkpXHJcbiAgICAuZmluYWxseSgoKSA9PiB0aGlzLnVwbG9hZGluZ0ZpbGVzID0gZmFsc2UpXHJcblxyXG4gIH1cclxuXHJcbiAgcmVmcmVzRGF0YSgpIHtcclxuICAgIGlmICh0aGlzLmNvbnRyb2w/LmNvbmZpZz8uZW5kcG9pbnR0ZW1wKSB0aGlzLmxvYWREYXRhRnJvbVNlcnZpY2UoKTtcclxuICB9XHJcbiAgc2V0RGVmYXVsdFZhbHVlKCl7XHJcbiAgICB0aGlzLnRlbXBWYWx1ZSA9IHt9XHJcbiAgICBpZiAoIXRoaXMuY29udHJvbC5jb25maWcub3B0aW9uTGFiZWwpIGNvbnNvbGUuZXJyb3IoXCJObyBlc3RhIGJpZW4gY29uZmlndXJhZG8gZWwgY29udHJvbCBcIiwgdGhpcy5jb250cm9sKVxyXG4gICAgZWxzZSB0aGlzLnRlbXBWYWx1ZVt0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvbkxhYmVsXSA9IHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlOiBcIlwiXHJcblxyXG4gIH1cclxuXHJcbiAgc2VhcmNoVmFsdWUodmFsdWU6IHN0cmluZyl7XHJcbiAgICBjb25zdCBvcDogT3BlcmF0aW9uID0gdGhpcy5jb250cm9sLmNvbmZpZ1xyXG4gICAgbGV0IHVybCA9IHRoaXMuY3J1ZFNlcnZpY2UuZ2V0VVJMKG9wLCB1bmRlZmluZWQsIHVuZGVmaW5lZClcclxuICAgIHVybCA9IHVybC5yZXBsYWNlKCdAaWQnLCB2YWx1ZSlcclxuXHJcblxyXG4gICAgdGhpcy5nZW5lcmFsU2VydmljZS5nZW5lcmljUmVxdWVzdCh0aGlzLmNvbnRyb2wuY29uZmlnLm1ldGhvZCwgdXJsKVxyXG4gICAgICAudGhlbigocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBpZiAocmVzPy5kYXRhPy5sZW5ndGggPiAwKXtcclxuICAgICAgICAgIHRoaXMuc2VuZE9iamVjdC5lbWl0KHsgZGF0YTogcmVzLmRhdGFbMF0sIG9wdGlvblZhbHVlOiB0aGlzLmNvbnRyb2wuY29uZmlnLm9wdGlvblZhbHVlIH0gKVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7c2V2ZXJpdHk6ICd3YXJuJywgZGV0YWlsOmBWYWxvciBubyBlbmNvbnRyYWRvLmB9LCB0aGlzLnByaW1lQ2hlY2tpbmcoKSlcclxuICAgICAgICAgIHRoaXMuc2VuZE9iamVjdC5lbWl0KHsgZGF0YTogbnVsbCwgb3B0aW9uVmFsdWU6IHRoaXMuY29udHJvbC5jb25maWcub3B0aW9uVmFsdWUgfSApXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2goZXJyPT4ge1xyXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5hZGROb3RpZmljYXRpb24oe3NldmVyaXR5OiAnZXJyb3InLCBkZXRhaWw6YEVycm9yIGFsIGNvbnN1bWlyIGVsIHNlcnZpY2lvLmB9LHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgICB9KVxyXG4gIH1cclxuXHJcbiAgcHJpbWVDaGVja2luZygpe1xyXG4gICAgcmV0dXJuIG5ldyBSZXF1ZXN0Q2hlY2tpbmcodW5kZWZpbmVkLCB1bmRlZmluZWQsIGZhbHNlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgZmFsc2UsIHVuZGVmaW5lZClcclxuICB9XHJcblxyXG4gIGluc3RhbmNlRGF0ZSgpe1xyXG4gICAgY29uc3QgZm9ybWF0ID0gKHRoaXMuY29udHJvbCBhcyBhbnkpLmZvcm1hdE1vbWVudFxyXG5cclxuICAgIGlmICh0aGlzLnZhbHVlKXtcclxuICAgICAgaWYgKHR5cGVvZih0aGlzLnZhbHVlKSA9PSBcInN0cmluZ1wiICYmICh0aGlzLnZhbHVlIGFzIHN0cmluZykuaW5jbHVkZXMoXCJUXCIpKSB0aGlzLnZhbHVlID0gbmV3IERhdGUodGhpcy52YWx1ZSlcclxuICAgICAgZWxzZSBpZiAodHlwZW9mKHRoaXMudmFsdWUpID09IFwic3RyaW5nXCIpIHRoaXMudmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSwgZm9ybWF0KS50b0RhdGUoKTtcclxuICAgICAgdGhpcy50ZW1wVmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSkuZm9ybWF0KFwiREQvTU0vWVlZWVwiKVxyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLnRlbXBWYWx1ZSA9IG51bGxcclxuICAgICAgdGhpcy52YWx1ZSA9IG51bGxcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuICAvKipcclxuICAgKiBDYXN0IHRlbXBWYWx1ZSB0byBkYXRlXHJcbiAgICovXHJcbiAgb25DaGFuZ2VTRGF0ZSgpe1xyXG4gICAgY29uc3QgYXV4ID0gbW9tZW50KHRoaXMudGVtcFZhbHVlLCBcIkREL01NL1lZWVlcIilcclxuICAgIGlmIChhdXguaXNWYWxpZCgpKXtcclxuICAgICAgdGhpcy52YWx1ZSA9IGF1eC50b0RhdGUoKTtcclxuICAgICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMudGVtcFZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5ub3RpZmljYXRpb25TZXJ2aWNlLmFkZE5vdGlmaWNhdGlvbih7IHNldmVyaXR5OiAnd2FybicsIGRldGFpbDogJ0xhIGZlY2hhIG5vIGVzIHbDoWxpZGEnIH0sIHRoaXMucHJpbWVDaGVja2luZygpKVxyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIG9uQ2hhbmdlRGF0ZSgpe1xyXG4gICAgdGhpcy50ZW1wVmFsdWUgPSBtb21lbnQodGhpcy52YWx1ZSkuZm9ybWF0KFwiREQvTU0vWVlZWVwiKVxyXG4gICAgdGhpcy5zZW5kVmFsdWUoKVxyXG4gIH1cclxuXHJcbiAgICBvblRvdWNoRGVzY3JpcHRpb24oKSB7XHJcbiAgICAgIHRyeXtcclxuICAgICAgICB0aGlzLnRvb2x0aXBzLmdldCgwKT8uYWN0aXZhdGUoKVxyXG4gICAgICB9Y2F0Y2goZXgpe31cclxuXHJcbiAgfVxyXG5cclxuICBvblVuVG91Y2hEZXNjcmlwdGlvbigpIHtcclxuICAgICAgdHJ5e1xyXG4gICAgICAgIHRoaXMudG9vbHRpcHMuZ2V0KDApPy5kZWFjdGl2YXRlKClcclxuICAgICAgfWNhdGNoKGV4KXt9XHJcbn1cclxuXHJcbiAgZG9Gb2N1c091dCgpe1xyXG4gICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpIHtcclxuICAgICAgICAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuYmx1cigpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxufVxyXG4iLCI8cCAqbmdJZj1cInNob3dUZW1wVmFsdWUgJiYgdGVtcFZhbHVlXCI+e3t0ZW1wVmFsdWVbY29udHJvbC5maWVsZF19fTwvcD5cclxuXHJcbjxkaXYgKm5nSWY9XCIhc2hvd1RlbXBWYWx1ZVwiIFtuZ1N3aXRjaF09XCJjb250cm9sLnR5cGVcIiAjY2MgY2xhc3M9XCJjb250cm9sLWNvbnRhaW5lclwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImxhYmVsLWNvbnRhaW5lclwiPlxyXG4gICAgICAgIDxsYWJlbCBbZm9yXT1cImxhYmVsXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuICAgICAgICA8aSAjdG9vbHRpcCAqbmdJZj1cImNvbnRyb2wudG9vbHRpcFwiIGNsYXNzPVwicGkgcGktcXVlc3Rpb24tY2lyY2xlXCJcclxuICAgICAgICAgICAgW3Rvb2x0aXBQb3NpdGlvbl09XCJjb250cm9sLnRvb2x0aXBQb3NpdGlvbiB8fCAndG9wJ1wiIFtwVG9vbHRpcF09XCJjb250cm9sLnRvb2x0aXBcIlxyXG4gICAgICAgICAgICAodG91Y2hzdGFydCk9XCJvblRvdWNoRGVzY3JpcHRpb24oKVwiICh0b3VjaGVuZCk9XCJvblVuVG91Y2hEZXNjcmlwdGlvbigpXCI+PC9pPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N0cmluZydcIiA+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidpbnB1dCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IFtuYW1lXT1cImxhYmVsXCIgdHlwZT1cInRleHRcIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGlucHV0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiIFthdXRvY29tcGxldGVdPVwiY29udHJvbC5hdXRvY29tcGxldGUgfHwgJ29mZidcIj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIid0ZXh0YXJlYSdcIj5cclxuICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBbcm93c109XCJjb250cm9sLmNvbmZpZz8ucm93cyA/IGNvbnRyb2wuY29uZmlnLnJvd3MgOiA0XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgKGlucHV0KT1cInNlbmRWYWx1ZSgpXCIgcElucHV0VGV4dGFyZWEgW2Rpc2FibGVkXT1cImNvbnRyb2wuY29uZmlnPy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2F1dG9SZXNpemVdPVwiY29udHJvbC5jb25maWc/LmF1dG9yZXNpemUgfHwgZmFsc2VcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwYXNzd29yZCdcIj5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBwSW5wdXRUZXh0IHR5cGU9XCJwYXNzd29yZFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAoaW5wdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZW1haWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8aW5wdXQgcElucHV0VGV4dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiBwbGFjZWhvbGRlcj1cImVtYWlsQGV4YW1wbGUuY29tXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiIGF1dG9jb21wbGV0ZT1cImVtYWlsXCIgKGlucHV0KT1cIm9uSW5wdXRFbWFpbChmYWxzZSlcIlxyXG4gICAgICAgICAgICAgICAgICAgIChmb2N1c291dCk9XCJvbklucHV0RW1haWwodHJ1ZSlcIiAoa2V5dXAuZW50ZXIpPVwiZG9Gb2N1c091dCgpXCI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIncGhvbmUnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE1hc2sgbWFzaz1cIig5OTkpIDk5OS05OTk5XCIgWyhuZ01vZGVsKV09XCJ2YWx1ZVwiIHBsYWNlaG9sZGVyPVwiKDk5OSkgOTk5LTk5OTlcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCIgYXV0b2NvbXBsZXRlPVwidGVsLW5hdGlvbmFsXCJcclxuICAgICAgICAgICAgICAgICAgICBbdW5tYXNrXT1cImNvbnRyb2wudW5tYXNrIHx8IGZhbHNlXCIgKG9uQ29tcGxldGUpPVwic2VuZFZhbHVlKClcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2VudW0nXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbb3B0aW9uc109XCJjb250cm9sLmVudW1cIiBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKG9uQ2hhbmdlKT1cInNlbmRWYWx1ZSgpXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlNlbGVjY2lvbmUgdW5hIG9wY2nDs25cIiBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1kcm9wZG93bj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkcm9wZG93bidcIj5cclxuICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duIFtsYXp5XT1cImlzTG9hZGluZ1wiIFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZy5vcHRpb25MYWJlbFwiXHJcbiAgICAgICAgICAgICAgICAgICAgW29wdGlvblZhbHVlXT1cImNvbnRyb2wuZmllbGQgfHwgY29udHJvbC5jb25maWcub3B0aW9uVmFsdWVcIiBhcHBlbmRUbz1cImJvZHlcIlxyXG4gICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWRyb3Bkb3duPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2Ryb3Bkb3duOnJlcGxhY2UnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1kcm9wZG93biBbbGF6eV09XCJpc0xvYWRpbmdcIiBbb3B0aW9uc109XCJkYXRhRnJvbVNlcnZpY2VcIlxyXG4gICAgICAgICAgICAgICAgICAgIChvbkNoYW5nZSk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbb3B0aW9uTGFiZWxdPVwiY29udHJvbC5jb25maWcub3B0aW9uTGFiZWxcIlxyXG4gICAgICAgICAgICAgICAgICAgIGFwcGVuZFRvPVwiYm9keVwiIHBsYWNlaG9sZGVyPVwiU2VsZWNjaW9uZSB1bmEgb3BjacOzblwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtZHJvcGRvd24+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXV0b2NvbXBsZXRlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtYXV0b0NvbXBsZXRlIFtzaG93RW1wdHlNZXNzYWdlXT1cInRydWVcIiBbc3VnZ2VzdGlvbnNdPVwiZGF0YUZyb21TZXJ2aWNlXCIgYXBwZW5kVG89XCJib2R5XCJcclxuICAgICAgICAgICAgICAgICAgICAoY29tcGxldGVNZXRob2QpPVwibG9hZERhdGFGcm9tQ29udHJvbEJ1c3F1ZWRhU2VydmljZSgkZXZlbnQpXCIgW2ZpZWxkXT1cImNvbnRyb2wuZmllbGRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5MZW5ndGhdPVwiMVwiIChvblNlbGVjdCk9XCJzZW5kVmFsdWVGcm9tT2JqZWN0KCRldmVudClcIiBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtYXV0b0NvbXBsZXRlPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2lucHV0OnNlYXJjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwLWlucHV0Z3JvdXBcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBwSW5wdXRUZXh0IFsobmdNb2RlbCldPVwidmFsdWVcIiAoZm9jdXNvdXQpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoa2V5dXAuZW50ZXIpPVwiZG9Gb2N1c091dCgpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBwQnV0dG9uIGljb249XCJwaSBwaS1zZWFyY2hcIiAoY2xpY2spPVwic2VhcmNoVmFsdWUodmFsdWUpXCI+PC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNmLWZpbGUtdXBsb2FkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIFthY2NlcHRdPVwiY29udHJvbC5jb25maWc/LmFjY2VwdCB8fCAnaW1hZ2UvKixhcHBsaWNhdGlvbi9wZGYnXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9hZGluZ109XCJ1cGxvYWRpbmdGaWxlc1wiIFtmaWxlc109XCJ1cGxvYWRlZEZpbGVzXCIgW2NvbmZpZ05hbWVdPVwiY29udHJvbC5jb25maWc/LmNvbmZpZ05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtsaW1pdF09XCJjb250cm9sLmNvbmZpZz8ubGltaXQgfHwgMVwiIChvblVwbG9hZCk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25EZWxldGVGaWxlKT1cIm9uRGVsZXRlRmlsZSgkZXZlbnQpXCI+PC9zZi1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidkYXRlJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY2FsZW5kYXInXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1jb2wtMTJcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicC1pbnB1dGdyb3VwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxwLWlucHV0TWFzayBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiIG1hc2s9XCI5OS85OS85OTk5XCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uQ29tcGxldGUpPVwib25DaGFuZ2VTRGF0ZSgpXCIgW2Rpc2FibGVkXT1cImNvbnRyb2wuZGlzYWJsZWQgfHwgZmFsc2VcIj48L3AtaW5wdXRNYXNrPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8cC1jYWxlbmRhciBbKG5nTW9kZWwpXT1cInZhbHVlXCIgY2xhc3M9XCJvbmx5LWljb25cIiBbbW9udGhOYXZpZ2F0b3JdPVwidHJ1ZVwiIFt5ZWFyTmF2aWdhdG9yXT1cInRydWVcIiB5ZWFyUmFuZ2U9XCIxOTAwOjIwMzVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2RhdGVGb3JtYXRdPVwiY29udHJvbC5mb3JtYXQgfHwgJ3l5LW1tLWRkJ1wiIGFwcGVuZFRvPVwiYm9keVwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzaG93T25Gb2N1c109XCIhY29udHJvbC5oaWRlXCIgW3BsYWNlaG9sZGVyXT1cImNvbnRyb2wucGxhY2Vob2xkZXIgfHwgJ2FhYWEtbW0tZGQnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0b3VjaFVJXT1cImNvbnRyb2wudG91Y2hVSSB8fCBmYWxzZVwiIFtzaG93SWNvbl09XCJjb250cm9sLnNob3dJY29uIHx8IGZhbHNlXCIgKG9uU2VsZWN0KT1cIm9uQ2hhbmdlRGF0ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvbkJsdXIpPVwib25DaGFuZ2VEYXRlKClcIj48L3AtY2FsZW5kYXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidudW1lcmljJ1wiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImNvbnRyb2wuc3VidHlwZVwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInY3VycmVuY3knXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiICAobmdNb2RlbENoYW5nZSk9XCJ2YWx1ZSA9ICRldmVudDsgc2VuZFZhbHVlKClcIiBtb2RlPVwiZGVjaW1hbFwiIFttaW5GcmFjdGlvbkRpZ2l0c109XCJjb250cm9sLm1pbkZyYWN0aW9uRGlnaXRzIHx8IDBcIlxyXG4gICAgICAgICAgICAgICAgICAgIFttaW5dPVwiY29udHJvbC5taW4gfHwgbnVsbFwiIFttYXhdPVwiY29udHJvbC5tYXggfHwgbnVsbFwiIChvbklucHV0KT1cInNlbmROdW1iZXJWYWx1ZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICBbcHJlZml4XT1cImNvbnRyb2wuY3VycmVuY3kgfHwgJyQgJ1wiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWwnXCI+XHJcbiAgICAgICAgICAgICAgICA8cC1pbnB1dE51bWJlciBbbmdNb2RlbF09XCJ2YWx1ZVwiIG1vZGU9XCJkZWNpbWFsXCIgKG5nTW9kZWxDaGFuZ2UpPVwidmFsdWUgPSAkZXZlbnQ7IHNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAwXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFt1c2VHcm91cGluZ109XCJjb250cm9sLnVzZUdyb3VwaW5nIHx8IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiY29udHJvbC5kaXNhYmxlZCB8fCBmYWxzZVwiPjwvcC1pbnB1dE51bWJlcj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidwZXJjZW50YWdlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHAtaW5wdXROdW1iZXIgW25nTW9kZWxdPVwidmFsdWVcIiBzdWZmaXg9XCIgJVwiIChuZ01vZGVsQ2hhbmdlKT1cInZhbHVlID0gJGV2ZW50OyBzZW5kVmFsdWUoKVwiIChvbklucHV0KT1cInNlbmRWYWx1ZSgpXCIgW21pbl09XCJjb250cm9sLm1pbiB8fCBudWxsXCJcclxuICAgICAgICAgICAgICAgICAgICBbbWF4XT1cImNvbnRyb2wubWF4IHx8IG51bGxcIiBbbWluRnJhY3Rpb25EaWdpdHNdPVwiY29udHJvbC5taW5GcmFjdGlvbkRpZ2l0cyB8fCAyXCJcclxuICAgICAgICAgICAgICAgICAgICBbbG9jYWxlXT1cImNvbnRyb2wubG9jYWxlIHx8IHVuZGVmaW5lZFwiIFtkaXNhYmxlZF09XCJjb250cm9sLmRpc2FibGVkIHx8IGZhbHNlXCI+PC9wLWlucHV0TnVtYmVyPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ2RlY2ltYWw6c2VhcmNoJ1wiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInAtaW5wdXRncm91cFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwibnVtYmVyXCIgcElucHV0VGV4dCBbKG5nTW9kZWwpXT1cInZhbHVlXCIgKGZvY3Vzb3V0KT1cInNlbmRWYWx1ZSgpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGtleXVwLmVudGVyKT1cImRvRm9jdXNPdXQoKVwiIC8+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgcEJ1dHRvbiBpY29uPVwicGkgcGktc2VhcmNoXCIgKGNsaWNrKT1cInNlYXJjaFZhbHVlKHZhbHVlKVwiPjwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYXJyYXknXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwiY29udHJvbC5zdWJ0eXBlXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidmaWxlJ1wiPlxyXG4gICAgICAgICAgICAgICAgPHNmLWZpbGUtdXBsb2FkICpuZ0lmPVwiIWlzTG9hZGluZ1wiIFtsb2FkaW5nXT1cInVwbG9hZGluZ0ZpbGVzXCIgW2ZpbGVzXT1cInVwbG9hZGVkRmlsZXNcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjb25maWdOYW1lXT1cImNvbnRyb2wuY29uZmlnPy5jb25maWdOYW1lXCIgW2xpbWl0XT1cImNvbnRyb2wuY29uZmlnPy5saW1pdCB8fCAxXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWNjZXB0XT1cImNvbnRyb2wuY29uZmlnPy5hY2NlcHQgfHwgJ2ltYWdlLyosYXBwbGljYXRpb24vcGRmJ1wiIChvblVwbG9hZCk9XCJvblVwbG9hZCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAob25EZWxldGVGaWxlKT1cIm9uRGVsZXRlRmlsZSgkZXZlbnQpXCI+PC9zZi1maWxlLXVwbG9hZD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtdWx0aXNlbGVjdCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLW11bHRpU2VsZWN0IFtvcHRpb25zXT1cImRhdGFGcm9tU2VydmljZVwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAob25DaGFuZ2UpPVwic2VuZFZhbHVlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtvcHRpb25MYWJlbF09XCJjb250cm9sLmNvbmZpZz8ub3B0aW9uTGFiZWxcIiBbb3B0aW9uVmFsdWVdPVwiY29udHJvbC5jb25maWc/Lm9wdGlvblZhbHVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29udHJvbC5jb25maWc/LnBsYWNlaG9sZGVyXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheV09XCJjb250cm9sLmNvbmZpZz8uZGlzcGxheSB8fCAnY2hpcCdcIj48L3AtbXVsdGlTZWxlY3Q+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInYm9vbGVhbidcIj5cclxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJjb250cm9sLnN1YnR5cGVcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3N3aXRjaCdcIj5cclxuICAgICAgICAgICAgICAgIDxwLWlucHV0U3dpdGNoICBbKG5nTW9kZWwpXT1cInRlbXBWYWx1ZVwiIChvbkNoYW5nZSk9XCJvbkNoYW5nZVN3aXRjaCgpXCIgW2lkXT1cImxhYmVsXCJcclxuICAgICAgICAgICAgICAgIFt0cnVlVmFsdWVdPVwiY29udHJvbD8udHJ1ZVZhbHVlICE9PSB1bmRlZmluZWQgPyBjb250cm9sPy50cnVlVmFsdWU6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgW2ZhbHNlVmFsdWVdPVwiY29udHJvbD8uZmFsc2VWYWx1ZSAhPT0gdW5kZWZpbmVkID8gY29udHJvbD8uZmFsc2VWYWx1ZTogbnVsbFwiPjwvcC1pbnB1dFN3aXRjaD5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuPC9kaXY+XHJcbiJdfQ==
|