UNPKG

e5core-angular-ui

Version:

e5 Anywhere Angular UI

351 lines 35.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import { Component, ChangeDetectionStrategy, Input, Output, EventEmitter, QueryList, ViewChildren, ChangeDetectorRef } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { WorkItemService, TaxonomyFieldDefinitionService } from 'e5core-angular-services'; import { Guid } from 'guid-typescript'; import { E5coreUiWorkRelatedItemsBaseComponent } from './component/e5core-ui-work-related-items-base'; import { PrimeTreeTableModel } from '../../models/prime-tree-table.model'; import { KeyValuePair } from '../../util/key-value-pair'; export class E5coreUiWorkRelatedItemsComponent { /** * @param {?} workItemService * @param {?} fieldDefinitonServices * @param {?} changeDetectorRef */ constructor(workItemService, fieldDefinitonServices, changeDetectorRef) { this.workItemService = workItemService; this.fieldDefinitonServices = fieldDefinitonServices; this.changeDetectorRef = changeDetectorRef; this.findId = 0; this.createButtonText = "Create"; this.fieldsToShow = null; this.showCreateChildButton = true; this.showDefinedChildrenOnly = true; this.workItemSelectEvent = new EventEmitter(); this.attachmentSelectEvent = new EventEmitter(); this.categorisationChangeEvent = new EventEmitter(); this.createChildWorkItemEvent = new EventEmitter(); this.labels = []; } /** * @return {?} */ ngOnInit() { if (typeof this.workItem$ == 'undefined') { console.error('e5core-ui-work-related-items [workItem$] must have a BehaviorSubject<WorkItemModel>'); return; } if (this.fieldsToShow) { this.fieldsToShow.forEach(element => { this.setLabel(element); }); } if (typeof this.workItem$ != 'undefined') { this.workItem$.subscribe(wim => { if (wim.workId != null && wim.workId != Guid.EMPTY) { this.workId = wim.workId; this.populateWorkRelatedItems(this.workId); if (this.showDefinedChildrenOnly) this.populateWorkClassChildren(wim.workId.toString()); } }); } } /** * @private * @param {?} findField * @return {?} */ setLabel(findField) { if (findField.value == "") { /** @type {?} */ var index = this.labels.length; this.labels[this.labels.length] = ""; this.fieldDefinitonServices.get(findField.key).subscribe(fd => { this.labels[index] = fd.label; this.changeDetectorRef.detectChanges(); }); } else { this.labels[this.labels.length] = findField.value; } } /** * @private * @param {?} wid * @return {?} */ populateWorkClassChildren(wid) { this.workItemService.getWorkWorkClassChildren(wid).subscribe(s => { this.workRelatedItemsComponents.forEach(element => { element.childWorkItemCategories = s; }); }, error => { console.error(error); }); } /** * @private * @param {?} wid * @return {?} */ populateWorkRelatedItems(wid) { this.workItemService.getWorkRelatedItems(wid, { findId: this.findId, pageSize: this.selectedPage.pageSize, pageNo: this.selectedPage.pageIndex, doSearchFromRoot: true }).subscribe(s => { /** @type {?} */ var rootModel = this.convertToUiModel(s.relatedItems); this.workRelatedItemsComponents.forEach(element => { element.length = s.total; element.treeData = (/** @type {?} */ ([rootModel])); this.changeDetectorRef.detectChanges(); }); this.changeDetectorRef.detectChanges(); }, error => { console.error(error); }); } /** * @private * @param {?} apiModels * @return {?} */ convertToUiModel(apiModels) { if (!apiModels) return; // Nothing to do // Nothing to do /** @type {?} */ var current = apiModels.filter(u => u.id == this.workId); if (current.length == 0) return; /** @type {?} */ var parent = apiModels.filter(u => u.id == current[0].parentId); if (current[0].parentId == Guid.EMPTY) parent = current; /** @type {?} */ var children = apiModels.filter(u => u.parentId == this.workId); /** @type {?} */ var rootModel = new PrimeTreeTableModel(); rootModel.data.id = parent[0].id; rootModel.data.attachmentCount = parent[0].attachmentCount; rootModel.data.parentId = parent[0].parentId; rootModel.expanded = true; this.populateDataFields(rootModel.data, parent[0]); this.processChildren(rootModel, children, apiModels); return rootModel; } /** * @private * @param {?} parent * @param {?} children * @param {?} apiModels * @return {?} */ processChildren(parent, children, apiModels) { for (let i = 0; i < children.length; i++) { /** @type {?} */ var child = children[i]; /** @type {?} */ var model = new PrimeTreeTableModel(); model.data.id = child.id; model.data.attachmentCount = child.attachmentCount; model.data.parentId = child.parentId; this.populateDataFields(model.data, child); parent.children[parent.children.length] = model; /** @type {?} */ var moreChildren = apiModels.filter(u => u.parentId == child.id); if (moreChildren.length > 0) { this.processChildren(model, moreChildren, apiModels); } } } /** * @private * @param {?} modelData * @param {?} child * @return {?} */ populateDataFields(modelData, child) { if (!this.fieldsToShow) { modelData.fieldValues = []; } else { for (var i = 0; i < this.fieldsToShow.length; i++) { /** @type {?} */ var findField = this.fieldsToShow[i]; /** @type {?} */ var field = child.fieldValues.filter(u => u.key == findField.key); if (field == null || field.length == 0) { field = [{ key: findField.key, value: "" }]; } /** @type {?} */ var keyValuePair = new KeyValuePair(); keyValuePair.key = field[0].key; keyValuePair.value = field[0].value; modelData.fieldValues[modelData.fieldValues.length] = keyValuePair; } } } /** * @return {?} */ ngAfterViewInit() { } /** * @param {?} selectedCategory * @return {?} */ CreateChildWorkItem(selectedCategory) { if (!this.workId) { console.error("e5core-ui-work-related-items has no work item."); return; } /** @type {?} */ var workItemCreateModel = { category1Id: selectedCategory.category1Id, category2Id: selectedCategory.category2Id, category3Id: selectedCategory.category3Id, workItemFields: [ { fieldId: "Parent_id", fieldValue: this.workId, fieldType: "Guid" } ] }; this.workItemService.create(workItemCreateModel).subscribe(s => { this.createChildWorkItemEvent.emit({ workId: s.id, reference: s.reference, type: "related" }); this.populateWorkRelatedItems(this.workId); }, error => { console.error(error); }); } /** * @return {?} */ onCreateChildWorkItem() { this.CreateChildWorkItem(this.selectedCategory); } /** * @param {?} $event * @return {?} */ onCategorizationChange($event) { this.selectedCategory = $event; this.categorisationChangeEvent.emit($event); } /** * @param {?} openWorkEvent * @return {?} */ onWorkItemSelect(openWorkEvent) { this.workItemSelectEvent.emit(openWorkEvent); } /** * @param {?} viewerDisplayEvent * @return {?} */ onAttachmentSelect(viewerDisplayEvent) { this.attachmentSelectEvent.emit(viewerDisplayEvent); } /** * @param {?} event * @return {?} */ onPageEvent(event) { this.selectedPage = event; if (typeof this.workId != 'undefined' && this.workId != Guid.EMPTY) { this.populateWorkRelatedItems(this.workId); } } } E5coreUiWorkRelatedItemsComponent.decorators = [ { type: Component, args: [{ selector: 'e5core-ui-work-related-items', template: ` <span *ngIf="workItem$"> <e5core-ui-work-related-items-prime [labels]="labels" [showCreateChildButton]="showCreateChildButton" [createButtonText]="createButtonText" [showDefinedChildrenOnly]="showDefinedChildrenOnly" [readonly]="readonly" (workItemSelectEvent)="onWorkItemSelect($event)" (attachmentSelectEvent)="onAttachmentSelect($event)" (categorisationChangeEvent)="onCategorizationChange($event)" (createChildWorkItemEvent)="onCreateChildWorkItem()" (pageEvent)="onPageEvent($event)"></e5core-ui-work-related-items-prime> </span> <div *ngIf="!(workItem$)" class="e5core-component-error">&lt;e5core-ui-work-related-items&gt; [workItem$] must have a BehaviorSubject&lt;WorkItemModel&gt;</div>`, changeDetection: ChangeDetectionStrategy.OnPush }] } ]; /** @nocollapse */ E5coreUiWorkRelatedItemsComponent.ctorParameters = () => [ { type: WorkItemService }, { type: TaxonomyFieldDefinitionService }, { type: ChangeDetectorRef } ]; E5coreUiWorkRelatedItemsComponent.propDecorators = { workItem$: [{ type: Input }], findId: [{ type: Input }], createButtonText: [{ type: Input }], fieldsToShow: [{ type: Input }], readonly: [{ type: Input }], pagesizes: [{ type: Input }], showCreateChildButton: [{ type: Input }], showDefinedChildrenOnly: [{ type: Input }], workItemSelectEvent: [{ type: Output }], attachmentSelectEvent: [{ type: Output }], categorisationChangeEvent: [{ type: Output }], createChildWorkItemEvent: [{ type: Output }], workRelatedItemsComponents: [{ type: ViewChildren, args: [E5coreUiWorkRelatedItemsBaseComponent,] }] }; if (false) { /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workItem$; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.findId; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.createButtonText; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.fieldsToShow; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.readonly; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.pagesizes; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.showCreateChildButton; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.showDefinedChildrenOnly; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workItemSelectEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.attachmentSelectEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.categorisationChangeEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.createChildWorkItemEvent; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workId; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.selectedPage; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.selectedCategory; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.labels; /** @type {?} */ E5coreUiWorkRelatedItemsComponent.prototype.workRelatedItemsComponents; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.workItemService; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.fieldDefinitonServices; /** * @type {?} * @private */ E5coreUiWorkRelatedItemsComponent.prototype.changeDetectorRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9lNWNvcmUtYW5ndWxhci11aS8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMvZTVjb3JlLXVpLXdvcmstcmVsYXRlZC1pdGVtcy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsdUJBQXVCLEVBQUUsS0FBSyxFQUFpQixNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkssT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUV2QyxPQUFPLEVBQUUsZUFBZSxFQUFFLDhCQUE4QixFQUF3QixNQUFNLHlCQUF5QixDQUFDO0FBQ2hILE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUscUNBQXFDLEVBQUUsTUFBTSwrQ0FBK0MsQ0FBQztBQUd0RyxPQUFPLEVBQUUsbUJBQW1CLEVBQXNCLE1BQU0scUNBQXFDLENBQUM7QUFFOUYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBWXpELE1BQU0sT0FBTyxpQ0FBaUM7Ozs7OztJQXdCNUMsWUFDVSxlQUFnQyxFQUNoQyxzQkFBc0QsRUFDdEQsaUJBQW9DO1FBRnBDLG9CQUFlLEdBQWYsZUFBZSxDQUFpQjtRQUNoQywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQWdDO1FBQ3RELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUF4QnJDLFdBQU0sR0FBWSxDQUFDLENBQUM7UUFDcEIscUJBQWdCLEdBQVksUUFBUSxDQUFDO1FBQ3JDLGlCQUFZLEdBQW9CLElBQUksQ0FBQztRQUdyQywwQkFBcUIsR0FBYSxJQUFJLENBQUM7UUFDdkMs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LHVCQUF1QixDQUFDLE1BQU07YUFDaEQ7Ozs7WUFsQlEsZUFBZTtZQUFFLDhCQUE4QjtZQUhrRSxpQkFBaUI7Ozt3QkF3QnhJLEtBQUs7cUJBQ0wsS0FBSzsrQkFDTCxLQUFLOzJCQUNMLEtBQUs7dUJBQ0wsS0FBSzt3QkFDTCxLQUFLO29DQUNMLEtBQUs7c0NBQ0wsS0FBSztrQ0FFTCxNQUFNO29DQUNOLE1BQU07d0NBQ04sTUFBTTt1Q0FDTixNQUFNO3lDQU9OLFlBQVksU0FBQyxxQ0FBcUM7Ozs7SUFuQm5ELHNEQUFvRDs7SUFDcEQsbURBQTZCOztJQUM3Qiw2REFBOEM7O0lBQzlDLHlEQUE4Qzs7SUFDOUMscURBQTRCOztJQUM1QixzREFBOEI7O0lBQzlCLGtFQUFnRDs7SUFDaEQsb0VBQWtEOztJQUVsRCxnRUFBa0U7O0lBQ2xFLGtFQUF5RTs7SUFDekUsc0VBQW9GOztJQUNwRixxRUFBdUU7O0lBRXZFLG1EQUFpQjs7SUFDakIseURBQWtCOztJQUNsQiw2REFBdUI7O0lBQ3ZCLG1EQUFzQjs7SUFFdEIsdUVBQ29GOzs7OztJQUdsRiw0REFBd0M7Ozs7O0lBQ3hDLG1FQUE4RDs7Ozs7SUFDOUQsOERBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBJbnB1dCwgQWZ0ZXJWaWV3SW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXIsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuLCBDaGFuZ2VEZXRlY3RvclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBXb3JrSXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmstaXRlbSc7XG5pbXBvcnQgeyBXb3JrSXRlbVNlcnZpY2UsIFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSwgV29ya1JlbGF0ZWRJdGVtTW9kZWwgfSBmcm9tICdlNWNvcmUtYW5ndWxhci1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBHdWlkIH0gZnJvbSAnZ3VpZC10eXBlc2NyaXB0JztcbmltcG9ydCB7IEU1Y29yZVVpV29ya1JlbGF0ZWRJdGVtc0Jhc2VDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudC9lNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLWJhc2UnO1xuaW1wb3J0IHsgVmlld2VyRGlzcGxheUV2ZW50IH0gZnJvbSAnLi4vLi4vZXZlbnRzL3ZpZXdlci1kaXNwbGF5LWV2ZW50JztcbmltcG9ydCB7IE9wZW5Xb3JrRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvb3Blbi13b3JrLWV2ZW50JztcbmltcG9ydCB7IFByaW1lVHJlZVRhYmxlTW9kZWwsIFRyZWVUYWJsZURhdGFNb2RlbCB9IGZyb20gJy4uLy4uL21vZGVscy9wcmltZS10cmVlLXRhYmxlLm1vZGVsJztcbmltcG9ydCB7IENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQgfSBmcm9tICcuLi8uLi9ldmVudHMvY2F0ZWdvcml6YXRpb24tY2hhbmdlLWV2ZW50JztcbmltcG9ydCB7IEtleVZhbHVlUGFpciB9IGZyb20gJy4uLy4uL3V0aWwva2V5LXZhbHVlLXBhaXInO1xuaW1wb3J0IHsgRHluYW1pYyB9IGZyb20gJy4uLy4uL3V0aWwvZHluYW1pYyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMnLFxuICB0ZW1wbGF0ZTogYFxuICA8c3BhbiAqbmdJZj1cIndvcmtJdGVtJFwiPlxuICAgIDxlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zLXByaW1lIFtsYWJlbHNdPVwibGFiZWxzXCIgW3Nob3dDcmVhdGVDaGlsZEJ1dHRvbl09XCJzaG93Q3JlYXRlQ2hpbGRCdXR0b25cIiBbY3JlYXRlQnV0dG9uVGV4dF09XCJjcmVhdGVCdXR0b25UZXh0XCIgW3Nob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XT1cInNob3dEZWZpbmVkQ2hpbGRyZW5Pbmx5XCIgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCIgKHdvcmtJdGVtU2VsZWN0RXZlbnQpPVwib25Xb3JrSXRlbVNlbGVjdCgkZXZlbnQpXCIgKGF0dGFjaG1lbnRTZWxlY3RFdmVudCk9XCJvbkF0dGFjaG1lbnRTZWxlY3QoJGV2ZW50KVwiIChjYXRlZ29yaXNhdGlvbkNoYW5nZUV2ZW50KT1cIm9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50KVwiIChjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQpPVwib25DcmVhdGVDaGlsZFdvcmtJdGVtKClcIiAocGFnZUV2ZW50KT1cIm9uUGFnZUV2ZW50KCRldmVudClcIj48L2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMtcHJpbWU+XG4gIDwvc3Bhbj5cbiAgPGRpdiAqbmdJZj1cIiEod29ya0l0ZW0kKVwiIGNsYXNzPVwiZTVjb3JlLWNvbXBvbmVudC1lcnJvclwiPiZsdDtlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zJmd0OyBbd29ya0l0ZW0kXSBtdXN0IGhhdmUgYSBCZWhhdmlvclN1YmplY3QmbHQ7V29ya0l0ZW1Nb2RlbCZndDs8L2Rpdj5gLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBFNWNvcmVVaVdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnQgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0IHtcblxuICBASW5wdXQoKSB3b3JrSXRlbSQgOiBCZWhhdmlvclN1YmplY3Q8V29ya0l0ZW1Nb2RlbD47XG4gIEBJbnB1dCgpIGZpbmRJZCA6IG51bWJlciA9IDA7XG4gIEBJbnB1dCgpIGNyZWF0ZUJ1dHRvblRleHQgOiBzdHJpbmcgPSBcIkNyZWF0ZVwiO1xuICBASW5wdXQoKSBmaWVsZHNUb1Nob3cgOiBLZXlWYWx1ZVBhaXJbXSA9IG51bGw7XG4gIEBJbnB1dCgpIHJlYWRvbmx5IDogYm9vbGVhbjtcbiAgQElucHV0KCkgcGFnZXNpemVzIDogbnVtYmVyW107XG4gIEBJbnB1dCgpIHNob3dDcmVhdGVDaGlsZEJ1dHRvbiA6IGJvb2xlYW4gPSB0cnVlO1xuICBASW5wdXQoKSBzaG93RGVmaW5lZENoaWxkcmVuT25seSA6IGJvb2xlYW4gPSB0cnVlO1xuICBcbiAgQE91dHB1dCgpIHdvcmtJdGVtU2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBhdHRhY2htZW50U2VsZWN0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPFZpZXdlckRpc3BsYXlFdmVudD4oKTtcbiAgQE91dHB1dCgpIGNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENhdGVnb3JpemF0aW9uQ2hhbmdlRXZlbnQ+KCk7XG4gIEBPdXRwdXQoKSBjcmVhdGVDaGlsZFdvcmtJdGVtRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9wZW5Xb3JrRXZlbnQ+KCk7XG5cbiAgd29ya0lkIDogc3RyaW5nIDtcbiAgc2VsZWN0ZWRQYWdlOiBhbnk7XG4gIHNlbGVjdGVkQ2F0ZWdvcnkgOiBhbnk7XG4gIGxhYmVsczpzdHJpbmdbXSA9IFtdIDtcbiAgXG4gIEBWaWV3Q2hpbGRyZW4oRTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudClcbiAgcHVibGljIHdvcmtSZWxhdGVkSXRlbXNDb21wb25lbnRzOiBRdWVyeUxpc3Q8RTVjb3JlVWlXb3JrUmVsYXRlZEl0ZW1zQmFzZUNvbXBvbmVudD47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB3b3JrSXRlbVNlcnZpY2U6IFdvcmtJdGVtU2VydmljZSxcbiAgICBwcml2YXRlIGZpZWxkRGVmaW5pdG9uU2VydmljZXM6IFRheG9ub215RmllbGREZWZpbml0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIGlmICh0eXBlb2YgdGhpcy53b3JrSXRlbSQgPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ2U1Y29yZS11aS13b3JrLXJlbGF0ZWQtaXRlbXMgW3dvcmtJdGVtJF0gbXVzdCBoYXZlIGEgQmVoYXZpb3JTdWJqZWN0PFdvcmtJdGVtTW9kZWw+Jyk7XG4gICAgICByZXR1cm4gO1xuICAgIH1cblxuICAgIGlmKHRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICB0aGlzLmZpZWxkc1RvU2hvdy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICB0aGlzLnNldExhYmVsKGVsZW1lbnQpO1xuICAgICAgfSk7ICBcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0l0ZW0kICE9ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aGlzLndvcmtJdGVtJC5zdWJzY3JpYmUoXG4gICAgICAgIHdpbSA9PiB7XG4gICAgICAgICAgaWYgKHdpbS53b3JrSWQgIT0gbnVsbCAmJiB3aW0ud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgICAgICAgIHRoaXMud29ya0lkID0gd2ltLndvcmtJZDtcblxuICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtSZWxhdGVkSXRlbXModGhpcy53b3JrSWQpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5zaG93RGVmaW5lZENoaWxkcmVuT25seSlcbiAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVdvcmtDbGFzc0NoaWxkcmVuKHdpbS53b3JrSWQudG9TdHJpbmcoKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRMYWJlbChmaW5kRmllbGQgOiBLZXlWYWx1ZVBhaXIpIHtcbiAgICBpZiAoZmluZEZpZWxkLnZhbHVlID09IFwiXCIpIHtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubGFiZWxzLmxlbmd0aDtcbiAgICAgIHRoaXMubGFiZWxzW3RoaXMubGFiZWxzLmxlbmd0aF0gPSBcIlwiO1xuICAgICAgdGhpcy5maWVsZERlZmluaXRvblNlcnZpY2VzLmdldChmaW5kRmllbGQua2V5KS5zdWJzY3JpYmUoIFxuICAgICAgICBmZCA9PiB7XG4gICAgICAgICAgdGhpcy5sYWJlbHNbaW5kZXhdID0gZmQubGFiZWw7XG4gICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH0pIDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbHNbdGhpcy5sYWJlbHMubGVuZ3RoXSA9IGZpbmRGaWVsZC52YWx1ZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlV29ya0NsYXNzQ2hpbGRyZW4od2lkOiBzdHJpbmcpIHtcbiAgICB0aGlzLndvcmtJdGVtU2VydmljZS5nZXRXb3JrV29ya0NsYXNzQ2hpbGRyZW4od2lkKS5zdWJzY3JpYmUoXG4gICAgICBzID0+IHtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQuY2hpbGRXb3JrSXRlbUNhdGVnb3JpZXMgPSBzO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHdpZDogc3RyaW5nKSB7XG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuZ2V0V29ya1JlbGF0ZWRJdGVtcyh3aWQsIHtcbiAgICAgIGZpbmRJZDogdGhpcy5maW5kSWQsXG4gICAgICBwYWdlU2l6ZTogdGhpcy5zZWxlY3RlZFBhZ2UucGFnZVNpemUsXG4gICAgICBwYWdlTm86IHRoaXMuc2VsZWN0ZWRQYWdlLnBhZ2VJbmRleCxcbiAgICAgIGRvU2VhcmNoRnJvbVJvb3Q6IHRydWVcbiAgICAgIH0pLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB2YXIgcm9vdE1vZGVsID0gdGhpcy5jb252ZXJ0VG9VaU1vZGVsKHMucmVsYXRlZEl0ZW1zKTtcbiAgICAgICAgdGhpcy53b3JrUmVsYXRlZEl0ZW1zQ29tcG9uZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgIGVsZW1lbnQubGVuZ3RoID0gcy50b3RhbDtcbiAgICAgICAgICBlbGVtZW50LnRyZWVEYXRhID0gPFByaW1lVHJlZVRhYmxlTW9kZWxbXT5bcm9vdE1vZGVsXTtcbiAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFRvVWlNb2RlbChhcGlNb2RlbHM6IFdvcmtSZWxhdGVkSXRlbU1vZGVsW10pOiBQcmltZVRyZWVUYWJsZU1vZGVsIHtcbiAgICBpZighYXBpTW9kZWxzKVxuICAgICAgcmV0dXJuIDsgLy8gTm90aGluZyB0byBkb1xuICAgICAgXG4gICAgdmFyIGN1cnJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSB0aGlzLndvcmtJZCk7XG5cbiAgICBpZiAoY3VycmVudC5sZW5ndGggPT0gMClcbiAgICAgIHJldHVybjtcblxuICAgICAgIFxuICAgIHZhciBwYXJlbnQgPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5pZCA9PSBjdXJyZW50WzBdLnBhcmVudElkKTtcbiAgICBcbiAgICBpZihjdXJyZW50WzBdLnBhcmVudElkPT1HdWlkLkVNUFRZKVxuICAgICAgcGFyZW50ID0gY3VycmVudDtcblxuICAgIHZhciBjaGlsZHJlbiA9IGFwaU1vZGVscy5maWx0ZXIodSA9PiB1LnBhcmVudElkID09IHRoaXMud29ya0lkKTtcblxuICAgIHZhciByb290TW9kZWwgPSBuZXcgUHJpbWVUcmVlVGFibGVNb2RlbCgpO1xuICAgIHJvb3RNb2RlbC5kYXRhLmlkID0gcGFyZW50WzBdLmlkO1xuICAgIHJvb3RNb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IHBhcmVudFswXS5hdHRhY2htZW50Q291bnQ7XG4gICAgcm9vdE1vZGVsLmRhdGEucGFyZW50SWQgPSBwYXJlbnRbMF0ucGFyZW50SWQ7XG4gICAgcm9vdE1vZGVsLmV4cGFuZGVkID0gdHJ1ZTtcbiAgICB0aGlzLnBvcHVsYXRlRGF0YUZpZWxkcyhyb290TW9kZWwuZGF0YSwgcGFyZW50WzBdKTtcbiAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihyb290TW9kZWwsIGNoaWxkcmVuLCBhcGlNb2RlbHMpXG5cbiAgICByZXR1cm4gcm9vdE1vZGVsO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzQ2hpbGRyZW4ocGFyZW50OiBQcmltZVRyZWVUYWJsZU1vZGVsLCBjaGlsZHJlbjogV29ya1JlbGF0ZWRJdGVtTW9kZWxbXSwgYXBpTW9kZWxzOiBXb3JrUmVsYXRlZEl0ZW1Nb2RlbFtdKSB7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgY2hpbGQgPSBjaGlsZHJlbltpXTtcbiAgICAgIHZhciBtb2RlbCA9IG5ldyBQcmltZVRyZWVUYWJsZU1vZGVsKCk7XG4gICAgICBtb2RlbC5kYXRhLmlkID0gY2hpbGQuaWQ7XG4gICAgICBtb2RlbC5kYXRhLmF0dGFjaG1lbnRDb3VudCA9IGNoaWxkLmF0dGFjaG1lbnRDb3VudDtcbiAgICAgIG1vZGVsLmRhdGEucGFyZW50SWQgPSBjaGlsZC5wYXJlbnRJZDtcblxuICAgICAgdGhpcy5wb3B1bGF0ZURhdGFGaWVsZHMobW9kZWwuZGF0YSwgY2hpbGQpO1xuICAgICAgcGFyZW50LmNoaWxkcmVuW3BhcmVudC5jaGlsZHJlbi5sZW5ndGhdID0gbW9kZWw7XG5cbiAgICAgIHZhciBtb3JlQ2hpbGRyZW4gPSBhcGlNb2RlbHMuZmlsdGVyKHUgPT4gdS5wYXJlbnRJZCA9PSBjaGlsZC5pZCk7XG5cbiAgICAgIGlmIChtb3JlQ2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLnByb2Nlc3NDaGlsZHJlbihtb2RlbCwgbW9yZUNoaWxkcmVuLCBhcGlNb2RlbHMpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcG9wdWxhdGVEYXRhRmllbGRzKG1vZGVsRGF0YTogVHJlZVRhYmxlRGF0YU1vZGVsLCBjaGlsZDogYW55KSB7XG4gICAgaWYoIXRoaXMuZmllbGRzVG9TaG93KSB7XG4gICAgICBtb2RlbERhdGEuZmllbGRWYWx1ZXMgPSBbXSA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCB0aGlzLmZpZWxkc1RvU2hvdy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZmluZEZpZWxkID0gdGhpcy5maWVsZHNUb1Nob3dbaV07XG4gICAgICAgIHZhciBmaWVsZCA9IGNoaWxkLmZpZWxkVmFsdWVzLmZpbHRlcih1ID0+IHUua2V5ID09IGZpbmRGaWVsZC5rZXkpO1xuICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCB8fCBmaWVsZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgIGZpZWxkID0gW3trZXk6IGZpbmRGaWVsZC5rZXksIHZhbHVlOiBcIlwifV1cbiAgICAgICAgfVxuICBcbiAgICAgICAgdmFyIGtleVZhbHVlUGFpciA9IG5ldyBLZXlWYWx1ZVBhaXIoKTtcbiAgICAgICAga2V5VmFsdWVQYWlyLmtleSA9IGZpZWxkWzBdLmtleTtcbiAgICAgICAga2V5VmFsdWVQYWlyLnZhbHVlID0gZmllbGRbMF0udmFsdWU7XG4gICAgICAgIG1vZGVsRGF0YS5maWVsZFZhbHVlc1ttb2RlbERhdGEuZmllbGRWYWx1ZXMubGVuZ3RoXSA9IGtleVZhbHVlUGFpcjtcbiAgICAgIH0gIFxuICAgIH1cbiAgfVxuICBcbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICB9XG5cbiAgcHVibGljIENyZWF0ZUNoaWxkV29ya0l0ZW0oc2VsZWN0ZWRDYXRlZ29yeSA6IGFueSkgOiB2b2lkIHtcbiAgICBpZighdGhpcy53b3JrSWQpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXCJlNWNvcmUtdWktd29yay1yZWxhdGVkLWl0ZW1zIGhhcyBubyB3b3JrIGl0ZW0uXCIpIDtcbiAgICAgIHJldHVybiA7XG4gICAgfVxuXG4gICAgdmFyIHdvcmtJdGVtQ3JlYXRlTW9kZWwgPSB7XG4gICAgICAgICAgY2F0ZWdvcnkxSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkxSWQsXG4gICAgICAgICAgY2F0ZWdvcnkySWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkySWQsXG4gICAgICAgICAgY2F0ZWdvcnkzSWQ6IHNlbGVjdGVkQ2F0ZWdvcnkuY2F0ZWdvcnkzSWQsXG4gICAgICAgICAgd29ya0l0ZW1GaWVsZHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZmllbGRJZDogXCJQYXJlbnRfaWRcIixcbiAgICAgICAgICAgICAgZmllbGRWYWx1ZTogdGhpcy53b3JrSWQsXG4gICAgICAgICAgICAgIGZpZWxkVHlwZTogXCJHdWlkXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdIFxuICAgICAgICB9O1xuXG4gICAgdGhpcy53b3JrSXRlbVNlcnZpY2UuY3JlYXRlKHdvcmtJdGVtQ3JlYXRlTW9kZWwpLnN1YnNjcmliZShcbiAgICAgIHMgPT4ge1xuICAgICAgICB0aGlzLmNyZWF0ZUNoaWxkV29ya0l0ZW1FdmVudC5lbWl0KHt3b3JrSWQ6IHMuaWQsIHJlZmVyZW5jZTogcy5yZWZlcmVuY2UsIHR5cGU6IFwicmVsYXRlZFwifSk7XG4gICAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICAgIH0sXG4gICAgICBlcnJvciA9PiB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3IpO1xuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBvbkNyZWF0ZUNoaWxkV29ya0l0ZW0oKSA6IHZvaWQge1xuICAgIHRoaXMuQ3JlYXRlQ2hpbGRXb3JrSXRlbSh0aGlzLnNlbGVjdGVkQ2F0ZWdvcnkpO1xuICB9XG5cbiAgcHVibGljIG9uQ2F0ZWdvcml6YXRpb25DaGFuZ2UoJGV2ZW50OiBDYXRlZ29yaXphdGlvbkNoYW5nZUV2ZW50KSA6IHZvaWQge1xuICAgIHRoaXMuc2VsZWN0ZWRDYXRlZ29yeSA9ICRldmVudDtcbiAgICB0aGlzLmNhdGVnb3Jpc2F0aW9uQ2hhbmdlRXZlbnQuZW1pdCgkZXZlbnQpO1xuICB9XG5cbiAgcHVibGljIG9uV29ya0l0ZW1TZWxlY3Qob3BlbldvcmtFdmVudCA6IE9wZW5Xb3JrRXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy53b3JrSXRlbVNlbGVjdEV2ZW50LmVtaXQob3BlbldvcmtFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25BdHRhY2htZW50U2VsZWN0KHZpZXdlckRpc3BsYXlFdmVudCA6IFZpZXdlckRpc3BsYXlFdmVudCkgOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaG1lbnRTZWxlY3RFdmVudC5lbWl0KHZpZXdlckRpc3BsYXlFdmVudCk7XG4gIH1cblxuICBwdWJsaWMgb25QYWdlRXZlbnQoZXZlbnQpIDogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RlZFBhZ2UgPSBldmVudDtcbiAgICBcbiAgICBpZiAodHlwZW9mIHRoaXMud29ya0lkICE9ICd1bmRlZmluZWQnICYmIHRoaXMud29ya0lkICE9IEd1aWQuRU1QVFkpIHtcbiAgICAgIHRoaXMucG9wdWxhdGVXb3JrUmVsYXRlZEl0ZW1zKHRoaXMud29ya0lkKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==