@dbx-tools/databricks 0.6.46 → 0.6.49

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/lib/src/cloud.js CHANGED
@@ -22,7 +22,7 @@ import { mkdir, readFile, rename, unlink, writeFile } from "node:fs/promises";
22
22
  import { tmpdir } from "node:os";
23
23
  import { dirname, join } from "node:path";
24
24
  import { file } from "@dbx-tools/core";
25
- import { error, functionModule, hash, http, log, net } from "@dbx-tools/shared-core";
25
+ import { error, functionModule, hash, http, json, log, net } from "@dbx-tools/shared-core";
26
26
  import { resolveHostIps } from "./net.js";
27
27
  const logger = log.logger("cloud");
28
28
  /** How long a fetched provider IP-range feed is reused before refetch. */
@@ -180,9 +180,19 @@ function addRange(ranges, cidr, region) {
180
180
  if (parsed)
181
181
  ranges.push({ ...parsed, region });
182
182
  }
183
+ /**
184
+ * Fetch and parse a provider feed. A parse failure names the URL rather than
185
+ * surfacing an opaque `Unexpected token` - the text may come from the on-disk
186
+ * cache, so "which feed" is the part worth knowing. {@link loadProviderRanges}
187
+ * turns the throw into a per-provider warning.
188
+ */
183
189
  async function fetchJson(url) {
184
190
  const text = await fetchText(url);
185
- return JSON.parse(text);
191
+ const parsed = json.parse(text);
192
+ if (parsed === undefined) {
193
+ throw new Error(`range feed returned non-JSON content: ${url}`);
194
+ }
195
+ return parsed;
186
196
  }
