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