@screeb/sdk-angular 0.5.0 → 0.7.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 (29) hide show
  1. package/README.md +35 -7
  2. package/dist/sdk-angular/esm2022/lib/constants.mjs +2 -0
  3. package/dist/sdk-angular/esm2022/lib/logger.mjs +27 -0
  4. package/dist/sdk-angular/esm2022/lib/screeb-config.mjs +12 -0
  5. package/dist/sdk-angular/esm2022/lib/screeb.mjs +444 -0
  6. package/dist/sdk-angular/esm2022/lib/screeb.module.mjs +62 -0
  7. package/dist/sdk-angular/esm2022/public-api.mjs +7 -0
  8. package/dist/sdk-angular/esm2022/screeb-sdk-angular.mjs +5 -0
  9. package/dist/{screeb-sdk-angular → sdk-angular}/fesm2022/screeb-sdk-angular.mjs +5 -17
  10. package/dist/sdk-angular/fesm2022/screeb-sdk-angular.mjs.map +1 -0
  11. package/dist/{screeb-sdk-angular → sdk-angular}/index.d.ts +1 -1
  12. package/dist/{screeb-sdk-angular → sdk-angular}/lib/screeb-config.d.ts +3 -1
  13. package/dist/{screeb-sdk-angular → sdk-angular}/lib/screeb.d.ts +1 -10
  14. package/dist/{screeb-sdk-angular → sdk-angular}/package.json +1 -1
  15. package/docs/classes/Screeb.md +2 -20
  16. package/docs/classes/ScreebConfig.md +9 -0
  17. package/package.json +30 -30
  18. package/dist/screeb-sdk-angular/esm2022/lib/constants.mjs +0 -2
  19. package/dist/screeb-sdk-angular/esm2022/lib/logger.mjs +0 -27
  20. package/dist/screeb-sdk-angular/esm2022/lib/screeb-config.mjs +0 -12
  21. package/dist/screeb-sdk-angular/esm2022/lib/screeb.mjs +0 -456
  22. package/dist/screeb-sdk-angular/esm2022/lib/screeb.module.mjs +0 -62
  23. package/dist/screeb-sdk-angular/esm2022/public-api.mjs +0 -7
  24. package/dist/screeb-sdk-angular/esm2022/screeb-sdk-angular.mjs +0 -5
  25. package/dist/screeb-sdk-angular/fesm2022/screeb-sdk-angular.mjs.map +0 -1
  26. /package/dist/{screeb-sdk-angular → sdk-angular}/lib/constants.d.ts +0 -0
  27. /package/dist/{screeb-sdk-angular → sdk-angular}/lib/logger.d.ts +0 -0
  28. /package/dist/{screeb-sdk-angular → sdk-angular}/lib/screeb.module.d.ts +0 -0
  29. /package/dist/{screeb-sdk-angular → sdk-angular}/public-api.d.ts +0 -0
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  <p align="center">
2
2
  <a href="https://screeb.app" alt="Screeb">
3
- <img src="https://raw.githubusercontent.com/ScreebApp/sdk-js/master/packages/screeb-sdk-angular/readme/screeb-logo.svg?token=GHSAT0AAAAAAB2OOPMGT2QD5TL3IRJN3CKCZDEYHJA" alt="Logo" height="120px" style="margin-top: 20px;"/>
3
+ <img src="https://raw.githubusercontent.com/ScreebApp/sdk/master/packages/sdk-angular/readme/screeb-logo.svg" alt="Logo" height="120px" style="margin-top: 20px;"/>
4
4
  </a>
5
5
  </p>
6
6
  <h1 align="center">@screeb/sdk-angular</h1>
@@ -13,8 +13,8 @@
13
13
  </p>
14
14
 
15
15
  <p align="center">
16
- <a href="https://github.com/ScreebApp/sdk-js/actions/workflows/node.js.yml" alt="ci">
17
- <img alt="ci" src="https://github.com/ScreebApp/sdk-js/actions/workflows/node.js.yml/badge.svg">
16
+ <a href="https://github.com/ScreebApp/sdk/actions/workflows/ci.yml" alt="ci">
17
+ <img alt="ci" src="https://github.com/ScreebApp/sdk/actions/workflows/ci.yml/badge.svg">
18
18
  </a>
19
19
  <a href="https://www.npmjs.com/package/@screeb/sdk-angular" alt="version">
20
20
  <img alt="version" src="https://img.shields.io/npm/v/@screeb/sdk-angular.svg" />
@@ -94,11 +94,39 @@ export class AppComponent implements OnInit {
94
94
  }
