@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.
Files changed (73) hide show
  1. package/dist/cjs/commands/add-column-command.js +192 -0
  2. package/dist/cjs/commands/basemap-command.js +80 -0
  3. package/dist/cjs/commands/boundary-command.js +81 -0
  4. package/dist/cjs/commands/command-wrappers.js +122 -0
  5. package/dist/cjs/commands/dataset-context-command.js +87 -0
  6. package/dist/cjs/commands/index.js +230 -0
  7. package/dist/cjs/commands/layer-creation-command.js +534 -0
  8. package/dist/cjs/commands/layer-style-command.js +136 -0
  9. package/dist/cjs/commands/load-data-command.js +270 -0
  10. package/dist/cjs/commands/save-data-command.js +118 -0
  11. package/dist/cjs/commands/split-view-command.js +261 -0
  12. package/dist/cjs/commands/table-command.js +199 -0
  13. package/dist/cjs/commands/time-filter-command.js +289 -0
  14. package/dist/cjs/commands/toggle-time-filter-command.js +155 -0
  15. package/dist/cjs/commands/types.js +6 -0
  16. package/dist/cjs/commands/utils.js +536 -0
  17. package/dist/cjs/commands/view-mode-command.js +94 -0
  18. package/dist/cjs/index.js +39 -0
  19. package/dist/cjs/map-contract.js +6 -0
  20. package/dist/cjs/server/bridge-server.js +435 -0
  21. package/dist/cjs/server/index.js +31 -0
  22. package/dist/cjs/server/stdio.js +201 -0
  23. package/dist/cjs/types.js +30 -0
  24. package/dist/commands/add-column-command.d.ts +4 -0
  25. package/dist/commands/basemap-command.d.ts +4 -0
  26. package/dist/commands/boundary-command.d.ts +4 -0
  27. package/dist/commands/command-wrappers.d.ts +52 -0
  28. package/dist/commands/dataset-context-command.d.ts +4 -0
  29. package/dist/commands/index.d.ts +31 -0
  30. package/dist/commands/layer-creation-command.d.ts +8 -0
  31. package/dist/commands/layer-style-command.d.ts +4 -0
  32. package/dist/commands/load-data-command.d.ts +4 -0
  33. package/dist/commands/save-data-command.d.ts +4 -0
  34. package/dist/commands/split-view-command.d.ts +4 -0
  35. package/dist/commands/table-command.d.ts +4 -0
  36. package/dist/commands/time-filter-command.d.ts +13 -0
  37. package/dist/commands/toggle-time-filter-command.d.ts +4 -0
  38. package/dist/commands/types.d.ts +132 -0
  39. package/dist/commands/utils.d.ts +138 -0
  40. package/dist/commands/view-mode-command.d.ts +4 -0
  41. package/dist/esm/commands/add-column-command.js +185 -0
  42. package/dist/esm/commands/basemap-command.js +72 -0
  43. package/dist/esm/commands/boundary-command.js +73 -0
  44. package/dist/esm/commands/command-wrappers.js +114 -0
  45. package/dist/esm/commands/dataset-context-command.js +79 -0
  46. package/dist/esm/commands/index.js +51 -0
  47. package/dist/esm/commands/layer-creation-command.js +527 -0
  48. package/dist/esm/commands/layer-style-command.js +130 -0
  49. package/dist/esm/commands/load-data-command.js +264 -0
  50. package/dist/esm/commands/save-data-command.js +112 -0
  51. package/dist/esm/commands/split-view-command.js +255 -0
  52. package/dist/esm/commands/table-command.js +194 -0
  53. package/dist/esm/commands/time-filter-command.js +280 -0
  54. package/dist/esm/commands/toggle-time-filter-command.js +147 -0
  55. package/dist/esm/commands/types.js +3 -0
  56. package/dist/esm/commands/utils.js +521 -0
  57. package/dist/esm/commands/view-mode-command.js +86 -0
  58. package/dist/esm/index.js +20 -0
  59. package/dist/esm/map-contract.js +3 -0
  60. package/dist/esm/server/bridge-server.js +428 -0
  61. package/dist/esm/server/index.js +13 -0
  62. package/dist/esm/server/stdio.js +198 -0
  63. package/dist/esm/types.js +24 -0
  64. package/dist/index.d.ts +15 -0
  65. package/dist/map-contract.d.ts +31 -0
  66. package/dist/server/bridge-server.d.ts +53 -0
  67. package/dist/server/index.d.ts +9 -0
  68. package/dist/server/stdio.d.ts +2 -0
  69. package/dist/types.d.ts +24 -0
  70. package/package.json +84 -4
  71. package/skill/kepler/SKILL.md +438 -0
  72. package/skill/kepler/skill.yaml +4 -0
  73. package/README.md +0 -3
