@dbx-tools/fs 0.6.40 → 0.6.41

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.
@@ -31,6 +31,13 @@ export interface LocalFileSystemOptions {
31
31
  * Create {@link root} (and parents) during init. Defaults to true.
32
32
  */
33
33
  createRoot?: boolean;
34
+ /**
35
+ * Injectables forwarded to {@link resolveLocalRoot} for `~` expansion (home /
36
+ * temp / cwd overrides). Mainly for tests: bun's `os.homedir()` ignores a
37
+ * process-set `HOME`, so overriding home via `{ os: { homeDir } }` is the
38
+ * runtime-agnostic way to point a `~` root at a chosen directory.
39
+ */
40
+ os?: ResolveOsPathsOptions;
34
41
  }
35
42
  /**
36
43
  * Options for the factories that take their root FROM the OS
@@ -38,10 +45,7 @@ export interface LocalFileSystemOptions {
38
45
  * caller: {@link LocalFileSystemOptions} without `root`, plus the
39
46
  * {@link resolveOsPaths} injectables.
40
47
  */
41
- export type OsFileSystemOptions = Omit<LocalFileSystemOptions, "root"> & {
42
- /** Forwarded to {@link resolveLocalHome} / {@link resolveLocalTemp}. */
43
- os?: ResolveOsPathsOptions;
44
- };
48
+ export type OsFileSystemOptions = Omit<LocalFileSystemOptions, "root">;
45
49
  /**
46
50
  * {@link FileSystem} implementation that stores files in a folder on the local
47
51
  * machine.
@@ -33,7 +33,7 @@ export class LocalFileSystem extends BaseFileSystem {
33
33
  /** Symlink-resolved host root, refreshed in {@link onInit}. */
34
34
  realRoot;
