speechrecorderng 3.4.4 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/esm2020/lib/action/action.mjs +3 -3
- package/esm2020/lib/audio/audio_display.mjs +7 -9
- package/esm2020/lib/audio/audio_player.mjs +13 -26
- package/esm2020/lib/audio/capture/capture.mjs +244 -207
- package/esm2020/lib/audio/context.mjs +64 -2
- package/esm2020/lib/audio/io/stream.mjs +1 -1
- package/esm2020/lib/audio/net_audio_buffer.mjs +5 -9
- package/esm2020/lib/audio/playback/array_audio_buffer_source_node.mjs +2 -2
- package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +2 -2
- package/esm2020/lib/audio/playback/inddb_audio_buffer_source_node.mjs +1 -1
- package/esm2020/lib/audio/playback/player.mjs +137 -96
- package/esm2020/lib/audio/ui/audio_display_control.mjs +1 -1
- package/esm2020/lib/audio/ui/container.mjs +3 -3
- package/esm2020/lib/db/inddb.mjs +1 -1
- package/esm2020/lib/net/uploader.mjs +31 -28
- package/esm2020/lib/speechrecorder/project/project.mjs +1 -1
- package/esm2020/lib/speechrecorder/project/project.service.mjs +4 -4
- package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +59 -56
- package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +151 -142
- package/esm2020/lib/speechrecorder/script/script.service.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +49 -99
- package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +9 -2
- package/esm2020/lib/speechrecorder/session/controlpanel.mjs +13 -11
- package/esm2020/lib/speechrecorder/session/progress.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/prompting.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/recorder_combi_pane.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/recording_list.mjs +1 -1
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +3 -3
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +17 -16
- package/esm2020/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +13 -14
- package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +145 -135
- package/esm2020/lib/speechrecorder/session/session.service.mjs +12 -9
- package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +66 -70
- package/esm2020/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -2
- package/esm2020/lib/speechrecorderng.component.mjs +10 -16
- package/esm2020/lib/speechrecorderng.module.mjs +1 -1
- package/esm2020/lib/spr.module.version.mjs +2 -2
- package/esm2020/lib/ui/recordingitem_display.mjs +2 -2
- package/fesm2015/speechrecorderng.mjs +1077 -976
- package/fesm2015/speechrecorderng.mjs.map +1 -1
- package/fesm2020/speechrecorderng.mjs +1074 -976
- package/fesm2020/speechrecorderng.mjs.map +1 -1
- package/lib/action/action.d.ts +1 -1
- package/lib/audio/audio_display.d.ts +1 -3
- package/lib/audio/audio_player.d.ts +0 -1
- package/lib/audio/capture/capture.d.ts +5 -4
- package/lib/audio/context.d.ts +2 -0
- package/lib/audio/io/stream.d.ts +1 -1
- package/lib/audio/net_audio_buffer.d.ts +2 -4
- package/lib/audio/playback/player.d.ts +3 -2
- package/lib/net/uploader.d.ts +6 -6
- package/lib/speechrecorder/project/project.d.ts +1 -0
- package/lib/speechrecorder/project/project.service.d.ts +4 -4
- package/lib/speechrecorder/recordings/basic_recording.service.d.ts +2 -2
- package/lib/speechrecorder/recordings/recordings.service.d.ts +8 -8
- package/lib/speechrecorder/script/script.service.d.ts +2 -2
- package/lib/speechrecorder/session/audiorecorder.d.ts +1 -2
- package/lib/speechrecorder/session/basicrecorder.d.ts +4 -1
- package/lib/speechrecorder/session/controlpanel.d.ts +1 -1
- package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +1 -0
- package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +2 -2
- package/lib/speechrecorder/session/session.service.d.ts +2 -2
- package/lib/speechrecorder/session/sessionmanager.d.ts +1 -0
- package/lib/spr.module.version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -6,6 +6,7 @@ import { Observable } from "rxjs";
|
|
|
6
6
|
import { NetAudioBuffer } from "../../audio/net_audio_buffer";
|
|
7
7
|
import { UUID } from "../../utils/utils";
|
|
8
8
|
import { WavReader } from "../../audio/impl/wavreader";
|
|
9
|
+
import { AudioContextProvider } from "../../audio/context";
|
|
9
10
|
export class ChunkDownload {
|
|
10
11
|
constructor(_orgPCMAudioFormat, _orgFrameLength, _decodedAudioBuffer) {
|
|
11
12
|
this._orgPCMAudioFormat = _orgPCMAudioFormat;
|
|
@@ -58,7 +59,7 @@ let BasicRecordingService = class BasicRecordingService {
|
|
|
58
59
|
withCredentials: this.withCredentials
|
|
59
60
|
});
|
|
60
61
|
}
|
|
61
|
-
chunkAudioRequest(
|
|
62
|
+
chunkAudioRequest(baseAudioUrl, startFrame = 0, frameLength) {
|
|
62
63
|
let ausps = new URLSearchParams();
|
|
63
64
|
ausps.set('startFrame', startFrame.toString());
|
|
64
65
|
ausps.set('frameLength', frameLength.toString());
|
|
@@ -69,67 +70,69 @@ let BasicRecordingService = class BasicRecordingService {
|
|
|
69
70
|
ausps.set('requestUUID', UUID.generate());
|
|
70
71
|
}
|
|
71
72
|
let obs = new Observable(observer => {
|
|
72
|
-
this.audioRequestByURL(baseAudioUrl, ausps).subscribe(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
73
|
+
this.audioRequestByURL(baseAudioUrl, ausps).subscribe({
|
|
74
|
+
next: resp => {
|
|
75
|
+
// Do not use Promise version, which does not work with Safari 13 (13.0.5)
|
|
76
|
+
if (resp.body) {
|
|
77
|
+
//console.debug("chunkAudioRequest: observer.closed: "+observer.closed);
|
|
78
|
+
//console.debug("Audio file bytes: "+resp.body.byteLength);
|
|
79
|
+
// Check original audio format
|
|
80
|
+
let wr = new WavReader(resp.body);
|
|
81
|
+
const pcmFmt = wr.readFormat();
|
|
82
|
+
const orgFl = wr.frameLength();
|
|
83
|
+
// if(pcmFmt){
|
|
84
|
+
// console.debug("Original WAVE format of download chunk: "+pcmFmt);
|
|
85
|
+
// }else{
|
|
86
|
+
// console.error("Could not read WAVE format of original download chunk!");
|
|
87
|
+
// }
|
|
88
|
+
// if(orgFl){
|
|
89
|
+
// console.debug("Original frame length of download chunk: "+orgFl);
|
|
90
|
+
// }else{
|
|
91
|
+
// console.error("Could not read WAVE format of original download chunk!");
|
|
92
|
+
// }
|
|
93
|
+
if (pcmFmt && orgFl) {
|
|
94
|
+
AudioContextProvider.decodeAudioData(resp.body).then((ab) => {
|
|
95
|
+
//console.debug("Decoded audio chunk frames: "+ab.length);
|
|
96
|
+
let chDl = new ChunkDownload(pcmFmt, orgFl, ab);
|
|
97
|
+
observer.next(chDl);
|
|
98
|
+
observer.complete();
|
|
99
|
+
}).catch(error => {
|
|
100
|
+
//if(error instanceof HttpErrorResponse) {
|
|
101
|
+
// if (error.status == 404) {
|
|
102
|
+
// // Interpret not as an error, the file ist not recorded yet
|
|
103
|
+
// observer.next(null);
|
|
104
|
+
// observer.complete()
|
|
105
|
+
// } else {
|
|
106
|
+
// // all other states are errors
|
|
107
|
+
console.error("Recordings service chunkAudioRequest error decoding audio data: " + error.name + ": " + error.message);
|
|
108
|
+
observer.error(error);
|
|
109
|
+
// }
|
|
110
|
+
// }
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
const errMsg = 'Could not parse audio header for format and/or frame length of download.';
|
|
115
|
+
console.error(errMsg);
|
|
116
|
+
observer.error(errMsg);
|
|
117
|
+
}
|
|
110
118
|
}
|
|
111
119
|
else {
|
|
112
|
-
const errMsg = '
|
|
120
|
+
const errMsg = 'Fetching audio file: response has no body';
|
|
113
121
|
console.error(errMsg);
|
|
114
122
|
observer.error(errMsg);
|
|
115
123
|
}
|
|
124
|
+
}, error: (error) => {
|
|
125
|
+
// all other states are errors
|
|
126
|
+
//const errMsg='Fetching audio file HTTP error: '+error;
|
|
127
|
+
//console.error(errMsg);
|
|
128
|
+
observer.error(error);
|
|
129
|
+
//observer.complete();
|
|
116
130
|
}
|
|
117
|
-
else {
|
|
118
|
-
const errMsg = 'Fetching audio file: response has no body';
|
|
119
|
-
console.error(errMsg);
|
|
120
|
-
observer.error(errMsg);
|
|
121
|
-
}
|
|
122
|
-
}, (error) => {
|
|
123
|
-
// all other states are errors
|
|
124
|
-
//const errMsg='Fetching audio file HTTP error: '+error;
|
|
125
|
-
//console.error(errMsg);
|
|
126
|
-
observer.error(error);
|
|
127
|
-
//observer.complete();
|
|
128
131
|
});
|
|
129
132
|
});
|
|
130
133
|
return obs;
|
|
131
134
|
}
|
|
132
|
-
chunkAudioRequestToNetAudioBuffer(
|
|
135
|
+
chunkAudioRequestToNetAudioBuffer(baseAudioUrl, startFrame = 0, orgSampleRate, seconds, frames) {
|
|
133
136
|
//let audioUrl=baseAudioUrl+'?startFrame='+startFrame+'&frameLength='+frameLength;
|
|
134
137
|
//let audioUrl=new URL(baseAudioUrl);
|
|
135
138
|
// if(orgSampleRate!=null && frameLength%orgSampleRate>0){
|
|
@@ -153,7 +156,7 @@ let BasicRecordingService = class BasicRecordingService {
|
|
|
153
156
|
if (resp.body) {
|
|
154
157
|
//console.debug("chunkAudioRequestTonetAb: subscriber.closed: "+subscriber.closed);
|
|
155
158
|
//console.debug("chunkAudioRequestTonetAb: Audio file bytes: "+resp.body.byteLength);
|
|
156
|
-
|
|
159
|
+
AudioContextProvider.decodeAudioData(resp.body).then(ab => {
|
|
157
160
|
//console.debug("chunkAudioRequestTonetAb: Decoded audio chunk frames for netAb: "+ab.length);
|
|
158
161
|
//console.debug("chunkAudioRequestTonetAb: Create netAb ab from chunk ab...");
|
|
159
162
|
if (frames === null) {
|
|
@@ -167,7 +170,7 @@ let BasicRecordingService = class BasicRecordingService {
|
|
|
167
170
|
//console.debug("Platform sr: "+ab.sampleRate+", file sr: "+orgSampleRate+", decoded/org frame length: "+fl+"/"+frames+", ab.length: "+ab.length);
|
|
168
171
|
}
|
|
169
172
|
}
|
|
170
|
-
let nab = NetAudioBuffer.fromChunkAudioBuffer(
|
|
173
|
+
let nab = NetAudioBuffer.fromChunkAudioBuffer(this, baseAudioUrl, ab, fl, frameLength);
|
|
171
174
|
//let rp=new ReadyProvider();
|
|
172
175
|
//nab.readyProvider=rp;
|
|
173
176
|
//rp.ready();
|
|
@@ -179,7 +182,7 @@ let BasicRecordingService = class BasicRecordingService {
|
|
|
179
182
|
subscriber.next(nab);
|
|
180
183
|
subscriber.complete();
|
|
181
184
|
}
|
|
182
|
-
}
|
|
185
|
+
}).catch(error => {
|
|
183
186
|
console.error('chunkAudioRequestToNetAb: error: ' + error);
|
|
184
187
|
//if(error instanceof HttpErrorResponse) {
|
|
185
188
|
subscriber.error(error);
|
|
@@ -210,4 +213,4 @@ BasicRecordingService = __decorate([
|
|
|
210
213
|
__param(1, Inject(SPEECHRECORDER_CONFIG))
|
|
211
214
|
], BasicRecordingService);
|
|
212
215
|
export { BasicRecordingService };
|
|
213
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBR3JELE1BQU0sT0FBTyxhQUFhO0lBWXhCLFlBQW9CLGtCQUFpQyxFQUFTLGVBQXNCLEVBQVMsbUJBQStCO1FBQXhHLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBZTtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFPO1FBQVMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFZO0lBQUUsQ0FBQztJQVgvSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FBQztDQUVGO0FBRUQsSUFBYSxxQkFBcUIsR0FBbEMsTUFBYSxxQkFBcUI7SUFT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dXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cENsaWVudCwgSHR0cEhlYWRlcnMsIEh0dHBSZXNwb25zZX0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7SW5qZWN0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge0FwaVR5cGUsIFNQRUVDSFJFQ09SREVSX0NPTkZJRywgU3BlZWNoUmVjb3JkZXJDb25maWd9IGZyb20gXCIuLi8uLi9zcHIuY29uZmlnXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtOZXRBdWRpb0J1ZmZlcn0gZnJvbSBcIi4uLy4uL2F1ZGlvL25ldF9hdWRpb19idWZmZXJcIjtcclxuaW1wb3J0IHtVVUlEfSBmcm9tIFwiLi4vLi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtXYXZSZWFkZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9pbXBsL3dhdnJlYWRlclwiO1xyXG5pbXBvcnQge1BDTUF1ZGlvRm9ybWF0fSBmcm9tIFwiLi4vLi4vYXVkaW8vZm9ybWF0XCI7XHJcblxyXG5leHBvcnQgY2xhc3MgQ2h1bmtEb3dubG9hZHtcclxuICBnZXQgb3JnUENNQXVkaW9Gb3JtYXQoKTogUENNQXVkaW9Gb3JtYXQge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ1BDTUF1ZGlvRm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgZ2V0IG9yZ0ZyYW1lTGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fb3JnRnJhbWVMZW5ndGg7XHJcbiAgfVxyXG5cclxuICBnZXQgZGVjb2RlZEF1ZGlvQnVmZmVyKCk6IEF1ZGlvQnVmZmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWNvZGVkQXVkaW9CdWZmZXI7XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX29yZ1BDTUF1ZGlvRm9ybWF0OlBDTUF1ZGlvRm9ybWF0LHByaXZhdGUgX29yZ0ZyYW1lTGVuZ3RoOm51bWJlcixwcml2YXRlIF9kZWNvZGVkQXVkaW9CdWZmZXI6QXVkaW9CdWZmZXIpe31cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEJhc2ljUmVjb3JkaW5nU2VydmljZXtcclxuICAvLyBpUGFkIDl0aCBnZW5lcmF0aW9uLCBpT1MgMTUuNy4xLCBzb21ldGltZXM6XHJcbiAgLy8gRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2U6IFdlYktpdCBoYXQgZWluZW4gaW50ZXJuZW4gRmVobGVyIGZlc3RnZXN0ZWxsdFxyXG4gIC8vIEZpcmVmb3ggb24gV2luZG93cyBjcmFzaGVzXHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX0NIVU5LRURfRE9XTkxPQURfU0VDT05EUzpudW1iZXI9MTA7XHJcbiAgcHVibGljIHN0YXRpYyByZWFkb25seSBERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUzpudW1iZXI9Mjg4MDAwMCo1OyAvLyBEZWZhdWx0IDUgbWludXRlcyBvbmUgY2hhbm5lbCBhdCA0OGtIelxyXG4gIHByb3RlY3RlZCBfbWF4QXV0b05ldE1lbVN0b3JlU2FtcGxlczpudW1iZXI9QmFzaWNSZWNvcmRpbmdTZXJ2aWNlLkRFRkFVTFRfTUFYX05FVF9BVVRPX01FTV9TVE9SRV9TQU1QTEVTO1xyXG4gICAgcHJvdGVjdGVkIGFwaUVuZFBvaW50OiBzdHJpbmc7XHJcbiAgICBwcm90ZWN0ZWQgd2l0aENyZWRlbnRpYWxzOiBib29sZWFuID0gZmFsc2U7XHJcbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cDogSHR0cENsaWVudCwgQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByb3RlY3RlZCBjb25maWc/OiBTcGVlY2hSZWNvcmRlckNvbmZpZykge1xyXG4gICAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSAnJ1xyXG5cclxuICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hcGlFbmRQb2ludCkge1xyXG4gICAgICAgICAgICB0aGlzLmFwaUVuZFBvaW50ID0gY29uZmlnLmFwaUVuZFBvaW50O1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5hcGlFbmRQb2ludCAhPT0gJycpIHtcclxuICAgICAgICAgICAgdGhpcy5hcGlFbmRQb2ludCA9IHRoaXMuYXBpRW5kUG9pbnQgKyAnLydcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9IGNvbmZpZy53aXRoQ3JlZGVudGlhbHM7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBhdWRpb1JlcXVlc3RCeVVSTChhdWRpb0Jhc2VVcmw6c3RyaW5nLGF1ZGlvVVJMU2VhcmNoUGFyYW1zOlVSTFNlYXJjaFBhcmFtcyk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEFycmF5QnVmZmVyPj4ge1xyXG4gICAgICAgIGxldCBhdWRpb1VybD1hdWRpb0Jhc2VVcmw7XHJcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLmFwaVR5cGUgPT09IEFwaVR5cGUuRklMRVMpIHtcclxuICAgICAgICAgICAgLy8gZm9yIGRldmVsb3BtZW50IGFuZCBkZW1vXHJcbiAgICAgICAgICAgIGF1ZGlvVXJsPWF1ZGlvVXJsKycud2F2JztcclxuICAgICAgICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgICAgICAgIGF1ZGlvVVJMU2VhcmNoUGFyYW1zLnNldCgncmVxdWVzdFVVSUQnLFVVSUQuZ2VuZXJhdGUoKSk7XHJcbiAgICAgICAgICAgIC8vYXVkaW9VcmwgPSBhdWRpb1VybCArICcud2F2P3JlcXVlc3RVVUlEPScgKyBVVUlELmdlbmVyYXRlKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBhdWRpb1VybD1hdWRpb1VybCsnPycrYXVkaW9VUkxTZWFyY2hQYXJhbXMudG9TdHJpbmcoKTtcclxuXHJcbiAgICAgICAgbGV0IGhlYWRlcnMgPSBuZXcgSHR0cEhlYWRlcnMoKTtcclxuICAgICAgICBoZWFkZXJzID0gaGVhZGVycy5zZXQoJ0FjY2VwdCcsICdhdWRpby93YXYnKTtcclxuICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldChhdWRpb1VybCwge1xyXG4gICAgICAgICAgICBoZWFkZXJzOiBoZWFkZXJzLFxyXG4gICAgICAgICAgICBvYnNlcnZlOiAncmVzcG9uc2UnLFxyXG4gICAgICAgICAgICByZXNwb25zZVR5cGU6ICdhcnJheWJ1ZmZlcicsXHJcbiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy53aXRoQ3JlZGVudGlhbHNcclxuICAgICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHVibGljIGNodW5rQXVkaW9SZXF1ZXN0KGFDdHg6QXVkaW9Db250ZXh0LGJhc2VBdWRpb1VybDpzdHJpbmcsc3RhcnRGcmFtZTpudW1iZXI9MCxmcmFtZUxlbmd0aDpudW1iZXIpOiBPYnNlcnZhYmxlPENodW5rRG93bmxvYWR8bnVsbD4ge1xyXG5cclxuICAgICAgICBsZXQgYXVzcHM9bmV3IFVSTFNlYXJjaFBhcmFtcygpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnc3RhcnRGcmFtZScsc3RhcnRGcmFtZS50b1N0cmluZygpKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ2ZyYW1lTGVuZ3RoJyxmcmFtZUxlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgICAgICAgIC8vYXVkaW9VcmwgPSBhdWRpb1VybCArICcud2F2P3JlcXVlc3RVVUlEPScgKyBVVUlELmdlbmVyYXRlKCk7XHJcbiAgICAgICAgICAgIGF1c3BzLnNldCgncmVxdWVzdFVVSUQnLFVVSUQuZ2VuZXJhdGUoKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBsZXQgb2JzPW5ldyBPYnNlcnZhYmxlPENodW5rRG93bmxvYWR8bnVsbD4ob2JzZXJ2ZXI9PiB7XHJcbiAgICAgICAgICAgIHRoaXMuYXVkaW9SZXF1ZXN0QnlVUkwoYmFzZUF1ZGlvVXJsLGF1c3BzKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTMgKDEzLjAuNSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0OiBvYnNlcnZlci5jbG9zZWQ6IFwiK29ic2VydmVyLmNsb3NlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGZpbGUgYnl0ZXM6IFwiK3Jlc3AuYm9keS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIG9yaWdpbmFsIGF1ZGlvIGZvcm1hdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgd3I9bmV3IFdhdlJlYWRlcihyZXNwLmJvZHkpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwY21GbXQ9d3IucmVhZEZvcm1hdCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmdGbD13ci5mcmFtZUxlbmd0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihwY21GbXQpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJPcmlnaW5hbCBXQVZFIGZvcm1hdCBvZiBkb3dubG9hZCBjaHVuazogXCIrcGNtRm10KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCByZWFkIFdBVkUgZm9ybWF0IG9mIG9yaWdpbmFsIGRvd25sb2FkIGNodW5rIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZihvcmdGbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhcIk9yaWdpbmFsIGZyYW1lIGxlbmd0aCBvZiBkb3dubG9hZCBjaHVuazogXCIrb3JnRmwpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHJlYWQgV0FWRSBmb3JtYXQgb2Ygb3JpZ2luYWwgZG93bmxvYWQgY2h1bmshXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZihwY21GbXQgJiYgb3JnRmwpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFDdHguZGVjb2RlQXVkaW9EYXRhKHJlc3AuYm9keSwgYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJEZWNvZGVkIGF1ZGlvIGNodW5rIGZyYW1lczogXCIrYWIubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoRGwgPSBuZXcgQ2h1bmtEb3dubG9hZChwY21GbXQsIG9yZ0ZsLCBhYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoY2hEbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lmKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKGVycm9yLnN0YXR1cyA9PSA0MDQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG9ic2VydmVyLm5leHQobnVsbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb2JzZXJ2ZXIuY29tcGxldGUoKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIC8vIGFsbCBvdGhlciBzdGF0ZXMgYXJlIGVycm9yc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiUmVjb3JkaW5ncyBzZXJ2aWNlIGNodW5rQXVkaW9SZXF1ZXN0IGVycm9yIGRlY29kaW5nIGF1ZGlvIGRhdGE6IFwiK2Vycm9yLm5hbWUrXCI6IFwiK2Vycm9yLm1lc3NhZ2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZz0nQ291bGQgbm90IHBhcnNlIGF1ZGlvIGhlYWRlciBmb3IgZm9ybWF0IGFuZC9vciBmcmFtZSBsZW5ndGggb2YgZG93bmxvYWQuJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJNc2c9J0ZldGNoaW5nIGF1ZGlvIGZpbGU6IHJlc3BvbnNlIGhhcyBubyBib2R5JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAvL2NvbnN0IGVyck1zZz0nRmV0Y2hpbmcgYXVkaW8gZmlsZSBIVFRQIGVycm9yOiAnK2Vycm9yO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvL29ic2VydmVyLmNvbXBsZXRlKCk7XHJcblxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcblxyXG4gICAgcHJvdGVjdGVkIGNodW5rQXVkaW9SZXF1ZXN0VG9OZXRBdWRpb0J1ZmZlcihhQ3R4OiBBdWRpb0NvbnRleHQsIGJhc2VBdWRpb1VybDogc3RyaW5nLCBzdGFydEZyYW1lOiBudW1iZXIgPSAwLCBvcmdTYW1wbGVSYXRlOiBudW1iZXIsIHNlY29uZHM6bnVtYmVyLGZyYW1lczogbnVtYmVyIHwgbnVsbCk6IE9ic2VydmFibGU8TmV0QXVkaW9CdWZmZXIgfCBudWxsPiB7XHJcbiAgICAgICAgLy9sZXQgYXVkaW9Vcmw9YmFzZUF1ZGlvVXJsKyc/c3RhcnRGcmFtZT0nK3N0YXJ0RnJhbWUrJyZmcmFtZUxlbmd0aD0nK2ZyYW1lTGVuZ3RoO1xyXG4gICAgICAgIC8vbGV0IGF1ZGlvVXJsPW5ldyBVUkwoYmFzZUF1ZGlvVXJsKTtcclxuICAgICAgICAvLyBpZihvcmdTYW1wbGVSYXRlIT1udWxsICYmIGZyYW1lTGVuZ3RoJW9yZ1NhbXBsZVJhdGU+MCl7XHJcbiAgICAgICAgLy8gICBjb25zdCBlcnJNc2c9J2ZyYW1lTGVuZ3RoIG11c3QgYmUgZXF1YWwgb3IgbXVsdGlwbGUgb2Ygb3JpZ2luYWwgc2FtcGxlcmF0ZS4nO1xyXG4gICAgICAgIC8vICAgY29uc29sZS5lcnJvcihlcnJNc2crJyAoJytmcmFtZUxlbmd0aCsnJScrb3JnU2FtcGxlUmF0ZSsnPT0nKyhmcmFtZUxlbmd0aCVvcmdTYW1wbGVSYXRlKSsnKScpO1xyXG4gICAgICAgIC8vICAgdGhyb3cgRXJyb3IoZXJyTXNnKVxyXG4gICAgICAgIC8vIH1cclxuICAgICAgICBsZXQgZnJhbWVMZW5ndGg6bnVtYmVyPW9yZ1NhbXBsZVJhdGUqTWF0aC5yb3VuZChzZWNvbmRzKTtcclxuICAgICAgICBsZXQgYXVzcHM9bmV3IFVSTFNlYXJjaFBhcmFtcygpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnc3RhcnRGcmFtZScsc3RhcnRGcmFtZS50b1N0cmluZygpKTtcclxuICAgICAgICBhdXNwcy5zZXQoJ2ZyYW1lTGVuZ3RoJyxmcmFtZUxlbmd0aC50b1N0cmluZygpKTtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgICAgICAgLy8gYXBwZW5kIFVVSUQgdG8gbWFrZSByZXF1ZXN0IFVSTCB1bmlxdWUgdG8gYXZvaWQgbG9jYWxob3N0IHNlcnZlciBjYWNoaW5nXHJcbiAgICAgICAgICAgIC8vYXVkaW9VcmwgPSBhdWRpb1VybCArICcud2F2P3JlcXVlc3RVVUlEPScgKyBVVUlELmdlbmVyYXRlKCk7XHJcbiAgICAgICAgICAgIGF1c3BzLnNldCgncmVxdWVzdFVVSUQnLFVVSUQuZ2VuZXJhdGUoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGxldCBvYnM9bmV3IE9ic2VydmFibGU8TmV0QXVkaW9CdWZmZXJ8bnVsbD4oc3Vic2NyaWJlcj0+IHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlcXVlc3RCeVVSTChiYXNlQXVkaW9VcmwsYXVzcHMpLnN1YnNjcmliZSh7bmV4dDoocmVzcCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgUHJvbWlzZSB2ZXJzaW9uLCB3aGljaCBkb2VzIG5vdCB3b3JrIHdpdGggU2FmYXJpIDEzICgxMy4wLjUpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IHN1YnNjcmliZXIuY2xvc2VkOiBcIitzdWJzY3JpYmVyLmNsb3NlZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogQXVkaW8gZmlsZSBieXRlczogXCIrcmVzcC5ib2R5LmJ5dGVMZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBhQ3R4LmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHksIGFiID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IERlY29kZWQgYXVkaW8gY2h1bmsgZnJhbWVzIGZvciBuZXRBYjogXCIrYWIubGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IENyZWF0ZSBuZXRBYiBhYiBmcm9tIGNodW5rIGFiLi4uXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lcz09PW51bGwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKG5ldyBFcnJvcignQ291bGQgbm90IGdldCBmcmFtZSBsZW5ndGggZnJvbSByZWNvcmRpbmcgZmlsZSBvYmplY3QnKSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmwgPSBmcmFtZXM7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhYi5zYW1wbGVSYXRlICE9PSBvcmdTYW1wbGVSYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JnU2FtcGxlUmF0ZSAmJiBmcmFtZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbCA9IE1hdGgucm91bmQoYWIuc2FtcGxlUmF0ZSAqIGZyYW1lcyAvIG9yZ1NhbXBsZVJhdGUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIlBsYXRmb3JtIHNyOiBcIithYi5zYW1wbGVSYXRlK1wiLCBmaWxlIHNyOiBcIitvcmdTYW1wbGVSYXRlK1wiLCBkZWNvZGVkL29yZyBmcmFtZSBsZW5ndGg6IFwiK2ZsK1wiL1wiK2ZyYW1lcytcIiwgYWIubGVuZ3RoOiBcIithYi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFiID0gTmV0QXVkaW9CdWZmZXIuZnJvbUNodW5rQXVkaW9CdWZmZXIoYUN0eCwgdGhpcyxiYXNlQXVkaW9VcmwsIGFiLCBmbCxmcmFtZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbGV0IHJwPW5ldyBSZWFkeVByb3ZpZGVyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbmFiLnJlYWR5UHJvdmlkZXI9cnA7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcnAucmVhZHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFiLnJlYWR5KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYWIuZnJhbWVMZW4gPCBmcmFtZUxlbmd0aCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBCdWlsdCBuZXRBYiBhYiBmcm9tIGNodW5rIGFiOiBGaXJzdCBjaHVuayBzaG9ydGVyIHRoYSBmcmFtZUxlbmd0aCAoXCIrbmV0QWJBdWRpb0J1ZmZlci5mcmFtZUxlbitcIjxcIitmcmFtZUxlbmd0aCtcIiksIGFzc3VtaW5nIGVuZCBvZiBkYXRhLCBzZWFsaW5nIG5ldEFiIGFiLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hYi5zZWFsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KG5hYik7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBlcnJvcjogJytlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NodW5rQXVkaW9SZXF1ZXN0VG9OZXRBYjogRmV0Y2hpbmcgYXVkaW8gZmlsZTogcmVzcG9uc2UgaGFzIG5vIGJvZHknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjooZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IGVycm9yOiAnK2Vycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3N1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcbn1cclxuIl19
|
|
216
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfcmVjb3JkaW5nLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5ncy9iYXNpY19yZWNvcmRpbmcuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUFhLFdBQVcsRUFBZSxNQUFNLHNCQUFzQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBRSxxQkFBcUIsRUFBdUIsTUFBTSxrQkFBa0IsQ0FBQztBQUN0RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRXJELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXpELE1BQU0sT0FBTyxhQUFhO0lBWXhCLFlBQW9CLGtCQUFpQyxFQUFTLGVBQXNCLEVBQVMsbUJBQStCO1FBQXhHLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBZTtRQUFTLG9CQUFlLEdBQWYsZUFBZSxDQUFPO1FBQVMsd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFZO0lBQUUsQ0FBQztJQVgvSCxJQUFJLGlCQUFpQjtRQUNuQixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztJQUNqQyxDQUFDO0lBRUQsSUFBSSxjQUFjO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxrQkFBa0I7UUFDcEIsT0FBTyxJQUFJLENBQUMsbUJBQW1CLENBQUM7SUFDbEMsQ0FB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LEdBQUMsQ0FBRSxDQUFBLENBQUMseUNBQXlDO0FBTDlHLHFCQUFxQjtJQVVXLFdBQUEsTUFBTSxDQUFDLHFCQUFxQixDQUFDLENBQUE7R0FWN0QscUJBQXFCLENBdU1qQztTQXZNWSxxQkFBcUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUmVzcG9uc2V9IGZyb20gXCJAYW5ndWxhci9jb21tb24vaHR0cFwiO1xyXG5pbXBvcnQge0luamVjdH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtBcGlUeXBlLCBTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vLi4vc3ByLmNvbmZpZ1wiO1xyXG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gXCJyeGpzXCI7XHJcbmltcG9ydCB7TmV0QXVkaW9CdWZmZXJ9IGZyb20gXCIuLi8uLi9hdWRpby9uZXRfYXVkaW9fYnVmZmVyXCI7XHJcbmltcG9ydCB7VVVJRH0gZnJvbSBcIi4uLy4uL3V0aWxzL3V0aWxzXCI7XHJcbmltcG9ydCB7V2F2UmVhZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vaW1wbC93YXZyZWFkZXJcIjtcclxuaW1wb3J0IHtQQ01BdWRpb0Zvcm1hdH0gZnJvbSBcIi4uLy4uL2F1ZGlvL2Zvcm1hdFwiO1xyXG5pbXBvcnQge0F1ZGlvQ29udGV4dFByb3ZpZGVyfSBmcm9tIFwiLi4vLi4vYXVkaW8vY29udGV4dFwiO1xyXG5cclxuZXhwb3J0IGNsYXNzIENodW5rRG93bmxvYWR7XHJcbiAgZ2V0IG9yZ1BDTUF1ZGlvRm9ybWF0KCk6IFBDTUF1ZGlvRm9ybWF0IHtcclxuICAgIHJldHVybiB0aGlzLl9vcmdQQ01BdWRpb0Zvcm1hdDtcclxuICB9XHJcblxyXG4gIGdldCBvcmdGcmFtZUxlbmd0aCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX29yZ0ZyYW1lTGVuZ3RoO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGRlY29kZWRBdWRpb0J1ZmZlcigpOiBBdWRpb0J1ZmZlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVjb2RlZEF1ZGlvQnVmZmVyO1xyXG4gIH1cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9vcmdQQ01BdWRpb0Zvcm1hdDpQQ01BdWRpb0Zvcm1hdCxwcml2YXRlIF9vcmdGcmFtZUxlbmd0aDpudW1iZXIscHJpdmF0ZSBfZGVjb2RlZEF1ZGlvQnVmZmVyOkF1ZGlvQnVmZmVyKXt9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBCYXNpY1JlY29yZGluZ1NlcnZpY2V7XHJcbiAgLy8gaVBhZCA5dGggZ2VuZXJhdGlvbiwgaU9TIDE1LjcuMSwgc29tZXRpbWVzOlxyXG4gIC8vIEZhaWxlZCB0byBsb2FkIHJlc291cmNlOiBXZWJLaXQgaGF0IGVpbmVuIGludGVybmVuIEZlaGxlciBmZXN0Z2VzdGVsbHRcclxuICAvLyBGaXJlZm94IG9uIFdpbmRvd3MgY3Jhc2hlc1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9DSFVOS0VEX0RPV05MT0FEX1NFQ09ORFM6bnVtYmVyPTEwO1xyXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgREVGQVVMVF9NQVhfTkVUX0FVVE9fTUVNX1NUT1JFX1NBTVBMRVM6bnVtYmVyPTI4ODAwMDAqNTsgLy8gRGVmYXVsdCA1IG1pbnV0ZXMgb25lIGNoYW5uZWwgYXQgNDhrSHpcclxuICBwcm90ZWN0ZWQgX21heEF1dG9OZXRNZW1TdG9yZVNhbXBsZXM6bnVtYmVyPUJhc2ljUmVjb3JkaW5nU2VydmljZS5ERUZBVUxUX01BWF9ORVRfQVVUT19NRU1fU1RPUkVfU0FNUExFUztcclxuICAgIHByb3RlY3RlZCBhcGlFbmRQb2ludDogc3RyaW5nO1xyXG4gICAgcHJvdGVjdGVkIHdpdGhDcmVkZW50aWFsczogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBodHRwOiBIdHRwQ2xpZW50LCBASW5qZWN0KFNQRUVDSFJFQ09SREVSX0NPTkZJRykgcHJvdGVjdGVkIGNvbmZpZz86IFNwZWVjaFJlY29yZGVyQ29uZmlnKSB7XHJcbiAgICAgICAgdGhpcy5hcGlFbmRQb2ludCA9ICcnXHJcblxyXG4gICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmFwaUVuZFBvaW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuYXBpRW5kUG9pbnQgPSBjb25maWcuYXBpRW5kUG9pbnQ7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLmFwaUVuZFBvaW50ICE9PSAnJykge1xyXG4gICAgICAgICAgICB0aGlzLmFwaUVuZFBvaW50ID0gdGhpcy5hcGlFbmRQb2ludCArICcvJ1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29uZmlnLndpdGhDcmVkZW50aWFscyAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRoaXMud2l0aENyZWRlbnRpYWxzID0gY29uZmlnLndpdGhDcmVkZW50aWFscztcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGF1ZGlvUmVxdWVzdEJ5VVJMKGF1ZGlvQmFzZVVybDpzdHJpbmcsYXVkaW9VUkxTZWFyY2hQYXJhbXM6VVJMU2VhcmNoUGFyYW1zKTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QXJyYXlCdWZmZXI+PiB7XHJcbiAgICAgICAgbGV0IGF1ZGlvVXJsPWF1ZGlvQmFzZVVybDtcclxuICAgICAgICBpZiAodGhpcy5jb25maWcgJiYgdGhpcy5jb25maWcuYXBpVHlwZSA9PT0gQXBpVHlwZS5GSUxFUykge1xyXG4gICAgICAgICAgICAvLyBmb3IgZGV2ZWxvcG1lbnQgYW5kIGRlbW9cclxuICAgICAgICAgICAgYXVkaW9Vcmw9YXVkaW9VcmwrJy53YXYnO1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgYXVkaW9VUkxTZWFyY2hQYXJhbXMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGF1ZGlvVXJsPWF1ZGlvVXJsKyc/JythdWRpb1VSTFNlYXJjaFBhcmFtcy50b1N0cmluZygpO1xyXG5cclxuICAgICAgICBsZXQgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xyXG4gICAgICAgIGhlYWRlcnMgPSBoZWFkZXJzLnNldCgnQWNjZXB0JywgJ2F1ZGlvL3dhdicpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KGF1ZGlvVXJsLCB7XHJcbiAgICAgICAgICAgIGhlYWRlcnM6IGhlYWRlcnMsXHJcbiAgICAgICAgICAgIG9ic2VydmU6ICdyZXNwb25zZScsXHJcbiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJyxcclxuICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLndpdGhDcmVkZW50aWFsc1xyXG4gICAgICAgIH0pO1xyXG5cclxuICAgIH1cclxuXHJcbiAgICBwdWJsaWMgY2h1bmtBdWRpb1JlcXVlc3QoYmFzZUF1ZGlvVXJsOnN0cmluZyxzdGFydEZyYW1lOm51bWJlcj0wLGZyYW1lTGVuZ3RoOm51bWJlcik6IE9ic2VydmFibGU8Q2h1bmtEb3dubG9hZHxudWxsPiB7XHJcblxyXG4gICAgICAgIGxldCBhdXNwcz1uZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdzdGFydEZyYW1lJyxzdGFydEZyYW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnZnJhbWVMZW5ndGgnLGZyYW1lTGVuZ3RoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICAgICAgYXVzcHMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGxldCBvYnM9bmV3IE9ic2VydmFibGU8Q2h1bmtEb3dubG9hZHxudWxsPihvYnNlcnZlcj0+IHtcclxuICAgICAgICAgICAgdGhpcy5hdWRpb1JlcXVlc3RCeVVSTChiYXNlQXVkaW9VcmwsYXVzcHMpLnN1YnNjcmliZShcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgICAgICBuZXh0OiByZXNwID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTMgKDEzLjAuNSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3AuYm9keSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3Q6IG9ic2VydmVyLmNsb3NlZDogXCIrb2JzZXJ2ZXIuY2xvc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkF1ZGlvIGZpbGUgYnl0ZXM6IFwiK3Jlc3AuYm9keS5ieXRlTGVuZ3RoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBvcmlnaW5hbCBhdWRpbyBmb3JtYXRcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB3ciA9IG5ldyBXYXZSZWFkZXIocmVzcC5ib2R5KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBjbUZtdCA9IHdyLnJlYWRGb3JtYXQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yZ0ZsID0gd3IuZnJhbWVMZW5ndGgoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmKHBjbUZtdCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGNvbnNvbGUuZGVidWcoXCJPcmlnaW5hbCBXQVZFIGZvcm1hdCBvZiBkb3dubG9hZCBjaHVuazogXCIrcGNtRm10KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNle1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IHJlYWQgV0FWRSBmb3JtYXQgb2Ygb3JpZ2luYWwgZG93bmxvYWQgY2h1bmshXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYob3JnRmwpe1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmRlYnVnKFwiT3JpZ2luYWwgZnJhbWUgbGVuZ3RoIG9mIGRvd25sb2FkIGNodW5rOiBcIitvcmdGbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5lcnJvcihcIkNvdWxkIG5vdCByZWFkIFdBVkUgZm9ybWF0IG9mIG9yaWdpbmFsIGRvd25sb2FkIGNodW5rIVwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGNtRm10ICYmIG9yZ0ZsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udGV4dFByb3ZpZGVyLmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHkpLnRoZW4oKGFiKT0+e1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkRlY29kZWQgYXVkaW8gY2h1bmsgZnJhbWVzOiBcIithYi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaERsID0gbmV3IENodW5rRG93bmxvYWQocGNtRm10LCBvcmdGbCwgYWIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoY2hEbCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIChlcnJvci5zdGF0dXMgPT0gNDA0KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAvLyBJbnRlcnByZXQgbm90IGFzIGFuIGVycm9yLCB0aGUgZmlsZSBpc3Qgbm90IHJlY29yZGVkIHlldFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgb2JzZXJ2ZXIubmV4dChudWxsKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG9ic2VydmVyLmNvbXBsZXRlKClcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgLy8gYWxsIG90aGVyIHN0YXRlcyBhcmUgZXJyb3JzXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihcIlJlY29yZGluZ3Mgc2VydmljZSBjaHVua0F1ZGlvUmVxdWVzdCBlcnJvciBkZWNvZGluZyBhdWRpbyBkYXRhOiBcIiArIGVycm9yLm5hbWUgKyBcIjogXCIgKyBlcnJvci5tZXNzYWdlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVyck1zZyA9ICdDb3VsZCBub3QgcGFyc2UgYXVkaW8gaGVhZGVyIGZvciBmb3JtYXQgYW5kL29yIGZyYW1lIGxlbmd0aCBvZiBkb3dubG9hZC4nO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihlcnJNc2cpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyTXNnID0gJ0ZldGNoaW5nIGF1ZGlvIGZpbGU6IHJlc3BvbnNlIGhhcyBubyBib2R5JztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVyck1zZyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9LCBlcnJvcjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb3RoZXIgc3RhdGVzIGFyZSBlcnJvcnNcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc3QgZXJyTXNnPSdGZXRjaGluZyBhdWRpbyBmaWxlIEhUVFAgZXJyb3I6ICcrZXJyb3I7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZXJyb3IoZXJyTXNnKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb2JzZXJ2ZXIuY29tcGxldGUoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBvYnM7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIHByb3RlY3RlZCBjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QXVkaW9CdWZmZXIoYmFzZUF1ZGlvVXJsOiBzdHJpbmcsIHN0YXJ0RnJhbWU6IG51bWJlciA9IDAsIG9yZ1NhbXBsZVJhdGU6IG51bWJlciwgc2Vjb25kczpudW1iZXIsZnJhbWVzOiBudW1iZXIgfCBudWxsKTogT2JzZXJ2YWJsZTxOZXRBdWRpb0J1ZmZlciB8IG51bGw+IHtcclxuICAgICAgICAvL2xldCBhdWRpb1VybD1iYXNlQXVkaW9VcmwrJz9zdGFydEZyYW1lPScrc3RhcnRGcmFtZSsnJmZyYW1lTGVuZ3RoPScrZnJhbWVMZW5ndGg7XHJcbiAgICAgICAgLy9sZXQgYXVkaW9Vcmw9bmV3IFVSTChiYXNlQXVkaW9VcmwpO1xyXG4gICAgICAgIC8vIGlmKG9yZ1NhbXBsZVJhdGUhPW51bGwgJiYgZnJhbWVMZW5ndGglb3JnU2FtcGxlUmF0ZT4wKXtcclxuICAgICAgICAvLyAgIGNvbnN0IGVyck1zZz0nZnJhbWVMZW5ndGggbXVzdCBiZSBlcXVhbCBvciBtdWx0aXBsZSBvZiBvcmlnaW5hbCBzYW1wbGVyYXRlLic7XHJcbiAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKGVyck1zZysnICgnK2ZyYW1lTGVuZ3RoKyclJytvcmdTYW1wbGVSYXRlKyc9PScrKGZyYW1lTGVuZ3RoJW9yZ1NhbXBsZVJhdGUpKycpJyk7XHJcbiAgICAgICAgLy8gICB0aHJvdyBFcnJvcihlcnJNc2cpXHJcbiAgICAgICAgLy8gfVxyXG4gICAgICAgIGxldCBmcmFtZUxlbmd0aDpudW1iZXI9b3JnU2FtcGxlUmF0ZSpNYXRoLnJvdW5kKHNlY29uZHMpO1xyXG4gICAgICAgIGxldCBhdXNwcz1uZXcgVVJMU2VhcmNoUGFyYW1zKCk7XHJcbiAgICAgICAgYXVzcHMuc2V0KCdzdGFydEZyYW1lJyxzdGFydEZyYW1lLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGF1c3BzLnNldCgnZnJhbWVMZW5ndGgnLGZyYW1lTGVuZ3RoLnRvU3RyaW5nKCkpO1xyXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZyAmJiB0aGlzLmNvbmZpZy5hcGlUeXBlID09PSBBcGlUeXBlLkZJTEVTKSB7XHJcbiAgICAgICAgICAgIC8vIGZvciBkZXZlbG9wbWVudCBhbmQgZGVtb1xyXG4gICAgICAgICAgICAvLyBhcHBlbmQgVVVJRCB0byBtYWtlIHJlcXVlc3QgVVJMIHVuaXF1ZSB0byBhdm9pZCBsb2NhbGhvc3Qgc2VydmVyIGNhY2hpbmdcclxuICAgICAgICAgICAgLy9hdWRpb1VybCA9IGF1ZGlvVXJsICsgJy53YXY/cmVxdWVzdFVVSUQ9JyArIFVVSUQuZ2VuZXJhdGUoKTtcclxuICAgICAgICAgICAgYXVzcHMuc2V0KCdyZXF1ZXN0VVVJRCcsVVVJRC5nZW5lcmF0ZSgpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgbGV0IG9icz1uZXcgT2JzZXJ2YWJsZTxOZXRBdWRpb0J1ZmZlcnxudWxsPihzdWJzY3JpYmVyPT4ge1xyXG4gICAgICAgICAgICB0aGlzLmF1ZGlvUmVxdWVzdEJ5VVJMKGJhc2VBdWRpb1VybCxhdXNwcykuc3Vic2NyaWJlKHtuZXh0OihyZXNwKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gRG8gbm90IHVzZSBQcm9taXNlIHZlcnNpb24sIHdoaWNoIGRvZXMgbm90IHdvcmsgd2l0aCBTYWZhcmkgMTMgKDEzLjAuNSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcC5ib2R5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogc3Vic2NyaWJlci5jbG9zZWQ6IFwiK3N1YnNjcmliZXIuY2xvc2VkKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiY2h1bmtBdWRpb1JlcXVlc3RUb25ldEFiOiBBdWRpbyBmaWxlIGJ5dGVzOiBcIityZXNwLmJvZHkuYnl0ZUxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29udGV4dFByb3ZpZGVyLmRlY29kZUF1ZGlvRGF0YShyZXNwLmJvZHkpLnRoZW4oYWIgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogRGVjb2RlZCBhdWRpbyBjaHVuayBmcmFtZXMgZm9yIG5ldEFiOiBcIithYi5sZW5ndGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcImNodW5rQXVkaW9SZXF1ZXN0VG9uZXRBYjogQ3JlYXRlIG5ldEFiIGFiIGZyb20gY2h1bmsgYWIuLi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoZnJhbWVzPT09bnVsbCl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IobmV3IEVycm9yKCdDb3VsZCBub3QgZ2V0IGZyYW1lIGxlbmd0aCBmcm9tIHJlY29yZGluZyBmaWxlIG9iamVjdCcpKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBmbCA9IGZyYW1lcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFiLnNhbXBsZVJhdGUgIT09IG9yZ1NhbXBsZVJhdGUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmdTYW1wbGVSYXRlICYmIGZyYW1lcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsID0gTWF0aC5yb3VuZChhYi5zYW1wbGVSYXRlICogZnJhbWVzIC8gb3JnU2FtcGxlUmF0ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiUGxhdGZvcm0gc3I6IFwiK2FiLnNhbXBsZVJhdGUrXCIsIGZpbGUgc3I6IFwiK29yZ1NhbXBsZVJhdGUrXCIsIGRlY29kZWQvb3JnIGZyYW1lIGxlbmd0aDogXCIrZmwrXCIvXCIrZnJhbWVzK1wiLCBhYi5sZW5ndGg6IFwiK2FiLmxlbmd0aCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYWIgPSBOZXRBdWRpb0J1ZmZlci5mcm9tQ2h1bmtBdWRpb0J1ZmZlcih0aGlzLGJhc2VBdWRpb1VybCwgYWIsIGZsLGZyYW1lTGVuZ3RoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgcnA9bmV3IFJlYWR5UHJvdmlkZXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9uYWIucmVhZHlQcm92aWRlcj1ycDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9ycC5yZWFkeSgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWIucmVhZHkoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hYi5mcmFtZUxlbiA8IGZyYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJjaHVua0F1ZGlvUmVxdWVzdFRvbmV0QWI6IEJ1aWx0IG5ldEFiIGFiIGZyb20gY2h1bmsgYWI6IEZpcnN0IGNodW5rIHNob3J0ZXIgdGhhIGZyYW1lTGVuZ3RoIChcIituZXRBYkF1ZGlvQnVmZmVyLmZyYW1lTGVuK1wiPFwiK2ZyYW1lTGVuZ3RoK1wiKSwgYXNzdW1pbmcgZW5kIG9mIGRhdGEsIHNlYWxpbmcgbmV0QWIgYWIuXCIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFiLnNlYWwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQobmFiKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBlcnJvcjogJytlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pZihlcnJvciBpbnN0YW5jZW9mIEh0dHBFcnJvclJlc3BvbnNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcihlcnJvcik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ2NodW5rQXVkaW9SZXF1ZXN0VG9OZXRBYjogRmV0Y2hpbmcgYXVkaW8gZmlsZTogcmVzcG9uc2UgaGFzIG5vIGJvZHknKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcignY2h1bmtBdWRpb1JlcXVlc3RUb05ldEFiOiBGZXRjaGluZyBhdWRpbyBmaWxlOiByZXNwb25zZSBoYXMgbm8gYm9keScpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICBlcnJvcjooZXJyb3IpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdjaHVua0F1ZGlvUmVxdWVzdFRvTmV0QWI6IGVycm9yOiAnK2Vycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTtcclxuICAgICAgICAgICAgICAgICAgICAvL3N1YnNjcmliZXIuY29tcGxldGUoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgcmV0dXJuIG9icztcclxuICAgIH1cclxuXHJcbn1cclxuIl19
|