@rangertechnologies/ngnxt 2.1.84 → 2.1.85

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.
@@ -10,6 +10,7 @@ import * as i5 from "../../i18n.pipe";
10
10
  export class PickLocationComponent {
11
11
  i18nService;
12
12
  ngZone;
13
+ cdr;
13
14
  latitude = null;
14
15
  longitude = null;
15
16
  zoom = 10;
@@ -28,9 +29,10 @@ export class PickLocationComponent {
28
29
  apiKey; // HA10012024 declared Api key to src
29
30
  constructor(
30
31
  // private mapsAPILoader: MapsAPILoader,
31
- i18nService, ngZone) {
32
+ i18nService, ngZone, cdr) {
32
33
  this.i18nService = i18nService;
33
34
  this.ngZone = ngZone;
35
+ this.cdr = cdr;
34
36
  // HA09012024 is to avoid google is undefined error and calling the below created function
35
37
  }
36
38
  ngOnInit() {
@@ -47,6 +49,32 @@ export class PickLocationComponent {
47
49
  });
48
50
  }
49
51
  }
52
+ // RS 23JAN2025
53
+ ngOnChanges(changes) {
54
+ if (changes['address'] && changes['address'].currentValue !== changes['address'].previousValue) {
55
+ // Ensure latitude & longitude update when the address changes
56
+ if (this.address) {
57
+ this.geoCoder.geocode({ address: this.address }, (results, status) => {
58
+ if (status === 'OK' && results[0]?.geometry?.location) {
59
+ this.latitude = results[0].geometry.location.lat();
60
+ this.longitude = results[0].geometry.location.lng();
61
+ this.markerPosition = { lat: this.latitude, lng: this.longitude };
62
+ this.center = { lat: this.latitude, lng: this.longitude };
63
+ this.zoom = 18;
64
+ this.cdr.detectChanges(); // Force Angular to update the UI
65
+ }
66
+ });
67
+ }
68
+ else {
69
+ // Reset if no address is provided
70
+ this.latitude = null;
71
+ this.longitude = null;
72
+ this.markerPosition = null;
73
+ this.center = null;
74
+ this.cdr.detectChanges(); // FORCE UI UPDATE
75
+ }
76
+ }
77
+ }
50
78
  // HA09012024 is to avoid google is undefined error
