@senior-gestao-empresarial/angular-components 6.12.0-bea9aaec-b4b5-4e5b-b8eb-155b7aa8d5aa → 6.12.0-cdee7359-3bca-4813-b06f-c65cc860eea4

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/bundles/senior-gestao-empresarial-angular-components.umd.js +150 -54
  2. package/bundles/senior-gestao-empresarial-angular-components.umd.js.map +1 -1
  3. package/bundles/senior-gestao-empresarial-angular-components.umd.min.js +2 -2
  4. package/bundles/senior-gestao-empresarial-angular-components.umd.min.js.map +1 -1
  5. package/components/utils/async-lock.d.ts +6 -0
  6. package/components/websocket/index.d.ts +2 -0
  7. package/components/websocket/models/index.d.ts +1 -0
  8. package/components/websocket/protocols/index.d.ts +2 -0
  9. package/components/websocket/websocket.service.d.ts +3 -3
  10. package/esm2015/components/utils/async-lock.js +34 -0
  11. package/esm2015/components/websocket/index.js +2 -1
  12. package/esm2015/components/websocket/models/index.js +2 -0
  13. package/esm2015/components/websocket/models/primitive-manager.js +2 -2
  14. package/esm2015/components/websocket/protocols/index.js +1 -0
  15. package/esm2015/components/websocket/user-information.service.js +2 -2
  16. package/esm2015/components/websocket/websocket.service.js +76 -53
  17. package/esm5/components/utils/async-lock.js +43 -0
  18. package/esm5/components/websocket/index.js +2 -1
  19. package/esm5/components/websocket/models/index.js +2 -0
  20. package/esm5/components/websocket/models/primitive-manager.js +2 -2
  21. package/esm5/components/websocket/protocols/index.js +1 -0
  22. package/esm5/components/websocket/user-information.service.js +2 -2
  23. package/esm5/components/websocket/websocket.service.js +109 -54
  24. package/fesm2015/senior-gestao-empresarial-angular-components.js +109 -54
  25. package/fesm2015/senior-gestao-empresarial-angular-components.js.map +1 -1
  26. package/fesm5/senior-gestao-empresarial-angular-components.js +150 -55
  27. package/fesm5/senior-gestao-empresarial-angular-components.js.map +1 -1
  28. package/package.json +1 -1
  29. package/senior-gestao-empresarial-angular-components.metadata.json +1 -1
