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.
Files changed (99) hide show
  1. package/README.md +1 -1
  2. package/fesm2022/speechrecorderng.mjs +204 -201
  3. package/fesm2022/speechrecorderng.mjs.map +1 -1
  4. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +2 -2
  5. package/lib/spr.module.version.d.ts +1 -1
  6. package/lib/ui/canvas_layer_comp.d.ts +1 -1
  7. package/lib/ui/responsive_component.d.ts +1 -1
  8. package/package.json +13 -15
  9. package/esm2022/lib/action/action.mjs +0 -73
  10. package/esm2022/lib/audio/array_audio_buffer.mjs +0 -164
  11. package/esm2022/lib/audio/array_audio_buffer_input_stream.mjs +0 -86
  12. package/esm2022/lib/audio/array_audio_buffer_random_access_stream.mjs +0 -16
  13. package/esm2022/lib/audio/audio_data_holder.mjs +0 -264
  14. package/esm2022/lib/audio/audio_display.mjs +0 -118
  15. package/esm2022/lib/audio/audio_player.mjs +0 -238
  16. package/esm2022/lib/audio/capture/capture.mjs +0 -855
  17. package/esm2022/lib/audio/context.mjs +0 -79
  18. package/esm2022/lib/audio/dsp/level_measure.mjs +0 -517
  19. package/esm2022/lib/audio/format.mjs +0 -20
  20. package/esm2022/lib/audio/impl/wavformat.mjs +0 -7
  21. package/esm2022/lib/audio/impl/wavreader.mjs +0 -144
  22. package/esm2022/lib/audio/impl/wavwriter.mjs +0 -191
  23. package/esm2022/lib/audio/inddb_audio_buffer.mjs +0 -508
  24. package/esm2022/lib/audio/io/stream.mjs +0 -59
  25. package/esm2022/lib/audio/net_audio_buffer.mjs +0 -293
  26. package/esm2022/lib/audio/persistor.mjs +0 -81
  27. package/esm2022/lib/audio/playback/array_audio_buffer_source_node.mjs +0 -126
  28. package/esm2022/lib/audio/playback/audio_source_node.mjs +0 -18
  29. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  30. package/esm2022/lib/audio/playback/inddb_audio_buffer_source_node.mjs +0 -167
  31. package/esm2022/lib/audio/playback/net_audio_buffer_source_node.mjs +0 -218
  32. package/esm2022/lib/audio/playback/player.mjs +0 -402
  33. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  34. package/esm2022/lib/audio/ui/audio_display_control.mjs +0 -150
  35. package/esm2022/lib/audio/ui/audio_display_scroll_pane.mjs +0 -146
  36. package/esm2022/lib/audio/ui/audiosignal.mjs +0 -533
  37. package/esm2022/lib/audio/ui/common.mjs +0 -19
  38. package/esm2022/lib/audio/ui/container.mjs +0 -414
  39. package/esm2022/lib/audio/ui/livelevel.mjs +0 -361
  40. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  41. package/esm2022/lib/audio/ui/sonagram.mjs +0 -900
  42. package/esm2022/lib/db/inddb.mjs +0 -120
  43. package/esm2022/lib/dsp/utils.mjs +0 -48
  44. package/esm2022/lib/environment/environment.defaults.mjs +0 -9
  45. package/esm2022/lib/io/BinaryReader.mjs +0 -93
  46. package/esm2022/lib/io/BinaryWriter.mjs +0 -80
  47. package/esm2022/lib/io/stream.mjs +0 -259
  48. package/esm2022/lib/math/2d/geometry.mjs +0 -28
  49. package/esm2022/lib/math/complex.mjs +0 -58
  50. package/esm2022/lib/math/dft.mjs +0 -196
  51. package/esm2022/lib/media/utils.mjs +0 -14
  52. package/esm2022/lib/net/uploader.mjs +0 -367
  53. package/esm2022/lib/recorder_component.mjs +0 -65
  54. package/esm2022/lib/speechrecorder/project/project.mjs +0 -54
  55. package/esm2022/lib/speechrecorder/project/project.service.mjs +0 -64
  56. package/esm2022/lib/speechrecorder/recording.mjs +0 -124
  57. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -221
  58. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  59. package/esm2022/lib/speechrecorder/script/script.mjs +0 -114
  60. package/esm2022/lib/speechrecorder/script/script.service.mjs +0 -47
  61. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  62. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +0 -676
  63. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +0 -416
  64. package/esm2022/lib/speechrecorder/session/item.mjs +0 -30
  65. package/esm2022/lib/speechrecorder/session/progress.mjs +0 -135
  66. package/esm2022/lib/speechrecorder/session/prompting.mjs +0 -639
  67. package/esm2022/lib/speechrecorder/session/recorder_combi_pane.mjs +0 -88
  68. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  69. package/esm2022/lib/speechrecorder/session/recording_list.mjs +0 -188
  70. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +0 -128
  71. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +0 -114
  72. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +0 -146
  73. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +0 -424
  74. package/esm2022/lib/speechrecorder/session/recordingfile/recording-file.mjs +0 -68
  75. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  76. package/esm2022/lib/speechrecorder/session/session.mjs +0 -2
  77. package/esm2022/lib/speechrecorder/session/session.service.mjs +0 -69
  78. package/esm2022/lib/speechrecorder/session/session_finished_dialog.mjs +0 -46
  79. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +0 -1385
  80. package/esm2022/lib/speechrecorder/session/warning_bar.mjs +0 -33
  81. package/esm2022/lib/speechrecorder/spruploader.mjs +0 -22
  82. package/esm2022/lib/speechrecorder/startstopsignal/startstopsignal.mjs +0 -2
  83. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  84. package/esm2022/lib/speechrecorderng.component.mjs +0 -392
  85. package/esm2022/lib/speechrecorderng.module.mjs +0 -97
  86. package/esm2022/lib/spr.config.mjs +0 -27
  87. package/esm2022/lib/spr.module.version.mjs +0 -2
  88. package/esm2022/lib/ui/canvas_layer_comp.mjs +0 -38
  89. package/esm2022/lib/ui/intersection-observer.directive.mjs +0 -32
  90. package/esm2022/lib/ui/message_dialog.mjs +0 -51
  91. package/esm2022/lib/ui/recordingitem_display.mjs +0 -253
  92. package/esm2022/lib/ui/responsive_component.mjs +0 -24
  93. package/esm2022/lib/utils/scrollIntoViewToBottom.mjs +0 -23
  94. package/esm2022/lib/utils/ua-parser.mjs +0 -190
  95. package/esm2022/lib/utils/utils.mjs +0 -132
  96. package/esm2022/lib/utils/wake_lock.mjs +0 -114
  97. package/esm2022/lib/utils/wake_lock_media.mjs +0 -2
  98. package/esm2022/public-api.mjs +0 -35
  99. package/esm2022/speechrecorderng.mjs +0 -5