51
79
  loadGoogleMapsScript() {
52
80
  const script = document.createElement('script');
@@ -167,13 +195,13 @@ export class PickLocationComponent {
167
195
  closeModal() {
168
196
  this.showModal = false;
169
197
  }
170
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PickLocationComponent, deps: [{ token: i1.I18nService }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component });
171
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PickLocationComponent, selector: "app-pick-location", inputs: { address: "address", question: "question", apiKey: "apiKey" }, outputs: { locationSelected: "locationSelected" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["search"], descendants: true, static: true }], ngImport: i0, template: "<div>\r\n <!-- <label class=\"she-label\">Location</label> -->\r\n <!-- HA 19DEC23 For translation -->\r\n <input #search class=\"she-line-input form-control\" type=\"text\" placeholder=\"{{ 'enterLocation' | i18n:i18nService.currentLanguage }}\"\r\n (keydown.enter)=\"$event.preventDefault()\" placeholder=\"{{ 'searchNearestLocation' | i18n:i18nService.currentLanguage }}\" autocorrect=\"off\"\r\n autocapitalize=\"off\" spellcheck=\"off\" type=\"text\" [(ngModel)]=\"address\"\r\n >\r\n <a (click)=\"openMap()\"\r\n style=\"color:#48B7FF;position:relative;top:5px;cursor: pointer;\">\r\n <i class=\"fa fa-location-arrow\" aria-hidden=\"true\">\r\n <!-- HA 19DEC23 For translation -->\r\n </i> {{ 'pickLocation' | i18n:i18nService.currentLanguage }}</a>\r\n</div>\r\n\r\n<div class=\"map-overlay\" *ngIf=\"showModal\">\r\n <div class=\"map-modal\">\r\n <div class=\"map-modal-content\">\r\n <div class=\"map-modal-header\">\r\n <!-- HA 19DEC23 For translation -->\r\n <h4>{{ 'pickYourLocation' | i18n:i18nService.currentLanguage }}</h4>\r\n <button class=\"close-button\" (click)=\"closeModal()\">X</button>\r\n </div>\r\n <!-- Modal content goes here -->\r\n <!-- <agm-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" (mapClick)=\"markerDragEnd($event)\"\r\n [fullscreenControl]=\"true\">\r\n <agm-marker [latitude]=\"latitude\" [longitude]=\"longitude\" [markerDraggable]=\"true\"\r\n (dragEnd)=\"markerDragEnd($event)\"></agm-marker>\r\n </agm-map> -->\r\n <google-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" [center]=\"center\" (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>\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".she-label{font-weight:400;color:#9a9a9a;padding-bottom:5px;padding-top:5px;padding-right:15px;font-size:14px}.she-line-input{border:none;background:#fff;border-bottom:1px solid #eeeeee;border-radius:0}.fa-location-arrow:before{content:\"\\f124\"}google-map .map-container{width:auto!important}.map-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1}.map-modal{width:600px;background-color:#fff;border-radius:5px;box-shadow:0 2px 4px #0003}.map-modal-header{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;background-color:#fff;border-bottom:2px solid #e5e5e5}.map-modal-header h3{margin:0}.map-modal-content{padding:20px}.close-button{border:none;cursor:pointer;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "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: i4.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", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] });
198
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PickLocationComponent, deps: [{ token: i1.I18nService }, { token: i0.NgZone }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
199
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: PickLocationComponent, selector: "app-pick-location", inputs: { address: "address", question: "question", apiKey: "apiKey" }, outputs: { locationSelected: "locationSelected" }, viewQueries: [{ propertyName: "searchElementRef", first: true, predicate: ["search"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n <!-- <label class=\"she-label\">Location</label> -->\r\n <!-- HA 19DEC23 For translation -->\r\n <input #search class=\"she-line-input form-control\" type=\"text\" placeholder=\"{{ 'enterLocation' | i18n:i18nService.currentLanguage }}\"\r\n (keydown.enter)=\"$event.preventDefault()\" placeholder=\"{{ 'searchNearestLocation' | i18n:i18nService.currentLanguage }}\" autocorrect=\"off\"\r\n autocapitalize=\"off\" spellcheck=\"off\" type=\"text\" [(ngModel)]=\"address\"\r\n >\r\n <a (click)=\"openMap()\"\r\n style=\"color:#48B7FF;position:relative;top:5px;cursor: pointer;\">\r\n <i class=\"fa fa-location-arrow\" aria-hidden=\"true\">\r\n <!-- HA 19DEC23 For translation -->\r\n </i> {{ 'pickLocation' | i18n:i18nService.currentLanguage }}</a>\r\n</div>\r\n\r\n<div class=\"map-overlay\" *ngIf=\"showModal\">\r\n <div class=\"map-modal\">\r\n <div class=\"map-modal-content\">\r\n <div class=\"map-modal-header\">\r\n <!-- HA 19DEC23 For translation -->\r\n <h4>{{ 'pickYourLocation' | i18n:i18nService.currentLanguage }}</h4>\r\n <button class=\"close-button\" (click)=\"closeModal()\">X</button>\r\n </div>\r\n <!-- Modal content goes here -->\r\n <!-- <agm-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" (mapClick)=\"markerDragEnd($event)\"\r\n [fullscreenControl]=\"true\">\r\n <agm-marker [latitude]=\"latitude\" [longitude]=\"longitude\" [markerDraggable]=\"true\"\r\n (dragEnd)=\"markerDragEnd($event)\"></agm-marker>\r\n </agm-map> -->\r\n <google-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" [center]=\"center\" (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>\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".she-label{font-weight:400;color:#9a9a9a;padding-bottom:5px;padding-top:5px;padding-right:15px;font-size:14px}.she-line-input{border:none;background:#fff;border-bottom:1px solid #eeeeee;border-radius:0}.fa-location-arrow:before{content:\"\\f124\"}google-map .map-container{width:auto!important}.map-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1}.map-modal{width:600px;background-color:#fff;border-radius:5px;box-shadow:0 2px 4px #0003}.map-modal-header{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;background-color:#fff;border-bottom:2px solid #e5e5e5}.map-modal-header h3{margin:0}.map-modal-content{padding:20px}.close-button{border:none;cursor:pointer;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "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: i4.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", "markerInitialized"], exportAs: ["mapMarker"] }, { kind: "pipe", type: i5.I18nPipe, name: "i18n" }] });
172
200
  }
173
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: PickLocationComponent, decorators: [{
174
202
  type: Component,
175
203
  args: [{ selector: 'app-pick-location', template: "<div>\r\n <!-- <label class=\"she-label\">Location</label> -->\r\n <!-- HA 19DEC23 For translation -->\r\n <input #search class=\"she-line-input form-control\" type=\"text\" placeholder=\"{{ 'enterLocation' | i18n:i18nService.currentLanguage }}\"\r\n (keydown.enter)=\"$event.preventDefault()\" placeholder=\"{{ 'searchNearestLocation' | i18n:i18nService.currentLanguage }}\" autocorrect=\"off\"\r\n autocapitalize=\"off\" spellcheck=\"off\" type=\"text\" [(ngModel)]=\"address\"\r\n >\r\n <a (click)=\"openMap()\"\r\n style=\"color:#48B7FF;position:relative;top:5px;cursor: pointer;\">\r\n <i class=\"fa fa-location-arrow\" aria-hidden=\"true\">\r\n <!-- HA 19DEC23 For translation -->\r\n </i> {{ 'pickLocation' | i18n:i18nService.currentLanguage }}</a>\r\n</div>\r\n\r\n<div class=\"map-overlay\" *ngIf=\"showModal\">\r\n <div class=\"map-modal\">\r\n <div class=\"map-modal-content\">\r\n <div class=\"map-modal-header\">\r\n <!-- HA 19DEC23 For translation -->\r\n <h4>{{ 'pickYourLocation' | i18n:i18nService.currentLanguage }}</h4>\r\n <button class=\"close-button\" (click)=\"closeModal()\">X</button>\r\n </div>\r\n <!-- Modal content goes here -->\r\n <!-- <agm-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" (mapClick)=\"markerDragEnd($event)\"\r\n [fullscreenControl]=\"true\">\r\n <agm-marker [latitude]=\"latitude\" [longitude]=\"longitude\" [markerDraggable]=\"true\"\r\n (dragEnd)=\"markerDragEnd($event)\"></agm-marker>\r\n </agm-map> -->\r\n <google-map [latitude]=\"latitude\" [longitude]=\"longitude\" [zoom]=\"zoom\" [center]=\"center\" (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>\r\n\r\n\r\n\r\n\r\n\r\n\r\n", styles: [".she-label{font-weight:400;color:#9a9a9a;padding-bottom:5px;padding-top:5px;padding-right:15px;font-size:14px}.she-line-input{border:none;background:#fff;border-bottom:1px solid #eeeeee;border-radius:0}.fa-location-arrow:before{content:\"\\f124\"}google-map .map-container{width:auto!important}.map-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;align-items:center;justify-content:center;z-index:1}.map-modal{width:600px;background-color:#fff;border-radius:5px;box-shadow:0 2px 4px #0003}.map-modal-header{display:flex;align-items:center;justify-content:space-between;padding:0 0 10px;background-color:#fff;border-bottom:2px solid #e5e5e5}.map-modal-header h3{margin:0}.map-modal-content{padding:20px}.close-button{border:none;cursor:pointer;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2}\n"] }]
176
- }], ctorParameters: () => [{ type: i1.I18nService }, { type: i0.NgZone }], propDecorators: { searchElementRef: [{
204
+ }], ctorParameters: () => [{ type: i1.I18nService }, { type: i0.NgZone }, { type: i0.ChangeDetectorRef }], propDecorators: { searchElementRef: [{
177
205
  type: ViewChild,
178
206
  args: ['search', { static: true }]
179
207
  }], address: [{
@@ -185,4 +213,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
185
213
  }], apiKey: [{
186
214
  type: Input
187
215
  }] } });
188
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGljay1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9waWNrLWxvY2F0aW9uL3BpY2stbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGljay1sb2NhdGlvbi9waWNrLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBNEIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUd2SCxzQ0FBc0M7QUFDdkMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDJCQUEyQixDQUFDOzs7Ozs7O0FBUzFELE1BQU0sT0FBTyxxQkFBcUI7SUFxQnhCO0lBQ0U7SUFyQlYsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLElBQUksR0FBVyxFQUFFLENBQUM7SUFDVixRQUFRLENBQUM7SUFDbEIsK0JBQStCO0lBRXZCLGdCQUFnQixDQUErQjtJQUN0RCxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQ2xCLE9BQU8sQ0FBUTtJQUN2QixzQ0FBc0M7SUFDOUIsUUFBUSxDQUFVO0lBQ2pCLGdCQUFnQixHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUM1RixvQkFBb0IsQ0FBTTtJQUMxQixjQUFjLENBQTBCO0lBQ3hDLE1BQU0sQ0FBMEI7SUFDaEMsYUFBYSxDQUFLO0lBQ1QsTUFBTSxDQUFNLENBQUMscUNBQXFDO0lBRTNEO0lBQ0Msd0NBQXdDO0lBQ2pDLFdBQXdCLEVBQ3RCLE1BQWM7UUFEaEIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDdEIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtR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LENBQUM7WUFDaEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztZQUN2QyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUM1QixDQUFDO2FBQUksQ0FBQztZQUNKLElBQUksQ0FBQyxjQUFjLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzFELElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7d0dBdktVLHFCQUFxQjs0RkFBckIscUJBQXFCLDhTQ2JsQyxvNERBd0NBOzs0RkQzQmEscUJBQXFCO2tCQUxqQyxTQUFTOytCQUNFLG1CQUFtQjtxR0FXdEIsZ0JBQWdCO3NCQUR0QixTQUFTO3VCQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBRzVCLE9BQU87c0JBQWYsS0FBSztnQkFFRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNJLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFLRSxNQUFNO3NCQUFkLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE5nTW9kdWxlLCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuLy8gSEEgMTlERUMyMyBpbXBvcnRlZCB0cmFuc2xhdGlvbiBzZXJ2aWNlXHJcbmltcG9ydCB7IEkxOG5TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaTE4bi5zZXJ2aWNlJztcclxuIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXHJcbmltcG9ydCB7IENoYW5nZVdyYXBwZXIgfSBmcm9tICcuLi8uLi9tb2RlbC9jaGFuZ2VXcmFwcGVyJztcclxuaW1wb3J0IHsgUXVlc3Rpb24gfSBmcm9tICcuLi8uLi93cmFwcGVyJztcclxuZGVjbGFyZSB2YXIgJDogYW55O1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtcGljay1sb2NhdGlvbicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3BpY2stbG9jYXRpb24uY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3BpY2stbG9jYXRpb24uY29tcG9uZW50LmNzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBQaWNrTG9jYXRpb25Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGxhdGl0dWRlID0gbnVsbDtcclxuICBsb25naXR1ZGUgPSBudWxsO1xyXG4gIHpvb206IG51bWJlciA9IDEwO1xyXG4gIHByaXZhdGUgZ2VvQ29kZXI7XHJcbiAvLyBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZCgnc2VhcmNoJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwdWJsaWMgc2VhcmNoRWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBzaG93TW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhZGRyZXNzOnN0cmluZztcclxuICAgLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcclxuICBASW5wdXQoKSBxdWVzdGlvbjogUXVlc3Rpb25cclxuICBAT3V0cHV0KCkgbG9jYXRpb25TZWxlY3RlZDogRXZlbnRFbWl0dGVyPENoYW5nZVdyYXBwZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPigpO1xyXG4gIG5hdmlnYXRvckdlb2xvY2F0aW9uOiBhbnk7XHJcbiAgbWFya2VyUG9zaXRpb246IHsgbGF0OiBhbnk7IGxuZzogYW55OyB9O1xyXG4gIGNlbnRlcjogeyBsYXQ6IGFueTsgbG5nOiBhbnk7IH07XHJcbiAgbWFya2VyT3B0aW9uczphbnk7XHJcbiAgQElucHV0KCkgYXBpS2V5OiBhbnk7IC8vIEhBMTAwMTIwMjQgZGVjbGFyZWQgQXBpIGtleSB0byBzcmNcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgIC8vIHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcclxuICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUpIHsgXHJcbiAgICAgIC8vIEhBMDkwMTIwMjQgaXMgdG8gYXZvaWQgZ29vZ2xlIGlzIHVuZGVmaW5lZCBlcnJvciBhbmQgY2FsbGluZyB0aGUgYmVsb3cgY3JlYXRlZCBmdW5jdGlvblxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvLyBIQS0xMS0wMS0yMDI0IENoYW5nZWQgdGhlIG1hcCBDYWxsIGZyb20gY29uc3RydWN0b3IgdG8gbmdPbkluaXQgYXMgaXQgd2FzIGdpdmluZyB1bmRlZmluZWQgdmFsdWVzIGluIHRoZSBvdXRzb3VyY2VkXHJcbiAgICBpZih0aGlzLmFwaUtleSl7XHJcbiAgICAgIHRoaXMubG9hZEdvb2dsZU1hcHNTY3JpcHQoKS50aGVuKCgpID0+IHtcclxuICAgICAgICB0aGlzLmdlb0NvZGVyID0gbmV3IGdvb2dsZS5tYXBzLkdlb2NvZGVyKCk7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJPcHRpb25zID0gbmV3IGdvb2dsZS5tYXBzLk1hcmtlciAoe1xyXG4gICAgICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgYW5pbWF0aW9uOiBnb29nbGUubWFwcy5BbmltYXRpb24uRFJPUFxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHRoaXMuaW5pdEF1dG9jb21wbGV0ZSgpO1xyXG4gICAgICAgIHRoaXMub25NYXJrZXJEcmFnRW5kKCk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuICAvLyBIQTA5MDEyMDI0IGlzIHRvIGF2b2lkIGdvb2dsZSBpcyB1bmRlZmluZWQgZXJyb3JcclxuICBwcml2YXRlIGxvYWRHb29nbGVNYXBzU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgLy8gSEExMDAxMjAyNCBBc3NpZ25lZCBBcGkga2V5IHRvIHNyY1xyXG4gICAgc2NyaXB0LnNyYyA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7dGhpcy5hcGlLZXl9JmxpYnJhcmllcz1nZW9tZXRyeSxwbGFjZXNgO1xyXG4gICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcclxuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHNjcmlwdC5vbmVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG4gIFxyXG4gIGluaXRBdXRvY29tcGxldGUoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5nZW9Db2Rlcikge1xyXG4gICAgICBjb25zdCBhdXRvY29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZSh0aGlzLnNlYXJjaEVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQsIHtcclxuICAgICAgICB0eXBlczogW11cclxuICAgICAgfSk7XHJcbiAgICAgIGF1dG9jb21wbGV0ZS5hZGRMaXN0ZW5lcigncGxhY2VfY2hhbmdlZCcsICgpID0+IHtcclxuICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xyXG4gICAgICAgICAgY29uc3QgcGxhY2U6IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdCA9IGF1dG9jb21wbGV0ZS5nZXRQbGFjZSgpO1xyXG5cclxuICAgICAgICAgIGlmIChwbGFjZS5nZW9tZXRyeSA9PT0gdW5kZWZpbmVkIHx8IHBsYWNlLmdlb21ldHJ5ID09PSBudWxsKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubGF0aXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKTtcclxuICAgICAgICAgIHRoaXMubG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XHJcbiAgICAgICAgICB0aGlzLnpvb20gPSAxODtcclxuICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzO1xyXG4gICAgICAgICAgLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcclxuICAgICAgICAgIGxldCBjaGFuZ2UgPSBuZXcgQ2hhbmdlV3JhcHBlcigpO1xyXG4gICAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcclxuICAgICAgICAgIGNoYW5nZS5mcm9tUXVlc3Rpb25JZCA9IHRoaXMucXVlc3Rpb24uaWQ7XHJcbiAgICAgICAgICBsZXQgYWRkT2JqID0ge307XHJcbiAgICAgICAgICBhZGRPYmpbJ2FkZHJlc3MnXSA9IHRoaXMuYWRkcmVzcztcclxuICAgICAgICAgIGFkZE9ialsnbGF0aXR1ZGUnXSA9IHRoaXMubGF0aXR1ZGU7XHJcbiAgICAgICAgICBhZGRPYmpbJ2xvbmdpdHVkZSddID0gdGhpcy5sb25naXR1ZGU7XHJcbiAgICAgICAgICBjaGFuZ2UudmFsdWVPYmogPSBhZGRPYmo7XHJcbiAgICAgICAgIHRoaXMubG9jYXRpb25TZWxlY3RlZC5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25NYXJrZXJEcmFnRW5kKCk6IHZvaWQge1xyXG4gICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkTGlzdGVuZXIodGhpcy5tYXJrZXJPcHRpb25zLCAnZHJhZ2VuZCcsIChldmVudCkgPT4ge1xyXG4gICAgICBjb25zb2xlLmxvZygnZHJhZ2FibGUgd29ya2luZycsZXZlbnQpO1xyXG4gICAgICB0aGlzLmxhdGl0dWRlID0gZXZlbnQubGF0TG5nLmxhdCgpO1xyXG4gICAgICB0aGlzLmxvbmdpdHVkZSA9IGV2ZW50LmxhdExuZy5sbmcoKTtcclxuICAgICAgdGhpcy5nZXRBZGRyZXNzKHRoaXMubGF0aXR1ZGUsIHRoaXMubG9uZ2l0dWRlKTtcclxuICB9KTtcclxuICB9XHJcblxyXG4gIG9uTWFwQ2xpY2soZXZlbnQ6IGdvb2dsZS5tYXBzLk1hcE1vdXNlRXZlbnQpOiB2b2lkIHtcclxuICAgIGNvbnNvbGUubG9nKCdvbk1hcENsaWNrJyxldmVudCk7XHJcbiAgICB0aGlzLmxhdGl0dWRlID0gZXZlbnQubGF0TG5nLmxhdCgpO1xyXG4gICAgdGhpcy5sb25naXR1ZGUgPSBldmVudC5sYXRMbmcubG5nKCk7XHJcbiAgICB0aGlzLmdldEFkZHJlc3ModGhpcy5sYXRpdHVkZSwgdGhpcy5sb25naXR1ZGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc2V0Q3VycmVudExvY2F0aW9uKCkge1xyXG4gICAgaWYgKCdnZW9sb2NhdGlvbicgaW4gbmF2aWdhdG9yKSB7XHJcbiAgICAgIG5hdmlnYXRvci5nZW9sb2NhdGlvbi5nZXRDdXJyZW50UG9zaXRpb24oKHBvc2l0aW9uKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sYXRpdHVkZTtcclxuICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IHBvc2l0aW9uLmNvb3Jkcy5sb25naXR1ZGU7XHJcbiAgICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XHJcbiAgICAgICAgdGhpcy5jZW50ZXIgPSB7IGxhdDogdGhpcy5sYXRpdHVkZSwgbG5nOiB0aGlzLmxvbmdpdHVkZSB9O1xyXG4gICAgICAgIHRoaXMuem9vbSA9IDg7XHJcbiAgICAgICAgdGhpcy5nZXRBZGRyZXNzKHRoaXMubGF0aXR1ZGUsIHRoaXMubG9uZ2l0dWRlKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgZ2V0QWRkcmVzcyhsYXRpdHVkZTogbnVtYmVyLCBsb25naXR1ZGU6IG51bWJlcikge1xyXG4gICAgaWYgKHRoaXMuZ2VvQ29kZXIpIHtcclxuICAgICAgdGhpcy5nZW9Db2Rlci5nZW9jb2RlKHsgbG9jYXRpb246IHsgbGF0OiBsYXRpdHVkZSwgbG5nOiBsb25naXR1ZGUgfSB9LCAocmVzdWx0cywgc3RhdHVzKSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ3Jlc3VsdHMnLHJlc3VsdHMpO1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdzdGF0dXMnLHN0YXR1cyk7XHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ09LJykge1xyXG4gICAgICAgICAgaWYgKHJlc3VsdHNbMF0pIHtcclxuICAgICAgICAgICAvLyB0aGlzLnpvb20gPSAxODtcclxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gcmVzdWx0c1swXS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgICAgICAgICAgIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXHJcbiAgICAgICAgICAgIGxldCBjaGFuZ2UgPSBuZXcgQ2hhbmdlV3JhcHBlcigpO1xyXG4gICAgICAgICAgICAvLyBSUyAwOURFQzI0IENoYW5nZWQga2V5c1xyXG4gICAgICAgICAgICBjaGFuZ2UuZnJvbVF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uLmlkO1xyXG4gICAgICAgICAgICBsZXQgYWRkT2JqMSA9IHt9O1xyXG4gICAgICAgICAgICBhZGRPYmoxWydhZGRyZXNzJ10gPSB0aGlzLmFkZHJlc3M7XHJcbiAgICAgICAgICAgIGFkZE9iajFbJ2xhdGl0dWRlJ10gPSBsYXRpdHVkZTtcclxuICAgICAgICAgICAgYWRkT2JqMVsnbG9uZ2l0dWRlJ10gPSBsb25naXR1ZGU7XHJcbiAgICAgICAgICAgIGNoYW5nZS52YWx1ZU9iaiA9IGFkZE9iajE7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYXRpb25TZWxlY3RlZC5lbWl0KGNoYW5nZSk7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBjb25zb2xlLmxvZygnTm8gcmVzdWx0cyBmb3VuZCcpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnR2VvY29kZXIgZmFpbGVkIGR1ZSB0bzogJyArIHN0YXR1cyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9wZW5NYXAoKSB7XHJcbiAgICB0aGlzLnNob3dNb2RhbCA9IHRydWU7XHJcbiAgICBpZighdGhpcy5hZGRyZXNzKXtcclxuICAgICAgdGhpcy5sYXRpdHVkZSA9IHRoaXMubG9uZ2l0dWRlID0gbnVsbDtcclxuICAgIH1cclxuICAgIGlmICghKHRoaXMubGF0aXR1ZGUgJiYgdGhpcy5sb25naXR1ZGUpKSB7XHJcbiAgICAgIHRoaXMuc2V0Q3VycmVudExvY2F0aW9uKCk7XHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XHJcbiAgICAgIHRoaXMuY2VudGVyID0geyBsYXQ6IHRoaXMubGF0aXR1ZGUsIGxuZzogdGhpcy5sb25naXR1ZGUgfTtcclxuICAgICAgdGhpcy56b29tID0gODtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsb3NlTW9kYWwoKSB7XHJcbiAgICB0aGlzLnNob3dNb2RhbCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG59XHJcbiIsIjxkaXY+XHJcbiAgICAgPCEtLSA8bGFiZWwgY2xhc3M9XCJzaGUtbGFiZWxcIj5Mb2NhdGlvbjwvbGFiZWw+IC0tPlxyXG4gICAgPCEtLSBIQSAxOURFQzIzIEZvciB0cmFuc2xhdGlvbiAtLT5cclxuICAgICA8aW5wdXQgI3NlYXJjaCBjbGFzcz1cInNoZS1saW5lLWlucHV0IGZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgcGxhY2Vob2xkZXI9XCJ7eyAnZW50ZXJMb2NhdGlvbicgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fVwiXHJcbiAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIiBwbGFjZWhvbGRlcj1cInt7ICdzZWFyY2hOZWFyZXN0TG9jYXRpb24nIHwgaTE4bjppMThuU2VydmljZS5jdXJyZW50TGFuZ3VhZ2UgfX1cIiBhdXRvY29ycmVjdD1cIm9mZlwiXHJcbiAgICAgICAgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwib2ZmXCIgdHlwZT1cInRleHRcIiAgWyhuZ01vZGVsKV09XCJhZGRyZXNzXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgPGEgKGNsaWNrKT1cIm9wZW5NYXAoKVwiXHJcbiAgICAgICAgc3R5bGU9XCJjb2xvcjojNDhCN0ZGO3Bvc2l0aW9uOnJlbGF0aXZlO3RvcDo1cHg7Y3Vyc29yOiBwb2ludGVyO1wiPlxyXG4gICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtbG9jYXRpb24tYXJyb3dcIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cclxuICAgICAgICA8IS0tIEhBIDE5REVDMjMgRm9yIHRyYW5zbGF0aW9uIC0tPlxyXG4gICAgICAgIDwvaT4ge3sgJ3BpY2tMb2NhdGlvbicgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fTwvYT5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGNsYXNzPVwibWFwLW92ZXJsYXlcIiAqbmdJZj1cInNob3dNb2RhbFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJtYXAtbW9kYWxcIj5cclxuICAgIDxkaXYgY2xhc3M9XCJtYXAtbW9kYWwtY29udGVudFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwibWFwLW1vZGFsLWhlYWRlclwiPlxyXG4gICAgICAgIDwhLS0gSEEgMTlERUMyMyBGb3IgdHJhbnNsYXRpb24gLS0+XHJcbiAgICAgICAgPGg0Pnt7ICdwaWNrWW91ckxvY2F0aW9uJyB8IGkxOG46aTE4blNlcnZpY2UuY3VycmVudExhbmd1YWdlIH19PC9oND5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY2xvc2UtYnV0dG9uXCIgKGNsaWNrKT1cImNsb3NlTW9kYWwoKVwiPlg8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDwhLS0gTW9kYWwgY29udGVudCBnb2VzIGhlcmUgLS0+XHJcbiAgICA8IS0tIDxhZ20tbWFwIFtsYXRpdHVkZV09XCJsYXRpdHVkZVwiIFtsb25naXR1ZGVdPVwibG9uZ2l0dWRlXCIgW3pvb21dPVwiem9vbVwiIChtYXBDbGljayk9XCJtYXJrZXJEcmFnRW5kKCRldmVudClcIlxyXG4gICAgW2Z1bGxzY3JlZW5Db250cm9sXT1cInRydWVcIj5cclxuICAgIDxhZ20tbWFya2VyIFtsYXRpdHVkZV09XCJsYXRpdHVkZVwiIFtsb25naXR1ZGVdPVwibG9uZ2l0dWRlXCIgW21hcmtlckRyYWdnYWJsZV09XCJ0cnVlXCJcclxuICAgICAgKGRyYWdFbmQpPVwibWFya2VyRHJhZ0VuZCgkZXZlbnQpXCI+PC9hZ20tbWFya2VyPlxyXG4gICAgPC9hZ20tbWFwPiAtLT5cclxuICAgIDxnb29nbGUtbWFwIFtsYXRpdHVkZV09XCJsYXRpdHVkZVwiICBbbG9uZ2l0dWRlXT1cImxvbmdpdHVkZVwiIFt6b29tXT1cInpvb21cIiBbY2VudGVyXT1cImNlbnRlclwiIChtYXBDbGljayk9XCJvbk1hcENsaWNrKCRldmVudClcIj5cclxuICAgICAgPG1hcC1tYXJrZXIgW3Bvc2l0aW9uXT1cIm1hcmtlclBvc2l0aW9uXCIgW29wdGlvbnNdPVwibWFya2VyT3B0aW9uc1wiPjwvbWFwLW1hcmtlcj5cclxuICAgIDwvZ29vZ2xlLW1hcD5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuXHJcblxyXG5cclxuXHJcblxyXG5cclxuIl19
216
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGljay1sb2NhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtYXBwL3NyYy9saWIvY29tcG9uZW50cy9waWNrLWxvY2F0aW9uL3BpY2stbG9jYXRpb24uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbnh0LWFwcC9zcmMvbGliL2NvbXBvbmVudHMvcGljay1sb2NhdGlvbi9waWNrLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsWUFBWSxFQUFFLEtBQUssRUFBOEMsTUFBTSxFQUFpQixTQUFTLEVBQWEsTUFBTSxlQUFlLENBQUM7QUFHbkssc0NBQXNDO0FBQ3ZDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQzs7Ozs7OztBQVMxRCxNQUFNLE9BQU8scUJBQXFCO0lBcUJ4QjtJQUNFO0lBQ0E7SUF0QlYsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixTQUFTLEdBQUcsSUFBSSxDQUFDO0lBQ2pCLElBQUksR0FBVyxFQUFFLENBQUM7SUFDVixRQUFRLENBQUM7SUFDbEIsK0JBQStCO0lBRXZCLGdCQUFnQixDQUErQjtJQUN0RCxTQUFTLEdBQVksS0FBSyxDQUFDO0lBQ2xCLE9BQU8sQ0FBUTtJQUN2QixzQ0FBc0M7SUFDOUIsUUFBUSxDQUFVO0lBQ2pCLGdCQUFnQixHQUFnQyxJQUFJLFlBQVksRUFBaUIsQ0FBQztJQUM1RixvQkFBb0IsQ0FBTTtJQUMxQixjQUFjLENBQTBCO0lBQ3hDLE1BQU0sQ0FBMEI7SUFDaEMsYUFBYSxDQUFLO0lBQ1QsTUFBTSxDQUFNLENBQUMscUNBQXFDO0lBRTNEO0lBQ0Msd0NBQXdDO0lBQ2pDLFdBQXdCLEVBQ3RCLE1BQWMsRUFDZCxHQUFzQjtRQUZ4QixnQkFBVyxHQUFYLFdBQVcsQ0FBYTtRQUN0QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFFNUIsMEZBQTBGO0lBQzlGLENBQUM7SUFFRCxRQUFRO1FBQ04sc0hBQXNIO1FBQ3RILElBQUcsSUFBSSxDQUFDLE1BQU0sRUFBQyxDQUFDO1lBQ2QsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDcEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzNDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBRTtvQkFDM0MsU0FBUyxFQUFFLElBQUk7b0JBQ2YsU0FBUyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUk7aUJBQ3RDLENBQUMsQ0FBQztnQkFDSCxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFDSCxlQUFlO0lBQ2IsV0FBVyxDQUFDLE9BQXNCO1FBQ2hDLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxZQUFZLEtBQUssT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQy9GLDhEQUE4RDtZQUM5RCxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO29CQUNuRSxJQUFJLE1BQU0sS0FBSyxJQUFJLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQzt3QkFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDbkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQzt3QkFDcEQsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7d0JBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQzt3QkFDZixJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUUsaUNBQWlDO29CQUU5RCxDQUFDO2dCQUNILENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGtDQUFrQztnQkFDbEMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztnQkFDM0IsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBRSxrQkFBa0I7WUFFL0MsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBTUQsbURBQW1EO0lBQzNDLG9CQUFvQjtRQUMxQixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDaEMscUNBQXFDO1FBQ3JDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsK0NBQStDLElBQUksQ0FBQyxNQUFNLDRCQUE0QixDQUFDO1FBQ3BHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE1BQU0sQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRWxDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ25CLE9BQU8sRUFBRSxDQUFDO1lBQ1osQ0FBQyxDQUFDO1lBQ0YsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEtBQVUsRUFBRSxFQUFFO2dCQUM5QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDaEIsQ0FBQyxDQUFDO1FBQ0osQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsZ0JBQWdCO1FBQ2QsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbEIsTUFBTSxZQUFZLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLGFBQWEsRUFBRTtnQkFDN0YsS0FBSyxFQUFFLEVBQUU7YUFDVixDQUFDLENBQUM7WUFDSCxZQUFZLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7Z0JBQzdDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtvQkFDbkIsTUFBTSxLQUFLLEdBQW1DLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQztvQkFFdEUsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLFNBQVMsSUFBSSxLQUFLLENBQUMsUUFBUSxLQUFLLElBQUksRUFBRSxDQUFDO3dCQUM1RCxPQUFPO29CQUNULENBQUM7b0JBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDOUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7b0JBQ2YsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsaUJBQWlCLENBQUM7b0JBQ3ZDLHNDQUFzQztvQkFDdEMsSUFBSSxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztvQkFDakMsMEJBQTBCO29CQUMxQixNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO29CQUN6QyxJQUFJLE1BQU0sR0FBRyxFQUFFLENBQUM7b0JBQ2hCLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO29CQUNqQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDbkMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7b0JBQ3JDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO29CQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNwQyxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxlQUFlO1FBQ2IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsU0FBUyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDckUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBQyxLQUFLLENBQUMsQ0FBQztZQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDbkMsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsQ0FBQyxDQUFDLENBQUM7SUFDSCxDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWdDO1FBQ3pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBR08sa0JBQWtCO1FBQ3hCLElBQUksYUFBYSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxXQUFXLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtnQkFDcEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQztnQkFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztnQkFDM0MsSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ2xFLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO2dCQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQkFDZCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFHRCxVQUFVLENBQUMsUUFBZ0IsRUFBRSxTQUFpQjtRQUM1QyxJQUFJLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNsQixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLFFBQVEsRUFBRSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7Z0JBQ3pGLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUMvQixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsSUFBSSxNQUFNLEtBQUssSUFBSSxFQUFFLENBQUM7b0JBQ3BCLElBQUksT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7d0JBQ2hCLGtCQUFrQjt3QkFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUM7d0JBQzNDLHNDQUFzQzt3QkFDdkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQzt3QkFDakMsMEJBQTBCO3dCQUMxQixNQUFNLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUN6QyxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7d0JBQ2pCLE9BQU8sQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO3dCQUNsQyxPQUFPLENBQUMsVUFBVSxDQUFDLEdBQUcsUUFBUSxDQUFDO3dCQUMvQixPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsU0FBUyxDQUFDO3dCQUNqQyxNQUFNLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQzt3QkFDMUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztvQkFDckMsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDbEMsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsR0FBRyxNQUFNLENBQUMsQ0FBQztnQkFDbkQsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDdEIsSUFBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1FBQ3hDLENBQUM7UUFDRCxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQzVCLENBQUM7YUFBSSxDQUFDO1lBQ0osSUFBSSxDQUFDLGNBQWMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLE1BQU0sR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDMUQsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDaEIsQ0FBQztJQUNILENBQUM7SUFFRCxVQUFVO1FBQ1IsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQzt3R0F6TVUscUJBQXFCOzRGQUFyQixxQkFBcUIsbVVDYmxDLG80REF3Q0E7OzRGRDNCYSxxQkFBcUI7a0JBTGpDLFNBQVM7K0JBQ0UsbUJBQW1CO3FJQVd0QixnQkFBZ0I7c0JBRHRCLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFHNUIsT0FBTztzQkFBZixLQUFLO2dCQUVHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ0ksZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUtFLE1BQU07c0JBQWQsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBJbnB1dCxDaGFuZ2VEZXRlY3RvclJlZiwgTmdNb2R1bGUsIE5nWm9uZSwgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgT25DaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbi8vIEhBIDE5REVDMjMgaW1wb3J0ZWQgdHJhbnNsYXRpb24gc2VydmljZVxyXG5pbXBvcnQgeyBJMThuU2VydmljZSB9IGZyb20gJy4uLy4uL2kxOG4uc2VydmljZSc7XHJcbiAvLyBWRCAyMURFQzIzIC0gZGVwZW5kZW50IGZpZWxkIGNoYW5nZVxyXG5pbXBvcnQgeyBDaGFuZ2VXcmFwcGVyIH0gZnJvbSAnLi4vLi4vbW9kZWwvY2hhbmdlV3JhcHBlcic7XHJcbmltcG9ydCB7IFF1ZXN0aW9uIH0gZnJvbSAnLi4vLi4vd3JhcHBlcic7XHJcbmRlY2xhcmUgdmFyICQ6IGFueTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLXBpY2stbG9jYXRpb24nLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9waWNrLWxvY2F0aW9uLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9waWNrLWxvY2F0aW9uLmNvbXBvbmVudC5jc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgUGlja0xvY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0ICxPbkNoYW5nZXMge1xyXG4gIGxhdGl0dWRlID0gbnVsbDtcclxuICBsb25naXR1ZGUgPSBudWxsO1xyXG4gIHpvb206IG51bWJlciA9IDEwO1xyXG4gIHByaXZhdGUgZ2VvQ29kZXI7XHJcbiAvLyBwdWJsaWMgZm9ybUdyb3VwOiBGb3JtR3JvdXA7XHJcbiAgQFZpZXdDaGlsZCgnc2VhcmNoJywgeyBzdGF0aWM6IHRydWUgfSlcclxuICBwdWJsaWMgc2VhcmNoRWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MSW5wdXRFbGVtZW50PjtcclxuICBzaG93TW9kYWw6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBhZGRyZXNzOnN0cmluZztcclxuICAgLy8gVkQgMjFERUMyMyAtIGRlcGVuZGVudCBmaWVsZCBjaGFuZ2VcclxuICBASW5wdXQoKSBxdWVzdGlvbjogUXVlc3Rpb25cclxuICBAT3V0cHV0KCkgbG9jYXRpb25TZWxlY3RlZDogRXZlbnRFbWl0dGVyPENoYW5nZVdyYXBwZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxDaGFuZ2VXcmFwcGVyPigpO1xyXG4gIG5hdmlnYXRvckdlb2xvY2F0aW9uOiBhbnk7XHJcbiAgbWFya2VyUG9zaXRpb246IHsgbGF0OiBhbnk7IGxuZzogYW55OyB9O1xyXG4gIGNlbnRlcjogeyBsYXQ6IGFueTsgbG5nOiBhbnk7IH07XHJcbiAgbWFya2VyT3B0aW9uczphbnk7XHJcbiAgQElucHV0KCkgYXBpS2V5OiBhbnk7IC8vIEhBMTAwMTIwMjQgZGVjbGFyZWQgQXBpIGtleSB0byBzcmNcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgIC8vIHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcclxuICAgcHVibGljIGkxOG5TZXJ2aWNlOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgbmdab25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHtcclxuICAgICAgLy8gSEEwOTAxMjAyNCBpcyB0byBhdm9pZCBnb29nbGUgaXMgdW5kZWZpbmVkIGVycm9yIGFuZCBjYWxsaW5nIHRoZSBiZWxvdyBjcmVhdGVkIGZ1bmN0aW9uXHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIEhBLTExLTAxLTIwMjQgQ2hhbmdlZCB0aGUgbWFwIENhbGwgZnJvbSBjb25zdHJ1Y3RvciB0byBuZ09uSW5pdCBhcyBpdCB3YXMgZ2l2aW5nIHVuZGVmaW5lZCB2YWx1ZXMgaW4gdGhlIG91dHNvdXJjZWRcclxuICAgIGlmKHRoaXMuYXBpS2V5KXtcclxuICAgICAgdGhpcy5sb2FkR29vZ2xlTWFwc1NjcmlwdCgpLnRoZW4oKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuZ2VvQ29kZXIgPSBuZXcgZ29vZ2xlLm1hcHMuR2VvY29kZXIoKTtcclxuICAgICAgICB0aGlzLm1hcmtlck9wdGlvbnMgPSBuZXcgZ29vZ2xlLm1hcHMuTWFya2VyICh7XHJcbiAgICAgICAgICBkcmFnZ2FibGU6IHRydWUsXHJcbiAgICAgICAgICBhbmltYXRpb246IGdvb2dsZS5tYXBzLkFuaW1hdGlvbi5EUk9QXHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgdGhpcy5pbml0QXV0b2NvbXBsZXRlKCk7XHJcbiAgICAgICAgdGhpcy5vbk1hcmtlckRyYWdFbmQoKTtcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG4vLyBSUyAyM0pBTjIwMjVcclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1snYWRkcmVzcyddICYmIGNoYW5nZXNbJ2FkZHJlc3MnXS5jdXJyZW50VmFsdWUgIT09IGNoYW5nZXNbJ2FkZHJlc3MnXS5wcmV2aW91c1ZhbHVlKSB7XHJcbiAgICAgIC8vIEVuc3VyZSBsYXRpdHVkZSAmIGxvbmdpdHVkZSB1cGRhdGUgd2hlbiB0aGUgYWRkcmVzcyBjaGFuZ2VzXHJcbiAgICAgIGlmICh0aGlzLmFkZHJlc3MpIHtcclxuICAgICAgICB0aGlzLmdlb0NvZGVyLmdlb2NvZGUoeyBhZGRyZXNzOiB0aGlzLmFkZHJlc3MgfSwgKHJlc3VsdHMsIHN0YXR1cykgPT4ge1xyXG4gICAgICAgICAgaWYgKHN0YXR1cyA9PT0gJ09LJyAmJiByZXN1bHRzWzBdPy5nZW9tZXRyeT8ubG9jYXRpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5sYXRpdHVkZSA9IHJlc3VsdHNbMF0uZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XHJcbiAgICAgICAgICAgIHRoaXMubG9uZ2l0dWRlID0gcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcclxuICAgICAgICAgICAgdGhpcy5tYXJrZXJQb3NpdGlvbiA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XHJcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID0geyBsYXQ6IHRoaXMubGF0aXR1ZGUsIGxuZzogdGhpcy5sb25naXR1ZGUgfTtcclxuICAgICAgICAgICAgdGhpcy56b29tID0gMTg7XHJcbiAgICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTsgIC8vIEZvcmNlIEFuZ3VsYXIgdG8gdXBkYXRlIHRoZSBVSVxyXG5cclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICAvLyBSZXNldCBpZiBubyBhZGRyZXNzIGlzIHByb3ZpZGVkXHJcbiAgICAgICAgdGhpcy5sYXRpdHVkZSA9IG51bGw7XHJcbiAgICAgICAgdGhpcy5sb25naXR1ZGUgPSBudWxsO1xyXG4gICAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSBudWxsO1xyXG4gICAgICAgIHRoaXMuY2VudGVyID0gbnVsbDtcclxuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7ICAvLyBGT1JDRSBVSSBVUERBVEVcclxuXHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcblxyXG5cclxuICAvLyBIQTA5MDEyMDI0IGlzIHRvIGF2b2lkIGdvb2dsZSBpcyB1bmRlZmluZWQgZXJyb3JcclxuICBwcml2YXRlIGxvYWRHb29nbGVNYXBzU2NyaXB0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgY29uc3Qgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICBzY3JpcHQudHlwZSA9ICd0ZXh0L2phdmFzY3JpcHQnO1xyXG4gICAgLy8gSEExMDAxMjAyNCBBc3NpZ25lZCBBcGkga2V5IHRvIHNyY1xyXG4gICAgc2NyaXB0LnNyYyA9IGBodHRwczovL21hcHMuZ29vZ2xlYXBpcy5jb20vbWFwcy9hcGkvanM/a2V5PSR7dGhpcy5hcGlLZXl9JmxpYnJhcmllcz1nZW9tZXRyeSxwbGFjZXNgO1xyXG4gICAgc2NyaXB0LmFzeW5jID0gdHJ1ZTtcclxuICAgIHNjcmlwdC5kZWZlciA9IHRydWU7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcmlwdCk7XHJcblxyXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcclxuICAgICAgc2NyaXB0Lm9ubG9hZCA9ICgpID0+IHtcclxuICAgICAgICByZXNvbHZlKCk7XHJcbiAgICAgIH07XHJcbiAgICAgIHNjcmlwdC5vbmVycm9yID0gKGVycm9yOiBhbnkpID0+IHtcclxuICAgICAgICByZWplY3QoZXJyb3IpO1xyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBpbml0QXV0b2NvbXBsZXRlKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuZ2VvQ29kZXIpIHtcclxuICAgICAgY29uc3QgYXV0b2NvbXBsZXRlID0gbmV3IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGUodGhpcy5zZWFyY2hFbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50LCB7XHJcbiAgICAgICAgdHlwZXM6IFtdXHJcbiAgICAgIH0pO1xyXG4gICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoKSA9PiB7XHJcbiAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgIGNvbnN0IHBsYWNlOiBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQgPSBhdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcclxuXHJcbiAgICAgICAgICBpZiAocGxhY2UuZ2VvbWV0cnkgPT09IHVuZGVmaW5lZCB8fCBwbGFjZS5nZW9tZXRyeSA9PT0gbnVsbCkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICB0aGlzLmxhdGl0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XHJcbiAgICAgICAgICB0aGlzLmxvbmdpdHVkZSA9IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxuZygpO1xyXG4gICAgICAgICAgdGhpcy56b29tID0gMTg7XHJcbiAgICAgICAgICB0aGlzLmFkZHJlc3MgPSBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcztcclxuICAgICAgICAgIC8vIFZEIDIxREVDMjMgLSBkZXBlbmRlbnQgZmllbGQgY2hhbmdlXHJcbiAgICAgICAgICBsZXQgY2hhbmdlID0gbmV3IENoYW5nZVdyYXBwZXIoKTtcclxuICAgICAgICAgIC8vIFJTIDA5REVDMjQgQ2hhbmdlZCBrZXlzXHJcbiAgICAgICAgICBjaGFuZ2UuZnJvbVF1ZXN0aW9uSWQgPSB0aGlzLnF1ZXN0aW9uLmlkO1xyXG4gICAgICAgICAgbGV0IGFkZE9iaiA9IHt9O1xyXG4gICAgICAgICAgYWRkT2JqWydhZGRyZXNzJ10gPSB0aGlzLmFkZHJlc3M7XHJcbiAgICAgICAgICBhZGRPYmpbJ2xhdGl0dWRlJ10gPSB0aGlzLmxhdGl0dWRlO1xyXG4gICAgICAgICAgYWRkT2JqWydsb25naXR1ZGUnXSA9IHRoaXMubG9uZ2l0dWRlO1xyXG4gICAgICAgICAgY2hhbmdlLnZhbHVlT2JqID0gYWRkT2JqO1xyXG4gICAgICAgICB0aGlzLmxvY2F0aW9uU2VsZWN0ZWQuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG9uTWFya2VyRHJhZ0VuZCgpOiB2b2lkIHtcclxuICAgIGdvb2dsZS5tYXBzLmV2ZW50LmFkZExpc3RlbmVyKHRoaXMubWFya2VyT3B0aW9ucywgJ2RyYWdlbmQnLCAoZXZlbnQpID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ2RyYWdhYmxlIHdvcmtpbmcnLGV2ZW50KTtcclxuICAgICAgdGhpcy5sYXRpdHVkZSA9IGV2ZW50LmxhdExuZy5sYXQoKTtcclxuICAgICAgdGhpcy5sb25naXR1ZGUgPSBldmVudC5sYXRMbmcubG5nKCk7XHJcbiAgICAgIHRoaXMuZ2V0QWRkcmVzcyh0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZSk7XHJcbiAgfSk7XHJcbiAgfVxyXG5cclxuICBvbk1hcENsaWNrKGV2ZW50OiBnb29nbGUubWFwcy5NYXBNb3VzZUV2ZW50KTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZygnb25NYXBDbGljaycsZXZlbnQpO1xyXG4gICAgdGhpcy5sYXRpdHVkZSA9IGV2ZW50LmxhdExuZy5sYXQoKTtcclxuICAgIHRoaXMubG9uZ2l0dWRlID0gZXZlbnQubGF0TG5nLmxuZygpO1xyXG4gICAgdGhpcy5nZXRBZGRyZXNzKHRoaXMubGF0aXR1ZGUsIHRoaXMubG9uZ2l0dWRlKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHNldEN1cnJlbnRMb2NhdGlvbigpIHtcclxuICAgIGlmICgnZ2VvbG9jYXRpb24nIGluIG5hdmlnYXRvcikge1xyXG4gICAgICBuYXZpZ2F0b3IuZ2VvbG9jYXRpb24uZ2V0Q3VycmVudFBvc2l0aW9uKChwb3NpdGlvbikgPT4ge1xyXG4gICAgICAgIHRoaXMubGF0aXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubGF0aXR1ZGU7XHJcbiAgICAgICAgdGhpcy5sb25naXR1ZGUgPSBwb3NpdGlvbi5jb29yZHMubG9uZ2l0dWRlO1xyXG4gICAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSB7IGxhdDogdGhpcy5sYXRpdHVkZSwgbG5nOiB0aGlzLmxvbmdpdHVkZSB9O1xyXG4gICAgICAgIHRoaXMuY2VudGVyID0geyBsYXQ6IHRoaXMubGF0aXR1ZGUsIGxuZzogdGhpcy5sb25naXR1ZGUgfTtcclxuICAgICAgICB0aGlzLnpvb20gPSA4O1xyXG4gICAgICAgIHRoaXMuZ2V0QWRkcmVzcyh0aGlzLmxhdGl0dWRlLCB0aGlzLmxvbmdpdHVkZSk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGdldEFkZHJlc3MobGF0aXR1ZGU6IG51bWJlciwgbG9uZ2l0dWRlOiBudW1iZXIpIHtcclxuICAgIGlmICh0aGlzLmdlb0NvZGVyKSB7XHJcbiAgICAgIHRoaXMuZ2VvQ29kZXIuZ2VvY29kZSh7IGxvY2F0aW9uOiB7IGxhdDogbGF0aXR1ZGUsIGxuZzogbG9uZ2l0dWRlIH0gfSwgKHJlc3VsdHMsIHN0YXR1cykgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdyZXN1bHRzJyxyZXN1bHRzKTtcclxuICAgICAgICBjb25zb2xlLmxvZygnc3RhdHVzJyxzdGF0dXMpO1xyXG4gICAgICAgIGlmIChzdGF0dXMgPT09ICdPSycpIHtcclxuICAgICAgICAgIGlmIChyZXN1bHRzWzBdKSB7XHJcbiAgICAgICAgICAgLy8gdGhpcy56b29tID0gMTg7XHJcbiAgICAgICAgICAgIHRoaXMuYWRkcmVzcyA9IHJlc3VsdHNbMF0uZm9ybWF0dGVkX2FkZHJlc3M7XHJcbiAgICAgICAgICAgICAvLyBWRCAyMURFQzIzIC0gZGVwZW5kZW50IGZpZWxkIGNoYW5nZVxyXG4gICAgICAgICAgICBsZXQgY2hhbmdlID0gbmV3IENoYW5nZVdyYXBwZXIoKTtcclxuICAgICAgICAgICAgLy8gUlMgMDlERUMyNCBDaGFuZ2VkIGtleXNcclxuICAgICAgICAgICAgY2hhbmdlLmZyb21RdWVzdGlvbklkID0gdGhpcy5xdWVzdGlvbi5pZDtcclxuICAgICAgICAgICAgbGV0IGFkZE9iajEgPSB7fTtcclxuICAgICAgICAgICAgYWRkT2JqMVsnYWRkcmVzcyddID0gdGhpcy5hZGRyZXNzO1xyXG4gICAgICAgICAgICBhZGRPYmoxWydsYXRpdHVkZSddID0gbGF0aXR1ZGU7XHJcbiAgICAgICAgICAgIGFkZE9iajFbJ2xvbmdpdHVkZSddID0gbG9uZ2l0dWRlO1xyXG4gICAgICAgICAgICBjaGFuZ2UudmFsdWVPYmogPSBhZGRPYmoxO1xyXG4gICAgICAgICAgICB0aGlzLmxvY2F0aW9uU2VsZWN0ZWQuZW1pdChjaGFuZ2UpO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgY29uc29sZS5sb2coJ05vIHJlc3VsdHMgZm91bmQnKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ0dlb2NvZGVyIGZhaWxlZCBkdWUgdG86ICcgKyBzdGF0dXMpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvcGVuTWFwKCkge1xyXG4gICAgdGhpcy5zaG93TW9kYWwgPSB0cnVlO1xyXG4gICAgaWYoIXRoaXMuYWRkcmVzcyl7XHJcbiAgICAgIHRoaXMubGF0aXR1ZGUgPSB0aGlzLmxvbmdpdHVkZSA9IG51bGw7XHJcbiAgICB9XHJcbiAgICBpZiAoISh0aGlzLmxhdGl0dWRlICYmIHRoaXMubG9uZ2l0dWRlKSkge1xyXG4gICAgICB0aGlzLnNldEN1cnJlbnRMb2NhdGlvbigpO1xyXG4gICAgfWVsc2V7XHJcbiAgICAgIHRoaXMubWFya2VyUG9zaXRpb24gPSB7IGxhdDogdGhpcy5sYXRpdHVkZSwgbG5nOiB0aGlzLmxvbmdpdHVkZSB9O1xyXG4gICAgICB0aGlzLmNlbnRlciA9IHsgbGF0OiB0aGlzLmxhdGl0dWRlLCBsbmc6IHRoaXMubG9uZ2l0dWRlIH07XHJcbiAgICAgIHRoaXMuem9vbSA9IDg7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbG9zZU1vZGFsKCkge1xyXG4gICAgdGhpcy5zaG93TW9kYWwgPSBmYWxzZTtcclxuICB9XHJcblxyXG5cclxufVxyXG5cclxuIiwiPGRpdj5cclxuICAgICA8IS0tIDxsYWJlbCBjbGFzcz1cInNoZS1sYWJlbFwiPkxvY2F0aW9uPC9sYWJlbD4gLS0+XHJcbiAgICA8IS0tIEhBIDE5REVDMjMgRm9yIHRyYW5zbGF0aW9uIC0tPlxyXG4gICAgIDxpbnB1dCAjc2VhcmNoIGNsYXNzPVwic2hlLWxpbmUtaW5wdXQgZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBwbGFjZWhvbGRlcj1cInt7ICdlbnRlckxvY2F0aW9uJyB8IGkxOG46aTE4blNlcnZpY2UuY3VycmVudExhbmd1YWdlIH19XCJcclxuICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCIkZXZlbnQucHJldmVudERlZmF1bHQoKVwiIHBsYWNlaG9sZGVyPVwie3sgJ3NlYXJjaE5lYXJlc3RMb2NhdGlvbicgfCBpMThuOmkxOG5TZXJ2aWNlLmN1cnJlbnRMYW5ndWFnZSB9fVwiIGF1dG9jb3JyZWN0PVwib2ZmXCJcclxuICAgICAgICBhdXRvY2FwaXRhbGl6ZT1cIm9mZlwiIHNwZWxsY2hlY2s9XCJvZmZcIiB0eXBlPVwidGV4dFwiICBbKG5nTW9kZWwpXT1cImFkZHJlc3NcIlxyXG4gICAgICAgID5cclxuICAgICAgICA8YSAoY2xpY2spPVwib3Blbk1hcCgpXCJcclxuICAgICAgICBzdHlsZT1cImNvbG9yOiM0OEI3RkY7cG9zaXRpb246cmVsYXRpdmU7dG9wOjVweDtjdXJzb3I6IHBvaW50ZXI7XCI+XHJcbiAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1sb2NhdGlvbi1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxyXG4gICAgICAgIDwhLS0gSEEgMTlERUMyMyBGb3IgdHJhbnNsYXRpb24gLS0+XHJcbiAgICAgICAgPC9pPiB7eyAncGlja0xvY2F0aW9uJyB8IGkxOG46aTE4blNlcnZpY2UuY3VycmVudExhbmd1YWdlIH19PC9hPlxyXG48L2Rpdj5cclxuXHJcbjxkaXYgY2xhc3M9XCJtYXAtb3ZlcmxheVwiICpuZ0lmPVwic2hvd01vZGFsXCI+XHJcbiAgPGRpdiBjbGFzcz1cIm1hcC1tb2RhbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cIm1hcC1tb2RhbC1jb250ZW50XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYXAtbW9kYWwtaGVhZGVyXCI+XHJcbiAgICAgICAgPCEtLSBIQSAxOURFQzIzIEZvciB0cmFuc2xhdGlvbiAtLT5cclxuICAgICAgICA8aDQ+e3sgJ3BpY2tZb3VyTG9jYXRpb24nIHwgaTE4bjppMThuU2VydmljZS5jdXJyZW50TGFuZ3VhZ2UgfX08L2g0PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJjbG9zZS1idXR0b25cIiAoY2xpY2spPVwiY2xvc2VNb2RhbCgpXCI+WDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPCEtLSBNb2RhbCBjb250ZW50IGdvZXMgaGVyZSAtLT5cclxuICAgIDwhLS0gPGFnbS1tYXAgW2xhdGl0dWRlXT1cImxhdGl0dWRlXCIgW2xvbmdpdHVkZV09XCJsb25naXR1ZGVcIiBbem9vbV09XCJ6b29tXCIgKG1hcENsaWNrKT1cIm1hcmtlckRyYWdFbmQoJGV2ZW50KVwiXHJcbiAgICBbZnVsbHNjcmVlbkNvbnRyb2xdPVwidHJ1ZVwiPlxyXG4gICAgPGFnbS1tYXJrZXIgW2xhdGl0dWRlXT1cImxhdGl0dWRlXCIgW2xvbmdpdHVkZV09XCJsb25naXR1ZGVcIiBbbWFya2VyRHJhZ2dhYmxlXT1cInRydWVcIlxyXG4gICAgICAoZHJhZ0VuZCk9XCJtYXJrZXJEcmFnRW5kKCRldmVudClcIj48L2FnbS1tYXJrZXI+XHJcbiAgICA8L2FnbS1tYXA+IC0tPlxyXG4gICAgPGdvb2dsZS1tYXAgW2xhdGl0dWRlXT1cImxhdGl0dWRlXCIgIFtsb25naXR1ZGVdPVwibG9uZ2l0dWRlXCIgW3pvb21dPVwiem9vbVwiIFtjZW50ZXJdPVwiY2VudGVyXCIgKG1hcENsaWNrKT1cIm9uTWFwQ2xpY2soJGV2ZW50KVwiPlxyXG4gICAgICA8bWFwLW1hcmtlciBbcG9zaXRpb25dPVwibWFya2VyUG9zaXRpb25cIiBbb3B0aW9uc109XCJtYXJrZXJPcHRpb25zXCI+PC9tYXAtbWFya2VyPlxyXG4gICAgPC9nb29nbGUtbWFwPlxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuXHJcblxyXG5cclxuXHJcblxyXG4iXX0=