@bnsights/bbsf-controls 1.0.110 → 1.0.111

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,207 +1,153 @@
1
- import { Component, Input, Optional, ViewChild, EventEmitter, Output } from '@angular/core';
2
- import { FormControl, Validators } from '@angular/forms';
1
+ import { Component, Input, Optional, ViewChild, EventEmitter, Output, ViewEncapsulation } from '@angular/core';
3
2
  import { MapAutocompleteDTO } from '../../Shared/Models/MapAutocompleteDTO';
3
+ import { environment } from '@bnsights/bbsf-utilities';
4
+ import { FormControl, Validators } from '@angular/forms';
4
5
  import * as i0 from "@angular/core";
5
6
  import * as i1 from "../../Shared/services/ControlUtility";
6
7
  import * as i2 from "@angular/forms";
7
8
  import * as i3 from "@bnsights/bbsf-utilities";
8
9
  import * as i4 from "../../Shared/services/GlobalSettings.service";
9
- import * as i5 from "@angular/common";
10
+ import * as i5 from "ngx-script-loader";
11
+ import * as i6 from "@ng-bootstrap/ng-bootstrap";
12
+ import * as i7 from "@angular/common";
13
+ import * as i8 from "@angular/google-maps";
10
14
  export class MapAutoCompleteComponent {
11
- static { this.controlContainerstatic = null; }
12
- constructor(
13
- // private mapsAPILoader: MapsAPILoader,
14
- ngZone, controlUtility, controlContainer, MapAutoCompleteControlHost, UtilityService, translate, controlValidationService, globalSettings) {
15
+ static { this.controlContainerStatic = null; }
16
+ constructor(ngZone, controlUtility, controlContainer, mapAutoCompleteControlHost, UtilityService, translate, controlValidationService, globalSettings, scriptService, modalService) {
15
17
  this.ngZone = ngZone;
16
18
  this.controlUtility = controlUtility;
17
19
  this.controlContainer = controlContainer;
18
- this.MapAutoCompleteControlHost = MapAutoCompleteControlHost;
20
+ this.mapAutoCompleteControlHost = mapAutoCompleteControlHost;
19
21
  this.UtilityService = UtilityService;
20
22
  this.translate = translate;
21
23
  this.controlValidationService = controlValidationService;
22
24
  this.globalSettings = globalSettings;
25
+ this.scriptService = scriptService;
26
+ this.modalService = modalService;
23
27
  this.OnChange = new EventEmitter();
24
- this.MapAutoCompleteModel = new MapAutocompleteDTO();
25
- this.CurrentLanguage = "";
26
- this.onAutocompleteSelected = new EventEmitter();
27
- this.onGermanAddressMapped = new EventEmitter();
28
- this.onLocationSelected = new EventEmitter();
29
- // MatGoogleMapsAutocompleteComponent: MatGoogleMapsAutocompleteComponent
30
- // LazyMapsAPILoader: LazyMapsAPILoader
28
+ this.mapAutoCompleteModel = new MapAutocompleteDTO();
29
+ this.currentLanguage = "";
31
30
  this.markAllAsTouched = false;
32
31
  this.validationRules = [];
33
- this.validationRulesasync = [];
32
+ this.validationRulesAsync = [];
33
+ this.showMap = false;
34
+ this.markerPosition = null;
35
+ this.modalIsOpen = false;
36
+ //#endregion
34
37
  this.resetError = () => {
35
38
  this.controlValidationService.removeGlobalError();
36
39
  };
37
- //External Method
40
+ //#endregion
41
+ //#region External Methods
38
42
  this.RemoveRequiredValidation = () => {
39
- this.controlUtility.RemoveRequiredValidation(this.MapAutoCompleteFormControl, this.validationRules, this.options);
43
+ this.controlUtility.RemoveRequiredValidation(this.mapAutoCompleteFormControl, this.validationRules, this.options);
40
44
  };
41
- //External Method
42
45
  this.AddRequiredValidation = () => {
43
- this.controlUtility.AddRequiredValidation(this.MapAutoCompleteFormControl, this.validationRules, this.options);
46
+ this.controlUtility.AddRequiredValidation(this.mapAutoCompleteFormControl, this.validationRules, this.options);
44
47
  };
45
- //External Method
46
48
  this.RemoveCustomValidation = (CustomValidation) => {
47
- this.controlUtility.RemoveCustomValidation(this.MapAutoCompleteFormControl, this.validationRules, CustomValidation);
49
+ this.controlUtility.RemoveCustomValidation(this.mapAutoCompleteFormControl, this.validationRules, CustomValidation);
48
50
  };
49
- //External Method
50
51
  this.AddCustomValidation = (CustomValidation) => {
51
- this.controlUtility.AddCustomValidation(this.MapAutoCompleteFormControl, this.validationRules, CustomValidation);
52
+ this.controlUtility.AddCustomValidation(this.mapAutoCompleteFormControl, this.validationRules, CustomValidation);
52
53
  };
53
- //External Method
54
54
  this.IsValid = () => {
55
- this.controlUtility.IsValid(this.MapAutoCompleteFormControl);
55
+ this.controlUtility.IsValid(this.mapAutoCompleteFormControl);
56
56
  };
57
- MapAutoCompleteComponent.controlContainerstatic = this.controlContainer;
58
- this.CurrentLanguage = translate.currentLang != undefined ? translate.currentLang : translate.defaultLang;
57
+ MapAutoCompleteComponent.controlContainerStatic = this.controlContainer;
58
+ this.currentLanguage = translate.currentLang != undefined ? translate.currentLang : translate.defaultLang;
59
+ this.scriptService.loadScript(`https://maps.googleapis.com/maps/api/js?key=${environment.BBSF_GoogleMapKey}&libraries=places`)
60
+ .subscribe(_ => {
61
+ this.showMap = true;
62
+ this.mapScriptLoaded();
63
+ });
59
64
  }
65
+ //#region events
60
66
  ngOnInit() {
61
67
  this.controlValidationService.isCreatedBefor = false;
62
- // this.MapAutoCompleteModel = new MapAutocompleteDTO();
63
- // this.translate.onLangChange.subscribe((event) => {
64
- // this.CurrentLanguage = event.lang;
65
- // ;
66
- // if (this.CurrentLanguage == 'ar')
67
- // this.mapsAPILoader["_config"]["localeId"] = "ar-EG";
68
- // if (this.CurrentLanguage == 'en')
69
- // this.mapsAPILoader["_config"]["localeId"] = "en-US";
70
- // this.mapsAPILoader["_scriptLoadingPromise"] = null
71
- // this.mapsAPILoader["_config"]["apiKey"] = `${environment.BBSF_GoogleMapKey}&language=${this.CurrentLanguage}`;
72
- // var ScriptTag = document.getElementById(this.mapsAPILoader["_SCRIPT_ID"]);
73
- // if (ScriptTag)
74
- // ScriptTag.remove();
75
- // var elements = document.getElementsByClassName("pac-container");
76
- // while (elements.length > 0)
77
- // elements[0].remove();
78
- // let window = this.mapsAPILoader["_windowRef"].getNativeWindow();
79
- // window.google = null
80
- // this.LazyMapsAPILoader = new LazyMapsAPILoader({
81
- // // &language=${UtilityService.CurrentLanguage}
82
- // apiKey: `${environment.BBSF_GoogleMapKey}&language=${this.CurrentLanguage}`,
83
- // libraries: ['places'],
84
- // }, this.mapsAPILoader["_windowRef"], this.mapsAPILoader["_documentRef"], this.mapsAPILoader["_config"]["localeId"]);
85
- // this.LazyMapsAPILoader.load().then(() => {
86
- // let autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
87
- // types: ["address"]
88
- // });
89
- // autocomplete.addListener('place_changed', (/**
90
- // * @return {?}
91
- // */
92
- // () => {
93
- // this.ngZone.run((/**
94
- // * @return {?}
95
- // */
96
- // () => {
97
- // // get the place result
98
- // /** @type {?} */
99
- // const place = autocomplete.getPlace();
100
- // /** @type {?} */
101
- // const germanAddress = {
102
- // gmID: place.id,
103
- // icon: place.icon,
104
- // url: place.url,
105
- // placeID: place.place_id,
106
- // displayAddress: place.formatted_address,
107
- // name: place.name,
108
- // vicinity: place.vicinity,
109
- // locality: {},
110
- // state: {},
111
- // country: {},
112
- // geoLocation: { latitude: -1, longitude: -1 },
113
- // };
114
- // if (place.geometry && place.geometry.location) {
115
- // germanAddress.geoLocation.latitude = place.geometry.location.lat();
116
- // germanAddress.geoLocation.longitude = place.geometry.location.lng();
117
- // }
118
- // place.address_components.forEach((/**
119
- // * @param {?} value
120
- // * @return {?}
121
- // */
122
- // value => {
123
- // if (value.types.indexOf('street_number') > -1) {
124
- // germanAddress["streetNumber"] = value.short_name;
125
- // }
126
- // if (value.types.indexOf('route') > -1) {
127
- // germanAddress["streetName"] = value.long_name;
128
- // }
129
- // if (value.types.indexOf('postal_code') > -1) {
130
- // germanAddress["postalCode"] = Number(value.short_name);
131
- // }
132
- // if (value.types.indexOf('sublocality') > -1) {
133
- // germanAddress["sublocality"] = value.long_name;
134
- // }
135
- // if (value.types.indexOf('locality') > -1) {
136
- // germanAddress.locality["long"] = value.long_name;
137
- // germanAddress.locality["short"] = value.short_name;
138
- // }
139
- // if (value.types.indexOf('administrative_area_level_1') > -1) {
140
- // germanAddress.state["long"] = value.long_name;
141
- // germanAddress.state["short"] = value.short_name;
142
- // }
143
- // if (value.types.indexOf('country') > -1) {
144
- // germanAddress.country["long"] = value.long_name;
145
- // germanAddress.country["short"] = value.short_name;
146
- // }
147
- // if (value.types.indexOf('administrative_area_level_3') > -1) {
148
- // germanAddress.locality["short"] = value.short_name;
149
- // }
150
- // }));
151
- // this.onGermanAddressMapped.emit(germanAddress);
152
- // this.GermanAddressMapped(germanAddress)
153
- // if (!place.place_id || place.geometry === undefined || place.geometry === null) {
154
- // // place result is not valid
155
- // return;
156
- // }
157
- // else {
158
- // // show dialog to select a address from the input
159
- // // emit failed event
160
- // }
161
- // // this.address = place.formatted_address;
162
- // this.onAutocompleteSelected.emit(place);
163
- // this.AutocompleteSelected(place)
164
- // this.onLocationSelected.emit({
165
- // latitude: place.geometry.location.lat(),
166
- // longitude: place.geometry.location.lng()
167
- // });
168
- // }));
169
- // }));
170
- // });
171
- // });
172
- // if (this.CurrentLanguage == 'ar')
173
- // this.mapsAPILoader["_config"]["localeId"] = "ar-EG";
174
- // if (this.CurrentLanguage == 'en')
175
- // this.mapsAPILoader["_config"]["localeId"] = "en-US";
176
- // this.mapsAPILoader["_scriptLoadingPromise"] = null
177
- // this.mapsAPILoader["_config"]["apiKey"] = `${environment.BBSF_GoogleMapKey}&language=${this.CurrentLanguage}`;
178
- // var leftSection = document.getElementById(this.mapsAPILoader["_SCRIPT_ID"]);
179
- // if (leftSection)
180
- // leftSection.remove();
181
- // this.LazyMapsAPILoader = new LazyMapsAPILoader({
182
- // apiKey: `${environment.BBSF_GoogleMapKey}&language=${this.CurrentLanguage}`,
183
- // libraries: ['places'],
184
- // }, this.mapsAPILoader["_windowRef"], this.mapsAPILoader["_documentRef"], this.mapsAPILoader["_config"]["localeId"]);
185
- // this.LazyMapsAPILoader.load();
186
- // this.mapsAPILoader.load().then(() => {
187
- // let autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, {
188
- // types: ["address"]
189
- // });
190
- // })
68
+ this.mapAutoCompleteModel = new MapAutocompleteDTO();
69
+ this.translate.onLangChange.subscribe((event) => {
70
+ this.currentLanguage = event.lang;
71
+ });
72
+ this.initializeControlOptions();
73
+ this.mapAutoCompleteControlHost.ngSubmit.subscribe(_ => {
74
+ this.group.markAllAsTouched();
75
+ this.markAllAsTouched = true;
76
+ });
77
+ }
78
+ ngAfterViewInit() {
79
+ if (this.options.AttributeList != null) {
80
+ var element = document.getElementById(this.options.Name);
81
+ for (let index = 0; index < this.options.AttributeList.length; index++) {
82
+ element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
83
+ }
84
+ }
85
+ var elementHTML = document.getElementById(this.options.Name);
86
+ elementHTML.value = this.mapAutoCompleteModel.Text;
87
+ }
88
+ showGlobalError() {
89
+ this.controlUtility.showGlobalError();
90
+ }
91
+ getErrorValidation(ErrorList) {
92
+ if (this.markAllAsTouched && this.group.invalid) {
93
+ this.showGlobalError();
94
+ this.markAllAsTouched = false;
95
+ }
96
+ return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
97
+ }
98
+ AutocompleteSelected(result) {
99
+ this.mapAutoCompleteModel == new MapAutocompleteDTO();
100
+ this.mapAutoCompleteModel.Text = result.formatted_address;
101
+ this.mapAutoCompleteModel.PlaceID = result.place_id;
102
+ this.mapAutoCompleteModel.GoogleMapsURL = result.url;
103
+ }
104
+ LocationSelected(location) {
105
+ this.mapAutoCompleteModel.Latitude = location.latitude;
106
+ this.mapAutoCompleteModel.Longitude = location.longitude;
107
+ this.mapAutoCompleteFormControl.setValue(null);
108
+ this.mapAutoCompleteFormControl.setValue(this.mapAutoCompleteModel);
109
+ let originalValue = this.mapAutoCompleteFormControl.value;
110
+ if (this.options.PatchFunction && this.options.PatchPath && this.mapAutoCompleteFormControl.valid) {
111
+ this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
112
+ }
113
+ //Use this line to enable two way binding.
114
+ this.options.Value = this.mapAutoCompleteModel;
115
+ }
116
+ GermanAddressMapped(result) {
117
+ if (result.type) {
118
+ if (result.target.value == "") {
119
+ this.mapAutoCompleteFormControl.setValue(result);
120
+ this.group.controls[this.options.Name].setValue(result);
121
+ this.options.Value = result;
122
+ }
123
+ return;
124
+ }
125
+ this.mapAutoCompleteModel == new MapAutocompleteDTO();
126
+ this.mapAutoCompleteModel.Text = result.displayAddress;
127
+ this.mapAutoCompleteModel.PlaceID = result.placeID;
128
+ this.mapAutoCompleteModel.GoogleMapsURL = result.url;
129
+ this.mapAutoCompleteModel.Latitude = result.geoLocation.lat;
130
+ this.mapAutoCompleteModel.Longitude = result.geoLocation.lng;
131
+ this.mapAutoCompleteFormControl.setValue(this.mapAutoCompleteModel);
132
+ this.group.controls[this.options.Name].setValue(this.mapAutoCompleteModel);
133
+ this.OnChange.emit(this.mapAutoCompleteFormControl.value);
134
+ //Use this line to enable two way binding.
135
+ this.options.Value = this.mapAutoCompleteModel;
136
+ }
137
+ //#region helper methods
138
+ initializeControlOptions() {
191
139
  this.group.addControl(this.options.Name, new FormControl(''));
192
- this.MapAutoCompleteFormControl = this.group.controls[this.options.Name]; // new FormControl('',validationRules);
140
+ this.mapAutoCompleteFormControl = this.group.controls[this.options.Name];
193
141
  if (!this.options.ViewType)
194
142
  this.options.ViewType = this.globalSettings.ViewType;
195
- if (this.options.IsRequired) {
143
+ if (this.options.IsRequired)
196
144
  this.validationRules.push(Validators.required);
197
- }
198
145
  if (this.options.LabelKey != null && this.options.LabelKey != "")
199
146
  this.options.LabelValue = this.UtilityService.getResourceValue(this.options.LabelKey);
200
- this.MapAutoCompleteFormControl.setValidators(this.validationRules);
201
- this.MapAutoCompleteFormControl.setAsyncValidators(this.validationRulesasync);
202
- if (this.options.IsDisabled) {
203
- this.MapAutoCompleteFormControl.disable();
204
- }
147
+ this.mapAutoCompleteFormControl.setValidators(this.validationRules);
148
+ this.mapAutoCompleteFormControl.setAsyncValidators(this.validationRulesAsync);
149
+ if (this.options.IsDisabled)
150
+ this.mapAutoCompleteFormControl.disable();
205
151
  if (this.options.Value != null) {
206
152
  let germanAddress = {
207
153
  url: this.options.Value.GoogleMapsURL,
@@ -211,11 +157,10 @@ export class MapAutoCompleteComponent {
211
157
  locality: {},
212
158
  state: {},
213
159
  country: {},
214
- geoLocation: { latitude: -1, longitude: -1 },
160
+ geoLocation: { lat: -1, lng: -1 },
215
161
  };
216
- germanAddress.geoLocation.latitude = this.options.Value.Latitude;
217
- germanAddress.geoLocation.longitude = this.options.Value.Longitude;
218
- this.onGermanAddressMapped.emit(germanAddress);
162
+ germanAddress.geoLocation.lat = this.options.Value.Latitude;
163
+ germanAddress.geoLocation.lng = this.options.Value.Longitude;
219
164
  this.GermanAddressMapped(germanAddress);
220
165
  this.place = {
221
166
  url: this.options.Value.GoogleMapsURL,
@@ -223,14 +168,9 @@ export class MapAutoCompleteComponent {
223
168
  formatted_address: this.options.Value.Text,
224
169
  name: this.options.Value.Text,
225
170
  };
226
- this.onAutocompleteSelected.emit(this.place);
227
171
  this.AutocompleteSelected(this.place);
228
- this.onLocationSelected.emit({
229
- latitude: this.options.Value.Latitude,
230
- longitude: this.options.Value.Longitude
231
- });
232
- this.group.controls[this.options.Name].setValue(this.MapAutoCompleteModel);
233
- this.MapAutoCompleteFormControl.setValue(this.options.Value);
172
+ this.group.controls[this.options.Name].setValue(this.mapAutoCompleteModel);
173
+ this.mapAutoCompleteFormControl.setValue(this.options.Value);
234
174
  }
235
175
  if (this.options.CustomValidation.length > 0) {
236
176
  let Validations = this.options.CustomValidation;
@@ -239,79 +179,213 @@ export class MapAutoCompleteComponent {
239
179
  this.validationRules.push(Validation.functionBody);
240
180
  }
241
181
  }
242
- this.MapAutoCompleteControlHost.ngSubmit.subscribe((value) => {
243
- this.group.markAllAsTouched();
244
- this.markAllAsTouched = true;
182
+ }
183
+ async getPlaceAutocomplete() {
184
+ const { Autocomplete } = await google.maps.importLibrary("places");
185
+ const autocomplete = new Autocomplete(this.searchElementRef.nativeElement, {
186
+ types: [this.options.addressType]
187
+ });
188
+ google.maps.event.addListener(autocomplete, 'place_changed', _ => {
189
+ this.ngZone.run(_ => {
190
+ const place = autocomplete.getPlace();
191
+ if (place.geometry) {
192
+ const germanAddress = {
193
+ icon: place.icon,
194
+ url: place.url,
195
+ placeID: place.place_id,
196
+ displayAddress: place.formatted_address,
197
+ name: place.name,
198
+ vicinity: place.vicinity,
199
+ locality: {},
200
+ state: {},
201
+ country: {},
202
+ geoLocation: place.geometry.location.toJSON(),
203
+ };
204
+ place.address_components.forEach(value => {
205
+ if (value.types.indexOf('street_number') > -1) {
206
+ germanAddress["streetNumber"] = value.short_name;
207
+ }
208
+ if (value.types.indexOf('route') > -1) {
209
+ germanAddress["streetName"] = value.long_name;
210
+ }
211
+ if (value.types.indexOf('postal_code') > -1) {
212
+ germanAddress["postalCode"] = Number(value.short_name);
213
+ }
214
+ if (value.types.indexOf('sublocality') > -1) {
215
+ germanAddress["sublocality"] = value.long_name;
216
+ }
217
+ if (value.types.indexOf('locality') > -1) {
218
+ germanAddress.locality["long"] = value.long_name;
219
+ germanAddress.locality["short"] = value.short_name;
220
+ }
221
+ if (value.types.indexOf('administrative_area_level_1') > -1) {
222
+ germanAddress.state["long"] = value.long_name;
223
+ germanAddress.state["short"] = value.short_name;
224
+ }
225
+ if (value.types.indexOf('country') > -1) {
226
+ germanAddress.country["long"] = value.long_name;
227
+ germanAddress.country["short"] = value.short_name;
228
+ }
229
+ if (value.types.indexOf('administrative_area_level_3') > -1) {
230
+ germanAddress.locality["short"] = value.short_name;
231
+ }
232
+ });
233
+ this.GermanAddressMapped(germanAddress);
234
+ this.AutocompleteSelected(place);
235
+ }
236
+ });
245
237
  });
246
238
  }
247
- ngAfterViewInit() {
248
- if (this.options.AttributeList != null) {
249
- var element = document.getElementById(this.options.Name);
250
- for (let index = 0; index < this.options.AttributeList.length; index++) {
251
- element.setAttribute(this.options.AttributeList[index].Key, this.options.AttributeList[index].value);
252
- }
253
- }
254
- var elementHTML = document.getElementById(this.options.Name);
255
- elementHTML.value = this.MapAutoCompleteModel.Text;
239
+ mapScriptLoaded() {
240
+ this.getPlaceAutocomplete();
256
241
  }
257
- showGlobalError() {
258
- this.controlUtility.showGlobalError();
242
+ translateValue(key) {
243
+ return this.UtilityService.getResourceValue(key);
259
244
  }
260
- getErrorValidation(ErrorList) {
261
- if (this.markAllAsTouched && this.group.invalid) {
262
- this.showGlobalError();
263
- this.markAllAsTouched = false;
264
- }
265
- return this.controlUtility.getErrorValidationMassage(ErrorList, this.group, this.options);
245
+ //#endregion
246
+ //#region advanced map methods
247
+ async onMapClick(event) {
248
+ this.addMarker(event);
249
+ let geocoder = new google.maps.Geocoder();
250
+ geocoder.geocode({ location: event.latLng?.toJSON() }).then(res => {
251
+ const place = res.results[0];
252
+ const input = document.getElementById("setLocationSearch");
253
+ input.value = place.formatted_address;
254
+ this.selectedPin = {
255
+ placeID: place.place_id,
256
+ displayAddress: place.formatted_address,
257
+ geoLocation: place.geometry.location.toJSON(),
258
+ url: `https://www.google.com/maps/place/?q=place_id:${place.place_id}`,
259
+ locality: {},
260
+ state: {},
261
+ country: {},
262
+ };
263
+ place.address_components.forEach(value => {
264
+ if (value.types.indexOf('street_number') > -1) {
265
+ this.selectedPin["streetNumber"] = value.short_name;
266
+ }
267
+ if (value.types.indexOf('route') > -1) {
268
+ this.selectedPin["streetName"] = value.long_name;
269
+ }
270
+ if (value.types.indexOf('postal_code') > -1) {
271
+ this.selectedPin["postalCode"] = Number(value.short_name);
272
+ }
273
+ if (value.types.indexOf('sublocality') > -1) {
274
+ this.selectedPin["sublocality"] = value.long_name;
275
+ }
276
+ if (value.types.indexOf('locality') > -1) {
277
+ this.selectedPin.locality["long"] = value.long_name;
278
+ this.selectedPin.locality["short"] = value.short_name;
279
+ }
280
+ if (value.types.indexOf('administrative_area_level_1') > -1) {
281
+ this.selectedPin.state["long"] = value.long_name;
282
+ this.selectedPin.state["short"] = value.short_name;
283
+ }
284
+ if (value.types.indexOf('country') > -1) {
285
+ this.selectedPin.country["long"] = value.long_name;
286
+ this.selectedPin.country["short"] = value.short_name;
287
+ }
288
+ if (value.types.indexOf('administrative_area_level_3') > -1) {
289
+ this.selectedPin.locality["short"] = value.short_name;
290
+ }
291
+ });
292
+ });
266
293
  }
267
- AutocompleteSelected(result) {
268
- this.MapAutoCompleteModel == new MapAutocompleteDTO();
269
- this.MapAutoCompleteModel.Text = result.formatted_address;
270
- this.MapAutoCompleteModel.PlaceID = result.place_id;
271
- this.MapAutoCompleteModel.GoogleMapsURL = result.url;
294
+ addMarker(event) {
295
+ if (event.latLng)
296
+ this.markerPosition = event.latLng.toJSON();
272
297
  }
273
- LocationSelected(location) {
274
- this.MapAutoCompleteModel.Latitude = location.latitude;
275
- this.MapAutoCompleteModel.Longitude = location.longitude;
276
- this.MapAutoCompleteFormControl.setValue(null);
277
- this.MapAutoCompleteFormControl.setValue(this.MapAutoCompleteModel);
278
- let originalValue = this.MapAutoCompleteFormControl.value;
279
- if (this.options.PatchFunction && this.options.PatchPath && this.MapAutoCompleteFormControl.valid) {
280
- this.controlUtility.patchControlValue(originalValue, this.options.PatchFunction, this.options.PatchPath);
281
- }
282
- //Use this line to enable two way binding.
283
- this.options.Value = this.MapAutoCompleteModel;
298
+ openMapModal() {
299
+ this.modalIsOpen = true;
300
+ this.getCurrentLocation();
301
+ this.addSearchBox();
284
302
  }
285
- GermanAddressMapped(result) {
286
- if (result.type) {
287
- if (result.target.value == "") {
288
- this.MapAutoCompleteFormControl.setValue(result);
289
- this.group.controls[this.options.Name].setValue(result);
290
- this.options.Value = result;
303
+ closeMapModal() {
304
+ this.modalIsOpen = false;
305
+ }
306
+ getCurrentLocation() {
307
+ navigator.geolocation.getCurrentPosition((position) => {
308
+ const point = {
309
+ lat: position.coords.latitude,
310
+ lng: position.coords.longitude,
311
+ };
312
+ this.mapCenter = point;
313
+ this.markerPosition = {
314
+ lat: this.mapCenter.lat,
315
+ lng: this.mapCenter.lng
316
+ };
317
+ this.markerOptions = {
318
+ draggable: false,
319
+ animation: google.maps.Animation.DROP,
320
+ };
321
+ });
322
+ }
323
+ async addSearchBox() {
324
+ const { Autocomplete } = await google.maps.importLibrary("places");
325
+ const input = document.getElementById("setLocationSearch");
326
+ const searchBox = new Autocomplete(input);
327
+ google.maps.event.addListener(searchBox, "place_changed", () => {
328
+ const place = searchBox.getPlace();
329
+ if (place.geometry) {
330
+ this.markerPosition = place.geometry.location.toJSON();
331
+ this.mapCenter = place.geometry.location.toJSON();
332
+ this.selectedPin = {
333
+ icon: place.icon,
334
+ url: place.url,
335
+ placeID: place.place_id,
336
+ displayAddress: place.formatted_address,
337
+ name: place.name,
338
+ vicinity: place.vicinity,
339
+ locality: {},
340
+ state: {},
341
+ country: {},
342
+ geoLocation: place.geometry.location.toJSON(),
343
+ };
344
+ place.address_components.forEach(value => {
345
+ if (value.types.indexOf('street_number') > -1) {
346
+ this.selectedPin["streetNumber"] = value.short_name;
347
+ }
348
+ if (value.types.indexOf('route') > -1) {
349
+ this.selectedPin["streetName"] = value.long_name;
350
+ }
351
+ if (value.types.indexOf('postal_code') > -1) {
352
+ this.selectedPin["postalCode"] = Number(value.short_name);
353
+ }
354
+ if (value.types.indexOf('sublocality') > -1) {
355
+ this.selectedPin["sublocality"] = value.long_name;
356
+ }
357
+ if (value.types.indexOf('locality') > -1) {
358
+ this.selectedPin.locality["long"] = value.long_name;
359
+ this.selectedPin.locality["short"] = value.short_name;
360
+ }
361
+ if (value.types.indexOf('administrative_area_level_1') > -1) {
362
+ this.selectedPin.state["long"] = value.long_name;
363
+ this.selectedPin.state["short"] = value.short_name;
364
+ }
365
+ if (value.types.indexOf('country') > -1) {
366
+ this.selectedPin.country["long"] = value.long_name;
367
+ this.selectedPin.country["short"] = value.short_name;
368
+ }
369
+ if (value.types.indexOf('administrative_area_level_3') > -1) {
370
+ this.selectedPin.locality["short"] = value.short_name;
371
+ }
372
+ });
291
373
  }
292
- return;
293
- }
294
- this.MapAutoCompleteModel == new MapAutocompleteDTO();
295
- this.MapAutoCompleteModel.Text = result.displayAddress;
296
- this.MapAutoCompleteModel.PlaceID = result.placeID;
297
- this.MapAutoCompleteModel.GoogleMapsURL = result.url;
298
- this.MapAutoCompleteModel.Latitude = result.geoLocation.latitude;
299
- this.MapAutoCompleteModel.Longitude = result.geoLocation.longitude;
300
- this.MapAutoCompleteFormControl.setValue(this.MapAutoCompleteModel);
301
- this.group.controls[this.options.Name].setValue(this.MapAutoCompleteModel);
302
- this.OnChange.emit(this.MapAutoCompleteFormControl.value);
303
- //Use this line to enable two way binding.
304
- this.options.Value = this.MapAutoCompleteModel;
374
+ });
305
375
  }
306
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }], target: i0.ɵɵFactoryTarget.Component }); }
307
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: MapAutoCompleteComponent, selector: "BBSF-MapAutoComplete", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["search"], descendants: true }], ngImport: i0, template: "\r\n<div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <input class=\"form-control{{options.ExtraClasses}}\"\r\n [value]=\"MapAutoCompleteModel.Text\"\r\n [address]=\"MapAutoCompleteModel.Text\"\r\n value=\"{{MapAutoCompleteModel.Text}}\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n [class.is-invalid]=\"MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" (keyup)=\"GermanAddressMapped($event)\"\r\n matGoogleMapsAutocomplete #search (onAutocompleteSelected)=\"AutocompleteSelected($event)\"\r\n (onLocationSelected)=\"LocationSelected($event)\" (onGermanAddressMapped)=\"GermanAddressMapped($event)\" />\r\n\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{MapAutoCompleteModel.Text}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(MapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}} </div>\r\n</div>\r\n", dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "pipe", type: i5.KeyValuePipe, name: "keyvalue" }] }); }
376
+ submitSetLocation() {
377
+ this.GermanAddressMapped(this.selectedPin);
378
+ this.closeMapModal();
379
+ }
380
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MapAutoCompleteComponent, deps: [{ token: i0.NgZone }, { token: i1.ControlUtility }, { token: i2.ControlContainer, optional: true }, { token: i2.FormGroupDirective }, { token: i3.UtilityService }, { token: i3.BBSFTranslateService }, { token: i3.ControlValidationService }, { token: i4.GlobalSettings }, { token: i5.ScriptService }, { token: i6.NgbModal }], target: i0.ɵɵFactoryTarget.Component }); }
381
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.0.6", type: MapAutoCompleteComponent, selector: "BBSF-MapAutoComplete", inputs: { group: "group", options: "options" }, outputs: { OnChange: "OnChange" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["mapSearch"], descendants: true }, { propertyName: "advancedMapModal", first: true, predicate: ["advancedMapModal"], descendants: true }, { propertyName: "gMap", first: true, predicate: ["googleMap"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <input class=\"form-control input-icon-o {{options.ExtraClasses}}\" [value]=\"mapAutoCompleteModel.Text\" [address]=\"mapAutoCompleteModel.Text\"\r\n value=\"{{mapAutoCompleteModel.Text}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\" [placeholder]=\"options.Placeholder\"\r\n id=\"{{options.Name}}\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\" ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\"\r\n (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{mapAutoCompleteModel.Text}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}} </div>\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" type=\"text\" placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>", dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i7.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i6.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i2.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i2.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i8.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "directive", type: i8.MapMarker, selector: "map-marker", inputs: ["title", "position", "label", "clickable", "options", "icon", "visible"], outputs: ["animationChanged", "mapClick", "clickableChanged", "cursorChanged", "mapDblclick", "mapDrag", "mapDragend", "draggableChanged", "mapDragstart", "flatChanged", "iconChanged", "mapMousedown", "mapMouseout", "mapMouseover", "mapMouseup", "positionChanged", "mapRightclick", "shapeChanged", "titleChanged", "visibleChanged", "zindexChanged"], exportAs: ["mapMarker"] }, { kind: "pipe", type: i7.KeyValuePipe, name: "keyvalue" }], encapsulation: i0.ViewEncapsulation.None }); }
308
382
  }
