@anansi/core 0.21.0 → 0.21.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,18 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.21.2](/github.com/ntucker/anansi/compare/@anansi/core@0.21.1...@anansi/core@0.21.2) (2025-12-03)
7
+
8
+ ### 📦 Package
9
+
10
+ * Update all non-major dependencies ([#2889](/github.com/ntucker/anansi/issues/2889)) ([9251533](/github.com/ntucker/anansi/commit/9251533500612c62e99a8b012399ff0dd55c9ca3))
11
+
12
+ ## [0.21.1](/github.com/ntucker/anansi/compare/@anansi/core@0.21.0...@anansi/core@0.21.1) (2025-12-01)
13
+
14
+ ### 💅 Enhancement
15
+
16
+ * More gracefully handle all error cases to not crash and instead return error codes to client ([3efe938](/github.com/ntucker/anansi/commit/3efe9388ac7df29a4b6559617e385cce10434bfa))
17
+
6
18
  ## [0.21.0](/github.com/ntucker/anansi/compare/@anansi/core@0.20.44...@anansi/core@0.21.0) (2025-11-30)
7
19
 
8
20
  ### 🚀 Features
package/dist/server.js CHANGED
@@ -138,9 +138,92 @@ const external_crypto_namespaceObject = require("crypto");
138
138
  var external_crypto_default = /*#__PURE__*/__webpack_require__.n(external_crypto_namespaceObject);
139
139
  ;// external "react-dom/server"
140
140
  const server_namespaceObject = require("react-dom/server");
141
+ ;// ./src/scripts/ssrErrorHandler.ts
142
+ /**
143
+ * Utilities for handling SSR errors gracefully
144
+ */
145
+
146
+ /**
147
+ * Extract HTTP status code from an error object.
148
+ * Looks for a `status` property that is a number or parseable string.
149
+ * Returns 500 if no valid status found.
150
+ */
151
+ function getErrorStatus(error) {
152
+ if (error && typeof error === 'object' && 'status' in error) {
153
+ const status = error.status;
154
+ if (typeof status === 'number' && status >= 100 && status < 600) {
155
+ return status;
156
+ }
157
+ if (typeof status === 'string') {
158
+ const parsed = parseInt(status, 10);
159
+ if (!isNaN(parsed) && parsed >= 100 && parsed < 600) {
160
+ return parsed;
161
+ }
162
+ }
163
+ }
164
+ return 500;
165
+ }
166
+
167
+ /**
168
+ * Escape HTML special characters to prevent XSS
169
+ */
170
+ function escapeHtml(str) {
171
+ return str.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;');
172
+ }
173
+ /**
174
+ * Render an HTML error page for SSR failures
175
+ */
176
+ function renderErrorPage(error, url, statusCode, options = {}) {
177
+ const errorMessage = error instanceof Error ? error.message : String(error);
178
+ const stack = error instanceof Error ? error.stack : undefined;
179
+ const {
180
+ showStack = false,
181
+ hint,
182
+ badge
183
+ } = options;
184
+ return `<!DOCTYPE html>
185
+ <html lang="en">
186
+ <head>
187
+ <meta charset="UTF-8">
188
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
189
+ <title>${statusCode} - Server Error</title>
190
+ <style>
191
+ * { box-sizing: border-box; margin: 0; padding: 0; }
192
+ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #1a1a2e; color: #eee; min-height: 100vh; display: flex; align-items: center; justify-content: center; padding: 2rem; }
193
+ .container { max-width: 800px; width: 100%; }
194
+ h1 { color: #ff6b6b; font-size: 2.5rem; margin-bottom: 1rem; }
195
+ .badge { display: inline-block; background: #4ecdc4; color: #1a1a2e; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.75rem; font-weight: 600; margin-bottom: 1rem; }
196
+ .url { color: #888; font-size: 0.9rem; margin-bottom: 1.5rem; word-break: break-all; }
197
+ .message { background: #16213e; border-left: 4px solid #ff6b6b; padding: 1rem 1.5rem; border-radius: 0 8px 8px 0; margin-bottom: 1.5rem; }
198
+ .message code { color: #ff6b6b; font-size: 1.1rem; }
199
+ .stack { background: #0f0f23; border-radius: 8px; padding: 1.5rem; overflow-x: auto; font-family: 'Monaco', 'Menlo', monospace; font-size: 0.85rem; line-height: 1.6; color: #aaa; white-space: pre-wrap; word-break: break-word; }
200
+ .retry { margin-top: 2rem; }
201
+ .retry a { color: #4ecdc4; text-decoration: none; padding: 0.75rem 1.5rem; border: 2px solid #4ecdc4; border-radius: 6px; display: inline-block; transition: all 0.2s; }
202
+ .retry a:hover { background: #4ecdc4; color: #1a1a2e; }
203
+ .hint { margin-top: 1.5rem; color: #888; font-size: 0.9rem; }
204
+ </style>
205
+ </head>
206
+ <body>
207
+ <div class="container">
208
+ ${badge ? `<span class="badge">${escapeHtml(badge)}</span>` : ''}
209
+ <h1>${statusCode} - Server Error</h1>
210
+ <p class="url">Error rendering: ${escapeHtml(url)}</p>
211
+ <div class="message">
212
+ <code>${escapeHtml(errorMessage)}</code>
213
+ </div>
214
+ ${showStack && stack ? `<pre class="stack">${escapeHtml(stack)}</pre>` : ''}
215
+ <div class="retry">
216
+ <a href="${escapeHtml(url)}">Retry</a>
217
+ </div>
218
+ ${hint ? `<p class="hint">${escapeHtml(hint)}</p>` : ''}
219
+ </div>
220
+ </body>
221
+ </html>`;
222
+ }
141
223
  ;// ./src/laySpouts.tsx
142
224
 
143
225
 
226
+
144
227
  function laySpouts(spouts, {
145
228
  timeoutMS = 10000,
146
229
  onError
@@ -157,6 +240,7 @@ function laySpouts(spouts, {
157
240
  nonce
158
241
  });
159
242
  let didError = false;
243
+ let lastError;
160
244
  const {
161
245
  pipe,
162
246
  abort
@@ -166,19 +250,21 @@ function laySpouts(spouts, {
166
250
  onShellReady() {
167
251
  //managers.forEach(manager => manager.cleanup());
168
252
  // If something errored before we started streaming, we set the error code appropriately.
169
- res.statusCode = didError ? 500 : 200;
253
+ res.statusCode = didError ? getErrorStatus(lastError) : 200;
170
254
  res.setHeader('Content-type', 'text/html');
171
255
  pipe(res);
172
256
  },
173
- onShellError() {
257
+ onShellError(e) {
174
258
  didError = true;
175
- res.statusCode = 500;
259
+ lastError = e;
260
+ res.statusCode = getErrorStatus(e);
176
261
  pipe(res);
177
262
  },
178
263
  onError(e) {
179
264
  didError = true;
265
+ lastError = e;
180
266
  console.error(e);
181
- res.statusCode = 500;
267
+ res.statusCode = getErrorStatus(e);
182
268
  //pipe(res); Removing this avoids, "React currently only supports piping to one writable stream."
183
269
  if (onError) onError(e);
184
270
  }
@@ -585,4 +671,4 @@ function navigatorSpout() {
585
671
  module.exports = __webpack_exports__;
586
672
  /******/ })()
587
673
  ;
588
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,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LENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSTtJQUMzQkQsU0FBUyxFQUFFQyxNQUFNLENBQUNyRixNQUFNLEdBQUcsQ0FBQyxHQUFHcUYsTUFBTSxHQUFHLENBQUMsSUFBSTtFQUMvQyxDQUFDO0FBQ0gsQzs7QUN6QzBCO0FBRXFEO0FBQUE7QUFPaEUsU0FBU1EsY0FBY0EsQ0FBQSxFQUlwQztFQUNBLE9BQU9sRyxJQUFJLElBQUksTUFBTUMsS0FBSyxJQUFJO0lBQzVCLE1BQU1rRyxjQUFjLEdBQUdsRyxLQUFLLENBQUNyRSxHQUFHLENBQUN3SyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDM0QsTUFBTWIsTUFBTSxHQUNWLE9BQU9ZLGNBQWMsS0FBSyxRQUFRLEdBQUdBLGNBQWMsR0FBR0EsY0FBYyxHQUFHLENBQUMsQ0FBQztJQUMzRSxNQUFNRSxjQUFjLEdBQUdmLG1CQUFtQixDQUFDQyxNQUFNLENBQUM7SUFFbEQsTUFBTXJGLFNBQVMsR0FBRyxNQUFNRixJQUFJLENBQUM7TUFDM0IsR0FBR0MsS0FBSztNQUNSLEdBQUdvRztJQUNMLENBQUMsQ0FBQztJQUVGLE9BQU87TUFDTCxHQUFHbkcsU0FBUztNQUNaLEdBQUdtRyxjQUFjO01BQ2pCbEUsUUFBUSxFQUFFO1FBQ1IsR0FBR2pDLFNBQVMsQ0FBQ2lDLFFBQVE7UUFDckJtRSxTQUFTLEVBQUVBLENBQUEsS0FBTUQ7TUFDbkIsQ0FBQztNQUNEcEssR0FBRyxlQUNENEMsbUNBQUEsQ0FBQ3NHLGdCQUFnQjtRQUFDb0IsS0FBSyxFQUFFRixjQUFlO1FBQUFoSSxRQUFBLEVBQ3JDNkIsU0FBUyxDQUFDakU7TUFBRyxDQUNFO0lBRXRCLENBQUM7RUFDSCxDQUFDO0FBQ0gsQzs7QUN2Q3NEO0FBQ2lCO0FBQ0k7QUFDWjtBQUNJO0FBQ0k7QUFDUjtBQUNGO0FBQ1k7QUFDWiIsInNvdXJjZXMiOlsid2VicGFjazovL0BhbmFuc2kvY29yZS9leHRlcm5hbCBjb21tb25qcyBcIkBkYXRhLWNsaWVudC9yZWFjdFwiIiwid2VicGFjazovL0BhbmFuc2kvY29yZS9leHRlcm5hbCBjb21tb25qcyBcIkBkYXRhLWNsaWVudC9yZWFjdC9zc3JcIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL3dlYnBhY2svcnVudGltZS9jb21wYXQgZ2V0IGRlZmF1bHQgZXhwb3J0Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS93ZWJwYWNrL3J1bnRpbWUvY3JlYXRlIGZha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL0BhbmFuc2kvY29yZS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL0BhbmFuc2kvY29yZS93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS9leHRlcm5hbCBub2RlLWNvbW1vbmpzIFwiY3J5cHRvXCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3QtZG9tL3NlcnZlclwiIiwid2VicGFjazovL0BhbmFuc2kvY29yZS8uL3NyYy9sYXlTcG91dHMudHN4Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9jc3AudHMiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3QvanN4LXJ1bnRpbWVcIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL0RvY3VtZW50Q29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL2RvY3VtZW50LnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9kYXRhQ2xpZW50LnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9hbnRkLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwiQGFuYW5zaS9yb3V0ZXJcIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvZXh0ZXJuYWwgY29tbW9uanMgXCJoaXN0b3J5XCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9yb3V0ZXIuc2VydmVyLnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL3ByZWZldGNoLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9qc29uLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9hcHAuc2VydmVyLnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL25hdmlnYXRvci5jb250ZXh0LnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL25hdmlnYXRvci5zZXJ2ZXIudHN4Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS8uL3NyYy9pbmRleC5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGRhdGEtY2xpZW50L3JlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBkYXRhLWNsaWVudC9yZWFjdC9zc3JcIik7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyAodHlwZW9mIGN1cnJlbnQgPT0gJ29iamVjdCcgfHwgdHlwZW9mIGN1cnJlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgIX5sZWFmUHJvdG90eXBlcy5pbmRleE9mKGN1cnJlbnQpOyBjdXJyZW50ID0gZ2V0UHJvdG8oY3VycmVudCkpIHtcblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdXJyZW50KS5mb3JFYWNoKChrZXkpID0+IChkZWZba2V5XSA9ICgpID0+ICh2YWx1ZVtrZXldKSkpO1xuXHR9XG5cdGRlZlsnZGVmYXVsdCddID0gKCkgPT4gKHZhbHVlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBkZWYpO1xuXHRyZXR1cm4gbnM7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcInJlYWN0LWRvbS9zZXJ2ZXJcIik7IiwiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXJUb1BpcGVhYmxlU3RyZWFtIGFzIHJlYWN0UmVuZGVyIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5cbmltcG9ydCB0eXBlIHsgUmVuZGVyIH0gZnJvbSAnLi9zY3JpcHRzL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3Nwb3V0cy90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGxheVNwb3V0cyhcbiAgc3BvdXRzOiAocHJvcHM6IFNlcnZlclByb3BzKSA9PiBQcm9taXNlPHtcbiAgICBhcHA6IEpTWC5FbGVtZW50O1xuICB9PixcbiAge1xuICAgIHRpbWVvdXRNUyA9IDEwMDAwLFxuICAgIG9uRXJyb3IsXG4gIH06IHsgdGltZW91dE1TPzogbnVtYmVyOyBvbkVycm9yPzogKGVycm9yOiB1bmtub3duKSA9PiB2b2lkIH0gPSB7fSxcbikge1xuICBjb25zdCByZW5kZXI6IFJlbmRlciA9IGFzeW5jIChjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMpID0+IHtcbiAgICBjb25zdCBub25jZSA9IGNyeXB0by5yYW5kb21CeXRlcygxNikudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHsgYXBwIH0gPSBhd2FpdCBzcG91dHMoeyBjbGllbnRNYW5pZmVzdCwgcmVxLCByZXMsIG5vbmNlIH0pO1xuXG4gICAgICBsZXQgZGlkRXJyb3IgPSBmYWxzZTtcbiAgICAgIGNvbnN0IHsgcGlwZSwgYWJvcnQgfSA9IHJlYWN0UmVuZGVyKGFwcCwge1xuICAgICAgICBub25jZSxcbiAgICAgICAgLy9ib290c3RyYXBTY3JpcHRzOiBhc3NldHMuZmlsdGVyKGFzc2V0ID0+IGFzc2V0LmVuZHNXaXRoKCcuanMnKSksXG4gICAgICAgIG9uU2hlbGxSZWFkeSgpIHtcbiAgICAgICAgICAvL21hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgICAgICAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgYmVmb3JlIHdlIHN0YXJ0ZWQgc3RyZWFtaW5nLCB3ZSBzZXQgdGhlIGVycm9yIGNvZGUgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IGRpZEVycm9yID8gNTAwIDogMjAwO1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hlbGxFcnJvcigpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA1MDA7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yKGU6IGFueSkge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIC8vcGlwZShyZXMpOyBSZW1vdmluZyB0aGlzIGF2b2lkcywgXCJSZWFjdCBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBwaXBpbmcgdG8gb25lIHdyaXRhYmxlIHN0cmVhbS5cIlxuICAgICAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGUpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICAvLyBBYmFuZG9uIGFuZCBzd2l0Y2ggdG8gY2xpZW50IHJlbmRlcmluZyBpZiBlbm91Z2ggdGltZSBwYXNzZXMuXG4gICAgICAvLyBUcnkgbG93ZXJpbmcgdGhpcyB0byBzZWUgdGhlIGNsaWVudCByZWNvdmVyLlxuICAgICAgc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gKGFib3J0IGFzIGFueSkoYFRpbWVvdXQgb2YgJHt0aW1lb3V0TVN9bXMgZXhjZWVkZWRgKSxcbiAgICAgICAgdGltZW91dE1TLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlOiB1bmtub3duKSB7XG4gICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9O1xuICByZXR1cm4gcmVuZGVyO1xufVxuIiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJyZWFjdFwiKTsiLCJleHBvcnQgaW50ZXJmYWNlIFBvbGljeSB7XG4gIFtkaXJlY3RpdmU6IHN0cmluZ106IHN0cmluZyB8IHN0cmluZ1tdO1xufVxuXG4vLyBUT0RPOiBtZW1vaXplIHRoaXNcbmV4cG9ydCBmdW5jdGlvbiBidWlsZFBvbGljeShwb2xpY3lPYmo6IFBvbGljeSkge1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5T2JqKVxuICAgIC5tYXAoa2V5ID0+IHtcbiAgICAgIGNvbnN0IHZhbCA9XG4gICAgICAgIEFycmF5LmlzQXJyYXkocG9saWN5T2JqW2tleV0pID9cbiAgICAgICAgICBbLi4ubmV3IFNldChwb2xpY3lPYmpba2V5XSkudmFsdWVzKCldLmZpbHRlcih2ID0+IHYpLmpvaW4oJyAnKVxuICAgICAgICA6IHBvbGljeU9ialtrZXldO1xuXG4gICAgICAvLyBtb3ZlIHN0cmljdCBkeW5hbWljIHRvIHRoZSBlbmQgb2YgdGhlIHBvbGljeSBpZiBpdCBleGlzdHMgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCBjc3AyXG4gICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVFRQL0hlYWRlcnMvQ29udGVudC1TZWN1cml0eS1Qb2xpY3kvc2NyaXB0LXNyYyNzdHJpY3QtZHluYW1pY1xuICAgICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC5pbmNsdWRlcyhcIidzdHJpY3QtZHluYW1pYydcIikpIHtcbiAgICAgICAgY29uc3QgbmV3VmFsID0gYCR7dmFsXG4gICAgICAgICAgLnJlcGxhY2UoL1xccz8nc3RyaWN0LWR5bmFtaWMnXFxzPy9naSwgJyAnKVxuICAgICAgICAgIC50cmltKCl9ICdzdHJpY3QtZHluYW1pYydgO1xuICAgICAgICByZXR1cm4gYCR7a2V5fSAke25ld1ZhbH1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYCR7a2V5fSAke3ZhbH1gO1xuICAgIH0pXG4gICAgLmpvaW4oJzsgJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqb2luTm9uY2UocG9saWN5T2JqOiBQb2xpY3ksIG5vbmNlPzogc3RyaW5nIHwgdW5kZWZpbmVkKSB7XG4gIGlmICghbm9uY2UpIHJldHVybiBwb2xpY3lPYmo7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi5wb2xpY3lPYmosXG4gIH07XG4gIGlmICh0eXBlb2YgcG9saWN5WydzY3JpcHQtc3JjJ10gPT09ICdzdHJpbmcnKSB7XG4gICAgcG9saWN5WydzY3JpcHQtc3JjJ10gPSBbcG9saWN5WydzY3JpcHQtc3JjJ10sIGAnbm9uY2UtJHtub25jZX0nYF07XG4gIH0gZWxzZSB7XG4gICAgcG9saWN5WydzY3JpcHQtc3JjJ10gPSBbLi4ucG9saWN5WydzY3JpcHQtc3JjJ10sIGAnbm9uY2UtJHtub25jZX0nYF07XG4gIH1cbiAgcmV0dXJuIHBvbGljeTtcbn1cbiIsImNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSByZXF1aXJlKFwicmVhY3QvanN4LXJ1bnRpbWVcIik7IiwidHlwZSBQcm9wcyA9IHtcbiAgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZTtcbiAgYXNzZXRzOiB7IGhyZWY6IHN0cmluZzsgYXM/OiBzdHJpbmc7IHJlbD86IHN0cmluZyB9W107XG4gIGhlYWQ/OiBSZWFjdC5SZWFjdE5vZGU7XG4gIGV4dHJhU3R5bGU6IFJlYWN0LlJlYWN0Tm9kZTtcbiAgc2NyaXB0cz86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgcm9vdElkPzogc3RyaW5nO1xuICBjaGFyU2V0Pzogc3RyaW5nO1xuICBsYW5nPzogc3RyaW5nO1xufTtcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIERvY3VtZW50KHtcbiAgYXNzZXRzLFxuICBoZWFkID0gZGVmYXVsdEhlYWQsXG4gIGNoaWxkcmVuLFxuICB0aXRsZSxcbiAgcm9vdElkID0gJ2FuYW5zaS1yb290JyxcbiAgY2hhclNldCA9ICd1dGYtOCcsXG4gIHNjcmlwdHMgPSBudWxsLFxuICBleHRyYVN0eWxlLFxuICBsYW5nLFxufTogUHJvcHMpIHtcbiAgcmV0dXJuIChcbiAgICA8aHRtbCBsYW5nPXtsYW5nfT5cbiAgICAgIDxoZWFkPlxuICAgICAgICA8bWV0YSBjaGFyU2V0PXtjaGFyU2V0fSAvPlxuICAgICAgICB7aGVhZH1cbiAgICAgICAge2V4dHJhU3R5bGV9XG4gICAgICAgIHthc3NldHMubWFwKChhc3NldCwgaSkgPT4gKFxuICAgICAgICAgIDxsaW5rIGtleT17aX0gcmVsPVwicHJlbG9hZFwiIHsuLi5hc3NldH0gLz5cbiAgICAgICAgKSl9XG4gICAgICAgIDx0aXRsZT57dGl0bGV9PC90aXRsZT5cbiAgICAgIDwvaGVhZD5cbiAgICAgIDxib2R5PlxuICAgICAgICA8ZGl2IGlkPXtyb290SWR9PntjaGlsZHJlbn08L2Rpdj5cbiAgICAgICAge3NjcmlwdHN9XG4gICAgICAgIHthc3NldHNcbiAgICAgICAgICAuZmlsdGVyKCh7IGhyZWYgfSkgPT4gaHJlZi5lbmRzV2l0aCgnLmpzJykpXG4gICAgICAgICAgLm1hcCgoeyBocmVmIH0sIGkpID0+IChcbiAgICAgICAgICAgIDxzY3JpcHQga2V5PXtpfSBzcmM9e2hyZWZ9IGFzeW5jIC8+XG4gICAgICAgICAgKSl9XG4gICAgICA8L2JvZHk+XG4gICAgPC9odG1sPlxuICApO1xufVxuY29uc3QgZGVmYXVsdEhlYWQgPSAoXG4gIDw+XG4gICAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xXCIgLz5cbiAgICA8bGlua1xuICAgICAgcmVsPVwic2hvcnRjdXQgaWNvblwiXG4gICAgICBocmVmPXtgJHtwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRIID8/ICcvJ31mYXZpY29uLmljb2B9XG4gICAgLz5cbiAgPC8+XG4pO1xuIiwiaW1wb3J0IHR5cGUgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcbmltcG9ydCB7IFJlcXVlc3QgfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBTdGF0c0NodW5rR3JvdXAgfSBmcm9tICd3ZWJwYWNrJztcblxuaW1wb3J0IHsgYnVpbGRQb2xpY3ksIGpvaW5Ob25jZSwgUG9saWN5IH0gZnJvbSAnLi9jc3AuanMnO1xuaW1wb3J0IERvY3VtZW50IGZyb20gJy4vRG9jdW1lbnRDb21wb25lbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG50eXBlIE5lZWRlZE5leHQgPSB7XG4gIG1hdGNoZWRSb3V0ZXM6IFJvdXRlPGFueT5bXTtcbiAgdGl0bGU/OiBzdHJpbmc7XG4gIHNjcmlwdHM/OiBSZWFjdC5SZWFjdE5vZGVbXTtcbiAgZXh0cmFTdHlsZT86IFJlYWN0LlJlYWN0Tm9kZVtdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRG9jdW1lbnRTcG91dChvcHRpb25zOiB7XG4gIGhlYWQ/OiBSZWFjdC5SZWFjdE5vZGU7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGxhbmc/OiBzdHJpbmc7XG4gIHJvb3RJZD86IHN0cmluZztcbiAgY2hhclNldD86IHN0cmluZztcbiAgY3NQb2xpY3k/OiBQb2xpY3k7XG59KTogU2VydmVyU3BvdXQ8UmVjb3JkPHN0cmluZywgdW5rbm93bj4sIFJlY29yZDxzdHJpbmcsIHVua25vd24+LCBOZWVkZWROZXh0PiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgIGNvbnN0IHB1YmxpY1BhdGggPSBwcm9wcy5jbGllbnRNYW5pZmVzdC5wdWJsaWNQYXRoO1xuXG4gICAgaWYgKFxuICAgICAgT2JqZWN0LmtleXMocHJvcHMuY2xpZW50TWFuaWZlc3Q/LmVudHJ5cG9pbnRzID8/IHt9KS5sZW5ndGggPCAxIHx8XG4gICAgICBwdWJsaWNQYXRoID09PSB1bmRlZmluZWRcbiAgICApXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hbmlmZXN0IG1pc3NpbmcgZW50cmllcyBuZWVkZWQnKTtcblxuICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHRoaXMgcGFja2FnZSBmb3IgYnVpbGQgc3RhdHMgaW4gZnV0dXJlOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9yZWFjdC90cmVlL21haW4vcGFja2FnZXMvcmVhY3Qtc2VydmVyLWRvbS13ZWJwYWNrXG4gICAgY29uc3QgYXNzZXRNYXAgPSAoYXNzZXRzOiB7IG5hbWU6IHN0cmluZzsgc2l6ZT86IG51bWJlciB9W10pID0+XG4gICAgICBhc3NldHMubWFwKCh7IG5hbWUgfSkgPT4gYCR7cHVibGljUGF0aH0ke25hbWV9YCk7XG5cbiAgICBjb25zdCBhc3NldExpc3Q6IHN0cmluZ1tdID0gW107XG4gICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdD8uZW50cnlwb2ludHMgPz8ge30pLmZvckVhY2goXG4gICAgICBlbnRyeXBvaW50ID0+IHtcbiAgICAgICAgYXNzZXRMaXN0LnB1c2goLi4uYXNzZXRNYXAoZW50cnlwb2ludC5hc3NldHMgPz8gW10pKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgICBuZXcgU2V0KFxuICAgICAgYXNzZXRNYXAoXG4gICAgICAgIE9iamVjdC52YWx1ZXMocHJvcHMuY2xpZW50TWFuaWZlc3QubmFtZWRDaHVua0dyb3VwcyA/PyB7fSlcbiAgICAgICAgICAuZmlsdGVyKCh7IG5hbWUgfSkgPT5cbiAgICAgICAgICAgIG5leHRQcm9wcy5tYXRjaGVkUm91dGVzLnNvbWUocm91dGUgPT4gbmFtZT8uaW5jbHVkZXMocm91dGUubmFtZSkpLFxuICAgICAgICAgIClcbiAgICAgICAgICAuZmxhdE1hcChjaHVuayA9PiBbXG4gICAgICAgICAgICAuLi4oY2h1bmsuYXNzZXRzID8/IFtdKSxcbiAgICAgICAgICAgIC8vIGFueSBjaHVuayBwcmVsb2Fkc1xuICAgICAgICAgICAgLi4uY2hpbGRyZW5Bc3NldHMoY2h1bmspLFxuICAgICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLmZvckVhY2goYXNzZXQgPT4gYXNzZXRMaXN0LnB1c2goYXNzZXQpKTtcblxuICAgIC8vIGZpbmQgYWRkaXRpb25hbCBhc3NldHMgdG8gcHJlbG9hZCBiYXNlZCBvbiBtYXRjaGVkIHJvdXRlXG4gICAgY29uc3QgYXNzZXRzOiB7XG4gICAgICBocmVmOiBzdHJpbmc7XG4gICAgICBhcz86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIHJlbD86IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB9W10gPSBhc3NldExpc3RcbiAgICAgIC5maWx0ZXIoYXNzZXQgPT4gIWFzc2V0LmVuZHNXaXRoKCcuaG90LXVwZGF0ZS5qcycpKVxuICAgICAgLm1hcChhc3NldCA9PlxuICAgICAgICBhc3NldC5lbmRzV2l0aCgnLmNzcycpID8geyBocmVmOiBhc3NldCwgcmVsOiAnc3R5bGVzaGVldCcgfVxuICAgICAgICA6IGFzc2V0LmVuZHNXaXRoKCcuanMnKSA/IHsgaHJlZjogYXNzZXQsIGFzOiAnc2NyaXB0JyB9XG4gICAgICAgIDogeyBocmVmOiBhc3NldCB9LFxuICAgICAgKTtcblxuICAgIGlmIChvcHRpb25zLmNzUG9saWN5KSB7XG4gICAgICBjb25zdCBodHRwRXF1aXYgPVxuICAgICAgICBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ3Byb2R1Y3Rpb24nID9cbiAgICAgICAgICAnQ29udGVudC1TZWN1cml0eS1Qb2xpY3knXG4gICAgICAgIDogJ0NvbnRlbnQtU2VjdXJpdHktUG9saWN5LVJlcG9ydC1Pbmx5JztcblxuICAgICAgcHJvcHMucmVzLnNldEhlYWRlcihcbiAgICAgICAgaHR0cEVxdWl2LFxuICAgICAgICBidWlsZFBvbGljeShqb2luTm9uY2Uob3B0aW9ucy5jc1BvbGljeSwgcHJvcHMubm9uY2UpKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgIGFwcDogKFxuICAgICAgICA8RG9jdW1lbnRcbiAgICAgICAgICB7Li4ub3B0aW9uc31cbiAgICAgICAgICBleHRyYVN0eWxlPXtuZXh0UHJvcHMuZXh0cmFTdHlsZX1cbiAgICAgICAgICB0aXRsZT17bmV4dFByb3BzLnRpdGxlID8/IG9wdGlvbnMudGl0bGV9XG4gICAgICAgICAgYXNzZXRzPXthc3NldHN9XG4gICAgICAgICAgcm9vdElkPXtvcHRpb25zLnJvb3RJZH1cbiAgICAgICAgICBzY3JpcHRzPXtuZXh0UHJvcHMuc2NyaXB0c31cbiAgICAgICAgPlxuICAgICAgICAgIHtuZXh0UHJvcHMuYXBwfVxuICAgICAgICA8L0RvY3VtZW50PlxuICAgICAgKSxcbiAgICB9O1xuICB9O1xufVxuXG5mdW5jdGlvbiBjaGlsZHJlbkFzc2V0cyhjaHVuazogU3RhdHNDaHVua0dyb3VwKSB7XG4gIHJldHVybiBjaHVuay5jaGlsZHJlbiA/XG4gICAgICBPYmplY3QudmFsdWVzKGNodW5rLmNoaWxkcmVuKS5mbGF0TWFwKHByZWxvYWQgPT5cbiAgICAgICAgcHJlbG9hZC5mbGF0TWFwKGMgPT4gYy5hc3NldHMgPz8gW10pLFxuICAgICAgKVxuICAgIDogW107XG59XG4iLCJpbXBvcnQge1xuICB0eXBlIENvbnRyb2xsZXIsXG4gIHR5cGUgTWFuYWdlcixcbiAgdHlwZSBTdGF0ZSxcbiAgdHlwZSBTdG9yZSxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBkYXRhQ2xpZW50U3BvdXQoXG4gIG9wdGlvbnM6IHtcbiAgICBnZXRNYW5hZ2Vycz86ICgpID0+IE1hbmFnZXJbXTtcbiAgfSA9IHt9LFxuKTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB7IGNvbnRyb2xsZXI6IENvbnRyb2xsZXIgfSAmIHsgc3RvcmU6IFN0b3JlPFN0YXRlPHVua25vd24+PiB9LFxuICB7IGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj47IHNjcmlwdHM/OiBSZWFjdC5SZWFjdE5vZGVbXSB9XG4+IHtcbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXJzID0gb3B0aW9ucz8uZ2V0TWFuYWdlcnM/LigpID8/IFtcbiAgICAgIG5ldyAoYXdhaXQgaW1wb3J0KCdAZGF0YS1jbGllbnQvcmVhY3QnKSkuTmV0d29ya01hbmFnZXIoKSxcbiAgICBdO1xuICAgIGNvbnN0IHsgY3JlYXRlUGVyc2lzdGVkU3RvcmUgfSA9IGF3YWl0IGltcG9ydCgnQGRhdGEtY2xpZW50L3JlYWN0L3NzcicpO1xuICAgIGNvbnN0IFtTZXJ2ZXJEYXRhUHJvdmlkZXIsIHVzZVJlYWR5Q2FjaGVTdGF0ZSwgY29udHJvbGxlciwgc3RvcmVdID1cbiAgICAgIGNyZWF0ZVBlcnNpc3RlZFN0b3JlKG1hbmFnZXJzKTtcblxuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgc3RvcmUsXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgIGluaXREYXRhOiB7XG4gICAgICAgIC4uLm5leHRQcm9wcy5pbml0RGF0YSxcbiAgICAgICAgZGF0YWNsaWVudDogdXNlUmVhZHlDYWNoZVN0YXRlLFxuICAgICAgfSxcbiAgICAgIGFwcDogPFNlcnZlckRhdGFQcm92aWRlcj57bmV4dFByb3BzLmFwcH08L1NlcnZlckRhdGFQcm92aWRlcj4sXG4gICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBvbmx5IGluamVjdCBpbiBuZXh0IGFuZCBub3QgaGF2ZSB0byBhbHNvIHB1dCBoZXJlXG4gICAgICBjb250cm9sbGVyLFxuICAgICAgc3RvcmUsXG4gICAgfTtcbiAgfTtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyB0eXBlIEpTWCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG50eXBlIE5lZWRlZE5leHQgPSB7XG4gIGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj47XG4gIHNjcmlwdHM/OiBSZWFjdC5SZWFjdE5vZGVbXTtcbiAgZXh0cmFTdHlsZT86IFJlYWN0LlJlYWN0Tm9kZVtdO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gYW50ZFNwb3V0KCk6IFNlcnZlclNwb3V0PFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIE5lZWRlZE5leHRcbj4ge1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgeyBjcmVhdGVDYWNoZSwgZXh0cmFjdFN0eWxlLCBTdHlsZVByb3ZpZGVyIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovICdAYW50LWRlc2lnbi9jc3NpbmpzJ1xuICAgICk7XG4gICAgY29uc3QgY2FjaGUgPSBjcmVhdGVDYWNoZSgpO1xuICAgIGNvbnN0IEFudGRTaGVldHMgPSAoKTogSlNYLkVsZW1lbnQgPT4ge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPHNjcmlwdFxuICAgICAgICAgIGRhbmdlcm91c2x5U2V0SW5uZXJIVE1MPXt7XG4gICAgICAgICAgICBfX2h0bWw6IGA8L3NjcmlwdD4ke2V4dHJhY3RTdHlsZShjYWNoZSl9PHNjcmlwdD5gLFxuICAgICAgICAgIH19XG4gICAgICAgIC8+XG4gICAgICApO1xuICAgIH07XG5cbiAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgIGNvbnN0IHNjcmlwdHM6IFJlYWN0LlJlYWN0Tm9kZVtdID0gbmV4dFByb3BzLnNjcmlwdHMgPz8gW107XG5cbiAgICAvLyB1bmZvcnR1bmF0ZWx5IHdlIGhhdmUgdG8gaW5qZWN0IHRoaXMgYWZ0ZXIgdGhlIGVudGlyZSBjb250ZW50IGhhcyBzdHJlYW1lZCBpbiBvciBpdCBkb2Vzbid0IGNvcnJlY3RseSBwb3B1bGF0ZVxuICAgIC8vIHNlZTogaHR0cHM6Ly9naXRodWIuY29tL2FudC1kZXNpZ24vY3NzaW5qcy9pc3N1ZXMvNzlcbiAgICBzY3JpcHRzLnB1c2goPEFudGRTaGVldHMga2V5PVwiYW50ZC1zaGVldHNcIiAvPik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgYXBwOiA8U3R5bGVQcm92aWRlciBjYWNoZT17Y2FjaGV9PntuZXh0UHJvcHMuYXBwfTwvU3R5bGVQcm92aWRlcj4sXG4gICAgICBzY3JpcHRzLFxuICAgIH07XG4gIH07XG59XG4iLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcIkBhbmFuc2kvcm91dGVyXCIpOyIsImNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSByZXF1aXJlKFwiaGlzdG9yeVwiKTsiLCJpbXBvcnQgeyBSb3V0ZSwgUm91dGVQcm92aWRlciwgUm91dGVDb250cm9sbGVyIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuaW1wb3J0IHsgY3JlYXRlTWVtb3J5SGlzdG9yeSB9IGZyb20gJ2hpc3RvcnknO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBDcmVhdGVSb3V0ZXIsIFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJvdXRlclNwb3V0PFJlc29sdmVXaXRoPihvcHRpb25zOiB7XG4gIHJlc29sdmVXaXRoPzogYW55O1xuICB1c2VSZXNvbHZlV2l0aDogKCkgPT4gUmVzb2x2ZVdpdGg7XG4gIGNyZWF0ZVJvdXRlcjogQ3JlYXRlUm91dGVyPFJlc29sdmVXaXRoPjtcbn0pOiBTZXJ2ZXJTcG91dDxcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHtcbiAgICBtYXRjaGVkUm91dGVzOiBSb3V0ZTxSZXNvbHZlV2l0aD5bXTtcbiAgICBzZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcztcbiAgfSAmIHtcbiAgICByb3V0ZXI6IFJvdXRlQ29udHJvbGxlcjxSb3V0ZTxSZXNvbHZlV2l0aCwgYW55Pj47XG4gIH1cbj4ge1xuICBjb25zdCBjcmVhdGVSb3V0ZUNvbXBvbmVudCA9IChcbiAgICByb3V0ZXI6IFJvdXRlQ29udHJvbGxlcjxSb3V0ZTxSZXNvbHZlV2l0aCwgYW55Pj4sXG4gICkgPT5cbiAgICBmdW5jdGlvbiBSb3V0ZXIoeyBjaGlsZHJlbiB9OiB7IGNoaWxkcmVuOiBSZWFjdC5SZWFjdE5vZGUgfSkge1xuICAgICAgY29uc3QgcmVzb2x2ZVdpdGggPSBvcHRpb25zLnVzZVJlc29sdmVXaXRoKCk7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDxSb3V0ZVByb3ZpZGVyIHJvdXRlcj17cm91dGVyfSByZXNvbHZlV2l0aD17cmVzb2x2ZVdpdGh9PlxuICAgICAgICAgIHtjaGlsZHJlbn1cbiAgICAgICAgPC9Sb3V0ZVByb3ZpZGVyPlxuICAgICAgKTtcbiAgICB9O1xuXG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCB1cmwgPSBwcm9wcy5yZXEudXJsIHx8ICcnO1xuICAgIGNvbnN0IHBhcnRzID0gdXJsLnNwbGl0KCc/JywgMik7XG4gICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyhwYXJ0cy5sZW5ndGggPCAyID8gJycgOiBwYXJ0c1sxXSk7XG4gICAgY29uc3Qgcm91dGVyID0gb3B0aW9ucy5jcmVhdGVSb3V0ZXIoXG4gICAgICBjcmVhdGVNZW1vcnlIaXN0b3J5KHsgaW5pdGlhbEVudHJpZXM6IFt1cmxdIH0pLFxuICAgICk7XG4gICAgY29uc3QgbWF0Y2hlZFJvdXRlczogUm91dGU8UmVzb2x2ZVdpdGg+W10gPSByb3V0ZXIuZ2V0TWF0Y2hlZFJvdXRlcyh1cmwpO1xuXG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIG1hdGNoZWRSb3V0ZXMsXG4gICAgICByb3V0ZXIsXG4gICAgICBzZWFyY2hQYXJhbXMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBSb3V0ZXIgPSBjcmVhdGVSb3V0ZUNvbXBvbmVudChyb3V0ZXIpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgIGFwcDogPFJvdXRlcj57bmV4dFByb3BzLmFwcH08L1JvdXRlcj4sXG4gICAgICAvLyBUT0RPOiBmaWd1cmUgb3V0IGhvdyB0byBvbmx5IGluamVjdCBpbiBuZXh0IGFuZCBub3QgaGF2ZSB0byBhbHNvIHB1dCBoZXJlXG4gICAgICBtYXRjaGVkUm91dGVzLFxuICAgICAgcm91dGVyLFxuICAgICAgc2VhcmNoUGFyYW1zLFxuICAgIH07XG4gIH07XG59XG4iLCJpbXBvcnQgeyBSb3V0ZSB9IGZyb20gJ0BhbmFuc2kvcm91dGVyJztcblxuaW1wb3J0IHR5cGUgeyBSZXNvbHZlUHJvcHMsIFNlcnZlclByb3BzIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbnR5cGUgTmVlZGVkUHJvcHM8Um91dGVXaXRoPiA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8Um91dGVXaXRoPltdO1xuICBzZWFyY2hQYXJhbXM6IFVSTFNlYXJjaFBhcmFtcztcbn0gJiBSZXNvbHZlUHJvcHM7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHByZWZldGNoU3BvdXQ8RiBleHRlbmRzIHN0cmluZz4oZmllbGQ6IEYpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIDxcbiAgICBSb3V0ZVdpdGgsXG4gICAgTiBleHRlbmRzIE5lZWRlZFByb3BzPFJvdXRlV2l0aD4sXG4gICAgSSBleHRlbmRzIFNlcnZlclByb3BzLFxuICA+KFxuICAgIG5leHQ6IChwcm9wczogSSkgPT4gUHJvbWlzZTxcbiAgICAgIHtcbiAgICAgICAgW0sgaW4gRl06IFJvdXRlV2l0aDtcbiAgICAgIH0gJiBOXG4gICAgPixcbiAgKSB7XG4gICAgcmV0dXJuIGFzeW5jIChwcm9wczogSSkgPT4ge1xuICAgICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHRvRmV0Y2g6IFByb21pc2U8dW5rbm93bj5bXSA9IFtdO1xuICAgICAgICBuZXh0UHJvcHMubWF0Y2hlZFJvdXRlcy5mb3JFYWNoKHJvdXRlID0+IHtcbiAgICAgICAgICAvLyBQcmVsb2FkIGxhenkgY29tcG9uZW50IHNvIGl0J3MgcmVhZHkgZm9yIFNTUiByZW5kZXJcbiAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlLmNvbXBvbmVudD8ucHJlbG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgdG9GZXRjaC5wdXNoKHJvdXRlLmNvbXBvbmVudC5wcmVsb2FkKCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlLnJlc29sdmVEYXRhID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0b0ZldGNoLnB1c2goXG4gICAgICAgICAgICAgIHJvdXRlLnJlc29sdmVEYXRhKFxuICAgICAgICAgICAgICAgIG5leHRQcm9wc1tmaWVsZF0sXG4gICAgICAgICAgICAgICAgcm91dGUsXG4gICAgICAgICAgICAgICAgbmV4dFByb3BzLnNlYXJjaFBhcmFtcyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwodG9GZXRjaCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV4dFByb3BzO1xuICAgIH07XG4gIH07XG59XG4iLCJpbXBvcnQgUmVhY3QsIHsgU3VzcGVuc2UgfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB0eXBlIHsgU2VydmVyU3BvdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxudHlwZSBOZWVkZWROZXh0ID0ge1xuICBpbml0RGF0YT86IFJlY29yZDxzdHJpbmcsICgpID0+IHVua25vd24+O1xuICBzY3JpcHRzPzogUmVhY3QuUmVhY3ROb2RlW107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBKU09OU3BvdXQoe1xuICBpZCA9ICdhbmFuc2ktanNvbicsXG59OiB7IGlkPzogc3RyaW5nIH0gPSB7fSk6IFNlcnZlclNwb3V0PFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIE5lZWRlZE5leHRcbj4ge1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dChwcm9wcyk7XG5cbiAgICBjb25zdCBzY3JpcHRzOiBSZWFjdC5SZWFjdE5vZGVbXSA9IG5leHRQcm9wcy5zY3JpcHRzID8/IFtdO1xuXG4gICAgT2JqZWN0LmVudHJpZXMobmV4dFByb3BzLmluaXREYXRhID8/IHt9KS5mb3JFYWNoKChba2V5LCB1c2VEYXRhXSkgPT4ge1xuICAgICAgY29uc3QgZ2xvYmFsSWQgPSBgJHtpZH0uJHtrZXl9YDtcbiAgICAgIGNvbnN0IFNjcmlwdCA9ICgpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YTogYW55ID0gdXNlRGF0YSgpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShkYXRhKTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgPHNjcmlwdFxuICAgICAgICAgICAgICBpZD17Z2xvYmFsSWR9XG4gICAgICAgICAgICAgIHR5cGU9XCJhcHBsaWNhdGlvbi9qc29uXCJcbiAgICAgICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgICAgICBfX2h0bWw6IGVuY29kZWQsXG4gICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgIG5vbmNlPXtwcm9wcy5ub25jZX1cbiAgICAgICAgICAgIC8+XG4gICAgICAgICAgKTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIC8vIFRPRE86IFVzZSB1bmlmaWVkIGxvZ2dpbmdcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBFcnJvciBzZXJpYWxpemluZyBqc29uIGZvciAke2tleX1gKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgc2NyaXB0cy5wdXNoKFxuICAgICAgICA8U3VzcGVuc2Uga2V5PXtnbG9iYWxJZH0+XG4gICAgICAgICAgPFNjcmlwdCAvPlxuICAgICAgICA8L1N1c3BlbnNlPixcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgc2NyaXB0cyxcbiAgICB9O1xuICB9O1xufVxuIiwiaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmNvbnN0IGFwcFNwb3V0ID1cbiAgKGFwcDogSlNYLkVsZW1lbnQpID0+XG4gIDxQIGV4dGVuZHMgU2VydmVyUHJvcHM+KHByb3BzOiBQKSA9PlxuICAgIFByb21pc2UucmVzb2x2ZSh7IC4uLnByb3BzLCBhcHAgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcFNwb3V0O1xuIiwiaW1wb3J0IHsgY3JlYXRlQ29udGV4dCwgdXNlQ29udGV4dCB9IGZyb20gJ3JlYWN0JztcblxuZXhwb3J0IGludGVyZmFjZSBOYXZpZ2F0b3JQcm9wZXJ0aWVzIHtcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgbGFuZ3VhZ2VzOiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGNvbnN0IE5hdmlnYXRvckNvbnRleHQgPSBjcmVhdGVDb250ZXh0PE5hdmlnYXRvclByb3BlcnRpZXMgfCB1bmRlZmluZWQ+KFxuICB1bmRlZmluZWQsXG4pO1xuXG5leHBvcnQgZnVuY3Rpb24gdXNlTmF2aWdhdG9yKCk6IE5hdmlnYXRvclByb3BlcnRpZXMge1xuICBjb25zdCBjb250ZXh0ID0gdXNlQ29udGV4dChOYXZpZ2F0b3JDb250ZXh0KTtcbiAgaWYgKGNvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndXNlTmF2aWdhdG9yIG11c3QgYmUgdXNlZCB3aXRoaW4gYSBOYXZpZ2F0b3JQcm92aWRlcicpO1xuICB9XG4gIHJldHVybiBjb250ZXh0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VBY2NlcHRMYW5ndWFnZShoZWFkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHtcbiAgbGFuZ3VhZ2U6IHN0cmluZztcbiAgbGFuZ3VhZ2VzOiByZWFkb25seSBzdHJpbmdbXTtcbn0ge1xuICBpZiAoIWhlYWRlcikge1xuICAgIHJldHVybiB7IGxhbmd1YWdlOiAnZW4nLCBsYW5ndWFnZXM6IFsnZW4nXSB9O1xuICB9XG5cbiAgY29uc3QgcGFyc2VkID0gaGVhZGVyXG4gICAgLnNwbGl0KCcsJylcbiAgICAubWFwKHBhcnQgPT4ge1xuICAgICAgY29uc3QgW2xhbmcsIHFQYXJ0XSA9IHBhcnQudHJpbSgpLnNwbGl0KCc7Jyk7XG4gICAgICBjb25zdCBxID0gcVBhcnQgPyBwYXJzZUZsb2F0KHFQYXJ0LnJlcGxhY2UoJ3E9JywgJycpKSA6IDE7XG4gICAgICByZXR1cm4geyBsYW5nOiBsYW5nLnRyaW0oKSwgcSB9O1xuICAgIH0pXG4gICAgLnNvcnQoKGEsIGIpID0+IGIucSAtIGEucSlcbiAgICAubWFwKCh7IGxhbmcgfSkgPT4gbGFuZyk7XG5cbiAgcmV0dXJuIHtcbiAgICBsYW5ndWFnZTogcGFyc2VkWzBdID8/ICdlbicsXG4gICAgbGFuZ3VhZ2VzOiBwYXJzZWQubGVuZ3RoID4gMCA/IHBhcnNlZCA6IFsnZW4nXSxcbiAgfTtcbn1cbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5cbmltcG9ydCB7IE5hdmlnYXRvckNvbnRleHQsIHBhcnNlQWNjZXB0TGFuZ3VhZ2UgfSBmcm9tICcuL25hdmlnYXRvci5jb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU2VydmVyU3BvdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxudHlwZSBOZWVkZWROZXh0ID0ge1xuICBpbml0RGF0YT86IFJlY29yZDxzdHJpbmcsICgpID0+IHVua25vd24+O1xufTtcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbmF2aWdhdG9yU3BvdXQoKTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB7IGxhbmd1YWdlOiBzdHJpbmc7IGxhbmd1YWdlczogcmVhZG9ubHkgc3RyaW5nW10gfSxcbiAgTmVlZGVkTmV4dFxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBhY2NlcHRMYW5ndWFnZSA9IHByb3BzLnJlcS5oZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXTtcbiAgICBjb25zdCBoZWFkZXIgPVxuICAgICAgdHlwZW9mIGFjY2VwdExhbmd1YWdlID09PSAnc3RyaW5nJyA/IGFjY2VwdExhbmd1YWdlIDogYWNjZXB0TGFuZ3VhZ2U/LlswXTtcbiAgICBjb25zdCBuYXZpZ2F0b3JQcm9wcyA9IHBhcnNlQWNjZXB0TGFuZ3VhZ2UoaGVhZGVyKTtcblxuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQoe1xuICAgICAgLi4ucHJvcHMsXG4gICAgICAuLi5uYXZpZ2F0b3JQcm9wcyxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICAuLi5uYXZpZ2F0b3JQcm9wcyxcbiAgICAgIGluaXREYXRhOiB7XG4gICAgICAgIC4uLm5leHRQcm9wcy5pbml0RGF0YSxcbiAgICAgICAgbmF2aWdhdG9yOiAoKSA9PiBuYXZpZ2F0b3JQcm9wcyxcbiAgICAgIH0sXG4gICAgICBhcHA6IChcbiAgICAgICAgPE5hdmlnYXRvckNvbnRleHQgdmFsdWU9e25hdmlnYXRvclByb3BzfT5cbiAgICAgICAgICB7bmV4dFByb3BzLmFwcH1cbiAgICAgICAgPC9OYXZpZ2F0b3JDb250ZXh0PlxuICAgICAgKSxcbiAgICB9O1xuICB9O1xufVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyBsYXlTcG91dHMgfSBmcm9tICcuL2xheVNwb3V0cy5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRvY3VtZW50U3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9kb2N1bWVudC5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBkYXRhQ2xpZW50U3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9kYXRhQ2xpZW50LnNlcnZlci5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGFudGRTcG91dCB9IGZyb20gJy4vc3BvdXRzL2FudGQuc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcm91dGVyU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9yb3V0ZXIuc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgcHJlZmV0Y2hTcG91dCB9IGZyb20gJy4vc3BvdXRzL3ByZWZldGNoLnNlcnZlci5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEpTT05TcG91dCB9IGZyb20gJy4vc3BvdXRzL2pzb24uc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYXBwU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9hcHAuc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgbmF2aWdhdG9yU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy9uYXZpZ2F0b3Iuc2VydmVyLmpzJztcbmV4cG9ydCB7IHVzZU5hdmlnYXRvciB9IGZyb20gJy4vc3BvdXRzL25hdmlnYXRvci5jb250ZXh0LmpzJztcbmV4cG9ydCB0eXBlIHsgTmF2aWdhdG9yUHJvcGVydGllcyB9IGZyb20gJy4vc3BvdXRzL25hdmlnYXRvci5jb250ZXh0LmpzJztcbmV4cG9ydCB0eXBlIHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3Nwb3V0cy90eXBlcy5qcyc7XG5leHBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IGFzIFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvdHlwZXMuanMnO1xuZXhwb3J0ICogZnJvbSAnLi9zY3JpcHRzL3R5cGVzLmpzJztcbiJdLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsIm9uU2hlbGxSZWFkeSIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJvblNoZWxsRXJyb3IiLCJlIiwiY29uc29sZSIsImVycm9yIiwic2V0VGltZW91dCIsImJ1aWxkUG9saWN5IiwicG9saWN5T2JqIiwiT2JqZWN0Iiwia2V5cyIsIm1hcCIsImtleSIsInZhbCIsIkFycmF5IiwiaXNBcnJheSIsIlNldCIsInZhbHVlcyIsImZpbHRlciIsInYiLCJqb2luIiwiaW5jbHVkZXMiLCJuZXdWYWwiLCJyZXBsYWNlIiwidHJpbSIsImpvaW5Ob25jZSIsInBvbGljeSIsIkRvY3VtZW50IiwiYXNzZXRzIiwiaGVhZCIsImRlZmF1bHRIZWFkIiwiY2hpbGRyZW4iLCJ0aXRsZSIsInJvb3RJZCIsImNoYXJTZXQiLCJzY3JpcHRzIiwiZXh0cmFTdHlsZSIsImxhbmciLCJfanN4cyIsIl9qc3giLCJhc3NldCIsImkiLCJyZWwiLCJpZCIsImhyZWYiLCJlbmRzV2l0aCIsInNyYyIsImFzeW5jIiwiX0ZyYWdtZW50IiwibmFtZSIsImNvbnRlbnQiLCJwcm9jZXNzIiwiZW52IiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsIlJlYWN0IiwianN4IiwiRG9jdW1lbnRTcG91dCIsIm9wdGlvbnMiLCJuZXh0IiwicHJvcHMiLCJuZXh0UHJvcHMiLCJwdWJsaWNQYXRoIiwiZW50cnlwb2ludHMiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJFcnJvciIsImFzc2V0TWFwIiwiYXNzZXRMaXN0IiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwibmFtZWRDaHVua0dyb3VwcyIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJmbGF0TWFwIiwiY2h1bmsiLCJjaGlsZHJlbkFzc2V0cyIsImFzIiwiY3NQb2xpY3kiLCJodHRwRXF1aXYiLCJOT0RFX0VOViIsInByZWxvYWQiLCJjIiwiZGF0YUNsaWVudFNwb3V0IiwibWFuYWdlcnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwiY3JlYXRlUGVyc2lzdGVkU3RvcmUiLCJTZXJ2ZXJEYXRhUHJvdmlkZXIiLCJ1c2VSZWFkeUNhY2hlU3RhdGUiLCJjb250cm9sbGVyIiwic3RvcmUiLCJpbml0RGF0YSIsImRhdGFjbGllbnQiLCJhbnRkU3BvdXQiLCJjcmVhdGVDYWNoZSIsImV4dHJhY3RTdHlsZSIsIlN0eWxlUHJvdmlkZXIiLCJjYWNoZSIsIkFudGRTaGVldHMiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsIlJvdXRlUHJvdmlkZXIiLCJjcmVhdGVNZW1vcnlIaXN0b3J5Iiwicm91dGVyU3BvdXQiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsInJlc29sdmVXaXRoIiwidXNlUmVzb2x2ZVdpdGgiLCJ1cmwiLCJwYXJ0cyIsInNwbGl0Iiwic2VhcmNoUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiY3JlYXRlUm91dGVyIiwiaW5pdGlhbEVudHJpZXMiLCJnZXRNYXRjaGVkUm91dGVzIiwicHJlZmV0Y2hTcG91dCIsImZpZWxkIiwidG9GZXRjaCIsImNvbXBvbmVudCIsInJlc29sdmVEYXRhIiwiUHJvbWlzZSIsImFsbCIsIlN1c3BlbnNlIiwiSlNPTlNwb3V0IiwiZW50cmllcyIsInVzZURhdGEiLCJnbG9iYWxJZCIsIlNjcmlwdCIsImRhdGEiLCJlbmNvZGVkIiwiSlNPTiIsInN0cmluZ2lmeSIsInR5cGUiLCJhcHBTcG91dCIsInJlc29sdmUiLCJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsIk5hdmlnYXRvckNvbnRleHQiLCJ1c2VOYXZpZ2F0b3IiLCJjb250ZXh0IiwicGFyc2VBY2NlcHRMYW5ndWFnZSIsImhlYWRlciIsImxhbmd1YWdlIiwibGFuZ3VhZ2VzIiwicGFyc2VkIiwicGFydCIsInFQYXJ0IiwicSIsInBhcnNlRmxvYXQiLCJzb3J0IiwiYSIsImIiLCJuYXZpZ2F0b3JTcG91dCIsImFjY2VwdExhbmd1YWdlIiwiaGVhZGVycyIsIm5hdmlnYXRvclByb3BzIiwibmF2aWdhdG9yIiwidmFsdWUiLCJkZWZhdWx0IiwiZG9jdW1lbnRTcG91dCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9
674
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,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O0lBQzNCbUwsU0FBUyxFQUFFbkwsTUFBTSxDQUFDa0csTUFBTSxHQUFHLENBQUMsR0FBR2xHLE1BQU0sR0FBRyxDQUFDLElBQUk7RUFDL0MsQ0FBQztBQUNILEM7O0FDekMwQjtBQUVxRDtBQUFBO0FBT2hFLFNBQVMyTCxjQUFjQSxDQUFBLEVBSXBDO0VBQ0EsT0FBTzlGLElBQUksSUFBSSxNQUFNQyxLQUFLLElBQUk7SUFDNUIsTUFBTThGLGNBQWMsR0FBRzlGLEtBQUssQ0FBQ2xFLEdBQUcsQ0FBQ2lLLE9BQU8sQ0FBQyxpQkFBaUIsQ0FBQztJQUMzRCxNQUFNWixNQUFNLEdBQ1YsT0FBT1csY0FBYyxLQUFLLFFBQVEsR0FBR0EsY0FBYyxHQUFHQSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE1BQU1FLGNBQWMsR0FBR2QsbUJBQW1CLENBQUNDLE1BQU0sQ0FBQztJQUVsRCxNQUFNbEYsU0FBUyxHQUFHLE1BQU1GLElBQUksQ0FBQztNQUMzQixHQUFHQyxLQUFLO01BQ1IsR0FBR2dHO0lBQ0wsQ0FBQyxDQUFDO0lBRUYsT0FBTztNQUNMLEdBQUcvRixTQUFTO01BQ1osR0FBRytGLGNBQWM7TUFDakJoRSxRQUFRLEVBQUU7UUFDUixHQUFHL0IsU0FBUyxDQUFDK0IsUUFBUTtRQUNyQmlFLFNBQVMsRUFBRUEsQ0FBQSxLQUFNRDtNQUNuQixDQUFDO01BQ0Q3SixHQUFHLGVBQ0QwQyxtQ0FBQSxDQUFDa0csZ0JBQWdCO1FBQUNtQixLQUFLLEVBQUVGLGNBQWU7UUFBQTNILFFBQUEsRUFDckM0QixTQUFTLENBQUM5RDtNQUFHLENBQ0U7SUFFdEIsQ0FBQztFQUNILENBQUM7QUFDSCxDOztBQ3ZDc0Q7QUFDaUI7QUFDSTtBQUNaO0FBQ0k7QUFDSTtBQUNSO0FBQ0Y7QUFDWTtBQUNaIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwiQGRhdGEtY2xpZW50L3JlYWN0XCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwiQGRhdGEtY2xpZW50L3JlYWN0L3NzclwiIiwid2VicGFjazovL0BhbmFuc2kvY29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL3dlYnBhY2svcnVudGltZS9jcmVhdGUgZmFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIG5vZGUtY29tbW9uanMgXCJjcnlwdG9cIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvZXh0ZXJuYWwgY29tbW9uanMgXCJyZWFjdC1kb20vc2VydmVyXCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3NjcmlwdHMvc3NyRXJyb3JIYW5kbGVyLnRzIiwid2VicGFjazovL0BhbmFuc2kvY29yZS8uL3NyYy9sYXlTcG91dHMudHN4Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS9leHRlcm5hbCBjb21tb25qcyBcInJlYWN0XCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9jc3AudHMiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3QvanN4LXJ1bnRpbWVcIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL0RvY3VtZW50Q29tcG9uZW50LnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL2RvY3VtZW50LnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9kYXRhQ2xpZW50LnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9hbnRkLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlL2V4dGVybmFsIGNvbW1vbmpzIFwiQGFuYW5zaS9yb3V0ZXJcIiIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvZXh0ZXJuYWwgY29tbW9uanMgXCJoaXN0b3J5XCIiLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9yb3V0ZXIuc2VydmVyLnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL3ByZWZldGNoLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9qc29uLnNlcnZlci50c3giLCJ3ZWJwYWNrOi8vQGFuYW5zaS9jb3JlLy4vc3JjL3Nwb3V0cy9hcHAuc2VydmVyLnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL25hdmlnYXRvci5jb250ZXh0LnRzeCIsIndlYnBhY2s6Ly9AYW5hbnNpL2NvcmUvLi9zcmMvc3BvdXRzL25hdmlnYXRvci5zZXJ2ZXIudHN4Iiwid2VicGFjazovL0BhbmFuc2kvY29yZS8uL3NyYy9pbmRleC5zZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiQGRhdGEtY2xpZW50L3JlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcIkBkYXRhLWNsaWVudC9yZWFjdC9zc3JcIik7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXShtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwidmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mID8gKG9iaikgPT4gKE9iamVjdC5nZXRQcm90b3R5cGVPZihvYmopKSA6IChvYmopID0+IChvYmouX19wcm90b19fKTtcbnZhciBsZWFmUHJvdG90eXBlcztcbi8vIGNyZWF0ZSBhIGZha2UgbmFtZXNwYWNlIG9iamVjdFxuLy8gbW9kZSAmIDE6IHZhbHVlIGlzIGEgbW9kdWxlIGlkLCByZXF1aXJlIGl0XG4vLyBtb2RlICYgMjogbWVyZ2UgYWxsIHByb3BlcnRpZXMgb2YgdmFsdWUgaW50byB0aGUgbnNcbi8vIG1vZGUgJiA0OiByZXR1cm4gdmFsdWUgd2hlbiBhbHJlYWR5IG5zIG9iamVjdFxuLy8gbW9kZSAmIDE2OiByZXR1cm4gdmFsdWUgd2hlbiBpdCdzIFByb21pc2UtbGlrZVxuLy8gbW9kZSAmIDh8MTogYmVoYXZlIGxpa2UgcmVxdWlyZVxuX193ZWJwYWNrX3JlcXVpcmVfXy50ID0gZnVuY3Rpb24odmFsdWUsIG1vZGUpIHtcblx0aWYobW9kZSAmIDEpIHZhbHVlID0gdGhpcyh2YWx1ZSk7XG5cdGlmKG1vZGUgJiA4KSByZXR1cm4gdmFsdWU7XG5cdGlmKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUpIHtcblx0XHRpZigobW9kZSAmIDQpICYmIHZhbHVlLl9fZXNNb2R1bGUpIHJldHVybiB2YWx1ZTtcblx0XHRpZigobW9kZSAmIDE2KSAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJykgcmV0dXJuIHZhbHVlO1xuXHR9XG5cdHZhciBucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cdF9fd2VicGFja19yZXF1aXJlX18ucihucyk7XG5cdHZhciBkZWYgPSB7fTtcblx0bGVhZlByb3RvdHlwZXMgPSBsZWFmUHJvdG90eXBlcyB8fCBbbnVsbCwgZ2V0UHJvdG8oe30pLCBnZXRQcm90byhbXSksIGdldFByb3RvKGdldFByb3RvKV07XG5cdGZvcih2YXIgY3VycmVudCA9IG1vZGUgJiAyICYmIHZhbHVlOyAodHlwZW9mIGN1cnJlbnQgPT0gJ29iamVjdCcgfHwgdHlwZW9mIGN1cnJlbnQgPT0gJ2Z1bmN0aW9uJykgJiYgIX5sZWFmUHJvdG90eXBlcy5pbmRleE9mKGN1cnJlbnQpOyBjdXJyZW50ID0gZ2V0UHJvdG8oY3VycmVudCkpIHtcblx0XHRPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjdXJyZW50KS5mb3JFYWNoKChrZXkpID0+IChkZWZba2V5XSA9ICgpID0+ICh2YWx1ZVtrZXldKSkpO1xuXHR9XG5cdGRlZlsnZGVmYXVsdCddID0gKCkgPT4gKHZhbHVlKTtcblx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKG5zLCBkZWYpO1xuXHRyZXR1cm4gbnM7XG59OyIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcImNyeXB0b1wiKTsiLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcInJlYWN0LWRvbS9zZXJ2ZXJcIik7IiwiLyoqXG4gKiBVdGlsaXRpZXMgZm9yIGhhbmRsaW5nIFNTUiBlcnJvcnMgZ3JhY2VmdWxseVxuICovXG5cbi8qKlxuICogRXh0cmFjdCBIVFRQIHN0YXR1cyBjb2RlIGZyb20gYW4gZXJyb3Igb2JqZWN0LlxuICogTG9va3MgZm9yIGEgYHN0YXR1c2AgcHJvcGVydHkgdGhhdCBpcyBhIG51bWJlciBvciBwYXJzZWFibGUgc3RyaW5nLlxuICogUmV0dXJucyA1MDAgaWYgbm8gdmFsaWQgc3RhdHVzIGZvdW5kLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXJyb3JTdGF0dXMoZXJyb3I6IHVua25vd24pOiBudW1iZXIge1xuICBpZiAoZXJyb3IgJiYgdHlwZW9mIGVycm9yID09PSAnb2JqZWN0JyAmJiAnc3RhdHVzJyBpbiBlcnJvcikge1xuICAgIGNvbnN0IHN0YXR1cyA9IChlcnJvciBhcyB7IHN0YXR1czogdW5rbm93biB9KS5zdGF0dXM7XG4gICAgaWYgKHR5cGVvZiBzdGF0dXMgPT09ICdudW1iZXInICYmIHN0YXR1cyA+PSAxMDAgJiYgc3RhdHVzIDwgNjAwKSB7XG4gICAgICByZXR1cm4gc3RhdHVzO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHN0YXR1cyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlSW50KHN0YXR1cywgMTApO1xuICAgICAgaWYgKCFpc05hTihwYXJzZWQpICYmIHBhcnNlZCA+PSAxMDAgJiYgcGFyc2VkIDwgNjAwKSB7XG4gICAgICAgIHJldHVybiBwYXJzZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiA1MDA7XG59XG5cbi8qKlxuICogRXNjYXBlIEhUTUwgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIHByZXZlbnQgWFNTXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVIdG1sKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHN0clxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKVxuICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgLnJlcGxhY2UoLycvZywgJyYjMDM5OycpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckVycm9yUGFnZU9wdGlvbnMge1xuICAvKiogU2hvdyBzdGFjayB0cmFjZSBpbiBvdXRwdXQgKi9cbiAgc2hvd1N0YWNrPzogYm9vbGVhbjtcbiAgLyoqIEFkZGl0aW9uYWwgaGludCBtZXNzYWdlIHRvIGRpc3BsYXkgKi9cbiAgaGludD86IHN0cmluZztcbiAgLyoqIEJhZGdlIHRleHQgdG8gZGlzcGxheSAoZS5nLiwgXCJERVYgTU9ERVwiKSAqL1xuICBiYWRnZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBSZW5kZXIgYW4gSFRNTCBlcnJvciBwYWdlIGZvciBTU1IgZmFpbHVyZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckVycm9yUGFnZShcbiAgZXJyb3I6IHVua25vd24sXG4gIHVybDogc3RyaW5nLFxuICBzdGF0dXNDb2RlOiBudW1iZXIsXG4gIG9wdGlvbnM6IFJlbmRlckVycm9yUGFnZU9wdGlvbnMgPSB7fSxcbik6IHN0cmluZyB7XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgY29uc3Qgc3RhY2sgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3Iuc3RhY2sgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHsgc2hvd1N0YWNrID0gZmFsc2UsIGhpbnQsIGJhZGdlIH0gPSBvcHRpb25zO1xuXG4gIHJldHVybiBgPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPVwiZW5cIj5cbjxoZWFkPlxuICA8bWV0YSBjaGFyc2V0PVwiVVRGLThcIj5cbiAgPG1ldGEgbmFtZT1cInZpZXdwb3J0XCIgY29udGVudD1cIndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjBcIj5cbiAgPHRpdGxlPiR7c3RhdHVzQ29kZX0gLSBTZXJ2ZXIgRXJyb3I8L3RpdGxlPlxuICA8c3R5bGU+XG4gICAgKiB7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgfVxuICAgIGJvZHkgeyBmb250LWZhbWlseTogLWFwcGxlLXN5c3RlbSwgQmxpbmtNYWNTeXN0ZW1Gb250LCAnU2Vnb2UgVUknLCBSb2JvdG8sIHNhbnMtc2VyaWY7IGJhY2tncm91bmQ6ICMxYTFhMmU7IGNvbG9yOiAjZWVlOyBtaW4taGVpZ2h0OiAxMDB2aDsgZGlzcGxheTogZmxleDsgYWxpZ24taXRlbXM6IGNlbnRlcjsganVzdGlmeS1jb250ZW50OiBjZW50ZXI7IHBhZGRpbmc6IDJyZW07IH1cbiAgICAuY29udGFpbmVyIHsgbWF4LXdpZHRoOiA4MDBweDsgd2lkdGg6IDEwMCU7IH1cbiAgICBoMSB7IGNvbG9yOiAjZmY2YjZiOyBmb250LXNpemU6IDIuNXJlbTsgbWFyZ2luLWJvdHRvbTogMXJlbTsgfVxuICAgIC5iYWRnZSB7IGRpc3BsYXk6IGlubGluZS1ibG9jazsgYmFja2dyb3VuZDogIzRlY2RjNDsgY29sb3I6ICMxYTFhMmU7IHBhZGRpbmc6IDAuMjVyZW0gMC41cmVtOyBib3JkZXItcmFkaXVzOiA0cHg7IGZvbnQtc2l6ZTogMC43NXJlbTsgZm9udC13ZWlnaHQ6IDYwMDsgbWFyZ2luLWJvdHRvbTogMXJlbTsgfVxuICAgIC51cmwgeyBjb2xvcjogIzg4ODsgZm9udC1zaXplOiAwLjlyZW07IG1hcmdpbi1ib3R0b206IDEuNXJlbTsgd29yZC1icmVhazogYnJlYWstYWxsOyB9XG4gICAgLm1lc3NhZ2UgeyBiYWNrZ3JvdW5kOiAjMTYyMTNlOyBib3JkZXItbGVmdDogNHB4IHNvbGlkICNmZjZiNmI7IHBhZGRpbmc6IDFyZW0gMS41cmVtOyBib3JkZXItcmFkaXVzOiAwIDhweCA4cHggMDsgbWFyZ2luLWJvdHRvbTogMS41cmVtOyB9XG4gICAgLm1lc3NhZ2UgY29kZSB7IGNvbG9yOiAjZmY2YjZiOyBmb250LXNpemU6IDEuMXJlbTsgfVxuICAgIC5zdGFjayB7IGJhY2tncm91bmQ6ICMwZjBmMjM7IGJvcmRlci1yYWRpdXM6IDhweDsgcGFkZGluZzogMS41cmVtOyBvdmVyZmxvdy14OiBhdXRvOyBmb250LWZhbWlseTogJ01vbmFjbycsICdNZW5sbycsIG1vbm9zcGFjZTsgZm9udC1zaXplOiAwLjg1cmVtOyBsaW5lLWhlaWdodDogMS42OyBjb2xvcjogI2FhYTsgd2hpdGUtc3BhY2U6IHByZS13cmFwOyB3b3JkLWJyZWFrOiBicmVhay13b3JkOyB9XG4gICAgLnJldHJ5IHsgbWFyZ2luLXRvcDogMnJlbTsgfVxuICAgIC5yZXRyeSBhIHsgY29sb3I6ICM0ZWNkYzQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgcGFkZGluZzogMC43NXJlbSAxLjVyZW07IGJvcmRlcjogMnB4IHNvbGlkICM0ZWNkYzQ7IGJvcmRlci1yYWRpdXM6IDZweDsgZGlzcGxheTogaW5saW5lLWJsb2NrOyB0cmFuc2l0aW9uOiBhbGwgMC4yczsgfVxuICAgIC5yZXRyeSBhOmhvdmVyIHsgYmFja2dyb3VuZDogIzRlY2RjNDsgY29sb3I6ICMxYTFhMmU7IH1cbiAgICAuaGludCB7IG1hcmdpbi10b3A6IDEuNXJlbTsgY29sb3I6ICM4ODg7IGZvbnQtc2l6ZTogMC45cmVtOyB9XG4gIDwvc3R5bGU+XG48L2hlYWQ+XG48Ym9keT5cbiAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICR7YmFkZ2UgPyBgPHNwYW4gY2xhc3M9XCJiYWRnZVwiPiR7ZXNjYXBlSHRtbChiYWRnZSl9PC9zcGFuPmAgOiAnJ31cbiAgICA8aDE+JHtzdGF0dXNDb2RlfSAtIFNlcnZlciBFcnJvcjwvaDE+XG4gICAgPHAgY2xhc3M9XCJ1cmxcIj5FcnJvciByZW5kZXJpbmc6ICR7ZXNjYXBlSHRtbCh1cmwpfTwvcD5cbiAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgPGNvZGU+JHtlc2NhcGVIdG1sKGVycm9yTWVzc2FnZSl9PC9jb2RlPlxuICAgIDwvZGl2PlxuICAgICR7c2hvd1N0YWNrICYmIHN0YWNrID8gYDxwcmUgY2xhc3M9XCJzdGFja1wiPiR7ZXNjYXBlSHRtbChzdGFjayl9PC9wcmU+YCA6ICcnfVxuICAgIDxkaXYgY2xhc3M9XCJyZXRyeVwiPlxuICAgICAgPGEgaHJlZj1cIiR7ZXNjYXBlSHRtbCh1cmwpfVwiPlJldHJ5PC9hPlxuICAgIDwvZGl2PlxuICAgICR7aGludCA/IGA8cCBjbGFzcz1cImhpbnRcIj4ke2VzY2FwZUh0bWwoaGludCl9PC9wPmAgOiAnJ31cbiAgPC9kaXY+XG48L2JvZHk+XG48L2h0bWw+YDtcbn1cbiIsImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuXG5pbXBvcnQgeyBnZXRFcnJvclN0YXR1cyB9IGZyb20gJy4vc2NyaXB0cy9zc3JFcnJvckhhbmRsZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBSZW5kZXIgfSBmcm9tICcuL3NjcmlwdHMvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJQcm9wcyB9IGZyb20gJy4vc3BvdXRzL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbGF5U3BvdXRzKFxuICBzcG91dHM6IChwcm9wczogU2VydmVyUHJvcHMpID0+IFByb21pc2U8e1xuICAgIGFwcDogSlNYLkVsZW1lbnQ7XG4gIH0+LFxuICB7XG4gICAgdGltZW91dE1TID0gMTAwMDAsXG4gICAgb25FcnJvcixcbiAgfTogeyB0aW1lb3V0TVM/OiBudW1iZXI7IG9uRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQgfSA9IHt9LFxuKSB7XG4gIGNvbnN0IHJlbmRlcjogUmVuZGVyID0gYXN5bmMgKGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcykgPT4ge1xuICAgIGNvbnN0IG5vbmNlID0gY3J5cHRvLnJhbmRvbUJ5dGVzKDE2KS50b1N0cmluZygnYmFzZTY0Jyk7XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBhcHAgfSA9IGF3YWl0IHNwb3V0cyh7IGNsaWVudE1hbmlmZXN0LCByZXEsIHJlcywgbm9uY2UgfSk7XG5cbiAgICAgIGxldCBkaWRFcnJvciA9IGZhbHNlO1xuICAgICAgbGV0IGxhc3RFcnJvcjogdW5rbm93bjtcbiAgICAgIGNvbnN0IHsgcGlwZSwgYWJvcnQgfSA9IHJlYWN0UmVuZGVyKGFwcCwge1xuICAgICAgICBub25jZSxcbiAgICAgICAgLy9ib290c3RyYXBTY3JpcHRzOiBhc3NldHMuZmlsdGVyKGFzc2V0ID0+IGFzc2V0LmVuZHNXaXRoKCcuanMnKSksXG4gICAgICAgIG9uU2hlbGxSZWFkeSgpIHtcbiAgICAgICAgICAvL21hbmFnZXJzLmZvckVhY2gobWFuYWdlciA9PiBtYW5hZ2VyLmNsZWFudXAoKSk7XG4gICAgICAgICAgLy8gSWYgc29tZXRoaW5nIGVycm9yZWQgYmVmb3JlIHdlIHN0YXJ0ZWQgc3RyZWFtaW5nLCB3ZSBzZXQgdGhlIGVycm9yIGNvZGUgYXBwcm9wcmlhdGVseS5cbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IGRpZEVycm9yID8gZ2V0RXJyb3JTdGF0dXMobGFzdEVycm9yKSA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoZTogdW5rbm93bikge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZSk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yKGU6IHVua25vd24pIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgbGFzdEVycm9yID0gZTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZ2V0RXJyb3JTdGF0dXMoZSk7XG4gICAgICAgICAgLy9waXBlKHJlcyk7IFJlbW92aW5nIHRoaXMgYXZvaWRzLCBcIlJlYWN0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHBpcGluZyB0byBvbmUgd3JpdGFibGUgc3RyZWFtLlwiXG4gICAgICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIC8vIEFiYW5kb24gYW5kIHN3aXRjaCB0byBjbGllbnQgcmVuZGVyaW5nIGlmIGVub3VnaCB0aW1lIHBhc3Nlcy5cbiAgICAgIC8vIFRyeSBsb3dlcmluZyB0aGlzIHRvIHNlZSB0aGUgY2xpZW50IHJlY292ZXIuXG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiAoYWJvcnQgYXMgYW55KShgVGltZW91dCBvZiAke3RpbWVvdXRNU31tcyBleGNlZWRlZGApLFxuICAgICAgICB0aW1lb3V0TVMsXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGU6IHVua25vd24pIHtcbiAgICAgIGlmIChvbkVycm9yKSBvbkVycm9yKGUpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gIH07XG4gIHJldHVybiByZW5kZXI7XG59XG4iLCJjb25zdCBfX1dFQlBBQ0tfTkFNRVNQQUNFX09CSkVDVF9fID0gcmVxdWlyZShcInJlYWN0XCIpOyIsImV4cG9ydCBpbnRlcmZhY2UgUG9saWN5IHtcbiAgW2RpcmVjdGl2ZTogc3RyaW5nXTogc3RyaW5nIHwgc3RyaW5nW107XG59XG5cbi8vIFRPRE86IG1lbW9pemUgdGhpc1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9saWN5KHBvbGljeU9iajogUG9saWN5KSB7XG4gIHJldHVybiBPYmplY3Qua2V5cyhwb2xpY3lPYmopXG4gICAgLm1hcChrZXkgPT4ge1xuICAgICAgY29uc3QgdmFsID1cbiAgICAgICAgQXJyYXkuaXNBcnJheShwb2xpY3lPYmpba2V5XSkgP1xuICAgICAgICAgIFsuLi5uZXcgU2V0KHBvbGljeU9ialtrZXldKS52YWx1ZXMoKV0uZmlsdGVyKHYgPT4gdikuam9pbignICcpXG4gICAgICAgIDogcG9saWN5T2JqW2tleV07XG5cbiAgICAgIC8vIG1vdmUgc3RyaWN0IGR5bmFtaWMgdG8gdGhlIGVuZCBvZiB0aGUgcG9saWN5IGlmIGl0IGV4aXN0cyB0byBiZSBiYWNrd2FyZHMgY29tcGF0aWJsZSB3aXRoIGNzcDJcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvSGVhZGVycy9Db250ZW50LVNlY3VyaXR5LVBvbGljeS9zY3JpcHQtc3JjI3N0cmljdC1keW5hbWljXG4gICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLmluY2x1ZGVzKFwiJ3N0cmljdC1keW5hbWljJ1wiKSkge1xuICAgICAgICBjb25zdCBuZXdWYWwgPSBgJHt2YWxcbiAgICAgICAgICAucmVwbGFjZSgvXFxzPydzdHJpY3QtZHluYW1pYydcXHM/L2dpLCAnICcpXG4gICAgICAgICAgLnRyaW0oKX0gJ3N0cmljdC1keW5hbWljJ2A7XG4gICAgICAgIHJldHVybiBgJHtrZXl9ICR7bmV3VmFsfWA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgJHtrZXl9ICR7dmFsfWA7XG4gICAgfSlcbiAgICAuam9pbignOyAnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGpvaW5Ob25jZShwb2xpY3lPYmo6IFBvbGljeSwgbm9uY2U/OiBzdHJpbmcgfCB1bmRlZmluZWQpIHtcbiAgaWYgKCFub25jZSkgcmV0dXJuIHBvbGljeU9iajtcbiAgY29uc3QgcG9saWN5ID0ge1xuICAgIC4uLnBvbGljeU9iaixcbiAgfTtcbiAgaWYgKHR5cGVvZiBwb2xpY3lbJ3NjcmlwdC1zcmMnXSA9PT0gJ3N0cmluZycpIHtcbiAgICBwb2xpY3lbJ3NjcmlwdC1zcmMnXSA9IFtwb2xpY3lbJ3NjcmlwdC1zcmMnXSwgYCdub25jZS0ke25vbmNlfSdgXTtcbiAgfSBlbHNlIHtcbiAgICBwb2xpY3lbJ3NjcmlwdC1zcmMnXSA9IFsuLi5wb2xpY3lbJ3NjcmlwdC1zcmMnXSwgYCdub25jZS0ke25vbmNlfSdgXTtcbiAgfVxuICByZXR1cm4gcG9saWN5O1xufVxuIiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJyZWFjdC9qc3gtcnVudGltZVwiKTsiLCJ0eXBlIFByb3BzID0ge1xuICBjaGlsZHJlbjogUmVhY3QuUmVhY3ROb2RlO1xuICBhc3NldHM6IHsgaHJlZjogc3RyaW5nOyBhcz86IHN0cmluZzsgcmVsPzogc3RyaW5nIH1bXTtcbiAgaGVhZD86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgZXh0cmFTdHlsZTogUmVhY3QuUmVhY3ROb2RlO1xuICBzY3JpcHRzPzogUmVhY3QuUmVhY3ROb2RlO1xuICB0aXRsZTogc3RyaW5nO1xuICByb290SWQ/OiBzdHJpbmc7XG4gIGNoYXJTZXQ/OiBzdHJpbmc7XG4gIGxhbmc/OiBzdHJpbmc7XG59O1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gRG9jdW1lbnQoe1xuICBhc3NldHMsXG4gIGhlYWQgPSBkZWZhdWx0SGVhZCxcbiAgY2hpbGRyZW4sXG4gIHRpdGxlLFxuICByb290SWQgPSAnYW5hbnNpLXJvb3QnLFxuICBjaGFyU2V0ID0gJ3V0Zi04JyxcbiAgc2NyaXB0cyA9IG51bGwsXG4gIGV4dHJhU3R5bGUsXG4gIGxhbmcsXG59OiBQcm9wcykge1xuICByZXR1cm4gKFxuICAgIDxodG1sIGxhbmc9e2xhbmd9PlxuICAgICAgPGhlYWQ+XG4gICAgICAgIDxtZXRhIGNoYXJTZXQ9e2NoYXJTZXR9IC8+XG4gICAgICAgIHtoZWFkfVxuICAgICAgICB7ZXh0cmFTdHlsZX1cbiAgICAgICAge2Fzc2V0cy5tYXAoKGFzc2V0LCBpKSA9PiAoXG4gICAgICAgICAgPGxpbmsga2V5PXtpfSByZWw9XCJwcmVsb2FkXCIgey4uLmFzc2V0fSAvPlxuICAgICAgICApKX1cbiAgICAgICAgPHRpdGxlPnt0aXRsZX08L3RpdGxlPlxuICAgICAgPC9oZWFkPlxuICAgICAgPGJvZHk+XG4gICAgICAgIDxkaXYgaWQ9e3Jvb3RJZH0+e2NoaWxkcmVufTwvZGl2PlxuICAgICAgICB7c2NyaXB0c31cbiAgICAgICAge2Fzc2V0c1xuICAgICAgICAgIC5maWx0ZXIoKHsgaHJlZiB9KSA9PiBocmVmLmVuZHNXaXRoKCcuanMnKSlcbiAgICAgICAgICAubWFwKCh7IGhyZWYgfSwgaSkgPT4gKFxuICAgICAgICAgICAgPHNjcmlwdCBrZXk9e2l9IHNyYz17aHJlZn0gYXN5bmMgLz5cbiAgICAgICAgICApKX1cbiAgICAgIDwvYm9keT5cbiAgICA8L2h0bWw+XG4gICk7XG59XG5jb25zdCBkZWZhdWx0SGVhZCA9IChcbiAgPD5cbiAgICA8bWV0YSBuYW1lPVwidmlld3BvcnRcIiBjb250ZW50PVwid2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTFcIiAvPlxuICAgIDxsaW5rXG4gICAgICByZWw9XCJzaG9ydGN1dCBpY29uXCJcbiAgICAgIGhyZWY9e2Ake3Byb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEggPz8gJy8nfWZhdmljb24uaWNvYH1cbiAgICAvPlxuICA8Lz5cbik7XG4iLCJpbXBvcnQgdHlwZSB7IFJvdXRlIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuaW1wb3J0IHsgUmVxdWVzdCB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IFN0YXRzQ2h1bmtHcm91cCB9IGZyb20gJ3dlYnBhY2snO1xuXG5pbXBvcnQgeyBidWlsZFBvbGljeSwgam9pbk5vbmNlLCBQb2xpY3kgfSBmcm9tICcuL2NzcC5qcyc7XG5pbXBvcnQgRG9jdW1lbnQgZnJvbSAnLi9Eb2N1bWVudENvbXBvbmVudC5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbnR5cGUgTmVlZGVkTmV4dCA9IHtcbiAgbWF0Y2hlZFJvdXRlczogUm91dGU8YW55PltdO1xuICB0aXRsZT86IHN0cmluZztcbiAgc2NyaXB0cz86IFJlYWN0LlJlYWN0Tm9kZVtdO1xuICBleHRyYVN0eWxlPzogUmVhY3QuUmVhY3ROb2RlW107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBEb2N1bWVudFNwb3V0KG9wdGlvbnM6IHtcbiAgaGVhZD86IFJlYWN0LlJlYWN0Tm9kZTtcbiAgdGl0bGU6IHN0cmluZztcbiAgbGFuZz86IHN0cmluZztcbiAgcm9vdElkPzogc3RyaW5nO1xuICBjaGFyU2V0Pzogc3RyaW5nO1xuICBjc1BvbGljeT86IFBvbGljeTtcbn0pOiBTZXJ2ZXJTcG91dDxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIE5lZWRlZE5leHQ+IHtcbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQocHJvcHMpO1xuXG4gICAgY29uc3QgcHVibGljUGF0aCA9IHByb3BzLmNsaWVudE1hbmlmZXN0LnB1YmxpY1BhdGg7XG5cbiAgICBpZiAoXG4gICAgICBPYmplY3Qua2V5cyhwcm9wcy5jbGllbnRNYW5pZmVzdD8uZW50cnlwb2ludHMgPz8ge30pLmxlbmd0aCA8IDEgfHxcbiAgICAgIHB1YmxpY1BhdGggPT09IHVuZGVmaW5lZFxuICAgIClcbiAgICAgIHRocm93IG5ldyBFcnJvcignTWFuaWZlc3QgbWlzc2luZyBlbnRyaWVzIG5lZWRlZCcpO1xuXG4gICAgLy8gVE9ETzogY29uc2lkZXIgdXNpbmcgdGhpcyBwYWNrYWdlIGZvciBidWlsZCBzdGF0cyBpbiBmdXR1cmU6XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlYWN0L3RyZWUvbWFpbi9wYWNrYWdlcy9yZWFjdC1zZXJ2ZXItZG9tLXdlYnBhY2tcbiAgICBjb25zdCBhc3NldE1hcCA9IChhc3NldHM6IHsgbmFtZTogc3RyaW5nOyBzaXplPzogbnVtYmVyIH1bXSkgPT5cbiAgICAgIGFzc2V0cy5tYXAoKHsgbmFtZSB9KSA9PiBgJHtwdWJsaWNQYXRofSR7bmFtZX1gKTtcblxuICAgIGNvbnN0IGFzc2V0TGlzdDogc3RyaW5nW10gPSBbXTtcbiAgICBPYmplY3QudmFsdWVzKHByb3BzLmNsaWVudE1hbmlmZXN0Py5lbnRyeXBvaW50cyA/PyB7fSkuZm9yRWFjaChcbiAgICAgIGVudHJ5cG9pbnQgPT4ge1xuICAgICAgICBhc3NldExpc3QucHVzaCguLi5hc3NldE1hcChlbnRyeXBvaW50LmFzc2V0cyA/PyBbXSkpO1xuICAgICAgfSxcbiAgICApO1xuICAgIG5ldyBTZXQoXG4gICAgICBhc3NldE1hcChcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhwcm9wcy5jbGllbnRNYW5pZmVzdC5uYW1lZENodW5rR3JvdXBzID8/IHt9KVxuICAgICAgICAgIC5maWx0ZXIoKHsgbmFtZSB9KSA9PlxuICAgICAgICAgICAgbmV4dFByb3BzLm1hdGNoZWRSb3V0ZXMuc29tZShyb3V0ZSA9PiBuYW1lPy5pbmNsdWRlcyhyb3V0ZS5uYW1lKSksXG4gICAgICAgICAgKVxuICAgICAgICAgIC5mbGF0TWFwKGNodW5rID0+IFtcbiAgICAgICAgICAgIC4uLihjaHVuay5hc3NldHMgPz8gW10pLFxuICAgICAgICAgICAgLy8gYW55IGNodW5rIHByZWxvYWRzXG4gICAgICAgICAgICAuLi5jaGlsZHJlbkFzc2V0cyhjaHVuayksXG4gICAgICAgICAgXSksXG4gICAgICApLFxuICAgICkuZm9yRWFjaChhc3NldCA9PiBhc3NldExpc3QucHVzaChhc3NldCkpO1xuXG4gICAgLy8gZmluZCBhZGRpdGlvbmFsIGFzc2V0cyB0byBwcmVsb2FkIGJhc2VkIG9uIG1hdGNoZWQgcm91dGVcbiAgICBjb25zdCBhc3NldHM6IHtcbiAgICAgIGhyZWY6IHN0cmluZztcbiAgICAgIGFzPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgcmVsPzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIH1bXSA9IGFzc2V0TGlzdFxuICAgICAgLmZpbHRlcihhc3NldCA9PiAhYXNzZXQuZW5kc1dpdGgoJy5ob3QtdXBkYXRlLmpzJykpXG4gICAgICAubWFwKGFzc2V0ID0+XG4gICAgICAgIGFzc2V0LmVuZHNXaXRoKCcuY3NzJykgPyB7IGhyZWY6IGFzc2V0LCByZWw6ICdzdHlsZXNoZWV0JyB9XG4gICAgICAgIDogYXNzZXQuZW5kc1dpdGgoJy5qcycpID8geyBocmVmOiBhc3NldCwgYXM6ICdzY3JpcHQnIH1cbiAgICAgICAgOiB7IGhyZWY6IGFzc2V0IH0sXG4gICAgICApO1xuXG4gICAgaWYgKG9wdGlvbnMuY3NQb2xpY3kpIHtcbiAgICAgIGNvbnN0IGh0dHBFcXVpdiA9XG4gICAgICAgIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAncHJvZHVjdGlvbicgP1xuICAgICAgICAgICdDb250ZW50LVNlY3VyaXR5LVBvbGljeSdcbiAgICAgICAgOiAnQ29udGVudC1TZWN1cml0eS1Qb2xpY3ktUmVwb3J0LU9ubHknO1xuXG4gICAgICBwcm9wcy5yZXMuc2V0SGVhZGVyKFxuICAgICAgICBodHRwRXF1aXYsXG4gICAgICAgIGJ1aWxkUG9saWN5KGpvaW5Ob25jZShvcHRpb25zLmNzUG9saWN5LCBwcm9wcy5ub25jZSkpLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgYXBwOiAoXG4gICAgICAgIDxEb2N1bWVudFxuICAgICAgICAgIHsuLi5vcHRpb25zfVxuICAgICAgICAgIGV4dHJhU3R5bGU9e25leHRQcm9wcy5leHRyYVN0eWxlfVxuICAgICAgICAgIHRpdGxlPXtuZXh0UHJvcHMudGl0bGUgPz8gb3B0aW9ucy50aXRsZX1cbiAgICAgICAgICBhc3NldHM9e2Fzc2V0c31cbiAgICAgICAgICByb290SWQ9e29wdGlvbnMucm9vdElkfVxuICAgICAgICAgIHNjcmlwdHM9e25leHRQcm9wcy5zY3JpcHRzfVxuICAgICAgICA+XG4gICAgICAgICAge25leHRQcm9wcy5hcHB9XG4gICAgICAgIDwvRG9jdW1lbnQ+XG4gICAgICApLFxuICAgIH07XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoaWxkcmVuQXNzZXRzKGNodW5rOiBTdGF0c0NodW5rR3JvdXApIHtcbiAgcmV0dXJuIGNodW5rLmNoaWxkcmVuID9cbiAgICAgIE9iamVjdC52YWx1ZXMoY2h1bmsuY2hpbGRyZW4pLmZsYXRNYXAocHJlbG9hZCA9PlxuICAgICAgICBwcmVsb2FkLmZsYXRNYXAoYyA9PiBjLmFzc2V0cyA/PyBbXSksXG4gICAgICApXG4gICAgOiBbXTtcbn1cbiIsImltcG9ydCB7XG4gIHR5cGUgQ29udHJvbGxlcixcbiAgdHlwZSBNYW5hZ2VyLFxuICB0eXBlIFN0YXRlLFxuICB0eXBlIFN0b3JlLFxufSBmcm9tICdAZGF0YS1jbGllbnQvcmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGRhdGFDbGllbnRTcG91dChcbiAgb3B0aW9uczoge1xuICAgIGdldE1hbmFnZXJzPzogKCkgPT4gTWFuYWdlcltdO1xuICB9ID0ge30sXG4pOiBTZXJ2ZXJTcG91dDxcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHsgY29udHJvbGxlcjogQ29udHJvbGxlciB9ICYgeyBzdG9yZTogU3RvcmU8U3RhdGU8dW5rbm93bj4+IH0sXG4gIHsgaW5pdERhdGE/OiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB1bmtub3duPjsgc2NyaXB0cz86IFJlYWN0LlJlYWN0Tm9kZVtdIH1cbj4ge1xuICByZXR1cm4gbmV4dCA9PiBhc3luYyBwcm9wcyA9PiB7XG4gICAgY29uc3QgbWFuYWdlcnMgPSBvcHRpb25zPy5nZXRNYW5hZ2Vycz8uKCkgPz8gW1xuICAgICAgbmV3IChhd2FpdCBpbXBvcnQoJ0BkYXRhLWNsaWVudC9yZWFjdCcpKS5OZXR3b3JrTWFuYWdlcigpLFxuICAgIF07XG4gICAgY29uc3QgeyBjcmVhdGVQZXJzaXN0ZWRTdG9yZSB9ID0gYXdhaXQgaW1wb3J0KCdAZGF0YS1jbGllbnQvcmVhY3Qvc3NyJyk7XG4gICAgY29uc3QgW1NlcnZlckRhdGFQcm92aWRlciwgdXNlUmVhZHlDYWNoZVN0YXRlLCBjb250cm9sbGVyLCBzdG9yZV0gPVxuICAgICAgY3JlYXRlUGVyc2lzdGVkU3RvcmUobWFuYWdlcnMpO1xuXG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBzdG9yZSxcbiAgICB9KTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgaW5pdERhdGE6IHtcbiAgICAgICAgLi4ubmV4dFByb3BzLmluaXREYXRhLFxuICAgICAgICBkYXRhY2xpZW50OiB1c2VSZWFkeUNhY2hlU3RhdGUsXG4gICAgICB9LFxuICAgICAgYXBwOiA8U2VydmVyRGF0YVByb3ZpZGVyPntuZXh0UHJvcHMuYXBwfTwvU2VydmVyRGF0YVByb3ZpZGVyPixcbiAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIG9ubHkgaW5qZWN0IGluIG5leHQgYW5kIG5vdCBoYXZlIHRvIGFsc28gcHV0IGhlcmVcbiAgICAgIGNvbnRyb2xsZXIsXG4gICAgICBzdG9yZSxcbiAgICB9O1xuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0LCB7IHR5cGUgSlNYIH0gZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IFNlcnZlclNwb3V0IH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbnR5cGUgTmVlZGVkTmV4dCA9IHtcbiAgaW5pdERhdGE/OiBSZWNvcmQ8c3RyaW5nLCAoKSA9PiB1bmtub3duPjtcbiAgc2NyaXB0cz86IFJlYWN0LlJlYWN0Tm9kZVtdO1xuICBleHRyYVN0eWxlPzogUmVhY3QuUmVhY3ROb2RlW107XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhbnRkU3BvdXQoKTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgTmVlZGVkTmV4dFxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCB7IGNyZWF0ZUNhY2hlLCBleHRyYWN0U3R5bGUsIFN0eWxlUHJvdmlkZXIgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gJ0BhbnQtZGVzaWduL2Nzc2luanMnXG4gICAgKTtcbiAgICBjb25zdCBjYWNoZSA9IGNyZWF0ZUNhY2hlKCk7XG4gICAgY29uc3QgQW50ZFNoZWV0cyA9ICgpOiBKU1guRWxlbWVudCA9PiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUw9e3tcbiAgICAgICAgICAgIF9faHRtbDogYDwvc2NyaXB0PiR7ZXh0cmFjdFN0eWxlKGNhY2hlKX08c2NyaXB0PmAsXG4gICAgICAgICAgfX1cbiAgICAgICAgLz5cbiAgICAgICk7XG4gICAgfTtcblxuICAgIGNvbnN0IG5leHRQcm9wcyA9IGF3YWl0IG5leHQocHJvcHMpO1xuXG4gICAgY29uc3Qgc2NyaXB0czogUmVhY3QuUmVhY3ROb2RlW10gPSBuZXh0UHJvcHMuc2NyaXB0cyA/PyBbXTtcblxuICAgIC8vIHVuZm9ydHVuYXRlbHkgd2UgaGF2ZSB0byBpbmplY3QgdGhpcyBhZnRlciB0aGUgZW50aXJlIGNvbnRlbnQgaGFzIHN0cmVhbWVkIGluIG9yIGl0IGRvZXNuJ3QgY29ycmVjdGx5IHBvcHVsYXRlXG4gICAgLy8gc2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW50LWRlc2lnbi9jc3NpbmpzL2lzc3Vlcy83OVxuICAgIHNjcmlwdHMucHVzaCg8QW50ZFNoZWV0cyBrZXk9XCJhbnRkLXNoZWV0c1wiIC8+KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICBhcHA6IDxTdHlsZVByb3ZpZGVyIGNhY2hlPXtjYWNoZX0+e25leHRQcm9wcy5hcHB9PC9TdHlsZVByb3ZpZGVyPixcbiAgICAgIHNjcmlwdHMsXG4gICAgfTtcbiAgfTtcbn1cbiIsImNvbnN0IF9fV0VCUEFDS19OQU1FU1BBQ0VfT0JKRUNUX18gPSByZXF1aXJlKFwiQGFuYW5zaS9yb3V0ZXJcIik7IiwiY29uc3QgX19XRUJQQUNLX05BTUVTUEFDRV9PQkpFQ1RfXyA9IHJlcXVpcmUoXCJoaXN0b3J5XCIpOyIsImltcG9ydCB7IFJvdXRlLCBSb3V0ZVByb3ZpZGVyLCBSb3V0ZUNvbnRyb2xsZXIgfSBmcm9tICdAYW5hbnNpL3JvdXRlcic7XG5pbXBvcnQgeyBjcmVhdGVNZW1vcnlIaXN0b3J5IH0gZnJvbSAnaGlzdG9yeSc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgdHlwZSB7IENyZWF0ZVJvdXRlciwgU2VydmVyU3BvdXQgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcm91dGVyU3BvdXQ8UmVzb2x2ZVdpdGg+KG9wdGlvbnM6IHtcbiAgcmVzb2x2ZVdpdGg/OiBhbnk7XG4gIHVzZVJlc29sdmVXaXRoOiAoKSA9PiBSZXNvbHZlV2l0aDtcbiAgY3JlYXRlUm91dGVyOiBDcmVhdGVSb3V0ZXI8UmVzb2x2ZVdpdGg+O1xufSk6IFNlcnZlclNwb3V0PFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAge1xuICAgIG1hdGNoZWRSb3V0ZXM6IFJvdXRlPFJlc29sdmVXaXRoPltdO1xuICAgIHNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zO1xuICB9ICYge1xuICAgIHJvdXRlcjogUm91dGVDb250cm9sbGVyPFJvdXRlPFJlc29sdmVXaXRoLCBhbnk+PjtcbiAgfVxuPiB7XG4gIGNvbnN0IGNyZWF0ZVJvdXRlQ29tcG9uZW50ID0gKFxuICAgIHJvdXRlcjogUm91dGVDb250cm9sbGVyPFJvdXRlPFJlc29sdmVXaXRoLCBhbnk+PixcbiAgKSA9PlxuICAgIGZ1bmN0aW9uIFJvdXRlcih7IGNoaWxkcmVuIH06IHsgY2hpbGRyZW46IFJlYWN0LlJlYWN0Tm9kZSB9KSB7XG4gICAgICBjb25zdCByZXNvbHZlV2l0aCA9IG9wdGlvbnMudXNlUmVzb2x2ZVdpdGgoKTtcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPFJvdXRlUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9IHJlc29sdmVXaXRoPXtyZXNvbHZlV2l0aH0+XG4gICAgICAgICAge2NoaWxkcmVufVxuICAgICAgICA8L1JvdXRlUHJvdmlkZXI+XG4gICAgICApO1xuICAgIH07XG5cbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IHVybCA9IHByb3BzLnJlcS51cmwgfHwgJyc7XG4gICAgY29uc3QgcGFydHMgPSB1cmwuc3BsaXQoJz8nLCAyKTtcbiAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHBhcnRzLmxlbmd0aCA8IDIgPyAnJyA6IHBhcnRzWzFdKTtcbiAgICBjb25zdCByb3V0ZXIgPSBvcHRpb25zLmNyZWF0ZVJvdXRlcihcbiAgICAgIGNyZWF0ZU1lbW9yeUhpc3RvcnkoeyBpbml0aWFsRW50cmllczogW3VybF0gfSksXG4gICAgKTtcbiAgICBjb25zdCBtYXRjaGVkUm91dGVzOiBSb3V0ZTxSZXNvbHZlV2l0aD5bXSA9IHJvdXRlci5nZXRNYXRjaGVkUm91dGVzKHVybCk7XG5cbiAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgbWF0Y2hlZFJvdXRlcyxcbiAgICAgIHJvdXRlcixcbiAgICAgIHNlYXJjaFBhcmFtcyxcbiAgICB9KTtcblxuICAgIGNvbnN0IFJvdXRlciA9IGNyZWF0ZVJvdXRlQ29tcG9uZW50KHJvdXRlcik7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLi4ubmV4dFByb3BzLFxuICAgICAgYXBwOiA8Um91dGVyPntuZXh0UHJvcHMuYXBwfTwvUm91dGVyPixcbiAgICAgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaG93IHRvIG9ubHkgaW5qZWN0IGluIG5leHQgYW5kIG5vdCBoYXZlIHRvIGFsc28gcHV0IGhlcmVcbiAgICAgIG1hdGNoZWRSb3V0ZXMsXG4gICAgICByb3V0ZXIsXG4gICAgICBzZWFyY2hQYXJhbXMsXG4gICAgfTtcbiAgfTtcbn1cbiIsImltcG9ydCB7IFJvdXRlIH0gZnJvbSAnQGFuYW5zaS9yb3V0ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFJlc29sdmVQcm9wcywgU2VydmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzLmpzJztcblxudHlwZSBOZWVkZWRQcm9wczxSb3V0ZVdpdGg+ID0ge1xuICBtYXRjaGVkUm91dGVzOiBSb3V0ZTxSb3V0ZVdpdGg+W107XG4gIHNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zO1xufSAmIFJlc29sdmVQcm9wcztcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcHJlZmV0Y2hTcG91dDxGIGV4dGVuZHMgc3RyaW5nPihmaWVsZDogRikge1xuICByZXR1cm4gZnVuY3Rpb24gPFxuICAgIFJvdXRlV2l0aCxcbiAgICBOIGV4dGVuZHMgTmVlZGVkUHJvcHM8Um91dGVXaXRoPixcbiAgICBJIGV4dGVuZHMgU2VydmVyUHJvcHMsXG4gID4oXG4gICAgbmV4dDogKHByb3BzOiBJKSA9PiBQcm9taXNlPFxuICAgICAge1xuICAgICAgICBbSyBpbiBGXTogUm91dGVXaXRoO1xuICAgICAgfSAmIE5cbiAgICA+LFxuICApIHtcbiAgICByZXR1cm4gYXN5bmMgKHByb3BzOiBJKSA9PiB7XG4gICAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdG9GZXRjaDogUHJvbWlzZTx1bmtub3duPltdID0gW107XG4gICAgICAgIG5leHRQcm9wcy5tYXRjaGVkUm91dGVzLmZvckVhY2gocm91dGUgPT4ge1xuICAgICAgICAgIC8vIFByZWxvYWQgbGF6eSBjb21wb25lbnQgc28gaXQncyByZWFkeSBmb3IgU1NSIHJlbmRlclxuICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUuY29tcG9uZW50Py5wcmVsb2FkID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0b0ZldGNoLnB1c2gocm91dGUuY29tcG9uZW50LnByZWxvYWQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0eXBlb2Ygcm91dGUucmVzb2x2ZURhdGEgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRvRmV0Y2gucHVzaChcbiAgICAgICAgICAgICAgcm91dGUucmVzb2x2ZURhdGEoXG4gICAgICAgICAgICAgICAgbmV4dFByb3BzW2ZpZWxkXSxcbiAgICAgICAgICAgICAgICByb3V0ZSxcbiAgICAgICAgICAgICAgICBuZXh0UHJvcHMuc2VhcmNoUGFyYW1zLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBhd2FpdCBQcm9taXNlLmFsbCh0b0ZldGNoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBuZXh0UHJvcHM7XG4gICAgfTtcbiAgfTtcbn1cbiIsImltcG9ydCBSZWFjdCwgeyBTdXNwZW5zZSB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG50eXBlIE5lZWRlZE5leHQgPSB7XG4gIGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj47XG4gIHNjcmlwdHM/OiBSZWFjdC5SZWFjdE5vZGVbXTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIEpTT05TcG91dCh7XG4gIGlkID0gJ2FuYW5zaS1qc29uJyxcbn06IHsgaWQ/OiBzdHJpbmcgfSA9IHt9KTogU2VydmVyU3BvdXQ8XG4gIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgTmVlZGVkTmV4dFxuPiB7XG4gIHJldHVybiBuZXh0ID0+IGFzeW5jIHByb3BzID0+IHtcbiAgICBjb25zdCBuZXh0UHJvcHMgPSBhd2FpdCBuZXh0KHByb3BzKTtcblxuICAgIGNvbnN0IHNjcmlwdHM6IFJlYWN0LlJlYWN0Tm9kZVtdID0gbmV4dFByb3BzLnNjcmlwdHMgPz8gW107XG5cbiAgICBPYmplY3QuZW50cmllcyhuZXh0UHJvcHMuaW5pdERhdGEgPz8ge30pLmZvckVhY2goKFtrZXksIHVzZURhdGFdKSA9PiB7XG4gICAgICBjb25zdCBnbG9iYWxJZCA9IGAke2lkfS4ke2tleX1gO1xuICAgICAgY29uc3QgU2NyaXB0ID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYXRhOiBhbnkgPSB1c2VEYXRhKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KGRhdGEpO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICA8c2NyaXB0XG4gICAgICAgICAgICAgIGlkPXtnbG9iYWxJZH1cbiAgICAgICAgICAgICAgdHlwZT1cImFwcGxpY2F0aW9uL2pzb25cIlxuICAgICAgICAgICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTD17e1xuICAgICAgICAgICAgICAgIF9faHRtbDogZW5jb2RlZCxcbiAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgbm9uY2U9e3Byb3BzLm5vbmNlfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gVE9ETzogVXNlIHVuaWZpZWQgbG9nZ2luZ1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYEVycm9yIHNlcmlhbGl6aW5nIGpzb24gZm9yICR7a2V5fWApO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICBzY3JpcHRzLnB1c2goXG4gICAgICAgIDxTdXNwZW5zZSBrZXk9e2dsb2JhbElkfT5cbiAgICAgICAgICA8U2NyaXB0IC8+XG4gICAgICAgIDwvU3VzcGVuc2U+LFxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi5uZXh0UHJvcHMsXG4gICAgICBzY3JpcHRzLFxuICAgIH07XG4gIH07XG59XG4iLCJpbXBvcnQgdHlwZSB7IEpTWCB9IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgU2VydmVyUHJvcHMgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuY29uc3QgYXBwU3BvdXQgPVxuICAoYXBwOiBKU1guRWxlbWVudCkgPT5cbiAgPFAgZXh0ZW5kcyBTZXJ2ZXJQcm9wcz4ocHJvcHM6IFApID0+XG4gICAgUHJvbWlzZS5yZXNvbHZlKHsgLi4ucHJvcHMsIGFwcCB9KTtcblxuZXhwb3J0IGRlZmF1bHQgYXBwU3BvdXQ7XG4iLCJpbXBvcnQgeyBjcmVhdGVDb250ZXh0LCB1c2VDb250ZXh0IH0gZnJvbSAncmVhY3QnO1xuXG5leHBvcnQgaW50ZXJmYWNlIE5hdmlnYXRvclByb3BlcnRpZXMge1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBsYW5ndWFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgY29uc3QgTmF2aWdhdG9yQ29udGV4dCA9IGNyZWF0ZUNvbnRleHQ8TmF2aWdhdG9yUHJvcGVydGllcyB8IHVuZGVmaW5lZD4oXG4gIHVuZGVmaW5lZCxcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VOYXZpZ2F0b3IoKTogTmF2aWdhdG9yUHJvcGVydGllcyB7XG4gIGNvbnN0IGNvbnRleHQgPSB1c2VDb250ZXh0KE5hdmlnYXRvckNvbnRleHQpO1xuICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VOYXZpZ2F0b3IgbXVzdCBiZSB1c2VkIHdpdGhpbiBhIE5hdmlnYXRvclByb3ZpZGVyJyk7XG4gIH1cbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUFjY2VwdExhbmd1YWdlKGhlYWRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKToge1xuICBsYW5ndWFnZTogc3RyaW5nO1xuICBsYW5ndWFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdO1xufSB7XG4gIGlmICghaGVhZGVyKSB7XG4gICAgcmV0dXJuIHsgbGFuZ3VhZ2U6ICdlbicsIGxhbmd1YWdlczogWydlbiddIH07XG4gIH1cblxuICBjb25zdCBwYXJzZWQgPSBoZWFkZXJcbiAgICAuc3BsaXQoJywnKVxuICAgIC5tYXAocGFydCA9PiB7XG4gICAgICBjb25zdCBbbGFuZywgcVBhcnRdID0gcGFydC50cmltKCkuc3BsaXQoJzsnKTtcbiAgICAgIGNvbnN0IHEgPSBxUGFydCA/IHBhcnNlRmxvYXQocVBhcnQucmVwbGFjZSgncT0nLCAnJykpIDogMTtcbiAgICAgIHJldHVybiB7IGxhbmc6IGxhbmcudHJpbSgpLCBxIH07XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5xIC0gYS5xKVxuICAgIC5tYXAoKHsgbGFuZyB9KSA9PiBsYW5nKTtcblxuICByZXR1cm4ge1xuICAgIGxhbmd1YWdlOiBwYXJzZWRbMF0gPz8gJ2VuJyxcbiAgICBsYW5ndWFnZXM6IHBhcnNlZC5sZW5ndGggPiAwID8gcGFyc2VkIDogWydlbiddLFxuICB9O1xufVxuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcblxuaW1wb3J0IHsgTmF2aWdhdG9yQ29udGV4dCwgcGFyc2VBY2NlcHRMYW5ndWFnZSB9IGZyb20gJy4vbmF2aWdhdG9yLmNvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTZXJ2ZXJTcG91dCB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG50eXBlIE5lZWRlZE5leHQgPSB7XG4gIGluaXREYXRhPzogUmVjb3JkPHN0cmluZywgKCkgPT4gdW5rbm93bj47XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBuYXZpZ2F0b3JTcG91dCgpOiBTZXJ2ZXJTcG91dDxcbiAgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHsgbGFuZ3VhZ2U6IHN0cmluZzsgbGFuZ3VhZ2VzOiByZWFkb25seSBzdHJpbmdbXSB9LFxuICBOZWVkZWROZXh0XG4+IHtcbiAgcmV0dXJuIG5leHQgPT4gYXN5bmMgcHJvcHMgPT4ge1xuICAgIGNvbnN0IGFjY2VwdExhbmd1YWdlID0gcHJvcHMucmVxLmhlYWRlcnNbJ2FjY2VwdC1sYW5ndWFnZSddO1xuICAgIGNvbnN0IGhlYWRlciA9XG4gICAgICB0eXBlb2YgYWNjZXB0TGFuZ3VhZ2UgPT09ICdzdHJpbmcnID8gYWNjZXB0TGFuZ3VhZ2UgOiBhY2NlcHRMYW5ndWFnZT8uWzBdO1xuICAgIGNvbnN0IG5hdmlnYXRvclByb3BzID0gcGFyc2VBY2NlcHRMYW5ndWFnZShoZWFkZXIpO1xuXG4gICAgY29uc3QgbmV4dFByb3BzID0gYXdhaXQgbmV4dCh7XG4gICAgICAuLi5wcm9wcyxcbiAgICAgIC4uLm5hdmlnYXRvclByb3BzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLm5leHRQcm9wcyxcbiAgICAgIC4uLm5hdmlnYXRvclByb3BzLFxuICAgICAgaW5pdERhdGE6IHtcbiAgICAgICAgLi4ubmV4dFByb3BzLmluaXREYXRhLFxuICAgICAgICBuYXZpZ2F0b3I6ICgpID0+IG5hdmlnYXRvclByb3BzLFxuICAgICAgfSxcbiAgICAgIGFwcDogKFxuICAgICAgICA8TmF2aWdhdG9yQ29udGV4dCB2YWx1ZT17bmF2aWdhdG9yUHJvcHN9PlxuICAgICAgICAgIHtuZXh0UHJvcHMuYXBwfVxuICAgICAgICA8L05hdmlnYXRvckNvbnRleHQ+XG4gICAgICApLFxuICAgIH07XG4gIH07XG59XG4iLCJleHBvcnQgeyBkZWZhdWx0IGFzIGxheVNwb3V0cyB9IGZyb20gJy4vbGF5U3BvdXRzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgZG9jdW1lbnRTcG91dCB9IGZyb20gJy4vc3BvdXRzL2RvY3VtZW50LnNlcnZlci5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIGRhdGFDbGllbnRTcG91dCB9IGZyb20gJy4vc3BvdXRzL2RhdGFDbGllbnQuc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgYW50ZFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvYW50ZC5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyByb3V0ZXJTcG91dCB9IGZyb20gJy4vc3BvdXRzL3JvdXRlci5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwcmVmZXRjaFNwb3V0IH0gZnJvbSAnLi9zcG91dHMvcHJlZmV0Y2guc2VydmVyLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSlNPTlNwb3V0IH0gZnJvbSAnLi9zcG91dHMvanNvbi5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBhcHBTcG91dCB9IGZyb20gJy4vc3BvdXRzL2FwcC5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBuYXZpZ2F0b3JTcG91dCB9IGZyb20gJy4vc3BvdXRzL25hdmlnYXRvci5zZXJ2ZXIuanMnO1xuZXhwb3J0IHsgdXNlTmF2aWdhdG9yIH0gZnJvbSAnLi9zcG91dHMvbmF2aWdhdG9yLmNvbnRleHQuanMnO1xuZXhwb3J0IHR5cGUgeyBOYXZpZ2F0b3JQcm9wZXJ0aWVzIH0gZnJvbSAnLi9zcG91dHMvbmF2aWdhdG9yLmNvbnRleHQuanMnO1xuZXhwb3J0IHR5cGUgeyBTZXJ2ZXJQcm9wcyB9IGZyb20gJy4vc3BvdXRzL3R5cGVzLmpzJztcbmV4cG9ydCB0eXBlIHsgU2VydmVyU3BvdXQgYXMgU3BvdXQgfSBmcm9tICcuL3Nwb3V0cy90eXBlcy5qcyc7XG5leHBvcnQgKiBmcm9tICcuL3NjcmlwdHMvdHlwZXMuanMnO1xuIl0sIm5hbWVzIjpbImdldEVycm9yU3RhdHVzIiwiZXJyb3IiLCJzdGF0dXMiLCJwYXJzZWQiLCJwYXJzZUludCIsImlzTmFOIiwiZXNjYXBlSHRtbCIsInN0ciIsInJlcGxhY2UiLCJyZW5kZXJFcnJvclBhZ2UiLCJ1cmwiLCJzdGF0dXNDb2RlIiwib3B0aW9ucyIsImVycm9yTWVzc2FnZSIsIkVycm9yIiwibWVzc2FnZSIsIlN0cmluZyIsInN0YWNrIiwidW5kZWZpbmVkIiwic2hvd1N0YWNrIiwiaGludCIsImJhZGdlIiwiY3J5cHRvIiwicmVuZGVyVG9QaXBlYWJsZVN0cmVhbSIsInJlYWN0UmVuZGVyIiwibGF5U3BvdXRzIiwic3BvdXRzIiwidGltZW91dE1TIiwib25FcnJvciIsInJlbmRlciIsImNsaWVudE1hbmlmZXN0IiwicmVxIiwicmVzIiwibm9uY2UiLCJyYW5kb21CeXRlcyIsInRvU3RyaW5nIiwiYXBwIiwiZGlkRXJyb3IiLCJsYXN0RXJyb3IiLCJwaXBlIiwiYWJvcnQiLCJvblNoZWxsUmVhZHkiLCJzZXRIZWFkZXIiLCJvblNoZWxsRXJyb3IiLCJlIiwiY29uc29sZSIsInNldFRpbWVvdXQiLCJidWlsZFBvbGljeSIsInBvbGljeU9iaiIsIk9iamVjdCIsImtleXMiLCJtYXAiLCJrZXkiLCJ2YWwiLCJBcnJheSIsImlzQXJyYXkiLCJTZXQiLCJ2YWx1ZXMiLCJmaWx0ZXIiLCJ2Iiwiam9pbiIsImluY2x1ZGVzIiwibmV3VmFsIiwidHJpbSIsImpvaW5Ob25jZSIsInBvbGljeSIsIkRvY3VtZW50IiwiYXNzZXRzIiwiaGVhZCIsImRlZmF1bHRIZWFkIiwiY2hpbGRyZW4iLCJ0aXRsZSIsInJvb3RJZCIsImNoYXJTZXQiLCJzY3JpcHRzIiwiZXh0cmFTdHlsZSIsImxhbmciLCJfanN4cyIsIl9qc3giLCJhc3NldCIsImkiLCJyZWwiLCJpZCIsImhyZWYiLCJlbmRzV2l0aCIsInNyYyIsImFzeW5jIiwiX0ZyYWdtZW50IiwibmFtZSIsImNvbnRlbnQiLCJwcm9jZXNzIiwiZW52IiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsIlJlYWN0IiwianN4IiwiRG9jdW1lbnRTcG91dCIsIm5leHQiLCJwcm9wcyIsIm5leHRQcm9wcyIsInB1YmxpY1BhdGgiLCJlbnRyeXBvaW50cyIsImxlbmd0aCIsImFzc2V0TWFwIiwiYXNzZXRMaXN0IiwiZm9yRWFjaCIsImVudHJ5cG9pbnQiLCJwdXNoIiwibmFtZWRDaHVua0dyb3VwcyIsIm1hdGNoZWRSb3V0ZXMiLCJzb21lIiwicm91dGUiLCJmbGF0TWFwIiwiY2h1bmsiLCJjaGlsZHJlbkFzc2V0cyIsImFzIiwiY3NQb2xpY3kiLCJodHRwRXF1aXYiLCJOT0RFX0VOViIsInByZWxvYWQiLCJjIiwiZGF0YUNsaWVudFNwb3V0IiwibWFuYWdlcnMiLCJnZXRNYW5hZ2VycyIsIk5ldHdvcmtNYW5hZ2VyIiwiY3JlYXRlUGVyc2lzdGVkU3RvcmUiLCJTZXJ2ZXJEYXRhUHJvdmlkZXIiLCJ1c2VSZWFkeUNhY2hlU3RhdGUiLCJjb250cm9sbGVyIiwic3RvcmUiLCJpbml0RGF0YSIsImRhdGFjbGllbnQiLCJhbnRkU3BvdXQiLCJjcmVhdGVDYWNoZSIsImV4dHJhY3RTdHlsZSIsIlN0eWxlUHJvdmlkZXIiLCJjYWNoZSIsIkFudGRTaGVldHMiLCJkYW5nZXJvdXNseVNldElubmVySFRNTCIsIl9faHRtbCIsIlJvdXRlUHJvdmlkZXIiLCJjcmVhdGVNZW1vcnlIaXN0b3J5Iiwicm91dGVyU3BvdXQiLCJjcmVhdGVSb3V0ZUNvbXBvbmVudCIsInJvdXRlciIsIlJvdXRlciIsInJlc29sdmVXaXRoIiwidXNlUmVzb2x2ZVdpdGgiLCJwYXJ0cyIsInNwbGl0Iiwic2VhcmNoUGFyYW1zIiwiVVJMU2VhcmNoUGFyYW1zIiwiY3JlYXRlUm91dGVyIiwiaW5pdGlhbEVudHJpZXMiLCJnZXRNYXRjaGVkUm91dGVzIiwicHJlZmV0Y2hTcG91dCIsImZpZWxkIiwidG9GZXRjaCIsImNvbXBvbmVudCIsInJlc29sdmVEYXRhIiwiUHJvbWlzZSIsImFsbCIsIlN1c3BlbnNlIiwiSlNPTlNwb3V0IiwiZW50cmllcyIsInVzZURhdGEiLCJnbG9iYWxJZCIsIlNjcmlwdCIsImRhdGEiLCJlbmNvZGVkIiwiSlNPTiIsInN0cmluZ2lmeSIsInR5cGUiLCJhcHBTcG91dCIsInJlc29sdmUiLCJjcmVhdGVDb250ZXh0IiwidXNlQ29udGV4dCIsIk5hdmlnYXRvckNvbnRleHQiLCJ1c2VOYXZpZ2F0b3IiLCJjb250ZXh0IiwicGFyc2VBY2NlcHRMYW5ndWFnZSIsImhlYWRlciIsImxhbmd1YWdlIiwibGFuZ3VhZ2VzIiwicGFydCIsInFQYXJ0IiwicSIsInBhcnNlRmxvYXQiLCJzb3J0IiwiYSIsImIiLCJuYXZpZ2F0b3JTcG91dCIsImFjY2VwdExhbmd1YWdlIiwiaGVhZGVycyIsIm5hdmlnYXRvclByb3BzIiwibmF2aWdhdG9yIiwidmFsdWUiLCJkZWZhdWx0IiwiZG9jdW1lbnRTcG91dCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9
@@ -1 +1 @@
1
- {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EACE,SAAiB,EACjB,OAAO,GACR,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,UA4CnE"}
1
+ {"version":3,"file":"laySpouts.d.ts","sourceRoot":"","sources":["../src/laySpouts.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,OAAO,UAAU,SAAS,CAC/B,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,OAAO,CAAC;IACtC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;CAClB,CAAC,EACF,EACE,SAAiB,EACjB,OAAO,GACR,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CAAO,UA+CnE"}
package/lib/laySpouts.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import crypto from 'crypto';
2
2
  import { renderToPipeableStream as reactRender } from 'react-dom/server';
3
+ import { getErrorStatus } from './scripts/ssrErrorHandler.js';
3
4
  export default function laySpouts(spouts, {
4
5
  timeoutMS = 10000,
5
6
  onError
@@ -16,6 +17,7 @@ export default function laySpouts(spouts, {
16
17
  nonce
17
18
  });
18
19
  let didError = false;
20
+ let lastError;
19
21
  const {
20
22
  pipe,
21
23
  abort
@@ -25,19 +27,21 @@ export default function laySpouts(spouts, {
25
27
  onShellReady() {
26
28
  //managers.forEach(manager => manager.cleanup());
27
29
  // If something errored before we started streaming, we set the error code appropriately.
28
- res.statusCode = didError ? 500 : 200;
30
+ res.statusCode = didError ? getErrorStatus(lastError) : 200;
29
31
  res.setHeader('Content-type', 'text/html');
30
32
  pipe(res);
31
33
  },
32
- onShellError() {
34
+ onShellError(e) {
33
35
  didError = true;
34
- res.statusCode = 500;
36
+ lastError = e;
37
+ res.statusCode = getErrorStatus(e);
35
38
  pipe(res);
36
39
  },
37
40
  onError(e) {
38
41
  didError = true;
42
+ lastError = e;
39
43
  console.error(e);
40
- res.statusCode = 500;
44
+ res.statusCode = getErrorStatus(e);
41
45
  //pipe(res); Removing this avoids, "React currently only supports piping to one writable stream."
42
46
  if (onError) onError(e);
43
47
  }
@@ -52,4 +56,4 @@ export default function laySpouts(spouts, {
52
56
  };
53
57
  return render;
54
58
  }
55
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsIm9uU2hlbGxSZWFkeSIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJvblNoZWxsRXJyb3IiLCJlIiwiY29uc29sZSIsImVycm9yIiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sYXlTcG91dHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFJlbmRlciB9IGZyb20gJy4vc2NyaXB0cy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHtcbiAgICB0aW1lb3V0TVMgPSAxMDAwMCxcbiAgICBvbkVycm9yLFxuICB9OiB7IHRpbWVvdXRNUz86IG51bWJlcjsgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKHsgY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzLCBub25jZSB9KTtcblxuICAgICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgICBjb25zdCB7IHBpcGUsIGFib3J0IH0gPSByZWFjdFJlbmRlcihhcHAsIHtcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIC8vYm9vdHN0cmFwU2NyaXB0czogYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgICBvblNoZWxsUmVhZHkoKSB7XG4gICAgICAgICAgLy9tYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIGJlZm9yZSB3ZSBzdGFydGVkIHN0cmVhbWluZywgd2Ugc2V0IHRoZSBlcnJvciBjb2RlIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBkaWRFcnJvciA/IDUwMCA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcihlOiBhbnkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICAvL3BpcGUocmVzKTsgUmVtb3ZpbmcgdGhpcyBhdm9pZHMsIFwiUmVhY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGlwaW5nIHRvIG9uZSB3cml0YWJsZSBzdHJlYW0uXCJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgICAgLy8gVHJ5IGxvd2VyaW5nIHRoaXMgdG8gc2VlIHRoZSBjbGllbnQgcmVjb3Zlci5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IChhYm9ydCBhcyBhbnkpKGBUaW1lb3V0IG9mICR7dGltZW91dE1TfW1zIGV4Y2VlZGVkYCksXG4gICAgICAgIHRpbWVvdXRNUyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFFM0IsU0FBU0Msc0JBQXNCLElBQUlDLFdBQVcsUUFBUSxrQkFBa0I7QUFLeEUsZUFBZSxTQUFTQyxTQUFTQSxDQUMvQkMsTUFFRSxFQUNGO0VBQ0VDLFNBQVMsR0FBRyxLQUFLO0VBQ2pCQztBQUMwRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2xFO0VBQ0EsTUFBTUMsTUFBYyxHQUFHLE1BQUFBLENBQU9DLGNBQWMsRUFBRUMsR0FBRyxFQUFFQyxHQUFHLEtBQUs7SUFDekQsTUFBTUMsS0FBSyxHQUFHWCxNQUFNLENBQUNZLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUV2RCxJQUFJO01BQ0YsTUFBTTtRQUFFQztNQUFJLENBQUMsR0FBRyxNQUFNVixNQUFNLENBQUM7UUFBRUksY0FBYztRQUFFQyxHQUFHO1FBQUVDLEdBQUc7UUFBRUM7TUFBTSxDQUFDLENBQUM7TUFFakUsSUFBSUksUUFBUSxHQUFHLEtBQUs7TUFDcEIsTUFBTTtRQUFFQyxJQUFJO1FBQUVDO01BQU0sQ0FBQyxHQUFHZixXQUFXLENBQUNZLEdBQUcsRUFBRTtRQUN2Q0gsS0FBSztRQUNMO1FBQ0FPLFlBQVlBLENBQUEsRUFBRztVQUNiO1VBQ0E7VUFDQVIsR0FBRyxDQUFDUyxVQUFVLEdBQUdKLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRztVQUNyQ0wsR0FBRyxDQUFDVSxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUMxQ0osSUFBSSxDQUFDTixHQUFHLENBQUM7UUFDWCxDQUFDO1FBQ0RXLFlBQVlBLENBQUEsRUFBRztVQUNiTixRQUFRLEdBQUcsSUFBSTtVQUNmTCxHQUFHLENBQUNTLFVBQVUsR0FBRyxHQUFHO1VBQ3BCSCxJQUFJLENBQUNOLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDREosT0FBT0EsQ0FBQ2dCLENBQU0sRUFBRTtVQUNkUCxRQUFRLEdBQUcsSUFBSTtVQUNmUSxPQUFPLENBQUNDLEtBQUssQ0FBQ0YsQ0FBQyxDQUFDO1VBQ2hCWixHQUFHLENBQUNTLFVBQVUsR0FBRyxHQUFHO1VBQ3BCO1VBQ0EsSUFBSWIsT0FBTyxFQUFFQSxPQUFPLENBQUNnQixDQUFDLENBQUM7UUFDekI7TUFDRixDQUFDLENBQUM7TUFDRjtNQUNBO01BQ0FHLFVBQVUsQ0FDUixNQUFPUixLQUFLLENBQVMsY0FBY1osU0FBUyxhQUFhLENBQUMsRUFDMURBLFNBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPaUIsQ0FBVSxFQUFFO01BQ25CLElBQUloQixPQUFPLEVBQUVBLE9BQU8sQ0FBQ2dCLENBQUMsQ0FBQztNQUN2QixNQUFNQSxDQUFDO0lBQ1Q7RUFDRixDQUFDO0VBQ0QsT0FBT2YsTUFBTTtBQUNmIiwiaWdub3JlTGlzdCI6W119
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJnZXRFcnJvclN0YXR1cyIsImxheVNwb3V0cyIsInNwb3V0cyIsInRpbWVvdXRNUyIsIm9uRXJyb3IiLCJyZW5kZXIiLCJjbGllbnRNYW5pZmVzdCIsInJlcSIsInJlcyIsIm5vbmNlIiwicmFuZG9tQnl0ZXMiLCJ0b1N0cmluZyIsImFwcCIsImRpZEVycm9yIiwibGFzdEVycm9yIiwicGlwZSIsImFib3J0Iiwib25TaGVsbFJlYWR5Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsIm9uU2hlbGxFcnJvciIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vc3JjL2xheVNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXJUb1BpcGVhYmxlU3RyZWFtIGFzIHJlYWN0UmVuZGVyIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5cbmltcG9ydCB7IGdldEVycm9yU3RhdHVzIH0gZnJvbSAnLi9zY3JpcHRzL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlciB9IGZyb20gJy4vc2NyaXB0cy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHtcbiAgICB0aW1lb3V0TVMgPSAxMDAwMCxcbiAgICBvbkVycm9yLFxuICB9OiB7IHRpbWVvdXRNUz86IG51bWJlcjsgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKHsgY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzLCBub25jZSB9KTtcblxuICAgICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICAgICAgY29uc3QgeyBwaXBlLCBhYm9ydCB9ID0gcmVhY3RSZW5kZXIoYXBwLCB7XG4gICAgICAgIG5vbmNlLFxuICAgICAgICAvL2Jvb3RzdHJhcFNjcmlwdHM6IGFzc2V0cy5maWx0ZXIoYXNzZXQgPT4gYXNzZXQuZW5kc1dpdGgoJy5qcycpKSxcbiAgICAgICAgb25TaGVsbFJlYWR5KCkge1xuICAgICAgICAgIC8vbWFuYWdlcnMuZm9yRWFjaChtYW5hZ2VyID0+IG1hbmFnZXIuY2xlYW51cCgpKTtcbiAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBiZWZvcmUgd2Ugc3RhcnRlZCBzdHJlYW1pbmcsIHdlIHNldCB0aGUgZXJyb3IgY29kZSBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZGlkRXJyb3IgPyBnZXRFcnJvclN0YXR1cyhsYXN0RXJyb3IpIDogMjAwO1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hlbGxFcnJvcihlOiB1bmtub3duKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBnZXRFcnJvclN0YXR1cyhlKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IoZTogdW5rbm93bikge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBnZXRFcnJvclN0YXR1cyhlKTtcbiAgICAgICAgICAvL3BpcGUocmVzKTsgUmVtb3ZpbmcgdGhpcyBhdm9pZHMsIFwiUmVhY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGlwaW5nIHRvIG9uZSB3cml0YWJsZSBzdHJlYW0uXCJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgICAgLy8gVHJ5IGxvd2VyaW5nIHRoaXMgdG8gc2VlIHRoZSBjbGllbnQgcmVjb3Zlci5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IChhYm9ydCBhcyBhbnkpKGBUaW1lb3V0IG9mICR7dGltZW91dE1TfW1zIGV4Y2VlZGVkYCksXG4gICAgICAgIHRpbWVvdXRNUyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFFM0IsU0FBU0Msc0JBQXNCLElBQUlDLFdBQVcsUUFBUSxrQkFBa0I7QUFFeEUsU0FBU0MsY0FBYyxRQUFRLDhCQUE4QjtBQUk3RCxlQUFlLFNBQVNDLFNBQVNBLENBQy9CQyxNQUVFLEVBQ0Y7RUFDRUMsU0FBUyxHQUFHLEtBQUs7RUFDakJDO0FBQzBELENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEU7RUFDQSxNQUFNQyxNQUFjLEdBQUcsTUFBQUEsQ0FBT0MsY0FBYyxFQUFFQyxHQUFHLEVBQUVDLEdBQUcsS0FBSztJQUN6RCxNQUFNQyxLQUFLLEdBQUdaLE1BQU0sQ0FBQ2EsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBRXZELElBQUk7TUFDRixNQUFNO1FBQUVDO01BQUksQ0FBQyxHQUFHLE1BQU1WLE1BQU0sQ0FBQztRQUFFSSxjQUFjO1FBQUVDLEdBQUc7UUFBRUMsR0FBRztRQUFFQztNQUFNLENBQUMsQ0FBQztNQUVqRSxJQUFJSSxRQUFRLEdBQUcsS0FBSztNQUNwQixJQUFJQyxTQUFrQjtNQUN0QixNQUFNO1FBQUVDLElBQUk7UUFBRUM7TUFBTSxDQUFDLEdBQUdqQixXQUFXLENBQUNhLEdBQUcsRUFBRTtRQUN2Q0gsS0FBSztRQUNMO1FBQ0FRLFlBQVlBLENBQUEsRUFBRztVQUNiO1VBQ0E7VUFDQVQsR0FBRyxDQUFDVSxVQUFVLEdBQUdMLFFBQVEsR0FBR2IsY0FBYyxDQUFDYyxTQUFTLENBQUMsR0FBRyxHQUFHO1VBQzNETixHQUFHLENBQUNXLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO1VBQzFDSixJQUFJLENBQUNQLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDRFksWUFBWUEsQ0FBQ0MsQ0FBVSxFQUFFO1VBQ3ZCUixRQUFRLEdBQUcsSUFBSTtVQUNmQyxTQUFTLEdBQUdPLENBQUM7VUFDYmIsR0FBRyxDQUFDVSxVQUFVLEdBQUdsQixjQUFjLENBQUNxQixDQUFDLENBQUM7VUFDbENOLElBQUksQ0FBQ1AsR0FBRyxDQUFDO1FBQ1gsQ0FBQztRQUNESixPQUFPQSxDQUFDaUIsQ0FBVSxFQUFFO1VBQ2xCUixRQUFRLEdBQUcsSUFBSTtVQUNmQyxTQUFTLEdBQUdPLENBQUM7VUFDYkMsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQmIsR0FBRyxDQUFDVSxVQUFVLEdBQUdsQixjQUFjLENBQUNxQixDQUFDLENBQUM7VUFDbEM7VUFDQSxJQUFJakIsT0FBTyxFQUFFQSxPQUFPLENBQUNpQixDQUFDLENBQUM7UUFDekI7TUFDRixDQUFDLENBQUM7TUFDRjtNQUNBO01BQ0FHLFVBQVUsQ0FDUixNQUFPUixLQUFLLENBQVMsY0FBY2IsU0FBUyxhQUFhLENBQUMsRUFDMURBLFNBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPa0IsQ0FBVSxFQUFFO01BQ25CLElBQUlqQixPQUFPLEVBQUVBLE9BQU8sQ0FBQ2lCLENBQUMsQ0FBQztNQUN2QixNQUFNQSxDQUFDO0lBQ1Q7RUFDRixDQUFDO0VBQ0QsT0FBT2hCLE1BQU07QUFDZiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -1,5 +1,6 @@
1
1
  import crypto from 'crypto';
2
2
  import { renderToPipeableStream as reactRender } from 'react-dom/server';
3
+ import { getErrorStatus } from './scripts/ssrErrorHandler.js';
3
4
  export default function laySpouts(spouts, {
4
5
  timeoutMS = 10000,
5
6
  onError
@@ -16,6 +17,7 @@ export default function laySpouts(spouts, {
16
17
  nonce
17
18
  });
18
19
  let didError = false;
20
+ let lastError;
19
21
  const {
20
22
  pipe,
21
23
  abort
@@ -25,19 +27,21 @@ export default function laySpouts(spouts, {
25
27
  onShellReady() {
26
28
  //managers.forEach(manager => manager.cleanup());
27
29
  // If something errored before we started streaming, we set the error code appropriately.
28
- res.statusCode = didError ? 500 : 200;
30
+ res.statusCode = didError ? getErrorStatus(lastError) : 200;
29
31
  res.setHeader('Content-type', 'text/html');
30
32
  pipe(res);
31
33
  },
32
- onShellError() {
34
+ onShellError(e) {
33
35
  didError = true;
34
- res.statusCode = 500;
36
+ lastError = e;
37
+ res.statusCode = getErrorStatus(e);
35
38
  pipe(res);
36
39
  },
37
40
  onError(e) {
38
41
  didError = true;
42
+ lastError = e;
39
43
  console.error(e);
40
- res.statusCode = 500;
44
+ res.statusCode = getErrorStatus(e);
41
45
  //pipe(res); Removing this avoids, "React currently only supports piping to one writable stream."
42
46
  if (onError) onError(e);
43
47
  }
@@ -52,4 +56,4 @@ export default function laySpouts(spouts, {
52
56
  };
53
57
  return render;
54
58
  }
55
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJsYXlTcG91dHMiLCJzcG91dHMiLCJ0aW1lb3V0TVMiLCJvbkVycm9yIiwicmVuZGVyIiwiY2xpZW50TWFuaWZlc3QiLCJyZXEiLCJyZXMiLCJub25jZSIsInJhbmRvbUJ5dGVzIiwidG9TdHJpbmciLCJhcHAiLCJkaWRFcnJvciIsInBpcGUiLCJhYm9ydCIsIm9uU2hlbGxSZWFkeSIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJvblNoZWxsRXJyb3IiLCJlIiwiY29uc29sZSIsImVycm9yIiwic2V0VGltZW91dCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXlTcG91dHMudHN4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJztcbmltcG9ydCB0eXBlIHsgSlNYIH0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgcmVuZGVyVG9QaXBlYWJsZVN0cmVhbSBhcyByZWFjdFJlbmRlciB9IGZyb20gJ3JlYWN0LWRvbS9zZXJ2ZXInO1xuXG5pbXBvcnQgdHlwZSB7IFJlbmRlciB9IGZyb20gJy4vc2NyaXB0cy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHtcbiAgICB0aW1lb3V0TVMgPSAxMDAwMCxcbiAgICBvbkVycm9yLFxuICB9OiB7IHRpbWVvdXRNUz86IG51bWJlcjsgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKHsgY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzLCBub25jZSB9KTtcblxuICAgICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgICBjb25zdCB7IHBpcGUsIGFib3J0IH0gPSByZWFjdFJlbmRlcihhcHAsIHtcbiAgICAgICAgbm9uY2UsXG4gICAgICAgIC8vYm9vdHN0cmFwU2NyaXB0czogYXNzZXRzLmZpbHRlcihhc3NldCA9PiBhc3NldC5lbmRzV2l0aCgnLmpzJykpLFxuICAgICAgICBvblNoZWxsUmVhZHkoKSB7XG4gICAgICAgICAgLy9tYW5hZ2Vycy5mb3JFYWNoKG1hbmFnZXIgPT4gbWFuYWdlci5jbGVhbnVwKCkpO1xuICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBlcnJvcmVkIGJlZm9yZSB3ZSBzdGFydGVkIHN0cmVhbWluZywgd2Ugc2V0IHRoZSBlcnJvciBjb2RlIGFwcHJvcHJpYXRlbHkuXG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBkaWRFcnJvciA/IDUwMCA6IDIwMDtcbiAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LXR5cGUnLCAndGV4dC9odG1sJyk7XG4gICAgICAgICAgcGlwZShyZXMpO1xuICAgICAgICB9LFxuICAgICAgICBvblNoZWxsRXJyb3IoKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gNTAwO1xuICAgICAgICAgIHBpcGUocmVzKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcihlOiBhbnkpIHtcbiAgICAgICAgICBkaWRFcnJvciA9IHRydWU7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDUwMDtcbiAgICAgICAgICAvL3BpcGUocmVzKTsgUmVtb3ZpbmcgdGhpcyBhdm9pZHMsIFwiUmVhY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGlwaW5nIHRvIG9uZSB3cml0YWJsZSBzdHJlYW0uXCJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgICAgLy8gVHJ5IGxvd2VyaW5nIHRoaXMgdG8gc2VlIHRoZSBjbGllbnQgcmVjb3Zlci5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IChhYm9ydCBhcyBhbnkpKGBUaW1lb3V0IG9mICR7dGltZW91dE1TfW1zIGV4Y2VlZGVkYCksXG4gICAgICAgIHRpbWVvdXRNUyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFFM0IsU0FBU0Msc0JBQXNCLElBQUlDLFdBQVcsUUFBUSxrQkFBa0I7QUFLeEUsZUFBZSxTQUFTQyxTQUFTQSxDQUMvQkMsTUFFRSxFQUNGO0VBQ0VDLFNBQVMsR0FBRyxLQUFLO0VBQ2pCQztBQUMwRCxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQ2xFO0VBQ0EsTUFBTUMsTUFBYyxHQUFHLE1BQUFBLENBQU9DLGNBQWMsRUFBRUMsR0FBRyxFQUFFQyxHQUFHLEtBQUs7SUFDekQsTUFBTUMsS0FBSyxHQUFHWCxNQUFNLENBQUNZLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQ0MsUUFBUSxDQUFDLFFBQVEsQ0FBQztJQUV2RCxJQUFJO01BQ0YsTUFBTTtRQUFFQztNQUFJLENBQUMsR0FBRyxNQUFNVixNQUFNLENBQUM7UUFBRUksY0FBYztRQUFFQyxHQUFHO1FBQUVDLEdBQUc7UUFBRUM7TUFBTSxDQUFDLENBQUM7TUFFakUsSUFBSUksUUFBUSxHQUFHLEtBQUs7TUFDcEIsTUFBTTtRQUFFQyxJQUFJO1FBQUVDO01BQU0sQ0FBQyxHQUFHZixXQUFXLENBQUNZLEdBQUcsRUFBRTtRQUN2Q0gsS0FBSztRQUNMO1FBQ0FPLFlBQVlBLENBQUEsRUFBRztVQUNiO1VBQ0E7VUFDQVIsR0FBRyxDQUFDUyxVQUFVLEdBQUdKLFFBQVEsR0FBRyxHQUFHLEdBQUcsR0FBRztVQUNyQ0wsR0FBRyxDQUFDVSxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUMxQ0osSUFBSSxDQUFDTixHQUFHLENBQUM7UUFDWCxDQUFDO1FBQ0RXLFlBQVlBLENBQUEsRUFBRztVQUNiTixRQUFRLEdBQUcsSUFBSTtVQUNmTCxHQUFHLENBQUNTLFVBQVUsR0FBRyxHQUFHO1VBQ3BCSCxJQUFJLENBQUNOLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDREosT0FBT0EsQ0FBQ2dCLENBQU0sRUFBRTtVQUNkUCxRQUFRLEdBQUcsSUFBSTtVQUNmUSxPQUFPLENBQUNDLEtBQUssQ0FBQ0YsQ0FBQyxDQUFDO1VBQ2hCWixHQUFHLENBQUNTLFVBQVUsR0FBRyxHQUFHO1VBQ3BCO1VBQ0EsSUFBSWIsT0FBTyxFQUFFQSxPQUFPLENBQUNnQixDQUFDLENBQUM7UUFDekI7TUFDRixDQUFDLENBQUM7TUFDRjtNQUNBO01BQ0FHLFVBQVUsQ0FDUixNQUFPUixLQUFLLENBQVMsY0FBY1osU0FBUyxhQUFhLENBQUMsRUFDMURBLFNBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPaUIsQ0FBVSxFQUFFO01BQ25CLElBQUloQixPQUFPLEVBQUVBLE9BQU8sQ0FBQ2dCLENBQUMsQ0FBQztNQUN2QixNQUFNQSxDQUFDO0lBQ1Q7RUFDRixDQUFDO0VBQ0QsT0FBT2YsTUFBTTtBQUNmIiwiaWdub3JlTGlzdCI6W119
59
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcnlwdG8iLCJyZW5kZXJUb1BpcGVhYmxlU3RyZWFtIiwicmVhY3RSZW5kZXIiLCJnZXRFcnJvclN0YXR1cyIsImxheVNwb3V0cyIsInNwb3V0cyIsInRpbWVvdXRNUyIsIm9uRXJyb3IiLCJyZW5kZXIiLCJjbGllbnRNYW5pZmVzdCIsInJlcSIsInJlcyIsIm5vbmNlIiwicmFuZG9tQnl0ZXMiLCJ0b1N0cmluZyIsImFwcCIsImRpZEVycm9yIiwibGFzdEVycm9yIiwicGlwZSIsImFib3J0Iiwib25TaGVsbFJlYWR5Iiwic3RhdHVzQ29kZSIsInNldEhlYWRlciIsIm9uU2hlbGxFcnJvciIsImUiLCJjb25zb2xlIiwiZXJyb3IiLCJzZXRUaW1lb3V0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xheVNwb3V0cy50c3giXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHR5cGUgeyBKU1ggfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyByZW5kZXJUb1BpcGVhYmxlU3RyZWFtIGFzIHJlYWN0UmVuZGVyIH0gZnJvbSAncmVhY3QtZG9tL3NlcnZlcic7XG5cbmltcG9ydCB7IGdldEVycm9yU3RhdHVzIH0gZnJvbSAnLi9zY3JpcHRzL3NzckVycm9ySGFuZGxlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlbmRlciB9IGZyb20gJy4vc2NyaXB0cy90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IFNlcnZlclByb3BzIH0gZnJvbSAnLi9zcG91dHMvdHlwZXMuanMnO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBsYXlTcG91dHMoXG4gIHNwb3V0czogKHByb3BzOiBTZXJ2ZXJQcm9wcykgPT4gUHJvbWlzZTx7XG4gICAgYXBwOiBKU1guRWxlbWVudDtcbiAgfT4sXG4gIHtcbiAgICB0aW1lb3V0TVMgPSAxMDAwMCxcbiAgICBvbkVycm9yLFxuICB9OiB7IHRpbWVvdXRNUz86IG51bWJlcjsgb25FcnJvcj86IChlcnJvcjogdW5rbm93bikgPT4gdm9pZCB9ID0ge30sXG4pIHtcbiAgY29uc3QgcmVuZGVyOiBSZW5kZXIgPSBhc3luYyAoY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzKSA9PiB7XG4gICAgY29uc3Qgbm9uY2UgPSBjcnlwdG8ucmFuZG9tQnl0ZXMoMTYpLnRvU3RyaW5nKCdiYXNlNjQnKTtcblxuICAgIHRyeSB7XG4gICAgICBjb25zdCB7IGFwcCB9ID0gYXdhaXQgc3BvdXRzKHsgY2xpZW50TWFuaWZlc3QsIHJlcSwgcmVzLCBub25jZSB9KTtcblxuICAgICAgbGV0IGRpZEVycm9yID0gZmFsc2U7XG4gICAgICBsZXQgbGFzdEVycm9yOiB1bmtub3duO1xuICAgICAgY29uc3QgeyBwaXBlLCBhYm9ydCB9ID0gcmVhY3RSZW5kZXIoYXBwLCB7XG4gICAgICAgIG5vbmNlLFxuICAgICAgICAvL2Jvb3RzdHJhcFNjcmlwdHM6IGFzc2V0cy5maWx0ZXIoYXNzZXQgPT4gYXNzZXQuZW5kc1dpdGgoJy5qcycpKSxcbiAgICAgICAgb25TaGVsbFJlYWR5KCkge1xuICAgICAgICAgIC8vbWFuYWdlcnMuZm9yRWFjaChtYW5hZ2VyID0+IG1hbmFnZXIuY2xlYW51cCgpKTtcbiAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgZXJyb3JlZCBiZWZvcmUgd2Ugc3RhcnRlZCBzdHJlYW1pbmcsIHdlIHNldCB0aGUgZXJyb3IgY29kZSBhcHByb3ByaWF0ZWx5LlxuICAgICAgICAgIHJlcy5zdGF0dXNDb2RlID0gZGlkRXJyb3IgPyBnZXRFcnJvclN0YXR1cyhsYXN0RXJyb3IpIDogMjAwO1xuICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU2hlbGxFcnJvcihlOiB1bmtub3duKSB7XG4gICAgICAgICAgZGlkRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIGxhc3RFcnJvciA9IGU7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBnZXRFcnJvclN0YXR1cyhlKTtcbiAgICAgICAgICBwaXBlKHJlcyk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3IoZTogdW5rbm93bikge1xuICAgICAgICAgIGRpZEVycm9yID0gdHJ1ZTtcbiAgICAgICAgICBsYXN0RXJyb3IgPSBlO1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSBnZXRFcnJvclN0YXR1cyhlKTtcbiAgICAgICAgICAvL3BpcGUocmVzKTsgUmVtb3ZpbmcgdGhpcyBhdm9pZHMsIFwiUmVhY3QgY3VycmVudGx5IG9ubHkgc3VwcG9ydHMgcGlwaW5nIHRvIG9uZSB3cml0YWJsZSBzdHJlYW0uXCJcbiAgICAgICAgICBpZiAob25FcnJvcikgb25FcnJvcihlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgLy8gQWJhbmRvbiBhbmQgc3dpdGNoIHRvIGNsaWVudCByZW5kZXJpbmcgaWYgZW5vdWdoIHRpbWUgcGFzc2VzLlxuICAgICAgLy8gVHJ5IGxvd2VyaW5nIHRoaXMgdG8gc2VlIHRoZSBjbGllbnQgcmVjb3Zlci5cbiAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IChhYm9ydCBhcyBhbnkpKGBUaW1lb3V0IG9mICR7dGltZW91dE1TfW1zIGV4Y2VlZGVkYCksXG4gICAgICAgIHRpbWVvdXRNUyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZTogdW5rbm93bikge1xuICAgICAgaWYgKG9uRXJyb3IpIG9uRXJyb3IoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIHJlbmRlcjtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFFM0IsU0FBU0Msc0JBQXNCLElBQUlDLFdBQVcsUUFBUSxrQkFBa0I7QUFFeEUsU0FBU0MsY0FBYyxRQUFRLDhCQUE4QjtBQUk3RCxlQUFlLFNBQVNDLFNBQVNBLENBQy9CQyxNQUVFLEVBQ0Y7RUFDRUMsU0FBUyxHQUFHLEtBQUs7RUFDakJDO0FBQzBELENBQUMsR0FBRyxDQUFDLENBQUMsRUFDbEU7RUFDQSxNQUFNQyxNQUFjLEdBQUcsTUFBQUEsQ0FBT0MsY0FBYyxFQUFFQyxHQUFHLEVBQUVDLEdBQUcsS0FBSztJQUN6RCxNQUFNQyxLQUFLLEdBQUdaLE1BQU0sQ0FBQ2EsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDQyxRQUFRLENBQUMsUUFBUSxDQUFDO0lBRXZELElBQUk7TUFDRixNQUFNO1FBQUVDO01BQUksQ0FBQyxHQUFHLE1BQU1WLE1BQU0sQ0FBQztRQUFFSSxjQUFjO1FBQUVDLEdBQUc7UUFBRUMsR0FBRztRQUFFQztNQUFNLENBQUMsQ0FBQztNQUVqRSxJQUFJSSxRQUFRLEdBQUcsS0FBSztNQUNwQixJQUFJQyxTQUFrQjtNQUN0QixNQUFNO1FBQUVDLElBQUk7UUFBRUM7TUFBTSxDQUFDLEdBQUdqQixXQUFXLENBQUNhLEdBQUcsRUFBRTtRQUN2Q0gsS0FBSztRQUNMO1FBQ0FRLFlBQVlBLENBQUEsRUFBRztVQUNiO1VBQ0E7VUFDQVQsR0FBRyxDQUFDVSxVQUFVLEdBQUdMLFFBQVEsR0FBR2IsY0FBYyxDQUFDYyxTQUFTLENBQUMsR0FBRyxHQUFHO1VBQzNETixHQUFHLENBQUNXLFNBQVMsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDO1VBQzFDSixJQUFJLENBQUNQLEdBQUcsQ0FBQztRQUNYLENBQUM7UUFDRFksWUFBWUEsQ0FBQ0MsQ0FBVSxFQUFFO1VBQ3ZCUixRQUFRLEdBQUcsSUFBSTtVQUNmQyxTQUFTLEdBQUdPLENBQUM7VUFDYmIsR0FBRyxDQUFDVSxVQUFVLEdBQUdsQixjQUFjLENBQUNxQixDQUFDLENBQUM7VUFDbENOLElBQUksQ0FBQ1AsR0FBRyxDQUFDO1FBQ1gsQ0FBQztRQUNESixPQUFPQSxDQUFDaUIsQ0FBVSxFQUFFO1VBQ2xCUixRQUFRLEdBQUcsSUFBSTtVQUNmQyxTQUFTLEdBQUdPLENBQUM7VUFDYkMsT0FBTyxDQUFDQyxLQUFLLENBQUNGLENBQUMsQ0FBQztVQUNoQmIsR0FBRyxDQUFDVSxVQUFVLEdBQUdsQixjQUFjLENBQUNxQixDQUFDLENBQUM7VUFDbEM7VUFDQSxJQUFJakIsT0FBTyxFQUFFQSxPQUFPLENBQUNpQixDQUFDLENBQUM7UUFDekI7TUFDRixDQUFDLENBQUM7TUFDRjtNQUNBO01BQ0FHLFVBQVUsQ0FDUixNQUFPUixLQUFLLENBQVMsY0FBY2IsU0FBUyxhQUFhLENBQUMsRUFDMURBLFNBQ0YsQ0FBQztJQUNILENBQUMsQ0FBQyxPQUFPa0IsQ0FBVSxFQUFFO01BQ25CLElBQUlqQixPQUFPLEVBQUVBLE9BQU8sQ0FBQ2lCLENBQUMsQ0FBQztNQUN2QixNQUFNQSxDQUFDO0lBQ1Q7RUFDRixDQUFDO0VBQ0QsT0FBT2hCLE1BQU07QUFDZiIsImlnbm9yZUxpc3QiOltdfQ==