mmhglobal-dynamicform 1.2.3 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
- package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
- package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
- package/esm2020/lib/services/main.service.mjs +752 -0
- package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
- package/esm2020/lib/services/zcomponent.service.mjs +81 -0
- package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
- package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
- package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
- package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
- package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
- package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
- package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
- package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
- package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
- package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
- package/esm2020/lib/zcard/zcard.component.mjs +72 -0
- package/esm2020/lib/zchart/zchart.component.mjs +201 -0
- package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
- package/esm2020/lib/zchip/zchip.component.mjs +121 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
- package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
- package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
- package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
- package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
- package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
- package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
- package/esm2020/lib/zform/zform.component.mjs +147 -0
- package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
- package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
- package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
- package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
- package/esm2020/lib/zgrid/zgrid.component.mjs +838 -0
- package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
- package/esm2020/lib/zimg/zimg.component.mjs +121 -0
- package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
- package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
- package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
- package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
- package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
- package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
- package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
- package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
- package/esm2020/lib/zreport/zreport.component.mjs +105 -0
- package/esm2020/lib/zreport/zreport.config.mjs +117 -0
- package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
- package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
- package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
- package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
- package/esm2020/lib/ztab/ztab.component.mjs +187 -0
- package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
- package/esm2020/lib/ztext/ztext.component.mjs +297 -0
- package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
- package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
- package/esm2020/lib/ztree/ztree.component.mjs +380 -0
- package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
- package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
- package/esm2020/lib/zudf/zudf.component.mjs +205 -0
- package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
- package/esm2020/lib/zupload/zupload.component.mjs +359 -0
- package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
- package/esm2020/mmhglobal-dynamicform.mjs +5 -0
- package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
- package/fesm2015/mmhglobal-dynamicform.mjs +10781 -0
- package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
- package/fesm2020/mmhglobal-dynamicform.mjs +10770 -0
- package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
- package/lib/directives/fieldelement.directive.d.ts +3 -0
- package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
- package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
- package/lib/services/main.service.d.ts +3 -0
- package/lib/services/zcomponent.debug.service.d.ts +8 -5
- package/lib/services/zcomponent.service.d.ts +7 -2
- package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
- package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
- package/lib/uicontent/uicontent.component.d.ts +3 -0
- package/lib/uiheader/uiheader.component.d.ts +3 -0
- package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
- package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
- package/lib/uipage/uipage.component.d.ts +3 -0
- package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
- package/lib/zbullet/zbullet.component.d.ts +3 -0
- package/lib/zbuttons/zbuttons.component.d.ts +3 -0
- package/lib/zcard/zcard.component.d.ts +3 -0
- package/lib/zchart/zchart.component.d.ts +3 -0
- package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
- package/lib/zchip/zchip.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
- package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
- package/lib/zdaterange/zdaterange.component.d.ts +3 -0
- package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
- package/lib/zdatetime/zdatetime.component.d.ts +3 -0
- package/lib/zdiv/zdiv.component.d.ts +3 -0
- package/lib/zdiv/zdiv.pipe.d.ts +3 -0
- package/lib/zform/zform.component.d.ts +3 -0
- package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
- package/lib/zgauge/zgauge.component.d.ts +3 -0
- package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
- package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
- package/lib/zgrid/zgrid.component.d.ts +3 -0
- package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
- package/lib/zimg/zimg.component.d.ts +3 -0
- package/lib/zkcard/zkcard.component.d.ts +3 -0
- package/lib/zlabel/zlabel.component.d.ts +3 -0
- package/lib/zmfb/zmfb.component.d.ts +3 -0
- package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
- package/lib/zmodal/zmodal.component.d.ts +3 -0
- package/lib/znumeric/znumeric.component.d.ts +3 -0
- package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
- package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
- package/lib/zreport/zreport.component.d.ts +3 -0
- package/lib/zreport/zreport.config.d.ts +3 -0
- package/lib/zscheduler/zscheduler.component.d.ts +3 -0
- package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
- package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
- package/lib/ztab/ztab.component.d.ts +3 -0
- package/lib/ztab/ztab.pipe.d.ts +3 -0
- package/lib/ztext/ztext.component.d.ts +3 -0
- package/lib/ztextarea/ztextarea.component.d.ts +3 -0
- package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
- package/lib/ztree/ztree.component.d.ts +3 -0
- package/lib/ztreelist/ztreelist.component.d.ts +3 -0
- package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
- package/lib/zudf/zudf.component.d.ts +3 -0
- package/lib/zunknown/zunknown.component.d.ts +3 -0
- package/lib/zupload/zupload.component.d.ts +3 -0
- package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
- package/mmhglobal-dynamicform.d.ts +1 -2
- package/package.json +20 -11
- package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
- package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
- package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
- package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
- package/esm2015/lib/directives/fieldelement.directive.js +0 -15
- package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
- package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
- package/esm2015/lib/services/main.service.js +0 -766
- package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
- package/esm2015/lib/services/zcomponent.service.js +0 -167
- package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
- package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
- package/esm2015/lib/uicontent/uicontent.component.js +0 -41
- package/esm2015/lib/uiheader/uiheader.component.js +0 -65
- package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
- package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
- package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
- package/esm2015/lib/zbullet/zbullet.component.js +0 -71
- package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
- package/esm2015/lib/zcard/zcard.component.js +0 -68
- package/esm2015/lib/zchart/zchart.component.js +0 -199
- package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
- package/esm2015/lib/zchip/zchip.component.js +0 -117
- package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
- package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
- package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
- package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
- package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
- package/esm2015/lib/zdiv/zdiv.component.js +0 -48
- package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
- package/esm2015/lib/zform/zform.component.js +0 -148
- package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
- package/esm2015/lib/zgauge/zgauge.component.js +0 -146
- package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
- package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
- package/esm2015/lib/zgrid/zgrid.component.js +0 -834
- package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
- package/esm2015/lib/zimg/zimg.component.js +0 -123
- package/esm2015/lib/zkcard/zkcard.component.js +0 -372
- package/esm2015/lib/zlabel/zlabel.component.js +0 -59
- package/esm2015/lib/zmfb/zmfb.component.js +0 -215
- package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
- package/esm2015/lib/zmodal/zmodal.component.js +0 -130
- package/esm2015/lib/znumeric/znumeric.component.js +0 -114
- package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
- package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
- package/esm2015/lib/zreport/zreport.component.js +0 -104
- package/esm2015/lib/zreport/zreport.config.js +0 -115
- package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
- package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
- package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
- package/esm2015/lib/ztab/ztab.component.js +0 -180
- package/esm2015/lib/ztab/ztab.pipe.js +0 -22
- package/esm2015/lib/ztext/ztext.component.js +0 -286
- package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
- package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
- package/esm2015/lib/ztree/ztree.component.js +0 -374
- package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
- package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
- package/esm2015/lib/zudf/zudf.component.js +0 -206
- package/esm2015/lib/zunknown/zunknown.component.js +0 -20
- package/esm2015/lib/zupload/zupload.component.js +0 -358
- package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
- package/esm2015/mmhglobal-dynamicform.js +0 -7
- package/fesm2015/mmhglobal-dynamicform.js +0 -10729
- package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
- package/mmhglobal-dynamicform.metadata.json +0 -1
|
@@ -0,0 +1,621 @@
|
|
|
1
|
+
/********** Angular **********/
|
|
2
|
+
import { Injectable } from "@angular/core";
|
|
3
|
+
import { HttpParams } from '@angular/common/http';
|
|
4
|
+
/********** Plugin **********/
|
|
5
|
+
import { BehaviorSubject, of, forkJoin } from 'rxjs';
|
|
6
|
+
import { tap, switchMap, map } from 'rxjs/operators';
|
|
7
|
+
/********** Component & Service **********/
|
|
8
|
+
import { MESSAGETYPE, ZComponentHelper, ZGroup } from "mmhglobal-zcore";
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
import * as i1 from "@angular/router";
|
|
11
|
+
import * as i2 from "mmhglobal-zcore";
|
|
12
|
+
import * as i3 from "mmhglobal-zmodal";
|
|
13
|
+
export class ZComponentDebugService {
|
|
14
|
+
constructor(router, alertService, authService, fieldService, resourceApiService, toastService, modalService, webApiService) {
|
|
15
|
+
this.router = router;
|
|
16
|
+
this.alertService = alertService;
|
|
17
|
+
this.authService = authService;
|
|
18
|
+
this.fieldService = fieldService;
|
|
19
|
+
this.resourceApiService = resourceApiService;
|
|
20
|
+
this.toastService = toastService;
|
|
21
|
+
this.modalService = modalService;
|
|
22
|
+
this.webApiService = webApiService;
|
|
23
|
+
}
|
|
24
|
+
get debug() {
|
|
25
|
+
return this.scope.group._debug;
|
|
26
|
+
}
|
|
27
|
+
get group() {
|
|
28
|
+
return this.scope.group;
|
|
29
|
+
}
|
|
30
|
+
onInitDebugger(group) {
|
|
31
|
+
group._debug = new ZGroup(true);
|
|
32
|
+
group._isDebugging = true;
|
|
33
|
+
group._debug.zData = {
|
|
34
|
+
collectedActivities: [],
|
|
35
|
+
activityCount: 0,
|
|
36
|
+
collectedWorkflowButtons: [],
|
|
37
|
+
workflowButtonCount: 0
|
|
38
|
+
};
|
|
39
|
+
group._debug.zComponents = {};
|
|
40
|
+
group.isListForm = false;
|
|
41
|
+
}
|
|
42
|
+
onStartDebugger(fieldElements, me) {
|
|
43
|
+
this.scope = me;
|
|
44
|
+
if (!me.group._debug) {
|
|
45
|
+
me.group._debug = {};
|
|
46
|
+
}
|
|
47
|
+
const d = me.group._debug;
|
|
48
|
+
me.form = me.toFormGroup(fieldElements);
|
|
49
|
+
d.form = me.form;
|
|
50
|
+
if (me.subscription) {
|
|
51
|
+
me.subscription.unsubscribe();
|
|
52
|
+
}
|
|
53
|
+
Object.assign(d, {
|
|
54
|
+
// zData: { collectedActivities: [], activityCount: 0 },
|
|
55
|
+
zModel: {},
|
|
56
|
+
subject: new BehaviorSubject(null),
|
|
57
|
+
isEdit: true,
|
|
58
|
+
isNew: false,
|
|
59
|
+
_debug: me.group._debug,
|
|
60
|
+
_group: me.group,
|
|
61
|
+
resourceURL: this.resourceApiService.getURL('field'),
|
|
62
|
+
treeItemTemplate: this.treeItemTemplate,
|
|
63
|
+
onItemClick: this.onItemClick,
|
|
64
|
+
onTreeNodeChange: this.onTreeNodeChange,
|
|
65
|
+
onAddNode: this.onAddNode,
|
|
66
|
+
onRemoveNode: this.onRemoveNode,
|
|
67
|
+
treeNodesExpandAll: this.treeNodesExpandAll,
|
|
68
|
+
treeNodesCollapseAll: this.treeNodesCollapseAll,
|
|
69
|
+
refreshTreeModel: this.refreshTreeModel,
|
|
70
|
+
addNode: this.addNode,
|
|
71
|
+
refreshActivityLogData: this.LoadGridData.bind(this),
|
|
72
|
+
GoToFieldElement: this.gotoFieldElement.bind(this),
|
|
73
|
+
ListWatchName: this.listWatchName,
|
|
74
|
+
onChangeWatchName: this.onChangeWatchName.bind(this),
|
|
75
|
+
getWatchName: this.getWatchName.bind(this),
|
|
76
|
+
fieldElementonEditorCodeChange: this.fieldElementonEditorCodeChange.bind(this),
|
|
77
|
+
gridActivityLogColumnFields: this.fieldService.getFormFieldCode('debugActivityLog', "FormField", this.group, "debugActivityLogField"),
|
|
78
|
+
gridActivityLogOnItemClick: this.gridActivityLogOnItemClick.bind(this),
|
|
79
|
+
updateModel: this.updateModel.bind(this),
|
|
80
|
+
refreshWorkflowButtonData: this.loadWorkflowData.bind(this),
|
|
81
|
+
gridWorkflowButtonColumnFields: this.fieldService.getFormFieldCode('debugWorkflowButton', 'FormField', this.group, "debugWorkflowButtonField"),
|
|
82
|
+
gridWorkflowButtonOnItemClick: this.gridWorkflowButtonOnItemClick.bind(this)
|
|
83
|
+
});
|
|
84
|
+
if (!d.zData) {
|
|
85
|
+
d.zData = { collectedActivities: [], activityCount: 0 };
|
|
86
|
+
}
|
|
87
|
+
me.subscription = d.subject.subscribe((event) => this.subjectEvent(event, d, this));
|
|
88
|
+
ZComponentHelper.setFieldsDivClass(this.group._projectName, this.group.fieldName, fieldElements, this.authService);
|
|
89
|
+
return this.loadDebugZModel(me);
|
|
90
|
+
}
|
|
91
|
+
loadDebugZModel(me) {
|
|
92
|
+
const d = me.group._debug;
|
|
93
|
+
const downloadList = [];
|
|
94
|
+
downloadList.push(this.getProjectId());
|
|
95
|
+
const formType = me.group.isListForm ? 'ListField' : 'FormField';
|
|
96
|
+
const fieldName = me.group.fieldName;
|
|
97
|
+
const fieldzModel = this.getFieldzModel(formType, fieldName);
|
|
98
|
+
downloadList.push(fieldzModel);
|
|
99
|
+
return forkJoin(downloadList);
|
|
100
|
+
}
|
|
101
|
+
getProjectId() {
|
|
102
|
+
const d = this.debug;
|
|
103
|
+
const url = this.resourceApiService.getURL('projectsURL');
|
|
104
|
+
return this.webApiService.getApi(url, {}, d.zData, 'ProjectOptions', null, d, false);
|
|
105
|
+
}
|
|
106
|
+
getFieldzModel(type, activityName) {
|
|
107
|
+
if (type === 'FormField') {
|
|
108
|
+
return this.getFormFieldzModel(activityName);
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return this.getListFieldzModel(activityName);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
getFormFieldzModel(activityName) {
|
|
115
|
+
const d = this.debug;
|
|
116
|
+
const url = this.resourceApiService.getURL('field');
|
|
117
|
+
return this.webApiService.httpGet$(url, { name: activityName, type: 'FormField' }).pipe(tap((respData) => {
|
|
118
|
+
// console.log('respData: ', respData);
|
|
119
|
+
Object.assign(d.zModel, respData);
|
|
120
|
+
d.form.patchValue(d.zModel);
|
|
121
|
+
d.form.markAsPristine();
|
|
122
|
+
const fields = JSON.parse(d.zModel.Code);
|
|
123
|
+
Object.assign(d, {
|
|
124
|
+
treeModel: ZComponentHelper.convertTreeModel(fields)
|
|
125
|
+
});
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
getListFieldzModel(activityName) {
|
|
129
|
+
const d = this.debug;
|
|
130
|
+
const url = this.resourceApiService.getURL('fieldsMapping');
|
|
131
|
+
const url2 = this.resourceApiService.getURL('field');
|
|
132
|
+
return this.webApiService.httpGet$(url, { name: activityName }).pipe(switchMap((fieldMapping) => {
|
|
133
|
+
// console.log('fieldMapping: ', fieldMapping);
|
|
134
|
+
return this.webApiService.httpGet$(url2, { id: fieldMapping.FieldElementMasterId });
|
|
135
|
+
}), tap((respData) => {
|
|
136
|
+
Object.assign(d.zModel, respData);
|
|
137
|
+
d.form.patchValue(d.zModel);
|
|
138
|
+
d.form.markAsPristine();
|
|
139
|
+
const fields = JSON.parse(d.zModel.Code);
|
|
140
|
+
Object.assign(d, {
|
|
141
|
+
treeModel: ZComponentHelper.convertTreeModel(fields)
|
|
142
|
+
});
|
|
143
|
+
}));
|
|
144
|
+
}
|
|
145
|
+
subjectEvent(event, group, me) {
|
|
146
|
+
if (!event || !event.target || event.target.startsWith("modalGroup.")) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
// console.log("** Debug - SubjectEvent", event);
|
|
150
|
+
let callFunc;
|
|
151
|
+
try {
|
|
152
|
+
callFunc = ZComponentHelper.getGroupEvalValue.call(me, event.target);
|
|
153
|
+
// ZComponentHelper.getGroupValue(event.Target, group);
|
|
154
|
+
}
|
|
155
|
+
catch (error) {
|
|
156
|
+
console.warn("Error when getGroupValue: ", event.target, " > Error: ", error);
|
|
157
|
+
}
|
|
158
|
+
// callFunc(event);
|
|
159
|
+
if (typeof callFunc === "function") {
|
|
160
|
+
const newFunc = callFunc.bind(me);
|
|
161
|
+
newFunc(event, group, me);
|
|
162
|
+
}
|
|
163
|
+
else if (typeof callFunc === "string") {
|
|
164
|
+
if (event.type.endsWith("onNavigateTo")) {
|
|
165
|
+
const nUrl = event.target.replace("/:id", "/" + event.data);
|
|
166
|
+
this.router.navigate([nUrl]);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (event.type === "zgrid-cellClick") {
|
|
170
|
+
// (callFunc.startsWith('edit')) { zgrid-cellClick
|
|
171
|
+
const cName = callFunc.slice(4);
|
|
172
|
+
// debugger;
|
|
173
|
+
// const modalGroupParam: ModalPageParams = {};
|
|
174
|
+
// modalGroupParam.controllerName = cName;
|
|
175
|
+
// modalGroupParam.referId = event.data.Id;
|
|
176
|
+
// modalGroupParam.colFields$ = event.columnFields$;
|
|
177
|
+
// modalGroupParam.parentGroup = me.group;
|
|
178
|
+
// this.openModalForm(modalGroupParam);
|
|
179
|
+
this.modalService.show(event.columnFields$ || cName, group, '', {}, event.data.Id); // TODO
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
else if (typeof callFunc === "object") {
|
|
183
|
+
if (event.type === "zgrid-cellClick") {
|
|
184
|
+
if (callFunc.navigateUrl) {
|
|
185
|
+
const url = callFunc.navigateUrl.replace(":id", event.data.Id);
|
|
186
|
+
this.router.navigate([url]);
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
// const modalGroupParam: ModalPageParams = {};
|
|
190
|
+
// modalGroupParam.controllerName = callFunc.ctrlName;
|
|
191
|
+
// modalGroupParam.referId = event.data.Id;
|
|
192
|
+
// modalGroupParam.colFields$ = event.columnFields$;
|
|
193
|
+
// modalGroupParam.parentGroup = me.group;
|
|
194
|
+
// modalGroupParam.formHeader = callFunc.formHeader;
|
|
195
|
+
if (callFunc.formHeader) {
|
|
196
|
+
// this.openModalForm(modalGroupParam);
|
|
197
|
+
this.modalService.show(event.columnFields$ || callFunc.ctrlName, group, callFunc.formHeader, {}, event.data.Id);
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
console.warn("Invalid callFunc type: ", callFunc, " event.Target: ", event.target);
|
|
201
|
+
}
|
|
202
|
+
// this.openModalFormByComponent(callFunc.type, event.Data.Id);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
console.warn("Function not defined in group for: ", event.target, ", Event: ", event);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
gridActivityLogOnItemClick(event) {
|
|
209
|
+
// console.log('gridActivityLogOnItemClick: ', event);
|
|
210
|
+
const rec = event.dataItem;
|
|
211
|
+
switch (rec.type) {
|
|
212
|
+
case 'ListField':
|
|
213
|
+
case 'FormField':
|
|
214
|
+
this.getFieldzModel(rec.type, rec.activityName).subscribe(() => {
|
|
215
|
+
this.selectTab(0);
|
|
216
|
+
});
|
|
217
|
+
break;
|
|
218
|
+
case 'ResourceServerAPI':
|
|
219
|
+
const watchNameValue = '_debug.zData.collectedActivities[' + (rec.index - 1) + '].reference';
|
|
220
|
+
this.setWatchNameValue(watchNameValue);
|
|
221
|
+
this.selectTab(1);
|
|
222
|
+
break;
|
|
223
|
+
case 'HttpGet$':
|
|
224
|
+
case 'HttpPost$':
|
|
225
|
+
case 'HttpPut$':
|
|
226
|
+
case 'HttpDelete$':
|
|
227
|
+
this.setWatchNameValue('_debug.zData.collectedActivities[' + (rec.index - 1) + ']');
|
|
228
|
+
this.selectTab(1);
|
|
229
|
+
break;
|
|
230
|
+
default:
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
selectTab(index) {
|
|
235
|
+
// debugger;
|
|
236
|
+
// this.debug.zComponents["ztab_debuggerTabs"].state.lastSelectedTabIndex = index;
|
|
237
|
+
// ZComponentHelper.getComponent(this.debug, 'ztab_debuggerTabs').state.lastSelectedTabIndex = index;
|
|
238
|
+
ZComponentHelper.getComponent(this.debug, 'ztab_debuggerTabs').selectTab(index);
|
|
239
|
+
}
|
|
240
|
+
setWatchNameValue(newValue) {
|
|
241
|
+
this.debug.zModel['DebugWatchName'] = newValue;
|
|
242
|
+
ZComponentHelper.setModelValue('WatchName', newValue, this.debug, true);
|
|
243
|
+
}
|
|
244
|
+
LoadGridData() {
|
|
245
|
+
const activityLogGrid = ZComponentHelper.getComponent(this.debug, 'zgrid_ActivityLogGrid');
|
|
246
|
+
if (activityLogGrid) {
|
|
247
|
+
activityLogGrid.setData(this.debug.zData.collectedActivities);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
listWatchName(component, searchText, pageNo, me, dataItem, recordId) {
|
|
251
|
+
const watchList = [
|
|
252
|
+
{ Name: 'group.zModel' },
|
|
253
|
+
{ Name: 'group.zData' },
|
|
254
|
+
{ Name: 'group.fields' },
|
|
255
|
+
{ Name: 'group.form.value' },
|
|
256
|
+
{ Name: 'group.backNavigationPage' },
|
|
257
|
+
{ Name: 'group.parentReferenceField' },
|
|
258
|
+
{ Name: 'group.parentReferenceId' },
|
|
259
|
+
{ Name: 'Object.keys(group.zComponents)' },
|
|
260
|
+
{ Name: 'group.gridOptions.zgrid.grid.data' }
|
|
261
|
+
// { Name: 'Object.keys(_debug.zComponents)' },
|
|
262
|
+
// { Name: '_debug.zModel' },
|
|
263
|
+
// { Name: '_debug.zData' },
|
|
264
|
+
// { Name: '_debug.zData.collectedActivities' },
|
|
265
|
+
];
|
|
266
|
+
let results;
|
|
267
|
+
if (searchText) {
|
|
268
|
+
results = watchList.filter((s) => s.Name.toLowerCase().indexOf(searchText.toLowerCase()) !== -1);
|
|
269
|
+
}
|
|
270
|
+
if (pageNo === 0 && searchText) {
|
|
271
|
+
return of({ dataSet: results });
|
|
272
|
+
}
|
|
273
|
+
else if (pageNo === 0) {
|
|
274
|
+
return of({ dataSet: watchList });
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
return of({ dataSet: [] });
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
getWatchName() {
|
|
281
|
+
return this.debug.zModel.DebugWatchName;
|
|
282
|
+
}
|
|
283
|
+
onChangeWatchName(event, group, me) {
|
|
284
|
+
// console.log('onChangeWatchName: ', event.data.value);
|
|
285
|
+
const newValue = event.data.value;
|
|
286
|
+
if (newValue) {
|
|
287
|
+
this.debug.zModel['DebugWatchName'] = newValue.replace('group', '_group');
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
fieldElementonEditorCodeChange(el) {
|
|
291
|
+
this.refreshTreeModel();
|
|
292
|
+
}
|
|
293
|
+
treeNodesExpandAll() {
|
|
294
|
+
this.debug.zComponents['ztree_debugZTree'].expandAll();
|
|
295
|
+
}
|
|
296
|
+
treeNodesCollapseAll() {
|
|
297
|
+
this.debug.zComponents['ztree_debugZTree'].collapseAll();
|
|
298
|
+
}
|
|
299
|
+
refreshTreeModel() {
|
|
300
|
+
try {
|
|
301
|
+
const d = JSON.parse(this.debug.zModel.Code);
|
|
302
|
+
// this._addNodesToTree(d);
|
|
303
|
+
// group['treeModel'] = this.convertTreeModel(d);
|
|
304
|
+
this.debug['treeModel'] = ZComponentHelper.convertTreeModel(d);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
debugger;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
treeItemTemplate(el) {
|
|
311
|
+
const getFieldValue = (item) => {
|
|
312
|
+
if (typeof item._DataValue === "string") {
|
|
313
|
+
return item._DataValue;
|
|
314
|
+
}
|
|
315
|
+
return "...";
|
|
316
|
+
};
|
|
317
|
+
return (el.dataItem.Name +
|
|
318
|
+
" - [" +
|
|
319
|
+
el.dataItem.Type +
|
|
320
|
+
"] = " +
|
|
321
|
+
getFieldValue(el.dataItem));
|
|
322
|
+
}
|
|
323
|
+
async onItemClick(event) {
|
|
324
|
+
// debugger;
|
|
325
|
+
console.log("onItemClick data received: ", event);
|
|
326
|
+
const modalFields = this.fieldService.getFormFieldCode("mvEditFieldNodeForm", "FormField", null, null);
|
|
327
|
+
const dataItem = Object.assign({}, event.data);
|
|
328
|
+
dataItem.Value = dataItem._DataValue;
|
|
329
|
+
delete dataItem._DataValue;
|
|
330
|
+
const zmodel = {
|
|
331
|
+
nodeModel: JSON.stringify(dataItem, null, 2)
|
|
332
|
+
};
|
|
333
|
+
const modal = await this.modalService.show(modalFields, this.debug._group, 'Field Element Info', zmodel);
|
|
334
|
+
modal.subscribe((modalData) => {
|
|
335
|
+
if (modalData.responseType === "cancel") {
|
|
336
|
+
return;
|
|
337
|
+
}
|
|
338
|
+
const newData = JSON.parse(modalData.data.nodeModel);
|
|
339
|
+
if (newData.Value) {
|
|
340
|
+
newData._DataValue = newData.Value;
|
|
341
|
+
newData.Value = null;
|
|
342
|
+
}
|
|
343
|
+
this.updateTreeNode(newData, this.debug['treeModel'], event.event);
|
|
344
|
+
const newTreeModel = JSON.parse(JSON.stringify(this.debug['treeModel']));
|
|
345
|
+
const revertedModel = ZComponentHelper.revertTreeModel(newTreeModel);
|
|
346
|
+
const newCode = JSON.stringify(revertedModel, null, 2);
|
|
347
|
+
ZComponentHelper.setModelValue("Code", newCode, this.debug);
|
|
348
|
+
this.updateModel();
|
|
349
|
+
// this.mainService.updateModel(null, this.debug);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
updateTreeNode(newNode, treeModel, index) {
|
|
353
|
+
const treeIndex = index.split("_");
|
|
354
|
+
if (treeIndex.length > 1) {
|
|
355
|
+
const newIndex = treeIndex.slice(1).join("_");
|
|
356
|
+
this.updateTreeNode(newNode, treeModel[+treeIndex[0]].Value, newIndex);
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
if (treeModel[+treeIndex[0]].Value) {
|
|
360
|
+
newNode.Value = treeModel[+treeIndex[0]].Value;
|
|
361
|
+
}
|
|
362
|
+
treeModel[+treeIndex[0]] = newNode;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
insertTreeNode(newNode, treeModel, index) {
|
|
366
|
+
const treeIndex = index.split("_");
|
|
367
|
+
if (treeIndex.length > 1) {
|
|
368
|
+
const newIndex = treeIndex.slice(1).join("_");
|
|
369
|
+
this.insertTreeNode(newNode, treeModel[+treeIndex[0]].Value, newIndex);
|
|
370
|
+
}
|
|
371
|
+
else {
|
|
372
|
+
if (treeIndex[0]) {
|
|
373
|
+
if (!Array.isArray(treeModel[+treeIndex[0]].Value)) {
|
|
374
|
+
treeModel[+treeIndex[0]].Value = [];
|
|
375
|
+
}
|
|
376
|
+
treeModel[+treeIndex[0]].Value.push(newNode);
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
treeModel.push(newNode);
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
}
|
|
383
|
+
removeTreeNode(treeModel, index) {
|
|
384
|
+
const treeIndex = index.split("_");
|
|
385
|
+
if (treeIndex.length > 1) {
|
|
386
|
+
const newIndex = treeIndex.slice(1).join("_");
|
|
387
|
+
this.removeTreeNode(treeModel[+treeIndex[0]].Value, newIndex);
|
|
388
|
+
}
|
|
389
|
+
else {
|
|
390
|
+
treeModel.splice(+treeIndex[0], 1);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
onTreeNodeChange(el) {
|
|
394
|
+
console.log("onTreeNodeChange: ", el);
|
|
395
|
+
const codeData = JSON.stringify(el.data);
|
|
396
|
+
ZComponentHelper.setModelValue("Code", codeData, this.debug);
|
|
397
|
+
}
|
|
398
|
+
addNode() {
|
|
399
|
+
const el = {
|
|
400
|
+
data: {},
|
|
401
|
+
rowData: {},
|
|
402
|
+
event: "",
|
|
403
|
+
target: "",
|
|
404
|
+
type: "",
|
|
405
|
+
columnFields$: null
|
|
406
|
+
};
|
|
407
|
+
this.onAddNode(el);
|
|
408
|
+
}
|
|
409
|
+
async onAddNode(el) {
|
|
410
|
+
console.log('onAddNode is called', el);
|
|
411
|
+
const modalFields = this.fieldService.getFormFieldCode("mvEditFieldNodeForm", "FormField", null, null);
|
|
412
|
+
// const dataItem = Object.assign({}, el.data);
|
|
413
|
+
// dataItem.Value = dataItem._DataValue;
|
|
414
|
+
// delete dataItem._DataValue;
|
|
415
|
+
const initialModel = {
|
|
416
|
+
Name: 'Name', DisplayName: 'Name', Value: 'Name', Type: 'text',
|
|
417
|
+
gridColVisible: true,
|
|
418
|
+
width: 150,
|
|
419
|
+
minWidth: 100,
|
|
420
|
+
enableFiltering: true,
|
|
421
|
+
enableSorting: true,
|
|
422
|
+
pinnedLeft: false,
|
|
423
|
+
PlaceHolder: "Name",
|
|
424
|
+
IsRequired: false,
|
|
425
|
+
MinLength: 2,
|
|
426
|
+
MaxLength: 50,
|
|
427
|
+
Label: "Name:",
|
|
428
|
+
DivClass: "col-xs-12 col-sm-6 col-md-6 col-lg-3",
|
|
429
|
+
ReadOnly: false,
|
|
430
|
+
ShowLabel: true,
|
|
431
|
+
Visible: true,
|
|
432
|
+
//EnableHiding: true,
|
|
433
|
+
//cellFilter: "",
|
|
434
|
+
//filterCellFiltered: false,
|
|
435
|
+
//enablePinning: true,
|
|
436
|
+
//pinnedRight: false,
|
|
437
|
+
//UpdateOnBlur: true,
|
|
438
|
+
//AppendDivClearFix: false,
|
|
439
|
+
};
|
|
440
|
+
const zmodel = {
|
|
441
|
+
nodeModel: JSON.stringify(initialModel, null, 2)
|
|
442
|
+
};
|
|
443
|
+
// const modal: HTMLIonModalElement = await this.mainService.openModalForm(modalGroupParam);
|
|
444
|
+
const modal = await this.modalService.show(modalFields, this.debug, 'Add Field Element Item', zmodel);
|
|
445
|
+
modal.subscribe((modalData) => {
|
|
446
|
+
if (modalData.responseType === "cancel") {
|
|
447
|
+
return;
|
|
448
|
+
}
|
|
449
|
+
const newData = JSON.parse(modalData.data.nodeModel);
|
|
450
|
+
if (newData.Value) {
|
|
451
|
+
newData._DataValue = newData.Value;
|
|
452
|
+
newData.Value = null;
|
|
453
|
+
}
|
|
454
|
+
this.insertTreeNode(newData, this.debug["treeModel"], el.event);
|
|
455
|
+
const newTreeModel = JSON.parse(JSON.stringify(this.debug['treeModel']));
|
|
456
|
+
const revertedModel = ZComponentHelper.revertTreeModel(newTreeModel);
|
|
457
|
+
const newCode = JSON.stringify(revertedModel, null, 2);
|
|
458
|
+
ZComponentHelper.setModelValue("Code", newCode, this.debug);
|
|
459
|
+
this.updateModel();
|
|
460
|
+
// this.mainService.updateModel(null, this.debug);
|
|
461
|
+
});
|
|
462
|
+
}
|
|
463
|
+
onRemoveNode(el) {
|
|
464
|
+
this.alertService.show('Remove Node', 'Are you sure?', [
|
|
465
|
+
{ text: "No", cssClass: "secondary" },
|
|
466
|
+
{ text: "Yes", cssClass: "primary" }
|
|
467
|
+
])
|
|
468
|
+
.subscribe(reply => {
|
|
469
|
+
if (reply === 'Yes') {
|
|
470
|
+
console.log('Remove Node', el);
|
|
471
|
+
this.removeTreeNode(this.debug["treeModel"], el.event);
|
|
472
|
+
const newTreeModel = JSON.parse(JSON.stringify(this.debug['treeModel']));
|
|
473
|
+
const revertedModel = ZComponentHelper.revertTreeModel(newTreeModel);
|
|
474
|
+
const newCode = JSON.stringify(revertedModel, null, 2);
|
|
475
|
+
ZComponentHelper.setModelValue("Code", newCode, this.debug);
|
|
476
|
+
}
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
gotoFieldElement() {
|
|
480
|
+
this.router.navigate(['admin/field']);
|
|
481
|
+
}
|
|
482
|
+
updateModel() {
|
|
483
|
+
const debug = this.debug;
|
|
484
|
+
const fg = this.debug.form;
|
|
485
|
+
if (!fg.dirty) {
|
|
486
|
+
console.warn("Debug Form is not dirty hence record is not save.");
|
|
487
|
+
return;
|
|
488
|
+
}
|
|
489
|
+
if (!fg.valid) {
|
|
490
|
+
const errors = ZComponentHelper.getFormGroupErrors(fg, this.alertService);
|
|
491
|
+
console.warn("Debug Form Validation got error(s):", errors);
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
of(debug.zModel)
|
|
495
|
+
.pipe(
|
|
496
|
+
// switchMap(zmodel => {
|
|
497
|
+
// console.log("Before update, zModel:", zmodel);
|
|
498
|
+
// return this.beforeUpdateModel(group);
|
|
499
|
+
// }),
|
|
500
|
+
tap(() => {
|
|
501
|
+
Object.assign(debug.zModel, fg.value);
|
|
502
|
+
}), switchMap(() => {
|
|
503
|
+
return this.webApiService.httpPut$(debug.resourceURL + "/" + debug.zModel.Id, debug.zModel)
|
|
504
|
+
.pipe(map(res => this.handleSuccess(res, "Record is updated successfully.")));
|
|
505
|
+
}), switchMap((zmodel) => {
|
|
506
|
+
console.log("After Debug Form updated, zModel:", zmodel);
|
|
507
|
+
if (zmodel && zmodel.Data) {
|
|
508
|
+
Object.assign(debug.zModel, zmodel.Data);
|
|
509
|
+
fg.patchValue(zmodel.Data);
|
|
510
|
+
}
|
|
511
|
+
fg.markAsPristine();
|
|
512
|
+
// this.afterUpdateModel(group);
|
|
513
|
+
return of([]);
|
|
514
|
+
}))
|
|
515
|
+
.subscribe();
|
|
516
|
+
}
|
|
517
|
+
// ******************** Workflow Button ********************
|
|
518
|
+
loadWorkflowData() {
|
|
519
|
+
const zgrid_WorkflowButtonGrid = ZComponentHelper.getComponent(this.debug, 'zgrid_WorkflowButtonGrid');
|
|
520
|
+
if (zgrid_WorkflowButtonGrid) {
|
|
521
|
+
zgrid_WorkflowButtonGrid.setData(this.debug.zData.collectedWorkflowButtons);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
gridWorkflowButtonOnItemClick(event) {
|
|
525
|
+
const dataItem = Object.assign({}, event.dataItem);
|
|
526
|
+
const field = dataItem.refField;
|
|
527
|
+
const attribute = dataItem.refAttribute;
|
|
528
|
+
// Get Mapped Info
|
|
529
|
+
const params = new HttpParams()
|
|
530
|
+
.set("ButtonId", field.Id);
|
|
531
|
+
this.webApiService.httpPost$(this.resourceApiService.getURL("e1wfs_wfc_getmappedButtonInfoURL"), params).pipe(map(async (res) => {
|
|
532
|
+
let roleInfo = [];
|
|
533
|
+
let statusInfo = [];
|
|
534
|
+
let parentStatusInfo = [];
|
|
535
|
+
if (res.MappedRoleList) {
|
|
536
|
+
roleInfo = res.MappedRoleList;
|
|
537
|
+
}
|
|
538
|
+
if (res.MappedStatusList) {
|
|
539
|
+
res.MappedStatusList.forEach((_status) => {
|
|
540
|
+
statusInfo.push(_status.Name + ' (' + _status.Code + ')');
|
|
541
|
+
});
|
|
542
|
+
}
|
|
543
|
+
if (res.MappedParentStatusList) {
|
|
544
|
+
res.MappedParentStatusList.forEach((_parentStatus) => {
|
|
545
|
+
parentStatusInfo.push(_parentStatus.Name + ' (' + _parentStatus.Code + ')');
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
const _mappedInfo = {
|
|
549
|
+
'mappedRoleInfo': roleInfo.length > 0 ? roleInfo : 'N.A.',
|
|
550
|
+
'mappedStatusInfo': statusInfo.length > 0 ? statusInfo : 'N.A.',
|
|
551
|
+
'mappedParentStatusInfo': parentStatusInfo.length > 0 ? parentStatusInfo : 'N.A.'
|
|
552
|
+
};
|
|
553
|
+
// retreive all important info
|
|
554
|
+
const _buttonInfo = {
|
|
555
|
+
'WorkflowId': field.WorkflowId,
|
|
556
|
+
'ButtonId': field.Id,
|
|
557
|
+
'ButtonName': field.Name,
|
|
558
|
+
'ButtonCode': field.Code,
|
|
559
|
+
'ButtonTypeId': field.Type.Id,
|
|
560
|
+
'ButtonTypeName': field.Type.Name,
|
|
561
|
+
'ButtonTypeCode': field.Type.Code,
|
|
562
|
+
'ButtonVisible': attribute.Visible,
|
|
563
|
+
'ButtonClickEvent': attribute.ClickEvent,
|
|
564
|
+
'ButtonURL': attribute.URL,
|
|
565
|
+
'ButtonIcon': attribute.Icon
|
|
566
|
+
};
|
|
567
|
+
let _gotoStatusInfo = {
|
|
568
|
+
'GotoStatusId': 'N.A.',
|
|
569
|
+
'GotoStatusName': 'N.A.',
|
|
570
|
+
'GotoStatusCode': 'N.A.'
|
|
571
|
+
};
|
|
572
|
+
if (field.Status) {
|
|
573
|
+
const _gotoStatus = field.Status;
|
|
574
|
+
_gotoStatusInfo = {
|
|
575
|
+
'GotoStatusId': _gotoStatus.Id,
|
|
576
|
+
'GotoStatusName': _gotoStatus.Name,
|
|
577
|
+
'GotoStatusCode': _gotoStatus.Code
|
|
578
|
+
};
|
|
579
|
+
}
|
|
580
|
+
const propertiesModel = Object.assign(_buttonInfo, _gotoStatusInfo, _mappedInfo);
|
|
581
|
+
const modalFields = this.fieldService.getFormFieldCode("mvWorkflowButtonDebugForm", "FormField", null, null);
|
|
582
|
+
const modal = await this.modalService.show(modalFields, this.debug._group, 'Workflow Button Info', propertiesModel);
|
|
583
|
+
modal.subscribe((modalData) => {
|
|
584
|
+
if (modalData.responseType === "cancel") {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
});
|
|
588
|
+
})).subscribe();
|
|
589
|
+
}
|
|
590
|
+
handleSuccess(res, successMsg) {
|
|
591
|
+
if (res == null) {
|
|
592
|
+
this.toastService.show(successMsg);
|
|
593
|
+
}
|
|
594
|
+
else if (res.Data !== undefined && res.ProcessingStatus !== undefined) {
|
|
595
|
+
if (res.ProcessingStatus === true) {
|
|
596
|
+
if (Array.isArray(res.Data)) {
|
|
597
|
+
res.Data.map(s => this.webApiService.showHttpResponseMessage(MESSAGETYPE.Success, `${successMsg} : ${s.CostCode}`, null));
|
|
598
|
+
}
|
|
599
|
+
else {
|
|
600
|
+
this.webApiService.showHttpResponseMessage(MESSAGETYPE.Success, successMsg, null);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
}
|
|
604
|
+
else {
|
|
605
|
+
this.toastService.show(successMsg);
|
|
606
|
+
}
|
|
607
|
+
return res;
|
|
608
|
+
}
|
|
609
|
+
handleError(res) {
|
|
610
|
+
return this.webApiService.handleError(res);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
ZComponentDebugService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZComponentDebugService, deps: [{ token: i1.Router }, { token: i2.AlertService }, { token: i2.AuthService }, { token: i2.FieldService }, { token: i2.ResourceApiService }, { token: i2.ToastService }, { token: i3.ModalService }, { token: i2.WebApiService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
614
|
+
ZComponentDebugService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZComponentDebugService, providedIn: 'root' });
|
|
615
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.3", ngImport: i0, type: ZComponentDebugService, decorators: [{
|
|
616
|
+
type: Injectable,
|
|
617
|
+
args: [{
|
|
618
|
+
providedIn: 'root'
|
|
619
|
+
}]
|
|
620
|
+
}], ctorParameters: function () { return [{ type: i1.Router }, { type: i2.AlertService }, { type: i2.AuthService }, { type: i2.FieldService }, { type: i2.ResourceApiService }, { type: i2.ToastService }, { type: i3.ModalService }, { type: i2.WebApiService }]; } });
|
|
621
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbW1oZ2xvYmFsLWR5bmFtaWNmb3JtL3NyYy9saWIvc2VydmljZXMvemNvbXBvbmVudC5kZWJ1Zy5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLCtCQUErQjtBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRzNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUtsRCw4QkFBOEI7QUFDOUIsT0FBTyxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFjLE1BQU0sTUFBTSxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJELDJDQUEyQztBQUMzQyxPQUFPLEVBQ2lELFdBQVcsRUFDaEIsZ0JBQWdCLEVBQ3pELE1BQU0sRUFDZixNQUFNLGlCQUFpQixDQUFDOzs7OztBQU16QixNQUFNLE9BQU8sc0JBQXNCO0lBQ2pDLFlBQ1UsTUFBYyxFQUNkLFlBQTBCLEVBQzFCLFdBQXdCLEVBQ3hCLFlBQTBCLEVBQzFCLGtCQUFzQyxFQUN0QyxZQUEwQixFQUMxQixZQUEwQixFQUMxQixhQUE0QjtRQVA1QixXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQ2QsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFDeEIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFDMUIsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUNsQyxDQUFDO0lBSUwsSUFBSSxLQUFLO1FBQ1AsT0FBTyxJQUFJLENBQUMs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QUksRUFBRTtnQkFDakMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQzlFLEdBQUcsVUFBVSxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxJQUFJLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNuRjthQUNGO1NBQ0Y7YUFBTTtZQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRUQsV0FBVyxDQUFDLEdBQVE7UUFDbEIsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM3QyxDQUFDOzttSEFsdEJVLHNCQUFzQjt1SEFBdEIsc0JBQXNCLGNBRnJCLE1BQU07MkZBRVAsc0JBQXNCO2tCQUhsQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqIEFuZ3VsYXIgKioqKioqKioqKi9cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEZvcm1Hcm91cCB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSHR0cFBhcmFtcyB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcclxuXHJcbi8qKioqKioqKioqIElvbmljICoqKioqKioqKiovXHJcbmltcG9ydCB7IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudCB9IGZyb20gJ2lvbmljLXNlbGVjdGFibGUnO1xyXG5cclxuLyoqKioqKioqKiogUGx1Z2luICoqKioqKioqKiovXHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgb2YsIGZvcmtKb2luLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcblxyXG4vKioqKioqKioqKiBDb21wb25lbnQgJiBTZXJ2aWNlICoqKioqKioqKiovXHJcbmltcG9ydCB7XHJcbiAgQWxlcnRCdXR0b24sIEFsZXJ0U2VydmljZSwgQXV0aFNlcnZpY2UsIEZpZWxkU2VydmljZSwgTUVTU0FHRVRZUEUsXHJcbiAgUmVzb3VyY2VBcGlTZXJ2aWNlLCBUb2FzdFNlcnZpY2UsIFdlYkFwaVNlcnZpY2UsIFpDb21wb25lbnRIZWxwZXIsIFpDb21wb25lbnRPdXRwdXRFdmVudCxcclxuICBaRmllbGQsIFpHcm91cCwgWlRyZWVUZW1wbGF0ZVBhcmFtc1xyXG59IGZyb20gXCJtbWhnbG9iYWwtemNvcmVcIjtcclxuaW1wb3J0IHsgTW9kYWxSZXNwb25zZSwgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbW1oZ2xvYmFsLXptb2RhbCc7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBaQ29tcG9uZW50RGVidWdTZXJ2aWNlIHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhdXRoU2VydmljZTogQXV0aFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGZpZWxkU2VydmljZTogRmllbGRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZXNvdXJjZUFwaVNlcnZpY2U6IFJlc291cmNlQXBpU2VydmljZSxcclxuICAgIHByaXZhdGUgdG9hc3RTZXJ2aWNlOiBUb2FzdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSB3ZWJBcGlTZXJ2aWNlOiBXZWJBcGlTZXJ2aWNlXHJcbiAgKSB7IH1cclxuXHJcbiAgcHJpdmF0ZSBzY29wZTogYW55O1xyXG5cclxuICBnZXQgZGVidWcoKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlLmdyb3VwLl9kZWJ1ZztcclxuICB9XHJcblxyXG4gIGdldCBncm91cCgpOiBaR3JvdXAge1xyXG4gICAgcmV0dXJuIHRoaXMuc2NvcGUuZ3JvdXA7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb25Jbml0RGVidWdnZXIoZ3JvdXA6IFpHcm91cCkge1xyXG4gICAgZ3JvdXAuX2RlYnVnID0gbmV3IFpHcm91cCh0cnVlKTtcclxuICAgIGdyb3VwLl9pc0RlYnVnZ2luZyA9IHRydWU7XHJcbiAgICBncm91cC5fZGVidWcuekRhdGEgPSB7XHJcbiAgICAgIGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLFxyXG4gICAgICBhY3Rpdml0eUNvdW50OiAwLFxyXG4gICAgICBjb2xsZWN0ZWRXb3JrZmxvd0J1dHRvbnM6IFtdLFxyXG4gICAgICB3b3JrZmxvd0J1dHRvbkNvdW50OiAwXHJcbiAgICB9O1xyXG4gICAgZ3JvdXAuX2RlYnVnLnpDb21wb25lbnRzID0ge307XHJcbiAgICBncm91cC5pc0xpc3RGb3JtID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIG9uU3RhcnREZWJ1Z2dlcihmaWVsZEVsZW1lbnRzOiBBcnJheTxaRmllbGQ+LCBtZTogYW55KSB7XHJcbiAgICB0aGlzLnNjb3BlID0gbWU7XHJcbiAgICBpZiAoIW1lLmdyb3VwLl9kZWJ1Zykge1xyXG4gICAgICBtZS5ncm91cC5fZGVidWcgPSB7fTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBkOiBaR3JvdXAgPSBtZS5ncm91cC5fZGVidWc7XHJcbiAgICBtZS5mb3JtID0gbWUudG9Gb3JtR3JvdXAoZmllbGRFbGVtZW50cyk7XHJcbiAgICBkLmZvcm0gPSBtZS5mb3JtO1xyXG4gICAgaWYgKG1lLnN1YnNjcmlwdGlvbikge1xyXG4gICAgICBtZS5zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBPYmplY3QuYXNzaWduKGQsIHtcclxuICAgICAgLy8gekRhdGE6IHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfSxcclxuICAgICAgek1vZGVsOiB7fSxcclxuICAgICAgc3ViamVjdDogbmV3IEJlaGF2aW9yU3ViamVjdDxaQ29tcG9uZW50T3V0cHV0RXZlbnQ+KG51bGwpLFxyXG4gICAgICBpc0VkaXQ6IHRydWUsXHJcbiAgICAgIGlzTmV3OiBmYWxzZSxcclxuICAgICAgX2RlYnVnOiBtZS5ncm91cC5fZGVidWcsXHJcbiAgICAgIF9ncm91cDogbWUuZ3JvdXAsXHJcbiAgICAgIHJlc291cmNlVVJMOiB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoJ2ZpZWxkJyksXHJcbiAgICAgIHRyZWVJdGVtVGVtcGxhdGU6IHRoaXMudHJlZUl0ZW1UZW1wbGF0ZSxcclxuICAgICAgb25JdGVtQ2xpY2s6IHRoaXMub25JdGVtQ2xpY2ssXHJcbiAgICAgIG9uVHJlZU5vZGVDaGFuZ2U6IHRoaXMub25UcmVlTm9kZUNoYW5nZSxcclxuICAgICAgb25BZGROb2RlOiB0aGlzLm9uQWRkTm9kZSxcclxuICAgICAgb25SZW1vdmVOb2RlOiB0aGlzLm9uUmVtb3ZlTm9kZSxcclxuICAgICAgdHJlZU5vZGVzRXhwYW5kQWxsOiB0aGlzLnRyZWVOb2Rlc0V4cGFuZEFsbCxcclxuICAgICAgdHJlZU5vZGVzQ29sbGFwc2VBbGw6IHRoaXMudHJlZU5vZGVzQ29sbGFwc2VBbGwsXHJcbiAgICAgIHJlZnJlc2hUcmVlTW9kZWw6IHRoaXMucmVmcmVzaFRyZWVNb2RlbCxcclxuICAgICAgYWRkTm9kZTogdGhpcy5hZGROb2RlLFxyXG4gICAgICByZWZyZXNoQWN0aXZpdHlMb2dEYXRhOiB0aGlzLkxvYWRHcmlkRGF0YS5iaW5kKHRoaXMpLFxyXG4gICAgICBHb1RvRmllbGRFbGVtZW50OiB0aGlzLmdvdG9GaWVsZEVsZW1lbnQuYmluZCh0aGlzKSxcclxuICAgICAgTGlzdFdhdGNoTmFtZTogdGhpcy5saXN0V2F0Y2hOYW1lLFxyXG4gICAgICBvbkNoYW5nZVdhdGNoTmFtZTogdGhpcy5vbkNoYW5nZVdhdGNoTmFtZS5iaW5kKHRoaXMpLFxyXG4gICAgICBnZXRXYXRjaE5hbWU6IHRoaXMuZ2V0V2F0Y2hOYW1lLmJpbmQodGhpcyksXHJcbiAgICAgIGZpZWxkRWxlbWVudG9uRWRpdG9yQ29kZUNoYW5nZTogdGhpcy5maWVsZEVsZW1lbnRvbkVkaXRvckNvZGVDaGFuZ2UuYmluZCh0aGlzKSxcclxuICAgICAgZ3JpZEFjdGl2aXR5TG9nQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgICdkZWJ1Z0FjdGl2aXR5TG9nJyxcclxuICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgIHRoaXMuZ3JvdXAsXHJcbiAgICAgICAgXCJkZWJ1Z0FjdGl2aXR5TG9nRmllbGRcIlxyXG4gICAgICApLFxyXG4gICAgICBncmlkQWN0aXZpdHlMb2dPbkl0ZW1DbGljazogdGhpcy5ncmlkQWN0aXZpdHlMb2dPbkl0ZW1DbGljay5iaW5kKHRoaXMpLFxyXG4gICAgICB1cGRhdGVNb2RlbDogdGhpcy51cGRhdGVNb2RlbC5iaW5kKHRoaXMpLFxyXG4gICAgICByZWZyZXNoV29ya2Zsb3dCdXR0b25EYXRhOiB0aGlzLmxvYWRXb3JrZmxvd0RhdGEuYmluZCh0aGlzKSxcclxuICAgICAgZ3JpZFdvcmtmbG93QnV0dG9uQ29sdW1uRmllbGRzOiB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgICdkZWJ1Z1dvcmtmbG93QnV0dG9uJyxcclxuICAgICAgICAnRm9ybUZpZWxkJyxcclxuICAgICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICAgIFwiZGVidWdXb3JrZmxvd0J1dHRvbkZpZWxkXCJcclxuICAgICAgKSxcclxuICAgICAgZ3JpZFdvcmtmbG93QnV0dG9uT25JdGVtQ2xpY2s6IHRoaXMuZ3JpZFdvcmtmbG93QnV0dG9uT25JdGVtQ2xpY2suYmluZCh0aGlzKVxyXG4gICAgfSk7XHJcbiAgICBpZiAoIWQuekRhdGEpIHtcclxuICAgICAgZC56RGF0YSA9IHsgY29sbGVjdGVkQWN0aXZpdGllczogW10sIGFjdGl2aXR5Q291bnQ6IDAgfTtcclxuICAgIH1cclxuXHJcbiAgICBtZS5zdWJzY3JpcHRpb24gPSBkLnN1YmplY3Quc3Vic2NyaWJlKChldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSA9PlxyXG4gICAgICB0aGlzLnN1YmplY3RFdmVudChldmVudCwgZCwgdGhpcylcclxuICAgICk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldEZpZWxkc0RpdkNsYXNzKHRoaXMuZ3JvdXAuX3Byb2plY3ROYW1lLCB0aGlzLmdyb3VwLmZpZWxkTmFtZSwgZmllbGRFbGVtZW50cywgdGhpcy5hdXRoU2VydmljZSk7XHJcbiAgICByZXR1cm4gdGhpcy5sb2FkRGVidWdaTW9kZWwobWUpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkRGVidWdaTW9kZWwobWU6IGFueSkge1xyXG4gICAgY29uc3QgZDogWkdyb3VwID0gbWUuZ3JvdXAuX2RlYnVnO1xyXG5cclxuICAgIGNvbnN0IGRvd25sb2FkTGlzdCA9IFtdO1xyXG4gICAgZG93bmxvYWRMaXN0LnB1c2godGhpcy5nZXRQcm9qZWN0SWQoKSk7XHJcblxyXG4gICAgY29uc3QgZm9ybVR5cGUgPSBtZS5ncm91cC5pc0xpc3RGb3JtID8gJ0xpc3RGaWVsZCcgOiAnRm9ybUZpZWxkJztcclxuICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1lLmdyb3VwLmZpZWxkTmFtZTtcclxuICAgIGNvbnN0IGZpZWxkek1vZGVsID0gdGhpcy5nZXRGaWVsZHpNb2RlbChmb3JtVHlwZSwgZmllbGROYW1lKTtcclxuICAgIGRvd25sb2FkTGlzdC5wdXNoKGZpZWxkek1vZGVsKTtcclxuXHJcbiAgICByZXR1cm4gZm9ya0pvaW4oZG93bmxvYWRMaXN0KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0UHJvamVjdElkKCkge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZGVidWc7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoJ3Byb2plY3RzVVJMJyk7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmdldEFwaSh1cmwsIHt9LCBkLnpEYXRhLCAnUHJvamVjdE9wdGlvbnMnLCBudWxsLCBkLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldEZpZWxkek1vZGVsKHR5cGU6IHN0cmluZywgYWN0aXZpdHlOYW1lOiBzdHJpbmcpIHtcclxuICAgIGlmICh0eXBlID09PSAnRm9ybUZpZWxkJykge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRGb3JtRmllbGR6TW9kZWwoYWN0aXZpdHlOYW1lKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmdldExpc3RGaWVsZHpNb2RlbChhY3Rpdml0eU5hbWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGb3JtRmllbGR6TW9kZWwoYWN0aXZpdHlOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGQ6IFpHcm91cCA9IHRoaXMuZGVidWc7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoJ2ZpZWxkJyk7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKHVybCwgeyBuYW1lOiBhY3Rpdml0eU5hbWUsIHR5cGU6ICdGb3JtRmllbGQnIH0pLnBpcGUoXHJcbiAgICAgIHRhcCgocmVzcERhdGE6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdyZXNwRGF0YTogJywgcmVzcERhdGEpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZC56TW9kZWwsIHJlc3BEYXRhKTtcclxuICAgICAgICBkLmZvcm0ucGF0Y2hWYWx1ZShkLnpNb2RlbCk7XHJcbiAgICAgICAgZC5mb3JtLm1hcmtBc1ByaXN0aW5lKCk7XHJcbiAgICAgICAgY29uc3QgZmllbGRzID0gSlNPTi5wYXJzZShkLnpNb2RlbC5Db2RlKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGQsIHtcclxuICAgICAgICAgIHRyZWVNb2RlbDogWkNvbXBvbmVudEhlbHBlci5jb252ZXJ0VHJlZU1vZGVsKGZpZWxkcylcclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldExpc3RGaWVsZHpNb2RlbChhY3Rpdml0eU5hbWU6IHN0cmluZykge1xyXG4gICAgY29uc3QgZCA9IHRoaXMuZGVidWc7XHJcbiAgICBjb25zdCB1cmwgPSB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoJ2ZpZWxkc01hcHBpbmcnKTtcclxuICAgIGNvbnN0IHVybDIgPSB0aGlzLnJlc291cmNlQXBpU2VydmljZS5nZXRVUkwoJ2ZpZWxkJyk7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBHZXQkKHVybCwgeyBuYW1lOiBhY3Rpdml0eU5hbWUgfSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKChmaWVsZE1hcHBpbmc6IGFueSkgPT4ge1xyXG4gICAgICAgIC8vIGNvbnNvbGUubG9nKCdmaWVsZE1hcHBpbmc6ICcsIGZpZWxkTWFwcGluZyk7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JCh1cmwyLCB7IGlkOiBmaWVsZE1hcHBpbmcuRmllbGRFbGVtZW50TWFzdGVySWQgfSk7XHJcbiAgICAgIH0pLFxyXG4gICAgICB0YXAoKHJlc3BEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGQuek1vZGVsLCByZXNwRGF0YSk7XHJcbiAgICAgICAgZC5mb3JtLnBhdGNoVmFsdWUoZC56TW9kZWwpO1xyXG4gICAgICAgIGQuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IEpTT04ucGFyc2UoZC56TW9kZWwuQ29kZSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkLCB7XHJcbiAgICAgICAgICB0cmVlTW9kZWw6IFpDb21wb25lbnRIZWxwZXIuY29udmVydFRyZWVNb2RlbChmaWVsZHMpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApXHJcbiAgfVxyXG5cclxuXHJcbiAgcHJpdmF0ZSBzdWJqZWN0RXZlbnQoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCwgZ3JvdXA6IFpHcm91cCwgbWU6IGFueSkge1xyXG4gICAgaWYgKCFldmVudCB8fCAhZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnRhcmdldC5zdGFydHNXaXRoKFwibW9kYWxHcm91cC5cIikpIHtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2coXCIqKiBEZWJ1ZyAtIFN1YmplY3RFdmVudFwiLCBldmVudCk7XHJcbiAgICBsZXQgY2FsbEZ1bmM7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgY2FsbEZ1bmMgPSBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwRXZhbFZhbHVlLmNhbGwoXHJcbiAgICAgICAgbWUsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICk7XHJcbiAgICAgIC8vIFpDb21wb25lbnRIZWxwZXIuZ2V0R3JvdXBWYWx1ZShldmVudC5UYXJnZXQsIGdyb3VwKTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkVycm9yIHdoZW4gZ2V0R3JvdXBWYWx1ZTogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiID4gRXJyb3I6IFwiLFxyXG4gICAgICAgIGVycm9yXHJcbiAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gY2FsbEZ1bmMoZXZlbnQpO1xyXG4gICAgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJmdW5jdGlvblwiKSB7XHJcbiAgICAgIGNvbnN0IG5ld0Z1bmMgPSBjYWxsRnVuYy5iaW5kKG1lKTtcclxuICAgICAgbmV3RnVuYyhldmVudCwgZ3JvdXAsIG1lKTtcclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcInN0cmluZ1wiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlLmVuZHNXaXRoKFwib25OYXZpZ2F0ZVRvXCIpKSB7XHJcbiAgICAgICAgY29uc3QgblVybCA9IGV2ZW50LnRhcmdldC5yZXBsYWNlKFwiLzppZFwiLCBcIi9cIiArIGV2ZW50LmRhdGEpO1xyXG4gICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtuVXJsXSk7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIC8vIChjYWxsRnVuYy5zdGFydHNXaXRoKCdlZGl0JykpIHsgIHpncmlkLWNlbGxDbGlja1xyXG4gICAgICAgIGNvbnN0IGNOYW1lID0gY2FsbEZ1bmMuc2xpY2UoNCk7XHJcbiAgICAgICAgLy8gZGVidWdnZXI7XHJcbiAgICAgICAgLy8gY29uc3QgbW9kYWxHcm91cFBhcmFtOiBNb2RhbFBhZ2VQYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29udHJvbGxlck5hbWUgPSBjTmFtZTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucmVmZXJJZCA9IGV2ZW50LmRhdGEuSWQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbEZpZWxkcyQgPSBldmVudC5jb2x1bW5GaWVsZHMkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5wYXJlbnRHcm91cCA9IG1lLmdyb3VwO1xyXG5cclxuICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY05hbWUsIGdyb3VwLCAnJywge30sIGV2ZW50LmRhdGEuSWQpOyAvLyBUT0RPXHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbGxGdW5jID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgIGlmIChldmVudC50eXBlID09PSBcInpncmlkLWNlbGxDbGlja1wiKSB7XHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLm5hdmlnYXRlVXJsKSB7XHJcbiAgICAgICAgICBjb25zdCB1cmwgPSBjYWxsRnVuYy5uYXZpZ2F0ZVVybC5yZXBsYWNlKFwiOmlkXCIsIGV2ZW50LmRhdGEuSWQpO1xyXG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW3VybF0pO1xyXG4gICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gY29uc3QgbW9kYWxHcm91cFBhcmFtOiBNb2RhbFBhZ2VQYXJhbXMgPSB7fTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uY29udHJvbGxlck5hbWUgPSBjYWxsRnVuYy5jdHJsTmFtZTtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucmVmZXJJZCA9IGV2ZW50LmRhdGEuSWQ7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbEZpZWxkcyQgPSBldmVudC5jb2x1bW5GaWVsZHMkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5wYXJlbnRHcm91cCA9IG1lLmdyb3VwO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5mb3JtSGVhZGVyID0gY2FsbEZ1bmMuZm9ybUhlYWRlcjtcclxuXHJcbiAgICAgICAgaWYgKGNhbGxGdW5jLmZvcm1IZWFkZXIpIHtcclxuICAgICAgICAgIC8vIHRoaXMub3Blbk1vZGFsRm9ybShtb2RhbEdyb3VwUGFyYW0pO1xyXG5cclxuICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLnNob3coZXZlbnQuY29sdW1uRmllbGRzJCB8fCBjYWxsRnVuYy5jdHJsTmFtZSwgZ3JvdXAsIGNhbGxGdW5jLmZvcm1IZWFkZXIsIHt9LCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc29sZS53YXJuKFxyXG4gICAgICAgICAgXCJJbnZhbGlkIGNhbGxGdW5jIHR5cGU6IFwiLFxyXG4gICAgICAgICAgY2FsbEZ1bmMsXHJcbiAgICAgICAgICBcIiBldmVudC5UYXJnZXQ6IFwiLFxyXG4gICAgICAgICAgZXZlbnQudGFyZ2V0XHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm1CeUNvbXBvbmVudChjYWxsRnVuYy50eXBlLCBldmVudC5EYXRhLklkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICBcIkZ1bmN0aW9uIG5vdCBkZWZpbmVkIGluIGdyb3VwIGZvcjogXCIsXHJcbiAgICAgICAgZXZlbnQudGFyZ2V0LFxyXG4gICAgICAgIFwiLCBFdmVudDogXCIsXHJcbiAgICAgICAgZXZlbnRcclxuICAgICAgKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ3JpZEFjdGl2aXR5TG9nT25JdGVtQ2xpY2soZXZlbnQ6IGFueSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coJ2dyaWRBY3Rpdml0eUxvZ09uSXRlbUNsaWNrOiAnLCBldmVudCk7XHJcbiAgICBjb25zdCByZWMgPSBldmVudC5kYXRhSXRlbTtcclxuICAgIHN3aXRjaCAocmVjLnR5cGUpIHtcclxuICAgICAgY2FzZSAnTGlzdEZpZWxkJzpcclxuICAgICAgY2FzZSAnRm9ybUZpZWxkJzpcclxuICAgICAgICB0aGlzLmdldEZpZWxkek1vZGVsKHJlYy50eXBlLCByZWMuYWN0aXZpdHlOYW1lKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RUYWIoMCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ1Jlc291cmNlU2VydmVyQVBJJzpcclxuICAgICAgICBjb25zdCB3YXRjaE5hbWVWYWx1ZSA9ICdfZGVidWcuekRhdGEuY29sbGVjdGVkQWN0aXZpdGllc1snICsgKHJlYy5pbmRleCAtIDEpICsgJ10ucmVmZXJlbmNlJztcclxuICAgICAgICB0aGlzLnNldFdhdGNoTmFtZVZhbHVlKHdhdGNoTmFtZVZhbHVlKTtcclxuICAgICAgICB0aGlzLnNlbGVjdFRhYigxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnSHR0cEdldCQnOlxyXG4gICAgICBjYXNlICdIdHRwUG9zdCQnOlxyXG4gICAgICBjYXNlICdIdHRwUHV0JCc6XHJcbiAgICAgIGNhc2UgJ0h0dHBEZWxldGUkJzpcclxuICAgICAgICB0aGlzLnNldFdhdGNoTmFtZVZhbHVlKCdfZGVidWcuekRhdGEuY29sbGVjdGVkQWN0aXZpdGllc1snICsgKHJlYy5pbmRleCAtIDEpICsgJ10nKTtcclxuICAgICAgICB0aGlzLnNlbGVjdFRhYigxKTtcclxuICAgICAgICBicmVhaztcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICBicmVhaztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2VsZWN0VGFiKGluZGV4OiBudW1iZXIpIHtcclxuICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgLy8gdGhpcy5kZWJ1Zy56Q29tcG9uZW50c1tcInp0YWJfZGVidWdnZXJUYWJzXCJdLnN0YXRlLmxhc3RTZWxlY3RlZFRhYkluZGV4ID0gaW5kZXg7XHJcbiAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCh0aGlzLmRlYnVnLCAnenRhYl9kZWJ1Z2dlclRhYnMnKS5zdGF0ZS5sYXN0U2VsZWN0ZWRUYWJJbmRleCA9IGluZGV4O1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnQodGhpcy5kZWJ1ZywgJ3p0YWJfZGVidWdnZXJUYWJzJykuc2VsZWN0VGFiKGluZGV4KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgc2V0V2F0Y2hOYW1lVmFsdWUobmV3VmFsdWU6IHN0cmluZykge1xyXG4gICAgdGhpcy5kZWJ1Zy56TW9kZWxbJ0RlYnVnV2F0Y2hOYW1lJ10gPSBuZXdWYWx1ZTtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZSgnV2F0Y2hOYW1lJywgbmV3VmFsdWUsIHRoaXMuZGVidWcsIHRydWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIExvYWRHcmlkRGF0YSgpIHtcclxuICAgIGNvbnN0IGFjdGl2aXR5TG9nR3JpZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZGVidWcsICd6Z3JpZF9BY3Rpdml0eUxvZ0dyaWQnKTtcclxuICAgIGlmIChhY3Rpdml0eUxvZ0dyaWQpIHtcclxuICAgICAgYWN0aXZpdHlMb2dHcmlkLnNldERhdGEodGhpcy5kZWJ1Zy56RGF0YS5jb2xsZWN0ZWRBY3Rpdml0aWVzKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbGlzdFdhdGNoTmFtZShjb21wb25lbnQ6IElvbmljU2VsZWN0YWJsZUNvbXBvbmVudCwgc2VhcmNoVGV4dDogc3RyaW5nLCBwYWdlTm86IG51bWJlcixcclxuICAgIG1lOiBhbnksIGRhdGFJdGVtOiBhbnksIHJlY29yZElkPzogc3RyaW5nKSB7XHJcblxyXG4gICAgY29uc3Qgd2F0Y2hMaXN0ID0gW1xyXG4gICAgICB7IE5hbWU6ICdncm91cC56TW9kZWwnIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLnpEYXRhJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC5maWVsZHMnIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLmZvcm0udmFsdWUnIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLmJhY2tOYXZpZ2F0aW9uUGFnZScgfSxcclxuICAgICAgeyBOYW1lOiAnZ3JvdXAucGFyZW50UmVmZXJlbmNlRmllbGQnIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLnBhcmVudFJlZmVyZW5jZUlkJyB9LFxyXG4gICAgICB7IE5hbWU6ICdPYmplY3Qua2V5cyhncm91cC56Q29tcG9uZW50cyknIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLmdyaWRPcHRpb25zLnpncmlkLmdyaWQuZGF0YScgfVxyXG4gICAgICAvLyB7IE5hbWU6ICdPYmplY3Qua2V5cyhfZGVidWcuekNvbXBvbmVudHMpJyB9LFxyXG4gICAgICAvLyB7IE5hbWU6ICdfZGVidWcuek1vZGVsJyB9LFxyXG4gICAgICAvLyB7IE5hbWU6ICdfZGVidWcuekRhdGEnIH0sXHJcbiAgICAgIC8vIHsgTmFtZTogJ19kZWJ1Zy56RGF0YS5jb2xsZWN0ZWRBY3Rpdml0aWVzJyB9LFxyXG4gICAgXTtcclxuXHJcbiAgICBsZXQgcmVzdWx0cztcclxuICAgIGlmIChzZWFyY2hUZXh0KSB7XHJcbiAgICAgIHJlc3VsdHMgPSB3YXRjaExpc3QuZmlsdGVyKChzKSA9PiBzLk5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKHNlYXJjaFRleHQudG9Mb3dlckNhc2UoKSkgIT09IC0xKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAocGFnZU5vID09PSAwICYmIHNlYXJjaFRleHQpIHtcclxuICAgICAgcmV0dXJuIG9mKHsgZGF0YVNldDogcmVzdWx0cyB9KTtcclxuICAgIH0gZWxzZSBpZiAocGFnZU5vID09PSAwKSB7XHJcbiAgICAgIHJldHVybiBvZih7IGRhdGFTZXQ6IHdhdGNoTGlzdCB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBvZih7IGRhdGFTZXQ6IFtdIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRXYXRjaE5hbWUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5kZWJ1Zy56TW9kZWwuRGVidWdXYXRjaE5hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uQ2hhbmdlV2F0Y2hOYW1lKGV2ZW50OiBhbnksIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdvbkNoYW5nZVdhdGNoTmFtZTogJywgZXZlbnQuZGF0YS52YWx1ZSk7XHJcbiAgICBjb25zdCBuZXdWYWx1ZSA9IGV2ZW50LmRhdGEudmFsdWU7XHJcbiAgICBpZiAobmV3VmFsdWUpIHtcclxuICAgICAgdGhpcy5kZWJ1Zy56TW9kZWxbJ0RlYnVnV2F0Y2hOYW1lJ10gPSBuZXdWYWx1ZS5yZXBsYWNlKCdncm91cCcsICdfZ3JvdXAnKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZmllbGRFbGVtZW50b25FZGl0b3JDb2RlQ2hhbmdlKGVsOiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHRoaXMucmVmcmVzaFRyZWVNb2RlbCgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgdHJlZU5vZGVzRXhwYW5kQWxsKCkge1xyXG4gICAgdGhpcy5kZWJ1Zy56Q29tcG9uZW50c1snenRyZWVfZGVidWdaVHJlZSddLmV4cGFuZEFsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmVlTm9kZXNDb2xsYXBzZUFsbCgpIHtcclxuICAgIHRoaXMuZGVidWcuekNvbXBvbmVudHNbJ3p0cmVlX2RlYnVnWlRyZWUnXS5jb2xsYXBzZUFsbCgpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZWZyZXNoVHJlZU1vZGVsKCkge1xyXG4gICAgdHJ5IHtcclxuICAgICAgY29uc3QgZCA9IEpTT04ucGFyc2UodGhpcy5kZWJ1Zy56TW9kZWwuQ29kZSk7XHJcbiAgICAgIC8vIHRoaXMuX2FkZE5vZGVzVG9UcmVlKGQpO1xyXG4gICAgICAvLyBncm91cFsndHJlZU1vZGVsJ10gPSB0aGlzLmNvbnZlcnRUcmVlTW9kZWwoZCk7XHJcbiAgICAgIHRoaXMuZGVidWdbJ3RyZWVNb2RlbCddID0gWkNvbXBvbmVudEhlbHBlci5jb252ZXJ0VHJlZU1vZGVsKGQpO1xyXG4gICAgfSBjYXRjaCB7XHJcbiAgICAgIGRlYnVnZ2VyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmVlSXRlbVRlbXBsYXRlKGVsOiBaVHJlZVRlbXBsYXRlUGFyYW1zKSB7XHJcbiAgICBjb25zdCBnZXRGaWVsZFZhbHVlID0gKGl0ZW06IGFueSkgPT4ge1xyXG4gICAgICBpZiAodHlwZW9mIGl0ZW0uX0RhdGFWYWx1ZSA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICAgIHJldHVybiBpdGVtLl9EYXRhVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIFwiLi4uXCI7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgZWwuZGF0YUl0ZW0uTmFtZSArXHJcbiAgICAgIFwiIC0gW1wiICtcclxuICAgICAgZWwuZGF0YUl0ZW0uVHlwZSArXHJcbiAgICAgIFwiXSA9IFwiICtcclxuICAgICAgZ2V0RmllbGRWYWx1ZShlbC5kYXRhSXRlbSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBvbkl0ZW1DbGljayhldmVudDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIGNvbnNvbGUubG9nKFwib25JdGVtQ2xpY2sgZGF0YSByZWNlaXZlZDogXCIsIGV2ZW50KTtcclxuICAgIGNvbnN0IG1vZGFsRmllbGRzID0gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgXCJtdkVkaXRGaWVsZE5vZGVGb3JtXCIsXHJcbiAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIG51bGxcclxuICAgICk7XHJcbiAgICBjb25zdCBkYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LmRhdGEpO1xyXG4gICAgZGF0YUl0ZW0uVmFsdWUgPSBkYXRhSXRlbS5fRGF0YVZhbHVlO1xyXG4gICAgZGVsZXRlIGRhdGFJdGVtLl9EYXRhVmFsdWU7XHJcbiAgICBjb25zdCB6bW9kZWwgPSB7XHJcbiAgICAgIG5vZGVNb2RlbDogSlNPTi5zdHJpbmdpZnkoZGF0YUl0ZW0sIG51bGwsIDIpXHJcbiAgICB9O1xyXG4gICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsRmllbGRzLCB0aGlzLmRlYnVnLl9ncm91cCwgJ0ZpZWxkIEVsZW1lbnQgSW5mbycsIHptb2RlbCk7XHJcbiAgICBtb2RhbC5zdWJzY3JpYmUoKG1vZGFsRGF0YTogTW9kYWxSZXNwb25zZSkgPT4ge1xyXG4gICAgICBpZiAobW9kYWxEYXRhLnJlc3BvbnNlVHlwZSA9PT0gXCJjYW5jZWxcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBuZXdEYXRhID0gSlNPTi5wYXJzZShtb2RhbERhdGEuZGF0YS5ub2RlTW9kZWwpO1xyXG4gICAgICBpZiAobmV3RGF0YS5WYWx1ZSkge1xyXG4gICAgICAgIG5ld0RhdGEuX0RhdGFWYWx1ZSA9IG5ld0RhdGEuVmFsdWU7XHJcbiAgICAgICAgbmV3RGF0YS5WYWx1ZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVUcmVlTm9kZShuZXdEYXRhLCB0aGlzLmRlYnVnWyd0cmVlTW9kZWwnXSwgZXZlbnQuZXZlbnQpO1xyXG4gICAgICBjb25zdCBuZXdUcmVlTW9kZWwgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGVidWdbJ3RyZWVNb2RlbCddKSk7XHJcbiAgICAgIGNvbnN0IHJldmVydGVkTW9kZWwgPSBaQ29tcG9uZW50SGVscGVyLnJldmVydFRyZWVNb2RlbChuZXdUcmVlTW9kZWwpO1xyXG4gICAgICBjb25zdCBuZXdDb2RlID0gSlNPTi5zdHJpbmdpZnkocmV2ZXJ0ZWRNb2RlbCwgbnVsbCwgMik7XHJcbiAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZShcIkNvZGVcIiwgbmV3Q29kZSwgdGhpcy5kZWJ1Zyk7XHJcbiAgICAgIHRoaXMudXBkYXRlTW9kZWwoKTtcclxuICAgICAgLy8gdGhpcy5tYWluU2VydmljZS51cGRhdGVNb2RlbChudWxsLCB0aGlzLmRlYnVnKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB1cGRhdGVUcmVlTm9kZShuZXdOb2RlOiBhbnksIHRyZWVNb2RlbDogYW55LCBpbmRleDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmVlSW5kZXggPSBpbmRleC5zcGxpdChcIl9cIik7XHJcbiAgICBpZiAodHJlZUluZGV4Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0cmVlSW5kZXguc2xpY2UoMSkuam9pbihcIl9cIik7XHJcbiAgICAgIHRoaXMudXBkYXRlVHJlZU5vZGUobmV3Tm9kZSwgdHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlLCBuZXdJbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlKSB7XHJcbiAgICAgICAgbmV3Tm9kZS5WYWx1ZSA9IHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZTtcclxuICAgICAgfVxyXG4gICAgICB0cmVlTW9kZWxbK3RyZWVJbmRleFswXV0gPSBuZXdOb2RlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG5cclxuICBwcml2YXRlIGluc2VydFRyZWVOb2RlKG5ld05vZGU6IGFueSwgdHJlZU1vZGVsOiBhbnksIGluZGV4OiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IHRyZWVJbmRleCA9IGluZGV4LnNwbGl0KFwiX1wiKTtcclxuICAgIGlmICh0cmVlSW5kZXgubGVuZ3RoID4gMSkge1xyXG4gICAgICBjb25zdCBuZXdJbmRleCA9IHRyZWVJbmRleC5zbGljZSgxKS5qb2luKFwiX1wiKTtcclxuICAgICAgdGhpcy5pbnNlcnRUcmVlTm9kZShuZXdOb2RlLCB0cmVlTW9kZWxbK3RyZWVJbmRleFswXV0uVmFsdWUsIG5ld0luZGV4KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmICh0cmVlSW5kZXhbMF0pIHtcclxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlKSkge1xyXG4gICAgICAgICAgdHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlID0gW107XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZS5wdXNoKG5ld05vZGUpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRyZWVNb2RlbC5wdXNoKG5ld05vZGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJlbW92ZVRyZWVOb2RlKHRyZWVNb2RlbDogYW55LCBpbmRleDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmVlSW5kZXggPSBpbmRleC5zcGxpdChcIl9cIik7XHJcbiAgICBpZiAodHJlZUluZGV4Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0cmVlSW5kZXguc2xpY2UoMSkuam9pbihcIl9cIik7XHJcbiAgICAgIHRoaXMucmVtb3ZlVHJlZU5vZGUodHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlLCBuZXdJbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0cmVlTW9kZWwuc3BsaWNlKCt0cmVlSW5kZXhbMF0sIDEpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvblRyZWVOb2RlQ2hhbmdlKGVsOiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIGNvbnNvbGUubG9nKFwib25UcmVlTm9kZUNoYW5nZTogXCIsIGVsKTtcclxuICAgIGNvbnN0IGNvZGVEYXRhID0gSlNPTi5zdHJpbmdpZnkoZWwuZGF0YSk7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoXCJDb2RlXCIsIGNvZGVEYXRhLCB0aGlzLmRlYnVnKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYWRkTm9kZSgpIHtcclxuICAgIGNvbnN0IGVsOiBaQ29tcG9uZW50T3V0cHV0RXZlbnQgPSB7XHJcbiAgICAgIGRhdGE6IHt9LFxyXG4gICAgICByb3dEYXRhOiB7fSxcclxuICAgICAgZXZlbnQ6IFwiXCIsXHJcbiAgICAgIHRhcmdldDogXCJcIixcclxuICAgICAgdHlwZTogXCJcIixcclxuICAgICAgY29sdW1uRmllbGRzJDogbnVsbFxyXG4gICAgfTtcclxuICAgIHRoaXMub25BZGROb2RlKGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYXN5bmMgb25BZGROb2RlKGVsOiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIGNvbnNvbGUubG9nKCdvbkFkZE5vZGUgaXMgY2FsbGVkJywgZWwpO1xyXG4gICAgY29uc3QgbW9kYWxGaWVsZHMgPSB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICBcIm12RWRpdEZpZWxkTm9kZUZvcm1cIixcclxuICAgICAgXCJGb3JtRmllbGRcIixcclxuICAgICAgbnVsbCxcclxuICAgICAgbnVsbFxyXG4gICAgKTtcclxuICAgIC8vIGNvbnN0IGRhdGFJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgZWwuZGF0YSk7XHJcbiAgICAvLyBkYXRhSXRlbS5WYWx1ZSA9IGRhdGFJdGVtLl9EYXRhVmFsdWU7XHJcbiAgICAvLyBkZWxldGUgZGF0YUl0ZW0uX0RhdGFWYWx1ZTtcclxuICAgIGNvbnN0IGluaXRpYWxNb2RlbCA9IHtcclxuICAgICAgTmFtZTogJ05hbWUnLCBEaXNwbGF5TmFtZTogJ05hbWUnLCBWYWx1ZTogJ05hbWUnLCBUeXBlOiAndGV4dCcsXHJcbiAgICAgIGdyaWRDb2xWaXNpYmxlOiB0cnVlLFxyXG4gICAgICB3aWR0aDogMTUwLFxyXG4gICAgICBtaW5XaWR0aDogMTAwLFxyXG4gICAgICBlbmFibGVGaWx0ZXJpbmc6IHRydWUsXHJcbiAgICAgIGVuYWJsZVNvcnRpbmc6IHRydWUsXHJcbiAgICAgIHBpbm5lZExlZnQ6IGZhbHNlLFxyXG4gICAgICBQbGFjZUhvbGRlcjogXCJOYW1lXCIsXHJcbiAgICAgIElzUmVxdWlyZWQ6IGZhbHNlLFxyXG4gICAgICBNaW5MZW5ndGg6IDIsXHJcbiAgICAgIE1heExlbmd0aDogNTAsXHJcbiAgICAgIExhYmVsOiBcIk5hbWU6XCIsXHJcbiAgICAgIERpdkNsYXNzOiBcImNvbC14cy0xMiBjb2wtc20tNiBjb2wtbWQtNiBjb2wtbGctM1wiLFxyXG4gICAgICBSZWFkT25seTogZmFsc2UsXHJcbiAgICAgIFNob3dMYWJlbDogdHJ1ZSxcclxuICAgICAgVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgLy9FbmFibGVIaWRpbmc6IHRydWUsXHJcbiAgICAgIC8vY2VsbEZpbHRlcjogXCJcIixcclxuICAgICAgLy9maWx0ZXJDZWxsRmlsdGVyZWQ6IGZhbHNlLFxyXG4gICAgICAvL2VuYWJsZVBpbm5pbmc6IHRydWUsXHJcbiAgICAgIC8vcGlubmVkUmlnaHQ6IGZhbHNlLFxyXG4gICAgICAvL1VwZGF0ZU9uQmx1cjogdHJ1ZSxcclxuICAgICAgLy9BcHBlbmREaXZDbGVhckZpeDogZmFsc2UsXHJcbiAgICB9O1xyXG4gICAgY29uc3Qgem1vZGVsID0ge1xyXG4gICAgICBub2RlTW9kZWw6IEpTT04uc3RyaW5naWZ5KGluaXRpYWxNb2RlbCwgbnVsbCwgMilcclxuICAgIH07XHJcblxyXG4gICAgLy8gY29uc3QgbW9kYWw6IEhUTUxJb25Nb2RhbEVsZW1lbnQgPSBhd2FpdCB0aGlzLm1haW5TZXJ2aWNlLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhtb2RhbEZpZWxkcywgdGhpcy5kZWJ1ZywgJ0FkZCBGaWVsZCBFbGVtZW50IEl0ZW0nLCB6bW9kZWwpO1xyXG5cclxuICAgIG1vZGFsLnN1YnNjcmliZSgobW9kYWxEYXRhOiBNb2RhbFJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIGlmIChtb2RhbERhdGEucmVzcG9uc2VUeXBlID09PSBcImNhbmNlbFwiKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IG5ld0RhdGEgPSBKU09OLnBhcnNlKG1vZGFsRGF0YS5kYXRhLm5vZGVNb2RlbCk7XHJcbiAgICAgIGlmIChuZXdEYXRhLlZhbHVlKSB7XHJcbiAgICAgICAgbmV3RGF0YS5fRGF0YVZhbHVlID0gbmV3RGF0YS5WYWx1ZTtcclxuICAgICAgICBuZXdEYXRhLlZhbHVlID0gbnVsbDtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmluc2VydFRyZWVOb2RlKG5ld0RhdGEsIHRoaXMuZGVidWdbXCJ0cmVlTW9kZWxcIl0sIGVsLmV2ZW50KTtcclxuICAgICAgY29uc3QgbmV3VHJlZU1vZGVsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnWyd0cmVlTW9kZWwnXSkpO1xyXG4gICAgICBjb25zdCByZXZlcnRlZE1vZGVsID0gWkNvbXBvbmVudEhlbHBlci5yZXZlcnRUcmVlTW9kZWwobmV3VHJlZU1vZGVsKTtcclxuICAgICAgY29uc3QgbmV3Q29kZSA9IEpTT04uc3RyaW5naWZ5KHJldmVydGVkTW9kZWwsIG51bGwsIDIpO1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoXCJDb2RlXCIsIG5ld0NvZGUsIHRoaXMuZGVidWcpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1vZGVsKCk7XHJcbiAgICAgIC8vIHRoaXMubWFpblNlcnZpY2UudXBkYXRlTW9kZWwobnVsbCwgdGhpcy5kZWJ1Zyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25SZW1vdmVOb2RlKGVsOiBaQ29tcG9uZW50T3V0cHV0RXZlbnQpIHtcclxuICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnNob3coJ1JlbW92ZSBOb2RlJywgJ0FyZSB5b3Ugc3VyZT8nLFxyXG4gICAgICBbXHJcbiAgICAgICAgeyB0ZXh0OiBcIk5vXCIsIGNzc0NsYXNzOiBcInNlY29uZGFyeVwiIH0gYXMgQWxlcnRCdXR0b24sXHJcbiAgICAgICAgeyB0ZXh0OiBcIlllc1wiLCBjc3NDbGFzczogXCJwcmltYXJ5XCIgfSBhcyBBbGVydEJ1dHRvblxyXG4gICAgICBdKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlcGx5ID0+IHtcclxuICAgICAgICBpZiAocmVwbHkgPT09ICdZZXMnKSB7XHJcbiAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZlIE5vZGUnLCBlbCk7XHJcbiAgICAgICAgICB0aGlzLnJlbW92ZVRyZWVOb2RlKHRoaXMuZGVidWdbXCJ0cmVlTW9kZWxcIl0sIGVsLmV2ZW50KTtcclxuICAgICAgICAgIGNvbnN0IG5ld1RyZWVNb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Z1sndHJlZU1vZGVsJ10pKTtcclxuICAgICAgICAgIGNvbnN0IHJldmVydGVkTW9kZWwgPSBaQ29tcG9uZW50SGVscGVyLnJldmVydFRyZWVNb2RlbChuZXdUcmVlTW9kZWwpO1xyXG4gICAgICAgICAgY29uc3QgbmV3Q29kZSA9IEpTT04uc3RyaW5naWZ5KHJldmVydGVkTW9kZWwsIG51bGwsIDIpO1xyXG4gICAgICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKFwiQ29kZVwiLCBuZXdDb2RlLCB0aGlzLmRlYnVnKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnb3RvRmllbGRFbGVtZW50KCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWydhZG1pbi9maWVsZCddKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlTW9kZWwoKSB7XHJcbiAgICBjb25zdCBkZWJ1ZyA9IHRoaXMuZGVidWc7XHJcbiAgICBjb25zdCBmZyA9IHRoaXMuZGVidWcuZm9ybSBhcyBGb3JtR3JvdXA7XHJcbiAgICBpZiAoIWZnLmRpcnR5KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkRlYnVnIEZvcm0gaXMgbm90IGRpcnR5IGhlbmNlIHJlY29yZCBpcyBub3Qgc2F2ZS5cIik7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWZnLnZhbGlkKSB7XHJcbiAgICAgIGNvbnN0IGVycm9ycyA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Rm9ybUdyb3VwRXJyb3JzKGZnLCB0aGlzLmFsZXJ0U2VydmljZSk7XHJcbiAgICAgIGNvbnNvbGUud2FybihcIkRlYnVnIEZvcm0gVmFsaWRhdGlvbiBnb3QgZXJyb3Iocyk6XCIsIGVycm9ycyk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuXHJcbiAgICBvZihkZWJ1Zy56TW9kZWwpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIC8vIHN3aXRjaE1hcCh6bW9kZWwgPT4ge1xyXG4gICAgICAgIC8vICAgY29uc29sZS5sb2coXCJCZWZvcmUgdXBkYXRlLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgLy8gICByZXR1cm4gdGhpcy5iZWZvcmVVcGRhdGVNb2RlbChncm91cCk7XHJcbiAgICAgICAgLy8gfSksXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGVidWcuek1vZGVsLCBmZy52YWx1ZSk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCgpID0+IHtcclxuICAgICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFB1dCQoXHJcbiAgICAgICAgICAgIGRlYnVnLnJlc291cmNlVVJMICsgXCIvXCIgKyBkZWJ1Zy56TW9kZWwuSWQsXHJcbiAgICAgICAgICAgIGRlYnVnLnpNb2RlbFxyXG4gICAgICAgICAgKVxyXG4gICAgICAgICAgICAucGlwZShcclxuICAgICAgICAgICAgICBtYXAocmVzID0+IHRoaXMuaGFuZGxlU3VjY2VzcyhyZXMsIFwiUmVjb3JkIGlzIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LlwiKSksXHJcbiAgICAgICAgICAgICk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgc3dpdGNoTWFwKCh6bW9kZWw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coXCJBZnRlciBEZWJ1ZyBGb3JtIHVwZGF0ZWQsIHpNb2RlbDpcIiwgem1vZGVsKTtcclxuICAgICAgICAgIGlmICh6bW9kZWwgJiYgem1vZGVsLkRhdGEpIHtcclxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihkZWJ1Zy56TW9kZWwsIHptb2RlbC5EYXRhKTtcclxuICAgICAgICAgICAgZmcucGF0Y2hWYWx1ZSh6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBmZy5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgICAgLy8gICB0aGlzLmFmdGVyVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgICAgcmV0dXJuIG9mKFtdKTtcclxuICAgICAgICB9KSlcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vICoqKioqKioqKioqKioqKioqKioqIFdvcmtmbG93IEJ1dHRvbiAqKioqKioqKioqKioqKioqKioqKlxyXG4gIHB1YmxpYyBsb2FkV29ya2Zsb3dEYXRhKCkge1xyXG4gICAgY29uc3QgemdyaWRfV29ya2Zsb3dCdXR0b25HcmlkID0gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnQodGhpcy5kZWJ1ZywgJ3pncmlkX1dvcmtmbG93QnV0dG9uR3JpZCcpO1xyXG4gICAgaWYgKHpncmlkX1dvcmtmbG93QnV0dG9uR3JpZCkge1xyXG4gICAgICB6Z3JpZF9Xb3JrZmxvd0J1dHRvbkdyaWQuc2V0RGF0YSh0aGlzLmRlYnVnLnpEYXRhLmNvbGxlY3RlZFdvcmtmbG93QnV0dG9ucyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdyaWRXb3JrZmxvd0J1dHRvbk9uSXRlbUNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGRhdGFJdGVtID0gT2JqZWN0LmFzc2lnbih7fSwgZXZlbnQuZGF0YUl0ZW0pO1xyXG4gICAgY29uc3QgZmllbGQgPSBkYXRhSXRlbS5yZWZGaWVsZDtcclxuICAgIGNvbnN0IGF0dHJpYnV0ZSA9IGRhdGFJdGVtLnJlZkF0dHJpYnV0ZTtcclxuXHJcbiAgICAvLyBHZXQgTWFwcGVkIEluZm9cclxuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKClcclxuICAgICAgLnNldChcIkJ1dHRvbklkXCIsIGZpZWxkLklkKTtcclxuICAgIHRoaXMud2ViQXBpU2VydmljZS5odHRwUG9zdCQodGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKFwiZTF3ZnNfd2ZjX2dldG1hcHBlZEJ1dHRvbkluZm9VUkxcIiksIHBhcmFtcykucGlwZShcclxuICAgICAgbWFwKGFzeW5jIHJlcyA9PiB7XHJcbiAgICAgICAgbGV0IHJvbGVJbmZvID0gW107XHJcbiAgICAgICAgbGV0IHN0YXR1c0luZm8gPSBbXTtcclxuICAgICAgICBsZXQgcGFyZW50U3RhdHVzSW5mbyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAocmVzLk1hcHBlZFJvbGVMaXN0KSB7XHJcbiAgICAgICAgICByb2xlSW5mbyA9IHJlcy5NYXBwZWRSb2xlTGlzdDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXMuTWFwcGVkU3RhdHVzTGlzdCkge1xyXG4gICAgICAgICAgcmVzLk1hcHBlZFN0YXR1c0xpc3QuZm9yRWFjaCgoX3N0YXR1czogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHN0YXR1c0luZm8ucHVzaChfc3RhdHVzLk5hbWUgKyAnICgnICsgX3N0YXR1cy5Db2RlICsgJyknKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHJlcy5NYXBwZWRQYXJlbnRTdGF0dXNMaXN0KSB7XHJcbiAgICAgICAgICByZXMuTWFwcGVkUGFyZW50U3RhdHVzTGlzdC5mb3JFYWNoKChfcGFyZW50U3RhdHVzOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgcGFyZW50U3RhdHVzSW5mby5wdXNoKF9wYXJlbnRTdGF0dXMuTmFtZSArICcgKCcgKyBfcGFyZW50U3RhdHVzLkNvZGUgKyAnKScpO1xyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBfbWFwcGVkSW5mbyA9IHtcclxuICAgICAgICAgICdtYXBwZWRSb2xlSW5mbyc6IHJvbGVJbmZvLmxlbmd0aCA+IDAgPyByb2xlSW5mbyA6ICdOLkEuJyxcclxuICAgICAgICAgICdtYXBwZWRTdGF0dXNJbmZvJzogc3RhdHVzSW5mby5sZW5ndGggPiAwID8gc3RhdHVzSW5mbyA6ICdOLkEuJyxcclxuICAgICAgICAgICdtYXBwZWRQYXJlbnRTdGF0dXNJbmZvJzogcGFyZW50U3RhdHVzSW5mby5sZW5ndGggPiAwID8gcGFyZW50U3RhdHVzSW5mbyA6ICdOLkEuJ1xyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIC8vIHJldHJlaXZlIGFsbCBpbXBvcnRhbnQgaW5mb1xyXG4gICAgICAgIGNvbnN0IF9idXR0b25JbmZvID0ge1xyXG4gICAgICAgICAgJ1dvcmtmbG93SWQnOiBmaWVsZC5Xb3JrZmxvd0lkLFxyXG4gICAgICAgICAgJ0J1dHRvbklkJzogZmllbGQuSWQsXHJcbiAgICAgICAgICAnQnV0dG9uTmFtZSc6IGZpZWxkLk5hbWUsXHJcbiAgICAgICAgICAnQnV0dG9uQ29kZSc6IGZpZWxkLkNvZGUsXHJcbiAgICAgICAgICAnQnV0dG9uVHlwZUlkJzogZmllbGQuVHlwZS5JZCxcclxuICAgICAgICAgICdCdXR0b25UeXBlTmFtZSc6IGZpZWxkLlR5cGUuTmFtZSxcclxuICAgICAgICAgICdCdXR0b25UeXBlQ29kZSc6IGZpZWxkLlR5cGUuQ29kZSxcclxuICAgICAgICAgICdCdXR0b25WaXNpYmxlJzogYXR0cmlidXRlLlZpc2libGUsXHJcbiAgICAgICAgICAnQnV0dG9uQ2xpY2tFdmVudCc6IGF0dHJpYnV0ZS5DbGlja0V2ZW50LFxyXG4gICAgICAgICAgJ0J1dHRvblVSTCc6IGF0dHJpYnV0ZS5VUkwsXHJcbiAgICAgICAgICAnQnV0dG9uSWNvbic6IGF0dHJpYnV0ZS5JY29uXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgbGV0IF9nb3RvU3RhdHVzSW5mbyA9IHtcclxuICAgICAgICAgICdHb3RvU3RhdHVzSWQnOiAnTi5BLicsXHJcbiAgICAgICAgICAnR290b1N0YXR1c05hbWUnOiAnTi5BLicsXHJcbiAgICAgICAgICAnR290b1N0YXR1c0NvZGUnOiAnTi5BLidcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICBpZiAoZmllbGQuU3RhdHVzKSB7XHJcbiAgICAgICAgICBjb25zdCBfZ290b1N0YXR1cyA9IGZpZWxkLlN0YXR1c1xyXG4gICAgICAgICAgX2dvdG9TdGF0dXNJbmZvID0ge1xyXG4gICAgICAgICAgICAnR290b1N0YXR1c0lkJzogX2dvdG9TdGF0dXMuSWQsXHJcbiAgICAgICAgICAgICdHb3RvU3RhdHVzTmFtZSc6IF9nb3RvU3RhdHVzLk5hbWUsXHJcbiAgICAgICAgICAgICdHb3RvU3RhdHVzQ29kZSc6IF9nb3RvU3RhdHVzLkNvZGVcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByb3BlcnRpZXNNb2RlbCA9IE9iamVjdC5hc3NpZ24oX2J1dHRvbkluZm8sIF9nb3RvU3RhdHVzSW5mbywgX21hcHBlZEluZm8pO1xyXG5cclxuICAgICAgICBjb25zdCBtb2RhbEZpZWxkcyA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgICAgICBcIm12V29ya2Zsb3dCdXR0b25EZWJ1Z0Zvcm1cIixcclxuICAgICAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgbnVsbFxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3QgbW9kYWwgPSBhd2FpdCB0aGlzLm1vZGFsU2VydmljZS5zaG93KG1vZGFsRmllbGRzLCB0aGlzLmRlYnVnLl9ncm91cCwgJ1dvcmtmbG93IEJ1dHRvbiBJbmZvJywgcHJvcGVydGllc01vZGVsKTtcclxuICAgICAgICBtb2RhbC5zdWJzY3JpYmUoKG1vZGFsRGF0YTogTW9kYWxSZXNwb25zZSkgPT4ge1xyXG4gICAgICAgICAgaWYgKG1vZGFsRGF0YS5yZXNwb25zZVR5cGUgPT09IFwiY2FuY2VsXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgKS5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG5cclxuICBoYW5kbGVTdWNjZXNzKHJlczogUmVzcG9uc2UgfCBhbnksIHN1Y2Nlc3NNc2c6IHN0cmluZyk6IFJlc3BvbnNlIHtcclxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHN1Y2Nlc3NNc2cpO1xyXG4gICAgfSBlbHNlIGlmIChyZXMuRGF0YSAhPT0gdW5kZWZpbmVkICYmIHJlcy5Qcm9jZXNzaW5nU3RhdHVzICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgaWYgKHJlcy5Qcm9jZXNzaW5nU3RhdHVzID09PSB0cnVlKSB7XHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmVzLkRhdGEpKSB7XHJcbiAgICAgICAgICByZXMuRGF0YS5tYXAocyA9PiB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2VzcyxcclxuICAgICAgICAgICAgYCR7c3VjY2Vzc01zZ30gOiAke3MuQ29zdENvZGV9YCwgbnVsbCkpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLndlYkFwaVNlcnZpY2Uuc2hvd0h0dHBSZXNwb25zZU1lc3NhZ2UoTUVTU0FHRVRZUEUuU3VjY2Vzcywgc3VjY2Vzc01zZywgbnVsbCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnRvYXN0U2VydmljZS5zaG93KHN1Y2Nlc3NNc2cpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlcztcclxuICB9XHJcblxyXG4gIGhhbmRsZUVycm9yKHJlczogYW55KTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaGFuZGxlRXJyb3IocmVzKTtcclxuICB9XHJcbn1cclxuIl19
|