@mnaoumov/typescript-dev-toolkit 3.0.0 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. package/assets/biome.json +49 -0
  2. package/assets/prettier.json +13 -0
  3. package/dist/lib/cjs/docs-site/docs-links.cjs +6 -3
  4. package/dist/lib/cjs/docs-site/docs-site-commands.cjs +24 -5
  5. package/dist/lib/cjs/docs-site/docs-site-commands.d.cts +8 -3
  6. package/dist/lib/cjs/docs-site/docs-site-config.cjs +4 -1
  7. package/dist/lib/cjs/docs-site/docs-site-config.d.cts +17 -0
  8. package/dist/lib/cjs/docs-site/index.cjs +4 -1
  9. package/dist/lib/cjs/docs-site/index.d.cts +1 -0
  10. package/dist/lib/cjs/docs-site/link-check.cjs +88 -11
  11. package/dist/lib/cjs/docs-site/link-check.d.cts +91 -2
  12. package/dist/lib/cjs/docs-site/repo-homepage.cjs +108 -0
  13. package/dist/lib/cjs/docs-site/repo-homepage.d.cts +50 -0
  14. package/dist/lib/cjs/formatters/auto.cjs +59 -0
  15. package/dist/lib/cjs/formatters/auto.d.cts +51 -0
  16. package/dist/lib/cjs/formatters/biome.cjs +121 -0
  17. package/dist/lib/cjs/formatters/biome.d.cts +69 -0
  18. package/dist/lib/cjs/formatters/index.cjs +12 -3
  19. package/dist/lib/cjs/formatters/index.d.cts +3 -0
  20. package/dist/lib/cjs/formatters/prettier.cjs +93 -0
  21. package/dist/lib/cjs/formatters/prettier.d.cts +56 -0
  22. package/dist/lib/cjs/index.cjs +4 -1
  23. package/dist/lib/cjs/index.d.cts +1 -0
  24. package/dist/lib/cjs/linters/auto.cjs +52 -0
  25. package/dist/lib/cjs/linters/auto.d.cts +49 -0
  26. package/dist/lib/cjs/linters/biome.cjs +50 -0
  27. package/dist/lib/cjs/linters/biome.d.cts +36 -0
  28. package/dist/lib/cjs/linters/eslint-config.cjs +1 -1
  29. package/dist/lib/cjs/linters/eslint.cjs +15 -14
  30. package/dist/lib/cjs/linters/eslint.d.cts +6 -0
  31. package/dist/lib/cjs/linters/index.cjs +7 -1
  32. package/dist/lib/cjs/linters/index.d.cts +2 -0
  33. package/dist/lib/cjs/nano-staged-config.cjs +33 -16
  34. package/dist/lib/cjs/nano-staged-config.d.cts +6 -0
  35. package/dist/lib/cjs/repo-paths.cjs +3 -1
  36. package/dist/lib/cjs/repo-paths.d.cts +8 -0
  37. package/dist/lib/cjs/shared-config-files.cjs +68 -0
  38. package/dist/lib/cjs/shared-config-files.d.cts +29 -0
  39. package/dist/lib/cjs/test-runners/auto.cjs +83 -0
  40. package/dist/lib/cjs/test-runners/auto.d.cts +82 -0
  41. package/dist/lib/cjs/test-runners/index.cjs +10 -1
  42. package/dist/lib/cjs/test-runners/index.d.cts +3 -0
  43. package/dist/lib/cjs/test-runners/jest-config.cjs +86 -0
  44. package/dist/lib/cjs/test-runners/jest-config.d.cts +71 -0
  45. package/dist/lib/cjs/test-runners/jest.cjs +111 -0
  46. package/dist/lib/cjs/test-runners/jest.d.cts +77 -0
  47. package/dist/lib/esm/docs-site/docs-links.mjs +7 -3
  48. package/dist/lib/esm/docs-site/docs-site-commands.d.mts +8 -3
  49. package/dist/lib/esm/docs-site/docs-site-commands.mjs +14 -5
  50. package/dist/lib/esm/docs-site/docs-site-config.d.mts +17 -0
  51. package/dist/lib/esm/docs-site/docs-site-config.mjs +4 -1
  52. package/dist/lib/esm/docs-site/index.d.mts +1 -0
  53. package/dist/lib/esm/docs-site/index.mjs +3 -1
  54. package/dist/lib/esm/docs-site/link-check.d.mts +91 -2
  55. package/dist/lib/esm/docs-site/link-check.mjs +83 -11
  56. package/dist/lib/esm/docs-site/repo-homepage.d.mts +50 -0
  57. package/dist/lib/esm/docs-site/repo-homepage.mjs +84 -0
  58. package/dist/lib/esm/formatters/auto.d.mts +51 -0
  59. package/dist/lib/esm/formatters/auto.mjs +40 -0
  60. package/dist/lib/esm/formatters/biome.d.mts +69 -0
  61. package/dist/lib/esm/formatters/biome.mjs +107 -0
  62. package/dist/lib/esm/formatters/index.d.mts +3 -0
  63. package/dist/lib/esm/formatters/index.mjs +8 -2
  64. package/dist/lib/esm/formatters/prettier.d.mts +56 -0
  65. package/dist/lib/esm/formatters/prettier.mjs +75 -0
  66. package/dist/lib/esm/index.d.mts +1 -0
  67. package/dist/lib/esm/index.mjs +3 -1
  68. package/dist/lib/esm/linters/auto.d.mts +49 -0
  69. package/dist/lib/esm/linters/auto.mjs +30 -0
  70. package/dist/lib/esm/linters/biome.d.mts +36 -0
  71. package/dist/lib/esm/linters/biome.mjs +29 -0
  72. package/dist/lib/esm/linters/eslint-config.mjs +1 -1
  73. package/dist/lib/esm/linters/eslint.d.mts +6 -0
  74. package/dist/lib/esm/linters/eslint.mjs +14 -14
  75. package/dist/lib/esm/linters/index.d.mts +2 -0
  76. package/dist/lib/esm/linters/index.mjs +5 -1
  77. package/dist/lib/esm/nano-staged-config.d.mts +6 -0
  78. package/dist/lib/esm/nano-staged-config.mjs +33 -16
  79. package/dist/lib/esm/repo-paths.d.mts +8 -0
  80. package/dist/lib/esm/repo-paths.mjs +3 -1
  81. package/dist/lib/esm/shared-config-files.d.mts +29 -0
  82. package/dist/lib/esm/shared-config-files.mjs +36 -0
  83. package/dist/lib/esm/test-runners/auto.d.mts +82 -0
  84. package/dist/lib/esm/test-runners/auto.mjs +64 -0
  85. package/dist/lib/esm/test-runners/index.d.mts +3 -0
  86. package/dist/lib/esm/test-runners/index.mjs +7 -1
  87. package/dist/lib/esm/test-runners/jest-config.d.mts +71 -0
  88. package/dist/lib/esm/test-runners/jest-config.mjs +58 -0
  89. package/dist/lib/esm/test-runners/jest.d.mts +77 -0
  90. package/dist/lib/esm/test-runners/jest.mjs +75 -0
  91. package/docs-site/repo-homepage/package.json +6 -0
  92. package/formatters/auto/package.json +6 -0
  93. package/formatters/biome/package.json +6 -0
  94. package/formatters/prettier/package.json +6 -0
  95. package/linters/auto/package.json +6 -0
  96. package/linters/biome/package.json +6 -0
  97. package/package.json +21 -1
  98. package/test-runners/auto/package.json +6 -0
  99. package/test-runners/jest/package.json +6 -0
  100. package/test-runners/jest-config/package.json +6 -0
