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,345 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { MatDialog, MatDialogModule, MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import { MatProgressBarModule } from '@angular/material/progress-bar';
|
|
12
|
-
import { FmStoryCardComponent } from '../fm-story-card/fm-story-card.component';
|
|
13
|
-
import Parse from "parse";
|
|
14
|
-
import { AgentStory } from '../../../core';
|
|
15
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
16
|
-
import { LoadingController } from '@ionic/angular';
|
|
17
|
-
import { StoryService } from '../story.service';
|
|
18
|
-
import { AlertController, IonAvatar, IonChip, IonContent, IonIcon, IonItem, IonItemDivider, IonItemGroup, IonLabel, IonPopover, ModalController, NavController } from '@ionic/angular/standalone';
|
|
19
|
-
import { MatToolbarModule } from '@angular/material/toolbar';
|
|
20
|
-
import { MatChipListbox, MatChipsModule } from '@angular/material/chips';
|
|
21
|
-
import { avatarIcon } from '../../../icon/filetype';
|
|
22
|
-
import { previewStoryMobile } from "./story-preview";
|
|
23
|
-
import { addIcons } from 'ionicons';
|
|
24
|
-
import * as icons from 'ionicons/icons';
|
|
25
|
-
import { ChatService } from '../../service-fmai/service-chat/chat.service';
|
|
26
|
-
import { NovaCloudService } from '../../../nova-cloud/nova-cloud.service';
|
|
27
|
-
import { NovaUploadService } from '../../../storage/service-upload/nova-upload.service';
|
|
28
|
-
import * as i0 from "@angular/core";
|
|
29
|
-
import * as i1 from "@angular/router";
|
|
30
|
-
import * as i2 from "@ionic/angular";
|
|
31
|
-
import * as i3 from "@angular/material/dialog";
|
|
32
|
-
import * as i4 from "../story.service";
|
|
33
|
-
import * as i5 from "../../service-fmai/service-chat/chat.service";
|
|
34
|
-
import * as i6 from "@ionic/angular/standalone";
|
|
35
|
-
import * as i7 from "../../../nova-cloud/nova-cloud.service";
|
|
36
|
-
import * as i8 from "../../../storage/service-upload/nova-upload.service";
|
|
37
|
-
import * as i9 from "@angular/common";
|
|
38
|
-
import * as i10 from "@angular/material/chips";
|
|
39
|
-
import * as i11 from "@angular/material/button-toggle";
|
|
40
|
-
import * as i12 from "@angular/material/button";
|
|
41
|
-
import * as i13 from "@angular/material/icon";
|
|
42
|
-
addIcons(icons);
|
|
43
|
-
export class FmStoryListComponent {
|
|
44
|
-
changeStoryType(value) {
|
|
45
|
-
this.storyType = value;
|
|
46
|
-
this.loadStory();
|
|
47
|
-
}
|
|
48
|
-
cancel() {
|
|
49
|
-
this.onCancel.emit(true);
|
|
50
|
-
}
|
|
51
|
-
checkStory(event) {
|
|
52
|
-
let story = event?.story;
|
|
53
|
-
let value = event?.event;
|
|
54
|
-
console.log(event);
|
|
55
|
-
console.log(story, value);
|
|
56
|
-
if (story?.story?.id) {
|
|
57
|
-
this.checkedMap[story?.story?.id] = value;
|
|
58
|
-
}
|
|
59
|
-
// console.log(this.checkedMap)
|
|
60
|
-
this.selectCount = Object.values(this.checkedMap)?.filter(item => item)?.length || 0;
|
|
61
|
-
this.onCountChange.emit(this.selectCount);
|
|
62
|
-
this.calcSelectTokens();
|
|
63
|
-
}
|
|
64
|
-
async calcSelectTokens() {
|
|
65
|
-
let result = await this.getAllSelectDocument();
|
|
66
|
-
// 附件Tokens计算
|
|
67
|
-
let documentList = result?.documentList || [];
|
|
68
|
-
this.selectToken = 0;
|
|
69
|
-
// 聊天Tokens计算
|
|
70
|
-
let storyList = result?.storyList?.filter(item => item.get("chatSession"));
|
|
71
|
-
documentList.forEach(document => {
|
|
72
|
-
let content = document?.get("pageContent") || ``;
|
|
73
|
-
content = content?.replaceAll("\n\n", "\n");
|
|
74
|
-
this.selectToken += content.length * 1.5;
|
|
75
|
-
});
|
|
76
|
-
storyList.forEach(story => {
|
|
77
|
-
let content = story?.get("contentJson");
|
|
78
|
-
content = JSON.stringify(content);
|
|
79
|
-
content = content?.replaceAll("\n\n", "\n");
|
|
80
|
-
console.log(content);
|
|
81
|
-
this.selectToken += content.length * 1.5;
|
|
82
|
-
});
|
|
83
|
-
this.onTokenChange.emit(this.selectToken);
|
|
84
|
-
return this.selectToken;
|
|
85
|
-
}
|
|
86
|
-
async confirmSelectedList() {
|
|
87
|
-
let result = await this.getAllSelectDocument();
|
|
88
|
-
let documentList = result?.documentList || [];
|
|
89
|
-
let storyList = result?.storyList || [];
|
|
90
|
-
this.onConfirmSelect.emit({
|
|
91
|
-
storyList: storyList,
|
|
92
|
-
documentList: documentList
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
async getAllSelectDocument() {
|
|
96
|
-
let documentList = [];
|
|
97
|
-
let storyList = [];
|
|
98
|
-
// 筛选已选故事
|
|
99
|
-
this.storyServ.storyList?.forEach(item => {
|
|
100
|
-
if (item?.story?.id && this.checkedMap[item?.story?.id || 'new']) {
|
|
101
|
-
storyList.push(item?.story);
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
// 加载知识文档
|
|
105
|
-
let md5List = storyList?.map((item) => item?.get("attach")?.get("md5"));
|
|
106
|
-
md5List = md5List?.filter(item => item);
|
|
107
|
-
if (md5List?.length) {
|
|
108
|
-
let query = new Parse.Query("Document");
|
|
109
|
-
query.equalTo("type", "entire"); // 仅加载整篇文档,未分割向量
|
|
110
|
-
query.limit(200);
|
|
111
|
-
console.log("md5List", md5List);
|
|
112
|
-
query.containedIn("md5", md5List);
|
|
113
|
-
documentList = await query.find();
|
|
114
|
-
}
|
|
115
|
-
return { documentList, storyList };
|
|
116
|
-
}
|
|
117
|
-
constructor(route, loadingCtrl, dialog, router, storyServ, chatServ, alertCtrl, modalCtrl, navCtrl, ncloud, nupload) {
|
|
118
|
-
this.route = route;
|
|
119
|
-
this.loadingCtrl = loadingCtrl;
|
|
120
|
-
this.dialog = dialog;
|
|
121
|
-
this.router = router;
|
|
122
|
-
this.storyServ = storyServ;
|
|
123
|
-
this.chatServ = chatServ;
|
|
124
|
-
this.alertCtrl = alertCtrl;
|
|
125
|
-
this.modalCtrl = modalCtrl;
|
|
126
|
-
this.navCtrl = navCtrl;
|
|
127
|
-
this.ncloud = ncloud;
|
|
128
|
-
this.nupload = nupload;
|
|
129
|
-
this.defaultAvatar = avatarIcon;
|
|
130
|
-
this.isPreview = false; // 是否正在预览(预览时折叠故事列表)
|
|
131
|
-
this.currentTab = "我的";
|
|
132
|
-
this.height = "100%";
|
|
133
|
-
// 选择模式
|
|
134
|
-
this.isSelectMode = false;
|
|
135
|
-
this.checkedMap = {};
|
|
136
|
-
this.selectCount = 0;
|
|
137
|
-
this.selectToken = 0;
|
|
138
|
-
this.onCancel = new EventEmitter;
|
|
139
|
-
this.onCountChange = new EventEmitter;
|
|
140
|
-
this.onTokenChange = new EventEmitter;
|
|
141
|
-
this.onPreviewStory = new EventEmitter;
|
|
142
|
-
// 筛选区域
|
|
143
|
-
this.storyType = "";
|
|
144
|
-
this.onConfirmSelect = new EventEmitter;
|
|
145
|
-
}
|
|
146
|
-
async ngOnInit() {
|
|
147
|
-
if (!this.person?.id || this.book?.id) {
|
|
148
|
-
let id = this.route.snapshot.params?.["id"] || this.route?.parent?.snapshot?.params?.["id"];
|
|
149
|
-
if (location?.pathname?.indexOf("editor/book") > -1) {
|
|
150
|
-
let query = new Parse.Query("Book");
|
|
151
|
-
query.include("person");
|
|
152
|
-
this.book = await query.get(id);
|
|
153
|
-
this.person = this.book.get("person");
|
|
154
|
-
}
|
|
155
|
-
if (location?.pathname?.indexOf("editor/person") > -1) {
|
|
156
|
-
let query = new Parse.Query("Person");
|
|
157
|
-
this.person = await query.get(id);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
await this.loadStory();
|
|
161
|
-
if (this.storyServ.storyList?.length == 0) {
|
|
162
|
-
this.newStory();
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
getArticleDocList() {
|
|
166
|
-
let docMap = {};
|
|
167
|
-
let outlineJson = this.article?.get("outlineJson");
|
|
168
|
-
let sections = outlineJson?.sections;
|
|
169
|
-
sections?.forEach(section => {
|
|
170
|
-
let list = section?.docList;
|
|
171
|
-
list?.forEach(docId => {
|
|
172
|
-
if (docMap[docId])
|
|
173
|
-
return; // 已存在则跳过选择
|
|
174
|
-
docMap[docId] = true;
|
|
175
|
-
this.checkedMap[docId] = true; // 预选大纲已选故事
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
console.log(Object.keys(docMap));
|
|
179
|
-
return Object.keys(docMap) || [];
|
|
180
|
-
}
|
|
181
|
-
async loadStory() {
|
|
182
|
-
this.storyServ.storyList = [];
|
|
183
|
-
let $orArray = [];
|
|
184
|
-
// 书籍大纲已有数据
|
|
185
|
-
let articleDocList;
|
|
186
|
-
if (this.article?.id) {
|
|
187
|
-
articleDocList = await this.getArticleDocList();
|
|
188
|
-
if (articleDocList?.length) {
|
|
189
|
-
$orArray.push({ objectId: { $in: articleDocList } });
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
if (this.person?.id && this.currentTab == "主角数据") {
|
|
193
|
-
let personPointer = { __type: "Pointer", className: "Person", objectId: this.person.id };
|
|
194
|
-
$orArray.push({ person: personPointer });
|
|
195
|
-
}
|
|
196
|
-
if (this.book?.id && this.currentTab == "主角数据") {
|
|
197
|
-
let bookPointer = { __type: "Pointer", className: "Book", objectId: this.book.id };
|
|
198
|
-
$orArray.push({ book: bookPointer });
|
|
199
|
-
}
|
|
200
|
-
if (Parse.User.current()?.id) {
|
|
201
|
-
$orArray.push({ user: Parse.User.current()?.toPointer() });
|
|
202
|
-
}
|
|
203
|
-
if (!$orArray?.length) { // 必须满足条件才可加载搜索
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
let query = Parse.Query.fromJSON("Story", {
|
|
207
|
-
where: {
|
|
208
|
-
$or: $orArray
|
|
209
|
-
}
|
|
210
|
-
});
|
|
211
|
-
query.include("attach", "chatSession", "person");
|
|
212
|
-
if (this.storyType) {
|
|
213
|
-
query.equalTo("type", this.storyType);
|
|
214
|
-
}
|
|
215
|
-
if (this.currentTab == "主角数据") {
|
|
216
|
-
query.equalTo("person", this.person?.id);
|
|
217
|
-
}
|
|
218
|
-
if (this.currentTab == "书籍数据") {
|
|
219
|
-
query.equalTo("book", this.book?.id);
|
|
220
|
-
}
|
|
221
|
-
query.notEqualTo("isDeleted", true);
|
|
222
|
-
query.addDescending("createdAt");
|
|
223
|
-
let storys = await query.find();
|
|
224
|
-
this.storyServ.storyList = storys.map(item => new AgentStory(item, undefined, undefined));
|
|
225
|
-
this.currentStory = this.storyServ.storyList?.[0];
|
|
226
|
-
// 加载去重关键词
|
|
227
|
-
// query.select("keywords")
|
|
228
|
-
// let result = await query.distinct("keywords");
|
|
229
|
-
// console.log(result);
|
|
230
|
-
// console.log(this.checkedMap)
|
|
231
|
-
// 刷新已选故事统计
|
|
232
|
-
this.selectCount = Object.values(this.checkedMap)?.filter(item => item)?.length || 0;
|
|
233
|
-
this.onCountChange.emit(this.selectCount);
|
|
234
|
-
this.calcSelectTokens();
|
|
235
|
-
}
|
|
236
|
-
newStory() {
|
|
237
|
-
this.currentStory = this.storyServ.newStory({ person: this.person, book: this.book });
|
|
238
|
-
if (this.currentStory) {
|
|
239
|
-
this.previewStory(this.currentStory);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
242
|
-
async previewStory(event) {
|
|
243
|
-
let story = event;
|
|
244
|
-
this.onPreviewStory.emit(story);
|
|
245
|
-
if (document.body.clientWidth < 1000) { // 手机端弹窗预览
|
|
246
|
-
if (story?.story) {
|
|
247
|
-
previewStoryMobile(story?.story, {
|
|
248
|
-
chatServ: this.chatServ,
|
|
249
|
-
alertCtrl: this.alertCtrl,
|
|
250
|
-
modalCtrl: this.modalCtrl,
|
|
251
|
-
navCtrl: this.navCtrl,
|
|
252
|
-
ncloud: this.ncloud,
|
|
253
|
-
nupload: this.nupload,
|
|
254
|
-
});
|
|
255
|
-
}
|
|
256
|
-
;
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
this.currentStory = undefined;
|
|
260
|
-
let duration = story?.story?.get("attach")?.id ? 1000 : 100;
|
|
261
|
-
const loading = await this.loadingCtrl.create({
|
|
262
|
-
message: '故事渲染中...',
|
|
263
|
-
duration: duration,
|
|
264
|
-
});
|
|
265
|
-
loading.present();
|
|
266
|
-
this.currentStory = story;
|
|
267
|
-
}
|
|
268
|
-
async destroyStory(event, index) {
|
|
269
|
-
let story = event;
|
|
270
|
-
const dialogRef = this.dialog.open(DialogDeleteStoryDialog, {
|
|
271
|
-
data: {},
|
|
272
|
-
});
|
|
273
|
-
dialogRef.afterClosed().subscribe(async (isConfirm) => {
|
|
274
|
-
if (isConfirm) {
|
|
275
|
-
if (story?.story?.id) {
|
|
276
|
-
story.story.set("isDeleted", true);
|
|
277
|
-
await story.story.save();
|
|
278
|
-
}
|
|
279
|
-
this.storyServ.storyList?.splice(index, 1);
|
|
280
|
-
// 删除后加载首条故事
|
|
281
|
-
if (this.storyServ.storyList?.[0]) {
|
|
282
|
-
this.previewStory(this.storyServ.storyList?.[0]);
|
|
283
|
-
}
|
|
284
|
-
else {
|
|
285
|
-
this.currentStory = undefined;
|
|
286
|
-
}
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmStoryListComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.LoadingController }, { token: i3.MatDialog }, { token: i1.Router }, { token: i4.StoryService }, { token: i5.ChatService }, { token: i6.AlertController }, { token: i6.ModalController }, { token: i6.NavController }, { token: i7.NovaCloudService }, { token: i8.NovaUploadService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
292
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FmStoryListComponent, isStandalone: true, selector: "fm-story-list", inputs: { id: "id", article: "article", person: "person", book: "book", isSelectMode: "isSelectMode" }, outputs: { onCancel: "onCancel", onCountChange: "onCountChange", onTokenChange: "onTokenChange", onPreviewStory: "onPreviewStory", onConfirmSelect: "onConfirmSelect" }, ngImport: i0, template: "<!-- \r\n <ion-header>\r\n <ion-toolbar>\r\n <ion-title>\u77E5\u8BC6\u5E93</ion-title>\r\n <ion-buttons slot=\"end\">\r\n <ion-button *ngIf=\"!isSelectMode\" (click)=\"newStory()\" [strong]=\"true\">\u65B0\u5EFA</ion-button>\r\n </ion-buttons>\r\n </ion-toolbar>\r\n </ion-header>\r\n <ion-content> -->\r\n\r\n <div class=\"page\">\r\n\r\n <div class=\"filter\">\r\n <!-- <button mat-icon-button class=\"example-icon\" aria-label=\"Example icon-button with menu icon\">\r\n <mat-icon>menu</mat-icon>\r\n </button> -->\r\n\r\n <!-- \u77E5\u8BC6\u5E93\u5207\u6362 -->\r\n <ion-chip>\r\n <ion-avatar>\r\n <img alt=\"\u89D2\u8272\u5934\u50CF\" [src]=\"defaultAvatar\" />\r\n </ion-avatar>\r\n <ion-label>\u6545\u4E8B\u5361\u7247</ion-label>\r\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\r\n </ion-chip>\r\n\r\n <span class=\"example-spacer\"></span>\r\n\r\n\r\n <!-- \u6DFB\u52A0\u6545\u4E8B -->\r\n @if(false){\r\n <button mat-flat-button color=\"primary\" (click)=\"newStory()\" *ngIf=\"!isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u4E0A\u4F20\r\n </button>\r\n }\r\n\r\n <!-- \u9009\u62E9\u72B6\u6001 -->\r\n <button mat-button color=\"primary\" (click)=\"cancel()\" *ngIf=\"isSelectMode\" style=\"margin-left:5px;\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u53D6\u6D88\r\n </button>\r\n <button mat-flat-button color=\"primary\" (click)=\"confirmSelectedList()\" *ngIf=\"isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u786E\u8BA4\u9009\u62E9\r\n </button>\r\n <!-- <button mat-icon-button class=\"example-icon favorite-icon\" aria-label=\"Example icon-button with heart icon\">\r\n <mat-icon>favorite</mat-icon>\r\n </button> -->\r\n <button id=\"trigger-button\" mat-icon-button class=\"example-icon\" aria-label=\"Example icon-button with share icon\">\r\n <mat-icon>tune</mat-icon>\r\n </button>\r\n <ion-popover trigger=\"trigger-button\" size=\"auto\" side=\"bottom\" alignment=\"end\" style=\"--width: 34%;margin-left: 0%;\">\r\n <ng-template>\r\n <ion-content class=\"ion-padding\">\r\n <ion-item-group>\r\n <ion-item-divider>\r\n <ion-label>\u7C7B\u578B</ion-label>\r\n </ion-item-divider>\r\n <ion-item lines=\"none\">\r\n <mat-chip-listbox [value]=\"storyType\" aria-label=\"\u7C7B\u578B\">\r\n <mat-chip-option (click)=\"changeStoryType('')\" value=\"\">\u5168\u90E8</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('document')\" value=\"document\">\u6587\u6863</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('chat')\" value=\"chat\">\u804A\u5929</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('diary')\" value=\"diary\">\u65E5\u8BB0</mat-chip-option>\r\n <!-- <mat-chip-option color=\"accent\" selected>Accent fish</mat-chip-option> -->\r\n <!-- <mat-chip-option color=\"warn\">Warn fish</mat-chip-option> -->\r\n </mat-chip-listbox>\r\n </ion-item>\r\n </ion-item-group>\r\n \r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </div>\r\n\r\n <!-- \u9009\u62E9\u6A21\u5F0F\uFF1A\u9009\u62E9\u6570\u636E -->\r\n @if(selectCount&&selectToken){\r\n <div class=\"select\">\r\n <span>\u5DF2\u9009 {{selectCount||0}}\u4E2A</span>\r\n <span style=\"margin-left:3px;\">\u7EA6{{selectToken||0}}tokens</span>\r\n </div>\r\n }\r\n \r\n <div class=\"list\">\r\n\r\n\r\n <!-- \u5207\u6362\u7B5B\u9009\u7C7B\u578B\uFF08\u89D2\u8272\u6545\u4E8B\u3001\u4E66\u7C4D\u6545\u4E8B\u3001\u7528\u6237\u6545\u4E8B\uFF09 -->\r\n @if(person?.id || book?.id){\r\n <mat-button-toggle-group name=\"fontStyle\">\r\n <mat-button-toggle (click)=\"currentTab='\u6211\u7684';loadStory()\" *ngIf=\"person?.id || book?.id\" [checked]=\"currentTab=='\u6211\u7684'\">\r\n <span nz-icon nzType=\"user\" nzTheme=\"outline\"></span> \u6211\u7684\r\n </mat-button-toggle>\r\n <mat-button-toggle (click)=\"currentTab='\u4E3B\u89D2';loadStory()\" *ngIf=\"person?.id\" [checked]=\"currentTab=='\u4E3B\u89D2'\">\r\n <span nz-icon nzType=\"user\" nzTheme=\"outline\"></span> \u4E3B\u89D2\r\n </mat-button-toggle>\r\n <mat-button-toggle (click)=\"currentTab='\u4E66\u7C4D';loadStory()\" *ngIf=\"book?.id\" [checked]=\"currentTab=='\u4E66\u7C4D'\">\r\n <span nz-icon nzType=\"read\" nzTheme=\"outline\"></span> \u4E66\u7C4D\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n \r\n <!-- \u6545\u4E8B\u5361\u7247 -->\r\n <ng-container *ngFor=\"let story of storyServ.storyList;let index=index;\">\r\n <fm-story-card class=\"list-item\" [story]=\"story?.story\" [isSelectMode]=\"isSelectMode\" \r\n [(checked)]=\"checkedMap[story?.story?.id||'']\"\r\n (onCheckStory)=\"checkStory($event)\" \r\n (onPreviewStory)=\"previewStory($event)\"\r\n (onDestoryStory)=\"destroyStory($event,index)\"\r\n ></fm-story-card>\r\n </ng-container>\r\n </div>\r\n <!-- </ion-content> -->\r\n</div>\r\n", styles: [".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i9.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i10.MatChipListbox, selector: "mat-chip-listbox", inputs: ["multiple", "aria-orientation", "selectable", "compareWith", "required", "hideSingleSelectionIndicator", "value"], outputs: ["change"] }, { kind: "component", type: i10.MatChipOption, selector: "mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]", inputs: ["selectable", "selected"], outputs: ["selectionChange"] }, { kind: "ngmodule", type: MatButtonToggleModule }, { kind: "directive", type: i11.MatButtonToggleGroup, selector: "mat-button-toggle-group", inputs: ["appearance", "name", "vertical", "value", "multiple", "disabled", "hideSingleSelectionIndicator", "hideMultipleSelectionIndicator"], outputs: ["valueChange", "change"], exportAs: ["matButtonToggleGroup"] }, { kind: "component", type: i11.MatButtonToggle, selector: "mat-button-toggle", inputs: ["aria-label", "aria-labelledby", "id", "name", "value", "tabIndex", "disableRipple", "appearance", "checked", "disabled"], outputs: ["change"], exportAs: ["matButtonToggle"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatProgressBarModule }, { kind: "ngmodule", type: MatDividerModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "component", type: i12.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i13.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type:
|
|
293
|
-
// IonToolbar,IonButtons,IonHeader,IonTitle,IonButton,
|
|
294
|
-
IonPopover, selector: "ion-popover" }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { 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: IonItemGroup, selector: "ion-item-group" }, { kind: "component", type: IonItemDivider, selector: "ion-item-divider", inputs: ["color", "mode", "sticky"] }, { kind: "component", type: IonLabel, selector: "ion-label", inputs: ["color", "mode", "position"] }, { kind: "component", type: IonChip, selector: "ion-chip", inputs: ["color", "disabled", "mode", "outline"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonAvatar, selector: "ion-avatar" }, { kind: "component", type: FmStoryCardComponent, selector: "fm-story-card", inputs: ["story", "isSelectMode", "checked"], outputs: ["checkedChange", "onCheckStory", "onPreviewStory", "onDestoryStory"] }] }); }
|
|
295
|
-
}
|
|
296
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmStoryListComponent, decorators: [{
|
|
297
|
-
type: Component,
|
|
298
|
-
args: [{ selector: 'fm-story-list', standalone: true, imports: [
|
|
299
|
-
CommonModule, FormsModule, ReactiveFormsModule,
|
|
300
|
-
MatToolbarModule, MatChipsModule,
|
|
301
|
-
MatButtonToggleModule, MatCheckboxModule, MatDialogModule,
|
|
302
|
-
MatCardModule, MatProgressBarModule, MatDividerModule, MatButtonModule, MatIconModule,
|
|
303
|
-
MatChipsModule, MatChipListbox,
|
|
304
|
-
// IonToolbar,IonButtons,IonHeader,IonTitle,IonButton,
|
|
305
|
-
IonPopover, IonContent, IonItem, IonItemGroup, IonItemDivider, IonLabel,
|
|
306
|
-
IonChip, IonIcon, IonAvatar,
|
|
307
|
-
FmStoryCardComponent,
|
|
308
|
-
], template: "<!-- \r\n <ion-header>\r\n <ion-toolbar>\r\n <ion-title>\u77E5\u8BC6\u5E93</ion-title>\r\n <ion-buttons slot=\"end\">\r\n <ion-button *ngIf=\"!isSelectMode\" (click)=\"newStory()\" [strong]=\"true\">\u65B0\u5EFA</ion-button>\r\n </ion-buttons>\r\n </ion-toolbar>\r\n </ion-header>\r\n <ion-content> -->\r\n\r\n <div class=\"page\">\r\n\r\n <div class=\"filter\">\r\n <!-- <button mat-icon-button class=\"example-icon\" aria-label=\"Example icon-button with menu icon\">\r\n <mat-icon>menu</mat-icon>\r\n </button> -->\r\n\r\n <!-- \u77E5\u8BC6\u5E93\u5207\u6362 -->\r\n <ion-chip>\r\n <ion-avatar>\r\n <img alt=\"\u89D2\u8272\u5934\u50CF\" [src]=\"defaultAvatar\" />\r\n </ion-avatar>\r\n <ion-label>\u6545\u4E8B\u5361\u7247</ion-label>\r\n <ion-icon name=\"swap-vertical-outline\"></ion-icon>\r\n </ion-chip>\r\n\r\n <span class=\"example-spacer\"></span>\r\n\r\n\r\n <!-- \u6DFB\u52A0\u6545\u4E8B -->\r\n @if(false){\r\n <button mat-flat-button color=\"primary\" (click)=\"newStory()\" *ngIf=\"!isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u4E0A\u4F20\r\n </button>\r\n }\r\n\r\n <!-- \u9009\u62E9\u72B6\u6001 -->\r\n <button mat-button color=\"primary\" (click)=\"cancel()\" *ngIf=\"isSelectMode\" style=\"margin-left:5px;\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u53D6\u6D88\r\n </button>\r\n <button mat-flat-button color=\"primary\" (click)=\"confirmSelectedList()\" *ngIf=\"isSelectMode\">\r\n <span nz-icon nzType=\"plus\" nzTheme=\"outline\"></span> \u786E\u8BA4\u9009\u62E9\r\n </button>\r\n <!-- <button mat-icon-button class=\"example-icon favorite-icon\" aria-label=\"Example icon-button with heart icon\">\r\n <mat-icon>favorite</mat-icon>\r\n </button> -->\r\n <button id=\"trigger-button\" mat-icon-button class=\"example-icon\" aria-label=\"Example icon-button with share icon\">\r\n <mat-icon>tune</mat-icon>\r\n </button>\r\n <ion-popover trigger=\"trigger-button\" size=\"auto\" side=\"bottom\" alignment=\"end\" style=\"--width: 34%;margin-left: 0%;\">\r\n <ng-template>\r\n <ion-content class=\"ion-padding\">\r\n <ion-item-group>\r\n <ion-item-divider>\r\n <ion-label>\u7C7B\u578B</ion-label>\r\n </ion-item-divider>\r\n <ion-item lines=\"none\">\r\n <mat-chip-listbox [value]=\"storyType\" aria-label=\"\u7C7B\u578B\">\r\n <mat-chip-option (click)=\"changeStoryType('')\" value=\"\">\u5168\u90E8</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('document')\" value=\"document\">\u6587\u6863</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('chat')\" value=\"chat\">\u804A\u5929</mat-chip-option>\r\n <mat-chip-option (click)=\"changeStoryType('diary')\" value=\"diary\">\u65E5\u8BB0</mat-chip-option>\r\n <!-- <mat-chip-option color=\"accent\" selected>Accent fish</mat-chip-option> -->\r\n <!-- <mat-chip-option color=\"warn\">Warn fish</mat-chip-option> -->\r\n </mat-chip-listbox>\r\n </ion-item>\r\n </ion-item-group>\r\n \r\n </ion-content>\r\n </ng-template>\r\n </ion-popover>\r\n </div>\r\n\r\n <!-- \u9009\u62E9\u6A21\u5F0F\uFF1A\u9009\u62E9\u6570\u636E -->\r\n @if(selectCount&&selectToken){\r\n <div class=\"select\">\r\n <span>\u5DF2\u9009 {{selectCount||0}}\u4E2A</span>\r\n <span style=\"margin-left:3px;\">\u7EA6{{selectToken||0}}tokens</span>\r\n </div>\r\n }\r\n \r\n <div class=\"list\">\r\n\r\n\r\n <!-- \u5207\u6362\u7B5B\u9009\u7C7B\u578B\uFF08\u89D2\u8272\u6545\u4E8B\u3001\u4E66\u7C4D\u6545\u4E8B\u3001\u7528\u6237\u6545\u4E8B\uFF09 -->\r\n @if(person?.id || book?.id){\r\n <mat-button-toggle-group name=\"fontStyle\">\r\n <mat-button-toggle (click)=\"currentTab='\u6211\u7684';loadStory()\" *ngIf=\"person?.id || book?.id\" [checked]=\"currentTab=='\u6211\u7684'\">\r\n <span nz-icon nzType=\"user\" nzTheme=\"outline\"></span> \u6211\u7684\r\n </mat-button-toggle>\r\n <mat-button-toggle (click)=\"currentTab='\u4E3B\u89D2';loadStory()\" *ngIf=\"person?.id\" [checked]=\"currentTab=='\u4E3B\u89D2'\">\r\n <span nz-icon nzType=\"user\" nzTheme=\"outline\"></span> \u4E3B\u89D2\r\n </mat-button-toggle>\r\n <mat-button-toggle (click)=\"currentTab='\u4E66\u7C4D';loadStory()\" *ngIf=\"book?.id\" [checked]=\"currentTab=='\u4E66\u7C4D'\">\r\n <span nz-icon nzType=\"read\" nzTheme=\"outline\"></span> \u4E66\u7C4D\r\n </mat-button-toggle>\r\n </mat-button-toggle-group>\r\n }\r\n \r\n <!-- \u6545\u4E8B\u5361\u7247 -->\r\n <ng-container *ngFor=\"let story of storyServ.storyList;let index=index;\">\r\n <fm-story-card class=\"list-item\" [story]=\"story?.story\" [isSelectMode]=\"isSelectMode\" \r\n [(checked)]=\"checkedMap[story?.story?.id||'']\"\r\n (onCheckStory)=\"checkStory($event)\" \r\n (onPreviewStory)=\"previewStory($event)\"\r\n (onDestoryStory)=\"destroyStory($event,index)\"\r\n ></fm-story-card>\r\n </ng-container>\r\n </div>\r\n <!-- </ion-content> -->\r\n</div>\r\n", styles: [".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"] }]
|
|
309
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.LoadingController }, { type: i3.MatDialog }, { type: i1.Router }, { type: i4.StoryService }, { type: i5.ChatService }, { type: i6.AlertController }, { type: i6.ModalController }, { type: i6.NavController }, { type: i7.NovaCloudService }, { type: i8.NovaUploadService }], propDecorators: { id: [{
|
|
310
|
-
type: Input
|
|
311
|
-
}], article: [{
|
|
312
|
-
type: Input
|
|
313
|
-
}], person: [{
|
|
314
|
-
type: Input
|
|
315
|
-
}], book: [{
|
|
316
|
-
type: Input
|
|
317
|
-
}], isSelectMode: [{
|
|
318
|
-
type: Input
|
|
319
|
-
}], onCancel: [{
|
|
320
|
-
type: Output
|
|
321
|
-
}], onCountChange: [{
|
|
322
|
-
type: Output
|
|
323
|
-
}], onTokenChange: [{
|
|
324
|
-
type: Output
|
|
325
|
-
}], onPreviewStory: [{
|
|
326
|
-
type: Output
|
|
327
|
-
}], onConfirmSelect: [{
|
|
328
|
-
type: Output
|
|
329
|
-
}] } });
|
|
330
|
-
export class DialogDeleteStoryDialog {
|
|
331
|
-
constructor(dialogRef, data) {
|
|
332
|
-
this.dialogRef = dialogRef;
|
|
333
|
-
this.data = data;
|
|
334
|
-
}
|
|
335
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogDeleteStoryDialog, deps: [{ token: i3.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
336
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DialogDeleteStoryDialog, isStandalone: true, selector: "delete-story-dialog", ngImport: i0, template: "<h1 mat-dialog-title>\u5220\u9664\u6545\u4E8B</h1>\r\n<div mat-dialog-content>\r\n \u8BF7\u95EE\u60A8\u8981\u5220\u9664\u8BE5\u6545\u4E8B\u53CA\u5176\u6240\u6709\u7EBF\u7D22\u5417\uFF1F\r\n</div>\r\n<div mat-dialog-actions>\r\n <button mat-button mat-dialog-close cdkFocusInitial>\u53D6\u6D88</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"warn\">\u5220\u9664</button>\r\n</div>", dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i3.MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }, { kind: "directive", type: i3.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i3.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i3.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i12.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] }); }
|
|
337
|
-
}
|
|
338
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogDeleteStoryDialog, decorators: [{
|
|
339
|
-
type: Component,
|
|
340
|
-
args: [{ selector: 'delete-story-dialog', standalone: true, imports: [MatDialogModule, MatButtonModule], template: "<h1 mat-dialog-title>\u5220\u9664\u6545\u4E8B</h1>\r\n<div mat-dialog-content>\r\n \u8BF7\u95EE\u60A8\u8981\u5220\u9664\u8BE5\u6545\u4E8B\u53CA\u5176\u6240\u6709\u7EBF\u7D22\u5417\uFF1F\r\n</div>\r\n<div mat-dialog-actions>\r\n <button mat-button mat-dialog-close cdkFocusInitial>\u53D6\u6D88</button>\r\n <button mat-button [mat-dialog-close]=\"true\" color=\"warn\">\u5220\u9664</button>\r\n</div>" }]
|
|
341
|
-
}], ctorParameters: () => [{ type: i3.MatDialogRef }, { type: undefined, decorators: [{
|
|
342
|
-
type: Inject,
|
|
343
|
-
args: [MAT_DIALOG_DATA]
|
|
344
|
-
}] }] });
|
|
345
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm0tc3RvcnktbGlzdC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2Mvc3RvcnkvZm0tc3RvcnktbGlzdC9mbS1zdG9yeS1saXN0LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvYWlnYy9zdG9yeS9mbS1zdG9yeS1saXN0L2ZtLXN0b3J5LWxpc3QuY29tcG9uZW50Lmh0bWwiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9mbW9kZS1uZy9zcmMvbGliL2FpZ2Mvc3RvcnkvZm0tc3RvcnktbGlzdC9kZWxldGUtc3RvcnktZGlhbG9nLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFF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Q0FBQyxlQUFlLEVBQUUsZUFBZSxDQUFDOzswQkFLeEMsTUFBTTsyQkFBQyxlQUFlIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xyXG5pbXBvcnQgeyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24tdG9nZ2xlJztcclxuaW1wb3J0IHsgTWF0Q2FyZE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xyXG5pbXBvcnQgeyBNYXRDaGVja2JveE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NoZWNrYm94JztcclxuaW1wb3J0IHsgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUsIE1hdERpYWxvZ1JlZiwgTUFUX0RJQUxPR19EQVRBIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgTWF0RGl2aWRlck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpdmlkZXInO1xyXG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XHJcbmltcG9ydCB7IE1hdFByb2dyZXNzQmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvcHJvZ3Jlc3MtYmFyJztcclxuXHJcbmltcG9ydCB7IEZtU3RvcnlDYXJkQ29tcG9uZW50IH0gZnJvbSAnLi4vZm0tc3RvcnktY2FyZC9mbS1zdG9yeS1jYXJkLmNvbXBvbmVudCc7XHJcblxyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCB7IEFnZW50U3RvcnkgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcclxuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IExvYWRpbmdDb250cm9sbGVyIH0gZnJvbSAnQGlvbmljL2FuZ3VsYXInO1xyXG5pbXBvcnQgeyBTdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9zdG9yeS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQWxlcnRDb250cm9sbGVyLCBJb25BdmF0YXIsIElvbkNoaXAsIElvbkNvbnRlbnQsIElvbkhlYWRlciwgSW9uSWNvbiwgSW9uSXRlbSwgSW9uSXRlbURpdmlkZXIsIElvbkl0ZW1Hcm91cCwgSW9uTGFiZWwsIElvblBvcG92ZXIsIElvblRpdGxlLCBJb25Ub29sYmFyLCBNb2RhbENvbnRyb2xsZXIsIE5hdkNvbnRyb2xsZXIgfSBmcm9tICdAaW9uaWMvYW5ndWxhci9zdGFuZGFsb25lJztcclxuaW1wb3J0IHsgTWF0VG9vbGJhck1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2xiYXInO1xyXG5pbXBvcnQgeyBNYXRDaGlwTGlzdGJveCwgTWF0Q2hpcHNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jaGlwcyc7XHJcbmltcG9ydCB7IGF2YXRhckljb24gfSBmcm9tICcuLi8uLi8uLi9pY29uL2ZpbGV0eXBlJztcclxuXHJcbmltcG9ydCB7IHByZXZpZXdTdG9yeU1vYmlsZSB9IGZyb20gXCIuL3N0b3J5LXByZXZpZXdcIjtcclxuXHJcbmltcG9ydCB7IGFkZEljb25zIH0gZnJvbSAnaW9uaWNvbnMnO1xyXG5pbXBvcnQgKiBhcyBpY29ucyBmcm9tICdpb25pY29ucy9pY29ucyc7XHJcbmltcG9ydCB7IENoYXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS1mbWFpL3NlcnZpY2UtY2hhdC9jaGF0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3ZhQ2xvdWRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vbm92YS1jbG91ZC9ub3ZhLWNsb3VkLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBOb3ZhVXBsb2FkU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL3N0b3JhZ2Uvc2VydmljZS11cGxvYWQvbm92YS11cGxvYWQuc2VydmljZSc7XHJcbmFkZEljb25zKGljb25zKTtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnZm0tc3RvcnktbGlzdCcsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ZtLXN0b3J5LWxpc3QuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2ZtLXN0b3J5LWxpc3QuY29tcG9uZW50LnNjc3MnXSxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6W1xyXG4gICAgQ29tbW9uTW9kdWxlLEZvcm1zTW9kdWxlLFJlYWN0aXZlRm9ybXNNb2R1bGUsXHJcbiAgICBNYXRUb29sYmFyTW9kdWxlLE1hdENoaXBzTW9kdWxlLFxyXG4gICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLE1hdENoZWNrYm94TW9kdWxlLE1hdERpYWxvZ01vZHVsZSxcclxuICAgIE1hdENhcmRNb2R1bGUsTWF0UHJvZ3Jlc3NCYXJNb2R1bGUsTWF0RGl2aWRlck1vZHVsZSxNYXRCdXR0b25Nb2R1bGUsTWF0SWNvbk1vZHVsZSxcclxuICAgIE1hdENoaXBzTW9kdWxlLE1hdENoaXBMaXN0Ym94LFxyXG4gICAgLy8gSW9uVG9vbGJhcixJb25CdXR0b25zLElvbkhlYWRlcixJb25UaXRsZSxJb25CdXR0b24sXHJcbiAgICBJb25Qb3BvdmVyLElvbkNvbnRlbnQsSW9uSXRlbSxJb25JdGVtR3JvdXAsSW9uSXRlbURpdmlkZXIsSW9uTGFiZWwsXHJcbiAgICBJb25DaGlwLElvbkljb24sSW9uQXZhdGFyLFxyXG4gICAgRm1TdG9yeUNhcmRDb21wb25lbnQsXHJcblxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZtU3RvcnlMaXN0Q29tcG9uZW50ICBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgQElucHV0KCkgaWQ6c3RyaW5nfHVuZGVmaW5lZFxyXG4gIEBJbnB1dCgpIGFydGljbGU6UGFyc2UuT2JqZWN0fHVuZGVmaW5lZFxyXG4gIEBJbnB1dCgpIHBlcnNvbjpQYXJzZS5PYmplY3R8dW5kZWZpbmVkXHJcbiAgQElucHV0KCkgYm9vazpQYXJzZS5PYmplY3R8dW5kZWZpbmVkXHJcbiAgZGVmYXVsdEF2YXRhciA9IGF2YXRhckljb247XHJcblxyXG4gIGN1cnJlbnRTdG9yeTpBZ2VudFN0b3J5fHVuZGVmaW5lZFxyXG4gIGlzUHJldmlldzpib29sZWFuID0gZmFsc2UgLy8g5piv5ZCm5q2j5Zyo6aKE6KeI77yI6aKE6KeI5pe25oqY5Y+g5pWF5LqL5YiX6KGo77yJXHJcblxyXG4gIGN1cnJlbnRUYWI6c3RyaW5nID0gXCLmiJHnmoRcIlxyXG4gIGhlaWdodDpzdHJpbmcgPSBcIjEwMCVcIjtcclxuXHJcbiAgLy8g6YCJ5oup5qih5byPXHJcbiAgQElucHV0KClcclxuICBpc1NlbGVjdE1vZGU6Ym9vbGVhbiA9IGZhbHNlO1xyXG4gIGNoZWNrZWRNYXA6e1trZXk6c3RyaW5nXTp0cnVlfSA9IHt9O1xyXG4gIHNlbGVjdENvdW50Om51bWJlciA9IDA7XHJcbiAgc2VsZWN0VG9rZW46bnVtYmVyID0gMDtcclxuICBAT3V0cHV0KCkgb25DYW5jZWw6RXZlbnRFbWl0dGVyPGJvb2xlYW4+PW5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj5cclxuICBAT3V0cHV0KClcclxuICBvbkNvdW50Q2hhbmdlOkV2ZW50RW1pdHRlcjxudW1iZXI+ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+XHJcbiAgQE91dHB1dCgpXHJcbiAgb25Ub2tlbkNoYW5nZTpFdmVudEVtaXR0ZXI8bnVtYmVyPiA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPlxyXG4gIEBPdXRwdXQoKSBvblByZXZpZXdTdG9yeTpFdmVudEVtaXR0ZXI8QWdlbnRTdG9yeT4gPSBuZXcgRXZlbnRFbWl0dGVyPEFnZW50U3Rvcnk+O1xyXG5cclxuICAvLyDnrZvpgInljLrln59cclxuICBzdG9yeVR5cGU6c3RyaW5nID0gXCJcIlxyXG4gIGNoYW5nZVN0b3J5VHlwZSh2YWx1ZSl7XHJcbiAgICB0aGlzLnN0b3J5VHlwZSA9IHZhbHVlXHJcbiAgICB0aGlzLmxvYWRTdG9yeSgpO1xyXG4gIH1cclxuICBjYW5jZWwoKXtcclxuICAgIHRoaXMub25DYW5jZWwuZW1pdCh0cnVlKVxyXG4gIH1cclxuICBjaGVja1N0b3J5KGV2ZW50OmFueSl7XHJcbiAgICBsZXQgc3Rvcnk9ZXZlbnQ/LnN0b3J5O1xyXG4gICAgbGV0IHZhbHVlPWV2ZW50Py5ldmVudDtcclxuICAgIGNvbnNvbGUubG9nKGV2ZW50KTtcclxuICAgIGNvbnNvbGUubG9nKHN0b3J5LHZhbHVlKTtcclxuICAgIGlmKHN0b3J5Py5zdG9yeT8uaWQpe1xyXG4gICAgICB0aGlzLmNoZWNrZWRNYXBbc3Rvcnk/LnN0b3J5Py5pZF0gPSB2YWx1ZVxyXG4gICAgfVxyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5jaGVja2VkTWFwKVxyXG4gICAgdGhpcy5zZWxlY3RDb3VudCA9IE9iamVjdC52YWx1ZXModGhpcy5jaGVja2VkTWFwKT8uZmlsdGVyKGl0ZW09Pml0ZW0pPy5sZW5ndGggfHwgMFxyXG4gICAgdGhpcy5vbkNvdW50Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RDb3VudClcclxuICAgIHRoaXMuY2FsY1NlbGVjdFRva2VucygpXHJcbiAgfVxyXG4gIGFzeW5jIGNhbGNTZWxlY3RUb2tlbnMoKXtcclxuICAgIGxldCByZXN1bHQgPSBhd2FpdCB0aGlzLmdldEFsbFNlbGVjdERvY3VtZW50KClcclxuICAgIC8vIOmZhOS7tlRva2Vuc+iuoeeul1xyXG4gICAgbGV0IGRvY3VtZW50TGlzdDpBcnJheTxQYXJzZS5PYmplY3Q+ID0gcmVzdWx0Py5kb2N1bWVudExpc3QgfHwgW11cclxuICAgIHRoaXMuc2VsZWN0VG9rZW4gPSAwO1xyXG4gICAgLy8g6IGK5aSpVG9rZW5z6K6h566XXHJcbiAgICBsZXQgc3RvcnlMaXN0OkFycmF5PFBhcnNlLk9iamVjdD4gPSByZXN1bHQ/LnN0b3J5TGlzdD8uZmlsdGVyKGl0ZW09Pml0ZW0uZ2V0KFwiY2hhdFNlc3Npb25cIikpXHJcbiAgICBkb2N1bWVudExpc3QuZm9yRWFjaChkb2N1bWVudD0+e1xyXG4gICAgICBsZXQgY29udGVudCA9IGRvY3VtZW50Py5nZXQoXCJwYWdlQ29udGVudFwiKSB8fCBgYDtcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQ/LnJlcGxhY2VBbGwoXCJcXG5cXG5cIixcIlxcblwiKTtcclxuICAgICAgdGhpcy5zZWxlY3RUb2tlbiArPSBjb250ZW50Lmxlbmd0aCoxLjVcclxuICAgIH0pXHJcbiAgICBzdG9yeUxpc3QuZm9yRWFjaChzdG9yeT0+e1xyXG4gICAgICBsZXQgY29udGVudDphbnkgPSBzdG9yeT8uZ2V0KFwiY29udGVudEpzb25cIik7XHJcbiAgICAgIGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShjb250ZW50KTtcclxuICAgICAgY29udGVudCA9IGNvbnRlbnQ/LnJlcGxhY2VBbGwoXCJcXG5cXG5cIixcIlxcblwiKTtcclxuICAgICAgY29uc29sZS5sb2coY29udGVudClcclxuICAgICAgdGhpcy5zZWxlY3RUb2tlbiArPSBjb250ZW50Lmxlbmd0aCoxLjVcclxuICAgIH0pXHJcbiAgICB0aGlzLm9uVG9rZW5DaGFuZ2UuZW1pdCh0aGlzLnNlbGVjdFRva2VuKVxyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0VG9rZW5cclxuICB9XHJcbiAgYXN5bmMgY29uZmlybVNlbGVjdGVkTGlzdCgpe1xyXG4gICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuZ2V0QWxsU2VsZWN0RG9jdW1lbnQoKVxyXG4gICAgbGV0IGRvY3VtZW50TGlzdDpBcnJheTxQYXJzZS5PYmplY3Q+ID0gcmVzdWx0Py5kb2N1bWVudExpc3QgfHwgW11cclxuICAgIGxldCBzdG9yeUxpc3Q6QXJyYXk8UGFyc2UuT2JqZWN0PiA9ICByZXN1bHQ/LnN0b3J5TGlzdCB8fCBbXVxyXG5cclxuICAgIHRoaXMub25Db25maXJtU2VsZWN0LmVtaXQoe1xyXG4gICAgICBzdG9yeUxpc3Q6IHN0b3J5TGlzdCxcclxuICAgICAgZG9jdW1lbnRMaXN0OiBkb2N1bWVudExpc3RcclxuICAgIH0pXHJcbiAgIFxyXG5cclxuICB9XHJcblxyXG4gIGFzeW5jIGdldEFsbFNlbGVjdERvY3VtZW50KCl7XHJcbiAgICBsZXQgZG9jdW1lbnRMaXN0OkFycmF5PFBhcnNlLk9iamVjdD4gPSBbXVxyXG4gICAgbGV0IHN0b3J5TGlzdDpBcnJheTxQYXJzZS5PYmplY3Q+ID0gW11cclxuICAgICAvLyDnrZvpgInlt7LpgInmlYXkuotcclxuICAgICB0aGlzLnN0b3J5U2Vydi5zdG9yeUxpc3Q/LmZvckVhY2goaXRlbT0+e1xyXG4gICAgICBpZihpdGVtPy5zdG9yeT8uaWQmJnRoaXMuY2hlY2tlZE1hcFtpdGVtPy5zdG9yeT8uaWR8fCduZXcnXSl7XHJcbiAgICAgICAgc3RvcnlMaXN0LnB1c2goaXRlbT8uc3RvcnkpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgICAvLyDliqDovb3nn6Xor4bmlofmoaNcclxuICAgIGxldCBtZDVMaXN0ID0gc3RvcnlMaXN0Py5tYXAoKGl0ZW06YW55KT0+aXRlbT8uZ2V0KFwiYXR0YWNoXCIpPy5nZXQoXCJtZDVcIikpXHJcbiAgICBtZDVMaXN0ID0gbWQ1TGlzdD8uZmlsdGVyKGl0ZW09Pml0ZW0pO1xyXG4gICAgaWYobWQ1TGlzdD8ubGVuZ3RoKXtcclxuICAgICAgbGV0IHF1ZXJ5ID0gbmV3IFBhcnNlLlF1ZXJ5KFwiRG9jdW1lbnRcIik7XHJcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJ0eXBlXCIsXCJlbnRpcmVcIikgLy8g5LuF5Yqg6L295pW056+H5paH5qGj77yM5pyq5YiG5Ymy5ZCR6YePXHJcbiAgICAgIHF1ZXJ5LmxpbWl0KDIwMCk7XHJcbiAgICAgIGNvbnNvbGUubG9nKFwibWQ1TGlzdFwiLG1kNUxpc3QpXHJcbiAgICAgIHF1ZXJ5LmNvbnRhaW5lZEluKFwibWQ1XCIsbWQ1TGlzdCk7XHJcbiAgICAgIGRvY3VtZW50TGlzdCA9IGF3YWl0IHF1ZXJ5LmZpbmQoKVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHtkb2N1bWVudExpc3Qsc3RvcnlMaXN0fVxyXG4gIH1cclxuXHJcbiAgQE91dHB1dCgpIG9uQ29uZmlybVNlbGVjdDpFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PlxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSByb3V0ZTpBY3RpdmF0ZWRSb3V0ZSxcclxuICAgIHByaXZhdGUgbG9hZGluZ0N0cmw6IExvYWRpbmdDb250cm9sbGVyLFxyXG4gICAgcHVibGljIGRpYWxvZzogTWF0RGlhbG9nLFxyXG4gICAgcHJpdmF0ZSByb3V0ZXI6Um91dGVyLFxyXG4gICAgcHVibGljIHN0b3J5U2VydjpTdG9yeVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNoYXRTZXJ2OkNoYXRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhbGVydEN0cmw6QWxlcnRDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBtb2RhbEN0cmw6TW9kYWxDb250cm9sbGVyLFxyXG4gICAgcHJpdmF0ZSBuYXZDdHJsOk5hdkNvbnRyb2xsZXIsXHJcbiAgICBwcml2YXRlIG5jbG91ZDpOb3ZhQ2xvdWRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBudXBsb2FkOk5vdmFVcGxvYWRTZXJ2aWNlLFxyXG4gICkgeyBcclxuXHJcbiAgfVxyXG5cclxuICBhc3luYyBuZ09uSW5pdCgpIHtcclxuICAgIGlmKCF0aGlzLnBlcnNvbj8uaWQgfHwgdGhpcy5ib29rPy5pZCl7XHJcbiAgICAgIGxldCBpZCA9IHRoaXMucm91dGUuc25hcHNob3QucGFyYW1zPy5bXCJpZFwiXSB8fCB0aGlzLnJvdXRlPy5wYXJlbnQ/LnNuYXBzaG90Py5wYXJhbXM/LltcImlkXCJdXHJcbiAgICAgIGlmKGxvY2F0aW9uPy5wYXRobmFtZT8uaW5kZXhPZihcImVkaXRvci9ib29rXCIpPi0xKXtcclxuICAgICAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJCb29rXCIpO1xyXG4gICAgICAgIHF1ZXJ5LmluY2x1ZGUoXCJwZXJzb25cIilcclxuICAgICAgICB0aGlzLmJvb2sgPSBhd2FpdCBxdWVyeS5nZXQoaWQpO1xyXG4gICAgICAgIHRoaXMucGVyc29uID0gdGhpcy5ib29rLmdldChcInBlcnNvblwiKTtcclxuICAgICAgfVxyXG4gICAgICBpZihsb2NhdGlvbj8ucGF0aG5hbWU/LmluZGV4T2YoXCJlZGl0b3IvcGVyc29uXCIpPi0xKXtcclxuICAgICAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJQZXJzb25cIik7XHJcbiAgICAgICAgdGhpcy5wZXJzb24gPSBhd2FpdCBxdWVyeS5nZXQoaWQpXHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGF3YWl0IHRoaXMubG9hZFN0b3J5KClcclxuICAgIGlmKHRoaXMuc3RvcnlTZXJ2LnN0b3J5TGlzdD8ubGVuZ3RoPT0wKXtcclxuICAgICAgdGhpcy5uZXdTdG9yeSgpXHJcbiAgICB9XHJcbiAgfVxyXG4gIGdldEFydGljbGVEb2NMaXN0KCl7XHJcbiAgICBsZXQgZG9jTWFwID0ge31cclxuICAgIGxldCBvdXRsaW5lSnNvbiA9IHRoaXMuYXJ0aWNsZT8uZ2V0KFwib3V0bGluZUpzb25cIik7XHJcbiAgICBsZXQgc2VjdGlvbnMgPSBvdXRsaW5lSnNvbj8uc2VjdGlvbnM7XHJcbiAgICBzZWN0aW9ucz8uZm9yRWFjaChzZWN0aW9uPT57XHJcbiAgICAgIGxldCBsaXN0ID0gc2VjdGlvbj8uZG9jTGlzdDtcclxuICAgICAgbGlzdD8uZm9yRWFjaChkb2NJZD0+e1xyXG4gICAgICAgIGlmKGRvY01hcFtkb2NJZF0pIHJldHVybjsgLy8g5bey5a2Y5Zyo5YiZ6Lez6L+H6YCJ5oupXHJcbiAgICAgICAgZG9jTWFwW2RvY0lkXSA9IHRydWU7XHJcbiAgICAgICAgdGhpcy5jaGVja2VkTWFwW2RvY0lkXSA9IHRydWU7IC8vIOmihOmAieWkp+e6suW3sumAieaVheS6i1xyXG4gICAgICB9KVxyXG4gICAgfSlcclxuICAgIGNvbnNvbGUubG9nKE9iamVjdC5rZXlzKGRvY01hcCkpXHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZG9jTWFwKSB8fCBbXVxyXG4gIH1cclxuICBhc3luYyBsb2FkU3RvcnkoKXtcclxuICAgIHRoaXMuc3RvcnlTZXJ2LnN0b3J5TGlzdCA9IFtdXHJcbiAgICBsZXQgJG9yQXJyYXk6QXJyYXk8YW55PiA9IFtdXHJcblxyXG4gICAgLy8g5Lmm57GN5aSn57qy5bey5pyJ5pWw5o2uXHJcbiAgICBsZXQgYXJ0aWNsZURvY0xpc3RcclxuICAgIGlmKHRoaXMuYXJ0aWNsZT8uaWQpe1xyXG4gICAgICBhcnRpY2xlRG9jTGlzdCA9IGF3YWl0IHRoaXMuZ2V0QXJ0aWNsZURvY0xpc3QoKTtcclxuICAgICAgaWYoYXJ0aWNsZURvY0xpc3Q/Lmxlbmd0aCl7XHJcbiAgICAgICAgJG9yQXJyYXkucHVzaCh7b2JqZWN0SWQ6eyRpbjphcnRpY2xlRG9jTGlzdH19KVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYodGhpcy5wZXJzb24/LmlkICYmIHRoaXMuY3VycmVudFRhYj09XCLkuLvop5LmlbDmja5cIil7XHJcbiAgICAgIGxldCBwZXJzb25Qb2ludGVyID0ge19fdHlwZTpcIlBvaW50ZXJcIixjbGFzc05hbWU6XCJQZXJzb25cIixvYmplY3RJZDp0aGlzLnBlcnNvbi5pZH1cclxuICAgICAgJG9yQXJyYXkucHVzaCh7cGVyc29uOnBlcnNvblBvaW50ZXJ9KTtcclxuICAgIH1cclxuICAgIGlmKHRoaXMuYm9vaz8uaWQgJiYgdGhpcy5jdXJyZW50VGFiPT1cIuS4u+inkuaVsOaNrlwiKXtcclxuICAgICAgbGV0IGJvb2tQb2ludGVyID0ge19fdHlwZTpcIlBvaW50ZXJcIixjbGFzc05hbWU6XCJCb29rXCIsb2JqZWN0SWQ6dGhpcy5ib29rLmlkfVxyXG4gICAgICAkb3JBcnJheS5wdXNoKHtib29rOmJvb2tQb2ludGVyfSk7XHJcbiAgICB9XHJcbiAgICBpZihQYXJzZS5Vc2VyLmN1cnJlbnQoKT8uaWQpe1xyXG4gICAgICAkb3JBcnJheS5wdXNoKHt1c2VyOiBQYXJzZS5Vc2VyLmN1cnJlbnQoKT8udG9Qb2ludGVyKCl9KTtcclxuICAgIH1cclxuICAgIGlmKCEkb3JBcnJheT8ubGVuZ3RoKXsgLy8g5b+F6aG75ruh6Laz5p2h5Lu25omN5Y+v5Yqg6L295pCc57SiXHJcbiAgICAgIHJldHVyblxyXG4gICAgfVxyXG4gICAgbGV0IHF1ZXJ5ID0gUGFyc2UuUXVlcnkuZnJvbUpTT04oXCJTdG9yeVwiLHtcclxuICAgICAgd2hlcmU6e1xyXG4gICAgICAgICRvcjokb3JBcnJheVxyXG4gICAgICB9XHJcbiAgICB9KVxyXG4gICAgcXVlcnkuaW5jbHVkZShcImF0dGFjaFwiLFwiY2hhdFNlc3Npb25cIixcInBlcnNvblwiKTtcclxuXHJcbiAgICBpZih0aGlzLnN0b3J5VHlwZSl7XHJcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJ0eXBlXCIsdGhpcy5zdG9yeVR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYodGhpcy5jdXJyZW50VGFiPT1cIuS4u+inkuaVsOaNrlwiKXtcclxuICAgICAgcXVlcnkuZXF1YWxUbyhcInBlcnNvblwiLHRoaXMucGVyc29uPy5pZClcclxuICAgIH1cclxuICAgIGlmKHRoaXMuY3VycmVudFRhYj09XCLkuabnsY3mlbDmja5cIil7XHJcbiAgICAgIHF1ZXJ5LmVxdWFsVG8oXCJib29rXCIsdGhpcy5ib29rPy5pZClcclxuICAgIH1cclxuXHJcbiAgICBxdWVyeS5ub3RFcXVhbFRvKFwiaXNEZWxldGVkXCIsdHJ1ZSlcclxuICAgIHF1ZXJ5LmFkZERlc2NlbmRpbmcoXCJjcmVhdGVkQXRcIik7XHJcbiAgICBsZXQgc3RvcnlzID0gYXdhaXQgcXVlcnkuZmluZCgpO1xyXG4gICAgdGhpcy5zdG9yeVNlcnYuc3RvcnlMaXN0ID0gc3RvcnlzLm1hcChpdGVtPT5uZXcgQWdlbnRTdG9yeShpdGVtLHVuZGVmaW5lZCx1bmRlZmluZWQpKVxyXG4gICAgdGhpcy5jdXJyZW50U3RvcnkgPSB0aGlzLnN0b3J5U2Vydi5zdG9yeUxpc3Q/LlswXVxyXG4gICAgLy8g5Yqg6L295Y676YeN5YWz6ZSu6K+NXHJcbiAgICAvLyBxdWVyeS5zZWxlY3QoXCJrZXl3b3Jkc1wiKVxyXG4gICAgLy8gbGV0IHJlc3VsdCA9IGF3YWl0IHF1ZXJ5LmRpc3RpbmN0KFwia2V5d29yZHNcIik7XHJcbiAgICAvLyBjb25zb2xlLmxvZyhyZXN1bHQpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGhpcy5jaGVja2VkTWFwKVxyXG4gICAgLy8g5Yi35paw5bey6YCJ5pWF5LqL57uf6K6hXHJcbiAgICAgIHRoaXMuc2VsZWN0Q291bnQgPSBPYmplY3QudmFsdWVzKHRoaXMuY2hlY2tlZE1hcCk/LmZpbHRlcihpdGVtPT5pdGVtKT8ubGVuZ3RoIHx8IDBcclxuICAgICAgdGhpcy5vbkNvdW50Q2hhbmdlLmVtaXQodGhpcy5zZWxlY3RDb3VudClcclxuICAgICAgdGhpcy5jYWxjU2VsZWN0VG9rZW5zKClcclxuICB9XHJcbiAgbmV3U3RvcnkoKXtcclxuICAgIHRoaXMuY3VycmVudFN0b3J5ID0gdGhpcy5zdG9yeVNlcnYubmV3U3Rvcnkoe3BlcnNvbjp0aGlzLnBlcnNvbixib29rOnRoaXMuYm9va30pXHJcblxyXG4gICAgaWYodGhpcy5jdXJyZW50U3Rvcnkpe1xyXG4gICAgICB0aGlzLnByZXZpZXdTdG9yeSh0aGlzLmN1cnJlbnRTdG9yeSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIHByZXZpZXdTdG9yeShldmVudDphbnkpe1xyXG5cclxuICAgIGxldCBzdG9yeTpBZ2VudFN0b3J5ID0gZXZlbnQ7XHJcbiAgICB0aGlzLm9uUHJldmlld1N0b3J5LmVtaXQoc3RvcnkpXHJcblxyXG4gICAgaWYoZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aDwxMDAwKXsgLy8g5omL5py656uv5by556qX6aKE6KeIXHJcbiAgICAgICAgaWYoc3Rvcnk/LnN0b3J5KXtcclxuICAgICAgICAgICAgcHJldmlld1N0b3J5TW9iaWxlKHN0b3J5Py5zdG9yeSx7XHJcbiAgICAgICAgICAgICAgY2hhdFNlcnY6dGhpcy5jaGF0U2VydixcclxuICAgICAgICAgICAgICBhbGVydEN0cmw6dGhpcy5hbGVydEN0cmwsXHJcbiAgICAgICAgICAgICAgbW9kYWxDdHJsOnRoaXMubW9kYWxDdHJsLFxyXG4gICAgICAgICAgICAgIG5hdkN0cmw6dGhpcy5uYXZDdHJsLFxyXG4gICAgICAgICAgICAgIG5jbG91ZDp0aGlzLm5jbG91ZCxcclxuICAgICAgICAgICAgICBudXBsb2FkOnRoaXMubnVwbG9hZCxcclxuICAgICAgICAgICAgfSlcclxuICAgICAgICB9O1xyXG4gICAgICAgIHJldHVyblxyXG4gICAgfVxyXG5cclxuXHJcbiAgICB0aGlzLmN1cnJlbnRTdG9yeSA9IHVuZGVmaW5lZDtcclxuXHJcbiAgICBsZXQgZHVyYXRpb24gPSBzdG9yeT8uc3Rvcnk/LmdldChcImF0dGFjaFwiKT8uaWQ/MTAwMDoxMDA7XHJcbiAgICBjb25zdCBsb2FkaW5nID0gYXdhaXQgdGhpcy5sb2FkaW5nQ3RybC5jcmVhdGUoe1xyXG4gICAgICBtZXNzYWdlOiAn5pWF5LqL5riy5p+T5LitLi4uJyxcclxuICAgICAgZHVyYXRpb246IGR1cmF0aW9uLFxyXG4gICAgfSk7XHJcbiAgICBsb2FkaW5nLnByZXNlbnQoKTtcclxuICAgIHRoaXMuY3VycmVudFN0b3J5ID0gc3RvcnlcclxuXHJcbiAgfVxyXG4gIGFzeW5jIGRlc3Ryb3lTdG9yeShldmVudDphbnksaW5kZXg6bnVtYmVyKXtcclxuICAgIGxldCBzdG9yeTpBZ2VudFN0b3J5ID0gZXZlbnQ7XHJcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKERpYWxvZ0RlbGV0ZVN0b3J5RGlhbG9nLCB7XHJcbiAgICAgIGRhdGE6IHt9LFxyXG4gICAgfSk7XHJcblxyXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKGFzeW5jIChpc0NvbmZpcm06Ym9vbGVhbikgPT4ge1xyXG4gICAgICBpZihpc0NvbmZpcm0pe1xyXG4gICAgICAgIGlmKHN0b3J5Py5zdG9yeT8uaWQpe1xyXG4gICAgICAgICAgc3Rvcnkuc3Rvcnkuc2V0KFwiaXNEZWxldGVkXCIsdHJ1ZSk7XHJcbiAgICAgICAgICBhd2FpdCBzdG9yeS5zdG9yeS5zYXZlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuc3RvcnlTZXJ2LnN0b3J5TGlzdD8uc3BsaWNlKGluZGV4LDEpO1xyXG4gICAgICAgIC8vIOWIoOmZpOWQjuWKoOi9vemmluadoeaVheS6i1xyXG4gICAgICAgIGlmKHRoaXMuc3RvcnlTZXJ2LnN0b3J5TGlzdD8uWzBdKXtcclxuICAgICAgICAgIHRoaXMucHJldmlld1N0b3J5KHRoaXMuc3RvcnlTZXJ2LnN0b3J5TGlzdD8uWzBdKTtcclxuICAgICAgICB9ZWxzZXtcclxuICAgICAgICAgIHRoaXMuY3VycmVudFN0b3J5ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm5cclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gIFxyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2RlbGV0ZS1zdG9yeS1kaWFsb2cnLFxyXG4gIHRlbXBsYXRlVXJsOiAnZGVsZXRlLXN0b3J5LWRpYWxvZy5odG1sJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtNYXREaWFsb2dNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEaWFsb2dEZWxldGVTdG9yeURpYWxvZyB7XHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwdWJsaWMgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8RGlhbG9nRGVsZXRlU3RvcnlEaWFsb2c+LFxyXG4gICAgQEluamVjdChNQVRfRElBTE9HX0RBVEEpIHB1YmxpYyBkYXRhOiBhbnksXHJcbiAgKSB7fVxyXG59XHJcblxyXG4iLCI8IS0tIFxyXG4gIDxpb24taGVhZGVyPlxyXG4gICAgPGlvbi10b29sYmFyPlxyXG4gICAgICA8aW9uLXRpdGxlPuefpeivhuW6kzwvaW9uLXRpdGxlPlxyXG4gICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxyXG4gICAgICAgIDxpb24tYnV0dG9uICpuZ0lmPVwiIWlzU2VsZWN0TW9kZVwiIChjbGljayk9XCJuZXdTdG9yeSgpXCIgW3N0cm9uZ109XCJ0cnVlXCI+5paw5bu6PC9pb24tYnV0dG9uPlxyXG4gICAgICA8L2lvbi1idXR0b25zPlxyXG4gICAgPC9pb24tdG9vbGJhcj5cclxuICA8L2lvbi1oZWFkZXI+XHJcbiAgPGlvbi1jb250ZW50PiAtLT5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwicGFnZVwiPlxyXG5cclxuICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXJcIj5cclxuICAgICAgPCEtLSA8YnV0dG9uIG1hdC1pY29uLWJ1dHRvbiBjbGFzcz1cImV4YW1wbGUtaWNvblwiIGFyaWEtbGFiZWw9XCJFeGFtcGxlIGljb24tYnV0dG9uIHdpdGggbWVudSBpY29uXCI+XHJcbiAgICAgICAgPG1hdC1pY29uPm1lbnU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj4gLS0+XHJcblxyXG4gICAgICA8IS0tIOefpeivhuW6k+WIh+aNoiAtLT5cclxuICAgICAgPGlvbi1jaGlwPlxyXG4gICAgICAgIDxpb24tYXZhdGFyPlxyXG4gICAgICAgICAgPGltZyBhbHQ9XCLop5LoibLlpLTlg49cIiBbc3JjXT1cImRlZmF1bHRBdmF0YXJcIiAvPlxyXG4gICAgICAgIDwvaW9uLWF2YXRhcj5cclxuICAgICAgICA8aW9uLWxhYmVsPuaVheS6i+WNoeeJhzwvaW9uLWxhYmVsPlxyXG4gICAgICAgIDxpb24taWNvbiBuYW1lPVwic3dhcC12ZXJ0aWNhbC1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgPC9pb24tY2hpcD5cclxuXHJcbiAgICAgIDxzcGFuIGNsYXNzPVwiZXhhbXBsZS1zcGFjZXJcIj48L3NwYW4+XHJcblxyXG5cclxuICAgICAgPCEtLSDmt7vliqDmlYXkuosgLS0+XHJcbiAgICAgICBAaWYoZmFsc2Upe1xyXG4gICAgICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwibmV3U3RvcnkoKVwiICpuZ0lmPVwiIWlzU2VsZWN0TW9kZVwiPlxyXG4gICAgICAgICAgIDxzcGFuIG56LWljb24gbnpUeXBlPVwicGx1c1wiIG56VGhlbWU9XCJvdXRsaW5lXCI+PC9zcGFuPiDkuIrkvKBcclxuICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgIDwhLS0g6YCJ5oup54q25oCBIC0tPlxyXG4gICAgICA8YnV0dG9uIG1hdC1idXR0b24gY29sb3I9XCJwcmltYXJ5XCIgKGNsaWNrKT1cImNhbmNlbCgpXCIgKm5nSWY9XCJpc1NlbGVjdE1vZGVcIiBzdHlsZT1cIm1hcmdpbi1sZWZ0OjVweDtcIj5cclxuICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInBsdXNcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj4g5Y+W5raIXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8YnV0dG9uIG1hdC1mbGF0LWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIiAoY2xpY2spPVwiY29uZmlybVNlbGVjdGVkTGlzdCgpXCIgKm5nSWY9XCJpc1NlbGVjdE1vZGVcIj5cclxuICAgICAgICA8c3BhbiBuei1pY29uIG56VHlwZT1cInBsdXNcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj4g56Gu6K6k6YCJ5oupXHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8IS0tIDxidXR0b24gbWF0LWljb24tYnV0dG9uIGNsYXNzPVwiZXhhbXBsZS1pY29uIGZhdm9yaXRlLWljb25cIiBhcmlhLWxhYmVsPVwiRXhhbXBsZSBpY29uLWJ1dHRvbiB3aXRoIGhlYXJ0IGljb25cIj5cclxuICAgICAgICA8bWF0LWljb24+ZmF2b3JpdGU8L21hdC1pY29uPlxyXG4gICAgICA8L2J1dHRvbj4gLS0+XHJcbiAgICAgIDxidXR0b24gIGlkPVwidHJpZ2dlci1idXR0b25cIiBtYXQtaWNvbi1idXR0b24gY2xhc3M9XCJleGFtcGxlLWljb25cIiBhcmlhLWxhYmVsPVwiRXhhbXBsZSBpY29uLWJ1dHRvbiB3aXRoIHNoYXJlIGljb25cIj5cclxuICAgICAgICA8bWF0LWljb24+dHVuZTwvbWF0LWljb24+XHJcbiAgICAgIDwvYnV0dG9uPlxyXG4gICAgICA8aW9uLXBvcG92ZXIgdHJpZ2dlcj1cInRyaWdnZXItYnV0dG9uXCIgc2l6ZT1cImF1dG9cIiBzaWRlPVwiYm90dG9tXCIgYWxpZ25tZW50PVwiZW5kXCIgc3R5bGU9XCItLXdpZHRoOiAzNCU7bWFyZ2luLWxlZnQ6IDAlO1wiPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZT5cclxuICAgICAgICAgIDxpb24tY29udGVudCBjbGFzcz1cImlvbi1wYWRkaW5nXCI+XHJcbiAgICAgICAgICAgIDxpb24taXRlbS1ncm91cD5cclxuICAgICAgICAgICAgICAgIDxpb24taXRlbS1kaXZpZGVyPlxyXG4gICAgICAgICAgICAgICAgICA8aW9uLWxhYmVsPuexu+WeizwvaW9uLWxhYmVsPlxyXG4gICAgICAgICAgICAgICAgPC9pb24taXRlbS1kaXZpZGVyPlxyXG4gICAgICAgICAgICAgICAgPGlvbi1pdGVtIGxpbmVzPVwibm9uZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtbGlzdGJveCBbdmFsdWVdPVwic3RvcnlUeXBlXCIgYXJpYS1sYWJlbD1cIuexu+Wei1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1vcHRpb24gKGNsaWNrKT1cImNoYW5nZVN0b3J5VHlwZSgnJylcIiB2YWx1ZT1cIlwiPuWFqOmDqDwvbWF0LWNoaXAtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1vcHRpb24gKGNsaWNrKT1cImNoYW5nZVN0b3J5VHlwZSgnZG9jdW1lbnQnKVwiIHZhbHVlPVwiZG9jdW1lbnRcIj7mlofmoaM8L21hdC1jaGlwLW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8bWF0LWNoaXAtb3B0aW9uIChjbGljayk9XCJjaGFuZ2VTdG9yeVR5cGUoJ2NoYXQnKVwiIHZhbHVlPVwiY2hhdFwiPuiBiuWkqTwvbWF0LWNoaXAtb3B0aW9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxtYXQtY2hpcC1vcHRpb24gKGNsaWNrKT1cImNoYW5nZVN0b3J5VHlwZSgnZGlhcnknKVwiIHZhbHVlPVwiZGlhcnlcIj7ml6XorrA8L21hdC1jaGlwLW9wdGlvbj5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2hpcC1vcHRpb24gY29sb3I9XCJhY2NlbnRcIiBzZWxlY3RlZD5BY2NlbnQgZmlzaDwvbWF0LWNoaXAtb3B0aW9uPiAtLT5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIDxtYXQtY2hpcC1vcHRpb24gY29sb3I9XCJ3YXJuXCI+V2FybiBmaXNoPC9tYXQtY2hpcC1vcHRpb24+IC0tPlxyXG4gICAgICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Rib3g+XHJcbiAgICAgICAgICAgICAgICA8L2lvbi1pdGVtPlxyXG4gICAgICAgICAgICA8L2lvbi1pdGVtLWdyb3VwPlxyXG4gICAgICAgICAgICBcclxuICAgICAgICAgIDwvaW9uLWNvbnRlbnQ+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9pb24tcG9wb3Zlcj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDwhLS0g6YCJ5oup5qih5byP77ya6YCJ5oup5pWw5o2uIC0tPlxyXG4gICAgQGlmKHNlbGVjdENvdW50JiZzZWxlY3RUb2tlbil7XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJzZWxlY3RcIj5cclxuICAgICAgICA8c3Bhbj7lt7LpgIkge3tzZWxlY3RDb3VudHx8MH195LiqPC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIHN0eWxlPVwibWFyZ2luLWxlZnQ6M3B4O1wiPue6pnt7c2VsZWN0VG9rZW58fDB9fXRva2Vuczwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICB9XHJcbiAgIFxyXG4gICAgPGRpdiBjbGFzcz1cImxpc3RcIj5cclxuXHJcblxyXG4gICAgICAgPCEtLSDliIfmjaLnrZvpgInnsbvlnovvvIjop5LoibLmlYXkuovjgIHkuabnsY3mlYXkuovjgIHnlKjmiLfmlYXkuovvvIkgLS0+XHJcbiAgICAgICBAaWYocGVyc29uPy5pZCB8fCBib29rPy5pZCl7XHJcbiAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIG5hbWU9XCJmb250U3R5bGVcIj5cclxuICAgICAgICAgICAgPG1hdC1idXR0b24tdG9nZ2xlIChjbGljayk9XCJjdXJyZW50VGFiPSfmiJHnmoQnO2xvYWRTdG9yeSgpXCIgKm5nSWY9XCJwZXJzb24/LmlkIHx8IGJvb2s/LmlkXCIgW2NoZWNrZWRdPVwiY3VycmVudFRhYj09J+aIkeeahCdcIj5cclxuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJ1c2VyXCIgbnpUaGVtZT1cIm91dGxpbmVcIj48L3NwYW4+IOaIkeeahFxyXG4gICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgICAgICAgIDxtYXQtYnV0dG9uLXRvZ2dsZSAoY2xpY2spPVwiY3VycmVudFRhYj0n5Li76KeSJztsb2FkU3RvcnkoKVwiICpuZ0lmPVwicGVyc29uPy5pZFwiIFtjaGVja2VkXT1cImN1cnJlbnRUYWI9PSfkuLvop5InXCI+XHJcbiAgICAgICAgICAgIDxzcGFuIG56LWljb24gbnpUeXBlPVwidXNlclwiIG56VGhlbWU9XCJvdXRsaW5lXCI+PC9zcGFuPiDkuLvop5JcclxuICAgICAgICAgIDwvbWF0LWJ1dHRvbi10b2dnbGU+XHJcbiAgICAgICAgICA8bWF0LWJ1dHRvbi10b2dnbGUgKGNsaWNrKT1cImN1cnJlbnRUYWI9J+S5puexjSc7bG9hZFN0b3J5KClcIiAqbmdJZj1cImJvb2s/LmlkXCIgW2NoZWNrZWRdPVwiY3VycmVudFRhYj09J+S5puexjSdcIj5cclxuICAgICAgICAgICAgPHNwYW4gbnotaWNvbiBuelR5cGU9XCJyZWFkXCIgbnpUaGVtZT1cIm91dGxpbmVcIj48L3NwYW4+IOS5puexjVxyXG4gICAgICAgICAgPC9tYXQtYnV0dG9uLXRvZ2dsZT5cclxuICAgICAgICA8L21hdC1idXR0b24tdG9nZ2xlLWdyb3VwPlxyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICA8IS0tIOaVheS6i+WNoeeJhyAtLT5cclxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc3Rvcnkgb2Ygc3RvcnlTZXJ2LnN0b3J5TGlzdDtsZXQgaW5kZXg9aW5kZXg7XCI+XHJcbiAgICAgICAgPGZtLXN0b3J5LWNhcmQgY2xhc3M9XCJsaXN0LWl0ZW1cIiBbc3RvcnldPVwic3Rvcnk/LnN0b3J5XCIgW2lzU2VsZWN0TW9kZV09XCJpc1NlbGVjdE1vZGVcIiBcclxuICAgICAgICBbKGNoZWNrZWQpXT1cImNoZWNrZWRNYXBbc3Rvcnk/LnN0b3J5Py5pZHx8JyddXCJcclxuICAgICAgICAob25DaGVja1N0b3J5KT1cImNoZWNrU3RvcnkoJGV2ZW50KVwiIFxyXG4gICAgICAgIChvblByZXZpZXdTdG9yeSk9XCJwcmV2aWV3U3RvcnkoJGV2ZW50KVwiXHJcbiAgICAgICAgKG9uRGVzdG9yeVN0b3J5KT1cImRlc3Ryb3lTdG9yeSgkZXZlbnQsaW5kZXgpXCJcclxuICAgICAgICA+PC9mbS1zdG9yeS1jYXJkPlxyXG4gICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvZGl2PlxyXG4gIDwhLS0gPC9pb24tY29udGVudD4gLS0+XHJcbjwvZGl2PlxyXG4iLCI8aDEgbWF0LWRpYWxvZy10aXRsZT7liKDpmaTmlYXkuos8L2gxPlxyXG48ZGl2IG1hdC1kaWFsb2ctY29udGVudD5cclxuICDor7fpl67mgqjopoHliKDpmaTor6XmlYXkuovlj4rlhbbmiYDmnInnur/ntKLlkJfvvJ9cclxuPC9kaXY+XHJcbjxkaXYgbWF0LWRpYWxvZy1hY3Rpb25zPlxyXG4gIDxidXR0b24gbWF0LWJ1dHRvbiBtYXQtZGlhbG9nLWNsb3NlIGNka0ZvY3VzSW5pdGlhbD7lj5bmtog8L2J1dHRvbj5cclxuICA8YnV0dG9uIG1hdC1idXR0b24gW21hdC1kaWFsb2ctY2xvc2VdPVwidHJ1ZVwiIGNvbG9yPVwid2FyblwiPuWIoOmZpDwvYnV0dG9uPlxyXG48L2Rpdj4iXX0=
|
|
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/story/fm-story-list/fm-story-list.component.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{CommonModule}from"@angular/common";import{Component,EventEmitter,Inject,Input,Output}from"@angular/core";import{FormsModule,ReactiveFormsModule}from"@angular/forms";import{MatButtonModule}from"@angular/material/button";import{MatButtonToggleModule}from"@angular/material/button-toggle";import{MatCardModule}from"@angular/material/card";import{MatCheckboxModule}from"@angular/material/checkbox";import{MatDialog,MatDialogModule,MatDialogRef,MAT_DIALOG_DATA}from"@angular/material/dialog";import{MatDividerModule}from"@angular/material/divider";import{MatIconModule}from"@angular/material/icon";import{MatProgressBarModule}from"@angular/material/progress-bar";import{FmStoryCardComponent}from"../fm-story-card/fm-story-card.component";import{FmodeParse,FmodeObject}from"@fmode/parse";import{AgentStory}from"../../../core";import{ActivatedRoute,Router}from"@angular/router";import{LoadingController}from"@ionic/angular";import{StoryService}from"../story.service";import{AlertController,IonAvatar,IonChip,IonContent,IonIcon,IonItem,IonItemDivider,IonItemGroup,IonLabel,IonPopover,ModalController,NavController}from"@ionic/angular/standalone";import{MatToolbarModule}from"@angular/material/toolbar";import{MatChipListbox,MatChipsModule}from"@angular/material/chips";import{avatarIcon}from"../../../icon/filetype";import{previewStoryMobile}from"./story-preview";import{addIcons}from"ionicons";import*as icons from"ionicons/icons";import{ChatService}from"../../service-fmai/service-chat/chat.service";import{NovaCloudService}from"../../../nova-cloud/nova-cloud.service";import{NovaUploadService}from"../../../storage/service-upload/nova-upload.service";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@ionic/angular";import*as i3 from"@angular/material/dialog";import*as i4 from"../story.service";import*as i5 from"../../service-fmai/service-chat/chat.service";import*as i6 from"@ionic/angular/standalone";import*as i7 from"../../../nova-cloud/nova-cloud.service";import*as i8 from"../../../storage/service-upload/nova-upload.service";import*as i9 from"@angular/common";import*as i10 from"@angular/material/chips";import*as i11 from"@angular/material/button-toggle";import*as i12 from"@angular/material/button";import*as i13 from"@angular/material/icon";const Parse=FmodeParse.with("nova");addIcons(icons);export class FmStoryListComponent{changeStoryType(t){this.storyType=t,this.loadStory()}cancel(){this.onCancel.emit(!0)}checkStory(t){let e=t?.story,o=t?.event;console.log(t),console.log(e,o),e?.story?.id&&(this.checkedMap[e?.story?.id]=o),this.selectCount=Object.values(this.checkedMap)?.filter((t=>t))?.length||0,this.onCountChange.emit(this.selectCount),this.calcSelectTokens()}async calcSelectTokens(){let t=await this.getAllSelectDocument(),e=t?.documentList||[];this.selectToken=0;let o=t?.storyList?.filter((t=>t.get("chatSession")));return e.forEach((t=>{let e=t?.get("pageContent")||"";e=e?.replaceAll("\n\n","\n"),this.selectToken+=1.5*e.length})),o.forEach((t=>{let e=t?.get("contentJson");e=JSON.stringify(e),e=e?.replaceAll("\n\n","\n"),console.log(e),this.selectToken+=1.5*e.length})),this.onTokenChange.emit(this.selectToken),this.selectToken}async confirmSelectedList(){let t=await this.getAllSelectDocument(),e=t?.documentList||[],o=t?.storyList||[];this.onConfirmSelect.emit({storyList:o,documentList:e})}async getAllSelectDocument(){let t=[],e=[];this.storyServ.storyList?.forEach((t=>{t?.story?.id&&this.checkedMap[t?.story?.id||"new"]&&e.push(t?.story)}));let o=e?.map((t=>t?.get("attach")?.get("md5")));if(o=o?.filter((t=>t)),o?.length){let e=new Parse.Query("Document");e.equalTo("type","entire"),e.limit(200),console.log("md5List",o),e.containedIn("md5",o),t=await e.find()}return{documentList:t,storyList:e}}constructor(t,e,o,n,i,a,r,l,s,c,p){this.route=t,this.loadingCtrl=e,this.dialog=o,this.router=n,this.storyServ=i,this.chatServ=a,this.alertCtrl=r,this.modalCtrl=l,this.navCtrl=s,this.ncloud=c,this.nupload=p,this.defaultAvatar=avatarIcon,this.isPreview=!1,this.currentTab="我的",this.height="100%",this.isSelectMode=!1,this.checkedMap={},this.selectCount=0,this.selectToken=0,this.onCancel=new EventEmitter,this.onCountChange=new EventEmitter,this.onTokenChange=new EventEmitter,this.onPreviewStory=new EventEmitter,this.storyType="",this.onConfirmSelect=new EventEmitter}async ngOnInit(){if(!this.person?.id||this.book?.id){let t=this.route.snapshot.params?.id||this.route?.parent?.snapshot?.params?.id;if(location?.pathname?.indexOf("editor/book")>-1){let e=new Parse.Query("Book");e.include("person"),this.book=await e.get(t),this.person=this.book.get("person")}if(location?.pathname?.indexOf("editor/person")>-1){let e=new Parse.Query("Person");this.person=await e.get(t)}}await this.loadStory(),0==this.storyServ.storyList?.length&&this.newStory()}getArticleDocList(){let t={},e=this.article?.get("outlineJson"),o=e?.sections;return o?.forEach((e=>{let o=e?.docList;o?.forEach((e=>{t[e]||(t[e]=!0,this.checkedMap[e]=!0)}))})),console.log(Object.keys(t)),Object.keys(t)||[]}async loadStory(){this.storyServ.storyList=[];let t,e=[];if(this.article?.id&&(t=await this.getArticleDocList(),t?.length&&e.push({objectId:{$in:t}})),this.person?.id&&"主角数据"==this.currentTab){let t={__type:"Pointer",className:"Person",objectId:this.person.id};e.push({person:t})}if(this.book?.id&&"主角数据"==this.currentTab){let t={__type:"Pointer",className:"Book",objectId:this.book.id};e.push({book:t})}if(Parse.User.current()?.id&&e.push({user:Parse.User.current()?.toPointer()}),!e?.length)return;let o=Parse.Query.fromJSON("Story",{where:{$or:e}});o.include("attach","chatSession","person"),this.storyType&&o.equalTo("type",this.storyType),"主角数据"==this.currentTab&&o.equalTo("person",this.person?.id),"书籍数据"==this.currentTab&&o.equalTo("book",this.book?.id),o.notEqualTo("isDeleted",!0),o.addDescending("createdAt");let n=await o.find();this.storyServ.storyList=n.map((t=>new AgentStory(t,void 0,void 0))),this.currentStory=this.storyServ.storyList?.[0],this.selectCount=Object.values(this.checkedMap)?.filter((t=>t))?.length||0,this.onCountChange.emit(this.selectCount),this.calcSelectTokens()}newStory(){this.currentStory=this.storyServ.newStory({person:this.person,book:this.book}),this.currentStory&&this.previewStory(this.currentStory)}async previewStory(t){let e=t;if(this.onPreviewStory.emit(e),document.body.clientWidth<1e3)return void(e?.story&&previewStoryMobile(e?.story,{chatServ:this.chatServ,alertCtrl:this.alertCtrl,modalCtrl:this.modalCtrl,navCtrl:this.navCtrl,ncloud:this.ncloud,nupload:this.nupload}));this.currentStory=void 0;let o=e?.story?.get("attach")?.id?1e3:100;(await this.loadingCtrl.create({message:"故事渲染中...",duration:o})).present(),this.currentStory=e}async destroyStory(t,e){let o=t;this.dialog.open(DialogDeleteStoryDialog,{data:{}}).afterClosed().subscribe((async t=>{if(t)return o?.story?.id&&(o.story.set("isDeleted",!0),await o.story.save()),this.storyServ.storyList?.splice(e,1),void(this.storyServ.storyList?.[0]?this.previewStory(this.storyServ.storyList?.[0]):this.currentStory=void 0)}))}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryListComponent,deps:[{token:i1.ActivatedRoute},{token:i2.LoadingController},{token:i3.MatDialog},{token:i1.Router},{token:i4.StoryService},{token:i5.ChatService},{token:i6.AlertController},{token:i6.ModalController},{token:i6.NavController},{token:i7.NovaCloudService},{token:i8.NovaUploadService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmStoryListComponent,isStandalone:!0,selector:"fm-story-list",inputs:{id:"id",article:"article",person:"person",book:"book",isSelectMode:"isSelectMode"},outputs:{onCancel:"onCancel",onCountChange:"onCountChange",onTokenChange:"onTokenChange",onPreviewStory:"onPreviewStory",onConfirmSelect:"onConfirmSelect"},ngImport:i0,template:'\x3c!-- \n <ion-header>\n <ion-toolbar>\n <ion-title>知识库</ion-title>\n <ion-buttons slot="end">\n <ion-button *ngIf="!isSelectMode" (click)="newStory()" [strong]="true">新建</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content> --\x3e\n\n <div class="page">\n\n <div class="filter">\n \x3c!-- <button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">\n <mat-icon>menu</mat-icon>\n </button> --\x3e\n\n \x3c!-- 知识库切换 --\x3e\n <ion-chip>\n <ion-avatar>\n <img alt="角色头像" [src]="defaultAvatar" />\n </ion-avatar>\n <ion-label>故事卡片</ion-label>\n <ion-icon name="swap-vertical-outline"></ion-icon>\n </ion-chip>\n\n <span class="example-spacer"></span>\n\n\n \x3c!-- 添加故事 --\x3e\n @if(false){\n <button mat-flat-button color="primary" (click)="newStory()" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 上传\n </button>\n }\n\n \x3c!-- 选择状态 --\x3e\n <button mat-button color="primary" (click)="cancel()" *ngIf="isSelectMode" style="margin-left:5px;">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 取消\n </button>\n <button mat-flat-button color="primary" (click)="confirmSelectedList()" *ngIf="isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 确认选择\n </button>\n \x3c!-- <button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">\n <mat-icon>favorite</mat-icon>\n </button> --\x3e\n <button id="trigger-button" mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">\n <mat-icon>tune</mat-icon>\n </button>\n <ion-popover trigger="trigger-button" size="auto" side="bottom" alignment="end" style="--width: 34%;margin-left: 0%;">\n <ng-template>\n <ion-content class="ion-padding">\n <ion-item-group>\n <ion-item-divider>\n <ion-label>类型</ion-label>\n </ion-item-divider>\n <ion-item lines="none">\n <mat-chip-listbox [value]="storyType" aria-label="类型">\n <mat-chip-option (click)="changeStoryType(\'\')" value="">全部</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'document\')" value="document">文档</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'chat\')" value="chat">聊天</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'diary\')" value="diary">日记</mat-chip-option>\n \x3c!-- <mat-chip-option color="accent" selected>Accent fish</mat-chip-option> --\x3e\n \x3c!-- <mat-chip-option color="warn">Warn fish</mat-chip-option> --\x3e\n </mat-chip-listbox>\n </ion-item>\n </ion-item-group>\n \n </ion-content>\n </ng-template>\n </ion-popover>\n </div>\n\n \x3c!-- 选择模式:选择数据 --\x3e\n @if(selectCount&&selectToken){\n <div class="select">\n <span>已选 {{selectCount||0}}个</span>\n <span style="margin-left:3px;">约{{selectToken||0}}tokens</span>\n </div>\n }\n \n <div class="list">\n\n\n \x3c!-- 切换筛选类型(角色故事、书籍故事、用户故事) --\x3e\n @if(person?.id || book?.id){\n <mat-button-toggle-group name="fontStyle">\n <mat-button-toggle (click)="currentTab=\'我的\';loadStory()" *ngIf="person?.id || book?.id" [checked]="currentTab==\'我的\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 我的\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'主角\';loadStory()" *ngIf="person?.id" [checked]="currentTab==\'主角\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 主角\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'书籍\';loadStory()" *ngIf="book?.id" [checked]="currentTab==\'书籍\'">\n <span nz-icon nzType="read" nzTheme="outline"></span> 书籍\n </mat-button-toggle>\n </mat-button-toggle-group>\n }\n \n \x3c!-- 故事卡片 --\x3e\n <ng-container *ngFor="let story of storyServ.storyList;let index=index;">\n <fm-story-card class="list-item" [story]="story?.story" [isSelectMode]="isSelectMode" \n [(checked)]="checkedMap[story?.story?.id||\'\']"\n (onCheckStory)="checkStory($event)" \n (onPreviewStory)="previewStory($event)"\n (onDestoryStory)="destroyStory($event,index)"\n ></fm-story-card>\n </ng-container>\n </div>\n \x3c!-- </ion-content> --\x3e\n</div>\n',styles:[".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i9.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i9.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:FormsModule},{kind:"ngmodule",type:ReactiveFormsModule},{kind:"ngmodule",type:MatToolbarModule},{kind:"ngmodule",type:MatChipsModule},{kind:"component",type:i10.MatChipListbox,selector:"mat-chip-listbox",inputs:["multiple","aria-orientation","selectable","compareWith","required","hideSingleSelectionIndicator","value"],outputs:["change"]},{kind:"component",type:i10.MatChipOption,selector:"mat-basic-chip-option, [mat-basic-chip-option], mat-chip-option, [mat-chip-option]",inputs:["selectable","selected"],outputs:["selectionChange"]},{kind:"ngmodule",type:MatButtonToggleModule},{kind:"directive",type:i11.MatButtonToggleGroup,selector:"mat-button-toggle-group",inputs:["appearance","name","vertical","value","multiple","disabled","hideSingleSelectionIndicator","hideMultipleSelectionIndicator"],outputs:["valueChange","change"],exportAs:["matButtonToggleGroup"]},{kind:"component",type:i11.MatButtonToggle,selector:"mat-button-toggle",inputs:["aria-label","aria-labelledby","id","name","value","tabIndex","disableRipple","appearance","checked","disabled"],outputs:["change"],exportAs:["matButtonToggle"]},{kind:"ngmodule",type:MatCheckboxModule},{kind:"ngmodule",type:MatDialogModule},{kind:"ngmodule",type:MatCardModule},{kind:"ngmodule",type:MatProgressBarModule},{kind:"ngmodule",type:MatDividerModule},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i12.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]},{kind:"component",type:i12.MatIconButton,selector:"button[mat-icon-button]",exportAs:["matButton"]},{kind:"ngmodule",type:MatIconModule},{kind:"component",type:i13.MatIcon,selector:"mat-icon",inputs:["color","inline","svgIcon","fontSet","fontIcon"],exportAs:["matIcon"]},{kind:"component",type:IonPopover,selector:"ion-popover"},{kind:"component",type:IonContent,selector:"ion-content",inputs:["color","fixedSlotPlacement","forceOverscroll","fullscreen","scrollEvents","scrollX","scrollY"]},{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:IonItemGroup,selector:"ion-item-group"},{kind:"component",type:IonItemDivider,selector:"ion-item-divider",inputs:["color","mode","sticky"]},{kind:"component",type:IonLabel,selector:"ion-label",inputs:["color","mode","position"]},{kind:"component",type:IonChip,selector:"ion-chip",inputs:["color","disabled","mode","outline"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonAvatar,selector:"ion-avatar"},{kind:"component",type:FmStoryCardComponent,selector:"fm-story-card",inputs:["story","isSelectMode","checked"],outputs:["checkedChange","onCheckStory","onPreviewStory","onDestoryStory"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmStoryListComponent,decorators:[{type:Component,args:[{selector:"fm-story-list",standalone:!0,imports:[CommonModule,FormsModule,ReactiveFormsModule,MatToolbarModule,MatChipsModule,MatButtonToggleModule,MatCheckboxModule,MatDialogModule,MatCardModule,MatProgressBarModule,MatDividerModule,MatButtonModule,MatIconModule,MatChipsModule,MatChipListbox,IonPopover,IonContent,IonItem,IonItemGroup,IonItemDivider,IonLabel,IonChip,IonIcon,IonAvatar,FmStoryCardComponent],template:'\x3c!-- \n <ion-header>\n <ion-toolbar>\n <ion-title>知识库</ion-title>\n <ion-buttons slot="end">\n <ion-button *ngIf="!isSelectMode" (click)="newStory()" [strong]="true">新建</ion-button>\n </ion-buttons>\n </ion-toolbar>\n </ion-header>\n <ion-content> --\x3e\n\n <div class="page">\n\n <div class="filter">\n \x3c!-- <button mat-icon-button class="example-icon" aria-label="Example icon-button with menu icon">\n <mat-icon>menu</mat-icon>\n </button> --\x3e\n\n \x3c!-- 知识库切换 --\x3e\n <ion-chip>\n <ion-avatar>\n <img alt="角色头像" [src]="defaultAvatar" />\n </ion-avatar>\n <ion-label>故事卡片</ion-label>\n <ion-icon name="swap-vertical-outline"></ion-icon>\n </ion-chip>\n\n <span class="example-spacer"></span>\n\n\n \x3c!-- 添加故事 --\x3e\n @if(false){\n <button mat-flat-button color="primary" (click)="newStory()" *ngIf="!isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 上传\n </button>\n }\n\n \x3c!-- 选择状态 --\x3e\n <button mat-button color="primary" (click)="cancel()" *ngIf="isSelectMode" style="margin-left:5px;">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 取消\n </button>\n <button mat-flat-button color="primary" (click)="confirmSelectedList()" *ngIf="isSelectMode">\n <span nz-icon nzType="plus" nzTheme="outline"></span> 确认选择\n </button>\n \x3c!-- <button mat-icon-button class="example-icon favorite-icon" aria-label="Example icon-button with heart icon">\n <mat-icon>favorite</mat-icon>\n </button> --\x3e\n <button id="trigger-button" mat-icon-button class="example-icon" aria-label="Example icon-button with share icon">\n <mat-icon>tune</mat-icon>\n </button>\n <ion-popover trigger="trigger-button" size="auto" side="bottom" alignment="end" style="--width: 34%;margin-left: 0%;">\n <ng-template>\n <ion-content class="ion-padding">\n <ion-item-group>\n <ion-item-divider>\n <ion-label>类型</ion-label>\n </ion-item-divider>\n <ion-item lines="none">\n <mat-chip-listbox [value]="storyType" aria-label="类型">\n <mat-chip-option (click)="changeStoryType(\'\')" value="">全部</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'document\')" value="document">文档</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'chat\')" value="chat">聊天</mat-chip-option>\n <mat-chip-option (click)="changeStoryType(\'diary\')" value="diary">日记</mat-chip-option>\n \x3c!-- <mat-chip-option color="accent" selected>Accent fish</mat-chip-option> --\x3e\n \x3c!-- <mat-chip-option color="warn">Warn fish</mat-chip-option> --\x3e\n </mat-chip-listbox>\n </ion-item>\n </ion-item-group>\n \n </ion-content>\n </ng-template>\n </ion-popover>\n </div>\n\n \x3c!-- 选择模式:选择数据 --\x3e\n @if(selectCount&&selectToken){\n <div class="select">\n <span>已选 {{selectCount||0}}个</span>\n <span style="margin-left:3px;">约{{selectToken||0}}tokens</span>\n </div>\n }\n \n <div class="list">\n\n\n \x3c!-- 切换筛选类型(角色故事、书籍故事、用户故事) --\x3e\n @if(person?.id || book?.id){\n <mat-button-toggle-group name="fontStyle">\n <mat-button-toggle (click)="currentTab=\'我的\';loadStory()" *ngIf="person?.id || book?.id" [checked]="currentTab==\'我的\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 我的\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'主角\';loadStory()" *ngIf="person?.id" [checked]="currentTab==\'主角\'">\n <span nz-icon nzType="user" nzTheme="outline"></span> 主角\n </mat-button-toggle>\n <mat-button-toggle (click)="currentTab=\'书籍\';loadStory()" *ngIf="book?.id" [checked]="currentTab==\'书籍\'">\n <span nz-icon nzType="read" nzTheme="outline"></span> 书籍\n </mat-button-toggle>\n </mat-button-toggle-group>\n }\n \n \x3c!-- 故事卡片 --\x3e\n <ng-container *ngFor="let story of storyServ.storyList;let index=index;">\n <fm-story-card class="list-item" [story]="story?.story" [isSelectMode]="isSelectMode" \n [(checked)]="checkedMap[story?.story?.id||\'\']"\n (onCheckStory)="checkStory($event)" \n (onPreviewStory)="previewStory($event)"\n (onDestoryStory)="destroyStory($event,index)"\n ></fm-story-card>\n </ng-container>\n </div>\n \x3c!-- </ion-content> --\x3e\n</div>\n',styles:[".page{width:100%;height:100%;display:flex;flex-direction:column;background:var(--yuban-page-background)}.page .filter{height:48px;display:flex;align-items:center}.page .filter .example-spacer{flex:1 1 auto}.page .select{display:flex;justify-content:center;height:32px}.page .select span{background-color:none;color:#ccc}.page .select mat-chip{background-color:none!important}.page mat-button-toggle-group{display:flex;height:25px;align-items:center;margin-top:11px}.page mat-button-toggle-group mat-button-toggle{flex:50%}.page ion-popover{--min-width:300px}.page .list{flex:1;display:flex;flex-direction:column;overflow-y:auto;border-radius:5px;height:100%;padding:5px}.page .list button{width:100%;margin-bottom:5px}.page .list .list-item{margin-bottom:7px}\n"]}]}],ctorParameters:()=>[{type:i1.ActivatedRoute},{type:i2.LoadingController},{type:i3.MatDialog},{type:i1.Router},{type:i4.StoryService},{type:i5.ChatService},{type:i6.AlertController},{type:i6.ModalController},{type:i6.NavController},{type:i7.NovaCloudService},{type:i8.NovaUploadService}],propDecorators:{id:[{type:Input}],article:[{type:Input}],person:[{type:Input}],book:[{type:Input}],isSelectMode:[{type:Input}],onCancel:[{type:Output}],onCountChange:[{type:Output}],onTokenChange:[{type:Output}],onPreviewStory:[{type:Output}],onConfirmSelect:[{type:Output}]}});export class DialogDeleteStoryDialog{constructor(t,e){this.dialogRef=t,this.data=e}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogDeleteStoryDialog,deps:[{token:i3.MatDialogRef},{token:MAT_DIALOG_DATA}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:DialogDeleteStoryDialog,isStandalone:!0,selector:"delete-story-dialog",ngImport:i0,template:'<h1 mat-dialog-title>删除故事</h1>\n<div mat-dialog-content>\n 请问您要删除该故事及其所有线索吗?\n</div>\n<div mat-dialog-actions>\n <button mat-button mat-dialog-close cdkFocusInitial>取消</button>\n <button mat-button [mat-dialog-close]="true" color="warn">删除</button>\n</div>',dependencies:[{kind:"ngmodule",type:MatDialogModule},{kind:"directive",type:i3.MatDialogClose,selector:"[mat-dialog-close], [matDialogClose]",inputs:["aria-label","type","mat-dialog-close","matDialogClose"],exportAs:["matDialogClose"]},{kind:"directive",type:i3.MatDialogTitle,selector:"[mat-dialog-title], [matDialogTitle]",inputs:["id"],exportAs:["matDialogTitle"]},{kind:"directive",type:i3.MatDialogActions,selector:"[mat-dialog-actions], mat-dialog-actions, [matDialogActions]",inputs:["align"]},{kind:"directive",type:i3.MatDialogContent,selector:"[mat-dialog-content], mat-dialog-content, [matDialogContent]"},{kind:"ngmodule",type:MatButtonModule},{kind:"component",type:i12.MatButton,selector:" button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ",exportAs:["matButton"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogDeleteStoryDialog,decorators:[{type:Component,args:[{selector:"delete-story-dialog",standalone:!0,imports:[MatDialogModule,MatButtonModule],template:'<h1 mat-dialog-title>删除故事</h1>\n<div mat-dialog-content>\n 请问您要删除该故事及其所有线索吗?\n</div>\n<div mat-dialog-actions>\n <button mat-button mat-dialog-close cdkFocusInitial>取消</button>\n <button mat-button [mat-dialog-close]="true" color="warn">删除</button>\n</div>'}]}],ctorParameters:()=>[{type:i3.MatDialogRef},{type:void 0,decorators:[{type:Inject,args:[MAT_DIALOG_DATA]}]}]});
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi9haWdjL3N0b3J5L2ZtLXN0b3J5LWxpc3QvZm0tc3RvcnktbGlzdC5jb21wb25lbnQubWpz`
|
|
10
|
+
|