gentics-ui-core
Version:
This is the common core framework for the Gentics CMS and Mesh UI, and other Angular applications.
164 lines • 19.8 kB
JavaScript
import { ChangeDetectorRef, Component, ElementRef, EventEmitter, forwardRef, Input, Output, Renderer2, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import * as i0 from "@angular/core";
import * as i1 from "ngx-autosize";
const GTX_TEXTAREA_VALUE_ACCESSOR = {
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef(() => Textarea),
multi: true
};
/**
* The Textarea wraps the native `<textarea>` form element. Textareas automatically grow to accommodate their content.
*
* ```html
* <gtx-textarea label="Message" [(ngModel)]="message"></gtx-textarea>
* ```
*/
export class Textarea {
constructor(renderer, changeDetector, elementRef) {
this.renderer = renderer;
this.changeDetector = changeDetector;
this.elementRef = elementRef;
/**
* Sets the textarea to be auto-focused. Handled by `AutofocusDirective`.
*/
this.autofocus = false;
/**
* Sets the disabled state.
*/
this.disabled = false;
/**
* Sets the readonly state.
*/
this.readonly = false;
/**
* Sets the required state.
*/
this.required = false;
/**
* Sets the value of the control.
*/
this.value = '';
/**
* Sets the label of the control.
*/
this.label = '';
/**
* Blur event.
*/
this.blur = new EventEmitter();
/**
* Focus event.
*/
this.focus = new EventEmitter();
/**
* Change event.
*/
this.change = new EventEmitter();
this.valueIsValid = true;
}
/**
* Sets the maximum number of characters permitted.
*/
set maxlength(val) {
if (val != null && !isNaN(val) && val > 0) {
this._maxlength = Number(val);
}
else {
this._maxlength = undefined;
}
}
get maxlength() {
return this._maxlength;
}
ngOnChanges(changes) {
const valueChange = changes['value'];
if (valueChange) {
this.writeValue(valueChange.currentValue);
}
}
onBlur(e) {
e.stopPropagation();
const value = e.target.value;
this.blur.emit(this.normalizeValue(value));
this.onTouched();
}
onChangeEvent(e) {
e.stopPropagation();
}
onFocus(e) {
const value = e.target.value;
this.focus.emit(value);
}
onInput(e) {
const value = this.currentValue = e.target.value;
this.onChange(value);
this.change.emit(value);
this.onTouched();
setTimeout(() => {
const element = this.elementRef.nativeElement;
this.valueIsValid = !element.classList.contains('ng-touched') || !element.classList.contains('ng-invalid');
});
}
writeValue(valueToWrite) {
const value = this.normalizeValue(valueToWrite);
if (value !== this.currentValue) {
this.renderer.setProperty(this.nativeTextarea.nativeElement, 'value', this.currentValue = value);
}
}
registerOnChange(fn) {
this.onChange = fn;
}
registerOnTouched(fn) {
this.onTouched = fn;
}
setDisabledState(disabled) {
this.disabled = disabled;
this.changeDetector.markForCheck();
}
onChange(newValue) { }
onTouched() { }
normalizeValue(value) {
return (value == null ? '' : String(value)).replace(/\r\n?/g, '\n');
}
}
/** @nocollapse */ Textarea.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Textarea, deps: [{ token: i0.Renderer2 }, { token: i0.ChangeDetectorRef }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ Textarea.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.3.8", type: Textarea, selector: "gtx-textarea", inputs: { autofocus: "autofocus", disabled: "disabled", maxlength: "maxlength", name: "name", pattern: "pattern", placeholder: "placeholder", readonly: "readonly", required: "required", validationErrorTooltip: "validationErrorTooltip", value: "value", label: "label", id: "id" }, outputs: { blur: "blur", focus: "focus", change: "change" }, providers: [GTX_TEXTAREA_VALUE_ACCESSOR], viewQueries: [{ propertyName: "nativeTextarea", first: true, predicate: ["textarea"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<textarea\n class=\"materialize-textarea\"\n autosize\n [minRows]=\"1\"\n [attr.id]=\"id\"\n [attr.maxlength]=\"maxlength\"\n [attr.name]=\"name\"\n [attr.pattern]=\"pattern\"\n [attr.placeholder]=\"placeholder\"\n [attr.title]=\"(!valueIsValid && validationErrorTooltip) ? validationErrorTooltip : ''\"\n\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n\n #textarea\n></textarea>\n<label [attr.for]=\"id\">{{ label }}</label>\n", directives: [{ type: i1.AutosizeDirective, selector: "[autosize]", inputs: ["onlyGrow", "useImportant", "minRows", "autosize", "maxRows"], outputs: ["resized"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.8", ngImport: i0, type: Textarea, decorators: [{
type: Component,
args: [{ selector: 'gtx-textarea', providers: [GTX_TEXTAREA_VALUE_ACCESSOR], template: "<textarea\n class=\"materialize-textarea\"\n autosize\n [minRows]=\"1\"\n [attr.id]=\"id\"\n [attr.maxlength]=\"maxlength\"\n [attr.name]=\"name\"\n [attr.pattern]=\"pattern\"\n [attr.placeholder]=\"placeholder\"\n [attr.title]=\"(!valueIsValid && validationErrorTooltip) ? validationErrorTooltip : ''\"\n\n [disabled]=\"disabled\"\n [readonly]=\"readonly\"\n [required]=\"required\"\n\n (blur)=\"onBlur($event)\"\n (change)=\"onChangeEvent($event)\"\n (focus)=\"onFocus($event)\"\n (input)=\"onInput($event)\"\n\n #textarea\n></textarea>\n<label [attr.for]=\"id\">{{ label }}</label>\n" }]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }, { type: i0.ChangeDetectorRef }, { type: i0.ElementRef }]; }, propDecorators: { autofocus: [{
type: Input
}], disabled: [{
type: Input
}], maxlength: [{
type: Input
}], name: [{
type: Input
}], pattern: [{
type: Input
}], placeholder: [{
type: Input
}], readonly: [{
type: Input
}], required: [{
type: Input
}], validationErrorTooltip: [{
type: Input
}], value: [{
type: Input
}], label: [{
type: Input
}], id: [{
type: Input
}], blur: [{
type: Output
}], focus: [{
type: Output
}], change: [{
type: Output
}], nativeTextarea: [{
type: ViewChild,
args: ['textarea', { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvdGV4dGFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvdGV4dGFyZWEvdGV4dGFyZWEudHBsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUNWLFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEVBRVQsU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBdUIsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQzs7O0FBR3ZFLE1BQU0sMkJBQTJCLEdBQUc7SUFDaEMsT0FBTyxFQUFFLGlCQUFpQjtJQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN2QyxLQUFLLEVBQUUsSUFBSTtDQUNkLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFNSCxNQUFNLE9BQU8sUUFBUTtJQThGakIsWUFDWSxRQUFtQixFQUNuQixjQUFpQyxFQUNqQyxVQUFzQjtRQUZ0QixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBQ25CLG1CQUFjLEdBQWQsY0FBYyxDQUFtQjtRQUNqQyxlQUFVLEdBQVYsVUFBVSxDQUFZO1FBaEdsQzs7V0FFRztRQUNNLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFcEM7O1dBRUc7UUFDTSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBaUNuQzs7V0FFRztRQUNNLGFBQVEsR0FBWSxLQUFLLENBQUM7UUFFbkM7O1dBRUc7UUFDTSxhQUFRLEdBQVksS0FBSyxDQUFDO1FBT25DOztXQUVHO1FBQ00sVUFBSyxHQUFXLEVBQUUsQ0FBQztRQUU1Qjs7V0FFRztRQUNNLFVBQUssR0FBVyxFQUFFLENBQUM7UUFP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RUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBmb3J3YXJkUmVmLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPdXRwdXQsXG4gICAgUmVuZGVyZXIyLFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuXG5jb25zdCBHVFhfVEVYVEFSRUFfVkFMVUVfQUNDRVNTT1IgPSB7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gVGV4dGFyZWEpLFxuICAgIG11bHRpOiB0cnVlXG59O1xuXG4vKipcbiAqIFRoZSBUZXh0YXJlYSB3cmFwcyB0aGUgbmF0aXZlIGA8dGV4dGFyZWE+YCBmb3JtIGVsZW1lbnQuIFRleHRhcmVhcyBhdXRvbWF0aWNhbGx5IGdyb3cgdG8gYWNjb21tb2RhdGUgdGhlaXIgY29udGVudC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8Z3R4LXRleHRhcmVhIGxhYmVsPVwiTWVzc2FnZVwiIFsobmdNb2RlbCldPVwibWVzc2FnZVwiPjwvZ3R4LXRleHRhcmVhPlxuICogYGBgXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZ3R4LXRleHRhcmVhJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vdGV4dGFyZWEudHBsLmh0bWwnLFxuICAgIHByb3ZpZGVyczogW0dUWF9URVhUQVJFQV9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgVGV4dGFyZWEgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25DaGFuZ2VzIHtcbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSB0ZXh0YXJlYSB0byBiZSBhdXRvLWZvY3VzZWQuIEhhbmRsZWQgYnkgYEF1dG9mb2N1c0RpcmVjdGl2ZWAuXG4gICAgICovXG4gICAgQElucHV0KCkgYXV0b2ZvY3VzOiBib29sZWFuID0gZmFsc2U7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSBkaXNhYmxlZCBzdGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyBwZXJtaXR0ZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgc2V0IG1heGxlbmd0aCh2YWw6IGFueSkge1xuICAgICAgICBpZiAodmFsICE9IG51bGwgJiYgIWlzTmFOKHZhbCkgJiYgdmFsID4gMCkge1xuICAgICAgICAgICAgdGhpcy5fbWF4bGVuZ3RoID0gTnVtYmVyKHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl9tYXhsZW5ndGggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZ2V0IG1heGxlbmd0aCgpOiBhbnkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWF4bGVuZ3RoO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIG5hbWU6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFJlZ2V4IHBhdHRlcm4gZm9yIGNvbXBsZXggdmFsaWRhdGlvbi5cbiAgICAgKiBUaGlzIHJlcXVpcmVzIHRoYXQgdGhpcyBjb250cm9sIGlzIGVpdGhlciBwYXJ0IG9mIGEgZm9ybSBvciB0aGF0XG4gICAgICogaXRzIHZhbHVlIGlzIGJvdW5kIHdpdGggbmdNb2RlbC5cbiAgICAgKi9cbiAgICBASW5wdXQoKSBwYXR0ZXJuOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBBIHBsYWNlaG9sZGVyIHRleHQgdG8gZGlzcGxheSB3aGVuIHRoZSBjb250cm9sIGlzIGVtcHR5LlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHBsYWNlaG9sZGVyOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBTZXRzIHRoZSByZWFkb25seSBzdGF0ZS5cbiAgICAgKi9cbiAgICBASW5wdXQoKSByZWFkb25seTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogU2V0cyB0aGUgcmVxdWlyZWQgc3RhdGUuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVxdWlyZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFRvb2x0aXAgZm9yIHZhbGlkYXRpb24gZXJyb3JzLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbGlkYXRpb25FcnJvclRvb2x0aXA6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHZhbHVlOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgdGhlIGxhYmVsIG9mIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGxhYmVsOiBzdHJpbmcgPSAnJztcblxuICAgIC8qKlxuICAgICAqIFNldHMgYW4gaWQgZm9yIHRoZSBjb250cm9sLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIGlkOiBzdHJpbmc7XG5cbiAgICAvKipcbiAgICAgKiBCbHVyIGV2ZW50LlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSBibHVyID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICAvKipcbiAgICAgKiBGb2N1cyBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgZm9jdXMgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIC8qKlxuICAgICAqIENoYW5nZSBldmVudC5cbiAgICAgKi9cbiAgICBAT3V0cHV0KCkgY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cbiAgICB2YWx1ZUlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xuXG4gICAgQFZpZXdDaGlsZCgndGV4dGFyZWEnLCB7IHN0YXRpYzogdHJ1ZSB9KSBwcml2YXRlIG5hdGl2ZVRleHRhcmVhOiBFbGVtZW50UmVmO1xuICAgIHByaXZhdGUgX21heGxlbmd0aDogbnVtYmVyO1xuICAgIHByaXZhdGUgY3VycmVudFZhbHVlOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBwcmV2aW91c0hlaWdodDogbnVtYmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgcmVuZGVyZXI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZlxuICAgICkgeyB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlQ2hhbmdlID0gY2hhbmdlc1sndmFsdWUnXTtcbiAgICAgICAgaWYgKHZhbHVlQ2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLndyaXRlVmFsdWUodmFsdWVDaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uQmx1cihlOiBFdmVudCk6IHZvaWQge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBjb25zdCB2YWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy5ibHVyLmVtaXQodGhpcy5ub3JtYWxpemVWYWx1ZSh2YWx1ZSkpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgIH1cblxuICAgIG9uQ2hhbmdlRXZlbnQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICB9XG5cbiAgICBvbkZvY3VzKGU6IEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gKGUudGFyZ2V0IGFzIEhUTUxUZXh0QXJlYUVsZW1lbnQpLnZhbHVlO1xuICAgICAgICB0aGlzLmZvY3VzLmVtaXQodmFsdWUpO1xuICAgIH1cblxuICAgIG9uSW5wdXQoZTogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLmN1cnJlbnRWYWx1ZSA9IChlLnRhcmdldCBhcyBIVE1MVGV4dEFyZWFFbGVtZW50KS52YWx1ZTtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XG4gICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudDogSFRNTFRleHRBcmVhRWxlbWVudCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50O1xuICAgICAgICAgICAgdGhpcy52YWx1ZUlzVmFsaWQgPSAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25nLXRvdWNoZWQnKSB8fCAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ25nLWludmFsaWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgd3JpdGVWYWx1ZSh2YWx1ZVRvV3JpdGU6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubm9ybWFsaXplVmFsdWUodmFsdWVUb1dyaXRlKTtcbiAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLm5hdGl2ZVRleHRhcmVhLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHRoaXMuY3VycmVudFZhbHVlID0gdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKG5ld1ZhbHVlOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gICAgfVxuXG4gICAgc2V0RGlzYWJsZWRTdGF0ZShkaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkNoYW5nZShuZXdWYWx1ZTogc3RyaW5nKTogdm9pZCB7IH1cbiAgICBwcml2YXRlIG9uVG91Y2hlZCgpOiB2b2lkIHsgfVxuXG4gICAgcHJpdmF0ZSBub3JtYWxpemVWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsID8gJycgOiBTdHJpbmcodmFsdWUpKS5yZXBsYWNlKC9cXHJcXG4/L2csICdcXG4nKTtcbiAgICB9XG59XG4iLCI8dGV4dGFyZWFcbiAgICBjbGFzcz1cIm1hdGVyaWFsaXplLXRleHRhcmVhXCJcbiAgICBhdXRvc2l6ZVxuICAgIFttaW5Sb3dzXT1cIjFcIlxuICAgIFthdHRyLmlkXT1cImlkXCJcbiAgICBbYXR0ci5tYXhsZW5ndGhdPVwibWF4bGVuZ3RoXCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIFthdHRyLnBhdHRlcm5dPVwicGF0dGVyblwiXG4gICAgW2F0dHIucGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgIFthdHRyLnRpdGxlXT1cIighdmFsdWVJc1ZhbGlkICYmIHZhbGlkYXRpb25FcnJvclRvb2x0aXApID8gdmFsaWRhdGlvbkVycm9yVG9vbHRpcCA6ICcnXCJcblxuICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuXG4gICAgKGJsdXIpPVwib25CbHVyKCRldmVudClcIlxuICAgIChjaGFuZ2UpPVwib25DaGFuZ2VFdmVudCgkZXZlbnQpXCJcbiAgICAoZm9jdXMpPVwib25Gb2N1cygkZXZlbnQpXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dCgkZXZlbnQpXCJcblxuICAgICN0ZXh0YXJlYVxuPjwvdGV4dGFyZWE+XG48bGFiZWwgW2F0dHIuZm9yXT1cImlkXCI+e3sgbGFiZWwgfX08L2xhYmVsPlxuIl19