speechrecorderng 3.6.0 → 3.8.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 (220) hide show
  1. package/esm2022/lib/action/action.mjs +73 -0
  2. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer.mjs +163 -163
  3. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_input_stream.mjs +85 -85
  4. package/{esm2020 → esm2022}/lib/audio/array_audio_buffer_random_access_stream.mjs +15 -15
  5. package/esm2022/lib/audio/audio_data_holder.mjs +264 -0
  6. package/{esm2020 → esm2022}/lib/audio/audio_display.mjs +93 -93
  7. package/{esm2020 → esm2022}/lib/audio/audio_player.mjs +213 -213
  8. package/esm2022/lib/audio/capture/capture.mjs +855 -0
  9. package/esm2022/lib/audio/context.mjs +79 -0
  10. package/{esm2020 → esm2022}/lib/audio/dsp/level_measure.mjs +515 -515
  11. package/{esm2020 → esm2022}/lib/audio/format.mjs +16 -16
  12. package/esm2022/lib/audio/impl/wavformat.mjs +6 -0
  13. package/{esm2020 → esm2022}/lib/audio/impl/wavreader.mjs +133 -133
  14. package/esm2022/lib/audio/impl/wavwriter.mjs +105 -0
  15. package/esm2022/lib/audio/inddb_audio_buffer.mjs +508 -0
  16. package/{esm2020 → esm2022}/lib/audio/io/stream.mjs +58 -58
  17. package/esm2022/lib/audio/net_audio_buffer.mjs +293 -0
  18. package/{esm2020 → esm2022}/lib/audio/persistor.mjs +80 -80
  19. package/{esm2020 → esm2022}/lib/audio/playback/array_audio_buffer_source_node.mjs +125 -125
  20. package/esm2022/lib/audio/playback/audio_source_node.mjs +18 -0
  21. package/esm2022/lib/audio/playback/audio_source_worklet_module_loader.mjs +167 -0
  22. package/{esm2020 → esm2022}/lib/audio/playback/inddb_audio_buffer_source_node.mjs +166 -166
  23. package/{esm2020 → esm2022}/lib/audio/playback/net_audio_buffer_source_node.mjs +217 -217
  24. package/esm2022/lib/audio/playback/player.mjs +402 -0
  25. package/esm2022/lib/audio/ui/audio_canvas_layer_comp.mjs +347 -0
  26. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_control.mjs +65 -65
  27. package/{esm2020 → esm2022}/lib/audio/ui/audio_display_scroll_pane.mjs +139 -139
  28. package/{esm2020 → esm2022}/lib/audio/ui/audiosignal.mjs +524 -524
  29. package/{esm2020 → esm2022}/lib/audio/ui/common.mjs +18 -18
  30. package/esm2022/lib/audio/ui/container.mjs +414 -0
  31. package/{esm2020 → esm2022}/lib/audio/ui/livelevel.mjs +352 -352
  32. package/esm2022/lib/audio/ui/scroll_pane_horizontal.mjs +11 -0
  33. package/esm2022/lib/audio/ui/sonagram.mjs +900 -0
  34. package/esm2022/lib/db/inddb.mjs +120 -0
  35. package/esm2022/lib/dsp/utils.mjs +48 -0
  36. package/{esm2020 → esm2022}/lib/io/BinaryReader.mjs +84 -84
  37. package/esm2022/lib/io/BinaryWriter.mjs +74 -0
  38. package/{esm2020 → esm2022}/lib/io/stream.mjs +258 -258
  39. package/{esm2020 → esm2022}/lib/math/2d/geometry.mjs +27 -27
  40. package/esm2022/lib/math/complex.mjs +58 -0
  41. package/{esm2020 → esm2022}/lib/math/dft.mjs +195 -195
  42. package/{esm2020 → esm2022}/lib/media/utils.mjs +13 -13
  43. package/esm2022/lib/net/uploader.mjs +367 -0
  44. package/{esm2020 → esm2022}/lib/recorder_component.mjs +64 -64
  45. package/esm2022/lib/speechrecorder/project/project.mjs +49 -0
  46. package/esm2022/lib/speechrecorder/project/project.service.mjs +64 -0
  47. package/{esm2020 → esm2022}/lib/speechrecorder/recording.mjs +123 -123
  48. package/esm2022/lib/speechrecorder/recordings/basic_recording.service.mjs +218 -0
  49. package/esm2022/lib/speechrecorder/recordings/recordings.service.mjs +1014 -0
  50. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.mjs +114 -114
  51. package/{esm2020 → esm2022}/lib/speechrecorder/script/script.service.mjs +47 -47
  52. package/esm2022/lib/speechrecorder/session/audiorecorder.mjs +1179 -0
  53. package/esm2022/lib/speechrecorder/session/basicrecorder.mjs +668 -0
  54. package/esm2022/lib/speechrecorder/session/controlpanel.mjs +416 -0
  55. package/{esm2020 → esm2022}/lib/speechrecorder/session/item.mjs +29 -29
  56. package/{esm2020 → esm2022}/lib/speechrecorder/session/progress.mjs +69 -69
  57. package/{esm2020 → esm2022}/lib/speechrecorder/session/prompting.mjs +571 -571
  58. package/{esm2020 → esm2022}/lib/speechrecorder/session/recorder_combi_pane.mjs +65 -65
  59. package/esm2022/lib/speechrecorder/session/recording_file_cache.mjs +195 -0
  60. package/{esm2020 → esm2022}/lib/speechrecorder/session/recording_list.mjs +103 -103
  61. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-meta.component.mjs +63 -63
  62. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-navi.component.mjs +51 -51
  63. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.mjs +104 -104
  64. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file-view.component.mjs +381 -381
  65. package/{esm2020 → esm2022}/lib/speechrecorder/session/recordingfile/recording-file.mjs +67 -67
  66. package/esm2022/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +288 -0
  67. package/{esm2020 → esm2022}/lib/speechrecorder/session/session.mjs +1 -1
  68. package/esm2022/lib/speechrecorder/session/session.service.mjs +69 -0
  69. package/{esm2020 → esm2022}/lib/speechrecorder/session/session_finished_dialog.mjs +29 -29
  70. package/esm2022/lib/speechrecorder/session/sessionmanager.mjs +1386 -0
  71. package/{esm2020 → esm2022}/lib/speechrecorder/session/warning_bar.mjs +28 -28
  72. package/{esm2020 → esm2022}/lib/speechrecorder/spruploader.mjs +22 -22
  73. package/{esm2020 → esm2022}/lib/speechrecorder/startstopsignal/startstopsignal.mjs +1 -1
  74. package/esm2022/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +57 -0
  75. package/{esm2020 → esm2022}/lib/speechrecorderng.component.mjs +388 -388
  76. package/{esm2020 → esm2022}/lib/speechrecorderng.module.mjs +100 -100
  77. package/{esm2020 → esm2022}/lib/spr.config.mjs +26 -26
  78. package/{esm2020 → esm2022}/lib/spr.module.version.mjs +2 -2
  79. package/{esm2020 → esm2022}/lib/ui/canvas_layer_comp.mjs +38 -38
  80. package/{esm2020 → esm2022}/lib/ui/message_dialog.mjs +30 -30
  81. package/esm2022/lib/ui/recordingitem_display.mjs +253 -0
  82. package/{esm2020 → esm2022}/lib/ui/responsive_component.mjs +24 -24
  83. package/{esm2020 → esm2022}/lib/utils/scrollIntoViewToBottom.mjs +23 -23
  84. package/esm2022/lib/utils/ua-parser.mjs +190 -0
  85. package/esm2022/lib/utils/utils.mjs +105 -0
  86. package/esm2022/lib/utils/wake_lock.mjs +114 -0
  87. package/{esm2020 → esm2022}/lib/utils/wake_lock_media.mjs +1 -1
  88. package/{esm2020 → esm2022}/public-api.mjs +33 -33
  89. package/{esm2020 → esm2022}/speechrecorderng.mjs +4 -4
  90. package/{fesm2020 → fesm2022}/speechrecorderng.mjs +16518 -16454
  91. package/fesm2022/speechrecorderng.mjs.map +1 -0
  92. package/index.d.ts +5 -5
  93. package/lib/action/action.d.ts +27 -27
  94. package/lib/audio/array_audio_buffer.d.ts +31 -31
  95. package/lib/audio/array_audio_buffer_input_stream.d.ts +14 -14
  96. package/lib/audio/array_audio_buffer_random_access_stream.d.ts +9 -9
  97. package/lib/audio/audio_data_holder.d.ts +84 -84
  98. package/lib/audio/audio_display.d.ts +36 -36
  99. package/lib/audio/audio_player.d.ts +47 -47
  100. package/lib/audio/capture/capture.d.ts +67 -67
  101. package/lib/audio/context.d.ts +6 -6
  102. package/lib/audio/dsp/level_measure.d.ts +60 -60
  103. package/lib/audio/format.d.ts +11 -11
  104. package/lib/audio/impl/wavformat.d.ts +5 -5
  105. package/lib/audio/impl/wavreader.d.ts +16 -16
  106. package/lib/audio/impl/wavwriter.d.ts +13 -13
  107. package/lib/audio/inddb_audio_buffer.d.ts +68 -68
  108. package/lib/audio/io/stream.d.ts +28 -28
  109. package/lib/audio/net_audio_buffer.d.ts +57 -57
  110. package/lib/audio/persistor.d.ts +29 -29
  111. package/lib/audio/playback/array_audio_buffer_source_node.d.ts +18 -18
  112. package/lib/audio/playback/audio_source_node.d.ts +10 -10
  113. package/lib/audio/playback/audio_source_worklet_module_loader.d.ts +4 -4
  114. package/lib/audio/playback/inddb_audio_buffer_source_node.d.ts +21 -21
  115. package/lib/audio/playback/net_audio_buffer_source_node.d.ts +27 -27
  116. package/lib/audio/playback/player.d.ts +65 -65
  117. package/lib/audio/ui/audio_canvas_layer_comp.d.ts +68 -68
  118. package/lib/audio/ui/audio_display_control.d.ts +25 -25
  119. package/lib/audio/ui/audio_display_scroll_pane.d.ts +26 -26
  120. package/lib/audio/ui/audiosignal.d.ts +30 -30
  121. package/lib/audio/ui/common.d.ts +11 -11
  122. package/lib/audio/ui/container.d.ts +63 -63
  123. package/lib/audio/ui/livelevel.d.ts +60 -60
  124. package/lib/audio/ui/scroll_pane_horizontal.d.ts +5 -5
  125. package/lib/audio/ui/sonagram.d.ts +37 -37
  126. package/lib/db/inddb.d.ts +21 -21
  127. package/lib/dsp/utils.d.ts +19 -19
  128. package/lib/io/BinaryReader.d.ts +18 -18
  129. package/lib/io/BinaryWriter.d.ts +15 -15
  130. package/lib/io/stream.d.ts +59 -59
  131. package/lib/math/2d/geometry.d.ts +18 -18
  132. package/lib/math/complex.d.ts +17 -17
  133. package/lib/math/dft.d.ts +22 -22
  134. package/lib/media/utils.d.ts +3 -3
  135. package/lib/net/uploader.d.ts +81 -81
  136. package/lib/recorder_component.d.ts +16 -16
  137. package/lib/speechrecorder/project/project.d.ts +59 -59
  138. package/lib/speechrecorder/project/project.service.d.ts +21 -21
  139. package/lib/speechrecorder/recording.d.ts +51 -51
  140. package/lib/speechrecorder/recordings/basic_recording.service.d.ts +27 -27
  141. package/lib/speechrecorder/recordings/recordings.service.d.ts +48 -48
  142. package/lib/speechrecorder/script/script.d.ts +80 -79
  143. package/lib/speechrecorder/script/script.service.d.ts +16 -16
  144. package/lib/speechrecorder/session/audiorecorder.d.ts +122 -122
  145. package/lib/speechrecorder/session/basicrecorder.d.ts +139 -139
  146. package/lib/speechrecorder/session/controlpanel.d.ts +109 -107
  147. package/lib/speechrecorder/session/item.d.ts +12 -12
  148. package/lib/speechrecorder/session/progress.d.ts +17 -17
  149. package/lib/speechrecorder/session/prompting.d.ts +121 -121
  150. package/lib/speechrecorder/session/recorder_combi_pane.d.ts +32 -32
  151. package/lib/speechrecorder/session/recording_file_cache.d.ts +33 -33
  152. package/lib/speechrecorder/session/recording_list.d.ts +24 -24
  153. package/lib/speechrecorder/session/recordingfile/recording-file-meta.component.d.ts +15 -15
  154. package/lib/speechrecorder/session/recordingfile/recording-file-navi.component.d.ts +20 -20
  155. package/lib/speechrecorder/session/recordingfile/recording-file-u-i.component.d.ts +31 -31
  156. package/lib/speechrecorder/session/recordingfile/recording-file-view.component.d.ts +55 -55
  157. package/lib/speechrecorder/session/recordingfile/recording-file.d.ts +7 -7
  158. package/lib/speechrecorder/session/recordingfile/recordingfile-service.d.ts +24 -24
  159. package/lib/speechrecorder/session/session.d.ts +15 -15
  160. package/lib/speechrecorder/session/session.service.d.ts +20 -20
  161. package/lib/speechrecorder/session/session_finished_dialog.d.ts +10 -10
  162. package/lib/speechrecorder/session/sessionmanager.d.ts +129 -123
  163. package/lib/speechrecorder/session/warning_bar.d.ts +8 -8
  164. package/lib/speechrecorder/spruploader.d.ts +11 -11
  165. package/lib/speechrecorder/startstopsignal/startstopsignal.d.ts +10 -10
  166. package/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.d.ts +11 -11
  167. package/lib/speechrecorderng.component.d.ts +61 -61
  168. package/lib/speechrecorderng.module.d.ts +56 -56
  169. package/lib/spr.config.d.ts +17 -17
  170. package/lib/spr.module.version.d.ts +1 -1
  171. package/lib/ui/canvas_layer_comp.d.ts +13 -13
  172. package/lib/ui/message_dialog.d.ts +10 -10
  173. package/lib/ui/recordingitem_display.d.ts +84 -84
  174. package/lib/ui/responsive_component.d.ts +9 -9
  175. package/lib/utils/scrollIntoViewToBottom.d.ts +9 -9
  176. package/lib/utils/ua-parser.d.ts +43 -43
  177. package/lib/utils/utils.d.ts +19 -19
  178. package/lib/utils/wake_lock.d.ts +23 -23
  179. package/lib/utils/wake_lock_media.d.ts +1 -1
  180. package/package.json +17 -23
  181. package/public-api.d.ts +33 -33
  182. package/esm2020/lib/action/action.mjs +0 -73
  183. package/esm2020/lib/audio/audio_data_holder.mjs +0 -264
  184. package/esm2020/lib/audio/capture/capture.mjs +0 -855
  185. package/esm2020/lib/audio/context.mjs +0 -79
  186. package/esm2020/lib/audio/impl/wavformat.mjs +0 -6
  187. package/esm2020/lib/audio/impl/wavwriter.mjs +0 -105
  188. package/esm2020/lib/audio/inddb_audio_buffer.mjs +0 -508
  189. package/esm2020/lib/audio/net_audio_buffer.mjs +0 -293
  190. package/esm2020/lib/audio/playback/audio_source_node.mjs +0 -18
  191. package/esm2020/lib/audio/playback/audio_source_worklet_module_loader.mjs +0 -167
  192. package/esm2020/lib/audio/playback/player.mjs +0 -402
  193. package/esm2020/lib/audio/ui/audio_canvas_layer_comp.mjs +0 -347
  194. package/esm2020/lib/audio/ui/container.mjs +0 -414
  195. package/esm2020/lib/audio/ui/scroll_pane_horizontal.mjs +0 -11
  196. package/esm2020/lib/audio/ui/sonagram.mjs +0 -900
  197. package/esm2020/lib/db/inddb.mjs +0 -120
  198. package/esm2020/lib/dsp/utils.mjs +0 -48
  199. package/esm2020/lib/io/BinaryWriter.mjs +0 -74
  200. package/esm2020/lib/math/complex.mjs +0 -58
  201. package/esm2020/lib/net/uploader.mjs +0 -367
  202. package/esm2020/lib/speechrecorder/project/project.mjs +0 -49
  203. package/esm2020/lib/speechrecorder/project/project.service.mjs +0 -64
  204. package/esm2020/lib/speechrecorder/recordings/basic_recording.service.mjs +0 -216
  205. package/esm2020/lib/speechrecorder/recordings/recordings.service.mjs +0 -1014
  206. package/esm2020/lib/speechrecorder/session/audiorecorder.mjs +0 -1179
  207. package/esm2020/lib/speechrecorder/session/basicrecorder.mjs +0 -666
  208. package/esm2020/lib/speechrecorder/session/controlpanel.mjs +0 -409
  209. package/esm2020/lib/speechrecorder/session/recording_file_cache.mjs +0 -195
  210. package/esm2020/lib/speechrecorder/session/recordingfile/recordingfile-service.mjs +0 -288
  211. package/esm2020/lib/speechrecorder/session/session.service.mjs +0 -69
  212. package/esm2020/lib/speechrecorder/session/sessionmanager.mjs +0 -1333
  213. package/esm2020/lib/speechrecorder/startstopsignal/ui/simpletrafficlight.mjs +0 -57
  214. package/esm2020/lib/ui/recordingitem_display.mjs +0 -253
  215. package/esm2020/lib/utils/ua-parser.mjs +0 -190
  216. package/esm2020/lib/utils/utils.mjs +0 -105
  217. package/esm2020/lib/utils/wake_lock.mjs +0 -114
  218. package/fesm2015/speechrecorderng.mjs +0 -17708
  219. package/fesm2015/speechrecorderng.mjs.map +0 -1
  220. package/fesm2020/speechrecorderng.mjs.map +0 -1
