truly-ui
Version:
Web Components for Desktop Applications.
144 lines (142 loc) • 20.3 kB
JavaScript
/*
MIT License
Copyright (c) 2019 Temainfo Software
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/
import { Input, Component, Output, EventEmitter, ViewChild } from '@angular/core';
import { KeyEvent } from '../core/enums/key-events';
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "@angular/forms";
import * as i3 from "../icons/icons";
import * as i4 from "../input/input";
export class TlTag {
set color(value) {
const colors = {
basic: () => 'basic',
primary: () => 'primary',
success: () => 'success',
information: () => 'information',
warning: () => 'warning',
danger: () => 'danger',
};
if (colors[value]) {
this._color = colors[value]();
}
else {
this._color = null;
this.customColor = value;
}
}
get color() {
return this._color;
}
constructor() {
this.title = 'Title Tag';
this.width = 'fit-content';
this.height = 'auto';
this.icon = null;
this.mode = 'default';
this.charcase = 'unset';
this.closeOnValueEmited = true;
this.close = new EventEmitter();
this.tagValue = new EventEmitter();
this._color = 'basic';
this.editing = false;
this.customColor = '';
this.editableValue = '';
}
ngOnInit() { }
onClose() {
this.close.emit();
}
onClickTag() {
if (this.mode === 'editable') {
this.editing = true;
setTimeout(() => {
this.tlinput.setFocus();
});
}
}
onConfirmTextInputed() {
this.emitEditablevalue();
}
onClearValue() {
this.resetInput();
this.hideInput(true);
}
onInputValue(value) {
if (value.key === KeyEvent.ENTER) {
return this.emitEditablevalue();
}
if (value.key === KeyEvent.ESCAPE) {
this.resetInput();
this.hideInput(true);
}
}
emitEditablevalue() {
if (this.mode === 'editable') {
if (this.editableValue.trim()) {
this.tagValue.emit(this.editableValue);
this.resetInput();
this.hideInput();
}
else {
this.resetInput();
this.hideInput(true);
}
}
}
resetInput() {
this.editableValue = '';
}
hideInput(close = false) {
if (this.closeOnValueEmited || close) {
this.editing = false;
}
}
}
/** @nocollapse */ TlTag.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTag, deps: [], target: i0.ɵɵFactoryTarget.Component });
/** @nocollapse */ TlTag.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: TlTag, selector: "tl-tag", inputs: { title: "title", width: "width", height: "height", icon: "icon", mode: "mode", charcase: "charcase", closeOnValueEmited: "closeOnValueEmited", color: "color" }, outputs: { close: "close", tagValue: "tagValue" }, viewQueries: [{ propertyName: "tlinput", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<div [class]=\"'tl-tag ' + color\" [ngClass]=\"{clickable: mode === 'clickable' || 'editable'}\">\n <div class=\"tag\"\n *ngIf=\"!editing\"\n (click)=\"onClickTag()\"\n [class.customColor]=\"customColor\"\n [style.background]=\"color || customColor\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n [style.line-height]=\"height\">\n <tl-icon *ngIf=\"icon\" [size]=\"'0.8em'\" >{{ icon }}</tl-icon>\n <span class=\"description\" [style.textTransform]=\"charcase\">{{ title }}</span>\n <tl-icon *ngIf=\"mode === 'closeable'\" class=\"icon\" [lib]=\"'fa'\" [style]=\"'fas'\" [size]=\"'0.9em'\" (click)=\"onClose()\">times-circle</tl-icon>\n </div>\n <div *ngIf=\"editing && mode === 'editable'\" class=\"tl-tag-input-wrapper\">\n <tl-input #input\n [(ngModel)]=\"editableValue\"\n [height]=\"height\"\n [style.width]=\"width\"\n [clearButton]=\"true\"\n [iconAfter]=\"'dx-icon dx-icon-check'\"\n (keydown)=\"onInputValue($event)\"\n (clear)=\"onClearValue()\"\n (clickAddon)=\"onConfirmTextInputed()\"></tl-input>\n </div>\n</div>\n", styles: [".tl-tag{display:inline-block}.tl-tag.clickable{cursor:pointer}.tag{position:relative;display:inline-block;align-items:center;border-radius:3px;-webkit-user-select:none;user-select:none;text-align:center;padding:0 7px;margin:2.5px}.tag>.icon{font-size:12px;text-align:center;cursor:pointer}.tag>.description{margin:0 7px;text-align:center;font-size:12px;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.tag.customColor{color:#fff}.tl-tag-input-wrapper{display:inline-table}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: "component", type: i3.TlIcons, selector: "tl-icon", inputs: ["icon", "lib", "style", "size", "animation", "color", "align"] }, { kind: "component", type: i4.TlInput, selector: "tl-input", inputs: ["textBefore", "textAfter", "labelPlacement", "labelSize", "name", "label", "color", "iconBefore", "iconAfter", "clearButton", "readonly", "required", "disabled", "autocomplete", "maxlength", "tabindex", "textAlign", "mask", "placeholder", "type", "height", "withBorder", "flatBorder"], outputs: ["clear", "overlayOrigin", "clickAddon", "click", "focus", "blur", "valid", "completeMask"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: TlTag, decorators: [{
type: Component,
args: [{ selector: 'tl-tag', template: "<div [class]=\"'tl-tag ' + color\" [ngClass]=\"{clickable: mode === 'clickable' || 'editable'}\">\n <div class=\"tag\"\n *ngIf=\"!editing\"\n (click)=\"onClickTag()\"\n [class.customColor]=\"customColor\"\n [style.background]=\"color || customColor\"\n [style.height]=\"height\"\n [style.width]=\"width\"\n [style.line-height]=\"height\">\n <tl-icon *ngIf=\"icon\" [size]=\"'0.8em'\" >{{ icon }}</tl-icon>\n <span class=\"description\" [style.textTransform]=\"charcase\">{{ title }}</span>\n <tl-icon *ngIf=\"mode === 'closeable'\" class=\"icon\" [lib]=\"'fa'\" [style]=\"'fas'\" [size]=\"'0.9em'\" (click)=\"onClose()\">times-circle</tl-icon>\n </div>\n <div *ngIf=\"editing && mode === 'editable'\" class=\"tl-tag-input-wrapper\">\n <tl-input #input\n [(ngModel)]=\"editableValue\"\n [height]=\"height\"\n [style.width]=\"width\"\n [clearButton]=\"true\"\n [iconAfter]=\"'dx-icon dx-icon-check'\"\n (keydown)=\"onInputValue($event)\"\n (clear)=\"onClearValue()\"\n (clickAddon)=\"onConfirmTextInputed()\"></tl-input>\n </div>\n</div>\n", styles: [".tl-tag{display:inline-block}.tl-tag.clickable{cursor:pointer}.tag{position:relative;display:inline-block;align-items:center;border-radius:3px;-webkit-user-select:none;user-select:none;text-align:center;padding:0 7px;margin:2.5px}.tag>.icon{font-size:12px;text-align:center;cursor:pointer}.tag>.description{margin:0 7px;text-align:center;font-size:12px;font-family:Segoe UI,Lato,\"sans-serif\",Arial}.tag.customColor{color:#fff}.tl-tag-input-wrapper{display:inline-table}\n"] }]
}], ctorParameters: function () { return []; }, propDecorators: { title: [{
type: Input
}], width: [{
type: Input
}], height: [{
type: Input
}], icon: [{
type: Input
}], mode: [{
type: Input
}], charcase: [{
type: Input
}], closeOnValueEmited: [{
type: Input
}], color: [{
type: Input
}], close: [{
type: Output
}], tagValue: [{
type: Output
}], tlinput: [{
type: ViewChild,
args: ['input']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJ1bHktdWkvc3JjL2NvbXBvbmVudHMvdGFnL3RhZy50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3RydWx5LXVpL3NyYy9jb21wb25lbnRzL3RhZy90YWcuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUFvQkU7QUFFRixPQUFPLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBVSxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBb0IsTUFBTSxlQUFlLENBQUM7QUFDM0csT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDOzs7Ozs7QUFRbEQsTUFBTSxPQUFPLEtBQUs7SUFnQmhCLElBQ0ksS0FBSyxDQUFFLEtBQWE7UUFDdEIsTUFBTSxNQUFNLEdBQUc7WUFDYixLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTztZQUNwQixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztZQUN4QixPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztZQUN4QixXQUFXLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYTtZQUNoQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUztZQUN4QixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsUUFBUTtTQUN2QixDQUFDO1FBQ0YsSUFBSyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUc7WUFDbkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztTQUMvQjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7WUFDbkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDMUI7SUFDSCxDQUFDO0lBRUQsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3JCLENBQUM7SUFn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R0YsS0FBSztzQkFEUixLQUFLO2dCQXNCSSxLQUFLO3NCQUFkLE1BQU07Z0JBRUcsUUFBUTtzQkFBakIsTUFBTTtnQkFFZ0IsT0FBTztzQkFBN0IsU0FBUzt1QkFBRSxPQUFPIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgICBNSVQgTGljZW5zZVxuXG4gICAgQ29weXJpZ2h0IChjKSAyMDE5IFRlbWFpbmZvIFNvZnR3YXJlXG5cbiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gICAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICAgIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAgICB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gICAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAgICBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAgICBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAgICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAgICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gICAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICAgIFNPRlRXQVJFLlxuKi9cblxuaW1wb3J0IHtJbnB1dCwgQ29tcG9uZW50LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBWaWV3Q2hpbGQsIENoYW5nZURldGVjdG9yUmVmfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7S2V5RXZlbnR9IGZyb20gJy4uL2NvcmUvZW51bXMva2V5LWV2ZW50cyc7XG5pbXBvcnQge1RsSW5wdXR9IGZyb20gJy4uL2lucHV0L2lucHV0JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAndGwtdGFnJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3RhZy5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdGFnLnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgVGxUYWcgaW1wbGVtZW50cyBPbkluaXQge1xuXG4gIEBJbnB1dCgpIHRpdGxlID0gJ1RpdGxlIFRhZyc7XG5cbiAgQElucHV0KCkgd2lkdGggPSAnZml0LWNvbnRlbnQnO1xuXG4gIEBJbnB1dCgpIGhlaWdodCA9ICdhdXRvJztcblxuICBASW5wdXQoKSBpY29uID0gbnVsbDtcblxuICBASW5wdXQoKSBtb2RlOiAnZGVmYXVsdCcgfCAnY2xvc2VhYmxlJyB8ICdjbGlja2FibGUnIHwgJ2VkaXRhYmxlJyA9ICdkZWZhdWx0JztcblxuICBASW5wdXQoKSBjaGFyY2FzZTogJ3Vuc2V0JyB8ICdsb3dlcmNhc2UnIHwgJ2NhcGl0YWxpemUnIHwgJ3VwcGVyY2FzZScgfCAncmV2ZXJ0JyA9ICd1bnNldCc7XG5cbiAgQElucHV0KCkgY2xvc2VPblZhbHVlRW1pdGVkID0gdHJ1ZTtcblxuICBASW5wdXQoKVxuICBzZXQgY29sb3IoIHZhbHVlOiBzdHJpbmcgKSB7XG4gICAgY29uc3QgY29sb3JzID0ge1xuICAgICAgYmFzaWM6ICgpID0+ICdiYXNpYycsXG4gICAgICBwcmltYXJ5OiAoKSA9PiAncHJpbWFyeScsXG4gICAgICBzdWNjZXNzOiAoKSA9PiAnc3VjY2VzcycsXG4gICAgICBpbmZvcm1hdGlvbjogKCkgPT4gJ2luZm9ybWF0aW9uJyxcbiAgICAgIHdhcm5pbmc6ICgpID0+ICd3YXJuaW5nJyxcbiAgICAgIGRhbmdlcjogKCkgPT4gJ2RhbmdlcicsXG4gICAgfTtcbiAgICBpZiAoIGNvbG9yc1t2YWx1ZV0gKSB7XG4gICAgICB0aGlzLl9jb2xvciA9IGNvbG9yc1t2YWx1ZV0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fY29sb3IgPSBudWxsO1xuICAgICAgdGhpcy5jdXN0b21Db2xvciA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCBjb2xvcigpIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG4gIEBPdXRwdXQoKSB0YWdWYWx1ZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgQFZpZXdDaGlsZCggJ2lucHV0JyAgKSB0bGlucHV0OiBUbElucHV0O1xuXG4gIHByaXZhdGUgX2NvbG9yID0gJ2Jhc2ljJztcblxuICBwdWJsaWMgZWRpdGluZyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjdXN0b21Db2xvciA9ICcnO1xuXG4gIHB1YmxpYyBlZGl0YWJsZVZhbHVlID0gJyc7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIG5nT25Jbml0KCkge31cblxuICBvbkNsb3NlKCkge1xuICAgIHRoaXMuY2xvc2UuZW1pdCgpO1xuICB9XG5cbiAgb25DbGlja1RhZygpIHtcbiAgICBpZiAodGhpcy5tb2RlID09PSAnZWRpdGFibGUnKSB7XG4gICAgICB0aGlzLmVkaXRpbmcgPSB0cnVlO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudGxpbnB1dC5zZXRGb2N1cygpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25Db25maXJtVGV4dElucHV0ZWQoKSB7XG4gICAgdGhpcy5lbWl0RWRpdGFibGV2YWx1ZSgpO1xuICB9XG5cbiAgb25DbGVhclZhbHVlKCkge1xuICAgIHRoaXMucmVzZXRJbnB1dCgpO1xuICAgIHRoaXMuaGlkZUlucHV0KCB0cnVlICk7XG4gIH1cblxuICBvbklucHV0VmFsdWUoIHZhbHVlOiBLZXlib2FyZEV2ZW50ICkge1xuICAgIGlmICh2YWx1ZS5rZXkgPT09IEtleUV2ZW50LkVOVEVSKSB7XG4gICAgIHJldHVybiB0aGlzLmVtaXRFZGl0YWJsZXZhbHVlKCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5rZXkgPT09IEtleUV2ZW50LkVTQ0FQRSkge1xuICAgICAgdGhpcy5yZXNldElucHV0KCk7XG4gICAgICB0aGlzLmhpZGVJbnB1dCh0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGVtaXRFZGl0YWJsZXZhbHVlKCkge1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdlZGl0YWJsZScpIHtcbiAgICAgIGlmICggdGhpcy5lZGl0YWJsZVZhbHVlLnRyaW0oKSApIHtcbiAgICAgICAgdGhpcy50YWdWYWx1ZS5lbWl0KCB0aGlzLmVkaXRhYmxlVmFsdWUgKTtcbiAgICAgICAgdGhpcy5yZXNldElucHV0KCk7XG4gICAgICAgIHRoaXMuaGlkZUlucHV0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlc2V0SW5wdXQoKTtcbiAgICAgICAgdGhpcy5oaWRlSW5wdXQoIHRydWUgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0SW5wdXQoKSB7XG4gICAgdGhpcy5lZGl0YWJsZVZhbHVlID0gJyc7XG4gIH1cblxuICBwcml2YXRlIGhpZGVJbnB1dCggY2xvc2UgPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLmNsb3NlT25WYWx1ZUVtaXRlZCB8fCBjbG9zZSkge1xuICAgICAgdGhpcy5lZGl0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbn1cbiIsIjxkaXYgW2NsYXNzXT1cIid0bC10YWcgJyArIGNvbG9yXCIgW25nQ2xhc3NdPVwie2NsaWNrYWJsZTogbW9kZSA9PT0gJ2NsaWNrYWJsZScgfHwgJ2VkaXRhYmxlJ31cIj5cbiAgPGRpdiBjbGFzcz1cInRhZ1wiXG4gICAgICAgKm5nSWY9XCIhZWRpdGluZ1wiXG4gICAgICAgKGNsaWNrKT1cIm9uQ2xpY2tUYWcoKVwiXG4gICAgICAgW2NsYXNzLmN1c3RvbUNvbG9yXT1cImN1c3RvbUNvbG9yXCJcbiAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJjb2xvciB8fCBjdXN0b21Db2xvclwiXG4gICAgICAgW3N0eWxlLmhlaWdodF09XCJoZWlnaHRcIlxuICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgW3N0eWxlLmxpbmUtaGVpZ2h0XT1cImhlaWdodFwiPlxuICAgIDx0bC1pY29uICpuZ0lmPVwiaWNvblwiIFtzaXplXT1cIicwLjhlbSdcIiA+e3sgaWNvbiB9fTwvdGwtaWNvbj5cbiAgICA8c3BhbiBjbGFzcz1cImRlc2NyaXB0aW9uXCIgW3N0eWxlLnRleHRUcmFuc2Zvcm1dPVwiY2hhcmNhc2VcIj57eyB0aXRsZSB9fTwvc3Bhbj5cbiAgICA8dGwtaWNvbiAqbmdJZj1cIm1vZGUgPT09ICdjbG9zZWFibGUnXCIgY2xhc3M9XCJpY29uXCIgW2xpYl09XCInZmEnXCIgW3N0eWxlXT1cIidmYXMnXCIgW3NpemVdPVwiJzAuOWVtJ1wiIChjbGljayk9XCJvbkNsb3NlKClcIj50aW1lcy1jaXJjbGU8L3RsLWljb24+XG4gIDwvZGl2PlxuICA8ZGl2ICpuZ0lmPVwiZWRpdGluZyAmJiBtb2RlID09PSAnZWRpdGFibGUnXCIgY2xhc3M9XCJ0bC10YWctaW5wdXQtd3JhcHBlclwiPlxuICAgIDx0bC1pbnB1dCAjaW5wdXRcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJlZGl0YWJsZVZhbHVlXCJcbiAgICAgICAgICAgICAgW2hlaWdodF09XCJoZWlnaHRcIlxuICAgICAgICAgICAgICBbc3R5bGUud2lkdGhdPVwid2lkdGhcIlxuICAgICAgICAgICAgICBbY2xlYXJCdXR0b25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtpY29uQWZ0ZXJdPVwiJ2R4LWljb24gZHgtaWNvbi1jaGVjaydcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJvbklucHV0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChjbGVhcik9XCJvbkNsZWFyVmFsdWUoKVwiXG4gICAgICAgICAgICAgIChjbGlja0FkZG9uKT1cIm9uQ29uZmlybVRleHRJbnB1dGVkKClcIj48L3RsLWlucHV0PlxuICA8L2Rpdj5cbjwvZGl2PlxuIl19