309
383
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: MapAutoCompleteComponent, decorators: [{
310
384
  type: Component,
311
- args: [{ selector: 'BBSF-MapAutoComplete', template: "\r\n<div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <input class=\"form-control{{options.ExtraClasses}}\"\r\n [value]=\"MapAutoCompleteModel.Text\"\r\n [address]=\"MapAutoCompleteModel.Text\"\r\n value=\"{{MapAutoCompleteModel.Text}}\"\r\n aria-describedby=\"email-error\"\r\n aria-invalid=\"true\"\r\n [class.is-invalid]=\"MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched\"\r\n placeholder=\"{{options.Placeholder}}\" id=\"{{options.Name}}\" (keyup)=\"GermanAddressMapped($event)\"\r\n matGoogleMapsAutocomplete #search (onAutocompleteSelected)=\"AutocompleteSelected($event)\"\r\n (onLocationSelected)=\"LocationSelected($event)\" (onGermanAddressMapped)=\"GermanAddressMapped($event)\" />\r\n\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{MapAutoCompleteModel.Text}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\"\r\n *ngIf=\"(MapAutoCompleteFormControl.invalid && MapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(MapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}} </div>\r\n</div>\r\n" }]
385
+ args: [{ selector: 'BBSF-MapAutoComplete', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"showMap\">\r\n <div class=\"form-group bbsf-control bbsf-maps\" [formGroup]=\"group\">\r\n <div [ngClass]=\"(options.ViewType==1)?'bbsf-vertical':'bbsf-horizontal'\">\r\n <!--label-->\r\n <label *ngIf=\"!options.HideLabel\" class=\"bbsf-label {{options.LabelExtraClasses}}\">\r\n {{options.LabelValue}}\r\n <!--Asterisk-->\r\n <span *ngIf=\"((options.ShowAsterisk&&options.IsRequired)||(options.IsRequired))&&!options.IsReadonly\" class=\"text-danger\">*</span>\r\n </label>\r\n <!--input-->\r\n <div class=\"input-group bbsf-input-container\" *ngIf=\"!options.IsReadonly\">\r\n <input class=\"form-control input-icon-o {{options.ExtraClasses}}\" [value]=\"mapAutoCompleteModel.Text\" [address]=\"mapAutoCompleteModel.Text\"\r\n value=\"{{mapAutoCompleteModel.Text}}\" aria-describedby=\"email-error\" aria-invalid=\"true\"\r\n [class.is-invalid]=\"mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched\" [placeholder]=\"options.Placeholder\"\r\n id=\"{{options.Name}}\" (keyup)=\"GermanAddressMapped($event)\" #mapSearch />\r\n <button *ngIf=\"options.showAdvancedMap\" class=\"border-0 btn-secondary btn-icon-o\" ngbTooltip=\"{{translateValue('SetLocation')}}\" type=\"button\"\r\n (click)=\"openMapModal()\">\r\n\r\n <span class=\"svg-icon svg-icon-1\">\r\n <svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path d=\"M12 13C13.6569 13 15 11.6569 15 10C15 8.34315 13.6569 7 12 7C10.3431 7 9 8.34315 9 10C9 11.6569 10.3431 13 12 13Z\"\r\n stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n <path d=\"M12 22C16 18 20 14.4183 20 10C20 5.58172 16.4183 2 12 2C7.58172 2 4 5.58172 4 10C4 14.4183 8 18 12 22Z\" stroke=\"currentColor\"\r\n stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" />\r\n </svg>\r\n </span>\r\n\r\n </button>\r\n </div>\r\n <!-- readonly -->\r\n <div *ngIf=\"options.IsReadonly\"><span class=\"readonly-view\">{{mapAutoCompleteModel.Text}}</span>\r\n </div>\r\n </div>\r\n <div class=\"subtext-container\" *ngIf=\"!options.IsReadonly\">\r\n <!-- LabelDescription-->\r\n <div class=\"bbsf-control-desc\" *ngIf=\"options.LabelDescription!=null\">{{options.LabelDescription}}</div>\r\n <!-- requiredText-->\r\n <div class=\"bbsf-validation\" *ngIf=\"(mapAutoCompleteFormControl.invalid && mapAutoCompleteFormControl.touched)\">\r\n {{getErrorValidation(mapAutoCompleteFormControl.errors|keyvalue)}}\r\n </div>\r\n </div>\r\n <div *ngIf=\"(group.valid&&group.dirty&&group.touched )||(group.untouched&&group.invalid&&group.dirty)\">{{resetError()}} </div>\r\n </div>\r\n\r\n <div id=\"mdlSample\" class=\"modal bbsf-cropper-modal\" role=\"dialog\" [ngStyle]=\"{'display': modalIsOpen ? 'block' : 'none', 'opacity': 1}\">\r\n <div class=\"modal-dialog modal-lg\">\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header\">\r\n <h4 class=\"modal-title\">\r\n {{translateValue('SetLocationOnMap')}}\r\n </h4>\r\n <button type=\"button\" class=\"btn-close\" data-dismiss=\"modal\" (click)=\"closeMapModal()\"></button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <input class=\"form-control mt-3 mb-3\" id=\"setLocationSearch\" type=\"text\" placeholder=\"{{translateValue('SetLocation')}}\">\r\n <div class=\"google-map-container\">\r\n <google-map [center]=\"mapCenter\" [width]=\"null\" [height]=\"null\" #googleMap (mapClick)=\"onMapClick($event)\">\r\n <map-marker [position]=\"markerPosition\" [options]=\"markerOptions\"></map-marker>\r\n </google-map>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-sm btn-light\" (click)=\"closeMapModal()\">\r\n {{translateValue(\"Cancel\")}}\r\n </button>\r\n <button type=\"button\" class=\"btn btn-sm btn-brand\" (click)=\"submitSetLocation()\">\r\n {{translateValue('Confirm')}}\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n</ng-container>" }]
312
386
  }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.ControlUtility }, { type: i2.ControlContainer, decorators: [{
313
387
  type: Optional
314
- }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }], propDecorators: { group: [{
388
+ }] }, { type: i2.FormGroupDirective }, { type: i3.UtilityService }, { type: i3.BBSFTranslateService }, { type: i3.ControlValidationService }, { type: i4.GlobalSettings }, { type: i5.ScriptService }, { type: i6.NgbModal }], propDecorators: { group: [{
315
389
  type: Input
316
390
  }], options: [{
317
391
  type: Input
@@ -319,6 +393,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImpor
319
393
  type: Output
320
394
  }], searchElementRef: [{
321
395
  type: ViewChild,
322
- args: ["search", { static: false }]
396
+ args: ["mapSearch", { static: false }]
397
+ }], advancedMapModal: [{
398
+ type: ViewChild,
399
+ args: ["advancedMapModal", { static: false }]
400
+ }], gMap: [{
401
+ type: ViewChild,
402
+ args: ["googleMap", { static: false, }]
323
403
  }] } });