187
197
  /**
188
198
  * Fetch `url` as text with a 24h on-disk cache under the OS temp dir
@@ -227,4 +237,4 @@ async function fetchText(url) {
227
237
  async function getCreated(path) {
228
238
  return (await file.statSync(path))?.birthtime;
229
239
  }
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFMUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztBQUVuQywwRUFBMEU7QUFDMUUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRXRELGtFQUFrRTtBQUNsRSxNQUFNLGNBQWMsR0FBRyxnREFBZ0QsQ0FBQztBQUN4RSxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFDckU7Ozs7R0FJRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsZ0VBQWdFLENBQUM7QUFDN0YsOEZBQThGO0FBQzlGLE1BQU0sZUFBZSxHQUNuQixrRkFBa0YsQ0FBQztBQUVyRiw4Q0FBOEM7QUFDOUMsTUFBTSxDQUFOLElBQVksYUFJWDtBQUpELFdBQVksYUFBYTtJQUN2Qiw0QkFBVyxDQUFBO0lBQ1gsZ0NBQWUsQ0FBQTtJ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QUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJlc3QtZWZmb3J0IGdlb2xvY2F0aW9uIG9mIGEgaG9zdCB0byB0aGUgY2xvdWQgcHJvdmlkZXIgYW5kIHJlZ2lvbiBpdFxuICogcnVucyBpbi4gUmVzb2x2ZXMgdGhlIGhvc3QgdG8gaXRzIElQIGFkZHJlc3MoZXMpIHZpYSBETlMsIHRoZW4gbWF0Y2hlc1xuICogdGhvc2UgYWRkcmVzc2VzIGFnYWluc3QgdGhlIHB1YmxpYyBJUC1yYW5nZSBmZWVkcyBlYWNoIGh5cGVyc2NhbGVyXG4gKiBwdWJsaXNoZXMgKEFXUywgQXp1cmUsIEdDUCkuIEhhbmR5IGZvciBwbGFjaW5nIGEgRGF0YWJyaWNrcyB3b3Jrc3BhY2VcbiAqIFVSTCwgYnV0IHdvcmtzIGZvciBhbnkgaG9zdC5cbiAqXG4gKiBUaGUgcmFuZ2UgZmVlZHMgYXJlIGxhcmdlIGFuZCBjaGFuZ2Ugc2xvd2x5LCBzbyBlYWNoIHByb3ZpZGVyJ3MgZmVlZFxuICogaXMgY2FjaGVkIGZvciB7QGxpbmsgUkFOR0VfQ0FDSEVfVFRMX01TfSAoMjQgaG91cnMpIGF0IHR3byBsYXllcnM6IGFuXG4gKiBvbi1kaXNrIGNvcHkgdW5kZXIgdGhlIE9TIHRlbXAgZGlyIChzdXJ2aXZlcyBwcm9jZXNzIHJlc3RhcnRzLCBzaGFyZWRcbiAqIGFjcm9zcyBwcm9jZXNzZXMpIHBsdXMgYW4gaW4tcHJvY2VzcyBtZW1vaXplZCBwYXJzZS4gQSBwcm92aWRlciB3aG9zZVxuICogZmVlZCBmYWlscyB0byBsb2FkIGlzIHNraXBwZWQgcmF0aGVyIHRoYW4gZmFpbGluZyB0aGUgd2hvbGUgbG9va3VwIC1cbiAqIHRoZSBvdGhlciBwcm92aWRlcnMgc3RpbGwgYW5zd2VyLlxuICpcbiAqIFNlcnZlci1vbmx5OiBETlMgcmVzb2x1dGlvbiBuZWVkcyBgbm9kZTpkbnNgICh2aWEgYC4vbmV0LnRzYCksIHRoZVxuICogZGlzayBjYWNoZSBuZWVkcyBgbm9kZTpmc2AgLyBgbm9kZTpvc2AgLyBgbm9kZTpwYXRoYCwgYW5kIHRoZSBmZWVkc1xuICogYXJlIGZldGNoZWQgd2l0aCB0aGUgZ2xvYmFsIGBmZXRjaGAuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IG1rZGlyLCByZWFkRmlsZSwgcmVuYW1lLCB1bmxpbmssIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyB0bXBkaXIgfSBmcm9tIFwibm9kZTpvc1wiO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcblxuaW1wb3J0IHsgZmlsZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2NvcmVcIjtcbmltcG9ydCB7IGVycm9yLCBmdW5jdGlvbk1vZHVsZSwgaGFzaCwgaHR0cCwgbG9nLCBuZXQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgcmVzb2x2ZUhvc3RJcHMgfSBmcm9tIFwiLi9uZXQudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcImNsb3VkXCIpO1xuXG4vKiogSG93IGxvbmcgYSBmZXRjaGVkIHByb3ZpZGVyIElQLXJhbmdlIGZlZWQgaXMgcmV1c2VkIGJlZm9yZSByZWZldGNoLiAqL1xuZXhwb3J0IGNvbnN0IFJBTkdFX0NBQ0hFX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbi8qKiBBV1MgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgQVdTX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vaXAtcmFuZ2VzLmFtYXpvbmF3cy5jb20vaXAtcmFuZ2VzLmpzb25cIjtcbi8qKiBHQ1AgcHVibGlzaGVzIGEgc2luZ2xlIHN0YWJsZSwgdW5hdXRoZW50aWNhdGVkIHJhbmdlcyBmZWVkLiAqL1xuY29uc3QgR0NQX1JBTkdFU19VUkwgPSBcImh0dHBzOi8vd3d3LmdzdGF0aWMuY29tL2lwcmFuZ2VzL2Nsb3VkLmpzb25cIjtcbi8qKlxuICogQXp1cmUgaGFzIG5vIHN0YWJsZSBmZWVkIFVSTCAtIHRoZSBKU09OIGRvd25sb2FkIGxpbmsgKHdpdGggYVxuICogcm90YXRpbmcgZGF0ZSBzdGFtcCkgbGl2ZXMgb24gdGhpcyBodW1hbi1mYWNpbmcgZG93bmxvYWQgcGFnZSBhbmRcbiAqIG11c3QgYmUgc2NyYXBlZCBvdXQuIFNlZSB7QGxpbmsgZmV0Y2hBenVyZVJhbmdlc30uXG4gKi9cbmNvbnN0IEFaVVJFX0RPV05MT0FEX1BBR0UgPSBcImh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4tdXMvZG93bmxvYWQvZGV0YWlscy5hc3B4P2lkPTU2NTE5XCI7XG4vKiogUmVnZXggdGhhdCBwbHVja3MgdGhlIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIEF6dXJlIHBhZ2UuICovXG5jb25zdCBBWlVSRV9KU09OX0xJTksgPVxuICAvaHR0cHM6XFwvXFwvZG93bmxvYWRcXC5taWNyb3NvZnRcXC5jb21cXC9kb3dubG9hZFxcL1teXCInXSpTZXJ2aWNlVGFnc19QdWJsaWNfXFxkK1xcLmpzb24vO1xuXG4vKiogQ2xvdWQgaHlwZXJzY2FsZXIgYSBob3N0IHJlc29sdmVzIGludG8uICovXG5leHBvcnQgZW51bSBDbG91ZFByb3ZpZGVyIHtcbiAgQXdzID0gXCJhd3NcIixcbiAgQXp1cmUgPSBcImF6dXJlXCIsXG4gIEdjcCA9IFwiZ2NwXCIsXG59XG5cbi8qKlxuICogV2hlcmUgYSBob3N0IGxpdmVzOiB0aGUge0BsaW5rIENsb3VkUHJvdmlkZXJ9LCB0aGUgcHJvdmlkZXItbmF0aXZlXG4gKiBgcmVnaW9uYCBzdHJpbmcgKHdoYXRldmVyIHRoZSBwcm92aWRlcidzIGZlZWQgY2FsbHMgaXQsIGUuZy5cbiAqIGBcInVzLWVhc3QtMVwiYCBvbiBBV1MsIGBcImVhc3R1czJcImAgb24gQXp1cmUsIGBcInVzLWVhc3QxXCJgIG9uIEdDUCksIHRoZVxuICogcmVzb2x2ZWQgYGlwYCB0aGF0IG1hdGNoZWQsIGFuZCB0aGUgYGNpZHJgIGJsb2NrIGl0IGZlbGwgaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xvdWRMb2NhdGlvbiB7XG4gIHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyO1xuICByZWdpb246IHN0cmluZztcbiAgaXA6IHN0cmluZztcbiAgY2lkcjogc3RyaW5nO1xufVxuXG4vKiogQSBwYXJzZWQgQ0lEUiBibG9jayB0YWdnZWQgd2l0aCB0aGUgcmVnaW9uIGl0IGJlbG9uZ3MgdG8uICovXG5pbnRlcmZhY2UgUmVnaW9uQ2lkciBleHRlbmRzIG5ldC5DaWRyIHtcbiAgcmVnaW9uOiBzdHJpbmc7XG59XG5cbi8qKiBPbmUgcHJvdmlkZXIncyBwYXJzZWQsIHJlZ2lvbi10YWdnZWQgcmFuZ2UgdGFibGUuICovXG5pbnRlcmZhY2UgUHJvdmlkZXJSYW5nZXMge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmFuZ2VzOiBSZWdpb25DaWRyW107XG59XG5cbi8qKlxuICogUmVzb2x2ZSBgaW5wdXRgJ3MgaG9zdCB0byBhIHtAbGluayBDbG91ZExvY2F0aW9ufSwgb3IgYG51bGxgIHdoZW4gdGhlXG4gKiBob3N0IGNhbid0IGJlIHJlc29sdmVkIG9yIG5vbmUgb2YgaXRzIElQcyBtYXRjaCBhIGtub3duIGNsb3VkIHJhbmdlLlxuICogYGlucHV0YCBpcyBhbnkge0BsaW5rIG5ldC5VcmxMaWtlfSAtIGEgVVJMLCBhIGJhcmUgaG9zdCwgb3IgYSBgeyB1cmwgfWBcbiAqIHdyYXBwZXIuXG4gKlxuICogVGhlIHByb3ZpZGVyIHJhbmdlIGZlZWRzIGFyZSBjYWNoZWQgZm9yIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LCBzb1xuICogb25seSB0aGUgZmlyc3QgY2FsbCBpbiBhIDI0LWhvdXIgd2luZG93IHBheXMgdGhlIGZldGNoIGNvc3Q7IHRoZSBETlNcbiAqIGxvb2t1cCBoYXBwZW5zIG9uIGV2ZXJ5IGNhbGwuXG4gKlxuICogQGV4YW1wbGVcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiaHR0cHM6Ly9hZGItMTIzNDU2Nzg5MC43LmF6dXJlZGF0YWJyaWNrcy5uZXRcIik7XG4gKiAvLyB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLFxuICogLy8gICByZWdpb246IFwiZWFzdHVzMlwiLCBpcDogXCIuLi5cIiwgY2lkcjogXCIuLi5cIiB9XG4gKlxuICogYXdhaXQgcmVzb2x2ZUNsb3VkTG9jYXRpb24oXCJkYmMtYWJjMTIzLmNsb3VkLmRhdGFicmlja3MuY29tXCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5Bd3MsXG4gKiAvLyAgIHJlZ2lvbjogXCJ1cy13ZXN0LTJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNsb3VkTG9jYXRpb24oaW5wdXQ6IG5ldC5VcmxMaWtlKTogUHJvbWlzZTxDbG91ZExvY2F0aW9uIHwgbnVsbD4ge1xuICBjb25zdCBpcHMgPSBhd2FpdCByZXNvbHZlSG9zdElwcyhpbnB1dCk7XG4gIGlmIChpcHMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwibm8gaXBzIHJlc29sdmVkXCIsIHsgaW5wdXQ6IFN0cmluZyhpbnB1dCkgfSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgY29uc3QgcHJvdmlkZXJzID0gYXdhaXQgbG9hZFByb3ZpZGVyUmFuZ2VzKCk7XG4gIGZvciAoY29uc3QgaXAgb2YgaXBzKSB7XG4gICAgY29uc3QgcGFyc2VkID0gbmV0LnBhcnNlSXAoaXApO1xuICAgIGlmICghcGFyc2VkKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHsgcHJvdmlkZXIsIHJhbmdlcyB9IG9mIHByb3ZpZGVycykge1xuICAgICAgY29uc3QgbWF0Y2ggPSBuZXQuZmluZENvbnRhaW5pbmdDaWRyKHBhcnNlZCwgcmFuZ2VzKTtcbiAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICByZXR1cm4geyBwcm92aWRlciwgcmVnaW9uOiBtYXRjaC5yZWdpb24sIGlwLCBjaWRyOiBtYXRjaC5jaWRyIH07XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcIm5vIGNsb3VkIHJhbmdlIG1hdGNoZWRcIiwgeyBpcHMgfSk7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIExvYWQgZXZlcnkgcHJvdmlkZXIncyByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLCBlYWNoIGNhY2hlZCBmb3JcbiAqIHtAbGluayBSQU5HRV9DQUNIRV9UVExfTVN9LiBQcm92aWRlcnMgYXJlIGxvYWRlZCBpbiBwYXJhbGxlbCBhbmQgYVxuICogZmVlZCB0aGF0IGZhaWxzIHRvIGZldGNoIG9yIHBhcnNlIGlzIGRyb3BwZWQgKGxvZ2dlZCwgbm90IHRocm93bikgc29cbiAqIGEgc2luZ2xlIGZsYWt5IGZlZWQgbmV2ZXIgc2lua3MgdGhlIHdob2xlIGxvb2t1cC4gRXhwb3NlZCBmb3IgY2FsbGVyc1xuICogdGhhdCB3YW50IHRvIG1hdGNoIG1hbnkgSVBzIGFnYWluc3Qgb25lIGNhY2hlZCBzbmFwc2hvdCB3aXRob3V0IGEgRE5TXG4gKiBzdGVwIHBlciBhZGRyZXNzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFByb3ZpZGVyUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXNbXT4ge1xuICBjb25zdCBzZXR0bGVkID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKFtsb2FkQXdzUmFuZ2VzKCksIGxvYWRBenVyZVJhbmdlcygpLCBsb2FkR2NwUmFuZ2VzKCldKTtcbiAgY29uc3Qgb3V0OiBQcm92aWRlclJhbmdlc1tdID0gW107XG4gIGZvciAoY29uc3QgcmVzdWx0IG9mIHNldHRsZWQpIHtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gXCJmdWxmaWxsZWRcIikgb3V0LnB1c2gocmVzdWx0LnZhbHVlKTtcbiAgICBlbHNlIGxvZ2dlci53YXJuKFwicHJvdmlkZXIgcmFuZ2UgbG9hZCBmYWlsZWRcIiwgeyBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKHJlc3VsdC5yZWFzb24pIH0pO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUGVyLXByb3ZpZGVyIGNhY2hlZCBsb2FkZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuY29uc3QgbG9hZEF3c1JhbmdlcyA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoZmV0Y2hBd3NSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcbmNvbnN0IGxvYWRBenVyZVJhbmdlcyA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoZmV0Y2hBenVyZVJhbmdlcywgeyB0dGxNczogUkFOR0VfQ0FDSEVfVFRMX01TIH0pO1xuY29uc3QgbG9hZEdjcFJhbmdlcyA9IGZ1bmN0aW9uTW9kdWxlLm1lbW9pemUoZmV0Y2hHY3BSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBQcm92aWRlciBmZWVkIGZldGNoICsgcGFyc2Vcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5pbnRlcmZhY2UgQXdzRmVlZCB7XG4gIHByZWZpeGVzPzogeyBpcF9wcmVmaXg/OiBzdHJpbmc7IHJlZ2lvbj86IHN0cmluZyB9W107XG4gIGlwdjZfcHJlZml4ZXM/OiB7IGlwdjZfcHJlZml4Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfVtdO1xufVxuXG4vKipcbiAqIEFXUyBgaXAtcmFuZ2VzLmpzb25gOiBhIGZsYXQgbGlzdCBvZiBJUHY0IChgcHJlZml4ZXNgKSBhbmQgSVB2NlxuICogKGBpcHY2X3ByZWZpeGVzYCkgYmxvY2tzLCBlYWNoIGFscmVhZHkgdGFnZ2VkIHdpdGggYSBgcmVnaW9uYCBzdWNoXG4gKiBhcyBgXCJ1cy1lYXN0LTFcImAgKG9yIGBcIkdMT0JBTFwiYCBmb3IgZWRnZSByYW5nZXMpLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEF3c1JhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248QXdzRmVlZD4oQVdTX1JBTkdFU19VUkwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQucHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwX3ByZWZpeCwgZW50cnkucmVnaW9uKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQuaXB2Nl9wcmVmaXhlcyA/PyBbXSkge1xuICAgIGFkZFJhbmdlKHJhbmdlcywgZW50cnkuaXB2Nl9wcmVmaXgsIGVudHJ5LnJlZ2lvbik7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGF3cyByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXdzLCByYW5nZXMgfTtcbn1cblxuaW50ZXJmYWNlIEdjcEZlZWQge1xuICBwcmVmaXhlcz86IHsgaXB2NFByZWZpeD86IHN0cmluZzsgaXB2NlByZWZpeD86IHN0cmluZzsgc2NvcGU/OiBzdHJpbmcgfVtdO1xufVxuXG4vKipcbiAqIEdDUCBgY2xvdWQuanNvbmA6IGEgbGlzdCBvZiBibG9ja3MgZWFjaCBjYXJyeWluZyBhbiBgaXB2NFByZWZpeGAgb3JcbiAqIGBpcHY2UHJlZml4YCBhbmQgYSBgc2NvcGVgIHRoYXQgaXMgdGhlIHJlZ2lvbiAoYFwidXMtZWFzdDFcImApIG9yXG4gKiBgXCJnbG9iYWxcImAgZm9yIG5vbi1yZWdpb25hbCByYW5nZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoR2NwUmFuZ2VzKCk6IFByb21pc2U8UHJvdmlkZXJSYW5nZXM+IHtcbiAgY29uc3QgZmVlZCA9IGF3YWl0IGZldGNoSnNvbjxHY3BGZWVkPihHQ1BfUkFOR0VTX1VSTCk7XG4gIGNvbnN0IHJhbmdlczogUmVnaW9uQ2lkcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgZmVlZC5wcmVmaXhlcyA/PyBbXSkge1xuICAgIGFkZFJhbmdlKHJhbmdlcywgZW50cnkuaXB2NFByZWZpeCA/PyBlbnRyeS5pcHY2UHJlZml4LCBlbnRyeS5zY29wZSk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwibG9hZGVkIGdjcCByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuR2NwLCByYW5nZXMgfTtcbn1cblxuaW50ZXJmYWNlIEF6dXJlRmVlZCB7XG4gIHZhbHVlcz86IHtcbiAgICBuYW1lPzogc3RyaW5nO1xuICAgIHByb3BlcnRpZXM/OiB7IHJlZ2lvbj86IHN0cmluZzsgYWRkcmVzc1ByZWZpeGVzPzogc3RyaW5nW10gfTtcbiAgfVtdO1xufVxuXG4vKipcbiAqIEF6dXJlIHNlcnZpY2UgdGFnczogTWljcm9zb2Z0IHNoaXBzIG5vIHN0YWJsZSBmZWVkIFVSTCwgc28gc2NyYXBlIHRoZVxuICogY3VycmVudCBgU2VydmljZVRhZ3NfUHVibGljXzxkYXRlPi5qc29uYCBsaW5rIG9mZiB0aGUgZG93bmxvYWQgcGFnZVxuICogYW5kIGZldGNoIGl0LiBPbmx5IHRoZSByZWdpb25hbCBgQXp1cmVDbG91ZC48cmVnaW9uPmAgYWdncmVnYXRlc1xuICogKHdoaWNoIGhhdmUgYSBub24tZW1wdHkgYHJlZ2lvbmApIGFyZSBrZXB0OyB0aGUgY2xvdWQtd2lkZVxuICogYEF6dXJlQ2xvdWRgIHRhZyBhbmQgcGVyLXNlcnZpY2UgdGFncyBhcmUgaWdub3JlZCBzbyBhbiBhZGRyZXNzIG1hcHNcbiAqIGNsZWFubHkgdG8gb25lIHJlZ2lvbi5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBenVyZVJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IHBhZ2UgPSBhd2FpdCBmZXRjaFRleHQoQVpVUkVfRE9XTkxPQURfUEFHRSk7XG4gIGNvbnN0IGpzb25VcmwgPSBwYWdlLm1hdGNoKEFaVVJFX0pTT05fTElOSyk/LlswXTtcbiAgaWYgKCFqc29uVXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiY291bGQgbm90IGZpbmQgU2VydmljZVRhZ3MgSlNPTiBsaW5rIG9uIEF6dXJlIGRvd25sb2FkIHBhZ2VcIik7XG4gIH1cbiAgY29uc3QgZmVlZCA9IGF3YWl0IGZldGNoSnNvbjxBenVyZUZlZWQ+KGpzb25VcmwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHZhbHVlIG9mIGZlZWQudmFsdWVzID8/IFtdKSB7XG4gICAgY29uc3QgcmVnaW9uID0gdmFsdWUucHJvcGVydGllcz8ucmVnaW9uO1xuICAgIGlmICghcmVnaW9uIHx8ICF2YWx1ZS5uYW1lPy5zdGFydHNXaXRoKFwiQXp1cmVDbG91ZC5cIikpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcHJlZml4IG9mIHZhbHVlLnByb3BlcnRpZXM/LmFkZHJlc3NQcmVmaXhlcyA/PyBbXSkge1xuICAgICAgYWRkUmFuZ2UocmFuZ2VzLCBwcmVmaXgsIHJlZ2lvbik7XG4gICAgfVxuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBhenVyZSByYW5nZXNcIiwgeyBjb3VudDogcmFuZ2VzLmxlbmd0aCB9KTtcbiAgcmV0dXJuIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXp1cmUsIHJhbmdlcyB9O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIEhlbHBlcnNcbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKiogUGFyc2UgYGNpZHJgIGFuZCwgd2hlbiB2YWxpZCBhbmQgYHJlZ2lvbmAgaXMgc2V0LCBwdXNoIGEgdGFnZ2VkIHJhbmdlLiAqL1xuZnVuY3Rpb24gYWRkUmFuZ2UocmFuZ2VzOiBSZWdpb25DaWRyW10sIGNpZHI/OiBzdHJpbmcsIHJlZ2lvbj86IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIWNpZHIgfHwgIXJlZ2lvbikgcmV0dXJuO1xuICBjb25zdCBwYXJzZWQgPSBuZXQucGFyc2VDaWRyKGNpZHIpO1xuICBpZiAocGFyc2VkKSByYW5nZXMucHVzaCh7IC4uLnBhcnNlZCwgcmVnaW9uIH0pO1xufVxuXG5hc3luYyBmdW5jdGlvbiBmZXRjaEpzb248VD4odXJsOiBzdHJpbmcpOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgdGV4dCA9IGF3YWl0IGZldGNoVGV4dCh1cmwpO1xuICByZXR1cm4gSlNPTi5wYXJzZSh0ZXh0KSBhcyBUO1xufVxuXG4vKipcbiAqIEZldGNoIGB1cmxgIGFzIHRleHQgd2l0aCBhIDI0aCBvbi1kaXNrIGNhY2hlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpclxuICogKGtleWVkIGJ5IGFuIEZOViBoYXNoIG9mIHRoZSBVUkwpLiBBIGZyZXNoIGNhY2hlIGZpbGUgaXMgcmV0dXJuZWRcbiAqIGRpcmVjdGx5OyBhIG1pc3MvZXhwaXJ5IGZldGNoZXMsIHdyaXRlcyB0byBhIHVuaXF1ZSB0ZW1wIGZpbGUsIGFuZFxuICogYXRvbWljYWxseSByZW5hbWVzIGl0IGludG8gcGxhY2Ugc28gY29uY3VycmVudCBjYWxsZXJzIG5ldmVyIG9ic2VydmVcbiAqIGEgaGFsZi13cml0dGVuIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRleHQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiZGJ4LXRvb2xzXCIsIFwic2hhcmVkXCIsIFwiY2xvdWRcIik7XG4gIGNvbnN0IGNhY2hlRGlyQ3JlYXRlZCA9IGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVQYXRoID0gam9pbihjYWNoZURpciwgYGZldGNoLSR7aGFzaC5mbnZIYXNoKHVybCl9LnR4dGApO1xuICBjb25zdCBjcmVhdGVkQXQgPSBjYWNoZURpckNyZWF0ZWQgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRDcmVhdGVkKGNhY2hlUGF0aCk7XG4gIGlmIChjcmVhdGVkQXQpIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShjcmVhdGVkQXQuZ2V0VGltZSgpICsgUkFOR0VfQ0FDSEVfVFRMX01TKTtcbiAgICBpZiAoZXhwaXJlc0F0ID4gbmV3IERhdGUoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGVkIGZldGNoIGhpdFwiLCB7IHVybCwgY2FjaGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIHJlYWRGaWxlKGNhY2hlUGF0aCwgXCJ1dGY4XCIpO1xuICAgIH1cbiAgfVxuICBsZXQgdGVtcFBhdGg6IHN0cmluZyB8IG51bGwgPSBqb2luKGNhY2hlRGlyLCBgJHtoYXNoLmlkKCl9LnR4dGApO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBhd2FpdCBodHRwLmNyZWF0ZUZldGNoRXJyb3IocmVzcG9uc2UsIHVybCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKHRlbXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCByZXNwb25zZVRleHQpO1xuXG4gICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCBjYWNoZVBhdGgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBsb2FkXCIsIHsgdXJsLCBjYWNoZVBhdGggfSk7XG4gICAgdGVtcFBhdGggPSBudWxsO1xuICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRlbXBQYXRoKSB7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQmlydGggdGltZSBvZiBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZG9lc24ndCBleGlzdCB5ZXQuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDcmVhdGVkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKGF3YWl0IGZpbGUuc3RhdFN5bmMocGF0aCkpPy5iaXJ0aHRpbWU7XG59XG4iXX0=
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvdWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xvdWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFFSCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakMsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFMUMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRTFDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7QUFFbkMsMEVBQTBFO0FBQzFFLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV0RCxrRUFBa0U7QUFDbEUsTUFBTSxjQUFjLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsa0VBQWtFO0FBQ2xFLE1BQU0sY0FBYyxHQUFHLDZDQUE2QyxDQUFDO0FBQ3JFOzs7O0dBSUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLGdFQUFnRSxDQUFDO0FBQzdGLDhGQUE4RjtBQUM5RixNQUFNLGVBQWUsR0FDbkIsa0ZBQWtGLENBQUM7QUFFckYsOENBQThDO0FBQzlDLE1BQU0sQ0FBTixJQUFZLGFBSVg7QUFKRCxXQUFZLGFBQWE7SUFDdkIsNEJBQVcsQ0FBQTtJQUNYLGdD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QVEsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELHNFQUFzRTtBQUN0RSxLQUFLLFVBQVUsVUFBVSxDQUFDLElBQVk7SUFDcEMsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCZXN0LWVmZm9ydCBnZW9sb2NhdGlvbiBvZiBhIGhvc3QgdG8gdGhlIGNsb3VkIHByb3ZpZGVyIGFuZCByZWdpb24gaXRcbiAqIHJ1bnMgaW4uIFJlc29sdmVzIHRoZSBob3N0IHRvIGl0cyBJUCBhZGRyZXNzKGVzKSB2aWEgRE5TLCB0aGVuIG1hdGNoZXNcbiAqIHRob3NlIGFkZHJlc3NlcyBhZ2FpbnN0IHRoZSBwdWJsaWMgSVAtcmFuZ2UgZmVlZHMgZWFjaCBoeXBlcnNjYWxlclxuICogcHVibGlzaGVzIChBV1MsIEF6dXJlLCBHQ1ApLiBIYW5keSBmb3IgcGxhY2luZyBhIERhdGFicmlja3Mgd29ya3NwYWNlXG4gKiBVUkwsIGJ1dCB3b3JrcyBmb3IgYW55IGhvc3QuXG4gKlxuICogVGhlIHJhbmdlIGZlZWRzIGFyZSBsYXJnZSBhbmQgY2hhbmdlIHNsb3dseSwgc28gZWFjaCBwcm92aWRlcidzIGZlZWRcbiAqIGlzIGNhY2hlZCBmb3Ige0BsaW5rIFJBTkdFX0NBQ0hFX1RUTF9NU30gKDI0IGhvdXJzKSBhdCB0d28gbGF5ZXJzOiBhblxuICogb24tZGlzayBjb3B5IHVuZGVyIHRoZSBPUyB0ZW1wIGRpciAoc3Vydml2ZXMgcHJvY2VzcyByZXN0YXJ0cywgc2hhcmVkXG4gKiBhY3Jvc3MgcHJvY2Vzc2VzKSBwbHVzIGFuIGluLXByb2Nlc3MgbWVtb2l6ZWQgcGFyc2UuIEEgcHJvdmlkZXIgd2hvc2VcbiAqIGZlZWQgZmFpbHMgdG8gbG9hZCBpcyBza2lwcGVkIHJhdGhlciB0aGFuIGZhaWxpbmcgdGhlIHdob2xlIGxvb2t1cCAtXG4gKiB0aGUgb3RoZXIgcHJvdmlkZXJzIHN0aWxsIGFuc3dlci5cbiAqXG4gKiBTZXJ2ZXItb25seTogRE5TIHJlc29sdXRpb24gbmVlZHMgYG5vZGU6ZG5zYCAodmlhIGAuL25ldC50c2ApLCB0aGVcbiAqIGRpc2sgY2FjaGUgbmVlZHMgYG5vZGU6ZnNgIC8gYG5vZGU6b3NgIC8gYG5vZGU6cGF0aGAsIGFuZCB0aGUgZmVlZHNcbiAqIGFyZSBmZXRjaGVkIHdpdGggdGhlIGdsb2JhbCBgZmV0Y2hgLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHJlbmFtZSwgdW5saW5rLCB3cml0ZUZpbGUgfSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5cbmltcG9ydCB7IGZpbGUgfSBmcm9tIFwiQGRieC10b29scy9jb3JlXCI7XG5pbXBvcnQgeyBlcnJvciwgZnVuY3Rpb25Nb2R1bGUsIGhhc2gsIGh0dHAsIGpzb24sIGxvZywgbmV0IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IHJlc29sdmVIb3N0SXBzIH0gZnJvbSBcIi4vbmV0LnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJjbG91ZFwiKTtcblxuLyoqIEhvdyBsb25nIGEgZmV0Y2hlZCBwcm92aWRlciBJUC1yYW5nZSBmZWVkIGlzIHJldXNlZCBiZWZvcmUgcmVmZXRjaC4gKi9cbmV4cG9ydCBjb25zdCBSQU5HRV9DQUNIRV9UVExfTVMgPSAyNCAqIDYwICogNjAgKiAxMDAwO1xuXG4vKiogQVdTIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEFXU19SQU5HRVNfVVJMID0gXCJodHRwczovL2lwLXJhbmdlcy5hbWF6b25hd3MuY29tL2lwLXJhbmdlcy5qc29uXCI7XG4vKiogR0NQIHB1Ymxpc2hlcyBhIHNpbmdsZSBzdGFibGUsIHVuYXV0aGVudGljYXRlZCByYW5nZXMgZmVlZC4gKi9cbmNvbnN0IEdDUF9SQU5HRVNfVVJMID0gXCJodHRwczovL3d3dy5nc3RhdGljLmNvbS9pcHJhbmdlcy9jbG91ZC5qc29uXCI7XG4vKipcbiAqIEF6dXJlIGhhcyBubyBzdGFibGUgZmVlZCBVUkwgLSB0aGUgSlNPTiBkb3dubG9hZCBsaW5rICh3aXRoIGFcbiAqIHJvdGF0aW5nIGRhdGUgc3RhbXApIGxpdmVzIG9uIHRoaXMgaHVtYW4tZmFjaW5nIGRvd25sb2FkIHBhZ2UgYW5kXG4gKiBtdXN0IGJlIHNjcmFwZWQgb3V0LiBTZWUge0BsaW5rIGZldGNoQXp1cmVSYW5nZXN9LlxuICovXG5jb25zdCBBWlVSRV9ET1dOTE9BRF9QQUdFID0gXCJodHRwczovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD01NjUxOVwiO1xuLyoqIFJlZ2V4IHRoYXQgcGx1Y2tzIHRoZSBjdXJyZW50IGBTZXJ2aWNlVGFnc19QdWJsaWNfPGRhdGU+Lmpzb25gIGxpbmsgb2ZmIHRoZSBBenVyZSBwYWdlLiAqL1xuY29uc3QgQVpVUkVfSlNPTl9MSU5LID1cbiAgL2h0dHBzOlxcL1xcL2Rvd25sb2FkXFwubWljcm9zb2Z0XFwuY29tXFwvZG93bmxvYWRcXC9bXlwiJ10qU2VydmljZVRhZ3NfUHVibGljX1xcZCtcXC5qc29uLztcblxuLyoqIENsb3VkIGh5cGVyc2NhbGVyIGEgaG9zdCByZXNvbHZlcyBpbnRvLiAqL1xuZXhwb3J0IGVudW0gQ2xvdWRQcm92aWRlciB7XG4gIEF3cyA9IFwiYXdzXCIsXG4gIEF6dXJlID0gXCJhenVyZVwiLFxuICBHY3AgPSBcImdjcFwiLFxufVxuXG4vKipcbiAqIFdoZXJlIGEgaG9zdCBsaXZlczogdGhlIHtAbGluayBDbG91ZFByb3ZpZGVyfSwgdGhlIHByb3ZpZGVyLW5hdGl2ZVxuICogYHJlZ2lvbmAgc3RyaW5nICh3aGF0ZXZlciB0aGUgcHJvdmlkZXIncyBmZWVkIGNhbGxzIGl0LCBlLmcuXG4gKiBgXCJ1cy1lYXN0LTFcImAgb24gQVdTLCBgXCJlYXN0dXMyXCJgIG9uIEF6dXJlLCBgXCJ1cy1lYXN0MVwiYCBvbiBHQ1ApLCB0aGVcbiAqIHJlc29sdmVkIGBpcGAgdGhhdCBtYXRjaGVkLCBhbmQgdGhlIGBjaWRyYCBibG9jayBpdCBmZWxsIGluLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsb3VkTG9jYXRpb24ge1xuICBwcm92aWRlcjogQ2xvdWRQcm92aWRlcjtcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIGlwOiBzdHJpbmc7XG4gIGNpZHI6IHN0cmluZztcbn1cblxuLyoqIEEgcGFyc2VkIENJRFIgYmxvY2sgdGFnZ2VkIHdpdGggdGhlIHJlZ2lvbiBpdCBiZWxvbmdzIHRvLiAqL1xuaW50ZXJmYWNlIFJlZ2lvbkNpZHIgZXh0ZW5kcyBuZXQuQ2lkciB7XG4gIHJlZ2lvbjogc3RyaW5nO1xufVxuXG4vKiogT25lIHByb3ZpZGVyJ3MgcGFyc2VkLCByZWdpb24tdGFnZ2VkIHJhbmdlIHRhYmxlLiAqL1xuaW50ZXJmYWNlIFByb3ZpZGVyUmFuZ2VzIHtcbiAgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXI7XG4gIHJhbmdlczogUmVnaW9uQ2lkcltdO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYGlucHV0YCdzIGhvc3QgdG8gYSB7QGxpbmsgQ2xvdWRMb2NhdGlvbn0sIG9yIGBudWxsYCB3aGVuIHRoZVxuICogaG9zdCBjYW4ndCBiZSByZXNvbHZlZCBvciBub25lIG9mIGl0cyBJUHMgbWF0Y2ggYSBrbm93biBjbG91ZCByYW5nZS5cbiAqIGBpbnB1dGAgaXMgYW55IHtAbGluayBuZXQuVXJsTGlrZX0gLSBhIFVSTCwgYSBiYXJlIGhvc3QsIG9yIGEgYHsgdXJsIH1gXG4gKiB3cmFwcGVyLlxuICpcbiAqIFRoZSBwcm92aWRlciByYW5nZSBmZWVkcyBhcmUgY2FjaGVkIGZvciB7QGxpbmsgUkFOR0VfQ0FDSEVfVFRMX01TfSwgc29cbiAqIG9ubHkgdGhlIGZpcnN0IGNhbGwgaW4gYSAyNC1ob3VyIHdpbmRvdyBwYXlzIHRoZSBmZXRjaCBjb3N0OyB0aGUgRE5TXG4gKiBsb29rdXAgaGFwcGVucyBvbiBldmVyeSBjYWxsLlxuICpcbiAqIEBleGFtcGxlXG4gKiBhd2FpdCByZXNvbHZlQ2xvdWRMb2NhdGlvbihcImh0dHBzOi8vYWRiLTEyMzQ1Njc4OTAuNy5henVyZWRhdGFicmlja3MubmV0XCIpO1xuICogLy8geyBwcm92aWRlcjogQ2xvdWRQcm92aWRlci5BenVyZSxcbiAqIC8vICAgcmVnaW9uOiBcImVhc3R1czJcIiwgaXA6IFwiLi4uXCIsIGNpZHI6IFwiLi4uXCIgfVxuICpcbiAqIGF3YWl0IHJlc29sdmVDbG91ZExvY2F0aW9uKFwiZGJjLWFiYzEyMy5jbG91ZC5kYXRhYnJpY2tzLmNvbVwiKTtcbiAqIC8vIHsgcHJvdmlkZXI6IENsb3VkUHJvdmlkZXIuQXdzLFxuICogLy8gICByZWdpb246IFwidXMtd2VzdC0yXCIsIGlwOiBcIi4uLlwiLCBjaWRyOiBcIi4uLlwiIH1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVDbG91ZExvY2F0aW9uKGlucHV0OiBuZXQuVXJsTGlrZSk6IFByb21pc2U8Q2xvdWRMb2NhdGlvbiB8IG51bGw+IHtcbiAgY29uc3QgaXBzID0gYXdhaXQgcmVzb2x2ZUhvc3RJcHMoaW5wdXQpO1xuICBpZiAoaXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm5vIGlwcyByZXNvbHZlZFwiLCB7IGlucHV0OiBTdHJpbmcoaW5wdXQpIH0pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHByb3ZpZGVycyA9IGF3YWl0IGxvYWRQcm92aWRlclJhbmdlcygpO1xuICBmb3IgKGNvbnN0IGlwIG9mIGlwcykge1xuICAgIGNvbnN0IHBhcnNlZCA9IG5ldC5wYXJzZUlwKGlwKTtcbiAgICBpZiAoIXBhcnNlZCkgY29udGludWU7XG4gICAgZm9yIChjb25zdCB7IHByb3ZpZGVyLCByYW5nZXMgfSBvZiBwcm92aWRlcnMpIHtcbiAgICAgIGNvbnN0IG1hdGNoID0gbmV0LmZpbmRDb250YWluaW5nQ2lkcihwYXJzZWQsIHJhbmdlcyk7XG4gICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgcmV0dXJuIHsgcHJvdmlkZXIsIHJlZ2lvbjogbWF0Y2gucmVnaW9uLCBpcCwgY2lkcjogbWF0Y2guY2lkciB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJubyBjbG91ZCByYW5nZSBtYXRjaGVkXCIsIHsgaXBzIH0pO1xuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBMb2FkIGV2ZXJ5IHByb3ZpZGVyJ3MgcmVnaW9uLXRhZ2dlZCByYW5nZSB0YWJsZSwgZWFjaCBjYWNoZWQgZm9yXG4gKiB7QGxpbmsgUkFOR0VfQ0FDSEVfVFRMX01TfS4gUHJvdmlkZXJzIGFyZSBsb2FkZWQgaW4gcGFyYWxsZWwgYW5kIGFcbiAqIGZlZWQgdGhhdCBmYWlscyB0byBmZXRjaCBvciBwYXJzZSBpcyBkcm9wcGVkIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvXG4gKiBhIHNpbmdsZSBmbGFreSBmZWVkIG5ldmVyIHNpbmtzIHRoZSB3aG9sZSBsb29rdXAuIEV4cG9zZWQgZm9yIGNhbGxlcnNcbiAqIHRoYXQgd2FudCB0byBtYXRjaCBtYW55IElQcyBhZ2FpbnN0IG9uZSBjYWNoZWQgc25hcHNob3Qgd2l0aG91dCBhIEROU1xuICogc3RlcCBwZXIgYWRkcmVzcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRQcm92aWRlclJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzW10+IHtcbiAgY29uc3Qgc2V0dGxlZCA9IGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbbG9hZEF3c1JhbmdlcygpLCBsb2FkQXp1cmVSYW5nZXMoKSwgbG9hZEdjcFJhbmdlcygpXSk7XG4gIGNvbnN0IG91dDogUHJvdmlkZXJSYW5nZXNbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBzZXR0bGVkKSB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09IFwiZnVsZmlsbGVkXCIpIG91dC5wdXNoKHJlc3VsdC52YWx1ZSk7XG4gICAgZWxzZSBsb2dnZXIud2FybihcInByb3ZpZGVyIHJhbmdlIGxvYWQgZmFpbGVkXCIsIHsgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShyZXN1bHQucmVhc29uKSB9KTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vIFBlci1wcm92aWRlciBjYWNoZWQgbG9hZGVyc1xuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmNvbnN0IGxvYWRBd3NSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoQXdzUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5jb25zdCBsb2FkQXp1cmVSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoQXp1cmVSYW5nZXMsIHsgdHRsTXM6IFJBTkdFX0NBQ0hFX1RUTF9NUyB9KTtcbmNvbnN0IGxvYWRHY3BSYW5nZXMgPSBmdW5jdGlvbk1vZHVsZS5tZW1vaXplKGZldGNoR2NwUmFuZ2VzLCB7IHR0bE1zOiBSQU5HRV9DQUNIRV9UVExfTVMgfSk7XG5cbi8vIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy8gUHJvdmlkZXIgZmVlZCBmZXRjaCArIHBhcnNlXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuaW50ZXJmYWNlIEF3c0ZlZWQge1xuICBwcmVmaXhlcz86IHsgaXBfcHJlZml4Pzogc3RyaW5nOyByZWdpb24/OiBzdHJpbmcgfVtdO1xuICBpcHY2X3ByZWZpeGVzPzogeyBpcHY2X3ByZWZpeD86IHN0cmluZzsgcmVnaW9uPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBBV1MgYGlwLXJhbmdlcy5qc29uYDogYSBmbGF0IGxpc3Qgb2YgSVB2NCAoYHByZWZpeGVzYCkgYW5kIElQdjZcbiAqIChgaXB2Nl9wcmVmaXhlc2ApIGJsb2NrcywgZWFjaCBhbHJlYWR5IHRhZ2dlZCB3aXRoIGEgYHJlZ2lvbmAgc3VjaFxuICogYXMgYFwidXMtZWFzdC0xXCJgIChvciBgXCJHTE9CQUxcImAgZm9yIGVkZ2UgcmFuZ2VzKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hBd3NSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBmZWVkID0gYXdhaXQgZmV0Y2hKc29uPEF3c0ZlZWQ+KEFXU19SQU5HRVNfVVJMKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLnByZWZpeGVzID8/IFtdKSB7XG4gICAgYWRkUmFuZ2UocmFuZ2VzLCBlbnRyeS5pcF9wcmVmaXgsIGVudHJ5LnJlZ2lvbik7XG4gIH1cbiAgZm9yIChjb25zdCBlbnRyeSBvZiBmZWVkLmlwdjZfcHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjZfcHJlZml4LCBlbnRyeS5yZWdpb24pO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBhd3MgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF3cywgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBHY3BGZWVkIHtcbiAgcHJlZml4ZXM/OiB7IGlwdjRQcmVmaXg/OiBzdHJpbmc7IGlwdjZQcmVmaXg/OiBzdHJpbmc7IHNjb3BlPzogc3RyaW5nIH1bXTtcbn1cblxuLyoqXG4gKiBHQ1AgYGNsb3VkLmpzb25gOiBhIGxpc3Qgb2YgYmxvY2tzIGVhY2ggY2FycnlpbmcgYW4gYGlwdjRQcmVmaXhgIG9yXG4gKiBgaXB2NlByZWZpeGAgYW5kIGEgYHNjb3BlYCB0aGF0IGlzIHRoZSByZWdpb24gKGBcInVzLWVhc3QxXCJgKSBvclxuICogYFwiZ2xvYmFsXCJgIGZvciBub24tcmVnaW9uYWwgcmFuZ2VzLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaEdjcFJhbmdlcygpOiBQcm9taXNlPFByb3ZpZGVyUmFuZ2VzPiB7XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248R2NwRmVlZD4oR0NQX1JBTkdFU19VUkwpO1xuICBjb25zdCByYW5nZXM6IFJlZ2lvbkNpZHJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGZlZWQucHJlZml4ZXMgPz8gW10pIHtcbiAgICBhZGRSYW5nZShyYW5nZXMsIGVudHJ5LmlwdjRQcmVmaXggPz8gZW50cnkuaXB2NlByZWZpeCwgZW50cnkuc2NvcGUpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImxvYWRlZCBnY3AgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkdjcCwgcmFuZ2VzIH07XG59XG5cbmludGVyZmFjZSBBenVyZUZlZWQge1xuICB2YWx1ZXM/OiB7XG4gICAgbmFtZT86IHN0cmluZztcbiAgICBwcm9wZXJ0aWVzPzogeyByZWdpb24/OiBzdHJpbmc7IGFkZHJlc3NQcmVmaXhlcz86IHN0cmluZ1tdIH07XG4gIH1bXTtcbn1cblxuLyoqXG4gKiBBenVyZSBzZXJ2aWNlIHRhZ3M6IE1pY3Jvc29mdCBzaGlwcyBubyBzdGFibGUgZmVlZCBVUkwsIHNvIHNjcmFwZSB0aGVcbiAqIGN1cnJlbnQgYFNlcnZpY2VUYWdzX1B1YmxpY188ZGF0ZT4uanNvbmAgbGluayBvZmYgdGhlIGRvd25sb2FkIHBhZ2VcbiAqIGFuZCBmZXRjaCBpdC4gT25seSB0aGUgcmVnaW9uYWwgYEF6dXJlQ2xvdWQuPHJlZ2lvbj5gIGFnZ3JlZ2F0ZXNcbiAqICh3aGljaCBoYXZlIGEgbm9uLWVtcHR5IGByZWdpb25gKSBhcmUga2VwdDsgdGhlIGNsb3VkLXdpZGVcbiAqIGBBenVyZUNsb3VkYCB0YWcgYW5kIHBlci1zZXJ2aWNlIHRhZ3MgYXJlIGlnbm9yZWQgc28gYW4gYWRkcmVzcyBtYXBzXG4gKiBjbGVhbmx5IHRvIG9uZSByZWdpb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoQXp1cmVSYW5nZXMoKTogUHJvbWlzZTxQcm92aWRlclJhbmdlcz4ge1xuICBjb25zdCBwYWdlID0gYXdhaXQgZmV0Y2hUZXh0KEFaVVJFX0RPV05MT0FEX1BBR0UpO1xuICBjb25zdCBqc29uVXJsID0gcGFnZS5tYXRjaChBWlVSRV9KU09OX0xJTkspPy5bMF07XG4gIGlmICghanNvblVybCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcImNvdWxkIG5vdCBmaW5kIFNlcnZpY2VUYWdzIEpTT04gbGluayBvbiBBenVyZSBkb3dubG9hZCBwYWdlXCIpO1xuICB9XG4gIGNvbnN0IGZlZWQgPSBhd2FpdCBmZXRjaEpzb248QXp1cmVGZWVkPihqc29uVXJsKTtcbiAgY29uc3QgcmFuZ2VzOiBSZWdpb25DaWRyW10gPSBbXTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBmZWVkLnZhbHVlcyA/PyBbXSkge1xuICAgIGNvbnN0IHJlZ2lvbiA9IHZhbHVlLnByb3BlcnRpZXM/LnJlZ2lvbjtcbiAgICBpZiAoIXJlZ2lvbiB8fCAhdmFsdWUubmFtZT8uc3RhcnRzV2l0aChcIkF6dXJlQ2xvdWQuXCIpKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHByZWZpeCBvZiB2YWx1ZS5wcm9wZXJ0aWVzPy5hZGRyZXNzUHJlZml4ZXMgPz8gW10pIHtcbiAgICAgIGFkZFJhbmdlKHJhbmdlcywgcHJlZml4LCByZWdpb24pO1xuICAgIH1cbiAgfVxuICBsb2dnZXIuZGVidWcoXCJsb2FkZWQgYXp1cmUgcmFuZ2VzXCIsIHsgY291bnQ6IHJhbmdlcy5sZW5ndGggfSk7XG4gIHJldHVybiB7IHByb3ZpZGVyOiBDbG91ZFByb3ZpZGVyLkF6dXJlLCByYW5nZXMgfTtcbn1cblxuLy8g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vLyBIZWxwZXJzXG4vLyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqIFBhcnNlIGBjaWRyYCBhbmQsIHdoZW4gdmFsaWQgYW5kIGByZWdpb25gIGlzIHNldCwgcHVzaCBhIHRhZ2dlZCByYW5nZS4gKi9cbmZ1bmN0aW9uIGFkZFJhbmdlKHJhbmdlczogUmVnaW9uQ2lkcltdLCBjaWRyPzogc3RyaW5nLCByZWdpb24/OiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKCFjaWRyIHx8ICFyZWdpb24pIHJldHVybjtcbiAgY29uc3QgcGFyc2VkID0gbmV0LnBhcnNlQ2lkcihjaWRyKTtcbiAgaWYgKHBhcnNlZCkgcmFuZ2VzLnB1c2goeyAuLi5wYXJzZWQsIHJlZ2lvbiB9KTtcbn1cblxuLyoqXG4gKiBGZXRjaCBhbmQgcGFyc2UgYSBwcm92aWRlciBmZWVkLiBBIHBhcnNlIGZhaWx1cmUgbmFtZXMgdGhlIFVSTCByYXRoZXIgdGhhblxuICogc3VyZmFjaW5nIGFuIG9wYXF1ZSBgVW5leHBlY3RlZCB0b2tlbmAgLSB0aGUgdGV4dCBtYXkgY29tZSBmcm9tIHRoZSBvbi1kaXNrXG4gKiBjYWNoZSwgc28gXCJ3aGljaCBmZWVkXCIgaXMgdGhlIHBhcnQgd29ydGgga25vd2luZy4ge0BsaW5rIGxvYWRQcm92aWRlclJhbmdlc31cbiAqIHR1cm5zIHRoZSB0aHJvdyBpbnRvIGEgcGVyLXByb3ZpZGVyIHdhcm5pbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoSnNvbjxUPih1cmw6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCB0ZXh0ID0gYXdhaXQgZmV0Y2hUZXh0KHVybCk7XG4gIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2U8VD4odGV4dCk7XG4gIGlmIChwYXJzZWQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgcmFuZ2UgZmVlZCByZXR1cm5lZCBub24tSlNPTiBjb250ZW50OiAke3VybH1gKTtcbiAgfVxuICByZXR1cm4gcGFyc2VkO1xufVxuXG4vKipcbiAqIEZldGNoIGB1cmxgIGFzIHRleHQgd2l0aCBhIDI0aCBvbi1kaXNrIGNhY2hlIHVuZGVyIHRoZSBPUyB0ZW1wIGRpclxuICogKGtleWVkIGJ5IGFuIEZOViBoYXNoIG9mIHRoZSBVUkwpLiBBIGZyZXNoIGNhY2hlIGZpbGUgaXMgcmV0dXJuZWRcbiAqIGRpcmVjdGx5OyBhIG1pc3MvZXhwaXJ5IGZldGNoZXMsIHdyaXRlcyB0byBhIHVuaXF1ZSB0ZW1wIGZpbGUsIGFuZFxuICogYXRvbWljYWxseSByZW5hbWVzIGl0IGludG8gcGxhY2Ugc28gY29uY3VycmVudCBjYWxsZXJzIG5ldmVyIG9ic2VydmVcbiAqIGEgaGFsZi13cml0dGVuIGNhY2hlIGVudHJ5LlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaFRleHQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBjYWNoZURpciA9IGpvaW4odG1wZGlyKCksIFwiZGJ4LXRvb2xzXCIsIFwic2hhcmVkXCIsIFwiY2xvdWRcIik7XG4gIGNvbnN0IGNhY2hlRGlyQ3JlYXRlZCA9IGF3YWl0IG1rZGlyKGNhY2hlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29uc3QgY2FjaGVQYXRoID0gam9pbihjYWNoZURpciwgYGZldGNoLSR7aGFzaC5mbnZIYXNoKHVybCl9LnR4dGApO1xuICBjb25zdCBjcmVhdGVkQXQgPSBjYWNoZURpckNyZWF0ZWQgPyB1bmRlZmluZWQgOiBhd2FpdCBnZXRDcmVhdGVkKGNhY2hlUGF0aCk7XG4gIGlmIChjcmVhdGVkQXQpIHtcbiAgICBjb25zdCBleHBpcmVzQXQgPSBuZXcgRGF0ZShjcmVhdGVkQXQuZ2V0VGltZSgpICsgUkFOR0VfQ0FDSEVfVFRMX01TKTtcbiAgICBpZiAoZXhwaXJlc0F0ID4gbmV3IERhdGUoKSkge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiY2FjaGVkIGZldGNoIGhpdFwiLCB7IHVybCwgY2FjaGVQYXRoIH0pO1xuICAgICAgcmV0dXJuIHJlYWRGaWxlKGNhY2hlUGF0aCwgXCJ1dGY4XCIpO1xuICAgIH1cbiAgfVxuICBsZXQgdGVtcFBhdGg6IHN0cmluZyB8IG51bGwgPSBqb2luKGNhY2hlRGlyLCBgJHtoYXNoLmlkKCl9LnR4dGApO1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBhd2FpdCBodHRwLmNyZWF0ZUZldGNoRXJyb3IocmVzcG9uc2UsIHVybCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlVGV4dCA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBhd2FpdCBta2RpcihkaXJuYW1lKHRlbXBQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHRlbXBQYXRoLCByZXNwb25zZVRleHQpO1xuXG4gICAgYXdhaXQgcmVuYW1lKHRlbXBQYXRoLCBjYWNoZVBhdGgpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlZCBmZXRjaCBsb2FkXCIsIHsgdXJsLCBjYWNoZVBhdGggfSk7XG4gICAgdGVtcFBhdGggPSBudWxsO1xuICAgIHJldHVybiByZXNwb25zZVRleHQ7XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHRlbXBQYXRoKSB7XG4gICAgICBhd2FpdCB1bmxpbmsodGVtcFBhdGgpO1xuICAgIH1cbiAgfVxufVxuXG4vKiogQmlydGggdGltZSBvZiBgcGF0aGAsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgZG9lc24ndCBleGlzdCB5ZXQuICovXG5hc3luYyBmdW5jdGlvbiBnZXRDcmVhdGVkKHBhdGg6IHN0cmluZyk6IFByb21pc2U8RGF0ZSB8IHVuZGVmaW5lZD4ge1xuICByZXR1cm4gKGF3YWl0IGZpbGUuc3RhdFN5bmMocGF0aCkpPy5iaXJ0aHRpbWU7XG59XG4iXX0=
package/package.json CHANGED
@@ -24,10 +24,10 @@
24
24
  },
25
25
  "dependencies": {
26
26
  "@databricks/sdk-experimental": "^0.17.0",
27
- "@dbx-tools/appkit": "0.6.46",
28
- "@dbx-tools/core": "0.6.46",
29
- "@dbx-tools/shared-core": "0.6.46",
30
- "@dbx-tools/shared-fs": "0.6.46"
27
+ "@dbx-tools/appkit": "0.6.49",
28
+ "@dbx-tools/core": "0.6.49",
29
+ "@dbx-tools/shared-core": "0.6.49",
30
+ "@dbx-tools/shared-fs": "0.6.49"
31
31
  },
32
32
  "main": "./lib/index.js",
33
33
  "license": "UNLICENSED",
@@ -43,7 +43,7 @@
43
43
  "./package.json": "./package.json"
44
44
  }
45
45
  },
46
- "version": "0.6.46",
46
+ "version": "0.6.49",
47
47
  "types": "./lib/index.d.ts",
48
48
  "type": "module",
49
49
  "exports": {
package/src/cloud.ts CHANGED
@@ -24,7 +24,7 @@ import { tmpdir } from "node:os";
24
24
  import { dirname, join } from "node:path";
25
25
 
26
26
  import { file } from "@dbx-tools/core";
27
- import { error, functionModule, hash, http, log, net } from "@dbx-tools/shared-core";
27
+ import { error, functionModule, hash, http, json, log, net } from "@dbx-tools/shared-core";
28
28
  import { resolveHostIps } from "./net.ts";
29
29
 
30
30
  const logger = log.logger("cloud");
@@ -234,9 +234,19 @@ function addRange(ranges: RegionCidr[], cidr?: string, region?: string): void {
234
234
  if (parsed) ranges.push({ ...parsed, region });
235
235
  }
236
236
 
237
+ /**
238
+ * Fetch and parse a provider feed. A parse failure names the URL rather than
239
+ * surfacing an opaque `Unexpected token` - the text may come from the on-disk
240
+ * cache, so "which feed" is the part worth knowing. {@link loadProviderRanges}
241
+ * turns the throw into a per-provider warning.
242
+ */
237
243
  async function fetchJson<T>(url: string): Promise<T> {
238
244
  const text = await fetchText(url);
239
- return JSON.parse(text) as T;
245
+ const parsed = json.parse<T>(text);
246
+ if (parsed === undefined) {
247
+ throw new Error(`range feed returned non-JSON content: ${url}`);
248
+ }
249
+ return parsed;
240
250
  }
241
251
 
242
252
  /**