speechrecorderng 3.10.13 → 3.11.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/fesm2022/speechrecorderng.mjs +204 -201
- package/fesm2022/speechrecorderng.mjs.map +1 -1
- package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
- package/lib/spr.module.version.d.ts +1 -1
- package/lib/ui/canvas_layer_comp.d.ts +1 -1
- package/lib/ui/responsive_component.d.ts +1 -1
- package/package.json +13 -15
- package/esm2022/lib/action/action.mjs +0 -73
- package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
- package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
- package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
- package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
- package/esm2022/lib/audio/audio_display.mjs +0 -118
- package/esm2022/lib/audio/audio_player.mjs +0 -238
- package/esm2022/lib/audio/capture/capture.mjs +0 -855
- package/esm2022/lib/audio/context.mjs +0 -79
- package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
- package/esm2022/lib/audio/format.mjs +0 -20
- package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
- package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
- package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
- package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
- package/esm2022/lib/audio/io/stream.mjs +0 -59
- package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
- package/esm2022/lib/audio/persistor.mjs +0 -81
- package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
- package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
- package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
- package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
- package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
- package/esm2022/lib/audio/playback/player.mjs +0 -402
- package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
- package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
- package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
- package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
- package/esm2022/lib/audio/ui/common.mjs +0 -19
- package/esm2022/lib/audio/ui/container.mjs +0 -414
- package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
- package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
- package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
- package/esm2022/lib/db/inddb.mjs +0 -120
- package/esm2022/lib/dsp/utils.mjs +0 -48
- package/esm2022/lib/environment/environment.defaults.mjs +0 -9
- package/esm2022/lib/io/BinaryReader.mjs +0 -93
- package/esm2022/lib/io/BinaryWriter.mjs +0 -80
- package/esm2022/lib/io/stream.mjs +0 -259
- package/esm2022/lib/math/2d/geometry.mjs +0 -28
- package/esm2022/lib/math/complex.mjs +0 -58
- package/esm2022/lib/math/dft.mjs +0 -196
- package/esm2022/lib/media/utils.mjs +0 -14
- package/esm2022/lib/net/uploader.mjs +0 -367
- package/esm2022/lib/recorder_component.mjs +0 -65
- package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
- package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
- package/esm2022/lib/speechrecorder/recording.mjs +0 -124
- package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
- package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
- package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
- package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
- package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
- package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
- package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
- package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
- package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
- package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
- package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
- package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
- package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
- package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
- package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
- package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
- package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
- package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
- package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
- package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
- package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
- package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
- package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
- package/esm2022/lib/speechrecorderng.component.mjs +0 -392
- package/esm2022/lib/speechrecorderng.module.mjs +0 -97
- package/esm2022/lib/spr.config.mjs +0 -27
- package/esm2022/lib/spr.module.version.mjs +0 -2
- package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
- package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
- package/esm2022/lib/ui/message_dialog.mjs +0 -51
- package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
- package/esm2022/lib/ui/responsive_component.mjs +0 -24
- package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
- package/esm2022/lib/utils/ua-parser.mjs +0 -190
- package/esm2022/lib/utils/utils.mjs +0 -132
- package/esm2022/lib/utils/wake_lock.mjs +0 -114
- package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
- package/esm2022/public-api.mjs +0 -35
- package/esm2022/speechrecorderng.mjs +0 -5
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from "@angular/core";
|
|
2
|
-
import { SessionService } from "./session.service";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
export class WarningBar {
|
|
5
|
-
constructor() {
|
|
6
|
-
this.displayClass = 'off';
|
|
7
|
-
}
|
|
8
|
-
set show(show) {
|
|
9
|
-
if (show) {
|
|
10
|
-
this.displayClass = 'on';
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
this.displayClass = 'off';
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: WarningBar, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
17
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: WarningBar, selector: "app-warningbar", inputs: { warningText: "warningText", show: "show" }, providers: [SessionService], ngImport: i0, template: `
|
|
18
|
-
<div [class]="displayClass">{{warningText}}</div>
|
|
19
|
-
|
|
20
|
-
`, isInline: true, styles: [":host{flex:0 0 content;background:orange}\n", ".off{display:none}\n", ".on{padding:2px;display:inline-block;width:100%;font-weight:700;font-size:larger;text-align:center}\n"] }); }
|
|
21
|
-
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: WarningBar, decorators: [{
|
|
23
|
-
type: Component,
|
|
24
|
-
args: [{ selector: 'app-warningbar', providers: [SessionService], template: `
|
|
25
|
-
<div [class]="displayClass">{{warningText}}</div>
|
|
26
|
-
|
|
27
|
-
`, styles: [":host{flex:0 0 content;background:orange}\n", ".off{display:none}\n", ".on{padding:2px;display:inline-block;width:100%;font-weight:700;font-size:larger;text-align:center}\n"] }]
|
|
28
|
-
}], propDecorators: { warningText: [{
|
|
29
|
-
type: Input
|
|
30
|
-
}], show: [{
|
|
31
|
-
type: Input
|
|
32
|
-
}] } });
|
|
33
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FybmluZ19iYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi93YXJuaW5nX2Jhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7O0FBOEJqRCxNQUFNLE9BQU8sVUFBVTtJQTVCdkI7UUFxQ0UsaUJBQVksR0FBUSxLQUFLLENBQUM7S0FDM0I7SUFSQyxJQUFhLElBQUksQ0FBQyxJQUFZO1FBQzVCLElBQUcsSUFBSSxFQUFDLENBQUM7WUFDUCxJQUFJLENBQUMsWUFBWSxHQUFDLElBQUksQ0FBQTtRQUN4QixDQUFDO2FBQUksQ0FBQztZQUNKLElBQUksQ0FBQyxZQUFZLEdBQUMsS0FBSyxDQUFBO1FBQ3pCLENBQUM7SUFDSCxDQUFDOytHQVJVLFVBQVU7bUdBQVYsVUFBVSwrRkF6QlYsQ0FBQyxjQUFjLENBQUMsMEJBQ2pCOzs7R0FHVDs7NEZBcUJVLFVBQVU7a0JBNUJ0QixTQUFTOytCQUVFLGdCQUFnQixhQUNmLENBQUMsY0FBYyxDQUFDLFlBQ2pCOzs7R0FHVDs4QkFzQlEsV0FBVztzQkFBbkIsS0FBSztnQkFDTyxJQUFJO3NCQUFoQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIElucHV0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5pbXBvcnQge1Nlc3Npb25TZXJ2aWNlfSBmcm9tIFwiLi9zZXNzaW9uLnNlcnZpY2VcIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC13YXJuaW5nYmFyJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxkaXYgW2NsYXNzXT1cImRpc3BsYXlDbGFzc1wiPnt7d2FybmluZ1RleHR9fTwvZGl2PlxyXG5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdCB7XHJcblxyXG4gICAgZmxleDogMCAwIGNvbnRlbnQ7XHJcbiAgICBiYWNrZ3JvdW5kOiBvcmFuZ2U7XHJcblxyXG4gIH1gLGBcclxuICAgIC5vZmYge1xyXG4gICAgICBkaXNwbGF5OiBub25lO1xyXG4gICAgfVxyXG4gIGAsYFxyXG4gICAgLm9uIHtcclxuICAgICAgcGFkZGluZzogMnB4O1xyXG4gICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XHJcbiAgICAgIHdpZHRoOiAxMDAlO1xyXG4gICAgICBmb250LXdlaWdodDogYm9sZDtcclxuICAgICAgZm9udC1zaXplOiBsYXJnZXI7XHJcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcclxuICAgIH1cclxuICBgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFdhcm5pbmdCYXIge1xyXG4gIEBJbnB1dCgpIHdhcm5pbmdUZXh0ITpzdHJpbmc7XHJcbiAgQElucHV0KCkgc2V0IHNob3coc2hvdzpib29sZWFuKXtcclxuICAgIGlmKHNob3cpe1xyXG4gICAgICB0aGlzLmRpc3BsYXlDbGFzcz0nb24nXHJcbiAgICB9ZWxzZXtcclxuICAgICAgdGhpcy5kaXNwbGF5Q2xhc3M9J29mZidcclxuICAgIH1cclxuICB9XHJcbiAgZGlzcGxheUNsYXNzOnN0cmluZz0nb2ZmJztcclxufVxyXG4iXX0=
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { Uploader } from "../net/uploader";
|
|
2
|
-
import { Inject, Injectable } from "@angular/core";
|
|
3
|
-
import { SPEECHRECORDER_CONFIG } from "../spr.config";
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
import * as i1 from "@angular/common/http";
|
|
6
|
-
import * as i2 from "../spr.config";
|
|
7
|
-
export class SpeechRecorderUploader extends Uploader {
|
|
8
|
-
constructor(httpClient, config) {
|
|
9
|
-
super(httpClient, (config) ? config.withCredentials : false);
|
|
10
|
-
this.httpClient = httpClient;
|
|
11
|
-
this.config = config;
|
|
12
|
-
}
|
|
13
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SpeechRecorderUploader, deps: [{ token: i1.HttpClient }, { token: SPEECHRECORDER_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
14
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SpeechRecorderUploader }); }
|
|
15
|
-
}
|
|
16
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SpeechRecorderUploader, decorators: [{
|
|
17
|
-
type: Injectable
|
|
18
|
-
}], ctorParameters: () => [{ type: i1.HttpClient }, { type: i2.SpeechRecorderConfig, decorators: [{
|
|
19
|
-
type: Inject,
|
|
20
|
-
args: [SPEECHRECORDER_CONFIG]
|
|
21
|
-
}] }] });
|
|
22
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BydXBsb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc3BydXBsb2FkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxNQUFNLEVBQUUsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWpELE9BQU8sRUFBQyxxQkFBcUIsRUFBdUIsTUFBTSxlQUFlLENBQUM7Ozs7QUFHekUsTUFBTSxPQUFPLHNCQUF1QixTQUFRLFFBQVE7SUFFbkQsWUFBb0IsVUFBcUIsRUFBd0MsTUFBNEI7UUFDM0csS0FBSyxDQUFDLFVBQVUsRUFBQyxDQUFDLE1BQU0sQ0FBQyxDQUFBLENBQUMsQ0FBQSxNQUFNLENBQUMsZUFBZSxDQUFBLENBQUMsQ0FBQSxLQUFLLENBQUMsQ0FBQztRQUR0QyxlQUFVLEdBQVYsVUFBVSxDQUFXO1FBQXdDLFdBQU0sR0FBTixNQUFNLENBQXNCO0lBRTdHLENBQUM7K0dBSlcsc0JBQXNCLDRDQUVnQixxQkFBcUI7bUhBRjNELHNCQUFzQjs7NEZBQXRCLHNCQUFzQjtrQkFEbkMsVUFBVTs7MEJBR2tDLE1BQU07MkJBQUMscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbmltcG9ydCB7VXBsb2FkZXJ9IGZyb20gXCIuLi9uZXQvdXBsb2FkZXJcIjtcclxuaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHtTUEVFQ0hSRUNPUkRFUl9DT05GSUcsIFNwZWVjaFJlY29yZGVyQ29uZmlnfSBmcm9tIFwiLi4vc3ByLmNvbmZpZ1wiO1xyXG5cclxuQEluamVjdGFibGUoKVxyXG4gZXhwb3J0IGNsYXNzIFNwZWVjaFJlY29yZGVyVXBsb2FkZXIgZXh0ZW5kcyBVcGxvYWRlcntcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwQ2xpZW50Okh0dHBDbGllbnQsQEluamVjdChTUEVFQ0hSRUNPUkRFUl9DT05GSUcpIHByaXZhdGUgY29uZmlnPzpTcGVlY2hSZWNvcmRlckNvbmZpZyl7XHJcbiAgICBzdXBlcihodHRwQ2xpZW50LChjb25maWcpP2NvbmZpZy53aXRoQ3JlZGVudGlhbHM6ZmFsc2UpO1xyXG4gIH1cclxufVxyXG4iXX0=
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
export {};
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhcnRzdG9wc2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3N0YXJ0c3RvcHNpZ25hbC9zdGFydHN0b3BzaWduYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gICAgZXhwb3J0IGNvbnN0IGVudW0gU3RhdGUge0lETEUsIFBSRVJFQ09SRElORywgUE9TVFJFQ09SRElORywgUkVDT1JESU5HLCBPRkZ9XHJcblxyXG4gICAgZXhwb3J0IGludGVyZmFjZSBTdGFydFN0b3BTaWduYWwge1xyXG4gICAgICAgIHN0YXR1czpTdGF0ZTtcclxuICAgIH1cclxuXHJcbiJdfQ==
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
import { Component, Input } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class SimpleTrafficLight {
|
|
4
|
-
constructor() {
|
|
5
|
-
this.status = 4 /* State.OFF */;
|
|
6
|
-
}
|
|
7
|
-
set status(status) {
|
|
8
|
-
if (4 /* State.OFF */ === status) {
|
|
9
|
-
this.lighttop = 'grey';
|
|
10
|
-
this.lightmid = 'grey';
|
|
11
|
-
this.lightbottom = 'grey';
|
|
12
|
-
}
|
|
13
|
-
else if (0 /* State.IDLE */ === status) {
|
|
14
|
-
this.lighttop = 'red';
|
|
15
|
-
this.lightmid = 'grey';
|
|
16
|
-
this.lightbottom = 'grey';
|
|
17
|
-
}
|
|
18
|
-
else if (1 /* State.PRERECORDING */ == status) {
|
|
19
|
-
this.lighttop = 'red';
|
|
20
|
-
this.lightmid = 'yellow';
|
|
21
|
-
this.lightbottom = 'grey';
|
|
22
|
-
}
|
|
23
|
-
else if (3 /* State.RECORDING */ == status) {
|
|
24
|
-
this.lighttop = 'grey';
|
|
25
|
-
this.lightmid = 'grey';
|
|
26
|
-
this.lightbottom = 'green';
|
|
27
|
-
}
|
|
28
|
-
else if (2 /* State.POSTRECORDING */ == status) {
|
|
29
|
-
this.lighttop = 'grey';
|
|
30
|
-
this.lightmid = 'yellow';
|
|
31
|
-
this.lightbottom = 'grey';
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SimpleTrafficLight, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
35
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: SimpleTrafficLight, selector: "app-simpletrafficlight", inputs: { status: "status" }, ngImport: i0, template: `
|
|
36
|
-
|
|
37
|
-
<div>
|
|
38
|
-
<div class="circle {{lighttop}}"></div>
|
|
39
|
-
<div class="circle {{lightmid}}"></div>
|
|
40
|
-
<div class="circle {{lightbottom}}"></div>
|
|
41
|
-
</div>
|
|
42
|
-
`, isInline: true, styles: [".circle{width:50px;height:50px;border-radius:50%;margin:5px;background:gray}\n", ".red{background:red}\n", ".yellow{background:#ff0}\n", ".green{background:green}\n", ".black{background:#000}\n", ":host{display:flex;flex-direction:column;background:#000;padding:2px;height:170px;max-height:170px;flex:0 0 content}\n"] }); }
|
|
43
|
-
}
|
|
44
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SimpleTrafficLight, decorators: [{
|
|
45
|
-
type: Component,
|
|
46
|
-
args: [{ selector: 'app-simpletrafficlight', template: `
|
|
47
|
-
|
|
48
|
-
<div>
|
|
49
|
-
<div class="circle {{lighttop}}"></div>
|
|
50
|
-
<div class="circle {{lightmid}}"></div>
|
|
51
|
-
<div class="circle {{lightbottom}}"></div>
|
|
52
|
-
</div>
|
|
53
|
-
`, styles: [".circle{width:50px;height:50px;border-radius:50%;margin:5px;background:gray}\n", ".red{background:red}\n", ".yellow{background:#ff0}\n", ".green{background:green}\n", ".black{background:#000}\n", ":host{display:flex;flex-direction:column;background:#000;padding:2px;height:170px;max-height:170px;flex:0 0 content}\n"] }]
|
|
54
|
-
}], ctorParameters: () => [], propDecorators: { status: [{
|
|
55
|
-
type: Input
|
|
56
|
-
}] } });
|
|
57
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2ltcGxldHJhZmZpY2xpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3NwZWVjaHJlY29yZGVyL3N0YXJ0c3RvcHNpZ25hbC91aS9zaW1wbGV0cmFmZmljbGlnaHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBQyxLQUFLLEVBQUMsTUFBTSxlQUFlLENBQUE7O0FBaUQ3QyxNQUFNLE9BQU8sa0JBQWtCO0lBTTdCO1FBQ0UsSUFBSSxDQUFDLE1BQU0sb0JBQVUsQ0FBQztJQUN4QixDQUFDO0lBRUQsSUFDSSxNQUFNLENBQUMsTUFBYTtRQUN0QixJQUFJLHNCQUFjLE1BQU0sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLHVCQUFlLE1BQU0sRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUM7YUFBTSxJQUFJLDhCQUFzQixNQUFNLEVBQUUsQ0FBQztZQUN4QyxJQUFJLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztZQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUM1QixDQUFDO2FBQU0sSUFBSSwyQkFBbUIsTUFBTSxFQUFFLENBQUM7WUFDckMsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUM7WUFDdkIsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUM7UUFDN0IsQ0FBQzthQUFNLElBQUksK0JBQXVCLE1BQU0sRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDO1lBQ3ZCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzVCLENBQUM7SUFDSCxDQUFDOytHQWpDVSxrQkFBa0I7bUdBQWxCLGtCQUFrQiw0RkExQ25COzs7Ozs7O0dBT1Q7OzRGQW1DVSxrQkFBa0I7a0JBOUM5QixTQUFTOytCQUVFLHdCQUF3QixZQUV4Qjs7Ozs7OztHQU9UO3dEQThDRyxNQUFNO3NCQURULEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCxJbnB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtTdGFydFN0b3BTaWduYWwsIFN0YXRlfSBmcm9tICcuLi9zdGFydHN0b3BzaWduYWwnXHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHJcbiAgc2VsZWN0b3I6ICdhcHAtc2ltcGxldHJhZmZpY2xpZ2h0JyxcclxuXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8ZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHR0b3B9fVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHRtaWR9fVwiPjwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2lyY2xlIHt7bGlnaHRib3R0b219fVwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgYFxyXG4gICxcclxuICBzdHlsZXM6IFtgLmNpcmNsZSB7XHJcbiAgICB3aWR0aDogNTBweDtcclxuICAgIGhlaWdodDogNTBweDtcclxuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcclxuICAgIG1hcmdpbjogNXB4O1xyXG4gICAgYmFja2dyb3VuZDogZ3JleTtcclxuICB9YCwgYC5yZWQge1xyXG4gICAgYmFja2dyb3VuZDogcmVkO1xyXG4gIH1cclxuICBgLCBgXHJcbiAgICAueWVsbG93IHtcclxuICAgICAgYmFja2dyb3VuZDogeWVsbG93O1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIC5ncmVlbiB7XHJcbiAgICAgIGJhY2tncm91bmQ6IGdyZWVuO1xyXG4gICAgfVxyXG4gIGAsIGBcclxuICAgIC5ibGFjayB7XHJcbiAgICAgIGJhY2tncm91bmQ6IGJsYWNrO1xyXG4gICAgfWAsXHJcbiAgICAgIGA6aG9zdCB7XHJcbiAgICAgICAgICAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgICAgICAgICAgIGJhY2tncm91bmQ6IGJsYWNrO1xyXG4gICAgICAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAgcGFkZGluZzogMnB4O1xyXG4gICAgICAgICAgICAgaGVpZ2h0OiAxNzBweDtcclxuICAgICAgICAgICAgIG1heC1oZWlnaHQ6IDE3MHB4O1xyXG4gICAgICAgICAgICAgZmxleDogMCAwIGNvbnRlbnQ7XHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgICAgIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTaW1wbGVUcmFmZmljTGlnaHQgaW1wbGVtZW50cyBTdGFydFN0b3BTaWduYWwge1xyXG5cclxuICBsaWdodHRvcCE6IHN0cmluZztcclxuICBsaWdodG1pZCE6IHN0cmluZztcclxuICBsaWdodGJvdHRvbSE6IHN0cmluZztcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLnN0YXR1cz1TdGF0ZS5PRkY7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBzdGF0dXMoc3RhdHVzOiBTdGF0ZSkge1xyXG4gICAgaWYgKFN0YXRlLk9GRiA9PT0gc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMubGlnaHR0b3AgPSAnZ3JleSc7XHJcbiAgICAgIHRoaXMubGlnaHRtaWQgPSAnZ3JleSc7XHJcbiAgICAgIHRoaXMubGlnaHRib3R0b20gPSAnZ3JleSc7XHJcbiAgICB9IGVsc2UgaWYgKFN0YXRlLklETEUgPT09IHN0YXR1cykge1xyXG4gICAgICB0aGlzLmxpZ2h0dG9wID0gJ3JlZCc7XHJcbiAgICAgIHRoaXMubGlnaHRtaWQgPSAnZ3JleSc7XHJcbiAgICAgIHRoaXMubGlnaHRib3R0b20gPSAnZ3JleSc7XHJcbiAgICB9IGVsc2UgaWYgKFN0YXRlLlBSRVJFQ09SRElORyA9PSBzdGF0dXMpIHtcclxuICAgICAgdGhpcy5saWdodHRvcCA9ICdyZWQnO1xyXG4gICAgICB0aGlzLmxpZ2h0bWlkID0gJ3llbGxvdyc7XHJcbiAgICAgIHRoaXMubGlnaHRib3R0b20gPSAnZ3JleSc7XHJcbiAgICB9IGVsc2UgaWYgKFN0YXRlLlJFQ09SRElORyA9PSBzdGF0dXMpIHtcclxuICAgICAgdGhpcy5saWdodHRvcCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodG1pZCA9ICdncmV5JztcclxuICAgICAgdGhpcy5saWdodGJvdHRvbSA9ICdncmVlbic7XHJcbiAgICB9IGVsc2UgaWYgKFN0YXRlLlBPU1RSRUNPUkRJTkcgPT0gc3RhdHVzKSB7XHJcbiAgICAgIHRoaXMubGlnaHR0b3AgPSAnZ3JleSc7XHJcbiAgICAgIHRoaXMubGlnaHRtaWQgPSAneWVsbG93JztcclxuICAgICAgdGhpcy5saWdodGJvdHRvbSA9ICdncmV5JztcclxuICAgIH1cclxuICB9XHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
@@ -1,392 +0,0 @@
|
|
|
1
|
-
import { Component, ViewChild } from '@angular/core';
|
|
2
|
-
import { EventType as PlaybackEventType, AudioPlayer } from './audio/playback/player';
|
|
3
|
-
import { SessionManager } from './speechrecorder/session/sessionmanager';
|
|
4
|
-
import { UploaderStatus } from './net/uploader';
|
|
5
|
-
import { SessionService } from "./speechrecorder/session/session.service";
|
|
6
|
-
import { AudioStorageType, ProjectUtil } from "./speechrecorder/project/project";
|
|
7
|
-
import { Arrays } from "./utils/utils";
|
|
8
|
-
import { RecorderComponent } from "./recorder_component";
|
|
9
|
-
import { BasicRecorder } from "./speechrecorder/session/basicrecorder";
|
|
10
|
-
import { SprDb } from "./db/inddb";
|
|
11
|
-
import * as i0 from "@angular/core";
|
|
12
|
-
import * as i1 from "@angular/router";
|
|
13
|
-
import * as i2 from "./speechrecorder/session/session.service";
|
|
14
|
-
import * as i3 from "./speechrecorder/project/project.service";
|
|
15
|
-
import * as i4 from "./speechrecorder/script/script.service";
|
|
16
|
-
import * as i5 from "./speechrecorder/recordings/recordings.service";
|
|
17
|
-
import * as i6 from "./speechrecorder/spruploader";
|
|
18
|
-
import * as i7 from "./speechrecorder/session/sessionmanager";
|
|
19
|
-
export var Mode;
|
|
20
|
-
(function (Mode) {
|
|
21
|
-
Mode[Mode["SINGLE_SESSION"] = 0] = "SINGLE_SESSION";
|
|
22
|
-
Mode[Mode["DEMO"] = 1] = "DEMO";
|
|
23
|
-
})(Mode || (Mode = {}));
|
|
24
|
-
export class SpeechrecorderngComponent extends RecorderComponent {
|
|
25
|
-
constructor(route, router, changeDetectorRef, sessionsService, projectService, scriptService, recFilesService, uploader) {
|
|
26
|
-
super(uploader);
|
|
27
|
-
this.route = route;
|
|
28
|
-
this.router = router;
|
|
29
|
-
this.changeDetectorRef = changeDetectorRef;
|
|
30
|
-
this.sessionsService = sessionsService;
|
|
31
|
-
this.projectService = projectService;
|
|
32
|
-
this.scriptService = scriptService;
|
|
33
|
-
this.recFilesService = recFilesService;
|
|
34
|
-
this.uploader = uploader;
|
|
35
|
-
this.controlAudioPlayer = null;
|
|
36
|
-
this._project = null;
|
|
37
|
-
}
|
|
38
|
-
handleError(err) {
|
|
39
|
-
let errMsg = 'Unknown error';
|
|
40
|
-
if (err instanceof Error) {
|
|
41
|
-
errMsg = err.message;
|
|
42
|
-
}
|
|
43
|
-
this.sm.statusMsg = errMsg;
|
|
44
|
-
this.sm.statusAlertType = 'error';
|
|
45
|
-
console.error(errMsg);
|
|
46
|
-
}
|
|
47
|
-
ngOnInit() {
|
|
48
|
-
this.controlAudioPlayer = new AudioPlayer(this);
|
|
49
|
-
this.sm.controlAudioPlayer = this.controlAudioPlayer;
|
|
50
|
-
this.sm.statusAlertType = 'info';
|
|
51
|
-
this.sm.statusMsg = 'Player initialized.';
|
|
52
|
-
}
|
|
53
|
-
ngAfterViewInit() {
|
|
54
|
-
// let wakeLockSupp=('wakeLock' in navigator);
|
|
55
|
-
// alert('Wake lock API supported: '+wakeLockSupp);
|
|
56
|
-
if (this.sm.status !== 10 /* SessionManagerStatus.ERROR */) {
|
|
57
|
-
let initSuccess = this.init();
|
|
58
|
-
if (initSuccess) {
|
|
59
|
-
this.route.queryParams.subscribe((params) => {
|
|
60
|
-
if (params['sessionId']) {
|
|
61
|
-
this.fetchSession(params['sessionId']);
|
|
62
|
-
}
|
|
63
|
-
});
|
|
64
|
-
this.route.params.subscribe((params) => {
|
|
65
|
-
let routeParamsId = params['id'];
|
|
66
|
-
if (routeParamsId) {
|
|
67
|
-
this.fetchSession(routeParamsId);
|
|
68
|
-
}
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
fetchSession(sessionId) {
|
|
74
|
-
let sessObs = this.sessionsService.sessionObserver(sessionId);
|
|
75
|
-
if (sessObs) {
|
|
76
|
-
sessObs.subscribe({
|
|
77
|
-
next: sess => {
|
|
78
|
-
this.setSession(sess);
|
|
79
|
-
this.sm.statusAlertType = 'info';
|
|
80
|
-
this.sm.statusMsg = 'Received session info.';
|
|
81
|
-
this.sm.statusWaiting = false;
|
|
82
|
-
if (sess.project) {
|
|
83
|
-
//console.debug("Session associated project: "+sess.project)
|
|
84
|
-
this.projectService.projectObservable(sess.project).subscribe({
|
|
85
|
-
next: (project) => {
|
|
86
|
-
this.project = project;
|
|
87
|
-
let persistentAudiStorage = (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType);
|
|
88
|
-
super.prepare(persistentAudiStorage).subscribe({
|
|
89
|
-
complete: () => {
|
|
90
|
-
this.sm.persistentAudioStorageTarget = this._persistentAudioStorageTarget;
|
|
91
|
-
this.fetchScript(sess);
|
|
92
|
-
},
|
|
93
|
-
error: (err) => {
|
|
94
|
-
this.handleError(err);
|
|
95
|
-
}
|
|
96
|
-
});
|
|
97
|
-
}, error: (reason) => {
|
|
98
|
-
this.sm.statusMsg = reason;
|
|
99
|
-
this.sm.statusAlertType = 'error';
|
|
100
|
-
this.sm.statusWaiting = false;
|
|
101
|
-
console.error("Error fetching project config: " + reason);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
console.info("Session has no associated project. Using default configuration.");
|
|
107
|
-
this.fetchScript(sess);
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
error: (reason) => {
|
|
111
|
-
this.sm.statusMsg = reason;
|
|
112
|
-
this.sm.statusAlertType = 'error';
|
|
113
|
-
this.sm.statusWaiting = false;
|
|
114
|
-
console.error("Error fetching session " + reason);
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
fetchScript(sess) {
|
|
120
|
-
if (sess.script) {
|
|
121
|
-
this.sm.statusAlertType = 'info';
|
|
122
|
-
this.sm.statusMsg = 'Fetching recording script...';
|
|
123
|
-
this.sm.statusWaiting = true;
|
|
124
|
-
this.scriptService.scriptObservable(sess.script).subscribe({
|
|
125
|
-
next: (script) => {
|
|
126
|
-
this.sm.statusAlertType = 'info';
|
|
127
|
-
this.sm.statusMsg = 'Received recording script.';
|
|
128
|
-
this.sm.statusWaiting = false;
|
|
129
|
-
this.setScript(script);
|
|
130
|
-
this.sm.session = sess;
|
|
131
|
-
this.fetchRecordings(sess, this.script);
|
|
132
|
-
}, error: (reason) => {
|
|
133
|
-
let errMsg = "Error fetching recording script: " + reason;
|
|
134
|
-
console.error(errMsg);
|
|
135
|
-
this.sm.statusMsg = errMsg;
|
|
136
|
-
this.sm.statusAlertType = 'error';
|
|
137
|
-
this.sm.statusWaiting = false;
|
|
138
|
-
}
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
else {
|
|
142
|
-
let errMsg = "No recording script is defined for this session with ID " + sess.sessionId;
|
|
143
|
-
console.error(this.sm.statusMsg);
|
|
144
|
-
this.sm.statusMsg = errMsg;
|
|
145
|
-
this.sm.statusAlertType = 'error';
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
fetchRecordings(sess, script) {
|
|
149
|
-
this.sm.statusAlertType = 'info';
|
|
150
|
-
this.sm.statusMsg = 'Fetching infos of recordings...';
|
|
151
|
-
this.sm.statusWaiting = true;
|
|
152
|
-
let prNm = null;
|
|
153
|
-
if (this.project) {
|
|
154
|
-
let rfsObs = this.recFilesService.recordingFileDescrList(this.project.name, sess.sessionId);
|
|
155
|
-
rfsObs.subscribe({
|
|
156
|
-
next: (rfs) => {
|
|
157
|
-
this.sm.statusAlertType = 'info';
|
|
158
|
-
this.sm.statusMsg = 'Received infos of recordings.';
|
|
159
|
-
this.sm.statusWaiting = false;
|
|
160
|
-
if (rfs) {
|
|
161
|
-
if (rfs instanceof Array) {
|
|
162
|
-
rfs.forEach((rf) => {
|
|
163
|
-
//console.debug("Already recorded: " + rf+ " "+rf.recording.itemcode);
|
|
164
|
-
this.sm.addRecordingFileByDescriptor(rf);
|
|
165
|
-
});
|
|
166
|
-
}
|
|
167
|
-
else {
|
|
168
|
-
console.error('Expected type array for list of already recorded files ');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
else {
|
|
172
|
-
//console.debug("Recording file list: " + rfs);
|
|
173
|
-
}
|
|
174
|
-
}, error: (err) => {
|
|
175
|
-
// we start the session anyway
|
|
176
|
-
this.startSession();
|
|
177
|
-
}, complete: () => {
|
|
178
|
-
this.startSession();
|
|
179
|
-
}
|
|
180
|
-
});
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
// TODO
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
get screenLocked() {
|
|
187
|
-
return this.sm.screenLocked;
|
|
188
|
-
}
|
|
189
|
-
startSession() {
|
|
190
|
-
this.sm.statusWaiting = false;
|
|
191
|
-
this.sm.start();
|
|
192
|
-
}
|
|
193
|
-
setSession(session) {
|
|
194
|
-
if (session) {
|
|
195
|
-
// console.debug("Session ID: " + session.sessionId);
|
|
196
|
-
}
|
|
197
|
-
else {
|
|
198
|
-
//console.debug("Session Undefined");
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
ready() {
|
|
202
|
-
return this.dataSaved && !this.sm.isActive();
|
|
203
|
-
}
|
|
204
|
-
init() {
|
|
205
|
-
//TODO Duplicate code in AudioRecorderComponent
|
|
206
|
-
this.uploader.listener = (ue) => {
|
|
207
|
-
this.uploadUpdate(ue);
|
|
208
|
-
};
|
|
209
|
-
window.addEventListener('beforeunload', (e) => {
|
|
210
|
-
//console.debug("Before page unload event");
|
|
211
|
-
if (this.ready()) {
|
|
212
|
-
return;
|
|
213
|
-
}
|
|
214
|
-
else {
|
|
215
|
-
// all this attempts to customize the message do not work anymore (for security reasons)!!
|
|
216
|
-
const message = "Please do not leave the page, until all recordings are uploaded!";
|
|
217
|
-
alert(message);
|
|
218
|
-
e = e || window.event;
|
|
219
|
-
if (e) {
|
|
220
|
-
e.returnValue = message;
|
|
221
|
-
e.cancelBubble = true;
|
|
222
|
-
if (e.stopPropagation) {
|
|
223
|
-
e.stopPropagation();
|
|
224
|
-
}
|
|
225
|
-
if (e.preventDefault) {
|
|
226
|
-
e.preventDefault();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
return message;
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
return true;
|
|
233
|
-
}
|
|
234
|
-
uploadUpdate(ue) {
|
|
235
|
-
let upStatus = ue.status;
|
|
236
|
-
this.dataSaved = (UploaderStatus.DONE === upStatus);
|
|
237
|
-
let percentUpl = ue.percentDone();
|
|
238
|
-
let sizeInQueue = ue.sizeInQueue();
|
|
239
|
-
//console.debug("Uploader: status: "+upStatus+", "+percentUpl+"%, Bytes in queue: "+sizeInQueue+' ('+DataSize.formatBytesToBinaryUnits(sizeInQueue)+')');
|
|
240
|
-
if (UploaderStatus.ERR === upStatus) {
|
|
241
|
-
this.sm.uploadStatus = 'warn';
|
|
242
|
-
}
|
|
243
|
-
else {
|
|
244
|
-
if (percentUpl < 50) {
|
|
245
|
-
this.sm.uploadStatus = 'accent';
|
|
246
|
-
}
|
|
247
|
-
else {
|
|
248
|
-
this.sm.uploadStatus = 'success';
|
|
249
|
-
}
|
|
250
|
-
this.sm.uploadProgress = percentUpl;
|
|
251
|
-
}
|
|
252
|
-
//console.debug("Upload update, update wake lock.")
|
|
253
|
-
this.sm.updateWakeLock(this.dataSaved);
|
|
254
|
-
this.changeDetectorRef.detectChanges();
|
|
255
|
-
}
|
|
256
|
-
configure() {
|
|
257
|
-
this.loadProjectCfg(() => {
|
|
258
|
-
// display project name
|
|
259
|
-
let prName = '[Unknown]';
|
|
260
|
-
if (this.project && this.project.name) {
|
|
261
|
-
prName = this.project.name;
|
|
262
|
-
}
|
|
263
|
-
//this.titleEl.innerText = prName;
|
|
264
|
-
});
|
|
265
|
-
}
|
|
266
|
-
randomize(script) {
|
|
267
|
-
script.sections.forEach((s) => {
|
|
268
|
-
if ('RANDOM' === s.order) {
|
|
269
|
-
s._shuffledGroups = Arrays.shuffleArray(s.groups);
|
|
270
|
-
}
|
|
271
|
-
else {
|
|
272
|
-
s._shuffledGroups = s.groups;
|
|
273
|
-
}
|
|
274
|
-
s._shuffledGroups.forEach((g) => {
|
|
275
|
-
if ('RANDOM' === g.order) {
|
|
276
|
-
g._shuffledPromptItems = Arrays.shuffleArray(g.promptItems);
|
|
277
|
-
}
|
|
278
|
-
else {
|
|
279
|
-
g._shuffledPromptItems = g.promptItems;
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
setScript(script) {
|
|
285
|
-
this.script = script;
|
|
286
|
-
this.randomize(this.script);
|
|
287
|
-
this.sm.script = this.script;
|
|
288
|
-
}
|
|
289
|
-
set project(project) {
|
|
290
|
-
this._project = project;
|
|
291
|
-
let chCnt = ProjectUtil.DEFAULT_AUDIO_CHANNEL_COUNT;
|
|
292
|
-
if (project) {
|
|
293
|
-
console.info("Project name: " + project.name);
|
|
294
|
-
if (project.recordingDeviceWakeLock === true) {
|
|
295
|
-
this.sm.wakeLock = true;
|
|
296
|
-
}
|
|
297
|
-
console.info("Audio storage type: " + project.clientAudioStorageType);
|
|
298
|
-
if (AudioStorageType.DB_CHUNKED === project.clientAudioStorageType) {
|
|
299
|
-
SprDb.prepare().subscribe();
|
|
300
|
-
}
|
|
301
|
-
if (project.clientAudioStorageType) {
|
|
302
|
-
this.sm.clientAudioStorageType = project.clientAudioStorageType;
|
|
303
|
-
}
|
|
304
|
-
this.sm.clientMediaStorageFormat = project.mediaStorageFormat;
|
|
305
|
-
this.sm.audioDevices = project.audioDevices;
|
|
306
|
-
chCnt = ProjectUtil.audioChannelCount(project);
|
|
307
|
-
console.info("Project requested recording channel count: " + chCnt);
|
|
308
|
-
this.sm.autoGainControlConfigs = project.autoGainControlConfigs;
|
|
309
|
-
if (project.allowEchoCancellation !== undefined) {
|
|
310
|
-
this.sm.allowEchoCancellation = project.allowEchoCancellation;
|
|
311
|
-
}
|
|
312
|
-
if (project.chunkedRecording === true) {
|
|
313
|
-
console.debug("Enable chunked upload: chunkSize: " + BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS);
|
|
314
|
-
this.sm.uploadChunkSizeSeconds = BasicRecorder.DEFAULT_CHUNK_SIZE_SECONDS;
|
|
315
|
-
}
|
|
316
|
-
else {
|
|
317
|
-
this.sm.uploadChunkSizeSeconds = null;
|
|
318
|
-
}
|
|
319
|
-
if (project.showSessionCompleteMessage != null) {
|
|
320
|
-
this.sm.showSessionCompleteMessage = project.showSessionCompleteMessage;
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
else {
|
|
324
|
-
console.error("Empty project configuration!");
|
|
325
|
-
}
|
|
326
|
-
this.sm.channelCount = chCnt;
|
|
327
|
-
}
|
|
328
|
-
get project() {
|
|
329
|
-
return this._project;
|
|
330
|
-
}
|
|
331
|
-
loadProjectCfg(callback) {
|
|
332
|
-
let projUrl = null;
|
|
333
|
-
if (this.sessionId === null) {
|
|
334
|
-
if (window.location.hostname === 'localhost' || this.mode === Mode.DEMO) {
|
|
335
|
-
// debug or demo mode
|
|
336
|
-
projUrl = 'test/Demo1.json?' + new Date().getTime();
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
// load RESTful by sessionId
|
|
341
|
-
projUrl = window.location.protocol + '//' + window.location.hostname + ':' + window.location.port + '/wikispeech/rest/projects/?sessionId=' + this.sessionId;
|
|
342
|
-
}
|
|
343
|
-
if (projUrl) {
|
|
344
|
-
const pLoader = new XMLHttpRequest();
|
|
345
|
-
pLoader.open("GET", projUrl, true);
|
|
346
|
-
pLoader.setRequestHeader('Accept', 'application/json');
|
|
347
|
-
pLoader.responseType = "json";
|
|
348
|
-
pLoader.onload = (e) => {
|
|
349
|
-
this.project = pLoader.response.project;
|
|
350
|
-
callback();
|
|
351
|
-
};
|
|
352
|
-
pLoader.onerror = (e) => {
|
|
353
|
-
console.error("Error downloading project data ...");
|
|
354
|
-
};
|
|
355
|
-
pLoader.send();
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
start() {
|
|
359
|
-
}
|
|
360
|
-
audioPlayerUpdate(e) {
|
|
361
|
-
if (PlaybackEventType.STARTED === e.type) {
|
|
362
|
-
this.sm.statusAlertType = 'info';
|
|
363
|
-
this.sm.statusMsg = 'Playback...';
|
|
364
|
-
}
|
|
365
|
-
else if (PlaybackEventType.ENDED === e.type) {
|
|
366
|
-
this.sm.statusAlertType = 'info';
|
|
367
|
-
this.sm.statusMsg = 'Ready.';
|
|
368
|
-
}
|
|
369
|
-
else if (PlaybackEventType.ERROR === e.type) {
|
|
370
|
-
this.sm.statusAlertType = 'error';
|
|
371
|
-
this.sm.statusMsg = 'Playback error.';
|
|
372
|
-
}
|
|
373
|
-
}
|
|
374
|
-
error() {
|
|
375
|
-
this.sm.statusAlertType = 'error';
|
|
376
|
-
this.sm.statusMsg = 'ERROR: Recording.';
|
|
377
|
-
}
|
|
378
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SpeechrecorderngComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i0.ChangeDetectorRef }, { token: i2.SessionService }, { token: i3.ProjectService }, { token: i4.ScriptService }, { token: i5.RecordingService }, { token: i6.SpeechRecorderUploader }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
379
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: SpeechrecorderngComponent, selector: "app-speechrecorder", providers: [SessionService], viewQueries: [{ propertyName: "sm", first: true, predicate: SessionManager, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
380
|
-
<app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
|
|
381
|
-
`, isInline: true, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"], dependencies: [{ kind: "component", type: i7.SessionManager, selector: "app-sprrecordingsession", inputs: ["projectName", "dataSaved"] }] }); }
|
|
382
|
-
}
|
|
383
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: SpeechrecorderngComponent, decorators: [{
|
|
384
|
-
type: Component,
|
|
385
|
-
args: [{ selector: 'app-speechrecorder', providers: [SessionService], template: `
|
|
386
|
-
<app-sprrecordingsession [projectName]="project?.name" [dataSaved]="dataSaved"></app-sprrecordingsession>
|
|
387
|
-
`, styles: [":host{flex:2;display:flex;flex-direction:column;min-height:0}\n"] }]
|
|
388
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i0.ChangeDetectorRef }, { type: i2.SessionService }, { type: i3.ProjectService }, { type: i4.ScriptService }, { type: i5.RecordingService }, { type: i6.SpeechRecorderUploader }], propDecorators: { sm: [{
|
|
389
|
-
type: ViewChild,
|
|
390
|
-
args: [SessionManager, { static: true }]
|
|
391
|
-
}] } });
|
|
392
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXJuZy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQTJDLE1BQU0sZUFBZSxDQUFBO0FBQzVGLE9BQU8sRUFDa0MsU0FBUyxJQUFJLGlCQUFpQixFQUNyRSxXQUFXLEVBQ1osTUFBTSx5QkFBeUIsQ0FBQztBQUVqQyxPQUFPLEVBQUUsY0FBYyxFQUFnQyxNQUFNLHlDQUF5QyxDQUFDO0FBQ3ZHLE9BQU8sRUFBNkIsY0FBYyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLDBDQUEwQyxDQUFDO0FBSXhFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBVyxXQUFXLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUt4RixPQUFPLEVBQUMsTUFBTSxFQUFXLE1BQU0sZUFBZSxDQUFDO0FBQy9DLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx3Q0FBd0MsQ0FBQztBQUNyRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sWUFBWSxDQUFDOzs7Ozs7Ozs7QUFFakMsTUFBTSxDQUFOLElBQVksSUFBMEI7QUFBdEMsV0FBWSxJQUFJO0lBQUUsbURBQWMsQ0FBQTtJQUFDLCtCQUFJLENBQUE7QUFBQSxDQUFDLEVBQTFCLElBQUksS0FBSixJQUFJLFFBQXNCO0FBa0J0QyxNQUFNLE9BQU8seUJBQTBCLFNBQVEsaUJBQWlCO0lBWTlELFlBQW9CLEtBQXFCLEVBQ2YsTUFBYyxFQUNsQixpQkFBb0MsRUFDcEMsZUFBOEIsRUFDOUIsY0FBNkIsRUFDN0IsYUFBMkIsRUFDM0IsZUFBZ0Ms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LElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxHQUFDLE1BQU0sQ0FBQztZQUMvQixJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBQyxhQUFhLENBQUM7UUFDbEMsQ0FBQzthQUFNLElBQUksaUJBQWlCLENBQUMsS0FBSyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsRUFBRSxDQUFDLGVBQWUsR0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxDQUFDLEVBQUUsQ0FBQyxTQUFTLEdBQUMsUUFBUSxDQUFDO1FBQzdCLENBQUM7YUFBSyxJQUFHLGlCQUFpQixDQUFDLEtBQUssS0FBSSxDQUFDLENBQUMsSUFBSSxFQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEdBQUMsT0FBTyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxFQUFFLENBQUMsU0FBUyxHQUFDLGlCQUFpQixDQUFDO1FBQ3RDLENBQUM7SUFDSCxDQUFDO0lBQ0QsS0FBSztRQUNELElBQUksQ0FBQyxFQUFFLENBQUMsZUFBZSxHQUFDLE9BQU8sQ0FBQztRQUNuQyxJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsR0FBQyxtQkFBbUIsQ0FBQztJQUN2QyxDQUFDOytHQXhZVSx5QkFBeUI7bUdBQXpCLHlCQUF5Qiw2Q0FiekIsQ0FBQyxjQUFjLENBQUMsOERBdUJoQixjQUFjLHFGQXRCZjs7R0FFVDs7NEZBVVUseUJBQXlCO2tCQWhCckMsU0FBUzsrQkFFRSxvQkFBb0IsYUFDbkIsQ0FBQyxjQUFjLENBQUMsWUFDakI7O0dBRVQ7a1NBb0I0QyxFQUFFO3NCQUE5QyxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NvbXBvbmVudCwgVmlld0NoaWxkLCBDaGFuZ2VEZXRlY3RvclJlZiwgQWZ0ZXJWaWV3SW5pdCwgT25Jbml0fSBmcm9tICdAYW5ndWxhci9jb3JlJ1xyXG5pbXBvcnQge1xyXG4gIEF1ZGlvUGxheWVyTGlzdGVuZXIsIEF1ZGlvUGxheWVyRXZlbnQsIEV2ZW50VHlwZSBhcyBQbGF5YmFja0V2ZW50VHlwZSxcclxuICBBdWRpb1BsYXllclxyXG59IGZyb20gJy4vYXVkaW8vcGxheWJhY2svcGxheWVyJztcclxuaW1wb3J0IHtHcm91cCwgUHJvbXB0SXRlbSwgU2NyaXB0fSBmcm9tICcuL3NwZWVjaHJlY29yZGVyL3NjcmlwdC9zY3JpcHQnXHJcbmltcG9ydCB7IFNlc3Npb25NYW5hZ2VyLFN0YXR1cyBhcyBTZXNzaW9uTWFuYWdlclN0YXR1c30gZnJvbSAnLi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3Nlc3Npb25tYW5hZ2VyJztcclxuaW1wb3J0IHsgVXBsb2FkZXJTdGF0dXNDaGFuZ2VFdmVudCwgVXBsb2FkZXJTdGF0dXMgfSBmcm9tICcuL25ldC91cGxvYWRlcic7XHJcbmltcG9ydCB7QWN0aXZhdGVkUm91dGUsIFBhcmFtcywgUm91dGVyfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XHJcbmltcG9ydCB7U2Vzc2lvblNlcnZpY2V9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Nlc3Npb24vc2Vzc2lvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U2NyaXB0U2VydmljZX0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc2NyaXB0L3NjcmlwdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7U3BlZWNoUmVjb3JkZXJVcGxvYWRlcn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc3BydXBsb2FkZXJcIjtcclxuaW1wb3J0IHtTZXNzaW9ufSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9zZXNzaW9uL3Nlc3Npb25cIjtcclxuaW1wb3J0IHtBdWRpb1N0b3JhZ2VUeXBlLCBQcm9qZWN0LCBQcm9qZWN0VXRpbH0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvcHJvamVjdC9wcm9qZWN0XCI7XHJcbmltcG9ydCB7UHJvamVjdFNlcnZpY2V9IGZyb20gXCIuL3NwZWVjaHJlY29yZGVyL3Byb2plY3QvcHJvamVjdC5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7QXVkaW9Db250ZXh0UHJvdmlkZXJ9IGZyb20gXCIuL2F1ZGlvL2NvbnRleHRcIjtcclxuaW1wb3J0IHtSZWNvcmRpbmdTZXJ2aWNlfSBmcm9tIFwiLi9zcGVlY2hyZWNvcmRlci9yZWNvcmRpbmdzL3JlY29yZGluZ3Muc2VydmljZVwiO1xyXG5pbXBvcnQge1JlY29yZGluZ0ZpbGVEZXNjcmlwdG9ySW1wbH0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvcmVjb3JkaW5nXCI7XHJcbmltcG9ydCB7QXJyYXlzLCBEYXRhU2l6ZX0gZnJvbSBcIi4vdXRpbHMvdXRpbHNcIjtcclxuaW1wb3J0IHtSZWNvcmRlckNvbXBvbmVudH0gZnJvbSBcIi4vcmVjb3JkZXJfY29tcG9uZW50XCI7XHJcbmltcG9ydCB7QmFzaWNSZWNvcmRlcn0gZnJvbSBcIi4vc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9iYXNpY3JlY29yZGVyXCI7XHJcbmltcG9ydCB7U3ByRGJ9IGZyb20gXCIuL2RiL2luZGRiXCI7XHJcblxyXG5leHBvcnQgZW51bSBNb2RlIHtTSU5HTEVfU0VTU0lPTixERU1PfVxyXG5cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLXNwZWVjaHJlY29yZGVyJyxcclxuICBwcm92aWRlcnM6IFtTZXNzaW9uU2VydmljZV0sXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxhcHAtc3BycmVjb3JkaW5nc2Vzc2lvbiBbcHJvamVjdE5hbWVdPVwicHJvamVjdD8ubmFtZVwiIFtkYXRhU2F2ZWRdPVwiZGF0YVNhdmVkXCI+PC9hcHAtc3BycmVjb3JkaW5nc2Vzc2lvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW2A6aG9zdHtcclxuICAgIGZsZXg6IDI7XHJcbiAgICBkaXNwbGF5OiBmbGV4O1xyXG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcclxuICAgIG1pbi1oZWlnaHQ6MDtcclxuXHJcbiAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgU3BlZWNocmVjb3JkZXJuZ0NvbXBvbmVudCBleHRlbmRzIFJlY29yZGVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXQsQXVkaW9QbGF5ZXJMaXN0ZW5lciB7XHJcblxyXG4gIG1vZGUhOk1vZGU7XHJcbiAgY29udHJvbEF1ZGlvUGxheWVyOkF1ZGlvUGxheWVyfG51bGw9bnVsbDtcclxuICBhdWRpbzphbnk7XHJcbiAgX3Byb2plY3Q6UHJvamVjdHxudWxsPW51bGw7XHJcbiAgc2Vzc2lvbklkITogc3RyaW5nO1xyXG4gIHNlc3Npb24hOlNlc3Npb247XHJcbiAgc2NyaXB0ITpTY3JpcHQ7XHJcblxyXG4gIEBWaWV3Q2hpbGQoU2Vzc2lvbk1hbmFnZXIsIHsgc3RhdGljOiB0cnVlIH0pIHNtITpTZXNzaW9uTWFuYWdlcjtcclxuXHJcblx0XHRjb25zdHJ1Y3Rvcihwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcclxuICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxyXG4gICAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHNlc3Npb25zU2VydmljZTpTZXNzaW9uU2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcHJvamVjdFNlcnZpY2U6UHJvamVjdFNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcml2YXRlIHNjcmlwdFNlcnZpY2U6U2NyaXB0U2VydmljZSxcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgcmVjRmlsZXNTZXJ2aWNlOlJlY29yZGluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdXBsb2FkZXI6U3BlZWNoUmVjb3JkZXJVcGxvYWRlcikge1xyXG4gICAgICBzdXBlcih1cGxvYWRlcik7XHJcblx0XHR9XHJcblxyXG4gICAgaGFuZGxlRXJyb3IoZXJyOmFueSl7XHJcbiAgICAgIGxldCBlcnJNc2c9J1Vua25vd24gZXJyb3InO1xyXG4gICAgICBpZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgZXJyTXNnPWVyci5tZXNzYWdlO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzTXNnPWVyck1zZztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGU9J2Vycm9yJztcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJNc2cpXHJcbiAgICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgICAgICAgdGhpcy5jb250cm9sQXVkaW9QbGF5ZXIgPSBuZXcgQXVkaW9QbGF5ZXIoIHRoaXMpO1xyXG4gICAgICB0aGlzLnNtLmNvbnRyb2xBdWRpb1BsYXllcj10aGlzLmNvbnRyb2xBdWRpb1BsYXllcjtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGU9J2luZm8nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZyA9ICdQbGF5ZXIgaW5pdGlhbGl6ZWQuJztcclxuXHJcbiAgfVxyXG4gICAgICAgbmdBZnRlclZpZXdJbml0KCl7XHJcbiAgICAgICAgLy8gbGV0IHdha2VMb2NrU3VwcD0oJ3dha2VMb2NrJyBpbiBuYXZpZ2F0b3IpO1xyXG4gICAgICAgIC8vIGFsZXJ0KCdXYWtlIGxvY2sgQVBJIHN1cHBvcnRlZDogJyt3YWtlTG9ja1N1cHApO1xyXG4gICAgICAgICAgIGlmICh0aGlzLnNtLnN0YXR1cyAhPT0gU2Vzc2lvbk1hbmFnZXJTdGF0dXMuRVJST1IpIHtcclxuICAgICAgICAgICAgIGxldCBpbml0U3VjY2VzcyA9IHRoaXMuaW5pdCgpO1xyXG4gICAgICAgICAgICAgaWYgKGluaXRTdWNjZXNzKSB7XHJcbiAgICAgICAgICAgICAgIHRoaXMucm91dGUucXVlcnlQYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgIGlmIChwYXJhbXNbJ3Nlc3Npb25JZCddKSB7XHJcbiAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihwYXJhbXNbJ3Nlc3Npb25JZCddKTtcclxuICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICAgICAgICAgICAgICAgdGhpcy5yb3V0ZS5wYXJhbXMuc3Vic2NyaWJlKChwYXJhbXM6IFBhcmFtcykgPT4ge1xyXG4gICAgICAgICAgICAgICAgIGxldCByb3V0ZVBhcmFtc0lkID0gcGFyYW1zWydpZCddO1xyXG4gICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhcmFtc0lkKSB7XHJcbiAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoU2Vzc2lvbihyb3V0ZVBhcmFtc0lkKTtcclxuICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcblxyXG4gICAgZmV0Y2hTZXNzaW9uKHNlc3Npb25JZDpzdHJpbmcpe1xyXG5cclxuICAgICAgbGV0IHNlc3NPYnM9IHRoaXMuc2Vzc2lvbnNTZXJ2aWNlLnNlc3Npb25PYnNlcnZlcihzZXNzaW9uSWQpO1xyXG5cclxuICAgICAgaWYoc2Vzc09icykge1xyXG4gICAgICAgIHNlc3NPYnMuc3Vic2NyaWJlKHtcclxuICAgICAgICAgIG5leHQ6IHNlc3MgPT4ge1xyXG4gICAgICAgICAgICB0aGlzLnNldFNlc3Npb24oc2Vzcyk7XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgICAgICAgICB0aGlzLnNtLnN0YXR1c01zZyA9ICdSZWNlaXZlZCBzZXNzaW9uIGluZm8uJztcclxuICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGlmIChzZXNzLnByb2plY3QpIHtcclxuICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTZXNzaW9uIGFzc29jaWF0ZWQgcHJvamVjdDogXCIrc2Vzcy5wcm9qZWN0KVxyXG4gICAgICAgICAgICAgIHRoaXMucHJvamVjdFNlcnZpY2UucHJvamVjdE9ic2VydmFibGUoc2Vzcy5wcm9qZWN0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgICAgICAgICAgICBuZXh0OiAocHJvamVjdCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGxldCBwZXJzaXN0ZW50QXVkaVN0b3JhZ2U9KEF1ZGlvU3RvcmFnZVR5cGUuREJfQ0hVTktFRD09PXByb2plY3QuY2xpZW50QXVkaW9TdG9yYWdlVHlwZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdXBlci5wcmVwYXJlKHBlcnNpc3RlbnRBdWRpU3RvcmFnZSkuc3Vic2NyaWJlKHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNtLnBlcnNpc3RlbnRBdWRpb1N0b3JhZ2VUYXJnZXQgPSB0aGlzLl9wZXJzaXN0ZW50QXVkaW9TdG9yYWdlVGFyZ2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hTY3JpcHQoc2Vzcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcihlcnIpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgICAgICAgICAgIH0sIGVycm9yOiAocmVhc29uKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSByZWFzb247XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBwcm9qZWN0IGNvbmZpZzogXCIgKyByZWFzb24pXHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJTZXNzaW9uIGhhcyBubyBhc3NvY2lhdGVkIHByb2plY3QuIFVzaW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbi5cIilcclxuICAgICAgICAgICAgICB0aGlzLmZldGNoU2NyaXB0KHNlc3MpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgZXJyb3I6KHJlYXNvbikgPT5cclxuICAgICAgICAgIHtcclxuICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSByZWFzb247XHJcbiAgICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuICAgICAgICAgICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBmZXRjaGluZyBzZXNzaW9uIFwiICsgcmVhc29uKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIGZldGNoU2NyaXB0KHNlc3M6IFNlc3Npb24pIHtcclxuICAgIGlmIChzZXNzLnNjcmlwdCkge1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnRmV0Y2hpbmcgcmVjb3JkaW5nIHNjcmlwdC4uLic7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2NyaXB0U2VydmljZS5zY3JpcHRPYnNlcnZhYmxlKHNlc3Muc2NyaXB0KS5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6IChzY3JpcHQpID0+IHtcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnUmVjZWl2ZWQgcmVjb3JkaW5nIHNjcmlwdC4nO1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLnNldFNjcmlwdChzY3JpcHQpXHJcbiAgICAgICAgICB0aGlzLnNtLnNlc3Npb24gPSBzZXNzO1xyXG4gICAgICAgICAgdGhpcy5mZXRjaFJlY29yZGluZ3Moc2VzcywgdGhpcy5zY3JpcHQpXHJcbiAgICAgICAgfSwgZXJyb3I6IChyZWFzb24pID0+IHtcclxuICAgICAgICAgIGxldCBlcnJNc2cgPSBcIkVycm9yIGZldGNoaW5nIHJlY29yZGluZyBzY3JpcHQ6IFwiICsgcmVhc29uXHJcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGVyck1zZylcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gZXJyTXNnO1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGUgPSAnZXJyb3InO1xyXG4gICAgICAgICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGxldCBlcnJNc2cgPSBcIk5vIHJlY29yZGluZyBzY3JpcHQgaXMgZGVmaW5lZCBmb3IgdGhpcyBzZXNzaW9uIHdpdGggSUQgXCIgKyBzZXNzLnNlc3Npb25JZDtcclxuICAgICAgY29uc29sZS5lcnJvcih0aGlzLnNtLnN0YXR1c01zZylcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2cgPSBlcnJNc2c7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2Vycm9yJztcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmZXRjaFJlY29yZGluZ3Moc2VzczogU2Vzc2lvbiwgc2NyaXB0OiBTY3JpcHQpIHtcclxuICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlID0gJ2luZm8nO1xyXG4gICAgdGhpcy5zbS5zdGF0dXNNc2cgPSAnRmV0Y2hpbmcgaW5mb3Mgb2YgcmVjb3JkaW5ncy4uLic7XHJcbiAgICB0aGlzLnNtLnN0YXR1c1dhaXRpbmcgPSB0cnVlO1xyXG4gICAgbGV0IHByTm06IHN0cmluZyB8IG51bGwgPSBudWxsO1xyXG4gICAgaWYgKHRoaXMucHJvamVjdCkge1xyXG4gICAgICBsZXQgcmZzT2JzID0gdGhpcy5yZWNGaWxlc1NlcnZpY2UucmVjb3JkaW5nRmlsZURlc2NyTGlzdCh0aGlzLnByb2plY3QubmFtZSwgc2Vzcy5zZXNzaW9uSWQpO1xyXG4gICAgICByZnNPYnMuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmZzOiBBcnJheTxSZWNvcmRpbmdGaWxlRGVzY3JpcHRvckltcGw+KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZSA9ICdpbmZvJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzTXNnID0gJ1JlY2VpdmVkIGluZm9zIG9mIHJlY29yZGluZ3MuJztcclxuICAgICAgICAgIHRoaXMuc20uc3RhdHVzV2FpdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgaWYgKHJmcykge1xyXG4gICAgICAgICAgICBpZiAocmZzIGluc3RhbmNlb2YgQXJyYXkpIHtcclxuICAgICAgICAgICAgICByZnMuZm9yRWFjaCgocmYpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJBbHJlYWR5IHJlY29yZGVkOiBcIiArIHJmKyBcIiBcIityZi5yZWNvcmRpbmcuaXRlbWNvZGUpO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5zbS5hZGRSZWNvcmRpbmdGaWxlQnlEZXNjcmlwdG9yKHJmKTtcclxuICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0V4cGVjdGVkIHR5cGUgYXJyYXkgZm9yIGxpc3Qgb2YgYWxyZWFkeSByZWNvcmRlZCBmaWxlcyAnKVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJSZWNvcmRpbmcgZmlsZSBsaXN0OiBcIiArIHJmcyk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfSwgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICAgIC8vIHdlIHN0YXJ0IHRoZSBzZXNzaW9uIGFueXdheVxyXG4gICAgICAgICAgdGhpcy5zdGFydFNlc3Npb24oKVxyXG4gICAgICAgIH0sIGNvbXBsZXRlOiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0U2Vzc2lvbigpXHJcbiAgICAgICAgfVxyXG4gICAgICB9KVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gVE9ET1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHNjcmVlbkxvY2tlZCgpOmJvb2xlYW57XHJcbiAgICAgIHJldHVybiAgdGhpcy5zbS5zY3JlZW5Mb2NrZWQ7XHJcbiAgfVxyXG5cclxuICAgIHByaXZhdGUgc3RhcnRTZXNzaW9uKCl7XHJcbiAgICAgICAgdGhpcy5zbS5zdGF0dXNXYWl0aW5nPWZhbHNlO1xyXG5cdFx0ICB0aGlzLnNtLnN0YXJ0KCk7XHJcbiAgICB9XHJcblxyXG5cclxuICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb246YW55KXtcclxuXHRcdCAgICBpZihzZXNzaW9uKSB7XHJcbiAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcoXCJTZXNzaW9uIElEOiBcIiArIHNlc3Npb24uc2Vzc2lvbklkKTtcclxuICAgICAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUuZGVidWcoXCJTZXNzaW9uIFVuZGVmaW5lZFwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVhZHkoKTpib29sZWFue1xyXG5cdFx0ICAgIHJldHVybiB0aGlzLmRhdGFTYXZlZCAmJiAhdGhpcy5zbS5pc0FjdGl2ZSgpXHJcbiAgICAgICAgfVxyXG5cclxuXHRcdGluaXQoKTpib29sZWFuIHtcclxuICAgICAgLy9UT0RPIER1cGxpY2F0ZSBjb2RlIGluIEF1ZGlvUmVjb3JkZXJDb21wb25lbnRcclxuICAgICAgICB0aGlzLnVwbG9hZGVyLmxpc3RlbmVyID0gKHVlKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLnVwbG9hZFVwZGF0ZSh1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoZSkgPT4ge1xyXG4gICAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiQmVmb3JlIHBhZ2UgdW5sb2FkIGV2ZW50XCIpO1xyXG5cclxuICAgICAgICAgIGlmICh0aGlzLnJlYWR5KCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gYWxsIHRoaXMgYXR0ZW1wdHMgdG8gY3VzdG9taXplIHRoZSBtZXNzYWdlIGRvIG5vdCB3b3JrIGFueW1vcmUgKGZvciBzZWN1cml0eSByZWFzb25zKSEhXHJcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBcIlBsZWFzZSBkbyBub3QgbGVhdmUgdGhlIHBhZ2UsIHVudGlsIGFsbCByZWNvcmRpbmdzIGFyZSB1cGxvYWRlZCFcIjtcclxuICAgICAgICAgICAgYWxlcnQobWVzc2FnZSk7XHJcbiAgICAgICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcclxuXHJcbiAgICAgICAgICAgIGlmIChlKSB7XHJcbiAgICAgICAgICAgICAgZS5yZXR1cm5WYWx1ZSA9IG1lc3NhZ2U7XHJcbiAgICAgICAgICAgICAgZS5jYW5jZWxCdWJibGUgPSB0cnVlO1xyXG4gICAgICAgICAgICAgIGlmIChlLnN0b3BQcm9wYWdhdGlvbikge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgaWYgKGUucHJldmVudERlZmF1bHQpIHtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiBtZXNzYWdlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcclxuICAgIH1cclxuXHJcbiAgdXBsb2FkVXBkYXRlKHVlOiBVcGxvYWRlclN0YXR1c0NoYW5nZUV2ZW50KSB7XHJcbiAgICBsZXQgdXBTdGF0dXMgPSB1ZS5zdGF0dXM7XHJcbiAgICB0aGlzLmRhdGFTYXZlZCA9IChVcGxvYWRlclN0YXR1cy5ET05FID09PSB1cFN0YXR1cyk7XHJcbiAgICBsZXQgcGVyY2VudFVwbCA9IHVlLnBlcmNlbnREb25lKCk7XHJcbiAgICBsZXQgc2l6ZUluUXVldWU9dWUuc2l6ZUluUXVldWUoKTtcclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZGVyOiBzdGF0dXM6IFwiK3VwU3RhdHVzK1wiLCBcIitwZXJjZW50VXBsK1wiJSwgQnl0ZXMgaW4gcXVldWU6IFwiK3NpemVJblF1ZXVlKycgKCcrRGF0YVNpemUuZm9ybWF0Qnl0ZXNUb0JpbmFyeVVuaXRzKHNpemVJblF1ZXVlKSsnKScpO1xyXG4gICAgaWYgKFVwbG9hZGVyU3RhdHVzLkVSUiA9PT0gdXBTdGF0dXMpIHtcclxuICAgICAgdGhpcy5zbS51cGxvYWRTdGF0dXMgPSAnd2FybidcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGlmIChwZXJjZW50VXBsIDwgNTApIHtcclxuICAgICAgICB0aGlzLnNtLnVwbG9hZFN0YXR1cyA9ICdhY2NlbnQnXHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRTdGF0dXMgPSAnc3VjY2VzcydcclxuICAgICAgfVxyXG4gICAgICB0aGlzLnNtLnVwbG9hZFByb2dyZXNzID0gcGVyY2VudFVwbDtcclxuICAgIH1cclxuICAgIC8vY29uc29sZS5kZWJ1ZyhcIlVwbG9hZCB1cGRhdGUsIHVwZGF0ZSB3YWtlIGxvY2suXCIpXHJcbiAgICB0aGlzLnNtLnVwZGF0ZVdha2VMb2NrKHRoaXMuZGF0YVNhdmVkKTtcclxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpXHJcbiAgfVxyXG5cclxuICBjb25maWd1cmUoKSB7XHJcblxyXG4gICAgICB0aGlzLmxvYWRQcm9qZWN0Q2ZnKCgpID0+IHtcclxuICAgICAgICAvLyBkaXNwbGF5IHByb2plY3QgbmFtZVxyXG4gICAgICAgIGxldCBwck5hbWU6IHN0cmluZyA9ICdbVW5rbm93bl0nO1xyXG4gICAgICAgIGlmICh0aGlzLnByb2plY3QgJiYgdGhpcy5wcm9qZWN0Lm5hbWUpIHtcclxuICAgICAgICAgIHByTmFtZSA9IHRoaXMucHJvamVjdC5uYW1lO1xyXG4gICAgICAgIH1cclxuICAgICAgICAvL3RoaXMudGl0bGVFbC5pbm5lclRleHQgPSBwck5hbWU7XHJcblxyXG4gICAgICB9KTtcclxuXHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSByYW5kb21pemUoc2NyaXB0OlNjcmlwdCl7XHJcblx0XHQgICAgc2NyaXB0LnNlY3Rpb25zLmZvckVhY2goKHMpPT57XHJcblx0XHQgICAgICAgIGlmKCdSQU5ET00nPT09cy5vcmRlcikge1xyXG4gICAgICAgICAgICAgICAgICAgIHMuX3NodWZmbGVkR3JvdXBzID0gQXJyYXlzLnNodWZmbGVBcnJheTxHcm91cD4ocy5ncm91cHMpO1xyXG4gICAgICAgICAgICAgICAgfWVsc2V7XHJcblx0XHQgICAgICAgICAgICBzLl9zaHVmZmxlZEdyb3Vwcz1zLmdyb3VwcztcclxuICAgICAgICAgICAgICAgIH1cclxuXHRcdCAgICAgICAgcy5fc2h1ZmZsZWRHcm91cHMuZm9yRWFjaCgoZyk9PntcclxuXHRcdCAgICAgICAgICAgIGlmKCdSQU5ET00nPT09Zy5vcmRlcil7XHJcblx0XHQgICAgICAgICAgICAgICBnLl9zaHVmZmxlZFByb21wdEl0ZW1zPUFycmF5cy5zaHVmZmxlQXJyYXk8UHJvbXB0SXRlbT4oZy5wcm9tcHRJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgfWVsc2V7XHJcblx0XHQgICAgICAgICAgICAgICAgZy5fc2h1ZmZsZWRQcm9tcHRJdGVtcz1nLnByb21wdEl0ZW1zO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICBzZXRTY3JpcHQoc2NyaXB0OlNjcmlwdCl7XHJcbiAgICAgICAgdGhpcy5zY3JpcHQ9c2NyaXB0O1xyXG4gICAgICAgIHRoaXMucmFuZG9taXplKHRoaXMuc2NyaXB0KTtcclxuICAgICAgICB0aGlzLnNtLnNjcmlwdCA9IHRoaXMuc2NyaXB0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgc2V0IHByb2plY3QocHJvamVjdDogUHJvamVjdHxudWxsKSB7XHJcbiAgICB0aGlzLl9wcm9qZWN0ID0gcHJvamVjdDtcclxuICAgIGxldCBjaENudCA9IFByb2plY3RVdGlsLkRFRkFVTFRfQVVESU9fQ0hBTk5FTF9DT1VOVDtcclxuXHJcbiAgICBpZiAocHJvamVjdCkge1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IG5hbWU6IFwiICsgcHJvamVjdC5uYW1lKVxyXG4gICAgICBpZihwcm9qZWN0LnJlY29yZGluZ0RldmljZVdha2VMb2NrPT09dHJ1ZSl7XHJcbiAgICAgICAgdGhpcy5zbS53YWtlTG9jaz10cnVlO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnNvbGUuaW5mbyhcIkF1ZGlvIHN0b3JhZ2UgdHlwZTogXCIrcHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKTtcclxuICAgICAgaWYoQXVkaW9TdG9yYWdlVHlwZS5EQl9DSFVOS0VEPT09cHJvamVjdC5jbGllbnRBdWRpb1N0b3JhZ2VUeXBlKXtcclxuICAgICAgICBTcHJEYi5wcmVwYXJlKCkuc3Vic2NyaWJlKClcclxuICAgICAgfVxyXG4gICAgICBpZihwcm9qZWN0LmNsaWVudEF1ZGlvU3RvcmFnZVR5cGUpIHtcclxuICAgICAgICB0aGlzLnNtLmNsaWVudEF1ZGlvU3RvcmFnZVR5cGUgPSBwcm9qZWN0LmNsaWVudEF1ZGlvU3RvcmFnZVR5cGU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5zbS5jbGllbnRNZWRpYVN0b3JhZ2VGb3JtYXQ9cHJvamVjdC5tZWRpYVN0b3JhZ2VGb3JtYXQ7XHJcblxyXG4gICAgICB0aGlzLnNtLmF1ZGlvRGV2aWNlcyA9IHByb2plY3QuYXVkaW9EZXZpY2VzO1xyXG4gICAgICBjaENudCA9IFByb2plY3RVdGlsLmF1ZGlvQ2hhbm5lbENvdW50KHByb2plY3QpO1xyXG4gICAgICBjb25zb2xlLmluZm8oXCJQcm9qZWN0IHJlcXVlc3RlZCByZWNvcmRpbmcgY2hhbm5lbCBjb3VudDogXCIgKyBjaENudCk7XHJcbiAgICAgIHRoaXMuc20uYXV0b0dhaW5Db250cm9sQ29uZmlncz1wcm9qZWN0LmF1dG9HYWluQ29udHJvbENvbmZpZ3M7XHJcbiAgICAgIGlmKHByb2plY3QuYWxsb3dFY2hvQ2FuY2VsbGF0aW9uIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgICAgdGhpcy5zbS5hbGxvd0VjaG9DYW5jZWxsYXRpb24gPSBwcm9qZWN0LmFsbG93RWNob0NhbmNlbGxhdGlvbjtcclxuICAgICAgfVxyXG4gICAgICBpZihwcm9qZWN0LmNodW5rZWRSZWNvcmRpbmc9PT10cnVlKXtcclxuICAgICAgICBjb25zb2xlLmRlYnVnKFwiRW5hYmxlIGNodW5rZWQgdXBsb2FkOiBjaHVua1NpemU6IFwiK0Jhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFMpXHJcbiAgICAgICAgdGhpcy5zbS51cGxvYWRDaHVua1NpemVTZWNvbmRzPUJhc2ljUmVjb3JkZXIuREVGQVVMVF9DSFVOS19TSVpFX1NFQ09ORFM7XHJcbiAgICAgIH1lbHNle1xyXG4gICAgICAgIHRoaXMuc20udXBsb2FkQ2h1bmtTaXplU2Vjb25kcz1udWxsO1xyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2plY3Quc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2UhPW51bGwpe1xyXG4gICAgICAgIHRoaXMuc20uc2hvd1Nlc3Npb25Db21wbGV0ZU1lc3NhZ2U9cHJvamVjdC5zaG93U2Vzc2lvbkNvbXBsZXRlTWVzc2FnZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihcIkVtcHR5IHByb2plY3QgY29uZmlndXJhdGlvbiFcIilcclxuICAgIH1cclxuICAgIHRoaXMuc20uY2hhbm5lbENvdW50ID0gY2hDbnQ7XHJcblxyXG4gIH1cclxuXHJcbiAgZ2V0IHByb2plY3QoKTpQcm9qZWN0fG51bGx7XHJcblx0XHQgIHJldHVybiB0aGlzLl9wcm9qZWN0O1xyXG4gIH1cclxuXHJcbiAgICBsb2FkUHJvamVjdENmZyhjYWxsYmFjazogKCk9PiBhbnkpe1xyXG4gICAgICBsZXQgcHJvalVybDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gICAgICBpZiAodGhpcy5zZXNzaW9uSWQgPT09IG51bGwpIHtcclxuICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhvc3RuYW1lID09PSAnbG9jYWxob3N0JyB8fCB0aGlzLm1vZGUgPT09IE1vZGUuREVNTykge1xyXG4gICAgICAgICAgLy8gZGVidWcgb3IgZGVtbyBtb2RlXHJcbiAgICAgICAgICBwcm9qVXJsID0gJ3Rlc3QvRGVtbzEuanNvbj8nICsgbmV3IERhdGUoKS5nZXRUaW1lKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIC8vIGxvYWQgUkVTVGZ1bCBieSBzZXNzaW9uSWRcclxuICAgICAgICBwcm9qVXJsID0gd2luZG93LmxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSArICc6JyArIHdpbmRvdy5sb2NhdGlvbi5wb3J0ICsgJy93aWtpc3BlZWNoL3Jlc3QvcHJvamVjdHMvP3Nlc3Npb25JZD0nICsgdGhpcy5zZXNzaW9uSWQ7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIGlmKHByb2pVcmwpIHtcclxuICAgICAgICBjb25zdCBwTG9hZGVyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XHJcbiAgICAgICAgcExvYWRlci5vcGVuKFwiR0VUXCIsIHByb2pVcmwsIHRydWUpO1xyXG4gICAgICAgIHBMb2FkZXIuc2V0UmVxdWVzdEhlYWRlcignQWNjZXB0JywgJ2FwcGxpY2F0aW9uL2pzb24nKTtcclxuICAgICAgICBwTG9hZGVyLnJlc3BvbnNlVHlwZSA9IFwianNvblwiO1xyXG4gICAgICAgIHBMb2FkZXIub25sb2FkID0gKGUpID0+IHtcclxuXHJcbiAgICAgICAgICB0aGlzLnByb2plY3QgPSBwTG9hZGVyLnJlc3BvbnNlLnByb2plY3Q7XHJcblxyXG4gICAgICAgICAgY2FsbGJhY2soKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcExvYWRlci5vbmVycm9yID0gKGUpID0+IHtcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJFcnJvciBkb3dubG9hZGluZyBwcm9qZWN0IGRhdGEgLi4uXCIpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBwTG9hZGVyLnNlbmQoKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHN0YXJ0KCl7XHJcbiAgICB9XHJcblxyXG4gIGF1ZGlvUGxheWVyVXBkYXRlKGU6QXVkaW9QbGF5ZXJFdmVudCl7XHJcbiAgICBpZihQbGF5YmFja0V2ZW50VHlwZS5TVEFSVEVEPT09ZS50eXBlKXtcclxuICAgICAgdGhpcy5zbS5zdGF0dXNBbGVydFR5cGU9J2luZm8nO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2suLi4nO1xyXG4gICAgfSBlbHNlIGlmIChQbGF5YmFja0V2ZW50VHlwZS5FTkRFRCA9PT0gZS50eXBlKSB7XHJcbiAgICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdpbmZvJztcclxuICAgICAgdGhpcy5zbS5zdGF0dXNNc2c9J1JlYWR5Lic7XHJcbiAgICB9ZWxzZSBpZihQbGF5YmFja0V2ZW50VHlwZS5FUlJPUj09PSBlLnR5cGUpe1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c0FsZXJ0VHlwZT0nZXJyb3InO1xyXG4gICAgICB0aGlzLnNtLnN0YXR1c01zZz0nUGxheWJhY2sgZXJyb3IuJztcclxuICAgIH1cclxuICB9XHJcblx0XHRlcnJvcigpe1xyXG5cdFx0ICAgIHRoaXMuc20uc3RhdHVzQWxlcnRUeXBlPSdlcnJvcic7XHJcblx0XHRcdHRoaXMuc20uc3RhdHVzTXNnPSdFUlJPUjogUmVjb3JkaW5nLic7XHJcblx0XHR9XHJcblx0fVxyXG4iXX0=
|