@angular-material-extensions/google-maps-autocomplete
Version:
Autocomplete input component and directive for google-maps built with angular and material design
229 lines • 29.1 kB
JavaScript
var MatGoogleMapsAutocompleteComponent_1;
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 = {}));
let MatGoogleMapsAutocompleteComponent = MatGoogleMapsAutocompleteComponent_1 = class MatGoogleMapsAutocompleteComponent {
constructor(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 = (_) => {
};
}
ngOnInit() {
this.addressValidator.subscribe(this.onNewPlaceResult);
const 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();
}
initGoogleMapsAutocomplete() {
this.mapsAPILoader
.load()
.then(() => {
const autocomplete = new google.maps.places.Autocomplete(this.searchElementRef.nativeElement, this.autoCompleteOptions);
autocomplete.addListener('place_changed', () => {
this.ngZone.run(() => {
// get the place result
const place = autocomplete.getPlace();
const 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(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((err) => console.log(err));
}
onQuery(event) {
// console.log('onChange()', event);
this.onChange.emit(this.address);
}
resetAddress() {
this.address = null;
this.addressSearchControl.updateValueAndValidity();
}
writeValue(obj) {
if (obj) {
this.value = obj;
}
}
registerOnChange(fn) {
this.propagateChange = fn;
}
registerOnTouched(fn) {
throw new Error('Method not implemented.');
}
setDisabledState(isDisabled) {
throw new Error('Method not implemented.');
}
};
MatGoogleMapsAutocompleteComponent.ctorParameters = () => [
{ 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(() => MatGoogleMapsAutocompleteComponent_1),
multi: true
}
],
styles: [".full-width{width:100%}"]
})
], MatGoogleMapsAutocompleteComponent);
export { MatGoogleMapsAutocompleteComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYW5ndWxhci1tYXRlcmlhbC1leHRlbnNpb25zL2dvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnQvbWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEgsT0FBTyxFQUF1QixXQUFXLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDaEcsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN4QyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxpRUFBaUUsQ0FBQztBQU01RyxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLG1DQUFxQixDQUFBO0lBQ3JCLDJCQUFhLENBQUE7SUFDYixpQ0FBbUIsQ0FBQTtJQUNuQiwrQkFBaUIsQ0FBQTtBQUNuQixDQUFDLEVBTFcsVUFBVSxLQUFWLFVBQVUsUUFLckI7QUFlRCxJQUFhLGtDQUFrQywwQ0FBL0MsTUFBYSxrQ0FBa0M7SUFxRTdDLFlBQW9CLGFBQTRCLEVBQzVCLE1BQWM7UUFEZCxrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM1QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBaEVsQyxxQkFBZ0IsR0FBRyxTQUFTLENBQUM7UUFHN0Isb0JBQWUsR0FBRywwQkFBMEIsQ0FBQztRQUc3QyxzQkFBaUIsR0FBRyx5QkFBeUIsQ0FBQztRQUc5QyxxQkFBZ0IsR0FBRywwQkFBMEIsQ0FBQztRQUc5QyxlQUFV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Q0FBQztnQkFDakUsS0FBSyxFQUFFLElBQUk7YUFDWjtTQUNGOztLQUNGLENBQUM7R0FDVyxrQ0FBa0MsQ0E4TTlDO1NBOU1ZLGtDQUFrQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIElucHV0LCBOZ1pvbmUsIE9uSW5pdCwgT3V0cHV0LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybUNvbnRyb2wsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0b3JzfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQge01hcHNBUElMb2FkZXJ9IGZyb20gJ0BhZ20vY29yZSc7XG5pbXBvcnQge01hdFZhbGlkYXRlQWRkcmVzc0RpcmVjdGl2ZX0gZnJvbSAnLi4vZGlyZWN0aXZlcy9hZGRyZXNzLXZhbGlkYXRvci9tYXQtYWRkcmVzcy12YWxpZGF0b3IuZGlyZWN0aXZlJztcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJy4uL2ludGVyZmFjZXMvbG9jYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7R2VybWFuQWRkcmVzc30gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgUGxhY2VSZXN1bHQgPSBnb29nbGUubWFwcy5wbGFjZXMuUGxhY2VSZXN1bHQ7XG5pbXBvcnQgQXV0b2NvbXBsZXRlT3B0aW9ucyA9IGdvb2dsZS5tYXBzLnBsYWNlcy5BdXRvY29tcGxldGVPcHRpb25zO1xuXG5leHBvcnQgZW51bSBBcHBlYXJhbmNlIHtcbiAgU1RBTkRBUkQgPSAnc3RhbmRhcmQnLFxuICBGSUxMID0gJ2ZpbGwnLFxuICBPVVRMSU5FID0gJ291dGxpbmUnLFxuICBMRUdBQ1kgPSAnbGVnYWN5Jyxcbn1cblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZScsXG4gIGV4cG9ydEFzOiAnbWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9tYXQtZ29vZ2xlLW1hcHMtYXV0b2NvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vbWF0LWdvb2dsZS1tYXBzLWF1dG9jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFtcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1hdEdvb2dsZU1hcHNBdXRvY29tcGxldGVDb21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTWF0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuXG4gIEBWaWV3Q2hpbGQoJ3NlYXJjaCcpXG4gIHB1YmxpYyBzZWFyY2hFbGVtZW50UmVmOiBFbGVtZW50UmVmO1xuXG4gIEBJbnB1dCgpXG4gIGFkZHJlc3NMYWJlbFRleHQgPSAnQWRkcmVzcyc7XG5cbiAgQElucHV0KClcbiAgcGxhY2Vob2xkZXJUZXh0ID0gJ1BsZWFzZSBlbnRlciB0aGUgYWRkcmVzcyc7XG5cbiAgQElucHV0KClcbiAgcmVxdWlyZWRFcnJvclRleHQgPSAnVGhlIGFkZHJlc3MgaXMgcmVxdWlyZWQnO1xuXG4gIEBJbnB1dCgpXG4gIGludmFsaWRFcnJvclRleHQgPSAnVGhlIGFkZHJlc3MgaXMgbm90IHZhbGlkJztcblxuICBASW5wdXQoKVxuICBhcHBlYXJhbmNlOiBzdHJpbmcgfCBBcHBlYXJhbmNlID0gQXBwZWFyYW5jZS5TVEFOREFSRDtcblxuICBASW5wdXQoKVxuICB2YWx1ZTogUGxhY2VSZXN1bHQ7XG5cbiAgQElucHV0KClcbiAgYWRkcmVzczogUGxhY2VSZXN1bHQgfCBzdHJpbmc7XG5cbiAgQElucHV0KClcbiAgY291bnRyeTogc3RyaW5nIHwgc3RyaW5nW107XG5cbiAgQElucHV0KClcbiAgcGxhY2VJZE9ubHk/OiBib29sZWFuO1xuXG4gIEBJbnB1dCgpXG4gIHN0cmljdEJvdW5kcz86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgdHlwZXM/OiBzdHJpbmdbXTtcbiAgLy8gdHlwZXM6IHN0cmluZ1tdID0gWydhZGRyZXNzJ107XG5cbiAgQElucHV0KClcbiAgdHlwZT86IHN0cmluZztcblxuICBASW5wdXQoKVxuICBhdXRvQ29tcGxldGVPcHRpb25zOiBBdXRvY29tcGxldGVPcHRpb25zID0ge307XG5cbiAgQE91dHB1dCgpXG4gIG9uQ2hhbmdlOiBFdmVudEVtaXR0ZXI8UGxhY2VSZXN1bHQgfCBzdHJpbmcgfCBudWxsPiA9IG5ldyBFdmVudEVtaXR0ZXI8UGxhY2VSZXN1bHQgfCBzdHJpbmcgfCBudWxsPigpO1xuXG4gIEBPdXRwdXQoKVxuICBvbkF1dG9jb21wbGV0ZVNlbGVjdGVkOiBFdmVudEVtaXR0ZXI8UGxhY2VSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxQbGFjZVJlc3VsdD4oKTtcblxuICBAT3V0cHV0KClcbiAgb25HZXJtYW5BZGRyZXNzTWFwcGVkOiBFdmVudEVtaXR0ZXI8R2VybWFuQWRkcmVzcz4gPSBuZXcgRXZlbnRFbWl0dGVyPEdlcm1hbkFkZHJlc3M+KCk7XG5cbiAgQE91dHB1dCgpXG4gIG9uTG9jYXRpb25TZWxlY3RlZDogRXZlbnRFbWl0dGVyPExvY2F0aW9uPiA9IG5ldyBFdmVudEVtaXR0ZXI8TG9jYXRpb24+KCk7XG5cblxuICBwcml2YXRlIG9uTmV3UGxhY2VSZXN1bHQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBwcml2YXRlIGFkZHJlc3NWYWxpZGF0b3I6IE1hdFZhbGlkYXRlQWRkcmVzc0RpcmVjdGl2ZSA9IG5ldyBNYXRWYWxpZGF0ZUFkZHJlc3NEaXJlY3RpdmUoKTtcblxuICBwdWJsaWMgYWRkcmVzc1NlYXJjaENvbnRyb2w6IEZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHt2YWx1ZTogbnVsbH0sIFZhbGlkYXRvcnMuY29tcG9zZShbXG4gICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICB0aGlzLmFkZHJlc3NWYWxpZGF0b3IudmFsaWRhdGUoKV0pXG4gICk7XG5cbiAgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4ge1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgbWFwc0FQSUxvYWRlcjogTWFwc0FQSUxvYWRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5hZGRyZXNzVmFsaWRhdG9yLnN1YnNjcmliZSh0aGlzLm9uTmV3UGxhY2VSZXN1bHQpO1xuXG4gICAgY29uc3Qgb3B0aW9uczogQXV0b2NvbXBsZXRlT3B0aW9ucyA9IHtcbiAgICAgIC8vIHR5cGVzOiBbJ2FkZHJlc3MnXSxcbiAgICAgIC8vIGNvbXBvbmVudFJlc3RyaWN0aW9uczoge2NvdW50cnk6IHRoaXMuY291bnRyeX0sXG4gICAgICBwbGFjZUlkT25seTogdGhpcy5wbGFjZUlkT25seSxcbiAgICAgIHN0cmljdEJvdW5kczogdGhpcy5zdHJpY3RCb3VuZHMsXG4gICAgICAvLyB0eXBlczogdGhpcy50eXBlcyxcbiAgICAgIHR5cGU6IHRoaXMudHlwZVxuICAgIH07XG5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICB0aGlzLmNvdW50cnkgPyBvcHRpb25zLmNvbXBvbmVudFJlc3RyaWN0aW9ucyA9IHtjb3VudHJ5OiB0aGlzLmNvdW50cnl9IDogbnVsbDtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICB0aGlzLmNvdW50cnkgPyBvcHRpb25zLnR5cGVzID0gdGhpcy50eXBlcyA6IG51bGw7XG5cbiAgICB0aGlzLmF1dG9Db21wbGV0ZU9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHRoaXMuYXV0b0NvbXBsZXRlT3B0aW9ucywgb3B0aW9ucyk7XG4gICAgdGhpcy5pbml0R29vZ2xlTWFwc0F1dG9jb21wbGV0ZSgpO1xuICB9XG5cbiAgcHVibGljIGluaXRHb29nbGVNYXBzQXV0b2NvbXBsZXRlKCkge1xuICAgIHRoaXMubWFwc0FQSUxvYWRlclxuICAgICAgLmxvYWQoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBhdXRvY29tcGxldGUgPSBuZXcgZ29vZ2xlLm1hcHMucGxhY2VzLkF1dG9jb21wbGV0ZSh0aGlzLnNlYXJjaEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5hdXRvQ29tcGxldGVPcHRpb25zKTtcbiAgICAgICAgYXV0b2NvbXBsZXRlLmFkZExpc3RlbmVyKCdwbGFjZV9jaGFuZ2VkJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAvLyBnZXQgdGhlIHBsYWNlIHJlc3VsdFxuICAgICAgICAgICAgY29uc3QgcGxhY2U6IFBsYWNlUmVzdWx0ID0gYXV0b2NvbXBsZXRlLmdldFBsYWNlKCk7XG5cbiAgICAgICAgICAgIGNvbnN0IGdlcm1hbkFkZHJlc3M6IEdlcm1hbkFkZHJlc3MgPSB7XG4gICAgICAgICAgICAgIGdtSUQ6IHBsYWNlLmlkLFxuICAgICAgICAgICAgICBpY29uOiBwbGFjZS5pY29uLFxuICAgICAgICAgICAgICB1cmw6IHBsYWNlLnVybCxcbiAgICAgICAgICAgICAgcGxhY2VJRDogcGxhY2UucGxhY2VfaWQsXG4gICAgICAgICAgICAgIGRpc3BsYXlBZGRyZXNzOiBwbGFjZS5mb3JtYXR0ZWRfYWRkcmVzcyxcbiAgICAgICAgICAgICAgbmFtZTogcGxhY2UubmFtZSxcbiAgICAgICAgICAgICAgdmljaW5pdHk6IHBsYWNlLnZpY2luaXR5LFxuICAgICAgICAgICAgICBsb2NhbGl0eToge30sXG4gICAgICAgICAgICAgIHN0YXRlOiB7fSxcbiAgICAgICAgICAgICAgY291bnRyeToge30sXG4gICAgICAgICAgICAgIGdlb0xvY2F0aW9uOiB7bGF0aXR1ZGU6IC0xLCBsb25naXR1ZGU6IC0xfSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChwbGFjZS5nZW9tZXRyeSAmJiBwbGFjZS5nZW9tZXRyeS5sb2NhdGlvbikge1xuICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmdlb0xvY2F0aW9uLmxhdGl0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubGF0KCk7XG4gICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MuZ2VvTG9jYXRpb24ubG9uZ2l0dWRlID0gcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBsYWNlLmFkZHJlc3NfY29tcG9uZW50cy5mb3JFYWNoKHZhbHVlID0+IHtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3N0cmVldF9udW1iZXInKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdHJlZXROdW1iZXIgPSB2YWx1ZS5zaG9ydF9uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdyb3V0ZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLnN0cmVldE5hbWUgPSB2YWx1ZS5sb25nX25hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ3Bvc3RhbF9jb2RlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MucG9zdGFsQ29kZSA9IE51bWJlcih2YWx1ZS5zaG9ydF9uYW1lKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignc3VibG9jYWxpdHknKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdWJsb2NhbGl0eSA9IHZhbHVlLmxvbmdfbmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAodmFsdWUudHlwZXMuaW5kZXhPZignbG9jYWxpdHknKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5sb2NhbGl0eS5sb25nID0gdmFsdWUubG9uZ19uYW1lO1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MubG9jYWxpdHkuc2hvcnQgPSB2YWx1ZS5zaG9ydF9uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdhZG1pbmlzdHJhdGl2ZV9hcmVhX2xldmVsXzEnKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgZ2VybWFuQWRkcmVzcy5zdGF0ZS5sb25nID0gdmFsdWUubG9uZ19uYW1lO1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3Muc3RhdGUuc2hvcnQgPSB2YWx1ZS5zaG9ydF9uYW1lO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmICh2YWx1ZS50eXBlcy5pbmRleE9mKCdjb3VudHJ5JykgPiAtMSkge1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MuY291bnRyeS5sb25nID0gdmFsdWUubG9uZ19uYW1lO1xuICAgICAgICAgICAgICAgIGdlcm1hbkFkZHJlc3MuY291bnRyeS5zaG9ydCA9IHZhbHVlLnNob3J0X25hbWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHZhbHVlLnR5cGVzLmluZGV4T2YoJ2FkbWluaXN0cmF0aXZlX2FyZWFfbGV2ZWxfMycpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBnZXJtYW5BZGRyZXNzLmxvY2FsaXR5LnNob3J0ID0gdmFsdWUuc2hvcnRfbmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMub25HZXJtYW5BZGRyZXNzTWFwcGVkLmVtaXQoZ2VybWFuQWRkcmVzcyk7XG5cbiAgICAgICAgICAgIGlmICghcGxhY2UucGxhY2VfaWQgfHwgcGxhY2UuZ2VvbWV0cnkgPT09IHVuZGVmaW5lZCB8fCBwbGFjZS5nZW9tZXRyeSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAvLyBwbGFjZSByZXN1bHQgaXMgbm90IHZhbGlkXG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIHNob3cgZGlhbG9nIHRvIHNlbGVjdCBhIGFkZHJlc3MgZnJvbSB0aGUgaW5wdXRcbiAgICAgICAgICAgICAgLy8gZW1pdCBmYWlsZWQgZXZlbnRcbiAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHBsYWNlO1xuICAgICAgICAgICAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSh0aGlzLnZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5hZGRyZXNzID0gcGxhY2UuZm9ybWF0dGVkX2FkZHJlc3M7XG4gICAgICAgICAgICB0aGlzLm9uQXV0b2NvbXBsZXRlU2VsZWN0ZWQuZW1pdChwbGFjZSk7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnb25BdXRvY29tcGxldGVTZWxlY3RlZCAtPiAnLCBwbGFjZSk7XG4gICAgICAgICAgICB0aGlzLm9uTG9jYXRpb25TZWxlY3RlZC5lbWl0KFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGF0aXR1ZGU6IHBsYWNlLmdlb21ldHJ5LmxvY2F0aW9uLmxhdCgpLFxuICAgICAgICAgICAgICAgIGxvbmdpdHVkZTogcGxhY2UuZ2VvbWV0cnkubG9jYXRpb24ubG5nKClcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoZXJyKSA9PiBjb25zb2xlLmxvZyhlcnIpKTtcbiAgfVxuXG4gIHB1YmxpYyBvblF1ZXJ5KGV2ZW50OiBhbnkpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnb25DaGFuZ2UoKScsIGV2ZW50KTtcbiAgICB0aGlzLm9uQ2hhbmdlLmVtaXQodGhpcy5hZGRyZXNzKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRBZGRyZXNzKCkge1xuICAgIHRoaXMuYWRkcmVzcyA9IG51bGw7XG4gICAgdGhpcy5hZGRyZXNzU2VhcmNoQ29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XG4gICAgaWYgKG9iaikge1xuICAgICAgdGhpcy52YWx1ZSA9IG9iajtcbiAgICB9XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnByb3BhZ2F0ZUNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHNldERpc2FibGVkU3RhdGU/KGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxufVxuIl19