@kepler.gl/mcp 0.0.0-stage → 3.3.0-alpha.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/commands/add-column-command.js +192 -0
- package/dist/cjs/commands/basemap-command.js +80 -0
- package/dist/cjs/commands/boundary-command.js +81 -0
- package/dist/cjs/commands/command-wrappers.js +122 -0
- package/dist/cjs/commands/dataset-context-command.js +87 -0
- package/dist/cjs/commands/index.js +230 -0
- package/dist/cjs/commands/layer-creation-command.js +534 -0
- package/dist/cjs/commands/layer-style-command.js +136 -0
- package/dist/cjs/commands/load-data-command.js +270 -0
- package/dist/cjs/commands/save-data-command.js +118 -0
- package/dist/cjs/commands/split-view-command.js +261 -0
- package/dist/cjs/commands/table-command.js +199 -0
- package/dist/cjs/commands/time-filter-command.js +289 -0
- package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
- package/dist/cjs/commands/types.js +6 -0
- package/dist/cjs/commands/utils.js +536 -0
- package/dist/cjs/commands/view-mode-command.js +94 -0
- package/dist/cjs/index.js +39 -0
- package/dist/cjs/map-contract.js +6 -0
- package/dist/cjs/server/bridge-server.js +435 -0
- package/dist/cjs/server/index.js +31 -0
- package/dist/cjs/server/stdio.js +201 -0
- package/dist/cjs/types.js +30 -0
- package/dist/commands/add-column-command.d.ts +4 -0
- package/dist/commands/basemap-command.d.ts +4 -0
- package/dist/commands/boundary-command.d.ts +4 -0
- package/dist/commands/command-wrappers.d.ts +52 -0
- package/dist/commands/dataset-context-command.d.ts +4 -0
- package/dist/commands/index.d.ts +31 -0
- package/dist/commands/layer-creation-command.d.ts +8 -0
- package/dist/commands/layer-style-command.d.ts +4 -0
- package/dist/commands/load-data-command.d.ts +4 -0
- package/dist/commands/save-data-command.d.ts +4 -0
- package/dist/commands/split-view-command.d.ts +4 -0
- package/dist/commands/table-command.d.ts +4 -0
- package/dist/commands/time-filter-command.d.ts +13 -0
- package/dist/commands/toggle-time-filter-command.d.ts +4 -0
- package/dist/commands/types.d.ts +132 -0
- package/dist/commands/utils.d.ts +138 -0
- package/dist/commands/view-mode-command.d.ts +4 -0
- package/dist/esm/commands/add-column-command.js +185 -0
- package/dist/esm/commands/basemap-command.js +72 -0
- package/dist/esm/commands/boundary-command.js +73 -0
- package/dist/esm/commands/command-wrappers.js +114 -0
- package/dist/esm/commands/dataset-context-command.js +79 -0
- package/dist/esm/commands/index.js +51 -0
- package/dist/esm/commands/layer-creation-command.js +527 -0
- package/dist/esm/commands/layer-style-command.js +130 -0
- package/dist/esm/commands/load-data-command.js +264 -0
- package/dist/esm/commands/save-data-command.js +112 -0
- package/dist/esm/commands/split-view-command.js +255 -0
- package/dist/esm/commands/table-command.js +194 -0
- package/dist/esm/commands/time-filter-command.js +280 -0
- package/dist/esm/commands/toggle-time-filter-command.js +147 -0
- package/dist/esm/commands/types.js +3 -0
- package/dist/esm/commands/utils.js +521 -0
- package/dist/esm/commands/view-mode-command.js +86 -0
- package/dist/esm/index.js +20 -0
- package/dist/esm/map-contract.js +3 -0
- package/dist/esm/server/bridge-server.js +428 -0
- package/dist/esm/server/index.js +13 -0
- package/dist/esm/server/stdio.js +198 -0
- package/dist/esm/types.js +24 -0
- package/dist/index.d.ts +15 -0
- package/dist/map-contract.d.ts +31 -0
- package/dist/server/bridge-server.d.ts +53 -0
- package/dist/server/index.d.ts +9 -0
- package/dist/server/stdio.d.ts +2 -0
- package/dist/types.d.ts +24 -0
- package/package.json +84 -4
- package/skill/kepler/SKILL.md +438 -0
- package/skill/kepler/skill.yaml +4 -0
- package/README.md +0 -3
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getSplitViewCommand = getSplitViewCommand;
|
|
8
|
+
exports.splitViewCommandId = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
11
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
+
var _zod = require("zod");
|
|
13
|
+
var _actions = require("@kepler.gl/actions");
|
|
14
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
15
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
16
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
|
|
17
|
+
// Copyright contributors to the kepler.gl project
|
|
18
|
+
var sleep = function sleep(ms) {
|
|
19
|
+
return new Promise(function (resolve) {
|
|
20
|
+
return setTimeout(resolve, ms);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
var splitViewCommandId = exports.splitViewCommandId = 'map.split-view';
|
|
24
|
+
function getSplitViewCommand(ctx) {
|
|
25
|
+
return {
|
|
26
|
+
id: splitViewCommandId,
|
|
27
|
+
name: 'Toggle split map view',
|
|
28
|
+
group: 'Map',
|
|
29
|
+
description: "Enable or disable the dual-map (split view) comparison mode.\n\nWhen enabled, the map splits into two panels for side-by-side comparison. Pass layerIdsForMap0 / layerIdsForMap1 to assign which layers show ONLY in the left / right panel; without these, all layers show on both panels (no comparison).\n\nWhen disabled, the map returns to a single panel.\n\nUse the SAME colorBy / colorType for the layers being compared, so the comparison is fair.",
|
|
30
|
+
metadata: {
|
|
31
|
+
readOnly: false,
|
|
32
|
+
riskLevel: 'low',
|
|
33
|
+
idempotent: true
|
|
34
|
+
},
|
|
35
|
+
inputSchema: _zod.z.object({
|
|
36
|
+
action: _zod.z["enum"](['enable', 'disable']).describe('"enable" activates dual map mode; "disable" returns to a single map.'),
|
|
37
|
+
layerIdsForMap0: _zod.z.array(_zod.z.string()).optional().describe('Layer IDs to show ONLY in the LEFT panel. Layers not listed are hidden from the left panel.'),
|
|
38
|
+
layerIdsForMap1: _zod.z.array(_zod.z.string()).optional().describe('Layer IDs to show ONLY in the RIGHT panel. Layers not listed are hidden from the right panel.')
|
|
39
|
+
}),
|
|
40
|
+
execute: function () {
|
|
41
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
|
|
42
|
+
var _ref, action, layerIdsForMap0, layerIdsForMap1, _iterator, _step, _step$value, name, _ids, visState, isSplit, hasLayerAssignment, updatedVis, splitMaps, allLayers, allLayerIds, allLayerIdSet, _iterator2, _step2, _step2$value, panel, ids, unknown, _splitMaps$, map0Layers, desiredSet0, _iterator3, _step3, layerId, isVisible, shouldBeVisible, _freshSplitMaps$, freshSplitMaps, map1Layers, desiredSet1, _iterator4, _step4, _layerId, _isVisible, _shouldBeVisible, finalVis, layers;
|
|
43
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
44
|
+
while (1) switch (_context.prev = _context.next) {
|
|
45
|
+
case 0:
|
|
46
|
+
_ref = input !== null && input !== void 0 ? input : {}, action = _ref.action, layerIdsForMap0 = _ref.layerIdsForMap0, layerIdsForMap1 = _ref.layerIdsForMap1;
|
|
47
|
+
_context.prev = 1;
|
|
48
|
+
if (!(action !== 'enable' && action !== 'disable')) {
|
|
49
|
+
_context.next = 4;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
return _context.abrupt("return", {
|
|
53
|
+
success: false,
|
|
54
|
+
commandId: splitViewCommandId,
|
|
55
|
+
error: "Invalid action \"".concat(String(action), "\". Must be \"enable\" or \"disable\"."),
|
|
56
|
+
data: {
|
|
57
|
+
instruction: 'Pass action: "enable" to activate dual map mode, or "disable" to return to a single map.'
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
case 4:
|
|
61
|
+
// Runtime guard: the bridge/webMCP call execute without zod parsing, so
|
|
62
|
+
// a string/object passed as layerIdsForMap0/1 must not be treated as
|
|
63
|
+
// iterable (`.length`, `.filter`) and produce surprising layer toggles.
|
|
64
|
+
// Reject non-array or non-string entries when these fields are provided.
|
|
65
|
+
_iterator = _createForOfIteratorHelper([['layerIdsForMap0', layerIdsForMap0], ['layerIdsForMap1', layerIdsForMap1]]);
|
|
66
|
+
_context.prev = 5;
|
|
67
|
+
_iterator.s();
|
|
68
|
+
case 7:
|
|
69
|
+
if ((_step = _iterator.n()).done) {
|
|
70
|
+
_context.next = 13;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
_step$value = (0, _slicedToArray2["default"])(_step.value, 2), name = _step$value[0], _ids = _step$value[1];
|
|
74
|
+
if (!(_ids !== undefined && (!Array.isArray(_ids) || _ids.some(function (id) {
|
|
75
|
+
return typeof id !== 'string' || id.length === 0;
|
|
76
|
+
})))) {
|
|
77
|
+
_context.next = 11;
|
|
78
|
+
break;
|
|
79
|
+
}
|
|
80
|
+
return _context.abrupt("return", {
|
|
81
|
+
success: false,
|
|
82
|
+
commandId: splitViewCommandId,
|
|
83
|
+
error: "Invalid ".concat(name, ". Must be an array of non-empty layer id strings."),
|
|
84
|
+
data: {
|
|
85
|
+
instruction: "Pass ".concat(name, " as an array of layer id strings, or omit it to show all layers on that panel.")
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
case 11:
|
|
89
|
+
_context.next = 7;
|
|
90
|
+
break;
|
|
91
|
+
case 13:
|
|
92
|
+
_context.next = 18;
|
|
93
|
+
break;
|
|
94
|
+
case 15:
|
|
95
|
+
_context.prev = 15;
|
|
96
|
+
_context.t0 = _context["catch"](5);
|
|
97
|
+
_iterator.e(_context.t0);
|
|
98
|
+
case 18:
|
|
99
|
+
_context.prev = 18;
|
|
100
|
+
_iterator.f();
|
|
101
|
+
return _context.finish(18);
|
|
102
|
+
case 21:
|
|
103
|
+
visState = ctx.getVisState();
|
|
104
|
+
isSplit = visState.splitMaps && visState.splitMaps.length > 1;
|
|
105
|
+
if (!(action === 'disable')) {
|
|
106
|
+
_context.next = 26;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
if (isSplit) {
|
|
110
|
+
// Close the RIGHT panel (index 1) so the LEFT panel (map0) survives:
|
|
111
|
+
// `closeSpecificMapAtIndex` keeps `1 - payload`, so closing 0 would
|
|
112
|
+
// keep the right panel and flip layer visibility to map1's config.
|
|
113
|
+
ctx.dispatch((0, _actions.toggleSplitMap)(1));
|
|
114
|
+
}
|
|
115
|
+
return _context.abrupt("return", {
|
|
116
|
+
success: true,
|
|
117
|
+
commandId: splitViewCommandId,
|
|
118
|
+
data: {
|
|
119
|
+
details: 'Split map view disabled. Returned to single map view.'
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
case 26:
|
|
123
|
+
// enable
|
|
124
|
+
if (!isSplit) {
|
|
125
|
+
ctx.dispatch((0, _actions.toggleSplitMap)(0));
|
|
126
|
+
}
|
|
127
|
+
hasLayerAssignment = layerIdsForMap0 && layerIdsForMap0.length > 0 || layerIdsForMap1 && layerIdsForMap1.length > 0;
|
|
128
|
+
if (!hasLayerAssignment) {
|
|
129
|
+
_context.next = 58;
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
_context.next = 31;
|
|
133
|
+
return sleep(200);
|
|
134
|
+
case 31:
|
|
135
|
+
updatedVis = ctx.getVisState();
|
|
136
|
+
splitMaps = updatedVis.splitMaps;
|
|
137
|
+
if (!(splitMaps && splitMaps.length > 1)) {
|
|
138
|
+
_context.next = 58;
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
allLayers = updatedVis.layers || [];
|
|
142
|
+
allLayerIds = allLayers.map(function (l) {
|
|
143
|
+
return l.id;
|
|
144
|
+
}); // Fail fast on unknown layer ids — silently ignoring them would
|
|
145
|
+
// hide every real layer not listed and produce an unexpected blank
|
|
146
|
+
// panel.
|
|
147
|
+
allLayerIdSet = new Set(allLayerIds);
|
|
148
|
+
_iterator2 = _createForOfIteratorHelper([['left (map0)', layerIdsForMap0], ['right (map1)', layerIdsForMap1]]);
|
|
149
|
+
_context.prev = 38;
|
|
150
|
+
_iterator2.s();
|
|
151
|
+
case 40:
|
|
152
|
+
if ((_step2 = _iterator2.n()).done) {
|
|
153
|
+
_context.next = 48;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
_step2$value = (0, _slicedToArray2["default"])(_step2.value, 2), panel = _step2$value[0], ids = _step2$value[1];
|
|
157
|
+
if (!(ids && ids.length > 0)) {
|
|
158
|
+
_context.next = 46;
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
unknown = ids.filter(function (id) {
|
|
162
|
+
return !allLayerIdSet.has(id);
|
|
163
|
+
});
|
|
164
|
+
if (!(unknown.length > 0)) {
|
|
165
|
+
_context.next = 46;
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
throw new Error("Unknown layer id(s) for the ".concat(panel, " panel: ").concat(unknown.join(', '), ". ") + "Available layer ids: ".concat(allLayerIds.join(', ')));
|
|
169
|
+
case 46:
|
|
170
|
+
_context.next = 40;
|
|
171
|
+
break;
|
|
172
|
+
case 48:
|
|
173
|
+
_context.next = 53;
|
|
174
|
+
break;
|
|
175
|
+
case 50:
|
|
176
|
+
_context.prev = 50;
|
|
177
|
+
_context.t1 = _context["catch"](38);
|
|
178
|
+
_iterator2.e(_context.t1);
|
|
179
|
+
case 53:
|
|
180
|
+
_context.prev = 53;
|
|
181
|
+
_iterator2.f();
|
|
182
|
+
return _context.finish(53);
|
|
183
|
+
case 56:
|
|
184
|
+
if (layerIdsForMap0 && layerIdsForMap0.length > 0) {
|
|
185
|
+
map0Layers = ((_splitMaps$ = splitMaps[0]) === null || _splitMaps$ === void 0 ? void 0 : _splitMaps$.layers) || {};
|
|
186
|
+
desiredSet0 = new Set(layerIdsForMap0);
|
|
187
|
+
_iterator3 = _createForOfIteratorHelper(allLayerIds);
|
|
188
|
+
try {
|
|
189
|
+
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
190
|
+
layerId = _step3.value;
|
|
191
|
+
// Coerce to boolean: a missing entry means "hidden", and
|
|
192
|
+
// `toggleLayerForMapUpdater` toggles missing entries to visible.
|
|
193
|
+
isVisible = Boolean(map0Layers[layerId]);
|
|
194
|
+
shouldBeVisible = desiredSet0.has(layerId);
|
|
195
|
+
if (isVisible !== shouldBeVisible) {
|
|
196
|
+
ctx.dispatch((0, _actions.toggleLayerForMap)(0, layerId));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
} catch (err) {
|
|
200
|
+
_iterator3.e(err);
|
|
201
|
+
} finally {
|
|
202
|
+
_iterator3.f();
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
if (layerIdsForMap1 && layerIdsForMap1.length > 0) {
|
|
206
|
+
freshSplitMaps = ctx.getVisState().splitMaps;
|
|
207
|
+
map1Layers = (freshSplitMaps === null || freshSplitMaps === void 0 || (_freshSplitMaps$ = freshSplitMaps[1]) === null || _freshSplitMaps$ === void 0 ? void 0 : _freshSplitMaps$.layers) || {};
|
|
208
|
+
desiredSet1 = new Set(layerIdsForMap1);
|
|
209
|
+
_iterator4 = _createForOfIteratorHelper(allLayerIds);
|
|
210
|
+
try {
|
|
211
|
+
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
212
|
+
_layerId = _step4.value;
|
|
213
|
+
// Coerce to boolean: a missing entry means "hidden", and
|
|
214
|
+
// `toggleLayerForMapUpdater` toggles missing entries to visible.
|
|
215
|
+
_isVisible = Boolean(map1Layers[_layerId]);
|
|
216
|
+
_shouldBeVisible = desiredSet1.has(_layerId);
|
|
217
|
+
if (_isVisible !== _shouldBeVisible) {
|
|
218
|
+
ctx.dispatch((0, _actions.toggleLayerForMap)(1, _layerId));
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
} catch (err) {
|
|
222
|
+
_iterator4.e(err);
|
|
223
|
+
} finally {
|
|
224
|
+
_iterator4.f();
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
case 58:
|
|
228
|
+
finalVis = ctx.getVisState();
|
|
229
|
+
layers = finalVis.layers || [];
|
|
230
|
+
return _context.abrupt("return", {
|
|
231
|
+
success: true,
|
|
232
|
+
commandId: splitViewCommandId,
|
|
233
|
+
data: {
|
|
234
|
+
details: "Split map view enabled. ".concat(layers.length, " layer(s) available.").concat(hasLayerAssignment ? " Left panel: ".concat((layerIdsForMap0 || []).length, " layer(s), Right panel: ").concat((layerIdsForMap1 || []).length, " layer(s).") : ' All layers visible on both panels. Provide layerIdsForMap0/layerIdsForMap1 to assign layers to each panel.')
|
|
235
|
+
}
|
|
236
|
+
});
|
|
237
|
+
case 63:
|
|
238
|
+
_context.prev = 63;
|
|
239
|
+
_context.t2 = _context["catch"](1);
|
|
240
|
+
return _context.abrupt("return", {
|
|
241
|
+
success: false,
|
|
242
|
+
commandId: splitViewCommandId,
|
|
243
|
+
error: _context.t2 instanceof Error ? _context.t2.message : 'Unknown error',
|
|
244
|
+
data: {
|
|
245
|
+
instruction: 'Check that a map is loaded and layers exist. If the error persists, ask the user to try with different parameters.'
|
|
246
|
+
}
|
|
247
|
+
});
|
|
248
|
+
case 66:
|
|
249
|
+
case "end":
|
|
250
|
+
return _context.stop();
|
|
251
|
+
}
|
|
252
|
+
}, _callee, null, [[1, 63], [5, 15, 18, 21], [38, 50, 53, 56]]);
|
|
253
|
+
}));
|
|
254
|
+
function execute(_x, _x2) {
|
|
255
|
+
return _execute.apply(this, arguments);
|
|
256
|
+
}
|
|
257
|
+
return execute;
|
|
258
|
+
}()
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJyIiwiZSIsInQiLCJTeW1ib2wiLCJpdGVyYXRvciIsIkFycmF5IiwiaXNBcnJheSIsIl91bnN1cHBvcnRlZEl0ZXJhYmxlVG9BcnJheSIsImxlbmd0aCIsIl9uIiwiRiIsInMiLCJuIiwiZG9uZSIsInZhbHVlIiwiZiIsIlR5cGVFcnJvciIsIm8iLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJzbGVlcCIsIm1zIiwiUHJvbWlzZSIsInJlc29sdmUiLCJzZXRUaW1lb3V0Iiwic3BsaXRWaWV3Q29tbWFuZElkIiwiZXhwb3J0cyIsImdldFNwbGl0Vmlld0NvbW1hbmQiLCJjdHgiLCJpZCIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwiaWRlbXBvdGVudCIsImlucHV0U2NoZW1hIiwieiIsIm9iamVjdCIsImFjdGlvbiIsImRlc2NyaWJlIiwibGF5ZXJJZHNGb3JNYXAwIiwiYXJyYXkiLCJzdHJpbmciLCJvcHRpb25hbCIsImxheWVySWRzRm9yTWFwMSIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yMiIsIl9yZWdlbmVyYXRvciIsIm1hcmsiLCJfY2FsbGVlIiwiX2V4ZWNDdHgiLCJpbnB1dCIsIl9yZWYiLCJfaXRlcmF0b3IiLCJfc3RlcCIsIl9zdGVwJHZhbHVlIiwiX2lkcyIsInZpc1N0YXRlIiwiaXNTcGxpdCIsImhhc0xheWVyQXNzaWdubWVudCIsInVwZGF0ZWRWaXMiLCJzcGxpdE1hcHMiLCJhbGxMYXllcnMiLCJhbGxMYXllcklkcyIsImFsbExheWVySWRTZXQiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiX3N0ZXAyJHZhbHVlIiwicGFuZWwiLCJpZHMiLCJ1bmtub3duIiwiX3NwbGl0TWFwcyQiLCJtYXAwTGF5ZXJzIiwiZGVzaXJlZFNldDAiLCJfaXRlcmF0b3IzIiwiX3N0ZXAzIiwibGF5ZXJJZCIsImlzVmlzaWJsZSIsInNob3VsZEJlVmlzaWJsZSIsIl9mcmVzaFNwbGl0TWFwcyQiLCJmcmVzaFNwbGl0TWFwcyIsIm1hcDFMYXllcnMiLCJkZXNpcmVkU2V0MSIsIl9pdGVyYXRvcjQiLCJfc3RlcDQiLCJfbGF5ZXJJZCIsIl9pc1Zpc2libGUiLCJfc2hvdWxkQmVWaXNpYmxlIiwiZmluYWxWaXMiLCJsYXllcnMiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZXJyb3IiLCJjb25jYXQiLCJTdHJpbmciLCJkYXRhIiwiaW5zdHJ1Y3Rpb24iLCJfc2xpY2VkVG9BcnJheTIiLCJ1bmRlZmluZWQiLCJzb21lIiwidDAiLCJmaW5pc2giLCJnZXRWaXNTdGF0ZSIsImRpc3BhdGNoIiwidG9nZ2xlU3BsaXRNYXAiLCJkZXRhaWxzIiwibWFwIiwibCIsIlNldCIsImZpbHRlciIsImhhcyIsIkVycm9yIiwiam9pbiIsInQxIiwiQm9vbGVhbiIsInRvZ2dsZUxheWVyRm9yTWFwIiwiZXJyIiwidDIiLCJtZXNzYWdlIiwic3RvcCIsIl94IiwiX3gyIiwiYXBwbHkiLCJhcmd1bWVudHMiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvc3BsaXQtdmlldy1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RvZ2dsZVNwbGl0TWFwLCB0b2dnbGVMYXllckZvck1hcH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB0eXBlIHtLZXBsZXJDb250ZXh0fSBmcm9tICcuL3R5cGVzJztcblxuY29uc3Qgc2xlZXAgPSAobXM6IG51bWJlcikgPT4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZpZXdDb21tYW5kSWQgPSAnbWFwLnNwbGl0LXZpZXcnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BsaXRWaWV3Q29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICBuYW1lOiAnVG9nZ2xlIHNwbGl0IG1hcCB2aWV3JyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246IGBFbmFibGUgb3IgZGlzYWJsZSB0aGUgZHVhbC1tYXAgKHNwbGl0IHZpZXcpIGNvbXBhcmlzb24gbW9kZS5cblxuV2hlbiBlbmFibGVkLCB0aGUgbWFwIHNwbGl0cyBpbnRvIHR3byBwYW5lbHMgZm9yIHNpZGUtYnktc2lkZSBjb21wYXJpc29uLiBQYXNzIGxheWVySWRzRm9yTWFwMCAvIGxheWVySWRzRm9yTWFwMSB0byBhc3NpZ24gd2hpY2ggbGF5ZXJzIHNob3cgT05MWSBpbiB0aGUgbGVmdCAvIHJpZ2h0IHBhbmVsOyB3aXRob3V0IHRoZXNlLCBhbGwgbGF5ZXJzIHNob3cgb24gYm90aCBwYW5lbHMgKG5vIGNvbXBhcmlzb24pLlxuXG5XaGVuIGRpc2FibGVkLCB0aGUgbWFwIHJldHVybnMgdG8gYSBzaW5nbGUgcGFuZWwuXG5cblVzZSB0aGUgU0FNRSBjb2xvckJ5IC8gY29sb3JUeXBlIGZvciB0aGUgbGF5ZXJzIGJlaW5nIGNvbXBhcmVkLCBzbyB0aGUgY29tcGFyaXNvbiBpcyBmYWlyLmAsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ2xvdycsIGlkZW1wb3RlbnQ6IHRydWV9LFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBhY3Rpb246IHpcbiAgICAgICAgLmVudW0oWydlbmFibGUnLCAnZGlzYWJsZSddKVxuICAgICAgICAuZGVzY3JpYmUoJ1wiZW5hYmxlXCIgYWN0aXZhdGVzIGR1YWwgbWFwIG1vZGU7IFwiZGlzYWJsZVwiIHJldHVybnMgdG8gYSBzaW5nbGUgbWFwLicpLFxuICAgICAgbGF5ZXJJZHNGb3JNYXAwOiB6XG4gICAgICAgIC5hcnJheSh6LnN0cmluZygpKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ0xheWVyIElEcyB0byBzaG93IE9OTFkgaW4gdGhlIExFRlQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgbGVmdCBwYW5lbC4nXG4gICAgICAgICksXG4gICAgICBsYXllcklkc0Zvck1hcDE6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAnTGF5ZXIgSURzIHRvIHNob3cgT05MWSBpbiB0aGUgUklHSFQgcGFuZWwuIExheWVycyBub3QgbGlzdGVkIGFyZSBoaWRkZW4gZnJvbSB0aGUgcmlnaHQgcGFuZWwuJ1xuICAgICAgICApXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHthY3Rpb24sIGxheWVySWRzRm9yTWFwMCwgbGF5ZXJJZHNGb3JNYXAxfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBhY3Rpb246ICdlbmFibGUnIHwgJ2Rpc2FibGUnO1xuICAgICAgICBsYXllcklkc0Zvck1hcDA/OiBzdHJpbmdbXTtcbiAgICAgICAgbGF5ZXJJZHNGb3JNYXAxPzogc3RyaW5nW107XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgbWlzc2luZy9pbnZhbGlkIGFjdGlvbiBtdXN0IG5vdCBmYWxsIHRocm91Z2ggdG8gdGhlIGVuYWJsZSBwYXRoIGFuZFxuICAgICAgICAvLyB0b2dnbGUgc3BsaXQgdmlldyB1bmV4cGVjdGVkbHkuXG4gICAgICAgIGlmIChhY3Rpb24gIT09ICdlbmFibGUnICYmIGFjdGlvbiAhPT0gJ2Rpc2FibGUnKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZhbHNlLFxuICAgICAgICAgICAgY29tbWFuZElkOiBzcGxpdFZpZXdDb21tYW5kSWQsXG4gICAgICAgICAgICBlcnJvcjogYEludmFsaWQgYWN0aW9uIFwiJHtTdHJpbmcoYWN0aW9uKX1cIi4gTXVzdCBiZSBcImVuYWJsZVwiIG9yIFwiZGlzYWJsZVwiLmAsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAgICdQYXNzIGFjdGlvbjogXCJlbmFibGVcIiB0byBhY3RpdmF0ZSBkdWFsIG1hcCBtb2RlLCBvciBcImRpc2FibGVcIiB0byByZXR1cm4gdG8gYSBzaW5nbGUgbWFwLidcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIGEgc3RyaW5nL29iamVjdCBwYXNzZWQgYXMgbGF5ZXJJZHNGb3JNYXAwLzEgbXVzdCBub3QgYmUgdHJlYXRlZCBhc1xuICAgICAgICAvLyBpdGVyYWJsZSAoYC5sZW5ndGhgLCBgLmZpbHRlcmApIGFuZCBwcm9kdWNlIHN1cnByaXNpbmcgbGF5ZXIgdG9nZ2xlcy5cbiAgICAgICAgLy8gUmVqZWN0IG5vbi1hcnJheSBvciBub24tc3RyaW5nIGVudHJpZXMgd2hlbiB0aGVzZSBmaWVsZHMgYXJlIHByb3ZpZGVkLlxuICAgICAgICBmb3IgKGNvbnN0IFtuYW1lLCBpZHNdIG9mIFtcbiAgICAgICAgICBbJ2xheWVySWRzRm9yTWFwMCcsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgWydsYXllcklkc0Zvck1hcDEnLCBsYXllcklkc0Zvck1hcDFdXG4gICAgICAgIF0gYXMgY29uc3QpIHtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBpZHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgKCFBcnJheS5pc0FycmF5KGlkcykgfHwgaWRzLnNvbWUoaWQgPT4gdHlwZW9mIGlkICE9PSAnc3RyaW5nJyB8fCBpZC5sZW5ndGggPT09IDApKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgICAgICBlcnJvcjogYEludmFsaWQgJHtuYW1lfS4gTXVzdCBiZSBhbiBhcnJheSBvZiBub24tZW1wdHkgbGF5ZXIgaWQgc3RyaW5ncy5gLFxuICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb246IGBQYXNzICR7bmFtZX0gYXMgYW4gYXJyYXkgb2YgbGF5ZXIgaWQgc3RyaW5ncywgb3Igb21pdCBpdCB0byBzaG93IGFsbCBsYXllcnMgb24gdGhhdCBwYW5lbC5gXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlzU3RhdGUgPSBjdHguZ2V0VmlzU3RhdGUoKTtcbiAgICAgICAgY29uc3QgaXNTcGxpdCA9IHZpc1N0YXRlLnNwbGl0TWFwcyAmJiB2aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID4gMTtcblxuICAgICAgICBpZiAoYWN0aW9uID09PSAnZGlzYWJsZScpIHtcbiAgICAgICAgICBpZiAoaXNTcGxpdCkge1xuICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIFJJR0hUIHBhbmVsIChpbmRleCAxKSBzbyB0aGUgTEVGVCBwYW5lbCAobWFwMCkgc3Vydml2ZXM6XG4gICAgICAgICAgICAvLyBgY2xvc2VTcGVjaWZpY01hcEF0SW5kZXhgIGtlZXBzIGAxIC0gcGF5bG9hZGAsIHNvIGNsb3NpbmcgMCB3b3VsZFxuICAgICAgICAgICAgLy8ga2VlcCB0aGUgcmlnaHQgcGFuZWwgYW5kIGZsaXAgbGF5ZXIgdmlzaWJpbGl0eSB0byBtYXAxJ3MgY29uZmlnLlxuICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICAgIGRhdGE6IHtkZXRhaWxzOiAnU3BsaXQgbWFwIHZpZXcgZGlzYWJsZWQuIFJldHVybmVkIHRvIHNpbmdsZSBtYXAgdmlldy4nfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbmFibGVcbiAgICAgICAgaWYgKCFpc1NwbGl0KSB7XG4gICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZVNwbGl0TWFwKDApKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGhhc0xheWVyQXNzaWdubWVudCA9XG4gICAgICAgICAgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkgfHxcbiAgICAgICAgICAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKTtcblxuICAgICAgICBpZiAoaGFzTGF5ZXJBc3NpZ25tZW50KSB7XG4gICAgICAgICAgYXdhaXQgc2xlZXAoMjAwKTtcbiAgICAgICAgICBjb25zdCB1cGRhdGVkVmlzID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgICAgY29uc3Qgc3BsaXRNYXBzID0gdXBkYXRlZFZpcy5zcGxpdE1hcHM7XG5cbiAgICAgICAgICBpZiAoc3BsaXRNYXBzICYmIHNwbGl0TWFwcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBjb25zdCBhbGxMYXllcnMgPSB1cGRhdGVkVmlzLmxheWVycyB8fCBbXTtcbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRzID0gYWxsTGF5ZXJzLm1hcCgobDogYW55KSA9PiBsLmlkKTtcblxuICAgICAgICAgICAgLy8gRmFpbCBmYXN0IG9uIHVua25vd24gbGF5ZXIgaWRzIOKAlCBzaWxlbnRseSBpZ25vcmluZyB0aGVtIHdvdWxkXG4gICAgICAgICAgICAvLyBoaWRlIGV2ZXJ5IHJlYWwgbGF5ZXIgbm90IGxpc3RlZCBhbmQgcHJvZHVjZSBhbiB1bmV4cGVjdGVkIGJsYW5rXG4gICAgICAgICAgICAvLyBwYW5lbC5cbiAgICAgICAgICAgIGNvbnN0IGFsbExheWVySWRTZXQgPSBuZXcgU2V0KGFsbExheWVySWRzKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW3BhbmVsLCBpZHNdIG9mIFtcbiAgICAgICAgICAgICAgWydsZWZ0IChtYXAwKScsIGxheWVySWRzRm9yTWFwMF0sXG4gICAgICAgICAgICAgIFsncmlnaHQgKG1hcDEpJywgbGF5ZXJJZHNGb3JNYXAxXVxuICAgICAgICAgICAgXSBhcyBjb25zdCkge1xuICAgICAgICAgICAgICBpZiAoaWRzICYmIGlkcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdW5rbm93biA9IGlkcy5maWx0ZXIoaWQgPT4gIWFsbExheWVySWRTZXQuaGFzKGlkKSk7XG4gICAgICAgICAgICAgICAgaWYgKHVua25vd24ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICBgVW5rbm93biBsYXllciBpZChzKSBmb3IgdGhlICR7cGFuZWx9IHBhbmVsOiAke3Vua25vd24uam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICAgICAgICAgICAgIGBBdmFpbGFibGUgbGF5ZXIgaWRzOiAke2FsbExheWVySWRzLmpvaW4oJywgJyl9YFxuICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGxheWVySWRzRm9yTWFwMCAmJiBsYXllcklkc0Zvck1hcDAubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBjb25zdCBtYXAwTGF5ZXJzID0gc3BsaXRNYXBzWzBdPy5sYXllcnMgfHwge307XG4gICAgICAgICAgICAgIGNvbnN0IGRlc2lyZWRTZXQwID0gbmV3IFNldChsYXllcklkc0Zvck1hcDApO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGxheWVySWQgb2YgYWxsTGF5ZXJJZHMpIHtcbiAgICAgICAgICAgICAgICAvLyBDb2VyY2UgdG8gYm9vbGVhbjogYSBtaXNzaW5nIGVudHJ5IG1lYW5zIFwiaGlkZGVuXCIsIGFuZFxuICAgICAgICAgICAgICAgIC8vIGB0b2dnbGVMYXllckZvck1hcFVwZGF0ZXJgIHRvZ2dsZXMgbWlzc2luZyBlbnRyaWVzIHRvIHZpc2libGUuXG4gICAgICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gQm9vbGVhbihtYXAwTGF5ZXJzW2xheWVySWRdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRCZVZpc2libGUgPSBkZXNpcmVkU2V0MC5oYXMobGF5ZXJJZCk7XG4gICAgICAgICAgICAgICAgaWYgKGlzVmlzaWJsZSAhPT0gc2hvdWxkQmVWaXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICBjdHguZGlzcGF0Y2godG9nZ2xlTGF5ZXJGb3JNYXAoMCwgbGF5ZXJJZCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobGF5ZXJJZHNGb3JNYXAxICYmIGxheWVySWRzRm9yTWFwMS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGZyZXNoU3BsaXRNYXBzID0gY3R4LmdldFZpc1N0YXRlKCkuc3BsaXRNYXBzO1xuICAgICAgICAgICAgICBjb25zdCBtYXAxTGF5ZXJzID0gZnJlc2hTcGxpdE1hcHM/LlsxXT8ubGF5ZXJzIHx8IHt9O1xuICAgICAgICAgICAgICBjb25zdCBkZXNpcmVkU2V0MSA9IG5ldyBTZXQobGF5ZXJJZHNGb3JNYXAxKTtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBsYXllcklkIG9mIGFsbExheWVySWRzKSB7XG4gICAgICAgICAgICAgICAgLy8gQ29lcmNlIHRvIGJvb2xlYW46IGEgbWlzc2luZyBlbnRyeSBtZWFucyBcImhpZGRlblwiLCBhbmRcbiAgICAgICAgICAgICAgICAvLyBgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyYCB0b2dnbGVzIG1pc3NpbmcgZW50cmllcyB0byB2aXNpYmxlLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzVmlzaWJsZSA9IEJvb2xlYW4obWFwMUxheWVyc1tsYXllcklkXSk7XG4gICAgICAgICAgICAgICAgY29uc3Qgc2hvdWxkQmVWaXNpYmxlID0gZGVzaXJlZFNldDEuaGFzKGxheWVySWQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1Zpc2libGUgIT09IHNob3VsZEJlVmlzaWJsZSkge1xuICAgICAgICAgICAgICAgICAgY3R4LmRpc3BhdGNoKHRvZ2dsZUxheWVyRm9yTWFwKDEsIGxheWVySWQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaW5hbFZpcyA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSBmaW5hbFZpcy5sYXllcnMgfHwgW107XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogc3BsaXRWaWV3Q29tbWFuZElkLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGRldGFpbHM6IGBTcGxpdCBtYXAgdmlldyBlbmFibGVkLiAke2xheWVycy5sZW5ndGh9IGxheWVyKHMpIGF2YWlsYWJsZS4ke1xuICAgICAgICAgICAgICBoYXNMYXllckFzc2lnbm1lbnRcbiAgICAgICAgICAgICAgICA/IGAgTGVmdCBwYW5lbDogJHsobGF5ZXJJZHNGb3JNYXAwIHx8IFtdKS5sZW5ndGh9IGxheWVyKHMpLCBSaWdodCBwYW5lbDogJHtcbiAgICAgICAgICAgICAgICAgICAgKGxheWVySWRzRm9yTWFwMSB8fCBbXSkubGVuZ3RoXG4gICAgICAgICAgICAgICAgICB9IGxheWVyKHMpLmBcbiAgICAgICAgICAgICAgICA6ICcgQWxsIGxheWVycyB2aXNpYmxlIG9uIGJvdGggcGFuZWxzLiBQcm92aWRlIGxheWVySWRzRm9yTWFwMC9sYXllcklkc0Zvck1hcDEgdG8gYXNzaWduIGxheWVycyB0byBlYWNoIHBhbmVsLidcbiAgICAgICAgICAgIH1gXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHNwbGl0Vmlld0NvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdDaGVjayB0aGF0IGEgbWFwIGlzIGxvYWRlZCBhbmQgbGF5ZXJzIGV4aXN0LiBJZiB0aGUgZXJyb3IgcGVyc2lzdHMsIGFzayB0aGUgdXNlciB0byB0cnkgd2l0aCBkaWZmZXJlbnQgcGFyYW1ldGVycy4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7QUFJQSxJQUFBQSxJQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxRQUFBLEdBQUFELE9BQUE7QUFBcUUsU0FBQUUsMkJBQUFDLENBQUEsRUFBQUMsQ0FBQSxRQUFBQyxDQUFBLHlCQUFBQyxNQUFBLElBQUFILENBQUEsQ0FBQUcsTUFBQSxDQUFBQyxRQUFBLEtBQUFKLENBQUEscUJBQUFFLENBQUEsUUFBQUcsS0FBQSxDQUFBQyxPQUFBLENBQUFOLENBQUEsTUFBQUUsQ0FBQSxHQUFBSywyQkFBQSxDQUFBUCxDQUFBLE1BQUFDLENBQUEsSUFBQUQsQ0FBQSx1QkFBQUEsQ0FBQSxDQUFBUSxNQUFBLElBQUFOLENBQUEsS0FBQUYsQ0FBQSxHQUFBRSxDQUFBLE9BQUFPLEVBQUEsTUFBQUMsQ0FBQSxZQUFBQSxFQUFBLGVBQUFDLENBQUEsRUFBQUQsQ0FBQSxFQUFBRSxDQUFBLFdBQUFBLEVBQUEsV0FBQUgsRUFBQSxJQUFBVCxDQUFBLENBQUFRLE1BQUEsS0FBQUssSUFBQSxXQUFBQSxJQUFBLE1BQUFDLEtBQUEsRUFBQWQsQ0FBQSxDQUFBUyxFQUFBLFVBQUFSLENBQUEsV0FBQUEsRUFBQUQsQ0FBQSxVQUFBQSxDQUFBLEtBQUFlLENBQUEsRUFBQUwsQ0FBQSxnQkFBQU0sU0FBQSxpSkFBQUMsQ0FBQSxFQUFBQyxDQUFBLE9BQUFDLENBQUEsZ0JBQUFSLENBQUEsV0FBQUEsRUFBQSxJQUFBVCxDQUFBLEdBQUFBLENBQUEsQ0FBQWtCLElBQUEsQ0FBQXBCLENBQUEsTUFBQVksQ0FBQSxXQUFBQSxFQUFBLFFBQUFaLENBQUEsR0FBQUUsQ0FBQSxDQUFBbUIsSUFBQSxXQUFBSCxDQUFBLEdBQUFsQixDQUFBLENBQUFh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
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.getTableCommand = getTableCommand;
|
|
8
|
+
exports.tableCommandId = void 0;
|
|
9
|
+
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
|
|
10
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
11
|
+
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
|
|
12
|
+
var _zod = require("zod");
|
|
13
|
+
var _apacheArrow = require("apache-arrow");
|
|
14
|
+
var _actions = require("@kepler.gl/actions");
|
|
15
|
+
var _processors = require("@kepler.gl/processors");
|
|
16
|
+
var _utils = require("./utils");
|
|
17
|
+
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
18
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
19
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } // SPDX-License-Identifier: MIT
|
|
20
|
+
// Copyright contributors to the kepler.gl project
|
|
21
|
+
var tableCommandId = exports.tableCommandId = 'map.create-table';
|
|
22
|
+
function getTableCommand(ctx) {
|
|
23
|
+
return {
|
|
24
|
+
id: tableCommandId,
|
|
25
|
+
name: 'Create map dataset via SQL',
|
|
26
|
+
group: 'Map',
|
|
27
|
+
description: "Create a NEW dataset in kepler.gl from a SQL query. The result becomes a SEPARATE new dataset (resultDatasetName); the ORIGINAL dataset and its layers/filters are left untouched. Use it to build a new table with different columns \u2014 e.g. add, delete, or rename columns, or change a column's type (CAST(col AS <type>)) \u2014 inside the new dataset.\nNOTE: To modify an EXISTING dataset in place, do NOT use this command \u2014 use map.add-column instead (add a column that copies an existing one to \"rename\", or casts it via expression to change its type). Only reach for map.create-table when the user wants a NEW, separate dataset.\nPlease note:\n1. Do not use * to select all columns, instead use all the column names in dataset.\n2. List all column names the new table or dataset will have.\nIMPORTANT: Use __TABLE__ as the table name placeholder in SQL. It will be replaced with the actual DuckDB table name at runtime.",
|
|
28
|
+
metadata: {
|
|
29
|
+
readOnly: false,
|
|
30
|
+
riskLevel: 'high',
|
|
31
|
+
idempotent: false,
|
|
32
|
+
requiresConfirmation: true
|
|
33
|
+
},
|
|
34
|
+
inputSchema: _zod.z.object({
|
|
35
|
+
datasetName: _zod.z.string().describe('The name of the source dataset'),
|
|
36
|
+
variableNames: _zod.z.array(_zod.z.string()).describe('Only use variable names that already exist in the dataset.'),
|
|
37
|
+
sql: _zod.z.string().describe('The SQL query to execute. Use __TABLE__ as the table name placeholder.'),
|
|
38
|
+
resultDatasetName: _zod.z.string().describe('The name for the new dataset')
|
|
39
|
+
}),
|
|
40
|
+
execute: function () {
|
|
41
|
+
var _execute = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(_execCtx, input) {
|
|
42
|
+
var _ref, datasetName, variableNames, sql, resultDatasetName, visState, datasets, dataId, dbTableName, resolvedSql, uniqueVariableNames, columnData, objectColumns, _iterator, _step, varName, values, arrowTable, db, arrowResult, jsonResult, parsedData, firstFiveRows;
|
|
43
|
+
return _regenerator["default"].wrap(function _callee$(_context) {
|
|
44
|
+
while (1) switch (_context.prev = _context.next) {
|
|
45
|
+
case 0:
|
|
46
|
+
_ref = input !== null && input !== void 0 ? input : {}, datasetName = _ref.datasetName, variableNames = _ref.variableNames, sql = _ref.sql, resultDatasetName = _ref.resultDatasetName;
|
|
47
|
+
_context.prev = 1;
|
|
48
|
+
if (!(typeof datasetName !== 'string' || datasetName.length === 0)) {
|
|
49
|
+
_context.next = 4;
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
throw new Error('datasetName must be a non-empty string.');
|
|
53
|
+
case 4:
|
|
54
|
+
if (!(!Array.isArray(variableNames) || variableNames.length === 0 || variableNames.some(function (v) {
|
|
55
|
+
return typeof v !== 'string' || v.length === 0;
|
|
56
|
+
}))) {
|
|
57
|
+
_context.next = 6;
|
|
58
|
+
break;
|
|
59
|
+
}
|
|
60
|
+
throw new Error('variableNames must be a non-empty array of non-empty strings.');
|
|
61
|
+
case 6:
|
|
62
|
+
if (!(typeof sql !== 'string' || sql.length === 0)) {
|
|
63
|
+
_context.next = 8;
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
throw new Error('sql must be a non-empty string.');
|
|
67
|
+
case 8:
|
|
68
|
+
if (!(typeof resultDatasetName !== 'string' || resultDatasetName.length === 0)) {
|
|
69
|
+
_context.next = 10;
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
throw new Error('resultDatasetName must be a non-empty string.');
|
|
73
|
+
case 10:
|
|
74
|
+
visState = ctx.getVisState();
|
|
75
|
+
datasets = visState.datasets;
|
|
76
|
+
dataId = Object.keys(datasets).find(function (id) {
|
|
77
|
+
return id === datasetName || datasets[id].label === datasetName;
|
|
78
|
+
});
|
|
79
|
+
if (dataId) {
|
|
80
|
+
_context.next = 15;
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
throw new Error("Dataset \"".concat(datasetName, "\" not found."));
|
|
84
|
+
case 15:
|
|
85
|
+
// Derive the DuckDB table name from the resolved dataset id, not the
|
|
86
|
+
// user-provided label: different labels can sanitize to the same table
|
|
87
|
+
// name (e.g. "A-B" vs "A B"), which would clobber another dataset's
|
|
88
|
+
// temp table inside DuckDB and run the SQL against unintended data.
|
|
89
|
+
dbTableName = (0, _utils.datasetNameToTableName)(dataId); // The contract requires the __TABLE__ placeholder — without it the
|
|
90
|
+
// query would run against whatever table names appear in the SQL (or
|
|
91
|
+
// return unrelated results), which is especially risky for a
|
|
92
|
+
// high-risk, confirmation-gated command. Fail fast with an actionable
|
|
93
|
+
// error instead.
|
|
94
|
+
if (sql.includes('__TABLE__')) {
|
|
95
|
+
_context.next = 18;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
throw new Error('The SQL query must use the __TABLE__ placeholder as the table name, ' + 'e.g. `SELECT * FROM __TABLE__`.');
|
|
99
|
+
case 18:
|
|
100
|
+
resolvedSql = sql.replace(/__TABLE__/g, "\"".concat(dbTableName, "\"")); // Dedupe variableNames: duplicate names would silently overwrite
|
|
101
|
+
// earlier entries in columnData, producing an Arrow table that doesn't
|
|
102
|
+
// match the requested column list.
|
|
103
|
+
uniqueVariableNames = (0, _toConsumableArray2["default"])(new Set(variableNames));
|
|
104
|
+
columnData = {}; // Object-valued columns (the `_geojson` Feature objects) must not be
|
|
105
|
+
// round-tripped through Arrow raw: `tableFromArrays` infers ONE Arrow
|
|
106
|
+
// type per column from the first value, so a dataset mixing Polygon and
|
|
107
|
+
// MultiPolygon features gets the shallower (Polygon) coordinate nesting
|
|
108
|
+
// and the MultiPolygon coordinates come back as nulls. Stringify them
|
|
109
|
+
// for the DuckDB round-trip and restore the objects afterwards.
|
|
110
|
+
objectColumns = [];
|
|
111
|
+
_iterator = _createForOfIteratorHelper(uniqueVariableNames);
|
|
112
|
+
try {
|
|
113
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
114
|
+
varName = _step.value;
|
|
115
|
+
// Pass the user-provided datasetName (label or id) — the documented
|
|
116
|
+
// KeplerContext contract — not the resolved id; getValuesFromDataset
|
|
117
|
+
// matches by label or id either way.
|
|
118
|
+
values = ctx.getValuesFromDataset(datasetName, varName);
|
|
119
|
+
if ((0, _utils.isObjectColumn)(values)) objectColumns.push(varName);
|
|
120
|
+
columnData[varName] = (0, _utils.stringifyObjectColumn)(values);
|
|
121
|
+
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
_iterator.e(err);
|
|
124
|
+
} finally {
|
|
125
|
+
_iterator.f();
|
|
126
|
+
}
|
|
127
|
+
arrowTable = (0, _apacheArrow.tableFromArrays)(columnData);
|
|
128
|
+
_context.next = 27;
|
|
129
|
+
return ctx.getConnector();
|
|
130
|
+
case 27:
|
|
131
|
+
db = _context.sent;
|
|
132
|
+
_context.next = 30;
|
|
133
|
+
return db.execute("DROP TABLE IF EXISTS \"".concat(dbTableName, "\""));
|
|
134
|
+
case 30:
|
|
135
|
+
_context.next = 32;
|
|
136
|
+
return db.loadArrow(arrowTable, dbTableName);
|
|
137
|
+
case 32:
|
|
138
|
+
_context.next = 34;
|
|
139
|
+
return db.query(resolvedSql);
|
|
140
|
+
case 34:
|
|
141
|
+
arrowResult = _context.sent;
|
|
142
|
+
jsonResult = (0, _utils.arrowTableToObjects)(arrowResult);
|
|
143
|
+
(0, _utils.restoreObjectColumns)(jsonResult, objectColumns);
|
|
144
|
+
_context.next = 39;
|
|
145
|
+
return (0, _processors.processFileData)({
|
|
146
|
+
content: {
|
|
147
|
+
data: jsonResult,
|
|
148
|
+
fileName: resultDatasetName
|
|
149
|
+
},
|
|
150
|
+
fileCache: []
|
|
151
|
+
});
|
|
152
|
+
case 39:
|
|
153
|
+
parsedData = _context.sent;
|
|
154
|
+
ctx.dispatch((0, _actions.addDataToMap)({
|
|
155
|
+
datasets: parsedData,
|
|
156
|
+
// No auto-create — the assistant creates the layer explicitly via
|
|
157
|
+
// `map.add-layer` to avoid duplicate default layers.
|
|
158
|
+
options: {
|
|
159
|
+
autoCreateLayers: false,
|
|
160
|
+
centerMap: true
|
|
161
|
+
}
|
|
162
|
+
}));
|
|
163
|
+
|
|
164
|
+
// Trimmed, model-facing subset (ported from the old `toModelOutput`).
|
|
165
|
+
firstFiveRows = jsonResult.slice(0, 5);
|
|
166
|
+
return _context.abrupt("return", {
|
|
167
|
+
success: true,
|
|
168
|
+
commandId: tableCommandId,
|
|
169
|
+
data: {
|
|
170
|
+
details: "Table created as ".concat(resultDatasetName, " (").concat(jsonResult.length, " rows) and added to kepler.gl."),
|
|
171
|
+
resultDatasetName: resultDatasetName,
|
|
172
|
+
firstFiveRows: firstFiveRows
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
case 45:
|
|
176
|
+
_context.prev = 45;
|
|
177
|
+
_context.t0 = _context["catch"](1);
|
|
178
|
+
return _context.abrupt("return", {
|
|
179
|
+
success: false,
|
|
180
|
+
commandId: tableCommandId,
|
|
181
|
+
error: _context.t0 instanceof Error ? _context.t0.message : String(_context.t0),
|
|
182
|
+
data: {
|
|
183
|
+
instruction: 'Please explain the error and give a plan to fix it. Then try again with a different query.'
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
case 48:
|
|
187
|
+
case "end":
|
|
188
|
+
return _context.stop();
|
|
189
|
+
}
|
|
190
|
+
}, _callee, null, [[1, 45]]);
|
|
191
|
+
}));
|
|
192
|
+
function execute(_x, _x2) {
|
|
193
|
+
return _execute.apply(this, arguments);
|
|
194
|
+
}
|
|
195
|
+
return execute;
|
|
196
|
+
}()
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfem9kIiwicmVxdWlyZSIsIl9hcGFjaGVBcnJvdyIsIl9hY3Rpb25zIiwiX3Byb2Nlc3NvcnMiLCJfdXRpbHMiLCJfY3JlYXRlRm9yT2ZJdGVyYXRvckhlbHBlciIsInIiLCJlIiwidCIsIlN5bWJvbCIsIml0ZXJhdG9yIiwiQXJyYXkiLCJpc0FycmF5IiwiX3Vuc3VwcG9ydGVkSXRlcmFibGVUb0FycmF5IiwibGVuZ3RoIiwiX24iLCJGIiwicyIsIm4iLCJkb25lIiwidmFsdWUiLCJmIiwiVHlwZUVycm9yIiwibyIsImEiLCJ1IiwiY2FsbCIsIm5leHQiLCJfYXJyYXlMaWtlVG9BcnJheSIsInRvU3RyaW5nIiwic2xpY2UiLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJmcm9tIiwidGVzdCIsInRhYmxlQ29tbWFuZElkIiwiZXhwb3J0cyIsImdldFRhYmxlQ29tbWFuZCIsImN0eCIsImlkIiwiZ3JvdXAiLCJkZXNjcmlwdGlvbiIsIm1ldGFkYXRhIiwicmVhZE9ubHkiLCJyaXNrTGV2ZWwiLCJpZGVtcG90ZW50IiwicmVxdWlyZXNDb25maXJtYXRpb24iLCJpbnB1dFNjaGVtYSIsInoiLCJvYmplY3QiLCJkYXRhc2V0TmFtZSIsInN0cmluZyIsImRlc2NyaWJlIiwidmFyaWFibGVOYW1lcyIsImFycmF5Iiwic3FsIiwicmVzdWx0RGF0YXNldE5hbWUiLCJleGVjdXRlIiwiX2V4ZWN1dGUiLCJfYXN5bmNUb0dlbmVyYXRvcjIiLCJfcmVnZW5lcmF0b3IiLCJtYXJrIiwiX2NhbGxlZSIsIl9leGVjQ3R4IiwiaW5wdXQiLCJfcmVmIiwidmlzU3RhdGUiLCJkYXRhc2V0cyIsImRhdGFJZCIsImRiVGFibGVOYW1lIiwicmVzb2x2ZWRTcWwiLCJ1bmlxdWVWYXJpYWJsZU5hbWVzIiwiY29sdW1uRGF0YSIsIm9iamVjdENvbHVtbnMiLCJfaXRlcmF0b3IiLCJfc3RlcCIsInZhck5hbWUiLCJ2YWx1ZXMiLCJhcnJvd1RhYmxlIiwiZGIiLCJhcnJvd1Jlc3VsdCIsImpzb25SZXN1bHQiLCJwYXJzZWREYXRhIiwiZmlyc3RGaXZlUm93cyIsIndyYXAiLCJfY2FsbGVlJCIsIl9jb250ZXh0IiwicHJldiIsIkVycm9yIiwic29tZSIsInYiLCJnZXRWaXNTdGF0ZSIsIk9iamVjdCIsImtleXMiLCJmaW5kIiwibGFiZWwiLCJjb25jYXQiLCJkYXRhc2V0TmFtZVRvVGFibGVOYW1lIiwiaW5jbHVkZXMiLCJyZXBsYWNlIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsIlNldCIsImdldFZhbHVlc0Zyb21EYXRhc2V0IiwiaXNPYmplY3RDb2x1bW4iLCJwdXNoIiwic3RyaW5naWZ5T2JqZWN0Q29sdW1uIiwiZXJyIiwidGFibGVGcm9tQXJyYXlzIiwiZ2V0Q29ubmVjdG9yIiwic2VudCIsImxvYWRBcnJvdyIsInF1ZXJ5IiwiYXJyb3dUYWJsZVRvT2JqZWN0cyIsInJlc3RvcmVPYmplY3RDb2x1bW5zIiwicHJvY2Vzc0ZpbGVEYXRhIiwiY29udGVudCIsImRhdGEiLCJmaWxlTmFtZSIsImZpbGVDYWNoZSIsImRpc3BhdGNoIiwiYWRkRGF0YVRvTWFwIiwib3B0aW9ucyIsImF1dG9DcmVhdGVMYXllcnMiLCJjZW50ZXJNYXAiLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGV0YWlscyIsInQwIiwiZXJyb3IiLCJtZXNzYWdlIiwiU3RyaW5nIiwiaW5zdHJ1Y3Rpb24iLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy90YWJsZS1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge3RhYmxlRnJvbUFycmF5cywgVGFibGUgYXMgQXJyb3dUYWJsZX0gZnJvbSAnYXBhY2hlLWFycm93JztcbmltcG9ydCB7YWRkRGF0YVRvTWFwfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtwcm9jZXNzRmlsZURhdGF9IGZyb20gJ0BrZXBsZXIuZ2wvcHJvY2Vzc29ycyc7XG5pbXBvcnQgdHlwZSB7S2VwbGVyQ29udGV4dH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2RhdGFzZXROYW1lVG9UYWJsZU5hbWUsIGFycm93VGFibGVUb09iamVjdHN9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHtpc09iamVjdENvbHVtbiwgc3RyaW5naWZ5T2JqZWN0Q29sdW1uLCByZXN0b3JlT2JqZWN0Q29sdW1uc30gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCB0YWJsZUNvbW1hbmRJZCA9ICdtYXAuY3JlYXRlLXRhYmxlJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlQ29tbWFuZChjdHg6IEtlcGxlckNvbnRleHQpOiBSb29tQ29tbWFuZCB7XG4gIHJldHVybiB7XG4gICAgaWQ6IHRhYmxlQ29tbWFuZElkLFxuICAgIG5hbWU6ICdDcmVhdGUgbWFwIGRhdGFzZXQgdmlhIFNRTCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOiBgQ3JlYXRlIGEgTkVXIGRhdGFzZXQgaW4ga2VwbGVyLmdsIGZyb20gYSBTUUwgcXVlcnkuIFRoZSByZXN1bHQgYmVjb21lcyBhIFNFUEFSQVRFIG5ldyBkYXRhc2V0IChyZXN1bHREYXRhc2V0TmFtZSk7IHRoZSBPUklHSU5BTCBkYXRhc2V0IGFuZCBpdHMgbGF5ZXJzL2ZpbHRlcnMgYXJlIGxlZnQgdW50b3VjaGVkLiBVc2UgaXQgdG8gYnVpbGQgYSBuZXcgdGFibGUgd2l0aCBkaWZmZXJlbnQgY29sdW1ucyDigJQgZS5nLiBhZGQsIGRlbGV0ZSwgb3IgcmVuYW1lIGNvbHVtbnMsIG9yIGNoYW5nZSBhIGNvbHVtbidzIHR5cGUgKENBU1QoY29sIEFTIDx0eXBlPikpIOKAlCBpbnNpZGUgdGhlIG5ldyBkYXRhc2V0LlxuTk9URTogVG8gbW9kaWZ5IGFuIEVYSVNUSU5HIGRhdGFzZXQgaW4gcGxhY2UsIGRvIE5PVCB1c2UgdGhpcyBjb21tYW5kIOKAlCB1c2UgbWFwLmFkZC1jb2x1bW4gaW5zdGVhZCAoYWRkIGEgY29sdW1uIHRoYXQgY29waWVzIGFuIGV4aXN0aW5nIG9uZSB0byBcInJlbmFtZVwiLCBvciBjYXN0cyBpdCB2aWEgZXhwcmVzc2lvbiB0byBjaGFuZ2UgaXRzIHR5cGUpLiBPbmx5IHJlYWNoIGZvciBtYXAuY3JlYXRlLXRhYmxlIHdoZW4gdGhlIHVzZXIgd2FudHMgYSBORVcsIHNlcGFyYXRlIGRhdGFzZXQuXG5QbGVhc2Ugbm90ZTpcbjEuIERvIG5vdCB1c2UgKiB0byBzZWxlY3QgYWxsIGNvbHVtbnMsIGluc3RlYWQgdXNlIGFsbCB0aGUgY29sdW1uIG5hbWVzIGluIGRhdGFzZXQuXG4yLiBMaXN0IGFsbCBjb2x1bW4gbmFtZXMgdGhlIG5ldyB0YWJsZSBvciBkYXRhc2V0IHdpbGwgaGF2ZS5cbklNUE9SVEFOVDogVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlciBpbiBTUUwuIEl0IHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYWN0dWFsIER1Y2tEQiB0YWJsZSBuYW1lIGF0IHJ1bnRpbWUuYCxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiBmYWxzZSwgcmlza0xldmVsOiAnaGlnaCcsIGlkZW1wb3RlbnQ6IGZhbHNlLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGRhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBvZiB0aGUgc291cmNlIGRhdGFzZXQnKSxcbiAgICAgIHZhcmlhYmxlTmFtZXM6IHpcbiAgICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4gICAgICAgIC5kZXNjcmliZSgnT25seSB1c2UgdmFyaWFibGUgbmFtZXMgdGhhdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBkYXRhc2V0LicpLFxuICAgICAgc3FsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoJ1RoZSBTUUwgcXVlcnkgdG8gZXhlY3V0ZS4gVXNlIF9fVEFCTEVfXyBhcyB0aGUgdGFibGUgbmFtZSBwbGFjZWhvbGRlci4nKSxcbiAgICAgIHJlc3VsdERhdGFzZXROYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKCdUaGUgbmFtZSBmb3IgdGhlIG5ldyBkYXRhc2V0JylcbiAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2RhdGFzZXROYW1lLCB2YXJpYWJsZU5hbWVzLCBzcWwsIHJlc3VsdERhdGFzZXROYW1lfSA9IChpbnB1dCA/PyB7fSkgYXMge1xuICAgICAgICBkYXRhc2V0TmFtZTogc3RyaW5nO1xuICAgICAgICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgICAgICAgc3FsOiBzdHJpbmc7XG4gICAgICAgIHJlc3VsdERhdGFzZXROYW1lOiBzdHJpbmc7XG4gICAgICB9O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gUnVudGltZSBndWFyZDogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsIHNvXG4gICAgICAgIC8vIG1pc3Npbmcvd3JvbmctdHlwZWQgaW5wdXRzIG11c3Qgbm90IGZhbGwgdGhyb3VnaCB0byBUeXBlRXJyb3JzIChlLmcuXG4gICAgICAgIC8vIGBzcWwuaW5jbHVkZXNgIG9uIGEgbm9uLXN0cmluZykgdGhhdCBzdXJmYWNlIGFzIGNvbmZ1c2luZyBlcnJvcnMuXG4gICAgICAgIGlmICh0eXBlb2YgZGF0YXNldE5hbWUgIT09ICdzdHJpbmcnIHx8IGRhdGFzZXROYW1lLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZGF0YXNldE5hbWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBcnJheS5pc0FycmF5KHZhcmlhYmxlTmFtZXMpIHx8XG4gICAgICAgICAgdmFyaWFibGVOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICB2YXJpYWJsZU5hbWVzLnNvbWUodiA9PiB0eXBlb2YgdiAhPT0gJ3N0cmluZycgfHwgdi5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndmFyaWFibGVOYW1lcyBtdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5IG9mIG5vbi1lbXB0eSBzdHJpbmdzLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Ygc3FsICE9PSAnc3RyaW5nJyB8fCBzcWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzcWwgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHREYXRhc2V0TmFtZSAhPT0gJ3N0cmluZycgfHwgcmVzdWx0RGF0YXNldE5hbWUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdyZXN1bHREYXRhc2V0TmFtZSBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHZpc1N0YXRlID0gY3R4LmdldFZpc1N0YXRlKCk7XG4gICAgICAgIGNvbnN0IGRhdGFzZXRzID0gdmlzU3RhdGUuZGF0YXNldHM7XG4gICAgICAgIGNvbnN0IGRhdGFJZCA9IE9iamVjdC5rZXlzKGRhdGFzZXRzKS5maW5kKFxuICAgICAgICAgIGlkID0+IGlkID09PSBkYXRhc2V0TmFtZSB8fCBkYXRhc2V0c1tpZF0ubGFiZWwgPT09IGRhdGFzZXROYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmICghZGF0YUlkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEYXRhc2V0IFwiJHtkYXRhc2V0TmFtZX1cIiBub3QgZm91bmQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRGVyaXZlIHRoZSBEdWNrREIgdGFibGUgbmFtZSBmcm9tIHRoZSByZXNvbHZlZCBkYXRhc2V0IGlkLCBub3QgdGhlXG4gICAgICAgIC8vIHVzZXItcHJvdmlkZWQgbGFiZWw6IGRpZmZlcmVudCBsYWJlbHMgY2FuIHNhbml0aXplIHRvIHRoZSBzYW1lIHRhYmxlXG4gICAgICAgIC8vIG5hbWUgKGUuZy4gXCJBLUJcIiB2cyBcIkEgQlwiKSwgd2hpY2ggd291bGQgY2xvYmJlciBhbm90aGVyIGRhdGFzZXQnc1xuICAgICAgICAvLyB0ZW1wIHRhYmxlIGluc2lkZSBEdWNrREIgYW5kIHJ1biB0aGUgU1FMIGFnYWluc3QgdW5pbnRlbmRlZCBkYXRhLlxuICAgICAgICBjb25zdCBkYlRhYmxlTmFtZSA9IGRhdGFzZXROYW1lVG9UYWJsZU5hbWUoZGF0YUlkKTtcbiAgICAgICAgLy8gVGhlIGNvbnRyYWN0IHJlcXVpcmVzIHRoZSBfX1RBQkxFX18gcGxhY2Vob2xkZXIg4oCUIHdpdGhvdXQgaXQgdGhlXG4gICAgICAgIC8vIHF1ZXJ5IHdvdWxkIHJ1biBhZ2FpbnN0IHdoYXRldmVyIHRhYmxlIG5hbWVzIGFwcGVhciBpbiB0aGUgU1FMIChvclxuICAgICAgICAvLyByZXR1cm4gdW5yZWxhdGVkIHJlc3VsdHMpLCB3aGljaCBpcyBlc3BlY2lhbGx5IHJpc2t5IGZvciBhXG4gICAgICAgIC8vIGhpZ2gtcmlzaywgY29uZmlybWF0aW9uLWdhdGVkIGNvbW1hbmQuIEZhaWwgZmFzdCB3aXRoIGFuIGFjdGlvbmFibGVcbiAgICAgICAgLy8gZXJyb3IgaW5zdGVhZC5cbiAgICAgICAgaWYgKCFzcWwuaW5jbHVkZXMoJ19fVEFCTEVfXycpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ1RoZSBTUUwgcXVlcnkgbXVzdCB1c2UgdGhlIF9fVEFCTEVfXyBwbGFjZWhvbGRlciBhcyB0aGUgdGFibGUgbmFtZSwgJyArXG4gICAgICAgICAgICAgICdlLmcuIGBTRUxFQ1QgKiBGUk9NIF9fVEFCTEVfX2AuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVzb2x2ZWRTcWwgPSBzcWwucmVwbGFjZSgvX19UQUJMRV9fL2csIGBcIiR7ZGJUYWJsZU5hbWV9XCJgKTtcbiAgICAgICAgLy8gRGVkdXBlIHZhcmlhYmxlTmFtZXM6IGR1cGxpY2F0ZSBuYW1lcyB3b3VsZCBzaWxlbnRseSBvdmVyd3JpdGVcbiAgICAgICAgLy8gZWFybGllciBlbnRyaWVzIGluIGNvbHVtbkRhdGEsIHByb2R1Y2luZyBhbiBBcnJvdyB0YWJsZSB0aGF0IGRvZXNuJ3RcbiAgICAgICAgLy8gbWF0Y2ggdGhlIHJlcXVlc3RlZCBjb2x1bW4gbGlzdC5cbiAgICAgICAgY29uc3QgdW5pcXVlVmFyaWFibGVOYW1lcyA9IFsuLi5uZXcgU2V0KHZhcmlhYmxlTmFtZXMpXTtcbiAgICAgICAgY29uc3QgY29sdW1uRGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bltdPiA9IHt9O1xuICAgICAgICAvLyBPYmplY3QtdmFsdWVkIGNvbHVtbnMgKHRoZSBgX2dlb2pzb25gIEZlYXR1cmUgb2JqZWN0cykgbXVzdCBub3QgYmVcbiAgICAgICAgLy8gcm91bmQtdHJpcHBlZCB0aHJvdWdoIEFycm93IHJhdzogYHRhYmxlRnJvbUFycmF5c2AgaW5mZXJzIE9ORSBBcnJvd1xuICAgICAgICAvLyB0eXBlIHBlciBjb2x1bW4gZnJvbSB0aGUgZmlyc3QgdmFsdWUsIHNvIGEgZGF0YXNldCBtaXhpbmcgUG9seWdvbiBhbmRcbiAgICAgICAgLy8gTXVsdGlQb2x5Z29uIGZlYXR1cmVzIGdldHMgdGhlIHNoYWxsb3dlciAoUG9seWdvbikgY29vcmRpbmF0ZSBuZXN0aW5nXG4gICAgICAgIC8vIGFuZCB0aGUgTXVsdGlQb2x5Z29uIGNvb3JkaW5hdGVzIGNvbWUgYmFjayBhcyBudWxscy4gU3RyaW5naWZ5IHRoZW1cbiAgICAgICAgLy8gZm9yIHRoZSBEdWNrREIgcm91bmQtdHJpcCBhbmQgcmVzdG9yZSB0aGUgb2JqZWN0cyBhZnRlcndhcmRzLlxuICAgICAgICBjb25zdCBvYmplY3RDb2x1bW5zOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHZhck5hbWUgb2YgdW5pcXVlVmFyaWFibGVOYW1lcykge1xuICAgICAgICAgIC8vIFBhc3MgdGhlIHVzZXItcHJvdmlkZWQgZGF0YXNldE5hbWUgKGxhYmVsIG9yIGlkKSDigJQgdGhlIGRvY3VtZW50ZWRcbiAgICAgICAgICAvLyBLZXBsZXJDb250ZXh0IGNvbnRyYWN0IOKAlCBub3QgdGhlIHJlc29sdmVkIGlkOyBnZXRWYWx1ZXNGcm9tRGF0YXNldFxuICAgICAgICAgIC8vIG1hdGNoZXMgYnkgbGFiZWwgb3IgaWQgZWl0aGVyIHdheS5cbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBjdHguZ2V0VmFsdWVzRnJvbURhdGFzZXQoZGF0YXNldE5hbWUsIHZhck5hbWUpO1xuICAgICAgICAgIGlmIChpc09iamVjdENvbHVtbih2YWx1ZXMpKSBvYmplY3RDb2x1bW5zLnB1c2godmFyTmFtZSk7XG4gICAgICAgICAgY29sdW1uRGF0YVt2YXJOYW1lXSA9IHN0cmluZ2lmeU9iamVjdENvbHVtbih2YWx1ZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYXJyb3dUYWJsZTogQXJyb3dUYWJsZSA9IHRhYmxlRnJvbUFycmF5cyhjb2x1bW5EYXRhKTtcbiAgICAgICAgY29uc3QgZGIgPSBhd2FpdCBjdHguZ2V0Q29ubmVjdG9yKCk7XG5cbiAgICAgICAgYXdhaXQgZGIuZXhlY3V0ZShgRFJPUCBUQUJMRSBJRiBFWElTVFMgXCIke2RiVGFibGVOYW1lfVwiYCk7XG4gICAgICAgIGF3YWl0IGRiLmxvYWRBcnJvdyhhcnJvd1RhYmxlLCBkYlRhYmxlTmFtZSk7XG5cbiAgICAgICAgY29uc3QgYXJyb3dSZXN1bHQgPSBhd2FpdCBkYi5xdWVyeShyZXNvbHZlZFNxbCk7XG5cbiAgICAgICAgY29uc3QganNvblJlc3VsdDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXSA9IGFycm93VGFibGVUb09iamVjdHMoYXJyb3dSZXN1bHQpO1xuICAgICAgICByZXN0b3JlT2JqZWN0Q29sdW1ucyhqc29uUmVzdWx0LCBvYmplY3RDb2x1bW5zKTtcblxuICAgICAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgcHJvY2Vzc0ZpbGVEYXRhKHtcbiAgICAgICAgICBjb250ZW50OiB7ZGF0YToganNvblJlc3VsdCwgZmlsZU5hbWU6IHJlc3VsdERhdGFzZXROYW1lfSxcbiAgICAgICAgICBmaWxlQ2FjaGU6IFtdXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGN0eC5kaXNwYXRjaChcbiAgICAgICAgICBhZGREYXRhVG9NYXAoe1xuICAgICAgICAgICAgZGF0YXNldHM6IHBhcnNlZERhdGEsXG4gICAgICAgICAgICAvLyBObyBhdXRvLWNyZWF0ZSDigJQgdGhlIGFzc2lzdGFudCBjcmVhdGVzIHRoZSBsYXllciBleHBsaWNpdGx5IHZpYVxuICAgICAgICAgICAgLy8gYG1hcC5hZGQtbGF5ZXJgIHRvIGF2b2lkIGR1cGxpY2F0ZSBkZWZhdWx0IGxheWVycy5cbiAgICAgICAgICAgIG9wdGlvbnM6IHthdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZSwgY2VudGVyTWFwOiB0cnVlfVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gVHJpbW1lZCwgbW9kZWwtZmFjaW5nIHN1YnNldCAocG9ydGVkIGZyb20gdGhlIG9sZCBgdG9Nb2RlbE91dHB1dGApLlxuICAgICAgICBjb25zdCBmaXJzdEZpdmVSb3dzID0ganNvblJlc3VsdC5zbGljZSgwLCA1KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdGFibGVDb21tYW5kSWQsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZGV0YWlsczogYFRhYmxlIGNyZWF0ZWQgYXMgJHtyZXN1bHREYXRhc2V0TmFtZX0gKCR7anNvblJlc3VsdC5sZW5ndGh9IHJvd3MpIGFuZCBhZGRlZCB0byBrZXBsZXIuZ2wuYCxcbiAgICAgICAgICAgIHJlc3VsdERhdGFzZXROYW1lLFxuICAgICAgICAgICAgZmlyc3RGaXZlUm93c1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiB0YWJsZUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnUGxlYXNlIGV4cGxhaW4gdGhlIGVycm9yIGFuZCBnaXZlIGEgcGxhbiB0byBmaXggaXQuIFRoZW4gdHJ5IGFnYWluIHdpdGggYSBkaWZmZXJlbnQgcXVlcnkuJ1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsSUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsWUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsUUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsV0FBQSxHQUFBSCxPQUFBO0FBRUEsSUFBQUksTUFBQSxHQUFBSixPQUFBO0FBQW9FLFNBQUFLLDJCQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSx5QkFBQUMsTUFBQSxJQUFBSCxDQUFBLENBQUFHLE1BQUEsQ0FBQUMsUUFBQSxLQUFBSixDQUFBLHFCQUFBRSxDQUFBLFFBQUFHLEtBQUEs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O2dCQUFpQixDQUFDO2dCQUN4RDhELFNBQVMsRUFBRTtjQUNiLENBQUMsQ0FBQztZQUFBO2NBSElwQyxVQUFVLEdBQUFJLFFBQUEsQ0FBQXVCLElBQUE7Y0FLaEJ2RSxHQUFHLENBQUNpRixRQUFRLENBQ1YsSUFBQUMscUJBQVksRUFBQztnQkFDWHJELFFBQVEsRUFBRWUsVUFBVTtnQkFDcEI7Z0JBQ0E7Z0JBQ0F1QyxPQUFPLEVBQUU7a0JBQUNDLGdCQUFnQixFQUFFLEtBQUs7a0JBQUVDLFNBQVMsRUFBRTtnQkFBSTtjQUNwRCxDQUFDLENBQ0gsQ0FBQzs7Y0FFRDtjQUNNeEMsYUFBYSxHQUFHRixVQUFVLENBQUNuRCxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztjQUFBLE9BQUF3RCxRQUFBLENBQUFzQyxNQUFBLFdBQ3JDO2dCQUNMQyxPQUFPLEVBQUUsSUFBSTtnQkFDYkMsU0FBUyxFQUFFM0YsY0FBYztnQkFDekJpRixJQUFJLEVBQUU7a0JBQ0pXLE9BQU8sc0JBQUEvQixNQUFBLENBQXNCeEMsaUJBQWlCLFFBQUF3QyxNQUFBLENBQUtmLFVBQVUsQ0FBQ25FLE1BQU0sbUNBQWdDO2tCQUNwRzBDLGlCQUFpQixFQUFqQkEsaUJBQWlCO2tCQUNqQjJCLGFBQWEsRUFBYkE7Z0JBQ0Y7Y0FDRixDQUFDO1lBQUE7Y0FBQUcsUUFBQSxDQUFBQyxJQUFBO2NBQUFELFFBQUEsQ0FBQTBDLEVBQUEsR0FBQTFDLFFBQUE7Y0FBQSxPQUFBQSxRQUFBLENBQUFzQyxNQUFBLFdBRU07Z0JBQ0xDLE9BQU8sRUFBRSxLQUFLO2dCQUNkQyxTQUFTLEVBQUUzRixjQUFjO2dCQUN6QjhGLEtBQUssRUFBRTNDLFFBQUEsQ0FBQTBDLEVBQUEsWUFBaUJ4QyxLQUFLLEdBQUdGLFFBQUEsQ0FBQTBDLEVBQUEsQ0FBTUUsT0FBTyxHQUFHQyxNQUFNLENBQUE3QyxRQUFBLENBQUEwQyxFQUFNLENBQUM7Z0JBQzdEWixJQUFJLEVBQUU7a0JBQ0pnQixXQUFXLEVBQ1Q7Z0JBQ0o7Y0FDRixDQUFDO1lBQUE7WUFBQTtjQUFBLE9BQUE5QyxRQUFBLENBQUErQyxJQUFBO1VBQUE7UUFBQSxHQUFBdkUsT0FBQTtNQUFBLENBRUo7TUFBQSxTQXpIREwsT0FBT0EsQ0FBQTZFLEVBQUEsRUFBQUMsR0FBQTtRQUFBLE9BQUE3RSxRQUFBLENBQUE4RSxLQUFBLE9BQUFDLFNBQUE7TUFBQTtNQUFBLE9BQVBoRixPQUFPO0lBQUE7RUEwSFQsQ0FBQztBQUNIIiwiaWdub3JlTGlzdCI6W119
|