35
35
  constructor(options) {
36
- const hostRoot = resolveLocalRoot(options.root);
36
+ const hostRoot = resolveLocalRoot(options.root, options.os);
37
37
  const root = posixPath.normalizeRoot(posixPath.toPosix(hostRoot));
38
38
  super({
39
39
  id: options.id ?? `local-${hash.fnvHash(root)}`,
@@ -327,4 +327,4 @@ function joinUnderBase(base, relativeRoot) {
327
327
  const rest = posixPath.toRelativeSegment(relativeRoot);
328
328
  return rest ? path.resolve(base, rest) : base;
329
329
  }
330
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9jYWwtZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sZUFBZSxFQUNmLFNBQVMsR0FPVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUM7QUF5QzlGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsY0FBdUI7SUFDekMsU0FBUyxDQUFVO0lBQ3BDLCtEQUErRDtJQUN2RCxRQUFRLENBQVM7SUFFekIsWUFBWSxPQUErQjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsTUFBTSxJQUFJLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDbEUsS0FBSyxDQUFDO1lBQ0osRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksU0FBUyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQy9DLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLElBQUk7WUFD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bnQiOlsiLyoqXG4gKiBIb3N0LWxvY2FsIHtAbGluayBGaWxlU3lzdGVtfSBiYWNrZWQgYnkgTm9kZSdzIGBub2RlOmZzL3Byb21pc2VzYC5cbiAqXG4gKiBFeHRlbmRzIHtAbGluayBCYXNlRmlsZVN5c3RlbX0gc28gdGhpcyBtb2R1bGUgb25seSBvd25zIE5vZGUgSS9PLCBob3N0IHBhdGhcbiAqIGNvbnZlcnNpb24sIGFuZCBzeW1saW5rIGNvbnRhaW5tZW50LiBQb3J0YWJsZSBiZWhhdmlvciAoZW5jb2RpbmcsIHJlY3Vyc2lvbixcbiAqIHBhcmVudCBjcmVhdGlvbiwgZmFsbGJhY2tzLCBQT1NJWCBuYW1lc3BhY2UgcGF0aHMpIGxpdmVzIGluIGBAZGJ4LXRvb2xzL3NoYXJlZC1mc2AuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIGFwcGVuZEZpbGUsXG4gIGNwLFxuICBsc3RhdCxcbiAgbWtkaXIsXG4gIHJlYWRkaXIsXG4gIHJlYWRGaWxlLFxuICByZWFscGF0aCxcbiAgcmVuYW1lLFxuICBybSxcbiAgcm1kaXIsXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGhhc2ggfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgQmFzZUZpbGVTeXN0ZW0sXG4gIGJhc2VGUyxcbiAgRmlsZVN5c3RlbUVycm9yLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ29weU9wdGlvbnMsXG4gIHR5cGUgRmlsZUVudHJ5LFxuICB0eXBlIEZpbGVFbnRyeVR5cGUsXG4gIHR5cGUgRmlsZVN0YXQsXG4gIHR5cGUgRmlsZVN5c3RlbUVycm9yQ29kZSxcbiAgdHlwZSBXcml0ZUZpbGVPcHRpb25zLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB7IHJlc29sdmVMb2NhbFJvb3QgfSBmcm9tIFwiLi9sb2NhbC1wYXRoLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlTG9jYWxIb21lLCByZXNvbHZlTG9jYWxUZW1wLCB0eXBlIFJlc29sdmVPc1BhdGhzT3B0aW9ucyB9IGZyb20gXCIuL29zLXBhdGgudHNcIjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBMb2NhbEZpbGVTeXN0ZW19LiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2NhbEZpbGVTeXN0ZW1PcHRpb25zIHtcbiAgLyoqIFVuaXF1ZSBpZGVudGlmaWVyLiBEZWZhdWx0cyB0byBhIHN0YWJsZSBoYXNoIG9mIHRoZSBhYnNvbHV0ZSByb290LiAqL1xuICBpZD86IHN0cmluZztcblxuICAvKipcbiAgICogUm9vdCBkaXJlY3Rvcnkgb24gZGlzay4gUmVsYXRpdmUgcGF0aHMgcmVzb2x2ZSBhZ2FpbnN0IGBwcm9jZXNzLmN3ZCgpYC5cbiAgICogYH5gIC8gYH4vLi4uYCBleHBhbmQgdmlhIGBvcy5ob21lZGlyKClgIChiZWZvcmUgYEhPTUVgKSwgQXBwIGAvaG9tZS9hcHBgLFxuICAgKiBvciBhIGNyZWF0ZWQgYC4vLmhvbWVgIChjcmVhdGUgZmFpbHVyZXMgc2tpcCkuXG4gICAqIFN0b3JlZCBvbiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtLnJvb3R9IGluIFBPU0lYIGZvcm0uXG4gICAqL1xuICByb290OiBzdHJpbmc7XG5cbiAgLyoqIEJsb2NrIGFsbCB3cml0ZSBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgcmVhZE9ubHk/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBLZWVwIGV2ZXJ5IHJlc29sdmVkIHBhdGggdW5kZXIge0BsaW5rIHJvb3R9LiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKiBXaGVuIGZhbHNlLCBhYnNvbHV0ZSBpbnB1dCBwYXRocyBhcmUgYWNjZXB0ZWQgYXMtaXMgKG5vIHNhbmRib3gpLlxuICAgKi9cbiAgY29udGFpbmVkPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlIHtAbGluayByb290fSAoYW5kIHBhcmVudHMpIGR1cmluZyBpbml0LiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGZhY3RvcmllcyB0aGF0IHRha2UgdGhlaXIgcm9vdCBGUk9NIHRoZSBPU1xuICogKHtAbGluayBob21lRlN9IC8ge0BsaW5rIHRtcEZTfSAvIHtAbGluayBzY3JhdGNoRlN9KSByYXRoZXIgdGhhbiBmcm9tIHRoZVxuICogY2FsbGVyOiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtT3B0aW9uc30gd2l0aG91dCBgcm9vdGAsIHBsdXMgdGhlXG4gKiB7QGxpbmsgcmVzb2x2ZU9zUGF0aHN9IGluamVjdGFibGVzLlxuICovXG5leHBvcnQgdHlwZSBPc0ZpbGVTeXN0ZW1PcHRpb25zID0gT21pdDxMb2NhbEZpbGVTeXN0ZW1PcHRpb25zLCBcInJvb3RcIj4gJiB7XG4gIC8qKiBGb3J3YXJkZWQgdG8ge0BsaW5rIHJlc29sdmVMb2NhbEhvbWV9IC8ge0BsaW5rIHJlc29sdmVMb2NhbFRlbXB9LiAqL1xuICBvcz86IFJlc29sdmVPc1BhdGhzT3B0aW9ucztcbn07XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIHRoYXQgc3RvcmVzIGZpbGVzIGluIGEgZm9sZGVyIG9uIHRoZSBsb2NhbFxuICogbWFjaGluZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwiLi9kYXRhXCIgfSk7XG4gKiBhd2FpdCBmcy5pbml0KCk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJoZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwifi9wcm9qZWN0cy9kYXRhXCIgfSk7XG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJteS1qb2JcIik7XG4gKiBjb25zdCBjYWNoZSA9IGhvbWVGUyhcIi5jYWNoZS9hcHBcIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsRmlsZVN5c3RlbSBleHRlbmRzIEJhc2VGaWxlU3lzdGVtPFwibG9jYWxcIj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lZDogYm9vbGVhbjtcbiAgLyoqIFN5bWxpbmstcmVzb2x2ZWQgaG9zdCByb290LCByZWZyZXNoZWQgaW4ge0BsaW5rIG9uSW5pdH0uICovXG4gIHByaXZhdGUgcmVhbFJvb3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbEZpbGVTeXN0ZW1PcHRpb25zKSB7XG4gICAgY29uc3QgaG9zdFJvb3QgPSByZXNvbHZlTG9jYWxSb290KG9wdGlvbnMucm9vdCk7XG4gICAgY29uc3Qgcm9vdCA9IHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHBvc2l4UGF0aC50b1Bvc2l4KGhvc3RSb290KSk7XG4gICAgc3VwZXIoe1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gYGxvY2FsLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImxvY2FsXCIsXG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IG9wdGlvbnMucmVhZE9ubHksXG4gICAgICBjcmVhdGVSb290OiBvcHRpb25zLmNyZWF0ZVJvb3QgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlYWxSb290ID0gdGhpcy50b0JhY2tlbmRQYXRoKHJvb3QpO1xuICAgIHRoaXMuY29udGFpbmVkID0gb3B0aW9ucy5jb250YWluZWQgPz8gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB0b0JhY2tlbmRQYXRoKHBvc2l4QmFja2VuZFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC50b0hvc3QocG9zaXhCYWNrZW5kUGF0aCwgcGF0aC5zZXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVJvb3REaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIodGhpcy50b0JhY2tlbmRQYXRoKHRoaXMucm9vdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBob3N0Um9vdCA9IHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpO1xuICAgIGlmICghdGhpcy5jcmVhdGVSb290KSB7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgbHN0YXQoaG9zdFJvb3QpO1xuICAgICAgaWYgKCFpbmZvLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICBcIk5PVF9ESVJFQ1RPUllcIixcbiAgICAgICAgICBgTG9jYWwgZmlsZXN5c3RlbSByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHt0aGlzLnJvb3R9YCxcbiAgICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbm9uaWNhbGl6ZSBzbyBjb250YWlubWVudCBjaGVja3Mgc3Vydml2ZSBPUyByb290IHN5bWxpbmtzIChlLmcuIC92YXIgLT4gL3ByaXZhdGUvdmFyKS5cbiAgICB0aGlzLnJlYWxSb290ID0gYXdhaXQgcmVhbHBhdGgoaG9zdFJvb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVzb2x2ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250YWluZWQpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aClcbiAgICAgICAgPyBwYXRoLnJlc29sdmUoaW5wdXRQYXRoKVxuICAgICAgICA6IHBhdGgucmVzb2x2ZSh0aGlzLnRvQmFja2VuZFBhdGgodGhpcy5yb290KSwgaW5wdXRQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLnRvQmFja2VuZFBhdGgocG9zaXhQYXRoLnRvUG9zaXgocmVzb2x2ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnJlc29sdmVQYXRoKGlucHV0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjb250YWluZWQsIHJlc29sdmUgc3ltbGlua3MgYW5kIGVuc3VyZSB0aGUgcmVhbCBwYXRoIHN0aWxsIHNpdHMgdW5kZXJcbiAgICoge0BsaW5rIHJvb3R9LiBNaXNzaW5nIGxlYWYgcGF0aHMgYXJlIGFsbG93ZWQgd2hlbiBgYWxsb3dNaXNzaW5nYCBpcyBzZXQgc29cbiAgICogd3JpdGVzIGNhbiBjcmVhdGUgbmV3IGZpbGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHByZXBhcmVQYXRoKFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGFsbG93TWlzc2luZz86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVkKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFsID0gYXdhaXQgcmVhbHBhdGgocmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmICghaXNXaXRoaW5Ib3N0Um9vdCh0aGlzLnJlYWxSb290LCByZWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgIFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgICAgICAgICBcIlBhdGggZXNjYXBlcyB0aGUgZmlsZXN5c3RlbSByb290XCIsXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IpIHRocm93IGVycjtcbiAgICAgIGlmIChvcHRpb25zPy5hbGxvd01pc3NpbmcgJiYgaXNFcnJubyhlcnIsIFwiRU5PRU5UXCIpKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgd2hpbGUgKGN1cnNvciAhPT0gcGF0aC5kaXJuYW1lKGN1cnNvcikpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhbCA9IGF3YWl0IHJlYWxwYXRoKGN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIWlzV2l0aGluSG9zdFJvb3QodGhpcy5yZWFsUm9vdCwgcmVhbCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICAgICAgICBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG4gICAgICAgICAgICAgICAgXCJQYXRoIGVzY2FwZXMgdGhlIGZpbGVzeXN0ZW0gcm9vdFwiLFxuICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHtcbiAgICAgICAgICAgIGlmIChpbm5lciBpbnN0YW5jZW9mIEZpbGVTeXN0ZW1FcnJvcikgdGhyb3cgaW5uZXI7XG4gICAgICAgICAgICBpZiAoIWlzRXJybm8oaW5uZXIsIFwiRU5PRU5UXCIpKSB0aHJvdyB0aGlzLm1hcEVycm9yKGlubmVyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgY3Vyc29yID0gcGF0aC5kaXJuYW1lKGN1cnNvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGlzLm1hcEVycm9yKGVyciwgcmVzb2x2ZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xhc3NpZnkgTm9kZSBlcnJubyBjb2Rlczsge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSB3cmFwcyBldmVyeSBwcmltaXRpdmUuICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtYXBFcnJvcihlcnI6IHVua25vd24sIGZpbGVQYXRoOiBzdHJpbmcpOiBGaWxlU3lzdGVtRXJyb3Ige1xuICAgIHJldHVybiBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGVyciwgZmlsZVBhdGgsIG5vZGVFcnJvckNvZGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRCeXRlc0F0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUocmVzb2x2ZWRQYXRoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB3cml0ZUJ5dGVzQXQoXG4gICAgcmVzb2x2ZWRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogVWludDhBcnJheSxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxXcml0ZUZpbGVPcHRpb25zPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCwgb3B0aW9ucy5vdmVyd3JpdGUgPyB1bmRlZmluZWQgOiB7IGZsYWc6IFwid3hcIiB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVGaWxlQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBybShyZXNvbHZlZFBhdGgsIHsgZm9yY2U6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJtZGlyKHJlc29sdmVkUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyKHJlc29sdmVkUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGVudHJpZXM6IEZpbGVFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgdHlwZSA9IGVudHJ5VHlwZShkaXJlbnQpO1xuICAgICAgbGV0IHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlID09PSBcImZpbGVcIiB8fCB0eXBlID09PSBcInN5bWJvbGljLWxpbmtcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNpemUgPSAoYXdhaXQgbHN0YXQocGF0aC5qb2luKHJlc29sdmVkUGF0aCwgZGlyZW50Lm5hbWUpKSkuc2l6ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gUmFjZSB3aXRoIGNvbmN1cnJlbnQgZGVsZXRlczsgb21pdCBzaXplLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbnRyaWVzLnB1c2goXG4gICAgICAgIHNpemUgPT09IHVuZGVmaW5lZCA/IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUgfSA6IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUsIHNpemUgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IGxzdGF0KHJlc29sdmVkUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKSB8fCBwYXRoLmJhc2VuYW1lKHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpKSxcbiAgICAgIHR5cGU6IGVudHJ5VHlwZShpbmZvKSxcbiAgICAgIHNpemU6IGluZm8uc2l6ZSxcbiAgICAgIGNyZWF0ZWRBdDogaW5mby5iaXJ0aHRpbWUsXG4gICAgICBtb2RpZmllZEF0OiBpbmZvLm10aW1lLFxuICAgICAgYWNjZXNzZWRBdDogaW5mby5hdGltZSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGlzTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoZXJyb3IgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJOT1RfRk9VTkRcIikgfHwgaXNFcnJubyhlcnJvciwgXCJFTk9FTlRcIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeUFwcGVuZEZpbGVBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBhcHBlbmRGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5Q29weUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8Q29weU9wdGlvbnM+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBjcChzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLm92ZXJ3cml0ZSxcbiAgICAgIGVycm9yT25FeGlzdDogIW9wdGlvbnMub3ZlcndyaXRlLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeU1vdmVGaWxlQXQoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlbmFtZShzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQWNyb3NzIGRldmljZXMgYHJlbmFtZWAgY2Fubm90IHdvcms7IGZhbGwgYmFjayB0byBjb3B5ICsgcmVtb3ZlLiBBbnlcbiAgICAgIC8vIG90aGVyIGZhaWx1cmUgcHJvcGFnYXRlcyBmb3IgdGhlIGJhc2UgY2xhc3MgdG8gbWFwLlxuICAgICAgaWYgKCFpc0Vycm5vKGVyciwgXCJFWERFVlwiKSkgdGhyb3cgZXJyO1xuICAgICAgYXdhaXQgY3Aoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IG9wdGlvbnMub3ZlcndyaXRlIH0pO1xuICAgICAgYXdhaXQgcm0oc291cmNlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gaXNXaXRoaW5Ib3N0Um9vdChyb290OiBzdHJpbmcsIGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyb290LCBjYW5kaWRhdGUpO1xuICByZXR1cm4gcmVsYXRpdmUgPT09IFwiXCIgfHwgKCFyZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpO1xufVxuXG5mdW5jdGlvbiBpc0Vycm5vKGVycjogdW5rbm93biwgY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGVyciA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGVyciAhPT0gbnVsbCAmJlxuICAgIFwiY29kZVwiIGluIGVyciAmJlxuICAgIChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBjb2RlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVudHJ5VHlwZShlbnRyeToge1xuICBpc0ZpbGUoKTogYm9vbGVhbjtcbiAgaXNEaXJlY3RvcnkoKTogYm9vbGVhbjtcbiAgaXNTeW1ib2xpY0xpbmsoKTogYm9vbGVhbjtcbn0pOiBGaWxlRW50cnlUeXBlIHtcbiAgaWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBcInN5bWJvbGljLWxpbmtcIjtcbiAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHJldHVybiBcImRpcmVjdG9yeVwiO1xuICBpZiAoZW50cnkuaXNGaWxlKCkpIHJldHVybiBcImZpbGVcIjtcbiAgcmV0dXJuIFwib3RoZXJcIjtcbn1cblxuLyoqIE5vZGUgZXJybm8gLT4gcG9ydGFibGUge0BsaW5rIEZpbGVTeXN0ZW1FcnJvckNvZGV9LiAqL1xuY29uc3QgTk9ERV9FUlJPUl9DT0RFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRmlsZVN5c3RlbUVycm9yQ29kZT4+ID0ge1xuICBFTk9FTlQ6IFwiTk9UX0ZPVU5EXCIsXG4gIEVFWElTVDogXCJBTFJFQURZX0VYSVNUU1wiLFxuICBFTk9URElSOiBcIk5PVF9ESVJFQ1RPUllcIixcbiAgRUlTRElSOiBcIklTX0RJUkVDVE9SWVwiLFxuICBFTk9URU1QVFk6IFwiRElSRUNUT1JZX05PVF9FTVBUWVwiLFxuICBFQUNDRVM6IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgRVBFUk06IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbn07XG5cbmZ1bmN0aW9uIG5vZGVFcnJvckNvZGUoZXJyOiB1bmtub3duKTogRmlsZVN5c3RlbUVycm9yQ29kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvZGUgPSAoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IHVuZGVmaW5lZCk/LmNvZGU7XG4gIHJldHVybiBjb2RlID8gTk9ERV9FUlJPUl9DT0RFU1tjb2RlXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtfSByb290ZWQgdW5kZXIge0BsaW5rIHJlc29sdmVMb2NhbEhvbWV9LCB3aXRoXG4gKiB7QGxpbmsgcmVsYXRpdmVSb290fSBqb2luZWQgYXMgYSByZWxhdGl2ZSBwYXRoIChsZWFkaW5nIGAvYCAvIGB+YCBzdHJpcHBlZFxuICogc28gdGhlIHJlc3VsdCBzdGF5cyB1bmRlciBob21lKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNhY2hlID0gaG9tZUZTKFwiLmNhY2hlL215LWFwcFwiKTtcbiAqIGF3YWl0IGNhY2hlLndyaXRlRmlsZShcInN0YXRlLmpzb25cIiwgXCJ7fVwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9tZUZTKFxuICByZWxhdGl2ZVJvb3Q6IHN0cmluZyA9IFwiLlwiLFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICBjb25zdCB7IG9zLCAuLi5mc09wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAuLi5mc09wdGlvbnMsXG4gICAgcm9vdDogam9pblVuZGVyQmFzZShyZXNvbHZlTG9jYWxIb21lKG9zKSwgcmVsYXRpdmVSb290KSxcbiAgfSk7XG59XG5cbi8qKlxuICoge0BsaW5rIExvY2FsRmlsZVN5c3RlbX0gcm9vdGVkIHVuZGVyIHtAbGluayByZXNvbHZlTG9jYWxUZW1wfSwgd2l0aFxuICoge0BsaW5rIHJlbGF0aXZlUm9vdH0gam9pbmVkIGFzIGEgcmVsYXRpdmUgcGF0aCAobGVhZGluZyBgL2AgLyBgfmAgc3RyaXBwZWRcbiAqIHNvIHRoZSByZXN1bHQgc3RheXMgdW5kZXIgdGVtcCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJqb2ItNDJcIik7XG4gKiBhd2FpdCBzY3JhdGNoLndyaXRlRmlsZShcIm91dC5iaW5cIiwgYnl0ZXMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0bXBGUyhcbiAgcmVsYXRpdmVSb290OiBzdHJpbmcgPSBcIi5cIixcbiAgb3B0aW9uczogT3NGaWxlU3lzdGVtT3B0aW9ucyA9IHt9LFxuKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgY29uc3QgeyBvcywgLi4uZnNPcHRpb25zIH0gPSBvcHRpb25zO1xuICByZXR1cm4gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgLi4uZnNPcHRpb25zLFxuICAgIHJvb3Q6IGpvaW5VbmRlckJhc2UocmVzb2x2ZUxvY2FsVGVtcChvcyksIHJlbGF0aXZlUm9vdCksXG4gIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayB0bXBGU30gdW5kZXIgYSByb290IHRoYXQgaXMgdW5pcXVlIHBlciBjYWxsIChgPHByZWZpeD4tPGlkPmApLCBmb3IgYVxuICogc2NyYXRjaCBhcmVhIG5vIG90aGVyIHByb2Nlc3Mgb3IgcnVuIGNhbiBjb2xsaWRlIHdpdGguXG4gKlxuICogUHJlZmVyIHRoaXMgb3ZlciBtaW50aW5nIHRoZSBpZCBhdCB0aGUgY2FsbCBzaXRlIC0gaXQgaXMgdGhlIG9uZSBwbGFjZSB0aGF0XG4gKiBkZWNpZGVzIHdoYXQgYSB0aHJvd2F3YXkgd29ya2luZyBkaXJlY3RvcnkgbG9va3MgbGlrZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHNjcmF0Y2ggPSBzY3JhdGNoRlMoXCJyZW1vdGUtc2tpbGxzXCIpO1xuICogYXdhaXQgc2NyYXRjaC53cml0ZUZpbGUoXCJTS0lMTC5tZFwiLCBib2R5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyYXRjaEZTKHByZWZpeDogc3RyaW5nLCBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICByZXR1cm4gdG1wRlMoYCR7cHJlZml4fS0ke2hhc2guaWQoKX1gLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZWJ1aWxkIHRoZSBTVEFCTEUgdGVtcCB0cmVlIG5hbWVkIGJ5IHtAbGluayBrZXl9LCBldmVyeSBjYWxsLlxuICpcbiAqIHtAbGluayBtYXRlcmlhbGl6ZX0gd3JpdGVzIGludG8gYSB0aHJvd2F3YXkge0BsaW5rIHNjcmF0Y2hGU30gcm9vdDsgb25seSBvblxuICogc3VjY2VzcyBkb2VzIHRoYXQgcm9vdCBSRVBMQUNFIHRoZSBzdGFibGUgb25lLiBUd28gcHJvcGVydGllcyBmYWxsIG91dCBvZlxuICogdGhhdCBvcmRlcmluZywgYW5kIGJvdGggYXJlIHRoZSByZWFzb24gdG8gcHJlZmVyIHRoaXMgb3ZlciB3cml0aW5nIGludG8gdGhlXG4gKiBzdGFibGUgcGF0aCBkaXJlY3RseTpcbiAqXG4gKiAtIHJlcGVhdGVkIHJ1bnMgcmV1c2UgT05FIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBuZXcgc2NyYXRjaCBiZWhpbmRcbiAqICAgb24gZXZlcnkgYm9vdCwgYW5kXG4gKiAtIGEgcmVhZGVyIG5ldmVyIG9ic2VydmVzIGEgaGFsZi13cml0dGVuIHRyZWUsIGFuZCBhIGZhaWxlZCByZWJ1aWxkIGxlYXZlc1xuICogICB0aGUgcHJldmlvdXMgb25lIGludGFjdC5cbiAqXG4gKiBUaGUgc3dhcCBpcyBhIGByZW5hbWVgIHdpdGhpbiB0aGUgc2FtZSB0ZW1wIHJvb3QsIHNvIGl0IGlzIGF0b21pYy5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gU3RhYmxlIHRlbXAtcmVsYXRpdmUgcGF0aC4gTWF5IGJlIG5lc3RlZCAoYFwic2tpbGxzL2FiYzEyM1wiYClcbiAqICAgdG8gZ2l2ZSBlYWNoIGlucHV0IGl0cyBvd24gZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qgc2tpbGxzID0gYXdhaXQgcmVidWlsZEZTKFwiYWdlbnQtc2tpbGxzXCIsIChzY3JhdGNoKSA9PlxuICogICBkb3dubG9hZEludG8oc2NyYXRjaC5yb290KSxcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRGUyhcbiAga2V5OiBzdHJpbmcsXG4gIG1hdGVyaWFsaXplOiAoc2NyYXRjaDogTG9jYWxGaWxlU3lzdGVtKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gc2NyYXRjaEZTKGtleSwgb3B0aW9ucyk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemUoc2NyYXRjaCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2gucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgY29uc3Qgc3RhYmxlID0gdG1wRlMoa2V5LCBvcHRpb25zKTtcbiAgY29uc3Qgc3RhYmxlSG9zdCA9IHBhdGgucmVzb2x2ZShzdGFibGUucm9vdCk7XG4gIGF3YWl0IHJtKHN0YWJsZUhvc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHN0YWJsZUhvc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcmVuYW1lKHBhdGgucmVzb2x2ZShzY3JhdGNoLnJvb3QpLCBzdGFibGVIb3N0KTtcbiAgcmV0dXJuIHN0YWJsZTtcbn1cblxuLyoqXG4gKiBKb2luIHtAbGluayByZWxhdGl2ZVJvb3R9IHVuZGVyIHtAbGluayBiYXNlfS4gRW1wdHkgLyBgLmAga2VlcHMge0BsaW5rIGJhc2V9O1xuICogbGVhZGluZyBgfmAgb3IgYC9gIGlzIHN0cmlwcGVkIHNvIGFuIGFic29sdXRlLWxvb2tpbmcgaW5wdXQgY2Fubm90IGVzY2FwZS5cbiAqL1xuZnVuY3Rpb24gam9pblVuZGVyQmFzZShiYXNlOiBzdHJpbmcsIHJlbGF0aXZlUm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdCA9IHBvc2l4UGF0aC50b1JlbGF0aXZlU2VnbWVudChyZWxhdGl2ZVJvb3QpO1xuICByZXR1cm4gcmVzdCA/IHBhdGgucmVzb2x2ZShiYXNlLCByZXN0KSA6IGJhc2U7XG59XG4iXX0=
330
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtZnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbG9jYWwtZnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCxPQUFPLEVBQ0wsVUFBVSxFQUNWLEVBQUUsRUFDRixLQUFLLEVBQ0wsS0FBSyxFQUNMLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLE1BQU0sRUFDTixFQUFFLEVBQ0YsS0FBSyxFQUNMLFNBQVMsR0FDVixNQUFNLGtCQUFrQixDQUFDO0FBQzFCLE9BQU8sSUFBSSxNQUFNLFdBQVcsQ0FBQztBQUM3QixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUNMLGNBQWMsRUFDZCxNQUFNLEVBQ04sZUFBZSxFQUNmLFNBQVMsR0FPVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ25ELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxnQkFBZ0IsRUFBOEIsTUFBTSxjQUFjLENBQUM7QUE4QzlGOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsY0FBdUI7SUFDekMsU0FBUyxDQUFVO0lBQ3BDLCtEQUErRDtJQUN2RCxRQUFRLENBQVM7SUFFekIsWUFBWSxPQUErQjtRQUN6QyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUM1RCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUNsRSxLQUFLLENBQUM7WUFDSixFQUFFLEVBQUUsT0FBTyxDQUFDLEVBQUUsSUFBSSxTQUFTLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDL0MsT0FBTyxFQUFF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LENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEhvc3QtbG9jYWwge0BsaW5rIEZpbGVTeXN0ZW19IGJhY2tlZCBieSBOb2RlJ3MgYG5vZGU6ZnMvcHJvbWlzZXNgLlxuICpcbiAqIEV4dGVuZHMge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSBzbyB0aGlzIG1vZHVsZSBvbmx5IG93bnMgTm9kZSBJL08sIGhvc3QgcGF0aFxuICogY29udmVyc2lvbiwgYW5kIHN5bWxpbmsgY29udGFpbm1lbnQuIFBvcnRhYmxlIGJlaGF2aW9yIChlbmNvZGluZywgcmVjdXJzaW9uLFxuICogcGFyZW50IGNyZWF0aW9uLCBmYWxsYmFja3MsIFBPU0lYIG5hbWVzcGFjZSBwYXRocykgbGl2ZXMgaW4gYEBkYngtdG9vbHMvc2hhcmVkLWZzYC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgYXBwZW5kRmlsZSxcbiAgY3AsXG4gIGxzdGF0LFxuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhZEZpbGUsXG4gIHJlYWxwYXRoLFxuICByZW5hbWUsXG4gIHJtLFxuICBybWRpcixcbiAgd3JpdGVGaWxlLFxufSBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaGFzaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBCYXNlRmlsZVN5c3RlbSxcbiAgYmFzZUZTLFxuICBGaWxlU3lzdGVtRXJyb3IsXG4gIHBvc2l4UGF0aCxcbiAgdHlwZSBDb3B5T3B0aW9ucyxcbiAgdHlwZSBGaWxlRW50cnksXG4gIHR5cGUgRmlsZUVudHJ5VHlwZSxcbiAgdHlwZSBGaWxlU3RhdCxcbiAgdHlwZSBGaWxlU3lzdGVtRXJyb3JDb2RlLFxuICB0eXBlIFdyaXRlRmlsZU9wdGlvbnMsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHsgcmVzb2x2ZUxvY2FsUm9vdCB9IGZyb20gXCIuL2xvY2FsLXBhdGgudHNcIjtcbmltcG9ydCB7IHJlc29sdmVMb2NhbEhvbWUsIHJlc29sdmVMb2NhbFRlbXAsIHR5cGUgUmVzb2x2ZU9zUGF0aHNPcHRpb25zIH0gZnJvbSBcIi4vb3MtcGF0aC50c1wiO1xuXG4vKiogT3B0aW9ucyBmb3Ige0BsaW5rIExvY2FsRmlsZVN5c3RlbX0uICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsRmlsZVN5c3RlbU9wdGlvbnMge1xuICAvKiogVW5pcXVlIGlkZW50aWZpZXIuIERlZmF1bHRzIHRvIGEgc3RhYmxlIGhhc2ggb2YgdGhlIGFic29sdXRlIHJvb3QuICovXG4gIGlkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBSb290IGRpcmVjdG9yeSBvbiBkaXNrLiBSZWxhdGl2ZSBwYXRocyByZXNvbHZlIGFnYWluc3QgYHByb2Nlc3MuY3dkKClgLlxuICAgKiBgfmAgLyBgfi8uLi5gIGV4cGFuZCB2aWEgYG9zLmhvbWVkaXIoKWAgKGJlZm9yZSBgSE9NRWApLCBBcHAgYC9ob21lL2FwcGAsXG4gICAqIG9yIGEgY3JlYXRlZCBgLi8uaG9tZWAgKGNyZWF0ZSBmYWlsdXJlcyBza2lwKS5cbiAgICogU3RvcmVkIG9uIHtAbGluayBMb2NhbEZpbGVTeXN0ZW0ucm9vdH0gaW4gUE9TSVggZm9ybS5cbiAgICovXG4gIHJvb3Q6IHN0cmluZztcblxuICAvKiogQmxvY2sgYWxsIHdyaXRlIG9wZXJhdGlvbnMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICByZWFkT25seT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEtlZXAgZXZlcnkgcmVzb2x2ZWQgcGF0aCB1bmRlciB7QGxpbmsgcm9vdH0uIERlZmF1bHRzIHRvIHRydWUuXG4gICAqIFdoZW4gZmFsc2UsIGFic29sdXRlIGlucHV0IHBhdGhzIGFyZSBhY2NlcHRlZCBhcy1pcyAobm8gc2FuZGJveCkuXG4gICAqL1xuICBjb250YWluZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBDcmVhdGUge0BsaW5rIHJvb3R9IChhbmQgcGFyZW50cykgZHVyaW5nIGluaXQuIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5qZWN0YWJsZXMgZm9yd2FyZGVkIHRvIHtAbGluayByZXNvbHZlTG9jYWxSb290fSBmb3IgYH5gIGV4cGFuc2lvbiAoaG9tZSAvXG4gICAqIHRlbXAgLyBjd2Qgb3ZlcnJpZGVzKS4gTWFpbmx5IGZvciB0ZXN0czogYnVuJ3MgYG9zLmhvbWVkaXIoKWAgaWdub3JlcyBhXG4gICAqIHByb2Nlc3Mtc2V0IGBIT01FYCwgc28gb3ZlcnJpZGluZyBob21lIHZpYSBgeyBvczogeyBob21lRGlyIH0gfWAgaXMgdGhlXG4gICAqIHJ1bnRpbWUtYWdub3N0aWMgd2F5IHRvIHBvaW50IGEgYH5gIHJvb3QgYXQgYSBjaG9zZW4gZGlyZWN0b3J5LlxuICAgKi9cbiAgb3M/OiBSZXNvbHZlT3NQYXRoc09wdGlvbnM7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgdGhlIGZhY3RvcmllcyB0aGF0IHRha2UgdGhlaXIgcm9vdCBGUk9NIHRoZSBPU1xuICogKHtAbGluayBob21lRlN9IC8ge0BsaW5rIHRtcEZTfSAvIHtAbGluayBzY3JhdGNoRlN9KSByYXRoZXIgdGhhbiBmcm9tIHRoZVxuICogY2FsbGVyOiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtT3B0aW9uc30gd2l0aG91dCBgcm9vdGAsIHBsdXMgdGhlXG4gKiB7QGxpbmsgcmVzb2x2ZU9zUGF0aHN9IGluamVjdGFibGVzLlxuICovXG5leHBvcnQgdHlwZSBPc0ZpbGVTeXN0ZW1PcHRpb25zID0gT21pdDxMb2NhbEZpbGVTeXN0ZW1PcHRpb25zLCBcInJvb3RcIj47XG5cbi8qKlxuICoge0BsaW5rIEZpbGVTeXN0ZW19IGltcGxlbWVudGF0aW9uIHRoYXQgc3RvcmVzIGZpbGVzIGluIGEgZm9sZGVyIG9uIHRoZSBsb2NhbFxuICogbWFjaGluZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGZzID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwiLi9kYXRhXCIgfSk7XG4gKiBhd2FpdCBmcy5pbml0KCk7XG4gKiBhd2FpdCBmcy53cml0ZUZpbGUoXCJoZWxsby50eHRcIiwgXCJoaVwiKTtcbiAqXG4gKiBjb25zdCBob21lID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7IHJvb3Q6IFwifi9wcm9qZWN0cy9kYXRhXCIgfSk7XG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJteS1qb2JcIik7XG4gKiBjb25zdCBjYWNoZSA9IGhvbWVGUyhcIi5jYWNoZS9hcHBcIik7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIExvY2FsRmlsZVN5c3RlbSBleHRlbmRzIEJhc2VGaWxlU3lzdGVtPFwibG9jYWxcIj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lZDogYm9vbGVhbjtcbiAgLyoqIFN5bWxpbmstcmVzb2x2ZWQgaG9zdCByb290LCByZWZyZXNoZWQgaW4ge0BsaW5rIG9uSW5pdH0uICovXG4gIHByaXZhdGUgcmVhbFJvb3Q6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihvcHRpb25zOiBMb2NhbEZpbGVTeXN0ZW1PcHRpb25zKSB7XG4gICAgY29uc3QgaG9zdFJvb3QgPSByZXNvbHZlTG9jYWxSb290KG9wdGlvbnMucm9vdCwgb3B0aW9ucy5vcyk7XG4gICAgY29uc3Qgcm9vdCA9IHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHBvc2l4UGF0aC50b1Bvc2l4KGhvc3RSb290KSk7XG4gICAgc3VwZXIoe1xuICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gYGxvY2FsLSR7aGFzaC5mbnZIYXNoKHJvb3QpfWAsXG4gICAgICBiYWNrZW5kOiBcImxvY2FsXCIsXG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IG9wdGlvbnMucmVhZE9ubHksXG4gICAgICBjcmVhdGVSb290OiBvcHRpb25zLmNyZWF0ZVJvb3QgPz8gdHJ1ZSxcbiAgICB9KTtcbiAgICB0aGlzLnJlYWxSb290ID0gdGhpcy50b0JhY2tlbmRQYXRoKHJvb3QpO1xuICAgIHRoaXMuY29udGFpbmVkID0gb3B0aW9ucy5jb250YWluZWQgPz8gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSB0b0JhY2tlbmRQYXRoKHBvc2l4QmFja2VuZFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHBvc2l4UGF0aC50b0hvc3QocG9zaXhCYWNrZW5kUGF0aCwgcGF0aC5zZXApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVJvb3REaXJlY3RvcnkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIodGhpcy50b0JhY2tlbmRQYXRoKHRoaXMucm9vdCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIG9uSW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBob3N0Um9vdCA9IHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpO1xuICAgIGlmICghdGhpcy5jcmVhdGVSb290KSB7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgbHN0YXQoaG9zdFJvb3QpO1xuICAgICAgaWYgKCFpbmZvLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICBcIk5PVF9ESVJFQ1RPUllcIixcbiAgICAgICAgICBgTG9jYWwgZmlsZXN5c3RlbSByb290IGlzIG5vdCBhIGRpcmVjdG9yeTogJHt0aGlzLnJvb3R9YCxcbiAgICAgICAgICB0aGlzLnJvb3QsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIENhbm9uaWNhbGl6ZSBzbyBjb250YWlubWVudCBjaGVja3Mgc3Vydml2ZSBPUyByb290IHN5bWxpbmtzIChlLmcuIC92YXIgLT4gL3ByaXZhdGUvdmFyKS5cbiAgICB0aGlzLnJlYWxSb290ID0gYXdhaXQgcmVhbHBhdGgoaG9zdFJvb3QpO1xuICB9XG5cbiAgb3ZlcnJpZGUgcmVzb2x2ZVBhdGgoaW5wdXRQYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICghdGhpcy5jb250YWluZWQpIHtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gcGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aClcbiAgICAgICAgPyBwYXRoLnJlc29sdmUoaW5wdXRQYXRoKVxuICAgICAgICA6IHBhdGgucmVzb2x2ZSh0aGlzLnRvQmFja2VuZFBhdGgodGhpcy5yb290KSwgaW5wdXRQYXRoKTtcbiAgICAgIHJldHVybiB0aGlzLnRvQmFja2VuZFBhdGgocG9zaXhQYXRoLnRvUG9zaXgocmVzb2x2ZWQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLnJlc29sdmVQYXRoKGlucHV0UGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiBjb250YWluZWQsIHJlc29sdmUgc3ltbGlua3MgYW5kIGVuc3VyZSB0aGUgcmVhbCBwYXRoIHN0aWxsIHNpdHMgdW5kZXJcbiAgICoge0BsaW5rIHJvb3R9LiBNaXNzaW5nIGxlYWYgcGF0aHMgYXJlIGFsbG93ZWQgd2hlbiBgYWxsb3dNaXNzaW5nYCBpcyBzZXQgc29cbiAgICogd3JpdGVzIGNhbiBjcmVhdGUgbmV3IGZpbGVzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHByZXBhcmVQYXRoKFxuICAgIHJlc29sdmVkUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGFsbG93TWlzc2luZz86IGJvb2xlYW4gfSxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuY29udGFpbmVkKSByZXR1cm4gcmVzb2x2ZWRQYXRoO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZWFsID0gYXdhaXQgcmVhbHBhdGgocmVzb2x2ZWRQYXRoKTtcbiAgICAgIGlmICghaXNXaXRoaW5Ib3N0Um9vdCh0aGlzLnJlYWxSb290LCByZWFsKSkge1xuICAgICAgICB0aHJvdyBuZXcgRmlsZVN5c3RlbUVycm9yKFxuICAgICAgICAgIFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgICAgICAgICBcIlBhdGggZXNjYXBlcyB0aGUgZmlsZXN5c3RlbSByb290XCIsXG4gICAgICAgICAgcmVzb2x2ZWRQYXRoLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc29sdmVkUGF0aDtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IpIHRocm93IGVycjtcbiAgICAgIGlmIChvcHRpb25zPy5hbGxvd01pc3NpbmcgJiYgaXNFcnJubyhlcnIsIFwiRU5PRU5UXCIpKSB7XG4gICAgICAgIGxldCBjdXJzb3IgPSBwYXRoLmRpcm5hbWUocmVzb2x2ZWRQYXRoKTtcbiAgICAgICAgd2hpbGUgKGN1cnNvciAhPT0gcGF0aC5kaXJuYW1lKGN1cnNvcikpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhbCA9IGF3YWl0IHJlYWxwYXRoKGN1cnNvcik7XG4gICAgICAgICAgICBpZiAoIWlzV2l0aGluSG9zdFJvb3QodGhpcy5yZWFsUm9vdCwgcmVhbCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEZpbGVTeXN0ZW1FcnJvcihcbiAgICAgICAgICAgICAgICBcIlBFUk1JU1NJT05fREVOSUVEXCIsXG4gICAgICAgICAgICAgICAgXCJQYXRoIGVzY2FwZXMgdGhlIGZpbGVzeXN0ZW0gcm9vdFwiLFxuICAgICAgICAgICAgICAgIHJlc29sdmVkUGF0aCxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICAgICAgfSBjYXRjaCAoaW5uZXIpIHtcbiAgICAgICAgICAgIGlmIChpbm5lciBpbnN0YW5jZW9mIEZpbGVTeXN0ZW1FcnJvcikgdGhyb3cgaW5uZXI7XG4gICAgICAgICAgICBpZiAoIWlzRXJybm8oaW5uZXIsIFwiRU5PRU5UXCIpKSB0aHJvdyB0aGlzLm1hcEVycm9yKGlubmVyLCByZXNvbHZlZFBhdGgpO1xuICAgICAgICAgICAgY3Vyc29yID0gcGF0aC5kaXJuYW1lKGN1cnNvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgICB9XG4gICAgICB0aHJvdyB0aGlzLm1hcEVycm9yKGVyciwgcmVzb2x2ZWRQYXRoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xhc3NpZnkgTm9kZSBlcnJubyBjb2Rlczsge0BsaW5rIEJhc2VGaWxlU3lzdGVtfSB3cmFwcyBldmVyeSBwcmltaXRpdmUuICovXG4gIHByb3RlY3RlZCBvdmVycmlkZSBtYXBFcnJvcihlcnI6IHVua25vd24sIGZpbGVQYXRoOiBzdHJpbmcpOiBGaWxlU3lzdGVtRXJyb3Ige1xuICAgIHJldHVybiBiYXNlRlMubWFwRmlsZVN5c3RlbUVycm9yKGVyciwgZmlsZVBhdGgsIG5vZGVFcnJvckNvZGUpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHJlYWRCeXRlc0F0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUocmVzb2x2ZWRQYXRoKTtcbiAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoYnVmZmVyLmJ1ZmZlciwgYnVmZmVyLmJ5dGVPZmZzZXQsIGJ1ZmZlci5ieXRlTGVuZ3RoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyB3cml0ZUJ5dGVzQXQoXG4gICAgcmVzb2x2ZWRQYXRoOiBzdHJpbmcsXG4gICAgY29udGVudDogVWludDhBcnJheSxcbiAgICBvcHRpb25zOiBSZXF1aXJlZDxXcml0ZUZpbGVPcHRpb25zPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgd3JpdGVGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCwgb3B0aW9ucy5vdmVyd3JpdGUgPyB1bmRlZmluZWQgOiB7IGZsYWc6IFwid3hcIiB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyBkZWxldGVGaWxlQXQocmVzb2x2ZWRQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCBybShyZXNvbHZlZFBhdGgsIHsgZm9yY2U6IGZhbHNlIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZURpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgbWtkaXIocmVzb2x2ZWRQYXRoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBhc3luYyByZW1vdmVEaXJlY3RvcnlBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHJtZGlyKHJlc29sdmVkUGF0aCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgbGlzdERpcmVjdG9yeUF0KHJlc29sdmVkUGF0aDogc3RyaW5nKTogUHJvbWlzZTxGaWxlRW50cnlbXT4ge1xuICAgIGNvbnN0IGRpcmVudHMgPSBhd2FpdCByZWFkZGlyKHJlc29sdmVkUGF0aCwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgIGNvbnN0IGVudHJpZXM6IEZpbGVFbnRyeVtdID0gW107XG4gICAgZm9yIChjb25zdCBkaXJlbnQgb2YgZGlyZW50cykge1xuICAgICAgY29uc3QgdHlwZSA9IGVudHJ5VHlwZShkaXJlbnQpO1xuICAgICAgbGV0IHNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICAgIGlmICh0eXBlID09PSBcImZpbGVcIiB8fCB0eXBlID09PSBcInN5bWJvbGljLWxpbmtcIikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHNpemUgPSAoYXdhaXQgbHN0YXQocGF0aC5qb2luKHJlc29sdmVkUGF0aCwgZGlyZW50Lm5hbWUpKSkuc2l6ZTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gUmFjZSB3aXRoIGNvbmN1cnJlbnQgZGVsZXRlczsgb21pdCBzaXplLlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbnRyaWVzLnB1c2goXG4gICAgICAgIHNpemUgPT09IHVuZGVmaW5lZCA/IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUgfSA6IHsgbmFtZTogZGlyZW50Lm5hbWUsIHR5cGUsIHNpemUgfSxcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiBlbnRyaWVzO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHN0YXRBdChyZXNvbHZlZFBhdGg6IHN0cmluZyk6IFByb21pc2U8T21pdDxGaWxlU3RhdCwgXCJwYXRoXCI+PiB7XG4gICAgY29uc3QgaW5mbyA9IGF3YWl0IGxzdGF0KHJlc29sdmVkUGF0aCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHBhdGguYmFzZW5hbWUocmVzb2x2ZWRQYXRoKSB8fCBwYXRoLmJhc2VuYW1lKHRoaXMudG9CYWNrZW5kUGF0aCh0aGlzLnJvb3QpKSxcbiAgICAgIHR5cGU6IGVudHJ5VHlwZShpbmZvKSxcbiAgICAgIHNpemU6IGluZm8uc2l6ZSxcbiAgICAgIGNyZWF0ZWRBdDogaW5mby5iaXJ0aHRpbWUsXG4gICAgICBtb2RpZmllZEF0OiBpbmZvLm10aW1lLFxuICAgICAgYWNjZXNzZWRBdDogaW5mby5hdGltZSxcbiAgICB9O1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGlzTm90Rm91bmRFcnJvcihlcnJvcjogdW5rbm93bik6IGJvb2xlYW4ge1xuICAgIHJldHVybiAoXG4gICAgICAoZXJyb3IgaW5zdGFuY2VvZiBGaWxlU3lzdGVtRXJyb3IgJiYgZXJyb3IuY29kZSA9PT0gXCJOT1RfRk9VTkRcIikgfHwgaXNFcnJubyhlcnJvciwgXCJFTk9FTlRcIilcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeUFwcGVuZEZpbGVBdChcbiAgICByZXNvbHZlZFBhdGg6IHN0cmluZyxcbiAgICBjb250ZW50OiBVaW50OEFycmF5LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBhcHBlbmRGaWxlKHJlc29sdmVkUGF0aCwgY29udGVudCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgYXN5bmMgdHJ5Q29weUZpbGVBdChcbiAgICBzb3VyY2VQYXRoOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25QYXRoOiBzdHJpbmcsXG4gICAgb3B0aW9uczogUmVxdWlyZWQ8Q29weU9wdGlvbnM+LFxuICApOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBhd2FpdCBjcChzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgsIHtcbiAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIGZvcmNlOiBvcHRpb25zLm92ZXJ3cml0ZSxcbiAgICAgIGVycm9yT25FeGlzdDogIW9wdGlvbnMub3ZlcndyaXRlLFxuICAgIH0pO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGFzeW5jIHRyeU1vdmVGaWxlQXQoXG4gICAgc291cmNlUGF0aDogc3RyaW5nLFxuICAgIGRlc3RpbmF0aW9uUGF0aDogc3RyaW5nLFxuICAgIG9wdGlvbnM6IFJlcXVpcmVkPENvcHlPcHRpb25zPixcbiAgKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlbmFtZShzb3VyY2VQYXRoLCBkZXN0aW5hdGlvblBhdGgpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgLy8gQWNyb3NzIGRldmljZXMgYHJlbmFtZWAgY2Fubm90IHdvcms7IGZhbGwgYmFjayB0byBjb3B5ICsgcmVtb3ZlLiBBbnlcbiAgICAgIC8vIG90aGVyIGZhaWx1cmUgcHJvcGFnYXRlcyBmb3IgdGhlIGJhc2UgY2xhc3MgdG8gbWFwLlxuICAgICAgaWYgKCFpc0Vycm5vKGVyciwgXCJFWERFVlwiKSkgdGhyb3cgZXJyO1xuICAgICAgYXdhaXQgY3Aoc291cmNlUGF0aCwgZGVzdGluYXRpb25QYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IG9wdGlvbnMub3ZlcndyaXRlIH0pO1xuICAgICAgYXdhaXQgcm0oc291cmNlUGF0aCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gaXNXaXRoaW5Ib3N0Um9vdChyb290OiBzdHJpbmcsIGNhbmRpZGF0ZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IHJlbGF0aXZlID0gcGF0aC5yZWxhdGl2ZShyb290LCBjYW5kaWRhdGUpO1xuICByZXR1cm4gcmVsYXRpdmUgPT09IFwiXCIgfHwgKCFyZWxhdGl2ZS5zdGFydHNXaXRoKFwiLi5cIikgJiYgIXBhdGguaXNBYnNvbHV0ZShyZWxhdGl2ZSkpO1xufVxuXG5mdW5jdGlvbiBpc0Vycm5vKGVycjogdW5rbm93biwgY29kZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIGVyciA9PT0gXCJvYmplY3RcIiAmJlxuICAgIGVyciAhPT0gbnVsbCAmJlxuICAgIFwiY29kZVwiIGluIGVyciAmJlxuICAgIChlcnIgYXMgTm9kZUpTLkVycm5vRXhjZXB0aW9uKS5jb2RlID09PSBjb2RlXG4gICk7XG59XG5cbmZ1bmN0aW9uIGVudHJ5VHlwZShlbnRyeToge1xuICBpc0ZpbGUoKTogYm9vbGVhbjtcbiAgaXNEaXJlY3RvcnkoKTogYm9vbGVhbjtcbiAgaXNTeW1ib2xpY0xpbmsoKTogYm9vbGVhbjtcbn0pOiBGaWxlRW50cnlUeXBlIHtcbiAgaWYgKGVudHJ5LmlzU3ltYm9saWNMaW5rKCkpIHJldHVybiBcInN5bWJvbGljLWxpbmtcIjtcbiAgaWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHJldHVybiBcImRpcmVjdG9yeVwiO1xuICBpZiAoZW50cnkuaXNGaWxlKCkpIHJldHVybiBcImZpbGVcIjtcbiAgcmV0dXJuIFwib3RoZXJcIjtcbn1cblxuLyoqIE5vZGUgZXJybm8gLT4gcG9ydGFibGUge0BsaW5rIEZpbGVTeXN0ZW1FcnJvckNvZGV9LiAqL1xuY29uc3QgTk9ERV9FUlJPUl9DT0RFUzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgRmlsZVN5c3RlbUVycm9yQ29kZT4+ID0ge1xuICBFTk9FTlQ6IFwiTk9UX0ZPVU5EXCIsXG4gIEVFWElTVDogXCJBTFJFQURZX0VYSVNUU1wiLFxuICBFTk9URElSOiBcIk5PVF9ESVJFQ1RPUllcIixcbiAgRUlTRElSOiBcIklTX0RJUkVDVE9SWVwiLFxuICBFTk9URU1QVFk6IFwiRElSRUNUT1JZX05PVF9FTVBUWVwiLFxuICBFQUNDRVM6IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbiAgRVBFUk06IFwiUEVSTUlTU0lPTl9ERU5JRURcIixcbn07XG5cbmZ1bmN0aW9uIG5vZGVFcnJvckNvZGUoZXJyOiB1bmtub3duKTogRmlsZVN5c3RlbUVycm9yQ29kZSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvZGUgPSAoZXJyIGFzIE5vZGVKUy5FcnJub0V4Y2VwdGlvbiB8IHVuZGVmaW5lZCk/LmNvZGU7XG4gIHJldHVybiBjb2RlID8gTk9ERV9FUlJPUl9DT0RFU1tjb2RlXSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiB7QGxpbmsgTG9jYWxGaWxlU3lzdGVtfSByb290ZWQgdW5kZXIge0BsaW5rIHJlc29sdmVMb2NhbEhvbWV9LCB3aXRoXG4gKiB7QGxpbmsgcmVsYXRpdmVSb290fSBqb2luZWQgYXMgYSByZWxhdGl2ZSBwYXRoIChsZWFkaW5nIGAvYCAvIGB+YCBzdHJpcHBlZFxuICogc28gdGhlIHJlc3VsdCBzdGF5cyB1bmRlciBob21lKS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IGNhY2hlID0gaG9tZUZTKFwiLmNhY2hlL215LWFwcFwiKTtcbiAqIGF3YWl0IGNhY2hlLndyaXRlRmlsZShcInN0YXRlLmpzb25cIiwgXCJ7fVwiKTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gaG9tZUZTKFxuICByZWxhdGl2ZVJvb3Q6IHN0cmluZyA9IFwiLlwiLFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICBjb25zdCB7IG9zLCAuLi5mc09wdGlvbnMgfSA9IG9wdGlvbnM7XG4gIHJldHVybiBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAuLi5mc09wdGlvbnMsXG4gICAgcm9vdDogam9pblVuZGVyQmFzZShyZXNvbHZlTG9jYWxIb21lKG9zKSwgcmVsYXRpdmVSb290KSxcbiAgfSk7XG59XG5cbi8qKlxuICoge0BsaW5rIExvY2FsRmlsZVN5c3RlbX0gcm9vdGVkIHVuZGVyIHtAbGluayByZXNvbHZlTG9jYWxUZW1wfSwgd2l0aFxuICoge0BsaW5rIHJlbGF0aXZlUm9vdH0gam9pbmVkIGFzIGEgcmVsYXRpdmUgcGF0aCAobGVhZGluZyBgL2AgLyBgfmAgc3RyaXBwZWRcbiAqIHNvIHRoZSByZXN1bHQgc3RheXMgdW5kZXIgdGVtcCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBjb25zdCBzY3JhdGNoID0gdG1wRlMoXCJqb2ItNDJcIik7XG4gKiBhd2FpdCBzY3JhdGNoLndyaXRlRmlsZShcIm91dC5iaW5cIiwgYnl0ZXMpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0bXBGUyhcbiAgcmVsYXRpdmVSb290OiBzdHJpbmcgPSBcIi5cIixcbiAgb3B0aW9uczogT3NGaWxlU3lzdGVtT3B0aW9ucyA9IHt9LFxuKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgY29uc3QgeyBvcywgLi4uZnNPcHRpb25zIH0gPSBvcHRpb25zO1xuICByZXR1cm4gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgLi4uZnNPcHRpb25zLFxuICAgIHJvb3Q6IGpvaW5VbmRlckJhc2UocmVzb2x2ZUxvY2FsVGVtcChvcyksIHJlbGF0aXZlUm9vdCksXG4gIH0pO1xufVxuXG4vKipcbiAqIHtAbGluayB0bXBGU30gdW5kZXIgYSByb290IHRoYXQgaXMgdW5pcXVlIHBlciBjYWxsIChgPHByZWZpeD4tPGlkPmApLCBmb3IgYVxuICogc2NyYXRjaCBhcmVhIG5vIG90aGVyIHByb2Nlc3Mgb3IgcnVuIGNhbiBjb2xsaWRlIHdpdGguXG4gKlxuICogUHJlZmVyIHRoaXMgb3ZlciBtaW50aW5nIHRoZSBpZCBhdCB0aGUgY2FsbCBzaXRlIC0gaXQgaXMgdGhlIG9uZSBwbGFjZSB0aGF0XG4gKiBkZWNpZGVzIHdoYXQgYSB0aHJvd2F3YXkgd29ya2luZyBkaXJlY3RvcnkgbG9va3MgbGlrZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IHNjcmF0Y2ggPSBzY3JhdGNoRlMoXCJyZW1vdGUtc2tpbGxzXCIpO1xuICogYXdhaXQgc2NyYXRjaC53cml0ZUZpbGUoXCJTS0lMTC5tZFwiLCBib2R5KTtcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NyYXRjaEZTKHByZWZpeDogc3RyaW5nLCBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30pOiBMb2NhbEZpbGVTeXN0ZW0ge1xuICByZXR1cm4gdG1wRlMoYCR7cHJlZml4fS0ke2hhc2guaWQoKX1gLCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBSZWJ1aWxkIHRoZSBTVEFCTEUgdGVtcCB0cmVlIG5hbWVkIGJ5IHtAbGluayBrZXl9LCBldmVyeSBjYWxsLlxuICpcbiAqIHtAbGluayBtYXRlcmlhbGl6ZX0gd3JpdGVzIGludG8gYSB0aHJvd2F3YXkge0BsaW5rIHNjcmF0Y2hGU30gcm9vdDsgb25seSBvblxuICogc3VjY2VzcyBkb2VzIHRoYXQgcm9vdCBSRVBMQUNFIHRoZSBzdGFibGUgb25lLiBUd28gcHJvcGVydGllcyBmYWxsIG91dCBvZlxuICogdGhhdCBvcmRlcmluZywgYW5kIGJvdGggYXJlIHRoZSByZWFzb24gdG8gcHJlZmVyIHRoaXMgb3ZlciB3cml0aW5nIGludG8gdGhlXG4gKiBzdGFibGUgcGF0aCBkaXJlY3RseTpcbiAqXG4gKiAtIHJlcGVhdGVkIHJ1bnMgcmV1c2UgT05FIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGxlYXZpbmcgYSBuZXcgc2NyYXRjaCBiZWhpbmRcbiAqICAgb24gZXZlcnkgYm9vdCwgYW5kXG4gKiAtIGEgcmVhZGVyIG5ldmVyIG9ic2VydmVzIGEgaGFsZi13cml0dGVuIHRyZWUsIGFuZCBhIGZhaWxlZCByZWJ1aWxkIGxlYXZlc1xuICogICB0aGUgcHJldmlvdXMgb25lIGludGFjdC5cbiAqXG4gKiBUaGUgc3dhcCBpcyBhIGByZW5hbWVgIHdpdGhpbiB0aGUgc2FtZSB0ZW1wIHJvb3QsIHNvIGl0IGlzIGF0b21pYy5cbiAqXG4gKiBAcGFyYW0ga2V5IC0gU3RhYmxlIHRlbXAtcmVsYXRpdmUgcGF0aC4gTWF5IGJlIG5lc3RlZCAoYFwic2tpbGxzL2FiYzEyM1wiYClcbiAqICAgdG8gZ2l2ZSBlYWNoIGlucHV0IGl0cyBvd24gZGlyZWN0b3J5LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3Qgc2tpbGxzID0gYXdhaXQgcmVidWlsZEZTKFwiYWdlbnQtc2tpbGxzXCIsIChzY3JhdGNoKSA9PlxuICogICBkb3dubG9hZEludG8oc2NyYXRjaC5yb290KSxcbiAqICk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlYnVpbGRGUyhcbiAga2V5OiBzdHJpbmcsXG4gIG1hdGVyaWFsaXplOiAoc2NyYXRjaDogTG9jYWxGaWxlU3lzdGVtKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBvcHRpb25zOiBPc0ZpbGVTeXN0ZW1PcHRpb25zID0ge30sXG4pOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gc2NyYXRjaEZTKGtleSwgb3B0aW9ucyk7XG4gIGF3YWl0IHNjcmF0Y2guaW5pdCgpO1xuXG4gIHRyeSB7XG4gICAgYXdhaXQgbWF0ZXJpYWxpemUoc2NyYXRjaCk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGF3YWl0IHJtKHNjcmF0Y2gucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdGhyb3cgZXJyO1xuICB9XG5cbiAgY29uc3Qgc3RhYmxlID0gdG1wRlMoa2V5LCBvcHRpb25zKTtcbiAgY29uc3Qgc3RhYmxlSG9zdCA9IHBhdGgucmVzb2x2ZShzdGFibGUucm9vdCk7XG4gIGF3YWl0IHJtKHN0YWJsZUhvc3QsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcbiAgYXdhaXQgbWtkaXIocGF0aC5kaXJuYW1lKHN0YWJsZUhvc3QpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgcmVuYW1lKHBhdGgucmVzb2x2ZShzY3JhdGNoLnJvb3QpLCBzdGFibGVIb3N0KTtcbiAgcmV0dXJuIHN0YWJsZTtcbn1cblxuLyoqXG4gKiBKb2luIHtAbGluayByZWxhdGl2ZVJvb3R9IHVuZGVyIHtAbGluayBiYXNlfS4gRW1wdHkgLyBgLmAga2VlcHMge0BsaW5rIGJhc2V9O1xuICogbGVhZGluZyBgfmAgb3IgYC9gIGlzIHN0cmlwcGVkIHNvIGFuIGFic29sdXRlLWxvb2tpbmcgaW5wdXQgY2Fubm90IGVzY2FwZS5cbiAqL1xuZnVuY3Rpb24gam9pblVuZGVyQmFzZShiYXNlOiBzdHJpbmcsIHJlbGF0aXZlUm9vdDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcmVzdCA9IHBvc2l4UGF0aC50b1JlbGF0aXZlU2VnbWVudChyZWxhdGl2ZVJvb3QpO1xuICByZXR1cm4gcmVzdCA/IHBhdGgucmVzb2x2ZShiYXNlLCByZXN0KSA6IGJhc2U7XG59XG4iXX0=
package/package.json CHANGED
@@ -5,29 +5,47 @@
5
5
  "url": "git+https://github.com/reggie-db/dbx-tools.git",
6
6
  "directory": "packages/node/fs"
7
7
  },
8
+ "scripts": {
9
+ "build": "projen build",
10
+ "compile": "projen compile",
11
+ "default": "projen default",
12
+ "package": "projen package",
13
+ "post-compile": "projen post-compile",
14
+ "pre-compile": "projen pre-compile",
15
+ "prepack": "projen prepack",
16
+ "test": "projen test",
17
+ "watch": "projen watch",
18
+ "projen": "projen"
19
+ },
8
20
  "devDependencies": {
21
+ "@types/bun": "^1.3.14",
9
22
  "@types/node": "^24.6.0",
10
- "tsx": "^4.23.0",
11
23
  "typescript": "^5.9.3"
12
24
  },
13
25
  "dependencies": {
14
- "@dbx-tools/shared-core": "0.6.40",
15
- "@dbx-tools/appkit": "0.6.40",
16
- "@dbx-tools/shared-fs": "0.6.40"
26
+ "@dbx-tools/appkit": "0.6.41",
27
+ "@dbx-tools/shared-core": "0.6.41",
28
+ "@dbx-tools/shared-fs": "0.6.41"
17
29
  },
18
- "main": "./lib/index.js",
30
+ "main": "index.ts",
19
31
  "license": "UNLICENSED",
20
32
  "publishConfig": {
21
- "access": "public"
33
+ "access": "public",
34
+ "main": "./lib/index.js",
35
+ "types": "./lib/index.d.ts",
36
+ "exports": {
37
+ ".": {
38
+ "types": "./lib/index.d.ts",
39
+ "default": "./lib/index.js"
40
+ },
41
+ "./package.json": "./package.json"
42
+ }
22
43
  },
23
- "version": "0.6.40",
24
- "types": "./lib/index.d.ts",
44
+ "version": "0.6.41",
45
+ "types": "index.ts",
25
46
  "type": "module",
26
47
  "exports": {
27
- ".": {
28
- "types": "./lib/index.d.ts",
29
- "default": "./lib/index.js"
30
- },
48
+ ".": "./index.ts",
31
49
  "./package.json": "./package.json"
32
50
  },
33
51
  "files": [
@@ -40,16 +58,5 @@
40
58
  "node"
41
59
  ]
42
60
  },
43
- "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"pnpm exec projen\".",
44
- "scripts": {
45
- "build": "projen build",
46
- "compile": "projen compile",
47
- "default": "projen default",
48
- "package": "projen package",
49
- "post-compile": "projen post-compile",
50
- "pre-compile": "projen pre-compile",
51
- "test": "projen test",
52
- "watch": "projen watch",
53
- "projen": "projen"
54
- }
55
- }
61
+ "//": "~~ Generated by projen. To modify, edit .projenrc.js and run \"bunx projen\"."
62
+ }
package/src/local-fs.ts CHANGED
@@ -64,6 +64,14 @@ export interface LocalFileSystemOptions {
64
64
  * Create {@link root} (and parents) during init. Defaults to true.
65
65
  */
66
66
  createRoot?: boolean;
67
+
68
+ /**
69
+ * Injectables forwarded to {@link resolveLocalRoot} for `~` expansion (home /
70
+ * temp / cwd overrides). Mainly for tests: bun's `os.homedir()` ignores a
71
+ * process-set `HOME`, so overriding home via `{ os: { homeDir } }` is the
72
+ * runtime-agnostic way to point a `~` root at a chosen directory.
73
+ */
74
+ os?: ResolveOsPathsOptions;
67
75
  }
