UNPKG

@pingtm/nxt-sortablejs

Version:

159 lines 23.6 kB
import { Directive, EventEmitter, Inject, Input, Optional, Output, } from '@angular/core'; import Sortable from 'sortablejs'; import { GLOBALS } from './globals'; import { SortablejsBindings } from './sortablejs-bindings'; import * as i0 from "@angular/core"; import * as i1 from "./sortablejs.service"; const getIndexesFromEvent = (event) => { if (event.hasOwnProperty('newDraggableIndex') && event.hasOwnProperty('oldDraggableIndex')) { return { new: event.newDraggableIndex, old: event.oldDraggableIndex, }; } else { return { new: event.newIndex, old: event.oldIndex, }; } }; export class SortablejsDirective { constructor(globalConfig, service, element, zone, renderer) { this.globalConfig = globalConfig; this.service = service; this.element = element; this.zone = zone; this.renderer = renderer; this.sortablejsInit = new EventEmitter(); } ngOnInit() { if (Sortable && Sortable.create) { // Sortable does not exist in angular universal (SSR) this.create(); } } ngOnChanges(changes) { const optionsChange = changes.sortablejsOptions; if (optionsChange && !optionsChange.isFirstChange()) { const previousOptions = optionsChange.previousValue; const currentOptions = optionsChange.currentValue; Object.keys(currentOptions).forEach(optionName => { if (currentOptions[optionName] !== previousOptions[optionName]) { // use low-level option setter this.sortableInstance.option(optionName, this.options[optionName]); } }); } } ngOnDestroy() { if (this.sortableInstance) { this.sortableInstance.destroy(); } } create() { const container = this.sortablejsContainer ? this.element.nativeElement.querySelector(this.sortablejsContainer) : this.element.nativeElement; setTimeout(() => { this.sortableInstance = Sortable.create(container, this.options); this.sortablejsInit.emit(this.sortableInstance); }, 0); } getBindings() { if (!this.sortablejs) { return new SortablejsBindings([]); } else if (this.sortablejs instanceof SortablejsBindings) { return this.sortablejs; } else { return new SortablejsBindings([this.sortablejs]); } } get options() { return { ...this.optionsWithoutEvents, ...this.overridenOptions }; } get optionsWithoutEvents() { return { ...(this.globalConfig || {}), ...(this.sortablejsOptions || {}) }; } proxyEvent(eventName, ...params) { this.zone.run(() => { if (this.optionsWithoutEvents && this.optionsWithoutEvents[eventName]) { this.optionsWithoutEvents[eventName](...params); } }); } get isCloning() { return this.sortableInstance.options.group.checkPull(this.sortableInstance, this.sortableInstance) === 'clone'; } clone(item) { // by default pass the item through, no cloning performed return (this.sortablejsCloneFunction || (subitem => subitem))(item); } get overridenOptions() { // always intercept standard events but act only in case items are set (bindingEnabled) // allows to forget about tracking this.items changes return { onAdd: (event) => { this.service.transfer = (items) => { this.getBindings().injectIntoEvery(event.newIndex, items); this.proxyEvent('onAdd', event); }; this.proxyEvent('onAddOriginal', event); }, onRemove: (event) => { const bindings = this.getBindings(); if (bindings.provided) { if (this.isCloning) { this.service.transfer(bindings.getFromEvery(event.oldIndex).map(item => this.clone(item))); // great thanks to https://github.com/tauu // event.item is the original item from the source list which is moved to the target list // event.clone is a clone of the original item and will be added to source list // If bindings are provided, adding the item dom element to the target list causes artifacts // as it interferes with the rendering performed by the angular template. // Therefore we remove it immediately and also move the original item back to the source list. // (event handler may be attached to the original item and not its clone, therefore keeping // the original dom node, circumvents side effects ) this.renderer.removeChild(event.item.parentNode, event.item); this.renderer.insertBefore(event.clone.parentNode, event.item, event.clone); this.renderer.removeChild(event.clone.parentNode, event.clone); } else { this.service.transfer(bindings.extractFromEvery(event.oldIndex)); } this.service.transfer = null; } this.proxyEvent('onRemove', event); }, onUpdate: (event) => { const bindings = this.getBindings(); const indexes = getIndexesFromEvent(event); bindings.injectIntoEvery(indexes.new, bindings.extractFromEvery(indexes.old)); this.proxyEvent('onUpdate', event); }, }; } } /** @nocollapse */ SortablejsDirective.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: SortablejsDirective, deps: [{ token: GLOBALS, optional: true }, { token: i1.SortablejsService }, { token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive }); /** @nocollapse */ SortablejsDirective.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "15.2.1", type: SortablejsDirective, selector: "[sortablejs]", inputs: { sortablejs: "sortablejs", sortablejsContainer: "sortablejsContainer", sortablejsOptions: "sortablejsOptions", sortablejsCloneFunction: "sortablejsCloneFunction" }, outputs: { sortablejsInit: "sortablejsInit" }, usesOnChanges: true, ngImport: i0 }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.1", ngImport: i0, type: SortablejsDirective, decorators: [{ type: Directive, args: [{ // eslint-disable-next-line @angular-eslint/directive-selector selector: '[sortablejs]', }] }], ctorParameters: function () { return [{ type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [GLOBALS] }] }, { type: i1.SortablejsService }, { type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { sortablejs: [{ type: Input }], sortablejsContainer: [{ type: Input }], sortablejsOptions: [{ type: Input }], sortablejsCloneFunction: [{ type: Input }], sortablejsInit: [{ type: Output }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ydGFibGVqcy5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9ueHQtc29ydGFibGVqcy9zcmMvbGliL3NvcnRhYmxlanMuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBRVQsWUFBWSxFQUNaLE1BQU0sRUFDTixLQUFLLEVBS0wsUUFBUSxFQUNSLE1BQU0sR0FHUCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLFFBQW1CLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7OztBQUt6RCxNQUFNLG1CQUFtQixHQUFHLENBQUMsS0FBb0IsRUFBRSxFQUFFO0lBQ25ELElBQUksS0FBSyxDQUFDLGNBQWMsQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEtBQUssQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsRUFBRTtRQUMxRixPQUFPO1lBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7WUFDNUIsR0FBRyxFQUFFLEtBQUssQ0FBQyxpQkFBaUI7U0FDN0IsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLEtBQUssQ0FBQyxRQUFRO1lBQ25CLEdBQUcsRUFBRSxLQUFLLENBQUMsUUFBUTtTQUNwQixDQUFDO0tBQ0g7QUFDSCxDQUFDLENBQUM7QUFNRixNQUFNLE9BQU8sbUJBQW1CO0lBa0I5QixZQUN1QyxZQUFxQixFQUNsRCxPQUEwQixFQUMxQixPQUFtQixFQUNuQixJQUFZLEVBQ1osUUFBbUI7UUFKVSxpQkFBWSxHQUFaLFlBQVksQ0FBUztRQUNsRCxZQUFPLEdBQVAsT0FBTyxDQUFtQjtRQUMxQixZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQ25CLFNBQUksR0FBSixJQUFJLENBQVE7UUFDWixhQUFRLEdBQVIsUUFBUSxDQUFXO1FBVG5CLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztJQVc5QyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxxREFBcUQ7WUFDdEYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1NBQ2Y7SUFDSCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQThEO1FBQ3hFLE1BQU0sYUFBYSxHQUFpQixPQUFPLENBQUMsaUJBQWlCLENBQUM7UUFFOUQsSUFBSSxhQUFhLElBQUksQ0FBQyxhQUFhLENBQUMsYUFBYSxFQUFFLEVBQUU7WUFDbkQsTUFBTSxlQUFlLEdBQVksYUFBYSxDQUFDLGFBQWEsQ0FBQztZQUM3RCxNQUFNLGNBQWMsR0FBWSxhQUFhLENBQUMsWUFBWSxDQUFDO1lBRTNELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUMvQyxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsS0FBSyxlQUFlLENBQUMsVUFBVSxDQUFDLEVBQUU7b0JBQzlELDhCQUE4QjtvQkFDOUIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO2lCQUNwRTtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO1lBQ3pCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNqQztJQUNILENBQUM7SUFFTyxNQUFNO1FBQ1osTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDO1FBRTdJLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNSLENBQUM7SUFFTyxXQUFXO1FBQ2pCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNuQzthQUFNLElBQUksSUFBSSxDQUFDLFVBQVUsWUFBWSxrQkFBa0IsRUFBRTtZQUN4RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7U0FDeEI7YUFBTTtZQUNMLE9BQU8sSUFBSSxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQztJQUVELElBQVksT0FBTztRQUNqQixPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQsSUFBWSxvQkFBb0I7UUFDOUIsT0FBTyxFQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRU8sVUFBVSxDQUFDLFNBQWlCLEVBQUUsR0FBRyxNQUFhO1FBQ3BELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTtZQUNqQixJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsb0JBQW9CLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JFLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDO2FBQ2pEO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsSUFBWSxTQUFTO1FBQ25CLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxPQUFPLENBQUM7SUFDakgsQ0FBQztJQUVPLEtBQUssQ0FBSSxJQUFPO1FBQ3RCLHlEQUF5RDtRQUN6RCxPQUFPLENBQUMsSUFBSSxDQUFDLHVCQUF1QixJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFFRCxJQUFZLGdCQUFnQjtRQUMxQix1RkFBdUY7UUFDdkYscURBQXFEO1FBQ3JELE9BQU87WUFDTCxLQUFLLEVBQUUsQ0FBQyxLQUFvQixFQUFFLEVBQUU7Z0JBQzlCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsS0FBWSxFQUFFLEVBQUU7b0JBQ3ZDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUMsQ0FBQztnQkFFRixJQUFJLENBQUMsVUFBVSxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQyxDQUFDO1lBQ0QsUUFBUSxFQUFFLENBQUMsS0FBb0IsRUFBRSxFQUFFO2dCQUNqQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBRXBDLElBQUksUUFBUSxDQUFDLFFBQVEsRUFBRTtvQkFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNsQixJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzt3QkFFM0YsMENBQTBDO3dCQUMxQyx5RkFBeUY7d0JBQ3pGLCtFQUErRTt3QkFDL0UsNEZBQTRGO3dCQUM1Rix5RUFBeUU7d0JBQ3pFLDhGQUE4Rjt3QkFDOUYsMkZBQTJGO3dCQUMzRixvREFBb0Q7d0JBQ3BELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQzt3QkFDN0QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQzVFLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztxQkFDaEU7eUJBQU07d0JBQ0wsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO3FCQUNsRTtvQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7aUJBQzlCO2dCQUVELElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUM7WUFDRCxRQUFRLEVBQUUsQ0FBQyxLQUFvQixFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDcEMsTUFBTSxPQUFPLEdBQUcsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTNDLFFBQVEsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzlFLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3JDLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQzs7bUlBbEpVLG1CQUFtQixrQkFtQlIsT0FBTzt1SEFuQmxCLG1CQUFtQjsyRkFBbkIsbUJBQW1CO2tCQUovQixTQUFTO21CQUFDO29CQUNULDhEQUE4RDtvQkFDOUQsUUFBUSxFQUFFLGNBQWM7aUJBQ3pCOzswQkFvQkksUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxPQUFPO2tKQWhCN0IsVUFBVTtzQkFEVCxLQUFLO2dCQUlOLG1CQUFtQjtzQkFEbEIsS0FBSztnQkFJTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBSU4sdUJBQXVCO3NCQUR0QixLQUFLO2dCQUdJLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIERpcmVjdGl2ZSxcclxuICBFbGVtZW50UmVmLFxyXG4gIEV2ZW50RW1pdHRlcixcclxuICBJbmplY3QsXHJcbiAgSW5wdXQsXHJcbiAgTmdab25lLFxyXG4gIE9uQ2hhbmdlcyxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE9wdGlvbmFsLFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgU2ltcGxlQ2hhbmdlLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgU29ydGFibGUsIHtPcHRpb25zfSBmcm9tICdzb3J0YWJsZWpzJztcclxuaW1wb3J0IHtHTE9CQUxTfSBmcm9tICcuL2dsb2JhbHMnO1xyXG5pbXBvcnQge1NvcnRhYmxlanNCaW5kaW5nc30gZnJvbSAnLi9zb3J0YWJsZWpzLWJpbmRpbmdzJztcclxuaW1wb3J0IHtTb3J0YWJsZWpzU2VydmljZX0gZnJvbSAnLi9zb3J0YWJsZWpzLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IHR5cGUgU29ydGFibGVEYXRhID0gYW55IHwgYW55W107XHJcblxyXG5jb25zdCBnZXRJbmRleGVzRnJvbUV2ZW50ID0gKGV2ZW50OiBTb3J0YWJsZUV2ZW50KSA9PiB7XHJcbiAgaWYgKGV2ZW50Lmhhc093blByb3BlcnR5KCduZXdEcmFnZ2FibGVJbmRleCcpICYmIGV2ZW50Lmhhc093blByb3BlcnR5KCdvbGREcmFnZ2FibGVJbmRleCcpKSB7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICBuZXc6IGV2ZW50Lm5ld0RyYWdnYWJsZUluZGV4LFxyXG4gICAgICBvbGQ6IGV2ZW50Lm9sZERyYWdnYWJsZUluZGV4LFxyXG4gICAgfTtcclxuICB9IGVsc2Uge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgbmV3OiBldmVudC5uZXdJbmRleCxcclxuICAgICAgb2xkOiBldmVudC5vbGRJbmRleCxcclxuICAgIH07XHJcbiAgfVxyXG59O1xyXG5cclxuQERpcmVjdGl2ZSh7XHJcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9kaXJlY3RpdmUtc2VsZWN0b3JcclxuICBzZWxlY3RvcjogJ1tzb3J0YWJsZWpzXScsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTb3J0YWJsZWpzRGlyZWN0aXZlIGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSB7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgc29ydGFibGVqczogU29ydGFibGVEYXRhOyAvLyBhcnJheSBvciBhIEZvcm1BcnJheVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNvcnRhYmxlanNDb250YWluZXI6IHN0cmluZztcclxuXHJcbiAgQElucHV0KClcclxuICBzb3J0YWJsZWpzT3B0aW9uczogT3B0aW9ucztcclxuXHJcbiAgQElucHV0KClcclxuICBzb3J0YWJsZWpzQ2xvbmVGdW5jdGlvbjogKGl0ZW06IGFueSkgPT4gYW55O1xyXG5cclxuICBAT3V0cHV0KCkgc29ydGFibGVqc0luaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XHJcblxyXG4gIHByaXZhdGUgc29ydGFibGVJbnN0YW5jZTogYW55O1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIEBPcHRpb25hbCgpIEBJbmplY3QoR0xPQkFMUykgcHJpdmF0ZSBnbG9iYWxDb25maWc6IE9wdGlvbnMsXHJcbiAgICBwcml2YXRlIHNlcnZpY2U6IFNvcnRhYmxlanNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSB6b25lOiBOZ1pvbmUsXHJcbiAgICBwcml2YXRlIHJlbmRlcmVyOiBSZW5kZXJlcjIsXHJcbiAgKSB7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIGlmIChTb3J0YWJsZSAmJiBTb3J0YWJsZS5jcmVhdGUpIHsgLy8gU29ydGFibGUgZG9lcyBub3QgZXhpc3QgaW4gYW5ndWxhciB1bml2ZXJzYWwgKFNTUilcclxuICAgICAgdGhpcy5jcmVhdGUoKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHsgW3Byb3AgaW4ga2V5b2YgU29ydGFibGVqc0RpcmVjdGl2ZV06IFNpbXBsZUNoYW5nZSB9KSB7XHJcbiAgICBjb25zdCBvcHRpb25zQ2hhbmdlOiBTaW1wbGVDaGFuZ2UgPSBjaGFuZ2VzLnNvcnRhYmxlanNPcHRpb25zO1xyXG5cclxuICAgIGlmIChvcHRpb25zQ2hhbmdlICYmICFvcHRpb25zQ2hhbmdlLmlzRmlyc3RDaGFuZ2UoKSkge1xyXG4gICAgICBjb25zdCBwcmV2aW91c09wdGlvbnM6IE9wdGlvbnMgPSBvcHRpb25zQ2hhbmdlLnByZXZpb3VzVmFsdWU7XHJcbiAgICAgIGNvbnN0IGN1cnJlbnRPcHRpb25zOiBPcHRpb25zID0gb3B0aW9uc0NoYW5nZS5jdXJyZW50VmFsdWU7XHJcblxyXG4gICAgICBPYmplY3Qua2V5cyhjdXJyZW50T3B0aW9ucykuZm9yRWFjaChvcHRpb25OYW1lID0+IHtcclxuICAgICAgICBpZiAoY3VycmVudE9wdGlvbnNbb3B0aW9uTmFtZV0gIT09IHByZXZpb3VzT3B0aW9uc1tvcHRpb25OYW1lXSkge1xyXG4gICAgICAgICAgLy8gdXNlIGxvdy1sZXZlbCBvcHRpb24gc2V0dGVyXHJcbiAgICAgICAgICB0aGlzLnNvcnRhYmxlSW5zdGFuY2Uub3B0aW9uKG9wdGlvbk5hbWUsIHRoaXMub3B0aW9uc1tvcHRpb25OYW1lXSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgaWYgKHRoaXMuc29ydGFibGVJbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLnNvcnRhYmxlSW5zdGFuY2UuZGVzdHJveSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjcmVhdGUoKSB7XHJcbiAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLnNvcnRhYmxlanNDb250YWluZXIgPyB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudC5xdWVyeVNlbGVjdG9yKHRoaXMuc29ydGFibGVqc0NvbnRhaW5lcikgOiB0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudDtcclxuXHJcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgdGhpcy5zb3J0YWJsZUluc3RhbmNlID0gU29ydGFibGUuY3JlYXRlKGNvbnRhaW5lciwgdGhpcy5vcHRpb25zKTtcclxuICAgICAgdGhpcy5zb3J0YWJsZWpzSW5pdC5lbWl0KHRoaXMuc29ydGFibGVJbnN0YW5jZSk7XHJcbiAgICB9LCAwKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0QmluZGluZ3MoKTogU29ydGFibGVqc0JpbmRpbmdzIHtcclxuICAgIGlmICghdGhpcy5zb3J0YWJsZWpzKSB7XHJcbiAgICAgIHJldHVybiBuZXcgU29ydGFibGVqc0JpbmRpbmdzKFtdKTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5zb3J0YWJsZWpzIGluc3RhbmNlb2YgU29ydGFibGVqc0JpbmRpbmdzKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnNvcnRhYmxlanM7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gbmV3IFNvcnRhYmxlanNCaW5kaW5ncyhbdGhpcy5zb3J0YWJsZWpzXSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBvcHRpb25zKCkge1xyXG4gICAgcmV0dXJuIHsuLi50aGlzLm9wdGlvbnNXaXRob3V0RXZlbnRzLCAuLi50aGlzLm92ZXJyaWRlbk9wdGlvbnN9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgb3B0aW9uc1dpdGhvdXRFdmVudHMoKSB7XHJcbiAgICByZXR1cm4gey4uLih0aGlzLmdsb2JhbENvbmZpZyB8fCB7fSksIC4uLih0aGlzLnNvcnRhYmxlanNPcHRpb25zIHx8IHt9KX07XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHByb3h5RXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIC4uLnBhcmFtczogYW55W10pIHtcclxuICAgIHRoaXMuem9uZS5ydW4oKCkgPT4geyAvLyByZS1lbnRlcmluZyB6b25lLCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL1NvcnRhYmxlSlMvYW5ndWxhci1zb3J0YWJsZWpzL2lzc3Vlcy8xMTAjaXNzdWVjb21tZW50LTQwODg3NDYwMFxyXG4gICAgICBpZiAodGhpcy5vcHRpb25zV2l0aG91dEV2ZW50cyAmJiB0aGlzLm9wdGlvbnNXaXRob3V0RXZlbnRzW2V2ZW50TmFtZV0pIHtcclxuICAgICAgICB0aGlzLm9wdGlvbnNXaXRob3V0RXZlbnRzW2V2ZW50TmFtZV0oLi4ucGFyYW1zKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldCBpc0Nsb25pbmcoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5zb3J0YWJsZUluc3RhbmNlLm9wdGlvbnMuZ3JvdXAuY2hlY2tQdWxsKHRoaXMuc29ydGFibGVJbnN0YW5jZSwgdGhpcy5zb3J0YWJsZUluc3RhbmNlKSA9PT0gJ2Nsb25lJztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgY2xvbmU8VD4oaXRlbTogVCk6IFQge1xyXG4gICAgLy8gYnkgZGVmYXVsdCBwYXNzIHRoZSBpdGVtIHRocm91Z2gsIG5vIGNsb25pbmcgcGVyZm9ybWVkXHJcbiAgICByZXR1cm4gKHRoaXMuc29ydGFibGVqc0Nsb25lRnVuY3Rpb24gfHwgKHN1Yml0ZW0gPT4gc3ViaXRlbSkpKGl0ZW0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXQgb3ZlcnJpZGVuT3B0aW9ucygpOiBPcHRpb25zIHtcclxuICAgIC8vIGFsd2F5cyBpbnRlcmNlcHQgc3RhbmRhcmQgZXZlbnRzIGJ1dCBhY3Qgb25seSBpbiBjYXNlIGl0ZW1zIGFyZSBzZXQgKGJpbmRpbmdFbmFibGVkKVxyXG4gICAgLy8gYWxsb3dzIHRvIGZvcmdldCBhYm91dCB0cmFja2luZyB0aGlzLml0ZW1zIGNoYW5nZXNcclxuICAgIHJldHVybiB7XHJcbiAgICAgIG9uQWRkOiAoZXZlbnQ6IFNvcnRhYmxlRXZlbnQpID0+IHtcclxuICAgICAgICB0aGlzLnNlcnZpY2UudHJhbnNmZXIgPSAoaXRlbXM6IGFueVtdKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmdldEJpbmRpbmdzKCkuaW5qZWN0SW50b0V2ZXJ5KGV2ZW50Lm5ld0luZGV4LCBpdGVtcyk7XHJcbiAgICAgICAgICB0aGlzLnByb3h5RXZlbnQoJ29uQWRkJywgZXZlbnQpO1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIHRoaXMucHJveHlFdmVudCgnb25BZGRPcmlnaW5hbCcsIGV2ZW50KTtcclxuICAgICAgfSxcclxuICAgICAgb25SZW1vdmU6IChldmVudDogU29ydGFibGVFdmVudCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IGJpbmRpbmdzID0gdGhpcy5nZXRCaW5kaW5ncygpO1xyXG5cclxuICAgICAgICBpZiAoYmluZGluZ3MucHJvdmlkZWQpIHtcclxuICAgICAgICAgIGlmICh0aGlzLmlzQ2xvbmluZykge1xyXG4gICAgICAgICAgICB0aGlzLnNlcnZpY2UudHJhbnNmZXIoYmluZGluZ3MuZ2V0RnJvbUV2ZXJ5KGV2ZW50Lm9sZEluZGV4KS5tYXAoaXRlbSA9PiB0aGlzLmNsb25lKGl0ZW0pKSk7XHJcblxyXG4gICAgICAgICAgICAvLyBncmVhdCB0aGFua3MgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RhdXVcclxuICAgICAgICAgICAgLy8gZXZlbnQuaXRlbSBpcyB0aGUgb3JpZ2luYWwgaXRlbSBmcm9tIHRoZSBzb3VyY2UgbGlzdCB3aGljaCBpcyBtb3ZlZCB0byB0aGUgdGFyZ2V0IGxpc3RcclxuICAgICAgICAgICAgLy8gZXZlbnQuY2xvbmUgaXMgYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgaXRlbSBhbmQgd2lsbCBiZSBhZGRlZCB0byBzb3VyY2UgbGlzdFxyXG4gICAgICAgICAgICAvLyBJZiBiaW5kaW5ncyBhcmUgcHJvdmlkZWQsIGFkZGluZyB0aGUgaXRlbSBkb20gZWxlbWVudCB0byB0aGUgdGFyZ2V0IGxpc3QgY2F1c2VzIGFydGlmYWN0c1xyXG4gICAgICAgICAgICAvLyBhcyBpdCBpbnRlcmZlcmVzIHdpdGggdGhlIHJlbmRlcmluZyBwZXJmb3JtZWQgYnkgdGhlIGFuZ3VsYXIgdGVtcGxhdGUuXHJcbiAgICAgICAgICAgIC8vIFRoZXJlZm9yZSB3ZSByZW1vdmUgaXQgaW1tZWRpYXRlbHkgYW5kIGFsc28gbW92ZSB0aGUgb3JpZ2luYWwgaXRlbSBiYWNrIHRvIHRoZSBzb3VyY2UgbGlzdC5cclxuICAgICAgICAgICAgLy8gKGV2ZW50IGhhbmRsZXIgbWF5IGJlIGF0dGFjaGVkIHRvIHRoZSBvcmlnaW5hbCBpdGVtIGFuZCBub3QgaXRzIGNsb25lLCB0aGVyZWZvcmUga2VlcGluZ1xyXG4gICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgZG9tIG5vZGUsIGNpcmN1bXZlbnRzIHNpZGUgZWZmZWN0cyApXHJcbiAgICAgICAgICAgIHRoaXMucmVuZGVyZXIucmVtb3ZlQ2hpbGQoZXZlbnQuaXRlbS5wYXJlbnROb2RlLCBldmVudC5pdGVtKTtcclxuICAgICAgICAgICAgdGhpcy5yZW5kZXJlci5pbnNlcnRCZWZvcmUoZXZlbnQuY2xvbmUucGFyZW50Tm9kZSwgZXZlbnQuaXRlbSwgZXZlbnQuY2xvbmUpO1xyXG4gICAgICAgICAgICB0aGlzLnJlbmRlcmVyLnJlbW92ZUNoaWxkKGV2ZW50LmNsb25lLnBhcmVudE5vZGUsIGV2ZW50LmNsb25lKTtcclxuICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuc2VydmljZS50cmFuc2ZlcihiaW5kaW5ncy5leHRyYWN0RnJvbUV2ZXJ5KGV2ZW50Lm9sZEluZGV4KSk7XHJcbiAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgdGhpcy5zZXJ2aWNlLnRyYW5zZmVyID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMucHJveHlFdmVudCgnb25SZW1vdmUnLCBldmVudCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIG9uVXBkYXRlOiAoZXZlbnQ6IFNvcnRhYmxlRXZlbnQpID0+IHtcclxuICAgICAgICBjb25zdCBiaW5kaW5ncyA9IHRoaXMuZ2V0QmluZGluZ3MoKTtcclxuICAgICAgICBjb25zdCBpbmRleGVzID0gZ2V0SW5kZXhlc0Zyb21FdmVudChldmVudCk7XHJcblxyXG4gICAgICAgIGJpbmRpbmdzLmluamVjdEludG9FdmVyeShpbmRleGVzLm5ldywgYmluZGluZ3MuZXh0cmFjdEZyb21FdmVyeShpbmRleGVzLm9sZCkpO1xyXG4gICAgICAgIHRoaXMucHJveHlFdmVudCgnb25VcGRhdGUnLCBldmVudCk7XHJcbiAgICAgIH0sXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbmludGVyZmFjZSBTb3J0YWJsZUV2ZW50IHtcclxuICBvbGRJbmRleDogbnVtYmVyO1xyXG4gIG5ld0luZGV4OiBudW1iZXI7XHJcbiAgb2xkRHJhZ2dhYmxlSW5kZXg/OiBudW1iZXI7XHJcbiAgbmV3RHJhZ2dhYmxlSW5kZXg/OiBudW1iZXI7XHJcbiAgaXRlbTogSFRNTEVsZW1lbnQ7XHJcbiAgY2xvbmU6IEhUTUxFbGVtZW50O1xyXG59XHJcbiJdfQ==