@hivegpt/hiveai-angular 0.0.576 → 0.0.578

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 (20) hide show
  1. package/bundles/hivegpt-hiveai-angular.umd.js +214 -356
  2. package/bundles/hivegpt-hiveai-angular.umd.js.map +1 -1
  3. package/bundles/hivegpt-hiveai-angular.umd.min.js +1 -1
  4. package/bundles/hivegpt-hiveai-angular.umd.min.js.map +1 -1
  5. package/esm2015/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.js +54 -85
  6. package/esm2015/lib/components/voice-agent/services/daily-voice-client.service.js +14 -22
  7. package/esm2015/lib/components/voice-agent/services/voice-agent.service.js +60 -90
  8. package/esm2015/lib/components/voice-agent/services/websocket-voice-client.service.js +34 -81
  9. package/fesm2015/hivegpt-hiveai-angular.js +157 -272
  10. package/fesm2015/hivegpt-hiveai-angular.js.map +1 -1
  11. package/hivegpt-hiveai-angular.metadata.json +1 -1
  12. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts +1 -7
  13. package/lib/components/voice-agent/components/voice-agent-modal/voice-agent-modal.component.d.ts.map +1 -1
  14. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts +3 -5
  15. package/lib/components/voice-agent/services/daily-voice-client.service.d.ts.map +1 -1
  16. package/lib/components/voice-agent/services/voice-agent.service.d.ts +1 -3
  17. package/lib/components/voice-agent/services/voice-agent.service.d.ts.map +1 -1
  18. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts +12 -5
  19. package/lib/components/voice-agent/services/websocket-voice-client.service.d.ts.map +1 -1
  20. package/package.json +1 -1
@@ -1,15 +1,13 @@
1
1
  import { __awaiter } from "tslib";
2
- import { isPlatformBrowser } from '@angular/common';
3
- import { Component, Inject, Input, Output, EventEmitter, Injector, PLATFORM_ID } from '@angular/core';
2
+ import { Component, Input, Output, EventEmitter, Injector } from '@angular/core';
4
3
  import { VoiceAgentService } from '../../services/voice-agent.service';
5
4
  import { AudioAnalyzerService } from '../../services/audio-analyzer.service';
6
5
  import { VOICE_MODAL_CONFIG, VOICE_MODAL_CLOSE_CALLBACK } from '../../voice-modal-tokens';
