ato-water-lib 0.0.90 → 0.0.91
Sign up to get free protection for your applications and to get access to all the features.
- package/{esm2022 → esm2020}/lib/ato-water-lib.component.mjs +5 -5
- package/{esm2022 → esm2020}/lib/ato-water-lib.module.mjs +15 -15
- package/{esm2022 → esm2020}/lib/ato-water-lib.service.mjs +5 -5
- package/esm2020/lib/components/asset-flow/asset-flow.component.mjs +165 -0
- package/{esm2022 → esm2020}/lib/components/asset-params-view/asset-params-view.component.mjs +9 -7
- package/esm2020/lib/components/flow-diagram-lib/flow-diagram-lib.component.mjs +54 -0
- package/esm2020/lib/constants/components-group-const.mjs +3236 -0
- package/esm2020/lib/directive/ato-loading.directive.mjs +55 -0
- package/esm2020/lib/directive/ng-var.directive.mjs +31 -0
- package/esm2020/lib/models/default-gojs-editor.model.mjs +3578 -0
- package/esm2020/lib/models/gojs-data.model.mjs +6 -0
- package/esm2020/lib/models/gojs-editor.model.mjs +1811 -0
- package/esm2020/lib/services/utils/utils.service.mjs +133 -0
- package/fesm2015/ato-water-lib.mjs +9674 -0
- package/fesm2015/ato-water-lib.mjs.map +1 -0
- package/{fesm2022 → fesm2020}/ato-water-lib.mjs +1324 -385
- package/fesm2020/ato-water-lib.mjs.map +1 -0
- package/lib/components/asset-flow/asset-flow.component.d.ts +1 -1
- package/lib/components/asset-params-view/asset-params-view.component.d.ts +1 -1
- package/lib/components/flow-diagram-lib/flow-diagram-lib.component.d.ts +1 -1
- package/lib/constants/components-group-const.d.ts +454 -3
- package/lib/directive/ato-loading.directive.d.ts +1 -1
- package/lib/directive/ng-var.directive.d.ts +1 -1
- package/lib/models/default-gojs-editor.model.d.ts +2 -2
- package/lib/models/gojs-editor.model.d.ts +8 -4
- package/package.json +13 -7
- package/esm2022/lib/components/asset-flow/asset-flow.component.mjs +0 -174
- package/esm2022/lib/components/flow-diagram-lib/flow-diagram-lib.component.mjs +0 -55
- package/esm2022/lib/constants/components-group-const.mjs +0 -2291
- package/esm2022/lib/directive/ato-loading.directive.mjs +0 -59
- package/esm2022/lib/directive/ng-var.directive.mjs +0 -33
- package/esm2022/lib/models/default-gojs-editor.model.mjs +0 -3582
- package/esm2022/lib/models/gojs-data.model.mjs +0 -10
- package/esm2022/lib/models/gojs-editor.model.mjs +0 -1799
- package/esm2022/lib/services/utils/utils.service.mjs +0 -133
- package/fesm2022/ato-water-lib.mjs.map +0 -1
- /package/{esm2022 → esm2020}/ato-water-lib.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/applicable-prefixes-const.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/base64.const.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/icon-base64.const.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/key.const.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/plant.constant.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/constants/value.const.mjs +0 -0
- /package/{esm2022 → esm2020}/lib/models/ato-asset-flow.model.mjs +0 -0
- /package/{esm2022 → esm2020}/public-api.mjs +0 -0
@@ -1,3582 +0,0 @@
|
|
1
|
-
import { Directive, EventEmitter, Input, Output, ViewChild, } from '@angular/core';
|
2
|
-
import { AtoGojsEditorModel } from './gojs-editor.model';
|
3
|
-
import * as go from 'gojs';
|
4
|
-
import _ from 'lodash';
|
5
|
-
import moment from 'moment';
|
6
|
-
import { GO_LICENSE_KEY } from '../constants/key.const';
|
7
|
-
import { Subject } from 'rxjs';
|
8
|
-
import { UtilsService } from '../services/utils/utils.service';
|
9
|
-
import { ATO_ENUM_FLOW_DIRECTION, ATO_ECOMPONENT_PLANT_TYPE, NO_DATA, TEXT_UNKNOWN, VALUE_NA, } from '../constants/value.const';
|
10
|
-
import { ATO_EPlantType } from '../constants/plant.constant';
|
11
|
-
import { Subscription } from 'rxjs';
|
12
|
-
import { ICONS_BASE64 } from '../constants/icon-base64.const';
|
13
|
-
import * as i0 from "@angular/core";
|
14
|
-
const ICON_ALERT = '/assets/images/icons/Station.svg';
|
15
|
-
const ARROW = '/assets/images/icons/arrow.svg';
|
16
|
-
const ARROW_GRAY = '/assets/images/icons/arrow-gray.svg';
|
17
|
-
const RO_LINE_DIRTY = '/assets/images/icons/ro_line_dirty.svg';
|
18
|
-
const OUTFLOW_LINE_DIRTY = '/assets/images/icons/outflow_line_dirty.png';
|
19
|
-
export class AtoDefaultGojsEditor {
|
20
|
-
_elRef;
|
21
|
-
menuTrigger;
|
22
|
-
linkValidation;
|
23
|
-
actions = [];
|
24
|
-
actionMenuId = 'actionMenuId';
|
25
|
-
myDiagramDiv = this.constructor.name + '-' + moment().valueOf();
|
26
|
-
myDiagram;
|
27
|
-
$ = go.GraphObject.make;
|
28
|
-
animationInterval;
|
29
|
-
defaultScaleZoomToFit;
|
30
|
-
_initialOptions = {
|
31
|
-
'toolManager.hoverDelay': 200,
|
32
|
-
// 'draggingTool.isEnabled': false,
|
33
|
-
// initialAutoScale: go.Diagram.UniformToFill,
|
34
|
-
// autoScrollRegion: AtoGojsEditorModel.GRID_SIZE * 5,
|
35
|
-
layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
|
36
|
-
initialContentAlignment: go.Spot.Center,
|
37
|
-
initialAutoScale: go.Diagram.Uniform,
|
38
|
-
// contentAlignment: go.Spot.Center,
|
39
|
-
// this.$(go.ForceDirectedLayout),
|
40
|
-
'undoManager.isEnabled': true, // enable undo & redo
|
41
|
-
// "animationManager.isInitial": false,
|
42
|
-
// "animationManager.isEnabled": false,
|
43
|
-
// "draggingTool.isGridSnapEnabled": true
|
44
|
-
dragSelectingTool: this.$(go.DragSelectingTool, { isPartialInclusion: true, delay: 50 }, {
|
45
|
-
box: this.$(go.Part, // replace the magenta box with a red one
|
46
|
-
{ layerName: 'Tool', selectable: false }, this.$(go.Shape, {
|
47
|
-
name: 'SHAPE',
|
48
|
-
fill: 'rgba(255,0,0,0)',
|
49
|
-
stroke: '#E95F47',
|
50
|
-
strokeWidth: 2,
|
51
|
-
})),
|
52
|
-
}),
|
53
|
-
'linkingTool.linkValidation': this.checkLinkCondition.bind(this),
|
54
|
-
'draggingTool.doMouseMove': function () {
|
55
|
-
// do the standard behavior by calling the super method
|
56
|
-
go.DraggingTool.prototype.doMouseMove.call(this);
|
57
|
-
// if dragging-out from the diagram is not allowed, and
|
58
|
-
// if mouse is outside of viewport
|
59
|
-
if (!this.diagram.allowDragOut &&
|
60
|
-
!this.diagram.viewportBounds.containsPoint(this.diagram.lastInput.documentPoint)) {
|
61
|
-
this.diagram.ensureBounds();
|
62
|
-
const vp = this.diagram.lastInput.viewPoint;
|
63
|
-
const dp = this.diagram.position.copy();
|
64
|
-
if (vp.x < 0)
|
65
|
-
dp.x -= 10;
|
66
|
-
else if (vp.x > 0)
|
67
|
-
dp.x += 10;
|
68
|
-
if (vp.y < 0)
|
69
|
-
dp.y -= 10;
|
70
|
-
else if (vp.y > 0)
|
71
|
-
dp.y += 10;
|
72
|
-
this.diagram.position = dp; // scroll in the direction of the mouse
|
73
|
-
}
|
74
|
-
},
|
75
|
-
// LayoutCompleted: () => {
|
76
|
-
// this.myDiagram.zoomToFit();
|
77
|
-
// this.defaultScaleZoomToFit = this.myDiagram.scale;
|
78
|
-
// if (!this.initialOptions.isReadOnly) {
|
79
|
-
// const sizeMargin = AtoGojsEditorModel.GRID_SIZE * 15;
|
80
|
-
// this.myDiagram.padding = new go.Margin(sizeMargin);
|
81
|
-
// }
|
82
|
-
// },
|
83
|
-
};
|
84
|
-
checkLinkCondition(fromNode, fromPort, toNode, toPort, link) {
|
85
|
-
if (this.linkValidation) {
|
86
|
-
return this.linkValidation(fromNode, fromPort, toNode, toPort, link);
|
87
|
-
}
|
88
|
-
return true; // Mặc định cho trường hợp không có hàm linkValidation được truyền vào
|
89
|
-
}
|
90
|
-
set initialOptions(v) {
|
91
|
-
this._initialOptions = _.merge(this._initialOptions, v);
|
92
|
-
// _.extend(v, this._initialOptions);
|
93
|
-
}
|
94
|
-
get initialOptions() {
|
95
|
-
return this._initialOptions;
|
96
|
-
}
|
97
|
-
_editor;
|
98
|
-
set editor(v) {
|
99
|
-
this._editor = v;
|
100
|
-
if (v) {
|
101
|
-
setTimeout(() => {
|
102
|
-
this.initDiagram();
|
103
|
-
}, 100);
|
104
|
-
}
|
105
|
-
}
|
106
|
-
get editor() {
|
107
|
-
return this._editor;
|
108
|
-
}
|
109
|
-
isShowNodeInfo = false;
|
110
|
-
plantSatus;
|
111
|
-
constructor(_elRef) {
|
112
|
-
this._elRef = _elRef;
|
113
|
-
go.Diagram.licenseKey = GO_LICENSE_KEY;
|
114
|
-
}
|
115
|
-
onModelChangeListenerEvent = new EventEmitter();
|
116
|
-
onClickInfoButton = new EventEmitter();
|
117
|
-
onOpenWizard = new EventEmitter();
|
118
|
-
onOpenDetail = new EventEmitter();
|
119
|
-
onOpenAssetParameter = new EventEmitter();
|
120
|
-
onOpenInsightMapping = new EventEmitter();
|
121
|
-
onHoverInfoButton = new EventEmitter();
|
122
|
-
onHoverAlert = new EventEmitter();
|
123
|
-
onDoubleClickNode = new EventEmitter();
|
124
|
-
onOpenChangeIcon = new EventEmitter();
|
125
|
-
// Click component
|
126
|
-
onClickCompoent = new EventEmitter();
|
127
|
-
callbackImageTopology = new EventEmitter();
|
128
|
-
// Click param on ParamTable
|
129
|
-
onClikParamOfTable = new EventEmitter();
|
130
|
-
// Delete Node
|
131
|
-
onDeleteNode = new EventEmitter();
|
132
|
-
onUndo = new EventEmitter();
|
133
|
-
// Rename
|
134
|
-
onRename = new EventEmitter();
|
135
|
-
isAddedModelChangedListeners;
|
136
|
-
committedTransactionSubject = new Subject();
|
137
|
-
// AddSub and UnSub
|
138
|
-
_subscriptionList = new Subscription();
|
139
|
-
ngOnDestroy() {
|
140
|
-
this.unsubscribeAll();
|
141
|
-
this.stopAnimation();
|
142
|
-
// this.myDiagram?.clear();
|
143
|
-
if (!!this.myDiagram?.div) {
|
144
|
-
this.myDiagram.div = null;
|
145
|
-
}
|
146
|
-
if (this.myDiagram) {
|
147
|
-
this.myDiagram.clear();
|
148
|
-
}
|
149
|
-
if (this.myDiagram != null && this.myDiagram.nodeTemplateMap != null) {
|
150
|
-
this.myDiagram.nodeTemplateMap.clear();
|
151
|
-
}
|
152
|
-
if (this.myDiagram != null && this.myDiagram.groupTemplateMap != null) {
|
153
|
-
this.myDiagram.groupTemplateMap.clear();
|
154
|
-
}
|
155
|
-
if (this.myDiagram != null && this.myDiagram.linkTemplate != null) {
|
156
|
-
for (var key in this.myDiagram.linkTemplateMap.toArray()) {
|
157
|
-
this.myDiagram.linkTemplateMap.remove(key);
|
158
|
-
}
|
159
|
-
}
|
160
|
-
this.myDiagram = null;
|
161
|
-
}
|
162
|
-
addOrRemoveCompoentTemplate() {
|
163
|
-
// Add Node and Node Group
|
164
|
-
_.forEach(this.editor.data?.nodeDataArray, (node) => {
|
165
|
-
this.addTemplate(node);
|
166
|
-
});
|
167
|
-
// Remove Node and Node Group
|
168
|
-
_.forEach(this.myDiagram.nodeTemplateMap?.Hb, (temp) => {
|
169
|
-
if (temp?.key &&
|
170
|
-
!this.editor.data?.nodeDataArray?.some((node) => node?.type === temp?.key)) {
|
171
|
-
this.myDiagram.nodeTemplateMap.remove(temp?.key);
|
172
|
-
}
|
173
|
-
});
|
174
|
-
_.forEach(this.myDiagram.groupTemplateMap?.Hb, (temp) => {
|
175
|
-
if (temp?.key &&
|
176
|
-
!this.editor.data?.nodeDataArray?.some((node) => node?.type === temp?.key)) {
|
177
|
-
this.myDiagram.groupTemplateMap.remove(temp?.key);
|
178
|
-
}
|
179
|
-
});
|
180
|
-
}
|
181
|
-
addTemplate(node) {
|
182
|
-
this.addNodeTemplate(node);
|
183
|
-
this.addGroupTemplate(node);
|
184
|
-
}
|
185
|
-
addGroupTemplate(node) {
|
186
|
-
if (this.myDiagram.groupTemplateMap?.Hb?.[node?.type] || !node?.isGroup) {
|
187
|
-
return;
|
188
|
-
}
|
189
|
-
// Group
|
190
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.RO_WATER_TREATMENT) {
|
191
|
-
this.makeGroupROPlantTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
192
|
-
return;
|
193
|
-
}
|
194
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.BOILER) {
|
195
|
-
this.makeGroupBoilerTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
196
|
-
return;
|
197
|
-
}
|
198
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.COOLING_TOWER) {
|
199
|
-
this.makeGroupCoolingTowerTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
200
|
-
return;
|
201
|
-
}
|
202
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.ZONE) {
|
203
|
-
this.makeGroupZoneTemplate();
|
204
|
-
return;
|
205
|
-
}
|
206
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.PLANT_CELL &&
|
207
|
-
node?.isGroup) {
|
208
|
-
this.groupPlantCellTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
209
|
-
return;
|
210
|
-
}
|
211
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.PLANT_CELL_INPUT_GROUP) {
|
212
|
-
this.groupPCInputOrOutTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name, new go.Margin(0, 50, 0, 0));
|
213
|
-
return;
|
214
|
-
}
|
215
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.PLANT_CELL_OUTPUT_GROUP) {
|
216
|
-
this.groupPCInputOrOutTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name, new go.Margin(0, 0, 0, 50));
|
217
|
-
return;
|
218
|
-
}
|
219
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.GROUP_BASIC_COMPONENT) {
|
220
|
-
this.makeGroupBasicComponent(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
221
|
-
return;
|
222
|
-
}
|
223
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
224
|
-
}
|
225
|
-
addNodeTemplate(node) {
|
226
|
-
if (this.myDiagram.nodeTemplateMap?.Hb?.[node?.type] || node?.isGroup) {
|
227
|
-
return;
|
228
|
-
}
|
229
|
-
// Not Group
|
230
|
-
// Component Water Normal
|
231
|
-
if (AtoGojsEditorModel.TYPE_TEMPLATE_WATER_NORMAL?.includes(node?.type) &&
|
232
|
-
!node?.isGroup) {
|
233
|
-
this.makeEntityTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
|
234
|
-
}
|
235
|
-
// Component Water Withdraw Or Discharge
|
236
|
-
if (AtoGojsEditorModel.TYPE_TEMPLATE_WATER_WITHDRAW_OR_DISCHARGE?.includes(node?.type) &&
|
237
|
-
!node?.isGroup) {
|
238
|
-
this.makeEntityWithdrawOrDischarge(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
|
239
|
-
}
|
240
|
-
// Component Energy Normal
|
241
|
-
if ((AtoGojsEditorModel.TYPE_TEMPLATE_ELECTRICITY?.includes(node?.type) ||
|
242
|
-
AtoGojsEditorModel.TYPE_TEMPLATE_NATURAL_GAS?.includes(node?.type) ||
|
243
|
-
AtoGojsEditorModel.TYPE_TEMPLATE_FUEL?.includes(node?.type) ||
|
244
|
-
AtoGojsEditorModel.TYPE_TEMPLATE_STEAM?.includes(node?.type)) &&
|
245
|
-
!node?.isGroup) {
|
246
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon ?? '', AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name ?? '');
|
247
|
-
}
|
248
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.IMAGE_TEMPLATE) {
|
249
|
-
this.makeImageTemplate();
|
250
|
-
}
|
251
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.PARAM_TABLE) {
|
252
|
-
this.makeParamTable();
|
253
|
-
}
|
254
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.MASS_BALANCE) {
|
255
|
-
this.makeMassBalance();
|
256
|
-
}
|
257
|
-
// Text Node
|
258
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE) {
|
259
|
-
this.makeTextTemplate();
|
260
|
-
}
|
261
|
-
// Value Node
|
262
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.VALUE_NODE) {
|
263
|
-
this.makeValueNodeTemplate();
|
264
|
-
}
|
265
|
-
// Value Node
|
266
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.EMPTY) {
|
267
|
-
this.makeEmptyNodeTemplate();
|
268
|
-
}
|
269
|
-
// Value Label
|
270
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.VALUE_LABEL) {
|
271
|
-
this.makeValueLabelTemplate();
|
272
|
-
}
|
273
|
-
// Label
|
274
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_LABEL) {
|
275
|
-
this.makeTextLabelTemplate();
|
276
|
-
}
|
277
|
-
// Zone item
|
278
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.ZONE_ENERGY_ITEM) {
|
279
|
-
this.makeZoneItemTemplate();
|
280
|
-
}
|
281
|
-
// data box
|
282
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.DATA_BOX) {
|
283
|
-
this.makeDataBoxTemplate();
|
284
|
-
}
|
285
|
-
// Special template
|
286
|
-
if (AtoGojsEditorModel.TYPE_TEMPLATE_SPECIAL?.includes(node?.type)) {
|
287
|
-
this.makeSpecialTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
288
|
-
}
|
289
|
-
// Plant Cell
|
290
|
-
if (node?.type === AtoGojsEditorModel.ENUM_TEMPLATES.PLANT_CELL &&
|
291
|
-
!node?.isGroup) {
|
292
|
-
this.plantCellTemplate(AtoGojsEditorModel.NODE_TEMPLATES[node?.type].icon, AtoGojsEditorModel.NODE_TEMPLATES[node?.type].name);
|
293
|
-
}
|
294
|
-
}
|
295
|
-
initDiagram() {
|
296
|
-
if (!!this.myDiagram?.div) {
|
297
|
-
// this.myDiagram.div = null;
|
298
|
-
if (this.initialOptions?.grid) {
|
299
|
-
this.myDiagram['grid'] = this.initialOptions?.grid;
|
300
|
-
}
|
301
|
-
else {
|
302
|
-
this.myDiagram['grid'] = this.$(go.Panel, 'Grid');
|
303
|
-
}
|
304
|
-
if (this.initialOptions?.LayoutCompleted) {
|
305
|
-
this.myDiagram.addDiagramListener('LayoutCompleted', this.initialOptions?.LayoutCompleted);
|
306
|
-
}
|
307
|
-
if (this.initialOptions?.LinkReshaped) {
|
308
|
-
this.myDiagram.addDiagramListener('LinkReshaped', this.initialOptions?.LinkReshaped);
|
309
|
-
}
|
310
|
-
if (this.initialOptions?.SelectionMoved) {
|
311
|
-
this.myDiagram.addDiagramListener('SelectionMoved', this.initialOptions?.SelectionMoved);
|
312
|
-
}
|
313
|
-
if (this.initialOptions?.ChangedSelection) {
|
314
|
-
this.myDiagram.addDiagramListener('ChangedSelection', this.initialOptions?.ChangedSelection);
|
315
|
-
}
|
316
|
-
this.myDiagram.dragSelectingTool = this.initialOptions?.dragSelectingTool;
|
317
|
-
this.myDiagram.toolManager.draggingTool.isGridSnapEnabled =
|
318
|
-
this.initialOptions?.['draggingTool.isGridSnapEnabled'] ?? false;
|
319
|
-
if (this.myDiagram.toolManager &&
|
320
|
-
this.myDiagram.toolManager.draggingTool) {
|
321
|
-
if (this.initialOptions?.['draggingTool.gridSnapCellSize']) {
|
322
|
-
this.myDiagram.toolManager.draggingTool.gridSnapCellSize =
|
323
|
-
this.initialOptions?.['draggingTool.gridSnapCellSize'];
|
324
|
-
}
|
325
|
-
// if (this.initialOptions?.['draggingTool.isGridSnapEnabled']) {
|
326
|
-
// this.myDiagram.toolManager.draggingTool.isGridSnapEnabled =
|
327
|
-
// this.initialOptions?.['draggingTool.isGridSnapEnabled'];
|
328
|
-
// }
|
329
|
-
if (this.initialOptions?.['draggingTool.doMouseMove']) {
|
330
|
-
this.myDiagram.toolManager.draggingTool.doMouseMove =
|
331
|
-
this.initialOptions?.['draggingTool.doMouseMove'];
|
332
|
-
}
|
333
|
-
if (this.initialOptions?.['linkingTool.linkValidation']) {
|
334
|
-
this.myDiagram.toolManager.linkingTool.linkValidation =
|
335
|
-
this.initialOptions?.['linkingTool.linkValidation'];
|
336
|
-
}
|
337
|
-
}
|
338
|
-
this.myDiagram.contentAlignment =
|
339
|
-
this.initialOptions?.contentAlignment ?? go.Spot.Center;
|
340
|
-
this.myDiagram.layout = this.initialOptions?.layout;
|
341
|
-
// this.myDiagram.minViewportBounds = new go.Rect(0, 0, 1200, 1200);
|
342
|
-
if (!!this.editor?.data) {
|
343
|
-
this.addOrRemoveCompoentTemplate();
|
344
|
-
this.myDiagram.model = go.Model.fromJson(this.editor.data);
|
345
|
-
}
|
346
|
-
return;
|
347
|
-
}
|
348
|
-
if (this.animationInterval) {
|
349
|
-
clearInterval(this.animationInterval);
|
350
|
-
}
|
351
|
-
const diagramDiv = this._elRef.nativeElement?.getElementsByClassName(this.myDiagramDiv)?.[0];
|
352
|
-
this.myDiagram = this.$(go.Diagram, diagramDiv, this.initialOptions);
|
353
|
-
// this.myDiagram.initialPosition = new go.Point(0, 0);
|
354
|
-
this.addOrRemoveCompoentTemplate();
|
355
|
-
this.makeLinkTemplate();
|
356
|
-
// animation
|
357
|
-
this.startAnimation();
|
358
|
-
setTimeout(() => {
|
359
|
-
const self = this;
|
360
|
-
// if (!this.isAddedModelChangedListeners) {
|
361
|
-
this.isAddedModelChangedListeners = true;
|
362
|
-
this.myDiagram.addModelChangedListener(function (e) {
|
363
|
-
if (e.change === go.ChangedEvent.Remove &&
|
364
|
-
e.propertyName === 'nodeDataArray') {
|
365
|
-
const data = e.oldValue;
|
366
|
-
self.onDeleteNode.emit(data);
|
367
|
-
}
|
368
|
-
if (e.isTransactionFinished) {
|
369
|
-
self.committedTransactionSubject?.next(e);
|
370
|
-
}
|
371
|
-
});
|
372
|
-
this.myDiagram.commandHandler.undo = function () {
|
373
|
-
self.onUndo.emit();
|
374
|
-
};
|
375
|
-
});
|
376
|
-
if (!!this.editor) {
|
377
|
-
this.myDiagram.model = go.Model.fromJson(this.editor.data);
|
378
|
-
}
|
379
|
-
}
|
380
|
-
initGroupTemplateEnergy() {
|
381
|
-
// for water
|
382
|
-
const { STORAGE, WATER_TREATMENT, DEMIN_WATER_TREATMENT,
|
383
|
-
// RO_WATER_TREATMENT,
|
384
|
-
PROCESS, WASTEWATER_TREATMENT, DAF_WASTEWATER_TREATMENT, ETP_WASTEWATER_TREATMENT, MBR_WASTEWATER_TREATMENT, ZLD_WASTEWATER_TREATMENT, COOLING_TOWER, BOILER, OTHER, LANDSCAPING_IRRIGATION, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
385
|
-
const waterGroups = [
|
386
|
-
STORAGE,
|
387
|
-
WATER_TREATMENT,
|
388
|
-
DEMIN_WATER_TREATMENT,
|
389
|
-
// RO_WATER_TREATMENT,
|
390
|
-
PROCESS,
|
391
|
-
WASTEWATER_TREATMENT,
|
392
|
-
DAF_WASTEWATER_TREATMENT,
|
393
|
-
ETP_WASTEWATER_TREATMENT,
|
394
|
-
MBR_WASTEWATER_TREATMENT,
|
395
|
-
ZLD_WASTEWATER_TREATMENT,
|
396
|
-
COOLING_TOWER,
|
397
|
-
BOILER,
|
398
|
-
OTHER,
|
399
|
-
LANDSCAPING_IRRIGATION,
|
400
|
-
];
|
401
|
-
waterGroups.map((e) => {
|
402
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
403
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
404
|
-
}
|
405
|
-
});
|
406
|
-
// electrical
|
407
|
-
this.initElectricGroupTemplate();
|
408
|
-
// Fuel
|
409
|
-
this.initFuelGroupTemplate();
|
410
|
-
// Gas
|
411
|
-
this.initGasGroupTemplate();
|
412
|
-
}
|
413
|
-
initElectricDiagram() {
|
414
|
-
const { GRID, DIESEL_GENERATORS, BATTERY_ENERGY_STORAGE, LIGHTING_SYSTEMS, LIGHTINGS, ELECTRIC_METERS, TRANSFORMERS, ELECTRIC_FLYWHEEL_ENERGY_STORAGE, PUMPED_HYDRO_STORAGE, THERMAL_ENERGY_STORAGE, SUPER_CAPACITOR_ENERGY_STORAGE, SWITCH_GEARS, PROCESS_CONTROL_AUTOMATION_SYSTEMS, PROCESS_EQUIPMENT_MACHINES, OFFICE_EQUIPMENT, POWER_DISTRIBUTION_CONTROL_SYSTEMS, POWER_DISTRIBUTION_SYSTEMS, NATURAL_GAS_GENERATORS, MOTOR_CONTROLS, VARIABLE_FREQUENCY_DRIVERS, ELECTRIC_HVAC, COMPRESSED_AIR_SYSTEMS, REFRIGERATION_COOLING_SYSTEMS, MATERIAL_HANDLING_EQUIPMENT, WIND_POWER, ELECTRIC_INDUSTRIAL_MOTORS, GROUNDING, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
415
|
-
const ListItemsCreateEntityTemplate = [
|
416
|
-
GRID,
|
417
|
-
DIESEL_GENERATORS,
|
418
|
-
BATTERY_ENERGY_STORAGE,
|
419
|
-
LIGHTING_SYSTEMS,
|
420
|
-
LIGHTINGS,
|
421
|
-
ELECTRIC_METERS,
|
422
|
-
TRANSFORMERS,
|
423
|
-
ELECTRIC_FLYWHEEL_ENERGY_STORAGE,
|
424
|
-
PUMPED_HYDRO_STORAGE,
|
425
|
-
THERMAL_ENERGY_STORAGE,
|
426
|
-
SUPER_CAPACITOR_ENERGY_STORAGE,
|
427
|
-
SWITCH_GEARS,
|
428
|
-
PROCESS_CONTROL_AUTOMATION_SYSTEMS,
|
429
|
-
PROCESS_EQUIPMENT_MACHINES,
|
430
|
-
OFFICE_EQUIPMENT,
|
431
|
-
POWER_DISTRIBUTION_CONTROL_SYSTEMS,
|
432
|
-
POWER_DISTRIBUTION_SYSTEMS,
|
433
|
-
NATURAL_GAS_GENERATORS,
|
434
|
-
MOTOR_CONTROLS,
|
435
|
-
VARIABLE_FREQUENCY_DRIVERS,
|
436
|
-
ELECTRIC_HVAC,
|
437
|
-
COMPRESSED_AIR_SYSTEMS,
|
438
|
-
REFRIGERATION_COOLING_SYSTEMS,
|
439
|
-
MATERIAL_HANDLING_EQUIPMENT,
|
440
|
-
WIND_POWER,
|
441
|
-
ELECTRIC_INDUSTRIAL_MOTORS,
|
442
|
-
GROUNDING,
|
443
|
-
];
|
444
|
-
ListItemsCreateEntityTemplate.map((e) => {
|
445
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
446
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
447
|
-
}
|
448
|
-
});
|
449
|
-
}
|
450
|
-
initElectricGroupTemplate() {
|
451
|
-
const listItems = [
|
452
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BATTERY_ENERGY_STORAGE],
|
453
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.TRANSFORMERS],
|
454
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.ELECTRIC_METERS],
|
455
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.LIGHTINGS],
|
456
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.POWER_DISTRIBUTION_SYSTEMS],
|
457
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.SWITCH_GEARS],
|
458
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.ELECTRIC_INDUSTRIAL_MOTORS],
|
459
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GROUNDING],
|
460
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.MOTOR_CONTROLS],
|
461
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.LIGHTING_SYSTEMS],
|
462
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.ELECTRIC_HVAC],
|
463
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.REFRIGERATION_COOLING_SYSTEMS],
|
464
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PROCESS_CONTROL_AUTOMATION_SYSTEMS],
|
465
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.OFFICE_EQUIPMENT],
|
466
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COMPRESSED_AIR_SYSTEMS],
|
467
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PROCESS_EQUIPMENT_MACHINES],
|
468
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.MATERIAL_HANDLING_EQUIPMENT],
|
469
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.POWER_DISTRIBUTION_CONTROL_SYSTEMS],
|
470
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BATTERIES],
|
471
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.VARIABLE_FREQUENCY_DRIVERS],
|
472
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.ELECTRIC_FLYWHEEL_ENERGY_STORAGE],
|
473
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PUMPED_HYDRO_STORAGE],
|
474
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.THERMAL_ENERGY_STORAGE],
|
475
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.SUPER_CAPACITOR_ENERGY_STORAGE],
|
476
|
-
];
|
477
|
-
listItems.forEach((e) => {
|
478
|
-
this.makeGroupTemplate(e?.icon, e.name);
|
479
|
-
});
|
480
|
-
}
|
481
|
-
initFuelGroupTemplate() {
|
482
|
-
const listItems = [
|
483
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.DIESEL_FUELS],
|
484
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GASON_LINES],
|
485
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BIODIESELS],
|
486
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.KEROSENSE],
|
487
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PROPANES],
|
488
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.TANKER_TRUCKS],
|
489
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PIPELINE],
|
490
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_BOILERS],
|
491
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GENERATORS],
|
492
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_FURNACES],
|
493
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_OVENS],
|
494
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.INDUSTRIAL_VEHICLES_AND_EQUIPMENT],
|
495
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_METERS],
|
496
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS],
|
497
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS],
|
498
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.ELECTRIC_HVAC],
|
499
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS],
|
500
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS],
|
501
|
-
];
|
502
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].name);
|
503
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].name);
|
504
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].name);
|
505
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].name);
|
506
|
-
listItems.forEach((e) => {
|
507
|
-
this.makeGroupTemplate(e?.icon, e.name);
|
508
|
-
});
|
509
|
-
}
|
510
|
-
initGasGroupTemplate() {
|
511
|
-
const listItems = [
|
512
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COMPRESSED_NATURAL_GAS_PIPELINE],
|
513
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BOILERS_AND_HEATERS],
|
514
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FURNACES],
|
515
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.POWER_GENERATION],
|
516
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COGENERATION],
|
517
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COMBINED_CYCLE_POWER_PLANTS],
|
518
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FOR_VEHICLES_AND_EQUIPMENT],
|
519
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GAS_METERS],
|
520
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BURNERS],
|
521
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FLUE_GAS_ANALYZERS],
|
522
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COMBUSTION_CONTROL_SYSTEMS],
|
523
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GAS_STORAGE_TANKS],
|
524
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.GAS_PRESSURE_REGULATORS],
|
525
|
-
];
|
526
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_DISPENSERS].name);
|
527
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_STRORAGE_TANKS].name);
|
528
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_FILTRATIONS].name);
|
529
|
-
this.makeGroupTemplate(AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].icon, AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.FUEL_MANAGEMENTS].name);
|
530
|
-
listItems.forEach((e) => {
|
531
|
-
this.makeGroupTemplate(e?.icon, e.name);
|
532
|
-
});
|
533
|
-
}
|
534
|
-
initGasDiagram() {
|
535
|
-
const { NATURAL_GAS_PIPELINES, LIQUEFIED_NATURAL_GAS, COMPRESSED_NATURAL_GAS_PIPELINE, COMPRESSED_NATURAL_GAS_PRODUCTION, BOILERS_AND_HEATERS, FURNACES, POWER_GENERATION, COGENERATION, COMBINED_CYCLE_POWER_PLANTS, FUEL_FOR_VEHICLES_AND_EQUIPMENT, GAS_METERS, BURNERS, FLUE_GAS_ANALYZERS, COMBUSTION_CONTROL_SYSTEMS, GAS_STORAGE_TANKS, GAS_PRESSURE_REGULATORS, NATURAL_GAS, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
536
|
-
const ListItemsCreateEntityTemplate = [
|
537
|
-
NATURAL_GAS_PIPELINES,
|
538
|
-
LIQUEFIED_NATURAL_GAS,
|
539
|
-
COMPRESSED_NATURAL_GAS_PIPELINE,
|
540
|
-
COMPRESSED_NATURAL_GAS_PRODUCTION,
|
541
|
-
BOILERS_AND_HEATERS,
|
542
|
-
FURNACES,
|
543
|
-
POWER_GENERATION,
|
544
|
-
COGENERATION,
|
545
|
-
COMBINED_CYCLE_POWER_PLANTS,
|
546
|
-
FUEL_FOR_VEHICLES_AND_EQUIPMENT,
|
547
|
-
GAS_METERS,
|
548
|
-
BURNERS,
|
549
|
-
FLUE_GAS_ANALYZERS,
|
550
|
-
COMBUSTION_CONTROL_SYSTEMS,
|
551
|
-
GAS_STORAGE_TANKS,
|
552
|
-
GAS_PRESSURE_REGULATORS,
|
553
|
-
NATURAL_GAS,
|
554
|
-
];
|
555
|
-
ListItemsCreateEntityTemplate.map((e) => {
|
556
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
557
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
558
|
-
}
|
559
|
-
});
|
560
|
-
}
|
561
|
-
initFuelDiagram() {
|
562
|
-
const { DIESEL_FUELS, GASON_LINES, BIODIESELS, KEROSENSE, PROPANES, TANKER_TRUCKS, PIPELINE, INDUSTRIAL_BOILERS, GENERATORS, INDUSTRIAL_FURNACES, INDUSTRIAL_OVENS, INDUSTRIAL_VEHICLES_AND_EQUIPMENT, FUEL_METERS, FUEL_DISPENSERS, FUEL_STRORAGE_TANKS, FUEL_FILTRATIONS, FUEL_MANAGEMENTS, FUELS, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
563
|
-
const ListItemsCreateEntityTemplate = [
|
564
|
-
DIESEL_FUELS,
|
565
|
-
GASON_LINES,
|
566
|
-
BIODIESELS,
|
567
|
-
KEROSENSE,
|
568
|
-
PROPANES,
|
569
|
-
TANKER_TRUCKS,
|
570
|
-
PIPELINE,
|
571
|
-
INDUSTRIAL_BOILERS,
|
572
|
-
GENERATORS,
|
573
|
-
INDUSTRIAL_FURNACES,
|
574
|
-
INDUSTRIAL_OVENS,
|
575
|
-
INDUSTRIAL_VEHICLES_AND_EQUIPMENT,
|
576
|
-
FUEL_METERS,
|
577
|
-
FUEL_DISPENSERS,
|
578
|
-
FUEL_STRORAGE_TANKS,
|
579
|
-
FUEL_FILTRATIONS,
|
580
|
-
FUEL_MANAGEMENTS,
|
581
|
-
FUELS,
|
582
|
-
];
|
583
|
-
ListItemsCreateEntityTemplate.map((e) => {
|
584
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
585
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
586
|
-
}
|
587
|
-
});
|
588
|
-
}
|
589
|
-
initSolarDiagram() {
|
590
|
-
const { SOLAR_POWER, POWER_CONDITIONING_UNIT, BATTERIES: BATTERY, INVERTERS: INVERTER, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
591
|
-
const ListItemsCreateEntityTemplate = [
|
592
|
-
SOLAR_POWER,
|
593
|
-
POWER_CONDITIONING_UNIT,
|
594
|
-
BATTERY,
|
595
|
-
INVERTER,
|
596
|
-
];
|
597
|
-
ListItemsCreateEntityTemplate.map((e) => {
|
598
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
599
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
600
|
-
}
|
601
|
-
});
|
602
|
-
}
|
603
|
-
initSteamDiagram() {
|
604
|
-
const { VALUES, STEAM_TRAPS, PRESSURE_REGULATORS, SAFETY_VALUES_AND_EQUIPMENT, CONDENSATE_RETURN_SYSTEM, DEAERATORS, FEEDWATER_PUMPS, BLOWDOWN_TANKS, EXPANSION_TANKS, HEAT_EXCHANGERS, TURBINES, } = AtoGojsEditorModel.ENUM_TEMPLATES;
|
605
|
-
const ListItemsCreateEntityTemplate = [
|
606
|
-
VALUES,
|
607
|
-
STEAM_TRAPS,
|
608
|
-
PRESSURE_REGULATORS,
|
609
|
-
SAFETY_VALUES_AND_EQUIPMENT,
|
610
|
-
CONDENSATE_RETURN_SYSTEM,
|
611
|
-
DEAERATORS,
|
612
|
-
FEEDWATER_PUMPS,
|
613
|
-
BLOWDOWN_TANKS,
|
614
|
-
EXPANSION_TANKS,
|
615
|
-
HEAT_EXCHANGERS,
|
616
|
-
TURBINES,
|
617
|
-
];
|
618
|
-
ListItemsCreateEntityTemplate.map((e) => {
|
619
|
-
if (!!AtoGojsEditorModel.NODE_TEMPLATES[e]) {
|
620
|
-
this.makeEntityTemplateEnergy(AtoGojsEditorModel.NODE_TEMPLATES[e].icon, AtoGojsEditorModel.NODE_TEMPLATES[e].name);
|
621
|
-
}
|
622
|
-
});
|
623
|
-
}
|
624
|
-
onModelChangeListener(e) {
|
625
|
-
// this.onModelChangeListenerEvent.emit(e);
|
626
|
-
}
|
627
|
-
makeLinkTemplate() {
|
628
|
-
const elements = [];
|
629
|
-
// line
|
630
|
-
elements.push(this.$(go.Shape, {
|
631
|
-
isPanelMain: true,
|
632
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.GRAY,
|
633
|
-
strokeWidth: AtoGojsEditorModel.LINK_TEMPLATES[AtoGojsEditorModel.ENUM_LINK_TYPES.SIMPLE]?.strokeWidth,
|
634
|
-
// strokeWidth: 0,
|
635
|
-
}, new go.Binding('stroke', 'color'), new go.Binding('selectable', 'selectable'), new go.Binding('strokeWidth', 'type', (x) => AtoGojsEditorModel.LINK_TEMPLATES[x]?.strokeWidth)));
|
636
|
-
// animation
|
637
|
-
elements.push(this.$(go.Shape, {
|
638
|
-
...AtoGojsEditorModel.LINK_TEMPLATES[AtoGojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION]?.animation,
|
639
|
-
visible: true,
|
640
|
-
fill: 'transparent',
|
641
|
-
}));
|
642
|
-
elements.push(this.$(go.Panel, 'Vertical', {
|
643
|
-
height: 38,
|
644
|
-
// maxSize: new go.Size(NaN, 36),
|
645
|
-
// width: 100,
|
646
|
-
// minSize: new go.Size(100, 5), // Đặt kích thước tối thiểu là 100x50
|
647
|
-
background: 'transparent',
|
648
|
-
// layerName: 'BackgroundLayer',
|
649
|
-
// alignment: go.Spot.Top,
|
650
|
-
// alignmentFocus: go.Spot.Left,
|
651
|
-
// margin: new go.Margin(0, 0, 50, 0),
|
652
|
-
// selectable: false,
|
653
|
-
}, new go.Binding('visible', 'textComponent', (x) => {
|
654
|
-
return x ? true : false;
|
655
|
-
}),
|
656
|
-
// this.$(go.Shape, {
|
657
|
-
// height: 30,
|
658
|
-
// background: 'transparent',
|
659
|
-
// fill: 'transparent',
|
660
|
-
// // visible: false,
|
661
|
-
// }),
|
662
|
-
this.$(go.TextBlock, {
|
663
|
-
// margin: new go.Margin(0, 0, 50, 0),
|
664
|
-
stroke: '#444444',
|
665
|
-
font: 'normal 10pt Arial',
|
666
|
-
textAlign: 'left',
|
667
|
-
background: 'transparent',
|
668
|
-
// editable: false,
|
669
|
-
// alignment: go.Spot.Center, // Đảm bảo văn bản nằm ở trung tâm của nút
|
670
|
-
// alignmentFocus: go.Spot.Center, // Đảm bảo văn bản không bị dịch chuyển ra khỏi trung tâm
|
671
|
-
wrap: go.TextBlock.WrapFit, // Chuyển dòng để văn bản không vượt ra ngoài
|
672
|
-
// selectable: true,
|
673
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
674
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
675
|
-
margin: 4,
|
676
|
-
}, new go.Binding('text', 'textComponent'))),
|
677
|
-
}, new go.Binding('text', 'textComponent'), new go.Binding('background', 'textComponent', (x) => x ? 'white' : 'transparent')
|
678
|
-
// new go.Binding('margin', 'isFormat', (x) =>
|
679
|
-
// x ? new go.Margin(5, 0, 5, 5) : new go.Margin(5, 5, 5, 5),
|
680
|
-
// ),
|
681
|
-
)));
|
682
|
-
// arrow
|
683
|
-
elements.push(this.$(go.Shape, // the "from" arrowhead
|
684
|
-
{
|
685
|
-
...AtoGojsEditorModel.LINK_TEMPLATES[AtoGojsEditorModel.ENUM_LINK_TYPES.SIMPLE]?.arrow,
|
686
|
-
}, new go.Binding('visible', 'type', (x) => ![
|
687
|
-
AtoGojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION,
|
688
|
-
AtoGojsEditorModel.ENUM_LINK_TYPES.PIPE,
|
689
|
-
AtoGojsEditorModel.ENUM_LINK_TYPES.PIPE_HIDDEN,
|
690
|
-
].includes(x)), new go.Binding('fill', 'color'), new go.Binding('stroke', 'color')));
|
691
|
-
// TODO fix link cannot selected inside group template
|
692
|
-
this.myDiagram.linkTemplate = this.$(go.Link, go.Link.Orthogonal, {
|
693
|
-
// layerName: 'Background', // link cannot select inside group template
|
694
|
-
// curviness: 20,
|
695
|
-
// corner: 5,
|
696
|
-
routing: go.Link.AvoidsNodes,
|
697
|
-
reshapable: true,
|
698
|
-
resegmentable: true,
|
699
|
-
relinkableFrom: true,
|
700
|
-
relinkableTo: true,
|
701
|
-
selectable: true,
|
702
|
-
toShortLength: AtoGojsEditorModel.LINK_TEMPLATES[AtoGojsEditorModel.ENUM_LINK_TYPES.SIMPLE].toShortLength, // assume arrowhead at "to" end, need to avoid bad appearance when path is thick
|
703
|
-
}, new go.Binding('layerName', '', (data) => {
|
704
|
-
return data?.textComponent ? 'Background' : '';
|
705
|
-
}), new go.Binding('zOrder', 'type', (x) => x === AtoGojsEditorModel.ENUM_LINK_TYPES.PIPE_ANIMATION ? 11 : 10), new go.Binding('toShortLength', 'type', (x) => AtoGojsEditorModel.LINK_TEMPLATES[x].toShortLength || 0), new go.Binding('selectable', 'selectable'), new go.Binding('visible', 'visible'),
|
706
|
-
// make sure links come in from the proper direction and go out appropriately
|
707
|
-
...elements);
|
708
|
-
}
|
709
|
-
makeValueNodeTemplate(size = { w: 82, h: 36 }) {
|
710
|
-
const self = this;
|
711
|
-
const node = this.$(go.Node, 'Spot', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { minSize: new go.Size(size.w, size.h) }, this.$(go.Shape, 'Rectangle', {
|
712
|
-
fill: AtoGojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
|
713
|
-
stroke: 'transparent',
|
714
|
-
}), this.$(go.Panel, 'Horizontal', this.$(go.TextBlock, {
|
715
|
-
row: 2,
|
716
|
-
font: 'bold 14px Arial',
|
717
|
-
textAlign: 'center',
|
718
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
719
|
-
}, new go.Binding('editable', 'isEditable'), new go.Binding('text', 'shortenedNumber').makeTwoWay(), new go.Binding('stroke', 'color'), new go.Binding('margin', 'isFormat', (x) => x ? new go.Margin(5, 0, 5, 5) : new go.Margin(5, 5, 5, 5)), new go.Binding('visible', '', function (data) {
|
720
|
-
return data.value !== VALUE_NA;
|
721
|
-
})),
|
722
|
-
// Icon Err when lack of value
|
723
|
-
this.$(go.TextBlock, {
|
724
|
-
margin: new go.Margin(10, 10, 10, 10),
|
725
|
-
text: VALUE_NA, // Old version: TEXT_ERROR
|
726
|
-
textAlign: 'center',
|
727
|
-
font: 'bold 10pt sans-serif',
|
728
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.SALMON,
|
729
|
-
wrap: go.TextBlock.WrapFit,
|
730
|
-
editable: false,
|
731
|
-
isMultiline: false,
|
732
|
-
}, new go.Binding('visible', '', function (data) {
|
733
|
-
return data.value === VALUE_NA;
|
734
|
-
})))));
|
735
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.VALUE_NODE, node);
|
736
|
-
}
|
737
|
-
makeEmptyNodeTemplate(size = { w: 0, h: 0 }) {
|
738
|
-
const node = this.$(go.Node, 'Spot', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify));
|
739
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.EMPTY, node);
|
740
|
-
}
|
741
|
-
makeValueLabelTemplate(size = { w: 82, h: 36 }) {
|
742
|
-
const node = this.$(go.Node, 'Auto', {
|
743
|
-
movable: false,
|
744
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { minSize: new go.Size(size.w, size.h) }, this.$(go.Panel, 'Horizontal', {
|
745
|
-
margin: new go.Margin(0, 10, 0, 10),
|
746
|
-
}, this.$(go.TextBlock, {
|
747
|
-
margin: new go.Margin(0, 5, 10, 0),
|
748
|
-
textAlign: 'center',
|
749
|
-
font: 'bold 15px sans-serif',
|
750
|
-
wrap: go.TextBlock.WrapFit,
|
751
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
752
|
-
minSize: new go.Size(150, 30), // Set the width of the text block
|
753
|
-
}, new go.Binding('stroke', 'color'), new go.Binding('text', 'data', (x) => {
|
754
|
-
if (typeof x?.quantity !== 'number') {
|
755
|
-
return '';
|
756
|
-
}
|
757
|
-
const formatted = UtilsService.convertPrefixesData({
|
758
|
-
value: x?.quantity,
|
759
|
-
unit: UtilsService.convertSpecialUnit(x?.unit),
|
760
|
-
});
|
761
|
-
let retValue = formatted.shortenedNumber +
|
762
|
-
' ' +
|
763
|
-
formatted.unitPrefixes +
|
764
|
-
UtilsService.convertSpecialUnit(x?.unit) ?? '';
|
765
|
-
if (x?.percent) {
|
766
|
-
retValue += ` (${x?.percent}%)`;
|
767
|
-
}
|
768
|
-
return retValue;
|
769
|
-
}), new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')))));
|
770
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.VALUE_LABEL, node);
|
771
|
-
}
|
772
|
-
makeTextLabelTemplate(size = { w: NaN, h: 20 }) {
|
773
|
-
const node = this.$(go.Node, 'Auto', {
|
774
|
-
movable: false,
|
775
|
-
isSelected: false,
|
776
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', this.$(go.Panel, 'Horizontal', this.$(go.TextBlock, {
|
777
|
-
margin: new go.Margin(0, 5, 10, 0),
|
778
|
-
textAlign: 'center',
|
779
|
-
font: 'bold 16px Arial',
|
780
|
-
wrap: go.TextBlock.WrapFit,
|
781
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
782
|
-
}, new go.Binding('stroke', 'color'), new go.Binding('text', 'name'), new go.Binding('visible', 'visible')))));
|
783
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_LABEL, node);
|
784
|
-
}
|
785
|
-
makeTextTemplate(size = {
|
786
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
787
|
-
h: AtoGojsEditorModel.GRID_SIZE * 2,
|
788
|
-
}) {
|
789
|
-
const self = this;
|
790
|
-
const contextMenu = this.$(go.Adornment, 'Vertical', this.$('ContextMenuButton', this.$(go.TextBlock, 'Option 1'), {
|
791
|
-
click: function (e, obj) {
|
792
|
-
alert('Option 1 clicked!');
|
793
|
-
},
|
794
|
-
}), this.$('ContextMenuButton', this.$(go.TextBlock, 'Option 2'), {
|
795
|
-
click: function (e, obj) {
|
796
|
-
alert('Option 2 clicked!');
|
797
|
-
},
|
798
|
-
})
|
799
|
-
// ... add more options as needed ...
|
800
|
-
);
|
801
|
-
const node = this.$(go.Node, 'Spot', {
|
802
|
-
// fromSpot: go.Spot.RightSide,
|
803
|
-
// toSpot: go.Spot.LeftSide,
|
804
|
-
locationSpot: go.Spot.Center,
|
805
|
-
// selectionChanged: (e) => {
|
806
|
-
// if (e?.data.onSelected) {
|
807
|
-
// e?.data.onSelected(e?.data);
|
808
|
-
// }
|
809
|
-
// },
|
810
|
-
// mouseHover: (e, obj) => {
|
811
|
-
// const node = obj.part;
|
812
|
-
// if ((obj as any).part?.ob?.value === VALUE_NA) {
|
813
|
-
// self.onHoverInfoButton.emit({
|
814
|
-
// left: e?.['Wr']?.x + 8,
|
815
|
-
// top: e?.['Wr']?.y,
|
816
|
-
// node: node,
|
817
|
-
// });
|
818
|
-
// }
|
819
|
-
// },
|
820
|
-
// mouseLeave: (e, obj) => {
|
821
|
-
// if ((obj as any).part?.ob?.value === VALUE_NA) {
|
822
|
-
// self.onHoverInfoButton.emit(null);
|
823
|
-
// }
|
824
|
-
// },
|
825
|
-
click: (e, obj) => {
|
826
|
-
const node = obj.part;
|
827
|
-
if (node?.ob?.isTypeInflowOfPlantCell) {
|
828
|
-
// obj?.data?.onSelected(node?.ob?.nodePlantCellParent);
|
829
|
-
// self.onClickCompoent.emit({
|
830
|
-
// left: e?.['Wr']?.x,
|
831
|
-
// top: e?.['Wr']?.y,
|
832
|
-
// node: {
|
833
|
-
// ob: node?.ob?.nodePlantCellParent,
|
834
|
-
// },
|
835
|
-
// component: node?.ob?.nodePlantCellParent,
|
836
|
-
// });
|
837
|
-
return;
|
838
|
-
}
|
839
|
-
if (this._initialOptions?.isReadOnly) {
|
840
|
-
this.isShowNodeInfo
|
841
|
-
? self.onClickInfoButton.emit({
|
842
|
-
left: e?.['Wr']?.x,
|
843
|
-
top: e?.['Wr']?.y,
|
844
|
-
node: node,
|
845
|
-
})
|
846
|
-
: null;
|
847
|
-
}
|
848
|
-
},
|
849
|
-
doubleClick: (e, obj) => {
|
850
|
-
const node = obj.part;
|
851
|
-
if (node?.ob?.isTypeInflowOfPlantCell &&
|
852
|
-
!this._initialOptions?.isReadOnly) {
|
853
|
-
// obj?.data?.onSelected(node?.ob?.nodePlantCellParent);
|
854
|
-
// this.isShowNodeInfo
|
855
|
-
// ? self.onDoubleClickNode.emit({
|
856
|
-
// left: e?.['Wr']?.x,
|
857
|
-
// top: e?.['Wr']?.y,
|
858
|
-
// node: {
|
859
|
-
// ob: node?.ob?.nodePlantCellParent,
|
860
|
-
// },
|
861
|
-
// })
|
862
|
-
// : null;
|
863
|
-
return;
|
864
|
-
}
|
865
|
-
if (!this._initialOptions?.isReadOnly) {
|
866
|
-
this.isShowNodeInfo
|
867
|
-
? self.onClickInfoButton.emit({
|
868
|
-
left: e?.['Wr']?.x,
|
869
|
-
top: e?.['Wr']?.y,
|
870
|
-
node: node,
|
871
|
-
})
|
872
|
-
: null;
|
873
|
-
}
|
874
|
-
},
|
875
|
-
selectionAdornmentTemplate: this.$(go.Adornment, 'Spot', this.$(go.Panel, 'Auto',
|
876
|
-
// { height: 62 },
|
877
|
-
this.$(go.Shape, {
|
878
|
-
fill: null,
|
879
|
-
stroke: 'dodgerblue',
|
880
|
-
strokeWidth: 4,
|
881
|
-
}), this.$(go.Placeholder,
|
882
|
-
// { padding: new go.Margin(8, 3, 0, 3) },
|
883
|
-
new go.Binding('padding', '', (x) => {
|
884
|
-
return x?.isTypeInflowOfPlantCell
|
885
|
-
? x?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.INFLOW
|
886
|
-
? new go.Margin(0, 0, 0, 20)
|
887
|
-
: new go.Margin(0, 20, 0, 0)
|
888
|
-
: null;
|
889
|
-
})),
|
890
|
-
// this.$(go.Placeholder, { padding: 3 }),
|
891
|
-
new go.Binding('height', '', (x) => {
|
892
|
-
return x?.isTypeInflowOfPlantCell ? x?.height + 10 : null;
|
893
|
-
}), new go.Binding('width', '', (x) => {
|
894
|
-
return x?.isTypeInflowOfPlantCell ? x?.width + 12 : null;
|
895
|
-
})), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom },
|
896
|
-
// more
|
897
|
-
!this._initialOptions.isReadOnly
|
898
|
-
? this.generateActionGroup([
|
899
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
900
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT,
|
901
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
902
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
903
|
-
])
|
904
|
-
: {})),
|
905
|
-
}, new go.Binding('visible', 'visible'), new go.Binding('fromSpot', 'fromSpot'), new go.Binding('toSpot', 'toSpot'), new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
|
906
|
-
// new go.Binding('alignment', 'alignment', function(loc) {
|
907
|
-
// return new go.Spot(0, 0, loc.x, 0);
|
908
|
-
// }).ofObject(),
|
909
|
-
this.$(go.Panel, 'Auto', {
|
910
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
911
|
-
margin: 2,
|
912
|
-
}, new go.Binding('text', '', function (data) {
|
913
|
-
if (!self._initialOptions.isReadOnly) {
|
914
|
-
return data?.name ?? VALUE_NA;
|
915
|
-
}
|
916
|
-
if (data?.value === VALUE_NA || _.isNil(data?.value)) {
|
917
|
-
return NO_DATA;
|
918
|
-
// return TEXT_UNKNOWN;
|
919
|
-
}
|
920
|
-
return _.round(data?.value, 2).toFixed(2);
|
921
|
-
}).makeTwoWay())),
|
922
|
-
}, this.$(go.Panel, 'Table', this.arrowForPlantCell(size, ATO_ENUM_FLOW_DIRECTION.OUTFLOW), this.$(go.Panel, 'Auto',
|
923
|
-
// { width: size.w, height: size.h },
|
924
|
-
{
|
925
|
-
// minSize: new go.Size(size.w, size.h),
|
926
|
-
// maxSize: new go.Size(size.w, size.h),
|
927
|
-
desiredSize: new go.Size(size.w, size.h),
|
928
|
-
column: 1,
|
929
|
-
row: 2,
|
930
|
-
}, new go.Binding('width', 'width'), new go.Binding('height', 'height'), this.$(go.Shape, 'RoundedRectangle', {
|
931
|
-
fill: AtoGojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
|
932
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
933
|
-
name: 'textNodeShape',
|
934
|
-
}, new go.Binding('fill', 'fill'), new go.Binding('stroke', 'stroke')), this.$(go.Panel, 'Vertical', this.$(go.Panel, 'Horizontal', { alignment: go.Spot.Center },
|
935
|
-
// Alert
|
936
|
-
this.$(go.Panel, 'Auto', {
|
937
|
-
margin: new go.Margin(0, 0, 0, 5),
|
938
|
-
visible: false,
|
939
|
-
}, new go.Binding('visible', 'recommendation'), this.$(go.Shape, 'Circle', {
|
940
|
-
fill: '#E95F47',
|
941
|
-
stroke: '#E95F47',
|
942
|
-
width: 15,
|
943
|
-
height: 15,
|
944
|
-
}), this.$(go.TextBlock, {
|
945
|
-
text: '\uf649',
|
946
|
-
margin: new go.Margin(1.5, 0, 0, 0),
|
947
|
-
font: '8px "Font Awesome 6 Pro"',
|
948
|
-
stroke: '#fff',
|
949
|
-
})), this._initialOptions.isReadOnly
|
950
|
-
? this.$(go.Panel, 'Position', {
|
951
|
-
width: 18,
|
952
|
-
height: 15,
|
953
|
-
visible: false,
|
954
|
-
alignment: go.Spot.Center,
|
955
|
-
margin: new go.Margin(0, 0, 0, 5),
|
956
|
-
mouseEnter: (e, obj) => {
|
957
|
-
self.onHoverAlert.emit({
|
958
|
-
left: e?.['Wr']?.x + 8,
|
959
|
-
top: e?.['Wr']?.y,
|
960
|
-
messageAlert: obj.part?.ob?.messageAlert,
|
961
|
-
});
|
962
|
-
},
|
963
|
-
mouseLeave: (e, obj) => {
|
964
|
-
self.onHoverAlert.emit(null);
|
965
|
-
},
|
966
|
-
}, new go.Binding('visible', 'alert'), this.$(go.Picture, ICON_ALERT, {
|
967
|
-
alignment: go.Spot.Center,
|
968
|
-
maxSize: new go.Size(30, 30),
|
969
|
-
imageStretch: go.GraphObject.Uniform,
|
970
|
-
}))
|
971
|
-
: {}), this.$(go.Panel, 'Auto', this.$(go.TextBlock, {
|
972
|
-
name: 'textBlockValue',
|
973
|
-
row: 2,
|
974
|
-
editable: false,
|
975
|
-
desiredSize: new go.Size(size.w - 8, 18),
|
976
|
-
font: 'bold 22px Arial',
|
977
|
-
textAlign: 'center',
|
978
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.GRAY,
|
979
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
980
|
-
},
|
981
|
-
// new go.Binding('editable', 'isEditable'),
|
982
|
-
new go.Binding('angle', 'angle'), new go.Binding('margin', '', (data) => {
|
983
|
-
if (data?.alert) {
|
984
|
-
return new go.Margin(0, 0, 0, 0);
|
985
|
-
}
|
986
|
-
return new go.Margin(0, 0, 0, 0);
|
987
|
-
}), new go.Binding('stroke', 'color'), new go.Binding('text', '', function (data) {
|
988
|
-
return self.getTextDataBox(data);
|
989
|
-
}).makeTwoWay(), new go.Binding('visible', '', (data) => !data?.isHiddenValue)))), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false)), this.arrowForPlantCell(size, ATO_ENUM_FLOW_DIRECTION.INFLOW))));
|
990
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE, node);
|
991
|
-
}
|
992
|
-
arrowForPlantCell(size, flowDirection) {
|
993
|
-
return this.$(go.Panel, 'Table', {
|
994
|
-
height: size.h,
|
995
|
-
}, new go.Binding('height', 'height'), new go.Binding('visible', '', (data) => data?.flowOfPlantCell === flowDirection), {
|
996
|
-
column: flowDirection === ATO_ENUM_FLOW_DIRECTION.OUTFLOW ? 0 : 2,
|
997
|
-
row: 2,
|
998
|
-
}, new go.Binding('itemArray', 'dataLinkArray'), {
|
999
|
-
itemTemplate: this.$(go.Panel, new go.Binding('row', 'indexRow'),
|
1000
|
-
// new go.Binding('height', 'height'),
|
1001
|
-
this.$(go.Picture, ARROW, {
|
1002
|
-
alignment: go.Spot.Center,
|
1003
|
-
maxSize: new go.Size(20, 40),
|
1004
|
-
// imageStretch: go.GraphObject.Uniform,
|
1005
|
-
}, new go.Binding('source', '', (data, panel) => {
|
1006
|
-
// panel.part?.data?.id
|
1007
|
-
return data?.isCreated ? panel?.$p : ARROW_GRAY;
|
1008
|
-
}))),
|
1009
|
-
});
|
1010
|
-
}
|
1011
|
-
getTextDataBox(data) {
|
1012
|
-
if (data?.value === VALUE_NA) {
|
1013
|
-
return TEXT_UNKNOWN;
|
1014
|
-
}
|
1015
|
-
return `${data?.shortenedNumber}${data?.unitPrefixes ? ' ' + data?.unitPrefixes : ''}`;
|
1016
|
-
}
|
1017
|
-
makeDataBoxTemplate(size = {
|
1018
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
1019
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
1020
|
-
}) {
|
1021
|
-
const self = this;
|
1022
|
-
let node = this.$(go.Node, 'Spot', {
|
1023
|
-
locationSpot: go.Spot.Center,
|
1024
|
-
mouseOver: function (e, obj) { },
|
1025
|
-
click: (e, obj) => {
|
1026
|
-
if (obj?.data?.onSelected) {
|
1027
|
-
obj?.data?.onSelected(obj?.data);
|
1028
|
-
}
|
1029
|
-
},
|
1030
|
-
selectionChanged: (e) => {
|
1031
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
1032
|
-
e?.data?.onSelected(null);
|
1033
|
-
}
|
1034
|
-
},
|
1035
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', this.$(go.Panel, 'Table', {
|
1036
|
-
mouseHover: (e, obj) => {
|
1037
|
-
if (obj.part?.ob?.value === VALUE_NA) {
|
1038
|
-
self.onHoverInfoButton.emit({
|
1039
|
-
left: e?.['Wr']?.x + 8,
|
1040
|
-
top: e?.['Wr']?.y,
|
1041
|
-
node: node,
|
1042
|
-
});
|
1043
|
-
}
|
1044
|
-
},
|
1045
|
-
mouseLeave: (e, obj) => {
|
1046
|
-
if (obj.part?.ob?.value === VALUE_NA) {
|
1047
|
-
self.onHoverInfoButton.emit(null);
|
1048
|
-
}
|
1049
|
-
},
|
1050
|
-
}, this.$(go.Panel, 'Auto', { row: 0, stretch: go.GraphObject.Horizontal }, this.$(go.Shape, 'Rectangle', {
|
1051
|
-
fill: AtoGojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
|
1052
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
1053
|
-
}, new go.Binding('fill', 'color')), this.$(go.TextBlock, {
|
1054
|
-
row: 0,
|
1055
|
-
margin: new go.Margin(10, 10, 5, 10),
|
1056
|
-
maxSize: new go.Size(size.w, NaN),
|
1057
|
-
stroke: 'white',
|
1058
|
-
font: 'normal 10pt Arial',
|
1059
|
-
textAlign: 'center',
|
1060
|
-
spacingBelow: 5,
|
1061
|
-
}, new go.Binding('text', 'name').makeTwoWay())), this.$(go.Panel, 'Auto', { row: 1, stretch: go.GraphObject.Horizontal }, this.$(go.Shape, 'Rectangle', {
|
1062
|
-
fill: AtoGojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
|
1063
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
1064
|
-
}), this.$(go.Panel, 'Horizontal', this.$(go.TextBlock, {
|
1065
|
-
row: 2,
|
1066
|
-
// editable: true,
|
1067
|
-
// maxSize: new go.Size(size.w - 10, 40),
|
1068
|
-
// minSize: new go.Size(size.w - 10, size.h),
|
1069
|
-
margin: new go.Margin(5, 0, 5, 5),
|
1070
|
-
font: 'bold 12pt Arial',
|
1071
|
-
textAlign: 'center',
|
1072
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.GRAY,
|
1073
|
-
}, new go.Binding('editable', 'isEditable'), new go.Binding('text', 'shortenedNumber').makeTwoWay(), new go.Binding('stroke', 'color'), new go.Binding('visible', '', function (data) {
|
1074
|
-
return data.value !== VALUE_NA;
|
1075
|
-
})), this.$(go.TextBlock, {
|
1076
|
-
row: 2,
|
1077
|
-
// editable: true,
|
1078
|
-
// maxSize: new go.Size(size.w - 10, 40),
|
1079
|
-
// minSize: new go.Size(size.w - 10, size.h),
|
1080
|
-
margin: new go.Margin(5, 5, 5, 0),
|
1081
|
-
font: 'bold 12pt Arial',
|
1082
|
-
textAlign: 'center',
|
1083
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.GRAY,
|
1084
|
-
}, new go.Binding('visible', '', function (data) {
|
1085
|
-
return data.value !== VALUE_NA;
|
1086
|
-
}), new go.Binding('text', 'unitPrefixes'), new go.Binding('stroke', 'color')),
|
1087
|
-
// Icon Err when lack of value
|
1088
|
-
this.$(go.TextBlock, {
|
1089
|
-
margin: new go.Margin(10, 10, 10, 10),
|
1090
|
-
text: VALUE_NA, // Old version: TEXT_ERROR
|
1091
|
-
textAlign: 'center',
|
1092
|
-
font: 'bold 10pt sans-serif',
|
1093
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.SALMON,
|
1094
|
-
wrap: go.TextBlock.WrapFit,
|
1095
|
-
editable: false,
|
1096
|
-
isMultiline: false,
|
1097
|
-
}, new go.Binding('visible', '', function (data) {
|
1098
|
-
return data.value === VALUE_NA;
|
1099
|
-
})))))), this.$(go.Panel, 'Vertical', {
|
1100
|
-
alignment: go.Spot.Left,
|
1101
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
1102
|
-
}), this.$(go.Panel, 'Vertical', {
|
1103
|
-
alignment: go.Spot.Right,
|
1104
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
1105
|
-
}),
|
1106
|
-
// four named ports, one on each side:
|
1107
|
-
this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
1108
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.DATA_BOX, node);
|
1109
|
-
}
|
1110
|
-
showPoint(loc) {
|
1111
|
-
const docLoc = this.myDiagram.transformDocToView(loc);
|
1112
|
-
}
|
1113
|
-
makeEntityTemplate(icon, title, size = {
|
1114
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
1115
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
1116
|
-
}) {
|
1117
|
-
const self = this;
|
1118
|
-
let node = this.$(go.Node, 'Spot', {
|
1119
|
-
locationSpot: go.Spot.Center,
|
1120
|
-
mouseOver: function (e, obj) {
|
1121
|
-
// self.showPoint(obj?.part?.location);
|
1122
|
-
},
|
1123
|
-
click: (e, obj) => {
|
1124
|
-
if (obj?.data?.onSelected) {
|
1125
|
-
obj?.data?.onSelected(obj?.data);
|
1126
|
-
self.onClickCompoent.emit({
|
1127
|
-
left: e?.['Wr']?.x,
|
1128
|
-
top: e?.['Wr']?.y,
|
1129
|
-
node: node,
|
1130
|
-
component: obj?.data,
|
1131
|
-
});
|
1132
|
-
}
|
1133
|
-
},
|
1134
|
-
selectionChanged: (e) => {
|
1135
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
1136
|
-
e?.data?.onSelected(null);
|
1137
|
-
}
|
1138
|
-
},
|
1139
|
-
selectionAdornmentTemplate: this._initialOptions.isReadOnly
|
1140
|
-
? null
|
1141
|
-
: this.$(go.Adornment, 'Spot', {
|
1142
|
-
shadowVisible: true,
|
1143
|
-
shadowBlur: 6,
|
1144
|
-
shadowOffset: new go.Point(0, 2),
|
1145
|
-
shadowColor: '#00000029',
|
1146
|
-
}, this.$(go.Panel, 'Auto', this.$(go.Shape, {
|
1147
|
-
fill: null,
|
1148
|
-
stroke: 'dodgerblue',
|
1149
|
-
strokeWidth: 4,
|
1150
|
-
}), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
|
1151
|
-
alignment: go.Spot.TopRight,
|
1152
|
-
alignmentFocus: go.Spot.Bottom,
|
1153
|
-
background: 'white',
|
1154
|
-
},
|
1155
|
-
// more
|
1156
|
-
!this._initialOptions.isReadOnly
|
1157
|
-
? this.generateActionGroup([
|
1158
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.RO_WATER_TREATMENT].name,
|
1159
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.COOLING_TOWER].name,
|
1160
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.BOILER].name,
|
1161
|
-
].includes(title)
|
1162
|
-
? [
|
1163
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
1164
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS,
|
1165
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.ASSET_PARAMETERS,
|
1166
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
1167
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
1168
|
-
]
|
1169
|
-
: [
|
1170
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
1171
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
|
1172
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
1173
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
1174
|
-
])
|
1175
|
-
: {})),
|
1176
|
-
},
|
1177
|
-
// new go.Binding('location', 'loc', go.Point.parse),
|
1178
|
-
new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), new go.Binding('visible', 'visible'), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
|
1179
|
-
fill: 'white',
|
1180
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
1181
|
-
strokeWidth: 1,
|
1182
|
-
// strokeDashArray: [5, 5],
|
1183
|
-
}), this.$(go.Panel, 'Table', this.$(go.Picture, icon, {
|
1184
|
-
row: 1,
|
1185
|
-
alignment: go.Spot.Center,
|
1186
|
-
desiredSize: new go.Size(size.w - 20, size.h - 50),
|
1187
|
-
// maxSize: new go.Size(60, 60),
|
1188
|
-
imageStretch: go.GraphObject.Uniform,
|
1189
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1190
|
-
margin: 4,
|
1191
|
-
text: title,
|
1192
|
-
})),
|
1193
|
-
}), this.$(go.TextBlock, {
|
1194
|
-
row: 2,
|
1195
|
-
margin: new go.Margin(10, 0, 3, 0),
|
1196
|
-
editable: true,
|
1197
|
-
desiredSize: new go.Size(size.w - 20, 15),
|
1198
|
-
stroke: '#000D42',
|
1199
|
-
font: 'bold 10pt Arial',
|
1200
|
-
textAlign: 'center',
|
1201
|
-
// wrap: go.TextBlock.None,
|
1202
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
1203
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))),
|
1204
|
-
}, new go.Binding('text', 'name').makeTwoWay(), new go.Binding('editable', '', (data) => {
|
1205
|
-
return !(AtoGojsEditorModel.TYPE_COMPONENT_WATER?.includes(data?.systemType) &&
|
1206
|
-
data?.topologyType !== ATO_ECOMPONENT_PLANT_TYPE.WATER &&
|
1207
|
-
data?.topologyType !==
|
1208
|
-
ATO_ECOMPONENT_PLANT_TYPE.WATER_PLANT_CELL);
|
1209
|
-
})))), this.$(go.Panel, 'Vertical', {
|
1210
|
-
alignment: go.Spot.Left,
|
1211
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
1212
|
-
}), this.$(go.Panel, 'Vertical', {
|
1213
|
-
alignment: go.Spot.Right,
|
1214
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
1215
|
-
}), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
1216
|
-
this.myDiagram.nodeTemplateMap.set(title, node);
|
1217
|
-
}
|
1218
|
-
makeEntityTemplateEnergy(icon, title, size = {
|
1219
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
1220
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
1221
|
-
}) {
|
1222
|
-
const self = this;
|
1223
|
-
let node = this.$(go.Node, 'Spot', {
|
1224
|
-
locationSpot: go.Spot.Center,
|
1225
|
-
mouseOver: function (e, obj) {
|
1226
|
-
// self.showPoint(obj?.part?.location);
|
1227
|
-
},
|
1228
|
-
click: (e, obj) => {
|
1229
|
-
if (obj?.data?.onSelected) {
|
1230
|
-
obj?.data?.onSelected(obj?.data);
|
1231
|
-
}
|
1232
|
-
},
|
1233
|
-
selectionChanged: (e) => {
|
1234
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
1235
|
-
e?.data?.onSelected(null);
|
1236
|
-
}
|
1237
|
-
},
|
1238
|
-
selectionAdornmentTemplate: this._initialOptions.isReadOnly
|
1239
|
-
? null
|
1240
|
-
: this.$(go.Adornment, 'Spot', {
|
1241
|
-
shadowVisible: true,
|
1242
|
-
shadowBlur: 6,
|
1243
|
-
shadowOffset: new go.Point(0, 2),
|
1244
|
-
shadowColor: '#00000029',
|
1245
|
-
}, this.$(go.Panel, 'Auto', this.$(go.Shape, {
|
1246
|
-
fill: null,
|
1247
|
-
stroke: 'dodgerblue',
|
1248
|
-
strokeWidth: 4,
|
1249
|
-
}), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
|
1250
|
-
alignment: go.Spot.TopRight,
|
1251
|
-
alignmentFocus: go.Spot.Bottom,
|
1252
|
-
background: 'white',
|
1253
|
-
},
|
1254
|
-
// more
|
1255
|
-
this.generateActionGroup([
|
1256
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
1257
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
|
1258
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
1259
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
1260
|
-
]))),
|
1261
|
-
}, new go.Binding('visible', 'visible'), new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
|
1262
|
-
fill: 'white',
|
1263
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
1264
|
-
// strokeDashArray: [5, 5],
|
1265
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, AtoGojsEditorModel.TEMPLATE_DUPLICATE[title] ?? title, {
|
1266
|
-
row: 0,
|
1267
|
-
margin: new go.Margin(3, 3, 10, 3),
|
1268
|
-
maxSize: new go.Size(size.w - 20, 15),
|
1269
|
-
stroke: '#444444',
|
1270
|
-
font: 'normal 10pt Arial',
|
1271
|
-
textAlign: 'center',
|
1272
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1273
|
-
margin: 4,
|
1274
|
-
text: title,
|
1275
|
-
})),
|
1276
|
-
}), this.$(go.Picture, icon, {
|
1277
|
-
row: 1,
|
1278
|
-
alignment: go.Spot.Center,
|
1279
|
-
desiredSize: new go.Size(size.w - 20, size.h - 65),
|
1280
|
-
imageStretch: go.GraphObject.Uniform,
|
1281
|
-
}), this.$(go.TextBlock, {
|
1282
|
-
row: 2,
|
1283
|
-
margin: new go.Margin(10, 3, 3, 3),
|
1284
|
-
editable: true,
|
1285
|
-
maxSize: new go.Size(size.w - 20, 15),
|
1286
|
-
stroke: '#2C2C2C',
|
1287
|
-
font: 'bold 10pt Arial',
|
1288
|
-
textAlign: 'center',
|
1289
|
-
// wrap: go.TextBlock.None,
|
1290
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
1291
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1292
|
-
margin: 4,
|
1293
|
-
}, new go.Binding('text', 'name').makeTwoWay())),
|
1294
|
-
}, new go.Binding('text', 'name').makeTwoWay()))), this.$(go.Panel, 'Vertical', {
|
1295
|
-
alignment: go.Spot.Left,
|
1296
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
1297
|
-
}), this.$(go.Panel, 'Vertical', {
|
1298
|
-
alignment: go.Spot.Right,
|
1299
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
1300
|
-
}),
|
1301
|
-
// four named ports, one on each side:
|
1302
|
-
this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
1303
|
-
this.myDiagram.nodeTemplateMap.set(title, node);
|
1304
|
-
}
|
1305
|
-
// Plant Cell
|
1306
|
-
plantCellTemplate(icon, title, size = {
|
1307
|
-
w: 260,
|
1308
|
-
h: AtoGojsEditorModel.PLANT_CELL_HEIGHT,
|
1309
|
-
}) {
|
1310
|
-
const self = this;
|
1311
|
-
let node = this.$(go.Group, 'Spot', {
|
1312
|
-
locationSpot: go.Spot.Center,
|
1313
|
-
mouseOver: function (e, obj) {
|
1314
|
-
// self.showPoint(obj?.part?.location);
|
1315
|
-
},
|
1316
|
-
mouseEnter: (e, obj) => {
|
1317
|
-
// self.onHoverAlert.emit({
|
1318
|
-
// left: e?.['Wr']?.x + 8,
|
1319
|
-
// top: e?.['Wr']?.y,
|
1320
|
-
// messageAlert: (obj as any).part?.ob?.messageAlert,
|
1321
|
-
// });
|
1322
|
-
const node = obj.part;
|
1323
|
-
self.onHoverInfoButton.emit({
|
1324
|
-
left: e?.['Wr']?.x + 8,
|
1325
|
-
top: e?.['Wr']?.y,
|
1326
|
-
node: node,
|
1327
|
-
});
|
1328
|
-
let shape = node?.findObject('SHAPE_KEY'); // Thay 'SHAPE_KEY' bằng khóa bạn đặt cho hình Shape
|
1329
|
-
// debugger;
|
1330
|
-
if (shape) {
|
1331
|
-
shape.stroke = 'blue'; // Thay đổi màu stroke thành blue
|
1332
|
-
}
|
1333
|
-
},
|
1334
|
-
mouseLeave: (e, obj) => {
|
1335
|
-
self.onHoverInfoButton.emit(null);
|
1336
|
-
// self.onHoverAlert.emit(null);
|
1337
|
-
},
|
1338
|
-
click: (e, obj) => {
|
1339
|
-
if (obj?.data?.onSelected) {
|
1340
|
-
obj?.data?.onSelected(obj?.data);
|
1341
|
-
self.onClickCompoent.emit({
|
1342
|
-
left: e?.['Wr']?.x,
|
1343
|
-
top: e?.['Wr']?.y,
|
1344
|
-
node: node,
|
1345
|
-
component: obj?.data,
|
1346
|
-
});
|
1347
|
-
}
|
1348
|
-
},
|
1349
|
-
doubleClick: (e, obj) => {
|
1350
|
-
if (!this._initialOptions?.isReadOnly) {
|
1351
|
-
const node = obj.part;
|
1352
|
-
this.isShowNodeInfo
|
1353
|
-
? self.onDoubleClickNode.emit({
|
1354
|
-
left: e?.['Wr']?.x,
|
1355
|
-
top: e?.['Wr']?.y,
|
1356
|
-
node: node,
|
1357
|
-
})
|
1358
|
-
: null;
|
1359
|
-
}
|
1360
|
-
},
|
1361
|
-
// Todo
|
1362
|
-
selectionChanged: (e) => {
|
1363
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
1364
|
-
e?.data?.onSelected(null);
|
1365
|
-
}
|
1366
|
-
},
|
1367
|
-
selectionAdornmentTemplate: this._initialOptions.isReadOnly
|
1368
|
-
? null
|
1369
|
-
: this.$(go.Adornment, 'Spot', {
|
1370
|
-
shadowVisible: true,
|
1371
|
-
shadowBlur: 6,
|
1372
|
-
shadowOffset: new go.Point(0, 2),
|
1373
|
-
shadowColor: '#00000029',
|
1374
|
-
}, this.$(go.Panel, 'Auto', { width: 170 }, this.$(go.Shape, {
|
1375
|
-
fill: null,
|
1376
|
-
stroke: 'dodgerblue',
|
1377
|
-
strokeWidth: 4,
|
1378
|
-
}), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom },
|
1379
|
-
// more
|
1380
|
-
this.generateActionGroup([
|
1381
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
1382
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.CHANGE_ICON,
|
1383
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.ONLY_DETAILS,
|
1384
|
-
// DefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
1385
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
1386
|
-
])
|
1387
|
-
// new go.Binding('visible', 'isNotAction', (x) => !x),
|
1388
|
-
)
|
1389
|
-
// this.$(
|
1390
|
-
// go.Panel,
|
1391
|
-
// 'Horizontal',
|
1392
|
-
// { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom },
|
1393
|
-
// this.generateActionGroup([DefaultGojsEditor.ENUM_ACTIONS.ONLY_DETAILS]),
|
1394
|
-
// new go.Binding('visible', '', (x) => {
|
1395
|
-
// return x?.isOnlyDetails && !x?.isNotAction ? true : false;
|
1396
|
-
// }),
|
1397
|
-
// ),
|
1398
|
-
),
|
1399
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h },
|
1400
|
-
// this.$(go.Shape, 'RoundedRectangle', {
|
1401
|
-
// fill: 'white',
|
1402
|
-
// stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
1403
|
-
// // strokeDashArray: [5, 5],
|
1404
|
-
// }),
|
1405
|
-
// this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0), visible: false }),
|
1406
|
-
this.$(go.Panel, 'Auto', {
|
1407
|
-
alignmentFocus: go.Spot.Center,
|
1408
|
-
margin: new go.Margin(0, 50, 0, 50),
|
1409
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
1410
|
-
fill: 'white',
|
1411
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
1412
|
-
strokeDashArray: [5, 5],
|
1413
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, title, {
|
1414
|
-
row: 0,
|
1415
|
-
margin: new go.Margin(3, 0, 10, 0),
|
1416
|
-
desiredSize: new go.Size(size.w - 20, 15),
|
1417
|
-
stroke: '#444444',
|
1418
|
-
font: 'normal 10pt Arial',
|
1419
|
-
textAlign: 'center',
|
1420
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1421
|
-
margin: 4,
|
1422
|
-
text: title,
|
1423
|
-
})),
|
1424
|
-
}), this.$(go.Picture, icon, {
|
1425
|
-
row: 1,
|
1426
|
-
alignment: go.Spot.Center,
|
1427
|
-
desiredSize: new go.Size(size.w - 20, size.h - 65),
|
1428
|
-
imageStretch: go.GraphObject.Uniform,
|
1429
|
-
}, new go.Binding('source', 'pathImage', (x) => x ??
|
1430
|
-
AtoGojsEditorModel.NODE_TEMPLATES[AtoGojsEditorModel.ENUM_TEMPLATES.PLANT_CELL].icon)), this.$(go.TextBlock, {
|
1431
|
-
row: 2,
|
1432
|
-
margin: new go.Margin(10, 0, 3, 0),
|
1433
|
-
editable: true,
|
1434
|
-
desiredSize: new go.Size(size.w - 20, 15),
|
1435
|
-
stroke: '#2C2C2C',
|
1436
|
-
font: 'bold 10pt Arial',
|
1437
|
-
textAlign: 'center',
|
1438
|
-
// wrap: go.TextBlock.None,
|
1439
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
1440
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1441
|
-
margin: 4,
|
1442
|
-
}, new go.Binding('text', 'name').makeTwoWay())),
|
1443
|
-
}, new go.Binding('text', 'name').makeTwoWay())))), this.$(go.Panel, 'Vertical', {
|
1444
|
-
alignment: go.Spot.Left,
|
1445
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
1446
|
-
}), this.$(go.Panel, 'Vertical', {
|
1447
|
-
alignment: go.Spot.Right,
|
1448
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
1449
|
-
})
|
1450
|
-
// this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true),
|
1451
|
-
// this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true),
|
1452
|
-
// this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false),
|
1453
|
-
// this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false),
|
1454
|
-
);
|
1455
|
-
this.myDiagram.nodeTemplateMap.set(title, node);
|
1456
|
-
}
|
1457
|
-
makeEntityWithdrawOrDischarge(icon, title, size = {
|
1458
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
1459
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
1460
|
-
}) {
|
1461
|
-
const self = this;
|
1462
|
-
let node = this.$(go.Node, 'Spot', {
|
1463
|
-
locationSpot: go.Spot.Center,
|
1464
|
-
mouseOver: function (e, obj) {
|
1465
|
-
// self.showPoint(obj?.part?.location);
|
1466
|
-
},
|
1467
|
-
click: (e, obj) => {
|
1468
|
-
if (obj?.data?.onSelected) {
|
1469
|
-
obj?.data?.onSelected(obj?.data);
|
1470
|
-
self.onClickCompoent.emit({
|
1471
|
-
left: e?.['Wr']?.x,
|
1472
|
-
top: e?.['Wr']?.y,
|
1473
|
-
node: node,
|
1474
|
-
component: obj?.data,
|
1475
|
-
});
|
1476
|
-
}
|
1477
|
-
},
|
1478
|
-
selectionChanged: (e) => {
|
1479
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
1480
|
-
e?.data?.onSelected(null);
|
1481
|
-
}
|
1482
|
-
},
|
1483
|
-
selectionAdornmentTemplate: this._initialOptions.isReadOnly
|
1484
|
-
? null
|
1485
|
-
: this.$(go.Adornment, 'Spot', this.$(go.Panel, 'Auto', this.$(go.Shape, {
|
1486
|
-
fill: null,
|
1487
|
-
stroke: 'dodgerblue',
|
1488
|
-
strokeWidth: 4,
|
1489
|
-
}), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', { alignment: go.Spot.TopRight, alignmentFocus: go.Spot.Bottom }, this.generateActionGroup([
|
1490
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
1491
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
|
1492
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
1493
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
1494
|
-
]))),
|
1495
|
-
}, new go.Binding('visible', 'visible'), new go.Binding('movable', 'movable'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'RoundedRectangle', {
|
1496
|
-
fill: 'white',
|
1497
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
1498
|
-
// strokeDashArray: [5, 5],
|
1499
|
-
}), this.$(go.Panel, 'Table',
|
1500
|
-
// this.$(go.TextBlock, title, {
|
1501
|
-
// row: 0,
|
1502
|
-
// margin: new go.Margin(3, 3, 10, 3),
|
1503
|
-
// maxSize: new go.Size(size.w - 20, NaN),
|
1504
|
-
// stroke: '#444444',
|
1505
|
-
// font: 'normal 10pt Arial',
|
1506
|
-
// textAlign: 'center',
|
1507
|
-
// }),
|
1508
|
-
this.$(go.Picture, icon, {
|
1509
|
-
row: 1,
|
1510
|
-
alignment: go.Spot.Center,
|
1511
|
-
desiredSize: new go.Size(size.w - 20, size.h - 50),
|
1512
|
-
imageStretch: go.GraphObject.Uniform,
|
1513
|
-
}), this.$(go.TextBlock, {
|
1514
|
-
row: 2,
|
1515
|
-
margin: new go.Margin(10, 0, 3, 0),
|
1516
|
-
editable: true,
|
1517
|
-
desiredSize: new go.Size(size.w - 20, 15),
|
1518
|
-
stroke: '#000D42',
|
1519
|
-
font: 'bold 10pt Arial',
|
1520
|
-
textAlign: 'center',
|
1521
|
-
// wrap: go.TextBlock.None,
|
1522
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
1523
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
1524
|
-
margin: 4,
|
1525
|
-
}, new go.Binding('text', 'name').makeTwoWay())),
|
1526
|
-
}, new go.Binding('text', 'name').makeTwoWay()
|
1527
|
-
// {
|
1528
|
-
// // define a tooltip for each node that displays the color as text
|
1529
|
-
// toolTip: this.$(
|
1530
|
-
// 'ToolTip',
|
1531
|
-
// this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name')),
|
1532
|
-
// ), // end of Adornment
|
1533
|
-
// },
|
1534
|
-
))), this.$(go.Panel, 'Vertical', {
|
1535
|
-
alignment: go.Spot.Left,
|
1536
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
1537
|
-
}), this.$(go.Panel, 'Vertical', {
|
1538
|
-
alignment: go.Spot.Right,
|
1539
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
1540
|
-
}),
|
1541
|
-
// four named ports, one on each side:
|
1542
|
-
this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, false, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, false), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
1543
|
-
this.myDiagram.nodeTemplateMap.set(title, node);
|
1544
|
-
}
|
1545
|
-
editTextGroupZone(e, button) {
|
1546
|
-
const nodeGroup = button.part.adornedPart;
|
1547
|
-
const diagram = nodeGroup.diagram;
|
1548
|
-
e.diagram.commandHandler.editTextBlock(nodeGroup.findObject('TEXTBLOCK'));
|
1549
|
-
}
|
1550
|
-
editText(e, button) {
|
1551
|
-
const node = button.part.adornedPart;
|
1552
|
-
e.diagram.commandHandler.editTextBlock(node.findObject('TEXTBLOCK'));
|
1553
|
-
}
|
1554
|
-
async dragNewNode(e, button) {
|
1555
|
-
const tool = e.diagram.toolManager.draggingTool;
|
1556
|
-
if (tool.isBeyondDragSize()) {
|
1557
|
-
const data = button._dragData;
|
1558
|
-
if (!data)
|
1559
|
-
return;
|
1560
|
-
e.diagram.startTransaction('button drag'); // see doDeactivate, below
|
1561
|
-
const fromnode = button.part.adornedPart;
|
1562
|
-
const diagram = fromnode.diagram;
|
1563
|
-
const model = diagram.model;
|
1564
|
-
const nodedata = {
|
1565
|
-
...model.copyNodeData(data),
|
1566
|
-
key: UtilsService.generateUUID(),
|
1567
|
-
};
|
1568
|
-
model.addNodeData(nodedata);
|
1569
|
-
const newnode = diagram.findNodeForData(nodedata);
|
1570
|
-
const linkdata = model.copyLinkData({});
|
1571
|
-
model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
|
1572
|
-
model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
|
1573
|
-
model.addLinkData(linkdata);
|
1574
|
-
diagram.select(newnode);
|
1575
|
-
// this.createNodeAndLink(data, button.part.adornedPart);
|
1576
|
-
newnode.location = e.diagram.lastInput.documentPoint;
|
1577
|
-
// don't commitTransaction here, but in tool.doDeactivate, after drag operation finished
|
1578
|
-
// set tool.currentPart to a selected movable Part and then activate the DraggingTool
|
1579
|
-
tool.currentPart = newnode;
|
1580
|
-
e.diagram.currentTool = tool;
|
1581
|
-
tool.doActivate();
|
1582
|
-
}
|
1583
|
-
}
|
1584
|
-
addItemOnGroupZone(e, button) {
|
1585
|
-
const data = button._dragData;
|
1586
|
-
if (!data)
|
1587
|
-
return;
|
1588
|
-
e.diagram.startTransaction('Add Item On Group Zone');
|
1589
|
-
const fromnode = button.part.adornedPart;
|
1590
|
-
const dragData = button._dragData;
|
1591
|
-
const diagram = fromnode.diagram;
|
1592
|
-
const model = diagram.model;
|
1593
|
-
const nodedata = model.copyNodeData(dragData);
|
1594
|
-
model.addNodeData({
|
1595
|
-
...nodedata,
|
1596
|
-
type: 'SubSystem',
|
1597
|
-
name: '[Title...]',
|
1598
|
-
nameItem: '[Name...]',
|
1599
|
-
group: fromnode?.ob?.key,
|
1600
|
-
});
|
1601
|
-
e.diagram.commitTransaction('Add Item On Group Zone');
|
1602
|
-
// const newnode = diagram.findNodeForData(nodedata);
|
1603
|
-
// const linkdata = model.copyLinkData({});
|
1604
|
-
// model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
|
1605
|
-
// model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
|
1606
|
-
// model.addLinkData(linkdata);
|
1607
|
-
// diagram.select(newnode);
|
1608
|
-
// newnode.location = new go.Point(fromnode.location.x + 200, fromnode.location.y);
|
1609
|
-
// e.diagram.commitTransaction('Create Node and Link');
|
1610
|
-
}
|
1611
|
-
generateActionGroup(actions) {
|
1612
|
-
const self = this;
|
1613
|
-
return this.$('Button', {
|
1614
|
-
click: function (e, obj) {
|
1615
|
-
self.openActionMenu();
|
1616
|
-
const filteredActions = _.filter(obj.part?.['ob']?.actions ?? actions, (action) => {
|
1617
|
-
// Filter Insight button
|
1618
|
-
if (action === AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT) {
|
1619
|
-
return !!obj.part?.['ob']?.id;
|
1620
|
-
}
|
1621
|
-
if (action === AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME &&
|
1622
|
-
obj.part?.['ob']?.type !==
|
1623
|
-
AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE &&
|
1624
|
-
AtoGojsEditorModel.TYPE_COMPONENT_WATER?.includes(obj.part?.['ob']?.systemType) &&
|
1625
|
-
obj.part?.['ob']?.topologyType !==
|
1626
|
-
ATO_ECOMPONENT_PLANT_TYPE.WATER &&
|
1627
|
-
obj.part?.['ob']?.topologyType !==
|
1628
|
-
ATO_ECOMPONENT_PLANT_TYPE.WATER_PLANT_CELL) {
|
1629
|
-
return false;
|
1630
|
-
}
|
1631
|
-
if (action === AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW &&
|
1632
|
-
self.plantSatus === ATO_EPlantType.BASIC_PLANT &&
|
1633
|
-
obj.part?.data?.type ===
|
1634
|
-
AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE) {
|
1635
|
-
return false;
|
1636
|
-
}
|
1637
|
-
return true;
|
1638
|
-
}).map((e) => {
|
1639
|
-
if (ATO_ECOMPONENT_PLANT_TYPE.STEAM ===
|
1640
|
-
obj.part?.['ob']?.topologyType &&
|
1641
|
-
e === AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT) {
|
1642
|
-
return AtoDefaultGojsEditor.ENUM_ACTIONS.DATA_MAPPING;
|
1643
|
-
}
|
1644
|
-
if (e === AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS &&
|
1645
|
-
obj?.part?.['ob']?.systemType ===
|
1646
|
-
AtoGojsEditorModel.ENUM_TYPES.COOLING_TOWER) {
|
1647
|
-
return AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS_AND_WIZARD;
|
1648
|
-
}
|
1649
|
-
return e;
|
1650
|
-
});
|
1651
|
-
self.actions = filteredActions.map((action) => {
|
1652
|
-
let onClickFn = () => { };
|
1653
|
-
switch (action) {
|
1654
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.INSIGHT:
|
1655
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.DATA_MAPPING:
|
1656
|
-
onClickFn = () => {
|
1657
|
-
self.onOpenInsightMapping.emit({
|
1658
|
-
node: obj.part,
|
1659
|
-
});
|
1660
|
-
};
|
1661
|
-
break;
|
1662
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS:
|
1663
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS:
|
1664
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.FLOW_DETAILS_AND_WIZARD:
|
1665
|
-
onClickFn = () => {
|
1666
|
-
self.onOpenDetail.emit({
|
1667
|
-
node: obj.part,
|
1668
|
-
});
|
1669
|
-
};
|
1670
|
-
break;
|
1671
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.ONLY_DETAILS:
|
1672
|
-
onClickFn = () => {
|
1673
|
-
self.onOpenDetail.emit({
|
1674
|
-
node: obj.part,
|
1675
|
-
});
|
1676
|
-
};
|
1677
|
-
break;
|
1678
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.ASSET_PARAMETERS:
|
1679
|
-
onClickFn = () => {
|
1680
|
-
self.onOpenAssetParameter.emit({
|
1681
|
-
node: obj.part,
|
1682
|
-
});
|
1683
|
-
};
|
1684
|
-
break;
|
1685
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME:
|
1686
|
-
onClickFn = () => {
|
1687
|
-
if (obj.part?.data?.type ===
|
1688
|
-
AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE) {
|
1689
|
-
self.onRename.emit({
|
1690
|
-
left: e?.['Wr']?.x - 50,
|
1691
|
-
top: e?.['Wr']?.y,
|
1692
|
-
...obj.part?.data,
|
1693
|
-
});
|
1694
|
-
// LayoutService.setToolTipComponentDataStatic({
|
1695
|
-
// component: RenameBoxComponent,
|
1696
|
-
// data: {
|
1697
|
-
// left: e?.['Wr']?.x - 50,
|
1698
|
-
// top: e?.['Wr']?.y,
|
1699
|
-
// ...obj.part?.data,
|
1700
|
-
// },
|
1701
|
-
// });
|
1702
|
-
}
|
1703
|
-
else {
|
1704
|
-
self.editText(e, obj);
|
1705
|
-
}
|
1706
|
-
};
|
1707
|
-
break;
|
1708
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW:
|
1709
|
-
onClickFn = () => {
|
1710
|
-
self.clickNewNode(e, _.merge(obj, {
|
1711
|
-
actionMove: self.dragNewNode, // defined below, to support dragging from the button
|
1712
|
-
_dragData: {
|
1713
|
-
...{
|
1714
|
-
type: AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE,
|
1715
|
-
name: `${AtoGojsEditorModel.ACTION_RIGHT_MENU_GROUP.DATA_BOX}_${moment().valueOf()}`,
|
1716
|
-
color: AtoGojsEditorModel.ENUM_COLORS.BLUE,
|
1717
|
-
},
|
1718
|
-
...self.setProFOrNewNode(self),
|
1719
|
-
},
|
1720
|
-
}));
|
1721
|
-
};
|
1722
|
-
break;
|
1723
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE:
|
1724
|
-
onClickFn = () => {
|
1725
|
-
self.deleteNode(e);
|
1726
|
-
};
|
1727
|
-
break;
|
1728
|
-
case AtoDefaultGojsEditor.ENUM_ACTIONS.CHANGE_ICON:
|
1729
|
-
onClickFn = () => {
|
1730
|
-
self.onOpenChangeIcon.emit({
|
1731
|
-
node: obj.part,
|
1732
|
-
});
|
1733
|
-
};
|
1734
|
-
break;
|
1735
|
-
}
|
1736
|
-
return {
|
1737
|
-
...AtoDefaultGojsEditor.ACTIONS[action],
|
1738
|
-
onClick: () => {
|
1739
|
-
onClickFn();
|
1740
|
-
},
|
1741
|
-
};
|
1742
|
-
});
|
1743
|
-
},
|
1744
|
-
'ButtonBorder.strokeWidth': 0,
|
1745
|
-
'ButtonBorder.fill': 'white',
|
1746
|
-
},
|
1747
|
-
// new go.Binding('visible', 'isNotDragNewNode', (x) => !x),
|
1748
|
-
// new go.Binding('visible', 'isNotDelete', (x) => !x),
|
1749
|
-
new go.Binding('visible', 'isNotAction', (x) => !x), this.$(go.TextBlock, {
|
1750
|
-
margin: 4,
|
1751
|
-
text: '\ue489',
|
1752
|
-
font: '20px "Font Awesome 6 Pro"',
|
1753
|
-
cursor: 'pointer',
|
1754
|
-
}));
|
1755
|
-
}
|
1756
|
-
async setProFOrNewNode(self) {
|
1757
|
-
if (self.plantSatus === ATO_EPlantType.BASIC_PLANT) {
|
1758
|
-
return {
|
1759
|
-
movable: false,
|
1760
|
-
isNotAllowConnect: true,
|
1761
|
-
};
|
1762
|
-
}
|
1763
|
-
return {};
|
1764
|
-
}
|
1765
|
-
async clickNewNode(e, button) {
|
1766
|
-
const data = button._dragData;
|
1767
|
-
if (!data)
|
1768
|
-
return;
|
1769
|
-
e.diagram.startTransaction('Create Node and Link');
|
1770
|
-
const fromnode = button.part.adornedPart;
|
1771
|
-
// this.createNodeAndLink(button._dragData, fromnode);
|
1772
|
-
const dragData = button._dragData;
|
1773
|
-
const diagram = fromnode.diagram;
|
1774
|
-
const model = diagram.model;
|
1775
|
-
const nodedata = {
|
1776
|
-
...model.copyNodeData(dragData),
|
1777
|
-
key: UtilsService.generateUUID(),
|
1778
|
-
};
|
1779
|
-
model.addNodeData({
|
1780
|
-
...nodedata,
|
1781
|
-
isEditable: true,
|
1782
|
-
shortenedNumber: 0,
|
1783
|
-
isFormat: false,
|
1784
|
-
dataCollectionMethod: AtoGojsEditorModel.DATA_COLLECTION_METHOD.MANUAL,
|
1785
|
-
color: AtoGojsEditorModel.COLOR_COLLECTION_METHOD[AtoGojsEditorModel.DATA_COLLECTION_METHOD.MANUAL].color,
|
1786
|
-
group: fromnode?.ob?.group,
|
1787
|
-
value: 0,
|
1788
|
-
});
|
1789
|
-
const newnode = diagram.findNodeForData(nodedata);
|
1790
|
-
const linkdata = model.copyLinkData({});
|
1791
|
-
model.setFromKeyForLinkData(linkdata, model.getKeyForNodeData(fromnode.data));
|
1792
|
-
model.setToKeyForLinkData(linkdata, model.getKeyForNodeData(newnode.data));
|
1793
|
-
model.addLinkData(linkdata);
|
1794
|
-
diagram.select(newnode);
|
1795
|
-
if (nodedata?.movable !== undefined && nodedata?.movable !== null) {
|
1796
|
-
newnode.movable = nodedata?.movable;
|
1797
|
-
}
|
1798
|
-
newnode.location = new go.Point(fromnode.location.x + 160, fromnode.location.y +
|
1799
|
-
this.findLocYFromnode(fromnode) * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT);
|
1800
|
-
e.diagram.commitTransaction('Create Node and Link');
|
1801
|
-
}
|
1802
|
-
findLocYFromnode(fromnode) {
|
1803
|
-
// Find location auto right
|
1804
|
-
const locYFromnode = fromnode.data?.loc?.split(' ')?.[1];
|
1805
|
-
const locYAlreadyExist = [];
|
1806
|
-
fromnode.findLinksOutOf().each(function (link) {
|
1807
|
-
const targetNode = link.toNode;
|
1808
|
-
if (targetNode) {
|
1809
|
-
locYAlreadyExist.push(targetNode.data?.loc?.split(' ')?.[1] - locYFromnode);
|
1810
|
-
}
|
1811
|
-
});
|
1812
|
-
let i = 0;
|
1813
|
-
while (this.isEmptyYLoc(locYAlreadyExist, i) === null && i < 100) {
|
1814
|
-
i++;
|
1815
|
-
}
|
1816
|
-
return this.isEmptyYLoc(locYAlreadyExist, i);
|
1817
|
-
}
|
1818
|
-
isEmptyYLoc(locYAlreadyExist, i) {
|
1819
|
-
if (!_.some(locYAlreadyExist, (x) => x <
|
1820
|
-
i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT +
|
1821
|
-
AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2 &&
|
1822
|
-
x >
|
1823
|
-
i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT -
|
1824
|
-
AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2)) {
|
1825
|
-
return i;
|
1826
|
-
}
|
1827
|
-
if (!_.some(locYAlreadyExist, (x) => x <
|
1828
|
-
-i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT +
|
1829
|
-
AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2 &&
|
1830
|
-
x >
|
1831
|
-
-i * AtoDefaultGojsEditor.DISTANCE_2_OUTPUT -
|
1832
|
-
AtoDefaultGojsEditor.DISTANCE_2_OUTPUT / 2)) {
|
1833
|
-
return -i;
|
1834
|
-
}
|
1835
|
-
return null;
|
1836
|
-
}
|
1837
|
-
createNewNode(newnode) {
|
1838
|
-
this.addTemplate(newnode);
|
1839
|
-
this.myDiagram.startTransaction('add group node');
|
1840
|
-
this.myDiagram.model.addNodeData(newnode);
|
1841
|
-
this.myDiagram.commitTransaction('add group node');
|
1842
|
-
}
|
1843
|
-
deleteNode(e) {
|
1844
|
-
e.diagram.startTransaction('Delete group node');
|
1845
|
-
e.diagram.removeParts(e.diagram.selection);
|
1846
|
-
e.diagram.commitTransaction('Delete group node');
|
1847
|
-
}
|
1848
|
-
deleteNodeOnDiagram(e) {
|
1849
|
-
e.startTransaction('Delete group node');
|
1850
|
-
e.removeParts(e.selection);
|
1851
|
-
e.commitTransaction('Delete group node');
|
1852
|
-
}
|
1853
|
-
insightNode(e) { }
|
1854
|
-
drawLink(e, button) {
|
1855
|
-
const node = button.part.adornedPart;
|
1856
|
-
const tool = e.diagram.toolManager.linkingTool;
|
1857
|
-
tool.startObject = node.port;
|
1858
|
-
e.diagram.currentTool = tool;
|
1859
|
-
tool.doActivate();
|
1860
|
-
}
|
1861
|
-
makePortGroup(name, align, spot, output, input) {
|
1862
|
-
const horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
|
1863
|
-
return this.$(go.Panel, 'Table', {
|
1864
|
-
background: '#919CA5',
|
1865
|
-
width: 40,
|
1866
|
-
height: 40,
|
1867
|
-
alignment: align,
|
1868
|
-
stretch: horizontal
|
1869
|
-
? go.GraphObject.Horizontal
|
1870
|
-
: go.GraphObject.Vertical,
|
1871
|
-
portId: name,
|
1872
|
-
fromSpot: spot,
|
1873
|
-
fromLinkable: output,
|
1874
|
-
toSpot: spot,
|
1875
|
-
toLinkable: input,
|
1876
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
1877
|
-
alignmentFocus: go.Spot.Center, // tập trung vào trung tâm của Panel
|
1878
|
-
// mouseEnter: this._initialOptions.isReadOnly
|
1879
|
-
// ? null
|
1880
|
-
// : (e, panel) => {
|
1881
|
-
// const textBlock = (panel as any)?.findObject('textBlock') as go.TextBlock | null;
|
1882
|
-
// if (textBlock) {
|
1883
|
-
// // && output
|
1884
|
-
// textBlock.visible = true;
|
1885
|
-
// switch (name) {
|
1886
|
-
// case 'B':
|
1887
|
-
// case 'R': {
|
1888
|
-
// panel.background = 'rgb(243 144 171)';
|
1889
|
-
// break;
|
1890
|
-
// }
|
1891
|
-
// case 'T':
|
1892
|
-
// case 'L': {
|
1893
|
-
// panel.background = 'rgb(103,151,207)';
|
1894
|
-
// break;
|
1895
|
-
// }
|
1896
|
-
// default: {
|
1897
|
-
// panel.background = 'rgb(243 144 171)';
|
1898
|
-
// }
|
1899
|
-
// }
|
1900
|
-
// }
|
1901
|
-
// },
|
1902
|
-
// mouseLeave: this._initialOptions.isReadOnly
|
1903
|
-
// ? null
|
1904
|
-
// : (e, panel) => {
|
1905
|
-
// const textBlock = (panel as any).findObject('textBlock') as go.TextBlock | null;
|
1906
|
-
// if (textBlock) {
|
1907
|
-
// textBlock.visible = false; // Ẩn TextBlock khi rời khỏi Panel
|
1908
|
-
// }
|
1909
|
-
// panel.background = 'transparent';
|
1910
|
-
// },
|
1911
|
-
}, this.$(go.Shape, 'Ellipse', {
|
1912
|
-
fill: 'white', // Background color of the circle
|
1913
|
-
strokeWidth: 2,
|
1914
|
-
stroke: '#919CA5', // Border color of the circle
|
1915
|
-
width: 40, // Match the panel's width
|
1916
|
-
height: 40, // Match the panel's height
|
1917
|
-
})
|
1918
|
-
// this.$(
|
1919
|
-
// go.TextBlock,
|
1920
|
-
// {
|
1921
|
-
// name: 'textBlock',
|
1922
|
-
// margin: 4,
|
1923
|
-
// text: '\uf0da', // Mã Unicode tương ứng với fa-caret-left
|
1924
|
-
// font: '900 12px "Font Awesome 6 Pro"',
|
1925
|
-
// stroke: 'white', // Đặt màu chữ thành màu trắng
|
1926
|
-
// cursor: 'pointer',
|
1927
|
-
// visible: false,
|
1928
|
-
// },
|
1929
|
-
// new go.Binding('text', 'name', (_) => {
|
1930
|
-
// switch (name) {
|
1931
|
-
// case 'T':
|
1932
|
-
// case 'B': {
|
1933
|
-
// return '\uf0d7';
|
1934
|
-
// }
|
1935
|
-
// case 'L':
|
1936
|
-
// case 'R': {
|
1937
|
-
// return '\uf0da';
|
1938
|
-
// }
|
1939
|
-
// default: {
|
1940
|
-
// return '\uf0d7';
|
1941
|
-
// }
|
1942
|
-
// }
|
1943
|
-
// }),
|
1944
|
-
// ),
|
1945
|
-
);
|
1946
|
-
}
|
1947
|
-
makePort(name, align, spot, output, input) {
|
1948
|
-
// if (this._initialOptions.isReadOnly) {
|
1949
|
-
// return {};
|
1950
|
-
// }
|
1951
|
-
const horizontal = align.equals(go.Spot.Top) || align.equals(go.Spot.Bottom);
|
1952
|
-
// const vertical = align.equals(go.Spot.Left) || align.equals(go.Spot.Right);
|
1953
|
-
// the port is basically just a transparent rectangle that stretches along the side of the node,
|
1954
|
-
// and becomes colored when the mouse passes over it
|
1955
|
-
return this.$(go.Panel, 'Table', {
|
1956
|
-
background: 'transparent',
|
1957
|
-
width: horizontal ? NaN : 8,
|
1958
|
-
height: !horizontal ? NaN : 8,
|
1959
|
-
alignment: align,
|
1960
|
-
stretch: horizontal
|
1961
|
-
? go.GraphObject.Horizontal
|
1962
|
-
: go.GraphObject.Vertical,
|
1963
|
-
portId: name,
|
1964
|
-
fromSpot: spot,
|
1965
|
-
fromLinkable: output,
|
1966
|
-
toSpot: spot,
|
1967
|
-
toLinkable: input,
|
1968
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
1969
|
-
alignmentFocus: go.Spot.Center, // tập trung vào trung tâm của Panel
|
1970
|
-
mouseEnter: this._initialOptions.isReadOnly
|
1971
|
-
? null
|
1972
|
-
: (e, panel) => {
|
1973
|
-
const textBlock = panel?.findObject('textBlock');
|
1974
|
-
if (textBlock) {
|
1975
|
-
// && output
|
1976
|
-
textBlock.visible = true;
|
1977
|
-
switch (name) {
|
1978
|
-
case 'B':
|
1979
|
-
case 'R': {
|
1980
|
-
panel.background = 'rgb(243 144 171)';
|
1981
|
-
break;
|
1982
|
-
}
|
1983
|
-
case 'T':
|
1984
|
-
case 'L': {
|
1985
|
-
panel.background = 'rgb(103,151,207)';
|
1986
|
-
break;
|
1987
|
-
}
|
1988
|
-
default: {
|
1989
|
-
panel.background = 'rgb(243 144 171)';
|
1990
|
-
}
|
1991
|
-
}
|
1992
|
-
}
|
1993
|
-
},
|
1994
|
-
mouseLeave: this._initialOptions.isReadOnly
|
1995
|
-
? null
|
1996
|
-
: (e, panel) => {
|
1997
|
-
const textBlock = panel.findObject('textBlock');
|
1998
|
-
if (textBlock) {
|
1999
|
-
textBlock.visible = false; // Ẩn TextBlock khi rời khỏi Panel
|
2000
|
-
}
|
2001
|
-
panel.background = 'transparent';
|
2002
|
-
},
|
2003
|
-
}, new go.Binding('visible', '', function (data) {
|
2004
|
-
if (data?.isNotAllowConnect) {
|
2005
|
-
return false;
|
2006
|
-
}
|
2007
|
-
if (data?.selectable === false && !data?.isAllowConnect) {
|
2008
|
-
return false;
|
2009
|
-
}
|
2010
|
-
if (data?.flowOfPlantCell) {
|
2011
|
-
if (data?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.INFLOW &&
|
2012
|
-
name === 'L') {
|
2013
|
-
return true;
|
2014
|
-
}
|
2015
|
-
if (data?.flowOfPlantCell === ATO_ENUM_FLOW_DIRECTION.OUTFLOW &&
|
2016
|
-
name === 'R') {
|
2017
|
-
return true;
|
2018
|
-
}
|
2019
|
-
return false;
|
2020
|
-
}
|
2021
|
-
switch (name) {
|
2022
|
-
case 'B':
|
2023
|
-
case 'R': {
|
2024
|
-
return !data?.isNotSelectOutput;
|
2025
|
-
}
|
2026
|
-
case 'T':
|
2027
|
-
case 'L': {
|
2028
|
-
return !data?.isNotSelectInput;
|
2029
|
-
}
|
2030
|
-
default: {
|
2031
|
-
return true;
|
2032
|
-
}
|
2033
|
-
}
|
2034
|
-
}), this.$(go.TextBlock, {
|
2035
|
-
name: 'textBlock',
|
2036
|
-
margin: 4,
|
2037
|
-
text: '\uf0da', // Mã Unicode tương ứng với fa-caret-left
|
2038
|
-
font: '900 12px "Font Awesome 6 Pro"',
|
2039
|
-
stroke: 'white', // Đặt màu chữ thành màu trắng
|
2040
|
-
cursor: 'pointer',
|
2041
|
-
visible: false,
|
2042
|
-
}, new go.Binding('text', 'name', (_) => {
|
2043
|
-
switch (name) {
|
2044
|
-
case 'T':
|
2045
|
-
case 'B': {
|
2046
|
-
return '\uf0d7';
|
2047
|
-
}
|
2048
|
-
case 'L':
|
2049
|
-
case 'R': {
|
2050
|
-
return '\uf0da';
|
2051
|
-
}
|
2052
|
-
default: {
|
2053
|
-
return '\uf0d7';
|
2054
|
-
}
|
2055
|
-
}
|
2056
|
-
})));
|
2057
|
-
// return this.$(go.Shape, {
|
2058
|
-
// fill: 'transparent', // changed to a color in the mouseEnter event handler
|
2059
|
-
// strokeWidth: 0, // no stroke
|
2060
|
-
// width: horizontal ? NaN : 8, // if not stretching horizontally, just 8 wide
|
2061
|
-
// height: !horizontal ? NaN : 8, // if not stretching vertically, just 8 tall
|
2062
|
-
// alignment: align, // align the port on the main Shape
|
2063
|
-
// stretch: horizontal ? go.GraphObject.Horizontal : go.GraphObject.Vertical,
|
2064
|
-
// portId: name, // declare this object to be a "port"
|
2065
|
-
// fromSpot: spot, // declare where links may connect at this port
|
2066
|
-
// fromLinkable: output, // declare whether the user may draw links from here
|
2067
|
-
// toSpot: spot, // declare where links may connect at this port
|
2068
|
-
// toLinkable: input, // declare whether the user may draw links to here
|
2069
|
-
// cursor: 'pointer', // show a different cursor to indicate potential link point
|
2070
|
-
// mouseEnter: (e, port) => {
|
2071
|
-
// // the PORT argument will be this Shape
|
2072
|
-
// if (!e.diagram.isReadOnly && output) {
|
2073
|
-
// port.fill = 'rgba(255,0,255,0.5)'
|
2074
|
-
// };
|
2075
|
-
// },
|
2076
|
-
// mouseLeave: (e, port) => {
|
2077
|
-
// return (port.fill = 'transparent');
|
2078
|
-
// },
|
2079
|
-
// });
|
2080
|
-
}
|
2081
|
-
makeGroupBasicComponent(icon, title, size = { w: 80, h: 80 }) {
|
2082
|
-
let node = this.$(go.Group, 'Spot', {
|
2083
|
-
// layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
|
2084
|
-
alignment: go.Spot.Center,
|
2085
|
-
layout: this.$(go.Layout),
|
2086
|
-
movable: false,
|
2087
|
-
selectable: false,
|
2088
|
-
// movable: true,
|
2089
|
-
// selectable: true,
|
2090
|
-
dragComputation: (node, pt, gridpt) => {
|
2091
|
-
pt.x =
|
2092
|
-
Math.round(pt.x / AtoGojsEditorModel.BASIC_GRID_SIZE_WIDTH) *
|
2093
|
-
AtoGojsEditorModel.BASIC_GRID_SIZE_WIDTH;
|
2094
|
-
pt.y =
|
2095
|
-
Math.round(pt.y / AtoGojsEditorModel.BASIC_GRID_SIZE_HEIGHT) *
|
2096
|
-
AtoGojsEditorModel.BASIC_GRID_SIZE_HEIGHT;
|
2097
|
-
return pt;
|
2098
|
-
},
|
2099
|
-
}, {
|
2100
|
-
// minSize: new go.Size(AtoGojsEditorModel.BASIC_GRID_SIZE_WIDTH, AtoGojsEditorModel.BASIC_GRID_SIZE_HEIGHT),
|
2101
|
-
minSize: new go.Size(1, 1),
|
2102
|
-
maxSize: new go.Size(1, 1),
|
2103
|
-
// minSize: new go.Size(100, 100),
|
2104
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
|
2105
|
-
fill: 'transparent',
|
2106
|
-
stroke: 'transparent',
|
2107
|
-
// stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2108
|
-
strokeWidth: 2,
|
2109
|
-
// strokeDashArray: [5, 5],
|
2110
|
-
})
|
2111
|
-
// this.$(go.Placeholder),
|
2112
|
-
// this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0) }),
|
2113
|
-
)
|
2114
|
-
// this.$(go.TextBlock, title, {
|
2115
|
-
// row: 0,
|
2116
|
-
// margin: new go.Margin(0, 0, 0, 0),
|
2117
|
-
// stroke: '#444444',
|
2118
|
-
// font: 'normal 10pt Arial',
|
2119
|
-
// textAlign: 'center',
|
2120
|
-
// alignment: go.Spot.Left,
|
2121
|
-
// },
|
2122
|
-
// new go.Binding('text', 'key').makeTwoWay(),),
|
2123
|
-
// this.$(
|
2124
|
-
// go.Panel,
|
2125
|
-
// 'Table',
|
2126
|
-
// {
|
2127
|
-
// alignment: go.Spot.TopLeft,
|
2128
|
-
// alignmentFocus: new go.Spot(0, 0, -10, -10),
|
2129
|
-
// // padding: new go.Margin(0, 0, 50, 0),
|
2130
|
-
// },
|
2131
|
-
// this.$(
|
2132
|
-
// go.Panel,
|
2133
|
-
// 'Horizontal',
|
2134
|
-
// {
|
2135
|
-
// row: 0,
|
2136
|
-
// alignment: go.Spot.Left,
|
2137
|
-
// },
|
2138
|
-
// this.$(go.Picture, icon, {
|
2139
|
-
// row: 0,
|
2140
|
-
// // alignment: go.Spot.Center,
|
2141
|
-
// alignment: go.Spot.Left,
|
2142
|
-
// maxSize: new go.Size(40, 40),
|
2143
|
-
// imageStretch: go.GraphObject.Uniform,
|
2144
|
-
// }),
|
2145
|
-
// this.$(
|
2146
|
-
// go.Panel,
|
2147
|
-
// 'Table',
|
2148
|
-
// {
|
2149
|
-
// column: 1,
|
2150
|
-
// defaultAlignment: go.Spot.Left,
|
2151
|
-
// alignmentFocus: new go.Spot(0, 0, 0, 20),
|
2152
|
-
// },
|
2153
|
-
// this.$(go.TextBlock, title, {
|
2154
|
-
// row: 0,
|
2155
|
-
// margin: new go.Margin(3, 3, 5, 10),
|
2156
|
-
// // maxSize: new go.Size(size.w - 20, NaN),
|
2157
|
-
// stroke: '#444444',
|
2158
|
-
// font: 'normal 10pt Arial',
|
2159
|
-
// textAlign: 'center',
|
2160
|
-
// alignment: go.Spot.Left,
|
2161
|
-
// }),
|
2162
|
-
// this.$(
|
2163
|
-
// go.TextBlock,
|
2164
|
-
// {
|
2165
|
-
// row: 1,
|
2166
|
-
// margin: new go.Margin(0, 3, 3, 10),
|
2167
|
-
// editable: true,
|
2168
|
-
// // maxSize: new go.Size(size.w - 20, 40),
|
2169
|
-
// stroke: '#000D42',
|
2170
|
-
// font: 'bold 10pt Arial',
|
2171
|
-
// textAlign: 'center',
|
2172
|
-
// wrap: go.TextBlock.None,
|
2173
|
-
// overflow: go.TextBlock.OverflowEllipsis,
|
2174
|
-
// },
|
2175
|
-
// new go.Binding('text', 'name').makeTwoWay(),
|
2176
|
-
// {
|
2177
|
-
// // define a tooltip for each node that displays the color as text
|
2178
|
-
// toolTip: this.$(
|
2179
|
-
// 'ToolTip',
|
2180
|
-
// this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name')),
|
2181
|
-
// ), // end of Adornment
|
2182
|
-
// },
|
2183
|
-
// ),
|
2184
|
-
// ),
|
2185
|
-
// ),
|
2186
|
-
// ),
|
2187
|
-
);
|
2188
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2189
|
-
}
|
2190
|
-
makeGroupTemplate(icon, title, size = { w: 80, h: 80 }) {
|
2191
|
-
let node = this.$(go.Group, 'Spot', {
|
2192
|
-
// // layout: this.$(go.ForceDirectedLayout , {
|
2193
|
-
// // direction: 0,
|
2194
|
-
// // setsPortSpots: false,
|
2195
|
-
// // }),
|
2196
|
-
// layout: this.$(go.LayeredDigraphLayout, {
|
2197
|
-
// direction: 0,
|
2198
|
-
// setsPortSpots: false,
|
2199
|
-
// }),
|
2200
|
-
layout: this.$(go.Layout),
|
2201
|
-
// // // adornment when a group is selected
|
2202
|
-
// // // selectionAdornmentTemplate: this.$(
|
2203
|
-
// // // go.Adornment,
|
2204
|
-
// // // 'Auto',
|
2205
|
-
// // // this.$(go.Shape, 'Rectangle', { fill: null, stroke: 'dodgerblue', strokeWidth: 8 }),
|
2206
|
-
// // // this.$(go.Placeholder),
|
2207
|
-
// // // ),
|
2208
|
-
},
|
2209
|
-
// new go.Binding('layout', 'layout', (x) =>
|
2210
|
-
// {
|
2211
|
-
// return this.$(go.ForceDirectedLayout , {
|
2212
|
-
// direction: 0,
|
2213
|
-
// setsPortSpots: false,
|
2214
|
-
// });
|
2215
|
-
// }
|
2216
|
-
// ),
|
2217
|
-
{
|
2218
|
-
minSize: new go.Size(400, 400),
|
2219
|
-
},
|
2220
|
-
// new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
|
2221
|
-
this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
|
2222
|
-
fill: 'transparent',
|
2223
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2224
|
-
strokeWidth: 2,
|
2225
|
-
// strokeDashArray: [5, 5],
|
2226
|
-
}), this.$(go.Placeholder, { padding: new go.Margin(60, 20, 20, 20) })),
|
2227
|
-
// this.$(
|
2228
|
-
// go.Panel,
|
2229
|
-
// 'Table',
|
2230
|
-
// {
|
2231
|
-
// alignment: go.Spot.TopLeft,
|
2232
|
-
// alignmentFocus: new go.Spot(0, 0, -10, -10),
|
2233
|
-
// },
|
2234
|
-
// this.$(go.TextBlock, title, {
|
2235
|
-
// row: 0,
|
2236
|
-
// margin: new go.Margin(3, 3, 5, 3),
|
2237
|
-
// maxSize: new go.Size(size.w - 20, NaN),
|
2238
|
-
// stroke: '#444444',
|
2239
|
-
// font: 'normal 8pt Arial',
|
2240
|
-
// textAlign: 'center',
|
2241
|
-
// }),
|
2242
|
-
// this.$(go.Picture, icon, {
|
2243
|
-
// row: 1,
|
2244
|
-
// alignment: go.Spot.Center,
|
2245
|
-
// maxSize: new go.Size(40, 40),
|
2246
|
-
// imageStretch: go.GraphObject.Uniform,
|
2247
|
-
// }),
|
2248
|
-
// this.$(
|
2249
|
-
// go.TextBlock,
|
2250
|
-
// {
|
2251
|
-
// row: 2,
|
2252
|
-
// margin: new go.Margin(10, 3, 3, 3),
|
2253
|
-
// editable: true,
|
2254
|
-
// maxSize: new go.Size(size.w - 20, 40),
|
2255
|
-
// stroke: '#000D42',
|
2256
|
-
// font: 'bold 8pt Arial',
|
2257
|
-
// textAlign: 'center',
|
2258
|
-
// wrap: go.TextBlock.None,
|
2259
|
-
// overflow: go.TextBlock.OverflowEllipsis,
|
2260
|
-
// },
|
2261
|
-
// new go.Binding('text', 'name').makeTwoWay(),
|
2262
|
-
// {
|
2263
|
-
// // define a tooltip for each node that displays the color as text
|
2264
|
-
// toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))), // end of Adornment
|
2265
|
-
// },
|
2266
|
-
// ),
|
2267
|
-
// // new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
|
2268
|
-
// ),
|
2269
|
-
this.$(go.Panel, 'Table', {
|
2270
|
-
alignment: go.Spot.TopLeft,
|
2271
|
-
alignmentFocus: new go.Spot(0, 0, -10, -10),
|
2272
|
-
// padding: new go.Margin(0, 0, 50, 0),
|
2273
|
-
}, this.$(go.Panel, 'Horizontal', {
|
2274
|
-
row: 0,
|
2275
|
-
alignment: go.Spot.Left,
|
2276
|
-
}, this.$(go.Picture, icon, {
|
2277
|
-
row: 0,
|
2278
|
-
// alignment: go.Spot.Center,
|
2279
|
-
alignment: go.Spot.Left,
|
2280
|
-
maxSize: new go.Size(40, 40),
|
2281
|
-
imageStretch: go.GraphObject.Uniform,
|
2282
|
-
}), this.$(go.Panel, 'Table', {
|
2283
|
-
column: 1,
|
2284
|
-
defaultAlignment: go.Spot.Left,
|
2285
|
-
alignmentFocus: new go.Spot(0, 0, 0, 20),
|
2286
|
-
}, this.$(go.TextBlock, AtoGojsEditorModel.TEMPLATE_DUPLICATE[title] ?? title, {
|
2287
|
-
row: 0,
|
2288
|
-
margin: new go.Margin(3, 3, 5, 10),
|
2289
|
-
// maxSize: new go.Size(size.w - 20, NaN),
|
2290
|
-
stroke: '#444444',
|
2291
|
-
font: 'normal 10pt Arial',
|
2292
|
-
textAlign: 'center',
|
2293
|
-
alignment: go.Spot.Left,
|
2294
|
-
}), this.$(go.TextBlock, {
|
2295
|
-
row: 1,
|
2296
|
-
margin: new go.Margin(0, 3, 3, 10),
|
2297
|
-
editable: true,
|
2298
|
-
// maxSize: new go.Size(size.w - 20, 40),
|
2299
|
-
stroke: '#000D42',
|
2300
|
-
font: 'bold 10pt Arial',
|
2301
|
-
textAlign: 'center',
|
2302
|
-
wrap: go.TextBlock.None,
|
2303
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
2304
|
-
}, new go.Binding('text', 'name').makeTwoWay(), {
|
2305
|
-
// define a tooltip for each node that displays the color as text
|
2306
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, { margin: 4 }, new go.Binding('text', 'name'))), // end of Adornment
|
2307
|
-
})))));
|
2308
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2309
|
-
}
|
2310
|
-
makeImageTemplate() {
|
2311
|
-
const node = this.$(go.Node, 'Spot', {
|
2312
|
-
zOrder: 1,
|
2313
|
-
}, new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Horizontal', {
|
2314
|
-
row: 0,
|
2315
|
-
alignment: go.Spot.Left,
|
2316
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Picture, AtoGojsEditorModel.IMAGE_RO_WATER_TREATMENT_PATH, {
|
2317
|
-
alignment: go.Spot.Center,
|
2318
|
-
// maxSize: new go.Size(500, 500),
|
2319
|
-
// imageStretch: go.GraphObject.Uniform,
|
2320
|
-
// margin: new go.Margin(130, 0, 0, 0),
|
2321
|
-
}, new go.Binding('margin', 'margin'), new go.Binding('width', 'width'), new go.Binding('height', 'height'), new go.Binding('source', '', (data) => {
|
2322
|
-
return data?.source
|
2323
|
-
? data?.source
|
2324
|
-
: AtoGojsEditorModel.IMAGE_RO_WATER_TREATMENT_PATH;
|
2325
|
-
}))));
|
2326
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.IMAGE_TEMPLATE, node);
|
2327
|
-
}
|
2328
|
-
makeParamTable() {
|
2329
|
-
const self = this;
|
2330
|
-
const node = this.$(go.Part, 'Vertical',
|
2331
|
-
// this.$(go.Shape, { fill: '#E6F0F7', stroke: '#0063A9', strokeWidth: 3, geometryString: 'M 5 0 L 95 0 Q 100 0 100 5 L 100 95 Q 100 100 95 100 L 5 100 Q 0 100 0 95 L 0 5 Q 0 0 5 0' }),
|
2332
|
-
{
|
2333
|
-
zOrder: 2,
|
2334
|
-
// padding: new go.Margin(0, 0, 0, 200),
|
2335
|
-
}, new go.Binding('padding', 'padding'), new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), new go.Binding('visible', '', (data) => {
|
2336
|
-
return typeof data?.visible === 'boolean' ? data?.visible : true;
|
2337
|
-
}),
|
2338
|
-
// Header
|
2339
|
-
this.$(go.Panel, 'Auto', {
|
2340
|
-
stretch: go.GraphObject.Fill,
|
2341
|
-
minSize: new go.Size(150, 27),
|
2342
|
-
margin: new go.Margin(0, 0, -6, 0),
|
2343
|
-
}, new go.Binding('visible', '', (data) => !!data?.title), this.$(go.Shape, 'RoundedRectangle', {
|
2344
|
-
parameter1: 5,
|
2345
|
-
}, new go.Binding('fill', '', (data) => {
|
2346
|
-
return data?.color;
|
2347
|
-
}), new go.Binding('stroke', '', (data) => {
|
2348
|
-
return data?.color;
|
2349
|
-
})), this.$(go.TextBlock, {
|
2350
|
-
stroke: 'white',
|
2351
|
-
margin: new go.Margin(0, 0, 0, 5),
|
2352
|
-
stretch: go.GraphObject.Fill,
|
2353
|
-
alignment: go.Spot.Left,
|
2354
|
-
verticalAlignment: go.Spot.Center,
|
2355
|
-
font: '14px sans-serif',
|
2356
|
-
}, new go.Binding('text', 'title'))), this.$(go.Shape, 'Rectangle', {
|
2357
|
-
height: 6,
|
2358
|
-
margin: new go.Margin(0, 0, -6, 0),
|
2359
|
-
stretch: go.GraphObject.Fill,
|
2360
|
-
}, new go.Binding('fill', '', (data) => {
|
2361
|
-
return data?.color;
|
2362
|
-
}), new go.Binding('stroke', '', (data) => {
|
2363
|
-
return data?.color;
|
2364
|
-
}), new go.Binding('visible', '', (data) => !!data?.title)), this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', { fill: '#E6F0F7', stroke: '#0063A9', strokeWidth: 4, parameter1: 5 }, new go.Binding('fill', 'bgColor'), new go.Binding('stroke', 'borderTable')), this.$(go.Panel, 'Table',
|
2365
|
-
// Set defaults for all rows and columns:
|
2366
|
-
{
|
2367
|
-
padding: 1.5,
|
2368
|
-
defaultRowSeparatorStroke: '#0062A9',
|
2369
|
-
defaultColumnSeparatorStroke: '#0062A9',
|
2370
|
-
defaultSeparatorPadding: new go.Margin(5, 2, 5, 2),
|
2371
|
-
}, new go.Binding('defaultRowSeparatorStroke', 'borderTable'), new go.Binding('defaultColumnSeparatorStroke', 'borderTable'),
|
2372
|
-
// this.$(
|
2373
|
-
// go.Panel,
|
2374
|
-
// 'TableRow',
|
2375
|
-
// { row: 0 },
|
2376
|
-
// this.$(go.TextBlock, 'row 1 col 1', { column: 0, margin: 2 }),
|
2377
|
-
// this.$(go.TextBlock, 'row 1 col 2', { column: 1, margin: 2 }),
|
2378
|
-
// ),
|
2379
|
-
// this.$(
|
2380
|
-
// go.Panel,
|
2381
|
-
// 'TableRow',
|
2382
|
-
// { row: 1 },
|
2383
|
-
// this.$(go.TextBlock, 'row 2 col 1', { column: 0, margin: 2 }),
|
2384
|
-
// this.$(go.TextBlock, 'row 2 col 2', { column: 1, margin: 2 }),
|
2385
|
-
// ),
|
2386
|
-
// new go.Binding('itemArray', 'dataTable'),
|
2387
|
-
new go.Binding('itemArray', '', function (data) {
|
2388
|
-
return data.dataTable.filter((x) => x?.visible !== false);
|
2389
|
-
}), {
|
2390
|
-
// itemTemplate: this.$(
|
2391
|
-
// go.Panel,
|
2392
|
-
// new go.Binding('row', 'indexRow'),
|
2393
|
-
// // new go.Binding('height', 'height'),
|
2394
|
-
// this.$(
|
2395
|
-
// go.Picture,
|
2396
|
-
// ARROW,
|
2397
|
-
// {
|
2398
|
-
// alignment: go.Spot.Center,
|
2399
|
-
// maxSize: new go.Size(20, 40),
|
2400
|
-
// // imageStretch: go.GraphObject.Uniform,
|
2401
|
-
// },
|
2402
|
-
// new go.Binding('source', '', (data, panel) => {
|
2403
|
-
// // panel.part?.data?.id
|
2404
|
-
// return data?.isCreated ? panel?.$p : ARROW_GRAY;
|
2405
|
-
// }),
|
2406
|
-
// ),
|
2407
|
-
// ),
|
2408
|
-
itemTemplate: this.$(go.Panel, 'TableRow', {
|
2409
|
-
cursor: 'pointer',
|
2410
|
-
click: (e, obj) => {
|
2411
|
-
if (obj.panel.part.data?.dataTable[obj.row]?.isEditable ===
|
2412
|
-
false) {
|
2413
|
-
return;
|
2414
|
-
}
|
2415
|
-
self.onClikParamOfTable.emit({
|
2416
|
-
...obj.panel.part.data?.dataTable[obj.row],
|
2417
|
-
});
|
2418
|
-
},
|
2419
|
-
background: 'transparent',
|
2420
|
-
}, this.$(go.TextBlock, '', {
|
2421
|
-
column: 0,
|
2422
|
-
margin: 2,
|
2423
|
-
textAlign: 'left',
|
2424
|
-
alignment: go.Spot.Left,
|
2425
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
2426
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
2427
|
-
margin: 4,
|
2428
|
-
}, new go.Binding('text', '', (data, panel) => {
|
2429
|
-
return data?.name;
|
2430
|
-
}))),
|
2431
|
-
}, new go.Binding('text', '', (data, panel) => {
|
2432
|
-
return data?.name;
|
2433
|
-
}), new go.Binding('maxSize', '', (data, panel) => {
|
2434
|
-
return data?.maxSizeNameParam ?? Infinity;
|
2435
|
-
})), this.$(go.Panel, 'Table', {
|
2436
|
-
column: 1,
|
2437
|
-
margin: 2,
|
2438
|
-
padding: 0,
|
2439
|
-
defaultSeparatorPadding: new go.Margin(0, 0, 0, 0),
|
2440
|
-
stretch: go.GraphObject.Fill,
|
2441
|
-
}, new go.Binding('minSize', '', (data, panel) => {
|
2442
|
-
// return panel.part?.data?.minSizeValue;
|
2443
|
-
return new go.Size(panel.part?.data?.minSizeValue?.width, NaN);
|
2444
|
-
}), this.$(go.TextBlock, '', {
|
2445
|
-
column: 0,
|
2446
|
-
margin: 0,
|
2447
|
-
alignment: go.Spot.Left,
|
2448
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
2449
|
-
cursor: 'pointer',
|
2450
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
2451
|
-
margin: 4,
|
2452
|
-
}, new go.Binding('text', '', (data, panel) => {
|
2453
|
-
return `${!!this._initialOptions.isReadOnly
|
2454
|
-
? `${data?.tagName || ''} `
|
2455
|
-
: ''}${data?.value}`;
|
2456
|
-
}), new go.Binding('visible', '', (data) => {
|
2457
|
-
if (!!this._initialOptions.isReadOnly &&
|
2458
|
-
data?.tagName) {
|
2459
|
-
return true;
|
2460
|
-
}
|
2461
|
-
return !!data?.value;
|
2462
|
-
}))),
|
2463
|
-
}, new go.Binding('text', '', (data, panel) => {
|
2464
|
-
return data?.value;
|
2465
|
-
}), new go.Binding('stroke', '', (data) => {
|
2466
|
-
if (!this._initialOptions.isReadOnly) {
|
2467
|
-
return 'transparent';
|
2468
|
-
}
|
2469
|
-
return data.color;
|
2470
|
-
}), new go.Binding('maxSize', '', (data) => {
|
2471
|
-
return new go.Size(data?.maxSizeValue || 190, 14);
|
2472
|
-
}), new go.Binding('font', '', (data) => {
|
2473
|
-
return data?.font;
|
2474
|
-
})), this.$(go.Picture, {
|
2475
|
-
alignment: go.Spot.Right,
|
2476
|
-
column: 1,
|
2477
|
-
margin: new go.Margin(0, 0, 0, 5),
|
2478
|
-
source: ICONS_BASE64['uf044'],
|
2479
|
-
cursor: 'pointer',
|
2480
|
-
visible: false,
|
2481
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
2482
|
-
margin: 4,
|
2483
|
-
}, new go.Binding('text', '', (data, panel) => {
|
2484
|
-
return data?.toolTipAction;
|
2485
|
-
})), new go.Binding('visible', '', (data) => !!data?.toolTipAction)),
|
2486
|
-
height: 14,
|
2487
|
-
width: 14,
|
2488
|
-
}, new go.Binding('visible', '', (data, panel) => {
|
2489
|
-
return (!data?.isReadOnly && !this._initialOptions.isReadOnly);
|
2490
|
-
}), new go.Binding('opacity', '', (data, panel) => {
|
2491
|
-
return data?.isEditable === false ? 0.6 : 1;
|
2492
|
-
})))),
|
2493
|
-
}
|
2494
|
-
// new go.Binding('text', 'name')
|
2495
|
-
)));
|
2496
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.PARAM_TABLE, node);
|
2497
|
-
}
|
2498
|
-
makeMassBalance() {
|
2499
|
-
const self = this;
|
2500
|
-
const node = this.$(go.Part, 'Auto', {}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Horizontal',
|
2501
|
-
// Set defaults for all rows and columns:
|
2502
|
-
{
|
2503
|
-
padding: 4,
|
2504
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
2505
|
-
margin: 4,
|
2506
|
-
maxSize: new go.Size(450, 30),
|
2507
|
-
}, new go.Binding('text', 'tooltip'))),
|
2508
|
-
visible: this._initialOptions.isReadOnly,
|
2509
|
-
}, this.$(go.TextBlock, '', {
|
2510
|
-
margin: new go.Margin(0, 5, 0, 0),
|
2511
|
-
text: 'Mass Balance:',
|
2512
|
-
}, new go.Binding('font', 'font')), this.$(go.TextBlock, '', {
|
2513
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.ALIZARIN,
|
2514
|
-
}, new go.Binding('font', 'font'), new go.Binding('stroke', 'colorValue'), new go.Binding('text', '', (data, panel) => {
|
2515
|
-
return data?.value;
|
2516
|
-
}))));
|
2517
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.MASS_BALANCE, node);
|
2518
|
-
}
|
2519
|
-
makeGroupROPlantTemplate(icon, title, size = { w: 80, h: 80 }) {
|
2520
|
-
let node = this.$(go.Group, 'Spot', {
|
2521
|
-
layout: this.$(go.Layout),
|
2522
|
-
}, {
|
2523
|
-
// minSize: new go.Size(NaN, 600),
|
2524
|
-
}, new go.Binding('selectable', 'selectable'), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Table', this.$(go.Panel, 'Auto', {
|
2525
|
-
row: 0,
|
2526
|
-
padding: new go.Margin(0, 0, 0, 0),
|
2527
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
2528
|
-
name: 'SHAPE_KEY',
|
2529
|
-
fill: '#FCFCFD',
|
2530
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2531
|
-
strokeWidth: 2,
|
2532
|
-
// strokeDashArray: [5, 5],
|
2533
|
-
}), this.$(go.Placeholder, { padding: new go.Margin(15, 0, 0, 0) })), this.$(go.Picture, RO_LINE_DIRTY, {
|
2534
|
-
row: 1,
|
2535
|
-
}, new go.Binding('visible', '', (x) => {
|
2536
|
-
return x?.isViewGeneral && x?.hasOutFlow ? true : false;
|
2537
|
-
}))), this.$(go.Panel, 'Table', {
|
2538
|
-
width: 0,
|
2539
|
-
height: 0,
|
2540
|
-
alignment: new go.Spot(0, 0, 0, 183),
|
2541
|
-
alignmentFocus: go.Spot.Left,
|
2542
|
-
// stretch: go.GraphObject.Vertical,
|
2543
|
-
portId: 'Inflow',
|
2544
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2545
|
-
// alignmentFocus: new go.Spot(0, 0, 0, 150),
|
2546
|
-
fromSpot: go.Spot.Left,
|
2547
|
-
toSpot: go.Spot.Left,
|
2548
|
-
fromLinkable: true,
|
2549
|
-
toLinkable: true,
|
2550
|
-
}), this.$(go.Panel, 'Table', {
|
2551
|
-
width: 0,
|
2552
|
-
height: 0,
|
2553
|
-
alignment: new go.Spot(0, 0, 970, 315),
|
2554
|
-
alignmentFocus: go.Spot.Bottom,
|
2555
|
-
portId: 'OutFlow_Clean',
|
2556
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2557
|
-
fromSpot: go.Spot.Bottom,
|
2558
|
-
toSpot: go.Spot.Bottom,
|
2559
|
-
fromLinkable: true,
|
2560
|
-
toLinkable: true,
|
2561
|
-
}), this.$(go.Panel, 'Table', {
|
2562
|
-
width: 0,
|
2563
|
-
height: 0,
|
2564
|
-
// alignment: new go.Spot(0, 0, 480, 525),
|
2565
|
-
// alignment: new go.Spot(0, 0, 475, 552),
|
2566
|
-
alignmentFocus: go.Spot.Bottom,
|
2567
|
-
portId: 'OutFlow_Dirty',
|
2568
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2569
|
-
fromSpot: go.Spot.Bottom,
|
2570
|
-
toSpot: go.Spot.Bottom,
|
2571
|
-
fromLinkable: true,
|
2572
|
-
toLinkable: true,
|
2573
|
-
}, new go.Binding('alignment', '', (x) => {
|
2574
|
-
return x?.isViewGeneral && x?.hasOutFlow
|
2575
|
-
? new go.Spot(0, 0, 475, 552)
|
2576
|
-
: new go.Spot(0, 0, 480, 525);
|
2577
|
-
})));
|
2578
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2579
|
-
}
|
2580
|
-
makeGroupBoilerTemplate(icon, title, size = { w: 80, h: 80 }) {
|
2581
|
-
let node = this.$(go.Group, 'Spot', {
|
2582
|
-
selectable: false,
|
2583
|
-
}, {
|
2584
|
-
// minSize: new go.Size(NaN, 600),
|
2585
|
-
}, new go.Binding('selectable', 'selectable'), this.$(go.Panel, 'Auto', {
|
2586
|
-
padding: new go.Margin(0, 0, 0, 0),
|
2587
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
2588
|
-
name: 'SHAPE_KEY',
|
2589
|
-
fill: '#FCFCFD',
|
2590
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2591
|
-
strokeWidth: 2,
|
2592
|
-
}), this.$(go.Placeholder, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), { padding: new go.Margin(0, 0, 0, 0) })), this.$(go.Panel, 'Spot', {
|
2593
|
-
width: 0,
|
2594
|
-
height: 0,
|
2595
|
-
alignment: new go.Spot(0, 0.5, 0, 112),
|
2596
|
-
alignmentFocus: go.Spot.Left,
|
2597
|
-
portId: 'Inflow',
|
2598
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2599
|
-
fromSpot: go.Spot.Left,
|
2600
|
-
toSpot: go.Spot.Left,
|
2601
|
-
fromLinkable: true,
|
2602
|
-
toLinkable: true,
|
2603
|
-
}), this.$(go.Panel, 'Spot', {
|
2604
|
-
alignmentFocus: go.Spot.Top,
|
2605
|
-
alignment: new go.Spot(1, 1, -215, 0),
|
2606
|
-
}, this.$(go.Picture, OUTFLOW_LINE_DIRTY, {
|
2607
|
-
width: 10,
|
2608
|
-
height: 20,
|
2609
|
-
}, new go.Binding('visible', '', (x) => {
|
2610
|
-
return x?.isViewGeneral && x?.hasOutFlow ? true : false;
|
2611
|
-
})), this.$(go.Panel, {
|
2612
|
-
alignment: go.Spot.BottomLeft,
|
2613
|
-
alignmentFocus: go.Spot.Top,
|
2614
|
-
portId: 'OutFlow',
|
2615
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2616
|
-
fromSpot: go.Spot.Bottom,
|
2617
|
-
fromLinkable: true,
|
2618
|
-
toLinkable: true,
|
2619
|
-
})));
|
2620
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2621
|
-
}
|
2622
|
-
makeGroupCoolingTowerTemplate(icon, title, size = { w: 80, h: 80 }) {
|
2623
|
-
let node = this.$(go.Group, 'Spot', {
|
2624
|
-
selectable: false,
|
2625
|
-
layout: this.$(go.Layout),
|
2626
|
-
padding: new go.Margin(0, 30, 0, 0),
|
2627
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', {
|
2628
|
-
row: 0,
|
2629
|
-
padding: new go.Margin(0, 0, 0, 0),
|
2630
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
2631
|
-
name: 'SHAPE_KEY',
|
2632
|
-
fill: '#FCFCFD',
|
2633
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2634
|
-
strokeWidth: 2,
|
2635
|
-
strokeDashArray: [5, 5],
|
2636
|
-
}), this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0) })), this.$(go.Panel, 'Table', {
|
2637
|
-
width: 0,
|
2638
|
-
height: 0,
|
2639
|
-
alignment: new go.Spot(0, 0, 0, 533),
|
2640
|
-
alignmentFocus: go.Spot.Bottom,
|
2641
|
-
portId: 'Inflow',
|
2642
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2643
|
-
fromSpot: go.Spot.Left,
|
2644
|
-
toSpot: go.Spot.Left,
|
2645
|
-
fromLinkable: true,
|
2646
|
-
toLinkable: true,
|
2647
|
-
}), this.$(go.Panel, 'Spot', {
|
2648
|
-
alignmentFocus: go.Spot.Top,
|
2649
|
-
alignment: new go.Spot(0.5, 1, 23, 0),
|
2650
|
-
}, this.$(go.Picture, OUTFLOW_LINE_DIRTY, {
|
2651
|
-
width: 10,
|
2652
|
-
height: 20,
|
2653
|
-
}, new go.Binding('visible', '', (x) => {
|
2654
|
-
return x?.isViewGeneral && x?.hasOutFlow ? true : false;
|
2655
|
-
})), this.$(go.Panel, {
|
2656
|
-
alignment: new go.Spot(0, 0, 0, 18),
|
2657
|
-
alignmentFocus: go.Spot.Top,
|
2658
|
-
portId: 'OutFlow',
|
2659
|
-
cursor: this._initialOptions.isReadOnly ? '' : 'pointer',
|
2660
|
-
fromSpot: go.Spot.Center,
|
2661
|
-
toSpot: go.Spot.Right,
|
2662
|
-
fromLinkable: true,
|
2663
|
-
toLinkable: true,
|
2664
|
-
})));
|
2665
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2666
|
-
}
|
2667
|
-
groupPlantCellTemplate(icon, title, size = { w: 80, h: 80 }) {
|
2668
|
-
const self = this;
|
2669
|
-
let node = this.$(go.Group, 'Spot', {
|
2670
|
-
// layout: this.$(go.Layout),
|
2671
|
-
// layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
|
2672
|
-
// isSubGraphExpanded: false,
|
2673
|
-
// background: 'transparent',
|
2674
|
-
// layerName: 'Foreground',
|
2675
|
-
// wasSubGraphExpanded: false,
|
2676
|
-
movable: false,
|
2677
|
-
selectable: false,
|
2678
|
-
avoidable: false,
|
2679
|
-
// resizable: true,
|
2680
|
-
// resizable: false,
|
2681
|
-
// width: data?.ob?.minWith ?? 50,
|
2682
|
-
// height: 500,
|
2683
|
-
// isSubGraphExpanded: true, // ensure the group is always expanded
|
2684
|
-
// computesBoundsAfterDrag: true,
|
2685
|
-
// handlesDragDropForMembers: true, // handle drag-and-drop events for its member nodes
|
2686
|
-
// maxSize: new go.Size(500, 500),
|
2687
|
-
// minSize: new go.Size(500, 500),
|
2688
|
-
// isSubGraphExpanded: true,
|
2689
|
-
// layerName: DIAGRAM.LAYERS.BACKGROUND,
|
2690
|
-
// mouseDrop: function (e, grp) {
|
2691
|
-
// // disallow dropping anything onto an Adornment
|
2692
|
-
// if (grp instanceof go.Adornment) return;
|
2693
|
-
// },
|
2694
|
-
// dragComputation: function (node, pt, gridPt) {
|
2695
|
-
// let grp = node.containingGroup;
|
2696
|
-
// if (grp !== null) {
|
2697
|
-
// let rect = grp.actualBounds;
|
2698
|
-
// pt.x = Math.max(rect.left, Math.min(pt.x, rect.right));
|
2699
|
-
// pt.y = Math.max(rect.top, Math.min(pt.y, rect.bottom));
|
2700
|
-
// }
|
2701
|
-
// return pt;
|
2702
|
-
// },
|
2703
|
-
// dropComputation: function (node, pt, gridPt) {
|
2704
|
-
// let grp = node.containingGroup;
|
2705
|
-
// if (grp !== null) {
|
2706
|
-
// let rect = grp.actualBounds;
|
2707
|
-
// pt.x = Math.max(rect.left, Math.min(pt.x, rect.right));
|
2708
|
-
// pt.y = Math.max(rect.top, Math.min(pt.y, rect.bottom));
|
2709
|
-
// }
|
2710
|
-
// return pt;
|
2711
|
-
// },
|
2712
|
-
// dragComputation: function (part, pt, gridpt) {
|
2713
|
-
// // Get the current group's actual bounds
|
2714
|
-
// const grp = part.containingGroup;
|
2715
|
-
// if (grp) {
|
2716
|
-
// const bnds = grp.actualBounds;
|
2717
|
-
// const loc = part.location;
|
2718
|
-
// // See if the part's new location would be out of bounds
|
2719
|
-
// const newx = Math.max(bnds.x, Math.min(pt.x, bnds.right - part.actualBounds.width / 2));
|
2720
|
-
// const newy = Math.max(bnds.y, Math.min(pt.y, bnds.bottom - part.actualBounds.height / 2));
|
2721
|
-
// // Modify the result point to keep the Part inside the Group
|
2722
|
-
// return new go.Point(newx, newy);
|
2723
|
-
// }
|
2724
|
-
// return pt;
|
2725
|
-
// },
|
2726
|
-
click: (e, obj) => {
|
2727
|
-
self.myDiagram?.clearSelection();
|
2728
|
-
},
|
2729
|
-
}, {
|
2730
|
-
// mouseDragEnter: (e, obj) => {
|
2731
|
-
// },
|
2732
|
-
// mouseDrop: (e, obj) => {
|
2733
|
-
// },
|
2734
|
-
// mouseEnter: (e, obj) => {
|
2735
|
-
// const node = obj.part;
|
2736
|
-
// self.onHoverInfoButton.emit({
|
2737
|
-
// left: e?.['Wr']?.x + 8,
|
2738
|
-
// top: e?.['Wr']?.y,
|
2739
|
-
// node: node,
|
2740
|
-
// });
|
2741
|
-
// // let shape = (node as any)?.findObject('SHAPE_KEY');
|
2742
|
-
// // if (shape) {
|
2743
|
-
// // shape.stroke = 'blue';
|
2744
|
-
// // }
|
2745
|
-
// },
|
2746
|
-
// mouseLeave: (e, obj) => {
|
2747
|
-
// self.onHoverInfoButton.emit(null);
|
2748
|
-
// // let shape = (node as any)?.findObject('SHAPE_KEY');
|
2749
|
-
// // if (shape) {
|
2750
|
-
// // shape.stroke = AtoGojsEditorModel.ENUM_COLORS.WHITE;
|
2751
|
-
// // }
|
2752
|
-
// },
|
2753
|
-
}, new go.Binding('layout', '', function (data, node) {
|
2754
|
-
// return data?.layoutValue === AtoGojsEditorModel.ENUM_LAYOUT_EDITOR.AUTO
|
2755
|
-
// ? self.$(go.LayeredDigraphLayout, { direction: 0 })
|
2756
|
-
// : node?.layout;
|
2757
|
-
if (data?.layoutValue !== data?.layoutValueClone) {
|
2758
|
-
data.layoutValueClone = data?.layoutValue;
|
2759
|
-
return data?.layoutValue ===
|
2760
|
-
AtoGojsEditorModel.ENUM_LAYOUT_EDITOR.AUTO
|
2761
|
-
? self.$(go.LayeredDigraphLayout, { direction: 0 })
|
2762
|
-
: self.$(go.Layout);
|
2763
|
-
}
|
2764
|
-
else {
|
2765
|
-
return node?.layout;
|
2766
|
-
}
|
2767
|
-
// : self.$(go.Layout);
|
2768
|
-
// return data?.layout;
|
2769
|
-
// return data?.previousLayout || self.$(go.LayeredDigraphLayout, { direction: 0 });
|
2770
|
-
// return self.$(go.LayeredDigraphLayout, { direction: 0 });
|
2771
|
-
}),
|
2772
|
-
// new go.Binding('grid', 'grid'),
|
2773
|
-
new go.Binding('selectable', 'selectable'),
|
2774
|
-
// new go.Binding('width', '', function (data) {
|
2775
|
-
// return data?.ob?.minWith ?? 50;
|
2776
|
-
// }),
|
2777
|
-
new go.Binding('minSize', '', function (data) {
|
2778
|
-
return new go.Size(data?.ob?.minWith ?? 50, data?.ob?.minHeight ?? 50); // Customize minSize based on data
|
2779
|
-
}).ofObject(),
|
2780
|
-
// new go.Binding('width', '', function (data) {
|
2781
|
-
// return data?.ob?.minWith ?? 50; // Customize minSize based on data
|
2782
|
-
// }).ofObject(),
|
2783
|
-
// new go.Binding('height', '', function (data) {
|
2784
|
-
// return data?.ob?.minHeight ?? 50; // Customize minSize based on data
|
2785
|
-
// }).ofObject(),
|
2786
|
-
new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
|
2787
|
-
// new go.Binding('isSubGraphExpanded', 'expanded').makeTwoWay(),
|
2788
|
-
this.$(go.Panel, 'Auto', {
|
2789
|
-
padding: new go.Margin(0, 0, 0, 0),
|
2790
|
-
// margin:new go.Margin(0, 50, 0, 50),
|
2791
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
2792
|
-
name: 'SHAPE_KEY',
|
2793
|
-
fill: 'transparent',
|
2794
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2795
|
-
strokeWidth: 2,
|
2796
|
-
strokeDashArray: [5, 5],
|
2797
|
-
}), this.$(go.Placeholder, { padding: new go.Margin(0, 0, 0, 0) })));
|
2798
|
-
// node.memberValidation = function (node, group) {
|
2799
|
-
// if (!group) return true; // allow ungrouping
|
2800
|
-
// const groupBounds = group.actualBounds;
|
2801
|
-
// const nodeBounds = node.actualBounds;
|
2802
|
-
// return groupBounds.containsRect(nodeBounds);
|
2803
|
-
// };
|
2804
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2805
|
-
}
|
2806
|
-
groupPCInputOrOutTemplate(icon, title, padding) {
|
2807
|
-
// let node = this.$(
|
2808
|
-
// go.Group,
|
2809
|
-
// 'Spot',
|
2810
|
-
// {
|
2811
|
-
// layout: this.$(go.Layout),
|
2812
|
-
// movable: false,
|
2813
|
-
// selectable: false,
|
2814
|
-
// },
|
2815
|
-
// // {
|
2816
|
-
// // // minSize: new go.Size(500, 500),
|
2817
|
-
// // movable: false,
|
2818
|
-
// // ariaReadOnly: true,
|
2819
|
-
// // },
|
2820
|
-
// this.$(
|
2821
|
-
// go.Panel,
|
2822
|
-
// 'Auto',
|
2823
|
-
// {
|
2824
|
-
// padding: new go.Margin(0, 0, 0, 0),
|
2825
|
-
// },
|
2826
|
-
// this.$(go.Shape, 'RoundedRectangle', {
|
2827
|
-
// fill: 'transparent',
|
2828
|
-
// // stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
2829
|
-
// stroke: AtoGojsEditorModel.ENUM_COLORS.WHITE,
|
2830
|
-
// strokeWidth: 2,
|
2831
|
-
// strokeDashArray: [5, 5],
|
2832
|
-
// }),
|
2833
|
-
// this.$(go.Placeholder, {
|
2834
|
-
// padding: new go.Margin(0, 0, 0, 0),
|
2835
|
-
// }),
|
2836
|
-
// ),
|
2837
|
-
// );
|
2838
|
-
let node = this.$(go.Group, 'Spot', {
|
2839
|
-
layout: this.$(go.LayeredDigraphLayout, { direction: 0 }),
|
2840
|
-
movable: false,
|
2841
|
-
selectable: false,
|
2842
|
-
avoidable: false,
|
2843
|
-
// isSubGraphExpanded: false,
|
2844
|
-
// isSubGraphExpanded: false,
|
2845
|
-
// layerName: 'Foreground',
|
2846
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', {
|
2847
|
-
padding: padding ?? new go.Margin(0, 0, 0, 0),
|
2848
|
-
}, this.$(go.Shape, 'RoundedRectangle', {
|
2849
|
-
fill: 'transparent',
|
2850
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.WHITE,
|
2851
|
-
// stroke: AtoGojsEditorModel.ENUM_COLORS.ALIZARIN,
|
2852
|
-
strokeWidth: 2,
|
2853
|
-
// strokeDashArray: [5, 5],
|
2854
|
-
}), this.$(go.Placeholder, {
|
2855
|
-
padding: new go.Margin(0, 0, 0, 0),
|
2856
|
-
})));
|
2857
|
-
this.myDiagram.groupTemplateMap.set(title, node);
|
2858
|
-
}
|
2859
|
-
makeGroupZoneTemplate(size = {
|
2860
|
-
w: AtoGojsEditorModel.GRID_SIZE * 14,
|
2861
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
2862
|
-
}) {
|
2863
|
-
const self = this;
|
2864
|
-
let node = this.$(go.Group, 'Vertical', {
|
2865
|
-
layout: this.$(go.GridLayout, {
|
2866
|
-
wrappingColumn: 1,
|
2867
|
-
spacing: new go.Size(0, 0),
|
2868
|
-
}),
|
2869
|
-
}, {
|
2870
|
-
locationSpot: go.Spot.Center,
|
2871
|
-
mouseOver: function (e, obj) {
|
2872
|
-
// self.showPoint(obj?.part?.location);
|
2873
|
-
},
|
2874
|
-
click: (e, obj) => {
|
2875
|
-
if (obj?.data?.onSelected) {
|
2876
|
-
obj?.data?.onSelected(obj?.data);
|
2877
|
-
}
|
2878
|
-
},
|
2879
|
-
selectionChanged: (e) => {
|
2880
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
2881
|
-
e?.data?.onSelected(null);
|
2882
|
-
}
|
2883
|
-
},
|
2884
|
-
selectionAdornmentTemplate: this._initialOptions.isReadOnly
|
2885
|
-
? null
|
2886
|
-
: this.$(go.Adornment, 'Spot', {
|
2887
|
-
shadowVisible: true,
|
2888
|
-
shadowBlur: 6,
|
2889
|
-
shadowOffset: new go.Point(0, 2),
|
2890
|
-
shadowColor: '#00000029',
|
2891
|
-
}, this.$(go.Panel, 'Auto', this.$(go.Shape, {
|
2892
|
-
fill: null,
|
2893
|
-
stroke: 'dodgerblue',
|
2894
|
-
strokeWidth: 4,
|
2895
|
-
}), this.$(go.Placeholder, { padding: 3 })), this.$(go.Panel, 'Horizontal', {
|
2896
|
-
alignment: go.Spot.TopRight,
|
2897
|
-
alignmentFocus: go.Spot.Bottom,
|
2898
|
-
background: 'white',
|
2899
|
-
}, this.$('Button', {
|
2900
|
-
_dragData: {
|
2901
|
-
type: AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE,
|
2902
|
-
name: 0,
|
2903
|
-
color: AtoGojsEditorModel.ENUM_COLORS.BLUE,
|
2904
|
-
},
|
2905
|
-
click: self.addItemOnGroupZone, // defined below, to support a click on the button
|
2906
|
-
'ButtonBorder.strokeWidth': 0,
|
2907
|
-
'ButtonBorder.fill': 'white',
|
2908
|
-
}, this.$(go.TextBlock, {
|
2909
|
-
margin: 4,
|
2910
|
-
text: '\uf055',
|
2911
|
-
font: '20px "Font Awesome 6 Pro"',
|
2912
|
-
cursor: 'pointer',
|
2913
|
-
stroke: '#2c2c2c',
|
2914
|
-
})),
|
2915
|
-
// more
|
2916
|
-
this.generateActionGroup([
|
2917
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.RENAME,
|
2918
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DETAILS,
|
2919
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.OUTFLOW,
|
2920
|
-
AtoDefaultGojsEditor.ENUM_ACTIONS.DELETE,
|
2921
|
-
])
|
2922
|
-
// this.$(
|
2923
|
-
// // Edit Text
|
2924
|
-
// 'Button',
|
2925
|
-
// {
|
2926
|
-
// click: self.editTextGroupZone,
|
2927
|
-
// 'ButtonBorder.strokeWidth': 0,
|
2928
|
-
// 'ButtonBorder.fill': 'white',
|
2929
|
-
// },
|
2930
|
-
// this.$(go.TextBlock, {
|
2931
|
-
// margin: 4,
|
2932
|
-
// text: '\ue1bf',
|
2933
|
-
// font: '20px "Font Awesome 6 Pro"',
|
2934
|
-
// cursor: 'pointer',
|
2935
|
-
// stroke: '#2c2c2c',
|
2936
|
-
// }),
|
2937
|
-
// ),
|
2938
|
-
// this.$(
|
2939
|
-
// // Open Detail
|
2940
|
-
// 'Button',
|
2941
|
-
// {
|
2942
|
-
// click: (e, obj: any) => {
|
2943
|
-
// const node = obj.part;
|
2944
|
-
// self.onOpenDetail.emit({
|
2945
|
-
// node,
|
2946
|
-
// });
|
2947
|
-
// },
|
2948
|
-
// 'ButtonBorder.strokeWidth': 0,
|
2949
|
-
// 'ButtonBorder.fill': 'white',
|
2950
|
-
// },
|
2951
|
-
//
|
2952
|
-
// this.$(go.TextBlock, {
|
2953
|
-
// margin: 4,
|
2954
|
-
// text: '\ue49a',
|
2955
|
-
// font: '20px "Font Awesome 6 Pro"',
|
2956
|
-
// cursor: 'pointer',
|
2957
|
-
// }),
|
2958
|
-
// ),
|
2959
|
-
// !this._initialOptions.isReadOnly
|
2960
|
-
// ? this.$(
|
2961
|
-
// 'Button',
|
2962
|
-
// {
|
2963
|
-
// actionMove: self.dragNewNode, // defined below, to support dragging from the button
|
2964
|
-
// _dragData: {
|
2965
|
-
// type: AtoGojsEditorModel.ENUM_TEMPLATES.TEXT_NODE,
|
2966
|
-
// name: 0,
|
2967
|
-
// color: AtoGojsEditorModel.ENUM_COLORS.BLUE,
|
2968
|
-
// },
|
2969
|
-
// click: self.clickNewNode, // defined below, to support a click on the button
|
2970
|
-
// 'ButtonBorder.strokeWidth': 0,
|
2971
|
-
// 'ButtonBorder.fill': 'white',
|
2972
|
-
// },
|
2973
|
-
// this.$(go.TextBlock, {
|
2974
|
-
// margin: 4,
|
2975
|
-
// text: '\ue157',
|
2976
|
-
// font: '20px "Font Awesome 6 Pro"',
|
2977
|
-
// cursor: 'pointer',
|
2978
|
-
// stroke: '#2c2c2c',
|
2979
|
-
// }),
|
2980
|
-
// )
|
2981
|
-
// : {},
|
2982
|
-
// this.$(
|
2983
|
-
// 'Button',
|
2984
|
-
// {
|
2985
|
-
// click: self.deleteNode,
|
2986
|
-
// 'ButtonBorder.strokeWidth': 0,
|
2987
|
-
// 'ButtonBorder.fill': 'white',
|
2988
|
-
// },
|
2989
|
-
// this.$(go.TextBlock, {
|
2990
|
-
// margin: 4,
|
2991
|
-
// text: '\uf2ed',
|
2992
|
-
// font: '20px "Font Awesome 6 Pro"',
|
2993
|
-
// cursor: 'pointer',
|
2994
|
-
// }),
|
2995
|
-
// ),
|
2996
|
-
)),
|
2997
|
-
}, this.$(go.Panel, 'Auto', this.$(go.Shape, 'RoundedRectangle', {
|
2998
|
-
fill: 'transparent',
|
2999
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.RESOLUTION_BLUE,
|
3000
|
-
strokeWidth: 2,
|
3001
|
-
strokeDashArray: [5, 5],
|
3002
|
-
maxSize: new go.Size(size.w, NaN),
|
3003
|
-
}), this.$(go.Panel, 'Table', {
|
3004
|
-
alignment: go.Spot.Top,
|
3005
|
-
padding: new go.Margin(17, 10, 16, 10),
|
3006
|
-
}, this.$(go.TextBlock, {
|
3007
|
-
row: 0,
|
3008
|
-
margin: new go.Margin(5, 0, 10, 0),
|
3009
|
-
editable: true,
|
3010
|
-
desiredSize: new go.Size(size.w - 20, 25),
|
3011
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
|
3012
|
-
font: 'bold 16px Arial',
|
3013
|
-
textAlign: 'center',
|
3014
|
-
wrap: go.TextBlock.None,
|
3015
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
3016
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
3017
|
-
margin: 4,
|
3018
|
-
}, new go.Binding('text', 'name').makeTwoWay())),
|
3019
|
-
}, new go.Binding('text', 'name').makeTwoWay()), this.$(go.Placeholder, 'Vertical', {
|
3020
|
-
row: 1,
|
3021
|
-
})), this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false)), new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify));
|
3022
|
-
this.myDiagram.groupTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.ZONE, node);
|
3023
|
-
}
|
3024
|
-
makeZoneItemTemplate(size = {
|
3025
|
-
w: AtoGojsEditorModel.GRID_SIZE * 12,
|
3026
|
-
h: AtoGojsEditorModel.GRID_SIZE * 2,
|
3027
|
-
}) {
|
3028
|
-
const self = this;
|
3029
|
-
const node = this.$(go.Node, 'Auto',
|
3030
|
-
// {
|
3031
|
-
// mouseHover: (e, obj) => {
|
3032
|
-
// const node = obj.part;
|
3033
|
-
// if ((obj as any).part?.ob?.value === VALUE_NA) {
|
3034
|
-
// self.onHoverInfoButton.emit({
|
3035
|
-
// left: e?.['Wr']?.x + 8,
|
3036
|
-
// top: e?.['Wr']?.y,
|
3037
|
-
// node: node
|
3038
|
-
// });
|
3039
|
-
// }
|
3040
|
-
// },
|
3041
|
-
// mouseLeave: (e, obj) => {
|
3042
|
-
// if ((obj as any).part?.ob?.value === VALUE_NA) {
|
3043
|
-
// self.onHoverInfoButton.emit(null);
|
3044
|
-
// }
|
3045
|
-
// },
|
3046
|
-
// click: (e, obj: any) => {
|
3047
|
-
// const node = obj.part;
|
3048
|
-
// this.isShowNodeInfo ? self.onClickInfoButton.emit({
|
3049
|
-
// left: e?.['Wr']?.x,
|
3050
|
-
// top: e?.['Wr']?.y,
|
3051
|
-
// node: node
|
3052
|
-
// }) : null;
|
3053
|
-
// },
|
3054
|
-
// },
|
3055
|
-
// new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify),
|
3056
|
-
{
|
3057
|
-
movable: false,
|
3058
|
-
}, this.$(go.Panel, 'Auto', {
|
3059
|
-
width: size.w,
|
3060
|
-
height: size.h,
|
3061
|
-
}, this.$(go.Shape, 'Rectangle', {
|
3062
|
-
fill: AtoGojsEditorModel.ENUM_COLORS.LIGHT_BLUE,
|
3063
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.LINK_WATER,
|
3064
|
-
}), this.$(go.Panel, 'Vertical', this.$(go.TextBlock, {
|
3065
|
-
editable: true,
|
3066
|
-
row: 2,
|
3067
|
-
margin: new go.Margin(10, 0, 5, 0),
|
3068
|
-
font: 'bold 12px Arial',
|
3069
|
-
textAlign: 'center',
|
3070
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
|
3071
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
3072
|
-
margin: 4,
|
3073
|
-
}, new go.Binding('text', 'name').makeTwoWay())),
|
3074
|
-
}, new go.Binding('text', 'name').makeTwoWay(), new go.Binding('visible', 'name', (x) => !!x)), this.$(go.Panel, 'Horizontal', {
|
3075
|
-
margin: new go.Margin(0, 10, 0, 10),
|
3076
|
-
}, this.$(go.TextBlock, {
|
3077
|
-
margin: new go.Margin(0, 5, 10, 0),
|
3078
|
-
textAlign: 'center',
|
3079
|
-
font: '12px sans-serif',
|
3080
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.NIGHT_RIDER,
|
3081
|
-
wrap: go.TextBlock.WrapFit,
|
3082
|
-
editable: true,
|
3083
|
-
isMultiline: false,
|
3084
|
-
maxSize: new go.Size(size.w - 100, 15),
|
3085
|
-
overflow: go.TextBlock.OverflowEllipsis,
|
3086
|
-
toolTip: this.$('ToolTip', this.$(go.TextBlock, {
|
3087
|
-
margin: 4,
|
3088
|
-
}, new go.Binding('text', 'nameItem').makeTwoWay())),
|
3089
|
-
}, new go.Binding('text', 'nameItem').makeTwoWay(), new go.Binding('visible', 'nameItem', (x) => !!x)), this.$(go.TextBlock, {
|
3090
|
-
margin: new go.Margin(0, 5, 10, 0),
|
3091
|
-
textAlign: 'center',
|
3092
|
-
font: '12px sans-serif',
|
3093
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
3094
|
-
wrap: go.TextBlock.WrapFit,
|
3095
|
-
text: '< ',
|
3096
|
-
}, new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')), this.$(go.TextBlock, {
|
3097
|
-
margin: new go.Margin(0, 5, 10, 0),
|
3098
|
-
textAlign: 'center',
|
3099
|
-
font: '12px sans-serif',
|
3100
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
3101
|
-
wrap: go.TextBlock.WrapFit,
|
3102
|
-
}, new go.Binding('text', 'data', (x) => {
|
3103
|
-
if (typeof x?.quantity !== 'number') {
|
3104
|
-
return '';
|
3105
|
-
}
|
3106
|
-
const formatted = UtilsService.convertPrefixesData({
|
3107
|
-
value: x?.quantity,
|
3108
|
-
unit: x?.unit,
|
3109
|
-
});
|
3110
|
-
return (formatted.shortenedNumber +
|
3111
|
-
' ' +
|
3112
|
-
formatted.unitPrefixes +
|
3113
|
-
x?.unit ?? '');
|
3114
|
-
}), new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number')), this.$(go.TextBlock, {
|
3115
|
-
margin: new go.Margin(0, 5, 10, 0),
|
3116
|
-
textAlign: 'center',
|
3117
|
-
font: '12px sans-serif',
|
3118
|
-
stroke: AtoGojsEditorModel.ENUM_COLORS.CERULEAN,
|
3119
|
-
wrap: go.TextBlock.WrapFit,
|
3120
|
-
text: ' >',
|
3121
|
-
}, new go.Binding('visible', 'data', (x) => typeof x?.quantity === 'number'))))));
|
3122
|
-
this.myDiagram.nodeTemplateMap.set(AtoGojsEditorModel.ENUM_TEMPLATES.ZONE_ENERGY_ITEM, node);
|
3123
|
-
}
|
3124
|
-
makeSpecialTemplate(icon, title, size = {
|
3125
|
-
w: AtoGojsEditorModel.GRID_SIZE * 5,
|
3126
|
-
h: AtoGojsEditorModel.GRID_SIZE * 5,
|
3127
|
-
}) {
|
3128
|
-
let node = null;
|
3129
|
-
switch (title) {
|
3130
|
-
case AtoGojsEditorModel.ENUM_TEMPLATES.SPECIAL_PROCESS:
|
3131
|
-
node = this.$(go.Node, 'Spot',
|
3132
|
-
// {
|
3133
|
-
// fromSpot: go.Spot.Right, // coming out from middle-right
|
3134
|
-
// toSpot: go.Spot.Left
|
3135
|
-
// },
|
3136
|
-
{
|
3137
|
-
click: (e, obj) => {
|
3138
|
-
if (obj?.data?.onSelected) {
|
3139
|
-
obj?.data?.onSelected(obj?.data);
|
3140
|
-
}
|
3141
|
-
},
|
3142
|
-
selectionChanged: (e) => {
|
3143
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
3144
|
-
e?.data?.onSelected(null);
|
3145
|
-
}
|
3146
|
-
},
|
3147
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
|
3148
|
-
fill: 'white',
|
3149
|
-
stroke: '#2D3B77',
|
3150
|
-
strokeWidth: 2,
|
3151
|
-
// strokeDashArray: [5, 5],
|
3152
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, AtoGojsEditorModel.ENUM_TEMPLATES.PROCESS, {
|
3153
|
-
row: 0,
|
3154
|
-
margin: new go.Margin(3, 3, 10, 3),
|
3155
|
-
maxSize: new go.Size(size.w - 20, NaN),
|
3156
|
-
stroke: '#444444',
|
3157
|
-
font: 'normal 10pt Arial',
|
3158
|
-
textAlign: 'center',
|
3159
|
-
}), this.$(go.Picture, icon, {
|
3160
|
-
row: 1,
|
3161
|
-
margin: new go.Margin(0, 0, 10, 0),
|
3162
|
-
alignment: go.Spot.Center,
|
3163
|
-
maxSize: new go.Size(60, 60),
|
3164
|
-
imageStretch: go.GraphObject.Uniform,
|
3165
|
-
}))), this.$(go.Panel, 'Vertical', {
|
3166
|
-
alignment: go.Spot.Left,
|
3167
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
3168
|
-
}), this.$(go.Panel, 'Vertical', {
|
3169
|
-
alignment: go.Spot.Right,
|
3170
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
3171
|
-
}),
|
3172
|
-
// four named ports, one on each side:
|
3173
|
-
this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
3174
|
-
break;
|
3175
|
-
case AtoGojsEditorModel.ENUM_TEMPLATES.SPECIAL_STORAGE:
|
3176
|
-
node = this.$(go.Node, 'Spot', {
|
3177
|
-
click: (e, obj) => {
|
3178
|
-
if (obj?.data?.onSelected) {
|
3179
|
-
obj?.data?.onSelected(obj?.data);
|
3180
|
-
}
|
3181
|
-
},
|
3182
|
-
selectionChanged: (e) => {
|
3183
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
3184
|
-
e?.data?.onSelected(null);
|
3185
|
-
}
|
3186
|
-
},
|
3187
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
|
3188
|
-
fill: 'white',
|
3189
|
-
stroke: '#2D3B77',
|
3190
|
-
strokeWidth: 2,
|
3191
|
-
// strokeDashArray: [5, 5],
|
3192
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, AtoGojsEditorModel.ENUM_TEMPLATES.STORAGE, {
|
3193
|
-
row: 0,
|
3194
|
-
margin: new go.Margin(3, 3, 10, 3),
|
3195
|
-
maxSize: new go.Size(size.w - 20, NaN),
|
3196
|
-
stroke: '#444444',
|
3197
|
-
font: 'normal 10pt Arial',
|
3198
|
-
textAlign: 'center',
|
3199
|
-
}), this.$(go.Picture, icon, {
|
3200
|
-
row: 1,
|
3201
|
-
margin: new go.Margin(0, 0, 10, 0),
|
3202
|
-
alignment: go.Spot.Center,
|
3203
|
-
minSize: new go.Size(40, 40),
|
3204
|
-
maxSize: new go.Size(50, 50),
|
3205
|
-
imageStretch: go.GraphObject.Uniform,
|
3206
|
-
}, new go.Binding('source', 'icon').makeTwoWay()))), this.$(go.Panel, 'Vertical', {
|
3207
|
-
alignment: go.Spot.Left,
|
3208
|
-
alignmentFocus: new go.Spot(0, 0.5, 8, 0),
|
3209
|
-
}), this.$(go.Panel, 'Vertical', {
|
3210
|
-
alignment: go.Spot.Right,
|
3211
|
-
alignmentFocus: new go.Spot(1, 0.5, -8, 0),
|
3212
|
-
}),
|
3213
|
-
// four named ports, one on each side:
|
3214
|
-
this.makePort('T', go.Spot.Top, go.Spot.TopSide, false, true), this.makePort('L', go.Spot.Left, go.Spot.LeftSide, true, true), this.makePort('R', go.Spot.Right, go.Spot.RightSide, true, true), this.makePort('B', go.Spot.Bottom, go.Spot.BottomSide, true, false));
|
3215
|
-
break;
|
3216
|
-
case AtoGojsEditorModel.ENUM_TEMPLATES.SPECIAL_STORE:
|
3217
|
-
node = this.$(go.Node, 'Spot', {
|
3218
|
-
click: (e, obj) => {
|
3219
|
-
if (obj?.data?.onSelected) {
|
3220
|
-
obj?.data?.onSelected(obj?.data);
|
3221
|
-
}
|
3222
|
-
},
|
3223
|
-
selectionChanged: (e) => {
|
3224
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
3225
|
-
e?.data?.onSelected(null);
|
3226
|
-
}
|
3227
|
-
},
|
3228
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
|
3229
|
-
fill: 'white',
|
3230
|
-
stroke: '#2D3B77',
|
3231
|
-
strokeWidth: 2,
|
3232
|
-
// strokeDashArray: [5, 5],
|
3233
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Store', {
|
3234
|
-
row: 0,
|
3235
|
-
margin: new go.Margin(3, 3, 10, 3),
|
3236
|
-
maxSize: new go.Size(size.w - 20, NaN),
|
3237
|
-
stroke: '#444444',
|
3238
|
-
font: 'normal 10pt Arial',
|
3239
|
-
textAlign: 'center',
|
3240
|
-
}), this.$(go.Picture, icon, {
|
3241
|
-
row: 1,
|
3242
|
-
margin: new go.Margin(0, 0, 10, 0),
|
3243
|
-
alignment: go.Spot.Center,
|
3244
|
-
maxSize: new go.Size(60, 60),
|
3245
|
-
imageStretch: go.GraphObject.Uniform,
|
3246
|
-
}))));
|
3247
|
-
break;
|
3248
|
-
case AtoGojsEditorModel.ENUM_TEMPLATES.SPECIAL_DISCHARGE:
|
3249
|
-
node = this.$(go.Node, 'Spot', {
|
3250
|
-
click: (e, obj) => {
|
3251
|
-
if (obj?.data?.onSelected) {
|
3252
|
-
obj?.data?.onSelected(obj?.data);
|
3253
|
-
}
|
3254
|
-
},
|
3255
|
-
selectionChanged: (e) => {
|
3256
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
3257
|
-
e?.data?.onSelected(null);
|
3258
|
-
}
|
3259
|
-
},
|
3260
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
|
3261
|
-
fill: 'white',
|
3262
|
-
stroke: '#2D3B77',
|
3263
|
-
strokeWidth: 2,
|
3264
|
-
// strokeDashArray: [5, 5],
|
3265
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Discharge', {
|
3266
|
-
row: 0,
|
3267
|
-
margin: new go.Margin(3, 3, 10, 3),
|
3268
|
-
maxSize: new go.Size(size.w - 20, NaN),
|
3269
|
-
stroke: '#444444',
|
3270
|
-
font: 'normal 10pt Arial',
|
3271
|
-
textAlign: 'center',
|
3272
|
-
}), this.$(go.Picture, icon, {
|
3273
|
-
row: 1,
|
3274
|
-
margin: new go.Margin(0, 0, 10, 0),
|
3275
|
-
alignment: go.Spot.Center,
|
3276
|
-
maxSize: new go.Size(60, 60),
|
3277
|
-
imageStretch: go.GraphObject.Uniform,
|
3278
|
-
}))));
|
3279
|
-
break;
|
3280
|
-
case AtoGojsEditorModel.ENUM_TEMPLATES.SPECIAL_OTHER:
|
3281
|
-
node = this.$(go.Node, 'Spot', {
|
3282
|
-
click: (e, obj) => {
|
3283
|
-
if (obj?.data?.onSelected) {
|
3284
|
-
obj?.data?.onSelected(obj?.data);
|
3285
|
-
}
|
3286
|
-
},
|
3287
|
-
selectionChanged: (e) => {
|
3288
|
-
if (!e.isSelected && e?.data?.onSelected) {
|
3289
|
-
e?.data?.onSelected(null);
|
3290
|
-
}
|
3291
|
-
},
|
3292
|
-
}, new go.Binding('location', 'loc', go.Point.parse).makeTwoWay(go.Point.stringify), this.$(go.Panel, 'Auto', { width: size.w, height: size.h }, this.$(go.Shape, 'Circle', {
|
3293
|
-
fill: 'white',
|
3294
|
-
stroke: '#2D3B77',
|
3295
|
-
strokeWidth: 2,
|
3296
|
-
// strokeDashArray: [5, 5],
|
3297
|
-
}), this.$(go.Panel, 'Table', this.$(go.TextBlock, 'Other', {
|
3298
|
-
row: 0,
|
3299
|
-
margin: new go.Margin(3, 3, 10, 3),
|
3300
|
-
maxSize: new go.Size(size.w - 20, NaN),
|
3301
|
-
stroke: '#444444',
|
3302
|
-
font: 'normal 10pt Arial',
|
3303
|
-
textAlign: 'center',
|
3304
|
-
}), this.$(go.Picture, icon, {
|
3305
|
-
row: 1,
|
3306
|
-
margin: new go.Margin(0, 0, 10, 0),
|
3307
|
-
alignment: go.Spot.Center,
|
3308
|
-
maxSize: new go.Size(60, 60),
|
3309
|
-
imageStretch: go.GraphObject.Uniform,
|
3310
|
-
}))));
|
3311
|
-
break;
|
3312
|
-
}
|
3313
|
-
if (node) {
|
3314
|
-
this.myDiagram.nodeTemplateMap.set(title, node);
|
3315
|
-
}
|
3316
|
-
}
|
3317
|
-
startAnimation() {
|
3318
|
-
const diagram = this.myDiagram;
|
3319
|
-
// setTimeout(() => {
|
3320
|
-
// diagram.links.each((link) => {
|
3321
|
-
// });
|
3322
|
-
// });
|
3323
|
-
try {
|
3324
|
-
this.animationInterval = setInterval(() => {
|
3325
|
-
const oldskips = diagram.skipsUndoManager;
|
3326
|
-
diagram.skipsUndoManager = true;
|
3327
|
-
diagram.links.each((link) => {
|
3328
|
-
const shape = link.findObject('PIPE');
|
3329
|
-
if (!!shape) {
|
3330
|
-
// const off = shape?.strokeDashOffset - 3;
|
3331
|
-
const off = shape?.strokeDashOffset - 9;
|
3332
|
-
// animate (move) the stroke dash
|
3333
|
-
shape.strokeDashOffset = off <= 0 ? 60 : off;
|
3334
|
-
}
|
3335
|
-
});
|
3336
|
-
diagram.skipsUndoManager = oldskips;
|
3337
|
-
}, 600);
|
3338
|
-
// 60
|
3339
|
-
}
|
3340
|
-
catch (e) { }
|
3341
|
-
}
|
3342
|
-
stopAnimation() {
|
3343
|
-
if (this.animationInterval) {
|
3344
|
-
clearInterval(this.animationInterval);
|
3345
|
-
}
|
3346
|
-
}
|
3347
|
-
toDataURL(url, callback) {
|
3348
|
-
const xhr = new XMLHttpRequest();
|
3349
|
-
xhr.onload = function () {
|
3350
|
-
const reader = new FileReader();
|
3351
|
-
reader.onloadend = function () {
|
3352
|
-
callback(reader.result);
|
3353
|
-
};
|
3354
|
-
reader.readAsDataURL(xhr.response);
|
3355
|
-
};
|
3356
|
-
xhr.open('GET', url);
|
3357
|
-
xhr.responseType = 'blob';
|
3358
|
-
xhr.send();
|
3359
|
-
}
|
3360
|
-
getBase64DiagramWithEmptyData() {
|
3361
|
-
const self = this;
|
3362
|
-
// Test
|
3363
|
-
// const newWindow = window.open('', 'newWindow');
|
3364
|
-
// if (!newWindow) {
|
3365
|
-
// return;
|
3366
|
-
// }
|
3367
|
-
// const newDocument = newWindow?.document;
|
3368
|
-
if (!this.myDiagram?.model?.nodeDataArray?.length &&
|
3369
|
-
!this.myDiagram?.model?.linkDataArray?.length) {
|
3370
|
-
return;
|
3371
|
-
}
|
3372
|
-
const svg = this.myDiagram.makeSvg({
|
3373
|
-
scale: this.defaultScaleZoomToFit,
|
3374
|
-
maxSize: new go.Size(1200, NaN),
|
3375
|
-
background: 'white',
|
3376
|
-
padding: 20,
|
3377
|
-
elementFinished: function (graphObject, svgElement) {
|
3378
|
-
svgElement.removeAttribute('clip-path');
|
3379
|
-
// Replace Image URL to base64 -> For showing Picture element
|
3380
|
-
if (graphObject instanceof go.Picture) {
|
3381
|
-
self.toDataURL(svgElement.href.baseVal, function (dataUrl) {
|
3382
|
-
svgElement.setAttribute('href', dataUrl);
|
3383
|
-
});
|
3384
|
-
}
|
3385
|
-
// Make Text Node Shape Border
|
3386
|
-
if (graphObject?.name === 'textNodeShape') {
|
3387
|
-
svgElement.setAttribute('stroke', 'rgba(64, 181, 206, 0.6)');
|
3388
|
-
}
|
3389
|
-
// Empty Value
|
3390
|
-
if (graphObject?.name === 'textBlockValue' ||
|
3391
|
-
graphObject?.name === 'textBlockUnitPrefixes') {
|
3392
|
-
svgElement.textContent = '';
|
3393
|
-
}
|
3394
|
-
if (svgElement.clipPath) {
|
3395
|
-
svgElement.clipPath = null;
|
3396
|
-
}
|
3397
|
-
},
|
3398
|
-
callback: (svg) => {
|
3399
|
-
setTimeout(() => {
|
3400
|
-
const svgStr = new XMLSerializer().serializeToString(svg);
|
3401
|
-
// For Test
|
3402
|
-
// newDocument?.body?.appendChild(svg);
|
3403
|
-
const base64Svg = `data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(svgStr)))}`;
|
3404
|
-
const img = new Image();
|
3405
|
-
img.src = base64Svg;
|
3406
|
-
const canvas = document.createElement('canvas');
|
3407
|
-
// get canvas context for drawing on canvas
|
3408
|
-
const context = canvas.getContext('2d');
|
3409
|
-
img.onload = function () {
|
3410
|
-
const svgWidth = img.width;
|
3411
|
-
const svgHeight = img.height;
|
3412
|
-
canvas.width = svgWidth;
|
3413
|
-
canvas.height = svgHeight;
|
3414
|
-
if (context) {
|
3415
|
-
context.drawImage(img, 0, 0);
|
3416
|
-
const base64PNG = canvas.toDataURL('image/jpeg');
|
3417
|
-
self.emitImageTopology(base64PNG.replace('data:image/jpeg;base64,', ''));
|
3418
|
-
}
|
3419
|
-
};
|
3420
|
-
}, 1000);
|
3421
|
-
},
|
3422
|
-
});
|
3423
|
-
}
|
3424
|
-
emitImageTopology(base64) {
|
3425
|
-
this.callbackImageTopology.emit(base64);
|
3426
|
-
}
|
3427
|
-
openActionMenu() {
|
3428
|
-
// When this node is clicked, adjust the menu position
|
3429
|
-
const mousePt = this.myDiagram.lastInput.viewPoint;
|
3430
|
-
// // When this node is clicked, display the dropdown menu
|
3431
|
-
const menu = document.getElementById(this.actionMenuId);
|
3432
|
-
if (menu) {
|
3433
|
-
menu.style.display = '';
|
3434
|
-
menu.style.position = 'absolute';
|
3435
|
-
menu.style.left = mousePt.x + 'px';
|
3436
|
-
menu.style.top = mousePt.y + 'px';
|
3437
|
-
this.menuTrigger.openMenu();
|
3438
|
-
}
|
3439
|
-
}
|
3440
|
-
unsubscribeAll() {
|
3441
|
-
if (this._subscriptionList) {
|
3442
|
-
this._subscriptionList.unsubscribe();
|
3443
|
-
}
|
3444
|
-
this._subscriptionList = new Subscription();
|
3445
|
-
}
|
3446
|
-
addSubscribes(...subscriptions) {
|
3447
|
-
subscriptions.forEach((el) => {
|
3448
|
-
this._subscriptionList.add(el);
|
3449
|
-
});
|
3450
|
-
}
|
3451
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AtoDefaultGojsEditor, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive });
|
3452
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.7", type: AtoDefaultGojsEditor, inputs: { linkValidation: "linkValidation", initialOptions: "initialOptions", editor: "editor", isShowNodeInfo: "isShowNodeInfo", plantSatus: "plantSatus" }, outputs: { onModelChangeListenerEvent: "onModelChangeListenerEvent", onClickInfoButton: "onClickInfoButton", onOpenWizard: "onOpenWizard", onOpenDetail: "onOpenDetail", onOpenAssetParameter: "onOpenAssetParameter", onOpenInsightMapping: "onOpenInsightMapping", onHoverInfoButton: "onHoverInfoButton", onHoverAlert: "onHoverAlert", onDoubleClickNode: "onDoubleClickNode", onOpenChangeIcon: "onOpenChangeIcon", onClickCompoent: "onClickCompoent", callbackImageTopology: "callbackImageTopology", onClikParamOfTable: "onClikParamOfTable", onDeleteNode: "onDeleteNode", onUndo: "onUndo", onRename: "onRename" }, viewQueries: [{ propertyName: "menuTrigger", first: true, predicate: ["menuTrigger"], descendants: true }], ngImport: i0 });
|
3453
|
-
}
|
3454
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: AtoDefaultGojsEditor, decorators: [{
|
3455
|
-
type: Directive
|
3456
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { menuTrigger: [{
|
3457
|
-
type: ViewChild,
|
3458
|
-
args: ['menuTrigger']
|
3459
|
-
}], linkValidation: [{
|
3460
|
-
type: Input
|
3461
|
-
}], initialOptions: [{
|
3462
|
-
type: Input
|
3463
|
-
}], editor: [{
|
3464
|
-
type: Input
|
3465
|
-
}], isShowNodeInfo: [{
|
3466
|
-
type: Input
|
3467
|
-
}], plantSatus: [{
|
3468
|
-
type: Input
|
3469
|
-
}], onModelChangeListenerEvent: [{
|
3470
|
-
type: Output
|
3471
|
-
}], onClickInfoButton: [{
|
3472
|
-
type: Output
|
3473
|
-
}], onOpenWizard: [{
|
3474
|
-
type: Output
|
3475
|
-
}], onOpenDetail: [{
|
3476
|
-
type: Output
|
3477
|
-
}], onOpenAssetParameter: [{
|
3478
|
-
type: Output
|
3479
|
-
}], onOpenInsightMapping: [{
|
3480
|
-
type: Output
|
3481
|
-
}], onHoverInfoButton: [{
|
3482
|
-
type: Output
|
3483
|
-
}], onHoverAlert: [{
|
3484
|
-
type: Output
|
3485
|
-
}], onDoubleClickNode: [{
|
3486
|
-
type: Output
|
3487
|
-
}], onOpenChangeIcon: [{
|
3488
|
-
type: Output
|
3489
|
-
}], onClickCompoent: [{
|
3490
|
-
type: Output
|
3491
|
-
}], callbackImageTopology: [{
|
3492
|
-
type: Output
|
3493
|
-
}], onClikParamOfTable: [{
|
3494
|
-
type: Output
|
3495
|
-
}], onDeleteNode: [{
|
3496
|
-
type: Output
|
3497
|
-
}], onUndo: [{
|
3498
|
-
type: Output
|
3499
|
-
}], onRename: [{
|
3500
|
-
type: Output
|
3501
|
-
}] } });
|
3502
|
-
(function (AtoDefaultGojsEditor) {
|
3503
|
-
let ENUM_ACTIONS;
|
3504
|
-
(function (ENUM_ACTIONS) {
|
3505
|
-
ENUM_ACTIONS["DETAILS"] = "Open details & wizard";
|
3506
|
-
ENUM_ACTIONS["ONLY_DETAILS"] = "Open details";
|
3507
|
-
ENUM_ACTIONS["RENAME"] = "Rename this box";
|
3508
|
-
ENUM_ACTIONS["OUTFLOW"] = "Create an outflow";
|
3509
|
-
ENUM_ACTIONS["DELETE"] = "Delete";
|
3510
|
-
ENUM_ACTIONS["INSIGHT"] = "InSight tag mapping";
|
3511
|
-
ENUM_ACTIONS["DATA_MAPPING"] = "Data Mapping";
|
3512
|
-
ENUM_ACTIONS["MORE"] = "More";
|
3513
|
-
ENUM_ACTIONS["FLOW_DETAILS"] = "Flow details";
|
3514
|
-
ENUM_ACTIONS["FLOW_DETAILS_AND_WIZARD"] = "Flow details & wizard";
|
3515
|
-
ENUM_ACTIONS["ASSET_PARAMETERS"] = "Asset parameters";
|
3516
|
-
ENUM_ACTIONS["CHANGE_ICON"] = "Change icon";
|
3517
|
-
})(ENUM_ACTIONS = AtoDefaultGojsEditor.ENUM_ACTIONS || (AtoDefaultGojsEditor.ENUM_ACTIONS = {}));
|
3518
|
-
AtoDefaultGojsEditor.ACTIONS = {
|
3519
|
-
[ENUM_ACTIONS.DETAILS]: {
|
3520
|
-
name: ENUM_ACTIONS.DETAILS,
|
3521
|
-
iconClassName: 'far fa-memo-circle-info',
|
3522
|
-
onClick: () => { },
|
3523
|
-
},
|
3524
|
-
[ENUM_ACTIONS.FLOW_DETAILS]: {
|
3525
|
-
name: ENUM_ACTIONS.FLOW_DETAILS,
|
3526
|
-
iconClassName: 'far fa-arrow-progress',
|
3527
|
-
onClick: () => { },
|
3528
|
-
},
|
3529
|
-
[ENUM_ACTIONS.FLOW_DETAILS_AND_WIZARD]: {
|
3530
|
-
name: ENUM_ACTIONS.FLOW_DETAILS_AND_WIZARD,
|
3531
|
-
iconClassName: 'far fa-arrow-progress',
|
3532
|
-
onClick: () => { },
|
3533
|
-
},
|
3534
|
-
[ENUM_ACTIONS.ASSET_PARAMETERS]: {
|
3535
|
-
name: ENUM_ACTIONS.ASSET_PARAMETERS,
|
3536
|
-
iconClassName: 'far fa-box-archive',
|
3537
|
-
onClick: () => { },
|
3538
|
-
},
|
3539
|
-
[ENUM_ACTIONS.ONLY_DETAILS]: {
|
3540
|
-
name: ENUM_ACTIONS.ONLY_DETAILS,
|
3541
|
-
iconClassName: 'far fa-memo-circle-info',
|
3542
|
-
onClick: () => { },
|
3543
|
-
},
|
3544
|
-
[ENUM_ACTIONS.RENAME]: {
|
3545
|
-
name: ENUM_ACTIONS.RENAME,
|
3546
|
-
iconClassName: 'far fa-input-text',
|
3547
|
-
onClick: () => { },
|
3548
|
-
},
|
3549
|
-
[ENUM_ACTIONS.OUTFLOW]: {
|
3550
|
-
name: ENUM_ACTIONS.OUTFLOW,
|
3551
|
-
iconClassName: 'far fa-diagram-nested',
|
3552
|
-
onClick: () => { },
|
3553
|
-
},
|
3554
|
-
[ENUM_ACTIONS.DELETE]: {
|
3555
|
-
name: ENUM_ACTIONS.DELETE,
|
3556
|
-
iconClassName: 'fal fa-trash-can',
|
3557
|
-
onClick: () => { },
|
3558
|
-
},
|
3559
|
-
[ENUM_ACTIONS.INSIGHT]: {
|
3560
|
-
name: ENUM_ACTIONS.INSIGHT,
|
3561
|
-
iconClassName: 'far fa-tag',
|
3562
|
-
onClick: () => { },
|
3563
|
-
},
|
3564
|
-
[ENUM_ACTIONS.DATA_MAPPING]: {
|
3565
|
-
name: ENUM_ACTIONS.DATA_MAPPING,
|
3566
|
-
iconClassName: 'far fa-tag',
|
3567
|
-
onClick: () => { },
|
3568
|
-
},
|
3569
|
-
[ENUM_ACTIONS.MORE]: {
|
3570
|
-
name: ENUM_ACTIONS.MORE,
|
3571
|
-
iconClassName: 'fal fa-memo-circle-info',
|
3572
|
-
onClick: () => { },
|
3573
|
-
},
|
3574
|
-
[ENUM_ACTIONS.CHANGE_ICON]: {
|
3575
|
-
name: ENUM_ACTIONS.CHANGE_ICON,
|
3576
|
-
iconClassName: 'far fa-image',
|
3577
|
-
onClick: () => { },
|
3578
|
-
},
|
3579
|
-
};
|
3580
|
-
AtoDefaultGojsEditor.DISTANCE_2_OUTPUT = 60;
|
3581
|
-
})(AtoDefaultGojsEditor || (AtoDefaultGojsEditor = {}));
|
3582
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1nb2pzLWVkaXRvci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0by13YXRlci1saWIvc3JjL2xpYi9tb2RlbHMvZGVmYXVsdC1nb2pzLWVkaXRvci5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN6RCxPQUFPLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUM7QUFDdkIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6QixPQUFPLEVBQ1AsWUFBWSxFQUNaLFFBQVEsR0FDVCxNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQU83RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7QUFOOUQsTUFBTSxVQUFVLEdBQUcsa0NBQWtDLENBQUM7QUFDdEQsTUFBTSxLQUFLLEdBQUcsZ0NBQWdDLENBQUM7QUFDL0MsTUFBTSxVQUFVLEdBQUcscUNBQXFDLENBQUM7QUFDekQsTUFBTSxhQUFhLEdBQUcsd0NBQXdDLENBQUM7QUFDL0QsTUFBTSxrQkFB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QyxNQUFNLENBQUMsRUFBRTtZQUNyQixJQUFJLEVBQUUsWUFBWSxDQUFDLE1BQU07WUFDekIsYUFBYSxFQUFFLGtCQUFrQjtZQUNqQyxPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNsQjtRQUNELENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQ3RCLElBQUksRUFBRSxZQUFZLENBQUMsT0FBTztZQUMxQixhQUFhLEVBQUUsWUFBWTtZQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNsQjtRQUNELENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQzNCLElBQUksRUFBRSxZQUFZLENBQUMsWUFBWTtZQUMvQixhQUFhLEVBQUUsWUFBWTtZQUMzQixPQUFPLEVBQUUsR0FBRyxFQUFFLEdBQUUsQ0FBQztTQUNsQjtRQUNELENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksRUFBRSxZQUFZLENBQUMsSUFBSTtZQUN2QixhQUFhLEVBQUUseUJBQXlCO1lBQ3hDLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO1NBQ2xCO1FBQ0QsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDLEVBQUU7WUFDMUIsSUFBSSxFQUFFLFlBQVksQ0FBQyxXQUFXO1lBQzlCLGFBQWEsRUFBRSxjQUFjO1lBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRSxDQUFDO1NBQ2xCO0tBQ0YsQ0FBQztJQUVXLHNDQUFpQixHQUFHLEVBQUUsQ0FBQztBQUN0QyxDQUFDLEVBaEZnQixvQkFBb0IsS0FBcEIsb0JBQW9CLFFBZ0ZwQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25EZXN0cm95LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBBdG9Hb2pzRWRpdG9yTW9kZWwgfSBmcm9tICcuL2dvanMtZWRpdG9yLm1vZGVsJztcbmltcG9ydCAqIGFzIGdvIGZyb20gJ2dvanMnO1xuaW1wb3J0IF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEdPX0xJQ0VOU0VfS0VZIH0gZnJvbSAnLi4vY29uc3RhbnRzL2tleS5jb25zdCc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBVdGlsc1NlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy91dGlscy91dGlscy5zZXJ2aWNlJztcbmltcG9ydCB7XG4gIEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLFxuICBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLFxuICBOT19EQVRBLFxuICBURVhUX1VOS05PV04sXG4gIFZBTFVFX05BLFxufSBmcm9tICcuLi9jb25zdGFudHMvdmFsdWUuY29uc3QnO1xuaW1wb3J0IHsgQVRPX0VQbGFudFR5cGUgfSBmcm9tICcuLi9jb25zdGFudHMvcGxhbnQuY29uc3RhbnQnO1xuXG5jb25zdCBJQ09OX0FMRVJUID0gJy9hc3NldHMvaW1hZ2VzL2ljb25zL1N0YXRpb24uc3ZnJztcbmNvbnN0IEFSUk9XID0gJy9hc3NldHMvaW1hZ2VzL2ljb25zL2Fycm93LnN2Zyc7XG5jb25zdCBBUlJPV19HUkFZID0gJy9hc3NldHMvaW1hZ2VzL2ljb25zL2Fycm93LWdyYXkuc3ZnJztcbmNvbnN0IFJPX0xJTkVfRElSVFkgPSAnL2Fzc2V0cy9pbWFnZXMvaWNvbnMvcm9fbGluZV9kaXJ0eS5zdmcnO1xuY29uc3QgT1VURkxPV19MSU5FX0RJUlRZID0gJy9hc3NldHMvaW1hZ2VzL2ljb25zL291dGZsb3dfbGluZV9kaXJ0eS5wbmcnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBJQ09OU19CQVNFNjQgfSBmcm9tICcuLi9jb25zdGFudHMvaWNvbi1iYXNlNjQuY29uc3QnO1xuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBBdG9EZWZhdWx0R29qc0VkaXRvciBpbXBsZW1lbnRzIE9uRGVzdHJveSB7XG4gIEBWaWV3Q2hpbGQoJ21lbnVUcmlnZ2VyJykgbWVudVRyaWdnZXI6IGFueTtcbiAgQElucHV0KCkgbGlua1ZhbGlkYXRpb246IChcbiAgICBmcm9tTm9kZTogZ28uTm9kZSxcbiAgICBmcm9tUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgdG9Ob2RlOiBnby5Ob2RlLFxuICAgIHRvUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgbGluazogZ28uTGlua1xuICApID0+IGJvb2xlYW47XG5cbiAgYWN0aW9uczogYW55W10gPSBbXTtcbiAgYWN0aW9uTWVudUlkOiBzdHJpbmcgPSAnYWN0aW9uTWVudUlkJztcblxuICBteURpYWdyYW1EaXY6IGFueSA9IHRoaXMuY29uc3RydWN0b3IubmFtZSArICctJyArIG1vbWVudCgpLnZhbHVlT2YoKTtcbiAgbXlEaWFncmFtOiBhbnk7XG4gICQgPSBnby5HcmFwaE9iamVjdC5tYWtlO1xuICBhbmltYXRpb25JbnRlcnZhbDogYW55O1xuICBkZWZhdWx0U2NhbGVab29tVG9GaXQ/OiBudW1iZXI7XG5cbiAgcHJpdmF0ZSBfaW5pdGlhbE9wdGlvbnM6IGFueSA9IHtcbiAgICAndG9vbE1hbmFnZXIuaG92ZXJEZWxheSc6IDIwMCxcbiAgICAvLyAnZHJhZ2dpbmdUb29sLmlzRW5hYmxlZCc6IGZhbHNlLFxuICAgIC8vIGluaXRpYWxBdXRvU2NhbGU6IGdvLkRpYWdyYW0uVW5pZm9ybVRvRmlsbCxcbiAgICAvLyBhdXRvU2Nyb2xsUmVnaW9uOiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICBsYXlvdXQ6IHRoaXMuJChnby5MYXllcmVkRGlncmFwaExheW91dCwgeyBkaXJlY3Rpb246IDAgfSksXG4gICAgaW5pdGlhbENvbnRlbnRBbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgIGluaXRpYWxBdXRvU2NhbGU6IGdvLkRpYWdyYW0uVW5pZm9ybSxcbiAgICAvLyBjb250ZW50QWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAvLyB0aGlzLiQoZ28uRm9yY2VEaXJlY3RlZExheW91dCksXG4gICAgJ3VuZG9NYW5hZ2VyLmlzRW5hYmxlZCc6IHRydWUsIC8vIGVuYWJsZSB1bmRvICYgcmVkb1xuICAgIC8vIFwiYW5pbWF0aW9uTWFuYWdlci5pc0luaXRpYWxcIjogZmFsc2UsXG4gICAgLy8gXCJhbmltYXRpb25NYW5hZ2VyLmlzRW5hYmxlZFwiOiBmYWxzZSxcbiAgICAvLyBcImRyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZFwiOiB0cnVlXG4gICAgZHJhZ1NlbGVjdGluZ1Rvb2w6IHRoaXMuJChcbiAgICAgIGdvLkRyYWdTZWxlY3RpbmdUb29sLFxuICAgICAgeyBpc1BhcnRpYWxJbmNsdXNpb246IHRydWUsIGRlbGF5OiA1MCB9LFxuICAgICAge1xuICAgICAgICBib3g6IHRoaXMuJChcbiAgICAgICAgICBnby5QYXJ0LCAvLyByZXBsYWNlIHRoZSBtYWdlbnRhIGJveCB3aXRoIGEgcmVkIG9uZVxuICAgICAgICAgIHsgbGF5ZXJOYW1lOiAnVG9vbCcsIHNlbGVjdGFibGU6IGZhbHNlIH0sXG4gICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgICAgICBuYW1lOiAnU0hBUEUnLFxuICAgICAgICAgICAgZmlsbDogJ3JnYmEoMjU1LDAsMCwwKScsXG4gICAgICAgICAgICBzdHJva2U6ICcjRTk1RjQ3JyxcbiAgICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICB9XG4gICAgKSxcbiAgICAnbGlua2luZ1Rvb2wubGlua1ZhbGlkYXRpb24nOiB0aGlzLmNoZWNrTGlua0NvbmRpdGlvbi5iaW5kKHRoaXMpLFxuICAgICdkcmFnZ2luZ1Rvb2wuZG9Nb3VzZU1vdmUnOiBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBkbyB0aGUgc3RhbmRhcmQgYmVoYXZpb3IgYnkgY2FsbGluZyB0aGUgc3VwZXIgbWV0aG9kXG4gICAgICBnby5EcmFnZ2luZ1Rvb2wucHJvdG90eXBlLmRvTW91c2VNb3ZlLmNhbGwodGhpcyk7XG4gICAgICAvLyBpZiBkcmFnZ2luZy1vdXQgZnJvbSB0aGUgZGlhZ3JhbSBpcyBub3QgYWxsb3dlZCwgYW5kXG4gICAgICAvLyBpZiBtb3VzZSBpcyBvdXRzaWRlIG9mIHZpZXdwb3J0XG4gICAgICBpZiAoXG4gICAgICAgICF0aGlzLmRpYWdyYW0uYWxsb3dEcmFnT3V0ICYmXG4gICAgICAgICF0aGlzLmRpYWdyYW0udmlld3BvcnRCb3VuZHMuY29udGFpbnNQb2ludChcbiAgICAgICAgICB0aGlzLmRpYWdyYW0ubGFzdElucHV0LmRvY3VtZW50UG9pbnRcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMuZGlhZ3JhbS5lbnN1cmVCb3VuZHMoKTtcbiAgICAgICAgY29uc3QgdnAgPSB0aGlzLmRpYWdyYW0ubGFzdElucHV0LnZpZXdQb2ludDtcbiAgICAgICAgY29uc3QgZHAgPSB0aGlzLmRpYWdyYW0ucG9zaXRpb24uY29weSgpO1xuICAgICAgICBpZiAodnAueCA8IDApIGRwLnggLT0gMTA7XG4gICAgICAgIGVsc2UgaWYgKHZwLnggPiAwKSBkcC54ICs9IDEwO1xuICAgICAgICBpZiAodnAueSA8IDApIGRwLnkgLT0gMTA7XG4gICAgICAgIGVsc2UgaWYgKHZwLnkgPiAwKSBkcC55ICs9IDEwO1xuICAgICAgICB0aGlzLmRpYWdyYW0ucG9zaXRpb24gPSBkcDsgLy8gc2Nyb2xsIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG1vdXNlXG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBMYXlvdXRDb21wbGV0ZWQ6ICgpID0+IHtcbiAgICAvLyAgICAgdGhpcy5teURpYWdyYW0uem9vbVRvRml0KCk7XG4gICAgLy8gICAgIHRoaXMuZGVmYXVsdFNjYWxlWm9vbVRvRml0ID0gdGhpcy5teURpYWdyYW0uc2NhbGU7XG4gICAgLy8gICAgIGlmICghdGhpcy5pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5KSB7XG4gICAgLy8gICAgICAgICBjb25zdCBzaXplTWFyZ2luID0gQXRvR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDE1O1xuICAgIC8vICAgICAgICAgdGhpcy5teURpYWdyYW0ucGFkZGluZyA9IG5ldyBnby5NYXJnaW4oc2l6ZU1hcmdpbik7XG4gICAgLy8gICAgIH1cbiAgICAvLyB9LFxuICB9O1xuXG4gIGNoZWNrTGlua0NvbmRpdGlvbihcbiAgICBmcm9tTm9kZTogZ28uTm9kZSxcbiAgICBmcm9tUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgdG9Ob2RlOiBnby5Ob2RlLFxuICAgIHRvUG9ydDogZ28uR3JhcGhPYmplY3QsXG4gICAgbGluazogZ28uTGlua1xuICApOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5saW5rVmFsaWRhdGlvbikge1xuICAgICAgcmV0dXJuIHRoaXMubGlua1ZhbGlkYXRpb24oZnJvbU5vZGUsIGZyb21Qb3J0LCB0b05vZGUsIHRvUG9ydCwgbGluayk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlOyAvLyBN4bq3YyDEkeG7i25oIGNobyB0csaw4budbmcgaOG7o3Aga2jDtG5nIGPDsyBow6BtIGxpbmtWYWxpZGF0aW9uIMSRxrDhu6NjIHRydXnhu4FuIHbDoG9cbiAgfVxuXG4gIEBJbnB1dCgpIHNldCBpbml0aWFsT3B0aW9ucyh2OiBhbnkpIHtcbiAgICB0aGlzLl9pbml0aWFsT3B0aW9ucyA9IF8ubWVyZ2UodGhpcy5faW5pdGlhbE9wdGlvbnMsIHYpO1xuICAgIC8vIF8uZXh0ZW5kKHYsIHRoaXMuX2luaXRpYWxPcHRpb25zKTtcbiAgfVxuXG4gIGdldCBpbml0aWFsT3B0aW9ucygpIHtcbiAgICByZXR1cm4gdGhpcy5faW5pdGlhbE9wdGlvbnM7XG4gIH1cblxuICBwcml2YXRlIF9lZGl0b3I6IEF0b0dvanNFZGl0b3JNb2RlbDtcbiAgQElucHV0KCkgc2V0IGVkaXRvcih2OiBBdG9Hb2pzRWRpdG9yTW9kZWwpIHtcbiAgICB0aGlzLl9lZGl0b3IgPSB2O1xuICAgIGlmICh2KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pbml0RGlhZ3JhbSgpO1xuICAgICAgfSwgMTAwKTtcbiAgICB9XG4gIH1cblxuICBnZXQgZWRpdG9yKCk6IEF0b0dvanNFZGl0b3JNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuX2VkaXRvcjtcbiAgfVxuXG4gIEBJbnB1dCgpIGlzU2hvd05vZGVJbmZvOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHBsYW50U2F0dXM6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9lbFJlZjogRWxlbWVudFJlZikge1xuICAgIGdvLkRpYWdyYW0ubGljZW5zZUtleSA9IEdPX0xJQ0VOU0VfS0VZO1xuICB9XG5cbiAgQE91dHB1dCgpIG9uTW9kZWxDaGFuZ2VMaXN0ZW5lckV2ZW50OiBFdmVudEVtaXR0ZXI8YW55PiA9XG4gICAgbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkNsaWNrSW5mb0J1dHRvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uT3BlbldpemFyZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uT3BlbkRldGFpbDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uT3BlbkFzc2V0UGFyYW1ldGVyOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25PcGVuSW5zaWdodE1hcHBpbmc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvbkhvdmVySW5mb0J1dHRvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uSG92ZXJBbGVydDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIG9uRG91YmxlQ2xpY2tOb2RlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgb25PcGVuQ2hhbmdlSWNvbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgLy8gQ2xpY2sgY29tcG9uZW50XG4gIEBPdXRwdXQoKSBvbkNsaWNrQ29tcG9lbnQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBjYWxsYmFja0ltYWdlVG9wb2xvZ3k6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgLy8gQ2xpY2sgcGFyYW0gb24gUGFyYW1UYWJsZVxuICBAT3V0cHV0KCkgb25DbGlrUGFyYW1PZlRhYmxlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuXG4gIC8vIERlbGV0ZSBOb2RlXG4gIEBPdXRwdXQoKSBvbkRlbGV0ZU5vZGU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBvblVuZG86IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIC8vIFJlbmFtZVxuICBAT3V0cHV0KCkgb25SZW5hbWU6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG5cbiAgaXNBZGRlZE1vZGVsQ2hhbmdlZExpc3RlbmVyczogYm9vbGVhbjtcbiAgY29tbWl0dGVkVHJhbnNhY3Rpb25TdWJqZWN0ID0gbmV3IFN1YmplY3Q8YW55PigpO1xuXG4gIC8vIEFkZFN1YiBhbmQgVW5TdWJcbiAgX3N1YnNjcmlwdGlvbkxpc3Q6IFN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnVuc3Vic2NyaWJlQWxsKCk7XG4gICAgdGhpcy5zdG9wQW5pbWF0aW9uKCk7XG4gICAgLy8gdGhpcy5teURpYWdyYW0/LmNsZWFyKCk7XG4gICAgaWYgKCEhdGhpcy5teURpYWdyYW0/LmRpdikge1xuICAgICAgdGhpcy5teURpYWdyYW0uZGl2ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMubXlEaWFncmFtKSB7XG4gICAgICB0aGlzLm15RGlhZ3JhbS5jbGVhcigpO1xuICAgIH1cbiAgICBpZiAodGhpcy5teURpYWdyYW0gIT0gbnVsbCAmJiB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAgIT0gbnVsbCkge1xuICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLmNsZWFyKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubXlEaWFncmFtICE9IG51bGwgJiYgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcCAhPSBudWxsKSB7XG4gICAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLmNsZWFyKCk7XG4gICAgfVxuICAgIGlmICh0aGlzLm15RGlhZ3JhbSAhPSBudWxsICYmIHRoaXMubXlEaWFncmFtLmxpbmtUZW1wbGF0ZSAhPSBudWxsKSB7XG4gICAgICBmb3IgKHZhciBrZXkgaW4gdGhpcy5teURpYWdyYW0ubGlua1RlbXBsYXRlTWFwLnRvQXJyYXkoKSkge1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5saW5rVGVtcGxhdGVNYXAucmVtb3ZlKGtleSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubXlEaWFncmFtID0gbnVsbDtcbiAgfVxuXG4gIGFkZE9yUmVtb3ZlQ29tcG9lbnRUZW1wbGF0ZSgpIHtcbiAgICAvLyBBZGQgTm9kZSBhbmQgTm9kZSBHcm91cFxuICAgIF8uZm9yRWFjaCh0aGlzLmVkaXRvci5kYXRhPy5ub2RlRGF0YUFycmF5LCAobm9kZSkgPT4ge1xuICAgICAgdGhpcy5hZGRUZW1wbGF0ZShub2RlKTtcbiAgICB9KTtcbiAgICAvLyBSZW1vdmUgTm9kZSBhbmQgTm9kZSBHcm91cFxuICAgIF8uZm9yRWFjaCh0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXA/LkhiLCAodGVtcCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0ZW1wPy5rZXkgJiZcbiAgICAgICAgIXRoaXMuZWRpdG9yLmRhdGE/Lm5vZGVEYXRhQXJyYXk/LnNvbWUoXG4gICAgICAgICAgKG5vZGUpID0+IG5vZGU/LnR5cGUgPT09IHRlbXA/LmtleVxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnJlbW92ZSh0ZW1wPy5rZXkpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIF8uZm9yRWFjaCh0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwPy5IYiwgKHRlbXApID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgdGVtcD8ua2V5ICYmXG4gICAgICAgICF0aGlzLmVkaXRvci5kYXRhPy5ub2RlRGF0YUFycmF5Py5zb21lKFxuICAgICAgICAgIChub2RlKSA9PiBub2RlPy50eXBlID09PSB0ZW1wPy5rZXlcbiAgICAgICAgKVxuICAgICAgKSB7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAucmVtb3ZlKHRlbXA/LmtleSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRUZW1wbGF0ZShub2RlKSB7XG4gICAgdGhpcy5hZGROb2RlVGVtcGxhdGUobm9kZSk7XG4gICAgdGhpcy5hZGRHcm91cFRlbXBsYXRlKG5vZGUpO1xuICB9XG5cbiAgYWRkR3JvdXBUZW1wbGF0ZShub2RlKSB7XG4gICAgaWYgKHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXA/LkhiPy5bbm9kZT8udHlwZV0gfHwgIW5vZGU/LmlzR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gR3JvdXBcbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlJPX1dBVEVSX1RSRUFUTUVOVCkge1xuICAgICAgdGhpcy5tYWtlR3JvdXBST1BsYW50VGVtcGxhdGUoXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZVxuICAgICAgKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkJPSUxFUikge1xuICAgICAgdGhpcy5tYWtlR3JvdXBCb2lsZXJUZW1wbGF0ZShcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlPy50eXBlID09PSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09PTElOR19UT1dFUikge1xuICAgICAgdGhpcy5tYWtlR3JvdXBDb29saW5nVG93ZXJUZW1wbGF0ZShcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24sXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChub2RlPy50eXBlID09PSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuWk9ORSkge1xuICAgICAgdGhpcy5tYWtlR3JvdXBab25lVGVtcGxhdGUoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBub2RlPy50eXBlID09PSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUExBTlRfQ0VMTCAmJlxuICAgICAgbm9kZT8uaXNHcm91cFxuICAgICkge1xuICAgICAgdGhpcy5ncm91cFBsYW50Q2VsbFRlbXBsYXRlKFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbixcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QTEFOVF9DRUxMX0lOUFVUX0dST1VQXG4gICAgKSB7XG4gICAgICB0aGlzLmdyb3VwUENJbnB1dE9yT3V0VGVtcGxhdGUoXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZSxcbiAgICAgICAgbmV3IGdvLk1hcmdpbigwLCA1MCwgMCwgMClcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChcbiAgICAgIG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QTEFOVF9DRUxMX09VVFBVVF9HUk9VUFxuICAgICkge1xuICAgICAgdGhpcy5ncm91cFBDSW5wdXRPck91dFRlbXBsYXRlKFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbixcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWUsXG4gICAgICAgIG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgNTApXG4gICAgICApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBub2RlPy50eXBlID09PSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuR1JPVVBfQkFTSUNfQ09NUE9ORU5UXG4gICAgKSB7XG4gICAgICB0aGlzLm1ha2VHcm91cEJhc2ljQ29tcG9uZW50KFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbixcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWVcbiAgICAgICk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWVcbiAgICApO1xuICB9XG5cbiAgYWRkTm9kZVRlbXBsYXRlKG5vZGUpIHtcbiAgICBpZiAodGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwPy5IYj8uW25vZGU/LnR5cGVdIHx8IG5vZGU/LmlzR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gTm90IEdyb3VwXG4gICAgLy8gQ29tcG9uZW50IFdhdGVyIE5vcm1hbFxuICAgIGlmIChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5UWVBFX1RFTVBMQVRFX1dBVEVSX05PUk1BTD8uaW5jbHVkZXMobm9kZT8udHlwZSkgJiZcbiAgICAgICFub2RlPy5pc0dyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZShcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24gPz8gJycsXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lID8/ICcnXG4gICAgICApO1xuICAgIH1cbiAgICAvLyBDb21wb25lbnQgV2F0ZXIgV2l0aGRyYXcgT3IgRGlzY2hhcmdlXG4gICAgaWYgKFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfV0FURVJfV0lUSERSQVdfT1JfRElTQ0hBUkdFPy5pbmNsdWRlcyhcbiAgICAgICAgbm9kZT8udHlwZVxuICAgICAgKSAmJlxuICAgICAgIW5vZGU/LmlzR3JvdXBcbiAgICApIHtcbiAgICAgIHRoaXMubWFrZUVudGl0eVdpdGhkcmF3T3JEaXNjaGFyZ2UoXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uID8/ICcnLFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZSA/PyAnJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBDb21wb25lbnQgRW5lcmd5IE5vcm1hbFxuICAgIGlmIChcbiAgICAgIChBdG9Hb2pzRWRpdG9yTW9kZWwuVFlQRV9URU1QTEFURV9FTEVDVFJJQ0lUWT8uaW5jbHVkZXMobm9kZT8udHlwZSkgfHxcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLlRZUEVfVEVNUExBVEVfTkFUVVJBTF9HQVM/LmluY2x1ZGVzKG5vZGU/LnR5cGUpIHx8XG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5UWVBFX1RFTVBMQVRFX0ZVRUw/LmluY2x1ZGVzKG5vZGU/LnR5cGUpIHx8XG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5UWVBFX1RFTVBMQVRFX1NURUFNPy5pbmNsdWRlcyhub2RlPy50eXBlKSkgJiZcbiAgICAgICFub2RlPy5pc0dyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLmljb24gPz8gJycsXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5uYW1lID8/ICcnXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChub2RlPy50eXBlID09PSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuSU1BR0VfVEVNUExBVEUpIHtcbiAgICAgIHRoaXMubWFrZUltYWdlVGVtcGxhdGUoKTtcbiAgICB9XG4gICAgaWYgKG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QQVJBTV9UQUJMRSkge1xuICAgICAgdGhpcy5tYWtlUGFyYW1UYWJsZSgpO1xuICAgIH1cbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLk1BU1NfQkFMQU5DRSkge1xuICAgICAgdGhpcy5tYWtlTWFzc0JhbGFuY2UoKTtcbiAgICB9XG4gICAgLy8gVGV4dCBOb2RlXG4gICAgaWYgKG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX05PREUpIHtcbiAgICAgIHRoaXMubWFrZVRleHRUZW1wbGF0ZSgpO1xuICAgIH1cbiAgICAvLyBWYWx1ZSBOb2RlXG4gICAgaWYgKG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5WQUxVRV9OT0RFKSB7XG4gICAgICB0aGlzLm1ha2VWYWx1ZU5vZGVUZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIFZhbHVlIE5vZGVcbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkVNUFRZKSB7XG4gICAgICB0aGlzLm1ha2VFbXB0eU5vZGVUZW1wbGF0ZSgpO1xuICAgIH1cblxuICAgIC8vIFZhbHVlIExhYmVsXG4gICAgaWYgKG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5WQUxVRV9MQUJFTCkge1xuICAgICAgdGhpcy5tYWtlVmFsdWVMYWJlbFRlbXBsYXRlKCk7XG4gICAgfVxuICAgIC8vIExhYmVsXG4gICAgaWYgKG5vZGU/LnR5cGUgPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX0xBQkVMKSB7XG4gICAgICB0aGlzLm1ha2VUZXh0TGFiZWxUZW1wbGF0ZSgpO1xuICAgIH1cbiAgICAvLyBab25lIGl0ZW1cbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlpPTkVfRU5FUkdZX0lURU0pIHtcbiAgICAgIHRoaXMubWFrZVpvbmVJdGVtVGVtcGxhdGUoKTtcbiAgICB9XG4gICAgLy8gZGF0YSBib3hcbiAgICBpZiAobm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkRBVEFfQk9YKSB7XG4gICAgICB0aGlzLm1ha2VEYXRhQm94VGVtcGxhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBTcGVjaWFsIHRlbXBsYXRlXG4gICAgaWYgKEF0b0dvanNFZGl0b3JNb2RlbC5UWVBFX1RFTVBMQVRFX1NQRUNJQUw/LmluY2x1ZGVzKG5vZGU/LnR5cGUpKSB7XG4gICAgICB0aGlzLm1ha2VTcGVjaWFsVGVtcGxhdGUoXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tub2RlPy50eXBlXS5pY29uLFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0ubmFtZVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBQbGFudCBDZWxsXG4gICAgaWYgKFxuICAgICAgbm9kZT8udHlwZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBMQU5UX0NFTEwgJiZcbiAgICAgICFub2RlPy5pc0dyb3VwXG4gICAgKSB7XG4gICAgICB0aGlzLnBsYW50Q2VsbFRlbXBsYXRlKFxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbbm9kZT8udHlwZV0uaWNvbixcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW25vZGU/LnR5cGVdLm5hbWVcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgaW5pdERpYWdyYW0oKSB7XG4gICAgaWYgKCEhdGhpcy5teURpYWdyYW0/LmRpdikge1xuICAgICAgLy8gdGhpcy5teURpYWdyYW0uZGl2ID0gbnVsbDtcbiAgICAgIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5ncmlkKSB7XG4gICAgICAgIHRoaXMubXlEaWFncmFtWydncmlkJ10gPSB0aGlzLmluaXRpYWxPcHRpb25zPy5ncmlkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5teURpYWdyYW1bJ2dyaWQnXSA9IHRoaXMuJChnby5QYW5lbCwgJ0dyaWQnKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5MYXlvdXRDb21wbGV0ZWQpIHtcbiAgICAgICAgdGhpcy5teURpYWdyYW0uYWRkRGlhZ3JhbUxpc3RlbmVyKFxuICAgICAgICAgICdMYXlvdXRDb21wbGV0ZWQnLFxuICAgICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LkxheW91dENvbXBsZXRlZFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LkxpbmtSZXNoYXBlZCkge1xuICAgICAgICB0aGlzLm15RGlhZ3JhbS5hZGREaWFncmFtTGlzdGVuZXIoXG4gICAgICAgICAgJ0xpbmtSZXNoYXBlZCcsXG4gICAgICAgICAgdGhpcy5pbml0aWFsT3B0aW9ucz8uTGlua1Jlc2hhcGVkXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uU2VsZWN0aW9uTW92ZWQpIHtcbiAgICAgICAgdGhpcy5teURpYWdyYW0uYWRkRGlhZ3JhbUxpc3RlbmVyKFxuICAgICAgICAgICdTZWxlY3Rpb25Nb3ZlZCcsXG4gICAgICAgICAgdGhpcy5pbml0aWFsT3B0aW9ucz8uU2VsZWN0aW9uTW92ZWRcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5DaGFuZ2VkU2VsZWN0aW9uKSB7XG4gICAgICAgIHRoaXMubXlEaWFncmFtLmFkZERpYWdyYW1MaXN0ZW5lcihcbiAgICAgICAgICAnQ2hhbmdlZFNlbGVjdGlvbicsXG4gICAgICAgICAgdGhpcy5pbml0aWFsT3B0aW9ucz8uQ2hhbmdlZFNlbGVjdGlvblxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgdGhpcy5teURpYWdyYW0uZHJhZ1NlbGVjdGluZ1Rvb2wgPSB0aGlzLmluaXRpYWxPcHRpb25zPy5kcmFnU2VsZWN0aW5nVG9vbDtcbiAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZCA9XG4gICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnZHJhZ2dpbmdUb29sLmlzR3JpZFNuYXBFbmFibGVkJ10gPz8gZmFsc2U7XG4gICAgICBpZiAoXG4gICAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyICYmXG4gICAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbFxuICAgICAgKSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5ncmlkU25hcENlbGxTaXplJ10pIHtcbiAgICAgICAgICB0aGlzLm15RGlhZ3JhbS50b29sTWFuYWdlci5kcmFnZ2luZ1Rvb2wuZ3JpZFNuYXBDZWxsU2l6ZSA9XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5ncmlkU25hcENlbGxTaXplJ107XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnZHJhZ2dpbmdUb29sLmlzR3JpZFNuYXBFbmFibGVkJ10pIHtcbiAgICAgICAgLy8gICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbC5pc0dyaWRTbmFwRW5hYmxlZCA9XG4gICAgICAgIC8vICAgICAgICAgdGhpcy5pbml0aWFsT3B0aW9ucz8uWydkcmFnZ2luZ1Rvb2wuaXNHcmlkU25hcEVuYWJsZWQnXTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAodGhpcy5pbml0aWFsT3B0aW9ucz8uWydkcmFnZ2luZ1Rvb2wuZG9Nb3VzZU1vdmUnXSkge1xuICAgICAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmRyYWdnaW5nVG9vbC5kb01vdXNlTW92ZSA9XG4gICAgICAgICAgICB0aGlzLmluaXRpYWxPcHRpb25zPy5bJ2RyYWdnaW5nVG9vbC5kb01vdXNlTW92ZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnbGlua2luZ1Rvb2wubGlua1ZhbGlkYXRpb24nXSkge1xuICAgICAgICAgIHRoaXMubXlEaWFncmFtLnRvb2xNYW5hZ2VyLmxpbmtpbmdUb29sLmxpbmtWYWxpZGF0aW9uID1cbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LlsnbGlua2luZ1Rvb2wubGlua1ZhbGlkYXRpb24nXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5teURpYWdyYW0uY29udGVudEFsaWdubWVudCA9XG4gICAgICAgIHRoaXMuaW5pdGlhbE9wdGlvbnM/LmNvbnRlbnRBbGlnbm1lbnQgPz8gZ28uU3BvdC5DZW50ZXI7XG4gICAgICB0aGlzLm15RGlhZ3JhbS5sYXlvdXQgPSB0aGlzLmluaXRpYWxPcHRpb25zPy5sYXlvdXQ7XG4gICAgICAvLyB0aGlzLm15RGlhZ3JhbS5taW5WaWV3cG9ydEJvdW5kcyA9IG5ldyBnby5SZWN0KDAsIDAsIDEyMDAsIDEyMDApO1xuICAgICAgaWYgKCEhdGhpcy5lZGl0b3I/LmRhdGEpIHtcbiAgICAgICAgdGhpcy5hZGRPclJlbW92ZUNvbXBvZW50VGVtcGxhdGUoKTtcbiAgICAgICAgdGhpcy5teURpYWdyYW0ubW9kZWwgPSBnby5Nb2RlbC5mcm9tSnNvbih0aGlzLmVkaXRvci5kYXRhKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5hbmltYXRpb25JbnRlcnZhbCkge1xuICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmFuaW1hdGlvbkludGVydmFsKTtcbiAgICB9XG4gICAgY29uc3QgZGlhZ3JhbURpdiA9IHRoaXMuX2VsUmVmLm5hdGl2ZUVsZW1lbnQ/LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXG4gICAgICB0aGlzLm15RGlhZ3JhbURpdlxuICAgICk/LlswXTtcbiAgICB0aGlzLm15RGlhZ3JhbSA9IHRoaXMuJChnby5EaWFncmFtLCBkaWFncmFtRGl2LCB0aGlzLmluaXRpYWxPcHRpb25zKTtcbiAgICAvLyB0aGlzLm15RGlhZ3JhbS5pbml0aWFsUG9zaXRpb24gPSBuZXcgZ28uUG9pbnQoMCwgMCk7XG4gICAgdGhpcy5hZGRPclJlbW92ZUNvbXBvZW50VGVtcGxhdGUoKTtcblxuICAgIHRoaXMubWFrZUxpbmtUZW1wbGF0ZSgpO1xuICAgIC8vIGFuaW1hdGlvblxuICAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgICAvLyBpZiAoIXRoaXMuaXNBZGRlZE1vZGVsQ2hhbmdlZExpc3RlbmVycykge1xuICAgICAgdGhpcy5pc0FkZGVkTW9kZWxDaGFuZ2VkTGlzdGVuZXJzID0gdHJ1ZTtcbiAgICAgIHRoaXMubXlEaWFncmFtLmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBlLmNoYW5nZSA9PT0gZ28uQ2hhbmdlZEV2ZW50LlJlbW92ZSAmJlxuICAgICAgICAgIGUucHJvcGVydHlOYW1lID09PSAnbm9kZURhdGFBcnJheSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGF0YSA9IGUub2xkVmFsdWU7XG4gICAgICAgICAgc2VsZi5vbkRlbGV0ZU5vZGUuZW1pdChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZS5pc1RyYW5zYWN0aW9uRmluaXNoZWQpIHtcbiAgICAgICAgICBzZWxmLmNvbW1pdHRlZFRyYW5zYWN0aW9uU3ViamVjdD8ubmV4dChlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICB0aGlzLm15RGlhZ3JhbS5jb21tYW5kSGFuZGxlci51bmRvID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBzZWxmLm9uVW5kby5lbWl0KCk7XG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgaWYgKCEhdGhpcy5lZGl0b3IpIHtcbiAgICAgIHRoaXMubXlEaWFncmFtLm1vZGVsID0gZ28uTW9kZWwuZnJvbUpzb24odGhpcy5lZGl0b3IuZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEdyb3VwVGVtcGxhdGVFbmVyZ3koKSB7XG4gICAgLy8gZm9yIHdhdGVyXG4gICAgY29uc3Qge1xuICAgICAgU1RPUkFHRSxcbiAgICAgIFdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIERFTUlOX1dBVEVSX1RSRUFUTUVOVCxcbiAgICAgIC8vIFJPX1dBVEVSX1RSRUFUTUVOVCxcbiAgICAgIFBST0NFU1MsXG4gICAgICBXQVNURVdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIERBRl9XQVNURVdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIEVUUF9XQVNURVdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIE1CUl9XQVNURVdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIFpMRF9XQVNURVdBVEVSX1RSRUFUTUVOVCxcbiAgICAgIENPT0xJTkdfVE9XRVIsXG4gICAgICBCT0lMRVIsXG4gICAgICBPVEhFUixcbiAgICAgIExBTkRTQ0FQSU5HX0lSUklHQVRJT04sXG4gICAgfSA9IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUztcbiAgICBjb25zdCB3YXRlckdyb3VwcyA9IFtcbiAgICAgIFNUT1JBR0UsXG4gICAgICBXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBERU1JTl9XQVRFUl9UUkVBVE1FTlQsXG4gICAgICAvLyBST19XQVRFUl9UUkVBVE1FTlQsXG4gICAgICBQUk9DRVNTLFxuICAgICAgV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBEQUZfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBFVFBfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBNQlJfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBaTERfV0FTVEVXQVRFUl9UUkVBVE1FTlQsXG4gICAgICBDT09MSU5HX1RPV0VSLFxuICAgICAgQk9JTEVSLFxuICAgICAgT1RIRVIsXG4gICAgICBMQU5EU0NBUElOR19JUlJJR0FUSU9OLFxuICAgIF07XG4gICAgd2F0ZXJHcm91cHMubWFwKChlKSA9PiB7XG4gICAgICBpZiAoISFBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0uaWNvbixcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0ubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gZWxlY3RyaWNhbFxuICAgIHRoaXMuaW5pdEVsZWN0cmljR3JvdXBUZW1wbGF0ZSgpO1xuXG4gICAgLy8gRnVlbFxuICAgIHRoaXMuaW5pdEZ1ZWxHcm91cFRlbXBsYXRlKCk7XG5cbiAgICAvLyBHYXNcbiAgICB0aGlzLmluaXRHYXNHcm91cFRlbXBsYXRlKCk7XG4gIH1cblxuICBpbml0RWxlY3RyaWNEaWFncmFtKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIEdSSUQsXG4gICAgICBESUVTRUxfR0VORVJBVE9SUyxcbiAgICAgIEJBVFRFUllfRU5FUkdZX1NUT1JBR0UsXG4gICAgICBMSUdIVElOR19TWVNURU1TLFxuICAgICAgTElHSFRJTkdTLFxuICAgICAgRUxFQ1RSSUNfTUVURVJTLFxuICAgICAgVFJBTlNGT1JNRVJTLFxuICAgICAgRUxFQ1RSSUNfRkxZV0hFRUxfRU5FUkdZX1NUT1JBR0UsXG4gICAgICBQVU1QRURfSFlEUk9fU1RPUkFHRSxcbiAgICAgIFRIRVJNQUxfRU5FUkdZX1NUT1JBR0UsXG4gICAgICBTVVBFUl9DQVBBQ0lUT1JfRU5FUkdZX1NUT1JBR0UsXG4gICAgICBTV0lUQ0hfR0VBUlMsXG4gICAgICBQUk9DRVNTX0NPTlRST0xfQVVUT01BVElPTl9TWVNURU1TLFxuICAgICAgUFJPQ0VTU19FUVVJUE1FTlRfTUFDSElORVMsXG4gICAgICBPRkZJQ0VfRVFVSVBNRU5ULFxuICAgICAgUE9XRVJfRElTVFJJQlVUSU9OX0NPTlRST0xfU1lTVEVNUyxcbiAgICAgIFBPV0VSX0RJU1RSSUJVVElPTl9TWVNURU1TLFxuICAgICAgTkFUVVJBTF9HQVNfR0VORVJBVE9SUyxcbiAgICAgIE1PVE9SX0NPTlRST0xTLFxuICAgICAgVkFSSUFCTEVfRlJFUVVFTkNZX0RSSVZFUlMsXG4gICAgICBFTEVDVFJJQ19IVkFDLFxuICAgICAgQ09NUFJFU1NFRF9BSVJfU1lTVEVNUyxcbiAgICAgIFJFRlJJR0VSQVRJT05fQ09PTElOR19TWVNURU1TLFxuICAgICAgTUFURVJJQUxfSEFORExJTkdfRVFVSVBNRU5ULFxuICAgICAgV0lORF9QT1dFUixcbiAgICAgIEVMRUNUUklDX0lORFVTVFJJQUxfTU9UT1JTLFxuICAgICAgR1JPVU5ESU5HLFxuICAgIH0gPSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVM7XG4gICAgY29uc3QgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUgPSBbXG4gICAgICBHUklELFxuICAgICAgRElFU0VMX0dFTkVSQVRPUlMsXG4gICAgICBCQVRURVJZX0VORVJHWV9TVE9SQUdFLFxuICAgICAgTElHSFRJTkdfU1lTVEVNUyxcbiAgICAgIExJR0hUSU5HUyxcbiAgICAgIEVMRUNUUklDX01FVEVSUyxcbiAgICAgIFRSQU5TRk9STUVSUyxcbiAgICAgIEVMRUNUUklDX0ZMWVdIRUVMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgUFVNUEVEX0hZRFJPX1NUT1JBR0UsXG4gICAgICBUSEVSTUFMX0VORVJHWV9TVE9SQUdFLFxuICAgICAgU1VQRVJfQ0FQQUNJVE9SX0VORVJHWV9TVE9SQUdFLFxuICAgICAgU1dJVENIX0dFQVJTLFxuICAgICAgUFJPQ0VTU19DT05UUk9MX0FVVE9NQVRJT05fU1lTVEVNUyxcbiAgICAgIFBST0NFU1NfRVFVSVBNRU5UX01BQ0hJTkVTLFxuICAgICAgT0ZGSUNFX0VRVUlQTUVOVCxcbiAgICAgIFBPV0VSX0RJU1RSSUJVVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICBQT1dFUl9ESVNUUklCVVRJT05fU1lTVEVNUyxcbiAgICAgIE5BVFVSQUxfR0FTX0dFTkVSQVRPUlMsXG4gICAgICBNT1RPUl9DT05UUk9MUyxcbiAgICAgIFZBUklBQkxFX0ZSRVFVRU5DWV9EUklWRVJTLFxuICAgICAgRUxFQ1RSSUNfSFZBQyxcbiAgICAgIENPTVBSRVNTRURfQUlSX1NZU1RFTVMsXG4gICAgICBSRUZSSUdFUkFUSU9OX0NPT0xJTkdfU1lTVEVNUyxcbiAgICAgIE1BVEVSSUFMX0hBTkRMSU5HX0VRVUlQTUVOVCxcbiAgICAgIFdJTkRfUE9XRVIsXG4gICAgICBFTEVDVFJJQ19JTkRVU1RSSUFMX01PVE9SUyxcbiAgICAgIEdST1VORElORyxcbiAgICBdO1xuICAgIExpc3RJdGVtc0NyZWF0ZUVudGl0eVRlbXBsYXRlLm1hcCgoZSkgPT4ge1xuICAgICAgaWYgKCEhQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdKSB7XG4gICAgICAgIHRoaXMubWFrZUVudGl0eVRlbXBsYXRlRW5lcmd5KFxuICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5pY29uLFxuICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXS5uYW1lXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBpbml0RWxlY3RyaWNHcm91cFRlbXBsYXRlKCkge1xuICAgIGNvbnN0IGxpc3RJdGVtcyA9IFtcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkJBVFRFUllfRU5FUkdZX1NUT1JBR0VcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5UUkFOU0ZPUk1FUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTEVDVFJJQ19NRVRFUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5MSUdIVElOR1NcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QT1dFUl9ESVNUUklCVVRJT05fU1lTVEVNU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNXSVRDSF9HRUFSU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkVMRUNUUklDX0lORFVTVFJJQUxfTU9UT1JTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuR1JPVU5ESU5HXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuTU9UT1JfQ09OVFJPTFNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5MSUdIVElOR19TWVNURU1TXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRUxFQ1RSSUNfSFZBQ1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlJFRlJJR0VSQVRJT05fQ09PTElOR19TWVNURU1TXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUFJPQ0VTU19DT05UUk9MX0FVVE9NQVRJT05fU1lTVEVNU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLk9GRklDRV9FUVVJUE1FTlRcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5DT01QUkVTU0VEX0FJUl9TWVNURU1TXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUFJPQ0VTU19FUVVJUE1FTlRfTUFDSElORVNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5NQVRFUklBTF9IQU5ETElOR19FUVVJUE1FTlRcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QT1dFUl9ESVNUUklCVVRJT05fQ09OVFJPTF9TWVNURU1TXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQkFUVEVSSUVTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVkFSSUFCTEVfRlJFUVVFTkNZX0RSSVZFUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTEVDVFJJQ19GTFlXSEVFTF9FTkVSR1lfU1RPUkFHRVxuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlBVTVBFRF9IWURST19TVE9SQUdFXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEhFUk1BTF9FTkVSR1lfU1RPUkFHRVxuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNVUEVSX0NBUEFDSVRPUl9FTkVSR1lfU1RPUkFHRVxuICAgICAgXSxcbiAgICBdO1xuICAgIGxpc3RJdGVtcy5mb3JFYWNoKChlKSA9PiB7XG4gICAgICB0aGlzLm1ha2VHcm91cFRlbXBsYXRlKGU/Lmljb24sIGUubmFtZSk7XG4gICAgfSk7XG4gIH1cblxuICBpbml0RnVlbEdyb3VwVGVtcGxhdGUoKSB7XG4gICAgY29uc3QgbGlzdEl0ZW1zID0gW1xuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRElFU0VMX0ZVRUxTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuR0FTT05fTElORVNcbiAgICAgIF0sXG5cbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkJJT0RJRVNFTFNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5LRVJPU0VOU0VcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QUk9QQU5FU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlRBTktFUl9UUlVDS1NcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QSVBFTElORVxuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLklORFVTVFJJQUxfQk9JTEVSU1xuICAgICAgXSxcblxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuR0VORVJBVE9SU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLklORFVTVFJJQUxfRlVSTkFDRVNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5JTkRVU1RSSUFMX09WRU5TXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuSU5EVVNUUklBTF9WRUhJQ0xFU19BTkRfRVFVSVBNRU5UXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9NRVRFUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0RJU1BFTlNFUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX1NUUk9SQUdFX1RBTktTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRUxFQ1RSSUNfSFZBQ1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX01BTkFHRU1FTlRTXG4gICAgICBdLFxuICAgIF07XG5cbiAgICB0aGlzLm1ha2VHcm91cFRlbXBsYXRlKFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9ESVNQRU5TRVJTXG4gICAgICBdLmljb24sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0RJU1BFTlNFUlNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgbGlzdEl0ZW1zLmZvckVhY2goKGUpID0+IHtcbiAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoZT8uaWNvbiwgZS5uYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRHYXNHcm91cFRlbXBsYXRlKCkge1xuICAgIGNvbnN0IGxpc3RJdGVtcyA9IFtcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkNPTVBSRVNTRURfTkFUVVJBTF9HQVNfUElQRUxJTkVcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CT0lMRVJTX0FORF9IRUFURVJTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVSTkFDRVNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QT1dFUl9HRU5FUkFUSU9OXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09HRU5FUkFUSU9OXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09NQklORURfQ1lDTEVfUE9XRVJfUExBTlRTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9GT1JfVkVISUNMRVNfQU5EX0VRVUlQTUVOVFxuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdBU19NRVRFUlNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5CVVJORVJTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRkxVRV9HQVNfQU5BTFlaRVJTXG4gICAgICBdLFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09NQlVTVElPTl9DT05UUk9MX1NZU1RFTVNcbiAgICAgIF0sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5HQVNfU1RPUkFHRV9UQU5LU1xuICAgICAgXSxcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkdBU19QUkVTU1VSRV9SRUdVTEFUT1JTXG4gICAgICBdLFxuICAgIF07XG5cbiAgICB0aGlzLm1ha2VHcm91cFRlbXBsYXRlKFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuRlVFTF9ESVNQRU5TRVJTXG4gICAgICBdLmljb24sXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbXG4gICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5GVUVMX0RJU1BFTlNFUlNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfU1RST1JBR0VfVEFOS1NcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfRklMVFJBVElPTlNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgdGhpcy5tYWtlR3JvdXBUZW1wbGF0ZShcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNcbiAgICAgIF0uaWNvbixcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkZVRUxfTUFOQUdFTUVOVFNcbiAgICAgIF0ubmFtZVxuICAgICk7XG4gICAgbGlzdEl0ZW1zLmZvckVhY2goKGUpID0+IHtcbiAgICAgIHRoaXMubWFrZUdyb3VwVGVtcGxhdGUoZT8uaWNvbiwgZS5uYW1lKTtcbiAgICB9KTtcbiAgfVxuXG4gIGluaXRHYXNEaWFncmFtKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIE5BVFVSQUxfR0FTX1BJUEVMSU5FUyxcbiAgICAgIExJUVVFRklFRF9OQVRVUkFMX0dBUyxcbiAgICAgIENPTVBSRVNTRURfTkFUVVJBTF9HQVNfUElQRUxJTkUsXG4gICAgICBDT01QUkVTU0VEX05BVFVSQUxfR0FTX1BST0RVQ1RJT04sXG4gICAgICBCT0lMRVJTX0FORF9IRUFURVJTLFxuICAgICAgRlVSTkFDRVMsXG4gICAgICBQT1dFUl9HRU5FUkFUSU9OLFxuICAgICAgQ09HRU5FUkFUSU9OLFxuICAgICAgQ09NQklORURfQ1lDTEVfUE9XRVJfUExBTlRTLFxuICAgICAgRlVFTF9GT1JfVkVISUNMRVNfQU5EX0VRVUlQTUVOVCxcbiAgICAgIEdBU19NRVRFUlMsXG4gICAgICBCVVJORVJTLFxuICAgICAgRkxVRV9HQVNfQU5BTFlaRVJTLFxuICAgICAgQ09NQlVTVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICBHQVNfU1RPUkFHRV9UQU5LUyxcbiAgICAgIEdBU19QUkVTU1VSRV9SRUdVTEFUT1JTLFxuICAgICAgTkFUVVJBTF9HQVMsXG4gICAgfSA9IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUztcbiAgICBjb25zdCBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZSA9IFtcbiAgICAgIE5BVFVSQUxfR0FTX1BJUEVMSU5FUyxcbiAgICAgIExJUVVFRklFRF9OQVRVUkFMX0dBUyxcbiAgICAgIENPTVBSRVNTRURfTkFUVVJBTF9HQVNfUElQRUxJTkUsXG4gICAgICBDT01QUkVTU0VEX05BVFVSQUxfR0FTX1BST0RVQ1RJT04sXG4gICAgICBCT0lMRVJTX0FORF9IRUFURVJTLFxuICAgICAgRlVSTkFDRVMsXG4gICAgICBQT1dFUl9HRU5FUkFUSU9OLFxuICAgICAgQ09HRU5FUkFUSU9OLFxuICAgICAgQ09NQklORURfQ1lDTEVfUE9XRVJfUExBTlRTLFxuICAgICAgRlVFTF9GT1JfVkVISUNMRVNfQU5EX0VRVUlQTUVOVCxcbiAgICAgIEdBU19NRVRFUlMsXG4gICAgICBCVVJORVJTLFxuICAgICAgRkxVRV9HQVNfQU5BTFlaRVJTLFxuICAgICAgQ09NQlVTVElPTl9DT05UUk9MX1NZU1RFTVMsXG4gICAgICBHQVNfU1RPUkFHRV9UQU5LUyxcbiAgICAgIEdBU19QUkVTU1VSRV9SRUdVTEFUT1JTLFxuICAgICAgTkFUVVJBTF9HQVMsXG4gICAgXTtcbiAgICBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZS5tYXAoKGUpID0+IHtcbiAgICAgIGlmICghIUF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXSkge1xuICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0uaWNvbixcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0ubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdEZ1ZWxEaWFncmFtKCkge1xuICAgIGNvbnN0IHtcbiAgICAgIERJRVNFTF9GVUVMUyxcbiAgICAgIEdBU09OX0xJTkVTLFxuICAgICAgQklPRElFU0VMUyxcbiAgICAgIEtFUk9TRU5TRSxcbiAgICAgIFBST1BBTkVTLFxuICAgICAgVEFOS0VSX1RSVUNLUyxcbiAgICAgIFBJUEVMSU5FLFxuICAgICAgSU5EVVNUUklBTF9CT0lMRVJTLFxuICAgICAgR0VORVJBVE9SUyxcbiAgICAgIElORFVTVFJJQUxfRlVSTkFDRVMsXG4gICAgICBJTkRVU1RSSUFMX09WRU5TLFxuICAgICAgSU5EVVNUUklBTF9WRUhJQ0xFU19BTkRfRVFVSVBNRU5ULFxuICAgICAgRlVFTF9NRVRFUlMsXG4gICAgICBGVUVMX0RJU1BFTlNFUlMsXG4gICAgICBGVUVMX1NUUk9SQUdFX1RBTktTLFxuICAgICAgRlVFTF9GSUxUUkFUSU9OUyxcbiAgICAgIEZVRUxfTUFOQUdFTUVOVFMsXG4gICAgICBGVUVMUyxcbiAgICB9ID0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgIGNvbnN0IExpc3RJdGVtc0NyZWF0ZUVudGl0eVRlbXBsYXRlID0gW1xuICAgICAgRElFU0VMX0ZVRUxTLFxuICAgICAgR0FTT05fTElORVMsXG4gICAgICBCSU9ESUVTRUxTLFxuICAgICAgS0VST1NFTlNFLFxuICAgICAgUFJPUEFORVMsXG4gICAgICBUQU5LRVJfVFJVQ0tTLFxuICAgICAgUElQRUxJTkUsXG4gICAgICBJTkRVU1RSSUFMX0JPSUxFUlMsXG4gICAgICBHRU5FUkFUT1JTLFxuICAgICAgSU5EVVNUUklBTF9GVVJOQUNFUyxcbiAgICAgIElORFVTVFJJQUxfT1ZFTlMsXG4gICAgICBJTkRVU1RSSUFMX1ZFSElDTEVTX0FORF9FUVVJUE1FTlQsXG4gICAgICBGVUVMX01FVEVSUyxcbiAgICAgIEZVRUxfRElTUEVOU0VSUyxcbiAgICAgIEZVRUxfU1RST1JBR0VfVEFOS1MsXG4gICAgICBGVUVMX0ZJTFRSQVRJT05TLFxuICAgICAgRlVFTF9NQU5BR0VNRU5UUyxcbiAgICAgIEZVRUxTLFxuICAgIF07XG4gICAgTGlzdEl0ZW1zQ3JlYXRlRW50aXR5VGVtcGxhdGUubWFwKChlKSA9PiB7XG4gICAgICBpZiAoISFBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0pIHtcbiAgICAgICAgdGhpcy5tYWtlRW50aXR5VGVtcGxhdGVFbmVyZ3koXG4gICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLmljb24sXG4gICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW2VdLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGluaXRTb2xhckRpYWdyYW0oKSB7XG4gICAgY29uc3Qge1xuICAgICAgU09MQVJfUE9XRVIsXG4gICAgICBQT1dFUl9DT05ESVRJT05JTkdfVU5JVCxcbiAgICAgIEJBVFRFUklFUzogQkFUVEVSWSxcbiAgICAgIElOVkVSVEVSUzogSU5WRVJURVIsXG4gICAgfSA9IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUztcbiAgICBjb25zdCBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZSA9IFtcbiAgICAgIFNPTEFSX1BPV0VSLFxuICAgICAgUE9XRVJfQ09ORElUSU9OSU5HX1VOSVQsXG4gICAgICBCQVRURVJZLFxuICAgICAgSU5WRVJURVIsXG4gICAgXTtcbiAgICBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZS5tYXAoKGUpID0+IHtcbiAgICAgIGlmICghIUF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXSkge1xuICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0uaWNvbixcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0ubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaW5pdFN0ZWFtRGlhZ3JhbSgpIHtcbiAgICBjb25zdCB7XG4gICAgICBWQUxVRVMsXG4gICAgICBTVEVBTV9UUkFQUyxcbiAgICAgIFBSRVNTVVJFX1JFR1VMQVRPUlMsXG4gICAgICBTQUZFVFlfVkFMVUVTX0FORF9FUVVJUE1FTlQsXG4gICAgICBDT05ERU5TQVRFX1JFVFVSTl9TWVNURU0sXG4gICAgICBERUFFUkFUT1JTLFxuICAgICAgRkVFRFdBVEVSX1BVTVBTLFxuICAgICAgQkxPV0RPV05fVEFOS1MsXG4gICAgICBFWFBBTlNJT05fVEFOS1MsXG4gICAgICBIRUFUX0VYQ0hBTkdFUlMsXG4gICAgICBUVVJCSU5FUyxcbiAgICB9ID0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTO1xuICAgIGNvbnN0IExpc3RJdGVtc0NyZWF0ZUVudGl0eVRlbXBsYXRlID0gW1xuICAgICAgVkFMVUVTLFxuICAgICAgU1RFQU1fVFJBUFMsXG4gICAgICBQUkVTU1VSRV9SRUdVTEFUT1JTLFxuICAgICAgU0FGRVRZX1ZBTFVFU19BTkRfRVFVSVBNRU5ULFxuICAgICAgQ09OREVOU0FURV9SRVRVUk5fU1lTVEVNLFxuICAgICAgREVBRVJBVE9SUyxcbiAgICAgIEZFRURXQVRFUl9QVU1QUyxcbiAgICAgIEJMT1dET1dOX1RBTktTLFxuICAgICAgRVhQQU5TSU9OX1RBTktTLFxuICAgICAgSEVBVF9FWENIQU5HRVJTLFxuICAgICAgVFVSQklORVMsXG4gICAgXTtcbiAgICBMaXN0SXRlbXNDcmVhdGVFbnRpdHlUZW1wbGF0ZS5tYXAoKGUpID0+IHtcbiAgICAgIGlmICghIUF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tlXSkge1xuICAgICAgICB0aGlzLm1ha2VFbnRpdHlUZW1wbGF0ZUVuZXJneShcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0uaWNvbixcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTk9ERV9URU1QTEFURVNbZV0ubmFtZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgb25Nb2RlbENoYW5nZUxpc3RlbmVyKGU6IGdvLkNoYW5nZWRFdmVudCkge1xuICAgIC8vIHRoaXMub25Nb2RlbENoYW5nZUxpc3RlbmVyRXZlbnQuZW1pdChlKTtcbiAgfVxuXG4gIG1ha2VMaW5rVGVtcGxhdGUoKSB7XG4gICAgY29uc3QgZWxlbWVudHM6IGFueVtdID0gW107XG4gICAgLy8gbGluZVxuICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlNoYXBlLFxuICAgICAgICB7XG4gICAgICAgICAgaXNQYW5lbE1haW46IHRydWUsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuR1JBWSxcbiAgICAgICAgICBzdHJva2VXaWR0aDpcbiAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5MSU5LX1RFTVBMQVRFU1tcbiAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5TSU1QTEVcbiAgICAgICAgICAgIF0/LnN0cm9rZVdpZHRoLFxuICAgICAgICAgIC8vIHN0cm9rZVdpZHRoOiAwLFxuICAgICAgICB9LFxuICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2NvbG9yJyksXG4gICAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICAgJ3N0cm9rZVdpZHRoJyxcbiAgICAgICAgICAndHlwZScsXG4gICAgICAgICAgKHgpID0+IEF0b0dvanNFZGl0b3JNb2RlbC5MSU5LX1RFTVBMQVRFU1t4XT8uc3Ryb2tlV2lkdGhcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG5cbiAgICAvLyBhbmltYXRpb25cbiAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgIC4uLkF0b0dvanNFZGl0b3JNb2RlbC5MSU5LX1RFTVBMQVRFU1tcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9MSU5LX1RZUEVTLlBJUEVfQU5JTUFUSU9OXG4gICAgICAgIF0/LmFuaW1hdGlvbixcbiAgICAgICAgdmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnVmVydGljYWwnLFxuICAgICAgICB7XG4gICAgICAgICAgaGVpZ2h0OiAzOCxcbiAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShOYU4sIDM2KSxcbiAgICAgICAgICAvLyB3aWR0aDogMTAwLFxuICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKDEwMCwgNSksIC8vIMSQ4bq3dCBrw61jaCB0aMaw4bubYyB04buRaSB0aGnhu4N1IGzDoCAxMDB4NTBcbiAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIC8vIGxheWVyTmFtZTogJ0JhY2tncm91bmRMYXllcicsXG4gICAgICAgICAgLy8gYWxpZ25tZW50OiBnby5TcG90LlRvcCxcbiAgICAgICAgICAvLyBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgIC8vIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAwLCA1MCwgMCksXG4gICAgICAgICAgLy8gc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ3RleHRDb21wb25lbnQnLCAoeCkgPT4ge1xuICAgICAgICAgIHJldHVybiB4ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9KSxcbiAgICAgICAgLy8gdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgIC8vICAgICBoZWlnaHQ6IDMwLFxuICAgICAgICAvLyAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgLy8gICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIC8vICAgICAvLyB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgLy8gfSksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy8gbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDUwLCAwKSxcbiAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAgIC8vIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIC8vIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsIC8vIMSQ4bqjbSBi4bqjbyB2xINuIGLhuqNuIG7hurFtIOG7nyB0cnVuZyB0w6JtIGPhu6dhIG7DunRcbiAgICAgICAgICAgIC8vIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkNlbnRlciwgLy8gxJDhuqNtIGLhuqNvIHbEg24gYuG6o24ga2jDtG5nIGLhu4sgZOG7i2NoIGNodXnhu4NuIHJhIGto4buPaSB0cnVuZyB0w6JtXG4gICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCwgLy8gQ2h1eeG7g24gZMOybmcgxJHhu4MgdsSDbiBi4bqjbiBraMO0bmcgdsaw4bujdCByYSBuZ2/DoGlcbiAgICAgICAgICAgIC8vIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICd0ZXh0Q29tcG9uZW50JylcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3RleHRDb21wb25lbnQnKSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnYmFja2dyb3VuZCcsICd0ZXh0Q29tcG9uZW50JywgKHgpID0+XG4gICAgICAgICAgICB4ID8gJ3doaXRlJyA6ICd0cmFuc3BhcmVudCdcbiAgICAgICAgICApXG4gICAgICAgICAgLy8gICAgIG5ldyBnby5CaW5kaW5nKCdtYXJnaW4nLCAnaXNGb3JtYXQnLCAoeCkgPT5cbiAgICAgICAgICAvLyAgICAgeCA/IG5ldyBnby5NYXJnaW4oNSwgMCwgNSwgNSkgOiBuZXcgZ28uTWFyZ2luKDUsIDUsIDUsIDUpLFxuICAgICAgICAgIC8vICksXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gYXJyb3dcbiAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5TaGFwZSwgLy8gdGhlIFwiZnJvbVwiIGFycm93aGVhZFxuICAgICAgICB7XG4gICAgICAgICAgLi4uQXRvR29qc0VkaXRvck1vZGVsLkxJTktfVEVNUExBVEVTW1xuICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5TSU1QTEVcbiAgICAgICAgICBdPy5hcnJvdyxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICAgJ3Zpc2libGUnLFxuICAgICAgICAgICd0eXBlJyxcbiAgICAgICAgICAoeCkgPT5cbiAgICAgICAgICAgICFbXG4gICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0xJTktfVFlQRVMuUElQRV9BTklNQVRJT04sXG4gICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0xJTktfVFlQRVMuUElQRSxcbiAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fTElOS19UWVBFUy5QSVBFX0hJRERFTixcbiAgICAgICAgICAgIF0uaW5jbHVkZXMoeClcbiAgICAgICAgKSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2ZpbGwnLCAnY29sb3InKSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdjb2xvcicpXG4gICAgICApXG4gICAgKTtcblxuICAgIC8vIFRPRE8gZml4IGxpbmsgY2Fubm90IHNlbGVjdGVkIGluc2lkZSBncm91cCB0ZW1wbGF0ZVxuICAgIHRoaXMubXlEaWFncmFtLmxpbmtUZW1wbGF0ZSA9IHRoaXMuJChcbiAgICAgIGdvLkxpbmssXG4gICAgICBnby5MaW5rLk9ydGhvZ29uYWwsXG4gICAgICB7XG4gICAgICAgIC8vIGxheWVyTmFtZTogJ0JhY2tncm91bmQnLCAvLyBsaW5rIGNhbm5vdCBzZWxlY3QgaW5zaWRlIGdyb3VwIHRlbXBsYXRlXG4gICAgICAgIC8vIGN1cnZpbmVzczogMjAsXG4gICAgICAgIC8vIGNvcm5lcjogNSxcbiAgICAgICAgcm91dGluZzogZ28uTGluay5Bdm9pZHNOb2RlcyxcbiAgICAgICAgcmVzaGFwYWJsZTogdHJ1ZSxcbiAgICAgICAgcmVzZWdtZW50YWJsZTogdHJ1ZSxcbiAgICAgICAgcmVsaW5rYWJsZUZyb206IHRydWUsXG4gICAgICAgIHJlbGlua2FibGVUbzogdHJ1ZSxcbiAgICAgICAgc2VsZWN0YWJsZTogdHJ1ZSxcbiAgICAgICAgdG9TaG9ydExlbmd0aDpcbiAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuTElOS19URU1QTEFURVNbXG4gICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9MSU5LX1RZUEVTLlNJTVBMRVxuICAgICAgICAgIF0udG9TaG9ydExlbmd0aCwgLy8gYXNzdW1lIGFycm93aGVhZCBhdCBcInRvXCIgZW5kLCBuZWVkIHRvIGF2b2lkIGJhZCBhcHBlYXJhbmNlIHdoZW4gcGF0aCBpcyB0aGlja1xuICAgICAgfSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdsYXllck5hbWUnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgcmV0dXJuIGRhdGE/LnRleHRDb21wb25lbnQgPyAnQmFja2dyb3VuZCcgOiAnJztcbiAgICAgIH0pLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3pPcmRlcicsICd0eXBlJywgKHgpID0+XG4gICAgICAgIHggPT09IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0xJTktfVFlQRVMuUElQRV9BTklNQVRJT04gPyAxMSA6IDEwXG4gICAgICApLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICd0b1Nob3J0TGVuZ3RoJyxcbiAgICAgICAgJ3R5cGUnLFxuICAgICAgICAoeCkgPT4gQXRvR29qc0VkaXRvck1vZGVsLkxJTktfVEVNUExBVEVTW3hdLnRvU2hvcnRMZW5ndGggfHwgMFxuICAgICAgKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ3Zpc2libGUnKSxcblxuICAgICAgLy8gbWFrZSBzdXJlIGxpbmtzIGNvbWUgaW4gZnJvbSB0aGUgcHJvcGVyIGRpcmVjdGlvbiBhbmQgZ28gb3V0IGFwcHJvcHJpYXRlbHlcbiAgICAgIC4uLmVsZW1lbnRzXG4gICAgKTtcbiAgfVxuXG4gIG1ha2VWYWx1ZU5vZGVUZW1wbGF0ZShzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgyLCBoOiAzNiB9KSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLk5vZGUsXG4gICAgICAnU3BvdCcsXG4gICAgICB7fSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShcbiAgICAgICAgZ28uUG9pbnQuc3RyaW5naWZ5XG4gICAgICApLFxuXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHsgbWluU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53LCBzaXplLmgpIH0sXG4gICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JlY3RhbmdsZScsIHtcbiAgICAgICAgICBmaWxsOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTElHSFRfQkxVRSxcbiAgICAgICAgICBzdHJva2U6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICBmb250OiAnYm9sZCAxNHB4IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQ0VSVUxFQU4sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2VkaXRhYmxlJywgJ2lzRWRpdGFibGUnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3Nob3J0ZW5lZE51bWJlcicpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnY29sb3InKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtYXJnaW4nLCAnaXNGb3JtYXQnLCAoeCkgPT5cbiAgICAgICAgICAgICAgeCA/IG5ldyBnby5NYXJnaW4oNSwgMCwgNSwgNSkgOiBuZXcgZ28uTWFyZ2luKDUsIDUsIDUsIDUpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWUgIT09IFZBTFVFX05BO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApLFxuICAgICAgICAgIC8vIEljb24gRXJyIHdoZW4gbGFjayBvZiB2YWx1ZVxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDEwLCAxMCwgMTAsIDEwKSxcbiAgICAgICAgICAgICAgdGV4dDogVkFMVUVfTkEsIC8vIE9sZCB2ZXJzaW9uOiBURVhUX0VSUk9SXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDEwcHQgc2Fucy1zZXJpZicsXG4gICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLlNBTE1PTixcbiAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLldyYXBGaXQsXG4gICAgICAgICAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgaXNNdWx0aWxpbmU6IGZhbHNlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlID09PSBWQUxVRV9OQTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlZBTFVFX05PREUsXG4gICAgICBub2RlXG4gICAgKTtcbiAgfVxuXG4gIG1ha2VFbXB0eU5vZGVUZW1wbGF0ZShzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDAsIGg6IDAgfSkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge30sXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5FTVBUWSxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZVZhbHVlTGFiZWxUZW1wbGF0ZShzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgyLCBoOiAzNiB9KSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLk5vZGUsXG4gICAgICAnQXV0bycsXG4gICAgICB7XG4gICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShcbiAgICAgICAgZ28uUG9pbnQuc3RyaW5naWZ5XG4gICAgICApLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7IG1pblNpemU6IG5ldyBnby5TaXplKHNpemUudywgc2l6ZS5oKSB9LFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAxMCwgMCwgMTApLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgNSwgMTAsIDApLFxuICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICBmb250OiAnYm9sZCAxNXB4IHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCxcbiAgICAgICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQ0VSVUxFQU4sXG4gICAgICAgICAgICAgIG1pblNpemU6IG5ldyBnby5TaXplKDE1MCwgMzApLCAvLyBTZXQgdGhlIHdpZHRoIG9mIHRoZSB0ZXh0IGJsb2NrXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdjb2xvcicpLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnZGF0YScsICh4KSA9PiB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgeD8ucXVhbnRpdHkgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZDogYW55ID0gVXRpbHNTZXJ2aWNlLmNvbnZlcnRQcmVmaXhlc0RhdGEoe1xuICAgICAgICAgICAgICAgIHZhbHVlOiB4Py5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICB1bml0OiBVdGlsc1NlcnZpY2UuY29udmVydFNwZWNpYWxVbml0KHg/LnVuaXQpLFxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICBsZXQgcmV0VmFsdWUgPVxuICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5zaG9ydGVuZWROdW1iZXIgK1xuICAgICAgICAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZC51bml0UHJlZml4ZXMgK1xuICAgICAgICAgICAgICAgICAgVXRpbHNTZXJ2aWNlLmNvbnZlcnRTcGVjaWFsVW5pdCh4Py51bml0KSA/PyAnJztcbiAgICAgICAgICAgICAgaWYgKHg/LnBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICByZXRWYWx1ZSArPSBgICgke3g/LnBlcmNlbnR9JSlgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXRWYWx1ZTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgJ2RhdGEnLFxuICAgICAgICAgICAgICAoeCkgPT4gdHlwZW9mIHg/LnF1YW50aXR5ID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5WQUxVRV9MQUJFTCxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZVRleHRMYWJlbFRlbXBsYXRlKHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogTmFOLCBoOiAyMCB9KSB7XG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLk5vZGUsXG4gICAgICAnQXV0bycsXG4gICAgICB7XG4gICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgICAgICBpc1NlbGVjdGVkOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdBdXRvJyxcbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICdIb3Jpem9udGFsJyxcblxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTZweCBBcmlhbCcsXG4gICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5DRVJVTEVBTixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2NvbG9yJyksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJyksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICd2aXNpYmxlJylcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQoXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9MQUJFTCxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZVRleHRUZW1wbGF0ZShcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7XG4gICAgICB3OiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICAgIGg6IEF0b0dvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiAyLFxuICAgIH1cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgY29uc3QgY29udGV4dE1lbnUgPSB0aGlzLiQoXG4gICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAnVmVydGljYWwnLFxuICAgICAgdGhpcy4kKCdDb250ZXh0TWVudUJ1dHRvbicsIHRoaXMuJChnby5UZXh0QmxvY2ssICdPcHRpb24gMScpLCB7XG4gICAgICAgIGNsaWNrOiBmdW5jdGlvbiAoZSwgb2JqKSB7XG4gICAgICAgICAgYWxlcnQoJ09wdGlvbiAxIGNsaWNrZWQhJyk7XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICAgIHRoaXMuJCgnQ29udGV4dE1lbnVCdXR0b24nLCB0aGlzLiQoZ28uVGV4dEJsb2NrLCAnT3B0aW9uIDInKSwge1xuICAgICAgICBjbGljazogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgIGFsZXJ0KCdPcHRpb24gMiBjbGlja2VkIScpO1xuICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIC8vIC4uLiBhZGQgbW9yZSBvcHRpb25zIGFzIG5lZWRlZCAuLi5cbiAgICApO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICAvLyBmcm9tU3BvdDogZ28uU3BvdC5SaWdodFNpZGUsXG4gICAgICAgIC8vIHRvU3BvdDogZ28uU3BvdC5MZWZ0U2lkZSxcbiAgICAgICAgbG9jYXRpb25TcG90OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgLy8gc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgLy8gICAgIGlmIChlPy5kYXRhLm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgLy8gICAgICAgICBlPy5kYXRhLm9uU2VsZWN0ZWQoZT8uZGF0YSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIG1vdXNlSG92ZXI6IChlLCBvYmopID0+IHtcbiAgICAgICAgLy8gICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgLy8gICAgIGlmICgob2JqIGFzIGFueSkucGFydD8ub2I/LnZhbHVlID09PSBWQUxVRV9OQSkge1xuICAgICAgICAvLyAgICAgICAgIHNlbGYub25Ib3ZlckluZm9CdXR0b24uZW1pdCh7XG4gICAgICAgIC8vICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgIC8vICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAvLyAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAvLyAgICAgICAgIH0pO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBtb3VzZUxlYXZlOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgIC8vICAgICBpZiAoKG9iaiBhcyBhbnkpLnBhcnQ/Lm9iPy52YWx1ZSA9PT0gVkFMVUVfTkEpIHtcbiAgICAgICAgLy8gICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0sXG4gICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBub2RlID0gb2JqLnBhcnQ7XG4gICAgICAgICAgaWYgKG5vZGU/Lm9iPy5pc1R5cGVJbmZsb3dPZlBsYW50Q2VsbCkge1xuICAgICAgICAgICAgLy8gb2JqPy5kYXRhPy5vblNlbGVjdGVkKG5vZGU/Lm9iPy5ub2RlUGxhbnRDZWxsUGFyZW50KTtcbiAgICAgICAgICAgIC8vIHNlbGYub25DbGlja0NvbXBvZW50LmVtaXQoe1xuICAgICAgICAgICAgLy8gICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgIC8vICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgIC8vICAgICBub2RlOiB7XG4gICAgICAgICAgICAvLyAgICAgICAgIG9iOiBub2RlPy5vYj8ubm9kZVBsYW50Q2VsbFBhcmVudCxcbiAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgLy8gICAgIGNvbXBvbmVudDogbm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQsXG4gICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxPcHRpb25zPy5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd05vZGVJbmZvXG4gICAgICAgICAgICAgID8gc2VsZi5vbkNsaWNrSW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBkb3VibGVDbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IG9iai5wYXJ0O1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vZGU/Lm9iPy5pc1R5cGVJbmZsb3dPZlBsYW50Q2VsbCAmJlxuICAgICAgICAgICAgIXRoaXMuX2luaXRpYWxPcHRpb25zPy5pc1JlYWRPbmx5XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQobm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQpO1xuICAgICAgICAgICAgLy8gdGhpcy5pc1Nob3dOb2RlSW5mb1xuICAgICAgICAgICAgLy8gICAgID8gc2VsZi5vbkRvdWJsZUNsaWNrTm9kZS5lbWl0KHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LngsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAvLyAgICAgICAgICAgbm9kZToge1xuICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBvYjogbm9kZT8ub2I/Lm5vZGVQbGFudENlbGxQYXJlbnQsXG4gICAgICAgICAgICAvLyAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICAgIH0pXG4gICAgICAgICAgICAvLyAgICAgOiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxPcHRpb25zPy5pc1JlYWRPbmx5KSB7XG4gICAgICAgICAgICB0aGlzLmlzU2hvd05vZGVJbmZvXG4gICAgICAgICAgICAgID8gc2VsZi5vbkNsaWNrSW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICA6IG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogdGhpcy4kKFxuICAgICAgICAgIGdvLkFkb3JubWVudCxcbiAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAvLyB7IGhlaWdodDogNjIgfSxcbiAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwge1xuICAgICAgICAgICAgICBmaWxsOiBudWxsLFxuICAgICAgICAgICAgICBzdHJva2U6ICdkb2RnZXJibHVlJyxcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uUGxhY2Vob2xkZXIsXG4gICAgICAgICAgICAgIC8vIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbig4LCAzLCAwLCAzKSB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygncGFkZGluZycsICcnLCAoeCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB4Py5pc1R5cGVJbmZsb3dPZlBsYW50Q2VsbFxuICAgICAgICAgICAgICAgICAgPyB4Py5mbG93T2ZQbGFudENlbGwgPT09IEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLklORkxPV1xuICAgICAgICAgICAgICAgICAgICA/IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMjApXG4gICAgICAgICAgICAgICAgICAgIDogbmV3IGdvLk1hcmdpbigwLCAyMCwgMCwgMClcbiAgICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICAvLyB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogMyB9KSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdoZWlnaHQnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHg/LmlzVHlwZUluZmxvd09mUGxhbnRDZWxsID8geD8uaGVpZ2h0ICsgMTAgOiBudWxsO1xuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnd2lkdGgnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHg/LmlzVHlwZUluZmxvd09mUGxhbnRDZWxsID8geD8ud2lkdGggKyAxMiA6IG51bGw7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICB7IGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCwgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQm90dG9tIH0sXG4gICAgICAgICAgICAvLyBtb3JlXG4gICAgICAgICAgICAhdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICA/IHRoaXMuZ2VuZXJhdGVBY3Rpb25Hcm91cChbXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLklOU0lHSFQsXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT1VURkxPVyxcbiAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgOiB7fVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICd2aXNpYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnZnJvbVNwb3QnLCAnZnJvbVNwb3QnKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCd0b1Nwb3QnLCAndG9TcG90JyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbW92YWJsZScsICdtb3ZhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdhbGlnbm1lbnQnLCAnYWxpZ25tZW50JywgZnVuY3Rpb24obG9jKSB7XG4gICAgICAvLyAgICAgcmV0dXJuIG5ldyBnby5TcG90KDAsIDAsIGxvYy54LCAwKTtcbiAgICAgIC8vIH0pLm9mT2JqZWN0KCksXG5cbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdBdXRvJyxcbiAgICAgICAge1xuICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiAyLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGlmICghc2VsZi5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/Lm5hbWUgPz8gVkFMVUVfTkE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChkYXRhPy52YWx1ZSA9PT0gVkFMVUVfTkEgfHwgXy5pc05pbChkYXRhPy52YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBOT19EQVRBO1xuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIFRFWFRfVU5LTk9XTjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIF8ucm91bmQoZGF0YT8udmFsdWUsIDIpLnRvRml4ZWQoMik7XG4gICAgICAgICAgICAgIH0pLm1ha2VUd29XYXkoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgIH0sXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgIHRoaXMuYXJyb3dGb3JQbGFudENlbGwoc2l6ZSwgQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uT1VURkxPVyksXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAvLyB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKHNpemUudywgc2l6ZS5oKSxcbiAgICAgICAgICAgICAgLy8gbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53LCBzaXplLmgpLFxuICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53LCBzaXplLmgpLFxuICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnd2lkdGgnLCAnd2lkdGgnKSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdoZWlnaHQnLCAnaGVpZ2h0JyksXG5cbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uU2hhcGUsXG4gICAgICAgICAgICAgICdSb3VuZGVkUmVjdGFuZ2xlJyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZpbGw6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgICAgICAgICAgbmFtZTogJ3RleHROb2RlU2hhcGUnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZmlsbCcsICdmaWxsJyksXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzdHJva2UnLCAnc3Ryb2tlJylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAnVmVydGljYWwnLFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgIHsgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlciB9LFxuICAgICAgICAgICAgICAgIC8vIEFsZXJ0XG5cbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDUpLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdyZWNvbW1lbmRhdGlvbicpLFxuICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICAgICAgICBmaWxsOiAnI0U5NUY0NycsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyNFOTVGNDcnLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTUsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTUsXG4gICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xcdWY2NDknLFxuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMS41LCAwLCAwLCAwKSxcbiAgICAgICAgICAgICAgICAgICAgZm9udDogJzhweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgICAgPyB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgICAgICAgJ1Bvc2l0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogMTgsXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IDE1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VFbnRlcjogKGUsIG9iaikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm9uSG92ZXJBbGVydC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VBbGVydDogKG9iaiBhcyBhbnkpLnBhcnQ/Lm9iPy5tZXNzYWdlQWxlcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5vbkhvdmVyQWxlcnQuZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdhbGVydCcpLFxuXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIElDT05fQUxFUlQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSgzMCwgMzApLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIDoge31cbiAgICAgICAgICAgICAgKSxcblxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3RleHRCbG9ja1ZhbHVlJyxcbiAgICAgICAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2lyZWRTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSA4LCAxOCksXG4gICAgICAgICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDIycHggQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5HUkFZLFxuICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2VkaXRhYmxlJywgJ2lzRWRpdGFibGUnKSxcbiAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdhbmdsZScsICdhbmdsZScpLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ21hcmdpbicsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YT8uYWxlcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdjb2xvcicpLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0VGV4dERhdGFCb3goZGF0YSk7XG4gICAgICAgICAgICAgICAgICB9KS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCAoZGF0YSkgPT4gIWRhdGE/LmlzSGlkZGVuVmFsdWUpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdUJywgZ28uU3BvdC5Ub3AsIGdvLlNwb3QuVG9wU2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgZmFsc2UsIHRydWUpLFxuICAgICAgICAgICAgdGhpcy5tYWtlUG9ydCgnUicsIGdvLlNwb3QuUmlnaHQsIGdvLlNwb3QuUmlnaHRTaWRlLCB0cnVlLCBmYWxzZSksXG4gICAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzLmFycm93Rm9yUGxhbnRDZWxsKHNpemUsIEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLklORkxPVylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX05PREUsXG4gICAgICBub2RlXG4gICAgKTtcbiAgfVxuXG4gIGFycm93Rm9yUGxhbnRDZWxsKHNpemUsIGZsb3dEaXJlY3Rpb24pIHtcbiAgICByZXR1cm4gdGhpcy4kKFxuICAgICAgZ28uUGFuZWwsXG4gICAgICAnVGFibGUnLFxuICAgICAge1xuICAgICAgICBoZWlnaHQ6IHNpemUuaCxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygnaGVpZ2h0JywgJ2hlaWdodCcpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgJycsXG4gICAgICAgIChkYXRhKSA9PiBkYXRhPy5mbG93T2ZQbGFudENlbGwgPT09IGZsb3dEaXJlY3Rpb25cbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbHVtbjogZmxvd0RpcmVjdGlvbiA9PT0gQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uT1VURkxPVyA/IDAgOiAyLFxuICAgICAgICByb3c6IDIsXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2l0ZW1BcnJheScsICdkYXRhTGlua0FycmF5JyksXG4gICAgICB7XG4gICAgICAgIGl0ZW1UZW1wbGF0ZTogdGhpcy4kKFxuICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdyb3cnLCAnaW5kZXhSb3cnKSxcbiAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygnaGVpZ2h0JywgJ2hlaWdodCcpLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICBBUlJPVyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoMjAsIDQwKSxcbiAgICAgICAgICAgICAgLy8gaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzb3VyY2UnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgIC8vIHBhbmVsLnBhcnQ/LmRhdGE/LmlkXG4gICAgICAgICAgICAgIHJldHVybiBkYXRhPy5pc0NyZWF0ZWQgPyBwYW5lbD8uJHAgOiBBUlJPV19HUkFZO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICB9XG4gICAgKTtcbiAgfVxuXG4gIGdldFRleHREYXRhQm94KGRhdGEpIHtcbiAgICBpZiAoZGF0YT8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICByZXR1cm4gVEVYVF9VTktOT1dOO1xuICAgIH1cbiAgICByZXR1cm4gYCR7ZGF0YT8uc2hvcnRlbmVkTnVtYmVyfSR7XG4gICAgICBkYXRhPy51bml0UHJlZml4ZXMgPyAnICcgKyBkYXRhPy51bml0UHJlZml4ZXMgOiAnJ1xuICAgIH1gO1xuICB9XG5cbiAgbWFrZURhdGFCb3hUZW1wbGF0ZShcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7XG4gICAgICB3OiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICAgIGg6IEF0b0dvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LFxuICAgIH1cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICBtb3VzZU92ZXI6IGZ1bmN0aW9uIChlLCBvYmopIHt9LFxuICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICksXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vdXNlSG92ZXI6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAgICAgICAgICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VzZUxlYXZlOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgICAgICAgIGlmICgob2JqIGFzIGFueSkucGFydD8ub2I/LnZhbHVlID09PSBWQUxVRV9OQSkge1xuICAgICAgICAgICAgICAgIHNlbGYub25Ib3ZlckluZm9CdXR0b24uZW1pdChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICB7IHJvdzogMCwgc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuSG9yaXpvbnRhbCB9LFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICBnby5TaGFwZSxcbiAgICAgICAgICAgICAgJ1JlY3RhbmdsZScsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmaWxsOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTElHSFRfQkxVRSxcbiAgICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdmaWxsJywgJ2NvbG9yJylcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDEwLCA1LCAxMCksXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53LCBOYU4pLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgc3BhY2luZ0JlbG93OiA1LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgIHsgcm93OiAxLCBzdHJldGNoOiBnby5HcmFwaE9iamVjdC5Ib3Jpem9udGFsIH0sXG4gICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgICAgIGZpbGw6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICByb3c6IDIsXG4gICAgICAgICAgICAgICAgICAvLyBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIC8vIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDEwLCA0MCksXG4gICAgICAgICAgICAgICAgICAvLyBtaW5TaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAxMCwgc2l6ZS5oKSxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbig1LCAwLCA1LCA1KSxcbiAgICAgICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDEycHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkdSQVksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZWRpdGFibGUnLCAnaXNFZGl0YWJsZScpLFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3Nob3J0ZW5lZE51bWJlcicpLm1ha2VUd29XYXkoKSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2NvbG9yJyksXG4gICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLnZhbHVlICE9PSBWQUxVRV9OQTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgICAgICAgIC8vIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgLy8gbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMTAsIDQwKSxcbiAgICAgICAgICAgICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDEwLCBzaXplLmgpLFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDUsIDUsIDUsIDApLFxuICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTJwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuR1JBWSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS52YWx1ZSAhPT0gVkFMVUVfTkE7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAndW5pdFByZWZpeGVzJyksXG4gICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdjb2xvcicpXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIC8vIEljb24gRXJyIHdoZW4gbGFjayBvZiB2YWx1ZVxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMTAsIDEwLCAxMCksXG4gICAgICAgICAgICAgICAgICB0ZXh0OiBWQUxVRV9OQSwgLy8gT2xkIHZlcnNpb246IFRFWFRfRVJST1JcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuU0FMTU9OLFxuICAgICAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLldyYXBGaXQsXG4gICAgICAgICAgICAgICAgICBlZGl0YWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICBpc011bHRpbGluZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEudmFsdWUgPT09IFZBTFVFX05BO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgfSksXG4gICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlJpZ2h0LFxuICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMSwgMC41LCAtOCwgMCksXG4gICAgICB9KSxcbiAgICAgIC8vIGZvdXIgbmFtZWQgcG9ydHMsIG9uZSBvbiBlYWNoIHNpZGU6XG5cbiAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCB0cnVlLCB0cnVlKSxcbiAgICAgIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpXG4gICAgKTtcbiAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLkRBVEFfQk9YLFxuICAgICAgbm9kZVxuICAgICk7XG4gIH1cblxuICBzaG93UG9pbnQobG9jKSB7XG4gICAgY29uc3QgZG9jTG9jID0gdGhpcy5teURpYWdyYW0udHJhbnNmb3JtRG9jVG9WaWV3KGxvYyk7XG4gIH1cblxuICBtYWtlRW50aXR5VGVtcGxhdGUoXG4gICAgaWNvbixcbiAgICB0aXRsZSxcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7XG4gICAgICB3OiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICAgIGg6IEF0b0dvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LFxuICAgIH1cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICBtb3VzZU92ZXI6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgc2VsZi5vbkNsaWNrQ29tcG9lbnQuZW1pdCh7XG4gICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogb2JqPy5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdGhpcy4kKFxuICAgICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hhZG93Qmx1cjogNixcbiAgICAgICAgICAgICAgICBzaGFkb3dPZmZzZXQ6IG5ldyBnby5Qb2ludCgwLCAyKSxcbiAgICAgICAgICAgICAgICBzaGFkb3dDb2xvcjogJyMwMDAwMDAyOScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgICAgICAgICAgICBmaWxsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogNCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogMyB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCxcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBtb3JlXG4gICAgICAgICAgICAgICAgIXRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgID8gdGhpcy5nZW5lcmF0ZUFjdGlvbkdyb3VwKFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5OT0RFX1RFTVBMQVRFU1tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlJPX1dBVEVSX1RSRUFUTUVOVFxuICAgICAgICAgICAgICAgICAgICAgICAgXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQ09PTElOR19UT1dFUlxuICAgICAgICAgICAgICAgICAgICAgICAgXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuQk9JTEVSXG4gICAgICAgICAgICAgICAgICAgICAgICBdLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgXS5pbmNsdWRlcyh0aXRsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgID8gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5SRU5BTUUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuQVNTRVRfUEFSQU1FVEVSUyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT1VURkxPVyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgICAgICA6IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERVRBSUxTLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PVVRGTE9XLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiB7fVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgfSxcbiAgICAgIC8vIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSksXG4gICAgICBuZXcgZ28uQmluZGluZygnbW92YWJsZScsICdtb3ZhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ3Zpc2libGUnKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdBdXRvJyxcbiAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuTElOS19XQVRFUixcbiAgICAgICAgICBzdHJva2VXaWR0aDogMSxcbiAgICAgICAgICAvLyBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBzaXplLmggLSA1MCksXG4gICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZSg2MCwgNjApLFxuICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgdGV4dDogdGl0bGUsXG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcm93OiAyLFxuICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDAsIDMsIDApLFxuICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgIHN0cm9rZTogJyMwMDBENDInLFxuICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgLy8gd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICB7IG1hcmdpbjogNCB9LFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygnZWRpdGFibGUnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuICEoXG4gICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLlRZUEVfQ09NUE9ORU5UX1dBVEVSPy5pbmNsdWRlcyhcbiAgICAgICAgICAgICAgICAgIGRhdGE/LnN5c3RlbVR5cGVcbiAgICAgICAgICAgICAgICApICYmXG4gICAgICAgICAgICAgICAgZGF0YT8udG9wb2xvZ3lUeXBlICE9PSBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLldBVEVSICYmXG4gICAgICAgICAgICAgICAgZGF0YT8udG9wb2xvZ3lUeXBlICE9PVxuICAgICAgICAgICAgICAgICAgQVRPX0VDT01QT05FTlRfUExBTlRfVFlQRS5XQVRFUl9QTEFOVF9DRUxMXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSxcblxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMC41LCA4LCAwKSxcbiAgICAgIH0pLFxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5SaWdodCxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDEsIDAuNSwgLTgsIDApLFxuICAgICAgfSksXG5cbiAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSlcbiAgICApO1xuICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICB9XG5cbiAgbWFrZUVudGl0eVRlbXBsYXRlRW5lcmd5KFxuICAgIGljb24sXG4gICAgdGl0bGUsXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0ge1xuICAgICAgdzogQXRvR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDUsXG4gICAgICBoOiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uTm9kZSxcbiAgICAgICdTcG90JyxcbiAgICAgIHtcbiAgICAgICAgbG9jYXRpb25TcG90OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgbW91c2VPdmVyOiBmdW5jdGlvbiAoZSwgb2JqKSB7XG4gICAgICAgICAgLy8gc2VsZi5zaG93UG9pbnQob2JqPy5wYXJ0Py5sb2NhdGlvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICBpZiAob2JqPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQob2JqPy5kYXRhKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvbkFkb3JubWVudFRlbXBsYXRlOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLkFkb3JubWVudCxcbiAgICAgICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgc2hhZG93VmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzaGFkb3dCbHVyOiA2LFxuICAgICAgICAgICAgICAgIHNoYWRvd09mZnNldDogbmV3IGdvLlBvaW50KDAsIDIpLFxuICAgICAgICAgICAgICAgIHNoYWRvd0NvbG9yOiAnIzAwMDAwMDI5JyxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHtcbiAgICAgICAgICAgICAgICAgIGZpbGw6IG51bGwsXG4gICAgICAgICAgICAgICAgICBzdHJva2U6ICdkb2RnZXJibHVlJyxcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiAzIH0pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcFJpZ2h0LFxuICAgICAgICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZDogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIG1vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW1xuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERVRBSUxTLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAndmlzaWJsZScpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ21vdmFibGUnLCAnbW92YWJsZScpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICksXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHsgd2lkdGg6IHNpemUudywgaGVpZ2h0OiBzaXplLmggfSxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuVEVNUExBVEVfRFVQTElDQVRFW3RpdGxlXSA/PyB0aXRsZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgMTUpLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjNDQ0NDQ0JyxcbiAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aXRsZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIHNpemUuaCAtIDY1KSxcbiAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDEwLCAzLCAzLCAzKSxcbiAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAxNSksXG4gICAgICAgICAgICAgIHN0cm9rZTogJyMyQzJDMkMnLFxuICAgICAgICAgICAgICBmb250OiAnYm9sZCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgLy8gd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KClcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICksXG4gICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLjUsIDgsIDApLFxuICAgICAgfSksXG4gICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlJpZ2h0LFxuICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMSwgMC41LCAtOCwgMCksXG4gICAgICB9KSxcbiAgICAgIC8vIGZvdXIgbmFtZWQgcG9ydHMsIG9uZSBvbiBlYWNoIHNpZGU6XG5cbiAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSlcbiAgICApO1xuICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICB9XG5cbiAgLy8gUGxhbnQgQ2VsbFxuICBwbGFudENlbGxUZW1wbGF0ZShcbiAgICBpY29uLFxuICAgIHRpdGxlLFxuICAgIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHtcbiAgICAgIHc6IDI2MCxcbiAgICAgIGg6IEF0b0dvanNFZGl0b3JNb2RlbC5QTEFOVF9DRUxMX0hFSUdIVCxcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uR3JvdXAsXG4gICAgICAnU3BvdCcsXG4gICAgICB7XG4gICAgICAgIGxvY2F0aW9uU3BvdDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgIG1vdXNlT3ZlcjogZnVuY3Rpb24gKGUsIG9iaikge1xuICAgICAgICAgIC8vIHNlbGYuc2hvd1BvaW50KG9iaj8ucGFydD8ubG9jYXRpb24pO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1vdXNlRW50ZXI6IChlLCBvYmopID0+IHtcbiAgICAgICAgICAvLyBzZWxmLm9uSG92ZXJBbGVydC5lbWl0KHtcbiAgICAgICAgICAvLyAgICAgbGVmdDogZT8uWydXciddPy54ICsgOCxcbiAgICAgICAgICAvLyAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgLy8gICAgIG1lc3NhZ2VBbGVydDogKG9iaiBhcyBhbnkpLnBhcnQ/Lm9iPy5tZXNzYWdlQWxlcnQsXG4gICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgY29uc3Qgbm9kZSA9IG9iai5wYXJ0O1xuICAgICAgICAgIHNlbGYub25Ib3ZlckluZm9CdXR0b24uZW1pdCh7XG4gICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgbGV0IHNoYXBlID0gKG5vZGUgYXMgYW55KT8uZmluZE9iamVjdCgnU0hBUEVfS0VZJyk7IC8vIFRoYXkgJ1NIQVBFX0tFWScgYuG6sW5nIGtow7NhIGLhuqFuIMSR4bq3dCBjaG8gaMOsbmggU2hhcGVcbiAgICAgICAgICAvLyBkZWJ1Z2dlcjtcbiAgICAgICAgICBpZiAoc2hhcGUpIHtcbiAgICAgICAgICAgIHNoYXBlLnN0cm9rZSA9ICdibHVlJzsgLy8gVGhheSDEkeG7lWkgbcOgdSBzdHJva2UgdGjDoG5oIGJsdWVcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAgICAgLy8gc2VsZi5vbkhvdmVyQWxlcnQuZW1pdChudWxsKTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICBzZWxmLm9uQ2xpY2tDb21wb2VudC5lbWl0KHtcbiAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgbm9kZTogbm9kZSxcbiAgICAgICAgICAgICAgY29tcG9uZW50OiBvYmo/LmRhdGEsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgZG91YmxlQ2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGlmICghdGhpcy5faW5pdGlhbE9wdGlvbnM/LmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgIHRoaXMuaXNTaG93Tm9kZUluZm9cbiAgICAgICAgICAgICAgPyBzZWxmLm9uRG91YmxlQ2xpY2tOb2RlLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgbGVmdDogZT8uWydXciddPy54LFxuICAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLy8gVG9kb1xuXG4gICAgICAgIHNlbGVjdGlvbkNoYW5nZWQ6IChlKSA9PiB7XG4gICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uQWRvcm5tZW50LFxuICAgICAgICAgICAgICAnU3BvdCcsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBzaGFkb3dWaXNpYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHNoYWRvd0JsdXI6IDYsXG4gICAgICAgICAgICAgICAgc2hhZG93T2Zmc2V0OiBuZXcgZ28uUG9pbnQoMCwgMiksXG4gICAgICAgICAgICAgICAgc2hhZG93Q29sb3I6ICcjMDAwMDAwMjknLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgICAgIHsgd2lkdGg6IDE3MCB9LFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5TaGFwZSwge1xuICAgICAgICAgICAgICAgICAgZmlsbDogbnVsbCxcbiAgICAgICAgICAgICAgICAgIHN0cm9rZTogJ2RvZGdlcmJsdWUnLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDQsXG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IDMgfSlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgICB7IGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCwgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQm90dG9tIH0sXG4gICAgICAgICAgICAgICAgLy8gbW9yZVxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBY3Rpb25Hcm91cChbXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9OTFlfREVUQUlMUyxcbiAgICAgICAgICAgICAgICAgIC8vICAgRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgLy8gICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdEFjdGlvbicsICh4KSA9PiAheCksXG4gICAgICAgICAgICAgIClcblxuICAgICAgICAgICAgICAvLyAgIHRoaXMuJChcbiAgICAgICAgICAgICAgLy8gICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgIC8vICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICAgICAgLy8gICAgICAgeyBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wUmlnaHQsIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSB9LFxuICAgICAgICAgICAgICAvLyAgICAgICB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PTkxZX0RFVEFJTFNdKSxcbiAgICAgICAgICAgICAgLy8gICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgLy8gICAgICAgICAgIHJldHVybiB4Py5pc09ubHlEZXRhaWxzICYmICF4Py5pc05vdEFjdGlvbiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgLy8gICAgICAgfSksXG4gICAgICAgICAgICAgIC8vICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICksXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHsgd2lkdGg6IHNpemUudywgaGVpZ2h0OiBzaXplLmggfSxcbiAgICAgICAgLy8gdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgLy8gICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgIC8vICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAvLyAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgIC8vIH0pLFxuICAgICAgICAvLyB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSwgdmlzaWJsZTogZmFsc2UgfSksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAge1xuICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUwLCAwLCA1MCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgICAgICBzdHJva2VEYXNoQXJyYXk6IFs1LCA1XSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB0aXRsZSwge1xuICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAwLCAxMCwgMCksXG4gICAgICAgICAgICAgIGRlc2lyZWRTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgMTUpLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjNDQ0NDQ0JyxcbiAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICB0ZXh0OiB0aXRsZSxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAgIGljb24sXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICBkZXNpcmVkU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIHNpemUuaCAtIDY1KSxcbiAgICAgICAgICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKFxuICAgICAgICAgICAgICAgICdzb3VyY2UnLFxuICAgICAgICAgICAgICAgICdwYXRoSW1hZ2UnLFxuICAgICAgICAgICAgICAgICh4KSA9PlxuICAgICAgICAgICAgICAgICAgeCA/P1xuICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLk5PREVfVEVNUExBVEVTW1xuICAgICAgICAgICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuUExBTlRfQ0VMTFxuICAgICAgICAgICAgICAgICAgXS5pY29uXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMTAsIDAsIDMsIDApLFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRlc2lyZWRTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgMTUpLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogJyMyQzJDMkMnLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgLy8gd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGdvLlRleHRCbG9jay5PdmVyZmxvd0VsbGlwc2lzLFxuICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSxcblxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMC41LCA4LCAwKSxcbiAgICAgIH0pLFxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5SaWdodCxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDEsIDAuNSwgLTgsIDApLFxuICAgICAgfSlcblxuICAgICAgLy8gdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgIC8vIHRoaXMubWFrZVBvcnQoJ0wnLCBnby5TcG90LkxlZnQsIGdvLlNwb3QuTGVmdFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgIC8vIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgLy8gdGhpcy5tYWtlUG9ydCgnQicsIGdvLlNwb3QuQm90dG9tLCBnby5TcG90LkJvdHRvbVNpZGUsIHRydWUsIGZhbHNlKSxcbiAgICApO1xuICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICB9XG5cbiAgbWFrZUVudGl0eVdpdGhkcmF3T3JEaXNjaGFyZ2UoXG4gICAgaWNvbixcbiAgICB0aXRsZSxcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7XG4gICAgICB3OiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICAgIGg6IEF0b0dvanNFZGl0b3JNb2RlbC5HUklEX1NJWkUgKiA1LFxuICAgIH1cbiAgKSB7XG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XG4gICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICBtb3VzZU92ZXI6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgc2VsZi5vbkNsaWNrQ29tcG9lbnQuZW1pdCh7XG4gICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgICAgICAgIGNvbXBvbmVudDogb2JqPy5kYXRhLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgIGlmICghZS5pc1NlbGVjdGVkICYmIGU/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdGhpcy4kKFxuICAgICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdBdXRvJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsIHtcbiAgICAgICAgICAgICAgICAgIGZpbGw6IG51bGwsXG4gICAgICAgICAgICAgICAgICBzdHJva2U6ICdkb2RnZXJibHVlJyxcbiAgICAgICAgICAgICAgICAgIHN0cm9rZVdpZHRoOiA0LFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiAzIH0pXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAgICAgICAgICAgeyBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wUmlnaHQsIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSB9LFxuICAgICAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVBY3Rpb25Hcm91cChbXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuUkVOQU1FLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRFVEFJTFMsXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuT1VURkxPVyxcbiAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERUxFVEUsXG4gICAgICAgICAgICAgICAgXSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICd2aXNpYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbW92YWJsZScsICdtb3ZhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcblxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgZmlsbDogJ3doaXRlJyxcbiAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSU5LX1dBVEVSLFxuICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgLy8gdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgICAgICAvLyAgICAgcm93OiAwLFxuICAgICAgICAgIC8vICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgIC8vICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgICAgICAvLyAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgLy8gICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgLy8gICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgLy8gfSksXG4gICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgIHJvdzogMSxcbiAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICBkZXNpcmVkU2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIHNpemUuaCAtIDUwKSxcbiAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHJvdzogMixcbiAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDEwLCAwLCAzLCAwKSxcbiAgICAgICAgICAgICAgZWRpdGFibGU6IHRydWUsXG4gICAgICAgICAgICAgIGRlc2lyZWRTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgMTUpLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjMDAwRDQyJyxcbiAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgIC8vIHdyYXA6IGdvLlRleHRCbG9jay5Ob25lLFxuICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpLm1ha2VUd29XYXkoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAvLyB7XG4gICAgICAgICAgICAvLyAgICAgLy8gZGVmaW5lIGEgdG9vbHRpcCBmb3IgZWFjaCBub2RlIHRoYXQgZGlzcGxheXMgdGhlIGNvbG9yIGFzIHRleHRcbiAgICAgICAgICAgIC8vICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAvLyAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgeyBtYXJnaW46IDQgfSwgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpKSxcbiAgICAgICAgICAgIC8vICAgICApLCAvLyBlbmQgb2YgQWRvcm5tZW50XG4gICAgICAgICAgICAvLyB9LFxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAuNSwgOCwgMCksXG4gICAgICB9KSxcbiAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgxLCAwLjUsIC04LCAwKSxcbiAgICAgIH0pLFxuICAgICAgLy8gZm91ciBuYW1lZCBwb3J0cywgb25lIG9uIGVhY2ggc2lkZTpcblxuICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgIHRoaXMubWFrZVBvcnQoJ0wnLCBnby5TcG90LkxlZnQsIGdvLlNwb3QuTGVmdFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgdGhpcy5tYWtlUG9ydCgnQicsIGdvLlNwb3QuQm90dG9tLCBnby5TcG90LkJvdHRvbVNpZGUsIHRydWUsIGZhbHNlKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gIH1cblxuICBlZGl0VGV4dEdyb3VwWm9uZShlLCBidXR0b24pIHtcbiAgICBjb25zdCBub2RlR3JvdXAgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICBjb25zdCBkaWFncmFtID0gbm9kZUdyb3VwLmRpYWdyYW07XG4gICAgZS5kaWFncmFtLmNvbW1hbmRIYW5kbGVyLmVkaXRUZXh0QmxvY2sobm9kZUdyb3VwLmZpbmRPYmplY3QoJ1RFWFRCTE9DSycpKTtcbiAgfVxuXG4gIGVkaXRUZXh0KGUsIGJ1dHRvbikge1xuICAgIGNvbnN0IG5vZGUgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICBlLmRpYWdyYW0uY29tbWFuZEhhbmRsZXIuZWRpdFRleHRCbG9jayhub2RlLmZpbmRPYmplY3QoJ1RFWFRCTE9DSycpKTtcbiAgfVxuXG4gIGFzeW5jIGRyYWdOZXdOb2RlKGUsIGJ1dHRvbikge1xuICAgIGNvbnN0IHRvb2wgPSBlLmRpYWdyYW0udG9vbE1hbmFnZXIuZHJhZ2dpbmdUb29sO1xuXG4gICAgaWYgKHRvb2wuaXNCZXlvbmREcmFnU2l6ZSgpKSB7XG4gICAgICBjb25zdCBkYXRhID0gYnV0dG9uLl9kcmFnRGF0YTtcbiAgICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgICAgZS5kaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ2J1dHRvbiBkcmFnJyk7IC8vIHNlZSBkb0RlYWN0aXZhdGUsIGJlbG93XG5cbiAgICAgIGNvbnN0IGZyb21ub2RlID0gYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQ7XG4gICAgICBjb25zdCBkaWFncmFtID0gZnJvbW5vZGUuZGlhZ3JhbTtcbiAgICAgIGNvbnN0IG1vZGVsID0gZGlhZ3JhbS5tb2RlbDtcbiAgICAgIGNvbnN0IG5vZGVkYXRhID0ge1xuICAgICAgICAuLi5tb2RlbC5jb3B5Tm9kZURhdGEoZGF0YSksXG4gICAgICAgIGtleTogVXRpbHNTZXJ2aWNlLmdlbmVyYXRlVVVJRCgpLFxuICAgICAgfTtcbiAgICAgIG1vZGVsLmFkZE5vZGVEYXRhKG5vZGVkYXRhKTtcbiAgICAgIGNvbnN0IG5ld25vZGUgPSBkaWFncmFtLmZpbmROb2RlRm9yRGF0YShub2RlZGF0YSk7XG4gICAgICBjb25zdCBsaW5rZGF0YSA9IG1vZGVsLmNvcHlMaW5rRGF0YSh7fSk7XG4gICAgICBtb2RlbC5zZXRGcm9tS2V5Rm9yTGlua0RhdGEoXG4gICAgICAgIGxpbmtkYXRhLFxuICAgICAgICBtb2RlbC5nZXRLZXlGb3JOb2RlRGF0YShmcm9tbm9kZS5kYXRhKVxuICAgICAgKTtcbiAgICAgIG1vZGVsLnNldFRvS2V5Rm9yTGlua0RhdGEoXG4gICAgICAgIGxpbmtkYXRhLFxuICAgICAgICBtb2RlbC5nZXRLZXlGb3JOb2RlRGF0YShuZXdub2RlLmRhdGEpXG4gICAgICApO1xuICAgICAgbW9kZWwuYWRkTGlua0RhdGEobGlua2RhdGEpO1xuICAgICAgZGlhZ3JhbS5zZWxlY3QobmV3bm9kZSk7XG4gICAgICAvLyAgIHRoaXMuY3JlYXRlTm9kZUFuZExpbmsoZGF0YSwgYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQpO1xuXG4gICAgICBuZXdub2RlLmxvY2F0aW9uID0gZS5kaWFncmFtLmxhc3RJbnB1dC5kb2N1bWVudFBvaW50O1xuICAgICAgLy8gZG9uJ3QgY29tbWl0VHJhbnNhY3Rpb24gaGVyZSwgYnV0IGluIHRvb2wuZG9EZWFjdGl2YXRlLCBhZnRlciBkcmFnIG9wZXJhdGlvbiBmaW5pc2hlZFxuICAgICAgLy8gc2V0IHRvb2wuY3VycmVudFBhcnQgdG8gYSBzZWxlY3RlZCBtb3ZhYmxlIFBhcnQgYW5kIHRoZW4gYWN0aXZhdGUgdGhlIERyYWdnaW5nVG9vbFxuICAgICAgdG9vbC5jdXJyZW50UGFydCA9IG5ld25vZGU7XG4gICAgICBlLmRpYWdyYW0uY3VycmVudFRvb2wgPSB0b29sO1xuICAgICAgdG9vbC5kb0FjdGl2YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgYWRkSXRlbU9uR3JvdXBab25lKGUsIGJ1dHRvbikge1xuICAgIGNvbnN0IGRhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIGUuZGlhZ3JhbS5zdGFydFRyYW5zYWN0aW9uKCdBZGQgSXRlbSBPbiBHcm91cCBab25lJyk7XG4gICAgY29uc3QgZnJvbW5vZGUgPSBidXR0b24ucGFydC5hZG9ybmVkUGFydDtcbiAgICBjb25zdCBkcmFnRGF0YSA9IGJ1dHRvbi5fZHJhZ0RhdGE7XG4gICAgY29uc3QgZGlhZ3JhbSA9IGZyb21ub2RlLmRpYWdyYW07XG4gICAgY29uc3QgbW9kZWwgPSBkaWFncmFtLm1vZGVsO1xuICAgIGNvbnN0IG5vZGVkYXRhID0gbW9kZWwuY29weU5vZGVEYXRhKGRyYWdEYXRhKTtcbiAgICBtb2RlbC5hZGROb2RlRGF0YSh7XG4gICAgICAuLi5ub2RlZGF0YSxcbiAgICAgIHR5cGU6ICdTdWJTeXN0ZW0nLFxuICAgICAgbmFtZTogJ1tUaXRsZS4uLl0nLFxuICAgICAgbmFtZUl0ZW06ICdbTmFtZS4uLl0nLFxuICAgICAgZ3JvdXA6IGZyb21ub2RlPy5vYj8ua2V5LFxuICAgIH0pO1xuICAgIGUuZGlhZ3JhbS5jb21taXRUcmFuc2FjdGlvbignQWRkIEl0ZW0gT24gR3JvdXAgWm9uZScpO1xuICAgIC8vIGNvbnN0IG5ld25vZGUgPSBkaWFncmFtLmZpbmROb2RlRm9yRGF0YShub2RlZGF0YSk7XG4gICAgLy8gY29uc3QgbGlua2RhdGEgPSBtb2RlbC5jb3B5TGlua0RhdGEoe30pO1xuICAgIC8vIG1vZGVsLnNldEZyb21LZXlGb3JMaW5rRGF0YShsaW5rZGF0YSwgbW9kZWwuZ2V0S2V5Rm9yTm9kZURhdGEoZnJvbW5vZGUuZGF0YSkpO1xuICAgIC8vIG1vZGVsLnNldFRvS2V5Rm9yTGlua0RhdGEobGlua2RhdGEsIG1vZGVsLmdldEtleUZvck5vZGVEYXRhKG5ld25vZGUuZGF0YSkpO1xuICAgIC8vIG1vZGVsLmFkZExpbmtEYXRhKGxpbmtkYXRhKTtcbiAgICAvLyBkaWFncmFtLnNlbGVjdChuZXdub2RlKTtcblxuICAgIC8vIG5ld25vZGUubG9jYXRpb24gPSBuZXcgZ28uUG9pbnQoZnJvbW5vZGUubG9jYXRpb24ueCArIDIwMCwgZnJvbW5vZGUubG9jYXRpb24ueSk7XG4gICAgLy8gZS5kaWFncmFtLmNvbW1pdFRyYW5zYWN0aW9uKCdDcmVhdGUgTm9kZSBhbmQgTGluaycpO1xuICB9XG5cbiAgZ2VuZXJhdGVBY3Rpb25Hcm91cChhY3Rpb25zOiBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlNbXSkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIHJldHVybiB0aGlzLiQoXG4gICAgICAnQnV0dG9uJyxcbiAgICAgIHtcbiAgICAgICAgY2xpY2s6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICBzZWxmLm9wZW5BY3Rpb25NZW51KCk7XG4gICAgICAgICAgY29uc3QgZmlsdGVyZWRBY3Rpb25zID0gXy5maWx0ZXIoXG4gICAgICAgICAgICBvYmoucGFydD8uWydvYiddPy5hY3Rpb25zID8/IGFjdGlvbnMsXG4gICAgICAgICAgICAoYWN0aW9uKSA9PiB7XG4gICAgICAgICAgICAgIC8vIEZpbHRlciBJbnNpZ2h0IGJ1dHRvblxuICAgICAgICAgICAgICBpZiAoYWN0aW9uID09PSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuSU5TSUdIVCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAhIW9iai5wYXJ0Py5bJ29iJ10/LmlkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3Rpb24gPT09IEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5SRU5BTUUgJiZcbiAgICAgICAgICAgICAgICBvYmoucGFydD8uWydvYiddPy50eXBlICE9PVxuICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlRFWFRfTk9ERSAmJlxuICAgICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5UWVBFX0NPTVBPTkVOVF9XQVRFUj8uaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICBvYmoucGFydD8uWydvYiddPy5zeXN0ZW1UeXBlXG4gICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgIG9iai5wYXJ0Py5bJ29iJ10/LnRvcG9sb2d5VHlwZSAhPT1cbiAgICAgICAgICAgICAgICAgIEFUT19FQ09NUE9ORU5UX1BMQU5UX1RZUEUuV0FURVIgJiZcbiAgICAgICAgICAgICAgICBvYmoucGFydD8uWydvYiddPy50b3BvbG9neVR5cGUgIT09XG4gICAgICAgICAgICAgICAgICBBVE9fRUNPTVBPTkVOVF9QTEFOVF9UWVBFLldBVEVSX1BMQU5UX0NFTExcbiAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3Rpb24gPT09IEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PVVRGTE9XICYmXG4gICAgICAgICAgICAgICAgc2VsZi5wbGFudFNhdHVzID09PSBBVE9fRVBsYW50VHlwZS5CQVNJQ19QTEFOVCAmJlxuICAgICAgICAgICAgICAgIG9iai5wYXJ0Py5kYXRhPy50eXBlID09PVxuICAgICAgICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlRFWFRfTk9ERVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgKS5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgQVRPX0VDT01QT05FTlRfUExBTlRfVFlQRS5TVEVBTSA9PT1cbiAgICAgICAgICAgICAgICBvYmoucGFydD8uWydvYiddPy50b3BvbG9neVR5cGUgJiZcbiAgICAgICAgICAgICAgZSA9PT0gQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLklOU0lHSFRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICByZXR1cm4gQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkRBVEFfTUFQUElORztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZSA9PT0gQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMUyAmJlxuICAgICAgICAgICAgICBvYmo/LnBhcnQ/Llsnb2InXT8uc3lzdGVtVHlwZSA9PT1cbiAgICAgICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9UWVBFUy5DT09MSU5HX1RPV0VSXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgcmV0dXJuIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5GTE9XX0RFVEFJTFNfQU5EX1dJWkFSRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNlbGYuYWN0aW9ucyA9IGZpbHRlcmVkQWN0aW9ucy5tYXAoKGFjdGlvbikgPT4ge1xuICAgICAgICAgICAgbGV0IG9uQ2xpY2tGbiA9ICgpID0+IHt9O1xuICAgICAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuSU5TSUdIVDpcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREFUQV9NQVBQSU5HOlxuICAgICAgICAgICAgICAgIG9uQ2xpY2tGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNlbGYub25PcGVuSW5zaWdodE1hcHBpbmcuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG9iai5wYXJ0LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVUQUlMUzpcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuRkxPV19ERVRBSUxTOlxuICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5GTE9XX0RFVEFJTFNfQU5EX1dJWkFSRDpcbiAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkRldGFpbC5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgbm9kZTogb2JqLnBhcnQsXG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PTkxZX0RFVEFJTFM6XG4gICAgICAgICAgICAgICAgb25DbGlja0ZuID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgc2VsZi5vbk9wZW5EZXRhaWwuZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG9iai5wYXJ0LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuQVNTRVRfUEFSQU1FVEVSUzpcbiAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkFzc2V0UGFyYW1ldGVyLmVtaXQoe1xuICAgICAgICAgICAgICAgICAgICBub2RlOiBvYmoucGFydCxcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRTpcbiAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG9iai5wYXJ0Py5kYXRhPy50eXBlID09PVxuICAgICAgICAgICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFXG4gICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5vblJlbmFtZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggLSA1MCxcbiAgICAgICAgICAgICAgICAgICAgICB0b3A6IGU/LlsnV3InXT8ueSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5vYmoucGFydD8uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIExheW91dFNlcnZpY2Uuc2V0VG9vbFRpcENvbXBvbmVudERhdGFTdGF0aWMoe1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29tcG9uZW50OiBSZW5hbWVCb3hDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgbGVmdDogZT8uWydXciddPy54IC0gNTAsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgLi4ub2JqLnBhcnQ/LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAvLyB9KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuZWRpdFRleHQoZSwgb2JqKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5PVVRGTE9XOlxuICAgICAgICAgICAgICAgIG9uQ2xpY2tGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuY2xpY2tOZXdOb2RlKFxuICAgICAgICAgICAgICAgICAgICBlLFxuICAgICAgICAgICAgICAgICAgICBfLm1lcmdlKG9iaiwge1xuICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbk1vdmU6IHNlbGYuZHJhZ05ld05vZGUsIC8vIGRlZmluZWQgYmVsb3csIHRvIHN1cHBvcnQgZHJhZ2dpbmcgZnJvbSB0aGUgYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgX2RyYWdEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi57XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5URVhUX05PREUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5BQ1RJT05fUklHSFRfTUVOVV9HUk9VUC5EQVRBX0JPWFxuICAgICAgICAgICAgICAgICAgICAgICAgICB9XyR7bW9tZW50KCkudmFsdWVPZigpfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5zZWxmLnNldFByb0ZPck5ld05vZGUoc2VsZiksXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFOlxuICAgICAgICAgICAgICAgIG9uQ2xpY2tGbiA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgIHNlbGYuZGVsZXRlTm9kZShlKTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5DSEFOR0VfSUNPTjpcbiAgICAgICAgICAgICAgICBvbkNsaWNrRm4gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uT3BlbkNoYW5nZUljb24uZW1pdCh7XG4gICAgICAgICAgICAgICAgICAgIG5vZGU6IG9iai5wYXJ0LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgIC4uLkF0b0RlZmF1bHRHb2pzRWRpdG9yLkFDVElPTlNbYWN0aW9uXSxcbiAgICAgICAgICAgICAgb25DbGljazogKCkgPT4ge1xuICAgICAgICAgICAgICAgIG9uQ2xpY2tGbigpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgJ0J1dHRvbkJvcmRlci5zdHJva2VXaWR0aCc6IDAsXG4gICAgICAgICdCdXR0b25Cb3JkZXIuZmlsbCc6ICd3aGl0ZScsXG4gICAgICB9LFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnaXNOb3REcmFnTmV3Tm9kZScsICh4KSA9PiAheCksXG4gICAgICAvLyBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdERlbGV0ZScsICh4KSA9PiAheCksXG4gICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICdpc05vdEFjdGlvbicsICh4KSA9PiAheCksXG4gICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgdGV4dDogJ1xcdWU0ODknLFxuICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBhc3luYyBzZXRQcm9GT3JOZXdOb2RlKHNlbGYpIHtcbiAgICBpZiAoc2VsZi5wbGFudFNhdHVzID09PSBBVE9fRVBsYW50VHlwZS5CQVNJQ19QTEFOVCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbW92YWJsZTogZmFsc2UsXG4gICAgICAgIGlzTm90QWxsb3dDb25uZWN0OiB0cnVlLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgYXN5bmMgY2xpY2tOZXdOb2RlKGUsIGJ1dHRvbikge1xuICAgIGNvbnN0IGRhdGEgPSBidXR0b24uX2RyYWdEYXRhO1xuICAgIGlmICghZGF0YSkgcmV0dXJuO1xuICAgIGUuZGlhZ3JhbS5zdGFydFRyYW5zYWN0aW9uKCdDcmVhdGUgTm9kZSBhbmQgTGluaycpO1xuICAgIGNvbnN0IGZyb21ub2RlID0gYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQ7XG5cbiAgICAvLyB0aGlzLmNyZWF0ZU5vZGVBbmRMaW5rKGJ1dHRvbi5fZHJhZ0RhdGEsIGZyb21ub2RlKTtcbiAgICBjb25zdCBkcmFnRGF0YSA9IGJ1dHRvbi5fZHJhZ0RhdGE7XG4gICAgY29uc3QgZGlhZ3JhbSA9IGZyb21ub2RlLmRpYWdyYW07XG4gICAgY29uc3QgbW9kZWwgPSBkaWFncmFtLm1vZGVsO1xuICAgIGNvbnN0IG5vZGVkYXRhID0ge1xuICAgICAgLi4ubW9kZWwuY29weU5vZGVEYXRhKGRyYWdEYXRhKSxcbiAgICAgIGtleTogVXRpbHNTZXJ2aWNlLmdlbmVyYXRlVVVJRCgpLFxuICAgIH07XG4gICAgbW9kZWwuYWRkTm9kZURhdGEoe1xuICAgICAgLi4ubm9kZWRhdGEsXG4gICAgICBpc0VkaXRhYmxlOiB0cnVlLFxuICAgICAgc2hvcnRlbmVkTnVtYmVyOiAwLFxuICAgICAgaXNGb3JtYXQ6IGZhbHNlLFxuICAgICAgZGF0YUNvbGxlY3Rpb25NZXRob2Q6IEF0b0dvanNFZGl0b3JNb2RlbC5EQVRBX0NPTExFQ1RJT05fTUVUSE9ELk1BTlVBTCxcbiAgICAgIGNvbG9yOlxuICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuQ09MT1JfQ09MTEVDVElPTl9NRVRIT0RbXG4gICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkRBVEFfQ09MTEVDVElPTl9NRVRIT0QuTUFOVUFMXG4gICAgICAgIF0uY29sb3IsXG4gICAgICBncm91cDogZnJvbW5vZGU/Lm9iPy5ncm91cCxcbiAgICAgIHZhbHVlOiAwLFxuICAgIH0pO1xuICAgIGNvbnN0IG5ld25vZGUgPSBkaWFncmFtLmZpbmROb2RlRm9yRGF0YShub2RlZGF0YSk7XG5cbiAgICBjb25zdCBsaW5rZGF0YSA9IG1vZGVsLmNvcHlMaW5rRGF0YSh7fSk7XG4gICAgbW9kZWwuc2V0RnJvbUtleUZvckxpbmtEYXRhKFxuICAgICAgbGlua2RhdGEsXG4gICAgICBtb2RlbC5nZXRLZXlGb3JOb2RlRGF0YShmcm9tbm9kZS5kYXRhKVxuICAgICk7XG4gICAgbW9kZWwuc2V0VG9LZXlGb3JMaW5rRGF0YShsaW5rZGF0YSwgbW9kZWwuZ2V0S2V5Rm9yTm9kZURhdGEobmV3bm9kZS5kYXRhKSk7XG4gICAgbW9kZWwuYWRkTGlua0RhdGEobGlua2RhdGEpO1xuICAgIGRpYWdyYW0uc2VsZWN0KG5ld25vZGUpO1xuICAgIGlmIChub2RlZGF0YT8ubW92YWJsZSAhPT0gdW5kZWZpbmVkICYmIG5vZGVkYXRhPy5tb3ZhYmxlICE9PSBudWxsKSB7XG4gICAgICBuZXdub2RlLm1vdmFibGUgPSBub2RlZGF0YT8ubW92YWJsZTtcbiAgICB9XG5cbiAgICBuZXdub2RlLmxvY2F0aW9uID0gbmV3IGdvLlBvaW50KFxuICAgICAgZnJvbW5vZGUubG9jYXRpb24ueCArIDE2MCxcbiAgICAgIGZyb21ub2RlLmxvY2F0aW9uLnkgK1xuICAgICAgICB0aGlzLmZpbmRMb2NZRnJvbW5vZGUoZnJvbW5vZGUpICogQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVRcbiAgICApO1xuICAgIGUuZGlhZ3JhbS5jb21taXRUcmFuc2FjdGlvbignQ3JlYXRlIE5vZGUgYW5kIExpbmsnKTtcbiAgfVxuXG4gIGZpbmRMb2NZRnJvbW5vZGUoZnJvbW5vZGUpIHtcbiAgICAvLyBGaW5kIGxvY2F0aW9uIGF1dG8gcmlnaHRcbiAgICBjb25zdCBsb2NZRnJvbW5vZGUgPSBmcm9tbm9kZS5kYXRhPy5sb2M/LnNwbGl0KCcgJyk/LlsxXTtcbiAgICBjb25zdCBsb2NZQWxyZWFkeUV4aXN0OiBhbnkgPSBbXTtcbiAgICBmcm9tbm9kZS5maW5kTGlua3NPdXRPZigpLmVhY2goZnVuY3Rpb24gKGxpbmspIHtcbiAgICAgIGNvbnN0IHRhcmdldE5vZGUgPSBsaW5rLnRvTm9kZTtcbiAgICAgIGlmICh0YXJnZXROb2RlKSB7XG4gICAgICAgIGxvY1lBbHJlYWR5RXhpc3QucHVzaChcbiAgICAgICAgICB0YXJnZXROb2RlLmRhdGE/LmxvYz8uc3BsaXQoJyAnKT8uWzFdIC0gbG9jWUZyb21ub2RlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgaSA9IDA7XG4gICAgd2hpbGUgKHRoaXMuaXNFbXB0eVlMb2MobG9jWUFscmVhZHlFeGlzdCwgaSkgPT09IG51bGwgJiYgaSA8IDEwMCkge1xuICAgICAgaSsrO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5pc0VtcHR5WUxvYyhsb2NZQWxyZWFkeUV4aXN0LCBpKTtcbiAgfVxuXG4gIGlzRW1wdHlZTG9jKGxvY1lBbHJlYWR5RXhpc3QsIGkpIHtcbiAgICBpZiAoXG4gICAgICAhXy5zb21lKFxuICAgICAgICBsb2NZQWxyZWFkeUV4aXN0LFxuICAgICAgICAoeCkgPT5cbiAgICAgICAgICB4IDxcbiAgICAgICAgICAgIGkgKiBBdG9EZWZhdWx0R29qc0VkaXRvci5ESVNUQU5DRV8yX09VVFBVVCArXG4gICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUIC8gMiAmJlxuICAgICAgICAgIHggPlxuICAgICAgICAgICAgaSAqIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUIC1cbiAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQgLyAyXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIV8uc29tZShcbiAgICAgICAgbG9jWUFscmVhZHlFeGlzdCxcbiAgICAgICAgKHgpID0+XG4gICAgICAgICAgeCA8XG4gICAgICAgICAgICAtaSAqIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUICtcbiAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQgLyAyICYmXG4gICAgICAgICAgeCA+XG4gICAgICAgICAgICAtaSAqIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkRJU1RBTkNFXzJfT1VUUFVUIC1cbiAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRElTVEFOQ0VfMl9PVVRQVVQgLyAyXG4gICAgICApXG4gICAgKSB7XG4gICAgICByZXR1cm4gLWk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY3JlYXRlTmV3Tm9kZShuZXdub2RlKSB7XG4gICAgdGhpcy5hZGRUZW1wbGF0ZShuZXdub2RlKTtcbiAgICB0aGlzLm15RGlhZ3JhbS5zdGFydFRyYW5zYWN0aW9uKCdhZGQgZ3JvdXAgbm9kZScpO1xuICAgIHRoaXMubXlEaWFncmFtLm1vZGVsLmFkZE5vZGVEYXRhKG5ld25vZGUpO1xuICAgIHRoaXMubXlEaWFncmFtLmNvbW1pdFRyYW5zYWN0aW9uKCdhZGQgZ3JvdXAgbm9kZScpO1xuICB9XG5cbiAgZGVsZXRlTm9kZShlKSB7XG4gICAgZS5kaWFncmFtLnN0YXJ0VHJhbnNhY3Rpb24oJ0RlbGV0ZSBncm91cCBub2RlJyk7XG4gICAgZS5kaWFncmFtLnJlbW92ZVBhcnRzKGUuZGlhZ3JhbS5zZWxlY3Rpb24pO1xuICAgIGUuZGlhZ3JhbS5jb21taXRUcmFuc2FjdGlvbignRGVsZXRlIGdyb3VwIG5vZGUnKTtcbiAgfVxuXG4gIGRlbGV0ZU5vZGVPbkRpYWdyYW0oZSkge1xuICAgIGUuc3RhcnRUcmFuc2FjdGlvbignRGVsZXRlIGdyb3VwIG5vZGUnKTtcbiAgICBlLnJlbW92ZVBhcnRzKGUuc2VsZWN0aW9uKTtcbiAgICBlLmNvbW1pdFRyYW5zYWN0aW9uKCdEZWxldGUgZ3JvdXAgbm9kZScpO1xuICB9XG5cbiAgaW5zaWdodE5vZGUoZSkge31cblxuICBkcmF3TGluayhlLCBidXR0b24pIHtcbiAgICBjb25zdCBub2RlID0gYnV0dG9uLnBhcnQuYWRvcm5lZFBhcnQ7XG4gICAgY29uc3QgdG9vbCA9IGUuZGlhZ3JhbS50b29sTWFuYWdlci5saW5raW5nVG9vbDtcbiAgICB0b29sLnN0YXJ0T2JqZWN0ID0gbm9kZS5wb3J0O1xuICAgIGUuZGlhZ3JhbS5jdXJyZW50VG9vbCA9IHRvb2w7XG4gICAgdG9vbC5kb0FjdGl2YXRlKCk7XG4gIH1cblxuICBtYWtlUG9ydEdyb3VwKG5hbWUsIGFsaWduLCBzcG90LCBvdXRwdXQsIGlucHV0KSB7XG4gICAgY29uc3QgaG9yaXpvbnRhbCA9XG4gICAgICBhbGlnbi5lcXVhbHMoZ28uU3BvdC5Ub3ApIHx8IGFsaWduLmVxdWFscyhnby5TcG90LkJvdHRvbSk7XG4gICAgcmV0dXJuIHRoaXMuJChcbiAgICAgIGdvLlBhbmVsLFxuICAgICAgJ1RhYmxlJyxcbiAgICAgIHtcbiAgICAgICAgYmFja2dyb3VuZDogJyM5MTlDQTUnLFxuICAgICAgICB3aWR0aDogNDAsXG4gICAgICAgIGhlaWdodDogNDAsXG4gICAgICAgIGFsaWdubWVudDogYWxpZ24sXG4gICAgICAgIHN0cmV0Y2g6IGhvcml6b250YWxcbiAgICAgICAgICA/IGdvLkdyYXBoT2JqZWN0Lkhvcml6b250YWxcbiAgICAgICAgICA6IGdvLkdyYXBoT2JqZWN0LlZlcnRpY2FsLFxuICAgICAgICBwb3J0SWQ6IG5hbWUsXG4gICAgICAgIGZyb21TcG90OiBzcG90LFxuICAgICAgICBmcm9tTGlua2FibGU6IG91dHB1dCxcbiAgICAgICAgdG9TcG90OiBzcG90LFxuICAgICAgICB0b0xpbmthYmxlOiBpbnB1dCxcbiAgICAgICAgY3Vyc29yOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ID8gJycgOiAncG9pbnRlcicsXG4gICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkNlbnRlciwgLy8gdOG6rXAgdHJ1bmcgdsOgbyB0cnVuZyB0w6JtIGPhu6dhIFBhbmVsXG4gICAgICAgIC8vIG1vdXNlRW50ZXI6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgLy8gICAgID8gbnVsbFxuICAgICAgICAvLyAgICAgOiAoZSwgcGFuZWwpID0+IHtcbiAgICAgICAgLy8gICAgICAgICAgIGNvbnN0IHRleHRCbG9jayA9IChwYW5lbCBhcyBhbnkpPy5maW5kT2JqZWN0KCd0ZXh0QmxvY2snKSBhcyBnby5UZXh0QmxvY2sgfCBudWxsO1xuICAgICAgICAvLyAgICAgICAgICAgaWYgKHRleHRCbG9jaykge1xuICAgICAgICAvLyAgICAgICAgICAgICAgIC8vICYmIG91dHB1dFxuICAgICAgICAvLyAgICAgICAgICAgICAgIHRleHRCbG9jay52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgLy8gICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgY2FzZSAnQic6XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNhc2UgJ1InOiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gJ3JnYigyNDMgMTQ0IDE3MSknO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiB7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gJ3JnYigxMDMsMTUxLDIwNyknO1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIC8vICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9ICdyZ2IoMjQzIDE0NCAxNzEpJztcbiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAvLyAgICAgICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgfSxcblxuICAgICAgICAvLyBtb3VzZUxlYXZlOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgIC8vICAgICA/IG51bGxcbiAgICAgICAgLy8gICAgIDogKGUsIHBhbmVsKSA9PiB7XG4gICAgICAgIC8vICAgICAgICAgICBjb25zdCB0ZXh0QmxvY2sgPSAocGFuZWwgYXMgYW55KS5maW5kT2JqZWN0KCd0ZXh0QmxvY2snKSBhcyBnby5UZXh0QmxvY2sgfCBudWxsO1xuICAgICAgICAvLyAgICAgICAgICAgaWYgKHRleHRCbG9jaykge1xuICAgICAgICAvLyAgICAgICAgICAgICAgIHRleHRCbG9jay52aXNpYmxlID0gZmFsc2U7IC8vIOG6qG4gVGV4dEJsb2NrIGtoaSBy4budaSBraOG7j2kgUGFuZWxcbiAgICAgICAgLy8gICAgICAgICAgIH1cbiAgICAgICAgLy8gICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAndHJhbnNwYXJlbnQnO1xuICAgICAgICAvLyAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnRWxsaXBzZScsIHtcbiAgICAgICAgZmlsbDogJ3doaXRlJywgLy8gQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgY2lyY2xlXG4gICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICBzdHJva2U6ICcjOTE5Q0E1JywgLy8gQm9yZGVyIGNvbG9yIG9mIHRoZSBjaXJjbGVcbiAgICAgICAgd2lkdGg6IDQwLCAvLyBNYXRjaCB0aGUgcGFuZWwncyB3aWR0aFxuICAgICAgICBoZWlnaHQ6IDQwLCAvLyBNYXRjaCB0aGUgcGFuZWwncyBoZWlnaHRcbiAgICAgIH0pXG5cbiAgICAgIC8vIHRoaXMuJChcbiAgICAgIC8vICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAvLyAgICAge1xuICAgICAgLy8gICAgICAgICBuYW1lOiAndGV4dEJsb2NrJyxcbiAgICAgIC8vICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgLy8gICAgICAgICB0ZXh0OiAnXFx1ZjBkYScsIC8vIE3DoyBVbmljb2RlIHTGsMahbmcg4bupbmcgduG7m2kgZmEtY2FyZXQtbGVmdFxuICAgICAgLy8gICAgICAgICBmb250OiAnOTAwIDEycHggXCJGb250IEF3ZXNvbWUgNiBQcm9cIicsXG4gICAgICAvLyAgICAgICAgIHN0cm9rZTogJ3doaXRlJywgLy8gxJDhurd0IG3DoHUgY2jhu68gdGjDoG5oIG3DoHUgdHLhuq9uZ1xuICAgICAgLy8gICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgIC8vICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJywgKF8pID0+IHtcbiAgICAgIC8vICAgICAgICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAvLyAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgIC8vICAgICAgICAgICAgIGNhc2UgJ0InOiB7XG4gICAgICAvLyAgICAgICAgICAgICAgICAgcmV0dXJuICdcXHVmMGQ3JztcbiAgICAgIC8vICAgICAgICAgICAgIH1cbiAgICAgIC8vICAgICAgICAgICAgIGNhc2UgJ0wnOlxuICAgICAgLy8gICAgICAgICAgICAgY2FzZSAnUic6IHtcbiAgICAgIC8vICAgICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZGEnO1xuICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgLy8gICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgLy8gICAgICAgICAgICAgICAgIHJldHVybiAnXFx1ZjBkNyc7XG4gICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAvLyAgICAgICAgIH1cbiAgICAgIC8vICAgICB9KSxcbiAgICAgIC8vICksXG4gICAgKTtcbiAgfVxuXG4gIG1ha2VQb3J0KG5hbWUsIGFsaWduLCBzcG90LCBvdXRwdXQsIGlucHV0KSB7XG4gICAgLy8gaWYgKHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkpIHtcbiAgICAvLyAgICAgcmV0dXJuIHt9O1xuICAgIC8vIH1cbiAgICBjb25zdCBob3Jpem9udGFsID1cbiAgICAgIGFsaWduLmVxdWFscyhnby5TcG90LlRvcCkgfHwgYWxpZ24uZXF1YWxzKGdvLlNwb3QuQm90dG9tKTtcbiAgICAvLyBjb25zdCB2ZXJ0aWNhbCA9IGFsaWduLmVxdWFscyhnby5TcG90LkxlZnQpIHx8IGFsaWduLmVxdWFscyhnby5TcG90LlJpZ2h0KTtcbiAgICAvLyB0aGUgcG9ydCBpcyBiYXNpY2FsbHkganVzdCBhIHRyYW5zcGFyZW50IHJlY3RhbmdsZSB0aGF0IHN0cmV0Y2hlcyBhbG9uZyB0aGUgc2lkZSBvZiB0aGUgbm9kZSxcbiAgICAvLyBhbmQgYmVjb21lcyBjb2xvcmVkIHdoZW4gdGhlIG1vdXNlIHBhc3NlcyBvdmVyIGl0XG4gICAgcmV0dXJuIHRoaXMuJChcbiAgICAgIGdvLlBhbmVsLFxuICAgICAgJ1RhYmxlJyxcbiAgICAgIHtcbiAgICAgICAgYmFja2dyb3VuZDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgd2lkdGg6IGhvcml6b250YWwgPyBOYU4gOiA4LFxuICAgICAgICBoZWlnaHQ6ICFob3Jpem9udGFsID8gTmFOIDogOCxcbiAgICAgICAgYWxpZ25tZW50OiBhbGlnbixcbiAgICAgICAgc3RyZXRjaDogaG9yaXpvbnRhbFxuICAgICAgICAgID8gZ28uR3JhcGhPYmplY3QuSG9yaXpvbnRhbFxuICAgICAgICAgIDogZ28uR3JhcGhPYmplY3QuVmVydGljYWwsXG4gICAgICAgIHBvcnRJZDogbmFtZSxcbiAgICAgICAgZnJvbVNwb3Q6IHNwb3QsXG4gICAgICAgIGZyb21MaW5rYWJsZTogb3V0cHV0LFxuICAgICAgICB0b1Nwb3Q6IHNwb3QsXG4gICAgICAgIHRvTGlua2FibGU6IGlucHV0LFxuICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQ2VudGVyLCAvLyB04bqtcCB0cnVuZyB2w6BvIHRydW5nIHTDom0gY+G7p2EgUGFuZWxcbiAgICAgICAgbW91c2VFbnRlcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogKGUsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHRleHRCbG9jayA9IChwYW5lbCBhcyBhbnkpPy5maW5kT2JqZWN0KFxuICAgICAgICAgICAgICAgICd0ZXh0QmxvY2snXG4gICAgICAgICAgICAgICkgYXMgZ28uVGV4dEJsb2NrIHwgbnVsbDtcbiAgICAgICAgICAgICAgaWYgKHRleHRCbG9jaykge1xuICAgICAgICAgICAgICAgIC8vICYmIG91dHB1dFxuICAgICAgICAgICAgICAgIHRleHRCbG9jay52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOlxuICAgICAgICAgICAgICAgICAgY2FzZSAnUic6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9ICdyZ2IoMjQzIDE0NCAxNzEpJztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBjYXNlICdUJzpcbiAgICAgICAgICAgICAgICAgIGNhc2UgJ0wnOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhbmVsLmJhY2tncm91bmQgPSAncmdiKDEwMywxNTEsMjA3KSc7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gJ3JnYigyNDMgMTQ0IDE3MSknO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICBtb3VzZUxlYXZlOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5XG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiAoZSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dEJsb2NrID0gKHBhbmVsIGFzIGFueSkuZmluZE9iamVjdChcbiAgICAgICAgICAgICAgICAndGV4dEJsb2NrJ1xuICAgICAgICAgICAgICApIGFzIGdvLlRleHRCbG9jayB8IG51bGw7XG4gICAgICAgICAgICAgIGlmICh0ZXh0QmxvY2spIHtcbiAgICAgICAgICAgICAgICB0ZXh0QmxvY2sudmlzaWJsZSA9IGZhbHNlOyAvLyDhuqhuIFRleHRCbG9jayBraGkgcuG7nWkga2jhu49pIFBhbmVsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgaWYgKGRhdGE/LmlzTm90QWxsb3dDb25uZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhPy5zZWxlY3RhYmxlID09PSBmYWxzZSAmJiAhZGF0YT8uaXNBbGxvd0Nvbm5lY3QpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRhdGE/LmZsb3dPZlBsYW50Q2VsbCkge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRhdGE/LmZsb3dPZlBsYW50Q2VsbCA9PT0gQVRPX0VOVU1fRkxPV19ESVJFQ1RJT04uSU5GTE9XICYmXG4gICAgICAgICAgICBuYW1lID09PSAnTCdcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBkYXRhPy5mbG93T2ZQbGFudENlbGwgPT09IEFUT19FTlVNX0ZMT1dfRElSRUNUSU9OLk9VVEZMT1cgJiZcbiAgICAgICAgICAgIG5hbWUgPT09ICdSJ1xuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgICBjYXNlICdCJzpcbiAgICAgICAgICBjYXNlICdSJzoge1xuICAgICAgICAgICAgcmV0dXJuICFkYXRhPy5pc05vdFNlbGVjdE91dHB1dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgY2FzZSAnTCc6IHtcbiAgICAgICAgICAgIHJldHVybiAhZGF0YT8uaXNOb3RTZWxlY3RJbnB1dDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGV4dEJsb2NrJyxcbiAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgdGV4dDogJ1xcdWYwZGEnLCAvLyBNw6MgVW5pY29kZSB0xrDGoW5nIOG7qW5nIHbhu5tpIGZhLWNhcmV0LWxlZnRcbiAgICAgICAgICBmb250OiAnOTAwIDEycHggXCJGb250IEF3ZXNvbWUgNiBQcm9cIicsXG4gICAgICAgICAgc3Ryb2tlOiAnd2hpdGUnLCAvLyDEkOG6t3QgbcOgdSBjaOG7ryB0aMOgbmggbcOgdSB0cuG6r25nXG4gICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgdmlzaWJsZTogZmFsc2UsXG4gICAgICAgIH0sXG4gICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnLCAoXykgPT4ge1xuICAgICAgICAgIHN3aXRjaCAobmFtZSkge1xuICAgICAgICAgICAgY2FzZSAnVCc6XG4gICAgICAgICAgICBjYXNlICdCJzoge1xuICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZDcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnTCc6XG4gICAgICAgICAgICBjYXNlICdSJzoge1xuICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZGEnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICByZXR1cm4gJ1xcdWYwZDcnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gcmV0dXJuIHRoaXMuJChnby5TaGFwZSwge1xuICAgIC8vICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLCAvLyBjaGFuZ2VkIHRvIGEgY29sb3IgaW4gdGhlIG1vdXNlRW50ZXIgZXZlbnQgaGFuZGxlclxuICAgIC8vICAgICBzdHJva2VXaWR0aDogMCwgLy8gbm8gc3Ryb2tlXG4gICAgLy8gICAgIHdpZHRoOiBob3Jpem9udGFsID8gTmFOIDogOCwgLy8gaWYgbm90IHN0cmV0Y2hpbmcgaG9yaXpvbnRhbGx5LCBqdXN0IDggd2lkZVxuICAgIC8vICAgICBoZWlnaHQ6ICFob3Jpem9udGFsID8gTmFOIDogOCwgLy8gaWYgbm90IHN0cmV0Y2hpbmcgdmVydGljYWxseSwganVzdCA4IHRhbGxcbiAgICAvLyAgICAgYWxpZ25tZW50OiBhbGlnbiwgLy8gYWxpZ24gdGhlIHBvcnQgb24gdGhlIG1haW4gU2hhcGVcbiAgICAvLyAgICAgc3RyZXRjaDogaG9yaXpvbnRhbCA/IGdvLkdyYXBoT2JqZWN0Lkhvcml6b250YWwgOiBnby5HcmFwaE9iamVjdC5WZXJ0aWNhbCxcbiAgICAvLyAgICAgcG9ydElkOiBuYW1lLCAvLyBkZWNsYXJlIHRoaXMgb2JqZWN0IHRvIGJlIGEgXCJwb3J0XCJcbiAgICAvLyAgICAgZnJvbVNwb3Q6IHNwb3QsIC8vIGRlY2xhcmUgd2hlcmUgbGlua3MgbWF5IGNvbm5lY3QgYXQgdGhpcyBwb3J0XG4gICAgLy8gICAgIGZyb21MaW5rYWJsZTogb3V0cHV0LCAvLyBkZWNsYXJlIHdoZXRoZXIgdGhlIHVzZXIgbWF5IGRyYXcgbGlua3MgZnJvbSBoZXJlXG4gICAgLy8gICAgIHRvU3BvdDogc3BvdCwgLy8gZGVjbGFyZSB3aGVyZSBsaW5rcyBtYXkgY29ubmVjdCBhdCB0aGlzIHBvcnRcbiAgICAvLyAgICAgdG9MaW5rYWJsZTogaW5wdXQsIC8vIGRlY2xhcmUgd2hldGhlciB0aGUgdXNlciBtYXkgZHJhdyBsaW5rcyB0byBoZXJlXG4gICAgLy8gICAgIGN1cnNvcjogJ3BvaW50ZXInLCAvLyBzaG93IGEgZGlmZmVyZW50IGN1cnNvciB0byBpbmRpY2F0ZSBwb3RlbnRpYWwgbGluayBwb2ludFxuICAgIC8vICAgICBtb3VzZUVudGVyOiAoZSwgcG9ydCkgPT4ge1xuICAgIC8vICAgICAgICAgLy8gdGhlIFBPUlQgYXJndW1lbnQgd2lsbCBiZSB0aGlzIFNoYXBlXG4gICAgLy8gICAgICAgICBpZiAoIWUuZGlhZ3JhbS5pc1JlYWRPbmx5ICYmIG91dHB1dCkge1xuICAgIC8vICAgICAgICAgICAgIHBvcnQuZmlsbCA9ICdyZ2JhKDI1NSwwLDI1NSwwLjUpJ1xuICAgIC8vICAgICAgICAgfTtcbiAgICAvLyAgICAgfSxcbiAgICAvLyAgICAgbW91c2VMZWF2ZTogKGUsIHBvcnQpID0+IHtcbiAgICAvLyAgICAgICAgIHJldHVybiAocG9ydC5maWxsID0gJ3RyYW5zcGFyZW50Jyk7XG4gICAgLy8gICAgIH0sXG4gICAgLy8gfSk7XG4gIH1cblxuICBtYWtlR3JvdXBCYXNpY0NvbXBvbmVudChcbiAgICBpY29uLFxuICAgIHRpdGxlLFxuICAgIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogODAsIGg6IDgwIH1cbiAgKSB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Hcm91cCxcbiAgICAgICdTcG90JyxcbiAgICAgIHtcbiAgICAgICAgLy8gbGF5b3V0OiB0aGlzLiQoZ28uTGF5ZXJlZERpZ3JhcGhMYXlvdXQsIHsgZGlyZWN0aW9uOiAwIH0pLFxuICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuICAgICAgICBtb3ZhYmxlOiBmYWxzZSxcbiAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICAgIC8vIG1vdmFibGU6IHRydWUsXG4gICAgICAgIC8vIHNlbGVjdGFibGU6IHRydWUsXG4gICAgICAgIGRyYWdDb21wdXRhdGlvbjogKG5vZGUsIHB0LCBncmlkcHQpID0+IHtcbiAgICAgICAgICBwdC54ID1cbiAgICAgICAgICAgIE1hdGgucm91bmQocHQueCAvIEF0b0dvanNFZGl0b3JNb2RlbC5CQVNJQ19HUklEX1NJWkVfV0lEVEgpICpcbiAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5CQVNJQ19HUklEX1NJWkVfV0lEVEg7XG4gICAgICAgICAgcHQueSA9XG4gICAgICAgICAgICBNYXRoLnJvdW5kKHB0LnkgLyBBdG9Hb2pzRWRpdG9yTW9kZWwuQkFTSUNfR1JJRF9TSVpFX0hFSUdIVCkgKlxuICAgICAgICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9IRUlHSFQ7XG4gICAgICAgICAgcmV0dXJuIHB0O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoQXRvR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9XSURUSCwgQXRvR29qc0VkaXRvck1vZGVsLkJBU0lDX0dSSURfU0laRV9IRUlHSFQpLFxuICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSgxLCAxKSxcbiAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoMSwgMSksXG4gICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKDEwMCwgMTAwKSxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdBdXRvJyxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIHN0cm9rZTogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICAvLyBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgIH0pXG4gICAgICAgIC8vIHRoaXMuJChnby5QbGFjZWhvbGRlciksXG4gICAgICAgIC8vIHRoaXMuJChnby5QbGFjZWhvbGRlciwgeyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApIH0pLFxuICAgICAgKVxuICAgICAgLy8gdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgIC8vICAgICByb3c6IDAsXG4gICAgICAvLyAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgICAgLy8gICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgLy8gICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAvLyAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgIC8vICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgIC8vIH0sXG4gICAgICAvLyBuZXcgZ28uQmluZGluZygndGV4dCcsICdrZXknKS5tYWtlVHdvV2F5KCksKSxcblxuICAgICAgLy8gdGhpcy4kKFxuICAgICAgLy8gICAgIGdvLlBhbmVsLFxuICAgICAgLy8gICAgICdUYWJsZScsXG4gICAgICAvLyAgICAge1xuICAgICAgLy8gICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuVG9wTGVmdCxcbiAgICAgIC8vICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAsIC0xMCwgLTEwKSxcbiAgICAgIC8vICAgICAgICAgLy8gcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCA1MCwgMCksXG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICB0aGlzLiQoXG4gICAgICAvLyAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgLy8gICAgICAgICAnSG9yaXpvbnRhbCcsXG4gICAgICAvLyAgICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgLy8gICAgICAgICB9LFxuICAgICAgLy8gICAgICAgICB0aGlzLiQoZ28uUGljdHVyZSwgaWNvbiwge1xuICAgICAgLy8gICAgICAgICAgICAgcm93OiAwLFxuICAgICAgLy8gICAgICAgICAgICAgLy8gYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgIC8vICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgLy8gICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNDAsIDQwKSxcbiAgICAgIC8vICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgIC8vICAgICAgICAgfSksXG4gICAgICAvLyAgICAgICAgIHRoaXMuJChcbiAgICAgIC8vICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgLy8gICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgIC8vICAgICAgICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgZGVmYXVsdEFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgLy8gICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAwLCAyMCksXG4gICAgICAvLyAgICAgICAgICAgICB9LFxuICAgICAgLy8gICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgdGl0bGUsIHtcbiAgICAgIC8vICAgICAgICAgICAgICAgICByb3c6IDAsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDMsIDMsIDUsIDEwKSxcbiAgICAgIC8vICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgTmFOKSxcbiAgICAgIC8vICAgICAgICAgICAgICAgICBzdHJva2U6ICcjNDQ0NDQ0JyxcbiAgICAgIC8vICAgICAgICAgICAgICAgICBmb250OiAnbm9ybWFsIDEwcHQgQXJpYWwnLFxuICAgICAgLy8gICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAvLyAgICAgICAgICAgICB9KSxcbiAgICAgIC8vICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgIC8vICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAvLyAgICAgICAgICAgICAgICAge1xuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAzLCAzLCAxMCksXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgNDApLFxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBzdHJva2U6ICcjMDAwRDQyJyxcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgZm9udDogJ2JvbGQgMTBwdCBBcmlhbCcsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5Ob25lLFxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgfSxcbiAgICAgIC8vICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgLy8gICAgICAgICAgICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lIGEgdG9vbHRpcCBmb3IgZWFjaCBub2RlIHRoYXQgZGlzcGxheXMgdGhlIGNvbG9yIGFzIHRleHRcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgeyBtYXJnaW46IDQgfSwgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpKSxcbiAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgKSwgLy8gZW5kIG9mIEFkb3JubWVudFxuICAgICAgLy8gICAgICAgICAgICAgICAgIH0sXG4gICAgICAvLyAgICAgICAgICAgICApLFxuICAgICAgLy8gICAgICAgICApLFxuICAgICAgLy8gICAgICksXG4gICAgICAvLyApLFxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICB9XG5cbiAgbWFrZUdyb3VwVGVtcGxhdGUoXG4gICAgaWNvbixcbiAgICB0aXRsZSxcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7IHc6IDgwLCBoOiA4MCB9XG4gICkge1xuICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uR3JvdXAsXG4gICAgICAnU3BvdCcsXG4gICAgICB7XG4gICAgICAgIC8vICAgICAvLyBsYXlvdXQ6IHRoaXMuJChnby5Gb3JjZURpcmVjdGVkTGF5b3V0ICwge1xuICAgICAgICAvLyAgICAgLy8gICAgIGRpcmVjdGlvbjogMCxcbiAgICAgICAgLy8gICAgIC8vICAgICBzZXRzUG9ydFNwb3RzOiBmYWxzZSxcbiAgICAgICAgLy8gICAgIC8vIH0pLFxuXG4gICAgICAgIC8vIGxheW91dDogdGhpcy4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7XG4gICAgICAgIC8vICAgICBkaXJlY3Rpb246IDAsXG4gICAgICAgIC8vICAgICBzZXRzUG9ydFNwb3RzOiBmYWxzZSxcbiAgICAgICAgLy8gfSksXG5cbiAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5b3V0KSxcblxuICAgICAgICAvLyAvLyAgICAgLy8gYWRvcm5tZW50IHdoZW4gYSBncm91cCBpcyBzZWxlY3RlZFxuICAgICAgICAvLyAvLyAgICAgLy8gc2VsZWN0aW9uQWRvcm5tZW50VGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgLy8gLy8gICAgIC8vICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgIC8vIC8vICAgICAvLyAgICAgJ0F1dG8nLFxuICAgICAgICAvLyAvLyAgICAgLy8gICAgIHRoaXMuJChnby5TaGFwZSwgJ1JlY3RhbmdsZScsIHsgZmlsbDogbnVsbCwgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsIHN0cm9rZVdpZHRoOiA4IH0pLFxuICAgICAgICAvLyAvLyAgICAgLy8gICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciksXG4gICAgICAgIC8vIC8vICAgICAvLyApLFxuICAgICAgfSxcblxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xheW91dCcsICdsYXlvdXQnLCAoeCkgPT5cbiAgICAgIC8vIHtcbiAgICAgIC8vICAgICByZXR1cm4gdGhpcy4kKGdvLkZvcmNlRGlyZWN0ZWRMYXlvdXQgLCB7XG4gICAgICAvLyAgICAgICAgIGRpcmVjdGlvbjogMCxcbiAgICAgIC8vICAgICAgICAgc2V0c1BvcnRTcG90czogZmFsc2UsXG4gICAgICAvLyAgICAgfSk7XG4gICAgICAvLyB9XG4gICAgICAvLyApLFxuICAgICAge1xuICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSg0MDAsIDQwMCksXG4gICAgICB9LFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcbiAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbig2MCwgMjAsIDIwLCAyMCkgfSlcbiAgICAgICksXG5cbiAgICAgIC8vIHRoaXMuJChcbiAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgIC8vICAgICAnVGFibGUnLFxuICAgICAgLy8gICAgIHtcbiAgICAgIC8vICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcExlZnQsXG4gICAgICAvLyAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAtMTAsIC0xMCksXG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB0aXRsZSwge1xuICAgICAgLy8gICAgICAgICByb3c6IDAsXG4gICAgICAvLyAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCA1LCAzKSxcbiAgICAgIC8vICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAvLyAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgLy8gICAgICAgICBmb250OiAnbm9ybWFsIDhwdCBBcmlhbCcsXG4gICAgICAvLyAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAvLyAgICAgfSksXG4gICAgICAvLyAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgIC8vICAgICAgICAgcm93OiAxLFxuICAgICAgLy8gICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgLy8gICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg0MCwgNDApLFxuICAgICAgLy8gICAgICAgICBpbWFnZVN0cmV0Y2g6IGdvLkdyYXBoT2JqZWN0LlVuaWZvcm0sXG4gICAgICAvLyAgICAgfSksXG4gICAgICAvLyAgICAgdGhpcy4kKFxuICAgICAgLy8gICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAvLyAgICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgICAgIHJvdzogMixcbiAgICAgIC8vICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMywgMywgMyksXG4gICAgICAvLyAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgIC8vICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCA0MCksXG4gICAgICAvLyAgICAgICAgICAgICBzdHJva2U6ICcjMDAwRDQyJyxcbiAgICAgIC8vICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDhwdCBBcmlhbCcsXG4gICAgICAvLyAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgLy8gICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAvLyAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAvLyAgICAgICAgIH0sXG4gICAgICAvLyAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAvLyAgICAgICAgIHtcbiAgICAgIC8vICAgICAgICAgICAgIC8vIGRlZmluZSBhIHRvb2x0aXAgZm9yIGVhY2ggbm9kZSB0aGF0IGRpc3BsYXlzIHRoZSBjb2xvciBhcyB0ZXh0XG4gICAgICAvLyAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoJ1Rvb2xUaXAnLCB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7IG1hcmdpbjogNCB9LCBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykpKSwgLy8gZW5kIG9mIEFkb3JubWVudFxuICAgICAgLy8gICAgICAgICB9LFxuICAgICAgLy8gICAgICksXG4gICAgICAvLyAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KGdvLlBvaW50LnN0cmluZ2lmeSksXG4gICAgICAvLyApLFxuXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnVGFibGUnLFxuICAgICAgICB7XG4gICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlRvcExlZnQsXG4gICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAsIC0xMCwgLTEwKSxcbiAgICAgICAgICAvLyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDUwLCAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgICAvLyBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg0MCwgNDApLFxuICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ1RhYmxlJyxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgY29sdW1uOiAxLFxuICAgICAgICAgICAgICBkZWZhdWx0QWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgwLCAwLCAwLCAyMCksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5URU1QTEFURV9EVVBMSUNBVEVbdGl0bGVdID8/IHRpdGxlLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCA1LCAxMCksXG4gICAgICAgICAgICAgICAgLy8gbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDMsIDMsIDEwKSxcbiAgICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAyMCwgNDApLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogJyMwMDBENDInLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDEwcHQgQXJpYWwnLFxuICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgICAgb3ZlcmZsb3c6IGdvLlRleHRCbG9jay5PdmVyZmxvd0VsbGlwc2lzLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLy8gZGVmaW5lIGEgdG9vbHRpcCBmb3IgZWFjaCBub2RlIHRoYXQgZGlzcGxheXMgdGhlIGNvbG9yIGFzIHRleHRcbiAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgeyBtYXJnaW46IDQgfSxcbiAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZScpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSwgLy8gZW5kIG9mIEFkb3JubWVudFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgfVxuXG4gIG1ha2VJbWFnZVRlbXBsYXRlKCkge1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Ob2RlLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICB6T3JkZXI6IDEsXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICB7XG4gICAgICAgICAgcm93OiAwLFxuICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICB9LFxuICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgICAgZ28uUG9pbnQuc3RyaW5naWZ5XG4gICAgICAgICksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QaWN0dXJlLFxuICAgICAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5JTUFHRV9ST19XQVRFUl9UUkVBVE1FTlRfUEFUSCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgLy8gbWF4U2l6ZTogbmV3IGdvLlNpemUoNTAwLCA1MDApLFxuICAgICAgICAgICAgLy8gaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgLy8gbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDEzMCwgMCwgMCwgMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnbWFyZ2luJywgJ21hcmdpbicpLFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd3aWR0aCcsICd3aWR0aCcpLFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdoZWlnaHQnLCAnaGVpZ2h0JyksXG4gICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NvdXJjZScsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE/LnNvdXJjZVxuICAgICAgICAgICAgICA/IGRhdGE/LnNvdXJjZVxuICAgICAgICAgICAgICA6IEF0b0dvanNFZGl0b3JNb2RlbC5JTUFHRV9ST19XQVRFUl9UUkVBVE1FTlRfUEFUSDtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLklNQUdFX1RFTVBMQVRFLFxuICAgICAgbm9kZVxuICAgICk7XG4gIH1cblxuICBtYWtlUGFyYW1UYWJsZSgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uUGFydCxcbiAgICAgICdWZXJ0aWNhbCcsXG4gICAgICAvLyB0aGlzLiQoZ28uU2hhcGUsIHsgZmlsbDogJyNFNkYwRjcnLCBzdHJva2U6ICcjMDA2M0E5Jywgc3Ryb2tlV2lkdGg6IDMsIGdlb21ldHJ5U3RyaW5nOiAnTSA1IDAgTCA5NSAwIFEgMTAwIDAgMTAwIDUgTCAxMDAgOTUgUSAxMDAgMTAwIDk1IDEwMCBMIDUgMTAwIFEgMCAxMDAgMCA5NSBMIDAgNSBRIDAgMCA1IDAnICB9KSxcbiAgICAgIHtcbiAgICAgICAgek9yZGVyOiAyLFxuICAgICAgICAvLyBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDIwMCksXG4gICAgICB9LFxuXG4gICAgICBuZXcgZ28uQmluZGluZygncGFkZGluZycsICdwYWRkaW5nJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnc2VsZWN0YWJsZScsICdzZWxlY3RhYmxlJyksXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsIChkYXRhKSA9PiB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgZGF0YT8udmlzaWJsZSA9PT0gJ2Jvb2xlYW4nID8gZGF0YT8udmlzaWJsZSA6IHRydWU7XG4gICAgICB9KSxcbiAgICAgIC8vIEhlYWRlclxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7XG4gICAgICAgICAgc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuRmlsbCxcbiAgICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSgxNTAsIDI3KSxcbiAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgLTYsIDApLFxuICAgICAgICB9LFxuICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCAoZGF0YSkgPT4gISFkYXRhPy50aXRsZSksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5TaGFwZSxcbiAgICAgICAgICAnUm91bmRlZFJlY3RhbmdsZScsXG4gICAgICAgICAge1xuICAgICAgICAgICAgcGFyYW1ldGVyMTogNSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdmaWxsJywgJycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YT8uY29sb3I7XG4gICAgICAgICAgfSksXG4gICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE/LmNvbG9yO1xuICAgICAgICAgIH0pXG4gICAgICAgICksXG5cbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJva2U6ICd3aGl0ZScsXG4gICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgNSksXG4gICAgICAgICAgICBzdHJldGNoOiBnby5HcmFwaE9iamVjdC5GaWxsLFxuICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICB2ZXJ0aWNhbEFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICBmb250OiAnMTRweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3RpdGxlJylcbiAgICAgICAgKVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uU2hhcGUsXG4gICAgICAgICdSZWN0YW5nbGUnLFxuICAgICAgICB7XG4gICAgICAgICAgaGVpZ2h0OiA2LFxuICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAwLCAtNiwgMCksXG4gICAgICAgICAgc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuRmlsbCxcbiAgICAgICAgfSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2ZpbGwnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICByZXR1cm4gZGF0YT8uY29sb3I7XG4gICAgICAgIH0pLFxuICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE/LmNvbG9yO1xuICAgICAgICB9KSxcbiAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgKGRhdGEpID0+ICEhZGF0YT8udGl0bGUpXG4gICAgICApLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uU2hhcGUsXG4gICAgICAgICAgJ1JvdW5kZWRSZWN0YW5nbGUnLFxuICAgICAgICAgIHsgZmlsbDogJyNFNkYwRjcnLCBzdHJva2U6ICcjMDA2M0E5Jywgc3Ryb2tlV2lkdGg6IDQsIHBhcmFtZXRlcjE6IDUgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnZmlsbCcsICdiZ0NvbG9yJyksXG4gICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICdib3JkZXJUYWJsZScpXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgIC8vIFNldCBkZWZhdWx0cyBmb3IgYWxsIHJvd3MgYW5kIGNvbHVtbnM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgcGFkZGluZzogMS41LFxuICAgICAgICAgICAgZGVmYXVsdFJvd1NlcGFyYXRvclN0cm9rZTogJyMwMDYyQTknLFxuICAgICAgICAgICAgZGVmYXVsdENvbHVtblNlcGFyYXRvclN0cm9rZTogJyMwMDYyQTknLFxuICAgICAgICAgICAgZGVmYXVsdFNlcGFyYXRvclBhZGRpbmc6IG5ldyBnby5NYXJnaW4oNSwgMiwgNSwgMiksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnZGVmYXVsdFJvd1NlcGFyYXRvclN0cm9rZScsICdib3JkZXJUYWJsZScpLFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdkZWZhdWx0Q29sdW1uU2VwYXJhdG9yU3Ryb2tlJywgJ2JvcmRlclRhYmxlJyksXG4gICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgICAgICAvLyAgICAgJ1RhYmxlUm93JyxcbiAgICAgICAgICAvLyAgICAgeyByb3c6IDAgfSxcbiAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgJ3JvdyAxIGNvbCAxJywgeyBjb2x1bW46IDAsIG1hcmdpbjogMiB9KSxcbiAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywgJ3JvdyAxIGNvbCAyJywgeyBjb2x1bW46IDEsIG1hcmdpbjogMiB9KSxcbiAgICAgICAgICAvLyApLFxuICAgICAgICAgIC8vIHRoaXMuJChcbiAgICAgICAgICAvLyAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgLy8gICAgICdUYWJsZVJvdycsXG4gICAgICAgICAgLy8gICAgIHsgcm93OiAxIH0sXG4gICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssICdyb3cgMiBjb2wgMScsIHsgY29sdW1uOiAwLCBtYXJnaW46IDIgfSksXG4gICAgICAgICAgLy8gICAgIHRoaXMuJChnby5UZXh0QmxvY2ssICdyb3cgMiBjb2wgMicsIHsgY29sdW1uOiAxLCBtYXJnaW46IDIgfSksXG4gICAgICAgICAgLy8gKSxcbiAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygnaXRlbUFycmF5JywgJ2RhdGFUYWJsZScpLFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdpdGVtQXJyYXknLCAnJywgZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhLmRhdGFUYWJsZS5maWx0ZXIoKHgpID0+IHg/LnZpc2libGUgIT09IGZhbHNlKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAvLyBpdGVtVGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgICAgIC8vICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgIC8vICAgICBuZXcgZ28uQmluZGluZygncm93JywgJ2luZGV4Um93JyksXG4gICAgICAgICAgICAvLyAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2hlaWdodCcsICdoZWlnaHQnKSxcbiAgICAgICAgICAgIC8vICAgICB0aGlzLiQoXG4gICAgICAgICAgICAvLyAgICAgICAgIGdvLlBpY3R1cmUsXG4gICAgICAgICAgICAvLyAgICAgICAgIEFSUk9XLFxuICAgICAgICAgICAgLy8gICAgICAgICB7XG4gICAgICAgICAgICAvLyAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoMjAsIDQwKSxcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8vIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgIC8vICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NvdXJjZScsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgIC8vICAgICAgICAgICAgIC8vIHBhbmVsLnBhcnQ/LmRhdGE/LmlkXG4gICAgICAgICAgICAvLyAgICAgICAgICAgICByZXR1cm4gZGF0YT8uaXNDcmVhdGVkID8gcGFuZWw/LiRwIDogQVJST1dfR1JBWTtcbiAgICAgICAgICAgIC8vICAgICAgICAgfSksXG4gICAgICAgICAgICAvLyAgICAgKSxcbiAgICAgICAgICAgIC8vICksXG4gICAgICAgICAgICBpdGVtVGVtcGxhdGU6IHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICdUYWJsZVJvdycsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICBjbGljazogKGUsIG9iajogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIG9iai5wYW5lbC5wYXJ0LmRhdGE/LmRhdGFUYWJsZVtvYmoucm93XT8uaXNFZGl0YWJsZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICBzZWxmLm9uQ2xpa1BhcmFtT2ZUYWJsZS5lbWl0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4ub2JqLnBhbmVsLnBhcnQuZGF0YT8uZGF0YVRhYmxlW29iai5yb3ddLFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbjogMCxcbiAgICAgICAgICAgICAgICAgIG1hcmdpbjogMixcbiAgICAgICAgICAgICAgICAgIHRleHRBbGlnbjogJ2xlZnQnLFxuICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgICB0b29sVGlwOiB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy5uYW1lO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtYXhTaXplJywgJycsIChkYXRhLCBwYW5lbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/Lm1heFNpemVOYW1lUGFyYW0gPz8gSW5maW5pdHk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgY29sdW1uOiAxLFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiAyLFxuICAgICAgICAgICAgICAgICAgcGFkZGluZzogMCxcbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXBhcmF0b3JQYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgICAgICAgICAgICAgICAgc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuRmlsbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdtaW5TaXplJywgJycsIChkYXRhLCBwYW5lbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHBhbmVsLnBhcnQ/LmRhdGE/Lm1pblNpemVWYWx1ZTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgZ28uU2l6ZShcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucGFydD8uZGF0YT8ubWluU2l6ZVZhbHVlPy53aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgTmFOXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAgICAgICcnLFxuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IDAsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogMCxcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgIHRvb2xUaXA6IHRoaXMuJChcbiAgICAgICAgICAgICAgICAgICAgICAnVG9vbFRpcCcsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhIXRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYCR7ZGF0YT8udGFnTmFtZSB8fCAnJ30gYFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9JHtkYXRhPy52YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgISF0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YT8udGFnTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhIWRhdGE/LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnJywgKGRhdGEsIHBhbmVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhPy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3N0cm9rZScsICcnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5jb2xvcjtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ21heFNpemUnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBnby5TaXplKGRhdGE/Lm1heFNpemVWYWx1ZSB8fCAxOTAsIDE0KTtcbiAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2ZvbnQnLCAnJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LmZvbnQ7XG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgZ28uUGljdHVyZSxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LlJpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBjb2x1bW46IDEsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCA1KSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiBJQ09OU19CQVNFNjRbJ3VmMDQ0J10sXG4gICAgICAgICAgICAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LnRvb2xUaXBBY3Rpb247XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoXG4gICAgICAgICAgICAgICAgICAgICAgICAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXRhKSA9PiAhIWRhdGE/LnRvb2xUaXBBY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTQsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiAxNCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgICAhZGF0YT8uaXNSZWFkT25seSAmJiAhdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygnb3BhY2l0eScsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE/LmlzRWRpdGFibGUgPT09IGZhbHNlID8gMC42IDogMTtcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJylcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QQVJBTV9UQUJMRSxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZU1hc3NCYWxhbmNlKCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGNvbnN0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5QYXJ0LFxuICAgICAgJ0F1dG8nLFxuICAgICAge30sXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdIb3Jpem9udGFsJyxcbiAgICAgICAgLy8gU2V0IGRlZmF1bHRzIGZvciBhbGwgcm93cyBhbmQgY29sdW1uczpcbiAgICAgICAge1xuICAgICAgICAgIHBhZGRpbmc6IDQsXG4gICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNDUwLCAzMCksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ3Rvb2x0aXAnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG4gICAgICAgICAgdmlzaWJsZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMCwgNSwgMCwgMCksXG4gICAgICAgICAgICB0ZXh0OiAnTWFzcyBCYWxhbmNlOicsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnZm9udCcsICdmb250JylcbiAgICAgICAgKSxcbiAgICAgICAgdGhpcy4kKFxuICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAnJyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5BTElaQVJJTixcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdmb250JywgJ2ZvbnQnKSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnc3Ryb2tlJywgJ2NvbG9yVmFsdWUnKSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICcnLCAoZGF0YSwgcGFuZWwpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBkYXRhPy52YWx1ZTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKTtcbiAgICB0aGlzLm15RGlhZ3JhbS5ub2RlVGVtcGxhdGVNYXAuc2V0KFxuICAgICAgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLk1BU1NfQkFMQU5DRSxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZUdyb3VwUk9QbGFudFRlbXBsYXRlKFxuICAgIGljb24sXG4gICAgdGl0bGUsXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiA4MCwgaDogODAgfVxuICApIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLkdyb3VwLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gbWluU2l6ZTogbmV3IGdvLlNpemUoTmFOLCA2MDApLFxuICAgICAgfSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdzZWxlY3RhYmxlJywgJ3NlbGVjdGFibGUnKSxcbiAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShcbiAgICAgICAgZ28uUG9pbnQuc3RyaW5naWZ5XG4gICAgICApLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ1RhYmxlJyxcblxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgIHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCksXG4gICAgICAgICAgfSxcbiAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgICAgbmFtZTogJ1NIQVBFX0tFWScsXG4gICAgICAgICAgICBmaWxsOiAnI0ZDRkNGRCcsXG4gICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgIH0pLFxuXG4gICAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMTUsIDAsIDAsIDApIH0pXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QaWN0dXJlLFxuICAgICAgICAgIFJPX0xJTkVfRElSVFksXG4gICAgICAgICAge1xuICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3Zpc2libGUnLCAnJywgKHgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB4Py5pc1ZpZXdHZW5lcmFsICYmIHg/Lmhhc091dEZsb3cgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgKSxcblxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVGFibGUnLCB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMCwgMCwgMCwgMTgzKSxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgLy8gc3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVmVydGljYWwsXG4gICAgICAgIHBvcnRJZDogJ0luZmxvdycsXG4gICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAvLyBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMCwgMCwgMTUwKSxcbiAgICAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgdG9TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgIGZyb21MaW5rYWJsZTogdHJ1ZSxcbiAgICAgICAgdG9MaW5rYWJsZTogdHJ1ZSxcbiAgICAgIH0pLFxuICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVGFibGUnLCB7XG4gICAgICAgIHdpZHRoOiAwLFxuICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMCwgMCwgOTcwLCAzMTUpLFxuICAgICAgICBhbGlnbm1lbnRGb2N1czogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgIHBvcnRJZDogJ091dEZsb3dfQ2xlYW4nLFxuICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgZnJvbVNwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICB0b1Nwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICBmcm9tTGlua2FibGU6IHRydWUsXG4gICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdUYWJsZScsXG4gICAgICAgIHtcbiAgICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgICBoZWlnaHQ6IDAsXG4gICAgICAgICAgLy8gYWxpZ25tZW50OiBuZXcgZ28uU3BvdCgwLCAwLCA0ODAsIDUyNSksXG4gICAgICAgICAgLy8gYWxpZ25tZW50OiBuZXcgZ28uU3BvdCgwLCAwLCA0NzUsIDU1MiksXG4gICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgIHBvcnRJZDogJ091dEZsb3dfRGlydHknLFxuICAgICAgICAgIGN1cnNvcjogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seSA/ICcnIDogJ3BvaW50ZXInLFxuICAgICAgICAgIGZyb21TcG90OiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICB0b1Nwb3Q6IGdvLlNwb3QuQm90dG9tLFxuICAgICAgICAgIGZyb21MaW5rYWJsZTogdHJ1ZSxcbiAgICAgICAgICB0b0xpbmthYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgICBuZXcgZ28uQmluZGluZygnYWxpZ25tZW50JywgJycsICh4KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHg/LmlzVmlld0dlbmVyYWwgJiYgeD8uaGFzT3V0Rmxvd1xuICAgICAgICAgICAgPyBuZXcgZ28uU3BvdCgwLCAwLCA0NzUsIDU1MilcbiAgICAgICAgICAgIDogbmV3IGdvLlNwb3QoMCwgMCwgNDgwLCA1MjUpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gIH1cblxuICBtYWtlR3JvdXBCb2lsZXJUZW1wbGF0ZShcbiAgICBpY29uLFxuICAgIHRpdGxlLFxuICAgIHNpemU6IHsgdzogbnVtYmVyOyBoOiBudW1iZXIgfSA9IHsgdzogODAsIGg6IDgwIH1cbiAgKSB7XG4gICAgbGV0IG5vZGUgPSB0aGlzLiQoXG4gICAgICBnby5Hcm91cCxcbiAgICAgICdTcG90JyxcbiAgICAgIHtcbiAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAvLyBtaW5TaXplOiBuZXcgZ28uU2l6ZShOYU4sIDYwMCksXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7XG4gICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICBuYW1lOiAnU0hBUEVfS0VZJyxcbiAgICAgICAgICBmaWxsOiAnI0ZDRkNGRCcsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuUkVTT0xVVElPTl9CTFVFLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICB9KSxcblxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGxhY2Vob2xkZXIsXG4gICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICAgICAgZ28uUG9pbnQuc3RyaW5naWZ5XG4gICAgICAgICAgKSxcbiAgICAgICAgICB7IHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCkgfVxuICAgICAgICApXG4gICAgICApLFxuXG4gICAgICB0aGlzLiQoZ28uUGFuZWwsICdTcG90Jywge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDAsIDAuNSwgMCwgMTEyKSxcbiAgICAgICAgYWxpZ25tZW50Rm9jdXM6IGdvLlNwb3QuTGVmdCxcbiAgICAgICAgcG9ydElkOiAnSW5mbG93JyxcbiAgICAgICAgY3Vyc29yOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ID8gJycgOiAncG9pbnRlcicsXG4gICAgICAgIGZyb21TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgIHRvU3BvdDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICBmcm9tTGlua2FibGU6IHRydWUsXG4gICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdTcG90JyxcbiAgICAgICAge1xuICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LlRvcCxcbiAgICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDEsIDEsIC0yMTUsIDApLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGljdHVyZSxcbiAgICAgICAgICBPVVRGTE9XX0xJTkVfRElSVFksXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geD8uaXNWaWV3R2VuZXJhbCAmJiB4Py5oYXNPdXRGbG93ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuJChnby5QYW5lbCwge1xuICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Cb3R0b21MZWZ0LFxuICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LlRvcCxcbiAgICAgICAgICBwb3J0SWQ6ICdPdXRGbG93JyxcbiAgICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICBmcm9tU3BvdDogZ28uU3BvdC5Cb3R0b20sXG4gICAgICAgICAgZnJvbUxpbmthYmxlOiB0cnVlLFxuICAgICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKTtcblxuICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgfVxuXG4gIG1ha2VHcm91cENvb2xpbmdUb3dlclRlbXBsYXRlKFxuICAgIGljb24sXG4gICAgdGl0bGUsXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiA4MCwgaDogODAgfVxuICApIHtcbiAgICBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLkdyb3VwLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICBzZWxlY3RhYmxlOiBmYWxzZSxcbiAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5b3V0KSxcbiAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAzMCwgMCwgMCksXG4gICAgICB9LFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICksXG4gICAgICB0aGlzLiQoXG4gICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAnQXV0bycsXG4gICAgICAgIHtcbiAgICAgICAgICByb3c6IDAsXG4gICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICBuYW1lOiAnU0hBUEVfS0VZJyxcbiAgICAgICAgICBmaWxsOiAnI0ZDRkNGRCcsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuUkVTT0xVVElPTl9CTFVFLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICB9KSxcblxuICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSB9KVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1RhYmxlJywge1xuICAgICAgICB3aWR0aDogMCxcbiAgICAgICAgaGVpZ2h0OiAwLFxuICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDAsIDAsIDAsIDUzMyksXG4gICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgcG9ydElkOiAnSW5mbG93JyxcbiAgICAgICAgY3Vyc29yOiB0aGlzLl9pbml0aWFsT3B0aW9ucy5pc1JlYWRPbmx5ID8gJycgOiAncG9pbnRlcicsXG4gICAgICAgIGZyb21TcG90OiBnby5TcG90LkxlZnQsXG4gICAgICAgIHRvU3BvdDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICBmcm9tTGlua2FibGU6IHRydWUsXG4gICAgICAgIHRvTGlua2FibGU6IHRydWUsXG4gICAgICB9KSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdTcG90JyxcbiAgICAgICAge1xuICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LlRvcCxcbiAgICAgICAgICBhbGlnbm1lbnQ6IG5ldyBnby5TcG90KDAuNSwgMSwgMjMsIDApLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGljdHVyZSxcbiAgICAgICAgICBPVVRGTE9XX0xJTkVfRElSVFksXG4gICAgICAgICAge1xuICAgICAgICAgICAgd2lkdGg6IDEwLFxuICAgICAgICAgICAgaGVpZ2h0OiAyMCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJycsICh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geD8uaXNWaWV3R2VuZXJhbCAmJiB4Py5oYXNPdXRGbG93ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgIH0pXG4gICAgICAgICksXG4gICAgICAgIHRoaXMuJChnby5QYW5lbCwge1xuICAgICAgICAgIGFsaWdubWVudDogbmV3IGdvLlNwb3QoMCwgMCwgMCwgMTgpLFxuICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LlRvcCxcbiAgICAgICAgICBwb3J0SWQ6ICdPdXRGbG93JyxcbiAgICAgICAgICBjdXJzb3I6IHRoaXMuX2luaXRpYWxPcHRpb25zLmlzUmVhZE9ubHkgPyAnJyA6ICdwb2ludGVyJyxcbiAgICAgICAgICBmcm9tU3BvdDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgdG9TcG90OiBnby5TcG90LlJpZ2h0LFxuICAgICAgICAgIGZyb21MaW5rYWJsZTogdHJ1ZSxcbiAgICAgICAgICB0b0xpbmthYmxlOiB0cnVlLFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICk7XG5cbiAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gIH1cblxuICBncm91cFBsYW50Q2VsbFRlbXBsYXRlKFxuICAgIGljb24sXG4gICAgdGl0bGUsXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0geyB3OiA4MCwgaDogODAgfVxuICApIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAgIGdvLkdyb3VwLFxuICAgICAgJ1Nwb3QnLFxuICAgICAge1xuICAgICAgICAvLyBsYXlvdXQ6IHRoaXMuJChnby5MYXlvdXQpLFxuICAgICAgICAvLyBsYXlvdXQ6IHRoaXMuJChnby5MYXllcmVkRGlncmFwaExheW91dCwgeyBkaXJlY3Rpb246IDAgfSksXG4gICAgICAgIC8vIGlzU3ViR3JhcGhFeHBhbmRlZDogZmFsc2UsXG4gICAgICAgIC8vIGJhY2tncm91bmQ6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgIC8vIGxheWVyTmFtZTogJ0ZvcmVncm91bmQnLFxuICAgICAgICAvLyB3YXNTdWJHcmFwaEV4cGFuZGVkOiBmYWxzZSxcbiAgICAgICAgbW92YWJsZTogZmFsc2UsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICBhdm9pZGFibGU6IGZhbHNlLFxuICAgICAgICAvLyByZXNpemFibGU6IHRydWUsXG5cbiAgICAgICAgLy8gcmVzaXphYmxlOiBmYWxzZSxcbiAgICAgICAgLy8gd2lkdGg6IGRhdGE/Lm9iPy5taW5XaXRoID8/IDUwLFxuICAgICAgICAvLyBoZWlnaHQ6IDUwMCxcblxuICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IHRydWUsIC8vIGVuc3VyZSB0aGUgZ3JvdXAgaXMgYWx3YXlzIGV4cGFuZGVkXG4gICAgICAgIC8vIGNvbXB1dGVzQm91bmRzQWZ0ZXJEcmFnOiB0cnVlLFxuICAgICAgICAvLyBoYW5kbGVzRHJhZ0Ryb3BGb3JNZW1iZXJzOiB0cnVlLCAvLyBoYW5kbGUgZHJhZy1hbmQtZHJvcCBldmVudHMgZm9yIGl0cyBtZW1iZXIgbm9kZXNcblxuICAgICAgICAvLyBtYXhTaXplOiBuZXcgZ28uU2l6ZSg1MDAsIDUwMCksXG4gICAgICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKDUwMCwgNTAwKSxcblxuICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IHRydWUsXG4gICAgICAgIC8vIGxheWVyTmFtZTogRElBR1JBTS5MQVlFUlMuQkFDS0dST1VORCxcblxuICAgICAgICAvLyBtb3VzZURyb3A6IGZ1bmN0aW9uIChlLCBncnApIHtcbiAgICAgICAgLy8gICAgIC8vIGRpc2FsbG93IGRyb3BwaW5nIGFueXRoaW5nIG9udG8gYW4gQWRvcm5tZW50XG4gICAgICAgIC8vICAgICBpZiAoZ3JwIGluc3RhbmNlb2YgZ28uQWRvcm5tZW50KSByZXR1cm47XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIGRyYWdDb21wdXRhdGlvbjogZnVuY3Rpb24gKG5vZGUsIHB0LCBncmlkUHQpIHtcbiAgICAgICAgLy8gICAgIGxldCBncnAgPSBub2RlLmNvbnRhaW5pbmdHcm91cDtcbiAgICAgICAgLy8gICAgIGlmIChncnAgIT09IG51bGwpIHtcbiAgICAgICAgLy8gICAgICAgICBsZXQgcmVjdCA9IGdycC5hY3R1YWxCb3VuZHM7XG4gICAgICAgIC8vICAgICAgICAgcHQueCA9IE1hdGgubWF4KHJlY3QubGVmdCwgTWF0aC5taW4ocHQueCwgcmVjdC5yaWdodCkpO1xuICAgICAgICAvLyAgICAgICAgIHB0LnkgPSBNYXRoLm1heChyZWN0LnRvcCwgTWF0aC5taW4ocHQueSwgcmVjdC5ib3R0b20pKTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBwdDtcbiAgICAgICAgLy8gfSxcblxuICAgICAgICAvLyBkcm9wQ29tcHV0YXRpb246IGZ1bmN0aW9uIChub2RlLCBwdCwgZ3JpZFB0KSB7XG4gICAgICAgIC8vICAgICBsZXQgZ3JwID0gbm9kZS5jb250YWluaW5nR3JvdXA7XG4gICAgICAgIC8vICAgICBpZiAoZ3JwICE9PSBudWxsKSB7XG4gICAgICAgIC8vICAgICAgICAgbGV0IHJlY3QgPSBncnAuYWN0dWFsQm91bmRzO1xuICAgICAgICAvLyAgICAgICAgIHB0LnggPSBNYXRoLm1heChyZWN0LmxlZnQsIE1hdGgubWluKHB0LngsIHJlY3QucmlnaHQpKTtcbiAgICAgICAgLy8gICAgICAgICBwdC55ID0gTWF0aC5tYXgocmVjdC50b3AsIE1hdGgubWluKHB0LnksIHJlY3QuYm90dG9tKSk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vICAgICByZXR1cm4gcHQ7XG4gICAgICAgIC8vIH0sXG5cbiAgICAgICAgLy8gZHJhZ0NvbXB1dGF0aW9uOiBmdW5jdGlvbiAocGFydCwgcHQsIGdyaWRwdCkge1xuICAgICAgICAvLyAgICAgLy8gR2V0IHRoZSBjdXJyZW50IGdyb3VwJ3MgYWN0dWFsIGJvdW5kc1xuICAgICAgICAvLyAgICAgY29uc3QgZ3JwID0gcGFydC5jb250YWluaW5nR3JvdXA7XG4gICAgICAgIC8vICAgICBpZiAoZ3JwKSB7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgYm5kcyA9IGdycC5hY3R1YWxCb3VuZHM7XG4gICAgICAgIC8vICAgICAgICAgY29uc3QgbG9jID0gcGFydC5sb2NhdGlvbjtcblxuICAgICAgICAvLyAgICAgICAgIC8vIFNlZSBpZiB0aGUgcGFydCdzIG5ldyBsb2NhdGlvbiB3b3VsZCBiZSBvdXQgb2YgYm91bmRzXG4gICAgICAgIC8vICAgICAgICAgY29uc3QgbmV3eCA9IE1hdGgubWF4KGJuZHMueCwgTWF0aC5taW4ocHQueCwgYm5kcy5yaWdodCAtIHBhcnQuYWN0dWFsQm91bmRzLndpZHRoIC8gMikpO1xuICAgICAgICAvLyAgICAgICAgIGNvbnN0IG5ld3kgPSBNYXRoLm1heChibmRzLnksIE1hdGgubWluKHB0LnksIGJuZHMuYm90dG9tIC0gcGFydC5hY3R1YWxCb3VuZHMuaGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIC8vICAgICAgICAgLy8gTW9kaWZ5IHRoZSByZXN1bHQgcG9pbnQgdG8ga2VlcCB0aGUgUGFydCBpbnNpZGUgdGhlIEdyb3VwXG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIG5ldyBnby5Qb2ludChuZXd4LCBuZXd5KTtcbiAgICAgICAgLy8gICAgIH1cbiAgICAgICAgLy8gICAgIHJldHVybiBwdDtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIHNlbGYubXlEaWFncmFtPy5jbGVhclNlbGVjdGlvbigpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgLy8gbW91c2VEcmFnRW50ZXI6IChlLCAgb2JqKSA9PiB7XG4gICAgICAgIC8vIH0sXG4gICAgICAgIC8vIG1vdXNlRHJvcDogKGUsICBvYmopID0+IHtcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gbW91c2VFbnRlcjogKGUsIG9iaikgPT4ge1xuICAgICAgICAvLyAgICAgY29uc3Qgbm9kZSA9IG9iai5wYXJ0O1xuICAgICAgICAvLyAgICAgc2VsZi5vbkhvdmVySW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgICAgLy8gICAgICAgICBsZWZ0OiBlPy5bJ1dyJ10/LnggKyA4LFxuICAgICAgICAvLyAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgICAvLyAgICAgICAgIG5vZGU6IG5vZGUsXG4gICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgLy8gICAgIC8vIGxldCBzaGFwZSA9IChub2RlIGFzIGFueSk/LmZpbmRPYmplY3QoJ1NIQVBFX0tFWScpO1xuICAgICAgICAvLyAgICAgLy8gaWYgKHNoYXBlKSB7XG4gICAgICAgIC8vICAgICAvLyAgICAgc2hhcGUuc3Ryb2tlID0gJ2JsdWUnO1xuICAgICAgICAvLyAgICAgLy8gfVxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBtb3VzZUxlYXZlOiAoZSwgb2JqKSA9PiB7XG4gICAgICAgIC8vICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAgIC8vICAgICAvLyBsZXQgc2hhcGUgPSAobm9kZSBhcyBhbnkpPy5maW5kT2JqZWN0KCdTSEFQRV9LRVknKTtcbiAgICAgICAgLy8gICAgIC8vIGlmIChzaGFwZSkge1xuICAgICAgICAvLyAgICAgLy8gICAgIHNoYXBlLnN0cm9rZSA9IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5XSElURTtcbiAgICAgICAgLy8gICAgIC8vIH1cbiAgICAgICAgLy8gfSxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygnbGF5b3V0JywgJycsIGZ1bmN0aW9uIChkYXRhLCBub2RlKSB7XG4gICAgICAgIC8vIHJldHVybiBkYXRhPy5sYXlvdXRWYWx1ZSA9PT0gQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fTEFZT1VUX0VESVRPUi5BVVRPXG4gICAgICAgIC8vICAgICA/IHNlbGYuJChnby5MYXllcmVkRGlncmFwaExheW91dCwgeyBkaXJlY3Rpb246IDAgfSlcbiAgICAgICAgLy8gICAgIDogbm9kZT8ubGF5b3V0O1xuICAgICAgICBpZiAoZGF0YT8ubGF5b3V0VmFsdWUgIT09IGRhdGE/LmxheW91dFZhbHVlQ2xvbmUpIHtcbiAgICAgICAgICBkYXRhLmxheW91dFZhbHVlQ2xvbmUgPSBkYXRhPy5sYXlvdXRWYWx1ZTtcbiAgICAgICAgICByZXR1cm4gZGF0YT8ubGF5b3V0VmFsdWUgPT09XG4gICAgICAgICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9MQVlPVVRfRURJVE9SLkFVVE9cbiAgICAgICAgICAgID8gc2VsZi4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KVxuICAgICAgICAgICAgOiBzZWxmLiQoZ28uTGF5b3V0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbm9kZT8ubGF5b3V0O1xuICAgICAgICB9XG4gICAgICAgIC8vIDogc2VsZi4kKGdvLkxheW91dCk7XG4gICAgICAgIC8vIHJldHVybiBkYXRhPy5sYXlvdXQ7XG4gICAgICAgIC8vIHJldHVybiBkYXRhPy5wcmV2aW91c0xheW91dCB8fCBzZWxmLiQoZ28uTGF5ZXJlZERpZ3JhcGhMYXlvdXQsIHsgZGlyZWN0aW9uOiAwIH0pO1xuICAgICAgICAvLyByZXR1cm4gc2VsZi4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KTtcbiAgICAgIH0pLFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2dyaWQnLCAnZ3JpZCcpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ3NlbGVjdGFibGUnLCAnc2VsZWN0YWJsZScpLFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ3dpZHRoJywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAvLyAgICAgcmV0dXJuIGRhdGE/Lm9iPy5taW5XaXRoID8/IDUwO1xuICAgICAgLy8gfSksXG4gICAgICBuZXcgZ28uQmluZGluZygnbWluU2l6ZScsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICByZXR1cm4gbmV3IGdvLlNpemUoZGF0YT8ub2I/Lm1pbldpdGggPz8gNTAsIGRhdGE/Lm9iPy5taW5IZWlnaHQgPz8gNTApOyAvLyBDdXN0b21pemUgbWluU2l6ZSBiYXNlZCBvbiBkYXRhXG4gICAgICB9KS5vZk9iamVjdCgpLFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ3dpZHRoJywgJycsIGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAvLyAgICAgcmV0dXJuIGRhdGE/Lm9iPy5taW5XaXRoID8/IDUwOyAvLyBDdXN0b21pemUgbWluU2l6ZSBiYXNlZCBvbiBkYXRhXG4gICAgICAvLyB9KS5vZk9iamVjdCgpLFxuICAgICAgLy8gbmV3IGdvLkJpbmRpbmcoJ2hlaWdodCcsICcnLCBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgLy8gICAgIHJldHVybiBkYXRhPy5vYj8ubWluSGVpZ2h0ID8/IDUwOyAvLyBDdXN0b21pemUgbWluU2l6ZSBiYXNlZCBvbiBkYXRhXG4gICAgICAvLyB9KS5vZk9iamVjdCgpLFxuICAgICAgbmV3IGdvLkJpbmRpbmcoJ2xvY2F0aW9uJywgJ2xvYycsIGdvLlBvaW50LnBhcnNlKS5tYWtlVHdvV2F5KFxuICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICksXG4gICAgICAvLyBuZXcgZ28uQmluZGluZygnaXNTdWJHcmFwaEV4cGFuZGVkJywgJ2V4cGFuZGVkJykubWFrZVR3b1dheSgpLFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7XG4gICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgICAvLyBtYXJnaW46bmV3IGdvLk1hcmdpbigwLCA1MCwgMCwgNTApLFxuICAgICAgICB9LFxuICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgIG5hbWU6ICdTSEFQRV9LRVknLFxuICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuUkVTT0xVVElPTl9CTFVFLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7IHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCkgfSlcbiAgICAgIClcbiAgICApO1xuXG4gICAgLy8gbm9kZS5tZW1iZXJWYWxpZGF0aW9uID0gZnVuY3Rpb24gKG5vZGUsIGdyb3VwKSB7XG4gICAgLy8gICAgIGlmICghZ3JvdXApIHJldHVybiB0cnVlOyAvLyBhbGxvdyB1bmdyb3VwaW5nXG4gICAgLy8gICAgIGNvbnN0IGdyb3VwQm91bmRzID0gZ3JvdXAuYWN0dWFsQm91bmRzO1xuICAgIC8vICAgICBjb25zdCBub2RlQm91bmRzID0gbm9kZS5hY3R1YWxCb3VuZHM7XG4gICAgLy8gICAgIHJldHVybiBncm91cEJvdW5kcy5jb250YWluc1JlY3Qobm9kZUJvdW5kcyk7XG4gICAgLy8gfTtcbiAgICB0aGlzLm15RGlhZ3JhbS5ncm91cFRlbXBsYXRlTWFwLnNldCh0aXRsZSwgbm9kZSk7XG4gIH1cblxuICBncm91cFBDSW5wdXRPck91dFRlbXBsYXRlKGljb24sIHRpdGxlLCBwYWRkaW5nOiBnby5NYXJnaW4pIHtcbiAgICAvLyBsZXQgbm9kZSA9IHRoaXMuJChcbiAgICAvLyAgICAgZ28uR3JvdXAsXG4gICAgLy8gICAgICdTcG90JyxcbiAgICAvLyAgICAge1xuICAgIC8vICAgICAgICAgbGF5b3V0OiB0aGlzLiQoZ28uTGF5b3V0KSxcbiAgICAvLyAgICAgICAgIG1vdmFibGU6IGZhbHNlLFxuICAgIC8vICAgICAgICAgc2VsZWN0YWJsZTogZmFsc2UsXG4gICAgLy8gICAgIH0sXG4gICAgLy8gICAgIC8vIHtcbiAgICAvLyAgICAgLy8gICAgIC8vIG1pblNpemU6IG5ldyBnby5TaXplKDUwMCwgNTAwKSxcbiAgICAvLyAgICAgLy8gICAgIG1vdmFibGU6IGZhbHNlLFxuICAgIC8vICAgICAvLyAgICAgYXJpYVJlYWRPbmx5OiB0cnVlLFxuICAgIC8vICAgICAvLyB9LFxuICAgIC8vICAgICB0aGlzLiQoXG4gICAgLy8gICAgICAgICBnby5QYW5lbCxcbiAgICAvLyAgICAgICAgICdBdXRvJyxcbiAgICAvLyAgICAgICAgIHtcbiAgICAvLyAgICAgICAgICAgICBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDAsIDApLFxuICAgIC8vICAgICAgICAgfSxcbiAgICAvLyAgICAgICAgIHRoaXMuJChnby5TaGFwZSwgJ1JvdW5kZWRSZWN0YW5nbGUnLCB7XG4gICAgLy8gICAgICAgICAgICAgZmlsbDogJ3RyYW5zcGFyZW50JyxcbiAgICAvLyAgICAgICAgICAgICAvLyBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5SRVNPTFVUSU9OX0JMVUUsXG4gICAgLy8gICAgICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuV0hJVEUsXG4gICAgLy8gICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgLy8gICAgICAgICAgICAgc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgLy8gICAgICAgICB9KSxcbiAgICAvLyAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwge1xuICAgIC8vICAgICAgICAgICAgIHBhZGRpbmc6IG5ldyBnby5NYXJnaW4oMCwgMCwgMCwgMCksXG4gICAgLy8gICAgICAgICB9KSxcbiAgICAvLyAgICAgKSxcbiAgICAvLyApO1xuICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uR3JvdXAsXG4gICAgICAnU3BvdCcsXG4gICAgICB7XG4gICAgICAgIGxheW91dDogdGhpcy4kKGdvLkxheWVyZWREaWdyYXBoTGF5b3V0LCB7IGRpcmVjdGlvbjogMCB9KSxcbiAgICAgICAgbW92YWJsZTogZmFsc2UsXG4gICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICBhdm9pZGFibGU6IGZhbHNlLFxuICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAvLyBpc1N1YkdyYXBoRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAvLyBsYXllck5hbWU6ICdGb3JlZ3JvdW5kJyxcbiAgICAgIH0sXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKSxcbiAgICAgIHRoaXMuJChcbiAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICdBdXRvJyxcbiAgICAgICAge1xuICAgICAgICAgIHBhZGRpbmc6IHBhZGRpbmcgPz8gbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUm91bmRlZFJlY3RhbmdsZScsIHtcbiAgICAgICAgICBmaWxsOiAndHJhbnNwYXJlbnQnLFxuICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLldISVRFLFxuICAgICAgICAgIC8vIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkFMSVpBUklOLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICB9KSxcbiAgICAgICAgdGhpcy4kKGdvLlBsYWNlaG9sZGVyLCB7XG4gICAgICAgICAgcGFkZGluZzogbmV3IGdvLk1hcmdpbigwLCAwLCAwLCAwKSxcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICApO1xuICAgIHRoaXMubXlEaWFncmFtLmdyb3VwVGVtcGxhdGVNYXAuc2V0KHRpdGxlLCBub2RlKTtcbiAgfVxuXG4gIG1ha2VHcm91cFpvbmVUZW1wbGF0ZShcbiAgICBzaXplOiB7IHc6IG51bWJlcjsgaDogbnVtYmVyIH0gPSB7XG4gICAgICB3OiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogMTQsXG4gICAgICBoOiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICB9XG4gICkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGxldCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uR3JvdXAsXG4gICAgICAnVmVydGljYWwnLFxuICAgICAge1xuICAgICAgICBsYXlvdXQ6IHRoaXMuJChnby5HcmlkTGF5b3V0LCB7XG4gICAgICAgICAgd3JhcHBpbmdDb2x1bW46IDEsXG4gICAgICAgICAgc3BhY2luZzogbmV3IGdvLlNpemUoMCwgMCksXG4gICAgICAgIH0pLFxuICAgICAgfSxcblxuICAgICAge1xuICAgICAgICBsb2NhdGlvblNwb3Q6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICBtb3VzZU92ZXI6IGZ1bmN0aW9uIChlLCBvYmopIHtcbiAgICAgICAgICAvLyBzZWxmLnNob3dQb2ludChvYmo/LnBhcnQ/LmxvY2F0aW9uKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChvYmo/LmRhdGE/Lm9uU2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICBlPy5kYXRhPy5vblNlbGVjdGVkKG51bGwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzZWxlY3Rpb25BZG9ybm1lbnRUZW1wbGF0ZTogdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgID8gbnVsbFxuICAgICAgICAgIDogdGhpcy4kKFxuICAgICAgICAgICAgICBnby5BZG9ybm1lbnQsXG4gICAgICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHNoYWRvd1Zpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgc2hhZG93Qmx1cjogNixcbiAgICAgICAgICAgICAgICBzaGFkb3dPZmZzZXQ6IG5ldyBnby5Qb2ludCgwLCAyKSxcbiAgICAgICAgICAgICAgICBzaGFkb3dDb2xvcjogJyMwMDAwMDAyOScsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCB7XG4gICAgICAgICAgICAgICAgICBmaWxsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgc3Ryb2tlOiAnZG9kZ2VyYmx1ZScsXG4gICAgICAgICAgICAgICAgICBzdHJva2VXaWR0aDogNCxcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoZ28uUGxhY2Vob2xkZXIsIHsgcGFkZGluZzogMyB9KVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3BSaWdodCxcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBnby5TcG90LkJvdHRvbSxcbiAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICAnQnV0dG9uJyxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgX2RyYWdEYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlRFWFRfTk9ERSxcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAwLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuQkxVRSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY2xpY2s6IHNlbGYuYWRkSXRlbU9uR3JvdXBab25lLCAvLyBkZWZpbmVkIGJlbG93LCB0byBzdXBwb3J0IGEgY2xpY2sgb24gdGhlIGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAnQnV0dG9uQm9yZGVyLnN0cm9rZVdpZHRoJzogMCxcbiAgICAgICAgICAgICAgICAgICAgJ0J1dHRvbkJvcmRlci5maWxsJzogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogJ1xcdWYwNTUnLFxuICAgICAgICAgICAgICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAgICAgY3Vyc29yOiAncG9pbnRlcicsXG4gICAgICAgICAgICAgICAgICAgIHN0cm9rZTogJyMyYzJjMmMnLFxuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIC8vIG1vcmVcbiAgICAgICAgICAgICAgICB0aGlzLmdlbmVyYXRlQWN0aW9uR3JvdXAoW1xuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgICAgICAgICAgICAgIEF0b0RlZmF1bHRHb2pzRWRpdG9yLkVOVU1fQUNUSU9OUy5ERVRBSUxTLFxuICAgICAgICAgICAgICAgICAgQXRvRGVmYXVsdEdvanNFZGl0b3IuRU5VTV9BQ1RJT05TLk9VVEZMT1csXG4gICAgICAgICAgICAgICAgICBBdG9EZWZhdWx0R29qc0VkaXRvci5FTlVNX0FDVElPTlMuREVMRVRFLFxuICAgICAgICAgICAgICAgIF0pXG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgICAgIC8vICAgICAvLyBFZGl0IFRleHRcbiAgICAgICAgICAgICAgICAvLyAgICAgJ0J1dHRvbicsXG4gICAgICAgICAgICAgICAgLy8gICAgIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNsaWNrOiBzZWxmLmVkaXRUZXh0R3JvdXBab25lLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgJ0J1dHRvbkJvcmRlci5zdHJva2VXaWR0aCc6IDAsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAnQnV0dG9uQm9yZGVyLmZpbGwnOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0OiAnXFx1ZTFiZicsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgc3Ryb2tlOiAnIzJjMmMyYycsXG4gICAgICAgICAgICAgICAgLy8gICAgIH0pLFxuICAgICAgICAgICAgICAgIC8vICksXG4gICAgICAgICAgICAgICAgLy8gdGhpcy4kKFxuICAgICAgICAgICAgICAgIC8vICAgICAvLyBPcGVuIERldGFpbFxuICAgICAgICAgICAgICAgIC8vICAgICAnQnV0dG9uJyxcbiAgICAgICAgICAgICAgICAvLyAgICAge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uT3BlbkRldGFpbC5lbWl0KHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAnQnV0dG9uQm9yZGVyLnN0cm9rZVdpZHRoJzogMCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICdCdXR0b25Cb3JkZXIuZmlsbCc6ICd3aGl0ZScsXG4gICAgICAgICAgICAgICAgLy8gICAgIH0sXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGV4dDogJ1xcdWU0OWEnLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgZm9udDogJzIwcHggXCJGb250IEF3ZXNvbWUgNiBQcm9cIicsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gKSxcbiAgICAgICAgICAgICAgICAvLyAhdGhpcy5faW5pdGlhbE9wdGlvbnMuaXNSZWFkT25seVxuICAgICAgICAgICAgICAgIC8vICAgICA/IHRoaXMuJChcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgJ0J1dHRvbicsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGFjdGlvbk1vdmU6IHNlbGYuZHJhZ05ld05vZGUsIC8vIGRlZmluZWQgYmVsb3csIHRvIHN1cHBvcnQgZHJhZ2dpbmcgZnJvbSB0aGUgYnV0dG9uXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBfZHJhZ0RhdGE6IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICB0eXBlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuVEVYVF9OT0RFLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgIG5hbWU6IDAsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgY29sb3I6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5CTFVFLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGNsaWNrOiBzZWxmLmNsaWNrTmV3Tm9kZSwgLy8gZGVmaW5lZCBiZWxvdywgdG8gc3VwcG9ydCBhIGNsaWNrIG9uIHRoZSBidXR0b25cbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICdCdXR0b25Cb3JkZXIuc3Ryb2tlV2lkdGgnOiAwLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgJ0J1dHRvbkJvcmRlci5maWxsJzogJ3doaXRlJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgdGhpcy4kKGdvLlRleHRCbG9jaywge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgbWFyZ2luOiA0LFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgdGV4dDogJ1xcdWUxNTcnLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgZm9udDogJzIwcHggXCJGb250IEF3ZXNvbWUgNiBQcm9cIicsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBjdXJzb3I6ICdwb2ludGVyJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIHN0cm9rZTogJyMyYzJjMmMnLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyAgICAgICApXG4gICAgICAgICAgICAgICAgLy8gICAgIDoge30sXG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzLiQoXG4gICAgICAgICAgICAgICAgLy8gICAgICdCdXR0b24nLFxuICAgICAgICAgICAgICAgIC8vICAgICB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBjbGljazogc2VsZi5kZWxldGVOb2RlLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgJ0J1dHRvbkJvcmRlci5zdHJva2VXaWR0aCc6IDAsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICAnQnV0dG9uQm9yZGVyLmZpbGwnOiAnd2hpdGUnLFxuICAgICAgICAgICAgICAgIC8vICAgICB9LFxuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICB0ZXh0OiAnXFx1ZjJlZCcsXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBmb250OiAnMjBweCBcIkZvbnQgQXdlc29tZSA2IFByb1wiJyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGN1cnNvcjogJ3BvaW50ZXInLFxuICAgICAgICAgICAgICAgIC8vICAgICB9KSxcbiAgICAgICAgICAgICAgICAvLyApLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApLFxuICAgICAgfSxcblxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdSb3VuZGVkUmVjdGFuZ2xlJywge1xuICAgICAgICAgIGZpbGw6ICd0cmFuc3BhcmVudCcsXG4gICAgICAgICAgc3Ryb2tlOiBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9DT0xPUlMuUkVTT0xVVElPTl9CTFVFLFxuICAgICAgICAgIHN0cm9rZVdpZHRoOiAyLFxuICAgICAgICAgIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudywgTmFOKSxcbiAgICAgICAgfSksXG4gICAgICAgIHRoaXMuJChcbiAgICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5Ub3AsXG4gICAgICAgICAgICBwYWRkaW5nOiBuZXcgZ28uTWFyZ2luKDE3LCAxMCwgMTYsIDEwKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oNSwgMCwgMTAsIDApLFxuICAgICAgICAgICAgICBlZGl0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgZGVzaXJlZFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCAyNSksXG4gICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLk5JR0hUX1JJREVSLFxuICAgICAgICAgICAgICBmb250OiAnYm9sZCAxNnB4IEFyaWFsJyxcbiAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgd3JhcDogZ28uVGV4dEJsb2NrLk5vbmUsXG4gICAgICAgICAgICAgIG92ZXJmbG93OiBnby5UZXh0QmxvY2suT3ZlcmZsb3dFbGxpcHNpcyxcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KClcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChnby5QbGFjZWhvbGRlciwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgIH0pXG4gICAgICAgICksXG5cbiAgICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgIHRoaXMubWFrZVBvcnQoJ1InLCBnby5TcG90LlJpZ2h0LCBnby5TcG90LlJpZ2h0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSlcbiAgICAgICksXG4gICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0uZ3JvdXBUZW1wbGF0ZU1hcC5zZXQoXG4gICAgICBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuWk9ORSxcbiAgICAgIG5vZGVcbiAgICApO1xuICB9XG5cbiAgbWFrZVpvbmVJdGVtVGVtcGxhdGUoXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0ge1xuICAgICAgdzogQXRvR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDEyLFxuICAgICAgaDogQXRvR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDIsXG4gICAgfVxuICApIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBjb25zdCBub2RlID0gdGhpcy4kKFxuICAgICAgZ28uTm9kZSxcbiAgICAgICdBdXRvJyxcbiAgICAgIC8vIHtcbiAgICAgIC8vICAgICBtb3VzZUhvdmVyOiAoZSwgb2JqKSA9PiB7XG4gICAgICAvLyAgICAgICAgIGNvbnN0IG5vZGUgPSBvYmoucGFydDtcbiAgICAgIC8vICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQoe1xuICAgICAgLy8gICAgICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCArIDgsXG4gICAgICAvLyAgICAgICAgICAgICAgICAgdG9wOiBlPy5bJ1dyJ10/LnksXG4gICAgICAvLyAgICAgICAgICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgLy8gICAgICAgICAgICAgfSk7XG4gICAgICAvLyAgICAgICAgIH1cbiAgICAgIC8vICAgICB9LFxuICAgICAgLy8gICAgIG1vdXNlTGVhdmU6IChlLCBvYmopID0+IHtcbiAgICAgIC8vICAgICAgICAgaWYgKChvYmogYXMgYW55KS5wYXJ0Py5vYj8udmFsdWUgPT09IFZBTFVFX05BKSB7XG4gICAgICAvLyAgICAgICAgICAgICBzZWxmLm9uSG92ZXJJbmZvQnV0dG9uLmVtaXQobnVsbCk7XG4gICAgICAvLyAgICAgICAgIH1cbiAgICAgIC8vICAgICB9LFxuICAgICAgLy8gICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgIC8vICAgICAgICAgY29uc3Qgbm9kZSA9IG9iai5wYXJ0O1xuICAgICAgLy8gICAgICAgICB0aGlzLmlzU2hvd05vZGVJbmZvID8gc2VsZi5vbkNsaWNrSW5mb0J1dHRvbi5lbWl0KHtcbiAgICAgIC8vICAgICAgICAgICAgIGxlZnQ6IGU/LlsnV3InXT8ueCxcbiAgICAgIC8vICAgICAgICAgICAgIHRvcDogZT8uWydXciddPy55LFxuICAgICAgLy8gICAgICAgICAgICAgbm9kZTogbm9kZVxuICAgICAgLy8gICAgICAgICB9KSA6IG51bGw7XG4gICAgICAvLyAgICAgfSxcbiAgICAgIC8vIH0sXG4gICAgICAvLyBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoZ28uUG9pbnQuc3RyaW5naWZ5KSxcbiAgICAgIHtcbiAgICAgICAgbW92YWJsZTogZmFsc2UsXG4gICAgICB9LFxuICAgICAgdGhpcy4kKFxuICAgICAgICBnby5QYW5lbCxcbiAgICAgICAgJ0F1dG8nLFxuICAgICAgICB7XG4gICAgICAgICAgd2lkdGg6IHNpemUudyxcbiAgICAgICAgICBoZWlnaHQ6IHNpemUuaCxcbiAgICAgICAgfSxcbiAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnUmVjdGFuZ2xlJywge1xuICAgICAgICAgIGZpbGw6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5MSUdIVF9CTFVFLFxuICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkxJTktfV0FURVIsXG4gICAgICAgIH0pLFxuICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgJ1ZlcnRpY2FsJyxcbiAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICByb3c6IDIsXG4gICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigxMCwgMCwgNSwgMCksXG4gICAgICAgICAgICAgIGZvbnQ6ICdib2xkIDEycHggQXJpYWwnLFxuICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5OSUdIVF9SSURFUixcbiAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICdUb29sVGlwJyxcbiAgICAgICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbjogNCxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICduYW1lJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWUnKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICBuZXcgZ28uQmluZGluZygndmlzaWJsZScsICduYW1lJywgKHgpID0+ICEheClcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ0hvcml6b250YWwnLFxuXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAxMCwgMCwgMTApLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICcxMnB4IHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLk5JR0hUX1JJREVSLFxuICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICAgIGVkaXRhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzTXVsdGlsaW5lOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZShzaXplLncgLSAxMDAsIDE1KSxcbiAgICAgICAgICAgICAgICBvdmVyZmxvdzogZ28uVGV4dEJsb2NrLk92ZXJmbG93RWxsaXBzaXMsXG4gICAgICAgICAgICAgICAgdG9vbFRpcDogdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgJ1Rvb2xUaXAnLFxuICAgICAgICAgICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgICAgICAgICBnby5UZXh0QmxvY2ssXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICBtYXJnaW46IDQsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd0ZXh0JywgJ25hbWVJdGVtJykubWFrZVR3b1dheSgpXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbmV3IGdvLkJpbmRpbmcoJ3RleHQnLCAnbmFtZUl0ZW0nKS5tYWtlVHdvV2F5KCksXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCd2aXNpYmxlJywgJ25hbWVJdGVtJywgKHgpID0+ICEheClcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlRleHRCbG9jayxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCA1LCAxMCwgMCksXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgICBmb250OiAnMTJweCBzYW5zLXNlcmlmJyxcbiAgICAgICAgICAgICAgICBzdHJva2U6IEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX0NPTE9SUy5DRVJVTEVBTixcbiAgICAgICAgICAgICAgICB3cmFwOiBnby5UZXh0QmxvY2suV3JhcEZpdCxcbiAgICAgICAgICAgICAgICB0ZXh0OiAnPCAnLFxuICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKFxuICAgICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAnZGF0YScsXG4gICAgICAgICAgICAgICAgKHgpID0+IHR5cGVvZiB4Py5xdWFudGl0eSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICcxMnB4IHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkNFUlVMRUFOLFxuICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZygndGV4dCcsICdkYXRhJywgKHgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHg/LnF1YW50aXR5ICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWQ6IGFueSA9IFV0aWxzU2VydmljZS5jb252ZXJ0UHJlZml4ZXNEYXRhKHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlOiB4Py5xdWFudGl0eSxcbiAgICAgICAgICAgICAgICAgIHVuaXQ6IHg/LnVuaXQsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZC5zaG9ydGVuZWROdW1iZXIgK1xuICAgICAgICAgICAgICAgICAgICAnICcgK1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWQudW5pdFByZWZpeGVzICtcbiAgICAgICAgICAgICAgICAgICAgeD8udW5pdCA/PyAnJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICBuZXcgZ28uQmluZGluZyhcbiAgICAgICAgICAgICAgICAndmlzaWJsZScsXG4gICAgICAgICAgICAgICAgJ2RhdGEnLFxuICAgICAgICAgICAgICAgICh4KSA9PiB0eXBlb2YgeD8ucXVhbnRpdHkgPT09ICdudW1iZXInXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICksXG5cbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uVGV4dEJsb2NrLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDUsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICcxMnB4IHNhbnMtc2VyaWYnLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fQ09MT1JTLkNFUlVMRUFOLFxuICAgICAgICAgICAgICAgIHdyYXA6IGdvLlRleHRCbG9jay5XcmFwRml0LFxuICAgICAgICAgICAgICAgIHRleHQ6ICcgPicsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKFxuICAgICAgICAgICAgICAgICd2aXNpYmxlJyxcbiAgICAgICAgICAgICAgICAnZGF0YScsXG4gICAgICAgICAgICAgICAgKHgpID0+IHR5cGVvZiB4Py5xdWFudGl0eSA9PT0gJ251bWJlcidcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKVxuICAgICAgKVxuICAgICk7XG4gICAgdGhpcy5teURpYWdyYW0ubm9kZVRlbXBsYXRlTWFwLnNldChcbiAgICAgIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5aT05FX0VORVJHWV9JVEVNLFxuICAgICAgbm9kZVxuICAgICk7XG4gIH1cblxuICBtYWtlU3BlY2lhbFRlbXBsYXRlKFxuICAgIGljb24sXG4gICAgdGl0bGUsXG4gICAgc2l6ZTogeyB3OiBudW1iZXI7IGg6IG51bWJlciB9ID0ge1xuICAgICAgdzogQXRvR29qc0VkaXRvck1vZGVsLkdSSURfU0laRSAqIDUsXG4gICAgICBoOiBBdG9Hb2pzRWRpdG9yTW9kZWwuR1JJRF9TSVpFICogNSxcbiAgICB9XG4gICkge1xuICAgIGxldCBub2RlOiBhbnkgPSBudWxsO1xuICAgIHN3aXRjaCAodGl0bGUpIHtcbiAgICAgIGNhc2UgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNQRUNJQUxfUFJPQ0VTUzpcbiAgICAgICAgbm9kZSA9IHRoaXMuJChcbiAgICAgICAgICBnby5Ob2RlLFxuICAgICAgICAgICdTcG90JyxcbiAgICAgICAgICAvLyB7XG4gICAgICAgICAgLy8gICAgIGZyb21TcG90OiBnby5TcG90LlJpZ2h0LCAgLy8gY29taW5nIG91dCBmcm9tIG1pZGRsZS1yaWdodFxuICAgICAgICAgIC8vICAgICB0b1Nwb3Q6IGdvLlNwb3QuTGVmdFxuICAgICAgICAgIC8vIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgY2xpY2s6IChlLCBvYmo6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAob2JqPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgb2JqPy5kYXRhPy5vblNlbGVjdGVkKG9iaj8uZGF0YSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZWxlY3Rpb25DaGFuZ2VkOiAoZSkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWUuaXNTZWxlY3RlZCAmJiBlPy5kYXRhPy5vblNlbGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgZT8uZGF0YT8ub25TZWxlY3RlZChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdsb2NhdGlvbicsICdsb2MnLCBnby5Qb2ludC5wYXJzZSkubWFrZVR3b1dheShcbiAgICAgICAgICAgIGdvLlBvaW50LnN0cmluZ2lmeVxuICAgICAgICAgICksXG4gICAgICAgICAgdGhpcy4kKFxuICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAnQXV0bycsXG4gICAgICAgICAgICB7IHdpZHRoOiBzaXplLncsIGhlaWdodDogc2l6ZS5oIH0sXG4gICAgICAgICAgICB0aGlzLiQoZ28uU2hhcGUsICdDaXJjbGUnLCB7XG4gICAgICAgICAgICAgIGZpbGw6ICd3aGl0ZScsXG4gICAgICAgICAgICAgIHN0cm9rZTogJyMyRDNCNzcnLFxuICAgICAgICAgICAgICBzdHJva2VXaWR0aDogMixcbiAgICAgICAgICAgICAgLy8gc3Ryb2tlRGFzaEFycmF5OiBbNSwgNV0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgZ28uUGFuZWwsXG4gICAgICAgICAgICAgICdUYWJsZScsXG4gICAgICAgICAgICAgIHRoaXMuJChnby5UZXh0QmxvY2ssIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5QUk9DRVNTLCB7XG4gICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCAxMCwgMyksXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDYwLCA2MCksXG4gICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICksXG5cbiAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5MZWZ0LFxuICAgICAgICAgICAgYWxpZ25tZW50Rm9jdXM6IG5ldyBnby5TcG90KDAsIDAuNSwgOCwgMCksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgdGhpcy4kKGdvLlBhbmVsLCAnVmVydGljYWwnLCB7XG4gICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuUmlnaHQsXG4gICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMSwgMC41LCAtOCwgMCksXG4gICAgICAgICAgfSksXG4gICAgICAgICAgLy8gZm91ciBuYW1lZCBwb3J0cywgb25lIG9uIGVhY2ggc2lkZTpcblxuICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ1QnLCBnby5TcG90LlRvcCwgZ28uU3BvdC5Ub3BTaWRlLCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgICAgdGhpcy5tYWtlUG9ydCgnTCcsIGdvLlNwb3QuTGVmdCwgZ28uU3BvdC5MZWZ0U2lkZSwgdHJ1ZSwgdHJ1ZSksXG4gICAgICAgICAgdGhpcy5tYWtlUG9ydCgnUicsIGdvLlNwb3QuUmlnaHQsIGdvLlNwb3QuUmlnaHRTaWRlLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdCJywgZ28uU3BvdC5Cb3R0b20sIGdvLlNwb3QuQm90dG9tU2lkZSwgdHJ1ZSwgZmFsc2UpXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuU1BFQ0lBTF9TVE9SQUdFOlxuICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCBBdG9Hb2pzRWRpdG9yTW9kZWwuRU5VTV9URU1QTEFURVMuU1RPUkFHRSwge1xuICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBOYU4pLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgICAgICBnby5QaWN0dXJlLFxuICAgICAgICAgICAgICAgIGljb24sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5DZW50ZXIsXG4gICAgICAgICAgICAgICAgICBtaW5TaXplOiBuZXcgZ28uU2l6ZSg0MCwgNDApLFxuICAgICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoNTAsIDUwKSxcbiAgICAgICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ldyBnby5CaW5kaW5nKCdzb3VyY2UnLCAnaWNvbicpLm1ha2VUd29XYXkoKVxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApXG4gICAgICAgICAgKSxcblxuICAgICAgICAgIHRoaXMuJChnby5QYW5lbCwgJ1ZlcnRpY2FsJywge1xuICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkxlZnQsXG4gICAgICAgICAgICBhbGlnbm1lbnRGb2N1czogbmV3IGdvLlNwb3QoMCwgMC41LCA4LCAwKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICB0aGlzLiQoZ28uUGFuZWwsICdWZXJ0aWNhbCcsIHtcbiAgICAgICAgICAgIGFsaWdubWVudDogZ28uU3BvdC5SaWdodCxcbiAgICAgICAgICAgIGFsaWdubWVudEZvY3VzOiBuZXcgZ28uU3BvdCgxLCAwLjUsIC04LCAwKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICAvLyBmb3VyIG5hbWVkIHBvcnRzLCBvbmUgb24gZWFjaCBzaWRlOlxuXG4gICAgICAgICAgdGhpcy5tYWtlUG9ydCgnVCcsIGdvLlNwb3QuVG9wLCBnby5TcG90LlRvcFNpZGUsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdMJywgZ28uU3BvdC5MZWZ0LCBnby5TcG90LkxlZnRTaWRlLCB0cnVlLCB0cnVlKSxcbiAgICAgICAgICB0aGlzLm1ha2VQb3J0KCdSJywgZ28uU3BvdC5SaWdodCwgZ28uU3BvdC5SaWdodFNpZGUsIHRydWUsIHRydWUpLFxuICAgICAgICAgIHRoaXMubWFrZVBvcnQoJ0InLCBnby5TcG90LkJvdHRvbSwgZ28uU3BvdC5Cb3R0b21TaWRlLCB0cnVlLCBmYWxzZSlcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5TUEVDSUFMX1NUT1JFOlxuICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCAnU3RvcmUnLCB7XG4gICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCAxMCwgMyksXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDYwLCA2MCksXG4gICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgQXRvR29qc0VkaXRvck1vZGVsLkVOVU1fVEVNUExBVEVTLlNQRUNJQUxfRElTQ0hBUkdFOlxuICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCAnRGlzY2hhcmdlJywge1xuICAgICAgICAgICAgICAgIHJvdzogMCxcbiAgICAgICAgICAgICAgICBtYXJnaW46IG5ldyBnby5NYXJnaW4oMywgMywgMTAsIDMpLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKHNpemUudyAtIDIwLCBOYU4pLFxuICAgICAgICAgICAgICAgIHN0cm9rZTogJyM0NDQ0NDQnLFxuICAgICAgICAgICAgICAgIGZvbnQ6ICdub3JtYWwgMTBwdCBBcmlhbCcsXG4gICAgICAgICAgICAgICAgdGV4dEFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgIHRoaXMuJChnby5QaWN0dXJlLCBpY29uLCB7XG4gICAgICAgICAgICAgICAgcm93OiAxLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigwLCAwLCAxMCwgMCksXG4gICAgICAgICAgICAgICAgYWxpZ25tZW50OiBnby5TcG90LkNlbnRlcixcbiAgICAgICAgICAgICAgICBtYXhTaXplOiBuZXcgZ28uU2l6ZSg2MCwgNjApLFxuICAgICAgICAgICAgICAgIGltYWdlU3RyZXRjaDogZ28uR3JhcGhPYmplY3QuVW5pZm9ybSxcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEF0b0dvanNFZGl0b3JNb2RlbC5FTlVNX1RFTVBMQVRFUy5TUEVDSUFMX09USEVSOlxuICAgICAgICBub2RlID0gdGhpcy4kKFxuICAgICAgICAgIGdvLk5vZGUsXG4gICAgICAgICAgJ1Nwb3QnLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNsaWNrOiAoZSwgb2JqOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgaWYgKG9iaj8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIG9iaj8uZGF0YT8ub25TZWxlY3RlZChvYmo/LmRhdGEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2VsZWN0aW9uQ2hhbmdlZDogKGUpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFlLmlzU2VsZWN0ZWQgJiYgZT8uZGF0YT8ub25TZWxlY3RlZCkge1xuICAgICAgICAgICAgICAgIGU/LmRhdGE/Lm9uU2VsZWN0ZWQobnVsbCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBuZXcgZ28uQmluZGluZygnbG9jYXRpb24nLCAnbG9jJywgZ28uUG9pbnQucGFyc2UpLm1ha2VUd29XYXkoXG4gICAgICAgICAgICBnby5Qb2ludC5zdHJpbmdpZnlcbiAgICAgICAgICApLFxuICAgICAgICAgIHRoaXMuJChcbiAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgJ0F1dG8nLFxuICAgICAgICAgICAgeyB3aWR0aDogc2l6ZS53LCBoZWlnaHQ6IHNpemUuaCB9LFxuICAgICAgICAgICAgdGhpcy4kKGdvLlNoYXBlLCAnQ2lyY2xlJywge1xuICAgICAgICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICAgICAgICBzdHJva2U6ICcjMkQzQjc3JyxcbiAgICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDIsXG4gICAgICAgICAgICAgIC8vIHN0cm9rZURhc2hBcnJheTogWzUsIDVdLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0aGlzLiQoXG4gICAgICAgICAgICAgIGdvLlBhbmVsLFxuICAgICAgICAgICAgICAnVGFibGUnLFxuICAgICAgICAgICAgICB0aGlzLiQoZ28uVGV4dEJsb2NrLCAnT3RoZXInLCB7XG4gICAgICAgICAgICAgICAgcm93OiAwLFxuICAgICAgICAgICAgICAgIG1hcmdpbjogbmV3IGdvLk1hcmdpbigzLCAzLCAxMCwgMyksXG4gICAgICAgICAgICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoc2l6ZS53IC0gMjAsIE5hTiksXG4gICAgICAgICAgICAgICAgc3Ryb2tlOiAnIzQ0NDQ0NCcsXG4gICAgICAgICAgICAgICAgZm9udDogJ25vcm1hbCAxMHB0IEFyaWFsJyxcbiAgICAgICAgICAgICAgICB0ZXh0QWxpZ246ICdjZW50ZXInLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgdGhpcy4kKGdvLlBpY3R1cmUsIGljb24sIHtcbiAgICAgICAgICAgICAgICByb3c6IDEsXG4gICAgICAgICAgICAgICAgbWFyZ2luOiBuZXcgZ28uTWFyZ2luKDAsIDAsIDEwLCAwKSxcbiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IGdvLlNwb3QuQ2VudGVyLFxuICAgICAgICAgICAgICAgIG1heFNpemU6IG5ldyBnby5TaXplKDYwLCA2MCksXG4gICAgICAgICAgICAgICAgaW1hZ2VTdHJldGNoOiBnby5HcmFwaE9iamVjdC5Vbmlmb3JtLFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgaWYgKG5vZGUpIHtcbiAgICAgIHRoaXMubXlEaWFncmFtLm5vZGVUZW1wbGF0ZU1hcC5zZXQodGl0bGUsIG5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXJ0QW5pbWF0aW9uKCkge1xuICAgIGNvbnN0IGRpYWdyYW0gPSB0aGlzLm15RGlhZ3JhbTtcbiAgICAvLyBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAvLyAgICAgZGlhZ3JhbS5saW5rcy5lYWNoKChsaW5rKSA9PiB7XG4gICAgLy8gICAgIH0pO1xuICAgIC8vIH0pO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLmFuaW1hdGlvbkludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBjb25zdCBvbGRza2lwcyA9IGRpYWdyYW0uc2tpcHNVbmRvTWFuYWdlcjtcbiAgICAgICAgZGlhZ3JhbS5za2lwc1VuZG9NYW5hZ2VyID0gdHJ1ZTtcblxuICAgICAgICBkaWFncmFtLmxpbmtzLmVhY2goKGxpbmspID0+IHtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9IGxpbmsuZmluZE9iamVjdCgnUElQRScpO1xuICAgICAgICAgIGlmICghIXNoYXBlKSB7XG4gICAgICAgICAgICAvLyBjb25zdCBvZmYgPSBzaGFwZT8uc3Ryb2tlRGFzaE9mZnNldCAtIDM7XG4gICAgICAgICAgICBjb25zdCBvZmYgPSBzaGFwZT8uc3Ryb2tlRGFzaE9mZnNldCAtIDk7XG4gICAgICAgICAgICAvLyBhbmltYXRlIChtb3ZlKSB0aGUgc3Ryb2tlIGRhc2hcbiAgICAgICAgICAgIHNoYXBlLnN0cm9rZURhc2hPZmZzZXQgPSBvZmYgPD0gMCA/IDYwIDogb2ZmO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGRpYWdyYW0uc2tpcHNVbmRvTWFuYWdlciA9IG9sZHNraXBzO1xuICAgICAgfSwgNjAwKTtcbiAgICAgIC8vIDYwXG4gICAgfSBjYXRjaCAoZSkge31cbiAgfVxuXG4gIHN0b3BBbmltYXRpb24oKSB7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uSW50ZXJ2YWwpIHtcbiAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5hbmltYXRpb25JbnRlcnZhbCk7XG4gICAgfVxuICB9XG5cbiAgdG9EYXRhVVJMKHVybCwgY2FsbGJhY2spIHtcbiAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICAgIHJlYWRlci5vbmxvYWRlbmQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrKHJlYWRlci5yZXN1bHQpO1xuICAgICAgfTtcbiAgICAgIHJlYWRlci5yZWFkQXNEYXRhVVJMKHhoci5yZXNwb25zZSk7XG4gICAgfTtcbiAgICB4aHIub3BlbignR0VUJywgdXJsKTtcbiAgICB4aHIucmVzcG9uc2VUeXBlID0gJ2Jsb2InO1xuICAgIHhoci5zZW5kKCk7XG4gIH1cblxuICBnZXRCYXNlNjREaWFncmFtV2l0aEVtcHR5RGF0YSgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICAvLyBUZXN0XG4gICAgLy8gY29uc3QgbmV3V2luZG93ID0gd2luZG93Lm9wZW4oJycsICduZXdXaW5kb3cnKTtcbiAgICAvLyBpZiAoIW5ld1dpbmRvdykge1xuICAgIC8vICAgICByZXR1cm47XG4gICAgLy8gfVxuICAgIC8vIGNvbnN0IG5ld0RvY3VtZW50ID0gbmV3V2luZG93Py5kb2N1bWVudDtcbiAgICBpZiAoXG4gICAgICAhdGhpcy5teURpYWdyYW0/Lm1vZGVsPy5ub2RlRGF0YUFycmF5Py5sZW5ndGggJiZcbiAgICAgICF0aGlzLm15RGlhZ3JhbT8ubW9kZWw/LmxpbmtEYXRhQXJyYXk/Lmxlbmd0aFxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHN2ZyA9IHRoaXMubXlEaWFncmFtLm1ha2VTdmcoe1xuICAgICAgc2NhbGU6IHRoaXMuZGVmYXVsdFNjYWxlWm9vbVRvRml0LFxuICAgICAgbWF4U2l6ZTogbmV3IGdvLlNpemUoMTIwMCwgTmFOKSxcbiAgICAgIGJhY2tncm91bmQ6ICd3aGl0ZScsXG4gICAgICBwYWRkaW5nOiAyMCxcbiAgICAgIGVsZW1lbnRGaW5pc2hlZDogZnVuY3Rpb24gKGdyYXBoT2JqZWN0LCBzdmdFbGVtZW50KSB7XG4gICAgICAgIHN2Z0VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdjbGlwLXBhdGgnKTtcbiAgICAgICAgLy8gUmVwbGFjZSBJbWFnZSBVUkwgdG8gYmFzZTY0IC0+IEZvciBzaG93aW5nIFBpY3R1cmUgZWxlbWVudFxuICAgICAgICBpZiAoZ3JhcGhPYmplY3QgaW5zdGFuY2VvZiBnby5QaWN0dXJlKSB7XG4gICAgICAgICAgc2VsZi50b0RhdGFVUkwoc3ZnRWxlbWVudC5ocmVmLmJhc2VWYWwsIGZ1bmN0aW9uIChkYXRhVXJsKSB7XG4gICAgICAgICAgICBzdmdFbGVtZW50LnNldEF0dHJpYnV0ZSgnaHJlZicsIGRhdGFVcmwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1ha2UgVGV4dCBOb2RlIFNoYXBlIEJvcmRlclxuICAgICAgICBpZiAoZ3JhcGhPYmplY3Q/Lm5hbWUgPT09ICd0ZXh0Tm9kZVNoYXBlJykge1xuICAgICAgICAgIHN2Z0VsZW1lbnQuc2V0QXR0cmlidXRlKCdzdHJva2UnLCAncmdiYSg2NCwgMTgxLCAyMDYsIDAuNiknKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbXB0eSBWYWx1ZVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZ3JhcGhPYmplY3Q/Lm5hbWUgPT09ICd0ZXh0QmxvY2tWYWx1ZScgfHxcbiAgICAgICAgICBncmFwaE9iamVjdD8ubmFtZSA9PT0gJ3RleHRCbG9ja1VuaXRQcmVmaXhlcydcbiAgICAgICAgKSB7XG4gICAgICAgICAgc3ZnRWxlbWVudC50ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdmdFbGVtZW50LmNsaXBQYXRoKSB7XG4gICAgICAgICAgc3ZnRWxlbWVudC5jbGlwUGF0aCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBjYWxsYmFjazogKHN2ZykgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdmdTdHIgPSBuZXcgWE1MU2VyaWFsaXplcigpLnNlcmlhbGl6ZVRvU3RyaW5nKHN2Zyk7XG4gICAgICAgICAgLy8gRm9yIFRlc3RcbiAgICAgICAgICAvLyBuZXdEb2N1bWVudD8uYm9keT8uYXBwZW5kQ2hpbGQoc3ZnKTtcblxuICAgICAgICAgIGNvbnN0IGJhc2U2NFN2ZyA9IGBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7d2luZG93LmJ0b2EoXG4gICAgICAgICAgICB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoc3ZnU3RyKSlcbiAgICAgICAgICApfWA7XG4gICAgICAgICAgY29uc3QgaW1nID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgaW1nLnNyYyA9IGJhc2U2NFN2ZztcbiAgICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgICAvLyBnZXQgY2FudmFzIGNvbnRleHQgZm9yIGRyYXdpbmcgb24gY2FudmFzXG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGNhbnZhcy5nZXRDb250ZXh0KCcyZCcpO1xuICAgICAgICAgIGltZy5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBjb25zdCBzdmdXaWR0aCA9IGltZy53aWR0aDtcbiAgICAgICAgICAgIGNvbnN0IHN2Z0hlaWdodCA9IGltZy5oZWlnaHQ7XG5cbiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHN2Z1dpZHRoO1xuICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHN2Z0hlaWdodDtcblxuICAgICAgICAgICAgaWYgKGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcbiAgICAgICAgICAgICAgY29uc3QgYmFzZTY0UE5HID0gY2FudmFzLnRvRGF0YVVSTCgnaW1hZ2UvanBlZycpO1xuICAgICAgICAgICAgICBzZWxmLmVtaXRJbWFnZVRvcG9sb2d5KFxuICAgICAgICAgICAgICAgIGJhc2U2NFBORy5yZXBsYWNlKCdkYXRhOmltYWdlL2pwZWc7YmFzZTY0LCcsICcnKVxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH0sIDEwMDApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGVtaXRJbWFnZVRvcG9sb2d5KGJhc2U2NCkge1xuICAgIHRoaXMuY2FsbGJhY2tJbWFnZVRvcG9sb2d5LmVtaXQoYmFzZTY0KTtcbiAgfVxuXG4gIG9wZW5BY3Rpb25NZW51KCkge1xuICAgIC8vIFdoZW4gdGhpcyBub2RlIGlzIGNsaWNrZWQsIGFkanVzdCB0aGUgbWVudSBwb3NpdGlvblxuICAgIGNvbnN0IG1vdXNlUHQgPSB0aGlzLm15RGlhZ3JhbS5sYXN0SW5wdXQudmlld1BvaW50O1xuXG4gICAgLy8gLy8gV2hlbiB0aGlzIG5vZGUgaXMgY2xpY2tlZCwgZGlzcGxheSB0aGUgZHJvcGRvd24gbWVudVxuICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLmFjdGlvbk1lbnVJZCk7XG4gICAgaWYgKG1lbnUpIHtcbiAgICAgIG1lbnUuc3R5bGUuZGlzcGxheSA9ICcnO1xuICAgICAgbWVudS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICBtZW51LnN0eWxlLmxlZnQgPSBtb3VzZVB0LnggKyAncHgnO1xuICAgICAgbWVudS5zdHlsZS50b3AgPSBtb3VzZVB0LnkgKyAncHgnO1xuXG4gICAgICB0aGlzLm1lbnVUcmlnZ2VyLm9wZW5NZW51KCk7XG4gICAgfVxuICB9XG5cbiAgdW5zdWJzY3JpYmVBbGwoKSB7XG4gICAgaWYgKHRoaXMuX3N1YnNjcmlwdGlvbkxpc3QpIHtcbiAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbkxpc3QudW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uTGlzdCA9IG5ldyBTdWJzY3JpcHRpb24oKTtcbiAgfVxuXG4gIGFkZFN1YnNjcmliZXMoLi4uc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10pIHtcbiAgICBzdWJzY3JpcHRpb25zLmZvckVhY2goKGVsKSA9PiB7XG4gICAgICB0aGlzLl9zdWJzY3JpcHRpb25MaXN0LmFkZChlbCk7XG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBBdG9EZWZhdWx0R29qc0VkaXRvciB7XG4gIGV4cG9ydCBlbnVtIEVOVU1fQUNUSU9OUyB7XG4gICAgREVUQUlMUyA9ICdPcGVuIGRldGFpbHMgJiB3aXphcmQnLFxuICAgIE9OTFlfREVUQUlMUyA9ICdPcGVuIGRldGFpbHMnLFxuICAgIFJFTkFNRSA9ICdSZW5hbWUgdGhpcyBib3gnLFxuICAgIE9VVEZMT1cgPSAnQ3JlYXRlIGFuIG91dGZsb3cnLFxuICAgIERFTEVURSA9ICdEZWxldGUnLFxuICAgIElOU0lHSFQgPSAnSW5TaWdodCB0YWcgbWFwcGluZycsXG4gICAgREFUQV9NQVBQSU5HID0gJ0RhdGEgTWFwcGluZycsXG4gICAgTU9SRSA9ICdNb3JlJyxcbiAgICBGTE9XX0RFVEFJTFMgPSAnRmxvdyBkZXRhaWxzJyxcbiAgICBGTE9XX0RFVEFJTFNfQU5EX1dJWkFSRCA9ICdGbG93IGRldGFpbHMgJiB3aXphcmQnLCAvLyBvbmx5IG5vdyBmb3IgQ29vbGluZyBUb3dlclxuICAgIEFTU0VUX1BBUkFNRVRFUlMgPSAnQXNzZXQgcGFyYW1ldGVycycsXG4gICAgQ0hBTkdFX0lDT04gPSAnQ2hhbmdlIGljb24nLFxuICB9XG5cbiAgZXhwb3J0IGNvbnN0IEFDVElPTlM6IGFueSA9IHtcbiAgICBbRU5VTV9BQ1RJT05TLkRFVEFJTFNdOiB7XG4gICAgICBuYW1lOiBFTlVNX0FDVElPTlMuREVUQUlMUyxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtbWVtby1jaXJjbGUtaW5mbycsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuRkxPV19ERVRBSUxTXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMUyxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtYXJyb3ctcHJvZ3Jlc3MnLFxuICAgICAgb25DbGljazogKCkgPT4ge30sXG4gICAgfSxcbiAgICBbRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMU19BTkRfV0laQVJEXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkZMT1dfREVUQUlMU19BTkRfV0laQVJELFxuICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1hcnJvdy1wcm9ncmVzcycsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuQVNTRVRfUEFSQU1FVEVSU106IHtcbiAgICAgIG5hbWU6IEVOVU1fQUNUSU9OUy5BU1NFVF9QQVJBTUVURVJTLFxuICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1ib3gtYXJjaGl2ZScsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuT05MWV9ERVRBSUxTXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLk9OTFlfREVUQUlMUyxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtbWVtby1jaXJjbGUtaW5mbycsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuUkVOQU1FXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLlJFTkFNRSxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtaW5wdXQtdGV4dCcsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuT1VURkxPV106IHtcbiAgICAgIG5hbWU6IEVOVU1fQUNUSU9OUy5PVVRGTE9XLFxuICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1kaWFncmFtLW5lc3RlZCcsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuREVMRVRFXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkRFTEVURSxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYWwgZmEtdHJhc2gtY2FuJyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgIH0sXG4gICAgW0VOVU1fQUNUSU9OUy5JTlNJR0hUXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLklOU0lHSFQsXG4gICAgICBpY29uQ2xhc3NOYW1lOiAnZmFyIGZhLXRhZycsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICAgIFtFTlVNX0FDVElPTlMuREFUQV9NQVBQSU5HXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkRBVEFfTUFQUElORyxcbiAgICAgIGljb25DbGFzc05hbWU6ICdmYXIgZmEtdGFnJyxcbiAgICAgIG9uQ2xpY2s6ICgpID0+IHt9LFxuICAgIH0sXG4gICAgW0VOVU1fQUNUSU9OUy5NT1JFXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLk1PUkUsXG4gICAgICBpY29uQ2xhc3NOYW1lOiAnZmFsIGZhLW1lbW8tY2lyY2xlLWluZm8nLFxuICAgICAgb25DbGljazogKCkgPT4ge30sXG4gICAgfSxcbiAgICBbRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OXToge1xuICAgICAgbmFtZTogRU5VTV9BQ1RJT05TLkNIQU5HRV9JQ09OLFxuICAgICAgaWNvbkNsYXNzTmFtZTogJ2ZhciBmYS1pbWFnZScsXG4gICAgICBvbkNsaWNrOiAoKSA9PiB7fSxcbiAgICB9LFxuICB9O1xuXG4gIGV4cG9ydCBjb25zdCBESVNUQU5DRV8yX09VVFBVVCA9IDYwO1xufVxuIl19
|