@@ -0,0 +1,130 @@
1
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
2
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
3
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
4
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
5
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
6
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
7
+ // SPDX-License-Identifier: MIT
8
+ // Copyright contributors to the kepler.gl project
9
+
10
+ import { z } from 'zod';
11
+ import { layerVisualChannelConfigChange } from '@kepler.gl/actions';
12
+ export var updateLayerColorCommandId = 'map.update-layer-color';
13
+ export function getUpdateLayerColorCommand(ctx) {
14
+ return {
15
+ id: updateLayerColorCommandId,
16
+ name: 'Update layer color',
17
+ group: 'Map',
18
+ description: 'Update the color palette of an existing layer.',
19
+ metadata: {
20
+ readOnly: false,
21
+ riskLevel: 'low',
22
+ idempotent: true
23
+ },
24
+ inputSchema: z.object({
25
+ layerId: z.string(),
26
+ numberOfColors: z.number(),
27
+ customColors: z.array(z.string()).describe('An array of hex color values. Try to generate colors from user description like: van gogh starry night, water color etc.')
28
+ }),
29
+ execute: function () {
30
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_execCtx, input) {
31
+ var _ref, layerId, numberOfColors, customColors, HEX_COLOR_RE, visState, layers, layer, channel, newConfig, oldColorRange, newColorRange, newVisConfig;
32
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
33
+ while (1) switch (_context.prev = _context.next) {
34
+ case 0:
35
+ _ref = input !== null && input !== void 0 ? input : {}, layerId = _ref.layerId, numberOfColors = _ref.numberOfColors, customColors = _ref.customColors;
36
+ _context.prev = 1;
37
+ if (!(typeof layerId !== 'string' || layerId.length === 0)) {
38
+ _context.next = 4;
39
+ break;
40
+ }
41
+ throw new Error('layerId is required and must be a string.');
42
+ case 4:
43
+ if (!(typeof numberOfColors !== 'number' || !Number.isInteger(numberOfColors) || numberOfColors <= 0)) {
44
+ _context.next = 6;
45
+ break;
46
+ }
47
+ throw new Error('numberOfColors is required and must be a positive integer.');
48
+ case 6:
49
+ // The schema/description promise hex colors — a non-hex string would
50
+ // produce an invalid palette downstream, so reject it up front with an
51
+ // actionable error instead of a confusing render.
52
+ HEX_COLOR_RE = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/;
53
+ if (!(!Array.isArray(customColors) || customColors.some(function (c) {
54
+ return typeof c !== 'string' || !HEX_COLOR_RE.test(c);
55
+ }))) {
56
+ _context.next = 9;
57
+ break;
58
+ }
59
+ throw new Error('customColors is required and must be an array of hex color strings (e.g. #RRGGBB or #RRGGBBAA).');
60
+ case 9:
61
+ visState = ctx.getVisState();
62
+ layers = visState.layers;
63
+ layer = layers.find(function (l) {
64
+ return l.id === layerId;
65
+ });
66
+ if (layer) {
67
+ _context.next = 14;
68
+ break;
69
+ }
70
+ throw new Error("Layer with id ".concat(layerId, " not found"));
71
+ case 14:
72
+ if (!(numberOfColors !== customColors.length)) {
73
+ _context.next = 16;
74
+ break;
75
+ }
76
+ throw new Error("customColors array must contain exactly ".concat(numberOfColors, " colors"));
77
+ case 16:
78
+ channel = 'color';
79
+ newConfig = {};
80
+ oldColorRange = layer.config.visConfig.colorRange;
81
+ if (!(oldColorRange.colorMap && customColors.length !== oldColorRange.colorMap.length)) {
82
+ _context.next = 21;
83
+ break;
84
+ }
85
+ throw new Error("Layer ".concat(layerId, " has ").concat(oldColorRange.colorMap.length, " classes (custom colorMap); provide exactly ").concat(oldColorRange.colorMap.length, " colors, got ").concat(customColors.length, "."));
86
+ case 21:
87
+ newColorRange = _objectSpread(_objectSpread({}, oldColorRange), {}, {
88
+ colors: customColors
89
+ }, oldColorRange.colorMap ? {
90
+ colorMap: _toConsumableArray(oldColorRange.colorMap.map(function (c, i) {
91
+ return [c[0], customColors[i]];
92
+ }))
93
+ } : {});
94
+ newVisConfig = {
95
+ colorRange: newColorRange,
96
+ strokeColorRange: newColorRange
97
+ };
98
+ ctx.dispatch(layerVisualChannelConfigChange(layer, newConfig, channel, newVisConfig));
99
+ return _context.abrupt("return", {
100
+ success: true,
101
+ commandId: updateLayerColorCommandId,
102
+ data: {
103
+ details: "Color updated to ".concat(customColors.join(', '), " for layer ").concat(layerId)
104
+ }
105
+ });
106
+ case 27:
107
+ _context.prev = 27;
108
+ _context.t0 = _context["catch"](1);
109
+ return _context.abrupt("return", {
110
+ success: false,
111
+ commandId: updateLayerColorCommandId,
112
+ error: _context.t0 instanceof Error ? _context.t0.message : 'Unknown error',
113
+ data: {
114
+ instruction: 'Try to fix the error. If the error persists, ask the user to try with different parameters.'
115
+ }
116
+ });
117
+ case 30:
118
+ case "end":
119
+ return _context.stop();
120
+ }
121
+ }, _callee, null, [[1, 27]]);
122
+ }));
123
+ function execute(_x, _x2) {
124
+ return _execute.apply(this, arguments);
125
+ }
126
+ return execute;
127
+ }()
128
+ };
129
+ }
130
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6IiwibGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlIiwidXBkYXRlTGF5ZXJDb2xvckNvbW1hbmRJZCIsImdldFVwZGF0ZUxheWVyQ29sb3JDb21tYW5kIiwiY3R4IiwiaWQiLCJuYW1lIiwiZ3JvdXAiLCJkZXNjcmlwdGlvbiIsIm1ldGFkYXRhIiwicmVhZE9ubHkiLCJyaXNrTGV2ZWwiLCJpZGVtcG90ZW50IiwiaW5wdXRTY2hlbWEiLCJvYmplY3QiLCJsYXllcklkIiwic3RyaW5nIiwibnVtYmVyT2ZDb2xvcnMiLCJudW1iZXIiLCJjdXN0b21Db2xvcnMiLCJhcnJheSIsImRlc2NyaWJlIiwiZXhlY3V0ZSIsIl9leGVjdXRlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfZXhlY0N0eCIsImlucHV0IiwiX3JlZiIsIkhFWF9DT0xPUl9SRSIsInZpc1N0YXRlIiwibGF5ZXJzIiwibGF5ZXIiLCJjaGFubmVsIiwibmV3Q29uZmlnIiwib2xkQ29sb3JSYW5nZSIsIm5ld0NvbG9yUmFuZ2UiLCJuZXdWaXNDb25maWciLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwibGVuZ3RoIiwiRXJyb3IiLCJOdW1iZXIiLCJpc0ludGVnZXIiLCJBcnJheSIsImlzQXJyYXkiLCJzb21lIiwiYyIsInRlc3QiLCJnZXRWaXNTdGF0ZSIsImZpbmQiLCJsIiwiY29uY2F0IiwiY29uZmlnIiwidmlzQ29uZmlnIiwiY29sb3JSYW5nZSIsImNvbG9yTWFwIiwiX29iamVjdFNwcmVhZCIsImNvbG9ycyIsIl90b0NvbnN1bWFibGVBcnJheSIsIm1hcCIsImkiLCJzdHJva2VDb2xvclJhbmdlIiwiZGlzcGF0Y2giLCJhYnJ1cHQiLCJzdWNjZXNzIiwiY29tbWFuZElkIiwiZGF0YSIsImRldGFpbHMiLCJqb2luIiwidDAiLCJlcnJvciIsIm1lc3NhZ2UiLCJpbnN0cnVjdGlvbiIsInN0b3AiLCJfeCIsIl94MiIsImFwcGx5IiwiYXJndW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xheWVyLXN0eWxlLWNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHR5cGUge1Jvb21Db21tYW5kfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7en0gZnJvbSAnem9kJztcbmltcG9ydCB7bGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QgdXBkYXRlTGF5ZXJDb2xvckNvbW1hbmRJZCA9ICdtYXAudXBkYXRlLWxheWVyLWNvbG9yJyBhcyBjb25zdDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVwZGF0ZUxheWVyQ29sb3JDb21tYW5kKGN0eDogS2VwbGVyQ29udGV4dCk6IFJvb21Db21tYW5kIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogdXBkYXRlTGF5ZXJDb2xvckNvbW1hbmRJZCxcbiAgICBuYW1lOiAnVXBkYXRlIGxheWVyIGNvbG9yJyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246ICdVcGRhdGUgdGhlIGNvbG9yIHBhbGV0dGUgb2YgYW4gZXhpc3RpbmcgbGF5ZXIuJyxcbiAgICBtZXRhZGF0YToge3JlYWRPbmx5OiBmYWxzZSwgcmlza0xldmVsOiAnbG93JywgaWRlbXBvdGVudDogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGxheWVySWQ6IHouc3RyaW5nKCksXG4gICAgICBudW1iZXJPZkNvbG9yczogei5udW1iZXIoKSxcbiAgICAgIGN1c3RvbUNvbG9yczogelxuICAgICAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgICdBbiBhcnJheSBvZiBoZXggY29sb3IgdmFsdWVzLiBUcnkgdG8gZ2VuZXJhdGUgY29sb3JzIGZyb20gdXNlciBkZXNjcmlwdGlvbiBsaWtlOiB2YW4gZ29naCBzdGFycnkgbmlnaHQsIHdhdGVyIGNvbG9yIGV0Yy4nXG4gICAgICAgIClcbiAgICB9KSBhcyBhbnksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9leGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge2xheWVySWQsIG51bWJlck9mQ29sb3JzLCBjdXN0b21Db2xvcnN9ID0gKGlucHV0ID8/IHt9KSBhcyB7XG4gICAgICAgIGxheWVySWQ6IHN0cmluZztcbiAgICAgICAgbnVtYmVyT2ZDb2xvcnM6IG51bWJlcjtcbiAgICAgICAgY3VzdG9tQ29sb3JzOiBzdHJpbmdbXTtcbiAgICAgIH07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSdW50aW1lIGd1YXJkczogdGhlIGJyaWRnZS93ZWJNQ1AgY2FsbCBleGVjdXRlIHdpdGhvdXQgem9kIHBhcnNpbmcsXG4gICAgICAgIC8vIHNvIG1pc3Npbmcvd3JvbmctdHlwZWQgaW5wdXRzIG11c3QgZmFpbCB3aXRoIGFjdGlvbmFibGUgZXJyb3JzXG4gICAgICAgIC8vIGluc3RlYWQgb2YgYSBUeXBlRXJyb3IgKGUuZy4gcmVhZGluZyBgLmxlbmd0aGAgb2YgdW5kZWZpbmVkKS5cbiAgICAgICAgaWYgKHR5cGVvZiBsYXllcklkICE9PSAnc3RyaW5nJyB8fCBsYXllcklkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignbGF5ZXJJZCBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIHN0cmluZy4nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgdHlwZW9mIG51bWJlck9mQ29sb3JzICE9PSAnbnVtYmVyJyB8fFxuICAgICAgICAgICFOdW1iZXIuaXNJbnRlZ2VyKG51bWJlck9mQ29sb3JzKSB8fFxuICAgICAgICAgIG51bWJlck9mQ29sb3JzIDw9IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdudW1iZXJPZkNvbG9ycyBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gVGhlIHNjaGVtYS9kZXNjcmlwdGlvbiBwcm9taXNlIGhleCBjb2xvcnMg4oCUIGEgbm9uLWhleCBzdHJpbmcgd291bGRcbiAgICAgICAgLy8gcHJvZHVjZSBhbiBpbnZhbGlkIHBhbGV0dGUgZG93bnN0cmVhbSwgc28gcmVqZWN0IGl0IHVwIGZyb250IHdpdGggYW5cbiAgICAgICAgLy8gYWN0aW9uYWJsZSBlcnJvciBpbnN0ZWFkIG9mIGEgY29uZnVzaW5nIHJlbmRlci5cbiAgICAgICAgY29uc3QgSEVYX0NPTE9SX1JFID0gL14jKFswLTlhLWZBLUZdezN9fFswLTlhLWZBLUZdezZ9fFswLTlhLWZBLUZdezh9KSQvO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIUFycmF5LmlzQXJyYXkoY3VzdG9tQ29sb3JzKSB8fFxuICAgICAgICAgIGN1c3RvbUNvbG9ycy5zb21lKGMgPT4gdHlwZW9mIGMgIT09ICdzdHJpbmcnIHx8ICFIRVhfQ09MT1JfUkUudGVzdChjKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ2N1c3RvbUNvbG9ycyBpcyByZXF1aXJlZCBhbmQgbXVzdCBiZSBhbiBhcnJheSBvZiBoZXggY29sb3Igc3RyaW5ncyAoZS5nLiAjUlJHR0JCIG9yICNSUkdHQkJBQSkuJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB2aXNTdGF0ZSA9IGN0eC5nZXRWaXNTdGF0ZSgpO1xuICAgICAgICBjb25zdCBsYXllcnMgPSB2aXNTdGF0ZS5sYXllcnM7XG4gICAgICAgIGNvbnN0IGxheWVyID0gbGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsYXllcklkKTtcbiAgICAgICAgaWYgKCFsYXllcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGF5ZXIgd2l0aCBpZCAke2xheWVySWR9IG5vdCBmb3VuZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG51bWJlck9mQ29sb3JzICE9PSBjdXN0b21Db2xvcnMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjdXN0b21Db2xvcnMgYXJyYXkgbXVzdCBjb250YWluIGV4YWN0bHkgJHtudW1iZXJPZkNvbG9yc30gY29sb3JzYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjaGFubmVsID0gJ2NvbG9yJztcbiAgICAgICAgY29uc3QgbmV3Q29uZmlnID0ge307XG5cbiAgICAgICAgY29uc3Qgb2xkQ29sb3JSYW5nZSA9IGxheWVyLmNvbmZpZy52aXNDb25maWcuY29sb3JSYW5nZTtcbiAgICAgICAgaWYgKG9sZENvbG9yUmFuZ2UuY29sb3JNYXAgJiYgY3VzdG9tQ29sb3JzLmxlbmd0aCAhPT0gb2xkQ29sb3JSYW5nZS5jb2xvck1hcC5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgTGF5ZXIgJHtsYXllcklkfSBoYXMgJHtvbGRDb2xvclJhbmdlLmNvbG9yTWFwLmxlbmd0aH0gY2xhc3NlcyAoY3VzdG9tIGNvbG9yTWFwKTsgcHJvdmlkZSBleGFjdGx5ICR7b2xkQ29sb3JSYW5nZS5jb2xvck1hcC5sZW5ndGh9IGNvbG9ycywgZ290ICR7Y3VzdG9tQ29sb3JzLmxlbmd0aH0uYFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmV3Q29sb3JSYW5nZSA9IHtcbiAgICAgICAgICAuLi5vbGRDb2xvclJhbmdlLFxuICAgICAgICAgIGNvbG9yczogY3VzdG9tQ29sb3JzLFxuICAgICAgICAgIC4uLihvbGRDb2xvclJhbmdlLmNvbG9yTWFwXG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBjb2xvck1hcDogW1xuICAgICAgICAgICAgICAgICAgLi4ub2xkQ29sb3JSYW5nZS5jb2xvck1hcC5tYXAoKGM6IGFueSwgaTogbnVtYmVyKSA9PiBbY1swXSwgY3VzdG9tQ29sb3JzW2ldXSlcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDoge30pXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbmV3VmlzQ29uZmlnID0ge1xuICAgICAgICAgIGNvbG9yUmFuZ2U6IG5ld0NvbG9yUmFuZ2UsXG4gICAgICAgICAgc3Ryb2tlQ29sb3JSYW5nZTogbmV3Q29sb3JSYW5nZVxuICAgICAgICB9O1xuXG4gICAgICAgIGN0eC5kaXNwYXRjaChsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UobGF5ZXIsIG5ld0NvbmZpZywgY2hhbm5lbCwgbmV3VmlzQ29uZmlnKSk7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogdXBkYXRlTGF5ZXJDb2xvckNvbW1hbmRJZCxcbiAgICAgICAgICBkYXRhOiB7ZGV0YWlsczogYENvbG9yIHVwZGF0ZWQgdG8gJHtjdXN0b21Db2xvcnMuam9pbignLCAnKX0gZm9yIGxheWVyICR7bGF5ZXJJZH1gfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHVwZGF0ZUxheWVyQ29sb3JDb21tYW5kSWQsXG4gICAgICAgICAgZXJyb3I6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgIGluc3RydWN0aW9uOlxuICAgICAgICAgICAgICAnVHJ5IHRvIGZpeCB0aGUgZXJyb3IuIElmIHRoZSBlcnJvciBwZXJzaXN0cywgYXNrIHRoZSB1c2VyIHRvIHRyeSB3aXRoIGRpZmZlcmVudCBwYXJhbWV0ZXJzLidcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9O1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQTtBQUNBOztBQUdBLFNBQVFBLENBQUMsUUFBTyxLQUFLO0FBQ3JCLFNBQVFDLDhCQUE4QixRQUFPLG9CQUFvQjtBQUdqRSxPQUFPLElBQU1DLHlCQUF5QixHQUFHLHdCQUFpQztBQUUxRSxPQUFPLFNBQVNDLDBCQUEwQkEsQ0FBQ0MsR0FBa0IsRUFBZTtFQUMxRSxPQUFPO0lBQ0xDLEVBQUUsRUFBRUgseUJBQXlCO0lBQzdCSSxJQUFJLEVBQUUsb0JBQW9CO0lBQzFCQyxLQUFLLEVBQUUsS0FBSztJQUNaQyxXQUFXLEVBQUUsZ0RBQWdEO0lBQzdEQyxRQUFRLEVBQUU7TUFBQ0MsUUFBUSxFQUFFLEtBQUs7TUFBRUMsU0FBUyxFQUFFLEtBQUs7TUFBRUMsVUFBVSxFQUFFO0lBQUksQ0FBQztJQUMvREMsV0FBVyxFQUFFYixDQUFDLENBQUNjLE1BQU0sQ0FBQztNQUNwQkMsT0FBTyxFQUFFZixDQUFDLENBQUNnQixNQUFNLENBQUMsQ0FBQztNQUNuQkMsY0FBYyxFQUFFakIsQ0FBQyxDQUFDa0IsTUFBTSxDQUFDLENBQUM7TUFDMUJDLFlBQVksRUFBRW5CLENBQUMsQ0FDWm9CLEtBQUssQ0FBQ3BCLENBQUMsQ0FBQ2dCLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FDakJLLFFBQVEsQ0FDUCwwSEFDRjtJQUNKLENBQUMsQ0FBUTtJQUNUQyxPQUFPO01BQUEsSUFBQUMsUUFBQSxHQUFBQyxpQkFBQSxjQUFBQyxtQkFBQSxDQUFBQyxJQUFBLENBQUUsU0FBQUMsUUFBT0MsUUFBUSxFQUFFQyxLQUFLO1FBQUEsSUFBQUMsSUFBQSxFQUFBZixPQUFBLEVBQUFFLGNBQUEsRUFBQUUsWUFBQSxFQUFBWSxZQUFBLEVBQUFDLFFB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
@@ -0,0 +1,264 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ 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; } } }; }
4
+ 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; } }
5
+ 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; }
6
+ // SPDX-License-Identifier: MIT
7
+ // Copyright contributors to the kepler.gl project
8
+
9
+ import { z } from 'zod';
10
+ import { addDataToMap } from '@kepler.gl/actions';
11
+ import { readFileInBatches, processFileData } from '@kepler.gl/processors';
12
+ // MIME type → file extension for data URLs, so a `data:text/csv;base64,...`
13
+ // payload gets a sensible default dataset name (`data.csv`) instead of `data`.
14
+ var DATA_URL_EXTENSIONS = {
15
+ 'text/csv': '.csv',
16
+ 'application/csv': '.csv',
17
+ 'application/json': '.json',
18
+ 'application/geo+json': '.geojson',
19
+ 'application/vnd.apache.arrow.file': '.arrow',
20
+ 'application/vnd.apache.parquet': '.parquet',
21
+ 'text/plain': '.txt'
22
+ };
23
+ function fileNameFromDataUrl(parsedUrl) {
24
+ var _DATA_URL_EXTENSIONS$;
25
+ // data:text/csv;base64,... → pathname is "text/csv;base64,"
26
+ var mime = parsedUrl.pathname.split(';')[0].toLowerCase();
27
+ return "data".concat((_DATA_URL_EXTENSIONS$ = DATA_URL_EXTENSIONS[mime]) !== null && _DATA_URL_EXTENSIONS$ !== void 0 ? _DATA_URL_EXTENSIONS$ : '');
28
+ }
29
+
30
+ // Same 32-bit string hash the processors use for dataset ids — applied to a
31
+ // data URL's content so the dataset id is content-derived (unique per payload)
32
+ // without storing the whole (potentially large) data URL in the metadata.
33
+ function hashString(str) {
34
+ var hash = 0;
35
+ for (var i = 0; i < str.length; i++) {
36
+ // eslint-disable-next-line no-bitwise
37
+ hash = (hash << 5) - hash + str.charCodeAt(i);
38
+ // eslint-disable-next-line no-bitwise
39
+ hash |= 0;
40
+ }
41
+ return hash.toString(36);
42
+ }
43
+ export var loadDataCommandId = 'map.load-data';
44
+ export function getLoadDataCommand(ctx) {
45
+ return {
46
+ id: loadDataCommandId,
47
+ name: 'Load data from URL',
48
+ group: 'Map',
49
+ description: 'Load a dataset from a URL into kepler.gl. The dataset is named after the URL filename, ' + 'or after `datasetName` when provided. Does NOT create a layer — call map.add-layer to visualize. ' + 'Do NOT create a duplicate dataset (e.g. via map.create-table) just to rename it; ' + 'name it here with `datasetName` instead, or use the URL-filename dataset as-is. ' + 'LOCAL FILES: a local file must be served over http(s) — the browser cannot fetch ' + "`file://` paths. To load a file you have on disk: (1) copy it into the demo app's " + 'served directory (e.g. `examples/demo-app/dist/`) and pass `/filename.csv`, or ' + '(2) serve it with a CORS-enabled local server (`npx serve --cors -l 8000` in the ' + "file's folder) and pass `http://localhost:8000/filename.csv`. " + 'EMBEDDED CONTENT: if you have the file content but cannot serve it (e.g. a remote ' + 'browser context), pass it as a data URL — `data:text/csv;base64,<base64 content>` ' + '(encode with `base64 -i file.csv`). Works for small files (up to ~2MB). ' + 'LARGE DATASETS: for files over a few MB, prefer Parquet (.parquet) over GeoJSON/CSV — ' + 'it loads much faster and is less likely to time out. Convert GeoJSON to GeoParquet ' + 'with geopandas (`gdf.to_parquet("data.parquet")`); kepler reads GeoParquet geometry (WKB) natively.',
50
+ metadata: {
51
+ readOnly: false,
52
+ riskLevel: 'medium',
53
+ requiresConfirmation: true
54
+ },
55
+ inputSchema: z.object({
56
+ url: z.string().describe('The URL to load data from. May be a full http(s) URL, a path served by the demo app ' + '(e.g. /data.geojson), or a data URL embedding small file content (data:text/csv;base64,...).'),
57
+ datasetName: z.string().optional().describe('Optional name for the loaded dataset. If omitted, the URL filename is used. ' + 'Use this instead of creating a duplicate dataset to rename it.')
58
+ }),
59
+ execute: function () {
60
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(execCtx, input) {
61
+ var _ref, url, datasetName, _visState$loaders, _visState$loadOptions, _parsedData$, hasScheme, pageOrigin, parsedUrl, MAX_DATA_URL_LENGTH, visState, response, reason, blob, fileName, file, sourceUrl, batches, result, content, parsedData, _iterator, _step, d, _ref2, dataInfo;
62
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
63
+ while (1) switch (_context.prev = _context.next) {
64
+ case 0:
65
+ _ref = input !== null && input !== void 0 ? input : {}, url = _ref.url, datasetName = _ref.datasetName;
66
+ _context.prev = 1;
67
+ if (!(typeof url !== 'string' || url.trim() === '')) {
68
+ _context.next = 4;
69
+ break;
70
+ }
71
+ throw new Error("Invalid URL: ".concat(url));
72
+ case 4:
73
+ // Resolve the URL before validating the scheme. A scheme-less string is
74
+ // a relative reference — resolve it against the page origin so files
75
+ // served by the demo app itself (same-origin) can be loaded with a bare
76
+ // path (e.g. `/sf_streets.geojson`). Browsers cannot fetch `file://`
77
+ // URLs, so a local file must be served over http(s) by the page's own
78
+ // server (or a CORS-enabled local server). `data:` URLs are allowed for
79
+ // small files — they embed the content directly, which is the one way
80
+ // an agent in a remote browser context can load a local file it cannot
81
+ // serve. `javascript:` and other schemes are rejected.
82
+ hasScheme = /^[a-zA-Z][a-zA-Z0-9+.-]*:/.test(url);
83
+ pageOrigin = typeof window !== 'undefined' ? window.location.origin : undefined;
84
+ _context.prev = 6;
85
+ parsedUrl = hasScheme ? new URL(url) : new URL(url, pageOrigin);
86
+ _context.next = 13;
87
+ break;
88
+ case 10:
89
+ _context.prev = 10;
90
+ _context.t0 = _context["catch"](6);
91
+ throw new Error("Invalid URL: ".concat(url));
92
+ case 13:
93
+ if (!(parsedUrl.protocol === 'data:')) {
94
+ _context.next = 19;
95
+ break;
96
+ }
97
+ // Cap the size so a huge embedded payload can't stall the load or
98
+ // bloat the tool input. For larger files the agent should serve the
99
+ // file over http(s) or convert to Parquet instead.
100
+ MAX_DATA_URL_LENGTH = 2 * 1024 * 1024; // ~2MB of base64
101
+ if (!(parsedUrl.href.length > MAX_DATA_URL_LENGTH)) {
102
+ _context.next = 17;
103
+ break;
104
+ }
105
+ throw new Error("Data URL is too large (".concat(parsedUrl.href.length, " chars). ") + 'For files over a few MB, serve the file over http(s) or convert to Parquet.');
106
+ case 17:
107
+ _context.next = 21;
108
+ break;
109
+ case 19:
110
+ if (!(parsedUrl.protocol !== 'http:' && parsedUrl.protocol !== 'https:')) {
111
+ _context.next = 21;
112
+ break;
113
+ }
114
+ throw new Error("Unsupported URL scheme \"".concat(parsedUrl.protocol, "\". Only http(s) URLs are supported."));
115
+ case 21:
116
+ visState = ctx.getVisState(); // Thread the caller's AbortSignal into the fetch so WebMCP/bridge
117
+ // cancellations stop long-running loads instead of letting them hang.
118
+ _context.next = 24;
119
+ return fetch(parsedUrl.href, {
120
+ signal: execCtx === null || execCtx === void 0 ? void 0 : execCtx.signal
121
+ });
122
+ case 24:
123
+ response = _context.sent;
124
+ if (response.ok) {
125
+ _context.next = 28;
126
+ break;
127
+ }
128
+ // Include the numeric status — statusText is often empty (e.g. some
129
+ // CDNs / error pages), and the code alone makes failures diagnosable.
130
+ reason = response.statusText ? "HTTP ".concat(response.status, " ").concat(response.statusText) : "HTTP ".concat(response.status);
131
+ throw new Error("Failed to fetch data from ".concat(parsedUrl.href, ": ").concat(reason));
132
+ case 28:
133
+ _context.next = 30;
134
+ return response.blob();
135
+ case 30:
136
+ blob = _context.sent;
137
+ // Derive the filename from the URL pathname so query strings (e.g.
138
+ // `data.csv?x=1`) don't end up in the dataset name. A data URL has no
139
+ // pathname — fall back to a name derived from its MIME type so the
140
+ // dataset gets a sensible default label (e.g. `data.csv`).
141
+ fileName = parsedUrl.protocol === 'data:' ? fileNameFromDataUrl(parsedUrl) : parsedUrl.pathname.split('/').pop() || 'data'; // Carry the Blob's MIME type into the File so loader selection in
142
+ // readFileInBatches can use it — a URL with no extension (or a
143
+ // misleading one) would otherwise leave file.type empty and fail to
144
+ // pick the right loader.
145
+ file = new File([blob], fileName, {
146
+ type: blob.type || undefined
147
+ }); // Preserve the source URL so processors hash by URL (avoiding dataset-id
148
+ // collisions between same-named files) and can attach externally-hosted
149
+ // metadata — mirrors loadExternallyHostedDataset. Use the RESOLVED href
150
+ // so a relative path and its absolute form hash to the same dataset id.
151
+ // For a data URL the href IS the content (potentially large) — hash it
152
+ // down so the id stays content-derived (unique per payload) without
153
+ // storing the whole payload in the dataset metadata.
154
+ sourceUrl = parsedUrl.protocol === 'data:' ? "data:".concat(hashString(parsedUrl.href)) : parsedUrl.href;
155
+ file.keplerSourceUrl = sourceUrl;
156
+ _context.next = 37;
157
+ return readFileInBatches({
158
+ file: file,
159
+ fileCache: [],
160
+ loaders: (_visState$loaders = visState.loaders) !== null && _visState$loaders !== void 0 ? _visState$loaders : [],
161
+ loadOptions: (_visState$loadOptions = visState.loadOptions) !== null && _visState$loadOptions !== void 0 ? _visState$loadOptions : {}
162
+ });
163
+ case 37:
164
+ batches = _context.sent;
165
+ _context.next = 40;
166
+ return batches.next();
167
+ case 40:
168
+ result = _context.sent;
169
+ content = {
170
+ data: [],
171
+ fileName: ''
172
+ };
173
+ parsedData = [];
174
+ case 43:
175
+ if (result.done) {
176
+ _context.next = 55;
177
+ break;
178
+ }
179
+ content = result.value;
180
+ _context.next = 47;
181
+ return batches.next();
182
+ case 47:
183
+ result = _context.sent;
184
+ if (!result.done) {
185
+ _context.next = 53;
186
+ break;
187
+ }
188
+ _context.next = 51;
189
+ return processFileData({
190
+ content: content,
191
+ fileCache: []
192
+ });
193
+ case 51:
194
+ parsedData = _context.sent;
195
+ return _context.abrupt("break", 55);
196
+ case 53:
197
+ _context.next = 43;
198
+ break;
199
+ case 55:
200
+ if (!(parsedData.length === 0)) {
201
+ _context.next = 57;
202
+ break;
203
+ }
204
+ throw new Error("No data could be parsed from ".concat(url, "."));
205
+ case 57:
206
+ // Apply a caller-chosen dataset name (default: the URL filename) so the
207
+ // agent never has to create a duplicate dataset just to rename it.
208
+ _iterator = _createForOfIteratorHelper(parsedData);
209
+ try {
210
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
211
+ d = _step.value;
212
+ if (d !== null && d !== void 0 && d.info) {
213
+ d.info.label = (_ref2 = datasetName !== null && datasetName !== void 0 ? datasetName : d.info.label) !== null && _ref2 !== void 0 ? _ref2 : fileName;
214
+ }
215
+ }
216
+ } catch (err) {
217
+ _iterator.e(err);
218
+ } finally {
219
+ _iterator.f();
220
+ }
221
+ ctx.dispatch(addDataToMap({
222
+ datasets: parsedData,
223
+ // Do NOT auto-create a layer — the assistant creates the layer
224
+ // explicitly via `map.add-layer` (with full styling control), so
225
+ // loading data never produces a duplicate default layer.
226
+ options: {
227
+ autoCreateLayers: false,
228
+ centerMap: true
229
+ }
230
+ }));
231
+ dataInfo = (_parsedData$ = parsedData[0]) === null || _parsedData$ === void 0 ? void 0 : _parsedData$.info;
232
+ return _context.abrupt("return", {
233
+ success: true,
234
+ commandId: loadDataCommandId,
235
+ data: {
236
+ details: "Successfully loaded data from ".concat(url),
237
+ dataInfo: dataInfo
238
+ }
239
+ });
240
+ case 64:
241
+ _context.prev = 64;
242
+ _context.t1 = _context["catch"](1);
243
+ return _context.abrupt("return", {
244
+ success: false,
245
+ commandId: loadDataCommandId,
246
+ error: _context.t1 instanceof Error ? _context.t1.message : 'Unknown error',
247
+ data: {
248
+ instruction: 'Try to fix the error. If the error persists, ask the user to try with a different URL or format.'
249
+ }
250
+ });
251
+ case 67:
252
+ case "end":
253
+ return _context.stop();
254
+ }
255
+ }, _callee, null, [[1, 64], [6, 10]]);
256
+ }));
257
+ function execute(_x, _x2) {
258
+ return _execute.apply(this, arguments);
259
+ }
260
+ return execute;
261
+ }()
262
+ };
263
+ }
264
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6IiwiYWRkRGF0YVRvTWFwIiwicmVhZEZpbGVJbkJhdGNoZXMiLCJwcm9jZXNzRmlsZURhdGEiLCJEQVRBX1VSTF9FWFRFTlNJT05TIiwiZmlsZU5hbWVGcm9tRGF0YVVybCIsInBhcnNlZFVybCIsIl9EQVRBX1VSTF9FWFRFTlNJT05TJCIsIm1pbWUiLCJwYXRobmFtZSIsInNwbGl0IiwidG9Mb3dlckNhc2UiLCJjb25jYXQiLCJoYXNoU3RyaW5nIiwic3RyIiwiaGFzaCIsImkiLCJsZW5ndGgiLCJjaGFyQ29kZUF0IiwidG9TdHJpbmciLCJsb2FkRGF0YUNvbW1hbmRJZCIsImdldExvYWREYXRhQ29tbWFuZCIsImN0eCIsImlkIiwibmFtZSIsImdyb3VwIiwiZGVzY3JpcHRpb24iLCJtZXRhZGF0YSIsInJlYWRPbmx5Iiwicmlza0xldmVsIiwicmVxdWlyZXNDb25maXJtYXRpb24iLCJpbnB1dFNjaGVtYSIsIm9iamVjdCIsInVybCIsInN0cmluZyIsImRlc2NyaWJlIiwiZGF0YXNldE5hbWUiLCJvcHRpb25hbCIsImV4ZWN1dGUiLCJfZXhlY3V0ZSIsIl9hc3luY1RvR2VuZXJhdG9yIiwiX3JlZ2VuZXJhdG9yUnVudGltZSIsIm1hcmsiLCJfY2FsbGVlIiwiZXhlY0N0eCIsImlucHV0IiwiX3JlZiIsIl92aXNTdGF0ZSRsb2FkZXJzIiwiX3Zpc1N0YXRlJGxvYWRPcHRpb25zIiwiX3BhcnNlZERhdGEkIiwiaGFzU2NoZW1lIiwicGFnZU9yaWdpbiIsIk1BWF9EQVRBX1VSTF9MRU5HVEgiLCJ2aXNTdGF0ZSIsInJlc3BvbnNlIiwicmVhc29uIiwiYmxvYiIsImZpbGVOYW1lIiwiZmlsZSIsInNvdXJjZVVybCIsImJhdGNoZXMiLCJyZXN1bHQiLCJjb250ZW50IiwicGFyc2VkRGF0YSIsIl9pdGVyYXRvciIsIl9zdGVwIiwiZCIsIl9yZWYyIiwiZGF0YUluZm8iLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwidHJpbSIsIkVycm9yIiwidGVzdCIsIndpbmRvdyIsImxvY2F0aW9uIiwib3JpZ2luIiwidW5kZWZpbmVkIiwiVVJMIiwidDAiLCJwcm90b2NvbCIsImhyZWYiLCJnZXRWaXNTdGF0ZSIsImZldGNoIiwic2lnbmFsIiwic2VudCIsIm9rIiwic3RhdHVzVGV4dCIsInN0YXR1cyIsInBvcCIsIkZpbGUiLCJ0eXBlIiwia2VwbGVyU291cmNlVXJsIiwiZmlsZUNhY2hlIiwibG9hZGVycyIsImxvYWRPcHRpb25zIiwiZGF0YSIsImRvbmUiLCJ2YWx1ZSIsImFicnVwdCIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwicyIsIm4iLCJpbmZvIiwibGFiZWwiLCJlcnIiLCJlIiwiZiIsImRpc3BhdGNoIiwiZGF0YXNldHMiLCJvcHRpb25zIiwiYXV0b0NyZWF0ZUxheWVycyIsImNlbnRlck1hcCIsInN1Y2Nlc3MiLCJjb21tYW5kSWQiLCJkZXRhaWxzIiwidDEiLCJlcnJvciIsIm1lc3NhZ2UiLCJpbnN0cnVjdGlvbiIsInN0b3AiLCJfeCIsIl94MiIsImFwcGx5IiwiYXJndW1lbnRzIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbW1hbmRzL2xvYWQtZGF0YS1jb21tYW5kLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCB0eXBlIHtSb29tQ29tbWFuZH0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5pbXBvcnQge2FkZERhdGFUb01hcH0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7cmVhZEZpbGVJbkJhdGNoZXMsIHByb2Nlc3NGaWxlRGF0YX0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB0eXBlIHtQcm9jZXNzRmlsZURhdGFDb250ZW50fSBmcm9tICdAa2VwbGVyLmdsL3Byb2Nlc3NvcnMnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBNSU1FIHR5cGUg4oaSIGZpbGUgZXh0ZW5zaW9uIGZvciBkYXRhIFVSTHMsIHNvIGEgYGRhdGE6dGV4dC9jc3Y7YmFzZTY0LC4uLmBcbi8vIHBheWxvYWQgZ2V0cyBhIHNlbnNpYmxlIGRlZmF1bHQgZGF0YXNldCBuYW1lIChgZGF0YS5jc3ZgKSBpbnN0ZWFkIG9mIGBkYXRhYC5cbmNvbnN0IERBVEFfVVJMX0VYVEVOU0lPTlM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICd0ZXh0L2Nzdic6ICcuY3N2JyxcbiAgJ2FwcGxpY2F0aW9uL2Nzdic6ICcuY3N2JyxcbiAgJ2FwcGxpY2F0aW9uL2pzb24nOiAnLmpzb24nLFxuICAnYXBwbGljYXRpb24vZ2VvK2pzb24nOiAnLmdlb2pzb24nLFxuICAnYXBwbGljYXRpb24vdm5kLmFwYWNoZS5hcnJvdy5maWxlJzogJy5hcnJvdycsXG4gICdhcHBsaWNhdGlvbi92bmQuYXBhY2hlLnBhcnF1ZXQnOiAnLnBhcnF1ZXQnLFxuICAndGV4dC9wbGFpbic6ICcudHh0J1xufTtcblxuZnVuY3Rpb24gZmlsZU5hbWVGcm9tRGF0YVVybChwYXJzZWRVcmw6IFVSTCk6IHN0cmluZyB7XG4gIC8vIGRhdGE6dGV4dC9jc3Y7YmFzZTY0LC4uLiDihpIgcGF0aG5hbWUgaXMgXCJ0ZXh0L2NzdjtiYXNlNjQsXCJcbiAgY29uc3QgbWltZSA9IHBhcnNlZFVybC5wYXRobmFtZS5zcGxpdCgnOycpWzBdLnRvTG93ZXJDYXNlKCk7XG4gIHJldHVybiBgZGF0YSR7REFUQV9VUkxfRVhURU5TSU9OU1ttaW1lXSA/PyAnJ31gO1xufVxuXG4vLyBTYW1lIDMyLWJpdCBzdHJpbmcgaGFzaCB0aGUgcHJvY2Vzc29ycyB1c2UgZm9yIGRhdGFzZXQgaWRzIOKAlCBhcHBsaWVkIHRvIGFcbi8vIGRhdGEgVVJMJ3MgY29udGVudCBzbyB0aGUgZGF0YXNldCBpZCBpcyBjb250ZW50LWRlcml2ZWQgKHVuaXF1ZSBwZXIgcGF5bG9hZClcbi8vIHdpdGhvdXQgc3RvcmluZyB0aGUgd2hvbGUgKHBvdGVudGlhbGx5IGxhcmdlKSBkYXRhIFVSTCBpbiB0aGUgbWV0YWRhdGEuXG5mdW5jdGlvbiBoYXNoU3RyaW5nKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0ci5jaGFyQ29kZUF0KGkpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgaGFzaCB8PSAwO1xuICB9XG4gIHJldHVybiBoYXNoLnRvU3RyaW5nKDM2KTtcbn1cblxuZXhwb3J0IGNvbnN0IGxvYWREYXRhQ29tbWFuZElkID0gJ21hcC5sb2FkLWRhdGEnIGFzIGNvbnN0O1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZERhdGFDb21tYW5kKGN0eDogS2VwbGVyQ29udGV4dCk6IFJvb21Db21tYW5kIHtcbiAgcmV0dXJuIHtcbiAgICBpZDogbG9hZERhdGFDb21tYW5kSWQsXG4gICAgbmFtZTogJ0xvYWQgZGF0YSBmcm9tIFVSTCcsXG4gICAgZ3JvdXA6ICdNYXAnLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0xvYWQgYSBkYXRhc2V0IGZyb20gYSBVUkwgaW50byBrZXBsZXIuZ2wuIFRoZSBkYXRhc2V0IGlzIG5hbWVkIGFmdGVyIHRoZSBVUkwgZmlsZW5hbWUsICcgK1xuICAgICAgJ29yIGFmdGVyIGBkYXRhc2V0TmFtZWAgd2hlbiBwcm92aWRlZC4gRG9lcyBOT1QgY3JlYXRlIGEgbGF5ZXIg4oCUIGNhbGwgbWFwLmFkZC1sYXllciB0byB2aXN1YWxpemUuICcgK1xuICAgICAgJ0RvIE5PVCBjcmVhdGUgYSBkdXBsaWNhdGUgZGF0YXNldCAoZS5nLiB2aWEgbWFwLmNyZWF0ZS10YWJsZSkganVzdCB0byByZW5hbWUgaXQ7ICcgK1xuICAgICAgJ25hbWUgaXQgaGVyZSB3aXRoIGBkYXRhc2V0TmFtZWAgaW5zdGVhZCwgb3IgdXNlIHRoZSBVUkwtZmlsZW5hbWUgZGF0YXNldCBhcy1pcy4gJyArXG4gICAgICAnTE9DQUwgRklMRVM6IGEgbG9jYWwgZmlsZSBtdXN0IGJlIHNlcnZlZCBvdmVyIGh0dHAocykg4oCUIHRoZSBicm93c2VyIGNhbm5vdCBmZXRjaCAnICtcbiAgICAgIFwiYGZpbGU6Ly9gIHBhdGhzLiBUbyBsb2FkIGEgZmlsZSB5b3UgaGF2ZSBvbiBkaXNrOiAoMSkgY29weSBpdCBpbnRvIHRoZSBkZW1vIGFwcCdzIFwiICtcbiAgICAgICdzZXJ2ZWQgZGlyZWN0b3J5IChlLmcuIGBleGFtcGxlcy9kZW1vLWFwcC9kaXN0L2ApIGFuZCBwYXNzIGAvZmlsZW5hbWUuY3N2YCwgb3IgJyArXG4gICAgICAnKDIpIHNlcnZlIGl0IHdpdGggYSBDT1JTLWVuYWJsZWQgbG9jYWwgc2VydmVyIChgbnB4IHNlcnZlIC0tY29ycyAtbCA4MDAwYCBpbiB0aGUgJyArXG4gICAgICBcImZpbGUncyBmb2xkZXIpIGFuZCBwYXNzIGBodHRwOi8vbG9jYWxob3N0OjgwMDAvZmlsZW5hbWUuY3N2YC4gXCIgK1xuICAgICAgJ0VNQkVEREVEIENPTlRFTlQ6IGlmIHlvdSBoYXZlIHRoZSBmaWxlIGNvbnRlbnQgYnV0IGNhbm5vdCBzZXJ2ZSBpdCAoZS5nLiBhIHJlbW90ZSAnICtcbiAgICAgICdicm93c2VyIGNvbnRleHQpLCBwYXNzIGl0IGFzIGEgZGF0YSBVUkwg4oCUIGBkYXRhOnRleHQvY3N2O2Jhc2U2NCw8YmFzZTY0IGNvbnRlbnQ+YCAnICtcbiAgICAgICcoZW5jb2RlIHdpdGggYGJhc2U2NCAtaSBmaWxlLmNzdmApLiBXb3JrcyBmb3Igc21hbGwgZmlsZXMgKHVwIHRvIH4yTUIpLiAnICtcbiAgICAgICdMQVJHRSBEQVRBU0VUUzogZm9yIGZpbGVzIG92ZXIgYSBmZXcgTUIsIHByZWZlciBQYXJxdWV0ICgucGFycXVldCkgb3ZlciBHZW9KU09OL0NTViDigJQgJyArXG4gICAgICAnaXQgbG9hZHMgbXVjaCBmYXN0ZXIgYW5kIGlzIGxlc3MgbGlrZWx5IHRvIHRpbWUgb3V0LiBDb252ZXJ0IEdlb0pTT04gdG8gR2VvUGFycXVldCAnICtcbiAgICAgICd3aXRoIGdlb3BhbmRhcyAoYGdkZi50b19wYXJxdWV0KFwiZGF0YS5wYXJxdWV0XCIpYCk7IGtlcGxlciByZWFkcyBHZW9QYXJxdWV0IGdlb21ldHJ5IChXS0IpIG5hdGl2ZWx5LicsXG4gICAgbWV0YWRhdGE6IHtyZWFkT25seTogZmFsc2UsIHJpc2tMZXZlbDogJ21lZGl1bScsIHJlcXVpcmVzQ29uZmlybWF0aW9uOiB0cnVlfSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgdXJsOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgJ1RoZSBVUkwgdG8gbG9hZCBkYXRhIGZyb20uIE1heSBiZSBhIGZ1bGwgaHR0cChzKSBVUkwsIGEgcGF0aCBzZXJ2ZWQgYnkgdGhlIGRlbW8gYXBwICcgK1xuICAgICAgICAgICAgJyhlLmcuIC9kYXRhLmdlb2pzb24pLCBvciBhIGRhdGEgVVJMIGVtYmVkZGluZyBzbWFsbCBmaWxlIGNvbnRlbnQgKGRhdGE6dGV4dC9jc3Y7YmFzZTY0LC4uLikuJ1xuICAgICAgICApLFxuICAgICAgZGF0YXNldE5hbWU6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5vcHRpb25hbCgpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICAnT3B0aW9uYWwgbmFtZSBmb3IgdGhlIGxvYWRlZCBkYXRhc2V0LiBJZiBvbWl0dGVkLCB0aGUgVVJMIGZpbGVuYW1lIGlzIHVzZWQuICcgK1xuICAgICAgICAgICAgJ1VzZSB0aGlzIGluc3RlYWQgb2YgY3JlYXRpbmcgYSBkdXBsaWNhdGUgZGF0YXNldCB0byByZW5hbWUgaXQuJ1xuICAgICAgICApXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChleGVjQ3R4LCBpbnB1dCkgPT4ge1xuICAgICAgY29uc3Qge3VybCwgZGF0YXNldE5hbWV9ID0gKGlucHV0ID8/IHt9KSBhcyB7dXJsOiBzdHJpbmc7IGRhdGFzZXROYW1lPzogc3RyaW5nfTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgdXJsICE9PSAnc3RyaW5nJyB8fCB1cmwudHJpbSgpID09PSAnJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBVUkw6ICR7dXJsfWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgVVJMIGJlZm9yZSB2YWxpZGF0aW5nIHRoZSBzY2hlbWUuIEEgc2NoZW1lLWxlc3Mgc3RyaW5nIGlzXG4gICAgICAgIC8vIGEgcmVsYXRpdmUgcmVmZXJlbmNlIOKAlCByZXNvbHZlIGl0IGFnYWluc3QgdGhlIHBhZ2Ugb3JpZ2luIHNvIGZpbGVzXG4gICAgICAgIC8vIHNlcnZlZCBieSB0aGUgZGVtbyBhcHAgaXRzZWxmIChzYW1lLW9yaWdpbikgY2FuIGJlIGxvYWRlZCB3aXRoIGEgYmFyZVxuICAgICAgICAvLyBwYXRoIChlLmcuIGAvc2Zfc3RyZWV0cy5nZW9qc29uYCkuIEJyb3dzZXJzIGNhbm5vdCBmZXRjaCBgZmlsZTovL2BcbiAgICAgICAgLy8gVVJMcywgc28gYSBsb2NhbCBmaWxlIG11c3QgYmUgc2VydmVkIG92ZXIgaHR0cChzKSBieSB0aGUgcGFnZSdzIG93blxuICAgICAgICAvLyBzZXJ2ZXIgKG9yIGEgQ09SUy1lbmFibGVkIGxvY2FsIHNlcnZlcikuIGBkYXRhOmAgVVJMcyBhcmUgYWxsb3dlZCBmb3JcbiAgICAgICAgLy8gc21hbGwgZmlsZXMg4oCUIHRoZXkgZW1iZWQgdGhlIGNvbnRlbnQgZGlyZWN0bHksIHdoaWNoIGlzIHRoZSBvbmUgd2F5XG4gICAgICAgIC8vIGFuIGFnZW50IGluIGEgcmVtb3RlIGJyb3dzZXIgY29udGV4dCBjYW4gbG9hZCBhIGxvY2FsIGZpbGUgaXQgY2Fubm90XG4gICAgICAgIC8vIHNlcnZlLiBgamF2YXNjcmlwdDpgIGFuZCBvdGhlciBzY2hlbWVzIGFyZSByZWplY3RlZC5cbiAgICAgICAgY29uc3QgaGFzU2NoZW1lID0gL15bYS16QS1aXVthLXpBLVowLTkrLi1dKjovLnRlc3QodXJsKTtcbiAgICAgICAgY29uc3QgcGFnZU9yaWdpbiA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93LmxvY2F0aW9uLm9yaWdpbiA6IHVuZGVmaW5lZDtcbiAgICAgICAgbGV0IHBhcnNlZFVybDogVVJMO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHBhcnNlZFVybCA9IGhhc1NjaGVtZSA/IG5ldyBVUkwodXJsKSA6IG5ldyBVUkwodXJsLCBwYWdlT3JpZ2luKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIFVSTDogJHt1cmx9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2RhdGE6Jykge1xuICAgICAgICAgIC8vIENhcCB0aGUgc2l6ZSBzbyBhIGh1Z2UgZW1iZWRkZWQgcGF5bG9hZCBjYW4ndCBzdGFsbCB0aGUgbG9hZCBvclxuICAgICAgICAgIC8vIGJsb2F0IHRoZSB0b29sIGlucHV0LiBGb3IgbGFyZ2VyIGZpbGVzIHRoZSBhZ2VudCBzaG91bGQgc2VydmUgdGhlXG4gICAgICAgICAgLy8gZmlsZSBvdmVyIGh0dHAocykgb3IgY29udmVydCB0byBQYXJxdWV0IGluc3RlYWQuXG4gICAgICAgICAgY29uc3QgTUFYX0RBVEFfVVJMX0xFTkdUSCA9IDIgKiAxMDI0ICogMTAyNDsgLy8gfjJNQiBvZiBiYXNlNjRcbiAgICAgICAgICBpZiAocGFyc2VkVXJsLmhyZWYubGVuZ3RoID4gTUFYX0RBVEFfVVJMX0xFTkdUSCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRGF0YSBVUkwgaXMgdG9vIGxhcmdlICgke3BhcnNlZFVybC5ocmVmLmxlbmd0aH0gY2hhcnMpLiBgICtcbiAgICAgICAgICAgICAgICAnRm9yIGZpbGVzIG92ZXIgYSBmZXcgTUIsIHNlcnZlIHRoZSBmaWxlIG92ZXIgaHR0cChzKSBvciBjb252ZXJ0IHRvIFBhcnF1ZXQuJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAocGFyc2VkVXJsLnByb3RvY29sICE9PSAnaHR0cDonICYmIHBhcnNlZFVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVW5zdXBwb3J0ZWQgVVJMIHNjaGVtZSBcIiR7cGFyc2VkVXJsLnByb3RvY29sfVwiLiBPbmx5IGh0dHAocykgVVJMcyBhcmUgc3VwcG9ydGVkLmBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmlzU3RhdGUgPSBjdHguZ2V0VmlzU3RhdGUoKTtcbiAgICAgICAgLy8gVGhyZWFkIHRoZSBjYWxsZXIncyBBYm9ydFNpZ25hbCBpbnRvIHRoZSBmZXRjaCBzbyBXZWJNQ1AvYnJpZGdlXG4gICAgICAgIC8vIGNhbmNlbGxhdGlvbnMgc3RvcCBsb25nLXJ1bm5pbmcgbG9hZHMgaW5zdGVhZCBvZiBsZXR0aW5nIHRoZW0gaGFuZy5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChwYXJzZWRVcmwuaHJlZiwge3NpZ25hbDogZXhlY0N0eD8uc2lnbmFsfSk7XG4gICAgICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgICAvLyBJbmNsdWRlIHRoZSBudW1lcmljIHN0YXR1cyDigJQgc3RhdHVzVGV4dCBpcyBvZnRlbiBlbXB0eSAoZS5nLiBzb21lXG4gICAgICAgICAgLy8gQ0ROcyAvIGVycm9yIHBhZ2VzKSwgYW5kIHRoZSBjb2RlIGFsb25lIG1ha2VzIGZhaWx1cmVzIGRpYWdub3NhYmxlLlxuICAgICAgICAgIGNvbnN0IHJlYXNvbiA9IHJlc3BvbnNlLnN0YXR1c1RleHRcbiAgICAgICAgICAgID8gYEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gXG4gICAgICAgICAgICA6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfWA7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBGYWlsZWQgdG8gZmV0Y2ggZGF0YSBmcm9tICR7cGFyc2VkVXJsLmhyZWZ9OiAke3JlYXNvbn1gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCByZXNwb25zZS5ibG9iKCk7XG4gICAgICAgIC8vIERlcml2ZSB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgVVJMIHBhdGhuYW1lIHNvIHF1ZXJ5IHN0cmluZ3MgKGUuZy5cbiAgICAgICAgLy8gYGRhdGEuY3N2P3g9MWApIGRvbid0IGVuZCB1cCBpbiB0aGUgZGF0YXNldCBuYW1lLiBBIGRhdGEgVVJMIGhhcyBub1xuICAgICAgICAvLyBwYXRobmFtZSDigJQgZmFsbCBiYWNrIHRvIGEgbmFtZSBkZXJpdmVkIGZyb20gaXRzIE1JTUUgdHlwZSBzbyB0aGVcbiAgICAgICAgLy8gZGF0YXNldCBnZXRzIGEgc2Vuc2libGUgZGVmYXVsdCBsYWJlbCAoZS5nLiBgZGF0YS5jc3ZgKS5cbiAgICAgICAgY29uc3QgZmlsZU5hbWUgPVxuICAgICAgICAgIHBhcnNlZFVybC5wcm90b2NvbCA9PT0gJ2RhdGE6J1xuICAgICAgICAgICAgPyBmaWxlTmFtZUZyb21EYXRhVXJsKHBhcnNlZFVybClcbiAgICAgICAgICAgIDogcGFyc2VkVXJsLnBhdGhuYW1lLnNwbGl0KCcvJykucG9wKCkgfHwgJ2RhdGEnO1xuICAgICAgICAvLyBDYXJyeSB0aGUgQmxvYidzIE1JTUUgdHlwZSBpbnRvIHRoZSBGaWxlIHNvIGxvYWRlciBzZWxlY3Rpb24gaW5cbiAgICAgICAgLy8gcmVhZEZpbGVJbkJhdGNoZXMgY2FuIHVzZSBpdCDigJQgYSBVUkwgd2l0aCBubyBleHRlbnNpb24gKG9yIGFcbiAgICAgICAgLy8gbWlzbGVhZGluZyBvbmUpIHdvdWxkIG90aGVyd2lzZSBsZWF2ZSBmaWxlLnR5cGUgZW1wdHkgYW5kIGZhaWwgdG9cbiAgICAgICAgLy8gcGljayB0aGUgcmlnaHQgbG9hZGVyLlxuICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlTmFtZSwge3R5cGU6IGJsb2IudHlwZSB8fCB1bmRlZmluZWR9KTtcbiAgICAgICAgLy8gUHJlc2VydmUgdGhlIHNvdXJjZSBVUkwgc28gcHJvY2Vzc29ycyBoYXNoIGJ5IFVSTCAoYXZvaWRpbmcgZGF0YXNldC1pZFxuICAgICAgICAvLyBjb2xsaXNpb25zIGJldHdlZW4gc2FtZS1uYW1lZCBmaWxlcykgYW5kIGNhbiBhdHRhY2ggZXh0ZXJuYWxseS1ob3N0ZWRcbiAgICAgICAgLy8gbWV0YWRhdGEg4oCUIG1pcnJvcnMgbG9hZEV4dGVybmFsbHlIb3N0ZWREYXRhc2V0LiBVc2UgdGhlIFJFU09MVkVEIGhyZWZcbiAgICAgICAgLy8gc28gYSByZWxhdGl2ZSBwYXRoIGFuZCBpdHMgYWJzb2x1dGUgZm9ybSBoYXNoIHRvIHRoZSBzYW1lIGRhdGFzZXQgaWQuXG4gICAgICAgIC8vIEZvciBhIGRhdGEgVVJMIHRoZSBocmVmIElTIHRoZSBjb250ZW50IChwb3RlbnRpYWxseSBsYXJnZSkg4oCUIGhhc2ggaXRcbiAgICAgICAgLy8gZG93biBzbyB0aGUgaWQgc3RheXMgY29udGVudC1kZXJpdmVkICh1bmlxdWUgcGVyIHBheWxvYWQpIHdpdGhvdXRcbiAgICAgICAgLy8gc3RvcmluZyB0aGUgd2hvbGUgcGF5bG9hZCBpbiB0aGUgZGF0YXNldCBtZXRhZGF0YS5cbiAgICAgICAgY29uc3Qgc291cmNlVXJsID1cbiAgICAgICAgICBwYXJzZWRVcmwucHJvdG9jb2wgPT09ICdkYXRhOicgPyBgZGF0YToke2hhc2hTdHJpbmcocGFyc2VkVXJsLmhyZWYpfWAgOiBwYXJzZWRVcmwuaHJlZjtcbiAgICAgICAgKGZpbGUgYXMgRmlsZSAmIHtrZXBsZXJTb3VyY2VVcmw/OiBzdHJpbmd9KS5rZXBsZXJTb3VyY2VVcmwgPSBzb3VyY2VVcmw7XG5cbiAgICAgICAgY29uc3QgYmF0Y2hlcyA9IGF3YWl0IHJlYWRGaWxlSW5CYXRjaGVzKHtcbiAgICAgICAgICBmaWxlLFxuICAgICAgICAgIGZpbGVDYWNoZTogW10sXG4gICAgICAgICAgbG9hZGVyczogdmlzU3RhdGUubG9hZGVycyA/PyBbXSxcbiAgICAgICAgICBsb2FkT3B0aW9uczogdmlzU3RhdGUubG9hZE9wdGlvbnMgPz8ge31cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGJhdGNoZXMubmV4dCgpO1xuICAgICAgICBsZXQgY29udGVudDogUHJvY2Vzc0ZpbGVEYXRhQ29udGVudCA9IHtkYXRhOiBbXSwgZmlsZU5hbWU6ICcnfTtcbiAgICAgICAgbGV0IHBhcnNlZERhdGE6IGFueVtdID0gW107XG5cbiAgICAgICAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgICAgICAgIGNvbnRlbnQgPSByZXN1bHQudmFsdWUgYXMgUHJvY2Vzc0ZpbGVEYXRhQ29udGVudDtcbiAgICAgICAgICByZXN1bHQgPSBhd2FpdCBiYXRjaGVzLm5leHQoKTtcbiAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICAgIHBhcnNlZERhdGEgPSBhd2FpdCBwcm9jZXNzRmlsZURhdGEoe2NvbnRlbnQsIGZpbGVDYWNoZTogW119KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYXJzZWREYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gZGF0YSBjb3VsZCBiZSBwYXJzZWQgZnJvbSAke3VybH0uYCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBhIGNhbGxlci1jaG9zZW4gZGF0YXNldCBuYW1lIChkZWZhdWx0OiB0aGUgVVJMIGZpbGVuYW1lKSBzbyB0aGVcbiAgICAgICAgLy8gYWdlbnQgbmV2ZXIgaGFzIHRvIGNyZWF0ZSBhIGR1cGxpY2F0ZSBkYXRhc2V0IGp1c3QgdG8gcmVuYW1lIGl0LlxuICAgICAgICBmb3IgKGNvbnN0IGQgb2YgcGFyc2VkRGF0YSkge1xuICAgICAgICAgIGlmIChkPy5pbmZvKSB7XG4gICAgICAgICAgICBkLmluZm8ubGFiZWwgPSBkYXRhc2V0TmFtZSA/PyBkLmluZm8ubGFiZWwgPz8gZmlsZU5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY3R4LmRpc3BhdGNoKFxuICAgICAgICAgIGFkZERhdGFUb01hcCh7XG4gICAgICAgICAgICBkYXRhc2V0czogcGFyc2VkRGF0YSxcbiAgICAgICAgICAgIC8vIERvIE5PVCBhdXRvLWNyZWF0ZSBhIGxheWVyIOKAlCB0aGUgYXNzaXN0YW50IGNyZWF0ZXMgdGhlIGxheWVyXG4gICAgICAgICAgICAvLyBleHBsaWNpdGx5IHZpYSBgbWFwLmFkZC1sYXllcmAgKHdpdGggZnVsbCBzdHlsaW5nIGNvbnRyb2wpLCBzb1xuICAgICAgICAgICAgLy8gbG9hZGluZyBkYXRhIG5ldmVyIHByb2R1Y2VzIGEgZHVwbGljYXRlIGRlZmF1bHQgbGF5ZXIuXG4gICAgICAgICAgICBvcHRpb25zOiB7YXV0b0NyZWF0ZUxheWVyczogZmFsc2UsIGNlbnRlck1hcDogdHJ1ZX1cbiAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IGRhdGFJbmZvID0gcGFyc2VkRGF0YVswXT8uaW5mbztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiB0cnVlLFxuICAgICAgICAgIGNvbW1hbmRJZDogbG9hZERhdGFDb21tYW5kSWQsXG4gICAgICAgICAgZGF0YToge2RldGFpbHM6IGBTdWNjZXNzZnVsbHkgbG9hZGVkIGRhdGEgZnJvbSAke3VybH1gLCBkYXRhSW5mb31cbiAgICAgICAgfTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3VjY2VzczogZmFsc2UsXG4gICAgICAgICAgY29tbWFuZElkOiBsb2FkRGF0YUNvbW1hbmRJZCxcbiAgICAgICAgICBlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgaW5zdHJ1Y3Rpb246XG4gICAgICAgICAgICAgICdUcnkgdG8gZml4IHRoZSBlcnJvci4gSWYgdGhlIGVycm9yIHBlcnNpc3RzLCBhc2sgdGhlIHVzZXIgdG8gdHJ5IHdpdGggYSBkaWZmZXJlbnQgVVJMIG9yIGZvcm1hdC4nXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUdBLFNBQVFBLENBQUMsUUFBTyxLQUFLO0FBQ3JCLFNBQVFDLFlBQVksUUFBTyxvQkFBb0I7QUFDL0MsU0FBUUMsaUJBQWlCLEVBQUVDLGVBQWUsUUFBTyx1QkFBdUI7QUFJeEU7QUFDQTtBQUNBLElBQU1DLG1CQUEyQyxHQUFHO0VBQ2xELFVBQVUsRUFBRSxNQUFNO0VBQ2xCLGlCQUFpQixFQUFFLE1BQU07RUFDekIsa0JBQWtCLEVBQUUsT0FBTztFQUMzQixzQkFBc0IsRUFBRSxVQUFVO0VBQ2xDLG1DQUFtQyxFQUFFLFFBQVE7RUFDN0MsZ0NBQWdDLEVBQUUsVUFBVTtFQUM1QyxZQUFZLEVBQUU7QUFDaEIsQ0FBQztBQUVELFNBQVNDLG1CQUFtQkEsQ0FBQ0MsU0FBYyxFQUFVO0VBQUEsSUFBQUMscUJBQUE7RUFDbkQ7RUFDQSxJQUFNQyxJQUFJLEdBQUdGLFNBQVMsQ0FBQ0csUUFBUSxDQUFDQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENB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
@@ -0,0 +1,112 @@
1
+ import _asyncToGenerator from "@babel/runtime/helpers/esm/asyncToGenerator";
2
+ import _regeneratorRuntime from "@babel/runtime/regenerator";
3
+ 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; } } }; }
4
+ 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; } }
5
+ 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; }
6
+ // SPDX-License-Identifier: MIT
7
+ // Copyright contributors to the kepler.gl project
8
+
9
+ import { z } from 'zod';
10
+ export var saveDataCommandId = 'map.save-data';
11
+ export function getSaveDataCommand(ctx) {
12
+ return {
13
+ id: saveDataCommandId,
14
+ name: 'Save DuckDB table to map',
15
+ group: 'Map',
16
+ description: 'Save a DuckDB table to kepler.gl as a map dataset. Works with any table including those from buffer, zipcode, county, state, isochrone, routing, query results, etc.',
17
+ metadata: {
18
+ readOnly: false,
19
+ riskLevel: 'medium',
20
+ requiresConfirmation: true
21
+ },
22
+ inputSchema: z.object({
23
+ datasetNames: z.array(z.string()).min(1).describe('The names of the DuckDB tables to load into kepler.gl.')
24
+ }),
25
+ execute: function () {
26
+ var _execute = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime.mark(function _callee(_execCtx, input) {
27
+ var _ref, datasetNames, loadedDatasetNames, _iterator, _step, datasetName, result;
28
+ return _regeneratorRuntime.wrap(function _callee$(_context) {
29
+ while (1) switch (_context.prev = _context.next) {
30
+ case 0:
31
+ _ref = input !== null && input !== void 0 ? input : {}, datasetNames = _ref.datasetNames;
32
+ _context.prev = 1;
33
+ if (!(!Array.isArray(datasetNames) || datasetNames.length === 0 || datasetNames.some(function (name) {
34
+ return typeof name !== 'string' || name.length === 0;
35
+ }))) {
36
+ _context.next = 4;
37
+ break;
38
+ }
39
+ throw new Error('datasetNames must be a non-empty array of DuckDB table names, e.g. ["my_table"].');
40
+ case 4:
41
+ loadedDatasetNames = [];
42
+ _iterator = _createForOfIteratorHelper(datasetNames);
43
+ _context.prev = 6;
44
+ _iterator.s();
45
+ case 8:
46
+ if ((_step = _iterator.n()).done) {
47
+ _context.next = 18;
48
+ break;
49
+ }
50
+ datasetName = _step.value;
51
+ _context.next = 12;
52
+ return ctx.loadTableToKepler(datasetName);
53
+ case 12:
54
+ result = _context.sent;
55
+ if (result.success) {
56
+ _context.next = 15;
57
+ break;
58
+ }
59
+ throw new Error("Cannot save table \"".concat(datasetName, "\" to kepler.gl: ").concat(result.error));
60
+ case 15:
61
+ loadedDatasetNames.push(datasetName);
62
+ case 16:
63
+ _context.next = 8;
64
+ break;
65
+ case 18:
66
+ _context.next = 23;
67
+ break;
68
+ case 20:
69
+ _context.prev = 20;
70
+ _context.t0 = _context["catch"](6);
71
+ _iterator.e(_context.t0);
72
+ case 23:
73
+ _context.prev = 23;
74
+ _iterator.f();
75
+ return _context.finish(23);
76
+ case 26:
77
+ if (!(loadedDatasetNames.length === 0)) {
78
+ _context.next = 28;
79
+ break;
80
+ }
81
+ throw new Error("No datasets found from ".concat(datasetNames.join(', ')));
82
+ case 28:
83
+ return _context.abrupt("return", {
84
+ success: true,
85
+ commandId: saveDataCommandId,
86
+ data: {
87
+ savedDatasetNames: loadedDatasetNames,
88
+ details: "Successfully saved dataset(s): ".concat(loadedDatasetNames.join(', '), " in kepler.gl")
89
+ }
90
+ });
91
+ case 31:
92
+ _context.prev = 31;
93
+ _context.t1 = _context["catch"](1);
94
+ return _context.abrupt("return", {
95
+ success: false,
96
+ commandId: saveDataCommandId,
97
+ error: "Cannot save data to kepler.gl: ".concat(_context.t1 instanceof Error ? _context.t1.message : String(_context.t1))
98
+ });
99
+ case 34:
100
+ case "end":
101
+ return _context.stop();
102
+ }
103
+ }, _callee, null, [[1, 31], [6, 20, 23, 26]]);
104
+ }));
105
+ function execute(_x, _x2) {
106
+ return _execute.apply(this, arguments);
107
+ }
108
+ return execute;
109
+ }()
110
+ };
111
+ }
112
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ6Iiwic2F2ZURhdGFDb21tYW5kSWQiLCJnZXRTYXZlRGF0YUNvbW1hbmQiLCJjdHgiLCJpZCIsIm5hbWUiLCJncm91cCIsImRlc2NyaXB0aW9uIiwibWV0YWRhdGEiLCJyZWFkT25seSIsInJpc2tMZXZlbCIsInJlcXVpcmVzQ29uZmlybWF0aW9uIiwiaW5wdXRTY2hlbWEiLCJvYmplY3QiLCJkYXRhc2V0TmFtZXMiLCJhcnJheSIsInN0cmluZyIsIm1pbiIsImRlc2NyaWJlIiwiZXhlY3V0ZSIsIl9leGVjdXRlIiwiX2FzeW5jVG9HZW5lcmF0b3IiLCJfcmVnZW5lcmF0b3JSdW50aW1lIiwibWFyayIsIl9jYWxsZWUiLCJfZXhlY0N0eCIsImlucHV0IiwiX3JlZiIsImxvYWRlZERhdGFzZXROYW1lcyIsIl9pdGVyYXRvciIsIl9zdGVwIiwiZGF0YXNldE5hbWUiLCJyZXN1bHQiLCJ3cmFwIiwiX2NhbGxlZSQiLCJfY29udGV4dCIsInByZXYiLCJuZXh0IiwiQXJyYXkiLCJpc0FycmF5IiwibGVuZ3RoIiwic29tZSIsIkVycm9yIiwiX2NyZWF0ZUZvck9mSXRlcmF0b3JIZWxwZXIiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImxvYWRUYWJsZVRvS2VwbGVyIiwic2VudCIsInN1Y2Nlc3MiLCJjb25jYXQiLCJlcnJvciIsInB1c2giLCJ0MCIsImUiLCJmIiwiZmluaXNoIiwiam9pbiIsImFicnVwdCIsImNvbW1hbmRJZCIsImRhdGEiLCJzYXZlZERhdGFzZXROYW1lcyIsImRldGFpbHMiLCJ0MSIsIm1lc3NhZ2UiLCJTdHJpbmciLCJzdG9wIiwiX3giLCJfeDIiLCJhcHBseSIsImFyZ3VtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zYXZlLWRhdGEtY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgdHlwZSB7Um9vbUNvbW1hbmR9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHt6fSBmcm9tICd6b2QnO1xuaW1wb3J0IHR5cGUge0tlcGxlckNvbnRleHR9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3Qgc2F2ZURhdGFDb21tYW5kSWQgPSAnbWFwLnNhdmUtZGF0YScgYXMgY29uc3Q7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRTYXZlRGF0YUNvbW1hbmQoY3R4OiBLZXBsZXJDb250ZXh0KTogUm9vbUNvbW1hbmQge1xuICByZXR1cm4ge1xuICAgIGlkOiBzYXZlRGF0YUNvbW1hbmRJZCxcbiAgICBuYW1lOiAnU2F2ZSBEdWNrREIgdGFibGUgdG8gbWFwJyxcbiAgICBncm91cDogJ01hcCcsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICAnU2F2ZSBhIER1Y2tEQiB0YWJsZSB0byBrZXBsZXIuZ2wgYXMgYSBtYXAgZGF0YXNldC4gV29ya3Mgd2l0aCBhbnkgdGFibGUgaW5jbHVkaW5nIHRob3NlIGZyb20gYnVmZmVyLCB6aXBjb2RlLCBjb3VudHksIHN0YXRlLCBpc29jaHJvbmUsIHJvdXRpbmcsIHF1ZXJ5IHJlc3VsdHMsIGV0Yy4nLFxuICAgIG1ldGFkYXRhOiB7cmVhZE9ubHk6IGZhbHNlLCByaXNrTGV2ZWw6ICdtZWRpdW0nLCByZXF1aXJlc0NvbmZpcm1hdGlvbjogdHJ1ZX0sXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGRhdGFzZXROYW1lczogelxuICAgICAgICAuYXJyYXkoei5zdHJpbmcoKSlcbiAgICAgICAgLm1pbigxKVxuICAgICAgICAuZGVzY3JpYmUoJ1RoZSBuYW1lcyBvZiB0aGUgRHVja0RCIHRhYmxlcyB0byBsb2FkIGludG8ga2VwbGVyLmdsLicpXG4gICAgfSkgYXMgYW55LFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfZXhlY0N0eCwgaW5wdXQpID0+IHtcbiAgICAgIGNvbnN0IHtkYXRhc2V0TmFtZXN9ID0gKGlucHV0ID8/IHt9KSBhcyB7ZGF0YXNldE5hbWVzOiBzdHJpbmdbXX07XG4gICAgICB0cnkge1xuICAgICAgICAvLyBSdW50aW1lIGd1YXJkOiB0aGUgYnJpZGdlL3dlYk1DUCBjYWxsIGV4ZWN1dGUgd2l0aG91dCB6b2QgcGFyc2luZyxcbiAgICAgICAgLy8gc28gYSBtaXNzaW5nL2VtcHR5L3dyb25nLXR5cGVkIGRhdGFzZXROYW1lcyBtdXN0IG5vdCBmYWxsIHRocm91Z2ggdG9cbiAgICAgICAgLy8gYSBjb25mdXNpbmcgVHlwZUVycm9yIG9yIGFuIHVuaGVscGZ1bCBcIk5vIGRhdGFzZXRzIGZvdW5k4oCmXCIgbWVzc2FnZS5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFBcnJheS5pc0FycmF5KGRhdGFzZXROYW1lcykgfHxcbiAgICAgICAgICBkYXRhc2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgZGF0YXNldE5hbWVzLnNvbWUobmFtZSA9PiB0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycgfHwgbmFtZS5sZW5ndGggPT09IDApXG4gICAgICAgICkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdkYXRhc2V0TmFtZXMgbXVzdCBiZSBhIG5vbi1lbXB0eSBhcnJheSBvZiBEdWNrREIgdGFibGUgbmFtZXMsIGUuZy4gW1wibXlfdGFibGVcIl0uJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsb2FkZWREYXRhc2V0TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgZm9yIChjb25zdCBkYXRhc2V0TmFtZSBvZiBkYXRhc2V0TmFtZXMpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBjdHgubG9hZFRhYmxlVG9LZXBsZXIoZGF0YXNldE5hbWUpO1xuICAgICAgICAgIGlmICghcmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNhdmUgdGFibGUgXCIke2RhdGFzZXROYW1lfVwiIHRvIGtlcGxlci5nbDogJHtyZXN1bHQuZXJyb3J9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvYWRlZERhdGFzZXROYW1lcy5wdXNoKGRhdGFzZXROYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkZWREYXRhc2V0TmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBkYXRhc2V0cyBmb3VuZCBmcm9tICR7ZGF0YXNldE5hbWVzLmpvaW4oJywgJyl9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHN1Y2Nlc3M6IHRydWUsXG4gICAgICAgICAgY29tbWFuZElkOiBzYXZlRGF0YUNvbW1hbmRJZCxcbiAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICBzYXZlZERhdGFzZXROYW1lczogbG9hZGVkRGF0YXNldE5hbWVzLFxuICAgICAgICAgICAgZGV0YWlsczogYFN1Y2Nlc3NmdWxseSBzYXZlZCBkYXRhc2V0KHMpOiAke2xvYWRlZERhdGFzZXROYW1lcy5qb2luKCcsICcpfSBpbiBrZXBsZXIuZ2xgXG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBzdWNjZXNzOiBmYWxzZSxcbiAgICAgICAgICBjb21tYW5kSWQ6IHNhdmVEYXRhQ29tbWFuZElkLFxuICAgICAgICAgIGVycm9yOiBgQ2Fubm90IHNhdmUgZGF0YSB0byBrZXBsZXIuZ2w6ICR7XG4gICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcilcbiAgICAgICAgICB9YFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQTtBQUNBOztBQUdBLFNBQVFBLENBQUMsUUFBTyxLQUFLO0FBR3JCLE9B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