UNPKG

ngx-slice-kit

Version:

[![npm version](https://badge.fury.io/js/ngx-slice-kit.svg)](https://badge.fury.io/js/ngx-slice-kit)

149 lines 30.9 kB
import { Component, EventEmitter, forwardRef, HostBinding, Input, Output, ViewChild } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import * as i0 from "@angular/core"; import * as i1 from "../../core/layout-control/layout-control.service"; import * as i2 from "../../core/theme/theme.service"; import * as i3 from "@angular/common"; export class TextareaComponent { constructor(layoutControlService, elementRef, themeService) { this.layoutControlService = layoutControlService; this.elementRef = elementRef; this.themeService = themeService; this.placeholder = ''; this.tabindex = undefined; this.minHeight = 76; this.maxHeight = 280; this.resizable = true; this.fullWidth = false; this.focusEvent = new EventEmitter(); this.blurEvent = new EventEmitter(); this.value = undefined; this.focused = false; this.rows = 3; this.textareaId = this.layoutControlService.generateLayoutElementHash(); } set required(val) { this.req = val === '' || val === true; } get required() { return this.req; } ngOnInit() { if (this.disabled && this.resizable) { this.resizable = false; } if (this.fullWidth) { const parentElWidth = this.elementRef.nativeElement.parentElement.offsetWidth; this.textarea.nativeElement.style.width = `${parentElWidth}px`; } } onFocus() { const event = { target: this.elementRef.nativeElement, eventName: 'focus', value: this.value || '' }; this.focused = true; this.focusEvent.emit(event); } onBlur() { const event = { target: this.elementRef.nativeElement, eventName: 'blur', value: this.value || '' }; this.focused = false; this.blurEvent.emit(event); } change(target) { this.writeValue(target.value); this.onTouched(); this.elementClone.nativeElement.innerText = target.value.replace(/\n^ *$/gm, '\n-'); } writeValue(value) { this.value = value; this.onChange(this.value); } onChange(value) { } onTouched() { } isEmpty() { return !this.value || this.value.length < 1; } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } setDisabledState(isDisabled) { this.disabled = isDisabled; } ngOnDestroy() { this.focusEvent.complete(); this.blurEvent.complete(); } } TextareaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TextareaComponent, deps: [{ token: i1.LayoutControlService }, { token: i0.ElementRef }, { token: i2.ThemeService }], target: i0.ɵɵFactoryTarget.Component }); TextareaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.3", type: TextareaComponent, selector: "sdk-textarea", inputs: { required: "required", placeholder: "placeholder", tabindex: "tabindex", minHeight: "minHeight", maxHeight: "maxHeight", small: "small", label: "label", caption: "caption", resizable: "resizable", error: "error", disabled: "disabled", fullWidth: "fullWidth" }, outputs: { focusEvent: "focusEvent", blurEvent: "blurEvent" }, host: { properties: { "class.sdk-textarea--warn": "this.error", "class.disabled": "this.disabled", "class.full-width": "this.fullWidth" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextareaComponent), multi: true } ], viewQueries: [{ propertyName: "elementClone", first: true, predicate: ["clone"], descendants: true }, { propertyName: "textarea", first: true, predicate: ["textarea"], descendants: true, static: true }], ngImport: i0, template: "<label class=\"sdk-textarea__label\" for=\"{{textareaId}}\"\n [class.sdk-textarea__label--focused]=\"focused\"\n [class.sdk-textarea__label--small]=\"small\">\n {{label}}\n</label>\n<div class=\"sdk-textarea-wrap\" #wrap\n [class.sdk-textarea-wrap--warn]=\"error\"\n [class.sdk-textarea-wrap--focused]=\"focused\">\n <div class=\"sdk-textarea-inner-wrap\">\n <textarea class=\"sdk-textarea__textarea\" #textarea\n id=\"{{textareaId}}\"\n [class.sdk-textarea__textarea--small]=\"small\"\n [placeholder]=\"placeholder\"\n [tabindex]=\"tabindex\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup)=\"change($event.target)\"\n [value]=\"value ? value : ''\"\n [rows]=\"rows\"\n [required]=\"required\"\n [style.height.px]=\"clone.clientHeight + 2\"\n [disabled]=\"disabled\"\n [style.resize]=\"resizable ? 'both' : 'none'\"\n [style.minHeight.px]=\"minHeight\"\n [style.maxHeight.px]=\"maxHeight\">\n </textarea>\n <div class=\"sdk-textarea__pull-angle-wrapper\" *ngIf=\"resizable\">\n <div class=\"sdk-textarea__pull-angle\">\n <div class=\"sdk-textarea__pull-angle-inner\"></div>\n </div>\n </div>\n <div class=\"sdk-textarea__hidden-clone sdk-textarea__textarea\" #clone></div>\n </div>\n</div>\n<small class=\"sdk-textarea__caption\" *ngIf=\"caption\">{{caption}}</small>\n<small class=\"sdk-textarea__error\" *ngIf=\"error\" (click)=\"textarea.focus()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M3.41421 0.585786C3.78929 0.210713 4.29799 0 4.82843 0H7.17157C7.70201 0 8.21071 0.210714 8.58579 0.585786L11.4142 3.41421C11.7893 3.78929 12 4.29799 12 4.82843V7.17157C12 7.70201 11.7893 8.21071 11.4142 8.58579L8.58579 11.4142C8.21071 11.7893 7.70201 12 7.17157 12H4.82843C4.29799 12 3.78929 11.7893 3.41421 11.4142L0.585786 8.58579C0.210713 8.21071 0 7.70201 0 7.17157V4.82843C0 4.29799 0.210714 3.78929 0.585786 3.41421L3.41421 0.585786ZM6 2C6.49981 2 6.90499 2.40518 6.90499 2.90499C6.90499 2.93506 6.90349 2.96511 6.9005 2.99504L6.54975 6.50248C6.52151 6.78492 6.28384 7 6 7C5.71616 7 5.47849 6.78492 5.45025 6.50248L5.0995 2.99504C5.04977 2.49771 5.41262 2.05422 5.90995 2.00449C5.93987 2.0015 5.96993 2 6 2ZM7 9C7 8.44771 6.55228 8 6 8C5.44772 8 5 8.44771 5 9C5 9.55229 5.44772 10 6 10C6.55228 10 7 9.55229 7 9Z\"\n fill=\"var(--warn)\"/>\n </svg>\n {{error ? error : ''}}\n</small>\n", styles: [".sdk-inputs-caption,.sdk-textarea__error,.sdk-textarea__caption{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;margin-left:4px;font-size:13px;line-height:14px;margin-top:4px;cursor:default}:host{position:relative;display:flex;flex-direction:column;align-items:flex-start}:host.disabled{opacity:.6;pointer-events:none;cursor:default}.sdk-textarea__label{font-weight:500;color:var(--base-a50);transition:all .2s;font-size:17px;margin-bottom:2px}.sdk-textarea__label--wide{min-width:288px;max-width:none}.sdk-textarea__label--full-width{width:100%;max-width:none}.sdk-textarea__label--focused{color:var(--base-a90)}.sdk-textarea__label--small{font-size:15px}.sdk-textarea__label--accent{color:var(--accent)}.sdk-textarea__label--warn{color:var(--warn)}.sdk-textarea-wrap{border-radius:6px;display:flex;background-color:var(--background-a90);overflow:hidden;border-color:var(--regular-a50);border-width:1px;border-style:solid;min-width:200px;width:100%;transition:.4s}.sdk-textarea-wrap--focused{border-color:var(--regular-a100)}.sdk-textarea-wrap--warn{border-color:var(--warn)}.sdk-textarea-wrap--accent{border-color:var(--accent)}.sdk-textarea-inner-wrap{position:relative;border-radius:inherit;width:100%}.sdk-textarea__textarea{color:var(--base-a90);border-radius:inherit;width:100%;min-width:200px;font-size:17px;font-weight:400;line-height:24px;padding:8px 16px;margin:0;outline:none;border:none;font-family:\"\",sans-serif;background-color:transparent;box-sizing:border-box}.sdk-textarea__textarea--small{font-size:15px}.sdk-textarea__textarea::-webkit-input-placeholder{color:transparent}.sdk-textarea__textarea::-moz-placeholder{color:transparent}.sdk-textarea__textarea:-ms-input-placeholder{color:transparent}.sdk-textarea__textarea:-moz-placeholder{color:transparent}.sdk-textarea__hidden-clone{position:absolute;width:100%;visibility:hidden;word-break:break-word}.sdk-textarea__hidden-clone br{display:block}.sdk-textarea__pull-angle{position:absolute;z-index:2;bottom:0;right:0;background-color:transparent;height:11px;width:15px}.sdk-textarea__pull-angle-inner{border-top:8px solid var(--regular-a100);border-left:8px solid transparent;border-right:8px solid transparent;border-radius:3px;-webkit-transform:rotate(-45deg);bottom:0;right:0;pointer-events:none;z-index:1}.sdk-textarea__pull-angle-wrapper{position:absolute;right:1px;bottom:1px;width:18px;height:18px;background:var(--background-a90);pointer-events:none}.sdk-textarea__caption{color:var(--base-a70)}.sdk-textarea__error{color:var(--warn-a90)}.sdk-textarea__error svg{margin-right:4px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.3", ngImport: i0, type: TextareaComponent, decorators: [{ type: Component, args: [{ selector: 'sdk-textarea', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => TextareaComponent), multi: true } ], template: "<label class=\"sdk-textarea__label\" for=\"{{textareaId}}\"\n [class.sdk-textarea__label--focused]=\"focused\"\n [class.sdk-textarea__label--small]=\"small\">\n {{label}}\n</label>\n<div class=\"sdk-textarea-wrap\" #wrap\n [class.sdk-textarea-wrap--warn]=\"error\"\n [class.sdk-textarea-wrap--focused]=\"focused\">\n <div class=\"sdk-textarea-inner-wrap\">\n <textarea class=\"sdk-textarea__textarea\" #textarea\n id=\"{{textareaId}}\"\n [class.sdk-textarea__textarea--small]=\"small\"\n [placeholder]=\"placeholder\"\n [tabindex]=\"tabindex\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n (keyup)=\"change($event.target)\"\n [value]=\"value ? value : ''\"\n [rows]=\"rows\"\n [required]=\"required\"\n [style.height.px]=\"clone.clientHeight + 2\"\n [disabled]=\"disabled\"\n [style.resize]=\"resizable ? 'both' : 'none'\"\n [style.minHeight.px]=\"minHeight\"\n [style.maxHeight.px]=\"maxHeight\">\n </textarea>\n <div class=\"sdk-textarea__pull-angle-wrapper\" *ngIf=\"resizable\">\n <div class=\"sdk-textarea__pull-angle\">\n <div class=\"sdk-textarea__pull-angle-inner\"></div>\n </div>\n </div>\n <div class=\"sdk-textarea__hidden-clone sdk-textarea__textarea\" #clone></div>\n </div>\n</div>\n<small class=\"sdk-textarea__caption\" *ngIf=\"caption\">{{caption}}</small>\n<small class=\"sdk-textarea__error\" *ngIf=\"error\" (click)=\"textarea.focus()\">\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M3.41421 0.585786C3.78929 0.210713 4.29799 0 4.82843 0H7.17157C7.70201 0 8.21071 0.210714 8.58579 0.585786L11.4142 3.41421C11.7893 3.78929 12 4.29799 12 4.82843V7.17157C12 7.70201 11.7893 8.21071 11.4142 8.58579L8.58579 11.4142C8.21071 11.7893 7.70201 12 7.17157 12H4.82843C4.29799 12 3.78929 11.7893 3.41421 11.4142L0.585786 8.58579C0.210713 8.21071 0 7.70201 0 7.17157V4.82843C0 4.29799 0.210714 3.78929 0.585786 3.41421L3.41421 0.585786ZM6 2C6.49981 2 6.90499 2.40518 6.90499 2.90499C6.90499 2.93506 6.90349 2.96511 6.9005 2.99504L6.54975 6.50248C6.52151 6.78492 6.28384 7 6 7C5.71616 7 5.47849 6.78492 5.45025 6.50248L5.0995 2.99504C5.04977 2.49771 5.41262 2.05422 5.90995 2.00449C5.93987 2.0015 5.96993 2 6 2ZM7 9C7 8.44771 6.55228 8 6 8C5.44772 8 5 8.44771 5 9C5 9.55229 5.44772 10 6 10C6.55228 10 7 9.55229 7 9Z\"\n fill=\"var(--warn)\"/>\n </svg>\n {{error ? error : ''}}\n</small>\n", styles: [".sdk-inputs-caption,.sdk-textarea__error,.sdk-textarea__caption{display:flex;flex-direction:row;align-items:center;justify-content:flex-start;margin-left:4px;font-size:13px;line-height:14px;margin-top:4px;cursor:default}:host{position:relative;display:flex;flex-direction:column;align-items:flex-start}:host.disabled{opacity:.6;pointer-events:none;cursor:default}.sdk-textarea__label{font-weight:500;color:var(--base-a50);transition:all .2s;font-size:17px;margin-bottom:2px}.sdk-textarea__label--wide{min-width:288px;max-width:none}.sdk-textarea__label--full-width{width:100%;max-width:none}.sdk-textarea__label--focused{color:var(--base-a90)}.sdk-textarea__label--small{font-size:15px}.sdk-textarea__label--accent{color:var(--accent)}.sdk-textarea__label--warn{color:var(--warn)}.sdk-textarea-wrap{border-radius:6px;display:flex;background-color:var(--background-a90);overflow:hidden;border-color:var(--regular-a50);border-width:1px;border-style:solid;min-width:200px;width:100%;transition:.4s}.sdk-textarea-wrap--focused{border-color:var(--regular-a100)}.sdk-textarea-wrap--warn{border-color:var(--warn)}.sdk-textarea-wrap--accent{border-color:var(--accent)}.sdk-textarea-inner-wrap{position:relative;border-radius:inherit;width:100%}.sdk-textarea__textarea{color:var(--base-a90);border-radius:inherit;width:100%;min-width:200px;font-size:17px;font-weight:400;line-height:24px;padding:8px 16px;margin:0;outline:none;border:none;font-family:\"\",sans-serif;background-color:transparent;box-sizing:border-box}.sdk-textarea__textarea--small{font-size:15px}.sdk-textarea__textarea::-webkit-input-placeholder{color:transparent}.sdk-textarea__textarea::-moz-placeholder{color:transparent}.sdk-textarea__textarea:-ms-input-placeholder{color:transparent}.sdk-textarea__textarea:-moz-placeholder{color:transparent}.sdk-textarea__hidden-clone{position:absolute;width:100%;visibility:hidden;word-break:break-word}.sdk-textarea__hidden-clone br{display:block}.sdk-textarea__pull-angle{position:absolute;z-index:2;bottom:0;right:0;background-color:transparent;height:11px;width:15px}.sdk-textarea__pull-angle-inner{border-top:8px solid var(--regular-a100);border-left:8px solid transparent;border-right:8px solid transparent;border-radius:3px;-webkit-transform:rotate(-45deg);bottom:0;right:0;pointer-events:none;z-index:1}.sdk-textarea__pull-angle-wrapper{position:absolute;right:1px;bottom:1px;width:18px;height:18px;background:var(--background-a90);pointer-events:none}.sdk-textarea__caption{color:var(--base-a70)}.sdk-textarea__error{color:var(--warn-a90)}.sdk-textarea__error svg{margin-right:4px}\n"] }] }], ctorParameters: function () { return [{ type: i1.LayoutControlService }, { type: i0.ElementRef }, { type: i2.ThemeService }]; }, propDecorators: { required: [{ type: Input }], placeholder: [{ type: Input }], tabindex: [{ type: Input }], minHeight: [{ type: Input }], maxHeight: [{ type: Input }], small: [{ type: Input }], label: [{ type: Input }], caption: [{ type: Input }], resizable: [{ type: Input }], error: [{ type: Input }, { type: HostBinding, args: ['class.sdk-textarea--warn'] }], disabled: [{ type: Input }, { type: HostBinding, args: ['class.disabled'] }], fullWidth: [{ type: Input }, { type: HostBinding, args: ['class.full-width'] }], focusEvent: [{ type: Output }], blurEvent: [{ type: Output }], elementClone: [{ type: ViewChild, args: ['clone', { static: false }] }], textarea: [{ type: ViewChild, args: ['textarea', { static: true }] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dGFyZWEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9uZ3gtc2xpY2Uta2l0L3NyYy9saWIvaW5wdXRzL3RleHRhcmVhL3RleHRhcmVhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbmd4LXNsaWNlLWtpdC9zcmMvbGliL2lucHV0cy90ZXh0YXJlYS90ZXh0YXJlYS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxSSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7O0FBZ0J6RSxNQUFNLE9BQU8saUJBQWlCO0lBNEMxQixZQUNZLG9CQUEwQyxFQUMxQyxVQUFzQixFQUN0QixZQUEwQjtRQUYxQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBQzFDLGVBQVUsR0FBVixVQUFVLENBQVk7UUFDdEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFsQy9CLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBRWhCLGFBQVEsR0FBVyxTQUFTLENBQUM7UUFDN0IsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUN2QixjQUFTLEdBQVcsR0FBRyxDQUFDO1FBSXhCLGNBQVMsR0FBWSxJQUFJLENBQUM7UUFTbkMsY0FBUyxHQUFZLEtBQUssQ0FBQztRQUVqQixlQUFVLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDbkQsY0FBUyxHQUFzQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBSzVELFVBQUssR0FBVyxTQUFTLENBQUM7UUFDMUIsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixTQUFJLEdBQVcsQ0FBQyxDQUFDO1FBRWpCLGVBQVUsR0FBVyxJQUFJ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LGlnQkFSZjtRQUNQO1lBQ0ksT0FBTyxFQUFFLGlCQUFpQjtZQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUFDO1lBQ2hELEtBQUssRUFBRSxJQUFJO1NBQ2Q7S0FDSixzT0NmTCxrd0ZBMkNBOzJGRDFCYSxpQkFBaUI7a0JBWjdCLFNBQVM7K0JBQ0ksY0FBYyxhQUdiO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxpQkFBaUI7NEJBQzFCLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDOzRCQUNoRCxLQUFLLEVBQUUsSUFBSTt5QkFDZDtxQkFDSjsrSkFNbUIsUUFBUTtzQkFBM0IsS0FBSztnQkFTQyxXQUFXO3NCQURqQixLQUFLO2dCQUdVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsU0FBUztzQkFBeEIsS0FBSztnQkFDVSxTQUFTO3NCQUF4QixLQUFLO2dCQUNVLEtBQUs7c0JBQXBCLEtBQUs7Z0JBQ1UsS0FBSztzQkFBcEIsS0FBSztnQkFDVSxPQUFPO3NCQUF0QixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBR0MsS0FBSztzQkFEWCxLQUFLOztzQkFBSSxXQUFXO3VCQUFDLDBCQUEwQjtnQkFJekMsUUFBUTtzQkFEZCxLQUFLOztzQkFBSSxXQUFXO3VCQUFDLGdCQUFnQjtnQkFJL0IsU0FBUztzQkFEZixLQUFLOztzQkFBSSxXQUFXO3VCQUFDLGtCQUFrQjtnQkFHdkIsVUFBVTtzQkFBMUIsTUFBTTtnQkFDVSxTQUFTO3NCQUF6QixNQUFNO2dCQUVxQyxZQUFZO3NCQUF2RCxTQUFTO3VCQUFDLE9BQU8sRUFBRSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUM7Z0JBQ1csUUFBUTtzQkFBckQsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIGZvcndhcmRSZWYsIEhvc3RCaW5kaW5nLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBUaGVtZVNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3RoZW1lL3RoZW1lLnNlcnZpY2UnO1xuaW1wb3J0IHsgTGF5b3V0Q29udHJvbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL2xheW91dC1jb250cm9sL2xheW91dC1jb250cm9sLnNlcnZpY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3Nkay10ZXh0YXJlYScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3RleHRhcmVhLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi90ZXh0YXJlYS5jb21wb25lbnQuc2NzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFRleHRhcmVhQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFRleHRhcmVhQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIHJlcTogYm9vbGVhbjtcbiAgICBwcml2YXRlIHJlczogYm9vbGVhbjtcblxuICAgIEBJbnB1dCgpIHB1YmxpYyBzZXQgcmVxdWlyZWQodmFsOiBhbnkpIHtcbiAgICAgICAgdGhpcy5yZXEgPSB2YWwgPT09ICcnIHx8IHZhbCA9PT0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IHJlcXVpcmVkKCk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlcTtcbiAgICB9XG5cbiAgICBASW5wdXQoKVxuICAgIHB1YmxpYyBwbGFjZWhvbGRlcjogc3RyaW5nID0gJyc7XG5cbiAgICBASW5wdXQoKSBwdWJsaWMgdGFiaW5kZXg6IG51bWJlciA9IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWluSGVpZ2h0OiBudW1iZXIgPSA3NjtcbiAgICBASW5wdXQoKSBwdWJsaWMgbWF4SGVpZ2h0OiBudW1iZXIgPSAyODA7XG4gICAgQElucHV0KCkgcHVibGljIHNtYWxsOiBib29sZWFuO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBsYWJlbDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBjYXB0aW9uOiBzdHJpbmc7XG4gICAgQElucHV0KCkgcHVibGljIHJlc2l6YWJsZTogYm9vbGVhbiA9IHRydWU7XG5cbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLnNkay10ZXh0YXJlYS0td2FybicpXG4gICAgcHVibGljIGVycm9yOiBzdHJpbmc7XG5cbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmRpc2FibGVkJylcbiAgICBwdWJsaWMgZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgICBASW5wdXQoKSBASG9zdEJpbmRpbmcoJ2NsYXNzLmZ1bGwtd2lkdGgnKVxuICAgIHB1YmxpYyBmdWxsV2lkdGg6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIEBPdXRwdXQoKSBwdWJsaWMgZm9jdXNFdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgQE91dHB1dCgpIHB1YmxpYyBibHVyRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gICAgQFZpZXdDaGlsZCgnY2xvbmUnLCB7c3RhdGljOiBmYWxzZX0pIHB1YmxpYyBlbGVtZW50Q2xvbmU6IEVsZW1lbnRSZWY7XG4gICAgQFZpZXdDaGlsZCgndGV4dGFyZWEnLCB7c3RhdGljOiB0cnVlfSkgcHVibGljIHRleHRhcmVhOiBFbGVtZW50UmVmO1xuXG4gICAgcHVibGljIHZhbHVlOiBzdHJpbmcgPSB1bmRlZmluZWQ7XG4gICAgcHVibGljIGZvY3VzZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcm93czogbnVtYmVyID0gMztcblxuICAgIHB1YmxpYyB0ZXh0YXJlYUlkOiBzdHJpbmcgPSB0aGlzLmxheW91dENvbnRyb2xTZXJ2aWNlLmdlbmVyYXRlTGF5b3V0RWxlbWVudEhhc2goKTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGxheW91dENvbnRyb2xTZXJ2aWNlOiBMYXlvdXRDb250cm9sU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICBwcml2YXRlIHRoZW1lU2VydmljZTogVGhlbWVTZXJ2aWNlLFxuICAgICkge1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgJiYgdGhpcy5yZXNpemFibGUpIHtcbiAgICAgICAgICAgIHRoaXMucmVzaXphYmxlID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5mdWxsV2lkdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcmVudEVsV2lkdGggPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50Lm9mZnNldFdpZHRoO1xuICAgICAgICAgICAgdGhpcy50ZXh0YXJlYS5uYXRpdmVFbGVtZW50LnN0eWxlLndpZHRoID0gYCR7cGFyZW50RWxXaWR0aH1weGA7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgb25Gb2N1cygpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSB7XG4gICAgICAgICAgICB0YXJnZXQ6IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgZXZlbnROYW1lOiAnZm9jdXMnLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUgfHwgJydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkJsdXIoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgICAgIGV2ZW50TmFtZTogJ2JsdXInLFxuICAgICAgICAgICAgdmFsdWU6IHRoaXMudmFsdWUgfHwgJydcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmVtaXQoZXZlbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBjaGFuZ2UodGFyZ2V0KTogdm9pZCB7XG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZSh0YXJnZXQudmFsdWUpO1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmVsZW1lbnRDbG9uZS5uYXRpdmVFbGVtZW50LmlubmVyVGV4dCA9IHRhcmdldC52YWx1ZS5yZXBsYWNlKC9cXG5eICokL2dtLCAnXFxuLScpO1xuICAgIH1cblxuICAgIHB1YmxpYyB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLm9uQ2hhbmdlKHRoaXMudmFsdWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBvbkNoYW5nZSh2YWx1ZSk6IHZvaWQge1xuICAgIH1cblxuICAgIHB1YmxpYyBvblRvdWNoZWQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgcHVibGljIGlzRW1wdHkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAhdGhpcy52YWx1ZSB8fCB0aGlzLnZhbHVlLmxlbmd0aCA8IDE7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZ2lzdGVyT25DaGFuZ2UoZm4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyByZWdpc3Rlck9uVG91Y2hlZChmbik6IHZvaWQge1xuICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXREaXNhYmxlZFN0YXRlPyhpc0Rpc2FibGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb2N1c0V2ZW50LmNvbXBsZXRlKCk7XG4gICAgICAgIHRoaXMuYmx1ckV2ZW50LmNvbXBsZXRlKCk7XG4gICAgfVxuXG59XG4iLCI8bGFiZWwgY2xhc3M9XCJzZGstdGV4dGFyZWFfX2xhYmVsXCIgZm9yPVwie3t0ZXh0YXJlYUlkfX1cIlxuICAgICAgIFtjbGFzcy5zZGstdGV4dGFyZWFfX2xhYmVsLS1mb2N1c2VkXT1cImZvY3VzZWRcIlxuICAgICAgIFtjbGFzcy5zZGstdGV4dGFyZWFfX2xhYmVsLS1zbWFsbF09XCJzbWFsbFwiPlxuICAgIHt7bGFiZWx9fVxuPC9sYWJlbD5cbjxkaXYgY2xhc3M9XCJzZGstdGV4dGFyZWEtd3JhcFwiICN3cmFwXG4gICAgIFtjbGFzcy5zZGstdGV4dGFyZWEtd3JhcC0td2Fybl09XCJlcnJvclwiXG4gICAgIFtjbGFzcy5zZGstdGV4dGFyZWEtd3JhcC0tZm9jdXNlZF09XCJmb2N1c2VkXCI+XG4gICAgPGRpdiBjbGFzcz1cInNkay10ZXh0YXJlYS1pbm5lci13cmFwXCI+XG4gICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cInNkay10ZXh0YXJlYV9fdGV4dGFyZWFcIiAjdGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgIGlkPVwie3t0ZXh0YXJlYUlkfX1cIlxuICAgICAgICAgICAgICAgICAgW2NsYXNzLnNkay10ZXh0YXJlYV9fdGV4dGFyZWEtLXNtYWxsXT1cInNtYWxsXCJcbiAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlclwiXG4gICAgICAgICAgICAgICAgICBbdGFiaW5kZXhdPVwidGFiaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgKGZvY3VzKT1cIm9uRm9jdXMoKVwiXG4gICAgICAgICAgICAgICAgICAoYmx1cik9XCJvbkJsdXIoKVwiXG4gICAgICAgICAgICAgICAgICAoa2V5dXApPVwiY2hhbmdlKCRldmVudC50YXJnZXQpXCJcbiAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZSA/IHZhbHVlIDogJydcIlxuICAgICAgICAgICAgICAgICAgW3Jvd3NdPVwicm93c1wiXG4gICAgICAgICAgICAgICAgICBbcmVxdWlyZWRdPVwicmVxdWlyZWRcIlxuICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCJjbG9uZS5jbGllbnRIZWlnaHQgKyAyXCJcbiAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUucmVzaXplXT1cInJlc2l6YWJsZSA/ICdib3RoJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWluSGVpZ2h0LnB4XT1cIm1pbkhlaWdodFwiXG4gICAgICAgICAgICAgICAgICBbc3R5bGUubWF4SGVpZ2h0LnB4XT1cIm1heEhlaWdodFwiPlxuICAgICAgICA8L3RleHRhcmVhPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2RrLXRleHRhcmVhX19wdWxsLWFuZ2xlLXdyYXBwZXJcIiAqbmdJZj1cInJlc2l6YWJsZVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNkay10ZXh0YXJlYV9fcHVsbC1hbmdsZVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZGstdGV4dGFyZWFfX3B1bGwtYW5nbGUtaW5uZXJcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInNkay10ZXh0YXJlYV9faGlkZGVuLWNsb25lIHNkay10ZXh0YXJlYV9fdGV4dGFyZWFcIiAjY2xvbmU+PC9kaXY+XG4gICAgPC9kaXY+XG48L2Rpdj5cbjxzbWFsbCBjbGFzcz1cInNkay10ZXh0YXJlYV9fY2FwdGlvblwiICpuZ0lmPVwiY2FwdGlvblwiPnt7Y2FwdGlvbn19PC9zbWFsbD5cbjxzbWFsbCBjbGFzcz1cInNkay10ZXh0YXJlYV9fZXJyb3JcIiAqbmdJZj1cImVycm9yXCIgKGNsaWNrKT1cInRleHRhcmVhLmZvY3VzKClcIj5cbiAgICA8c3ZnIHdpZHRoPVwiMTJcIiBoZWlnaHQ9XCIxMlwiIHZpZXdCb3g9XCIwIDAgMTIgMTJcIiBmaWxsPVwibm9uZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIj5cbiAgICAgICAgPHBhdGggZmlsbC1ydWxlPVwiZXZlbm9kZFwiIGNsaXAtcnVsZT1cImV2ZW5vZGRcIlxuICAgICAgICAgICAgICBkPVwiTTMuNDE0MjEgMC41ODU3ODZDMy43ODkyOSAwLjIxMDcxMyA0LjI5Nzk5IDAgNC44Mjg0MyAwSDcuMTcxNTdDNy43MDIwMSAwIDguMjEwNzEgMC4yMTA3MTQgOC41ODU3OSAwLjU4NTc4NkwxMS40MTQyIDMuNDE0MjFDMTEuNzg5MyAzLjc4OTI5IDEyIDQuMjk3OTkgMTIgNC44Mjg0M1Y3LjE3MTU3QzEyIDcuNzAyMDEgMTEuNzg5MyA4LjIxMDcxIDExLjQxNDIgOC41ODU3OUw4LjU4NTc5IDExLjQxNDJDOC4yMTA3MSAxMS43ODkzIDcuNzAyMDEgMTIgNy4xNzE1NyAxMkg0LjgyODQzQzQuMjk3OTkgMTIgMy43ODkyOSAxMS43ODkzIDMuNDE0MjEgMTEuNDE0MkwwLjU4NTc4NiA4LjU4NTc5QzAuMjEwNzEzIDguMjEwNzEgMCA3LjcwMjAxIDAgNy4xNzE1N1Y0LjgyODQzQzAgNC4yOTc5OSAwLjIxMDcxNCAzLjc4OTI5IDAuNTg1Nzg2IDMuNDE0MjFMMy40MTQyMSAwLjU4NTc4NlpNNiAyQzYuNDk5ODEgMiA2LjkwNDk5IDIuNDA1MTggNi45MDQ5OSAyLjkwNDk5QzYuOTA0OTkgMi45MzUwNiA2LjkwMzQ5IDIuOTY1MTEgNi45MDA1IDIuOTk1MDRMNi41NDk3NSA2LjUwMjQ4QzYuNTIxNTEgNi43ODQ5MiA2LjI4Mzg0IDcgNiA3QzUuNzE2MTYgNyA1LjQ3ODQ5IDYuNzg0OTIgNS40NTAyNSA2LjUwMjQ4TDUuMDk5NSAyLjk5NTA0QzUuMDQ5NzcgMi40OTc3MSA1LjQxMjYyIDIuMDU0MjIgNS45MDk5NSAyLjAwNDQ5QzUuOTM5ODcgMi4wMDE1IDUuOTY5OTMgMiA2IDJaTTcgOUM3IDguNDQ3NzEgNi41NTIyOCA4IDYgOEM1LjQ0NzcyIDggNSA4LjQ0NzcxIDUgOUM1IDkuNTUyMjkgNS40NDc3MiAxMCA2IDEwQzYuNTUyMjggMTAgNyA5LjU1MjI5IDcgOVpcIlxuICAgICAgICAgICAgICBmaWxsPVwidmFyKC0td2FybilcIi8+XG4gICAgPC9zdmc+XG4gICAge3tlcnJvciA/IGVycm9yIDogJyd9fVxuPC9zbWFsbD5cbiJdfQ==