@1money/component-ui 0.0.67 → 0.0.69

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 (163) hide show
  1. package/es/business/Filter/Account/Account.d.ts +2 -0
  2. package/es/business/Filter/Account/Account.js +289 -0
  3. package/es/business/Filter/Account/index.d.ts +2 -0
  4. package/es/business/Filter/Account/index.js +3 -0
  5. package/es/business/Filter/Account/interface.d.ts +83 -0
  6. package/es/business/Filter/Account/interface.js +2 -0
  7. package/es/business/Filter/Account/style/Account.css +84 -0
  8. package/es/business/Filter/Account/style/css.js +2 -0
  9. package/es/business/Filter/Account/style/index.d.ts +1 -0
  10. package/es/business/Filter/Account/style/index.js +2 -0
  11. package/es/business/Filter/Asset/Asset.d.ts +2 -0
  12. package/es/business/Filter/Asset/Asset.js +306 -0
  13. package/es/business/Filter/Asset/index.d.ts +2 -0
  14. package/es/business/Filter/Asset/index.js +3 -0
  15. package/es/business/Filter/Asset/interface.d.ts +90 -0
  16. package/es/business/Filter/Asset/interface.js +2 -0
  17. package/es/business/Filter/Asset/style/Asset.css +96 -0
  18. package/es/business/Filter/Asset/style/css.js +2 -0
  19. package/es/business/Filter/Asset/style/index.d.ts +1 -0
  20. package/es/business/Filter/Asset/style/index.js +2 -0
  21. package/es/business/Filter/DateRange/DateRange.d.ts +2 -0
  22. package/es/business/Filter/DateRange/DateRange.js +393 -0
  23. package/es/business/Filter/DateRange/index.d.ts +2 -0
  24. package/es/business/Filter/DateRange/index.js +3 -0
  25. package/es/business/Filter/DateRange/interface.d.ts +68 -0
  26. package/es/business/Filter/DateRange/interface.js +9 -0
  27. package/es/business/Filter/DateRange/style/DateRange.css +85 -0
  28. package/es/business/Filter/DateRange/style/css.js +2 -0
  29. package/es/business/Filter/DateRange/style/index.d.ts +1 -0
  30. package/es/business/Filter/DateRange/style/index.js +2 -0
  31. package/es/business/Filter/Option/Option.d.ts +2 -0
  32. package/es/business/Filter/Option/Option.js +264 -0
  33. package/es/business/Filter/Option/index.d.ts +2 -0
  34. package/es/business/Filter/Option/index.js +3 -0
  35. package/es/business/Filter/Option/interface.d.ts +81 -0
  36. package/es/business/Filter/Option/interface.js +2 -0
  37. package/es/business/Filter/Option/style/Option.css +72 -0
  38. package/es/business/Filter/Option/style/css.js +2 -0
  39. package/es/business/Filter/Option/style/index.d.ts +1 -0
  40. package/es/business/Filter/Option/style/index.js +2 -0
  41. package/es/business/Filter/index.d.ts +4 -0
  42. package/es/business/Filter/index.js +5 -0
  43. package/es/business/Select/Asset/AssetSelect.js +49 -27
  44. package/es/business/Select/Asset/interface.d.ts +16 -1
  45. package/es/business/Select/Asset/style/AssetSelect.css +5 -0
  46. package/es/business/Select/Network/NetworkSelect.js +79 -13
  47. package/es/business/Select/Network/interface.d.ts +43 -9
  48. package/es/business/Select/Network/interface.js +9 -2
  49. package/es/business/Select/Network/style/NetworkSelect.css +10 -0
  50. package/es/business/index.d.ts +1 -0
  51. package/es/business/index.js +2 -1
  52. package/es/components/ProForm/interface.d.ts +3 -1
  53. package/es/components/ProForm/layouts/QueryFilter.js +5 -1
  54. package/es/components/ProTable/ProTable.d.ts +5 -0
  55. package/es/components/ProTable/ProTable.js +309 -0
  56. package/es/components/ProTable/constants.d.ts +12 -0
  57. package/es/components/ProTable/constants.js +12 -0
  58. package/es/components/ProTable/core/genColumns.d.ts +10 -0
  59. package/es/components/ProTable/core/genColumns.js +81 -0
  60. package/es/components/ProTable/core/genSearchFields.d.ts +19 -0
  61. package/es/components/ProTable/core/genSearchFields.js +103 -0
  62. package/es/components/ProTable/core/useAwaitableReload.d.ts +17 -0
  63. package/es/components/ProTable/core/useAwaitableReload.js +39 -0
  64. package/es/components/ProTable/core/utils.d.ts +12 -0
  65. package/es/components/ProTable/core/utils.js +21 -0
  66. package/es/components/ProTable/index.d.ts +4 -0
  67. package/es/components/ProTable/index.js +5 -0
  68. package/es/components/ProTable/interface.d.ts +132 -0
  69. package/es/components/ProTable/interface.js +2 -0
  70. package/es/components/ProTable/style/ProTable.css +47 -0
  71. package/es/components/ProTable/style/css.js +6 -0
  72. package/es/components/ProTable/style/index.d.ts +5 -0
  73. package/es/components/ProTable/style/index.js +6 -0
  74. package/es/components/ProTable/useFetchData.d.ts +48 -0
  75. package/es/components/ProTable/useFetchData.js +270 -0
  76. package/es/components/Select/Select.js +3 -2
  77. package/es/components/Select/interface.d.ts +2 -0
  78. package/es/index.css +1 -1
  79. package/es/index.d.ts +2 -0
  80. package/es/index.js +2 -1
  81. package/lib/business/Filter/Account/Account.d.ts +2 -0
  82. package/lib/business/Filter/Account/Account.js +296 -0
  83. package/lib/business/Filter/Account/index.d.ts +2 -0
  84. package/lib/business/Filter/Account/index.js +28 -0
  85. package/lib/business/Filter/Account/interface.d.ts +83 -0
  86. package/lib/business/Filter/Account/interface.js +6 -0
  87. package/lib/business/Filter/Account/style/Account.css +84 -0
  88. package/lib/business/Filter/Account/style/css.js +4 -0
  89. package/lib/business/Filter/Account/style/index.d.ts +1 -0
  90. package/lib/business/Filter/Account/style/index.js +4 -0
  91. package/lib/business/Filter/Asset/Asset.d.ts +2 -0
  92. package/lib/business/Filter/Asset/Asset.js +313 -0
  93. package/lib/business/Filter/Asset/index.d.ts +2 -0
  94. package/lib/business/Filter/Asset/index.js +28 -0
  95. package/lib/business/Filter/Asset/interface.d.ts +90 -0
  96. package/lib/business/Filter/Asset/interface.js +6 -0
  97. package/lib/business/Filter/Asset/style/Asset.css +96 -0
  98. package/lib/business/Filter/Asset/style/css.js +4 -0
  99. package/lib/business/Filter/Asset/style/index.d.ts +1 -0
  100. package/lib/business/Filter/Asset/style/index.js +4 -0
  101. package/lib/business/Filter/DateRange/DateRange.d.ts +2 -0
  102. package/lib/business/Filter/DateRange/DateRange.js +400 -0
  103. package/lib/business/Filter/DateRange/index.d.ts +2 -0
  104. package/lib/business/Filter/DateRange/index.js +28 -0
  105. package/lib/business/Filter/DateRange/interface.d.ts +68 -0
  106. package/lib/business/Filter/DateRange/interface.js +15 -0
  107. package/lib/business/Filter/DateRange/style/DateRange.css +85 -0
  108. package/lib/business/Filter/DateRange/style/css.js +4 -0
  109. package/lib/business/Filter/DateRange/style/index.d.ts +1 -0
  110. package/lib/business/Filter/DateRange/style/index.js +4 -0
  111. package/lib/business/Filter/Option/Option.d.ts +2 -0
  112. package/lib/business/Filter/Option/Option.js +271 -0
  113. package/lib/business/Filter/Option/index.d.ts +2 -0
  114. package/lib/business/Filter/Option/index.js +28 -0
  115. package/lib/business/Filter/Option/interface.d.ts +81 -0
  116. package/lib/business/Filter/Option/interface.js +6 -0
  117. package/lib/business/Filter/Option/style/Option.css +72 -0
  118. package/lib/business/Filter/Option/style/css.js +4 -0
  119. package/lib/business/Filter/Option/style/index.d.ts +1 -0
  120. package/lib/business/Filter/Option/style/index.js +4 -0
  121. package/lib/business/Filter/index.d.ts +4 -0
  122. package/lib/business/Filter/index.js +50 -0
  123. package/lib/business/Select/Asset/AssetSelect.js +49 -27
  124. package/lib/business/Select/Asset/interface.d.ts +16 -1
  125. package/lib/business/Select/Asset/style/AssetSelect.css +5 -0
  126. package/lib/business/Select/Network/NetworkSelect.js +80 -13
  127. package/lib/business/Select/Network/interface.d.ts +43 -9
  128. package/lib/business/Select/Network/interface.js +10 -1
  129. package/lib/business/Select/Network/style/NetworkSelect.css +10 -0
  130. package/lib/business/index.d.ts +1 -0
  131. package/lib/business/index.js +12 -1
  132. package/lib/components/ProForm/interface.d.ts +3 -1
  133. package/lib/components/ProForm/layouts/QueryFilter.js +5 -1
  134. package/lib/components/ProTable/ProTable.d.ts +5 -0
  135. package/lib/components/ProTable/ProTable.js +316 -0
  136. package/lib/components/ProTable/constants.d.ts +12 -0
  137. package/lib/components/ProTable/constants.js +18 -0
  138. package/lib/components/ProTable/core/genColumns.d.ts +10 -0
  139. package/lib/components/ProTable/core/genColumns.js +87 -0
  140. package/lib/components/ProTable/core/genSearchFields.d.ts +19 -0
  141. package/lib/components/ProTable/core/genSearchFields.js +111 -0
  142. package/lib/components/ProTable/core/useAwaitableReload.d.ts +17 -0
  143. package/lib/components/ProTable/core/useAwaitableReload.js +46 -0
  144. package/lib/components/ProTable/core/utils.d.ts +12 -0
  145. package/lib/components/ProTable/core/utils.js +28 -0
  146. package/lib/components/ProTable/index.d.ts +4 -0
  147. package/lib/components/ProTable/index.js +33 -0
  148. package/lib/components/ProTable/interface.d.ts +132 -0
  149. package/lib/components/ProTable/interface.js +6 -0
  150. package/lib/components/ProTable/style/ProTable.css +47 -0
  151. package/lib/components/ProTable/style/css.js +8 -0
  152. package/lib/components/ProTable/style/index.d.ts +5 -0
  153. package/lib/components/ProTable/style/index.js +8 -0
  154. package/lib/components/ProTable/useFetchData.d.ts +48 -0
  155. package/lib/components/ProTable/useFetchData.js +277 -0
  156. package/lib/components/Select/Select.js +3 -2
  157. package/lib/components/Select/interface.d.ts +2 -0
  158. package/lib/index.css +1 -1
  159. package/lib/index.d.ts +2 -0
  160. package/lib/index.js +8 -1
  161. package/package.json +31 -1
  162. package/scripts/mcp-server/examples.generated.json +156 -0
  163. package/scripts/mcp-server/index.generated.json +741 -1
