UNPKG

@firestitch/address

Version:
178 lines 26.4 kB
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, Optional, Output, ViewChild, inject } from '@angular/core'; import { ControlContainer, NgForm, NgModel, FormsModule } from '@angular/forms'; import { FsAutocompleteComponent, FsAutocompleteModule } from '@firestitch/autocomplete'; import { guid } from '@firestitch/common'; import { controlContainerFactory } from '@firestitch/core'; import { Subject, of } from 'rxjs'; import { map, takeUntil } from 'rxjs/operators'; import { Countries } from '../../consts'; import { Country } from '../../enums/country.enum'; import { FsFormModule } from '@firestitch/form'; import * as i0 from "@angular/core"; import * as i1 from "@firestitch/autocomplete"; import * as i2 from "@angular/forms"; import * as i3 from "@firestitch/form"; export class FsAddressRegionComponent { _cdRef = inject(ChangeDetectorRef); autocompleteModel; set region(regionCode) { const region = this.addressCountries .reduce((accum, addressCountry) => { return [ ...accum, ...(addressCountry.regions || []) .filter((addressRegion) => (addressRegion.code === regionCode && (!this.country || this.country === addressCountry.code))), ]; }, [])[0]; this.regionModel = (region ? region : (regionCode ? { name: regionCode } : null)); } get region() { return this.regionModel?.code; } disabled = false; country; label; required = false; regionCountryOrder = [Country.Canada, Country.UnitedStates]; set countries(countryCodes) { countryCodes = countryCodes || [Country.Canada, Country.UnitedStates]; this._countries = countryCodes .map((countryCode) => { return Countries.find((country) => country.code === countryCode); }); this.updateCountryRegionLabels(); } get addressCountries() { return this._countries; } regionChange = new EventEmitter(); regionModel; controlName = `region${guid('xxxxxx')}`; regionLabel; countryEnum = Country; _countries = []; _destroy$ = new Subject(); constructor() { this.countries = [Country.Canada, Country.UnitedStates]; } ngOnInit() { this.updateCountryRegionLabels(); this._listenControlStateChanges(); } clear() { this.regionModel = null; } ngOnDestroy() { this._destroy$.next(null); this._destroy$.complete(); } fetch = (keyword) => { keyword = keyword.toLowerCase(); return of(null) .pipe(map(() => { const regions = this._countries .reduce((accum, country) => { const countryRegions = (country.regions || []) .filter((region) => { const regionName = region.name.toLowerCase().trim(); return regionName.indexOf(keyword) !== -1; }); if (countryRegions.length) { console.log(country, keyword, countryRegions); } return [ ...accum, ...countryRegions .map((countryRegion) => { return { ...countryRegion, country: country.name, }; }), ]; }, []); console.log(regions, keyword); return regions; })); }; displayWith = (data) => { return data?.name; }; selectUserOption(keyword) { this.regionModel = { code: keyword, name: keyword, }; this.autocompleteModel.control.markAsDirty(); this.regionChange.emit(keyword); } regionChanged() { this.regionChange.emit(this.regionModel?.code); } justUseShow = (keyword) => { return !!keyword; }; updateCountryRegionLabels() { this.regionLabel = this.label ? this.label : Object.keys(this._countries .reduce((accum, country) => { return { ...accum, [country.regionLabel || 'Province']: true, }; }, {})) .join('/'); } // we need this to get updated ng-(invalid/dirty) classes _listenControlStateChanges() { this.autocompleteModel .control .statusChanges .pipe(takeUntil(this._destroy$)) .subscribe(() => { this._cdRef.markForCheck(); }); } static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAddressRegionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: FsAddressRegionComponent, isStandalone: true, selector: "fs-address-region", inputs: { region: "region", disabled: "disabled", country: "country", label: "label", required: "required", regionCountryOrder: "regionCountryOrder", countries: "countries" }, outputs: { regionChange: "regionChange" }, viewQueries: [{ propertyName: "autocompleteModel", first: true, predicate: FsAutocompleteComponent, descendants: true, read: NgModel, static: true }], ngImport: i0, template: "<fs-autocomplete\n [fetch]=\"fetch\"\n [displayWith]=\"displayWith\"\n [fetchOnFocus]=\"true\"\n [(ngModel)]=\"regionModel\"\n (ngModelChange)=\"regionChanged()\"\n [placeholder]=\"regionLabel\"\n [disabled]=\"disabled\"\n [fsFormRequired]=\"required\"\n [name]=\"controlName\">\n <ng-template\n fsAutocompleteTemplate\n let-data=\"data\">\n <span class=\"country-region\">\n <span>\n {{ data.name }}\n </span>\n @if (!regionModel && addressCountries.length > 1) {\n <span>\n {{ data.country }}\n </span>\n }\n </span>\n </ng-template>\n <ng-template\n fsAutocompleteStatic\n let-keyword\n (selected)=\"selectUserOption($event)\"\n [show]=\"justUseShow\">\n Just Use \"{{ keyword }}\"\n </ng-template>\n <ng-template fsAutocompleteNoResults></ng-template>\n</fs-autocomplete>", styles: ["@charset \"UTF-8\";.country-region{display:inline-flex}.country-region span:not(:last-child):after{content:\",\\a0\"}\n"], dependencies: [{ kind: "ngmodule", type: FsAutocompleteModule }, { kind: "component", type: i1.FsAutocompleteComponent, selector: "fs-autocomplete", inputs: ["fetch", "displayWith", "placeholder", "fetchOnFocus", "readonly", "required", "disabled", "formFieldClass", "appearance", "hint", "panelWidth", "panelClass", "showClear"], outputs: ["cleared", "opened", "closed"] }, { kind: "directive", type: i1.FsAutocompleteTemplateDirective, selector: "[fsAutocompleteTemplate]" }, { kind: "directive", type: i1.FsAutocompleteStaticDirective, selector: "[fsAutocompleteStatic],[fsAutocompleteStaticTemplate]", inputs: ["show", "disable"], outputs: ["selected"] }, { kind: "directive", type: i1.FsAutocompleteNoResultsDirective, selector: "[fsAutocompleteNoResults]", inputs: ["show"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormRequiredDirective, selector: "[fsFormRequired],[ngModel][required]", inputs: ["fsFormRequired", "required", "fsFormRequiredMessage"] }], viewProviders: [ { provide: ControlContainer, useFactory: controlContainerFactory, deps: [[new Optional(), NgForm]], }, ], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: FsAddressRegionComponent, decorators: [{ type: Component, args: [{ selector: 'fs-address-region', changeDetection: ChangeDetectionStrategy.OnPush, viewProviders: [ { provide: ControlContainer, useFactory: controlContainerFactory, deps: [[new Optional(), NgForm]], }, ], standalone: true, imports: [ FsAutocompleteModule, FormsModule, FsFormModule, ], template: "<fs-autocomplete\n [fetch]=\"fetch\"\n [displayWith]=\"displayWith\"\n [fetchOnFocus]=\"true\"\n [(ngModel)]=\"regionModel\"\n (ngModelChange)=\"regionChanged()\"\n [placeholder]=\"regionLabel\"\n [disabled]=\"disabled\"\n [fsFormRequired]=\"required\"\n [name]=\"controlName\">\n <ng-template\n fsAutocompleteTemplate\n let-data=\"data\">\n <span class=\"country-region\">\n <span>\n {{ data.name }}\n </span>\n @if (!regionModel && addressCountries.length > 1) {\n <span>\n {{ data.country }}\n </span>\n }\n </span>\n </ng-template>\n <ng-template\n fsAutocompleteStatic\n let-keyword\n (selected)=\"selectUserOption($event)\"\n [show]=\"justUseShow\">\n Just Use \"{{ keyword }}\"\n </ng-template>\n <ng-template fsAutocompleteNoResults></ng-template>\n</fs-autocomplete>", styles: ["@charset \"UTF-8\";.country-region{display:inline-flex}.country-region span:not(:last-child):after{content:\",\\a0\"}\n"] }] }], ctorParameters: () => [], propDecorators: { autocompleteModel: [{ type: ViewChild, args: [FsAutocompleteComponent, { read: NgModel, static: true }] }], region: [{ type: Input }], disabled: [{ type: Input }], country: [{ type: Input }], label: [{ type: Input }], required: [{ type: Input }], regionCountryOrder: [{ type: Input }], countries: [{ type: Input }], regionChange: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy1yZWdpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9jb21wb25lbnRzL2FkZHJlc3MtcmVnaW9uL2FkZHJlc3MtcmVnaW9uLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvY29tcG9uZW50cy9hZGRyZXNzLXJlZ2lvbi9hZGRyZXNzLXJlZ2lvbi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLFFBQVEsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuSyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUdoRixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0QsT0FBTyxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUVoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUduRCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7O0FBc0JoRCxNQUFNLE9BQU8sd0JBQXdCO0lBQzNCLE1BQU0sR0FBRyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUlwQyxpQkFBaUIsQ0FBVTtJQUVsQyxJQUFvQixNQUFNLENBQUMsVUFBa0I7UUFDM0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGdCQUFnQjthQUNqQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDaEMsT0FBTztnQkFDTCxHQUFHLEtBQUs7Z0JBQ1IsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO3FCQUM5QixNQUFNLENBQUMsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQ3pCLGFBQWEsQ0FBQyxJQUFJLEtBQUssVUFBVTtvQkFDakMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sS0FBSyxjQUFjLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FDekQ7YUFDSixDQUFDO1FBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRVosSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDcEYsQ0FBQztJQUVELElBQVcsTUFBTTtRQUNmLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUM7SUFDaEMsQ0FBQztJQUVlLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDakIsT0FBTyxDQUFtQjtJQUMxQixLQUFLLENBQUM7SUFDTixRQUFRLEdBQUcsS0FBSyxDQUFDO0lBQ2pCLGtCQUFrQixHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUUsSUFBb0IsU0FBUyxDQUFDLFlBQWtDO1FBQzlELFlBQVksR0FBRyxZQUFZLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVk7YUFDM0IsR0FBRyxDQUFDLENBQUMsV0FBbUIsRUFBRSxFQUFFO1lBQzNCLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQztRQUNuRSxDQUFDLENBQUMsQ0FBQztRQUVMLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxJQUFXLGdCQUFnQjtRQUN6QixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVnQixZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztJQUVwRCxXQUFXLENBQWlCO0lBQzVCLFdBQVcsR0FBRyxTQUFTLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO0lBQ3hDLFdBQVcsQ0FBUztJQUNwQixXQUFXLEdBQUcsT0FBTyxDQUFDO0lBRXJCLFVBQVUsR0FBc0IsRUFBRSxDQUFDO0lBQ25DLFNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0lBRXhDO1FBQ0UsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFTSxRQUFRO1FBQ2IsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLDBCQUEwQixFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztJQUMxQixDQUFDO0lBRU0sV0FBVztRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFTSxLQUFLLEdBQUcsQ0FBQyxPQUFlLEVBQUUsRUFBRTtRQUNqQyxPQUFPLEdBQUcsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRWhDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQzthQUNaLElBQUksQ0FDSCxHQUFHLENBQUMsR0FBRyxFQUFFO1lBQ1AsTUFBTSxPQUFPLEdBQXFCLElBQUksQ0FBQyxVQUFVO2lCQUM5QyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUU7Z0JBQ3pCLE1BQU0sY0FBYyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sSUFBSSxFQUFFLENBQUM7cUJBQzNDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO29CQUNqQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUVwRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLENBQUMsQ0FBQyxDQUFDO2dCQUVMLElBQUksY0FBYyxDQUFDLE1BQU0sRUFBRyxDQUFDO29CQUMzQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7Z0JBQ2hELENBQUM7Z0JBRUQsT0FBTztvQkFDTCxHQUFHLEtBQUs7b0JBQ1IsR0FBRyxjQUFjO3lCQUNkLEdBQUcsQ0FBQyxDQUFDLGFBQWEsRUFBRSxFQUFFO3dCQUNyQixPQUFPOzRCQUNMLEdBQUcsYUFBYTs0QkFDaEIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJO3lCQUN0QixDQUFDO29CQUNKLENBQUMsQ0FBQztpQkFDTCxDQUFDO1lBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFFOUIsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVLLFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzVCLE9BQU8sSUFBSSxFQUFFLElBQUksQ0FBQztJQUNwQixDQUFDLENBQUM7SUFFSyxnQkFBZ0IsQ0FBQyxPQUFPO1FBQzdCLElBQUksQ0FBQyxXQUFXLEdBQUc7WUFDakIsSUFBSSxFQUFFLE9BQU87WUFDYixJQUFJLEVBQUUsT0FBTztTQUNkLENBQUM7UUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTdDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxhQUFhO1FBQ2xCLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVNLFdBQVcsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQy9CLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQztJQUNuQixDQUFDLENBQUM7SUFFSyx5QkFBeUI7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0RCxJQUFJLENBQUMsVUFBVTthQUNaLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRTtZQUN6QixPQUFPO2dCQUNMLEdBQUcsS0FBSztnQkFDUixDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksVUFBVSxDQUFDLEVBQUUsSUFBSTthQUMxQyxDQUFDO1FBQ0osQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUNUO2FBQ0UsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2YsQ0FBQztJQUVELHlEQUF5RDtJQUNqRCwwQkFBMEI7UUFDaEMsSUFBSSxDQUFDLGlCQUFpQjthQUNuQixPQUFPO2FBQ1AsYUFBYTthQUNiLElBQUksQ0FDSCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUMxQjthQUNBLFNBQVMsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQzt1R0E5SlUsd0JBQXdCOzJGQUF4Qix3QkFBd0IsMlZBSXhCLHVCQUF1QiwyQkFBVSxPQUFPLDJDQ3pDckQsbzJCQWdDa0IsZ0xEQVYsb0JBQW9CLDR1QkFDcEIsV0FBVyw4VkFDWCxZQUFZLGdNQVhEO1lBQ1g7Z0JBQ0ksT0FBTyxFQUFFLGdCQUFnQjtnQkFDekIsVUFBVSxFQUFFLHVCQUF1QjtnQkFDbkMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO2FBQ25DO1NBQ0o7OzJGQVFRLHdCQUF3QjtrQkFuQnBDLFNBQVM7K0JBQ0ksbUJBQW1CLG1CQUdaLHVCQUF1QixDQUFDLE1BQU0saUJBQ2hDO3dCQUNYOzRCQUNJLE9BQU8sRUFBRSxnQkFBZ0I7NEJBQ3pCLFVBQVUsRUFBRSx1QkFBdUI7NEJBQ25DLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQzt5QkFDbkM7cUJBQ0osY0FDVyxJQUFJLFdBQ1A7d0JBQ0wsb0JBQW9CO3dCQUNwQixXQUFXO3dCQUNYLFlBQVk7cUJBQ2Y7d0RBT0ksaUJBQWlCO3NCQUR2QixTQUFTO3VCQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUcvQyxNQUFNO3NCQUF6QixLQUFLO2dCQW9CVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxRQUFRO3NCQUF2QixLQUFLO2dCQUNVLGtCQUFrQjtzQkFBakMsS0FBSztnQkFDYyxTQUFTO3NCQUE1QixLQUFLO2dCQWNXLFlBQVk7c0JBQTVCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE9wdGlvbmFsLCBPdXRwdXQsIFZpZXdDaGlsZCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sQ29udGFpbmVyLCBOZ0Zvcm0sIE5nTW9kZWwsIEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuXG5cbmltcG9ydCB7IEZzQXV0b2NvbXBsZXRlQ29tcG9uZW50LCBGc0F1dG9jb21wbGV0ZU1vZHVsZSB9IGZyb20gJ0BmaXJlc3RpdGNoL2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgeyBndWlkIH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29tbW9uJztcbmltcG9ydCB7IGNvbnRyb2xDb250YWluZXJGYWN0b3J5IH0gZnJvbSAnQGZpcmVzdGl0Y2gvY29yZSc7XG5cbmltcG9ydCB7IFN1YmplY3QsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBtYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgQ291bnRyaWVzIH0gZnJvbSAnLi4vLi4vY29uc3RzJztcbmltcG9ydCB7IENvdW50cnkgfSBmcm9tICcuLi8uLi9lbnVtcy9jb3VudHJ5LmVudW0nO1xuaW1wb3J0IHsgSUFkZHJlc3NDb3VudHJ5IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hZGRyZXNzLWNvdW50cnkuaW50ZXJmYWNlJztcbmltcG9ydCB7IElBZGRyZXNzUmVnaW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9hZGRyZXNzLXJlZ2lvbi5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRnNGb3JtTW9kdWxlIH0gZnJvbSAnQGZpcmVzdGl0Y2gvZm9ybSc7XG5cblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmcy1hZGRyZXNzLXJlZ2lvbicsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2FkZHJlc3MtcmVnaW9uLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9hZGRyZXNzLXJlZ2lvbi5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHZpZXdQcm92aWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lcixcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNvbnRyb2xDb250YWluZXJGYWN0b3J5LFxuICAgICAgICAgICAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgTmdGb3JtXV0sXG4gICAgICAgIH0sXG4gICAgXSxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtcbiAgICAgICAgRnNBdXRvY29tcGxldGVNb2R1bGUsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBGc0Zvcm1Nb2R1bGUsXG4gICAgXSxcbn0pXG5leHBvcnQgY2xhc3MgRnNBZGRyZXNzUmVnaW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIF9jZFJlZiA9IGluamVjdChDaGFuZ2VEZXRlY3RvclJlZik7XG5cblxuICBAVmlld0NoaWxkKEZzQXV0b2NvbXBsZXRlQ29tcG9uZW50LCB7IHJlYWQ6IE5nTW9kZWwsIHN0YXRpYzogdHJ1ZSB9KVxuICBwdWJsaWMgYXV0b2NvbXBsZXRlTW9kZWw6IE5nTW9kZWw7XG5cbiAgQElucHV0KCkgcHVibGljIHNldCByZWdpb24ocmVnaW9uQ29kZTogc3RyaW5nKSB7XG4gICAgY29uc3QgcmVnaW9uID0gdGhpcy5hZGRyZXNzQ291bnRyaWVzXG4gICAgICAucmVkdWNlKChhY2N1bSwgYWRkcmVzc0NvdW50cnkpID0+IHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAuLi4oYWRkcmVzc0NvdW50cnkucmVnaW9ucyB8fCBbXSlcbiAgICAgICAgICAgIC5maWx0ZXIoKGFkZHJlc3NSZWdpb24pID0+IChcbiAgICAgICAgICAgICAgYWRkcmVzc1JlZ2lvbi5jb2RlID09PSByZWdpb25Db2RlICYmXG4gICAgICAgICAgICAgICghdGhpcy5jb3VudHJ5IHx8IHRoaXMuY291bnRyeSA9PT0gYWRkcmVzc0NvdW50cnkuY29kZSkpLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgXTtcbiAgICAgIH0sIFtdKVswXTtcblxuICAgIHRoaXMucmVnaW9uTW9kZWwgPSAocmVnaW9uID8gcmVnaW9uIDogKHJlZ2lvbkNvZGUgPyB7IG5hbWU6IHJlZ2lvbkNvZGUgfSA6IG51bGwpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmVnaW9uKCkge1xuICAgIHJldHVybiB0aGlzLnJlZ2lvbk1vZGVsPy5jb2RlO1xuICB9XG5cbiAgQElucHV0KCkgcHVibGljIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBjb3VudHJ5OiBDb3VudHJ5IHwgc3RyaW5nO1xuICBASW5wdXQoKSBwdWJsaWMgbGFiZWw7XG4gIEBJbnB1dCgpIHB1YmxpYyByZXF1aXJlZCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgcmVnaW9uQ291bnRyeU9yZGVyID0gW0NvdW50cnkuQ2FuYWRhLCBDb3VudHJ5LlVuaXRlZFN0YXRlc107XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgY291bnRyaWVzKGNvdW50cnlDb2RlczogKHN0cmluZyB8IENvdW50cnkpW10pIHtcbiAgICBjb3VudHJ5Q29kZXMgPSBjb3VudHJ5Q29kZXMgfHwgW0NvdW50cnkuQ2FuYWRhLCBDb3VudHJ5LlVuaXRlZFN0YXRlc107XG4gICAgdGhpcy5fY291bnRyaWVzID0gY291bnRyeUNvZGVzXG4gICAgICAubWFwKChjb3VudHJ5Q29kZTogc3RyaW5nKSA9PiB7XG4gICAgICAgIHJldHVybiBDb3VudHJpZXMuZmluZCgoY291bnRyeSkgPT4gY291bnRyeS5jb2RlID09PSBjb3VudHJ5Q29kZSk7XG4gICAgICB9KTtcblxuICAgIHRoaXMudXBkYXRlQ291bnRyeVJlZ2lvbkxhYmVscygpO1xuICB9XG5cbiAgcHVibGljIGdldCBhZGRyZXNzQ291bnRyaWVzKCkge1xuICAgIHJldHVybiB0aGlzLl9jb3VudHJpZXM7XG4gIH1cblxuICBAT3V0cHV0KCkgcHVibGljIHJlZ2lvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHB1YmxpYyByZWdpb25Nb2RlbDogSUFkZHJlc3NSZWdpb247XG4gIHB1YmxpYyBjb250cm9sTmFtZSA9IGByZWdpb24ke2d1aWQoJ3h4eHh4eCcpfWA7XG4gIHB1YmxpYyByZWdpb25MYWJlbDogc3RyaW5nO1xuICBwdWJsaWMgY291bnRyeUVudW0gPSBDb3VudHJ5O1xuXG4gIHByaXZhdGUgX2NvdW50cmllczogSUFkZHJlc3NDb3VudHJ5W10gPSBbXTtcbiAgcHJpdmF0ZSBfZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuY291bnRyaWVzID0gW0NvdW50cnkuQ2FuYWRhLCBDb3VudHJ5LlVuaXRlZFN0YXRlc107XG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKSB7XG4gICAgdGhpcy51cGRhdGVDb3VudHJ5UmVnaW9uTGFiZWxzKCk7XG4gICAgdGhpcy5fbGlzdGVuQ29udHJvbFN0YXRlQ2hhbmdlcygpO1xuICB9XG5cbiAgcHVibGljIGNsZWFyKCkge1xuICAgIHRoaXMucmVnaW9uTW9kZWwgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuX2Rlc3Ryb3kkLm5leHQobnVsbCk7XG4gICAgdGhpcy5fZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBmZXRjaCA9IChrZXl3b3JkOiBzdHJpbmcpID0+IHtcbiAgICBrZXl3b3JkID0ga2V5d29yZC50b0xvd2VyQ2FzZSgpO1xuXG4gICAgcmV0dXJuIG9mKG51bGwpXG4gICAgICAucGlwZShcbiAgICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgICBjb25zdCByZWdpb25zOiBJQWRkcmVzc1JlZ2lvbltdID0gdGhpcy5fY291bnRyaWVzXG4gICAgICAgICAgICAucmVkdWNlKChhY2N1bSwgY291bnRyeSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb3VudHJ5UmVnaW9ucyA9IChjb3VudHJ5LnJlZ2lvbnMgfHwgW10pXG4gICAgICAgICAgICAgICAgLmZpbHRlcigocmVnaW9uKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCByZWdpb25OYW1lID0gcmVnaW9uLm5hbWUudG9Mb3dlckNhc2UoKS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgIHJldHVybiByZWdpb25OYW1lLmluZGV4T2Yoa2V5d29yZCkgIT09IC0xO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgIGlmIChjb3VudHJ5UmVnaW9ucy5sZW5ndGggKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coY291bnRyeSwga2V5d29yZCwgY291bnRyeVJlZ2lvbnMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgICAgICAuLi5jb3VudHJ5UmVnaW9uc1xuICAgICAgICAgICAgICAgICAgLm1hcCgoY291bnRyeVJlZ2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgIC4uLmNvdW50cnlSZWdpb24sXG4gICAgICAgICAgICAgICAgICAgICAgY291bnRyeTogY291bnRyeS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgY29uc29sZS5sb2cocmVnaW9ucywga2V5d29yZCk7XG5cbiAgICAgICAgICByZXR1cm4gcmVnaW9ucztcbiAgICAgICAgfSksXG4gICAgICApO1xuICB9O1xuXG4gIHB1YmxpYyBkaXNwbGF5V2l0aCA9IChkYXRhKSA9PiB7XG4gICAgcmV0dXJuIGRhdGE/Lm5hbWU7XG4gIH07XG5cbiAgcHVibGljIHNlbGVjdFVzZXJPcHRpb24oa2V5d29yZCkge1xuICAgIHRoaXMucmVnaW9uTW9kZWwgPSB7XG4gICAgICBjb2RlOiBrZXl3b3JkLFxuICAgICAgbmFtZToga2V5d29yZCxcbiAgICB9O1xuXG4gICAgdGhpcy5hdXRvY29tcGxldGVNb2RlbC5jb250cm9sLm1hcmtBc0RpcnR5KCk7XG5cbiAgICB0aGlzLnJlZ2lvbkNoYW5nZS5lbWl0KGtleXdvcmQpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lvbkNoYW5nZWQoKSB7XG4gICAgdGhpcy5yZWdpb25DaGFuZ2UuZW1pdCh0aGlzLnJlZ2lvbk1vZGVsPy5jb2RlKTtcbiAgfVxuXG4gIHB1YmxpYyBqdXN0VXNlU2hvdyA9IChrZXl3b3JkKSA9PiB7XG4gICAgcmV0dXJuICEha2V5d29yZDtcbiAgfTtcblxuICBwdWJsaWMgdXBkYXRlQ291bnRyeVJlZ2lvbkxhYmVscygpIHtcbiAgICB0aGlzLnJlZ2lvbkxhYmVsID0gdGhpcy5sYWJlbCA/IHRoaXMubGFiZWwgOiBPYmplY3Qua2V5cyhcbiAgICAgIHRoaXMuX2NvdW50cmllc1xuICAgICAgICAucmVkdWNlKChhY2N1bSwgY291bnRyeSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAuLi5hY2N1bSxcbiAgICAgICAgICAgIFtjb3VudHJ5LnJlZ2lvbkxhYmVsIHx8ICdQcm92aW5jZSddOiB0cnVlLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sIHt9KSxcbiAgICApXG4gICAgICAuam9pbignLycpO1xuICB9XG5cbiAgLy8gd2UgbmVlZCB0aGlzIHRvIGdldCB1cGRhdGVkIG5nLShpbnZhbGlkL2RpcnR5KSBjbGFzc2VzXG4gIHByaXZhdGUgX2xpc3RlbkNvbnRyb2xTdGF0ZUNoYW5nZXMoKTogdm9pZCB7XG4gICAgdGhpcy5hdXRvY29tcGxldGVNb2RlbFxuICAgICAgLmNvbnRyb2xcbiAgICAgIC5zdGF0dXNDaGFuZ2VzXG4gICAgICAucGlwZShcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLl9jZFJlZi5tYXJrRm9yQ2hlY2soKTtcbiAgICAgIH0pO1xuICB9XG5cbn1cbiIsIjxmcy1hdXRvY29tcGxldGVcbiAgW2ZldGNoXT1cImZldGNoXCJcbiAgW2Rpc3BsYXlXaXRoXT1cImRpc3BsYXlXaXRoXCJcbiAgW2ZldGNoT25Gb2N1c109XCJ0cnVlXCJcbiAgWyhuZ01vZGVsKV09XCJyZWdpb25Nb2RlbFwiXG4gIChuZ01vZGVsQ2hhbmdlKT1cInJlZ2lvbkNoYW5nZWQoKVwiXG4gIFtwbGFjZWhvbGRlcl09XCJyZWdpb25MYWJlbFwiXG4gIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gIFtmc0Zvcm1SZXF1aXJlZF09XCJyZXF1aXJlZFwiXG4gIFtuYW1lXT1cImNvbnRyb2xOYW1lXCI+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIGZzQXV0b2NvbXBsZXRlVGVtcGxhdGVcbiAgICBsZXQtZGF0YT1cImRhdGFcIj5cbiAgICA8c3BhbiBjbGFzcz1cImNvdW50cnktcmVnaW9uXCI+XG4gICAgICA8c3Bhbj5cbiAgICAgICAge3sgZGF0YS5uYW1lIH19XG4gICAgICA8L3NwYW4+XG4gICAgICBAaWYgKCFyZWdpb25Nb2RlbCAmJiBhZGRyZXNzQ291bnRyaWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgPHNwYW4+XG4gICAgICAgICAge3sgZGF0YS5jb3VudHJ5IH19XG4gICAgICAgIDwvc3Bhbj5cbiAgICAgIH1cbiAgICA8L3NwYW4+XG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZVxuICAgIGZzQXV0b2NvbXBsZXRlU3RhdGljXG4gICAgbGV0LWtleXdvcmRcbiAgICAoc2VsZWN0ZWQpPVwic2VsZWN0VXNlck9wdGlvbigkZXZlbnQpXCJcbiAgICBbc2hvd109XCJqdXN0VXNlU2hvd1wiPlxuICAgIEp1c3QgVXNlIFwie3sga2V5d29yZCB9fVwiXG4gIDwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSBmc0F1dG9jb21wbGV0ZU5vUmVzdWx0cz48L25nLXRlbXBsYXRlPlxuPC9mcy1hdXRvY29tcGxldGU+Il19