fmode-ng 0.0.39 → 0.0.41

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 (100) hide show
  1. package/esm2022/fmode-ng.mjs +5 -10
  2. package/esm2022/lib/aigc/agent/agent.prompt.mjs +122 -10
  3. package/esm2022/lib/aigc/agent/index.mjs +2 -10
  4. package/esm2022/lib/aigc/avatar/avatar.module.mjs +45 -10
  5. package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +2 -10
  6. package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +315 -10
  7. package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +3 -10
  8. package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +57 -10
  9. package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +97 -10
  10. package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +104 -10
  11. package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +111 -10
  12. package/esm2022/lib/aigc/avatar/index.mjs +8 -10
  13. package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +2 -10
  14. package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +166 -8
  15. package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +36 -10
  16. package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +2 -10
  17. package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +141 -8
  18. package/esm2022/lib/aigc/chat/chat-list/index.mjs +2 -10
  19. package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +40 -10
  20. package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +2 -10
  21. package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +92 -10
  22. package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +2 -10
  23. package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +2 -10
  24. package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +207 -8
  25. package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +236 -10
  26. package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +137 -10
  27. package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +69 -10
  28. package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +2 -10
  29. package/esm2022/lib/aigc/chat/index.mjs +8 -10
  30. package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +82 -10
  31. package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +269 -8
  32. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +51 -10
  33. package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +24 -10
  34. package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +94 -10
  35. package/esm2022/lib/aigc/index.mjs +13 -10
  36. package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +21 -10
  37. package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +736 -8
  38. package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +181 -8
  39. package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +7 -10
  40. package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +194 -9
  41. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +27 -10
  42. package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +27 -10
  43. package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +68 -10
  44. package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +229 -8
  45. package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +2 -10
  46. package/esm2022/lib/aigc/voice/audio.player.mjs +52 -10
  47. package/esm2022/lib/aigc/voice/class-asr.mjs +79 -8
  48. package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +501 -8
  49. package/esm2022/lib/aigc/voice/index.mjs +3 -10
  50. package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +38 -10
  51. package/esm2022/lib/aigc/voice/lib/resample.mjs +34 -10
  52. package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +233 -8
  53. package/esm2022/lib/aigc/voice/tts/index.mjs +2 -10
  54. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +190 -10
  55. package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +33 -10
  56. package/esm2022/lib/map/index.mjs +4 -10
  57. package/esm2022/lib/map/map.module.mjs +61 -10
  58. package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +110 -10
  59. package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +98 -8
  60. package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +100 -8
  61. package/esm2022/lib/nova-cloud/index.mjs +2 -10
  62. package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +148 -10
  63. package/esm2022/lib/platform/cross.service.mjs +63 -10
  64. package/esm2022/lib/platform/index.mjs +2 -10
  65. package/esm2022/lib/social/index.mjs +2 -10
  66. package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +236 -8
  67. package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +59 -10
  68. package/esm2022/lib/storage/index.mjs +5 -10
  69. package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +130 -8
  70. package/esm2022/lib/storage/service-upload/index.mjs +2 -10
  71. package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +462 -8
  72. package/esm2022/lib/storage/service-upload/util-file-md5.mjs +28 -10
  73. package/esm2022/lib/storage/storage.module.mjs +41 -10
  74. package/esm2022/lib/user/account/account.service.mjs +221 -10
  75. package/esm2022/lib/user/captcha/captcha.component.mjs +135 -10
  76. package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +62 -10
  77. package/esm2022/lib/user/index.mjs +17 -10
  78. package/esm2022/lib/user/login/auth.guard.mjs +28 -10
  79. package/esm2022/lib/user/login/auth.service.mjs +373 -8
  80. package/esm2022/lib/user/login/login.component.mjs +913 -10
  81. package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +273 -10
  82. package/esm2022/lib/user/profile/auth-profile.guard.mjs +27 -10
  83. package/esm2022/lib/user/profile/auth-profile.service.mjs +122 -10
  84. package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +115 -10
  85. package/esm2022/lib/user/profile/profile.module.mjs +57 -10
  86. package/esm2022/lib/user/staff/index.mjs +4 -10
  87. package/esm2022/lib/user/staff/staff.guard.mjs +26 -10
  88. package/esm2022/lib/user/staff/staff.module.mjs +18 -10
  89. package/esm2022/lib/user/staff/staff.service.mjs +85 -10
  90. package/esm2022/lib/user/user-name.pipe.mjs +29 -10
  91. package/esm2022/lib/user/user.module.mjs +106 -10
  92. package/esm2022/lib/video/fm-video/fm-video.component.mjs +67 -10
  93. package/esm2022/lib/video/index.mjs +2 -10
  94. package/esm2022/public-api.mjs +13 -10
  95. package/fesm2022/fmode-ng.mjs +8895 -7
  96. package/fesm2022/fmode-ng.mjs.map +1 -1
  97. package/lib/user/login/auth.service.d.ts +18 -3
  98. package/lib/user/modal-user-login/modal-user-login.component.d.ts +4 -2
  99. package/package.json +1 -1
  100. package/LICENSE.md +0 -8
