@rishovt/angular-nepali-datepicker
Version:
A lightweight Angular wrapper and fully customizable, non-typeable Nepali datepicker component for Angular with support for Unicode-rendered Nepali dates, BS↔AD conversion, and flexible date formats. Ideal for forms requiring calendar-based input with nat
161 lines • 21.5 kB
JavaScript
import { Component, Input, Output, EventEmitter, forwardRef, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { RtcNepaliDatepickerService } from './angular-nepali-datepicker.service';
export class RtcNepaliDatepickerComponent {
constructor(service) {
this.service = service;
this.options = {};
this.dateChange = new EventEmitter();
this.pickerId = 'angular-nepali-datepicker-default';
this.disabled = false;
this.onChange = () => { };
this.onTouched = () => { };
this.todayDate = { year: 0, month: 0, day: 0, value: '' };
}
ngOnInit() {
this.service.BSGetCurrentDate().then(currentDate => {
this.todayDate = currentDate;
this.defaultOptions = {
classes: 'form-control',
placeholder: 'Select Nepali Date',
dateFormat: 'YYYY-MM-DD',
closeOnDateSelect: true,
minDate: { year: 1800, month: 1, day: 1 },
maxDate: currentDate,
disabled: false,
unicodeDate: true,
language: 'nepali',
};
});
}
onKeyDown(event) {
event.preventDefault();
return false;
}
ngAfterViewInit() {
this.service.loadLibrary().then(() => {
this.service.BSGetCurrentDate().then(currentDate => {
this.todayDate = Object.assign(Object.assign({}, currentDate), { value: this.service.formatDate(currentDate, this.options.dateFormat || 'YYYY-MM-DD') });
this.defaultOptions = {
classes: 'form-control',
placeholder: 'Select Nepali Date',
dateFormat: 'YYYY-MM-DD',
closeOnDateSelect: true,
minDate: { year: 1800, month: 1, day: 1 },
maxDate: currentDate,
disabled: false,
unicodeDate: true,
language: 'nepali',
tooltip: 'Select Date'
};
this.initializeDatePicker();
this.service.registerComponent(this.pickerId, this);
});
}).catch((error) => {
console.error('Failed to load Nepali Date Picker library:', error);
});
}
initializeDatePicker() {
const input = this.inputElementRef.nativeElement;
if (!input || typeof input.NepaliDatePicker !== 'function') {
console.error('Nepali Date Picker is not loaded. Make sure the assets is included in consumer angular.json.');
return;
}
const config = Object.assign(Object.assign(Object.assign({}, this.defaultOptions), this.options), { onSelect: (bsDate) => {
this.dateChange.emit(bsDate);
input.dispatchEvent(new Event('change'));
} });
input.NepaliDatePicker(config);
}
setDate(bsDate) {
const input = this.inputElementRef.nativeElement;
if (!input || typeof input.NepaliDatePicker !== 'function')
return;
try {
input.NepaliDatePicker('destroy');
const updatedOptions = Object.assign(Object.assign(Object.assign({}, this.defaultOptions), this.options), { value: bsDate, onSelect: (selectedDate) => {
this.dateChange.emit(selectedDate);
input.dispatchEvent(new Event('change'));
} });
const setValueAndInit = (displayValue) => {
input.NepaliDatePicker(updatedOptions);
input.value = displayValue;
};
if (updatedOptions.unicodeDate) {
const convertFullString = (str) => {
return Promise.all(str.split('').map(d => this.service.ConvertToUnicode(+d)))
.then(digits => digits.join(''));
};
const [year, month, day] = bsDate.split('-');
Promise.all([
convertFullString(year),
convertFullString(month),
convertFullString(day)
]).then(([unicodeYear, unicodeMonth, unicodeDay]) => {
setValueAndInit(`${unicodeYear}-${unicodeMonth}-${unicodeDay}`);
});
}
else {
setValueAndInit(bsDate);
}
}
catch (err) {
console.warn('Failed to set date via NepaliDatePicker:', err);
}
}
writeValue(value) {
this.value = value;
if (value)
this.service.setDate(this.pickerId, value);
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
ngOnDestroy() {
this.service.unregisterComponent(this.pickerId);
const input = this.inputElementRef.nativeElement;
if (input && typeof input.NepaliDatePicker === 'function') {
input.NepaliDatePicker('destroy');
}
}
}
RtcNepaliDatepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'rtc-nepali-datepicker',
template: `
<input
#nepaliInput
type="text"
[id]="pickerId"
[class]="options.classes || 'form-control'"
[placeholder]="options.placeholder || 'Select Nepali Date'"
[disabled]="options.disabled || false"
(keydown)="onKeyDown($event)"
/>
`,
providers: [
{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => RtcNepaliDatepickerComponent),
multi: true
}
]
},] }
];
RtcNepaliDatepickerComponent.ctorParameters = () => [
{ type: RtcNepaliDatepickerService }
];
RtcNepaliDatepickerComponent.propDecorators = {
options: [{ type: Input }],
dateChange: [{ type: Output }],
value: [{ type: Input }],
pickerId: [{ type: Input }],
inputElementRef: [{ type: ViewChild, args: ['nepaliInput', { static: true },] }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1uZXBhbGktZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLW5lcGFsaS1kYXRlcGlja2VyLXZlL3NyYy9saWIvYW5ndWxhci1uZXBhbGktZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBeUIsVUFBVSxFQUFFLFNBQVMsRUFBYyxNQUFNLGVBQWUsQ0FBQztBQUNqSSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQXdCakYsTUFBTSxPQUFPLDRCQUE0QjtJQXdCdkMsWUFBb0IsT0FBbUM7UUFBbkMsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUF2QjlDLFlBQU8sR0FXWixFQUFFLENBQUM7UUFFRyxlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV0QyxhQUFRLEdBQVcsbUNBQW1DLENBQUM7UUFDekQsYUFBUSxHQUFZLEtBQUssQ0FBQztRQUN6QixhQUFRLEdBQXlCLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUMzQyxjQUFTLEdBQWUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBSTFDLGNBQVMsR0FBZSxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNOLENBQUM7SUFFNUQsUUFBUTtRQUNOLElBQUksQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDakQsSUFBSSxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUM7WUFDN0Is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QWUsQ0FBQyxhQUFhLENBQUM7UUFDakQsSUFBSSxLQUFLLElBQUksT0FBTyxLQUFLLENBQUMsZ0JBQWdCLEtBQUssVUFBVSxFQUFFO1lBQ3pELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNuQztJQUNILENBQUM7OztZQS9LRixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtnQkFDakMsUUFBUSxFQUFFOzs7Ozs7Ozs7O0dBVVQ7Z0JBQ0QsU0FBUyxFQUFFO29CQUNUO3dCQUNFLE9BQU8sRUFBRSxpQkFBaUI7d0JBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsNEJBQTRCLENBQUM7d0JBQzNELEtBQUssRUFBRSxJQUFJO3FCQUNaO2lCQUNGO2FBQ0Y7OztZQXZCUSwwQkFBMEI7OztzQkF5QmhDLEtBQUs7eUJBYUwsTUFBTTtvQkFDTixLQUFLO3VCQUNMLEtBQUs7OEJBS0wsU0FBUyxTQUFDLGFBQWEsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0LCBmb3J3YXJkUmVmLCBWaWV3Q2hpbGQsIEVsZW1lbnRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFJ0Y05lcGFsaURhdGVwaWNrZXJTZXJ2aWNlIH0gZnJvbSAnLi9hbmd1bGFyLW5lcGFsaS1kYXRlcGlja2VyLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBEYXRlT2JqZWN0IH0gZnJvbSAnLi90eXBlcyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ3J0Yy1uZXBhbGktZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxpbnB1dFxyXG4gICAgICAjbmVwYWxpSW5wdXRcclxuICAgICAgdHlwZT1cInRleHRcIlxyXG4gICAgICBbaWRdPVwicGlja2VySWRcIlxyXG4gICAgICBbY2xhc3NdPVwib3B0aW9ucy5jbGFzc2VzIHx8ICdmb3JtLWNvbnRyb2wnXCJcclxuICAgICAgW3BsYWNlaG9sZGVyXT1cIm9wdGlvbnMucGxhY2Vob2xkZXIgfHwgJ1NlbGVjdCBOZXBhbGkgRGF0ZSdcIlxyXG4gICAgICBbZGlzYWJsZWRdPVwib3B0aW9ucy5kaXNhYmxlZCB8fCBmYWxzZVwiXHJcbiAgICAgIChrZXlkb3duKT1cIm9uS2V5RG93bigkZXZlbnQpXCJcclxuICAgIC8+XHJcbiAgYCxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFJ0Y05lcGFsaURhdGVwaWNrZXJDb21wb25lbnQpLFxyXG4gICAgICBtdWx0aTogdHJ1ZVxyXG4gICAgfVxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFJ0Y05lcGFsaURhdGVwaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG9wdGlvbnM6IHtcclxuICAgIGNsYXNzZXM/OiBzdHJpbmc7XHJcbiAgICBwbGFjZWhvbGRlcj86IHN0cmluZztcclxuICAgIGRhdGVGb3JtYXQ/OiBzdHJpbmc7XHJcbiAgICBjbG9zZU9uRGF0ZVNlbGVjdD86IGJvb2xlYW47XHJcbiAgICBtaW5EYXRlPzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IGRheTogbnVtYmVyIH07XHJcbiAgICBtYXhEYXRlPzogeyB5ZWFyOiBudW1iZXI7IG1vbnRoOiBudW1iZXI7IGRheTogbnVtYmVyIH07XHJcbiAgICBkaXNhYmxlZD86IGJvb2xlYW47XHJcbiAgICB1bmljb2RlRGF0ZT86IGJvb2xlYW47XHJcbiAgICBsYW5ndWFnZT86IHN0cmluZztcclxuICAgIG9uU2VsZWN0PzogKGRhdGU6IGFueSkgPT4gdm9pZDtcclxuICB9ID0ge307XHJcblxyXG4gIEBPdXRwdXQoKSBkYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcbiAgQElucHV0KCkgdmFsdWU6IGFueTtcclxuICBASW5wdXQoKSBwaWNrZXJJZDogc3RyaW5nID0gJ2FuZ3VsYXItbmVwYWxpLWRhdGVwaWNrZXItZGVmYXVsdCc7XHJcbiAgcHVibGljIGRpc2FibGVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZTogKHZhbHVlOiBhbnkpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQ6ICgpID0+IHZvaWQgPSAoKSA9PiB7IH07XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ25lcGFsaUlucHV0JywgeyBzdGF0aWM6IHRydWUgfSkgaW5wdXRFbGVtZW50UmVmITogRWxlbWVudFJlZjtcclxuICBkZWZhdWx0T3B0aW9uczogYW55O1xyXG4gIHRvZGF5RGF0ZTogRGF0ZU9iamVjdCA9IHsgeWVhcjogMCwgbW9udGg6IDAsIGRheTogMCwgdmFsdWU6ICcnIH07XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBzZXJ2aWNlOiBSdGNOZXBhbGlEYXRlcGlja2VyU2VydmljZSkgeyB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5zZXJ2aWNlLkJTR2V0Q3VycmVudERhdGUoKS50aGVuKGN1cnJlbnREYXRlID0+IHtcclxuICAgICAgdGhpcy50b2RheURhdGUgPSBjdXJyZW50RGF0ZTtcclxuICAgICAgdGhpcy5kZWZhdWx0T3B0aW9ucyA9IHtcclxuICAgICAgICBjbGFzc2VzOiAnZm9ybS1jb250cm9sJyxcclxuICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBOZXBhbGkgRGF0ZScsXHJcbiAgICAgICAgZGF0ZUZvcm1hdDogJ1lZWVktTU0tREQnLFxyXG4gICAgICAgIGNsb3NlT25EYXRlU2VsZWN0OiB0cnVlLFxyXG4gICAgICAgIG1pbkRhdGU6IHsgeWVhcjogMTgwMCwgbW9udGg6IDEsIGRheTogMSB9LFxyXG4gICAgICAgIG1heERhdGU6IGN1cnJlbnREYXRlLFxyXG4gICAgICAgIGRpc2FibGVkOiBmYWxzZSxcclxuICAgICAgICB1bmljb2RlRGF0ZTogdHJ1ZSxcclxuICAgICAgICBsYW5ndWFnZTogJ25lcGFsaScsXHJcbiAgICAgIH07XHJcbiAgICB9KVxyXG4gIH1cclxuXHJcbiAgb25LZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogYm9vbGVhbiB7XHJcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UubG9hZExpYnJhcnkoKS50aGVuKCgpID0+IHtcclxuICAgICAgdGhpcy5zZXJ2aWNlLkJTR2V0Q3VycmVudERhdGUoKS50aGVuKGN1cnJlbnREYXRlID0+IHtcclxuICAgICAgICB0aGlzLnRvZGF5RGF0ZSA9IHtcclxuICAgICAgICAgIC4uLmN1cnJlbnREYXRlLFxyXG4gICAgICAgICAgdmFsdWU6IHRoaXMuc2VydmljZS5mb3JtYXREYXRlKGN1cnJlbnREYXRlLCB0aGlzLm9wdGlvbnMuZGF0ZUZvcm1hdCB8fCAnWVlZWS1NTS1ERCcpXHJcbiAgICAgICAgfTtcclxuICAgICAgICB0aGlzLmRlZmF1bHRPcHRpb25zID0ge1xyXG4gICAgICAgICAgY2xhc3NlczogJ2Zvcm0tY29udHJvbCcsXHJcbiAgICAgICAgICBwbGFjZWhvbGRlcjogJ1NlbGVjdCBOZXBhbGkgRGF0ZScsXHJcbiAgICAgICAgICBkYXRlRm9ybWF0OiAnWVlZWS1NTS1ERCcsXHJcbiAgICAgICAgICBjbG9zZU9uRGF0ZVNlbGVjdDogdHJ1ZSxcclxuICAgICAgICAgIG1pbkRhdGU6IHsgeWVhcjogMTgwMCwgbW9udGg6IDEsIGRheTogMSB9LFxyXG4gICAgICAgICAgbWF4RGF0ZTogY3VycmVudERhdGUsXHJcbiAgICAgICAgICBkaXNhYmxlZDogZmFsc2UsXHJcbiAgICAgICAgICB1bmljb2RlRGF0ZTogdHJ1ZSxcclxuICAgICAgICAgIGxhbmd1YWdlOiAnbmVwYWxpJyxcclxuICAgICAgICAgIHRvb2x0aXA6ICdTZWxlY3QgRGF0ZSdcclxuICAgICAgICB9O1xyXG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZURhdGVQaWNrZXIoKTtcclxuICAgICAgICB0aGlzLnNlcnZpY2UucmVnaXN0ZXJDb21wb25lbnQodGhpcy5waWNrZXJJZCwgdGhpcyk7XHJcbiAgICAgIH0pXHJcbiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgTmVwYWxpIERhdGUgUGlja2VyIGxpYnJhcnk6JywgZXJyb3IpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGluaXRpYWxpemVEYXRlUGlja2VyKCk6IHZvaWQge1xyXG4gICAgY29uc3QgaW5wdXQgPSB0aGlzLmlucHV0RWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xyXG4gICAgaWYgKCFpbnB1dCB8fCB0eXBlb2YgaW5wdXQuTmVwYWxpRGF0ZVBpY2tlciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBjb25zb2xlLmVycm9yKCdOZXBhbGkgRGF0ZSBQaWNrZXIgaXMgbm90IGxvYWRlZC4gTWFrZSBzdXJlIHRoZSBhc3NldHMgaXMgaW5jbHVkZWQgaW4gY29uc3VtZXIgYW5ndWxhci5qc29uLicpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcbiAgICBjb25zdCBjb25maWcgPSB7XHJcbiAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgIC4uLnRoaXMub3B0aW9ucyxcclxuICAgICAgb25TZWxlY3Q6IChic0RhdGU6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuZGF0ZUNoYW5nZS5lbWl0KGJzRGF0ZSk7XHJcbiAgICAgICAgaW5wdXQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoJ2NoYW5nZScpKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIGlucHV0Lk5lcGFsaURhdGVQaWNrZXIoY29uZmlnKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXREYXRlKGJzRGF0ZTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHRoaXMuaW5wdXRFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XHJcbiAgICBpZiAoIWlucHV0IHx8IHR5cGVvZiBpbnB1dC5OZXBhbGlEYXRlUGlja2VyICE9PSAnZnVuY3Rpb24nKSByZXR1cm47XHJcbiAgICB0cnkge1xyXG4gICAgICBpbnB1dC5OZXBhbGlEYXRlUGlja2VyKCdkZXN0cm95Jyk7XHJcbiAgICAgIGNvbnN0IHVwZGF0ZWRPcHRpb25zID0ge1xyXG4gICAgICAgIC4uLnRoaXMuZGVmYXVsdE9wdGlvbnMsXHJcbiAgICAgICAgLi4udGhpcy5vcHRpb25zLFxyXG4gICAgICAgIHZhbHVlOiBic0RhdGUsXHJcbiAgICAgICAgb25TZWxlY3Q6IChzZWxlY3RlZERhdGU6IGFueSkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5kYXRlQ2hhbmdlLmVtaXQoc2VsZWN0ZWREYXRlKTtcclxuICAgICAgICAgIGlucHV0LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjaGFuZ2UnKSk7XHJcbiAgICAgICAgfSxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIGNvbnN0IHNldFZhbHVlQW5kSW5pdCA9IChkaXNwbGF5VmFsdWU6IHN0cmluZykgPT4ge1xyXG4gICAgICAgIGlucHV0Lk5lcGFsaURhdGVQaWNrZXIodXBkYXRlZE9wdGlvbnMpO1xyXG4gICAgICAgIGlucHV0LnZhbHVlID0gZGlzcGxheVZhbHVlO1xyXG4gICAgICB9O1xyXG4gICAgICBpZiAodXBkYXRlZE9wdGlvbnMudW5pY29kZURhdGUpIHtcclxuICAgICAgICBjb25zdCBjb252ZXJ0RnVsbFN0cmluZyA9IChzdHI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoc3RyLnNwbGl0KCcnKS5tYXAoZCA9PiB0aGlzLnNlcnZpY2UuQ29udmVydFRvVW5pY29kZSgrZCkpKVxyXG4gICAgICAgICAgICAudGhlbihkaWdpdHMgPT4gZGlnaXRzLmpvaW4oJycpKTtcclxuICAgICAgICB9O1xyXG4gICAgICAgIGNvbnN0IFt5ZWFyLCBtb250aCwgZGF5XSA9IGJzRGF0ZS5zcGxpdCgnLScpO1xyXG4gICAgICAgIFByb21pc2UuYWxsKFtcclxuICAgICAgICAgIGNvbnZlcnRGdWxsU3RyaW5nKHllYXIpLFxyXG4gICAgICAgICAgY29udmVydEZ1bGxTdHJpbmcobW9udGgpLFxyXG4gICAgICAgICAgY29udmVydEZ1bGxTdHJpbmcoZGF5KVxyXG4gICAgICAgIF0pLnRoZW4oKFt1bmljb2RlWWVhciwgdW5pY29kZU1vbnRoLCB1bmljb2RlRGF5XSkgPT4ge1xyXG4gICAgICAgICAgc2V0VmFsdWVBbmRJbml0KGAke3VuaWNvZGVZZWFyfS0ke3VuaWNvZGVNb250aH0tJHt1bmljb2RlRGF5fWApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHNldFZhbHVlQW5kSW5pdChic0RhdGUpO1xyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgY29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2V0IGRhdGUgdmlhIE5lcGFsaURhdGVQaWNrZXI6JywgZXJyKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB0aGlzLnNlcnZpY2Uuc2V0RGF0ZSh0aGlzLnBpY2tlcklkLCB2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlcnZpY2UudW5yZWdpc3RlckNvbXBvbmVudCh0aGlzLnBpY2tlcklkKTtcclxuICAgIGNvbnN0IGlucHV0ID0gdGhpcy5pbnB1dEVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIGlmIChpbnB1dCAmJiB0eXBlb2YgaW5wdXQuTmVwYWxpRGF0ZVBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICBpbnB1dC5OZXBhbGlEYXRlUGlja2VyKCdkZXN0cm95Jyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufSJdfQ==