@hxui/angular
Version:
An Angular library based on the [HXUI design system](https://hxui.io).
170 lines • 28.7 kB
JavaScript
import { Component, EventEmitter, Input, Output, } from '@angular/core';
import { FormBuilder, Validators } from '@angular/forms';
import moment from 'moment';
import { Subscription } from 'rxjs';
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
export class DatepickerIntervalComponent {
constructor(_fb) {
this._fb = _fb;
this.durationOptions = ['day', 'week', 'month', 'year'];
this.duration = 'days';
this.increment = 0;
this.value$ = new Subscription();
this.update = new EventEmitter();
this.cancel = new EventEmitter();
}
ngOnInit() {
// date selected from interval
if (this.selectedInterval &&
this.selectedInterval.isSelectedFromInterval &&
this.selectedInterval.interval) {
const intervalArr = this.selectedInterval.interval.split(' ');
if (intervalArr && intervalArr.length > 1) {
this.increment = parseInt(intervalArr[0], 10);
this.duration = this.normaliseDurationString(intervalArr[1]);
}
// date is typed or calendar picker
}
else if (this.selectedDate) {
const selected = moment(this.selectedDate);
const today = moment().startOf('day');
const duration = 'days';
const daysBetween = selected.diff(today, duration);
if (daysBetween && daysBetween > 0) {
this.increment = daysBetween;
this.duration = duration;
}
}
this.onSelectoptions(this.increment, this.duration);
this.form = this._fb.group({
number: [this.increment, Validators.min(0)],
duration: [this.duration],
});
this.onValueChanges();
}
ngOnDestroy() {
this.value$.unsubscribe();
}
onValueChanges() {
this.value$ = this.form.valueChanges.subscribe(val => {
this.onSelectoptions(val.number, val.duration);
});
}
/** on cancel of interval form */
onCancel() {
this.cancel.emit();
}
onSelectoptions(numberValue, durationValue) {
this.text = moment().add(numberValue, durationValue);
this.dateLabel = this.text.format('ddd DD/MM/YYYY');
this._dueDatestring = this.text.format('YYYY-MM-DD');
}
/** on submission of interval form */
onChoose($event) {
$event.preventDefault();
// check form is valid
if (this.form.valid) {
const intervalSubmitted = this.form.value.number.toString() +
' ' +
this.normaliseDurationString(this.form.value.duration, 'optional');
const dateSubmitted = new Date(this._dueDatestring);
const result = {
interval: intervalSubmitted,
isSelectedFromInterval: true,
date: dateSubmitted,
};
// emit result
this.update.emit(result);
}
}
/** normalise duration string */
normaliseDurationString(duration, output = 'plural') {
const singular = this.durationOptions;
const plural = singular.map(val => val + 's');
const optional = singular.map(val => val + '(s)');
const current = currentFormat(duration);
let result = [`${output}`][0] || 'days';
if (output === 'singular') {
result = toSingular(duration);
}
else if (output === 'plural') {
result = toPlural(duration);
}
else if (output === 'optional') {
result = toOptional(duration);
}
return result;
function currentFormat(str) {
if (singular.includes(str)) {
return 'singular';
}
else if (plural.includes(str)) {
return 'plural';
}
else if (optional.includes(str)) {
return 'optional';
}
else {
return undefined;
}
}
function toSingular(str) {
let result = singular[0];
if (current === 'singular') {
result = str;
}
else if (current === 'plural') {
result = str.replace('s', '');
}
else if (current === 'optional') {
result = str.replace('(s)', '');
}
return result;
}
function toPlural(str) {
let result = plural[0];
if (current === 'singular') {
result = str + 's';
}
else if (current === 'plural') {
result = str;
}
else if (current === 'optional') {
result = str.replace('(s)', 's');
}
return result;
}
function toOptional(str) {
let result = optional[0];
if (current === 'singular') {
result = str + '(s)';
}
else if (current === 'plural') {
result = str.replace('s', '(s)');
}
else if (current === 'optional') {
result = str;
}
return result;
}
}
}
DatepickerIntervalComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerIntervalComponent, deps: [{ token: i1.FormBuilder }], target: i0.ɵɵFactoryTarget.Component });
DatepickerIntervalComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.11", type: DatepickerIntervalComponent, selector: "hxa-datepicker-interval", inputs: { selectedDate: "selectedDate", selectedInterval: "selectedInterval" }, outputs: { update: "update", cancel: "cancel" }, host: { classAttribute: "hx-card hxa-datepicker-interval" }, ngImport: i0, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onChoose($event)\">\r\n <section class=\"hxa-datepicker-interval__content\">\r\n <fieldset class=\"hxa-datepicker-interval__inputs\">\r\n <input\r\n type=\"number\"\r\n id=\"numberText\"\r\n class=\"hx-input\"\r\n formControlName=\"number\"\r\n min=\"0\"\r\n />\r\n\r\n <select id=\"durationText\" class=\"hx-input\" formControlName=\"duration\">\r\n <option *ngFor=\"let opt of durationOptions\" [value]=\"opt + 's'\">\r\n {{ opt + '(s)' }}\r\n </option>\r\n </select>\r\n\r\n <span>from today</span>\r\n </fieldset>\r\n\r\n <div class=\"hxa-datepicker-interval__output\">\r\n <span>will be </span>\r\n <span class=\"is-text-weight-bolder\">{{ dateLabel }}</span>\r\n </div>\r\n </section>\r\n\r\n <section class=\"hxa-datepicker-interval__footer\">\r\n <button class=\"hx-button\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"hx-button is-primary\">Select</button>\r\n </section>\r\n</form>\r\n", styles: [":host.hx-card{border:unset}:host.hx-card:hover,:host.hx-card.is-hovered{box-shadow:none}.hxa-datepicker-interval:host{display:flex;flex-direction:column;width:19rem;height:21rem}.hxa-datepicker-interval:host>form{display:flex;flex-direction:column;font-size:1rem;flex:1 1 auto}.hxa-datepicker-interval__content{display:flex;flex-direction:column;flex:1 1 auto;justify-content:center;padding:.75rem}.hxa-datepicker-interval__inputs{border:none;display:block;padding:0;margin:0 auto 1.25rem}.hxa-datepicker-interval__inputs .hx-input{display:inline-block;width:unset}.hxa-datepicker-interval__inputs .hx-input:first-child{width:2.5rem}.hxa-datepicker-interval__inputs .hx-input:not(:last-child){margin-right:1rem}.hxa-datepicker-interval__output{margin:0 auto}.hxa-datepicker-interval__footer{background-color:#f5f5f5;padding:.75rem;display:flex;justify-content:space-between}\n"], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i1.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { type: i1.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.11", ngImport: i0, type: DatepickerIntervalComponent, decorators: [{
type: Component,
args: [{ selector: 'hxa-datepicker-interval', host: {
class: 'hx-card hxa-datepicker-interval',
}, template: "<form [formGroup]=\"form\" (ngSubmit)=\"onChoose($event)\">\r\n <section class=\"hxa-datepicker-interval__content\">\r\n <fieldset class=\"hxa-datepicker-interval__inputs\">\r\n <input\r\n type=\"number\"\r\n id=\"numberText\"\r\n class=\"hx-input\"\r\n formControlName=\"number\"\r\n min=\"0\"\r\n />\r\n\r\n <select id=\"durationText\" class=\"hx-input\" formControlName=\"duration\">\r\n <option *ngFor=\"let opt of durationOptions\" [value]=\"opt + 's'\">\r\n {{ opt + '(s)' }}\r\n </option>\r\n </select>\r\n\r\n <span>from today</span>\r\n </fieldset>\r\n\r\n <div class=\"hxa-datepicker-interval__output\">\r\n <span>will be </span>\r\n <span class=\"is-text-weight-bolder\">{{ dateLabel }}</span>\r\n </div>\r\n </section>\r\n\r\n <section class=\"hxa-datepicker-interval__footer\">\r\n <button class=\"hx-button\" (click)=\"onCancel()\">Cancel</button>\r\n <button type=\"submit\" class=\"hx-button is-primary\">Select</button>\r\n </section>\r\n</form>\r\n", styles: [":host.hx-card{border:unset}:host.hx-card:hover,:host.hx-card.is-hovered{box-shadow:none}.hxa-datepicker-interval:host{display:flex;flex-direction:column;width:19rem;height:21rem}.hxa-datepicker-interval:host>form{display:flex;flex-direction:column;font-size:1rem;flex:1 1 auto}.hxa-datepicker-interval__content{display:flex;flex-direction:column;flex:1 1 auto;justify-content:center;padding:.75rem}.hxa-datepicker-interval__inputs{border:none;display:block;padding:0;margin:0 auto 1.25rem}.hxa-datepicker-interval__inputs .hx-input{display:inline-block;width:unset}.hxa-datepicker-interval__inputs .hx-input:first-child{width:2.5rem}.hxa-datepicker-interval__inputs .hx-input:not(:last-child){margin-right:1rem}.hxa-datepicker-interval__output{margin:0 auto}.hxa-datepicker-interval__footer{background-color:#f5f5f5;padding:.75rem;display:flex;justify-content:space-between}\n"] }]
}], ctorParameters: function () { return [{ type: i1.FormBuilder }]; }, propDecorators: { selectedDate: [{
type: Input
}], selectedInterval: [{
type: Input
}], update: [{
type: Output
}], cancel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9oeC11aS9zcmMvbGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxHQUNQLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxXQUFXLEVBQWEsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxNQUFNLENBQUM7Ozs7QUFXcEMsTUFBTSxPQUFPLDJCQUEyQjtJQXVCdEMsWUFBb0IsR0FBZ0I7UUFBaEIsUUFBRyxHQUFILEdBQUcsQ0FBYTtRQXRCcEMsb0JBQWUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ25ELGFBQVEsR0FBRyxNQUFNLENBQUM7UUFDbEIsY0FBUyxHQUFHLENBQUMsQ0FBQztRQUtOLFdBQU0sR0FBaUIsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQVVsRCxXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQXVDLENBQUM7UUFHakUsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7SUFFSyxDQUFDO0lBRXhDLFFBQVE7UUFDTiw4QkFBOEI7UUFDOUIsSUFDRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0I7WUFDNUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEs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O2FBQ2Q7aUJBQU0sSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFO2dCQUNqQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7YUFDbEM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsU0FBUyxVQUFVLENBQUMsR0FBVztZQUM3QixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDekIsSUFBSSxPQUFPLEtBQUssVUFBVSxFQUFFO2dCQUMxQixNQUFNLEdBQUcsR0FBRyxHQUFHLEtBQUssQ0FBQzthQUN0QjtpQkFBTSxJQUFJLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQy9CLE1BQU0sR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNsQztpQkFBTSxJQUFJLE9BQU8sS0FBSyxVQUFVLEVBQUU7Z0JBQ2pDLE1BQU0sR0FBRyxHQUFHLENBQUM7YUFDZDtZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUM7SUFDSCxDQUFDOzt5SEFwTFUsMkJBQTJCOzZHQUEzQiwyQkFBMkIsNlBDckJ4QywyakNBK0JBOzRGRFZhLDJCQUEyQjtrQkFSdkMsU0FBUzsrQkFDRSx5QkFBeUIsUUFHN0I7d0JBQ0osS0FBSyxFQUFFLGlDQUFpQztxQkFDekM7a0dBY0QsWUFBWTtzQkFEWCxLQUFLO2dCQUlOLGdCQUFnQjtzQkFEZixLQUFLO2dCQUlOLE1BQU07c0JBREwsTUFBTTtnQkFJUCxNQUFNO3NCQURMLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25EZXN0cm95LFxyXG4gIE9uSW5pdCxcclxuICBPdXRwdXQsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJJbnRlcnZhbCB9IGZyb20gJy4vZGF0ZXBpY2tlci5tb2RlbCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1kYXRlcGlja2VyLWludGVydmFsJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci1pbnRlcnZhbC5jb21wb25lbnQuc2NzcyddLFxyXG4gIGhvc3Q6IHtcclxuICAgIGNsYXNzOiAnaHgtY2FyZCBoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbCcsXHJcbiAgfSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERhdGVwaWNrZXJJbnRlcnZhbENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBkdXJhdGlvbk9wdGlvbnMgPSBbJ2RheScsICd3ZWVrJywgJ21vbnRoJywgJ3llYXInXTtcclxuICBkdXJhdGlvbiA9ICdkYXlzJztcclxuICBpbmNyZW1lbnQgPSAwO1xyXG4gIHRleHQ6IG1vbWVudC5Nb21lbnQ7XHJcbiAgZGF0ZUxhYmVsOiBzdHJpbmc7XHJcbiAgcHVibGljIF9kdWVEYXRlc3RyaW5nOiBzdHJpbmc7XHJcblxyXG4gIHByaXZhdGUgdmFsdWUkOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XHJcbiAgZm9ybTogRm9ybUdyb3VwO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHNlbGVjdGVkRGF0ZTogRGF0ZTtcclxuXHJcbiAgQElucHV0KClcclxuICBzZWxlY3RlZEludGVydmFsOiBEYXRlUGlja2VySW50ZXJ2YWw7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZVBpY2tlckludGVydmFsICYgeyBkYXRlOiBEYXRlIH0+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIGNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZmI6IEZvcm1CdWlsZGVyKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8vIGRhdGUgc2VsZWN0ZWQgZnJvbSBpbnRlcnZhbFxyXG4gICAgaWYgKFxyXG4gICAgICB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEludGVydmFsLmlzU2VsZWN0ZWRGcm9tSW50ZXJ2YWwgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZEludGVydmFsLmludGVydmFsXHJcbiAgICApIHtcclxuICAgICAgY29uc3QgaW50ZXJ2YWxBcnIgPSB0aGlzLnNlbGVjdGVkSW50ZXJ2YWwuaW50ZXJ2YWwuc3BsaXQoJyAnKTtcclxuXHJcbiAgICAgIGlmIChpbnRlcnZhbEFyciAmJiBpbnRlcnZhbEFyci5sZW5ndGggPiAxKSB7XHJcbiAgICAgICAgdGhpcy5pbmNyZW1lbnQgPSBwYXJzZUludChpbnRlcnZhbEFyclswXSwgMTApO1xyXG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aGlzLm5vcm1hbGlzZUR1cmF0aW9uU3RyaW5nKGludGVydmFsQXJyWzFdKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gZGF0ZSBpcyB0eXBlZCBvciBjYWxlbmRhciBwaWNrZXJcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZERhdGUpIHtcclxuICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBtb21lbnQodGhpcy5zZWxlY3RlZERhdGUpO1xyXG4gICAgICBjb25zdCB0b2RheSA9IG1vbWVudCgpLnN0YXJ0T2YoJ2RheScpO1xyXG4gICAgICBjb25zdCBkdXJhdGlvbiA9ICdkYXlzJztcclxuXHJcbiAgICAgIGNvbnN0IGRheXNCZXR3ZWVuOiBudW1iZXIgPSBzZWxlY3RlZC5kaWZmKHRvZGF5LCBkdXJhdGlvbik7XHJcblxyXG4gICAgICBpZiAoZGF5c0JldHdlZW4gJiYgZGF5c0JldHdlZW4gPiAwKSB7XHJcbiAgICAgICAgdGhpcy5pbmNyZW1lbnQgPSBkYXlzQmV0d2VlbjtcclxuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICB0aGlzLm9uU2VsZWN0b3B0aW9ucyh0aGlzLmluY3JlbWVudCwgdGhpcy5kdXJhdGlvbik7XHJcblxyXG4gICAgdGhpcy5mb3JtID0gdGhpcy5fZmIuZ3JvdXAoe1xyXG4gICAgICBudW1iZXI6IFt0aGlzLmluY3JlbWVudCwgVmFsaWRhdG9ycy5taW4oMCldLFxyXG4gICAgICBkdXJhdGlvbjogW3RoaXMuZHVyYXRpb25dLFxyXG4gICAgfSk7XHJcblxyXG4gICAgdGhpcy5vblZhbHVlQ2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlJC51bnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcbiAgb25WYWx1ZUNoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlJCA9IHRoaXMuZm9ybS52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKHZhbCA9PiB7XHJcbiAgICAgIHRoaXMub25TZWxlY3RvcHRpb25zKHZhbC5udW1iZXIsIHZhbC5kdXJhdGlvbik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKiBvbiBjYW5jZWwgb2YgaW50ZXJ2YWwgZm9ybSAqL1xyXG4gIG9uQ2FuY2VsKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgb25TZWxlY3RvcHRpb25zKG51bWJlclZhbHVlOiBudW1iZXIsIGR1cmF0aW9uVmFsdWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgdGhpcy50ZXh0ID0gbW9tZW50KCkuYWRkKFxyXG4gICAgICBudW1iZXJWYWx1ZSBhcyBtb21lbnQuRHVyYXRpb25JbnB1dEFyZzEsXHJcbiAgICAgIGR1cmF0aW9uVmFsdWUgYXMgbW9tZW50LkR1cmF0aW9uSW5wdXRBcmcyXHJcbiAgICApO1xyXG4gICAgdGhpcy5kYXRlTGFiZWwgPSB0aGlzLnRleHQuZm9ybWF0KCdkZGQgREQvTU0vWVlZWScpO1xyXG4gICAgdGhpcy5fZHVlRGF0ZXN0cmluZyA9IHRoaXMudGV4dC5mb3JtYXQoJ1lZWVktTU0tREQnKTtcclxuICB9XHJcblxyXG4gIC8qKiBvbiBzdWJtaXNzaW9uIG9mIGludGVydmFsIGZvcm0gKi9cclxuICBvbkNob29zZSgkZXZlbnQ6IFN1Ym1pdEV2ZW50KSB7XHJcbiAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIC8vIGNoZWNrIGZvcm0gaXMgdmFsaWRcclxuICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcclxuICAgICAgY29uc3QgaW50ZXJ2YWxTdWJtaXR0ZWQgPVxyXG4gICAgICAgIHRoaXMuZm9ybS52YWx1ZS5udW1iZXIudG9TdHJpbmcoKSArXHJcbiAgICAgICAgJyAnICtcclxuICAgICAgICB0aGlzLm5vcm1hbGlzZUR1cmF0aW9uU3RyaW5nKHRoaXMuZm9ybS52YWx1ZS5kdXJhdGlvbiwgJ29wdGlvbmFsJyk7XHJcblxyXG4gICAgICBjb25zdCBkYXRlU3VibWl0dGVkID0gbmV3IERhdGUodGhpcy5fZHVlRGF0ZXN0cmluZyk7XHJcblxyXG4gICAgICBjb25zdCByZXN1bHQgPSB7XHJcbiAgICAgICAgaW50ZXJ2YWw6IGludGVydmFsU3VibWl0dGVkLFxyXG4gICAgICAgIGlzU2VsZWN0ZWRGcm9tSW50ZXJ2YWw6IHRydWUsXHJcbiAgICAgICAgZGF0ZTogZGF0ZVN1Ym1pdHRlZCxcclxuICAgICAgfTtcclxuXHJcbiAgICAgIC8vIGVtaXQgcmVzdWx0XHJcbiAgICAgIHRoaXMudXBkYXRlLmVtaXQocmVzdWx0KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBub3JtYWxpc2UgZHVyYXRpb24gc3RyaW5nICovXHJcbiAgbm9ybWFsaXNlRHVyYXRpb25TdHJpbmcoXHJcbiAgICBkdXJhdGlvbjogc3RyaW5nLFxyXG4gICAgb3V0cHV0OiAnc2luZ3VsYXInIHwgJ3BsdXJhbCcgfCAnb3B0aW9uYWwnID0gJ3BsdXJhbCdcclxuICApOiBzdHJpbmcge1xyXG4gICAgY29uc3Qgc2luZ3VsYXIgPSB0aGlzLmR1cmF0aW9uT3B0aW9ucztcclxuICAgIGNvbnN0IHBsdXJhbCA9IHNpbmd1bGFyLm1hcCh2YWwgPT4gdmFsICsgJ3MnKTtcclxuICAgIGNvbnN0IG9wdGlvbmFsID0gc2luZ3VsYXIubWFwKHZhbCA9PiB2YWwgKyAnKHMpJyk7XHJcblxyXG4gICAgY29uc3QgY3VycmVudCA9IGN1cnJlbnRGb3JtYXQoZHVyYXRpb24pO1xyXG5cclxuICAgIGxldCByZXN1bHQgPSBbYCR7b3V0cHV0fWBdWzBdIHx8ICdkYXlzJztcclxuXHJcbiAgICBpZiAob3V0cHV0ID09PSAnc2luZ3VsYXInKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvU2luZ3VsYXIoZHVyYXRpb24pO1xyXG4gICAgfSBlbHNlIGlmIChvdXRwdXQgPT09ICdwbHVyYWwnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvUGx1cmFsKGR1cmF0aW9uKTtcclxuICAgIH0gZWxzZSBpZiAob3V0cHV0ID09PSAnb3B0aW9uYWwnKSB7XHJcbiAgICAgIHJlc3VsdCA9IHRvT3B0aW9uYWwoZHVyYXRpb24pO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcblxyXG4gICAgZnVuY3Rpb24gY3VycmVudEZvcm1hdChzdHI6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XHJcbiAgICAgIGlmIChzaW5ndWxhci5pbmNsdWRlcyhzdHIpKSB7XHJcbiAgICAgICAgcmV0dXJuICdzaW5ndWxhcic7XHJcbiAgICAgIH0gZWxzZSBpZiAocGx1cmFsLmluY2x1ZGVzKHN0cikpIHtcclxuICAgICAgICByZXR1cm4gJ3BsdXJhbCc7XHJcbiAgICAgIH0gZWxzZSBpZiAob3B0aW9uYWwuaW5jbHVkZXMoc3RyKSkge1xyXG4gICAgICAgIHJldHVybiAnb3B0aW9uYWwnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b1Npbmd1bGFyKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IHNpbmd1bGFyWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAncGx1cmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ci5yZXBsYWNlKCdzJywgJycpO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09ICdvcHRpb25hbCcpIHtcclxuICAgICAgICByZXN1bHQgPSBzdHIucmVwbGFjZSgnKHMpJywgJycpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gdG9QbHVyYWwoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICBsZXQgcmVzdWx0ID0gcGx1cmFsWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ciArICdzJztcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAncGx1cmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfSBlbHNlIGlmIChjdXJyZW50ID09PSAnb3B0aW9uYWwnKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyLnJlcGxhY2UoJyhzKScsICdzJyk7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBmdW5jdGlvbiB0b09wdGlvbmFsKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgbGV0IHJlc3VsdCA9IG9wdGlvbmFsWzBdO1xyXG4gICAgICBpZiAoY3VycmVudCA9PT0gJ3Npbmd1bGFyJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0ciArICcocyknO1xyXG4gICAgICB9IGVsc2UgaWYgKGN1cnJlbnQgPT09ICdwbHVyYWwnKSB7XHJcbiAgICAgICAgcmVzdWx0ID0gc3RyLnJlcGxhY2UoJ3MnLCAnKHMpJyk7XHJcbiAgICAgIH0gZWxzZSBpZiAoY3VycmVudCA9PT0gJ29wdGlvbmFsJykge1xyXG4gICAgICAgIHJlc3VsdCA9IHN0cjtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8Zm9ybSBbZm9ybUdyb3VwXT1cImZvcm1cIiAobmdTdWJtaXQpPVwib25DaG9vc2UoJGV2ZW50KVwiPlxyXG4gIDxzZWN0aW9uIGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaW50ZXJ2YWxfX2NvbnRlbnRcIj5cclxuICAgIDxmaWVsZHNldCBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWludGVydmFsX19pbnB1dHNcIj5cclxuICAgICAgPGlucHV0XHJcbiAgICAgICAgdHlwZT1cIm51bWJlclwiXHJcbiAgICAgICAgaWQ9XCJudW1iZXJUZXh0XCJcclxuICAgICAgICBjbGFzcz1cImh4LWlucHV0XCJcclxuICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJudW1iZXJcIlxyXG4gICAgICAgIG1pbj1cIjBcIlxyXG4gICAgICAvPlxyXG5cclxuICAgICAgPHNlbGVjdCBpZD1cImR1cmF0aW9uVGV4dFwiIGNsYXNzPVwiaHgtaW5wdXRcIiBmb3JtQ29udHJvbE5hbWU9XCJkdXJhdGlvblwiPlxyXG4gICAgICAgIDxvcHRpb24gKm5nRm9yPVwibGV0IG9wdCBvZiBkdXJhdGlvbk9wdGlvbnNcIiBbdmFsdWVdPVwib3B0ICsgJ3MnXCI+XHJcbiAgICAgICAgICB7eyBvcHQgKyAnKHMpJyB9fVxyXG4gICAgICAgIDwvb3B0aW9uPlxyXG4gICAgICA8L3NlbGVjdD5cclxuXHJcbiAgICAgIDxzcGFuPmZyb20gdG9kYXk8L3NwYW4+XHJcbiAgICA8L2ZpZWxkc2V0PlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbF9fb3V0cHV0XCI+XHJcbiAgICAgIDxzcGFuPndpbGwgYmUgPC9zcGFuPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cImlzLXRleHQtd2VpZ2h0LWJvbGRlclwiPnt7IGRhdGVMYWJlbCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gIDwvc2VjdGlvbj5cclxuXHJcbiAgPHNlY3Rpb24gY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pbnRlcnZhbF9fZm9vdGVyXCI+XHJcbiAgICA8YnV0dG9uIGNsYXNzPVwiaHgtYnV0dG9uXCIgKGNsaWNrKT1cIm9uQ2FuY2VsKClcIj5DYW5jZWw8L2J1dHRvbj5cclxuICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiaHgtYnV0dG9uIGlzLXByaW1hcnlcIj5TZWxlY3Q8L2J1dHRvbj5cclxuICA8L3NlY3Rpb24+XHJcbjwvZm9ybT5cclxuIl19