UNPKG

ngx-tags

Version:
268 lines 22 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ViewEncapsulation, TemplateRef, Input, EventEmitter, Output, forwardRef } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { NgxTagsValueAccessor } from './ngxTagsValueAccessor'; /* tslint:disable:component-selector */ export class NgTagComponent extends NgxTagsValueAccessor { constructor() { super(); this.isMenuOpen = false; this.inputTag = ''; this.placeholder = 'add a tag'; this.actionTypes = { 'add': 'add', 'delete': 'delete', 'update': 'update', }; this.tagLabel = 'tagLabel'; this.tagValue = 'tagValue'; this.clearOnBlur = true; this.allowDupes = false; this.onlyFromDropdown = false; this.tagEditable = false; this.change = new EventEmitter(); } /** * @return {?} */ get tags() { return this._value; } /** * @return {?} */ whenClickedOut() { this.isMenuOpen = false; } /** * @param {?} e * @return {?} */ enter(e) { if (this.onlyFromDropdown) { e.stopProgation(); return false; } if (this.inputTag.trim()) { this.addToModal(this.inputTag); this.clearInput(); } } /** * @param {?} $event * @return {?} */ save($event) { this._value[$event.index][this.tagLabel] = $event.item.trim(); this.emitChange(this.actionTypes.update, this._value[$event.index]); } /** * @return {?} */ blur() { if (this.clearOnBlur) { this.clearInput(); } } /** * @return {?} */ clearInput() { this.inputTag = ''; } /** * @param {?} indx * @return {?} */ del(indx) { if (this.canDeleteTags) { this._value.splice(indx, 1); this.emitChange(this.actionTypes.delete, this._value); } } /** * @return {?} */ backspace() { if (!this.removeLastOnBackspace && !this.inputTag.trim()) { this._value.pop(); } } /** * @return {?} */ input() { /** @type {?} */ const _inputTag = this.inputTag.trim(); if (_inputTag) { this._options = this.filterByInput(this.options); this.isMenuOpen = true; } } /** * @private * @param {?} items * @return {?} */ filterByInput(items) { return items.filter((/** * @param {?} item * @return {?} */ (item) => { /** @type {?} */ const val = (typeof item !== 'string' && this.tagLabel) ? item[this.tagLabel] : item; if (val.toLowerCase().includes(this.inputTag.trim().toLowerCase())) { return true; } return false; })); } /** * @param {?} item * @return {?} */ select(item) { this.addToModal(item.value); this.clearInput(); this.whenClickedOut(); } /** * @private * @param {?} item * @return {?} */ addToModal(item) { if (this.hasReachedMaxTags()) { return; } /** @type {?} */ const itemToAdd = this.createTag(item); if (!this.allowDupes) { if (this.isDuplicate(itemToAdd)) { this._value.push(itemToAdd); this.emitChange(this.actionTypes.add, itemToAdd); } } else { this._value.push(itemToAdd); this.emitChange(this.actionTypes.add, itemToAdd); } } /** * @private * @param {?} tag * @return {?} */ createTag(tag) { if (typeof tag !== 'string') { return tag; } else { return { [this.tagValue]: tag, [this.tagLabel]: tag }; } } /** * @return {?} */ hasReachedMaxTags() { return this.maxTags ? (this.maxTags === this._value.length) : false; } /** * @param {?} item * @return {?} */ isDuplicate(item) { return this._value.indexOf(item) === -1 ? true : false; } /** * @private * @param {?} type * @param {?} value * @return {?} */ emitChange(type, value) { this.change.emit({ type: type, value: value }); } } NgTagComponent.decorators = [ { type: Component, args: [{ selector: 'ngx-tags', template: "<section class=\"ngx-tags\">\n <section class=\"tag-container\" [closeMenu]=\"isMenuOpen\" (whenClickedOut)=\"whenClickedOut()\" [ngClass]=\"{'ngx-tags-disabled':disabled}\" >\n <span class=\"tag\" *ngFor=\"let tag of tags;let $index = index\" [ngClass]=\"{'tag-readonly': tag.readonly}\">\n <ng-container [ngTemplateOutletContext]=\"{ item: tag, index: $index,tagLabel:tagLabel,tagEditable:tagEditable }\"\n [ngTemplateOutlet]=\"tagTemplate ? tagTemplate:defaultTagItemTemplate\">\n </ng-container>\n <a href=\"#\" class=\"close\" [hidden]=\"!canDeleteTags\" (click)=\"del($index)\"></a>\n </span>\n <span class=\"tag-input\" >\n <input type=\"text\" *ngIf=\"canAddTags\" [(ngModel)]=\"inputTag\" (blur)=\"blur()\"\n [placeholder]=\"placeholder\" (keydown.enter)=\"enter($event)\" (keydown.backspace)=\"backspace()\"\n (input)=\"input()\">\n </span>\n </section>\n <ngx-tags-dropdown [items]=\"_options\" [dropdownItemTemplate]=\"dropdownItemTemplate\" [tagLabel]=\"tagLabel\" [inputTag]=\"inputTag\" (select)=\"select($event) \" [hidden]=\"!isMenuOpen\"></ngx-tags-dropdown>\n</section>\n\n<ng-template #defaultTagItemTemplate let-item=\"item\" let-tagLabel=\"tagLabel\" let-input=\"input\" let-tagEditable=\"tagEditable\" let-index=\"index\">\n <ngx-tag [item]=\"item\" [tagEditable]=\"tagEditable\" [tagLabel]=\"tagLabel\" [index]=\"index\" (change)=\"save($event)\"></ngx-tag>\n</ng-template>", providers: [{ provide: NG_VALUE_ACCESSOR, useExisting: forwardRef((/** * @return {?} */ () => NgTagComponent)), multi: true }], encapsulation: ViewEncapsulation.None, styles: [".ngx-tags{position:relative;display:block;width:100%}.ngx-tags .ngx-tags-disabled{opacity:.7;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none}.ngx-tags .tag-container{display:block;width:100%;padding:.375rem .75rem;font-size:1rem;line-height:1.5;color:#495057;background-color:#fff;background-clip:padding-box;border:1px solid #ced4da;border-radius:.25rem;transition:border-color .15s ease-in-out,box-shadow .15s ease-in-out;box-sizing:border-box}.ngx-tags .tag-container .tag,.ngx-tags .tag-container .tag-input{background:#9dc1ff;padding:.25rem;border-radius:.25rem;margin-right:.25rem;display:inline-flex;align-items:center;width:-webkit-fit-content;width:-moz-fit-content;width:fit-content}.ngx-tags .tag-container .tag-input{background:#fff}.ngx-tags .tag-container .tag-input input{border:none;outline:0;min-width:140px;max-width:100%;height:100%;margin-left:4px;box-sizing:border-box;display:inline-block}.ngx-tags .tag-container .tag-readonly{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;pointer-events:none;opacity:.7}.ngx-tags .tag-container .close{position:relative;display:inline-block;width:10px;height:10px;opacity:.8}.ngx-tags .tag-container .close:hover{opacity:1}.ngx-tags .tag-container .close:after,.ngx-tags .tag-container .close:before{position:absolute;left:3px;content:' ';height:11px;width:2px;background-color:#333}.ngx-tags .tag-container .close:before{transform:rotate(45deg)}.ngx-tags .tag-container .close:after{transform:rotate(-45deg)}.item:hover,.keynav-active{background:#e1e4e8}.dropdown{margin:0;padding:0;border:1px solid #e1e4e8;box-shadow:0 2px 4px -1px rgba(0,0,0,.2),0 4px 5px 0 rgba(0,0,0,.14),0 1px 10px 0 rgba(0,0,0,.12);border-radius:2px;max-height:200px;overflow-y:auto;position:absolute;background:#fff;display:block;width:100%;z-index:1}.item{padding:4px 2px;display:block}"] }] } ]; /** @nocollapse */ NgTagComponent.ctorParameters = () => []; NgTagComponent.propDecorators = { tagTemplate: [{ type: Input }], dropdownItemTemplate: [{ type: Input }], options: [{ type: Input }], maxTags: [{ type: Input }], tagLabel: [{ type: Input }], tagValue: [{ type: Input }], removeLastOnBackspace: [{ type: Input }], canDeleteTags: [{ type: Input }], canAddTags: [{ type: Input }], clearOnBlur: [{ type: Input }], allowDupes: [{ type: Input }], onlyFromDropdown: [{ type: Input }], tagEditable: [{ type: Input }], change: [{ type: Output }] }; if (false) { /** @type {?} */ NgTagComponent.prototype.isMenuOpen; /** @type {?} */ NgTagComponent.prototype._options; /** @type {?} */ NgTagComponent.prototype.inputTag; /** @type {?} */ NgTagComponent.prototype.placeholder; /** @type {?} */ NgTagComponent.prototype.actionTypes; /** @type {?} */ NgTagComponent.prototype.tagTemplate; /** @type {?} */ NgTagComponent.prototype.dropdownItemTemplate; /** @type {?} */ NgTagComponent.prototype.options; /** @type {?} */ NgTagComponent.prototype.maxTags; /** @type {?} */ NgTagComponent.prototype.tagLabel; /** @type {?} */ NgTagComponent.prototype.tagValue; /** @type {?} */ NgTagComponent.prototype.removeLastOnBackspace; /** @type {?} */ NgTagComponent.prototype.canDeleteTags; /** @type {?} */ NgTagComponent.prototype.canAddTags; /** @type {?} */ NgTagComponent.prototype.clearOnBlur; /** @type {?} */ NgTagComponent.prototype.allowDupes; /** @type {?} */ NgTagComponent.prototype.onlyFromDropdown; /** @type {?} */ NgTagComponent.prototype.tagEditable; /** @type {?} */ NgTagComponent.prototype.change; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4VGFncy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZ3gtdGFncy8iLCJzb3VyY2VzIjpbImxpYi9uZ3hUYWdzLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ILE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDOztBQWlCOUQsTUFBTSxPQUFPLGNBQWUsU0FBUSxvQkFBb0I7SUErQnREO1FBQ0UsS0FBSyxFQUFFLENBQUM7UUEvQkgsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUVuQixhQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2QsZ0JBQVcsR0FBRyxXQUFXLENBQUM7UUFDMUIsZ0JBQVcsR0FBRztZQUNuQixLQUFLLEVBQUUsS0FBSztZQUNaLFFBQVEsRUFBRSxRQUFRO1lBQ2xCLFFBQVEsRUFBRSxRQUFRO1NBQ25CLENBQUM7UUFVTyxhQUFRLEdBQUcsVUFBVSxDQUFDO1FBQ3RCLGFBQVEsR0FBRyxVQUFVLENBQUM7UUFJdEIsZ0JBQVcsR0FBRyxJQUFJLENBQUM7UUFDbkIsZUFBVSxHQUFHLEtBQUssQ0FBQztRQUNuQixxQkFBZ0IsR0FBRyxLQUFLLENBQUM7UUFDekIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFFWixXQUFNLEdBQUcsSUFBSSxZQUFZLEVBQU8sQ0FBQztJQUlsRCxDQUFDOzs7O0lBdEJELElBQVcsSUFBSTtRQUNiLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDOzs7O0lBdUJELGNBQWM7UUFDWixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUMxQixDQUFDOzs7OztJQUdELEtBQUss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QUFDLEtBQUssQ0FBQztJQUN6RCxDQUFDOzs7Ozs7O0lBQ08sVUFBVSxDQUFDLElBQVksRUFBRSxLQUFVO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDOzs7WUFySkYsU0FBUyxTQUFDO2dCQUNULFFBQVEsRUFBRSxVQUFVO2dCQUNwQixnOENBQXVDO2dCQUV2QyxTQUFTLEVBQUUsQ0FBQzt3QkFDVixPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVTs7O3dCQUFDLEdBQUcsRUFBRSxDQUFDLGNBQWMsRUFBQzt3QkFDN0MsS0FBSyxFQUFFLElBQUk7cUJBQ1osQ0FBQztnQkFDRixhQUFhLEVBQUUsaUJBQWlCLENBQUMsSUFBSTs7YUFFdEM7Ozs7OzBCQWdCRSxLQUFLO21DQUNMLEtBQUs7c0JBQ0wsS0FBSztzQkFDTCxLQUFLO3VCQUNMLEtBQUs7dUJBQ0wsS0FBSztvQ0FDTCxLQUFLOzRCQUNMLEtBQUs7eUJBQ0wsS0FBSzswQkFDTCxLQUFLO3lCQUNMLEtBQUs7K0JBQ0wsS0FBSzswQkFDTCxLQUFLO3FCQUVMLE1BQU07Ozs7SUE1QlAsb0NBQTBCOztJQUMxQixrQ0FBNkM7O0lBQzdDLGtDQUFxQjs7SUFDckIscUNBQWlDOztJQUNqQyxxQ0FJRTs7SUFNRixxQ0FBdUM7O0lBQ3ZDLDhDQUFnRDs7SUFDaEQsaUNBQXNCOztJQUN0QixpQ0FBeUI7O0lBQ3pCLGtDQUErQjs7SUFDL0Isa0NBQStCOztJQUMvQiwrQ0FBd0M7O0lBQ3hDLHVDQUFnQzs7SUFDaEMsb0NBQTZCOztJQUM3QixxQ0FBNEI7O0lBQzVCLG9DQUE0Qjs7SUFDNUIsMENBQWtDOztJQUNsQyxxQ0FBNkI7O0lBRTdCLGdDQUFrRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgVmlld0VuY2Fwc3VsYXRpb24sIFRlbXBsYXRlUmVmLCBJbnB1dCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIGZvcndhcmRSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgTmd4VGFnc1ZhbHVlQWNjZXNzb3IgfSBmcm9tICcuL25neFRhZ3NWYWx1ZUFjY2Vzc29yJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbi8qIHRzbGludDpkaXNhYmxlOmNvbXBvbmVudC1zZWxlY3RvciAqL1xuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbmd4LXRhZ3MnLFxuICB0ZW1wbGF0ZVVybDogJy4vbmd4VGFncy5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL25neFRhZ3MuY29tcG9uZW50LnNjc3MnXSxcbiAgcHJvdmlkZXJzOiBbe1xuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nVGFnQ29tcG9uZW50KSxcbiAgICBtdWx0aTogdHJ1ZVxuICB9XSxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxuXG59KVxuZXhwb3J0IGNsYXNzIE5nVGFnQ29tcG9uZW50IGV4dGVuZHMgTmd4VGFnc1ZhbHVlQWNjZXNzb3Ige1xuICBwdWJsaWMgaXNNZW51T3BlbiA9IGZhbHNlO1xuICBwdWJsaWMgX29wdGlvbnM6IE9ic2VydmFibGU8e30+IHwgQXJyYXk8YW55PjtcbiAgcHVibGljIGlucHV0VGFnID0gJyc7XG4gIHB1YmxpYyBwbGFjZWhvbGRlciA9ICdhZGQgYSB0YWcnO1xuICBwdWJsaWMgYWN0aW9uVHlwZXMgPSB7XG4gICAgJ2FkZCc6ICdhZGQnLFxuICAgICdkZWxldGUnOiAnZGVsZXRlJyxcbiAgICAndXBkYXRlJzogJ3VwZGF0ZScsXG4gIH07XG5cbiAgcHVibGljIGdldCB0YWdzKCkge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIEBJbnB1dCgpIHRhZ1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBASW5wdXQoKSBkcm9wZG93bkl0ZW1UZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgb3B0aW9uczogYW55O1xuICBASW5wdXQoKSBtYXhUYWdzOiBudW1iZXI7XG4gIEBJbnB1dCgpIHRhZ0xhYmVsID0gJ3RhZ0xhYmVsJztcbiAgQElucHV0KCkgdGFnVmFsdWUgPSAndGFnVmFsdWUnO1xuICBASW5wdXQoKSByZW1vdmVMYXN0T25CYWNrc3BhY2U6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkRlbGV0ZVRhZ3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNhbkFkZFRhZ3M6IGJvb2xlYW47XG4gIEBJbnB1dCgpIGNsZWFyT25CbHVyID0gdHJ1ZTtcbiAgQElucHV0KCkgYWxsb3dEdXBlcyA9IGZhbHNlO1xuICBASW5wdXQoKSBvbmx5RnJvbURyb3Bkb3duID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRhZ0VkaXRhYmxlID0gZmFsc2U7XG5cbiAgQE91dHB1dCgpIHB1YmxpYyBjaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cblxuICB3aGVuQ2xpY2tlZE91dCgpIHtcbiAgICB0aGlzLmlzTWVudU9wZW4gPSBmYWxzZTtcbiAgfVxuXG5cbiAgZW50ZXIoZSkge1xuICAgIGlmICh0aGlzLm9ubHlGcm9tRHJvcGRvd24pIHtcbiAgICBlLnN0b3BQcm9nYXRpb24oKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuaW5wdXRUYWcudHJpbSgpKSB7XG4gICAgICB0aGlzLmFkZFRvTW9kYWwodGhpcy5pbnB1dFRhZyk7XG4gICAgICB0aGlzLmNsZWFySW5wdXQoKTtcbiAgICB9XG4gIH1cbiAgc2F2ZSgkZXZlbnQpIHtcbiAgICB0aGlzLl92YWx1ZVskZXZlbnQuaW5kZXhdW3RoaXMudGFnTGFiZWxdID0gJGV2ZW50Lml0ZW0udHJpbSgpO1xuICAgIHRoaXMuZW1pdENoYW5nZSh0aGlzLmFjdGlvblR5cGVzLnVwZGF0ZSwgdGhpcy5fdmFsdWVbJGV2ZW50LmluZGV4XSk7XG4gIH1cblxuICBibHVyKCkge1xuICAgIGlmICh0aGlzLmNsZWFyT25CbHVyKSB7IHRoaXMuY2xlYXJJbnB1dCgpOyB9XG4gIH1cblxuICBjbGVhcklucHV0KCkge1xuICAgIHRoaXMuaW5wdXRUYWcgPSAnJztcbiAgfVxuXG4gIGRlbChpbmR4OiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5jYW5EZWxldGVUYWdzKSB7XG4gICAgICB0aGlzLl92YWx1ZS5zcGxpY2UoaW5keCwgMSk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5hY3Rpb25UeXBlcy5kZWxldGUsIHRoaXMuX3ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBiYWNrc3BhY2UoKSB7XG4gICAgaWYgKCF0aGlzLnJlbW92ZUxhc3RPbkJhY2tzcGFjZSAmJiAhdGhpcy5pbnB1dFRhZy50cmltKCkpIHtcbiAgICAgIHRoaXMuX3ZhbHVlLnBvcCgpO1xuICAgIH1cbiAgfVxuXG4gIGlucHV0KCkge1xuICAgIGNvbnN0IF9pbnB1dFRhZyA9IHRoaXMuaW5wdXRUYWcudHJpbSgpO1xuICAgIGlmIChfaW5wdXRUYWcpIHtcbiAgICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLmZpbHRlckJ5SW5wdXQodGhpcy5vcHRpb25zKTtcbiAgICAgIHRoaXMuaXNNZW51T3BlbiA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmaWx0ZXJCeUlucHV0KGl0ZW1zKSB7XG4gICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgdmFsID0gKHR5cGVvZiBpdGVtICE9PSAnc3RyaW5nJyAmJiB0aGlzLnRhZ0xhYmVsKSA/IGl0ZW1bdGhpcy50YWdMYWJlbF0gOiBpdGVtO1xuICAgICAgaWYgKHZhbC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHRoaXMuaW5wdXRUYWcudHJpbSgpLnRvTG93ZXJDYXNlKCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0pO1xuICB9XG5cbiAgc2VsZWN0KGl0ZW0pIHtcbiAgICB0aGlzLmFkZFRvTW9kYWwoaXRlbS52YWx1ZSk7XG4gICAgdGhpcy5jbGVhcklucHV0KCk7XG4gICAgdGhpcy53aGVuQ2xpY2tlZE91dCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUb01vZGFsKGl0ZW0pIHtcbiAgICBpZiAodGhpcy5oYXNSZWFjaGVkTWF4VGFncygpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGl0ZW1Ub0FkZCA9IHRoaXMuY3JlYXRlVGFnKGl0ZW0pO1xuICAgIGlmICghdGhpcy5hbGxvd0R1cGVzKSB7XG4gICAgICBpZiAodGhpcy5pc0R1cGxpY2F0ZShpdGVtVG9BZGQpKSB7XG4gICAgICAgIHRoaXMuX3ZhbHVlLnB1c2goaXRlbVRvQWRkKTtcbiAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKHRoaXMuYWN0aW9uVHlwZXMuYWRkLCBpdGVtVG9BZGQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92YWx1ZS5wdXNoKGl0ZW1Ub0FkZCk7XG4gICAgICB0aGlzLmVtaXRDaGFuZ2UodGhpcy5hY3Rpb25UeXBlcy5hZGQsIGl0ZW1Ub0FkZCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUYWcodGFnKSB7XG4gICAgaWYgKHR5cGVvZiB0YWcgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdGFnO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBbdGhpcy50YWdWYWx1ZV06IHRhZyxcbiAgICAgICAgW3RoaXMudGFnTGFiZWxdOiB0YWdcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgaGFzUmVhY2hlZE1heFRhZ3MoKSB7XG4gICAgcmV0dXJuIHRoaXMubWF4VGFncyA/ICh0aGlzLm1heFRhZ3MgPT09IHRoaXMuX3ZhbHVlLmxlbmd0aCkgOiBmYWxzZTtcbiAgfVxuXG4gIGlzRHVwbGljYXRlKGl0ZW0pIHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWUuaW5kZXhPZihpdGVtKSA9PT0gLTEgPyB0cnVlIDogZmFsc2U7XG4gIH1cbiAgcHJpdmF0ZSBlbWl0Q2hhbmdlKHR5cGU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuY2hhbmdlLmVtaXQoeyB0eXBlOiB0eXBlLCB2YWx1ZTogdmFsdWUgfSk7XG4gIH1cbn1cbiJdfQ==