mmhglobal-dynamicform 1.2.3 → 1.3.2

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.
Files changed (198) hide show
  1. package/README.md +14 -2
  2. package/esm2020/lib/directives/fieldelement.directive.mjs +16 -0
  3. package/esm2020/lib/directives/scrollbar.theme.directive.mjs +43 -0
  4. package/esm2020/lib/mmhglobal-dynamicform.module.mjs +464 -0
  5. package/esm2020/lib/services/main.service.mjs +752 -0
  6. package/esm2020/lib/services/zcomponent.debug.service.mjs +621 -0
  7. package/esm2020/lib/services/zcomponent.service.mjs +81 -0
  8. package/esm2020/lib/uiactionbutton/uiactionbutton.component.mjs +265 -0
  9. package/esm2020/lib/uiappmenucontent/uiappmenucontent.component.mjs +67 -0
  10. package/esm2020/lib/uicontent/uicontent.component.mjs +41 -0
  11. package/esm2020/lib/uiheader/uiheader.component.mjs +66 -0
  12. package/esm2020/lib/uimenubutton/uimenubutton.component.mjs +35 -0
  13. package/esm2020/lib/uimenucontent/uimenucontent.component.mjs +37 -0
  14. package/{esm2015/lib/uipage/uipage.component.js → esm2020/lib/uipage/uipage.component.mjs} +12 -13
  15. package/esm2020/lib/uivalidationmessage/uivalidationmessage.component.mjs +41 -0
  16. package/esm2020/lib/zbullet/zbullet.component.mjs +74 -0
  17. package/esm2020/lib/zbuttons/zbuttons.component.mjs +171 -0
  18. package/esm2020/lib/zcard/zcard.component.mjs +72 -0
  19. package/esm2020/lib/zchart/zchart.component.mjs +201 -0
  20. package/esm2020/lib/zcheckbox/zcheckbox.component.mjs +166 -0
  21. package/esm2020/lib/zchip/zchip.component.mjs +121 -0
  22. package/esm2020/lib/zcodeeditor/zcodeeditor.component.mjs +169 -0
  23. package/esm2020/lib/zcodeeditor/zcodeeditor.pipe.mjs +60 -0
  24. package/esm2020/lib/zdaterange/zdaterange.component.mjs +70 -0
  25. package/esm2020/lib/zdatetime/dateParser.pipe.mjs +30 -0
  26. package/esm2020/lib/zdatetime/zdatetime.component.mjs +285 -0
  27. package/esm2020/lib/zdiv/zdiv.component.mjs +50 -0
  28. package/esm2020/lib/zdiv/zdiv.pipe.mjs +31 -0
  29. package/esm2020/lib/zform/zform.component.mjs +147 -0
  30. package/esm2020/lib/zformcontrol/zformcontrol.component.mjs +49 -0
  31. package/esm2020/lib/zgauge/zgauge.component.mjs +148 -0
  32. package/esm2020/lib/zgrid/date-range-cell-filter.component.mjs +135 -0
  33. package/esm2020/lib/zgrid/zgrid.binding.directive.mjs +490 -0
  34. package/esm2020/lib/zgrid/zgrid.component.mjs +847 -0
  35. package/esm2020/lib/zgrid/zgrid.popup.anchor-target.directive.mjs +17 -0
  36. package/esm2020/lib/zimg/zimg.component.mjs +121 -0
  37. package/esm2020/lib/zkcard/zkcard.component.mjs +367 -0
  38. package/esm2020/lib/zlabel/zlabel.component.mjs +62 -0
  39. package/esm2020/lib/zmfb/zmfb.component.mjs +215 -0
  40. package/esm2020/lib/zmodal/zmodal-mobile.component.mjs +120 -0
  41. package/esm2020/lib/zmodal/zmodal.component.mjs +125 -0
  42. package/esm2020/lib/znumeric/znumeric.component.mjs +119 -0
  43. package/esm2020/lib/zpostselectinput/zpostselectinput.component.mjs +352 -0
  44. package/esm2020/lib/zquerybuilder/zquerybuilder.component.mjs +204 -0
  45. package/esm2020/lib/zreport/zreport.component.mjs +105 -0
  46. package/esm2020/lib/zreport/zreport.config.mjs +117 -0
  47. package/esm2020/lib/zscheduler/zscheduler.component.mjs +267 -0
  48. package/{esm2015/lib/zscheduler/zscheduler.toolbar.component.js → esm2020/lib/zscheduler/zscheduler.toolbar.component.mjs} +55 -19
  49. package/esm2020/lib/zselectmultiple/zselectmultiple.component.mjs +577 -0
  50. package/esm2020/lib/zselectmultiple/zselectmultiple.directive.mjs +35 -0
  51. package/esm2020/lib/ztab/ztab.component.mjs +187 -0
  52. package/esm2020/lib/ztab/ztab.pipe.mjs +26 -0
  53. package/esm2020/lib/ztext/ztext.component.mjs +297 -0
  54. package/esm2020/lib/ztextarea/ztextarea.component.mjs +109 -0
  55. package/esm2020/lib/ztexteditor/ztexteditor.component.mjs +57 -0
  56. package/esm2020/lib/ztree/ztree.component.mjs +380 -0
  57. package/esm2020/lib/ztreelist/ztreelist.component.mjs +544 -0
  58. package/esm2020/lib/ztrendcard/ztrendcard.component.mjs +92 -0
  59. package/esm2020/lib/zudf/zudf.component.mjs +205 -0
  60. package/esm2020/lib/zunknown/zunknown.component.mjs +20 -0
  61. package/esm2020/lib/zupload/zupload.component.mjs +359 -0
  62. package/esm2020/lib/zworkflowbuttons/zworkflowbuttons.component.mjs +216 -0
  63. package/esm2020/mmhglobal-dynamicform.mjs +5 -0
  64. package/{esm2015/public-api.js → esm2020/public-api.mjs} +0 -0
  65. package/fesm2015/mmhglobal-dynamicform.mjs +10790 -0
  66. package/fesm2015/mmhglobal-dynamicform.mjs.map +1 -0
  67. package/fesm2020/mmhglobal-dynamicform.mjs +10779 -0
  68. package/fesm2020/mmhglobal-dynamicform.mjs.map +1 -0
  69. package/lib/directives/fieldelement.directive.d.ts +3 -0
  70. package/lib/directives/scrollbar.theme.directive.d.ts +3 -0
  71. package/lib/mmhglobal-dynamicform.module.d.ts +92 -0
  72. package/lib/services/main.service.d.ts +3 -0
  73. package/lib/services/zcomponent.debug.service.d.ts +8 -5
  74. package/lib/services/zcomponent.service.d.ts +7 -2
  75. package/lib/uiactionbutton/uiactionbutton.component.d.ts +3 -0
  76. package/lib/uiappmenucontent/uiappmenucontent.component.d.ts +3 -0
  77. package/lib/uicontent/uicontent.component.d.ts +3 -0
  78. package/lib/uiheader/uiheader.component.d.ts +3 -0
  79. package/lib/uimenubutton/uimenubutton.component.d.ts +3 -0
  80. package/lib/uimenucontent/uimenucontent.component.d.ts +3 -0
  81. package/lib/uipage/uipage.component.d.ts +3 -0
  82. package/lib/uivalidationmessage/uivalidationmessage.component.d.ts +3 -0
  83. package/lib/zbullet/zbullet.component.d.ts +3 -0
  84. package/lib/zbuttons/zbuttons.component.d.ts +3 -0
  85. package/lib/zcard/zcard.component.d.ts +3 -0
  86. package/lib/zchart/zchart.component.d.ts +3 -0
  87. package/lib/zcheckbox/zcheckbox.component.d.ts +3 -0
  88. package/lib/zchip/zchip.component.d.ts +3 -0
  89. package/lib/zcodeeditor/zcodeeditor.component.d.ts +3 -0
  90. package/lib/zcodeeditor/zcodeeditor.pipe.d.ts +3 -0
  91. package/lib/zdaterange/zdaterange.component.d.ts +3 -0
  92. package/lib/zdatetime/dateParser.pipe.d.ts +3 -0
  93. package/lib/zdatetime/zdatetime.component.d.ts +3 -0
  94. package/lib/zdiv/zdiv.component.d.ts +3 -0
  95. package/lib/zdiv/zdiv.pipe.d.ts +3 -0
  96. package/lib/zform/zform.component.d.ts +3 -0
  97. package/lib/zformcontrol/zformcontrol.component.d.ts +3 -0
  98. package/lib/zgauge/zgauge.component.d.ts +3 -0
  99. package/lib/zgrid/date-range-cell-filter.component.d.ts +3 -0
  100. package/lib/zgrid/zgrid.binding.directive.d.ts +3 -0
  101. package/lib/zgrid/zgrid.component.d.ts +4 -1
  102. package/lib/zgrid/zgrid.popup.anchor-target.directive.d.ts +3 -0
  103. package/lib/zimg/zimg.component.d.ts +3 -0
  104. package/lib/zkcard/zkcard.component.d.ts +3 -0
  105. package/lib/zlabel/zlabel.component.d.ts +3 -0
  106. package/lib/zmfb/zmfb.component.d.ts +3 -0
  107. package/lib/zmodal/zmodal-mobile.component.d.ts +3 -0
  108. package/lib/zmodal/zmodal.component.d.ts +3 -0
  109. package/lib/znumeric/znumeric.component.d.ts +3 -0
  110. package/lib/zpostselectinput/zpostselectinput.component.d.ts +3 -0
  111. package/lib/zquerybuilder/zquerybuilder.component.d.ts +3 -0
  112. package/lib/zreport/zreport.component.d.ts +3 -0
  113. package/lib/zreport/zreport.config.d.ts +3 -0
  114. package/lib/zscheduler/zscheduler.component.d.ts +3 -0
  115. package/lib/zscheduler/zscheduler.toolbar.component.d.ts +3 -0
  116. package/lib/zselectmultiple/zselectmultiple.component.d.ts +3 -0
  117. package/lib/zselectmultiple/zselectmultiple.directive.d.ts +3 -0
  118. package/lib/ztab/ztab.component.d.ts +3 -0
  119. package/lib/ztab/ztab.pipe.d.ts +3 -0
  120. package/lib/ztext/ztext.component.d.ts +3 -0
  121. package/lib/ztextarea/ztextarea.component.d.ts +3 -0
  122. package/lib/ztexteditor/ztexteditor.component.d.ts +3 -0
  123. package/lib/ztree/ztree.component.d.ts +3 -0
  124. package/lib/ztreelist/ztreelist.component.d.ts +3 -0
  125. package/lib/ztrendcard/ztrendcard.component.d.ts +3 -0
  126. package/lib/zudf/zudf.component.d.ts +3 -0
  127. package/lib/zunknown/zunknown.component.d.ts +3 -0
  128. package/lib/zupload/zupload.component.d.ts +3 -0
  129. package/lib/zworkflowbuttons/zworkflowbuttons.component.d.ts +3 -0
  130. package/mmhglobal-dynamicform.d.ts +1 -2
  131. package/package.json +20 -11
  132. package/bundles/mmhglobal-dynamicform.umd.js +0 -11360
  133. package/bundles/mmhglobal-dynamicform.umd.js.map +0 -1
  134. package/bundles/mmhglobal-dynamicform.umd.min.js +0 -16
  135. package/bundles/mmhglobal-dynamicform.umd.min.js.map +0 -1
  136. package/esm2015/lib/directives/fieldelement.directive.js +0 -15
  137. package/esm2015/lib/directives/scrollbar.theme.directive.js +0 -42
  138. package/esm2015/lib/mmhglobal-dynamicform.module.js +0 -314
  139. package/esm2015/lib/services/main.service.js +0 -766
  140. package/esm2015/lib/services/zcomponent.debug.service.js +0 -626
  141. package/esm2015/lib/services/zcomponent.service.js +0 -167
  142. package/esm2015/lib/uiactionbutton/uiactionbutton.component.js +0 -271
  143. package/esm2015/lib/uiappmenucontent/uiappmenucontent.component.js +0 -69
  144. package/esm2015/lib/uicontent/uicontent.component.js +0 -41
  145. package/esm2015/lib/uiheader/uiheader.component.js +0 -65
  146. package/esm2015/lib/uimenubutton/uimenubutton.component.js +0 -40
  147. package/esm2015/lib/uimenucontent/uimenucontent.component.js +0 -34
  148. package/esm2015/lib/uivalidationmessage/uivalidationmessage.component.js +0 -39
  149. package/esm2015/lib/zbullet/zbullet.component.js +0 -71
  150. package/esm2015/lib/zbuttons/zbuttons.component.js +0 -168
  151. package/esm2015/lib/zcard/zcard.component.js +0 -68
  152. package/esm2015/lib/zchart/zchart.component.js +0 -199
  153. package/esm2015/lib/zcheckbox/zcheckbox.component.js +0 -158
  154. package/esm2015/lib/zchip/zchip.component.js +0 -117
  155. package/esm2015/lib/zcodeeditor/zcodeeditor.component.js +0 -163
  156. package/esm2015/lib/zcodeeditor/zcodeeditor.pipe.js +0 -56
  157. package/esm2015/lib/zdaterange/zdaterange.component.js +0 -63
  158. package/esm2015/lib/zdatetime/dateParser.pipe.js +0 -26
  159. package/esm2015/lib/zdatetime/zdatetime.component.js +0 -279
  160. package/esm2015/lib/zdiv/zdiv.component.js +0 -48
  161. package/esm2015/lib/zdiv/zdiv.pipe.js +0 -27
  162. package/esm2015/lib/zform/zform.component.js +0 -148
  163. package/esm2015/lib/zformcontrol/zformcontrol.component.js +0 -49
  164. package/esm2015/lib/zgauge/zgauge.component.js +0 -146
  165. package/esm2015/lib/zgrid/date-range-cell-filter.component.js +0 -102
  166. package/esm2015/lib/zgrid/zgrid.binding.directive.js +0 -493
  167. package/esm2015/lib/zgrid/zgrid.component.js +0 -834
  168. package/esm2015/lib/zgrid/zgrid.popup.anchor-target.directive.js +0 -16
  169. package/esm2015/lib/zimg/zimg.component.js +0 -123
  170. package/esm2015/lib/zkcard/zkcard.component.js +0 -372
  171. package/esm2015/lib/zlabel/zlabel.component.js +0 -59
  172. package/esm2015/lib/zmfb/zmfb.component.js +0 -215
  173. package/esm2015/lib/zmodal/zmodal-mobile.component.js +0 -119
  174. package/esm2015/lib/zmodal/zmodal.component.js +0 -130
  175. package/esm2015/lib/znumeric/znumeric.component.js +0 -114
  176. package/esm2015/lib/zpostselectinput/zpostselectinput.component.js +0 -345
  177. package/esm2015/lib/zquerybuilder/zquerybuilder.component.js +0 -196
  178. package/esm2015/lib/zreport/zreport.component.js +0 -104
  179. package/esm2015/lib/zreport/zreport.config.js +0 -115
  180. package/esm2015/lib/zscheduler/zscheduler.component.js +0 -268
  181. package/esm2015/lib/zselectmultiple/zselectmultiple.component.js +0 -565
  182. package/esm2015/lib/zselectmultiple/zselectmultiple.directive.js +0 -28
  183. package/esm2015/lib/ztab/ztab.component.js +0 -180
  184. package/esm2015/lib/ztab/ztab.pipe.js +0 -22
  185. package/esm2015/lib/ztext/ztext.component.js +0 -286
  186. package/esm2015/lib/ztextarea/ztextarea.component.js +0 -104
  187. package/esm2015/lib/ztexteditor/ztexteditor.component.js +0 -52
  188. package/esm2015/lib/ztree/ztree.component.js +0 -374
  189. package/esm2015/lib/ztreelist/ztreelist.component.js +0 -539
  190. package/esm2015/lib/ztrendcard/ztrendcard.component.js +0 -89
  191. package/esm2015/lib/zudf/zudf.component.js +0 -206
  192. package/esm2015/lib/zunknown/zunknown.component.js +0 -20
  193. package/esm2015/lib/zupload/zupload.component.js +0 -358
  194. package/esm2015/lib/zworkflowbuttons/zworkflowbuttons.component.js +0 -215
  195. package/esm2015/mmhglobal-dynamicform.js +0 -7
  196. package/fesm2015/mmhglobal-dynamicform.js +0 -10729
  197. package/fesm2015/mmhglobal-dynamicform.js.map +0 -1
  198. 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, '', null, null, {}, 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, null, null, {}, 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', null, null, 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', null, null, 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', null, null, 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.4", 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.4", ngImport: i0, type: ZComponentDebugService, providedIn: 'root' });