95
95
  ```
96
96
 
97
- For a working example, see our [Screeb Angular SDK example app](https://github.com/ScreebApp/sdk-js/tree/master/packages/screeb-sdk-angular-example).
97
+ ### Custom domains (AdBlocker bypass)
98
98
 
99
- For a more advanced usage and a complete API documentation, see [documentation generated from source files](https://github.com/ScreebApp/sdk-js/tree/master/packages/screeb-sdk-angular/docs).
99
+ If you route Screeb traffic through your own domain (reverse proxy) to bypass AdBlockers, pass the
100
+ `endpoints` (and optionally `screebEndpoint` for the loader URL) through `options` in
101
+ `ScreebModule.forRoot`. Only the endpoints you provide are overridden; the rest fall back to
102
+ Screeb's defaults.
100
103
 
101
- For further information, see [our developper documentation](https://github.com/ScreebApp/developers).
104
+ ```ts
105
+ ScreebModule.forRoot({
106
+ autoInit: true,
107
+ websiteId: "<your-website-id>",
108
+ options: {
109
+ screebEndpoint: "https://analytics.acme.com/sdk/tag.js",
110
+ endpoints: {
111
+ rpc: "https://analytics.acme.com/rpc",
112
+ static: "https://analytics.acme.com/static",
113
+ report: "https://analytics.acme.com/report",
114
+ hostedPage: "https://analytics.acme.com/hosted-page",
115
+ centipede: "wss://analytics.acme.com/centipede",
116
+ },
117
+ },
118
+ })
119
+ ```
120
+
121
+ All endpoints must use `https://` (or `wss://` for `centipede`) and the domains must be allow-listed
122
+ in **Screeb Admin → Settings → Custom Domains**. See the
123
+ [Custom Collector URL guide](https://developers.screeb.app/sdk-js/custom-collector-url).
124
+
125
+ For a working example, see our [Screeb Angular SDK example app](https://github.com/ScreebApp/sdk/tree/master/examples/example-angular).
126
+
127
+ For a more advanced usage and a complete API documentation, see [documentation generated from source files](https://github.com/ScreebApp/sdk/tree/master/packages/sdk-angular/docs).
128
+
129
+ For further information, see [our developer documentation](https://developers.screeb.app/sdk-js/install).
102
130
 
103
131
  ## Support
104
132
  For any issues, please contact our support team at support@screeb.com.
@@ -108,4 +136,4 @@ All third party contributors acknowledge that any contributions they provide wil
108
136
 
109
137
  ## License
110
138
 
111
- Released under [MIT License](https://github.com/ScreebApp/sdk-js/blob/master/LICENSE).
139
+ Released under [MIT License](https://github.com/ScreebApp/sdk/blob/master/LICENSE).
@@ -0,0 +1,2 @@
1
+ export default { version: "0.7.0" };
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLWFuZ3VsYXIvc3JjL2xpYi9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsZUFBZSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHsgdmVyc2lvbjogXCIwLjcuMFwiIH07XG4iXX0=
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Logs messages in the console with a corresponding urgency
3
+ *
4
+ * @param level the urgency of the message
5
+ * @param message the message to log in the console
6
+ */
7
+ export const log = (level, message) => {
8
+ const packageName = "[@screeb/angular-sdk]";
9
+ switch (level) {
10
+ case "info":
11
+ // eslint-disable-next-line no-console
12
+ console.log(`${packageName} ${message}`);
13
+ break;
14
+ case "warn":
15
+ // eslint-disable-next-line no-console
16
+ console.warn(`${packageName} ${message}`);
17
+ break;
18
+ case "error":
19
+ // eslint-disable-next-line no-console
20
+ console.error(`${packageName} ${message}`);
21
+ break;
22
+ default:
23
+ // eslint-disable-next-line no-console
24
+ console.log(`${packageName} ${message}`);
25
+ }
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLWFuZ3VsYXIvc3JjL2xpYi9sb2dnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFlLEVBQUUsT0FBZSxFQUFFLEVBQUU7SUFDdEQsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUM7SUFFNUMsUUFBUSxLQUFLLEVBQUU7UUFDYixLQUFLLE1BQU07WUFDVCxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFdBQVcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3pDLE1BQU07UUFDUixLQUFLLE1BQU07WUFDVCxzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLFdBQVcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzFDLE1BQU07UUFDUixLQUFLLE9BQU87WUFDVixzQ0FBc0M7WUFDdEMsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLFdBQVcsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLE1BQU07UUFDUjtZQUNFLHNDQUFzQztZQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsV0FBVyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7S0FDNUM7QUFDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJ0eXBlIExvZ0xldmVsID0gXCJpbmZvXCIgfCBcImVycm9yXCIgfCBcIndhcm5cIjtcblxuLyoqXG4gKiBMb2dzIG1lc3NhZ2VzIGluIHRoZSBjb25zb2xlIHdpdGggYSBjb3JyZXNwb25kaW5nIHVyZ2VuY3lcbiAqXG4gKiBAcGFyYW0gbGV2ZWwgdGhlIHVyZ2VuY3kgb2YgdGhlIG1lc3NhZ2VcbiAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGxvZyBpbiB0aGUgY29uc29sZVxuICovXG5leHBvcnQgY29uc3QgbG9nID0gKGxldmVsOiBMb2dMZXZlbCwgbWVzc2FnZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gXCJbQHNjcmVlYi9hbmd1bGFyLXNka11cIjtcblxuICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgY2FzZSBcImluZm9cIjpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhgJHtwYWNrYWdlTmFtZX0gJHttZXNzYWdlfWApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBcIndhcm5cIjpcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oYCR7cGFja2FnZU5hbWV9ICR7bWVzc2FnZX1gKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgXCJlcnJvclwiOlxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUuZXJyb3IoYCR7cGFja2FnZU5hbWV9ICR7bWVzc2FnZX1gKTtcbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgY29uc29sZS5sb2coYCR7cGFja2FnZU5hbWV9ICR7bWVzc2FnZX1gKTtcbiAgfVxufTtcbiJdfQ==
@@ -0,0 +1,12 @@
1
+ import { Injectable } from "@angular/core";
2
+ import * as i0 from "@angular/core";
3
+ /** Configuration of Screeb module */
4
+ export class ScreebConfig {
5
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScreebConfig, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
6
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScreebConfig, providedIn: "root" }); }
7
+ }
8
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScreebConfig, decorators: [{
9
+ type: Injectable,
10
+ args: [{ providedIn: "root" }]
11
+ }] });
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyZWViLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3Nkay1hbmd1bGFyL3NyYy9saWIvc2NyZWViLWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQVEzQyxxQ0FBcUM7QUFFckMsTUFBTSxPQUFPLFlBQVk7a0lBQVosWUFBWTtzSUFBWixZQUFZLGNBREMsTUFBTTs7NEZBQ25CLFlBQVk7a0JBRHhCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQge1xuICBIb29rc0luaXQsXG4gIFByb3BlcnR5UmVjb3JkLFxuICBTY3JlZWJPcHRpb25zLFxuICBTcGFOYXZpZ2F0aW9uSGFuZGxlcixcbn0gZnJvbSBcIkBzY3JlZWIvc2RrLWJyb3dzZXJcIjtcblxuLyoqIENvbmZpZ3VyYXRpb24gb2YgU2NyZWViIG1vZHVsZSAqL1xuQEluamVjdGFibGUoeyBwcm92aWRlZEluOiBcInJvb3RcIiB9KVxuZXhwb3J0IGNsYXNzIFNjcmVlYkNvbmZpZyB7XG4gIC8qKiBZb3VyIHdlYnNpdGUvY2hhbm5lbCBpZC4gKi9cbiAgd2Vic2l0ZUlkPzogc3RyaW5nO1xuICAvKiogVGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHlvdXIgdXNlci4gKi9cbiAgdXNlcklkPzogc3RyaW5nO1xuICAvKiogVGhlIHByb3BlcnRpZXMgb2YgeW91ciB1c2VyLiAqL1xuICB1c2VyUHJvcGVydGllcz86IFByb3BlcnR5UmVjb3JkO1xuICAvKiogSG9va3MgdG8gZGVmaW5lIGNhbGxiYWNrIGZvciB2YXJpb3VzIGV2ZW50ICovXG4gIGhvb2tzPzogSG9va3NJbml0O1xuICAvKiogT3B0aW9uYWwgaGFuZGxlciBmb3IgdGhlIGBpbi1wYWdlLXNwYWAgXCJOYXZpZ2F0ZSB0byBVUkxcIiB0YXJnZXQgKGN1c3RvbSBTUEEgcm91dGVycykuICovXG4gIHNwYU5hdmlnYXRpb25IYW5kbGVyPzogU3BhTmF2aWdhdGlvbkhhbmRsZXI7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgU2NyZWViIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGxvYWRlZC5cbiAgICogVGhpcyB3aWxsIHBpbmcgdG8gdGhlIFNjcmVlYiBzZXJ2ZXJzLlxuICAgKlxuICAgKiBAcmVtYXJrcyBpZiBgdHJ1ZWAsICdsb2FkJyBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCBtYW51YWxseS4gQ2FuIGJlIHVzZWQgZm9yIG11bHRpc3RhZ2VkIGVudmlyb25tZW50c1xuICAgKi9cbiAgc2hvdWxkTG9hZD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgU2NyZWViIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGluaXRpYWxpemVkLlxuICAgKlxuICAgKiBAcmVtYXJrcyBpZiBgdHJ1ZWAsICdpbml0JyBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCBtYW51YWxseVxuICAgKiAqL1xuICBhdXRvSW5pdD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTY3JlZWIgdGFnIGluaXRpYWxpemF0aW9uIG9wdGlvbnMuXG4gICAqXG4gICAqIEByZW1hcmtzIHRoaXMgaXMgdXNlZCBpcyByZWFsbHkgcGFydGljdWxhciBjYXNlcywgaGFuZGxlIHdpdGggY2FyZS5cbiAgICogKi9cbiAgb3B0aW9ucz86IFNjcmVlYk9wdGlvbnM7XG59XG4iXX0=
@@ -0,0 +1,444 @@
1
+ import { Inject, Injectable } from "@angular/core";
2
+ import * as _Screeb from "@screeb/sdk-browser";
3
+ import CONSTANTS from "./constants";
4
+ import * as logger from "./logger";
5
+ import { ScreebConfig } from "./screeb-config";
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./screeb-config";
8
+ export class Screeb {
9
+ // eslint-disable-next-line no-unused-vars
10
+ constructor(config) {
11
+ this.config = config;
12
+ this.isInitialized = false;
13
+ }
14
+ async ensureScreeb(functionName, onlyLoaded = false) {
15
+ if (!_Screeb.isLoaded() && !this.config.shouldLoad) {
16
+ const message = "Screeb instance is not loaded because `shouldLoad` is set to `false` in `ScreebModule` configuration.";
17
+ logger.log("warn", message);
18
+ return Promise.reject(message);
19
+ }
20
+ if (!this.isInitialized && !onlyLoaded) {
21
+ const message = [
22
+ `"${functionName}" was called but Screeb has not been initialized yet. `,
23
+ `Please call 'init' before calling '${functionName}' or `,
24
+ "set 'autoInit' to true in the `ScreebModule` configuration.",
25
+ ].join("");
26
+ logger.log("warn", message);
27
+ return Promise.reject(message);
28
+ }
29
+ return Promise.resolve();
30
+ }
31
+ /**
32
+ * Shutdowns current Screeb session.
33
+ *
34
+ * @example
35
+ * ```ts
36
+ * this.screeb.close();
37
+ * ```
38
+ */
39
+ async close() {
40
+ await this.ensureScreeb("close");
41
+ return _Screeb.close();
42
+ }
43
+ /**
44
+ * Prints the actual state information of Screeb tag.
45
+ *
46
+ * @example
47
+ * ```ts
48
+ * this.screeb.debug();
49
+ * // ******************* SCREEB SESSION DEBUG *********************
50
+ * // Screeb channel id: <UUID>
51
+ * // Screeb channel type: widget
52
+ * // Screeb respondent id: <UUID>
53
+ * // Screeb survey id: none
54
+ * // Screeb response id: none
55
+ * //
56
+ * // Screeb current session start: Thu May 04 2023 16:53:49 GMT+0200 (Central European Summer Time)
57
+ * // Screeb current session last activity: Thu May 04 2023 17:41:30 GMT+0200 (Central European Summer Time)
58
+ * //
59
+ * // Screeb targeting engine status: disabled
60
+ * // Screeb targeting engine: 3 surveys
61
+ * //
62
+ * // Detected platform: desktop
63
+ * // Detected locale: en-GB
64
+ * // Detected timezone: -120
65
+ * // **************************************************************
66
+ * ```
67
+ */
68
+ async debug() {
69
+ await this.ensureScreeb("debug");
70
+ return _Screeb.debug();
71
+ }
72
+ /**
73
+ * Tracks a user event.
74
+ *
75
+ * @param eventName The event name.
76
+ * @param eventProperties The properties of your event.
77
+ * ```text Requirements:
78
+ * - Property names must be limited to 128 characters
79
+ * - No more than 1000 attributes
80
+ * - Supported types for values: string, number, boolean and Date.
81
+ * ```
82
+ *
83
+ * @example
84
+ * ```ts
85
+ * this.screeb.eventTrack(
86
+ * "Product added to cart",
87
+ * {
88
+ * product_name: 'Red bike 2021',
89
+ * category: 'sport',
90
+ * color: 'red',
91
+ * price: 299,
92
+ * count: 1,
93
+ * reference: '2CF093TG1',
94
+ * delivery_method: 'UPS',
95
+ * user_logged: false,
96
+ * added_at: new Date(),
97
+ * }
98
+ * );
99
+ * ```
100
+ */
101
+ async eventTrack(eventName, eventProperties) {
102
+ await this.ensureScreeb("eventTrack");
103
+ return _Screeb.eventTrack(eventName, eventProperties);
104
+ }
105
+ /**
106
+ * Change the current user identity.
107
+ * Warning: Running surveys will be closed.
108
+ *
109
+ * @param userId The unique identifier of your user.
110
+ * @param userProperties The properties of your user.
111
+ * ```text Requirements:
112
+ * - Property names must be limited to 128 characters
113
+ * - No more than 1000 attributes
114
+ * - Supported types for values: string, number, boolean and Date.
115
+ * ```
116
+ *
117
+ * @example
118
+ * ```ts
119
+ * this.screeb.identity(
120
+ * "<your-user-id>",
121
+ * {
122
+ * firstname: '<user-firstname>',
123
+ * lastname: '<user-lastname>',
124
+ * plan: '<user-plan>',
125
+ * last_seen_at: new Date(),
126
+ * authenticated: true
127
+ * }
128
+ * );
129
+ * ```
130
+ */
131
+ async identity(userId, userProperties) {
132
+ await this.ensureScreeb("identity");
133
+ return _Screeb.identity(userId, userProperties);
134
+ }
135
+ /**
136
+ * Retrieves the current user identity.
137
+ *
138
+ * @example
139
+ * ```ts
140
+ * console.log(await this.screeb.identityGet());
141
+ * // {
142
+ * // channel_id: "<UUID>",
143
+ * // anonymous_id: "<UUID>",
144
+ * // user_id: "<UUID>",
145
+ * // is_ready: true,
146
+ * // session_id: "<UUID>",
147
+ * // session_start: "2023-05-04T16:30:15.882Z",
148
+ * // session_end: "2023-05-04T17:02:09.087Z",
149
+ * // }
150
+ * ```
151
+ */
152
+ async identityGet() {
153
+ await this.ensureScreeb("identityGet");
154
+ return _Screeb.identityGet();
155
+ }
156
+ /**
157
+ * Assigns the current user to a group.
158
+ *
159
+ * @param groupName
160
+ * @param groupType
161
+ * @param groupProperties The properties of your user group.
162
+ * ```text Requirements:
163
+ * - Property names must be limited to 128 characters
164
+ * - No more than 1000 attributes
165
+ * - Supported types for values: string, number, boolean and Date.
166
+ * ```
167
+ *
168
+ * @example
169
+ * ```ts
170
+ * this.screeb.identityGroupAssign(
171
+ * 'company',
172
+ * 'Apple',
173
+ * {
174
+ * address_line_1: 'Apple Campus',
175
+ * address_line_2: '1 Infinite Loop',
176
+ * city: 'Cupertino',
177
+ * zipcode: 95014,
178
+ * state: 'California',
179
+ * country: 'United states',
180
+ * }
181
+ * );
182
+ * ```
183
+ */
184
+ async identityGroupAssign(groupName, groupType, groupProperties) {
185
+ await this.ensureScreeb("identityGroupAssign");
186
+ return _Screeb.identityGroupAssign(groupName, groupType, groupProperties);
187
+ }
188
+ /**
189
+ * Unassigns the current user to a group.
190
+ *
191
+ * @param groupName The name of your user group.
192
+ * @param groupType The type of your user group.
193
+ *
194
+ * @example
195
+ * ```ts
196
+ * this.screeb.identityGroupUnassign('company', 'Apple');
197
+ * ```
198
+ */
199
+ async identityGroupUnassign(groupName, groupType) {
200
+ await this.ensureScreeb("identityGroupUnassign");
201
+ return _Screeb.identityGroupUnassign(groupName, groupType);
202
+ }
203
+ /**
204
+ * Adds properties to the current user identity.
205
+ *
206
+ * @param userProperties The properties of your user.
207
+ * ```text Requirements:
208
+ * - Property names must be limited to 128 characters
209
+ * - No more than 1000 attributes
210
+ * - Supported types for values: string, number, boolean and Date.
211
+ * ```
212
+ *
213
+ * @example
214
+ * ```ts
215
+ * // Set user properties
216
+ * this.screeb.identityProperties(
217
+ * {
218
+ * firstname: '<user-firstname>',
219
+ * lastname: '<user-lastname>',
220
+ * plan: '<user-plan>',
221
+ * last_seen_at: new Date(),
222
+ * authenticated: true
223
+ * }
224
+ * );
225
+ *
226
+ * // Delete user property : set values to null
227
+ * this.screeb.identityProperties(
228
+ * {
229
+ * age: null,
230
+ * company: null,
231
+ * logged: true,
232
+ * }
233
+ * );
234
+ * ```
235
+ */
236
+ async identityProperties(userProperties) {
237
+ await this.ensureScreeb("identityProperties");
238
+ return _Screeb.identityProperties(userProperties);
239
+ }
240
+ /**
241
+ * Resets the current user identity.
242
+ * Warning: This command must be called only once, since it creates a new identity on Screeb side.
243
+ *
244
+ * @example
245
+ * ```ts
246
+ * this.screeb.identityReset();
247
+ * ```
248
+ */
249
+ async identityReset() {
250
+ await this.ensureScreeb("identityReset");
251
+ return _Screeb.identityReset();
252
+ }
253
+ /**
254
+ * Interrupts a running survey.
255
+ *
256
+ * @example
257
+ * ```ts
258
+ * this.screeb.surveyClose();
259
+ * ```
260
+ */
261
+ async surveyClose() {
262
+ await this.ensureScreeb("surveyClose");
263
+ return _Screeb.surveyClose();
264
+ }
265
+ /**
266
+ * Starts a survey by its ID.
267
+ *
268
+ * @example
269
+ * ```ts
270
+ * this.screeb.surveyStart(
271
+ * '<UUID>',
272
+ * '<UUID>',
273
+ * false,
274
+ * { // optional
275
+ * color: "green",
276
+ * article_id: 42
277
+ * },
278
+ * { // optional
279
+ * version: "1.0.0",
280
+ * onSurveyShowed: (payload) => console.log("Survey showed", payload),
281
+ * },
282
+ * "en", // optional
283
+ * "#screeb-survey-container" // optional
284
+ * );
285
+ * ```
286
+ */
287
+ async surveyStart(surveyId, distributionId, allowMultipleResponses, hiddenFields, hooks, language, selectors) {
288
+ await this.ensureScreeb("surveyStart");
289
+ return _Screeb.surveyStart(surveyId, distributionId, allowMultipleResponses, hiddenFields, hooks, language, selectors);
290
+ }
291
+ /**
292
+ * Interrupts a running message.
293
+ *
294
+ * @example
295
+ * ```ts
296
+ * this.screeb.messageClose();
297
+ * ```
298
+ */
299
+ async messageClose() {
300
+ await this.ensureScreeb("messageClose");
301
+ return _Screeb.messageClose();
302
+ }
303
+ /**
304
+ * Starts a message by its ID.
305
+ *
306
+ * @example
307
+ * ```ts
308
+ * this.screeb.messageStart(
309
+ * '<UUID>',
310
+ * false,
311
+ * {
312
+ * color: "green",
313
+ * article_id: 42
314
+ * },
315
+ * {
316
+ * version: "1.0.0",
317
+ * onMessageShowed: (payload) => console.log("Message showed", payload),
318
+ * },
319
+ * "en"
320
+ * );
321
+ * ```
322
+ */
323
+ async messageStart(messageId, allowMultipleResponses = true, hiddenFields, hooks, language) {
324
+ await this.ensureScreeb("messageStart");
325
+ return _Screeb.messageStart(messageId, allowMultipleResponses, hiddenFields, hooks, language);
326
+ }
327
+ /**
328
+ * Interrupts a running session replay.
329
+ *
330
+ * @example
331
+ * ```ts
332
+ * this.screeb.sessionReplayStop();
333
+ * ```
334
+ */
335
+ async sessionReplayStop() {
336
+ await this.ensureScreeb("sessionReplayStop");
337
+ return _Screeb.sessionReplayStop();
338
+ }
339
+ /**
340
+ * Starts a session replay.
341
+ *
342
+ * @example
343
+ * ```ts
344
+ * this.screeb.sessionReplayStart();
345
+ * ```
346
+ */
347
+ async sessionReplayStart() {
348
+ await this.ensureScreeb("sessionReplayStart");
349
+ return _Screeb.sessionReplayStart();
350
+ }
351
+ /**
352
+ * Prints the current state of the targeting engine.
353
+ *
354
+ * @example
355
+ * ```ts
356
+ * console.log(await this.screeb.targetingDebug());
357
+ * // targeting ************ SCREEB TARGETING RULES DEBUG **************
358
+ * // Disabled surveys are not listed here.
359
+ * //
360
+ * // Screeb channel id: <UUID>
361
+ * // Screeb respondent id: <UUID>
362
+ * //
363
+ * // Survey <UUID>:
364
+ * // https://admin.screeb.app/org/last/survey/<UUID>/share
365
+ * //
366
+ * // - Rule of type "Device type (desktop/mobile/tablet)": true 🟢
367
+ * // - Rule of type "Multiple display": true 🟢
368
+ * // - Rule of type "Capping per time between survey display on current respondent": true 🟢
369
+ * // - Rule of type "User event count": false 🔴
370
+ * // - Rule of type "Capping per respondent display count": false 🔴
371
+ * ```
372
+ */
373
+ async targetingDebug() {
374
+ await this.ensureScreeb("targetingDebug");
375
+ return _Screeb.targetingDebug();
376
+ }
377
+ /**
378
+ * Initializes Screeb tag.
379
+ *
380
+ * @param websiteId Your website/channel id.
381
+ * @param userId The unique identifier of your user.
382
+ * @param userProperties The properties of your user.
383
+ * ```text Requirements:
384
+ * - Property names must be limited to 128 characters
385
+ * - No more than 1000 attributes
386
+ * - Supported types for values: string, number, boolean and Date
387
+ * ```
388
+ * @param language Force a specific language for the tag. eg: 'en'. default: browser language.
389
+ *
390
+ * @example
391
+ * ```ts
392
+ * this.screeb.init(
393
+ * "<your-website-id>",
394
+ * "<your-user-id>",
395
+ * {
396
+ * firstname: '<user-firstname>',
397
+ * lastname: '<user-lastname>',
398
+ * plan: '<user-plan>',
399
+ * last_seen_at: new Date(),
400
+ * authenticated: true
401
+ * },
402
+ * {
403
+ * version: "1.0.0",
404
+ * onReady: (payload) => console.log("Screeb SDK is ready!", payload),
405
+ * },
406
+ * "en"
407
+ * );
408
+ * ```
409
+ */
410
+ async init(websiteId, userId, userProperties, hooks, language, spaNavigationHandler) {
411
+ await this.ensureScreeb("init", true);
412
+ this.isInitialized = true;
413
+ return await _Screeb.init(websiteId, userId, userProperties, hooks, language, spaNavigationHandler);
414
+ }
415
+ /**
416
+ * Appends Screeb tag into your dom.
417
+ *
418
+ * @param options Screeb module options.
419
+ * @param options.window If you're running Screeb tag in an iframe, please set the inner window here.
420
+ * @param options.screebEndpoint Please don't do this.
421
+ *
422
+ * @example
423
+ * ```ts
424
+ * this.screeb.load();
425
+ * ```
426
+ */
427
+ async load(options) {
428
+ return _Screeb.load({
429
+ sdkName: "sdk-angular",
430
+ sdkVersion: CONSTANTS.version,
431
+ ...options,
432
+ });
433
+ }
434
+ /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Screeb, deps: [{ token: ScreebConfig }], target: i0.ɵɵFactoryTarget.Injectable }); }
435
+ /** @nocollapse */ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Screeb, providedIn: "root" }); }
436
+ }
437
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Screeb, decorators: [{
438
+ type: Injectable,
439
+ args: [{ providedIn: "root" }]
440
+ }], ctorParameters: function () { return [{ type: i1.ScreebConfig, decorators: [{
441
+ type: Inject,
442
+ args: [ScreebConfig]
443
+ }] }]; } });
444
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NyZWViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvc2RrLWFuZ3VsYXIvc3JjL2xpYi9zY3JlZWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxLQUFLLE9BQU8sTUFBTSxxQkFBcUIsQ0FBQztBQUUvQyxPQUFPLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDcEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7QUFHL0MsTUFBTSxPQUFPLE1BQU07SUFHakIsMENBQTBDO0lBQzFDLFlBQTBDLE1BQW9CO1FBQXBCLFdBQU0sR0FBTixNQUFNLENBQWM7UUFIdEQsa0JBQWEsR0FBRyxLQUFLLENBQUM7SUFHbUMsQ0FBQztJQUUxRCxLQUFLLENBQUMsWUFBWSxDQUFDLFlBQW9CLEVBQUUsVUFBVSxHQUFHLEtBQUs7UUFDakUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFO1lBQ2xELE1BQU0sT0FBTyxHQUNYLHVHQUF1RyxDQUFDO1lBRTFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBRTVCLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUNoQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3RDLE1BQU0sT0FBTyxHQUFHO2dCQUNkLElBQUksWUFBWSx3REFBd0Q7Z0JBQ3hFLHNDQUFzQyxZQUFZLE9BQU87Z0JBQ3pELDZEQUE2RDthQUM5RCxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUVYLE1BQU0sQ0FBQyxH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QUFPLE9BQU8sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBQ0ksS0FBSyxDQUFDLGNBQWM7UUFDekIsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFFMUMsT0FBTyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWdDRztJQUNJLEtBQUssQ0FBQyxJQUFJLENBQ2YsU0FBaUIsRUFDakIsTUFBZSxFQUNmLGNBQXVDLEVBQ3ZDLEtBQXlCLEVBQ3pCLFFBQWlCLEVBQ2pCLG9CQUFtRDtRQUVuRCxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXRDLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLE9BQU8sTUFBTSxPQUFPLENBQUMsSUFBSSxDQUN2QixTQUFTLEVBQ1QsTUFBTSxFQUNOLGNBQWMsRUFDZCxLQUFLLEVBQ0wsUUFBUSxFQUNSLG9CQUFvQixDQUNyQixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxPQUErQjtRQUMvQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLGFBQWE7WUFDdEIsVUFBVSxFQUFFLFNBQVMsQ0FBQyxPQUFPO1lBQzdCLEdBQUcsT0FBTztTQUNYLENBQUMsQ0FBQztJQUNMLENBQUM7a0lBdGdCVSxNQUFNLGtCQUlHLFlBQVk7c0lBSnJCLE1BQU0sY0FETyxNQUFNOzs0RkFDbkIsTUFBTTtrQkFEbEIsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQUtuQixNQUFNOzJCQUFDLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0ICogYXMgX1NjcmVlYiBmcm9tIFwiQHNjcmVlYi9zZGstYnJvd3NlclwiO1xuXG5pbXBvcnQgQ09OU1RBTlRTIGZyb20gXCIuL2NvbnN0YW50c1wiO1xuaW1wb3J0ICogYXMgbG9nZ2VyIGZyb20gXCIuL2xvZ2dlclwiO1xuaW1wb3J0IHsgU2NyZWViQ29uZmlnIH0gZnJvbSBcIi4vc2NyZWViLWNvbmZpZ1wiO1xuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgU2NyZWViIHtcbiAgcHJpdmF0ZSBpc0luaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoU2NyZWViQ29uZmlnKSBwcml2YXRlIGNvbmZpZzogU2NyZWViQ29uZmlnKSB7fVxuXG4gIHByaXZhdGUgYXN5bmMgZW5zdXJlU2NyZWViKGZ1bmN0aW9uTmFtZTogc3RyaW5nLCBvbmx5TG9hZGVkID0gZmFsc2UpIHtcbiAgICBpZiAoIV9TY3JlZWIuaXNMb2FkZWQoKSAmJiAhdGhpcy5jb25maWcuc2hvdWxkTG9hZCkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIFwiU2NyZWViIGluc3RhbmNlIGlzIG5vdCBsb2FkZWQgYmVjYXVzZSBgc2hvdWxkTG9hZGAgaXMgc2V0IHRvIGBmYWxzZWAgaW4gYFNjcmVlYk1vZHVsZWAgY29uZmlndXJhdGlvbi5cIjtcblxuICAgICAgbG9nZ2VyLmxvZyhcIndhcm5cIiwgbWVzc2FnZSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChtZXNzYWdlKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgIW9ubHlMb2FkZWQpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBbXG4gICAgICAgIGBcIiR7ZnVuY3Rpb25OYW1lfVwiIHdhcyBjYWxsZWQgYnV0IFNjcmVlYiBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LiBgLFxuICAgICAgICBgUGxlYXNlIGNhbGwgJ2luaXQnIGJlZm9yZSBjYWxsaW5nICcke2Z1bmN0aW9uTmFtZX0nIG9yIGAsXG4gICAgICAgIFwic2V0ICdhdXRvSW5pdCcgdG8gdHJ1ZSBpbiB0aGUgYFNjcmVlYk1vZHVsZWAgY29uZmlndXJhdGlvbi5cIixcbiAgICAgIF0uam9pbihcIlwiKTtcblxuICAgICAgbG9nZ2VyLmxvZyhcIndhcm5cIiwgbWVzc2FnZSk7XG5cbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChtZXNzYWdlKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNodXRkb3ducyBjdXJyZW50IFNjcmVlYiBzZXNzaW9uLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5jbG9zZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBjbG9zZSgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNjcmVlYihcImNsb3NlXCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuY2xvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmludHMgdGhlIGFjdHVhbCBzdGF0ZSBpbmZvcm1hdGlvbiBvZiBTY3JlZWIgdGFnLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5kZWJ1ZygpO1xuICAgKiAvLyAqKioqKioqKioqKioqKioqKioqIFNDUkVFQiBTRVNTSU9OIERFQlVHICoqKioqKioqKioqKioqKioqKioqKlxuICAgKiAvLyBTY3JlZWIgY2hhbm5lbCBpZDogPFVVSUQ+XG4gICAqIC8vIFNjcmVlYiBjaGFubmVsIHR5cGU6IHdpZGdldFxuICAgKiAvLyBTY3JlZWIgcmVzcG9uZGVudCBpZDogPFVVSUQ+XG4gICAqIC8vIFNjcmVlYiBzdXJ2ZXkgaWQ6IG5vbmVcbiAgICogLy8gU2NyZWViIHJlc3BvbnNlIGlkOiBub25lXG4gICAqIC8vXG4gICAqIC8vIFNjcmVlYiBjdXJyZW50IHNlc3Npb24gc3RhcnQ6IFRodSBNYXkgMDQgMjAyMyAxNjo1Mzo0OSBHTVQrMDIwMCAoQ2VudHJhbCBFdXJvcGVhbiBTdW1tZXIgVGltZSlcbiAgICogLy8gU2NyZWViIGN1cnJlbnQgc2Vzc2lvbiBsYXN0IGFjdGl2aXR5OiBUaHUgTWF5IDA0IDIwMjMgMTc6NDE6MzAgR01UKzAyMDAgKENlbnRyYWwgRXVyb3BlYW4gU3VtbWVyIFRpbWUpXG4gICAqIC8vXG4gICAqIC8vIFNjcmVlYiB0YXJnZXRpbmcgZW5naW5lIHN0YXR1czogZGlzYWJsZWRcbiAgICogLy8gU2NyZWViIHRhcmdldGluZyBlbmdpbmU6IDMgc3VydmV5c1xuICAgKiAvL1xuICAgKiAvLyBEZXRlY3RlZCBwbGF0Zm9ybTogZGVza3RvcFxuICAgKiAvLyBEZXRlY3RlZCBsb2NhbGU6IGVuLUdCXG4gICAqIC8vIERldGVjdGVkIHRpbWV6b25lOiAtMTIwXG4gICAqIC8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGRlYnVnKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2NyZWViKFwiZGVidWdcIik7XG5cbiAgICByZXR1cm4gX1NjcmVlYi5kZWJ1ZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWNrcyBhIHVzZXIgZXZlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUuXG4gICAqIEBwYXJhbSBldmVudFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgeW91ciBldmVudC5cbiAgICogYGBgdGV4dCBSZXF1aXJlbWVudHM6XG4gICAqICAgLSBQcm9wZXJ0eSBuYW1lcyBtdXN0IGJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnNcbiAgICogICAtIE5vIG1vcmUgdGhhbiAxMDAwIGF0dHJpYnV0ZXNcbiAgICogICAtIFN1cHBvcnRlZCB0eXBlcyBmb3IgdmFsdWVzOiBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiBhbmQgRGF0ZS5cbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHRoaXMuc2NyZWViLmV2ZW50VHJhY2soXG4gICAqICAgXCJQcm9kdWN0IGFkZGVkIHRvIGNhcnRcIixcbiAgICogICB7XG4gICAqICAgICBwcm9kdWN0X25hbWU6ICdSZWQgYmlrZSAyMDIxJyxcbiAgICogICAgIGNhdGVnb3J5OiAnc3BvcnQnLFxuICAgKiAgICAgY29sb3I6ICdyZWQnLFxuICAgKiAgICAgcHJpY2U6IDI5OSxcbiAgICogICAgIGNvdW50OiAxLFxuICAgKiAgICAgcmVmZXJlbmNlOiAnMkNGMDkzVEcxJyxcbiAgICogICAgIGRlbGl2ZXJ5X21ldGhvZDogJ1VQUycsXG4gICAqICAgICB1c2VyX2xvZ2dlZDogZmFsc2UsXG4gICAqICAgICBhZGRlZF9hdDogbmV3IERhdGUoKSxcbiAgICogICB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGV2ZW50VHJhY2soXG4gICAgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgZXZlbnRQcm9wZXJ0aWVzPzogX1NjcmVlYi5Qcm9wZXJ0eVJlY29yZFxuICApIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNjcmVlYihcImV2ZW50VHJhY2tcIik7XG5cbiAgICByZXR1cm4gX1NjcmVlYi5ldmVudFRyYWNrKGV2ZW50TmFtZSwgZXZlbnRQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2UgdGhlIGN1cnJlbnQgdXNlciBpZGVudGl0eS5cbiAgICogV2FybmluZzogUnVubmluZyBzdXJ2ZXlzIHdpbGwgYmUgY2xvc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdXNlcklkIFRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB5b3VyIHVzZXIuXG4gICAqIEBwYXJhbSB1c2VyUHJvcGVydGllcyBUaGUgcHJvcGVydGllcyBvZiB5b3VyIHVzZXIuXG4gICAqIGBgYHRleHQgUmVxdWlyZW1lbnRzOlxuICAgKiAgIC0gUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBsaW1pdGVkIHRvIDEyOCBjaGFyYWN0ZXJzXG4gICAqICAgLSBObyBtb3JlIHRoYW4gMTAwMCBhdHRyaWJ1dGVzXG4gICAqICAgLSBTdXBwb3J0ZWQgdHlwZXMgZm9yIHZhbHVlczogc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4gYW5kIERhdGUuXG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5pZGVudGl0eShcbiAgICogICBcIjx5b3VyLXVzZXItaWQ+XCIsXG4gICAqICAge1xuICAgKiAgICAgZmlyc3RuYW1lOiAnPHVzZXItZmlyc3RuYW1lPicsXG4gICAqICAgICBsYXN0bmFtZTogJzx1c2VyLWxhc3RuYW1lPicsXG4gICAqICAgICBwbGFuOiAnPHVzZXItcGxhbj4nLFxuICAgKiAgICAgbGFzdF9zZWVuX2F0OiBuZXcgRGF0ZSgpLFxuICAgKiAgICAgYXV0aGVudGljYXRlZDogdHJ1ZVxuICAgKiAgIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaWRlbnRpdHkoXG4gICAgdXNlcklkOiBzdHJpbmcsXG4gICAgdXNlclByb3BlcnRpZXM/OiBfU2NyZWViLlByb3BlcnR5UmVjb3JkXG4gICkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2NyZWViKFwiaWRlbnRpdHlcIik7XG5cbiAgICByZXR1cm4gX1NjcmVlYi5pZGVudGl0eSh1c2VySWQsIHVzZXJQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgdXNlciBpZGVudGl0eS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogY29uc29sZS5sb2coYXdhaXQgdGhpcy5zY3JlZWIuaWRlbnRpdHlHZXQoKSk7XG4gICAqIC8vIHtcbiAgICogLy8gICBjaGFubmVsX2lkOiBcIjxVVUlEPlwiLFxuICAgKiAvLyAgIGFub255bW91c19pZDogXCI8VVVJRD5cIixcbiAgICogLy8gICB1c2VyX2lkOiBcIjxVVUlEPlwiLFxuICAgKiAvLyAgIGlzX3JlYWR5OiB0cnVlLFxuICAgKiAvLyAgIHNlc3Npb25faWQ6IFwiPFVVSUQ+XCIsXG4gICAqIC8vICAgc2Vzc2lvbl9zdGFydDogXCIyMDIzLTA1LTA0VDE2OjMwOjE1Ljg4MlpcIixcbiAgICogLy8gICBzZXNzaW9uX2VuZDogXCIyMDIzLTA1LTA0VDE3OjAyOjA5LjA4N1pcIixcbiAgICogLy8gfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpZGVudGl0eUdldCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNjcmVlYihcImlkZW50aXR5R2V0XCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuaWRlbnRpdHlHZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3NpZ25zIHRoZSBjdXJyZW50IHVzZXIgdG8gYSBncm91cC5cbiAgICpcbiAgICogQHBhcmFtIGdyb3VwTmFtZVxuICAgKiBAcGFyYW0gZ3JvdXBUeXBlXG4gICAqIEBwYXJhbSBncm91cFByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgeW91ciB1c2VyIGdyb3VwLlxuICAgKiBgYGB0ZXh0IFJlcXVpcmVtZW50czpcbiAgICogICAtIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgbGltaXRlZCB0byAxMjggY2hhcmFjdGVyc1xuICAgKiAgIC0gTm8gbW9yZSB0aGFuIDEwMDAgYXR0cmlidXRlc1xuICAgKiAgIC0gU3VwcG9ydGVkIHR5cGVzIGZvciB2YWx1ZXM6IHN0cmluZywgbnVtYmVyLCBib29sZWFuIGFuZCBEYXRlLlxuICAgKiBgYGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdGhpcy5zY3JlZWIuaWRlbnRpdHlHcm91cEFzc2lnbihcbiAgICogICAnY29tcGFueScsXG4gICAqICAgJ0FwcGxlJyxcbiAgICogICB7XG4gICAqICAgICBhZGRyZXNzX2xpbmVfMTogJ0FwcGxlIENhbXB1cycsXG4gICAqICAgICBhZGRyZXNzX2xpbmVfMjogJzEgSW5maW5pdGUgTG9vcCcsXG4gICAqICAgICBjaXR5OiAnQ3VwZXJ0aW5vJyxcbiAgICogICAgIHppcGNvZGU6IDk1MDE0LFxuICAgKiAgICAgc3RhdGU6ICdDYWxpZm9ybmlhJyxcbiAgICogICAgIGNvdW50cnk6ICdVbml0ZWQgc3RhdGVzJyxcbiAgICogICB9XG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlkZW50aXR5R3JvdXBBc3NpZ24oXG4gICAgZ3JvdXBOYW1lOiBzdHJpbmcsXG4gICAgZ3JvdXBUeXBlPzogc3RyaW5nLFxuICAgIGdyb3VwUHJvcGVydGllcz86IF9TY3JlZWIuUHJvcGVydHlSZWNvcmRcbiAgKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJpZGVudGl0eUdyb3VwQXNzaWduXCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuaWRlbnRpdHlHcm91cEFzc2lnbihncm91cE5hbWUsIGdyb3VwVHlwZSwgZ3JvdXBQcm9wZXJ0aWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmFzc2lnbnMgdGhlIGN1cnJlbnQgdXNlciB0byBhIGdyb3VwLlxuICAgKlxuICAgKiBAcGFyYW0gZ3JvdXBOYW1lIFRoZSBuYW1lIG9mIHlvdXIgdXNlciBncm91cC5cbiAgICogQHBhcmFtIGdyb3VwVHlwZSBUaGUgdHlwZSBvZiB5b3VyIHVzZXIgZ3JvdXAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHRoaXMuc2NyZWViLmlkZW50aXR5R3JvdXBVbmFzc2lnbignY29tcGFueScsICdBcHBsZScpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpZGVudGl0eUdyb3VwVW5hc3NpZ24oZ3JvdXBOYW1lOiBzdHJpbmcsIGdyb3VwVHlwZT86IHN0cmluZykge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2NyZWViKFwiaWRlbnRpdHlHcm91cFVuYXNzaWduXCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuaWRlbnRpdHlHcm91cFVuYXNzaWduKGdyb3VwTmFtZSwgZ3JvdXBUeXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHByb3BlcnRpZXMgdG8gdGhlIGN1cnJlbnQgdXNlciBpZGVudGl0eS5cbiAgICpcbiAgICogQHBhcmFtIHVzZXJQcm9wZXJ0aWVzIFRoZSBwcm9wZXJ0aWVzIG9mIHlvdXIgdXNlci5cbiAgICogYGBgdGV4dCBSZXF1aXJlbWVudHM6XG4gICAqICAgLSBQcm9wZXJ0eSBuYW1lcyBtdXN0IGJlIGxpbWl0ZWQgdG8gMTI4IGNoYXJhY3RlcnNcbiAgICogICAtIE5vIG1vcmUgdGhhbiAxMDAwIGF0dHJpYnV0ZXNcbiAgICogICAtIFN1cHBvcnRlZCB0eXBlcyBmb3IgdmFsdWVzOiBzdHJpbmcsIG51bWJlciwgYm9vbGVhbiBhbmQgRGF0ZS5cbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIC8vIFNldCB1c2VyIHByb3BlcnRpZXNcbiAgICogdGhpcy5zY3JlZWIuaWRlbnRpdHlQcm9wZXJ0aWVzKFxuICAgKiAgIHtcbiAgICogICAgIGZpcnN0bmFtZTogJzx1c2VyLWZpcnN0bmFtZT4nLFxuICAgKiAgICAgbGFzdG5hbWU6ICc8dXNlci1sYXN0bmFtZT4nLFxuICAgKiAgICAgcGxhbjogJzx1c2VyLXBsYW4+JyxcbiAgICogICAgIGxhc3Rfc2Vlbl9hdDogbmV3IERhdGUoKSxcbiAgICogICAgIGF1dGhlbnRpY2F0ZWQ6IHRydWVcbiAgICogICB9XG4gICAqICk7XG4gICAqXG4gICAqIC8vIERlbGV0ZSB1c2VyIHByb3BlcnR5IDogc2V0IHZhbHVlcyB0byBudWxsXG4gICAqIHRoaXMuc2NyZWViLmlkZW50aXR5UHJvcGVydGllcyhcbiAgICogICB7XG4gICAqICAgICBhZ2U6IG51bGwsXG4gICAqICAgICBjb21wYW55OiBudWxsLFxuICAgKiAgICAgbG9nZ2VkOiB0cnVlLFxuICAgKiAgIH1cbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaWRlbnRpdHlQcm9wZXJ0aWVzKHVzZXJQcm9wZXJ0aWVzOiBfU2NyZWViLlByb3BlcnR5UmVjb3JkKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJpZGVudGl0eVByb3BlcnRpZXNcIik7XG5cbiAgICByZXR1cm4gX1NjcmVlYi5pZGVudGl0eVByb3BlcnRpZXModXNlclByb3BlcnRpZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgY3VycmVudCB1c2VyIGlkZW50aXR5LlxuICAgKiBXYXJuaW5nOiBUaGlzIGNvbW1hbmQgbXVzdCBiZSBjYWxsZWQgb25seSBvbmNlLCBzaW5jZSBpdCBjcmVhdGVzIGEgbmV3IGlkZW50aXR5IG9uIFNjcmVlYiBzaWRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5pZGVudGl0eVJlc2V0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlkZW50aXR5UmVzZXQoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJpZGVudGl0eVJlc2V0XCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuaWRlbnRpdHlSZXNldCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVycnVwdHMgYSBydW5uaW5nIHN1cnZleS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdGhpcy5zY3JlZWIuc3VydmV5Q2xvc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgc3VydmV5Q2xvc2UoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJzdXJ2ZXlDbG9zZVwiKTtcblxuICAgIHJldHVybiBfU2NyZWViLnN1cnZleUNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgc3VydmV5IGJ5IGl0cyBJRC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdGhpcy5zY3JlZWIuc3VydmV5U3RhcnQoXG4gICAqICAgJzxVVUlEPicsXG4gICAqICAgJzxVVUlEPicsXG4gICAqICAgZmFsc2UsXG4gICAqICAgeyAvLyBvcHRpb25hbFxuICAgKiAgICAgY29sb3I6IFwiZ3JlZW5cIixcbiAgICogICAgIGFydGljbGVfaWQ6IDQyXG4gICAqICAgfSxcbiAgICogICB7IC8vIG9wdGlvbmFsXG4gICAqICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAqICAgICBvblN1cnZleVNob3dlZDogKHBheWxvYWQpID0+IGNvbnNvbGUubG9nKFwiU3VydmV5IHNob3dlZFwiLCBwYXlsb2FkKSxcbiAgICogICB9LFxuICAgKiAgIFwiZW5cIiwgLy8gb3B0aW9uYWxcbiAgICogICBcIiNzY3JlZWItc3VydmV5LWNvbnRhaW5lclwiIC8vIG9wdGlvbmFsXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHN1cnZleVN0YXJ0KFxuICAgIHN1cnZleUlkOiBzdHJpbmcsXG4gICAgZGlzdHJpYnV0aW9uSWQ6IHN0cmluZyxcbiAgICBhbGxvd011bHRpcGxlUmVzcG9uc2VzOiBib29sZWFuLFxuICAgIGhpZGRlbkZpZWxkcz86IF9TY3JlZWIuUHJvcGVydHlSZWNvcmQsXG4gICAgaG9va3M/OiBfU2NyZWViLkhvb2tzU3VydmV5U3RhcnQsXG4gICAgbGFuZ3VhZ2U/OiBzdHJpbmcsXG4gICAgc2VsZWN0b3JzPzogc3RyaW5nIHwgc3RyaW5nW11cbiAgKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJzdXJ2ZXlTdGFydFwiKTtcblxuICAgIHJldHVybiBfU2NyZWViLnN1cnZleVN0YXJ0KFxuICAgICAgc3VydmV5SWQsXG4gICAgICBkaXN0cmlidXRpb25JZCxcbiAgICAgIGFsbG93TXVsdGlwbGVSZXNwb25zZXMsXG4gICAgICBoaWRkZW5GaWVsZHMsXG4gICAgICBob29rcyxcbiAgICAgIGxhbmd1YWdlLFxuICAgICAgc2VsZWN0b3JzXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcnJ1cHRzIGEgcnVubmluZyBtZXNzYWdlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5tZXNzYWdlQ2xvc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWVzc2FnZUNsb3NlKCkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2NyZWViKFwibWVzc2FnZUNsb3NlXCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIubWVzc2FnZUNsb3NlKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIGEgbWVzc2FnZSBieSBpdHMgSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHRoaXMuc2NyZWViLm1lc3NhZ2VTdGFydChcbiAgICogICAnPFVVSUQ+JyxcbiAgICogICBmYWxzZSxcbiAgICogICB7XG4gICAqICAgICBjb2xvcjogXCJncmVlblwiLFxuICAgKiAgICAgYXJ0aWNsZV9pZDogNDJcbiAgICogICB9LFxuICAgKiAgIHtcbiAgICogICAgIHZlcnNpb246IFwiMS4wLjBcIixcbiAgICogICAgIG9uTWVzc2FnZVNob3dlZDogKHBheWxvYWQpID0+IGNvbnNvbGUubG9nKFwiTWVzc2FnZSBzaG93ZWRcIiwgcGF5bG9hZCksXG4gICAqICAgfSxcbiAgICogICBcImVuXCJcbiAgICogKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbWVzc2FnZVN0YXJ0KFxuICAgIG1lc3NhZ2VJZDogc3RyaW5nLFxuICAgIGFsbG93TXVsdGlwbGVSZXNwb25zZXMgPSB0cnVlLFxuICAgIGhpZGRlbkZpZWxkcz86IF9TY3JlZWIuUHJvcGVydHlSZWNvcmQsXG4gICAgaG9va3M/OiBfU2NyZWViLkhvb2tzTWVzc2FnZVN0YXJ0LFxuICAgIGxhbmd1YWdlPzogc3RyaW5nXG4gICkge1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlU2NyZWViKFwibWVzc2FnZVN0YXJ0XCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIubWVzc2FnZVN0YXJ0KFxuICAgICAgbWVzc2FnZUlkLFxuICAgICAgYWxsb3dNdWx0aXBsZVJlc3BvbnNlcyxcbiAgICAgIGhpZGRlbkZpZWxkcyxcbiAgICAgIGhvb2tzLFxuICAgICAgbGFuZ3VhZ2VcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVycnVwdHMgYSBydW5uaW5nIHNlc3Npb24gcmVwbGF5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiB0aGlzLnNjcmVlYi5zZXNzaW9uUmVwbGF5U3RvcCgpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBzZXNzaW9uUmVwbGF5U3RvcCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNjcmVlYihcInNlc3Npb25SZXBsYXlTdG9wXCIpO1xuXG4gICAgcmV0dXJuIF9TY3JlZWIuc2Vzc2lvblJlcGxheVN0b3AoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgYSBzZXNzaW9uIHJlcGxheS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogdGhpcy5zY3JlZWIuc2Vzc2lvblJlcGxheVN0YXJ0KCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIHNlc3Npb25SZXBsYXlTdGFydCgpIHtcbiAgICBhd2FpdCB0aGlzLmVuc3VyZVNjcmVlYihcInNlc3Npb25SZXBsYXlTdGFydFwiKTtcblxuICAgIHJldHVybiBfU2NyZWViLnNlc3Npb25SZXBsYXlTdGFydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgdGFyZ2V0aW5nIGVuZ2luZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogY29uc29sZS5sb2coYXdhaXQgdGhpcy5zY3JlZWIudGFyZ2V0aW5nRGVidWcoKSk7XG4gICAqIC8vIHRhcmdldGluZyAqKioqKioqKioqKiogU0NSRUVCIFRBUkdFVElORyBSVUxFUyBERUJVRyAqKioqKioqKioqKioqKlxuICAgKiAvLyBEaXNhYmxlZCBzdXJ2ZXlzIGFyZSBub3QgbGlzdGVkIGhlcmUuXG4gICAqIC8vXG4gICAqIC8vIFNjcmVlYiBjaGFubmVsIGlkOiA8VVVJRD5cbiAgICogLy8gU2NyZWViIHJlc3BvbmRlbnQgaWQ6IDxVVUlEPlxuICAgKiAvL1xuICAgKiAvLyBTdXJ2ZXkgPFVVSUQ+OlxuICAgKiAvLyBodHRwczovL2FkbWluLnNjcmVlYi5hcHAvb3JnL2xhc3Qvc3VydmV5LzxVVUlEPi9zaGFyZVxuICAgKiAvL1xuICAgKiAvLyAgIC0gUnVsZSBvZiB0eXBlIFwiRGV2aWNlIHR5cGUgKGRlc2t0b3AvbW9iaWxlL3RhYmxldClcIjogdHJ1ZSDwn5+iXG4gICAqIC8vICAgLSBSdWxlIG9mIHR5cGUgXCJNdWx0aXBsZSBkaXNwbGF5XCI6IHRydWUg8J+folxuICAgKiAvLyAgIC0gUnVsZSBvZiB0eXBlIFwiQ2FwcGluZyBwZXIgdGltZSBiZXR3ZWVuIHN1cnZleSBkaXNwbGF5IG9uIGN1cnJlbnQgcmVzcG9uZGVudFwiOiB0cnVlIPCfn6JcbiAgICogLy8gICAtIFJ1bGUgb2YgdHlwZSBcIlVzZXIgZXZlbnQgY291bnRcIjogZmFsc2Ug8J+UtFxuICAgKiAvLyAgIC0gUnVsZSBvZiB0eXBlIFwiQ2FwcGluZyBwZXIgcmVzcG9uZGVudCBkaXNwbGF5IGNvdW50XCI6IGZhbHNlIPCflLRcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgdGFyZ2V0aW5nRGVidWcoKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJ0YXJnZXRpbmdEZWJ1Z1wiKTtcblxuICAgIHJldHVybiBfU2NyZWViLnRhcmdldGluZ0RlYnVnKCk7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgU2NyZWViIHRhZy5cbiAgICpcbiAgICogQHBhcmFtIHdlYnNpdGVJZCBZb3VyIHdlYnNpdGUvY2hhbm5lbCBpZC5cbiAgICogQHBhcmFtIHVzZXJJZCBUaGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgeW91ciB1c2VyLlxuICAgKiBAcGFyYW0gdXNlclByb3BlcnRpZXMgVGhlIHByb3BlcnRpZXMgb2YgeW91ciB1c2VyLlxuICAgKiBgYGB0ZXh0IFJlcXVpcmVtZW50czpcbiAgICogICAtIFByb3BlcnR5IG5hbWVzIG11c3QgYmUgbGltaXRlZCB0byAxMjggY2hhcmFjdGVyc1xuICAgKiAgIC0gTm8gbW9yZSB0aGFuIDEwMDAgYXR0cmlidXRlc1xuICAgKiAgIC0gU3VwcG9ydGVkIHR5cGVzIGZvciB2YWx1ZXM6IHN0cmluZywgbnVtYmVyLCBib29sZWFuIGFuZCBEYXRlXG4gICAqIGBgYFxuICAgKiBAcGFyYW0gbGFuZ3VhZ2UgRm9yY2UgYSBzcGVjaWZpYyBsYW5ndWFnZSBmb3IgdGhlIHRhZy4gZWc6ICdlbicuIGRlZmF1bHQ6IGJyb3dzZXIgbGFuZ3VhZ2UuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHRoaXMuc2NyZWViLmluaXQoXG4gICAqICAgXCI8eW91ci13ZWJzaXRlLWlkPlwiLFxuICAgKiAgIFwiPHlvdXItdXNlci1pZD5cIixcbiAgICogICB7XG4gICAqICAgICBmaXJzdG5hbWU6ICc8dXNlci1maXJzdG5hbWU+JyxcbiAgICogICAgIGxhc3RuYW1lOiAnPHVzZXItbGFzdG5hbWU+JyxcbiAgICogICAgIHBsYW46ICc8dXNlci1wbGFuPicsXG4gICAqICAgICBsYXN0X3NlZW5fYXQ6IG5ldyBEYXRlKCksXG4gICAqICAgICBhdXRoZW50aWNhdGVkOiB0cnVlXG4gICAqICAgfSxcbiAgICogICB7XG4gICAqICAgICB2ZXJzaW9uOiBcIjEuMC4wXCIsXG4gICAqICAgICBvblJlYWR5OiAocGF5bG9hZCkgPT4gY29uc29sZS5sb2coXCJTY3JlZWIgU0RLIGlzIHJlYWR5IVwiLCBwYXlsb2FkKSxcbiAgICogICB9LFxuICAgKiAgIFwiZW5cIlxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBpbml0KFxuICAgIHdlYnNpdGVJZDogc3RyaW5nLFxuICAgIHVzZXJJZD86IHN0cmluZyxcbiAgICB1c2VyUHJvcGVydGllcz86IF9TY3JlZWIuUHJvcGVydHlSZWNvcmQsXG4gICAgaG9va3M/OiBfU2NyZWViLkhvb2tzSW5pdCxcbiAgICBsYW5ndWFnZT86IHN0cmluZyxcbiAgICBzcGFOYXZpZ2F0aW9uSGFuZGxlcj86IF9TY3JlZWIuU3BhTmF2aWdhdGlvbkhhbmRsZXJcbiAgKSB7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVTY3JlZWIoXCJpbml0XCIsIHRydWUpO1xuXG4gICAgdGhpcy5pc0luaXRpYWxpemVkID0gdHJ1ZTtcblxuICAgIHJldHVybiBhd2FpdCBfU2NyZWViLmluaXQoXG4gICAgICB3ZWJzaXRlSWQsXG4gICAgICB1c2VySWQsXG4gICAgICB1c2VyUHJvcGVydGllcyxcbiAgICAgIGhvb2tzLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICBzcGFOYXZpZ2F0aW9uSGFuZGxlclxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQXBwZW5kcyBTY3JlZWIgdGFnIGludG8geW91ciBkb20uXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFNjcmVlYiBtb2R1bGUgb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMud2luZG93IElmIHlvdSdyZSBydW5uaW5nIFNjcmVlYiB0YWcgaW4gYW4gaWZyYW1lLCBwbGVhc2Ugc2V0IHRoZSBpbm5lciB3aW5kb3cgaGVyZS5cbiAgICogQHBhcmFtIG9wdGlvbnMuc2NyZWViRW5kcG9pbnQgUGxlYXNlIGRvbid0IGRvIHRoaXMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHRzXG4gICAqIHRoaXMuc2NyZWViLmxvYWQoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgbG9hZChvcHRpb25zPzogX1NjcmVlYi5TY3JlZWJPcHRpb25zKSB7XG4gICAgcmV0dXJuIF9TY3JlZWIubG9hZCh7XG4gICAgICBzZGtOYW1lOiBcInNkay1hbmd1bGFyXCIsXG4gICAgICBzZGtWZXJzaW9uOiBDT05TVEFOVFMudmVyc2lvbixcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==