obsidian-integration-testing 10.4.0 → 12.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/lib/cjs/appium-server-marker.cjs +115 -0
  3. package/dist/lib/cjs/appium-server-marker.d.cts +81 -0
  4. package/dist/lib/cjs/cli.cjs +104 -19
  5. package/dist/lib/cjs/cli.d.cts +16 -8
  6. package/dist/lib/cjs/community-plugin-registry.cjs +52 -0
  7. package/dist/lib/cjs/community-plugin-registry.d.cts +116 -0
  8. package/dist/lib/cjs/context-provider.cjs +12 -1
  9. package/dist/lib/cjs/context-provider.d.cts +26 -3
  10. package/dist/lib/cjs/demo-vault-bootstrap.cjs +148 -0
  11. package/dist/lib/cjs/demo-vault-bootstrap.d.cts +113 -0
  12. package/dist/lib/cjs/demo-vault-populate.cjs +36 -9
  13. package/dist/lib/cjs/demo-vault-populate.d.cts +70 -0
  14. package/dist/lib/cjs/eval-in-obsidian.cjs +1 -1
  15. package/dist/lib/cjs/eval-in-obsidian.d.cts +97 -15
  16. package/dist/lib/cjs/index.cjs +16 -1
  17. package/dist/lib/cjs/index.d.cts +15 -8
  18. package/dist/lib/cjs/installer-asset.cjs +1 -1
  19. package/dist/lib/cjs/installer-asset.d.cts +1 -1
  20. package/dist/lib/cjs/integration-setup-failed-error.cjs +62 -0
  21. package/dist/lib/cjs/integration-setup-failed-error.d.cts +66 -0
  22. package/dist/lib/cjs/jest/global-setup.cjs +2 -2
  23. package/dist/lib/cjs/jest/global-setup.d.cts +5 -1
  24. package/dist/lib/cjs/kill-process-tree.cjs +18 -7
  25. package/dist/lib/cjs/kill-process-tree.d.cts +10 -2
  26. package/dist/lib/cjs/library.cjs +1 -1
  27. package/dist/lib/cjs/mobile-input.cjs +161 -0
  28. package/dist/lib/cjs/mobile-input.d.cts +160 -0
  29. package/dist/lib/cjs/namespace-bootstrap.cjs +136 -10
  30. package/dist/lib/cjs/obsidian-installer.cjs +1 -1
  31. package/dist/lib/cjs/obsidian-metadata.cjs +1257 -348
  32. package/dist/lib/cjs/obsidian-metadata.d.cts +74 -12
  33. package/dist/lib/cjs/obsidian-version-switch.cjs +3 -3
  34. package/dist/lib/cjs/open-obsidian-settings-tab.cjs +51 -0
  35. package/dist/lib/cjs/open-obsidian-settings-tab.d.cts +49 -0
  36. package/dist/lib/cjs/release-catalog.cjs +73 -0
  37. package/dist/lib/cjs/release-catalog.d.cts +125 -0
  38. package/dist/lib/cjs/transport-appium.cjs +122 -1
  39. package/dist/lib/cjs/transport-appium.d.cts +51 -0
  40. package/dist/lib/cjs/transport-desktop-cdp.cjs +7 -1
  41. package/dist/lib/cjs/transport-desktop-cdp.d.cts +2 -2
  42. package/dist/lib/cjs/transport-factory.cjs +237 -32
  43. package/dist/lib/cjs/transport-factory.d.cts +10 -1
  44. package/dist/lib/cjs/vitest/global-setup.cjs +13 -7
  45. package/dist/lib/cjs/vitest/global-setup.d.cts +5 -1
  46. package/dist/lib/cjs/vitest/setup.cjs +2 -1
  47. package/dist/lib/cjs/vitest/setup.d.cts +5 -0
  48. package/dist/lib/cjs/vitest/typings.d.cts +6 -4
  49. package/dist/lib/cjs/webview-cdp.cjs +264 -0
  50. package/dist/lib/cjs/webview-cdp.d.cts +152 -0
  51. package/dist/lib/cjs/wedged-appium-server.cjs +113 -0
  52. package/dist/lib/cjs/wedged-appium-server.d.cts +187 -0
  53. package/dist/lib/esm/appium-server-marker.d.mts +81 -0
  54. package/dist/lib/esm/appium-server-marker.mjs +83 -0
  55. package/dist/lib/esm/cli.d.mts +16 -8
  56. package/dist/lib/esm/cli.mjs +110 -19
  57. package/dist/lib/esm/community-plugin-registry.d.mts +116 -0
  58. package/dist/lib/esm/community-plugin-registry.mjs +23 -0
  59. package/dist/lib/esm/context-provider.d.mts +26 -3
  60. package/dist/lib/esm/context-provider.mjs +10 -1
  61. package/dist/lib/esm/demo-vault-bootstrap.d.mts +113 -0
  62. package/dist/lib/esm/demo-vault-bootstrap.mjs +127 -0
  63. package/dist/lib/esm/demo-vault-populate.d.mts +70 -0
  64. package/dist/lib/esm/demo-vault-populate.mjs +33 -8
  65. package/dist/lib/esm/eval-in-obsidian.d.mts +97 -15
  66. package/dist/lib/esm/eval-in-obsidian.mjs +1 -1
  67. package/dist/lib/esm/index.d.mts +15 -8
  68. package/dist/lib/esm/index.mjs +18 -2
  69. package/dist/lib/esm/installer-asset.d.mts +1 -1
  70. package/dist/lib/esm/installer-asset.mjs +1 -1
  71. package/dist/lib/esm/integration-setup-failed-error.d.mts +66 -0
  72. package/dist/lib/esm/integration-setup-failed-error.mjs +38 -0
  73. package/dist/lib/esm/jest/global-setup.d.mts +5 -1
  74. package/dist/lib/esm/jest/global-setup.mjs +2 -2
  75. package/dist/lib/esm/kill-process-tree.d.mts +10 -2
  76. package/dist/lib/esm/kill-process-tree.mjs +16 -6
  77. package/dist/lib/esm/library.mjs +1 -1
  78. package/dist/lib/esm/mobile-input.d.mts +160 -0
  79. package/dist/lib/esm/mobile-input.mjs +132 -0
  80. package/dist/lib/esm/namespace-bootstrap.mjs +139 -10
  81. package/dist/lib/esm/obsidian-installer.mjs +1 -1
  82. package/dist/lib/esm/obsidian-metadata.d.mts +74 -12
  83. package/dist/lib/esm/obsidian-metadata.mjs +1257 -348
  84. package/dist/lib/esm/obsidian-version-switch.mjs +3 -3
  85. package/dist/lib/esm/open-obsidian-settings-tab.d.mts +49 -0
  86. package/dist/lib/esm/open-obsidian-settings-tab.mjs +27 -0
  87. package/dist/lib/esm/release-catalog.d.mts +125 -0
  88. package/dist/lib/esm/release-catalog.mjs +46 -0
  89. package/dist/lib/esm/transport-appium.d.mts +51 -0
  90. package/dist/lib/esm/transport-appium.mjs +126 -1
  91. package/dist/lib/esm/transport-desktop-cdp.d.mts +2 -2
  92. package/dist/lib/esm/transport-desktop-cdp.mjs +7 -1
  93. package/dist/lib/esm/transport-factory.d.mts +10 -1
  94. package/dist/lib/esm/transport-factory.mjs +249 -35
  95. package/dist/lib/esm/vitest/global-setup.d.mts +5 -1
  96. package/dist/lib/esm/vitest/global-setup.mjs +14 -7
  97. package/dist/lib/esm/vitest/setup.d.mts +5 -0
  98. package/dist/lib/esm/vitest/setup.mjs +3 -1
  99. package/dist/lib/esm/vitest/typings.d.mts +6 -4
  100. package/dist/lib/esm/webview-cdp.d.mts +152 -0
  101. package/dist/lib/esm/webview-cdp.mjs +236 -0
  102. package/dist/lib/esm/wedged-appium-server.d.mts +187 -0
  103. package/dist/lib/esm/wedged-appium-server.mjs +86 -0
  104. package/package.json +13 -12