@@ -56,6 +56,10 @@ var __copyProps = (to, from, except, desc) => {
56
56
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
57
57
  var link_check_exports = {};
58
58
  __export(link_check_exports, {
59
+ DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY: () => DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY,
60
+ DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS: () => DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS,
61
+ DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS: () => DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS,
62
+ DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS: () => DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS,
59
63
  NETWORK_FAILURE_STATUS: () => NETWORK_FAILURE_STATUS,
60
64
  collectBrokenExternalLinks: () => collectBrokenExternalLinks,
61
65
  collectBrokenLinks: () => collectBrokenLinks,
@@ -66,6 +70,7 @@ __export(link_check_exports, {
66
70
  getOutputRelativePath: () => getOutputRelativePath,
67
71
  getPageUrl: () => getPageUrl,
68
72
  isInternalDocUrl: () => isInternalDocUrl,
73
+ parseRetryAfterInMilliseconds: () => parseRetryAfterInMilliseconds,
69
74
  resolveWithinRoot: () => resolveWithinRoot
70
75
  });
71
76
  module.exports = __toCommonJS(link_check_exports);
@@ -76,20 +81,47 @@ const LINK_ATTRIBUTE_REGEX = /\b(?:href|src)=(?<quote>['"])(?<value>.*?)\k<quote
76
81
  const ID_ATTRIBUTE_REGEX = /\bid=(?<quote>['"])(?<value>.*?)\k<quote>/giu;
77
82
  const HTTP_OK_STATUS = 200;
78
83
  const NETWORK_FAILURE_STATUS = 0;
79
- async function collectBrokenExternalLinks(targets, fetchUrlStatus, concurrency) {
80
- const entries = [...targets];
81
- const results = Array.from({ length: entries.length }, () => null);
82
- let nextIndex = 0;
84
+ const DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY = 8;
85
+ const DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS = 1e3;
86
+ const DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS = 16e3;
87
+ const DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS = 45e3;
88
+ const HTTP_TOO_MANY_REQUESTS_STATUS = 429;
89
+ const HTTP_SERVER_ERROR_MIN_STATUS = 500;
90
+ const MILLISECONDS_PER_SECOND = 1e3;
91
+ const JITTER_FLOOR = 0.5;
92
+ const BACKOFF_FACTOR = 2;
93
+ async function collectBrokenExternalLinks(targets, fetchUrlStatus, concurrency, options = {}) {
94
+ const perHostConcurrency = Math.max(1, options.perHostConcurrency ?? DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY);
95
+ const pending = [...targets].map(([url, pageUrl], index) => ({ host: new URL(url).host, index, pageUrl, url }));
96
+ const results = Array.from({ length: pending.length }, () => null);
97
+ const inFlightByHost = /* @__PURE__ */ new Map();
98
+ const waiters = [];
83
99
  async function runWorker() {
84
- for (let index = nextIndex++; index < entries.length; index = nextIndex++) {
85
- const [externalUrl, pageUrl] = (0, import_type_guards.ensureNonNullable)(entries[index]);
86
- const httpStatus = await fetchUrlStatus(externalUrl);
87
- if (httpStatus !== HTTP_OK_STATUS) {
88
- results[index] = { httpStatus, pageUrl, reason: "external-error", targetUrl: externalUrl };
100
+ while (pending.length > 0) {
101
+ const position = pending.findIndex((probe2) => (inFlightByHost.get(probe2.host) ?? 0) < perHostConcurrency);
102
+ if (position === -1) {
103
+ await new Promise((resolvePromise) => {
104
+ waiters.push(resolvePromise);
105
+ });
106
+ continue;
107
+ }
108
+ const [probe] = pending.splice(position, 1);
109
+ const { host, index, pageUrl, url } = (0, import_type_guards.ensureNonNullable)(probe);
110
+ inFlightByHost.set(host, (inFlightByHost.get(host) ?? 0) + 1);
111
+ try {
112
+ const httpStatus = await probeWithRetry(url, fetchUrlStatus, options.retry ?? {});
113
+ if (httpStatus !== HTTP_OK_STATUS) {
114
+ results[index] = { httpStatus, pageUrl, reason: "external-error", targetUrl: url };
115
+ }
116
+ } finally {
117
+ inFlightByHost.set(host, (0, import_type_guards.ensureNonNullable)(inFlightByHost.get(host)) - 1);
118
+ for (const wake of waiters.splice(0)) {
119
+ wake();
120
+ }
89
121
  }
90
122
  }
91
123
  }
92
- const workerCount = Math.max(1, Math.min(concurrency, entries.length));
124
+ const workerCount = Math.max(1, Math.min(concurrency, pending.length));
93
125
  await Promise.all(Array.from({ length: workerCount }, () => runWorker()));
94
126
  return results.filter((brokenLink) => brokenLink !== null);
95
127
  }
@@ -169,6 +201,17 @@ function isInternalDocUrl(targetUrl, siteBaseUrl) {
169
201
  const base = new URL(siteBaseUrl);
170
202
  return targetUrl.origin === base.origin && targetUrl.pathname.startsWith(base.pathname);
171
203
  }
204
+ function parseRetryAfterInMilliseconds(headerValue, nowInMilliseconds) {
205
+ const trimmed = headerValue?.trim() ?? "";
206
+ if (trimmed === "") {
207
+ return void 0;
208
+ }
209
+ if (/^\d+$/u.test(trimmed)) {
210
+ return Number(trimmed) * MILLISECONDS_PER_SECOND;
211
+ }
212
+ const dateInMilliseconds = Date.parse(trimmed);
213
+ return Number.isNaN(dateInMilliseconds) ? void 0 : Math.max(0, dateInMilliseconds - nowInMilliseconds);
214
+ }
172
215
  function resolveWithinRoot(outputRootPath, outputRelativePath) {
173
216
  const root = (0, import_posix.normalize)(outputRootPath.replaceAll("\\", "/")).replace(/\/$/u, "");
174
217
  let joined = (0, import_posix.normalize)(`${root}/${outputRelativePath.replaceAll("\\", "/")}`);
@@ -180,8 +223,41 @@ function resolveWithinRoot(outputRootPath, outputRelativePath) {
180
223
  function describeHttpStatus(httpStatus) {
181
224
  return httpStatus === void 0 || httpStatus === NETWORK_FAILURE_STATUS ? "a network failure" : `HTTP ${String(httpStatus)}`;
182
225
  }
226
+ function isTransientStatus(status) {
227
+ return status === NETWORK_FAILURE_STATUS || status === HTTP_TOO_MANY_REQUESTS_STATUS || status >= HTTP_SERVER_ERROR_MIN_STATUS;
228
+ }
229
+ async function probeWithRetry(url, fetchUrlStatus, retry) {
230
+ const initialDelayInMilliseconds = retry.initialDelayInMilliseconds ?? DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS;
231
+ const maxDelayInMilliseconds = retry.maxDelayInMilliseconds ?? DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS;
232
+ const totalBudgetInMilliseconds = retry.totalBudgetInMilliseconds ?? DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS;
233
+ const random = retry.random ?? Math.random;
234
+ const sleep = retry.sleep ?? sleepWithTimeout;
235
+ let waitedInMilliseconds = 0;
236
+ for (let attempt = 0; ; attempt++) {
237
+ const probeResult = await fetchUrlStatus(url);
238
+ const { retryAfterInMilliseconds, status } = typeof probeResult === "number" ? { retryAfterInMilliseconds: void 0, status: probeResult } : probeResult;
239
+ const remainingInMilliseconds = totalBudgetInMilliseconds - waitedInMilliseconds;
240
+ if (!isTransientStatus(status) || remainingInMilliseconds <= 0) {
241
+ return status;
242
+ }
243
+ const backoffInMilliseconds = Math.min(maxDelayInMilliseconds, initialDelayInMilliseconds * BACKOFF_FACTOR ** attempt);
244
+ const jitteredInMilliseconds = backoffInMilliseconds * (JITTER_FLOOR + (1 - JITTER_FLOOR) * random());
245
+ const delayInMilliseconds = Math.min(remainingInMilliseconds, Math.max(jitteredInMilliseconds, retryAfterInMilliseconds ?? 0));
246
+ await sleep(delayInMilliseconds);
247
+ waitedInMilliseconds += delayInMilliseconds;
248
+ }
249
+ }
250
+ function sleepWithTimeout(milliseconds) {
251
+ return new Promise((resolvePromise) => {
252
+ globalThis.setTimeout(resolvePromise, milliseconds);
253
+ });
254
+ }
183
255
  // Annotate the CommonJS export names for ESM import in node:
184
256
  0 && (module.exports = {
257
+ DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY,
258
+ DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS,
259
+ DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS,
260
+ DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS,
185
261
  NETWORK_FAILURE_STATUS,
186
262
  collectBrokenExternalLinks,
187
263
  collectBrokenLinks,
@@ -192,6 +268,7 @@ function describeHttpStatus(httpStatus) {
192
268
  getOutputRelativePath,
193
269
  getPageUrl,
194
270
  isInternalDocUrl,
271
+ parseRetryAfterInMilliseconds,
195
272
  resolveWithinRoot
196
273
  });
197
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvbGluay1jaGVjay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVmFsaWRhdGlvbiBvZiB0aGUgbGlua3MgZW1pdHRlZCBieSB0aGUgYnVpbHQgZG9jdW1lbnRhdGlvbiBIVE1MLlxuICpcbiAqIEludGVybmFsIChzYW1lLXNpdGUpIGxpbmtzIGFyZSB2YWxpZGF0ZWQgb2ZmbGluZTogZXZlcnkgYGhyZWZgL2BzcmNgIG11c3QgcmVzb2x2ZSB0byBhIHJlYWxcbiAqIGZpbGUgaW4gdGhlIGJ1aWxkIG91dHB1dCwgYW5kIGV2ZXJ5IGAjZnJhZ21lbnRgIG11c3QgcmVzb2x2ZSB0byBhIHJlYWwgZWxlbWVudCBpZCBvbiB0aGVcbiAqIHRhcmdldCBwYWdlLlxuICpcbiAqIEV4dGVybmFsIGxpbmtzIGNhbiBvbmx5IGJlIHZhbGlkYXRlZCBvdmVyIHRoZSBuZXR3b3JrLCBzbyB0aG9zZSByZXF1ZXN0cyBhcmUgaGVhdmlseVxuICogZGVkdXBsaWNhdGVkIOKAlCBlYWNoIHVuaXF1ZSBleHRlcm5hbCBVUkwgaXMgZmV0Y2hlZCBhdCBtb3N0IG9uY2UgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBvZiB0aGVcbiAqIHRob3VzYW5kcyBvZiBnZW5lcmF0ZWQgcGFnZXMgcmVmZXJlbmNlIGl0IOKAlCBhbmQgcnVuIHRocm91Z2ggYSBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplIH0gZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcblxuY29uc3QgTElOS19BVFRSSUJVVEVfUkVHRVggPSAvXFxiKD86aHJlZnxzcmMpPSg/PHF1b3RlPlsnXCJdKSg/PHZhbHVlPi4qPylcXGs8cXVvdGU+L2dpdTtcbmNvbnN0IElEX0FUVFJJQlVURV9SRUdFWCA9IC9cXGJpZD0oPzxxdW90ZT5bJ1wiXSkoPzx2YWx1ZT4uKj8pXFxrPHF1b3RlPi9naXU7XG5jb25zdCBIVFRQX09LX1NUQVRVUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUge0BsaW5rIEJyb2tlbkxpbmsuaHR0cFN0YXR1c30gc2VudGluZWwgZm9yIGEgbmV0d29yay1sZXZlbCBmYWlsdXJlICh0aW1lb3V0LCBETlMsXG4gKiBjb25uZWN0aW9uIHJlZnVzZWQpIHdoZXJlIG5vIEhUVFAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlxuICovXG5leHBvcnQgY29uc3QgTkVUV09SS19GQUlMVVJFX1NUQVRVUyA9IDA7XG5cbi8qKlxuICogQSBzaW5nbGUgbGluayB0aGF0IGRvZXMgbm90IHJlc29sdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGluayB7XG4gIC8qKlxuICAgKiBUaGUgSFRUUCBzdGF0dXMgcmV0dXJuZWQgYnkgYW4gZXh0ZXJuYWwgbGluaywgd2hlbiB7QGxpbmsgQnJva2VuTGluay5yZWFzb259IGlzXG4gICAqIGBleHRlcm5hbC1lcnJvcmAuIGAwYCBkZW5vdGVzIGEgbmV0d29yay1sZXZlbCBmYWlsdXJlICh0aW1lb3V0LCBETlMsIGNvbm5lY3Rpb24gcmVmdXNlZCkuXG4gICAqL1xuICBodHRwU3RhdHVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGJyb2tlbiBsaW5rLlxuICAgKi9cbiAgcGFnZVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaHkgdGhlIGxpbmsgaXMgY29uc2lkZXJlZCBicm9rZW4uXG4gICAqL1xuICByZWFzb246ICdleHRlcm5hbC1lcnJvcicgfCAnbWlzc2luZy1mcmFnbWVudCcgfCAnbWlzc2luZy1wYWdlJztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGFic29sdXRlIFVSTCB0aGUgbGluayBwb2ludHMgYXQuXG4gICAqL1xuICB0YXJnZXRVcmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHNpbmdsZSBidWlsdCBkb2N1bWVudGF0aW9uIHBhZ2UgdG8gdmFsaWRhdGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRG9jdW1lbnRhdGlvblBhZ2Uge1xuICAvKipcbiAgICogVGhlIHBhZ2UncyByZW5kZXJlZCBIVE1MLlxuICAgKi9cbiAgaHRtbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1aWxkLW91dHB1dCByb290LCBlLmcuIGBhcGkvZm9vL2luZGV4Lmh0bWxgLlxuICAgKi9cbiAgcmVsYXRpdmVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRmlsZXN5c3RlbSBhY2Nlc3MgdGhlIGxpbmsgY2hlY2tlciBuZWVkcywgaW5qZWN0ZWQgc28gdGhlIHB1cmUgZGVjaXNpb24gbG9naWMgY2FuIGJlIHRlc3RlZFxuICogYWdhaW5zdCBhbiBpbi1tZW1vcnkgc3R1YiBpbnN0ZWFkIG9mIGEgcmVhbCBidWlsZCBvdXRwdXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGlua0NoZWNrRmlsZVN5c3RlbSB7XG4gIC8qKlxuICAgKiBSZWFkcyB0aGUgZWxlbWVudCBpZHMgcHJlc2VudCBvbiBhbiBhbHJlYWR5LXJlc29sdmVkIHBhZ2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYWdlS2V5IC0gVGhlIGtleSByZXR1cm5lZCBieSB7QGxpbmsgTGlua0NoZWNrRmlsZVN5c3RlbS5yZXNvbHZlRXhpc3RpbmdQYWdlfS5cbiAgICogQHJldHVybnMgVGhlIHNldCBvZiBlbGVtZW50IGlkcyBvbiB0aGF0IHBhZ2UuXG4gICAqL1xuICByZWFkSWRzOiAocGFnZUtleTogc3RyaW5nKSA9PiBTZXQ8c3RyaW5nPjtcblxuICAvKipcbiAgICogUmVzb2x2ZXMgYW4gb3V0cHV0LXJlbGF0aXZlIHBhdGggdG8gYW4gZXhpc3RpbmcgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIG91dHB1dFJlbGF0aXZlUGF0aCAtIFRoZSBkZWNvZGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1aWxkLW91dHB1dCByb290LlxuICAgKiBAcmV0dXJucyBBIHN0YWJsZSBrZXkgKGUuZy4gdGhlIHJlc29sdmVkIGFic29sdXRlIGZpbGUgcGF0aCkgZm9yIHRoZSBleGlzdGluZyBwYWdlLCBvclxuICAgKiAgIGBudWxsYCB3aGVuIG5vdGhpbmcgZXhpc3RzIGF0IHRoYXQgcGF0aCBvciB0aGUgcGF0aCBlc2NhcGVzIHRoZSBidWlsZC1vdXRwdXQgcm9vdC5cbiAgICovXG4gIHJlc29sdmVFeGlzdGluZ1BhZ2U6IChvdXRwdXRSZWxhdGl2ZVBhdGg6IHN0cmluZykgPT4gbnVsbCB8IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGRlZHVwbGljYXRlZCBleHRlcm5hbCBVUkxzIG92ZXIgdGhlIG5ldHdvcmsgdGhyb3VnaCBhIGJvdW5kZWQgY29uY3VycmVuY3kgcG9vbC5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0cyAtIFRoZSB1bmlxdWUgZXh0ZXJuYWwgVVJMIOKGkiByZWZlcmVuY2luZyBwYWdlIG1hcCBmcm9tIHtAbGluayBjb2xsZWN0RXh0ZXJuYWxUYXJnZXRzfS5cbiAqIEBwYXJhbSBmZXRjaFVybFN0YXR1cyAtIEluamVjdGVkIHByb2JlIHJldHVybmluZyB0aGUgSFRUUCBzdGF0dXMgZm9yIGEgVVJMIChgMGAgZm9yIGEgbmV0d29yayBmYWlsdXJlKS5cbiAqIEBwYXJhbSBjb25jdXJyZW5jeSAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbi1mbGlnaHQgcHJvYmVzLlxuICogQHJldHVybnMgRXZlcnkgZXh0ZXJuYWwgVVJMIHRoYXQgZGlkIG5vdCByZXR1cm4gSFRUUCBgMjAwYCwgaW4gdGhlIG1hcCdzIGl0ZXJhdGlvbiBvcmRlci5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RCcm9rZW5FeHRlcm5hbExpbmtzKFxuICB0YXJnZXRzOiBNYXA8c3RyaW5nLCBzdHJpbmc+LFxuICBmZXRjaFVybFN0YXR1czogKHVybDogc3RyaW5nKSA9PiBQcm9taXNlPG51bWJlcj4sXG4gIGNvbmN1cnJlbmN5OiBudW1iZXJcbik6IFByb21pc2U8QnJva2VuTGlua1tdPiB7XG4gIGNvbnN0IGVudHJpZXMgPSBbLi4udGFyZ2V0c107XG4gIGNvbnN0IHJlc3VsdHM6IChCcm9rZW5MaW5rIHwgbnVsbClbXSA9IEFycmF5LmZyb20oeyBsZW5ndGg6IGVudHJpZXMubGVuZ3RoIH0sICgpID0+IG51bGwpO1xuICBsZXQgbmV4dEluZGV4ID0gMDtcblxuICBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgZm9yIChsZXQgaW5kZXggPSBuZXh0SW5kZXgrKzsgaW5kZXggPCBlbnRyaWVzLmxlbmd0aDsgaW5kZXggPSBuZXh0SW5kZXgrKykge1xuICAgICAgY29uc3QgW2V4dGVybmFsVXJsLCBwYWdlVXJsXSA9IGVuc3VyZU5vbk51bGxhYmxlKGVudHJpZXNbaW5kZXhdKTtcbiAgICAgIGNvbnN0IGh0dHBTdGF0dXMgPSBhd2FpdCBmZXRjaFVybFN0YXR1cyhleHRlcm5hbFVybCk7XG4gICAgICBpZiAoaHR0cFN0YXR1cyAhPT0gSFRUUF9PS19TVEFUVVMpIHtcbiAgICAgICAgcmVzdWx0c1tpbmRleF0gPSB7IGh0dHBTdGF0dXMsIHBhZ2VVcmwsIHJlYXNvbjogJ2V4dGVybmFsLWVycm9yJywgdGFyZ2V0VXJsOiBleHRlcm5hbFVybCB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHdvcmtlckNvdW50ID0gTWF0aC5tYXgoMSwgTWF0aC5taW4oY29uY3VycmVuY3ksIGVudHJpZXMubGVuZ3RoKSk7XG4gIGF3YWl0IFByb21pc2UuYWxsKEFycmF5LmZyb20oeyBsZW5ndGg6IHdvcmtlckNvdW50IH0sICgpID0+IHJ1bldvcmtlcigpKSk7XG5cbiAgLy8gSW5kZXhlZCBhc3NpZ25tZW50IGFib3ZlIGtlZXBzIGZhaWx1cmVzIGluIHRoZSBtYXAncyBpdGVyYXRpb24gb3JkZXI7IGRyb3AgdGhlIHN1Y2Nlc3NmdWwgZ2Fwcy5cbiAgcmV0dXJuIHJlc3VsdHMuZmlsdGVyKChicm9rZW5MaW5rKTogYnJva2VuTGluayBpcyBCcm9rZW5MaW5rID0+IGJyb2tlbkxpbmsgIT09IG51bGwpO1xufVxuXG4vKipcbiAqIEZpbmRzIGV2ZXJ5IGludGVybmFsIGxpbmsgYWNyb3NzIHRoZSBidWlsdCBkb2N1bWVudGF0aW9uIHBhZ2VzIHRoYXQgZG9lcyBub3QgcmVzb2x2ZS5cbiAqXG4gKiBFeHRlcm5hbCBhbmQgbm9uLUhUVFAgbGlua3MgYXJlIGlnbm9yZWQuIEVhY2ggaW50ZXJuYWwgbGluayBtdXN0IHJlc29sdmUgdG8gYW4gZXhpc3RpbmcgcGFnZSxcbiAqIGFuZCBlYWNoIGAjZnJhZ21lbnRgIG11c3QgcmVzb2x2ZSB0byBhbiBleGlzdGluZyBlbGVtZW50IGlkIG9uIHRoZSB0YXJnZXQgcGFnZS5cbiAqXG4gKiBAcGFyYW0gcGFnZXMgLSBUaGUgYnVpbHQgZG9jdW1lbnRhdGlvbiBwYWdlcyB0byB2YWxpZGF0ZS5cbiAqIEBwYXJhbSBmaWxlU3lzdGVtIC0gSW5qZWN0ZWQgYWNjZXNzIHRvIHRoZSBidWlsZCBvdXRwdXQuXG4gKiBAcGFyYW0gc2l0ZUJhc2VVcmwgLSBUaGUgYWJzb2x1dGUgYmFzZSBVUkwgdGhlIHNpdGUgaXMgc2VydmVkIGZyb20gKHdpdGggYSB0cmFpbGluZyBzbGFzaCkuXG4gKiBAcmV0dXJucyBFdmVyeSBicm9rZW4gaW50ZXJuYWwgbGluaywgaW4gcGFnZS10aGVuLWRvY3VtZW50IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEJyb2tlbkxpbmtzKHBhZ2VzOiBEb2N1bWVudGF0aW9uUGFnZVtdLCBmaWxlU3lzdGVtOiBMaW5rQ2hlY2tGaWxlU3lzdGVtLCBzaXRlQmFzZVVybDogc3RyaW5nKTogQnJva2VuTGlua1tdIHtcbiAgY29uc3QgYnJva2VuTGlua3M6IEJyb2tlbkxpbmtbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgIGNvbnN0IHBhZ2VVcmwgPSBnZXRQYWdlVXJsKHBhZ2UucmVsYXRpdmVQYXRoLCBzaXRlQmFzZVVybCk7XG4gICAgZm9yIChjb25zdCByYXdMaW5rIG9mIGV4dHJhY3RMaW5rcyhwYWdlLmh0bWwpKSB7XG4gICAgICBjb25zdCB0YXJnZXRVcmwgPSBuZXcgVVJMKHJhd0xpbmssIHBhZ2VVcmwpO1xuICAgICAgaWYgKCFpc0ludGVybmFsRG9jVXJsKHRhcmdldFVybCwgc2l0ZUJhc2VVcmwpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWdlS2V5ID0gZmlsZVN5c3RlbS5yZXNvbHZlRXhpc3RpbmdQYWdlKGdldE91dHB1dFJlbGF0aXZlUGF0aCh0YXJnZXRVcmwsIHNpdGVCYXNlVXJsKSk7XG4gICAgICBpZiAocGFnZUtleSA9PT0gbnVsbCkge1xuICAgICAgICBicm9rZW5MaW5rcy5wdXNoKHsgcGFnZVVybCwgcmVhc29uOiAnbWlzc2luZy1wYWdlJywgdGFyZ2V0VXJsOiB0YXJnZXRVcmwuaHJlZiB9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZyYWdtZW50ID0gdGFyZ2V0VXJsLmhhc2guc2xpY2UoMSk7XG4gICAgICBpZiAoZnJhZ21lbnQubGVuZ3RoID4gMCAmJiAhZmlsZVN5c3RlbS5yZWFkSWRzKHBhZ2VLZXkpLmhhcyhmcmFnbWVudCkpIHtcbiAgICAgICAgYnJva2VuTGlua3MucHVzaCh7IHBhZ2VVcmwsIHJlYXNvbjogJ21pc3NpbmctZnJhZ21lbnQnLCB0YXJnZXRVcmw6IHRhcmdldFVybC5ocmVmIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBicm9rZW5MaW5rcztcbn1cblxuLyoqXG4gKiBDb2xsZWN0cyBldmVyeSB1bmlxdWUgZXh0ZXJuYWwgVVJMIHJlZmVyZW5jZWQgYWNyb3NzIHRoZSBidWlsdCBwYWdlcywgZGVkdXBsaWNhdGVkLlxuICpcbiAqIE9ubHkgSFRUUChTKSBsaW5rcyB0aGF0IGFyZSBub3Qge0BsaW5rIGlzSW50ZXJuYWxEb2NVcmx9IGFyZSByZXR1cm5lZC4gRWFjaCB1bmlxdWUgVVJMIG1hcHMgdG9cbiAqIHRoZSBmaXJzdCBwYWdlIHRoYXQgcmVmZXJlbmNlZCBpdCwgc28gYSBsYXRlciBmYWlsdXJlIGNhbiBiZSByZXBvcnRlZCB3aXRoIGEgY29uY3JldGUgZXhhbXBsZVxuICogcGFnZSBldmVuIHRob3VnaCB0aGUgVVJMIGlzIGZldGNoZWQgb25seSBvbmNlLlxuICpcbiAqIEBwYXJhbSBwYWdlcyAtIFRoZSBidWlsdCBkb2N1bWVudGF0aW9uIHBhZ2VzIHRvIHNjYW4uXG4gKiBAcGFyYW0gc2l0ZUJhc2VVcmwgLSBUaGUgYWJzb2x1dGUgYmFzZSBVUkwgdGhlIHNpdGUgaXMgc2VydmVkIGZyb20gKHdpdGggYSB0cmFpbGluZyBzbGFzaCkuXG4gKiBAcmV0dXJucyBBIG1hcCBmcm9tIGVhY2ggdW5pcXVlIGV4dGVybmFsIFVSTCB0byBvbmUgcmVmZXJlbmNpbmcgcGFnZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0RXh0ZXJuYWxUYXJnZXRzKHBhZ2VzOiBEb2N1bWVudGF0aW9uUGFnZVtdLCBzaXRlQmFzZVVybDogc3RyaW5nKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXG4gIGZvciAoY29uc3QgcGFnZSBvZiBwYWdlcykge1xuICAgIGNvbnN0IHBhZ2VVcmwgPSBnZXRQYWdlVXJsKHBhZ2UucmVsYXRpdmVQYXRoLCBzaXRlQmFzZVVybCk7XG4gICAgZm9yIChjb25zdCByYXdMaW5rIG9mIGV4dHJhY3RMaW5rcyhwYWdlLmh0bWwpKSB7XG4gICAgICBjb25zdCB0YXJnZXRVcmwgPSBuZXcgVVJMKHJhd0xpbmssIHBhZ2VVcmwpO1xuICAgICAgaWYgKCh0YXJnZXRVcmwucHJvdG9jb2wgIT09ICdodHRwOicgJiYgdGFyZ2V0VXJsLnByb3RvY29sICE9PSAnaHR0cHM6JykgfHwgaXNJbnRlcm5hbERvY1VybCh0YXJnZXRVcmwsIHNpdGVCYXNlVXJsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZXh0ZXJuYWxVcmwgPSBgJHt0YXJnZXRVcmwub3JpZ2lufSR7dGFyZ2V0VXJsLnBhdGhuYW1lfSR7dGFyZ2V0VXJsLnNlYXJjaH1gO1xuICAgICAgaWYgKCF0YXJnZXRzLmhhcyhleHRlcm5hbFVybCkpIHtcbiAgICAgICAgdGFyZ2V0cy5zZXQoZXh0ZXJuYWxVcmwsIHBhZ2VVcmwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXRzO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIHRoZSB2YWx1ZXMgb2YgZXZlcnkgYGlkYCBhdHRyaWJ1dGUgaW4gYSBjaHVuayBvZiBIVE1MLlxuICpcbiAqIEBwYXJhbSBodG1sIC0gVGhlIEhUTUwgdG8gc2Nhbi5cbiAqIEByZXR1cm5zIFRoZSBzZXQgb2YgZWxlbWVudCBpZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0SWRzKGh0bWw6IHN0cmluZyk6IFNldDxzdHJpbmc+IHtcbiAgcmV0dXJuIG5ldyBTZXQoWy4uLmh0bWwubWF0Y2hBbGwoSURfQVRUUklCVVRFX1JFR0VYKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3ZhbHVlJykpKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmFsdWVzIG9mIGV2ZXJ5IGBocmVmYC9gc3JjYCBhdHRyaWJ1dGUgaW4gYSBjaHVuayBvZiBIVE1MLlxuICpcbiAqIEBwYXJhbSBodG1sIC0gVGhlIEhUTUwgdG8gc2Nhbi5cbiAqIEByZXR1cm5zIFRoZSByYXcgbGluayB2YWx1ZXMsIGluIGRvY3VtZW50IG9yZGVyIChkdXBsaWNhdGVzIHByZXNlcnZlZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0TGlua3MoaHRtbDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gWy4uLmh0bWwubWF0Y2hBbGwoTElOS19BVFRSSUJVVEVfUkVHRVgpXS5tYXAoKG1hdGNoKSA9PiBnZXRNYW5kYXRvcnlOYW1lZEdyb3VwKG1hdGNoLCAndmFsdWUnKSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBicm9rZW4gbGlua3MgaW50byBhIGh1bWFuLXJlYWRhYmxlIG11bHRpLWxpbmUgcmVwb3J0LlxuICpcbiAqIEBwYXJhbSBicm9rZW5MaW5rcyAtIFRoZSBicm9rZW4gbGlua3MgdG8gZGVzY3JpYmUuXG4gKiBAcmV0dXJucyBPbmUgbGluZSBwZXIgYnJva2VuIGxpbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRCcm9rZW5MaW5rcyhicm9rZW5MaW5rczogQnJva2VuTGlua1tdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGJyb2tlbkxpbmtzXG4gICAgLm1hcCgoYnJva2VuTGluaykgPT4ge1xuICAgICAgc3dpdGNoIChicm9rZW5MaW5rLnJlYXNvbikge1xuICAgICAgICBjYXNlICdleHRlcm5hbC1lcnJvcic6IHtcbiAgICAgICAgICByZXR1cm4gYCR7YnJva2VuTGluay5wYWdlVXJsfSBsaW5rcyB0byBleHRlcm5hbCBVUkwgJHticm9rZW5MaW5rLnRhcmdldFVybH0gdGhhdCByZXR1cm5lZCAke2Rlc2NyaWJlSHR0cFN0YXR1cyhicm9rZW5MaW5rLmh0dHBTdGF0dXMpfS5gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21pc3NpbmctZnJhZ21lbnQnOiB7XG4gICAgICAgICAgcmV0dXJuIGAke2Jyb2tlbkxpbmsucGFnZVVybH0gbGlua3MgdG8gbWlzc2luZyBmcmFnbWVudCAke2Jyb2tlbkxpbmsudGFyZ2V0VXJsfS5gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ21pc3NpbmctcGFnZSc6IHtcbiAgICAgICAgICByZXR1cm4gYCR7YnJva2VuTGluay5wYWdlVXJsfSBsaW5rcyB0byBtaXNzaW5nIHBhZ2UgJHticm9rZW5MaW5rLnRhcmdldFVybH0uYDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgcmV0dXJuIGFzc2VydE5ldmVyKGJyb2tlbkxpbmsucmVhc29uKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gICAgLmpvaW4oJ1xcbicpO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBidWlsZC1vdXRwdXQtcmVsYXRpdmUgcGF0aCBmb3IgYW4gaW50ZXJuYWwgZG9jdW1lbnRhdGlvbiBVUkwuXG4gKlxuICogQHBhcmFtIHRhcmdldFVybCAtIFRoZSByZXNvbHZlZCBhYnNvbHV0ZSBsaW5rIFVSTCAobXVzdCBiZSB7QGxpbmsgaXNJbnRlcm5hbERvY1VybH0pLlxuICogQHBhcmFtIHNpdGVCYXNlVXJsIC0gVGhlIGFic29sdXRlIGJhc2UgVVJMIHRoZSBzaXRlIGlzIHNlcnZlZCBmcm9tICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpLlxuICogQHJldHVybnMgVGhlIGRlY29kZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgYnVpbGQtb3V0cHV0IHJvb3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRSZWxhdGl2ZVBhdGgodGFyZ2V0VXJsOiBVUkwsIHNpdGVCYXNlVXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gbmV3IFVSTChzaXRlQmFzZVVybCk7XG4gIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQodGFyZ2V0VXJsLnBhdGhuYW1lLnNsaWNlKGJhc2UucGF0aG5hbWUubGVuZ3RoKSk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGFic29sdXRlIFVSTCBhIGJ1aWx0IHBhZ2UgaXMgc2VydmVkIGF0LlxuICpcbiAqIEBwYXJhbSByZWxhdGl2ZVBhdGggLSBUaGUgcGFnZSdzIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1aWxkLW91dHB1dCByb290LlxuICogQHBhcmFtIHNpdGVCYXNlVXJsIC0gVGhlIGFic29sdXRlIGJhc2UgVVJMIHRoZSBzaXRlIGlzIHNlcnZlZCBmcm9tICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpLlxuICogQHJldHVybnMgVGhlIHBhZ2UncyBhYnNvbHV0ZSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWdlVXJsKHJlbGF0aXZlUGF0aDogc3RyaW5nLCBzaXRlQmFzZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKTtcbiAgY29uc3QgdXJsUGF0aCA9IG5vcm1hbGl6ZWQgPT09ICdpbmRleC5odG1sJyA/ICcnIDogbm9ybWFsaXplZC5yZXBsYWNlKC9pbmRleFxcLmh0bWwkL3UsICcnKTtcbiAgcmV0dXJuIG5ldyBVUkwodXJsUGF0aCwgc2l0ZUJhc2VVcmwpLmhyZWY7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgcmVzb2x2ZWQgbGluayBwb2ludHMgYXQgYSBwYWdlIGhvc3RlZCBieSB0aGlzIGRvY3VtZW50YXRpb24gc2l0ZS5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0VXJsIC0gVGhlIHJlc29sdmVkIGFic29sdXRlIGxpbmsgVVJMLlxuICogQHBhcmFtIHNpdGVCYXNlVXJsIC0gVGhlIGFic29sdXRlIGJhc2UgVVJMIHRoZSBzaXRlIGlzIHNlcnZlZCBmcm9tICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpLlxuICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGxpbmsgaXMgc2FtZS1vcmlnaW4gYW5kIHVuZGVyIHRoZSBzaXRlIGJhc2UgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZXJuYWxEb2NVcmwodGFyZ2V0VXJsOiBVUkwsIHNpdGVCYXNlVXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZSA9IG5ldyBVUkwoc2l0ZUJhc2VVcmwpO1xuICByZXR1cm4gdGFyZ2V0VXJsLm9yaWdpbiA9PT0gYmFzZS5vcmlnaW4gJiYgdGFyZ2V0VXJsLnBhdGhuYW1lLnN0YXJ0c1dpdGgoYmFzZS5wYXRobmFtZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW4gb3V0cHV0LXJlbGF0aXZlIHBhdGggdG8gYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIGJ1aWxkLW91dHB1dCByb290LCByZWplY3RpbmdcbiAqIHBhdGhzIHRoYXQgZXNjYXBlIGl0IHZpYSBgLi5gIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRSb290UGF0aCAtIFRoZSBhYnNvbHV0ZSBidWlsZC1vdXRwdXQgcm9vdCBwYXRoLlxuICogQHBhcmFtIG91dHB1dFJlbGF0aXZlUGF0aCAtIFRoZSBkZWNvZGVkIG91dHB1dC1yZWxhdGl2ZSBwYXRoLlxuICogQHJldHVybnMgVGhlIGpvaW5lZCBwYXRoIHdoZW4gaXQgc3RheXMgd2l0aGluIHRoZSByb290LCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhpblJvb3Qob3V0cHV0Um9vdFBhdGg6IHN0cmluZywgb3V0cHV0UmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IG5vcm1hbGl6ZShvdXRwdXRSb290UGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSkucmVwbGFjZSgvXFwvJC91LCAnJyk7XG4gIGxldCBqb2luZWQgPSBub3JtYWxpemUoYCR7cm9vdH0vJHtvdXRwdXRSZWxhdGl2ZVBhdGgucmVwbGFjZUFsbCgnXFxcXCcsICcvJyl9YCk7XG4gIGlmIChqb2luZWQubGVuZ3RoID4gMSkge1xuICAgIGpvaW5lZCA9IGpvaW5lZC5yZXBsYWNlKC9cXC8kL3UsICcnKTtcbiAgfVxuXG4gIHJldHVybiBqb2luZWQgIT09IHJvb3QgJiYgIWpvaW5lZC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApID8gbnVsbCA6IGpvaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVIdHRwU3RhdHVzKGh0dHBTdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBodHRwU3RhdHVzID09PSB1bmRlZmluZWQgfHwgaHR0cFN0YXR1cyA9PT0gTkVUV09SS19GQUlMVVJFX1NUQVRVUyA/ICdhIG5ldHdvcmsgZmFpbHVyZScgOiBgSFRUUCAke1N0cmluZyhodHRwU3RhdHVzKX1gO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWNBLHFCQUF1QztBQUN2Qyx5QkFHTztBQUNQLG1CQUEwQjtBQUUxQixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHFCQUFxQjtBQUMzQixNQUFNLGlCQUFpQjtBQU1oQixNQUFNLHlCQUF5QjtBQTBFdEMsZUFBc0IsMkJBQ3BCLFNBQ0EsZ0JBQ0EsYUFDdUI7QUFDdkIsUUFBTSxVQUFVLENBQUMsR0FBRyxPQUFPO0FBQzNCLFFBQU0sVUFBaUMsTUFBTSxLQUFLLEVBQUUsUUFBUSxRQUFRLE9BQU8sR0FBRyxNQUFNLElBQUk7QUFDeEYsTUFBSSxZQUFZO0FBRWhCLGlCQUFlLFlBQTJCO0FBQ3hDLGFBQVMsUUFBUSxhQUFhLFFBQVEsUUFBUSxRQUFRLFFBQVEsYUFBYTtBQUN6RSxZQUFNLENBQUMsYUFBYSxPQUFPLFFBQUksc0NBQWtCLFFBQVEsS0FBSyxDQUFDO0FBQy9ELFlBQU0sYUFBYSxNQUFNLGVBQWUsV0FBVztBQUNuRCxVQUFJLGVBQWUsZ0JBQWdCO0FBQ2pDLGdCQUFRLEtBQUssSUFBSSxFQUFFLFlBQVksU0FBUyxRQUFRLGtCQUFrQixXQUFXLFlBQVk7QUFBQSxNQUMzRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEs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
274
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvbGluay1jaGVjay50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogVmFsaWRhdGlvbiBvZiB0aGUgbGlua3MgZW1pdHRlZCBieSB0aGUgYnVpbHQgZG9jdW1lbnRhdGlvbiBIVE1MLlxuICpcbiAqIEludGVybmFsIChzYW1lLXNpdGUpIGxpbmtzIGFyZSB2YWxpZGF0ZWQgb2ZmbGluZTogZXZlcnkgYGhyZWZgL2BzcmNgIG11c3QgcmVzb2x2ZSB0byBhIHJlYWxcbiAqIGZpbGUgaW4gdGhlIGJ1aWxkIG91dHB1dCwgYW5kIGV2ZXJ5IGAjZnJhZ21lbnRgIG11c3QgcmVzb2x2ZSB0byBhIHJlYWwgZWxlbWVudCBpZCBvbiB0aGVcbiAqIHRhcmdldCBwYWdlLlxuICpcbiAqIEV4dGVybmFsIGxpbmtzIGNhbiBvbmx5IGJlIHZhbGlkYXRlZCBvdmVyIHRoZSBuZXR3b3JrLCBzbyB0aG9zZSByZXF1ZXN0cyBhcmUgaGVhdmlseVxuICogZGVkdXBsaWNhdGVkIOKAlCBlYWNoIHVuaXF1ZSBleHRlcm5hbCBVUkwgaXMgZmV0Y2hlZCBhdCBtb3N0IG9uY2UgcmVnYXJkbGVzcyBvZiBob3cgbWFueSBvZiB0aGVcbiAqIHRob3VzYW5kcyBvZiBnZW5lcmF0ZWQgcGFnZXMgcmVmZXJlbmNlIGl0IOKAlCBhbmQgcnVuIHRocm91Z2ggYSBib3VuZGVkIGNvbmN1cnJlbmN5IHBvb2wuXG4gKi9cblxuaW1wb3J0IHsgZ2V0TWFuZGF0b3J5TmFtZWRHcm91cCB9IGZyb20gJ0BtbmFvdW1vdi90eXBlc2NyaXB0LWxpYi9yZWctZXhwJztcbmltcG9ydCB7XG4gIGFzc2VydE5ldmVyLFxuICBlbnN1cmVOb25OdWxsYWJsZVxufSBmcm9tICdAbW5hb3Vtb3YvdHlwZXNjcmlwdC1saWIvdHlwZS1ndWFyZHMnO1xuaW1wb3J0IHsgbm9ybWFsaXplIH0gZnJvbSAnbm9kZTpwYXRoL3Bvc2l4JztcblxuY29uc3QgTElOS19BVFRSSUJVVEVfUkVHRVggPSAvXFxiKD86aHJlZnxzcmMpPSg/PHF1b3RlPlsnXCJdKSg/PHZhbHVlPi4qPylcXGs8cXVvdGU+L2dpdTtcbmNvbnN0IElEX0FUVFJJQlVURV9SRUdFWCA9IC9cXGJpZD0oPzxxdW90ZT5bJ1wiXSkoPzx2YWx1ZT4uKj8pXFxrPHF1b3RlPi9naXU7XG5jb25zdCBIVFRQX09LX1NUQVRVUyA9IDIwMDtcblxuLyoqXG4gKiBUaGUge0BsaW5rIEJyb2tlbkxpbmsuaHR0cFN0YXR1c30gc2VudGluZWwgZm9yIGEgbmV0d29yay1sZXZlbCBmYWlsdXJlICh0aW1lb3V0LCBETlMsXG4gKiBjb25uZWN0aW9uIHJlZnVzZWQpIHdoZXJlIG5vIEhUVFAgcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlxuICovXG5leHBvcnQgY29uc3QgTkVUV09SS19GQUlMVVJFX1NUQVRVUyA9IDA7XG5cbi8qKlxuICogQSBzaW5nbGUgbGluayB0aGF0IGRvZXMgbm90IHJlc29sdmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJva2VuTGluayB7XG4gIC8qKlxuICAgKiBUaGUgSFRUUCBzdGF0dXMgcmV0dXJuZWQgYnkgYW4gZXh0ZXJuYWwgbGluaywgd2hlbiB7QGxpbmsgQnJva2VuTGluay5yZWFzb259IGlzXG4gICAqIGBleHRlcm5hbC1lcnJvcmAuIGAwYCBkZW5vdGVzIGEgbmV0d29yay1sZXZlbCBmYWlsdXJlICh0aW1lb3V0LCBETlMsIGNvbm5lY3Rpb24gcmVmdXNlZCkuXG4gICAqL1xuICBodHRwU3RhdHVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBwYWdlIHRoYXQgY29udGFpbnMgdGhlIGJyb2tlbiBsaW5rLlxuICAgKi9cbiAgcGFnZVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaHkgdGhlIGxpbmsgaXMgY29uc2lkZXJlZCBicm9rZW4uXG4gICAqL1xuICByZWFzb246ICdleHRlcm5hbC1lcnJvcicgfCAnbWlzc2luZy1mcmFnbWVudCcgfCAnbWlzc2luZy1wYWdlJztcblxuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGFic29sdXRlIFVSTCB0aGUgbGluayBwb2ludHMgYXQuXG4gICAqL1xuICB0YXJnZXRVcmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgY29sbGVjdEJyb2tlbkV4dGVybmFsTGlua3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbGxlY3RCcm9rZW5FeHRlcm5hbExpbmtzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgaW4tZmxpZ2h0IHByb2JlcyBhZ2FpbnN0IG9uZSBob3N0LiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FWFRFUk5BTF9MSU5LX1BFUl9IT1NUX0NPTkNVUlJFTkNZfS5cbiAgICovXG4gIHJlYWRvbmx5IHBlckhvc3RDb25jdXJyZW5jeT86IG51bWJlcjtcblxuICAvKipcbiAgICogSG93IGEgdHJhbnNpZW50IGZhaWx1cmUgaXMgcmV0cmllZC5cbiAgICovXG4gIHJlYWRvbmx5IHJldHJ5PzogRXh0ZXJuYWxMaW5rUmV0cnlPcHRpb25zO1xufVxuXG4vKipcbiAqIEEgc2luZ2xlIGJ1aWx0IGRvY3VtZW50YXRpb24gcGFnZSB0byB2YWxpZGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb2N1bWVudGF0aW9uUGFnZSB7XG4gIC8qKlxuICAgKiBUaGUgcGFnZSdzIHJlbmRlcmVkIEhUTUwuXG4gICAqL1xuICBodG1sOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYWdlJ3MgcGF0aCByZWxhdGl2ZSB0byB0aGUgYnVpbGQtb3V0cHV0IHJvb3QsIGUuZy4gYGFwaS9mb28vaW5kZXguaHRtbGAuXG4gICAqL1xuICByZWxhdGl2ZVBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBXaGF0IG9uZSBwcm9iZSBvZiBhbiBleHRlcm5hbCBVUkwgbGVhcm5lZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbExpbmtQcm9iZVJlc3VsdCB7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGUgc2VydmVyIGFza2VkIHRoZSBjbGllbnQgdG8gd2FpdCBiZWZvcmUgYXNraW5nIGFnYWluIChpdHMgYFJldHJ5LUFmdGVyYCBoZWFkZXIpLCB3aGVuIGl0IHNhaWQuXG4gICAqL1xuICByZWFkb25seSByZXRyeUFmdGVySW5NaWxsaXNlY29uZHM/OiBudW1iZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBIVFRQIHN0YXR1cywgb3Ige0BsaW5rIE5FVFdPUktfRkFJTFVSRV9TVEFUVVN9IHdoZW4gbm8gcmVzcG9uc2Ugd2FzIHJlY2VpdmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhdHVzOiBudW1iZXI7XG59XG5cbi8qKlxuICogSG93IHtAbGluayBjb2xsZWN0QnJva2VuRXh0ZXJuYWxMaW5rc30gcmV0cmllcyBhIHRyYW5zaWVudCBmYWlsdXJlOiBhIG5ldHdvcmsgZmFpbHVyZSwgYW4gSFRUUCBgNDI5YCBvciBhbiBIVFRQIGA1eHhgLlxuICpcbiAqIEVhY2ggd2FpdCBkb3VibGVzIGZyb20ge0BsaW5rIEV4dGVybmFsTGlua1JldHJ5T3B0aW9ucy5pbml0aWFsRGVsYXlJbk1pbGxpc2Vjb25kc30gdXAgdG9cbiAqIHtAbGluayBFeHRlcm5hbExpbmtSZXRyeU9wdGlvbnMubWF4RGVsYXlJbk1pbGxpc2Vjb25kc30sIGlzIGppdHRlcmVkIGludG8gaXRzIHVwcGVyIGhhbGYsIGFuZCBpcyBuZXZlciBzaG9ydGVyIHRoYW4gdGhlXG4gKiBzZXJ2ZXIncyBgUmV0cnktQWZ0ZXJgLiBUaGUgd2FpdHMgb2Ygb25lIFVSTCBuZXZlciBhZGQgdXAgdG8gbW9yZSB0aGFuXG4gKiB7QGxpbmsgRXh0ZXJuYWxMaW5rUmV0cnlPcHRpb25zLnRvdGFsQnVkZ2V0SW5NaWxsaXNlY29uZHN9OyB0aGUgc3RhdHVzIG9mIHRoZSBsYXN0IGF0dGVtcHQgaXMgZmluYWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZXJuYWxMaW5rUmV0cnlPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBmaXJzdCB3YWl0LiBEZWZhdWx0cyB0byB7QGxpbmsgREVGQVVMVF9FWFRFUk5BTF9MSU5LX1JFVFJZX0lOSVRJQUxfREVMQVlfSU5fTUlMTElTRUNPTkRTfS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxEZWxheUluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9uZ2VzdCBzaW5nbGUgd2FpdCB0aGUgYmFja29mZiBncm93cyB0by4gRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfRVhURVJOQUxfTElOS19SRVRSWV9NQVhfREVMQVlfSU5fTUlMTElTRUNPTkRTfS5cbiAgICovXG4gIHJlYWRvbmx5IG1heERlbGF5SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBudW1iZXIgaW4gYFswLCAxKWAgZm9yIHRoZSBqaXR0ZXIuIERlZmF1bHRzIHRvIGBNYXRoLnJhbmRvbWAuXG4gICAqL1xuICByZWFkb25seSByYW5kb20/OiAoKSA9PiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFdhaXRzIHRoZSBnaXZlbiB0aW1lLiBEZWZhdWx0cyB0byBhIGBzZXRUaW1lb3V0YC5cbiAgICovXG4gIHJlYWRvbmx5IHNsZWVwPzogKG1pbGxpc2Vjb25kczogbnVtYmVyKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBUaGUgbW9zdCBvbmUgVVJMIG1heSBzcGVuZCB3YWl0aW5nIGJldHdlZW4gaXRzIGF0dGVtcHRzLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgREVGQVVMVF9FWFRFUk5BTF9MSU5LX1JFVFJZX1RPVEFMX0JVREdFVF9JTl9NSUxMSVNFQ09ORFN9LlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxCdWRnZXRJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcbn1cblxuLyoqXG4gKiBGaWxlc3lzdGVtIGFjY2VzcyB0aGUgbGluayBjaGVja2VyIG5lZWRzLCBpbmplY3RlZCBzbyB0aGUgcHVyZSBkZWNpc2lvbiBsb2dpYyBjYW4gYmUgdGVzdGVkXG4gKiBhZ2FpbnN0IGFuIGluLW1lbW9yeSBzdHViIGluc3RlYWQgb2YgYSByZWFsIGJ1aWxkIG91dHB1dC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMaW5rQ2hlY2tGaWxlU3lzdGVtIHtcbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBlbGVtZW50IGlkcyBwcmVzZW50IG9uIGFuIGFscmVhZHktcmVzb2x2ZWQgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHBhZ2VLZXkgLSBUaGUga2V5IHJldHVybmVkIGJ5IHtAbGluayBMaW5rQ2hlY2tGaWxlU3lzdGVtLnJlc29sdmVFeGlzdGluZ1BhZ2V9LlxuICAgKiBAcmV0dXJucyBUaGUgc2V0IG9mIGVsZW1lbnQgaWRzIG9uIHRoYXQgcGFnZS5cbiAgICovXG4gIHJlYWRJZHM6IChwYWdlS2V5OiBzdHJpbmcpID0+IFNldDxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBvdXRwdXQtcmVsYXRpdmUgcGF0aCB0byBhbiBleGlzdGluZyBwYWdlLlxuICAgKlxuICAgKiBAcGFyYW0gb3V0cHV0UmVsYXRpdmVQYXRoIC0gVGhlIGRlY29kZWQgcGF0aCByZWxhdGl2ZSB0byB0aGUgYnVpbGQtb3V0cHV0IHJvb3QuXG4gICAqIEByZXR1cm5zIEEgc3RhYmxlIGtleSAoZS5nLiB0aGUgcmVzb2x2ZWQgYWJzb2x1dGUgZmlsZSBwYXRoKSBmb3IgdGhlIGV4aXN0aW5nIHBhZ2UsIG9yXG4gICAqICAgYG51bGxgIHdoZW4gbm90aGluZyBleGlzdHMgYXQgdGhhdCBwYXRoIG9yIHRoZSBwYXRoIGVzY2FwZXMgdGhlIGJ1aWxkLW91dHB1dCByb290LlxuICAgKi9cbiAgcmVzb2x2ZUV4aXN0aW5nUGFnZTogKG91dHB1dFJlbGF0aXZlUGF0aDogc3RyaW5nKSA9PiBudWxsIHwgc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHtAbGluayBDb2xsZWN0QnJva2VuRXh0ZXJuYWxMaW5rc09wdGlvbnMucGVySG9zdENvbmN1cnJlbmN5fS4gQSBkb2N1bWVudGF0aW9uIHNpdGUgbGlua3MgdGhvdXNhbmRzIG9mXG4gKiBwYWdlcyBvZiBpdHMgc2libGluZyBzaXRlcywgYWxsIG9uIG9uZSBob3N0LCBhbmQgR2l0SHViIFBhZ2VzIGFuc3dlcnMgYSBidXJzdCBvZiB0aGVtIHdpdGggYSBgNTAzYC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRVhURVJOQUxfTElOS19QRVJfSE9TVF9DT05DVVJSRU5DWSA9IDg7XG5cbi8qKlxuICogVGhlIGRlZmF1bHQge0BsaW5rIEV4dGVybmFsTGlua1JldHJ5T3B0aW9ucy5pbml0aWFsRGVsYXlJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYVEVSTkFMX0xJTktfUkVUUllfSU5JVElBTF9ERUxBWV9JTl9NSUxMSVNFQ09ORFMgPSAxMDAwO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IHtAbGluayBFeHRlcm5hbExpbmtSZXRyeU9wdGlvbnMubWF4RGVsYXlJbk1pbGxpc2Vjb25kc30uXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VYVEVSTkFMX0xJTktfUkVUUllfTUFYX0RFTEFZX0lOX01JTExJU0VDT05EUyA9IDE2XzAwMDtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCB7QGxpbmsgRXh0ZXJuYWxMaW5rUmV0cnlPcHRpb25zLnRvdGFsQnVkZ2V0SW5NaWxsaXNlY29uZHN9LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9FWFRFUk5BTF9MSU5LX1JFVFJZX1RPVEFMX0JVREdFVF9JTl9NSUxMSVNFQ09ORFMgPSA0NV8wMDA7XG5cbmNvbnN0IEhUVFBfVE9PX01BTllfUkVRVUVTVFNfU1RBVFVTID0gNDI5O1xuY29uc3QgSFRUUF9TRVJWRVJfRVJST1JfTUlOX1NUQVRVUyA9IDUwMDtcbmNvbnN0IE1JTExJU0VDT05EU19QRVJfU0VDT05EID0gMTAwMDtcbmNvbnN0IEpJVFRFUl9GTE9PUiA9IDAuNTtcbmNvbnN0IEJBQ0tPRkZfRkFDVE9SID0gMjtcblxuaW50ZXJmYWNlIFBlbmRpbmdQcm9iZSB7XG4gIHJlYWRvbmx5IGhvc3Q6IHN0cmluZztcbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbiAgcmVhZG9ubHkgcGFnZVVybDogc3RyaW5nO1xuICByZWFkb25seSB1cmw6IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgdGhlIGRlZHVwbGljYXRlZCBleHRlcm5hbCBVUkxzIG92ZXIgdGhlIG5ldHdvcmsgdGhyb3VnaCBhIGJvdW5kZWQgY29uY3VycmVuY3kgcG9vbC5cbiAqXG4gKiBBIG5ldHdvcmsgZmFpbHVyZSwgYW4gSFRUUCBgNDI5YCBhbmQgYW4gSFRUUCBgNXh4YCBhcmUgcmV0cmllZCB3aXRoIGFuIGV4cG9uZW50aWFsLCBqaXR0ZXJlZCBiYWNrb2ZmIHRoYXQgaG9ub3JzXG4gKiBgUmV0cnktQWZ0ZXJgIChzZWUge0BsaW5rIEV4dGVybmFsTGlua1JldHJ5T3B0aW9uc30pOyBhbnkgb3RoZXIgc3RhdHVzLCBhIGA0MDRgIGluY2x1ZGVkLCBpcyBmaW5hbCBhdCBvbmNlLiBQcm9iZXMgb2ZcbiAqIG9uZSBob3N0IGFyZSBhbHNvIGNhcHBlZCBhdCB7QGxpbmsgQ29sbGVjdEJyb2tlbkV4dGVybmFsTGlua3NPcHRpb25zLnBlckhvc3RDb25jdXJyZW5jeX0sIGFuZCBhIHByb2JlIG9mIGFub3RoZXIgaG9zdFxuICogaXMgc3RhcnRlZCB3aGlsZSBvbmUgaG9zdCBpcyBhdCBpdHMgY2FwLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRzIC0gVGhlIHVuaXF1ZSBleHRlcm5hbCBVUkwg4oaSIHJlZmVyZW5jaW5nIHBhZ2UgbWFwIGZyb20ge0BsaW5rIGNvbGxlY3RFeHRlcm5hbFRhcmdldHN9LlxuICogQHBhcmFtIGZldGNoVXJsU3RhdHVzIC0gSW5qZWN0ZWQgcHJvYmUgcmV0dXJuaW5nIHRoZSBIVFRQIHN0YXR1cyBmb3IgYSBVUkwgKGAwYCBmb3IgYSBuZXR3b3JrIGZhaWx1cmUpLCBvciBhblxuICogICB7QGxpbmsgRXh0ZXJuYWxMaW5rUHJvYmVSZXN1bHR9IHRoYXQgYWxzbyBjYXJyaWVzIHRoZSBzZXJ2ZXIncyBgUmV0cnktQWZ0ZXJgLlxuICogQHBhcmFtIGNvbmN1cnJlbmN5IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluLWZsaWdodCBwcm9iZXMuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBwZXItaG9zdCBjYXAgYW5kIHRoZSByZXRyeSBwb2xpY3kuXG4gKiBAcmV0dXJucyBFdmVyeSBleHRlcm5hbCBVUkwgdGhhdCBkaWQgbm90IHJldHVybiBIVFRQIGAyMDBgLCBpbiB0aGUgbWFwJ3MgaXRlcmF0aW9uIG9yZGVyLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29sbGVjdEJyb2tlbkV4dGVybmFsTGlua3MoXG4gIHRhcmdldHM6IE1hcDxzdHJpbmcsIHN0cmluZz4sXG4gIGZldGNoVXJsU3RhdHVzOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8RXh0ZXJuYWxMaW5rUHJvYmVSZXN1bHQgfCBudW1iZXI+LFxuICBjb25jdXJyZW5jeTogbnVtYmVyLFxuICBvcHRpb25zOiBDb2xsZWN0QnJva2VuRXh0ZXJuYWxMaW5rc09wdGlvbnMgPSB7fVxuKTogUHJvbWlzZTxCcm9rZW5MaW5rW10+IHtcbiAgY29uc3QgcGVySG9zdENvbmN1cnJlbmN5ID0gTWF0aC5tYXgoMSwgb3B0aW9ucy5wZXJIb3N0Q29uY3VycmVuY3kgPz8gREVGQVVMVF9FWFRFUk5BTF9MSU5LX1BFUl9IT1NUX0NPTkNVUlJFTkNZKTtcbiAgY29uc3QgcGVuZGluZzogUGVuZGluZ1Byb2JlW10gPSBbLi4udGFyZ2V0c10ubWFwKChbdXJsLCBwYWdlVXJsXSwgaW5kZXgpID0+ICh7IGhvc3Q6IG5ldyBVUkwodXJsKS5ob3N0LCBpbmRleCwgcGFnZVVybCwgdXJsIH0pKTtcbiAgY29uc3QgcmVzdWx0czogKEJyb2tlbkxpbmsgfCBudWxsKVtdID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcGVuZGluZy5sZW5ndGggfSwgKCkgPT4gbnVsbCk7XG4gIGNvbnN0IGluRmxpZ2h0QnlIb3N0ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcbiAgY29uc3Qgd2FpdGVyczogKCgpID0+IHZvaWQpW10gPSBbXTtcblxuICBhc3luYyBmdW5jdGlvbiBydW5Xb3JrZXIoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2hpbGUgKHBlbmRpbmcubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcG9zaXRpb24gPSBwZW5kaW5nLmZpbmRJbmRleCgocHJvYmUpID0+IChpbkZsaWdodEJ5SG9zdC5nZXQocHJvYmUuaG9zdCkgPz8gMCkgPCBwZXJIb3N0Q29uY3VycmVuY3kpO1xuICAgICAgaWYgKHBvc2l0aW9uID09PSAtMSkge1xuICAgICAgICAvLyBFdmVyeSBwZW5kaW5nIFVSTCBpcyBvbiBhIGhvc3QgYXQgaXRzIGNhcCwgc28gYSBwcm9iZSBpcyBpbiBmbGlnaHQgdGhlcmUgYW5kIHdha2VzIHRoaXMgd29ya2VyIHdoZW4gaXQgZW5kcy5cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmVQcm9taXNlKSA9PiB7XG4gICAgICAgICAgd2FpdGVycy5wdXNoKHJlc29sdmVQcm9taXNlKTtcbiAgICAgICAgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbcHJvYmVdID0gcGVuZGluZy5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgICAgY29uc3QgeyBob3N0LCBpbmRleCwgcGFnZVVybCwgdXJsIH0gPSBlbnN1cmVOb25OdWxsYWJsZShwcm9iZSk7XG4gICAgICBpbkZsaWdodEJ5SG9zdC5zZXQoaG9zdCwgKGluRmxpZ2h0QnlIb3N0LmdldChob3N0KSA/PyAwKSArIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgaHR0cFN0YXR1cyA9IGF3YWl0IHByb2JlV2l0aFJldHJ5KHVybCwgZmV0Y2hVcmxTdGF0dXMsIG9wdGlvbnMucmV0cnkgPz8ge30pO1xuICAgICAgICBpZiAoaHR0cFN0YXR1cyAhPT0gSFRUUF9PS19TVEFUVVMpIHtcbiAgICAgICAgICByZXN1bHRzW2luZGV4XSA9IHsgaHR0cFN0YXR1cywgcGFnZVVybCwgcmVhc29uOiAnZXh0ZXJuYWwtZXJyb3InLCB0YXJnZXRVcmw6IHVybCB9O1xuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpbkZsaWdodEJ5SG9zdC5zZXQoaG9zdCwgZW5zdXJlTm9uTnVsbGFibGUoaW5GbGlnaHRCeUhvc3QuZ2V0KGhvc3QpKSAtIDEpO1xuICAgICAgICBmb3IgKGNvbnN0IHdha2Ugb2Ygd2FpdGVycy5zcGxpY2UoMCkpIHtcbiAgICAgICAgICB3YWtlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCB3b3JrZXJDb3VudCA9IE1hdGgubWF4KDEsIE1hdGgubWluKGNvbmN1cnJlbmN5LCBwZW5kaW5nLmxlbmd0aCkpO1xuICBhd2FpdCBQcm9taXNlLmFsbChBcnJheS5mcm9tKHsgbGVuZ3RoOiB3b3JrZXJDb3VudCB9LCAoKSA9PiBydW5Xb3JrZXIoKSkpO1xuXG4gIC8vIEluZGV4ZWQgYXNzaWdubWVudCBhYm92ZSBrZWVwcyBmYWlsdXJlcyBpbiB0aGUgbWFwJ3MgaXRlcmF0aW9uIG9yZGVyOyBkcm9wIHRoZSBzdWNjZXNzZnVsIGdhcHMuXG4gIHJldHVybiByZXN1bHRzLmZpbHRlcigoYnJva2VuTGluayk6IGJyb2tlbkxpbmsgaXMgQnJva2VuTGluayA9PiBicm9rZW5MaW5rICE9PSBudWxsKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBldmVyeSBpbnRlcm5hbCBsaW5rIGFjcm9zcyB0aGUgYnVpbHQgZG9jdW1lbnRhdGlvbiBwYWdlcyB0aGF0IGRvZXMgbm90IHJlc29sdmUuXG4gKlxuICogRXh0ZXJuYWwgYW5kIG5vbi1IVFRQIGxpbmtzIGFyZSBpZ25vcmVkLiBFYWNoIGludGVybmFsIGxpbmsgbXVzdCByZXNvbHZlIHRvIGFuIGV4aXN0aW5nIHBhZ2UsXG4gKiBhbmQgZWFjaCBgI2ZyYWdtZW50YCBtdXN0IHJlc29sdmUgdG8gYW4gZXhpc3RpbmcgZWxlbWVudCBpZCBvbiB0aGUgdGFyZ2V0IHBhZ2UuXG4gKlxuICogQHBhcmFtIHBhZ2VzIC0gVGhlIGJ1aWx0IGRvY3VtZW50YXRpb24gcGFnZXMgdG8gdmFsaWRhdGUuXG4gKiBAcGFyYW0gZmlsZVN5c3RlbSAtIEluamVjdGVkIGFjY2VzcyB0byB0aGUgYnVpbGQgb3V0cHV0LlxuICogQHBhcmFtIHNpdGVCYXNlVXJsIC0gVGhlIGFic29sdXRlIGJhc2UgVVJMIHRoZSBzaXRlIGlzIHNlcnZlZCBmcm9tICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpLlxuICogQHJldHVybnMgRXZlcnkgYnJva2VuIGludGVybmFsIGxpbmssIGluIHBhZ2UtdGhlbi1kb2N1bWVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RCcm9rZW5MaW5rcyhwYWdlczogRG9jdW1lbnRhdGlvblBhZ2VbXSwgZmlsZVN5c3RlbTogTGlua0NoZWNrRmlsZVN5c3RlbSwgc2l0ZUJhc2VVcmw6IHN0cmluZyk6IEJyb2tlbkxpbmtbXSB7XG4gIGNvbnN0IGJyb2tlbkxpbmtzOiBCcm9rZW5MaW5rW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICBjb25zdCBwYWdlVXJsID0gZ2V0UGFnZVVybChwYWdlLnJlbGF0aXZlUGF0aCwgc2l0ZUJhc2VVcmwpO1xuICAgIGZvciAoY29uc3QgcmF3TGluayBvZiBleHRyYWN0TGlua3MocGFnZS5odG1sKSkge1xuICAgICAgY29uc3QgdGFyZ2V0VXJsID0gbmV3IFVSTChyYXdMaW5rLCBwYWdlVXJsKTtcbiAgICAgIGlmICghaXNJbnRlcm5hbERvY1VybCh0YXJnZXRVcmwsIHNpdGVCYXNlVXJsKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcGFnZUtleSA9IGZpbGVTeXN0ZW0ucmVzb2x2ZUV4aXN0aW5nUGFnZShnZXRPdXRwdXRSZWxhdGl2ZVBhdGgodGFyZ2V0VXJsLCBzaXRlQmFzZVVybCkpO1xuICAgICAgaWYgKHBhZ2VLZXkgPT09IG51bGwpIHtcbiAgICAgICAgYnJva2VuTGlua3MucHVzaCh7IHBhZ2VVcmwsIHJlYXNvbjogJ21pc3NpbmctcGFnZScsIHRhcmdldFVybDogdGFyZ2V0VXJsLmhyZWYgfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBmcmFnbWVudCA9IHRhcmdldFVybC5oYXNoLnNsaWNlKDEpO1xuICAgICAgaWYgKGZyYWdtZW50Lmxlbmd0aCA+IDAgJiYgIWZpbGVTeXN0ZW0ucmVhZElkcyhwYWdlS2V5KS5oYXMoZnJhZ21lbnQpKSB7XG4gICAgICAgIGJyb2tlbkxpbmtzLnB1c2goeyBwYWdlVXJsLCByZWFzb246ICdtaXNzaW5nLWZyYWdtZW50JywgdGFyZ2V0VXJsOiB0YXJnZXRVcmwuaHJlZiB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnJva2VuTGlua3M7XG59XG5cbi8qKlxuICogQ29sbGVjdHMgZXZlcnkgdW5pcXVlIGV4dGVybmFsIFVSTCByZWZlcmVuY2VkIGFjcm9zcyB0aGUgYnVpbHQgcGFnZXMsIGRlZHVwbGljYXRlZC5cbiAqXG4gKiBPbmx5IEhUVFAoUykgbGlua3MgdGhhdCBhcmUgbm90IHtAbGluayBpc0ludGVybmFsRG9jVXJsfSBhcmUgcmV0dXJuZWQuIEVhY2ggdW5pcXVlIFVSTCBtYXBzIHRvXG4gKiB0aGUgZmlyc3QgcGFnZSB0aGF0IHJlZmVyZW5jZWQgaXQsIHNvIGEgbGF0ZXIgZmFpbHVyZSBjYW4gYmUgcmVwb3J0ZWQgd2l0aCBhIGNvbmNyZXRlIGV4YW1wbGVcbiAqIHBhZ2UgZXZlbiB0aG91Z2ggdGhlIFVSTCBpcyBmZXRjaGVkIG9ubHkgb25jZS5cbiAqXG4gKiBAcGFyYW0gcGFnZXMgLSBUaGUgYnVpbHQgZG9jdW1lbnRhdGlvbiBwYWdlcyB0byBzY2FuLlxuICogQHBhcmFtIHNpdGVCYXNlVXJsIC0gVGhlIGFic29sdXRlIGJhc2UgVVJMIHRoZSBzaXRlIGlzIHNlcnZlZCBmcm9tICh3aXRoIGEgdHJhaWxpbmcgc2xhc2gpLlxuICogQHJldHVybnMgQSBtYXAgZnJvbSBlYWNoIHVuaXF1ZSBleHRlcm5hbCBVUkwgdG8gb25lIHJlZmVyZW5jaW5nIHBhZ2UgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29sbGVjdEV4dGVybmFsVGFyZ2V0cyhwYWdlczogRG9jdW1lbnRhdGlvblBhZ2VbXSwgc2l0ZUJhc2VVcmw6IHN0cmluZyk6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICBjb25zdCB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcblxuICBmb3IgKGNvbnN0IHBhZ2Ugb2YgcGFnZXMpIHtcbiAgICBjb25zdCBwYWdlVXJsID0gZ2V0UGFnZVVybChwYWdlLnJlbGF0aXZlUGF0aCwgc2l0ZUJhc2VVcmwpO1xuICAgIGZvciAoY29uc3QgcmF3TGluayBvZiBleHRyYWN0TGlua3MocGFnZS5odG1sKSkge1xuICAgICAgY29uc3QgdGFyZ2V0VXJsID0gbmV3IFVSTChyYXdMaW5rLCBwYWdlVXJsKTtcbiAgICAgIGlmICgodGFyZ2V0VXJsLnByb3RvY29sICE9PSAnaHR0cDonICYmIHRhcmdldFVybC5wcm90b2NvbCAhPT0gJ2h0dHBzOicpIHx8IGlzSW50ZXJuYWxEb2NVcmwodGFyZ2V0VXJsLCBzaXRlQmFzZVVybCkpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gYCR7dGFyZ2V0VXJsLm9yaWdpbn0ke3RhcmdldFVybC5wYXRobmFtZX0ke3RhcmdldFVybC5zZWFyY2h9YDtcbiAgICAgIGlmICghdGFyZ2V0cy5oYXMoZXh0ZXJuYWxVcmwpKSB7XG4gICAgICAgIHRhcmdldHMuc2V0KGV4dGVybmFsVXJsLCBwYWdlVXJsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gdGFyZ2V0cztcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgdmFsdWVzIG9mIGV2ZXJ5IGBpZGAgYXR0cmlidXRlIGluIGEgY2h1bmsgb2YgSFRNTC5cbiAqXG4gKiBAcGFyYW0gaHRtbCAtIFRoZSBIVE1MIHRvIHNjYW4uXG4gKiBAcmV0dXJucyBUaGUgc2V0IG9mIGVsZW1lbnQgaWRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdElkcyhodG1sOiBzdHJpbmcpOiBTZXQ8c3RyaW5nPiB7XG4gIHJldHVybiBuZXcgU2V0KFsuLi5odG1sLm1hdGNoQWxsKElEX0FUVFJJQlVURV9SRUdFWCldLm1hcCgobWF0Y2gpID0+IGdldE1hbmRhdG9yeU5hbWVkR3JvdXAobWF0Y2gsICd2YWx1ZScpKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdHMgdGhlIHZhbHVlcyBvZiBldmVyeSBgaHJlZmAvYHNyY2AgYXR0cmlidXRlIGluIGEgY2h1bmsgb2YgSFRNTC5cbiAqXG4gKiBAcGFyYW0gaHRtbCAtIFRoZSBIVE1MIHRvIHNjYW4uXG4gKiBAcmV0dXJucyBUaGUgcmF3IGxpbmsgdmFsdWVzLCBpbiBkb2N1bWVudCBvcmRlciAoZHVwbGljYXRlcyBwcmVzZXJ2ZWQpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXh0cmFjdExpbmtzKGh0bWw6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsuLi5odG1sLm1hdGNoQWxsKExJTktfQVRUUklCVVRFX1JFR0VYKV0ubWFwKChtYXRjaCkgPT4gZ2V0TWFuZGF0b3J5TmFtZWRHcm91cChtYXRjaCwgJ3ZhbHVlJykpO1xufVxuXG4vKipcbiAqIEZvcm1hdHMgYnJva2VuIGxpbmtzIGludG8gYSBodW1hbi1yZWFkYWJsZSBtdWx0aS1saW5lIHJlcG9ydC5cbiAqXG4gKiBAcGFyYW0gYnJva2VuTGlua3MgLSBUaGUgYnJva2VuIGxpbmtzIHRvIGRlc2NyaWJlLlxuICogQHJldHVybnMgT25lIGxpbmUgcGVyIGJyb2tlbiBsaW5rLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0QnJva2VuTGlua3MoYnJva2VuTGlua3M6IEJyb2tlbkxpbmtbXSk6IHN0cmluZyB7XG4gIHJldHVybiBicm9rZW5MaW5rc1xuICAgIC5tYXAoKGJyb2tlbkxpbmspID0+IHtcbiAgICAgIHN3aXRjaCAoYnJva2VuTGluay5yZWFzb24pIHtcbiAgICAgICAgY2FzZSAnZXh0ZXJuYWwtZXJyb3InOiB7XG4gICAgICAgICAgcmV0dXJuIGAke2Jyb2tlbkxpbmsucGFnZVVybH0gbGlua3MgdG8gZXh0ZXJuYWwgVVJMICR7YnJva2VuTGluay50YXJnZXRVcmx9IHRoYXQgcmV0dXJuZWQgJHtkZXNjcmliZUh0dHBTdGF0dXMoYnJva2VuTGluay5odHRwU3RhdHVzKX0uYDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtaXNzaW5nLWZyYWdtZW50Jzoge1xuICAgICAgICAgIHJldHVybiBgJHticm9rZW5MaW5rLnBhZ2VVcmx9IGxpbmtzIHRvIG1pc3NpbmcgZnJhZ21lbnQgJHticm9rZW5MaW5rLnRhcmdldFVybH0uYDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdtaXNzaW5nLXBhZ2UnOiB7XG4gICAgICAgICAgcmV0dXJuIGAke2Jyb2tlbkxpbmsucGFnZVVybH0gbGlua3MgdG8gbWlzc2luZyBwYWdlICR7YnJva2VuTGluay50YXJnZXRVcmx9LmA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiBhc3NlcnROZXZlcihicm9rZW5MaW5rLnJlYXNvbik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIC5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYnVpbGQtb3V0cHV0LXJlbGF0aXZlIHBhdGggZm9yIGFuIGludGVybmFsIGRvY3VtZW50YXRpb24gVVJMLlxuICpcbiAqIEBwYXJhbSB0YXJnZXRVcmwgLSBUaGUgcmVzb2x2ZWQgYWJzb2x1dGUgbGluayBVUkwgKG11c3QgYmUge0BsaW5rIGlzSW50ZXJuYWxEb2NVcmx9KS5cbiAqIEBwYXJhbSBzaXRlQmFzZVVybCAtIFRoZSBhYnNvbHV0ZSBiYXNlIFVSTCB0aGUgc2l0ZSBpcyBzZXJ2ZWQgZnJvbSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKS5cbiAqIEByZXR1cm5zIFRoZSBkZWNvZGVkIHBhdGggcmVsYXRpdmUgdG8gdGhlIGJ1aWxkLW91dHB1dCByb290LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3V0cHV0UmVsYXRpdmVQYXRoKHRhcmdldFVybDogVVJMLCBzaXRlQmFzZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IG5ldyBVUkwoc2l0ZUJhc2VVcmwpO1xuICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHRhcmdldFVybC5wYXRobmFtZS5zbGljZShiYXNlLnBhdGhuYW1lLmxlbmd0aCkpO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBhYnNvbHV0ZSBVUkwgYSBidWlsdCBwYWdlIGlzIHNlcnZlZCBhdC5cbiAqXG4gKiBAcGFyYW0gcmVsYXRpdmVQYXRoIC0gVGhlIHBhZ2UncyBwYXRoIHJlbGF0aXZlIHRvIHRoZSBidWlsZC1vdXRwdXQgcm9vdC5cbiAqIEBwYXJhbSBzaXRlQmFzZVVybCAtIFRoZSBhYnNvbHV0ZSBiYXNlIFVSTCB0aGUgc2l0ZSBpcyBzZXJ2ZWQgZnJvbSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKS5cbiAqIEByZXR1cm5zIFRoZSBwYWdlJ3MgYWJzb2x1dGUgVVJMLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFnZVVybChyZWxhdGl2ZVBhdGg6IHN0cmluZywgc2l0ZUJhc2VVcmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSByZWxhdGl2ZVBhdGgucmVwbGFjZUFsbCgnXFxcXCcsICcvJyk7XG4gIGNvbnN0IHVybFBhdGggPSBub3JtYWxpemVkID09PSAnaW5kZXguaHRtbCcgPyAnJyA6IG5vcm1hbGl6ZWQucmVwbGFjZSgvaW5kZXhcXC5odG1sJC91LCAnJyk7XG4gIHJldHVybiBuZXcgVVJMKHVybFBhdGgsIHNpdGVCYXNlVXJsKS5ocmVmO1xufVxuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciBhIHJlc29sdmVkIGxpbmsgcG9pbnRzIGF0IGEgcGFnZSBob3N0ZWQgYnkgdGhpcyBkb2N1bWVudGF0aW9uIHNpdGUuXG4gKlxuICogQHBhcmFtIHRhcmdldFVybCAtIFRoZSByZXNvbHZlZCBhYnNvbHV0ZSBsaW5rIFVSTC5cbiAqIEBwYXJhbSBzaXRlQmFzZVVybCAtIFRoZSBhYnNvbHV0ZSBiYXNlIFVSTCB0aGUgc2l0ZSBpcyBzZXJ2ZWQgZnJvbSAod2l0aCBhIHRyYWlsaW5nIHNsYXNoKS5cbiAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBsaW5rIGlzIHNhbWUtb3JpZ2luIGFuZCB1bmRlciB0aGUgc2l0ZSBiYXNlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0ludGVybmFsRG9jVXJsKHRhcmdldFVybDogVVJMLCBzaXRlQmFzZVVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IGJhc2UgPSBuZXcgVVJMKHNpdGVCYXNlVXJsKTtcbiAgcmV0dXJuIHRhcmdldFVybC5vcmlnaW4gPT09IGJhc2Uub3JpZ2luICYmIHRhcmdldFVybC5wYXRobmFtZS5zdGFydHNXaXRoKGJhc2UucGF0aG5hbWUpO1xufVxuXG4vKipcbiAqIFJlYWRzIGFuIEhUVFAgYFJldHJ5LUFmdGVyYCBoZWFkZXIsIHdoaWNoIGlzIGVpdGhlciBhIG51bWJlciBvZiBzZWNvbmRzIG9yIGFuIEhUVFAgZGF0ZS5cbiAqXG4gKiBAcGFyYW0gaGVhZGVyVmFsdWUgLSBUaGUgaGVhZGVyJ3MgdmFsdWUsIG9yIGBudWxsYCB3aGVuIHRoZSByZXNwb25zZSBoYXMgbm9uZS5cbiAqIEBwYXJhbSBub3dJbk1pbGxpc2Vjb25kcyAtIFRoZSBjdXJyZW50IHRpbWUsIGFnYWluc3Qgd2hpY2ggYSBkYXRlIGlzIG1lYXN1cmVkLlxuICogQHJldHVybnMgSG93IGxvbmcgdG8gd2FpdCwgbmV2ZXIgbmVnYXRpdmUsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIGhlYWRlciBpcyBhYnNlbnQgb3IgdW5yZWFkYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUmV0cnlBZnRlckluTWlsbGlzZWNvbmRzKGhlYWRlclZhbHVlOiBudWxsIHwgc3RyaW5nLCBub3dJbk1pbGxpc2Vjb25kczogbnVtYmVyKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgdHJpbW1lZCA9IGhlYWRlclZhbHVlPy50cmltKCkgPz8gJyc7XG4gIGlmICh0cmltbWVkID09PSAnJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoL15cXGQrJC91LnRlc3QodHJpbW1lZCkpIHtcbiAgICByZXR1cm4gTnVtYmVyKHRyaW1tZWQpICogTUlMTElTRUNPTkRTX1BFUl9TRUNPTkQ7XG4gIH1cblxuICBjb25zdCBkYXRlSW5NaWxsaXNlY29uZHMgPSBEYXRlLnBhcnNlKHRyaW1tZWQpO1xuICByZXR1cm4gTnVtYmVyLmlzTmFOKGRhdGVJbk1pbGxpc2Vjb25kcykgPyB1bmRlZmluZWQgOiBNYXRoLm1heCgwLCBkYXRlSW5NaWxsaXNlY29uZHMgLSBub3dJbk1pbGxpc2Vjb25kcyk7XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgYW4gb3V0cHV0LXJlbGF0aXZlIHBhdGggdG8gYW4gYWJzb2x1dGUgcGF0aCBpbnNpZGUgdGhlIGJ1aWxkLW91dHB1dCByb290LCByZWplY3RpbmdcbiAqIHBhdGhzIHRoYXQgZXNjYXBlIGl0IHZpYSBgLi5gIHNlZ21lbnRzLlxuICpcbiAqIEBwYXJhbSBvdXRwdXRSb290UGF0aCAtIFRoZSBhYnNvbHV0ZSBidWlsZC1vdXRwdXQgcm9vdCBwYXRoLlxuICogQHBhcmFtIG91dHB1dFJlbGF0aXZlUGF0aCAtIFRoZSBkZWNvZGVkIG91dHB1dC1yZWxhdGl2ZSBwYXRoLlxuICogQHJldHVybnMgVGhlIGpvaW5lZCBwYXRoIHdoZW4gaXQgc3RheXMgd2l0aGluIHRoZSByb290LCBvdGhlcndpc2UgYG51bGxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdpdGhpblJvb3Qob3V0cHV0Um9vdFBhdGg6IHN0cmluZywgb3V0cHV0UmVsYXRpdmVQYXRoOiBzdHJpbmcpOiBudWxsIHwgc3RyaW5nIHtcbiAgY29uc3Qgcm9vdCA9IG5vcm1hbGl6ZShvdXRwdXRSb290UGF0aC5yZXBsYWNlQWxsKCdcXFxcJywgJy8nKSkucmVwbGFjZSgvXFwvJC91LCAnJyk7XG4gIGxldCBqb2luZWQgPSBub3JtYWxpemUoYCR7cm9vdH0vJHtvdXRwdXRSZWxhdGl2ZVBhdGgucmVwbGFjZUFsbCgnXFxcXCcsICcvJyl9YCk7XG4gIGlmIChqb2luZWQubGVuZ3RoID4gMSkge1xuICAgIGpvaW5lZCA9IGpvaW5lZC5yZXBsYWNlKC9cXC8kL3UsICcnKTtcbiAgfVxuXG4gIHJldHVybiBqb2luZWQgIT09IHJvb3QgJiYgIWpvaW5lZC5zdGFydHNXaXRoKGAke3Jvb3R9L2ApID8gbnVsbCA6IGpvaW5lZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVIdHRwU3RhdHVzKGh0dHBTdGF0dXM6IG51bWJlciB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIHJldHVybiBodHRwU3RhdHVzID09PSB1bmRlZmluZWQgfHwgaHR0cFN0YXR1cyA9PT0gTkVUV09SS19GQUlMVVJFX1NUQVRVUyA/ICdhIG5ldHdvcmsgZmFpbHVyZScgOiBgSFRUUCAke1N0cmluZyhodHRwU3RhdHVzKX1gO1xufVxuXG5mdW5jdGlvbiBpc1RyYW5zaWVudFN0YXR1cyhzdGF0dXM6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gc3RhdHVzID09PSBORVRXT1JLX0ZBSUxVUkVfU1RBVFVTIHx8IHN0YXR1cyA9PT0gSFRUUF9UT09fTUFOWV9SRVFVRVNUU19TVEFUVVMgfHwgc3RhdHVzID49IEhUVFBfU0VSVkVSX0VSUk9SX01JTl9TVEFUVVM7XG59XG5cbi8qXG4gKiBBIHNpdGUgbGlua2luZyBpdHMgc2libGluZyBzaXRlcyBwcm9iZXMgdGhvdXNhbmRzIG9mIFVSTHMgb24gb25lIGhvc3QsIGFuZCBpbiBDSSBHaXRIdWIgUGFnZXMgYW5zd2VycyBhIGZldyBvZiB0aGVtXG4gKiB3aXRoIGEgNTAzLCBvciBkcm9wcyB0aGUgY29ubmVjdGlvbiwgd2hpbGUgdGhlIHBhZ2Ugc2VydmVzIDIwMCBhIG1vbWVudCBsYXRlci4gVGhyZWUgYXR0ZW1wdHMgYSBzZWNvbmQgYXBhcnQgZ2F2ZSB1cFxuICogdG9vIHNvb24gZm9yIHRoYXQgKDIwMjYtMTAtMTYpLCBzbyB0aGUgd2FpdCBncm93cyB1bnRpbCB0aGUgYnVkZ2V0IGlzIHNwZW50LlxuICovXG5hc3luYyBmdW5jdGlvbiBwcm9iZVdpdGhSZXRyeShcbiAgdXJsOiBzdHJpbmcsXG4gIGZldGNoVXJsU3RhdHVzOiAodXJsOiBzdHJpbmcpID0+IFByb21pc2U8RXh0ZXJuYWxMaW5rUHJvYmVSZXN1bHQgfCBudW1iZXI+LFxuICByZXRyeTogRXh0ZXJuYWxMaW5rUmV0cnlPcHRpb25zXG4pOiBQcm9taXNlPG51bWJlcj4ge1xuICBjb25zdCBpbml0aWFsRGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJldHJ5LmluaXRpYWxEZWxheUluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfRVhURVJOQUxfTElOS19SRVRSWV9JTklUSUFMX0RFTEFZX0lOX01JTExJU0VDT05EUztcbiAgY29uc3QgbWF4RGVsYXlJbk1pbGxpc2Vjb25kcyA9IHJldHJ5Lm1heERlbGF5SW5NaWxsaXNlY29uZHMgPz8gREVGQVVMVF9FWFRFUk5BTF9MSU5LX1JFVFJZX01BWF9ERUxBWV9JTl9NSUxMSVNFQ09ORFM7XG4gIGNvbnN0IHRvdGFsQnVkZ2V0SW5NaWxsaXNlY29uZHMgPSByZXRyeS50b3RhbEJ1ZGdldEluTWlsbGlzZWNvbmRzID8/IERFRkFVTFRfRVhURVJOQUxfTElOS19SRVRSWV9UT1RBTF9CVURHRVRfSU5fTUlMTElTRUNPTkRTO1xuICBjb25zdCByYW5kb20gPSByZXRyeS5yYW5kb20gPz8gTWF0aC5yYW5kb207XG4gIGNvbnN0IHNsZWVwID0gcmV0cnkuc2xlZXAgPz8gc2xlZXBXaXRoVGltZW91dDtcblxuICBsZXQgd2FpdGVkSW5NaWxsaXNlY29uZHMgPSAwO1xuICBmb3IgKGxldCBhdHRlbXB0ID0gMDs7IGF0dGVtcHQrKykge1xuICAgIGNvbnN0IHByb2JlUmVzdWx0ID0gYXdhaXQgZmV0Y2hVcmxTdGF0dXModXJsKTtcbiAgICBjb25zdCB7IHJldHJ5QWZ0ZXJJbk1pbGxpc2Vjb25kcywgc3RhdHVzIH0gPSB0eXBlb2YgcHJvYmVSZXN1bHQgPT09ICdudW1iZXInID8geyByZXRyeUFmdGVySW5NaWxsaXNlY29uZHM6IHVuZGVmaW5lZCwgc3RhdHVzOiBwcm9iZVJlc3VsdCB9IDogcHJvYmVSZXN1bHQ7XG4gICAgY29uc3QgcmVtYWluaW5nSW5NaWxsaXNlY29uZHMgPSB0b3RhbEJ1ZGdldEluTWlsbGlzZWNvbmRzIC0gd2FpdGVkSW5NaWxsaXNlY29uZHM7XG4gICAgaWYgKCFpc1RyYW5zaWVudFN0YXR1cyhzdGF0dXMpIHx8IHJlbWFpbmluZ0luTWlsbGlzZWNvbmRzIDw9IDApIHtcbiAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgfVxuXG4gICAgY29uc3QgYmFja29mZkluTWlsbGlzZWNvbmRzID0gTWF0aC5taW4obWF4RGVsYXlJbk1pbGxpc2Vjb25kcywgaW5pdGlhbERlbGF5SW5NaWxsaXNlY29uZHMgKiBCQUNLT0ZGX0ZBQ1RPUiAqKiBhdHRlbXB0KTtcbiAgICBjb25zdCBqaXR0ZXJlZEluTWlsbGlzZWNvbmRzID0gYmFja29mZkluTWlsbGlzZWNvbmRzICogKEpJVFRFUl9GTE9PUiArICgxIC0gSklUVEVSX0ZMT09SKSAqIHJhbmRvbSgpKTtcbiAgICBjb25zdCBkZWxheUluTWlsbGlzZWNvbmRzID0gTWF0aC5taW4ocmVtYWluaW5nSW5NaWxsaXNlY29uZHMsIE1hdGgubWF4KGppdHRlcmVkSW5NaWxsaXNlY29uZHMsIHJldHJ5QWZ0ZXJJbk1pbGxpc2Vjb25kcyA/PyAwKSk7XG4gICAgYXdhaXQgc2xlZXAoZGVsYXlJbk1pbGxpc2Vjb25kcyk7XG4gICAgd2FpdGVkSW5NaWxsaXNlY29uZHMgKz0gZGVsYXlJbk1pbGxpc2Vjb25kcztcbiAgfVxufVxuXG5mdW5jdGlvbiBzbGVlcFdpdGhUaW1lb3V0KG1pbGxpc2Vjb25kczogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZVByb21pc2UpID0+IHtcbiAgICBnbG9iYWxUaGlzLnNldFRpbWVvdXQocmVzb2x2ZVByb21pc2UsIG1pbGxpc2Vjb25kcyk7XG4gIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFjQSxxQkFBdUM7QUFDdkMseUJBR087QUFDUCxtQkFBMEI7QUFFMUIsTUFBTSx1QkFBdUI7QUFDN0IsTUFBTSxxQkFBcUI7QUFDM0IsTUFBTSxpQkFBaUI7QUFNaEIsTUFBTSx5QkFBeUI7QUF3SS9CLE1BQU0sNkNBQTZDO0FBS25ELE1BQU0sNERBQTREO0FBS2xFLE1BQU0sd0RBQXdEO0FBSzlELE1BQU0sMkRBQTJEO0FBRXhFLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLGlCQUFpQjtBQXdCdkIsZUFBc0IsMkJBQ3BCLFNBQ0EsZ0JBQ0EsYUFDQSxVQUE2QyxDQUFDLEdBQ3ZCO0FBQ3ZCLFFBQU0scUJBQXFCLEtBQUssSUFBSSxHQUFHLFFBQVEsc0JBQXNCLDBDQUEwQztBQUMvRyxRQUFNLFVBQTBCLENBQUMsR0FBRyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxPQUFP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QUFJLE9BQU8sU0FBUyxHQUFHO0FBQ3JCLGFBQVMsT0FBTyxRQUFRLFFBQVEsRUFBRTtBQUFBLEVBQ3BDO0FBRUEsU0FBTyxXQUFXLFFBQVEsQ0FBQyxPQUFPLFdBQVcsR0FBRyxJQUFJLEdBQUcsSUFBSSxPQUFPO0FBQ3BFO0FBRUEsU0FBUyxtQkFBbUIsWUFBd0M7QUFDbEUsU0FBTyxlQUFlLFVBQWEsZUFBZSx5QkFBeUIsc0JBQXNCLFFBQVEsT0FBTyxVQUFVLENBQUM7QUFDN0g7QUFFQSxTQUFTLGtCQUFrQixRQUF5QjtBQUNsRCxTQUFPLFdBQVcsMEJBQTBCLFdBQVcsaUNBQWlDLFVBQVU7QUFDcEc7QUFPQSxlQUFlLGVBQ2IsS0FDQSxnQkFDQSxPQUNpQjtBQUNqQixRQUFNLDZCQUE2QixNQUFNLDhCQUE4QjtBQUN2RSxRQUFNLHlCQUF5QixNQUFNLDBCQUEwQjtBQUMvRCxRQUFNLDRCQUE0QixNQUFNLDZCQUE2QjtBQUNyRSxRQUFNLFNBQVMsTUFBTSxVQUFVLEtBQUs7QUFDcEMsUUFBTSxRQUFRLE1BQU0sU0FBUztBQUU3QixNQUFJLHVCQUF1QjtBQUMzQixXQUFTLFVBQVUsS0FBSSxXQUFXO0FBQ2hDLFVBQU0sY0FBYyxNQUFNLGVBQWUsR0FBRztBQUM1QyxVQUFNLEVBQUUsMEJBQTBCLE9BQU8sSUFBSSxPQUFPLGdCQUFnQixXQUFXLEVBQUUsMEJBQTBCLFFBQVcsUUFBUSxZQUFZLElBQUk7QUFDOUksVUFBTSwwQkFBMEIsNEJBQTRCO0FBQzVELFFBQUksQ0FBQyxrQkFBa0IsTUFBTSxLQUFLLDJCQUEyQixHQUFHO0FBQzlELGFBQU87QUFBQSxJQUNUO0FBRUEsVUFBTSx3QkFBd0IsS0FBSyxJQUFJLHdCQUF3Qiw2QkFBNkIsa0JBQWtCLE9BQU87QUFDckgsVUFBTSx5QkFBeUIseUJBQXlCLGdCQUFnQixJQUFJLGdCQUFnQixPQUFPO0FBQ25HLFVBQU0sc0JBQXNCLEtBQUssSUFBSSx5QkFBeUIsS0FBSyxJQUFJLHdCQUF3Qiw0QkFBNEIsQ0FBQyxDQUFDO0FBQzdILFVBQU0sTUFBTSxtQkFBbUI7QUFDL0IsNEJBQXdCO0FBQUEsRUFDMUI7QUFDRjtBQUVBLFNBQVMsaUJBQWlCLGNBQXFDO0FBQzdELFNBQU8sSUFBSSxRQUFRLENBQUMsbUJBQW1CO0FBQ3JDLGVBQVcsV0FBVyxnQkFBZ0IsWUFBWTtBQUFBLEVBQ3BELENBQUM7QUFDSDsiLCJuYW1lcyI6WyJwcm9iZSJdfQ==
@@ -40,6 +40,19 @@ export interface BrokenLink {
40
40
  */
41
41
  targetUrl: string;
42
42
  }
43
+ /**
44
+ * Options for {@link collectBrokenExternalLinks}.
45
+ */
46
+ export interface CollectBrokenExternalLinksOptions {
47
+ /**
48
+ * The maximum number of in-flight probes against one host. Defaults to {@link DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY}.
49
+ */
50
+ readonly perHostConcurrency?: number;
51
+ /**
52
+ * How a transient failure is retried.
53
+ */
54
+ readonly retry?: ExternalLinkRetryOptions;
55
+ }
43
56
  /**
44
57
  * A single built documentation page to validate.
45
58
  */
@@ -53,6 +66,50 @@ export interface DocumentationPage {
53
66
  */
54
67
  relativePath: string;
55
68
  }
69
+ /**
70
+ * What one probe of an external URL learned.
71
+ */
72
+ export interface ExternalLinkProbeResult {
73
+ /**
74
+ * How long the server asked the client to wait before asking again (its `Retry-After` header), when it said.
75
+ */
76
+ readonly retryAfterInMilliseconds?: number | undefined;
77
+ /**
78
+ * The HTTP status, or {@link NETWORK_FAILURE_STATUS} when no response was received.
79
+ */
80
+ readonly status: number;
81
+ }
82
+ /**
83
+ * How {@link collectBrokenExternalLinks} retries a transient failure: a network failure, an HTTP `429` or an HTTP `5xx`.
84
+ *
85
+ * Each wait doubles from {@link ExternalLinkRetryOptions.initialDelayInMilliseconds} up to
86
+ * {@link ExternalLinkRetryOptions.maxDelayInMilliseconds}, is jittered into its upper half, and is never shorter than the
87
+ * server's `Retry-After`. The waits of one URL never add up to more than
88
+ * {@link ExternalLinkRetryOptions.totalBudgetInMilliseconds}; the status of the last attempt is final.
89
+ */
90
+ export interface ExternalLinkRetryOptions {
91
+ /**
92
+ * The first wait. Defaults to {@link DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS}.
93
+ */
94
+ readonly initialDelayInMilliseconds?: number;
95
+ /**
96
+ * The longest single wait the backoff grows to. Defaults to {@link DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS}.
97
+ */
98
+ readonly maxDelayInMilliseconds?: number;
99
+ /**
100
+ * Returns a number in `[0, 1)` for the jitter. Defaults to `Math.random`.
101
+ */
102
+ readonly random?: () => number;
103
+ /**
104
+ * Waits the given time. Defaults to a `setTimeout`.
105
+ */
106
+ readonly sleep?: (milliseconds: number) => Promise<void>;
107
+ /**
108
+ * The most one URL may spend waiting between its attempts. Defaults to
109
+ * {@link DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS}.
110
+ */
111
+ readonly totalBudgetInMilliseconds?: number;
112
+ }
56
113
  /**
57
114
  * Filesystem access the link checker needs, injected so the pure decision logic can be tested
58
115
  * against an in-memory stub instead of a real build output.
@@ -74,15 +131,39 @@ export interface LinkCheckFileSystem {
74
131
  */
75
132
  resolveExistingPage: (outputRelativePath: string) => null | string;
76
133
  }
134
+ /**
135
+ * The default {@link CollectBrokenExternalLinksOptions.perHostConcurrency}. A documentation site links thousands of
136
+ * pages of its sibling sites, all on one host, and GitHub Pages answers a burst of them with a `503`.
137
+ */
138
+ export declare const DEFAULT_EXTERNAL_LINK_PER_HOST_CONCURRENCY = 8;
139
+ /**
140
+ * The default {@link ExternalLinkRetryOptions.initialDelayInMilliseconds}.
141
+ */
142
+ export declare const DEFAULT_EXTERNAL_LINK_RETRY_INITIAL_DELAY_IN_MILLISECONDS = 1000;
143
+ /**
144
+ * The default {@link ExternalLinkRetryOptions.maxDelayInMilliseconds}.
145
+ */
146
+ export declare const DEFAULT_EXTERNAL_LINK_RETRY_MAX_DELAY_IN_MILLISECONDS = 16000;
147
+ /**
148
+ * The default {@link ExternalLinkRetryOptions.totalBudgetInMilliseconds}.
149
+ */
150
+ export declare const DEFAULT_EXTERNAL_LINK_RETRY_TOTAL_BUDGET_IN_MILLISECONDS = 45000;
77
151
  /**
78
152
  * Validates the deduplicated external URLs over the network through a bounded concurrency pool.
79
153
  *
154
+ * A network failure, an HTTP `429` and an HTTP `5xx` are retried with an exponential, jittered backoff that honors
155
+ * `Retry-After` (see {@link ExternalLinkRetryOptions}); any other status, a `404` included, is final at once. Probes of
156
+ * one host are also capped at {@link CollectBrokenExternalLinksOptions.perHostConcurrency}, and a probe of another host
157
+ * is started while one host is at its cap.
158
+ *
80
159
  * @param targets - The unique external URL → referencing page map from {@link collectExternalTargets}.
81
- * @param fetchUrlStatus - Injected probe returning the HTTP status for a URL (`0` for a network failure).
160
+ * @param fetchUrlStatus - Injected probe returning the HTTP status for a URL (`0` for a network failure), or an
161
+ * {@link ExternalLinkProbeResult} that also carries the server's `Retry-After`.
82
162
  * @param concurrency - The maximum number of in-flight probes.
163
+ * @param options - The per-host cap and the retry policy.
83
164
  * @returns Every external URL that did not return HTTP `200`, in the map's iteration order.
84
165
  */
85
- export declare function collectBrokenExternalLinks(targets: Map<string, string>, fetchUrlStatus: (url: string) => Promise<number>, concurrency: number): Promise<BrokenLink[]>;
166
+ export declare function collectBrokenExternalLinks(targets: Map<string, string>, fetchUrlStatus: (url: string) => Promise<ExternalLinkProbeResult | number>, concurrency: number, options?: CollectBrokenExternalLinksOptions): Promise<BrokenLink[]>;
86
167
  /**
87
168
  * Finds every internal link across the built documentation pages that does not resolve.
88
169
  *
@@ -152,6 +233,14 @@ export declare function getPageUrl(relativePath: string, siteBaseUrl: string): s
152
233
  * @returns `true` when the link is same-origin and under the site base path.
153
234
  */
154
235
  export declare function isInternalDocUrl(targetUrl: URL, siteBaseUrl: string): boolean;
236
+ /**
237
+ * Reads an HTTP `Retry-After` header, which is either a number of seconds or an HTTP date.
238
+ *
239
+ * @param headerValue - The header's value, or `null` when the response has none.
240
+ * @param nowInMilliseconds - The current time, against which a date is measured.
241
+ * @returns How long to wait, never negative, or `undefined` when the header is absent or unreadable.
242
+ */
243
+ export declare function parseRetryAfterInMilliseconds(headerValue: null | string, nowInMilliseconds: number): number | undefined;
155
244
  /**
156
245
  * Resolves an output-relative path to an absolute path inside the build-output root, rejecting
157
246
  * paths that escape it via `..` segments.
@@ -0,0 +1,108 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+ (function () {
6
+ function ensureBrowserProcess() {
7
+ const browserProcess = {
8
+ browser: true,
9
+ cwd() {
10
+ return '/';
11
+ },
12
+ env: {},
13
+ platform: 'android'
14
+ };
15
+
16
+ const existingProcess = globalThis.process;
17
+
18
+ if (!existingProcess) {
19
+ globalThis.process = browserProcess;
20
+ return;
21
+ }
22
+
23
+ if (existingProcess.versions?.node) {
24
+ return;
25
+ }
26
+
27
+ const existingProcessRecord = existingProcess;
28
+
29
+ for (const [key, value] of Object.entries(browserProcess)) {
30
+ existingProcessRecord[key] ??= value;
31
+ }
32
+
33
+ existingProcessRecord['browser'] = true;
34
+ }
35
+
36
+ ensureBrowserProcess();
37
+ })();
38
+
39
+ "use strict";
40
+ var __defProp = Object.defineProperty;
41
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
42
+ var __getOwnPropNames = Object.getOwnPropertyNames;
43
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
44
+ var __export = (target, all) => {
45
+ for (var name in all)
46
+ __defProp(target, name, { get: all[name], enumerable: true });
47
+ };
48
+ var __copyProps = (to, from, except, desc) => {
49
+ if (from && typeof from === "object" || typeof from === "function") {
50
+ for (let key of __getOwnPropNames(from))
51
+ if (!__hasOwnProp.call(to, key) && key !== except)
52
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
53
+ }
54
+ return to;
55
+ };
56
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
57
+ var repo_homepage_exports = {};
58
+ __export(repo_homepage_exports, {
59
+ syncRepoHomepage: () => syncRepoHomepage
60
+ });
61
+ module.exports = __toCommonJS(repo_homepage_exports);
62
+ var import_root = require('../root.cjs');
63
+ async function syncRepoHomepage(params) {
64
+ const { homepageUrl, mode, owner, repo } = params;
65
+ const repoSlug = `${owner}/${repo}`;
66
+ const fixCommand = `gh repo edit ${repoSlug} --homepage ${homepageUrl}`;
67
+ let currentHomepage;
68
+ try {
69
+ const output = await (0, import_root.execFromRoot)(["gh", "api", `repos/${repoSlug}`, "--jq", '.homepage // ""'], { isQuiet: true });
70
+ currentHomepage = output.trim();
71
+ } catch (error) {
72
+ warn(`Could not read the GitHub homepage of ${repoSlug} (${describeError(error)}). To set it: ${fixCommand}`);
73
+ return;
74
+ }
75
+ if (currentHomepage === homepageUrl) {
76
+ return;
77
+ }
78
+ const shownHomepage = currentHomepage === "" ? "empty" : `'${currentHomepage}'`;
79
+ if (mode === "check") {
80
+ warn(`The GitHub homepage of ${repoSlug} is ${shownHomepage}, not the site ${homepageUrl}. To set it: ${fixCommand}`);
81
+ return;
82
+ }
83
+ try {
84
+ await (0, import_root.execFromRoot)(["gh", "api", "--method", "PATCH", `repos/${repoSlug}`, "-f", `homepage=${homepageUrl}`], { isQuiet: true });
85
+ } catch (error) {
86
+ warn(
87
+ `The GitHub homepage of ${repoSlug} is ${shownHomepage}, not the site ${homepageUrl}, and setting it failed: ${describeError(error)}. A workflow token cannot change repository settings; with an account that can: ${fixCommand}`
88
+ );
89
+ return;
90
+ }
91
+ console.warn(`Set the GitHub homepage of ${repoSlug} to ${homepageUrl} (was ${shownHomepage}).`);
92
+ }
93
+ function describeError(error) {
94
+ const message = error instanceof Error ? error.message : String(error);
95
+ const newlineIndex = message.indexOf("\n");
96
+ return newlineIndex === -1 ? message : message.slice(0, newlineIndex);
97
+ }
98
+ function warn(message) {
99
+ console.warn(message);
100
+ if (process.env["GITHUB_ACTIONS"] === "true") {
101
+ console.warn(`::warning title=Repository homepage::${message}`);
102
+ }
103
+ }
104
+ // Annotate the CommonJS export names for ESM import in node:
105
+ 0 && (module.exports = {
106
+ syncRepoHomepage
107
+ });
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9kb2NzLXNpdGUvcmVwby1ob21lcGFnZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBmaWxlXG4gKlxuICogS2VlcHMgYSByZXBvc2l0b3J5J3MgR2l0SHViIGhvbWVwYWdlIHBvaW50aW5nIGF0IGl0cyBkb2N1bWVudGF0aW9uIHNpdGUuXG4gKlxuICogVGhlIFVSTCBpcyB0aGUgc2l0ZSdzIG93biAoYHNpdGVgICsgYGJhc2VgIG9mIGl0cyBBc3RybyBjb25maWd1cmF0aW9uKSwgc28gbm90aGluZyBoZXJlIGtub3dzIHdoaWNoIG9yaWdpbiBvclxuICogYWNjb3VudCBhIHNpdGUgYmVsb25ncyB0by4gSXQgcmVhZHMgYW5kIHdyaXRlcyB0aHJvdWdoIHRoZSBgZ2hgIENMSSB3aXRoIHdoYXRldmVyIGNyZWRlbnRpYWxzIGl0IGFscmVhZHkgaGFzLlxuICpcbiAqIEEgd29ya2Zsb3cncyBgR0lUSFVCX1RPS0VOYCBjYW5ub3QgY2hhbmdlIGEgcmVwb3NpdG9yeSdzIHNldHRpbmdzLCBzbyBpbiBDSSBhIG1pc21hdGNoIGlzIHJlcG9ydGVkLCBuZXZlciBmaXhlZDpcbiAqIHRoZSByZXBvcnQgcHJpbnRzIHRoZSBgZ2ggcmVwbyBlZGl0YCBsaW5lIHRoYXQgZml4ZXMgaXQuIE5vdGhpbmcgaGVyZSBldmVyIGZhaWxzIGEgYnVpbGQuXG4gKi9cblxuaW1wb3J0IHsgZXhlY0Zyb21Sb290IH0gZnJvbSAnLi4vcm9vdC50cyc7XG5cbi8qKlxuICogV2hhdCBhIHNpdGUgYnVpbGQgZG9lcyBhYm91dCBpdHMgcmVwb3NpdG9yeSdzIEdpdEh1YiBob21lcGFnZS5cbiAqXG4gKiAtIGBvZmZgOiBub3RoaW5nLlxuICogLSBgY2hlY2tgOiByZXBvcnQgYSBob21lcGFnZSB0aGF0IGlzIG5vdCB0aGUgc2l0ZSdzIFVSTCwgd2l0aCB0aGUgY29tbWFuZCB0aGF0IHNldHMgaXQuXG4gKiAtIGBzZXRgOiBzZXQgYSBob21lcGFnZSB0aGF0IGlzIG5vdCB0aGUgc2l0ZSdzIFVSTCwgYW5kIHJlcG9ydCBpdCB3aGVuIHRoZSBjcmVkZW50aWFscyBjYW5ub3QuXG4gKi9cbmV4cG9ydCB0eXBlIFJlcG9Ib21lcGFnZU1vZGUgPSAnY2hlY2snIHwgJ29mZicgfCAnc2V0JztcblxuLyoqXG4gKiBQYXJhbXMgZm9yIHtAbGluayBzeW5jUmVwb0hvbWVwYWdlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTeW5jUmVwb0hvbWVwYWdlUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBVUkwgdGhlIGhvbWVwYWdlIHNob3VsZCBiZTogdGhlIHNpdGUncyBiYXNlIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IGhvbWVwYWdlVXJsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2V0IGEgbWlzbWF0Y2hlZCBob21lcGFnZSBvciBvbmx5IHJlcG9ydCBpdC5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGU6IEV4Y2x1ZGU8UmVwb0hvbWVwYWdlTW9kZSwgJ29mZic+O1xuXG4gIC8qKlxuICAgKiBUaGUgR2l0SHViIGFjY291bnQgdGhlIHJlcG9zaXRvcnkgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IG93bmVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5J3MgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IHJlcG86IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBhIHJlcG9zaXRvcnkncyBHaXRIdWIgaG9tZXBhZ2Ugd2l0aCBpdHMgc2l0ZSdzIFVSTCwgYW5kIHNldHMgaXQgb3IgcmVwb3J0cyB0aGUgbWlzbWF0Y2guXG4gKlxuICogSXQgb25seSB3YXJuczogYW4gdW5yZWFkYWJsZSByZXBvc2l0b3J5LCBhIG1pc21hdGNoIGl0IG1heSBub3QgZml4IGFuZCBhIGZhaWxlZCB1cGRhdGUgZWFjaCBwcmludCB0aGUgcmVhc29uIGFuZFxuICogdGhlIGBnaCByZXBvIGVkaXRgIGxpbmUsIGFuZCBpbnNpZGUgR2l0SHViIEFjdGlvbnMgYWxzbyBhIGA6Ondhcm5pbmc6OmAgYW5ub3RhdGlvbi5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHJlcG9zaXRvcnksIHRoZSBzaXRlJ3MgVVJMIGFuZCB0aGUgbW9kZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bmNSZXBvSG9tZXBhZ2UocGFyYW1zOiBTeW5jUmVwb0hvbWVwYWdlUGFyYW1zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgaG9tZXBhZ2VVcmwsIG1vZGUsIG93bmVyLCByZXBvIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHJlcG9TbHVnID0gYCR7b3duZXJ9LyR7cmVwb31gO1xuICBjb25zdCBmaXhDb21tYW5kID0gYGdoIHJlcG8gZWRpdCAke3JlcG9TbHVnfSAtLWhvbWVwYWdlICR7aG9tZXBhZ2VVcmx9YDtcblxuICBsZXQgY3VycmVudEhvbWVwYWdlOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gYXdhaXQgZXhlY0Zyb21Sb290KFsnZ2gnLCAnYXBpJywgYHJlcG9zLyR7cmVwb1NsdWd9YCwgJy0tanEnLCAnLmhvbWVwYWdlIC8vIFwiXCInXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICAgIGN1cnJlbnRIb21lcGFnZSA9IG91dHB1dC50cmltKCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgd2FybihgQ291bGQgbm90IHJlYWQgdGhlIEdpdEh1YiBob21lcGFnZSBvZiAke3JlcG9TbHVnfSAoJHtkZXNjcmliZUVycm9yKGVycm9yKX0pLiBUbyBzZXQgaXQ6ICR7Zml4Q29tbWFuZH1gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoY3VycmVudEhvbWVwYWdlID09PSBob21lcGFnZVVybCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNob3duSG9tZXBhZ2UgPSBjdXJyZW50SG9tZXBhZ2UgPT09ICcnID8gJ2VtcHR5JyA6IGAnJHtjdXJyZW50SG9tZXBhZ2V9J2A7XG5cbiAgaWYgKG1vZGUgPT09ICdjaGVjaycpIHtcbiAgICB3YXJuKGBUaGUgR2l0SHViIGhvbWVwYWdlIG9mICR7cmVwb1NsdWd9IGlzICR7c2hvd25Ib21lcGFnZX0sIG5vdCB0aGUgc2l0ZSAke2hvbWVwYWdlVXJsfS4gVG8gc2V0IGl0OiAke2ZpeENvbW1hbmR9YCk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBhd2FpdCBleGVjRnJvbVJvb3QoWydnaCcsICdhcGknLCAnLS1tZXRob2QnLCAnUEFUQ0gnLCBgcmVwb3MvJHtyZXBvU2x1Z31gLCAnLWYnLCBgaG9tZXBhZ2U9JHtob21lcGFnZVVybH1gXSwgeyBpc1F1aWV0OiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHdhcm4oXG4gICAgICBgVGhlIEdpdEh1YiBob21lcGFnZSBvZiAke3JlcG9TbHVnfSBpcyAke3Nob3duSG9tZXBhZ2V9LCBub3QgdGhlIHNpdGUgJHtob21lcGFnZVVybH0sIGFuZCBzZXR0aW5nIGl0IGZhaWxlZDogJHtkZXNjcmliZUVycm9yKGVycm9yKX0uIGBcbiAgICAgICAgKyBgQSB3b3JrZmxvdyB0b2tlbiBjYW5ub3QgY2hhbmdlIHJlcG9zaXRvcnkgc2V0dGluZ3M7IHdpdGggYW4gYWNjb3VudCB0aGF0IGNhbjogJHtmaXhDb21tYW5kfWBcbiAgICApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnNvbGUud2FybihgU2V0IHRoZSBHaXRIdWIgaG9tZXBhZ2Ugb2YgJHtyZXBvU2x1Z30gdG8gJHtob21lcGFnZVVybH0gKHdhcyAke3Nob3duSG9tZXBhZ2V9KS5gKTtcbn1cblxuLy8gVGhlIGZpcnN0IGxpbmUgb25seTogYGV4ZWNGcm9tUm9vdGAncyBlcnJvciBjYXJyaWVzIHRoZSB3aG9sZSBjb21tYW5kLCBzdGRlcnIgYW5kIHN0ZG91dCBhZnRlciBpdC5cbmZ1bmN0aW9uIGRlc2NyaWJlRXJyb3IoZXJyb3I6IHVua25vd24pOiBzdHJpbmcge1xuICBjb25zdCBtZXNzYWdlID0gZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpO1xuICBjb25zdCBuZXdsaW5lSW5kZXggPSBtZXNzYWdlLmluZGV4T2YoJ1xcbicpO1xuICByZXR1cm4gbmV3bGluZUluZGV4ID09PSAtMSA/IG1lc3NhZ2UgOiBtZXNzYWdlLnNsaWNlKDAsIG5ld2xpbmVJbmRleCk7XG59XG5cbmZ1bmN0aW9uIHdhcm4obWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnNvbGUud2FybihtZXNzYWdlKTtcbiAgaWYgKHByb2Nlc3MuZW52WydHSVRIVUJfQUNUSU9OUyddID09PSAndHJ1ZScpIHtcbiAgICBjb25zb2xlLndhcm4oYDo6d2FybmluZyB0aXRsZT1SZXBvc2l0b3J5IGhvbWVwYWdlOjoke21lc3NhZ2V9YCk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBWUEsa0JBQTZCO0FBNEM3QixlQUFzQixpQkFBaUIsUUFBK0M7QUFDcEYsUUFBTSxFQUFFLGFBQWEsTUFBTSxPQUFPLEtBQUssSUFBSTtBQUMzQyxRQUFNLFdBQVcsR0FBRyxLQUFLLElBQUksSUFBSTtBQUNqQyxRQUFNLGFBQWEsZ0JBQWdCLFFBQVEsZUFBZSxXQUFXO0FBRXJFLE1BQUk7QUFDSixNQUFJO0FBQ0YsVUFBTSxTQUFTLFVBQU0sMEJBQWEsQ0FBQyxNQUFNLE9BQU8sU0FBUyxRQUFRLElBQUksUUFBUSxpQkFBaUIsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQ2xILHNCQUFrQixPQUFPLEtBQUs7QUFBQSxFQUNoQyxTQUFTLE9BQU87QUFDZCxTQUFLLHlDQUF5QyxRQUFRLEtBQUssY0FBYyxLQUFLLENBQUMsaUJBQWlCLFVBQVUsRUFBRTtBQUM1RztBQUFBLEVBQ0Y7QUFFQSxNQUFJLG9CQUFvQixhQUFhO0FBQ25DO0FBQUEsRUFDRjtBQUVBLFFBQU0sZ0JBQWdCLG9CQUFvQixLQUFLLFVBQVUsSUFBSSxlQUFlO0FBRTVFLE1BQUksU0FBUyxTQUFTO0FBQ3BCLFNBQUssMEJBQTBCLFFBQVEsT0FBTyxhQUFhLGtCQUFrQixXQUFXLGdCQUFnQixVQUFVLEVBQUU7QUFDcEg7QUFBQSxFQUNGO0FBRUEsTUFBSTtBQUNGLGNBQU0sMEJBQWEsQ0FBQyxNQUFNLE9BQU8sWUFBWSxTQUFTLFNBQVMsUUFBUSxJQUFJLE1BQU0sWUFBWSxXQUFXLEVBQUUsR0FBRyxFQUFFLFNBQVMsS0FBSyxDQUFDO0FBQUEsRUFDaEksU0FBUyxPQUFPO0FBQ2Q7QUFBQSxNQUNFLDBCQUEwQixRQUFRLE9BQU8sYUFBYSxrQkFBa0IsV0FBVyw0QkFBNEIsY0FBYyxLQUFLLENBQUMsbUZBQzlDLFVBQVU7QUFBQSxJQUNqRztBQUNBO0FBQUEsRUFDRjtBQUVBLFVBQVEsS0FBSyw4QkFBOEIsUUFBUSxPQUFPLFdBQVcsU0FBUyxhQUFhLElBQUk7QUFDakc7QUFHQSxTQUFTLGNBQWMsT0FBd0I7QUFDN0MsUUFBTSxVQUFVLGlCQUFpQixRQUFRLE1BQU0sVUFBVSxPQUFPLEtBQUs7QUFDckUsUUFBTSxlQUFlLFFBQVEsUUFBUSxJQUFJO0FBQ3pDLFNBQU8saUJBQWlCLEtBQUssVUFBVSxRQUFRLE1BQU0sR0FBRyxZQUFZO0FBQ3RFO0FBRUEsU0FBUyxLQUFLLFNBQXVCO0FBQ25DLFVBQVEsS0FBSyxPQUFPO0FBQ3BCLE1BQUksUUFBUSxJQUFJLGdCQUFnQixNQUFNLFFBQVE7QUFDNUMsWUFBUSxLQUFLLHdDQUF3QyxPQUFPLEVBQUU7QUFBQSxFQUNoRTtBQUNGOyIsIm5hbWVzIjpbXX0=
@@ -0,0 +1,50 @@
1
+ /// <reference path="../library-references.d.cts" />
2
+ /**
3
+ * @file
4
+ *
5
+ * Keeps a repository's GitHub homepage pointing at its documentation site.
6
+ *
7
+ * The URL is the site's own (`site` + `base` of its Astro configuration), so nothing here knows which origin or
8
+ * account a site belongs to. It reads and writes through the `gh` CLI with whatever credentials it already has.
9
+ *
10
+ * A workflow's `GITHUB_TOKEN` cannot change a repository's settings, so in CI a mismatch is reported, never fixed:
11
+ * the report prints the `gh repo edit` line that fixes it. Nothing here ever fails a build.
12
+ */
13
+ /**
14
+ * What a site build does about its repository's GitHub homepage.
15
+ *
16
+ * - `off`: nothing.
17
+ * - `check`: report a homepage that is not the site's URL, with the command that sets it.
18
+ * - `set`: set a homepage that is not the site's URL, and report it when the credentials cannot.
19
+ */
20
+ export type RepoHomepageMode = 'check' | 'off' | 'set';
21
+ /**
22
+ * Params for {@link syncRepoHomepage}.
23
+ */
24
+ export interface SyncRepoHomepageParams {
25
+ /**
26
+ * The URL the homepage should be: the site's base URL.
27
+ */
28
+ readonly homepageUrl: string;
29
+ /**
30
+ * Whether to set a mismatched homepage or only report it.
31
+ */
32
+ readonly mode: Exclude<RepoHomepageMode, 'off'>;
33
+ /**
34
+ * The GitHub account the repository belongs to.
35
+ */
36
+ readonly owner: string;
37
+ /**
38
+ * The repository's name.
39
+ */
40
+ readonly repo: string;
41
+ }
42
+ /**
43
+ * Compares a repository's GitHub homepage with its site's URL, and sets it or reports the mismatch.
44
+ *
45
+ * It only warns: an unreadable repository, a mismatch it may not fix and a failed update each print the reason and
46
+ * the `gh repo edit` line, and inside GitHub Actions also a `::warning::` annotation.
47
+ *
48
+ * @param params - The repository, the site's URL and the mode.
49
+ */
50
+ export declare function syncRepoHomepage(params: SyncRepoHomepageParams): Promise<void>;
@@ -0,0 +1,59 @@
1
+ /*
2
+ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
3
+ if you want to view the source, please visit the github repository of this plugin
4
+ */
5
+
6
+ "use strict";
7
+ var __defProp = Object.defineProperty;
8
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
9
+ var __getOwnPropNames = Object.getOwnPropertyNames;
10
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
11
+ var __export = (target, all) => {
12
+ for (var name in all)
13
+ __defProp(target, name, { get: all[name], enumerable: true });
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") {
17
+ for (let key of __getOwnPropNames(from))
18
+ if (!__hasOwnProp.call(to, key) && key !== except)
19
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
20
+ }
21
+ return to;
22
+ };
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var auto_exports = {};
25
+ __export(auto_exports, {
26
+ detectFormatter: () => detectFormatter,
27
+ format: () => format
28
+ });
29
+ module.exports = __toCommonJS(auto_exports);
30
+ var import_node_fs = require('node:fs');
31
+ var import_repo_paths = require('../repo-paths.cjs');
32
+ var import_root = require('../root.cjs');
33
+ var import_biome = require('./biome.cjs');
34
+ var import_dprint = require('./dprint.cjs');
35
+ var import_prettier = require('./prettier.cjs');
36
+ const FORMATTERS = {
37
+ biome: import_biome.format,
38
+ dprint: import_dprint.format,
39
+ prettier: import_prettier.format
40
+ };
41
+ async function detectFormatter() {
42
+ if ((0, import_node_fs.existsSync)((0, import_root.resolvePathFromRootSafe)({ path: import_repo_paths.RepoPaths.DprintJson }))) {
43
+ return "dprint";
44
+ }
45
+ if (await (0, import_prettier.hasPrettierConfig)()) {
46
+ return "prettier";
47
+ }
48
+ return (0, import_biome.hasBiomeConfig)() ? "biome" : "dprint";
49
+ }
50
+ async function format(options) {
51
+ const { formatter = await detectFormatter(), ...formatOptions } = options ?? {};
52
+ await FORMATTERS[formatter](formatOptions);
53
+ }
54
+ // Annotate the CommonJS export names for ESM import in node:
55
+ 0 && (module.exports = {
56
+ detectFormatter,
57
+ format
58
+ });
59
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL2Zvcm1hdHRlcnMvYXV0by50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIEZvcm1hdHMgdGhlIHNvdXJjZSBjb2RlIHdpdGggd2hpY2hldmVyIGZvcm1hdHRlciB0aGUgcHJvamVjdCBjb25maWd1cmVzOiBkcHJpbnQsIFByZXR0aWVyIG9yIEJpb21lLlxuICovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcblxuaW1wb3J0IHsgUmVwb1BhdGhzIH0gZnJvbSAnLi4vcmVwby1wYXRocy50cyc7XG5pbXBvcnQgeyByZXNvbHZlUGF0aEZyb21Sb290U2FmZSB9IGZyb20gJy4uL3Jvb3QudHMnO1xuaW1wb3J0IHtcbiAgZm9ybWF0IGFzIGZvcm1hdFdpdGhCaW9tZSxcbiAgaGFzQmlvbWVDb25maWdcbn0gZnJvbSAnLi9iaW9tZS50cyc7XG5pbXBvcnQgeyBmb3JtYXQgYXMgZm9ybWF0V2l0aERwcmludCB9IGZyb20gJy4vZHByaW50LnRzJztcbmltcG9ydCB7XG4gIGZvcm1hdCBhcyBmb3JtYXRXaXRoUHJldHRpZXIsXG4gIGhhc1ByZXR0aWVyQ29uZmlnXG59IGZyb20gJy4vcHJldHRpZXIudHMnO1xuXG4vKipcbiAqIEEgZm9ybWF0dGVyIHRoZSB0b29sa2l0IHJ1bnMuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcm1hdHRlciA9ICdiaW9tZScgfCAnZHByaW50JyB8ICdwcmV0dGllcic7XG5cbmNvbnN0IEZPUk1BVFRFUlM6IFJlYWRvbmx5PFJlY29yZDxGb3JtYXR0ZXIsIChvcHRpb25zOiBGb3JtYXRPcHRpb25zKSA9PiBQcm9taXNlPHZvaWQ+Pj4gPSB7XG4gIGJpb21lOiBmb3JtYXRXaXRoQmlvbWUsXG4gIGRwcmludDogZm9ybWF0V2l0aERwcmludCxcbiAgcHJldHRpZXI6IGZvcm1hdFdpdGhQcmV0dGllclxufTtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB0aGUge0BsaW5rIGZvcm1hdH0gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRm9ybWF0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgY29uZmlndXJhdGlvbiBmaWxlIHVzZWQgd2hlbiB0aGUgcHJvamVjdCBoYXMgbm9uZSBvZiBpdHMgb3duLCBhcyB0aGUgY2hvc2VuIGZvcm1hdHRlcidzIG93biBgZm9ybWF0YCB0YWtlc1xuICAgKiBpdC5cbiAgICovXG4gIHJlYWRvbmx5IGRlZmF1bHRDb25maWdGaWxlUGF0aD86IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhlIGZvcm1hdHRlciB0byBydW4uIE9taXR0ZWQsIHtAbGluayBkZXRlY3RGb3JtYXR0ZXJ9IGNob29zZXMgaXQuXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0ZXI/OiBGb3JtYXR0ZXIgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGZpbGUgcGF0aHMgdG8gZm9ybWF0LiBJZiBvbWl0dGVkLCBmb3JtYXRzIHRoZSBlbnRpcmUgcHJvamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhzPzogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gcmV3cml0ZSB0aGUgc291cmNlIGNvZGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGB0cnVlYFxuICAgKi9cbiAgcmVhZG9ubHkgcmV3cml0ZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ2hvb3NlcyB0aGUgZm9ybWF0dGVyIGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZXMgYXQgdGhlIHByb2plY3Qgcm9vdC5cbiAqXG4gKiBUaGUgb3JkZXIgaXMgYGRwcmludC5qc29uYCwgdGhlbiBhIFByZXR0aWVyIGNvbmZpZ3VyYXRpb24sIHRoZW4gYGJpb21lLmpzb25gIC8gYGJpb21lLmpzb25jYCwgc28gYSBwcm9qZWN0IHRoYXRcbiAqIGxpbnRzIHdpdGggQmlvbWUgYW5kIGxheXMgb3V0IHdpdGggUHJldHRpZXIgZ2V0cyBQcmV0dGllci4gQSBwcm9qZWN0IHdpdGggbm9uZSBvZiB0aGVtIGdldHMgZHByaW50LCBhcyBiZWZvcmVcbiAqIFByZXR0aWVyIGFuZCBCaW9tZSB3ZXJlIHN1cHBvcnRlZC5cbiAqXG4gKiBAcmV0dXJucyBUaGUgZm9ybWF0dGVyIHRvIHJ1bi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRldGVjdEZvcm1hdHRlcigpOiBQcm9taXNlPEZvcm1hdHRlcj4ge1xuICBpZiAoZXhpc3RzU3luYyhyZXNvbHZlUGF0aEZyb21Sb290U2FmZSh7IHBhdGg6IFJlcG9QYXRocy5EcHJpbnRKc29uIH0pKSkge1xuICAgIHJldHVybiAnZHByaW50JztcbiAgfVxuXG4gIGlmIChhd2FpdCBoYXNQcmV0dGllckNvbmZpZygpKSB7XG4gICAgcmV0dXJuICdwcmV0dGllcic7XG4gIH1cblxuICByZXR1cm4gaGFzQmlvbWVDb25maWcoKSA/ICdiaW9tZScgOiAnZHByaW50Jztcbn1cblxuLyoqXG4gKiBGb3JtYXRzIHRoZSBzb3VyY2UgY29kZSB3aXRoIHRoZSBwcm9qZWN0J3MgZm9ybWF0dGVyLlxuICpcbiAqIEBwYXJhbSBvcHRpb25zIC0gVGhlIHtAbGluayBGb3JtYXRPcHRpb25zfS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgc291cmNlIGNvZGUgaGFzIGJlZW4gZm9ybWF0dGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0KG9wdGlvbnM/OiBGb3JtYXRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHsgZm9ybWF0dGVyID0gYXdhaXQgZGV0ZWN0Rm9ybWF0dGVyKCksIC4uLmZvcm1hdE9wdGlvbnMgfSA9IG9wdGlvbnMgPz8ge307XG4gIGF3YWl0IEZPUk1BVFRFUlNbZm9ybWF0dGVyXShmb3JtYXRPcHRpb25zKTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBTUEscUJBQTJCO0FBRTNCLHdCQUEwQjtBQUMxQixrQkFBd0M7QUFDeEMsbUJBR087QUFDUCxvQkFBMkM7QUFDM0Msc0JBR087QUFPUCxNQUFNLGFBQXFGO0FBQUEsRUFDekYsT0FBTyxhQUFBQTtBQUFBLEVBQ1AsUUFBUSxjQUFBQztBQUFBLEVBQ1IsVUFBVSxnQkFBQUM7QUFDWjtBQXVDQSxlQUFzQixrQkFBc0M7QUFDMUQsVUFBSSwrQkFBVyxxQ0FBd0IsRUFBRSxNQUFNLDRCQUFVLFdBQVcsQ0FBQyxDQUFDLEdBQUc7QUFDdkUsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLFVBQU0sbUNBQWtCLEdBQUc7QUFDN0IsV0FBTztBQUFBLEVBQ1Q7QUFFQSxhQUFPLDZCQUFlLElBQUksVUFBVTtBQUN0QztBQVFBLGVBQXNCLE9BQU8sU0FBd0M7QUFDbkUsUUFBTSxFQUFFLFlBQVksTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLGNBQWMsSUFBSSxXQUFXLENBQUM7QUFDOUUsUUFBTSxXQUFXLFNBQVMsRUFBRSxhQUFhO0FBQzNDOyIsCiAgIm5hbWVzIjogWyJmb3JtYXRXaXRoQmlvbWUiLCAiZm9ybWF0V2l0aERwcmludCIsICJmb3JtYXRXaXRoUHJldHRpZXIiXQp9Cg==