7
6
  export class VoiceAgentModalComponent {
8
- constructor(voiceAgentService, audioAnalyzer, injector, platformId) {
7
+ constructor(voiceAgentService, audioAnalyzer, injector) {
9
8
  this.voiceAgentService = voiceAgentService;
10
9
  this.audioAnalyzer = audioAnalyzer;
11
10
  this.injector = injector;
12
- this.platformId = platformId;
13
11
  this.close = new EventEmitter();
14
12
  this.apiKey = '';
15
13
  this.eventToken = '';
@@ -21,8 +19,6 @@ export class VoiceAgentModalComponent {
21
19
  this.usersApiUrl = '';
22
20
  this.injectedConfig = null;
23
21
  this.onCloseCallback = null;
24
- /** Held until destroy; passed to Daily so we do not stop/re-acquire (avoids extra prompts on some browsers). */
25
- this.warmMicStream = null;
26
22
  /** Hardcoded voice agent avatar (Nia). */
27
23
  this.displayAvatarUrl = 'https://www.jotform.com/uploads/mehmetkarakasli/form_files/1564593667676a8e85f23758.86945537_icon.png';
28
24
  this.callState = 'idle';
@@ -38,83 +34,58 @@ export class VoiceAgentModalComponent {
38
34
  this.isConnecting = false;
39
35
  }
40
36
  ngOnInit() {
41
- void this.bootstrap();
42
- }
43
- bootstrap() {
44
37
  var _a, _b, _c, _d, _e, _f, _g, _h;
45
- return __awaiter(this, void 0, void 0, function* () {
46
- this.injectedConfig = this.injector.get(VOICE_MODAL_CONFIG, null);
47
- this.onCloseCallback = this.injector.get(VOICE_MODAL_CLOSE_CALLBACK, null);
48
- if (this.injectedConfig) {
49
- this.apiUrl = this.injectedConfig.apiUrl;
50
- this.token = this.injectedConfig.token;
51
- this.botId = this.injectedConfig.botId;
52
- this.conversationId = this.injectedConfig.conversationId;
53
- this.apiKey = (_a = this.injectedConfig.apiKey) !== null && _a !== void 0 ? _a : '';
54
- this.eventToken = (_b = this.injectedConfig.eventToken) !== null && _b !== void 0 ? _b : '';
55
- this.eventId = (_c = this.injectedConfig.eventId) !== null && _c !== void 0 ? _c : '';
56
- this.eventUrl = (_d = this.injectedConfig.eventUrl) !== null && _d !== void 0 ? _d : '';
57
- this.domainAuthority = (_e = this.injectedConfig.domainAuthority) !== null && _e !== void 0 ? _e : 'prod-lite';
58
- this.agentName = (_f = this.injectedConfig.agentName) !== null && _f !== void 0 ? _f : this.agentName;
59
- this.agentRole = (_g = this.injectedConfig.agentRole) !== null && _g !== void 0 ? _g : this.agentRole;
60
- this.agentAvatar = this.injectedConfig.agentAvatar;
61
- this.usersApiUrl = (_h = this.injectedConfig.usersApiUrl) !== null && _h !== void 0 ? _h : this.usersApiUrl;
38
+ // When opened via Overlay, config is provided by injection
39
+ this.injectedConfig = this.injector.get(VOICE_MODAL_CONFIG, null);
40
+ this.onCloseCallback = this.injector.get(VOICE_MODAL_CLOSE_CALLBACK, null);
41
+ if (this.injectedConfig) {
42
+ this.apiUrl = this.injectedConfig.apiUrl;
43
+ this.token = this.injectedConfig.token;
44
+ this.botId = this.injectedConfig.botId;
45
+ this.conversationId = this.injectedConfig.conversationId;
46
+ this.apiKey = (_a = this.injectedConfig.apiKey) !== null && _a !== void 0 ? _a : '';
47
+ this.eventToken = (_b = this.injectedConfig.eventToken) !== null && _b !== void 0 ? _b : '';
48
+ this.eventId = (_c = this.injectedConfig.eventId) !== null && _c !== void 0 ? _c : '';
49
+ this.eventUrl = (_d = this.injectedConfig.eventUrl) !== null && _d !== void 0 ? _d : '';
50
+ this.domainAuthority = (_e = this.injectedConfig.domainAuthority) !== null && _e !== void 0 ? _e : 'prod-lite';
51
+ this.agentName = (_f = this.injectedConfig.agentName) !== null && _f !== void 0 ? _f : this.agentName;
52
+ this.agentRole = (_g = this.injectedConfig.agentRole) !== null && _g !== void 0 ? _g : this.agentRole;
53
+ this.agentAvatar = this.injectedConfig.agentAvatar;
54
+ this.usersApiUrl = (_h = this.injectedConfig.usersApiUrl) !== null && _h !== void 0 ? _h : this.usersApiUrl;
55
+ }
56
+ // Subscribe to observables
57
+ this.subscriptions.push(this.voiceAgentService.callState$.subscribe(state => {
58
+ this.callState = state;
59
+ this.isSpeaking = state === 'talking';
60
+ if (state === 'listening' || state === 'talking') {
61
+ this.hasLeftConnectedOnce = true;
62
62
  }
63
- // Subscribe to observables
64
- this.subscriptions.push(this.voiceAgentService.callState$.subscribe(state => {
65
- this.callState = state;
66
- this.isSpeaking = state === 'talking';
67
- if (state === 'listening' || state === 'talking') {
68
- this.hasLeftConnectedOnce = true;
69
- }
70
- if (state === 'idle' || state === 'ended') {
71
- this.hasLeftConnectedOnce = false;
72
- }
73
- }));
74
- this.subscriptions.push(this.voiceAgentService.statusText$.subscribe(text => {
75
- this.statusText = text;
76
- }));
77
- this.subscriptions.push(this.voiceAgentService.duration$.subscribe(duration => {
78
- this.duration = duration;
79
- }));
80
- this.subscriptions.push(this.voiceAgentService.isMicMuted$.subscribe(muted => {
81
- this.isMicMuted = muted;
82
- }));
83
- this.subscriptions.push(this.voiceAgentService.isUserSpeaking$.subscribe(speaking => {
84
- this.isUserSpeaking = speaking;
85
- }));
86
- this.subscriptions.push(this.voiceAgentService.audioLevels$.subscribe(levels => {
87
- this.audioLevels = levels;
88
- }));
89
- this.voiceAgentService.resetToIdle();
90
- yield this.startCall();
91
- });
63
+ if (state === 'idle' || state === 'ended') {
64
+ this.hasLeftConnectedOnce = false;
65
+ }
66
+ }));
67
+ this.subscriptions.push(this.voiceAgentService.statusText$.subscribe(text => {
68
+ this.statusText = text;
69
+ }));
70
+ this.subscriptions.push(this.voiceAgentService.duration$.subscribe(duration => {
71
+ this.duration = duration;
72
+ }));
73
+ this.subscriptions.push(this.voiceAgentService.isMicMuted$.subscribe(muted => {
74
+ this.isMicMuted = muted;
75
+ }));
76
+ this.subscriptions.push(this.voiceAgentService.isUserSpeaking$.subscribe(speaking => {
77
+ this.isUserSpeaking = speaking;
78
+ }));
79
+ this.subscriptions.push(this.voiceAgentService.audioLevels$.subscribe(levels => {
80
+ this.audioLevels = levels;
81
+ }));
82
+ // Modal opens in idle state, then immediately starts connecting.
83
+ this.voiceAgentService.resetToIdle();
84
+ void this.startCall();
92
85
  }
93
86
  ngOnDestroy() {
94
- this.subscriptions.forEach((sub) => sub.unsubscribe());
95
- void this.disconnect().finally(() => {
96
- var _a;
97
- (_a = this.warmMicStream) === null || _a === void 0 ? void 0 : _a.getTracks().forEach((t) => t.stop());
98
- this.warmMicStream = null;
99
- });
100
- }
101
- /** Ensures a live mic stream for this call (re-acquire after Daily stops tracks on hang-up). */
102
- ensureMicForCall() {
103
- var _a;
104
- return __awaiter(this, void 0, void 0, function* () {
105
- if (!isPlatformBrowser(this.platformId))
106
- return undefined;
107
- if ((_a = this.warmMicStream) === null || _a === void 0 ? void 0 : _a.getAudioTracks().some((t) => t.readyState === 'live')) {
108
- return this.warmMicStream;
109
- }
110
- try {
111
- this.warmMicStream = yield navigator.mediaDevices.getUserMedia({ audio: true });
112
- return this.warmMicStream;
113
- }
114
- catch (_b) {
115
- return undefined;
116
- }
117
- });
87
+ this.subscriptions.forEach(sub => sub.unsubscribe());
88
+ this.disconnect();
118
89
  }
119
90
  startCall() {
120
91
  return __awaiter(this, void 0, void 0, function* () {
@@ -122,8 +93,7 @@ export class VoiceAgentModalComponent {
122
93
  return;
123
94
  this.isConnecting = true;
124
95
  try {
125
- const mic = yield this.ensureMicForCall();
126
- yield this.voiceAgentService.connect(this.apiUrl, this.token, this.botId, this.conversationId, this.apiKey, this.eventToken, this.eventId, this.eventUrl, this.domainAuthority, this.usersApiUrl || undefined, mic);
96
+ yield this.voiceAgentService.connect(this.apiUrl, this.token, this.botId, this.conversationId, this.apiKey, this.eventToken, this.eventId, this.eventUrl, this.domainAuthority, this.usersApiUrl || undefined);
127
97
  }
128
98
  catch (error) {
129
99
  console.error('Failed to connect voice agent:', error);
@@ -162,7 +132,7 @@ export class VoiceAgentModalComponent {
162
132
  /** Call Again: reset to idle then start a new call. */
163
133
  callAgain() {
164
134
  this.voiceAgentService.resetToIdle();
165
- void this.startCall();
135
+ this.startCall();
166
136
  }
167
137
  /** Back to Chat: close modal and disconnect. */
168
138
  backToChat() {
@@ -189,8 +159,7 @@ VoiceAgentModalComponent.decorators = [
189
159
  VoiceAgentModalComponent.ctorParameters = () => [
190
160
  { type: VoiceAgentService },
191
161
  { type: AudioAnalyzerService },
192
- { type: Injector },
193
- { type: Object, decorators: [{ type: Inject, args: [PLATFORM_ID,] }] }
162
+ { type: Injector }
194
163
  ];
195
164
  VoiceAgentModalComponent.propDecorators = {
196
165
  close: [{ type: Output }],
@@ -208,4 +177,4 @@ VoiceAgentModalComponent.propDecorators = {
208
177
  agentAvatar: [{ type: Input }],
209
178
  usersApiUrl: [{ type: Input }]
210
179
  };
211
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L2NvbXBvbmVudHMvdm9pY2UtYWdlbnQtbW9kYWwvdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6SCxPQUFPLEVBQUUsaUJBQWlCLEVBQWEsTUFBTSxvQ0FBb0MsQ0FBQztBQUNsRixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUM3RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsMEJBQTBCLEVBQW9CLE1BQU0sMEJBQTBCLENBQUM7QUFPNUcsTUFBTSxPQUFPLHdCQUF3QjtJQXNCbkMsWUFDUyxpQkFBb0MsRUFDcEMsYUFBbUMsRUFDbEMsUUFBa0IsRUFDRyxVQUFrQjtRQUh4QyxzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO1FBQ3BDLGtCQUFhLEdBQWIsYUFBYSxDQUFzQjtRQUNsQyxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ0csZUFBVSxHQUFWLFVBQVUsQ0FBUTtRQXpCdkMsVUFBSyxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLbEMsV0FBTSxHQUFXLEVBQUUsQ0FBQztRQUNwQixlQUFVLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLFlBQU8sR0FBVyxFQUFFLENBQUM7UUFDckIsYUFBUSxHQUFXLEVBQUUsQ0FBQztRQUN0QixvQkFBZSxHQUFXLFdBQVcsQ0FBQztRQUN0QyxjQUFTLEdBQVcsY0FBYyxDQUFDO1FBQ25DLGNBQVMsR0FBVyxxQkFBcUIsQ0FBQztRQUUxQyxnQkFBVyxHQUFXLEVBQUUsQ0FBQztRQUUxQixtQkFBYyxHQUE0QixJQUFJLENBQUM7UUFDL0Msb0JBQWUsR0FBd0IsSUFBSSxDQUFDO1FBRXBELGdIQUFnSDtRQUN4RyxrQkFBYSxHQUF1QixJQUFJLENBQUM7UUFTakQsMENBQTBDO1FBQ2pDLHFCQUFnQixHQUFHLHVHQUF1RyxDQUFDO1FBRXBJLGNBQVMsR0FBYyxNQUFNLENBQUM7UUFDOUIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixhQUFRLEdBQVcsT0FBTyxDQUFDO1FBQzNCLGVBQVUsR0FBWSxLQUFLLENBQUM7UUFDNUIsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFDaEMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFDM0IsZUFBVSxHQUFZLEtBQUssQ0FBQztRQUU1QiwwRUFBMEU7UUFDbEUseUJBQW9CLEdBQVksS0FBSyxDQUFDO1FBRXRDLGtCQUFhLEdBQW1CLEVBQUUsQ0FBQztRQWlGM0MsaUJBQVksR0FBWSxLQUFLLENBQUM7SUFqRzNCLENBQUM7SUFrQkosUUFBUTtRQUNOLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFYSxTQUFTOzs7WUFDckIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNsRSxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzNFLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtnQkFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQztnQkFDekMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQztnQkFDdkMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztnQkFDekQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxtQ0FBSSxFQUFFLENBQUM7Z0JBQy9DLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLFVBQVUsbUNBQUksRUFBRSxDQUFDO2dCQUN2RCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLG1DQUFJLEVBQUUsQ0FBQztnQkFDakQsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxtQ0FBSSxFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxlQUFlLEdBQUcsTUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLGVBQWUsbUNBQUksV0FBVyxDQUFDO2dCQUMxRSxJQUFJLENBQUMsU0FBUyxHQUFHLE1BQUEsSUFBSSxDQUFDLGNBQWMsQ0FBQyxTQUFTLG1DQUFJLElBQUksQ0FBQyxTQUFTLENBQUM7Z0JBQ2pFLElBQUksQ0FBQyxTQUFTLEdBQUcsTUFBQSxJQUFJLENBQUMsY0FBYyxDQUFDLFNBQVMsbUNBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDakUsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFBLElBQUksQ0FBQyxjQUFjLENBQUMsV0FBVyxtQ0FBSSxJQUFJLENBQUMsV0FBVyxDQUFDO2FBQ3hFO1lBRUQsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUNyQixJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDbEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxLQUFLLFNBQVMsQ0FBQztnQkFDdEMsSUFBSSxLQUFLLEtBQUssV0FBVyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUU7b0JBQ2hELElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7aUJBQ2xDO2dCQUNELElBQUksS0FBSyxLQUFLLE1BQU0sSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO29CQUN6QyxJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDO2lCQUNuQztZQUNILENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3pCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3BELElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQzNCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ25ELElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQzFELElBQUksQ0FBQyxjQUFjLEdBQUcsUUFBUSxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FDckIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3JELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzVCLENBQUMsQ0FBQyxDQUNILENBQUM7WUFFRixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7O0tBQ3hCO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RCxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFOztZQUNsQyxNQUFBLElBQUksQ0FBQyxhQUFhLDBDQUFFLFNBQVMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3pELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUlELGdHQUFnRztJQUNsRixnQkFBZ0I7OztZQUM1QixJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztnQkFBRSxPQUFPLFNBQVMsQ0FBQztZQUMxRCxJQUFJLE1BQUEsSUFBSSxDQUFDLGFBQWEsMENBQUUsY0FBYyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsS0FBSyxNQUFNLENBQUMsRUFBRTtnQkFDN0UsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQzNCO1lBQ0QsSUFBSTtnQkFDRixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sU0FBUyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDaEYsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO2FBQzNCO1lBQUMsV0FBTTtnQkFDTixPQUFPLFNBQVMsQ0FBQzthQUNsQjs7S0FDRjtJQUVLLFNBQVM7O1lBQ2IsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsS0FBSyxNQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUM7Z0JBQUUsT0FBTztZQUMzRixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQztZQUN6QixJQUFJO2dCQUNGLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQzFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FDbEMsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsS0FBSyxFQUNWLElBQUksQ0FBQyxLQUFLLEVBQ1YsSUFBSSxDQUFDLGNBQWMsRUFDbkIsSUFBSSxDQUFDLE1BQU0sRUFDWCxJQUFJLENBQUMsVUFBVSxFQUNmLElBQUksQ0FBQyxPQUFPLEVBQ1osSUFBSSxDQUFDLFFBQVEsRUFDYixJQUFJLENBQUMsZUFBZSxFQUNwQixJQUFJLENBQUMsV0FBVyxJQUFJLFNBQVMsRUFDN0IsR0FBRyxDQUNKLENBQUM7YUFDSDtZQUFDLE9BQU8sS0FBSyxFQUFFO2dCQUNkLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQWdDLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDeEQ7b0JBQVM7Z0JBQ1IsSUFBSSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUM7YUFDM0I7UUFDSCxDQUFDO0tBQUE7SUFFSyxVQUFVOztZQUNkLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzVDLENBQUM7S0FBQTtJQUVELFNBQVM7UUFDUCxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELG1FQUFtRTtJQUNuRSxpQkFBaUIsQ0FBQyxLQUFhO1FBQzdCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssYUFBTCxLQUFLLGNBQUwsS0FBSyxHQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQzVCLENBQUM7SUFFRCxvQ0FBb0M7SUFDcEMsSUFBSSxXQUFXO1FBQ2IsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFlBQVk7WUFBRSxPQUFPLElBQUksQ0FBQyxVQUFVLElBQUksZUFBZSxDQUFDO1FBQy9FLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxTQUFTO1lBQUUsT0FBTyxZQUFZLENBQUM7UUFDdEQsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFdBQVc7WUFBRSxPQUFPLFdBQVcsQ0FBQztRQUN2RCxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssV0FBVyxFQUFFO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztTQUMvRDtRQUNELE9BQU8sSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVELHVEQUF1RDtJQUN2RCxTQUFTO1FBQ1AsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3JDLEtBQUssSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFRCxnREFBZ0Q7SUFDaEQsVUFBVTtRQUNSLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNqQixDQUFDO0lBRUQsbUZBQW1GO0lBQ25GLE1BQU07UUFDSixJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDcEIsQ0FBQztJQUVELE9BQU87O1FBQ0wsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xCLE1BQUEsSUFBSSxDQUFDLGVBQWUsK0NBQXBCLElBQUksQ0FBb0IsQ0FBQztRQUN6QixJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3BCLENBQUM7OztZQXZORixTQUFTLFNBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMseXVVQUFpRDs7YUFFbEQ7OztZQVJRLGlCQUFpQjtZQUNqQixvQkFBb0I7WUFIK0MsUUFBUTtZQXFDdkMsTUFBTSx1QkFBOUMsTUFBTSxTQUFDLFdBQVc7OztvQkF6QnBCLE1BQU07cUJBQ04sS0FBSztvQkFDTCxLQUFLO29CQUNMLEtBQUs7NkJBQ0wsS0FBSztxQkFDTCxLQUFLO3lCQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLOzhCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLOzBCQUNMLEtBQUs7MEJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzUGxhdGZvcm1Ccm93c2VyIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgSW5qZWN0LCBJbnB1dCwgT25Jbml0LCBPbkRlc3Ryb3ksIE91dHB1dCwgRXZlbnRFbWl0dGVyLCBJbmplY3RvciwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UsIENhbGxTdGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZPSUNFX01PREFMX0NPTkZJRywgVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIFZvaWNlTW9kYWxDb25maWcgfSBmcm9tICcuLi8uLi92b2ljZS1tb2RhbC10b2tlbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LXZvaWNlLWFnZW50LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQElucHV0KCkgYXBpVXJsITogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbklkITogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBldmVudFRva2VuOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXZlbnRJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGV2ZW50VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcgPSAncHJvZC1saXRlJztcbiAgQElucHV0KCkgYWdlbnROYW1lOiBzdHJpbmcgPSAnQUkgQXNzaXN0YW50JztcbiAgQElucHV0KCkgYWdlbnRSb2xlOiBzdHJpbmcgPSAnQUkgQWdlbnQgU3BlY2lhbGlzdCc7XG4gIEBJbnB1dCgpIGFnZW50QXZhdGFyPzogc3RyaW5nO1xuICBASW5wdXQoKSB1c2Vyc0FwaVVybDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBpbmplY3RlZENvbmZpZzogVm9pY2VNb2RhbENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9uQ2xvc2VDYWxsYmFjazogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqIEhlbGQgdW50aWwgZGVzdHJveTsgcGFzc2VkIHRvIERhaWx5IHNvIHdlIGRvIG5vdCBzdG9wL3JlLWFjcXVpcmUgKGF2b2lkcyBleHRyYSBwcm9tcHRzIG9uIHNvbWUgYnJvd3NlcnMpLiAqL1xuICBwcml2YXRlIHdhcm1NaWNTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZvaWNlQWdlbnRTZXJ2aWNlOiBWb2ljZUFnZW50U2VydmljZSxcbiAgICBwdWJsaWMgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgQEluamVjdChQTEFURk9STV9JRCkgcHJpdmF0ZSBwbGF0Zm9ybUlkOiBPYmplY3QsXG4gICkge31cblxuICAvKiogSGFyZGNvZGVkIHZvaWNlIGFnZW50IGF2YXRhciAoTmlhKS4gKi9cbiAgcmVhZG9ubHkgZGlzcGxheUF2YXRhclVybCA9ICdodHRwczovL3d3dy5qb3Rmb3JtLmNvbS91cGxvYWRzL21laG1ldGthcmFrYXNsaS9mb3JtX2ZpbGVzLzE1NjQ1OTM2Njc2NzZhOGU4NWYyMzc1OC44Njk0NTUzN19pY29uLnBuZyc7XG5cbiAgY2FsbFN0YXRlOiBDYWxsU3RhdGUgPSAnaWRsZSc7XG4gIHN0YXR1c1RleHQ6IHN0cmluZyA9ICcnO1xuICBkdXJhdGlvbjogc3RyaW5nID0gJzAwOjAwJztcbiAgaXNNaWNNdXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1VzZXJTcGVha2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICBhdWRpb0xldmVsczogbnVtYmVyW10gPSBbXTtcbiAgaXNTcGVha2luZzogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKiBUcmFjayB3aGV0aGVyIGNhbGwgaGFzIHRyYW5zaXRpb25lZCBvdXQgb2YgaW5pdGlhbCBjb25uZWN0ZWQgc3RhdGUuICovXG4gIHByaXZhdGUgaGFzTGVmdENvbm5lY3RlZE9uY2U6IGJvb2xlYW4gPSBmYWxzZTtcblxuICBwcml2YXRlIHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdID0gW107XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdm9pZCB0aGlzLmJvb3RzdHJhcCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBib290c3RyYXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5pbmplY3RlZENvbmZpZyA9IHRoaXMuaW5qZWN0b3IuZ2V0KFZPSUNFX01PREFMX0NPTkZJRywgbnVsbCk7XG4gICAgdGhpcy5vbkNsb3NlQ2FsbGJhY2sgPSB0aGlzLmluamVjdG9yLmdldChWT0lDRV9NT0RBTF9DTE9TRV9DQUxMQkFDSywgbnVsbCk7XG4gICAgaWYgKHRoaXMuaW5qZWN0ZWRDb25maWcpIHtcbiAgICAgIHRoaXMuYXBpVXJsID0gdGhpcy5pbmplY3RlZENvbmZpZy5hcGlVcmw7XG4gICAgICB0aGlzLnRva2VuID0gdGhpcy5pbmplY3RlZENvbmZpZy50b2tlbjtcbiAgICAgIHRoaXMuYm90SWQgPSB0aGlzLmluamVjdGVkQ29uZmlnLmJvdElkO1xuICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuY29udmVyc2F0aW9uSWQ7XG4gICAgICB0aGlzLmFwaUtleSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYXBpS2V5ID8/ICcnO1xuICAgICAgdGhpcy5ldmVudFRva2VuID0gdGhpcy5pbmplY3RlZENvbmZpZy5ldmVudFRva2VuID8/ICcnO1xuICAgICAgdGhpcy5ldmVudElkID0gdGhpcy5pbmplY3RlZENvbmZpZy5ldmVudElkID8/ICcnO1xuICAgICAgdGhpcy5ldmVudFVybCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZXZlbnRVcmwgPz8gJyc7XG4gICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZG9tYWluQXV0aG9yaXR5ID8/ICdwcm9kLWxpdGUnO1xuICAgICAgdGhpcy5hZ2VudE5hbWUgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFnZW50TmFtZSA/PyB0aGlzLmFnZW50TmFtZTtcbiAgICAgIHRoaXMuYWdlbnRSb2xlID0gdGhpcy5pbmplY3RlZENvbmZpZy5hZ2VudFJvbGUgPz8gdGhpcy5hZ2VudFJvbGU7XG4gICAgICB0aGlzLmFnZW50QXZhdGFyID0gdGhpcy5pbmplY3RlZENvbmZpZy5hZ2VudEF2YXRhcjtcbiAgICAgIHRoaXMudXNlcnNBcGlVcmwgPSB0aGlzLmluamVjdGVkQ29uZmlnLnVzZXJzQXBpVXJsID8/IHRoaXMudXNlcnNBcGlVcmw7XG4gICAgfVxuXG4gICAgLy8gU3Vic2NyaWJlIHRvIG9ic2VydmFibGVzXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmNhbGxTdGF0ZSQuc3Vic2NyaWJlKHN0YXRlID0+IHtcbiAgICAgICAgdGhpcy5jYWxsU3RhdGUgPSBzdGF0ZTtcbiAgICAgICAgdGhpcy5pc1NwZWFraW5nID0gc3RhdGUgPT09ICd0YWxraW5nJztcbiAgICAgICAgaWYgKHN0YXRlID09PSAnbGlzdGVuaW5nJyB8fCBzdGF0ZSA9PT0gJ3RhbGtpbmcnKSB7XG4gICAgICAgICAgdGhpcy5oYXNMZWZ0Q29ubmVjdGVkT25jZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHN0YXRlID09PSAnaWRsZScgfHwgc3RhdGUgPT09ICdlbmRlZCcpIHtcbiAgICAgICAgICB0aGlzLmhhc0xlZnRDb25uZWN0ZWRPbmNlID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5zdGF0dXNUZXh0JC5zdWJzY3JpYmUodGV4dCA9PiB7XG4gICAgICAgIHRoaXMuc3RhdHVzVGV4dCA9IHRleHQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuZHVyYXRpb24kLnN1YnNjcmliZShkdXJhdGlvbiA9PiB7XG4gICAgICAgIHRoaXMuZHVyYXRpb24gPSBkdXJhdGlvbjtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5pc01pY011dGVkJC5zdWJzY3JpYmUobXV0ZWQgPT4ge1xuICAgICAgICB0aGlzLmlzTWljTXV0ZWQgPSBtdXRlZDtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5pc1VzZXJTcGVha2luZyQuc3Vic2NyaWJlKHNwZWFraW5nID0+IHtcbiAgICAgICAgdGhpcy5pc1VzZXJTcGVha2luZyA9IHNwZWFraW5nO1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmF1ZGlvTGV2ZWxzJC5zdWJzY3JpYmUobGV2ZWxzID0+IHtcbiAgICAgICAgdGhpcy5hdWRpb0xldmVscyA9IGxldmVscztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UucmVzZXRUb0lkbGUoKTtcbiAgICBhd2FpdCB0aGlzLnN0YXJ0Q2FsbCgpO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmZvckVhY2goKHN1YikgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHZvaWQgdGhpcy5kaXNjb25uZWN0KCkuZmluYWxseSgoKSA9PiB7XG4gICAgICB0aGlzLndhcm1NaWNTdHJlYW0/LmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMud2FybU1pY1N0cmVhbSA9IG51bGw7XG4gICAgfSk7XG4gIH1cblxuICBpc0Nvbm5lY3Rpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKiogRW5zdXJlcyBhIGxpdmUgbWljIHN0cmVhbSBmb3IgdGhpcyBjYWxsIChyZS1hY3F1aXJlIGFmdGVyIERhaWx5IHN0b3BzIHRyYWNrcyBvbiBoYW5nLXVwKS4gKi9cbiAgcHJpdmF0ZSBhc3luYyBlbnN1cmVNaWNGb3JDYWxsKCk6IFByb21pc2U8TWVkaWFTdHJlYW0gfCB1bmRlZmluZWQ+IHtcbiAgICBpZiAoIWlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHRoaXMud2FybU1pY1N0cmVhbT8uZ2V0QXVkaW9UcmFja3MoKS5zb21lKCh0KSA9PiB0LnJlYWR5U3RhdGUgPT09ICdsaXZlJykpIHtcbiAgICAgIHJldHVybiB0aGlzLndhcm1NaWNTdHJlYW07XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICB0aGlzLndhcm1NaWNTdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIHRoaXMud2FybU1pY1N0cmVhbTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc3RhcnRDYWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGluZyB8fCAodGhpcy5jYWxsU3RhdGUgIT09ICdpZGxlJyAmJiB0aGlzLmNhbGxTdGF0ZSAhPT0gJ2VuZGVkJykpIHJldHVybjtcbiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1pYyA9IGF3YWl0IHRoaXMuZW5zdXJlTWljRm9yQ2FsbCgpO1xuICAgICAgYXdhaXQgdGhpcy52b2ljZUFnZW50U2VydmljZS5jb25uZWN0KFxuICAgICAgICB0aGlzLmFwaVVybCxcbiAgICAgICAgdGhpcy50b2tlbixcbiAgICAgICAgdGhpcy5ib3RJZCxcbiAgICAgICAgdGhpcy5jb252ZXJzYXRpb25JZCxcbiAgICAgICAgdGhpcy5hcGlLZXksXG4gICAgICAgIHRoaXMuZXZlbnRUb2tlbixcbiAgICAgICAgdGhpcy5ldmVudElkLFxuICAgICAgICB0aGlzLmV2ZW50VXJsLFxuICAgICAgICB0aGlzLmRvbWFpbkF1dGhvcml0eSxcbiAgICAgICAgdGhpcy51c2Vyc0FwaVVybCB8fCB1bmRlZmluZWQsXG4gICAgICAgIG1pYyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBjb25uZWN0IHZvaWNlIGFnZW50OicsIGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pc0Nvbm5lY3RpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgdG9nZ2xlTWljKCk6IHZvaWQge1xuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UudG9nZ2xlTWljKCk7XG4gIH1cblxuICAvKiogTWFwIGF1ZGlvIGxldmVsICgw4oCTMTAwKSB0byB3YXZlZm9ybSBiYXIgaGVpZ2h0IGluIHB4ICgz4oCTMjApLiAqL1xuICBnZXRXYXZlZm9ybUhlaWdodChsZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBuID0gTWF0aC5taW4oMTAwLCBNYXRoLm1heCgwLCBsZXZlbCA/PyAwKSk7XG4gICAgcmV0dXJuIDMgKyAobiAvIDEwMCkgKiAxNztcbiAgfVxuXG4gIC8qKiBTdGF0dXMgbGFiZWwgZm9yIGFjdGl2ZSBjYWxsLiAqL1xuICBnZXQgc3RhdHVzTGFiZWwoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5jYWxsU3RhdGUgPT09ICdjb25uZWN0aW5nJykgcmV0dXJuIHRoaXMuc3RhdHVzVGV4dCB8fCAnQ29ubmVjdGluZy4uLic7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlID09PSAndGFsa2luZycpIHJldHVybiAnVGFsa2luZy4uLic7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlID09PSAnbGlzdGVuaW5nJykgcmV0dXJuICdMaXN0ZW5pbmcnO1xuICAgIGlmICh0aGlzLmNhbGxTdGF0ZSA9PT0gJ2Nvbm5lY3RlZCcpIHtcbiAgICAgIHJldHVybiB0aGlzLmhhc0xlZnRDb25uZWN0ZWRPbmNlID8gJ1RhbGtpbmcuLi4nIDogJ0Nvbm5lY3RlZCc7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXR1c1RleHQgfHwgJyc7XG4gIH1cblxuICAvKiogQ2FsbCBBZ2FpbjogcmVzZXQgdG8gaWRsZSB0aGVuIHN0YXJ0IGEgbmV3IGNhbGwuICovXG4gIGNhbGxBZ2FpbigpOiB2b2lkIHtcbiAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLnJlc2V0VG9JZGxlKCk7XG4gICAgdm9pZCB0aGlzLnN0YXJ0Q2FsbCgpO1xuICB9XG5cbiAgLyoqIEJhY2sgdG8gQ2hhdDogY2xvc2UgbW9kYWwgYW5kIGRpc2Nvbm5lY3QuICovXG4gIGJhY2tUb0NoYXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbmRDYWxsKCk7XG4gIH1cblxuICAvKiogRW5kIGNhbGwgYnV0IGtlZXAgbW9kYWwgb3BlbiB0byBzaG93IENhbGwgRW5kZWQgKyBDYWxsIEFnYWluIC8gQmFjayB0byBDaGF0LiAqL1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBlbmRDYWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMub25DbG9zZUNhbGxiYWNrPy4oKTtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxufVxuIl19
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9yb2hpdHRoYWt1ci9oaXZlLWdwdC9IaXZlQUktUGFja2FnZXMvQW5ndWxhci9wcm9qZWN0cy9oaXZlZ3B0L2V2ZW50c2dwdC1hbmd1bGFyL3NyYy8iLCJzb3VyY2VzIjpbImxpYi9jb21wb25lbnRzL3ZvaWNlLWFnZW50L2NvbXBvbmVudHMvdm9pY2UtYWdlbnQtbW9kYWwvdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBcUIsTUFBTSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFcEcsT0FBTyxFQUFFLGlCQUFpQixFQUFhLE1BQU0sb0NBQW9DLENBQUM7QUFDbEYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdUNBQXVDLENBQUM7QUFDN0UsT0FBTyxFQUFFLGtCQUFrQixFQUFFLDBCQUEwQixFQUFvQixNQUFNLDBCQUEwQixDQUFDO0FBTzVHLE1BQU0sT0FBTyx3QkFBd0I7SUFtQm5DLFlBQ1MsaUJBQW9DLEVBQ3BDLGFBQW1DLEVBQ2xDLFFBQWtCO1FBRm5CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBbUI7UUFDcEMsa0JBQWEsR0FBYixhQUFhLENBQXNCO1FBQ2xDLGFBQVEsR0FBUixRQUFRLENBQVU7UUFyQmxCLFVBQUssR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBS2xDLFdBQU0sR0FBVyxFQUFFLENBQUM7UUFDcEIsZUFBVSxHQUFXLEVBQUUsQ0FBQztRQUN4QixZQUFPLEdBQVcsRUFBRSxDQUFDO1FBQ3JCLGFBQVEsR0FBVyxFQUFFLENBQUM7UUFDdEIsb0JBQWUsR0FBVyxXQUFXLENBQUM7UUFDdEMsY0FBUyxHQUFXLGNBQWMsQ0FBQztRQUNuQyxjQUFTLEdBQVcscUJBQXFCLENBQUM7UUFFMUMsZ0JBQVcs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QixDQUFDO0lBRUQsT0FBTzs7UUFDTCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDbEIsTUFBQSxJQUFJLENBQUMsZUFBZSwrQ0FBcEIsSUFBSSxDQUFvQixDQUFDO1FBQ3pCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDcEIsQ0FBQzs7O1lBOUxGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsMkJBQTJCO2dCQUNyQyx5dVVBQWlEOzthQUVsRDs7O1lBUlEsaUJBQWlCO1lBQ2pCLG9CQUFvQjtZQUh1QyxRQUFROzs7b0JBWXpFLE1BQU07cUJBQ04sS0FBSztvQkFDTCxLQUFLO29CQUNMLEtBQUs7NkJBQ0wsS0FBSztxQkFDTCxLQUFLO3lCQUNMLEtBQUs7c0JBQ0wsS0FBSzt1QkFDTCxLQUFLOzhCQUNMLEtBQUs7d0JBQ0wsS0FBSzt3QkFDTCxLQUFLOzBCQUNMLEtBQUs7MEJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVm9pY2VBZ2VudFNlcnZpY2UsIENhbGxTdGF0ZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3ZvaWNlLWFnZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQXVkaW9BbmFseXplclNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hdWRpby1hbmFseXplci5zZXJ2aWNlJztcbmltcG9ydCB7IFZPSUNFX01PREFMX0NPTkZJRywgVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIFZvaWNlTW9kYWxDb25maWcgfSBmcm9tICcuLi8uLi92b2ljZS1tb2RhbC10b2tlbnMnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdoaXZlZ3B0LXZvaWNlLWFnZW50LW1vZGFsJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ZvaWNlLWFnZW50LW1vZGFsLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdm9pY2UtYWdlbnQtbW9kYWwuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBWb2ljZUFnZW50TW9kYWxDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIEBPdXRwdXQoKSBjbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQElucHV0KCkgYXBpVXJsITogc3RyaW5nO1xuICBASW5wdXQoKSB0b2tlbiE6IHN0cmluZztcbiAgQElucHV0KCkgYm90SWQhOiBzdHJpbmc7XG4gIEBJbnB1dCgpIGNvbnZlcnNhdGlvbklkITogc3RyaW5nO1xuICBASW5wdXQoKSBhcGlLZXk6IHN0cmluZyA9ICcnO1xuICBASW5wdXQoKSBldmVudFRva2VuOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZXZlbnRJZDogc3RyaW5nID0gJyc7XG4gIEBJbnB1dCgpIGV2ZW50VXJsOiBzdHJpbmcgPSAnJztcbiAgQElucHV0KCkgZG9tYWluQXV0aG9yaXR5OiBzdHJpbmcgPSAncHJvZC1saXRlJztcbiAgQElucHV0KCkgYWdlbnROYW1lOiBzdHJpbmcgPSAnQUkgQXNzaXN0YW50JztcbiAgQElucHV0KCkgYWdlbnRSb2xlOiBzdHJpbmcgPSAnQUkgQWdlbnQgU3BlY2lhbGlzdCc7XG4gIEBJbnB1dCgpIGFnZW50QXZhdGFyPzogc3RyaW5nO1xuICBASW5wdXQoKSB1c2Vyc0FwaVVybDogc3RyaW5nID0gJyc7XG5cbiAgcHJpdmF0ZSBpbmplY3RlZENvbmZpZzogVm9pY2VNb2RhbENvbmZpZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIG9uQ2xvc2VDYWxsYmFjazogKCgpID0+IHZvaWQpIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZvaWNlQWdlbnRTZXJ2aWNlOiBWb2ljZUFnZW50U2VydmljZSxcbiAgICBwdWJsaWMgYXVkaW9BbmFseXplcjogQXVkaW9BbmFseXplclNlcnZpY2UsXG4gICAgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3JcbiAgKSB7fVxuXG4gIC8qKiBIYXJkY29kZWQgdm9pY2UgYWdlbnQgYXZhdGFyIChOaWEpLiAqL1xuICByZWFkb25seSBkaXNwbGF5QXZhdGFyVXJsID0gJ2h0dHBzOi8vd3d3LmpvdGZvcm0uY29tL3VwbG9hZHMvbWVobWV0a2FyYWthc2xpL2Zvcm1fZmlsZXMvMTU2NDU5MzY2NzY3NmE4ZTg1ZjIzNzU4Ljg2OTQ1NTM3X2ljb24ucG5nJztcblxuICBjYWxsU3RhdGU6IENhbGxTdGF0ZSA9ICdpZGxlJztcbiAgc3RhdHVzVGV4dDogc3RyaW5nID0gJyc7XG4gIGR1cmF0aW9uOiBzdHJpbmcgPSAnMDA6MDAnO1xuICBpc01pY011dGVkOiBib29sZWFuID0gZmFsc2U7XG4gIGlzVXNlclNwZWFraW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGF1ZGlvTGV2ZWxzOiBudW1iZXJbXSA9IFtdO1xuICBpc1NwZWFraW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIFRyYWNrIHdoZXRoZXIgY2FsbCBoYXMgdHJhbnNpdGlvbmVkIG91dCBvZiBpbml0aWFsIGNvbm5lY3RlZCBzdGF0ZS4gKi9cbiAgcHJpdmF0ZSBoYXNMZWZ0Q29ubmVjdGVkT25jZTogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW10gPSBbXTtcblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAvLyBXaGVuIG9wZW5lZCB2aWEgT3ZlcmxheSwgY29uZmlnIGlzIHByb3ZpZGVkIGJ5IGluamVjdGlvblxuICAgIHRoaXMuaW5qZWN0ZWRDb25maWcgPSB0aGlzLmluamVjdG9yLmdldChWT0lDRV9NT0RBTF9DT05GSUcsIG51bGwpO1xuICAgIHRoaXMub25DbG9zZUNhbGxiYWNrID0gdGhpcy5pbmplY3Rvci5nZXQoVk9JQ0VfTU9EQUxfQ0xPU0VfQ0FMTEJBQ0ssIG51bGwpO1xuICAgIGlmICh0aGlzLmluamVjdGVkQ29uZmlnKSB7XG4gICAgICB0aGlzLmFwaVVybCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYXBpVXJsO1xuICAgICAgdGhpcy50b2tlbiA9IHRoaXMuaW5qZWN0ZWRDb25maWcudG9rZW47XG4gICAgICB0aGlzLmJvdElkID0gdGhpcy5pbmplY3RlZENvbmZpZy5ib3RJZDtcbiAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQgPSB0aGlzLmluamVjdGVkQ29uZmlnLmNvbnZlcnNhdGlvbklkO1xuICAgICAgdGhpcy5hcGlLZXkgPSB0aGlzLmluamVjdGVkQ29uZmlnLmFwaUtleSA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRUb2tlbiA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZXZlbnRUb2tlbiA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRJZCA9IHRoaXMuaW5qZWN0ZWRDb25maWcuZXZlbnRJZCA/PyAnJztcbiAgICAgIHRoaXMuZXZlbnRVcmwgPSB0aGlzLmluamVjdGVkQ29uZmlnLmV2ZW50VXJsID8/ICcnO1xuICAgICAgdGhpcy5kb21haW5BdXRob3JpdHkgPSB0aGlzLmluamVjdGVkQ29uZmlnLmRvbWFpbkF1dGhvcml0eSA/PyAncHJvZC1saXRlJztcbiAgICAgIHRoaXMuYWdlbnROYW1lID0gdGhpcy5pbmplY3RlZENvbmZpZy5hZ2VudE5hbWUgPz8gdGhpcy5hZ2VudE5hbWU7XG4gICAgICB0aGlzLmFnZW50Um9sZSA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnRSb2xlID8/IHRoaXMuYWdlbnRSb2xlO1xuICAgICAgdGhpcy5hZ2VudEF2YXRhciA9IHRoaXMuaW5qZWN0ZWRDb25maWcuYWdlbnRBdmF0YXI7XG4gICAgICB0aGlzLnVzZXJzQXBpVXJsID0gdGhpcy5pbmplY3RlZENvbmZpZy51c2Vyc0FwaVVybCA/PyB0aGlzLnVzZXJzQXBpVXJsO1xuICAgIH1cblxuICAgIC8vIFN1YnNjcmliZSB0byBvYnNlcnZhYmxlc1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5jYWxsU3RhdGUkLnN1YnNjcmliZShzdGF0ZSA9PiB7XG4gICAgICAgIHRoaXMuY2FsbFN0YXRlID0gc3RhdGU7XG4gICAgICAgIHRoaXMuaXNTcGVha2luZyA9IHN0YXRlID09PSAndGFsa2luZyc7XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2xpc3RlbmluZycgfHwgc3RhdGUgPT09ICd0YWxraW5nJykge1xuICAgICAgICAgIHRoaXMuaGFzTGVmdENvbm5lY3RlZE9uY2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSA9PT0gJ2lkbGUnIHx8IHN0YXRlID09PSAnZW5kZWQnKSB7XG4gICAgICAgICAgdGhpcy5oYXNMZWZ0Q29ubmVjdGVkT25jZSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2Uuc3RhdHVzVGV4dCQuc3Vic2NyaWJlKHRleHQgPT4ge1xuICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSB0ZXh0O1xuICAgICAgfSlcbiAgICApO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnB1c2goXG4gICAgICB0aGlzLnZvaWNlQWdlbnRTZXJ2aWNlLmR1cmF0aW9uJC5zdWJzY3JpYmUoZHVyYXRpb24gPT4ge1xuICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuaXNNaWNNdXRlZCQuc3Vic2NyaWJlKG11dGVkID0+IHtcbiAgICAgICAgdGhpcy5pc01pY011dGVkID0gbXV0ZWQ7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuaXNVc2VyU3BlYWtpbmckLnN1YnNjcmliZShzcGVha2luZyA9PiB7XG4gICAgICAgIHRoaXMuaXNVc2VyU3BlYWtpbmcgPSBzcGVha2luZztcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgdGhpcy52b2ljZUFnZW50U2VydmljZS5hdWRpb0xldmVscyQuc3Vic2NyaWJlKGxldmVscyA9PiB7XG4gICAgICAgIHRoaXMuYXVkaW9MZXZlbHMgPSBsZXZlbHM7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICAvLyBNb2RhbCBvcGVucyBpbiBpZGxlIHN0YXRlLCB0aGVuIGltbWVkaWF0ZWx5IHN0YXJ0cyBjb25uZWN0aW5nLlxuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UucmVzZXRUb0lkbGUoKTtcbiAgICB2b2lkIHRoaXMuc3RhcnRDYWxsKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuZm9yRWFjaChzdWIgPT4gc3ViLnVuc3Vic2NyaWJlKCkpO1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICB9XG5cbiAgaXNDb25uZWN0aW5nOiBib29sZWFuID0gZmFsc2U7XG5cbiAgYXN5bmMgc3RhcnRDYWxsKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzQ29ubmVjdGluZyB8fCAodGhpcy5jYWxsU3RhdGUgIT09ICdpZGxlJyAmJiB0aGlzLmNhbGxTdGF0ZSAhPT0gJ2VuZGVkJykpIHJldHVybjtcbiAgICB0aGlzLmlzQ29ubmVjdGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudm9pY2VBZ2VudFNlcnZpY2UuY29ubmVjdChcbiAgICAgICAgdGhpcy5hcGlVcmwsXG4gICAgICAgIHRoaXMudG9rZW4sXG4gICAgICAgIHRoaXMuYm90SWQsXG4gICAgICAgIHRoaXMuY29udmVyc2F0aW9uSWQsXG4gICAgICAgIHRoaXMuYXBpS2V5LFxuICAgICAgICB0aGlzLmV2ZW50VG9rZW4sXG4gICAgICAgIHRoaXMuZXZlbnRJZCxcbiAgICAgICAgdGhpcy5ldmVudFVybCxcbiAgICAgICAgdGhpcy5kb21haW5BdXRob3JpdHksXG4gICAgICAgIHRoaXMudXNlcnNBcGlVcmwgfHwgdW5kZWZpbmVkLFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGNvbm5lY3Qgdm9pY2UgYWdlbnQ6JywgZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLmlzQ29ubmVjdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy52b2ljZUFnZW50U2VydmljZS5kaXNjb25uZWN0KCk7XG4gIH1cblxuICB0b2dnbGVNaWMoKTogdm9pZCB7XG4gICAgdGhpcy52b2ljZUFnZW50U2VydmljZS50b2dnbGVNaWMoKTtcbiAgfVxuXG4gIC8qKiBNYXAgYXVkaW8gbGV2ZWwgKDDigJMxMDApIHRvIHdhdmVmb3JtIGJhciBoZWlnaHQgaW4gcHggKDPigJMyMCkuICovXG4gIGdldFdhdmVmb3JtSGVpZ2h0KGxldmVsOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGNvbnN0IG4gPSBNYXRoLm1pbigxMDAsIE1hdGgubWF4KDAsIGxldmVsID8/IDApKTtcbiAgICByZXR1cm4gMyArIChuIC8gMTAwKSAqIDE3O1xuICB9XG5cbiAgLyoqIFN0YXR1cyBsYWJlbCBmb3IgYWN0aXZlIGNhbGwuICovXG4gIGdldCBzdGF0dXNMYWJlbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmNhbGxTdGF0ZSA9PT0gJ2Nvbm5lY3RpbmcnKSByZXR1cm4gdGhpcy5zdGF0dXNUZXh0IHx8ICdDb25uZWN0aW5nLi4uJztcbiAgICBpZiAodGhpcy5jYWxsU3RhdGUgPT09ICd0YWxraW5nJykgcmV0dXJuICdUYWxraW5nLi4uJztcbiAgICBpZiAodGhpcy5jYWxsU3RhdGUgPT09ICdsaXN0ZW5pbmcnKSByZXR1cm4gJ0xpc3RlbmluZyc7XG4gICAgaWYgKHRoaXMuY2FsbFN0YXRlID09PSAnY29ubmVjdGVkJykge1xuICAgICAgcmV0dXJuIHRoaXMuaGFzTGVmdENvbm5lY3RlZE9uY2UgPyAnVGFsa2luZy4uLicgOiAnQ29ubmVjdGVkJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc3RhdHVzVGV4dCB8fCAnJztcbiAgfVxuXG4gIC8qKiBDYWxsIEFnYWluOiByZXNldCB0byBpZGxlIHRoZW4gc3RhcnQgYSBuZXcgY2FsbC4gKi9cbiAgY2FsbEFnYWluKCk6IHZvaWQge1xuICAgIHRoaXMudm9pY2VBZ2VudFNlcnZpY2UucmVzZXRUb0lkbGUoKTtcbiAgICB0aGlzLnN0YXJ0Q2FsbCgpO1xuICB9XG5cbiAgLyoqIEJhY2sgdG8gQ2hhdDogY2xvc2UgbW9kYWwgYW5kIGRpc2Nvbm5lY3QuICovXG4gIGJhY2tUb0NoYXQoKTogdm9pZCB7XG4gICAgdGhpcy5lbmRDYWxsKCk7XG4gIH1cblxuICAvKiogRW5kIGNhbGwgYnV0IGtlZXAgbW9kYWwgb3BlbiB0byBzaG93IENhbGwgRW5kZWQgKyBDYWxsIEFnYWluIC8gQmFjayB0byBDaGF0LiAqL1xuICBoYW5nVXAoKTogdm9pZCB7XG4gICAgdGhpcy5kaXNjb25uZWN0KCk7XG4gIH1cblxuICBlbmRDYWxsKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIHRoaXMub25DbG9zZUNhbGxiYWNrPy4oKTtcbiAgICB0aGlzLmNsb3NlLmVtaXQoKTtcbiAgfVxufVxuIl19
@@ -24,8 +24,7 @@ export class DailyVoiceClientService {
24
24
  this.remoteAudioElement = null;
25
25
  /** AnalyserNode-based remote audio monitor for instant bot speaking detection. */
26
26
  this.remoteAudioContext = null;
27
- /** Poll interval id (~100ms); named historically when RAF was used. */
28
- this.remoteSpeakingPollId = null;
27
+ this.remoteSpeakingRAF = null;
29
28
  this.speakingSubject = new BehaviorSubject(false);
30
29
  this.userSpeakingSubject = new BehaviorSubject(false);
31
30
  this.micMutedSubject = new BehaviorSubject(false);
@@ -43,18 +42,15 @@ export class DailyVoiceClientService {
43
42
  * Connect to Daily room. Acquires mic first for waveform, then joins with audio.
44
43
  * @param roomUrl Daily room URL (from room_created)
45
44
  * @param token Optional meeting token
46
- * @param existingStream Optional pre-acquired mic (avoids a second getUserMedia / extra prompts on some browsers)
47
45
  */
48
- connect(roomUrl, token, existingStream) {
46
+ connect(roomUrl, token) {
49
47
  return __awaiter(this, void 0, void 0, function* () {
50
48
  if (this.callObject) {
51
49
  yield this.disconnect();
52
50
  }
53
51
  try {
54
- const hasLiveTrack = !!(existingStream === null || existingStream === void 0 ? void 0 : existingStream.getAudioTracks().some((t) => t.readyState === 'live'));
55
- const stream = hasLiveTrack
56
- ? existingStream
57
- : yield navigator.mediaDevices.getUserMedia({ audio: true });
52
+ // Get mic stream for both Daily and waveform (single capture)
53
+ const stream = yield navigator.mediaDevices.getUserMedia({ audio: true });
58
54
  const audioTrack = stream.getAudioTracks()[0];
59
55
  if (!audioTrack) {
60
56
  stream.getTracks().forEach((t) => t.stop());
@@ -186,7 +182,7 @@ export class DailyVoiceClientService {
186
182
  }
187
183
  /**
188
184
  * Monitor remote audio track energy via AnalyserNode.
189
- * Polls at ~10Hz; sufficient for speaking detection vs ~60fps RAF.
185
+ * Polls at ~60fps and flips speakingSubject based on actual audio energy.
190
186
  */
191
187
  monitorRemoteAudio(track) {
192
188
  this.stopRemoteAudioMonitor();
@@ -200,17 +196,11 @@ export class DailyVoiceClientService {
200
196
  const dataArray = new Uint8Array(analyser.frequencyBinCount);
201
197
  const THRESHOLD = 5;
202
198
  const SILENCE_MS = 1500;
203
- const POLL_MS = 100;
204
199
  let lastSoundTime = 0;
205
200
  let isSpeaking = false;
206
- this.remoteSpeakingPollId = setInterval(() => {
207
- if (!this.remoteAudioContext) {
208
- if (this.remoteSpeakingPollId) {
209
- clearInterval(this.remoteSpeakingPollId);
210
- this.remoteSpeakingPollId = null;
211
- }
201
+ const poll = () => {
202
+ if (!this.remoteAudioContext)
212
203
  return;
213
- }
214
204
  analyser.getByteFrequencyData(dataArray);
215
205
  let sum = 0;
216
206
  for (let i = 0; i < dataArray.length; i++) {
@@ -234,16 +224,18 @@ export class DailyVoiceClientService {
234
224
  console.log(`[VoiceDebug] Bot audio silence detected (speaking=false) — ${new Date().toISOString()}`);
235
225
  this.ngZone.run(() => this.speakingSubject.next(false));
236
226
  }
237
- }, POLL_MS);
227
+ this.remoteSpeakingRAF = requestAnimationFrame(poll);
228
+ };
229
+ this.remoteSpeakingRAF = requestAnimationFrame(poll);
238
230
  }
239
231
  catch (err) {
240
232
  console.warn('DailyVoiceClient: failed to create remote audio monitor', err);
241
233
  }
242
234
  }
243
235
  stopRemoteAudioMonitor() {
244
- if (this.remoteSpeakingPollId !== null) {
245
- clearInterval(this.remoteSpeakingPollId);
246
- this.remoteSpeakingPollId = null;
236
+ if (this.remoteSpeakingRAF) {
237
+ cancelAnimationFrame(this.remoteSpeakingRAF);
238
+ this.remoteSpeakingRAF = null;
247
239
  }
248
240
  if (this.remoteAudioContext) {
249
241
  this.remoteAudioContext.close().catch(() => { });
@@ -310,4 +302,4 @@ DailyVoiceClientService.decorators = [
310
302
  DailyVoiceClientService.ctorParameters = () => [
311
303
  { type: NgZone }
312
304
  ];
313
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBOEJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTdCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QywwRUFBMEU7UUFDbEUsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUUzRCxrRkFBa0Y7UUFDMUUsdUJBQWtCLEdBQXdCLElBQUksQ0FBQztRQUN2RCx1RUFBdUU7UUFDL0QseUJBQW9CLEdBQTBDLElBQUksQ0FBQztRQUVuRSxvQkFBZSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQ3RELHdCQUFtQixHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQzFELG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsdUJBQWtCLEdBQUcsSUFBSSxlQUFlLENBQXFCLElBQUksQ0FBQyxDQUFDO1FBRTNFLGdFQUFnRTtRQUNoRSxjQUFTLEdB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QyxDQUFDO1FBQ25DLHVEQUF1RDtJQUN6RCxDQUFDOzs7O1lBMVRGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBbEJvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG4vKipcbiAqIERhaWx5LmpzIFdlYlJUQyBjbGllbnQgZm9yIHZvaWNlIGFnZW50IGF1ZGlvLlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGFuZCBtYW5hZ2UgRGFpbHkgQ2FsbE9iamVjdFxuICogLSBKb2luIERhaWx5IHJvb20gdXNpbmcgcm9vbV91cmxcbiAqIC0gSGFuZGxlIG1pYyBjYXB0dXJlICsgc3BlYWtlciBwbGF5YmFja1xuICogLSBCb3Qgc3BlYWtpbmcgZGV0ZWN0aW9uIHZpYSBBbmFseXNlck5vZGUgb24gcmVtb3RlIHRyYWNrIChpbnN0YW50KVxuICogLSBVc2VyIHNwZWFraW5nIGRldGVjdGlvbiB2aWEgYWN0aXZlLXNwZWFrZXItY2hhbmdlXG4gKiAtIEV4cG9zZSBzcGVha2luZyQgKGJvdCBzcGVha2luZyksIHVzZXJTcGVha2luZyQgKHVzZXIgc3BlYWtpbmcpLCBtaWNNdXRlZCRcbiAqIC0gRXhwb3NlIGxvY2FsU3RyZWFtJCBmb3Igd2F2ZWZvcm0gdmlzdWFsaXphdGlvbiAoQXVkaW9BbmFseXplclNlcnZpY2UpXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYWlseVZvaWNlQ2xpZW50U2VydmljZSB7XG4gIHByaXZhdGUgY2FsbE9iamVjdDogRGFpbHlDYWxsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogRXhwbGljaXQgcGxheWJhY2sgb2YgcmVtb3RlIChib3QpIGF1ZGlvOyByZXF1aXJlZCBpbiBzb21lIGJyb3dzZXJzLiAqL1xuICBwcml2YXRlIHJlbW90ZUF1ZGlvRWxlbWVudDogSFRNTEF1ZGlvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBBbmFseXNlck5vZGUtYmFzZWQgcmVtb3RlIGF1ZGlvIG1vbml0b3IgZm9yIGluc3RhbnQgYm90IHNwZWFraW5nIGRldGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSByZW1vdGVBdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICAvKiogUG9sbCBpbnRlcnZhbCBpZCAofjEwMG1zKTsgbmFtZWQgaGlzdG9yaWNhbGx5IHdoZW4gUkFGIHdhcyB1c2VkLiAqL1xuICBwcml2YXRlIHJlbW90ZVNwZWFraW5nUG9sbElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRJbnRlcnZhbD4gfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHVzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBtaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhU3RyZWFtIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFRydWUgd2hlbiBib3QgKHJlbW90ZSBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICBzcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGVuIHVzZXIgKGxvY2FsIHBhcnRpY2lwYW50KSBpcyB0aGUgYWN0aXZlIHNwZWFrZXIuICovXG4gIHVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiBtaWMgaXMgbXV0ZWQuICovXG4gIG1pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyBsb2NhbCBtaWMgc3RyZWFtIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uLiAqL1xuICBsb2NhbFN0cmVhbSQ6IE9ic2VydmFibGU8TWVkaWFTdHJlYW0gfCBudWxsPiA9XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBEYWlseSByb29tLiBBY3F1aXJlcyBtaWMgZmlyc3QgZm9yIHdhdmVmb3JtLCB0aGVuIGpvaW5zIHdpdGggYXVkaW8uXG4gICAqIEBwYXJhbSByb29tVXJsIERhaWx5IHJvb20gVVJMIChmcm9tIHJvb21fY3JlYXRlZClcbiAgICogQHBhcmFtIHRva2VuIE9wdGlvbmFsIG1lZXRpbmcgdG9rZW5cbiAgICogQHBhcmFtIGV4aXN0aW5nU3RyZWFtIE9wdGlvbmFsIHByZS1hY3F1aXJlZCBtaWMgKGF2b2lkcyBhIHNlY29uZCBnZXRVc2VyTWVkaWEgLyBleHRyYSBwcm9tcHRzIG9uIHNvbWUgYnJvd3NlcnMpXG4gICAqL1xuICBhc3luYyBjb25uZWN0KFxuICAgIHJvb21Vcmw6IHN0cmluZyxcbiAgICB0b2tlbj86IHN0cmluZyxcbiAgICBleGlzdGluZ1N0cmVhbT86IE1lZGlhU3RyZWFtLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICBhd2FpdCB0aGlzLmRpc2Nvbm5lY3QoKTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgaGFzTGl2ZVRyYWNrID1cbiAgICAgICAgISFleGlzdGluZ1N0cmVhbT8uZ2V0QXVkaW9UcmFja3MoKS5zb21lKCh0KSA9PiB0LnJlYWR5U3RhdGUgPT09ICdsaXZlJyk7XG4gICAgICBjb25zdCBzdHJlYW0gPSBoYXNMaXZlVHJhY2tcbiAgICAgICAgPyBleGlzdGluZ1N0cmVhbSFcbiAgICAgICAgOiBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHN0cmVhbS5nZXRBdWRpb1RyYWNrcygpWzBdO1xuICAgICAgaWYgKCFhdWRpb1RyYWNrKSB7XG4gICAgICAgIHN0cmVhbS5nZXRUcmFja3MoKS5mb3JFYWNoKCh0KSA9PiB0LnN0b3AoKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignTm8gYXVkaW8gdHJhY2snKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2NhbFN0cmVhbSA9IHN0cmVhbTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW1TdWJqZWN0Lm5leHQoc3RyZWFtKTtcblxuICAgICAgLy8gQ3JlYXRlIGF1ZGlvLW9ubHkgY2FsbCBvYmplY3RcbiAgICAgIC8vIHZpZGVvU291cmNlOiBmYWxzZSA9IG5vIGNhbWVyYSwgYXVkaW9Tb3VyY2UgPSBvdXIgbWljIHRyYWNrXG4gICAgICBjb25zdCBjYWxsT2JqZWN0ID0gRGFpbHkuY3JlYXRlQ2FsbE9iamVjdCh7XG4gICAgICAgIHZpZGVvU291cmNlOiBmYWxzZSxcbiAgICAgICAgYXVkaW9Tb3VyY2U6IGF1ZGlvVHJhY2ssXG4gICAgICB9KTtcblxuICAgICAgdGhpcy5jYWxsT2JqZWN0ID0gY2FsbE9iamVjdDtcblxuICAgICAgdGhpcy5zZXR1cEV2ZW50SGFuZGxlcnMoY2FsbE9iamVjdCk7XG5cbiAgICAgIC8vIEpvaW4gcm9vbTsgRGFpbHkgaGFuZGxlcyBwbGF5YmFjayBvZiByZW1vdGUgKGJvdCkgYXVkaW8gYXV0b21hdGljYWxseS5cbiAgICAgIC8vIE9ubHkgcGFzcyB0b2tlbiB3aGVuIGl0J3MgYSBub24tZW1wdHkgc3RyaW5nIChEYWlseSByZWplY3RzIHVuZGVmaW5lZC9ub24tc3RyaW5nKS5cbiAgICAgIGNvbnN0IGpvaW5PcHRpb25zOiB7IHVybDogc3RyaW5nOyB0b2tlbj86IHN0cmluZyB9ID0geyB1cmw6IHJvb21VcmwgfTtcbiAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnICYmIHRva2VuLnRyaW0oKSAhPT0gJycpIHtcbiAgICAgICAgam9pbk9wdGlvbnMudG9rZW4gPSB0b2tlbjtcbiAgICAgIH1cbiAgICAgIGF3YWl0IGNhbGxPYmplY3Quam9pbihqb2luT3B0aW9ucyk7XG4gICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIFJvb20gY29ubmVjdGVkIChEYWlseSBqb2luIGNvbXBsZXRlKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIGNvbnN0IHBhcnRpY2lwYW50cyA9IGNhbGxPYmplY3QucGFydGljaXBhbnRzKCk7XG4gICAgICBpZiAocGFydGljaXBhbnRzPy5sb2NhbCkge1xuICAgICAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gcGFydGljaXBhbnRzLmxvY2FsLnNlc3Npb25faWQ7XG4gICAgICB9XG5cbiAgICAgIC8vIEluaXRpYWwgbXV0ZSBzdGF0ZTogRGFpbHkgc3RhcnRzIHdpdGggYXVkaW8gb25cbiAgICAgIHRoaXMubWljTXV0ZWRTdWJqZWN0Lm5leHQoIWNhbGxPYmplY3QubG9jYWxBdWRpbygpKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBFdmVudEhhbmRsZXJzKGNhbGw6IERhaWx5Q2FsbCk6IHZvaWQge1xuICAgIC8vIGFjdGl2ZS1zcGVha2VyLWNoYW5nZTogdXNlZCBPTkxZIGZvciB1c2VyIHNwZWFraW5nIGRldGVjdGlvbi5cbiAgICAvLyBCb3Qgc3BlYWtpbmcgaXMgZGV0ZWN0ZWQgYnkgb3VyIG93biBBbmFseXNlck5vZGUgKGluc3RhbnQsIG5vIGRlYm91bmNlKS5cbiAgICBjYWxsLm9uKCdhY3RpdmUtc3BlYWtlci1jaGFuZ2UnLCAoZXZlbnQ6IHsgYWN0aXZlU3BlYWtlcj86IHsgcGVlcklkPzogc3RyaW5nIH0gfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcGVlcklkID0gZXZlbnQ/LmFjdGl2ZVNwZWFrZXI/LnBlZXJJZDtcbiAgICAgICAgaWYgKCFwZWVySWQgfHwgIXRoaXMubG9jYWxTZXNzaW9uSWQpIHtcbiAgICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGlzTG9jYWwgPSBwZWVySWQgPT09IHRoaXMubG9jYWxTZXNzaW9uSWQ7XG4gICAgICAgIHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGlzTG9jYWwpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAvLyB0cmFjay1zdGFydGVkIC8gdHJhY2stc3RvcHBlZDogc2V0IHVwIHJlbW90ZSBhdWRpbyBwbGF5YmFjayArIEFuYWx5c2VyTm9kZSBtb25pdG9yLlxuICAgIGNhbGwub24oJ3RyYWNrLXN0YXJ0ZWQnLCAoZXZlbnQ6IHsgcGFydGljaXBhbnQ/OiBEYWlseVBhcnRpY2lwYW50IHwgbnVsbDsgdHlwZT86IHN0cmluZzsgdHJhY2s/OiBNZWRpYVN0cmVhbVRyYWNrIH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBldmVudD8ucGFydGljaXBhbnQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudD8udHlwZSA/PyBldmVudD8udHJhY2s/LmtpbmQ7XG4gICAgICAgIGNvbnN0IHRyYWNrID0gZXZlbnQ/LnRyYWNrO1xuICAgICAgICBpZiAocCAmJiAhcC5sb2NhbCAmJiB0eXBlID09PSAnYXVkaW8nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBHb3QgYXVkaW8gdHJhY2sgZnJvbSBiYWNrZW5kICh0cmFjay1zdGFydGVkKSDigJQgcmVhZHlTdGF0ZT0ke3RyYWNrPy5yZWFkeVN0YXRlfSwgbXV0ZWQ9JHt0cmFjaz8ubXV0ZWR9IOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICBjb25zdCBhdWRpb1RyYWNrID0gdHJhY2sgPz8gKHAgYXMgeyB0cmFja3M/OiB7IGF1ZGlvPzogeyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSB9IH0pLnRyYWNrcz8uYXVkaW8/LnRyYWNrO1xuICAgICAgICAgIGlmIChhdWRpb1RyYWNrICYmIHR5cGVvZiBhdWRpb1RyYWNrID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdGhpcy5wbGF5UmVtb3RlVHJhY2soYXVkaW9UcmFjayk7XG4gICAgICAgICAgICB0aGlzLm1vbml0b3JSZW1vdGVBdWRpbyhhdWRpb1RyYWNrKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbigndHJhY2stc3RvcHBlZCcsIChldmVudDogeyBwYXJ0aWNpcGFudD86IERhaWx5UGFydGljaXBhbnQgfCBudWxsOyB0eXBlPzogc3RyaW5nOyB0cmFjaz86IE1lZGlhU3RyZWFtVHJhY2sgfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc3QgcCA9IGV2ZW50Py5wYXJ0aWNpcGFudDtcbiAgICAgICAgY29uc3QgdHlwZSA9IGV2ZW50Py50eXBlID8/IGV2ZW50Py50cmFjaz8ua2luZDtcbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvTW9uaXRvcigpO1xuICAgICAgICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY2FsbC5vbignbGVmdC1tZWV0aW5nJywgKCkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuY2xlYW51cCgpKTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ2Vycm9yJywgKGV2ZW50PzogeyBlcnJvck1zZz86IHN0cmluZyB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdEYWlseVZvaWNlQ2xpZW50OiBEYWlseSBlcnJvcicsIGV2ZW50Py5lcnJvck1zZyA/PyBldmVudCk7XG4gICAgICAgIHRoaXMuY2xlYW51cCgpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUGxheSByZW1vdGUgKGJvdCkgYXVkaW8gdHJhY2sgdmlhIGEgZGVkaWNhdGVkIGF1ZGlvIGVsZW1lbnQuXG4gICAqIFJlcXVpcmVkIGluIG1hbnkgYnJvd3NlcnMgd2hlcmUgRGFpbHkncyBpbnRlcm5hbCBwbGF5YmFjayBkb2VzIG5vdCBvdXRwdXQgdG8gc3BlYWtlcnMuXG4gICAqL1xuICBwcml2YXRlIHBsYXlSZW1vdGVUcmFjayh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gcGxheVJlbW90ZVRyYWNrIGNhbGxlZCDigJQgdHJhY2sucmVhZHlTdGF0ZT0ke3RyYWNrLnJlYWR5U3RhdGV9LCB0cmFjay5tdXRlZD0ke3RyYWNrLm11dGVkfSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG5cbiAgICAgIHRyYWNrLm9udW5tdXRlID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIFJlbW90ZSBhdWRpbyB0cmFjayBVTk1VVEVEIChhdWRpbyBkYXRhIGFycml2aW5nKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzdHJlYW0gPSBuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSk7XG4gICAgICBjb25zdCBhdWRpbyA9IG5ldyBBdWRpbygpO1xuICAgICAgYXVkaW8uYXV0b3BsYXkgPSB0cnVlO1xuICAgICAgYXVkaW8uc3JjT2JqZWN0ID0gc3RyZWFtO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0VsZW1lbnQgPSBhdWRpbztcblxuICAgICAgYXVkaW8ub25wbGF5aW5nID0gKCkgPT4ge1xuICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEF1ZGlvIGVsZW1lbnQgUExBWUlORyAoYnJvd3NlciBzdGFydGVkIHBsYXliYWNrKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICB9O1xuXG4gICAgICBsZXQgZmlyc3RUaW1lVXBkYXRlID0gdHJ1ZTtcbiAgICAgIGF1ZGlvLm9udGltZXVwZGF0ZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGZpcnN0VGltZVVwZGF0ZSkge1xuICAgICAgICAgIGZpcnN0VGltZVVwZGF0ZSA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gQXVkaW8gZWxlbWVudCBmaXJzdCBUSU1FVVBEQVRFIChhY3R1YWwgYXVkaW8gb3V0cHV0KSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHAgPSBhdWRpby5wbGF5KCk7XG4gICAgICBpZiAocCAmJiB0eXBlb2YgcC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHAudGhlbigoKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBhdWRpby5wbGF5KCkgcmVzb2x2ZWQg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdEYWlseVZvaWNlQ2xpZW50OiByZW1vdGUgYXVkaW8gcGxheSBmYWlsZWQgKG1heSBuZWVkIHVzZXIgZ2VzdHVyZSknLCBlcnIpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gZWxlbWVudCcsIGVycik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1vbml0b3IgcmVtb3RlIGF1ZGlvIHRyYWNrIGVuZXJneSB2aWEgQW5hbHlzZXJOb2RlLlxuICAgKiBQb2xscyBhdCB+MTBIejsgc3VmZmljaWVudCBmb3Igc3BlYWtpbmcgZGV0ZWN0aW9uIHZzIH42MGZwcyBSQUYuXG4gICAqL1xuICBwcml2YXRlIG1vbml0b3JSZW1vdGVBdWRpbyh0cmFjazogTWVkaWFTdHJlYW1UcmFjayk6IHZvaWQge1xuICAgIHRoaXMuc3RvcFJlbW90ZUF1ZGlvTW9uaXRvcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBjdHggPSBuZXcgQXVkaW9Db250ZXh0KCk7XG4gICAgICBjb25zdCBzb3VyY2UgPSBjdHguY3JlYXRlTWVkaWFTdHJlYW1Tb3VyY2UobmV3IE1lZGlhU3RyZWFtKFt0cmFja10pKTtcbiAgICAgIGNvbnN0IGFuYWx5c2VyID0gY3R4LmNyZWF0ZUFuYWx5c2VyKCk7XG4gICAgICBhbmFseXNlci5mZnRTaXplID0gMjU2O1xuICAgICAgc291cmNlLmNvbm5lY3QoYW5hbHlzZXIpO1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQgPSBjdHg7XG5cbiAgICAgIGNvbnN0IGRhdGFBcnJheSA9IG5ldyBVaW50OEFycmF5KGFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTtcbiAgICAgIGNvbnN0IFRIUkVTSE9MRCA9IDU7XG4gICAgICBjb25zdCBTSUxFTkNFX01TID0gMTUwMDtcbiAgICAgIGNvbnN0IFBPTExfTVMgPSAxMDA7XG4gICAgICBsZXQgbGFzdFNvdW5kVGltZSA9IDA7XG4gICAgICBsZXQgaXNTcGVha2luZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMucmVtb3RlQXVkaW9Db250ZXh0KSB7XG4gICAgICAgICAgaWYgKHRoaXMucmVtb3RlU3BlYWtpbmdQb2xsSWQpIHtcbiAgICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5yZW1vdGVTcGVha2luZ1BvbGxJZCk7XG4gICAgICAgICAgICB0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkID0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGFuYWx5c2VyLmdldEJ5dGVGcmVxdWVuY3lEYXRhKGRhdGFBcnJheSk7XG5cbiAgICAgICAgbGV0IHN1bSA9IDA7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgc3VtICs9IGRhdGFBcnJheVtpXTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhdmcgPSBzdW0gLyBkYXRhQXJyYXkubGVuZ3RoO1xuXG4gICAgICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChhdmcgPiBUSFJFU0hPTEQpIHtcbiAgICAgICAgICBsYXN0U291bmRUaW1lID0gbm93O1xuICAgICAgICAgIGlmICghaXNTcGVha2luZykge1xuICAgICAgICAgICAgaXNTcGVha2luZyA9IHRydWU7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEJvdCBhdWRpbyBlbmVyZ3kgZGV0ZWN0ZWQgKHNwZWFraW5nPXRydWUpIOKAlCBhdmc9JHthdmcudG9GaXhlZCgxKX0g4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgICAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGlzU3BlYWtpbmcgJiYgbm93IC0gbGFzdFNvdW5kVGltZSA+IFNJTEVOQ0VfTVMpIHtcbiAgICAgICAgICBpc1NwZWFraW5nID0gZmFsc2U7XG4gICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBCb3QgYXVkaW8gc2lsZW5jZSBkZXRlY3RlZCAoc3BlYWtpbmc9ZmFsc2UpIOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4gdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSkpO1xuICAgICAgICB9XG4gICAgICB9LCBQT0xMX01TKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogZmFpbGVkIHRvIGNyZWF0ZSByZW1vdGUgYXVkaW8gbW9uaXRvcicsIGVycik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbW90ZVNwZWFraW5nUG9sbElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhckludGVydmFsKHRoaXMucmVtb3RlU3BlYWtpbmdQb2xsSWQpO1xuICAgICAgdGhpcy5yZW1vdGVTcGVha2luZ1BvbGxJZCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCkge1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQuY2xvc2UoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICB0aGlzLmNhbGxPYmplY3QuZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBLZWVwIGxhc3QgbWljTXV0ZWQgc3RhdGU7IHdpbGwgcmVzZXQgb24gbmV4dCBjb25uZWN0XG4gIH1cbn1cbiJdfQ==
305
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiL1VzZXJzL3JvaGl0dGhha3VyL2hpdmUtZ3B0L0hpdmVBSS1QYWNrYWdlcy9Bbmd1bGFyL3Byb2plY3RzL2hpdmVncHQvZXZlbnRzZ3B0LWFuZ3VsYXIvc3JjLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvdm9pY2UtYWdlbnQvc2VydmljZXMvZGFpbHktdm9pY2UtY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDbkQsT0FBTyxLQUFLLE1BQU0sb0JBQW9CLENBQUM7O0FBR3ZDOzs7Ozs7Ozs7O0dBVUc7QUFJSCxNQUFNLE9BQU8sdUJBQXVCO0lBNkJsQyxZQUFvQixNQUFjO1FBQWQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQTVCMUIsZUFBVSxHQUFxQixJQUFJLENBQUM7UUFDcEMsZ0JBQVcsR0FBdUIsSUFBSSxDQUFDO1FBQ3ZDLG1CQUFjLEdBQWtCLElBQUksQ0FBQztRQUM3QywwRUFBMEU7UUFDbEUsdUJBQWtCLEdBQTRCLElBQUksQ0FBQztRQUUzRCxrRkFBa0Y7UUFDMUUsdUJBQWtCLEdBQXdCLElBQUksQ0FBQztRQUMvQyxzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBRXhDLG9CQUFlLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDdEQsd0JBQW1CLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDMUQsb0JBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUN0RCx1QkFBa0IsR0FBRyxJQUFJLGVBQWUsQ0FBcUIsSUFBSSxDQUFDLENBQUM7UUFFM0UsZ0VBQWdFO1FBQ2hFLGNBQVMsR0FBd0IsSUFBSSxDQUFD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QztLQUFBO0lBRU8sT0FBTztRQUNiLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLEdBQUUsQ0FBQyxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7U0FDeEI7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBQ0QsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUM7UUFDM0IsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25DLHVEQUF1RDtJQUN6RCxDQUFDOzs7O1lBOVNGLFVBQVUsU0FBQztnQkFDVixVQUFVLEVBQUUsTUFBTTthQUNuQjs7O1lBbEJvQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCBEYWlseSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuaW1wb3J0IHR5cGUgeyBEYWlseUNhbGwsIERhaWx5UGFydGljaXBhbnQgfSBmcm9tICdAZGFpbHktY28vZGFpbHktanMnO1xuXG4vKipcbiAqIERhaWx5LmpzIFdlYlJUQyBjbGllbnQgZm9yIHZvaWNlIGFnZW50IGF1ZGlvLlxuICogUmVzcG9uc2liaWxpdGllczpcbiAqIC0gQ3JlYXRlIGFuZCBtYW5hZ2UgRGFpbHkgQ2FsbE9iamVjdFxuICogLSBKb2luIERhaWx5IHJvb20gdXNpbmcgcm9vbV91cmxcbiAqIC0gSGFuZGxlIG1pYyBjYXB0dXJlICsgc3BlYWtlciBwbGF5YmFja1xuICogLSBCb3Qgc3BlYWtpbmcgZGV0ZWN0aW9uIHZpYSBBbmFseXNlck5vZGUgb24gcmVtb3RlIHRyYWNrIChpbnN0YW50KVxuICogLSBVc2VyIHNwZWFraW5nIGRldGVjdGlvbiB2aWEgYWN0aXZlLXNwZWFrZXItY2hhbmdlXG4gKiAtIEV4cG9zZSBzcGVha2luZyQgKGJvdCBzcGVha2luZyksIHVzZXJTcGVha2luZyQgKHVzZXIgc3BlYWtpbmcpLCBtaWNNdXRlZCRcbiAqIC0gRXhwb3NlIGxvY2FsU3RyZWFtJCBmb3Igd2F2ZWZvcm0gdmlzdWFsaXphdGlvbiAoQXVkaW9BbmFseXplclNlcnZpY2UpXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBEYWlseVZvaWNlQ2xpZW50U2VydmljZSB7XG4gIHByaXZhdGUgY2FsbE9iamVjdDogRGFpbHlDYWxsIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTdHJlYW06IE1lZGlhU3RyZWFtIHwgbnVsbCA9IG51bGw7XG4gIHByaXZhdGUgbG9jYWxTZXNzaW9uSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICAvKiogRXhwbGljaXQgcGxheWJhY2sgb2YgcmVtb3RlIChib3QpIGF1ZGlvOyByZXF1aXJlZCBpbiBzb21lIGJyb3dzZXJzLiAqL1xuICBwcml2YXRlIHJlbW90ZUF1ZGlvRWxlbWVudDogSFRNTEF1ZGlvRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIC8qKiBBbmFseXNlck5vZGUtYmFzZWQgcmVtb3RlIGF1ZGlvIG1vbml0b3IgZm9yIGluc3RhbnQgYm90IHNwZWFraW5nIGRldGVjdGlvbi4gKi9cbiAgcHJpdmF0ZSByZW1vdGVBdWRpb0NvbnRleHQ6IEF1ZGlvQ29udGV4dCB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIHJlbW90ZVNwZWFraW5nUkFGOiBudW1iZXIgfCBudWxsID0gbnVsbDtcblxuICBwcml2YXRlIHNwZWFraW5nU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwcml2YXRlIHVzZXJTcGVha2luZ1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBtaWNNdXRlZFN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHJpdmF0ZSBsb2NhbFN0cmVhbVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1lZGlhU3RyZWFtIHwgbnVsbD4obnVsbCk7XG5cbiAgLyoqIFRydWUgd2hlbiBib3QgKHJlbW90ZSBwYXJ0aWNpcGFudCkgaXMgdGhlIGFjdGl2ZSBzcGVha2VyLiAqL1xuICBzcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnNwZWFraW5nU3ViamVjdC5hc09ic2VydmFibGUoKTtcblxuICAvKiogVHJ1ZSB3aGVuIHVzZXIgKGxvY2FsIHBhcnRpY2lwYW50KSBpcyB0aGUgYWN0aXZlIHNwZWFrZXIuICovXG4gIHVzZXJTcGVha2luZyQ6IE9ic2VydmFibGU8Ym9vbGVhbj4gPSB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgLyoqIFRydWUgd2hlbiBtaWMgaXMgbXV0ZWQuICovXG4gIG1pY011dGVkJDogT2JzZXJ2YWJsZTxib29sZWFuPiA9IHRoaXMubWljTXV0ZWRTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gIC8qKiBFbWl0cyBsb2NhbCBtaWMgc3RyZWFtIGZvciB3YXZlZm9ybSB2aXN1YWxpemF0aW9uLiAqL1xuICBsb2NhbFN0cmVhbSQ6IE9ic2VydmFibGU8TWVkaWFTdHJlYW0gfCBudWxsPiA9XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSkge31cblxuICAvKipcbiAgICogQ29ubmVjdCB0byBEYWlseSByb29tLiBBY3F1aXJlcyBtaWMgZmlyc3QgZm9yIHdhdmVmb3JtLCB0aGVuIGpvaW5zIHdpdGggYXVkaW8uXG4gICAqIEBwYXJhbSByb29tVXJsIERhaWx5IHJvb20gVVJMIChmcm9tIHJvb21fY3JlYXRlZClcbiAgICogQHBhcmFtIHRva2VuIE9wdGlvbmFsIG1lZXRpbmcgdG9rZW5cbiAgICovXG4gIGFzeW5jIGNvbm5lY3Qocm9vbVVybDogc3RyaW5nLCB0b2tlbj86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmNhbGxPYmplY3QpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGlzY29ubmVjdCgpO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAvLyBHZXQgbWljIHN0cmVhbSBmb3IgYm90aCBEYWlseSBhbmQgd2F2ZWZvcm0gKHNpbmdsZSBjYXB0dXJlKVxuICAgICAgY29uc3Qgc3RyZWFtID0gYXdhaXQgbmF2aWdhdG9yLm1lZGlhRGV2aWNlcy5nZXRVc2VyTWVkaWEoeyBhdWRpbzogdHJ1ZSB9KTtcbiAgICAgIGNvbnN0IGF1ZGlvVHJhY2sgPSBzdHJlYW0uZ2V0QXVkaW9UcmFja3MoKVswXTtcbiAgICAgIGlmICghYXVkaW9UcmFjaykge1xuICAgICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCgodCkgPT4gdC5zdG9wKCkpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGF1ZGlvIHRyYWNrJyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBzdHJlYW07XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtU3ViamVjdC5uZXh0KHN0cmVhbSk7XG5cbiAgICAgIC8vIENyZWF0ZSBhdWRpby1vbmx5IGNhbGwgb2JqZWN0XG4gICAgICAvLyB2aWRlb1NvdXJjZTogZmFsc2UgPSBubyBjYW1lcmEsIGF1ZGlvU291cmNlID0gb3VyIG1pYyB0cmFja1xuICAgICAgY29uc3QgY2FsbE9iamVjdCA9IERhaWx5LmNyZWF0ZUNhbGxPYmplY3Qoe1xuICAgICAgICB2aWRlb1NvdXJjZTogZmFsc2UsXG4gICAgICAgIGF1ZGlvU291cmNlOiBhdWRpb1RyYWNrLFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IGNhbGxPYmplY3Q7XG5cbiAgICAgIHRoaXMuc2V0dXBFdmVudEhhbmRsZXJzKGNhbGxPYmplY3QpO1xuXG4gICAgICAvLyBKb2luIHJvb207IERhaWx5IGhhbmRsZXMgcGxheWJhY2sgb2YgcmVtb3RlIChib3QpIGF1ZGlvIGF1dG9tYXRpY2FsbHkuXG4gICAgICAvLyBPbmx5IHBhc3MgdG9rZW4gd2hlbiBpdCdzIGEgbm9uLWVtcHR5IHN0cmluZyAoRGFpbHkgcmVqZWN0cyB1bmRlZmluZWQvbm9uLXN0cmluZykuXG4gICAgICBjb25zdCBqb2luT3B0aW9uczogeyB1cmw6IHN0cmluZzsgdG9rZW4/OiBzdHJpbmcgfSA9IHsgdXJsOiByb29tVXJsIH07XG4gICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJyAmJiB0b2tlbi50cmltKCkgIT09ICcnKSB7XG4gICAgICAgIGpvaW5PcHRpb25zLnRva2VuID0gdG9rZW47XG4gICAgICB9XG4gICAgICBhd2FpdCBjYWxsT2JqZWN0LmpvaW4oam9pbk9wdGlvbnMpO1xuICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBSb29tIGNvbm5lY3RlZCAoRGFpbHkgam9pbiBjb21wbGV0ZSkg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuXG4gICAgICBjb25zdCBwYXJ0aWNpcGFudHMgPSBjYWxsT2JqZWN0LnBhcnRpY2lwYW50cygpO1xuICAgICAgaWYgKHBhcnRpY2lwYW50cz8ubG9jYWwpIHtcbiAgICAgICAgdGhpcy5sb2NhbFNlc3Npb25JZCA9IHBhcnRpY2lwYW50cy5sb2NhbC5zZXNzaW9uX2lkO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsIG11dGUgc3RhdGU6IERhaWx5IHN0YXJ0cyB3aXRoIGF1ZGlvIG9uXG4gICAgICB0aGlzLm1pY011dGVkU3ViamVjdC5uZXh0KCFjYWxsT2JqZWN0LmxvY2FsQXVkaW8oKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwRXZlbnRIYW5kbGVycyhjYWxsOiBEYWlseUNhbGwpOiB2b2lkIHtcbiAgICAvLyBhY3RpdmUtc3BlYWtlci1jaGFuZ2U6IHVzZWQgT05MWSBmb3IgdXNlciBzcGVha2luZyBkZXRlY3Rpb24uXG4gICAgLy8gQm90IHNwZWFraW5nIGlzIGRldGVjdGVkIGJ5IG91ciBvd24gQW5hbHlzZXJOb2RlIChpbnN0YW50LCBubyBkZWJvdW5jZSkuXG4gICAgY2FsbC5vbignYWN0aXZlLXNwZWFrZXItY2hhbmdlJywgKGV2ZW50OiB7IGFjdGl2ZVNwZWFrZXI/OiB7IHBlZXJJZD86IHN0cmluZyB9IH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBlZXJJZCA9IGV2ZW50Py5hY3RpdmVTcGVha2VyPy5wZWVySWQ7XG4gICAgICAgIGlmICghcGVlcklkIHx8ICF0aGlzLmxvY2FsU2Vzc2lvbklkKSB7XG4gICAgICAgICAgdGhpcy51c2VyU3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpc0xvY2FsID0gcGVlcklkID09PSB0aGlzLmxvY2FsU2Vzc2lvbklkO1xuICAgICAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChpc0xvY2FsKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gdHJhY2stc3RhcnRlZCAvIHRyYWNrLXN0b3BwZWQ6IHNldCB1cCByZW1vdGUgYXVkaW8gcGxheWJhY2sgKyBBbmFseXNlck5vZGUgbW9uaXRvci5cbiAgICBjYWxsLm9uKCd0cmFjay1zdGFydGVkJywgKGV2ZW50OiB7IHBhcnRpY2lwYW50PzogRGFpbHlQYXJ0aWNpcGFudCB8IG51bGw7IHR5cGU/OiBzdHJpbmc7IHRyYWNrPzogTWVkaWFTdHJlYW1UcmFjayB9KSA9PiB7XG4gICAgICB0aGlzLm5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICBjb25zdCBwID0gZXZlbnQ/LnBhcnRpY2lwYW50O1xuICAgICAgICBjb25zdCB0eXBlID0gZXZlbnQ/LnR5cGUgPz8gZXZlbnQ/LnRyYWNrPy5raW5kO1xuICAgICAgICBjb25zdCB0cmFjayA9IGV2ZW50Py50cmFjaztcbiAgICAgICAgaWYgKHAgJiYgIXAubG9jYWwgJiYgdHlwZSA9PT0gJ2F1ZGlvJykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gR290IGF1ZGlvIHRyYWNrIGZyb20gYmFja2VuZCAodHJhY2stc3RhcnRlZCkg4oCUIHJlYWR5U3RhdGU9JHt0cmFjaz8ucmVhZHlTdGF0ZX0sIG11dGVkPSR7dHJhY2s/Lm11dGVkfSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgICAgY29uc3QgYXVkaW9UcmFjayA9IHRyYWNrID8/IChwIGFzIHsgdHJhY2tzPzogeyBhdWRpbz86IHsgdHJhY2s/OiBNZWRpYVN0cmVhbVRyYWNrIH0gfSB9KS50cmFja3M/LmF1ZGlvPy50cmFjaztcbiAgICAgICAgICBpZiAoYXVkaW9UcmFjayAmJiB0eXBlb2YgYXVkaW9UcmFjayA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMucGxheVJlbW90ZVRyYWNrKGF1ZGlvVHJhY2spO1xuICAgICAgICAgICAgdGhpcy5tb25pdG9yUmVtb3RlQXVkaW8oYXVkaW9UcmFjayk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ3RyYWNrLXN0b3BwZWQnLCAoZXZlbnQ6IHsgcGFydGljaXBhbnQ/OiBEYWlseVBhcnRpY2lwYW50IHwgbnVsbDsgdHlwZT86IHN0cmluZzsgdHJhY2s/OiBNZWRpYVN0cmVhbVRyYWNrIH0pID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSBldmVudD8ucGFydGljaXBhbnQ7XG4gICAgICAgIGNvbnN0IHR5cGUgPSBldmVudD8udHlwZSA/PyBldmVudD8udHJhY2s/LmtpbmQ7XG4gICAgICAgIGlmIChwICYmICFwLmxvY2FsICYmIHR5cGUgPT09ICdhdWRpbycpIHtcbiAgICAgICAgICB0aGlzLnN0b3BSZW1vdGVBdWRpb01vbml0b3IoKTtcbiAgICAgICAgICB0aGlzLnN0b3BSZW1vdGVBdWRpbygpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGNhbGwub24oJ2xlZnQtbWVldGluZycsICgpID0+IHtcbiAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB0aGlzLmNsZWFudXAoKSk7XG4gICAgfSk7XG5cbiAgICBjYWxsLm9uKCdlcnJvcicsIChldmVudD86IHsgZXJyb3JNc2c/OiBzdHJpbmcgfSkgPT4ge1xuICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRGFpbHlWb2ljZUNsaWVudDogRGFpbHkgZXJyb3InLCBldmVudD8uZXJyb3JNc2cgPz8gZXZlbnQpO1xuICAgICAgICB0aGlzLmNsZWFudXAoKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBsYXkgcmVtb3RlIChib3QpIGF1ZGlvIHRyYWNrIHZpYSBhIGRlZGljYXRlZCBhdWRpbyBlbGVtZW50LlxuICAgKiBSZXF1aXJlZCBpbiBtYW55IGJyb3dzZXJzIHdoZXJlIERhaWx5J3MgaW50ZXJuYWwgcGxheWJhY2sgZG9lcyBub3Qgb3V0cHV0IHRvIHNwZWFrZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSBwbGF5UmVtb3RlVHJhY2sodHJhY2s6IE1lZGlhU3RyZWFtVHJhY2spOiB2b2lkIHtcbiAgICB0aGlzLnN0b3BSZW1vdGVBdWRpbygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIHBsYXlSZW1vdGVUcmFjayBjYWxsZWQg4oCUIHRyYWNrLnJlYWR5U3RhdGU9JHt0cmFjay5yZWFkeVN0YXRlfSwgdHJhY2subXV0ZWQ9JHt0cmFjay5tdXRlZH0g4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuXG4gICAgICB0cmFjay5vbnVubXV0ZSA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBSZW1vdGUgYXVkaW8gdHJhY2sgVU5NVVRFRCAoYXVkaW8gZGF0YSBhcnJpdmluZykg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IE1lZGlhU3RyZWFtKFt0cmFja10pO1xuICAgICAgY29uc3QgYXVkaW8gPSBuZXcgQXVkaW8oKTtcbiAgICAgIGF1ZGlvLmF1dG9wbGF5ID0gdHJ1ZTtcbiAgICAgIGF1ZGlvLnNyY09iamVjdCA9IHN0cmVhbTtcbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gYXVkaW87XG5cbiAgICAgIGF1ZGlvLm9ucGxheWluZyA9ICgpID0+IHtcbiAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBBdWRpbyBlbGVtZW50IFBMQVlJTkcgKGJyb3dzZXIgc3RhcnRlZCBwbGF5YmFjaykg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgfTtcblxuICAgICAgbGV0IGZpcnN0VGltZVVwZGF0ZSA9IHRydWU7XG4gICAgICBhdWRpby5vbnRpbWV1cGRhdGUgPSAoKSA9PiB7XG4gICAgICAgIGlmIChmaXJzdFRpbWVVcGRhdGUpIHtcbiAgICAgICAgICBmaXJzdFRpbWVVcGRhdGUgPSBmYWxzZTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1ZvaWNlRGVidWddIEF1ZGlvIGVsZW1lbnQgZmlyc3QgVElNRVVQREFURSAoYWN0dWFsIGF1ZGlvIG91dHB1dCkg4oCUICR7bmV3IERhdGUoKS50b0lTT1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBwID0gYXVkaW8ucGxheSgpO1xuICAgICAgaWYgKHAgJiYgdHlwZW9mIHAudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBwLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gYXVkaW8ucGxheSgpIHJlc29sdmVkIOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgIGNvbnNvbGUud2FybignRGFpbHlWb2ljZUNsaWVudDogcmVtb3RlIGF1ZGlvIHBsYXkgZmFpbGVkIChtYXkgbmVlZCB1c2VyIGdlc3R1cmUpJywgZXJyKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBjb25zb2xlLndhcm4oJ0RhaWx5Vm9pY2VDbGllbnQ6IGZhaWxlZCB0byBjcmVhdGUgcmVtb3RlIGF1ZGlvIGVsZW1lbnQnLCBlcnIpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNb25pdG9yIHJlbW90ZSBhdWRpbyB0cmFjayBlbmVyZ3kgdmlhIEFuYWx5c2VyTm9kZS5cbiAgICogUG9sbHMgYXQgfjYwZnBzIGFuZCBmbGlwcyBzcGVha2luZ1N1YmplY3QgYmFzZWQgb24gYWN0dWFsIGF1ZGlvIGVuZXJneS5cbiAgICovXG4gIHByaXZhdGUgbW9uaXRvclJlbW90ZUF1ZGlvKHRyYWNrOiBNZWRpYVN0cmVhbVRyYWNrKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGN0eCA9IG5ldyBBdWRpb0NvbnRleHQoKTtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGN0eC5jcmVhdGVNZWRpYVN0cmVhbVNvdXJjZShuZXcgTWVkaWFTdHJlYW0oW3RyYWNrXSkpO1xuICAgICAgY29uc3QgYW5hbHlzZXIgPSBjdHguY3JlYXRlQW5hbHlzZXIoKTtcbiAgICAgIGFuYWx5c2VyLmZmdFNpemUgPSAyNTY7XG4gICAgICBzb3VyY2UuY29ubmVjdChhbmFseXNlcik7XG4gICAgICB0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCA9IGN0eDtcblxuICAgICAgY29uc3QgZGF0YUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYW5hbHlzZXIuZnJlcXVlbmN5QmluQ291bnQpO1xuICAgICAgY29uc3QgVEhSRVNIT0xEID0gNTtcbiAgICAgIGNvbnN0IFNJTEVOQ0VfTVMgPSAxNTAwO1xuICAgICAgbGV0IGxhc3RTb3VuZFRpbWUgPSAwO1xuICAgICAgbGV0IGlzU3BlYWtpbmcgPSBmYWxzZTtcblxuICAgICAgY29uc3QgcG9sbCA9ICgpID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCkgcmV0dXJuO1xuICAgICAgICBhbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YShkYXRhQXJyYXkpO1xuXG4gICAgICAgIGxldCBzdW0gPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHN1bSArPSBkYXRhQXJyYXlbaV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXZnID0gc3VtIC8gZGF0YUFycmF5Lmxlbmd0aDtcblxuICAgICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgICBpZiAoYXZnID4gVEhSRVNIT0xEKSB7XG4gICAgICAgICAgbGFzdFNvdW5kVGltZSA9IG5vdztcbiAgICAgICAgICBpZiAoIWlzU3BlYWtpbmcpIHtcbiAgICAgICAgICAgIGlzU3BlYWtpbmcgPSB0cnVlO1xuICAgICAgICAgICAgY29uc29sZS5sb2coYFtWb2ljZURlYnVnXSBCb3QgYXVkaW8gZW5lcmd5IGRldGVjdGVkIChzcGVha2luZz10cnVlKSDigJQgYXZnPSR7YXZnLnRvRml4ZWQoMSl9IOKAlCAke25ldyBEYXRlKCkudG9JU09TdHJpbmcoKX1gKTtcbiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMudXNlclNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICAgICAgICAgICAgdGhpcy5zcGVha2luZ1N1YmplY3QubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChpc1NwZWFraW5nICYmIG5vdyAtIGxhc3RTb3VuZFRpbWUgPiBTSUxFTkNFX01TKSB7XG4gICAgICAgICAgaXNTcGVha2luZyA9IGZhbHNlO1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBbVm9pY2VEZWJ1Z10gQm90IGF1ZGlvIHNpbGVuY2UgZGV0ZWN0ZWQgKHNwZWFraW5nPWZhbHNlKSDigJQgJHtuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCl9YCk7XG4gICAgICAgICAgdGhpcy5uZ1pvbmUucnVuKCgpID0+IHRoaXMuc3BlYWtpbmdTdWJqZWN0Lm5leHQoZmFsc2UpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVtb3RlU3BlYWtpbmdSQUYgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocG9sbCk7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLnJlbW90ZVNwZWFraW5nUkFGID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHBvbGwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS53YXJuKCdEYWlseVZvaWNlQ2xpZW50OiBmYWlsZWQgdG8gY3JlYXRlIHJlbW90ZSBhdWRpbyBtb25pdG9yJywgZXJyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0b3BSZW1vdGVBdWRpb01vbml0b3IoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlU3BlYWtpbmdSQUYpIHtcbiAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMucmVtb3RlU3BlYWtpbmdSQUYpO1xuICAgICAgdGhpcy5yZW1vdGVTcGVha2luZ1JBRiA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCkge1xuICAgICAgdGhpcy5yZW1vdGVBdWRpb0NvbnRleHQuY2xvc2UoKS5jYXRjaCgoKSA9PiB7fSk7XG4gICAgICB0aGlzLnJlbW90ZUF1ZGlvQ29udGV4dCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzdG9wUmVtb3RlQXVkaW8oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVtb3RlQXVkaW9FbGVtZW50KSB7XG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5wYXVzZSgpO1xuICAgICAgICB0aGlzLnJlbW90ZUF1ZGlvRWxlbWVudC5zcmNPYmplY3QgPSBudWxsO1xuICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgIHRoaXMucmVtb3RlQXVkaW9FbGVtZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKiogU2V0IG1pYyBtdXRlZCBzdGF0ZS4gKi9cbiAgc2V0TXV0ZWQobXV0ZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkgcmV0dXJuO1xuICAgIHRoaXMuY2FsbE9iamVjdC5zZXRMb2NhbEF1ZGlvKCFtdXRlZCk7XG4gICAgdGhpcy5taWNNdXRlZFN1YmplY3QubmV4dChtdXRlZCk7XG4gIH1cblxuICAvKiogRGlzY29ubmVjdCBhbmQgY2xlYW51cC4gKi9cbiAgYXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIXRoaXMuY2FsbE9iamVjdCkge1xuICAgICAgdGhpcy5jbGVhbnVwKCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLmNhbGxPYmplY3QubGVhdmUoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBpZ25vcmVcbiAgICB9XG4gICAgdGhpcy5jbGVhbnVwKCk7XG4gIH1cblxuICBwcml2YXRlIGNsZWFudXAoKTogdm9pZCB7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW9Nb25pdG9yKCk7XG4gICAgdGhpcy5zdG9wUmVtb3RlQXVkaW8oKTtcbiAgICBpZiAodGhpcy5jYWxsT2JqZWN0KSB7XG4gICAgICB0aGlzLmNhbGxPYmplY3QuZGVzdHJveSgpLmNhdGNoKCgpID0+IHt9KTtcbiAgICAgIHRoaXMuY2FsbE9iamVjdCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxvY2FsU3RyZWFtKSB7XG4gICAgICB0aGlzLmxvY2FsU3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2goKHQpID0+IHQuc3RvcCgpKTtcbiAgICAgIHRoaXMubG9jYWxTdHJlYW0gPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmxvY2FsU2Vzc2lvbklkID0gbnVsbDtcbiAgICB0aGlzLnNwZWFraW5nU3ViamVjdC5uZXh0KGZhbHNlKTtcbiAgICB0aGlzLnVzZXJTcGVha2luZ1N1YmplY3QubmV4dChmYWxzZSk7XG4gICAgdGhpcy5sb2NhbFN0cmVhbVN1YmplY3QubmV4dChudWxsKTtcbiAgICAvLyBLZWVwIGxhc3QgbWljTXV0ZWQgc3RhdGU7IHdpbGwgcmVzZXQgb24gbmV4dCBjb25uZWN0XG4gIH1cbn1cbiJdfQ==