615
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.3.4", 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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QUksR0FBRyxDQUFDLElBQUksS0FBSyxTQUFTLElBQUksR0FBRyxDQUFDLGdCQUFnQixLQUFLLFNBQVMsRUFBRTtZQUN2RSxJQUFJLEdBQUcsQ0FBQyxnQkFBZ0IsS0FBSyxJQUFJLEVBQUU7Z0JBQ2pDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQzNCLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUM5RSxHQUFHLFVBQVUsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDM0M7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztpQkFDbkY7YUFDRjtTQUNGO2FBQU07WUFDTCxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUNwQztRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQztJQUVELFdBQVcsQ0FBQyxHQUFRO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0MsQ0FBQzs7bUhBbHRCVSxzQkFBc0I7dUhBQXRCLHNCQUFzQixjQUZyQixNQUFNOzJGQUVQLHNCQUFzQjtrQkFIbEMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKioqKioqKioqKiBBbmd1bGFyICoqKioqKioqKiovXHJcbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEh0dHBQYXJhbXMgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcblxyXG4vKioqKioqKioqKiBJb25pYyAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBJb25pY1NlbGVjdGFibGVDb21wb25lbnQgfSBmcm9tICdpb25pYy1zZWxlY3RhYmxlJztcclxuXHJcbi8qKioqKioqKioqIFBsdWdpbiAqKioqKioqKioqL1xyXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIG9mLCBmb3JrSm9pbiwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIHN3aXRjaE1hcCwgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuLyoqKioqKioqKiogQ29tcG9uZW50ICYgU2VydmljZSAqKioqKioqKioqL1xyXG5pbXBvcnQge1xyXG4gIEFsZXJ0QnV0dG9uLCBBbGVydFNlcnZpY2UsIEF1dGhTZXJ2aWNlLCBGaWVsZFNlcnZpY2UsIE1FU1NBR0VUWVBFLFxyXG4gIFJlc291cmNlQXBpU2VydmljZSwgVG9hc3RTZXJ2aWNlLCBXZWJBcGlTZXJ2aWNlLCBaQ29tcG9uZW50SGVscGVyLCBaQ29tcG9uZW50T3V0cHV0RXZlbnQsXHJcbiAgWkZpZWxkLCBaR3JvdXAsIFpUcmVlVGVtcGxhdGVQYXJhbXNcclxufSBmcm9tIFwibW1oZ2xvYmFsLXpjb3JlXCI7XHJcbmltcG9ydCB7IE1vZGFsUmVzcG9uc2UsIE1vZGFsU2VydmljZSB9IGZyb20gJ21taGdsb2JhbC16bW9kYWwnO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgWkNvbXBvbmVudERlYnVnU2VydmljZSB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcclxuICAgIHByaXZhdGUgYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBmaWVsZFNlcnZpY2U6IEZpZWxkU2VydmljZSxcclxuICAgIHByaXZhdGUgcmVzb3VyY2VBcGlTZXJ2aWNlOiBSZXNvdXJjZUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHRvYXN0U2VydmljZTogVG9hc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcclxuICAgIHByaXZhdGUgd2ViQXBpU2VydmljZTogV2ViQXBpU2VydmljZVxyXG4gICkgeyB9XHJcblxyXG4gIHByaXZhdGUgc2NvcGU6IGFueTtcclxuXHJcbiAgZ2V0IGRlYnVnKCk6IGFueSB7XHJcbiAgICByZXR1cm4gdGhpcy5zY29wZS5ncm91cC5fZGVidWc7XHJcbiAgfVxyXG5cclxuICBnZXQgZ3JvdXAoKTogWkdyb3VwIHtcclxuICAgIHJldHVybiB0aGlzLnNjb3BlLmdyb3VwO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG9uSW5pdERlYnVnZ2VyKGdyb3VwOiBaR3JvdXApIHtcclxuICAgIGdyb3VwLl9kZWJ1ZyA9IG5ldyBaR3JvdXAodHJ1ZSk7XHJcbiAgICBncm91cC5faXNEZWJ1Z2dpbmcgPSB0cnVlO1xyXG4gICAgZ3JvdXAuX2RlYnVnLnpEYXRhID0ge1xyXG4gICAgICBjb2xsZWN0ZWRBY3Rpdml0aWVzOiBbXSxcclxuICAgICAgYWN0aXZpdHlDb3VudDogMCxcclxuICAgICAgY29sbGVjdGVkV29ya2Zsb3dCdXR0b25zOiBbXSxcclxuICAgICAgd29ya2Zsb3dCdXR0b25Db3VudDogMFxyXG4gICAgfTtcclxuICAgIGdyb3VwLl9kZWJ1Zy56Q29tcG9uZW50cyA9IHt9O1xyXG4gICAgZ3JvdXAuaXNMaXN0Rm9ybSA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBvblN0YXJ0RGVidWdnZXIoZmllbGRFbGVtZW50czogQXJyYXk8WkZpZWxkPiwgbWU6IGFueSkge1xyXG4gICAgdGhpcy5zY29wZSA9IG1lO1xyXG4gICAgaWYgKCFtZS5ncm91cC5fZGVidWcpIHtcclxuICAgICAgbWUuZ3JvdXAuX2RlYnVnID0ge307XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZDogWkdyb3VwID0gbWUuZ3JvdXAuX2RlYnVnO1xyXG4gICAgbWUuZm9ybSA9IG1lLnRvRm9ybUdyb3VwKGZpZWxkRWxlbWVudHMpO1xyXG4gICAgZC5mb3JtID0gbWUuZm9ybTtcclxuICAgIGlmIChtZS5zdWJzY3JpcHRpb24pIHtcclxuICAgICAgbWUuc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgT2JqZWN0LmFzc2lnbihkLCB7XHJcbiAgICAgIC8vIHpEYXRhOiB7IGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLCBhY3Rpdml0eUNvdW50OiAwIH0sXHJcbiAgICAgIHpNb2RlbDoge30sXHJcbiAgICAgIHN1YmplY3Q6IG5ldyBCZWhhdmlvclN1YmplY3Q8WkNvbXBvbmVudE91dHB1dEV2ZW50PihudWxsKSxcclxuICAgICAgaXNFZGl0OiB0cnVlLFxyXG4gICAgICBpc05ldzogZmFsc2UsXHJcbiAgICAgIF9kZWJ1ZzogbWUuZ3JvdXAuX2RlYnVnLFxyXG4gICAgICBfZ3JvdXA6IG1lLmdyb3VwLFxyXG4gICAgICByZXNvdXJjZVVSTDogdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKCdmaWVsZCcpLFxyXG4gICAgICB0cmVlSXRlbVRlbXBsYXRlOiB0aGlzLnRyZWVJdGVtVGVtcGxhdGUsXHJcbiAgICAgIG9uSXRlbUNsaWNrOiB0aGlzLm9uSXRlbUNsaWNrLFxyXG4gICAgICBvblRyZWVOb2RlQ2hhbmdlOiB0aGlzLm9uVHJlZU5vZGVDaGFuZ2UsXHJcbiAgICAgIG9uQWRkTm9kZTogdGhpcy5vbkFkZE5vZGUsXHJcbiAgICAgIG9uUmVtb3ZlTm9kZTogdGhpcy5vblJlbW92ZU5vZGUsXHJcbiAgICAgIHRyZWVOb2Rlc0V4cGFuZEFsbDogdGhpcy50cmVlTm9kZXNFeHBhbmRBbGwsXHJcbiAgICAgIHRyZWVOb2Rlc0NvbGxhcHNlQWxsOiB0aGlzLnRyZWVOb2Rlc0NvbGxhcHNlQWxsLFxyXG4gICAgICByZWZyZXNoVHJlZU1vZGVsOiB0aGlzLnJlZnJlc2hUcmVlTW9kZWwsXHJcbiAgICAgIGFkZE5vZGU6IHRoaXMuYWRkTm9kZSxcclxuICAgICAgcmVmcmVzaEFjdGl2aXR5TG9nRGF0YTogdGhpcy5Mb2FkR3JpZERhdGEuYmluZCh0aGlzKSxcclxuICAgICAgR29Ub0ZpZWxkRWxlbWVudDogdGhpcy5nb3RvRmllbGRFbGVtZW50LmJpbmQodGhpcyksXHJcbiAgICAgIExpc3RXYXRjaE5hbWU6IHRoaXMubGlzdFdhdGNoTmFtZSxcclxuICAgICAgb25DaGFuZ2VXYXRjaE5hbWU6IHRoaXMub25DaGFuZ2VXYXRjaE5hbWUuYmluZCh0aGlzKSxcclxuICAgICAgZ2V0V2F0Y2hOYW1lOiB0aGlzLmdldFdhdGNoTmFtZS5iaW5kKHRoaXMpLFxyXG4gICAgICBmaWVsZEVsZW1lbnRvbkVkaXRvckNvZGVDaGFuZ2U6IHRoaXMuZmllbGRFbGVtZW50b25FZGl0b3JDb2RlQ2hhbmdlLmJpbmQodGhpcyksXHJcbiAgICAgIGdyaWRBY3Rpdml0eUxvZ0NvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICAnZGVidWdBY3Rpdml0eUxvZycsXHJcbiAgICAgICAgXCJGb3JtRmllbGRcIixcclxuICAgICAgICB0aGlzLmdyb3VwLFxyXG4gICAgICAgIFwiZGVidWdBY3Rpdml0eUxvZ0ZpZWxkXCJcclxuICAgICAgKSxcclxuICAgICAgZ3JpZEFjdGl2aXR5TG9nT25JdGVtQ2xpY2s6IHRoaXMuZ3JpZEFjdGl2aXR5TG9nT25JdGVtQ2xpY2suYmluZCh0aGlzKSxcclxuICAgICAgdXBkYXRlTW9kZWw6IHRoaXMudXBkYXRlTW9kZWwuYmluZCh0aGlzKSxcclxuICAgICAgcmVmcmVzaFdvcmtmbG93QnV0dG9uRGF0YTogdGhpcy5sb2FkV29ya2Zsb3dEYXRhLmJpbmQodGhpcyksXHJcbiAgICAgIGdyaWRXb3JrZmxvd0J1dHRvbkNvbHVtbkZpZWxkczogdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgICAnZGVidWdXb3JrZmxvd0J1dHRvbicsXHJcbiAgICAgICAgJ0Zvcm1GaWVsZCcsXHJcbiAgICAgICAgdGhpcy5ncm91cCxcclxuICAgICAgICBcImRlYnVnV29ya2Zsb3dCdXR0b25GaWVsZFwiXHJcbiAgICAgICksXHJcbiAgICAgIGdyaWRXb3JrZmxvd0J1dHRvbk9uSXRlbUNsaWNrOiB0aGlzLmdyaWRXb3JrZmxvd0J1dHRvbk9uSXRlbUNsaWNrLmJpbmQodGhpcylcclxuICAgIH0pO1xyXG4gICAgaWYgKCFkLnpEYXRhKSB7XHJcbiAgICAgIGQuekRhdGEgPSB7IGNvbGxlY3RlZEFjdGl2aXRpZXM6IFtdLCBhY3Rpdml0eUNvdW50OiAwIH07XHJcbiAgICB9XHJcblxyXG4gICAgbWUuc3Vic2NyaXB0aW9uID0gZC5zdWJqZWN0LnN1YnNjcmliZSgoZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkgPT5cclxuICAgICAgdGhpcy5zdWJqZWN0RXZlbnQoZXZlbnQsIGQsIHRoaXMpXHJcbiAgICApO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRGaWVsZHNEaXZDbGFzcyh0aGlzLmdyb3VwLl9wcm9qZWN0TmFtZSwgdGhpcy5ncm91cC5maWVsZE5hbWUsIGZpZWxkRWxlbWVudHMsIHRoaXMuYXV0aFNlcnZpY2UpO1xyXG4gICAgcmV0dXJuIHRoaXMubG9hZERlYnVnWk1vZGVsKG1lKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZERlYnVnWk1vZGVsKG1lOiBhbnkpIHtcclxuICAgIGNvbnN0IGQ6IFpHcm91cCA9IG1lLmdyb3VwLl9kZWJ1ZztcclxuXHJcbiAgICBjb25zdCBkb3dubG9hZExpc3QgPSBbXTtcclxuICAgIGRvd25sb2FkTGlzdC5wdXNoKHRoaXMuZ2V0UHJvamVjdElkKCkpO1xyXG5cclxuICAgIGNvbnN0IGZvcm1UeXBlID0gbWUuZ3JvdXAuaXNMaXN0Rm9ybSA/ICdMaXN0RmllbGQnIDogJ0Zvcm1GaWVsZCc7XHJcbiAgICBjb25zdCBmaWVsZE5hbWUgPSBtZS5ncm91cC5maWVsZE5hbWU7XHJcbiAgICBjb25zdCBmaWVsZHpNb2RlbCA9IHRoaXMuZ2V0RmllbGR6TW9kZWwoZm9ybVR5cGUsIGZpZWxkTmFtZSk7XHJcbiAgICBkb3dubG9hZExpc3QucHVzaChmaWVsZHpNb2RlbCk7XHJcblxyXG4gICAgcmV0dXJuIGZvcmtKb2luKGRvd25sb2FkTGlzdCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdldFByb2plY3RJZCgpIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmRlYnVnO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKCdwcm9qZWN0c1VSTCcpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5nZXRBcGkodXJsLCB7fSwgZC56RGF0YSwgJ1Byb2plY3RPcHRpb25zJywgbnVsbCwgZCwgZmFsc2UpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRGaWVsZHpNb2RlbCh0eXBlOiBzdHJpbmcsIGFjdGl2aXR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICBpZiAodHlwZSA9PT0gJ0Zvcm1GaWVsZCcpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuZ2V0Rm9ybUZpZWxkek1vZGVsKGFjdGl2aXR5TmFtZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gdGhpcy5nZXRMaXN0RmllbGR6TW9kZWwoYWN0aXZpdHlOYW1lKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0Rm9ybUZpZWxkek1vZGVsKGFjdGl2aXR5TmFtZTogc3RyaW5nKSB7XHJcbiAgICBjb25zdCBkOiBaR3JvdXAgPSB0aGlzLmRlYnVnO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKCdmaWVsZCcpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JCh1cmwsIHsgbmFtZTogYWN0aXZpdHlOYW1lLCB0eXBlOiAnRm9ybUZpZWxkJyB9KS5waXBlKFxyXG4gICAgICB0YXAoKHJlc3BEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygncmVzcERhdGE6ICcsIHJlc3BEYXRhKTtcclxuICAgICAgICBPYmplY3QuYXNzaWduKGQuek1vZGVsLCByZXNwRGF0YSk7XHJcbiAgICAgICAgZC5mb3JtLnBhdGNoVmFsdWUoZC56TW9kZWwpO1xyXG4gICAgICAgIGQuZm9ybS5tYXJrQXNQcmlzdGluZSgpO1xyXG4gICAgICAgIGNvbnN0IGZpZWxkcyA9IEpTT04ucGFyc2UoZC56TW9kZWwuQ29kZSk7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkLCB7XHJcbiAgICAgICAgICB0cmVlTW9kZWw6IFpDb21wb25lbnRIZWxwZXIuY29udmVydFRyZWVNb2RlbChmaWVsZHMpXHJcbiAgICAgICAgfSk7XHJcbiAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRMaXN0RmllbGR6TW9kZWwoYWN0aXZpdHlOYW1lOiBzdHJpbmcpIHtcclxuICAgIGNvbnN0IGQgPSB0aGlzLmRlYnVnO1xyXG4gICAgY29uc3QgdXJsID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKCdmaWVsZHNNYXBwaW5nJyk7XHJcbiAgICBjb25zdCB1cmwyID0gdGhpcy5yZXNvdXJjZUFwaVNlcnZpY2UuZ2V0VVJMKCdmaWVsZCcpO1xyXG4gICAgcmV0dXJuIHRoaXMud2ViQXBpU2VydmljZS5odHRwR2V0JCh1cmwsIHsgbmFtZTogYWN0aXZpdHlOYW1lIH0pLnBpcGUoXHJcbiAgICAgIHN3aXRjaE1hcCgoZmllbGRNYXBwaW5nOiBhbnkpID0+IHtcclxuICAgICAgICAvLyBjb25zb2xlLmxvZygnZmllbGRNYXBwaW5nOiAnLCBmaWVsZE1hcHBpbmcpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cEdldCQodXJsMiwgeyBpZDogZmllbGRNYXBwaW5nLkZpZWxkRWxlbWVudE1hc3RlcklkIH0pO1xyXG4gICAgICB9KSxcclxuICAgICAgdGFwKChyZXNwRGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihkLnpNb2RlbCwgcmVzcERhdGEpO1xyXG4gICAgICAgIGQuZm9ybS5wYXRjaFZhbHVlKGQuek1vZGVsKTtcclxuICAgICAgICBkLmZvcm0ubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICBjb25zdCBmaWVsZHMgPSBKU09OLnBhcnNlKGQuek1vZGVsLkNvZGUpO1xyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oZCwge1xyXG4gICAgICAgICAgdHJlZU1vZGVsOiBaQ29tcG9uZW50SGVscGVyLmNvbnZlcnRUcmVlTW9kZWwoZmllbGRzKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9KVxyXG4gICAgKVxyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgc3ViamVjdEV2ZW50KGV2ZW50OiBaQ29tcG9uZW50T3V0cHV0RXZlbnQsIGdyb3VwOiBaR3JvdXAsIG1lOiBhbnkpIHtcclxuICAgIGlmICghZXZlbnQgfHwgIWV2ZW50LnRhcmdldCB8fCBldmVudC50YXJnZXQuc3RhcnRzV2l0aChcIm1vZGFsR3JvdXAuXCIpKSB7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIC8vIGNvbnNvbGUubG9nKFwiKiogRGVidWcgLSBTdWJqZWN0RXZlbnRcIiwgZXZlbnQpO1xyXG4gICAgbGV0IGNhbGxGdW5jO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNhbGxGdW5jID0gWkNvbXBvbmVudEhlbHBlci5nZXRHcm91cEV2YWxWYWx1ZS5jYWxsKFxyXG4gICAgICAgIG1lLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICApO1xyXG4gICAgICAvLyBaQ29tcG9uZW50SGVscGVyLmdldEdyb3VwVmFsdWUoZXZlbnQuVGFyZ2V0LCBncm91cCk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJFcnJvciB3aGVuIGdldEdyb3VwVmFsdWU6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiA+IEVycm9yOiBcIixcclxuICAgICAgICBlcnJvclxyXG4gICAgICApO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIGNhbGxGdW5jKGV2ZW50KTtcclxuICAgIGlmICh0eXBlb2YgY2FsbEZ1bmMgPT09IFwiZnVuY3Rpb25cIikge1xyXG4gICAgICBjb25zdCBuZXdGdW5jID0gY2FsbEZ1bmMuYmluZChtZSk7XHJcbiAgICAgIG5ld0Z1bmMoZXZlbnQsIGdyb3VwLCBtZSk7XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJzdHJpbmdcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZS5lbmRzV2l0aChcIm9uTmF2aWdhdGVUb1wiKSkge1xyXG4gICAgICAgIGNvbnN0IG5VcmwgPSBldmVudC50YXJnZXQucmVwbGFjZShcIi86aWRcIiwgXCIvXCIgKyBldmVudC5kYXRhKTtcclxuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbblVybF0pO1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiemdyaWQtY2VsbENsaWNrXCIpIHtcclxuICAgICAgICAvLyAoY2FsbEZ1bmMuc3RhcnRzV2l0aCgnZWRpdCcpKSB7ICB6Z3JpZC1jZWxsQ2xpY2tcclxuICAgICAgICBjb25zdCBjTmFtZSA9IGNhbGxGdW5jLnNsaWNlKDQpO1xyXG4gICAgICAgIC8vIGRlYnVnZ2VyO1xyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY05hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuXHJcbiAgICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhldmVudC5jb2x1bW5GaWVsZHMkIHx8IGNOYW1lLCBncm91cCwgJycsIG51bGwsIG51bGwsIHt9LCBldmVudC5kYXRhLklkKTsgLy8gVE9ET1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYWxsRnVuYyA9PT0gXCJvYmplY3RcIikge1xyXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJ6Z3JpZC1jZWxsQ2xpY2tcIikge1xyXG4gICAgICAgIGlmIChjYWxsRnVuYy5uYXZpZ2F0ZVVybCkge1xyXG4gICAgICAgICAgY29uc3QgdXJsID0gY2FsbEZ1bmMubmF2aWdhdGVVcmwucmVwbGFjZShcIjppZFwiLCBldmVudC5kYXRhLklkKTtcclxuICAgICAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFt1cmxdKTtcclxuICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIGNvbnN0IG1vZGFsR3JvdXBQYXJhbTogTW9kYWxQYWdlUGFyYW1zID0ge307XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLmNvbnRyb2xsZXJOYW1lID0gY2FsbEZ1bmMuY3RybE5hbWU7XHJcbiAgICAgICAgLy8gbW9kYWxHcm91cFBhcmFtLnJlZmVySWQgPSBldmVudC5kYXRhLklkO1xyXG4gICAgICAgIC8vIG1vZGFsR3JvdXBQYXJhbS5jb2xGaWVsZHMkID0gZXZlbnQuY29sdW1uRmllbGRzJDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0ucGFyZW50R3JvdXAgPSBtZS5ncm91cDtcclxuICAgICAgICAvLyBtb2RhbEdyb3VwUGFyYW0uZm9ybUhlYWRlciA9IGNhbGxGdW5jLmZvcm1IZWFkZXI7XHJcblxyXG4gICAgICAgIGlmIChjYWxsRnVuYy5mb3JtSGVhZGVyKSB7XHJcbiAgICAgICAgICAvLyB0aGlzLm9wZW5Nb2RhbEZvcm0obW9kYWxHcm91cFBhcmFtKTtcclxuXHJcbiAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5zaG93KGV2ZW50LmNvbHVtbkZpZWxkcyQgfHwgY2FsbEZ1bmMuY3RybE5hbWUsIGdyb3VwLCBjYWxsRnVuYy5mb3JtSGVhZGVyLCBudWxsLCBudWxsLCB7fSwgZXZlbnQuZGF0YS5JZCk7XHJcbiAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUud2FybihcclxuICAgICAgICAgIFwiSW52YWxpZCBjYWxsRnVuYyB0eXBlOiBcIixcclxuICAgICAgICAgIGNhbGxGdW5jLFxyXG4gICAgICAgICAgXCIgZXZlbnQuVGFyZ2V0OiBcIixcclxuICAgICAgICAgIGV2ZW50LnRhcmdldFxyXG4gICAgICAgICk7XHJcbiAgICAgIH1cclxuICAgICAgLy8gdGhpcy5vcGVuTW9kYWxGb3JtQnlDb21wb25lbnQoY2FsbEZ1bmMudHlwZSwgZXZlbnQuRGF0YS5JZCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb25zb2xlLndhcm4oXHJcbiAgICAgICAgXCJGdW5jdGlvbiBub3QgZGVmaW5lZCBpbiBncm91cCBmb3I6IFwiLFxyXG4gICAgICAgIGV2ZW50LnRhcmdldCxcclxuICAgICAgICBcIiwgRXZlbnQ6IFwiLFxyXG4gICAgICAgIGV2ZW50XHJcbiAgICAgICk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdyaWRBY3Rpdml0eUxvZ09uSXRlbUNsaWNrKGV2ZW50OiBhbnkpIHtcclxuICAgIC8vIGNvbnNvbGUubG9nKCdncmlkQWN0aXZpdHlMb2dPbkl0ZW1DbGljazogJywgZXZlbnQpO1xyXG4gICAgY29uc3QgcmVjID0gZXZlbnQuZGF0YUl0ZW07XHJcbiAgICBzd2l0Y2ggKHJlYy50eXBlKSB7XHJcbiAgICAgIGNhc2UgJ0xpc3RGaWVsZCc6XHJcbiAgICAgIGNhc2UgJ0Zvcm1GaWVsZCc6XHJcbiAgICAgICAgdGhpcy5nZXRGaWVsZHpNb2RlbChyZWMudHlwZSwgcmVjLmFjdGl2aXR5TmFtZSkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgICAgIHRoaXMuc2VsZWN0VGFiKDApO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdSZXNvdXJjZVNlcnZlckFQSSc6XHJcbiAgICAgICAgY29uc3Qgd2F0Y2hOYW1lVmFsdWUgPSAnX2RlYnVnLnpEYXRhLmNvbGxlY3RlZEFjdGl2aXRpZXNbJyArIChyZWMuaW5kZXggLSAxKSArICddLnJlZmVyZW5jZSc7XHJcbiAgICAgICAgdGhpcy5zZXRXYXRjaE5hbWVWYWx1ZSh3YXRjaE5hbWVWYWx1ZSk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RUYWIoMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgJ0h0dHBHZXQkJzpcclxuICAgICAgY2FzZSAnSHR0cFBvc3QkJzpcclxuICAgICAgY2FzZSAnSHR0cFB1dCQnOlxyXG4gICAgICBjYXNlICdIdHRwRGVsZXRlJCc6XHJcbiAgICAgICAgdGhpcy5zZXRXYXRjaE5hbWVWYWx1ZSgnX2RlYnVnLnpEYXRhLmNvbGxlY3RlZEFjdGl2aXRpZXNbJyArIChyZWMuaW5kZXggLSAxKSArICddJyk7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RUYWIoMSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNlbGVjdFRhYihpbmRleDogbnVtYmVyKSB7XHJcbiAgICAvLyBkZWJ1Z2dlcjtcclxuICAgIC8vIHRoaXMuZGVidWcuekNvbXBvbmVudHNbXCJ6dGFiX2RlYnVnZ2VyVGFic1wiXS5zdGF0ZS5sYXN0U2VsZWN0ZWRUYWJJbmRleCA9IGluZGV4O1xyXG4gICAgLy8gWkNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnQodGhpcy5kZWJ1ZywgJ3p0YWJfZGVidWdnZXJUYWJzJykuc3RhdGUubGFzdFNlbGVjdGVkVGFiSW5kZXggPSBpbmRleDtcclxuICAgIFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZGVidWcsICd6dGFiX2RlYnVnZ2VyVGFicycpLnNlbGVjdFRhYihpbmRleCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldFdhdGNoTmFtZVZhbHVlKG5ld1ZhbHVlOiBzdHJpbmcpIHtcclxuICAgIHRoaXMuZGVidWcuek1vZGVsWydEZWJ1Z1dhdGNoTmFtZSddID0gbmV3VmFsdWU7XHJcbiAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoJ1dhdGNoTmFtZScsIG5ld1ZhbHVlLCB0aGlzLmRlYnVnLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBMb2FkR3JpZERhdGEoKSB7XHJcbiAgICBjb25zdCBhY3Rpdml0eUxvZ0dyaWQgPSBaQ29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudCh0aGlzLmRlYnVnLCAnemdyaWRfQWN0aXZpdHlMb2dHcmlkJyk7XHJcbiAgICBpZiAoYWN0aXZpdHlMb2dHcmlkKSB7XHJcbiAgICAgIGFjdGl2aXR5TG9nR3JpZC5zZXREYXRhKHRoaXMuZGVidWcuekRhdGEuY29sbGVjdGVkQWN0aXZpdGllcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGxpc3RXYXRjaE5hbWUoY29tcG9uZW50OiBJb25pY1NlbGVjdGFibGVDb21wb25lbnQsIHNlYXJjaFRleHQ6IHN0cmluZywgcGFnZU5vOiBudW1iZXIsXHJcbiAgICBtZTogYW55LCBkYXRhSXRlbTogYW55LCByZWNvcmRJZD86IHN0cmluZykge1xyXG5cclxuICAgIGNvbnN0IHdhdGNoTGlzdCA9IFtcclxuICAgICAgeyBOYW1lOiAnZ3JvdXAuek1vZGVsJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC56RGF0YScgfSxcclxuICAgICAgeyBOYW1lOiAnZ3JvdXAuZmllbGRzJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC5mb3JtLnZhbHVlJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC5iYWNrTmF2aWdhdGlvblBhZ2UnIH0sXHJcbiAgICAgIHsgTmFtZTogJ2dyb3VwLnBhcmVudFJlZmVyZW5jZUZpZWxkJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC5wYXJlbnRSZWZlcmVuY2VJZCcgfSxcclxuICAgICAgeyBOYW1lOiAnT2JqZWN0LmtleXMoZ3JvdXAuekNvbXBvbmVudHMpJyB9LFxyXG4gICAgICB7IE5hbWU6ICdncm91cC5ncmlkT3B0aW9ucy56Z3JpZC5ncmlkLmRhdGEnIH1cclxuICAgICAgLy8geyBOYW1lOiAnT2JqZWN0LmtleXMoX2RlYnVnLnpDb21wb25lbnRzKScgfSxcclxuICAgICAgLy8geyBOYW1lOiAnX2RlYnVnLnpNb2RlbCcgfSxcclxuICAgICAgLy8geyBOYW1lOiAnX2RlYnVnLnpEYXRhJyB9LFxyXG4gICAgICAvLyB7IE5hbWU6ICdfZGVidWcuekRhdGEuY29sbGVjdGVkQWN0aXZpdGllcycgfSxcclxuICAgIF07XHJcblxyXG4gICAgbGV0IHJlc3VsdHM7XHJcbiAgICBpZiAoc2VhcmNoVGV4dCkge1xyXG4gICAgICByZXN1bHRzID0gd2F0Y2hMaXN0LmZpbHRlcigocykgPT4gcy5OYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihzZWFyY2hUZXh0LnRvTG93ZXJDYXNlKCkpICE9PSAtMSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHBhZ2VObyA9PT0gMCAmJiBzZWFyY2hUZXh0KSB7XHJcbiAgICAgIHJldHVybiBvZih7IGRhdGFTZXQ6IHJlc3VsdHMgfSk7XHJcbiAgICB9IGVsc2UgaWYgKHBhZ2VObyA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gb2YoeyBkYXRhU2V0OiB3YXRjaExpc3QgfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gb2YoeyBkYXRhU2V0OiBbXSB9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0V2F0Y2hOYW1lKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuZGVidWcuek1vZGVsLkRlYnVnV2F0Y2hOYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZVdhdGNoTmFtZShldmVudDogYW55LCBncm91cDogWkdyb3VwLCBtZTogYW55KSB7XHJcbiAgICAvLyBjb25zb2xlLmxvZygnb25DaGFuZ2VXYXRjaE5hbWU6ICcsIGV2ZW50LmRhdGEudmFsdWUpO1xyXG4gICAgY29uc3QgbmV3VmFsdWUgPSBldmVudC5kYXRhLnZhbHVlO1xyXG4gICAgaWYgKG5ld1ZhbHVlKSB7XHJcbiAgICAgIHRoaXMuZGVidWcuek1vZGVsWydEZWJ1Z1dhdGNoTmFtZSddID0gbmV3VmFsdWUucmVwbGFjZSgnZ3JvdXAnLCAnX2dyb3VwJyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZpZWxkRWxlbWVudG9uRWRpdG9yQ29kZUNoYW5nZShlbDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICB0aGlzLnJlZnJlc2hUcmVlTW9kZWwoKTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIHRyZWVOb2Rlc0V4cGFuZEFsbCgpIHtcclxuICAgIHRoaXMuZGVidWcuekNvbXBvbmVudHNbJ3p0cmVlX2RlYnVnWlRyZWUnXS5leHBhbmRBbGwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJlZU5vZGVzQ29sbGFwc2VBbGwoKSB7XHJcbiAgICB0aGlzLmRlYnVnLnpDb21wb25lbnRzWyd6dHJlZV9kZWJ1Z1pUcmVlJ10uY29sbGFwc2VBbGwoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaFRyZWVNb2RlbCgpIHtcclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGQgPSBKU09OLnBhcnNlKHRoaXMuZGVidWcuek1vZGVsLkNvZGUpO1xyXG4gICAgICAvLyB0aGlzLl9hZGROb2Rlc1RvVHJlZShkKTtcclxuICAgICAgLy8gZ3JvdXBbJ3RyZWVNb2RlbCddID0gdGhpcy5jb252ZXJ0VHJlZU1vZGVsKGQpO1xyXG4gICAgICB0aGlzLmRlYnVnWyd0cmVlTW9kZWwnXSA9IFpDb21wb25lbnRIZWxwZXIuY29udmVydFRyZWVNb2RlbChkKTtcclxuICAgIH0gY2F0Y2gge1xyXG4gICAgICBkZWJ1Z2dlcjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdHJlZUl0ZW1UZW1wbGF0ZShlbDogWlRyZWVUZW1wbGF0ZVBhcmFtcykge1xyXG4gICAgY29uc3QgZ2V0RmllbGRWYWx1ZSA9IChpdGVtOiBhbnkpID0+IHtcclxuICAgICAgaWYgKHR5cGVvZiBpdGVtLl9EYXRhVmFsdWUgPT09IFwic3RyaW5nXCIpIHtcclxuICAgICAgICByZXR1cm4gaXRlbS5fRGF0YVZhbHVlO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBcIi4uLlwiO1xyXG4gICAgfTtcclxuICAgIHJldHVybiAoXHJcbiAgICAgIGVsLmRhdGFJdGVtLk5hbWUgK1xyXG4gICAgICBcIiAtIFtcIiArXHJcbiAgICAgIGVsLmRhdGFJdGVtLlR5cGUgK1xyXG4gICAgICBcIl0gPSBcIiArXHJcbiAgICAgIGdldEZpZWxkVmFsdWUoZWwuZGF0YUl0ZW0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgb25JdGVtQ2xpY2soZXZlbnQ6IFpDb21wb25lbnRPdXRwdXRFdmVudCkge1xyXG4gICAgLy8gZGVidWdnZXI7XHJcbiAgICBjb25zb2xlLmxvZyhcIm9uSXRlbUNsaWNrIGRhdGEgcmVjZWl2ZWQ6IFwiLCBldmVudCk7XHJcbiAgICBjb25zdCBtb2RhbEZpZWxkcyA9IHRoaXMuZmllbGRTZXJ2aWNlLmdldEZvcm1GaWVsZENvZGUoXHJcbiAgICAgIFwibXZFZGl0RmllbGROb2RlRm9ybVwiLFxyXG4gICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICBudWxsLFxyXG4gICAgICBudWxsXHJcbiAgICApO1xyXG4gICAgY29uc3QgZGF0YUl0ZW0gPSBPYmplY3QuYXNzaWduKHt9LCBldmVudC5kYXRhKTtcclxuICAgIGRhdGFJdGVtLlZhbHVlID0gZGF0YUl0ZW0uX0RhdGFWYWx1ZTtcclxuICAgIGRlbGV0ZSBkYXRhSXRlbS5fRGF0YVZhbHVlO1xyXG4gICAgY29uc3Qgem1vZGVsID0ge1xyXG4gICAgICBub2RlTW9kZWw6IEpTT04uc3RyaW5naWZ5KGRhdGFJdGVtLCBudWxsLCAyKVxyXG4gICAgfTtcclxuICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhtb2RhbEZpZWxkcywgdGhpcy5kZWJ1Zy5fZ3JvdXAsICdGaWVsZCBFbGVtZW50IEluZm8nLCBudWxsLCBudWxsLCB6bW9kZWwpO1xyXG4gICAgbW9kYWwuc3Vic2NyaWJlKChtb2RhbERhdGE6IE1vZGFsUmVzcG9uc2UpID0+IHtcclxuICAgICAgaWYgKG1vZGFsRGF0YS5yZXNwb25zZVR5cGUgPT09IFwiY2FuY2VsXCIpIHtcclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgbmV3RGF0YSA9IEpTT04ucGFyc2UobW9kYWxEYXRhLmRhdGEubm9kZU1vZGVsKTtcclxuICAgICAgaWYgKG5ld0RhdGEuVmFsdWUpIHtcclxuICAgICAgICBuZXdEYXRhLl9EYXRhVmFsdWUgPSBuZXdEYXRhLlZhbHVlO1xyXG4gICAgICAgIG5ld0RhdGEuVmFsdWUgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMudXBkYXRlVHJlZU5vZGUobmV3RGF0YSwgdGhpcy5kZWJ1Z1sndHJlZU1vZGVsJ10sIGV2ZW50LmV2ZW50KTtcclxuICAgICAgY29uc3QgbmV3VHJlZU1vZGVsID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnWyd0cmVlTW9kZWwnXSkpO1xyXG4gICAgICBjb25zdCByZXZlcnRlZE1vZGVsID0gWkNvbXBvbmVudEhlbHBlci5yZXZlcnRUcmVlTW9kZWwobmV3VHJlZU1vZGVsKTtcclxuICAgICAgY29uc3QgbmV3Q29kZSA9IEpTT04uc3RyaW5naWZ5KHJldmVydGVkTW9kZWwsIG51bGwsIDIpO1xyXG4gICAgICBaQ29tcG9uZW50SGVscGVyLnNldE1vZGVsVmFsdWUoXCJDb2RlXCIsIG5ld0NvZGUsIHRoaXMuZGVidWcpO1xyXG4gICAgICB0aGlzLnVwZGF0ZU1vZGVsKCk7XHJcbiAgICAgIC8vIHRoaXMubWFpblNlcnZpY2UudXBkYXRlTW9kZWwobnVsbCwgdGhpcy5kZWJ1Zyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgdXBkYXRlVHJlZU5vZGUobmV3Tm9kZTogYW55LCB0cmVlTW9kZWw6IGFueSwgaW5kZXg6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJlZUluZGV4ID0gaW5kZXguc3BsaXQoXCJfXCIpO1xyXG4gICAgaWYgKHRyZWVJbmRleC5sZW5ndGggPiAxKSB7XHJcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdHJlZUluZGV4LnNsaWNlKDEpLmpvaW4oXCJfXCIpO1xyXG4gICAgICB0aGlzLnVwZGF0ZVRyZWVOb2RlKG5ld05vZGUsIHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZSwgbmV3SW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZSkge1xyXG4gICAgICAgIG5ld05vZGUuVmFsdWUgPSB0cmVlTW9kZWxbK3RyZWVJbmRleFswXV0uVmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgdHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dID0gbmV3Tm9kZTtcclxuICAgIH1cclxuICB9XHJcblxyXG5cclxuXHJcbiAgcHJpdmF0ZSBpbnNlcnRUcmVlTm9kZShuZXdOb2RlOiBhbnksIHRyZWVNb2RlbDogYW55LCBpbmRleDogc3RyaW5nKSB7XHJcbiAgICBjb25zdCB0cmVlSW5kZXggPSBpbmRleC5zcGxpdChcIl9cIik7XHJcbiAgICBpZiAodHJlZUluZGV4Lmxlbmd0aCA+IDEpIHtcclxuICAgICAgY29uc3QgbmV3SW5kZXggPSB0cmVlSW5kZXguc2xpY2UoMSkuam9pbihcIl9cIik7XHJcbiAgICAgIHRoaXMuaW5zZXJ0VHJlZU5vZGUobmV3Tm9kZSwgdHJlZU1vZGVsWyt0cmVlSW5kZXhbMF1dLlZhbHVlLCBuZXdJbmRleCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBpZiAodHJlZUluZGV4WzBdKSB7XHJcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZSkpIHtcclxuICAgICAgICAgIHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZSA9IFtdO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0cmVlTW9kZWxbK3RyZWVJbmRleFswXV0uVmFsdWUucHVzaChuZXdOb2RlKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0cmVlTW9kZWwucHVzaChuZXdOb2RlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSByZW1vdmVUcmVlTm9kZSh0cmVlTW9kZWw6IGFueSwgaW5kZXg6IHN0cmluZykge1xyXG4gICAgY29uc3QgdHJlZUluZGV4ID0gaW5kZXguc3BsaXQoXCJfXCIpO1xyXG4gICAgaWYgKHRyZWVJbmRleC5sZW5ndGggPiAxKSB7XHJcbiAgICAgIGNvbnN0IG5ld0luZGV4ID0gdHJlZUluZGV4LnNsaWNlKDEpLmpvaW4oXCJfXCIpO1xyXG4gICAgICB0aGlzLnJlbW92ZVRyZWVOb2RlKHRyZWVNb2RlbFsrdHJlZUluZGV4WzBdXS5WYWx1ZSwgbmV3SW5kZXgpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdHJlZU1vZGVsLnNwbGljZSgrdHJlZUluZGV4WzBdLCAxKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgb25UcmVlTm9kZUNoYW5nZShlbDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICBjb25zb2xlLmxvZyhcIm9uVHJlZU5vZGVDaGFuZ2U6IFwiLCBlbCk7XHJcbiAgICBjb25zdCBjb2RlRGF0YSA9IEpTT04uc3RyaW5naWZ5KGVsLmRhdGEpO1xyXG4gICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKFwiQ29kZVwiLCBjb2RlRGF0YSwgdGhpcy5kZWJ1Zyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFkZE5vZGUoKSB7XHJcbiAgICBjb25zdCBlbDogWkNvbXBvbmVudE91dHB1dEV2ZW50ID0ge1xyXG4gICAgICBkYXRhOiB7fSxcclxuICAgICAgcm93RGF0YToge30sXHJcbiAgICAgIGV2ZW50OiBcIlwiLFxyXG4gICAgICB0YXJnZXQ6IFwiXCIsXHJcbiAgICAgIHR5cGU6IFwiXCIsXHJcbiAgICAgIGNvbHVtbkZpZWxkcyQ6IG51bGxcclxuICAgIH07XHJcbiAgICB0aGlzLm9uQWRkTm9kZShlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIG9uQWRkTm9kZShlbDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICBjb25zb2xlLmxvZygnb25BZGROb2RlIGlzIGNhbGxlZCcsIGVsKTtcclxuICAgIGNvbnN0IG1vZGFsRmllbGRzID0gdGhpcy5maWVsZFNlcnZpY2UuZ2V0Rm9ybUZpZWxkQ29kZShcclxuICAgICAgXCJtdkVkaXRGaWVsZE5vZGVGb3JtXCIsXHJcbiAgICAgIFwiRm9ybUZpZWxkXCIsXHJcbiAgICAgIG51bGwsXHJcbiAgICAgIG51bGxcclxuICAgICk7XHJcbiAgICAvLyBjb25zdCBkYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGVsLmRhdGEpO1xyXG4gICAgLy8gZGF0YUl0ZW0uVmFsdWUgPSBkYXRhSXRlbS5fRGF0YVZhbHVlO1xyXG4gICAgLy8gZGVsZXRlIGRhdGFJdGVtLl9EYXRhVmFsdWU7XHJcbiAgICBjb25zdCBpbml0aWFsTW9kZWwgPSB7XHJcbiAgICAgIE5hbWU6ICdOYW1lJywgRGlzcGxheU5hbWU6ICdOYW1lJywgVmFsdWU6ICdOYW1lJywgVHlwZTogJ3RleHQnLFxyXG4gICAgICBncmlkQ29sVmlzaWJsZTogdHJ1ZSxcclxuICAgICAgd2lkdGg6IDE1MCxcclxuICAgICAgbWluV2lkdGg6IDEwMCxcclxuICAgICAgZW5hYmxlRmlsdGVyaW5nOiB0cnVlLFxyXG4gICAgICBlbmFibGVTb3J0aW5nOiB0cnVlLFxyXG4gICAgICBwaW5uZWRMZWZ0OiBmYWxzZSxcclxuICAgICAgUGxhY2VIb2xkZXI6IFwiTmFtZVwiLFxyXG4gICAgICBJc1JlcXVpcmVkOiBmYWxzZSxcclxuICAgICAgTWluTGVuZ3RoOiAyLFxyXG4gICAgICBNYXhMZW5ndGg6IDUwLFxyXG4gICAgICBMYWJlbDogXCJOYW1lOlwiLFxyXG4gICAgICBEaXZDbGFzczogXCJjb2wteHMtMTIgY29sLXNtLTYgY29sLW1kLTYgY29sLWxnLTNcIixcclxuICAgICAgUmVhZE9ubHk6IGZhbHNlLFxyXG4gICAgICBTaG93TGFiZWw6IHRydWUsXHJcbiAgICAgIFZpc2libGU6IHRydWUsXHJcbiAgICAgIC8vRW5hYmxlSGlkaW5nOiB0cnVlLFxyXG4gICAgICAvL2NlbGxGaWx0ZXI6IFwiXCIsXHJcbiAgICAgIC8vZmlsdGVyQ2VsbEZpbHRlcmVkOiBmYWxzZSxcclxuICAgICAgLy9lbmFibGVQaW5uaW5nOiB0cnVlLFxyXG4gICAgICAvL3Bpbm5lZFJpZ2h0OiBmYWxzZSxcclxuICAgICAgLy9VcGRhdGVPbkJsdXI6IHRydWUsXHJcbiAgICAgIC8vQXBwZW5kRGl2Q2xlYXJGaXg6IGZhbHNlLFxyXG4gICAgfTtcclxuICAgIGNvbnN0IHptb2RlbCA9IHtcclxuICAgICAgbm9kZU1vZGVsOiBKU09OLnN0cmluZ2lmeShpbml0aWFsTW9kZWwsIG51bGwsIDIpXHJcbiAgICB9O1xyXG5cclxuICAgIC8vIGNvbnN0IG1vZGFsOiBIVE1MSW9uTW9kYWxFbGVtZW50ID0gYXdhaXQgdGhpcy5tYWluU2VydmljZS5vcGVuTW9kYWxGb3JtKG1vZGFsR3JvdXBQYXJhbSk7XHJcbiAgICBjb25zdCBtb2RhbCA9IGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLnNob3cobW9kYWxGaWVsZHMsIHRoaXMuZGVidWcsICdBZGQgRmllbGQgRWxlbWVudCBJdGVtJywgbnVsbCwgbnVsbCwgem1vZGVsKTtcclxuXHJcbiAgICBtb2RhbC5zdWJzY3JpYmUoKG1vZGFsRGF0YTogTW9kYWxSZXNwb25zZSkgPT4ge1xyXG4gICAgICBpZiAobW9kYWxEYXRhLnJlc3BvbnNlVHlwZSA9PT0gXCJjYW5jZWxcIikge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgICBjb25zdCBuZXdEYXRhID0gSlNPTi5wYXJzZShtb2RhbERhdGEuZGF0YS5ub2RlTW9kZWwpO1xyXG4gICAgICBpZiAobmV3RGF0YS5WYWx1ZSkge1xyXG4gICAgICAgIG5ld0RhdGEuX0RhdGFWYWx1ZSA9IG5ld0RhdGEuVmFsdWU7XHJcbiAgICAgICAgbmV3RGF0YS5WYWx1ZSA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnNlcnRUcmVlTm9kZShuZXdEYXRhLCB0aGlzLmRlYnVnW1widHJlZU1vZGVsXCJdLCBlbC5ldmVudCk7XHJcbiAgICAgIGNvbnN0IG5ld1RyZWVNb2RlbCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5kZWJ1Z1sndHJlZU1vZGVsJ10pKTtcclxuICAgICAgY29uc3QgcmV2ZXJ0ZWRNb2RlbCA9IFpDb21wb25lbnRIZWxwZXIucmV2ZXJ0VHJlZU1vZGVsKG5ld1RyZWVNb2RlbCk7XHJcbiAgICAgIGNvbnN0IG5ld0NvZGUgPSBKU09OLnN0cmluZ2lmeShyZXZlcnRlZE1vZGVsLCBudWxsLCAyKTtcclxuICAgICAgWkNvbXBvbmVudEhlbHBlci5zZXRNb2RlbFZhbHVlKFwiQ29kZVwiLCBuZXdDb2RlLCB0aGlzLmRlYnVnKTtcclxuICAgICAgdGhpcy51cGRhdGVNb2RlbCgpO1xyXG4gICAgICAvLyB0aGlzLm1haW5TZXJ2aWNlLnVwZGF0ZU1vZGVsKG51bGwsIHRoaXMuZGVidWcpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIG9uUmVtb3ZlTm9kZShlbDogWkNvbXBvbmVudE91dHB1dEV2ZW50KSB7XHJcbiAgICB0aGlzLmFsZXJ0U2VydmljZS5zaG93KCdSZW1vdmUgTm9kZScsICdBcmUgeW91IHN1cmU/JyxcclxuICAgICAgW1xyXG4gICAgICAgIHsgdGV4dDogXCJOb1wiLCBjc3NDbGFzczogXCJzZWNvbmRhcnlcIiB9IGFzIEFsZXJ0QnV0dG9uLFxyXG4gICAgICAgIHsgdGV4dDogXCJZZXNcIiwgY3NzQ2xhc3M6IFwicHJpbWFyeVwiIH0gYXMgQWxlcnRCdXR0b25cclxuICAgICAgXSlcclxuICAgICAgLnN1YnNjcmliZShyZXBseSA9PiB7XHJcbiAgICAgICAgaWYgKHJlcGx5ID09PSAnWWVzJykge1xyXG4gICAgICAgICAgY29uc29sZS5sb2coJ1JlbW92ZSBOb2RlJywgZWwpO1xyXG4gICAgICAgICAgdGhpcy5yZW1vdmVUcmVlTm9kZSh0aGlzLmRlYnVnW1widHJlZU1vZGVsXCJdLCBlbC5ldmVudCk7XHJcbiAgICAgICAgICBjb25zdCBuZXdUcmVlTW9kZWwgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZGVidWdbJ3RyZWVNb2RlbCddKSk7XHJcbiAgICAgICAgICBjb25zdCByZXZlcnRlZE1vZGVsID0gWkNvbXBvbmVudEhlbHBlci5yZXZlcnRUcmVlTW9kZWwobmV3VHJlZU1vZGVsKTtcclxuICAgICAgICAgIGNvbnN0IG5ld0NvZGUgPSBKU09OLnN0cmluZ2lmeShyZXZlcnRlZE1vZGVsLCBudWxsLCAyKTtcclxuICAgICAgICAgIFpDb21wb25lbnRIZWxwZXIuc2V0TW9kZWxWYWx1ZShcIkNvZGVcIiwgbmV3Q29kZSwgdGhpcy5kZWJ1Zyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ290b0ZpZWxkRWxlbWVudCgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnYWRtaW4vZmllbGQnXSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHVwZGF0ZU1vZGVsKCkge1xyXG4gICAgY29uc3QgZGVidWcgPSB0aGlzLmRlYnVnO1xyXG4gICAgY29uc3QgZmcgPSB0aGlzLmRlYnVnLmZvcm0gYXMgRm9ybUdyb3VwO1xyXG4gICAgaWYgKCFmZy5kaXJ0eSkge1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJEZWJ1ZyBGb3JtIGlzIG5vdCBkaXJ0eSBoZW5jZSByZWNvcmQgaXMgbm90IHNhdmUuXCIpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFmZy52YWxpZCkge1xyXG4gICAgICBjb25zdCBlcnJvcnMgPSBaQ29tcG9uZW50SGVscGVyLmdldEZvcm1Hcm91cEVycm9ycyhmZywgdGhpcy5hbGVydFNlcnZpY2UpO1xyXG4gICAgICBjb25zb2xlLndhcm4oXCJEZWJ1ZyBGb3JtIFZhbGlkYXRpb24gZ290IGVycm9yKHMpOlwiLCBlcnJvcnMpO1xyXG4gICAgICByZXR1cm47XHJcbiAgICB9XHJcblxyXG4gICAgb2YoZGVidWcuek1vZGVsKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICAvLyBzd2l0Y2hNYXAoem1vZGVsID0+IHtcclxuICAgICAgICAvLyAgIGNvbnNvbGUubG9nKFwiQmVmb3JlIHVwZGF0ZSwgek1vZGVsOlwiLCB6bW9kZWwpO1xyXG4gICAgICAgIC8vICAgcmV0dXJuIHRoaXMuYmVmb3JlVXBkYXRlTW9kZWwoZ3JvdXApO1xyXG4gICAgICAgIC8vIH0pLFxyXG4gICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICBPYmplY3QuYXNzaWduKGRlYnVnLnpNb2RlbCwgZmcudmFsdWUpO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmh0dHBQdXQkKFxyXG4gICAgICAgICAgICBkZWJ1Zy5yZXNvdXJjZVVSTCArIFwiL1wiICsgZGVidWcuek1vZGVsLklkLFxyXG4gICAgICAgICAgICBkZWJ1Zy56TW9kZWxcclxuICAgICAgICAgIClcclxuICAgICAgICAgICAgLnBpcGUoXHJcbiAgICAgICAgICAgICAgbWFwKHJlcyA9PiB0aGlzLmhhbmRsZVN1Y2Nlc3MocmVzLCBcIlJlY29yZCBpcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS5cIikpLFxyXG4gICAgICAgICAgICApO1xyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHN3aXRjaE1hcCgoem1vZGVsOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKFwiQWZ0ZXIgRGVidWcgRm9ybSB1cGRhdGVkLCB6TW9kZWw6XCIsIHptb2RlbCk7XHJcbiAgICAgICAgICBpZiAoem1vZGVsICYmIHptb2RlbC5EYXRhKSB7XHJcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGVidWcuek1vZGVsLCB6bW9kZWwuRGF0YSk7XHJcbiAgICAgICAgICAgIGZnLnBhdGNoVmFsdWUoem1vZGVsLkRhdGEpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgZmcubWFya0FzUHJpc3RpbmUoKTtcclxuICAgICAgICAgIC8vICAgdGhpcy5hZnRlclVwZGF0ZU1vZGVsKGdyb3VwKTtcclxuICAgICAgICAgIHJldHVybiBvZihbXSk7XHJcbiAgICAgICAgfSkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKTtcclxuICB9XHJcblxyXG5cclxuICAvLyAqKioqKioqKioqKioqKioqKioqKiBXb3JrZmxvdyBCdXR0b24gKioqKioqKioqKioqKioqKioqKipcclxuICBwdWJsaWMgbG9hZFdvcmtmbG93RGF0YSgpIHtcclxuICAgIGNvbnN0IHpncmlkX1dvcmtmbG93QnV0dG9uR3JpZCA9IFpDb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50KHRoaXMuZGVidWcsICd6Z3JpZF9Xb3JrZmxvd0J1dHRvbkdyaWQnKTtcclxuICAgIGlmICh6Z3JpZF9Xb3JrZmxvd0J1dHRvbkdyaWQpIHtcclxuICAgICAgemdyaWRfV29ya2Zsb3dCdXR0b25HcmlkLnNldERhdGEodGhpcy5kZWJ1Zy56RGF0YS5jb2xsZWN0ZWRXb3JrZmxvd0J1dHRvbnMpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBncmlkV29ya2Zsb3dCdXR0b25Pbkl0ZW1DbGljayhldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBkYXRhSXRlbSA9IE9iamVjdC5hc3NpZ24oe30sIGV2ZW50LmRhdGFJdGVtKTtcclxuICAgIGNvbnN0IGZpZWxkID0gZGF0YUl0ZW0ucmVmRmllbGQ7XHJcbiAgICBjb25zdCBhdHRyaWJ1dGUgPSBkYXRhSXRlbS5yZWZBdHRyaWJ1dGU7XHJcblxyXG4gICAgLy8gR2V0IE1hcHBlZCBJbmZvXHJcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXHJcbiAgICAgIC5zZXQoXCJCdXR0b25JZFwiLCBmaWVsZC5JZCk7XHJcbiAgICB0aGlzLndlYkFwaVNlcnZpY2UuaHR0cFBvc3QkKHRoaXMucmVzb3VyY2VBcGlTZXJ2aWNlLmdldFVSTChcImUxd2ZzX3dmY19nZXRtYXBwZWRCdXR0b25JbmZvVVJMXCIpLCBwYXJhbXMpLnBpcGUoXHJcbiAgICAgIG1hcChhc3luYyByZXMgPT4ge1xyXG4gICAgICAgIGxldCByb2xlSW5mbyA9IFtdO1xyXG4gICAgICAgIGxldCBzdGF0dXNJbmZvID0gW107XHJcbiAgICAgICAgbGV0IHBhcmVudFN0YXR1c0luZm8gPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKHJlcy5NYXBwZWRSb2xlTGlzdCkge1xyXG4gICAgICAgICAgcm9sZUluZm8gPSByZXMuTWFwcGVkUm9sZUxpc3Q7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAocmVzLk1hcHBlZFN0YXR1c0xpc3QpIHtcclxuICAgICAgICAgIHJlcy5NYXBwZWRTdGF0dXNMaXN0LmZvckVhY2goKF9zdGF0dXM6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBzdGF0dXNJbmZvLnB1c2goX3N0YXR1cy5OYW1lICsgJyAoJyArIF9zdGF0dXMuQ29kZSArICcpJyk7XHJcbiAgICAgICAgICB9KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyZXMuTWFwcGVkUGFyZW50U3RhdHVzTGlzdCkge1xyXG4gICAgICAgICAgcmVzLk1hcHBlZFBhcmVudFN0YXR1c0xpc3QuZm9yRWFjaCgoX3BhcmVudFN0YXR1czogYW55KSA9PiB7XHJcbiAgICAgICAgICAgIHBhcmVudFN0YXR1c0luZm8ucHVzaChfcGFyZW50U3RhdHVzLk5hbWUgKyAnICgnICsgX3BhcmVudFN0YXR1cy5Db2RlICsgJyknKTtcclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgX21hcHBlZEluZm8gPSB7XHJcbiAgICAgICAgICAnbWFwcGVkUm9sZUluZm8nOiByb2xlSW5mby5sZW5ndGggPiAwID8gcm9sZUluZm8gOiAnTi5BLicsXHJcbiAgICAgICAgICAnbWFwcGVkU3RhdHVzSW5mbyc6IHN0YXR1c0luZm8ubGVuZ3RoID4gMCA/IHN0YXR1c0luZm8gOiAnTi5BLicsXHJcbiAgICAgICAgICAnbWFwcGVkUGFyZW50U3RhdHVzSW5mbyc6IHBhcmVudFN0YXR1c0luZm8ubGVuZ3RoID4gMCA/IHBhcmVudFN0YXR1c0luZm8gOiAnTi5BLidcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICAvLyByZXRyZWl2ZSBhbGwgaW1wb3J0YW50IGluZm9cclxuICAgICAgICBjb25zdCBfYnV0dG9uSW5mbyA9IHtcclxuICAgICAgICAgICdXb3JrZmxvd0lkJzogZmllbGQuV29ya2Zsb3dJZCxcclxuICAgICAgICAgICdCdXR0b25JZCc6IGZpZWxkLklkLFxyXG4gICAgICAgICAgJ0J1dHRvbk5hbWUnOiBmaWVsZC5OYW1lLFxyXG4gICAgICAgICAgJ0J1dHRvbkNvZGUnOiBmaWVsZC5Db2RlLFxyXG4gICAgICAgICAgJ0J1dHRvblR5cGVJZCc6IGZpZWxkLlR5cGUuSWQsXHJcbiAgICAgICAgICAnQnV0dG9uVHlwZU5hbWUnOiBmaWVsZC5UeXBlLk5hbWUsXHJcbiAgICAgICAgICAnQnV0dG9uVHlwZUNvZGUnOiBmaWVsZC5UeXBlLkNvZGUsXHJcbiAgICAgICAgICAnQnV0dG9uVmlzaWJsZSc6IGF0dHJpYnV0ZS5WaXNpYmxlLFxyXG4gICAgICAgICAgJ0J1dHRvbkNsaWNrRXZlbnQnOiBhdHRyaWJ1dGUuQ2xpY2tFdmVudCxcclxuICAgICAgICAgICdCdXR0b25VUkwnOiBhdHRyaWJ1dGUuVVJMLFxyXG4gICAgICAgICAgJ0J1dHRvbkljb24nOiBhdHRyaWJ1dGUuSWNvblxyXG4gICAgICAgIH07XHJcblxyXG4gICAgICAgIGxldCBfZ290b1N0YXR1c0luZm8gPSB7XHJcbiAgICAgICAgICAnR290b1N0YXR1c0lkJzogJ04uQS4nLFxyXG4gICAgICAgICAgJ0dvdG9TdGF0dXNOYW1lJzogJ04uQS4nLFxyXG4gICAgICAgICAgJ0dvdG9TdGF0dXNDb2RlJzogJ04uQS4nXHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgaWYgKGZpZWxkLlN0YXR1cykge1xyXG4gICAgICAgICAgY29uc3QgX2dvdG9TdGF0dXMgPSBmaWVsZC5TdGF0dXNcclxuICAgICAgICAgIF9nb3RvU3RhdHVzSW5mbyA9IHtcclxuICAgICAgICAgICAgJ0dvdG9TdGF0dXNJZCc6IF9nb3RvU3RhdHVzLklkLFxyXG4gICAgICAgICAgICAnR290b1N0YXR1c05hbWUnOiBfZ290b1N0YXR1cy5OYW1lLFxyXG4gICAgICAgICAgICAnR290b1N0YXR1c0NvZGUnOiBfZ290b1N0YXR1cy5Db2RlXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBwcm9wZXJ0aWVzTW9kZWwgPSBPYmplY3QuYXNzaWduKF9idXR0b25JbmZvLCBfZ290b1N0YXR1c0luZm8sIF9tYXBwZWRJbmZvKTtcclxuXHJcbiAgICAgICAgY29uc3QgbW9kYWxGaWVsZHMgPSB0aGlzLmZpZWxkU2VydmljZS5nZXRGb3JtRmllbGRDb2RlKFxyXG4gICAgICAgICAgXCJtdldvcmtmbG93QnV0dG9uRGVidWdGb3JtXCIsXHJcbiAgICAgICAgICBcIkZvcm1GaWVsZFwiLFxyXG4gICAgICAgICAgbnVsbCxcclxuICAgICAgICAgIG51bGxcclxuICAgICAgICApO1xyXG4gICAgICAgIGNvbnN0IG1vZGFsID0gYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyhtb2RhbEZpZWxkcywgdGhpcy5kZWJ1Zy5fZ3JvdXAsICdXb3JrZmxvdyBCdXR0b24gSW5mbycsIG51bGwsIG51bGwsIHByb3BlcnRpZXNNb2RlbCk7XHJcbiAgICAgICAgbW9kYWwuc3Vic2NyaWJlKChtb2RhbERhdGE6IE1vZGFsUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChtb2RhbERhdGEucmVzcG9uc2VUeXBlID09PSBcImNhbmNlbFwiKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgICAgfSlcclxuICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgaGFuZGxlU3VjY2VzcyhyZXM6IFJlc3BvbnNlIHwgYW55LCBzdWNjZXNzTXNnOiBzdHJpbmcpOiBSZXNwb25zZSB7XHJcbiAgICBpZiAocmVzID09IG51bGwpIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhzdWNjZXNzTXNnKTtcclxuICAgIH0gZWxzZSBpZiAocmVzLkRhdGEgIT09IHVuZGVmaW5lZCAmJiByZXMuUHJvY2Vzc2luZ1N0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIGlmIChyZXMuUHJvY2Vzc2luZ1N0YXR1cyA9PT0gdHJ1ZSkge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHJlcy5EYXRhKSkge1xyXG4gICAgICAgICAgcmVzLkRhdGEubWFwKHMgPT4gdGhpcy53ZWJBcGlTZXJ2aWNlLnNob3dIdHRwUmVzcG9uc2VNZXNzYWdlKE1FU1NBR0VUWVBFLlN1Y2Nlc3MsXHJcbiAgICAgICAgICAgIGAke3N1Y2Nlc3NNc2d9IDogJHtzLkNvc3RDb2RlfWAsIG51bGwpKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy53ZWJBcGlTZXJ2aWNlLnNob3dIdHRwUmVzcG9uc2VNZXNzYWdlKE1FU1NBR0VUWVBFLlN1Y2Nlc3MsIHN1Y2Nlc3NNc2csIG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy50b2FzdFNlcnZpY2Uuc2hvdyhzdWNjZXNzTXNnKTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXM7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFcnJvcihyZXM6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy53ZWJBcGlTZXJ2aWNlLmhhbmRsZUVycm9yKHJlcyk7XHJcbiAgfVxyXG59XHJcbiJdfQ==