@@ -0,0 +1,161 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var mobile_input_exports = {};
20
+ __export(mobile_input_exports, {
21
+ MOBILE_INPUT_BINDING_NAME: () => MOBILE_INPUT_BINDING_NAME,
22
+ MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS: () => MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
23
+ buildResolveInputExpression: () => buildResolveInputExpression,
24
+ codePointOf: () => codePointOf,
25
+ toCdpInputCommands: () => toCdpInputCommands,
26
+ toCdpModifiers: () => toCdpModifiers
27
+ });
28
+ module.exports = __toCommonJS(mobile_input_exports);
29
+ const MOBILE_INPUT_BINDING_NAME = "__obsidianIntegrationTestingInput";
30
+ const MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS = 15e3;
31
+ const LONG_PRESS_DWELL_IN_MILLISECONDS = 600;
32
+ const NO_MODIFIERS = 0;
33
+ const MODIFIER_BIT_ALT = 1;
34
+ const MODIFIER_BIT_CONTROL = 2;
35
+ const MODIFIER_BIT_META = 4;
36
+ const MODIFIER_BIT_SHIFT = 8;
37
+ const CDP_MODIFIER_BIT_BY_NAME = /* @__PURE__ */ new Map([
38
+ ["alt", MODIFIER_BIT_ALT],
39
+ ["control", MODIFIER_BIT_CONTROL],
40
+ ["meta", MODIFIER_BIT_META],
41
+ ["shift", MODIFIER_BIT_SHIFT]
42
+ ]);
43
+ const KEY_CODE_BACKSPACE = 8;
44
+ const KEY_CODE_TAB = 9;
45
+ const KEY_CODE_ENTER = 13;
46
+ const KEY_CODE_ESCAPE = 27;
47
+ const KEY_CODE_ARROW_LEFT = 37;
48
+ const KEY_CODE_ARROW_UP = 38;
49
+ const KEY_CODE_ARROW_RIGHT = 39;
50
+ const KEY_CODE_ARROW_DOWN = 40;
51
+ const KEY_CODE_DELETE = 46;
52
+ const NAMED_KEYS = /* @__PURE__ */ new Map([
53
+ ["ArrowDown", { code: "ArrowDown", windowsVirtualKeyCode: KEY_CODE_ARROW_DOWN }],
54
+ ["ArrowLeft", { code: "ArrowLeft", windowsVirtualKeyCode: KEY_CODE_ARROW_LEFT }],
55
+ ["ArrowRight", { code: "ArrowRight", windowsVirtualKeyCode: KEY_CODE_ARROW_RIGHT }],
56
+ ["ArrowUp", { code: "ArrowUp", windowsVirtualKeyCode: KEY_CODE_ARROW_UP }],
57
+ ["Backspace", { code: "Backspace", windowsVirtualKeyCode: KEY_CODE_BACKSPACE }],
58
+ ["Delete", { code: "Delete", windowsVirtualKeyCode: KEY_CODE_DELETE }],
59
+ ["Enter", { code: "Enter", text: "\r", windowsVirtualKeyCode: KEY_CODE_ENTER }],
60
+ ["Escape", { code: "Escape", windowsVirtualKeyCode: KEY_CODE_ESCAPE }],
61
+ ["Tab", { code: "Tab", text: " ", windowsVirtualKeyCode: KEY_CODE_TAB }]
62
+ ]);
63
+ const FIRST_CODE_POINT_INDEX = 0;
64
+ const DIGIT_ZERO_CODE_POINT = codePointOf("0");
65
+ const DIGIT_NINE_CODE_POINT = codePointOf("9");
66
+ const UPPERCASE_A_CODE_POINT = codePointOf("A");
67
+ const UPPERCASE_Z_CODE_POINT = codePointOf("Z");
68
+ function buildResolveInputExpression(id, errorMessage) {
69
+ return `window.__obsidianIntegrationTesting?.resolveInput?.(${JSON.stringify(id)}, ${JSON.stringify(errorMessage ?? null)})`;
70
+ }
71
+ function codePointOf(text) {
72
+ const codePoint = text.codePointAt(FIRST_CODE_POINT_INDEX);
73
+ if (codePoint === void 0) {
74
+ throw new Error("codePointOf received an empty string.");
75
+ }
76
+ return codePoint;
77
+ }
78
+ function toCdpInputCommands(request) {
79
+ if (request.kind === "key") {
80
+ return toKeyCommands(request);
81
+ }
82
+ return toPointerCommands(request);
83
+ }
84
+ function toCdpModifiers(modifiers) {
85
+ const bits = /* @__PURE__ */ new Set();
86
+ for (const modifier of modifiers) {
87
+ const bit = CDP_MODIFIER_BIT_BY_NAME.get(modifier);
88
+ if (bit !== void 0) {
89
+ bits.add(bit);
90
+ }
91
+ }
92
+ let bitmask = NO_MODIFIERS;
93
+ for (const bit of bits) {
94
+ bitmask += bit;
95
+ }
96
+ return bitmask;
97
+ }
98
+ function resolveKey(key) {
99
+ const namedKey = NAMED_KEYS.get(key);
100
+ if (namedKey) {
101
+ return namedKey;
102
+ }
103
+ const codePoint = key.codePointAt(FIRST_CODE_POINT_INDEX);
104
+ if (codePoint === void 0 || String.fromCodePoint(codePoint) !== key) {
105
+ throw new Error(
106
+ `pressKey received an unknown key name on mobile: ${JSON.stringify(key)}. Pass a single character or one of: ${[...NAMED_KEYS.keys()].join(", ")}.`
107
+ );
108
+ }
109
+ const upperCasedCodePoint = codePointOf(key.toUpperCase());
110
+ return {
111
+ code: resolveKeyCode(upperCasedCodePoint),
112
+ text: key,
113
+ windowsVirtualKeyCode: upperCasedCodePoint
114
+ };
115
+ }
116
+ function resolveKeyCode(upperCasedCodePoint) {
117
+ if (upperCasedCodePoint >= UPPERCASE_A_CODE_POINT && upperCasedCodePoint <= UPPERCASE_Z_CODE_POINT) {
118
+ return `Key${String.fromCodePoint(upperCasedCodePoint)}`;
119
+ }
120
+ if (upperCasedCodePoint >= DIGIT_ZERO_CODE_POINT && upperCasedCodePoint <= DIGIT_NINE_CODE_POINT) {
121
+ return `Digit${String.fromCodePoint(upperCasedCodePoint)}`;
122
+ }
123
+ return "";
124
+ }
125
+ function toKeyCommands(request) {
126
+ const { code, text, windowsVirtualKeyCode } = resolveKey(request.key);
127
+ const modifiers = toCdpModifiers(request.modifiers);
128
+ const base = { code, key: request.key, modifiers, windowsVirtualKeyCode };
129
+ const commands = [
130
+ { method: "Input.dispatchKeyEvent", params: { ...base, type: "rawKeyDown" } }
131
+ ];
132
+ if (text !== void 0) {
133
+ commands.push({ method: "Input.dispatchKeyEvent", params: { ...base, text, type: "char" } });
134
+ }
135
+ commands.push({ method: "Input.dispatchKeyEvent", params: { ...base, type: "keyUp" } });
136
+ return commands;
137
+ }
138
+ function toPointerCommands(request) {
139
+ const modifiers = toCdpModifiers(request.modifiers);
140
+ return [
141
+ {
142
+ method: "Input.dispatchTouchEvent",
143
+ params: { modifiers, touchPoints: [{ x: request.x, y: request.y }], type: "touchStart" }
144
+ },
145
+ {
146
+ ...request.kind === "longPress" && { delayBeforeInMilliseconds: LONG_PRESS_DWELL_IN_MILLISECONDS },
147
+ method: "Input.dispatchTouchEvent",
148
+ params: { modifiers, touchPoints: [], type: "touchEnd" }
149
+ }
150
+ ];
151
+ }
152
+ // Annotate the CommonJS export names for ESM import in node:
153
+ 0 && (module.exports = {
154
+ MOBILE_INPUT_BINDING_NAME,
155
+ MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS,
156
+ buildResolveInputExpression,
157
+ codePointOf,
158
+ toCdpInputCommands,
159
+ toCdpModifiers
160
+ });
161
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL21vYmlsZS1pbnB1dC50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRyYW5zbGF0ZXMgYSBtb2JpbGUgdHJ1c3RlZC1pbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ2hyb21lIERldlRvb2xzIFByb3RvY29sIGBJbnB1dC4qYCBjb21tYW5kc1xuICogdGhhdCByZWFsaXplIGl0IChzZWUgKipMMzkqKikuXG4gKlxuICogUHVyZSBhbmQgc3luY2hyb25vdXMgYnkgZGVzaWduOiB0aGUgV2ViVmlldyBjb25uZWN0aW9uICh7QGxpbmsgV2ViVmlld0NkcENvbm5lY3Rpb259KSBzZW5kcyB3aGF0ZXZlciB0aGlzXG4gKiByZXR1cm5zLCBzbyBldmVyeSBkZWNpc2lvbiB0aGF0IGlzIHdvcnRoIGEgdGVzdCBcdTIwMTQgdGhlIHRvdWNoIHBhaXIgYSB0YXAgZXhwYW5kcyBpbnRvLCB0aGUgZHdlbGwgYVxuICogbG9uZy1wcmVzcyBhZGRzLCB0aGUgYHJhd0tleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2hhcGUgYSBrZXkgcHJlc3MgbWlycm9ycyBmcm9tIHRoZSBkZXNrdG9wIHR3aW4sIHRoZVxuICogbW9kaWZpZXIgYml0bWFzayBcdTIwMTQgbGl2ZXMgaGVyZSByYXRoZXIgdGhhbiBpbnNpZGUgdGhlIHRyYW5zcG9ydCdzIEkvTyBwYXRoLlxuICpcbiAqIFRoZSByZXF1ZXN0IHRyYXZlbHMgcmVuZGVyZXIgXHUyMTkyIGhvc3QgYXMgSlNPTiAodGhlIHJlbmRlcmVyIGNvbXB1dGVzIHRoZSBjb29yZGluYXRlcywgYmVjYXVzZSBvbmx5IGl0IGNhblxuICogc2VlIHRoZSBET00pLCBzbyBib3RoIHRoZSByZXF1ZXN0IGFuZCB0aGUgY29tbWFuZCBzaGFwZXMgYXJlIGRlbGliZXJhdGVseSBwbGFpbiBkYXRhLlxuICovXG5cbi8qKlxuICogVGhlIG5hbWUgb2YgdGhlIGBSdW50aW1lLmFkZEJpbmRpbmdgIGZ1bmN0aW9uIHRoZSBob3N0IGV4cG9zZXMgb24gdGhlIHBhZ2Ugc28gdGhlIHJlbmRlcmVyIGNhbiBoYW5kIGl0IGFuXG4gKiBpbnB1dCByZXF1ZXN0IG1pZC1jbG9zdXJlLlxuICpcbiAqIEl0IGlzIHBhc3NlZCAqaW50byogdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUgYXMgZGF0YSByYXRoZXIgdGhhbiByZWZlcmVuY2VkIGZyb20gaXQsIGJlY2F1c2UgdGhhdFxuICogY2xvc3VyZSBtYXkgbm90IHJlYWQgb3V0ZXIgc2NvcGUgKCoqTDE1KiopIFx1MjAxNCBzbyB0aGlzIHN0YXlzIHRoZSBzaW5nbGUgZGVmaW5pdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUUgPSAnX19vYnNpZGlhbkludGVncmF0aW9uVGVzdGluZ0lucHV0JztcblxuLyoqXG4gKiBIb3cgbG9uZyB0aGUgcmVuZGVyZXIgd2FpdHMgZm9yIHRoZSBob3N0IHRvIHNlcnZpY2Ugb25lIGlucHV0IHJlcXVlc3QgYmVmb3JlIGdpdmluZyB1cC5cbiAqXG4gKiBHZW5lcm91cyByZWxhdGl2ZSB0byB0aGUgd29yayAoYSB0YXAgaXMgdHdvIENEUCBjb21tYW5kczsgYSBsb25nLXByZXNzIGFkZHMgYSA2MDBtcyBkd2VsbCk6IHRoZSBwb2ludCBpc1xuICogdG8gZmFpbCB3aXRoIGEgbGVnaWJsZSBlcnJvciByYXRoZXIgdGhhbiBoYW5nIHRoZSBjbG9zdXJlIHVudGlsIHRoZSB3aG9sZSBydW4gdGltZXMgb3V0LiBQYXNzZWQgaW50byB0aGVcbiAqIGJvb3RzdHJhcCBjbG9zdXJlIGFzIGRhdGEsIGZvciB0aGUgc2FtZSByZWFzb24gYXMge0BsaW5rIE1PQklMRV9JTlBVVF9CSU5ESU5HX05BTUV9LlxuICovXG5leHBvcnQgY29uc3QgTU9CSUxFX0lOUFVUX1RJTUVPVVRfSU5fTUlMTElTRUNPTkRTID0gMTVfMDAwO1xuXG4vKipcbiAqIEEgc2luZ2xlIENocm9tZSBEZXZUb29scyBQcm90b2NvbCBjb21tYW5kLCBwbHVzIGhvdyBsb25nIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgaXQuXG4gKlxuICogVGhlIGRlbGF5IGlzIGNhcnJpZWQgaGVyZSByYXRoZXIgdGhhbiBhcHBsaWVkIGJ5IHRoZSBwcm9kdWNlciBzbyB0aGF0IHRoZSB3aG9sZSBzZXF1ZW5jZSBzdGF5cyBwdXJlXG4gKiBkYXRhIFx1MjAxNCBhIHRlc3QgYXNzZXJ0cyB0aGUgZHdlbGwgd2l0aG91dCB3YWl0aW5nIGZvciBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDZHBJbnB1dENvbW1hbmQge1xuICAvKipcbiAgICogTWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIHNlbmRpbmcgdGhpcyBjb21tYW5kLiBBYnNlbnQgbWVhbnMgXCJzZW5kIGltbWVkaWF0ZWx5XCIuXG4gICAqXG4gICAqIFVzZWQgb25seSBieSB0aGUgbG9uZy1wcmVzcyBkd2VsbC5cbiAgICovXG4gIHJlYWRvbmx5IGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBDRFAgbWV0aG9kIG5hbWUsIGUuZy4gYElucHV0LmRpc3BhdGNoVG91Y2hFdmVudGAuXG4gICAqL1xuICByZWFkb25seSBtZXRob2Q6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIENEUCBtZXRob2QgcGFyYW1ldGVycy5cbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcmVuZGVyZXIgaGFuZHMgdG8gdGhlIGhvc3QgYmluZGluZzogb25lIHJlcXVlc3QsIHBsdXMgdGhlIGlkIHRvIGFuc3dlciBpdCBvbi5cbiAqXG4gKiBUaGUgcmVuZGVyZXIgYnVpbGRzIHRoaXMgbGl0ZXJhbCBpbnNpZGUgdGhlIHNlcmlhbGl6ZWQgYm9vdHN0cmFwIGNsb3N1cmUsIHdoaWNoIGNhbm5vdCBpbXBvcnQgKCoqTDE1KiopLFxuICogc28gdGhlIHNoYXBlIGlzIGRlY2xhcmVkIGhlcmUgYW5kIG1pcnJvcmVkIHRoZXJlLiBUaGV5IGFyZSBvbmUgd2lyZSBmb3JtYXQ7IGNoYW5nZSB0aGVtIHRvZ2V0aGVyLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZUlucHV0RW52ZWxvcGUge1xuICAvKipcbiAgICogVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IHRvIGluamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHJlcXVlc3Q6IE1vYmlsZUlucHV0UmVxdWVzdDtcbn1cblxuLyoqXG4gKiBBbnl0aGluZyB0aGUgcmVuZGVyZXIgY2FuIGFzayB0aGUgaG9zdCB0byBpbmplY3QuXG4gKi9cbmV4cG9ydCB0eXBlIE1vYmlsZUlucHV0UmVxdWVzdCA9IE1vYmlsZUtleUlucHV0UmVxdWVzdCB8IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3Q7XG5cbi8qKlxuICogQSB0cnVzdGVkIGtleSBwcmVzcyB0byBpbmplY3Qgb24gbW9iaWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vYmlsZUtleUlucHV0UmVxdWVzdCB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHByZXNzLCBpbiB0aGUgc2FtZSBzcGVsbGluZyB0aGUgZGVza3RvcCB0d2luIHRha2VzOiBlaXRoZXIgYSBuYW1lZCBrZXlcbiAgICogKGBFbnRlcmAsIGBFc2NhcGVgLCBgVGFiYCwgYEJhY2tzcGFjZWAsIGBEZWxldGVgLCBhbiBhcnJvdykgb3IgYSBzaW5nbGUgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBEaXNjcmltaW5hbnQuXG4gICAqL1xuICByZWFkb25seSBraW5kOiAna2V5JztcblxuICAvKipcbiAgICogTW9kaWZpZXJzIGFscmVhZHkgcmVzb2x2ZWQgdG8gdGhlaXIgcGxhdGZvcm0taW5kZXBlbmRlbnQgbG93ZXJjYXNlIG5hbWVzIGJ5IHRoZSByZW5kZXJlcidzXG4gICAqIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBcdTIwMTQgdGhlIG9uZSBtYXBwaW5nIGEga2V5IHByZXNzIGFuZCBhIGNsaWNrIHNoYXJlLCBzbyBgJ01vZCdgIGNhbm5vdCBtZWFuIHR3b1xuICAgKiBkaWZmZXJlbnQgdGhpbmdzICgqKkwxNyoqKS5cbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qKlxuICogQSB0cnVzdGVkIHBvaW50ZXIgZ2VzdHVyZSB0byBpbmplY3Qgb24gbW9iaWxlLCBpbiBDU1MgcGl4ZWxzIHdpdGhpbiB0aGUgV2ViVmlldydzIG93biB2aWV3cG9ydC5cbiAqXG4gKiBObyBkZXZpY2UtcGl4ZWwgY29udmVyc2lvbiBpcyBpbnZvbHZlZDogQ0RQIHRha2VzIHBhZ2UgY29vcmRpbmF0ZXMsIHNvIGBkZXZpY2VQaXhlbFJhdGlvYCBhbmQgdGhlXG4gKiBXZWJWaWV3J3Mgb2Zmc2V0IHVuZGVyIHRoZSBzdGF0dXMgYmFyIG5ldmVyIGVudGVyIHRoZSBwaWN0dXJlICh0aGV5IHdvdWxkIGZvciBuYXRpdmUgaW5qZWN0aW9uKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2JpbGVQb2ludGVySW5wdXRSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIGB0YXBgIGlzIHRoZSB0b3VjaCBhbmFsb2cgb2YgYSBsZWZ0IGNsaWNrOyBgbG9uZ1ByZXNzYCBpcyB0aGUgbW9iaWxlIGNvbnRleHQtbWVudSBnZXN0dXJlLCBpLmUuIHdoYXQgYVxuICAgKiBkZXNrdG9wIHJpZ2h0IGNsaWNrIG1lYW5zIGhlcmUuXG4gICAqL1xuICByZWFkb25seSBraW5kOiAnbG9uZ1ByZXNzJyB8ICd0YXAnO1xuXG4gIC8qKlxuICAgKiBTZWUge0BsaW5rIE1vYmlsZUtleUlucHV0UmVxdWVzdC5tb2RpZmllcnN9LlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IHggY29vcmRpbmF0ZSwgaW4gQ1NTIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZpZXdwb3J0IHkgY29vcmRpbmF0ZSwgaW4gQ1NTIHBpeGVscy5cbiAgICovXG4gIHJlYWRvbmx5IHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBIb3cgbG9uZyBhIGxvbmctcHJlc3MgaG9sZHMgdGhlIHRvdWNoIGRvd24gYmVmb3JlIHJlbGVhc2luZyBpdC5cbiAqXG4gKiBPYnNpZGlhbiBNb2JpbGUgaW1wbGVtZW50cyBsb25nLXByZXNzIGluIEphdmFTY3JpcHQgKGEgdGltZXIgc3RhcnRlZCBvbiBgdG91Y2hzdGFydGApIHJhdGhlciB0aGFuXG4gKiByZWx5aW5nIG9uIGEgbmF0aXZlIGdlc3R1cmUsIHNvIHRoaXMgaGFzIHRvIGNsZWFyICppdHMqIHRocmVzaG9sZCwgbm90IEFuZHJvaWQncy4gNjAwbXMgaXMgdGhlXG4gKiBjb252ZW50aW9uYWwgQW5kcm9pZCBsb25nLXByZXNzIHRocmVzaG9sZCBhbmQgY2xlYXJzIE9ic2lkaWFuJ3MgY29tZm9ydGFibHkuXG4gKi9cbmNvbnN0IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTID0gNjAwO1xuXG5jb25zdCBOT19NT0RJRklFUlMgPSAwO1xuY29uc3QgTU9ESUZJRVJfQklUX0FMVCA9IDE7XG5jb25zdCBNT0RJRklFUl9CSVRfQ09OVFJPTCA9IDI7XG5jb25zdCBNT0RJRklFUl9CSVRfTUVUQSA9IDQ7XG5jb25zdCBNT0RJRklFUl9CSVRfU0hJRlQgPSA4O1xuXG4vKipcbiAqIENEUCdzIG1vZGlmaWVyIGJpdG1hc2ssIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSBzcGVsbGluZyBhcyBFbGVjdHJvbidzIHN0cmluZyBsaXN0LlxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vY2hyb21lZGV2dG9vbHMuZ2l0aHViLmlvL2RldnRvb2xzLXByb3RvY29sL3RvdC9JbnB1dC8jbWV0aG9kLWRpc3BhdGNoS2V5RXZlbnR9XG4gKi9cbmNvbnN0IENEUF9NT0RJRklFUl9CSVRfQllfTkFNRSA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KFtcbiAgWydhbHQnLCBNT0RJRklFUl9CSVRfQUxUXSxcbiAgWydjb250cm9sJywgTU9ESUZJRVJfQklUX0NPTlRST0xdLFxuICBbJ21ldGEnLCBNT0RJRklFUl9CSVRfTUVUQV0sXG4gIFsnc2hpZnQnLCBNT0RJRklFUl9CSVRfU0hJRlRdXG5dKTtcblxuY29uc3QgS0VZX0NPREVfQkFDS1NQQUNFID0gODtcbmNvbnN0IEtFWV9DT0RFX1RBQiA9IDk7XG5jb25zdCBLRVlfQ09ERV9FTlRFUiA9IDEzO1xuY29uc3QgS0VZX0NPREVfRVNDQVBFID0gMjc7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19MRUZUID0gMzc7XG5jb25zdCBLRVlfQ09ERV9BUlJPV19VUCA9IDM4O1xuY29uc3QgS0VZX0NPREVfQVJST1dfUklHSFQgPSAzOTtcbmNvbnN0IEtFWV9DT0RFX0FSUk9XX0RPV04gPSA0MDtcbmNvbnN0IEtFWV9DT0RFX0RFTEVURSA9IDQ2O1xuXG4vKipcbiAqIE5hbWVkIGtleXMsIHdpdGggdGhlIGB0ZXh0YCBhIHJlYWwga2V5IHByZXNzIHdvdWxkIHByb2R1Y2UgKGFic2VudCB3aGVuIGl0IHByb2R1Y2VzIG5vbmUpLlxuICpcbiAqIE9ubHkga2V5cyB0aGUgZmxlZXQgYWN0dWFsbHkgcHJlc3NlcyBhcmUgbGlzdGVkLCBwbHVzIHRoZSBlZGl0aW5nIGtleXMgYSBjYWxsZXIgd291bGQgcmVhc29uYWJseSByZWFjaFxuICogZm9yIG5leHQuIEFuIHVua25vd24gbXVsdGktY2hhcmFjdGVyIGtleSBpcyBhIGNhbGxlciBlcnJvciwgbm90IGEgc2lsZW50IG5vLW9wIFx1MjAxNCBzZWVcbiAqIHtAbGluayB0b0tleUNvbW1hbmRzfS5cbiAqL1xuY29uc3QgTkFNRURfS0VZUyA9IG5ldyBNYXA8c3RyaW5nLCBOYW1lZEtleT4oW1xuICBbJ0Fycm93RG93bicsIHsgY29kZTogJ0Fycm93RG93bicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfQVJST1dfRE9XTiB9XSxcbiAgWydBcnJvd0xlZnQnLCB7IGNvZGU6ICdBcnJvd0xlZnQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX0xFRlQgfV0sXG4gIFsnQXJyb3dSaWdodCcsIHsgY29kZTogJ0Fycm93UmlnaHQnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0FSUk9XX1JJR0hUIH1dLFxuICBbJ0Fycm93VXAnLCB7IGNvZGU6ICdBcnJvd1VwJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9BUlJPV19VUCB9XSxcbiAgWydCYWNrc3BhY2UnLCB7IGNvZGU6ICdCYWNrc3BhY2UnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0JBQ0tTUEFDRSB9XSxcbiAgWydEZWxldGUnLCB7IGNvZGU6ICdEZWxldGUnLCB3aW5kb3dzVmlydHVhbEtleUNvZGU6IEtFWV9DT0RFX0RFTEVURSB9XSxcbiAgWydFbnRlcicsIHsgY29kZTogJ0VudGVyJywgdGV4dDogJ1xccicsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfRU5URVIgfV0sXG4gIFsnRXNjYXBlJywgeyBjb2RlOiAnRXNjYXBlJywgd2luZG93c1ZpcnR1YWxLZXlDb2RlOiBLRVlfQ09ERV9FU0NBUEUgfV0sXG4gIFsnVGFiJywgeyBjb2RlOiAnVGFiJywgdGV4dDogJ1xcdCcsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogS0VZX0NPREVfVEFCIH1dXG5dKTtcblxuY29uc3QgRklSU1RfQ09ERV9QT0lOVF9JTkRFWCA9IDA7XG5jb25zdCBESUdJVF9aRVJPX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignMCcpO1xuY29uc3QgRElHSVRfTklORV9DT0RFX1BPSU5UID0gY29kZVBvaW50T2YoJzknKTtcbmNvbnN0IFVQUEVSQ0FTRV9BX0NPREVfUE9JTlQgPSBjb2RlUG9pbnRPZignQScpO1xuY29uc3QgVVBQRVJDQVNFX1pfQ09ERV9QT0lOVCA9IGNvZGVQb2ludE9mKCdaJyk7XG5cbi8qKlxuICogVGhlIENEUCBzcGVsbGluZyBvZiBvbmUgbmFtZWQga2V5LlxuICovXG5pbnRlcmZhY2UgTmFtZWRLZXkge1xuICByZWFkb25seSBjb2RlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRleHQ/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogbnVtYmVyO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgZXhwcmVzc2lvbiB0aGUgaG9zdCBldmFsdWF0ZXMgdG8gYW5zd2VyIG9uZSBpbnB1dCByZXF1ZXN0LlxuICpcbiAqIE9wdGlvbmFsIGNoYWluaW5nIHRocm91Z2hvdXQ6IGJ5IHRoZSB0aW1lIHRoZSBob3N0IGFuc3dlcnMsIHRoZSBwYWdlIG1heSBoYXZlIG5hdmlnYXRlZCBhbmQgZHJvcHBlZCB0aGVcbiAqIG5hbWVzcGFjZSwgYW5kIGEgYFR5cGVFcnJvcmAgaW5zaWRlIHRoaXMgZXZhbHVhdGUgd291bGQgYmUgcmVwb3J0ZWQgYXMgYW4gaW5qZWN0aW9uIGZhaWx1cmUgdGhhdCBhbHJlYWR5XG4gKiBzdWNjZWVkZWQuXG4gKlxuICogQHBhcmFtIGlkIC0gVGhlIHJlcXVlc3QgaWQgdGhlIHJlbmRlcmVyIGlzIHdhaXRpbmcgb24uXG4gKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0gV2h5IHRoZSBpbmplY3Rpb24gZmFpbGVkLCB3aGVuIGl0IGRpZC4gT21pdCBvbiBzdWNjZXNzLlxuICogQHJldHVybnMgQSBzZWxmLWNvbnRhaW5lZCBleHByZXNzaW9uIHRvIHBhc3MgdG8gYFJ1bnRpbWUuZXZhbHVhdGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRSZXNvbHZlSW5wdXRFeHByZXNzaW9uKGlkOiBzdHJpbmcsIGVycm9yTWVzc2FnZT86IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgd2luZG93Ll9fb2JzaWRpYW5JbnRlZ3JhdGlvblRlc3Rpbmc/LnJlc29sdmVJbnB1dD8uKCR7SlNPTi5zdHJpbmdpZnkoaWQpfSwgJHtKU09OLnN0cmluZ2lmeShlcnJvck1lc3NhZ2UgPz8gbnVsbCl9KWA7XG59XG5cbi8qKlxuICogVGhlIGZpcnN0IGNvZGUgcG9pbnQgb2YgYSBub24tZW1wdHkgc3RyaW5nLlxuICpcbiAqIGBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0YCBpcyB0eXBlZCBgbnVtYmVyIHwgdW5kZWZpbmVkYCwgc28gZXZlcnkgY2FsbCBzaXRlIHdvdWxkIG90aGVyd2lzZSBjYXJyeSBhXG4gKiBgPz8gZmFsbGJhY2tgIHRoYXQgbm8gaW5wdXQgY2FuIGV2ZXIgcmVhY2ggXHUyMDE0IGEgZGVhZCBicmFuY2ggdW5kZXIgdGhlIDEwMCUgY292ZXJhZ2UgZ2F0ZS4gVGhyb3dpbmcgaGVyZVxuICoga2VlcHMgdGhhdCBpbXBvc3NpYmxlIGNhc2UgaW4gT05FIHBsYWNlLCB3aGVyZSBhIHVuaXQgdGVzdCBjYW4gcmVhY2ggaXQgZGlyZWN0bHksIGluc3RlYWQgb2Ygc3ByZWFkaW5nXG4gKiB1bnJlYWNoYWJsZSBmYWxsYmFja3MgKG9yIGNvdmVyYWdlIHN1cHByZXNzaW9ucykgYWNyb3NzIHRoZSBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHRleHQgLSBBIG5vbi1lbXB0eSBzdHJpbmcuXG4gKiBAcmV0dXJucyBJdHMgZmlyc3QgY29kZSBwb2ludC5cbiAqIEB0aHJvd3MgV2hlbiBgdGV4dGAgaXMgZW1wdHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2RlUG9pbnRPZih0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICBjb25zdCBjb2RlUG9pbnQgPSB0ZXh0LmNvZGVQb2ludEF0KEZJUlNUX0NPREVfUE9JTlRfSU5ERVgpO1xuICBpZiAoY29kZVBvaW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NvZGVQb2ludE9mIHJlY2VpdmVkIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgfVxuXG4gIHJldHVybiBjb2RlUG9pbnQ7XG59XG5cbi8qKlxuICogVHJhbnNsYXRlcyBhIG1vYmlsZSBpbnB1dCByZXF1ZXN0IGludG8gdGhlIG9yZGVyZWQgQ0RQIGNvbW1hbmRzIHRoYXQgcmVhbGl6ZSBpdC5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFdoYXQgdGhlIHJlbmRlcmVyIGFza2VkIHRoZSBob3N0IHRvIGluamVjdC5cbiAqIEByZXR1cm5zIFRoZSBjb21tYW5kcyB0byBzZW5kLCBpbiBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwSW5wdXRDb21tYW5kcyhyZXF1ZXN0OiBNb2JpbGVJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGlmIChyZXF1ZXN0LmtpbmQgPT09ICdrZXknKSB7XG4gICAgcmV0dXJuIHRvS2V5Q29tbWFuZHMocmVxdWVzdCk7XG4gIH1cblxuICByZXR1cm4gdG9Qb2ludGVyQ29tbWFuZHMocmVxdWVzdCk7XG59XG5cbi8qKlxuICogRm9sZHMgcmVzb2x2ZWQgbW9kaWZpZXIgbmFtZXMgaW50byBDRFAncyBiaXRtYXNrLlxuICpcbiAqIFVua25vd24gbmFtZXMgYXJlIGlnbm9yZWQgcmF0aGVyIHRoYW4gdGhyb3dpbmc6IHRoZSByZW5kZXJlcidzIGB0b0VsZWN0cm9uTW9kaWZpZXJzYCBpcyBleGhhdXN0aXZlIG92ZXJcbiAqIE9ic2lkaWFuJ3MgYE1vZGlmaWVyYCB1bmlvbiwgc28gYW4gdW5rbm93biBuYW1lIGhlcmUgd291bGQgbWVhbiB0aGUgdHdvIGNvcGllcyBoYXZlIGFscmVhZHkgZHJpZnRlZCwgYW5kXG4gKiBmYWlsaW5nIHRoZSB3aG9sZSBnZXN0dXJlIGlzIGEgd29yc2Ugb3V0Y29tZSB0aGFuIHByZXNzaW5nIGl0IHVubW9kaWZpZWQuXG4gKlxuICogQHBhcmFtIG1vZGlmaWVycyAtIFJlc29sdmVkIGxvd2VyY2FzZSBtb2RpZmllciBuYW1lcy5cbiAqIEByZXR1cm5zIFRoZSBDRFAgbW9kaWZpZXIgYml0bWFzay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRvQ2RwTW9kaWZpZXJzKG1vZGlmaWVyczogcmVhZG9ubHkgc3RyaW5nW10pOiBudW1iZXIge1xuICAvLyBTdW1taW5nIERJU1RJTkNUIGJpdHMgZXF1YWxzIE9SLWluZyB0aGVtLCBhbmQgdGhlIGBTZXRgIGlzIHdoYXQgbWFrZXMgdGhhdCBob2xkIGV2ZW4gd2hlbiBhIGNhbGxlclxuICAvLyBQYXNzZXMgdGhlIHNhbWUgbW9kaWZpZXIgdHdpY2UgXHUyMDE0IHNvIHRoZSBtYXNrIGlzIGJ1aWx0IHdpdGhvdXQgYSBiaXR3aXNlIG9wZXJhdG9yLlxuICBjb25zdCBiaXRzID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgbW9kaWZpZXJzKSB7XG4gICAgY29uc3QgYml0ID0gQ0RQX01PRElGSUVSX0JJVF9CWV9OQU1FLmdldChtb2RpZmllcik7XG4gICAgaWYgKGJpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiaXRzLmFkZChiaXQpO1xuICAgIH1cbiAgfVxuXG4gIGxldCBiaXRtYXNrID0gTk9fTU9ESUZJRVJTO1xuICBmb3IgKGNvbnN0IGJpdCBvZiBiaXRzKSB7XG4gICAgYml0bWFzayArPSBiaXQ7XG4gIH1cblxuICByZXR1cm4gYml0bWFzaztcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIGtleSBuYW1lIHRvIGl0cyBDRFAgc3BlbGxpbmcuXG4gKlxuICogQHBhcmFtIGtleSAtIEEgbmFtZWQga2V5IG9yIGEgc2luZ2xlIHByaW50YWJsZSBjaGFyYWN0ZXIuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIHNwZWxsaW5nLlxuICovXG5mdW5jdGlvbiByZXNvbHZlS2V5KGtleTogc3RyaW5nKTogTmFtZWRLZXkge1xuICBjb25zdCBuYW1lZEtleSA9IE5BTUVEX0tFWVMuZ2V0KGtleSk7XG4gIGlmIChuYW1lZEtleSkge1xuICAgIHJldHVybiBuYW1lZEtleTtcbiAgfVxuXG4gIC8vIFwiRXhhY3RseSBvbmUgY29kZSBwb2ludFwiLCB0ZXN0ZWQgd2l0aG91dCBzcGxpdHRpbmcgdGhlIHN0cmluZzogYGZyb21Db2RlUG9pbnRgIHJvdW5kLXRyaXBzIG9ubHkgd2hlblxuICAvLyBga2V5YCBpcyB0aGF0IHNpbmdsZSBjb2RlIHBvaW50LCBzbyBhbiBhc3RyYWwtcGxhbmUgY2hhcmFjdGVyIGNvdW50cyBhcyBvbmUgYW5kIGAnQ3RybCtLJ2AgZG9lcyBub3QuXG4gIGNvbnN0IGNvZGVQb2ludCA9IGtleS5jb2RlUG9pbnRBdChGSVJTVF9DT0RFX1BPSU5UX0lOREVYKTtcbiAgaWYgKGNvZGVQb2ludCA9PT0gdW5kZWZpbmVkIHx8IFN0cmluZy5mcm9tQ29kZVBvaW50KGNvZGVQb2ludCkgIT09IGtleSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBwcmVzc0tleSByZWNlaXZlZCBhbiB1bmtub3duIGtleSBuYW1lIG9uIG1vYmlsZTogJHtKU09OLnN0cmluZ2lmeShrZXkpfS4gYFxuICAgICAgICArIGBQYXNzIGEgc2luZ2xlIGNoYXJhY3RlciBvciBvbmUgb2Y6ICR7Wy4uLk5BTUVEX0tFWVMua2V5cygpXS5qb2luKCcsICcpfS5gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHVwcGVyQ2FzZWRDb2RlUG9pbnQgPSBjb2RlUG9pbnRPZihrZXkudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgY29kZTogcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludCksXG4gICAgdGV4dDoga2V5LFxuICAgIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZTogdXBwZXJDYXNlZENvZGVQb2ludFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBwaHlzaWNhbCBgY29kZWAgZm9yIGEgcHJpbnRhYmxlIGNoYXJhY3Rlci5cbiAqXG4gKiBDaGFyYWN0ZXJzIG91dHNpZGUgdGhlIEFTQ0lJIGxldHRlci9kaWdpdCByb3dzIGhhdmUgbm8gc3RhYmxlIHBoeXNpY2FsIGtleSwgc28gdGhleSBnZXQgYW4gZW1wdHlcbiAqIGBjb2RlYCBcdTIwMTQgdGhlIGB0ZXh0YCBzdGlsbCBjYXJyaWVzIHRoZW0sIHdoaWNoIGlzIHdoYXQgYW4gZWRpdG9yIHJlYWRzLlxuICpcbiAqIEBwYXJhbSB1cHBlckNhc2VkQ29kZVBvaW50IC0gVGhlIGNoYXJhY3RlcidzIHVwcGVyLWNhc2VkIGNvZGUgcG9pbnQuXG4gKiBAcmV0dXJucyBUaGUgQ0RQIGBjb2RlYCwgb3IgYW4gZW1wdHkgc3RyaW5nIHdoZW4gdGhlcmUgaXMgbm8gc3RhYmxlIG9uZS5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZUtleUNvZGUodXBwZXJDYXNlZENvZGVQb2ludDogbnVtYmVyKTogc3RyaW5nIHtcbiAgaWYgKHVwcGVyQ2FzZWRDb2RlUG9pbnQgPj0gVVBQRVJDQVNFX0FfQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IFVQUEVSQ0FTRV9aX0NPREVfUE9JTlQpIHtcbiAgICByZXR1cm4gYEtleSR7U3RyaW5nLmZyb21Db2RlUG9pbnQodXBwZXJDYXNlZENvZGVQb2ludCl9YDtcbiAgfVxuXG4gIGlmICh1cHBlckNhc2VkQ29kZVBvaW50ID49IERJR0lUX1pFUk9fQ09ERV9QT0lOVCAmJiB1cHBlckNhc2VkQ29kZVBvaW50IDw9IERJR0lUX05JTkVfQ09ERV9QT0lOVCkge1xuICAgIHJldHVybiBgRGlnaXQke1N0cmluZy5mcm9tQ29kZVBvaW50KHVwcGVyQ2FzZWRDb2RlUG9pbnQpfWA7XG4gIH1cblxuICByZXR1cm4gJyc7XG59XG5cbi8qKlxuICogQnVpbGRzIHRoZSBjb21tYW5kIHNlcXVlbmNlIGZvciBhIGtleSBwcmVzcy5cbiAqXG4gKiBNaXJyb3JzIHRoZSBkZXNrdG9wIHR3aW4ncyB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGluIENEUCdzIHNwZWxsaW5nOiBgcmF3S2V5RG93bmAgZmlyZXNcbiAqIGBrZXlkb3duYCBhbG9uZSwgYGNoYXJgIGZpcmVzIGBrZXlwcmVzc2AgLyBgYmVmb3JlaW5wdXRgIC8gYGlucHV0YCwgYGtleVVwYCBmaXJlcyBga2V5dXBgLiBBIGtleSB0aGF0XG4gKiBwcm9kdWNlcyBubyB0ZXh0IChgRXNjYXBlYCkgc2tpcHMgdGhlIGBjaGFyYCwgZXhhY3RseSBhcyBhIHJlYWwgb25lIGRvZXMuXG4gKlxuICogQHBhcmFtIHJlcXVlc3QgLSBUaGUga2V5IHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvS2V5Q29tbWFuZHMocmVxdWVzdDogTW9iaWxlS2V5SW5wdXRSZXF1ZXN0KTogQ2RwSW5wdXRDb21tYW5kW10ge1xuICBjb25zdCB7IGNvZGUsIHRleHQsIHdpbmRvd3NWaXJ0dWFsS2V5Q29kZSB9ID0gcmVzb2x2ZUtleShyZXF1ZXN0LmtleSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcbiAgY29uc3QgYmFzZSA9IHsgY29kZSwga2V5OiByZXF1ZXN0LmtleSwgbW9kaWZpZXJzLCB3aW5kb3dzVmlydHVhbEtleUNvZGUgfTtcblxuICBjb25zdCBjb21tYW5kczogQ2RwSW5wdXRDb21tYW5kW10gPSBbXG4gICAgeyBtZXRob2Q6ICdJbnB1dC5kaXNwYXRjaEtleUV2ZW50JywgcGFyYW1zOiB7IC4uLmJhc2UsIHR5cGU6ICdyYXdLZXlEb3duJyB9IH1cbiAgXTtcblxuICBpZiAodGV4dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29tbWFuZHMucHVzaCh7IG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoS2V5RXZlbnQnLCBwYXJhbXM6IHsgLi4uYmFzZSwgdGV4dCwgdHlwZTogJ2NoYXInIH0gfSk7XG4gIH1cblxuICBjb21tYW5kcy5wdXNoKHsgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hLZXlFdmVudCcsIHBhcmFtczogeyAuLi5iYXNlLCB0eXBlOiAna2V5VXAnIH0gfSk7XG5cbiAgcmV0dXJuIGNvbW1hbmRzO1xufVxuXG4vKipcbiAqIEJ1aWxkcyB0aGUgY29tbWFuZCBzZXF1ZW5jZSBmb3IgYSB0YXAgb3IgYSBsb25nLXByZXNzLlxuICpcbiAqIEEgdHJ1c3RlZCB0b3VjaCBwYWlyIGlzIGFsbCBDaHJvbWl1bSBuZWVkcyBcdTIwMTQgaXQgc3ludGhlc2l6ZXMgYHBvaW50ZXJkb3duYCAvIGB0b3VjaHN0YXJ0YCAvXG4gKiBgcG9pbnRlcnVwYCAvIGB0b3VjaGVuZGAgLyBgY2xpY2tgIGZyb20gaXQsIGV2ZXJ5IG9uZSBgaXNUcnVzdGVkYC4gVGhlIHJlbGVhc2UgY2FycmllcyBhbiBlbXB0eVxuICogYHRvdWNoUG9pbnRzYCBsaXN0LCB3aGljaCBpcyBDRFAncyBzcGVsbGluZyBmb3IgXCJhbGwgZmluZ2VycyBsaWZ0ZWRcIi5cbiAqXG4gKiBAcGFyYW0gcmVxdWVzdCAtIFRoZSBwb2ludGVyIHJlcXVlc3QuXG4gKiBAcmV0dXJucyBUaGUgY29tbWFuZHMgdG8gc2VuZCwgaW4gb3JkZXIuXG4gKi9cbmZ1bmN0aW9uIHRvUG9pbnRlckNvbW1hbmRzKHJlcXVlc3Q6IE1vYmlsZVBvaW50ZXJJbnB1dFJlcXVlc3QpOiBDZHBJbnB1dENvbW1hbmRbXSB7XG4gIGNvbnN0IG1vZGlmaWVycyA9IHRvQ2RwTW9kaWZpZXJzKHJlcXVlc3QubW9kaWZpZXJzKTtcblxuICByZXR1cm4gW1xuICAgIHtcbiAgICAgIG1ldGhvZDogJ0lucHV0LmRpc3BhdGNoVG91Y2hFdmVudCcsXG4gICAgICBwYXJhbXM6IHsgbW9kaWZpZXJzLCB0b3VjaFBvaW50czogW3sgeDogcmVxdWVzdC54LCB5OiByZXF1ZXN0LnkgfV0sIHR5cGU6ICd0b3VjaFN0YXJ0JyB9XG4gICAgfSxcbiAgICB7XG4gICAgICAuLi4ocmVxdWVzdC5raW5kID09PSAnbG9uZ1ByZXNzJyAmJiB7IGRlbGF5QmVmb3JlSW5NaWxsaXNlY29uZHM6IExPTkdfUFJFU1NfRFdFTExfSU5fTUlMTElTRUNPTkRTIH0pLFxuICAgICAgbWV0aG9kOiAnSW5wdXQuZGlzcGF0Y2hUb3VjaEV2ZW50JyxcbiAgICAgIHBhcmFtczogeyBtb2RpZmllcnMsIHRvdWNoUG9pbnRzOiBbXSwgdHlwZTogJ3RvdWNoRW5kJyB9XG4gICAgfVxuICBdO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFzQk8sTUFBTSw0QkFBNEI7QUFTbEMsTUFBTSx1Q0FBdUM7QUE2R3BELE1BQU0sbUNBQW1DO0FBRXpDLE1BQU0sZUFBZTtBQUNyQixNQUFNLG1CQUFtQjtBQUN6QixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHFCQUFxQjtBQU8zQixNQUFNLDJCQUEyQixvQkFBSSxJQUFvQjtBQUFBLEVBQ3ZELENBQUMsT0FBTyxnQkFBZ0I7QUFBQSxFQUN4QixDQUFDLFdBQVcsb0JBQW9CO0FBQUEsRUFDaEMsQ0FBQyxRQUFRLGlCQUFpQjtBQUFBLEVBQzFCLENBQUMsU0FBUyxrQkFBa0I7QUFDOUIsQ0FBQztBQUVELE1BQU0scUJBQXFCO0FBQzNCLE1BQU0sZUFBZTtBQUNyQixNQUFNLGlCQUFpQjtBQUN2QixNQUFNLGtCQUFrQjtBQUN4QixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLG9CQUFvQjtBQUMxQixNQUFNLHVCQUF1QjtBQUM3QixNQUFNLHNCQUFzQjtBQUM1QixNQUFNLGtCQUFrQjtBQVN4QixNQUFNLGFBQWEsb0JBQUksSUFBc0I7QUFBQSxFQUMzQyxDQUFDLGFBQWEsRUFBRSxNQUFNLGFBQWEsdUJBQXVCLG9CQUFvQixDQUFDO0FBQUEsRUFDL0UsQ0FBQyxhQUFhLEVBQUUsTUFBTSxhQUFhLHVCQUF1QixvQkFBb0IsQ0FBQztBQUFBLEVBQy9FLENBQUMsY0FBYyxFQUFFLE1BQU0sY0FBYyx1QkFBdUIscUJBQXFCLENBQUM7QUFBQSxFQUNsRixDQUFDLFdBQVcsRUFBRSxNQUFN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
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * Translates a mobile trusted-input request into the ordered Chrome DevTools Protocol `Input.*` commands
5
+ * that realize it (see **L39**).
6
+ *
7
+ * Pure and synchronous by design: the WebView connection ({@link WebViewCdpConnection}) sends whatever this
8
+ * returns, so every decision that is worth a test — the touch pair a tap expands into, the dwell a
9
+ * long-press adds, the `rawKeyDown` → `char` → `keyUp` shape a key press mirrors from the desktop twin, the
10
+ * modifier bitmask — lives here rather than inside the transport's I/O path.
11
+ *
12
+ * The request travels renderer → host as JSON (the renderer computes the coordinates, because only it can
13
+ * see the DOM), so both the request and the command shapes are deliberately plain data.
14
+ */
15
+ /**
16
+ * The name of the `Runtime.addBinding` function the host exposes on the page so the renderer can hand it an
17
+ * input request mid-closure.
18
+ *
19
+ * It is passed *into* the serialized bootstrap closure as data rather than referenced from it, because that
20
+ * closure may not read outer scope (**L15**) — so this stays the single definition.
21
+ */
22
+ export declare const MOBILE_INPUT_BINDING_NAME = "__obsidianIntegrationTestingInput";
23
+ /**
24
+ * How long the renderer waits for the host to service one input request before giving up.
25
+ *
26
+ * Generous relative to the work (a tap is two CDP commands; a long-press adds a 600ms dwell): the point is
27
+ * to fail with a legible error rather than hang the closure until the whole run times out. Passed into the
28
+ * bootstrap closure as data, for the same reason as {@link MOBILE_INPUT_BINDING_NAME}.
29
+ */
30
+ export declare const MOBILE_INPUT_TIMEOUT_IN_MILLISECONDS = 15000;
31
+ /**
32
+ * A single Chrome DevTools Protocol command, plus how long to wait before sending it.
33
+ *
34
+ * The delay is carried here rather than applied by the producer so that the whole sequence stays pure
35
+ * data — a test asserts the dwell without waiting for it.
36
+ */
37
+ export interface CdpInputCommand {
38
+ /**
39
+ * Milliseconds to wait before sending this command. Absent means "send immediately".
40
+ *
41
+ * Used only by the long-press dwell.
42
+ */
43
+ readonly delayBeforeInMilliseconds?: number;
44
+ /**
45
+ * The CDP method name, e.g. `Input.dispatchTouchEvent`.
46
+ */
47
+ readonly method: string;
48
+ /**
49
+ * The CDP method parameters.
50
+ */
51
+ readonly params: Record<string, unknown>;
52
+ }
53
+ /**
54
+ * What the renderer hands to the host binding: one request, plus the id to answer it on.
55
+ *
56
+ * The renderer builds this literal inside the serialized bootstrap closure, which cannot import (**L15**),
57
+ * so the shape is declared here and mirrored there. They are one wire format; change them together.
58
+ */
59
+ export interface MobileInputEnvelope {
60
+ /**
61
+ * The request id the renderer is waiting on.
62
+ */
63
+ readonly id: string;
64
+ /**
65
+ * What to inject.
66
+ */
67
+ readonly request: MobileInputRequest;
68
+ }
69
+ /**
70
+ * Anything the renderer can ask the host to inject.
71
+ */
72
+ export type MobileInputRequest = MobileKeyInputRequest | MobilePointerInputRequest;
73
+ /**
74
+ * A trusted key press to inject on mobile.
75
+ */
76
+ export interface MobileKeyInputRequest {
77
+ /**
78
+ * The key to press, in the same spelling the desktop twin takes: either a named key
79
+ * (`Enter`, `Escape`, `Tab`, `Backspace`, `Delete`, an arrow) or a single printable character.
80
+ */
81
+ readonly key: string;
82
+ /**
83
+ * Discriminant.
84
+ */
85
+ readonly kind: 'key';
86
+ /**
87
+ * Modifiers already resolved to their platform-independent lowercase names by the renderer's
88
+ * `toElectronModifiers` — the one mapping a key press and a click share, so `'Mod'` cannot mean two
89
+ * different things (**L17**).
90
+ */
91
+ readonly modifiers: readonly string[];
92
+ }
93
+ /**
94
+ * A trusted pointer gesture to inject on mobile, in CSS pixels within the WebView's own viewport.
95
+ *
96
+ * No device-pixel conversion is involved: CDP takes page coordinates, so `devicePixelRatio` and the
97
+ * WebView's offset under the status bar never enter the picture (they would for native injection).
98
+ */
99
+ export interface MobilePointerInputRequest {
100
+ /**
101
+ * `tap` is the touch analog of a left click; `longPress` is the mobile context-menu gesture, i.e. what a
102
+ * desktop right click means here.
103
+ */
104
+ readonly kind: 'longPress' | 'tap';
105
+ /**
106
+ * See {@link MobileKeyInputRequest.modifiers}.
107
+ */
108
+ readonly modifiers: readonly string[];
109
+ /**
110
+ * The viewport x coordinate, in CSS pixels.
111
+ */
112
+ readonly x: number;
113
+ /**
114
+ * The viewport y coordinate, in CSS pixels.
115
+ */
116
+ readonly y: number;
117
+ }
118
+ /**
119
+ * Builds the expression the host evaluates to answer one input request.
120
+ *
121
+ * Optional chaining throughout: by the time the host answers, the page may have navigated and dropped the
122
+ * namespace, and a `TypeError` inside this evaluate would be reported as an injection failure that already
123
+ * succeeded.
124
+ *
125
+ * @param id - The request id the renderer is waiting on.
126
+ * @param errorMessage - Why the injection failed, when it did. Omit on success.
127
+ * @returns A self-contained expression to pass to `Runtime.evaluate`.
128
+ */
129
+ export declare function buildResolveInputExpression(id: string, errorMessage?: string): string;
130
+ /**
131
+ * The first code point of a non-empty string.
132
+ *
133
+ * `String.prototype.codePointAt` is typed `number | undefined`, so every call site would otherwise carry a
134
+ * `?? fallback` that no input can ever reach — a dead branch under the 100% coverage gate. Throwing here
135
+ * keeps that impossible case in ONE place, where a unit test can reach it directly, instead of spreading
136
+ * unreachable fallbacks (or coverage suppressions) across the module.
137
+ *
138
+ * @param text - A non-empty string.
139
+ * @returns Its first code point.
140
+ * @throws When `text` is empty.
141
+ */
142
+ export declare function codePointOf(text: string): number;
143
+ /**
144
+ * Translates a mobile input request into the ordered CDP commands that realize it.
145
+ *
146
+ * @param request - What the renderer asked the host to inject.
147
+ * @returns The commands to send, in order.
148
+ */
149
+ export declare function toCdpInputCommands(request: MobileInputRequest): CdpInputCommand[];
150
+ /**
151
+ * Folds resolved modifier names into CDP's bitmask.
152
+ *
153
+ * Unknown names are ignored rather than throwing: the renderer's `toElectronModifiers` is exhaustive over
154
+ * Obsidian's `Modifier` union, so an unknown name here would mean the two copies have already drifted, and
155
+ * failing the whole gesture is a worse outcome than pressing it unmodified.
156
+ *
157
+ * @param modifiers - Resolved lowercase modifier names.
158
+ * @returns The CDP modifier bitmask.
159
+ */
160
+ export declare function toCdpModifiers(modifiers: readonly string[]): number;