@@ -1,347 +0,0 @@
1
- import { CanvasLayerComponent } from "../../ui/canvas_layer_comp";
2
- import { Selection } from '../persistor';
3
- import { EventEmitter, HostListener, Input, Output, ViewChild, Directive } from "@angular/core";
4
- import { Marker } from "./common";
5
- import * as i0 from "@angular/core";
6
- export class ViewSelection {
7
- constructor(_startX, _endX) {
8
- this._startX = _startX;
9
- this._endX = _endX;
10
- }
11
- get startX() {
12
- return this._startX;
13
- }
14
- get endX() {
15
- return this._endX;
16
- }
17
- width() {
18
- return this._endX - this._startX;
19
- }
20
- }
21
- export class BasicAudioCanvasLayerComponent extends CanvasLayerComponent {
22
- constructor() {
23
- super(...arguments);
24
- this._audioDataHolder = null;
25
- this._bgColor = 'white';
26
- this._selectColor = 'rgba(0%,0%,100%,25%)';
27
- }
28
- /**
29
- * Returns pixel position depending on current zoom setting.
30
- * @param framePos audio frame (sample) position
31
- */
32
- frameToXPixelPosition(framePos) {
33
- let pixelPos = null;
34
- let frameLength = this._audioDataHolder?.frameLen;
35
- if (frameLength !== undefined) {
36
- let vw;
37
- if (this.bounds) {
38
- vw = this.bounds.dimension.width;
39
- }
40
- if (this.virtualDimension) {
41
- vw = this.virtualDimension.width;
42
- }
43
- if (vw !== undefined) {
44
- pixelPos = framePos * vw / frameLength;
45
- }
46
- }
47
- return pixelPos;
48
- }
49
- /**
50
- * Returns pixel position in view port (visible window of scroll pane).
51
- * @param framePos audio frame (sample) position
52
- */
53
- frameToViewPortXPixelPosition(framePos) {
54
- let pixelPos = this.frameToXPixelPosition(framePos);
55
- if (pixelPos != null) {
56
- return this.toXViewPortPixelPosition(pixelPos);
57
- }
58
- else {
59
- return null;
60
- }
61
- }
62
- viewPortXPixelToFramePosition(xViewPortPixelPos) {
63
- let vpXframePos = null;
64
- const frameLength = this._audioDataHolder?.frameLen;
65
- if (frameLength !== undefined) {
66
- let vw = undefined;
67
- if (this.bounds) {
68
- vw = this.bounds.dimension.width;
69
- }
70
- if (this.virtualDimension) {
71
- vw = this.virtualDimension.width;
72
- }
73
- if (vw !== undefined) {
74
- const xVirtualPixelPos = this.toXVirtualPixelPosition(xViewPortPixelPos);
75
- const framesPerPixel = frameLength / vw;
76
- let framePos = framesPerPixel * xVirtualPixelPos;
77
- if (framePos < 0) {
78
- framePos = 0;
79
- }
80
- if (framePos >= frameLength) {
81
- framePos = frameLength - 1;
82
- }
83
- vpXframePos = Math.round(framePos);
84
- }
85
- }
86
- return vpXframePos;
87
- }
88
- layoutBounds(bounds, virtualDimension, redraw) {
89
- this.bounds = bounds;
90
- this.virtualDimension = virtualDimension;
91
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
92
- const cl = this.canvasLayers[ci];
93
- const leftStyle = bounds.position.left + 'px';
94
- if (cl.style.left != leftStyle) {
95
- cl.style.left = leftStyle;
96
- }
97
- const topStyle = bounds.position.top + 'px';
98
- if (cl.style.top != topStyle) {
99
- cl.style.top = topStyle;
100
- }
101
- }
102
- if (bounds.dimension.width) {
103
- const intW = Math.floor(bounds.dimension.width);
104
- if (redraw) {
105
- // Do not set width of background canvas (causes flicker on start render)
106
- for (let ci = 1; ci < this.canvasLayers.length; ci++) {
107
- let cl = this.canvasLayers[ci];
108
- if (cl.width != intW) {
109
- cl.width = intW;
110
- }
111
- }
112
- }
113
- const wStr = intW.toString() + 'px';
114
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
115
- let cl = this.canvasLayers[ci];
116
- if (cl.style.width != wStr) {
117
- cl.style.width = wStr;
118
- }
119
- }
120
- }
121
- if (bounds.dimension.height) {
122
- const intH = Math.floor(bounds.dimension.height);
123
- if (redraw) {
124
- // Do not set height of background canvas (causes flicker on start render)
125
- for (let ci = 1; ci < this.canvasLayers.length; ci++) {
126
- let cl = this.canvasLayers[ci];
127
- if (cl.height != intH) {
128
- cl.height = intH;
129
- }
130
- }
131
- }
132
- const hStr = intH + 'px';
133
- for (let ci = 0; ci < this.canvasLayers.length; ci++) {
134
- let cl = this.canvasLayers[ci];
135
- if (cl.style.height != hStr) {
136
- cl.style.height = hStr;
137
- }
138
- }
139
- }
140
- }
141
- }
142
- BasicAudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BasicAudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
143
- BasicAudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: BasicAudioCanvasLayerComponent, usesInheritance: true, ngImport: i0 });
144
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: BasicAudioCanvasLayerComponent, decorators: [{
145
- type: Directive
146
- }] });
147
- export class AudioCanvasLayerComponent extends BasicAudioCanvasLayerComponent {
148
- constructor() {
149
- super(...arguments);
150
- this._pointerPosition = null;
151
- this.selectStartX = null;
152
- this._selecting = null;
153
- this._selection = null;
154
- this.pointerPositionEventEmitter = new EventEmitter();
155
- this.selectingEventEmitter = new EventEmitter();
156
- this.selectedEventEmitter = new EventEmitter();
157
- }
158
- onMouseup(me) {
159
- this.selectionCommit(me);
160
- }
161
- layoutBounds(bounds, virtualDimension, redraw, clear = true) {
162
- super.layoutBounds(bounds, virtualDimension, redraw);
163
- if (redraw) {
164
- this.startDraw(clear);
165
- }
166
- }
167
- set pointerPosition(pointerPosition) {
168
- this._pointerPosition = pointerPosition;
169
- this.drawCursorLayer();
170
- }
171
- set selecting(selecting) {
172
- this._selecting = selecting;
173
- this.drawBg();
174
- this.drawCursorLayer();
175
- }
176
- get selecting() {
177
- return this._selecting;
178
- }
179
- set selection(selection) {
180
- this._selection = selection;
181
- this.selecting = null;
182
- this.drawBg();
183
- this.drawCursorLayer();
184
- }
185
- get selection() {
186
- return this._selection;
187
- }
188
- selectionStart(me) {
189
- this.selectStartX = me.offsetX;
190
- }
191
- selectionCommit(me) {
192
- let vs = null;
193
- if (this.selectStartX != null) {
194
- vs = new ViewSelection(this.selectStartX, me.offsetX);
195
- this.selectStartX = null;
196
- this.select(vs);
197
- }
198
- }
199
- updateCursorCanvas(me, showCursorPosition = true) {
200
- if (this.cursorCanvas) {
201
- if (me) {
202
- if (this.selectStartX) {
203
- this.pointerPositionChanged(null);
204
- this.selectingChange(new ViewSelection(this.selectStartX, me.offsetX));
205
- }
206
- else {
207
- if (showCursorPosition) {
208
- this.pointerPositionChanged(me.offsetX);
209
- }
210
- else {
211
- this.pointerPositionChanged(null);
212
- }
213
- }
214
- }
215
- }
216
- }
217
- pointerPositionChanged(xPosition) {
218
- let pointerPosition = undefined;
219
- if (xPosition) {
220
- pointerPosition = new Marker();
221
- let vpXPos = this.viewPortXPixelToFramePosition(xPosition);
222
- if (vpXPos != null) {
223
- pointerPosition.framePosition = vpXPos;
224
- }
225
- }
226
- this.pointerPositionEventEmitter.emit(pointerPosition);
227
- }
228
- _selectingChange(viewSel) {
229
- let ns = undefined;
230
- if (viewSel) {
231
- let frameStart = this.viewPortXPixelToFramePosition(viewSel.startX);
232
- let frameEnd = this.viewPortXPixelToFramePosition(viewSel.endX);
233
- if (this._audioDataHolder && frameStart != null && frameEnd != null) {
234
- ns = new Selection(this._audioDataHolder.sampleRate, frameStart, frameEnd);
235
- }
236
- }
237
- return ns;
238
- }
239
- selectingChange(viewSel) {
240
- const ns = this._selectingChange(viewSel);
241
- this.selectingEventEmitter.emit(ns);
242
- }
243
- select(viewSel) {
244
- const ns = this._selectingChange(viewSel);
245
- this.selectedEventEmitter.emit(ns);
246
- }
247
- viewSelection() {
248
- let vs = null;
249
- let s = null;
250
- if (this._selecting) {
251
- s = this._selecting;
252
- }
253
- else if (this._selection) {
254
- s = this._selection;
255
- }
256
- if (s) {
257
- const sf = s.startFrame;
258
- const ef = s.endFrame;
259
- const xs = this.frameToViewPortXPixelPosition(sf);
260
- const xe = this.frameToViewPortXPixelPosition(ef);
261
- if (xs != null && xe != null) {
262
- vs = new ViewSelection(xs, xe);
263
- }
264
- }
265
- return vs;
266
- }
267
- drawBg() {
268
- if (this.bgCanvas && this.bounds) {
269
- this.bgCanvas.style.left = Math.round(this.bounds.position.left).toString() + 'px';
270
- this.bgCanvas.width = Math.round(this.bounds.dimension.width);
271
- this.bgCanvas.height = Math.round(this.bounds.dimension.height);
272
- let g1 = this.bgCanvas.getContext("2d");
273
- if (g1) {
274
- const w = this.bgCanvas.width;
275
- const h = this.bgCanvas.height;
276
- g1.clearRect(0, 0, w, h);
277
- if (this._bgColor) {
278
- g1.fillStyle = this._bgColor;
279
- g1.fillRect(0, 0, w, h);
280
- }
281
- let vs = this.viewSelection();
282
- if (vs) {
283
- g1.fillStyle = this._selectColor;
284
- g1.fillRect(vs.startX, 0, vs.width(), h);
285
- }
286
- }
287
- }
288
- }
289
- drawCursorLayer() {
290
- if (this.cursorCanvas) {
291
- const w = this.cursorCanvas.width;
292
- const h = this.cursorCanvas.height;
293
- const g = this.cursorCanvas.getContext("2d");
294
- if (g) {
295
- g.clearRect(0, 0, w, h);
296
- if (this._pointerPosition) {
297
- let framePos = this._pointerPosition.framePosition;
298
- if (framePos) {
299
- let xViewPortPixelpos = this.frameToViewPortXPixelPosition(framePos);
300
- if (xViewPortPixelpos) {
301
- g.fillStyle = 'yellow';
302
- g.strokeStyle = 'yellow';
303
- g.beginPath();
304
- g.moveTo(xViewPortPixelpos, 0);
305
- g.lineTo(xViewPortPixelpos, h);
306
- g.closePath();
307
- g.stroke();
308
- if (this._audioDataHolder) {
309
- g.font = '14px sans-serif';
310
- g.fillStyle = 'yellow';
311
- g.fillText(framePos.toString(), xViewPortPixelpos + 2, 50);
312
- }
313
- }
314
- }
315
- }
316
- }
317
- }
318
- }
319
- }
320
- AudioCanvasLayerComponent.ENABLE_STREAMING_NUMBER_OF_SAMPLES_THRESHOLD = 10 * 60 * 48000; // Use streaming/chunking if audio clip has more than this number of samples
321
- AudioCanvasLayerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioCanvasLayerComponent, deps: null, target: i0.ɵɵFactoryTarget.Directive });
322
- AudioCanvasLayerComponent.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "14.2.12", type: AudioCanvasLayerComponent, inputs: { pointerPosition: "pointerPosition", selecting: "selecting", selection: "selection" }, outputs: { pointerPositionEventEmitter: "pointerPositionEventEmitter", selectingEventEmitter: "selectingEventEmitter", selectedEventEmitter: "selectedEventEmitter" }, host: { listeners: { "document:mouseup": "onMouseup($event)" } }, viewQueries: [{ propertyName: "bgCanvasRef", first: true, predicate: ["bg"], descendants: true, static: true }, { propertyName: "cursorCanvasRef", first: true, predicate: ["cursor"], descendants: true, static: true }], usesInheritance: true, ngImport: i0 });
323
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.12", ngImport: i0, type: AudioCanvasLayerComponent, decorators: [{
324
- type: Directive
325
- }], propDecorators: { bgCanvasRef: [{
326
- type: ViewChild,
327
- args: ['bg', { static: true }]
328
- }], cursorCanvasRef: [{
329
- type: ViewChild,
330
- args: ['cursor', { static: true }]
331
- }], onMouseup: [{
332
- type: HostListener,
333
- args: ['document:mouseup', ['$event']]
334
- }], pointerPosition: [{
335
- type: Input
336
- }], selecting: [{
337
- type: Input
338
- }], selection: [{
339
- type: Input
340
- }], pointerPositionEventEmitter: [{
341
- type: Output
342
- }], selectingEventEmitter: [{
343
- type: Output
344
- }], selectedEventEmitter: [{
345
- type: Output
346
- }] } });
347
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXVkaW9fY2FudmFzX2xheWVyX2NvbXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvYXVkaW8vdWkvYXVkaW9fY2FudmFzX2xheWVyX2NvbXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGNBQWMsQ0FBQTtBQUN0QyxPQUFPLEVBQWMsWUFBWSxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQzs7QUFLaEMsTUFBTSxPQUFPLGFBQWE7SUFheEIsWUFBb0IsT0FBYyxFQUFVLEtBQVk7UUFBcEMsWUFBTyxHQUFQLE9BQU8sQ0FBTztRQUFVLFVBQUssR0FBTCxLQUFLLENBQU87SUFBRSxDQUFDO0lBWjNELElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxLQUFLO1FBQ0gsT0FBTyxJQUFJLENBQUMsS0FBSyxHQUFDLElBQUksQ0FBQyxPQUFPLENBQUE7SUFDaEMsQ0FBQztDQUdGO0FBR0QsTUFBTSxPQUFnQiw4QkFBK0IsU0FBUSxvQkFBb0I7SUFEakY7O1FBRVkscUJBQWdCLEdBQXVCLElBQUksQ0FBQztRQUM1QyxhQUFRLEdBQWEsT0FBTyxDQUFDO1FBQzdCLGlCQUFZLEdBQUMsc0JBQXNCLENBQUM7S0FzSC9DO0lBcEhDOzs7T0FHRztJQUNILHFCQUFxQixDQUFDLFFBQWdCO1FBQ3BDLElBQUksUUFBUSxHQUFDLElBQUksQ0FBQztRQUNsQixJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsUUFBUSxDQUFDO1FBRWxELElBQUcsV0FBVyxLQUFHLFNBQVMsRUFBRTtZQUMxQixJQUFJLEVBQUUsQ0FBQztZQUNQLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtnQkFDZixFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQ3pCLEVBQUUsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO2FBQ2xDO1lBQ0QsSUFBSSxFQUFFLEtBQUssU0FBUyxFQUFFO2dCQUNwQixRQUFRLEdBQUcsUUFBUSxHQUFHLEVBQUUsR0FBRyxXQUFXLENBQUM7YUFDeEM7U0FDRjtRQUNELE9BQU8sUUFBUSxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7O09BR0c7SUFDSCw2QkFBNkIsQ0FBQyxRQUFnQjtRQUM1QyxJQUFJLFFBQVEsR0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsSUFBRyxRQUFRLElBQUUsSUFBSSxFQUFDO1lBQ2hCLE9BQU8sSUFBSSxDQUFDLHdCQUF3QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2hEO2FBQU07WUFDTCxPQUFPLElBQUksQ0FBQztTQUNiO0lBQ0gsQ0FBQztJQUVELDZCQUE2QixDQUFDLGlCQUF5QjtRQUNyRCxJQUFJLFdBQVcsR0FBQyxJQUFJLENBQUM7UUFDckIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsQ0FBQztRQUNwRCxJQUFHLFdBQVcsS0FBRyxTQUFTLEVBQUU7WUFDMUIsSUFBSSxFQUFFLEdBQWtCLFNBQVMsQ0FBQztZQUNsQyxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7Z0JBQ2YsRUFBRSxHQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQzthQUNqQztZQUNELElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFO2dCQUN6QixFQUFFLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQzthQUNsQztZQUNELElBQUcsRUFBRSxLQUFJLFNBQVMsRUFBRTtnQkFDbEIsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtnQkFDeEUsTUFBTSxjQUFjLEdBQUcsV0FBVyxHQUFHLEVBQUUsQ0FBQztnQkFDeEMsSUFBSSxRQUFRLEdBQUcsY0FBYyxHQUFHLGdCQUFnQixDQUFDO2dCQUNqRCxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7b0JBQ2hCLFFBQVEsR0FBRyxDQUFDLENBQUE7aUJBQ2I7Z0JBQ0QsSUFBSSxRQUFRLElBQUksV0FBVyxFQUFFO29CQUMzQixRQUFRLEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQTtpQkFDM0I7Z0JBQ0QsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDcEM7U0FDRjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFQyxZQUFZLENBQUMsTUFBZ0IsRUFBRSxnQkFBMEIsRUFBQyxNQUFlO1FBQ3JFLElBQUksQ0FBQyxNQUFNLEdBQUMsTUFBTSxDQUFDO1FBQ25CLElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxnQkFBZ0IsQ0FBQztRQUN2QyxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUU7WUFDM0MsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUNqQyxNQUFNLFNBQVMsR0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRSxJQUFJLENBQUM7WUFDM0MsSUFBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksSUFBRSxTQUFTLEVBQUU7Z0JBQzNCLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQzthQUMzQjtZQUNELE1BQU0sUUFBUSxHQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQztZQUMxQyxJQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFFLFFBQVEsRUFBRTtnQkFDekIsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLEdBQUcsUUFBUSxDQUFDO2FBQ3pCO1NBQ0o7UUFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUM5QyxJQUFJLE1BQU0sRUFBRTtnQkFDUix5RUFBeUU7Z0JBQ3pFLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsRUFBRTtvQkFDM0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDL0IsSUFBRyxFQUFFLENBQUMsS0FBSyxJQUFFLElBQUksRUFBRTt3QkFDakIsRUFBRSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7cUJBQ2pCO2lCQUNKO2FBQ0o7WUFDRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsSUFBSSxDQUFDO1lBQ3BDLEtBQUksSUFBSSxFQUFFLEdBQUMsQ0FBQyxFQUFDLEVBQUUsR0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBQyxFQUFFLEVBQUUsRUFBRTtnQkFDM0MsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDL0IsSUFBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBRSxJQUFJLEVBQUU7b0JBQ3ZCLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztpQkFDdkI7YUFDSjtTQUNKO1FBQ0QsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRTtZQUN6QixNQUFNLElBQUksR0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDOUMsSUFBSSxNQUFNLEVBQUU7Z0JBQ1IsMEVBQTBFO2dCQUMxRSxLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUU7b0JBQzNDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBQy9CLElBQUcsRUFBRSxDQUFDLE1BQU0sSUFBRSxJQUFJLEVBQUU7d0JBQ2xCLEVBQUUsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO3FCQUNsQjtpQkFDSjthQUNKO1lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztZQUN6QixLQUFJLElBQUksRUFBRSxHQUFDLENBQUMsRUFBQyxFQUFFLEdBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQzNDLElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUM7Z0JBQy9CLElBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUUsSUFBSSxFQUFDO29CQUN2QixFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7aUJBQ3hCO2FBQ0o7U0FDSjtJQUNMLENBQUM7OzRIQXhIaUIsOEJBQThCO2dIQUE5Qiw4QkFBOEI7NEZBQTlCLDhCQUE4QjtrQkFEbkQsU0FBUzs7QUE2SFYsTUFBTSxPQUFnQix5QkFBMEIsU0FBUSw4QkFBOEI7SUFEdEY7O1FBS0kscUJBQWdCLEdBQWEsSUFBSSxDQUFDO1FBRXhCLGlCQUFZLEdBQWEsSUFBSSxDQUFDO1FBeUJ4QyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQVdqQyxlQUFVLEdBQWtCLElBQUksQ0FBQTtRQTRDdEIsZ0NBQTJCLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN6RCwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQ3RELHlCQUFvQixHQUFHLElBQUksWUFBWSxFQUFhLENBQUM7S0FrSGxFO0lBM0xDLFNBQVMsQ0FBQyxFQUFjO1FBQ3RCLElBQUksQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDMUIsQ0FBQztJQUVDLFlBQVksQ0FBQyxNQUFnQixFQUFFLGdCQUEwQixFQUFDLE1BQWUsRUFBQyxRQUFjLElBQUk7UUFDeEYsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxDQUFDLENBQUE7UUFDbEQsSUFBSSxNQUFNLEVBQUU7WUFDUixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pCO0lBQ0wsQ0FBQztJQUVELElBQWEsZUFBZSxDQUFDLGVBQTJCO1FBQ3BELElBQUksQ0FBQyxnQkFBZ0IsR0FBQyxlQUFlLENBQUE7UUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFHRCxJQUFhLFNBQVMsQ0FBQyxTQUF5QjtRQUM1QyxJQUFJLENBQUMsVUFBVSxHQUFDLFNBQVMsQ0FBQTtRQUN6QixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUE7UUFDYixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7SUFDMUIsQ0FBQztJQUVELElBQUksU0FBUztRQUNULE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQTtJQUMxQixDQUFDO0lBR0QsSUFBYSxTQUFTLENBQUMsU0FBd0I7UUFDM0MsSUFBSSxDQUFDLFVBQVUsR0FBQyxTQUFTLENBQUM7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFBO1FBQ2IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxJQUFJLFNBQVM7UUFDVCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUE7SUFDMUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxFQUFhO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUNqQyxDQUFDO0lBRUQsZUFBZSxDQUFDLEVBQWE7UUFDekIsSUFBSSxFQUFFLEdBQW9CLElBQUksQ0FBQztRQUMvQixJQUFHLElBQUksQ0FBQyxZQUFZLElBQUUsSUFBSSxFQUFFO1lBQzFCLEVBQUUsR0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUNsRCxJQUFJLENBQUMsWUFBWSxHQUFDLElBQUksQ0FBQztZQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pCO0lBQ0wsQ0FBQztJQUlELGtCQUFrQixDQUFDLEVBQWEsRUFBQyxrQkFBa0IsR0FBQyxJQUFJO1FBQ3BELElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixJQUFJLEVBQUUsRUFBRTtnQkFDSixJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7b0JBQ25CLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsQ0FBQTtvQkFDakMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2lCQUMxRTtxQkFBTTtvQkFDSCxJQUFJLGtCQUFrQixFQUFFO3dCQUNwQixJQUFJLENBQUMsc0JBQXNCLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFBO3FCQUMxQzt5QkFBSTt3QkFDRCxJQUFJLENBQUMsc0JBQXNCLENBQUMsSUFBSSxDQUFDLENBQUE7cUJBQ3BDO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFPRCxzQkFBc0IsQ0FBQyxTQUFzQjtRQUN6QyxJQUFJLGVBQWUsR0FBa0IsU0FBUyxDQUFDO1FBQy9DLElBQUcsU0FBUyxFQUFDO1lBQ1QsZUFBZSxHQUFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDN0IsSUFBSSxNQUFNLEdBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3pELElBQUcsTUFBTSxJQUFFLElBQUksRUFBRTtnQkFDYixlQUFlLENBQUMsYUFBYSxHQUFFLE1BQU0sQ0FBQzthQUN6QztTQUNKO1FBQ0QsSUFBSSxDQUFDLDJCQUEyQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBMkI7UUFDbEQsSUFBSSxFQUFFLEdBQTBCLFNBQVMsQ0FBQztRQUMxQyxJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDbkUsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUMvRCxJQUFJLElBQUksQ0FBQyxnQkFBZ0IsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7Z0JBQ25FLEVBQUUsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQzthQUM1RTtTQUNGO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsZUFBZSxDQUFDLE9BQTJCO1FBQ3ZDLE1BQU0sRUFBRSxHQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxNQUFNLENBQUMsT0FBMkI7UUFDOUIsTUFBTSxFQUFFLEdBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDdEMsQ0FBQztJQUVELGFBQWE7UUFDWCxJQUFJLEVBQUUsR0FBb0IsSUFBSSxDQUFDO1FBQy9CLElBQUksQ0FBQyxHQUFnQixJQUFJLENBQUM7UUFDMUIsSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFDO1lBQ2pCLENBQUMsR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO1NBQ2xCO2FBQUssSUFBRyxJQUFJLENBQUMsVUFBVSxFQUFDO1lBQ3ZCLENBQUMsR0FBQyxJQUFJLENBQUMsVUFBVSxDQUFBO1NBQ2xCO1FBQ0QsSUFBRyxDQUFDLEVBQUM7WUFDSCxNQUFNLEVBQUUsR0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxHQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7WUFDcEIsTUFBTSxFQUFFLEdBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQy9DLE1BQU0sRUFBRSxHQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUM3QyxJQUFHLEVBQUUsSUFBRSxJQUFJLElBQUksRUFBRSxJQUFFLElBQUksRUFBRTtnQkFDckIsRUFBRSxHQUFHLElBQUksYUFBYSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQTthQUNqQztTQUNKO1FBQ0QsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBR0gsTUFBTTtRQUNGLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQztZQUNuRixJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDbEUsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsSUFBSSxFQUFFLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQzlCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO2dCQUMvQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN6QixJQUFHLElBQUksQ0FBQyxRQUFRLEVBQUU7b0JBQ2hCLEVBQUUsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztvQkFDN0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDekI7Z0JBQ0QsSUFBSSxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO2dCQUM3QixJQUFJLEVBQUUsRUFBRTtvQkFDTixFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7b0JBQ2pDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUMxQzthQUNGO1NBQ0Y7SUFDTCxDQUFDO0lBQ0MsZUFBZTtRQUNYLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNuQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNsQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztZQUNuQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxJQUFHLENBQUMsRUFBRTtnQkFDRixDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QixJQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBQztvQkFDckIsSUFBSSxRQUFRLEdBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLGFBQWEsQ0FBQTtvQkFDaEQsSUFBRyxRQUFRLEVBQUU7d0JBQ1QsSUFBSSxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUE7d0JBQ3BFLElBQUksaUJBQWlCLEVBQUU7NEJBRW5CLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDOzRCQUN2QixDQUFDLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQzs0QkFDekIsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUNkLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQy9CLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7NEJBQy9CLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQzs0QkFFZCxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7NEJBRVgsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ3ZCLENBQUMsQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7Z0NBQzNCLENBQUMsQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDO2dDQUN2QixDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxpQkFBaUIsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7NkJBQzlEO3lCQUNKO3FCQUNKO2lCQUNKO2FBQ0o7U0FDSjtJQUNMLENBQUM7O0FBdE15QixzRUFBNEMsR0FBQyxFQUFFLEdBQUMsRUFBRSxHQUFDLEtBQU0sQ0FBQSxDQUFFLDRFQUE0RTt1SEFGL0kseUJBQXlCOzJHQUF6Qix5QkFBeUI7NEZBQXpCLHlCQUF5QjtrQkFEOUMsU0FBUzs4QkFTNkIsV0FBVztzQkFBN0MsU0FBUzt1QkFBQyxJQUFJLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUdNLGVBQWU7c0JBQXJELFNBQVM7dUJBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFJdkMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQVk3QixlQUFlO3NCQUEzQixLQUFLO2dCQU1PLFNBQVM7c0JBQXJCLEtBQUs7Z0JBV08sU0FBUztzQkFBckIsS0FBSztnQkEyQ0ksMkJBQTJCO3NCQUFwQyxNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDRyxvQkFBb0I7c0JBQTdCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0NhbnZhc0xheWVyQ29tcG9uZW50fSBmcm9tIFwiLi4vLi4vdWkvY2FudmFzX2xheWVyX2NvbXBcIjtcclxuaW1wb3J0IHtTZWxlY3Rpb259IGZyb20gJy4uL3BlcnNpc3RvcidcclxuaW1wb3J0IHsgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPdXRwdXQsIFZpZXdDaGlsZCwgRGlyZWN0aXZlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuaW1wb3J0IHtNYXJrZXJ9IGZyb20gXCIuL2NvbW1vblwiO1xyXG5pbXBvcnQge0RpbWVuc2lvbiwgUmVjdGFuZ2xlfSBmcm9tIFwiLi4vLi4vbWF0aC8yZC9nZW9tZXRyeVwiO1xyXG5pbXBvcnQge0F1ZGlvRGF0YUhvbGRlcn0gZnJvbSBcIi4uL2F1ZGlvX2RhdGFfaG9sZGVyXCI7XHJcblxyXG5cclxuZXhwb3J0IGNsYXNzIFZpZXdTZWxlY3Rpb257XHJcbiAgZ2V0IHN0YXJ0WCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuX3N0YXJ0WDtcclxuICB9XHJcblxyXG4gIGdldCBlbmRYKCk6IG51bWJlciB7XHJcbiAgICByZXR1cm4gdGhpcy5fZW5kWDtcclxuICB9XHJcblxyXG4gIHdpZHRoKCk6bnVtYmVye1xyXG4gICAgcmV0dXJuIHRoaXMuX2VuZFgtdGhpcy5fc3RhcnRYXHJcbiAgfVxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zdGFydFg6bnVtYmVyLCBwcml2YXRlIF9lbmRYOm51bWJlcil7fVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2ljQXVkaW9DYW52YXNMYXllckNvbXBvbmVudCBleHRlbmRzIENhbnZhc0xheWVyQ29tcG9uZW50IHtcclxuICBwcm90ZWN0ZWQgX2F1ZGlvRGF0YUhvbGRlcjpBdWRpb0RhdGFIb2xkZXJ8IG51bGw9bnVsbDtcclxuICBwcm90ZWN0ZWQgX2JnQ29sb3I6c3RyaW5nfG51bGw9J3doaXRlJztcclxuICBwcm90ZWN0ZWQgX3NlbGVjdENvbG9yPSdyZ2JhKDAlLDAlLDEwMCUsMjUlKSc7XHJcblxyXG4gIC8qKlxyXG4gICAqIFJldHVybnMgcGl4ZWwgcG9zaXRpb24gZGVwZW5kaW5nIG9uIGN1cnJlbnQgem9vbSBzZXR0aW5nLlxyXG4gICAqIEBwYXJhbSBmcmFtZVBvcyBhdWRpbyBmcmFtZSAoc2FtcGxlKSBwb3NpdGlvblxyXG4gICAqL1xyXG4gIGZyYW1lVG9YUGl4ZWxQb3NpdGlvbihmcmFtZVBvczogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgcGl4ZWxQb3M9bnVsbDtcclxuICAgIGxldCBmcmFtZUxlbmd0aCA9IHRoaXMuX2F1ZGlvRGF0YUhvbGRlcj8uZnJhbWVMZW47XHJcblxyXG4gICAgaWYoZnJhbWVMZW5ndGghPT11bmRlZmluZWQpIHtcclxuICAgICAgbGV0IHZ3O1xyXG4gICAgICBpZiAodGhpcy5ib3VuZHMpIHtcclxuICAgICAgICB2dyA9IHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52aXJ0dWFsRGltZW5zaW9uKSB7XHJcbiAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHZ3ICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICBwaXhlbFBvcyA9IGZyYW1lUG9zICogdncgLyBmcmFtZUxlbmd0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHBpeGVsUG9zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBwaXhlbCBwb3NpdGlvbiBpbiB2aWV3IHBvcnQgKHZpc2libGUgd2luZG93IG9mIHNjcm9sbCBwYW5lKS5cclxuICAgKiBAcGFyYW0gZnJhbWVQb3MgYXVkaW8gZnJhbWUgKHNhbXBsZSkgcG9zaXRpb25cclxuICAgKi9cclxuICBmcmFtZVRvVmlld1BvcnRYUGl4ZWxQb3NpdGlvbihmcmFtZVBvczogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgcGl4ZWxQb3M9dGhpcy5mcmFtZVRvWFBpeGVsUG9zaXRpb24oZnJhbWVQb3MpO1xyXG4gICAgaWYocGl4ZWxQb3MhPW51bGwpe1xyXG4gICAgICByZXR1cm4gdGhpcy50b1hWaWV3UG9ydFBpeGVsUG9zaXRpb24ocGl4ZWxQb3MpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih4Vmlld1BvcnRQaXhlbFBvczogbnVtYmVyKTogbnVtYmVyIHwgbnVsbCB7XHJcbiAgICBsZXQgdnBYZnJhbWVQb3M9bnVsbDtcclxuICAgIGNvbnN0IGZyYW1lTGVuZ3RoID0gdGhpcy5fYXVkaW9EYXRhSG9sZGVyPy5mcmFtZUxlbjtcclxuICAgIGlmKGZyYW1lTGVuZ3RoIT09dW5kZWZpbmVkKSB7XHJcbiAgICAgIGxldCB2dzpudW1iZXJ8dW5kZWZpbmVkPXVuZGVmaW5lZDtcclxuICAgICAgaWYgKHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgdnc9IHRoaXMuYm91bmRzLmRpbWVuc2lvbi53aWR0aDtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy52aXJ0dWFsRGltZW5zaW9uKSB7XHJcbiAgICAgICAgdncgPSB0aGlzLnZpcnR1YWxEaW1lbnNpb24ud2lkdGg7XHJcbiAgICAgIH1cclxuICAgICAgaWYodnchPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgY29uc3QgeFZpcnR1YWxQaXhlbFBvcyA9IHRoaXMudG9YVmlydHVhbFBpeGVsUG9zaXRpb24oeFZpZXdQb3J0UGl4ZWxQb3MpXHJcbiAgICAgICAgY29uc3QgZnJhbWVzUGVyUGl4ZWwgPSBmcmFtZUxlbmd0aCAvIHZ3O1xyXG4gICAgICAgIGxldCBmcmFtZVBvcyA9IGZyYW1lc1BlclBpeGVsICogeFZpcnR1YWxQaXhlbFBvcztcclxuICAgICAgICBpZiAoZnJhbWVQb3MgPCAwKSB7XHJcbiAgICAgICAgICBmcmFtZVBvcyA9IDBcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGZyYW1lUG9zID49IGZyYW1lTGVuZ3RoKSB7XHJcbiAgICAgICAgICBmcmFtZVBvcyA9IGZyYW1lTGVuZ3RoIC0gMVxyXG4gICAgICAgIH1cclxuICAgICAgICB2cFhmcmFtZVBvcyA9IE1hdGgucm91bmQoZnJhbWVQb3MpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdnBYZnJhbWVQb3M7XHJcbiAgfVxyXG5cclxuICAgIGxheW91dEJvdW5kcyhib3VuZHM6UmVjdGFuZ2xlLCB2aXJ0dWFsRGltZW5zaW9uOkRpbWVuc2lvbixyZWRyYXc6IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLmJvdW5kcz1ib3VuZHM7XHJcbiAgICAgICAgdGhpcy52aXJ0dWFsRGltZW5zaW9uPXZpcnR1YWxEaW1lbnNpb247XHJcbiAgICAgICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNsID0gdGhpcy5jYW52YXNMYXllcnNbY2ldO1xyXG4gICAgICAgICAgICBjb25zdCBsZWZ0U3R5bGU9Ym91bmRzLnBvc2l0aW9uLmxlZnQrICdweCc7XHJcbiAgICAgICAgICAgIGlmKGNsLnN0eWxlLmxlZnQhPWxlZnRTdHlsZSkge1xyXG4gICAgICAgICAgICAgIGNsLnN0eWxlLmxlZnQgPSBsZWZ0U3R5bGU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY29uc3QgdG9wU3R5bGU9Ym91bmRzLnBvc2l0aW9uLnRvcCArICdweCc7XHJcbiAgICAgICAgICAgIGlmKGNsLnN0eWxlLnRvcCE9dG9wU3R5bGUpIHtcclxuICAgICAgICAgICAgICBjbC5zdHlsZS50b3AgPSB0b3BTdHlsZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoYm91bmRzLmRpbWVuc2lvbi53aWR0aCkge1xyXG4gICAgICAgICAgICBjb25zdCBpbnRXPU1hdGguZmxvb3IoYm91bmRzLmRpbWVuc2lvbi53aWR0aCk7XHJcbiAgICAgICAgICAgIGlmIChyZWRyYXcpIHtcclxuICAgICAgICAgICAgICAgIC8vIERvIG5vdCBzZXQgd2lkdGggb2YgYmFja2dyb3VuZCBjYW52YXMgKGNhdXNlcyBmbGlja2VyIG9uIHN0YXJ0IHJlbmRlcilcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2k9MTtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbCA9IHRoaXMuY2FudmFzTGF5ZXJzW2NpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZihjbC53aWR0aCE9aW50Vykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY2wud2lkdGggPSBpbnRXO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjb25zdCB3U3RyID0gaW50Vy50b1N0cmluZygpICsgJ3B4JztcclxuICAgICAgICAgICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICBpZihjbC5zdHlsZS53aWR0aCE9d1N0cikge1xyXG4gICAgICAgICAgICAgICAgICBjbC5zdHlsZS53aWR0aCA9IHdTdHI7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGludEg9TWF0aC5mbG9vcihib3VuZHMuZGltZW5zaW9uLmhlaWdodClcclxuICAgICAgICAgICAgaWYgKHJlZHJhdykge1xyXG4gICAgICAgICAgICAgICAgLy8gRG8gbm90IHNldCBoZWlnaHQgb2YgYmFja2dyb3VuZCBjYW52YXMgKGNhdXNlcyBmbGlja2VyIG9uIHN0YXJ0IHJlbmRlcilcclxuICAgICAgICAgICAgICAgIGZvcihsZXQgY2k9MTtjaTx0aGlzLmNhbnZhc0xheWVycy5sZW5ndGg7Y2krKykge1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBjbCA9IHRoaXMuY2FudmFzTGF5ZXJzW2NpXTtcclxuICAgICAgICAgICAgICAgICAgICBpZihjbC5oZWlnaHQhPWludEgpIHtcclxuICAgICAgICAgICAgICAgICAgICAgIGNsLmhlaWdodCA9IGludEg7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IGhTdHIgPSBpbnRIICsgJ3B4JztcclxuICAgICAgICAgICAgZm9yKGxldCBjaT0wO2NpPHRoaXMuY2FudmFzTGF5ZXJzLmxlbmd0aDtjaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY2wgPSB0aGlzLmNhbnZhc0xheWVyc1tjaV07XHJcbiAgICAgICAgICAgICAgICBpZihjbC5zdHlsZS5oZWlnaHQhPWhTdHIpe1xyXG4gICAgICAgICAgICAgICAgICBjbC5zdHlsZS5oZWlnaHQgPSBoU3RyO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59XHJcblxyXG5ARGlyZWN0aXZlKClcclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnQgZXh0ZW5kcyBCYXNpY0F1ZGlvQ2FudmFzTGF5ZXJDb21wb25lbnQge1xyXG5cclxuICAgIHByb3RlY3RlZCBzdGF0aWMgcmVhZG9ubHkgRU5BQkxFX1NUUkVBTUlOR19OVU1CRVJfT0ZfU0FNUExFU19USFJFU0hPTEQ9MTAqNjAqNDgwMDA7ICAvLyBVc2Ugc3RyZWFtaW5nL2NodW5raW5nIGlmIGF1ZGlvIGNsaXAgaGFzIG1vcmUgdGhhbiB0aGlzIG51bWJlciBvZiBzYW1wbGVzXHJcblxyXG4gICAgX3BvaW50ZXJQb3NpdGlvbjpNYXJrZXJ8bnVsbD1udWxsO1xyXG5cclxuICAgIHByb3RlY3RlZCBzZWxlY3RTdGFydFg6bnVtYmVyfG51bGw9bnVsbDtcclxuXHJcbiAgICBAVmlld0NoaWxkKCdiZycsIHsgc3RhdGljOiB0cnVlIH0pIGJnQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICAgIGJnQ2FudmFzITogSFRNTENhbnZhc0VsZW1lbnQ7XHJcblxyXG4gICAgQFZpZXdDaGlsZCgnY3Vyc29yJywgeyBzdGF0aWM6IHRydWUgfSkgY3Vyc29yQ2FudmFzUmVmITogRWxlbWVudFJlZjtcclxuICAgIGN1cnNvckNhbnZhcyE6IEhUTUxDYW52YXNFbGVtZW50O1xyXG5cclxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcclxuICBvbk1vdXNldXAobWU6IE1vdXNlRXZlbnQpIHtcclxuICAgIHRoaXMuc2VsZWN0aW9uQ29tbWl0KG1lKVxyXG4gIH1cclxuXHJcbiAgICBsYXlvdXRCb3VuZHMoYm91bmRzOlJlY3RhbmdsZSwgdmlydHVhbERpbWVuc2lvbjpEaW1lbnNpb24scmVkcmF3OiBib29sZWFuLGNsZWFyOmJvb2xlYW49dHJ1ZSkge1xyXG4gICAgICAgIHN1cGVyLmxheW91dEJvdW5kcyhib3VuZHMsdmlydHVhbERpbWVuc2lvbixyZWRyYXcpXHJcbiAgICAgICAgaWYgKHJlZHJhdykge1xyXG4gICAgICAgICAgICB0aGlzLnN0YXJ0RHJhdyhjbGVhcik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBJbnB1dCgpIHNldCBwb2ludGVyUG9zaXRpb24ocG9pbnRlclBvc2l0aW9uOk1hcmtlcnxudWxsKXtcclxuICAgICAgICB0aGlzLl9wb2ludGVyUG9zaXRpb249cG9pbnRlclBvc2l0aW9uXHJcbiAgICAgICAgdGhpcy5kcmF3Q3Vyc29yTGF5ZXIoKVxyXG4gICAgfVxyXG5cclxuICAgIF9zZWxlY3Rpbmc6IFNlbGVjdGlvbnxudWxsID1udWxsO1xyXG4gICAgQElucHV0KCkgc2V0IHNlbGVjdGluZyhzZWxlY3Rpbmc6U2VsZWN0aW9ufCBudWxsKXtcclxuICAgICAgICB0aGlzLl9zZWxlY3Rpbmc9c2VsZWN0aW5nXHJcbiAgICAgICAgdGhpcy5kcmF3QmcoKVxyXG4gICAgICAgIHRoaXMuZHJhd0N1cnNvckxheWVyKClcclxuICAgIH1cclxuXHJcbiAgICBnZXQgc2VsZWN0aW5nKCk6U2VsZWN0aW9ufG51bGx7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGluZ1xyXG4gICAgfVxyXG5cclxuICAgIF9zZWxlY3Rpb246IFNlbGVjdGlvbnxudWxsID1udWxsXHJcbiAgICBASW5wdXQoKSBzZXQgc2VsZWN0aW9uKHNlbGVjdGlvbjpTZWxlY3Rpb258bnVsbCl7XHJcbiAgICAgICAgdGhpcy5fc2VsZWN0aW9uPXNlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLnNlbGVjdGluZz1udWxsO1xyXG4gICAgICAgIHRoaXMuZHJhd0JnKClcclxuICAgICAgICB0aGlzLmRyYXdDdXJzb3JMYXllcigpXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IHNlbGVjdGlvbigpOlNlbGVjdGlvbnxudWxse1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25cclxuICAgIH1cclxuXHJcbiAgICBzZWxlY3Rpb25TdGFydChtZTpNb3VzZUV2ZW50KXtcclxuICAgICAgICB0aGlzLnNlbGVjdFN0YXJ0WD1tZS5vZmZzZXRYO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGlvbkNvbW1pdChtZTpNb3VzZUV2ZW50KXtcclxuICAgICAgICBsZXQgdnM6Vmlld1NlbGVjdGlvbnxudWxsPW51bGw7XHJcbiAgICAgICAgaWYodGhpcy5zZWxlY3RTdGFydFghPW51bGwpIHtcclxuICAgICAgICAgIHZzPW5ldyBWaWV3U2VsZWN0aW9uKHRoaXMuc2VsZWN0U3RhcnRYLG1lLm9mZnNldFgpXHJcbiAgICAgICAgICB0aGlzLnNlbGVjdFN0YXJ0WD1udWxsO1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3QodnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBhYnN0cmFjdCBzdGFydERyYXcoY2xlYXI6Ym9vbGVhbik6dm9pZDtcclxuXHJcbiAgICB1cGRhdGVDdXJzb3JDYW52YXMobWU6TW91c2VFdmVudCxzaG93Q3Vyc29yUG9zaXRpb249dHJ1ZSl7XHJcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yQ2FudmFzKSB7XHJcbiAgICAgICAgICAgIGlmIChtZSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0U3RhcnRYKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyUG9zaXRpb25DaGFuZ2VkKG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RpbmdDaGFuZ2UobmV3IFZpZXdTZWxlY3Rpb24odGhpcy5zZWxlY3RTdGFydFgsIG1lLm9mZnNldFgpKTtcclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNob3dDdXJzb3JQb3NpdGlvbikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkNoYW5nZWQobWUub2Zmc2V0WClcclxuICAgICAgICAgICAgICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb2ludGVyUG9zaXRpb25DaGFuZ2VkKG51bGwpXHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIEBPdXRwdXQoKSBwb2ludGVyUG9zaXRpb25FdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPE1hcmtlcj4oKTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RpbmdFdmVudEVtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdGlvbj4oKTtcclxuICAgIEBPdXRwdXQoKSBzZWxlY3RlZEV2ZW50RW1pdHRlciA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0aW9uPigpO1xyXG5cclxuXHJcbiAgICBwb2ludGVyUG9zaXRpb25DaGFuZ2VkKHhQb3NpdGlvbjpudW1iZXJ8IG51bGwpe1xyXG4gICAgICAgIGxldCBwb2ludGVyUG9zaXRpb246TWFya2VyfHVuZGVmaW5lZD11bmRlZmluZWQ7XHJcbiAgICAgICAgaWYoeFBvc2l0aW9uKXtcclxuICAgICAgICAgICAgcG9pbnRlclBvc2l0aW9uPW5ldyBNYXJrZXIoKTtcclxuICAgICAgICAgICAgbGV0IHZwWFBvcz10aGlzLnZpZXdQb3J0WFBpeGVsVG9GcmFtZVBvc2l0aW9uKHhQb3NpdGlvbik7XHJcbiAgICAgICAgICAgIGlmKHZwWFBvcyE9bnVsbCkge1xyXG4gICAgICAgICAgICAgICAgcG9pbnRlclBvc2l0aW9uLmZyYW1lUG9zaXRpb24gPXZwWFBvcztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLnBvaW50ZXJQb3NpdGlvbkV2ZW50RW1pdHRlci5lbWl0KHBvaW50ZXJQb3NpdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBfc2VsZWN0aW5nQ2hhbmdlKHZpZXdTZWw6Vmlld1NlbGVjdGlvbnwgbnVsbCk6U2VsZWN0aW9ufHVuZGVmaW5lZCB7XHJcbiAgICAgIGxldCBuczogU2VsZWN0aW9uIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xyXG4gICAgICBpZiAodmlld1NlbCkge1xyXG4gICAgICAgIGxldCBmcmFtZVN0YXJ0ID0gdGhpcy52aWV3UG9ydFhQaXhlbFRvRnJhbWVQb3NpdGlvbih2aWV3U2VsLnN0YXJ0WClcclxuICAgICAgICBsZXQgZnJhbWVFbmQgPSB0aGlzLnZpZXdQb3J0WFBpeGVsVG9GcmFtZVBvc2l0aW9uKHZpZXdTZWwuZW5kWClcclxuICAgICAgICBpZiAodGhpcy5fYXVkaW9EYXRhSG9sZGVyICYmIGZyYW1lU3RhcnQgIT0gbnVsbCAmJiBmcmFtZUVuZCAhPSBudWxsKSB7XHJcbiAgICAgICAgICBucyA9IG5ldyBTZWxlY3Rpb24odGhpcy5fYXVkaW9EYXRhSG9sZGVyLnNhbXBsZVJhdGUsIGZyYW1lU3RhcnQsIGZyYW1lRW5kKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIG5zO1xyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdGluZ0NoYW5nZSh2aWV3U2VsOlZpZXdTZWxlY3Rpb258IG51bGwpe1xyXG4gICAgICAgIGNvbnN0IG5zPXRoaXMuX3NlbGVjdGluZ0NoYW5nZSh2aWV3U2VsKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGluZ0V2ZW50RW1pdHRlci5lbWl0KG5zKVxyXG4gICAgfVxyXG5cclxuICAgIHNlbGVjdCh2aWV3U2VsOlZpZXdTZWxlY3Rpb258IG51bGwpe1xyXG4gICAgICAgIGNvbnN0IG5zPXRoaXMuX3NlbGVjdGluZ0NoYW5nZSh2aWV3U2VsKTtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkRXZlbnRFbWl0dGVyLmVtaXQobnMpXHJcbiAgICB9XHJcblxyXG4gICAgdmlld1NlbGVjdGlvbigpOlZpZXdTZWxlY3Rpb258bnVsbHtcclxuICAgICAgbGV0IHZzOlZpZXdTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBsZXQgczpTZWxlY3Rpb258bnVsbD1udWxsO1xyXG4gICAgICBpZih0aGlzLl9zZWxlY3Rpbmcpe1xyXG4gICAgICAgIHM9dGhpcy5fc2VsZWN0aW5nXHJcbiAgICAgIH1lbHNlIGlmKHRoaXMuX3NlbGVjdGlvbil7XHJcbiAgICAgICAgcz10aGlzLl9zZWxlY3Rpb25cclxuICAgICAgfVxyXG4gICAgICBpZihzKXtcclxuICAgICAgICBjb25zdCBzZj1zLnN0YXJ0RnJhbWU7XHJcbiAgICAgICAgY29uc3QgZWY9cy5lbmRGcmFtZTtcclxuICAgICAgICBjb25zdCB4cz10aGlzLmZyYW1lVG9WaWV3UG9ydFhQaXhlbFBvc2l0aW9uKHNmKVxyXG4gICAgICAgIGNvbnN0IHhlPXRoaXMuZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24oZWYpXHJcbiAgICAgICAgICBpZih4cyE9bnVsbCAmJiB4ZSE9bnVsbCkge1xyXG4gICAgICAgICAgICAgIHZzID0gbmV3IFZpZXdTZWxlY3Rpb24oeHMsIHhlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiB2cztcclxuICAgIH1cclxuXHJcblxyXG4gIGRyYXdCZygpe1xyXG4gICAgICBpZih0aGlzLmJnQ2FudmFzICYmIHRoaXMuYm91bmRzKSB7XHJcbiAgICAgICAgICB0aGlzLmJnQ2FudmFzLnN0eWxlLmxlZnQgPSBNYXRoLnJvdW5kKHRoaXMuYm91bmRzLnBvc2l0aW9uLmxlZnQpLnRvU3RyaW5nKCkgKyAncHgnO1xyXG4gICAgICAgICAgdGhpcy5iZ0NhbnZhcy53aWR0aCA9IE1hdGgucm91bmQodGhpcy5ib3VuZHMuZGltZW5zaW9uLndpZHRoKTtcclxuICAgICAgICAgIHRoaXMuYmdDYW52YXMuaGVpZ2h0ID0gTWF0aC5yb3VuZCh0aGlzLmJvdW5kcy5kaW1lbnNpb24uaGVpZ2h0KTtcclxuICAgICAgICBsZXQgZzEgPSB0aGlzLmJnQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICBpZiAoZzEpIHtcclxuICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmJnQ2FudmFzLndpZHRoO1xyXG4gICAgICAgICAgY29uc3QgaCA9IHRoaXMuYmdDYW52YXMuaGVpZ2h0O1xyXG4gICAgICAgICAgZzEuY2xlYXJSZWN0KDAsIDAsIHcsIGgpO1xyXG4gICAgICAgICAgaWYodGhpcy5fYmdDb2xvcikge1xyXG4gICAgICAgICAgICBnMS5maWxsU3R5bGUgPSB0aGlzLl9iZ0NvbG9yO1xyXG4gICAgICAgICAgICBnMS5maWxsUmVjdCgwLCAwLCB3LCBoKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGxldCB2cyA9IHRoaXMudmlld1NlbGVjdGlvbigpXHJcbiAgICAgICAgICBpZiAodnMpIHtcclxuICAgICAgICAgICAgZzEuZmlsbFN0eWxlID0gdGhpcy5fc2VsZWN0Q29sb3I7XHJcbiAgICAgICAgICAgIGcxLmZpbGxSZWN0KHZzLnN0YXJ0WCwgMCwgdnMud2lkdGgoKSwgaCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgfVxyXG4gICAgZHJhd0N1cnNvckxheWVyKCl7XHJcbiAgICAgICAgaWYgKHRoaXMuY3Vyc29yQ2FudmFzKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHcgPSB0aGlzLmN1cnNvckNhbnZhcy53aWR0aDtcclxuICAgICAgICAgICAgY29uc3QgaCA9IHRoaXMuY3Vyc29yQ2FudmFzLmhlaWdodDtcclxuICAgICAgICAgICAgY29uc3QgZyA9IHRoaXMuY3Vyc29yQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKTtcclxuICAgICAgICAgICAgaWYoZykge1xyXG4gICAgICAgICAgICAgICAgZy5jbGVhclJlY3QoMCwgMCwgdywgaCk7XHJcbiAgICAgICAgICAgICAgICBpZih0aGlzLl9wb2ludGVyUG9zaXRpb24pe1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBmcmFtZVBvcz10aGlzLl9wb2ludGVyUG9zaXRpb24uZnJhbWVQb3NpdGlvblxyXG4gICAgICAgICAgICAgICAgICAgIGlmKGZyYW1lUG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB4Vmlld1BvcnRQaXhlbHBvcyA9IHRoaXMuZnJhbWVUb1ZpZXdQb3J0WFBpeGVsUG9zaXRpb24oZnJhbWVQb3MpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4Vmlld1BvcnRQaXhlbHBvcykge1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZmlsbFN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnN0cm9rZVN0eWxlID0gJ3llbGxvdyc7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmJlZ2luUGF0aCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5tb3ZlVG8oeFZpZXdQb3J0UGl4ZWxwb3MsIDApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5saW5lVG8oeFZpZXdQb3J0UGl4ZWxwb3MsIGgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZy5jbG9zZVBhdGgoKTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLnN0cm9rZSgpO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdWRpb0RhdGFIb2xkZXIpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmZvbnQgPSAnMTRweCBzYW5zLXNlcmlmJztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnLmZpbGxTdHlsZSA9ICd5ZWxsb3cnO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGcuZmlsbFRleHQoZnJhbWVQb3MudG9TdHJpbmcoKSwgeFZpZXdQb3J0UGl4ZWxwb3MgKyAyLCA1MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG59XHJcblxyXG5cclxuXHJcbiJdfQ==