ato-water-lib 0.0.7 → 0.0.10

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