@@ -0,0 +1,277 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.useFetchData = useFetchData;
8
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = require("react");
11
+ var _hooks = require("@1money/hooks");
12
+ var _useAwaitableReload = require("./core/useAwaitableReload");
13
+ var __awaiter = void 0 && (void 0).__awaiter || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) {
15
+ return value instanceof P ? value : new P(function (resolve) {
16
+ resolve(value);
17
+ });
18
+ }
19
+ return new (P || (P = Promise))(function (resolve, reject) {
20
+ function fulfilled(value) {
21
+ try {
22
+ step(generator.next(value));
23
+ } catch (e) {
24
+ reject(e);
25
+ }
26
+ }
27
+ function rejected(value) {
28
+ try {
29
+ step(generator["throw"](value));
30
+ } catch (e) {
31
+ reject(e);
32
+ }
33
+ }
34
+ function step(result) {
35
+ result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
36
+ }
37
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
38
+ });
39
+ };
40
+ /**
41
+ * Owns the request lifecycle for ProTable: data, loading, and pagination.
42
+ *
43
+ * One effect is the single fetch path. It reads its query inputs from the
44
+ * **render closure** (never a lagging ref), so every state change — search,
45
+ * sort, filter, params, page — refetches with correct values. An awaitable
46
+ * reload signal lets imperative callers force the same effect and `await` it.
47
+ *
48
+ * `runRequest` aborts the previous in-flight request (`AbortController`, exposed
49
+ * to `request` as `{ signal }`), tags itself with a request id, and drops stale
50
+ * or aborted responses.
51
+ */
52
+ function useFetchData(options) {
53
+ var _this = this;
54
+ var request = options.request,
55
+ manual = options.manual,
56
+ manualRequest = options.manualRequest,
57
+ debounceTime = options.debounceTime,
58
+ postData = options.postData,
59
+ polling = options.polling,
60
+ params = options.params,
61
+ defaultData = options.defaultData,
62
+ paginated = options.paginated,
63
+ defaultCurrent = options.defaultCurrent,
64
+ defaultPageSize = options.defaultPageSize,
65
+ searchParams = options.searchParams,
66
+ sort = options.sort,
67
+ filter = options.filter,
68
+ onLoad = options.onLoad,
69
+ onLoadingChange = options.onLoadingChange,
70
+ onRequestError = options.onRequestError;
71
+ var _useSafeState = (0, _hooks.useSafeState)(defaultData !== null && defaultData !== void 0 ? defaultData : []),
72
+ _useSafeState2 = (0, _slicedToArray2["default"])(_useSafeState, 2),
73
+ dataSource = _useSafeState2[0],
74
+ setDataSource = _useSafeState2[1];
75
+ var _useSafeState3 = (0, _hooks.useSafeState)(false),
76
+ _useSafeState4 = (0, _slicedToArray2["default"])(_useSafeState3, 2),
77
+ loading = _useSafeState4[0],
78
+ setLoadingState = _useSafeState4[1];
79
+ var _useSafeState5 = (0, _hooks.useSafeState)({
80
+ current: defaultCurrent,
81
+ pageSize: defaultPageSize,
82
+ total: 0
83
+ }),
84
+ _useSafeState6 = (0, _slicedToArray2["default"])(_useSafeState5, 2),
85
+ pageInfo = _useSafeState6[0],
86
+ setPageInfoState = _useSafeState6[1];
87
+ var reloadSignal = (0, _useAwaitableReload.useAwaitableReload)();
88
+ var reqRef = (0, _hooks.useLatest)(request);
89
+ var callbacks = (0, _hooks.useLatest)({
90
+ onLoad: onLoad,
91
+ onLoadingChange: onLoadingChange,
92
+ onRequestError: onRequestError,
93
+ postData: postData
94
+ });
95
+ var loadingRef = (0, _hooks.useLatest)(loading);
96
+ var requestIdRef = (0, _react.useRef)(0);
97
+ var abortRef = (0, _react.useRef)(null);
98
+ var skipFirstRef = (0, _react.useRef)(manualRequest === true);
99
+ var prevParamsRef = (0, _react.useRef)(undefined);
100
+ var debounceTimerRef = (0, _react.useRef)(undefined);
101
+ // Set right before a polling-triggered refetch so it can refresh silently
102
+ // (without flashing the main loading overlay). Consumed at the start of runRequest.
103
+ var silentRef = (0, _react.useRef)(false);
104
+ var setLoading = (0, _hooks.useMemoizedFn)(function (next) {
105
+ var _a, _b;
106
+ setLoadingState(next);
107
+ (_b = (_a = callbacks.current).onLoadingChange) === null || _b === void 0 ? void 0 : _b.call(_a, next);
108
+ });
109
+ var setPageInfo = (0, _hooks.useMemoizedFn)(function (info) {
110
+ setPageInfoState(function (prev) {
111
+ var merged = Object.assign(Object.assign({}, prev), info);
112
+ if (merged.current === prev.current && merged.pageSize === prev.pageSize && merged.total === prev.total) {
113
+ return prev;
114
+ }
115
+ return merged;
116
+ });
117
+ });
118
+ // The single network entry point: abort the previous request, then apply data
119
+ // while guarding against stale / aborted responses.
120
+ var runRequest = (0, _hooks.useMemoizedFn)(function (merged, st, ft) {
121
+ return __awaiter(_this, void 0, void 0, /*#__PURE__*/_regenerator["default"].mark(function _callee() {
122
+ var _a, _b, _c, _d, _e, _f, req, silent, abort, requestId, result, raw, next, _t;
123
+ return _regenerator["default"].wrap(function (_context) {
124
+ while (1) switch (_context.prev = _context.next) {
125
+ case 0:
126
+ req = reqRef.current;
127
+ if (req) {
128
+ _context.next = 1;
129
+ break;
130
+ }
131
+ return _context.abrupt("return");
132
+ case 1:
133
+ // A polling refetch refreshes silently — no loading overlay flash.
134
+ silent = silentRef.current;
135
+ silentRef.current = false;
136
+ (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
137
+ abort = new AbortController();
138
+ abortRef.current = abort;
139
+ requestId = ++requestIdRef.current;
140
+ if (!silent) setLoading(true);
141
+ _context.prev = 2;
142
+ _context.next = 3;
143
+ return req(merged, st, ft, {
144
+ signal: abort.signal
145
+ });
146
+ case 3:
147
+ result = _context.sent;
148
+ if (!(abort.signal.aborted || requestId !== requestIdRef.current)) {
149
+ _context.next = 4;
150
+ break;
151
+ }
152
+ return _context.abrupt("return");
153
+ case 4:
154
+ if (!(result.success === false)) {
155
+ _context.next = 5;
156
+ break;
157
+ }
158
+ return _context.abrupt("return");
159
+ case 5:
160
+ raw = (_b = result.data) !== null && _b !== void 0 ? _b : [];
161
+ next = callbacks.current.postData ? callbacks.current.postData(raw) : raw;
162
+ setDataSource(next);
163
+ setPageInfoState(function (prev) {
164
+ var _a;
165
+ return Object.assign(Object.assign({}, prev), {
166
+ total: (_a = result.total) !== null && _a !== void 0 ? _a : next.length
167
+ });
168
+ });
169
+ (_d = (_c = callbacks.current).onLoad) === null || _d === void 0 ? void 0 : _d.call(_c, next);
170
+ _context.next = 8;
171
+ break;
172
+ case 6:
173
+ _context.prev = 6;
174
+ _t = _context["catch"](2);
175
+ if (!(abort.signal.aborted || requestId !== requestIdRef.current)) {
176
+ _context.next = 7;
177
+ break;
178
+ }
179
+ return _context.abrupt("return");
180
+ case 7:
181
+ (_f = (_e = callbacks.current).onRequestError) === null || _f === void 0 ? void 0 : _f.call(_e, _t);
182
+ case 8:
183
+ _context.prev = 8;
184
+ if (!silent && requestId === requestIdRef.current) setLoading(false);
185
+ return _context.finish(8);
186
+ case 9:
187
+ case "end":
188
+ return _context.stop();
189
+ }
190
+ }, _callee, null, [[2, 6, 8, 9]]);
191
+ }));
192
+ });
193
+ // Build the request params from the current render closure.
194
+ var buildMerged = function buildMerged() {
195
+ return Object.assign(Object.assign(Object.assign({}, params !== null && params !== void 0 ? params : {}), searchParams), paginated ? {
196
+ current: pageInfo.current,
197
+ pageSize: pageInfo.pageSize
198
+ } : {});
199
+ };
200
+ // Only `params` (a consumer-owned prop, often an inline object) needs value
201
+ // comparison; the rest are stable internal state and compare by reference.
202
+ var paramsKey = JSON.stringify(params !== null && params !== void 0 ? params : null);
203
+ (0, _react.useEffect)(function () {
204
+ if (manual) {
205
+ reloadSignal.settle();
206
+ return;
207
+ }
208
+ // manualRequest: swallow only the first (mount) trigger.
209
+ if (skipFirstRef.current) {
210
+ skipFirstRef.current = false;
211
+ prevParamsRef.current = paramsKey;
212
+ reloadSignal.settle();
213
+ return;
214
+ }
215
+ // A `params` change resets to page 1 first; the page change re-runs this
216
+ // effect, where the actual fetch happens (so it never double-fetches).
217
+ if (prevParamsRef.current !== paramsKey && pageInfo.current !== defaultCurrent) {
218
+ prevParamsRef.current = paramsKey;
219
+ setPageInfo({
220
+ current: defaultCurrent
221
+ });
222
+ return;
223
+ }
224
+ prevParamsRef.current = paramsKey;
225
+ var fire = function fire() {
226
+ return runRequest(buildMerged(), sort, filter)["finally"](reloadSignal.settle);
227
+ };
228
+ if (debounceTime && debounceTime > 0) {
229
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
230
+ debounceTimerRef.current = setTimeout(fire, debounceTime);
231
+ return function () {
232
+ if (debounceTimerRef.current) clearTimeout(debounceTimerRef.current);
233
+ };
234
+ }
235
+ void fire();
236
+ }, [paramsKey, searchParams, sort, filter, pageInfo.current, pageInfo.pageSize, reloadSignal.token, manual]);
237
+ var reload = (0, _hooks.useMemoizedFn)(function () {
238
+ return manual ? Promise.resolve() : reloadSignal.request();
239
+ });
240
+ var reset = (0, _hooks.useMemoizedFn)(function () {
241
+ setPageInfoState(function (prev) {
242
+ return Object.assign(Object.assign({}, prev), {
243
+ current: defaultCurrent,
244
+ pageSize: defaultPageSize
245
+ });
246
+ });
247
+ });
248
+ // Polling: re-trigger on an interval, skipping ticks while a request is in flight.
249
+ var pollingMs = typeof polling === 'function' ? polling(dataSource) : polling;
250
+ (0, _react.useEffect)(function () {
251
+ if (manual || !pollingMs || pollingMs <= 0) return;
252
+ var id = setInterval(function () {
253
+ if (loadingRef.current) return;
254
+ silentRef.current = true;
255
+ void reloadSignal.request();
256
+ }, pollingMs);
257
+ return function () {
258
+ return clearInterval(id);
259
+ };
260
+ }, [pollingMs, manual]);
261
+ // Abort any in-flight request on unmount.
262
+ (0, _react.useEffect)(function () {
263
+ return function () {
264
+ var _a;
265
+ return (_a = abortRef.current) === null || _a === void 0 ? void 0 : _a.abort();
266
+ };
267
+ }, []);
268
+ return {
269
+ dataSource: dataSource,
270
+ loading: loading,
271
+ pageInfo: pageInfo,
272
+ setPageInfo: setPageInfo,
273
+ reload: reload,
274
+ reset: reset
275
+ };
276
+ }
277
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbXBvbmVudHMvc3JjL2NvbXBvbmVudHMvUHJvVGFibGUvdXNlRmV0Y2hEYXRhLnRzIiwiY29tcG9uZW50cy9Qcm9UYWJsZS91c2VGZXRjaERhdGEuanMiXSwibmFtZXMiOlsiX3JlYWN0IiwicmVxdWlyZSIsIl9ob29rcyIsIl91c2VBd2FpdGFibGVSZWxvYWQiLCJfX2F3YWl0ZXIiLCJ0aGlzQXJnIiwiX2FyZ3VtZW50cyIsIlAiLCJnZW5lcmF0b3IiLCJhZG9wdCIsInZhbHVlIiwicmVzb2x2ZSIsIlByb21pc2UiLCJyZWplY3QiLCJmdWxmaWxsZWQiLCJzdGVwIiwibmV4dCIsImUiLCJyZWplY3RlZCIsInJlc3VsdCIsImRvbmUiLCJ0aGVuIiwiYXBwbHkiLCJ1c2VGZXRjaERhdGEiLCJvcHRpb25zIiwiX3RoaXMiLCJyZXF1ZXN0IiwibWFudWFsIiwibWFudWFsUmVxdWVzdCIsImRlYm91bmNlVGltZSIsInBvc3REYXRhIiwicG9sbGluZyIsInBhcmFtcyIsImRlZmF1bHREYXRhIiwicGFnaW5hdGVkIiwiZGVmYXVsdEN1cnJlbnQiLCJkZWZhdWx0UGFnZVNpemUiLCJzZWFyY2hQYXJhbXMiLCJzb3J0IiwiZmlsdGVyIiwib25Mb2FkIiwib25Mb2FkaW5nQ2hhbmdlIiwib25SZXF1ZXN0RXJyb3IiLCJfdXNlU2FmZVN0YXRlIiwidXNlU2FmZVN0YXRlIiwiX3VzZVNhZmVTdGF0ZTIiLCJfc2xpY2VkVG9BcnJheTIiLCJkYXRhU291cmNlIiwic2V0RGF0YVNvdXJjZSIsIl91c2VTYWZlU3RhdGUzIiwiX3VzZVNhZmVTdGF0ZTQiLCJsb2FkaW5nIiwic2V0TG9hZGluZ1N0YXRlIiwiX3VzZVNhZmVTdGF0ZTUiLCJjdXJyZW50IiwicGFnZVNpemUiLCJ0b3RhbCIsIl91c2VTYWZlU3RhdGU2IiwicGFnZUluZm8iLCJzZXRQYWdlSW5mb1N0YXRlIiwicmVsb2FkU2lnbmFsIiwidXNlQXdhaXRhYmxlUmVsb2FkIiwicmVxUmVmIiwidXNlTGF0ZXN0IiwiY2FsbGJhY2tzIiwibG9hZGluZ1JlZiIsInJlcXVlc3RJZFJlZiIsInVzZVJlZiIsImFib3J0UmVmIiwic2tpcEZpcnN0UmVmIiwicHJldlBhcmFtc1JlZiIsInVuZGVmaW5lZCIsImRlYm91bmNlVGltZXJSZWYiLCJzaWxlbnRSZWYiLCJzZXRMb2FkaW5nIiwidXNlTWVtb2l6ZWRGbiIsIl9hIiwiX2IiLCJjYWxsIiwic2V0UGFnZUluZm8iLCJpbmZvIiwicHJldiIsIm1lcmdlZCIsIk9iamVjdCIsImFzc2lnbiIsInJ1blJlcXVlc3QiLCJzdCIsImZ0IiwiX3JlZ2VuZXJhdG9yIiwibWFyayIsIl9jYWxsZWUiLCJfYyIsIl9kIiwiX2UiLCJfZiIsInJlcSIsInNpbGVudCIsImFib3J0IiwicmVxdWVzdElkIiwicmF3IiwiX3QiLCJ3cmFwIiwiX2NvbnRleHQiLCJhYnJ1cHQiLCJBYm9ydENvbnRyb2xsZXIiLCJzaWduYWwiLCJzZW50IiwiYWJvcnRlZCIsInN1Y2Nlc3MiLCJkYXRhIiwibGVuZ3RoIiwiZmluaXNoIiwic3RvcCIsImJ1aWxkTWVyZ2VkIiwicGFyYW1zS2V5IiwiSlNPTiIsInN0cmluZ2lmeSIsInVzZUVmZmVjdCIsInNldHRsZSIsImZpcmUiLCJjbGVhclRpbWVvdXQiLCJzZXRUaW1lb3V0IiwidG9rZW4iLCJyZWxvYWQiLCJyZXNldCIsInBvbGxpbmdNcyIsImlkIiwic2V0SW50ZXJ2YWwiLCJjbGVhckludGVydmFsIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxJQUFBQSxNQUFBLEdBQUFDLE9BQUE7QUFDQSxJQUFBQyxNQUFBLEdBQUFELE9BQUE7QUFFQSxJQUFBRSxtQkFBQSxHQUFBRixPQUFBO0FDSEEsSUFBSUcsU0FBUyxHQUFJLFVBQVEsU0FBS0EsU0FBUyxJQUFLLFVBQVVDLE9BQU8sRUFBRUMsVUFBVSxFQUFFQyxDQUFDLEVBQUVDLFNBQVMsRUFBRTtFQUNyRixTQUFTQyxLQUFLQSxDQUFDQyxLQUFLLEVBQUU7SUFBRSxPQUFPQSxLQUFLLFlBQVlILENBQUMsR0FB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Z0JBQVMsRUFBQyxZQUFLO0lBQ2IsSUFBSTFGLE1BQU0sSUFBSSxDQUFDa0csU0FBUyxJQUFJQSxTQUFTLElBQUksQ0FBQyxFQUFFO0lBQzVDLElBQU1DLEVBQUUsR0FBR0MsV0FBVyxDQUFDLFlBQUs7TUFDMUIsSUFBSTlELFVBQVUsQ0FBQ1gsT0FBTyxFQUFFO01BQ3hCbUIsU0FBUyxDQUFDbkIsT0FBTyxHQUFHLElBQUk7TUFDeEIsS0FBS00sWUFBWSxDQUFDbEMsT0FBTyxDQUFBLENBQUU7SUFDN0IsQ0FBQyxFQUFFbUcsU0FBUyxDQUFDO0lBQ2IsT0FBTztNQUFBLE9BQU1HLGFBQWEsQ0FBQ0YsRUFBRSxDQUFDO0lBQUE7RUFDaEMsQ0FBQyxFQUFFLENBQUNELFNBQVMsRUFBRWxHLE1BQU0sQ0FBQyxDQUFDO0VBRXZCO0VBQ0EsSUFBQTBGLGdCQUFTLEVBQUM7SUFBQSxPQUFNLFlBQUs7TUFBQSxJQUFBekMsRUFBQTtNQUFDLE9BQUEsQ0FBQUEsRUFBQSxHQUFBUixRQUFRLENBQUNkLE9BQU8sTUFBQSxJQUFBLElBQUFzQixFQUFBLEtBQUEsS0FBQSxDQUFBLEdBQUEsS0FBQSxDQUFBLEdBQUFBLEVBQUEsQ0FBRXFCLEtBQUssQ0FBQSxDQUFFO0lBQUEsQ0FBQTtFQUFBLEdBQUUsRUFBRSxDQUFDO0VBRXBELE9BQU87SUFBRWxELFVBQVUsRUFBVkEsVUFBVTtJQUFFSSxPQUFPLEVBQVBBLE9BQU87SUFBRU8sUUFBUSxFQUFSQSxRQUFRO0lBQUVxQixXQUFXLEVBQVhBLFdBQVc7SUFBRTRDLE1BQU0sRUFBTkEsTUFBTTtJQUFFQyxLQUFLLEVBQUxBO0VBQUssQ0FBRTtBQUN0RSIsImZpbGUiOiJjb21wb25lbnRzL1Byb1RhYmxlL3VzZUZldGNoRGF0YS5qcyIsInNvdXJjZXNDb250ZW50IjpbbnVsbCwidmFyIF9fYXdhaXRlciA9ICh0aGlzICYmIHRoaXMuX19hd2FpdGVyKSB8fCBmdW5jdGlvbiAodGhpc0FyZywgX2FyZ3VtZW50cywgUCwgZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9XG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XG4gICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH1cbiAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbXCJ0aHJvd1wiXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9XG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XG4gICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTtcbiAgICB9KTtcbn07XG5pbXBvcnQgeyB1c2VFZmZlY3QsIHVzZVJlZiB9IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZUxhdGVzdCwgdXNlTWVtb2l6ZWRGbiwgdXNlU2FmZVN0YXRlIH0gZnJvbSAnQDFtb25leS9ob29rcyc7XG5pbXBvcnQgeyB1c2VBd2FpdGFibGVSZWxvYWQgfSBmcm9tICcuL2NvcmUvdXNlQXdhaXRhYmxlUmVsb2FkJztcbi8qKlxuICogT3ducyB0aGUgcmVxdWVzdCBsaWZlY3ljbGUgZm9yIFByb1RhYmxlOiBkYXRhLCBsb2FkaW5nLCBhbmQgcGFnaW5hdGlvbi5cbiAqXG4gKiBPbmUgZWZmZWN0IGlzIHRoZSBzaW5nbGUgZmV0Y2ggcGF0aC4gSXQgcmVhZHMgaXRzIHF1ZXJ5IGlucHV0cyBmcm9tIHRoZVxuICogKipyZW5kZXIgY2xvc3VyZSoqIChuZXZlciBhIGxhZ2dpbmcgcmVmKSwgc28gZXZlcnkgc3RhdGUgY2hhbmdlIOKAlCBzZWFyY2gsXG4gKiBzb3J0LCBmaWx0ZXIsIHBhcmFtcywgcGFnZSDigJQgcmVmZXRjaGVzIHdpdGggY29ycmVjdCB2YWx1ZXMuIEFuIGF3YWl0YWJsZVxuICogcmVsb2FkIHNpZ25hbCBsZXRzIGltcGVyYXRpdmUgY2FsbGVycyBmb3JjZSB0aGUgc2FtZSBlZmZlY3QgYW5kIGBhd2FpdGAgaXQuXG4gKlxuICogYHJ1blJlcXVlc3RgIGFib3J0cyB0aGUgcHJldmlvdXMgaW4tZmxpZ2h0IHJlcXVlc3QgKGBBYm9ydENvbnRyb2xsZXJgLCBleHBvc2VkXG4gKiB0byBgcmVxdWVzdGAgYXMgYHsgc2lnbmFsIH1gKSwgdGFncyBpdHNlbGYgd2l0aCBhIHJlcXVlc3QgaWQsIGFuZCBkcm9wcyBzdGFsZVxuICogb3IgYWJvcnRlZCByZXNwb25zZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VGZXRjaERhdGEob3B0aW9ucykge1xuICAgIGNvbnN0IHsgcmVxdWVzdCwgbWFudWFsLCBtYW51YWxSZXF1ZXN0LCBkZWJvdW5jZVRpbWUsIHBvc3REYXRhLCBwb2xsaW5nLCBwYXJhbXMsIGRlZmF1bHREYXRhLCBwYWdpbmF0ZWQsIGRlZmF1bHRDdXJyZW50LCBkZWZhdWx0UGFnZVNpemUsIHNlYXJjaFBhcmFtcywgc29ydCwgZmlsdGVyLCBvbkxvYWQsIG9uTG9hZGluZ0NoYW5nZSwgb25SZXF1ZXN0RXJyb3IsIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IFtkYXRhU291cmNlLCBzZXREYXRhU291cmNlXSA9IHVzZVNhZmVTdGF0ZShkZWZhdWx0RGF0YSAhPT0gbnVsbCAmJiBkZWZhdWx0RGF0YSAhPT0gdm9pZCAwID8gZGVmYXVsdERhdGEgOiBbXSk7XG4gICAgY29uc3QgW2xvYWRpbmcsIHNldExvYWRpbmdTdGF0ZV0gPSB1c2VTYWZlU3RhdGUoZmFsc2UpO1xuICAgIGNvbnN0IFtwYWdlSW5mbywgc2V0UGFnZUluZm9TdGF0ZV0gPSB1c2VTYWZlU3RhdGUoe1xuICAgICAgICBjdXJyZW50OiBkZWZhdWx0Q3VycmVudCxcbiAgICAgICAgcGFnZVNpemU6IGRlZmF1bHRQYWdlU2l6ZSxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgfSk7XG4gICAgY29uc3QgcmVsb2FkU2lnbmFsID0gdXNlQXdhaXRhYmxlUmVsb2FkKCk7XG4gICAgY29uc3QgcmVxUmVmID0gdXNlTGF0ZXN0KHJlcXVlc3QpO1xuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHVzZUxhdGVzdCh7IG9uTG9hZCwgb25Mb2FkaW5nQ2hhbmdlLCBvblJlcXVlc3RFcnJvciwgcG9zdERhdGEgfSk7XG4gICAgY29uc3QgbG9hZGluZ1JlZiA9IHVzZUxhdGVzdChsb2FkaW5nKTtcbiAgICBjb25zdCByZXF1ZXN0SWRSZWYgPSB1c2VSZWYoMCk7XG4gICAgY29uc3QgYWJvcnRSZWYgPSB1c2VSZWYobnVsbCk7XG4gICAgY29uc3Qgc2tpcEZpcnN0UmVmID0gdXNlUmVmKG1hbnVhbFJlcXVlc3QgPT09IHRydWUpO1xuICAgIGNvbnN0IHByZXZQYXJhbXNSZWYgPSB1c2VSZWYodW5kZWZpbmVkKTtcbiAgICBjb25zdCBkZWJvdW5jZVRpbWVyUmVmID0gdXNlUmVmKHVuZGVmaW5lZCk7XG4gICAgLy8gU2V0IHJpZ2h0IGJlZm9yZSBhIHBvbGxpbmctdHJpZ2dlcmVkIHJlZmV0Y2ggc28gaXQgY2FuIHJlZnJlc2ggc2lsZW50bHlcbiAgICAvLyAod2l0aG91dCBmbGFzaGluZyB0aGUgbWFpbiBsb2FkaW5nIG92ZXJsYXkpLiBDb25zdW1lZCBhdCB0aGUgc3RhcnQgb2YgcnVuUmVxdWVzdC5cbiAgICBjb25zdCBzaWxlbnRSZWYgPSB1c2VSZWYoZmFsc2UpO1xuICAgIGNvbnN0IHNldExvYWRpbmcgPSB1c2VNZW1vaXplZEZuKChuZXh0KSA9PiB7XG4gICAgICAgIHZhciBfYSwgX2I7XG4gICAgICAgIHNldExvYWRpbmdTdGF0ZShuZXh0KTtcbiAgICAgICAgKF9iID0gKF9hID0gY2FsbGJhY2tzLmN1cnJlbnQpLm9uTG9hZGluZ0NoYW5nZSkgPT09IG51bGwgfHwgX2IgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9iLmNhbGwoX2EsIG5leHQpO1xuICAgIH0pO1xuICAgIGNvbnN0IHNldFBhZ2VJbmZvID0gdXNlTWVtb2l6ZWRGbigoaW5mbykgPT4ge1xuICAgICAgICBzZXRQYWdlSW5mb1N0YXRlKChwcmV2KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtZXJnZWQgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCBpbmZvKTtcbiAgICAgICAgICAgIGlmIChtZXJnZWQuY3VycmVudCA9PT0gcHJldi5jdXJyZW50ICYmIG1lcmdlZC5wYWdlU2l6ZSA9PT0gcHJldi5wYWdlU2l6ZSAmJiBtZXJnZWQudG90YWwgPT09IHByZXYudG90YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcHJldjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtZXJnZWQ7XG4gICAgICAgIH0pO1xuICAgIH0pO1xuICAgIC8vIFRoZSBzaW5nbGUgbmV0d29yayBlbnRyeSBwb2ludDogYWJvcnQgdGhlIHByZXZpb3VzIHJlcXVlc3QsIHRoZW4gYXBwbHkgZGF0YVxuICAgIC8vIHdoaWxlIGd1YXJkaW5nIGFnYWluc3Qgc3RhbGUgLyBhYm9ydGVkIHJlc3BvbnNlcy5cbiAgICBjb25zdCBydW5SZXF1ZXN0ID0gdXNlTWVtb2l6ZWRGbigobWVyZ2VkLCBzdCwgZnQpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHtcbiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kLCBfZSwgX2Y7XG4gICAgICAgIGNvbnN0IHJlcSA9IHJlcVJlZi5jdXJyZW50O1xuICAgICAgICBpZiAoIXJlcSlcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gQSBwb2xsaW5nIHJlZmV0Y2ggcmVmcmVzaGVzIHNpbGVudGx5IOKAlCBubyBsb2FkaW5nIG92ZXJsYXkgZmxhc2guXG4gICAgICAgIGNvbnN0IHNpbGVudCA9IHNpbGVudFJlZi5jdXJyZW50O1xuICAgICAgICBzaWxlbnRSZWYuY3VycmVudCA9IGZhbHNlO1xuICAgICAgICAoX2EgPSBhYm9ydFJlZi5jdXJyZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuYWJvcnQoKTtcbiAgICAgICAgY29uc3QgYWJvcnQgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICAgIGFib3J0UmVmLmN1cnJlbnQgPSBhYm9ydDtcbiAgICAgICAgY29uc3QgcmVxdWVzdElkID0gKytyZXF1ZXN0SWRSZWYuY3VycmVudDtcbiAgICAgICAgaWYgKCFzaWxlbnQpXG4gICAgICAgICAgICBzZXRMb2FkaW5nKHRydWUpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgcmVxKG1lcmdlZCwgc3QsIGZ0LCB7IHNpZ25hbDogYWJvcnQuc2lnbmFsIH0pO1xuICAgICAgICAgICAgaWYgKGFib3J0LnNpZ25hbC5hYm9ydGVkIHx8IHJlcXVlc3RJZCAhPT0gcmVxdWVzdElkUmVmLmN1cnJlbnQpXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5zdWNjZXNzID09PSBmYWxzZSlcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBjb25zdCByYXcgPSAoX2IgPSByZXN1bHQuZGF0YSkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogW107XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gY2FsbGJhY2tzLmN1cnJlbnQucG9zdERhdGEgPyBjYWxsYmFja3MuY3VycmVudC5wb3N0RGF0YShyYXcpIDogcmF3O1xuICAgICAgICAgICAgc2V0RGF0YVNvdXJjZShuZXh0KTtcbiAgICAgICAgICAgIHNldFBhZ2VJbmZvU3RhdGUoKHByZXYpID0+IHsgdmFyIF9hOyByZXR1cm4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJldiksIHsgdG90YWw6IChfYSA9IHJlc3VsdC50b3RhbCkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbmV4dC5sZW5ndGggfSkpOyB9KTtcbiAgICAgICAgICAgIChfZCA9IChfYyA9IGNhbGxiYWNrcy5jdXJyZW50KS5vbkxvYWQpID09PSBudWxsIHx8IF9kID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfZC5jYWxsKF9jLCBuZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmIChhYm9ydC5zaWduYWwuYWJvcnRlZCB8fCByZXF1ZXN0SWQgIT09IHJlcXVlc3RJZFJlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIChfZiA9IChfZSA9IGNhbGxiYWNrcy5jdXJyZW50KS5vblJlcXVlc3RFcnJvcikgPT09IG51bGwgfHwgX2YgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9mLmNhbGwoX2UsIGVycm9yKTtcbiAgICAgICAgfVxuICAgICAgICBmaW5hbGx5IHtcbiAgICAgICAgICAgIGlmICghc2lsZW50ICYmIHJlcXVlc3RJZCA9PT0gcmVxdWVzdElkUmVmLmN1cnJlbnQpXG4gICAgICAgICAgICAgICAgc2V0TG9hZGluZyhmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9KSk7XG4gICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgcGFyYW1zIGZyb20gdGhlIGN1cnJlbnQgcmVuZGVyIGNsb3N1cmUuXG4gICAgY29uc3QgYnVpbGRNZXJnZWQgPSAoKSA9PiAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIChwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiB7fSkpLCBzZWFyY2hQYXJhbXMpLCAocGFnaW5hdGVkID8geyBjdXJyZW50OiBwYWdlSW5mby5jdXJyZW50LCBwYWdlU2l6ZTogcGFnZUluZm8ucGFnZVNpemUgfSA6IHt9KSkpO1xuICAgIC8vIE9ubHkgYHBhcmFtc2AgKGEgY29uc3VtZXItb3duZWQgcHJvcCwgb2Z0ZW4gYW4gaW5saW5lIG9iamVjdCkgbmVlZHMgdmFsdWVcbiAgICAvLyBjb21wYXJpc29uOyB0aGUgcmVzdCBhcmUgc3RhYmxlIGludGVybmFsIHN0YXRlIGFuZCBjb21wYXJlIGJ5IHJlZmVyZW5jZS5cbiAgICBjb25zdCBwYXJhbXNLZXkgPSBKU09OLnN0cmluZ2lmeShwYXJhbXMgIT09IG51bGwgJiYgcGFyYW1zICE9PSB2b2lkIDAgPyBwYXJhbXMgOiBudWxsKTtcbiAgICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgICAgICBpZiAobWFudWFsKSB7XG4gICAgICAgICAgICByZWxvYWRTaWduYWwuc2V0dGxlKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gbWFudWFsUmVxdWVzdDogc3dhbGxvdyBvbmx5IHRoZSBmaXJzdCAobW91bnQpIHRyaWdnZXIuXG4gICAgICAgIGlmIChza2lwRmlyc3RSZWYuY3VycmVudCkge1xuICAgICAgICAgICAgc2tpcEZpcnN0UmVmLmN1cnJlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgIHByZXZQYXJhbXNSZWYuY3VycmVudCA9IHBhcmFtc0tleTtcbiAgICAgICAgICAgIHJlbG9hZFNpZ25hbC5zZXR0bGUoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBIGBwYXJhbXNgIGNoYW5nZSByZXNldHMgdG8gcGFnZSAxIGZpcnN0OyB0aGUgcGFnZSBjaGFuZ2UgcmUtcnVucyB0aGlzXG4gICAgICAgIC8vIGVmZmVjdCwgd2hlcmUgdGhlIGFjdHVhbCBmZXRjaCBoYXBwZW5zIChzbyBpdCBuZXZlciBkb3VibGUtZmV0Y2hlcykuXG4gICAgICAgIGlmIChwcmV2UGFyYW1zUmVmLmN1cnJlbnQgIT09IHBhcmFtc0tleSAmJiBwYWdlSW5mby5jdXJyZW50ICE9PSBkZWZhdWx0Q3VycmVudCkge1xuICAgICAgICAgICAgcHJldlBhcmFtc1JlZi5jdXJyZW50ID0gcGFyYW1zS2V5O1xuICAgICAgICAgICAgc2V0UGFnZUluZm8oeyBjdXJyZW50OiBkZWZhdWx0Q3VycmVudCB9KTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBwcmV2UGFyYW1zUmVmLmN1cnJlbnQgPSBwYXJhbXNLZXk7XG4gICAgICAgIGNvbnN0IGZpcmUgPSAoKSA9PiBydW5SZXF1ZXN0KGJ1aWxkTWVyZ2VkKCksIHNvcnQsIGZpbHRlcikuZmluYWxseShyZWxvYWRTaWduYWwuc2V0dGxlKTtcbiAgICAgICAgaWYgKGRlYm91bmNlVGltZSAmJiBkZWJvdW5jZVRpbWUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChkZWJvdW5jZVRpbWVyUmVmLmN1cnJlbnQpO1xuICAgICAgICAgICAgZGVib3VuY2VUaW1lclJlZi5jdXJyZW50ID0gc2V0VGltZW91dChmaXJlLCBkZWJvdW5jZVRpbWUpO1xuICAgICAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VUaW1lclJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgdm9pZCBmaXJlKCk7XG4gICAgfSwgW3BhcmFtc0tleSwgc2VhcmNoUGFyYW1zLCBzb3J0LCBmaWx0ZXIsIHBhZ2VJbmZvLmN1cnJlbnQsIHBhZ2VJbmZvLnBhZ2VTaXplLCByZWxvYWRTaWduYWwudG9rZW4sIG1hbnVhbF0pO1xuICAgIGNvbnN0IHJlbG9hZCA9IHVzZU1lbW9pemVkRm4oKCkgPT4gKG1hbnVhbCA/IFByb21pc2UucmVzb2x2ZSgpIDogcmVsb2FkU2lnbmFsLnJlcXVlc3QoKSkpO1xuICAgIGNvbnN0IHJlc2V0ID0gdXNlTWVtb2l6ZWRGbigoKSA9PiB7XG4gICAgICAgIHNldFBhZ2VJbmZvU3RhdGUoKHByZXYpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHByZXYpLCB7IGN1cnJlbnQ6IGRlZmF1bHRDdXJyZW50LCBwYWdlU2l6ZTogZGVmYXVsdFBhZ2VTaXplIH0pKSk7XG4gICAgfSk7XG4gICAgLy8gUG9sbGluZzogcmUtdHJpZ2dlciBvbiBhbiBpbnRlcnZhbCwgc2tpcHBpbmcgdGlja3Mgd2hpbGUgYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICBjb25zdCBwb2xsaW5nTXMgPSB0eXBlb2YgcG9sbGluZyA9PT0gJ2Z1bmN0aW9uJyA/IHBvbGxpbmcoZGF0YVNvdXJjZSkgOiBwb2xsaW5nO1xuICAgIHVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIGlmIChtYW51YWwgfHwgIXBvbGxpbmdNcyB8fCBwb2xsaW5nTXMgPD0gMClcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY29uc3QgaWQgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAobG9hZGluZ1JlZi5jdXJyZW50KVxuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIHNpbGVudFJlZi5jdXJyZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgIHZvaWQgcmVsb2FkU2lnbmFsLnJlcXVlc3QoKTtcbiAgICAgICAgfSwgcG9sbGluZ01zKTtcbiAgICAgICAgcmV0dXJuICgpID0+IGNsZWFySW50ZXJ2YWwoaWQpO1xuICAgIH0sIFtwb2xsaW5nTXMsIG1hbnVhbF0pO1xuICAgIC8vIEFib3J0IGFueSBpbi1mbGlnaHQgcmVxdWVzdCBvbiB1bm1vdW50LlxuICAgIHVzZUVmZmVjdCgoKSA9PiAoKSA9PiB7IHZhciBfYTsgcmV0dXJuIChfYSA9IGFib3J0UmVmLmN1cnJlbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5hYm9ydCgpOyB9LCBbXSk7XG4gICAgcmV0dXJuIHsgZGF0YVNvdXJjZSwgbG9hZGluZywgcGFnZUluZm8sIHNldFBhZ2VJbmZvLCByZWxvYWQsIHJlc2V0IH07XG59Il0sInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMifQ==