obsidian-integration-testing 1.3.2 → 2.0.1

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 (58) hide show
  1. package/README.md +54 -11
  2. package/dist/lib/cjs/context-provider.cjs +37 -0
  3. package/dist/lib/cjs/context-provider.d.cts +28 -0
  4. package/dist/lib/cjs/global-setup-core.cjs +127 -0
  5. package/dist/lib/cjs/global-setup-core.d.cts +48 -0
  6. package/dist/lib/cjs/index.cjs +4 -2
  7. package/dist/lib/cjs/index.d.cts +2 -1
  8. package/dist/lib/cjs/jest/global-setup.cjs +63 -0
  9. package/dist/lib/cjs/jest/global-setup.d.cts +61 -0
  10. package/dist/lib/cjs/log.cjs +32 -0
  11. package/dist/lib/cjs/log.d.cts +11 -0
  12. package/dist/lib/cjs/obsidian-cli.cjs +3 -3
  13. package/dist/lib/cjs/obsidian-cli.d.cts +1 -1
  14. package/dist/lib/cjs/temp-vault.cjs +7 -7
  15. package/dist/lib/cjs/temp-vault.d.cts +3 -3
  16. package/dist/lib/cjs/transport-appium.cjs +12 -11
  17. package/dist/lib/cjs/transport-desktop-cdp.cjs +35 -10
  18. package/dist/lib/cjs/transport-desktop-cdp.d.cts +12 -0
  19. package/dist/lib/cjs/transport-desktop-cli.cjs +34 -10
  20. package/dist/lib/cjs/transport-desktop-cli.d.cts +11 -0
  21. package/dist/lib/cjs/transport-factory.cjs +15 -14
  22. package/dist/lib/cjs/vault-registry.cjs +4 -4
  23. package/dist/lib/cjs/vault-registry.d.cts +8 -2
  24. package/dist/lib/cjs/vitest/global-setup.cjs +52 -0
  25. package/dist/lib/{esm/integration-global-setup.d.mts → cjs/vitest/global-setup.d.cts} +5 -2
  26. package/dist/lib/{esm/vitest.d.mts → cjs/vitest/typings.d.cts} +1 -1
  27. package/dist/lib/esm/context-provider.d.mts +28 -0
  28. package/dist/lib/esm/context-provider.mjs +12 -0
  29. package/dist/lib/esm/global-setup-core.d.mts +48 -0
  30. package/dist/lib/esm/global-setup-core.mjs +108 -0
  31. package/dist/lib/esm/index.d.mts +2 -1
  32. package/dist/lib/esm/index.mjs +3 -2
  33. package/dist/lib/esm/jest/global-setup.d.mts +61 -0
  34. package/dist/lib/esm/jest/global-setup.mjs +39 -0
  35. package/dist/lib/esm/log.d.mts +11 -0
  36. package/dist/lib/esm/log.mjs +8 -0
  37. package/dist/lib/esm/obsidian-cli.d.mts +1 -1
  38. package/dist/lib/esm/obsidian-cli.mjs +3 -3
  39. package/dist/lib/esm/temp-vault.d.mts +3 -3
  40. package/dist/lib/esm/temp-vault.mjs +7 -7
  41. package/dist/lib/esm/transport-appium.mjs +12 -11
  42. package/dist/lib/esm/transport-desktop-cdp.d.mts +12 -0
  43. package/dist/lib/esm/transport-desktop-cdp.mjs +39 -11
  44. package/dist/lib/esm/transport-desktop-cli.d.mts +11 -0
  45. package/dist/lib/esm/transport-desktop-cli.mjs +35 -10
  46. package/dist/lib/esm/transport-factory.mjs +15 -14
  47. package/dist/lib/esm/vault-registry.d.mts +8 -2
  48. package/dist/lib/esm/vault-registry.mjs +4 -4
  49. package/dist/lib/{cjs/integration-global-setup.d.cts → esm/vitest/global-setup.d.mts} +5 -2
  50. package/dist/lib/esm/vitest/global-setup.mjs +29 -0
  51. package/dist/lib/{cjs/vitest.d.cts → esm/vitest/typings.d.mts} +1 -1
  52. package/dist/obsidian-integration-testing-2.0.1.tgz +0 -0
  53. package/package.json +25 -11
  54. package/dist/lib/cjs/integration-global-setup.cjs +0 -132
  55. package/dist/lib/esm/integration-global-setup.mjs +0 -112
  56. package/dist/obsidian-integration-testing-1.3.2.tgz +0 -0
  57. /package/dist/lib/cjs/{vitest.cjs → vitest/typings.cjs} +0 -0
  58. /package/dist/lib/esm/{vitest.mjs → vitest/typings.mjs} +0 -0
@@ -1,112 +0,0 @@
1
- import { existsSync } from "node:fs";
2
- import {
3
- cp,
4
- mkdir,
5
- readFile,
6
- stat,
7
- writeFile
8
- } from "node:fs/promises";
9
- import { join } from "node:path";
10
- import { inject } from "vitest";
11
- import { enablePluginWithErrorCapture } from "./enable-plugin.mjs";
12
- import { evalInObsidian } from "./obsidian-cli.mjs";
13
- import { TempVault } from "./temp-vault.mjs";
14
- import { createTransportFromOptions } from "./transport-factory.mjs";
15
- function getTempVault() {
16
- const tempVaultPath = inject("tempVaultPath");
17
- return new TempVault(tempVaultPath);
18
- }
19
- const DIST_DEV = "dist/dev";
20
- const DIST_BUILD = "dist/build";
21
- const MAIN_JS = "main.js";
22
- const OBSIDIAN_CONFIG_DIR = ".obsidian";
23
- const PLUGINS_DIR = "plugins";
24
- const COMMUNITY_PLUGINS_JSON = "community-plugins.json";
25
- let tempVault;
26
- let transport;
27
- async function setup(project) {
28
- const environmentOptions = project.config.environmentOptions;
29
- const transportOptions = environmentOptions?.["obsidianTransport"];
30
- console.warn("[integration-setup] Creating transport...");
31
- transport = await createTransportFromOptions(transportOptions);
32
- console.warn(`[integration-setup] Transport created: ${transport.constructor.name}`);
33
- const projectRoot = findProjectRoot();
34
- console.warn(`[integration-setup] Project root: ${projectRoot}`);
35
- const distPath = await resolveDistPath(projectRoot);
36
- const manifestJson = JSON.parse(await readFile(join(distPath, "manifest.json"), "utf-8"));
37
- const pluginId = manifestJson.id;
38
- if (transport.isMobile && manifestJson.isDesktopOnly) {
39
- throw new Error(
40
- `Plugin "${pluginId}" has isDesktopOnly: true in manifest.json. Mobile integration tests cannot run for desktop-only plugins.`
41
- );
42
- }
43
- const mainJs = join(distPath, MAIN_JS);
44
- const buildStat = await stat(mainJs);
45
- console.warn(`[integration-setup] Using ${distPath} (${buildStat.mtime.toISOString()}). If outdated, rebuild.`);
46
- tempVault = new TempVault();
47
- console.warn(`[integration-setup] Created temp vault: ${tempVault.path}`);
48
- const pluginDir = join(tempVault.path, OBSIDIAN_CONFIG_DIR, PLUGINS_DIR, pluginId);
49
- await mkdir(pluginDir, { recursive: true });
50
- await cp(distPath, pluginDir, { recursive: true });
51
- await writeFile(join(tempVault.path, OBSIDIAN_CONFIG_DIR, COMMUNITY_PLUGINS_JSON), JSON.stringify([pluginId]));
52
- console.warn("[integration-setup] Syncing vault to device...");
53
- await tempVault.syncToDevice(transport);
54
- console.warn("[integration-setup] Registering vault...");
55
- await tempVault.register(transport);
56
- console.warn("[integration-setup] Vault registered.");
57
- console.warn(`[integration-setup] Enabling plugin "${pluginId}"...`);
58
- const { errorMessage } = await evalInObsidian({
59
- args: { pluginId },
60
- fn: enablePluginWithErrorCapture,
61
- shouldSkipPreflightChecks: true,
62
- transport,
63
- vaultPath: tempVault.path
64
- });
65
- if (errorMessage) {
66
- throw new Error(`Plugin "${pluginId}" failed to load: ${errorMessage}`);
67
- }
68
- console.warn(`[integration-setup] Plugin "${pluginId}" enabled successfully.`);
69
- project.provide("obsidianTransport", transportOptions);
70
- project.provide("tempVaultPath", tempVault.path);
71
- }
72
- async function teardown() {
73
- await tempVault?.dispose(transport);
74
- await transport?.dispose?.();
75
- }
76
- function findProjectRoot() {
77
- let dir = process.cwd();
78
- while (true) {
79
- if (existsSync(join(dir, "package.json"))) {
80
- return dir;
81
- }
82
- const parent = join(dir, "..");
83
- if (parent === dir) {
84
- throw new Error("Could not find project root (no package.json found).");
85
- }
86
- dir = parent;
87
- }
88
- }
89
- async function resolveDistPath(projectRoot) {
90
- const devPath = join(projectRoot, DIST_DEV);
91
- const buildPath = join(projectRoot, DIST_BUILD);
92
- const devMainJs = join(devPath, MAIN_JS);
93
- const buildMainJs = join(buildPath, MAIN_JS);
94
- const devStat = existsSync(devMainJs) ? await stat(devMainJs) : null;
95
- const buildStat = existsSync(buildMainJs) ? await stat(buildMainJs) : null;
96
- if (devStat && buildStat) {
97
- return devStat.mtime > buildStat.mtime ? devPath : buildPath;
98
- }
99
- if (devStat) {
100
- return devPath;
101
- }
102
- if (buildStat) {
103
- return buildPath;
104
- }
105
- throw new Error("No build found. Run `npm run build` or `npm run dev` first.");
106
- }
107
- export {
108
- getTempVault,
109
- setup,
110
- teardown
111
- };
112
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2ludGVncmF0aW9uLWdsb2JhbC1zZXR1cC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIENvbnRhaW5zIHRoZSBnbG9iYWwgc2V0dXAgYW5kIHRlYXJkb3duIGZ1bmN0aW9ucyBmb3IgaW50ZWdyYXRpb24gdGVzdHMuXG4gKi9cblxuLyogdjggaWdub3JlIHN0YXJ0IC0tIEludGVncmF0aW9uLXRpbWUgc2V0dXAgY292ZXJlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cywgbm90IHVuaXQgdGVzdHMuICovXG5cbmltcG9ydCB0eXBlIHsgUGx1Z2luTWFuaWZlc3QgfSBmcm9tICdvYnNpZGlhbic7XG5pbXBvcnQgdHlwZSB7IFRlc3RQcm9qZWN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBjcCxcbiAgbWtkaXIsXG4gIHJlYWRGaWxlLFxuICBzdGF0LFxuICB3cml0ZUZpbGVcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGluamVjdCB9IGZyb20gJ3ZpdGVzdCc7XG5cbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnRPcHRpb25zIH0gZnJvbSAnLi90cmFuc3BvcnQtb3B0aW9ucy5tanMnO1xuaW1wb3J0IHR5cGUgeyBPYnNpZGlhblRyYW5zcG9ydCB9IGZyb20gJy4vdHJhbnNwb3J0Lm1qcyc7XG5cbmltcG9ydCB7IGVuYWJsZVBsdWdpbldpdGhFcnJvckNhcHR1cmUgfSBmcm9tICcuL2VuYWJsZS1wbHVnaW4ubWpzJztcbmltcG9ydCB7IGV2YWxJbk9ic2lkaWFuIH0gZnJvbSAnLi9vYnNpZGlhbi1jbGkubWpzJztcbmltcG9ydCB7IFRlbXBWYXVsdCB9IGZyb20gJy4vdGVtcC12YXVsdC5tanMnO1xuaW1wb3J0IHsgY3JlYXRlVHJhbnNwb3J0RnJvbU9wdGlvbnMgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5Lm1qcyc7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdGVtcG9yYXJ5IHZhdWx0IHByb3ZpZGVkIGJ5IHRoZSBnbG9iYWwgc2V0dXAuXG4gKlxuICogQHJldHVybnMgVGhlIHRlbXBvcmFyeSB2YXVsdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFRlbXBWYXVsdCgpOiBUZW1wVmF1bHQge1xuICBjb25zdCB0ZW1wVmF1bHRQYXRoID0gaW5qZWN0KCd0ZW1wVmF1bHRQYXRoJyk7XG4gIHJldHVybiBuZXcgVGVtcFZhdWx0KHRlbXBWYXVsdFBhdGgpO1xufVxuXG5jb25zdCBESVNUX0RFViA9ICdkaXN0L2Rldic7XG5jb25zdCBESVNUX0JVSUxEID0gJ2Rpc3QvYnVpbGQnO1xuY29uc3QgTUFJTl9KUyA9ICdtYWluLmpzJztcbmNvbnN0IE9CU0lESUFOX0NPTkZJR19ESVIgPSAnLm9ic2lkaWFuJztcbmNvbnN0IFBMVUdJTlNfRElSID0gJ3BsdWdpbnMnO1xuY29uc3QgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiA9ICdjb21tdW5pdHktcGx1Z2lucy5qc29uJztcblxubGV0IHRlbXBWYXVsdDogVGVtcFZhdWx0IHwgdW5kZWZpbmVkO1xubGV0IHRyYW5zcG9ydDogT2JzaWRpYW5UcmFuc3BvcnQgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCBzZXR1cCBmdW5jdGlvbi5cbiAqXG4gKiBDb3BpZXMgdGhlIGJ1aWx0IHBsdWdpbiBpbnRvIGEgdGVtcG9yYXJ5IHZhdWx0LCBlbmFibGVzIGl0IHZpYSB0aGUgT2JzaWRpYW4gQ0xJLFxuICogYW5kIHByb3ZpZGVzIGB0ZW1wVmF1bHRQYXRoYCB0byB0ZXN0cy5cbiAqXG4gKiBAcGFyYW0gcHJvamVjdCAtIFRoZSBWaXRlc3QgcHJvamVjdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNldHVwKHByb2plY3Q6IFRlc3RQcm9qZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9ucyA9IHByb2plY3QuY29uZmlnLmVudmlyb25tZW50T3B0aW9ucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgdHJhbnNwb3J0T3B0aW9ucyA9IGVudmlyb25tZW50T3B0aW9ucz8uWydvYnNpZGlhblRyYW5zcG9ydCddIGFzIE9ic2lkaWFuVHJhbnNwb3J0T3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgY29uc29sZS53YXJuKCdbaW50ZWdyYXRpb24tc2V0dXBdIENyZWF0aW5nIHRyYW5zcG9ydC4uLicpO1xuICB0cmFuc3BvcnQgPSBhd2FpdCBjcmVhdGVUcmFuc3BvcnRGcm9tT3B0aW9ucyh0cmFuc3BvcnRPcHRpb25zKTtcbiAgY29uc29sZS53YXJuKGBbaW50ZWdyYXRpb24tc2V0dXBdIFRyYW5zcG9ydCBjcmVhdGVkOiAke3RyYW5zcG9ydC5jb25zdHJ1Y3Rvci5uYW1lfWApO1xuXG4gIGNvbnN0IHByb2plY3RSb290ID0gZmluZFByb2plY3RSb290KCk7XG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBQcm9qZWN0IHJvb3Q6ICR7cHJvamVjdFJvb3R9YCk7XG4gIGNvbnN0IGRpc3RQYXRoID0gYXdhaXQgcmVzb2x2ZURpc3RQYXRoKHByb2plY3RSb290KTtcbiAgY29uc3QgbWFuaWZlc3RKc29uID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShqb2luKGRpc3RQYXRoLCAnbWFuaWZlc3QuanNvbicpLCAndXRmLTgnKSkgYXMgUGx1Z2luTWFuaWZlc3Q7XG4gIGNvbnN0IHBsdWdpbklkID0gbWFuaWZlc3RKc29uLmlkO1xuXG4gIGlmICh0cmFuc3BvcnQuaXNNb2JpbGUgJiYgbWFuaWZlc3RKc29uLmlzRGVza3RvcE9ubHkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBoYXMgaXNEZXNrdG9wT25seTogdHJ1ZSBpbiBtYW5pZmVzdC5qc29uLiBNb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgY2Fubm90IHJ1biBmb3IgZGVza3RvcC1vbmx5IHBsdWdpbnMuYFxuICAgICk7XG4gIH1cblxuICBjb25zdCBtYWluSnMgPSBqb2luKGRpc3RQYXRoLCBNQUlOX0pTKTtcbiAgY29uc3QgYnVpbGRTdGF0ID0gYXdhaXQgc3RhdChtYWluSnMpO1xuXG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBVc2luZyAke2Rpc3RQYXRofSAoJHtidWlsZFN0YXQubXRpbWUudG9JU09TdHJpbmcoKX0pLiBJZiBvdXRkYXRlZCwgcmVidWlsZC5gKTtcblxuICB0ZW1wVmF1bHQgPSBuZXcgVGVtcFZhdWx0KCk7XG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBDcmVhdGVkIHRlbXAgdmF1bHQ6ICR7dGVtcFZhdWx0LnBhdGh9YCk7XG4gIGNvbnN0IHBsdWdpbkRpciA9IGpvaW4odGVtcFZhdWx0LnBhdGgsIE9CU0lESUFOX0NPTkZJR19ESVIsIFBMVUdJTlNfRElSLCBwbHVnaW5JZCk7XG4gIGF3YWl0IG1rZGlyKHBsdWdpbkRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNwKGRpc3RQYXRoLCBwbHVnaW5EaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbih0ZW1wVmF1bHQucGF0aCwgT0JTSURJQU5fQ09ORklHX0RJUiwgQ09NTVVOSVRZX1BMVUdJTlNfSlNPTiksIEpTT04uc3RyaW5naWZ5KFtwbHVnaW5JZF0pKTtcblxuICBjb25zb2xlLndhcm4oJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gU3luY2luZyB2YXVsdCB0byBkZXZpY2UuLi4nKTtcbiAgYXdhaXQgdGVtcFZhdWx0LnN5bmNUb0RldmljZSh0cmFuc3BvcnQpO1xuICBjb25zb2xlLndhcm4oJ1tpbnRlZ3JhdGlvbi1zZXR1cF0gUmVnaXN0ZXJpbmcgdmF1bHQuLi4nKTtcbiAgYXdhaXQgdGVtcFZhdWx0LnJlZ2lzdGVyKHRyYW5zcG9ydCk7XG4gIGNvbnNvbGUud2FybignW2ludGVncmF0aW9uLXNldHVwXSBWYXVsdCByZWdpc3RlcmVkLicpO1xuXG4gIC8vIEVuYWJsZSB0aGUgcGx1Z2luIGFuZCB2ZXJpZnkgaXQgbG9hZGVkLiBPYnNpZGlhbidzIGVuYWJsZVBsdWdpbigpIHdyYXBzXG4gIC8vIExvYWRQbHVnaW4oKSBpbiBhIHRyeS1jYXRjaCB0aGF0IHN3YWxsb3dzIGVycm9ycyBhbmQgcmV0dXJucyBmYWxzZS5cbiAgLy8gV2UgbW9ua2V5LXBhdGNoIGxvYWRQbHVnaW4oKSB0byBjYXB0dXJlIHRoZSBlcnJvciBiZWZvcmUgaXQncyBzd2FsbG93ZWQuXG4gIGNvbnNvbGUud2FybihgW2ludGVncmF0aW9uLXNldHVwXSBFbmFibGluZyBwbHVnaW4gXCIke3BsdWdpbklkfVwiLi4uYCk7XG4gIGNvbnN0IHsgZXJyb3JNZXNzYWdlIH0gPSBhd2FpdCBldmFsSW5PYnNpZGlhbih7XG4gICAgYXJnczogeyBwbHVnaW5JZCB9LFxuICAgIGZuOiBlbmFibGVQbHVnaW5XaXRoRXJyb3JDYXB0dXJlLFxuICAgIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M6IHRydWUsXG4gICAgdHJhbnNwb3J0LFxuICAgIHZhdWx0UGF0aDogdGVtcFZhdWx0LnBhdGhcbiAgfSk7XG5cbiAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBmYWlsZWQgdG8gbG9hZDogJHtlcnJvck1lc3NhZ2V9YCk7XG4gIH1cblxuICBjb25zb2xlLndhcm4oYFtpbnRlZ3JhdGlvbi1zZXR1cF0gUGx1Z2luIFwiJHtwbHVnaW5JZH1cIiBlbmFibGVkIHN1Y2Nlc3NmdWxseS5gKTtcbiAgcHJvamVjdC5wcm92aWRlKCdvYnNpZGlhblRyYW5zcG9ydCcsIHRyYW5zcG9ydE9wdGlvbnMpO1xuICBwcm9qZWN0LnByb3ZpZGUoJ3RlbXBWYXVsdFBhdGgnLCB0ZW1wVmF1bHQucGF0aCk7XG59XG5cbi8qKlxuICogVml0ZXN0IGdsb2JhbCB0ZWFyZG93biBmdW5jdGlvbi5cbiAqXG4gKiBSZW1vdmVzIHRoZSB0ZW1wb3JhcnkgdmF1bHQgY3JlYXRlZCBkdXJpbmcgc2V0dXAuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0ZWFyZG93bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgdGVtcFZhdWx0Py5kaXNwb3NlKHRyYW5zcG9ydCk7XG4gIGF3YWl0IHRyYW5zcG9ydD8uZGlzcG9zZT8uKCk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIHByb2plY3Qgcm9vdCBieSB3YWxraW5nIHVwIGZyb20gYHByb2Nlc3MuY3dkKClgIGxvb2tpbmcgZm9yIGBwYWNrYWdlLmpzb25gLlxuICpcbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBwcm9qZWN0IHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmRQcm9qZWN0Um9vdCgpOiBzdHJpbmcge1xuICBsZXQgZGlyID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVubmVjZXNzYXJ5LWNvbmRpdGlvbiAtLSBMb29wIHRlcm1pbmF0ZXMgYXQgZmlsZXN5c3RlbSByb290LlxuICB3aGlsZSAodHJ1ZSkge1xuICAgIGlmIChleGlzdHNTeW5jKGpvaW4oZGlyLCAncGFja2FnZS5qc29uJykpKSB7XG4gICAgICByZXR1cm4gZGlyO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBqb2luKGRpciwgJy4uJyk7XG4gICAgaWYgKHBhcmVudCA9PT0gZGlyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHByb2plY3Qgcm9vdCAobm8gcGFja2FnZS5qc29uIGZvdW5kKS4nKTtcbiAgICB9XG4gICAgZGlyID0gcGFyZW50O1xuICB9XG59XG5cbi8qKlxuICogUmVzb2x2ZXMgdGhlIGRpc3QgcGF0aCB0byB1c2UgZm9yIGludGVncmF0aW9uIHRlc3RzLlxuICpcbiAqIFBpY2tzIHdoaWNoZXZlciBvZiBgZGlzdC9kZXZgIGFuZCBgZGlzdC9idWlsZGAgaGFzIGEgbmV3ZXIgYG1haW4uanNgLlxuICogSWYgb25seSBvbmUgZXhpc3RzLCB0aGF0IG9uZSBpcyB1c2VkLiBUaHJvd3MgaWYgbmVpdGhlciBleGlzdHMuXG4gKlxuICogQHBhcmFtIHByb2plY3RSb290IC0gVGhlIGFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdC5cbiAqIEByZXR1cm5zIFRoZSBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBjaG9zZW4gZGlzdCBmb2xkZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0UGF0aChwcm9qZWN0Um9vdDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgZGV2UGF0aCA9IGpvaW4ocHJvamVjdFJvb3QsIERJU1RfREVWKTtcbiAgY29uc3QgYnVpbGRQYXRoID0gam9pbihwcm9qZWN0Um9vdCwgRElTVF9CVUlMRCk7XG4gIGNvbnN0IGRldk1haW5KcyA9IGpvaW4oZGV2UGF0aCwgTUFJTl9KUyk7XG4gIGNvbnN0IGJ1aWxkTWFpbkpzID0gam9pbihidWlsZFBhdGgsIE1BSU5fSlMpO1xuICBjb25zdCBkZXZTdGF0ID0gZXhpc3RzU3luYyhkZXZNYWluSnMpID8gYXdhaXQgc3RhdChkZXZNYWluSnMpIDogbnVsbDtcbiAgY29uc3QgYnVpbGRTdGF0ID0gZXhpc3RzU3luYyhidWlsZE1haW5KcykgPyBhd2FpdCBzdGF0KGJ1aWxkTWFpbkpzKSA6IG51bGw7XG5cbiAgaWYgKGRldlN0YXQgJiYgYnVpbGRTdGF0KSB7XG4gICAgcmV0dXJuIGRldlN0YXQubXRpbWUgPiBidWlsZFN0YXQubXRpbWUgPyBkZXZQYXRoIDogYnVpbGRQYXRoO1xuICB9XG5cbiAgaWYgKGRldlN0YXQpIHtcbiAgICByZXR1cm4gZGV2UGF0aDtcbiAgfVxuXG4gIGlmIChidWlsZFN0YXQpIHtcbiAgICByZXR1cm4gYnVpbGRQYXRoO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKCdObyBidWlsZCBmb3VuZC4gUnVuIGBucG0gcnVuIGJ1aWxkYCBvciBgbnBtIHJ1biBkZXZgIGZpcnN0LicpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIkFBV0EsU0FBUyxrQkFBa0I7QUFDM0I7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUFDUCxTQUFTLFlBQVk7QUFDckIsU0FBUyxjQUFjO0FBS3ZCLFNBQVMsb0NBQW9DO0FBQzdDLFNBQVMsc0JBQXNCO0FBQy9CLFNBQVMsaUJBQWlCO0FBQzFCLFNBQVMsa0NBQWtDO0FBT3BDLFNBQVMsZUFBMEI7QUFDeEMsUUFBTSxnQkFBZ0IsT0FBTyxlQUFlO0FBQzVDLFNBQU8sSUFBSSxVQUFVLGFBQWE7QUFDcEM7QUFFQSxNQUFNLFdBQVc7QUFDakIsTUFBTSxhQUFhO0FBQ25CLE1BQU0sVUFBVTtBQUNoQixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGNBQWM7QUFDcEIsTUFBTSx5QkFBeUI7QUFFL0IsSUFBSTtBQUNKLElBQUk7QUFVSixlQUFzQixNQUFNLFNBQXFDO0FBQy9ELFFBQU0scUJBQXFCLFFBQVEsT0FBTztBQUMxQyxRQUFNLG1CQUFtQixxQkFBcUIsbUJBQW1CO0FBQ2pFLFVBQVEsS0FBSywyQ0FBMkM7QUFDeEQsY0FBWSxNQUFNLDJCQUEyQixnQkFBZ0I7QUFDN0QsVUFBUSxLQUFLLDBDQUEwQyxVQUFVLFlBQVksSUFBSSxFQUFFO0FBRW5GLFFBQU0sY0FBYyxnQkFBZ0I7QUFDcEMsVUFBUSxLQUFLLHFDQUFxQyxXQUFXLEVBQUU7QUFDL0QsUUFBTSxXQUFXLE1BQU0sZ0JBQWdCLFdBQVc7QUFDbEQsUUFBTSxlQUFlLEtBQUssTUFBTSxNQUFNLFNBQVMsS0FBSyxVQUFVLGVBQWUsR0FBRyxPQUFPLENBQUM7QUFDeEYsUUFBTSxXQUFXLGFBQWE7QUFFOUIsTUFBSSxVQUFVLFlBQVksYUFBYSxlQUFlO0FBQ3BELFVBQU0sSUFBSTtBQUFBLE1BQ1IsV0FBVyxRQUFRO0FBQUEsSUFDckI7QUFBQSxFQUNGO0FBRUEsUUFBTSxTQUFTLEtBQUssVUFBVSxPQUFPO0FBQ3JDLFFBQU0sWUFBWSxNQUFNLEtBQUssTUFBTTtBQUVuQyxVQUFRLEtBQUssNkJBQTZCLFFBQVEsS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDLDBCQUEwQjtBQUU5RyxjQUFZLElBQUksVUFBVTtBQUMxQixVQUFRLEtBQUssMkNBQTJDLFVBQVUsSUFBSSxFQUFFO0FBQ3hFLFFBQU0sWUFBWSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsYUFBYSxRQUFRO0FBQ2pGLFFBQU0sTUFBTSxXQUFXLEVBQUUsV0FBVyxLQUFLLENBQUM7QUFDMUMsUUFBTSxHQUFHLFVBQVUsV0FBVyxFQUFFLFdBQVcsS0FBSyxDQUFDO0FBQ2pELFFBQU0sVUFBVSxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsc0JBQXNCLEdBQUcsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFN0csVUFBUSxLQUFLLGdEQUFnRDtBQUM3RCxRQUFNLFVBQVUsYUFBYSxTQUFTO0FBQ3RDLFVBQVEsS0FBSywwQ0FBMEM7QUFDdkQsUUFBTSxVQUFVLFNBQVMsU0FBUztBQUNsQyxVQUFRLEtBQUssdUNBQXVDO0FBS3BELFVBQVEsS0FBSyx3Q0FBd0MsUUFBUSxNQUFNO0FBQ25FLFFBQU0sRUFBRSxhQUFhLElBQUksTUFBTSxlQUFlO0FBQUEsSUFDNUMsTUFBTSxFQUFFLFNBQVM7QUFBQSxJQUNqQixJQUFJO0FBQUEsSUFDSiwyQkFBMkI7QUFBQSxJQUMzQjtBQUFBLElBQ0EsV0FBVyxVQUFVO0FBQUEsRUFDdkIsQ0FBQztBQUVELE1BQUksY0FBYztBQUNoQixVQUFNLElBQUksTUFBTSxXQUFXLFFBQVEscUJBQXFCLFlBQVksRUFBRTtBQUFBLEVBQ3hFO0FBRUEsVUFBUSxLQUFLLCtCQUErQixRQUFRLHlCQUF5QjtBQUM3RSxVQUFRLFFBQVEscUJBQXFCLGdCQUFnQjtBQUNyRCxVQUFRLFFBQVEsaUJBQWlCLFVBQVUsSUFBSTtBQUNqRDtBQU9BLGVBQXNCLFdBQTBCO0FBQzlDLFFBQU0sV0FBVyxRQUFRLFNBQVM7QUFDbEMsUUFBTSxXQUFXLFVBQVU7QUFDN0I7QUFPQSxTQUFTLGtCQUEwQjtBQUNqQyxNQUFJLE1BQU0sUUFBUSxJQUFJO0FBR3RCLFNBQU8sTUFBTTtBQUNYLFFBQUksV0FBVyxLQUFLLEtBQUssY0FBYyxDQUFDLEdBQUc7QUFDekMsYUFBTztBQUFBLElBQ1Q7QUFDQSxVQUFNLFNBQVMsS0FBSyxLQUFLLElBQUk7QUFDN0IsUUFBSSxXQUFXLEtBQUs7QUFDbEIsWUFBTSxJQUFJLE1BQU0sc0RBQXNEO0FBQUEsSUFDeEU7QUFDQSxVQUFNO0FBQUEsRUFDUjtBQUNGO0FBV0EsZUFBZSxnQkFBZ0IsYUFBc0M7QUFDbkUsUUFBTSxVQUFVLEtBQUssYUFBYSxRQUFRO0FBQzFDLFFBQU0sWUFBWSxLQUFLLGFBQWEsVUFBVTtBQUM5QyxRQUFNLFlBQVksS0FBSyxTQUFTLE9BQU87QUFDdkMsUUFBTSxjQUFjLEtBQUssV0FBVyxPQUFPO0FBQzNDLFFBQU0sVUFBVSxXQUFXLFNBQVMsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJO0FBQ2hFLFFBQU0sWUFBWSxXQUFXLFdBQVcsSUFBSSxNQUFNLEtBQUssV0FBVyxJQUFJO0FBRXRFLE1BQUksV0FBVyxXQUFXO0FBQ3hCLFdBQU8sUUFBUSxRQUFRLFVBQVUsUUFBUSxVQUFVO0FBQUEsRUFDckQ7QUFFQSxNQUFJLFNBQVM7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUksV0FBVztBQUNiLFdBQU87QUFBQSxFQUNUO0FBRUEsUUFBTSxJQUFJLE1BQU0sNkRBQTZEO0FBQy9FOyIsCiAgIm5hbWVzIjogW10KfQo=
File without changes
File without changes