lct-components
Version:
LCT basic components
225 lines • 32.5 kB
JavaScript
import { __awaiter } from "tslib";
import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core';
import { Subject } from "rxjs";
import { debounceTime } from "rxjs/operators";
import { NG_VALUE_ACCESSOR } from "@angular/forms";
import * as i0 from "@angular/core";
import * as i1 from "@angular/forms";
import * as i2 from "@angular/common";
export class InputTextComponent {
constructor(render) {
this.render = render;
this.disabled = false;
this.icon = '';
this.iconPosition = 'right';
this.pdaAutoEnter = false;
this.placeholder = '';
this.showIcon = false;
this.title = 'Insert Title';
this.type = 'text';
this.error = false;
this.id = ''; // ID en Button Opcional
this.transparent = false; // transparent style
this.enterEmitted = new EventEmitter();
this.iconClick = new EventEmitter();
this.inputClick = new EventEmitter();
this.inputValue = '';
this.selectionStart = 0;
this.selectionEnd = 0;
this.lpnUpdate = new Subject();
this.propagateChange = (_) => { };
this.lpnUpdate
.pipe(debounceTime(200)
/* distinctUntilChanged() */ // esto previene que el valor ser repita
)
.subscribe((value) => __awaiter(this, void 0, void 0, function* () {
if (value && this.pdaAutoEnter) {
this.enterEmit();
}
else {
if (!value) {
this.selectionStart = 0;
this.selectionEnd = 0;
}
return;
}
}));
}
// Propiedad calculada para generar el id dinámico
get inputId() {
return this.id ? `input-${this.id}` : null;
}
ngAfterViewInit() {
var _a, _b, _c, _d, _e, _f;
if (this.iconPosition === "left" && this.showIcon) {
this.render.addClass((_a = this.inputScan) === null || _a === void 0 ? void 0 : _a.nativeElement, 'iconLeft');
this.render.addClass((_b = this.iconDiv) === null || _b === void 0 ? void 0 : _b.nativeElement, 'iconLeft');
}
if (this.error) {
this.render.addClass((_c = this.inputScan) === null || _c === void 0 ? void 0 : _c.nativeElement, 'error');
this.render.addClass((_d = this.titleRef) === null || _d === void 0 ? void 0 : _d.nativeElement, 'error');
}
if (this.transparent) {
this.render.addClass((_e = this.inputScan) === null || _e === void 0 ? void 0 : _e.nativeElement, 'transparent');
this.render.addClass((_f = this.titleRef) === null || _f === void 0 ? void 0 : _f.nativeElement, 'transparent');
}
}
ngOnInit() {
}
ngOnChanges(changes) {
var _a, _b, _c, _d, _e, _f, _g, _h;
if (changes['pdaAutoEnter'] && !changes['pdaAutoEnter'].firstChange) {
this.pdaAutoEnter = changes['pdaAutoEnter'].currentValue;
}
if (changes['error'] && !changes['error'].firstChange) {
if (changes.error.currentValue) {
this.render.addClass((_a = this.inputScan) === null || _a === void 0 ? void 0 : _a.nativeElement, 'error');
this.render.addClass((_b = this.titleRef) === null || _b === void 0 ? void 0 : _b.nativeElement, 'error');
}
else {
this.render.removeClass((_c = this.inputScan) === null || _c === void 0 ? void 0 : _c.nativeElement, 'error');
this.render.removeClass((_d = this.titleRef) === null || _d === void 0 ? void 0 : _d.nativeElement, 'error');
}
}
if (changes['transparent'] && !changes['transparent'].firstChange) {
if (changes.error.currentValue) {
this.render.addClass((_e = this.inputScan) === null || _e === void 0 ? void 0 : _e.nativeElement, 'transparent');
this.render.addClass((_f = this.titleRef) === null || _f === void 0 ? void 0 : _f.nativeElement, 'transparent');
}
else {
this.render.addClass((_g = this.inputScan) === null || _g === void 0 ? void 0 : _g.nativeElement, 'transparent');
this.render.addClass((_h = this.titleRef) === null || _h === void 0 ? void 0 : _h.nativeElement, 'transparent');
}
}
}
writeValue(value) {
if (typeof value !== 'undefined') {
this.onKeyUpHandler(value);
}
}
registerOnChange(fn) {
this.propagateChange = fn;
}
registerOnTouched(fn) {
// console.log('reg touch', fn)
}
onKeyUpHandler(event) {
if (!this.inputValue && typeof event === 'string') {
this.inputValue = event;
}
if (this.inputValue && event === null) {
this.inputValue = '';
}
if (this.inputValue && typeof event === 'string' && event === '') {
this.inputValue = '';
}
this.propagateChange(this.inputValue);
}
click() {
if (!this.disabled) {
this.iconClick.emit('iconClick');
}
}
clickInput() {
if (!this.disabled) {
this.inputClick.emit('inputClick');
}
}
enterEmit() {
if (this.inputValue) {
this.enterEmitted.emit(this.inputValue);
}
}
onPaste(ev) {
var _a, _b, _c, _d;
ev.preventDefault();
const clipboard = (_a = ev.clipboardData) === null || _a === void 0 ? void 0 : _a.getData('Text');
if (clipboard) {
if (this.selectionEnd && this.selectionStart === ((_b = this.inputScan) === null || _b === void 0 ? void 0 : _b.nativeElement.selectionStart)) {
const slice1 = this.inputValue.slice(0, this.selectionStart);
const slice2 = this.inputValue.slice(this.selectionEnd);
this.inputValue = slice1 + clipboard + slice2;
setTimeout(() => {
var _a;
(_a = this.inputScan) === null || _a === void 0 ? void 0 : _a.nativeElement.setSelectionRange(slice1.length + clipboard.length, slice1.length + clipboard.length);
}, 20);
this.selectionStart = 0;
this.selectionEnd = 0;
}
else {
const slice1 = this.inputValue.slice(0, (_c = this.inputScan) === null || _c === void 0 ? void 0 : _c.nativeElement.selectionStart);
const slice2 = this.inputValue.slice((_d = this.inputScan) === null || _d === void 0 ? void 0 : _d.nativeElement.selectionStart);
this.inputValue = slice1 + clipboard + slice2;
setTimeout(() => {
var _a;
(_a = this.inputScan) === null || _a === void 0 ? void 0 : _a.nativeElement.setSelectionRange(slice1.length + clipboard.length, slice1.length + clipboard.length);
}, 20);
// this.inputValue = this.inputValue+clipboard;
}
}
}
selectionChange(ev) {
// console.log('selection asdf:', ev.target.value.substring(ev.target.selectionStart, ev.target.selectionEnd));
// console.log('start: ',ev.target.selectionStart, 'end:', ev.target.selectionEnd)
// this.selectedText = ev.target.value.substring(ev.target.selectionStart, ev.target.selectionEnd);
this.selectionStart = ev.target.selectionStart;
this.selectionEnd = ev.target.selectionEnd;
}
}
InputTextComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: InputTextComponent, deps: [{ token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component });
InputTextComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "12.1.5", type: InputTextComponent, selector: "lct-input-text", inputs: { disabled: "disabled", icon: "icon", iconPosition: "iconPosition", pdaAutoEnter: "pdaAutoEnter", placeholder: "placeholder", showIcon: "showIcon", title: "title", type: "type", error: "error", id: "id", transparent: "transparent" }, outputs: { enterEmitted: "enterEmitted", iconClick: "iconClick", inputClick: "inputClick" }, providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: InputTextComponent,
multi: true
}], viewQueries: [{ propertyName: "inputScan", first: true, predicate: ["inputScan"], descendants: true }, { propertyName: "titleRef", first: true, predicate: ["titleRef"], descendants: true }, { propertyName: "iconDiv", first: true, predicate: ["iconDiv"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\n <div #titleRef class=\"title\">\n {{title}}\n </div>\n <div class=\"input-with-icon iconLeft\">\n <input [attr.id]=\"inputId\"\n [type]=\"type\"\n class=\"form-control-lct\"\n #inputScan\n [disabled]=\"disabled\"\n [placeholder]=\"placeholder\"\n [(ngModel)]=\"inputValue\"\n (keydown.enter)=\"enterEmit()\"\n (keydown.tab)=\"enterEmit()\"\n (keyup)=\"onKeyUpHandler($event)\"\n (click)=\"clickInput()\"\n (ngModelChange)=\"lpnUpdate.next(inputScan.value);\"\n (paste)=\"onPaste($event)\"\n (select)=\"selectionChange($event)\"\n >\n <div class=\"icon\" #iconDiv *ngIf=\"showIcon\">\n <img [src]=\"icon\" [ngStyle]=\"{'cursor': disabled ? 'not-allowed' : 'pointer'}\" alt=\"\" (click)=\"click()\">\n </div>\n </div>\n</div>\n", styles: ["*{font-family:\"Barlow\",\"Open Sans\",\"Helvetica Neue\",\"Segoe UI\",\"Calibri\",\"Arial\",sans-serif}.title{color:#3c4149;font-size:12px;letter-spacing:0;line-height:15px;margin-left:2px;margin-bottom:5px}.title.error{color:#c60e4c}.input-with-icon{box-sizing:border-box;position:relative;height:40px}.form-control-lct::placeholder{color:#3c4149}.input-with-icon .form-control-lct{height:100%;width:100%;border:0;border-radius:4px;background-color:#e0e5ee;box-sizing:border-box;color:#3c4149;font-size:14px;font-weight:400;letter-spacing:0;line-height:17px;padding:12px 20px 12px 15px}.input-with-icon .form-control-lct.error{color:#c60e4c;border:1px solid #C60E4C}.input-with-icon .form-control-lct.iconLeft{padding:12px 20px 12px 60px}.input-with-icon .form-control-lct:disabled{cursor:not-allowed;background-color:#f5f7fa;color:#c8ccd4}.input-with-icon .form-control-lct:focus-visible{outline:unset}.input-with-icon .form-control-lct.transparent{background-color:#fff;color:#fff}.input-with-icon .icon{position:absolute;right:1%;top:.01rem;width:2.6rem;height:2.6rem;border-radius:.3rem;display:flex;justify-content:center;align-items:center;box-sizing:border-box}.input-with-icon .icon :hover{cursor:pointer}@media (max-width: 375px){.input-with-icon .icon{top:.3rem}}.input-with-icon .icon.iconLeft{left:15px}\n"], directives: [{ 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.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.1.5", ngImport: i0, type: InputTextComponent, decorators: [{
type: Component,
args: [{
selector: 'lct-input-text',
templateUrl: './input-text.component.html',
styleUrls: ['./input-text.component.scss'],
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: InputTextComponent,
multi: true
}]
}]
}], ctorParameters: function () { return [{ type: i0.Renderer2 }]; }, propDecorators: { disabled: [{
type: Input
}], icon: [{
type: Input
}], iconPosition: [{
type: Input
}], pdaAutoEnter: [{
type: Input
}], placeholder: [{
type: Input
}], showIcon: [{
type: Input
}], title: [{
type: Input
}], type: [{
type: Input
}], error: [{
type: Input
}], id: [{
type: Input
}], transparent: [{
type: Input
}], enterEmitted: [{
type: Output
}], iconClick: [{
type: Output
}], inputClick: [{
type: Output
}], inputScan: [{
type: ViewChild,
args: ['inputScan']
}], titleRef: [{
type: ViewChild,
args: ['titleRef']
}], iconDiv: [{
type: ViewChild,
args: ['iconDiv']
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGV4dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL2lucHV0LXRleHQvaW5wdXQtdGV4dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9sY3QtY29tcG9uZW50cy9zcmMvbGliL2lucHV0LXRleHQvaW5wdXQtdGV4dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFFTixTQUFTLEVBQ1YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQixPQUFPLEVBQUUsWUFBWSxFQUF3QixNQUFNLGdCQUFnQixDQUFDO0FBQ3BFLE9BQU8sRUFBd0IsaUJBQWlCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQWF6RSxNQUFNLE9BQU8sa0JBQWtCO0lBZ0M3QixZQUFvQixNQUFpQjtRQUFqQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBOUI1QixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFNBQUksR0FBNkIsRUFBRSxDQUFBO1FBQ25DLGlCQUFZLEdBQXFCLE9BQU8sQ0FBQztRQUN6QyxpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixnQkFBVyxHQUFHLEVBQUUsQ0FBQztRQUNqQixhQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ2pCLFVBQUssR0FBRyxjQUFjLENBQUM7UUFDdkIsU0FBSSxHQUFnQyxNQUFNLENBQUM7UUFDM0MsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixPQUFFLEdBQVksRUFBRSxDQUFDLENBQUMsd0JBQXdCO1FBQzFDLGdCQUFXLEdBQWEsS0FBSyxDQUFDLENBQUMsb0JBQW9CO1FBQ2xELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQVUs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QkFBcEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csUUFBUTtzQkFBaEIsS0FBSztnQkFDRyxLQUFLO3NCQUFiLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxFQUFFO3NCQUFWLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDaUIsU0FBUztzQkFBaEMsU0FBUzt1QkFBQyxXQUFXO2dCQUNDLFFBQVE7c0JBQTlCLFNBQVM7dUJBQUMsVUFBVTtnQkFDQyxPQUFPO3NCQUE1QixTQUFTO3VCQUFDLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBBZnRlclZpZXdJbml0LFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSW5wdXQsIE9uQ2hhbmdlcyxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFJlbmRlcmVyMiwgU2ltcGxlQ2hhbmdlcyxcbiAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSBcInJ4anMvb3BlcmF0b3JzXCI7XG5pbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tIFwiQGFuZ3VsYXIvZm9ybXNcIjtcbmltcG9ydCB7IFNhZmVSZXNvdXJjZVVybCB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsY3QtaW5wdXQtdGV4dCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC10ZXh0LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtdGV4dC5jb21wb25lbnQuc2NzcyddLFxuICBwcm92aWRlcnM6IFt7XG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgdXNlRXhpc3Rpbmc6IElucHV0VGV4dENvbXBvbmVudCxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XVxufSlcbmV4cG9ydCBjbGFzcyBJbnB1dFRleHRDb21wb25lbnQgaW1wbGVtZW50cyBDb250cm9sVmFsdWVBY2Nlc3NvciwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMge1xuXG4gIEBJbnB1dCgpIGRpc2FibGVkID0gZmFsc2U7XG4gIEBJbnB1dCgpIGljb246IHN0cmluZyB8IFNhZmVSZXNvdXJjZVVybCA9ICcnXG4gIEBJbnB1dCgpIGljb25Qb3NpdGlvbjogJ2xlZnQnIHwgJ3JpZ2h0JyA9ICdyaWdodCc7XG4gIEBJbnB1dCgpIHBkYUF1dG9FbnRlciA9IGZhbHNlO1xuICBASW5wdXQoKSBwbGFjZWhvbGRlciA9ICcnO1xuICBASW5wdXQoKSBzaG93SWNvbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0aXRsZSA9ICdJbnNlcnQgVGl0bGUnO1xuICBASW5wdXQoKSB0eXBlOiAnZW1haWwnIHwgJ251bWJlcicgfCAndGV4dCcgPSAndGV4dCc7XG4gIEBJbnB1dCgpIGVycm9yOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGlkPzogc3RyaW5nID0gJyc7IC8vIElEIGVuIEJ1dHRvbiBPcGNpb25hbFxuICBASW5wdXQoKSB0cmFuc3BhcmVudD86IGJvb2xlYW4gPSBmYWxzZTsgLy8gdHJhbnNwYXJlbnQgc3R5bGVcbiAgQE91dHB1dCgpIGVudGVyRW1pdHRlZCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpXG4gIEBPdXRwdXQoKSBpY29uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIEBPdXRwdXQoKSBpbnB1dENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICBAVmlld0NoaWxkKCdpbnB1dFNjYW4nKSBpbnB1dFNjYW46IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ3RpdGxlUmVmJykgdGl0bGVSZWY6IEVsZW1lbnRSZWYgfCB1bmRlZmluZWQ7XG4gIEBWaWV3Q2hpbGQoJ2ljb25EaXYnKSBpY29uRGl2OiBFbGVtZW50UmVmIHwgdW5kZWZpbmVkO1xuXG4gIGlucHV0VmFsdWUgPSAnJztcbiAgcHJpdmF0ZSBzZWxlY3Rpb25TdGFydCA9IDA7XG4gIHByaXZhdGUgc2VsZWN0aW9uRW5kID0gMDtcbiAgcHVibGljIGxwblVwZGF0ZSA9IG5ldyBTdWJqZWN0PHN0cmluZz4oKTtcblxuICBwdWJsaWMgcHJvcGFnYXRlQ2hhbmdlID0gKF86IGFueSkgPT4geyB9O1xuICBcbiAgLy8gUHJvcGllZGFkIGNhbGN1bGFkYSBwYXJhIGdlbmVyYXIgZWwgaWQgZGluw6FtaWNvXG4gIGdldCBpbnB1dElkKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLmlkID8gYGlucHV0LSR7dGhpcy5pZH1gIDogbnVsbDtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVuZGVyOiBSZW5kZXJlcjIpIHtcbiAgICB0aGlzLmxwblVwZGF0ZVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgyMDApXG4gICAgIC8qICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCkgKi8gLy8gZXN0byBwcmV2aWVuZSBxdWUgZWwgdmFsb3Igc2VyIHJlcGl0YVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZShhc3luYyB2YWx1ZSA9PiB7XG4gICAgICAgIGlmICh2YWx1ZSAmJiB0aGlzLnBkYUF1dG9FbnRlcikge1xuICAgICAgICAgIHRoaXMuZW50ZXJFbWl0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKCF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IDBcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uRW5kID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICBpZiAodGhpcy5pY29uUG9zaXRpb24gPT09IFwibGVmdFwiICYmIHRoaXMuc2hvd0ljb24pIHtcbiAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKHRoaXMuaW5wdXRTY2FuPy5uYXRpdmVFbGVtZW50LCAnaWNvbkxlZnQnKVxuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5pY29uRGl2Py5uYXRpdmVFbGVtZW50LCAnaWNvbkxlZnQnKVxuICAgIH1cbiAgICBpZiAodGhpcy5lcnJvcikge1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQsICdlcnJvcicpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy50aXRsZVJlZj8ubmF0aXZlRWxlbWVudCwgJ2Vycm9yJyk7XG4gICAgfVxuICAgIGlmKHRoaXMudHJhbnNwYXJlbnQpe1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc3BhcmVudCcpO1xuICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy50aXRsZVJlZj8ubmF0aXZlRWxlbWVudCwgJ3RyYW5zcGFyZW50Jyk7XG4gICAgfVxuXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBpZiAoY2hhbmdlc1sncGRhQXV0b0VudGVyJ10gJiYgIWNoYW5nZXNbJ3BkYUF1dG9FbnRlciddLmZpcnN0Q2hhbmdlKSB7ICAgICAgXG4gICAgICB0aGlzLnBkYUF1dG9FbnRlciA9IGNoYW5nZXNbJ3BkYUF1dG9FbnRlciddLmN1cnJlbnRWYWx1ZTtcbiAgICB9XG4gICAgaWYgKGNoYW5nZXNbJ2Vycm9yJ10gJiYgIWNoYW5nZXNbJ2Vycm9yJ10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmVycm9yLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLmlucHV0U2Nhbj8ubmF0aXZlRWxlbWVudCwgJ2Vycm9yJyk7XG4gICAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKHRoaXMudGl0bGVSZWY/Lm5hdGl2ZUVsZW1lbnQsICdlcnJvcicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXIucmVtb3ZlQ2xhc3ModGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQsICdlcnJvcicpO1xuICAgICAgICB0aGlzLnJlbmRlci5yZW1vdmVDbGFzcyh0aGlzLnRpdGxlUmVmPy5uYXRpdmVFbGVtZW50LCAnZXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgaWYgKGNoYW5nZXNbJ3RyYW5zcGFyZW50J10gJiYgIWNoYW5nZXNbJ3RyYW5zcGFyZW50J10uZmlyc3RDaGFuZ2UpIHtcbiAgICAgIGlmIChjaGFuZ2VzLmVycm9yLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLmlucHV0U2Nhbj8ubmF0aXZlRWxlbWVudCwgJ3RyYW5zcGFyZW50Jyk7XG4gICAgICAgIHRoaXMucmVuZGVyLmFkZENsYXNzKHRoaXMudGl0bGVSZWY/Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc3BhcmVudCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5yZW5kZXIuYWRkQ2xhc3ModGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQsICd0cmFuc3BhcmVudCcpO1xuICAgICAgICB0aGlzLnJlbmRlci5hZGRDbGFzcyh0aGlzLnRpdGxlUmVmPy5uYXRpdmVFbGVtZW50LCAndHJhbnNwYXJlbnQnKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHRoaXMub25LZXlVcEhhbmRsZXIodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xuICAgIHRoaXMucHJvcGFnYXRlQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XG4gICAgLy8gY29uc29sZS5sb2coJ3JlZyB0b3VjaCcsIGZuKVxuICB9XG5cbiAgb25LZXlVcEhhbmRsZXIoZXZlbnQ/OiBLZXlib2FyZEV2ZW50IHwgc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLmlucHV0VmFsdWUgJiYgdHlwZW9mIGV2ZW50ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gZXZlbnQ7XG4gICAgfVxuICAgIGlmICh0aGlzLmlucHV0VmFsdWUgJiYgZXZlbnQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuaW5wdXRWYWx1ZSA9ICcnO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbnB1dFZhbHVlICYmIHR5cGVvZiBldmVudCA9PT0gJ3N0cmluZycgJiYgZXZlbnQgPT09ICcnKSB7XG4gICAgICB0aGlzLmlucHV0VmFsdWUgPSAnJztcbiAgICB9XG4gICAgdGhpcy5wcm9wYWdhdGVDaGFuZ2UodGhpcy5pbnB1dFZhbHVlKTtcbiAgfVxuXG4gIGNsaWNrKCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pY29uQ2xpY2suZW1pdCgnaWNvbkNsaWNrJylcbiAgICB9XG4gIH1cblxuICBjbGlja0lucHV0KCkge1xuICAgIGlmICghdGhpcy5kaXNhYmxlZCkge1xuICAgICAgdGhpcy5pbnB1dENsaWNrLmVtaXQoJ2lucHV0Q2xpY2snKVxuICAgIH1cbiAgfVxuXG4gIGVudGVyRW1pdCgpIHtcbiAgICBpZiAodGhpcy5pbnB1dFZhbHVlKSB7XG4gICAgICB0aGlzLmVudGVyRW1pdHRlZC5lbWl0KHRoaXMuaW5wdXRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25QYXN0ZShldjogQ2xpcGJvYXJkRXZlbnQpIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNsaXBib2FyZCA9IGV2LmNsaXBib2FyZERhdGE/LmdldERhdGEoJ1RleHQnKTtcbiAgICBpZiAoY2xpcGJvYXJkKSB7XG4gICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmQgJiYgdGhpcy5zZWxlY3Rpb25TdGFydCA9PT0gdGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpIHtcbiAgICAgICAgY29uc3Qgc2xpY2UxID0gdGhpcy5pbnB1dFZhbHVlLnNsaWNlKDAsIHRoaXMuc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICBjb25zdCBzbGljZTIgPSB0aGlzLmlucHV0VmFsdWUuc2xpY2UodGhpcy5zZWxlY3Rpb25FbmQpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBzbGljZTEgKyBjbGlwYm9hcmQgKyBzbGljZTI7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5wdXRTY2FuPy5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNsaWNlMS5sZW5ndGggKyBjbGlwYm9hcmQubGVuZ3RoLCBzbGljZTEubGVuZ3RoICsgY2xpcGJvYXJkLmxlbmd0aClcbiAgICAgICAgfSwgMjApXG4gICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhcnQgPSAwO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBzbGljZTEgPSB0aGlzLmlucHV0VmFsdWUuc2xpY2UoMCwgdGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICBjb25zdCBzbGljZTIgPSB0aGlzLmlucHV0VmFsdWUuc2xpY2UodGhpcy5pbnB1dFNjYW4/Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0aW9uU3RhcnQpO1xuICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSBzbGljZTEgKyBjbGlwYm9hcmQgKyBzbGljZTI7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5wdXRTY2FuPy5uYXRpdmVFbGVtZW50LnNldFNlbGVjdGlvblJhbmdlKHNsaWNlMS5sZW5ndGggKyBjbGlwYm9hcmQubGVuZ3RoLCBzbGljZTEubGVuZ3RoICsgY2xpcGJvYXJkLmxlbmd0aClcbiAgICAgICAgfSwgMjApXG4gICAgICAgIC8vIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZStjbGlwYm9hcmQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0aW9uQ2hhbmdlKGV2OiBhbnkpIHtcbiAgICAvLyBjb25zb2xlLmxvZygnc2VsZWN0aW9uIGFzZGY6JywgZXYudGFyZ2V0LnZhbHVlLnN1YnN0cmluZyhldi50YXJnZXQuc2VsZWN0aW9uU3RhcnQsIGV2LnRhcmdldC5zZWxlY3Rpb25FbmQpKTtcbiAgICAvLyBjb25zb2xlLmxvZygnc3RhcnQ6ICcsZXYudGFyZ2V0LnNlbGVjdGlvblN0YXJ0LCAnZW5kOicsIGV2LnRhcmdldC5zZWxlY3Rpb25FbmQpXG4gICAgLy8gdGhpcy5zZWxlY3RlZFRleHQgPSBldi50YXJnZXQudmFsdWUuc3Vic3RyaW5nKGV2LnRhcmdldC5zZWxlY3Rpb25TdGFydCwgZXYudGFyZ2V0LnNlbGVjdGlvbkVuZCk7XG4gICAgdGhpcy5zZWxlY3Rpb25TdGFydCA9IGV2LnRhcmdldC5zZWxlY3Rpb25TdGFydDtcbiAgICB0aGlzLnNlbGVjdGlvbkVuZCA9IGV2LnRhcmdldC5zZWxlY3Rpb25FbmQ7XG4gIH1cblxuXG59XG4iLCI8ZGl2PlxuICA8ZGl2ICN0aXRsZVJlZiBjbGFzcz1cInRpdGxlXCI+XG4gICAge3t0aXRsZX19XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtd2l0aC1pY29uIGljb25MZWZ0XCI+XG4gICAgPGlucHV0IFthdHRyLmlkXT1cImlucHV0SWRcIlxuICAgICAgICAgICBbdHlwZV09XCJ0eXBlXCJcbiAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wtbGN0XCJcbiAgICAgICAgICAgI2lucHV0U2NhblxuICAgICAgICAgICBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIlxuICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIlxuICAgICAgICAgICBbKG5nTW9kZWwpXT1cImlucHV0VmFsdWVcIlxuICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJlbnRlckVtaXQoKVwiXG4gICAgICAgICAgIChrZXlkb3duLnRhYik9XCJlbnRlckVtaXQoKVwiXG4gICAgICAgICAgIChrZXl1cCk9XCJvbktleVVwSGFuZGxlcigkZXZlbnQpXCJcbiAgICAgICAgICAgKGNsaWNrKT1cImNsaWNrSW5wdXQoKVwiXG4gICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImxwblVwZGF0ZS5uZXh0KGlucHV0U2Nhbi52YWx1ZSk7XCJcbiAgICAgICAgICAgKHBhc3RlKT1cIm9uUGFzdGUoJGV2ZW50KVwiXG4gICAgICAgICAgIChzZWxlY3QpPVwic2VsZWN0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgID5cbiAgICA8ZGl2IGNsYXNzPVwiaWNvblwiICNpY29uRGl2ICpuZ0lmPVwic2hvd0ljb25cIj5cbiAgICAgIDxpbWcgW3NyY109XCJpY29uXCIgW25nU3R5bGVdPVwieydjdXJzb3InOiBkaXNhYmxlZCA/ICdub3QtYWxsb3dlZCcgOiAncG9pbnRlcid9XCIgYWx0PVwiXCIgKGNsaWNrKT1cImNsaWNrKClcIj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbiJdfQ==