@metadev/lux 0.27.0 → 0.29.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/LICENSE +1 -1
- package/README.md +1 -1
- package/esm2022/lib/autocomplete/autocomplete.component.mjs +488 -488
- package/esm2022/lib/autocomplete-list/autocomplete-list.component.mjs +259 -259
- package/esm2022/lib/breadcrumb/breadcrumb.component.mjs +78 -78
- package/esm2022/lib/checkbox/checkbox.component.mjs +156 -156
- package/esm2022/lib/datasource.mjs +1 -1
- package/esm2022/lib/datetime/datetime.component.mjs +312 -312
- package/esm2022/lib/filter/filter.component.mjs +158 -158
- package/esm2022/lib/geolocation/geolocation.component.mjs +423 -423
- package/esm2022/lib/geolocation/geolocation.service.mjs +123 -123
- package/esm2022/lib/geolocation/openlayer-loader.service.mjs +62 -62
- package/esm2022/lib/helperFns.mjs +118 -118
- package/esm2022/lib/input/input.component.mjs +469 -469
- package/esm2022/lib/input/regexp.service.mjs +195 -195
- package/esm2022/lib/lang.mjs +9 -9
- package/esm2022/lib/lux.module.mjs +118 -118
- package/esm2022/lib/map/geopoint.mjs +1 -1
- package/esm2022/lib/map/map.component.mjs +275 -275
- package/esm2022/lib/modal/modal-backdrop.mjs +24 -24
- package/esm2022/lib/modal/modal-config.mjs +11 -11
- package/esm2022/lib/modal/modal-dismiss-reasons.mjs +5 -5
- package/esm2022/lib/modal/modal-ref.mjs +101 -101
- package/esm2022/lib/modal/modal-stack.mjs +182 -182
- package/esm2022/lib/modal/modal-window.mjs +118 -118
- package/esm2022/lib/modal/modal.service.mjs +27 -27
- package/esm2022/lib/modal/util.mjs +82 -82
- package/esm2022/lib/pagination/pagination.component.mjs +144 -144
- package/esm2022/lib/pagination/pagination.mjs +1 -1
- package/esm2022/lib/radiogroup/radiogroup.component.mjs +129 -129
- package/esm2022/lib/select/select.component.mjs +148 -148
- package/esm2022/lib/tooltip/placement.mjs +7 -7
- package/esm2022/lib/tooltip/tooltip-context.mjs +1 -1
- package/esm2022/lib/tooltip/tooltip.component.mjs +21 -21
- package/esm2022/lib/tooltip/tooltip.directive.mjs +69 -69
- package/esm2022/lib/tooltip/tooltip.service.mjs +137 -137
- package/esm2022/lib/tooltip/tooltop-content.mjs +8 -8
- package/esm2022/lib/voice-recognition/voice-recognition.directive.mjs +79 -79
- package/esm2022/lib/window/window.service.mjs +46 -46
- package/esm2022/metadev-lux.mjs +4 -4
- package/esm2022/public-api.mjs +20 -20
- package/fesm2022/metadev-lux.mjs +4372 -4372
- package/fesm2022/metadev-lux.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/autocomplete/autocomplete.component.d.ts +81 -81
- package/lib/autocomplete-list/autocomplete-list.component.d.ts +65 -65
- package/lib/breadcrumb/breadcrumb.component.d.ts +22 -22
- package/lib/checkbox/checkbox.component.d.ts +47 -47
- package/lib/datasource.d.ts +13 -13
- package/lib/datetime/datetime.component.d.ts +69 -69
- package/lib/filter/filter.component.d.ts +51 -51
- package/lib/geolocation/geolocation.component.d.ts +123 -123
- package/lib/geolocation/geolocation.service.d.ts +32 -32
- package/lib/geolocation/openlayer-loader.service.d.ts +7 -7
- package/lib/helperFns.d.ts +15 -15
- package/lib/input/input.component.d.ts +108 -108
- package/lib/input/regexp.service.d.ts +15 -15
- package/lib/lang.d.ts +2 -2
- package/lib/lux.module.d.ts +27 -27
- package/lib/map/geopoint.d.ts +7 -7
- package/lib/map/map.component.d.ts +39 -39
- package/lib/modal/modal-backdrop.d.ts +8 -8
- package/lib/modal/modal-config.d.ts +14 -14
- package/lib/modal/modal-dismiss-reasons.d.ts +4 -4
- package/lib/modal/modal-ref.d.ts +41 -41
- package/lib/modal/modal-stack.d.ts +31 -31
- package/lib/modal/modal-window.d.ts +28 -28
- package/lib/modal/modal.service.d.ts +19 -19
- package/lib/modal/util.d.ts +40 -40
- package/lib/pagination/pagination.component.d.ts +52 -52
- package/lib/pagination/pagination.d.ts +10 -10
- package/lib/radiogroup/radiogroup.component.d.ts +37 -37
- package/lib/select/select.component.d.ts +38 -38
- package/lib/tooltip/placement.d.ts +7 -7
- package/lib/tooltip/tooltip-context.d.ts +3 -3
- package/lib/tooltip/tooltip.component.d.ts +11 -11
- package/lib/tooltip/tooltip.directive.d.ts +27 -27
- package/lib/tooltip/tooltip.service.d.ts +20 -20
- package/lib/tooltip/tooltop-content.d.ts +6 -6
- package/lib/voice-recognition/voice-recognition.directive.d.ts +16 -16
- package/lib/window/window.service.d.ts +11 -11
- package/package.json +3 -4
- package/public-api.d.ts +18 -18
|
@@ -1,423 +1,423 @@
|
|
|
1
|
-
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
-
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
-
import { exists, hasValue, isInitialAndEmpty, isValidNumber, roundToMultipleOf } from '../helperFns';
|
|
4
|
-
import { languageDetector } from '../lang';
|
|
5
|
-
import { ModalService } from '../modal/modal.service';
|
|
6
|
-
import { GeolocationService } from './geolocation.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
import * as i1 from "../modal/modal.service";
|
|
9
|
-
import * as i2 from "./geolocation.service";
|
|
10
|
-
import * as i3 from "@angular/forms";
|
|
11
|
-
import * as i4 from "@angular/common";
|
|
12
|
-
import * as i5 from "../autocomplete/autocomplete.component";
|
|
13
|
-
import * as i6 from "../map/map.component";
|
|
14
|
-
export class GeolocationComponent {
|
|
15
|
-
modalService;
|
|
16
|
-
locationService;
|
|
17
|
-
static idCounter = 0;
|
|
18
|
-
latitude;
|
|
19
|
-
longitude;
|
|
20
|
-
map;
|
|
21
|
-
touched = false;
|
|
22
|
-
dirty = false;
|
|
23
|
-
lastErrors = null;
|
|
24
|
-
_disabled;
|
|
25
|
-
_required;
|
|
26
|
-
_value;
|
|
27
|
-
latitudeValue = undefined;
|
|
28
|
-
longitudeValue = undefined;
|
|
29
|
-
isValidNumber = isValidNumber;
|
|
30
|
-
i18n = {
|
|
31
|
-
en: {
|
|
32
|
-
lat: 'latitude',
|
|
33
|
-
lon: 'longitude',
|
|
34
|
-
selectLocation: 'Select location',
|
|
35
|
-
location: 'Location',
|
|
36
|
-
selectAction: 'Select',
|
|
37
|
-
cancelAction: 'Cancel',
|
|
38
|
-
closeAction: 'Close',
|
|
39
|
-
typeToSearch: 'type to search',
|
|
40
|
-
cardinalPoints: {
|
|
41
|
-
north: 'N',
|
|
42
|
-
south: 'S',
|
|
43
|
-
east: 'E',
|
|
44
|
-
west: 'W'
|
|
45
|
-
},
|
|
46
|
-
userErrors: {
|
|
47
|
-
required: 'Required field.',
|
|
48
|
-
minLatitude: 'Minimum latitude is $minLatitude.',
|
|
49
|
-
maxLatitude: 'Maximum latitude is $maxLatitude.',
|
|
50
|
-
minLongitude: 'Minimum longitude is $minLongitude.',
|
|
51
|
-
maxLongitude: 'Maximum longitude is $maxLongitude.'
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
es: {
|
|
55
|
-
lat: 'latitud',
|
|
56
|
-
lon: 'longitud',
|
|
57
|
-
selectLocation: 'Seleccione ubicación',
|
|
58
|
-
location: 'Ubicación',
|
|
59
|
-
selectAction: 'Seleccionar',
|
|
60
|
-
cancelAction: 'Cancelar',
|
|
61
|
-
closeAction: 'Cerrar',
|
|
62
|
-
typeToSearch: 'escribe para buscar',
|
|
63
|
-
cardinalPoints: {
|
|
64
|
-
north: 'N',
|
|
65
|
-
south: 'S',
|
|
66
|
-
east: 'E',
|
|
67
|
-
west: 'O'
|
|
68
|
-
},
|
|
69
|
-
userErrors: {
|
|
70
|
-
required: 'El campo es obligatorio.',
|
|
71
|
-
minLatitude: 'La latitud mínima es $minLatitude.',
|
|
72
|
-
maxLatitude: 'La latitud máxima es $maxLatitude.',
|
|
73
|
-
minLongitude: 'La longitud mínima es $minLongitude.',
|
|
74
|
-
maxLongitude: 'La longitud máxima es $maxLongitude.'
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
};
|
|
78
|
-
minLatitude;
|
|
79
|
-
maxLatitude;
|
|
80
|
-
minLongitude;
|
|
81
|
-
maxLongitude;
|
|
82
|
-
step;
|
|
83
|
-
zoom;
|
|
84
|
-
get className() {
|
|
85
|
-
return this.checkClassName();
|
|
86
|
-
}
|
|
87
|
-
lang = languageDetector();
|
|
88
|
-
inlineErrors = false;
|
|
89
|
-
inputId;
|
|
90
|
-
ariaLabel;
|
|
91
|
-
readonly = null;
|
|
92
|
-
set disabled(v) {
|
|
93
|
-
v = typeof v === 'string' && v !== 'false' ? true : v;
|
|
94
|
-
this._disabled = v;
|
|
95
|
-
}
|
|
96
|
-
get disabled() {
|
|
97
|
-
return this._disabled;
|
|
98
|
-
}
|
|
99
|
-
set required(v) {
|
|
100
|
-
this._required = v;
|
|
101
|
-
}
|
|
102
|
-
get required() {
|
|
103
|
-
return this._required;
|
|
104
|
-
}
|
|
105
|
-
set value(v) {
|
|
106
|
-
if (v === this._value) {
|
|
107
|
-
return; // prevent events when there is no changes
|
|
108
|
-
}
|
|
109
|
-
const initialAndEmpty = isInitialAndEmpty(this._value, v);
|
|
110
|
-
if (v &&
|
|
111
|
-
v.coordinates &&
|
|
112
|
-
v.coordinates.length === 2 &&
|
|
113
|
-
exists(v.coordinates[0] && exists(v.coordinates[1]))) {
|
|
114
|
-
this._value = v;
|
|
115
|
-
this.setLatitudeInControl(v.coordinates[1]);
|
|
116
|
-
this.setLongitudeInControl(v.coordinates[0]);
|
|
117
|
-
}
|
|
118
|
-
else if (!v) {
|
|
119
|
-
this._value = null;
|
|
120
|
-
this.setLatitudeInControl(null);
|
|
121
|
-
this.setLongitudeInControl(null);
|
|
122
|
-
}
|
|
123
|
-
else {
|
|
124
|
-
this._value = v;
|
|
125
|
-
// we don't set value in control if the value is not valid
|
|
126
|
-
// if we do, the content of the control changes and can erase what the user is typing
|
|
127
|
-
}
|
|
128
|
-
this.onChange(v);
|
|
129
|
-
if (!initialAndEmpty) {
|
|
130
|
-
this.valueChange.emit(v);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
get value() {
|
|
134
|
-
return this._value;
|
|
135
|
-
}
|
|
136
|
-
valueChange = new EventEmitter();
|
|
137
|
-
keyPress = new EventEmitter();
|
|
138
|
-
onChange = (value) => { };
|
|
139
|
-
onTouched = () => { };
|
|
140
|
-
constructor(modalService, locationService) {
|
|
141
|
-
this.modalService = modalService;
|
|
142
|
-
this.locationService = locationService;
|
|
143
|
-
}
|
|
144
|
-
// ControlValueAccessor Interface implementation
|
|
145
|
-
writeValue(value) {
|
|
146
|
-
this.value = value;
|
|
147
|
-
}
|
|
148
|
-
registerOnChange(onChange) {
|
|
149
|
-
this.onChange = onChange;
|
|
150
|
-
}
|
|
151
|
-
registerOnTouched(onTouched) {
|
|
152
|
-
this.onTouched = onTouched;
|
|
153
|
-
}
|
|
154
|
-
markAsTouched() {
|
|
155
|
-
if (!this.touched) {
|
|
156
|
-
this.onTouched();
|
|
157
|
-
this.touched = true;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
setDisabledState(disabled) {
|
|
161
|
-
this.disabled = disabled;
|
|
162
|
-
}
|
|
163
|
-
// End of ControlValueAccessor Interface implementation
|
|
164
|
-
setLatitudeInControl(latitude) {
|
|
165
|
-
// this.latitude.nativeElement.value = latitude;
|
|
166
|
-
this.latitudeValue = latitude;
|
|
167
|
-
}
|
|
168
|
-
setLongitudeInControl(longitude) {
|
|
169
|
-
// this.longitude.nativeElement.value = longitude;
|
|
170
|
-
this.longitudeValue = longitude;
|
|
171
|
-
}
|
|
172
|
-
clear() {
|
|
173
|
-
this.setLatitudeInControl(null);
|
|
174
|
-
this.setLongitudeInControl(null);
|
|
175
|
-
this.value = null;
|
|
176
|
-
}
|
|
177
|
-
isClearable() {
|
|
178
|
-
return (isValidNumber(this.latitudeValue) || isValidNumber(this.longitudeValue));
|
|
179
|
-
}
|
|
180
|
-
// Validator interface
|
|
181
|
-
registerOnValidatorChange() { }
|
|
182
|
-
validate(control) {
|
|
183
|
-
const value = control.value;
|
|
184
|
-
let result = null;
|
|
185
|
-
if (this.required &&
|
|
186
|
-
!hasValue(value) &&
|
|
187
|
-
!exists(this.latitudeValue) &&
|
|
188
|
-
!exists(this.longitudeValue)) {
|
|
189
|
-
result = result || {};
|
|
190
|
-
result.required = { value, reason: 'Required field.' };
|
|
191
|
-
}
|
|
192
|
-
if (!exists(this.latitudeValue) && exists(this.longitudeValue)) {
|
|
193
|
-
result = result || {};
|
|
194
|
-
result.existsLatitude = {
|
|
195
|
-
value,
|
|
196
|
-
reason: 'Latitude not specified.'
|
|
197
|
-
};
|
|
198
|
-
}
|
|
199
|
-
if (exists(this.latitudeValue) && !exists(this.longitudeValue)) {
|
|
200
|
-
result = result || {};
|
|
201
|
-
result.existsLongitude = {
|
|
202
|
-
value,
|
|
203
|
-
reason: 'Longitude not specified.'
|
|
204
|
-
};
|
|
205
|
-
}
|
|
206
|
-
if (exists(this.minLatitude) && this.latitudeValue < this.minLatitude) {
|
|
207
|
-
result = result || {};
|
|
208
|
-
result.minLatitude = {
|
|
209
|
-
value,
|
|
210
|
-
min: this.minLatitude,
|
|
211
|
-
reason: `Latitude is lower than minimum value: ${this.minLatitude}.`
|
|
212
|
-
};
|
|
213
|
-
}
|
|
214
|
-
if (exists(this.maxLatitude) && this.latitudeValue > this.maxLatitude) {
|
|
215
|
-
result = result || {};
|
|
216
|
-
result.maxLatitude = {
|
|
217
|
-
value,
|
|
218
|
-
max: this.maxLatitude,
|
|
219
|
-
reason: `Latitude is higher than maximum value: ${this.maxLatitude}.`
|
|
220
|
-
};
|
|
221
|
-
}
|
|
222
|
-
if (exists(this.minLongitude) && this.longitudeValue < this.minLongitude) {
|
|
223
|
-
result = result || {};
|
|
224
|
-
result.minLongitude = {
|
|
225
|
-
value,
|
|
226
|
-
min: this.minLongitude,
|
|
227
|
-
reason: `Longitude is lower than minimum value: ${this.minLongitude}.`
|
|
228
|
-
};
|
|
229
|
-
}
|
|
230
|
-
if (exists(this.maxLongitude) && this.longitudeValue > this.maxLongitude) {
|
|
231
|
-
result = result || {};
|
|
232
|
-
result.maxLongitude = {
|
|
233
|
-
value,
|
|
234
|
-
max: this.maxLongitude,
|
|
235
|
-
reason: `Longitude is higher than maximum value: ${this.maxLongitude}.`
|
|
236
|
-
};
|
|
237
|
-
}
|
|
238
|
-
this.lastErrors = result;
|
|
239
|
-
return result;
|
|
240
|
-
}
|
|
241
|
-
// End of Validator interface
|
|
242
|
-
ngOnInit() {
|
|
243
|
-
this.inputId = this.inputId
|
|
244
|
-
? this.inputId
|
|
245
|
-
: `geolocation$${GeolocationComponent.idCounter++}`;
|
|
246
|
-
this.setPatterns();
|
|
247
|
-
}
|
|
248
|
-
roundToStepAndUpdateLatitudeAndLongitude(newLatitudeAndLongitude) {
|
|
249
|
-
const newLatitude = roundToMultipleOf(newLatitudeAndLongitude[1], this.step);
|
|
250
|
-
const newLongitude = roundToMultipleOf(newLatitudeAndLongitude[0], this.step);
|
|
251
|
-
if (this.disabled || this.readonly) {
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
if (!exists(newLatitudeAndLongitude)) {
|
|
255
|
-
this.value = null;
|
|
256
|
-
}
|
|
257
|
-
this.value = {
|
|
258
|
-
type: 'Point',
|
|
259
|
-
coordinates: [newLongitude, newLatitude]
|
|
260
|
-
};
|
|
261
|
-
}
|
|
262
|
-
onLostFocus() {
|
|
263
|
-
this.markAsTouched();
|
|
264
|
-
}
|
|
265
|
-
onEventLatitude(newLatitude) {
|
|
266
|
-
if (this.disabled || this.readonly) {
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const newLatitudeValue = isValidNumber(newLatitude) ? +newLatitude : null;
|
|
270
|
-
if (!(exists(this.value) && exists(this.value.coordinates[0])) &&
|
|
271
|
-
!exists(newLatitudeValue)) {
|
|
272
|
-
this.value = null;
|
|
273
|
-
}
|
|
274
|
-
else {
|
|
275
|
-
this.value = {
|
|
276
|
-
type: 'Point',
|
|
277
|
-
coordinates: [
|
|
278
|
-
this.value ? this.value.coordinates[0] : undefined,
|
|
279
|
-
newLatitudeValue
|
|
280
|
-
]
|
|
281
|
-
};
|
|
282
|
-
}
|
|
283
|
-
this.markAsTouched();
|
|
284
|
-
}
|
|
285
|
-
onEventLongitude(newLongitude) {
|
|
286
|
-
if (this.disabled || this.readonly) {
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
const newLongitudeValue = isValidNumber(newLongitude)
|
|
290
|
-
? +newLongitude
|
|
291
|
-
: null;
|
|
292
|
-
if (!exists(newLongitudeValue) &&
|
|
293
|
-
!(exists(this.value) && exists(this._value.coordinates[1]))) {
|
|
294
|
-
this.value = null;
|
|
295
|
-
}
|
|
296
|
-
else {
|
|
297
|
-
this.value = {
|
|
298
|
-
type: 'Point',
|
|
299
|
-
coordinates: [
|
|
300
|
-
newLongitudeValue,
|
|
301
|
-
this.value ? this.value.coordinates[1] : undefined
|
|
302
|
-
]
|
|
303
|
-
};
|
|
304
|
-
}
|
|
305
|
-
this.markAsTouched();
|
|
306
|
-
}
|
|
307
|
-
onKeyPress(event) {
|
|
308
|
-
this.keyPress.emit(event);
|
|
309
|
-
}
|
|
310
|
-
checkClassName() {
|
|
311
|
-
return this.disabled
|
|
312
|
-
? this.readonly
|
|
313
|
-
? 'disabled readonly'
|
|
314
|
-
: 'disabled'
|
|
315
|
-
: this.readonly
|
|
316
|
-
? 'readonly'
|
|
317
|
-
: '';
|
|
318
|
-
}
|
|
319
|
-
openModalMap(modal) {
|
|
320
|
-
this.modalService.open(modal).result.then((result) => {
|
|
321
|
-
if (result !== 'cancel') {
|
|
322
|
-
this.roundToStepAndUpdateLatitudeAndLongitude(result);
|
|
323
|
-
}
|
|
324
|
-
}, (_) => { });
|
|
325
|
-
}
|
|
326
|
-
onSearchLocationChanged(newValue, map) {
|
|
327
|
-
map.markerPoint = newValue;
|
|
328
|
-
map.center = map.markerPoint;
|
|
329
|
-
}
|
|
330
|
-
get mapTitle() {
|
|
331
|
-
return this._disabled || !!this.readonly
|
|
332
|
-
? this.i18n[this.lang].location
|
|
333
|
-
: this.i18n[this.lang].selectLocation;
|
|
334
|
-
}
|
|
335
|
-
get self() {
|
|
336
|
-
return this;
|
|
337
|
-
}
|
|
338
|
-
getLabels(instance, keys) {
|
|
339
|
-
return instance.locationService.getLabels(instance.locationService, keys);
|
|
340
|
-
}
|
|
341
|
-
getData(instance, search) {
|
|
342
|
-
return instance.locationService.getData(instance.locationService, search);
|
|
343
|
-
}
|
|
344
|
-
setPatterns() {
|
|
345
|
-
this.step = this.step || 0.00001; // 0.00001 degrees = 1.11 meters
|
|
346
|
-
this.zoom = this.zoom || 18; // (360/2^18) degrees ~ 0.00137 degrees ~ 153 meters
|
|
347
|
-
this.minLatitude = this.minLatitude || -90;
|
|
348
|
-
this.maxLatitude = this.maxLatitude || +90;
|
|
349
|
-
this.minLongitude = this.minLongitude || -180;
|
|
350
|
-
this.maxLongitude = this.maxLongitude || +180;
|
|
351
|
-
}
|
|
352
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
353
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "
|
|
354
|
-
{
|
|
355
|
-
provide: NG_VALUE_ACCESSOR,
|
|
356
|
-
multi: true,
|
|
357
|
-
useExisting: forwardRef(() => GeolocationComponent)
|
|
358
|
-
},
|
|
359
|
-
{
|
|
360
|
-
provide: NG_VALIDATORS,
|
|
361
|
-
multi: true,
|
|
362
|
-
useExisting: forwardRef(() => GeolocationComponent)
|
|
363
|
-
}
|
|
364
|
-
], viewQueries: [{ propertyName: "latitude", first: true, predicate: ["latitude"], descendants: true, static: true }, { propertyName: "longitude", first: true, predicate: ["longitude"], descendants: true, static: true }, { propertyName: "map", first: true, predicate: ["map"], descendants: true }], ngImport: i0, template: "<input\n #latitude\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$latitude'\"\n [(ngModel)]=\"latitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLatitude !== undefined && minLatitude !== null\n ? minLatitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLatitude !== undefined && maxLatitude !== null\n ? maxLatitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lat\"\n (keyup)=\"onEventLatitude(latitude.value)\"\n (change)=\"onEventLatitude(latitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\">\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.north\n }}</span>\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue < 0\">{{\n i18n[lang].cardinalPoints.south\n }}</span>\n <span *ngIf=\"!isValidNumber(latitudeValue)\">-</span>\n</div>\n<input\n #longitude\n class=\"prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$longitude'\"\n [(ngModel)]=\"longitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLongitude !== undefined && minLongitude !== null\n ? minLongitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLongitude !== undefined && maxLongitude !== null\n ? maxLongitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lon\"\n (keyup)=\"onEventLongitude(longitude.value)\"\n (change)=\"onEventLongitude(longitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.east\n }}</span>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue < 0\">{{\n i18n[lang].cardinalPoints.west\n }}</span>\n <span *ngIf=\"!isValidNumber(longitudeValue)\">-</span>\n</div>\n<div\n [class]=\"\n disabled || readonly || !isClearable()\n ? 'clickable rounded-right postfix symbol'\n : 'clickable postfix symbol'\n \"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span class=\"icon-globe\"></span>\n</div>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n class=\"rounded-right postfix bordered icon icon-clear\"\n [id]=\"inputId + '$clear'\"\n type=\"button\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ i18n[lang].userErrors.required }}\n </div>\n <div *ngIf=\"lastErrors.minLatitude\">\n {{\n i18n[lang].userErrors.minLatitude.replace(\n '$minLatitude',\n lastErrors.minLatitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLatitude\">\n {{\n i18n[lang].userErrors.maxLatitude.replace(\n '$maxLatitude',\n lastErrors.maxLatitude.max\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.minLongitude\">\n {{\n i18n[lang].userErrors.minLongitude.replace(\n '$minLongitude',\n lastErrors.minLongitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLongitude\">\n {{\n i18n[lang].userErrors.maxLongitude.replace(\n '$maxLongitude',\n lastErrors.maxLongitude.max\n )\n }}\n </div>\n</div>\n\n<ng-template #modalMap let-modal>\n <div class=\"lux-modal-header\">\n <h4 class=\"modal-title default-font\" id=\"modal-basic-title\">{{ mapTitle }}</h4>\n <button\n type=\"button\"\n class=\"close\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss('Cross click')\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n </div>\n <div class=\"lux-modal-body content\">\n <lux-autocomplete\n #searchBar\n [attr.aria-label]=\"i18n[lang].typeToSearch\"\n [placeholder]=\"i18n[lang].typeToSearch\"\n *ngIf=\"!disabled && !readonly\"\n [instance]=\"self\"\n [resolveLabelsFunction]=\"getLabels\"\n [populateFunction]=\"getData\"\n (valueChange)=\"onSearchLocationChanged(searchBar.value, map)\"\n ></lux-autocomplete>\n <div class=\"map-container\">\n <lux-map\n #map\n [center]=\"value\"\n [markerPoint]=\"value\"\n [zoom]=\"zoom\"\n [readonly]=\"readonly === true || disabled === true ? true : false\"\n ></lux-map>\n </div>\n </div>\n <div class=\"lux-modal-footer\">\n <button\n *ngIf=\"disabled || readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].closeAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].cancelAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-select\"\n (click)=\"modal.close(map.markerPoint.coordinates)\"\n >\n {{ i18n[lang].selectAction }}\n </button>\n </div>\n</ng-template>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.btn-select{color:#fff;background-color:#4242d1;margin-left:2rem}.btn-cancel{color:#fff;background-color:#c22929}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon,.icon-clear,.icon-globe{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;min-width:1rem;min-height:1rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.clickable{cursor:pointer}.icon-globe{background:var(--lux-autocomplete-icon-globe, url(/assets/img/globe.svg) no-repeat center);background-size:1rem;height:100%}.icon-clear{width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}.lux-modal-body{padding:0}.map-container{height:var(--lux-geolocation-map-height, 45vh);width:var(--lux-geolocation-map-width, 90vw);max-width:100%}\n"], dependencies: [{ kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.AutocompleteComponent, selector: "lux-autocomplete", inputs: ["inputId", "disabled", "readonly", "label", "canAddNewValues", "keepOpenAfterDelete", "value", "dataSource", "required", "placeholder", "resolveLabelsFunction", "populateFunction", "instance"], outputs: ["valueChange", "dataSourceChange"] }, { kind: "component", type: i6.MapComponent, selector: "lux-map", inputs: ["mapId", "zoom", "center", "readonly", "markerCoordinates", "markerPoint"], outputs: ["valueChange"] }] });
|
|
365
|
-
}
|
|
366
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
367
|
-
type: Component,
|
|
368
|
-
args: [{ selector: 'lux-geolocation', providers: [
|
|
369
|
-
{
|
|
370
|
-
provide: NG_VALUE_ACCESSOR,
|
|
371
|
-
multi: true,
|
|
372
|
-
useExisting: forwardRef(() => GeolocationComponent)
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
provide: NG_VALIDATORS,
|
|
376
|
-
multi: true,
|
|
377
|
-
useExisting: forwardRef(() => GeolocationComponent)
|
|
378
|
-
}
|
|
379
|
-
], template: "<input\n #latitude\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$latitude'\"\n [(ngModel)]=\"latitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLatitude !== undefined && minLatitude !== null\n ? minLatitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLatitude !== undefined && maxLatitude !== null\n ? maxLatitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lat\"\n (keyup)=\"onEventLatitude(latitude.value)\"\n (change)=\"onEventLatitude(latitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\">\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.north\n }}</span>\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue < 0\">{{\n i18n[lang].cardinalPoints.south\n }}</span>\n <span *ngIf=\"!isValidNumber(latitudeValue)\">-</span>\n</div>\n<input\n #longitude\n class=\"prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$longitude'\"\n [(ngModel)]=\"longitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLongitude !== undefined && minLongitude !== null\n ? minLongitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLongitude !== undefined && maxLongitude !== null\n ? maxLongitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lon\"\n (keyup)=\"onEventLongitude(longitude.value)\"\n (change)=\"onEventLongitude(longitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.east\n }}</span>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue < 0\">{{\n i18n[lang].cardinalPoints.west\n }}</span>\n <span *ngIf=\"!isValidNumber(longitudeValue)\">-</span>\n</div>\n<div\n [class]=\"\n disabled || readonly || !isClearable()\n ? 'clickable rounded-right postfix symbol'\n : 'clickable postfix symbol'\n \"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span class=\"icon-globe\"></span>\n</div>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n class=\"rounded-right postfix bordered icon icon-clear\"\n [id]=\"inputId + '$clear'\"\n type=\"button\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ i18n[lang].userErrors.required }}\n </div>\n <div *ngIf=\"lastErrors.minLatitude\">\n {{\n i18n[lang].userErrors.minLatitude.replace(\n '$minLatitude',\n lastErrors.minLatitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLatitude\">\n {{\n i18n[lang].userErrors.maxLatitude.replace(\n '$maxLatitude',\n lastErrors.maxLatitude.max\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.minLongitude\">\n {{\n i18n[lang].userErrors.minLongitude.replace(\n '$minLongitude',\n lastErrors.minLongitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLongitude\">\n {{\n i18n[lang].userErrors.maxLongitude.replace(\n '$maxLongitude',\n lastErrors.maxLongitude.max\n )\n }}\n </div>\n</div>\n\n<ng-template #modalMap let-modal>\n <div class=\"lux-modal-header\">\n <h4 class=\"modal-title default-font\" id=\"modal-basic-title\">{{ mapTitle }}</h4>\n <button\n type=\"button\"\n class=\"close\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss('Cross click')\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n </div>\n <div class=\"lux-modal-body content\">\n <lux-autocomplete\n #searchBar\n [attr.aria-label]=\"i18n[lang].typeToSearch\"\n [placeholder]=\"i18n[lang].typeToSearch\"\n *ngIf=\"!disabled && !readonly\"\n [instance]=\"self\"\n [resolveLabelsFunction]=\"getLabels\"\n [populateFunction]=\"getData\"\n (valueChange)=\"onSearchLocationChanged(searchBar.value, map)\"\n ></lux-autocomplete>\n <div class=\"map-container\">\n <lux-map\n #map\n [center]=\"value\"\n [markerPoint]=\"value\"\n [zoom]=\"zoom\"\n [readonly]=\"readonly === true || disabled === true ? true : false\"\n ></lux-map>\n </div>\n </div>\n <div class=\"lux-modal-footer\">\n <button\n *ngIf=\"disabled || readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].closeAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].cancelAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-select\"\n (click)=\"modal.close(map.markerPoint.coordinates)\"\n >\n {{ i18n[lang].selectAction }}\n </button>\n </div>\n</ng-template>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.btn-select{color:#fff;background-color:#4242d1;margin-left:2rem}.btn-cancel{color:#fff;background-color:#c22929}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon,.icon-clear,.icon-globe{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;min-width:1rem;min-height:1rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.clickable{cursor:pointer}.icon-globe{background:var(--lux-autocomplete-icon-globe, url(/assets/img/globe.svg) no-repeat center);background-size:1rem;height:100%}.icon-clear{width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}.lux-modal-body{padding:0}.map-container{height:var(--lux-geolocation-map-height, 45vh);width:var(--lux-geolocation-map-width, 90vw);max-width:100%}\n"] }]
|
|
380
|
-
}], ctorParameters:
|
|
381
|
-
type: ViewChild,
|
|
382
|
-
args: ['latitude', { static: true }]
|
|
383
|
-
}], longitude: [{
|
|
384
|
-
type: ViewChild,
|
|
385
|
-
args: ['longitude', { static: true }]
|
|
386
|
-
}], map: [{
|
|
387
|
-
type: ViewChild,
|
|
388
|
-
args: ['map', { static: false }]
|
|
389
|
-
}], minLatitude: [{
|
|
390
|
-
type: Input
|
|
391
|
-
}], maxLatitude: [{
|
|
392
|
-
type: Input
|
|
393
|
-
}], minLongitude: [{
|
|
394
|
-
type: Input
|
|
395
|
-
}], maxLongitude: [{
|
|
396
|
-
type: Input
|
|
397
|
-
}], step: [{
|
|
398
|
-
type: Input
|
|
399
|
-
}], zoom: [{
|
|
400
|
-
type: Input
|
|
401
|
-
}], lang: [{
|
|
402
|
-
type: Input
|
|
403
|
-
}], inlineErrors: [{
|
|
404
|
-
type: Input
|
|
405
|
-
}], inputId: [{
|
|
406
|
-
type: Input
|
|
407
|
-
}], ariaLabel: [{
|
|
408
|
-
type: Input,
|
|
409
|
-
args: ['aria-label']
|
|
410
|
-
}], readonly: [{
|
|
411
|
-
type: Input
|
|
412
|
-
}], disabled: [{
|
|
413
|
-
type: Input
|
|
414
|
-
}], required: [{
|
|
415
|
-
type: Input
|
|
416
|
-
}], value: [{
|
|
417
|
-
type: Input
|
|
418
|
-
}], valueChange: [{
|
|
419
|
-
type: Output
|
|
420
|
-
}], keyPress: [{
|
|
421
|
-
type: Output
|
|
422
|
-
}] } });
|
|
423
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2xCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBbUIzRCxNQUFNLE9BQU8sb0JBQW9CO0lBcUpyQjtJQUNEO0lBckpULE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRW9CLFFBQVEsQ0FBYTtJQUNwQixTQUFTLENBQWE7SUFDM0IsR0FBRyxDQUFjO0lBRXRELE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLFVBQVUsR0FBNEIsSUFBSSxDQUFDO0lBRW5DLFNBQVMsQ0FBbUI7SUFDNUIsU0FBUyxDQUFVO0lBQ25CLE1BQU0sQ0FBTTtJQUVwQixhQUFhLEdBQVksU0FBUyxD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c0IsU0FBUztzQkFBcEMsS0FBSzt1QkFBQyxZQUFZO2dCQUNILFFBQVE7c0JBQXZCLEtBQUs7Z0JBR0YsUUFBUTtzQkFEWCxLQUFLO2dCQVVGLFFBQVE7c0JBRFgsS0FBSztnQkFTRixLQUFLO3NCQURSLEtBQUs7Z0JBaUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csUUFBUTtzQkFBakIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBBYnN0cmFjdENvbnRyb2wsXG4gIE5HX1ZBTElEQVRPUlMsXG4gIE5HX1ZBTFVFX0FDQ0VTU09SLFxuICBWYWxpZGF0aW9uRXJyb3JzXG59IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuLi9kYXRhc291cmNlJztcbmltcG9ydCB7XG4gIGV4aXN0cyxcbiAgaGFzVmFsdWUsXG4gIGlzSW5pdGlhbEFuZEVtcHR5LFxuICBpc1ZhbGlkTnVtYmVyLFxuICByb3VuZFRvTXVsdGlwbGVPZlxufSBmcm9tICcuLi9oZWxwZXJGbnMnO1xuaW1wb3J0IHsgbGFuZ3VhZ2VEZXRlY3RvciB9IGZyb20gJy4uL2xhbmcnO1xuaW1wb3J0IHsgR2VvUG9pbnQgfSBmcm9tICcuLi9tYXAvZ2VvcG9pbnQnO1xuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnLi4vbW9kYWwvbW9kYWwuc2VydmljZSc7XG5pbXBvcnQgeyBHZW9sb2NhdGlvblNlcnZpY2UgfSBmcm9tICcuL2dlb2xvY2F0aW9uLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsdXgtZ2VvbG9jYXRpb24nLFxuICB0ZW1wbGF0ZVVybDogJy4vZ2VvbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9nZW9sb2NhdGlvbi5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2VvbG9jYXRpb25Db21wb25lbnQpXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLFxuICAgICAgbXVsdGk6IHRydWUsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBHZW9sb2NhdGlvbkNvbXBvbmVudClcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgR2VvbG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBzdGF0aWMgaWRDb3VudGVyID0gMDtcblxuICBAVmlld0NoaWxkKCdsYXRpdHVkZScsIHsgc3RhdGljOiB0cnVlIH0pIGxhdGl0dWRlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdsb25naXR1ZGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBsb25naXR1ZGU6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ21hcCcsIHsgc3RhdGljOiBmYWxzZSB9KSBtYXA/OiBFbGVtZW50UmVmO1xuXG4gIHRvdWNoZWQgPSBmYWxzZTtcbiAgZGlydHkgPSBmYWxzZTtcbiAgbGFzdEVycm9yczogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgX2Rpc2FibGVkOiBzdHJpbmcgfCBib29sZWFuO1xuICBwcml2YXRlIF9yZXF1aXJlZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfdmFsdWU6IGFueTtcblxuICBsYXRpdHVkZVZhbHVlPzogbnVtYmVyID0gdW5kZWZpbmVkO1xuICBsb25naXR1ZGVWYWx1ZT86IG51bWJlciA9IHVuZGVmaW5lZDtcblxuICBpc1ZhbGlkTnVtYmVyID0gaXNWYWxpZE51bWJlcjtcblxuICBpMThuID0ge1xuICAgIGVuOiB7XG4gICAgICBsYXQ6ICdsYXRpdHVkZScsXG4gICAgICBsb246ICdsb25naXR1ZGUnLFxuICAgICAgc2VsZWN0TG9jYXRpb246ICdTZWxlY3QgbG9jYXRpb24nLFxuICAgICAgbG9jYXRpb246ICdMb2NhdGlvbicsXG4gICAgICBzZWxlY3RBY3Rpb246ICdTZWxlY3QnLFxuICAgICAgY2FuY2VsQWN0aW9uOiAnQ2FuY2VsJyxcbiAgICAgIGNsb3NlQWN0aW9uOiAnQ2xvc2UnLFxuICAgICAgdHlwZVRvU2VhcmNoOiAndHlwZSB0byBzZWFyY2gnLFxuICAgICAgY2FyZGluYWxQb2ludHM6IHtcbiAgICAgICAgbm9ydGg6ICdOJyxcbiAgICAgICAgc291dGg6ICdTJyxcbiAgICAgICAgZWFzdDogJ0UnLFxuICAgICAgICB3ZXN0OiAnVydcbiAgICAgIH0sXG4gICAgICB1c2VyRXJyb3JzOiB7XG4gICAgICAgIHJlcXVpcmVkOiAnUmVxdWlyZWQgZmllbGQuJyxcbiAgICAgICAgbWluTGF0aXR1ZGU6ICdNaW5pbXVtIGxhdGl0dWRlIGlzICRtaW5MYXRpdHVkZS4nLFxuICAgICAgICBtYXhMYXRpdHVkZTogJ01heGltdW0gbGF0aXR1ZGUgaXMgJG1heExhdGl0dWRlLicsXG4gICAgICAgIG1pbkxvbmdpdHVkZTogJ01pbmltdW0gbG9uZ2l0dWRlIGlzICRtaW5Mb25naXR1ZGUuJyxcbiAgICAgICAgbWF4TG9uZ2l0dWRlOiAnTWF4aW11bSBsb25naXR1ZGUgaXMgJG1heExvbmdpdHVkZS4nXG4gICAgICB9XG4gICAgfSxcbiAgICBlczoge1xuICAgICAgbGF0OiAnbGF0aXR1ZCcsXG4gICAgICBsb246ICdsb25naXR1ZCcsXG4gICAgICBzZWxlY3RMb2NhdGlvbjogJ1NlbGVjY2lvbmUgdWJpY2FjacOzbicsXG4gICAgICBsb2NhdGlvbjogJ1ViaWNhY2nDs24nLFxuICAgICAgc2VsZWN0QWN0aW9uOiAnU2VsZWNjaW9uYXInLFxuICAgICAgY2FuY2VsQWN0aW9uOiAnQ2FuY2VsYXInLFxuICAgICAgY2xvc2VBY3Rpb246ICdDZXJyYXInLFxuICAgICAgdHlwZVRvU2VhcmNoOiAnZXNjcmliZSBwYXJhIGJ1c2NhcicsXG4gICAgICBjYXJkaW5hbFBvaW50czoge1xuICAgICAgICBub3J0aDogJ04nLFxuICAgICAgICBzb3V0aDogJ1MnLFxuICAgICAgICBlYXN0OiAnRScsXG4gICAgICAgIHdlc3Q6ICdPJ1xuICAgICAgfSxcbiAgICAgIHVzZXJFcnJvcnM6IHtcbiAgICAgICAgcmVxdWlyZWQ6ICdFbCBjYW1wbyBlcyBvYmxpZ2F0b3Jpby4nLFxuICAgICAgICBtaW5MYXRpdHVkZTogJ0xhIGxhdGl0dWQgbcOtbmltYSBlcyAkbWluTGF0aXR1ZGUuJyxcbiAgICAgICAgbWF4TGF0aXR1ZGU6ICdMYSBsYXRpdHVkIG3DoXhpbWEgZXMgJG1heExhdGl0dWRlLicsXG4gICAgICAgIG1pbkxvbmdpdHVkZTogJ0xhIGxvbmdpdHVkIG3DrW5pbWEgZXMgJG1pbkxvbmdpdHVkZS4nLFxuICAgICAgICBtYXhMb25naXR1ZGU6ICdMYSBsb25naXR1ZCBtw6F4aW1hIGVzICRtYXhMb25naXR1ZGUuJ1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBASW5wdXQoKVxuICBwdWJsaWMgbWluTGF0aXR1ZGU6IG51bWJlcjtcbiAgQElucHV0KClcbiAgcHVibGljIG1heExhdGl0dWRlOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtaW5Mb25naXR1ZGU6IG51bWJlcjtcbiAgQElucHV0KClcbiAgcHVibGljIG1heExvbmdpdHVkZTogbnVtYmVyO1xuICBASW5wdXQoKVxuICBwdWJsaWMgc3RlcDogbnVtYmVyO1xuICBASW5wdXQoKVxuICBwdWJsaWMgem9vbTogbnVtYmVyO1xuXG4gIGdldCBjbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jaGVja0NsYXNzTmFtZSgpO1xuICB9XG5cbiAgQElucHV0KCkgbGFuZyA9IGxhbmd1YWdlRGV0ZWN0b3IoKTtcbiAgQElucHV0KCkgcHVibGljIGlubGluZUVycm9ycyA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgaW5wdXRJZDogc3RyaW5nO1xuICBASW5wdXQoJ2FyaWEtbGFiZWwnKSBwdWJsaWMgYXJpYUxhYmVsOiBzdHJpbmc7XG4gIEBJbnB1dCgpIHB1YmxpYyByZWFkb25seTogYm9vbGVhbiB8IG51bGwgPSBudWxsO1xuXG4gIEBJbnB1dCgpXG4gIHNldCBkaXNhYmxlZCh2OiBzdHJpbmcgfCBib29sZWFuKSB7XG4gICAgdiA9IHR5cGVvZiB2ID09PSAnc3RyaW5nJyAmJiB2ICE9PSAnZmFsc2UnID8gdHJ1ZSA6IHY7XG4gICAgdGhpcy5fZGlzYWJsZWQgPSB2O1xuICB9XG4gIGdldCBkaXNhYmxlZCgpOiBzdHJpbmcgfCBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7XG4gIH1cblxuICBASW5wdXQoKVxuICBzZXQgcmVxdWlyZWQodjogYm9vbGVhbikge1xuICAgIHRoaXMuX3JlcXVpcmVkID0gdjtcbiAgfVxuICBnZXQgcmVxdWlyZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHZhbHVlKHY6IEdlb1BvaW50KSB7XG4gICAgaWYgKHYgPT09IHRoaXMuX3ZhbHVlKSB7XG4gICAgICByZXR1cm47IC8vIHByZXZlbnQgZXZlbnRzIHdoZW4gdGhlcmUgaXMgbm8gY2hhbmdlc1xuICAgIH1cbiAgICBjb25zdCBpbml0aWFsQW5kRW1wdHkgPSBpc0luaXRpYWxBbmRFbXB0eSh0aGlzLl92YWx1ZSwgdik7XG4gICAgaWYgKFxuICAgICAgdiAmJlxuICAgICAgdi5jb29yZGluYXRlcyAmJlxuICAgICAgdi5jb29yZGluYXRlcy5sZW5ndGggPT09IDIgJiZcbiAgICAgIGV4aXN0cyh2LmNvb3JkaW5hdGVzWzBdICYmIGV4aXN0cyh2LmNvb3JkaW5hdGVzWzFdKSlcbiAgICApIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIHRoaXMuc2V0TGF0aXR1ZGVJbkNvbnRyb2wodi5jb29yZGluYXRlc1sxXSk7XG4gICAgICB0aGlzLnNldExvbmdpdHVkZUluQ29udHJvbCh2LmNvb3JkaW5hdGVzWzBdKTtcbiAgICB9IGVsc2UgaWYgKCF2KSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLnNldExhdGl0dWRlSW5Db250cm9sKG51bGwpO1xuICAgICAgdGhpcy5zZXRMb25naXR1ZGVJbkNvbnRyb2wobnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3ZhbHVlID0gdjtcbiAgICAgIC8vIHdlIGRvbid0IHNldCB2YWx1ZSBpbiBjb250cm9sIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWRcbiAgICAgIC8vIGlmIHdlIGRvLCB0aGUgY29udGVudCBvZiB0aGUgY29udHJvbCBjaGFuZ2VzIGFuZCBjYW4gZXJhc2Ugd2hhdCB0aGUgdXNlciBpcyB0eXBpbmdcbiAgICB9XG4gICAgdGhpcy5vbkNoYW5nZSh2KTtcbiAgICBpZiAoIWluaXRpYWxBbmRFbXB0eSkge1xuICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHYpO1xuICAgIH1cbiAgfVxuICBnZXQgdmFsdWUoKTogR2VvUG9pbnQge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBPdXRwdXQoKSB2YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R2VvUG9pbnQ+KCk7XG4gIEBPdXRwdXQoKSBrZXlQcmVzcyA9IG5ldyBFdmVudEVtaXR0ZXI8S2V5Ym9hcmRFdmVudD4oKTtcblxuICBvbkNoYW5nZSA9ICh2YWx1ZTogYW55KTogdm9pZCA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCk6IHZvaWQgPT4ge307XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwdWJsaWMgbG9jYXRpb25TZXJ2aWNlOiBHZW9sb2NhdGlvblNlcnZpY2VcbiAgKSB7fVxuXG4gIC8vIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKG9uQ2hhbmdlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gb25DaGFuZ2U7XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChvblRvdWNoZWQ6IGFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gb25Ub3VjaGVkO1xuICB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMudG91Y2hlZCkge1xuICAgICAgdGhpcy5vblRvdWNoZWQoKTtcbiAgICAgIHRoaXMudG91Y2hlZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgfVxuICAvLyBFbmQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IgSW50ZXJmYWNlIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBzZXRMYXRpdHVkZUluQ29udHJvbChsYXRpdHVkZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gdGhpcy5sYXRpdHVkZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gbGF0aXR1ZGU7XG4gICAgdGhpcy5sYXRpdHVkZVZhbHVlID0gbGF0aXR1ZGU7XG4gIH1cbiAgcHJpdmF0ZSBzZXRMb25naXR1ZGVJbkNvbnRyb2wobG9uZ2l0dWRlOiBudW1iZXIpOiB2b2lkIHtcbiAgICAvLyB0aGlzLmxvbmdpdHVkZS5uYXRpdmVFbGVtZW50LnZhbHVlID0gbG9uZ2l0dWRlO1xuICAgIHRoaXMubG9uZ2l0dWRlVmFsdWUgPSBsb25naXR1ZGU7XG4gIH1cbiAgY2xlYXIoKTogdm9pZCB7XG4gICAgdGhpcy5zZXRMYXRpdHVkZUluQ29udHJvbChudWxsKTtcbiAgICB0aGlzLnNldExvbmdpdHVkZUluQ29udHJvbChudWxsKTtcbiAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgfVxuICBpc0NsZWFyYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKFxuICAgICAgaXNWYWxpZE51bWJlcih0aGlzLmxhdGl0dWRlVmFsdWUpIHx8IGlzVmFsaWROdW1iZXIodGhpcy5sb25naXR1ZGVWYWx1ZSlcbiAgICApO1xuICB9XG5cbiAgLy8gVmFsaWRhdG9yIGludGVyZmFjZVxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKCk6IHZvaWQge31cblxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XG4gICAgY29uc3QgdmFsdWUgPSBjb250cm9sLnZhbHVlO1xuICAgIGxldCByZXN1bHQ6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICAgIGlmIChcbiAgICAgIHRoaXMucmVxdWlyZWQgJiZcbiAgICAgICFoYXNWYWx1ZSh2YWx1ZSkgJiZcbiAgICAgICFleGlzdHModGhpcy5sYXRpdHVkZVZhbHVlKSAmJlxuICAgICAgIWV4aXN0cyh0aGlzLmxvbmdpdHVkZVZhbHVlKVxuICAgICkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LnJlcXVpcmVkID0geyB2YWx1ZSwgcmVhc29uOiAnUmVxdWlyZWQgZmllbGQuJyB9O1xuICAgIH1cbiAgICBpZiAoIWV4aXN0cyh0aGlzLmxhdGl0dWRlVmFsdWUpICYmIGV4aXN0cyh0aGlzLmxvbmdpdHVkZVZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LmV4aXN0c0xhdGl0dWRlID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgcmVhc29uOiAnTGF0aXR1ZGUgbm90IHNwZWNpZmllZC4nXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoZXhpc3RzKHRoaXMubGF0aXR1ZGVWYWx1ZSkgJiYgIWV4aXN0cyh0aGlzLmxvbmdpdHVkZVZhbHVlKSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0LmV4aXN0c0xvbmdpdHVkZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJlYXNvbjogJ0xvbmdpdHVkZSBub3Qgc3BlY2lmaWVkLidcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChleGlzdHModGhpcy5taW5MYXRpdHVkZSkgJiYgdGhpcy5sYXRpdHVkZVZhbHVlIDwgdGhpcy5taW5MYXRpdHVkZSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0Lm1pbkxhdGl0dWRlID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWluOiB0aGlzLm1pbkxhdGl0dWRlLFxuICAgICAgICByZWFzb246IGBMYXRpdHVkZSBpcyBsb3dlciB0aGFuIG1pbmltdW0gdmFsdWU6ICR7dGhpcy5taW5MYXRpdHVkZX0uYFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGV4aXN0cyh0aGlzLm1heExhdGl0dWRlKSAmJiB0aGlzLmxhdGl0dWRlVmFsdWUgPiB0aGlzLm1heExhdGl0dWRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubWF4TGF0aXR1ZGUgPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICBtYXg6IHRoaXMubWF4TGF0aXR1ZGUsXG4gICAgICAgIHJlYXNvbjogYExhdGl0dWRlIGlzIGhpZ2hlciB0aGFuIG1heGltdW0gdmFsdWU6ICR7dGhpcy5tYXhMYXRpdHVkZX0uYFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGV4aXN0cyh0aGlzLm1pbkxvbmdpdHVkZSkgJiYgdGhpcy5sb25naXR1ZGVWYWx1ZSA8IHRoaXMubWluTG9uZ2l0dWRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubWluTG9uZ2l0dWRlID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWluOiB0aGlzLm1pbkxvbmdpdHVkZSxcbiAgICAgICAgcmVhc29uOiBgTG9uZ2l0dWRlIGlzIGxvd2VyIHRoYW4gbWluaW11bSB2YWx1ZTogJHt0aGlzLm1pbkxvbmdpdHVkZX0uYFxuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGV4aXN0cyh0aGlzLm1heExvbmdpdHVkZSkgJiYgdGhpcy5sb25naXR1ZGVWYWx1ZSA+IHRoaXMubWF4TG9uZ2l0dWRlKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHQubWF4TG9uZ2l0dWRlID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWF4OiB0aGlzLm1heExvbmdpdHVkZSxcbiAgICAgICAgcmVhc29uOiBgTG9uZ2l0dWRlIGlzIGhpZ2hlciB0aGFuIG1heGltdW0gdmFsdWU6ICR7dGhpcy5tYXhMb25naXR1ZGV9LmBcbiAgICAgIH07XG4gICAgfVxuICAgIHRoaXMubGFzdEVycm9ycyA9IHJlc3VsdDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIC8vIEVuZCBvZiBWYWxpZGF0b3IgaW50ZXJmYWNlXG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5pbnB1dElkID0gdGhpcy5pbnB1dElkXG4gICAgICA/IHRoaXMuaW5wdXRJZFxuICAgICAgOiBgZ2VvbG9jYXRpb24kJHtHZW9sb2NhdGlvbkNvbXBvbmVudC5pZENvdW50ZXIrK31gO1xuICAgIHRoaXMuc2V0UGF0dGVybnMoKTtcbiAgfVxuXG4gIHJvdW5kVG9TdGVwQW5kVXBkYXRlTGF0aXR1ZGVBbmRMb25naXR1ZGUoXG4gICAgbmV3TGF0aXR1ZGVBbmRMb25naXR1ZGU6IG51bWJlcltdXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG5ld0xhdGl0dWRlID0gcm91bmRUb011bHRpcGxlT2YoXG4gICAgICBuZXdMYXRpdHVkZUFuZExvbmdpdHVkZVsxXSxcbiAgICAgIHRoaXMuc3RlcFxuICAgICk7XG4gICAgY29uc3QgbmV3TG9uZ2l0dWRlID0gcm91bmRUb011bHRpcGxlT2YoXG4gICAgICBuZXdMYXRpdHVkZUFuZExvbmdpdHVkZVswXSxcbiAgICAgIHRoaXMuc3RlcFxuICAgICk7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoIWV4aXN0cyhuZXdMYXRpdHVkZUFuZExvbmdpdHVkZSkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0ge1xuICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbbmV3TG9uZ2l0dWRlLCBuZXdMYXRpdHVkZV1cbiAgICB9O1xuICB9XG5cbiAgb25Mb3N0Rm9jdXMoKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25FdmVudExhdGl0dWRlKG5ld0xhdGl0dWRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCB0aGlzLnJlYWRvbmx5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IG5ld0xhdGl0dWRlVmFsdWUgPSBpc1ZhbGlkTnVtYmVyKG5ld0xhdGl0dWRlKSA/ICtuZXdMYXRpdHVkZSA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgIShleGlzdHModGhpcy52YWx1ZSkgJiYgZXhpc3RzKHRoaXMudmFsdWUuY29vcmRpbmF0ZXNbMF0pKSAmJlxuICAgICAgIWV4aXN0cyhuZXdMYXRpdHVkZVZhbHVlKVxuICAgICkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgICAgdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuY29vcmRpbmF0ZXNbMF0gOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmV3TGF0aXR1ZGVWYWx1ZVxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBvbkV2ZW50TG9uZ2l0dWRlKG5ld0xvbmdpdHVkZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdMb25naXR1ZGVWYWx1ZSA9IGlzVmFsaWROdW1iZXIobmV3TG9uZ2l0dWRlKVxuICAgICAgPyArbmV3TG9uZ2l0dWRlXG4gICAgICA6IG51bGw7XG4gICAgaWYgKFxuICAgICAgIWV4aXN0cyhuZXdMb25naXR1ZGVWYWx1ZSkgJiZcbiAgICAgICEoZXhpc3RzKHRoaXMudmFsdWUpICYmIGV4aXN0cyh0aGlzLl92YWx1ZS5jb29yZGluYXRlc1sxXSkpXG4gICAgKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgICAgdHlwZTogJ1BvaW50JyxcbiAgICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgICBuZXdMb25naXR1ZGVWYWx1ZSxcbiAgICAgICAgICB0aGlzLnZhbHVlID8gdGhpcy52YWx1ZS5jb29yZGluYXRlc1sxXSA6IHVuZGVmaW5lZFxuICAgICAgICBdXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLm1hcmtBc1RvdWNoZWQoKTtcbiAgfVxuICBvbktleVByZXNzKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgdGhpcy5rZXlQcmVzcy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGNoZWNrQ2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuZGlzYWJsZWRcbiAgICAgID8gdGhpcy5yZWFkb25seVxuICAgICAgICA/ICdkaXNhYmxlZCByZWFkb25seSdcbiAgICAgICAgOiAnZGlzYWJsZWQnXG4gICAgICA6IHRoaXMucmVhZG9ubHlcbiAgICAgID8gJ3JlYWRvbmx5J1xuICAgICAgOiAnJztcbiAgfVxuXG4gIG9wZW5Nb2RhbE1hcChtb2RhbDogVGVtcGxhdGVSZWY8YW55Pik6IHZvaWQge1xuICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4obW9kYWwpLnJlc3VsdC50aGVuKFxuICAgICAgKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAnY2FuY2VsJykge1xuICAgICAgICAgIHRoaXMucm91bmRUb1N0ZXBBbmRVcGRhdGVMYXRpdHVkZUFuZExvbmdpdHVkZShyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKF8pID0+IHt9XG4gICAgKTtcbiAgfVxuXG4gIG9uU2VhcmNoTG9jYXRpb25DaGFuZ2VkKG5ld1ZhbHVlOiBHZW9Qb2ludCwgbWFwOiBhbnkpOiB2b2lkIHtcbiAgICBtYXAubWFya2VyUG9pbnQgPSBuZXdWYWx1ZTtcbiAgICBtYXAuY2VudGVyID0gbWFwLm1hcmtlclBvaW50O1xuICB9XG5cbiAgZ2V0IG1hcFRpdGxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkIHx8ICEhdGhpcy5yZWFkb25seVxuICAgICAgPyB0aGlzLmkxOG5bdGhpcy5sYW5nXS5sb2NhdGlvblxuICAgICAgOiB0aGlzLmkxOG5bdGhpcy5sYW5nXS5zZWxlY3RMb2NhdGlvbjtcbiAgfVxuXG4gIGdldCBzZWxmKCk6IEdlb2xvY2F0aW9uQ29tcG9uZW50IHtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIGdldExhYmVscyhcbiAgICBpbnN0YW5jZTogR2VvbG9jYXRpb25Db21wb25lbnQsXG4gICAga2V5czogR2VvUG9pbnRbXVxuICApOiBPYnNlcnZhYmxlPERhdGFTb3VyY2U8R2VvUG9pbnQsIHN0cmluZz4+IHtcbiAgICByZXR1cm4gaW5zdGFuY2UubG9jYXRpb25TZXJ2aWNlLmdldExhYmVscyhpbnN0YW5jZS5sb2NhdGlvblNlcnZpY2UsIGtleXMpO1xuICB9XG5cbiAgZ2V0RGF0YShcbiAgICBpbnN0YW5jZTogR2VvbG9jYXRpb25Db21wb25lbnQsXG4gICAgc2VhcmNoOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxEYXRhU291cmNlPEdlb1BvaW50LCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmxvY2F0aW9uU2VydmljZS5nZXREYXRhKGluc3RhbmNlLmxvY2F0aW9uU2VydmljZSwgc2VhcmNoKTtcbiAgfVxuXG4gIHNldFBhdHRlcm5zKCk6IHZvaWQge1xuICAgIHRoaXMuc3RlcCA9IHRoaXMuc3RlcCB8fCAwLjAwMDAxOyAvLyAwLjAwMDAxIGRlZ3JlZXMgPSAxLjExIG1ldGVyc1xuICAgIHRoaXMuem9vbSA9IHRoaXMuem9vbSB8fCAxODsgLy8gKDM2MC8yXjE4KSBkZWdyZWVzIH4gMC4wMDEzNyBkZWdyZWVzIH4gMTUzIG1ldGVyc1xuICAgIHRoaXMubWluTGF0aXR1ZGUgPSB0aGlzLm1pbkxhdGl0dWRlIHx8IC05MDtcbiAgICB0aGlzLm1heExhdGl0dWRlID0gdGhpcy5tYXhMYXRpdHVkZSB8fCArOTA7XG4gICAgdGhpcy5taW5Mb25naXR1ZGUgPSB0aGlzLm1pbkxvbmdpdHVkZSB8fCAtMTgwO1xuICAgIHRoaXMubWF4TG9uZ2l0dWRlID0gdGhpcy5tYXhMb25naXR1ZGUgfHwgKzE4MDtcbiAgfVxufVxuIiwiPGlucHV0XG4gICNsYXRpdHVkZVxuICBjbGFzcz1cInJvdW5kZWQtbGVmdCBwcmVmaXhcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICB0eXBlPVwibnVtYmVyXCJcbiAgW2lkXT1cImlucHV0SWQgKyAnJGxhdGl0dWRlJ1wiXG4gIFsobmdNb2RlbCldPVwibGF0aXR1ZGVWYWx1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLm1pbl09XCJcbiAgICBtaW5MYXRpdHVkZSAhPT0gdW5kZWZpbmVkICYmIG1pbkxhdGl0dWRlICE9PSBudWxsXG4gICAgICA/IG1pbkxhdGl0dWRlLnRvU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkXG4gIFwiXG4gIFthdHRyLm1heF09XCJcbiAgICBtYXhMYXRpdHVkZSAhPT0gdW5kZWZpbmVkICYmIG1heExhdGl0dWRlICE9PSBudWxsXG4gICAgICA/IG1heExhdGl0dWRlLnRvU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkXG4gIFwiXG4gIFthdHRyLnN0ZXBdPVwiXG4gICAgc3RlcCAhPT0gdW5kZWZpbmVkICYmIHN0ZXAgIT09IG51bGwgPyBzdGVwLnRvU3RyaW5nKCkgOiB1bmRlZmluZWRcbiAgXCJcbiAgW3BsYWNlaG9sZGVyXT1cImkxOG5bbGFuZ10ubGF0XCJcbiAgKGtleXVwKT1cIm9uRXZlbnRMYXRpdHVkZShsYXRpdHVkZS52YWx1ZSlcIlxuICAoY2hhbmdlKT1cIm9uRXZlbnRMYXRpdHVkZShsYXRpdHVkZS52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4vPlxuPGRpdlxuICBjbGFzcz1cImluZml4IHN5bWJvbCBtb25vc3BhY2UgY2xpY2thYmxlXCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgKGNsaWNrKT1cIm9wZW5Nb2RhbE1hcChtb2RhbE1hcClcIj5cbiAgPHNwYW4gKm5nSWY9XCJpc1ZhbGlkTnVtYmVyKGxhdGl0dWRlVmFsdWUpICYmIGxhdGl0dWRlVmFsdWUgPj0gMFwiPnt7XG4gICAgaTE4bltsYW5nXS5jYXJkaW5hbFBvaW50cy5ub3J0aFxuICB9fTwvc3Bhbj5cbiAgPHNwYW4gKm5nSWY9XCJpc1ZhbGlkTnVtYmVyKGxhdGl0dWRlVmFsdWUpICYmIGxhdGl0dWRlVmFsdWUgPCAwXCI+e3tcbiAgICBpMThuW2xhbmddLmNhcmRpbmFsUG9pbnRzLnNvdXRoXG4gIH19PC9zcGFuPlxuICA8c3BhbiAqbmdJZj1cIiFpc1ZhbGlkTnVtYmVyKGxhdGl0dWRlVmFsdWUpXCI+LTwvc3Bhbj5cbjwvZGl2PlxuPGlucHV0XG4gICNsb25naXR1ZGVcbiAgY2xhc3M9XCJwcmVmaXhcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICB0eXBlPVwibnVtYmVyXCJcbiAgW2lkXT1cImlucHV0SWQgKyAnJGxvbmdpdHVkZSdcIlxuICBbKG5nTW9kZWwpXT1cImxvbmdpdHVkZVZhbHVlXCJcbiAgW2F0dHIuYXJpYS1sYWJlbF09XCJhcmlhTGFiZWxcIlxuICBbYXR0ci5kaXNhYmxlZF09XCJkaXNhYmxlZCA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLnJlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIubWluXT1cIlxuICAgIG1pbkxvbmdpdHVkZSAhPT0gdW5kZWZpbmVkICYmIG1pbkxvbmdpdHVkZSAhPT0gbnVsbFxuICAgICAgPyBtaW5Mb25naXR1ZGUudG9TdHJpbmcoKVxuICAgICAgOiB1bmRlZmluZWRcbiAgXCJcbiAgW2F0dHIubWF4XT1cIlxuICAgIG1heExvbmdpdHVkZSAhPT0gdW5kZWZpbmVkICYmIG1heExvbmdpdHVkZSAhPT0gbnVsbFxuICAgICAgPyBtYXhMb25naXR1ZGUudG9TdHJpbmcoKVxuICAgICAgOiB1bmRlZmluZWRcbiAgXCJcbiAgW2F0dHIuc3RlcF09XCJcbiAgICBzdGVwICE9PSB1bmRlZmluZWQgJiYgc3RlcCAhPT0gbnVsbCA/IHN0ZXAudG9TdHJpbmcoKSA6IHVuZGVmaW5lZFxuICBcIlxuICBbcGxhY2Vob2xkZXJdPVwiaTE4bltsYW5nXS5sb25cIlxuICAoa2V5dXApPVwib25FdmVudExvbmdpdHVkZShsb25naXR1ZGUudmFsdWUpXCJcbiAgKGNoYW5nZSk9XCJvbkV2ZW50TG9uZ2l0dWRlKGxvbmdpdHVkZS52YWx1ZSlcIlxuICAoa2V5cHJlc3MpPVwib25LZXlQcmVzcygkZXZlbnQpXCJcbiAgKGJsdXIpPVwib25Mb3N0Rm9jdXMoKVwiXG4vPlxuPGRpdlxuICBjbGFzcz1cImluZml4IHN5bWJvbCBtb25vc3BhY2UgY2xpY2thYmxlXCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgKGNsaWNrKT1cIm9wZW5Nb2RhbE1hcChtb2RhbE1hcClcIlxuPlxuICA8c3BhbiAqbmdJZj1cImlzVmFsaWROdW1iZXIobG9uZ2l0dWRlVmFsdWUpICYmIGxvbmdpdHVkZVZhbHVlID49IDBcIj57e1xuICAgIGkxOG5bbGFuZ10uY2FyZGluYWxQb2ludHMuZWFzdFxuICB9fTwvc3Bhbj5cbiAgPHNwYW4gKm5nSWY9XCJpc1ZhbGlkTnVtYmVyKGxvbmdpdHVkZVZhbHVlKSAmJiBsb25naXR1ZGVWYWx1ZSA8IDBcIj57e1xuICAgIGkxOG5bbGFuZ10uY2FyZGluYWxQb2ludHMud2VzdFxuICB9fTwvc3Bhbj5cbiAgPHNwYW4gKm5nSWY9XCIhaXNWYWxpZE51bWJlcihsb25naXR1ZGVWYWx1ZSlcIj4tPC9zcGFuPlxuPC9kaXY+XG48ZGl2XG4gIFtjbGFzc109XCJcbiAgICBkaXNhYmxlZCB8fCByZWFkb25seSB8fCAhaXNDbGVhcmFibGUoKVxuICAgICAgPyAnY2xpY2thYmxlIHJvdW5kZWQtcmlnaHQgcG9zdGZpeCBzeW1ib2wnXG4gICAgICA6ICdjbGlja2FibGUgcG9zdGZpeCBzeW1ib2wnXG4gIFwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIChjbGljayk9XCJvcGVuTW9kYWxNYXAobW9kYWxNYXApXCJcbj5cbiAgPHNwYW4gY2xhc3M9XCJpY29uLWdsb2JlXCI+PC9zcGFuPlxuPC9kaXY+XG48YnV0dG9uXG4gICNjbGVhckJ1dHRvblxuICAqbmdJZj1cIiFkaXNhYmxlZCAmJiAhcmVhZG9ubHkgJiYgaXNDbGVhcmFibGUoKVwiXG4gIGNsYXNzPVwicm91bmRlZC1yaWdodCBwb3N0Zml4IGJvcmRlcmVkIGljb24gaWNvbi1jbGVhclwiXG4gIFtpZF09XCJpbnB1dElkICsgJyRjbGVhcidcIlxuICB0eXBlPVwiYnV0dG9uXCJcbiAgKGNsaWNrKT1cImNsZWFyKClcIlxuICBhcmlhLWxhYmVsPVwiY2xlYXJcIlxuPjwvYnV0dG9uPlxuXG48ZGl2ICpuZ0lmPVwiaW5saW5lRXJyb3JzICYmIGxhc3RFcnJvcnMgJiYgKGRpcnR5IHx8IHRvdWNoZWQpXCIgY2xhc3M9XCJhbGVydFwiPlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5yZXF1aXJlZFwiPlxuICAgIHt7IGkxOG5bbGFuZ10udXNlckVycm9ycy5yZXF1aXJlZCB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMubWluTGF0aXR1ZGVcIj5cbiAgICB7e1xuICAgICAgaTE4bltsYW5nXS51c2VyRXJyb3JzLm1pbkxhdGl0dWRlLnJlcGxhY2UoXG4gICAgICAgICckbWluTGF0aXR1ZGUnLFxuICAgICAgICBsYXN0RXJyb3JzLm1pbkxhdGl0dWRlLm1pblxuICAgICAgKVxuICAgIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5tYXhMYXRpdHVkZVwiPlxuICAgIHt7XG4gICAgICBpMThuW2xhbmddLnVzZXJFcnJvcnMubWF4TGF0aXR1ZGUucmVwbGFjZShcbiAgICAgICAgJyRtYXhMYXRpdHVkZScsXG4gICAgICAgIGxhc3RFcnJvcnMubWF4TGF0aXR1ZGUubWF4XG4gICAgICApXG4gICAgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1pbkxvbmdpdHVkZVwiPlxuICAgIHt7XG4gICAgICBpMThuW2xhbmddLnVzZXJFcnJvcnMubWluTG9uZ2l0dWRlLnJlcGxhY2UoXG4gICAgICAgICckbWluTG9uZ2l0dWRlJyxcbiAgICAgICAgbGFzdEVycm9ycy5taW5Mb25naXR1ZGUubWluXG4gICAgICApXG4gICAgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1heExvbmdpdHVkZVwiPlxuICAgIHt7XG4gICAgICBpMThuW2xhbmddLnVzZXJFcnJvcnMubWF4TG9uZ2l0dWRlLnJlcGxhY2UoXG4gICAgICAgICckbWF4TG9uZ2l0dWRlJyxcbiAgICAgICAgbGFzdEVycm9ycy5tYXhMb25naXR1ZGUubWF4XG4gICAgICApXG4gICAgfX1cbiAgPC9kaXY+XG48L2Rpdj5cblxuPG5nLXRlbXBsYXRlICNtb2RhbE1hcCBsZXQtbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJsdXgtbW9kYWwtaGVhZGVyXCI+XG4gICAgPGg0IGNsYXNzPVwibW9kYWwtdGl0bGUgZGVmYXVsdC1mb250XCIgaWQ9XCJtb2RhbC1iYXNpYy10aXRsZVwiPnt7IG1hcFRpdGxlIH19PC9oND5cbiAgICA8YnV0dG9uXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiY2xvc2VcIlxuICAgICAgYXJpYS1sYWJlbD1cIkNsb3NlXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKCdDcm9zcyBjbGljaycpXCJcbiAgICA+XG4gICAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIj7Dlzwvc3Bhbj5cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJsdXgtbW9kYWwtYm9keSBjb250ZW50XCI+XG4gICAgPGx1eC1hdXRvY29tcGxldGVcbiAgICAgICNzZWFyY2hCYXJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiaTE4bltsYW5nXS50eXBlVG9TZWFyY2hcIlxuICAgICAgW3BsYWNlaG9sZGVyXT1cImkxOG5bbGFuZ10udHlwZVRvU2VhcmNoXCJcbiAgICAgICpuZ0lmPVwiIWRpc2FibGVkICYmICFyZWFkb25seVwiXG4gICAgICBbaW5zdGFuY2VdPVwic2VsZlwiXG4gICAgICBbcmVzb2x2ZUxhYmVsc0Z1bmN0aW9uXT1cImdldExhYmVsc1wiXG4gICAgICBbcG9wdWxhdGVGdW5jdGlvbl09XCJnZXREYXRhXCJcbiAgICAgICh2YWx1ZUNoYW5nZSk9XCJvblNlYXJjaExvY2F0aW9uQ2hhbmdlZChzZWFyY2hCYXIudmFsdWUsIG1hcClcIlxuICAgID48L2x1eC1hdXRvY29tcGxldGU+XG4gICAgPGRpdiBjbGFzcz1cIm1hcC1jb250YWluZXJcIj5cbiAgICAgIDxsdXgtbWFwXG4gICAgICAgICNtYXBcbiAgICAgICAgW2NlbnRlcl09XCJ2YWx1ZVwiXG4gICAgICAgIFttYXJrZXJQb2ludF09XCJ2YWx1ZVwiXG4gICAgICAgIFt6b29tXT1cInpvb21cIlxuICAgICAgICBbcmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgfHwgZGlzYWJsZWQgPT09IHRydWUgPyB0cnVlIDogZmFsc2VcIlxuICAgICAgPjwvbHV4LW1hcD5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJsdXgtbW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCJkaXNhYmxlZCB8fCByZWFkb25seVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1jYW5jZWxcIlxuICAgICAgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKCdjYW5jZWwnKVwiXG4gICAgPlxuICAgICAge3sgaTE4bltsYW5nXS5jbG9zZUFjdGlvbiB9fVxuICAgIDwvYnV0dG9uPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiIWRpc2FibGVkICYmICFyZWFkb25seVwiXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgIGNsYXNzPVwiYnRuIGJ0bi1jYW5jZWxcIlxuICAgICAgKGNsaWNrKT1cIm1vZGFsLmNsb3NlKCdjYW5jZWwnKVwiXG4gICAgPlxuICAgICAge3sgaTE4bltsYW5nXS5jYW5jZWxBY3Rpb24gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cIiFkaXNhYmxlZCAmJiAhcmVhZG9ubHlcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tc2VsZWN0XCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5jbG9zZShtYXAubWFya2VyUG9pbnQuY29vcmRpbmF0ZXMpXCJcbiAgICA+XG4gICAgICB7eyBpMThuW2xhbmddLnNlbGVjdEFjdGlvbiB9fVxuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
1
|
+
import { Component, ElementRef, EventEmitter, forwardRef, Input, Output, ViewChild } from '@angular/core';
|
|
2
|
+
import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
3
|
+
import { exists, hasValue, isInitialAndEmpty, isValidNumber, roundToMultipleOf } from '../helperFns';
|
|
4
|
+
import { languageDetector } from '../lang';
|
|
5
|
+
import { ModalService } from '../modal/modal.service';
|
|
6
|
+
import { GeolocationService } from './geolocation.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
import * as i1 from "../modal/modal.service";
|
|
9
|
+
import * as i2 from "./geolocation.service";
|
|
10
|
+
import * as i3 from "@angular/forms";
|
|
11
|
+
import * as i4 from "@angular/common";
|
|
12
|
+
import * as i5 from "../autocomplete/autocomplete.component";
|
|
13
|
+
import * as i6 from "../map/map.component";
|
|
14
|
+
export class GeolocationComponent {
|
|
15
|
+
modalService;
|
|
16
|
+
locationService;
|
|
17
|
+
static idCounter = 0;
|
|
18
|
+
latitude;
|
|
19
|
+
longitude;
|
|
20
|
+
map;
|
|
21
|
+
touched = false;
|
|
22
|
+
dirty = false;
|
|
23
|
+
lastErrors = null;
|
|
24
|
+
_disabled;
|
|
25
|
+
_required;
|
|
26
|
+
_value;
|
|
27
|
+
latitudeValue = undefined;
|
|
28
|
+
longitudeValue = undefined;
|
|
29
|
+
isValidNumber = isValidNumber;
|
|
30
|
+
i18n = {
|
|
31
|
+
en: {
|
|
32
|
+
lat: 'latitude',
|
|
33
|
+
lon: 'longitude',
|
|
34
|
+
selectLocation: 'Select location',
|
|
35
|
+
location: 'Location',
|
|
36
|
+
selectAction: 'Select',
|
|
37
|
+
cancelAction: 'Cancel',
|
|
38
|
+
closeAction: 'Close',
|
|
39
|
+
typeToSearch: 'type to search',
|
|
40
|
+
cardinalPoints: {
|
|
41
|
+
north: 'N',
|
|
42
|
+
south: 'S',
|
|
43
|
+
east: 'E',
|
|
44
|
+
west: 'W'
|
|
45
|
+
},
|
|
46
|
+
userErrors: {
|
|
47
|
+
required: 'Required field.',
|
|
48
|
+
minLatitude: 'Minimum latitude is $minLatitude.',
|
|
49
|
+
maxLatitude: 'Maximum latitude is $maxLatitude.',
|
|
50
|
+
minLongitude: 'Minimum longitude is $minLongitude.',
|
|
51
|
+
maxLongitude: 'Maximum longitude is $maxLongitude.'
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
es: {
|
|
55
|
+
lat: 'latitud',
|
|
56
|
+
lon: 'longitud',
|
|
57
|
+
selectLocation: 'Seleccione ubicación',
|
|
58
|
+
location: 'Ubicación',
|
|
59
|
+
selectAction: 'Seleccionar',
|
|
60
|
+
cancelAction: 'Cancelar',
|
|
61
|
+
closeAction: 'Cerrar',
|
|
62
|
+
typeToSearch: 'escribe para buscar',
|
|
63
|
+
cardinalPoints: {
|
|
64
|
+
north: 'N',
|
|
65
|
+
south: 'S',
|
|
66
|
+
east: 'E',
|
|
67
|
+
west: 'O'
|
|
68
|
+
},
|
|
69
|
+
userErrors: {
|
|
70
|
+
required: 'El campo es obligatorio.',
|
|
71
|
+
minLatitude: 'La latitud mínima es $minLatitude.',
|
|
72
|
+
maxLatitude: 'La latitud máxima es $maxLatitude.',
|
|
73
|
+
minLongitude: 'La longitud mínima es $minLongitude.',
|
|
74
|
+
maxLongitude: 'La longitud máxima es $maxLongitude.'
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
minLatitude;
|
|
79
|
+
maxLatitude;
|
|
80
|
+
minLongitude;
|
|
81
|
+
maxLongitude;
|
|
82
|
+
step;
|
|
83
|
+
zoom;
|
|
84
|
+
get className() {
|
|
85
|
+
return this.checkClassName();
|
|
86
|
+
}
|
|
87
|
+
lang = languageDetector();
|
|
88
|
+
inlineErrors = false;
|
|
89
|
+
inputId;
|
|
90
|
+
ariaLabel;
|
|
91
|
+
readonly = null;
|
|
92
|
+
set disabled(v) {
|
|
93
|
+
v = typeof v === 'string' && v !== 'false' ? true : v;
|
|
94
|
+
this._disabled = v;
|
|
95
|
+
}
|
|
96
|
+
get disabled() {
|
|
97
|
+
return this._disabled;
|
|
98
|
+
}
|
|
99
|
+
set required(v) {
|
|
100
|
+
this._required = v;
|
|
101
|
+
}
|
|
102
|
+
get required() {
|
|
103
|
+
return this._required;
|
|
104
|
+
}
|
|
105
|
+
set value(v) {
|
|
106
|
+
if (v === this._value) {
|
|
107
|
+
return; // prevent events when there is no changes
|
|
108
|
+
}
|
|
109
|
+
const initialAndEmpty = isInitialAndEmpty(this._value, v);
|
|
110
|
+
if (v &&
|
|
111
|
+
v.coordinates &&
|
|
112
|
+
v.coordinates.length === 2 &&
|
|
113
|
+
exists(v.coordinates[0] && exists(v.coordinates[1]))) {
|
|
114
|
+
this._value = v;
|
|
115
|
+
this.setLatitudeInControl(v.coordinates[1]);
|
|
116
|
+
this.setLongitudeInControl(v.coordinates[0]);
|
|
117
|
+
}
|
|
118
|
+
else if (!v) {
|
|
119
|
+
this._value = null;
|
|
120
|
+
this.setLatitudeInControl(null);
|
|
121
|
+
this.setLongitudeInControl(null);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
this._value = v;
|
|
125
|
+
// we don't set value in control if the value is not valid
|
|
126
|
+
// if we do, the content of the control changes and can erase what the user is typing
|
|
127
|
+
}
|
|
128
|
+
this.onChange(v);
|
|
129
|
+
if (!initialAndEmpty) {
|
|
130
|
+
this.valueChange.emit(v);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
get value() {
|
|
134
|
+
return this._value;
|
|
135
|
+
}
|
|
136
|
+
valueChange = new EventEmitter();
|
|
137
|
+
keyPress = new EventEmitter();
|
|
138
|
+
onChange = (value) => { };
|
|
139
|
+
onTouched = () => { };
|
|
140
|
+
constructor(modalService, locationService) {
|
|
141
|
+
this.modalService = modalService;
|
|
142
|
+
this.locationService = locationService;
|
|
143
|
+
}
|
|
144
|
+
// ControlValueAccessor Interface implementation
|
|
145
|
+
writeValue(value) {
|
|
146
|
+
this.value = value;
|
|
147
|
+
}
|
|
148
|
+
registerOnChange(onChange) {
|
|
149
|
+
this.onChange = onChange;
|
|
150
|
+
}
|
|
151
|
+
registerOnTouched(onTouched) {
|
|
152
|
+
this.onTouched = onTouched;
|
|
153
|
+
}
|
|
154
|
+
markAsTouched() {
|
|
155
|
+
if (!this.touched) {
|
|
156
|
+
this.onTouched();
|
|
157
|
+
this.touched = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
setDisabledState(disabled) {
|
|
161
|
+
this.disabled = disabled;
|
|
162
|
+
}
|
|
163
|
+
// End of ControlValueAccessor Interface implementation
|
|
164
|
+
setLatitudeInControl(latitude) {
|
|
165
|
+
// this.latitude.nativeElement.value = latitude;
|
|
166
|
+
this.latitudeValue = latitude;
|
|
167
|
+
}
|
|
168
|
+
setLongitudeInControl(longitude) {
|
|
169
|
+
// this.longitude.nativeElement.value = longitude;
|
|
170
|
+
this.longitudeValue = longitude;
|
|
171
|
+
}
|
|
172
|
+
clear() {
|
|
173
|
+
this.setLatitudeInControl(null);
|
|
174
|
+
this.setLongitudeInControl(null);
|
|
175
|
+
this.value = null;
|
|
176
|
+
}
|
|
177
|
+
isClearable() {
|
|
178
|
+
return (isValidNumber(this.latitudeValue) || isValidNumber(this.longitudeValue));
|
|
179
|
+
}
|
|
180
|
+
// Validator interface
|
|
181
|
+
registerOnValidatorChange() { }
|
|
182
|
+
validate(control) {
|
|
183
|
+
const value = control.value;
|
|
184
|
+
let result = null;
|
|
185
|
+
if (this.required &&
|
|
186
|
+
!hasValue(value) &&
|
|
187
|
+
!exists(this.latitudeValue) &&
|
|
188
|
+
!exists(this.longitudeValue)) {
|
|
189
|
+
result = result || {};
|
|
190
|
+
result.required = { value, reason: 'Required field.' };
|
|
191
|
+
}
|
|
192
|
+
if (!exists(this.latitudeValue) && exists(this.longitudeValue)) {
|
|
193
|
+
result = result || {};
|
|
194
|
+
result.existsLatitude = {
|
|
195
|
+
value,
|
|
196
|
+
reason: 'Latitude not specified.'
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (exists(this.latitudeValue) && !exists(this.longitudeValue)) {
|
|
200
|
+
result = result || {};
|
|
201
|
+
result.existsLongitude = {
|
|
202
|
+
value,
|
|
203
|
+
reason: 'Longitude not specified.'
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
if (exists(this.minLatitude) && this.latitudeValue < this.minLatitude) {
|
|
207
|
+
result = result || {};
|
|
208
|
+
result.minLatitude = {
|
|
209
|
+
value,
|
|
210
|
+
min: this.minLatitude,
|
|
211
|
+
reason: `Latitude is lower than minimum value: ${this.minLatitude}.`
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
if (exists(this.maxLatitude) && this.latitudeValue > this.maxLatitude) {
|
|
215
|
+
result = result || {};
|
|
216
|
+
result.maxLatitude = {
|
|
217
|
+
value,
|
|
218
|
+
max: this.maxLatitude,
|
|
219
|
+
reason: `Latitude is higher than maximum value: ${this.maxLatitude}.`
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
if (exists(this.minLongitude) && this.longitudeValue < this.minLongitude) {
|
|
223
|
+
result = result || {};
|
|
224
|
+
result.minLongitude = {
|
|
225
|
+
value,
|
|
226
|
+
min: this.minLongitude,
|
|
227
|
+
reason: `Longitude is lower than minimum value: ${this.minLongitude}.`
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
if (exists(this.maxLongitude) && this.longitudeValue > this.maxLongitude) {
|
|
231
|
+
result = result || {};
|
|
232
|
+
result.maxLongitude = {
|
|
233
|
+
value,
|
|
234
|
+
max: this.maxLongitude,
|
|
235
|
+
reason: `Longitude is higher than maximum value: ${this.maxLongitude}.`
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
this.lastErrors = result;
|
|
239
|
+
return result;
|
|
240
|
+
}
|
|
241
|
+
// End of Validator interface
|
|
242
|
+
ngOnInit() {
|
|
243
|
+
this.inputId = this.inputId
|
|
244
|
+
? this.inputId
|
|
245
|
+
: `geolocation$${GeolocationComponent.idCounter++}`;
|
|
246
|
+
this.setPatterns();
|
|
247
|
+
}
|
|
248
|
+
roundToStepAndUpdateLatitudeAndLongitude(newLatitudeAndLongitude) {
|
|
249
|
+
const newLatitude = roundToMultipleOf(newLatitudeAndLongitude[1], this.step);
|
|
250
|
+
const newLongitude = roundToMultipleOf(newLatitudeAndLongitude[0], this.step);
|
|
251
|
+
if (this.disabled || this.readonly) {
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
if (!exists(newLatitudeAndLongitude)) {
|
|
255
|
+
this.value = null;
|
|
256
|
+
}
|
|
257
|
+
this.value = {
|
|
258
|
+
type: 'Point',
|
|
259
|
+
coordinates: [newLongitude, newLatitude]
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
onLostFocus() {
|
|
263
|
+
this.markAsTouched();
|
|
264
|
+
}
|
|
265
|
+
onEventLatitude(newLatitude) {
|
|
266
|
+
if (this.disabled || this.readonly) {
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
const newLatitudeValue = isValidNumber(newLatitude) ? +newLatitude : null;
|
|
270
|
+
if (!(exists(this.value) && exists(this.value.coordinates[0])) &&
|
|
271
|
+
!exists(newLatitudeValue)) {
|
|
272
|
+
this.value = null;
|
|
273
|
+
}
|
|
274
|
+
else {
|
|
275
|
+
this.value = {
|
|
276
|
+
type: 'Point',
|
|
277
|
+
coordinates: [
|
|
278
|
+
this.value ? this.value.coordinates[0] : undefined,
|
|
279
|
+
newLatitudeValue
|
|
280
|
+
]
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
this.markAsTouched();
|
|
284
|
+
}
|
|
285
|
+
onEventLongitude(newLongitude) {
|
|
286
|
+
if (this.disabled || this.readonly) {
|
|
287
|
+
return;
|
|
288
|
+
}
|
|
289
|
+
const newLongitudeValue = isValidNumber(newLongitude)
|
|
290
|
+
? +newLongitude
|
|
291
|
+
: null;
|
|
292
|
+
if (!exists(newLongitudeValue) &&
|
|
293
|
+
!(exists(this.value) && exists(this._value.coordinates[1]))) {
|
|
294
|
+
this.value = null;
|
|
295
|
+
}
|
|
296
|
+
else {
|
|
297
|
+
this.value = {
|
|
298
|
+
type: 'Point',
|
|
299
|
+
coordinates: [
|
|
300
|
+
newLongitudeValue,
|
|
301
|
+
this.value ? this.value.coordinates[1] : undefined
|
|
302
|
+
]
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
this.markAsTouched();
|
|
306
|
+
}
|
|
307
|
+
onKeyPress(event) {
|
|
308
|
+
this.keyPress.emit(event);
|
|
309
|
+
}
|
|
310
|
+
checkClassName() {
|
|
311
|
+
return this.disabled
|
|
312
|
+
? this.readonly
|
|
313
|
+
? 'disabled readonly'
|
|
314
|
+
: 'disabled'
|
|
315
|
+
: this.readonly
|
|
316
|
+
? 'readonly'
|
|
317
|
+
: '';
|
|
318
|
+
}
|
|
319
|
+
openModalMap(modal) {
|
|
320
|
+
this.modalService.open(modal).result.then((result) => {
|
|
321
|
+
if (result !== 'cancel') {
|
|
322
|
+
this.roundToStepAndUpdateLatitudeAndLongitude(result);
|
|
323
|
+
}
|
|
324
|
+
}, (_) => { });
|
|
325
|
+
}
|
|
326
|
+
onSearchLocationChanged(newValue, map) {
|
|
327
|
+
map.markerPoint = newValue;
|
|
328
|
+
map.center = map.markerPoint;
|
|
329
|
+
}
|
|
330
|
+
get mapTitle() {
|
|
331
|
+
return this._disabled || !!this.readonly
|
|
332
|
+
? this.i18n[this.lang].location
|
|
333
|
+
: this.i18n[this.lang].selectLocation;
|
|
334
|
+
}
|
|
335
|
+
get self() {
|
|
336
|
+
return this;
|
|
337
|
+
}
|
|
338
|
+
getLabels(instance, keys) {
|
|
339
|
+
return instance.locationService.getLabels(instance.locationService, keys);
|
|
340
|
+
}
|
|
341
|
+
getData(instance, search) {
|
|
342
|
+
return instance.locationService.getData(instance.locationService, search);
|
|
343
|
+
}
|
|
344
|
+
setPatterns() {
|
|
345
|
+
this.step = this.step || 0.00001; // 0.00001 degrees = 1.11 meters
|
|
346
|
+
this.zoom = this.zoom || 18; // (360/2^18) degrees ~ 0.00137 degrees ~ 153 meters
|
|
347
|
+
this.minLatitude = this.minLatitude || -90;
|
|
348
|
+
this.maxLatitude = this.maxLatitude || +90;
|
|
349
|
+
this.minLongitude = this.minLongitude || -180;
|
|
350
|
+
this.maxLongitude = this.maxLongitude || +180;
|
|
351
|
+
}
|
|
352
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: GeolocationComponent, deps: [{ token: i1.ModalService }, { token: i2.GeolocationService }], target: i0.ɵɵFactoryTarget.Component });
|
|
353
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.0.2", type: GeolocationComponent, selector: "lux-geolocation", inputs: { minLatitude: "minLatitude", maxLatitude: "maxLatitude", minLongitude: "minLongitude", maxLongitude: "maxLongitude", step: "step", zoom: "zoom", lang: "lang", inlineErrors: "inlineErrors", inputId: "inputId", ariaLabel: ["aria-label", "ariaLabel"], readonly: "readonly", disabled: "disabled", required: "required", value: "value" }, outputs: { valueChange: "valueChange", keyPress: "keyPress" }, providers: [
|
|
354
|
+
{
|
|
355
|
+
provide: NG_VALUE_ACCESSOR,
|
|
356
|
+
multi: true,
|
|
357
|
+
useExisting: forwardRef(() => GeolocationComponent)
|
|
358
|
+
},
|
|
359
|
+
{
|
|
360
|
+
provide: NG_VALIDATORS,
|
|
361
|
+
multi: true,
|
|
362
|
+
useExisting: forwardRef(() => GeolocationComponent)
|
|
363
|
+
}
|
|
364
|
+
], viewQueries: [{ propertyName: "latitude", first: true, predicate: ["latitude"], descendants: true, static: true }, { propertyName: "longitude", first: true, predicate: ["longitude"], descendants: true, static: true }, { propertyName: "map", first: true, predicate: ["map"], descendants: true }], ngImport: i0, template: "<input\n #latitude\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$latitude'\"\n [(ngModel)]=\"latitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLatitude !== undefined && minLatitude !== null\n ? minLatitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLatitude !== undefined && maxLatitude !== null\n ? maxLatitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lat\"\n (keyup)=\"onEventLatitude(latitude.value)\"\n (change)=\"onEventLatitude(latitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\">\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.north\n }}</span>\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue < 0\">{{\n i18n[lang].cardinalPoints.south\n }}</span>\n <span *ngIf=\"!isValidNumber(latitudeValue)\">-</span>\n</div>\n<input\n #longitude\n class=\"prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$longitude'\"\n [(ngModel)]=\"longitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLongitude !== undefined && minLongitude !== null\n ? minLongitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLongitude !== undefined && maxLongitude !== null\n ? maxLongitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lon\"\n (keyup)=\"onEventLongitude(longitude.value)\"\n (change)=\"onEventLongitude(longitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.east\n }}</span>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue < 0\">{{\n i18n[lang].cardinalPoints.west\n }}</span>\n <span *ngIf=\"!isValidNumber(longitudeValue)\">-</span>\n</div>\n<div\n [class]=\"\n disabled || readonly || !isClearable()\n ? 'clickable rounded-right postfix symbol'\n : 'clickable postfix symbol'\n \"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span class=\"icon-globe\"></span>\n</div>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n class=\"rounded-right postfix bordered icon icon-clear\"\n [id]=\"inputId + '$clear'\"\n type=\"button\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ i18n[lang].userErrors.required }}\n </div>\n <div *ngIf=\"lastErrors.minLatitude\">\n {{\n i18n[lang].userErrors.minLatitude.replace(\n '$minLatitude',\n lastErrors.minLatitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLatitude\">\n {{\n i18n[lang].userErrors.maxLatitude.replace(\n '$maxLatitude',\n lastErrors.maxLatitude.max\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.minLongitude\">\n {{\n i18n[lang].userErrors.minLongitude.replace(\n '$minLongitude',\n lastErrors.minLongitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLongitude\">\n {{\n i18n[lang].userErrors.maxLongitude.replace(\n '$maxLongitude',\n lastErrors.maxLongitude.max\n )\n }}\n </div>\n</div>\n\n<ng-template #modalMap let-modal>\n <div class=\"lux-modal-header\">\n <h4 class=\"modal-title default-font\" id=\"modal-basic-title\">{{ mapTitle }}</h4>\n <button\n type=\"button\"\n class=\"close\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss('Cross click')\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n </div>\n <div class=\"lux-modal-body content\">\n <lux-autocomplete\n #searchBar\n [attr.aria-label]=\"i18n[lang].typeToSearch\"\n [placeholder]=\"i18n[lang].typeToSearch\"\n *ngIf=\"!disabled && !readonly\"\n [instance]=\"self\"\n [resolveLabelsFunction]=\"getLabels\"\n [populateFunction]=\"getData\"\n (valueChange)=\"onSearchLocationChanged(searchBar.value, map)\"\n ></lux-autocomplete>\n <div class=\"map-container\">\n <lux-map\n #map\n [center]=\"value\"\n [markerPoint]=\"value\"\n [zoom]=\"zoom\"\n [readonly]=\"readonly === true || disabled === true ? true : false\"\n ></lux-map>\n </div>\n </div>\n <div class=\"lux-modal-footer\">\n <button\n *ngIf=\"disabled || readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].closeAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].cancelAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-select\"\n (click)=\"modal.close(map.markerPoint.coordinates)\"\n >\n {{ i18n[lang].selectAction }}\n </button>\n </div>\n</ng-template>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.btn-select{color:#fff;background-color:#4242d1;margin-left:2rem}.btn-cancel{color:#fff;background-color:#c22929}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon,.icon-clear,.icon-globe{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;min-width:1rem;min-height:1rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.clickable{cursor:pointer}.icon-globe{background:var(--lux-autocomplete-icon-globe, url(/assets/img/globe.svg) no-repeat center);background-size:1rem;height:100%}.icon-clear{width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}.lux-modal-body{padding:0}.map-container{height:var(--lux-geolocation-map-height, 45vh);width:var(--lux-geolocation-map-width, 90vw);max-width:100%}\n"], dependencies: [{ kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i5.AutocompleteComponent, selector: "lux-autocomplete", inputs: ["inputId", "disabled", "readonly", "label", "canAddNewValues", "keepOpenAfterDelete", "value", "dataSource", "required", "placeholder", "resolveLabelsFunction", "populateFunction", "instance"], outputs: ["valueChange", "dataSourceChange"] }, { kind: "component", type: i6.MapComponent, selector: "lux-map", inputs: ["mapId", "zoom", "center", "readonly", "markerCoordinates", "markerPoint"], outputs: ["valueChange"] }] });
|
|
365
|
+
}
|
|
366
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.2", ngImport: i0, type: GeolocationComponent, decorators: [{
|
|
367
|
+
type: Component,
|
|
368
|
+
args: [{ selector: 'lux-geolocation', providers: [
|
|
369
|
+
{
|
|
370
|
+
provide: NG_VALUE_ACCESSOR,
|
|
371
|
+
multi: true,
|
|
372
|
+
useExisting: forwardRef(() => GeolocationComponent)
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
provide: NG_VALIDATORS,
|
|
376
|
+
multi: true,
|
|
377
|
+
useExisting: forwardRef(() => GeolocationComponent)
|
|
378
|
+
}
|
|
379
|
+
], template: "<input\n #latitude\n class=\"rounded-left prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$latitude'\"\n [(ngModel)]=\"latitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLatitude !== undefined && minLatitude !== null\n ? minLatitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLatitude !== undefined && maxLatitude !== null\n ? maxLatitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lat\"\n (keyup)=\"onEventLatitude(latitude.value)\"\n (change)=\"onEventLatitude(latitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\">\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.north\n }}</span>\n <span *ngIf=\"isValidNumber(latitudeValue) && latitudeValue < 0\">{{\n i18n[lang].cardinalPoints.south\n }}</span>\n <span *ngIf=\"!isValidNumber(latitudeValue)\">-</span>\n</div>\n<input\n #longitude\n class=\"prefix\"\n [ngClass]=\"className\"\n type=\"number\"\n [id]=\"inputId + '$longitude'\"\n [(ngModel)]=\"longitudeValue\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.disabled]=\"disabled === true ? 'true' : undefined\"\n [attr.readonly]=\"readonly === true ? 'true' : undefined\"\n [attr.min]=\"\n minLongitude !== undefined && minLongitude !== null\n ? minLongitude.toString()\n : undefined\n \"\n [attr.max]=\"\n maxLongitude !== undefined && maxLongitude !== null\n ? maxLongitude.toString()\n : undefined\n \"\n [attr.step]=\"\n step !== undefined && step !== null ? step.toString() : undefined\n \"\n [placeholder]=\"i18n[lang].lon\"\n (keyup)=\"onEventLongitude(longitude.value)\"\n (change)=\"onEventLongitude(longitude.value)\"\n (keypress)=\"onKeyPress($event)\"\n (blur)=\"onLostFocus()\"\n/>\n<div\n class=\"infix symbol monospace clickable\"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue >= 0\">{{\n i18n[lang].cardinalPoints.east\n }}</span>\n <span *ngIf=\"isValidNumber(longitudeValue) && longitudeValue < 0\">{{\n i18n[lang].cardinalPoints.west\n }}</span>\n <span *ngIf=\"!isValidNumber(longitudeValue)\">-</span>\n</div>\n<div\n [class]=\"\n disabled || readonly || !isClearable()\n ? 'clickable rounded-right postfix symbol'\n : 'clickable postfix symbol'\n \"\n [ngClass]=\"className\"\n (click)=\"openModalMap(modalMap)\"\n>\n <span class=\"icon-globe\"></span>\n</div>\n<button\n #clearButton\n *ngIf=\"!disabled && !readonly && isClearable()\"\n class=\"rounded-right postfix bordered icon icon-clear\"\n [id]=\"inputId + '$clear'\"\n type=\"button\"\n (click)=\"clear()\"\n aria-label=\"clear\"\n></button>\n\n<div *ngIf=\"inlineErrors && lastErrors && (dirty || touched)\" class=\"alert\">\n <div *ngIf=\"lastErrors.required\">\n {{ i18n[lang].userErrors.required }}\n </div>\n <div *ngIf=\"lastErrors.minLatitude\">\n {{\n i18n[lang].userErrors.minLatitude.replace(\n '$minLatitude',\n lastErrors.minLatitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLatitude\">\n {{\n i18n[lang].userErrors.maxLatitude.replace(\n '$maxLatitude',\n lastErrors.maxLatitude.max\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.minLongitude\">\n {{\n i18n[lang].userErrors.minLongitude.replace(\n '$minLongitude',\n lastErrors.minLongitude.min\n )\n }}\n </div>\n <div *ngIf=\"lastErrors.maxLongitude\">\n {{\n i18n[lang].userErrors.maxLongitude.replace(\n '$maxLongitude',\n lastErrors.maxLongitude.max\n )\n }}\n </div>\n</div>\n\n<ng-template #modalMap let-modal>\n <div class=\"lux-modal-header\">\n <h4 class=\"modal-title default-font\" id=\"modal-basic-title\">{{ mapTitle }}</h4>\n <button\n type=\"button\"\n class=\"close\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss('Cross click')\"\n >\n <span aria-hidden=\"true\">\u00D7</span>\n </button>\n </div>\n <div class=\"lux-modal-body content\">\n <lux-autocomplete\n #searchBar\n [attr.aria-label]=\"i18n[lang].typeToSearch\"\n [placeholder]=\"i18n[lang].typeToSearch\"\n *ngIf=\"!disabled && !readonly\"\n [instance]=\"self\"\n [resolveLabelsFunction]=\"getLabels\"\n [populateFunction]=\"getData\"\n (valueChange)=\"onSearchLocationChanged(searchBar.value, map)\"\n ></lux-autocomplete>\n <div class=\"map-container\">\n <lux-map\n #map\n [center]=\"value\"\n [markerPoint]=\"value\"\n [zoom]=\"zoom\"\n [readonly]=\"readonly === true || disabled === true ? true : false\"\n ></lux-map>\n </div>\n </div>\n <div class=\"lux-modal-footer\">\n <button\n *ngIf=\"disabled || readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].closeAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-cancel\"\n (click)=\"modal.close('cancel')\"\n >\n {{ i18n[lang].cancelAction }}\n </button>\n <button\n *ngIf=\"!disabled && !readonly\"\n type=\"button\"\n class=\"btn btn-select\"\n (click)=\"modal.close(map.markerPoint.coordinates)\"\n >\n {{ i18n[lang].selectAction }}\n </button>\n </div>\n</ng-template>\n", styles: [":focus{z-index:1}input,select,textarea{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057);margin:var(--lux-input-margin, 0rem);padding:var(--lux-input-padding, 0rem .5rem)}.alert{padding:.2rem 2rem;background:var(--lux-alert-background, #fe2e2e);color:var(--lux-alert-color, white);font-family:Consolas,monospace;width:45%;margin-right:1rem;display:inline-block}.symbol{display:inline-block;align-items:baseline;padding:0rem .5rem;margin-bottom:0;font-weight:400;color:var(--lux-symbol-color, default);text-align:center;white-space:nowrap;background:var(--lux-symbol-background, default);font-size:var(--lux-symbol-font-size, 1rem)}.bordered,.symbol{border:var(--lux-input-border, 1px solid) var(--lux-input-border-color, #495057)}.rounded,.rounded-right,.rounded-middle,.rounded-left{border-radius:var(--lux-border-radius, .25rem)}.rounded-left{border-top-right-radius:0;border-bottom-right-radius:0}.rounded-middle{border-radius:0}.rounded-right{border-top-left-radius:0;border-bottom-left-radius:0}.prefix{border-right:none}.infix{border-left:none;border-right:none}.postfix{border-left:none;display:flex;align-items:center}.monospace{font-family:monospace}.default-font{color:var(--lux-font-color, black)}:host{display:flex;align-items:stretch}.btn-select{color:#fff;background-color:#4242d1;margin-left:2rem}.btn-cancel{color:#fff;background-color:#c22929}.readonly{border:none}.readonly:focus{border:none;outline:none}.disabled{background-color:var(--lux-disabled-color, #f1f1f1);border-color:var(--lux-disabled-border-color, #6d6d6d)}.icon,.icon-clear,.icon-globe{display:inline-block;background-size:1rem 1rem;background-position:center;background-repeat:no-repeat;min-width:1rem;min-height:1rem;width:var(--lux-autocomplete-icon-width, 1.5rem);z-index:1}.clickable{cursor:pointer}.icon-globe{background:var(--lux-autocomplete-icon-globe, url(/assets/img/globe.svg) no-repeat center);background-size:1rem;height:100%}.icon-clear{width:var(--lux-autocomplete-icon-width, 1.5rem);background:var(--lux-autocomplete-icon-clear, url(/assets/img/filter-clear.png) no-repeat center);background-size:var(--lux-autocomplete-icon-bg-size, .5rem .5rem);z-index:1}.lux-modal-body{padding:0}.map-container{height:var(--lux-geolocation-map-height, 45vh);width:var(--lux-geolocation-map-width, 90vw);max-width:100%}\n"] }]
|
|
380
|
+
}], ctorParameters: () => [{ type: i1.ModalService }, { type: i2.GeolocationService }], propDecorators: { latitude: [{
|
|
381
|
+
type: ViewChild,
|
|
382
|
+
args: ['latitude', { static: true }]
|
|
383
|
+
}], longitude: [{
|
|
384
|
+
type: ViewChild,
|
|
385
|
+
args: ['longitude', { static: true }]
|
|
386
|
+
}], map: [{
|
|
387
|
+
type: ViewChild,
|
|
388
|
+
args: ['map', { static: false }]
|
|
389
|
+
}], minLatitude: [{
|
|
390
|
+
type: Input
|
|
391
|
+
}], maxLatitude: [{
|
|
392
|
+
type: Input
|
|
393
|
+
}], minLongitude: [{
|
|
394
|
+
type: Input
|
|
395
|
+
}], maxLongitude: [{
|
|
396
|
+
type: Input
|
|
397
|
+
}], step: [{
|
|
398
|
+
type: Input
|
|
399
|
+
}], zoom: [{
|
|
400
|
+
type: Input
|
|
401
|
+
}], lang: [{
|
|
402
|
+
type: Input
|
|
403
|
+
}], inlineErrors: [{
|
|
404
|
+
type: Input
|
|
405
|
+
}], inputId: [{
|
|
406
|
+
type: Input
|
|
407
|
+
}], ariaLabel: [{
|
|
408
|
+
type: Input,
|
|
409
|
+
args: ['aria-label']
|
|
410
|
+
}], readonly: [{
|
|
411
|
+
type: Input
|
|
412
|
+
}], disabled: [{
|
|
413
|
+
type: Input
|
|
414
|
+
}], required: [{
|
|
415
|
+
type: Input
|
|
416
|
+
}], value: [{
|
|
417
|
+
type: Input
|
|
418
|
+
}], valueChange: [{
|
|
419
|
+
type: Output
|
|
420
|
+
}], keyPress: [{
|
|
421
|
+
type: Output
|
|
422
|
+
}] } });
|
|
423
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VvbG9jYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbHV4L3NyYy9saWIvZ2VvbG9jYXRpb24vZ2VvbG9jYXRpb24uY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBRUwsTUFBTSxFQUVOLFNBQVMsRUFDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRUwsYUFBYSxFQUNiLGlCQUFpQixFQUVsQixNQUFNLGdCQUFnQixDQUFDO0FBR3hCLE9BQU8sRUFDTCxNQUFNLEVBQ04sUUFBUSxFQUNSLGlCQUFpQixFQUNqQixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2xCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUUzQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7Ozs7Ozs7O0FBbUIzRCxNQUFNLE9BQU8sb0JBQW9CO0lBcUpyQjtJQUNEO0lBckpULE1BQU0sQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRW9CLFFBQVEsQ0FBYTtJQUNwQixTQUFTLENBQWE7SUFDM0IsR0FBRyxDQUFjO0lBRXRELE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDaEIsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNkLFVBQVUsR0FBNEIsSUFBSSxDQUFDO0lBRW5DLFNBQVMsQ0FBbUI7SUFDNUIsU0FBUyxDQUFVO0lBQ25CLE1BQU0sQ0FBTTtJQUVwQixhQUFhLEdBQVksU0FBUyxD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S0FBSyxFQUFFO2dCQWlFNUIsV0FBVztzQkFEakIsS0FBSztnQkFHQyxXQUFXO3NCQURqQixLQUFLO2dCQUdDLFlBQVk7c0JBRGxCLEtBQUs7Z0JBR0MsWUFBWTtzQkFEbEIsS0FBSztnQkFHQyxJQUFJO3NCQURWLEtBQUs7Z0JBR0MsSUFBSTtzQkFEVixLQUFLO2dCQU9HLElBQUk7c0JBQVosS0FBSztnQkFDVSxZQUFZO3NCQUEzQixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ3NCLFNBQVM7c0JBQXBDLEtBQUs7dUJBQUMsWUFBWTtnQkFDSCxRQUFRO3NCQUF2QixLQUFLO2dCQUdGLFFBQVE7c0JBRFgsS0FBSztnQkFVRixRQUFRO3NCQURYLEtBQUs7Z0JBU0YsS0FBSztzQkFEUixLQUFLO2dCQWlDSSxXQUFXO3NCQUFwQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgZm9yd2FyZFJlZixcbiAgSW5wdXQsXG4gIE9uSW5pdCxcbiAgT3V0cHV0LFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQWJzdHJhY3RDb250cm9sLFxuICBOR19WQUxJREFUT1JTLFxuICBOR19WQUxVRV9BQ0NFU1NPUixcbiAgVmFsaWRhdGlvbkVycm9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vZGF0YXNvdXJjZSc7XG5pbXBvcnQge1xuICBleGlzdHMsXG4gIGhhc1ZhbHVlLFxuICBpc0luaXRpYWxBbmRFbXB0eSxcbiAgaXNWYWxpZE51bWJlcixcbiAgcm91bmRUb011bHRpcGxlT2Zcbn0gZnJvbSAnLi4vaGVscGVyRm5zJztcbmltcG9ydCB7IGxhbmd1YWdlRGV0ZWN0b3IgfSBmcm9tICcuLi9sYW5nJztcbmltcG9ydCB7IEdlb1BvaW50IH0gZnJvbSAnLi4vbWFwL2dlb3BvaW50JztcbmltcG9ydCB7IE1vZGFsU2VydmljZSB9IGZyb20gJy4uL21vZGFsL21vZGFsLnNlcnZpY2UnO1xuaW1wb3J0IHsgR2VvbG9jYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9nZW9sb2NhdGlvbi5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbHV4LWdlb2xvY2F0aW9uJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2dlb2xvY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZ2VvbG9jYXRpb24uY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICBtdWx0aTogdHJ1ZSxcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IEdlb2xvY2F0aW9uQ29tcG9uZW50KVxuICAgIH0sXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gR2VvbG9jYXRpb25Db21wb25lbnQpXG4gICAgfVxuICBdXG59KVxuZXhwb3J0IGNsYXNzIEdlb2xvY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgc3RhdGljIGlkQ291bnRlciA9IDA7XG5cbiAgQFZpZXdDaGlsZCgnbGF0aXR1ZGUnLCB7IHN0YXRpYzogdHJ1ZSB9KSBsYXRpdHVkZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnbG9uZ2l0dWRlJywgeyBzdGF0aWM6IHRydWUgfSkgbG9uZ2l0dWRlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdtYXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgbWFwPzogRWxlbWVudFJlZjtcblxuICB0b3VjaGVkID0gZmFsc2U7XG4gIGRpcnR5ID0gZmFsc2U7XG4gIGxhc3RFcnJvcnM6IFZhbGlkYXRpb25FcnJvcnMgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIF9kaXNhYmxlZDogc3RyaW5nIHwgYm9vbGVhbjtcbiAgcHJpdmF0ZSBfcmVxdWlyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX3ZhbHVlOiBhbnk7XG5cbiAgbGF0aXR1ZGVWYWx1ZT86IG51bWJlciA9IHVuZGVmaW5lZDtcbiAgbG9uZ2l0dWRlVmFsdWU/OiBudW1iZXIgPSB1bmRlZmluZWQ7XG5cbiAgaXNWYWxpZE51bWJlciA9IGlzVmFsaWROdW1iZXI7XG5cbiAgaTE4biA9IHtcbiAgICBlbjoge1xuICAgICAgbGF0OiAnbGF0aXR1ZGUnLFxuICAgICAgbG9uOiAnbG9uZ2l0dWRlJyxcbiAgICAgIHNlbGVjdExvY2F0aW9uOiAnU2VsZWN0IGxvY2F0aW9uJyxcbiAgICAgIGxvY2F0aW9uOiAnTG9jYXRpb24nLFxuICAgICAgc2VsZWN0QWN0aW9uOiAnU2VsZWN0JyxcbiAgICAgIGNhbmNlbEFjdGlvbjogJ0NhbmNlbCcsXG4gICAgICBjbG9zZUFjdGlvbjogJ0Nsb3NlJyxcbiAgICAgIHR5cGVUb1NlYXJjaDogJ3R5cGUgdG8gc2VhcmNoJyxcbiAgICAgIGNhcmRpbmFsUG9pbnRzOiB7XG4gICAgICAgIG5vcnRoOiAnTicsXG4gICAgICAgIHNvdXRoOiAnUycsXG4gICAgICAgIGVhc3Q6ICdFJyxcbiAgICAgICAgd2VzdDogJ1cnXG4gICAgICB9LFxuICAgICAgdXNlckVycm9yczoge1xuICAgICAgICByZXF1aXJlZDogJ1JlcXVpcmVkIGZpZWxkLicsXG4gICAgICAgIG1pbkxhdGl0dWRlOiAnTWluaW11bSBsYXRpdHVkZSBpcyAkbWluTGF0aXR1ZGUuJyxcbiAgICAgICAgbWF4TGF0aXR1ZGU6ICdNYXhpbXVtIGxhdGl0dWRlIGlzICRtYXhMYXRpdHVkZS4nLFxuICAgICAgICBtaW5Mb25naXR1ZGU6ICdNaW5pbXVtIGxvbmdpdHVkZSBpcyAkbWluTG9uZ2l0dWRlLicsXG4gICAgICAgIG1heExvbmdpdHVkZTogJ01heGltdW0gbG9uZ2l0dWRlIGlzICRtYXhMb25naXR1ZGUuJ1xuICAgICAgfVxuICAgIH0sXG4gICAgZXM6IHtcbiAgICAgIGxhdDogJ2xhdGl0dWQnLFxuICAgICAgbG9uOiAnbG9uZ2l0dWQnLFxuICAgICAgc2VsZWN0TG9jYXRpb246ICdTZWxlY2Npb25lIHViaWNhY2nDs24nLFxuICAgICAgbG9jYXRpb246ICdVYmljYWNpw7NuJyxcbiAgICAgIHNlbGVjdEFjdGlvbjogJ1NlbGVjY2lvbmFyJyxcbiAgICAgIGNhbmNlbEFjdGlvbjogJ0NhbmNlbGFyJyxcbiAgICAgIGNsb3NlQWN0aW9uOiAnQ2VycmFyJyxcbiAgICAgIHR5cGVUb1NlYXJjaDogJ2VzY3JpYmUgcGFyYSBidXNjYXInLFxuICAgICAgY2FyZGluYWxQb2ludHM6IHtcbiAgICAgICAgbm9ydGg6ICdOJyxcbiAgICAgICAgc291dGg6ICdTJyxcbiAgICAgICAgZWFzdDogJ0UnLFxuICAgICAgICB3ZXN0OiAnTydcbiAgICAgIH0sXG4gICAgICB1c2VyRXJyb3JzOiB7XG4gICAgICAgIHJlcXVpcmVkOiAnRWwgY2FtcG8gZXMgb2JsaWdhdG9yaW8uJyxcbiAgICAgICAgbWluTGF0aXR1ZGU6ICdMYSBsYXRpdHVkIG3DrW5pbWEgZXMgJG1pbkxhdGl0dWRlLicsXG4gICAgICAgIG1heExhdGl0dWRlOiAnTGEgbGF0aXR1ZCBtw6F4aW1hIGVzICRtYXhMYXRpdHVkZS4nLFxuICAgICAgICBtaW5Mb25naXR1ZGU6ICdMYSBsb25naXR1ZCBtw61uaW1hIGVzICRtaW5Mb25naXR1ZGUuJyxcbiAgICAgICAgbWF4TG9uZ2l0dWRlOiAnTGEgbG9uZ2l0dWQgbcOheGltYSBlcyAkbWF4TG9uZ2l0dWRlLidcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgQElucHV0KClcbiAgcHVibGljIG1pbkxhdGl0dWRlOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXhMYXRpdHVkZTogbnVtYmVyO1xuICBASW5wdXQoKVxuICBwdWJsaWMgbWluTG9uZ2l0dWRlOiBudW1iZXI7XG4gIEBJbnB1dCgpXG4gIHB1YmxpYyBtYXhMb25naXR1ZGU6IG51bWJlcjtcbiAgQElucHV0KClcbiAgcHVibGljIHN0ZXA6IG51bWJlcjtcbiAgQElucHV0KClcbiAgcHVibGljIHpvb206IG51bWJlcjtcblxuICBnZXQgY2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY2hlY2tDbGFzc05hbWUoKTtcbiAgfVxuXG4gIEBJbnB1dCgpIGxhbmcgPSBsYW5ndWFnZURldGVjdG9yKCk7XG4gIEBJbnB1dCgpIHB1YmxpYyBpbmxpbmVFcnJvcnMgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIGlucHV0SWQ6IHN0cmluZztcbiAgQElucHV0KCdhcmlhLWxhYmVsJykgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgcmVhZG9ubHk6IGJvb2xlYW4gfCBudWxsID0gbnVsbDtcblxuICBASW5wdXQoKVxuICBzZXQgZGlzYWJsZWQodjogc3RyaW5nIHwgYm9vbGVhbikge1xuICAgIHYgPSB0eXBlb2YgdiA9PT0gJ3N0cmluZycgJiYgdiAhPT0gJ2ZhbHNlJyA/IHRydWUgOiB2O1xuICAgIHRoaXMuX2Rpc2FibGVkID0gdjtcbiAgfVxuICBnZXQgZGlzYWJsZWQoKTogc3RyaW5nIHwgYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkO1xuICB9XG5cbiAgQElucHV0KClcbiAgc2V0IHJlcXVpcmVkKHY6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9yZXF1aXJlZCA9IHY7XG4gIH1cbiAgZ2V0IHJlcXVpcmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9yZXF1aXJlZDtcbiAgfVxuXG4gIEBJbnB1dCgpXG4gIHNldCB2YWx1ZSh2OiBHZW9Qb2ludCkge1xuICAgIGlmICh2ID09PSB0aGlzLl92YWx1ZSkge1xuICAgICAgcmV0dXJuOyAvLyBwcmV2ZW50IGV2ZW50cyB3aGVuIHRoZXJlIGlzIG5vIGNoYW5nZXNcbiAgICB9XG4gICAgY29uc3QgaW5pdGlhbEFuZEVtcHR5ID0gaXNJbml0aWFsQW5kRW1wdHkodGhpcy5fdmFsdWUsIHYpO1xuICAgIGlmIChcbiAgICAgIHYgJiZcbiAgICAgIHYuY29vcmRpbmF0ZXMgJiZcbiAgICAgIHYuY29vcmRpbmF0ZXMubGVuZ3RoID09PSAyICYmXG4gICAgICBleGlzdHModi5jb29yZGluYXRlc1swXSAmJiBleGlzdHModi5jb29yZGluYXRlc1sxXSkpXG4gICAgKSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICB0aGlzLnNldExhdGl0dWRlSW5Db250cm9sKHYuY29vcmRpbmF0ZXNbMV0pO1xuICAgICAgdGhpcy5zZXRMb25naXR1ZGVJbkNvbnRyb2wodi5jb29yZGluYXRlc1swXSk7XG4gICAgfSBlbHNlIGlmICghdikge1xuICAgICAgdGhpcy5fdmFsdWUgPSBudWxsO1xuICAgICAgdGhpcy5zZXRMYXRpdHVkZUluQ29udHJvbChudWxsKTtcbiAgICAgIHRoaXMuc2V0TG9uZ2l0dWRlSW5Db250cm9sKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZSA9IHY7XG4gICAgICAvLyB3ZSBkb24ndCBzZXQgdmFsdWUgaW4gY29udHJvbCBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkXG4gICAgICAvLyBpZiB3ZSBkbywgdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnRyb2wgY2hhbmdlcyBhbmQgY2FuIGVyYXNlIHdoYXQgdGhlIHVzZXIgaXMgdHlwaW5nXG4gICAgfVxuICAgIHRoaXMub25DaGFuZ2Uodik7XG4gICAgaWYgKCFpbml0aWFsQW5kRW1wdHkpIHtcbiAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2KTtcbiAgICB9XG4gIH1cbiAgZ2V0IHZhbHVlKCk6IEdlb1BvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBAT3V0cHV0KCkgdmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPEdlb1BvaW50PigpO1xuICBAT3V0cHV0KCkga2V5UHJlc3MgPSBuZXcgRXZlbnRFbWl0dGVyPEtleWJvYXJkRXZlbnQ+KCk7XG5cbiAgb25DaGFuZ2UgPSAodmFsdWU6IGFueSk6IHZvaWQgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpOiB2b2lkID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgcHVibGljIGxvY2F0aW9uU2VydmljZTogR2VvbG9jYXRpb25TZXJ2aWNlXG4gICkge31cblxuICAvLyBDb250cm9sVmFsdWVBY2Nlc3NvciBJbnRlcmZhY2UgaW1wbGVtZW50YXRpb25cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShvbkNoYW5nZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IG9uQ2hhbmdlO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQob25Ub3VjaGVkOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLm9uVG91Y2hlZCA9IG9uVG91Y2hlZDtcbiAgfVxuXG4gIG1hcmtBc1RvdWNoZWQoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnRvdWNoZWQpIHtcbiAgICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgICB0aGlzLnRvdWNoZWQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGUoZGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gIH1cbiAgLy8gRW5kIG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yIEludGVyZmFjZSBpbXBsZW1lbnRhdGlvblxuXG4gIHByaXZhdGUgc2V0TGF0aXR1ZGVJbkNvbnRyb2wobGF0aXR1ZGU6IG51bWJlcik6IHZvaWQge1xuICAgIC8vIHRoaXMubGF0aXR1ZGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IGxhdGl0dWRlO1xuICAgIHRoaXMubGF0aXR1ZGVWYWx1ZSA9IGxhdGl0dWRlO1xuICB9XG4gIHByaXZhdGUgc2V0TG9uZ2l0dWRlSW5Db250cm9sKGxvbmdpdHVkZTogbnVtYmVyKTogdm9pZCB7XG4gICAgLy8gdGhpcy5sb25naXR1ZGUubmF0aXZlRWxlbWVudC52YWx1ZSA9IGxvbmdpdHVkZTtcbiAgICB0aGlzLmxvbmdpdHVkZVZhbHVlID0gbG9uZ2l0dWRlO1xuICB9XG4gIGNsZWFyKCk6IHZvaWQge1xuICAgIHRoaXMuc2V0TGF0aXR1ZGVJbkNvbnRyb2wobnVsbCk7XG4gICAgdGhpcy5zZXRMb25naXR1ZGVJbkNvbnRyb2wobnVsbCk7XG4gICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gIH1cbiAgaXNDbGVhcmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGlzVmFsaWROdW1iZXIodGhpcy5sYXRpdHVkZVZhbHVlKSB8fCBpc1ZhbGlkTnVtYmVyKHRoaXMubG9uZ2l0dWRlVmFsdWUpXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRvciBpbnRlcmZhY2VcbiAgcmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSgpOiB2b2lkIHt9XG5cbiAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwge1xuICAgIGNvbnN0IHZhbHVlID0gY29udHJvbC52YWx1ZTtcbiAgICBsZXQgcmVzdWx0OiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCA9IG51bGw7XG5cbiAgICBpZiAoXG4gICAgICB0aGlzLnJlcXVpcmVkICYmXG4gICAgICAhaGFzVmFsdWUodmFsdWUpICYmXG4gICAgICAhZXhpc3RzKHRoaXMubGF0aXR1ZGVWYWx1ZSkgJiZcbiAgICAgICFleGlzdHModGhpcy5sb25naXR1ZGVWYWx1ZSlcbiAgICApIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5yZXF1aXJlZCA9IHsgdmFsdWUsIHJlYXNvbjogJ1JlcXVpcmVkIGZpZWxkLicgfTtcbiAgICB9XG4gICAgaWYgKCFleGlzdHModGhpcy5sYXRpdHVkZVZhbHVlKSAmJiBleGlzdHModGhpcy5sb25naXR1ZGVWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5leGlzdHNMYXRpdHVkZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHJlYXNvbjogJ0xhdGl0dWRlIG5vdCBzcGVjaWZpZWQuJ1xuICAgICAgfTtcbiAgICB9XG4gICAgaWYgKGV4aXN0cyh0aGlzLmxhdGl0dWRlVmFsdWUpICYmICFleGlzdHModGhpcy5sb25naXR1ZGVWYWx1ZSkpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5leGlzdHNMb25naXR1ZGUgPSB7XG4gICAgICAgIHZhbHVlLFxuICAgICAgICByZWFzb246ICdMb25naXR1ZGUgbm90IHNwZWNpZmllZC4nXG4gICAgICB9O1xuICAgIH1cbiAgICBpZiAoZXhpc3RzKHRoaXMubWluTGF0aXR1ZGUpICYmIHRoaXMubGF0aXR1ZGVWYWx1ZSA8IHRoaXMubWluTGF0aXR1ZGUpIHtcbiAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgIHJlc3VsdC5taW5MYXRpdHVkZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG1pbjogdGhpcy5taW5MYXRpdHVkZSxcbiAgICAgICAgcmVhc29uOiBgTGF0aXR1ZGUgaXMgbG93ZXIgdGhhbiBtaW5pbXVtIHZhbHVlOiAke3RoaXMubWluTGF0aXR1ZGV9LmBcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChleGlzdHModGhpcy5tYXhMYXRpdHVkZSkgJiYgdGhpcy5sYXRpdHVkZVZhbHVlID4gdGhpcy5tYXhMYXRpdHVkZSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0Lm1heExhdGl0dWRlID0ge1xuICAgICAgICB2YWx1ZSxcbiAgICAgICAgbWF4OiB0aGlzLm1heExhdGl0dWRlLFxuICAgICAgICByZWFzb246IGBMYXRpdHVkZSBpcyBoaWdoZXIgdGhhbiBtYXhpbXVtIHZhbHVlOiAke3RoaXMubWF4TGF0aXR1ZGV9LmBcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChleGlzdHModGhpcy5taW5Mb25naXR1ZGUpICYmIHRoaXMubG9uZ2l0dWRlVmFsdWUgPCB0aGlzLm1pbkxvbmdpdHVkZSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0Lm1pbkxvbmdpdHVkZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG1pbjogdGhpcy5taW5Mb25naXR1ZGUsXG4gICAgICAgIHJlYXNvbjogYExvbmdpdHVkZSBpcyBsb3dlciB0aGFuIG1pbmltdW0gdmFsdWU6ICR7dGhpcy5taW5Mb25naXR1ZGV9LmBcbiAgICAgIH07XG4gICAgfVxuICAgIGlmIChleGlzdHModGhpcy5tYXhMb25naXR1ZGUpICYmIHRoaXMubG9uZ2l0dWRlVmFsdWUgPiB0aGlzLm1heExvbmdpdHVkZSkge1xuICAgICAgcmVzdWx0ID0gcmVzdWx0IHx8IHt9O1xuICAgICAgcmVzdWx0Lm1heExvbmdpdHVkZSA9IHtcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIG1heDogdGhpcy5tYXhMb25naXR1ZGUsXG4gICAgICAgIHJlYXNvbjogYExvbmdpdHVkZSBpcyBoaWdoZXIgdGhhbiBtYXhpbXVtIHZhbHVlOiAke3RoaXMubWF4TG9uZ2l0dWRlfS5gXG4gICAgICB9O1xuICAgIH1cbiAgICB0aGlzLmxhc3RFcnJvcnMgPSByZXN1bHQ7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICAvLyBFbmQgb2YgVmFsaWRhdG9yIGludGVyZmFjZVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuaW5wdXRJZCA9IHRoaXMuaW5wdXRJZFxuICAgICAgPyB0aGlzLmlucHV0SWRcbiAgICAgIDogYGdlb2xvY2F0aW9uJCR7R2VvbG9jYXRpb25Db21wb25lbnQuaWRDb3VudGVyKyt9YDtcbiAgICB0aGlzLnNldFBhdHRlcm5zKCk7XG4gIH1cblxuICByb3VuZFRvU3RlcEFuZFVwZGF0ZUxhdGl0dWRlQW5kTG9uZ2l0dWRlKFxuICAgIG5ld0xhdGl0dWRlQW5kTG9uZ2l0dWRlOiBudW1iZXJbXVxuICApOiB2b2lkIHtcbiAgICBjb25zdCBuZXdMYXRpdHVkZSA9IHJvdW5kVG9NdWx0aXBsZU9mKFxuICAgICAgbmV3TGF0aXR1ZGVBbmRMb25naXR1ZGVbMV0sXG4gICAgICB0aGlzLnN0ZXBcbiAgICApO1xuICAgIGNvbnN0IG5ld0xvbmdpdHVkZSA9IHJvdW5kVG9NdWx0aXBsZU9mKFxuICAgICAgbmV3TGF0aXR1ZGVBbmRMb25naXR1ZGVbMF0sXG4gICAgICB0aGlzLnN0ZXBcbiAgICApO1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCFleGlzdHMobmV3TGF0aXR1ZGVBbmRMb25naXR1ZGUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbnVsbDtcbiAgICB9XG4gICAgdGhpcy52YWx1ZSA9IHtcbiAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICBjb29yZGluYXRlczogW25ld0xvbmdpdHVkZSwgbmV3TGF0aXR1ZGVdXG4gICAgfTtcbiAgfVxuXG4gIG9uTG9zdEZvY3VzKCk6IHZvaWQge1xuICAgIHRoaXMubWFya0FzVG91Y2hlZCgpO1xuICB9XG4gIG9uRXZlbnRMYXRpdHVkZShuZXdMYXRpdHVkZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5yZWFkb25seSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBuZXdMYXRpdHVkZVZhbHVlID0gaXNWYWxpZE51bWJlcihuZXdMYXRpdHVkZSkgPyArbmV3TGF0aXR1ZGUgOiBudWxsO1xuICAgIGlmIChcbiAgICAgICEoZXhpc3RzKHRoaXMudmFsdWUpICYmIGV4aXN0cyh0aGlzLnZhbHVlLmNvb3JkaW5hdGVzWzBdKSkgJiZcbiAgICAgICFleGlzdHMobmV3TGF0aXR1ZGVWYWx1ZSlcbiAgICApIHtcbiAgICAgIHRoaXMudmFsdWUgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnZhbHVlID0ge1xuICAgICAgICB0eXBlOiAnUG9pbnQnLFxuICAgICAgICBjb29yZGluYXRlczogW1xuICAgICAgICAgIHRoaXMudmFsdWUgPyB0aGlzLnZhbHVlLmNvb3JkaW5hdGVzWzBdIDogdW5kZWZpbmVkLFxuICAgICAgICAgIG5ld0xhdGl0dWRlVmFsdWVcbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25FdmVudExvbmdpdHVkZShuZXdMb25naXR1ZGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRpc2FibGVkIHx8IHRoaXMucmVhZG9ubHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgbmV3TG9uZ2l0dWRlVmFsdWUgPSBpc1ZhbGlkTnVtYmVyKG5ld0xvbmdpdHVkZSlcbiAgICAgID8gK25ld0xvbmdpdHVkZVxuICAgICAgOiBudWxsO1xuICAgIGlmIChcbiAgICAgICFleGlzdHMobmV3TG9uZ2l0dWRlVmFsdWUpICYmXG4gICAgICAhKGV4aXN0cyh0aGlzLnZhbHVlKSAmJiBleGlzdHModGhpcy5fdmFsdWUuY29vcmRpbmF0ZXNbMV0pKVxuICAgICkge1xuICAgICAgdGhpcy52YWx1ZSA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudmFsdWUgPSB7XG4gICAgICAgIHR5cGU6ICdQb2ludCcsXG4gICAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgICAgbmV3TG9uZ2l0dWRlVmFsdWUsXG4gICAgICAgICAgdGhpcy52YWx1ZSA/IHRoaXMudmFsdWUuY29vcmRpbmF0ZXNbMV0gOiB1bmRlZmluZWRcbiAgICAgICAgXVxuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5tYXJrQXNUb3VjaGVkKCk7XG4gIH1cbiAgb25LZXlQcmVzcyhldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHRoaXMua2V5UHJlc3MuZW1pdChldmVudCk7XG4gIH1cblxuICBjaGVja0NsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLmRpc2FibGVkXG4gICAgICA/IHRoaXMucmVhZG9ubHlcbiAgICAgICAgPyAnZGlzYWJsZWQgcmVhZG9ubHknXG4gICAgICAgIDogJ2Rpc2FibGVkJ1xuICAgICAgOiB0aGlzLnJlYWRvbmx5XG4gICAgICA/ICdyZWFkb25seSdcbiAgICAgIDogJyc7XG4gIH1cblxuICBvcGVuTW9kYWxNYXAobW9kYWw6IFRlbXBsYXRlUmVmPGFueT4pOiB2b2lkIHtcbiAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKG1vZGFsKS5yZXN1bHQudGhlbihcbiAgICAgIChyZXN1bHQpID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gJ2NhbmNlbCcpIHtcbiAgICAgICAgICB0aGlzLnJvdW5kVG9TdGVwQW5kVXBkYXRlTGF0aXR1ZGVBbmRMb25naXR1ZGUocmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChfKSA9PiB7fVxuICAgICk7XG4gIH1cblxuICBvblNlYXJjaExvY2F0aW9uQ2hhbmdlZChuZXdWYWx1ZTogR2VvUG9pbnQsIG1hcDogYW55KTogdm9pZCB7XG4gICAgbWFwLm1hcmtlclBvaW50ID0gbmV3VmFsdWU7XG4gICAgbWFwLmNlbnRlciA9IG1hcC5tYXJrZXJQb2ludDtcbiAgfVxuXG4gIGdldCBtYXBUaXRsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAhIXRoaXMucmVhZG9ubHlcbiAgICAgID8gdGhpcy5pMThuW3RoaXMubGFuZ10ubG9jYXRpb25cbiAgICAgIDogdGhpcy5pMThuW3RoaXMubGFuZ10uc2VsZWN0TG9jYXRpb247XG4gIH1cblxuICBnZXQgc2VsZigpOiBHZW9sb2NhdGlvbkNvbXBvbmVudCB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBnZXRMYWJlbHMoXG4gICAgaW5zdGFuY2U6IEdlb2xvY2F0aW9uQ29tcG9uZW50LFxuICAgIGtleXM6IEdlb1BvaW50W11cbiAgKTogT2JzZXJ2YWJsZTxEYXRhU291cmNlPEdlb1BvaW50LCBzdHJpbmc+PiB7XG4gICAgcmV0dXJuIGluc3RhbmNlLmxvY2F0aW9uU2VydmljZS5nZXRMYWJlbHMoaW5zdGFuY2UubG9jYXRpb25TZXJ2aWNlLCBrZXlzKTtcbiAgfVxuXG4gIGdldERhdGEoXG4gICAgaW5zdGFuY2U6IEdlb2xvY2F0aW9uQ29tcG9uZW50LFxuICAgIHNlYXJjaDogc3RyaW5nXG4gICk6IE9ic2VydmFibGU8RGF0YVNvdXJjZTxHZW9Qb2ludCwgc3RyaW5nPj4ge1xuICAgIHJldHVybiBpbnN0YW5jZS5sb2NhdGlvblNlcnZpY2UuZ2V0RGF0YShpbnN0YW5jZS5sb2NhdGlvblNlcnZpY2UsIHNlYXJjaCk7XG4gIH1cblxuICBzZXRQYXR0ZXJucygpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXAgPSB0aGlzLnN0ZXAgfHwgMC4wMDAwMTsgLy8gMC4wMDAwMSBkZWdyZWVzID0gMS4xMSBtZXRlcnNcbiAgICB0aGlzLnpvb20gPSB0aGlzLnpvb20gfHwgMTg7IC8vICgzNjAvMl4xOCkgZGVncmVlcyB+IDAuMDAxMzcgZGVncmVlcyB+IDE1MyBtZXRlcnNcbiAgICB0aGlzLm1pbkxhdGl0dWRlID0gdGhpcy5taW5MYXRpdHVkZSB8fCAtOTA7XG4gICAgdGhpcy5tYXhMYXRpdHVkZSA9IHRoaXMubWF4TGF0aXR1ZGUgfHwgKzkwO1xuICAgIHRoaXMubWluTG9uZ2l0dWRlID0gdGhpcy5taW5Mb25naXR1ZGUgfHwgLTE4MDtcbiAgICB0aGlzLm1heExvbmdpdHVkZSA9IHRoaXMubWF4TG9uZ2l0dWRlIHx8ICsxODA7XG4gIH1cbn1cbiIsIjxpbnB1dFxuICAjbGF0aXR1ZGVcbiAgY2xhc3M9XCJyb3VuZGVkLWxlZnQgcHJlZml4XCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIFtpZF09XCJpbnB1dElkICsgJyRsYXRpdHVkZSdcIlxuICBbKG5nTW9kZWwpXT1cImxhdGl0dWRlVmFsdWVcIlxuICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gIFthdHRyLmRpc2FibGVkXT1cImRpc2FibGVkID09PSB0cnVlID8gJ3RydWUnIDogdW5kZWZpbmVkXCJcbiAgW2F0dHIucmVhZG9ubHldPVwicmVhZG9ubHkgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5taW5dPVwiXG4gICAgbWluTGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBtaW5MYXRpdHVkZSAhPT0gbnVsbFxuICAgICAgPyBtaW5MYXRpdHVkZS50b1N0cmluZygpXG4gICAgICA6IHVuZGVmaW5lZFxuICBcIlxuICBbYXR0ci5tYXhdPVwiXG4gICAgbWF4TGF0aXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBtYXhMYXRpdHVkZSAhPT0gbnVsbFxuICAgICAgPyBtYXhMYXRpdHVkZS50b1N0cmluZygpXG4gICAgICA6IHVuZGVmaW5lZFxuICBcIlxuICBbYXR0ci5zdGVwXT1cIlxuICAgIHN0ZXAgIT09IHVuZGVmaW5lZCAmJiBzdGVwICE9PSBudWxsID8gc3RlcC50b1N0cmluZygpIDogdW5kZWZpbmVkXG4gIFwiXG4gIFtwbGFjZWhvbGRlcl09XCJpMThuW2xhbmddLmxhdFwiXG4gIChrZXl1cCk9XCJvbkV2ZW50TGF0aXR1ZGUobGF0aXR1ZGUudmFsdWUpXCJcbiAgKGNoYW5nZSk9XCJvbkV2ZW50TGF0aXR1ZGUobGF0aXR1ZGUudmFsdWUpXCJcbiAgKGtleXByZXNzKT1cIm9uS2V5UHJlc3MoJGV2ZW50KVwiXG4gIChibHVyKT1cIm9uTG9zdEZvY3VzKClcIlxuLz5cbjxkaXZcbiAgY2xhc3M9XCJpbmZpeCBzeW1ib2wgbW9ub3NwYWNlIGNsaWNrYWJsZVwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIChjbGljayk9XCJvcGVuTW9kYWxNYXAobW9kYWxNYXApXCI+XG4gIDxzcGFuICpuZ0lmPVwiaXNWYWxpZE51bWJlcihsYXRpdHVkZVZhbHVlKSAmJiBsYXRpdHVkZVZhbHVlID49IDBcIj57e1xuICAgIGkxOG5bbGFuZ10uY2FyZGluYWxQb2ludHMubm9ydGhcbiAgfX08L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiaXNWYWxpZE51bWJlcihsYXRpdHVkZVZhbHVlKSAmJiBsYXRpdHVkZVZhbHVlIDwgMFwiPnt7XG4gICAgaTE4bltsYW5nXS5jYXJkaW5hbFBvaW50cy5zb3V0aFxuICB9fTwvc3Bhbj5cbiAgPHNwYW4gKm5nSWY9XCIhaXNWYWxpZE51bWJlcihsYXRpdHVkZVZhbHVlKVwiPi08L3NwYW4+XG48L2Rpdj5cbjxpbnB1dFxuICAjbG9uZ2l0dWRlXG4gIGNsYXNzPVwicHJlZml4XCJcbiAgW25nQ2xhc3NdPVwiY2xhc3NOYW1lXCJcbiAgdHlwZT1cIm51bWJlclwiXG4gIFtpZF09XCJpbnB1dElkICsgJyRsb25naXR1ZGUnXCJcbiAgWyhuZ01vZGVsKV09XCJsb25naXR1ZGVWYWx1ZVwiXG4gIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsXCJcbiAgW2F0dHIuZGlzYWJsZWRdPVwiZGlzYWJsZWQgPT09IHRydWUgPyAndHJ1ZScgOiB1bmRlZmluZWRcIlxuICBbYXR0ci5yZWFkb25seV09XCJyZWFkb25seSA9PT0gdHJ1ZSA/ICd0cnVlJyA6IHVuZGVmaW5lZFwiXG4gIFthdHRyLm1pbl09XCJcbiAgICBtaW5Mb25naXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBtaW5Mb25naXR1ZGUgIT09IG51bGxcbiAgICAgID8gbWluTG9uZ2l0dWRlLnRvU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkXG4gIFwiXG4gIFthdHRyLm1heF09XCJcbiAgICBtYXhMb25naXR1ZGUgIT09IHVuZGVmaW5lZCAmJiBtYXhMb25naXR1ZGUgIT09IG51bGxcbiAgICAgID8gbWF4TG9uZ2l0dWRlLnRvU3RyaW5nKClcbiAgICAgIDogdW5kZWZpbmVkXG4gIFwiXG4gIFthdHRyLnN0ZXBdPVwiXG4gICAgc3RlcCAhPT0gdW5kZWZpbmVkICYmIHN0ZXAgIT09IG51bGwgPyBzdGVwLnRvU3RyaW5nKCkgOiB1bmRlZmluZWRcbiAgXCJcbiAgW3BsYWNlaG9sZGVyXT1cImkxOG5bbGFuZ10ubG9uXCJcbiAgKGtleXVwKT1cIm9uRXZlbnRMb25naXR1ZGUobG9uZ2l0dWRlLnZhbHVlKVwiXG4gIChjaGFuZ2UpPVwib25FdmVudExvbmdpdHVkZShsb25naXR1ZGUudmFsdWUpXCJcbiAgKGtleXByZXNzKT1cIm9uS2V5UHJlc3MoJGV2ZW50KVwiXG4gIChibHVyKT1cIm9uTG9zdEZvY3VzKClcIlxuLz5cbjxkaXZcbiAgY2xhc3M9XCJpbmZpeCBzeW1ib2wgbW9ub3NwYWNlIGNsaWNrYWJsZVwiXG4gIFtuZ0NsYXNzXT1cImNsYXNzTmFtZVwiXG4gIChjbGljayk9XCJvcGVuTW9kYWxNYXAobW9kYWxNYXApXCJcbj5cbiAgPHNwYW4gKm5nSWY9XCJpc1ZhbGlkTnVtYmVyKGxvbmdpdHVkZVZhbHVlKSAmJiBsb25naXR1ZGVWYWx1ZSA+PSAwXCI+e3tcbiAgICBpMThuW2xhbmddLmNhcmRpbmFsUG9pbnRzLmVhc3RcbiAgfX08L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiaXNWYWxpZE51bWJlcihsb25naXR1ZGVWYWx1ZSkgJiYgbG9uZ2l0dWRlVmFsdWUgPCAwXCI+e3tcbiAgICBpMThuW2xhbmddLmNhcmRpbmFsUG9pbnRzLndlc3RcbiAgfX08L3NwYW4+XG4gIDxzcGFuICpuZ0lmPVwiIWlzVmFsaWROdW1iZXIobG9uZ2l0dWRlVmFsdWUpXCI+LTwvc3Bhbj5cbjwvZGl2PlxuPGRpdlxuICBbY2xhc3NdPVwiXG4gICAgZGlzYWJsZWQgfHwgcmVhZG9ubHkgfHwgIWlzQ2xlYXJhYmxlKClcbiAgICAgID8gJ2NsaWNrYWJsZSByb3VuZGVkLXJpZ2h0IHBvc3RmaXggc3ltYm9sJ1xuICAgICAgOiAnY2xpY2thYmxlIHBvc3RmaXggc3ltYm9sJ1xuICBcIlxuICBbbmdDbGFzc109XCJjbGFzc05hbWVcIlxuICAoY2xpY2spPVwib3Blbk1vZGFsTWFwKG1vZGFsTWFwKVwiXG4+XG4gIDxzcGFuIGNsYXNzPVwiaWNvbi1nbG9iZVwiPjwvc3Bhbj5cbjwvZGl2PlxuPGJ1dHRvblxuICAjY2xlYXJCdXR0b25cbiAgKm5nSWY9XCIhZGlzYWJsZWQgJiYgIXJlYWRvbmx5ICYmIGlzQ2xlYXJhYmxlKClcIlxuICBjbGFzcz1cInJvdW5kZWQtcmlnaHQgcG9zdGZpeCBib3JkZXJlZCBpY29uIGljb24tY2xlYXJcIlxuICBbaWRdPVwiaW5wdXRJZCArICckY2xlYXInXCJcbiAgdHlwZT1cImJ1dHRvblwiXG4gIChjbGljayk9XCJjbGVhcigpXCJcbiAgYXJpYS1sYWJlbD1cImNsZWFyXCJcbj48L2J1dHRvbj5cblxuPGRpdiAqbmdJZj1cImlubGluZUVycm9ycyAmJiBsYXN0RXJyb3JzICYmIChkaXJ0eSB8fCB0b3VjaGVkKVwiIGNsYXNzPVwiYWxlcnRcIj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMucmVxdWlyZWRcIj5cbiAgICB7eyBpMThuW2xhbmddLnVzZXJFcnJvcnMucmVxdWlyZWQgfX1cbiAgPC9kaXY+XG4gIDxkaXYgKm5nSWY9XCJsYXN0RXJyb3JzLm1pbkxhdGl0dWRlXCI+XG4gICAge3tcbiAgICAgIGkxOG5bbGFuZ10udXNlckVycm9ycy5taW5MYXRpdHVkZS5yZXBsYWNlKFxuICAgICAgICAnJG1pbkxhdGl0dWRlJyxcbiAgICAgICAgbGFzdEVycm9ycy5taW5MYXRpdHVkZS5taW5cbiAgICAgIClcbiAgICB9fVxuICA8L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImxhc3RFcnJvcnMubWF4TGF0aXR1ZGVcIj5cbiAgICB7e1xuICAgICAgaTE4bltsYW5nXS51c2VyRXJyb3JzLm1heExhdGl0dWRlLnJlcGxhY2UoXG4gICAgICAgICckbWF4TGF0aXR1ZGUnLFxuICAgICAgICBsYXN0RXJyb3JzLm1heExhdGl0dWRlLm1heFxuICAgICAgKVxuICAgIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5taW5Mb25naXR1ZGVcIj5cbiAgICB7e1xuICAgICAgaTE4bltsYW5nXS51c2VyRXJyb3JzLm1pbkxvbmdpdHVkZS5yZXBsYWNlKFxuICAgICAgICAnJG1pbkxvbmdpdHVkZScsXG4gICAgICAgIGxhc3RFcnJvcnMubWluTG9uZ2l0dWRlLm1pblxuICAgICAgKVxuICAgIH19XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwibGFzdEVycm9ycy5tYXhMb25naXR1ZGVcIj5cbiAgICB7e1xuICAgICAgaTE4bltsYW5nXS51c2VyRXJyb3JzLm1heExvbmdpdHVkZS5yZXBsYWNlKFxuICAgICAgICAnJG1heExvbmdpdHVkZScsXG4gICAgICAgIGxhc3RFcnJvcnMubWF4TG9uZ2l0dWRlLm1heFxuICAgICAgKVxuICAgIH19XG4gIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjbW9kYWxNYXAgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibHV4LW1vZGFsLWhlYWRlclwiPlxuICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlIGRlZmF1bHQtZm9udFwiIGlkPVwibW9kYWwtYmFzaWMtdGl0bGVcIj57eyBtYXBUaXRsZSB9fTwvaDQ+XG4gICAgPGJ1dHRvblxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImNsb3NlXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygnQ3Jvc3MgY2xpY2snKVwiXG4gICAgPlxuICAgICAgPHNwYW4gYXJpYS1oaWRkZW49XCJ0cnVlXCI+w5c8L3NwYW4+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibHV4LW1vZGFsLWJvZHkgY29udGVudFwiPlxuICAgIDxsdXgtYXV0b2NvbXBsZXRlXG4gICAgICAjc2VhcmNoQmFyXG4gICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImkxOG5bbGFuZ10udHlwZVRvU2VhcmNoXCJcbiAgICAgIFtwbGFjZWhvbGRlcl09XCJpMThuW2xhbmddLnR5cGVUb1NlYXJjaFwiXG4gICAgICAqbmdJZj1cIiFkaXNhYmxlZCAmJiAhcmVhZG9ubHlcIlxuICAgICAgW2luc3RhbmNlXT1cInNlbGZcIlxuICAgICAgW3Jlc29sdmVMYWJlbHNGdW5jdGlvbl09XCJnZXRMYWJlbHNcIlxuICAgICAgW3BvcHVsYXRlRnVuY3Rpb25dPVwiZ2V0RGF0YVwiXG4gICAgICAodmFsdWVDaGFuZ2UpPVwib25TZWFyY2hMb2NhdGlvbkNoYW5nZWQoc2VhcmNoQmFyLnZhbHVlLCBtYXApXCJcbiAgICA+PC9sdXgtYXV0b2NvbXBsZXRlPlxuICAgIDxkaXYgY2xhc3M9XCJtYXAtY29udGFpbmVyXCI+XG4gICAgICA8bHV4LW1hcFxuICAgICAgICAjbWFwXG4gICAgICAgIFtjZW50ZXJdPVwidmFsdWVcIlxuICAgICAgICBbbWFya2VyUG9pbnRdPVwidmFsdWVcIlxuICAgICAgICBbem9vbV09XCJ6b29tXCJcbiAgICAgICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5ID09PSB0cnVlIHx8IGRpc2FibGVkID09PSB0cnVlID8gdHJ1ZSA6IGZhbHNlXCJcbiAgICAgID48L2x1eC1tYXA+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibHV4LW1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b25cbiAgICAgICpuZ0lmPVwiZGlzYWJsZWQgfHwgcmVhZG9ubHlcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tY2FuY2VsXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5jbG9zZSgnY2FuY2VsJylcIlxuICAgID5cbiAgICAgIHt7IGkxOG5bbGFuZ10uY2xvc2VBY3Rpb24gfX1cbiAgICA8L2J1dHRvbj5cbiAgICA8YnV0dG9uXG4gICAgICAqbmdJZj1cIiFkaXNhYmxlZCAmJiAhcmVhZG9ubHlcIlxuICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICBjbGFzcz1cImJ0biBidG4tY2FuY2VsXCJcbiAgICAgIChjbGljayk9XCJtb2RhbC5jbG9zZSgnY2FuY2VsJylcIlxuICAgID5cbiAgICAgIHt7IGkxOG5bbGFuZ10uY2FuY2VsQWN0aW9uIH19XG4gICAgPC9idXR0b24+XG4gICAgPGJ1dHRvblxuICAgICAgKm5nSWY9XCIhZGlzYWJsZWQgJiYgIXJlYWRvbmx5XCJcbiAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4gYnRuLXNlbGVjdFwiXG4gICAgICAoY2xpY2spPVwibW9kYWwuY2xvc2UobWFwLm1hcmtlclBvaW50LmNvb3JkaW5hdGVzKVwiXG4gICAgPlxuICAgICAge3sgaTE4bltsYW5nXS5zZWxlY3RBY3Rpb24gfX1cbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuIl19
|