@@ -1,10 +1,38 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/lib/pcm2wav.mjs
7
- */
8
- export function pcmtoWav(e,n,u,r){let a={chunkId:[82,73,70,70],chunkSize:0,format:[87,65,86,69],subChunk1Id:[102,109,116,32],subChunk1Size:16,audioFormat:1,numChannels:u||1,sampleRate:n||16e3,byteRate:0,blockAlign:0,bitsPerSample:r||16,subChunk2Id:[100,97,116,97],subChunk2Size:0};function u32ToArray(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]}function u16ToArray(e){return[255&e,e>>8&255]}let t=new Uint8Array(e);a.blockAlign=a.numChannels*a.bitsPerSample>>3,a.byteRate=a.blockAlign*a.sampleRate,a.subChunk2Size=t.length*(a.bitsPerSample>>3),a.chunkSize=36+a.subChunk2Size;let o=a.chunkId.concat(u32ToArray(a.chunkSize),a.format,a.subChunk1Id,u32ToArray(a.subChunk1Size),u16ToArray(a.audioFormat),u16ToArray(a.numChannels),u32ToArray(a.sampleRate),u32ToArray(a.byteRate),u16ToArray(a.blockAlign),u16ToArray(a.bitsPerSample),a.subChunk2Id,u32ToArray(a.subChunk2Size)),i=new Uint8Array(o),l=new Uint8Array(i.length+t.length);return l.set(i),l.set(t,i.length),new Blob([l],{type:"audio/wav"})}
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL2xpYi9wY20yd2F2Lm1qcw==`
10
-
1
+ export function pcmtoWav(pcmsrt, sampleRate, numChannels, bitsPerSample) {
2
+ //参数->(base64编码的pcm流,采样频率,声道数,采样位数)
3
+ let header = {
4
+ // OFFS SIZE NOTES
5
+ chunkId: [0x52, 0x49, 0x46, 0x46], // 0 4 "RIFF" = 0x52494646
6
+ chunkSize: 0, // 4 4 36+SubChunk2Size = 4+(8+SubChunk1Size)+(8+SubChunk2Size)
7
+ format: [0x57, 0x41, 0x56, 0x45], // 8 4 "WAVE" = 0x57415645
8
+ subChunk1Id: [0x66, 0x6d, 0x74, 0x20], // 12 4 "fmt " = 0x666d7420
9
+ subChunk1Size: 16, // 16 4 16 for PCM
10
+ audioFormat: 1, // 20 2 PCM = 1
11
+ numChannels: numChannels || 1, // 22 2 Mono = 1, Stereo = 2...
12
+ sampleRate: sampleRate || 16000, // 24 4 8000, 44100...
13
+ byteRate: 0, // 28 4 SampleRate*NumChannels*BitsPerSample/8
14
+ blockAlign: 0, // 32 2 NumChannels*BitsPerSample/8
15
+ bitsPerSample: bitsPerSample || 16, // 34 2 8 bits = 8, 16 bits = 16
16
+ subChunk2Id: [0x64, 0x61, 0x74, 0x61], // 36 4 "data" = 0x64617461
17
+ subChunk2Size: 0, // 40 4 data size = NumSamples*NumChannels*BitsPerSample/8
18
+ };
19
+ function u32ToArray(i) {
20
+ return [i & 0xff, (i >> 8) & 0xff, (i >> 16) & 0xff, (i >> 24) & 0xff];
21
+ }
22
+ function u16ToArray(i) {
23
+ return [i & 0xff, (i >> 8) & 0xff];
24
+ }
25
+ let pcm = new Uint8Array(pcmsrt);
26
+ header.blockAlign = (header.numChannels * header.bitsPerSample) >> 3;
27
+ header.byteRate = header.blockAlign * header.sampleRate;
28
+ header.subChunk2Size = pcm.length * (header.bitsPerSample >> 3);
29
+ header.chunkSize = 36 + header.subChunk2Size;
30
+ let wavHeader = header.chunkId.concat(u32ToArray(header.chunkSize), header.format, header.subChunk1Id, u32ToArray(header.subChunk1Size), u16ToArray(header.audioFormat), u16ToArray(header.numChannels), u32ToArray(header.sampleRate), u32ToArray(header.byteRate), u16ToArray(header.blockAlign), u16ToArray(header.bitsPerSample), header.subChunk2Id, u32ToArray(header.subChunk2Size));
31
+ let wavHeaderUnit8 = new Uint8Array(wavHeader);
32
+ let mergedArray = new Uint8Array(wavHeaderUnit8.length + pcm.length);
33
+ mergedArray.set(wavHeaderUnit8);
34
+ mergedArray.set(pcm, wavHeaderUnit8.length);
35
+ let blob = new Blob([mergedArray], { type: 'audio/wav' });
36
+ return blob;
37
+ }
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGNtMndhdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvYWlnYy92b2ljZS9saWIvcGNtMndhdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxNQUFNLFVBQVUsUUFBUSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLGFBQWE7SUFDckUsbUNBQW1DO0lBQ25DLElBQUksTUFBTSxHQUFHO1FBQ1gsa0JBQWtCO1FBQ2xCLE9BQU8sRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLGdDQUFnQztRQUNuRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLHFFQUFxRTtRQUNuRixNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsRUFBRSxnQ0FBZ0M7UUFDbEUsV0FBVyxFQUFFLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsZ0NBQWdDO1FBQ3ZFLGFBQWEsRUFBRSxFQUFFLEVBQUUsdUJBQXVCO1FBQzFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsb0JBQW9CO1FBQ3BDLFdBQVcsRUFBRSxXQUFXLElBQUksQ0FBQyxFQUFFLG9DQUFvQztRQUNuRSxVQUFVLEVBQUUsVUFBVSxJQUFJLEtBQUssRUFBRSwyQkFBMkI7UUFDNUQsUUFBUSxFQUFFLENBQUMsRUFBRSxtREFBbUQ7UUFDaEUsVUFBVSxFQUFFLENBQUMsRUFBRSx3Q0FBd0M7UUFDdkQsYUFBYSxFQUFFLGFBQWEsSUFBSSxFQUFFLEVBQUUscUNBQXFDO1FBQ3pFLFdBQVcsRUFBRSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLGdDQUFnQztRQUN2RSxhQUFhLEVBQUUsQ0FBQyxFQUFFLCtEQUErRDtLQUNsRixDQUFBO0lBQ0QsU0FBUyxVQUFVLENBQUMsQ0FBQztRQUNuQixPQUFPLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3hFLENBQUM7SUFDRCxTQUFTLFVBQVUsQ0FBQyxDQUFDO1FBQ25CLE9BQU8sQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFBO0lBQ3BDLENBQUM7SUFDRCxJQUFJLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUNoQyxNQUFNLENBQUMsVUFBVSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3BFLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFBO0lBQ3ZELE1BQU0sQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLE1BQU0sQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDLENBQUE7SUFDL0QsTUFBTSxDQUFDLFNBQVMsR0FBRyxFQUFFLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQTtJQUU1QyxJQUFJLFNBQVMsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FDbkMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFDNUIsTUFBTSxDQUFDLE1BQU0sRUFDYixNQUFNLENBQUMsV0FBVyxFQUNsQixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUNoQyxVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUM5QixVQUFVLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUM5QixVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUM3QixVQUFVLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUMzQixVQUFVLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxFQUM3QixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxFQUNoQyxNQUFNLENBQUMsV0FBVyxFQUNsQixVQUFVLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUNqQyxDQUFBO0lBQ0QsSUFBSSxjQUFjLEdBQUcsSUFBSSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUE7SUFFOUMsSUFBSSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsY0FBYyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDcEUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQTtJQUMvQixXQUFXLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDM0MsSUFBSSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxXQUFXLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFBO0lBQ3pELE9BQU8sSUFBSSxDQUFBO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuZXhwb3J0IGZ1bmN0aW9uIHBjbXRvV2F2KHBjbXNydCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIGJpdHNQZXJTYW1wbGUpIHtcbiAgLy/lj4LmlbAtPu+8iGJhc2U2NOe8lueggeeahHBjbea1ge+8jOmHh+agt+mikeeOh++8jOWjsOmBk+aVsO+8jOmHh+agt+S9jeaVsO+8iVxuICBsZXQgaGVhZGVyID0ge1xuICAgIC8vIE9GRlMgU0laRSBOT1RFU1xuICAgIGNodW5rSWQ6IFsweDUyLCAweDQ5LCAweDQ2LCAweDQ2XSwgLy8gMCAgICA0ICAgIFwiUklGRlwiID0gMHg1MjQ5NDY0NlxuICAgIGNodW5rU2l6ZTogMCwgLy8gNCAgICA0ICAgIDM2K1N1YkNodW5rMlNpemUgPSA0Kyg4K1N1YkNodW5rMVNpemUpKyg4K1N1YkNodW5rMlNpemUpXG4gICAgZm9ybWF0OiBbMHg1NywgMHg0MSwgMHg1NiwgMHg0NV0sIC8vIDggICAgNCAgICBcIldBVkVcIiA9IDB4NTc0MTU2NDVcbiAgICBzdWJDaHVuazFJZDogWzB4NjYsIDB4NmQsIDB4NzQsIDB4MjBdLCAvLyAxMiAgIDQgICAgXCJmbXQgXCIgPSAweDY2NmQ3NDIwXG4gICAgc3ViQ2h1bmsxU2l6ZTogMTYsIC8vIDE2ICAgNCAgICAxNiBmb3IgUENNXG4gICAgYXVkaW9Gb3JtYXQ6IDEsIC8vIDIwICAgMiAgICBQQ00gPSAxXG4gICAgbnVtQ2hhbm5lbHM6IG51bUNoYW5uZWxzIHx8IDEsIC8vIDIyICAgMiAgICBNb25vID0gMSwgU3RlcmVvID0gMi4uLlxuICAgIHNhbXBsZVJhdGU6IHNhbXBsZVJhdGUgfHwgMTYwMDAsIC8vIDI0ICAgNCAgICA4MDAwLCA0NDEwMC4uLlxuICAgIGJ5dGVSYXRlOiAwLCAvLyAyOCAgIDQgICAgU2FtcGxlUmF0ZSpOdW1DaGFubmVscypCaXRzUGVyU2FtcGxlLzhcbiAgICBibG9ja0FsaWduOiAwLCAvLyAzMiAgIDIgICAgTnVtQ2hhbm5lbHMqQml0c1BlclNhbXBsZS84XG4gICAgYml0c1BlclNhbXBsZTogYml0c1BlclNhbXBsZSB8fCAxNiwgLy8gMzQgICAyICAgIDggYml0cyA9IDgsIDE2IGJpdHMgPSAxNlxuICAgIHN1YkNodW5rMklkOiBbMHg2NCwgMHg2MSwgMHg3NCwgMHg2MV0sIC8vIDM2ICAgNCAgICBcImRhdGFcIiA9IDB4NjQ2MTc0NjFcbiAgICBzdWJDaHVuazJTaXplOiAwLCAvLyA0MCAgIDQgICAgZGF0YSBzaXplID0gTnVtU2FtcGxlcypOdW1DaGFubmVscypCaXRzUGVyU2FtcGxlLzhcbiAgfVxuICBmdW5jdGlvbiB1MzJUb0FycmF5KGkpIHtcbiAgICByZXR1cm4gW2kgJiAweGZmLCAoaSA+PiA4KSAmIDB4ZmYsIChpID4+IDE2KSAmIDB4ZmYsIChpID4+IDI0KSAmIDB4ZmZdXG4gIH1cbiAgZnVuY3Rpb24gdTE2VG9BcnJheShpKSB7XG4gICAgcmV0dXJuIFtpICYgMHhmZiwgKGkgPj4gOCkgJiAweGZmXVxuICB9XG4gIGxldCBwY20gPSBuZXcgVWludDhBcnJheShwY21zcnQpXG4gIGhlYWRlci5ibG9ja0FsaWduID0gKGhlYWRlci5udW1DaGFubmVscyAqIGhlYWRlci5iaXRzUGVyU2FtcGxlKSA+PiAzXG4gIGhlYWRlci5ieXRlUmF0ZSA9IGhlYWRlci5ibG9ja0FsaWduICogaGVhZGVyLnNhbXBsZVJhdGVcbiAgaGVhZGVyLnN1YkNodW5rMlNpemUgPSBwY20ubGVuZ3RoICogKGhlYWRlci5iaXRzUGVyU2FtcGxlID4+IDMpXG4gIGhlYWRlci5jaHVua1NpemUgPSAzNiArIGhlYWRlci5zdWJDaHVuazJTaXplXG5cbiAgbGV0IHdhdkhlYWRlciA9IGhlYWRlci5jaHVua0lkLmNvbmNhdChcbiAgICB1MzJUb0FycmF5KGhlYWRlci5jaHVua1NpemUpLFxuICAgIGhlYWRlci5mb3JtYXQsXG4gICAgaGVhZGVyLnN1YkNodW5rMUlkLFxuICAgIHUzMlRvQXJyYXkoaGVhZGVyLnN1YkNodW5rMVNpemUpLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmF1ZGlvRm9ybWF0KSxcbiAgICB1MTZUb0FycmF5KGhlYWRlci5udW1DaGFubmVscyksXG4gICAgdTMyVG9BcnJheShoZWFkZXIuc2FtcGxlUmF0ZSksXG4gICAgdTMyVG9BcnJheShoZWFkZXIuYnl0ZVJhdGUpLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmJsb2NrQWxpZ24pLFxuICAgIHUxNlRvQXJyYXkoaGVhZGVyLmJpdHNQZXJTYW1wbGUpLFxuICAgIGhlYWRlci5zdWJDaHVuazJJZCxcbiAgICB1MzJUb0FycmF5KGhlYWRlci5zdWJDaHVuazJTaXplKVxuICApXG4gIGxldCB3YXZIZWFkZXJVbml0OCA9IG5ldyBVaW50OEFycmF5KHdhdkhlYWRlcilcblxuICBsZXQgbWVyZ2VkQXJyYXkgPSBuZXcgVWludDhBcnJheSh3YXZIZWFkZXJVbml0OC5sZW5ndGggKyBwY20ubGVuZ3RoKVxuICBtZXJnZWRBcnJheS5zZXQod2F2SGVhZGVyVW5pdDgpXG4gIG1lcmdlZEFycmF5LnNldChwY20sIHdhdkhlYWRlclVuaXQ4Lmxlbmd0aClcbiAgbGV0IGJsb2IgPSBuZXcgQmxvYihbbWVyZ2VkQXJyYXldLCB7IHR5cGU6ICdhdWRpby93YXYnIH0pXG4gIHJldHVybiBibG9iXG59XG4iXX0=
@@ -1,10 +1,34 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/lib/resample.mjs
7
- */
8
- export function resampleAudio(t,r,e){let o=t.length,n=Math.floor(o/r*e),l=[];for(let o=0;o<n;o++){let n=Math.floor(o*(r/e));l[o]=t[n]}return l}export function convertFrameBufferToBase64(t){const r=new Uint8Array(2*t.length);for(let e=0;e<t.length;e++){const o=t[e];r[2*e]=255&o,r[2*e+1]=o>>8&255}return btoa(String.fromCharCode.apply(null,r))}export function resampleBuffer(t,r,e){const o=r/e,n=Math.round(t.length/o),l=new Int16Array(n);for(let r=0;r<n;r++){const e=Math.floor(r*o);l[r]=t[e]}return l}
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL2xpYi9yZXNhbXBsZS5tanM=`
10
-
1
+ export function resampleAudio(frameBuffer, inputSampleRate, outputSampleRate) {
2
+ let inputLength = frameBuffer.length;
3
+ let outputLength = Math.floor((inputLength / inputSampleRate) * outputSampleRate);
4
+ let outputBuffer = [];
5
+ for (let i = 0; i < outputLength; i++) {
6
+ let index = Math.floor(i * (inputSampleRate / outputSampleRate));
7
+ outputBuffer[i] = frameBuffer[index];
8
+ }
9
+ return outputBuffer;
10
+ }
11
+ export function convertFrameBufferToBase64(frameBuffer) {
12
+ // 创建一个存储转换后数据的Uint8Array
13
+ const uint8Array = new Uint8Array(frameBuffer.length * 2); // 16位小端LE,每个样本占用2个字节
14
+ // 将frameBuffer中的每个样本转换为16位小端字节序
15
+ for (let i = 0; i < frameBuffer.length; i++) {
16
+ const sample = frameBuffer[i];
17
+ uint8Array[i * 2] = sample & 0xff; // 低字节
18
+ uint8Array[i * 2 + 1] = (sample >> 8) & 0xff; // 高字节
19
+ }
20
+ // 使用btoa函数将Uint8Array转换为base64字符串
21
+ const base64String = btoa(String.fromCharCode.apply(null, uint8Array));
22
+ return base64String;
23
+ }
24
+ export function resampleBuffer(buffer, fromRate, toRate) {
25
+ const ratio = fromRate / toRate;
26
+ const length = Math.round(buffer.length / ratio);
27
+ const result = new Int16Array(length);
28
+ for (let i = 0; i < length; i++) {
29
+ const j = Math.floor(i * ratio);
30
+ result[i] = buffer[j];
31
+ }
32
+ return result;
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzYW1wbGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2Mvdm9pY2UvbGliL3Jlc2FtcGxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxhQUFhLENBQUMsV0FBcUIsRUFBRSxlQUF1QixFQUFFLGdCQUF3QjtJQUNsRyxJQUFJLFdBQVcsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ3JDLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztJQUNsRixJQUFJLFlBQVksR0FBYSxFQUFFLENBQUM7SUFFaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ3RDLElBQUksS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztRQUNqRSxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUgsTUFBTSxVQUFVLDBCQUEwQixDQUFDLFdBQXFCO0lBQ2hFLHlCQUF5QjtJQUN6QixNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCO0lBRWhGLGdDQUFnQztJQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzFDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxNQUFNO1FBQ3pDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLE1BQU07SUFDeEQsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxZQUFZLENBQUM7QUFDcEIsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBa0IsRUFBRSxRQUFnQixFQUFFLE1BQWM7SUFDakYsTUFBTSxLQUFLLEdBQUcsUUFBUSxHQUFHLE1BQU0sQ0FBQztJQUNoQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDakQsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFdEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZnVuY3Rpb24gcmVzYW1wbGVBdWRpbyhmcmFtZUJ1ZmZlcjogbnVtYmVyW10sIGlucHV0U2FtcGxlUmF0ZTogbnVtYmVyLCBvdXRwdXRTYW1wbGVSYXRlOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gICAgbGV0IGlucHV0TGVuZ3RoID0gZnJhbWVCdWZmZXIubGVuZ3RoO1xuICAgIGxldCBvdXRwdXRMZW5ndGggPSBNYXRoLmZsb29yKChpbnB1dExlbmd0aCAvIGlucHV0U2FtcGxlUmF0ZSkgKiBvdXRwdXRTYW1wbGVSYXRlKTtcbiAgICBsZXQgb3V0cHV0QnVmZmVyOiBudW1iZXJbXSA9IFtdO1xuICBcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dExlbmd0aDsgaSsrKSB7XG4gICAgICBsZXQgaW5kZXggPSBNYXRoLmZsb29yKGkgKiAoaW5wdXRTYW1wbGVSYXRlIC8gb3V0cHV0U2FtcGxlUmF0ZSkpO1xuICAgICAgb3V0cHV0QnVmZmVyW2ldID0gZnJhbWVCdWZmZXJbaW5kZXhdO1xuICAgIH1cbiAgXG4gICAgcmV0dXJuIG91dHB1dEJ1ZmZlcjtcbiAgfVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydEZyYW1lQnVmZmVyVG9CYXNlNjQoZnJhbWVCdWZmZXI6IG51bWJlcltdKTogc3RyaW5nIHtcbi8vIOWIm+W7uuS4gOS4quWtmOWCqOi9rOaNouWQjuaVsOaNrueahFVpbnQ4QXJyYXlcbmNvbnN0IHVpbnQ4QXJyYXkgPSBuZXcgVWludDhBcnJheShmcmFtZUJ1ZmZlci5sZW5ndGggKiAyKTsgLy8gMTbkvY3lsI/nq69MRe+8jOavj+S4quagt+acrOWNoOeUqDLkuKrlrZfoioJcblxuLy8g5bCGZnJhbWVCdWZmZXLkuK3nmoTmr4/kuKrmoLfmnKzovazmjaLkuLoxNuS9jeWwj+err+Wtl+iKguW6j1xuZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFtZUJ1ZmZlci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHNhbXBsZSA9IGZyYW1lQnVmZmVyW2ldO1xuICAgIHVpbnQ4QXJyYXlbaSAqIDJdID0gc2FtcGxlICYgMHhmZjsgLy8g5L2O5a2X6IqCXG4gICAgdWludDhBcnJheVtpICogMiArIDFdID0gKHNhbXBsZSA+PiA4KSAmIDB4ZmY7IC8vIOmrmOWtl+iKglxufVxuXG4vLyDkvb/nlKhidG9h5Ye95pWw5bCGVWludDhBcnJheei9rOaNouS4umJhc2U2NOWtl+espuS4slxuY29uc3QgYmFzZTY0U3RyaW5nID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHVpbnQ4QXJyYXkpKTtcblxucmV0dXJuIGJhc2U2NFN0cmluZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2FtcGxlQnVmZmVyKGJ1ZmZlcjogSW50MTZBcnJheSwgZnJvbVJhdGU6IG51bWJlciwgdG9SYXRlOiBudW1iZXIpOiBJbnQxNkFycmF5IHtcbiAgY29uc3QgcmF0aW8gPSBmcm9tUmF0ZSAvIHRvUmF0ZTtcbiAgY29uc3QgbGVuZ3RoID0gTWF0aC5yb3VuZChidWZmZXIubGVuZ3RoIC8gcmF0aW8pO1xuICBjb25zdCByZXN1bHQgPSBuZXcgSW50MTZBcnJheShsZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBqID0gTWF0aC5mbG9vcihpICogcmF0aW8pO1xuICAgIHJlc3VsdFtpXSA9IGJ1ZmZlcltqXTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59Il19
@@ -1,10 +1,235 @@
1
-
1
+ // import "microsoft-cognitiveservices-speech-sdk/distrib/browser/microsoft.cognitiveservices.speech.sdk.bundle-min";
2
+ import { SpeechSynthesizer } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";
3
+ import { SpeechConfig } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";
4
+ import { ResultReason } from "microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";
5
+ import Parse from "parse";
6
+ import { AudioPlayer } from "../audio.player";
7
+ /**
8
+ * FmodeTTS
9
+ * 每个类,表示一次独立的语音合成服务
10
+ */
11
+ export class FmodeTTS {
12
+ constructor(config, uploadServ) {
13
+ this.uploadServ = uploadServ;
14
+ this.subscriptionKey = config?.subscriptionKey;
15
+ this.authorizationToken = config?.token;
16
+ this.region = config?.region;
17
+ if (this.subscriptionKey) { // 直接资源APIKEY,调试或后端是使用
18
+ this.speechConfig = SpeechConfig.fromSubscription(this.subscriptionKey, this.region);
19
+ }
20
+ if (this.authorizationToken) { // 加载调用STSToken,客户端使用
21
+ this.speechConfig = SpeechConfig.fromAuthorizationToken(this.authorizationToken, this.region);
22
+ // console.log(this.authorizationToken,this.speechConfig)
23
+ }
24
+ // console.log(this.speechConfig)
25
+ // this.audioConfig = AudioConfig.fromDefaultSpeakerOutput();
26
+ // this.synthesizer = new Microsoft.CognitiveServices.SpeechSDK.SpeechSynthesizer(this.speechConfig, this.audioConfig);
27
+ this.synthesizer = new SpeechSynthesizer(this.speechConfig
28
+ // this.audioConfig
29
+ );
30
+ }
31
+ extractTextFromXML(inputString) {
32
+ // 正则表达式匹配 XML 标签,并提取标签之间的文本内容
33
+ const regex = />([^<]+)</g;
34
+ let matches;
35
+ let result = [];
36
+ // 使用 exec 方法循环查找所有匹配
37
+ while ((matches = regex.exec(inputString)) !== null) {
38
+ // matches[1] 是标签之间的文本内容,去除首尾空白
39
+ const text = matches[1].trim();
40
+ if (text) {
41
+ result.push(text);
42
+ }
43
+ }
44
+ // 返回合并后的纯文本内容(用空格衔接)
45
+ return result.join(' ');
46
+ }
47
+ extractSSMLContent(inputString) {
48
+ var regex = /<speak.*?<\/speak>/s;
49
+ var match = inputString.match(regex);
50
+ if (match) {
51
+ return match[0];
52
+ }
53
+ else {
54
+ return inputString;
55
+ }
56
+ }
2
57
  /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs
58
+ * 合成语言并播放
59
+ * @param textOrSSML
60
+ * @desc
61
+ * 普通文本
62
+ * SSML https://learn.microsoft.com/zh-cn/azure/ai-services/speech-service/how-to-speech-synthesis?tabs=browserjs%2Cterminal&pivots=programming-language-javascript#use-ssml-to-customize-speech-characteristics
63
+ * @returns
7
64
  */
8
- import{SpeechSynthesizer}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechSynthesizer";import{SpeechConfig}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/SpeechConfig";import{ResultReason}from"microsoft-cognitiveservices-speech-sdk/distrib/lib/src/sdk/ResultReason";import Parse from"parse";import{AudioPlayer}from"../audio.player";export class FmodeTTS{constructor(e,t){this.uploadServ=t,this.subscriptionKey=e?.subscriptionKey,this.authorizationToken=e?.token,this.region=e?.region,this.subscriptionKey&&(this.speechConfig=SpeechConfig.fromSubscription(this.subscriptionKey,this.region)),this.authorizationToken&&(this.speechConfig=SpeechConfig.fromAuthorizationToken(this.authorizationToken,this.region)),this.synthesizer=new SpeechSynthesizer(this.speechConfig)}extractTextFromXML(e){const t=/>([^<]+)</g;let o,i=[];for(;null!==(o=t.exec(e));){const e=o[1].trim();e&&i.push(e)}return i.join(" ")}extractSSMLContent(e){var t=e.match(/<speak.*?<\/speak>/s);return t?t[0]:e}async speakAsync(e,t,o){if(!t){let o=Parse.Object.extend("ChatVoice");(t=new o).set("ssml",e),t.set("content",this.extractTextFromXML(e));let i=localStorage.getItem("company");i&&t.set("company",{__type:"Pointer",className:"Company",objectId:i}),Parse.User.current()?.id&&t.set("user",Parse.User.current().toPointer())}if(!t?.get("voiceFile")){let o=[];t?.get("content")&&o.push({content:t?.get("content")}),e&&o.push({ssml:e});let i=Parse.Query.fromJSON("ChatVoice",{include:"voiceFile",where:{$or:o}}),s=await i.first();t.set("voiceFile",s?.get("voiceFile"))}return t?.get("voiceFile")?(this.playAudioData(t?.get("voiceFile")?.get("url"),t,o),t):(e=this.extractSSMLContent(e),new Promise(((i,s)=>{const n=Date.now();let r="speakTextAsync";e?.indexOf("<")>-1&&(r="speakSsmlAsync"),this.eventMap?.onSpeakBefore&&this.eventMap?.onSpeakBefore(),this.synthesizer[r](e,(e=>{if(console.log(e),e.reason===ResultReason.SynthesizingAudioCompleted){this.eventMap?.onAudioCompleted&&this.eventMap?.onAudioCompleted();const s=Date.now();let r=e?.audioData;t.set("duration",Number(e?.audioDuration)/1e4),this.playAudioData(r,t,o),console.log(`Audio synthesis finished. Duration: ${s-n} ms`),setTimeout((()=>{o?.onStop()&&o?.onStop()}),2e3),i(t)}else s(`Speech synthesis failed. Reason: ${e.errorDetails}`)}),(e=>{s(`Error occurred during synthesis: ${e}`)}))})))}onBreak(e){}playAudioData(e,t,o){let i;if(console.log("audioData",e),!(e?.indexOf&&e?.indexOf("http")>=-1)){let o=new Blob([e],{type:"audio/wav"});return i=URL.createObjectURL(o),void this.uploadAndSaveVoice(o,t)}i=e;const s=AudioPlayer.getInstance();o?.onStart&&o?.onStart(t),s.setAudioEvent("onloadeddata",(()=>{let e=1e3*s.duration;console.log("duration",e),t?.get("duration")||(t?.set("duration",e),t?.save()),o?.onLoaded&&o?.onLoaded(s)})),s.setAudioEvent("onabort",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onerror",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onpause",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onended",(()=>{o?.onStop&&o?.onStop()})),s.setAudioEvent("onclose",(()=>{o?.onStop&&o?.onStop()}));let playAudio=()=>{s.play(i).then((()=>{})).catch((()=>{setTimeout((()=>{console.log("playAudio"),playAudio()}),200)}))};playAudio()}async uploadAndSaveVoice(e,t){if(this.uploadServ){let o=t?.id||this.uploadServ?.genMd5(t?.get("content")||t?.get("ssml")),i=new Date,s=o+i.getFullYear()+(i.getMonth()+1)+i.getDate()+i.getHours()+i.getMinutes()+i.getSeconds()+".wav",n=new File([e],s,{type:"audio/wav"}),r=await this.uploadServ.upload(n,(e=>{console.log(e)})),a={__type:"Pointer",className:"Attachment",objectId:r?.id};a?.objectId&&(t.set("voiceFile",a),t=await t.save())}}}
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3R0cy9mbW9kZS10dHMtY2xhc3MubWpz`
10
-
65
+ async speakAsync(textOrSSML, chatVoice, eventMap) {
66
+ // 初始化本次合成语音数据对象
67
+ if (!chatVoice) {
68
+ let ChatVoice = Parse.Object.extend("ChatVoice");
69
+ chatVoice = new ChatVoice();
70
+ chatVoice.set("ssml", textOrSSML);
71
+ chatVoice.set("content", this.extractTextFromXML(textOrSSML));
72
+ let company = localStorage.getItem("company");
73
+ company && chatVoice.set("company", { __type: "Pointer", className: "Company", objectId: company });
74
+ Parse.User.current()?.id && chatVoice.set("user", Parse.User.current().toPointer());
75
+ }
76
+ // 加载缓存中存在的音频文件
77
+ if (!chatVoice?.get("voiceFile")) {
78
+ let orList = [];
79
+ if (chatVoice?.get("content")) {
80
+ orList.push({ content: chatVoice?.get("content") });
81
+ }
82
+ if (textOrSSML) {
83
+ orList.push({ ssml: textOrSSML });
84
+ }
85
+ let query = Parse.Query.fromJSON("ChatVoice", {
86
+ include: "voiceFile",
87
+ where: {
88
+ $or: orList
89
+ }
90
+ });
91
+ let exists = await query.first();
92
+ chatVoice.set("voiceFile", exists?.get("voiceFile"));
93
+ }
94
+ if (chatVoice?.get("voiceFile")) { // 存在音频则加载后直接播放
95
+ this.playAudioData(chatVoice?.get("voiceFile")?.get("url"), chatVoice, eventMap);
96
+ return chatVoice;
97
+ }
98
+ // 正则匹配SSML部分
99
+ textOrSSML = this.extractSSMLContent(textOrSSML);
100
+ // console.log(textOrSSML)
101
+ // 播放语音
102
+ return new Promise((resolve, reject) => {
103
+ const startTime = Date.now();
104
+ let speekType = 'speakTextAsync';
105
+ if (textOrSSML?.indexOf("<") > -1) {
106
+ speekType = "speakSsmlAsync";
107
+ }
108
+ // 音频输出流
109
+ // Create an audio output stream
110
+ // const audioOutputStream = Microsoft.CognitiveServices.SpeechSDK.AudioOutputStream.createPullStream();
111
+ // Create an audio configuration using the audio output stream
112
+ // const audioConfig = Microsoft.CognitiveServices.SpeechSDK.AudioConfig.fromStreamOutput(audioOutputStream);
113
+ // 播放组件
114
+ // Get the audio data from the callback and create a Blob
115
+ // const audioBlob = audioOutputStream.audioBlob();
116
+ // const audioUrl = URL.createObjectURL(audioBlob);
117
+ // const audioElement = new Audio(audioUrl);
118
+ // console.log(textOrSSML)
119
+ this.eventMap?.onSpeakBefore && this.eventMap?.onSpeakBefore();
120
+ this.synthesizer[speekType](textOrSSML, result => {
121
+ /**
122
+ *
123
+ * @desc
124
+ * {
125
+ privAudioData: undefined
126
+ privAudioDuration: undefined
127
+ privErrorDetails: "Unable to contact server. StatusCode: 1006,\n wss://eastasia.tts.speech.microsoft.com/cognitiveservices/websocket/v1 Reason: undefined"
128
+ privProperties: PropertyCollection {privKeys: Array(1), privValues: Array(1)}
129
+ privReason: 1
130
+ privResultId: "539694CFA6CB4BAD97F90AF76E608E69"
131
+ audioData: (...)
132
+ audioDuration: (...)
133
+ errorDetails: (...)
134
+ properties: (...)
135
+ reason: (...)
136
+ resultId: (...)
137
+ }
138
+ */
139
+ // console.log(result)
140
+ // console.log(result.resultId)
141
+ // console.log(result.reason)
142
+ console.log(result);
143
+ if (result.reason === ResultReason.SynthesizingAudioCompleted) {
144
+ this.eventMap?.onAudioCompleted && this.eventMap?.onAudioCompleted();
145
+ const endTime = Date.now();
146
+ let audioData = result?.audioData;
147
+ chatVoice.set("duration", Number(result?.audioDuration) / 10000);
148
+ this.playAudioData(audioData, chatVoice, eventMap);
149
+ console.log(`Audio synthesis finished. Duration: ${endTime - startTime} ms`);
150
+ setTimeout(() => {
151
+ eventMap?.onStop() && eventMap?.onStop();
152
+ }, 2000);
153
+ resolve(chatVoice);
154
+ }
155
+ else {
156
+ reject(`Speech synthesis failed. Reason: ${result.errorDetails}`);
157
+ }
158
+ }, error => {
159
+ reject(`Error occurred during synthesis: ${error}`);
160
+ });
161
+ });
162
+ }
163
+ // 把打断时的事件
164
+ onBreak(options) {
165
+ }
166
+ playAudioData(audioData, chatVoice, eventMap) {
167
+ let url;
168
+ console.log("audioData", audioData);
169
+ if (audioData?.indexOf && audioData?.indexOf("http") >= -1) { // 播放URL
170
+ url = audioData;
171
+ }
172
+ else { // 播放音频数据
173
+ let blob = new Blob([audioData], { type: 'audio/wav' });
174
+ url = URL.createObjectURL(blob);
175
+ this.uploadAndSaveVoice(blob, chatVoice);
176
+ return;
177
+ }
178
+ // 仅URL需要播放,tts合成会自动播放
179
+ // let audio = new Audio(url)
180
+ const audioPlayer = AudioPlayer.getInstance();
181
+ eventMap?.onStart && eventMap?.onStart(chatVoice);
182
+ audioPlayer.setAudioEvent("onloadeddata", () => {
183
+ let duration = audioPlayer.duration * 1000;
184
+ console.log("duration", duration);
185
+ if (!chatVoice?.get("duration")) {
186
+ chatVoice?.set("duration", duration);
187
+ chatVoice?.save();
188
+ }
189
+ eventMap?.onLoaded && eventMap?.onLoaded(audioPlayer);
190
+ });
191
+ audioPlayer.setAudioEvent("onabort", () => {
192
+ eventMap?.onStop && eventMap?.onStop();
193
+ });
194
+ audioPlayer.setAudioEvent("onerror", () => {
195
+ eventMap?.onStop && eventMap?.onStop();
196
+ });
197
+ audioPlayer.setAudioEvent("onpause", () => {
198
+ eventMap?.onStop && eventMap?.onStop();
199
+ });
200
+ audioPlayer.setAudioEvent("onended", () => {
201
+ eventMap?.onStop && eventMap?.onStop();
202
+ });
203
+ audioPlayer.setAudioEvent("onclose", () => {
204
+ eventMap?.onStop && eventMap?.onStop();
205
+ });
206
+ let playAudio = () => {
207
+ audioPlayer.play(url).then(() => {
208
+ }).catch(() => {
209
+ setTimeout(() => {
210
+ console.log("playAudio");
211
+ playAudio();
212
+ }, 200);
213
+ });
214
+ };
215
+ playAudio();
216
+ }
217
+ async uploadAndSaveVoice(blob, chatVoice) {
218
+ if (this.uploadServ) {
219
+ let id = chatVoice?.id || this.uploadServ?.genMd5(chatVoice?.get("content") || chatVoice?.get("ssml"));
220
+ let now = new Date();
221
+ let filename = id + now.getFullYear() + (now.getMonth() + 1) + now.getDate() + now.getHours() + now.getMinutes() + now.getSeconds() + ".wav";
222
+ let file = new File([blob], filename, { type: 'audio/wav' });
223
+ let fileResult = await this.uploadServ.upload(file, (res) => {
224
+ console.log(res); // 上传进度,可以同步更新页面上传百分比
225
+ });
226
+ let attachPointer = { __type: "Pointer", className: "Attachment", objectId: fileResult?.id };
227
+ if (attachPointer?.objectId) {
228
+ chatVoice.set("voiceFile", attachPointer);
229
+ chatVoice = await chatVoice.save();
230
+ }
231
+ }
232
+ return;
233
+ }
234
+ }
235
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm1vZGUtdHRzLWNsYXNzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9haWdjL3ZvaWNlL3R0cy9mbW9kZS10dHMtY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEscUhBQXFIO0FBQ3JILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhFQUE4RSxDQUFDO0FBQy9HLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx5RUFBeUUsQ0FBQztBQUNyRyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUVBQXlFLENBQUM7QUFDckcsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBRzFCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQVc5Qzs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQVNqQixZQUFZLE1BSVgsRUFBQyxVQUE2QjtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxHQUFHLE1BQU0sRUFBRSxlQUFlLENBQUM7UUFDL0MsSUFBSSxDQUFDLGtCQUFrQixHQUFHLE1BQU0sRUFBRSxLQUFLLENBQUM7UUFDeEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLEVBQUUsTUFBTSxDQUFDO1FBQzdCLElBQUcsSUFBSSxDQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMsc0JBQXNCO1lBQzVDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3pGLENBQUM7UUFDRCxJQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBQyxDQUFDLENBQUMscUJBQXFCO1lBQzlDLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDOUYseURBQXlEO1FBQzdELENBQUM7UUFDRCxpQ0FBaUM7UUFDakMsNkRBQTZEO1FBQzdELHVIQUF1SDtRQUN2SCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFlBQVk7UUFDdEQsbUJBQW1CO1NBQ3RCLENBQUM7SUFDTixDQUFDO0lBRUQsa0JBQWtCLENBQUMsV0FBVztRQUMxQiw4QkFBOEI7UUFDOUIsTUFBTSxLQUFLLEdBQUcsWUFBWSxDQUFDO1FBQzNCLElBQUksT0FBTyxDQUFDO1FBQ1osSUFBSSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBRWhCLHFCQUFxQjtRQUNyQixPQUFPLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNsRCwrQkFBK0I7WUFDL0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQy9CLElBQUksSUFBSSxFQUFFLENBQUM7Z0JBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN0QixDQUFDO1FBQ0wsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELGtCQUFrQixDQUFDLFdBQVc7UUFDMUIsSUFBSSxLQUFLLEdBQUcscUJBQXFCLENBQUM7UUFDbEMsSUFBSSxLQUFLLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVyQyxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEIsQ0FBQzthQUFNLENBQUM7WUFDSixPQUFPLFdBQVcsQ0FBQztRQUN2QixDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLFVBQWtCLEVBQUMsU0FBdUIsRUFBQyxRQUFhO1FBRTVFLGdCQUFnQjtRQUNoQixJQUFHLENBQUMsU0FBUyxFQUFDLENBQUM7WUFDWCxJQUFJLFNBQVMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUNqRCxTQUFTLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUM1QixTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBQyxVQUFVLENBQUMsQ0FBQztZQUNqQyxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztZQUM3RCxJQUFJLE9BQU8sR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQzdDLE9BQU8sSUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBQyxFQUFDLE1BQU0sRUFBQyxTQUFTLEVBQUMsU0FBUyxFQUFDLFNBQVMsRUFBQyxRQUFRLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQztZQUMxRixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBRSxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDckYsQ0FBQztRQUNELGVBQWU7UUFDZixJQUFHLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBQyxDQUFDO1lBQzdCLElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQTtZQUNmLElBQUcsU0FBUyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUMsRUFBQyxDQUFDO2dCQUMxQixNQUFNLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFBO1lBQ3BELENBQUM7WUFDRCxJQUFHLFVBQVUsRUFBQyxDQUFDO2dCQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBQyxJQUFJLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQTtZQUNsQyxDQUFDO1lBQ0QsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFDO2dCQUN6QyxPQUFPLEVBQUMsV0FBVztnQkFDbkIsS0FBSyxFQUFDO29CQUNGLEdBQUcsRUFBQyxNQUFNO2lCQUNiO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsSUFBSSxNQUFNLEdBQUcsTUFBTSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDakMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFBO1FBQ3ZELENBQUM7UUFFRCxJQUFHLFNBQVMsRUFBRSxHQUFHLENBQUMsV0FBVyxDQUFDLEVBQUMsQ0FBQyxDQUFDLGVBQWU7WUFDNUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRyxDQUFDLFdBQVcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBQyxTQUFTLEVBQUMsUUFBUSxDQUFDLENBQUE7WUFDOUUsT0FBTyxTQUFTLENBQUM7UUFDckIsQ0FBQztRQUVELGFBQWE7UUFDYixVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELDBCQUEwQjtRQUMxQixPQUFPO1FBQ1AsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsRUFBRTtZQUNuQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDN0IsSUFBSSxTQUFTLEdBQUcsZ0JBQWdCLENBQUE7WUFDaEMsSUFBRyxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7Z0JBQzVCLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsUUFBUTtZQUNSLGdDQUFnQztZQUNoQyx3R0FBd0c7WUFDeEcsOERBQThEO1lBQzlELDZHQUE2RztZQUU3RyxPQUFPO1lBQ04seURBQXlEO1lBQzFELG9EQUFvRDtZQUNwRCxvREFBb0Q7WUFDcEQsNkNBQTZDO1lBQzdDLDBCQUEwQjtZQUMxQixJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFBO1lBQzlELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQ3ZCLFVBQVUsRUFDVixNQUFNLENBQUMsRUFBRTtnQkFDTDs7Ozs7Ozs7Ozs7Ozs7Ozs7bUJBaUJHO2dCQUNILHNCQUFzQjtnQkFDdEIsK0JBQStCO2dCQUMvQiw2QkFBNkI7Z0JBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7Z0JBQ25CLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztvQkFDNUQsSUFBSSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLENBQUE7b0JBRXBFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztvQkFDM0IsSUFBSSxTQUFTLEdBQUcsTUFBTSxFQUFFLFNBQVMsQ0FBQztvQkFDbEMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsR0FBQyxLQUFLLENBQUMsQ0FBQTtvQkFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUMsU0FBUyxFQUFDLFFBQVEsQ0FBQyxDQUFBO29CQUNoRCxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxPQUFPLEdBQUcsU0FBUyxLQUFLLENBQUMsQ0FBQztvQkFDN0UsVUFBVSxDQUFDLEdBQUcsRUFBRTt3QkFDWixRQUFRLEVBQUUsTUFBTSxFQUFFLElBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFBO29CQUMxQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7b0JBQ1QsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixDQUFDO3FCQUFNLENBQUM7b0JBQ0osTUFBTSxDQUFDLG9DQUFvQyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztZQUNMLENBQUMsRUFDRCxLQUFLLENBQUMsRUFBRTtnQkFDSixNQUFNLENBQUMsb0NBQW9DLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDeEQsQ0FBQyxDQUNKLENBQUM7UUFDTixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxVQUFVO0lBQ1YsT0FBTyxDQUFDLE9BSVA7SUFFRCxDQUFDO0lBRUQsYUFBYSxDQUFDLFNBQWdCLEVBQUMsU0FBc0IsRUFBQyxRQUFZO1FBQzlELElBQUksR0FBRyxDQUFBO1FBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUMsU0FBUyxDQUFDLENBQUE7UUFDbEMsSUFBRyxTQUFTLEVBQUUsT0FBTyxJQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDNUQsR0FBRyxHQUFHLFNBQVMsQ0FBQTtRQUNuQixDQUFDO2FBQUksQ0FBQyxDQUFDLFNBQVM7WUFDWixJQUFJLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFDLEVBQUMsSUFBSSxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUM7WUFDcEQsR0FBRyxHQUFHLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBQyxTQUFTLENBQUMsQ0FBQTtZQUN2QyxPQUFNO1FBQ1YsQ0FBQztRQUVELHNCQUFzQjtRQUN0Qiw2QkFBNkI7UUFFN0IsTUFBTSxXQUFXLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBRTlDLFFBQVEsRUFBRSxPQUFPLElBQUksUUFBUSxFQUFFLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNsRCxXQUFXLENBQUMsYUFBYSxDQUFDLGNBQWMsRUFBRSxHQUFFLEVBQUU7WUFDMUMsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUMsUUFBUSxDQUFDLENBQUM7WUFDakMsSUFBRyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUMsQ0FBQztnQkFDNUIsU0FBUyxFQUFFLEdBQUcsQ0FBQyxVQUFVLEVBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUN0QixDQUFDO1lBQ0QsUUFBUSxFQUFFLFFBQVEsSUFBSSxRQUFRLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzFELENBQUMsQ0FBQyxDQUFBO1FBRUYsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBQ0YsV0FBVyxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsR0FBRSxFQUFFO1lBQ3JDLFFBQVEsRUFBRSxNQUFNLElBQUksUUFBUSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQzNDLENBQUMsQ0FBQyxDQUFBO1FBRUYsSUFBSSxTQUFTLEdBQUcsR0FBRSxFQUFFO1lBQ2hCLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUUsRUFBRTtZQUMvQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRSxFQUFFO2dCQUNULFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtvQkFDeEIsU0FBUyxFQUFFLENBQUM7Z0JBQ2hCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUNaLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFBO1FBQ0QsU0FBUyxFQUFFLENBQUM7SUFDaEIsQ0FBQztJQUNELEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUMsU0FBUztRQUNuQyxJQUFHLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQztZQUNoQixJQUFJLEVBQUUsR0FBRyxTQUFTLEVBQUUsRUFBRSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFBO1lBQ3BHLElBQUksR0FBRyxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7WUFDckIsSUFBSSxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsR0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBQyxDQUFDLENBQUMsR0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxHQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLEdBQUcsTUFBTSxDQUFBO1lBQ2hJLElBQUksSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7WUFDN0QsSUFBSSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUMsQ0FBQyxHQUFHLEVBQUMsRUFBRTtnQkFDdEQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQSxDQUFDLHFCQUFxQjtZQUMxQyxDQUFDLENBQUMsQ0FBQztZQUNILElBQUksYUFBYSxHQUFHLEVBQUMsTUFBTSxFQUFDLFNBQVMsRUFBQyxTQUFTLEVBQUMsWUFBWSxFQUFDLFFBQVEsRUFBQyxVQUFVLEVBQUUsRUFBRSxFQUFDLENBQUE7WUFDckYsSUFBRyxhQUFhLEVBQUUsUUFBUSxFQUFDLENBQUM7Z0JBQ3hCLFNBQVMsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFDLGFBQWEsQ0FBQyxDQUFBO2dCQUN4QyxTQUFTLEdBQUcsTUFBTSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsQ0FBQztRQUNMLENBQUM7UUFDRCxPQUFNO0lBQ1YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0ICogYXMgc2RrIGZyb20gXCJtaWNyb3NvZnQtY29nbml0aXZlc2VydmljZXMtc3BlZWNoLXNka1wiO1xuZGVjbGFyZSB2YXIgTWljcm9zb2Z0OmFueVxuLy8gaW1wb3J0IFwibWljcm9zb2Z0LWNvZ25pdGl2ZXNlcnZpY2VzLXNwZWVjaC1zZGsvZGlzdHJpYi9icm93c2VyL21pY3Jvc29mdC5jb2duaXRpdmVzZXJ2aWNlcy5zcGVlY2guc2RrLmJ1bmRsZS1taW5cIjtcbmltcG9ydCB7U3BlZWNoU3ludGhlc2l6ZXJ9IGZyb20gXCJtaWNyb3NvZnQtY29nbml0aXZlc2VydmljZXMtc3BlZWNoLXNkay9kaXN0cmliL2xpYi9zcmMvc2RrL1NwZWVjaFN5bnRoZXNpemVyXCI7XG5pbXBvcnQge1NwZWVjaENvbmZpZ30gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvU3BlZWNoQ29uZmlnXCI7XG5pbXBvcnQge1Jlc3VsdFJlYXNvbn0gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvUmVzdWx0UmVhc29uXCI7XG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XG5pbXBvcnQgeyBOb3ZhVXBsb2FkU2VydmljZSB9IGZyb20gXCIuLi8uLi8uLi9zdG9yYWdlL3NlcnZpY2UtdXBsb2FkL25vdmEtdXBsb2FkLnNlcnZpY2VcIjtcbmltcG9ydCB7IEF1ZGlvQ29uZmlnIH0gZnJvbSBcIm1pY3Jvc29mdC1jb2duaXRpdmVzZXJ2aWNlcy1zcGVlY2gtc2RrL2Rpc3RyaWIvbGliL3NyYy9zZGsvQXVkaW8vQXVkaW9Db25maWdcIjtcbmltcG9ydCB7IEF1ZGlvUGxheWVyIH0gZnJvbSBcIi4uL2F1ZGlvLnBsYXllclwiO1xuXG4vLyBNaWNyb3NvZnQ/LkNvZ25pdGl2ZVNlcnZpY2VzPy5TcGVlY2hTREs/XG5pbnRlcmZhY2UgRm1vZGVUVFNFdmVudHtcbiAgICAgICAgLy8g5byA5aeL5YmNXG4gICAgICAgIG9uU3BlYWtCZWZvcmU/KCk6dm9pZDtcbiAgICAgICAgLy8g5rWB5Yqg6L2956ys5LiA5q616Z+z6aKR5byA5aeLXG4gICAgICAgIG9uU3RyZWFtU3RhcnRlZD8oKTp2b2lkO1xuICAgICAgICAvLyDpn7PpopHlhajpg6jliqDovb3lrozmiJBcbiAgICAgICAgb25BdWRpb0NvbXBsZXRlZD8oKTp2b2lkOyAvLyBzc21s6ISa5pys5ZCI5oiQXG59XG4vKipcbiAqIEZtb2RlVFRTXG4gKiDmr4/kuKrnsbvvvIzooajnpLrkuIDmrKHni6znq4vnmoTor63pn7PlkIjmiJDmnI3liqFcbiAqL1xuZXhwb3J0IGNsYXNzIEZtb2RlVFRTe1xuICAgIHByaXZhdGUgc3BlZWNoQ29uZmlnOmFueTtcbiAgICBwcml2YXRlIGF1ZGlvQ29uZmlnOmFueTtcbiAgICBwcml2YXRlIHN5bnRoZXNpemVyOmFueTtcbiAgICBwcml2YXRlIHN1YnNjcmlwdGlvbktleTogc3RyaW5nO1xuICAgIHByaXZhdGUgYXV0aG9yaXphdGlvblRva2VuOnN0cmluZztcbiAgICBwcml2YXRlIHJlZ2lvbjogc3RyaW5nO1xuICAgIGV2ZW50TWFwOkZtb2RlVFRTRXZlbnRcbiAgICB1cGxvYWRTZXJ2PzpOb3ZhVXBsb2FkU2VydmljZVxuICAgIGNvbnN0cnVjdG9yKGNvbmZpZzp7XG4gICAgICAgIHJlZ2lvbjpzdHJpbmcsXG4gICAgICAgIHN1YnNjcmlwdGlvbktleTpzdHJpbmcsXG4gICAgICAgIHRva2VuOnN0cmluZyxcbiAgICB9LHVwbG9hZFNlcnY/Ok5vdmFVcGxvYWRTZXJ2aWNlKXtcbiAgICAgICAgdGhpcy51cGxvYWRTZXJ2ID0gdXBsb2FkU2VydjtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25LZXkgPSBjb25maWc/LnN1YnNjcmlwdGlvbktleTtcbiAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVG9rZW4gPSBjb25maWc/LnRva2VuO1xuICAgICAgICB0aGlzLnJlZ2lvbiA9IGNvbmZpZz8ucmVnaW9uO1xuICAgICAgICBpZih0aGlzLnN1YnNjcmlwdGlvbktleSl7IC8vIOebtOaOpei1hOa6kEFQSUtFWe+8jOiwg+ivleaIluWQjuerr+aYr+S9v+eUqFxuICAgICAgICAgICAgdGhpcy5zcGVlY2hDb25maWcgPSBTcGVlY2hDb25maWcuZnJvbVN1YnNjcmlwdGlvbih0aGlzLnN1YnNjcmlwdGlvbktleSwgdGhpcy5yZWdpb24pO1xuICAgICAgICB9XG4gICAgICAgIGlmKHRoaXMuYXV0aG9yaXphdGlvblRva2VuKXsgLy8g5Yqg6L296LCD55SoU1RTVG9rZW7vvIzlrqLmiLfnq6/kvb/nlKhcbiAgICAgICAgICAgIHRoaXMuc3BlZWNoQ29uZmlnID0gU3BlZWNoQ29uZmlnLmZyb21BdXRob3JpemF0aW9uVG9rZW4odGhpcy5hdXRob3JpemF0aW9uVG9rZW4sIHRoaXMucmVnaW9uKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuYXV0aG9yaXphdGlvblRva2VuLHRoaXMuc3BlZWNoQ29uZmlnKVxuICAgICAgICB9XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuc3BlZWNoQ29uZmlnKVxuICAgICAgICAvLyB0aGlzLmF1ZGlvQ29uZmlnID0gQXVkaW9Db25maWcuZnJvbURlZmF1bHRTcGVha2VyT3V0cHV0KCk7XG4gICAgICAgIC8vIHRoaXMuc3ludGhlc2l6ZXIgPSBuZXcgTWljcm9zb2Z0LkNvZ25pdGl2ZVNlcnZpY2VzLlNwZWVjaFNESy5TcGVlY2hTeW50aGVzaXplcih0aGlzLnNwZWVjaENvbmZpZywgdGhpcy5hdWRpb0NvbmZpZyk7XG4gICAgICAgIHRoaXMuc3ludGhlc2l6ZXIgPSBuZXcgU3BlZWNoU3ludGhlc2l6ZXIodGhpcy5zcGVlY2hDb25maWdcbiAgICAgICAgICAgIC8vIHRoaXMuYXVkaW9Db25maWdcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBleHRyYWN0VGV4dEZyb21YTUwoaW5wdXRTdHJpbmcpe1xuICAgICAgICAvLyDmraPliJnooajovr7lvI/ljLnphY0gWE1MIOagh+etvu+8jOW5tuaPkOWPluagh+etvuS5i+mXtOeahOaWh+acrOWGheWuuVxuICAgICAgICBjb25zdCByZWdleCA9IC8+KFtePF0rKTwvZztcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgICAgICAvLyDkvb/nlKggZXhlYyDmlrnms5Xlvqrnjq/mn6Xmib7miYDmnInljLnphY1cbiAgICAgICAgd2hpbGUgKChtYXRjaGVzID0gcmVnZXguZXhlYyhpbnB1dFN0cmluZykpICE9PSBudWxsKSB7XG4gICAgICAgICAgICAvLyBtYXRjaGVzWzFdIOaYr+agh+etvuS5i+mXtOeahOaWh+acrOWGheWuue+8jOWOu+mZpOmmluWwvuepuueZvVxuICAgICAgICAgICAgY29uc3QgdGV4dCA9IG1hdGNoZXNbMV0udHJpbSgpO1xuICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh0ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOi/lOWbnuWQiOW5tuWQjueahOe6r+aWh+acrOWGheWuue+8iOeUqOepuuagvOihlOaOpe+8iVxuICAgICAgICByZXR1cm4gcmVzdWx0LmpvaW4oJyAnKTtcbiAgICB9XG4gICAgZXh0cmFjdFNTTUxDb250ZW50KGlucHV0U3RyaW5nKSB7XG4gICAgICAgIHZhciByZWdleCA9IC88c3BlYWsuKj88XFwvc3BlYWs+L3M7XG4gICAgICAgIHZhciBtYXRjaCA9IGlucHV0U3RyaW5nLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoWzBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0U3RyaW5nO1xuICAgICAgICB9XG4gICAgfVxuICAgIFxuICAgIC8qKlxuICAgICAqIOWQiOaIkOivreiogOW5tuaSreaUvlxuICAgICAqIEBwYXJhbSB0ZXh0T3JTU01MIFxuICAgICAqIEBkZXNjXG4gICAgICog5pmu6YCa5paH5pysXG4gICAgICogU1NNTCBodHRwczovL2xlYXJuLm1pY3Jvc29mdC5jb20vemgtY24vYXp1cmUvYWktc2VydmljZXMvc3BlZWNoLXNlcnZpY2UvaG93LXRvLXNwZWVjaC1zeW50aGVzaXM/dGFicz1icm93c2VyanMlMkN0ZXJtaW5hbCZwaXZvdHM9cHJvZ3JhbW1pbmctbGFuZ3VhZ2UtamF2YXNjcmlwdCN1c2Utc3NtbC10by1jdXN0b21pemUtc3BlZWNoLWNoYXJhY3RlcmlzdGljc1xuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIHB1YmxpYyBhc3luYyBzcGVha0FzeW5jKHRleHRPclNTTUw6IHN0cmluZyxjaGF0Vm9pY2U/OlBhcnNlLk9iamVjdCxldmVudE1hcD86YW55KTogUHJvbWlzZTxQYXJzZS5PYmplY3Q+IHtcblxuICAgICAgICAvLyDliJ3lp4vljJbmnKzmrKHlkIjmiJDor63pn7PmlbDmja7lr7nosaFcbiAgICAgICAgaWYoIWNoYXRWb2ljZSl7XG4gICAgICAgICAgICBsZXQgQ2hhdFZvaWNlID0gUGFyc2UuT2JqZWN0LmV4dGVuZChcIkNoYXRWb2ljZVwiKTtcbiAgICAgICAgICAgIGNoYXRWb2ljZSA9IG5ldyBDaGF0Vm9pY2UoKTtcbiAgICAgICAgICAgIGNoYXRWb2ljZS5zZXQoXCJzc21sXCIsdGV4dE9yU1NNTCk7XG4gICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwiY29udGVudFwiLHRoaXMuZXh0cmFjdFRleHRGcm9tWE1MKHRleHRPclNTTUwpKTtcbiAgICAgICAgICAgIGxldCBjb21wYW55ID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJjb21wYW55XCIpXG4gICAgICAgICAgICBjb21wYW55JiZjaGF0Vm9pY2Uuc2V0KFwiY29tcGFueVwiLHtfX3R5cGU6XCJQb2ludGVyXCIsY2xhc3NOYW1lOlwiQ29tcGFueVwiLG9iamVjdElkOmNvbXBhbnl9KTtcbiAgICAgICAgICAgIFBhcnNlLlVzZXIuY3VycmVudCgpPy5pZCYmY2hhdFZvaWNlLnNldChcInVzZXJcIixQYXJzZS5Vc2VyLmN1cnJlbnQoKS50b1BvaW50ZXIoKSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8g5Yqg6L2957yT5a2Y5Lit5a2Y5Zyo55qE6Z+z6aKR5paH5Lu2XG4gICAgICAgIGlmKCFjaGF0Vm9pY2U/LmdldChcInZvaWNlRmlsZVwiKSl7XG4gICAgICAgICAgICBsZXQgb3JMaXN0ID0gW11cbiAgICAgICAgICAgIGlmKGNoYXRWb2ljZT8uZ2V0KFwiY29udGVudFwiKSl7XG4gICAgICAgICAgICAgICAgb3JMaXN0LnB1c2goe2NvbnRlbnQ6Y2hhdFZvaWNlPy5nZXQoXCJjb250ZW50XCIpfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmKHRleHRPclNTTUwpe1xuICAgICAgICAgICAgICAgIG9yTGlzdC5wdXNoKHtzc21sOnRleHRPclNTTUx9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gUGFyc2UuUXVlcnkuZnJvbUpTT04oXCJDaGF0Vm9pY2VcIix7XG4gICAgICAgICAgICAgICAgaW5jbHVkZTpcInZvaWNlRmlsZVwiLFxuICAgICAgICAgICAgICAgIHdoZXJlOntcbiAgICAgICAgICAgICAgICAgICAgJG9yOm9yTGlzdFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGV4aXN0cyA9IGF3YWl0IHF1ZXJ5LmZpcnN0KCk7XG4gICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwidm9pY2VGaWxlXCIsZXhpc3RzPy5nZXQoXCJ2b2ljZUZpbGVcIikpXG4gICAgICAgIH1cblxuICAgICAgICBpZihjaGF0Vm9pY2U/LmdldChcInZvaWNlRmlsZVwiKSl7IC8vIOWtmOWcqOmfs+mikeWImeWKoOi9veWQjuebtOaOpeaSreaUvlxuICAgICAgICAgICAgdGhpcy5wbGF5QXVkaW9EYXRhKGNoYXRWb2ljZT8uZ2V0KFwidm9pY2VGaWxlXCIpPy5nZXQoXCJ1cmxcIiksY2hhdFZvaWNlLGV2ZW50TWFwKVxuICAgICAgICAgICAgcmV0dXJuIGNoYXRWb2ljZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOato+WImeWMuemFjVNTTUzpg6jliIZcbiAgICAgICAgdGV4dE9yU1NNTCA9IHRoaXMuZXh0cmFjdFNTTUxDb250ZW50KHRleHRPclNTTUwpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZyh0ZXh0T3JTU01MKVxuICAgICAgICAvLyDmkq3mlL7or63pn7NcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgICAgICBsZXQgc3BlZWtUeXBlID0gJ3NwZWFrVGV4dEFzeW5jJ1xuICAgICAgICAgICAgaWYodGV4dE9yU1NNTD8uaW5kZXhPZihcIjxcIik+LTEpe1xuICAgICAgICAgICAgICAgIHNwZWVrVHlwZSA9IFwic3BlYWtTc21sQXN5bmNcIlxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyDpn7PpopHovpPlh7rmtYFcbiAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBhdWRpbyBvdXRwdXQgc3RyZWFtXG4gICAgICAgICAgICAvLyBjb25zdCBhdWRpb091dHB1dFN0cmVhbSA9IE1pY3Jvc29mdC5Db2duaXRpdmVTZXJ2aWNlcy5TcGVlY2hTREsuQXVkaW9PdXRwdXRTdHJlYW0uY3JlYXRlUHVsbFN0cmVhbSgpO1xuICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIGF1ZGlvIGNvbmZpZ3VyYXRpb24gdXNpbmcgdGhlIGF1ZGlvIG91dHB1dCBzdHJlYW1cbiAgICAgICAgICAgIC8vIGNvbnN0IGF1ZGlvQ29uZmlnID0gTWljcm9zb2Z0LkNvZ25pdGl2ZVNlcnZpY2VzLlNwZWVjaFNESy5BdWRpb0NvbmZpZy5mcm9tU3RyZWFtT3V0cHV0KGF1ZGlvT3V0cHV0U3RyZWFtKTtcblxuICAgICAgICAgICAgLy8g5pKt5pS+57uE5Lu2XG4gICAgICAgICAgICAgLy8gR2V0IHRoZSBhdWRpbyBkYXRhIGZyb20gdGhlIGNhbGxiYWNrIGFuZCBjcmVhdGUgYSBCbG9iXG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9CbG9iID0gYXVkaW9PdXRwdXRTdHJlYW0uYXVkaW9CbG9iKCk7XG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9VcmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGF1ZGlvQmxvYik7XG4gICAgICAgICAgICAvLyAgY29uc3QgYXVkaW9FbGVtZW50ID0gbmV3IEF1ZGlvKGF1ZGlvVXJsKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRleHRPclNTTUwpXG4gICAgICAgICAgICB0aGlzLmV2ZW50TWFwPy5vblNwZWFrQmVmb3JlICYmIHRoaXMuZXZlbnRNYXA/Lm9uU3BlYWtCZWZvcmUoKVxuICAgICAgICAgICAgdGhpcy5zeW50aGVzaXplcltzcGVla1R5cGVdKFxuICAgICAgICAgICAgICAgIHRleHRPclNTTUwsXG4gICAgICAgICAgICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAqIFxuICAgICAgICAgICAgICAgICAgICAgKiBAZGVzY1xuICAgICAgICAgICAgICAgICAgICAgKiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdkF1ZGlvRGF0YTogdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdkF1ZGlvRHVyYXRpb246IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZFcnJvckRldGFpbHM6IFwiVW5hYmxlIHRvIGNvbnRhY3Qgc2VydmVyLiBTdGF0dXNDb2RlOiAxMDA2LFxcbiAgICAgICAgICAgICAgICAgICAgd3NzOi8vZWFzdGFzaWEudHRzLnNwZWVjaC5taWNyb3NvZnQuY29tL2NvZ25pdGl2ZXNlcnZpY2VzL3dlYnNvY2tldC92MSBSZWFzb246ICB1bmRlZmluZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZQcm9wZXJ0aWVzOiBQcm9wZXJ0eUNvbGxlY3Rpb24ge3ByaXZLZXlzOiBBcnJheSgxKSwgcHJpdlZhbHVlczogQXJyYXkoMSl9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdlJlYXNvbjogMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZSZXN1bHRJZDogXCI1Mzk2OTRDRkE2Q0I0QkFEOTdGOTBBRjc2RTYwOEU2OVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9EYXRhOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRHVyYXRpb246ICguLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JEZXRhaWxzOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6ICguLi4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdElkOiAoLi4uKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlc3VsdC5yZXN1bHRJZClcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzdWx0LnJlYXNvbilcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzdWx0KVxuICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnJlYXNvbiA9PT0gUmVzdWx0UmVhc29uLlN5bnRoZXNpemluZ0F1ZGlvQ29tcGxldGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV2ZW50TWFwPy5vbkF1ZGlvQ29tcGxldGVkICYmIHRoaXMuZXZlbnRNYXA/Lm9uQXVkaW9Db21wbGV0ZWQoKSAgXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGF1ZGlvRGF0YSA9IHJlc3VsdD8uYXVkaW9EYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhdFZvaWNlLnNldChcImR1cmF0aW9uXCIsTnVtYmVyKHJlc3VsdD8uYXVkaW9EdXJhdGlvbikvMTAwMDApXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlBdWRpb0RhdGEoYXVkaW9EYXRhLGNoYXRWb2ljZSxldmVudE1hcClcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBBdWRpbyBzeW50aGVzaXMgZmluaXNoZWQuIER1cmF0aW9uOiAke2VuZFRpbWUgLSBzdGFydFRpbWV9IG1zYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE1hcD8ub25TdG9wKCkmJmV2ZW50TWFwPy5vblN0b3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGNoYXRWb2ljZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoYFNwZWVjaCBzeW50aGVzaXMgZmFpbGVkLiBSZWFzb246ICR7cmVzdWx0LmVycm9yRGV0YWlsc31gKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoYEVycm9yIG9jY3VycmVkIGR1cmluZyBzeW50aGVzaXM6ICR7ZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8g5oqK5omT5pat5pe255qE5LqL5Lu2XG4gICAgb25CcmVhayhvcHRpb25zOntcbiAgICAgICAgcGxheWVkVGltZTpzdHJpbmcgLy8g5bey5pKt5pS+5pe26ZW/XG4gICAgICAgIHBsYXllZFRleHQ6c3RyaW5nIC8vIOW3suaSreaUvuaWh+acrFxuICAgICAgICBsZWZ0VGV4dDpzdHJpbmcgLy8g5Ymp5L2Z5paH5pysXG4gICAgfSl7XG4gICAgICAgIFxuICAgIH1cblxuICAgIHBsYXlBdWRpb0RhdGEoYXVkaW9EYXRhOnN0cmluZyxjaGF0Vm9pY2U6UGFyc2UuT2JqZWN0LGV2ZW50TWFwOmFueSl7XG4gICAgICAgIGxldCB1cmxcbiAgICAgICAgY29uc29sZS5sb2coXCJhdWRpb0RhdGFcIixhdWRpb0RhdGEpXG4gICAgICAgIGlmKGF1ZGlvRGF0YT8uaW5kZXhPZiYmYXVkaW9EYXRhPy5pbmRleE9mKFwiaHR0cFwiKT49LTEpeyAvLyDmkq3mlL5VUkxcbiAgICAgICAgICAgIHVybCA9IGF1ZGlvRGF0YVxuICAgICAgICB9ZWxzZXsgLy8g5pKt5pS+6Z+z6aKR5pWw5o2uXG4gICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFthdWRpb0RhdGFdLHt0eXBlOidhdWRpby93YXYnfSk7XG4gICAgICAgICAgICB1cmwgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICAgICAgdGhpcy51cGxvYWRBbmRTYXZlVm9pY2UoYmxvYixjaGF0Vm9pY2UpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIOS7hVVSTOmcgOimgeaSreaUvu+8jHR0c+WQiOaIkOS8muiHquWKqOaSreaUvlxuICAgICAgICAvLyBsZXQgYXVkaW8gPSBuZXcgQXVkaW8odXJsKVxuICAgICAgICBcbiAgICAgICAgY29uc3QgYXVkaW9QbGF5ZXIgPSBBdWRpb1BsYXllci5nZXRJbnN0YW5jZSgpO1xuXG4gICAgICAgIGV2ZW50TWFwPy5vblN0YXJ0ICYmIGV2ZW50TWFwPy5vblN0YXJ0KGNoYXRWb2ljZSk7XG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmxvYWRlZGRhdGFcIiwgKCk9PntcbiAgICAgICAgICAgIGxldCBkdXJhdGlvbiA9IGF1ZGlvUGxheWVyLmR1cmF0aW9uICogMTAwMDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiZHVyYXRpb25cIixkdXJhdGlvbik7XG4gICAgICAgICAgICBpZighY2hhdFZvaWNlPy5nZXQoXCJkdXJhdGlvblwiKSl7XG4gICAgICAgICAgICAgICAgY2hhdFZvaWNlPy5zZXQoXCJkdXJhdGlvblwiLGR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2U/LnNhdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGV2ZW50TWFwPy5vbkxvYWRlZCAmJiBldmVudE1hcD8ub25Mb2FkZWQoYXVkaW9QbGF5ZXIpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmFib3J0XCIsICgpPT57XG4gICAgICAgICAgICBldmVudE1hcD8ub25TdG9wICYmIGV2ZW50TWFwPy5vblN0b3AoKTtcbiAgICAgICAgfSlcbiAgICAgICAgYXVkaW9QbGF5ZXIuc2V0QXVkaW9FdmVudChcIm9uZXJyb3JcIiwgKCk9PntcbiAgICAgICAgICAgIGV2ZW50TWFwPy5vblN0b3AgJiYgZXZlbnRNYXA/Lm9uU3RvcCgpO1xuICAgICAgICB9KVxuICAgICAgICBhdWRpb1BsYXllci5zZXRBdWRpb0V2ZW50KFwib25wYXVzZVwiLCAoKT0+e1xuICAgICAgICAgICAgZXZlbnRNYXA/Lm9uU3RvcCAmJiBldmVudE1hcD8ub25TdG9wKCk7XG4gICAgICAgIH0pXG4gICAgICAgIGF1ZGlvUGxheWVyLnNldEF1ZGlvRXZlbnQoXCJvbmVuZGVkXCIsICgpPT57XG4gICAgICAgICAgICBldmVudE1hcD8ub25TdG9wICYmIGV2ZW50TWFwPy5vblN0b3AoKTtcbiAgICAgICAgfSlcbiAgICAgICAgYXVkaW9QbGF5ZXIuc2V0QXVkaW9FdmVudChcIm9uY2xvc2VcIiwgKCk9PntcbiAgICAgICAgICAgIGV2ZW50TWFwPy5vblN0b3AgJiYgZXZlbnRNYXA/Lm9uU3RvcCgpO1xuICAgICAgICB9KVxuXG4gICAgICAgIGxldCBwbGF5QXVkaW8gPSAoKT0+e1xuICAgICAgICAgICAgYXVkaW9QbGF5ZXIucGxheSh1cmwpLnRoZW4oKCk9PnsgLy8g6Ziy5q2i55So5oi35peg5Lqk5LqS5LiN6IO96buY6K6k5pKt5pS+XG4gICAgICAgICAgICB9KS5jYXRjaCgoKT0+e1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcInBsYXlBdWRpb1wiKVxuICAgICAgICAgICAgICAgICAgICBwbGF5QXVkaW8oKTtcbiAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBwbGF5QXVkaW8oKTtcbiAgICB9XG4gICAgYXN5bmMgdXBsb2FkQW5kU2F2ZVZvaWNlKGJsb2IsY2hhdFZvaWNlKXtcbiAgICAgICAgaWYodGhpcy51cGxvYWRTZXJ2KXtcbiAgICAgICAgICAgIGxldCBpZCA9IGNoYXRWb2ljZT8uaWQgfHwgdGhpcy51cGxvYWRTZXJ2Py5nZW5NZDUoY2hhdFZvaWNlPy5nZXQoXCJjb250ZW50XCIpfHxjaGF0Vm9pY2U/LmdldChcInNzbWxcIikpXG4gICAgICAgICAgICBsZXQgbm93ID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGxldCBmaWxlbmFtZSA9IGlkICsgbm93LmdldEZ1bGxZZWFyKCkrKG5vdy5nZXRNb250aCgpKzEpK25vdy5nZXREYXRlKCkrbm93LmdldEhvdXJzKCkrbm93LmdldE1pbnV0ZXMoKStub3cuZ2V0U2Vjb25kcygpICsgXCIud2F2XCJcbiAgICAgICAgICAgIGxldCBmaWxlID0gbmV3IEZpbGUoW2Jsb2JdLCBmaWxlbmFtZSwgeyB0eXBlOiAnYXVkaW8vd2F2JyB9KTtcbiAgICAgICAgICAgIGxldCBmaWxlUmVzdWx0ID0gYXdhaXQgdGhpcy51cGxvYWRTZXJ2LnVwbG9hZChmaWxlLChyZXMpPT57XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2cocmVzKSAvLyDkuIrkvKDov5vluqbvvIzlj6/ku6XlkIzmraXmm7TmlrDpobXpnaLkuIrkvKDnmb7liIbmr5RcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbGV0IGF0dGFjaFBvaW50ZXIgPSB7X190eXBlOlwiUG9pbnRlclwiLGNsYXNzTmFtZTpcIkF0dGFjaG1lbnRcIixvYmplY3RJZDpmaWxlUmVzdWx0Py5pZH1cbiAgICAgICAgICAgIGlmKGF0dGFjaFBvaW50ZXI/Lm9iamVjdElkKXtcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2Uuc2V0KFwidm9pY2VGaWxlXCIsYXR0YWNoUG9pbnRlcilcbiAgICAgICAgICAgICAgICBjaGF0Vm9pY2UgPSBhd2FpdCBjaGF0Vm9pY2Uuc2F2ZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVyblxuICAgIH1cbn0iXX0=
@@ -1,10 +1,2 @@
1
-
2
- /**
3
- * @copyright © 未来飞马 © 未来全栈 www.fmode.cn
4
- * 版权所有 © 未来飞马 © 江西脑控科技有限公司 Copyright © Fmode Technology Co., Ltd.
5
- * 保留所有权利 All Rights Reserved.
6
- * /home/ryan/workspace/nova/nova-admin/dist/fmode-ng/esm2022/lib/aigc/voice/tts/index.mjs
7
- */
8
- export*from"./fmode-tts-class";
9
- var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3ZvaWNlL3R0cy9pbmRleC5tanM=`
10
-
1
+ export * from "./fmode-tts-class";
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2Mvdm9pY2UvdHRzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsbUJBQW1CLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9mbW9kZS10dHMtY2xhc3NcIiJdfQ==