68
76
 
69
77
  /**
@@ -72,10 +80,7 @@ export interface LocalFileSystemOptions {
72
80
  * caller: {@link LocalFileSystemOptions} without `root`, plus the
73
81
  * {@link resolveOsPaths} injectables.
74
82
  */
75
- export type OsFileSystemOptions = Omit<LocalFileSystemOptions, "root"> & {
76
- /** Forwarded to {@link resolveLocalHome} / {@link resolveLocalTemp}. */
77
- os?: ResolveOsPathsOptions;
78
- };
83
+ export type OsFileSystemOptions = Omit<LocalFileSystemOptions, "root">;
79
84
 
80
85
  /**
81
86
  * {@link FileSystem} implementation that stores files in a folder on the local
@@ -98,7 +103,7 @@ export class LocalFileSystem extends BaseFileSystem<"local"> {
98
103
  private realRoot: string;
99
104
 
100
105
  constructor(options: LocalFileSystemOptions) {
101
- const hostRoot = resolveLocalRoot(options.root);
106
+ const hostRoot = resolveLocalRoot(options.root, options.os);
102
107
  const root = posixPath.normalizeRoot(posixPath.toPosix(hostRoot));
103
108
  super({
104
109
  id: options.id ?? `local-${hash.fnvHash(root)}`,