UNPKG

ngx-tree-dnd

Version:

Angular 7 support tree with drag-and-drop sortable data tree. It`s fast and smart.

338 lines 30.5 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; /* Copyright (C) 2018 Yaroslav Kikot This project is licensed under the terms of the MIT license. https://github.com/Zicrael/ngx-tree-dnd */ import { Component, Input } from '@angular/core'; import { FormBuilder, Validators } from '@angular/forms'; import { NgxTreeService } from '../ngx-tree-dnd.service'; var NgxTreeChildrenComponent = /** @class */ (function () { function NgxTreeChildrenComponent(treeService, fb) { this.treeService = treeService; this.fb = fb; } Object.defineProperty(NgxTreeChildrenComponent.prototype, "setItem", { // get item from parent component set: // get item from parent component /** * @param {?} data * @return {?} */ function (data) { this.element = data; this.itemOptions = { href: '#', hidden: false, hideChildrens: false, position: this.treeService.getItemPosition(this.element), draggable: true, edit: false, showActionButtons: true, currentlyDragging: false, destenationTop: false, destenationBottom: false, disabled: false, showExpandButton: true, showDeleteButton: true }; if (this.element.options) { this.setOptions(this.element.options); this.element.options = this.itemOptions; } else { this.element.options = this.itemOptions; } // enable subscribers this.enableSubscribers(); // create form this.createForm(); }, enumerable: true, configurable: true }); // enable subscribe to config // enable subscribe to config /** * @return {?} */ NgxTreeChildrenComponent.prototype.enableSubscribers = // enable subscribe to config /** * @return {?} */ function () { var _this = this; this.treeService.config.subscribe(function (config) { if (config !== null) { _this.config = config; } else { _this.config = _this.treeService.defaulConfig; } if (_this.element.options.draggable) { _this.element.options.draggable = _this.config.enableDragging; } }); }; // set options to item // set options to item /** * @param {?} options * @return {?} */ NgxTreeChildrenComponent.prototype.setOptions = // set options to item /** * @param {?} options * @return {?} */ function (options) { var e_1, _a; try { for (var _b = tslib_1.__values(Object.keys(options)), _c = _b.next(); !_c.done; _c = _b.next()) { var key = _c.value; this.setValue(key, options); } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (_c && !_c.done && (_a = _b.return)) _a.call(_b); } finally { if (e_1) throw e_1.error; } } }; // set value to options keys // set value to options keys /** * @param {?} item * @param {?} options * @return {?} */ NgxTreeChildrenComponent.prototype.setValue = // set value to options keys /** * @param {?} item * @param {?} options * @return {?} */ function (item, options) { this.itemOptions[item] = options[item]; }; // create edit form // create edit form /** * @return {?} */ NgxTreeChildrenComponent.prototype.createForm = // create edit form /** * @return {?} */ function () { this.renameForm = this.fb.group({ name: [this.element.name || '', [ Validators.required, Validators.minLength(this.config.minCharacterLength) ]], }); }; /* Event: onStartRenameItem; Enable rename mode in element Call onStartRenameItem() from tree service. */ /* Event: onStartRenameItem; Enable rename mode in element Call onStartRenameItem() from tree service. */ /** * @param {?} element * @return {?} */ NgxTreeChildrenComponent.prototype.enableRenameMode = /* Event: onStartRenameItem; Enable rename mode in element Call onStartRenameItem() from tree service. */ /** * @param {?} element * @return {?} */ function (element) { element.options.edit = true; this.treeService.startRenameItem(element); }; /* Event: onadditem; Generate id by new Date() by 'full year + day + time'. Call addNewItem() from tree service. */ /* Event: onadditem; Generate id by new Date() by 'full year + day + time'. Call addNewItem() from tree service. */ /** * @param {?} name * @param {?} item * @return {?} */ NgxTreeChildrenComponent.prototype.submitAdd = /* Event: onadditem; Generate id by new Date() by 'full year + day + time'. Call addNewItem() from tree service. */ /** * @param {?} name * @param {?} item * @return {?} */ function (name, item) { /** @type {?} */ var d = "" + new Date().getFullYear() + new Date().getDay() + new Date().getTime(); /** @type {?} */ var elemId = parseInt(d, null); this.treeService.addNewItem(elemId, name, item); this.element.options.hideChildrens = false; }; /* Event: onFinishRenameItem; Check is form valid. Call addNewItem() from tree service. */ /* Event: onFinishRenameItem; Check is form valid. Call addNewItem() from tree service. */ /** * @param {?} item * @return {?} */ NgxTreeChildrenComponent.prototype.submitRename = /* Event: onFinishRenameItem; Check is form valid. Call addNewItem() from tree service. */ /** * @param {?} item * @return {?} */ function (item) { if (this.renameForm.valid) { this.showError = false; this.treeService.finishRenameItem(this.renameForm.value.name, item.id); this.element.options.edit = false; } else { this.showError = true; } }; /* Events: onStartDeleteItem, onFinishDeleteItem, onCancelDeleteItem. Check is item edit, then if name empty delete item. Call deleteItem() from tree service. */ /* Events: onStartDeleteItem, onFinishDeleteItem, onCancelDeleteItem. Check is item edit, then if name empty delete item. Call deleteItem() from tree service. */ /** * @param {?} item * @return {?} */ NgxTreeChildrenComponent.prototype.onSubmitDelete = /* Events: onStartDeleteItem, onFinishDeleteItem, onCancelDeleteItem. Check is item edit, then if name empty delete item. Call deleteItem() from tree service. */ /** * @param {?} item * @return {?} */ function (item) { if (!this.element.options.edit) { this.treeService.deleteItem(item.id); } else { if (item.name === null) { this.treeService.deleteItem(item.id); } else { this.element.options.edit = false; } } }; // after view init // after view init /** * @return {?} */ NgxTreeChildrenComponent.prototype.ngAfterViewInit = // after view init /** * @return {?} */ function () { }; NgxTreeChildrenComponent.decorators = [ { type: Component, args: [{ selector: 'lib-ngx-tree-children', template: "<div class='tree-child' id={{element.id}} libDragElement [draggableValue]='element.options.draggable' [item]='element' [ngClass]=\"{disabled : element.options.disabled}\">\n <div *ngIf=\"element && element.options\" class='d-flex'>\n <div *ngIf='config' [ngClass]=\"{hidden : element.options.hidden}\">\n <div class='tree-title d-inline-flex pos-relative' [ngClass]=\"{destenationTop : element.options.destenationTop, destenationBottom: element.options.destenationBottom}\" *ngIf=\"!element.options.edit;else onEdit\">\n <div *ngIf=\"!config.setItemsAsLinks; else link\" [ngClass]=\"{addOpacity : element.options.currentlyDragging}\" libDropElement\n [item]='element' class='draggable-item'>\n {{element.name}}\n </div>\n <ng-template #link>\n <div [ngClass]=\"{addOpacity : element.options.currentlyDragging}\" libDropElement\n [item]='element' class='draggable-item'>\n <a [href]=\"element.options.href\" class='tree-link'>{{element.name}}</a>\n </div>\n </ng-template>\n <div class='d-flex buttons-bar' *ngIf=\"config.showActionButtons && element.options.showActionButtons && !element.options.disabled\">\n <div class='d-flex'>\n <button class=\"tree-btn add-btn\" *ngIf=\"config.showAddButtons\" (click)=\"submitAdd(null, element)\">\n <fa-icon icon=\"plus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn edit-btn\" *ngIf=\"config.showRenameButtons\" (click)=\"enableRenameMode(element)\">\n <fa-icon icon=\"edit\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <div class='d-flex'>\n <button class=\"tree-btn delete-btn\" *ngIf=\"config.showDeleteButtons && element.options.showDeleteButton\" (click)=\"onSubmitDelete( element )\">\n <fa-icon icon=\"times\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n </div>\n <div class='child-drop-place' [attr.data-id]='element.id' libDropElement *ngIf='element.options.showDropChildZone && !element.options.disabled'>\n <fa-icon icon=\"arrow-down\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </div>\n <div class='show-hide-switch' *ngIf=\"config.enableExpandButtons && element.options.showExpandButton && element.childrens.length > 0 && !element.options.disabled\">\n <div *ngIf=\"element.options.hideChildrens; else visible\">\n <button class='tree-btn show-btn' (click)='element.options.hideChildrens = false'>\n <fa-icon icon=\"plus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </div>\n <ng-template #visible>\n <button class='tree-btn hide-btn' (click)='element.options.hideChildrens = true'>\n <fa-icon icon=\"minus\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n </ng-template>\n </div>\n </div>\n <ng-template #onEdit>\n <div class='tree-title d-inline-flex'>\n <form [formGroup]=\"renameForm\" class='d-flex' (submit)='submitRename(element)'>\n <input type=\"text\" class='input-rename' formControlName=\"name\" libAutoFocus=\"true\" [style.font-size.px]='config.setFontSize'>\n </form>\n <div class='d-flex'>\n <button class='tree-btn submit-btn' (click)='submitRename(element)'>\n <fa-icon icon=\"check\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n <button class='tree-btn delete-btn' (click)='onSubmitDelete(element)'>\n <fa-icon icon=\"times\" [style.font-size.px]='config.setIconSize'></fa-icon>\n </button>\n <div class='error-edit-wrap' *ngIf=\"showError\">\n {{config.validationText}}\n </div>\n </div>\n </div>\n </ng-template>\n <div class=\"tree-content\" *ngIf=\"element.childrens && !element.options.hideChildrens\">\n <lib-ngx-tree-children [setItem]=\"child\" *ngFor='let child of element.childrens'></lib-ngx-tree-children>\n </div>\n </div>\n </div>\n</div>\n" },] }, ]; /** @nocollapse */ NgxTreeChildrenComponent.ctorParameters = function () { return [ { type: NgxTreeService }, { type: FormBuilder } ]; }; NgxTreeChildrenComponent.propDecorators = { setItem: [{ type: Input }] }; return NgxTreeChildrenComponent; }()); export { NgxTreeChildrenComponent }; if (false) { /** @type {?} */ NgxTreeChildrenComponent.prototype.showError; /** @type {?} */ NgxTreeChildrenComponent.prototype.config; /** @type {?} */ NgxTreeChildrenComponent.prototype.element; /** @type {?} */ NgxTreeChildrenComponent.prototype.dragable; /** @type {?} */ NgxTreeChildrenComponent.prototype.itemOptions; /** @type {?} */ NgxTreeChildrenComponent.prototype.childrensArray; /** @type {?} */ NgxTreeChildrenComponent.prototype.renameForm; /** * @type {?} * @private */ NgxTreeChildrenComponent.prototype.treeService; /** * @type {?} * @private */ NgxTreeChildrenComponent.prototype.fb; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmd4LXRyZWUtZG5kLWNoaWxkcmVuLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC10cmVlLWRuZC8iLCJzb3VyY2VzIjpbImxpYi9uZ3gtdHJlZS1kbmQtY2hpbGRyZW4vbmd4LXRyZWUtZG5kLWNoaWxkcmVuLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7O0FBTUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQWlCLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFekQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBR3pEO0lBb0hFLGtDQUFvQixXQUEyQixFQUFVLEVBQWU7UUFBcEQsZ0JBQVcsR0FBWCxXQUFXLENBQWdCO1FBQVUsT0FBRSxHQUFGLEVBQUUsQ0FBYTtJQUFHLENBQUM7SUEvQjVFLHNCQUNJLDZDQUFPO1FBRlgsaUNBQWlDOzs7Ozs7O1FBQ2pDLFVBQ1ksSUFBZTtZQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUNwQixJQUFJLENBQUMsV0FBVyxHQUFHO2dCQUNqQixJQUFJLEVBQUUsR0FBRztnQkFDVCxNQUFNLEVBQUUsS0FBSztnQkFDYixhQUFhLEVBQUUsS0FBSztnQkFDcEIsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQ3hELFNBQVMsRUFBRSxJQUFJO2dCQUNmLElBQUksRUFBRSxLQUFLO2dCQUNYLGlCQUFpQixFQUFFLElBQUk7Z0JBQ3ZCLGlCQUFpQixFQUFFLEtBQUs7Z0JBQ3hCLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixpQkFBaUIsRUFBRSxLQUFLO2dCQUN4QixRQUFRLEVBQUUsS0FBSztnQkFDZixnQkFBZ0IsRUFBRSxJQUFJO2dCQUN0QixnQkFBZ0IsRUFBRSxJQUFJO2FBQ3ZC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Y0FBbUIsQ0FBQzs7Z0JBdE5yQixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLHVCQUF1QjtvQkFDakMsUUFBUSxFQUFFLHd3SUF1RVg7aUJBQ0E7Ozs7Z0JBN0VRLGNBQWM7Z0JBRmQsV0FBVzs7OzBCQTBGakIsS0FBSzs7SUFrSVIsK0JBQUM7Q0FBQSxBQXZORCxJQXVOQztTQTVJWSx3QkFBd0I7OztJQUNuQyw2Q0FBbUI7O0lBQ25CLDBDQUFtQjs7SUFDbkIsMkNBQW1COztJQUNuQiw0Q0FBa0I7O0lBQ2xCLCtDQUE2Qjs7SUFDN0Isa0RBQTRCOztJQUM1Qiw4Q0FBVzs7Ozs7SUFrQ0MsK0NBQW1DOzs7OztJQUFFLHNDQUF1QiIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gQ29weXJpZ2h0IChDKSAyMDE4IFlhcm9zbGF2IEtpa290XG4gVGhpcyBwcm9qZWN0IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgTUlUIGxpY2Vuc2UuXG4gaHR0cHM6Ly9naXRodWIuY29tL1ppY3JhZWwvbmd4LXRyZWUtZG5kXG4gKi9cblxuaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUJ1aWxkZXIsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE5neFRyZWVTZXJ2aWNlIH0gZnJvbSAnLi4vbmd4LXRyZWUtZG5kLnNlcnZpY2UnO1xuaW1wb3J0IHsgVHJlZU1vZGVsLCBUcmVlQ29uZmlnLCBUcmVlSXRlbU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMvdHJlZS12aWV3Lm1vZGVsJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbGliLW5neC10cmVlLWNoaWxkcmVuJyxcbiAgdGVtcGxhdGU6IGA8ZGl2IGNsYXNzPSd0cmVlLWNoaWxkJyBpZD17e2VsZW1lbnQuaWR9fSBsaWJEcmFnRWxlbWVudCBbZHJhZ2dhYmxlVmFsdWVdPSdlbGVtZW50Lm9wdGlvbnMuZHJhZ2dhYmxlJyBbaXRlbV09J2VsZW1lbnQnIFtuZ0NsYXNzXT1cIntkaXNhYmxlZCA6IGVsZW1lbnQub3B0aW9ucy5kaXNhYmxlZH1cIj5cbiAgPGRpdiAqbmdJZj1cImVsZW1lbnQgJiYgZWxlbWVudC5vcHRpb25zXCIgY2xhc3M9J2QtZmxleCc+XG4gICAgPGRpdiAqbmdJZj0nY29uZmlnJyBbbmdDbGFzc109XCJ7aGlkZGVuIDogZWxlbWVudC5vcHRpb25zLmhpZGRlbn1cIj5cbiAgICAgIDxkaXYgY2xhc3M9J3RyZWUtdGl0bGUgZC1pbmxpbmUtZmxleCBwb3MtcmVsYXRpdmUnIFtuZ0NsYXNzXT1cIntkZXN0ZW5hdGlvblRvcCA6IGVsZW1lbnQub3B0aW9ucy5kZXN0ZW5hdGlvblRvcCwgZGVzdGVuYXRpb25Cb3R0b206IGVsZW1lbnQub3B0aW9ucy5kZXN0ZW5hdGlvbkJvdHRvbX1cIiAqbmdJZj1cIiFlbGVtZW50Lm9wdGlvbnMuZWRpdDtlbHNlIG9uRWRpdFwiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwiIWNvbmZpZy5zZXRJdGVtc0FzTGlua3M7IGVsc2UgbGlua1wiIFtuZ0NsYXNzXT1cInthZGRPcGFjaXR5IDogZWxlbWVudC5vcHRpb25zLmN1cnJlbnRseURyYWdnaW5nfVwiIGxpYkRyb3BFbGVtZW50XG4gICAgICAgICAgW2l0ZW1dPSdlbGVtZW50JyBjbGFzcz0nZHJhZ2dhYmxlLWl0ZW0nPlxuICAgICAgICAgIHt7ZWxlbWVudC5uYW1lfX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjbGluaz5cbiAgICAgICAgICA8ZGl2IFtuZ0NsYXNzXT1cInthZGRPcGFjaXR5IDogZWxlbWVudC5vcHRpb25zLmN1cnJlbnRseURyYWdnaW5nfVwiIGxpYkRyb3BFbGVtZW50XG4gICAgICAgICAgW2l0ZW1dPSdlbGVtZW50JyBjbGFzcz0nZHJhZ2dhYmxlLWl0ZW0nPlxuICAgICAgICAgICAgPGEgW2hyZWZdPVwiZWxlbWVudC5vcHRpb25zLmhyZWZcIiBjbGFzcz0ndHJlZS1saW5rJz57e2VsZW1lbnQubmFtZX19PC9hPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXggYnV0dG9ucy1iYXInICpuZ0lmPVwiY29uZmlnLnNob3dBY3Rpb25CdXR0b25zICYmIGVsZW1lbnQub3B0aW9ucy5zaG93QWN0aW9uQnV0dG9ucyAmJiAhZWxlbWVudC5vcHRpb25zLmRpc2FibGVkXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBhZGQtYnRuXCIgKm5nSWY9XCJjb25maWcuc2hvd0FkZEJ1dHRvbnNcIiAoY2xpY2spPVwic3VibWl0QWRkKG51bGwsIGVsZW1lbnQpXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJwbHVzXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz0nZC1mbGV4Jz5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJ0cmVlLWJ0biBlZGl0LWJ0blwiICpuZ0lmPVwiY29uZmlnLnNob3dSZW5hbWVCdXR0b25zXCIgKGNsaWNrKT1cImVuYWJsZVJlbmFtZU1vZGUoZWxlbWVudClcIj5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImVkaXRcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0nY29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInRyZWUtYnRuIGRlbGV0ZS1idG5cIiAqbmdJZj1cImNvbmZpZy5zaG93RGVsZXRlQnV0dG9ucyAmJiBlbGVtZW50Lm9wdGlvbnMuc2hvd0RlbGV0ZUJ1dHRvblwiIChjbGljayk9XCJvblN1Ym1pdERlbGV0ZSggZWxlbWVudCApXCI+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nY2hpbGQtZHJvcC1wbGFjZScgW2F0dHIuZGF0YS1pZF09J2VsZW1lbnQuaWQnICBsaWJEcm9wRWxlbWVudCAqbmdJZj0nZWxlbWVudC5vcHRpb25zLnNob3dEcm9wQ2hpbGRab25lICYmICFlbGVtZW50Lm9wdGlvbnMuZGlzYWJsZWQnPlxuICAgICAgICAgIDxmYS1pY29uIGljb249XCJhcnJvdy1kb3duXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz0nc2hvdy1oaWRlLXN3aXRjaCcgKm5nSWY9XCJjb25maWcuZW5hYmxlRXhwYW5kQnV0dG9ucyAmJiBlbGVtZW50Lm9wdGlvbnMuc2hvd0V4cGFuZEJ1dHRvbiAmJiBlbGVtZW50LmNoaWxkcmVucy5sZW5ndGggPiAwICYmICFlbGVtZW50Lm9wdGlvbnMuZGlzYWJsZWRcIj5cbiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiZWxlbWVudC5vcHRpb25zLmhpZGVDaGlsZHJlbnM7IGVsc2UgdmlzaWJsZVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc2hvdy1idG4nIChjbGljayk9J2VsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zID0gZmFsc2UnPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwicGx1c1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjdmlzaWJsZT5cbiAgICAgICAgICAgIDxidXR0b24gY2xhc3M9J3RyZWUtYnRuIGhpZGUtYnRuJyAoY2xpY2spPSdlbGVtZW50Lm9wdGlvbnMuaGlkZUNoaWxkcmVucyA9IHRydWUnPlxuICAgICAgICAgICAgICA8ZmEtaWNvbiBpY29uPVwibWludXNcIiBbc3R5bGUuZm9udC1zaXplLnB4XT0nY29uZmlnLnNldEljb25TaXplJz48L2ZhLWljb24+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPG5nLXRlbXBsYXRlICNvbkVkaXQ+XG4gICAgICAgIDxkaXYgY2xhc3M9J3RyZWUtdGl0bGUgZC1pbmxpbmUtZmxleCc+XG4gICAgICAgICAgPGZvcm0gW2Zvcm1Hcm91cF09XCJyZW5hbWVGb3JtXCIgY2xhc3M9J2QtZmxleCcgKHN1Ym1pdCk9J3N1Ym1pdFJlbmFtZShlbGVtZW50KSc+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz0naW5wdXQtcmVuYW1lJyBmb3JtQ29udHJvbE5hbWU9XCJuYW1lXCIgbGliQXV0b0ZvY3VzPVwidHJ1ZVwiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0Rm9udFNpemUnPlxuICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICA8ZGl2IGNsYXNzPSdkLWZsZXgnPlxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0ndHJlZS1idG4gc3VibWl0LWJ0bicgKGNsaWNrKT0nc3VibWl0UmVuYW1lKGVsZW1lbnQpJz5cbiAgICAgICAgICAgICAgPGZhLWljb24gaWNvbj1cImNoZWNrXCIgW3N0eWxlLmZvbnQtc2l6ZS5weF09J2NvbmZpZy5zZXRJY29uU2l6ZSc+PC9mYS1pY29uPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPSd0cmVlLWJ0biBkZWxldGUtYnRuJyAoY2xpY2spPSdvblN1Ym1pdERlbGV0ZShlbGVtZW50KSc+XG4gICAgICAgICAgICAgIDxmYS1pY29uIGljb249XCJ0aW1lc1wiIFtzdHlsZS5mb250LXNpemUucHhdPSdjb25maWcuc2V0SWNvblNpemUnPjwvZmEtaWNvbj5cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz0nZXJyb3ItZWRpdC13cmFwJyAqbmdJZj1cInNob3dFcnJvclwiPlxuICAgICAgICAgICAgICB7e2NvbmZpZy52YWxpZGF0aW9uVGV4dH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgPGRpdiBjbGFzcz1cInRyZWUtY29udGVudFwiICpuZ0lmPVwiZWxlbWVudC5jaGlsZHJlbnMgJiYgIWVsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zXCI+XG4gICAgICAgIDxsaWItbmd4LXRyZWUtY2hpbGRyZW4gW3NldEl0ZW1dPVwiY2hpbGRcIiAqbmdGb3I9J2xldCBjaGlsZCBvZiBlbGVtZW50LmNoaWxkcmVucyc+PC9saWItbmd4LXRyZWUtY2hpbGRyZW4+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48L2Rpdj5cbmBcbn0pXG5leHBvcnQgY2xhc3MgTmd4VHJlZUNoaWxkcmVuQ29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG4gIHNob3dFcnJvcjogYm9vbGVhbjtcbiAgY29uZmlnOiBUcmVlQ29uZmlnO1xuICBlbGVtZW50OiBUcmVlTW9kZWw7XG4gIGRyYWdhYmxlOiBib29sZWFuO1xuICBpdGVtT3B0aW9uczogVHJlZUl0ZW1PcHRpb25zO1xuICBjaGlsZHJlbnNBcnJheTogVHJlZU1vZGVsW107XG4gIHJlbmFtZUZvcm07XG5cbiAgLy8gZ2V0IGl0ZW0gZnJvbSBwYXJlbnQgY29tcG9uZW50XG4gIEBJbnB1dCgpXG4gIHNldCBzZXRJdGVtKGRhdGE6IFRyZWVNb2RlbCkge1xuICAgIHRoaXMuZWxlbWVudCA9IGRhdGE7XG4gICAgdGhpcy5pdGVtT3B0aW9ucyA9IHtcbiAgICAgIGhyZWY6ICcjJyxcbiAgICAgIGhpZGRlbjogZmFsc2UsXG4gICAgICBoaWRlQ2hpbGRyZW5zOiBmYWxzZSxcbiAgICAgIHBvc2l0aW9uOiB0aGlzLnRyZWVTZXJ2aWNlLmdldEl0ZW1Qb3NpdGlvbih0aGlzLmVsZW1lbnQpLFxuICAgICAgZHJhZ2dhYmxlOiB0cnVlLFxuICAgICAgZWRpdDogZmFsc2UsXG4gICAgICBzaG93QWN0aW9uQnV0dG9uczogdHJ1ZSxcbiAgICAgIGN1cnJlbnRseURyYWdnaW5nOiBmYWxzZSxcbiAgICAgIGRlc3RlbmF0aW9uVG9wOiBmYWxzZSxcbiAgICAgIGRlc3RlbmF0aW9uQm90dG9tOiBmYWxzZSxcbiAgICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICAgIHNob3dFeHBhbmRCdXR0b246IHRydWUsXG4gICAgICBzaG93RGVsZXRlQnV0dG9uOiB0cnVlXG4gICAgfTtcbiAgICBpZiAodGhpcy5lbGVtZW50Lm9wdGlvbnMpIHtcbiAgICAgIHRoaXMuc2V0T3B0aW9ucyh0aGlzLmVsZW1lbnQub3B0aW9ucyk7XG4gICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucyA9IHRoaXMuaXRlbU9wdGlvbnM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zID0gdGhpcy5pdGVtT3B0aW9ucztcbiAgICB9XG5cbiAgICAvLyBlbmFibGUgc3Vic2NyaWJlcnNcbiAgICB0aGlzLmVuYWJsZVN1YnNjcmliZXJzKCk7XG4gICAgLy8gY3JlYXRlIGZvcm1cbiAgICB0aGlzLmNyZWF0ZUZvcm0oKTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdHJlZVNlcnZpY2U6IE5neFRyZWVTZXJ2aWNlLCBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcikge31cblxuICAvLyBlbmFibGUgc3Vic2NyaWJlIHRvIGNvbmZpZ1xuICBlbmFibGVTdWJzY3JpYmVycygpIHtcbiAgICB0aGlzLnRyZWVTZXJ2aWNlLmNvbmZpZy5zdWJzY3JpYmUoXG4gICAgICAoY29uZmlnKSA9PiB7XG4gICAgICAgIGlmICggY29uZmlnICE9PSBudWxsICkge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuY29uZmlnID0gdGhpcy50cmVlU2VydmljZS5kZWZhdWxDb25maWc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5vcHRpb25zLmRyYWdnYWJsZSkge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zLmRyYWdnYWJsZSA9IHRoaXMuY29uZmlnLmVuYWJsZURyYWdnaW5nO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIC8vIHNldCBvcHRpb25zIHRvIGl0ZW1cbiAgc2V0T3B0aW9ucyhvcHRpb25zKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICAgIHRoaXMuc2V0VmFsdWUoa2V5LCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvLyBzZXQgdmFsdWUgdG8gb3B0aW9ucyBrZXlzXG4gIHNldFZhbHVlKGl0ZW0sIG9wdGlvbnMpIHtcbiAgICB0aGlzLml0ZW1PcHRpb25zW2l0ZW1dID0gb3B0aW9uc1tpdGVtXTtcbiAgfVxuXG4gIC8vIGNyZWF0ZSBlZGl0IGZvcm1cbiAgY3JlYXRlRm9ybSgpIHtcbiAgICB0aGlzLnJlbmFtZUZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgIG5hbWU6IFt0aGlzLmVsZW1lbnQubmFtZSB8fCAnJyAsIFtcbiAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCxcbiAgICAgICAgVmFsaWRhdG9ycy5taW5MZW5ndGgoIHRoaXMuY29uZmlnLm1pbkNoYXJhY3Rlckxlbmd0aCApXG4gICAgICBdXSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAgRXZlbnQ6IG9uU3RhcnRSZW5hbWVJdGVtO1xuICAgIEVuYWJsZSByZW5hbWUgbW9kZSBpbiBlbGVtZW50XG4gICAgQ2FsbCBvblN0YXJ0UmVuYW1lSXRlbSgpIGZyb20gdHJlZSBzZXJ2aWNlLlxuICAqL1xuICBlbmFibGVSZW5hbWVNb2RlKGVsZW1lbnQpIHtcbiAgICBlbGVtZW50Lm9wdGlvbnMuZWRpdCA9IHRydWU7XG4gICAgdGhpcy50cmVlU2VydmljZS5zdGFydFJlbmFtZUl0ZW0oZWxlbWVudCk7XG4gIH1cblxuICAvKlxuICAgIEV2ZW50OiBvbmFkZGl0ZW07XG4gICAgR2VuZXJhdGUgaWQgYnkgbmV3IERhdGUoKSBieSAnZnVsbCB5ZWFyICsgZGF5ICsgdGltZScuXG4gICAgQ2FsbCBhZGROZXdJdGVtKCkgZnJvbSB0cmVlIHNlcnZpY2UuXG4gICovXG4gIHN1Ym1pdEFkZChuYW1lLCBpdGVtICkge1xuICAgICAgY29uc3QgZCA9IGAke25ldyBEYXRlKCkuZ2V0RnVsbFllYXIoKX0ke25ldyBEYXRlKCkuZ2V0RGF5KCl9JHtuZXcgRGF0ZSgpLmdldFRpbWUoKX1gO1xuICAgICAgY29uc3QgZWxlbUlkID0gIHBhcnNlSW50KGQsIG51bGwpO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5hZGROZXdJdGVtKGVsZW1JZCwgbmFtZSwgaXRlbSk7XG4gICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5oaWRlQ2hpbGRyZW5zID0gZmFsc2U7XG4gIH1cblxuICAvKlxuICAgIEV2ZW50OiBvbkZpbmlzaFJlbmFtZUl0ZW07XG4gICAgQ2hlY2sgaXMgZm9ybSB2YWxpZC5cbiAgICBDYWxsIGFkZE5ld0l0ZW0oKSBmcm9tIHRyZWUgc2VydmljZS5cbiAgKi9cbiAgc3VibWl0UmVuYW1lKGl0ZW0pIHtcbiAgICBpZiAodGhpcy5yZW5hbWVGb3JtLnZhbGlkKSB7XG4gICAgICB0aGlzLnNob3dFcnJvciA9IGZhbHNlO1xuICAgICAgdGhpcy50cmVlU2VydmljZS5maW5pc2hSZW5hbWVJdGVtKHRoaXMucmVuYW1lRm9ybS52YWx1ZS5uYW1lLCBpdGVtLmlkKTtcbiAgICAgIHRoaXMuZWxlbWVudC5vcHRpb25zLmVkaXQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zaG93RXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qXG4gICAgRXZlbnRzOlxuICAgIG9uU3RhcnREZWxldGVJdGVtLFxuICAgIG9uRmluaXNoRGVsZXRlSXRlbSwgICAgXG4gICAgb25DYW5jZWxEZWxldGVJdGVtLlxuICAgIENoZWNrIGlzIGl0ZW0gZWRpdCwgdGhlbiBpZiBuYW1lIGVtcHR5IGRlbGV0ZSBpdGVtLlxuICAgIENhbGwgZGVsZXRlSXRlbSgpIGZyb20gdHJlZSBzZXJ2aWNlLlxuICAqL1xuICBvblN1Ym1pdERlbGV0ZShpdGVtKSB7XG4gICAgaWYgKCF0aGlzLmVsZW1lbnQub3B0aW9ucy5lZGl0KSB7XG4gICAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlbGV0ZUl0ZW0oaXRlbS5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICggaXRlbS5uYW1lID09PSBudWxsICkge1xuICAgICAgICB0aGlzLnRyZWVTZXJ2aWNlLmRlbGV0ZUl0ZW0oaXRlbS5pZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQub3B0aW9ucy5lZGl0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gYWZ0ZXIgdmlldyBpbml0XG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHt9XG59XG4iXX0=