@@ -1,135 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- import * as i1 from "@angular/common";
4
- import * as i2 from "@angular/material/icon";
5
- import * as i3 from "../../ui/intersection-observer.directive";
6
- export class Progress {
7
- constructor(elRef) {
8
- this.elRef = elRef;
9
- this.items = undefined;
10
- this.selectedItemIdx = 0;
11
- this.enableDownload = false;
12
- this.onRowSelect = new EventEmitter();
13
- this.onShowDoneAction = new EventEmitter();
14
- this.onDownloadDoneAction = new EventEmitter();
15
- this.isObs = new IntersectionObserver(ise => {
16
- //console.debug("Intersection changed: ");
17
- ise.forEach((isee) => {
18
- //console.debug("Intersection: "+isee.isIntersecting+' '+isee.intersectionRatio);
19
- if (isee.intersectionRatio < 1) {
20
- isee.target.scrollIntoView(false);
21
- this.isObs.unobserve(isee.target);
22
- }
23
- });
24
- }, { root: this.elRef.nativeElement });
25
- }
26
- set rowSelect(rowIdx) {
27
- this.onRowSelect.emit(rowIdx);
28
- }
29
- set clickDone(rowIdx) {
30
- if (this.items && this.items[rowIdx] && this.items[rowIdx].recs) {
31
- this.onRowSelect.emit(rowIdx);
32
- this.onShowDoneAction.emit(rowIdx);
33
- }
34
- }
35
- set clickDownloadDone(rowIdx) {
36
- if (this.items && this.items[rowIdx] && this.items[rowIdx].recs) {
37
- this.onRowSelect.emit(rowIdx);
38
- this.onDownloadDoneAction.emit(rowIdx);
39
- }
40
- }
41
- latestRecordingAvail(item) {
42
- let cached = null;
43
- if (item && item.recs) {
44
- let recsLen = item.recs.length;
45
- if (recsLen > 0) {
46
- let rf = item.recs[recsLen - 1];
47
- if (rf && rf.serverPersisted) {
48
- cached = (rf.audioDataHolder != null);
49
- }
50
- }
51
- }
52
- return cached;
53
- }
54
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: Progress, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
55
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: Progress, selector: "app-sprprogress", inputs: { items: "items", selectedItemIdx: "selectedItemIdx", enableDownload: "enableDownload" }, outputs: { onRowSelect: "onRowSelect", rowSelect: "rowSelect", onShowDoneAction: "onShowDoneAction", clickDone: "clickDone", onDownloadDoneAction: "onDownloadDoneAction", clickDownloadDone: "clickDownloadDone" }, ngImport: i0, template: `
56
-
57
- <table class="mat-typography">
58
- <thead>
59
- <tr>
60
- <th>#</th><!--<th>Code</th>-->
61
- <th>Prompt</th>
62
- <th>Status</th>
63
- </tr>
64
- </thead>
65
- <tbody>
66
- <ng-container *ngIf="items">
67
-
68
- <tr *ngFor="let item of items; let itIdx=index;"
69
- (click)="rowSelect=itIdx" [class.selRow]="itIdx===selectedItemIdx"
70
- [updateObservation]="{observer:isObs,observe:(itIdx===selectedItemIdx)}">
71
- <td>{{itIdx}}</td>
72
- <td class="promptDescriptor">{{item.promptAsString}}</td>
73
- <td>
74
- <mat-icon *ngIf="item.itemDone()">done</mat-icon>
75
- <!--<mat-icon *ngIf="latestRecordingAvail(item)===false" style="font-size:0.6em;width:0.6em;height:0.6em">cloud_download</mat-icon>-->
76
-
77
- </td>
78
- </tr>
79
- </ng-container>
80
-
81
- </tbody>
82
- </table>
83
- `, isInline: true, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:#fff;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:#add8e6}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: i3.IntersectionObserverDirective, selector: "[updateObservation]", inputs: ["updateObservation"] }] }); }
84
- }
85
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: Progress, decorators: [{
86
- type: Component,
87
- args: [{ selector: 'app-sprprogress', template: `
88
-
89
- <table class="mat-typography">
90
- <thead>
91
- <tr>
92
- <th>#</th><!--<th>Code</th>-->
93
- <th>Prompt</th>
94
- <th>Status</th>
95
- </tr>
96
- </thead>
97
- <tbody>
98
- <ng-container *ngIf="items">
99
-
100
- <tr *ngFor="let item of items; let itIdx=index;"
101
- (click)="rowSelect=itIdx" [class.selRow]="itIdx===selectedItemIdx"
102
- [updateObservation]="{observer:isObs,observe:(itIdx===selectedItemIdx)}">
103
- <td>{{itIdx}}</td>
104
- <td class="promptDescriptor">{{item.promptAsString}}</td>
105
- <td>
106
- <mat-icon *ngIf="item.itemDone()">done</mat-icon>
107
- <!--<mat-icon *ngIf="latestRecordingAvail(item)===false" style="font-size:0.6em;width:0.6em;height:0.6em">cloud_download</mat-icon>-->
108
-
109
- </td>
110
- </tr>
111
- </ng-container>
112
-
113
- </tbody>
114
- </table>
115
- `, styles: [":host{overflow-x:hidden;overflow-y:scroll;padding:10pt;flex:.1 0 content;background:#fff;min-height:1px}\n", "table{min-height:1px;border-collapse:collapse}table,th,td{border:1px solid lightgrey;padding:.5em}\n", ".selRow{background:#add8e6}\n", ".promptDescriptor{max-width:200px;text-overflow:ellipsis;overflow:hidden;white-space:nowrap}\n"] }]
116
- }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { items: [{
117
- type: Input
118
- }], selectedItemIdx: [{
119
- type: Input
120
- }], enableDownload: [{
121
- type: Input
122
- }], onRowSelect: [{
123
- type: Output
124
- }], rowSelect: [{
125
- type: Output
126
- }], onShowDoneAction: [{
127
- type: Output
128
- }], clickDone: [{
129
- type: Output
130
- }], onDownloadDoneAction: [{
131
- type: Output
132
- }], clickDownloadDone: [{
133
- type: Output
134
- }] } });
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvc3BlZWNocmVjb3JkZXIvc2Vzc2lvbi9wcm9ncmVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFjLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFBOzs7OztBQWdGaEYsTUFBTSxPQUFPLFFBQVE7SUFFbkIsWUFBb0IsS0FBZ0I7UUFBaEIsVUFBSyxHQUFMLEtBQUssQ0FBVztRQVkzQixVQUFLLEdBQXdCLFNBQVMsQ0FBQztRQUN2QyxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixtQkFBYyxHQUFVLEtBQUssQ0FBQztRQUM3QixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7UUFNekMscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQVM5Qyx5QkFBb0IsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBN0IxRCxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksb0JBQW9CLENBQUMsR0FBRyxDQUFBLEVBQUU7WUFDdkMsMENBQTBDO1lBQzFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUMsRUFBRTtnQkFDbEIsaUZBQWlGO2dCQUNqRixJQUFHLElBQUksQ0FBQyxpQkFBaUIsR0FBQyxDQUFDLEVBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2xDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDcEMsQ0FBQztZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQTtJQUNwQyxDQUFDO0lBS0QsSUFDSSxTQUFTLENBQUMsTUFBYTtRQUN6QixJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBR0QsSUFDSSxTQUFTLENBQUMsTUFBYTtRQUN6QixJQUFHLElBQUksQ0FBQyxLQUFLLElBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzlCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFHRCxJQUNJLGlCQUFpQixDQUFDLE1BQWE7UUFDakMsSUFBRyxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUMvRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5QixJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pDLENBQUM7SUFDSCxDQUFDO0lBRUQsb0JBQW9CLENBQUMsSUFBUztRQUM1QixJQUFJLE1BQU0sR0FBQyxJQUFJLENBQUM7UUFDaEIsSUFBRyxJQUFJLElBQUksSUFBSSxDQUFDLElBQUksRUFBQyxDQUFDO1lBQ3BCLElBQUksT0FBTyxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1lBQzdCLElBQUcsT0FBTyxHQUFDLENBQUMsRUFBQyxDQUFDO2dCQUNaLElBQUksRUFBRSxHQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM1QixJQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQzVCLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxlQUFlLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ3hDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7K0dBckRVLFFBQVE7bUdBQVIsUUFBUSw4V0F4RVQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7OzRGQTRDVSxRQUFRO2tCQTNFcEIsU0FBUzsrQkFFRSxpQkFBaUIsWUFDakI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0QlQ7K0VBMERRLEtBQUs7c0JBQWIsS0FBSztnQkFDRyxlQUFlO3NCQUF2QixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTTtnQkFFSCxTQUFTO3NCQURaLE1BQU07Z0JBS0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUVILFNBQVM7c0JBRFosTUFBTTtnQkFRRyxvQkFBb0I7c0JBQTdCLE1BQU07Z0JBRUgsaUJBQWlCO3NCQURwQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dH0gZnJvbSAnQGFuZ3VsYXIvY29yZSdcclxuaW1wb3J0IHtJdGVtfSBmcm9tICcuL2l0ZW0nO1xyXG5pbXBvcnQge0ludGVyc2VjdGlvbk9ic2VydmVyRGlyZWN0aXZlfSBmcm9tIFwiLi4vLi4vdWkvaW50ZXJzZWN0aW9uLW9ic2VydmVyLmRpcmVjdGl2ZVwiO1xyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cclxuICBzZWxlY3RvcjogJ2FwcC1zcHJwcm9ncmVzcycsXHJcbiAgdGVtcGxhdGU6IGBcclxuXHJcbiAgICA8dGFibGUgY2xhc3M9XCJtYXQtdHlwb2dyYXBoeVwiPlxyXG4gICAgICA8dGhlYWQ+XHJcbiAgICAgIDx0cj5cclxuICAgICAgICA8dGg+IzwvdGg+PCEtLTx0aD5Db2RlPC90aD4tLT5cclxuICAgICAgICA8dGg+UHJvbXB0PC90aD5cclxuICAgICAgICA8dGg+U3RhdHVzPC90aD5cclxuICAgICAgPC90cj5cclxuICAgICAgPC90aGVhZD5cclxuICAgICAgPHRib2R5PlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXRlbXNcIj5cclxuXHJcbiAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGl0ZW1zOyBsZXQgaXRJZHg9aW5kZXg7XCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cInJvd1NlbGVjdD1pdElkeFwiIFtjbGFzcy5zZWxSb3ddPVwiaXRJZHg9PT1zZWxlY3RlZEl0ZW1JZHhcIlxyXG4gICAgICAgICAgICBbdXBkYXRlT2JzZXJ2YXRpb25dPVwie29ic2VydmVyOmlzT2JzLG9ic2VydmU6KGl0SWR4PT09c2VsZWN0ZWRJdGVtSWR4KX1cIj5cclxuICAgICAgICAgIDx0ZD57e2l0SWR4fX08L3RkPlxyXG4gICAgICAgICAgPHRkIGNsYXNzPVwicHJvbXB0RGVzY3JpcHRvclwiPnt7aXRlbS5wcm9tcHRBc1N0cmluZ319PC90ZD5cclxuICAgICAgICAgIDx0ZD5cclxuICAgICAgICAgICAgPG1hdC1pY29uICAqbmdJZj1cIml0ZW0uaXRlbURvbmUoKVwiPmRvbmU8L21hdC1pY29uPlxyXG4gICAgICAgICAgICA8IS0tPG1hdC1pY29uICpuZ0lmPVwibGF0ZXN0UmVjb3JkaW5nQXZhaWwoaXRlbSk9PT1mYWxzZVwiIHN0eWxlPVwiZm9udC1zaXplOjAuNmVtO3dpZHRoOjAuNmVtO2hlaWdodDowLjZlbVwiPmNsb3VkX2Rvd25sb2FkPC9tYXQtaWNvbj4tLT5cclxuXHJcbiAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvdHI+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG5cclxuICAgICAgPC90Ym9keT5cclxuICAgIDwvdGFibGU+XHJcbiAgYCxcclxuICBzdHlsZXM6IFtgOmhvc3Qge1xyXG4gICAgb3ZlcmZsb3cteDogaGlkZGVuO1xyXG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xyXG4gICAgcGFkZGluZzogMTBwdDtcclxuICAgIC8qZmxleDogMC4xIDAgMzAwcHg7XHJcbiAgICAgIG1pbi13aWR0aDogMzAwcHg7ICovXHJcbiAgICBmbGV4OiAwLjEgMCBjb250ZW50O1xyXG4gICAgYmFja2dyb3VuZDogd2hpdGU7XHJcbiAgICAvKiBXb3JrYXJvdW5kIGZvciBGaXJlZm94XHJcbiAgICBJZiB0aGUgcHJvZ3Jlc3MgdGFibGUgZ2V0cyBsb25nIChzY3JpcHQgd2l0aCBtYW55IGl0ZW1zKSBGRiBpbmNyZWFzZXMgdGhlIGhlaWdodCBvZiB0aGUgb3ZlcmZsb3cgcHJvZ3Jlc3NDb250YWluZXIgYW5kXHJcbiAgICB0aGUgd2hvbGUgYXBwIGRvZXMgbm90IGZpdCBpbnRvIHRoZSBwYWdlIGFueW1vcmUuIFRoZSBhcHAgb3ZlcmZsb3dzIGFuZCBzaG93cyBhIHZlcnRpY2FsIHNjcm9sbGJhciBmb3IgdGhlIHdob2xlIGFwcC5cclxuICAgIFNlZSBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yODYzNjgzMi9maXJlZm94LW92ZXJmbG93LXktbm90LXdvcmtpbmctd2l0aC1uZXN0ZWQtZmxleGJveFxyXG4gICAgKi9cclxuICAgIC8qIG1pbi1oZWlnaHQ6MHB4OyAqL1xyXG4gICAgbWluLWhlaWdodDogMXB4O1xyXG4gIH1gLFxyXG4gICAgICBgdGFibGUge1xyXG4gICAgICAgICAgICAgbWluLWhlaWdodDogMXB4O1xyXG4gICAgICAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcclxuICAgICAgICAgICAgICAgICAvKiBUYWJsZXMgZG8gbm90IGhhdmUgYSBuYXR1cmFsIG1pbiBzaXplICovXHJcbiAgICAgICAgICAgICAgICAgLyptaW4td2lkdGg6IDMwMHB4OyAqL1xyXG4gICAgICAgXHJcbiAgICAgICAgICAgfVxyXG4gICAgICAgXHJcbiAgICAgICAgICAgdGFibGUsIHRoLCB0ZCB7XHJcbiAgICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBsaWdodGdyZXk7XHJcbiAgICAgICAgICAgICBwYWRkaW5nOiAwLjVlbTtcclxuICAgICAgIFxyXG4gICAgICAgICAgIH1cclxuICAgICAgIFxyXG4gICAgICAgICAgIGAsIGBcclxuICAgICAgLnNlbFJvdyB7XHJcbiAgICAgICAgYmFja2dyb3VuZDogbGlnaHRibHVlO1xyXG4gICAgICB9XHJcbiAgICBgLGAucHJvbXB0RGVzY3JpcHRvcntcclxuXHJcbiAgICAgIG1heC13aWR0aDogMjAwcHg7XHJcbiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xyXG4gICAgICBvdmVyZmxvdzogaGlkZGVuO1xyXG4gICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xyXG4gICAgfWBdXHJcblxyXG59KVxyXG5leHBvcnQgY2xhc3MgUHJvZ3Jlc3Mge1xyXG4gIGlzT2JzOkludGVyc2VjdGlvbk9ic2VydmVyO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxSZWY6RWxlbWVudFJlZikge1xyXG4gICAgdGhpcy5pc09icz1uZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaXNlPT57XHJcbiAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkludGVyc2VjdGlvbiBjaGFuZ2VkOiBcIik7XHJcbiAgICAgIGlzZS5mb3JFYWNoKChpc2VlKT0+e1xyXG4gICAgICAgIC8vY29uc29sZS5kZWJ1ZyhcIkludGVyc2VjdGlvbjogXCIraXNlZS5pc0ludGVyc2VjdGluZysnICcraXNlZS5pbnRlcnNlY3Rpb25SYXRpbyk7XHJcbiAgICAgICAgaWYoaXNlZS5pbnRlcnNlY3Rpb25SYXRpbzwxKXtcclxuICAgICAgICAgIGlzZWUudGFyZ2V0LnNjcm9sbEludG9WaWV3KGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMuaXNPYnMudW5vYnNlcnZlKGlzZWUudGFyZ2V0KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gICAgfSx7cm9vdDp0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnR9KVxyXG4gIH1cclxuICBASW5wdXQoKSBpdGVtczogQXJyYXk8SXRlbT58dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICBASW5wdXQoKSBzZWxlY3RlZEl0ZW1JZHggPSAwO1xyXG4gIEBJbnB1dCgpIGVuYWJsZURvd25sb2FkOiBib29sZWFuPWZhbHNlO1xyXG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xyXG4gIEBPdXRwdXQoKVxyXG4gIHNldCByb3dTZWxlY3Qocm93SWR4Om51bWJlcil7XHJcbiAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQocm93SWR4KTtcclxuICB9XHJcblxyXG4gIEBPdXRwdXQoKSBvblNob3dEb25lQWN0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpXHJcbiAgc2V0IGNsaWNrRG9uZShyb3dJZHg6bnVtYmVyKXtcclxuICAgIGlmKHRoaXMuaXRlbXMgJiZ0aGlzLml0ZW1zW3Jvd0lkeF0gJiYgdGhpcy5pdGVtc1tyb3dJZHhdLnJlY3MpIHtcclxuICAgICAgdGhpcy5vblJvd1NlbGVjdC5lbWl0KHJvd0lkeCk7XHJcbiAgICAgIHRoaXMub25TaG93RG9uZUFjdGlvbi5lbWl0KHJvd0lkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBAT3V0cHV0KCkgb25Eb3dubG9hZERvbmVBY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcclxuICBAT3V0cHV0KClcclxuICBzZXQgY2xpY2tEb3dubG9hZERvbmUocm93SWR4Om51bWJlcil7XHJcbiAgICBpZih0aGlzLml0ZW1zICYmIHRoaXMuaXRlbXNbcm93SWR4XSAmJiB0aGlzLml0ZW1zW3Jvd0lkeF0ucmVjcykge1xyXG4gICAgICB0aGlzLm9uUm93U2VsZWN0LmVtaXQocm93SWR4KTtcclxuICAgICAgdGhpcy5vbkRvd25sb2FkRG9uZUFjdGlvbi5lbWl0KHJvd0lkeCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBsYXRlc3RSZWNvcmRpbmdBdmFpbChpdGVtOkl0ZW0pOmJvb2xlYW58bnVsbHtcclxuICAgIGxldCBjYWNoZWQ9bnVsbDtcclxuICAgIGlmKGl0ZW0gJiYgaXRlbS5yZWNzKXtcclxuICAgICAgbGV0IHJlY3NMZW49aXRlbS5yZWNzLmxlbmd0aDtcclxuICAgICAgaWYocmVjc0xlbj4wKXtcclxuICAgICAgICBsZXQgcmY9aXRlbS5yZWNzW3JlY3NMZW4tMV07XHJcbiAgICAgICAgaWYocmYgJiYgcmYuc2VydmVyUGVyc2lzdGVkKSB7XHJcbiAgICAgICAgICBjYWNoZWQgPSAocmYuYXVkaW9EYXRhSG9sZGVyICE9IG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNhY2hlZDtcclxuICB9XHJcblxyXG59XHJcbiJdfQ==