UNPKG

@ux-aspects/ux-aspects

Version:

Open source user interface framework for building modern, responsive, mobile big data applications

89 lines 15 kB
import { CdkDropList, CDK_DROP_LIST, moveItemInArray, transferArrayItem, } from '@angular/cdk/drag-drop'; import { Directive, EventEmitter, Input, Output } from '@angular/core'; import { BehaviorSubject, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import * as i0 from "@angular/core"; export class ReorderableDirective extends CdkDropList { constructor() { super(...arguments); /** * This event will be triggered when the order changes and will contain an updated dataset containing the items * in their current order. This should be used when the list of items is generated using ngFor to ensure the * data remains in the same order for both the `uxReorderable` and `ngFor` directives. */ this.reorderableModelChange = new EventEmitter(); /** This event is triggered when a user begins dragging an item. The event will contain the element being moved. */ this.reorderStart = new EventEmitter(); /** This event is triggered when the item being dragged is returned to the same location as it began. The event will contain the element that was being moved. */ this.reorderCancel = new EventEmitter(); /** This event is triggered when a user has relocated an item. The event will contain the element that was moved. */ this.reorderEnd = new EventEmitter(); this._destroy$ = new Subject(); } /** * The name of the reorderable group which this container belongs to `uxReorderable` elements which belong to * the same group can have items dragged between them. Only required if multiple drop containers are being created. */ set reorderableGroup(group) { const groups = ReorderableDirective._groups$.value; this._reorderableGroup = group; ReorderableDirective._groups$.next({ ...groups, [group]: [...(groups[group] ?? []), this.id], }); } get reorderableGroup() { return this._reorderableGroup; } /** Determines if reordering is disabled. */ set reorderingDisabled(isDisabled) { this.disabled = isDisabled; } /** Store all the group ids so we can identify which lists can interact */ static { this._groups$ = new BehaviorSubject({}); } ngOnInit() { this.dropped.pipe(takeUntil(this._destroy$)).subscribe((dropEvent) => { if (dropEvent.previousContainer === dropEvent.container) { moveItemInArray(this.reorderableModel, dropEvent.previousIndex, dropEvent.currentIndex); } else { const previousContainer = dropEvent.previousContainer; const currentContainer = dropEvent.container; transferArrayItem(previousContainer.reorderableModel, currentContainer.reorderableModel, dropEvent.previousIndex, dropEvent.currentIndex); } this.reorderableModelChange.emit(this.reorderableModel); }); // if the available groups are updated we need to update the lists we can drag to ReorderableDirective._groups$ .pipe(takeUntil(this._destroy$)) .subscribe(groups => (this.connectedTo = (groups[this.reorderableGroup] ?? []).filter(group => group !== this.id))); } ngOnDestroy() { this._destroy$.next(); this._destroy$.complete(); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ReorderableDirective, deps: null, target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ReorderableDirective, selector: "[uxReorderable]", inputs: { reorderableModel: "reorderableModel", reorderableGroup: "reorderableGroup", reorderingDisabled: "reorderingDisabled" }, outputs: { reorderableModelChange: "reorderableModelChange", reorderStart: "reorderStart", reorderCancel: "reorderCancel", reorderEnd: "reorderEnd" }, providers: [{ provide: CDK_DROP_LIST, useExisting: ReorderableDirective }], usesInheritance: true, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ReorderableDirective, decorators: [{ type: Directive, args: [{ selector: '[uxReorderable]', providers: [{ provide: CDK_DROP_LIST, useExisting: ReorderableDirective }], }] }], propDecorators: { reorderableModel: [{ type: Input }], reorderableGroup: [{ type: Input }], reorderingDisabled: [{ type: Input }], reorderableModelChange: [{ type: Output }], reorderStart: [{ type: Output }], reorderCancel: [{ type: Output }], reorderEnd: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVvcmRlcmFibGUuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2RpcmVjdGl2ZXMvcmVvcmRlcmFibGUvcmVvcmRlcmFibGUuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFSCxXQUFXLEVBQ1gsYUFBYSxFQUNiLGVBQWUsRUFDZixpQkFBaUIsR0FDcEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRixPQUFPLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNoRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7O0FBTTNDLE1BQU0sT0FBTyxvQkFBd0IsU0FBUSxXQUFjO0lBSjNEOztRQXdDSTs7OztXQUlHO1FBQ08sMkJBQXNCLEdBQUcsSUFBSSxZQUFZLEVBQVksQ0FBQztRQUVoRSxtSEFBbUg7UUFDekcsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUU3RCxpS0FBaUs7UUFDdkosa0JBQWEsR0FBRyxJQUFJLFlBQVksRUFBbUIsQ0FBQztRQUU5RCxvSEFBb0g7UUFDMUcsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFtQixDQUFDO1FBSzFDLGNBQVMsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO0tBd0NwRDtJQXBGRzs7O09BR0c7SUFDSCxJQUFhLGdCQUFnQixDQUFDLEtBQWE7UUFDdkMsTUFBTSxNQUFNLEdBQUcsb0JBQW9CLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUNuRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO1FBRS9CLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDL0IsR0FBRyxNQUFNO1lBQ1QsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztTQUMvQyxDQUFDLENBQUM7SUFDUCxDQUFDO0lBRUQsSUFBSSxnQkFBZ0I7UUFDaEIsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUM7SUFDbEMsQ0FBQztJQUlELDRDQUE0QztJQUM1QyxJQUFhLGtCQUFrQixDQUFDLFVBQW1CO1FBQy9DLElBQUksQ0FBQyxRQUFRLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFrQkQsMEVBQTBFO2FBQ2xELGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBMkIsRUFBRSxDQUFDLEFBQXBELENBQXFEO0lBSXJGLFFBQVE7UUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsU0FBeUIsRUFBRSxFQUFFO1lBQ2pGLElBQUksU0FBUyxDQUFDLGlCQUFpQixLQUFLLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEQsZUFBZSxDQUNYLElBQUksQ0FBQyxnQkFBZ0IsRUFDckIsU0FBUyxDQUFDLGFBQWEsRUFDdkIsU0FBUyxDQUFDLFlBQVksQ0FDekIsQ0FBQztZQUNOLENBQUM7aUJBQU0sQ0FBQztnQkFDSixNQUFNLGlCQUFpQixHQUFHLFNBQVMsQ0FBQyxpQkFBNEMsQ0FBQztnQkFDakYsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLENBQUMsU0FBb0MsQ0FBQztnQkFFeEUsaUJBQWlCLENBQ2IsaUJBQWlCLENBQUMsZ0JBQWdCLEVBQ2xDLGdCQUFnQixDQUFDLGdCQUFnQixFQUNqQyxTQUFTLENBQUMsYUFBYSxFQUN2QixTQUFTLENBQUMsWUFBWSxDQUN6QixDQUFDO1lBQ04sQ0FBQztZQUVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxpRkFBaUY7UUFDakYsb0JBQW9CLENBQUMsUUFBUTthQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUMvQixTQUFTLENBQ04sTUFBTSxDQUFDLEVBQUUsQ0FDTCxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxDQUM1RCxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsRUFBRSxDQUM3QixDQUFDLENBQ1QsQ0FBQztJQUNWLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzlCLENBQUM7K0dBOUZRLG9CQUFvQjttR0FBcEIsb0JBQW9CLG1VQUZsQixDQUFDLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsb0JBQW9CLEVBQUUsQ0FBQzs7NEZBRWpFLG9CQUFvQjtrQkFKaEMsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsaUJBQWlCO29CQUMzQixTQUFTLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsV0FBVyxzQkFBc0IsRUFBRSxDQUFDO2lCQUM3RTs4QkFVWSxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBTU8sZ0JBQWdCO3NCQUE1QixLQUFLO2dCQWlCTyxrQkFBa0I7c0JBQTlCLEtBQUs7Z0JBU0ksc0JBQXNCO3NCQUEvQixNQUFNO2dCQUdHLFlBQVk7c0JBQXJCLE1BQU07Z0JBR0csYUFBYTtzQkFBdEIsTUFBTTtnQkFHRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDZGtEcmFnRHJvcCxcbiAgICBDZGtEcm9wTGlzdCxcbiAgICBDREtfRFJPUF9MSVNULFxuICAgIG1vdmVJdGVtSW5BcnJheSxcbiAgICB0cmFuc2ZlckFycmF5SXRlbSxcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uRGVzdHJveSwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogJ1t1eFJlb3JkZXJhYmxlXScsXG4gICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBDREtfRFJPUF9MSVNULCB1c2VFeGlzdGluZzogUmVvcmRlcmFibGVEaXJlY3RpdmUgfV0sXG59KVxuZXhwb3J0IGNsYXNzIFJlb3JkZXJhYmxlRGlyZWN0aXZlPFQ+IGV4dGVuZHMgQ2RrRHJvcExpc3Q8VD4gaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gICAgLyoqXG4gICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBwcm92aWRlIHRoZSBgdXhSZW9yZGVyYWJsZWAgZGlyZWN0aXZlIHdpdGggYSBkYXRhc2V0IHRoYXQgcmVwcmVzZW50cyB0aGUgaXRlbXMgdGhhdCBjYW4gYmUgcmVvcmRlcmVkLlxuICAgICAqIFRoaXMgY2FuIHVzZWQgYXMgYSB0d28gd2F5IGJpbmRpbmcgd2hpY2ggd2lsbCBlbnN1cmUgdGhlIGRhdGFzZXQgYWx3YXlzIHJlZmxlY3RzIHRoZSBjdXJyZW50IG9yZGVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0LlxuICAgICAqIEVhY2ggbGlzdCBpdGVtIHNob3VsZCBoYXZlIGEgYHV4UmVvcmRlcmFibGVNb2RlbGAgZGlyZWN0aXZlIGFwcGxpZWQsIHdpdGggYSB2YWx1ZSBpbmRpY2F0aW5nIHdoaWNoIGl0ZW0gaW4gdGhlIGRhdGFzZXQgaXQgcmVwcmVzZW50cy5cbiAgICAgKlxuICAgICAqIElmIHRoZSBsaXN0IGlzIGdlbmVyYXRlZCB1c2luZyBgbmdGb3JgIHRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSBzYW1lIGRhdGFzZXQuXG4gICAgICogSWYgdGhlcmUgaXMgbm8gZGF0YXNldCByZXByZXNlbnRpbmcgdGhlIGl0ZW1zIHRoZW4gdGhpcyBwcm9wZXJ0eSBpcyBub3QgcmVxdWlyZWQuXG4gICAgICovXG4gICAgQElucHV0KCkgcmVvcmRlcmFibGVNb2RlbDogQXJyYXk8VD47XG5cbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgcmVvcmRlcmFibGUgZ3JvdXAgd2hpY2ggdGhpcyBjb250YWluZXIgYmVsb25ncyB0byBgdXhSZW9yZGVyYWJsZWAgZWxlbWVudHMgd2hpY2ggYmVsb25nIHRvXG4gICAgICogdGhlIHNhbWUgZ3JvdXAgY2FuIGhhdmUgaXRlbXMgZHJhZ2dlZCBiZXR3ZWVuIHRoZW0uIE9ubHkgcmVxdWlyZWQgaWYgbXVsdGlwbGUgZHJvcCBjb250YWluZXJzIGFyZSBiZWluZyBjcmVhdGVkLlxuICAgICAqL1xuICAgIEBJbnB1dCgpIHNldCByZW9yZGVyYWJsZUdyb3VwKGdyb3VwOiBzdHJpbmcpIHtcbiAgICAgICAgY29uc3QgZ3JvdXBzID0gUmVvcmRlcmFibGVEaXJlY3RpdmUuX2dyb3VwcyQudmFsdWU7XG4gICAgICAgIHRoaXMuX3Jlb3JkZXJhYmxlR3JvdXAgPSBncm91cDtcblxuICAgICAgICBSZW9yZGVyYWJsZURpcmVjdGl2ZS5fZ3JvdXBzJC5uZXh0KHtcbiAgICAgICAgICAgIC4uLmdyb3VwcyxcbiAgICAgICAgICAgIFtncm91cF06IFsuLi4oZ3JvdXBzW2dyb3VwXSA/PyBbXSksIHRoaXMuaWRdLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgcmVvcmRlcmFibGVHcm91cCgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVvcmRlcmFibGVHcm91cDtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW9yZGVyYWJsZUdyb3VwOiBzdHJpbmc7XG5cbiAgICAvKiogRGV0ZXJtaW5lcyBpZiByZW9yZGVyaW5nIGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpIHNldCByZW9yZGVyaW5nRGlzYWJsZWQoaXNEaXNhYmxlZDogYm9vbGVhbikge1xuICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGlzIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIG9yZGVyIGNoYW5nZXMgYW5kIHdpbGwgY29udGFpbiBhbiB1cGRhdGVkIGRhdGFzZXQgY29udGFpbmluZyB0aGUgaXRlbXNcbiAgICAgKiBpbiB0aGVpciBjdXJyZW50IG9yZGVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGxpc3Qgb2YgaXRlbXMgaXMgZ2VuZXJhdGVkIHVzaW5nIG5nRm9yIHRvIGVuc3VyZSB0aGVcbiAgICAgKiBkYXRhIHJlbWFpbnMgaW4gdGhlIHNhbWUgb3JkZXIgZm9yIGJvdGggdGhlIGB1eFJlb3JkZXJhYmxlYCBhbmQgYG5nRm9yYCBkaXJlY3RpdmVzLlxuICAgICAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyYWJsZU1vZGVsQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxBcnJheTxUPj4oKTtcblxuICAgIC8qKiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCB3aGVuIGEgdXNlciBiZWdpbnMgZHJhZ2dpbmcgYW4gaXRlbS4gVGhlIGV2ZW50IHdpbGwgY29udGFpbiB0aGUgZWxlbWVudCBiZWluZyBtb3ZlZC4gKi9cbiAgICBAT3V0cHV0KCkgcmVvcmRlclN0YXJ0ID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiB0aGUgaXRlbSBiZWluZyBkcmFnZ2VkIGlzIHJldHVybmVkIHRvIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGl0IGJlZ2FuLiBUaGUgZXZlbnQgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IHRoYXQgd2FzIGJlaW5nIG1vdmVkLiAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyQ2FuY2VsID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogVGhpcyBldmVudCBpcyB0cmlnZ2VyZWQgd2hlbiBhIHVzZXIgaGFzIHJlbG9jYXRlZCBhbiBpdGVtLiBUaGUgZXZlbnQgd2lsbCBjb250YWluIHRoZSBlbGVtZW50IHRoYXQgd2FzIG1vdmVkLiAqL1xuICAgIEBPdXRwdXQoKSByZW9yZGVyRW5kID0gbmV3IEV2ZW50RW1pdHRlcjxSZW9yZGVyRXZlbnQ8VD4+KCk7XG5cbiAgICAvKiogU3RvcmUgYWxsIHRoZSBncm91cCBpZHMgc28gd2UgY2FuIGlkZW50aWZ5IHdoaWNoIGxpc3RzIGNhbiBpbnRlcmFjdCAqL1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IF9ncm91cHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KHt9KTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgX2Rlc3Ryb3kkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmRyb3BwZWQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKS5zdWJzY3JpYmUoKGRyb3BFdmVudDogQ2RrRHJhZ0Ryb3A8VD4pID0+IHtcbiAgICAgICAgICAgIGlmIChkcm9wRXZlbnQucHJldmlvdXNDb250YWluZXIgPT09IGRyb3BFdmVudC5jb250YWluZXIpIHtcbiAgICAgICAgICAgICAgICBtb3ZlSXRlbUluQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVvcmRlcmFibGVNb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZHJvcEV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgIGRyb3BFdmVudC5jdXJyZW50SW5kZXhcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0NvbnRhaW5lciA9IGRyb3BFdmVudC5wcmV2aW91c0NvbnRhaW5lciBhcyBSZW9yZGVyYWJsZURpcmVjdGl2ZTxUPjtcbiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50Q29udGFpbmVyID0gZHJvcEV2ZW50LmNvbnRhaW5lciBhcyBSZW9yZGVyYWJsZURpcmVjdGl2ZTxUPjtcblxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQXJyYXlJdGVtKFxuICAgICAgICAgICAgICAgICAgICBwcmV2aW91c0NvbnRhaW5lci5yZW9yZGVyYWJsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q29udGFpbmVyLnJlb3JkZXJhYmxlTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGRyb3BFdmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICAgICAgICAgICAgICBkcm9wRXZlbnQuY3VycmVudEluZGV4XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW9yZGVyYWJsZU1vZGVsQ2hhbmdlLmVtaXQodGhpcy5yZW9yZGVyYWJsZU1vZGVsKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gaWYgdGhlIGF2YWlsYWJsZSBncm91cHMgYXJlIHVwZGF0ZWQgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGxpc3RzIHdlIGNhbiBkcmFnIHRvXG4gICAgICAgIFJlb3JkZXJhYmxlRGlyZWN0aXZlLl9ncm91cHMkXG4gICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpKVxuICAgICAgICAgICAgLnN1YnNjcmliZShcbiAgICAgICAgICAgICAgICBncm91cHMgPT5cbiAgICAgICAgICAgICAgICAgICAgKHRoaXMuY29ubmVjdGVkVG8gPSAoZ3JvdXBzW3RoaXMucmVvcmRlcmFibGVHcm91cF0gPz8gW10pLmZpbHRlcihcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0+IGdyb3VwICE9PSB0aGlzLmlkXG4gICAgICAgICAgICAgICAgICAgICkpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9kZXN0cm95JC5uZXh0KCk7XG4gICAgICAgIHRoaXMuX2Rlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlb3JkZXJFdmVudDxUID0gdW5rbm93bj4ge1xuICAgIGVsZW1lbnQ6IEVsZW1lbnQ7XG4gICAgbW9kZWw6IFQ7XG59XG4iXX0=