@@ -18,7 +18,7 @@ var UserInformationService = /** @class */ (function () {
18
18
  };
19
19
  UserInformationService.prototype.getWebSocketUrl = function () {
20
20
  var baseUrl = getCookie(UserInformationService_1.BASE_URL_COOKIE_KEY);
21
- if (!baseUrl.endsWith('/')) {
21
+ if (baseUrl && !baseUrl.endsWith('/')) {
22
22
  baseUrl += '/';
23
23
  }
24
24
  return baseUrl + 'websocket';
@@ -35,4 +35,4 @@ var UserInformationService = /** @class */ (function () {
35
35
  return UserInformationService;
36
36
  }());
37
37
  export { UserInformationService };
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1pbmZvcm1hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy93ZWJzb2NrZXQvdXNlci1pbmZvcm1hdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUs3QztJQUFBO0tBdUJDOytCQXZCWSxzQkFBc0I7SUFJeEIsNkNBQVksR0FBbkI7UUFDSSxJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsd0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDL0UsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVNLGdEQUFlLEdBQXRCO1FBQ0ksSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLHdCQUFzQixDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDO1FBQy9FLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sZ0RBQWUsR0FBdEI7UUFDSSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsd0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN4QixPQUFPLElBQUksR0FBRyxDQUFDO1NBQ2xCO1FBQ0QsT0FBTyxPQUFPLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7O0lBckJ1QiwwQ0FBbUIsR0FBRyxxQkFBcUIsQ0FBQztJQUM1Qyx1Q0FBZ0IsR0FBRyxrQkFBa0IsQ0FBQzs7SUFGckQsc0JBQXNCO1FBSGxDLFVBQVUsQ0FBQztZQUNSLFVBQVUsRUFBRSxNQUFNO1NBQ3JCLENBQUM7T0FDVyxzQkFBc0IsQ0F1QmxDO2lDQTdCRDtDQTZCQyxBQXZCRCxJQXVCQztTQXZCWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IGdldCBhcyBnZXRDb29raWUgfSBmcm9tICdqcy1jb29raWUnO1xuXG5ASW5qZWN0YWJsZSh7XG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFVzZXJJbmZvcm1hdGlvblNlcnZpY2Uge1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEJBU0VfVVJMX0NPT0tJRV9LRVkgPSAnY29tLnNlbmlvci5iYXNlLnVybCc7XG4gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVE9LRU5fQ09PS0lFX0tFWSA9ICdjb20uc2VuaW9yLnRva2VuJztcblxuICAgIHB1YmxpYyBnZXRBdXRoVG9rZW4oKSB7XG4gICAgICAgIGNvbnN0IGNvb2tpZVZhbHVlID0gZ2V0Q29va2llKFVzZXJJbmZvcm1hdGlvblNlcnZpY2UuVE9LRU5fQ09PS0lFX0tFWSkgfHwgJ3t9JztcbiAgICAgICAgY29uc3QgYXV0aFRva2VuID0gSlNPTi5wYXJzZShjb29raWVWYWx1ZSk7XG4gICAgICAgIHJldHVybiBhdXRoVG9rZW4uYWNjZXNzX3Rva2VuO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUZW5hbnREb21haW4oKSB7XG4gICAgICAgIGNvbnN0IGNvb2tpZVZhbHVlID0gZ2V0Q29va2llKFVzZXJJbmZvcm1hdGlvblNlcnZpY2UuVE9LRU5fQ09PS0lFX0tFWSkgfHwgJ3t9JztcbiAgICAgICAgY29uc3QgYXV0aFRva2VuID0gSlNPTi5wYXJzZShjb29raWVWYWx1ZSk7XG4gICAgICAgIHJldHVybiBhdXRoVG9rZW4udXNlcm5hbWUuc3BsaXQoJ0AnKVsxXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0V2ViU29ja2V0VXJsKCkge1xuICAgICAgICBsZXQgYmFzZVVybCA9IGdldENvb2tpZShVc2VySW5mb3JtYXRpb25TZXJ2aWNlLkJBU0VfVVJMX0NPT0tJRV9LRVkpO1xuICAgICAgICBpZiAoIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgYmFzZVVybCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VVcmwgKyAnd2Vic29ja2V0JztcbiAgICB9XG59XG4iXX0=
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci1pbmZvcm1hdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHNlbmlvci1nZXN0YW8tZW1wcmVzYXJpYWwvYW5ndWxhci1jb21wb25lbnRzLyIsInNvdXJjZXMiOlsiY29tcG9uZW50cy93ZWJzb2NrZXQvdXNlci1pbmZvcm1hdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxHQUFHLElBQUksU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUs3QztJQUFBO0tBdUJDOytCQXZCWSxzQkFBc0I7SUFJeEIsNkNBQVksR0FBbkI7UUFDSSxJQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsd0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxJQUFJLENBQUM7UUFDL0UsSUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMxQyxPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUM7SUFDbEMsQ0FBQztJQUVNLGdEQUFlLEdBQXRCO1FBQ0ksSUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLHdCQUFzQixDQUFDLGdCQUFnQixDQUFDLElBQUksSUFBSSxDQUFDO1FBQy9FLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUMsT0FBTyxTQUFTLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU0sZ0RBQWUsR0FBdEI7UUFDSSxJQUFJLE9BQU8sR0FBRyxTQUFTLENBQUMsd0JBQXNCLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNwRSxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDbkMsT0FBTyxJQUFJLEdBQUcsQ0FBQztTQUNsQjtRQUNELE9BQU8sT0FBTyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDOztJQXJCdUIsMENBQW1CLEdBQUcscUJBQXFCLENBQUM7SUFDNUMsdUNBQWdCLEdBQUcsa0JBQWtCLENBQUM7O0lBRnJELHNCQUFzQjtRQUhsQyxVQUFVLENBQUM7WUFDUixVQUFVLEVBQUUsTUFBTTtTQUNyQixDQUFDO09BQ1csc0JBQXNCLENBdUJsQztpQ0E3QkQ7Q0E2QkMsQUF2QkQsSUF1QkM7U0F2Qlksc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XG5pbXBvcnQgeyBnZXQgYXMgZ2V0Q29va2llIH0gZnJvbSAnanMtY29va2llJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBVc2VySW5mb3JtYXRpb25TZXJ2aWNlIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCQVNFX1VSTF9DT09LSUVfS0VZID0gJ2NvbS5zZW5pb3IuYmFzZS51cmwnO1xuICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IFRPS0VOX0NPT0tJRV9LRVkgPSAnY29tLnNlbmlvci50b2tlbic7XG5cbiAgICBwdWJsaWMgZ2V0QXV0aFRva2VuKCkge1xuICAgICAgICBjb25zdCBjb29raWVWYWx1ZSA9IGdldENvb2tpZShVc2VySW5mb3JtYXRpb25TZXJ2aWNlLlRPS0VOX0NPT0tJRV9LRVkpIHx8ICd7fSc7XG4gICAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IEpTT04ucGFyc2UoY29va2llVmFsdWUpO1xuICAgICAgICByZXR1cm4gYXV0aFRva2VuLmFjY2Vzc190b2tlbjtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VGVuYW50RG9tYWluKCkge1xuICAgICAgICBjb25zdCBjb29raWVWYWx1ZSA9IGdldENvb2tpZShVc2VySW5mb3JtYXRpb25TZXJ2aWNlLlRPS0VOX0NPT0tJRV9LRVkpIHx8ICd7fSc7XG4gICAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IEpTT04ucGFyc2UoY29va2llVmFsdWUpO1xuICAgICAgICByZXR1cm4gYXV0aFRva2VuLnVzZXJuYW1lLnNwbGl0KCdAJylbMV07XG4gICAgfVxuXG4gICAgcHVibGljIGdldFdlYlNvY2tldFVybCgpIHtcbiAgICAgICAgbGV0IGJhc2VVcmwgPSBnZXRDb29raWUoVXNlckluZm9ybWF0aW9uU2VydmljZS5CQVNFX1VSTF9DT09LSUVfS0VZKTtcbiAgICAgICAgaWYgKGJhc2VVcmwgJiYgIWJhc2VVcmwuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgICAgICAgYmFzZVVybCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJhc2VVcmwgKyAnd2Vic29ja2V0JztcbiAgICB9XG59XG4iXX0=
@@ -4,8 +4,9 @@ import { filter, finalize, map, switchMap, take } from 'rxjs/operators';
4
4
  import { Client } from '@stomp/stompjs';
5
5
  import { BehaviorSubject, Subject } from 'rxjs';
6
6
  import * as SockJS from 'sockjs-client';
7
+ import { AsyncLock } from '../utils/async-lock';
7
8
  import { UserInformationService } from './user-information.service';
8
- import { PrimitiveManager } from './models/primitive-manager';
9
+ import { PrimitiveManager } from './models';
9
10
  import * as i0 from "@angular/core";
10
11
  import * as i1 from "./user-information.service";
11
12
  var RECONNECT_INTERVAL_MILLISECONDS = 3000;
@@ -19,6 +20,7 @@ var WebsocketService = /** @class */ (function () {
19
20
  this.error$ = new Subject();
20
21
  this.subscribed$ = new Subject();
21
22
  this.primitiveManagers = new Map();
23
+ this.connectionLock = new AsyncLock();
22
24
  this.debugEnable = false;
23
25
  this.lostConnection = false;
24
26
  }
@@ -32,29 +34,48 @@ var WebsocketService = /** @class */ (function () {
32
34
  * Manually starts the connection
33
35
  */
34
36
  WebsocketService.prototype.connect = function () {
35
- var _this = this;
36
- if (this.isConnected() || this.isConnecting()) {
37
- return;
38
- }
39
- this.lostConnection = false;
40
- var stompConfig = {
41
- webSocketFactory: function () {
42
- return new SockJS(_this.getSubscriptionUrl(), null, {
43
- timeout: CONNECTION_TIMEOUT_MILLISECONDS
44
- });
45
- },
46
- connectionTimeout: CONNECTION_TIMEOUT_MILLISECONDS,
47
- reconnectDelay: RECONNECT_INTERVAL_MILLISECONDS,
48
- debug: this.debug.bind(this),
49
- onConnect: this.handleOnConnected.bind(this),
50
- onDisconnect: this.handleOnDisconnect.bind(this),
51
- onWebSocketClose: this.handleOnWebSocketClose.bind(this),
52
- onStompError: this.handleOnStompError.bind(this),
53
- onWebSocketError: this.handleOnWebSocketError.bind(this)
54
- };
55
- this.debug('Connecting the Webscoket');
56
- this.stompClient = new Client(stompConfig);
57
- this.stompClient.activate();
37
+ return __awaiter(this, void 0, void 0, function () {
38
+ var stompConfig;
39
+ var _this = this;
40
+ return __generator(this, function (_a) {
41
+ switch (_a.label) {
42
+ case 0: return [4 /*yield*/, this.connectionLock.acquire()];
43
+ case 1:
44
+ _a.sent();
45
+ _a.label = 2;
46
+ case 2:
47
+ _a.trys.push([2, , 3, 5]);
48
+ if (this.isConnected() || this.isConnecting()) {
49
+ return [2 /*return*/];
50
+ }
51
+ this.lostConnection = false;
52
+ stompConfig = {
53
+ webSocketFactory: function () {
54
+ return new SockJS(_this.getSubscriptionUrl(), null, {
55
+ timeout: CONNECTION_TIMEOUT_MILLISECONDS
56
+ });
57
+ },
58
+ connectionTimeout: CONNECTION_TIMEOUT_MILLISECONDS,
59
+ reconnectDelay: RECONNECT_INTERVAL_MILLISECONDS,
60
+ debug: this.debug.bind(this),
61
+ onConnect: this.handleOnConnected.bind(this),
62
+ onDisconnect: this.handleOnDisconnect.bind(this),
63
+ onWebSocketClose: this.handleOnWebSocketClose.bind(this),
64
+ onStompError: this.handleOnStompError.bind(this),
65
+ onWebSocketError: this.handleOnWebSocketError.bind(this)
66
+ };
67
+ this.debug('Connecting the Webscoket');
68
+ this.stompClient = new Client(stompConfig);
69
+ this.stompClient.activate();
70
+ return [3 /*break*/, 5];
71
+ case 3: return [4 /*yield*/, this.connectionLock.release()];
72
+ case 4:
73
+ _a.sent();
74
+ return [7 /*endfinally*/];
75
+ case 5: return [2 /*return*/];
76
+ }
77
+ });
78
+ });
58
79
  };
59
80
  /**
60
81
  * Manually disconnect the websocket. The reconnect loop will be stopped.
@@ -66,6 +87,15 @@ var WebsocketService = /** @class */ (function () {
66
87
  return __generator(this, function (_d) {
67
88
  switch (_d.label) {
68
89
  case 0:
90
+ if (!this.isConnected()) {
91
+ return [2 /*return*/];
92
+ }
93
+ return [4 /*yield*/, this.connectionLock.acquire()];
94
+ case 1:
95
+ _d.sent();
96
+ _d.label = 2;
97
+ case 2:
98
+ _d.trys.push([2, , 5, 7]);
69
99
  try {
70
100
  for (_a = __values(this.primitiveManagers.values()), _b = _a.next(); !_b.done; _b = _a.next()) {
71
101
  primitiveManager = _b.value;
@@ -80,15 +110,19 @@ var WebsocketService = /** @class */ (function () {
80
110
  finally { if (e_1) throw e_1.error; }
81
111
  }
82
112
  this.primitiveManagers.clear();
83
- if (!this.stompClient) return [3 /*break*/, 2];
113
+ this.connected$.next(false);
114
+ if (!this.stompClient) return [3 /*break*/, 4];
115
+ this.stompClient.forceDisconnect();
84
116
  return [4 /*yield*/, this.stompClient.deactivate()];
85
- case 1:
117
+ case 3:
86
118
  _d.sent();
87
- this.stompClient = null;
88
- _d.label = 2;
89
- case 2:
90
- this.connected$.next(false);
91
- return [2 /*return*/];
119
+ _d.label = 4;
120
+ case 4: return [3 /*break*/, 7];
121
+ case 5: return [4 /*yield*/, this.connectionLock.release()];
122
+ case 6:
123
+ _d.sent();
124
+ return [7 /*endfinally*/];
125
+ case 7: return [2 /*return*/];
92
126
  }
93
127
  });
94
128
  });
@@ -162,11 +196,12 @@ var WebsocketService = /** @class */ (function () {
162
196
  }
163
197
  var primitiveManager = new PrimitiveManager(domain, service, primitive);
164
198
  this.primitiveManagers.set(key, primitiveManager);
165
- this.connect();
166
- this.onConnect()
167
- .pipe(take(1))
168
- .subscribe(function () {
169
- _this.createStompSubscriptions(primitiveManager);
199
+ this.connect().then(function () {
200
+ _this.onConnect()
201
+ .pipe(take(1))
202
+ .subscribe(function () {
203
+ _this.createStompSubscriptions(primitiveManager);
204
+ });
170
205
  });
171
206
  return primitiveManager
172
207
  .getEventObservable()
@@ -183,7 +218,6 @@ var WebsocketService = /** @class */ (function () {
183
218
  var _this = this;
184
219
  var domain = options.domain, service = options.service, primitive = options.primitive;
185
220
  var key = this.buildPrimitiveManagerKey(domain, service, primitive);
186
- this.connect();
187
221
  return this.onConnect().pipe(take(1), switchMap(function () {
188
222
  if (_this.primitiveManagers.has(key)) {
189
223
  return _this.primitiveManagers
@@ -209,16 +243,17 @@ var WebsocketService = /** @class */ (function () {
209
243
  WebsocketService.prototype.info = function (message) {
210
244
  console.info('WS info: ' + message);
211
245
  };
212
- WebsocketService.prototype.handleOnConnected = function (data) {
213
- this.debug('Webscoket connected', data);
246
+ WebsocketService.prototype.handleOnConnected = function () {
247
+ this.info('Webscoket connected');
214
248
  this.connected$.next(true);
215
249
  if (this.lostConnection) {
216
250
  this.info('Webscoket reconnected, recriating subscriptions');
217
251
  this.handleReconnection();
218
252
  }
219
253
  };
220
- WebsocketService.prototype.handleOnDisconnect = function (data) {
221
- this.debug('Webscoket disconnected', data);
254
+ WebsocketService.prototype.handleOnDisconnect = function () {
255
+ this.info('Webscoket disconnected');
256
+ this.connected$.next(false);
222
257
  this.disconnected$.next();
223
258
  };
224
259
  WebsocketService.prototype.handleOnWebSocketClose = function (data) {
@@ -228,7 +263,6 @@ var WebsocketService = /** @class */ (function () {
228
263
  this.lostConnection = true;
229
264
  };
230
265
  WebsocketService.prototype.handleOnStompError = function (data) {
231
- debugger;
232
266
  this.handleError('StompError', data);
233
267
  if (this.isAuthenticationError(data)) {
234
268
  this.info('Authentication error, recriating subscriptions');
@@ -284,19 +318,40 @@ var WebsocketService = /** @class */ (function () {
284
318
  return domain + "/" + service + "/" + primitive;
285
319
  };
286
320
  WebsocketService.prototype.unsubscribePrimitiveOnFinalize = function (primitiveManager) {
287
- if (primitiveManager.hasObservers()) {
288
- return;
289
- }
290
- primitiveManager.unsubscribe();
291
- var key = this.buildPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
292
- this.primitiveManagers.delete(key);
293
- this.disconnectIfNoMoreObservables();
321
+ return __awaiter(this, void 0, void 0, function () {
322
+ var key;
323
+ return __generator(this, function (_a) {
324
+ switch (_a.label) {
325
+ case 0:
326
+ if (primitiveManager.hasObservers()) {
327
+ return [2 /*return*/];
328
+ }
329
+ primitiveManager.unsubscribe();
330
+ key = this.buildPrimitiveManagerKey(primitiveManager.domain, primitiveManager.service, primitiveManager.primitive);
331
+ this.primitiveManagers.delete(key);
332
+ return [4 /*yield*/, this.disconnectIfNoMoreObservables()];
333
+ case 1:
334
+ _a.sent();
335
+ return [2 /*return*/];
336
+ }
337
+ });
338
+ });
294
339
  };
295
340
  WebsocketService.prototype.disconnectIfNoMoreObservables = function () {
296
- if (this.getObserversCount() === 0) {
297
- this.debug('Manually disconnecting because there are no more observers');
298
- this.disconnect();
299
- }
341
+ return __awaiter(this, void 0, void 0, function () {
342
+ return __generator(this, function (_a) {
343
+ switch (_a.label) {
344
+ case 0:
345
+ if (!(this.getObserversCount() === 0)) return [3 /*break*/, 2];
346
+ this.debug('Manually disconnecting because there are no more observers');
347
+ return [4 /*yield*/, this.disconnect()];
348
+ case 1:
349
+ _a.sent();
350
+ _a.label = 2;
351
+ case 2: return [2 /*return*/];
352
+ }
353
+ });
354
+ });
300
355
  };
301
356
  WebsocketService.prototype.getObserversCount = function () {
302
357
  var observersCount = 0;
@@ -334,4 +389,4 @@ var WebsocketService = /** @class */ (function () {
334
389
  return WebsocketService;
335
390
  }());
336
391
  export { WebsocketService };
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQTZDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDcEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7OztBQUk5RCxJQUFNLCtCQUErQixHQUFHLElBQUksQ0FBQztBQUM3QyxJQUFNLCtCQUErQixHQUFHLElBQUksQ0FBQztBQUs3QztJQWFJLDBCQUE2QixzQkFBOEM7UUFBOUMsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQVoxRCxlQUFVLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDakQsa0JBQWEsR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ3BDLGlCQUFZLEdBQUcsSUFBSSxPQUFPLEVBQVEsQ0FBQztRQUNuQyxXQUFNLEdBQUcsSUFBSSxPQUFPLEVBQWEsQ0FBQztRQUNsQyxnQkFBVyxHQUFHLElBQUksT0FBTyxFQUF5QixDQUFDO1FBRW5ELHNCQUFpQixHQUF1QyxJQUFJLEdBQUcsRUFBaUMsQ0FBQztRQUcxRyxn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TSwyQkFBMkIsR0FBRyxJQUFJLENBQUMsOEJBQThCLENBQ25FLGdCQUFnQixDQUFDLE1BQU0sRUFDdkIsZ0JBQWdCLENBQUMsT0FBTyxFQUN4QixnQkFBZ0IsQ0FBQyxTQUFTLENBQzdCLENBQUM7UUFFRixJQUFNLDBCQUEwQixHQUFHLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyx3QkFBd0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVHLElBQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUFDLDJCQUEyQixFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDbEgsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLDBCQUEwQixFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDdEYsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRU8sNkNBQWtCLEdBQTFCO1FBQ0ksT0FBVSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLGtCQUFlLENBQUM7SUFDM0UsQ0FBQzs7Z0JBalZvRCxzQkFBc0I7OztJQWJsRSxnQkFBZ0I7UUFINUIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLGdCQUFnQixDQStWNUI7MkJBL1dEO0NBK1dDLEFBL1ZELElBK1ZDO1NBL1ZZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENsaWVudCwgRnJhbWVJbXBsLCBTdG9tcENvbmZpZywgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tICdAc3RvbXAvc3RvbXBqcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSAnc29ja2pzLWNsaWVudCc7XHJcbmltcG9ydCB7IFVzZXJJbmZvcm1hdGlvblNlcnZpY2UgfSBmcm9tICcuL3VzZXItaW5mb3JtYXRpb24uc2VydmljZSc7XHJcbmltcG9ydCB7IFByaW1pdGl2ZU1hbmFnZXIgfSBmcm9tICcuL21vZGVscy9wcmltaXRpdmUtbWFuYWdlcic7XHJcbmltcG9ydCB7IE9uRXZlbnRPcHRpb25zIH0gZnJvbSAnLi9wcm90b2NvbHMvb24tZXZlbnQtb3B0aW9ucyc7XHJcbmltcG9ydCB7IFByaW1pdGl2ZUV2ZW50IH0gZnJvbSBcIi4vcHJvdG9jb2xzL3ByaW1pdGl2ZS1ldmVudFwiO1xyXG5cclxuY29uc3QgUkVDT05ORUNUX0lOVEVSVkFMX01JTExJU0VDT05EUyA9IDMwMDA7XHJcbmNvbnN0IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVNFQ09ORFMgPSA1MDAwO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBXZWJzb2NrZXRTZXJ2aWNlIHtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29ubmVjdGVkJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXNjb25uZWN0ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVjb25uZWN0ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgZXJyb3IkID0gbmV3IFN1YmplY3Q8RnJhbWVJbXBsPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpYmVkJCA9IG5ldyBTdWJqZWN0PFByaW1pdGl2ZU1hbmFnZXI8YW55Pj4oKTtcclxuXHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHByaW1pdGl2ZU1hbmFnZXJzOiBNYXA8c3RyaW5nLCBQcmltaXRpdmVNYW5hZ2VyPGFueT4+ID0gbmV3IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI8YW55Pj4oKTtcclxuICAgIFxyXG4gICAgcHJpdmF0ZSBzdG9tcENsaWVudDogQ2xpZW50O1xyXG4gICAgcHJpdmF0ZSBkZWJ1Z0VuYWJsZSA9IGZhbHNlO1xyXG4gICAgcHJpdmF0ZSBsb3N0Q29ubmVjdGlvbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdXNlckluZm9ybWF0aW9uU2VydmljZTogVXNlckluZm9ybWF0aW9uU2VydmljZSkge1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRW5hYmxlcyBzdG9tcGpzIGRlYnVnIGxvZ3MgYW5kIGFkZGl0aW9uYWwgaW5mb1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZW5hYmxlRGVidWdMb2dzKCkge1xyXG4gICAgICAgIHRoaXMuZGVidWdFbmFibGUgPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogTWFudWFsbHkgc3RhcnRzIHRoZSBjb25uZWN0aW9uXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjb25uZWN0KCkge1xyXG4gICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkgfHwgdGhpcy5pc0Nvbm5lY3RpbmcoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmxvc3RDb25uZWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0IHN0b21wQ29uZmlnOiBTdG9tcENvbmZpZyA9IHtcclxuICAgICAgICAgICAgd2ViU29ja2V0RmFjdG9yeTogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTb2NrSlMoXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJzY3JpcHRpb25VcmwoKSxcclxuICAgICAgICAgICAgICAgICAgICBudWxsLFxyXG4gICAgICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogQ09OTkVDVElPTl9USU1FT1VUX01JTExJU0VDT05EU1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNvbm5lY3Rpb25UaW1lb3V0OiBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTRUNPTkRTLFxyXG4gICAgICAgICAgICByZWNvbm5lY3REZWxheTogUkVDT05ORUNUX0lOVEVSVkFMX01JTExJU0VDT05EUyxcclxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgb25Db25uZWN0OiB0aGlzLmhhbmRsZU9uQ29ubmVjdGVkLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIG9uRGlzY29ubmVjdDogdGhpcy5oYW5kbGVPbkRpc2Nvbm5lY3QuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgb25XZWJTb2NrZXRDbG9zZTogdGhpcy5oYW5kbGVPbldlYlNvY2tldENsb3NlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgIG9uU3RvbXBFcnJvcjogdGhpcy5oYW5kbGVPblN0b21wRXJyb3IuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgb25XZWJTb2NrZXRFcnJvcjogdGhpcy5oYW5kbGVPbldlYlNvY2tldEVycm9yLmJpbmQodGhpcylcclxuICAgICAgICB9O1xyXG5cclxuICAgICAgICB0aGlzLmRlYnVnKCdDb25uZWN0aW5nIHRoZSBXZWJzY29rZXQnKTtcclxuXHJcbiAgICAgICAgdGhpcy5zdG9tcENsaWVudCA9IG5ldyBDbGllbnQoc3RvbXBDb25maWcpO1xyXG4gICAgICAgIHRoaXMuc3RvbXBDbGllbnQuYWN0aXZhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE1hbnVhbGx5IGRpc2Nvbm5lY3QgdGhlIHdlYnNvY2tldC4gVGhlIHJlY29ubmVjdCBsb29wIHdpbGwgYmUgc3RvcHBlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci51bnN1YnNjcmliZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5jbGVhcigpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5zdG9tcENsaWVudCkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLnN0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuICAgICAgICAgICAgdGhpcy5zdG9tcENsaWVudCA9IG51bGw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmNvbm5lY3RlZCQubmV4dChmYWxzZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgd2Vic29ja2V0IGlzIGNvbm5lY3RlZFxyXG4gICAgICogQHJldHVybiBgYm9vbGVhbmAgcmVwcmVzZW50aW5nIGlmIHRoZSB3ZWJzb2NrZXQgaXMgY29ubmVjdGVkXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RvbXBDbGllbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvbXBDbGllbnQuY29ubmVjdGVkO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2sgaWYgdGhlIHdlYnNvY2tldCBpcyB0cmluZyB0byBjb25uZWN0XHJcbiAgICAgKiBAcmV0dXJuIGBib29sZWFuYCByZXByZXNlbnRpbmcgaWYgdGhlIHdlYnNvY2tldCBzdGF0dXNcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzQ29ubmVjdGluZygpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAoIXRoaXMuc3RvbXBDbGllbnQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICF0aGlzLnN0b21wQ2xpZW50LmNvbm5lY3RlZCAmJiB0aGlzLnN0b21wQ2xpZW50LmFjdGl2ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHJlc3BvbnNhYmxlIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZC5cclxuICAgICAqIERvIG5vdCBmb3JnZXQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgd2hlbiB5b3UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTxib29sZWFuPmBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uQ29ubmVjdCgpOiBPYnNlcnZhYmxlPGJvb2xlYW4+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5jb25uZWN0ZWQkLmFzT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcihwID0+IHAgPT09IHRydWUpKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHJlc3BvbnNhYmxlIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEByZXR1cm4gYE9ic2VydmFibGU8dm9pZD5gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkRpc2Nvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzY29ubmVjdGVkJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHJlc3BvbnNhYmxlIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyByZWVzdGFibGlzaGVkLlxyXG4gICAgICogRG8gbm90IGZvcmdldCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIHlvdSBkb24ndCBuZWVkIGl0IGFueW1vcmUuXHJcbiAgICAgKiBAcmV0dXJuIGBPYnNlcnZhYmxlPHZvaWQ+YFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25SZWNvbm5lY3QoKTogT2JzZXJ2YWJsZTx2b2lkPiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMucmVjb25uZWN0ZWQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2FibGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIGFuIGVycm9yIG9jdXJyZWQuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEByZXR1cm4gYE9ic2VydmFibGU8RnJhbWVJbXBsPmBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXJyb3IoKTogT2JzZXJ2YWJsZTxGcmFtZUltcGw+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lcnJvciQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCByZXNwb25zaWJsZSB0byBlbWl0IGFuIGV2ZW50IHdoZW4gYSBwcmltaXRpdmUgaXMgY2FsbGVkLlxyXG4gICAgICogRG8gbm90IGZvcmdldCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIHlvdSBkb24ndCBuZWVkIGl0IGFueW1vcmUuXHJcbiAgICAgKiBAdHlwZVBhcmFtIGA8VD5gIE9iamVjdCB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBvYnNlcnZhYmxlIGZvciB0aGUgYGRhdGFgIHByb3BlcnR5LlxyXG4gICAgICogQHBhcmFtIHtPbkV2ZW50T3B0aW9uc30gb3B0aW9ucyBDb25maWd1cmF0aW9ucyBmb3IgdGhlIGV2ZW50LlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTxQcmltaXRpdmVFdmVudDxUPj5gIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbiBldmVudCB3aGVuIHRoZSBzZXJ2aWNlIGNhbGxzIHRoZSBwcmltaXRpdmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvbkV2ZW50PFQ+KG9wdGlvbnM6IE9uRXZlbnRPcHRpb25zKTogT2JzZXJ2YWJsZTxQcmltaXRpdmVFdmVudDxUPj4ge1xyXG4gICAgICAgIGNvbnN0IHsgZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUgfSA9IG9wdGlvbnM7XHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluLCBzZXJ2aWNlLCBwcmltaXRpdmUpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5nZXQoa2V5KS5nZXRFdmVudE9ic2VydmFibGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgPSBuZXcgUHJpbWl0aXZlTWFuYWdlcjxUPihkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcbiAgICAgICAgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5zZXQoa2V5LCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0KCk7XHJcblxyXG4gICAgICAgIHRoaXMub25Db25uZWN0KClcclxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5nZXRFdmVudE9ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLnVuc3Vic2NyaWJlUHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2libGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIGEgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgZm9yIHRoZSBwcmltaXRpdmUuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEBwYXJhbSB7T25FdmVudE9wdGlvbnN9IG9wdGlvbnMgQ29uZmlndXJhdGlvbnMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTxib29sZWFuPmAgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHNlcnZpY2UgY2FsbHMgdGhlIHByaW1pdGl2ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU3Vic2NyaWJlKG9wdGlvbnM6IE9uRXZlbnRPcHRpb25zKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIHRoaXMuY29ubmVjdCgpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLm9uQ29ubmVjdCgpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3Vic2NyaXB0aW9uT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWQkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChwcmltaXRpdmVNYW5hZ2VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0ga2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlKDEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xyXG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdXUyBkZWJ1ZzogJyArIG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdXUyBpbmZvOiAnICsgbWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVPbkNvbm5lY3RlZChkYXRhOiBGcmFtZUltcGwpIHtcclxuICAgICAgICB0aGlzLmRlYnVnKCdXZWJzY29rZXQgY29ubmVjdGVkJywgZGF0YSk7XHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubG9zdENvbm5lY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pbmZvKCdXZWJzY29rZXQgcmVjb25uZWN0ZWQsIHJlY3JpYXRpbmcgc3Vic2NyaXB0aW9ucycpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlY29ubmVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU9uRGlzY29ubmVjdChkYXRhOiBGcmFtZUltcGwpIHtcclxuICAgICAgICB0aGlzLmRlYnVnKCdXZWJzY29rZXQgZGlzY29ubmVjdGVkJywgZGF0YSk7XHJcbiAgICAgICAgdGhpcy5kaXNjb25uZWN0ZWQkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU9uV2ViU29ja2V0Q2xvc2UoZGF0YTogQ2xvc2VFdmVudCkge1xyXG4gICAgICAgIGlmIChkYXRhLndhc0NsZWFuKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5sb3N0Q29ubmVjdGlvbiA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVPblN0b21wRXJyb3IoZGF0YTogRnJhbWVJbXBsKSB7XHJcbiAgICAgICAgZGVidWdnZXI7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcignU3RvbXBFcnJvcicsIGRhdGEpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5pc0F1dGhlbnRpY2F0aW9uRXJyb3IoZGF0YSkpIHtcclxuICAgICAgICAgICAgdGhpcy5pbmZvKCdBdXRoZW50aWNhdGlvbiBlcnJvciwgcmVjcmlhdGluZyBzdWJzY3JpcHRpb25zJyk7XHJcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlUmVjb25uZWN0aW9uKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaXNBdXRoZW50aWNhdGlvbkVycm9yKGRhdGE6IEZyYW1lSW1wbCkge1xyXG4gICAgICAgIGNvbnN0IGVycm9yTWVzc2FnZSA9IGRhdGE/LmhlYWRlcnM/Lm1lc3NhZ2U7XHJcbiAgICAgICAgaWYgKCFlcnJvck1lc3NhZ2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGVycm9yTWVzc2FnZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2ZvcmJpZGRlbmV4Y2VwdGlvbicpICE9PSAtMTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU9uV2ViU29ja2V0RXJyb3IoZGF0YTogYW55KSB7XHJcbiAgICAgICAgdGhpcy5oYW5kbGVFcnJvcignV2ViU29ja2V0RXJyb3InLCBkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZUVycm9yKG9yaWdpbjogc3RyaW5nLCBkYXRhOiBGcmFtZUltcGwpIHtcclxuICAgICAgICBjb25zb2xlLmVycm9yKG9yaWdpbiwgZGF0YSk7XHJcbiAgICAgICAgdGhpcy5lcnJvciQubmV4dChkYXRhKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZVJlY29ubmVjdGlvbigpIHtcclxuICAgICAgICB0aGlzLmxvc3RDb25uZWN0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RQcmltaXRpdmVzKCk7XHJcbiAgICAgICAgdGhpcy5yZWNvbm5lY3RlZCQubmV4dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgcmVjb25uZWN0UHJpbWl0aXZlcygpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGNvbnN0IHByaW1pdGl2ZU1hbmFnZXIgb2YgdGhpcy5wcmltaXRpdmVNYW5hZ2Vycy52YWx1ZXMoKSkge1xyXG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9ucyhwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZFN1YnNjcmlwdGlvblVybFdpdGhUb2tlbihkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgY29uc3QgYXV0aFRva2VuID0gdGhpcy51c2VySW5mb3JtYXRpb25TZXJ2aWNlLmdldEF1dGhUb2tlbigpO1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMudXNlckluZm9ybWF0aW9uU2VydmljZS5nZXRUZW5hbnREb21haW4oKTtcclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHthdXRoVG9rZW59LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IHRlbmFudCA9IHRoaXMudXNlckluZm9ybWF0aW9uU2VydmljZS5nZXRUZW5hbnREb21haW4oKTtcclxuICAgICAgICByZXR1cm4gYC90b3BpYy8ke3RlbmFudH0vJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShkb21haW46IHN0cmluZywgc2VydmljZTogc3RyaW5nLCBwcmltaXRpdmU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICAgICAgcmV0dXJuIGAke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgdW5zdWJzY3JpYmVQcmltaXRpdmVPbkZpbmFsaXplKHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXI8YW55Pikge1xyXG4gICAgICAgIGlmIChwcmltaXRpdmVNYW5hZ2VyLmhhc09ic2VydmVycygpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHByaW1pdGl2ZU1hbmFnZXIudW5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5idWlsZFByaW1pdGl2ZU1hbmFnZXJLZXkocHJpbWl0aXZlTWFuYWdlci5kb21haW4sIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSwgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmUpO1xyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZGVsZXRlKGtleSk7XHJcblxyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdElmTm9Nb3JlT2JzZXJ2YWJsZXMoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGRpc2Nvbm5lY3RJZk5vTW9yZU9ic2VydmFibGVzKCkge1xyXG4gICAgICAgIGlmICh0aGlzLmdldE9ic2VydmVyc0NvdW50KCkgPT09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnTWFudWFsbHkgZGlzY29ubmVjdGluZyBiZWNhdXNlIHRoZXJlIGFyZSBubyBtb3JlIG9ic2VydmVycycpO1xyXG4gICAgICAgICAgICB0aGlzLmRpc2Nvbm5lY3QoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRPYnNlcnZlcnNDb3VudCgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBvYnNlcnZlcnNDb3VudCA9IDA7XHJcblxyXG4gICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuZm9yRWFjaChwcmltaXRpdmVNYW5hZ2VyID0+IHtcclxuICAgICAgICAgICAgb2JzZXJ2ZXJzQ291bnQgKz0gcHJpbWl0aXZlTWFuYWdlci5nZXRPYnNlcnZlcnNDb3VudCgpO1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzQ291bnQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbjxUPihkZXN0aW5hdGlvbjogc3RyaW5nLCBwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyPFQ+KTogU3RvbXBTdWJzY3JpcHRpb24ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnN0b21wQ2xpZW50LnN1YnNjcmliZShkZXN0aW5hdGlvbiwgKG1lc3NhZ2U6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBjb25zdCBldmVudCA9IEpTT04ucGFyc2UobWVzc2FnZS5ib2R5IHx8ICd7fScpO1xyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmZpcmVFdmVudChldmVudCk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnM8VD4ocHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcjxUPik6IHZvaWQge1xyXG4gICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvblVybFdpdGhUb2tlbiA9IHRoaXMuYnVpbGRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4gPSB0aGlzLmdldFN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbihcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5kb21haW4sXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuc2VydmljZSxcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICApO1xyXG5cclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICBjb25zdCBzdG9tcFN1YnNjcmlwdGlvbldpdGhvdXRUb2tlbiA9IHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuLCBwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnN1YnNjcmliZShzdG9tcFN1YnNjcmlwdGlvbldpdGhUb2tlbiwgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4pO1xyXG4gICAgICAgIHRoaXMuc3Vic2NyaWJlZCQubmV4dChwcmltaXRpdmVNYW5hZ2VyKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGdldFN1YnNjcmlwdGlvblVybCgpIHtcclxuICAgICAgICByZXR1cm4gYCR7dGhpcy51c2VySW5mb3JtYXRpb25TZXJ2aWNlLmdldFdlYlNvY2tldFVybCgpfS9zdWJzY3JpcHRpb25gO1xyXG4gICAgfVxyXG59XHJcbiJdfQ==
392
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9Ac2VuaW9yLWdlc3Rhby1lbXByZXNhcmlhbC9hbmd1bGFyLWNvbXBvbmVudHMvIiwic291cmNlcyI6WyJjb21wb25lbnRzL3dlYnNvY2tldC93ZWJzb2NrZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSxNQUFNLEVBQTZDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxLQUFLLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLFVBQVUsQ0FBQzs7O0FBRzVDLElBQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBQzdDLElBQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBSzdDO0lBY0ksMEJBQTZCLHNCQUE4QztRQUE5QywyQkFBc0IsR0FBdEIsc0JBQXNCLENBQXdCO1FBYjFELGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNqRCxrQkFBYSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFDcEMsaUJBQVksR0FBRyxJQUFJLE9BQU8sRUFBUSxDQUFDO1FBQ25DLFdBQU0sR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBQ2xDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFbkQs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VSxJQUFJLENBQUMsc0JBQXNCLENBQUMsZUFBZSxFQUFFLGtCQUFlLENBQUM7SUFDM0UsQ0FBQzs7Z0JBL1ZvRCxzQkFBc0I7OztJQWRsRSxnQkFBZ0I7UUFINUIsVUFBVSxDQUFDO1lBQ1IsVUFBVSxFQUFFLE1BQU07U0FDckIsQ0FBQztPQUNXLGdCQUFnQixDQThXNUI7MkJBOVhEO0NBOFhDLEFBOVdELElBOFdDO1NBOVdZLGdCQUFnQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgZmlsdGVyLCBmaW5hbGl6ZSwgbWFwLCBzd2l0Y2hNYXAsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IENsaWVudCwgRnJhbWVJbXBsLCBTdG9tcENvbmZpZywgU3RvbXBTdWJzY3JpcHRpb24gfSBmcm9tICdAc3RvbXAvc3RvbXBqcyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgKiBhcyBTb2NrSlMgZnJvbSAnc29ja2pzLWNsaWVudCc7XHJcbmltcG9ydCB7IEFzeW5jTG9jayB9IGZyb20gJy4uL3V0aWxzL2FzeW5jLWxvY2snO1xyXG5pbXBvcnQgeyBVc2VySW5mb3JtYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi91c2VyLWluZm9ybWF0aW9uLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBQcmltaXRpdmVNYW5hZ2VyIH0gZnJvbSAnLi9tb2RlbHMnO1xyXG5pbXBvcnQgeyBPbkV2ZW50T3B0aW9ucywgUHJpbWl0aXZlRXZlbnQgfSBmcm9tICcuL3Byb3RvY29scyc7XHJcblxyXG5jb25zdCBSRUNPTk5FQ1RfSU5URVJWQUxfTUlMTElTRUNPTkRTID0gMzAwMDtcclxuY29uc3QgQ09OTkVDVElPTl9USU1FT1VUX01JTExJU0VDT05EUyA9IDUwMDA7XHJcblxyXG5ASW5qZWN0YWJsZSh7XHJcbiAgICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIFdlYnNvY2tldFNlcnZpY2Uge1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0ZWQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IGRpc2Nvbm5lY3RlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSByZWNvbm5lY3RlZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBlcnJvciQgPSBuZXcgU3ViamVjdDxGcmFtZUltcGw+KCk7XHJcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN1YnNjcmliZWQkID0gbmV3IFN1YmplY3Q8UHJpbWl0aXZlTWFuYWdlcjxhbnk+PigpO1xyXG5cclxuICAgIHByaXZhdGUgcmVhZG9ubHkgcHJpbWl0aXZlTWFuYWdlcnM6IE1hcDxzdHJpbmcsIFByaW1pdGl2ZU1hbmFnZXI8YW55Pj4gPSBuZXcgTWFwPHN0cmluZywgUHJpbWl0aXZlTWFuYWdlcjxhbnk+PigpO1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25uZWN0aW9uTG9jayA9IG5ldyBBc3luY0xvY2soKTtcclxuXHJcbiAgICBwcml2YXRlIHN0b21wQ2xpZW50OiBDbGllbnQ7XHJcbiAgICBwcml2YXRlIGRlYnVnRW5hYmxlID0gZmFsc2U7XHJcbiAgICBwcml2YXRlIGxvc3RDb25uZWN0aW9uID0gZmFsc2U7XHJcblxyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB1c2VySW5mb3JtYXRpb25TZXJ2aWNlOiBVc2VySW5mb3JtYXRpb25TZXJ2aWNlKSB7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbmFibGVzIHN0b21wanMgZGVidWcgbG9ncyBhbmQgYWRkaXRpb25hbCBpbmZvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBlbmFibGVEZWJ1Z0xvZ3MoKSB7XHJcbiAgICAgICAgdGhpcy5kZWJ1Z0VuYWJsZSA9IHRydWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBzdGFydHMgdGhlIGNvbm5lY3Rpb25cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzeW5jIGNvbm5lY3QoKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5jb25uZWN0aW9uTG9jay5hY3F1aXJlKCk7XHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmlzQ29ubmVjdGVkKCkgfHwgdGhpcy5pc0Nvbm5lY3RpbmcoKSkge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMubG9zdENvbm5lY3Rpb24gPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHN0b21wQ29uZmlnOiBTdG9tcENvbmZpZyA9IHtcclxuICAgICAgICAgICAgICAgIHdlYlNvY2tldEZhY3Rvcnk6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvY2tKUyhcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRTdWJzY3JpcHRpb25VcmwoKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCxcclxuICAgICAgICAgICAgICAgICAgICAgICAge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dDogQ09OTkVDVElPTl9USU1FT1VUX01JTExJU0VDT05EU1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uVGltZW91dDogQ09OTkVDVElPTl9USU1FT1VUX01JTExJU0VDT05EUyxcclxuICAgICAgICAgICAgICAgIHJlY29ubmVjdERlbGF5OiBSRUNPTk5FQ1RfSU5URVJWQUxfTUlMTElTRUNPTkRTLFxyXG4gICAgICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWcuYmluZCh0aGlzKSxcclxuICAgICAgICAgICAgICAgIG9uQ29ubmVjdDogdGhpcy5oYW5kbGVPbkNvbm5lY3RlZC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgb25EaXNjb25uZWN0OiB0aGlzLmhhbmRsZU9uRGlzY29ubmVjdC5iaW5kKHRoaXMpLFxyXG4gICAgICAgICAgICAgICAgb25XZWJTb2NrZXRDbG9zZTogdGhpcy5oYW5kbGVPbldlYlNvY2tldENsb3NlLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBvblN0b21wRXJyb3I6IHRoaXMuaGFuZGxlT25TdG9tcEVycm9yLmJpbmQodGhpcyksXHJcbiAgICAgICAgICAgICAgICBvbldlYlNvY2tldEVycm9yOiB0aGlzLmhhbmRsZU9uV2ViU29ja2V0RXJyb3IuYmluZCh0aGlzKVxyXG4gICAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgICAgdGhpcy5kZWJ1ZygnQ29ubmVjdGluZyB0aGUgV2Vic2Nva2V0Jyk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLnN0b21wQ2xpZW50ID0gbmV3IENsaWVudChzdG9tcENvbmZpZyk7XHJcbiAgICAgICAgICAgIHRoaXMuc3RvbXBDbGllbnQuYWN0aXZhdGUoKTtcclxuICAgICAgICB9IGZpbmFsbHkge1xyXG4gICAgICAgICAgICBhd2FpdCB0aGlzLmNvbm5lY3Rpb25Mb2NrLnJlbGVhc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBkaXNjb25uZWN0IHRoZSB3ZWJzb2NrZXQuIFRoZSByZWNvbm5lY3QgbG9vcCB3aWxsIGJlIHN0b3BwZWQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCgpKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbkxvY2suYWNxdWlyZSgpO1xyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJpbWl0aXZlTWFuYWdlciBvZiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnVuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMuY2xlYXIoKTtcclxuICAgICAgICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQoZmFsc2UpO1xyXG5cclxuICAgICAgICAgICAgaWYgKHRoaXMuc3RvbXBDbGllbnQpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc3RvbXBDbGllbnQuZm9yY2VEaXNjb25uZWN0KCk7XHJcbiAgICAgICAgICAgICAgICBhd2FpdCB0aGlzLnN0b21wQ2xpZW50LmRlYWN0aXZhdGUoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZmluYWxseSB7XHJcbiAgICAgICAgICAgIGF3YWl0IHRoaXMuY29ubmVjdGlvbkxvY2sucmVsZWFzZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENoZWNrIGlmIHRoZSB3ZWJzb2NrZXQgaXMgY29ubmVjdGVkXHJcbiAgICAgKiBAcmV0dXJuIGBib29sZWFuYCByZXByZXNlbnRpbmcgaWYgdGhlIHdlYnNvY2tldCBpcyBjb25uZWN0ZWRcclxuICAgICAqL1xyXG4gICAgcHVibGljIGlzQ29ubmVjdGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zdG9tcENsaWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9tcENsaWVudC5jb25uZWN0ZWQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDaGVjayBpZiB0aGUgd2Vic29ja2V0IGlzIHRyaW5nIHRvIGNvbm5lY3RcclxuICAgICAqIEByZXR1cm4gYGJvb2xlYW5gIHJlcHJlc2VudGluZyBpZiB0aGUgd2Vic29ja2V0IHN0YXR1c1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaXNDb25uZWN0aW5nKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgIGlmICghdGhpcy5zdG9tcENsaWVudCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gIXRoaXMuc3RvbXBDbGllbnQuY29ubmVjdGVkICYmIHRoaXMuc3RvbXBDbGllbnQuYWN0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2FibGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLlxyXG4gICAgICogRG8gbm90IGZvcmdldCB0byB1bnN1YnNjcmliZSB0aGUgb2JzZXJ2YWJsZSB3aGVuIHlvdSBkb24ndCBuZWVkIGl0IGFueW1vcmUuXHJcbiAgICAgKiBAcmV0dXJuIGBPYnNlcnZhYmxlPGJvb2xlYW4+YFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25Db25uZWN0KCk6IE9ic2VydmFibGU8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbm5lY3RlZCQuYXNPYnNlcnZhYmxlKClcclxuICAgICAgICAgICAgLnBpcGUoZmlsdGVyKHAgPT4gcCA9PT0gdHJ1ZSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2FibGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cclxuICAgICAqIERvIG5vdCBmb3JnZXQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgd2hlbiB5b3UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTx2b2lkPmBcclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRGlzY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNjb25uZWN0ZWQkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2FibGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHJlZXN0YWJsaXNoZWQuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEByZXR1cm4gYE9ic2VydmFibGU8dm9pZD5gXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBvblJlY29ubmVjdCgpOiBPYnNlcnZhYmxlPHZvaWQ+IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5yZWNvbm5lY3RlZCQuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFdmVudCByZXNwb25zYWJsZSB0byBlbWl0IGFuIGV2ZW50IHdoZW4gYW4gZXJyb3Igb2N1cnJlZC5cclxuICAgICAqIERvIG5vdCBmb3JnZXQgdG8gdW5zdWJzY3JpYmUgdGhlIG9ic2VydmFibGUgd2hlbiB5b3UgZG9uJ3QgbmVlZCBpdCBhbnltb3JlLlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTxGcmFtZUltcGw+YFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgb25FcnJvcigpOiBPYnNlcnZhYmxlPEZyYW1lSW1wbD4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yJC5hc09ic2VydmFibGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEV2ZW50IHJlc3BvbnNpYmxlIHRvIGVtaXQgYW4gZXZlbnQgd2hlbiBhIHByaW1pdGl2ZSBpcyBjYWxsZWQuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEB0eXBlUGFyYW0gYDxUPmAgT2JqZWN0IHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIG9ic2VydmFibGUgZm9yIHRoZSBgZGF0YWAgcHJvcGVydHkuXHJcbiAgICAgKiBAcGFyYW0ge09uRXZlbnRPcHRpb25zfSBvcHRpb25zIENvbmZpZ3VyYXRpb25zIGZvciB0aGUgZXZlbnQuXHJcbiAgICAgKiBAcmV0dXJuIGBPYnNlcnZhYmxlPFByaW1pdGl2ZUV2ZW50PFQ+PmAgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHNlcnZpY2UgY2FsbHMgdGhlIHByaW1pdGl2ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uRXZlbnQ8VD4ob3B0aW9uczogT25FdmVudE9wdGlvbnMpOiBPYnNlcnZhYmxlPFByaW1pdGl2ZUV2ZW50PFQ+PiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmhhcyhrZXkpKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmdldChrZXkpLmdldEV2ZW50T2JzZXJ2YWJsZSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgcHJpbWl0aXZlTWFuYWdlciA9IG5ldyBQcmltaXRpdmVNYW5hZ2VyPFQ+KGRvbWFpbiwgc2VydmljZSwgcHJpbWl0aXZlKTtcclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLnNldChrZXksIHByaW1pdGl2ZU1hbmFnZXIpO1xyXG5cclxuICAgICAgICB0aGlzLmNvbm5lY3QoKS50aGVuKCgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5vbkNvbm5lY3QoKVxyXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcclxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zKHByaW1pdGl2ZU1hbmFnZXIpO1xyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcblxyXG4gICAgICAgIHJldHVybiBwcmltaXRpdmVNYW5hZ2VyXHJcbiAgICAgICAgICAgIC5nZXRFdmVudE9ic2VydmFibGUoKVxyXG4gICAgICAgICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLnVuc3Vic2NyaWJlUHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyKSkpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRXZlbnQgcmVzcG9uc2libGUgdG8gZW1pdCBhbiBldmVudCB3aGVuIGEgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQgZm9yIHRoZSBwcmltaXRpdmUuXHJcbiAgICAgKiBEbyBub3QgZm9yZ2V0IHRvIHVuc3Vic2NyaWJlIHRoZSBvYnNlcnZhYmxlIHdoZW4geW91IGRvbid0IG5lZWQgaXQgYW55bW9yZS5cclxuICAgICAqIEBwYXJhbSB7T25FdmVudE9wdGlvbnN9IG9wdGlvbnMgQ29uZmlndXJhdGlvbnMgZm9yIHRoZSBldmVudC5cclxuICAgICAqIE9ic2VydmFibGUgcmVzcG9uc8OhdmVsIHBvciBlbWl0aXIgdW1hIG5vdGlmaWNhw6fDo28gYXDDs3MgbyBzdWJzY3JpYmUgZG8gZXZlbnRvIHBlbGEgcHJpbWVpcmEgdmV6LlxyXG4gICAgICogQHJldHVybiBgT2JzZXJ2YWJsZTxib29sZWFuPmAgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIHNlcnZpY2UgY2FsbHMgdGhlIHByaW1pdGl2ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIG9uU3Vic2NyaWJlKG9wdGlvbnM6IE9uRXZlbnRPcHRpb25zKTogT2JzZXJ2YWJsZTxib29sZWFuPiB7XHJcbiAgICAgICAgY29uc3QgeyBkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSB9ID0gb3B0aW9ucztcclxuICAgICAgICBjb25zdCBrZXkgPSB0aGlzLmJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShkb21haW4sIHNlcnZpY2UsIHByaW1pdGl2ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLm9uQ29ubmVjdCgpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2UoMSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcmltaXRpdmVNYW5hZ2Vycy5oYXMoa2V5KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoa2V5KVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3Vic2NyaXB0aW9uT2JzZXJ2YWJsZSgpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN1YnNjcmliZWQkLmFzT2JzZXJ2YWJsZSgpLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyKChwcmltaXRpdmVNYW5hZ2VyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUHJpbWl0aXZlTWFuYWdlcktleShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5wcmltaXRpdmVcclxuICAgICAgICAgICAgICAgICAgICAgICAgKSA9PT0ga2V5O1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgIG1hcCgoKSA9PiB0cnVlKSxcclxuICAgICAgICAgICAgICAgICAgICB0YWtlKDEpXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBkZWJ1ZyhtZXNzYWdlOiBzdHJpbmcsIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkge1xyXG4gICAgICAgIGlmICghdGhpcy5kZWJ1Z0VuYWJsZSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnNvbGUubG9nKCdXUyBkZWJ1ZzogJyArIG1lc3NhZ2UsIC4uLm9wdGlvbmFsUGFyYW1zKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGluZm8obWVzc2FnZTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKCdXUyBpbmZvOiAnICsgbWVzc2FnZSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVPbkNvbm5lY3RlZCgpIHtcclxuICAgICAgICB0aGlzLmluZm8oJ1dlYnNjb2tldCBjb25uZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgaWYgKHRoaXMubG9zdENvbm5lY3Rpb24pIHtcclxuICAgICAgICAgICAgdGhpcy5pbmZvKCdXZWJzY29rZXQgcmVjb25uZWN0ZWQsIHJlY3JpYXRpbmcgc3Vic2NyaXB0aW9ucycpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlY29ubmVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGhhbmRsZU9uRGlzY29ubmVjdCgpIHtcclxuICAgICAgICB0aGlzLmluZm8oJ1dlYnNjb2tldCBkaXNjb25uZWN0ZWQnKTtcclxuXHJcbiAgICAgICAgdGhpcy5jb25uZWN0ZWQkLm5leHQoZmFsc2UpO1xyXG4gICAgICAgIHRoaXMuZGlzY29ubmVjdGVkJC5uZXh0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVPbldlYlNvY2tldENsb3NlKGRhdGE6IENsb3NlRXZlbnQpIHtcclxuICAgICAgICBpZiAoZGF0YS53YXNDbGVhbikge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMubG9zdENvbm5lY3Rpb24gPSB0cnVlO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgaGFuZGxlT25TdG9tcEVycm9yKGRhdGE6IEZyYW1lSW1wbCkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoJ1N0b21wRXJyb3InLCBkYXRhKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuaXNBdXRoZW50aWNhdGlvbkVycm9yKGRhdGEpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuaW5mbygnQXV0aGVudGljYXRpb24gZXJyb3IsIHJlY3JpYXRpbmcgc3Vic2NyaXB0aW9ucycpO1xyXG4gICAgICAgICAgICB0aGlzLmhhbmRsZVJlY29ubmVjdGlvbigpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGlzQXV0aGVudGljYXRpb25FcnJvcihkYXRhOiBGcmFtZUltcGwpIHtcclxuICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBkYXRhPy5oZWFkZXJzPy5tZXNzYWdlO1xyXG4gICAgICAgIGlmICghZXJyb3JNZXNzYWdlKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlcnJvck1lc3NhZ2UudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmb3JiaWRkZW5leGNlcHRpb24nKSAhPT0gLTE7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVPbldlYlNvY2tldEVycm9yKGRhdGE6IGFueSkge1xyXG4gICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoJ1dlYlNvY2tldEVycm9yJywgZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVFcnJvcihvcmlnaW46IHN0cmluZywgZGF0YTogRnJhbWVJbXBsKSB7XHJcbiAgICAgICAgY29uc29sZS5lcnJvcihvcmlnaW4sIGRhdGEpO1xyXG4gICAgICAgIHRoaXMuZXJyb3IkLm5leHQoZGF0YSk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBoYW5kbGVSZWNvbm5lY3Rpb24oKSB7XHJcbiAgICAgICAgdGhpcy5sb3N0Q29ubmVjdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMucmVjb25uZWN0UHJpbWl0aXZlcygpO1xyXG4gICAgICAgIHRoaXMucmVjb25uZWN0ZWQkLm5leHQoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIHJlY29ubmVjdFByaW1pdGl2ZXMoKTogdm9pZCB7XHJcbiAgICAgICAgZm9yIChjb25zdCBwcmltaXRpdmVNYW5hZ2VyIG9mIHRoaXMucHJpbWl0aXZlTWFuYWdlcnMudmFsdWVzKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jcmVhdGVTdG9tcFN1YnNjcmlwdGlvbnMocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgYnVpbGRTdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4oZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIGNvbnN0IGF1dGhUb2tlbiA9IHRoaXMudXNlckluZm9ybWF0aW9uU2VydmljZS5nZXRBdXRoVG9rZW4oKTtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLnVzZXJJbmZvcm1hdGlvblNlcnZpY2UuZ2V0VGVuYW50RG9tYWluKCk7XHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7YXV0aFRva2VufS8ke2RvbWFpbn0vJHtzZXJ2aWNlfS8ke3ByaW1pdGl2ZX1gO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0U3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuKGRvbWFpbjogc3RyaW5nLCBzZXJ2aWNlOiBzdHJpbmcsIHByaW1pdGl2ZTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgICAgICBjb25zdCB0ZW5hbnQgPSB0aGlzLnVzZXJJbmZvcm1hdGlvblNlcnZpY2UuZ2V0VGVuYW50RG9tYWluKCk7XHJcbiAgICAgICAgcmV0dXJuIGAvdG9waWMvJHt0ZW5hbnR9LyR7ZG9tYWlufS8ke3NlcnZpY2V9LyR7cHJpbWl0aXZlfWA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBidWlsZFByaW1pdGl2ZU1hbmFnZXJLZXkoZG9tYWluOiBzdHJpbmcsIHNlcnZpY2U6IHN0cmluZywgcHJpbWl0aXZlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiBgJHtkb21haW59LyR7c2VydmljZX0vJHtwcmltaXRpdmV9YDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGFzeW5jIHVuc3Vic2NyaWJlUHJpbWl0aXZlT25GaW5hbGl6ZShwcmltaXRpdmVNYW5hZ2VyOiBQcmltaXRpdmVNYW5hZ2VyPGFueT4pIHtcclxuICAgICAgICBpZiAocHJpbWl0aXZlTWFuYWdlci5oYXNPYnNlcnZlcnMoKSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnVuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IGtleSA9IHRoaXMuYnVpbGRQcmltaXRpdmVNYW5hZ2VyS2V5KHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLCBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlKTtcclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmRlbGV0ZShrZXkpO1xyXG5cclxuICAgICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3RJZk5vTW9yZU9ic2VydmFibGVzKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBhc3luYyBkaXNjb25uZWN0SWZOb01vcmVPYnNlcnZhYmxlcygpIHtcclxuICAgICAgICBpZiAodGhpcy5nZXRPYnNlcnZlcnNDb3VudCgpID09PSAwKSB7XHJcbiAgICAgICAgICAgIHRoaXMuZGVidWcoJ01hbnVhbGx5IGRpc2Nvbm5lY3RpbmcgYmVjYXVzZSB0aGVyZSBhcmUgbm8gbW9yZSBvYnNlcnZlcnMnKTtcclxuICAgICAgICAgICAgYXdhaXQgdGhpcy5kaXNjb25uZWN0KCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgZ2V0T2JzZXJ2ZXJzQ291bnQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgb2JzZXJ2ZXJzQ291bnQgPSAwO1xyXG5cclxuICAgICAgICB0aGlzLnByaW1pdGl2ZU1hbmFnZXJzLmZvckVhY2gocHJpbWl0aXZlTWFuYWdlciA9PiB7XHJcbiAgICAgICAgICAgIG9ic2VydmVyc0NvdW50ICs9IHByaW1pdGl2ZU1hbmFnZXIuZ2V0T2JzZXJ2ZXJzQ291bnQoKTtcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIG9ic2VydmVyc0NvdW50O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb248VD4oZGVzdGluYXRpb246IHN0cmluZywgcHJpbWl0aXZlTWFuYWdlcjogUHJpbWl0aXZlTWFuYWdlcjxUPik6IFN0b21wU3Vic2NyaXB0aW9uIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5zdG9tcENsaWVudC5zdWJzY3JpYmUoZGVzdGluYXRpb24sIChtZXNzYWdlOiBhbnkpID0+IHtcclxuICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKG1lc3NhZ2UuYm9keSB8fCAne30nKTtcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5maXJlRXZlbnQoZXZlbnQpO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY3JlYXRlU3RvbXBTdWJzY3JpcHRpb25zPFQ+KHByaW1pdGl2ZU1hbmFnZXI6IFByaW1pdGl2ZU1hbmFnZXI8VD4pOiB2b2lkIHtcclxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb25VcmxXaXRoVG9rZW4gPSB0aGlzLmJ1aWxkU3Vic2NyaXB0aW9uVXJsV2l0aFRva2VuKFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLmRvbWFpbixcclxuICAgICAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zZXJ2aWNlLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnByaW1pdGl2ZVxyXG4gICAgICAgICk7XHJcbiAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uVXJsV2l0aG91dFRva2VuID0gdGhpcy5nZXRTdWJzY3JpcHRpb25VcmxXaXRob3V0VG9rZW4oXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIuZG9tYWluLFxyXG4gICAgICAgICAgICBwcmltaXRpdmVNYW5hZ2VyLnNlcnZpY2UsXHJcbiAgICAgICAgICAgIHByaW1pdGl2ZU1hbmFnZXIucHJpbWl0aXZlXHJcbiAgICAgICAgKTtcclxuXHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvblVybFdpdGhUb2tlbiwgcHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgY29uc3Qgc3RvbXBTdWJzY3JpcHRpb25XaXRob3V0VG9rZW4gPSB0aGlzLmNyZWF0ZVN0b21wU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvblVybFdpdGhvdXRUb2tlbiwgcHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICAgICAgcHJpbWl0aXZlTWFuYWdlci5zdWJzY3JpYmUoc3RvbXBTdWJzY3JpcHRpb25XaXRoVG9rZW4sIHN0b21wU3Vic2NyaXB0aW9uV2l0aG91dFRva2VuKTtcclxuICAgICAgICB0aGlzLnN1YnNjcmliZWQkLm5leHQocHJpbWl0aXZlTWFuYWdlcik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBnZXRTdWJzY3JpcHRpb25VcmwoKSB7XHJcbiAgICAgICAgcmV0dXJuIGAke3RoaXMudXNlckluZm9ybWF0aW9uU2VydmljZS5nZXRXZWJTb2NrZXRVcmwoKX0vc3Vic2NyaXB0aW9uYDtcclxuICAgIH1cclxufVxyXG4iXX0=