fmode-ng 0.0.113 → 0.0.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +8 -0
- package/README.md +37 -37
- package/esm2022/fmode-ng.mjs +10 -5
- package/esm2022/lib/aigc/agent/fm-agent-task/fm-agent-task.component.mjs +8 -92
- package/esm2022/lib/aigc/agent/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/avatar.module.mjs +10 -45
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/avatar.role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/comp-avatar-particle.component.mjs +10 -315
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/index.mjs +10 -3
- package/esm2022/lib/aigc/avatar/comp-avatar-particle/role-points.class.mjs +10 -57
- package/esm2022/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.mjs +10 -98
- package/esm2022/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.mjs +10 -107
- package/esm2022/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.mjs +10 -113
- package/esm2022/lib/aigc/avatar/index.mjs +10 -8
- package/esm2022/lib/aigc/avatar/interface-avatar-role.mjs +10 -2
- package/esm2022/lib/aigc/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs +8 -164
- package/esm2022/lib/aigc/chat/chat-header-area/comp-header-area.component.mjs +10 -49
- package/esm2022/lib/aigc/chat/chat-header-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-list/chat-list.component.mjs +8 -155
- package/esm2022/lib/aigc/chat/chat-list/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-area/comp-message-area.component.mjs +10 -40
- package/esm2022/lib/aigc/chat/chat-message-area/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/chat-message-card/comp-message-card.component.mjs +10 -140
- package/esm2022/lib/aigc/chat/chat-message-card/duration-str.pipe.mjs +10 -29
- package/esm2022/lib/aigc/chat/chat-message-card/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/index.mjs +10 -3
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.mjs +8 -193
- package/esm2022/lib/aigc/chat/chat-modal-input/modal-input.component.mjs +10 -331
- package/esm2022/lib/aigc/chat/chat-panel/chat-panel.component.mjs +8 -249
- package/esm2022/lib/aigc/chat/comp-role-prompt/comp-role-prompt.component.mjs +10 -83
- package/esm2022/lib/aigc/chat/comp-role-prompt/index.mjs +10 -2
- package/esm2022/lib/aigc/chat/index.mjs +10 -8
- package/esm2022/lib/aigc/comp-markdown-preview/clipboard.service.mjs +10 -82
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-parse.mjs +8 -367
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.component.mjs +10 -51
- package/esm2022/lib/aigc/comp-markdown-preview/markdown-preview.module.mjs +10 -24
- package/esm2022/lib/aigc/comp-markdown-preview/plugins/md-mathjax/index.mjs +10 -115
- package/esm2022/lib/aigc/index.mjs +10 -14
- package/esm2022/lib/aigc/service-fmai/fmai.service.mjs +10 -21
- package/esm2022/lib/aigc/service-fmai/service-chat/chat-class.mjs +10 -2
- package/esm2022/lib/aigc/service-fmai/service-chat/chat.service.mjs +8 -174
- package/esm2022/lib/aigc/service-fmai/service-chat/index.mjs +10 -7
- package/esm2022/lib/aigc/service-fmai/service-chat/mask-list.mjs +9 -194
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/chat-content.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/pipes/hidexml.pipe.mjs +10 -27
- package/esm2022/lib/aigc/service-fmai/service-chat/utilnow.pipe.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-func.mjs +9 -162
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine-work.mjs +10 -68
- package/esm2022/lib/aigc/service-fmai/service-imagine/imagine.service.mjs +8 -313
- package/esm2022/lib/aigc/service-fmai/service-imagine/index.mjs +10 -4
- package/esm2022/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.mjs +10 -62
- package/esm2022/lib/aigc/story/fm-story-card/fm-story-card.component.mjs +10 -87
- package/esm2022/lib/aigc/story/fm-story-list/fm-story-list.component.mjs +10 -345
- package/esm2022/lib/aigc/story/fm-story-list/story-preview.mjs +10 -81
- package/esm2022/lib/aigc/story/fm-story-loader/fm-story-loader.component.mjs +10 -152
- package/esm2022/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.mjs +10 -42
- package/esm2022/lib/aigc/story/index.mjs +10 -6
- package/esm2022/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.mjs +10 -47
- package/esm2022/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.mjs +10 -95
- package/esm2022/lib/aigc/story/modal-chat-story/modal-chat-story.component.mjs +10 -253
- package/esm2022/lib/aigc/story/story.service.mjs +10 -35
- package/esm2022/lib/aigc/voice/fmode-voice.service.mjs +10 -636
- package/esm2022/lib/aigc/voice/index.mjs +10 -7
- package/esm2022/lib/aigc/voice/lib/audio/audio.player.mjs +10 -55
- package/esm2022/lib/aigc/voice/lib/audio/audio.streamer.mjs +10 -2
- package/esm2022/lib/aigc/voice/lib/audio/streamer.microsoft.mjs +10 -96
- package/esm2022/lib/aigc/voice/lib/audio/streamer.pcm.mjs +8 -177
- package/esm2022/lib/aigc/voice/lib/pcm2wav.mjs +10 -38
- package/esm2022/lib/aigc/voice/lib/recorder/extension-waveview.mjs +10 -215
- package/esm2022/lib/aigc/voice/lib/resample.mjs +10 -34
- package/esm2022/lib/aigc/voice/tts/fmode-tts-class.mjs +10 -189
- package/esm2022/lib/aigc/voice/tts/index.mjs +10 -5
- package/esm2022/lib/aigc/voice/tts/int-tts-provider.mjs +10 -2
- package/esm2022/lib/aigc/voice/tts/provider-doubao.mjs +8 -346
- package/esm2022/lib/code/fm-codemirror/fm-codemirror.component.mjs +8 -342
- package/esm2022/lib/code/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/fmode-completion.mjs +8 -430
- package/esm2022/lib/core/agent/chat/completion/index.mjs +10 -2
- package/esm2022/lib/core/agent/chat/completion/int-gpt-chat-options.mjs +10 -2
- package/esm2022/lib/core/agent/chat/fmode-chat.mjs +8 -617
- package/esm2022/lib/core/agent/chat/index.mjs +10 -4
- package/esm2022/lib/core/agent/chat/interface.mjs +10 -2
- package/esm2022/lib/core/agent/index.mjs +10 -6
- package/esm2022/lib/core/agent/prompt/agent.prompt.mjs +10 -133
- package/esm2022/lib/core/agent/prompt/index.mjs +10 -2
- package/esm2022/lib/core/agent/prompt/prompt-util.mjs +10 -16
- package/esm2022/lib/core/agent/story/agent.story.mjs +10 -64
- package/esm2022/lib/core/agent/story/index.mjs +10 -2
- package/esm2022/lib/core/agent/task/agent.task.mjs +10 -90
- package/esm2022/lib/core/agent/task/index.mjs +10 -2
- package/esm2022/lib/core/agent/waiting/index.mjs +10 -3
- package/esm2022/lib/core/agent/waiting/loading/loading.ctrl.mjs +10 -279
- package/esm2022/lib/core/agent/waiting/tips/tips.ctrl.mjs +8 -190
- package/esm2022/lib/core/index.mjs +10 -4
- package/esm2022/lib/core/parse/datatype/acl.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/file.mjs +10 -69
- package/esm2022/lib/core/parse/datatype/geopoint.mjs +10 -57
- package/esm2022/lib/core/parse/datatype/relation.mjs +10 -56
- package/esm2022/lib/core/parse/fmode.cloud.mjs +10 -0
- package/esm2022/lib/core/parse/fmode.object.mjs +10 -232
- package/esm2022/lib/core/parse/fmode.parse.mjs +10 -84
- package/esm2022/lib/core/parse/fmode.query.mjs +8 -500
- package/esm2022/lib/core/parse/fmode.user.mjs +10 -275
- package/esm2022/lib/core/parse/index.mjs +10 -5
- package/esm2022/lib/core/parse/types.mjs +10 -2
- package/esm2022/lib/core/voice/index.mjs +10 -3
- package/esm2022/lib/core/voice/tts/index.mjs +10 -2
- package/esm2022/lib/icon/filetype/audio.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/avatar.svg.mjs +10 -14
- package/esm2022/lib/icon/filetype/chat.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/docx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/file.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/filetype.pipe.mjs +10 -57
- package/esm2022/lib/icon/filetype/index.mjs +10 -12
- package/esm2022/lib/icon/filetype/md.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pdf.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/pptx.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/svgtoblob.mjs +10 -8
- package/esm2022/lib/icon/filetype/video.svg.mjs +10 -3
- package/esm2022/lib/icon/filetype/xlsx.svg.mjs +10 -3
- package/esm2022/lib/icon/index.mjs +10 -2
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.component.mjs +10 -209
- package/esm2022/lib/map/comp-poi-picker/comp-poi-picker.module.mjs +10 -33
- package/esm2022/lib/map/index.mjs +10 -4
- package/esm2022/lib/map/map.module.mjs +10 -61
- package/esm2022/lib/map/page-loca-scatter/page-loca-scatter.component.mjs +10 -132
- package/esm2022/lib/map/page-map.start/page-map.start.component.mjs +8 -115
- package/esm2022/lib/map/page-plan-route/page-plan-route.component.mjs +8 -118
- package/esm2022/lib/nova-cloud/index.mjs +10 -3
- package/esm2022/lib/nova-cloud/ncloud-api-func.mjs +10 -91
- package/esm2022/lib/nova-cloud/nova-cloud.service.mjs +10 -53
- package/esm2022/lib/payment/index.mjs +10 -2
- package/esm2022/lib/payment/payment/payment.component.mjs +10 -543
- package/esm2022/lib/payment/payment.service.mjs +10 -202
- package/esm2022/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.mjs +10 -48
- package/esm2022/lib/person/comp-person-item/comp-person-item.component.mjs +10 -29
- package/esm2022/lib/person/comp-person-story/comp-person-story.component.mjs +10 -211
- package/esm2022/lib/person/edit-upload/edit-upload.component.mjs +8 -412
- package/esm2022/lib/person/edit-upload/edit-upload.module.mjs +10 -50
- package/esm2022/lib/person/index.mjs +10 -5
- package/esm2022/lib/person/modal-person-select/modal-person-select.component.mjs +10 -144
- package/esm2022/lib/person/modal-user-verify/secret-text.pipe.mjs +10 -41
- package/esm2022/lib/person/modal-user-verify/user-verify.component.mjs +10 -595
- package/esm2022/lib/person/person-detail/person-detail.component.mjs +10 -172
- package/esm2022/lib/person/person.service.mjs +8 -193
- package/esm2022/lib/platform/cross.service.mjs +10 -62
- package/esm2022/lib/platform/index.mjs +10 -2
- package/esm2022/lib/social/index.mjs +10 -2
- package/esm2022/lib/social/wechat/wechat-jssdk.service.mjs +8 -230
- package/esm2022/lib/storage/comp-hwobs-manager/hwobs-manager.component.mjs +10 -59
- package/esm2022/lib/storage/index.mjs +10 -5
- package/esm2022/lib/storage/service-hwobs/hwobs.service.mjs +8 -131
- package/esm2022/lib/storage/service-hwobs/index.mjs +10 -3
- package/esm2022/lib/storage/service-hwobs/typings/esdk-obs-browser.mjs +1 -1
- package/esm2022/lib/storage/service-upload/index.mjs +10 -2
- package/esm2022/lib/storage/service-upload/nova-upload.service.mjs +8 -513
- package/esm2022/lib/storage/service-upload/util-file-md5.mjs +10 -28
- package/esm2022/lib/storage/service-upload/util-file-metadata.mjs +10 -93
- package/esm2022/lib/storage/storage.module.mjs +10 -42
- package/esm2022/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/article.service.mjs +10 -237
- package/esm2022/lib/text/fm-article-editor/comp-upload-book-banners/comp-upload-book-banners.component.mjs +8 -72
- package/esm2022/lib/text/fm-article-editor/draft.service.mjs +10 -207
- package/esm2022/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.mjs +8 -227
- package/esm2022/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.mjs +10 -303
- package/esm2022/lib/text/fm-article-editor/fm-article-editor.component.mjs +8 -371
- package/esm2022/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.mjs +10 -94
- package/esm2022/lib/text/fm-article-editor/fm-article-outline-leftitem/fm-article-outline-leftitem.component.mjs +10 -36
- package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs +10 -281
- package/esm2022/lib/text/fm-article-editor/fm-article-write-options/fm-article-write-options.component.mjs +10 -72
- package/esm2022/lib/text/fm-article-editor/outline-count.pipe.mjs +10 -22
- package/esm2022/lib/text/fm-article-editor/prompt/prompt-insertion-article.mjs +10 -169
- package/esm2022/lib/text/fm-article-editor/task-article-generation.mjs +10 -69
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-draft-create.mjs +10 -65
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline-edit.mjs +10 -55
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-outline.mjs +10 -142
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-preview.mjs +10 -35
- package/esm2022/lib/text/fm-article-editor/tasks/task-article-writing-options.mjs +10 -81
- package/esm2022/lib/text/fm-article-editor/tasks/task-document-select.mjs +10 -50
- package/esm2022/lib/text/fm-text-quill/fm-text-quill.component.mjs +10 -145
- package/esm2022/lib/text/index.mjs +10 -4
- package/esm2022/lib/user/account/account.service.mjs +10 -222
- package/esm2022/lib/user/captcha/captcha.component.mjs +10 -135
- package/esm2022/lib/user/comp-user-avatar/comp-user-avatar.component.mjs +10 -66
- package/esm2022/lib/user/index.mjs +10 -17
- package/esm2022/lib/user/login/auth.guard.mjs +10 -28
- package/esm2022/lib/user/login/auth.service.mjs +8 -433
- package/esm2022/lib/user/login/login.component.mjs +10 -916
- package/esm2022/lib/user/modal-user-login/modal-user-login.component.mjs +10 -311
- package/esm2022/lib/user/profile/auth-profile.guard.mjs +10 -27
- package/esm2022/lib/user/profile/auth-profile.service.mjs +10 -122
- package/esm2022/lib/user/profile/profile-bind/profile-bind.component.mjs +10 -164
- package/esm2022/lib/user/profile/profile-bind/profile-confirm-modal.component.mjs +10 -79
- package/esm2022/lib/user/profile/profile.module.mjs +10 -54
- package/esm2022/lib/user/staff/index.mjs +10 -4
- package/esm2022/lib/user/staff/staff.guard.mjs +10 -26
- package/esm2022/lib/user/staff/staff.module.mjs +10 -18
- package/esm2022/lib/user/staff/staff.service.mjs +10 -85
- package/esm2022/lib/user/user-name.pipe.mjs +10 -29
- package/esm2022/lib/user/user.module.mjs +10 -102
- package/esm2022/lib/video/fm-video/fm-video.component.mjs +10 -67
- package/esm2022/lib/video/index.mjs +10 -2
- package/esm2022/public-api.mjs +10 -21
- package/fesm2022/fmode-ng.mjs +7 -19788
- package/fesm2022/fmode-ng.mjs.map +1 -1
- package/lib/aigc/avatar/comp-avatar-role-image/comp-avatar-role-image.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-role-video/comp-avatar-role-video.component.d.ts +2 -2
- package/lib/aigc/avatar/comp-avatar-talk/comp-avatar-talk.component.d.ts +2 -2
- package/lib/aigc/chat/chat-list/chat-list.component.d.ts +3 -2
- package/lib/aigc/chat/chat-message-card/comp-message-card.component.d.ts +3 -3
- package/lib/aigc/chat/chat-modal-input/modal-audio-message/modal-audio-message.component.d.ts +2 -2
- package/lib/aigc/chat/chat-modal-input/modal-input.component.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-func.d.ts +3 -3
- package/lib/aigc/service-fmai/service-imagine/imagine-work.d.ts +4 -4
- package/lib/aigc/service-fmai/service-imagine/imagine.service.d.ts +6 -6
- package/lib/aigc/story/fm-office-viewer/fm-office-viewer.component.d.ts +2 -2
- package/lib/aigc/story/fm-story-card/fm-story-card.component.d.ts +2 -1
- package/lib/aigc/story/fm-story-list/fm-story-list.component.d.ts +6 -6
- package/lib/aigc/story/fm-story-list/story-preview.d.ts +4 -4
- package/lib/aigc/story/fm-story-loader/fm-story-loader.component.d.ts +3 -3
- package/lib/aigc/story/fm-story-splitter/fm-story-splitter.component.d.ts +2 -2
- package/lib/aigc/story/modal-chat-story/comp-chat-story-json/comp-chat-story-json.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/comp-diary-story/comp-diary-story.component.d.ts +3 -2
- package/lib/aigc/story/modal-chat-story/modal-chat-story.component.d.ts +6 -6
- package/lib/aigc/story/story.service.d.ts +3 -2
- package/lib/aigc/voice/tts/fmode-tts-class.d.ts +2 -2
- package/lib/core/agent/chat/fmode-chat.d.ts +11 -11
- package/lib/core/agent/story/agent.story.d.ts +8 -8
- package/lib/core/parse/datatype/geopoint.d.ts +5 -1
- package/lib/core/parse/fmode.cloud.d.ts +32 -0
- package/lib/core/parse/fmode.object.d.ts +2 -2
- package/lib/core/parse/fmode.parse.d.ts +15 -9
- package/lib/core/parse/fmode.query.d.ts +41 -2
- package/lib/core/parse/fmode.user.d.ts +1 -0
- package/lib/core/parse/index.d.ts +1 -0
- package/lib/core/parse/types.d.ts +2 -0
- package/lib/map/comp-poi-picker/comp-poi-picker.component.d.ts +5 -5
- package/lib/payment/payment/payment.component.d.ts +3 -3
- package/lib/payment/payment.service.d.ts +4 -4
- package/lib/person/comp-person-gender-icon/comp-person-gender-icon.component.d.ts +2 -1
- package/lib/person/comp-person-item/comp-person-item.component.d.ts +2 -1
- package/lib/person/comp-person-story/comp-person-story.component.d.ts +13 -13
- package/lib/person/edit-upload/edit-upload.component.d.ts +1 -1
- package/lib/person/modal-person-select/modal-person-select.component.d.ts +5 -5
- package/lib/person/modal-user-verify/user-verify.component.d.ts +5 -5
- package/lib/person/person-detail/person-detail.component.d.ts +4 -4
- package/lib/person/person.service.d.ts +7 -7
- package/lib/storage/service-hwobs/hwobs.service.d.ts +4 -5
- package/lib/storage/service-upload/nova-upload.service.d.ts +5 -5
- package/lib/text/fm-article-editor/article-editor-topbar/article-editor-topbar.component.d.ts +2 -1
- package/lib/text/fm-article-editor/article.service.d.ts +12 -12
- package/lib/text/fm-article-editor/draft.service.d.ts +5 -5
- package/lib/text/fm-article-editor/fm-article-aitool/fm-article-aitool.component.d.ts +3 -2
- package/lib/text/fm-article-editor/fm-article-draft/fm-article-draft.component.d.ts +16 -17
- package/lib/text/fm-article-editor/fm-article-editor.component.d.ts +3 -3
- package/lib/text/fm-article-editor/fm-article-outline/fm-article-outline.component.d.ts +11 -10
- package/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.d.ts +2 -2
- package/lib/text/fm-article-editor/prompt/prompt-insertion-article.d.ts +3 -3
- package/lib/text/fm-article-editor/task-article-generation.d.ts +5 -4
- package/lib/text/fm-article-editor/tasks/task-article-draft-create.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline-edit.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-outline.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-article-preview.d.ts +2 -1
- package/lib/text/fm-article-editor/tasks/task-article-writing-options.d.ts +3 -3
- package/lib/text/fm-article-editor/tasks/task-document-select.d.ts +3 -3
- package/lib/user/account/account.service.d.ts +2 -2
- package/lib/user/comp-user-avatar/comp-user-avatar.component.d.ts +2 -2
- package/lib/user/login/auth.service.d.ts +5 -5
- package/lib/user/login/login.component.d.ts +3 -3
- package/lib/user/profile/auth-profile.service.d.ts +8 -8
- package/lib/user/profile/profile-bind/profile-bind.component.d.ts +7 -7
- package/lib/user/profile/profile-bind/profile-confirm-modal.component.d.ts +2 -2
- package/lib/user/staff/staff.service.d.ts +3 -3
- package/lib/user/user-name.pipe.d.ts +2 -2
- package/package.json +12 -18
|
@@ -1,166 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
import { CommonModule } from '@angular/common';
|
|
3
|
-
import { ToastController } from "@ionic/angular";
|
|
4
|
-
import { Router, RouterModule } from '@angular/router';
|
|
5
|
-
import { IonicModule, Platform } from "@ionic/angular";
|
|
6
|
-
import { FmodeVoiceService } from '../../voice';
|
|
7
|
-
import { FmodeChat, ChatService } from '../../service-fmai/service-chat';
|
|
8
|
-
import { NovaCloudService } from '../../../nova-cloud/nova-cloud.service';
|
|
9
|
-
import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
|
|
10
|
-
import * as i0 from "@angular/core";
|
|
11
|
-
import * as i1 from "@ionic/angular";
|
|
12
|
-
import * as i2 from "@angular/router";
|
|
13
|
-
import * as i3 from "../../../nova-cloud/nova-cloud.service";
|
|
14
|
-
import * as i4 from "../../service-fmai/service-chat";
|
|
15
|
-
import * as i5 from "@awesome-cordova-plugins/diagnostic/ngx";
|
|
16
|
-
import * as i6 from "@angular/common";
|
|
17
|
-
export class ModalChatVoiceInputComponent {
|
|
18
|
-
constructor(platform, router, toastCtrl, ncloud, chatServ, diagnostic) {
|
|
19
|
-
this.platform = platform;
|
|
20
|
-
this.router = router;
|
|
21
|
-
this.toastCtrl = toastCtrl;
|
|
22
|
-
this.ncloud = ncloud;
|
|
23
|
-
this.chatServ = chatServ;
|
|
24
|
-
this.diagnostic = diagnostic;
|
|
25
|
-
/**
|
|
26
|
-
* 开始讲话方式:click点击开始/点击结束 press按住讲话/松开结束
|
|
27
|
-
* @default click
|
|
28
|
-
*/
|
|
29
|
-
this.talkMode = "click";
|
|
30
|
-
this.talkTips = "点击话筒开始讲话";
|
|
31
|
-
this.errorText = ``;
|
|
32
|
-
/**
|
|
33
|
-
* 音频提示音播放
|
|
34
|
-
*/
|
|
35
|
-
this.player = new Audio();
|
|
36
|
-
this.voiceServ = new FmodeVoiceService(this.platform, this.diagnostic);
|
|
37
|
-
}
|
|
38
|
-
ngOnInit() {
|
|
39
|
-
if (this.talkMode == "press") {
|
|
40
|
-
this.talkTips = "轻触底部开始讲话";
|
|
41
|
-
}
|
|
42
|
-
// 开启录音唤醒功能
|
|
43
|
-
setTimeout(() => {
|
|
44
|
-
this.initVoiceSevice();
|
|
45
|
-
this.initVoiceASR();
|
|
46
|
-
}, 500);
|
|
47
|
-
}
|
|
1
|
+
|
|
48
2
|
/**
|
|
49
|
-
*
|
|
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/avatar/modal-chat-voice-input/modal-chat-voice-input.component.mjs
|
|
50
7
|
*/
|
|
51
|
-
async initVoiceASR() {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
this.voiceServ.openWithPriviledge();
|
|
55
|
-
// 开始监听唤醒词 Nihao Hello
|
|
56
|
-
this.startASRAwake();
|
|
57
|
-
});
|
|
58
|
-
}
|
|
59
|
-
// ASR - 唤醒词
|
|
60
|
-
async startASRAwake() {
|
|
61
|
-
await this.voiceServ.openWithPriviledge();
|
|
62
|
-
// let speech = new this.voiceServ.webSpeech();
|
|
63
|
-
// speech.startRecognition("Nihao | Hello");
|
|
64
|
-
}
|
|
65
|
-
playMusic(action) {
|
|
66
|
-
this.player.src = `/assets/avatar/voice/${action}.mp3`;
|
|
67
|
-
this.player.play();
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* 初始化录音转录服务
|
|
71
|
-
* @desc
|
|
72
|
-
* 根据数字角色对话状态,设计语音转录各事件处理过程
|
|
73
|
-
* 嵌入提示音
|
|
74
|
-
* 嵌入动画
|
|
75
|
-
* 嵌入唤醒词切换逻辑
|
|
76
|
-
*/
|
|
77
|
-
initVoiceSevice() {
|
|
78
|
-
this.fmodeChat.userInput = this.voiceServ.resultText;
|
|
79
|
-
this.voiceServ.requestPermission().then(() => {
|
|
80
|
-
this.voiceServ.openWithPriviledge();
|
|
81
|
-
});
|
|
82
|
-
// 开始录音前 播放倾听动画
|
|
83
|
-
// 开始录音前 播放提示音
|
|
84
|
-
this.voiceServ.onBeforeStartTalk = () => {
|
|
85
|
-
this.fmodeChat.playAnimation("listening");
|
|
86
|
-
this.playMusic("start-talk");
|
|
87
|
-
};
|
|
88
|
-
// 用户取消录音前 播放提示音
|
|
89
|
-
this.voiceServ.onBeforeCancelTalk = () => {
|
|
90
|
-
this.playMusic("interupt-talk");
|
|
91
|
-
this.fmodeChat.playAnimation("waiting");
|
|
92
|
-
};
|
|
93
|
-
// 用户取消录音后 麦克风实时监听唤醒词
|
|
94
|
-
this.voiceServ.onAfterCancelTalk = () => {
|
|
95
|
-
this.startASRAwake(); // 监听与麦克风冲突,需要重启
|
|
96
|
-
};
|
|
97
|
-
// 完成录音前 播放提示音
|
|
98
|
-
// 完成录音后 执行处理过程
|
|
99
|
-
this.voiceServ.onBeforeFinishTalk = () => {
|
|
100
|
-
this.fmodeChat.playAnimation("thinking");
|
|
101
|
-
this.playMusic("stop-talk");
|
|
102
|
-
};
|
|
103
|
-
this.voiceServ.onAfterFinishTalk = () => {
|
|
104
|
-
console.log("onAfterFinishTalk");
|
|
105
|
-
this.fmodeChat.userInput = this.voiceServ?.resultText;
|
|
106
|
-
this.sendMessage(); // 发送消息
|
|
107
|
-
this.startASRAwake(); // 监听与麦克风冲突,需要重启
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
/**
|
|
111
|
-
* 发送语音消息
|
|
112
|
-
*
|
|
113
|
-
*/
|
|
114
|
-
async sendMessage() {
|
|
115
|
-
// 检测用户登录情况
|
|
116
|
-
// let isLoginLock = await this.authServ.checkLoginLock()
|
|
117
|
-
// if(!isLoginLock) return false
|
|
118
|
-
// 检测余额及模型付费限制
|
|
119
|
-
// let payCheck = await this.checkBalance()
|
|
120
|
-
// if(!payCheck) return false
|
|
121
|
-
// 检测用户输入内容空值
|
|
122
|
-
if (!this.fmodeChat.userInput) {
|
|
123
|
-
this.errorText = `内容不能为空`;
|
|
124
|
-
let toast = await this.toastCtrl.create({
|
|
125
|
-
message: this.errorText,
|
|
126
|
-
position: "top",
|
|
127
|
-
icon: 'alert',
|
|
128
|
-
color: "warning-circle",
|
|
129
|
-
duration: 1000
|
|
130
|
-
});
|
|
131
|
-
toast.present();
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
// 正常发送消息
|
|
135
|
-
this.fmodeChat?.sendMessage(this.voiceServ.resultText, null, (msg) => {
|
|
136
|
-
}, {
|
|
137
|
-
onSSMLComplete: (voice) => {
|
|
138
|
-
console.log(voice);
|
|
139
|
-
}
|
|
140
|
-
});
|
|
141
|
-
this.fmodeChat.userInput = ``;
|
|
142
|
-
this.fmodeChat.userImage = ``;
|
|
143
|
-
}
|
|
144
|
-
testTTS(sentence) {
|
|
145
|
-
console.log(sentence);
|
|
146
|
-
sentence = sentence || "你好呀,我是飞马小智!很高兴为您介绍脑控科技的发展历程。我们成立于2019年";
|
|
147
|
-
// let speech = new this.voiceServ.webSpeech();
|
|
148
|
-
// speech.speak(sentence)
|
|
149
|
-
}
|
|
150
|
-
testXunfeiTTS() {
|
|
151
|
-
// this.voiceServ.ttsXunfei.connectWebSocket()
|
|
152
|
-
}
|
|
153
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ModalChatVoiceInputComponent, deps: [{ token: i1.Platform }, { token: i2.Router }, { token: i1.ToastController }, { token: i3.NovaCloudService }, { token: i4.ChatService }, { token: i5.Diagnostic }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
154
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ModalChatVoiceInputComponent, isStandalone: true, selector: "fm-modal-chat-voice-input", inputs: { fmodeChat: "fmodeChat", talkMode: "talkMode" }, providers: [], ngImport: i0, template: " \r\n <ng-container *ngIf=\"fmodeChat\">\r\n\r\n <!-- \u7528\u6237\u8F93\u5165 \u63D0\u793A\u533A\u57DF -->\r\n <div class=\"user-asr-input\" style=\"text-align: center;\" *ngIf=\"!fmodeChat?.userInput && voiceServ.btnStatus!='OPEN'\">{{talkTips}}</div>\r\n <div class=\"user-asr-input\">{{fmodeChat?.userInput}}</div>\r\n \r\n <!-- \u6D4B\u8BD5\u6309\u94AE -->\r\n <div class=\"test-button-group\" *ngIf=\"false\">\r\n <button class=\"button-record\" (click)=\"voiceServ.toggleRecord()\">\u5F00\u59CB\u5F55\u5236 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\r\n <br>\r\n <button class=\"button-record\" (click)=\"voiceServ.playRecord()\">\u64AD\u653E\u5F55\u5236\u7ED3\u679C</button>\r\n <br>\r\n <button class=\"button-record\" (click)=\"voiceServ.playBuffers()\">\u64AD\u653EBuffers\u7ED3\u679C</button>\r\n <button (click)=\"testTTS()\">\u6D4B\u8BD5TTS\u7EAFWEB</button>\r\n <button (click)=\"startASR()\">\u6D4B\u8BD5ASR</button> \r\n <button (click)=\"testXunfeiTTS()\">\u6D4B\u8BD5\u5408\u6210</button> \r\n </div>\r\n\r\n \r\n \r\n <!-- \u4EA4\u4E92\u6309\u94AE -->\r\n <ion-fab slot=\"fixed\" horizontal=\"center\" vertical=\"bottom\">\r\n <ng-container *ngIf=\"talkMode=='click'\">\r\n <!-- \u9ED8\u8BA4\u6309\u94AE\uFF1A\u5F00\u59CB\u8BB2\u8BDD -->\r\n <ion-fab-button color=\"primary\" closeIcon=\"checkmark\" (click)=\"voiceServ.toggleRecord()\">\r\n <ion-icon name=\"mic-outline\"></ion-icon>\r\n </ion-fab-button>\r\n\r\n <!-- \u8BB2\u8BDD\u4E2D\uFF1A\u53D6\u6D88\u53D1\u9001 -->\r\n <ion-fab-list side=\"end\">\r\n <ion-fab-button [class]=\"'loading'\" (click)=\"voiceServ.cancelTalk()\">\r\n <ion-icon name=\"pause-outline\"></ion-icon>\r\n </ion-fab-button>\r\n </ion-fab-list>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"talkMode=='press'\">\r\n <ion-fab-button color=\"primary\" closeIcon=\"mic-outline\" (touchstart)=\"voiceServ.toggleRecord()\" (touchend)=\"voiceServ.cancelTalk()\">\r\n <ion-icon name=\"mic-outline\"></ion-icon>\r\n </ion-fab-button>\r\n </ng-container>\r\n </ion-fab>\r\n\r\n\r\n <!-- \u97F3\u9891\u6CE2\u52A8 -->\r\n <div class=\"record-wave\">\r\n </div>\r\n</ng-container>\r\n", styles: ["ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:\"\";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: IonicModule }, { kind: "component", type: i1.IonFab, selector: "ion-fab", inputs: ["activated", "edge", "horizontal", "vertical"] }, { kind: "component", type: i1.IonFabButton, selector: "ion-fab-button", inputs: ["activated", "closeIcon", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "show", "size", "target", "translucent", "type"] }, { kind: "component", type: i1.IonFabList, selector: "ion-fab-list", inputs: ["activated", "side"] }, { kind: "component", type: i1.IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "ngmodule", type: RouterModule }] }); }
|
|
155
|
-
}
|
|
156
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ModalChatVoiceInputComponent, decorators: [{
|
|
157
|
-
type: Component,
|
|
158
|
-
args: [{ selector: 'fm-modal-chat-voice-input', standalone: true, imports: [CommonModule,
|
|
159
|
-
IonicModule, RouterModule,
|
|
160
|
-
], providers: [], template: " \r\n <ng-container *ngIf=\"fmodeChat\">\r\n\r\n <!-- \u7528\u6237\u8F93\u5165 \u63D0\u793A\u533A\u57DF -->\r\n <div class=\"user-asr-input\" style=\"text-align: center;\" *ngIf=\"!fmodeChat?.userInput && voiceServ.btnStatus!='OPEN'\">{{talkTips}}</div>\r\n <div class=\"user-asr-input\">{{fmodeChat?.userInput}}</div>\r\n \r\n <!-- \u6D4B\u8BD5\u6309\u94AE -->\r\n <div class=\"test-button-group\" *ngIf=\"false\">\r\n <button class=\"button-record\" (click)=\"voiceServ.toggleRecord()\">\u5F00\u59CB\u5F55\u5236 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\r\n <br>\r\n <button class=\"button-record\" (click)=\"voiceServ.playRecord()\">\u64AD\u653E\u5F55\u5236\u7ED3\u679C</button>\r\n <br>\r\n <button class=\"button-record\" (click)=\"voiceServ.playBuffers()\">\u64AD\u653EBuffers\u7ED3\u679C</button>\r\n <button (click)=\"testTTS()\">\u6D4B\u8BD5TTS\u7EAFWEB</button>\r\n <button (click)=\"startASR()\">\u6D4B\u8BD5ASR</button> \r\n <button (click)=\"testXunfeiTTS()\">\u6D4B\u8BD5\u5408\u6210</button> \r\n </div>\r\n\r\n \r\n \r\n <!-- \u4EA4\u4E92\u6309\u94AE -->\r\n <ion-fab slot=\"fixed\" horizontal=\"center\" vertical=\"bottom\">\r\n <ng-container *ngIf=\"talkMode=='click'\">\r\n <!-- \u9ED8\u8BA4\u6309\u94AE\uFF1A\u5F00\u59CB\u8BB2\u8BDD -->\r\n <ion-fab-button color=\"primary\" closeIcon=\"checkmark\" (click)=\"voiceServ.toggleRecord()\">\r\n <ion-icon name=\"mic-outline\"></ion-icon>\r\n </ion-fab-button>\r\n\r\n <!-- \u8BB2\u8BDD\u4E2D\uFF1A\u53D6\u6D88\u53D1\u9001 -->\r\n <ion-fab-list side=\"end\">\r\n <ion-fab-button [class]=\"'loading'\" (click)=\"voiceServ.cancelTalk()\">\r\n <ion-icon name=\"pause-outline\"></ion-icon>\r\n </ion-fab-button>\r\n </ion-fab-list>\r\n </ng-container>\r\n \r\n <ng-container *ngIf=\"talkMode=='press'\">\r\n <ion-fab-button color=\"primary\" closeIcon=\"mic-outline\" (touchstart)=\"voiceServ.toggleRecord()\" (touchend)=\"voiceServ.cancelTalk()\">\r\n <ion-icon name=\"mic-outline\"></ion-icon>\r\n </ion-fab-button>\r\n </ng-container>\r\n </ion-fab>\r\n\r\n\r\n <!-- \u97F3\u9891\u6CE2\u52A8 -->\r\n <div class=\"record-wave\">\r\n </div>\r\n</ng-container>\r\n", styles: ["ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:\"\";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n"] }]
|
|
161
|
-
}], ctorParameters: () => [{ type: i1.Platform }, { type: i2.Router }, { type: i1.ToastController }, { type: i3.NovaCloudService }, { type: i4.ChatService }, { type: i5.Diagnostic }], propDecorators: { fmodeChat: [{
|
|
162
|
-
type: Input
|
|
163
|
-
}], talkMode: [{
|
|
164
|
-
type: Input
|
|
165
|
-
}] } });
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kYWwtY2hhdC12b2ljZS1pbnB1dC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvYXZhdGFyL21vZGFsLWNoYXQtdm9pY2UtaW5wdXQvbW9kYWwtY2hhdC12b2ljZS1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvYXZhdGFyL21vZGFsLWNoYXQtdm9pY2UtaW5wdXQvbW9kYWwtY2hhdC12b2ljZS1pbnB1dC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFRLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBRWhELE9BQU8sRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUV0RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDaEQsT0FBTyxFQUFFLFNBQVMsRUFBQyxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUMxRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7Ozs7O0FBY3JFLE1BQU0sT0FBTyw0QkFBNEI7SUFldkMsWUFDVSxRQUFpQixFQUNqQixNQUFhLEVBQ2IsU0FBeUIsRUFDekIsTUFBdUIsRUFDeEIsUUFBb0IsRUFDbkIsVUFBcUI7UUFMckIsYUFBUSxHQUFSLFFBQVEsQ0FBUztRQUNqQixXQUFNLEdBQU4sTUFBTSxDQUFPO1FBQ2IsY0FBUyxHQUFULFNBQVMsQ0FBZ0I7UUFDekIsV0FBTSxHQUFOLE1BQU0sQ0FBaUI7UUFDeEIsYUFBUSxHQUFSLFFBQVEsQ0FBWTtRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFXO1FBakI5Qjs7O1dBR0c7UUFDSyxhQUFRLEdBQWlCLE9BQU8sQ0FBQTtRQUN6QyxhQUFRLEdBQUcsVUFBVSxDQUFBO1FBRXJCLGNBQVMsR0FBVSxFQUFFLENBQUE7UUErQ3JCOztXQUVHO1FBQ0YsV0FBTSxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7UUFwQ3BCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUV4RSxDQUFDO0lBQ0QsUUFBUTtRQUNOLElBQUcsSUFBSSxDQUFDLFFBQVEsSUFBRSxPQUFPLEVBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixDQUFDO1FBRUQsV0FBVztRQUNYLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUE7WUFDdEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ3JCLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxZQUFZO1FBQ2hCLFNBQVM7UUFDVCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUE7WUFDbkMsc0JBQXNCO1lBQ3RCLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtRQUN0QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFDRCxZQUFZO0lBQ1osS0FBSyxDQUFDLGFBQWE7UUFDakIsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDMUMsK0NBQStDO1FBQy9DLDRDQUE0QztJQUM5QyxDQUFDO0lBT0EsU0FBUyxDQUFDLE1BQU07UUFDZCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyx3QkFBd0IsTUFBTSxNQUFNLENBQUE7UUFDdEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7UUFPSTtJQUNILGVBQWU7UUFDYixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQTtRQUNwRCxJQUFJLENBQUMsU0FBUyxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUUsRUFBRTtZQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixFQUFFLENBQUE7UUFDckMsQ0FBQyxDQUFDLENBQUE7UUFFRixlQUFlO1FBQ2YsY0FBYztRQUNkLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsR0FBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQ3pDLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUE7UUFDOUIsQ0FBQyxDQUFBO1FBRUQsZ0JBQWdCO1FBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsR0FBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUE7WUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUE7UUFDekMsQ0FBQyxDQUFBO1FBQ0QscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsaUJBQWlCLEdBQUcsR0FBRSxFQUFFO1lBQ3JDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQSxDQUFDLGdCQUFnQjtRQUN2QyxDQUFDLENBQUE7UUFDRCxjQUFjO1FBQ2QsZUFBZTtRQUNmLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLEdBQUcsR0FBRSxFQUFFO1lBQ3RDLElBQUksQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFBO1lBQ3hDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDN0IsQ0FBQyxDQUFBO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxHQUFFLEVBQUU7WUFDckMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO1lBQ2hDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFBO1lBQ3JELElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQSxDQUFDLE9BQU87WUFDMUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBLENBQUMsZ0JBQWdCO1FBQ3ZDLENBQUMsQ0FBQTtJQUNILENBQUM7SUFFRDs7O09BR0c7SUFDRixLQUFLLENBQUMsV0FBVztRQUVoQixXQUFXO1FBQ1gseURBQXlEO1FBQ3pELGdDQUFnQztRQUVoQyxjQUFjO1FBQ2QsMkNBQTJDO1FBQzNDLDZCQUE2QjtRQUU3QixhQUFhO1FBQ2IsSUFBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUE7WUFDekIsSUFBSSxLQUFLLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQztnQkFDdEMsT0FBTyxFQUFDLElBQUksQ0FBQyxTQUFTO2dCQUN0QixRQUFRLEVBQUMsS0FBSztnQkFDZCxJQUFJLEVBQUMsT0FBTztnQkFDWixLQUFLLEVBQUMsZ0JBQWdCO2dCQUN0QixRQUFRLEVBQUMsSUFBSTthQUNkLENBQUMsQ0FBQTtZQUNGLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNoQixPQUFNO1FBQ1IsQ0FBQztRQUVELFNBQVM7UUFDVCxJQUFJLENBQUMsU0FBUyxFQUFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBQyxJQUFJLEVBQUMsQ0FBQyxHQUFPLEVBQUMsRUFBRTtRQUV0RSxDQUFDLEVBQUM7WUFDQSxjQUFjLEVBQUMsQ0FBQyxLQUFTLEVBQUMsRUFBRTtnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtZQUNwQixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFBO1FBQzdCLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQTtJQUMvQixDQUFDO0lBRUMsT0FBTyxDQUFDLFFBQVM7UUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFBO1FBQ3JCLFFBQVEsR0FBRyxRQUFRLElBQUksd0NBQXdDLENBQUE7UUFDL0QsK0NBQStDO1FBQy9DLHlCQUF5QjtJQUMzQixDQUFDO0lBQ0QsYUFBYTtRQUNYLDhDQUE4QztJQUNoRCxDQUFDOytHQWhLTSw0QkFBNEI7bUdBQTVCLDRCQUE0QixrSUFMN0IsRUFDVCwwQkNwQkgsKzJFQWlEQSw2WkRqQ1ksWUFBWSxrSUFDcEIsV0FBVywycEJBQUMsWUFBWTs7NEZBT2YsNEJBQTRCO2tCQVh4QyxTQUFTOytCQUNFLDJCQUEyQixjQUN6QixJQUFJLFdBQ1AsQ0FBQyxZQUFZO3dCQUNwQixXQUFXLEVBQUMsWUFBWTtxQkFDekIsYUFDUyxFQUNUO2tOQU1RLFNBQVM7c0JBQWpCLEtBQUs7Z0JBTUcsUUFBUTtzQkFBaEIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCxPbkluaXQsSW5wdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgVG9hc3RDb250cm9sbGVyIH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCJcclxuXHJcbmltcG9ydCB7IFJvdXRlciwgUm91dGVyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgSW9uaWNNb2R1bGUsIFBsYXRmb3JtIH0gZnJvbSBcIkBpb25pYy9hbmd1bGFyXCJcclxuXHJcbmltcG9ydCB7IEZtb2RlVm9pY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdm9pY2UnO1xyXG5pbXBvcnQgeyBGbW9kZUNoYXQsQ2hhdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlLWZtYWkvc2VydmljZS1jaGF0JztcclxuaW1wb3J0IHsgTm92YUNsb3VkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL25vdmEtY2xvdWQvbm92YS1jbG91ZC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgRGlhZ25vc3RpYyB9IGZyb20gJ0Bhd2Vzb21lLWNvcmRvdmEtcGx1Z2lucy9kaWFnbm9zdGljL25neCc7XHJcblxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdmbS1tb2RhbC1jaGF0LXZvaWNlLWlucHV0JyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsXHJcbiAgICBJb25pY01vZHVsZSxSb3V0ZXJNb2R1bGUsXHJcbiAgXSxcclxuICBwcm92aWRlcnM6W1xyXG4gIF0sXHJcbiAgdGVtcGxhdGVVcmw6ICcuL21vZGFsLWNoYXQtdm9pY2UtaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL21vZGFsLWNoYXQtdm9pY2UtaW5wdXQuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTW9kYWxDaGF0Vm9pY2VJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdHtcclxuXHJcbiAgQElucHV0KCkgZm1vZGVDaGF0OkZtb2RlQ2hhdHx1bmRlZmluZWRcclxuXHJcbiAgIC8qKlxyXG4gICAgICog5byA5aeL6K6y6K+d5pa55byP77yaY2xpY2vngrnlh7vlvIDlp4sv54K55Ye757uT5p2fIHByZXNz5oyJ5L2P6K6y6K+dL+advuW8gOe7k+adn1xyXG4gICAgICogQGRlZmF1bHQgY2xpY2tcclxuICAgICovXHJcbiAgQElucHV0KCkgdGFsa01vZGU6XCJjbGlja1wifFwicHJlc3NcIj1cImNsaWNrXCJcclxuICB0YWxrVGlwcyA9IFwi54K55Ye76K+d562S5byA5aeL6K6y6K+dXCJcclxuXHJcbiAgZXJyb3JUZXh0OnN0cmluZyA9IGBgXHJcblxyXG4gIHZvaWNlU2VydjpGbW9kZVZvaWNlU2VydmljZVxyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBwbGF0Zm9ybTpQbGF0Zm9ybSxcclxuICAgIHByaXZhdGUgcm91dGVyOlJvdXRlcixcclxuICAgIHByaXZhdGUgdG9hc3RDdHJsOlRvYXN0Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbmNsb3VkOk5vdmFDbG91ZFNlcnZpY2UsXHJcbiAgICBwdWJsaWMgY2hhdFNlcnY6Q2hhdFNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGRpYWdub3N0aWM6RGlhZ25vc3RpY1xyXG4gICAgXHJcblxyXG4gICl7XHJcbiAgICB0aGlzLnZvaWNlU2VydiA9IG5ldyBGbW9kZVZvaWNlU2VydmljZSh0aGlzLnBsYXRmb3JtLHRoaXMuZGlhZ25vc3RpYyk7XHJcblxyXG4gIH1cclxuICBuZ09uSW5pdCgpe1xyXG4gICAgaWYodGhpcy50YWxrTW9kZT09XCJwcmVzc1wiKXtcclxuICAgICAgdGhpcy50YWxrVGlwcyA9IFwi6L276Kem5bqV6YOo5byA5aeL6K6y6K+dXCJcclxuICAgIH1cclxuXHJcbiAgICAvLyDlvIDlkK/lvZXpn7PllKTphpLlip/og71cclxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xyXG4gICAgICB0aGlzLmluaXRWb2ljZVNldmljZSgpXHJcbiAgICAgIHRoaXMuaW5pdFZvaWNlQVNSKClcclxuICAgIH0sIDUwMCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBBU1LllKTphpLlip/og71cclxuICAgKi9cclxuICBhc3luYyBpbml0Vm9pY2VBU1IoKXtcclxuICAgIC8vIOW8gOWQr+W9lemfs+adg+mZkFxyXG4gICAgdGhpcy52b2ljZVNlcnYucmVxdWVzdFBlcm1pc3Npb24oKS50aGVuKCgpPT57XHJcbiAgICAgIHRoaXMudm9pY2VTZXJ2Lm9wZW5XaXRoUHJpdmlsZWRnZSgpXHJcbiAgICAgIC8vIOW8gOWni+ebkeWQrOWUpOmGkuivjSBOaWhhbyBIZWxsb1xyXG4gICAgICB0aGlzLnN0YXJ0QVNSQXdha2UoKVxyXG4gICAgfSlcclxuICB9XHJcbiAgLy8gQVNSIC0g5ZSk6YaS6K+NXHJcbiAgYXN5bmMgc3RhcnRBU1JBd2FrZSgpe1xyXG4gICAgYXdhaXQgdGhpcy52b2ljZVNlcnYub3BlbldpdGhQcml2aWxlZGdlKCk7XHJcbiAgICAvLyBsZXQgc3BlZWNoID0gbmV3IHRoaXMudm9pY2VTZXJ2LndlYlNwZWVjaCgpO1xyXG4gICAgLy8gc3BlZWNoLnN0YXJ0UmVjb2duaXRpb24oXCJOaWhhbyB8IEhlbGxvXCIpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICog6Z+z6aKR5o+Q56S66Z+z5pKt5pS+XHJcbiAgICovXHJcbiAgIHBsYXllciA9IG5ldyBBdWRpbygpO1xyXG5cclxuICAgcGxheU11c2ljKGFjdGlvbil7XHJcbiAgICAgdGhpcy5wbGF5ZXIuc3JjID0gYC9hc3NldHMvYXZhdGFyL3ZvaWNlLyR7YWN0aW9ufS5tcDNgXHJcbiAgICAgdGhpcy5wbGF5ZXIucGxheSgpO1xyXG4gICB9XHJcblxyXG4gICAvKipcclxuICAgICAqIOWIneWni+WMluW9lemfs+i9rOW9leacjeWKoVxyXG4gICAgICogQGRlc2NcclxuICAgICAqIOagueaNruaVsOWtl+inkuiJsuWvueivneeKtuaAge+8jOiuvuiuoeivremfs+i9rOW9leWQhOS6i+S7tuWkhOeQhui/h+eoi1xyXG4gICAgICog5bWM5YWl5o+Q56S66Z+zXHJcbiAgICAgKiDltYzlhaXliqjnlLtcclxuICAgICAqIOW1jOWFpeWUpOmGkuivjeWIh+aNoumAu+i+kVxyXG4gICAgICovXHJcbiAgICBpbml0Vm9pY2VTZXZpY2UoKXtcclxuICAgICAgdGhpcy5mbW9kZUNoYXQudXNlcklucHV0ID0gdGhpcy52b2ljZVNlcnYucmVzdWx0VGV4dFxyXG4gICAgICB0aGlzLnZvaWNlU2Vydi5yZXF1ZXN0UGVybWlzc2lvbigpLnRoZW4oKCk9PntcclxuICAgICAgICB0aGlzLnZvaWNlU2Vydi5vcGVuV2l0aFByaXZpbGVkZ2UoKVxyXG4gICAgICB9KVxyXG5cclxuICAgICAgLy8g5byA5aeL5b2V6Z+z5YmNIOaSreaUvuWAvuWQrOWKqOeUu1xyXG4gICAgICAvLyDlvIDlp4vlvZXpn7PliY0g5pKt5pS+5o+Q56S66Z+zXHJcbiAgICAgIHRoaXMudm9pY2VTZXJ2Lm9uQmVmb3JlU3RhcnRUYWxrID0gKCk9PntcclxuICAgICAgICB0aGlzLmZtb2RlQ2hhdC5wbGF5QW5pbWF0aW9uKFwibGlzdGVuaW5nXCIpXHJcbiAgICAgICAgdGhpcy5wbGF5TXVzaWMoXCJzdGFydC10YWxrXCIpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIOeUqOaIt+WPlua2iOW9lemfs+WJjSDmkq3mlL7mj5DnpLrpn7NcclxuICAgICAgdGhpcy52b2ljZVNlcnYub25CZWZvcmVDYW5jZWxUYWxrID0gKCk9PntcclxuICAgICAgICB0aGlzLnBsYXlNdXNpYyhcImludGVydXB0LXRhbGtcIilcclxuICAgICAgICB0aGlzLmZtb2RlQ2hhdC5wbGF5QW5pbWF0aW9uKFwid2FpdGluZ1wiKVxyXG4gICAgICB9XHJcbiAgICAgIC8vIOeUqOaIt+WPlua2iOW9lemfs+WQjiDpuqblhYvpo47lrp7ml7bnm5HlkKzllKTphpLor41cclxuICAgICAgdGhpcy52b2ljZVNlcnYub25BZnRlckNhbmNlbFRhbGsgPSAoKT0+e1xyXG4gICAgICAgIHRoaXMuc3RhcnRBU1JBd2FrZSgpIC8vIOebkeWQrOS4jum6puWFi+mjjuWGsueqge+8jOmcgOimgemHjeWQr1xyXG4gICAgICB9XHJcbiAgICAgIC8vIOWujOaIkOW9lemfs+WJjSDmkq3mlL7mj5DnpLrpn7NcclxuICAgICAgLy8g5a6M5oiQ5b2V6Z+z5ZCOIOaJp+ihjOWkhOeQhui/h+eoi1xyXG4gICAgICB0aGlzLnZvaWNlU2Vydi5vbkJlZm9yZUZpbmlzaFRhbGsgPSAoKT0+e1xyXG4gICAgICAgIHRoaXMuZm1vZGVDaGF0LnBsYXlBbmltYXRpb24oXCJ0aGlua2luZ1wiKVxyXG4gICAgICAgIHRoaXMucGxheU11c2ljKFwic3RvcC10YWxrXCIpXHJcbiAgICAgIH1cclxuICAgICAgdGhpcy52b2ljZVNlcnYub25BZnRlckZpbmlzaFRhbGsgPSAoKT0+e1xyXG4gICAgICAgIGNvbnNvbGUubG9nKFwib25BZnRlckZpbmlzaFRhbGtcIilcclxuICAgICAgICB0aGlzLmZtb2RlQ2hhdC51c2VySW5wdXQgPSB0aGlzLnZvaWNlU2Vydj8ucmVzdWx0VGV4dFxyXG4gICAgICAgIHRoaXMuc2VuZE1lc3NhZ2UoKSAvLyDlj5HpgIHmtojmga9cclxuICAgICAgICB0aGlzLnN0YXJ0QVNSQXdha2UoKSAvLyDnm5HlkKzkuI7puqblhYvpo47lhrLnqoHvvIzpnIDopoHph43lkK9cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBcclxuICAgICAqIOWPkemAgeivremfs+a2iOaBr1xyXG4gICAgICogXHJcbiAgICAgKi9cclxuICAgICBhc3luYyBzZW5kTWVzc2FnZSgpe1xyXG5cclxuICAgICAgLy8g5qOA5rWL55So5oi355m75b2V5oOF5Ya1XHJcbiAgICAgIC8vIGxldCBpc0xvZ2luTG9jayA9IGF3YWl0IHRoaXMuYXV0aFNlcnYuY2hlY2tMb2dpbkxvY2soKVxyXG4gICAgICAvLyBpZighaXNMb2dpbkxvY2spIHJldHVybiBmYWxzZVxyXG4gIFxyXG4gICAgICAvLyDmo4DmtYvkvZnpop3lj4rmqKHlnovku5jotLnpmZDliLZcclxuICAgICAgLy8gbGV0IHBheUNoZWNrID0gYXdhaXQgdGhpcy5jaGVja0JhbGFuY2UoKVxyXG4gICAgICAvLyBpZighcGF5Q2hlY2spIHJldHVybiBmYWxzZVxyXG4gIFxyXG4gICAgICAvLyDmo4DmtYvnlKjmiLfovpPlhaXlhoXlrrnnqbrlgLxcclxuICAgICAgaWYoIXRoaXMuZm1vZGVDaGF0LnVzZXJJbnB1dCl7XHJcbiAgICAgICAgdGhpcy5lcnJvclRleHQgPSBg5YaF5a655LiN6IO95Li656m6YFxyXG4gICAgICAgIGxldCB0b2FzdCA9IGF3YWl0IHRoaXMudG9hc3RDdHJsLmNyZWF0ZSh7XHJcbiAgICAgICAgICBtZXNzYWdlOnRoaXMuZXJyb3JUZXh0LFxyXG4gICAgICAgICAgcG9zaXRpb246XCJ0b3BcIixcclxuICAgICAgICAgIGljb246J2FsZXJ0JyxcclxuICAgICAgICAgIGNvbG9yOlwid2FybmluZy1jaXJjbGVcIixcclxuICAgICAgICAgIGR1cmF0aW9uOjEwMDBcclxuICAgICAgICB9KVxyXG4gICAgICAgIHRvYXN0LnByZXNlbnQoKTtcclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gIFxyXG4gICAgICAvLyDmraPluLjlj5HpgIHmtojmga9cclxuICAgICAgdGhpcy5mbW9kZUNoYXQ/LnNlbmRNZXNzYWdlKHRoaXMudm9pY2VTZXJ2LnJlc3VsdFRleHQsbnVsbCwobXNnOmFueSk9PntcclxuICAgICAgICBcclxuICAgICAgfSx7XHJcbiAgICAgICAgb25TU01MQ29tcGxldGU6KHZvaWNlOmFueSk9PntcclxuICAgICAgICAgIGNvbnNvbGUubG9nKHZvaWNlKVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIHRoaXMuZm1vZGVDaGF0LnVzZXJJbnB1dCA9IGBgXHJcbiAgICAgIHRoaXMuZm1vZGVDaGF0LnVzZXJJbWFnZSA9IGBgXHJcbiAgICB9XHJcblxyXG4gICAgICB0ZXN0VFRTKHNlbnRlbmNlPyl7XHJcbiAgICAgICAgY29uc29sZS5sb2coc2VudGVuY2UpXHJcbiAgICAgICAgc2VudGVuY2UgPSBzZW50ZW5jZSB8fCBcIuS9oOWlveWRgO+8jOaIkeaYr+mjnumprOWwj+aZuu+8geW+iOmrmOWFtOS4uuaCqOS7i+e7jeiEkeaOp+enkeaKgOeahOWPkeWxleWOhueoi+OAguaIkeS7rOaIkOeri+S6jjIwMTnlubRcIlxyXG4gICAgICAgIC8vIGxldCBzcGVlY2ggPSBuZXcgdGhpcy52b2ljZVNlcnYud2ViU3BlZWNoKCk7XHJcbiAgICAgICAgLy8gc3BlZWNoLnNwZWFrKHNlbnRlbmNlKVxyXG4gICAgICB9XHJcbiAgICAgIHRlc3RYdW5mZWlUVFMoKXtcclxuICAgICAgICAvLyB0aGlzLnZvaWNlU2Vydi50dHNYdW5mZWkuY29ubmVjdFdlYlNvY2tldCgpXHJcbiAgICAgIH1cclxufVxyXG5cclxuIiwiICAgIFxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImZtb2RlQ2hhdFwiPlxyXG5cclxuICAgIDwhLS0g55So5oi36L6T5YWlIOaPkOekuuWMuuWfnyAtLT5cclxuICAgIDxkaXYgY2xhc3M9XCJ1c2VyLWFzci1pbnB1dFwiIHN0eWxlPVwidGV4dC1hbGlnbjogY2VudGVyO1wiICpuZ0lmPVwiIWZtb2RlQ2hhdD8udXNlcklucHV0ICYmIHZvaWNlU2Vydi5idG5TdGF0dXMhPSdPUEVOJ1wiPnt7dGFsa1RpcHN9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInVzZXItYXNyLWlucHV0XCI+e3tmbW9kZUNoYXQ/LnVzZXJJbnB1dH19PC9kaXY+XHJcbiAgICBcclxuICAgIDwhLS0g5rWL6K+V5oyJ6ZKuIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInRlc3QtYnV0dG9uLWdyb3VwXCIgKm5nSWY9XCJmYWxzZVwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24tcmVjb3JkXCIgKGNsaWNrKT1cInZvaWNlU2Vydi50b2dnbGVSZWNvcmQoKVwiPuW8gOWni+W9leWItiB7e3ZvaWNlU2Vydi5jb25uU3RhdHVzfX0ge3t2b2ljZVNlcnYuYnRuU3RhdHVzfX08L2J1dHRvbj5cclxuICAgICAgICA8YnI+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ1dHRvbi1yZWNvcmRcIiAoY2xpY2spPVwidm9pY2VTZXJ2LnBsYXlSZWNvcmQoKVwiPuaSreaUvuW9leWItue7k+aenDwvYnV0dG9uPlxyXG4gICAgICAgIDxicj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uLXJlY29yZFwiIChjbGljayk9XCJ2b2ljZVNlcnYucGxheUJ1ZmZlcnMoKVwiPuaSreaUvkJ1ZmZlcnPnu5Pmnpw8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJ0ZXN0VFRTKClcIj7mtYvor5VUVFPnuq9XRUI8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIChjbGljayk9XCJzdGFydEFTUigpXCI+5rWL6K+VQVNSPC9idXR0b24+IFxyXG4gICAgICAgIDxidXR0b24gKGNsaWNrKT1cInRlc3RYdW5mZWlUVFMoKVwiPua1i+ivleWQiOaIkDwvYnV0dG9uPiBcclxuICAgIDwvZGl2PlxyXG5cclxuICAgIFxyXG4gICAgXHJcbiAgICA8IS0tIOS6pOS6kuaMiemSriAtLT5cclxuICAgIDxpb24tZmFiIHNsb3Q9XCJmaXhlZFwiIGhvcml6b250YWw9XCJjZW50ZXJcIiB2ZXJ0aWNhbD1cImJvdHRvbVwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YWxrTW9kZT09J2NsaWNrJ1wiPlxyXG4gICAgICAgICAgPCEtLSDpu5jorqTmjInpkq7vvJrlvIDlp4vorrLor50gLS0+XHJcbiAgICAgICAgICA8aW9uLWZhYi1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgY2xvc2VJY29uPVwiY2hlY2ttYXJrXCIgKGNsaWNrKT1cInZvaWNlU2Vydi50b2dnbGVSZWNvcmQoKVwiPlxyXG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cIm1pYy1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgIDwvaW9uLWZhYi1idXR0b24+XHJcblxyXG4gICAgICAgICAgPCEtLSDorrLor53kuK3vvJrlj5bmtojlj5HpgIEgLS0+XHJcbiAgICAgICAgICA8aW9uLWZhYi1saXN0IHNpZGU9XCJlbmRcIj5cclxuICAgICAgICAgICAgPGlvbi1mYWItYnV0dG9uIFtjbGFzc109XCInbG9hZGluZydcIiAoY2xpY2spPVwidm9pY2VTZXJ2LmNhbmNlbFRhbGsoKVwiPlxyXG4gICAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwicGF1c2Utb3V0bGluZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICAgIDwvaW9uLWZhYi1idXR0b24+XHJcbiAgICAgICAgICA8L2lvbi1mYWItbGlzdD5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICBcclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFsa01vZGU9PSdwcmVzcydcIj5cclxuICAgICAgICAgIDxpb24tZmFiLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiBjbG9zZUljb249XCJtaWMtb3V0bGluZVwiICh0b3VjaHN0YXJ0KT1cInZvaWNlU2Vydi50b2dnbGVSZWNvcmQoKVwiICAodG91Y2hlbmQpPVwidm9pY2VTZXJ2LmNhbmNlbFRhbGsoKVwiPlxyXG4gICAgICAgICAgICA8aW9uLWljb24gbmFtZT1cIm1pYy1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgICAgIDwvaW9uLWZhYi1idXR0b24+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICA8L2lvbi1mYWI+XHJcblxyXG5cclxuICAgIDwhLS0g6Z+z6aKR5rOi5YqoIC0tPlxyXG4gICAgPGRpdiBjbGFzcz1cInJlY29yZC13YXZlXCI+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy1jb250YWluZXI+XHJcbiJdfQ==
|
|
8
|
+
import{Component,Input}from"@angular/core";import{CommonModule}from"@angular/common";import{ToastController}from"@ionic/angular";import{Router,RouterModule}from"@angular/router";import{IonicModule,Platform}from"@ionic/angular";import{FmodeVoiceService}from"../../voice";import{FmodeChat,ChatService}from"../../service-fmai/service-chat";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{Diagnostic}from"@awesome-cordova-plugins/diagnostic/ngx";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular";import*as i2 from"@angular/router";import*as i3 from"../../../nova-cloud/nova-cloud.service";import*as i4 from"../../service-fmai/service-chat";import*as i5 from"@awesome-cordova-plugins/diagnostic/ngx";import*as i6 from"@angular/common";export class ModalChatVoiceInputComponent{constructor(t,o,e,n,i,a){this.platform=t,this.router=o,this.toastCtrl=e,this.ncloud=n,this.chatServ=i,this.diagnostic=a,this.talkMode="click",this.talkTips="点击话筒开始讲话",this.errorText="",this.player=new Audio,this.voiceServ=new FmodeVoiceService(this.platform,this.diagnostic)}ngOnInit(){"press"==this.talkMode&&(this.talkTips="轻触底部开始讲话"),setTimeout((()=>{this.initVoiceSevice(),this.initVoiceASR()}),500)}async initVoiceASR(){this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge(),this.startASRAwake()}))}async startASRAwake(){await this.voiceServ.openWithPriviledge()}playMusic(t){this.player.src=`/assets/avatar/voice/${t}.mp3`,this.player.play()}initVoiceSevice(){this.fmodeChat.userInput=this.voiceServ.resultText,this.voiceServ.requestPermission().then((()=>{this.voiceServ.openWithPriviledge()})),this.voiceServ.onBeforeStartTalk=()=>{this.fmodeChat.playAnimation("listening"),this.playMusic("start-talk")},this.voiceServ.onBeforeCancelTalk=()=>{this.playMusic("interupt-talk"),this.fmodeChat.playAnimation("waiting")},this.voiceServ.onAfterCancelTalk=()=>{this.startASRAwake()},this.voiceServ.onBeforeFinishTalk=()=>{this.fmodeChat.playAnimation("thinking"),this.playMusic("stop-talk")},this.voiceServ.onAfterFinishTalk=()=>{console.log("onAfterFinishTalk"),this.fmodeChat.userInput=this.voiceServ?.resultText,this.sendMessage(),this.startASRAwake()}}async sendMessage(){if(!this.fmodeChat.userInput){return this.errorText="内容不能为空",void(await this.toastCtrl.create({message:this.errorText,position:"top",icon:"alert",color:"warning-circle",duration:1e3})).present()}this.fmodeChat?.sendMessage(this.voiceServ.resultText,null,(t=>{}),{onSSMLComplete:t=>{console.log(t)}}),this.fmodeChat.userInput="",this.fmodeChat.userImage=""}testTTS(t){console.log(t),t=t||"你好呀,我是飞马小智!很高兴为您介绍脑控科技的发展历程。我们成立于2019年"}testXunfeiTTS(){}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,deps:[{token:i1.Platform},{token:i2.Router},{token:i1.ToastController},{token:i3.NovaCloudService},{token:i4.ChatService},{token:i5.Diagnostic}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:ModalChatVoiceInputComponent,isStandalone:!0,selector:"fm-modal-chat-voice-input",inputs:{fmodeChat:"fmodeChat",talkMode:"talkMode"},providers:[],ngImport:i0,template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n'],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:IonicModule},{kind:"component",type:i1.IonFab,selector:"ion-fab",inputs:["activated","edge","horizontal","vertical"]},{kind:"component",type:i1.IonFabButton,selector:"ion-fab-button",inputs:["activated","closeIcon","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","show","size","target","translucent","type"]},{kind:"component",type:i1.IonFabList,selector:"ion-fab-list",inputs:["activated","side"]},{kind:"component",type:i1.IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"ngmodule",type:RouterModule}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:ModalChatVoiceInputComponent,decorators:[{type:Component,args:[{selector:"fm-modal-chat-voice-input",standalone:!0,imports:[CommonModule,IonicModule,RouterModule],providers:[],template:' \n <ng-container *ngIf="fmodeChat">\n\n \x3c!-- 用户输入 提示区域 --\x3e\n <div class="user-asr-input" style="text-align: center;" *ngIf="!fmodeChat?.userInput && voiceServ.btnStatus!=\'OPEN\'">{{talkTips}}</div>\n <div class="user-asr-input">{{fmodeChat?.userInput}}</div>\n \n \x3c!-- 测试按钮 --\x3e\n <div class="test-button-group" *ngIf="false">\n <button class="button-record" (click)="voiceServ.toggleRecord()">开始录制 {{voiceServ.connStatus}} {{voiceServ.btnStatus}}</button>\n <br>\n <button class="button-record" (click)="voiceServ.playRecord()">播放录制结果</button>\n <br>\n <button class="button-record" (click)="voiceServ.playBuffers()">播放Buffers结果</button>\n <button (click)="testTTS()">测试TTS纯WEB</button>\n <button (click)="startASR()">测试ASR</button> \n <button (click)="testXunfeiTTS()">测试合成</button> \n </div>\n\n \n \n \x3c!-- 交互按钮 --\x3e\n <ion-fab slot="fixed" horizontal="center" vertical="bottom">\n <ng-container *ngIf="talkMode==\'click\'">\n \x3c!-- 默认按钮:开始讲话 --\x3e\n <ion-fab-button color="primary" closeIcon="checkmark" (click)="voiceServ.toggleRecord()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n\n \x3c!-- 讲话中:取消发送 --\x3e\n <ion-fab-list side="end">\n <ion-fab-button [class]="\'loading\'" (click)="voiceServ.cancelTalk()">\n <ion-icon name="pause-outline"></ion-icon>\n </ion-fab-button>\n </ion-fab-list>\n </ng-container>\n \n <ng-container *ngIf="talkMode==\'press\'">\n <ion-fab-button color="primary" closeIcon="mic-outline" (touchstart)="voiceServ.toggleRecord()" (touchend)="voiceServ.cancelTalk()">\n <ion-icon name="mic-outline"></ion-icon>\n </ion-fab-button>\n </ng-container>\n </ion-fab>\n\n\n \x3c!-- 音频波动 --\x3e\n <div class="record-wave">\n </div>\n</ng-container>\n',styles:['ion-fab{margin-bottom:10vh}.fab-button-close-active:before{content:"";position:absolute;top:-5px;left:-5px;width:66px;height:66px;border-radius:50%;border:5px solid #fff;border-top-color:transparent;animation:spin 2s ease-in-out infinite;animation-fill-mode:both;animation-play-state:running}.record-wave{position:fixed;bottom:0;width:100vw;height:6vh}\n']}]}],ctorParameters:()=>[{type:i1.Platform},{type:i2.Router},{type:i1.ToastController},{type:i3.NovaCloudService},{type:i4.ChatService},{type:i5.Diagnostic}],propDecorators:{fmodeChat:[{type:Input}],talkMode:[{type:Input}]}});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2F2YXRhci9tb2RhbC1jaGF0LXZvaWNlLWlucHV0L21vZGFsLWNoYXQtdm9pY2UtaW5wdXQuY29tcG9uZW50Lm1qcw==`
|
|
10
|
+
|
|
@@ -1,49 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { chevronBackOutline, ellipsisHorizontalOutline } from 'ionicons/icons';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import * as i2 from "@angular/common";
|
|
12
|
-
addIcons({ chevronBackOutline, ellipsisHorizontalOutline });
|
|
13
|
-
export class FmChatHeaderArea {
|
|
14
|
-
constructor(navCtrl) {
|
|
15
|
-
this.navCtrl = navCtrl;
|
|
16
|
-
this.isModalOpen = false;
|
|
17
|
-
this.goBack = () => {
|
|
18
|
-
this.navCtrl.back();
|
|
19
|
-
};
|
|
20
|
-
}
|
|
21
|
-
async back() {
|
|
22
|
-
if (this.chat?.onClose) {
|
|
23
|
-
let closeResult = await this.chat?.onClose(this.chat);
|
|
24
|
-
if (!closeResult)
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
this.goBack();
|
|
28
|
-
}
|
|
29
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmChatHeaderArea, deps: [{ token: i1.NavController }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
30
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FmChatHeaderArea, isStandalone: true, selector: "fm-chat-header-area", inputs: { chat: "chat", goBack: "goBack" }, ngImport: i0, template: "<ion-toolbar *ngIf=\"chat?.isAvatarShow==false\">\r\n <ion-buttons slot=\"start\">\r\n <ion-button (click)=\"back()\">\r\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\r\n </ion-button>\r\n </ion-buttons>\r\n <ion-title>\r\n <div class=\"title-avatar-area\">\r\n <div class=\"avatar-img\" (click)=\"chat.showAvatar()\">\r\n <img *ngIf=\"chat?.role?.get('avatar')||chat?.role?.get('thumb')\" [src]=\"chat?.role?.get('avatar')||chat?.role?.get('thumb')\" />\r\n <ion-icon *ngIf=\"chat?.role?.get('avatarConfig')\" name=\"resize-outline\"></ion-icon>\r\n </div>\r\n <span (click)=\"chat.showAvatar()\">\r\n {{chat?.role?.get(\"name\")}}\r\n </span>\r\n </div>\r\n </ion-title>\r\n\r\n <ion-buttons slot=\"end\">\r\n <ion-button (click)=\"isModalOpen=true\"> <ion-icon name=\"ellipsis-horizontal-outline\"></ion-icon> </ion-button>\r\n </ion-buttons>\r\n</ion-toolbar>\r\n\r\n<div class=\"avatar-area\" *ngIf=\"chat?.isAvatarShow==true\">\r\n <fm-avatar-role-image *ngIf=\"chat?.avatarMode=='image'\" [fmodeChat]=\"chat\" [role]=\"avatarRole\"></fm-avatar-role-image>\r\n <fm-avatar-role-video [goBack]=\"goBack\" *ngIf=\"chat?.avatarMode=='video'\" [fmodeChat]=\"chat\" [role]=\"avatarRole\"></fm-avatar-role-video>\r\n</div>\r\n\r\n\r\n<ion-modal [isOpen]=\"isModalOpen\" (willDismiss)=\"isModalOpen=false\">\r\n <ng-template>\r\n <ion-header>\r\n <ion-toolbar>\r\n <ion-buttons slot=\"start\">\r\n <ion-button (click)=\"isModalOpen=false\">\u8FD4\u56DE</ion-button>\r\n </ion-buttons>\r\n <ion-title>\u7B80\u4ECB</ion-title>\r\n </ion-toolbar>\r\n </ion-header>\r\n <ion-content class=\"ion-padding\">\r\n\r\n <ion-card style=\"margin: 0px;\">\r\n <img style=\"width:100%\" [src]=\"chat?.role?.get('thumb')\" alt=\"\">\r\n <ion-card-header>\r\n <ion-card-subtitle>{{chat?.role?.get('tags')}}</ion-card-subtitle>\r\n <ion-card-title>{{chat?.role?.get(\"name\")}}</ion-card-title>\r\n </ion-card-header>\r\n \r\n <ion-card-content>\r\n {{chat?.role?.get(\"desc\")}}\r\n \r\n <ion-list [inset]=\"true\" style=\"margin:0px;\">\r\n <!-- <ion-item>\r\n <ion-avatar *ngIf=\"chat?.role?.get('thumb')\" aria-hidden=\"true\" slot=\"start\">\r\n <img [src]=\"chat?.role?.get('thumb')\" />\r\n </ion-avatar>\r\n <ion-label>{{chat?.role?.get(\"name\")}}</ion-label>\r\n </ion-item> -->\r\n <ion-item lines=\"none\" *ngIf=\"chat?.role?.get('age')\">\r\n <ion-note slot=\"start\">\u5E74\u9F84</ion-note>\r\n <ion-label>{{chat?.role?.get(\"age\")}}</ion-label>\r\n </ion-item>\r\n <ion-item lines=\"none\" *ngIf=\"chat?.role?.get('gender')\">\r\n <ion-note slot=\"start\">\u6027\u522B</ion-note>\r\n <ion-label>{{chat?.role?.get(\"gender\")}}</ion-label>\r\n </ion-item>\r\n <ion-item lines=\"none\">\r\n <ion-note slot=\"start\">\u79F0\u53F7</ion-note>\r\n <ion-label>{{chat?.role?.get(\"title\")}}</ion-label>\r\n </ion-item>\r\n \r\n <ion-item lines=\"none\">\r\n <ion-note slot=\"start\">\u64C5\u957F</ion-note>\r\n <ion-label>{{chat?.role?.get(\"tags\")?.join(',')}}</ion-label>\r\n </ion-item>\r\n \r\n </ion-list>\r\n </ion-card-content>\r\n </ion-card>\r\n </ion-content>\r\n </ng-template>\r\n </ion-modal>", styles: [".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonModal, selector: "ion-modal" }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonList, selector: "ion-list", inputs: ["inset", "lines", "mode"] }, { kind: "component", type: IonItem, selector: "ion-item", inputs: ["button", "color", "detail", "detailIcon", "disabled", "download", "href", "lines", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonCard, selector: "ion-card", inputs: ["button", "color", "disabled", "download", "href", "mode", "rel", "routerAnimation", "routerDirection", "target", "type"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonNote, selector: "ion-note", inputs: ["color", "mode"] }, { kind: "component", type:
|
|
31
|
-
//
|
|
32
|
-
CompAvatarRoleImageComponent, selector: "fm-avatar-role-image", inputs: ["fmodeChat", "role"] }, { kind: "component", type: CompAvatarRoleVideoComponent, selector: "fm-avatar-role-video", inputs: ["fmodeChat", "role", "goBack"], outputs: ["onClose"] }] }); }
|
|
33
|
-
}
|
|
34
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmChatHeaderArea, decorators: [{
|
|
35
|
-
type: Component,
|
|
36
|
-
args: [{ selector: 'fm-chat-header-area', standalone: true, imports: [
|
|
37
|
-
CommonModule, IonToolbar, IonButtons, IonButton, IonIcon,
|
|
38
|
-
IonModal, IonAvatar,
|
|
39
|
-
IonTitle, IonHeader, IonList, IonItem, IonCard, IonLabel, IonNote,
|
|
40
|
-
//
|
|
41
|
-
CompAvatarRoleImageComponent,
|
|
42
|
-
CompAvatarRoleVideoComponent
|
|
43
|
-
], template: "<ion-toolbar *ngIf=\"chat?.isAvatarShow==false\">\r\n <ion-buttons slot=\"start\">\r\n <ion-button (click)=\"back()\">\r\n <ion-icon name=\"chevron-back-outline\"></ion-icon>\r\n </ion-button>\r\n </ion-buttons>\r\n <ion-title>\r\n <div class=\"title-avatar-area\">\r\n <div class=\"avatar-img\" (click)=\"chat.showAvatar()\">\r\n <img *ngIf=\"chat?.role?.get('avatar')||chat?.role?.get('thumb')\" [src]=\"chat?.role?.get('avatar')||chat?.role?.get('thumb')\" />\r\n <ion-icon *ngIf=\"chat?.role?.get('avatarConfig')\" name=\"resize-outline\"></ion-icon>\r\n </div>\r\n <span (click)=\"chat.showAvatar()\">\r\n {{chat?.role?.get(\"name\")}}\r\n </span>\r\n </div>\r\n </ion-title>\r\n\r\n <ion-buttons slot=\"end\">\r\n <ion-button (click)=\"isModalOpen=true\"> <ion-icon name=\"ellipsis-horizontal-outline\"></ion-icon> </ion-button>\r\n </ion-buttons>\r\n</ion-toolbar>\r\n\r\n<div class=\"avatar-area\" *ngIf=\"chat?.isAvatarShow==true\">\r\n <fm-avatar-role-image *ngIf=\"chat?.avatarMode=='image'\" [fmodeChat]=\"chat\" [role]=\"avatarRole\"></fm-avatar-role-image>\r\n <fm-avatar-role-video [goBack]=\"goBack\" *ngIf=\"chat?.avatarMode=='video'\" [fmodeChat]=\"chat\" [role]=\"avatarRole\"></fm-avatar-role-video>\r\n</div>\r\n\r\n\r\n<ion-modal [isOpen]=\"isModalOpen\" (willDismiss)=\"isModalOpen=false\">\r\n <ng-template>\r\n <ion-header>\r\n <ion-toolbar>\r\n <ion-buttons slot=\"start\">\r\n <ion-button (click)=\"isModalOpen=false\">\u8FD4\u56DE</ion-button>\r\n </ion-buttons>\r\n <ion-title>\u7B80\u4ECB</ion-title>\r\n </ion-toolbar>\r\n </ion-header>\r\n <ion-content class=\"ion-padding\">\r\n\r\n <ion-card style=\"margin: 0px;\">\r\n <img style=\"width:100%\" [src]=\"chat?.role?.get('thumb')\" alt=\"\">\r\n <ion-card-header>\r\n <ion-card-subtitle>{{chat?.role?.get('tags')}}</ion-card-subtitle>\r\n <ion-card-title>{{chat?.role?.get(\"name\")}}</ion-card-title>\r\n </ion-card-header>\r\n \r\n <ion-card-content>\r\n {{chat?.role?.get(\"desc\")}}\r\n \r\n <ion-list [inset]=\"true\" style=\"margin:0px;\">\r\n <!-- <ion-item>\r\n <ion-avatar *ngIf=\"chat?.role?.get('thumb')\" aria-hidden=\"true\" slot=\"start\">\r\n <img [src]=\"chat?.role?.get('thumb')\" />\r\n </ion-avatar>\r\n <ion-label>{{chat?.role?.get(\"name\")}}</ion-label>\r\n </ion-item> -->\r\n <ion-item lines=\"none\" *ngIf=\"chat?.role?.get('age')\">\r\n <ion-note slot=\"start\">\u5E74\u9F84</ion-note>\r\n <ion-label>{{chat?.role?.get(\"age\")}}</ion-label>\r\n </ion-item>\r\n <ion-item lines=\"none\" *ngIf=\"chat?.role?.get('gender')\">\r\n <ion-note slot=\"start\">\u6027\u522B</ion-note>\r\n <ion-label>{{chat?.role?.get(\"gender\")}}</ion-label>\r\n </ion-item>\r\n <ion-item lines=\"none\">\r\n <ion-note slot=\"start\">\u79F0\u53F7</ion-note>\r\n <ion-label>{{chat?.role?.get(\"title\")}}</ion-label>\r\n </ion-item>\r\n \r\n <ion-item lines=\"none\">\r\n <ion-note slot=\"start\">\u64C5\u957F</ion-note>\r\n <ion-label>{{chat?.role?.get(\"tags\")?.join(',')}}</ion-label>\r\n </ion-item>\r\n \r\n </ion-list>\r\n </ion-card-content>\r\n </ion-card>\r\n </ion-content>\r\n </ng-template>\r\n </ion-modal>", styles: [".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"] }]
|
|
44
|
-
}], ctorParameters: () => [{ type: i1.NavController }], propDecorators: { chat: [{
|
|
45
|
-
type: Input
|
|
46
|
-
}], goBack: [{
|
|
47
|
-
type: Input
|
|
48
|
-
}] } });
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcC1oZWFkZXItYXJlYS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2MvY2hhdC9jaGF0LWhlYWRlci1hcmVhL2NvbXAtaGVhZGVyLWFyZWEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZm1vZGUtbmcvc3JjL2xpYi9haWdjL2NoYXQvY2hhdC1oZWFkZXItYXJlYS9jb21wLWhlYWRlci1hcmVhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzdMLE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRTVELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDcEMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLHlCQUF5QixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7Ozs7QUFDNUUsUUFBUSxDQUFDLEVBQUMsa0JBQWtCLEVBQUMseUJBQXlCLEVBQUMsQ0FBQyxDQUFBO0FBaUJ4RCxNQUFNLE9BQU8sZ0JBQWdCO0lBSTNCLFlBQ1UsT0FBcUI7UUFBckIsWUFBTyxHQUFQLE9BQU8sQ0FBYztRQUgvQixnQkFBVyxHQUFXLEtBQUssQ0FBQTtRQWUzQixXQUFNLEdBQUcsR0FBRSxFQUFFO1lBQ1gsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUN0QixDQUFDLENBQUE7SUFiQyxDQUFDO0lBRUgsS0FBSyxDQUFDLElBQUk7UUFDUixJQUFHLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFDLENBQUM7WUFDckIsSUFBSSxXQUFXLEdBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDdEQsSUFBRyxDQUFDLFdBQVc7Z0JBQUUsT0FBTTtRQUN6QixDQUFDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7K0dBZFUsZ0JBQWdCO21HQUFoQixnQkFBZ0IsMkhDMUI3Qiwrd0hBaUZjLDJiRC9EVixZQUFZLG1JQUFDLFVBQVUsbUZBQUMsVUFBVSw4RUFBQyxTQUFTLG9QQUFDLE9BQU8sMkpBQ3BELFFBQVEsc0RBQ1IsUUFBUSxpRkFBQyxTQUFTLG9HQUFDLE9BQU8seUZBQUMsT0FBTywwTkFBQyxPQUFPLHlMQUFDLFFBQVEsNkZBQUMsT0FBTztnQkFDM0QsR0FBRztnQkFDSCw0QkFBNEIsZ0dBQzVCLDRCQUE0Qjs7NEZBR25CLGdCQUFnQjtrQkFkNUIsU0FBUzsrQkFDRSxxQkFBcUIsY0FHcEIsSUFBSSxXQUNQO3dCQUNOLFlBQVksRUFBQyxVQUFVLEVBQUMsVUFBVSxFQUFDLFNBQVMsRUFBQyxPQUFPO3dCQUNwRCxRQUFRLEVBQUMsU0FBUzt3QkFDbEIsUUFBUSxFQUFDLFNBQVMsRUFBQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxRQUFRLEVBQUMsT0FBTzt3QkFDM0QsR0FBRzt3QkFDSCw0QkFBNEI7d0JBQzVCLDRCQUE0QjtxQkFDN0I7a0ZBR1EsSUFBSTtzQkFBWixLQUFLO2dCQWdCTixNQUFNO3NCQURMLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IElvbkJ1dHRvbnMsIElvbkNhcmQsIElvbkhlYWRlciwgSW9uSWNvbixJb25CdXR0b24sIElvbkl0ZW0sIElvbkxhYmVsLCBJb25MaXN0LCBJb25Ob3RlLCBJb25UaXRsZSwgSW9uVG9vbGJhciwgSW9uTW9kYWwsIE5hdkNvbnRyb2xsZXIsIElvbkF2YXRhciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xyXG5pbXBvcnQgeyBDb21wQXZhdGFyUm9sZUltYWdlQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vYXZhdGFyJztcclxuaW1wb3J0IHsgQ29tcEF2YXRhclJvbGVWaWRlb0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F2YXRhcic7XHJcbmltcG9ydCB7IEZtb2RlQ2hhdCB9IGZyb20gJy4uLy4uL3NlcnZpY2UtZm1haS9zZXJ2aWNlLWNoYXQnO1xyXG5cclxuaW1wb3J0IHsgYWRkSWNvbnMgfSBmcm9tICdpb25pY29ucyc7XHJcbmltcG9ydCB7Y2hldnJvbkJhY2tPdXRsaW5lLGVsbGlwc2lzSG9yaXpvbnRhbE91dGxpbmV9IGZyb20gJ2lvbmljb25zL2ljb25zJztcclxuYWRkSWNvbnMoe2NoZXZyb25CYWNrT3V0bGluZSxlbGxpcHNpc0hvcml6b250YWxPdXRsaW5lfSlcclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZtLWNoYXQtaGVhZGVyLWFyZWEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9jb21wLWhlYWRlci1hcmVhLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb21wLWhlYWRlci1hcmVhLmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTp0cnVlLFxyXG4gIGltcG9ydHM6W1xyXG4gICAgQ29tbW9uTW9kdWxlLElvblRvb2xiYXIsSW9uQnV0dG9ucyxJb25CdXR0b24sSW9uSWNvbixcclxuICAgIElvbk1vZGFsLElvbkF2YXRhcixcclxuICAgIElvblRpdGxlLElvbkhlYWRlcixJb25MaXN0LElvbkl0ZW0sSW9uQ2FyZCxJb25MYWJlbCxJb25Ob3RlLFxyXG4gICAgLy8gXHJcbiAgICBDb21wQXZhdGFyUm9sZUltYWdlQ29tcG9uZW50LFxyXG4gICAgQ29tcEF2YXRhclJvbGVWaWRlb0NvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZtQ2hhdEhlYWRlckFyZWEge1xyXG4gIEBJbnB1dCgpIGNoYXQ6Rm1vZGVDaGF0XHJcbiAgaXNNb2RhbE9wZW46Ym9vbGVhbiA9IGZhbHNlXHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBuYXZDdHJsOk5hdkNvbnRyb2xsZXJcclxuICApe31cclxuXHJcbiAgYXN5bmMgYmFjaygpe1xyXG4gICAgaWYodGhpcy5jaGF0Py5vbkNsb3NlKXtcclxuICAgICAgbGV0IGNsb3NlUmVzdWx0ID0gIGF3YWl0IHRoaXMuY2hhdD8ub25DbG9zZSh0aGlzLmNoYXQpXHJcbiAgICAgIGlmKCFjbG9zZVJlc3VsdCkgcmV0dXJuXHJcbiAgICB9XHJcbiAgICB0aGlzLmdvQmFjaygpO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KClcclxuICBnb0JhY2sgPSAoKT0+e1xyXG4gICAgdGhpcy5uYXZDdHJsLmJhY2soKTtcclxuICB9XHJcbn0gXHJcbiIsIjxpb24tdG9vbGJhciAqbmdJZj1cImNoYXQ/LmlzQXZhdGFyU2hvdz09ZmFsc2VcIj5cclxuICAgIDxpb24tYnV0dG9ucyBzbG90PVwic3RhcnRcIj5cclxuICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgICAgICAgIDxpb24taWNvbiBuYW1lPVwiY2hldnJvbi1iYWNrLW91dGxpbmVcIj48L2lvbi1pY29uPlxyXG4gICAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgICAgPC9pb24tYnV0dG9ucz5cclxuICAgIDxpb24tdGl0bGU+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1hdmF0YXItYXJlYVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdmF0YXItaW1nXCIgKGNsaWNrKT1cImNoYXQuc2hvd0F2YXRhcigpXCI+XHJcbiAgICAgICAgICA8aW1nICpuZ0lmPVwiY2hhdD8ucm9sZT8uZ2V0KCdhdmF0YXInKXx8Y2hhdD8ucm9sZT8uZ2V0KCd0aHVtYicpXCIgW3NyY109XCJjaGF0Py5yb2xlPy5nZXQoJ2F2YXRhcicpfHxjaGF0Py5yb2xlPy5nZXQoJ3RodW1iJylcIiAvPlxyXG4gICAgICAgICAgPGlvbi1pY29uICpuZ0lmPVwiY2hhdD8ucm9sZT8uZ2V0KCdhdmF0YXJDb25maWcnKVwiIG5hbWU9XCJyZXNpemUtb3V0bGluZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPHNwYW4gKGNsaWNrKT1cImNoYXQuc2hvd0F2YXRhcigpXCI+XHJcbiAgICAgICAgICB7e2NoYXQ/LnJvbGU/LmdldChcIm5hbWVcIil9fVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2lvbi10aXRsZT5cclxuXHJcbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxyXG4gICAgICAgIDxpb24tYnV0dG9uIChjbGljayk9XCJpc01vZGFsT3Blbj10cnVlXCI+IDxpb24taWNvbiBuYW1lPVwiZWxsaXBzaXMtaG9yaXpvbnRhbC1vdXRsaW5lXCI+PC9pb24taWNvbj4gPC9pb24tYnV0dG9uPlxyXG4gICAgPC9pb24tYnV0dG9ucz5cclxuPC9pb24tdG9vbGJhcj5cclxuXHJcbjxkaXYgY2xhc3M9XCJhdmF0YXItYXJlYVwiICpuZ0lmPVwiY2hhdD8uaXNBdmF0YXJTaG93PT10cnVlXCI+XHJcbiAgPGZtLWF2YXRhci1yb2xlLWltYWdlICpuZ0lmPVwiY2hhdD8uYXZhdGFyTW9kZT09J2ltYWdlJ1wiIFtmbW9kZUNoYXRdPVwiY2hhdFwiIFtyb2xlXT1cImF2YXRhclJvbGVcIj48L2ZtLWF2YXRhci1yb2xlLWltYWdlPlxyXG4gIDxmbS1hdmF0YXItcm9sZS12aWRlbyBbZ29CYWNrXT1cImdvQmFja1wiICpuZ0lmPVwiY2hhdD8uYXZhdGFyTW9kZT09J3ZpZGVvJ1wiIFtmbW9kZUNoYXRdPVwiY2hhdFwiIFtyb2xlXT1cImF2YXRhclJvbGVcIj48L2ZtLWF2YXRhci1yb2xlLXZpZGVvPlxyXG48L2Rpdj5cclxuXHJcblxyXG48aW9uLW1vZGFsIFtpc09wZW5dPVwiaXNNb2RhbE9wZW5cIiAod2lsbERpc21pc3MpPVwiaXNNb2RhbE9wZW49ZmFsc2VcIj5cclxuICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgPGlvbi1oZWFkZXI+XHJcbiAgICAgICAgPGlvbi10b29sYmFyPlxyXG4gICAgICAgICAgPGlvbi1idXR0b25zIHNsb3Q9XCJzdGFydFwiPlxyXG4gICAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiaXNNb2RhbE9wZW49ZmFsc2VcIj7ov5Tlm548L2lvbi1idXR0b24+XHJcbiAgICAgICAgICA8L2lvbi1idXR0b25zPlxyXG4gICAgICAgICAgPGlvbi10aXRsZT7nroDku4s8L2lvbi10aXRsZT5cclxuICAgICAgICA8L2lvbi10b29sYmFyPlxyXG4gICAgICA8L2lvbi1oZWFkZXI+XHJcbiAgICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XHJcblxyXG4gICAgICAgIDxpb24tY2FyZCBzdHlsZT1cIm1hcmdpbjogMHB4O1wiPlxyXG4gICAgICAgICAgPGltZyBzdHlsZT1cIndpZHRoOjEwMCVcIiBbc3JjXT1cImNoYXQ/LnJvbGU/LmdldCgndGh1bWInKVwiIGFsdD1cIlwiPlxyXG4gICAgICAgICAgPGlvbi1jYXJkLWhlYWRlcj5cclxuICAgICAgICAgICAgPGlvbi1jYXJkLXN1YnRpdGxlPnt7Y2hhdD8ucm9sZT8uZ2V0KCd0YWdzJyl9fTwvaW9uLWNhcmQtc3VidGl0bGU+XHJcbiAgICAgICAgICAgIDxpb24tY2FyZC10aXRsZT57e2NoYXQ/LnJvbGU/LmdldChcIm5hbWVcIil9fTwvaW9uLWNhcmQtdGl0bGU+XHJcbiAgICAgICAgICA8L2lvbi1jYXJkLWhlYWRlcj5cclxuICAgICAgICBcclxuICAgICAgICAgIDxpb24tY2FyZC1jb250ZW50PlxyXG4gICAgICAgICAgICB7e2NoYXQ/LnJvbGU/LmdldChcImRlc2NcIil9fVxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICA8aW9uLWxpc3QgW2luc2V0XT1cInRydWVcIiBzdHlsZT1cIm1hcmdpbjowcHg7XCI+XHJcbiAgICAgICAgICAgICAgICAgIDwhLS0gPGlvbi1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24tYXZhdGFyICpuZ0lmPVwiY2hhdD8ucm9sZT8uZ2V0KCd0aHVtYicpXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgc2xvdD1cInN0YXJ0XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY2hhdD8ucm9sZT8uZ2V0KCd0aHVtYicpXCIgLz5cclxuICAgICAgICAgICAgICAgICAgICA8L2lvbi1hdmF0YXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD57e2NoYXQ/LnJvbGU/LmdldChcIm5hbWVcIil9fTwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPiAtLT5cclxuICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiICpuZ0lmPVwiY2hhdD8ucm9sZT8uZ2V0KCdhZ2UnKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24tbm90ZSBzbG90PVwic3RhcnRcIj7lubTpvoQ8L2lvbi1ub3RlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+e3tjaGF0Py5yb2xlPy5nZXQoXCJhZ2VcIil9fTwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWl0ZW0gbGluZXM9XCJub25lXCIgKm5nSWY9XCJjaGF0Py5yb2xlPy5nZXQoJ2dlbmRlcicpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1ub3RlIHNsb3Q9XCJzdGFydFwiPuaAp+WIqzwvaW9uLW5vdGU+XHJcbiAgICAgICAgICAgICAgICAgICAgPGlvbi1sYWJlbD57e2NoYXQ/LnJvbGU/LmdldChcImdlbmRlclwiKX19PC9pb24tbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgIDwvaW9uLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICAgIDxpb24taXRlbSBsaW5lcz1cIm5vbmVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aW9uLW5vdGUgc2xvdD1cInN0YXJ0XCI+56ew5Y+3PC9pb24tbm90ZT5cclxuICAgICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPnt7Y2hhdD8ucm9sZT8uZ2V0KFwidGl0bGVcIil9fTwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24tbm90ZSBzbG90PVwic3RhcnRcIj7mk4Xplb88L2lvbi1ub3RlPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpb24tbGFiZWw+e3tjaGF0Py5yb2xlPy5nZXQoXCJ0YWdzXCIpPy5qb2luKCcsJyl9fTwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxyXG4gICAgXHJcbiAgICAgICAgICAgICAgICA8L2lvbi1saXN0PlxyXG4gICAgICAgICAgICAgIDwvaW9uLWNhcmQtY29udGVudD5cclxuICAgICAgICA8L2lvbi1jYXJkPlxyXG4gICAgICA8L2lvbi1jb250ZW50PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2lvbi1tb2RhbD4iXX0=
|
|
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/chat/chat-header-area/comp-header-area.component.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{CommonModule}from"@angular/common";import{Component,Input}from"@angular/core";import{IonButtons,IonCard,IonHeader,IonIcon,IonButton,IonItem,IonLabel,IonList,IonNote,IonTitle,IonToolbar,IonModal,NavController,IonAvatar}from"@ionic/angular/standalone";import{CompAvatarRoleImageComponent}from"../../avatar";import{CompAvatarRoleVideoComponent}from"../../avatar";import{FmodeChat}from"../../service-fmai/service-chat";import{addIcons}from"ionicons";import{chevronBackOutline,ellipsisHorizontalOutline}from"ionicons/icons";import*as i0 from"@angular/core";import*as i1 from"@ionic/angular/standalone";import*as i2 from"@angular/common";addIcons({chevronBackOutline:chevronBackOutline,ellipsisHorizontalOutline:ellipsisHorizontalOutline});export class FmChatHeaderArea{constructor(n){this.navCtrl=n,this.isModalOpen=!1,this.goBack=()=>{this.navCtrl.back()}}async back(){if(this.chat?.onClose){if(!await(this.chat?.onClose(this.chat)))return}this.goBack()}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,deps:[{token:i1.NavController}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:FmChatHeaderArea,isStandalone:!0,selector:"fm-chat-header-area",inputs:{chat:"chat",goBack:"goBack"},ngImport:i0,template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video [goBack]="goBack" *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img style="width:100%" [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i2.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonModal,selector:"ion-modal"},{kind:"component",type:IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:IonList,selector:"ion-list",inputs:["inset","lines","mode"]},{kind:"component",type:IonItem,selector:"ion-item",inputs:["button","color","detail","detailIcon","disabled","download","href","lines","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonCard,selector:"ion-card",inputs:["button","color","disabled","download","href","mode","rel","routerAnimation","routerDirection","target","type"]},{kind:"component",type:IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:IonNote,selector:"ion-note",inputs:["color","mode"]},{kind:"component",type:CompAvatarRoleImageComponent,selector:"fm-avatar-role-image",inputs:["fmodeChat","role"]},{kind:"component",type:CompAvatarRoleVideoComponent,selector:"fm-avatar-role-video",inputs:["fmodeChat","role","goBack"],outputs:["onClose"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmChatHeaderArea,decorators:[{type:Component,args:[{selector:"fm-chat-header-area",standalone:!0,imports:[CommonModule,IonToolbar,IonButtons,IonButton,IonIcon,IonModal,IonAvatar,IonTitle,IonHeader,IonList,IonItem,IonCard,IonLabel,IonNote,CompAvatarRoleImageComponent,CompAvatarRoleVideoComponent],template:'<ion-toolbar *ngIf="chat?.isAvatarShow==false">\n <ion-buttons slot="start">\n <ion-button (click)="back()">\n <ion-icon name="chevron-back-outline"></ion-icon>\n </ion-button>\n </ion-buttons>\n <ion-title>\n <div class="title-avatar-area">\n <div class="avatar-img" (click)="chat.showAvatar()">\n <img *ngIf="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" [src]="chat?.role?.get(\'avatar\')||chat?.role?.get(\'thumb\')" />\n <ion-icon *ngIf="chat?.role?.get(\'avatarConfig\')" name="resize-outline"></ion-icon>\n </div>\n <span (click)="chat.showAvatar()">\n {{chat?.role?.get("name")}}\n </span>\n </div>\n </ion-title>\n\n <ion-buttons slot="end">\n <ion-button (click)="isModalOpen=true"> <ion-icon name="ellipsis-horizontal-outline"></ion-icon> </ion-button>\n </ion-buttons>\n</ion-toolbar>\n\n<div class="avatar-area" *ngIf="chat?.isAvatarShow==true">\n <fm-avatar-role-image *ngIf="chat?.avatarMode==\'image\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-image>\n <fm-avatar-role-video [goBack]="goBack" *ngIf="chat?.avatarMode==\'video\'" [fmodeChat]="chat" [role]="avatarRole"></fm-avatar-role-video>\n</div>\n\n\n<ion-modal [isOpen]="isModalOpen" (willDismiss)="isModalOpen=false">\n <ng-template>\n <ion-header>\n <ion-toolbar>\n <ion-buttons slot="start">\n <ion-button (click)="isModalOpen=false">返回</ion-button>\n </ion-buttons>\n <ion-title>简介</ion-title>\n </ion-toolbar>\n </ion-header>\n <ion-content class="ion-padding">\n\n <ion-card style="margin: 0px;">\n <img style="width:100%" [src]="chat?.role?.get(\'thumb\')" alt="">\n <ion-card-header>\n <ion-card-subtitle>{{chat?.role?.get(\'tags\')}}</ion-card-subtitle>\n <ion-card-title>{{chat?.role?.get("name")}}</ion-card-title>\n </ion-card-header>\n \n <ion-card-content>\n {{chat?.role?.get("desc")}}\n \n <ion-list [inset]="true" style="margin:0px;">\n \x3c!-- <ion-item>\n <ion-avatar *ngIf="chat?.role?.get(\'thumb\')" aria-hidden="true" slot="start">\n <img [src]="chat?.role?.get(\'thumb\')" />\n </ion-avatar>\n <ion-label>{{chat?.role?.get("name")}}</ion-label>\n </ion-item> --\x3e\n <ion-item lines="none" *ngIf="chat?.role?.get(\'age\')">\n <ion-note slot="start">年龄</ion-note>\n <ion-label>{{chat?.role?.get("age")}}</ion-label>\n </ion-item>\n <ion-item lines="none" *ngIf="chat?.role?.get(\'gender\')">\n <ion-note slot="start">性别</ion-note>\n <ion-label>{{chat?.role?.get("gender")}}</ion-label>\n </ion-item>\n <ion-item lines="none">\n <ion-note slot="start">称号</ion-note>\n <ion-label>{{chat?.role?.get("title")}}</ion-label>\n </ion-item>\n \n <ion-item lines="none">\n <ion-note slot="start">擅长</ion-note>\n <ion-label>{{chat?.role?.get("tags")?.join(\',\')}}</ion-label>\n </ion-item>\n \n </ion-list>\n </ion-card-content>\n </ion-card>\n </ion-content>\n </ng-template>\n </ion-modal>',styles:[".title-avatar-area{width:100%;height:100%;display:flex;justify-content:center;align-items:center}.title-avatar-area .avatar-img img{width:32px;height:32px;border-radius:50%;margin-right:5px}.title-avatar-area .avatar-img ion-icon{background:#df76dfcc;border-radius:50%;padding:3px;position:absolute;color:#000;margin-left:-20px;font-size:10px;margin-top:18px}.avatar-area{height:100%}\n"]}]}],ctorParameters:()=>[{type:i1.NavController}],propDecorators:{chat:[{type:Input}],goBack:[{type:Input}]}});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1oZWFkZXItYXJlYS9jb21wLWhlYWRlci1hcmVhLmNvbXBvbmVudC5tanM=`
|
|
10
|
+
|
|
@@ -1,2 +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/chat/chat-header-area/index.mjs
|
|
7
|
+
*/
|
|
8
|
+
export*from"./comp-header-area.component";
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL2NoYXQvY2hhdC1oZWFkZXItYXJlYS9pbmRleC5tanM=`
|
|
10
|
+
|