324
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBc0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQW9FLE1BQU0sZ0JBQWdCLENBQUM7QUFHM0gsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7Ozs7Ozs7QUFZNUUsTUFBTSxPQUFPLHdCQUF3QjthQUc1QiwyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQUNyQztJQUNFLHdDQUF3QztJQUNoQyxNQUFjLEVBQ2QsY0FBOEIsRUFDbEIsZ0JBQWtDLEVBQy9DLDBCQUE4QyxFQUM3QyxjQUE4QixFQUM5QixTQUErQixFQUMvQix3QkFBa0QsRUFDbEQsY0FBOEI7UUFQOUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUNkLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUNsQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQy9DLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBb0I7UUFDN0MsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQzlCLGNBQVMsR0FBVCxTQUFTLENBQXNCO1FBQy9CLDZCQUF3QixHQUF4Qix3QkFBd0IsQ0FBMEI7UUFDbEQsbUJBQWMsR0FB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QVEsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQztRQUNqRSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1FBQ25FLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7UUFDMUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3pELDBDQUEwQztRQUMxQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDakQsQ0FBQzs4R0FqVVUsd0JBQXdCO2tHQUF4Qix3QkFBd0IsMlBDakJyQyxrb0VBc0NBOzsyRkRyQmEsd0JBQXdCO2tCQUxwQyxTQUFTOytCQUNFLHNCQUFzQjs7MEJBWTdCLFFBQVE7OE1BU0YsS0FBSztzQkFBYixLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDSSxRQUFRO3NCQUFqQixNQUFNO2dCQVNBLGdCQUFnQjtzQkFEdEIsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiZGVjbGFyZSBjb25zdCBnb29nbGU6IGFueVxyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgSW5wdXQsIE9wdGlvbmFsLCBOZ1pvbmUsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIFZhbGlkYXRvcnMsIEZvcm1Hcm91cCwgQWJzdHJhY3RDb250cm9sLCBDb250cm9sQ29udGFpbmVyLCBGb3JtR3JvdXBEaXJlY3RpdmUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENvbnRyb2xVdGlsaXR5IH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0NvbnRyb2xVdGlsaXR5JztcclxuaW1wb3J0IHsgTWFwQXV0b0NvbXBsZXRlT3B0aW9ucyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTWFwQXV0b0NvbXBsZXRlT3B0aW9ucyc7XHJcbmltcG9ydCB7IE1hcEF1dG9jb21wbGV0ZURUTyB9IGZyb20gJy4uLy4uL1NoYXJlZC9Nb2RlbHMvTWFwQXV0b2NvbXBsZXRlRFRPJztcclxuLy8gaW1wb3J0IHsgTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyLW1hdGVyaWFsLWV4dGVuc2lvbnMvZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlJztcclxuLy8gaW1wb3J0IHsgTWFwc0FQSUxvYWRlciwgTGF6eU1hcHNBUElMb2FkZXIgfSBmcm9tICdAYW1pbi1rYXJpbWkvYWdtLWNvcmUnO1xyXG5pbXBvcnQgeyBCQlNGVHJhbnNsYXRlU2VydmljZSwgQ29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLCBlbnZpcm9ubWVudCwgVXRpbGl0eVNlcnZpY2UgfSBmcm9tICdAYm5zaWdodHMvYmJzZi11dGlsaXRpZXMnO1xyXG5pbXBvcnQgeyBHbG9iYWxTZXR0aW5ncyB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9HbG9iYWxTZXR0aW5ncy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdCQlNGLU1hcEF1dG9Db21wbGV0ZScsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL01hcEF1dG9Db21wbGV0ZS5jb21wb25lbnQuaHRtbCdcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXBBdXRvQ29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG5cclxuXHJcbiAgc3RhdGljIGNvbnRyb2xDb250YWluZXJzdGF0aWMgPSBudWxsO1xyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgLy8gcHJpdmF0ZSBtYXBzQVBJTG9hZGVyOiBNYXBzQVBJTG9hZGVyLFxyXG4gICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSxcclxuICAgIHByaXZhdGUgY29udHJvbFV0aWxpdHk6IENvbnRyb2xVdGlsaXR5LFxyXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSBjb250cm9sQ29udGFpbmVyOiBDb250cm9sQ29udGFpbmVyLFxyXG4gICAgcHVibGljIE1hcEF1dG9Db21wbGV0ZUNvbnRyb2xIb3N0OiBGb3JtR3JvdXBEaXJlY3RpdmUsXHJcbiAgICBwcml2YXRlIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSxcclxuICAgIHByaXZhdGUgdHJhbnNsYXRlOiBCQlNGVHJhbnNsYXRlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlOiBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGdsb2JhbFNldHRpbmdzOiBHbG9iYWxTZXR0aW5ncykge1xyXG4gICAgTWFwQXV0b0NvbXBsZXRlQ29tcG9uZW50LmNvbnRyb2xDb250YWluZXJzdGF0aWMgPSB0aGlzLmNvbnRyb2xDb250YWluZXI7XHJcbiAgICB0aGlzLkN1cnJlbnRMYW5ndWFnZSA9IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyAhPSB1bmRlZmluZWQgPyB0cmFuc2xhdGUuY3VycmVudExhbmcgOiB0cmFuc2xhdGUuZGVmYXVsdExhbmdcclxuICB9XHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBNYXBBdXRvQ29tcGxldGVPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuXHJcbiAgTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2w6IEFic3RyYWN0Q29udHJvbDtcclxuICBNYXBBdXRvQ29tcGxldGVNb2RlbDogTWFwQXV0b2NvbXBsZXRlRFRPID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gIEN1cnJlbnRMYW5ndWFnZTogc3RyaW5nID0gXCJcIjtcclxuICBvbkF1dG9jb21wbGV0ZVNlbGVjdGVkID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIG9uR2VybWFuQWRkcmVzc01hcHBlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBvbkxvY2F0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcbiAgQFZpZXdDaGlsZChcInNlYXJjaFwiLCB7IHN0YXRpYzogZmFsc2UgfSlcclxuICBwdWJsaWMgc2VhcmNoRWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuICAvLyBNYXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlQ29tcG9uZW50OiBNYXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlQ29tcG9uZW50XHJcbiAgLy8gTGF6eU1hcHNBUElMb2FkZXI6IExhenlNYXBzQVBJTG9hZGVyXHJcbiAgbWFya0FsbEFzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHZhbGlkYXRpb25SdWxlcyA9IFtdO1xyXG4gIHZhbGlkYXRpb25SdWxlc2FzeW5jID0gW107XHJcbiAgcGxhY2U6IGFueTtcclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuY29udHJvbFZhbGlkYXRpb25TZXJ2aWNlLmlzQ3JlYXRlZEJlZm9yID0gZmFsc2VcclxuXHJcbiAgICAvLyB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgLy8gdGhpcy50cmFuc2xhdGUub25MYW5nQ2hhbmdlLnN1YnNjcmliZSgoZXZlbnQpID0+IHtcclxuICAgIC8vICAgdGhpcy5DdXJyZW50TGFuZ3VhZ2UgPSBldmVudC5sYW5nO1xyXG4gICAgLy8gICA7XHJcbiAgICAvLyAgIGlmICh0aGlzLkN1cnJlbnRMYW5ndWFnZSA9PSAnYXInKVxyXG4gICAgLy8gICAgIHRoaXMubWFwc0FQSUxvYWRlcltcIl9jb25maWdcIl1bXCJsb2NhbGVJZFwiXSA9IFwiYXItRUdcIjtcclxuICAgIC8vICAgaWYgKHRoaXMuQ3VycmVudExhbmd1YWdlID09ICdlbicpXHJcbiAgICAvLyAgICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdID0gXCJlbi1VU1wiO1xyXG4gICAgLy8gICB0aGlzLm1hcHNBUElMb2FkZXJbXCJfc2NyaXB0TG9hZGluZ1Byb21pc2VcIl0gPSBudWxsXHJcbiAgICAvLyAgIHRoaXMubWFwc0FQSUxvYWRlcltcIl9jb25maWdcIl1bXCJhcGlLZXlcIl0gPSBgJHtlbnZpcm9ubWVudC5CQlNGX0dvb2dsZU1hcEtleX0mbGFuZ3VhZ2U9JHt0aGlzLkN1cnJlbnRMYW5ndWFnZX1gO1xyXG4gICAgLy8gICB2YXIgU2NyaXB0VGFnID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tYXBzQVBJTG9hZGVyW1wiX1NDUklQVF9JRFwiXSk7XHJcbiAgICAvLyAgIGlmIChTY3JpcHRUYWcpXHJcbiAgICAvLyAgICAgU2NyaXB0VGFnLnJlbW92ZSgpO1xyXG4gICAgLy8gICB2YXIgZWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwicGFjLWNvbnRhaW5lclwiKTtcclxuICAgIC8vICAgd2hpbGUgKGVsZW1lbnRzLmxlbmd0aCA+IDApXHJcbiAgICAvLyAgICAgZWxlbWVudHNbMF0ucmVtb3ZlKCk7XHJcblxyXG4gICAgLy8gICBsZXQgd2luZG93ID0gdGhpcy5tYXBzQVBJTG9hZGVyW1wiX3dpbmRvd1JlZlwiXS5nZXROYXRpdmVXaW5kb3coKTtcclxuICAgIC8vICAgd2luZG93Lmdvb2dsZSA9IG51bGxcclxuXHJcblxyXG5cclxuICAgIC8vICAgdGhpcy5MYXp5TWFwc0FQSUxvYWRlciA9IG5ldyBMYXp5TWFwc0FQSUxvYWRlcih7XHJcbiAgICAvLyAgICAgLy8gJmxhbmd1YWdlPSR7VXRpbGl0eVNlcnZpY2UuQ3VycmVudExhbmd1YWdlfVxyXG4gICAgLy8gICAgIGFwaUtleTogYCR7ZW52aXJvbm1lbnQuQkJTRl9Hb29nbGVNYXBLZXl9Jmxhbmd1YWdlPSR7dGhpcy5DdXJyZW50TGFuZ3VhZ2V9YCxcclxuICAgIC8vICAgICBsaWJyYXJpZXM6IFsncGxhY2VzJ10sXHJcbiAgICAvLyAgIH0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl93aW5kb3dSZWZcIl0sIHRoaXMubWFwc0FQSUxvYWRlcltcIl9kb2N1bWVudFJlZlwiXSwgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdKTtcclxuICAgIC8vICAgdGhpcy5MYXp5TWFwc0FQSUxvYWRlci5sb2FkKCkudGhlbigoKSA9PiB7XHJcbiAgICAvLyAgICAgbGV0IGF1dG9jb21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKHRoaXMuc2VhcmNoRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAvLyAgICAgICB0eXBlczogW1wiYWRkcmVzc1wiXVxyXG5cclxuICAgIC8vICAgICB9KTtcclxuICAgIC8vICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoLyoqXHJcbiAgICAvLyAgICAgICAgICAgICAqIEByZXR1cm4gez99XHJcbiAgICAvLyAgICAgICAgICAgICAqL1xyXG4gICAgLy8gICAgICAgKCkgPT4ge1xyXG5cclxuICAgIC8vICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgvKipcclxuICAgIC8vICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgKi9cclxuICAgIC8vICAgICAgICAgICAoKSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAvLyBnZXQgdGhlIHBsYWNlIHJlc3VsdFxyXG4gICAgLy8gICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqL1xyXG4gICAgLy8gICAgICAgICAgICAgY29uc3QgcGxhY2UgPSBhdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcclxuICAgIC8vICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi9cclxuICAgIC8vICAgICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3MgPSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgIGdtSUQ6IHBsYWNlLmlkLFxyXG4gICAgLy8gICAgICAgICAgICAgICBpY29uOiBwbGFjZS5pY29uLFxyXG4gICAgLy8gICAgICAgICAgICAgICB1cmw6IHBsYWNlLnVybCxcclxuICAgIC8vICAgICAgICAgICAgICAgcGxhY2VJRDogcGxhY2UucGxhY2VfaWQsXHJcbiAgICAvLyAgICAgICAgICAgICAgIGRpc3BsYXlBZGRyZXNzOiBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyxcclxuICAgIC8vICAgICAgICAgICAgICAgbmFtZTogcGxhY2UubmFtZSxcclxuICAgIC8vICAgICAgICAgICAgICAgdmljaW5pdHk6IHBsYWNlLnZpY2luaXR5LFxyXG4gICAgLy8gICAgICAgICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAvLyAgICAgICAgICAgICAgIHN0YXRlOiB7fSxcclxuICAgIC8vICAgICAgICAgICAgICAgY291bnRyeToge30sXHJcbiAgICAvLyAgICAgICAgICAgICAgIGdlb0xvY2F0aW9uOiB7IGxhdGl0dWRlOiAtMSwgbG9uZ2l0dWRlOiAtMSB9LFxyXG4gICAgLy8gICAgICAgICAgICAgfTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkgJiYgcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24pIHtcclxuICAgIC8vICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sYXRpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpO1xyXG4gICAgLy8gICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmdlb0xvY2F0aW9uLmxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2goKC8qKlxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVcclxuICAgIC8vICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fVxyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgICAqL1xyXG4gICAgLy8gICAgICAgICAgICAgICB2YWx1ZSA9PiB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N0cmVldF9udW1iZXInKSA+IC0xKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3RyZWV0TnVtYmVyXCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3JvdXRlJykgPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzc1tcInN0cmVldE5hbWVcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdwb3N0YWxfY29kZScpID4gLTEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJwb3N0YWxDb2RlXCJdID0gTnVtYmVyKHZhbHVlLnNob3J0X25hbWUpO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3VibG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3VibG9jYWxpdHlcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdsb2NhbGl0eScpID4gLTEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MubG9jYWxpdHlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMScpID4gLTEpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdGF0ZVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XHJcbiAgICAvLyAgICAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmNvdW50cnlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgLy8gICAgICAgICAgICAgICAgIH1cclxuICAgIC8vICAgICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8zJykgPiAtMSkge1xyXG4gICAgLy8gICAgICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgIC8vICAgICAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICAgIH0pKTtcclxuXHJcbiAgICAvLyAgICAgICAgICAgICB0aGlzLm9uR2VybWFuQWRkcmVzc01hcHBlZC5lbWl0KGdlcm1hbkFkZHJlc3MpO1xyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5HZXJtYW5BZGRyZXNzTWFwcGVkKGdlcm1hbkFkZHJlc3MpXHJcbiAgICAvLyAgICAgICAgICAgICBpZiAoIXBsYWNlLnBsYWNlX2lkIHx8IHBsYWNlLmdlb21ldHJ5ID09PSB1bmRlZmluZWQgfHwgcGxhY2UuZ2VvbWV0cnkgPT09IG51bGwpIHtcclxuICAgIC8vICAgICAgICAgICAgICAgLy8gcGxhY2UgcmVzdWx0IGlzIG5vdCB2YWxpZFxyXG4gICAgLy8gICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAvLyAgICAgICAgICAgICB9XHJcbiAgICAvLyAgICAgICAgICAgICBlbHNlIHtcclxuICAgIC8vICAgICAgICAgICAgICAgLy8gc2hvdyBkaWFsb2cgdG8gc2VsZWN0IGEgYWRkcmVzcyBmcm9tIHRoZSBpbnB1dFxyXG4gICAgLy8gICAgICAgICAgICAgICAvLyBlbWl0IGZhaWxlZCBldmVudFxyXG4gICAgLy8gICAgICAgICAgICAgfVxyXG4gICAgLy8gICAgICAgICAgICAgLy8gICB0aGlzLmFkZHJlc3MgPSBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMub25BdXRvY29tcGxldGVTZWxlY3RlZC5lbWl0KHBsYWNlKTtcclxuICAgIC8vICAgICAgICAgICAgIHRoaXMuQXV0b2NvbXBsZXRlU2VsZWN0ZWQocGxhY2UpXHJcblxyXG4gICAgLy8gICAgICAgICAgICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0ZWQuZW1pdCh7XHJcbiAgICAvLyAgICAgICAgICAgICAgIGxhdGl0dWRlOiBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKSxcclxuICAgIC8vICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKVxyXG4gICAgLy8gICAgICAgICAgICAgfSk7XHJcbiAgICAvLyAgICAgICAgICAgfSkpO1xyXG4gICAgLy8gICAgICAgfSkpO1xyXG4gICAgLy8gICB9KTtcclxuXHJcbiAgICAvLyB9KTtcclxuXHJcbiAgICAvLyBpZiAodGhpcy5DdXJyZW50TGFuZ3VhZ2UgPT0gJ2FyJylcclxuICAgIC8vICAgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2NvbmZpZ1wiXVtcImxvY2FsZUlkXCJdID0gXCJhci1FR1wiO1xyXG4gICAgLy8gaWYgKHRoaXMuQ3VycmVudExhbmd1YWdlID09ICdlbicpXHJcbiAgICAvLyAgIHRoaXMubWFwc0FQSUxvYWRlcltcIl9jb25maWdcIl1bXCJsb2NhbGVJZFwiXSA9IFwiZW4tVVNcIjtcclxuICAgIC8vIHRoaXMubWFwc0FQSUxvYWRlcltcIl9zY3JpcHRMb2FkaW5nUHJvbWlzZVwiXSA9IG51bGxcclxuICAgIC8vIHRoaXMubWFwc0FQSUxvYWRlcltcIl9jb25maWdcIl1bXCJhcGlLZXlcIl0gPSBgJHtlbnZpcm9ubWVudC5CQlNGX0dvb2dsZU1hcEtleX0mbGFuZ3VhZ2U9JHt0aGlzLkN1cnJlbnRMYW5ndWFnZX1gO1xyXG4gICAgLy8gdmFyIGxlZnRTZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5tYXBzQVBJTG9hZGVyW1wiX1NDUklQVF9JRFwiXSk7XHJcbiAgICAvLyBpZiAobGVmdFNlY3Rpb24pXHJcbiAgICAvLyAgIGxlZnRTZWN0aW9uLnJlbW92ZSgpO1xyXG4gICAgLy8gdGhpcy5MYXp5TWFwc0FQSUxvYWRlciA9IG5ldyBMYXp5TWFwc0FQSUxvYWRlcih7XHJcbiAgICAvLyAgIGFwaUtleTogYCR7ZW52aXJvbm1lbnQuQkJTRl9Hb29nbGVNYXBLZXl9Jmxhbmd1YWdlPSR7dGhpcy5DdXJyZW50TGFuZ3VhZ2V9YCxcclxuICAgIC8vICAgbGlicmFyaWVzOiBbJ3BsYWNlcyddLFxyXG4gICAgLy8gfSwgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX3dpbmRvd1JlZlwiXSwgdGhpcy5tYXBzQVBJTG9hZGVyW1wiX2RvY3VtZW50UmVmXCJdLCB0aGlzLm1hcHNBUElMb2FkZXJbXCJfY29uZmlnXCJdW1wibG9jYWxlSWRcIl0pO1xyXG4gICAgLy8gdGhpcy5MYXp5TWFwc0FQSUxvYWRlci5sb2FkKCk7XHJcblxyXG4gICAgLy8gdGhpcy5tYXBzQVBJTG9hZGVyLmxvYWQoKS50aGVuKCgpID0+IHtcclxuICAgIC8vICAgbGV0IGF1dG9jb21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKHRoaXMuc2VhcmNoRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAvLyAgICAgdHlwZXM6IFtcImFkZHJlc3NcIl1cclxuXHJcbiAgICAvLyAgIH0pO1xyXG5cclxuICAgIC8vIH0pXHJcbiAgICB0aGlzLmdyb3VwLmFkZENvbnRyb2wodGhpcy5vcHRpb25zLk5hbWUsIG5ldyBGb3JtQ29udHJvbCgnJykpO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCA9IHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdOyAvLyAgbmV3IEZvcm1Db250cm9sKCcnLHZhbGlkYXRpb25SdWxlcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLm9wdGlvbnMuVmlld1R5cGUpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5WaWV3VHlwZSA9IHRoaXMuZ2xvYmFsU2V0dGluZ3MuVmlld1R5cGU7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc1JlcXVpcmVkKSB7XHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9IG51bGwgJiYgdGhpcy5vcHRpb25zLkxhYmVsS2V5ICE9IFwiXCIpXHJcbiAgICAgIHRoaXMub3B0aW9ucy5MYWJlbFZhbHVlID0gdGhpcy5VdGlsaXR5U2VydmljZS5nZXRSZXNvdXJjZVZhbHVlKHRoaXMub3B0aW9ucy5MYWJlbEtleSk7XHJcblxyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzKTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0QXN5bmNWYWxpZGF0b3JzKHRoaXMudmFsaWRhdGlvblJ1bGVzYXN5bmMpO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5Jc0Rpc2FibGVkKSB7XHJcbiAgICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuZGlzYWJsZSgpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBnZXJtYW5BZGRyZXNzID0ge1xyXG5cclxuICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy5WYWx1ZS5Hb29nbGVNYXBzVVJMLFxyXG4gICAgICAgIHBsYWNlSUQ6IHRoaXMub3B0aW9ucy5WYWx1ZS5QbGFjZUlELFxyXG4gICAgICAgIGRpc3BsYXlBZGRyZXNzOiB0aGlzLm9wdGlvbnMuVmFsdWUuVGV4dCxcclxuICAgICAgICBuYW1lOiB0aGlzLm9wdGlvbnMuVmFsdWUuVGV4dCxcclxuICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgIGNvdW50cnk6IHt9LFxyXG4gICAgICAgIGdlb0xvY2F0aW9uOiB7IGxhdGl0dWRlOiAtMSwgbG9uZ2l0dWRlOiAtMSB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sYXRpdHVkZSA9IHRoaXMub3B0aW9ucy5WYWx1ZS5MYXRpdHVkZTtcclxuICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sb25naXR1ZGUgPSB0aGlzLm9wdGlvbnMuVmFsdWUuTG9uZ2l0dWRlO1xyXG4gICAgICB0aGlzLm9uR2VybWFuQWRkcmVzc01hcHBlZC5lbWl0KGdlcm1hbkFkZHJlc3MpO1xyXG4gICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcylcclxuICAgICAgdGhpcy5wbGFjZSA9IHtcclxuXHJcbiAgICAgICAgdXJsOiB0aGlzLm9wdGlvbnMuVmFsdWUuR29vZ2xlTWFwc1VSTCxcclxuICAgICAgICBwbGFjZV9pZDogdGhpcy5vcHRpb25zLlZhbHVlLlBsYWNlSUQsXHJcbiAgICAgICAgZm9ybWF0dGVkX2FkZHJlc3M6IHRoaXMub3B0aW9ucy5WYWx1ZS5UZXh0LFxyXG4gICAgICAgIG5hbWU6IHRoaXMub3B0aW9ucy5WYWx1ZS5UZXh0LFxyXG4gICAgICB9O1xyXG4gICAgICB0aGlzLm9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQuZW1pdCh0aGlzLnBsYWNlKTtcclxuICAgICAgdGhpcy5BdXRvY29tcGxldGVTZWxlY3RlZCh0aGlzLnBsYWNlKVxyXG5cclxuICAgICAgdGhpcy5vbkxvY2F0aW9uU2VsZWN0ZWQuZW1pdCh7XHJcbiAgICAgICAgbGF0aXR1ZGU6IHRoaXMub3B0aW9ucy5WYWx1ZS5MYXRpdHVkZSxcclxuICAgICAgICBsb25naXR1ZGU6IHRoaXMub3B0aW9ucy5WYWx1ZS5Mb25naXR1ZGVcclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdLnNldFZhbHVlKHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwpXHJcbiAgICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLlZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbnMgPSB0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvblxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpXHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWVcclxuICAgIH0pXHJcblxyXG5cclxuICB9XHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0ICE9IG51bGwpIHtcclxuICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdC5sZW5ndGg7IGluZGV4KyspIHtcclxuICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSh0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0uS2V5LCB0aGlzLm9wdGlvbnMuQXR0cmlidXRlTGlzdFtpbmRleF0udmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB2YXIgZWxlbWVudEhUTUwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLm9wdGlvbnMuTmFtZSkgYXMgYW55XHJcbiAgICBlbGVtZW50SFRNTC52YWx1ZSA9IHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwuVGV4dDtcclxuICB9XHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgQXV0b2NvbXBsZXRlU2VsZWN0ZWQocmVzdWx0KSB7XHJcblxyXG5cclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwgPT0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0ID0gcmVzdWx0LmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5QbGFjZUlEID0gcmVzdWx0LnBsYWNlX2lkO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5Hb29nbGVNYXBzVVJMID0gcmVzdWx0LnVybDtcclxuICB9XHJcbiAgTG9jYXRpb25TZWxlY3RlZChsb2NhdGlvbikge1xyXG5cclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwuTGF0aXR1ZGUgPSBsb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwuTG9uZ2l0dWRlID0gbG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuXHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwpO1xyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmIHRoaXMub3B0aW9ucy5QYXRjaFBhdGggJiYgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnBhdGNoQ29udHJvbFZhbHVlKG9yaWdpbmFsVmFsdWUsIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLCB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoKVxyXG4gICAgfVxyXG4gICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICB0aGlzLm9wdGlvbnMuVmFsdWUgPSB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsO1xyXG4gIH1cclxuXHJcbiAgR2VybWFuQWRkcmVzc01hcHBlZChyZXN1bHQpIHtcclxuICAgIGlmIChyZXN1bHQudHlwZSkge1xyXG4gICAgICBpZiAocmVzdWx0LnRhcmdldC52YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5NYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwgPT0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0ID0gcmVzdWx0LmRpc3BsYXlBZGRyZXNzO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5QbGFjZUlEID0gcmVzdWx0LnBsYWNlSUQ7XHJcbiAgICB0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsLkdvb2dsZU1hcHNVUkwgPSByZXN1bHQudXJsO1xyXG4gICAgdGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbC5MYXRpdHVkZSA9IHJlc3VsdC5nZW9Mb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWwuTG9uZ2l0dWRlID0gcmVzdWx0Lmdlb0xvY2F0aW9uLmxvbmdpdHVkZTtcclxuICAgIHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5NYXBBdXRvQ29tcGxldGVNb2RlbCk7XHJcbiAgICB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXS5zZXRWYWx1ZSh0aGlzLk1hcEF1dG9Db21wbGV0ZU1vZGVsKVxyXG4gICAgdGhpcy5PbkNoYW5nZS5lbWl0KHRoaXMuTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wudmFsdWUpXHJcbiAgICAvL1VzZSB0aGlzIGxpbmUgdG8gZW5hYmxlIHR3byB3YXkgYmluZGluZy5cclxuICAgIHRoaXMub3B0aW9ucy5WYWx1ZSA9IHRoaXMuTWFwQXV0b0NvbXBsZXRlTW9kZWw7XHJcbiAgfVxyXG5cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG5cclxuICBSZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZVJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuICAvL0V4dGVybmFsIE1ldGhvZFxyXG5cclxuICBBZGRSZXF1aXJlZFZhbGlkYXRpb24gPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LkFkZFJlcXVpcmVkVmFsaWRhdGlvbih0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgdGhpcy5vcHRpb25zKVxyXG4gIH1cclxuXHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBSZW1vdmVDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbih0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcbiAgLy9FeHRlcm5hbCBNZXRob2RcclxuICBBZGRDdXN0b21WYWxpZGF0aW9uID0gKEN1c3RvbVZhbGlkYXRpb24pID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuQWRkQ3VzdG9tVmFsaWRhdGlvbih0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLCB0aGlzLnZhbGlkYXRpb25SdWxlcywgQ3VzdG9tVmFsaWRhdGlvbilcclxuICB9XHJcblxyXG4gIC8vRXh0ZXJuYWwgTWV0aG9kXHJcbiAgSXNWYWxpZCA9ICgpID0+IHtcclxuICAgIHRoaXMuY29udHJvbFV0aWxpdHkuSXNWYWxpZCh0aGlzLk1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sKVxyXG4gIH1cclxufVxyXG5cclxuXHJcbiIsIlxyXG48ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBiYnNmLWNvbnRyb2wgYmJzZi1tYXBzXCIgW2Zvcm1Hcm91cF09XCJncm91cFwiPlxyXG4gIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMuVmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgPCEtLWxhYmVsLS0+XHJcbiAgICA8bGFiZWwgKm5nSWY9XCIhb3B0aW9ucy5IaWRlTGFiZWxcIiBjbGFzcz1cImJic2YtbGFiZWwge3tvcHRpb25zLkxhYmVsRXh0cmFDbGFzc2VzfX1cIj5cclxuICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICA8IS0tQXN0ZXJpc2stLT5cclxuICAgICAgPHNwYW4gKm5nSWY9XCIoKG9wdGlvbnMuU2hvd0FzdGVyaXNrJiZvcHRpb25zLklzUmVxdWlyZWQpfHwob3B0aW9ucy5Jc1JlcXVpcmVkKSkmJiFvcHRpb25zLklzUmVhZG9ubHlcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+Kjwvc3Bhbj5cclxuICAgIDwvbGFiZWw+XHJcbiAgICA8IS0taW5wdXQtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJiYnNmLWlucHV0LWNvbnRhaW5lclwiICAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9se3tvcHRpb25zLkV4dHJhQ2xhc3Nlc319XCJcclxuICAgICAgICAgICAgIFt2YWx1ZV09XCJNYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0XCJcclxuICAgICAgICAgICAgIFthZGRyZXNzXT1cIk1hcEF1dG9Db21wbGV0ZU1vZGVsLlRleHRcIlxyXG4gICAgICAgICAgICAgdmFsdWU9XCJ7e01hcEF1dG9Db21wbGV0ZU1vZGVsLlRleHR9fVwiXHJcbiAgICAgICAgICAgICBhcmlhLWRlc2NyaWJlZGJ5PVwiZW1haWwtZXJyb3JcIlxyXG4gICAgICAgICAgICAgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJNYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5pbnZhbGlkICYmIE1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnRvdWNoZWRcIlxyXG4gICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7e29wdGlvbnMuUGxhY2Vob2xkZXJ9fVwiIGlkPVwie3tvcHRpb25zLk5hbWV9fVwiIChrZXl1cCk9XCJHZXJtYW5BZGRyZXNzTWFwcGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgbWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZSAjc2VhcmNoIChvbkF1dG9jb21wbGV0ZVNlbGVjdGVkKT1cIkF1dG9jb21wbGV0ZVNlbGVjdGVkKCRldmVudClcIlxyXG4gICAgICAgICAgICAgKG9uTG9jYXRpb25TZWxlY3RlZCk9XCJMb2NhdGlvblNlbGVjdGVkKCRldmVudClcIiAob25HZXJtYW5BZGRyZXNzTWFwcGVkKT1cIkdlcm1hbkFkZHJlc3NNYXBwZWQoJGV2ZW50KVwiIC8+XHJcblxyXG4gICAgPC9kaXY+XHJcbiAgICAgPCEtLSByZWFkb25seSAtLT5cclxuICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5Jc1JlYWRvbmx5XCI+PHNwYW4gY2xhc3M9XCJyZWFkb25seS12aWV3XCI+e3tNYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0fX08L3NwYW4+XHJcbiAgICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cInN1YnRleHQtY29udGFpbmVyXCIgICpuZ0lmPVwiIW9wdGlvbnMuSXNSZWFkb25seVwiPlxyXG4gICAgPCEtLSBMYWJlbERlc2NyaXB0aW9uLS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi1jb250cm9sLWRlc2NcIiAqbmdJZj1cIm9wdGlvbnMuTGFiZWxEZXNjcmlwdGlvbiE9bnVsbFwiPnt7b3B0aW9ucy5MYWJlbERlc2NyaXB0aW9ufX08L2Rpdj5cclxuICAgIDwhLS0gcmVxdWlyZWRUZXh0LS0+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCJcclxuICAgICAgICAgKm5nSWY9XCIoTWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBNYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICB7e2dldEVycm9yVmFsaWRhdGlvbihNYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5lcnJvcnN8a2V5dmFsdWUpfX1cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG4gIDxkaXYgKm5nSWY9XCIoZ3JvdXAudmFsaWQmJmdyb3VwLmRpcnR5JiZncm91cC50b3VjaGVkICl8fChncm91cC51bnRvdWNoZWQmJmdyb3VwLmludmFsaWQmJmdyb3VwLmRpcnR5KVwiPnt7cmVzZXRFcnJvcigpfX0gPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
404
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Jic2YtY29udHJvbHMvc3JjL2xpYi9jb250cm9scy9NYXBBdXRvQ29tcGxldGUvTWFwQXV0b0NvbXBsZXRlLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxTQUFTLEVBQVUsS0FBSyxFQUFFLFFBQVEsRUFBc0IsU0FBUyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHM0ksT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFDNUUsT0FBTyxFQUFrRSxXQUFXLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV2SCxPQUFPLEVBQXFDLFdBQVcsRUFBaUMsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7Ozs7QUFTM0gsTUFBTSxPQUFPLHdCQUF3QjthQUM1QiwyQkFBc0IsR0FBRyxJQUFJLEFBQVAsQ0FBUTtJQUVyQyxZQUFvQixNQUFjLEVBQVUsY0FBOEIsRUFBc0IsZ0JBQWtDLEVBQ3pILDBCQUE4QyxFQUFVLGNBQThCLEVBQVUsU0FBK0IsRUFDOUgsd0JBQWtELEVBQVUsY0FBOEIsRUFBVSxhQUE0QixFQUFVLFlBQXNCO1FBRnRKLFdBQU0sR0FBTixNQUFNLENBQVE7UUFBVSxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFBc0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUN6SCwrQkFBMEIsR0FBMUIsMEJBQTBCLENBQW9CO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQWdCO1FBQVUsY0FB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LE1BQU0sRUFBRSxLQUFLLEdBQUciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ2JNb2RhbCB9IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIElucHV0LCBPcHRpb25hbCwgTmdab25lLCBFbGVtZW50UmVmLCBWaWV3Q2hpbGQsIEV2ZW50RW1pdHRlciwgT3V0cHV0LCBWaWV3RW5jYXBzdWxhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb250cm9sVXRpbGl0eSB9IGZyb20gJy4uLy4uL1NoYXJlZC9zZXJ2aWNlcy9Db250cm9sVXRpbGl0eSc7XHJcbmltcG9ydCB7IE1hcEF1dG9Db21wbGV0ZU9wdGlvbnMgfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL01hcEF1dG9Db21wbGV0ZU9wdGlvbnMnO1xyXG5pbXBvcnQgeyBNYXBBdXRvY29tcGxldGVEVE8gfSBmcm9tICcuLi8uLi9TaGFyZWQvTW9kZWxzL01hcEF1dG9jb21wbGV0ZURUTyc7XHJcbmltcG9ydCB7IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLCBDb250cm9sVmFsaWRhdGlvblNlcnZpY2UsIFV0aWxpdHlTZXJ2aWNlLCBlbnZpcm9ubWVudCB9IGZyb20gJ0BibnNpZ2h0cy9iYnNmLXV0aWxpdGllcyc7XHJcbmltcG9ydCB7IEdsb2JhbFNldHRpbmdzIH0gZnJvbSAnLi4vLi4vU2hhcmVkL3NlcnZpY2VzL0dsb2JhbFNldHRpbmdzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBBYnN0cmFjdENvbnRyb2wsIENvbnRyb2xDb250YWluZXIsIEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIEZvcm1Hcm91cERpcmVjdGl2ZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgU2NyaXB0U2VydmljZSB9IGZyb20gJ25neC1zY3JpcHQtbG9hZGVyJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnQkJTRi1NYXBBdXRvQ29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9NYXBBdXRvQ29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVcclxufSlcclxuXHJcbmV4cG9ydCBjbGFzcyBNYXBBdXRvQ29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHN0YXRpYyBjb250cm9sQ29udGFpbmVyU3RhdGljID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBjb250cm9sVXRpbGl0eTogQ29udHJvbFV0aWxpdHksIEBPcHRpb25hbCgpIHByaXZhdGUgY29udHJvbENvbnRhaW5lcjogQ29udHJvbENvbnRhaW5lcixcclxuICAgIHB1YmxpYyBtYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdDogRm9ybUdyb3VwRGlyZWN0aXZlLCBwcml2YXRlIFV0aWxpdHlTZXJ2aWNlOiBVdGlsaXR5U2VydmljZSwgcHJpdmF0ZSB0cmFuc2xhdGU6IEJCU0ZUcmFuc2xhdGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBjb250cm9sVmFsaWRhdGlvblNlcnZpY2U6IENvbnRyb2xWYWxpZGF0aW9uU2VydmljZSwgcHJpdmF0ZSBnbG9iYWxTZXR0aW5nczogR2xvYmFsU2V0dGluZ3MsIHByaXZhdGUgc2NyaXB0U2VydmljZTogU2NyaXB0U2VydmljZSwgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsKSB7XHJcbiAgICBNYXBBdXRvQ29tcGxldGVDb21wb25lbnQuY29udHJvbENvbnRhaW5lclN0YXRpYyA9IHRoaXMuY29udHJvbENvbnRhaW5lcjtcclxuICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gdHJhbnNsYXRlLmN1cnJlbnRMYW5nICE9IHVuZGVmaW5lZCA/IHRyYW5zbGF0ZS5jdXJyZW50TGFuZyA6IHRyYW5zbGF0ZS5kZWZhdWx0TGFuZztcclxuXHJcbiAgICB0aGlzLnNjcmlwdFNlcnZpY2UubG9hZFNjcmlwdChgaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0ke2Vudmlyb25tZW50LkJCU0ZfR29vZ2xlTWFwS2V5fSZsaWJyYXJpZXM9cGxhY2VzYClcclxuICAgICAgLnN1YnNjcmliZShfID0+IHtcclxuICAgICAgICB0aGlzLnNob3dNYXAgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMubWFwU2NyaXB0TG9hZGVkKCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgZ3JvdXA6IEZvcm1Hcm91cDtcclxuICBASW5wdXQoKSBvcHRpb25zOiBNYXBBdXRvQ29tcGxldGVPcHRpb25zO1xyXG4gIEBPdXRwdXQoKSBPbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbDogQWJzdHJhY3RDb250cm9sO1xyXG4gIG1hcEF1dG9Db21wbGV0ZU1vZGVsOiBNYXBBdXRvY29tcGxldGVEVE8gPSBuZXcgTWFwQXV0b2NvbXBsZXRlRFRPKCk7XHJcbiAgY3VycmVudExhbmd1YWdlOiBzdHJpbmcgPSBcIlwiO1xyXG4gIG1hcmtBbGxBc1RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB2YWxpZGF0aW9uUnVsZXMgPSBbXTtcclxuICB2YWxpZGF0aW9uUnVsZXNBc3luYyA9IFtdO1xyXG4gIHBsYWNlOiBhbnk7XHJcbiAgc2hvd01hcDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIG1hcmtlclBvc2l0aW9uOiBhbnkgPSBudWxsO1xyXG4gIG1hcENlbnRlcjogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbDtcclxuICBtb2RhbElzT3BlbjogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBAVmlld0NoaWxkKFwibWFwU2VhcmNoXCIsIHsgc3RhdGljOiBmYWxzZSB9KSBwdWJsaWMgc2VhcmNoRWxlbWVudFJlZjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKFwiYWR2YW5jZWRNYXBNb2RhbFwiLCB7IHN0YXRpYzogZmFsc2UgfSkgYWR2YW5jZWRNYXBNb2RhbDogYW55O1xyXG4gIEBWaWV3Q2hpbGQoXCJnb29nbGVNYXBcIiwgeyBzdGF0aWM6IGZhbHNlLCB9KSBnTWFwOiBnb29nbGUubWFwcy5NYXA7XHJcblxyXG4gIG1hcmtlck9wdGlvbnM6IGdvb2dsZS5tYXBzLk1hcmtlck9wdGlvbnM7XHJcbiAgc2VsZWN0ZWRQaW46IGFueTtcclxuXHJcbiAgLy8jcmVnaW9uIGV2ZW50c1xyXG5cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5pc0NyZWF0ZWRCZWZvciA9IGZhbHNlXHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsID0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG5cclxuICAgIHRoaXMudHJhbnNsYXRlLm9uTGFuZ0NoYW5nZS5zdWJzY3JpYmUoKGV2ZW50KSA9PiB7XHJcbiAgICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gZXZlbnQubGFuZztcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaW5pdGlhbGl6ZUNvbnRyb2xPcHRpb25zKCk7XHJcblxyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVDb250cm9sSG9zdC5uZ1N1Ym1pdC5zdWJzY3JpYmUoXyA9PiB7XHJcbiAgICAgIHRoaXMuZ3JvdXAubWFya0FsbEFzVG91Y2hlZCgpXHJcbiAgICAgIHRoaXMubWFya0FsbEFzVG91Y2hlZCA9IHRydWVcclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBuZ0FmdGVyVmlld0luaXQoKSB7XHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkF0dHJpYnV0ZUxpc3QgIT0gbnVsbCkge1xyXG4gICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5OYW1lKTtcclxuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS5LZXksIHRoaXMub3B0aW9ucy5BdHRyaWJ1dGVMaXN0W2luZGV4XS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHZhciBlbGVtZW50SFRNTCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHRoaXMub3B0aW9ucy5OYW1lKSBhcyBhbnlcclxuICAgIGVsZW1lbnRIVE1MLnZhbHVlID0gdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0O1xyXG4gIH1cclxuXHJcbiAgLy8jZW5kcmVnaW9uXHJcblxyXG4gIHJlc2V0RXJyb3IgPSAoKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xWYWxpZGF0aW9uU2VydmljZS5yZW1vdmVHbG9iYWxFcnJvcigpO1xyXG4gIH1cclxuXHJcbiAgc2hvd0dsb2JhbEVycm9yKCkge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5zaG93R2xvYmFsRXJyb3IoKVxyXG4gIH1cclxuXHJcbiAgZ2V0RXJyb3JWYWxpZGF0aW9uKEVycm9yTGlzdCkge1xyXG4gICAgaWYgKHRoaXMubWFya0FsbEFzVG91Y2hlZCAmJiB0aGlzLmdyb3VwLmludmFsaWQpIHtcclxuICAgICAgdGhpcy5zaG93R2xvYmFsRXJyb3IoKVxyXG4gICAgICB0aGlzLm1hcmtBbGxBc1RvdWNoZWQgPSBmYWxzZVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiB0aGlzLmNvbnRyb2xVdGlsaXR5LmdldEVycm9yVmFsaWRhdGlvbk1hc3NhZ2UoRXJyb3JMaXN0LCB0aGlzLmdyb3VwLCB0aGlzLm9wdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgQXV0b2NvbXBsZXRlU2VsZWN0ZWQocmVzdWx0OiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQpIHtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwgPT0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0ID0gcmVzdWx0LmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5QbGFjZUlEID0gcmVzdWx0LnBsYWNlX2lkO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5Hb29nbGVNYXBzVVJMID0gcmVzdWx0LnVybDtcclxuICB9XHJcblxyXG4gIExvY2F0aW9uU2VsZWN0ZWQobG9jYXRpb24pIHtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuTGF0aXR1ZGUgPSBsb2NhdGlvbi5sYXRpdHVkZTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwuTG9uZ2l0dWRlID0gbG9jYXRpb24ubG9uZ2l0dWRlO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZShudWxsKTtcclxuXHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwpO1xyXG4gICAgbGV0IG9yaWdpbmFsVmFsdWUgPSB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnZhbHVlO1xyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uICYmIHRoaXMub3B0aW9ucy5QYXRjaFBhdGggJiYgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC52YWxpZCkge1xyXG4gICAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LnBhdGNoQ29udHJvbFZhbHVlKG9yaWdpbmFsVmFsdWUsIHRoaXMub3B0aW9ucy5QYXRjaEZ1bmN0aW9uLCB0aGlzLm9wdGlvbnMuUGF0Y2hQYXRoKVxyXG4gICAgfVxyXG4gICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICB0aGlzLm9wdGlvbnMuVmFsdWUgPSB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsO1xyXG4gIH1cclxuXHJcbiAgR2VybWFuQWRkcmVzc01hcHBlZChyZXN1bHQpIHtcclxuICAgIGlmIChyZXN1bHQudHlwZSkge1xyXG4gICAgICBpZiAocmVzdWx0LnRhcmdldC52YWx1ZSA9PSBcIlwiKSB7XHJcbiAgICAgICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5zZXRWYWx1ZShyZXN1bHQpO1xyXG4gICAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdLnNldFZhbHVlKHJlc3VsdCk7XHJcbiAgICAgICAgdGhpcy5vcHRpb25zLlZhbHVlID0gcmVzdWx0O1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwgPT0gbmV3IE1hcEF1dG9jb21wbGV0ZURUTygpO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0ID0gcmVzdWx0LmRpc3BsYXlBZGRyZXNzO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5QbGFjZUlEID0gcmVzdWx0LnBsYWNlSUQ7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLkdvb2dsZU1hcHNVUkwgPSByZXN1bHQudXJsO1xyXG4gICAgdGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbC5MYXRpdHVkZSA9IHJlc3VsdC5nZW9Mb2NhdGlvbi5sYXQ7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsLkxvbmdpdHVkZSA9IHJlc3VsdC5nZW9Mb2NhdGlvbi5sbmc7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwpO1xyXG4gICAgdGhpcy5ncm91cC5jb250cm9sc1t0aGlzLm9wdGlvbnMuTmFtZV0uc2V0VmFsdWUodGhpcy5tYXBBdXRvQ29tcGxldGVNb2RlbClcclxuICAgIHRoaXMuT25DaGFuZ2UuZW1pdCh0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnZhbHVlKVxyXG4gICAgLy9Vc2UgdGhpcyBsaW5lIHRvIGVuYWJsZSB0d28gd2F5IGJpbmRpbmcuXHJcbiAgICB0aGlzLm9wdGlvbnMuVmFsdWUgPSB0aGlzLm1hcEF1dG9Db21wbGV0ZU1vZGVsO1xyXG4gIH1cclxuXHJcbiAgLy8jcmVnaW9uIGhlbHBlciBtZXRob2RzXHJcblxyXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUNvbnRyb2xPcHRpb25zKCkge1xyXG4gICAgdGhpcy5ncm91cC5hZGRDb250cm9sKHRoaXMub3B0aW9ucy5OYW1lLCBuZXcgRm9ybUNvbnRyb2woJycpKTtcclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wgPSB0aGlzLmdyb3VwLmNvbnRyb2xzW3RoaXMub3B0aW9ucy5OYW1lXTtcclxuXHJcbiAgICBpZiAoIXRoaXMub3B0aW9ucy5WaWV3VHlwZSlcclxuICAgICAgdGhpcy5vcHRpb25zLlZpZXdUeXBlID0gdGhpcy5nbG9iYWxTZXR0aW5ncy5WaWV3VHlwZTtcclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLklzUmVxdWlyZWQpXHJcbiAgICAgIHRoaXMudmFsaWRhdGlvblJ1bGVzLnB1c2goVmFsaWRhdG9ycy5yZXF1aXJlZCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBudWxsICYmIHRoaXMub3B0aW9ucy5MYWJlbEtleSAhPSBcIlwiKVxyXG4gICAgICB0aGlzLm9wdGlvbnMuTGFiZWxWYWx1ZSA9IHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZSh0aGlzLm9wdGlvbnMuTGFiZWxLZXkpO1xyXG5cclxuICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlcyk7XHJcbiAgICB0aGlzLm1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnNldEFzeW5jVmFsaWRhdG9ycyh0aGlzLnZhbGlkYXRpb25SdWxlc0FzeW5jKTtcclxuICAgIGlmICh0aGlzLm9wdGlvbnMuSXNEaXNhYmxlZClcclxuICAgICAgdGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5kaXNhYmxlKCk7XHJcblxyXG4gICAgaWYgKHRoaXMub3B0aW9ucy5WYWx1ZSAhPSBudWxsKSB7XHJcbiAgICAgIGxldCBnZXJtYW5BZGRyZXNzID0ge1xyXG4gICAgICAgIHVybDogdGhpcy5vcHRpb25zLlZhbHVlLkdvb2dsZU1hcHNVUkwsXHJcbiAgICAgICAgcGxhY2VJRDogdGhpcy5vcHRpb25zLlZhbHVlLlBsYWNlSUQsXHJcbiAgICAgICAgZGlzcGxheUFkZHJlc3M6IHRoaXMub3B0aW9ucy5WYWx1ZS5UZXh0LFxyXG4gICAgICAgIG5hbWU6IHRoaXMub3B0aW9ucy5WYWx1ZS5UZXh0LFxyXG4gICAgICAgIGxvY2FsaXR5OiB7fSxcclxuICAgICAgICBzdGF0ZToge30sXHJcbiAgICAgICAgY291bnRyeToge30sXHJcbiAgICAgICAgZ2VvTG9jYXRpb246IHsgbGF0OiAtMSwgbG5nOiAtMSB9LFxyXG4gICAgICB9O1xyXG5cclxuICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sYXQgPSB0aGlzLm9wdGlvbnMuVmFsdWUuTGF0aXR1ZGU7XHJcbiAgICAgIGdlcm1hbkFkZHJlc3MuZ2VvTG9jYXRpb24ubG5nID0gdGhpcy5vcHRpb25zLlZhbHVlLkxvbmdpdHVkZTtcclxuXHJcbiAgICAgIHRoaXMuR2VybWFuQWRkcmVzc01hcHBlZChnZXJtYW5BZGRyZXNzKVxyXG5cclxuICAgICAgdGhpcy5wbGFjZSA9IHtcclxuICAgICAgICB1cmw6IHRoaXMub3B0aW9ucy5WYWx1ZS5Hb29nbGVNYXBzVVJMLFxyXG4gICAgICAgIHBsYWNlX2lkOiB0aGlzLm9wdGlvbnMuVmFsdWUuUGxhY2VJRCxcclxuICAgICAgICBmb3JtYXR0ZWRfYWRkcmVzczogdGhpcy5vcHRpb25zLlZhbHVlLlRleHQsXHJcbiAgICAgICAgbmFtZTogdGhpcy5vcHRpb25zLlZhbHVlLlRleHQsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLkF1dG9jb21wbGV0ZVNlbGVjdGVkKHRoaXMucGxhY2UpXHJcbiAgICAgIHRoaXMuZ3JvdXAuY29udHJvbHNbdGhpcy5vcHRpb25zLk5hbWVdLnNldFZhbHVlKHRoaXMubWFwQXV0b0NvbXBsZXRlTW9kZWwpXHJcbiAgICAgIHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5vcHRpb25zLlZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy5vcHRpb25zLkN1c3RvbVZhbGlkYXRpb24ubGVuZ3RoID4gMCkge1xyXG4gICAgICBsZXQgVmFsaWRhdGlvbnMgPSB0aGlzLm9wdGlvbnMuQ3VzdG9tVmFsaWRhdGlvblxyXG4gICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgVmFsaWRhdGlvbnMubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgY29uc3QgVmFsaWRhdGlvbiA9IFZhbGlkYXRpb25zW2luZGV4XTtcclxuICAgICAgICB0aGlzLnZhbGlkYXRpb25SdWxlcy5wdXNoKFZhbGlkYXRpb24uZnVuY3Rpb25Cb2R5KTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgZ2V0UGxhY2VBdXRvY29tcGxldGUoKSB7XHJcbiAgICBjb25zdCB7IEF1dG9jb21wbGV0ZSB9ID0gYXdhaXQgZ29vZ2xlLm1hcHMuaW1wb3J0TGlicmFyeShcInBsYWNlc1wiKSBhcyBnb29nbGUubWFwcy5QbGFjZXNMaWJyYXJ5O1xyXG5cclxuICAgIGNvbnN0IGF1dG9jb21wbGV0ZSA9IG5ldyBBdXRvY29tcGxldGUodGhpcy5zZWFyY2hFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgdHlwZXM6IFt0aGlzLm9wdGlvbnMuYWRkcmVzc1R5cGVdXHJcbiAgICB9KTtcclxuXHJcbiAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihhdXRvY29tcGxldGUsICdwbGFjZV9jaGFuZ2VkJywgXyA9PiB7XHJcbiAgICAgIHRoaXMubmdab25lLnJ1bihfID0+IHtcclxuICAgICAgICBjb25zdCBwbGFjZSA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkpIHtcclxuICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3MgPSB7XHJcbiAgICAgICAgICAgIGljb246IHBsYWNlLmljb24sXHJcbiAgICAgICAgICAgIHVybDogcGxhY2UudXJsLFxyXG4gICAgICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICAgICAgZGlzcGxheUFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxyXG4gICAgICAgICAgICBuYW1lOiBwbGFjZS5uYW1lLFxyXG4gICAgICAgICAgICB2aWNpbml0eTogcGxhY2UudmljaW5pdHksXHJcbiAgICAgICAgICAgIGxvY2FsaXR5OiB7fSxcclxuICAgICAgICAgICAgc3RhdGU6IHt9LFxyXG4gICAgICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgICAgfTtcclxuXHJcbiAgICAgICAgICBwbGFjZS5hZGRyZXNzX2NvbXBvbmVudHMuZm9yRWFjaCh2YWx1ZSA9PiB7XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzc1tcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3NbXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICB0aGlzLkdlcm1hbkFkZHJlc3NNYXBwZWQoZ2VybWFuQWRkcmVzcyk7XHJcbiAgICAgICAgICB0aGlzLkF1dG9jb21wbGV0ZVNlbGVjdGVkKHBsYWNlKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbWFwU2NyaXB0TG9hZGVkKCkge1xyXG4gICAgdGhpcy5nZXRQbGFjZUF1dG9jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbiAgdHJhbnNsYXRlVmFsdWUoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMuVXRpbGl0eVNlcnZpY2UuZ2V0UmVzb3VyY2VWYWx1ZShrZXkpO1xyXG4gIH1cclxuICAvLyNlbmRyZWdpb25cclxuXHJcblxyXG4gIC8vI3JlZ2lvbiBhZHZhbmNlZCBtYXAgbWV0aG9kc1xyXG5cclxuICBhc3luYyBvbk1hcENsaWNrKGV2ZW50OiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KSB7XHJcbiAgICB0aGlzLmFkZE1hcmtlcihldmVudCk7XHJcblxyXG4gICAgbGV0IGdlb2NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcbiAgICBnZW9jb2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IGV2ZW50LmxhdExuZz8udG9KU09OKCkgfSkudGhlbihyZXMgPT4ge1xyXG4gICAgICBjb25zdCBwbGFjZSA9IHJlcy5yZXN1bHRzWzBdO1xyXG4gICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwic2V0TG9jYXRpb25TZWFyY2hcIikgYXMgSFRNTElucHV0RWxlbWVudDtcclxuICAgICAgaW5wdXQudmFsdWUgPSBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgICAgdGhpcy5zZWxlY3RlZFBpbiA9IHtcclxuICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICBkaXNwbGF5QWRkcmVzczogcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3MsXHJcbiAgICAgICAgZ2VvTG9jYXRpb246IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpLFxyXG4gICAgICAgIHVybDogYGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbWFwcy9wbGFjZS8/cT1wbGFjZV9pZDoke3BsYWNlLnBsYWNlX2lkfWAsXHJcbiAgICAgICAgbG9jYWxpdHk6IHt9LFxyXG4gICAgICAgIHN0YXRlOiB7fSxcclxuICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3RyZWV0X251bWJlcicpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdHJlZXROdW1iZXJcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncm91dGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3RyZWV0TmFtZVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3Bvc3RhbF9jb2RlJykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInBvc3RhbENvZGVcIl0gPSBOdW1iZXIodmFsdWUuc2hvcnRfbmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdWJsb2NhbGl0eScpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJzdWJsb2NhbGl0eVwiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2xvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5sb2NhbGl0eVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8xJykgPiAtMSkge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5zdGF0ZVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLnN0YXRlW1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignY291bnRyeScpID4gLTEpIHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uY291bnRyeVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmNvdW50cnlbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzMnKSA+IC0xKSB7XHJcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcblxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhZGRNYXJrZXIoZXZlbnQ6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpIHtcclxuICAgIGlmIChldmVudC5sYXRMbmcpXHJcbiAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSBldmVudC5sYXRMbmcudG9KU09OKCk7XHJcbiAgfVxyXG5cclxuICBvcGVuTWFwTW9kYWwoKSB7XHJcbiAgICB0aGlzLm1vZGFsSXNPcGVuID0gdHJ1ZTtcclxuICAgIHRoaXMuZ2V0Q3VycmVudExvY2F0aW9uKCk7XHJcbiAgICB0aGlzLmFkZFNlYXJjaEJveCgpO1xyXG4gIH1cclxuXHJcbiAgY2xvc2VNYXBNb2RhbCgpIHtcclxuICAgIHRoaXMubW9kYWxJc09wZW4gPSBmYWxzZTtcclxuICB9XHJcblxyXG4gIGdldEN1cnJlbnRMb2NhdGlvbigpIHtcclxuICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uOiBHZW9sb2NhdGlvblBvc2l0aW9uKSA9PiB7XHJcblxyXG4gICAgICBjb25zdCBwb2ludDogZ29vZ2xlLm1hcHMuTGF0TG5nTGl0ZXJhbCA9IHtcclxuICAgICAgICBsYXQ6IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZSxcclxuICAgICAgICBsbmc6IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGUsXHJcbiAgICAgIH07XHJcblxyXG4gICAgICB0aGlzLm1hcENlbnRlciA9IHBvaW50O1xyXG5cclxuICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHtcclxuICAgICAgICBsYXQ6IHRoaXMubWFwQ2VudGVyLmxhdCxcclxuICAgICAgICBsbmc6IHRoaXMubWFwQ2VudGVyLmxuZ1xyXG4gICAgICB9O1xyXG5cclxuICAgICAgdGhpcy5tYXJrZXJPcHRpb25zID0ge1xyXG4gICAgICAgIGRyYWdnYWJsZTogZmFsc2UsXHJcbiAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUCxcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICB9XHJcblxyXG5cclxuICBhc3luYyBhZGRTZWFyY2hCb3goKSB7XHJcbiAgICBjb25zdCB7IEF1dG9jb21wbGV0ZSB9ID0gYXdhaXQgZ29vZ2xlLm1hcHMuaW1wb3J0TGlicmFyeShcInBsYWNlc1wiKSBhcyBnb29nbGUubWFwcy5QbGFjZXNMaWJyYXJ5O1xyXG4gICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInNldExvY2F0aW9uU2VhcmNoXCIpIGFzIEhUTUxJbnB1dEVsZW1lbnQ7XHJcbiAgICBjb25zdCBzZWFyY2hCb3ggPSBuZXcgQXV0b2NvbXBsZXRlKGlucHV0KTtcclxuXHJcbiAgICBnb29nbGUubWFwcy5ldmVudC5hZGRMaXN0ZW5lcihzZWFyY2hCb3gsIFwicGxhY2VfY2hhbmdlZFwiLCAoKSA9PiB7XHJcbiAgICAgIGNvbnN0IHBsYWNlID0gc2VhcmNoQm94LmdldFBsYWNlKCk7XHJcbiAgICAgIGlmIChwbGFjZS5nZW9tZXRyeSkge1xyXG4gICAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi50b0pTT04oKTtcclxuICAgICAgICB0aGlzLm1hcENlbnRlciA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLnRvSlNPTigpO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4gPSB7XHJcbiAgICAgICAgICBpY29uOiBwbGFjZS5pY29uLFxyXG4gICAgICAgICAgdXJsOiBwbGFjZS51cmwsXHJcbiAgICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcclxuICAgICAgICAgIGRpc3BsYXlBZGRyZXNzOiBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyxcclxuICAgICAgICAgIG5hbWU6IHBsYWNlLm5hbWUsXHJcbiAgICAgICAgICB2aWNpbml0eTogcGxhY2UudmljaW5pdHksXHJcbiAgICAgICAgICBsb2NhbGl0eToge30sXHJcbiAgICAgICAgICBzdGF0ZToge30sXHJcbiAgICAgICAgICBjb3VudHJ5OiB7fSxcclxuICAgICAgICAgIGdlb0xvY2F0aW9uOiBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi50b0pTT04oKSxcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKHZhbHVlID0+IHtcclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdHJlZXRfbnVtYmVyJykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3RyZWV0TnVtYmVyXCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbltcInN0cmVldE5hbWVcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW5bXCJwb3N0YWxDb2RlXCJdID0gTnVtYmVyKHZhbHVlLnNob3J0X25hbWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N1YmxvY2FsaXR5JykgPiAtMSkge1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluW1wic3VibG9jYWxpdHlcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4ubG9jYWxpdHlbXCJsb25nXCJdID0gdmFsdWUubG9uZ19uYW1lO1xyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkUGluLmxvY2FsaXR5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5zdGF0ZVtcImxvbmdcIl0gPSB2YWx1ZS5sb25nX25hbWU7XHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRQaW4uc3RhdGVbXCJzaG9ydFwiXSA9IHZhbHVlLnNob3J0X25hbWU7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignY291bnRyeScpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5jb3VudHJ5W1wibG9uZ1wiXSA9IHZhbHVlLmxvbmdfbmFtZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5jb3VudHJ5W1wic2hvcnRcIl0gPSB2YWx1ZS5zaG9ydF9uYW1lO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFBpbi5sb2NhbGl0eVtcInNob3J0XCJdID0gdmFsdWUuc2hvcnRfbmFtZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG5cclxuICAgIH0pXHJcblxyXG4gIH1cclxuXHJcblxyXG4gIHN1Ym1pdFNldExvY2F0aW9uKCkge1xyXG4gICAgdGhpcy5HZXJtYW5BZGRyZXNzTWFwcGVkKHRoaXMuc2VsZWN0ZWRQaW4pO1xyXG4gICAgdGhpcy5jbG9zZU1hcE1vZGFsKCk7XHJcbiAgfVxyXG5cclxuICAvLyNlbmRyZWdpb25cclxuXHJcbiAgLy8jcmVnaW9uIEV4dGVybmFsIE1ldGhvZHNcclxuXHJcbiAgUmVtb3ZlUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5SZW1vdmVSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICB9XHJcbiAgQWRkUmVxdWlyZWRWYWxpZGF0aW9uID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRSZXF1aXJlZFZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIHRoaXMub3B0aW9ucylcclxuICB9XHJcbiAgUmVtb3ZlQ3VzdG9tVmFsaWRhdGlvbiA9IChDdXN0b21WYWxpZGF0aW9uKSA9PiB7XHJcbiAgICB0aGlzLmNvbnRyb2xVdGlsaXR5LlJlbW92ZUN1c3RvbVZhbGlkYXRpb24odGhpcy5tYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbCwgdGhpcy52YWxpZGF0aW9uUnVsZXMsIEN1c3RvbVZhbGlkYXRpb24pXHJcbiAgfVxyXG4gIEFkZEN1c3RvbVZhbGlkYXRpb24gPSAoQ3VzdG9tVmFsaWRhdGlvbikgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5BZGRDdXN0b21WYWxpZGF0aW9uKHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wsIHRoaXMudmFsaWRhdGlvblJ1bGVzLCBDdXN0b21WYWxpZGF0aW9uKVxyXG4gIH1cclxuICBJc1ZhbGlkID0gKCkgPT4ge1xyXG4gICAgdGhpcy5jb250cm9sVXRpbGl0eS5Jc1ZhbGlkKHRoaXMubWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wpXHJcbiAgfVxyXG4gIC8vI2VuZHJlZ2lvblxyXG5cclxufVxyXG5cclxuXHJcbiIsIjxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93TWFwXCI+XHJcbiAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgYmJzZi1jb250cm9sIGJic2YtbWFwc1wiIFtmb3JtR3JvdXBdPVwiZ3JvdXBcIj5cclxuICAgIDxkaXYgW25nQ2xhc3NdPVwiKG9wdGlvbnMuVmlld1R5cGU9PTEpPydiYnNmLXZlcnRpY2FsJzonYmJzZi1ob3Jpem9udGFsJ1wiPlxyXG4gICAgICA8IS0tbGFiZWwtLT5cclxuICAgICAgPGxhYmVsICpuZ0lmPVwiIW9wdGlvbnMuSGlkZUxhYmVsXCIgY2xhc3M9XCJiYnNmLWxhYmVsIHt7b3B0aW9ucy5MYWJlbEV4dHJhQ2xhc3Nlc319XCI+XHJcbiAgICAgICAge3tvcHRpb25zLkxhYmVsVmFsdWV9fVxyXG4gICAgICAgIDwhLS1Bc3Rlcmlzay0tPlxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwiKChvcHRpb25zLlNob3dBc3RlcmlzayYmb3B0aW9ucy5Jc1JlcXVpcmVkKXx8KG9wdGlvbnMuSXNSZXF1aXJlZCkpJiYhb3B0aW9ucy5Jc1JlYWRvbmx5XCIgY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPio8L3NwYW4+XHJcbiAgICAgIDwvbGFiZWw+XHJcbiAgICAgIDwhLS1pbnB1dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgYmJzZi1pbnB1dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2wgaW5wdXQtaWNvbi1vIHt7b3B0aW9ucy5FeHRyYUNsYXNzZXN9fVwiIFt2YWx1ZV09XCJtYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0XCIgW2FkZHJlc3NdPVwibWFwQXV0b0NvbXBsZXRlTW9kZWwuVGV4dFwiXHJcbiAgICAgICAgICB2YWx1ZT1cInt7bWFwQXV0b0NvbXBsZXRlTW9kZWwuVGV4dH19XCIgYXJpYS1kZXNjcmliZWRieT1cImVtYWlsLWVycm9yXCIgYXJpYS1pbnZhbGlkPVwidHJ1ZVwiXHJcbiAgICAgICAgICBbY2xhc3MuaXMtaW52YWxpZF09XCJtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC5pbnZhbGlkICYmIG1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLnRvdWNoZWRcIiBbcGxhY2Vob2xkZXJdPVwib3B0aW9ucy5QbGFjZWhvbGRlclwiXHJcbiAgICAgICAgICBpZD1cInt7b3B0aW9ucy5OYW1lfX1cIiAoa2V5dXApPVwiR2VybWFuQWRkcmVzc01hcHBlZCgkZXZlbnQpXCIgI21hcFNlYXJjaCAvPlxyXG4gICAgICAgIDxidXR0b24gKm5nSWY9XCJvcHRpb25zLnNob3dBZHZhbmNlZE1hcFwiIGNsYXNzPVwiYm9yZGVyLTAgYnRuLXNlY29uZGFyeSBidG4taWNvbi1vXCIgbmdiVG9vbHRpcD1cInt7dHJhbnNsYXRlVmFsdWUoJ1NldExvY2F0aW9uJyl9fVwiIHR5cGU9XCJidXR0b25cIlxyXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5NYXBNb2RhbCgpXCI+XHJcblxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJzdmctaWNvbiBzdmctaWNvbi0xXCI+XHJcbiAgICAgICAgICAgIDxzdmcgd2lkdGg9XCIyNFwiIGhlaWdodD1cIjI0XCIgdmlld0JveD1cIjAgMCAyNCAyNFwiIGZpbGw9XCJub25lXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICAgIDxwYXRoIGQ9XCJNMTIgMTNDMTMuNjU2OSAxMyAxNSAxMS42NTY5IDE1IDEwQzE1IDguMzQzMTUgMTMuNjU2OSA3IDEyIDdDMTAuMzQzMSA3IDkgOC4zNDMxNSA5IDEwQzkgMTEuNjU2OSAxMC4zNDMxIDEzIDEyIDEzWlwiXHJcbiAgICAgICAgICAgICAgICBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyXCIgc3Ryb2tlLWxpbmVjYXA9XCJyb3VuZFwiIHN0cm9rZS1saW5lam9pbj1cInJvdW5kXCIgLz5cclxuICAgICAgICAgICAgICA8cGF0aCBkPVwiTTEyIDIyQzE2IDE4IDIwIDE0LjQxODMgMjAgMTBDMjAgNS41ODE3MiAxNi40MTgzIDIgMTIgMkM3LjU4MTcyIDIgNCA1LjU4MTcyIDQgMTBDNCAxNC40MTgzIDggMTggMTIgMjJaXCIgc3Ryb2tlPVwiY3VycmVudENvbG9yXCJcclxuICAgICAgICAgICAgICAgIHN0cm9rZS13aWR0aD1cIjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiAvPlxyXG4gICAgICAgICAgICA8L3N2Zz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8IS0tIHJlYWRvbmx5IC0tPlxyXG4gICAgICA8ZGl2ICpuZ0lmPVwib3B0aW9ucy5Jc1JlYWRvbmx5XCI+PHNwYW4gY2xhc3M9XCJyZWFkb25seS12aWV3XCI+e3ttYXBBdXRvQ29tcGxldGVNb2RlbC5UZXh0fX08L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic3VidGV4dC1jb250YWluZXJcIiAqbmdJZj1cIiFvcHRpb25zLklzUmVhZG9ubHlcIj5cclxuICAgICAgPCEtLSBMYWJlbERlc2NyaXB0aW9uLS0+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJiYnNmLWNvbnRyb2wtZGVzY1wiICpuZ0lmPVwib3B0aW9ucy5MYWJlbERlc2NyaXB0aW9uIT1udWxsXCI+e3tvcHRpb25zLkxhYmVsRGVzY3JpcHRpb259fTwvZGl2PlxyXG4gICAgICA8IS0tIHJlcXVpcmVkVGV4dC0tPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiYmJzZi12YWxpZGF0aW9uXCIgKm5nSWY9XCIobWFwQXV0b0NvbXBsZXRlRm9ybUNvbnRyb2wuaW52YWxpZCAmJiBtYXBBdXRvQ29tcGxldGVGb3JtQ29udHJvbC50b3VjaGVkKVwiPlxyXG4gICAgICAgIHt7Z2V0RXJyb3JWYWxpZGF0aW9uKG1hcEF1dG9Db21wbGV0ZUZvcm1Db250cm9sLmVycm9yc3xrZXl2YWx1ZSl9fVxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cIihncm91cC52YWxpZCYmZ3JvdXAuZGlydHkmJmdyb3VwLnRvdWNoZWQgKXx8KGdyb3VwLnVudG91Y2hlZCYmZ3JvdXAuaW52YWxpZCYmZ3JvdXAuZGlydHkpXCI+e3tyZXNldEVycm9yKCl9fSA8L2Rpdj5cclxuICA8L2Rpdj5cclxuXHJcbiAgPGRpdiBpZD1cIm1kbFNhbXBsZVwiIGNsYXNzPVwibW9kYWwgYmJzZi1jcm9wcGVyLW1vZGFsXCIgcm9sZT1cImRpYWxvZ1wiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6IG1vZGFsSXNPcGVuID8gJ2Jsb2NrJyA6ICdub25lJywgJ29wYWNpdHknOiAxfVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWRpYWxvZyBtb2RhbC1sZ1wiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtY29udGVudFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cclxuICAgICAgICAgIDxoNCBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+XHJcbiAgICAgICAgICAgIHt7dHJhbnNsYXRlVmFsdWUoJ1NldExvY2F0aW9uT25NYXAnKX19XHJcbiAgICAgICAgICA8L2g0PlxyXG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBkYXRhLWRpc21pc3M9XCJtb2RhbFwiIChjbGljayk9XCJjbG9zZU1hcE1vZGFsKClcIj48L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxyXG4gICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sIG10LTMgbWItM1wiIGlkPVwic2V0TG9jYXRpb25TZWFyY2hcIiB0eXBlPVwidGV4dFwiIHBsYWNlaG9sZGVyPVwie3t0cmFuc2xhdGVWYWx1ZSgnU2V0TG9jYXRpb24nKX19XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZ29vZ2xlLW1hcC1jb250YWluZXJcIj5cclxuICAgICAgICAgICAgPGdvb2dsZS1tYXAgW2NlbnRlcl09XCJtYXBDZW50ZXJcIiBbd2lkdGhdPVwibnVsbFwiIFtoZWlnaHRdPVwibnVsbFwiICNnb29nbGVNYXAgKG1hcENsaWNrKT1cIm9uTWFwQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICAgICAgICAgIDxtYXAtbWFya2VyIFtwb3NpdGlvbl09XCJtYXJrZXJQb3NpdGlvblwiIFtvcHRpb25zXT1cIm1hcmtlck9wdGlvbnNcIj48L21hcC1tYXJrZXI+XHJcbiAgICAgICAgICAgIDwvZ29vZ2xlLW1hcD5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cclxuICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tbGlnaHRcIiAoY2xpY2spPVwiY2xvc2VNYXBNb2RhbCgpXCI+XHJcbiAgICAgICAgICAgIHt7dHJhbnNsYXRlVmFsdWUoXCJDYW5jZWxcIil9fVxyXG4gICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc20gYnRuLWJyYW5kXCIgKGNsaWNrKT1cInN1Ym1pdFNldExvY2F0aW9uKClcIj5cclxuICAgICAgICAgICAge3t0cmFuc2xhdGVWYWx1ZSgnQ29uZmlybScpfX1cclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG5cclxuPC9uZy1jb250YWluZXI+Il19