e5core-angular-ui
Version:
e5 Anywhere Angular UI
351 lines • 35.8 kB
JavaScript
/**
* @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"><e5core-ui-work-related-items> [workItem$] must have a BehaviorSubject<WorkItemModel></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==