UNPKG

@duoduo-oba/ng-devui

Version:

DevUI components based on Angular

395 lines 39.1 kB
/** * @fileoverview added by tsickle * Generated from: multi-auto-complete.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, Input, Output, TemplateRef, ElementRef, EventEmitter, ViewChild, ChangeDetectorRef, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { of } from 'rxjs'; import { AutoCompleteDirective } from '@duoduo-oba/ng-devui/auto-complete'; export class MultiAutoCompleteComponent { /** * @param {?} changeDetectorRef */ constructor(changeDetectorRef) { this.changeDetectorRef = changeDetectorRef; /* overview: border none multiline single */ this.overview = 'border'; // 提示文字 this.placeholder = '请输入关键字'; // placeholder // placeholder this.disabled = false; this.autoSubmit = new EventEmitter(); // 失焦自动提交 this.multiItems = []; this.multipleLabelClassNameSuffix = this.overview; this.inputEdit = false; this.multipleLabelClassNameConfig = { 'border': { 'focus': 'border', 'blur': 'border' }, 'none': { 'focus': 'border', 'blur': 'none' }, 'multiline': { 'focus': 'multiline', 'blur': 'multiline' }, 'single': { 'focus': 'single-focus', 'blur': 'single' } }; this.clonePlaceholder = this.placeholder; this.placement = 'bottom-left'; this.onChange = (/** * @param {?} _ * @return {?} */ (_) => null); this.onTouched = (/** * @return {?} */ () => null); this.formatter = (/** * @param {?} item * @return {?} */ (item) => item ? (item.label || item.toString()) : ''); this.valueParser = (/** * @param {?} item * @return {?} */ (item) => item); this.id = MultiAutoCompleteComponent.ID_SEED++; } /** * @return {?} */ get placeholderView() { if (this.multiItems.length > 0) { return ''; } else { return this.placeholder; } } /** * @param {?} obj * @return {?} */ writeValue(obj) { /** @type {?} */ const value = obj || []; this.multiItems = value; if (this.overview === 'single') { this.inputEdit = this.multiItems.length === 0; } this.setSinglePlaceholder(); this.changeDetectorRef.markForCheck(); } /** * @return {?} */ ngOnInit() { if (this.source && !this.searchFn) { this.searchFn = (/** * @param {?} term * @return {?} */ (term) => { return of(this.source .filter((/** * @param {?} lang * @return {?} */ lang => this.multiItems.indexOf(lang) === -1 && lang.toLowerCase().indexOf(term.toLowerCase()) !== -1))); }); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes && changes['overview']) { this.multipleLabelClassNameSuffix = changes['overview'].currentValue; } if (changes && changes['placeholder']) { this.clonePlaceholder = changes['placeholder'].currentValue; } } /** * @param {?} fn * @return {?} */ registerOnChange(fn) { this.onChange = fn; } /** * @param {?} fn * @return {?} */ registerOnTouched(fn) { this.onTouched = fn; } /** * @param {?} $event * @return {?} */ singleClick($event) { this.inputEdit = true; } /** * @param {?=} item * @return {?} */ onMultipleSearch(item) { if (this.overview !== 'single' && item) { /** @type {?} */ let inArray = false; for (let i = 0; i < this.multiItems.length; i++) { if (item.label) { if (item.label === this.multiItems[i].label) { inArray = true; break; } } else { if (item === this.multiItems[i]) { inArray = true; break; } } } if (!inArray) { this.multiItems.push(item); } else { this.multiItems = this.multiItems.filter((/** * @param {?} data * @return {?} */ data => { if (data.label) { return data.label !== item.label; } else { return data !== item; } })); } } else if (this.overview === 'single' && item) { this.multiItems = []; this.multiItems.push(item); this.inputEdit = false; this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['blur']; } this.setSinglePlaceholder(); this.autoSubmit.emit(this.multiItems); this.onChange(this.multiItems); this.inputValue = null; this.multiAutoCompleteInputElement.nativeElement.value = ''; } /** * @param {?} label * @return {?} */ removeLabel(label) { if (this.multiItems.indexOf(label) !== -1) { this.multiItems = this.multiItems.filter((/** * @param {?} item * @return {?} */ item => item !== label)); } this.setSinglePlaceholder(); this.autoSubmit.emit(this.multiItems); this.onChange(this.multiItems); } /** * @param {?} $event * @return {?} */ getInputFocusFlag($event) { this.inputEdit = this.multiItems.length === 0 || $event.focus; this.popupRef = $event.popupRef; this.setSinglePlaceholder(); if ($event.focus) { this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['focus']; setTimeout((/** * @return {?} */ () => { this.multiAutoCompleteInputElement.nativeElement.focus(); }), 0); } else { this.multipleLabelClassNameSuffix = this.multipleLabelClassNameConfig[this.overview]['blur']; this.inputValue = null; this.multiAutoCompleteInputElement.nativeElement.value = ''; this.autoSubmit.emit(this.multiItems); } } /** * @param {?} $event * @param {?} inputValue * @return {?} */ onBackspaceKeyUp($event, inputValue) { if (this.multiItems.length > 0 && !inputValue) { this.multiItems.pop(); } this.setSinglePlaceholder(); this.autoSubmit.emit(this.multiItems); this.onChange(this.multiItems); } /** * @return {?} */ setSinglePlaceholder() { if (this.overview === 'single') { if (this.multiItems && this.multiItems.length > 0) { this.placeholder = ''; } else { this.placeholder = this.clonePlaceholder; } } } } MultiAutoCompleteComponent.ID_SEED = 0; MultiAutoCompleteComponent.decorators = [ { type: Component, args: [{ selector: 'd-multi-auto-complete', template: "<div class=\"form-group multi-auto-complete\">\r\n <label\r\n for=\"multiple-label-auto-complete-{{ id }}\"\r\n class=\"multiple-label-auto-complete multiple-label-auto-complete-{{ multipleLabelClassNameSuffix }}\"\r\n [ngClass]=\"{ 'multiple-label-auto-complete-disabled': disabled }\"\r\n >\r\n <ul *ngIf=\"overview !== 'single'\">\r\n <li *ngFor=\"let item of multiItems\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"disabled || (overview === 'none' && !inputEdit) ? transparentTemplate : defaultTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n item: item,\r\n formatter: formatter,\r\n parent: multiItems\r\n }\"\r\n ></ng-template>\r\n </li>\r\n <li *ngIf=\"!disabled\">\r\n <input\r\n #multiAutoCompleteInput\r\n id=\"multiple-label-auto-complete-{{ id }}\"\r\n type=\"text\"\r\n name=\"autoCompleteControl\"\r\n class=\"auto-complete-control\"\r\n [placeholder]=\"placeholderView\"\r\n [tipsText]=\"tipsText\"\r\n [latestSource]=\"latestSource\"\r\n (selectValue)=\"onMultipleSearch($event)\"\r\n (transInputFocusEmit)=\"getInputFocusFlag($event)\"\r\n (keydown.backspace)=\"onBackspaceKeyUp($event, inputValue)\"\r\n [formatter]=\"formatter\"\r\n [valueParser]=\"valueParser\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [cssClass]=\"cssClass\"\r\n [overview]=\"overview\"\r\n [disabled]=\"disabled\"\r\n [(ngModel)]=\"inputValue\"\r\n [delay]=\"delay\"\r\n dAutoComplete\r\n [searchFn]=\"searchFn\"\r\n />\r\n </li>\r\n </ul>\r\n\r\n <!--\u5355\u9009\u6A21\u677F-->\r\n <ul *ngIf=\"overview === 'single'\" title=\"{{ formatter(multiItems[0]) }}\" (click)=\"singleClick($event)\">\r\n <li *ngFor=\"let item of multiItems\">\r\n <ng-template\r\n [ngTemplateOutlet]=\"transparentTemplate\"\r\n [ngTemplateOutletContext]=\"{\r\n item: item,\r\n formatter: formatter,\r\n parent: multiItems\r\n }\"\r\n ></ng-template>\r\n </li>\r\n <li *ngIf=\"!disabled && inputEdit\">\r\n <input\r\n #multiAutoCompleteInput\r\n id=\"multiple-label-auto-complete-{{ id }}\"\r\n type=\"text\"\r\n name=\"autoCompleteControl\"\r\n class=\"auto-complete-control\"\r\n [placeholder]=\"placeholder\"\r\n [tipsText]=\"tipsText\"\r\n [latestSource]=\"latestSource\"\r\n (selectValue)=\"onMultipleSearch($event)\"\r\n (transInputFocusEmit)=\"getInputFocusFlag($event)\"\r\n (keydown.backspace)=\"onBackspaceKeyUp($event, inputValue)\"\r\n [formatter]=\"formatter\"\r\n [valueParser]=\"valueParser\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [noResultItemTemplate]=\"noResultItemTemplate\"\r\n [cssClass]=\"cssClass\"\r\n [overview]=\"overview\"\r\n [disabled]=\"disabled\"\r\n [(ngModel)]=\"inputValue\"\r\n [delay]=\"delay\"\r\n dAutoComplete\r\n [searchFn]=\"searchFn\"\r\n />\r\n </li>\r\n </ul>\r\n </label>\r\n</div>\r\n\r\n<!--\u9EC4\u5E95\u6A21\u677F-->\r\n<ng-template #defaultTemplate let-item=\"item\" let-formatter=\"formatter\">\r\n <span class=\"label-item\">\r\n <span class=\"label label-text\">{{ formatter(item) }}</span\r\n ><span class=\"label label-close\" (click)=\"removeLabel(item)\">&times;</span></span\r\n >\r\n</ng-template>\r\n\r\n<!--\u65E0\u5E95\u8272\u6A21\u677F-->\r\n<ng-template #transparentTemplate let-item=\"item\" let-formatter=\"formatter\" let-parent=\"parent\">\r\n <span class=\"label label-text\">{{ formatter(item) }}{{ parent.length > 1 ? ';' : '' }}</span>\r\n</ng-template>\r\n", providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => MultiAutoCompleteComponent)), multi: true }], styles: [".form-group label{cursor:pointer;font-size:14px;margin-bottom:0;width:100%}.multiple-label-auto-complete{padding:0;font-weight:400}.multiple-label-auto-complete ul{display:block;list-style:none;background-color:#fff;border-radius:1px;padding:5px 5px 0}.multiple-label-auto-complete-border ul,.multiple-label-auto-complete-multiline ul,.multiple-label-auto-complete-single ul,.multiple-label-auto-complete-single-focus ul{border:1px solid #adb0b8}.multiple-label-auto-complete-border ul:active,.multiple-label-auto-complete-border ul:hover,.multiple-label-auto-complete-multiline ul:active,.multiple-label-auto-complete-multiline ul:hover,.multiple-label-auto-complete-single ul:active,.multiple-label-auto-complete-single ul:hover,.multiple-label-auto-complete-single-focus ul:active,.multiple-label-auto-complete-single-focus ul:hover{border-color:#344899}.multiple-label-auto-complete-single ul,.multiple-label-auto-complete-single-focus ul{overflow:hidden}.multiple-label-auto-complete-multiline ul{height:60px;overflow:auto}.multiple-label-auto-complete-none ul{border:1px solid transparent}.multiple-label-auto-complete-none ul:active,.multiple-label-auto-complete-none ul:hover{border-color:transparent}.multiple-label-auto-complete-disabled ul{cursor:default}.multiple-label-auto-complete-disabled ul:active,.multiple-label-auto-complete-disabled ul:hover{border-color:#adb0b8}.multiple-label-auto-complete ul::-ms-expand{border:0;background-color:transparent}::-ms-clear,::-ms-reveal{display:none}.multiple-label-auto-complete ul li{display:inline-block;position:relative;margin-right:5px;margin-bottom:5px}.multiple-label-auto-complete-none ul li{margin-right:0}.multiple-label-auto-complete-multiline ul li,.multiple-label-auto-complete-single ul li,.multiple-label-auto-complete-single-focus ul li{position:static}.multiple-label-auto-complete-single ul li,.multiple-label-auto-complete-single-focus ul li{float:left;width:100%}.multiple-label-auto-complete-single-focus ul li:first-child{max-width:calc(100% - 5px);margin-right:0;width:auto}.multiple-label-auto-complete-single-focus ul li:last-child{width:5px;margin-right:0;margin-left:0}.multiple-label-auto-complete ul li .label-close,.multiple-label-auto-complete ul li .label-text{border-radius:0;font-size:14px;padding:1px 2px;color:#252b3a;font-weight:400;background-color:#eef0f5}.multiple-label-auto-complete ul li .label-close{cursor:pointer}.multiple-label-auto-complete-disabled ul li .label-text,.multiple-label-auto-complete-none ul li .label-text,.multiple-label-auto-complete-single ul li .label-text,.multiple-label-auto-complete-single-focus ul li .label-text{background-color:transparent}.multiple-label-auto-complete-single ul li .label-text{width:100%;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;height:20px;line-height:20px}.multiple-label-auto-complete-single-focus ul li .label-text{width:100%;direction:rtl;text-align:left;display:block;height:20px;line-height:20px}.multiple-label-auto-complete .auto-complete-control{height:20px;border:none;outline:0;background:#fff;color:#252b3a;position:relative}.multiple-label-auto-complete .auto-complete-control:focus,.multiple-label-auto-complete .auto-complete-control:hover{border:none;outline:0}.multiple-label-auto-complete-none .auto-complete-control{width:0}:host label{color:inherit}:host ::ng-deep .multiple-label-auto-complete-border ul li .dropdown-menu{margin-top:6px}:host ::ng-deep .multiple-label-auto-complete-multiline ul li .dropdown-menu{margin-top:0;width:170px}:host-context(d-data-table) .multiple-label-auto-complete-single ul,:host-context(d-data-table) .multiple-label-auto-complete-single ul li .auto-complete-control{border-color:transparent;background-color:transparent}:host-context(d-data-table) .multiple-label-auto-complete-single ul{padding-left:0}"] }] } ]; /** @nocollapse */ MultiAutoCompleteComponent.ctorParameters = () => [ { type: ChangeDetectorRef } ]; MultiAutoCompleteComponent.propDecorators = { cssClass: [{ type: Input }], overview: [{ type: Input }], tipsText: [{ type: Input }], placeholder: [{ type: Input }], disabled: [{ type: Input }], source: [{ type: Input }], latestSource: [{ type: Input }], isOpen: [{ type: Input }], term: [{ type: Input }], itemTemplate: [{ type: Input }], noResultItemTemplate: [{ type: Input }], dropdown: [{ type: Input }], minLength: [{ type: Input }], delay: [{ type: Input }], searchFn: [{ type: Input }], formatter: [{ type: Input }], valueParser: [{ type: Input }], autoSubmit: [{ type: Output }], multiAutoCompleteInputElement: [{ type: ViewChild, args: ['multiAutoCompleteInput', { static: false },] }], autoCompleteDirective: [{ type: ViewChild, args: [AutoCompleteDirective, { static: false },] }] }; if (false) { /** @type {?} */ MultiAutoCompleteComponent.ID_SEED; /** @type {?} */ MultiAutoCompleteComponent.prototype.cssClass; /** @type {?} */ MultiAutoCompleteComponent.prototype.overview; /** @type {?} */ MultiAutoCompleteComponent.prototype.tipsText; /** @type {?} */ MultiAutoCompleteComponent.prototype.placeholder; /** @type {?} */ MultiAutoCompleteComponent.prototype.disabled; /** @type {?} */ MultiAutoCompleteComponent.prototype.source; /** @type {?} */ MultiAutoCompleteComponent.prototype.latestSource; /** @type {?} */ MultiAutoCompleteComponent.prototype.isOpen; /** @type {?} */ MultiAutoCompleteComponent.prototype.term; /** @type {?} */ MultiAutoCompleteComponent.prototype.itemTemplate; /** @type {?} */ MultiAutoCompleteComponent.prototype.noResultItemTemplate; /** @type {?} */ MultiAutoCompleteComponent.prototype.dropdown; /** @type {?} */ MultiAutoCompleteComponent.prototype.minLength; /** @type {?} */ MultiAutoCompleteComponent.prototype.delay; /** @type {?} */ MultiAutoCompleteComponent.prototype.searchFn; /** @type {?} */ MultiAutoCompleteComponent.prototype.formatter; /** @type {?} */ MultiAutoCompleteComponent.prototype.valueParser; /** @type {?} */ MultiAutoCompleteComponent.prototype.autoSubmit; /** @type {?} */ MultiAutoCompleteComponent.prototype.multiAutoCompleteInputElement; /** @type {?} */ MultiAutoCompleteComponent.prototype.autoCompleteDirective; /** @type {?} */ MultiAutoCompleteComponent.prototype.multiItems; /** @type {?} */ MultiAutoCompleteComponent.prototype.inputValue; /** @type {?} */ MultiAutoCompleteComponent.prototype.multipleLabelClassNameSuffix; /** @type {?} */ MultiAutoCompleteComponent.prototype.inputEdit; /** @type {?} */ MultiAutoCompleteComponent.prototype.multipleLabelClassNameConfig; /** @type {?} */ MultiAutoCompleteComponent.prototype.id; /** @type {?} */ MultiAutoCompleteComponent.prototype.clonePlaceholder; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.popupRef; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.value; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.placement; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.onChange; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.onTouched; /** * @type {?} * @private */ MultiAutoCompleteComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9tdWx0aS1hdXRvLWNvbXBsZXRlLyIsInNvdXJjZXMiOlsibXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULEtBQUssRUFDTCxNQUFNLEVBQ04sV0FBVyxFQUNYLFVBQVUsRUFDVixZQUFZLEVBRVosU0FBUyxFQUNULGlCQUFpQixFQUNqQixVQUFVLEVBSVgsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxFQUFFLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDdEMsT0FBTyxFQUE4QixxQkFBcUIsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBWTNGLE1BQU0sT0FBTywwQkFBMEI7Ozs7SUFpRXJDLFlBQ1UsaUJBQW9DO1FBQXBDLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7Ozs7UUE1RHJDLGFBQVEsR0FBRyxRQUFRLENBQUM7O1FBRXBCLGdCQUFXLEdBQUcsUUFBUSxDQUFDLENBQUMsY0FBYzs7UUFDdEMsYUFBUSxHQUFHLEtBQUssQ0FBQztRQWFoQixlQUFVLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQyxDQUFDLFNBQVM7UUFJekQsZUFBVSxHQUFVLEVBQUUsQ0FBQztRQUV2QixpQ0FBNEIsR0FBVyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQ3JELGNBQVMsR0FBRyxLQUFLLENBQUM7UUFDbEIsaUNBQTRCLEdBQVE7WUFDbEMsUUFBUSxFQUFFO2dCQUNSLE9BQU8sRUFBRSxRQUFRO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNELE1BQU0sRUFBRTtnQkFDTixPQUFPLEVBQUUsUUFBUTtnQkFDakIsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNELFdBQVcs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SUFDMUIsaURBQWdDOztJQUNoQyw4Q0FBMEI7O0lBQzFCLDRDQUF1Qjs7SUFDdkIsa0RBQTZCOztJQUM3Qiw0Q0FBeUI7O0lBQ3pCLDBDQUFzQjs7SUFDdEIsa0RBQXdDOztJQUN4QywwREFBZ0Q7O0lBQ2hELDhDQUEyQjs7SUFDM0IsK0NBQTJCOztJQUMzQiwyQ0FBdUI7O0lBQ3ZCLDhDQUF1RDs7SUFDdkQsK0NBQTBDOztJQUMxQyxpREFBeUM7O0lBQ3pDLGdEQUErQzs7SUFFL0MsbUVBQWtHOztJQUNsRywyREFBa0c7O0lBQ2xHLGdEQUF1Qjs7SUFDdkIsZ0RBQWdCOztJQUNoQixrRUFBcUQ7O0lBQ3JELCtDQUFrQjs7SUFDbEIsa0VBaUJFOztJQUNGLHdDQUFXOztJQUNYLHNEQUE0Qzs7Ozs7SUFTNUMsOENBQTJEOzs7OztJQUMzRCwyQ0FBbUI7Ozs7O0lBQ25CLCtDQUFrQzs7Ozs7SUFFbEMsOENBQW9DOzs7OztJQUNwQywrQ0FBK0I7Ozs7O0lBRzdCLHVEQUE0QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBUZW1wbGF0ZVJlZixcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBDb21wb25lbnRSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPbkNoYW5nZXMsXHJcbiAgT25Jbml0XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgb2YsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQXV0b0NvbXBsZXRlUG9wdXBDb21wb25lbnQsIEF1dG9Db21wbGV0ZURpcmVjdGl2ZSB9IGZyb20gJ25nLWRldnVpL2F1dG8tY29tcGxldGUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdkLW11bHRpLWF1dG8tY29tcGxldGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tdWx0aS1hdXRvLWNvbXBsZXRlLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnbXVsdGktYXV0by1jb21wbGV0ZS5jb21wb25lbnQuc2NzcyddLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTXVsdGlBdXRvQ29tcGxldGVDb21wb25lbnQpLFxyXG4gICAgbXVsdGk6IHRydWVcclxuICB9XVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTXVsdGlBdXRvQ29tcGxldGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIHN0YXRpYyBJRF9TRUVEID0gMDtcclxuICBASW5wdXQoKSBjc3NDbGFzczogc3RyaW5nO1xyXG4gIC8qXHJcbiAgb3ZlcnZpZXc6IGJvcmRlciBub25lIG11bHRpbGluZSBzaW5nbGVcclxuICAqL1xyXG4gIEBJbnB1dCgpIG92ZXJ2aWV3ID0gJ2JvcmRlcic7XHJcbiAgQElucHV0KCkgdGlwc1RleHQ6IHN0cmluZzsgLy8g5o+Q56S65paH5a2XXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXIgPSAn6K+36L6T5YWl5YWz6ZSu5a2XJzsgLy8gcGxhY2Vob2xkZXJcclxuICBASW5wdXQoKSBkaXNhYmxlZCA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIHNvdXJjZTogYW55W107XHJcbiAgQElucHV0KCkgbGF0ZXN0U291cmNlOiBhbnlbXTsgLy8g5pyA6L+R6L6T5YWlXHJcbiAgQElucHV0KCkgaXNPcGVuOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIHRlcm06IHN0cmluZztcclxuICBASW5wdXQoKSBpdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgbm9SZXN1bHRJdGVtVGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgZHJvcGRvd246IGJvb2xlYW47XHJcbiAgQElucHV0KCkgbWluTGVuZ3RoOiBudW1iZXI7XHJcbiAgQElucHV0KCkgZGVsYXk6IG51bWJlcjtcclxuICBASW5wdXQoKSBzZWFyY2hGbjogKHRlcm06IHN0cmluZykgPT4gT2JzZXJ2YWJsZTxhbnlbXT47XHJcbiAgQElucHV0KCkgZm9ybWF0dGVyOiAoaXRlbTogYW55KSA9PiBzdHJpbmc7XHJcbiAgQElucHV0KCkgdmFsdWVQYXJzZXI6IChpdGVtOiBhbnkpID0+IGFueTtcclxuICBAT3V0cHV0KCkgYXV0b1N1Ym1pdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpOyAvLyDlpLHnhKboh6rliqjmj5DkuqRcclxuXHJcbiAgQFZpZXdDaGlsZCgnbXVsdGlBdXRvQ29tcGxldGVJbnB1dCcsIHsgc3RhdGljOiBmYWxzZSB9KSBtdWx0aUF1dG9Db21wbGV0ZUlucHV0RWxlbWVudDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKEF1dG9Db21wbGV0ZURpcmVjdGl2ZSwgeyBzdGF0aWM6IGZhbHNlIH0pIGF1dG9Db21wbGV0ZURpcmVjdGl2ZTogQXV0b0NvbXBsZXRlRGlyZWN0aXZlO1xyXG4gIG11bHRpSXRlbXM6IGFueVtdID0gW107XHJcbiAgaW5wdXRWYWx1ZTogYW55O1xyXG4gIG11bHRpcGxlTGFiZWxDbGFzc05hbWVTdWZmaXg6IHN0cmluZyA9IHRoaXMub3ZlcnZpZXc7XHJcbiAgaW5wdXRFZGl0ID0gZmFsc2U7XHJcbiAgbXVsdGlwbGVMYWJlbENsYXNzTmFtZUNvbmZpZzogYW55ID0ge1xyXG4gICAgJ2JvcmRlcic6IHtcclxuICAgICAgJ2ZvY3VzJzogJ2JvcmRlcicsXHJcbiAgICAgICdibHVyJzogJ2JvcmRlcidcclxuICAgIH0sXHJcbiAgICAnbm9uZSc6IHtcclxuICAgICAgJ2ZvY3VzJzogJ2JvcmRlcicsXHJcbiAgICAgICdibHVyJzogJ25vbmUnXHJcbiAgICB9LFxyXG4gICAgJ211bHRpbGluZSc6IHtcclxuICAgICAgJ2ZvY3VzJzogJ211bHRpbGluZScsXHJcbiAgICAgICdibHVyJzogJ211bHRpbGluZSdcclxuICAgIH0sXHJcbiAgICAnc2luZ2xlJzoge1xyXG4gICAgICAnZm9jdXMnOiAnc2luZ2xlLWZvY3VzJyxcclxuICAgICAgJ2JsdXInOiAnc2luZ2xlJ1xyXG4gICAgfVxyXG4gIH07XHJcbiAgaWQ6IG51bWJlcjtcclxuICBjbG9uZVBsYWNlaG9sZGVyOiBzdHJpbmcgPSB0aGlzLnBsYWNlaG9sZGVyO1xyXG4gIGdldCBwbGFjZWhvbGRlclZpZXcoKSB7XHJcbiAgICBpZiAodGhpcy5tdWx0aUl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgcmV0dXJuICcnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMucGxhY2Vob2xkZXI7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHBvcHVwUmVmOiBDb21wb25lbnRSZWY8QXV0b0NvbXBsZXRlUG9wdXBDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgdmFsdWU6IGFueTtcclxuICBwcml2YXRlIHBsYWNlbWVudCA9ICdib3R0b20tbGVmdCc7XHJcblxyXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiBudWxsO1xyXG4gIHByaXZhdGUgb25Ub3VjaGVkID0gKCkgPT4gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xyXG4gICAgdGhpcy5mb3JtYXR0ZXIgPSAoaXRlbSkgPT4gaXRlbSA/IChpdGVtLmxhYmVsIHx8IGl0ZW0udG9TdHJpbmcoKSkgOiAnJztcclxuICAgIHRoaXMudmFsdWVQYXJzZXIgPSAoaXRlbSkgPT4gaXRlbTtcclxuICAgIHRoaXMuaWQgPSBNdWx0aUF1dG9Db21wbGV0ZUNvbXBvbmVudC5JRF9TRUVEKys7XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICBjb25zdCB2YWx1ZSA9IG9iaiB8fCBbXTtcclxuICAgIHRoaXMubXVsdGlJdGVtcyA9IHZhbHVlO1xyXG4gICAgaWYgKHRoaXMub3ZlcnZpZXcgPT09ICdzaW5nbGUnKSB7XHJcbiAgICAgIHRoaXMuaW5wdXRFZGl0ID0gdGhpcy5tdWx0aUl0ZW1zLmxlbmd0aCA9PT0gMDtcclxuICAgIH1cclxuICAgIHRoaXMuc2V0U2luZ2xlUGxhY2Vob2xkZXIoKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmICh0aGlzLnNvdXJjZSAmJiAhdGhpcy5zZWFyY2hGbikge1xyXG4gICAgICB0aGlzLnNlYXJjaEZuID0gKHRlcm0pID0+IHtcclxuICAgICAgICByZXR1cm4gb2YodGhpcy5zb3VyY2VcclxuICAgICAgICAgIC5maWx0ZXIobGFuZyA9PiB0aGlzLm11bHRpSXRlbXMuaW5kZXhPZihsYW5nKSA9PT0gLTEgJiYgbGFuZy50b0xvd2VyQ2FzZSgpLmluZGV4T2YodGVybS50b0xvd2VyQ2FzZSgpKSAhPT0gLTEpXHJcbiAgICAgICAgKTtcclxuICAgICAgfTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcclxuICAgIGlmIChjaGFuZ2VzICYmIGNoYW5nZXNbJ292ZXJ2aWV3J10pIHtcclxuICAgICAgdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lU3VmZml4ID0gY2hhbmdlc1snb3ZlcnZpZXcnXS5jdXJyZW50VmFsdWU7XHJcbiAgICB9XHJcbiAgICBpZiAoY2hhbmdlcyAmJiBjaGFuZ2VzWydwbGFjZWhvbGRlciddKSB7XHJcbiAgICAgIHRoaXMuY2xvbmVQbGFjZWhvbGRlciA9IGNoYW5nZXNbJ3BsYWNlaG9sZGVyJ10uY3VycmVudFZhbHVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgc2luZ2xlQ2xpY2soJGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuaW5wdXRFZGl0ID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG9uTXVsdGlwbGVTZWFyY2goaXRlbT86IGFueSkge1xyXG4gICAgaWYgKHRoaXMub3ZlcnZpZXcgIT09ICdzaW5nbGUnICYmIGl0ZW0pIHtcclxuICAgICAgbGV0IGluQXJyYXkgPSBmYWxzZTtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm11bHRpSXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBpZiAoaXRlbS5sYWJlbCkge1xyXG4gICAgICAgICAgaWYgKGl0ZW0ubGFiZWwgPT09IHRoaXMubXVsdGlJdGVtc1tpXS5sYWJlbCkge1xyXG4gICAgICAgICAgICBpbkFycmF5ID0gdHJ1ZTtcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLm11bHRpSXRlbXNbaV0pIHtcclxuICAgICAgICAgICAgaW5BcnJheSA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBpZiAoIWluQXJyYXkpIHtcclxuICAgICAgICB0aGlzLm11bHRpSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLm11bHRpSXRlbXMgPSB0aGlzLm11bHRpSXRlbXMuZmlsdGVyKGRhdGEgPT4ge1xyXG4gICAgICAgICAgaWYgKGRhdGEubGFiZWwpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGRhdGEubGFiZWwgIT09IGl0ZW0ubGFiZWw7XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICByZXR1cm4gZGF0YSAhPT0gaXRlbTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLm92ZXJ2aWV3ID09PSAnc2luZ2xlJyAmJiBpdGVtKSB7XHJcbiAgICAgIHRoaXMubXVsdGlJdGVtcyA9IFtdO1xyXG4gICAgICB0aGlzLm11bHRpSXRlbXMucHVzaChpdGVtKTtcclxuICAgICAgdGhpcy5pbnB1dEVkaXQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lU3VmZml4ID0gdGhpcy5tdWx0aXBsZUxhYmVsQ2xhc3NOYW1lQ29uZmlnW3RoaXMub3ZlcnZpZXddWydibHVyJ107XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFNpbmdsZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLmF1dG9TdWJtaXQuZW1pdCh0aGlzLm11bHRpSXRlbXMpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLm11bHRpSXRlbXMpO1xyXG4gICAgdGhpcy5pbnB1dFZhbHVlID0gbnVsbDtcclxuICAgIHRoaXMubXVsdGlBdXRvQ29tcGxldGVJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9ICcnO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHJlbW92ZUxhYmVsKGxhYmVsOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm11bHRpSXRlbXMuaW5kZXhPZihsYWJlbCkgIT09IC0xKSB7XHJcbiAgICAgIHRoaXMubXVsdGlJdGVtcyA9IHRoaXMubXVsdGlJdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtICE9PSBsYWJlbCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFNpbmdsZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLmF1dG9TdWJtaXQuZW1pdCh0aGlzLm11bHRpSXRlbXMpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLm11bHRpSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgZ2V0SW5wdXRGb2N1c0ZsYWcoJGV2ZW50OiBhbnkpIHtcclxuICAgIHRoaXMuaW5wdXRFZGl0ID0gdGhpcy5tdWx0aUl0ZW1zLmxlbmd0aCA9PT0gMCB8fCAkZXZlbnQuZm9jdXM7XHJcbiAgICB0aGlzLnBvcHVwUmVmID0gJGV2ZW50LnBvcHVwUmVmO1xyXG4gICAgdGhpcy5zZXRTaW5nbGVQbGFjZWhvbGRlcigpO1xyXG4gICAgaWYgKCRldmVudC5mb2N1cykge1xyXG4gICAgICB0aGlzLm11bHRpcGxlTGFiZWxDbGFzc05hbWVTdWZmaXggPSB0aGlzLm11bHRpcGxlTGFiZWxDbGFzc05hbWVDb25maWdbdGhpcy5vdmVydmlld11bJ2ZvY3VzJ107XHJcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4geyAvLyDov5nph4zpnIDopoHnrYnlvoXkuIDkvJrmiY3og73ogZrnhKZcclxuICAgICAgICB0aGlzLm11bHRpQXV0b0NvbXBsZXRlSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcclxuICAgICAgfSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm11bHRpcGxlTGFiZWxDbGFzc05hbWVTdWZmaXggPSB0aGlzLm11bHRpcGxlTGFiZWxDbGFzc05hbWVDb25maWdbdGhpcy5vdmVydmlld11bJ2JsdXInXTtcclxuICAgICAgdGhpcy5pbnB1dFZhbHVlID0gbnVsbDtcclxuICAgICAgdGhpcy5tdWx0aUF1dG9Db21wbGV0ZUlucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LnZhbHVlID0gJyc7XHJcbiAgICAgIHRoaXMuYXV0b1N1Ym1pdC5lbWl0KHRoaXMubXVsdGlJdGVtcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvbkJhY2tzcGFjZUtleVVwKCRldmVudDogYW55LCBpbnB1dFZhbHVlOiBhbnkpIHtcclxuICAgIGlmICh0aGlzLm11bHRpSXRlbXMubGVuZ3RoID4gMCAmJiAhaW5wdXRWYWx1ZSkge1xyXG4gICAgICB0aGlzLm11bHRpSXRlbXMucG9wKCk7XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldFNpbmdsZVBsYWNlaG9sZGVyKCk7XHJcbiAgICB0aGlzLmF1dG9TdWJtaXQuZW1pdCh0aGlzLm11bHRpSXRlbXMpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLm11bHRpSXRlbXMpO1xyXG4gIH1cclxuXHJcbiAgc2V0U2luZ2xlUGxhY2Vob2xkZXIoKSB7XHJcbiAgICBpZiAodGhpcy5vdmVydmlldyA9PT0gJ3NpbmdsZScpIHtcclxuICAgICAgaWYgKHRoaXMubXVsdGlJdGVtcyAmJiB0aGlzLm11bHRpSXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMucGxhY2Vob2xkZXIgPSAnJztcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLnBsYWNlaG9sZGVyID0gdGhpcy5jbG9uZVBsYWNlaG9sZGVyO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==