@angular-material-extensions/google-maps-autocomplete
Version:
Autocomplete input component and directive for google-maps built with angular and material design
232 lines • 30.2 kB
JavaScript
import { __decorate } from "tslib";
import { Component, ElementRef, EventEmitter, forwardRef, Input, NgZone, OnInit, Output, ViewChild } from '@angular/core';
import { FormControl, NG_VALUE_ACCESSOR, Validators } from '@angular/forms';
import { MapsAPILoader } from '@agm/core';
import { MatValidateAddressDirective } from '../directives/address-validator/mat-address-validator.directive';
export var Appearance;
(function (Appearance) {
Appearance["STANDARD"] = "standard";
Appearance["FILL"] = "fill";
Appearance["OUTLINE"] = "outline";
Appearance["LEGACY"] = "legacy";
})(Appearance || (Appearance = {}));
var MatGoogleMapsAutocompleteComponent = /** @class */ (function () {
function MatGoogleMapsAutocompleteComponent(mapsAPILoader, ngZone) {
this.mapsAPILoader = mapsAPILoader;
this.ngZone = ngZone;
this.addressLabelText = 'Address';
this.placeholderText = 'Please enter the address';
this.requiredErrorText = 'The address is required';
this.invalidErrorText = 'The address is not valid';
this.appearance = Appearance.STANDARD;
this.autoCompleteOptions = {};
this.onChange = new EventEmitter();
this.onAutocompleteSelected = new EventEmitter();
this.onGermanAddressMapped = new EventEmitter();
this.onLocationSelected = new EventEmitter();
this.onNewPlaceResult = new EventEmitter();
this.addressValidator = new MatValidateAddressDirective();
this.addressSearchControl = new FormControl({ value: null }, Validators.compose([
Validators.required,
this.addressValidator.validate()
]));
this.propagateChange = function (_) {
};
}
MatGoogleMapsAutocompleteComponent_1 = MatGoogleMapsAutocompleteComponent;
MatGoogleMapsAutocompleteComponent.prototype.ngOnInit = function () {
this.addressValidator.subscribe(this.onNewPlaceResult);
var options = {
// types: ['address'],
// componentRestrictions: {country: this.country},
placeIdOnly: this.placeIdOnly,
strictBounds: this.strictBounds,
// types: this.types,
type: this.type
};
// tslint:disable-next-line:no-unused-expression
this.country ? options.componentRestrictions = { country: this.country } : null;
// tslint:disable-next-line:no-unused-expression
this.country ? options.types = this.types : null;
this.autoCompleteOptions = Object.assign(this.autoCompleteOptions, options);
this.initGoogleMapsAutocomplete();
};
MatGoogleMapsAutocompleteComponent.prototype.initGoogleMapsAutocomplete = function () {
var _this = this;
this.mapsAPILoader
.load()
.then(function () {
var autocomplete = new google.maps.places.Autocomplete(_this.searchElementRef.nativeElement, _this.autoCompleteOptions);
autocomplete.addListener('place_changed', function () {
_this.ngZone.run(function () {
// get the place result
var place = autocomplete.getPlace();
var germanAddress = {
gmID: place.id,
icon: place.icon,
url: place.url,
placeID: place.place_id,
displayAddress: place.formatted_address,
name: place.name,
vicinity: place.vicinity,
locality: {},
state: {},
country: {},
geoLocation: { latitude: -1, longitude: -1 },
};
if (place.geometry && place.geometry.location) {
germanAddress.geoLocation.latitude = place.geometry.location.lat();
germanAddress.geoLocation.longitude = place.geometry.location.lng();
}
place.address_components.forEach(function (value) {
if (value.types.indexOf('street_number') > -1) {
germanAddress.streetNumber = value.short_name;
}
if (value.types.indexOf('route') > -1) {
germanAddress.streetName = value.long_name;
}
if (value.types.indexOf('postal_code') > -1) {
germanAddress.postalCode = Number(value.short_name);
}
if (value.types.indexOf('sublocality') > -1) {
germanAddress.sublocality = value.long_name;
}
if (value.types.indexOf('locality') > -1) {
germanAddress.locality.long = value.long_name;
germanAddress.locality.short = value.short_name;
}
if (value.types.indexOf('administrative_area_level_1') > -1) {
germanAddress.state.long = value.long_name;
germanAddress.state.short = value.short_name;
}
if (value.types.indexOf('country') > -1) {
germanAddress.country.long = value.long_name;
germanAddress.country.short = value.short_name;
}
if (value.types.indexOf('administrative_area_level_3') > -1) {
germanAddress.locality.short = value.short_name;
}
});
_this.onGermanAddressMapped.emit(germanAddress);
if (!place.place_id || place.geometry === undefined || place.geometry === null) {
// place result is not valid
return;
}
else {
// show dialog to select a address from the input
// emit failed event
_this.value = place;
_this.propagateChange(_this.value);
}
_this.address = place.formatted_address;
_this.onAutocompleteSelected.emit(place);
// console.log('onAutocompleteSelected -> ', place);
_this.onLocationSelected.emit({
latitude: place.geometry.location.lat(),
longitude: place.geometry.location.lng()
});
});
});
})
.catch(function (err) { return console.log(err); });
};
MatGoogleMapsAutocompleteComponent.prototype.onQuery = function (event) {
// console.log('onChange()', event);
this.onChange.emit(this.address);
};
MatGoogleMapsAutocompleteComponent.prototype.resetAddress = function () {
this.address = null;
this.addressSearchControl.updateValueAndValidity();
};
MatGoogleMapsAutocompleteComponent.prototype.writeValue = function (obj) {
if (obj) {
this.value = obj;
}
};
MatGoogleMapsAutocompleteComponent.prototype.registerOnChange = function (fn) {
this.propagateChange = fn;
};
MatGoogleMapsAutocompleteComponent.prototype.registerOnTouched = function (fn) {
throw new Error('Method not implemented.');
};
MatGoogleMapsAutocompleteComponent.prototype.setDisabledState = function (isDisabled) {
throw new Error('Method not implemented.');
};
var MatGoogleMapsAutocompleteComponent_1;
MatGoogleMapsAutocompleteComponent.ctorParameters = function () { return [
{ type: MapsAPILoader },
{ type: NgZone }
]; };
__decorate([
ViewChild('search')
], MatGoogleMapsAutocompleteComponent.prototype, "searchElementRef", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "addressLabelText", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "placeholderText", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "requiredErrorText", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "invalidErrorText", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "appearance", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "value", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "address", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "country", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "placeIdOnly", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "strictBounds", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "types", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "type", void 0);
__decorate([
Input()
], MatGoogleMapsAutocompleteComponent.prototype, "autoCompleteOptions", void 0);
__decorate([
Output()
], MatGoogleMapsAutocompleteComponent.prototype, "onChange", void 0);
__decorate([
Output()
], MatGoogleMapsAutocompleteComponent.prototype, "onAutocompleteSelected", void 0);
__decorate([
Output()
], MatGoogleMapsAutocompleteComponent.prototype, "onGermanAddressMapped", void 0);
__decorate([
Output()
], MatGoogleMapsAutocompleteComponent.prototype, "onLocationSelected", void 0);
MatGoogleMapsAutocompleteComponent = MatGoogleMapsAutocompleteComponent_1 = __decorate([
Component({
selector: 'mat-google-maps-autocomplete',
exportAs: 'matGoogleMapsAutocomplete',
template: "<mat-form-field class=\"full-width\" [appearance]=\"appearance\">\n <mat-label>{{addressLabelText}}</mat-label>\n <input matInput\n [(ngModel)]=\"address\"\n (change)=\"onQuery($event)\"\n placeholder=\"{{placeholderText}}\"\n class=\"form-control\"\n #search\n MatValidateAddress\n required>\n <mat-error *ngIf=\"addressSearchControl.hasError('required')\">\n {{requiredErrorText}}\n </mat-error>\n <mat-error *ngIf=\"addressSearchControl.hasError('validateAddress')\">\n {{invalidErrorText}}\n </mat-error>\n</mat-form-field>\n",
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(function () { return MatGoogleMapsAutocompleteComponent_1; }),
multi: true
}
],
styles: [".full-width{width:100%}"]
})
], MatGoogleMapsAutocompleteComponent);
return MatGoogleMapsAutocompleteComponent;
}());
export { MatGoogleMapsAutocompleteComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYW5ndWxhci1tYXRlcmlhbC1leHRlbnNpb25zL2dvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvbWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQXVCLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3hDLE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLGlFQUFpRSxDQUFDO0FBTTVHLE1BQU0sQ0FBTixJQUFZLFVBS1g7QUFMRCxXQUFZLFVBQVU7SUFDcEIsbUNBQXFCLENBQUE7SUFDckIsMkJBQWEsQ0FBQTtJQUNiLGlDQUFtQixDQUFBO0lBQ25CLCtCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFMVyxVQUFVLEtBQVYsVUFBVSxRQUtyQjtBQWVEO0lBcUVFLDRDQUFvQixhQUE0QixFQUM1QixNQUFjO1FBRGQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQWhFbEMscUJBQWdCLEdBQUcsU0FBUyxDQUFDO1FBRzdCLG9CQUFlLEdBQUcsMEJBQTBCLENBQUM7UUFHN0Msc0JBQWlCLEdBQUcseUJBQXlCLENBQUM7UUFHOUMscUJBQWdCLEdBQUcsMEJBQTBCLENBQUM7UUFHOUMsZUFBVSxHQUF3QixVQUFVLENBQUMsUUFBUSxDQUFDO1FBeUJ0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bEMsQ0FBa0MsQ0FBQztvQkFDakUsS0FBSyxFQUFFLElBQUk7aUJBQ1o7YUFDRjs7U0FDRixDQUFDO09BQ1csa0NBQWtDLENBOE05QztJQUFELHlDQUFDO0NBQUEsQUE5TUQsSUE4TUM7U0E5TVksa0NBQWtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgZm9yd2FyZFJlZiwgSW5wdXQsIE5nWm9uZSwgT25Jbml0LCBPdXRwdXQsIFZpZXdDaGlsZH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBGb3JtQ29udHJvbCwgTkdfVkFMVUVfQUNDRVNTT1IsIFZhbGlkYXRvcnN9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7TWFwc0FQSUxvYWRlcn0gZnJvbSAnQGFnbS9jb3JlJztcbmltcG9ydCB7TWF0VmFsaWRhdGVBZGRyZXNzRGlyZWN0aXZlfSBmcm9tICcuLi9kaXJlY3RpdmVzL2FkZHJlc3MtdmFsaWRhdG9yL21hdC1hZGRyZXNzLXZhbGlkYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnLi4vaW50ZXJmYWNlcy9sb2NhdGlvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHtHZXJtYW5BZGRyZXNzfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCBQbGFjZVJlc3VsdCA9IGdvb2dsZS5tYXBzLnBsYWNlcy5QbGFjZVJlc3VsdDtcbmltcG9ydCBBdXRvY29tcGxldGVPcHRpb25zID0gZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZU9wdGlvbnM7XG5cbmV4cG9ydCBlbnVtIEFwcGVhcmFuY2Uge1xuICBTVEFOREFSRCA9ICdzdGFuZGFyZCcsXG4gIEZJTEwgPSAnZmlsbCcsXG4gIE9VVExJTkUgPSAnb3V0bGluZScsXG4gIExFR0FDWSA9ICdsZWdhY3knLFxufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtYXQtZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlJyxcbiAgZXhwb3J0QXM6ICdtYXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlJyxcbiAgdGVtcGxhdGVVcmw6ICcuL21hdC1nb29nbGUtbWFwcy1hdXRvY29tcGxldGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9tYXQtZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5zY3NzJ10sXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudCksXG4gICAgICBtdWx0aTogdHJ1ZVxuICAgIH1cbiAgXVxufSlcbmV4cG9ydCBjbGFzcyBNYXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBDb250cm9sVmFsdWVBY2Nlc3NvciB7XG5cbiAgQFZpZXdDaGlsZCgnc2VhcmNoJylcbiAgcHVibGljIHNlYXJjaEVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgQElucHV0KClcbiAgYWRkcmVzc0xhYmVsVGV4dCA9ICdBZGRyZXNzJztcblxuICBASW5wdXQoKVxuICBwbGFjZWhvbGRlclRleHQgPSAnUGxlYXNlIGVudGVyIHRoZSBhZGRyZXNzJztcblxuICBASW5wdXQoKVxuICByZXF1aXJlZEVycm9yVGV4dCA9ICdUaGUgYWRkcmVzcyBpcyByZXF1aXJlZCc7XG5cbiAgQElucHV0KClcbiAgaW52YWxpZEVycm9yVGV4dCA9ICdUaGUgYWRkcmVzcyBpcyBub3QgdmFsaWQnO1xuXG4gIEBJbnB1dCgpXG4gIGFwcGVhcmFuY2U6IHN0cmluZyB8IEFwcGVhcmFuY2UgPSBBcHBlYXJhbmNlLlNUQU5EQVJEO1xuXG4gIEBJbnB1dCgpXG4gIHZhbHVlOiBQbGFjZVJlc3VsdDtcblxuICBASW5wdXQoKVxuICBhZGRyZXNzOiBQbGFjZVJlc3VsdCB8IHN0cmluZztcblxuICBASW5wdXQoKVxuICBjb3VudHJ5OiBzdHJpbmcgfCBzdHJpbmdbXTtcblxuICBASW5wdXQoKVxuICBwbGFjZUlkT25seT86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgc3RyaWN0Qm91bmRzPzogYm9vbGVhbjtcblxuICBASW5wdXQoKVxuICB0eXBlcz86IHN0cmluZ1tdO1xuICAvLyB0eXBlczogc3RyaW5nW10gPSBbJ2FkZHJlc3MnXTtcblxuICBASW5wdXQoKVxuICB0eXBlPzogc3RyaW5nO1xuXG4gIEBJbnB1dCgpXG4gIGF1dG9Db21wbGV0ZU9wdGlvbnM6IEF1dG9jb21wbGV0ZU9wdGlvbnMgPSB7fTtcblxuICBAT3V0cHV0KClcbiAgb25DaGFuZ2U6IEV2ZW50RW1pdHRlcjxQbGFjZVJlc3VsdCB8IHN0cmluZyB8IG51bGw+ID0gbmV3IEV2ZW50RW1pdHRlcjxQbGFjZVJlc3VsdCB8IHN0cmluZyB8IG51bGw+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxQbGFjZVJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPFBsYWNlUmVzdWx0PigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkdlcm1hbkFkZHJlc3NNYXBwZWQ6IEV2ZW50RW1pdHRlcjxHZXJtYW5BZGRyZXNzPiA9IG5ldyBFdmVudEVtaXR0ZXI8R2VybWFuQWRkcmVzcz4oKTtcblxuICBAT3V0cHV0KClcbiAgb25Mb2NhdGlvblNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8TG9jYXRpb24+ID0gbmV3IEV2ZW50RW1pdHRlcjxMb2NhdGlvbj4oKTtcblxuXG4gIHByaXZhdGUgb25OZXdQbGFjZVJlc3VsdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIHByaXZhdGUgYWRkcmVzc1ZhbGlkYXRvcjogTWF0VmFsaWRhdGVBZGRyZXNzRGlyZWN0aXZlID0gbmV3IE1hdFZhbGlkYXRlQWRkcmVzc0RpcmVjdGl2ZSgpO1xuXG4gIHB1YmxpYyBhZGRyZXNzU2VhcmNoQ29udHJvbDogRm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woe3ZhbHVlOiBudWxsfSwgVmFsaWRhdG9ycy5jb21wb3NlKFtcbiAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLFxuICAgIHRoaXMuYWRkcmVzc1ZhbGlkYXRvci52YWxpZGF0ZSgpXSlcbiAgKTtcblxuICBwcm9wYWdhdGVDaGFuZ2UgPSAoXzogYW55KSA9PiB7XG4gIH07XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBtYXBzQVBJTG9hZGVyOiBNYXBzQVBJTG9hZGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIG5nWm9uZTogTmdab25lKSB7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZHJlc3NWYWxpZGF0b3Iuc3Vic2NyaWJlKHRoaXMub25OZXdQbGFjZVJlc3VsdCk7XG5cbiAgICBjb25zdCBvcHRpb25zOiBBdXRvY29tcGxldGVPcHRpb25zID0ge1xuICAgICAgLy8gdHlwZXM6IFsnYWRkcmVzcyddLFxuICAgICAgLy8gY29tcG9uZW50UmVzdHJpY3Rpb25zOiB7Y291bnRyeTogdGhpcy5jb3VudHJ5fSxcbiAgICAgIHBsYWNlSWRPbmx5OiB0aGlzLnBsYWNlSWRPbmx5LFxuICAgICAgc3RyaWN0Qm91bmRzOiB0aGlzLnN0cmljdEJvdW5kcyxcbiAgICAgIC8vIHR5cGVzOiB0aGlzLnR5cGVzLFxuICAgICAgdHlwZTogdGhpcy50eXBlXG4gICAgfTtcblxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgIHRoaXMuY291bnRyeSA/IG9wdGlvbnMuY29tcG9uZW50UmVzdHJpY3Rpb25zID0ge2NvdW50cnk6IHRoaXMuY291bnRyeX0gOiBudWxsO1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgIHRoaXMuY291bnRyeSA/IG9wdGlvbnMudHlwZXMgPSB0aGlzLnR5cGVzIDogbnVsbDtcblxuICAgIHRoaXMuYXV0b0NvbXBsZXRlT3B0aW9ucyA9IE9iamVjdC5hc3NpZ24odGhpcy5hdXRvQ29tcGxldGVPcHRpb25zLCBvcHRpb25zKTtcbiAgICB0aGlzLmluaXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlKCk7XG4gIH1cblxuICBwdWJsaWMgaW5pdEdvb2dsZU1hcHNBdXRvY29tcGxldGUoKSB7XG4gICAgdGhpcy5tYXBzQVBJTG9hZGVyXG4gICAgICAubG9hZCgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZSA9IG5ldyBnb29nbGUubWFwcy5wbGFjZXMuQXV0b2NvbXBsZXRlKHRoaXMuc2VhcmNoRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLmF1dG9Db21wbGV0ZU9wdGlvbnMpO1xuICAgICAgICBhdXRvY29tcGxldGUuYWRkTGlzdGVuZXIoJ3BsYWNlX2NoYW5nZWQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIC8vIGdldCB0aGUgcGxhY2UgcmVzdWx0XG4gICAgICAgICAgICBjb25zdCBwbGFjZTogUGxhY2VSZXN1bHQgPSBhdXRvY29tcGxldGUuZ2V0UGxhY2UoKTtcblxuICAgICAgICAgICAgY29uc3QgZ2VybWFuQWRkcmVzczogR2VybWFuQWRkcmVzcyA9IHtcbiAgICAgICAgICAgICAgZ21JRDogcGxhY2UuaWQsXG4gICAgICAgICAgICAgIGljb246IHBsYWNlLmljb24sXG4gICAgICAgICAgICAgIHVybDogcGxhY2UudXJsLFxuICAgICAgICAgICAgICBwbGFjZUlEOiBwbGFjZS5wbGFjZV9pZCxcbiAgICAgICAgICAgICAgZGlzcGxheUFkZHJlc3M6IHBsYWNlLmZvcm1hdHRlZF9hZGRyZXNzLFxuICAgICAgICAgICAgICBuYW1lOiBwbGFjZS5uYW1lLFxuICAgICAgICAgICAgICB2aWNpbml0eTogcGxhY2UudmljaW5pdHksXG4gICAgICAgICAgICAgIGxvY2FsaXR5OiB7fSxcbiAgICAgICAgICAgICAgc3RhdGU6IHt9LFxuICAgICAgICAgICAgICBjb3VudHJ5OiB7fSxcbiAgICAgICAgICAgICAgZ2VvTG9jYXRpb246IHtsYXRpdHVkZTogLTEsIGxvbmdpdHVkZTogLTF9LFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKHBsYWNlLmdlb21ldHJ5ICYmIHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uKSB7XG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MuZ2VvTG9jYXRpb24ubGF0aXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sYXQoKTtcbiAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5nZW9Mb2NhdGlvbi5sb25naXR1ZGUgPSBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcGxhY2UuYWRkcmVzc19jb21wb25lbnRzLmZvckVhY2godmFsdWUgPT4ge1xuICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3RyZWV0X251bWJlcicpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLnN0cmVldE51bWJlciA9IHZhbHVlLnNob3J0X25hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3JvdXRlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RyZWV0TmFtZSA9IHZhbHVlLmxvbmdfbmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZigncG9zdGFsX2NvZGUnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5wb3N0YWxDb2RlID0gTnVtYmVyKHZhbHVlLnNob3J0X25hbWUpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdzdWJsb2NhbGl0eScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLnN1YmxvY2FsaXR5ID0gdmFsdWUubG9uZ19uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdsb2NhbGl0eScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmxvY2FsaXR5LmxvbmcgPSB2YWx1ZS5sb25nX25hbWU7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eS5zaG9ydCA9IHZhbHVlLnNob3J0X25hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLnN0YXRlLmxvbmcgPSB2YWx1ZS5sb25nX25hbWU7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdGF0ZS5zaG9ydCA9IHZhbHVlLnNob3J0X25hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2NvdW50cnknKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5LmxvbmcgPSB2YWx1ZS5sb25nX25hbWU7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5jb3VudHJ5LnNob3J0ID0gdmFsdWUuc2hvcnRfbmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignYWRtaW5pc3RyYXRpdmVfYXJlYV9sZXZlbF8zJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MubG9jYWxpdHkuc2hvcnQgPSB2YWx1ZS5zaG9ydF9uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5vbkdlcm1hbkFkZHJlc3NNYXBwZWQuZW1pdChnZXJtYW5BZGRyZXNzKTtcblxuICAgICAgICAgICAgaWYgKCFwbGFjZS5wbGFjZV9pZCB8fCBwbGFjZS5nZW9tZXRyeSA9PT0gdW5kZWZpbmVkIHx8IHBsYWNlLmdlb21ldHJ5ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIC8vIHBsYWNlIHJlc3VsdCBpcyBub3QgdmFsaWRcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gc2hvdyBkaWFsb2cgdG8gc2VsZWN0IGEgYWRkcmVzcyBmcm9tIHRoZSBpbnB1dFxuICAgICAgICAgICAgICAvLyBlbWl0IGZhaWxlZCBldmVudFxuICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gcGxhY2U7XG4gICAgICAgICAgICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlKHRoaXMudmFsdWUpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmFkZHJlc3MgPSBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcztcbiAgICAgICAgICAgIHRoaXMub25BdXRvY29tcGxldGVTZWxlY3RlZC5lbWl0KHBsYWNlKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdvbkF1dG9jb21wbGV0ZVNlbGVjdGVkIC0+ICcsIHBsYWNlKTtcbiAgICAgICAgICAgIHRoaXMub25Mb2NhdGlvblNlbGVjdGVkLmVtaXQoXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBsYXRpdHVkZTogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCksXG4gICAgICAgICAgICAgICAgbG9uZ2l0dWRlOiBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbi5sbmcoKVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKChlcnIpID0+IGNvbnNvbGUubG9nKGVycikpO1xuICB9XG5cbiAgcHVibGljIG9uUXVlcnkoZXZlbnQ6IGFueSkge1xuICAgIC8vIGNvbnNvbGUubG9nKCdvbkNoYW5nZSgpJywgZXZlbnQpO1xuICAgIHRoaXMub25DaGFuZ2UuZW1pdCh0aGlzLmFkZHJlc3MpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEFkZHJlc3MoKSB7XG4gICAgdGhpcy5hZGRyZXNzID0gbnVsbDtcbiAgICB0aGlzLmFkZHJlc3NTZWFyY2hDb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUob2JqOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAob2JqKSB7XG4gICAgICB0aGlzLnZhbHVlID0gb2JqO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNZXRob2Qgbm90IGltcGxlbWVudGVkLicpO1xuICB9XG5cbiAgc2V0RGlzYWJsZWRTdGF0ZT8oaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG59XG4iXX0=