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,24 +0,0 @@
|
|
|
1
|
-
import { Breakpoints } from "@angular/cdk/layout";
|
|
2
|
-
import { Directive } from "@angular/core";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@angular/cdk/layout";
|
|
5
|
-
export class ResponsiveComponent {
|
|
6
|
-
constructor(breakpointObserver) {
|
|
7
|
-
this.breakpointObserver = breakpointObserver;
|
|
8
|
-
this.screenXs = false;
|
|
9
|
-
breakpointObserver
|
|
10
|
-
.observe([
|
|
11
|
-
Breakpoints.XSmall
|
|
12
|
-
])
|
|
13
|
-
.subscribe(result => {
|
|
14
|
-
this.screenXs = (result.matches);
|
|
15
|
-
//console.debug("Screen XS: "+this.screenXs);
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ResponsiveComponent, deps: [{ token: i1.BreakpointObserver }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
19
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ResponsiveComponent, ngImport: i0 }); }
|
|
20
|
-
}
|
|
21
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ResponsiveComponent, decorators: [{
|
|
22
|
-
type: Directive
|
|
23
|
-
}], ctorParameters: () => [{ type: i1.BreakpointObserver }] });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzcG9uc2l2ZV9jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvdWkvcmVzcG9uc2l2ZV9jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFxQixXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7QUFHeEMsTUFBTSxPQUFPLG1CQUFtQjtJQUk5QixZQUFzQixrQkFBc0M7UUFBdEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUY1RCxhQUFRLEdBQUcsS0FBSyxDQUFDO1FBR2Ysa0JBQWtCO2FBQ2YsT0FBTyxDQUFDO1lBQ1AsV0FBVyxDQUFDLE1BQU07U0FDbkIsQ0FBQzthQUNELFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLDZDQUE2QztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7K0dBYlUsbUJBQW1CO21HQUFuQixtQkFBbUI7OzRGQUFuQixtQkFBbUI7a0JBRC9CLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JyZWFrcG9pbnRPYnNlcnZlciwgQnJlYWtwb2ludHN9IGZyb20gXCJAYW5ndWxhci9jZGsvbGF5b3V0XCI7XHJcbmltcG9ydCB7RGlyZWN0aXZlfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuQERpcmVjdGl2ZSgpXHJcbmV4cG9ydCBjbGFzcyBSZXNwb25zaXZlQ29tcG9uZW50IHtcclxuXHJcbiAgc2NyZWVuWHMgPSBmYWxzZTtcclxuXHJcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGJyZWFrcG9pbnRPYnNlcnZlcjogQnJlYWtwb2ludE9ic2VydmVyKSB7XHJcbiAgICBicmVha3BvaW50T2JzZXJ2ZXJcclxuICAgICAgLm9ic2VydmUoW1xyXG4gICAgICAgIEJyZWFrcG9pbnRzLlhTbWFsbFxyXG4gICAgICBdKVxyXG4gICAgICAuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgICAgdGhpcy5zY3JlZW5YcyA9IChyZXN1bHQubWF0Y2hlcyk7XHJcbiAgICAgICAgLy9jb25zb2xlLmRlYnVnKFwiU2NyZWVuIFhTOiBcIit0aGlzLnNjcmVlblhzKTtcclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Directive, Input } from "@angular/core";
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class ScrollIntoViewDirective {
|
|
4
|
-
constructor(elRef) {
|
|
5
|
-
this.elRef = elRef;
|
|
6
|
-
}
|
|
7
|
-
set scrollIntoViewToBottom(siv) {
|
|
8
|
-
if (siv) {
|
|
9
|
-
this.elRef.nativeElement.scrollIntoView(false);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScrollIntoViewDirective, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
13
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScrollIntoViewDirective, selector: "[scrollIntoViewToBottom]", inputs: { scrollIntoViewToBottom: "scrollIntoViewToBottom" }, ngImport: i0 }); }
|
|
14
|
-
}
|
|
15
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScrollIntoViewDirective, decorators: [{
|
|
16
|
-
type: Directive,
|
|
17
|
-
args: [{
|
|
18
|
-
selector: "[scrollIntoViewToBottom]"
|
|
19
|
-
}]
|
|
20
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { scrollIntoViewToBottom: [{
|
|
21
|
-
type: Input
|
|
22
|
-
}] } });
|
|
23
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsSW50b1ZpZXdUb0JvdHRvbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NwZWVjaHJlY29yZGVybmcvc3JjL2xpYi91dGlscy9zY3JvbGxJbnRvVmlld1RvQm90dG9tLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE9BQU8sRUFBQyxTQUFTLEVBQWMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDOztBQUkzRCxNQUFNLE9BQU8sdUJBQXVCO0lBRWxDLFlBQW9CLEtBQWdCO1FBQWhCLFVBQUssR0FBTCxLQUFLLENBQVc7SUFBRSxDQUFDO0lBQ3ZDLElBQ0ksc0JBQXNCLENBQUMsR0FBVztRQUNsQyxJQUFHLEdBQUcsRUFBQyxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDTCxDQUFDOytHQVJVLHVCQUF1QjttR0FBdkIsdUJBQXVCOzs0RkFBdkIsdUJBQXVCO2tCQUhuQyxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQkFBMEI7aUJBQ3JDOytFQUtLLHNCQUFzQjtzQkFEekIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbIlxyXG5cclxuaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIElucHV0fSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5ARGlyZWN0aXZlKHtcclxuICBzZWxlY3RvcjogXCJbc2Nyb2xsSW50b1ZpZXdUb0JvdHRvbV1cIlxyXG59KVxyXG5leHBvcnQgY2xhc3MgU2Nyb2xsSW50b1ZpZXdEaXJlY3RpdmV7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6RWxlbWVudFJlZil7fVxyXG4gIEBJbnB1dCgpXHJcbiAgc2V0IHNjcm9sbEludG9WaWV3VG9Cb3R0b20oc2l2OmJvb2xlYW4pe1xyXG4gICAgICBpZihzaXYpe1xyXG4gICAgICAgIHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyhmYWxzZSk7XHJcbiAgICAgIH1cclxuICB9XHJcblxyXG59XHJcbiJdfQ==
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
export class UserAgentComponent {
|
|
2
|
-
constructor(name, version, comment) {
|
|
3
|
-
this.name = name;
|
|
4
|
-
this.version = version;
|
|
5
|
-
this.comment = comment;
|
|
6
|
-
}
|
|
7
|
-
toString() {
|
|
8
|
-
let s = '[' + this.name + ']';
|
|
9
|
-
if (this.version) {
|
|
10
|
-
s = s + ' [' + this.version + ']';
|
|
11
|
-
}
|
|
12
|
-
if (this.comment) {
|
|
13
|
-
s = s + ' [' + this.comment + ']';
|
|
14
|
-
}
|
|
15
|
-
return s;
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
export const NAME_FIREFOX = 'Firefox';
|
|
19
|
-
export const NAME_CHROME = 'Chrome';
|
|
20
|
-
export const NAME_SAFARI = 'Safari';
|
|
21
|
-
export const NAME_EDGE = 'Edge';
|
|
22
|
-
export var Browser;
|
|
23
|
-
(function (Browser) {
|
|
24
|
-
Browser["Firefox"] = "Firefox";
|
|
25
|
-
Browser["Chrome"] = "Chrome";
|
|
26
|
-
Browser["Safari"] = "Safari";
|
|
27
|
-
Browser["Edge"] = "Edge";
|
|
28
|
-
})(Browser || (Browser = {}));
|
|
29
|
-
export const OS_WINDOWS = 'Windows';
|
|
30
|
-
export const OS_ANDROID = 'Android';
|
|
31
|
-
export var Platform;
|
|
32
|
-
(function (Platform) {
|
|
33
|
-
Platform["Windows"] = "Windows";
|
|
34
|
-
Platform["Android"] = "Android";
|
|
35
|
-
Platform["macOS"] = "MAC OS X";
|
|
36
|
-
})(Platform || (Platform = {}));
|
|
37
|
-
export class UserAgent {
|
|
38
|
-
constructor(_detectedPlatform, _detectedBrowser, _detectedBrowserVersion = null) {
|
|
39
|
-
this._detectedPlatform = _detectedPlatform;
|
|
40
|
-
this._detectedBrowser = _detectedBrowser;
|
|
41
|
-
this._detectedBrowserVersion = _detectedBrowserVersion;
|
|
42
|
-
}
|
|
43
|
-
get detectedBrowser() {
|
|
44
|
-
return this._detectedBrowser;
|
|
45
|
-
}
|
|
46
|
-
get detectedBrowserVersion() {
|
|
47
|
-
return this._detectedBrowserVersion;
|
|
48
|
-
}
|
|
49
|
-
get detectedPlatform() {
|
|
50
|
-
return this._detectedPlatform;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
export class UserAgentBuilder {
|
|
54
|
-
constructor() {
|
|
55
|
-
this.comps = new Array();
|
|
56
|
-
}
|
|
57
|
-
static { this.instance = undefined; }
|
|
58
|
-
build() {
|
|
59
|
-
// // @ts-ignore
|
|
60
|
-
// if(navigator.userAgentData){
|
|
61
|
-
// // maybe we can use this in the future
|
|
62
|
-
// console.info("Browser provides userAgentData:");
|
|
63
|
-
//
|
|
64
|
-
// console.info("Brands:");
|
|
65
|
-
// // @ts-ignore
|
|
66
|
-
// navigator.userAgentData.brands.forEach((br=>{
|
|
67
|
-
// console.info(br.brand +" "+br.version);
|
|
68
|
-
// }))
|
|
69
|
-
// // @ts-ignore
|
|
70
|
-
// console.info("Platform: "+navigator.userAgentData.platform);
|
|
71
|
-
// // @ts-ignore
|
|
72
|
-
// console.info("Mobile:"+navigator.userAgentData.mobile);
|
|
73
|
-
// // @ts-ignore
|
|
74
|
-
// //console.info(navigator.userAgentData.toJSON());
|
|
75
|
-
// }else {
|
|
76
|
-
// console.info("Browser does not provide userAgentData.");
|
|
77
|
-
// }
|
|
78
|
-
let ua = navigator.userAgent;
|
|
79
|
-
console.debug("User agent: " + ua);
|
|
80
|
-
this.comps = new Array();
|
|
81
|
-
let pp = 0;
|
|
82
|
-
while (pp < ua.length) {
|
|
83
|
-
//parse name/version
|
|
84
|
-
let name = null;
|
|
85
|
-
let version = null;
|
|
86
|
-
let comment;
|
|
87
|
-
let blPos = ua.indexOf(' ', pp);
|
|
88
|
-
let prt;
|
|
89
|
-
// TODO Replace substr with substring (?)
|
|
90
|
-
// https://stackoverflow.com/questions/52640271/why-is-string-prototype-substr-deprecated
|
|
91
|
-
if (blPos == -1) {
|
|
92
|
-
prt = ua.substr(pp);
|
|
93
|
-
pp += prt.length;
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
prt = ua.substr(pp, blPos - pp);
|
|
97
|
-
pp = blPos + 1;
|
|
98
|
-
}
|
|
99
|
-
let sepPos = prt.indexOf('/');
|
|
100
|
-
if (sepPos > 0) {
|
|
101
|
-
name = prt.substr(0, sepPos);
|
|
102
|
-
version = prt.substr(sepPos + 1);
|
|
103
|
-
}
|
|
104
|
-
else {
|
|
105
|
-
name = prt;
|
|
106
|
-
}
|
|
107
|
-
while (ua[pp] === ' ' && pp < ua.length) {
|
|
108
|
-
pp++;
|
|
109
|
-
}
|
|
110
|
-
if (ua[pp] === '(') {
|
|
111
|
-
pp++;
|
|
112
|
-
let commEnd = ua.indexOf(')', pp);
|
|
113
|
-
comment = ua.substr(pp, commEnd - pp);
|
|
114
|
-
pp = commEnd + 1;
|
|
115
|
-
}
|
|
116
|
-
while (ua[pp] === ' ' && pp < ua.length) {
|
|
117
|
-
pp++;
|
|
118
|
-
}
|
|
119
|
-
const uac = new UserAgentComponent(name, version, comment);
|
|
120
|
-
console.debug("user agent comp: " + uac);
|
|
121
|
-
this.comps.push(uac);
|
|
122
|
-
}
|
|
123
|
-
let detPlatf = null;
|
|
124
|
-
if (this.runsOnOS(Platform.Android)) {
|
|
125
|
-
detPlatf = Platform.Android;
|
|
126
|
-
}
|
|
127
|
-
else if (this.runsOnOS(Platform.Windows)) {
|
|
128
|
-
detPlatf = Platform.Windows;
|
|
129
|
-
}
|
|
130
|
-
else if (this.runsOnOS(Platform.macOS)) {
|
|
131
|
-
detPlatf = Platform.macOS;
|
|
132
|
-
}
|
|
133
|
-
let detBr = null;
|
|
134
|
-
if (this.matchesBrowser(Browser.Firefox)) {
|
|
135
|
-
detBr = Browser.Firefox;
|
|
136
|
-
}
|
|
137
|
-
else if (this.matchesBrowser(Browser.Chrome)) {
|
|
138
|
-
detBr = Browser.Chrome;
|
|
139
|
-
}
|
|
140
|
-
else if (this.matchesBrowser(Browser.Safari)) {
|
|
141
|
-
detBr = Browser.Safari;
|
|
142
|
-
}
|
|
143
|
-
let detBrVers = null;
|
|
144
|
-
if (detBr) {
|
|
145
|
-
detBrVers = this.browserVersion(detBr);
|
|
146
|
-
}
|
|
147
|
-
this.userAgent = new UserAgent(detPlatf, detBr, detBrVers);
|
|
148
|
-
}
|
|
149
|
-
matchesBrowser(browserName) {
|
|
150
|
-
for (let ci = 0; ci < this.comps.length; ci++) {
|
|
151
|
-
let bn = this.comps[ci].name;
|
|
152
|
-
let bnRe = new RegExp(browserName, 'i');
|
|
153
|
-
if (bn.match(bnRe)) {
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
return false;
|
|
158
|
-
}
|
|
159
|
-
browserVersion(browserName) {
|
|
160
|
-
for (let ci = 0; ci < this.comps.length; ci++) {
|
|
161
|
-
const comp = this.comps[ci];
|
|
162
|
-
const bn = comp.name;
|
|
163
|
-
const bnRe = new RegExp(browserName, 'i');
|
|
164
|
-
if (bn.match(bnRe)) {
|
|
165
|
-
return comp.version;
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
return null;
|
|
169
|
-
}
|
|
170
|
-
runsOnOS(os) {
|
|
171
|
-
for (let ci = 0; ci < this.comps.length; ci++) {
|
|
172
|
-
let cc = this.comps[ci].comment;
|
|
173
|
-
if (cc) {
|
|
174
|
-
var osRe = new RegExp(os, 'i');
|
|
175
|
-
if (cc.match(osRe)) {
|
|
176
|
-
return true;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return false;
|
|
181
|
-
}
|
|
182
|
-
static userAgent() {
|
|
183
|
-
if (!this.instance) {
|
|
184
|
-
this.instance = new UserAgentBuilder();
|
|
185
|
-
}
|
|
186
|
-
this.instance.build();
|
|
187
|
-
return this.instance.userAgent;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidWEtcGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3V0aWxzL3VhLXBhcnNlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLFlBQW1CLElBQVcsRUFBUSxPQUFtQixFQUFRLE9BQWU7UUFBN0QsU0FBSSxHQUFKLElBQUksQ0FBTztRQUFRLFlBQU8sR0FBUCxPQUFPLENBQVk7UUFBUSxZQUFPLEdBQVAsT0FBTyxDQUFRO0lBRWhGLENBQUM7SUFFRCxRQUFRO1FBQ04sSUFBSSxDQUFDLEdBQUMsR0FBRyxHQUFDLElBQUksQ0FBQyxJQUFJLEdBQUMsR0FBRyxDQUFDO1FBQ3hCLElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDO1lBQ2YsQ0FBQyxHQUFDLENBQUMsR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLE9BQU8sR0FBQyxHQUFHLENBQUM7UUFDNUIsQ0FBQztRQUNELElBQUcsSUFBSSxDQUFDLE9BQU8sRUFBQyxDQUFDO1lBQ2YsQ0FBQyxHQUFDLENBQUMsR0FBQyxJQUFJLEdBQUMsSUFBSSxDQUFDLE9BQU8sR0FBQyxHQUFHLENBQUM7UUFDNUIsQ0FBQztRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztDQUNGO0FBQ0QsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFDLFNBQVMsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUMsUUFBUSxDQUFDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBQyxRQUFRLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFDLE1BQU0sQ0FBQztBQUk5QixNQUFNLENBQU4sSUFBWSxPQUF1RTtBQUFuRixXQUFZLE9BQU87SUFBRSw4QkFBaUIsQ0FBQTtJQUFDLDRCQUFlLENBQUE7SUFBQyw0QkFBZSxDQUFBO0lBQUMsd0JBQVcsQ0FB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TCxJQUFJLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxFQUFFLEVBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBQyxDQUFDO29CQUNqQixPQUFPLElBQUksQ0FBQztnQkFDZCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUztRQUNaLElBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLFFBQVEsR0FBQyxJQUFJLGdCQUFnQixFQUFFLENBQUM7UUFDdkMsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdEIsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztJQUVuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFVzZXJBZ2VudENvbXBvbmVudHtcclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTpzdHJpbmcscHVibGljIHZlcnNpb246c3RyaW5nfG51bGwscHVibGljIGNvbW1lbnQ/OnN0cmluZykge1xyXG5cclxuICB9XHJcblxyXG4gIHRvU3RyaW5nKCk6c3RyaW5ne1xyXG4gICAgbGV0IHM9J1snK3RoaXMubmFtZSsnXSc7XHJcbiAgICBpZih0aGlzLnZlcnNpb24pe1xyXG4gICAgICBzPXMrJyBbJyt0aGlzLnZlcnNpb24rJ10nO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5jb21tZW50KXtcclxuICAgICAgcz1zKycgWycrdGhpcy5jb21tZW50KyddJztcclxuICAgIH1cclxuICAgIHJldHVybiBzO1xyXG4gIH1cclxufVxyXG5leHBvcnQgY29uc3QgTkFNRV9GSVJFRk9YPSdGaXJlZm94JztcclxuZXhwb3J0IGNvbnN0IE5BTUVfQ0hST01FPSdDaHJvbWUnO1xyXG5leHBvcnQgY29uc3QgTkFNRV9TQUZBUkk9J1NhZmFyaSc7XHJcbmV4cG9ydCBjb25zdCBOQU1FX0VER0U9J0VkZ2UnO1xyXG5cclxuXHJcblxyXG5leHBvcnQgZW51bSBCcm93c2VyIHtGaXJlZm94PSdGaXJlZm94JyxDaHJvbWU9J0Nocm9tZScsU2FmYXJpPSdTYWZhcmknLEVkZ2U9J0VkZ2UnfVxyXG5cclxuZXhwb3J0IGNvbnN0IE9TX1dJTkRPV1M9J1dpbmRvd3MnO1xyXG5leHBvcnQgY29uc3QgT1NfQU5EUk9JRD0nQW5kcm9pZCc7XHJcblxyXG5leHBvcnQgZW51bSBQbGF0Zm9ybSB7V2luZG93cz0nV2luZG93cycsQW5kcm9pZD0nQW5kcm9pZCcsbWFjT1M9J01BQyBPUyBYJ31cclxuXHJcbmV4cG9ydCBjbGFzcyBVc2VyQWdlbnR7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kZXRlY3RlZFBsYXRmb3JtOlBsYXRmb3JtfG51bGwscHJpdmF0ZSBfZGV0ZWN0ZWRCcm93c2VyOkJyb3dzZXJ8bnVsbCxwcml2YXRlIF9kZXRlY3RlZEJyb3dzZXJWZXJzaW9uOnN0cmluZ3xudWxsPW51bGwpIHtcclxuICB9XHJcblxyXG4gIGdldCBkZXRlY3RlZEJyb3dzZXIoKTogQnJvd3NlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RldGVjdGVkQnJvd3NlcjtcclxuICB9XHJcblxyXG4gIGdldCBkZXRlY3RlZEJyb3dzZXJWZXJzaW9uKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RldGVjdGVkQnJvd3NlclZlcnNpb247XHJcbiAgfVxyXG5cclxuICBnZXQgZGV0ZWN0ZWRQbGF0Zm9ybSgpOiBQbGF0Zm9ybSB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RldGVjdGVkUGxhdGZvcm07XHJcbiAgfVxyXG5cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFVzZXJBZ2VudEJ1aWxkZXIge1xyXG4gIHN0YXRpYyBpbnN0YW5jZTpVc2VyQWdlbnRCdWlsZGVyfHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgcHJpdmF0ZSBjb21wczpBcnJheTxVc2VyQWdlbnRDb21wb25lbnQ+PW5ldyBBcnJheTxVc2VyQWdlbnRDb21wb25lbnQ+KCk7XHJcbiAgcHJpdmF0ZSB1c2VyQWdlbnQhOlVzZXJBZ2VudDtcclxuXHJcbiAgcHJpdmF0ZSBidWlsZCgpIHtcclxuXHJcbiAgICAvLyAvLyBAdHMtaWdub3JlXHJcbiAgICAvLyBpZihuYXZpZ2F0b3IudXNlckFnZW50RGF0YSl7XHJcbiAgICAvLyAgIC8vIG1heWJlIHdlIGNhbiB1c2UgdGhpcyBpbiAgdGhlIGZ1dHVyZVxyXG4gICAgLy8gICBjb25zb2xlLmluZm8oXCJCcm93c2VyIHByb3ZpZGVzIHVzZXJBZ2VudERhdGE6XCIpO1xyXG4gICAgLy9cclxuICAgIC8vICAgY29uc29sZS5pbmZvKFwiQnJhbmRzOlwiKTtcclxuICAgIC8vICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgLy8gICBuYXZpZ2F0b3IudXNlckFnZW50RGF0YS5icmFuZHMuZm9yRWFjaCgoYnI9PntcclxuICAgIC8vICAgICBjb25zb2xlLmluZm8oYnIuYnJhbmQgK1wiIFwiK2JyLnZlcnNpb24pO1xyXG4gICAgLy8gICB9KSlcclxuICAgIC8vICAgLy8gQHRzLWlnbm9yZVxyXG4gICAgLy8gICBjb25zb2xlLmluZm8oXCJQbGF0Zm9ybTogXCIrbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEucGxhdGZvcm0pO1xyXG4gICAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgICAvLyAgIGNvbnNvbGUuaW5mbyhcIk1vYmlsZTpcIituYXZpZ2F0b3IudXNlckFnZW50RGF0YS5tb2JpbGUpO1xyXG4gICAgLy8gICAvLyBAdHMtaWdub3JlXHJcbiAgICAvLyAgIC8vY29uc29sZS5pbmZvKG5hdmlnYXRvci51c2VyQWdlbnREYXRhLnRvSlNPTigpKTtcclxuICAgIC8vIH1lbHNlIHtcclxuICAgIC8vICAgY29uc29sZS5pbmZvKFwiQnJvd3NlciBkb2VzIG5vdCBwcm92aWRlIHVzZXJBZ2VudERhdGEuXCIpO1xyXG4gICAgLy8gfVxyXG5cclxuICAgIGxldCB1YT1uYXZpZ2F0b3IudXNlckFnZW50O1xyXG4gICAgY29uc29sZS5kZWJ1ZyhcIlVzZXIgYWdlbnQ6IFwiK3VhKTtcclxuICAgIHRoaXMuY29tcHMgPSBuZXcgQXJyYXk8VXNlckFnZW50Q29tcG9uZW50PigpO1xyXG5cclxuICAgIGxldCBwcCA9IDA7XHJcbiAgICB3aGlsZSAocHAgPCB1YS5sZW5ndGgpIHtcclxuICAgICAgLy9wYXJzZSBuYW1lL3ZlcnNpb25cclxuICAgICAgbGV0IG5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsXHJcbiAgICAgIGxldCB2ZXJzaW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcclxuICAgICAgbGV0IGNvbW1lbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcclxuXHJcbiAgICAgIGxldCBibFBvcyA9IHVhLmluZGV4T2YoJyAnLCBwcCk7XHJcbiAgICAgIGxldCBwcnQ6IHN0cmluZztcclxuICAgICAgLy8gVE9ETyBSZXBsYWNlIHN1YnN0ciB3aXRoIHN1YnN0cmluZyAoPylcclxuICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNTI2NDAyNzEvd2h5LWlzLXN0cmluZy1wcm90b3R5cGUtc3Vic3RyLWRlcHJlY2F0ZWRcclxuICAgICAgaWYgKGJsUG9zID09IC0xKSB7XHJcbiAgICAgICAgcHJ0ID0gdWEuc3Vic3RyKHBwKTtcclxuICAgICAgICBwcCArPSBwcnQubGVuZ3RoO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHBydCA9IHVhLnN1YnN0cihwcCwgYmxQb3MgLSBwcCk7XHJcbiAgICAgICAgcHAgPSBibFBvcyArIDE7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IHNlcFBvcyA9IHBydC5pbmRleE9mKCcvJyk7XHJcbiAgICAgIGlmIChzZXBQb3MgPiAwKSB7XHJcbiAgICAgICAgbmFtZSA9IHBydC5zdWJzdHIoMCwgc2VwUG9zKTtcclxuICAgICAgICB2ZXJzaW9uID0gcHJ0LnN1YnN0cihzZXBQb3MgKyAxKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBuYW1lID0gcHJ0O1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlICh1YVtwcF0gPT09ICcgJyAmJiBwcCA8IHVhLmxlbmd0aCkge1xyXG4gICAgICAgIHBwKys7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHVhW3BwXSA9PT0gJygnKSB7XHJcbiAgICAgICAgcHArKztcclxuICAgICAgICBsZXQgY29tbUVuZCA9IHVhLmluZGV4T2YoJyknLCBwcCk7XHJcbiAgICAgICAgY29tbWVudCA9IHVhLnN1YnN0cihwcCwgY29tbUVuZCAtIHBwKTtcclxuICAgICAgICBwcCA9IGNvbW1FbmQgKyAxO1xyXG4gICAgICB9XHJcbiAgICAgIHdoaWxlICh1YVtwcF0gPT09ICcgJyAmJiBwcCA8IHVhLmxlbmd0aCkge1xyXG4gICAgICAgIHBwKys7XHJcbiAgICAgIH1cclxuICAgICAgY29uc3QgdWFjPW5ldyBVc2VyQWdlbnRDb21wb25lbnQobmFtZSwgdmVyc2lvbiwgY29tbWVudCk7XHJcbiAgICAgIGNvbnNvbGUuZGVidWcoXCJ1c2VyIGFnZW50IGNvbXA6IFwiK3VhYyk7XHJcbiAgICAgIHRoaXMuY29tcHMucHVzaCh1YWMpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBkZXRQbGF0ZjpQbGF0Zm9ybXxudWxsPW51bGw7XHJcbiAgICBpZih0aGlzLnJ1bnNPbk9TKFBsYXRmb3JtLkFuZHJvaWQpKXtcclxuICAgICAgZGV0UGxhdGY9UGxhdGZvcm0uQW5kcm9pZDtcclxuICAgIH1lbHNlIGlmKHRoaXMucnVuc09uT1MoUGxhdGZvcm0uV2luZG93cykpe1xyXG4gICAgICBkZXRQbGF0Zj1QbGF0Zm9ybS5XaW5kb3dzO1xyXG4gICAgfWVsc2UgaWYodGhpcy5ydW5zT25PUyhQbGF0Zm9ybS5tYWNPUykpe1xyXG4gICAgICBkZXRQbGF0Zj1QbGF0Zm9ybS5tYWNPUztcclxuICAgIH1cclxuXHJcblxyXG4gIGxldCBkZXRCcjpCcm93c2VyfG51bGw9bnVsbDtcclxuICAgIGlmKHRoaXMubWF0Y2hlc0Jyb3dzZXIoQnJvd3Nlci5GaXJlZm94KSl7XHJcbiAgICAgIGRldEJyPUJyb3dzZXIuRmlyZWZveDtcclxuICAgIH1lbHNlIGlmKHRoaXMubWF0Y2hlc0Jyb3dzZXIoQnJvd3Nlci5DaHJvbWUpKXtcclxuICAgICAgZGV0QnI9QnJvd3Nlci5DaHJvbWU7XHJcbiAgICB9ZWxzZSBpZih0aGlzLm1hdGNoZXNCcm93c2VyKEJyb3dzZXIuU2FmYXJpKSl7XHJcbiAgICAgIGRldEJyPUJyb3dzZXIuU2FmYXJpO1xyXG4gICAgfVxyXG4gICAgbGV0IGRldEJyVmVycyA9bnVsbDtcclxuICAgIGlmKGRldEJyKSB7XHJcbiAgICAgZGV0QnJWZXJzPXRoaXMuYnJvd3NlclZlcnNpb24oZGV0QnIpO1xyXG4gICAgfVxyXG4gICAgdGhpcy51c2VyQWdlbnQ9bmV3IFVzZXJBZ2VudChkZXRQbGF0ZixkZXRCcixkZXRCclZlcnMpO1xyXG5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgbWF0Y2hlc0Jyb3dzZXIoYnJvd3Nlck5hbWU6c3RyaW5nKXtcclxuICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNvbXBzLmxlbmd0aDtjaSsrKXtcclxuICAgICAgbGV0IGJuPXRoaXMuY29tcHNbY2ldLm5hbWVcclxuICAgICAgbGV0IGJuUmU9bmV3IFJlZ0V4cChicm93c2VyTmFtZSwnaScpO1xyXG4gICAgICBpZihibi5tYXRjaChiblJlKSl7XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgYnJvd3NlclZlcnNpb24oYnJvd3Nlck5hbWU6c3RyaW5nKTpzdHJpbmd8bnVsbHtcclxuICAgIGZvcihsZXQgY2k9MDtjaTx0aGlzLmNvbXBzLmxlbmd0aDtjaSsrKXtcclxuICAgICAgY29uc3QgY29tcD10aGlzLmNvbXBzW2NpXTtcclxuICAgICAgY29uc3QgYm49Y29tcC5uYW1lO1xyXG4gICAgICBjb25zdCBiblJlPW5ldyBSZWdFeHAoYnJvd3Nlck5hbWUsJ2knKTtcclxuICAgICAgaWYoYm4ubWF0Y2goYm5SZSkpe1xyXG4gICAgICAgIHJldHVybiBjb21wLnZlcnNpb247XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBydW5zT25PUyhvczpzdHJpbmcpOmJvb2xlYW57XHJcbiAgICBmb3IobGV0IGNpPTA7Y2k8dGhpcy5jb21wcy5sZW5ndGg7Y2krKyl7XHJcbiAgICAgIGxldCBjYz10aGlzLmNvbXBzW2NpXS5jb21tZW50XHJcbiAgICAgIGlmKGNjKXtcclxuICAgICAgICB2YXIgb3NSZSA9IG5ldyBSZWdFeHAob3MsJ2knKTtcclxuICAgICAgICBpZihjYy5tYXRjaChvc1JlKSl7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHN0YXRpYyB1c2VyQWdlbnQoKTpVc2VyQWdlbnR7XHJcbiAgICAgIGlmKCF0aGlzLmluc3RhbmNlKXtcclxuICAgICAgICB0aGlzLmluc3RhbmNlPW5ldyBVc2VyQWdlbnRCdWlsZGVyKCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5pbnN0YW5jZS5idWlsZCgpO1xyXG4gICAgICByZXR1cm4gdGhpcy5pbnN0YW5jZS51c2VyQWdlbnQ7XHJcblxyXG4gIH1cclxuXHJcbn1cclxuIl19
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
export class UUID {
|
|
2
|
-
static generate() {
|
|
3
|
-
return UUID.s4() + UUID.s4() + '-' + UUID.s4() + '-' + UUID.s4() + '-' +
|
|
4
|
-
UUID.s4() + '-' + UUID.s4() + UUID.s4() + UUID.s4();
|
|
5
|
-
}
|
|
6
|
-
static s4() {
|
|
7
|
-
return Math.floor((1 + Math.random()) * 0x10000)
|
|
8
|
-
.toString(16)
|
|
9
|
-
.substring(1);
|
|
10
|
-
}
|
|
11
|
-
}
|
|
12
|
-
export class DataSize {
|
|
13
|
-
static { this.BINARY_UNITS = ['B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB', 'RiB', 'QiB']; }
|
|
14
|
-
static { this.BINARY_UNIT_FACTOR = 1024; }
|
|
15
|
-
static { this.BINARY_UNIT_FACTOR_LOG = Math.log(DataSize.BINARY_UNIT_FACTOR); }
|
|
16
|
-
static formatBytesToBinaryUnits(bytes, decimals = 2) {
|
|
17
|
-
let binaryUnitIdx = 0;
|
|
18
|
-
let divisor = 1;
|
|
19
|
-
if (bytes > 0) {
|
|
20
|
-
const bytesLog = Math.log(bytes);
|
|
21
|
-
binaryUnitIdx = Math.floor(bytesLog / this.BINARY_UNIT_FACTOR_LOG);
|
|
22
|
-
if (binaryUnitIdx >= this.BINARY_UNITS.length) {
|
|
23
|
-
// fallback to bytes
|
|
24
|
-
binaryUnitIdx = 0;
|
|
25
|
-
}
|
|
26
|
-
divisor = Math.pow(this.BINARY_UNIT_FACTOR, binaryUnitIdx);
|
|
27
|
-
}
|
|
28
|
-
let decimalsUnitValue;
|
|
29
|
-
if (binaryUnitIdx === 0) {
|
|
30
|
-
decimalsUnitValue = bytes.toString();
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
const unitValue = bytes / divisor;
|
|
34
|
-
decimalsUnitValue = unitValue.toFixed(decimals);
|
|
35
|
-
}
|
|
36
|
-
const binaryUnitStr = decimalsUnitValue + ' ' + this.BINARY_UNITS[binaryUnitIdx];
|
|
37
|
-
return binaryUnitStr;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
export class Arrays {
|
|
41
|
-
static cloneNumberArray(numberArray) {
|
|
42
|
-
let len = numberArray.length;
|
|
43
|
-
let cloneArr = new Array(len);
|
|
44
|
-
for (let c = 0; c < numberArray.length; c++) {
|
|
45
|
-
cloneArr[c] = numberArray[c];
|
|
46
|
-
}
|
|
47
|
-
return cloneArr;
|
|
48
|
-
}
|
|
49
|
-
static swap(items, i, j) {
|
|
50
|
-
let tmp = items[i];
|
|
51
|
-
items[i] = items[j];
|
|
52
|
-
items[j] = tmp;
|
|
53
|
-
}
|
|
54
|
-
static shuffleArray(orgArray) {
|
|
55
|
-
let shuffledArray = [...orgArray];
|
|
56
|
-
for (let i = shuffledArray.length; i > 1; i--) {
|
|
57
|
-
let rnd = Math.random();
|
|
58
|
-
let rndArrIdx = Math.floor(rnd * i);
|
|
59
|
-
Arrays.swap(shuffledArray, i - 1, rndArrIdx);
|
|
60
|
-
}
|
|
61
|
-
return shuffledArray;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
export class WorkerHelper {
|
|
65
|
-
static { this.DEBUG = false; }
|
|
66
|
-
static buildWorkerBlobURL(workerFct) {
|
|
67
|
-
if (!(workerFct instanceof Function)) {
|
|
68
|
-
throw new Error('Parameter workerFct is not a function! (XSS attack?).');
|
|
69
|
-
}
|
|
70
|
-
let woFctNm = workerFct.name;
|
|
71
|
-
if (WorkerHelper.DEBUG) {
|
|
72
|
-
console.info("Worker method name: " + woFctNm);
|
|
73
|
-
}
|
|
74
|
-
let woFctStr = workerFct.toString();
|
|
75
|
-
if (WorkerHelper.DEBUG) {
|
|
76
|
-
console.info("Worker method string:");
|
|
77
|
-
console.info(woFctStr);
|
|
78
|
-
}
|
|
79
|
-
// Make sure code starts with "function()"
|
|
80
|
-
// Chrome, Firefox: "[wofctNm](){...}", Safari: "function [wofctNm](){...}"
|
|
81
|
-
// we need an anonymous function: "function() {...}"
|
|
82
|
-
let piWoFctStr = woFctStr.replace(/^function +/, '');
|
|
83
|
-
if (WorkerHelper.DEBUG) {
|
|
84
|
-
console.info("Worker platform independent function string:");
|
|
85
|
-
console.info(piWoFctStr);
|
|
86
|
-
}
|
|
87
|
-
// Convert to anonymous function
|
|
88
|
-
let anonWoFctStr = piWoFctStr.replace(woFctNm + '()', 'function()');
|
|
89
|
-
if (WorkerHelper.DEBUG) {
|
|
90
|
-
console.info("Worker anonymous function string:");
|
|
91
|
-
console.info(piWoFctStr);
|
|
92
|
-
}
|
|
93
|
-
// Self executing
|
|
94
|
-
let ws = '(' + anonWoFctStr + ')();';
|
|
95
|
-
if (WorkerHelper.DEBUG) {
|
|
96
|
-
console.info("Worker self executing anonymous function string:");
|
|
97
|
-
console.info(anonWoFctStr);
|
|
98
|
-
}
|
|
99
|
-
// Build the worker blob
|
|
100
|
-
let wb = new Blob([ws], { type: 'text/javascript' });
|
|
101
|
-
let workerBlobUrl = window.URL.createObjectURL(wb);
|
|
102
|
-
return workerBlobUrl;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
export class ErrorHelper {
|
|
106
|
-
static messageFromError(error) {
|
|
107
|
-
let msg = null;
|
|
108
|
-
if (error instanceof Error) {
|
|
109
|
-
msg = error.message;
|
|
110
|
-
}
|
|
111
|
-
return msg;
|
|
112
|
-
}
|
|
113
|
-
static messageFromErrorNonNull(error) {
|
|
114
|
-
let msg = '';
|
|
115
|
-
const msgNullable = ErrorHelper.messageFromError(error);
|
|
116
|
-
if (msgNullable != null) {
|
|
117
|
-
msg = msgNullable;
|
|
118
|
-
}
|
|
119
|
-
return msg;
|
|
120
|
-
}
|
|
121
|
-
static message(baseMessage, error) {
|
|
122
|
-
let msg = baseMessage;
|
|
123
|
-
if (error instanceof Error) {
|
|
124
|
-
msg = baseMessage + ': ' + error.message;
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
msg = baseMessage + '.';
|
|
128
|
-
}
|
|
129
|
-
return msg;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvdXRpbHMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0UsTUFBTSxPQUFPLElBQUk7SUFFZixNQUFNLENBQUMsUUFBUTtRQUNmLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRztZQUNwRSxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hELENBQUM7SUFFUyxNQUFNLENBQUMsRUFBRTtRQUNqQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDO2FBQzdDLFFBQVEsQ0FBQyxFQUFFLENBQUM7YUFDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztDQUNBO0FBRUQsTUFBTSxPQUFPLFFBQVE7YUFDSixpQkFBWSxHQUFDLENBQUMsR0FBRyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssRUFBQyxLQUFLLEVBQUMsS0FBSyxFQUFDLEtBQUssQ0FBQyxDQUFDO2FBQy9FLHVCQUFrQixHQUFRLElBQUksQ0FBQzthQUMvQiwyQkFBc0IsR0FBUSxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRW5GLE1BQU0sQ0FBQyx3QkFBd0Is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LFdBQVcsR0FBQyxJQUFJLEdBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUNyQyxDQUFDO2FBQUksQ0FBQztZQUNKLEdBQUcsR0FBQyxXQUFXLEdBQUMsR0FBRyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbIlxyXG4gIGV4cG9ydCBjbGFzcyBVVUlEIHtcclxuXHJcbiAgICBzdGF0aWMgZ2VuZXJhdGUoKTpzdHJpbmcge1xyXG4gICAgcmV0dXJuIFVVSUQuczQoKSArIFVVSUQuczQoKSArICctJyArIFVVSUQuczQoKSArICctJyArIFVVSUQuczQoKSArICctJyArXHJcbiAgICAgIFVVSUQuczQoKSArICctJyArIFVVSUQuczQoKSArIFVVSUQuczQoKSArIFVVSUQuczQoKTtcclxuICB9XHJcblxyXG4gICAgcHJpdmF0ZSBzdGF0aWMgczQoKSB7XHJcbiAgICByZXR1cm4gTWF0aC5mbG9vcigoMSArIE1hdGgucmFuZG9tKCkpICogMHgxMDAwMClcclxuICAgICAgLnRvU3RyaW5nKDE2KVxyXG4gICAgICAuc3Vic3RyaW5nKDEpO1xyXG4gIH1cclxuICB9XHJcblxyXG4gIGV4cG9ydCBjbGFzcyBEYXRhU2l6ZXtcclxuICAgIHByaXZhdGUgc3RhdGljIEJJTkFSWV9VTklUUz1bJ0InLCdLaUInLCdNaUInLCdHaUInLCdUaUInLCdQaUInLCdFaUInLCdaaUInLCdZaUInLCdSaUInLCdRaUInXTtcclxuICAgIHByaXZhdGUgc3RhdGljIEJJTkFSWV9VTklUX0ZBQ1RPUjpudW1iZXI9MTAyNDtcclxuICAgIHByaXZhdGUgc3RhdGljIEJJTkFSWV9VTklUX0ZBQ1RPUl9MT0c6bnVtYmVyPU1hdGgubG9nKERhdGFTaXplLkJJTkFSWV9VTklUX0ZBQ1RPUik7XHJcblxyXG4gICAgc3RhdGljIGZvcm1hdEJ5dGVzVG9CaW5hcnlVbml0cyhieXRlczpudW1iZXIsZGVjaW1hbHM6bnVtYmVyPTIpOnN0cmluZ3tcclxuXHJcbiAgICAgIGxldCBiaW5hcnlVbml0SWR4PTA7XHJcbiAgICAgIGxldCBkaXZpc29yPTE7XHJcbiAgICAgIGlmKGJ5dGVzPjApIHtcclxuICAgICAgICBjb25zdCBieXRlc0xvZyA9IE1hdGgubG9nKGJ5dGVzKTtcclxuICAgICAgICBiaW5hcnlVbml0SWR4ID0gTWF0aC5mbG9vcihieXRlc0xvZyAvIHRoaXMuQklOQVJZX1VOSVRfRkFDVE9SX0xPRyk7XHJcbiAgICAgICAgaWYgKGJpbmFyeVVuaXRJZHggPj0gdGhpcy5CSU5BUllfVU5JVFMubGVuZ3RoKSB7XHJcbiAgICAgICAgICAvLyBmYWxsYmFjayB0byBieXRlc1xyXG4gICAgICAgICAgYmluYXJ5VW5pdElkeCA9IDA7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGRpdmlzb3IgPSBNYXRoLnBvdyh0aGlzLkJJTkFSWV9VTklUX0ZBQ1RPUiwgYmluYXJ5VW5pdElkeCk7XHJcbiAgICAgIH1cclxuICAgICAgbGV0IGRlY2ltYWxzVW5pdFZhbHVlOnN0cmluZztcclxuICAgICAgaWYoYmluYXJ5VW5pdElkeD09PTApe1xyXG4gICAgICAgIGRlY2ltYWxzVW5pdFZhbHVlPWJ5dGVzLnRvU3RyaW5nKCk7XHJcbiAgICAgIH1lbHNlIHtcclxuICAgICAgICBjb25zdCB1bml0VmFsdWUgPSBieXRlcyAvIGRpdmlzb3I7XHJcbiAgICAgICAgZGVjaW1hbHNVbml0VmFsdWU9dW5pdFZhbHVlLnRvRml4ZWQoZGVjaW1hbHMpO1xyXG4gICAgICB9XHJcbiAgICAgIGNvbnN0IGJpbmFyeVVuaXRTdHIgPSBkZWNpbWFsc1VuaXRWYWx1ZSArICcgJyArIHRoaXMuQklOQVJZX1VOSVRTW2JpbmFyeVVuaXRJZHhdO1xyXG5cclxuICAgICAgcmV0dXJuIGJpbmFyeVVuaXRTdHI7XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNsYXNzIEFycmF5cyB7XHJcblxyXG4gICAgc3RhdGljIGNsb25lTnVtYmVyQXJyYXkobnVtYmVyQXJyYXk6IEFycmF5PG51bWJlcj4pOiBBcnJheTxudW1iZXI+IHtcclxuICAgICAgbGV0IGxlbiA9IG51bWJlckFycmF5Lmxlbmd0aDtcclxuICAgICAgbGV0IGNsb25lQXJyID0gbmV3IEFycmF5PG51bWJlcj4obGVuKTtcclxuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1iZXJBcnJheS5sZW5ndGg7IGMrKykge1xyXG4gICAgICAgIGNsb25lQXJyW2NdID0gbnVtYmVyQXJyYXlbY107XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGNsb25lQXJyO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBzd2FwPFQ+KGl0ZW1zOkFycmF5PFQ+LCBpOm51bWJlciwgajpudW1iZXIpIHtcclxuICAgICAgbGV0IHRtcCA9IGl0ZW1zW2ldO1xyXG4gICAgICBpdGVtc1tpXSA9IGl0ZW1zW2pdO1xyXG4gICAgICBpdGVtc1tqXSA9IHRtcDtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc2h1ZmZsZUFycmF5PFQ+KG9yZ0FycmF5OkFycmF5PFQ+KTpBcnJheTxUPntcclxuICAgICAgICBsZXQgc2h1ZmZsZWRBcnJheSA9IFsuLi5vcmdBcnJheV07XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHNodWZmbGVkQXJyYXkubGVuZ3RoOyBpID4gMTsgaS0tKSB7XHJcbiAgICAgICAgICBsZXQgcm5kPU1hdGgucmFuZG9tKCk7XHJcbiAgICAgICAgICBsZXQgcm5kQXJySWR4PU1hdGguZmxvb3Iocm5kKmkpO1xyXG4gICAgICAgICAgQXJyYXlzLnN3YXAoc2h1ZmZsZWRBcnJheSwgaSAtIDEsIHJuZEFycklkeCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzaHVmZmxlZEFycmF5O1xyXG4gICAgICB9XHJcbiAgfVxyXG5cclxuICBleHBvcnQgY2xhc3MgV29ya2VySGVscGVyIHtcclxuXHJcbiAgICBzdGF0aWMgREVCVUc9ZmFsc2U7XHJcbiAgICBzdGF0aWMgYnVpbGRXb3JrZXJCbG9iVVJMKHdvcmtlckZjdDogRnVuY3Rpb24pOiBzdHJpbmcge1xyXG5cclxuICAgICAgaWYoISAod29ya2VyRmN0IGluc3RhbmNlb2YgRnVuY3Rpb24pKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxyXG4gICAgICAgICAgICAnUGFyYW1ldGVyIHdvcmtlckZjdCBpcyBub3QgYSBmdW5jdGlvbiEgKFhTUyBhdHRhY2s/KS4nXHJcbiAgICAgICAgKVxyXG4gICAgICB9XHJcbiAgICAgIGxldCAgd29GY3RObSA9IHdvcmtlckZjdC5uYW1lXHJcbiAgICAgIGlmIChXb3JrZXJIZWxwZXIuREVCVUcpIHtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJXb3JrZXIgbWV0aG9kIG5hbWU6IFwiICsgd29GY3RObSlcclxuICAgICAgfVxyXG5cclxuICAgICAgbGV0IHdvRmN0U3RyID0gd29ya2VyRmN0LnRvU3RyaW5nKClcclxuICAgICAgaWYgKFdvcmtlckhlbHBlci5ERUJVRykge1xyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhcIldvcmtlciBtZXRob2Qgc3RyaW5nOlwiKVxyXG4gICAgICAgIGNvbnNvbGUuaW5mbyh3b0ZjdFN0cilcclxuICAgICAgfVxyXG5cclxuXHJcbiAgICAgIC8vIE1ha2Ugc3VyZSBjb2RlIHN0YXJ0cyB3aXRoIFwiZnVuY3Rpb24oKVwiXHJcblxyXG4gICAgICAvLyBDaHJvbWUsIEZpcmVmb3g6IFwiW3dvZmN0Tm1dKCl7Li4ufVwiLCBTYWZhcmk6IFwiZnVuY3Rpb24gW3dvZmN0Tm1dKCl7Li4ufVwiXHJcbiAgICAgIC8vIHdlIG5lZWQgYW4gYW5vbnltb3VzIGZ1bmN0aW9uOiBcImZ1bmN0aW9uKCkgey4uLn1cIlxyXG4gICAgICBsZXQgcGlXb0ZjdFN0ciA9IHdvRmN0U3RyLnJlcGxhY2UoL15mdW5jdGlvbiArLywgJycpO1xyXG5cclxuICAgICAgaWYoV29ya2VySGVscGVyLkRFQlVHKXtcclxuICAgICAgICBjb25zb2xlLmluZm8oXCJXb3JrZXIgcGxhdGZvcm0gaW5kZXBlbmRlbnQgZnVuY3Rpb24gc3RyaW5nOlwiKVxyXG4gICAgICAgIGNvbnNvbGUuaW5mbyhwaVdvRmN0U3RyKVxyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBDb252ZXJ0IHRvIGFub255bW91cyBmdW5jdGlvblxyXG4gICAgICBsZXQgYW5vbldvRmN0U3RyID0gcGlXb0ZjdFN0ci5yZXBsYWNlKHdvRmN0Tm0gKyAnKCknLCAnZnVuY3Rpb24oKScpXHJcbiAgICAgIGlmKFdvcmtlckhlbHBlci5ERUJVRyl7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiV29ya2VyIGFub255bW91cyBmdW5jdGlvbiBzdHJpbmc6XCIpXHJcbiAgICAgICAgY29uc29sZS5pbmZvKHBpV29GY3RTdHIpXHJcbiAgICAgIH1cclxuICAgICAgLy8gU2VsZiBleGVjdXRpbmdcclxuICAgICAgbGV0IHdzID0gJygnICsgYW5vbldvRmN0U3RyICsgJykoKTsnXHJcbiAgICAgIGlmKFdvcmtlckhlbHBlci5ERUJVRyl7XHJcbiAgICAgICAgY29uc29sZS5pbmZvKFwiV29ya2VyIHNlbGYgZXhlY3V0aW5nIGFub255bW91cyBmdW5jdGlvbiBzdHJpbmc6XCIpXHJcbiAgICAgICAgY29uc29sZS5pbmZvKGFub25Xb0ZjdFN0cilcclxuICAgICAgfVxyXG4gICAgICAvLyBCdWlsZCB0aGUgd29ya2VyIGJsb2JcclxuICAgICAgbGV0IHdiID0gbmV3IEJsb2IoW3dzXSwge3R5cGU6ICd0ZXh0L2phdmFzY3JpcHQnfSk7XHJcblxyXG4gICAgICBsZXQgd29ya2VyQmxvYlVybD13aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCh3Yik7XHJcbiAgICAgIHJldHVybiB3b3JrZXJCbG9iVXJsO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZXhwb3J0IGNsYXNzIEVycm9ySGVscGVye1xyXG5cclxuICAgIHN0YXRpYyBtZXNzYWdlRnJvbUVycm9yKGVycm9yOmFueSk6c3RyaW5nfG51bGx7XHJcbiAgICAgICAgbGV0IG1zZz1udWxsO1xyXG4gICAgICAgIGlmKGVycm9yIGluc3RhbmNlb2YgRXJyb3Ipe1xyXG4gICAgICAgICAgbXNnPWVycm9yLm1lc3NhZ2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBtc2c7XHJcbiAgICB9XHJcblxyXG4gICAgc3RhdGljIG1lc3NhZ2VGcm9tRXJyb3JOb25OdWxsKGVycm9yOmFueSk6c3RyaW5ne1xyXG4gICAgICBsZXQgbXNnPScnO1xyXG4gICAgICBjb25zdCBtc2dOdWxsYWJsZT1FcnJvckhlbHBlci5tZXNzYWdlRnJvbUVycm9yKGVycm9yKTtcclxuICAgICAgaWYobXNnTnVsbGFibGUhPW51bGwpe1xyXG4gICAgICAgIG1zZz1tc2dOdWxsYWJsZTtcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbXNnO1xyXG4gICAgfVxyXG5cclxuICAgIHN0YXRpYyBtZXNzYWdlKGJhc2VNZXNzYWdlOnN0cmluZyxlcnJvcjphbnkpOnN0cmluZ3tcclxuICAgICAgbGV0IG1zZz1iYXNlTWVzc2FnZTtcclxuICAgICAgaWYoZXJyb3IgaW5zdGFuY2VvZiBFcnJvcil7XHJcbiAgICAgICAgbXNnPWJhc2VNZXNzYWdlKyc6ICcrZXJyb3IubWVzc2FnZTtcclxuICAgICAgfWVsc2V7XHJcbiAgICAgICAgbXNnPWJhc2VNZXNzYWdlKycuJztcclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gbXNnO1xyXG4gICAgfVxyXG5cclxuICB9XHJcbiJdfQ==
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
import { BehaviorSubject } from "rxjs";
|
|
2
|
-
import { WAKE_LOCK_VIDEO_MP4_URI } from "./wake_lock_media";
|
|
3
|
-
import { Browser, UserAgentBuilder } from "./ua-parser";
|
|
4
|
-
/**
|
|
5
|
-
* Utility to prevent devices from screen lock.
|
|
6
|
-
* If supported uses the HTML5 wake lock API, if not, plays an invisible video.
|
|
7
|
-
*
|
|
8
|
-
* Note: I've used the GitHub project richtr/nosleep.js for that. The worked in most cases, but failed sometimes on an
|
|
9
|
-
* Android smartphone.
|
|
10
|
-
*/
|
|
11
|
-
export class WakeLockManager {
|
|
12
|
-
get behaviorSubject() {
|
|
13
|
-
return this._behaviorSubject;
|
|
14
|
-
}
|
|
15
|
-
constructor() {
|
|
16
|
-
this.wakeLockApiSupported = false;
|
|
17
|
-
this.wakeLockRetryCount = 0;
|
|
18
|
-
this.randomSeekRequired = false;
|
|
19
|
-
this._behaviorSubject = new BehaviorSubject(false);
|
|
20
|
-
this.VIDEO_LENGTH = 10;
|
|
21
|
-
this.wakeLockApiSupported = ('wakeLock' in navigator);
|
|
22
|
-
console.debug("Wake lock API supported: " + this.wakeLockApiSupported);
|
|
23
|
-
this.userAgent = UserAgentBuilder.userAgent();
|
|
24
|
-
this.randomSeekRequired = (this.userAgent?.detectedBrowser === Browser.Safari);
|
|
25
|
-
}
|
|
26
|
-
enableWakeLock() {
|
|
27
|
-
if (this.wakeLockApiSupported) {
|
|
28
|
-
//@ts-ignore
|
|
29
|
-
navigator.wakeLock.request('screen').then((wls) => {
|
|
30
|
-
this.wakeLockSentinel = wls;
|
|
31
|
-
this.wakeLockRetryCount = 0;
|
|
32
|
-
console.debug('Wake lock screen request successful.');
|
|
33
|
-
this._behaviorSubject.next(true);
|
|
34
|
-
}).catch((reason) => {
|
|
35
|
-
console.error('Wakelock failed: ' + reason);
|
|
36
|
-
this._behaviorSubject.error(reason);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
else {
|
|
40
|
-
if (!this.mp4VideoElement) {
|
|
41
|
-
this.mp4VideoElement = document.createElement('video');
|
|
42
|
-
this.mp4VideoElement.loop = !this.randomSeekRequired;
|
|
43
|
-
this.mp4VideoElement.playsInline = true;
|
|
44
|
-
this.mp4VideoElement.src = WAKE_LOCK_VIDEO_MP4_URI;
|
|
45
|
-
this.mp4VideoElement.addEventListener('play', (ev) => {
|
|
46
|
-
console.debug('Wake lock video playing...');
|
|
47
|
-
this._behaviorSubject.next(true);
|
|
48
|
-
});
|
|
49
|
-
this.mp4VideoElement.addEventListener('ended', (ev) => {
|
|
50
|
-
console.debug('Wake lock video ended.');
|
|
51
|
-
this._behaviorSubject.next(false);
|
|
52
|
-
});
|
|
53
|
-
this.mp4VideoElement.addEventListener('pause', (ev) => {
|
|
54
|
-
console.debug('Wake lock video pause.');
|
|
55
|
-
this._behaviorSubject.next(false);
|
|
56
|
-
});
|
|
57
|
-
if (this.randomSeekRequired) {
|
|
58
|
-
this.mp4VideoElement.addEventListener('timeupdate', (ev) => {
|
|
59
|
-
if (this.randomSeekRequired && this.mp4VideoElement) {
|
|
60
|
-
let thirdVideoLen = this.VIDEO_LENGTH / 3;
|
|
61
|
-
if (this.mp4VideoElement.currentTime > thirdVideoLen * 2) {
|
|
62
|
-
let newPos = (thirdVideoLen * Math.random());
|
|
63
|
-
//console.debug('Wake lock random seek to '+newPos+'s');
|
|
64
|
-
this.mp4VideoElement.currentTime = newPos;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
this.mp4VideoElement.addEventListener('error', (ev) => {
|
|
70
|
-
console.debug('Wake lock video error: ' + ev.message);
|
|
71
|
-
this._behaviorSubject.error(ev.error);
|
|
72
|
-
});
|
|
73
|
-
console.debug('Added listeners to wake lock video.');
|
|
74
|
-
}
|
|
75
|
-
this.startWakeLockVideo();
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
startWakeLockVideo() {
|
|
79
|
-
if (this.mp4VideoElement) {
|
|
80
|
-
this.mp4VideoElement.play().then(() => {
|
|
81
|
-
this.wakeLockRetryCount = 0;
|
|
82
|
-
}).catch((err) => {
|
|
83
|
-
console.debug('Failed starting wake lock video!');
|
|
84
|
-
if (this.wakeLockRetryCount < 1) {
|
|
85
|
-
window.setTimeout(() => {
|
|
86
|
-
this.wakeLockRetryCount++;
|
|
87
|
-
console.debug('Retry wake lock video #' + this.wakeLockRetryCount);
|
|
88
|
-
this.startWakeLockVideo();
|
|
89
|
-
}, 4000);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
console.debug('Giving up to try to start wake lock video.');
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
disableWakeLock() {
|
|
98
|
-
if (this.wakeLockApiSupported) {
|
|
99
|
-
this.wakeLockSentinel.release().then(() => {
|
|
100
|
-
console.debug('Wake lock release successful.');
|
|
101
|
-
this._behaviorSubject.next(false);
|
|
102
|
-
}).catch((reason) => {
|
|
103
|
-
console.error('Wakelock release failed: ' + reason);
|
|
104
|
-
this._behaviorSubject.error(reason);
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
if (this.mp4VideoElement) {
|
|
109
|
-
this.mp4VideoElement.pause();
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2FrZV9sb2NrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL3V0aWxzL3dha2VfbG9jay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFELE9BQU8sRUFBQyxPQUFPLEVBQWEsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFakU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUIsSUFBSSxlQUFlO1FBQ2pCLE9BQU8sSUFBSSxDQUFDLGdCQUFnQixDQUFDO0lBQy9CLENBQUM7SUFjRDtRQVRRLHlCQUFvQixHQUFDLEtBQUssQ0FBQztRQUMzQix1QkFBa0IsR0FBQyxDQUFDLENBQUM7UUFFckIsdUJBQWtCLEdBQUMsS0FBSyxDQUFDO1FBRXpCLHFCQUFnQixHQUEwQixJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVyRSxpQkFBWSxHQUFDLEVBQUUsQ0FBQztRQUcvQixJQUFJLENBQUMsb0JBQW9CLEdBQUMsQ0FBQyxVQUFVLElBQUksU0FBUyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsR0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsU0FBUyxHQUFDLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQzVDLElBQUksQ0FBQyxrQkFBa0IsR0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsZUFBZSxLQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBRUQsY0FBYztRQUNWLElBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7WUFDM0IsWUFBWTtZQUNaLFNBQVMsQ0FB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QUFDLG9CQUFvQixFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFFLEVBQUU7Z0JBQ3ZDLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQztnQkFDL0MsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNwQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFVLEVBQUMsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsR0FBQyxNQUFNLENBQUMsQ0FBQTtnQkFDakQsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNQLENBQUM7YUFBSyxDQUFDO1lBQ0wsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7Z0JBQ3pCLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDL0IsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBRUYiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0JlaGF2aW9yU3ViamVjdH0gZnJvbSBcInJ4anNcIjtcclxuaW1wb3J0IHtXQUtFX0xPQ0tfVklERU9fTVA0X1VSSX0gZnJvbSBcIi4vd2FrZV9sb2NrX21lZGlhXCI7XHJcbmltcG9ydCB7QnJvd3NlciwgVXNlckFnZW50LCBVc2VyQWdlbnRCdWlsZGVyfSBmcm9tIFwiLi91YS1wYXJzZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBVdGlsaXR5IHRvIHByZXZlbnQgZGV2aWNlcyBmcm9tIHNjcmVlbiBsb2NrLlxyXG4gKiBJZiBzdXBwb3J0ZWQgdXNlcyB0aGUgSFRNTDUgd2FrZSBsb2NrIEFQSSwgaWYgbm90LCBwbGF5cyBhbiBpbnZpc2libGUgdmlkZW8uXHJcbiAqXHJcbiAqIE5vdGU6IEkndmUgdXNlZCB0aGUgR2l0SHViIHByb2plY3QgcmljaHRyL25vc2xlZXAuanMgZm9yIHRoYXQuIFRoZSB3b3JrZWQgaW4gbW9zdCBjYXNlcywgYnV0IGZhaWxlZCBzb21ldGltZXMgb24gYW5cclxuICogICBBbmRyb2lkIHNtYXJ0cGhvbmUuXHJcbiAqL1xyXG5leHBvcnQgY2xhc3MgV2FrZUxvY2tNYW5hZ2VyIHtcclxuICBnZXQgYmVoYXZpb3JTdWJqZWN0KCk6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiB7XHJcbiAgICByZXR1cm4gdGhpcy5fYmVoYXZpb3JTdWJqZWN0O1xyXG4gIH1cclxuXHJcbiAgLy8gQHRzLWlnbm9yZVxyXG4gIHByaXZhdGUgd2FrZUxvY2tTZW50aW5lbDpXYWtlTG9ja1NlbnRpbmVsO1xyXG4gIHByaXZhdGUgbXA0VmlkZW9FbGVtZW50PzpIVE1MVmlkZW9FbGVtZW50O1xyXG4gIHByaXZhdGUgd2FrZUxvY2tBcGlTdXBwb3J0ZWQ9ZmFsc2U7XHJcbiAgcHJpdmF0ZSB3YWtlTG9ja1JldHJ5Q291bnQ9MDtcclxuICBwcml2YXRlIHVzZXJBZ2VudD86VXNlckFnZW50O1xyXG4gIHByaXZhdGUgcmFuZG9tU2Vla1JlcXVpcmVkPWZhbHNlO1xyXG5cclxuICBwcml2YXRlIF9iZWhhdmlvclN1YmplY3Q6QmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+PW5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IFZJREVPX0xFTkdUSD0xMDtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICB0aGlzLndha2VMb2NrQXBpU3VwcG9ydGVkPSgnd2FrZUxvY2snIGluIG5hdmlnYXRvcik7XHJcbiAgICBjb25zb2xlLmRlYnVnKFwiV2FrZSBsb2NrIEFQSSBzdXBwb3J0ZWQ6IFwiK3RoaXMud2FrZUxvY2tBcGlTdXBwb3J0ZWQpO1xyXG4gICAgdGhpcy51c2VyQWdlbnQ9VXNlckFnZW50QnVpbGRlci51c2VyQWdlbnQoKTtcclxuICAgIHRoaXMucmFuZG9tU2Vla1JlcXVpcmVkPSh0aGlzLnVzZXJBZ2VudD8uZGV0ZWN0ZWRCcm93c2VyPT09QnJvd3Nlci5TYWZhcmkpO1xyXG4gIH1cclxuXHJcbiAgZW5hYmxlV2FrZUxvY2soKXtcclxuICAgICAgaWYodGhpcy53YWtlTG9ja0FwaVN1cHBvcnRlZCkge1xyXG4gICAgICAgICAgLy9AdHMtaWdub3JlXHJcbiAgICAgICAgICBuYXZpZ2F0b3Iud2FrZUxvY2sucmVxdWVzdCgnc2NyZWVuJykudGhlbigod2xzKT0+e1xyXG4gICAgICAgICAgICB0aGlzLndha2VMb2NrU2VudGluZWw9d2xzO1xyXG4gICAgICAgICAgICB0aGlzLndha2VMb2NrUmV0cnlDb3VudD0wO1xyXG4gICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdXYWtlIGxvY2sgc2NyZWVuIHJlcXVlc3Qgc3VjY2Vzc2Z1bC4nKTtcclxuICAgICAgICAgICAgdGhpcy5fYmVoYXZpb3JTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB9KS5jYXRjaCgocmVhc29uOmFueSk9PntcclxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignV2FrZWxvY2sgZmFpbGVkOiAnK3JlYXNvbilcclxuICAgICAgICAgICAgdGhpcy5fYmVoYXZpb3JTdWJqZWN0LmVycm9yKHJlYXNvbik7XHJcblxyXG4gICAgICAgICAgfSk7XHJcblxyXG4gICAgICB9ZWxzZSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm1wNFZpZGVvRWxlbWVudCkge1xyXG4gICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2aWRlbycpO1xyXG5cclxuICAgICAgICAgIHRoaXMubXA0VmlkZW9FbGVtZW50Lmxvb3AgPSAhdGhpcy5yYW5kb21TZWVrUmVxdWlyZWQ7XHJcbiAgICAgICAgICB0aGlzLm1wNFZpZGVvRWxlbWVudC5wbGF5c0lubGluZSA9IHRydWU7XHJcblxyXG4gICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQuc3JjPVdBS0VfTE9DS19WSURFT19NUDRfVVJJO1xyXG5cclxuICAgICAgICAgIHRoaXMubXA0VmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3BsYXknLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnV2FrZSBsb2NrIHZpZGVvIHBsYXlpbmcuLi4nKTtcclxuICAgICAgICAgICAgdGhpcy5fYmVoYXZpb3JTdWJqZWN0Lm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignZW5kZWQnLCAoZXYpID0+IHtcclxuICAgICAgICAgICAgY29uc29sZS5kZWJ1ZygnV2FrZSBsb2NrIHZpZGVvIGVuZGVkLicpO1xyXG4gICAgICAgICAgICB0aGlzLl9iZWhhdmlvclN1YmplY3QubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICB9KVxyXG4gICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigncGF1c2UnLCAoZXYpID0+IHtcclxuXHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1dha2UgbG9jayB2aWRlbyBwYXVzZS4nKTtcclxuICAgICAgICAgICAgdGhpcy5fYmVoYXZpb3JTdWJqZWN0Lm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgfSlcclxuICAgICAgICAgIGlmKHRoaXMucmFuZG9tU2Vla1JlcXVpcmVkKXtcclxuICAgICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGltZXVwZGF0ZScsIChldikgPT4ge1xyXG4gICAgICAgICAgICAgIGlmKHRoaXMucmFuZG9tU2Vla1JlcXVpcmVkICYmIHRoaXMubXA0VmlkZW9FbGVtZW50KSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdGhpcmRWaWRlb0xlbj10aGlzLlZJREVPX0xFTkdUSC8zO1xyXG4gICAgICAgICAgICAgICBpZiAodGhpcy5tcDRWaWRlb0VsZW1lbnQuY3VycmVudFRpbWUgPiB0aGlyZFZpZGVvTGVuKjIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3UG9zPSh0aGlyZFZpZGVvTGVuKk1hdGgucmFuZG9tKCkpO1xyXG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5kZWJ1ZygnV2FrZSBsb2NrIHJhbmRvbSBzZWVrIHRvICcrbmV3UG9zKydzJyk7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tcDRWaWRlb0VsZW1lbnQuY3VycmVudFRpbWU9bmV3UG9zO1xyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHRoaXMubXA0VmlkZW9FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgKGV2KSA9PiB7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1dha2UgbG9jayB2aWRlbyBlcnJvcjogJytldi5tZXNzYWdlKTtcclxuICAgICAgICAgICAgdGhpcy5fYmVoYXZpb3JTdWJqZWN0LmVycm9yKGV2LmVycm9yKTtcclxuICAgICAgICAgIH0pXHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdBZGRlZCBsaXN0ZW5lcnMgdG8gd2FrZSBsb2NrIHZpZGVvLicpO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnN0YXJ0V2FrZUxvY2tWaWRlbygpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gIHByaXZhdGUgc3RhcnRXYWtlTG9ja1ZpZGVvKCl7XHJcbiAgICBpZih0aGlzLm1wNFZpZGVvRWxlbWVudCl7XHJcbiAgICAgIHRoaXMubXA0VmlkZW9FbGVtZW50LnBsYXkoKS50aGVuKCgpPT57XHJcbiAgICAgICAgdGhpcy53YWtlTG9ja1JldHJ5Q291bnQ9MDtcclxuICAgICAgfSkuY2F0Y2goKGVycik9PiB7XHJcbiAgICAgICAgY29uc29sZS5kZWJ1ZygnRmFpbGVkIHN0YXJ0aW5nIHdha2UgbG9jayB2aWRlbyEnKTtcclxuICAgICAgICBpZiAodGhpcy53YWtlTG9ja1JldHJ5Q291bnQgPCAxKSB7XHJcbiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgIHRoaXMud2FrZUxvY2tSZXRyeUNvdW50Kys7XHJcbiAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1JldHJ5IHdha2UgbG9jayB2aWRlbyAjJyArIHRoaXMud2FrZUxvY2tSZXRyeUNvdW50KTtcclxuICAgICAgICAgICAgdGhpcy5zdGFydFdha2VMb2NrVmlkZW8oKTtcclxuICAgICAgICAgIH0sIDQwMDApXHJcbiAgICAgICAgfWVsc2V7XHJcbiAgICAgICAgICBjb25zb2xlLmRlYnVnKCdHaXZpbmcgdXAgdG8gdHJ5IHRvIHN0YXJ0IHdha2UgbG9jayB2aWRlby4nKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGRpc2FibGVXYWtlTG9jaygpe1xyXG4gICAgaWYodGhpcy53YWtlTG9ja0FwaVN1cHBvcnRlZCkge1xyXG4gICAgICAgIHRoaXMud2FrZUxvY2tTZW50aW5lbC5yZWxlYXNlKCkudGhlbigoKT0+e1xyXG4gICAgICAgICAgY29uc29sZS5kZWJ1ZygnV2FrZSBsb2NrIHJlbGVhc2Ugc3VjY2Vzc2Z1bC4nKTtcclxuICAgICAgICAgIHRoaXMuX2JlaGF2aW9yU3ViamVjdC5uZXh0KGZhbHNlKTtcclxuICAgICAgICB9KS5jYXRjaCgocmVhc29uOmFueSk9PntcclxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1dha2Vsb2NrIHJlbGVhc2UgZmFpbGVkOiAnK3JlYXNvbilcclxuICAgICAgICAgIHRoaXMuX2JlaGF2aW9yU3ViamVjdC5lcnJvcihyZWFzb24pO1xyXG4gICAgICAgIH0pO1xyXG4gICAgfWVsc2Uge1xyXG4gICAgICBpZiAodGhpcy5tcDRWaWRlb0VsZW1lbnQpIHtcclxuICAgICAgICB0aGlzLm1wNFZpZGVvRWxlbWVudC5wYXVzZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG4iXX0=
|