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
@@ -0,0 +1,120 @@
1
+ import { Injectable } from "@angular/core";
2
+ import { Observable } from "rxjs";
3
+ import * as i0 from "@angular/core";
4
+ export class Sync {
5
+ constructor(objectStoreName, objectId) {
6
+ this._objectStoreName = objectStoreName;
7
+ this._objectId = objectId;
8
+ }
9
+ get objectStoreName() {
10
+ return this._objectStoreName;
11
+ }
12
+ get objectId() {
13
+ return this._objectId;
14
+ }
15
+ }
16
+ export class SprDb {
17
+ static { this.dbName = 'speechrecorder'; }
18
+ static { this.RECORDING_FILE_CACHE_OBJECT_STORE_NAME = '_recording_file_cache'; }
19
+ //public static RECORDING_FILE_CHUNKS_OBJECT_STORE_NAME='rec_file_chunks';
20
+ static { this.dbVersion = 1; }
21
+ constructor() {
22
+ this._store = null;
23
+ }
24
+ static sprDbFactory() {
25
+ let sprDb = new SprDb();
26
+ return sprDb;
27
+ }
28
+ static prepare() {
29
+ let obs = new Observable((subscriber) => {
30
+ console.info("Prepare indexed database...");
31
+ if (indexedDB) {
32
+ let or;
33
+ or = indexedDB.open(SprDb.dbName, SprDb.dbVersion);
34
+ or.onupgradeneeded = (ev) => {
35
+ let db = or.result;
36
+ let tr = or.transaction;
37
+ // if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
38
+ // db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
39
+ // }
40
+ // Future work towards a complete PWA which stores all clien data in indexed db and synchronizes to the server: See experimental Git branch "progressive_web_app"
41
+ // if (!db.objectStoreNames.contains('_sync')) {
42
+ // db.createObjectStore('_sync', {keyPath: 'id', autoIncrement:true});
43
+ // }
44
+ // if (!db.objectStoreNames.contains('project')) {
45
+ // db.createObjectStore('project', {keyPath: 'name'});
46
+ // }
47
+ // if (!db.objectStoreNames.contains('session')) {
48
+ // let sessStore=db.createObjectStore('session', {keyPath: 'sessionId'});
49
+ // sessStore.createIndex('projectIdx', ['project'], {unique:false});
50
+ // }else if(ev.oldVersion<5){
51
+ //
52
+ // let sessStore=tr.objectStore('session')
53
+ // sessStore.createIndex('projectIdx', ['project'], {unique:false});
54
+ // }
55
+ //
56
+ // if (!db.objectStoreNames.contains('script')) {
57
+ // let scrStore=db.createObjectStore('script', {keyPath: 'scriptId'});
58
+ // scrStore.createIndex('projectIdx', ['project'], {unique:false});
59
+ // }
60
+ //
61
+ // if (!db.objectStoreNames.contains('recfile')) {
62
+ // let rfStore=db.createObjectStore('recfile', {keyPath: 'uuid'});
63
+ // rfStore.createIndex('sessIdIdx', ['sessionId'], {unique:false});
64
+ // rfStore.createIndex('sessIdItemcodeIdx', ['sessionId','itemCode'], {unique:false});
65
+ // }
66
+ if (!db.objectStoreNames.contains(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME)) {
67
+ let rfStore = db.createObjectStore(SprDb.RECORDING_FILE_CACHE_OBJECT_STORE_NAME);
68
+ }
69
+ if (ev.oldVersion) {
70
+ console.info("Upgraded indexed database " + SprDb.dbName + " schema from version " + ev.oldVersion + " to " + ev.newVersion);
71
+ }
72
+ else {
73
+ console.info("Created indexed database " + SprDb.dbName + " schema version " + ev.newVersion);
74
+ }
75
+ };
76
+ or.onsuccess = (ev) => {
77
+ console.info("Opened indexed database");
78
+ let db = or.result;
79
+ // // iPad WEbKit workaround
80
+ // does not help!
81
+ // db.onclose=(ev)=>{
82
+ // console.debug("DB closed...");
83
+ //
84
+ // }
85
+ // console.debug("Close db.");
86
+ // db.close();
87
+ // let opaRq=indexedDB.open(SprDb.dbName, SprDb.dbVersion);
88
+ // opaRq.onupgradeneeded=(ev)=>{}
89
+ //
90
+ // opaRq.onsuccess=(ev)=>{
91
+ // console.debug("and opened again");
92
+ // subscriber.next(opaRq.result);
93
+ // subscriber.complete();
94
+ // }
95
+ // opaRq.onerror = (err) => {
96
+ // console.error("Could not open indexed database: " + SprDb.dbName + ": " + err)
97
+ // subscriber.error(err)
98
+ // }
99
+ subscriber.next(db);
100
+ subscriber.complete();
101
+ };
102
+ or.onerror = (err) => {
103
+ console.error("Could not open indexed database: " + SprDb.dbName + ": " + err);
104
+ subscriber.error(err);
105
+ };
106
+ }
107
+ else {
108
+ console.info("Browser does not support indexed databases");
109
+ subscriber.error();
110
+ }
111
+ });
112
+ return obs;
113
+ }
114
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: SprDb, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
115
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: SprDb }); }
116
+ }
117
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.0.6", ngImport: i0, type: SprDb, decorators: [{
118
+ type: Injectable
119
+ }], ctorParameters: () => [] });
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZGIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvZGIvaW5kZGIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sTUFBTSxDQUFDOztBQUdoQyxNQUFNLE9BQU8sSUFBSTtJQUtiLFlBQVksZUFBc0IsRUFBQyxRQUFzQjtRQUNyRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUMsZUFBZSxDQUFBO1FBQ3JDLElBQUksQ0FBQyxTQUFTLEdBQUMsUUFBUSxDQUFBO0lBQzNCLENBQUM7SUFFRCxJQUFJLGVBQWU7UUFDaEIsT0FBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUE7SUFDaEMsQ0FBQztJQUVELElBQUksUUFBUTtRQUNSLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQTtJQUN6QixDQUFDO0NBQ0o7QUFHRCxNQUFNLE9BQU8sS0FBSzthQUVBLFdBQU0sR0FBQyxnQkFBZ0IsQUFBakIsQ0FBaUI7YUFFdkIsMkNBQXNDLEdBQUMsdUJBQXVCLEFBQXhCLENBQXlCO0lBQzVFLDBFQUEwRTthQUM3RCxjQUFTLEdBQUMsQ0FBQyxBQUFGLENBQUc7SUFHMUI7UUFEUSxXQUFNLEdBQWtCLElBQUksQ0FBQTtJQUVwQyxDQUFDO0lBRUQsTUFBTSxDQUFDLFlBQVk7UUFDaEIsSUFBSSxLQUFLLEdBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQztRQUVyQixPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBSUQsTUFBTSxDQUFDLE9BQU87UUFDVixJQUFJLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBYyxDQUFDLFVBQVUsRUFBRSxFQUFFO1lBRTdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsNkJBQTZCLENBQUMsQ0FBQTtZQUMzQyxJQUFJLFNBQVMsRUFBRTtnQkFDWCxJQUFJLEVBQW9CLENBQUM7Z0JBQ3pCLEVBQUUsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUNuRCxFQUFFLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUU7b0JBQ3hCLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUE7b0JBQ2xCLElBQUksRUFBRSxHQUFDLEVBQUUsQ0FBQyxXQUFXLENBQUE7b0JBRXJCLHFGQUFxRjtvQkFDckYseUVBQXlFO29CQUN6RSxJQUFJO29CQUVKLGlLQUFpSztvQkFFakssZ0RBQWdEO29CQUNoRCwwRUFBMEU7b0JBQzFFLElBQUk7b0JBQ0osa0RBQWtEO29CQUNsRCwwREFBMEQ7b0JBQzFELElBQUk7b0JBQ0osa0RBQWtEO29CQUNsRCw2RUFBNkU7b0JBQzdFLHdFQUF3RTtvQkFDeEUsNkJBQTZCO29CQUM3QixFQUFFO29CQUNGLDhDQUE4QztvQkFDOUMsdUVBQXVFO29CQUN2RSxJQUFJO29CQUNKLEVBQUU7b0JBQ0YsaURBQWlEO29CQUNqRCwwRUFBMEU7b0JBQzFFLHVFQUF1RTtvQkFDdkUsSUFBSTtvQkFDSixFQUFFO29CQUNGLGtEQUFrRDtvQkFDbEQsc0VBQXNFO29CQUN0RSx1RUFBdUU7b0JBQ3ZFLDBGQUEwRjtvQkFDMUYsSUFBSTtvQkFDTixJQUFJLENBQUMsRUFBRSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsc0NBQXNDLENBQUMsRUFBRTt3QkFDM0UsSUFBSSxPQUFPLEdBQUMsRUFBRSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO3FCQUNsRjtvQkFDRCxJQUFJLEVBQUUsQ0FBQyxVQUFVLEVBQUU7d0JBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLHVCQUF1QixHQUFHLEVBQUUsQ0FBQyxVQUFVLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtxQkFDL0g7eUJBQU07d0JBQ0gsT0FBTyxDQUFDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtxQkFDaEc7Z0JBQ0wsQ0FBQyxDQUFBO2dCQUNELEVBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRTtvQkFDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO29CQUV6QyxJQUFJLEVBQUUsR0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDO29CQUNqQiw4QkFBOEI7b0JBQzlCLGlCQUFpQjtvQkFDakIsdUJBQXVCO29CQUN2QixxQ0FBcUM7b0JBQ3JDLEVBQUU7b0JBQ0YsTUFBTTtvQkFDTiw4QkFBOEI7b0JBQzlCLGdCQUFnQjtvQkFDaEIsMkRBQTJEO29CQUMzRCxpQ0FBaUM7b0JBQ2pDLEVBQUU7b0JBQ0YsMEJBQTBCO29CQUMxQix1Q0FBdUM7b0JBQ3ZDLG1DQUFtQztvQkFDbkMsMkJBQTJCO29CQUMzQixJQUFJO29CQUNKLDZCQUE2QjtvQkFDN0IsbUZBQW1GO29CQUNuRiwwQkFBMEI7b0JBQzFCLElBQUk7b0JBRUosVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDcEIsVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO2dCQUN4QixDQUFDLENBQUE7Z0JBRUQsRUFBRSxDQUFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFO29CQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLG1DQUFtQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsSUFBSSxHQUFHLEdBQUcsQ0FBQyxDQUFBO29CQUM5RSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO2dCQUN6QixDQUFDLENBQUE7YUFDSjtpQkFBTTtnQkFDSCxPQUFPLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUE7Z0JBQzFELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUN0QjtRQUNULENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxHQUFHLENBQUM7SUFDZixDQUFDOzhHQTlHUSxLQUFLO2tIQUFMLEtBQUs7OzJGQUFMLEtBQUs7a0JBRGpCLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSBcInJ4anNcIjtcclxuXHJcblxyXG5leHBvcnQgY2xhc3MgU3luY3tcclxuICAgIGlkPzpudW1iZXI7XHJcbiAgICBfb2JqZWN0U3RvcmVOYW1lOnN0cmluZztcclxuICAgIF9vYmplY3RJZDpzdHJpbmd8bnVtYmVyO1xyXG5cclxuICAgIGNvbnN0cnVjdG9yKG9iamVjdFN0b3JlTmFtZTpzdHJpbmcsb2JqZWN0SWQ6c3RyaW5nfG51bWJlcil7XHJcbiAgICAgICAgdGhpcy5fb2JqZWN0U3RvcmVOYW1lPW9iamVjdFN0b3JlTmFtZVxyXG4gICAgICAgIHRoaXMuX29iamVjdElkPW9iamVjdElkXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9iamVjdFN0b3JlTmFtZSgpOnN0cmluZ3tcclxuICAgICAgIHJldHVybiAgdGhpcy5fb2JqZWN0U3RvcmVOYW1lXHJcbiAgICB9XHJcblxyXG4gICAgZ2V0IG9iamVjdElkKCk6c3RyaW5nfG51bWJlcntcclxuICAgICAgICByZXR1cm4gdGhpcy5fb2JqZWN0SWRcclxuICAgIH1cclxufVxyXG5cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgU3ByRGIge1xyXG5cclxuICAgIHB1YmxpYyBzdGF0aWMgZGJOYW1lPSdzcGVlY2hyZWNvcmRlcidcclxuXHJcbiAgICBwdWJsaWMgc3RhdGljIFJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FPSdfcmVjb3JkaW5nX2ZpbGVfY2FjaGUnO1xyXG4gICAgIC8vcHVibGljIHN0YXRpYyBSRUNPUkRJTkdfRklMRV9DSFVOS1NfT0JKRUNUX1NUT1JFX05BTUU9J3JlY19maWxlX2NodW5rcyc7XHJcbiAgICBwdWJsaWMgc3RhdGljIGRiVmVyc2lvbj0xO1xyXG5cclxuICAgIHByaXZhdGUgX3N0b3JlOklEQkRhdGFiYXNlfG51bGw9bnVsbFxyXG4gICAgY29uc3RydWN0b3IoKXtcclxuICAgIH1cclxuXHJcbiAgICBzdGF0aWMgc3ByRGJGYWN0b3J5KCk6U3ByRGJ7XHJcbiAgICAgICBsZXQgc3ByRGI9bmV3IFNwckRiKCk7XHJcblxyXG4gICAgICAgIHJldHVybiBzcHJEYjtcclxuICAgIH1cclxuXHJcblxyXG5cclxuICAgIHN0YXRpYyBwcmVwYXJlKCk6T2JzZXJ2YWJsZTxJREJEYXRhYmFzZT4ge1xyXG4gICAgICAgIGxldCBvYnMgPSBuZXcgT2JzZXJ2YWJsZTxJREJEYXRhYmFzZT4oKHN1YnNjcmliZXIpID0+IHtcclxuXHJcbiAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJQcmVwYXJlIGluZGV4ZWQgZGF0YWJhc2UuLi5cIilcclxuICAgICAgICAgICAgICAgIGlmIChpbmRleGVkREIpIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgb3I6IElEQk9wZW5EQlJlcXVlc3Q7XHJcbiAgICAgICAgICAgICAgICAgICAgb3IgPSBpbmRleGVkREIub3BlbihTcHJEYi5kYk5hbWUsIFNwckRiLmRiVmVyc2lvbik7XHJcbiAgICAgICAgICAgICAgICAgICAgb3Iub251cGdyYWRlbmVlZGVkID0gKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYiA9IG9yLnJlc3VsdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHI9b3IudHJhbnNhY3Rpb25cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmICghZGIub2JqZWN0U3RvcmVOYW1lcy5jb250YWlucyhTcHJEYi5SRUNPUkRJTkdfRklMRV9DQUNIRV9PQkpFQ1RfU1RPUkVfTkFNRSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0FDSEVfT0JKRUNUX1NUT1JFX05BTUUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGdXR1cmUgd29yayB0b3dhcmRzIGEgY29tcGxldGUgUFdBIHdoaWNoIHN0b3JlcyBhbGwgY2xpZW4gZGF0YSBpbiBpbmRleGVkIGRiIGFuZCBzeW5jaHJvbml6ZXMgdG8gdGhlIHNlcnZlcjogU2VlIGV4cGVyaW1lbnRhbCBHaXQgYnJhbmNoIFwicHJvZ3Jlc3NpdmVfd2ViX2FwcFwiXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoJ19zeW5jJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGRiLmNyZWF0ZU9iamVjdFN0b3JlKCdfc3luYycsIHtrZXlQYXRoOiAnaWQnLCBhdXRvSW5jcmVtZW50OnRydWV9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoJ3Byb2plY3QnKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgZGIuY3JlYXRlT2JqZWN0U3RvcmUoJ3Byb2plY3QnLCB7a2V5UGF0aDogJ25hbWUnfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKCdzZXNzaW9uJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxldCBzZXNzU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoJ3Nlc3Npb24nLCB7a2V5UGF0aDogJ3Nlc3Npb25JZCd9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHNlc3NTdG9yZS5jcmVhdGVJbmRleCgncHJvamVjdElkeCcsIFsncHJvamVjdCddLCB7dW5pcXVlOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1lbHNlIGlmKGV2Lm9sZFZlcnNpb248NSl7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgc2Vzc1N0b3JlPXRyLm9iamVjdFN0b3JlKCdzZXNzaW9uJylcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2Vzc1N0b3JlLmNyZWF0ZUluZGV4KCdwcm9qZWN0SWR4JywgWydwcm9qZWN0J10sIHt1bmlxdWU6ZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiAoIWRiLm9iamVjdFN0b3JlTmFtZXMuY29udGFpbnMoJ3NjcmlwdCcpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBsZXQgc2NyU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoJ3NjcmlwdCcsIHtrZXlQYXRoOiAnc2NyaXB0SWQnfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBzY3JTdG9yZS5jcmVhdGVJbmRleCgncHJvamVjdElkeCcsIFsncHJvamVjdCddLCB7dW5pcXVlOmZhbHNlfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy9cclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKCdyZWNmaWxlJykpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGxldCByZlN0b3JlPWRiLmNyZWF0ZU9iamVjdFN0b3JlKCdyZWNmaWxlJywge2tleVBhdGg6ICd1dWlkJ30pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmZTdG9yZS5jcmVhdGVJbmRleCgnc2Vzc0lkSWR4JywgWydzZXNzaW9uSWQnXSwge3VuaXF1ZTpmYWxzZX0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmZTdG9yZS5jcmVhdGVJbmRleCgnc2Vzc0lkSXRlbWNvZGVJZHgnLCBbJ3Nlc3Npb25JZCcsJ2l0ZW1Db2RlJ10sIHt1bmlxdWU6ZmFsc2V9KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG4gICAgICAgICAgICAgICAgICAgICAgaWYgKCFkYi5vYmplY3RTdG9yZU5hbWVzLmNvbnRhaW5zKFNwckRiLlJFQ09SRElOR19GSUxFX0NBQ0hFX09CSkVDVF9TVE9SRV9OQU1FKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJmU3RvcmU9ZGIuY3JlYXRlT2JqZWN0U3RvcmUoU3ByRGIuUkVDT1JESU5HX0ZJTEVfQ0FDSEVfT0JKRUNUX1NUT1JFX05BTUUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldi5vbGRWZXJzaW9uKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJVcGdyYWRlZCBpbmRleGVkIGRhdGFiYXNlIFwiICsgU3ByRGIuZGJOYW1lICsgXCIgc2NoZW1hIGZyb20gdmVyc2lvbiBcIiArIGV2Lm9sZFZlcnNpb24gKyBcIiB0byBcIiArIGV2Lm5ld1ZlcnNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmluZm8oXCJDcmVhdGVkIGluZGV4ZWQgZGF0YWJhc2UgXCIgKyBTcHJEYi5kYk5hbWUgKyBcIiBzY2hlbWEgdmVyc2lvbiBcIiArIGV2Lm5ld1ZlcnNpb24pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgb3Iub25zdWNjZXNzID0gKGV2KSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuaW5mbyhcIk9wZW5lZCBpbmRleGVkIGRhdGFiYXNlXCIpXHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgbGV0IGRiPW9yLnJlc3VsdDtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgLy8gaVBhZCBXRWJLaXQgd29ya2Fyb3VuZFxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gZG9lcyBub3QgaGVscCFcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgZGIub25jbG9zZT0oZXYpPT57XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgY29uc29sZS5kZWJ1ZyhcIkRCIGNsb3NlZC4uLlwiKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUuZGVidWcoXCJDbG9zZSBkYi5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIGRiLmNsb3NlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBsZXQgb3BhUnE9aW5kZXhlZERCLm9wZW4oU3ByRGIuZGJOYW1lLCBTcHJEYi5kYlZlcnNpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3BhUnEub251cGdyYWRlbmVlZGVkPShldik9Pnt9XHJcbiAgICAgICAgICAgICAgICAgICAgICAvL1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gb3BhUnEub25zdWNjZXNzPShldik9PntcclxuICAgICAgICAgICAgICAgICAgICAgIC8vICAgY29uc29sZS5kZWJ1ZyhcImFuZCBvcGVuZWQgYWdhaW5cIik7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN1YnNjcmliZXIubmV4dChvcGFScS5yZXN1bHQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyBvcGFScS5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IG9wZW4gaW5kZXhlZCBkYXRhYmFzZTogXCIgKyBTcHJEYi5kYk5hbWUgKyBcIjogXCIgKyBlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAvLyAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgICAgLy8gfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChkYik7XHJcbiAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgICAgICBvci5vbmVycm9yID0gKGVycikgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IG9wZW4gaW5kZXhlZCBkYXRhYmFzZTogXCIgKyBTcHJEYi5kYk5hbWUgKyBcIjogXCIgKyBlcnIpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5pbmZvKFwiQnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGluZGV4ZWQgZGF0YWJhc2VzXCIpXHJcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcigpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiBvYnM7XHJcbiAgICB9XHJcbn1cclxuIl19
@@ -0,0 +1,48 @@
1
+ export class DSPUtils {
2
+ static { this.OCTAVE_FACTOR = 1.0 / (Math.log(2) / Math.log(10)); }
3
+ /**
4
+ * Get normalized amplitude level in dB
5
+ * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)
6
+ * @return level in dB
7
+ */
8
+ static toLevelInDB(linearLevel) {
9
+ if (linearLevel < 0) {
10
+ throw new RangeError('Linear level argument must be positive.');
11
+ }
12
+ return 10 * Math.log(linearLevel) / Math.log(10);
13
+ }
14
+ static toLinearLevel(dbLevel) {
15
+ return Math.pow(10, (dbLevel / 10));
16
+ }
17
+ /**
18
+ * Get normalized amplitude power level in dB
19
+ * @param linearLevel a normalized positive linear level (1.0 corresponds to 0dB)
20
+ * @return power level in dB
21
+ */
22
+ static toPowerLevelInDB(linearLevel) {
23
+ if (linearLevel < 0) {
24
+ throw new RangeError('Linear level argument must be positive.');
25
+ }
26
+ return 20 * Math.log(linearLevel) / Math.log(10);
27
+ }
28
+ static toPowerLinearLevel(dbLevel) {
29
+ return Math.pow(10, (dbLevel / 20));
30
+ }
31
+ static toOctaves(fq) {
32
+ return DSPUtils.OCTAVE_FACTOR * Math.log(fq) / Math.log(10);
33
+ }
34
+ static maxLevel(audioBuffer) {
35
+ let ml = 0.0;
36
+ for (let ch = 0; ch < audioBuffer.numberOfChannels; ch++) {
37
+ const chArr = audioBuffer.getChannelData(ch);
38
+ for (let s = 0; s < chArr.length; s++) {
39
+ const l = Math.abs(chArr[s]);
40
+ if (l > ml) {
41
+ ml = l;
42
+ }
43
+ }
44
+ }
45
+ return ml;
46
+ }
47
+ }
48
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zcGVlY2hyZWNvcmRlcm5nL3NyYy9saWIvZHNwL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNJLE1BQU0sT0FBTyxRQUFRO2FBRUYsa0JBQWEsR0FBVyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUxRTs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFtQjtRQUN6QyxJQUFJLFdBQVcsR0FBRyxDQUFDLEVBQUU7WUFDakIsTUFBTSxJQUFJLFVBQVUsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO1NBQ25FO1FBRUQsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JELENBQUM7SUFHTSxNQUFNLENBQUMsYUFBYSxDQUFDLE9BQWU7UUFDdkMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLFdBQW1CO1FBQzlDLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLElBQUksVUFBVSxDQUFDLHlDQUF5QyxDQUFDLENBQUM7U0FDbkU7UUFDRCxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxPQUFlO1FBQzVDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFVO1FBQzlCLE9BQU8sUUFBUSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDaEUsQ0FBQztJQUVNLE1BQU0sQ0FBQyxRQUFRLENBQUMsV0FBd0I7UUFDM0MsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO1FBQ2IsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUN4RCxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUU7b0JBQ1YsRUFBRSxHQUFHLENBQUMsQ0FBQztpQkFDUjthQUNGO1NBQ0Y7UUFDRCxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcclxuICAgIGV4cG9ydCBjbGFzcyBEU1BVdGlscyB7XHJcblxyXG4gICAgICAgIHByaXZhdGUgc3RhdGljIE9DVEFWRV9GQUNUT1I6IG51bWJlciA9IDEuMCAvIChNYXRoLmxvZygyKSAvIE1hdGgubG9nKDEwKSk7XHJcblxyXG4gICAgICAgIC8qKlxyXG4gICAgICAgICAqIEdldCBub3JtYWxpemVkIGFtcGxpdHVkZSBsZXZlbCBpbiBkQlxyXG4gICAgICAgICAqIEBwYXJhbSBsaW5lYXJMZXZlbCBhIG5vcm1hbGl6ZWQgcG9zaXRpdmUgbGluZWFyIGxldmVsICgxLjAgY29ycmVzcG9uZHMgdG8gMGRCKVxyXG4gICAgICAgICAqIEByZXR1cm4gbGV2ZWwgaW4gZEJcclxuICAgICAgICAgKi9cclxuICAgICAgICBwdWJsaWMgc3RhdGljIHRvTGV2ZWxJbkRCKGxpbmVhckxldmVsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICBpZiAobGluZWFyTGV2ZWwgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTGluZWFyIGxldmVsIGFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUuJyk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIHJldHVybiAxMCAqIE1hdGgubG9nKGxpbmVhckxldmVsKSAvIE1hdGgubG9nKDEwKTtcclxuICAgICAgICB9XHJcblxyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIHRvTGluZWFyTGV2ZWwoZGJMZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KDEwLCAoZGJMZXZlbCAvIDEwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvKipcclxuICAgICAgICAgKiBHZXQgbm9ybWFsaXplZCBhbXBsaXR1ZGUgcG93ZXIgbGV2ZWwgaW4gZEJcclxuICAgICAgICAgKiBAcGFyYW0gbGluZWFyTGV2ZWwgYSBub3JtYWxpemVkIHBvc2l0aXZlIGxpbmVhciBsZXZlbCAoMS4wIGNvcnJlc3BvbmRzIHRvIDBkQilcclxuICAgICAgICAgKiBAcmV0dXJuIHBvd2VyIGxldmVsIGluIGRCXHJcbiAgICAgICAgICovXHJcbiAgICAgICAgcHVibGljIHN0YXRpYyB0b1Bvd2VyTGV2ZWxJbkRCKGxpbmVhckxldmVsOiBudW1iZXIpOiBudW1iZXIge1xyXG4gICAgICAgICAgICBpZiAobGluZWFyTGV2ZWwgPCAwKSB7XHJcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignTGluZWFyIGxldmVsIGFyZ3VtZW50IG11c3QgYmUgcG9zaXRpdmUuJyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIDIwICogTWF0aC5sb2cobGluZWFyTGV2ZWwpIC8gTWF0aC5sb2coMTApO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcHVibGljIHN0YXRpYyB0b1Bvd2VyTGluZWFyTGV2ZWwoZGJMZXZlbDogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIE1hdGgucG93KDEwLCAoZGJMZXZlbCAvIDIwKSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIHRvT2N0YXZlcyhmcTogbnVtYmVyKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIERTUFV0aWxzLk9DVEFWRV9GQUNUT1IgKiBNYXRoLmxvZyhmcSkgLyBNYXRoLmxvZygxMCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBwdWJsaWMgc3RhdGljIG1heExldmVsKGF1ZGlvQnVmZmVyOiBBdWRpb0J1ZmZlcik6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGxldCBtbCA9IDAuMDtcclxuICAgICAgICAgICAgZm9yIChsZXQgY2ggPSAwOyBjaCA8IGF1ZGlvQnVmZmVyLm51bWJlck9mQ2hhbm5lbHM7IGNoKyspIHtcclxuICAgICAgICAgICAgICBjb25zdCBjaEFyciA9IGF1ZGlvQnVmZmVyLmdldENoYW5uZWxEYXRhKGNoKTtcclxuICAgICAgICAgICAgICBmb3IgKGxldCBzID0gMDsgcyA8IGNoQXJyLmxlbmd0aDsgcysrKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBsID0gTWF0aC5hYnMoY2hBcnJbc10pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGwgPiBtbCkge1xyXG4gICAgICAgICAgICAgICAgICBtbCA9IGw7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiBtbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgfVxyXG4iXX0=
@@ -1,85 +1,85 @@
1
- export class BinaryByteReader {
2
- constructor(buf) {
3
- this.buf = new Uint8Array(buf);
4
- this.sbuf = new Int8Array(buf);
5
- this._pos = 0;
6
- }
7
- get pos() {
8
- return this._pos;
9
- }
10
- set pos(pos) {
11
- this._pos = pos;
12
- }
13
- length() {
14
- return this.buf.byteLength;
15
- }
16
- eof() {
17
- return (this._pos >= this.buf.byteLength);
18
- }
19
- skip(byteCound) {
20
- this.pos += 4;
21
- }
22
- readAscii(size) {
23
- let i;
24
- let txt = '';
25
- for (i = 0; i < size; i++) {
26
- txt += String.fromCharCode(this.buf[this._pos++]);
27
- }
28
- return txt;
29
- }
30
- readInt8() {
31
- return (this.buf[this._pos++]);
32
- }
33
- readInt16BE() {
34
- const b0 = this.sbuf[this._pos++];
35
- const b1 = this.buf[this._pos++];
36
- const val = (b0 << 8) | b1;
37
- return val;
38
- }
39
- readInt16LE() {
40
- const b0 = this.buf[this._pos++];
41
- const b1 = this.sbuf[this._pos++];
42
- const val = (b1 << 8) | b0;
43
- return val;
44
- }
45
- readUint16LE() {
46
- const seg = new Uint8Array(2);
47
- let i;
48
- for (i = 0; i < 2; i++) {
49
- seg[i] = this.buf[this._pos++];
50
- }
51
- let val = 0;
52
- val |= seg[1] << 8;
53
- val |= seg[0];
54
- return val;
55
- }
56
- readInt32BE() {
57
- const seg = new Uint8Array(4);
58
- let i;
59
- for (i = 0; i < 4; i++) {
60
- seg[i] = this.buf[this._pos++];
61
- }
62
- const val = seg[0] << 24 | seg[1] << 16 | seg[2] << 8 | seg[3];
63
- return val;
64
- }
65
- readUint32LE() {
66
- // this dircet data view does not work with nodejs: all avlues are zero
67
- // var seg=new Uint8Array(this.buf,this._pos,4);
68
- // ... copy value by value
69
- const seg = new Uint8Array(4);
70
- let i;
71
- for (i = 0; i < 4; i++) {
72
- seg[i] = this.buf[this._pos++];
73
- }
74
- // console.log("len:", seg.length, " ", seg.byteLength, " ", seg[0], " ", seg[1], " ", seg[2], " ", seg[3]);
75
- let val = 0;
76
- val |= seg[3] << 24;
77
- val |= seg[2] << 16;
78
- val |= seg[1] << 8;
79
- val |= seg[0];
80
- // var val = < 24(seg[3] <) | (seg[2] << 16) | (seg[1] << 8) | seg[0];
81
- // this._pos=this._pos+4;
82
- return val;
83
- }
84
- }
1
+ export class BinaryByteReader {
2
+ constructor(buf) {
3
+ this.buf = new Uint8Array(buf);
4
+ this.sbuf = new Int8Array(buf);
5
+ this._pos = 0;
6
+ }
7
+ get pos() {
8
+ return this._pos;
9
+ }
10
+ set pos(pos) {
11
+ this._pos = pos;
12
+ }
13
+ length() {
14
+ return this.buf.byteLength;
15
+ }
16
+ eof() {
17
+ return (this._pos >= this.buf.byteLength);
18
+ }
19
+ skip(byteCound) {
20
+ this.pos += 4;
21
+ }
22
+ readAscii(size) {
23
+ let i;
24
+ let txt = '';
25
+ for (i = 0; i < size; i++) {
26
+ txt += String.fromCharCode(this.buf[this._pos++]);
27
+ }
28
+ return txt;
29
+ }
30
+ readInt8() {
31
+ return (this.buf[this._pos++]);
32
+ }
33
+ readInt16BE() {
34
+ const b0 = this.sbuf[this._pos++];
35
+ const b1 = this.buf[this._pos++];
36
+ const val = (b0 << 8) | b1;
37
+ return val;
38
+ }
39
+ readInt16LE() {
40
+ const b0 = this.buf[this._pos++];
41
+ const b1 = this.sbuf[this._pos++];
42
+ const val = (b1 << 8) | b0;
43
+ return val;
44
+ }
45
+ readUint16LE() {
46
+ const seg = new Uint8Array(2);
47
+ let i;
48
+ for (i = 0; i < 2; i++) {
49
+ seg[i] = this.buf[this._pos++];
50
+ }
51
+ let val = 0;
52
+ val |= seg[1] << 8;
53
+ val |= seg[0];
54
+ return val;
55
+ }
56
+ readInt32BE() {
57
+ const seg = new Uint8Array(4);
58
+ let i;
59
+ for (i = 0; i < 4; i++) {
60
+ seg[i] = this.buf[this._pos++];
61
+ }
62
+ const val = seg[0] << 24 | seg[1] << 16 | seg[2] << 8 | seg[3];
63
+ return val;
64
+ }
65
+ readUint32LE() {
66
+ // this dircet data view does not work with nodejs: all avlues are zero
67
+ // var seg=new Uint8Array(this.buf,this._pos,4);
68
+ // ... copy value by value
69
+ const seg = new Uint8Array(4);
70
+ let i;
71
+ for (i = 0; i < 4; i++) {
72
+ seg[i] = this.buf[this._pos++];
73
+ }
74
+ // console.log("len:", seg.length, " ", seg.byteLength, " ", seg[0], " ", seg[1], " ", seg[2], " ", seg[3]);
75
+ let val = 0;
76
+ val |= seg[3] << 24;
77
+ val |= seg[2] << 16;
78
+ val |= seg[1] << 8;
79
+ val |= seg[0];
80
+ // var val = < 24(seg[3] <) | (seg[2] << 16) | (seg[1] << 8) | seg[0];
81
+ // this._pos=this._pos+4;
82
+ return val;
83
+ }
84
+ }
85
85
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluYXJ5UmVhZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL0JpbmFyeVJlYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sZ0JBQWdCO0lBS3pCLFlBQVksR0FBZ0I7UUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxJQUFJLEdBQUc7UUFDSCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUM7SUFDckIsQ0FBQztJQUVELElBQUksR0FBRyxDQUFDLEdBQVc7UUFDZixJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNGLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVELEdBQUc7UUFDQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxJQUFJLENBQUMsU0FBaUI7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELFNBQVMsQ0FBQyxJQUFZO1FBQ2xCLElBQUksQ0FBQyxDQUFDO1FBQ04sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1FBQ2IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdkIsR0FBRyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJ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RSxDQUFDO1FBQ3BCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3BCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ25CLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDZCxzRUFBc0U7UUFDdEUseUJBQXlCO1FBQ3pCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztDQUdKIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbiAgICBleHBvcnQgY2xhc3MgQmluYXJ5Qnl0ZVJlYWRlciB7XHJcbiAgICAgICAgYnVmOiBVaW50OEFycmF5O1xyXG4gICAgICAgIHNidWY6IEludDhBcnJheTtcclxuICAgICAgICBwcml2YXRlIF9wb3M6IG51bWJlcjtcclxuXHJcbiAgICAgICAgY29uc3RydWN0b3IoYnVmOiBBcnJheUJ1ZmZlcikge1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IG5ldyBVaW50OEFycmF5KGJ1Zik7XHJcbiAgICAgICAgICAgIHRoaXMuc2J1ZiA9IG5ldyBJbnQ4QXJyYXkoYnVmKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9zID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBwb3MoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNldCBwb3MocG9zOiBudW1iZXIpIHtcclxuICAgICAgICAgICAgdGhpcy5fcG9zID0gcG9zO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgbGVuZ3RoKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1Zi5ieXRlTGVuZ3RoO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZW9mKCk6IGJvb2xlYW4ge1xyXG4gICAgICAgICAgICByZXR1cm4gKHRoaXMuX3BvcyA+PSB0aGlzLmJ1Zi5ieXRlTGVuZ3RoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNraXAoYnl0ZUNvdW5kOiBudW1iZXIpe1xyXG4gICAgICAgICAgICB0aGlzLnBvcyArPSA0O1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVhZEFzY2lpKHNpemU6IG51bWJlcik6IFN0cmluZyB7XHJcbiAgICAgICAgICAgIGxldCBpO1xyXG4gICAgICAgICAgICBsZXQgdHh0ID0gJyc7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHR4dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHRoaXMuYnVmW3RoaXMuX3BvcysrXSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcmV0dXJuIHR4dDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWRJbnQ4KCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIHJldHVybiAodGhpcy5idWZbdGhpcy5fcG9zKytdKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlYWRJbnQxNkJFKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGNvbnN0IGIwID0gdGhpcy5zYnVmW3RoaXMuX3BvcysrXTtcclxuICAgICAgICAgICAgY29uc3QgYjEgPSB0aGlzLmJ1Zlt0aGlzLl9wb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICggYjAgPDwgOCApIHwgYjE7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlYWRJbnQxNkxFKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgIGNvbnN0IGIwID0gdGhpcy5idWZbdGhpcy5fcG9zKytdO1xyXG4gICAgICAgICAgICBjb25zdCBiMSA9IHRoaXMuc2J1Zlt0aGlzLl9wb3MrK107XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9ICggYjEgPDwgOCApIHwgYjA7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJlYWRVaW50MTZMRSgpOiBudW1iZXIge1xyXG4gICAgICAgICAgICBjb25zdCBzZWcgPSBuZXcgVWludDhBcnJheSgyKTtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDI7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc2VnW2ldID0gdGhpcy5idWZbdGhpcy5fcG9zKytdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGxldCB2YWwgPSAwO1xyXG4gICAgICAgICAgICB2YWwgfD0gc2VnWzFdIDw8IDg7XHJcbiAgICAgICAgICAgIHZhbCB8PSBzZWdbMF07XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZWFkSW50MzJCRSgpOiBudW1iZXIge1xyXG4gICAgICAgICAgICBjb25zdCBzZWcgPSBuZXcgVWludDhBcnJheSg0KTtcclxuICAgICAgICAgICAgbGV0IGk6IG51bWJlcjtcclxuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykge1xyXG4gICAgICAgICAgICAgICAgc2VnW2ldID0gdGhpcy5idWZbdGhpcy5fcG9zKytdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IHNlZ1swXSA8PCAyNCB8IHNlZ1sxXSA8PCAxNiB8IHNlZ1syXSA8PCA4IHwgc2VnWzNdO1xyXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmVhZFVpbnQzMkxFKCk6IG51bWJlciB7XHJcbiAgICAgICAgICAgICAvLyB0aGlzIGRpcmNldCBkYXRhIHZpZXcgZG9lcyBub3Qgd29yayB3aXRoIG5vZGVqczogYWxsIGF2bHVlcyBhcmUgemVyb1xyXG4gICAgICAgICAgICAvLyB2YXIgc2VnPW5ldyBVaW50OEFycmF5KHRoaXMuYnVmLHRoaXMuX3Bvcyw0KTtcclxuICAgICAgICAgICAgLy8gLi4uIGNvcHkgdmFsdWUgYnkgdmFsdWVcclxuICAgICAgICAgICAgY29uc3Qgc2VnID0gbmV3IFVpbnQ4QXJyYXkoNCk7XHJcbiAgICAgICAgICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHtcclxuICAgICAgICAgICAgICAgIHNlZ1tpXSA9IHRoaXMuYnVmW3RoaXMuX3BvcysrXTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImxlbjpcIiwgc2VnLmxlbmd0aCwgXCIgXCIsIHNlZy5ieXRlTGVuZ3RoLCBcIiBcIiwgc2VnWzBdLCBcIiBcIiwgc2VnWzFdLCBcIiBcIiwgc2VnWzJdLCBcIiBcIiwgc2VnWzNdKTtcclxuICAgICAgICAgICAgbGV0IHZhbCA9IDA7XHJcbiAgICAgICAgICAgIHZhbCB8PSBzZWdbM10gPDwgMjQ7XHJcbiAgICAgICAgICAgIHZhbCB8PSBzZWdbMl0gPDwgMTY7XHJcbiAgICAgICAgICAgIHZhbCB8PSBzZWdbMV0gPDwgODtcclxuICAgICAgICAgICAgdmFsIHw9IHNlZ1swXTtcclxuICAgICAgICAgICAgLy8gdmFyIHZhbCA9IDwgMjQoc2VnWzNdIDwpIHwgKHNlZ1syXSA8PCAxNikgfCAoc2VnWzFdIDw8IDgpIHwgc2VnWzBdO1xyXG4gICAgICAgICAgICAvLyB0aGlzLl9wb3M9dGhpcy5fcG9zKzQ7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWw7XHJcbiAgICAgICAgfVxyXG5cclxuXHJcbiAgICB9XHJcbiJdfQ==
@@ -0,0 +1,74 @@
1
+ export class BinaryByteWriter {
2
+ static { this.DEFAULT_SIZE_INC = 1024; }
3
+ constructor() {
4
+ const size = BinaryByteWriter.DEFAULT_SIZE_INC;
5
+ this.buf = new ArrayBuffer(size);
6
+ this._pos = 0;
7
+ }
8
+ get pos() {
9
+ return this._pos;
10
+ }
11
+ ensureCapacity(numBytes) {
12
+ while (this._pos + numBytes >= this.buf.byteLength) {
13
+ // buffer increment
14
+ let inc = BinaryByteWriter.DEFAULT_SIZE_INC;
15
+ if (inc < numBytes) {
16
+ inc = numBytes;
17
+ }
18
+ const newSize = this.buf.byteLength + inc;
19
+ const arrOld = new Uint8Array(this.buf, 0, this._pos);
20
+ const arrNew = new Uint8Array(newSize);
21
+ arrNew.set(arrOld);
22
+ this.buf = arrNew.buffer;
23
+ }
24
+ }
25
+ writeUint8(val) {
26
+ this.ensureCapacity(1);
27
+ const valView = new DataView(this.buf, this._pos, 1);
28
+ valView.setUint8(0, val);
29
+ this._pos++;
30
+ }
31
+ writeUint16(val, le) {
32
+ this.ensureCapacity(2);
33
+ const valView = new DataView(this.buf, this._pos, 2);
34
+ valView.setUint16(0, val, le);
35
+ this._pos += 2;
36
+ }
37
+ writeInt16(val, le) {
38
+ this.ensureCapacity(2);
39
+ const valView = new DataView(this.buf, this._pos, 2);
40
+ valView.setInt16(0, val, le);
41
+ this._pos += 2;
42
+ }
43
+ writeUint32(val, le) {
44
+ this.ensureCapacity(4);
45
+ const valView = new DataView(this.buf, this._pos, 4);
46
+ valView.setUint32(0, val, le);
47
+ this._pos += 4;
48
+ }
49
+ writeInt32(val, le) {
50
+ this.ensureCapacity(4);
51
+ const valView = new DataView(this.buf, this._pos, 4);
52
+ valView.setInt32(0, val, le);
53
+ this._pos += 4;
54
+ }
55
+ finish() {
56
+ const finalArr = new Uint8Array(this._pos);
57
+ const dv = new DataView(this.buf, 0, this._pos);
58
+ for (let i = 0; i < this._pos; i++) {
59
+ finalArr[i] = dv.getUint8(i);
60
+ }
61
+ return finalArr;
62
+ }
63
+ writeAscii(text) {
64
+ let i;
65
+ for (i = 0; i < text.length; i++) {
66
+ const asciiCode = text.charCodeAt(i);
67
+ if (asciiCode < 0 || asciiCode > 255) {
68
+ throw new Error('Not an ASCII character at char ' + i + ' in ' + text);
69
+ }
70
+ this.writeUint8(asciiCode);
71
+ }
72
+ }
73
+ }
74
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluYXJ5V3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc3BlZWNocmVjb3JkZXJuZy9zcmMvbGliL2lvL0JpbmFyeVdyaXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDSSxNQUFNLE9BQU8sZ0JBQWdCO2FBQ2xCLHFCQUFnQixHQUFHLElBQUksQ0FBQztJQUkvQjtRQUNJLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELElBQUksR0FBRztRQUNILE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQsY0FBYyxDQUFDLFFBQWdCO1FBRTdCLE9BQVEsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUc7WUFDcEQsbUJBQW1CO1lBQ2pCLElBQUksR0FBRyxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixDQUFDO1lBQzVDLElBQUksR0FBRyxHQUFHLFFBQVEsRUFBRTtnQkFDaEIsR0FBRyxHQUFHLFFBQVEsQ0FBQzthQUNsQjtZQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLEdBQUcsQ0FBQztZQUU1QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNuQixJQUFJLENBQUMsR0FBRyxHQUFH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TSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2hDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDckMsSUFBSSxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsR0FBRyxHQUFHLEVBQUU7Z0JBQ3BDLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLEdBQUcsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQzthQUN4RTtZQUNELElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDNUI7SUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXHJcbiAgICBleHBvcnQgY2xhc3MgQmluYXJ5Qnl0ZVdyaXRlciB7XHJcbiAgICAgICAgc3RhdGljIERFRkFVTFRfU0laRV9JTkMgPSAxMDI0O1xyXG4gICAgICAgIGJ1ZjogQXJyYXlCdWZmZXI7XHJcbiAgICAgICAgcHJpdmF0ZSBfcG9zOiBudW1iZXI7XHJcblxyXG4gICAgICAgIGNvbnN0cnVjdG9yKCkge1xyXG4gICAgICAgICAgICBjb25zdCBzaXplID0gQmluYXJ5Qnl0ZVdyaXRlci5ERUZBVUxUX1NJWkVfSU5DO1xyXG4gICAgICAgICAgICB0aGlzLmJ1ZiA9IG5ldyBBcnJheUJ1ZmZlcihzaXplKTtcclxuICAgICAgICAgICAgdGhpcy5fcG9zID0gMDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGdldCBwb3MoKTogbnVtYmVyIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGVuc3VyZUNhcGFjaXR5KG51bUJ5dGVzOiBudW1iZXIpIHtcclxuXHJcbiAgICAgICAgICB3aGlsZSAoIHRoaXMuX3BvcyArIG51bUJ5dGVzID49IHRoaXMuYnVmLmJ5dGVMZW5ndGggKSB7XHJcbiAgICAgICAgICAgIC8vIGJ1ZmZlciBpbmNyZW1lbnRcclxuICAgICAgICAgICAgICBsZXQgaW5jID0gQmluYXJ5Qnl0ZVdyaXRlci5ERUZBVUxUX1NJWkVfSU5DO1xyXG4gICAgICAgICAgICAgIGlmIChpbmMgPCBudW1CeXRlcykge1xyXG4gICAgICAgICAgICAgICAgICBpbmMgPSBudW1CeXRlcztcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgY29uc3QgbmV3U2l6ZSA9IHRoaXMuYnVmLmJ5dGVMZW5ndGggKyBpbmM7XHJcblxyXG4gICAgICAgICAgICBjb25zdCBhcnJPbGQgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ1ZiwgMCwgdGhpcy5fcG9zKTtcclxuICAgICAgICAgICAgY29uc3QgYXJyTmV3ID0gbmV3IFVpbnQ4QXJyYXkobmV3U2l6ZSk7XHJcbiAgICAgICAgICAgIGFyck5ldy5zZXQoYXJyT2xkKTtcclxuICAgICAgICAgICAgdGhpcy5idWYgPSBhcnJOZXcuYnVmZmVyO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgd3JpdGVVaW50OCh2YWw6IG51bWJlcik6IHZvaWQge1xyXG4gICAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSgxKTtcclxuICAgICAgICAgIGNvbnN0IHZhbFZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWYsIHRoaXMuX3BvcywgMSk7XHJcbiAgICAgICAgICB2YWxWaWV3LnNldFVpbnQ4KDAsIHZhbCk7XHJcbiAgICAgICAgICB0aGlzLl9wb3MrKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICB3cml0ZVVpbnQxNih2YWw6IG51bWJlciwgbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVuc3VyZUNhcGFjaXR5KDIpO1xyXG4gICAgICAgIGNvbnN0IHZhbFZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWYsIHRoaXMuX3BvcywgMik7XHJcbiAgICAgICAgdmFsVmlldy5zZXRVaW50MTYoMCwgdmFsLCBsZSk7XHJcbiAgICAgICAgdGhpcy5fcG9zICs9IDI7XHJcblxyXG4gICAgICB9XHJcbiAgICAgIHdyaXRlSW50MTYodmFsOiBudW1iZXIsIGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSgyKTtcclxuICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmLCB0aGlzLl9wb3MsIDIpO1xyXG4gICAgICAgIHZhbFZpZXcuc2V0SW50MTYoMCwgdmFsLCBsZSk7XHJcbiAgICAgICAgdGhpcy5fcG9zICs9IDI7XHJcbiAgICAgIH1cclxuXHJcblxyXG4gICAgICB3cml0ZVVpbnQzMih2YWw6IG51bWJlciwgbGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmVuc3VyZUNhcGFjaXR5KDQpO1xyXG4gICAgICAgIGNvbnN0IHZhbFZpZXcgPSBuZXcgRGF0YVZpZXcodGhpcy5idWYsIHRoaXMuX3BvcywgNCk7XHJcbiAgICAgICAgdmFsVmlldy5zZXRVaW50MzIoMCwgdmFsLCBsZSk7XHJcbiAgICAgICAgdGhpcy5fcG9zICs9IDQ7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHdyaXRlSW50MzIodmFsOiBudW1iZXIsIGxlOiBib29sZWFuKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5lbnN1cmVDYXBhY2l0eSg0KTtcclxuICAgICAgICBjb25zdCB2YWxWaWV3ID0gbmV3IERhdGFWaWV3KHRoaXMuYnVmLCB0aGlzLl9wb3MsIDQpO1xyXG4gICAgICAgIHZhbFZpZXcuc2V0SW50MzIoMCwgdmFsLCBsZSk7XHJcbiAgICAgICAgdGhpcy5fcG9zICs9IDQ7XHJcbiAgICAgIH1cclxuICAgICAgICBmaW5pc2goKTogVWludDhBcnJheSB7XHJcbiAgICAgICAgICBjb25zdCBmaW5hbEFyciA9IG5ldyBVaW50OEFycmF5KHRoaXMuX3Bvcyk7XHJcbiAgICAgICAgICBjb25zdCBkdiA9IG5ldyBEYXRhVmlldyh0aGlzLmJ1ZiwgMCwgdGhpcy5fcG9zKTtcclxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fcG9zOyBpKyspIHtcclxuICAgICAgICAgICAgZmluYWxBcnJbaV0gPSBkdi5nZXRVaW50OChpKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBmaW5hbEFycjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdyaXRlQXNjaWkodGV4dDogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgICAgIGxldCBpO1xyXG4gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICAgIGNvbnN0IGFzY2lpQ29kZSA9IHRleHQuY2hhckNvZGVBdChpKTtcclxuICAgICAgICAgICAgICBpZiAoYXNjaWlDb2RlIDwgMCB8fCBhc2NpaUNvZGUgPiAyNTUpIHtcclxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTm90IGFuIEFTQ0lJIGNoYXJhY3RlciBhdCBjaGFyICcgKyBpICsgJyBpbiAnICsgdGV4dCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIHRoaXMud3JpdGVVaW50OChhc2NpaUNvZGUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgIH1cclxuXHJcbiJdfQ==