Skip to content

Instantly share code, notes, and snippets.

@elvisbegovic
Created November 8, 2019 11:45
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save elvisbegovic/84a83e66e6175fc647768c53c6d77e51 to your computer and use it in GitHub Desktop.
Save elvisbegovic/84a83e66e6175fc647768c53c6d77e51 to your computer and use it in GitHub Desktop.
tree.component.js
import * as ɵngcc0 from '@angular/core';
const _c0 = ["loadingTemplate"];
const _c1 = ["treeNodeTemplate"];
const _c2 = ["treeNodeWrapperTemplate"];
const _c3 = ["treeNodeFullTemplate"];
const _c4 = ["viewport"];
const _c5 = function (a0, a1, a2, a3) { return { loadingTemplate: a0, treeNodeTemplate: a1, treeNodeWrapperTemplate: a2, treeNodeFullTemplate: a3 }; };
function TreeComponent_tree_node_collection_3_Template(rf, ctx) { if (rf & 1) {
ɵngcc0.ɵɵelement(0, "tree-node-collection", 4);
} if (rf & 2) {
const ctx_r3 = ɵngcc0.ɵɵnextContext();
ɵngcc0.ɵɵproperty("nodes", ctx_r3.treeModel.roots)("treeModel", ctx_r3.treeModel)("templates", ɵngcc0.ɵɵpureFunction4(3, _c5, ctx_r3.loadingTemplate, ctx_r3.treeNodeTemplate, ctx_r3.treeNodeWrapperTemplate, ctx_r3.treeNodeFullTemplate));
} }
function TreeComponent_tree_node_drop_slot_4_Template(rf, ctx) { if (rf & 1) {
ɵngcc0.ɵɵelement(0, "tree-node-drop-slot", 5);
} if (rf & 2) {
const ctx_r4 = ɵngcc0.ɵɵnextContext();
ɵngcc0.ɵɵproperty("dropIndex", 0)("node", ctx_r4.treeModel.virtualRoot);
} }
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __metadata = (this && this.__metadata) || function (k, v) {
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
};
import { Component, ContentChild, EventEmitter, HostListener, Input, Output, TemplateRef, ViewChild } from '@angular/core';
import { TreeModel } from '../models/tree.model';
import { TreeDraggedElement } from '../models/tree-dragged-element.model';
import { TreeViewportComponent } from './tree-viewport.component';
import includes from 'lodash/includes';
import pick from 'lodash/pick';
var TreeComponent = /** @class */ (function () {
function TreeComponent(treeModel, treeDraggedElement) {
var _this = this;
this.treeModel = treeModel;
this.treeDraggedElement = treeDraggedElement;
treeModel.eventNames.forEach(function (name) { return _this[name] = new EventEmitter(); });
treeModel.subscribeToState(function (state) { return _this.stateChange.emit(state); });
}
Object.defineProperty(TreeComponent.prototype, "nodes", {
// Will be handled in ngOnChanges
set: function (nodes) {
},
enumerable: true,
configurable: true
});
;
Object.defineProperty(TreeComponent.prototype, "options", {
set: function (options) {
},
enumerable: true,
configurable: true
});
;
Object.defineProperty(TreeComponent.prototype, "focused", {
set: function (value) {
this.treeModel.setFocus(value);
},
enumerable: true,
configurable: true
});
Object.defineProperty(TreeComponent.prototype, "state", {
set: function (state) {
this.treeModel.setState(state);
},
enumerable: true,
configurable: true
});
TreeComponent.prototype.onKeydown = function ($event) {
if (!this.treeModel.isFocused)
return;
if (includes(['input', 'textarea'], document.activeElement.tagName.toLowerCase()))
return;
var focusedNode = this.treeModel.getFocusedNode();
this.treeModel.performKeyAction(focusedNode, $event);
};
TreeComponent.prototype.onMousedown = function ($event) {
function isOutsideClick(startElement, nodeName) {
return !startElement ? true : startElement.localName === nodeName ? false : isOutsideClick(startElement.parentElement, nodeName);
}
if (isOutsideClick($event.target, 'tree-root')) {
this.treeModel.setFocus(false);
}
};
TreeComponent.prototype.ngOnChanges = function (changes) {
if (changes.options || changes.nodes) {
this.treeModel.setData({
options: changes.options && changes.options.currentValue,
nodes: changes.nodes && changes.nodes.currentValue,
events: pick(this, this.treeModel.eventNames)
});
}
};
TreeComponent.prototype.sizeChanged = function () {
this.viewportComponent.setViewport();
};
__decorate([
ContentChild('loadingTemplate', { static: false }),
__metadata("design:type", TemplateRef)
], TreeComponent.prototype, "loadingTemplate", void 0);
__decorate([
ContentChild('treeNodeTemplate', { static: false }),
__metadata("design:type", TemplateRef)
], TreeComponent.prototype, "treeNodeTemplate", void 0);
__decorate([
ContentChild('treeNodeWrapperTemplate', { static: false }),
__metadata("design:type", TemplateRef)
], TreeComponent.prototype, "treeNodeWrapperTemplate", void 0);
__decorate([
ContentChild('treeNodeFullTemplate', { static: false }),
__metadata("design:type", TemplateRef)
], TreeComponent.prototype, "treeNodeFullTemplate", void 0);
__decorate([
ViewChild('viewport', { static: false }),
__metadata("design:type", TreeViewportComponent)
], TreeComponent.prototype, "viewportComponent", void 0);
__decorate([
Input(),
__metadata("design:type", Array),
__metadata("design:paramtypes", [Array])
], TreeComponent.prototype, "nodes", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], TreeComponent.prototype, "options", null);
__decorate([
Input(),
__metadata("design:type", Boolean),
__metadata("design:paramtypes", [Boolean])
], TreeComponent.prototype, "focused", null);
__decorate([
Input(),
__metadata("design:type", Object),
__metadata("design:paramtypes", [Object])
], TreeComponent.prototype, "state", null);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "toggleExpanded", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "activate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "deactivate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "nodeActivate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "nodeDeactivate", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "select", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "deselect", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "focus", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "blur", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "updateData", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "initialized", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "moveNode", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "copyNode", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "loadNodeChildren", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "changeFilter", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "event", void 0);
__decorate([
Output(),
__metadata("design:type", Object)
], TreeComponent.prototype, "stateChange", void 0);
__decorate([
HostListener('body: keydown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TreeComponent.prototype, "onKeydown", null);
__decorate([
HostListener('body: mousedown', ['$event']),
__metadata("design:type", Function),
__metadata("design:paramtypes", [Object]),
__metadata("design:returntype", void 0)
], TreeComponent.prototype, "onMousedown", null);
TreeComponent = __decorate([ __metadata("design:paramtypes", [TreeModel,
TreeDraggedElement])
], TreeComponent);
TreeComponent.ɵfac = function TreeComponent_Factory(t) { return new (t || TreeComponent)(ɵngcc0.ɵɵdirectiveInject(TreeModel), ɵngcc0.ɵɵdirectiveInject(TreeDraggedElement)); };
TreeComponent.ɵcmp = ɵngcc0.ɵɵdefineComponent({ type: TreeComponent, selectors: [["Tree"], ["tree-root"]], contentQueries: function TreeComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) {
ɵngcc0.ɵɵcontentQuery(dirIndex, _c0, true);
ɵngcc0.ɵɵcontentQuery(dirIndex, _c1, true);
ɵngcc0.ɵɵcontentQuery(dirIndex, _c2, true);
ɵngcc0.ɵɵcontentQuery(dirIndex, _c3, true);
} if (rf & 2) {
var _t;
ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.loadingTemplate = _t.first);
ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.treeNodeTemplate = _t.first);
ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.treeNodeWrapperTemplate = _t.first);
ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.treeNodeFullTemplate = _t.first);
} }, viewQuery: function TreeComponent_Query(rf, ctx) { if (rf & 1) {
ɵngcc0.ɵɵviewQuery(_c4, true);
} if (rf & 2) {
var _t;
ɵngcc0.ɵɵqueryRefresh(_t = ɵngcc0.ɵɵloadQuery()) && (ctx.viewportComponent = _t.first);
} }, hostBindings: function TreeComponent_HostBindings(rf, ctx, elIndex) { if (rf & 1) {
ɵngcc0.ɵɵlistener("keydown", function TreeComponent_keydown_HostBindingHandler($event) { return ctx.onKeydown($event); }, false, ɵngcc0.ɵɵresolveBody);
ɵngcc0.ɵɵlistener("mousedown", function TreeComponent_mousedown_HostBindingHandler($event) { return ctx.onMousedown($event); }, false, ɵngcc0.ɵɵresolveBody);
} }, inputs: { nodes: "nodes", options: "options", focused: "focused", state: "state" }, outputs: { toggleExpanded: "toggleExpanded", activate: "activate", deactivate: "deactivate", nodeActivate: "nodeActivate", nodeDeactivate: "nodeDeactivate", select: "select", deselect: "deselect", focus: "focus", blur: "blur", updateData: "updateData", initialized: "initialized", moveNode: "moveNode", copyNode: "copyNode", loadNodeChildren: "loadNodeChildren", changeFilter: "changeFilter", event: "event", stateChange: "stateChange" }, features: [ɵngcc0.ɵɵProvidersFeature([TreeModel]), ɵngcc0.ɵɵNgOnChangesFeature()], decls: 5, vars: 4, consts: [["viewport", ""], [1, "angular-tree-component"], [3, "nodes", "treeModel", "templates", 4, "ngIf"], ["class", "empty-tree-drop-slot", 3, "dropIndex", "node", 4, "ngIf"], [3, "nodes", "treeModel", "templates"], [1, "empty-tree-drop-slot", 3, "dropIndex", "node"]], template: function TreeComponent_Template(rf, ctx) { if (rf & 1) {
ɵngcc0.ɵɵelementStart(0, "tree-viewport", null, 0);
ɵngcc0.ɵɵelementStart(2, "div", 1);
ɵngcc0.ɵɵtemplate(3, TreeComponent_tree_node_collection_3_Template, 1, 8, "tree-node-collection", 2);
ɵngcc0.ɵɵtemplate(4, TreeComponent_tree_node_drop_slot_4_Template, 1, 2, "tree-node-drop-slot", 3);
ɵngcc0.ɵɵelementEnd();
ɵngcc0.ɵɵelementEnd();
} if (rf & 2) {
ɵngcc0.ɵɵadvance(2);
ɵngcc0.ɵɵclassProp("node-dragging", ctx.treeDraggedElement.isDragging());
ɵngcc0.ɵɵclassProp("angular-tree-component-rtl", ctx.treeModel.options.rtl);
ɵngcc0.ɵɵadvance(1);
ɵngcc0.ɵɵproperty("ngIf", ctx.treeModel.roots);
ɵngcc0.ɵɵadvance(1);
ɵngcc0.ɵɵproperty("ngIf", ctx.treeModel.isEmptyTree());
} }, encapsulation: 2 });
/*@__PURE__*/ ɵngcc0.ɵsetClassMetadata(TreeComponent, [{
type: Component,
args: [{
selector: 'Tree, tree-root',
providers: [TreeModel],
styles: [],
template: "\n <tree-viewport #viewport>\n <div\n class=\"angular-tree-component\"\n [class.node-dragging]=\"treeDraggedElement.isDragging()\"\n [class.angular-tree-component-rtl]=\"treeModel.options.rtl\">\n <tree-node-collection\n *ngIf=\"treeModel.roots\"\n [nodes]=\"treeModel.roots\"\n [treeModel]=\"treeModel\"\n [templates]=\"{\n loadingTemplate: loadingTemplate,\n treeNodeTemplate: treeNodeTemplate,\n treeNodeWrapperTemplate: treeNodeWrapperTemplate,\n treeNodeFullTemplate: treeNodeFullTemplate\n }\">\n </tree-node-collection>\n <tree-node-drop-slot\n class=\"empty-tree-drop-slot\"\n *ngIf=\"treeModel.isEmptyTree()\"\n [dropIndex]=\"0\"\n [node]=\"treeModel.virtualRoot\">\n </tree-node-drop-slot>\n </div>\n </tree-viewport>\n "
}]
}], function () { return [{ type: TreeModel }, { type: TreeDraggedElement }]; }, { treeModel: [], treeDraggedElement: [], nodes: [{
type: Input
}], options: [{
type: Input
}], focused: [{
type: Input
}], state: [{
type: Input
}], onKeydown: [{
type: HostListener,
args: ['body: keydown', ['$event']]
}], onMousedown: [{
type: HostListener,
args: ['body: mousedown', ['$event']]
}], ngOnChanges: [], sizeChanged: [], loadingTemplate: [{
type: ContentChild,
args: ['loadingTemplate', { static: false }]
}], treeNodeTemplate: [{
type: ContentChild,
args: ['treeNodeTemplate', { static: false }]
}], treeNodeWrapperTemplate: [{
type: ContentChild,
args: ['treeNodeWrapperTemplate', { static: false }]
}], treeNodeFullTemplate: [{
type: ContentChild,
args: ['treeNodeFullTemplate', { static: false }]
}], viewportComponent: [{
type: ViewChild,
args: ['viewport', { static: false }]
}], toggleExpanded: [{
type: Output
}], activate: [{
type: Output
}], deactivate: [{
type: Output
}], nodeActivate: [{
type: Output
}], nodeDeactivate: [{
type: Output
}], select: [{
type: Output
}], deselect: [{
type: Output
}], focus: [{
type: Output
}], blur: [{
type: Output
}], updateData: [{
type: Output
}], initialized: [{
type: Output
}], moveNode: [{
type: Output
}], copyNode: [{
type: Output
}], loadNodeChildren: [{
type: Output
}], changeFilter: [{
type: Output
}], event: [{
type: Output
}], stateChange: [{
type: Output
}] });
return TreeComponent;
}());
export { TreeComponent };
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkM6L1VzZXJzL2UuYmVnb3ZpYy9Eb3dubG9hZHMvaXZ5LXRhZy1pcy1ub3QtYS1rbm93bi1lbGVtZW50L25vZGVfbW9kdWxlcy9hbmd1bGFyLXRyZWUtY29tcG9uZW50L2Rpc3QvY29tcG9uZW50cy90cmVlLmNvbXBvbmVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0F3TWdDLEFBT3pCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztjQUVlIiwiZmlsZSI6InRyZWUuY29tcG9uZW50LmpzIiwic291cmNlc0NvbnRlbnQiOlsidmFyIF9fZGVjb3JhdGUgPSAodGhpcyAmJiB0aGlzLl9fZGVjb3JhdGUpIHx8IGZ1bmN0aW9uIChkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykge1xuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSBcImZ1bmN0aW9uXCIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTtcbiAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByO1xuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XG59O1xudmFyIF9fbWV0YWRhdGEgPSAodGhpcyAmJiB0aGlzLl9fbWV0YWRhdGEpIHx8IGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKGssIHYpO1xufTtcbmltcG9ydCB7IENvbXBvbmVudCwgQ29udGVudENoaWxkLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE91dHB1dCwgVGVtcGxhdGVSZWYsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVHJlZU1vZGVsIH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUubW9kZWwnO1xuaW1wb3J0IHsgVHJlZURyYWdnZWRFbGVtZW50IH0gZnJvbSAnLi4vbW9kZWxzL3RyZWUtZHJhZ2dlZC1lbGVtZW50Lm1vZGVsJztcbmltcG9ydCB7IFRyZWVWaWV3cG9ydENvbXBvbmVudCB9IGZyb20gJy4vdHJlZS12aWV3cG9ydC5jb21wb25lbnQnO1xuaW1wb3J0IGluY2x1ZGVzIGZyb20gJ2xvZGFzaC9pbmNsdWRlcyc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG52YXIgVHJlZUNvbXBvbmVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUcmVlQ29tcG9uZW50KHRyZWVNb2RlbCwgdHJlZURyYWdnZWRFbGVtZW50KSB7XG4gICAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG4gICAgICAgIHRoaXMudHJlZU1vZGVsID0gdHJlZU1vZGVsO1xuICAgICAgICB0aGlzLnRyZWVEcmFnZ2VkRWxlbWVudCA9IHRyZWVEcmFnZ2VkRWxlbWVudDtcbiAgICAgICAgdHJlZU1vZGVsLmV2ZW50TmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgeyByZXR1cm4gX3RoaXNbbmFtZV0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7IH0pO1xuICAgICAgICB0cmVlTW9kZWwuc3Vic2NyaWJlVG9TdGF0ZShmdW5jdGlvbiAoc3RhdGUpIHsgcmV0dXJuIF90aGlzLnN0YXRlQ2hhbmdlLmVtaXQoc3RhdGUpOyB9KTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcIm5vZGVzXCIsIHtcbiAgICAgICAgLy8gV2lsbCBiZSBoYW5kbGVkIGluIG5nT25DaGFuZ2VzXG4gICAgICAgIHNldDogZnVuY3Rpb24gKG5vZGVzKSB7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pO1xuICAgIDtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwib3B0aW9uc1wiLCB7XG4gICAgICAgIHNldDogZnVuY3Rpb24gKG9wdGlvbnMpIHtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgO1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJmb2N1c2VkXCIsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLnNldEZvY3VzKHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcInN0YXRlXCIsIHtcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLnNldFN0YXRlKHN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgfSk7XG4gICAgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUub25LZXlkb3duID0gZnVuY3Rpb24gKCRldmVudCkge1xuICAgICAgICBpZiAoIXRoaXMudHJlZU1vZGVsLmlzRm9jdXNlZClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgaWYgKGluY2x1ZGVzKFsnaW5wdXQnLCAndGV4dGFyZWEnXSwgZG9jdW1lbnQuYWN0aXZlRWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkpKVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB2YXIgZm9jdXNlZE5vZGUgPSB0aGlzLnRyZWVNb2RlbC5nZXRGb2N1c2VkTm9kZSgpO1xuICAgICAgICB0aGlzLnRyZWVNb2RlbC5wZXJmb3JtS2V5QWN0aW9uKGZvY3VzZWROb2RlLCAkZXZlbnQpO1xuICAgIH07XG4gICAgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUub25Nb3VzZWRvd24gPSBmdW5jdGlvbiAoJGV2ZW50KSB7XG4gICAgICAgIGZ1bmN0aW9uIGlzT3V0c2lkZUNsaWNrKHN0YXJ0RWxlbWVudCwgbm9kZU5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiAhc3RhcnRFbGVtZW50ID8gdHJ1ZSA6IHN0YXJ0RWxlbWVudC5sb2NhbE5hbWUgPT09IG5vZGVOYW1lID8gZmFsc2UgOiBpc091dHNpZGVDbGljayhzdGFydEVsZW1lbnQucGFyZW50RWxlbWVudCwgbm9kZU5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc091dHNpZGVDbGljaygkZXZlbnQudGFyZ2V0LCAndHJlZS1yb290JykpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLnNldEZvY3VzKGZhbHNlKTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUubmdPbkNoYW5nZXMgPSBmdW5jdGlvbiAoY2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlcy5vcHRpb25zIHx8IGNoYW5nZXMubm9kZXMpIHtcbiAgICAgICAgICAgIHRoaXMudHJlZU1vZGVsLnNldERhdGEoe1xuICAgICAgICAgICAgICAgIG9wdGlvbnM6IGNoYW5nZXMub3B0aW9ucyAmJiBjaGFuZ2VzLm9wdGlvbnMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIG5vZGVzOiBjaGFuZ2VzLm5vZGVzICYmIGNoYW5nZXMubm9kZXMuY3VycmVudFZhbHVlLFxuICAgICAgICAgICAgICAgIGV2ZW50czogcGljayh0aGlzLCB0aGlzLnRyZWVNb2RlbC5ldmVudE5hbWVzKVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIFRyZWVDb21wb25lbnQucHJvdG90eXBlLnNpemVDaGFuZ2VkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnZpZXdwb3J0Q29tcG9uZW50LnNldFZpZXdwb3J0KCk7XG4gICAgfTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgQ29udGVudENoaWxkKCdsb2FkaW5nVGVtcGxhdGUnLCB7IHN0YXRpYzogZmFsc2UgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBUZW1wbGF0ZVJlZilcbiAgICBdLCBUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJsb2FkaW5nVGVtcGxhdGVcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgQ29udGVudENoaWxkKCd0cmVlTm9kZVRlbXBsYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgVGVtcGxhdGVSZWYpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwidHJlZU5vZGVUZW1wbGF0ZVwiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBDb250ZW50Q2hpbGQoJ3RyZWVOb2RlV3JhcHBlclRlbXBsYXRlJywgeyBzdGF0aWM6IGZhbHNlIH0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgVGVtcGxhdGVSZWYpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwidHJlZU5vZGVXcmFwcGVyVGVtcGxhdGVcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgQ29udGVudENoaWxkKCd0cmVlTm9kZUZ1bGxUZW1wbGF0ZScsIHsgc3RhdGljOiBmYWxzZSB9KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIFRlbXBsYXRlUmVmKVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcInRyZWVOb2RlRnVsbFRlbXBsYXRlXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIFZpZXdDaGlsZCgndmlld3BvcnQnLCB7IHN0YXRpYzogZmFsc2UgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBUcmVlVmlld3BvcnRDb21wb25lbnQpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwidmlld3BvcnRDb21wb25lbnRcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEFycmF5KSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjpwYXJhbXR5cGVzXCIsIFtBcnJheV0pXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwibm9kZXNcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwib3B0aW9uc1wiLCBudWxsKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSW5wdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIEJvb2xlYW4pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW0Jvb2xlYW5dKVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcImZvY3VzZWRcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIElucHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwic3RhdGVcIiwgbnVsbCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcInRvZ2dsZUV4cGFuZGVkXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcImFjdGl2YXRlXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcImRlYWN0aXZhdGVcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwibm9kZUFjdGl2YXRlXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcIm5vZGVEZWFjdGl2YXRlXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcInNlbGVjdFwiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBPdXRwdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJkZXNlbGVjdFwiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBPdXRwdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJmb2N1c1wiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBPdXRwdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJibHVyXCIsIHZvaWQgMCk7XG4gICAgX19kZWNvcmF0ZShbXG4gICAgICAgIE91dHB1dCgpLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgT2JqZWN0KVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcInVwZGF0ZURhdGFcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwiaW5pdGlhbGl6ZWRcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwibW92ZU5vZGVcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwiY29weU5vZGVcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwibG9hZE5vZGVDaGlsZHJlblwiLCB2b2lkIDApO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBPdXRwdXQoKSxcbiAgICAgICAgX19tZXRhZGF0YShcImRlc2lnbjp0eXBlXCIsIE9iamVjdClcbiAgICBdLCBUcmVlQ29tcG9uZW50LnByb3RvdHlwZSwgXCJjaGFuZ2VGaWx0ZXJcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwiZXZlbnRcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgT3V0cHV0KCksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBPYmplY3QpXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwic3RhdGVDaGFuZ2VcIiwgdm9pZCAwKTtcbiAgICBfX2RlY29yYXRlKFtcbiAgICAgICAgSG9zdExpc3RlbmVyKCdib2R5OiBrZXlkb3duJywgWyckZXZlbnQnXSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246dHlwZVwiLCBGdW5jdGlvbiksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbT2JqZWN0XSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cmV0dXJudHlwZVwiLCB2b2lkIDApXG4gICAgXSwgVHJlZUNvbXBvbmVudC5wcm90b3R5cGUsIFwib25LZXlkb3duXCIsIG51bGwpO1xuICAgIF9fZGVjb3JhdGUoW1xuICAgICAgICBIb3N0TGlzdGVuZXIoJ2JvZHk6IG1vdXNlZG93bicsIFsnJGV2ZW50J10pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnR5cGVcIiwgRnVuY3Rpb24pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnBhcmFtdHlwZXNcIiwgW09iamVjdF0pLFxuICAgICAgICBfX21ldGFkYXRhKFwiZGVzaWduOnJldHVybnR5cGVcIiwgdm9pZCAwKVxuICAgIF0sIFRyZWVDb21wb25lbnQucHJvdG90eXBlLCBcIm9uTW91c2Vkb3duXCIsIG51bGwpO1xuICAgIFRyZWVDb21wb25lbnQgPSBfX2RlY29yYXRlKFtcbiAgICAgICAgQ29tcG9uZW50KHtcbiAgICAgICAgICAgIHNlbGVjdG9yOiAnVHJlZSwgdHJlZS1yb290JyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogW1RyZWVNb2RlbF0sXG4gICAgICAgICAgICBzdHlsZXM6IFtdLFxuICAgICAgICAgICAgdGVtcGxhdGU6IFwiXFxuICAgICAgPHRyZWUtdmlld3BvcnQgI3ZpZXdwb3J0PlxcbiAgICAgICAgICA8ZGl2XFxuICAgICAgICAgICAgICAgICAgY2xhc3M9XFxcImFuZ3VsYXItdHJlZS1jb21wb25lbnRcXFwiXFxuICAgICAgICAgICAgICAgICAgW2NsYXNzLm5vZGUtZHJhZ2dpbmddPVxcXCJ0cmVlRHJhZ2dlZEVsZW1lbnQuaXNEcmFnZ2luZygpXFxcIlxcbiAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbmd1bGFyLXRyZWUtY29tcG9uZW50LXJ0bF09XFxcInRyZWVNb2RlbC5vcHRpb25zLnJ0bFxcXCI+XFxuICAgICAgICAgICAgICA8dHJlZS1ub2RlLWNvbGxlY3Rpb25cXG4gICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XFxcInRyZWVNb2RlbC5yb290c1xcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgW25vZGVzXT1cXFwidHJlZU1vZGVsLnJvb3RzXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICBbdHJlZU1vZGVsXT1cXFwidHJlZU1vZGVsXFxcIlxcbiAgICAgICAgICAgICAgICAgICAgICBbdGVtcGxhdGVzXT1cXFwie1xcbiAgICAgICAgICAgIGxvYWRpbmdUZW1wbGF0ZTogbG9hZGluZ1RlbXBsYXRlLFxcbiAgICAgICAgICAgIHRyZWVOb2RlVGVtcGxhdGU6IHRyZWVOb2RlVGVtcGxhdGUsXFxuICAgICAgICAgICAgdHJlZU5vZGVXcmFwcGVyVGVtcGxhdGU6IHRyZWVOb2RlV3JhcHBlclRlbXBsYXRlLFxcbiAgICAgICAgICAgIHRyZWVOb2RlRnVsbFRlbXBsYXRlOiB0cmVlTm9kZUZ1bGxUZW1wbGF0ZVxcbiAgICAgICAgICB9XFxcIj5cXG4gICAgICAgICAgICAgIDwvdHJlZS1ub2RlLWNvbGxlY3Rpb24+XFxuICAgICAgICAgICAgICA8dHJlZS1ub2RlLWRyb3Atc2xvdFxcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cXFwiZW1wdHktdHJlZS1kcm9wLXNsb3RcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVxcXCJ0cmVlTW9kZWwuaXNFbXB0eVRyZWUoKVxcXCJcXG4gICAgICAgICAgICAgICAgICAgICAgW2Ryb3BJbmRleF09XFxcIjBcXFwiXFxuICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cXFwidHJlZU1vZGVsLnZpcnR1YWxSb290XFxcIj5cXG4gICAgICAgICAgICAgIDwvdHJlZS1ub2RlLWRyb3Atc2xvdD5cXG4gICAgICAgICAgPC9kaXY+XFxuICAgICAgPC90cmVlLXZpZXdwb3J0PlxcbiAgXCJcbiAgICAgICAgfSksXG4gICAgICAgIF9fbWV0YWRhdGEoXCJkZXNpZ246cGFyYW10eXBlc1wiLCBbVHJlZU1vZGVsLFxuICAgICAgICAgICAgVHJlZURyYWdnZWRFbGVtZW50XSlcbiAgICBdLCBUcmVlQ29tcG9uZW50KTtcbiAgICByZXR1cm4gVHJlZUNvbXBvbmVudDtcbn0oKSk7XG5leHBvcnQgeyBUcmVlQ29tcG9uZW50IH07XG4iXX0=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment