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,19 +0,0 @@
|
|
|
1
|
-
export class Point {
|
|
2
|
-
constructor(_x, _y) {
|
|
3
|
-
this._x = _x;
|
|
4
|
-
this._y = _y;
|
|
5
|
-
}
|
|
6
|
-
get x() {
|
|
7
|
-
return this._x;
|
|
8
|
-
}
|
|
9
|
-
get y() {
|
|
10
|
-
return this._y;
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
export class Marker {
|
|
14
|
-
constructor() {
|
|
15
|
-
this.name = null;
|
|
16
|
-
this.framePosition = null;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sS0FBSztJQUNkLFlBQW9CLEVBQVMsRUFBUyxFQUFTO1FBQTNCLE9BQUUsR0FBRixFQUFFLENBQU87UUFBUyxPQUFFLEdBQUYsRUFBRSxDQUFPO0lBQy9DLENBQUM7SUFDRCxJQUFJLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUNELElBQUksQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNuQixDQUFDO0NBQ0o7QUFDRCxNQUFNLE9BQU8sTUFBTTtJQUFuQjtRQUNJLFNBQUksR0FBYyxJQUFJLENBQUM7UUFDdkIsa0JBQWEsR0FBYyxJQUFJLENBQUM7SUFFcEMsQ0FBQztDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbiAgICBleHBvcnQgY2xhc3MgUG9pbnQge1xyXG4gICAgICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX3g6bnVtYmVyLHByaXZhdGUgX3k6bnVtYmVyKSB7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGdldCB4KCk6bnVtYmVye1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5feDtcclxuICAgICAgICB9XHJcbiAgICAgICAgZ2V0IHkoKTpudW1iZXJ7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl95O1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGV4cG9ydCBjbGFzcyBNYXJrZXIge1xyXG4gICAgICAgIG5hbWU6IHN0cmluZ3xudWxsPW51bGw7XHJcbiAgICAgICAgZnJhbWVQb3NpdGlvbjogbnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICB9XHJcblxyXG5cclxuIl19
|
|
@@ -1,414 +0,0 @@
|
|
|
1
|
-
import { HostListener, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { AudioSignal } from './audiosignal';
|
|
3
|
-
import { Sonagram } from './sonagram';
|
|
4
|
-
import { Point } from './common';
|
|
5
|
-
import { Component, ViewChild } from '@angular/core';
|
|
6
|
-
import { Position, Dimension, Rectangle } from "../../math/2d/geometry";
|
|
7
|
-
import { BasicAudioCanvasLayerComponent } from "./audio_canvas_layer_comp";
|
|
8
|
-
import * as i0 from "@angular/core";
|
|
9
|
-
import * as i1 from "./audiosignal";
|
|
10
|
-
import * as i2 from "./sonagram";
|
|
11
|
-
/*
|
|
12
|
-
ResizeObserver not yet available in official Typescript declaration
|
|
13
|
-
Crreated declaration from IDL until its available.
|
|
14
|
-
See specs:
|
|
15
|
-
https://www.w3.org/TR/resize-observer
|
|
16
|
-
|
|
17
|
-
*/
|
|
18
|
-
// interface ResizeObserverSize {
|
|
19
|
-
// readonly inlineSize:number;
|
|
20
|
-
// readonly blockSize:number;
|
|
21
|
-
// }
|
|
22
|
-
//
|
|
23
|
-
// declare interface ResizeObserverEntry{
|
|
24
|
-
// readonly target: Element;
|
|
25
|
-
// readonly contentRect: DOMRectReadOnly ;
|
|
26
|
-
// readonly borderBoxSize: Array<ResizeObserverSize> ;
|
|
27
|
-
// readonly contentBoxSize: Array<ResizeObserverSize> ;
|
|
28
|
-
// readonly devicePixelContentBoxSize: Array<ResizeObserverSize> ;
|
|
29
|
-
// }
|
|
30
|
-
//
|
|
31
|
-
// declare interface ResizeObserverCallback {
|
|
32
|
-
// (entries: Array<ResizeObserverEntry>, observer: ResizeObserver):void;
|
|
33
|
-
// }
|
|
34
|
-
//
|
|
35
|
-
// declare enum ResizeObserverBoxOptions {
|
|
36
|
-
// "border-box", "content-box", "device-pixel-content-box"
|
|
37
|
-
// };
|
|
38
|
-
// // Declare Resizeobserver
|
|
39
|
-
// declare class ResizeObserver{
|
|
40
|
-
// constructor(callback: ResizeObserverCallback);
|
|
41
|
-
// observe: (el:Element,opts: ResizeObserverBoxOptions | null)=>void;
|
|
42
|
-
// unobserve: (el:Element)=>void;
|
|
43
|
-
// disconnect: ()=>void;
|
|
44
|
-
// }
|
|
45
|
-
/*
|
|
46
|
-
* Container component for audio display.
|
|
47
|
-
* The display elements are children of a virtual canvas. The virtual canvas makes it possible to have high zoom factors with very wide virtual audio displays.
|
|
48
|
-
* Only the visible part of the virtual canvas is implemented as a browser canvas and therefore consuming memory.
|
|
49
|
-
* The visible part has the same width as the viewport of the scroll pane parent.
|
|
50
|
-
* The virtual canvas itself is implemented as an HTML div element.
|
|
51
|
-
* The layout of the component is updated on resize of the parent or changes of the zoom factor.
|
|
52
|
-
*/
|
|
53
|
-
export class AudioClipUIContainer extends BasicAudioCanvasLayerComponent {
|
|
54
|
-
static { this.DIVIDER_PIXEL_SIZE = 10; }
|
|
55
|
-
get xZoom() {
|
|
56
|
-
return this._xZoom;
|
|
57
|
-
}
|
|
58
|
-
set xZoom(value) {
|
|
59
|
-
this.userAction = true;
|
|
60
|
-
this._xZoom = value;
|
|
61
|
-
this.layout();
|
|
62
|
-
this.userAction = false;
|
|
63
|
-
}
|
|
64
|
-
set fixFitToPanel(value) {
|
|
65
|
-
this._fixFitToPanel = value;
|
|
66
|
-
if (value) {
|
|
67
|
-
// we don't need clip bounds
|
|
68
|
-
this.bounds = null;
|
|
69
|
-
this._xZoom = null;
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
// hold current zoom value
|
|
73
|
-
//this._xZoom=this.ce.offsetWidth/this._audioData.duration;
|
|
74
|
-
}
|
|
75
|
-
this.layout();
|
|
76
|
-
}
|
|
77
|
-
constructor(ref) {
|
|
78
|
-
super();
|
|
79
|
-
this.ref = ref;
|
|
80
|
-
this._audioClip = null;
|
|
81
|
-
this.pointer = null;
|
|
82
|
-
this.selecting = null;
|
|
83
|
-
this.selection = null;
|
|
84
|
-
this.selectionEventEmitter = new EventEmitter();
|
|
85
|
-
this._playFramePosition = null;
|
|
86
|
-
this.dragStartMouseY = null;
|
|
87
|
-
this.dragStartY = null;
|
|
88
|
-
this.dividerPosition = 0.5;
|
|
89
|
-
this.userAction = false;
|
|
90
|
-
this._xZoom = null; // pixels per second
|
|
91
|
-
// if true the complete audio file is shown, the display fits to the visible panel, the x-zoom factor is variable, this is the default
|
|
92
|
-
this._fixFitToPanel = true;
|
|
93
|
-
this.parentE = this.ref.nativeElement;
|
|
94
|
-
}
|
|
95
|
-
ngOnInit() {
|
|
96
|
-
this.ce = this.ceRef.nativeElement;
|
|
97
|
-
this.dc = this.canvasRef.nativeElement;
|
|
98
|
-
}
|
|
99
|
-
ngAfterViewInit() {
|
|
100
|
-
this.layout();
|
|
101
|
-
const heightListener = new MutationObserver((mrs, mo) => {
|
|
102
|
-
let layout = false;
|
|
103
|
-
mrs.forEach((mr) => {
|
|
104
|
-
if (!this.userAction && 'attributes' === mr.type && ('class' === mr.attributeName || 'style' === mr.attributeName)) {
|
|
105
|
-
layout = true;
|
|
106
|
-
}
|
|
107
|
-
});
|
|
108
|
-
if (layout) {
|
|
109
|
-
// re-layout required
|
|
110
|
-
this.layout(false);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
heightListener.observe(this.ce, { attributes: true, childList: true, characterData: true });
|
|
114
|
-
heightListener.observe(this.dc, { attributes: true, childList: true, characterData: true });
|
|
115
|
-
const resizeObserver = new ResizeObserver((entries, obs) => {
|
|
116
|
-
//console.log("Resize observed:");
|
|
117
|
-
entries.forEach((e) => {
|
|
118
|
-
//console.log(e.contentRect.width+"x"+e.contentRect.height);
|
|
119
|
-
this.layout();
|
|
120
|
-
});
|
|
121
|
-
});
|
|
122
|
-
resizeObserver.observe(this.ce);
|
|
123
|
-
}
|
|
124
|
-
onResize(event) {
|
|
125
|
-
this.layout();
|
|
126
|
-
}
|
|
127
|
-
mouseover(me) {
|
|
128
|
-
this.dividerCursorPosition(me, true);
|
|
129
|
-
}
|
|
130
|
-
mouseleave(me) {
|
|
131
|
-
this.dividerCursorPosition(me, false);
|
|
132
|
-
}
|
|
133
|
-
mousedown(me) {
|
|
134
|
-
this.dragStartMouseY = me.clientY;
|
|
135
|
-
this.dragStartY = this.dc.offsetTop;
|
|
136
|
-
this.dragStartMouseY = me.clientY;
|
|
137
|
-
}
|
|
138
|
-
onMouseup(me) {
|
|
139
|
-
if (this.dragStartY != null) {
|
|
140
|
-
this.userAction = true;
|
|
141
|
-
this.dividerDrag(me);
|
|
142
|
-
this.layout(false);
|
|
143
|
-
this.dragStartY = null;
|
|
144
|
-
this.userAction = false;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
onMousemove(me) {
|
|
148
|
-
if (this.dragStartY != null) {
|
|
149
|
-
this.userAction = true;
|
|
150
|
-
this.dividerDrag(me);
|
|
151
|
-
this.layoutScaled();
|
|
152
|
-
this.userAction = true;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
pointerPositionChanged(pp) {
|
|
156
|
-
this.pointer = pp;
|
|
157
|
-
}
|
|
158
|
-
selectingChanged(s) {
|
|
159
|
-
this.selecting = s;
|
|
160
|
-
}
|
|
161
|
-
selectionChanged(s) {
|
|
162
|
-
this.selection = s;
|
|
163
|
-
if (this._audioClip) {
|
|
164
|
-
this._audioClip.selection = s;
|
|
165
|
-
}
|
|
166
|
-
this.selectionEventEmitter.emit(this.selection);
|
|
167
|
-
}
|
|
168
|
-
canvasMousePos(c, e) {
|
|
169
|
-
const cr = c.getBoundingClientRect();
|
|
170
|
-
const x = e.x - cr.left;
|
|
171
|
-
const y = e.y - cr.top;
|
|
172
|
-
return new Point(x, y);
|
|
173
|
-
}
|
|
174
|
-
dividerCursorPosition(e, show) {
|
|
175
|
-
if (this.dc) {
|
|
176
|
-
this.canvasMousePos(this.dc, e);
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
dividerDrag(e) {
|
|
180
|
-
if (this.dc && this.dragStartMouseY && this.dragStartY) {
|
|
181
|
-
const dragOffset = e.clientY - this.dragStartMouseY;
|
|
182
|
-
const ceHeight = this.ce.offsetHeight;
|
|
183
|
-
let newTop = (this.dragStartY + dragOffset);
|
|
184
|
-
if (newTop < 0) {
|
|
185
|
-
newTop = 0;
|
|
186
|
-
}
|
|
187
|
-
if (newTop > ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {
|
|
188
|
-
newTop = ceHeight - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
|
|
189
|
-
}
|
|
190
|
-
this.dc.style.top = newTop.toString() + 'px';
|
|
191
|
-
this.dividerPosition = (this.dc.offsetTop + AudioClipUIContainer.DIVIDER_PIXEL_SIZE / 2) / ceHeight;
|
|
192
|
-
if (this.dividerPosition > 1.0) {
|
|
193
|
-
this.dividerPosition = 1.0;
|
|
194
|
-
}
|
|
195
|
-
if (this.dividerPosition < 0.0) {
|
|
196
|
-
this.dividerPosition = 0.0;
|
|
197
|
-
}
|
|
198
|
-
this.drawDivider();
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
drawDivider() {
|
|
202
|
-
const w = this.dc.width;
|
|
203
|
-
const h = this.dc.height;
|
|
204
|
-
const g = this.dc.getContext('2d');
|
|
205
|
-
if (g && w > 10 && h >= 1) {
|
|
206
|
-
g.fillStyle = 'white';
|
|
207
|
-
g.fillRect(0, 0, w, h);
|
|
208
|
-
g.fillStyle = 'black';
|
|
209
|
-
g.fillRect(5, 5, w - 10, 1);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
clipBounds(clipBounds) {
|
|
213
|
-
this.bounds = clipBounds;
|
|
214
|
-
this.layout();
|
|
215
|
-
}
|
|
216
|
-
currentXZoom() {
|
|
217
|
-
let xz = this._xZoom;
|
|
218
|
-
if (xz == null && this._audioDataHolder) {
|
|
219
|
-
let ow = this.ce.offsetWidth;
|
|
220
|
-
if (ow < 1) {
|
|
221
|
-
// at least one pixel width to avoid x-zoom zero values
|
|
222
|
-
ow = 1;
|
|
223
|
-
}
|
|
224
|
-
xz = ow / this._audioDataHolder.duration;
|
|
225
|
-
}
|
|
226
|
-
return xz;
|
|
227
|
-
}
|
|
228
|
-
_layout(clear, redraw) {
|
|
229
|
-
let ceBcr = this.ce.getBoundingClientRect();
|
|
230
|
-
const ceBcrIntW = Math.floor(ceBcr.width);
|
|
231
|
-
const ceBcrIntH = Math.floor(ceBcr.height);
|
|
232
|
-
// height available for plugins (audiosignal and sonagram)
|
|
233
|
-
let psH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
|
|
234
|
-
if (psH < 0) {
|
|
235
|
-
psH = 0;
|
|
236
|
-
}
|
|
237
|
-
// audio signal height
|
|
238
|
-
const asH = Math.round(psH * this.dividerPosition);
|
|
239
|
-
// sonagram height (rest: available height minus divider height minus audiosignal height)
|
|
240
|
-
let soH = ceBcrIntH - AudioClipUIContainer.DIVIDER_PIXEL_SIZE - asH;
|
|
241
|
-
if (soH < 0) {
|
|
242
|
-
soH = 0;
|
|
243
|
-
}
|
|
244
|
-
// sonagram top position
|
|
245
|
-
const soTop = asH + AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
|
|
246
|
-
// Visible bounds
|
|
247
|
-
// left position
|
|
248
|
-
let vbLeft = 0;
|
|
249
|
-
// width
|
|
250
|
-
let vbWidth = ceBcrIntW;
|
|
251
|
-
if (!this._fixFitToPanel && this.bounds) {
|
|
252
|
-
vbLeft = Math.round(this.bounds.position.left);
|
|
253
|
-
vbWidth = Math.round(this.bounds.dimension.width);
|
|
254
|
-
}
|
|
255
|
-
// Divider
|
|
256
|
-
// left position
|
|
257
|
-
let vbLeftStyl = vbLeft + 'px';
|
|
258
|
-
if (this.dc.style.left != vbLeftStyl) {
|
|
259
|
-
this.dc.style.left = vbLeftStyl;
|
|
260
|
-
}
|
|
261
|
-
// top position
|
|
262
|
-
//const dTop = asH;
|
|
263
|
-
const dTopStr = asH + 'px';
|
|
264
|
-
if (this.dc.style.top != dTopStr) {
|
|
265
|
-
this.dc.style.top = dTopStr;
|
|
266
|
-
}
|
|
267
|
-
// width
|
|
268
|
-
let vbWidthStyle = vbWidth + 'px';
|
|
269
|
-
if (this.dc.style.width != vbWidthStyle) {
|
|
270
|
-
this.dc.style.width = vbWidthStyle;
|
|
271
|
-
}
|
|
272
|
-
if (this.dc.width != vbWidth) {
|
|
273
|
-
this.dc.width = vbWidth;
|
|
274
|
-
}
|
|
275
|
-
// height
|
|
276
|
-
if (this.dc.height != AudioClipUIContainer.DIVIDER_PIXEL_SIZE) {
|
|
277
|
-
this.dc.height = AudioClipUIContainer.DIVIDER_PIXEL_SIZE;
|
|
278
|
-
}
|
|
279
|
-
let divPixelSizeStyle = AudioClipUIContainer.DIVIDER_PIXEL_SIZE.toString() + 'px';
|
|
280
|
-
if (this.dc.style.height != divPixelSizeStyle) {
|
|
281
|
-
this.dc.style.height = divPixelSizeStyle;
|
|
282
|
-
}
|
|
283
|
-
this.drawDivider();
|
|
284
|
-
// Virtual dimension, only width is used
|
|
285
|
-
let virtualDim = new Dimension(ceBcrIntW, 0);
|
|
286
|
-
// Visible bounds of container
|
|
287
|
-
let br = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, ceBcrIntH));
|
|
288
|
-
// Set container bounds
|
|
289
|
-
this.layoutBounds(br, virtualDim, false);
|
|
290
|
-
// Visible bounds of audiosignal
|
|
291
|
-
let asR = new Rectangle(new Position(vbLeft, 0), new Dimension(vbWidth, asH));
|
|
292
|
-
// Set audiosignal bounds
|
|
293
|
-
this.as.layoutBounds(asR, virtualDim, redraw, clear);
|
|
294
|
-
// Visible bounds of sonagram
|
|
295
|
-
let soR = new Rectangle(new Position(vbLeft, soTop), new Dimension(vbWidth, soH));
|
|
296
|
-
// Set sonagram bounds
|
|
297
|
-
this.so.layoutBounds(soR, virtualDim, redraw, clear);
|
|
298
|
-
}
|
|
299
|
-
layoutScaled() {
|
|
300
|
-
this._layout(false, false);
|
|
301
|
-
}
|
|
302
|
-
layout(clear = true) {
|
|
303
|
-
if (this.ce && this.dc) {
|
|
304
|
-
const clientW = this.ce.clientWidth;
|
|
305
|
-
if (this._audioDataHolder) {
|
|
306
|
-
if (this._fixFitToPanel) {
|
|
307
|
-
// Set the virtual canvas width to the visible width
|
|
308
|
-
if (this.ce.style.width != '100%') {
|
|
309
|
-
//console.log("set width to 100%");
|
|
310
|
-
this.ce.style.width = '100%';
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
else {
|
|
314
|
-
if (this._xZoom) {
|
|
315
|
-
// Set the virtual canvas width according to the value of the user selected xZoom value
|
|
316
|
-
const newClW = Math.round(this._xZoom * this._audioDataHolder?.duration);
|
|
317
|
-
this.ce.style.width = newClW + 'px';
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
// Set the virtual canvas width to the visible width only
|
|
321
|
-
this.ce.style.width = clientW + 'px';
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
this._layout(clear, true);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
set audioData(audioDataHolder) {
|
|
329
|
-
this._audioClip = null;
|
|
330
|
-
this._audioDataHolder = audioDataHolder;
|
|
331
|
-
this.as.setData(audioDataHolder);
|
|
332
|
-
this.so.setData(audioDataHolder);
|
|
333
|
-
this.layout();
|
|
334
|
-
}
|
|
335
|
-
get audioData() {
|
|
336
|
-
return this._audioDataHolder;
|
|
337
|
-
}
|
|
338
|
-
set audioClip(audioClip) {
|
|
339
|
-
this._audioClip = audioClip;
|
|
340
|
-
let audioData = null;
|
|
341
|
-
let sel = null;
|
|
342
|
-
if (audioClip) {
|
|
343
|
-
audioData = audioClip.audioDataHolder;
|
|
344
|
-
if (this._audioClip) {
|
|
345
|
-
this._audioClip.addSelectionObserver((clip) => {
|
|
346
|
-
this.selection = clip.selection;
|
|
347
|
-
});
|
|
348
|
-
}
|
|
349
|
-
sel = audioClip.selection;
|
|
350
|
-
}
|
|
351
|
-
this._audioDataHolder = audioData;
|
|
352
|
-
this.as.setData(this._audioDataHolder);
|
|
353
|
-
this.so.setData(this._audioDataHolder);
|
|
354
|
-
this.selecting = null;
|
|
355
|
-
this.selection = sel;
|
|
356
|
-
this.layout();
|
|
357
|
-
}
|
|
358
|
-
get playFramePosition() {
|
|
359
|
-
return this._playFramePosition;
|
|
360
|
-
}
|
|
361
|
-
set playFramePosition(playFramePosition) {
|
|
362
|
-
this._playFramePosition = playFramePosition;
|
|
363
|
-
this.as.playFramePosition = playFramePosition;
|
|
364
|
-
this.so.playFramePosition = playFramePosition;
|
|
365
|
-
}
|
|
366
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioClipUIContainer, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
367
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: AudioClipUIContainer, selector: "app-audio", inputs: { audioData: "audioData", audioClip: "audioClip" }, outputs: { selectionEventEmitter: "selectionEventEmitter" }, host: { listeners: { "window:resize": "onResize($event)", "document:mouseup": "onMouseup($event)", "document:mousemove": "onMousemove($event)" } }, viewQueries: [{ propertyName: "canvasRef", first: true, predicate: ["divider"], descendants: true, static: true }, { propertyName: "ceRef", first: true, predicate: ["virtualCanvas"], descendants: true, static: true }, { propertyName: "as", first: true, predicate: AudioSignal, descendants: true, static: true }, { propertyName: "so", first: true, predicate: Sonagram, descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
|
|
368
|
-
<div #virtualCanvas>
|
|
369
|
-
<canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
|
|
370
|
-
(mouseleave)="mouseleave($event)" height="10"></canvas>
|
|
371
|
-
<audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
|
|
372
|
-
<audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
|
|
373
|
-
</div>
|
|
374
|
-
`, isInline: true, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;z-index:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;z-index:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;z-index:1;transform:none}\n"], dependencies: [{ kind: "component", type: i1.AudioSignal, selector: "audio-signal" }, { kind: "component", type: i2.Sonagram, selector: "audio-sonagram" }] }); }
|
|
375
|
-
}
|
|
376
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AudioClipUIContainer, decorators: [{
|
|
377
|
-
type: Component,
|
|
378
|
-
args: [{ selector: 'app-audio', template: `
|
|
379
|
-
<div #virtualCanvas>
|
|
380
|
-
<canvas #divider (mousedown)="mousedown($event)" (mouseover)="mouseover($event)"
|
|
381
|
-
(mouseleave)="mouseleave($event)" height="10"></canvas>
|
|
382
|
-
<audio-signal [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-signal>
|
|
383
|
-
<audio-sonagram [pointerPosition]="pointer" [selecting]="selecting" [selection]="selection" (pointerPositionEventEmitter)="pointerPositionChanged($event)" (selectingEventEmitter)="selectingChanged($event)" (selectedEventEmitter)="selectionChanged($event)"></audio-sonagram>
|
|
384
|
-
</div>
|
|
385
|
-
`, styles: ["div{margin:0;padding:0;top:0;left:0;width:100%;height:100%;position:relative;box-sizing:border-box;transform:none;overflow:hidden}\n", "canvas{top:0;left:0;width:0;height:0;cursor:ns-resize;position:absolute;z-index:1;transform:none}\n", "audio-signal{top:0;left:0;position:absolute;z-index:1;transform:none}\n", "audio-sonagram{top:0;left:0;position:absolute;z-index:1;transform:none}\n"] }]
|
|
386
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { canvasRef: [{
|
|
387
|
-
type: ViewChild,
|
|
388
|
-
args: ['divider', { static: true }]
|
|
389
|
-
}], ceRef: [{
|
|
390
|
-
type: ViewChild,
|
|
391
|
-
args: ['virtualCanvas', { static: true }]
|
|
392
|
-
}], as: [{
|
|
393
|
-
type: ViewChild,
|
|
394
|
-
args: [AudioSignal, { static: true }]
|
|
395
|
-
}], so: [{
|
|
396
|
-
type: ViewChild,
|
|
397
|
-
args: [Sonagram, { static: true }]
|
|
398
|
-
}], selectionEventEmitter: [{
|
|
399
|
-
type: Output
|
|
400
|
-
}], onResize: [{
|
|
401
|
-
type: HostListener,
|
|
402
|
-
args: ['window:resize', ['$event']]
|
|
403
|
-
}], onMouseup: [{
|
|
404
|
-
type: HostListener,
|
|
405
|
-
args: ['document:mouseup', ['$event']]
|
|
406
|
-
}], onMousemove: [{
|
|
407
|
-
type: HostListener,
|
|
408
|
-
args: ['document:mousemove', ['$event']]
|
|
409
|
-
}], audioData: [{
|
|
410
|
-
type: Input
|
|
411
|
-
}], audioClip: [{
|
|
412
|
-
type: Input
|
|
413
|
-
}] } });
|
|
414
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2F1ZGlvL3VpL2NvbnRhaW5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ3NCLFlBQVksRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFDN0UsTUFBTSxlQUFlLENBQUE7QUFDdEIsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGVBQWUsQ0FBQTtBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ25DLE9BQU8sRUFBUyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUE7QUFFdEMsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFDLFFBQVEsRUFBQyxTQUFTLEVBQUUsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7Ozs7QUFHekU7Ozs7OztHQU1HO0FBRUgsaUNBQWlDO0FBQ2pDLGdDQUFnQztBQUNoQywrQkFBK0I7QUFDL0IsSUFBSTtBQUNKLEVBQUU7QUFDRix5Q0FBeUM7QUFDekMsOEJBQThCO0FBQzlCLDRDQUE0QztBQUM1Qyx3REFBd0Q7QUFDeEQseURBQXlEO0FBQ3pELG9FQUFvRTtBQUNwRSxJQUFJO0FBQ0osRUFBRTtBQUNGLDZDQUE2QztBQUM3QywwRUFBMEU7QUFDMUUsSUFBSTtBQUNKLEVBQUU7QUFDRiwwQ0FBMEM7QUFDMUMsNERBQTREO0FBQzVELEtBQUs7QUFFTCw0QkFBNEI7QUFDNUIsZ0NBQWdDO0FBQ2hDLG1EQUFtRDtBQUNuRCx1RUFBdUU7QUFDdkUsbUNBQW1DO0FBQ25DLDBCQUEwQjtBQUMxQixJQUFJO0FBRUo7Ozs7Ozs7R0FPRztBQStDSCxNQUFNLE9BQU8sb0JBQXFC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TUFBTSxFQUFFLElBQUksRUFBRTtnQkFJUSxLQUFLO3NCQUFsRCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBR0YsRUFBRTtzQkFBM0MsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNELEVBQUU7c0JBQXhDLFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFNM0IscUJBQXFCO3NCQUE5QixNQUFNO2dCQStFUCxRQUFRO3NCQURQLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDO2dCQW9CekMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk1QyxXQUFXO3NCQURWLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBc04xQyxTQUFTO3NCQURaLEtBQUs7Z0JBZUYsU0FBUztzQkFEWixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBFbGVtZW50UmVmLCBBZnRlclZpZXdJbml0LCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkluaXQsIE91dHB1dCwgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtBdWRpb1NpZ25hbH0gZnJvbSAnLi9hdWRpb3NpZ25hbCdcclxuaW1wb3J0IHtTb25hZ3JhbX0gZnJvbSAnLi9zb25hZ3JhbSdcclxuaW1wb3J0IHtNYXJrZXIsIFBvaW50fSBmcm9tICcuL2NvbW1vbidcclxuXHJcbmltcG9ydCB7Q29tcG9uZW50LCBWaWV3Q2hpbGR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1Bvc2l0aW9uLERpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvQ2xpcCxTZWxlY3Rpb259IGZyb20gXCIuLi9wZXJzaXN0b3JcIjtcclxuaW1wb3J0IHtCYXNpY0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnR9IGZyb20gXCIuL2F1ZGlvX2NhbnZhc19sYXllcl9jb21wXCI7XHJcbmltcG9ydCB7QXVkaW9EYXRhSG9sZGVyfSBmcm9tIFwiLi4vYXVkaW9fZGF0YV9ob2xkZXJcIjtcclxuXHJcbi8qXHJcbiAgUmVzaXplT2JzZXJ2ZXIgbm90IHlldCBhdmFpbGFibGUgaW4gb2ZmaWNpYWwgVHlwZXNjcmlwdCBkZWNsYXJhdGlvblxyXG4gIENycmVhdGVkIGRlY2xhcmF0aW9uIGZyb20gSURMIHVudGlsIGl0cyBhdmFpbGFibGUuXHJcbiAgU2VlIHNwZWNzOlxyXG4gIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9yZXNpemUtb2JzZXJ2ZXJcclxuXHJcbiAqL1xyXG5cclxuLy8gaW50ZXJmYWNlIFJlc2l6ZU9ic2VydmVyU2l6ZSB7XHJcbi8vICAgcmVhZG9ubHkgaW5saW5lU2l6ZTpudW1iZXI7XHJcbi8vICAgcmVhZG9ubHkgYmxvY2tTaXplOm51bWJlcjtcclxuLy8gfVxyXG4vL1xyXG4vLyBkZWNsYXJlIGludGVyZmFjZSBSZXNpemVPYnNlcnZlckVudHJ5e1xyXG4vLyAgIHJlYWRvbmx5IHRhcmdldDogRWxlbWVudDtcclxuLy8gICByZWFkb25seSBjb250ZW50UmVjdDogRE9NUmVjdFJlYWRPbmx5IDtcclxuLy8gICByZWFkb25seSBib3JkZXJCb3hTaXplOiBBcnJheTxSZXNpemVPYnNlcnZlclNpemU+IDtcclxuLy8gICByZWFkb25seSBjb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbi8vICAgcmVhZG9ubHkgZGV2aWNlUGl4ZWxDb250ZW50Qm94U2l6ZTogQXJyYXk8UmVzaXplT2JzZXJ2ZXJTaXplPiA7XHJcbi8vIH1cclxuLy9cclxuLy8gZGVjbGFyZSBpbnRlcmZhY2UgUmVzaXplT2JzZXJ2ZXJDYWxsYmFjayB7XHJcbi8vICAgKGVudHJpZXM6IEFycmF5PFJlc2l6ZU9ic2VydmVyRW50cnk+LCBvYnNlcnZlcjogUmVzaXplT2JzZXJ2ZXIpOnZvaWQ7XHJcbi8vIH1cclxuLy9cclxuLy8gZGVjbGFyZSBlbnVtIFJlc2l6ZU9ic2VydmVyQm94T3B0aW9ucyB7XHJcbi8vICAgXCJib3JkZXItYm94XCIsIFwiY29udGVudC1ib3hcIiwgXCJkZXZpY2UtcGl4ZWwtY29udGVudC1ib3hcIlxyXG4vLyB9O1xyXG5cclxuLy8gLy8gRGVjbGFyZSBSZXNpemVvYnNlcnZlclxyXG4vLyBkZWNsYXJlIGNsYXNzIFJlc2l6ZU9ic2VydmVye1xyXG4vLyAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrOiBSZXNpemVPYnNlcnZlckNhbGxiYWNrKTtcclxuLy8gICBvYnNlcnZlOiAoZWw6RWxlbWVudCxvcHRzOiBSZXNpemVPYnNlcnZlckJveE9wdGlvbnMgfCBudWxsKT0+dm9pZDtcclxuLy8gICB1bm9ic2VydmU6IChlbDpFbGVtZW50KT0+dm9pZDtcclxuLy8gICBkaXNjb25uZWN0OiAoKT0+dm9pZDtcclxuLy8gfVxyXG5cclxuLypcclxuICogQ29udGFpbmVyIGNvbXBvbmVudCBmb3IgYXVkaW8gZGlzcGxheS5cclxuICogVGhlIGRpc3BsYXkgZWxlbWVudHMgYXJlIGNoaWxkcmVuIG9mIGEgdmlydHVhbCBjYW52YXMuIFRoZSB2aXJ0dWFsIGNhbnZhcyBtYWtlcyBpdCBwb3NzaWJsZSB0byBoYXZlIGhpZ2ggem9vbSBmYWN0b3JzIHdpdGggdmVyeSB3aWRlIHZpcnR1YWwgYXVkaW8gZGlzcGxheXMuXHJcbiAqIE9ubHkgdGhlIHZpc2libGUgcGFydCBvZiB0aGUgdmlydHVhbCBjYW52YXMgaXMgaW1wbGVtZW50ZWQgYXMgYSBicm93c2VyIGNhbnZhcyBhbmQgdGhlcmVmb3JlIGNvbnN1bWluZyBtZW1vcnkuXHJcbiAqIFRoZSB2aXNpYmxlIHBhcnQgaGFzIHRoZSBzYW1lIHdpZHRoIGFzIHRoZSB2aWV3cG9ydCBvZiB0aGUgc2Nyb2xsIHBhbmUgcGFyZW50LlxyXG4gKiBUaGUgdmlydHVhbCBjYW52YXMgaXRzZWxmIGlzIGltcGxlbWVudGVkIGFzIGFuIEhUTUwgZGl2IGVsZW1lbnQuXHJcbiAqIFRoZSBsYXlvdXQgb2YgdGhlIGNvbXBvbmVudCBpcyB1cGRhdGVkIG9uIHJlc2l6ZSBvZiB0aGUgcGFyZW50IG9yIGNoYW5nZXMgb2YgdGhlIHpvb20gZmFjdG9yLlxyXG4gKi9cclxuQENvbXBvbmVudCh7XHJcblxyXG4gIHNlbGVjdG9yOiAnYXBwLWF1ZGlvJyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiAjdmlydHVhbENhbnZhcz5cclxuICAgIDxjYW52YXMgI2RpdmlkZXIgKG1vdXNlZG93bik9XCJtb3VzZWRvd24oJGV2ZW50KVwiIChtb3VzZW92ZXIpPVwibW91c2VvdmVyKCRldmVudClcIlxyXG4gICAgICAgICAgICAobW91c2VsZWF2ZSk9XCJtb3VzZWxlYXZlKCRldmVudClcIiBoZWlnaHQ9XCIxMFwiPjwvY2FudmFzPlxyXG4gICAgPGF1ZGlvLXNpZ25hbCBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNpZ25hbD5cclxuICAgIDxhdWRpby1zb25hZ3JhbSBbcG9pbnRlclBvc2l0aW9uXT1cInBvaW50ZXJcIiBbc2VsZWN0aW5nXT1cInNlbGVjdGluZ1wiIFtzZWxlY3Rpb25dPVwic2VsZWN0aW9uXCIgKHBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlcik9XCJwb2ludGVyUG9zaXRpb25DaGFuZ2VkKCRldmVudClcIiAoc2VsZWN0aW5nRXZlbnRFbWl0dGVyKT1cInNlbGVjdGluZ0NoYW5nZWQoJGV2ZW50KVwiIChzZWxlY3RlZEV2ZW50RW1pdHRlcik9XCJzZWxlY3Rpb25DaGFuZ2VkKCRldmVudClcIj48L2F1ZGlvLXNvbmFncmFtPlxyXG4gICAgPC9kaXY+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgZGl2IHtcclxuICAgIG1hcmdpbjogMDtcclxuICAgIHBhZGRpbmc6IDA7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgd2lkdGg6IDEwMCU7XHJcbiAgICBoZWlnaHQ6IDEwMCU7XHJcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7IC8qIFRPRE8gY29udGFpbmVyIGRpdiBwb3NpdGlvbiBtdXN0IG5vdCBiZSAnc3RhdGljJyAoZGVmYXVsdCkgdG8gYWN0IGFzIHJlZmVyZW5jZSBmb3IgdGhlIGNhbnZhc2VzICovXHJcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcclxuICB9YCwgYGNhbnZhc3tcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICB3aWR0aDogMDtcclxuICAgIGhlaWdodDogMDtcclxuICAgIGN1cnNvcjogbnMtcmVzaXplO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YCwgYGF1ZGlvLXNpZ25hbCB7XHJcbiAgICB0b3A6IDA7XHJcbiAgICBsZWZ0OiAwO1xyXG4gICAgcG9zaXRpb246IGFic29sdXRlO1xyXG4gICAgei1pbmRleDogMTtcclxuICAgIHRyYW5zZm9ybTogbm9uZTtcclxuICB9YCwgYGF1ZGlvLXNvbmFncmFtIHtcclxuICAgIHRvcDogMDtcclxuICAgIGxlZnQ6IDA7XHJcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICB6LWluZGV4OiAxO1xyXG4gICAgdHJhbnNmb3JtOiBub25lO1xyXG4gIH1gXVxyXG5cclxufSlcclxuZXhwb3J0IGNsYXNzIEF1ZGlvQ2xpcFVJQ29udGFpbmVyIGV4dGVuZHMgQmFzaWNBdWRpb0NhbnZhc0xheWVyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LEFmdGVyVmlld0luaXR7XHJcblxyXG4gIHByaXZhdGUgc3RhdGljIERJVklERVJfUElYRUxfU0laRSA9IDEwO1xyXG5cclxuICBwYXJlbnRFOiBIVE1MRWxlbWVudDtcclxuXHJcbiAgLy8gRGl2aWRlciBjYW52YXNcclxuICBAVmlld0NoaWxkKCdkaXZpZGVyJywgeyBzdGF0aWM6IHRydWUgfSkgY2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICBkYyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICAvLyBWaXJ0dWFsIGNvbnRhaW5lclxyXG4gIEBWaWV3Q2hpbGQoJ3ZpcnR1YWxDYW52YXMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBjZVJlZiE6IEVsZW1lbnRSZWY7XHJcbiAgY2UhOiBIVE1MRGl2RWxlbWVudDtcclxuXHJcbiAgQFZpZXdDaGlsZChBdWRpb1NpZ25hbCwgeyBzdGF0aWM6IHRydWUgfSkgYXMhOiBBdWRpb1NpZ25hbDtcclxuICBAVmlld0NoaWxkKFNvbmFncmFtLCB7IHN0YXRpYzogdHJ1ZSB9KSBzbyE6IFNvbmFncmFtO1xyXG5cclxuICBwcml2YXRlIF9hdWRpb0NsaXA6QXVkaW9DbGlwIHwgbnVsbD1udWxsO1xyXG4gIHBvaW50ZXI6IE1hcmtlcnxudWxsPW51bGw7XHJcbiAgc2VsZWN0aW5nOiBTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gIHNlbGVjdGlvbjogU2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICBAT3V0cHV0KCkgc2VsZWN0aW9uRXZlbnRFbWl0dGVyID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb24+KCk7XHJcbiAgcHJpdmF0ZSBfcGxheUZyYW1lUG9zaXRpb246IG51bWJlcnxudWxsPW51bGw7XHJcbiAgcHJpdmF0ZSBkcmFnU3RhcnRNb3VzZVk6IG51bWJlciB8IG51bGwgPSBudWxsO1xyXG4gIHByaXZhdGUgZHJhZ1N0YXJ0WTogbnVtYmVyIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBkaXZpZGVyUG9zaXRpb24gPSAwLjU7XHJcblxyXG4gIHVzZXJBY3Rpb249ZmFsc2U7XHJcblxyXG4gIHByaXZhdGUgX3hab29tOiBudW1iZXIgfCBudWxsID0gbnVsbDsgLy8gcGl4ZWxzIHBlciBzZWNvbmRcclxuXHJcbiAgZ2V0IHhab29tKCk6IG51bWJlciB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3hab29tO1xyXG4gIH1cclxuXHJcbiAgc2V0IHhab29tKHZhbHVlOiBudW1iZXIgfCBudWxsKSB7XHJcbiAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgIHRoaXMuX3hab29tID0gdmFsdWU7XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgICB0aGlzLnVzZXJBY3Rpb249ZmFsc2U7XHJcbiAgfVxyXG5cclxuICAvLyBpZiB0cnVlIHRoZSBjb21wbGV0ZSBhdWRpbyBmaWxlIGlzIHNob3duLCB0aGUgZGlzcGxheSBmaXRzIHRvIHRoZSB2aXNpYmxlIHBhbmVsLCB0aGUgeC16b29tIGZhY3RvciBpcyB2YXJpYWJsZSwgdGhpcyBpcyB0aGUgZGVmYXVsdFxyXG4gIHByaXZhdGUgX2ZpeEZpdFRvUGFuZWwgPSB0cnVlO1xyXG5cclxuICBzZXQgZml4Rml0VG9QYW5lbCh2YWx1ZTogYm9vbGVhbikge1xyXG4gICAgdGhpcy5fZml4Rml0VG9QYW5lbCA9IHZhbHVlO1xyXG4gICAgaWYgKHZhbHVlKSB7XHJcbiAgICAgIC8vIHdlIGRvbid0IG5lZWQgIGNsaXAgYm91bmRzXHJcbiAgICAgIHRoaXMuYm91bmRzPW51bGw7XHJcbiAgICAgIHRoaXMuX3hab29tID0gbnVsbDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIGhvbGQgY3VycmVudCB6b29tIHZhbHVlXHJcbiAgICAgIC8vdGhpcy5feFpvb209dGhpcy5jZS5vZmZzZXRXaWR0aC90aGlzLl9hdWRpb0RhdGEuZHVyYXRpb247XHJcbiAgICB9XHJcbiAgICB0aGlzLmxheW91dCgpXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogRWxlbWVudFJlZikge1xyXG4gICAgc3VwZXIoKVxyXG4gICAgdGhpcy5wYXJlbnRFID0gdGhpcy5yZWYubmF0aXZlRWxlbWVudDtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy5jZSA9IHRoaXMuY2VSZWYubmF0aXZlRWxlbWVudDtcclxuICAgIHRoaXMuZGMgPSB0aGlzLmNhbnZhc1JlZi5uYXRpdmVFbGVtZW50O1xyXG4gIH1cclxuXHJcbiAgbmdBZnRlclZpZXdJbml0KCkge1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICAgIGNvbnN0IGhlaWdodExpc3RlbmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG1yczogQXJyYXk8TXV0YXRpb25SZWNvcmQ+LCBtbzogTXV0YXRpb25PYnNlcnZlcikgPT4ge1xyXG5cclxuICAgICAgbGV0IGxheW91dD1mYWxzZTtcclxuICAgICAgbXJzLmZvckVhY2goKG1yOiBNdXRhdGlvblJlY29yZCkgPT4ge1xyXG4gICAgICAgIGlmICghdGhpcy51c2VyQWN0aW9uICYmICdhdHRyaWJ1dGVzJyA9PT0gbXIudHlwZSAmJiAoJ2NsYXNzJyA9PT0gbXIuYXR0cmlidXRlTmFtZSB8fCAnc3R5bGUnID09PSBtci5hdHRyaWJ1dGVOYW1lKSkge1xyXG4gICAgICAgICAgbGF5b3V0PXRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgaWYobGF5b3V0KXtcclxuICAgICAgICAvLyByZS1sYXlvdXQgcmVxdWlyZWRcclxuICAgICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG5cclxuICAgIGhlaWdodExpc3RlbmVyLm9ic2VydmUodGhpcy5jZSwge2F0dHJpYnV0ZXM6IHRydWUsIGNoaWxkTGlzdDogdHJ1ZSwgY2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xyXG4gICAgaGVpZ2h0TGlzdGVuZXIub2JzZXJ2ZSh0aGlzLmRjLCB7YXR0cmlidXRlczogdHJ1ZSwgY2hpbGRMaXN0OiB0cnVlLCBjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XHJcblxyXG4gICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKGVudHJpZXMsb2JzKSA9PiB7XHJcbiAgICAgIC8vY29uc29sZS5sb2coXCJSZXNpemUgb2JzZXJ2ZWQ6XCIpO1xyXG4gICAgICBlbnRyaWVzLmZvckVhY2goKGUpPT57XHJcbiAgICAgICAgLy9jb25zb2xlLmxvZyhlLmNvbnRlbnRSZWN0LndpZHRoK1wieFwiK2UuY29udGVudFJlY3QuaGVpZ2h0KTtcclxuICAgICAgICB0aGlzLmxheW91dCgpO1xyXG4gICAgICB9KVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmVzaXplT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmNlKTtcclxuXHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMubGF5b3V0KCk7XHJcbiAgfVxyXG5cclxuICBtb3VzZW92ZXIobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCB0cnVlKTtcclxuICB9XHJcblxyXG4gIG1vdXNlbGVhdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZGl2aWRlckN1cnNvclBvc2l0aW9uKG1lLCBmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBtb3VzZWRvd24obWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0TW91c2VZID0gbWUuY2xpZW50WTtcclxuICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IHRoaXMuZGMub2Zmc2V0VG9wO1xyXG4gICAgdGhpcy5kcmFnU3RhcnRNb3VzZVkgPSBtZS5jbGllbnRZO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZXVwKG1lOiBNb3VzZUV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5kcmFnU3RhcnRZICE9IG51bGwpIHtcclxuICAgICAgdGhpcy51c2VyQWN0aW9uPXRydWU7XHJcbiAgICAgIHRoaXMuZGl2aWRlckRyYWcobWUpO1xyXG4gICAgICB0aGlzLmxheW91dChmYWxzZSk7XHJcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0WSA9IG51bGw7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj1mYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXHJcbiAgb25Nb3VzZW1vdmUobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmRyYWdTdGFydFkgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLnVzZXJBY3Rpb249dHJ1ZTtcclxuICAgICAgdGhpcy5kaXZpZGVyRHJhZyhtZSk7XHJcbiAgICAgIHRoaXMubGF5b3V0U2NhbGVkKCk7XHJcbiAgICAgIHRoaXMudXNlckFjdGlvbj10cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcG9pbnRlclBvc2l0aW9uQ2hhbmdlZChwcDpNYXJrZXIpe1xyXG4gICAgdGhpcy5wb2ludGVyPXBwXHJcbiAgfVxyXG5cclxuICBzZWxlY3RpbmdDaGFuZ2VkKHM6U2VsZWN0aW9ufCBudWxsKXtcclxuICAgIHRoaXMuc2VsZWN0aW5nPXNcclxuICB9XHJcblxyXG4gIHNlbGVjdGlvbkNoYW5nZWQoczpTZWxlY3Rpb24pe1xyXG4gICAgdGhpcy5zZWxlY3Rpb249c1xyXG4gICAgaWYodGhpcy5fYXVkaW9DbGlwKXtcclxuICAgICAgdGhpcy5fYXVkaW9DbGlwLnNlbGVjdGlvbj1zXHJcbiAgICB9XHJcbiAgICB0aGlzLnNlbGVjdGlvbkV2ZW50RW1pdHRlci5lbWl0KHRoaXMuc2VsZWN0aW9uKVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBjYW52YXNNb3VzZVBvcyhjOiBIVE1MQ2FudmFzRWxlbWVudCwgZTogTW91c2VFdmVudCk6IFBvaW50IHtcclxuICAgIGNvbnN0IGNyID0gYy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcclxuICAgIGNvbnN0IHggPSBlLnggLSBjci5sZWZ0O1xyXG4gICAgY29uc3QgeSA9IGUueSAtIGNyLnRvcDtcclxuICAgIHJldHVybiBuZXcgUG9pbnQoeCx5KTtcclxuICB9XHJcblxyXG4gIGRpdmlkZXJDdXJzb3JQb3NpdGlvbihlOiBNb3VzZUV2ZW50LCBzaG93OiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5kYykge1xyXG4gICAgICB0aGlzLmNhbnZhc01vdXNlUG9zKHRoaXMuZGMsIGUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZGl2aWRlckRyYWcoZTogTW91c2VFdmVudCkge1xyXG4gICAgaWYgKHRoaXMuZGMgJiYgdGhpcy5kcmFnU3RhcnRNb3VzZVkgJiYgdGhpcy5kcmFnU3RhcnRZKSB7XHJcblxyXG4gICAgICBjb25zdCBkcmFnT2Zmc2V0ID0gZS5jbGllbnRZIC0gdGhpcy5kcmFnU3RhcnRNb3VzZVk7XHJcbiAgICAgIGNvbnN0IGNlSGVpZ2h0ID0gdGhpcy5jZS5vZmZzZXRIZWlnaHQ7XHJcblxyXG4gICAgICBsZXQgbmV3VG9wID0gKHRoaXMuZHJhZ1N0YXJ0WSArIGRyYWdPZmZzZXQpO1xyXG4gICAgICBpZiAobmV3VG9wIDwgMCkge1xyXG4gICAgICAgIG5ld1RvcCA9IDA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKG5ld1RvcCA+IGNlSGVpZ2h0IC0gQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFKSB7XHJcbiAgICAgICAgbmV3VG9wID0gY2VIZWlnaHQgLSBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBuZXdUb3AudG9TdHJpbmcoKSArICdweCc7XHJcbiAgICAgIHRoaXMuZGl2aWRlclBvc2l0aW9uID0gKHRoaXMuZGMub2Zmc2V0VG9wICsgQXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFIC8gMikgLyBjZUhlaWdodDtcclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uID4gMS4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAxLjA7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuZGl2aWRlclBvc2l0aW9uIDwgMC4wKSB7XHJcbiAgICAgICAgdGhpcy5kaXZpZGVyUG9zaXRpb24gPSAwLjA7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIGRyYXdEaXZpZGVyKCkge1xyXG4gICAgY29uc3QgdyA9IHRoaXMuZGMud2lkdGg7XHJcbiAgICBjb25zdCBoID0gdGhpcy5kYy5oZWlnaHQ7XHJcbiAgICBjb25zdCBnID0gdGhpcy5kYy5nZXRDb250ZXh0KCcyZCcpO1xyXG4gICAgaWYgKGcgJiYgdz4xMCAmJiBoPj0xKSB7XHJcbiAgICAgIGcuZmlsbFN0eWxlID0gJ3doaXRlJztcclxuICAgICAgZy5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgZy5maWxsU3R5bGUgPSAnYmxhY2snO1xyXG4gICAgICBnLmZpbGxSZWN0KDUsIDUsIHcgLSAxMCwgMSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjbGlwQm91bmRzKGNsaXBCb3VuZHM6IFJlY3RhbmdsZSkge1xyXG4gICAgdGhpcy5ib3VuZHMgPSBjbGlwQm91bmRzO1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGN1cnJlbnRYWm9vbSgpOiBudW1iZXIgfCBudWxsIHtcclxuICAgIGxldCB4eiA9IHRoaXMuX3hab29tO1xyXG4gICAgaWYgKHh6PT1udWxsICYmIHRoaXMuX2F1ZGlvRGF0YUhvbGRlcikge1xyXG4gICAgICBsZXQgb3cgPSB0aGlzLmNlLm9mZnNldFdpZHRoO1xyXG4gICAgICBpZiAob3cgPCAxKSB7XHJcbiAgICAgICAgLy8gYXQgbGVhc3Qgb25lIHBpeGVsIHdpZHRoIHRvIGF2b2lkIHgtem9vbSB6ZXJvIHZhbHVlc1xyXG4gICAgICAgIG93ID0gMTtcclxuICAgICAgfVxyXG4gICAgICB4eiA9IG93IC8gdGhpcy5fYXVkaW9EYXRhSG9sZGVyLmR1cmF0aW9uO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHh6O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfbGF5b3V0KGNsZWFyOiBib29sZWFuLCByZWRyYXc6IGJvb2xlYW4pIHtcclxuICAgIGxldCBjZUJjciA9IHRoaXMuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcblxyXG4gICAgY29uc3QgY2VCY3JJbnRXID0gTWF0aC5mbG9vcihjZUJjci53aWR0aCk7XHJcbiAgICBjb25zdCBjZUJjckludEggPSBNYXRoLmZsb29yKGNlQmNyLmhlaWdodCk7XHJcblxyXG4gICAgLy8gaGVpZ2h0IGF2YWlsYWJsZSBmb3IgcGx1Z2lucyAoYXVkaW9zaWduYWwgYW5kIHNvbmFncmFtKVxyXG4gICAgbGV0IHBzSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuICAgIGlmIChwc0ggPCAwKSB7XHJcbiAgICAgIHBzSCA9IDA7XHJcbiAgICB9XHJcbiAgICAvLyBhdWRpbyBzaWduYWwgaGVpZ2h0XHJcbiAgICBjb25zdCBhc0ggPSBNYXRoLnJvdW5kKHBzSCAqIHRoaXMuZGl2aWRlclBvc2l0aW9uKTtcclxuXHJcbiAgICAvLyBzb25hZ3JhbSBoZWlnaHQgKHJlc3Q6IGF2YWlsYWJsZSBoZWlnaHQgbWludXMgZGl2aWRlciBoZWlnaHQgbWludXMgYXVkaW9zaWduYWwgaGVpZ2h0KVxyXG4gICAgbGV0IHNvSCA9IGNlQmNySW50SCAtIEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSAtIGFzSDtcclxuICAgIGlmIChzb0ggPCAwKSB7XHJcbiAgICAgIHNvSCA9IDA7XHJcbiAgICB9XHJcblxyXG4gIC8vIHNvbmFncmFtIHRvcCBwb3NpdGlvblxyXG4gICAgY29uc3Qgc29Ub3AgPSBhc0ggKyBBdWRpb0NsaXBVSUNvbnRhaW5lci5ESVZJREVSX1BJWEVMX1NJWkU7XHJcblxyXG4gICAgLy8gVmlzaWJsZSBib3VuZHNcclxuICAgIC8vIGxlZnQgcG9zaXRpb25cclxuICAgIGxldCB2YkxlZnQgPSAwO1xyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoID0gY2VCY3JJbnRXO1xyXG4gICAgaWYgKCF0aGlzLl9maXhGaXRUb1BhbmVsICYmIHRoaXMuYm91bmRzKSB7XHJcbiAgICAgIHZiTGVmdCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMucG9zaXRpb24ubGVmdCk7XHJcbiAgICAgIHZiV2lkdGggPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICB9XHJcblxyXG4gICAgLy8gRGl2aWRlclxyXG4gICAgLy8gbGVmdCBwb3NpdGlvblxyXG4gICAgbGV0IHZiTGVmdFN0eWwgPSB2YkxlZnQgKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUubGVmdCAhPSB2YkxlZnRTdHlsKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUubGVmdCA9IHZiTGVmdFN0eWw7XHJcbiAgICB9XHJcbiAgICAvLyB0b3AgcG9zaXRpb25cclxuICAgIC8vY29uc3QgZFRvcCA9IGFzSDtcclxuICAgIGNvbnN0IGRUb3BTdHIgPSBhc0ggKyAncHgnO1xyXG4gICAgaWYgKHRoaXMuZGMuc3R5bGUudG9wICE9IGRUb3BTdHIpIHtcclxuICAgICAgdGhpcy5kYy5zdHlsZS50b3AgPSBkVG9wU3RyO1xyXG4gICAgfVxyXG4gICAgLy8gd2lkdGhcclxuICAgIGxldCB2YldpZHRoU3R5bGUgPSB2YldpZHRoICsgJ3B4JztcclxuICAgIGlmICh0aGlzLmRjLnN0eWxlLndpZHRoICE9IHZiV2lkdGhTdHlsZSkge1xyXG4gICAgICB0aGlzLmRjLnN0eWxlLndpZHRoID0gdmJXaWR0aFN0eWxlO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuZGMud2lkdGggIT0gdmJXaWR0aCkge1xyXG4gICAgICB0aGlzLmRjLndpZHRoID0gdmJXaWR0aDtcclxuICAgIH1cclxuICAgIC8vIGhlaWdodFxyXG4gICAgaWYodGhpcy5kYy5oZWlnaHQhPUF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRSkge1xyXG4gICAgICB0aGlzLmRjLmhlaWdodCA9IEF1ZGlvQ2xpcFVJQ29udGFpbmVyLkRJVklERVJfUElYRUxfU0laRTtcclxuXHJcbiAgICB9XHJcbiAgICBsZXQgZGl2UGl4ZWxTaXplU3R5bGU9QXVkaW9DbGlwVUlDb250YWluZXIuRElWSURFUl9QSVhFTF9TSVpFLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgaWYodGhpcy5kYy5zdHlsZS5oZWlnaHQhPWRpdlBpeGVsU2l6ZVN0eWxlKSB7XHJcbiAgICAgIHRoaXMuZGMuc3R5bGUuaGVpZ2h0ID0gZGl2UGl4ZWxTaXplU3R5bGU7XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5kcmF3RGl2aWRlcigpO1xyXG5cclxuXHJcbiAgICAvLyBWaXJ0dWFsIGRpbWVuc2lvbiwgb25seSB3aWR0aCBpcyB1c2VkXHJcbiAgICBsZXQgdmlydHVhbERpbSA9IG5ldyBEaW1lbnNpb24oY2VCY3JJbnRXLCAwKVxyXG5cclxuICAgIC8vIFZpc2libGUgYm91bmRzIG9mIGNvbnRhaW5lclxyXG4gICAgbGV0IGJyID0gbmV3IFJlY3RhbmdsZShuZXcgUG9zaXRpb24odmJMZWZ0LCAwKSwgbmV3IERpbWVuc2lvbih2YldpZHRoLCBjZUJjckludEgpKTtcclxuXHJcbiAgICAvLyBTZXQgY29udGFpbmVyIGJvdW5kc1xyXG4gICAgdGhpcy5sYXlvdXRCb3VuZHMoYnIsIHZpcnR1YWxEaW0sIGZhbHNlKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBhdWRpb3NpZ25hbFxyXG4gICAgbGV0IGFzUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgMCksIG5ldyBEaW1lbnNpb24odmJXaWR0aCwgYXNIKSk7XHJcblxyXG4gICAgLy8gU2V0IGF1ZGlvc2lnbmFsIGJvdW5kc1xyXG4gICAgdGhpcy5hcy5sYXlvdXRCb3VuZHMoYXNSLCB2aXJ0dWFsRGltLCByZWRyYXcsIGNsZWFyKTtcclxuXHJcbiAgICAvLyBWaXNpYmxlIGJvdW5kcyBvZiBzb25hZ3JhbVxyXG4gICAgbGV0IHNvUiA9IG5ldyBSZWN0YW5nbGUobmV3IFBvc2l0aW9uKHZiTGVmdCwgc29Ub3ApLCBuZXcgRGltZW5zaW9uKHZiV2lkdGgsIHNvSCkpO1xyXG5cclxuICAgIC8vIFNldCBzb25hZ3JhbSBib3VuZHNcclxuICAgIHRoaXMuc28ubGF5b3V0Qm91bmRzKHNvUiwgdmlydHVhbERpbSwgcmVkcmF3LCBjbGVhcik7XHJcbiAgfVxyXG5cclxuICBsYXlvdXRTY2FsZWQoKSB7XHJcbiAgICB0aGlzLl9sYXlvdXQoZmFsc2UsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIGxheW91dChjbGVhcj10cnVlKSB7XHJcblxyXG4gICAgaWYodGhpcy5jZSAmJiB0aGlzLmRjKSB7XHJcbiAgICAgIGNvbnN0IGNsaWVudFc9dGhpcy5jZS5jbGllbnRXaWR0aDtcclxuICAgICAgaWYodGhpcy5fYXVkaW9EYXRhSG9sZGVyKXtcclxuICAgICAgICBpZih0aGlzLl9maXhGaXRUb1BhbmVsKSB7XHJcbiAgICAgICAgICAvLyBTZXQgdGhlIHZpcnR1YWwgY2FudmFzIHdpZHRoIHRvIHRoZSB2aXNpYmxlIHdpZHRoXHJcbiAgICAgICAgICBpZih0aGlzLmNlLnN0eWxlLndpZHRoIT0nMTAwJScpIHtcclxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInNldCB3aWR0aCB0byAxMDAlXCIpO1xyXG4gICAgICAgICAgICB0aGlzLmNlLnN0eWxlLndpZHRoID0gJzEwMCUnO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1lbHNle1xyXG4gICAgICAgICAgaWYgKHRoaXMuX3hab29tKSB7XHJcbiAgICAgICAgICAgIC8vIFNldCB0aGUgdmlydHVhbCBjYW52YXMgd2lkdGggYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdXNlciBzZWxlY3RlZCB4Wm9vbSB2YWx1ZVxyXG4gICAgICAgICAgICBjb25zdCBuZXdDbFcgPSBNYXRoLnJvdW5kKCB0aGlzLl94Wm9vbSp0aGlzLl9hdWRpb0RhdGFIb2xkZXI/LmR1cmF0aW9uICk7XHJcbiAgICAgICAgICAgIHRoaXMuY2Uuc3R5bGUud2lkdGggPSBuZXdDbFcgKyAncHgnO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgLy8gU2V0IHRoZSB2aXJ0dWFsIGNhbnZhcyB3aWR0aCB0byB0aGUgdmlzaWJsZSB3aWR0aCBvbmx5XHJcbiAgICAgICAgICAgIHRoaXMuY2Uuc3R5bGUud2lkdGggPSBjbGllbnRXICsgJ3B4JztcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy5fbGF5b3V0KGNsZWFyLHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBzZXQgYXVkaW9EYXRhKGF1ZGlvRGF0YUhvbGRlcjogQXVkaW9EYXRhSG9sZGVyIHwgbnVsbCkge1xyXG4gICAgdGhpcy5fYXVkaW9DbGlwPW51bGxcclxuICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlcj1hdWRpb0RhdGFIb2xkZXI7XHJcbiAgICB0aGlzLmFzLnNldERhdGEoYXVkaW9EYXRhSG9sZGVyKTtcclxuICAgIHRoaXMuc28uc2V0RGF0YShhdWRpb0RhdGFIb2xkZXIpO1xyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGdldCBhdWRpb0RhdGEoKTpBdWRpb0RhdGFIb2xkZXJ8bnVsbHtcclxuICAgIHJldHVybiB0aGlzLl9hdWRpb0RhdGFIb2xkZXJcclxuICB9XHJcblxyXG5cclxuICBASW5wdXQoKVxyXG4gIHNldCBhdWRpb0NsaXAoYXVkaW9DbGlwOiBBdWRpb0NsaXAgfCBudWxsKSB7XHJcbiAgICB0aGlzLl9hdWRpb0NsaXA9YXVkaW9DbGlwXHJcbiAgICAgIGxldCBhdWRpb0RhdGE6QXVkaW9EYXRhSG9sZGVyfG51bGw9bnVsbDtcclxuICAgIGxldCBzZWw6U2VsZWN0aW9ufG51bGw9bnVsbDtcclxuICAgICAgaWYoYXVkaW9DbGlwKSB7XHJcbiAgICAgICAgYXVkaW9EYXRhID0gYXVkaW9DbGlwLmF1ZGlvRGF0YUhvbGRlcjtcclxuICAgICAgICBpZiAodGhpcy5fYXVkaW9DbGlwKSB7XHJcbiAgICAgICAgICB0aGlzLl9hdWRpb0NsaXAuYWRkU2VsZWN0aW9uT2JzZXJ2ZXIoKGNsaXApID0+IHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBjbGlwLnNlbGVjdGlvblxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHNlbD1hdWRpb0NsaXAuc2VsZWN0aW9uO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMuX2F1ZGlvRGF0YUhvbGRlciA9IGF1ZGlvRGF0YTtcclxuICAgICAgdGhpcy5hcy5zZXREYXRhKHRoaXMuX2F1ZGlvRGF0YUhvbGRlcik7XHJcbiAgICAgIHRoaXMuc28uc2V0RGF0YSh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpO1xyXG4gICAgICB0aGlzLnNlbGVjdGluZz1udWxsXHJcbiAgICAgIHRoaXMuc2VsZWN0aW9uPXNlbFxyXG4gICAgdGhpcy5sYXlvdXQoKTtcclxuICB9XHJcblxyXG4gIGdldCBwbGF5RnJhbWVQb3NpdGlvbigpOiBudW1iZXIgfG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuX3BsYXlGcmFtZVBvc2l0aW9uO1xyXG4gIH1cclxuXHJcbiAgc2V0IHBsYXlGcmFtZVBvc2l0aW9uKHBsYXlGcmFtZVBvc2l0aW9uOiBudW1iZXJ8bnVsbCkge1xyXG4gICAgdGhpcy5fcGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuYXMucGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICAgIHRoaXMuc28ucGxheUZyYW1lUG9zaXRpb24gPSBwbGF5RnJhbWVQb3NpdGlvbjtcclxuICB9XHJcbn1cclxuXHJcbiJdfQ==
|