obsidian-integration-testing 10.3.1 → 10.4.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.
@@ -0,0 +1,47 @@
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 desktop_only_plugin_skip_error_exports = {};
20
+ __export(desktop_only_plugin_skip_error_exports, {
21
+ DesktopOnlyPluginSkipError: () => DesktopOnlyPluginSkipError
22
+ });
23
+ module.exports = __toCommonJS(desktop_only_plugin_skip_error_exports);
24
+ class DesktopOnlyPluginSkipError extends Error {
25
+ /**
26
+ The id of the desktop-only plugin whose mobile tests were skipped.
27
+ */
28
+ pluginId;
29
+ /**
30
+ * Creates the error from the plugin id read out of `manifest.json`.
31
+ *
32
+ * @param pluginId - The id of the desktop-only plugin.
33
+ */
34
+ constructor(pluginId) {
35
+ super(
36
+ `Plugin "${pluginId}" has isDesktopOnly: true in manifest.json. Mobile integration tests cannot run for desktop-only plugins, so this project is skipped.`
37
+ );
38
+ this.name = "DesktopOnlyPluginSkipError";
39
+ this.pluginId = pluginId;
40
+ this.stack = `${this.name}: ${this.message}`;
41
+ }
42
+ }
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ DesktopOnlyPluginSkipError
46
+ });
47
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rlc2t0b3Atb25seS1wbHVnaW4tc2tpcC1lcnJvci50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiLyoqXG4gKiBAZmlsZVxuICpcbiAqIFRoZSBkaXN0aW5jdCBlcnJvciB0aHJvd24gd2hlbiBhIG1vYmlsZSB0cmFuc3BvcnQgaXMgYXNrZWQgdG8gcnVuIGludGVncmF0aW9uXG4gKiB0ZXN0cyBmb3IgYSBwbHVnaW4gd2hvc2UgYG1hbmlmZXN0Lmpzb25gIHNheXMgYGlzRGVza3RvcE9ubHk6IHRydWVgLlxuICpcbiAqIFRoaXMgaXMgYW4gZXhwZWN0ZWQsIGJlbmlnbiBvdXRjb21lIFx1MjAxNCBhIGRlc2t0b3Atb25seSBtYW5pZmVzdCBpcyBhIGxlZ2l0aW1hdGVcbiAqIHN0YXRlLCBub3QgYSBtaXNjb25maWd1cmF0aW9uIFx1MjAxNCBzbyB0aGUgZXJyb3IgZGVsaWJlcmF0ZWx5IGNhcnJpZXMgbm8gc3RhY2tcbiAqIHRyYWNlLiBJdCBpcyB0aHJvd24gcmF0aGVyIHRoYW4gcmV0dXJuZWQgYmVjYXVzZSB0aGUgdGVzdCBydW5uZXIncyBvbmx5IHdheSB0b1xuICogc2tpcCBhIHByb2plY3QncyB0ZXN0cyBpcyBhIGZhaWxpbmcgZ2xvYmFsIHNldHVwLCBhbmQgYSBzdGFjayB0cmFjZSBvbiBhblxuICogZXhwZWN0ZWQgc2tpcCBpcyB3aGF0IG1ha2VzIGEgZ3JlZW4gcmVsZWFzZSBydW4gcmVhZCBhcyBicm9rZW4uXG4gKi9cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBhIGRlc2t0b3Atb25seSBwbHVnaW4ncyBtb2JpbGUgaW50ZWdyYXRpb24gdGVzdHMgYXJlIHNraXBwZWQuXG4gKlxuICogQ2FycmllcyB0aGUgcGx1Z2luIGlkIHNvIGEgY2FsbGVyIGNhbiBgaW5zdGFuY2VvZmAtbWF0Y2ggYW5kIHJlcG9ydCB0aGUgc2tpcFxuICogaW4gaXRzIG93biB3b3Jkcy5cbiAqL1xuZXhwb3J0IGNsYXNzIERlc2t0b3BPbmx5UGx1Z2luU2tpcEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgVGhlIGlkIG9mIHRoZSBkZXNrdG9wLW9ubHkgcGx1Z2luIHdob3NlIG1vYmlsZSB0ZXN0cyB3ZXJlIHNraXBwZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgZXJyb3IgZnJvbSB0aGUgcGx1Z2luIGlkIHJlYWQgb3V0IG9mIGBtYW5pZmVzdC5qc29uYC5cbiAgICpcbiAgICogQHBhcmFtIHBsdWdpbklkIC0gVGhlIGlkIG9mIHRoZSBkZXNrdG9wLW9ubHkgcGx1Z2luLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBsdWdpbklkOiBzdHJpbmcpIHtcbiAgICBzdXBlcihcbiAgICAgIGBQbHVnaW4gXCIke3BsdWdpbklkfVwiIGhhcyBpc0Rlc2t0b3BPbmx5OiB0cnVlIGluIG1hbmlmZXN0Lmpzb24uIGBcbiAgICAgICAgKyAnTW9iaWxlIGludGVncmF0aW9uIHRlc3RzIGNhbm5vdCBydW4gZm9yIGRlc2t0b3Atb25seSBwbHVnaW5zLCBzbyB0aGlzIHByb2plY3QgaXMgc2tpcHBlZC4nXG4gICAgKTtcbiAgICB0aGlzLm5hbWUgPSAnRGVza3RvcE9ubHlQbHVnaW5Ta2lwRXJyb3InO1xuICAgIHRoaXMucGx1Z2luSWQgPSBwbHVnaW5JZDtcbiAgICAvLyBBbiBleHBlY3RlZCBza2lwLCBub3QgYSBkZWZlY3Q6IHRoZSBtZXNzYWdlIHNheXMgZXZlcnl0aGluZywgYW5kIGEgdHJhY2UgcG9pbnRpbmcgaW50byB0aGUgaGFybmVzc1xuICAgIC8vIE9ubHkgc3VnZ2VzdHMgdGhlIGhhcm5lc3MgYnJva2UuXG4gICAgdGhpcy5zdGFjayA9IGAke3RoaXMubmFtZX06ICR7dGhpcy5tZXNzYWdlfWA7XG4gIH1cbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQk8sTUFBTSxtQ0FBbUMsTUFBTTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBSXBDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBT1QsWUFBWSxVQUFrQjtBQUNuQztBQUFBLE1BQ0UsV0FBVyxRQUFRO0FBQUEsSUFFckI7QUFDQSxTQUFLLE9BQU87QUFDWixTQUFLLFdBQVc7QUFHaEIsU0FBSyxRQUFRLEdBQUcsS0FBSyxJQUFJLEtBQUssS0FBSyxPQUFPO0FBQUEsRUFDNUM7QUFDRjsiLAogICJuYW1lcyI6IFtdCn0K
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @file
3
+ *
4
+ * The distinct error thrown when a mobile transport is asked to run integration
5
+ * tests for a plugin whose `manifest.json` says `isDesktopOnly: true`.
6
+ *
7
+ * This is an expected, benign outcome — a desktop-only manifest is a legitimate
8
+ * state, not a misconfiguration — so the error deliberately carries no stack
9
+ * trace. It is thrown rather than returned because the test runner's only way to
10
+ * skip a project's tests is a failing global setup, and a stack trace on an
11
+ * expected skip is what makes a green release run read as broken.
12
+ */
13
+ /**
14
+ * Thrown when a desktop-only plugin's mobile integration tests are skipped.
15
+ *
16
+ * Carries the plugin id so a caller can `instanceof`-match and report the skip
17
+ * in its own words.
18
+ */
19
+ export declare class DesktopOnlyPluginSkipError extends Error {
20
+ /**
21
+ The id of the desktop-only plugin whose mobile tests were skipped.
22
+ */
23
+ readonly pluginId: string;
24
+ /**
25
+ * Creates the error from the plugin id read out of `manifest.json`.
26
+ *
27
+ * @param pluginId - The id of the desktop-only plugin.
28
+ */
29
+ constructor(pluginId: string);
30
+ }
@@ -79,4 +79,4 @@ ${sanitizedDetail}`);
79
79
  0 && (module.exports = {
80
80
  evalInObsidian
81
81
  });
82
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lc3BhY2UgLS0gV2UgbmVlZCB0byByZWZlcmVuY2UgYG9ic2lkaWFuYCBtb2R1bGUuXG5pbXBvcnQgdHlwZSAqIGFzIG9ic2lkaWFuIGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dElkXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU5hbWVzcGFjZUNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBnZXRUcmFuc3BvcnRPcHRpb25zLFxuICBnZXRWYXVsdFBhdGhcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLmNqcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5janMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmludGVyZmFjZSBFdmFsRXJyb3JFbnZlbG9wZSB7XG4gIHR5cGU6ICdlcnJvcic7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCBlbnZlbG9wZSByZXR1cm5lZCBieSB0aGUgcmVnaXN0ZXJlZCBgZXZhbFdyYXBwZXJgIGZyb20gaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIC0gYEV2YWxFcnJvckVudmVsb3BlYCBcdTIwMTQgYGNhbGxiYWNrYCB0aHJldzsgYHZhbHVlYCBpcyB0aGUgc2VyaWFsaXplZCBlcnJvci5cbiAqIC0gYEV2YWxVbmRlZmluZWRFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYHVuZGVmaW5lZGAuXG4gKiAtIGBFdmFsVmFsdWVFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYSBKU09OLXNlcmlhbGl6YWJsZSB2YWx1ZS5cbiAqL1xudHlwZSBFdmFsUmVzdWx0RW52ZWxvcGUgPVxuICB8IEV2YWxFcnJvckVudmVsb3BlXG4gIHwgRXZhbFVuZGVmaW5lZEVudmVsb3BlXG4gIHwgRXZhbFZhbHVlRW52ZWxvcGU7XG5cbmludGVyZmFjZSBFdmFsVW5kZWZpbmVkRW52ZWxvcGUge1xuICB0eXBlOiAndW5kZWZpbmVkJztcbn1cblxuaW50ZXJmYWNlIEV2YWxWYWx1ZUVudmVsb3BlIHtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5cbi8qKlxuICogQ29tbW9uIGFyZ3VtZW50cyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQXJndW1lbnRzIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB7QGxpbmsgQXBwfSBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGxpYnJhcnkgYmFnIGluamVjdGVkIGludG8gZXZlcnkgY2FsbGJhY2sgXHUyMDE0IHNlZSB7QGxpbmsgTGlifS5cbiAgICpcbiAgICogTmV2ZXIgZW1wdHk6IHRoZSBoYXJuZXNzIHByZS1wb3B1bGF0ZXMgYSAqKmJhc2UqKiBzZXQgb2YgcmVuZGVyZXItZHJpdmluZ1xuICAgKiBoZWxwZXJzICh0cnVzdGVkIGlucHV0IFx1MjAxNCBgdHlwZUludG9FZGl0b3JgIC8gYHByZXNzS2V5YCAvIGBtb3ZlTW91c2VgIC9cbiAgICogYGhvdmVyRWxlbWVudGAgLyBgdW5ob3ZlckVsZW1lbnRgIFx1MjAxNCBhbmQgYHdhaXRVbnRpbGApLCBhbmQgcHJvdmlkZXIgcGFja2FnZXNcbiAgICogKGNoaWVmbHkgYG9ic2lkaWFuLWRldi11dGlsc2ApIGBPYmplY3QuYXNzaWduYCB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlXG4gICAqIGxpYnJhcnkgb24gdG9wIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0uIEEgc2VyaWFsaXplZCBjbG9zdXJlIHJlYWNoZXNcbiAgICogZXZlcnkgc2hhcmVkIGhlbHBlciB0aHJvdWdoIGBsaWJgIFx1MjAxNCBgbGliLnR5cGVJbnRvRWRpdG9yKHsgZWRpdG9yLCB0ZXh0IH0pYCxcbiAgICogYGxpYi5nZXRGaWxlT3JOdWxsKHsgYXBwLCBcdTIwMjYgfSlgIFx1MjAxNCBpbnN0ZWFkIG9mIGltcG9ydGluZyBvciBoYW5kLXJvbGxpbmcgdGhlbS5cbiAgICovXG4gIGxpYjogTGliO1xuXG4gIC8qKlxuICAgKiBUaGUgYG9ic2lkaWFuYCBtb2R1bGUsIHJlc29sdmVkIGF0IHJ1bnRpbWUgaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICAgKi9cbiAgb2JzaWRpYW5Nb2R1bGU6IHR5cGVvZiBvYnNpZGlhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLmNyZWF0ZU5vdGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZU5vdGVQYXJhbXMge1xuICAvKipcbiAgICogVGhlIG5vdGUncyBjb250ZW50LiBUaGlzIGV4YWN0IHN0cmluZyBpcyB3aGF0IHRoZSBjcmVhdGVkIG5vdGUgaXMgcmVhZCBiYWNrXG4gICAqIGFnYWluc3QsIHNvIGl0IGlzIHRoZSBkZWZpbml0aW9uIG9mIGEgc3VjY2Vzc2Z1bCB3cml0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnRlbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhdWx0LXJlbGF0aXZlIHBhdGggdG8gY3JlYXRlLCBleHRlbnNpb24gaW5jbHVkZWQuXG4gICAqL1xuICByZWFkb25seSBwYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGV2YWxJbk9ic2lkaWFufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCBleHRlbmRzIEdlbmVyaWNPYmplY3QsIFJlc3VsdCwgVENvbnRleHRJZCBleHRlbmRzIENvbnRleHRJZDx1bmtub3duPiB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZD4ge1xuICAvKipcbiAgICogVGhlIGZ1bmN0aW9uIHRvIGV2YWx1YXRlIGluIHRoZSBPYnNpZGlhbiBjb250ZXh0LlxuICAgKi9cbiAgY2FsbGJhY2soaW5wdXQ6IENvbW1vbkFyZ3VtZW50cyAmIENvbnRleHRBcmd1bWVudHM8VENvbnRleHRJZD4gJiBJbnB1dCk6IFByb21pc2FibGU8UmVzdWx0PjtcblxuICAvKipcbiAgICogQSB7QGxpbmsgQ29udGV4dElkfSBsaW5raW5nIHRoaXMgY2FsbCB0byBhIHBlcnNpc3RlbnQgc3RvcmUgb24gYHdpbmRvd2BcbiAgICogaW4gdGhlIE9ic2lkaWFuIHByb2Nlc3MuIFRoZSBjYWxsYmFjayByZWNlaXZlcyBhIHR5cGVkIGBjb250ZXh0YCBvYmplY3RcbiAgICogdGhhdCBzdXJ2aXZlcyBhY3Jvc3MgY2FsbHMgc2hhcmluZyB0aGUgc2FtZSBJRC5cbiAgICpcbiAgICogV2hlbiBvbWl0dGVkLCBgY29udGV4dGAgaXMgYSBmcmVzaCBlbXB0eSBvYmplY3QgZWFjaCBjYWxsLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGV4dElkPzogVENvbnRleHRJZDtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgZnVuY3Rpb24uIFZhbHVlcyBtYXkgaW5jbHVkZSBmdW5jdGlvbnMgXHUyMDE0XG4gICAqIHRoZXkgYXJlIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYC5cbiAgICovXG4gIHJlYWRvbmx5IGlucHV0PzogSW5wdXQ7XG5cbiAgLyoqXG4gICAqIFNraXBzIHByZS1mbGlnaHQgY2hlY2tzICh2YXVsdCByZWdpc3RyYXRpb24sIENMSSBhdmFpbGFiaWxpdHkpLlxuICAgKiBVc2VkIGludGVybmFsbHkgYnkgdmF1bHQgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucy5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZWFkb25seSBzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT3ZlcnJpZGUgdGhlIHRyYW5zcG9ydCBmb3IgdGhpcyBjYWxsLiBXaGVuIG9taXR0ZWQsIHVzZXMgdGhlIHRyYW5zcG9ydFxuICAgKiBjb25maWd1cmVkIHZpYSB0aGUgY29udGV4dCBwcm92aWRlciAoc2V0IGJ5IHRoZSBmcmFtZXdvcmsgYWRhcHRlcidzIGdsb2JhbCBzZXR1cCkuXG4gICAqL1xuICByZWFkb25seSB0cmFuc3BvcnQ/OiBPYnNpZGlhblRyYW5zcG9ydDtcblxuICAvKipcbiAgICogVGhlIHBhdGggdG8gdGhlIE9ic2lkaWFuIHZhdWx0LiBEZWZhdWx0cyB0byBgcHJvY2Vzcy5jd2QoKWAuXG4gICAqL1xuICByZWFkb25seSB2YXVsdFBhdGg/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBwbGFpbiBvYmplY3Qgd2l0aCBzdHJpbmcga2V5cy5cbiAqL1xuZXhwb3J0IHR5cGUgR2VuZXJpY09iamVjdCA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMuaG92ZXJFbGVtZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3ZlckVsZW1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gaG92ZXIuIFRoZSBwb2ludGVyIGlzIG1vdmVkIHRvIGl0cyBjZW50ZXIuIFRoaXMgaXMgYSBsaXZlXG4gICAqIHJlbmRlcmVyIERPTSBub2RlIFx1MjAxNCB0aGUgY2FsbGJhY2sgcnVucyBpbi1yZW5kZXJlciwgc28gbm8gY3Jvc3MtcHJvY2Vzc1xuICAgKiBzZXJpYWxpemF0aW9uIGlzIG5lZWRlZCAoc2FtZSBhcyB7QGxpbmsgVHlwZUludG9FZGl0b3JQYXJhbXMuZWRpdG9yfSkuXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBUaGUgc2hhcmVkIGxpYnJhcnkgYmFnIGluamVjdGVkIGludG8gZXZlcnkge0BsaW5rIGV2YWxJbk9ic2lkaWFufSBjYWxsYmFjayBhc1xuICoge0BsaW5rIENvbW1vbkFyZ3VtZW50cy5saWJ9LlxuICpcbiAqIFR3byBsYXllcnMgY29tcG9zZSBpbnRvIHRoaXMgb25lIGJhZy4gVGhlICoqYmFzZSoqIFx1MjAxNCB0aGUgaGFybmVzcy1wcm92aWRlZFxuICogcmVuZGVyZXItZHJpdmluZyBoZWxwZXJzIGRlY2xhcmVkIGJlbG93ICh0aGUgdHJ1c3RlZC1pbnB1dCBwcmltaXRpdmVzIGFuZFxuICoge0BsaW5rIExpYi53YWl0VW50aWx9KSBcdTIwMTQgaXMgYWx3YXlzIHByZXNlbnQuIE9uIHRvcCwgcHJvdmlkZXIgcGFja2FnZXMgcmVnaXN0ZXJcbiAqIGEgcmVuZGVyZXItc2lkZSByZXNvbHZlciB2aWEge0BsaW5rIHJlZ2lzdGVyTGliUmVzb2x2ZXJ9IHRvIGBPYmplY3QuYXNzaWduYFxuICogdGhlaXIgd2hvbGUgcmVuZGVyZXItc2FmZSBsaWJyYXJ5IGF0IHJ1bnRpbWUsIGFuZCBhdWdtZW50IHRoaXMgKiphdWdtZW50YWJsZSoqXG4gKiBpbnRlcmZhY2UgKHRoZSBgaTE4bmV4dGAgYEN1c3RvbVR5cGVPcHRpb25zYCBpZGlvbSkgdmlhXG4gKiBgZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnYCB0byB0eXBlIGl0LiBNdWx0aXBsZSBwcm92aWRlcnNcbiAqIGNvbXBvc2U6IHRoZWlyIGV4cG9ydHMgbWVyZ2UgYXQgcnVudGltZSBhbmQgdGhlaXIgYXVnbWVudGF0aW9ucyBtZXJnZSBpbiB0aGVcbiAqIHR5cGUgc3lzdGVtIChgaW50ZXJmYWNlIExpYiBleHRlbmRzIFx1MjAyNmApLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogZGVjbGFyZSBtb2R1bGUgJ29ic2lkaWFuLWludGVncmF0aW9uLXRlc3RpbmcnIHtcbiAqICAgaW50ZXJmYWNlIExpYiBleHRlbmRzICh0eXBlb2YgaW1wb3J0KCdvYnNpZGlhbi1kZXYtdXRpbHMvX19tZXJnZWQnKSkge31cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIExpYiB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbm90ZSBhbmQgZG9lcyBub3QgcmV0dXJuIHVudGlsIGl0cyBjb250ZW50IGlzIHZlcmlmaWFibHkgb25cbiAgICogZGlzaywgcmV3cml0aW5nIGl0IGlmIGl0IGlzIG5vdC5cbiAgICpcbiAgICogVXNlIHRoaXMgaW5zdGVhZCBvZiBgYXBwLnZhdWx0LmNyZWF0ZWAgaW4gYW55IHN1aXRlIHRoYXQgbWF5IHJ1biBvblxuICAgKiBBbmRyb2lkLiBUaGUgZW11bGF0b3IgdHJhbnNwb3J0IGxvc2VzIHJvdWdobHkgKiowLjkgJSoqIG9mIGB2YXVsdC5jcmVhdGVgXG4gICAqIHdyaXRlcyAobWVhc3VyZWQ6IDcgbG9zdCBpbiA4MDAgY3JlYXRlcyk6IHRoZSBmaWxlIGxhbmRzICoqMCBieXRlcyoqIG9uXG4gICAqIGRpc2sgd2hpbGUgT2JzaWRpYW4ncyBpbi1tZW1vcnkgYFRGaWxlLnN0YXRgIHJlcG9ydHMgdGhlIGZ1bGwgYnl0ZSBjb3VudCxcbiAgICogYW5kIGl0IGRvZXMgbm90IGhlYWwgb24gaXRzIG93bi4gQSBzdWl0ZSBkb2luZyB+MzQgY3JlYXRlcyBwZXIgcnVuXG4gICAqIHRoZXJlZm9yZSBoYXMgYSB+MjYgJSBjaGFuY2Ugb2YgYXQgbGVhc3Qgb25lIGxvc3Qgd3JpdGUsIGFuZCB3aGljaGV2ZXIgdGVzdFxuICAgKiBsb3NlcyB0aGF0IGxvdHRlcnkgZmFpbHMgb24gYSBgd2FpdFVudGlsYCBmb3IgY29udGVudCB0aGF0IHdhcyBuZXZlclxuICAgKiB3cml0dGVuIFx1MjAxNCB3aGljaCBpcyB3aHkgaXQgcmVhZHMgYXMgYW4gdW5yZWxhdGVkIHBlci10ZXN0IGZsYWtlIHJhdGhlciB0aGFuXG4gICAqIG9uZSBzaGFyZWQgY2F1c2UuXG4gICAqXG4gICAqIFZlcmlmaWNhdGlvbiBpcyBieSAqKnJlYWRpbmcgdGhlIG5vdGUgYmFjayoqLCBuZXZlciBieSBpbnNwZWN0aW5nXG4gICAqIGBURmlsZS5zdGF0YDogYHN0YXRgIGlzIGV4YWN0bHkgdGhlIGZpZWxkIHRoYXQgbGllcyBoZXJlLiBBIHJld3JpdGUgdGhyb3VnaFxuICAgKiBgdmF1bHQubW9kaWZ5YCB3aXRoIHRoZSBzYW1lIGNvbnRlbnQgbGFuZHMgY29ycmVjdGx5IChhbHNvIG1lYXN1cmVkKSwgc28gYVxuICAgKiBsb3N0IHdyaXRlIGNvc3RzIGEgcmV0cnkgcmF0aGVyIHRoYW4gYSBmYWlsdXJlLiBBIG5vdGUgd2hvc2UgY29udGVudCBzdGlsbFxuICAgKiBkb2VzIG5vdCBtYXRjaCBhZnRlciB0aGUgYm91bmRlZCByZXRyaWVzIHRocm93cywgbmFtaW5nIHRoZSBwYXRoIGFuZCBib3RoXG4gICAqIGxlbmd0aHMsIHNvIGEgZ2VudWluZWx5IGJyb2tlbiB3cml0ZSBmYWlscyBsb3VkbHkgaW5zdGVhZCBvZiBzcGlubmluZy5cbiAgICpcbiAgICogSGFybWxlc3MgZXZlcnl3aGVyZSBlbHNlIFx1MjAxNCBvbiBhIHRyYW5zcG9ydCB0aGF0IGRvZXMgbm90IGxvc2Ugd3JpdGVzIHRoZVxuICAgKiByZWFkLWJhY2sgbWF0Y2hlcyBmaXJzdCB0aW1lIGFuZCBub3RoaW5nIGlzIHJld3JpdHRlbi5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBub3RlIHBhdGggYW5kIGNvbnRlbnQuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHJlc29sdmluZyB0byB0aGUgY3JlYXRlZCBmaWxlLCBvbmNlIGl0cyBjb250ZW50XG4gICAqICAgaXMgY29uZmlybWVkLlxuICAgKi9cbiAgY3JlYXRlTm90ZSh0aGlzOiB2b2lkLCBwYXJhbXM6IENyZWF0ZU5vdGVQYXJhbXMpOiBQcm9taXNlPFRGaWxlPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGNlbnRlciBvZiBhbiBlbGVtZW50IHVzaW5nICoqdHJ1c3RlZCoqXG4gICAqIEVsZWN0cm9uIHBvaW50ZXIgaW5wdXQsIHRoZW4gcG9sbHMgdW50aWwgdGhlIGVsZW1lbnQgYWN0dWFsbHkgbWF0Y2hlc1xuICAgKiBgOmhvdmVyYC5cbiAgICpcbiAgICogQmVjYXVzZSB0aGUgbW92ZSBpcyB0cnVzdGVkIChzZWUge0BsaW5rIExpYi5tb3ZlTW91c2V9KSwgdGhlIHJlYWwgYDpob3ZlcmBcbiAgICogc3RhdGUgdGFrZXMgZWZmZWN0IGluIHRoZSBDU1MgZW5naW5lIFx1MjAxNCByZWFsIHRoZW1lIGB2YXIoKWAgdmFsdWVzIGFuZCByZWFsXG4gICAqIGNvbXBvc2l0aW5nIFx1MjAxNCBpbnN0ZWFkIG9mIGEgaGFuZC1zaW11bGF0ZWQgY2FzY2FkZS4gSXQgcG9sbHMgdGhlIGxpdmVcbiAgICogYGVsZW1lbnQubWF0Y2hlcygnOmhvdmVyJylgIHN0YXRlIChub3QgYSBmaXhlZCBkZWxheSksIHNvIGl0IGlzIHJvYnVzdCB1bmRlclxuICAgKiBzaGFyZWQtaW5zdGFuY2UgbG9hZC4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZCB3aW5kb3cncyAqKmdsb2JhbCoqXG4gICAqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBob3Zlci5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG1hdGNoZXMgYDpob3ZlcmAuXG4gICAqL1xuICBob3ZlckVsZW1lbnQodGhpczogdm9pZCwgcGFyYW1zOiBIb3ZlckVsZW1lbnRQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byB0aGUgZ2l2ZW4gd2ViLWNvbnRlbnRzIGNvb3JkaW5hdGVzIHVzaW5nIGFcbiAgICogKip0cnVzdGVkKiogRWxlY3Ryb24gcG9pbnRlciBtb3ZlLlxuICAgKlxuICAgKiBBIHRydXN0ZWQgbW92ZSAoaW5qZWN0ZWQgdmlhIEVsZWN0cm9uJ3MgYHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50YClcbiAgICogdXBkYXRlcyB0aGUgcmVhbCBwb2ludGVyIHN0YXRlIGluIHRoZSBDU1MgZW5naW5lLCBzbyBgOmhvdmVyYCBydWxlc1xuICAgKiBnZW51aW5lbHkgYXBwbHkgXHUyMDE0IHVubGlrZSBgZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnbW91c2VvdmVyJykpYCxcbiAgICogd2hpY2ggaXMgdW50cnVzdGVkIGFuZCBuZXZlciBzZXRzIGA6aG92ZXJgLiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbG93LWxldmVsIHByaW1pdGl2ZTogaXQgcGVyZm9ybXMgYSBzaW5nbGUgbW92ZSBhbmQgZG9lcyAqKm5vdCoqXG4gICAqIHdhaXQgZm9yIGFueSBzdGF0ZSB0byBzZXR0bGUgKGNhbGxlcnMgcG9sbCB0aGVpciBvd24gcmVhZGluZXNzIHNpZ25hbCkuXG4gICAqIFByZWZlciB7QGxpbmsgTGliLmhvdmVyRWxlbWVudH0gLyB7QGxpbmsgTGliLnVuaG92ZXJFbGVtZW50fSBmb3JcbiAgICogZWxlbWVudC1yZWxhdGl2ZSBtb3ZlczsgdXNlIGBtb3ZlTW91c2VgIGRpcmVjdGx5IHdoZW4gYW4gZWxlbWVudC1yZWxhdGl2ZVxuICAgKiB0YXJnZXQgZG9lcyBub3QgZml0IChlLmcuIGFuIGVsZW1lbnQgc3Bhbm5pbmcgdGhlIGZ1bGwgdmlld3BvcnQgd2lkdGgpLlxuICAgKlxuICAgKiBTeW5jaHJvbm91czogaW5qZWN0aW5nIHRoZSB0cnVzdGVkIG1vdmUgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGUgY2FsbGVyXG4gICAqIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3ZWItY29udGVudHMgRElQIGNvb3JkaW5hdGVzIHRvIG1vdmUgdG8uXG4gICAqL1xuICBtb3ZlTW91c2UodGhpczogdm9pZCwgcGFyYW1zOiBNb3ZlTW91c2VQYXJhbXMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQcmVzc2VzIGEgc2luZ2xlIGtleSAob3B0aW9uYWxseSB3aXRoIG1vZGlmaWVycykgdXNpbmcgKip0cnVzdGVkKiogRWxlY3Ryb25cbiAgICoga2V5Ym9hcmQgaW5wdXQsIGZpcmluZyB0aGUgZnVsbCByZWFsIGtleSBwaXBlbGluZSBcdTIwMTRcbiAgICogYGtleWRvd25gIFx1MjE5MiBga2V5cHJlc3NgIFx1MjE5MiBgYmVmb3JlaW5wdXRgIFx1MjE5MiBgaW5wdXRgIFx1MjE5MiBga2V5dXBgLlxuICAgKlxuICAgKiBUaGlzIGlzIHRoZSBrZXktcHJlc3MgYW5hbG9nIG9mIHtAbGluayBMaWIudHlwZUludG9FZGl0b3J9OiBpdCBpbmplY3RzIGFcbiAgICogdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBzZXF1ZW5jZSB2aWEgRWxlY3Ryb24nc1xuICAgKiBgd2ViQ29udGVudHMuc2VuZElucHV0RXZlbnRgLCBzbyBpdCBpcyBkZWxpdmVyZWQgdG8gdGhlIHdpbmRvdydzIERPTS1mb2N1c2VkXG4gICAqIGVsZW1lbnQgYW5kIGZsb3dzIHRocm91Z2ggdGhlIHJlYWwgaW5wdXQgcGlwZWxpbmUgXHUyMDE0IHVubGlrZVxuICAgKiBgZGlzcGF0Y2hFdmVudChuZXcgS2V5Ym9hcmRFdmVudCguLi4pKWAsIHdoaWNoIGlzIHVudHJ1c3RlZCAoYGlzVHJ1c3RlZDpcbiAgICogZmFsc2VgKSBhbmQgaWdub3JlZCBieSBDb2RlTWlycm9yIGFuZCBtb3N0IGtleSBoYW5kbGVycy4gVXNlIGl0IGZvciBzcGVjaWFsXG4gICAqIGtleXMgKGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYXJyb3cga2V5cykgYW5kIG1vZGlmaWVyIGNvbWJpbmF0aW9uc1xuICAgKiAoYFNoaWZ0K0VudGVyYCwgYEN0cmwrQWApIHRoYXQge0BsaW5rIExpYi50eXBlSW50b0VkaXRvcn0gKHdoaWNoIHR5cGVzXG4gICAqIHByaW50YWJsZSB0ZXh0KSBkb2VzIG5vdCBjb3Zlci5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgbG93LWxldmVsIHByaW1pdGl2ZTogaXQgaW5qZWN0cyB0aGUga2V5IHByZXNzIGFuZCBkb2VzICoqbm90KipcbiAgICogcG9sbCBmb3IgYW55IGVmZmVjdCAoYSBrZXkgcHJlc3MgaGFzIG5vIHVuaXZlcnNhbCBvYnNlcnZhYmxlIG91dGNvbWUgXHUyMDE0XG4gICAqIGBFbnRlcmAgZWRpdHMgdGhlIGRvY3VtZW50LCBgRXNjYXBlYCBjbG9zZXMgYSBtb2RhbCwgYEFycm93RG93bmAgbW92ZXMgdGhlXG4gICAqIHNlbGVjdGlvbikuIFRoZSBjYWxsZXIgZm9jdXNlcyB0aGUgaW50ZW5kZWQgdGFyZ2V0IGZpcnN0LCB0aGVuIGF3YWl0cyB0aGVcbiAgICogZXhwZWN0ZWQgZWZmZWN0IHZpYSB7QGxpbmsgTGliLndhaXRVbnRpbH0uIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBmb2N1cywgc28gb25seSB0aGUgRE9NLWZvY3VzZWQgZWxlbWVudCByZWNlaXZlcyB0aGUga2V5LlxuICAgKlxuICAgKiBTeW5jaHJvbm91czogaW5qZWN0aW5nIHRoZSB0cnVzdGVkIGtleSBwcmVzcyBkb2VzIG5vIHJlYWwgYXdhaXRpbmcsIHNvIHRoZVxuICAgKiBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byBgYXdhaXRgIGl0LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGtleSB0byBwcmVzcyBhbmQgYW55IG1vZGlmaWVycyB0byBob2xkLlxuICAgKi9cbiAgcHJlc3NLZXkodGhpczogdm9pZCwgcGFyYW1zOiBQcmVzc0tleVBhcmFtcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFR5cGVzIHRleHQgaW50byBhIENvZGVNaXJyb3Ige0BsaW5rIEVkaXRvcn0gdXNpbmcgKip0cnVzdGVkKiogRWxlY3Ryb25cbiAgICoga2V5Ym9hcmQgaW5wdXQuXG4gICAqXG4gICAqIFR5cGluZyBpcyBwcmVzc2luZyBlYWNoIGNoYXJhY3RlciBrZXkgaW4gdHVybjogdGhpcyBmb2N1c2VzIHRoZSBlZGl0b3JcbiAgICogKGNhcmV0IHRvIGVuZCkgYW5kIHByZXNzZXMgZXZlcnkgY29kZSBwb2ludCBvZiBgdGV4dGAgdmlhXG4gICAqIHtAbGluayBMaWIucHJlc3NLZXl9IFx1MjAxNCB0aGUgc2FtZSB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgIGEgcmVhbFxuICAgKiB1c2VyIHByb2R1Y2VzLiBFYWNoIGtleXN0cm9rZSBpcyBkZWxpdmVyZWQgdG8gdGhlIHdpbmRvdydzIERPTS1mb2N1c2VkXG4gICAqIGVsZW1lbnQgYW5kIGZsb3dzIHRocm91Z2ggQ29kZU1pcnJvcidzIHJlYWwgaW5wdXQgcGlwZWxpbmUsIHNvIHRoZSB0eXBlZFxuICAgKiB0ZXh0IHJlYWNoZXMgdGhlIGRvY3VtZW50ICoqb25seSBpZiB0aGUgZWRpdG9yIGdlbnVpbmVseSBob2xkcyBmb2N1cyoqLlxuICAgKiBUaGlzIG1ha2VzIFwidGhlIHVzZXIgdHlwZWQgaW50byB0aGUgZWRpdG9yXCIgYSBmYWl0aGZ1bCBlbmQtdG8tZW5kIGNoZWNrLFxuICAgKiB1bmxpa2UgYGRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoLi4uKSlgICh1bnRydXN0ZWQgXHUyMDE0IGlnbm9yZWQgYnlcbiAgICogQ29kZU1pcnJvcikgb3IgYGV4ZWNDb21tYW5kKCdpbnNlcnRUZXh0JylgIChtdXRhdGVzIHRoZSBzZWxlY3Rpb24gZXZlblxuICAgKiB3aGVuIHRoZSBlZGl0b3IgaXMgbm90IGZvY3VzZWQsIG1hc2tpbmcgZm9jdXMgYnVncyBhcyBmYWxzZSBwb3NpdGl2ZXMpLlxuICAgKlxuICAgKiBBZnRlciBpbmplY3RpbmcgdGhlIGtleXN0cm9rZXMgaXQgcG9sbHMgdW50aWwgdGhlIGRvY3VtZW50IHJlZmxlY3RzIHRoZVxuICAgKiBpbnB1dCwgb3IgYSBib3VuZGVkIHRpbWVvdXQgZWxhcHNlcyAodGhlIGV4cGVjdGVkIG91dGNvbWUgd2hlbiB0aGUgZWRpdG9yXG4gICAqIGlzIHJlYWQtb25seSBhbmQgcmVqZWN0cyB0aGUgaW5wdXQsIG9yIHdoZW4gZm9jdXMgd2FzIHN0b2xlbikuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWRpdG9yIHRvIHR5cGUgaW50byBhbmQgdGhlIHRleHQgdG8gdHlwZS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBrZXlzdHJva2VzIGhhdmUgc2V0dGxlZC5cbiAgICovXG4gIHR5cGVJbnRvRWRpdG9yKHRoaXM6IHZvaWQsIHBhcmFtczogVHlwZUludG9FZGl0b3JQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBNb3ZlcyB0aGUgbW91c2UgcG9pbnRlciB0byBhIHBvaW50IGp1c3Qgb3V0c2lkZSBhbiBlbGVtZW50J3MgYm91bmRpbmcgYm94XG4gICAqIHVzaW5nIGEgKip0cnVzdGVkKiogRWxlY3Ryb24gcG9pbnRlciBtb3ZlLCB0aGVuIHBvbGxzIHVudGlsIHRoZSBlbGVtZW50IG5vXG4gICAqIGxvbmdlciBtYXRjaGVzIGA6aG92ZXJgLlxuICAgKlxuICAgKiBUaGUgaW52ZXJzZSBvZiB7QGxpbmsgTGliLmhvdmVyRWxlbWVudH0uIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWRcbiAgICogd2luZG93J3MgKipnbG9iYWwqKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLiBXaGVuXG4gICAqIGFuIGVsZW1lbnQgc3BhbnMgdGhlIGZ1bGwgdmlld3BvcnQgKG5vIHBvaW50IG91dHNpZGUgaXRzIGJveCBpcyByZWFjaGFibGUpLFxuICAgKiB1c2Uge0BsaW5rIExpYi5tb3ZlTW91c2V9IGRpcmVjdGx5IHRvIG1vdmUgdGhlIHBvaW50ZXIgdG8gYSBrbm93biBlbXB0eVxuICAgKiBjb29yZGluYXRlIGluc3RlYWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgZWxlbWVudCB0byBtb3ZlIHRoZSBwb2ludGVyIGF3YXkgZnJvbS5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBlbGVtZW50IG5vIGxvbmdlciBtYXRjaGVzXG4gICAqICAgYDpob3ZlcmAuXG4gICAqL1xuICB1bmhvdmVyRWxlbWVudCh0aGlzOiB2b2lkLCBwYXJhbXM6IFVuaG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogUG9sbHMgYSBwcmVkaWNhdGUgdW50aWwgaXQgYmVjb21lcyB0cnV0aHksIG9yIHJlamVjdHMgb25jZSBhIGJvdW5kZWRcbiAgICogdGltZW91dCBlbGFwc2VzLlxuICAgKlxuICAgKiBJbnRlZ3JhdGlvbi10ZXN0IGBldmFsSW5PYnNpZGlhbmAgY2FsbGJhY2tzIHJvdXRpbmVseSBuZWVkIHRvIHdhaXQgZm9yIGFuXG4gICAqIGFzeW5jaHJvbm91cyBlZmZlY3QgdG8gc2V0dGxlIChhIHZpZXcgdG8gb3BlbiwgYSBET00gbm9kZSB0byBhcHBlYXIsIGFcbiAgICogc2V0dGluZyB0byBhcHBseSkuIEJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmRcbiAgICogY2Fubm90IGltcG9ydCBtb2R1bGVzLCBpdCBjYW4ndCByZXVzZSBgb2JzaWRpYW4tZGV2LXV0aWxzYCdcbiAgICogYHJldHJ5V2l0aFRpbWVvdXRgIC8gYHJ1bldpdGhUaW1lb3V0YC4gVGhpcyBoZWxwZXIgaXMgdGhlIHNoYXJlZCwgaW5qZWN0ZWRcbiAgICogcmVwbGFjZW1lbnQgZm9yIHRoZSBwZXItY2xvc3VyZSBwb2xsIGxvb3BzIGNvbnN1bWVycyB3b3VsZCBvdGhlcndpc2VcbiAgICogaGFuZC1yb2xsLlxuICAgKlxuICAgKiBUaGUgYHByZWRpY2F0ZWAgbWF5IGJlIHN5bmNocm9ub3VzIG9yIGFzeW5jaHJvbm91cyBcdTIwMTQgaXQgaXMgYXdhaXRlZCBvbiBldmVyeVxuICAgKiBwb2xsLiBJdCBpcyBjaGVja2VkIGltbWVkaWF0ZWx5LCB0aGVuIHJlLWNoZWNrZWQgZXZlcnlcbiAgICogYGludGVydmFsSW5NaWxsaXNlY29uZHNgIHVudGlsIGl0IHJldHVybnMgdHJ1dGh5IG9yIGB0aW1lb3V0SW5NaWxsaXNlY29uZHNgXG4gICAqIGVsYXBzZXMsIGF0IHdoaWNoIHBvaW50IHRoZSByZXR1cm5lZCB7QGxpbmsgUHJvbWlzZX0gcmVqZWN0cyAodGhlIGVycm9yXG4gICAqIGluY2x1ZGVzIGBtZXNzYWdlYCB3aGVuIHByb3ZpZGVkKS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwcmVkaWNhdGUgdG8gcG9sbCBwbHVzIG9wdGlvbmFsIHRpbWVvdXQsIGludGVydmFsLCBhbmRcbiAgICogICB0aW1lb3V0IG1lc3NhZ2UuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgcHJlZGljYXRlIGlzIHRydXRoeS5cbiAgICovXG4gIHdhaXRVbnRpbCh0aGlzOiB2b2lkLCBwYXJhbXM6IFdhaXRVbnRpbFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy5tb3ZlTW91c2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vdmVNb3VzZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgeCBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgeSBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvLlxuICAgKi9cbiAgcmVhZG9ubHkgeTogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMucHJlc3NLZXl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXNzS2V5UGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBrZXkgdG8gcHJlc3MsIGdpdmVuIGFzIGFuIEVsZWN0cm9uIEFjY2VsZXJhdG9yIGtleSBuYW1lIFx1MjAxNCBlLmcuXG4gICAqIGAnRW50ZXInYCwgYCdFc2NhcGUnYCwgYCdUYWInYCwgYCdCYWNrc3BhY2UnYCwgYCdEZWxldGUnYCwgYW4gYXJyb3cga2V5XG4gICAqIChgJ1VwJ2AgLyBgJ0Rvd24nYCAvIGAnTGVmdCdgIC8gYCdSaWdodCdgKSwgb3IgYSBwcmludGFibGUgY2hhcmFjdGVyXG4gICAqIChgJ2EnYCwgYCcxJ2ApLiBUaGUgcHJvZHVjZWQgY2hhcmFjdGVyICh3aGVuIHRoZSBrZXkgaW5zZXJ0cyB0ZXh0KSBpcyB0aGVcbiAgICogbGl0ZXJhbCBga2V5YCB2YWx1ZTsgY2FzZS1jb3JyZWN0IHRleHQgYmVsb25ncyB0b1xuICAgKiB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnR5cGVJbnRvRWRpdG9yfSwgbm90IGEga2V5LXByZXNzIHByaW1pdGl2ZS5cbiAgICovXG4gIHJlYWRvbmx5IGtleTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgbW9kaWZpZXIga2V5cyB0byBob2xkIHdoaWxlIHRoZSBrZXkgaXMgcHJlc3NlZCwgdXNpbmcgT2JzaWRpYW4nc1xuICAgKiB7QGxpbmsgTW9kaWZpZXJ9IG5hbWVzICh0aGUgc2FtZSB2YWx1ZXMgYXMgYW4gT2JzaWRpYW4gYEhvdGtleWApLiBgJ01vZCdgXG4gICAqIHJlc29sdmVzIHBlci1wbGF0Zm9ybSAoQ21kIG9uIG1hY09TLCBDdHJsIGVsc2V3aGVyZSk7IGVhY2ggaXMgbWFwcGVkIHRvXG4gICAqIEVsZWN0cm9uJ3MgbG93ZXJjYXNlIGBzZW5kSW5wdXRFdmVudGAgbW9kaWZpZXIgbmFtZS5cbiAgICpcbiAgICogQGRlZmF1bHQgYFtdYFxuICAgKi9cbiAgcmVhZG9ubHkgbW9kaWZpZXJzPzogcmVhZG9ubHkgTW9kaWZpZXJbXTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnR5cGVJbnRvRWRpdG9yfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUeXBlSW50b0VkaXRvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWRpdG9yIHRvIHR5cGUgaW50by4gSXQgaXMgZm9jdXNlZCAod2l0aCB0aGUgY2FyZXQgbW92ZWQgdG8gdGhlIGVuZCBvZlxuICAgKiB0aGUgZG9jdW1lbnQpIGJlZm9yZSB0aGUga2V5c3Ryb2tlcyBhcmUgaW5qZWN0ZWQuXG4gICAqL1xuICByZWFkb25seSBlZGl0b3I6IEVkaXRvcjtcblxuICAvKipcbiAgICogVGhlIHRleHQgdG8gdHlwZS4gRWFjaCBjb2RlIHBvaW50IGlzIHByZXNzZWQgdmlhIHtAbGluayBDb21tb25Bcmd1bWVudHMucHJlc3NLZXl9XG4gICAqIChhIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGApLCBleGFjdGx5IGFzIGEgcmVhbCB1c2VyIHR5cGluZy5cbiAgICovXG4gIHJlYWRvbmx5IHRleHQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnVuaG92ZXJFbGVtZW50fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBVbmhvdmVyRWxlbWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0byBtb3ZlIHRoZSBwb2ludGVyIGF3YXkgZnJvbS4gVGhlIHBvaW50ZXIgaXMgbW92ZWQgdG8gYSBwb2ludFxuICAgKiBqdXN0IG91dHNpZGUgaXRzIGJvdW5kaW5nIGJveC4gVGhpcyBpcyBhIGxpdmUgcmVuZGVyZXIgRE9NIG5vZGUgXHUyMDE0IHRoZVxuICAgKiBjYWxsYmFjayBydW5zIGluLXJlbmRlcmVyLCBzbyBubyBjcm9zcy1wcm9jZXNzIHNlcmlhbGl6YXRpb24gaXMgbmVlZGVkXG4gICAqIChzYW1lIGFzIHtAbGluayBUeXBlSW50b0VkaXRvclBhcmFtcy5lZGl0b3J9KS5cbiAgICovXG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMud2FpdFVudGlsfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXYWl0VW50aWxQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHBvbGxpbmcgaW50ZXJ2YWwgYmV0d2VlbiBwcmVkaWNhdGUgY2hlY2tzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgNTBgXG4gICAqL1xuICByZWFkb25seSBpbnRlcnZhbEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBkZXRhaWwgYXBwZW5kZWQgdG8gdGhlIHRpbWVvdXQgZXJyb3IgbWVzc2FnZSwgZGVzY3JpYmluZyB3aGF0XG4gICAqIHdhcyBiZWluZyB3YWl0ZWQgZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbiB0byB3YWl0IGZvci4gUG9sbGVkIGltbWVkaWF0ZWx5LCB0aGVuIG9uIGV2ZXJ5IGludGVydmFsIHVudGlsXG4gICAqIGl0IHJldHVybnMgYSB0cnV0aHkgdmFsdWUuIE1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzXG4gICAqIGF3YWl0ZWQgb24gZWFjaCBwb2xsLlxuICAgKlxuICAgKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBhd2FpdGVkIGNvbmRpdGlvbiBoYXMgYmVlbiBtZXQuXG4gICAqL1xuICBwcmVkaWNhdGUodGhpczogdm9pZCk6IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSB0aW1lIHRvIHdhaXQgYmVmb3JlIHJlamVjdGluZy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwMDBgXG4gICAqL1xuICByZWFkb25seSB0aW1lb3V0SW5NaWxsaXNlY29uZHM/OiBudW1iZXI7XG59XG5cbi8qKlxuICogRXZhbHVhdGVzIGEgZnVuY3Rpb24gaW5zaWRlIHRoZSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlXG4gKiB2aWEgdGhlIGFjdGl2ZSB0cmFuc3BvcnQgYW5kIHJldHVybnMgdGhlIHBhcnNlZCByZXN1bHQuXG4gKlxuICogVGhlIGZ1bmN0aW9uIHJlY2VpdmVzIGFuIGlucHV0IG9iamVjdCB0aGF0IGluY2x1ZGVzIGBhcHBgLCBgb2JzaWRpYW5Nb2R1bGVgLFxuICogYGNvbnRleHRgLCBhbmQgYW55IGFkZGl0aW9uYWwgYGlucHV0YCBwYXNzZWQgYnkgdGhlIGNhbGxlci5cbiAqIEl0IGlzIHNlcmlhbGl6ZWQgdmlhIGB0b1N0cmluZygpYCBhbmQgaW52b2tlZCBhcyBhbiBJSUZFLlxuICogVGhlIGZ1bmN0aW9uIG11c3QgYmUgc2VsZi1jb250YWluZWQgXHUyMDE0IGNsb3N1cmVzIG92ZXIgbG9jYWwgdmFyaWFibGVzIHdpbGwgbm90IHdvcmsuXG4gKiBQYXNzIGFueSBuZWVkZWQgdmFsdWVzIGFzIGBpbnB1dGAgXHUyMDE0IHRoZXkgYXJlIEpTT04tc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIG9uIHRoZSBPYnNpZGlhbiBzaWRlLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYEpTT04uc3RyaW5naWZ5YCdkIG9uIHRoZSBPYnNpZGlhbiBzaWRlIGFuZCBwYXJzZWQgYmFjay5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBmdW5jdGlvbiB0byBldmFsdWF0ZS5cbiAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgY2FsbGJhY2tgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXZhbEluT2JzaWRpYW48SW5wdXQgZXh0ZW5kcyBHZW5lcmljT2JqZWN0LCBSZXN1bHQsIFRDb250ZXh0SWQgZXh0ZW5kcyBDb250ZXh0SWQ8dW5rbm93bj4gfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ+KFxuICBwYXJhbXM6IEV2YWxJbk9ic2lkaWFuUGFyYW1zPElucHV0LCBSZXN1bHQsIFRDb250ZXh0SWQ+XG4pOiBQcm9taXNlPFJlc3VsdD4ge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kIC0tIGBjYWxsYmFja2AgY2FuIGJlIHVuYm91bmQuXG4gIGNvbnN0IHsgY2FsbGJhY2ssIGNvbnRleHRJZCwgaW5wdXQgPSB7fSwgc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcyA9IGZhbHNlLCB0cmFuc3BvcnQ6IHRyYW5zcG9ydE92ZXJyaWRlLCB2YXVsdFBhdGggfSA9IHBhcmFtcztcbiAgY29uc3QgY3dkID0gdmF1bHRQYXRoID8/IGdldFZhdWx0UGF0aCgpID8/IHByb2Nlc3MuY3dkKCk7XG5cbiAgLy8gQ2hlY2s6IFZhdWx0IHBhdGggZXhpc3RzIG9uIGRpc2suXG4gIGlmICh2YXVsdFBhdGggIT09IHVuZGVmaW5lZCAmJiAhZXhpc3RzU3luYyh2YXVsdFBhdGgpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYXVsdCBwYXRoIGRvZXMgbm90IGV4aXN0OiAke3ZhdWx0UGF0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zcG9ydCA9IHRyYW5zcG9ydE92ZXJyaWRlID8/IGF3YWl0IGdldE9yQ3JlYXRlVHJhbnNwb3J0KGdldFRyYW5zcG9ydE9wdGlvbnMoKSk7XG5cbiAgaWYgKCFzaG91bGRTa2lwUHJlZmxpZ2h0Q2hlY2tzKSB7XG4gICAgYXdhaXQgdHJhbnNwb3J0LnByZWZsaWdodENoZWNrKGN3ZCk7XG4gIH1cblxuICBhd2FpdCBlbnN1cmVOYW1lc3BhY2VCb290c3RyYXBwZWQodHJhbnNwb3J0LCBjd2QpO1xuXG4gIGNvbnN0IG5hbWVzcGFjZUNhbGxQYXJhbXM6IEdlbmVyYXRlTmFtZXNwYWNlQ2FsbFBhcmFtcyA9IHtcbiAgICBjYWxsYmFjayxcbiAgICBpbnB1dCxcbiAgICAuLi4oY29udGV4dElkICE9PSB1bmRlZmluZWQgJiYgeyBjb250ZXh0SWQ6IFN0cmluZyhjb250ZXh0SWQpIH0pXG4gIH07XG5cbiAgY29uc3QgZXhwcmVzc2lvbiA9IGdlbmVyYXRlTmFtZXNwYWNlQ2FsbChuYW1lc3BhY2VDYWxsUGFyYW1zKTtcblxuICBjb25zdCByZXN1bHRTdHJpbmcgPSBhd2FpdCB0cmFuc3BvcnQuZXZhbHVhdGUoZXhwcmVzc2lvbiwgeyBjd2QgfSk7XG5cbiAgaWYgKHJlc3VsdFN0cmluZyA9PT0gJycgfHwgcmVzdWx0U3RyaW5nID09PSBOT19PVVRQVVQpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFJlc3VsdDtcbiAgfVxuXG4gIGxldCBlbnZlbG9wZTogRXZhbFJlc3VsdEVudmVsb3BlO1xuICB0cnkge1xuICAgIGVudmVsb3BlID0gSlNPTi5wYXJzZShyZXN1bHRTdHJpbmcpIGFzIEV2YWxSZXN1bHRFbnZlbG9wZTtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBldmFsSW5PYnNpZGlhbjogT2JzaWRpYW4gcmV0dXJuZWQgbm9uLUpTT04gb3V0cHV0OiAke3Jlc3VsdFN0cmluZ31gKTtcbiAgfVxuXG4gIGlmICgndHlwZScgaW4gZW52ZWxvcGUpIHtcbiAgICBpZiAoZW52ZWxvcGUudHlwZSA9PT0gJ2Vycm9yJykge1xuICAgICAgLy8gUmV3cml0ZSBiYXJlLW9yaWdpbiBsb2NhbGhvc3Qgc3RhY2sgZnJhbWVzIGxpa2UgXCIoaHR0cDovL2xvY2FsaG9zdC86OTE1OjMyKVwiXG4gICAgICAvLyBTbyBWaXRlc3QncyBzb3VyY2UtbWFwIHJlc29sdmVyIHdvbid0IGV4dHJhY3QgXCIvXCIgYXMgdGhlIGZpbGUgcGF0aCBhbmQgY3Jhc2hcbiAgICAgIC8vIFdpdGggRUlTRElSIHdoZW4gaXQgdHJpZXMgdG8gcmVhZEZpbGVTeW5jIG9uIHRoZSByb290IGRpcmVjdG9yeS5cbiAgICAgIGNvbnN0IHNhbml0aXplZERldGFpbCA9IGVudmVsb3BlLnZhbHVlXG4gICAgICAgIC5yZXBsYWNlQWxsKC9cXChodHRwcz86XFwvXFwvbG9jYWxob3N0XFwvOig/PGxpbmU+XFxkKS9nLCAnKG9ic2lkaWFuLXdlYnZpZXc6JDxsaW5lPicpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBldmFsSW5PYnNpZGlhbjogRXJyb3IgaW5zaWRlIE9ic2lkaWFuOlxcbiR7c2FuaXRpemVkRGV0YWlsfWApO1xuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWQgYXMgUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIGVudmVsb3BlLnZhbHVlIGFzIFJlc3VsdDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBZ0JBLHFCQUEyQjtBQUMzQiwwQkFBb0I7QUFTcEIsOEJBR087QUFDUCxvQ0FBc0M7QUFDdEMsaUNBQTRDO0FBQzVDLCtCQUFxQztBQTJCckMsTUFBTSxZQUFZO0FBNlpsQixlQUFzQixlQUNwQixRQUNpQjtBQUVqQixRQUFNLEVBQUUsVUFBVSxXQUFXLFFBQVEsQ0FBQyxHQUFHLDRCQUE0QixPQUFPLFdBQVcsbUJBQW1CLFVBQVUsSUFBSTtBQUN4SCxRQUFNLE1BQU0saUJBQWEsc0NBQWEsS0FBSyxvQkFBQUEsUUFBUSxJQUFJO0FBR3ZELE1BQUksY0FBYyxVQUFhLEtBQUMsMkJBQVcsU0FBUyxHQUFHO0FBQ3JELFVBQU0sSUFBSSxNQUFNLDhCQUE4QixTQUFTLEVBQUU7QUFBQSxFQUMzRDtBQUVBLFFBQU0sWUFBWSxxQkFBcUIsVUFBTSxtREFBcUIsNkNBQW9CLENBQUM7QUFFdkYsTUFBSSxDQUFDLDJCQUEyQjtBQUM5QixVQUFNLFVBQVUsZUFBZSxHQUFHO0FBQUEsRUFDcEM7QUFFQSxZQUFNLHdEQUE0QixXQUFXLEdBQUc7QUFFaEQsUUFBTSxzQkFBbUQ7QUFBQSxJQUN2RDtBQUFBLElBQ0E7QUFBQSxJQUNBLEdBQUksY0FBYyxVQUFhLEVBQUUsV0FBVyxPQUFPLFNBQVMsRUFBRTtBQUFBLEVBQ2hFO0FBRUEsUUFBTSxpQkFBYSxxREFBc0IsbUJBQW1CO0FBRTVELFFBQU0sZUFBZSxNQUFNLFVBQVUsU0FBUyxZQUFZLEVBQUUsSUFBSSxDQUFDO0FBRWpFLE1BQUksaUJBQWlCLE1BQU0saUJBQWlCLFdBQVc7QUFDckQsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJO0FBQ0osTUFBSTtBQUNGLGVBQVcsS0FBSyxNQUFNLFlBQVk7QUFBQSxFQUNwQyxRQUFRO0FBQ04sVUFBTSxJQUFJLE1BQU0sc0RBQXNELFlBQVksRUFBRTtBQUFBLEVBQ3RGO0FBRUEsTUFBSSxVQUFVLFVBQVU7QUFDdEIsUUFBSSxTQUFTLFNBQVMsU0FBUztBQUk3QixZQUFNLGtCQUFrQixTQUFTLE1BQzlCLFdBQVcseUNBQXlDLDJCQUEyQjtBQUNsRixZQUFNLElBQUksTUFBTTtBQUFBLEVBQTJDLGVBQWUsRUFBRTtBQUFBLElBQzlFO0FBRUEsV0FBTztBQUFBLEVBQ1Q7QUFFQSxTQUFPLFNBQVM7QUFDbEI7IiwKICAibmFtZXMiOiBbInByb2Nlc3MiXQp9Cg==
82
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2V2YWwtaW4tb2JzaWRpYW4udHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBFdmFsdWF0ZXMgYSBmdW5jdGlvbiBpbnNpZGUgYSBydW5uaW5nIE9ic2lkaWFuIGluc3RhbmNlIHZpYSBhIHBsdWdnYWJsZSB0cmFuc3BvcnQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBBcHAsXG4gIEVkaXRvcixcbiAgTW9kaWZpZXIsXG4gIFRGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQteC9uby1uYW1lc3BhY2UgLS0gV2UgbmVlZCB0byByZWZlcmVuY2UgYG9ic2lkaWFuYCBtb2R1bGUuXG5pbXBvcnQgdHlwZSAqIGFzIG9ic2lkaWFuIGZyb20gJ29ic2lkaWFuJztcbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCBwcm9jZXNzIGZyb20gJ25vZGU6cHJvY2Vzcyc7XG5cbmltcG9ydCB0eXBlIHtcbiAgQ29udGV4dEFyZ3VtZW50cyxcbiAgQ29udGV4dElkXG59IGZyb20gJy4vY29udGV4dC1pZC5janMnO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0ZU5hbWVzcGFjZUNhbGxQYXJhbXMgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB0eXBlIHsgT2JzaWRpYW5UcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC5janMnO1xuXG5pbXBvcnQge1xuICBnZXRUcmFuc3BvcnRPcHRpb25zLFxuICBnZXRWYXVsdFBhdGhcbn0gZnJvbSAnLi9jb250ZXh0LXByb3ZpZGVyLmNqcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwgfSBmcm9tICcuL2dlbmVyYXRlLWZ1bmN0aW9uLWNhbGwuY2pzJztcbmltcG9ydCB7IGVuc3VyZU5hbWVzcGFjZUJvb3RzdHJhcHBlZCB9IGZyb20gJy4vbmFtZXNwYWNlLWJvb3RzdHJhcC5janMnO1xuaW1wb3J0IHsgZ2V0T3JDcmVhdGVUcmFuc3BvcnQgfSBmcm9tICcuL3RyYW5zcG9ydC1mYWN0b3J5LmNqcyc7XG5cbmludGVyZmFjZSBFdmFsRXJyb3JFbnZlbG9wZSB7XG4gIHR5cGU6ICdlcnJvcic7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGlzY3JpbWluYXRlZCBlbnZlbG9wZSByZXR1cm5lZCBieSB0aGUgcmVnaXN0ZXJlZCBgZXZhbFdyYXBwZXJgIGZyb20gaW5zaWRlIHRoZSBPYnNpZGlhbiBwcm9jZXNzLlxuICpcbiAqIC0gYEV2YWxFcnJvckVudmVsb3BlYCBcdTIwMTQgYGNhbGxiYWNrYCB0aHJldzsgYHZhbHVlYCBpcyB0aGUgc2VyaWFsaXplZCBlcnJvci5cbiAqIC0gYEV2YWxVbmRlZmluZWRFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYHVuZGVmaW5lZGAuXG4gKiAtIGBFdmFsVmFsdWVFbnZlbG9wZWAgXHUyMDE0IGBjYWxsYmFja2AgcmV0dXJuZWQgYSBKU09OLXNlcmlhbGl6YWJsZSB2YWx1ZS5cbiAqL1xudHlwZSBFdmFsUmVzdWx0RW52ZWxvcGUgPVxuICB8IEV2YWxFcnJvckVudmVsb3BlXG4gIHwgRXZhbFVuZGVmaW5lZEVudmVsb3BlXG4gIHwgRXZhbFZhbHVlRW52ZWxvcGU7XG5cbmludGVyZmFjZSBFdmFsVW5kZWZpbmVkRW52ZWxvcGUge1xuICB0eXBlOiAndW5kZWZpbmVkJztcbn1cblxuaW50ZXJmYWNlIEV2YWxWYWx1ZUVudmVsb3BlIHtcbiAgdmFsdWU6IHVua25vd247XG59XG5cbmNvbnN0IE5PX09VVFBVVCA9ICcobm8gb3V0cHV0KSc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy5jbGlja0VsZW1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENsaWNrRWxlbWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbW91c2UgYnV0dG9uIHRvIHByZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xlZnQnYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uPzogTW91c2VCdXR0b247XG5cbiAgLyoqXG4gICAqIFRoZSBlbGVtZW50IHRvIGNsaWNrLiBUaGUgcG9pbnRlciBpcyBtb3ZlZCB0byBpdHMgY2VudGVyLiBUaGlzIGlzIGEgbGl2ZVxuICAgKiByZW5kZXJlciBET00gbm9kZSBcdTIwMTQgdGhlIGNhbGxiYWNrIHJ1bnMgaW4tcmVuZGVyZXIsIHNvIG5vIGNyb3NzLXByb2Nlc3NcbiAgICogc2VyaWFsaXphdGlvbiBpcyBuZWVkZWQgKHNhbWUgYXMge0BsaW5rIFR5cGVJbnRvRWRpdG9yUGFyYW1zLmVkaXRvcn0pLlxuICAgKi9cbiAgcmVhZG9ubHkgZWxlbWVudDogSFRNTEVsZW1lbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RpZmllciBrZXlzIHRvIGhvbGQsIHVzaW5nIE9ic2lkaWFuJ3Mge0BsaW5rIE1vZGlmaWVyfSBuYW1lcy4gYCdNb2QnYFxuICAgKiByZXNvbHZlcyBwZXItcGxhdGZvcm0gKENtZCBvbiBtYWNPUywgQ3RybCBlbHNld2hlcmUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM/OiByZWFkb25seSBNb2RpZmllcltdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMuY2xpY2tNb3VzZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xpY2tNb3VzZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbW91c2UgYnV0dG9uIHRvIHByZXNzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgJ2xlZnQnYFxuICAgKi9cbiAgcmVhZG9ubHkgYnV0dG9uPzogTW91c2VCdXR0b247XG5cbiAgLyoqXG4gICAqIFRoZSBtb2RpZmllciBrZXlzIHRvIGhvbGQsIHVzaW5nIE9ic2lkaWFuJ3Mge0BsaW5rIE1vZGlmaWVyfSBuYW1lcy4gYCdNb2QnYFxuICAgKiByZXNvbHZlcyBwZXItcGxhdGZvcm0gKENtZCBvbiBtYWNPUywgQ3RybCBlbHNld2hlcmUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBgW11gXG4gICAqL1xuICByZWFkb25seSBtb2RpZmllcnM/OiByZWFkb25seSBNb2RpZmllcltdO1xuXG4gIC8qKlxuICAgKiBUaGUgeCBjb29yZGluYXRlICh3ZWItY29udGVudHMgRElQKSB0byBjbGljayBhdC5cbiAgICovXG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHkgY29vcmRpbmF0ZSAod2ViLWNvbnRlbnRzIERJUCkgdG8gY2xpY2sgYXQuXG4gICAqL1xuICByZWFkb25seSB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQ29tbW9uIGFyZ3VtZW50cyBhdXRvbWF0aWNhbGx5IHByb3ZpZGVkIHRvIGV2ZXJ5IHtAbGluayBldmFsSW5PYnNpZGlhbn0gY2FsbGJhY2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbW9uQXJndW1lbnRzIHtcbiAgLyoqXG4gICAqIFRoZSBPYnNpZGlhbiB7QGxpbmsgQXBwfSBpbnN0YW5jZS5cbiAgICovXG4gIGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgc2hhcmVkIGxpYnJhcnkgYmFnIGluamVjdGVkIGludG8gZXZlcnkgY2FsbGJhY2sgXHUyMDE0IHNlZSB7QGxpbmsgTGlifS5cbiAgICpcbiAgICogTmV2ZXIgZW1wdHk6IHRoZSBoYXJuZXNzIHByZS1wb3B1bGF0ZXMgYSAqKmJhc2UqKiBzZXQgb2YgcmVuZGVyZXItZHJpdmluZ1xuICAgKiBoZWxwZXJzICh0cnVzdGVkIGlucHV0IFx1MjAxNCBgdHlwZUludG9FZGl0b3JgIC8gYHByZXNzS2V5YCAvIGBtb3ZlTW91c2VgIC9cbiAgICogYGNsaWNrTW91c2VgIC8gYGhvdmVyRWxlbWVudGAgLyBgdW5ob3ZlckVsZW1lbnRgIC8gYGNsaWNrRWxlbWVudGAgXHUyMDE0IGFuZFxuICAgKiBgd2FpdFVudGlsYCksIGFuZCBwcm92aWRlciBwYWNrYWdlc1xuICAgKiAoY2hpZWZseSBgb2JzaWRpYW4tZGV2LXV0aWxzYCkgYE9iamVjdC5hc3NpZ25gIHRoZWlyIHdob2xlIHJlbmRlcmVyLXNhZmVcbiAgICogbGlicmFyeSBvbiB0b3AgdmlhIHtAbGluayByZWdpc3RlckxpYlJlc29sdmVyfS4gQSBzZXJpYWxpemVkIGNsb3N1cmUgcmVhY2hlc1xuICAgKiBldmVyeSBzaGFyZWQgaGVscGVyIHRocm91Z2ggYGxpYmAgXHUyMDE0IGBsaWIudHlwZUludG9FZGl0b3IoeyBlZGl0b3IsIHRleHQgfSlgLFxuICAgKiBgbGliLmdldEZpbGVPck51bGwoeyBhcHAsIFx1MjAyNiB9KWAgXHUyMDE0IGluc3RlYWQgb2YgaW1wb3J0aW5nIG9yIGhhbmQtcm9sbGluZyB0aGVtLlxuICAgKi9cbiAgbGliOiBMaWI7XG5cbiAgLyoqXG4gICAqIFRoZSBgb2JzaWRpYW5gIG1vZHVsZSwgcmVzb2x2ZWQgYXQgcnVudGltZSBpbnNpZGUgdGhlIE9ic2lkaWFuIHByb2Nlc3MuXG4gICAqL1xuICBvYnNpZGlhbk1vZHVsZTogdHlwZW9mIG9ic2lkaWFuO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMuY3JlYXRlTm90ZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlTm90ZVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgbm90ZSdzIGNvbnRlbnQuIFRoaXMgZXhhY3Qgc3RyaW5nIGlzIHdoYXQgdGhlIGNyZWF0ZWQgbm90ZSBpcyByZWFkIGJhY2tcbiAgICogYWdhaW5zdCwgc28gaXQgaXMgdGhlIGRlZmluaXRpb24gb2YgYSBzdWNjZXNzZnVsIHdyaXRlLlxuICAgKi9cbiAgcmVhZG9ubHkgY29udGVudDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmF1bHQtcmVsYXRpdmUgcGF0aCB0byBjcmVhdGUsIGV4dGVuc2lvbiBpbmNsdWRlZC5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZXZhbEluT2JzaWRpYW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEV2YWxJbk9ic2lkaWFuUGFyYW1zPElucHV0IGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPiB7XG4gIC8qKlxuICAgKiBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgaW4gdGhlIE9ic2lkaWFuIGNvbnRleHQuXG4gICAqL1xuICBjYWxsYmFjayhpbnB1dDogQ29tbW9uQXJndW1lbnRzICYgQ29udGV4dEFyZ3VtZW50czxUQ29udGV4dElkPiAmIElucHV0KTogUHJvbWlzYWJsZTxSZXN1bHQ+O1xuXG4gIC8qKlxuICAgKiBBIHtAbGluayBDb250ZXh0SWR9IGxpbmtpbmcgdGhpcyBjYWxsIHRvIGEgcGVyc2lzdGVudCBzdG9yZSBvbiBgd2luZG93YFxuICAgKiBpbiB0aGUgT2JzaWRpYW4gcHJvY2Vzcy4gVGhlIGNhbGxiYWNrIHJlY2VpdmVzIGEgdHlwZWQgYGNvbnRleHRgIG9iamVjdFxuICAgKiB0aGF0IHN1cnZpdmVzIGFjcm9zcyBjYWxscyBzaGFyaW5nIHRoZSBzYW1lIElELlxuICAgKlxuICAgKiBXaGVuIG9taXR0ZWQsIGBjb250ZXh0YCBpcyBhIGZyZXNoIGVtcHR5IG9iamVjdCBlYWNoIGNhbGwuXG4gICAqL1xuICByZWFkb25seSBjb250ZXh0SWQ/OiBUQ29udGV4dElkO1xuXG4gIC8qKlxuICAgKiBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBmdW5jdGlvbi4gVmFsdWVzIG1heSBpbmNsdWRlIGZ1bmN0aW9ucyBcdTIwMTRcbiAgICogdGhleSBhcmUgc2VyaWFsaXplZCB2aWEgYHRvU3RyaW5nKClgLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5wdXQ/OiBJbnB1dDtcblxuICAvKipcbiAgICogU2tpcHMgcHJlLWZsaWdodCBjaGVja3MgKHZhdWx0IHJlZ2lzdHJhdGlvbiwgQ0xJIGF2YWlsYWJpbGl0eSkuXG4gICAqIFVzZWQgaW50ZXJuYWxseSBieSB2YXVsdCByZWdpc3RyYXRpb24gZnVuY3Rpb25zLlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3M/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgdHJhbnNwb3J0IGZvciB0aGlzIGNhbGwuIFdoZW4gb21pdHRlZCwgdXNlcyB0aGUgdHJhbnNwb3J0XG4gICAqIGNvbmZpZ3VyZWQgdmlhIHRoZSBjb250ZXh0IHByb3ZpZGVyIChzZXQgYnkgdGhlIGZyYW1ld29yayBhZGFwdGVyJ3MgZ2xvYmFsIHNldHVwKS5cbiAgICovXG4gIHJlYWRvbmx5IHRyYW5zcG9ydD86IE9ic2lkaWFuVHJhbnNwb3J0O1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCB0byB0aGUgT2JzaWRpYW4gdmF1bHQuIERlZmF1bHRzIHRvIGBwcm9jZXNzLmN3ZCgpYC5cbiAgICovXG4gIHJlYWRvbmx5IHZhdWx0UGF0aD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIHBsYWluIG9iamVjdCB3aXRoIHN0cmluZyBrZXlzLlxuICovXG5leHBvcnQgdHlwZSBHZW5lcmljT2JqZWN0ID0gUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy5ob3ZlckVsZW1lbnR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvdmVyRWxlbWVudFBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgZWxlbWVudCB0byBob3Zlci4gVGhlIHBvaW50ZXIgaXMgbW92ZWQgdG8gaXRzIGNlbnRlci4gVGhpcyBpcyBhIGxpdmVcbiAgICogcmVuZGVyZXIgRE9NIG5vZGUgXHUyMDE0IHRoZSBjYWxsYmFjayBydW5zIGluLXJlbmRlcmVyLCBzbyBubyBjcm9zcy1wcm9jZXNzXG4gICAqIHNlcmlhbGl6YXRpb24gaXMgbmVlZGVkIChzYW1lIGFzIHtAbGluayBUeXBlSW50b0VkaXRvclBhcmFtcy5lZGl0b3J9KS5cbiAgICovXG4gIHJlYWRvbmx5IGVsZW1lbnQ6IEhUTUxFbGVtZW50O1xufVxuXG4vKipcbiAqIFRoZSBzaGFyZWQgbGlicmFyeSBiYWcgaW5qZWN0ZWQgaW50byBldmVyeSB7QGxpbmsgZXZhbEluT2JzaWRpYW59IGNhbGxiYWNrIGFzXG4gKiB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLmxpYn0uXG4gKlxuICogVHdvIGxheWVycyBjb21wb3NlIGludG8gdGhpcyBvbmUgYmFnLiBUaGUgKipiYXNlKiogXHUyMDE0IHRoZSBoYXJuZXNzLXByb3ZpZGVkXG4gKiByZW5kZXJlci1kcml2aW5nIGhlbHBlcnMgZGVjbGFyZWQgYmVsb3cgKHRoZSB0cnVzdGVkLWlucHV0IHByaW1pdGl2ZXMgYW5kXG4gKiB7QGxpbmsgTGliLndhaXRVbnRpbH0pIFx1MjAxNCBpcyBhbHdheXMgcHJlc2VudC4gT24gdG9wLCBwcm92aWRlciBwYWNrYWdlcyByZWdpc3RlclxuICogYSByZW5kZXJlci1zaWRlIHJlc29sdmVyIHZpYSB7QGxpbmsgcmVnaXN0ZXJMaWJSZXNvbHZlcn0gdG8gYE9iamVjdC5hc3NpZ25gXG4gKiB0aGVpciB3aG9sZSByZW5kZXJlci1zYWZlIGxpYnJhcnkgYXQgcnVudGltZSwgYW5kIGF1Z21lbnQgdGhpcyAqKmF1Z21lbnRhYmxlKipcbiAqIGludGVyZmFjZSAodGhlIGBpMThuZXh0YCBgQ3VzdG9tVHlwZU9wdGlvbnNgIGlkaW9tKSB2aWFcbiAqIGBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZydgIHRvIHR5cGUgaXQuIE11bHRpcGxlIHByb3ZpZGVyc1xuICogY29tcG9zZTogdGhlaXIgZXhwb3J0cyBtZXJnZSBhdCBydW50aW1lIGFuZCB0aGVpciBhdWdtZW50YXRpb25zIG1lcmdlIGluIHRoZVxuICogdHlwZSBzeXN0ZW0gKGBpbnRlcmZhY2UgTGliIGV4dGVuZHMgXHUyMDI2YCkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBkZWNsYXJlIG1vZHVsZSAnb2JzaWRpYW4taW50ZWdyYXRpb24tdGVzdGluZycge1xuICogICBpbnRlcmZhY2UgTGliIGV4dGVuZHMgKHR5cGVvZiBpbXBvcnQoJ29ic2lkaWFuLWRldi11dGlscy9fX21lcmdlZCcpKSB7fVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTGliIHtcbiAgLyoqXG4gICAqIENsaWNrcyB0aGUgY2VudGVyIG9mIGFuIGVsZW1lbnQgdXNpbmcgKip0cnVzdGVkKiogRWxlY3Ryb24gcG9pbnRlciBpbnB1dC5cbiAgICpcbiAgICogVGhlIGVsZW1lbnQtcmVsYXRpdmUgY291bnRlcnBhcnQgb2Yge0BsaW5rIExpYi5jbGlja01vdXNlfSwgbWlycm9yaW5nIHRoZVxuICAgKiB7QGxpbmsgTGliLm1vdmVNb3VzZX0gLyB7QGxpbmsgTGliLmhvdmVyRWxlbWVudH0gc3BsaXQuIFVzZVxuICAgKiB7QGxpbmsgTGliLmNsaWNrTW91c2V9IGRpcmVjdGx5IHdoZW4gdGhlIHBvaW50IHRvIGNsaWNrIGlzICoqbm90KiogdGhlXG4gICAqIGVsZW1lbnQncyBjZW50ZXIgXHUyMDE0IHRoZSBtYXJrZG93biBlZGl0b3IncyBtYXJnaW4sIGZvciBpbnN0YW5jZSwgbGllcyBpbnNpZGVcbiAgICogYGNtLnNjcm9sbERPTWAgYnV0IG91dHNpZGUgYC5jbS1zaXplcmAsIHNvIG5vIGVsZW1lbnQncyBjZW50ZXIgbGFuZHMgb24gaXQuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQgY2xpY2sgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBlbGVtZW50IHRvIGNsaWNrLCB0aGUgYnV0dG9uIHRvIHByZXNzIGFuZCBhbnkgbW9kaWZpZXJzXG4gICAqICAgdG8gaG9sZC5cbiAgICovXG4gIGNsaWNrRWxlbWVudCh0aGlzOiB2b2lkLCBwYXJhbXM6IENsaWNrRWxlbWVudFBhcmFtcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENsaWNrcyBhdCB0aGUgZ2l2ZW4gd2ViLWNvbnRlbnRzIGNvb3JkaW5hdGVzIHVzaW5nICoqdHJ1c3RlZCoqIEVsZWN0cm9uXG4gICAqIHBvaW50ZXIgaW5wdXQsIHNvIENocm9taXVtIHN5bnRoZXNpemVzIGEgcmVhbCBgY2xpY2tgIChvciBgY29udGV4dG1lbnVgLFxuICAgKiBmb3IgdGhlIHJpZ2h0IGJ1dHRvbikgd2l0aCBgaXNUcnVzdGVkID09PSB0cnVlYC5cbiAgICpcbiAgICogVGhpcyBpcyB3aGF0IGBlbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ2NsaWNrJykpYCBjYW5ub3QgZG86XG4gICAqIE9ic2lkaWFuIGFuZCBDb2RlTWlycm9yIGdhdGUgb24gYGlzVHJ1c3RlZGAsIHNvIGEgZGlzcGF0Y2hlZCBldmVudCBzaWxlbnRseVxuICAgKiBleGVyY2lzZXMgbm90aGluZyB3aGlsZSB0aGUgdGVzdCBzdGlsbCBwYXNzZXMgd2hhdGV2ZXIgd2Vha2VyIGFzc2VydGlvbiBpdFxuICAgKiBtYWtlcy4gT2JzaWRpYW4gMS4xMy43J3MgbWFya2Rvd24gdmlld3BvcnQgKG1hcmdpbikgbWVudSwgZm9yIGV4YW1wbGUsXG4gICAqIG9wZW5zIGZyb20gYSBgY20uc2Nyb2xsRE9NYCBgY29udGV4dG1lbnVgIGxpc3RlbmVyIGd1YXJkZWQgYnlcbiAgICogYGUuaXNUcnVzdGVkYCwgd2hpY2ggYSBkaXNwYXRjaGVkIGV2ZW50IG5ldmVyIGdldHMgcGFzdC5cbiAgICpcbiAgICogSXQgaXMgdGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IGEgc2luZ2xlIHRydXN0ZWQgYG1vdXNlTW92ZWAgXHUyMTkyIGBtb3VzZURvd25gIFx1MjE5MlxuICAgKiBgbW91c2VVcGAgYXQgb25lIHBvaW50LCB3aXRoIG5vIHdhaXRpbmcgZm9yIGFueSBlZmZlY3QgKGNhbGxlcnMgcG9sbCB0aGVpclxuICAgKiBvd24gcmVhZGluZXNzIHNpZ25hbCkuIFRoZSBsZWFkaW5nIG1vdmUgaXMgd2hhdCBwdXRzIHRoZSBwb2ludGVyIG92ZXIgdGhlXG4gICAqIGhpdC10ZXN0IHRhcmdldCBiZWZvcmUgdGhlIGJ1dHRvbiBnb2VzIGRvd24uIFByZWZlclxuICAgKiB7QGxpbmsgTGliLmNsaWNrRWxlbWVudH0gZm9yIGVsZW1lbnQtcmVsYXRpdmUgY2xpY2tzLlxuICAgKlxuICAgKiBBIHJlYWwgY29udGV4dCBtZW51IGFjdHVhbGx5IG9wZW5zLCBzbyBhIHN1aXRlIGRyaXZpbmcgYSByaWdodCBjbGljayBtdXN0XG4gICAqIGNsb3NlIGl0IChvciByZW1vdmUgdGhlIGxlZnRvdmVyIGAubWVudWAgZWxlbWVudCkgYmVmb3JlIHRoZSBuZXh0IHRlc3QuXG4gICAqXG4gICAqIFN5bmNocm9ub3VzOiBpbmplY3RpbmcgdGhlIHRydXN0ZWQgY2xpY2sgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSB3ZWItY29udGVudHMgRElQIGNvb3JkaW5hdGVzIHRvIGNsaWNrIGF0LCB0aGUgYnV0dG9uIHRvXG4gICAqICAgcHJlc3MgYW5kIGFueSBtb2RpZmllcnMgdG8gaG9sZC5cbiAgICovXG4gIGNsaWNrTW91c2UodGhpczogdm9pZCwgcGFyYW1zOiBDbGlja01vdXNlUGFyYW1zKTogdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5vdGUgYW5kIGRvZXMgbm90IHJldHVybiB1bnRpbCBpdHMgY29udGVudCBpcyB2ZXJpZmlhYmx5IG9uXG4gICAqIGRpc2ssIHJld3JpdGluZyBpdCBpZiBpdCBpcyBub3QuXG4gICAqXG4gICAqIFVzZSB0aGlzIGluc3RlYWQgb2YgYGFwcC52YXVsdC5jcmVhdGVgIGluIGFueSBzdWl0ZSB0aGF0IG1heSBydW4gb25cbiAgICogQW5kcm9pZC4gVGhlIGVtdWxhdG9yIHRyYW5zcG9ydCBsb3NlcyByb3VnaGx5ICoqMC45ICUqKiBvZiBgdmF1bHQuY3JlYXRlYFxuICAgKiB3cml0ZXMgKG1lYXN1cmVkOiA3IGxvc3QgaW4gODAwIGNyZWF0ZXMpOiB0aGUgZmlsZSBsYW5kcyAqKjAgYnl0ZXMqKiBvblxuICAgKiBkaXNrIHdoaWxlIE9ic2lkaWFuJ3MgaW4tbWVtb3J5IGBURmlsZS5zdGF0YCByZXBvcnRzIHRoZSBmdWxsIGJ5dGUgY291bnQsXG4gICAqIGFuZCBpdCBkb2VzIG5vdCBoZWFsIG9uIGl0cyBvd24uIEEgc3VpdGUgZG9pbmcgfjM0IGNyZWF0ZXMgcGVyIHJ1blxuICAgKiB0aGVyZWZvcmUgaGFzIGEgfjI2ICUgY2hhbmNlIG9mIGF0IGxlYXN0IG9uZSBsb3N0IHdyaXRlLCBhbmQgd2hpY2hldmVyIHRlc3RcbiAgICogbG9zZXMgdGhhdCBsb3R0ZXJ5IGZhaWxzIG9uIGEgYHdhaXRVbnRpbGAgZm9yIGNvbnRlbnQgdGhhdCB3YXMgbmV2ZXJcbiAgICogd3JpdHRlbiBcdTIwMTQgd2hpY2ggaXMgd2h5IGl0IHJlYWRzIGFzIGFuIHVucmVsYXRlZCBwZXItdGVzdCBmbGFrZSByYXRoZXIgdGhhblxuICAgKiBvbmUgc2hhcmVkIGNhdXNlLlxuICAgKlxuICAgKiBWZXJpZmljYXRpb24gaXMgYnkgKipyZWFkaW5nIHRoZSBub3RlIGJhY2sqKiwgbmV2ZXIgYnkgaW5zcGVjdGluZ1xuICAgKiBgVEZpbGUuc3RhdGA6IGBzdGF0YCBpcyBleGFjdGx5IHRoZSBmaWVsZCB0aGF0IGxpZXMgaGVyZS4gQSByZXdyaXRlIHRocm91Z2hcbiAgICogYHZhdWx0Lm1vZGlmeWAgd2l0aCB0aGUgc2FtZSBjb250ZW50IGxhbmRzIGNvcnJlY3RseSAoYWxzbyBtZWFzdXJlZCksIHNvIGFcbiAgICogbG9zdCB3cml0ZSBjb3N0cyBhIHJldHJ5IHJhdGhlciB0aGFuIGEgZmFpbHVyZS4gQSBub3RlIHdob3NlIGNvbnRlbnQgc3RpbGxcbiAgICogZG9lcyBub3QgbWF0Y2ggYWZ0ZXIgdGhlIGJvdW5kZWQgcmV0cmllcyB0aHJvd3MsIG5hbWluZyB0aGUgcGF0aCBhbmQgYm90aFxuICAgKiBsZW5ndGhzLCBzbyBhIGdlbnVpbmVseSBicm9rZW4gd3JpdGUgZmFpbHMgbG91ZGx5IGluc3RlYWQgb2Ygc3Bpbm5pbmcuXG4gICAqXG4gICAqIEhhcm1sZXNzIGV2ZXJ5d2hlcmUgZWxzZSBcdTIwMTQgb24gYSB0cmFuc3BvcnQgdGhhdCBkb2VzIG5vdCBsb3NlIHdyaXRlcyB0aGVcbiAgICogcmVhZC1iYWNrIG1hdGNoZXMgZmlyc3QgdGltZSBhbmQgbm90aGluZyBpcyByZXdyaXR0ZW4uXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgbm90ZSBwYXRoIGFuZCBjb250ZW50LlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSByZXNvbHZpbmcgdG8gdGhlIGNyZWF0ZWQgZmlsZSwgb25jZSBpdHMgY29udGVudFxuICAgKiAgIGlzIGNvbmZpcm1lZC5cbiAgICovXG4gIGNyZWF0ZU5vdGUodGhpczogdm9pZCwgcGFyYW1zOiBDcmVhdGVOb3RlUGFyYW1zKTogUHJvbWlzZTxURmlsZT47XG5cbiAgLyoqXG4gICAqIE1vdmVzIHRoZSBtb3VzZSBwb2ludGVyIHRvIHRoZSBjZW50ZXIgb2YgYW4gZWxlbWVudCB1c2luZyAqKnRydXN0ZWQqKlxuICAgKiBFbGVjdHJvbiBwb2ludGVyIGlucHV0LCB0aGVuIHBvbGxzIHVudGlsIHRoZSBlbGVtZW50IGFjdHVhbGx5IG1hdGNoZXNcbiAgICogYDpob3ZlcmAuXG4gICAqXG4gICAqIEJlY2F1c2UgdGhlIG1vdmUgaXMgdHJ1c3RlZCAoc2VlIHtAbGluayBMaWIubW92ZU1vdXNlfSksIHRoZSByZWFsIGA6aG92ZXJgXG4gICAqIHN0YXRlIHRha2VzIGVmZmVjdCBpbiB0aGUgQ1NTIGVuZ2luZSBcdTIwMTQgcmVhbCB0aGVtZSBgdmFyKClgIHZhbHVlcyBhbmQgcmVhbFxuICAgKiBjb21wb3NpdGluZyBcdTIwMTQgaW5zdGVhZCBvZiBhIGhhbmQtc2ltdWxhdGVkIGNhc2NhZGUuIEl0IHBvbGxzIHRoZSBsaXZlXG4gICAqIGBlbGVtZW50Lm1hdGNoZXMoJzpob3ZlcicpYCBzdGF0ZSAobm90IGEgZml4ZWQgZGVsYXkpLCBzbyBpdCBpcyByb2J1c3QgdW5kZXJcbiAgICogc2hhcmVkLWluc3RhbmNlIGxvYWQuIEl0IHRhcmdldHMgdGhlIHNpbmdsZSBzaGFyZWQgd2luZG93J3MgKipnbG9iYWwqKlxuICAgKiBwb2ludGVyLCBzbyBvbmx5IG9uZSBlbGVtZW50IGlzIGhvdmVyZWQgYXQgYSB0aW1lLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gaG92ZXIuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZWxlbWVudCBtYXRjaGVzIGA6aG92ZXJgLlxuICAgKi9cbiAgaG92ZXJFbGVtZW50KHRoaXM6IHZvaWQsIHBhcmFtczogSG92ZXJFbGVtZW50UGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gdGhlIGdpdmVuIHdlYi1jb250ZW50cyBjb29yZGluYXRlcyB1c2luZyBhXG4gICAqICoqdHJ1c3RlZCoqIEVsZWN0cm9uIHBvaW50ZXIgbW92ZS5cbiAgICpcbiAgICogQSB0cnVzdGVkIG1vdmUgKGluamVjdGVkIHZpYSBFbGVjdHJvbidzIGB3ZWJDb250ZW50cy5zZW5kSW5wdXRFdmVudGApXG4gICAqIHVwZGF0ZXMgdGhlIHJlYWwgcG9pbnRlciBzdGF0ZSBpbiB0aGUgQ1NTIGVuZ2luZSwgc28gYDpob3ZlcmAgcnVsZXNcbiAgICogZ2VudWluZWx5IGFwcGx5IFx1MjAxNCB1bmxpa2UgYGRpc3BhdGNoRXZlbnQobmV3IE1vdXNlRXZlbnQoJ21vdXNlb3ZlcicpKWAsXG4gICAqIHdoaWNoIGlzIHVudHJ1c3RlZCBhbmQgbmV2ZXIgc2V0cyBgOmhvdmVyYC4gSXQgdGFyZ2V0cyB0aGUgc2luZ2xlIHNoYXJlZFxuICAgKiB3aW5kb3cncyAqKmdsb2JhbCoqIHBvaW50ZXIsIHNvIG9ubHkgb25lIGVsZW1lbnQgaXMgaG92ZXJlZCBhdCBhIHRpbWUuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IGl0IHBlcmZvcm1zIGEgc2luZ2xlIG1vdmUgYW5kIGRvZXMgKipub3QqKlxuICAgKiB3YWl0IGZvciBhbnkgc3RhdGUgdG8gc2V0dGxlIChjYWxsZXJzIHBvbGwgdGhlaXIgb3duIHJlYWRpbmVzcyBzaWduYWwpLlxuICAgKiBQcmVmZXIge0BsaW5rIExpYi5ob3ZlckVsZW1lbnR9IC8ge0BsaW5rIExpYi51bmhvdmVyRWxlbWVudH0gZm9yXG4gICAqIGVsZW1lbnQtcmVsYXRpdmUgbW92ZXM7IHVzZSBgbW92ZU1vdXNlYCBkaXJlY3RseSB3aGVuIGFuIGVsZW1lbnQtcmVsYXRpdmVcbiAgICogdGFyZ2V0IGRvZXMgbm90IGZpdCAoZS5nLiBhbiBlbGVtZW50IHNwYW5uaW5nIHRoZSBmdWxsIHZpZXdwb3J0IHdpZHRoKS5cbiAgICpcbiAgICogU3luY2hyb25vdXM6IGluamVjdGluZyB0aGUgdHJ1c3RlZCBtb3ZlIGRvZXMgbm8gcmVhbCBhd2FpdGluZywgc28gdGhlIGNhbGxlclxuICAgKiBkb2VzIG5vdCBuZWVkIHRvIGBhd2FpdGAgaXQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgd2ViLWNvbnRlbnRzIERJUCBjb29yZGluYXRlcyB0byBtb3ZlIHRvLlxuICAgKi9cbiAgbW92ZU1vdXNlKHRoaXM6IHZvaWQsIHBhcmFtczogTW92ZU1vdXNlUGFyYW1zKTogdm9pZDtcblxuICAvKipcbiAgICogUHJlc3NlcyBhIHNpbmdsZSBrZXkgKG9wdGlvbmFsbHkgd2l0aCBtb2RpZmllcnMpIHVzaW5nICoqdHJ1c3RlZCoqIEVsZWN0cm9uXG4gICAqIGtleWJvYXJkIGlucHV0LCBmaXJpbmcgdGhlIGZ1bGwgcmVhbCBrZXkgcGlwZWxpbmUgXHUyMDE0XG4gICAqIGBrZXlkb3duYCBcdTIxOTIgYGtleXByZXNzYCBcdTIxOTIgYGJlZm9yZWlucHV0YCBcdTIxOTIgYGlucHV0YCBcdTIxOTIgYGtleXVwYC5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUga2V5LXByZXNzIGFuYWxvZyBvZiB7QGxpbmsgTGliLnR5cGVJbnRvRWRpdG9yfTogaXQgaW5qZWN0cyBhXG4gICAqIHRydXN0ZWQgYGtleURvd25gIFx1MjE5MiBgY2hhcmAgXHUyMTkyIGBrZXlVcGAgc2VxdWVuY2UgdmlhIEVsZWN0cm9uJ3NcbiAgICogYHdlYkNvbnRlbnRzLnNlbmRJbnB1dEV2ZW50YCwgc28gaXQgaXMgZGVsaXZlcmVkIHRvIHRoZSB3aW5kb3cncyBET00tZm9jdXNlZFxuICAgKiBlbGVtZW50IGFuZCBmbG93cyB0aHJvdWdoIHRoZSByZWFsIGlucHV0IHBpcGVsaW5lIFx1MjAxNCB1bmxpa2VcbiAgICogYGRpc3BhdGNoRXZlbnQobmV3IEtleWJvYXJkRXZlbnQoLi4uKSlgLCB3aGljaCBpcyB1bnRydXN0ZWQgKGBpc1RydXN0ZWQ6XG4gICAqIGZhbHNlYCkgYW5kIGlnbm9yZWQgYnkgQ29kZU1pcnJvciBhbmQgbW9zdCBrZXkgaGFuZGxlcnMuIFVzZSBpdCBmb3Igc3BlY2lhbFxuICAgKiBrZXlzIChgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGFycm93IGtleXMpIGFuZCBtb2RpZmllciBjb21iaW5hdGlvbnNcbiAgICogKGBTaGlmdCtFbnRlcmAsIGBDdHJsK0FgKSB0aGF0IHtAbGluayBMaWIudHlwZUludG9FZGl0b3J9ICh3aGljaCB0eXBlc1xuICAgKiBwcmludGFibGUgdGV4dCkgZG9lcyBub3QgY292ZXIuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIGxvdy1sZXZlbCBwcmltaXRpdmU6IGl0IGluamVjdHMgdGhlIGtleSBwcmVzcyBhbmQgZG9lcyAqKm5vdCoqXG4gICAqIHBvbGwgZm9yIGFueSBlZmZlY3QgKGEga2V5IHByZXNzIGhhcyBubyB1bml2ZXJzYWwgb2JzZXJ2YWJsZSBvdXRjb21lIFx1MjAxNFxuICAgKiBgRW50ZXJgIGVkaXRzIHRoZSBkb2N1bWVudCwgYEVzY2FwZWAgY2xvc2VzIGEgbW9kYWwsIGBBcnJvd0Rvd25gIG1vdmVzIHRoZVxuICAgKiBzZWxlY3Rpb24pLiBUaGUgY2FsbGVyIGZvY3VzZXMgdGhlIGludGVuZGVkIHRhcmdldCBmaXJzdCwgdGhlbiBhd2FpdHMgdGhlXG4gICAqIGV4cGVjdGVkIGVmZmVjdCB2aWEge0BsaW5rIExpYi53YWl0VW50aWx9LiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogZm9jdXMsIHNvIG9ubHkgdGhlIERPTS1mb2N1c2VkIGVsZW1lbnQgcmVjZWl2ZXMgdGhlIGtleS5cbiAgICpcbiAgICogU3luY2hyb25vdXM6IGluamVjdGluZyB0aGUgdHJ1c3RlZCBrZXkgcHJlc3MgZG9lcyBubyByZWFsIGF3YWl0aW5nLCBzbyB0aGVcbiAgICogY2FsbGVyIGRvZXMgbm90IG5lZWQgdG8gYGF3YWl0YCBpdC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBrZXkgdG8gcHJlc3MgYW5kIGFueSBtb2RpZmllcnMgdG8gaG9sZC5cbiAgICovXG4gIHByZXNzS2V5KHRoaXM6IHZvaWQsIHBhcmFtczogUHJlc3NLZXlQYXJhbXMpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBUeXBlcyB0ZXh0IGludG8gYSBDb2RlTWlycm9yIHtAbGluayBFZGl0b3J9IHVzaW5nICoqdHJ1c3RlZCoqIEVsZWN0cm9uXG4gICAqIGtleWJvYXJkIGlucHV0LlxuICAgKlxuICAgKiBUeXBpbmcgaXMgcHJlc3NpbmcgZWFjaCBjaGFyYWN0ZXIga2V5IGluIHR1cm46IHRoaXMgZm9jdXNlcyB0aGUgZWRpdG9yXG4gICAqIChjYXJldCB0byBlbmQpIGFuZCBwcmVzc2VzIGV2ZXJ5IGNvZGUgcG9pbnQgb2YgYHRleHRgIHZpYVxuICAgKiB7QGxpbmsgTGliLnByZXNzS2V5fSBcdTIwMTQgdGhlIHNhbWUgdHJ1c3RlZCBga2V5RG93bmAgXHUyMTkyIGBjaGFyYCBcdTIxOTIgYGtleVVwYCBhIHJlYWxcbiAgICogdXNlciBwcm9kdWNlcy4gRWFjaCBrZXlzdHJva2UgaXMgZGVsaXZlcmVkIHRvIHRoZSB3aW5kb3cncyBET00tZm9jdXNlZFxuICAgKiBlbGVtZW50IGFuZCBmbG93cyB0aHJvdWdoIENvZGVNaXJyb3IncyByZWFsIGlucHV0IHBpcGVsaW5lLCBzbyB0aGUgdHlwZWRcbiAgICogdGV4dCByZWFjaGVzIHRoZSBkb2N1bWVudCAqKm9ubHkgaWYgdGhlIGVkaXRvciBnZW51aW5lbHkgaG9sZHMgZm9jdXMqKi5cbiAgICogVGhpcyBtYWtlcyBcInRoZSB1c2VyIHR5cGVkIGludG8gdGhlIGVkaXRvclwiIGEgZmFpdGhmdWwgZW5kLXRvLWVuZCBjaGVjayxcbiAgICogdW5saWtlIGBkaXNwYXRjaEV2ZW50KG5ldyBLZXlib2FyZEV2ZW50KC4uLikpYCAodW50cnVzdGVkIFx1MjAxNCBpZ25vcmVkIGJ5XG4gICAqIENvZGVNaXJyb3IpIG9yIGBleGVjQ29tbWFuZCgnaW5zZXJ0VGV4dCcpYCAobXV0YXRlcyB0aGUgc2VsZWN0aW9uIGV2ZW5cbiAgICogd2hlbiB0aGUgZWRpdG9yIGlzIG5vdCBmb2N1c2VkLCBtYXNraW5nIGZvY3VzIGJ1Z3MgYXMgZmFsc2UgcG9zaXRpdmVzKS5cbiAgICpcbiAgICogQWZ0ZXIgaW5qZWN0aW5nIHRoZSBrZXlzdHJva2VzIGl0IHBvbGxzIHVudGlsIHRoZSBkb2N1bWVudCByZWZsZWN0cyB0aGVcbiAgICogaW5wdXQsIG9yIGEgYm91bmRlZCB0aW1lb3V0IGVsYXBzZXMgKHRoZSBleHBlY3RlZCBvdXRjb21lIHdoZW4gdGhlIGVkaXRvclxuICAgKiBpcyByZWFkLW9ubHkgYW5kIHJlamVjdHMgdGhlIGlucHV0LCBvciB3aGVuIGZvY3VzIHdhcyBzdG9sZW4pLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVkaXRvciB0byB0eXBlIGludG8gYW5kIHRoZSB0ZXh0IHRvIHR5cGUuXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUga2V5c3Ryb2tlcyBoYXZlIHNldHRsZWQuXG4gICAqL1xuICB0eXBlSW50b0VkaXRvcih0aGlzOiB2b2lkLCBwYXJhbXM6IFR5cGVJbnRvRWRpdG9yUGFyYW1zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogTW92ZXMgdGhlIG1vdXNlIHBvaW50ZXIgdG8gYSBwb2ludCBqdXN0IG91dHNpZGUgYW4gZWxlbWVudCdzIGJvdW5kaW5nIGJveFxuICAgKiB1c2luZyBhICoqdHJ1c3RlZCoqIEVsZWN0cm9uIHBvaW50ZXIgbW92ZSwgdGhlbiBwb2xscyB1bnRpbCB0aGUgZWxlbWVudCBub1xuICAgKiBsb25nZXIgbWF0Y2hlcyBgOmhvdmVyYC5cbiAgICpcbiAgICogVGhlIGludmVyc2Ugb2Yge0BsaW5rIExpYi5ob3ZlckVsZW1lbnR9LiBJdCB0YXJnZXRzIHRoZSBzaW5nbGUgc2hhcmVkXG4gICAqIHdpbmRvdydzICoqZ2xvYmFsKiogcG9pbnRlciwgc28gb25seSBvbmUgZWxlbWVudCBpcyBob3ZlcmVkIGF0IGEgdGltZS4gV2hlblxuICAgKiBhbiBlbGVtZW50IHNwYW5zIHRoZSBmdWxsIHZpZXdwb3J0IChubyBwb2ludCBvdXRzaWRlIGl0cyBib3ggaXMgcmVhY2hhYmxlKSxcbiAgICogdXNlIHtAbGluayBMaWIubW92ZU1vdXNlfSBkaXJlY3RseSB0byBtb3ZlIHRoZSBwb2ludGVyIHRvIGEga25vd24gZW1wdHlcbiAgICogY29vcmRpbmF0ZSBpbnN0ZWFkLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBhd2F5IGZyb20uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgZWxlbWVudCBubyBsb25nZXIgbWF0Y2hlc1xuICAgKiAgIGA6aG92ZXJgLlxuICAgKi9cbiAgdW5ob3ZlckVsZW1lbnQodGhpczogdm9pZCwgcGFyYW1zOiBVbmhvdmVyRWxlbWVudFBhcmFtcyk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIFBvbGxzIGEgcHJlZGljYXRlIHVudGlsIGl0IGJlY29tZXMgdHJ1dGh5LCBvciByZWplY3RzIG9uY2UgYSBib3VuZGVkXG4gICAqIHRpbWVvdXQgZWxhcHNlcy5cbiAgICpcbiAgICogSW50ZWdyYXRpb24tdGVzdCBgZXZhbEluT2JzaWRpYW5gIGNhbGxiYWNrcyByb3V0aW5lbHkgbmVlZCB0byB3YWl0IGZvciBhblxuICAgKiBhc3luY2hyb25vdXMgZWZmZWN0IHRvIHNldHRsZSAoYSB2aWV3IHRvIG9wZW4sIGEgRE9NIG5vZGUgdG8gYXBwZWFyLCBhXG4gICAqIHNldHRpbmcgdG8gYXBwbHkpLiBCZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kXG4gICAqIGNhbm5vdCBpbXBvcnQgbW9kdWxlcywgaXQgY2FuJ3QgcmV1c2UgYG9ic2lkaWFuLWRldi11dGlsc2AnXG4gICAqIGByZXRyeVdpdGhUaW1lb3V0YCAvIGBydW5XaXRoVGltZW91dGAuIFRoaXMgaGVscGVyIGlzIHRoZSBzaGFyZWQsIGluamVjdGVkXG4gICAqIHJlcGxhY2VtZW50IGZvciB0aGUgcGVyLWNsb3N1cmUgcG9sbCBsb29wcyBjb25zdW1lcnMgd291bGQgb3RoZXJ3aXNlXG4gICAqIGhhbmQtcm9sbC5cbiAgICpcbiAgICogVGhlIGBwcmVkaWNhdGVgIG1heSBiZSBzeW5jaHJvbm91cyBvciBhc3luY2hyb25vdXMgXHUyMDE0IGl0IGlzIGF3YWl0ZWQgb24gZXZlcnlcbiAgICogcG9sbC4gSXQgaXMgY2hlY2tlZCBpbW1lZGlhdGVseSwgdGhlbiByZS1jaGVja2VkIGV2ZXJ5XG4gICAqIGBpbnRlcnZhbEluTWlsbGlzZWNvbmRzYCB1bnRpbCBpdCByZXR1cm5zIHRydXRoeSBvciBgdGltZW91dEluTWlsbGlzZWNvbmRzYFxuICAgKiBlbGFwc2VzLCBhdCB3aGljaCBwb2ludCB0aGUgcmV0dXJuZWQge0BsaW5rIFByb21pc2V9IHJlamVjdHMgKHRoZSBlcnJvclxuICAgKiBpbmNsdWRlcyBgbWVzc2FnZWAgd2hlbiBwcm92aWRlZCkuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBUaGUgcHJlZGljYXRlIHRvIHBvbGwgcGx1cyBvcHRpb25hbCB0aW1lb3V0LCBpbnRlcnZhbCwgYW5kXG4gICAqICAgdGltZW91dCBtZXNzYWdlLlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHByZWRpY2F0ZSBpcyB0cnV0aHkuXG4gICAqL1xuICB3YWl0VW50aWwodGhpczogdm9pZCwgcGFyYW1zOiBXYWl0VW50aWxQYXJhbXMpOiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIFRoZSBtb3VzZSBidXR0b24gYSB0cnVzdGVkIGNsaWNrIHByZXNzZXMsIGluIEVsZWN0cm9uJ3MgYHNlbmRJbnB1dEV2ZW50YFxuICogc3BlbGxpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdXNlQnV0dG9uID0gJ2xlZnQnIHwgJ21pZGRsZScgfCAncmlnaHQnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBDb21tb25Bcmd1bWVudHMubW92ZU1vdXNlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb3ZlTW91c2VQYXJhbXMge1xuICAvKipcbiAgICogVGhlIHggY29vcmRpbmF0ZSAod2ViLWNvbnRlbnRzIERJUCkgdG8gbW92ZSB0aGUgcG9pbnRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IHg6IG51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHkgY29vcmRpbmF0ZSAod2ViLWNvbnRlbnRzIERJUCkgdG8gbW92ZSB0aGUgcG9pbnRlciB0by5cbiAgICovXG4gIHJlYWRvbmx5IHk6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnByZXNzS2V5fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcmVzc0tleVBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUga2V5IHRvIHByZXNzLCBnaXZlbiBhcyBhbiBFbGVjdHJvbiBBY2NlbGVyYXRvciBrZXkgbmFtZSBcdTIwMTQgZS5nLlxuICAgKiBgJ0VudGVyJ2AsIGAnRXNjYXBlJ2AsIGAnVGFiJ2AsIGAnQmFja3NwYWNlJ2AsIGAnRGVsZXRlJ2AsIGFuIGFycm93IGtleVxuICAgKiAoYCdVcCdgIC8gYCdEb3duJ2AgLyBgJ0xlZnQnYCAvIGAnUmlnaHQnYCksIG9yIGEgcHJpbnRhYmxlIGNoYXJhY3RlclxuICAgKiAoYCdhJ2AsIGAnMSdgKS4gVGhlIHByb2R1Y2VkIGNoYXJhY3RlciAod2hlbiB0aGUga2V5IGluc2VydHMgdGV4dCkgaXMgdGhlXG4gICAqIGxpdGVyYWwgYGtleWAgdmFsdWU7IGNhc2UtY29ycmVjdCB0ZXh0IGJlbG9uZ3MgdG9cbiAgICoge0BsaW5rIENvbW1vbkFyZ3VtZW50cy50eXBlSW50b0VkaXRvcn0sIG5vdCBhIGtleS1wcmVzcyBwcmltaXRpdmUuXG4gICAqL1xuICByZWFkb25seSBrZXk6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIG1vZGlmaWVyIGtleXMgdG8gaG9sZCB3aGlsZSB0aGUga2V5IGlzIHByZXNzZWQsIHVzaW5nIE9ic2lkaWFuJ3NcbiAgICoge0BsaW5rIE1vZGlmaWVyfSBuYW1lcyAodGhlIHNhbWUgdmFsdWVzIGFzIGFuIE9ic2lkaWFuIGBIb3RrZXlgKS4gYCdNb2QnYFxuICAgKiByZXNvbHZlcyBwZXItcGxhdGZvcm0gKENtZCBvbiBtYWNPUywgQ3RybCBlbHNld2hlcmUpOyBlYWNoIGlzIG1hcHBlZCB0b1xuICAgKiBFbGVjdHJvbidzIGxvd2VyY2FzZSBgc2VuZElucHV0RXZlbnRgIG1vZGlmaWVyIG5hbWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBbXWBcbiAgICovXG4gIHJlYWRvbmx5IG1vZGlmaWVycz86IHJlYWRvbmx5IE1vZGlmaWVyW107XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy50eXBlSW50b0VkaXRvcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZUludG9FZGl0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVkaXRvciB0byB0eXBlIGludG8uIEl0IGlzIGZvY3VzZWQgKHdpdGggdGhlIGNhcmV0IG1vdmVkIHRvIHRoZSBlbmQgb2ZcbiAgICogdGhlIGRvY3VtZW50KSBiZWZvcmUgdGhlIGtleXN0cm9rZXMgYXJlIGluamVjdGVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZWRpdG9yOiBFZGl0b3I7XG5cbiAgLyoqXG4gICAqIFRoZSB0ZXh0IHRvIHR5cGUuIEVhY2ggY29kZSBwb2ludCBpcyBwcmVzc2VkIHZpYSB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLnByZXNzS2V5fVxuICAgKiAoYSB0cnVzdGVkIGBrZXlEb3duYCBcdTIxOTIgYGNoYXJgIFx1MjE5MiBga2V5VXBgKSwgZXhhY3RseSBhcyBhIHJlYWwgdXNlciB0eXBpbmcuXG4gICAqL1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIENvbW1vbkFyZ3VtZW50cy51bmhvdmVyRWxlbWVudH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVW5ob3ZlckVsZW1lbnRQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGVsZW1lbnQgdG8gbW92ZSB0aGUgcG9pbnRlciBhd2F5IGZyb20uIFRoZSBwb2ludGVyIGlzIG1vdmVkIHRvIGEgcG9pbnRcbiAgICoganVzdCBvdXRzaWRlIGl0cyBib3VuZGluZyBib3guIFRoaXMgaXMgYSBsaXZlIHJlbmRlcmVyIERPTSBub2RlIFx1MjAxNCB0aGVcbiAgICogY2FsbGJhY2sgcnVucyBpbi1yZW5kZXJlciwgc28gbm8gY3Jvc3MtcHJvY2VzcyBzZXJpYWxpemF0aW9uIGlzIG5lZWRlZFxuICAgKiAoc2FtZSBhcyB7QGxpbmsgVHlwZUludG9FZGl0b3JQYXJhbXMuZWRpdG9yfSkuXG4gICAqL1xuICByZWFkb25seSBlbGVtZW50OiBIVE1MRWxlbWVudDtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgQ29tbW9uQXJndW1lbnRzLndhaXRVbnRpbH0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2FpdFVudGlsUGFyYW1zIHtcbiAgLyoqXG4gICAqIFRoZSBwb2xsaW5nIGludGVydmFsIGJldHdlZW4gcHJlZGljYXRlIGNoZWNrcy5cbiAgICpcbiAgICogQGRlZmF1bHQgYDUwYFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJ2YWxJbk1pbGxpc2Vjb25kcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQW4gb3B0aW9uYWwgZGV0YWlsIGFwcGVuZGVkIHRvIHRoZSB0aW1lb3V0IGVycm9yIG1lc3NhZ2UsIGRlc2NyaWJpbmcgd2hhdFxuICAgKiB3YXMgYmVpbmcgd2FpdGVkIGZvci5cbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2U/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBjb25kaXRpb24gdG8gd2FpdCBmb3IuIFBvbGxlZCBpbW1lZGlhdGVseSwgdGhlbiBvbiBldmVyeSBpbnRlcnZhbCB1bnRpbFxuICAgKiBpdCByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLiBNYXkgYmUgc3luY2hyb25vdXMgb3IgYXN5bmNocm9ub3VzIFx1MjAxNCBpdCBpc1xuICAgKiBhd2FpdGVkIG9uIGVhY2ggcG9sbC5cbiAgICpcbiAgICogQHJldHVybnMgV2hldGhlciB0aGUgYXdhaXRlZCBjb25kaXRpb24gaGFzIGJlZW4gbWV0LlxuICAgKi9cbiAgcHJlZGljYXRlKHRoaXM6IHZvaWQpOiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogVGhlIG1heGltdW0gdGltZSB0byB3YWl0IGJlZm9yZSByZWplY3RpbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IGA1MDAwYFxuICAgKi9cbiAgcmVhZG9ubHkgdGltZW91dEluTWlsbGlzZWNvbmRzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV2YWx1YXRlcyBhIGZ1bmN0aW9uIGluc2lkZSB0aGUgcnVubmluZyBPYnNpZGlhbiBpbnN0YW5jZVxuICogdmlhIHRoZSBhY3RpdmUgdHJhbnNwb3J0IGFuZCByZXR1cm5zIHRoZSBwYXJzZWQgcmVzdWx0LlxuICpcbiAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyBhbiBpbnB1dCBvYmplY3QgdGhhdCBpbmNsdWRlcyBgYXBwYCwgYG9ic2lkaWFuTW9kdWxlYCxcbiAqIGBjb250ZXh0YCwgYW5kIGFueSBhZGRpdGlvbmFsIGBpbnB1dGAgcGFzc2VkIGJ5IHRoZSBjYWxsZXIuXG4gKiBJdCBpcyBzZXJpYWxpemVkIHZpYSBgdG9TdHJpbmcoKWAgYW5kIGludm9rZWQgYXMgYW4gSUlGRS5cbiAqIFRoZSBmdW5jdGlvbiBtdXN0IGJlIHNlbGYtY29udGFpbmVkIFx1MjAxNCBjbG9zdXJlcyBvdmVyIGxvY2FsIHZhcmlhYmxlcyB3aWxsIG5vdCB3b3JrLlxuICogUGFzcyBhbnkgbmVlZGVkIHZhbHVlcyBhcyBgaW5wdXRgIFx1MjAxNCB0aGV5IGFyZSBKU09OLXNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCBvbiB0aGUgT2JzaWRpYW4gc2lkZS5cbiAqXG4gKiBUaGUgcmVzdWx0IGlzIGBKU09OLnN0cmluZ2lmeWAnZCBvbiB0aGUgT2JzaWRpYW4gc2lkZSBhbmQgcGFyc2VkIGJhY2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzIGZvciB0aGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIHRvIHRoZSByZXR1cm4gdmFsdWUgb2YgYGNhbGxiYWNrYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV2YWxJbk9ic2lkaWFuPElucHV0IGV4dGVuZHMgR2VuZXJpY09iamVjdCwgUmVzdWx0LCBUQ29udGV4dElkIGV4dGVuZHMgQ29udGV4dElkPHVua25vd24+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkPihcbiAgcGFyYW1zOiBFdmFsSW5PYnNpZGlhblBhcmFtczxJbnB1dCwgUmVzdWx0LCBUQ29udGV4dElkPlxuKTogUHJvbWlzZTxSZXN1bHQ+IHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC91bmJvdW5kLW1ldGhvZCAtLSBgY2FsbGJhY2tgIGNhbiBiZSB1bmJvdW5kLlxuICBjb25zdCB7IGNhbGxiYWNrLCBjb250ZXh0SWQsIGlucHV0ID0ge30sIHNob3VsZFNraXBQcmVmbGlnaHRDaGVja3MgPSBmYWxzZSwgdHJhbnNwb3J0OiB0cmFuc3BvcnRPdmVycmlkZSwgdmF1bHRQYXRoIH0gPSBwYXJhbXM7XG4gIGNvbnN0IGN3ZCA9IHZhdWx0UGF0aCA/PyBnZXRWYXVsdFBhdGgoKSA/PyBwcm9jZXNzLmN3ZCgpO1xuXG4gIC8vIENoZWNrOiBWYXVsdCBwYXRoIGV4aXN0cyBvbiBkaXNrLlxuICBpZiAodmF1bHRQYXRoICE9PSB1bmRlZmluZWQgJiYgIWV4aXN0c1N5bmModmF1bHRQYXRoKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVmF1bHQgcGF0aCBkb2VzIG5vdCBleGlzdDogJHt2YXVsdFBhdGh9YCk7XG4gIH1cblxuICBjb25zdCB0cmFuc3BvcnQgPSB0cmFuc3BvcnRPdmVycmlkZSA/PyBhd2FpdCBnZXRPckNyZWF0ZVRyYW5zcG9ydChnZXRUcmFuc3BvcnRPcHRpb25zKCkpO1xuXG4gIGlmICghc2hvdWxkU2tpcFByZWZsaWdodENoZWNrcykge1xuICAgIGF3YWl0IHRyYW5zcG9ydC5wcmVmbGlnaHRDaGVjayhjd2QpO1xuICB9XG5cbiAgYXdhaXQgZW5zdXJlTmFtZXNwYWNlQm9vdHN0cmFwcGVkKHRyYW5zcG9ydCwgY3dkKTtcblxuICBjb25zdCBuYW1lc3BhY2VDYWxsUGFyYW1zOiBHZW5lcmF0ZU5hbWVzcGFjZUNhbGxQYXJhbXMgPSB7XG4gICAgY2FsbGJhY2ssXG4gICAgaW5wdXQsXG4gICAgLi4uKGNvbnRleHRJZCAhPT0gdW5kZWZpbmVkICYmIHsgY29udGV4dElkOiBTdHJpbmcoY29udGV4dElkKSB9KVxuICB9O1xuXG4gIGNvbnN0IGV4cHJlc3Npb24gPSBnZW5lcmF0ZU5hbWVzcGFjZUNhbGwobmFtZXNwYWNlQ2FsbFBhcmFtcyk7XG5cbiAgY29uc3QgcmVzdWx0U3RyaW5nID0gYXdhaXQgdHJhbnNwb3J0LmV2YWx1YXRlKGV4cHJlc3Npb24sIHsgY3dkIH0pO1xuXG4gIGlmIChyZXN1bHRTdHJpbmcgPT09ICcnIHx8IHJlc3VsdFN0cmluZyA9PT0gTk9fT1VUUFVUKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBSZXN1bHQ7XG4gIH1cblxuICBsZXQgZW52ZWxvcGU6IEV2YWxSZXN1bHRFbnZlbG9wZTtcbiAgdHJ5IHtcbiAgICBlbnZlbG9wZSA9IEpTT04ucGFyc2UocmVzdWx0U3RyaW5nKSBhcyBFdmFsUmVzdWx0RW52ZWxvcGU7XG4gIH0gY2F0Y2gge1xuICAgIHRocm93IG5ldyBFcnJvcihgZXZhbEluT2JzaWRpYW46IE9ic2lkaWFuIHJldHVybmVkIG5vbi1KU09OIG91dHB1dDogJHtyZXN1bHRTdHJpbmd9YCk7XG4gIH1cblxuICBpZiAoJ3R5cGUnIGluIGVudmVsb3BlKSB7XG4gICAgaWYgKGVudmVsb3BlLnR5cGUgPT09ICdlcnJvcicpIHtcbiAgICAgIC8vIFJld3JpdGUgYmFyZS1vcmlnaW4gbG9jYWxob3N0IHN0YWNrIGZyYW1lcyBsaWtlIFwiKGh0dHA6Ly9sb2NhbGhvc3QvOjkxNTozMilcIlxuICAgICAgLy8gU28gVml0ZXN0J3Mgc291cmNlLW1hcCByZXNvbHZlciB3b24ndCBleHRyYWN0IFwiL1wiIGFzIHRoZSBmaWxlIHBhdGggYW5kIGNyYXNoXG4gICAgICAvLyBXaXRoIEVJU0RJUiB3aGVuIGl0IHRyaWVzIHRvIHJlYWRGaWxlU3luYyBvbiB0aGUgcm9vdCBkaXJlY3RvcnkuXG4gICAgICBjb25zdCBzYW5pdGl6ZWREZXRhaWwgPSBlbnZlbG9wZS52YWx1ZVxuICAgICAgICAucmVwbGFjZUFsbCgvXFwoaHR0cHM/OlxcL1xcL2xvY2FsaG9zdFxcLzooPzxsaW5lPlxcZCkvZywgJyhvYnNpZGlhbi13ZWJ2aWV3OiQ8bGluZT4nKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZXZhbEluT2JzaWRpYW46IEVycm9yIGluc2lkZSBPYnNpZGlhbjpcXG4ke3Nhbml0aXplZERldGFpbH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkIGFzIFJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBlbnZlbG9wZS52YWx1ZSBhcyBSZXN1bHQ7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQWdCQSxxQkFBMkI7QUFDM0IsMEJBQW9CO0FBU3BCLDhCQUdPO0FBQ1Asb0NBQXNDO0FBQ3RDLGlDQUE0QztBQUM1QywrQkFBcUM7QUEyQnJDLE1BQU0sWUFBWTtBQTJnQmxCLGVBQXNCLGVBQ3BCLFFBQ2lCO0FBRWpCLFFBQU0sRUFBRSxVQUFVLFdBQVcsUUFBUSxDQUFDLEdBQUcsNEJBQTRCLE9BQU8sV0FBVyxtQkFBbUIsVUFBVSxJQUFJO0FBQ3hILFFBQU0sTUFBTSxpQkFBYSxzQ0FBYSxLQUFLLG9CQUFBQSxRQUFRLElBQUk7QUFHdkQsTUFBSSxjQUFjLFVBQWEsS0FBQywyQkFBVyxTQUFTLEdBQUc7QUFDckQsVUFBTSxJQUFJLE1BQU0sOEJBQThCLFNBQVMsRUFBRTtBQUFBLEVBQzNEO0FBRUEsUUFBTSxZQUFZLHFCQUFxQixVQUFNLG1EQUFxQiw2Q0FBb0IsQ0FBQztBQUV2RixNQUFJLENBQUMsMkJBQTJCO0FBQzlCLFVBQU0sVUFBVSxlQUFlLEdBQUc7QUFBQSxFQUNwQztBQUVBLFlBQU0sd0RBQTRCLFdBQVcsR0FBRztBQUVoRCxRQUFNLHNCQUFtRDtBQUFBLElBQ3ZEO0FBQUEsSUFDQTtBQUFBLElBQ0EsR0FBSSxjQUFjLFVBQWEsRUFBRSxXQUFXLE9BQU8sU0FBUyxFQUFFO0FBQUEsRUFDaEU7QUFFQSxRQUFNLGlCQUFhLHFEQUFzQixtQkFBbUI7QUFFNUQsUUFBTSxlQUFlLE1BQU0sVUFBVSxTQUFTLFlBQVksRUFBRSxJQUFJLENBQUM7QUFFakUsTUFBSSxpQkFBaUIsTUFBTSxpQkFBaUIsV0FBVztBQUNyRCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQUk7QUFDSixNQUFJO0FBQ0YsZUFBVyxLQUFLLE1BQU0sWUFBWTtBQUFBLEVBQ3BDLFFBQVE7QUFDTixVQUFNLElBQUksTUFBTSxzREFBc0QsWUFBWSxFQUFFO0FBQUEsRUFDdEY7QUFFQSxNQUFJLFVBQVUsVUFBVTtBQUN0QixRQUFJLFNBQVMsU0FBUyxTQUFTO0FBSTdCLFlBQU0sa0JBQWtCLFNBQVMsTUFDOUIsV0FBVyx5Q0FBeUMsMkJBQTJCO0FBQ2xGLFlBQU0sSUFBSSxNQUFNO0FBQUEsRUFBMkMsZUFBZSxFQUFFO0FBQUEsSUFDOUU7QUFFQSxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU8sU0FBUztBQUNsQjsiLAogICJuYW1lcyI6IFsicHJvY2VzcyJdCn0K
@@ -8,6 +8,56 @@ import type * as obsidian from 'obsidian';
8
8
  import type { Promisable } from 'type-fest';
9
9
  import type { ContextArguments, ContextId } from './context-id.cjs';
10
10
  import type { ObsidianTransport } from './transport.cjs';
11
+ /**
12
+ * Parameters for {@link CommonArguments.clickElement}.
13
+ */
14
+ export interface ClickElementParams {
15
+ /**
16
+ * The mouse button to press.
17
+ *
18
+ * @default `'left'`
19
+ */
20
+ readonly button?: MouseButton;
21
+ /**
22
+ * The element to click. The pointer is moved to its center. This is a live
23
+ * renderer DOM node — the callback runs in-renderer, so no cross-process
24
+ * serialization is needed (same as {@link TypeIntoEditorParams.editor}).
25
+ */
26
+ readonly element: HTMLElement;
27
+ /**
28
+ * The modifier keys to hold, using Obsidian's {@link Modifier} names. `'Mod'`
29
+ * resolves per-platform (Cmd on macOS, Ctrl elsewhere).
30
+ *
31
+ * @default `[]`
32
+ */
33
+ readonly modifiers?: readonly Modifier[];
34
+ }
35
+ /**
36
+ * Parameters for {@link CommonArguments.clickMouse}.
37
+ */
38
+ export interface ClickMouseParams {
39
+ /**
40
+ * The mouse button to press.
41
+ *
42
+ * @default `'left'`
43
+ */
44
+ readonly button?: MouseButton;
45
+ /**
46
+ * The modifier keys to hold, using Obsidian's {@link Modifier} names. `'Mod'`
47
+ * resolves per-platform (Cmd on macOS, Ctrl elsewhere).
48
+ *
49
+ * @default `[]`
50
+ */
51
+ readonly modifiers?: readonly Modifier[];
52
+ /**
53
+ * The x coordinate (web-contents DIP) to click at.
54
+ */
55
+ readonly x: number;
56
+ /**
57
+ * The y coordinate (web-contents DIP) to click at.
58
+ */
59
+ readonly y: number;
60
+ }
11
61
  /**
12
62
  * Common arguments automatically provided to every {@link evalInObsidian} callback.
13
63
  */
@@ -21,7 +71,8 @@ export interface CommonArguments {
21
71
  *
22
72
  * Never empty: the harness pre-populates a **base** set of renderer-driving
23
73
  * helpers (trusted input — `typeIntoEditor` / `pressKey` / `moveMouse` /
24
- * `hoverElement` / `unhoverElement` and `waitUntil`), and provider packages
74
+ * `clickMouse` / `hoverElement` / `unhoverElement` / `clickElement` and
75
+ * `waitUntil`), and provider packages
25
76
  * (chiefly `obsidian-dev-utils`) `Object.assign` their whole renderer-safe
26
77
  * library on top via {@link registerLibResolver}. A serialized closure reaches
27
78
  * every shared helper through `lib` — `lib.typeIntoEditor({ editor, text })`,
@@ -122,6 +173,50 @@ export interface HoverElementParams {
122
173
  * ```
123
174
  */
124
175
  export interface Lib {
176
+ /**
177
+ * Clicks the center of an element using **trusted** Electron pointer input.
178
+ *
179
+ * The element-relative counterpart of {@link Lib.clickMouse}, mirroring the
180
+ * {@link Lib.moveMouse} / {@link Lib.hoverElement} split. Use
181
+ * {@link Lib.clickMouse} directly when the point to click is **not** the
182
+ * element's center — the markdown editor's margin, for instance, lies inside
183
+ * `cm.scrollDOM` but outside `.cm-sizer`, so no element's center lands on it.
184
+ *
185
+ * Synchronous: injecting the trusted click does no real awaiting, so the
186
+ * caller does not need to `await` it.
187
+ *
188
+ * @param params - The element to click, the button to press and any modifiers
189
+ * to hold.
190
+ */
191
+ clickElement(this: void, params: ClickElementParams): void;
192
+ /**
193
+ * Clicks at the given web-contents coordinates using **trusted** Electron
194
+ * pointer input, so Chromium synthesizes a real `click` (or `contextmenu`,
195
+ * for the right button) with `isTrusted === true`.
196
+ *
197
+ * This is what `element.dispatchEvent(new MouseEvent('click'))` cannot do:
198
+ * Obsidian and CodeMirror gate on `isTrusted`, so a dispatched event silently
199
+ * exercises nothing while the test still passes whatever weaker assertion it
200
+ * makes. Obsidian 1.13.7's markdown viewport (margin) menu, for example,
201
+ * opens from a `cm.scrollDOM` `contextmenu` listener guarded by
202
+ * `e.isTrusted`, which a dispatched event never gets past.
203
+ *
204
+ * It is the low-level primitive: a single trusted `mouseMove` → `mouseDown` →
205
+ * `mouseUp` at one point, with no waiting for any effect (callers poll their
206
+ * own readiness signal). The leading move is what puts the pointer over the
207
+ * hit-test target before the button goes down. Prefer
208
+ * {@link Lib.clickElement} for element-relative clicks.
209
+ *
210
+ * A real context menu actually opens, so a suite driving a right click must
211
+ * close it (or remove the leftover `.menu` element) before the next test.
212
+ *
213
+ * Synchronous: injecting the trusted click does no real awaiting, so the
214
+ * caller does not need to `await` it.
215
+ *
216
+ * @param params - The web-contents DIP coordinates to click at, the button to
217
+ * press and any modifiers to hold.
218
+ */
219
+ clickMouse(this: void, params: ClickMouseParams): void;
125
220
  /**
126
221
  * Creates a note and does not return until its content is verifiably on
127
222
  * disk, rewriting it if it is not.
@@ -280,6 +375,11 @@ export interface Lib {
280
375
  */
281
376
  waitUntil(this: void, params: WaitUntilParams): Promise<void>;
282
377
  }
378
+ /**
379
+ * The mouse button a trusted click presses, in Electron's `sendInputEvent`
380
+ * spelling.
381
+ */
382
+ export type MouseButton = 'left' | 'middle' | 'right';
283
383
  /**
284
384
  * Parameters for {@link CommonArguments.moveMouse}.
285
385
  */