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
package/esm2022/lib/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs
CHANGED
|
@@ -1,281 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
import { NzPipesModule } from 'ng-zorro-antd/pipes';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
import { MatButtonModule } from '@angular/material/button';
|
|
12
|
-
import { AlertController, AnimationController, IonButton, IonButtons, IonContent, IonFooter, IonHeader, IonIcon, IonTitle, IonToolbar, ModalController, NavController } from '@ionic/angular/standalone';
|
|
13
|
-
import { ActivatedRoute, Router } from '@angular/router';
|
|
14
|
-
import { ArticleService } from '../article.service';
|
|
15
|
-
import Parse from "parse";
|
|
16
|
-
import { openArticleAITool } from '../fm-article-aitool/fm-article-aitool.component';
|
|
17
|
-
import { TaskArticleWritingOptions } from '../tasks/task-article-writing-options';
|
|
18
|
-
import { TaskArticleOutlineEdit } from '../tasks/task-article-outline-edit';
|
|
19
|
-
import { TaskArticleDraft } from '../tasks/task-article-draft-create';
|
|
20
|
-
import { doArticleTask } from '../task-article-generation';
|
|
21
|
-
import { DraftService } from '../draft.service';
|
|
22
|
-
import { OutlineCountPipe } from '../outline-count.pipe';
|
|
23
|
-
import { SecretTextPipe } from '../../../person/modal-user-verify/secret-text.pipe';
|
|
24
|
-
import { CompUserAvatarComponent } from '../../../user/comp-user-avatar/comp-user-avatar.component';
|
|
25
|
-
import { CompUploadBookBannersComponent } from '../comp-upload-book-banners/comp-upload-book-banners.component';
|
|
26
|
-
import * as i0 from "@angular/core";
|
|
27
|
-
import * as i1 from "@angular/router";
|
|
28
|
-
import * as i2 from "@angular/material/dialog";
|
|
29
|
-
import * as i3 from "@ionic/angular/standalone";
|
|
30
|
-
import * as i4 from "../article.service";
|
|
31
|
-
import * as i5 from "../draft.service";
|
|
32
|
-
import * as i6 from "@angular/common";
|
|
33
|
-
import * as i7 from "@angular/material/slide-toggle";
|
|
34
|
-
import * as i8 from "ng-zorro-antd/pipes";
|
|
35
|
-
export class FmArticlePreviewComponent {
|
|
36
|
-
constructor(route, router, dialog, navCtrl, modalCtrl, animationCtrl, articleServ, alertCtrl, draftServ) {
|
|
37
|
-
this.route = route;
|
|
38
|
-
this.router = router;
|
|
39
|
-
this.dialog = dialog;
|
|
40
|
-
this.navCtrl = navCtrl;
|
|
41
|
-
this.modalCtrl = modalCtrl;
|
|
42
|
-
this.animationCtrl = animationCtrl;
|
|
43
|
-
this.articleServ = articleServ;
|
|
44
|
-
this.alertCtrl = alertCtrl;
|
|
45
|
-
this.draftServ = draftServ;
|
|
46
|
-
this.isDisplayEdit = true; //是否显示编辑按钮(默认显示)
|
|
47
|
-
this.isDisplayPublic = true; //是否显示公开按钮(默认显示)
|
|
48
|
-
this.isDisplayUploadImage = false; //是否显示公开按钮(默认不显示)
|
|
49
|
-
this.isAuthor = false;
|
|
50
|
-
this.previewStyle = `<style>
|
|
51
|
-
.content-block h1,.content-block h2,.content-block h3,.content-block h4,.content-block h5,.content-block h6{
|
|
52
|
-
color:white !important;
|
|
53
|
-
}
|
|
54
|
-
</style>`;
|
|
55
|
-
// 初始化轮播图图片
|
|
56
|
-
this.bannerList = [];
|
|
57
|
-
this.isShare = false;
|
|
58
|
-
}
|
|
59
|
-
ngOnInit() {
|
|
60
|
-
this.route.params.subscribe(async (params) => {
|
|
61
|
-
console.log(params);
|
|
62
|
-
let id = params?.["id"];
|
|
63
|
-
console.log(111, id);
|
|
64
|
-
if (!this.article?.id) {
|
|
65
|
-
await this.loadArticle(id);
|
|
66
|
-
}
|
|
67
|
-
this.initArticleBanner();
|
|
68
|
-
if (this.article?.id) {
|
|
69
|
-
this.articleServ.initWxShareInfo(this.article);
|
|
70
|
-
if ((this.article?.get("author")?.id || this.article?.get("author")?.objectId) == Parse.User.current()?.id) {
|
|
71
|
-
this.isAuthor = true;
|
|
72
|
-
}
|
|
73
|
-
this.draftServ?.loadArticleDraft(this.article);
|
|
74
|
-
this.articleServ.viewArticle(this.article);
|
|
75
|
-
}
|
|
76
|
-
});
|
|
77
|
-
}
|
|
78
|
-
handleNavEvent(eventType, options) {
|
|
79
|
-
// console.log(eventType)
|
|
80
|
-
let shareData = { article: null };
|
|
81
|
-
options = {
|
|
82
|
-
shareData: shareData,
|
|
83
|
-
dialog: this.dialog,
|
|
84
|
-
article: this.article
|
|
85
|
-
};
|
|
86
|
-
console.log(eventType, shareData);
|
|
87
|
-
if (eventType == "options") {
|
|
88
|
-
doArticleTask([
|
|
89
|
-
TaskArticleWritingOptions({ shareData: shareData, dialog: this.dialog, editOnly: true }),
|
|
90
|
-
], options);
|
|
91
|
-
}
|
|
92
|
-
if (eventType == "outline") {
|
|
93
|
-
doArticleTask([
|
|
94
|
-
TaskArticleOutlineEdit({ shareData: shareData, dialog: this.dialog }),
|
|
95
|
-
], options);
|
|
96
|
-
}
|
|
97
|
-
if (eventType == "draft") {
|
|
98
|
-
doArticleTask([
|
|
99
|
-
TaskArticleDraft({ isSelectedMode: true, shareData: shareData, dialog: this.dialog, modalCtrl: this.modalCtrl }),
|
|
100
|
-
], options, () => {
|
|
101
|
-
// if(this?.textQuill?.quill){
|
|
102
|
-
// this.textQuill.quill.root.innerHTML = shareData?.article?.get("content")
|
|
103
|
-
// }
|
|
104
|
-
});
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
async loadArticle(id) {
|
|
108
|
-
let query = new Parse.Query("Article");
|
|
109
|
-
this.article = await query.get(id);
|
|
110
|
-
console.log(this.article);
|
|
111
|
-
}
|
|
112
|
-
shareArticle() {
|
|
113
|
-
this.articleServ.shareArticle(this.article);
|
|
114
|
-
}
|
|
115
|
-
async editArticle() {
|
|
116
|
-
if (document.body.clientWidth > 1000) {
|
|
117
|
-
this.navCtrl.navigateForward("/editor/article/" + this.article?.id);
|
|
118
|
-
return;
|
|
119
|
-
}
|
|
120
|
-
if (this.article) {
|
|
121
|
-
openArticleAITool({
|
|
122
|
-
modalCtrl: this.modalCtrl,
|
|
123
|
-
alertCtrl: this.alertCtrl,
|
|
124
|
-
animationCtrl: this.animationCtrl,
|
|
125
|
-
article: this.article
|
|
126
|
-
});
|
|
127
|
-
}
|
|
128
|
-
return;
|
|
129
|
-
}
|
|
130
|
-
initArticleBanner() {
|
|
131
|
-
this.bannerList = this.articleServ.getArticleBanner(this.article);
|
|
132
|
-
if (this.bannerList?.length) {
|
|
133
|
-
this.initSwiperTimeEvent();
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
back() {
|
|
137
|
-
if (location?.pathname?.indexOf("chapter") > -1) { // 跳转目录页
|
|
138
|
-
let path = location.pathname.split("/chapter")[0];
|
|
139
|
-
// this.router.navigateByUrl(path);
|
|
140
|
-
this.navCtrl.navigateRoot(path);
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
if (location?.pathname?.indexOf("article") > -1) {
|
|
144
|
-
// 跳转故事广场
|
|
145
|
-
this.navCtrl.navigateRoot("/app/book");
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
this.modalCtrl?.dismiss();
|
|
149
|
-
}
|
|
150
|
-
// 公开文章
|
|
151
|
-
onPublicChange(ev) {
|
|
152
|
-
this.article?.set("isPublic", ev?.checked);
|
|
153
|
-
this.article?.save();
|
|
154
|
-
}
|
|
155
|
-
// 删除文章
|
|
156
|
-
async delete() {
|
|
157
|
-
const alert = await this.alertCtrl.create({
|
|
158
|
-
header: '删除文章',
|
|
159
|
-
subHeader: '您确认删除文章及其数据吗?',
|
|
160
|
-
buttons: [
|
|
161
|
-
{
|
|
162
|
-
text: '取消',
|
|
163
|
-
role: 'cancel',
|
|
164
|
-
handler: () => {
|
|
165
|
-
},
|
|
166
|
-
},
|
|
167
|
-
{
|
|
168
|
-
text: '删除',
|
|
169
|
-
role: "confirm",
|
|
170
|
-
handler: () => {
|
|
171
|
-
this.article?.set("isDeleted", true);
|
|
172
|
-
this.article?.save();
|
|
173
|
-
this.modalCtrl.dismiss();
|
|
174
|
-
},
|
|
175
|
-
},
|
|
176
|
-
],
|
|
177
|
-
});
|
|
178
|
-
await alert.present();
|
|
179
|
-
}
|
|
180
|
-
// 轮播图区域代码
|
|
181
|
-
// @HostListener('window:wheel', ['$event'])
|
|
182
|
-
onScroll(event) {
|
|
183
|
-
return;
|
|
184
|
-
if (event.deltaY > 0) {
|
|
185
|
-
// 向下滚动
|
|
186
|
-
this.pageSwiper?.slideNext();
|
|
187
|
-
}
|
|
188
|
-
else {
|
|
189
|
-
// 向上滚动
|
|
190
|
-
this.pageSwiper?.slidePrev();
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
initSwiperTimeEvent() {
|
|
194
|
-
// 初始化轮播图
|
|
195
|
-
this.pageSwiper = new Swiper(".swiper", {
|
|
196
|
-
// direction:"vertical",
|
|
197
|
-
mousewheel: true,
|
|
198
|
-
effect: "fade",
|
|
199
|
-
loop: true,
|
|
200
|
-
pagination: {
|
|
201
|
-
el: '.swiper-pagination',
|
|
202
|
-
clickable: true
|
|
203
|
-
}
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
openOverlay() {
|
|
207
|
-
this.isShare = true;
|
|
208
|
-
}
|
|
209
|
-
closeOverlay() {
|
|
210
|
-
this.isShare = false;
|
|
211
|
-
}
|
|
212
|
-
openUploadBanner() {
|
|
213
|
-
let articleId = this.article?.id;
|
|
214
|
-
openUploadBannerModal(this.modalCtrl, articleId).then(newBanner => {
|
|
215
|
-
if (newBanner) {
|
|
216
|
-
this.bannerList.push(newBanner);
|
|
217
|
-
}
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmArticlePreviewComponent, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.MatDialog }, { token: i3.NavController }, { token: i3.ModalController }, { token: i3.AnimationController }, { token: i4.ArticleService }, { token: i3.AlertController }, { token: i5.DraftService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
221
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.12", type: FmArticlePreviewComponent, isStandalone: true, selector: "fm-article-preview", inputs: { article: "article", isDisplayEdit: "isDisplayEdit", isDisplayPublic: "isDisplayPublic", isDisplayUploadImage: "isDisplayUploadImage" }, ngImport: i0, template: "<ion-header [translucent]=\"true\" collapse=\"fade\" class=\"ion-no-border\">\r\n <ion-toolbar>\r\n <!-- \u8FD4\u56DE -->\r\n <ion-buttons slot=\"secondary\">\r\n <ion-button (click)=\"back()\">\r\n <ion-icon slot=\"icon-only\" name=\"arrow-back-circle\"></ion-icon>\r\n </ion-button>\r\n @if(isAuthor){\r\n @if(isDisplayPublic===true){\r\n <div style=\"display:flex;justify-content: center;align-items: center;margin-left: 20px;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div>\r\n }\r\n }\r\n </ion-buttons>\r\n <ion-title style=\"font-size: 1.3rem;font-weight: bold;\">\u6587\u7AE0\u9884\u89C8</ion-title>\r\n <ion-buttons slot=\"primary\">\r\n <!-- \u7F16\u8F91 -->\r\n @if(isAuthor){\r\n <!-- <div style=\"display:flex;justify-content: center;align-items: center;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div> -->\r\n @if(isDisplayEdit===true){\r\n <ion-button (click)=\"editArticle()\" style=\"display: none;\">\r\n <ion-icon slot=\"icon-only\" name=\"create\"></ion-icon>\r\n </ion-button>\r\n }\r\n }\r\n <!-- \u4E0A\u4F20\u8F6E\u64AD\u56FE -->\r\n @if(isAuthor){\r\n <!-- <div style=\"display:flex;justify-content: center;align-items: center;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div> -->\r\n <!-- @if(isDisplayUploadImage===true){ -->\r\n <ion-button (click)=\"openUploadBanner()\">\r\n <!-- <ion-icon slot=\"icon-only\" name=\"create\"></ion-icon> -->\r\n <div>\u4E0A\u4F20\u5C01\u9762</div>\r\n </ion-button>\r\n <!-- } -->\r\n }\r\n <!-- \u5206\u4EAB -->\r\n <!-- (click)=\"shareArticle()\" -->\r\n <ion-button (click)=\"openOverlay()\">\r\n <ion-icon slot=\"icon-only\" name=\"share\"></ion-icon>\r\n </ion-button>\r\n </ion-buttons>\r\n </ion-toolbar>\r\n</ion-header>\r\n<div class=\"sharetOverlay\" (click)=\"closeOverlay()\" *ngIf=\"isShare\">\r\n\r\n <div class=\"overlay-content\">\r\n <img src=\"https://static.ws.126.net/163/frontend/backflow-ssr/article/share-cover.98543a0088a4.png\" alt=\"\">\r\n <ion-icon style=\"color: white;\" name=\"ellipsis-horizontal\"></ion-icon>\r\n\r\n </div>\r\n</div>\r\n<ion-content>\r\n <div class=\"page\">\r\n <div style=\"background-color: #1e1f22;\">\r\n <!-- <div class=\"btn\">\r\n <button mat-raised-button color=\"primary\">\r\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\r\n </button>\r\n </div> -->\r\n \r\n <!-- \u8F6E\u64AD\u56FE -->\r\n <div class=\"swiper\" (wheel)=\"onScroll($event)\" *ngIf=\"bannerList?.length\">\r\n <div class=\"swiper-wrapper\">\r\n <div class=\"swiper-slide bg-purple-blue\" *ngFor=\"let imgUrl of bannerList\">\r\n <img [src]=\"imgUrl\" alt=\"\" srcset=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- \u6807\u9898\u3001\u5173\u952E\u5B57 -->\r\n <div class=\"article-header\">\r\n <h1 style=\"color: #5a55d1 !important;\">{{article?.get('title')}}</h1>\r\n </div>\r\n <div class=\"chip-list\">\u5173\u952E\u5B57\uFF1A\r\n <!-- <mat-chip *ngFor=\"let keyword of article?.get('keywords')\">{{keyword}}</mat-chip> -->\r\n <span class=\"cueWord\" *ngFor=\"let keyword of article?.get('keywords')\">\r\n #{{keyword}}\r\n </span>\r\n </div>\r\n\r\n @if(isAuthor){\r\n <div class=\"article-info\">\r\n <ng-container *ngIf=\"article?.get('writingOptions')\">\r\n <div (click)=\"handleNavEvent('options')\">\u8BBE \u5B9A\uFF1A\r\n <!-- <mat-chip (click)=\"handleNavEvent('outline')\" [disabled]=\"!article?.get('outlineJson')\">\r\n \u5927\u7EB2\r\n </mat-chip> -->\r\n <!-- <mat-chip *ngIf=\"article?.get('writingOptions')?.writingStyle\">{{article?.get('writingOptions')?.writingStyle}}</mat-chip>\r\n <mat-chip *ngIf=\"article?.get('writingOptions')?.wordCount\">\u7EA6{{article?.get('writingOptions')?.wordCount}}\u5B57</mat-chip> -->\r\n <span class=\"cueWord\" *ngIf=\"article?.get('writingOptions')?.writingStyle\">{{article?.get('writingOptions')?.writingStyle}}</span>\r\n <span class=\"cueWord\" *ngIf=\"article?.get('writingOptions')?.wordCount\">\u7EA6{{article?.get('writingOptions')?.wordCount}}\u5B57</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"article?.get('outlineJson')\">\r\n <div (click)=\"handleNavEvent('outline')\">\u63D0 \u7EB2\uFF1A\r\n <!-- <mat-chip>{{article?.get('outlineJson') | outlineCount}}\u5B57</mat-chip> -->\r\n <span class=\"cueWord\">{{article?.get('outlineJson') | outlineCount}}\u5B57</span>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"article?.id\" (click)=\"handleNavEvent('draft')\">\u7A3F\u4EF6\u7BB1\uFF1A\r\n <!-- <mat-chip>{{draftServ.DraftCountMap?.[article?.id||'']?.total || 0}}\u7BC7</mat-chip> -->\r\n <span class=\"cueWord\">{{draftServ.DraftCountMap?.[article?.id||'']?.total || 0}}\u7BC7</span>\r\n </div>\r\n </div>\r\n }\r\n \r\n <!-- \u6587\u7AE0\u5185\u5BB9 -->\r\n <div class=\"content\">\r\n <ng-container *ngFor=\"let item of article?.get('contentArray');let index=index;\" >\r\n <!-- \u7AE0\u8282\u4FE1\u606F -->\r\n <!-- <h2 style=\"margin:5px 0px;\" *ngIf=\"article?.get('outlineJson')?.sections?.[index]?.title\">{{article?.get('outlineJson')?.sections?.[index]?.title}}</h2> -->\r\n <div class=\"content-block\" [innerHTML]=\"(previewStyle+item?.content)| nzSanitizer: 'html'\"></div>\r\n </ng-container>\r\n <div style=\"height:100px;width:100%;\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n</ion-content>\r\n\r\n<ion-footer class=\"ion-no-border\">\r\n <ion-toolbar>\r\n @if(article?.get(\"author\")){\r\n <ion-buttons slot=\"start\">\r\n <ion-button>\r\n <div class=\"author\">\r\n @if(article?.get(\"author\")?.get(\"nickname\")){ \r\n <app-comp-user-avatar [user]=\"article?.get('author')\"></app-comp-user-avatar>\r\n }\r\n <span>\r\n {{article?.get(\"author\")?.get(\"nickname\") || (article?.get(\"author\")?.get(\"realname\")| secretText)}}\r\n </span>\r\n </div>\r\n </ion-button>\r\n </ion-buttons>\r\n }\r\n @if(article?.id){\r\n <ion-buttons slot=\"end\">\r\n @if(isAuthor){\r\n <ion-button (click)=\"delete()\" color=\"medium\" size=\"small\">\r\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\r\n </ion-button>\r\n }\r\n <ion-button color=\"medium\" size=\"small\">\r\n <span class=\"count\">{{article?.get(\"viewCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" name=\"eye-outline\"></ion-icon>\r\n </ion-button>\r\n <ion-button [color]=\"articleServ?.likeMap[article?.id||'666']?'danger':'medium'\" size=\"small\" (click)=\"articleServ.likeArticle(article)\">\r\n <span class=\"count\">{{article?.get(\"likeCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" [name]=\"'heart'+(articleServ?.likeMap[article?.id||'666']?'':'-outline')\"></ion-icon>\r\n </ion-button>\r\n <ion-button [color]=\"articleServ?.collectMap[article?.id||'666']?'warn':'medium'\" size=\"small\" (click)=\"articleServ.likeArticle(article,'collect')\">\r\n <span class=\"count\">{{article?.get(\"collectCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" [name]=\"'star'+(articleServ?.collectMap[article?.id||'666']?'':'-outline')\"></ion-icon>\r\n </ion-button>\r\n <!-- <ion-button color=\"medium\" size=\"small\">\r\n <span class=\"count\">{{article?.get(\"commentCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" name=\"chatbubble-outline\"></ion-icon>\r\n </ion-button> -->\r\n </ion-buttons>\r\n }\r\n\r\n </ion-toolbar>\r\n</ion-footer>", styles: [":host-context(body.dark) .page{background:var(--background-black);background-color:#1e1f22;color:#ddd!important}:host-context(body.dark) .page h1,:host-context(body.dark) .page h2,:host-context(body.dark) .page h3,:host-context(body.dark) .page h4,:host-context(body.dark) .page h5,:host-context(body.dark) .page h6{color:#ddd!important}:host-context(body.dark) .page .content-block{color:#ddd!important;font-size:1.1rem}:host-context(body.dark) .page .content-block h1,:host-context(body.dark) .page .content-block h2,:host-context(body.dark) .page .content-block h3,:host-context(body.dark) .page .content-block h4,:host-context(body.dark) .page .content-block h5,:host-context(body.dark) .page .content-block h6{color:#ddd!important}:host-context(body.dark) .page .toggle-text{color:#ddd!important}.page{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:flex;flex-direction:column;padding:10px;position:relative}.page .btn{z-index:999;position:fixed;top:0;right:0}.page .btn>button{width:80px}.page .article-info{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:0% 3%}.page .article-info div{margin-bottom:3px;display:flex;font-size:1.1rem}.page .article-info div mat-chip{margin-right:3px}.page .article-info div .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .article-header{display:flex;flex-direction:column;justify-content:center;align-items:center}.page .article-header h1{color:#5a55d1!important}.page .chip-list{display:flex;justify-content:flex-start;margin-top:30px;padding:0% 3%;font-size:1.1rem;flex-wrap:wrap}.page .chip-list>mat-chip{margin:0}.page .chip-list .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .content{padding:12px;width:100%}.swiper{width:100%}.swiper .swiper-slide{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.swiper .swiper-slide img{object-fit:cover}.count{margin-top:-17px}.author{display:flex;align-items:center;text-align:left}.author span{margin-left:7px}.sharetOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:999}.sharetOverlay .overlay-content{position:absolute;top:0;width:100%;padding:20px;box-shadow:0 2px 10px #0000001a}.sharetOverlay .overlay-content ion-icon{position:absolute;top:0;right:11px;font-size:2em;color:#000}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "ngmodule", type: MatCardModule }, { kind: "ngmodule", type: MatChipsModule }, { kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatSlideToggleModule }, { kind: "component", type: i7.MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "ngmodule", type: NzPipesModule }, { kind: "pipe", type: i8.NzSanitizerPipe, name: "nzSanitizer" }, { kind: "ngmodule", type: NzIconModule }, { kind: "component", type: IonContent, selector: "ion-content", inputs: ["color", "fixedSlotPlacement", "forceOverscroll", "fullscreen", "scrollEvents", "scrollX", "scrollY"] }, { kind: "component", type: IonToolbar, selector: "ion-toolbar", inputs: ["color", "mode"] }, { kind: "component", type: IonTitle, selector: "ion-title", inputs: ["color", "size"] }, { kind: "component", type: IonHeader, selector: "ion-header", inputs: ["collapse", "mode", "translucent"] }, { kind: "component", type: IonButtons, selector: "ion-buttons", inputs: ["collapse"] }, { kind: "component", type: IonButton, selector: "ion-button", inputs: ["buttonType", "color", "disabled", "download", "expand", "fill", "form", "href", "mode", "rel", "routerAnimation", "routerDirection", "shape", "size", "strong", "target", "type"] }, { kind: "component", type: IonIcon, selector: "ion-icon", inputs: ["color", "flipRtl", "icon", "ios", "lazy", "md", "mode", "name", "sanitize", "size", "src"] }, { kind: "component", type: IonFooter, selector: "ion-footer", inputs: ["collapse", "mode", "translucent"] }, { kind: "pipe", type: OutlineCountPipe, name: "outlineCount" }, { kind: "pipe", type: SecretTextPipe, name: "secretText" }, { kind: "component", type: CompUserAvatarComponent, selector: "app-comp-user-avatar", inputs: ["user"] }] }); }
|
|
222
|
-
}
|
|
223
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FmArticlePreviewComponent, decorators: [{
|
|
224
|
-
type: Component,
|
|
225
|
-
args: [{ selector: 'fm-article-preview', standalone: true, imports: [
|
|
226
|
-
CommonModule,
|
|
227
|
-
MatToolbarModule,
|
|
228
|
-
MatCardModule,
|
|
229
|
-
MatChipsModule,
|
|
230
|
-
MatButtonModule,
|
|
231
|
-
MatSlideToggleModule,
|
|
232
|
-
MatChipsModule,
|
|
233
|
-
NzPipesModule,
|
|
234
|
-
NzIconModule,
|
|
235
|
-
IonContent, IonToolbar, IonTitle, IonHeader,
|
|
236
|
-
IonButtons, IonButton, IonIcon,
|
|
237
|
-
IonFooter, IonToolbar,
|
|
238
|
-
OutlineCountPipe,
|
|
239
|
-
SecretTextPipe,
|
|
240
|
-
CompUserAvatarComponent
|
|
241
|
-
], template: "<ion-header [translucent]=\"true\" collapse=\"fade\" class=\"ion-no-border\">\r\n <ion-toolbar>\r\n <!-- \u8FD4\u56DE -->\r\n <ion-buttons slot=\"secondary\">\r\n <ion-button (click)=\"back()\">\r\n <ion-icon slot=\"icon-only\" name=\"arrow-back-circle\"></ion-icon>\r\n </ion-button>\r\n @if(isAuthor){\r\n @if(isDisplayPublic===true){\r\n <div style=\"display:flex;justify-content: center;align-items: center;margin-left: 20px;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div>\r\n }\r\n }\r\n </ion-buttons>\r\n <ion-title style=\"font-size: 1.3rem;font-weight: bold;\">\u6587\u7AE0\u9884\u89C8</ion-title>\r\n <ion-buttons slot=\"primary\">\r\n <!-- \u7F16\u8F91 -->\r\n @if(isAuthor){\r\n <!-- <div style=\"display:flex;justify-content: center;align-items: center;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div> -->\r\n @if(isDisplayEdit===true){\r\n <ion-button (click)=\"editArticle()\" style=\"display: none;\">\r\n <ion-icon slot=\"icon-only\" name=\"create\"></ion-icon>\r\n </ion-button>\r\n }\r\n }\r\n <!-- \u4E0A\u4F20\u8F6E\u64AD\u56FE -->\r\n @if(isAuthor){\r\n <!-- <div style=\"display:flex;justify-content: center;align-items: center;\">\r\n <mat-slide-toggle [checked]=\"article?.get('isPublic')\" (change)=\"onPublicChange($event)\"></mat-slide-toggle>\r\n <span class=\"toggle-text\">\u516C\u5F00</span>\r\n </div> -->\r\n <!-- @if(isDisplayUploadImage===true){ -->\r\n <ion-button (click)=\"openUploadBanner()\">\r\n <!-- <ion-icon slot=\"icon-only\" name=\"create\"></ion-icon> -->\r\n <div>\u4E0A\u4F20\u5C01\u9762</div>\r\n </ion-button>\r\n <!-- } -->\r\n }\r\n <!-- \u5206\u4EAB -->\r\n <!-- (click)=\"shareArticle()\" -->\r\n <ion-button (click)=\"openOverlay()\">\r\n <ion-icon slot=\"icon-only\" name=\"share\"></ion-icon>\r\n </ion-button>\r\n </ion-buttons>\r\n </ion-toolbar>\r\n</ion-header>\r\n<div class=\"sharetOverlay\" (click)=\"closeOverlay()\" *ngIf=\"isShare\">\r\n\r\n <div class=\"overlay-content\">\r\n <img src=\"https://static.ws.126.net/163/frontend/backflow-ssr/article/share-cover.98543a0088a4.png\" alt=\"\">\r\n <ion-icon style=\"color: white;\" name=\"ellipsis-horizontal\"></ion-icon>\r\n\r\n </div>\r\n</div>\r\n<ion-content>\r\n <div class=\"page\">\r\n <div style=\"background-color: #1e1f22;\">\r\n <!-- <div class=\"btn\">\r\n <button mat-raised-button color=\"primary\">\r\n <span nz-icon nzType=\"close\" nzTheme=\"outline\"></span>\r\n </button>\r\n </div> -->\r\n \r\n <!-- \u8F6E\u64AD\u56FE -->\r\n <div class=\"swiper\" (wheel)=\"onScroll($event)\" *ngIf=\"bannerList?.length\">\r\n <div class=\"swiper-wrapper\">\r\n <div class=\"swiper-slide bg-purple-blue\" *ngFor=\"let imgUrl of bannerList\">\r\n <img [src]=\"imgUrl\" alt=\"\" srcset=\"\">\r\n </div>\r\n </div>\r\n </div>\r\n \r\n <!-- \u6807\u9898\u3001\u5173\u952E\u5B57 -->\r\n <div class=\"article-header\">\r\n <h1 style=\"color: #5a55d1 !important;\">{{article?.get('title')}}</h1>\r\n </div>\r\n <div class=\"chip-list\">\u5173\u952E\u5B57\uFF1A\r\n <!-- <mat-chip *ngFor=\"let keyword of article?.get('keywords')\">{{keyword}}</mat-chip> -->\r\n <span class=\"cueWord\" *ngFor=\"let keyword of article?.get('keywords')\">\r\n #{{keyword}}\r\n </span>\r\n </div>\r\n\r\n @if(isAuthor){\r\n <div class=\"article-info\">\r\n <ng-container *ngIf=\"article?.get('writingOptions')\">\r\n <div (click)=\"handleNavEvent('options')\">\u8BBE \u5B9A\uFF1A\r\n <!-- <mat-chip (click)=\"handleNavEvent('outline')\" [disabled]=\"!article?.get('outlineJson')\">\r\n \u5927\u7EB2\r\n </mat-chip> -->\r\n <!-- <mat-chip *ngIf=\"article?.get('writingOptions')?.writingStyle\">{{article?.get('writingOptions')?.writingStyle}}</mat-chip>\r\n <mat-chip *ngIf=\"article?.get('writingOptions')?.wordCount\">\u7EA6{{article?.get('writingOptions')?.wordCount}}\u5B57</mat-chip> -->\r\n <span class=\"cueWord\" *ngIf=\"article?.get('writingOptions')?.writingStyle\">{{article?.get('writingOptions')?.writingStyle}}</span>\r\n <span class=\"cueWord\" *ngIf=\"article?.get('writingOptions')?.wordCount\">\u7EA6{{article?.get('writingOptions')?.wordCount}}\u5B57</span>\r\n </div>\r\n </ng-container>\r\n <ng-container *ngIf=\"article?.get('outlineJson')\">\r\n <div (click)=\"handleNavEvent('outline')\">\u63D0 \u7EB2\uFF1A\r\n <!-- <mat-chip>{{article?.get('outlineJson') | outlineCount}}\u5B57</mat-chip> -->\r\n <span class=\"cueWord\">{{article?.get('outlineJson') | outlineCount}}\u5B57</span>\r\n </div>\r\n </ng-container>\r\n <div *ngIf=\"article?.id\" (click)=\"handleNavEvent('draft')\">\u7A3F\u4EF6\u7BB1\uFF1A\r\n <!-- <mat-chip>{{draftServ.DraftCountMap?.[article?.id||'']?.total || 0}}\u7BC7</mat-chip> -->\r\n <span class=\"cueWord\">{{draftServ.DraftCountMap?.[article?.id||'']?.total || 0}}\u7BC7</span>\r\n </div>\r\n </div>\r\n }\r\n \r\n <!-- \u6587\u7AE0\u5185\u5BB9 -->\r\n <div class=\"content\">\r\n <ng-container *ngFor=\"let item of article?.get('contentArray');let index=index;\" >\r\n <!-- \u7AE0\u8282\u4FE1\u606F -->\r\n <!-- <h2 style=\"margin:5px 0px;\" *ngIf=\"article?.get('outlineJson')?.sections?.[index]?.title\">{{article?.get('outlineJson')?.sections?.[index]?.title}}</h2> -->\r\n <div class=\"content-block\" [innerHTML]=\"(previewStyle+item?.content)| nzSanitizer: 'html'\"></div>\r\n </ng-container>\r\n <div style=\"height:100px;width:100%;\"></div>\r\n </div>\r\n </div>\r\n\r\n </div>\r\n\r\n</ion-content>\r\n\r\n<ion-footer class=\"ion-no-border\">\r\n <ion-toolbar>\r\n @if(article?.get(\"author\")){\r\n <ion-buttons slot=\"start\">\r\n <ion-button>\r\n <div class=\"author\">\r\n @if(article?.get(\"author\")?.get(\"nickname\")){ \r\n <app-comp-user-avatar [user]=\"article?.get('author')\"></app-comp-user-avatar>\r\n }\r\n <span>\r\n {{article?.get(\"author\")?.get(\"nickname\") || (article?.get(\"author\")?.get(\"realname\")| secretText)}}\r\n </span>\r\n </div>\r\n </ion-button>\r\n </ion-buttons>\r\n }\r\n @if(article?.id){\r\n <ion-buttons slot=\"end\">\r\n @if(isAuthor){\r\n <ion-button (click)=\"delete()\" color=\"medium\" size=\"small\">\r\n <ion-icon slot=\"icon-only\" name=\"trash\"></ion-icon>\r\n </ion-button>\r\n }\r\n <ion-button color=\"medium\" size=\"small\">\r\n <span class=\"count\">{{article?.get(\"viewCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" name=\"eye-outline\"></ion-icon>\r\n </ion-button>\r\n <ion-button [color]=\"articleServ?.likeMap[article?.id||'666']?'danger':'medium'\" size=\"small\" (click)=\"articleServ.likeArticle(article)\">\r\n <span class=\"count\">{{article?.get(\"likeCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" [name]=\"'heart'+(articleServ?.likeMap[article?.id||'666']?'':'-outline')\"></ion-icon>\r\n </ion-button>\r\n <ion-button [color]=\"articleServ?.collectMap[article?.id||'666']?'warn':'medium'\" size=\"small\" (click)=\"articleServ.likeArticle(article,'collect')\">\r\n <span class=\"count\">{{article?.get(\"collectCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" [name]=\"'star'+(articleServ?.collectMap[article?.id||'666']?'':'-outline')\"></ion-icon>\r\n </ion-button>\r\n <!-- <ion-button color=\"medium\" size=\"small\">\r\n <span class=\"count\">{{article?.get(\"commentCount\")||\"\"}}</span>\r\n <ion-icon slot=\"icon-only\" name=\"chatbubble-outline\"></ion-icon>\r\n </ion-button> -->\r\n </ion-buttons>\r\n }\r\n\r\n </ion-toolbar>\r\n</ion-footer>", styles: [":host-context(body.dark) .page{background:var(--background-black);background-color:#1e1f22;color:#ddd!important}:host-context(body.dark) .page h1,:host-context(body.dark) .page h2,:host-context(body.dark) .page h3,:host-context(body.dark) .page h4,:host-context(body.dark) .page h5,:host-context(body.dark) .page h6{color:#ddd!important}:host-context(body.dark) .page .content-block{color:#ddd!important;font-size:1.1rem}:host-context(body.dark) .page .content-block h1,:host-context(body.dark) .page .content-block h2,:host-context(body.dark) .page .content-block h3,:host-context(body.dark) .page .content-block h4,:host-context(body.dark) .page .content-block h5,:host-context(body.dark) .page .content-block h6{color:#ddd!important}:host-context(body.dark) .page .toggle-text{color:#ddd!important}.page{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:flex;flex-direction:column;padding:10px;position:relative}.page .btn{z-index:999;position:fixed;top:0;right:0}.page .btn>button{width:80px}.page .article-info{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:0% 3%}.page .article-info div{margin-bottom:3px;display:flex;font-size:1.1rem}.page .article-info div mat-chip{margin-right:3px}.page .article-info div .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .article-header{display:flex;flex-direction:column;justify-content:center;align-items:center}.page .article-header h1{color:#5a55d1!important}.page .chip-list{display:flex;justify-content:flex-start;margin-top:30px;padding:0% 3%;font-size:1.1rem;flex-wrap:wrap}.page .chip-list>mat-chip{margin:0}.page .chip-list .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .content{padding:12px;width:100%}.swiper{width:100%}.swiper .swiper-slide{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.swiper .swiper-slide img{object-fit:cover}.count{margin-top:-17px}.author{display:flex;align-items:center;text-align:left}.author span{margin-left:7px}.sharetOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:999}.sharetOverlay .overlay-content{position:absolute;top:0;width:100%;padding:20px;box-shadow:0 2px 10px #0000001a}.sharetOverlay .overlay-content ion-icon{position:absolute;top:0;right:11px;font-size:2em;color:#000}\n"] }]
|
|
242
|
-
}], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.MatDialog }, { type: i3.NavController }, { type: i3.ModalController }, { type: i3.AnimationController }, { type: i4.ArticleService }, { type: i3.AlertController }, { type: i5.DraftService }], propDecorators: { article: [{
|
|
243
|
-
type: Input
|
|
244
|
-
}], isDisplayEdit: [{
|
|
245
|
-
type: Input
|
|
246
|
-
}], isDisplayPublic: [{
|
|
247
|
-
type: Input
|
|
248
|
-
}], isDisplayUploadImage: [{
|
|
249
|
-
type: Input
|
|
250
|
-
}] } });
|
|
251
|
-
export class DialogArticlePreview {
|
|
252
|
-
constructor(dialogRef, data) {
|
|
253
|
-
this.dialogRef = dialogRef;
|
|
254
|
-
this.data = data;
|
|
255
|
-
}
|
|
256
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogArticlePreview, deps: [{ token: i2.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
257
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DialogArticlePreview, isStandalone: true, selector: "article-preview-dialog", ngImport: i0, template: '<fm-article-preview [article]="data?.article"></fm-article-preview>', isInline: true, styles: [""], dependencies: [{ kind: "ngmodule", type: MatDialogModule }, { kind: "component", type: FmArticlePreviewComponent, selector: "fm-article-preview", inputs: ["article", "isDisplayEdit", "isDisplayPublic", "isDisplayUploadImage"] }] }); }
|
|
258
|
-
}
|
|
259
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DialogArticlePreview, decorators: [{
|
|
260
|
-
type: Component,
|
|
261
|
-
args: [{ selector: 'article-preview-dialog', template: '<fm-article-preview [article]="data?.article"></fm-article-preview>', standalone: true, imports: [MatDialogModule, FmArticlePreviewComponent] }]
|
|
262
|
-
}], ctorParameters: () => [{ type: i2.MatDialogRef }, { type: undefined, decorators: [{
|
|
263
|
-
type: Inject,
|
|
264
|
-
args: [MAT_DIALOG_DATA]
|
|
265
|
-
}] }] });
|
|
266
|
-
export async function openUploadBannerModal(modalCtrl, articleId) {
|
|
267
|
-
const modal = await modalCtrl.create({
|
|
268
|
-
component: CompUploadBookBannersComponent,
|
|
269
|
-
componentProps: { articleId }, // 传递 articleId
|
|
270
|
-
breakpoints: [0.5, 0.8, 1],
|
|
271
|
-
initialBreakpoint: 0.8,
|
|
272
|
-
});
|
|
273
|
-
await modal.present();
|
|
274
|
-
const { data, role } = await modal.onWillDismiss();
|
|
275
|
-
if (role === "confirm" && data?.success) {
|
|
276
|
-
console.log('新章节:', data.banner); // 处理返回的章节 ID
|
|
277
|
-
return data.banner; // 返回新章节 ID
|
|
278
|
-
}
|
|
279
|
-
return null;
|
|
280
|
-
}
|
|
281
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm0tYXJ0aWNsZS1wcmV2aWV3LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdGV4dC9mbS1hcnRpY2xlLWVkaXRvci9mbS1hcnRpY2xlLXByZXZpZXcvZm0tYXJ0aWNsZS1wcmV2aWV3LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2Ztb2RlLW5nL3NyYy9saWIvdGV4dC9mbS1hcnRpY2xlLWVkaXRvci9mbS1hcnRpY2xlLXByZXZpZXcvZm0tYXJ0aWNsZS1wcmV2aWV3LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLEVBQUUsS0FBSyxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQy9FLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUF3QixvQkFBb0IsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzVGLE9BQU8sRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNyRyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM3RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVB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O1FBQzFCLGlCQUFpQixFQUFFLEdBQUc7S0FDdkIsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDdEIsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLEtBQUssQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUNuRCxJQUFJLElBQUksS0FBSyxTQUFTLElBQUksSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLGFBQWE7UUFDL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsV0FBVztJQUNqQyxDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBIb3N0TGlzdGVuZXIsIEluamVjdCwgSW5wdXQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXRDYXJkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XHJcbmltcG9ydCB7IE1hdENoaXBzTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2hpcHMnO1xyXG5pbXBvcnQgeyBNYXRTbGlkZVRvZ2dsZUNoYW5nZSwgTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbGlkZS10b2dnbGUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2dSZWYsIE1BVF9ESUFMT0dfREFUQSwgTWF0RGlhbG9nLCBNYXREaWFsb2dNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xyXG5pbXBvcnQgeyBNYXRUb29sYmFyTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbGJhcic7XHJcbmltcG9ydCB7IE56UGlwZXNNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL3BpcGVzJztcclxuaW1wb3J0IHsgU3dpcGVyIH0gZnJvbSAnc3dpcGVyJztcclxuaW1wb3J0IHsgTnpJY29uTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pY29uJztcclxuaW1wb3J0IHtNYXRCdXR0b25Nb2R1bGV9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2J1dHRvbic7XHJcbmltcG9ydCB7IEFsZXJ0Q29udHJvbGxlciwgQW5pbWF0aW9uQ29udHJvbGxlciwgSW9uQnV0dG9uLCBJb25CdXR0b25zLCBJb25Db250ZW50LCBJb25Gb290ZXIsIElvbkhlYWRlciwgSW9uSWNvbiwgSW9uVGl0bGUsIElvblRvb2xiYXIsIE1vZGFsQ29udHJvbGxlciwgTmF2Q29udHJvbGxlciB9IGZyb20gJ0Bpb25pYy9hbmd1bGFyL3N0YW5kYWxvbmUnO1xyXG5pbXBvcnQgeyBBY3RpdmF0ZWRSb3V0ZSwgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgQXJ0aWNsZVNlcnZpY2UgfSBmcm9tICcuLi9hcnRpY2xlLnNlcnZpY2UnO1xyXG5pbXBvcnQgUGFyc2UgZnJvbSBcInBhcnNlXCI7XHJcbmltcG9ydCB7IG9wZW5BcnRpY2xlQUlUb29sIH0gZnJvbSAnLi4vZm0tYXJ0aWNsZS1haXRvb2wvZm0tYXJ0aWNsZS1haXRvb2wuY29tcG9uZW50JztcclxuaW1wb3J0IHsgVGFza0FydGljbGVXcml0aW5nT3B0aW9ucyB9IGZyb20gJy4uL3Rhc2tzL3Rhc2stYXJ0aWNsZS13cml0aW5nLW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBUYXNrQXJ0aWNsZU91dGxpbmVFZGl0IH0gZnJvbSAnLi4vdGFza3MvdGFzay1hcnRpY2xlLW91dGxpbmUtZWRpdCc7XHJcbmltcG9ydCB7IFRhc2tBcnRpY2xlRHJhZnQgfSBmcm9tICcuLi90YXNrcy90YXNrLWFydGljbGUtZHJhZnQtY3JlYXRlJztcclxuaW1wb3J0IHsgZG9BcnRpY2xlVGFzayB9IGZyb20gJy4uL3Rhc2stYXJ0aWNsZS1nZW5lcmF0aW9uJztcclxuaW1wb3J0IHsgRHJhZnRTZXJ2aWNlIH0gZnJvbSAnLi4vZHJhZnQuc2VydmljZSc7XHJcbmltcG9ydCB7IE91dGxpbmVDb3VudFBpcGUgfSBmcm9tICcuLi9vdXRsaW5lLWNvdW50LnBpcGUnO1xyXG5pbXBvcnQgeyBTZWNyZXRUZXh0UGlwZSB9IGZyb20gJy4uLy4uLy4uL3BlcnNvbi9tb2RhbC11c2VyLXZlcmlmeS9zZWNyZXQtdGV4dC5waXBlJztcclxuaW1wb3J0IHsgQ29tcFVzZXJBdmF0YXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi91c2VyL2NvbXAtdXNlci1hdmF0YXIvY29tcC11c2VyLWF2YXRhci5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBDb21wVXBsb2FkQm9va0Jhbm5lcnNDb21wb25lbnQgfSBmcm9tICcuLi9jb21wLXVwbG9hZC1ib29rLWJhbm5lcnMvY29tcC11cGxvYWQtYm9vay1iYW5uZXJzLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2ZtLWFydGljbGUtcHJldmlldycsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2ZtLWFydGljbGUtcHJldmlldy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm0tYXJ0aWNsZS1wcmV2aWV3LmNvbXBvbmVudC5zY3NzJ10sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOltcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE1hdFRvb2xiYXJNb2R1bGUsXHJcbiAgICBNYXRDYXJkTW9kdWxlLFxyXG4gICAgTWF0Q2hpcHNNb2R1bGUsXHJcbiAgICBNYXRCdXR0b25Nb2R1bGUsXHJcbiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSxcclxuICAgIE1hdENoaXBzTW9kdWxlLFxyXG4gICAgTnpQaXBlc01vZHVsZSxcclxuICAgIE56SWNvbk1vZHVsZSxcclxuICAgIElvbkNvbnRlbnQsSW9uVG9vbGJhcixJb25UaXRsZSxJb25IZWFkZXIsXHJcbiAgICBJb25CdXR0b25zLElvbkJ1dHRvbixJb25JY29uLFxyXG4gICAgSW9uRm9vdGVyLElvblRvb2xiYXIsXHJcbiAgICBPdXRsaW5lQ291bnRQaXBlLFxyXG4gICAgU2VjcmV0VGV4dFBpcGUsXHJcbiAgICBDb21wVXNlckF2YXRhckNvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZtQXJ0aWNsZVByZXZpZXdDb21wb25lbnQgIGltcGxlbWVudHMgT25Jbml0IHtcclxuXHJcbiAgQElucHV0KCkgYXJ0aWNsZTpQYXJzZS5PYmplY3R8dW5kZWZpbmVkXHJcbiAgQElucHV0KCkgaXNEaXNwbGF5RWRpdDpib29sZWFuID0gdHJ1ZSAvL+aYr+WQpuaYvuekuue8lui+keaMiemSru+8iOm7mOiupOaYvuekuu+8iVxyXG4gIEBJbnB1dCgpIGlzRGlzcGxheVB1YmxpYzpib29sZWFuID0gdHJ1ZSAvL+aYr+WQpuaYvuekuuWFrOW8gOaMiemSru+8iOm7mOiupOaYvuekuu+8iVxyXG4gIEBJbnB1dCgpIGlzRGlzcGxheVVwbG9hZEltYWdlOmJvb2xlYW4gPSBmYWxzZSAvL+aYr+WQpuaYvuekuuWFrOW8gOaMiemSru+8iOm7mOiupOS4jeaYvuekuu+8iVxyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcm91dGU6QWN0aXZhdGVkUm91dGUsXHJcbiAgICBwcml2YXRlIHJvdXRlcjpSb3V0ZXIsXHJcbiAgICBwcml2YXRlIGRpYWxvZzpNYXREaWFsb2csXHJcbiAgICBwcml2YXRlIG5hdkN0cmw6TmF2Q29udHJvbGxlcixcclxuICAgIHByaXZhdGUgbW9kYWxDdHJsOk1vZGFsQ29udHJvbGxlcixcclxuICAgIHByaXZhdGUgYW5pbWF0aW9uQ3RybDpBbmltYXRpb25Db250cm9sbGVyLFxyXG4gICAgcHVibGljIGFydGljbGVTZXJ2OkFydGljbGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBhbGVydEN0cmw6QWxlcnRDb250cm9sbGVyLFxyXG4gICAgcHVibGljIGRyYWZ0U2VydjpEcmFmdFNlcnZpY2UsXHJcbiAgKSB7IH1cclxuXHJcbiAgaXNBdXRob3I6Ym9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBwcmV2aWV3U3R5bGU6c3RyaW5nID0gYDxzdHlsZT5cclxuICAuY29udGVudC1ibG9jayBoMSwuY29udGVudC1ibG9jayBoMiwuY29udGVudC1ibG9jayBoMywuY29udGVudC1ibG9jayBoNCwuY29udGVudC1ibG9jayBoNSwuY29udGVudC1ibG9jayBoNntcclxuICAgIGNvbG9yOndoaXRlICFpbXBvcnRhbnQ7XHJcbiAgfVxyXG4gIDwvc3R5bGU+YFxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMucm91dGUucGFyYW1zLnN1YnNjcmliZShhc3luYyBwYXJhbXM9PntcclxuICAgICAgY29uc29sZS5sb2cocGFyYW1zKTtcclxuICAgICAgbGV0IGlkID0gcGFyYW1zPy5bXCJpZFwiXTtcclxuICAgICAgY29uc29sZS5sb2coMTExLGlkKTtcclxuICAgICAgXHJcbiAgICAgIGlmKCF0aGlzLmFydGljbGU/LmlkKXtcclxuICAgICAgICBhd2FpdCB0aGlzLmxvYWRBcnRpY2xlKGlkKTtcclxuICAgICAgfVxyXG4gICAgICB0aGlzLmluaXRBcnRpY2xlQmFubmVyKCk7XHJcbiAgICAgIGlmKHRoaXMuYXJ0aWNsZT8uaWQpe1xyXG4gICAgICAgIHRoaXMuYXJ0aWNsZVNlcnYuaW5pdFd4U2hhcmVJbmZvKHRoaXMuYXJ0aWNsZSk7XHJcbiAgICAgICAgaWYoKHRoaXMuYXJ0aWNsZT8uZ2V0KFwiYXV0aG9yXCIpPy5pZHx8dGhpcy5hcnRpY2xlPy5nZXQoXCJhdXRob3JcIik/Lm9iamVjdElkKT09UGFyc2UuVXNlci5jdXJyZW50KCk/LmlkKXtcclxuICAgICAgICAgIHRoaXMuaXNBdXRob3IgPSB0cnVlXHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZHJhZnRTZXJ2Py5sb2FkQXJ0aWNsZURyYWZ0KHRoaXMuYXJ0aWNsZSk7XHJcbiAgICAgICAgdGhpcy5hcnRpY2xlU2Vydi52aWV3QXJ0aWNsZSh0aGlzLmFydGljbGUpXHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBcclxuICBoYW5kbGVOYXZFdmVudChldmVudFR5cGU6IGFueSwgb3B0aW9ucz86IGFueSkge1xyXG4gICAgLy8gY29uc29sZS5sb2coZXZlbnRUeXBlKVxyXG4gICAgbGV0IHNoYXJlRGF0YTogYW55ID0ge2FydGljbGU6bnVsbH1cclxuICAgIG9wdGlvbnMgPSB7XHJcbiAgICAgIHNoYXJlRGF0YTpzaGFyZURhdGEsXHJcbiAgICAgIGRpYWxvZzp0aGlzLmRpYWxvZyxcclxuICAgICAgYXJ0aWNsZTp0aGlzLmFydGljbGVcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKGV2ZW50VHlwZSxzaGFyZURhdGEpO1xyXG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIm9wdGlvbnNcIikge1xyXG4gICAgICBkb0FydGljbGVUYXNrKFtcclxuICAgICAgICBUYXNrQXJ0aWNsZVdyaXRpbmdPcHRpb25zKHsgc2hhcmVEYXRhOiBzaGFyZURhdGEsIGRpYWxvZzogdGhpcy5kaWFsb2csIGVkaXRPbmx5OiB0cnVlIH0pLFxyXG4gICAgICBdLCBvcHRpb25zKVxyXG4gICAgfVxyXG4gICAgaWYgKGV2ZW50VHlwZSA9PSBcIm91dGxpbmVcIikge1xyXG4gICAgICBkb0FydGljbGVUYXNrKFtcclxuICAgICAgICBUYXNrQXJ0aWNsZU91dGxpbmVFZGl0KHsgc2hhcmVEYXRhOiBzaGFyZURhdGEsIGRpYWxvZzogdGhpcy5kaWFsb2cgfSksXHJcbiAgICAgIF0sIG9wdGlvbnMpXHJcbiAgICB9XHJcbiAgICBpZiAoZXZlbnRUeXBlID09IFwiZHJhZnRcIikge1xyXG4gICAgICBkb0FydGljbGVUYXNrKFtcclxuICAgICAgICBUYXNrQXJ0aWNsZURyYWZ0KHsgaXNTZWxlY3RlZE1vZGU6IHRydWUsIHNoYXJlRGF0YTogc2hhcmVEYXRhLCBkaWFsb2c6IHRoaXMuZGlhbG9nLG1vZGFsQ3RybDp0aGlzLm1vZGFsQ3RybCB9KSxcclxuICAgICAgXSwgb3B0aW9ucywgKCkgPT4ge1xyXG4gICAgICAgIC8vIGlmKHRoaXM/LnRleHRRdWlsbD8ucXVpbGwpe1xyXG4gICAgICAgIC8vIHRoaXMudGV4dFF1aWxsLnF1aWxsLnJvb3QuaW5uZXJIVE1MID0gc2hhcmVEYXRhPy5hcnRpY2xlPy5nZXQoXCJjb250ZW50XCIpXHJcbiAgICAgICAgLy8gfVxyXG5cclxuICAgICAgfSlcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRBcnRpY2xlKGlkOnN0cmluZyl7XHJcbiAgICBsZXQgcXVlcnkgPSBuZXcgUGFyc2UuUXVlcnkoXCJBcnRpY2xlXCIpO1xyXG4gICAgdGhpcy5hcnRpY2xlID0gYXdhaXQgcXVlcnkuZ2V0KGlkKTtcclxuICAgIGNvbnNvbGUubG9nKHRoaXMuYXJ0aWNsZSk7XHJcbiAgICBcclxuICB9XHJcblxyXG4gIHNoYXJlQXJ0aWNsZSgpe1xyXG4gICAgdGhpcy5hcnRpY2xlU2Vydi5zaGFyZUFydGljbGUodGhpcy5hcnRpY2xlKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGVkaXRBcnRpY2xlKCl7XHJcbiAgICBpZihkb2N1bWVudC5ib2R5LmNsaWVudFdpZHRoPjEwMDApe1xyXG4gICAgICB0aGlzLm5hdkN0cmwubmF2aWdhdGVGb3J3YXJkKFwiL2VkaXRvci9hcnRpY2xlL1wiK3RoaXMuYXJ0aWNsZT8uaWQpO1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuXHJcbiAgICBpZih0aGlzLmFydGljbGUpe1xyXG4gICAgICBvcGVuQXJ0aWNsZUFJVG9vbCh7XHJcbiAgICAgICAgbW9kYWxDdHJsOnRoaXMubW9kYWxDdHJsLFxyXG4gICAgICAgIGFsZXJ0Q3RybDp0aGlzLmFsZXJ0Q3RybCxcclxuICAgICAgICBhbmltYXRpb25DdHJsOnRoaXMuYW5pbWF0aW9uQ3RybCxcclxuICAgICAgICBhcnRpY2xlOnRoaXMuYXJ0aWNsZVxyXG4gICAgICB9KTtcclxuICAgIH1cclxuICAgIHJldHVyblxyXG4gIH1cclxuICAvLyDliJ3lp4vljJbova7mkq3lm77lm77niYdcclxuICBiYW5uZXJMaXN0OkFycmF5PHN0cmluZz4gPSBbXVxyXG4gIGluaXRBcnRpY2xlQmFubmVyKCl7XHJcbiAgICB0aGlzLmJhbm5lckxpc3QgPSB0aGlzLmFydGljbGVTZXJ2LmdldEFydGljbGVCYW5uZXIodGhpcy5hcnRpY2xlKVxyXG4gICAgaWYodGhpcy5iYW5uZXJMaXN0Py5sZW5ndGgpe1xyXG4gICAgICB0aGlzLmluaXRTd2lwZXJUaW1lRXZlbnQoKVxyXG4gICAgfVxyXG4gIH1cclxuICBiYWNrKCl7XHJcbiAgICBpZihsb2NhdGlvbj8ucGF0aG5hbWU/LmluZGV4T2YoXCJjaGFwdGVyXCIpPi0xKXsgLy8g6Lez6L2s55uu5b2V6aG1XHJcbiAgICAgIGxldCBwYXRoID0gbG9jYXRpb24ucGF0aG5hbWUuc3BsaXQoXCIvY2hhcHRlclwiKVswXVxyXG4gICAgICAvLyB0aGlzLnJvdXRlci5uYXZpZ2F0ZUJ5VXJsKHBhdGgpO1xyXG4gICAgICB0aGlzLm5hdkN0cmwubmF2aWdhdGVSb290KHBhdGgpO1xyXG4gICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIGlmKGxvY2F0aW9uPy5wYXRobmFtZT8uaW5kZXhPZihcImFydGljbGVcIik+LTEpe1xyXG4gICAgICAgLy8g6Lez6L2s5pWF5LqL5bm/5Zy6XHJcbiAgICAgICAgdGhpcy5uYXZDdHJsLm5hdmlnYXRlUm9vdChcIi9hcHAvYm9va1wiKTtcclxuICAgICAgICByZXR1cm5cclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxDdHJsPy5kaXNtaXNzKCk7XHJcbiAgfVxyXG4gICAvLyDlhazlvIDmlofnq6BcclxuICAgb25QdWJsaWNDaGFuZ2UoZXY6TWF0U2xpZGVUb2dnbGVDaGFuZ2Upe1xyXG4gICAgdGhpcy5hcnRpY2xlPy5zZXQoXCJpc1B1YmxpY1wiLGV2Py5jaGVja2VkKVxyXG4gICAgdGhpcy5hcnRpY2xlPy5zYXZlKCk7XHJcbiAgfVxyXG4gIC8vIOWIoOmZpOaWh+eroFxyXG4gIGFzeW5jIGRlbGV0ZSgpe1xyXG5cclxuICAgIGNvbnN0IGFsZXJ0ID0gYXdhaXQgdGhpcy5hbGVydEN0cmwuY3JlYXRlKHtcclxuICAgICAgaGVhZGVyOiAn5Yig6Zmk5paH56ugJyxcclxuICAgICAgc3ViSGVhZGVyOiAn5oKo56Gu6K6k5Yig6Zmk5paH56ug5Y+K5YW25pWw5o2u5ZCX77yfJyxcclxuICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgIHtcclxuICAgICAgICAgIHRleHQ6ICflj5bmtognLFxyXG4gICAgICAgICAgcm9sZTogJ2NhbmNlbCcsXHJcbiAgICAgICAgICBoYW5kbGVyOiAoKSA9PiB7XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAge1xyXG4gICAgICAgICAgdGV4dDogJ+WIoOmZpCcsXHJcbiAgICAgICAgICByb2xlOiBcImNvbmZpcm1cIixcclxuICAgICAgICAgIGhhbmRsZXI6ICgpID0+IHtcclxuICAgICAgICAgICAgdGhpcy5hcnRpY2xlPy5zZXQoXCJpc0RlbGV0ZWRcIix0cnVlKTtcclxuICAgICAgICAgICAgdGhpcy5hcnRpY2xlPy5zYXZlKCk7XHJcbiAgICAgICAgICAgIHRoaXMubW9kYWxDdHJsLmRpc21pc3MoKTtcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgfSxcclxuICAgICAgXSxcclxuICAgIH0pO1xyXG5cclxuICAgIGF3YWl0IGFsZXJ0LnByZXNlbnQoKTtcclxuXHJcblxyXG4gIH1cclxuICAvLyDova7mkq3lm77ljLrln5/ku6PnoIFcclxuICAvLyBASG9zdExpc3RlbmVyKCd3aW5kb3c6d2hlZWwnLCBbJyRldmVudCddKVxyXG4gIG9uU2Nyb2xsKGV2ZW50OiBXaGVlbEV2ZW50KSB7XHJcbiAgICByZXR1cm47XHJcbiAgICBpZiAoZXZlbnQuZGVsdGFZID4gMCkge1xyXG4gICAgICAvLyDlkJHkuIvmu5rliqhcclxuICAgICAgKHRoaXMucGFnZVN3aXBlciBhcyBhbnkpPy5zbGlkZU5leHQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIOWQkeS4iua7muWKqFxyXG4gICAgICAodGhpcy5wYWdlU3dpcGVyIGFzIGFueSk/LnNsaWRlUHJldigpO1xyXG4gICAgfVxyXG4gIH1cclxuICBwYWdlU3dpcGVyOlN3aXBlcnx1bmRlZmluZWR8YW55XHJcbiAgaW5pdFN3aXBlclRpbWVFdmVudCgpe1xyXG4gICAgLy8g5Yid5aeL5YyW6L2u5pKt5Zu+XHJcbiAgICB0aGlzLnBhZ2VTd2lwZXIgPSBuZXcgU3dpcGVyKFwiLnN3aXBlclwiLHtcclxuICAgICAgLy8gZGlyZWN0aW9uOlwidmVydGljYWxcIixcclxuICAgICAgbW91c2V3aGVlbDp0cnVlLFxyXG4gICAgICBlZmZlY3Q6XCJmYWRlXCIsXHJcbiAgICAgIGxvb3A6dHJ1ZSxcclxuICAgICAgcGFnaW5hdGlvbjp7XHJcbiAgICAgICAgZWw6ICcuc3dpcGVyLXBhZ2luYXRpb24nLFxyXG4gICAgICAgIGNsaWNrYWJsZTp0cnVlXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuICBpc1NoYXJlID0gZmFsc2U7XHJcbiAgb3Blbk92ZXJsYXkoKSB7XHJcbiAgICB0aGlzLmlzU2hhcmUgPSB0cnVlO1xyXG4gIH1cclxuICBjbG9zZU92ZXJsYXkoKSB7XHJcbiAgICB0aGlzLmlzU2hhcmUgPSBmYWxzZTtcclxuICB9XHJcbiAgb3BlblVwbG9hZEJhbm5lcigpIHtcclxuICAgIGxldCBhcnRpY2xlSWQ6YW55ID0gdGhpcy5hcnRpY2xlPy5pZDtcclxuICAgIG9wZW5VcGxvYWRCYW5uZXJNb2RhbCh0aGlzLm1vZGFsQ3RybCwgYXJ0aWNsZUlkKS50aGVuKG5ld0Jhbm5lciA9PiB7XHJcbiAgICAgIGlmIChuZXdCYW5uZXIpIHtcclxuICAgICAgICB0aGlzLmJhbm5lckxpc3QucHVzaChuZXdCYW5uZXIpXHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXJ0aWNsZS1wcmV2aWV3LWRpYWxvZycsXHJcbiAgdGVtcGxhdGU6ICc8Zm0tYXJ0aWNsZS1wcmV2aWV3IFthcnRpY2xlXT1cImRhdGE/LmFydGljbGVcIj48L2ZtLWFydGljbGUtcHJldmlldz4nLFxyXG4gIHN0eWxlczpgXHJcbiAgZm0tYXJ0aWNsZS1wcmV2aWV3e1xyXG4gIH1cclxuICBgLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW01hdERpYWxvZ01vZHVsZSxGbUFydGljbGVQcmV2aWV3Q29tcG9uZW50XSxcclxufSlcclxuZXhwb3J0IGNsYXNzIERpYWxvZ0FydGljbGVQcmV2aWV3IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHB1YmxpYyBkaWFsb2dSZWY6IE1hdERpYWxvZ1JlZjxEaWFsb2dBcnRpY2xlUHJldmlldz4sXHJcbiAgICBASW5qZWN0KE1BVF9ESUFMT0dfREFUQSkgcHVibGljIGRhdGE6IGFueSxcclxuICApIHtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBvcGVuVXBsb2FkQmFubmVyTW9kYWwobW9kYWxDdHJsOiBNb2RhbENvbnRyb2xsZXIsIGFydGljbGVJZDogc3RyaW5nKSB7XHJcbiAgY29uc3QgbW9kYWwgPSBhd2FpdCBtb2RhbEN0cmwuY3JlYXRlKHtcclxuICAgIGNvbXBvbmVudDogQ29tcFVwbG9hZEJvb2tCYW5uZXJzQ29tcG9uZW50LFxyXG4gICAgY29tcG9uZW50UHJvcHM6IHsgYXJ0aWNsZUlkIH0sIC8vIOS8oOmAkiBhcnRpY2xlSWRcclxuICAgIGJyZWFrcG9pbnRzOiBbMC41LCAwLjgsIDFdLFxyXG4gICAgaW5pdGlhbEJyZWFrcG9pbnQ6IDAuOCxcclxuICB9KTtcclxuICBhd2FpdCBtb2RhbC5wcmVzZW50KCk7XHJcbiAgY29uc3QgeyBkYXRhLCByb2xlIH0gPSBhd2FpdCBtb2RhbC5vbldpbGxEaXNtaXNzKCk7XHJcbiAgaWYgKHJvbGUgPT09IFwiY29uZmlybVwiICYmIGRhdGE/LnN1Y2Nlc3MpIHtcclxuICAgIGNvbnNvbGUubG9nKCfmlrDnq6DoioI6JywgZGF0YS5iYW5uZXIpOyAvLyDlpITnkIbov5Tlm57nmoTnq6DoioIgSURcclxuICAgIHJldHVybiBkYXRhLmJhbm5lcjsgLy8g6L+U5Zue5paw56ug6IqCIElEXHJcbiAgfVxyXG4gIHJldHVybiBudWxsO1xyXG59XHJcbiIsIjxpb24taGVhZGVyIFt0cmFuc2x1Y2VudF09XCJ0cnVlXCIgY29sbGFwc2U9XCJmYWRlXCIgY2xhc3M9XCJpb24tbm8tYm9yZGVyXCI+XHJcbiAgPGlvbi10b29sYmFyPlxyXG4gICAgPCEtLSDov5Tlm54gLS0+XHJcbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInNlY29uZGFyeVwiPlxyXG4gICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiYmFjaygpXCI+XHJcbiAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiYXJyb3ctYmFjay1jaXJjbGVcIj48L2lvbi1pY29uPlxyXG4gICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgIEBpZihpc0F1dGhvcil7XHJcbiAgICAgICAgQGlmKGlzRGlzcGxheVB1YmxpYz09PXRydWUpe1xyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjthbGlnbi1pdGVtczogY2VudGVyO21hcmdpbi1sZWZ0OiAyMHB4O1wiPlxyXG4gICAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY2hlY2tlZF09XCJhcnRpY2xlPy5nZXQoJ2lzUHVibGljJylcIiAoY2hhbmdlKT1cIm9uUHVibGljQ2hhbmdlKCRldmVudClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidG9nZ2xlLXRleHRcIj7lhazlvIA8L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIDwvaW9uLWJ1dHRvbnM+XHJcbiAgICA8aW9uLXRpdGxlIHN0eWxlPVwiZm9udC1zaXplOiAxLjNyZW07Zm9udC13ZWlnaHQ6IGJvbGQ7XCI+5paH56ug6aKE6KeIPC9pb24tdGl0bGU+XHJcbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInByaW1hcnlcIj5cclxuICAgICAgPCEtLSDnvJbovpEgLS0+XHJcbiAgICAgIEBpZihpc0F1dGhvcil7XHJcbiAgICAgICAgPCEtLSA8ZGl2IHN0eWxlPVwiZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDogY2VudGVyO2FsaWduLWl0ZW1zOiBjZW50ZXI7XCI+XHJcbiAgICAgICAgICA8bWF0LXNsaWRlLXRvZ2dsZSBbY2hlY2tlZF09XCJhcnRpY2xlPy5nZXQoJ2lzUHVibGljJylcIiAoY2hhbmdlKT1cIm9uUHVibGljQ2hhbmdlKCRldmVudClcIj48L21hdC1zbGlkZS10b2dnbGU+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRvZ2dsZS10ZXh0XCI+5YWs5byAPC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICBAaWYoaXNEaXNwbGF5RWRpdD09PXRydWUpe1xyXG4gICAgICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cImVkaXRBcnRpY2xlKClcIiBzdHlsZT1cImRpc3BsYXk6IG5vbmU7XCI+XHJcbiAgICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImNyZWF0ZVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIDwhLS0g5LiK5Lyg6L2u5pKt5Zu+IC0tPlxyXG4gICAgICBAaWYoaXNBdXRob3Ipe1xyXG4gICAgICAgIDwhLS0gPGRpdiBzdHlsZT1cImRpc3BsYXk6ZmxleDtqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjthbGlnbi1pdGVtczogY2VudGVyO1wiPlxyXG4gICAgICAgICAgPG1hdC1zbGlkZS10b2dnbGUgW2NoZWNrZWRdPVwiYXJ0aWNsZT8uZ2V0KCdpc1B1YmxpYycpXCIgKGNoYW5nZSk9XCJvblB1YmxpY0NoYW5nZSgkZXZlbnQpXCI+PC9tYXQtc2xpZGUtdG9nZ2xlPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0b2dnbGUtdGV4dFwiPuWFrOW8gDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPCEtLSBAaWYoaXNEaXNwbGF5VXBsb2FkSW1hZ2U9PT10cnVlKXsgLS0+XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwib3BlblVwbG9hZEJhbm5lcigpXCI+XHJcbiAgICAgICAgICAgIDwhLS0gPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY3JlYXRlXCI+PC9pb24taWNvbj4gLS0+XHJcbiAgICAgICAgICAgICA8ZGl2PuS4iuS8oOWwgemdojwvZGl2PlxyXG4gICAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDwhLS0gfSAtLT5cclxuICAgICAgfVxyXG4gICAgICA8IS0tIOWIhuS6qyAtLT5cclxuICAgICAgPCEtLSAoY2xpY2spPVwic2hhcmVBcnRpY2xlKClcIiAtLT5cclxuICAgICAgPGlvbi1idXR0b24gKGNsaWNrKT1cIm9wZW5PdmVybGF5KClcIj5cclxuICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJzaGFyZVwiPjwvaW9uLWljb24+XHJcbiAgICAgIDwvaW9uLWJ1dHRvbj5cclxuICAgIDwvaW9uLWJ1dHRvbnM+XHJcbiAgPC9pb24tdG9vbGJhcj5cclxuPC9pb24taGVhZGVyPlxyXG48ZGl2IGNsYXNzPVwic2hhcmV0T3ZlcmxheVwiIChjbGljayk9XCJjbG9zZU92ZXJsYXkoKVwiICpuZ0lmPVwiaXNTaGFyZVwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwib3ZlcmxheS1jb250ZW50XCI+XHJcbiAgICA8aW1nIHNyYz1cImh0dHBzOi8vc3RhdGljLndzLjEyNi5uZXQvMTYzL2Zyb250ZW5kL2JhY2tmbG93LXNzci9hcnRpY2xlL3NoYXJlLWNvdmVyLjk4NTQzYTAwODhhNC5wbmdcIiBhbHQ9XCJcIj5cclxuICAgIDxpb24taWNvbiBzdHlsZT1cImNvbG9yOiB3aGl0ZTtcIiBuYW1lPVwiZWxsaXBzaXMtaG9yaXpvbnRhbFwiPjwvaW9uLWljb24+XHJcblxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuPGlvbi1jb250ZW50PlxyXG4gIDxkaXYgY2xhc3M9XCJwYWdlXCI+XHJcbiAgICA8ZGl2IHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogIzFlMWYyMjtcIj5cclxuICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiYnRuXCI+XHJcbiAgICAgICAgPGJ1dHRvbiBtYXQtcmFpc2VkLWJ1dHRvbiBjb2xvcj1cInByaW1hcnlcIj5cclxuICAgICAgICAgIDxzcGFuIG56LWljb24gbnpUeXBlPVwiY2xvc2VcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+IC0tPlxyXG4gICAgICBcclxuICAgICAgICA8IS0tIOi9ruaSreWbviAtLT5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3dpcGVyXCIgKHdoZWVsKT1cIm9uU2Nyb2xsKCRldmVudClcIiAqbmdJZj1cImJhbm5lckxpc3Q/Lmxlbmd0aFwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cInN3aXBlci13cmFwcGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzd2lwZXItc2xpZGUgYmctcHVycGxlLWJsdWVcIiAqbmdGb3I9XCJsZXQgaW1nVXJsIG9mIGJhbm5lckxpc3RcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiaW1nVXJsXCIgYWx0PVwiXCIgc3Jjc2V0PVwiXCI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICBcclxuICAgICAgPCEtLSDmoIfpopjjgIHlhbPplK7lrZcgLS0+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGUtaGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDEgc3R5bGU9XCJjb2xvcjogIzVhNTVkMSAhaW1wb3J0YW50O1wiPnt7YXJ0aWNsZT8uZ2V0KCd0aXRsZScpfX08L2gxPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjaGlwLWxpc3RcIj7lhbPplK7lrZfvvJpcclxuICAgICAgICAgIDwhLS0gPG1hdC1jaGlwICpuZ0Zvcj1cImxldCBrZXl3b3JkIG9mIGFydGljbGU/LmdldCgna2V5d29yZHMnKVwiPnt7a2V5d29yZH19PC9tYXQtY2hpcD4gLS0+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1ZVdvcmRcIiAqbmdGb3I9XCJsZXQga2V5d29yZCBvZiBhcnRpY2xlPy5nZXQoJ2tleXdvcmRzJylcIj5cclxuICAgICAgICAgICAgI3t7a2V5d29yZH19XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIEBpZihpc0F1dGhvcil7XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1pbmZvXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhcnRpY2xlPy5nZXQoJ3dyaXRpbmdPcHRpb25zJylcIj5cclxuICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJoYW5kbGVOYXZFdmVudCgnb3B0aW9ucycpXCI+6K6+ICDlrprvvJpcclxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jaGlwIChjbGljayk9XCJoYW5kbGVOYXZFdmVudCgnb3V0bGluZScpXCIgW2Rpc2FibGVkXT1cIiFhcnRpY2xlPy5nZXQoJ291dGxpbmVKc29uJylcIj5cclxuICAgICAgICAgICAgICAgICAg5aSn57qyXHJcbiAgICAgICAgICAgICAgICA8L21hdC1jaGlwPiAtLT5cclxuICAgICAgICAgICAgICAgIDwhLS0gPG1hdC1jaGlwICpuZ0lmPVwiYXJ0aWNsZT8uZ2V0KCd3cml0aW5nT3B0aW9ucycpPy53cml0aW5nU3R5bGVcIj57e2FydGljbGU/LmdldCgnd3JpdGluZ09wdGlvbnMnKT8ud3JpdGluZ1N0eWxlfX08L21hdC1jaGlwPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1jaGlwICpuZ0lmPVwiYXJ0aWNsZT8uZ2V0KCd3cml0aW5nT3B0aW9ucycpPy53b3JkQ291bnRcIj7nuqZ7e2FydGljbGU/LmdldCgnd3JpdGluZ09wdGlvbnMnKT8ud29yZENvdW50fX3lrZc8L21hdC1jaGlwPiAtLT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY3VlV29yZFwiICpuZ0lmPVwiYXJ0aWNsZT8uZ2V0KCd3cml0aW5nT3B0aW9ucycpPy53cml0aW5nU3R5bGVcIj57e2FydGljbGU/LmdldCgnd3JpdGluZ09wdGlvbnMnKT8ud3JpdGluZ1N0eWxlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1ZVdvcmRcIiAqbmdJZj1cImFydGljbGU/LmdldCgnd3JpdGluZ09wdGlvbnMnKT8ud29yZENvdW50XCI+57qme3thcnRpY2xlPy5nZXQoJ3dyaXRpbmdPcHRpb25zJyk/LndvcmRDb3VudH195a2XPC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFydGljbGU/LmdldCgnb3V0bGluZUpzb24nKVwiPlxyXG4gICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cImhhbmRsZU5hdkV2ZW50KCdvdXRsaW5lJylcIj7mj5AgIOe6su+8mlxyXG4gICAgICAgICAgICAgICAgPCEtLSA8bWF0LWNoaXA+e3thcnRpY2xlPy5nZXQoJ291dGxpbmVKc29uJykgfCBvdXRsaW5lQ291bnR9feWtlzwvbWF0LWNoaXA+IC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjdWVXb3JkXCI+e3thcnRpY2xlPy5nZXQoJ291dGxpbmVKc29uJykgfCBvdXRsaW5lQ291bnR9feWtlzwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJhcnRpY2xlPy5pZFwiIChjbGljayk9XCJoYW5kbGVOYXZFdmVudCgnZHJhZnQnKVwiPueov+S7tueuse+8mlxyXG4gICAgICAgICAgICAgIDwhLS0gPG1hdC1jaGlwPnt7ZHJhZnRTZXJ2LkRyYWZ0Q291bnRNYXA/LlthcnRpY2xlPy5pZHx8JyddPy50b3RhbCB8fCAwfX3nr4c8L21hdC1jaGlwPiAtLT5cclxuICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImN1ZVdvcmRcIj57e2RyYWZ0U2Vydi5EcmFmdENvdW50TWFwPy5bYXJ0aWNsZT8uaWR8fCcnXT8udG90YWwgfHwgMH1956+HPC9zcGFuPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIH1cclxuICAgIFxyXG4gICAgICAgIDwhLS0g5paH56ug5YaF5a65IC0tPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50XCI+XHJcbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBpdGVtIG9mIGFydGljbGU/LmdldCgnY29udGVudEFycmF5Jyk7bGV0IGluZGV4PWluZGV4O1wiID5cclxuICAgICAgICAgICAgPCEtLSDnq6DoioLkv6Hmga8gLS0+XHJcbiAgICAgICAgICAgIDwhLS0gPGgyIHN0eWxlPVwibWFyZ2luOjVweCAwcHg7XCIgKm5nSWY9XCJhcnRpY2xlPy5nZXQoJ291dGxpbmVKc29uJyk/LnNlY3Rpb25zPy5baW5kZXhdPy50aXRsZVwiPnt7YXJ0aWNsZT8uZ2V0KCdvdXRsaW5lSnNvbicpPy5zZWN0aW9ucz8uW2luZGV4XT8udGl0bGV9fTwvaDI+IC0tPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1ibG9ja1wiIFtpbm5lckhUTUxdPVwiKHByZXZpZXdTdHlsZStpdGVtPy5jb250ZW50KXwgIG56U2FuaXRpemVyOiAnaHRtbCdcIj48L2Rpdj5cclxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDoxMDBweDt3aWR0aDoxMDAlO1wiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgPC9kaXY+XHJcblxyXG48L2lvbi1jb250ZW50PlxyXG5cclxuPGlvbi1mb290ZXIgY2xhc3M9XCJpb24tbm8tYm9yZGVyXCI+XHJcbiAgPGlvbi10b29sYmFyPlxyXG4gICAgQGlmKGFydGljbGU/LmdldChcImF1dGhvclwiKSl7XHJcbiAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cInN0YXJ0XCI+XHJcbiAgICAgIDxpb24tYnV0dG9uPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdXRob3JcIj5cclxuICAgICAgICAgIEBpZihhcnRpY2xlPy5nZXQoXCJhdXRob3JcIik/LmdldChcIm5pY2tuYW1lXCIpKXsgXHJcbiAgICAgICAgICAgIDxhcHAtY29tcC11c2VyLWF2YXRhciBbdXNlcl09XCJhcnRpY2xlPy5nZXQoJ2F1dGhvcicpXCI+PC9hcHAtY29tcC11c2VyLWF2YXRhcj5cclxuICAgICAgICAgIH1cclxuICAgICAgICAgIDxzcGFuPlxyXG4gICAgICAgICAgICB7e2FydGljbGU/LmdldChcImF1dGhvclwiKT8uZ2V0KFwibmlja25hbWVcIikgfHwgKGFydGljbGU/LmdldChcImF1dGhvclwiKT8uZ2V0KFwicmVhbG5hbWVcIil8IHNlY3JldFRleHQpfX1cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgIDwvaW9uLWJ1dHRvbnM+XHJcbiAgICB9XHJcbiAgICBAaWYoYXJ0aWNsZT8uaWQpe1xyXG4gICAgICA8aW9uLWJ1dHRvbnMgc2xvdD1cImVuZFwiPlxyXG4gICAgICAgIEBpZihpc0F1dGhvcil7XHJcbiAgICAgICAgICA8aW9uLWJ1dHRvbiAoY2xpY2spPVwiZGVsZXRlKClcIiBjb2xvcj1cIm1lZGl1bVwiIHNpemU9XCJzbWFsbFwiPlxyXG4gICAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIG5hbWU9XCJ0cmFzaFwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgfVxyXG4gICAgICAgIDxpb24tYnV0dG9uIGNvbG9yPVwibWVkaXVtXCIgc2l6ZT1cInNtYWxsXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNvdW50XCI+e3thcnRpY2xlPy5nZXQoXCJ2aWV3Q291bnRcIil8fFwiXCJ9fTwvc3Bhbj5cclxuICAgICAgICAgIDxpb24taWNvbiBzbG90PVwiaWNvbi1vbmx5XCIgbmFtZT1cImV5ZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPGlvbi1idXR0b24gW2NvbG9yXT1cImFydGljbGVTZXJ2Py5saWtlTWFwW2FydGljbGU/LmlkfHwnNjY2J10/J2Rhbmdlcic6J21lZGl1bSdcIiBzaXplPVwic21hbGxcIiAoY2xpY2spPVwiYXJ0aWNsZVNlcnYubGlrZUFydGljbGUoYXJ0aWNsZSlcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIj57e2FydGljbGU/LmdldChcImxpa2VDb3VudFwiKXx8XCJcIn19PC9zcGFuPlxyXG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBbbmFtZV09XCInaGVhcnQnKyhhcnRpY2xlU2Vydj8ubGlrZU1hcFthcnRpY2xlPy5pZHx8JzY2NiddPycnOictb3V0bGluZScpXCI+PC9pb24taWNvbj5cclxuICAgICAgICA8L2lvbi1idXR0b24+XHJcbiAgICAgICAgPGlvbi1idXR0b24gW2NvbG9yXT1cImFydGljbGVTZXJ2Py5jb2xsZWN0TWFwW2FydGljbGU/LmlkfHwnNjY2J10/J3dhcm4nOidtZWRpdW0nXCIgc2l6ZT1cInNtYWxsXCIgKGNsaWNrKT1cImFydGljbGVTZXJ2Lmxpa2VBcnRpY2xlKGFydGljbGUsJ2NvbGxlY3QnKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb3VudFwiPnt7YXJ0aWNsZT8uZ2V0KFwiY29sbGVjdENvdW50XCIpfHxcIlwifX08L3NwYW4+XHJcbiAgICAgICAgICA8aW9uLWljb24gc2xvdD1cImljb24tb25seVwiIFtuYW1lXT1cIidzdGFyJysoYXJ0aWNsZVNlcnY/LmNvbGxlY3RNYXBbYXJ0aWNsZT8uaWR8fCc2NjYnXT8nJzonLW91dGxpbmUnKVwiPjwvaW9uLWljb24+XHJcbiAgICAgICAgPC9pb24tYnV0dG9uPlxyXG4gICAgICAgIDwhLS0gPGlvbi1idXR0b24gY29sb3I9XCJtZWRpdW1cIiBzaXplPVwic21hbGxcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY291bnRcIj57e2FydGljbGU/LmdldChcImNvbW1lbnRDb3VudFwiKXx8XCJcIn19PC9zcGFuPlxyXG4gICAgICAgICAgPGlvbi1pY29uIHNsb3Q9XCJpY29uLW9ubHlcIiBuYW1lPVwiY2hhdGJ1YmJsZS1vdXRsaW5lXCI+PC9pb24taWNvbj5cclxuICAgICAgICA8L2lvbi1idXR0b24+IC0tPlxyXG4gICAgICA8L2lvbi1idXR0b25zPlxyXG4gICAgfVxyXG5cclxuICA8L2lvbi10b29sYmFyPlxyXG48L2lvbi1mb290ZXI+Il19
|
|
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/text/fm-article-editor/fm-article-preview/fm-article-preview.component.mjs
|
|
7
|
+
*/
|
|
8
|
+
import{CommonModule}from"@angular/common";import{Component,Inject,Input}from"@angular/core";import{MatCardModule}from"@angular/material/card";import{MatChipsModule}from"@angular/material/chips";import{MatSlideToggleModule}from"@angular/material/slide-toggle";import{MatDialogRef,MAT_DIALOG_DATA,MatDialog,MatDialogModule}from"@angular/material/dialog";import{MatToolbarModule}from"@angular/material/toolbar";import{NzPipesModule}from"ng-zorro-antd/pipes";import{Swiper}from"swiper";import{NzIconModule}from"ng-zorro-antd/icon";import{MatButtonModule}from"@angular/material/button";import{AlertController,AnimationController,IonButton,IonButtons,IonContent,IonFooter,IonHeader,IonIcon,IonTitle,IonToolbar,ModalController,NavController}from"@ionic/angular/standalone";import{ActivatedRoute,Router}from"@angular/router";import{ArticleService}from"../article.service";import{FmodeParse,FmodeObject}from"@fmode/parse";import{openArticleAITool}from"../fm-article-aitool/fm-article-aitool.component";import{TaskArticleWritingOptions}from"../tasks/task-article-writing-options";import{TaskArticleOutlineEdit}from"../tasks/task-article-outline-edit";import{TaskArticleDraft}from"../tasks/task-article-draft-create";import{doArticleTask}from"../task-article-generation";import{DraftService}from"../draft.service";import{OutlineCountPipe}from"../outline-count.pipe";import{SecretTextPipe}from"../../../person/modal-user-verify/secret-text.pipe";import{CompUserAvatarComponent}from"../../../user/comp-user-avatar/comp-user-avatar.component";import{CompUploadBookBannersComponent}from"../comp-upload-book-banners/comp-upload-book-banners.component";import*as i0 from"@angular/core";import*as i1 from"@angular/router";import*as i2 from"@angular/material/dialog";import*as i3 from"@ionic/angular/standalone";import*as i4 from"../article.service";import*as i5 from"../draft.service";import*as i6 from"@angular/common";import*as i7 from"@angular/material/slide-toggle";import*as i8 from"ng-zorro-antd/pipes";const Parse=FmodeParse.with("nova");export class FmArticlePreviewComponent{constructor(t,e,n,i,o,a,r,l,c){this.route=t,this.router=e,this.dialog=n,this.navCtrl=i,this.modalCtrl=o,this.animationCtrl=a,this.articleServ=r,this.alertCtrl=l,this.draftServ=c,this.isDisplayEdit=!0,this.isDisplayPublic=!0,this.isDisplayUploadImage=!1,this.isAuthor=!1,this.previewStyle="<style>\n .content-block h1,.content-block h2,.content-block h3,.content-block h4,.content-block h5,.content-block h6{\n color:white !important;\n }\n </style>",this.bannerList=[],this.isShare=!1}ngOnInit(){this.route.params.subscribe((async t=>{console.log(t);let e=t?.id;console.log(111,e),this.article?.id||await this.loadArticle(e),this.initArticleBanner(),this.article?.id&&(this.articleServ.initWxShareInfo(this.article),(this.article?.get("author")?.id||this.article?.get("author")?.objectId)==Parse.User.current()?.id&&(this.isAuthor=!0),this.draftServ?.loadArticleDraft(this.article),this.articleServ.viewArticle(this.article))}))}handleNavEvent(t,e){let n={article:null};e={shareData:n,dialog:this.dialog,article:this.article},console.log(t,n),"options"==t&&doArticleTask([TaskArticleWritingOptions({shareData:n,dialog:this.dialog,editOnly:!0})],e),"outline"==t&&doArticleTask([TaskArticleOutlineEdit({shareData:n,dialog:this.dialog})],e),"draft"==t&&doArticleTask([TaskArticleDraft({isSelectedMode:!0,shareData:n,dialog:this.dialog,modalCtrl:this.modalCtrl})],e,(()=>{}))}async loadArticle(t){let e=new Parse.Query("Article");this.article=await e.get(t),console.log(this.article)}shareArticle(){this.articleServ.shareArticle(this.article)}async editArticle(){document.body.clientWidth>1e3?this.navCtrl.navigateForward("/editor/article/"+this.article?.id):this.article&&openArticleAITool({modalCtrl:this.modalCtrl,alertCtrl:this.alertCtrl,animationCtrl:this.animationCtrl,article:this.article})}initArticleBanner(){this.bannerList=this.articleServ.getArticleBanner(this.article),this.bannerList?.length&&this.initSwiperTimeEvent()}back(){if(location?.pathname?.indexOf("chapter")>-1){let t=location.pathname.split("/chapter")[0];this.navCtrl.navigateRoot(t)}else location?.pathname?.indexOf("article")>-1?this.navCtrl.navigateRoot("/app/book"):this.modalCtrl?.dismiss()}onPublicChange(t){this.article?.set("isPublic",t?.checked),this.article?.save()}async delete(){const t=await this.alertCtrl.create({header:"删除文章",subHeader:"您确认删除文章及其数据吗?",buttons:[{text:"取消",role:"cancel",handler:()=>{}},{text:"删除",role:"confirm",handler:()=>{this.article?.set("isDeleted",!0),this.article?.save(),this.modalCtrl.dismiss()}}]});await t.present()}onScroll(t){}initSwiperTimeEvent(){this.pageSwiper=new Swiper(".swiper",{mousewheel:!0,effect:"fade",loop:!0,pagination:{el:".swiper-pagination",clickable:!0}})}openOverlay(){this.isShare=!0}closeOverlay(){this.isShare=!1}openUploadBanner(){let t=this.article?.id;openUploadBannerModal(this.modalCtrl,t).then((t=>{t&&this.bannerList.push(t)}))}static{this.ɵfac=i0.ɵɵngDeclareFactory({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmArticlePreviewComponent,deps:[{token:i1.ActivatedRoute},{token:i1.Router},{token:i2.MatDialog},{token:i3.NavController},{token:i3.ModalController},{token:i3.AnimationController},{token:i4.ArticleService},{token:i3.AlertController},{token:i5.DraftService}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"17.0.0",version:"17.3.12",type:FmArticlePreviewComponent,isStandalone:!0,selector:"fm-article-preview",inputs:{article:"article",isDisplayEdit:"isDisplayEdit",isDisplayPublic:"isDisplayPublic",isDisplayUploadImage:"isDisplayUploadImage"},ngImport:i0,template:'<ion-header [translucent]="true" collapse="fade" class="ion-no-border">\n <ion-toolbar>\n \x3c!-- 返回 --\x3e\n <ion-buttons slot="secondary">\n <ion-button (click)="back()">\n <ion-icon slot="icon-only" name="arrow-back-circle"></ion-icon>\n </ion-button>\n @if(isAuthor){\n @if(isDisplayPublic===true){\n <div style="display:flex;justify-content: center;align-items: center;margin-left: 20px;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div>\n }\n }\n </ion-buttons>\n <ion-title style="font-size: 1.3rem;font-weight: bold;">文章预览</ion-title>\n <ion-buttons slot="primary">\n \x3c!-- 编辑 --\x3e\n @if(isAuthor){\n \x3c!-- <div style="display:flex;justify-content: center;align-items: center;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div> --\x3e\n @if(isDisplayEdit===true){\n <ion-button (click)="editArticle()" style="display: none;">\n <ion-icon slot="icon-only" name="create"></ion-icon>\n </ion-button>\n }\n }\n \x3c!-- 上传轮播图 --\x3e\n @if(isAuthor){\n \x3c!-- <div style="display:flex;justify-content: center;align-items: center;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div> --\x3e\n \x3c!-- @if(isDisplayUploadImage===true){ --\x3e\n <ion-button (click)="openUploadBanner()">\n \x3c!-- <ion-icon slot="icon-only" name="create"></ion-icon> --\x3e\n <div>上传封面</div>\n </ion-button>\n \x3c!-- } --\x3e\n }\n \x3c!-- 分享 --\x3e\n \x3c!-- (click)="shareArticle()" --\x3e\n <ion-button (click)="openOverlay()">\n <ion-icon slot="icon-only" name="share"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<div class="sharetOverlay" (click)="closeOverlay()" *ngIf="isShare">\n\n <div class="overlay-content">\n <img src="https://static.ws.126.net/163/frontend/backflow-ssr/article/share-cover.98543a0088a4.png" alt="">\n <ion-icon style="color: white;" name="ellipsis-horizontal"></ion-icon>\n\n </div>\n</div>\n<ion-content>\n <div class="page">\n <div style="background-color: #1e1f22;">\n \x3c!-- <div class="btn">\n <button mat-raised-button color="primary">\n <span nz-icon nzType="close" nzTheme="outline"></span>\n </button>\n </div> --\x3e\n \n \x3c!-- 轮播图 --\x3e\n <div class="swiper" (wheel)="onScroll($event)" *ngIf="bannerList?.length">\n <div class="swiper-wrapper">\n <div class="swiper-slide bg-purple-blue" *ngFor="let imgUrl of bannerList">\n <img [src]="imgUrl" alt="" srcset="">\n </div>\n </div>\n </div>\n \n \x3c!-- 标题、关键字 --\x3e\n <div class="article-header">\n <h1 style="color: #5a55d1 !important;">{{article?.get(\'title\')}}</h1>\n </div>\n <div class="chip-list">关键字:\n \x3c!-- <mat-chip *ngFor="let keyword of article?.get(\'keywords\')">{{keyword}}</mat-chip> --\x3e\n <span class="cueWord" *ngFor="let keyword of article?.get(\'keywords\')">\n #{{keyword}}\n </span>\n </div>\n\n @if(isAuthor){\n <div class="article-info">\n <ng-container *ngIf="article?.get(\'writingOptions\')">\n <div (click)="handleNavEvent(\'options\')">设 定:\n \x3c!-- <mat-chip (click)="handleNavEvent(\'outline\')" [disabled]="!article?.get(\'outlineJson\')">\n 大纲\n </mat-chip> --\x3e\n \x3c!-- <mat-chip *ngIf="article?.get(\'writingOptions\')?.writingStyle">{{article?.get(\'writingOptions\')?.writingStyle}}</mat-chip>\n <mat-chip *ngIf="article?.get(\'writingOptions\')?.wordCount">约{{article?.get(\'writingOptions\')?.wordCount}}字</mat-chip> --\x3e\n <span class="cueWord" *ngIf="article?.get(\'writingOptions\')?.writingStyle">{{article?.get(\'writingOptions\')?.writingStyle}}</span>\n <span class="cueWord" *ngIf="article?.get(\'writingOptions\')?.wordCount">约{{article?.get(\'writingOptions\')?.wordCount}}字</span>\n </div>\n </ng-container>\n <ng-container *ngIf="article?.get(\'outlineJson\')">\n <div (click)="handleNavEvent(\'outline\')">提 纲:\n \x3c!-- <mat-chip>{{article?.get(\'outlineJson\') | outlineCount}}字</mat-chip> --\x3e\n <span class="cueWord">{{article?.get(\'outlineJson\') | outlineCount}}字</span>\n </div>\n </ng-container>\n <div *ngIf="article?.id" (click)="handleNavEvent(\'draft\')">稿件箱:\n \x3c!-- <mat-chip>{{draftServ.DraftCountMap?.[article?.id||\'\']?.total || 0}}篇</mat-chip> --\x3e\n <span class="cueWord">{{draftServ.DraftCountMap?.[article?.id||\'\']?.total || 0}}篇</span>\n </div>\n </div>\n }\n \n \x3c!-- 文章内容 --\x3e\n <div class="content">\n <ng-container *ngFor="let item of article?.get(\'contentArray\');let index=index;" >\n \x3c!-- 章节信息 --\x3e\n \x3c!-- <h2 style="margin:5px 0px;" *ngIf="article?.get(\'outlineJson\')?.sections?.[index]?.title">{{article?.get(\'outlineJson\')?.sections?.[index]?.title}}</h2> --\x3e\n <div class="content-block" [innerHTML]="(previewStyle+item?.content)| nzSanitizer: \'html\'"></div>\n </ng-container>\n <div style="height:100px;width:100%;"></div>\n </div>\n </div>\n\n </div>\n\n</ion-content>\n\n<ion-footer class="ion-no-border">\n <ion-toolbar>\n @if(article?.get("author")){\n <ion-buttons slot="start">\n <ion-button>\n <div class="author">\n @if(article?.get("author")?.get("nickname")){ \n <app-comp-user-avatar [user]="article?.get(\'author\')"></app-comp-user-avatar>\n }\n <span>\n {{article?.get("author")?.get("nickname") || (article?.get("author")?.get("realname")| secretText)}}\n </span>\n </div>\n </ion-button>\n </ion-buttons>\n }\n @if(article?.id){\n <ion-buttons slot="end">\n @if(isAuthor){\n <ion-button (click)="delete()" color="medium" size="small">\n <ion-icon slot="icon-only" name="trash"></ion-icon>\n </ion-button>\n }\n <ion-button color="medium" size="small">\n <span class="count">{{article?.get("viewCount")||""}}</span>\n <ion-icon slot="icon-only" name="eye-outline"></ion-icon>\n </ion-button>\n <ion-button [color]="articleServ?.likeMap[article?.id||\'666\']?\'danger\':\'medium\'" size="small" (click)="articleServ.likeArticle(article)">\n <span class="count">{{article?.get("likeCount")||""}}</span>\n <ion-icon slot="icon-only" [name]="\'heart\'+(articleServ?.likeMap[article?.id||\'666\']?\'\':\'-outline\')"></ion-icon>\n </ion-button>\n <ion-button [color]="articleServ?.collectMap[article?.id||\'666\']?\'warn\':\'medium\'" size="small" (click)="articleServ.likeArticle(article,\'collect\')">\n <span class="count">{{article?.get("collectCount")||""}}</span>\n <ion-icon slot="icon-only" [name]="\'star\'+(articleServ?.collectMap[article?.id||\'666\']?\'\':\'-outline\')"></ion-icon>\n </ion-button>\n \x3c!-- <ion-button color="medium" size="small">\n <span class="count">{{article?.get("commentCount")||""}}</span>\n <ion-icon slot="icon-only" name="chatbubble-outline"></ion-icon>\n </ion-button> --\x3e\n </ion-buttons>\n }\n\n </ion-toolbar>\n</ion-footer>',styles:[":host-context(body.dark) .page{background:var(--background-black);background-color:#1e1f22;color:#ddd!important}:host-context(body.dark) .page h1,:host-context(body.dark) .page h2,:host-context(body.dark) .page h3,:host-context(body.dark) .page h4,:host-context(body.dark) .page h5,:host-context(body.dark) .page h6{color:#ddd!important}:host-context(body.dark) .page .content-block{color:#ddd!important;font-size:1.1rem}:host-context(body.dark) .page .content-block h1,:host-context(body.dark) .page .content-block h2,:host-context(body.dark) .page .content-block h3,:host-context(body.dark) .page .content-block h4,:host-context(body.dark) .page .content-block h5,:host-context(body.dark) .page .content-block h6{color:#ddd!important}:host-context(body.dark) .page .toggle-text{color:#ddd!important}.page{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:flex;flex-direction:column;padding:10px;position:relative}.page .btn{z-index:999;position:fixed;top:0;right:0}.page .btn>button{width:80px}.page .article-info{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:0% 3%}.page .article-info div{margin-bottom:3px;display:flex;font-size:1.1rem}.page .article-info div mat-chip{margin-right:3px}.page .article-info div .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .article-header{display:flex;flex-direction:column;justify-content:center;align-items:center}.page .article-header h1{color:#5a55d1!important}.page .chip-list{display:flex;justify-content:flex-start;margin-top:30px;padding:0% 3%;font-size:1.1rem;flex-wrap:wrap}.page .chip-list>mat-chip{margin:0}.page .chip-list .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .content{padding:12px;width:100%}.swiper{width:100%}.swiper .swiper-slide{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.swiper .swiper-slide img{object-fit:cover}.count{margin-top:-17px}.author{display:flex;align-items:center;text-align:left}.author span{margin-left:7px}.sharetOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:999}.sharetOverlay .overlay-content{position:absolute;top:0;width:100%;padding:20px;box-shadow:0 2px 10px #0000001a}.sharetOverlay .overlay-content ion-icon{position:absolute;top:0;right:11px;font-size:2em;color:#000}\n"],dependencies:[{kind:"ngmodule",type:CommonModule},{kind:"directive",type:i6.NgForOf,selector:"[ngFor][ngForOf]",inputs:["ngForOf","ngForTrackBy","ngForTemplate"]},{kind:"directive",type:i6.NgIf,selector:"[ngIf]",inputs:["ngIf","ngIfThen","ngIfElse"]},{kind:"ngmodule",type:MatToolbarModule},{kind:"ngmodule",type:MatCardModule},{kind:"ngmodule",type:MatChipsModule},{kind:"ngmodule",type:MatButtonModule},{kind:"ngmodule",type:MatSlideToggleModule},{kind:"component",type:i7.MatSlideToggle,selector:"mat-slide-toggle",inputs:["name","id","labelPosition","aria-label","aria-labelledby","aria-describedby","required","color","disabled","disableRipple","tabIndex","checked","hideIcon"],outputs:["change","toggleChange"],exportAs:["matSlideToggle"]},{kind:"ngmodule",type:NzPipesModule},{kind:"pipe",type:i8.NzSanitizerPipe,name:"nzSanitizer"},{kind:"ngmodule",type:NzIconModule},{kind:"component",type:IonContent,selector:"ion-content",inputs:["color","fixedSlotPlacement","forceOverscroll","fullscreen","scrollEvents","scrollX","scrollY"]},{kind:"component",type:IonToolbar,selector:"ion-toolbar",inputs:["color","mode"]},{kind:"component",type:IonTitle,selector:"ion-title",inputs:["color","size"]},{kind:"component",type:IonHeader,selector:"ion-header",inputs:["collapse","mode","translucent"]},{kind:"component",type:IonButtons,selector:"ion-buttons",inputs:["collapse"]},{kind:"component",type:IonButton,selector:"ion-button",inputs:["buttonType","color","disabled","download","expand","fill","form","href","mode","rel","routerAnimation","routerDirection","shape","size","strong","target","type"]},{kind:"component",type:IonIcon,selector:"ion-icon",inputs:["color","flipRtl","icon","ios","lazy","md","mode","name","sanitize","size","src"]},{kind:"component",type:IonFooter,selector:"ion-footer",inputs:["collapse","mode","translucent"]},{kind:"pipe",type:OutlineCountPipe,name:"outlineCount"},{kind:"pipe",type:SecretTextPipe,name:"secretText"},{kind:"component",type:CompUserAvatarComponent,selector:"app-comp-user-avatar",inputs:["user"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:FmArticlePreviewComponent,decorators:[{type:Component,args:[{selector:"fm-article-preview",standalone:!0,imports:[CommonModule,MatToolbarModule,MatCardModule,MatChipsModule,MatButtonModule,MatSlideToggleModule,MatChipsModule,NzPipesModule,NzIconModule,IonContent,IonToolbar,IonTitle,IonHeader,IonButtons,IonButton,IonIcon,IonFooter,IonToolbar,OutlineCountPipe,SecretTextPipe,CompUserAvatarComponent],template:'<ion-header [translucent]="true" collapse="fade" class="ion-no-border">\n <ion-toolbar>\n \x3c!-- 返回 --\x3e\n <ion-buttons slot="secondary">\n <ion-button (click)="back()">\n <ion-icon slot="icon-only" name="arrow-back-circle"></ion-icon>\n </ion-button>\n @if(isAuthor){\n @if(isDisplayPublic===true){\n <div style="display:flex;justify-content: center;align-items: center;margin-left: 20px;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div>\n }\n }\n </ion-buttons>\n <ion-title style="font-size: 1.3rem;font-weight: bold;">文章预览</ion-title>\n <ion-buttons slot="primary">\n \x3c!-- 编辑 --\x3e\n @if(isAuthor){\n \x3c!-- <div style="display:flex;justify-content: center;align-items: center;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div> --\x3e\n @if(isDisplayEdit===true){\n <ion-button (click)="editArticle()" style="display: none;">\n <ion-icon slot="icon-only" name="create"></ion-icon>\n </ion-button>\n }\n }\n \x3c!-- 上传轮播图 --\x3e\n @if(isAuthor){\n \x3c!-- <div style="display:flex;justify-content: center;align-items: center;">\n <mat-slide-toggle [checked]="article?.get(\'isPublic\')" (change)="onPublicChange($event)"></mat-slide-toggle>\n <span class="toggle-text">公开</span>\n </div> --\x3e\n \x3c!-- @if(isDisplayUploadImage===true){ --\x3e\n <ion-button (click)="openUploadBanner()">\n \x3c!-- <ion-icon slot="icon-only" name="create"></ion-icon> --\x3e\n <div>上传封面</div>\n </ion-button>\n \x3c!-- } --\x3e\n }\n \x3c!-- 分享 --\x3e\n \x3c!-- (click)="shareArticle()" --\x3e\n <ion-button (click)="openOverlay()">\n <ion-icon slot="icon-only" name="share"></ion-icon>\n </ion-button>\n </ion-buttons>\n </ion-toolbar>\n</ion-header>\n<div class="sharetOverlay" (click)="closeOverlay()" *ngIf="isShare">\n\n <div class="overlay-content">\n <img src="https://static.ws.126.net/163/frontend/backflow-ssr/article/share-cover.98543a0088a4.png" alt="">\n <ion-icon style="color: white;" name="ellipsis-horizontal"></ion-icon>\n\n </div>\n</div>\n<ion-content>\n <div class="page">\n <div style="background-color: #1e1f22;">\n \x3c!-- <div class="btn">\n <button mat-raised-button color="primary">\n <span nz-icon nzType="close" nzTheme="outline"></span>\n </button>\n </div> --\x3e\n \n \x3c!-- 轮播图 --\x3e\n <div class="swiper" (wheel)="onScroll($event)" *ngIf="bannerList?.length">\n <div class="swiper-wrapper">\n <div class="swiper-slide bg-purple-blue" *ngFor="let imgUrl of bannerList">\n <img [src]="imgUrl" alt="" srcset="">\n </div>\n </div>\n </div>\n \n \x3c!-- 标题、关键字 --\x3e\n <div class="article-header">\n <h1 style="color: #5a55d1 !important;">{{article?.get(\'title\')}}</h1>\n </div>\n <div class="chip-list">关键字:\n \x3c!-- <mat-chip *ngFor="let keyword of article?.get(\'keywords\')">{{keyword}}</mat-chip> --\x3e\n <span class="cueWord" *ngFor="let keyword of article?.get(\'keywords\')">\n #{{keyword}}\n </span>\n </div>\n\n @if(isAuthor){\n <div class="article-info">\n <ng-container *ngIf="article?.get(\'writingOptions\')">\n <div (click)="handleNavEvent(\'options\')">设 定:\n \x3c!-- <mat-chip (click)="handleNavEvent(\'outline\')" [disabled]="!article?.get(\'outlineJson\')">\n 大纲\n </mat-chip> --\x3e\n \x3c!-- <mat-chip *ngIf="article?.get(\'writingOptions\')?.writingStyle">{{article?.get(\'writingOptions\')?.writingStyle}}</mat-chip>\n <mat-chip *ngIf="article?.get(\'writingOptions\')?.wordCount">约{{article?.get(\'writingOptions\')?.wordCount}}字</mat-chip> --\x3e\n <span class="cueWord" *ngIf="article?.get(\'writingOptions\')?.writingStyle">{{article?.get(\'writingOptions\')?.writingStyle}}</span>\n <span class="cueWord" *ngIf="article?.get(\'writingOptions\')?.wordCount">约{{article?.get(\'writingOptions\')?.wordCount}}字</span>\n </div>\n </ng-container>\n <ng-container *ngIf="article?.get(\'outlineJson\')">\n <div (click)="handleNavEvent(\'outline\')">提 纲:\n \x3c!-- <mat-chip>{{article?.get(\'outlineJson\') | outlineCount}}字</mat-chip> --\x3e\n <span class="cueWord">{{article?.get(\'outlineJson\') | outlineCount}}字</span>\n </div>\n </ng-container>\n <div *ngIf="article?.id" (click)="handleNavEvent(\'draft\')">稿件箱:\n \x3c!-- <mat-chip>{{draftServ.DraftCountMap?.[article?.id||\'\']?.total || 0}}篇</mat-chip> --\x3e\n <span class="cueWord">{{draftServ.DraftCountMap?.[article?.id||\'\']?.total || 0}}篇</span>\n </div>\n </div>\n }\n \n \x3c!-- 文章内容 --\x3e\n <div class="content">\n <ng-container *ngFor="let item of article?.get(\'contentArray\');let index=index;" >\n \x3c!-- 章节信息 --\x3e\n \x3c!-- <h2 style="margin:5px 0px;" *ngIf="article?.get(\'outlineJson\')?.sections?.[index]?.title">{{article?.get(\'outlineJson\')?.sections?.[index]?.title}}</h2> --\x3e\n <div class="content-block" [innerHTML]="(previewStyle+item?.content)| nzSanitizer: \'html\'"></div>\n </ng-container>\n <div style="height:100px;width:100%;"></div>\n </div>\n </div>\n\n </div>\n\n</ion-content>\n\n<ion-footer class="ion-no-border">\n <ion-toolbar>\n @if(article?.get("author")){\n <ion-buttons slot="start">\n <ion-button>\n <div class="author">\n @if(article?.get("author")?.get("nickname")){ \n <app-comp-user-avatar [user]="article?.get(\'author\')"></app-comp-user-avatar>\n }\n <span>\n {{article?.get("author")?.get("nickname") || (article?.get("author")?.get("realname")| secretText)}}\n </span>\n </div>\n </ion-button>\n </ion-buttons>\n }\n @if(article?.id){\n <ion-buttons slot="end">\n @if(isAuthor){\n <ion-button (click)="delete()" color="medium" size="small">\n <ion-icon slot="icon-only" name="trash"></ion-icon>\n </ion-button>\n }\n <ion-button color="medium" size="small">\n <span class="count">{{article?.get("viewCount")||""}}</span>\n <ion-icon slot="icon-only" name="eye-outline"></ion-icon>\n </ion-button>\n <ion-button [color]="articleServ?.likeMap[article?.id||\'666\']?\'danger\':\'medium\'" size="small" (click)="articleServ.likeArticle(article)">\n <span class="count">{{article?.get("likeCount")||""}}</span>\n <ion-icon slot="icon-only" [name]="\'heart\'+(articleServ?.likeMap[article?.id||\'666\']?\'\':\'-outline\')"></ion-icon>\n </ion-button>\n <ion-button [color]="articleServ?.collectMap[article?.id||\'666\']?\'warn\':\'medium\'" size="small" (click)="articleServ.likeArticle(article,\'collect\')">\n <span class="count">{{article?.get("collectCount")||""}}</span>\n <ion-icon slot="icon-only" [name]="\'star\'+(articleServ?.collectMap[article?.id||\'666\']?\'\':\'-outline\')"></ion-icon>\n </ion-button>\n \x3c!-- <ion-button color="medium" size="small">\n <span class="count">{{article?.get("commentCount")||""}}</span>\n <ion-icon slot="icon-only" name="chatbubble-outline"></ion-icon>\n </ion-button> --\x3e\n </ion-buttons>\n }\n\n </ion-toolbar>\n</ion-footer>',styles:[":host-context(body.dark) .page{background:var(--background-black);background-color:#1e1f22;color:#ddd!important}:host-context(body.dark) .page h1,:host-context(body.dark) .page h2,:host-context(body.dark) .page h3,:host-context(body.dark) .page h4,:host-context(body.dark) .page h5,:host-context(body.dark) .page h6{color:#ddd!important}:host-context(body.dark) .page .content-block{color:#ddd!important;font-size:1.1rem}:host-context(body.dark) .page .content-block h1,:host-context(body.dark) .page .content-block h2,:host-context(body.dark) .page .content-block h3,:host-context(body.dark) .page .content-block h4,:host-context(body.dark) .page .content-block h5,:host-context(body.dark) .page .content-block h6{color:#ddd!important}:host-context(body.dark) .page .toggle-text{color:#ddd!important}.page{-webkit-user-select:none;user-select:none;width:100%;height:100%;display:flex;flex-direction:column;padding:10px;position:relative}.page .btn{z-index:999;position:fixed;top:0;right:0}.page .btn>button{width:80px}.page .article-info{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:center;padding:0% 3%}.page .article-info div{margin-bottom:3px;display:flex;font-size:1.1rem}.page .article-info div mat-chip{margin-right:3px}.page .article-info div .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .article-header{display:flex;flex-direction:column;justify-content:center;align-items:center}.page .article-header h1{color:#5a55d1!important}.page .chip-list{display:flex;justify-content:flex-start;margin-top:30px;padding:0% 3%;font-size:1.1rem;flex-wrap:wrap}.page .chip-list>mat-chip{margin:0}.page .chip-list .cueWord{display:flex;flex-wrap:wrap;margin-right:10px}.page .content{padding:12px;width:100%}.swiper{width:100%}.swiper .swiper-slide{display:flex;flex-wrap:wrap;justify-content:center;align-items:center}.swiper .swiper-slide img{object-fit:cover}.count{margin-top:-17px}.author{display:flex;align-items:center;text-align:left}.author span{margin-left:7px}.sharetOverlay{position:fixed;top:0;left:0;width:100%;height:100%;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:999}.sharetOverlay .overlay-content{position:absolute;top:0;width:100%;padding:20px;box-shadow:0 2px 10px #0000001a}.sharetOverlay .overlay-content ion-icon{position:absolute;top:0;right:11px;font-size:2em;color:#000}\n"]}]}],ctorParameters:()=>[{type:i1.ActivatedRoute},{type:i1.Router},{type:i2.MatDialog},{type:i3.NavController},{type:i3.ModalController},{type:i3.AnimationController},{type:i4.ArticleService},{type:i3.AlertController},{type:i5.DraftService}],propDecorators:{article:[{type:Input}],isDisplayEdit:[{type:Input}],isDisplayPublic:[{type:Input}],isDisplayUploadImage:[{type:Input}]}});export class DialogArticlePreview{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:DialogArticlePreview,deps:[{token:i2.MatDialogRef},{token:MAT_DIALOG_DATA}],target:i0.ɵɵFactoryTarget.Component})}static{this.ɵcmp=i0.ɵɵngDeclareComponent({minVersion:"14.0.0",version:"17.3.12",type:DialogArticlePreview,isStandalone:!0,selector:"article-preview-dialog",ngImport:i0,template:'<fm-article-preview [article]="data?.article"></fm-article-preview>',isInline:!0,styles:[""],dependencies:[{kind:"ngmodule",type:MatDialogModule},{kind:"component",type:FmArticlePreviewComponent,selector:"fm-article-preview",inputs:["article","isDisplayEdit","isDisplayPublic","isDisplayUploadImage"]}]})}}i0.ɵɵngDeclareClassMetadata({minVersion:"12.0.0",version:"17.3.12",ngImport:i0,type:DialogArticlePreview,decorators:[{type:Component,args:[{selector:"article-preview-dialog",template:'<fm-article-preview [article]="data?.article"></fm-article-preview>',standalone:!0,imports:[MatDialogModule,FmArticlePreviewComponent]}]}],ctorParameters:()=>[{type:i2.MatDialogRef},{type:void 0,decorators:[{type:Inject,args:[MAT_DIALOG_DATA]}]}]});export async function openUploadBannerModal(t,e){const n=await t.create({component:CompUploadBookBannersComponent,componentProps:{articleId:e},breakpoints:[.5,.8,1],initialBreakpoint:.8});await n.present();const{data:i,role:o}=await n.onWillDismiss();return"confirm"===o&&i?.success?(console.log("新章节:",i.banner),i.banner):null}
|
|
9
|
+
var MODULE_PATH_NEED = `6K+l5paH5Lu25piv5pys6aG555uu55qE5LiA6YOo5YiGIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBDb21wb25lbnRzIGluIEZtb2RlIEluYy4KICAgIOeJiOadg+aJgOaciSDCqSDmnKrmnaXpo57pqawgwqkg5rGf6KW/6ISR5o6n56eR5oqA5pyJ6ZmQ5YWs5Y+4IENvcHlyaWdodCDCqSBGbW9kZSBUZWNobm9sb2d5IENvLiwgTHRkLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICDkuKXnpoHlnKjmnKrnu4/mjojmnYPnmoTmg4XlhrXkuIvvvIzpgJrov4fku7vkvZXlqpLku4vlpI3liLbmraTmlofku7YgVW5hdXRob3JpemVkIGNvcHlpbmcgb2YgdGhpcyBmaWxlLCB2aWEgYW55IG1lZGl1bSBpcyBzdHJpY3RseSBwcm9oaWJpdGVkCiAgICDor6Xmlofku7bmmK/kuJPmnInnmoTmnLrlr4bmlofku7YgUHJvcHJpZXRhcnkgYW5kIGNvbmZpZGVudGlhbAogICAKICAgIENvcHlyaWdodCAyMDIxLW5vdyBGbW9kZSBJbmMuIHN1cHBvcnRAZm1vZGUuY24uIDE4NjA3MDA3MDczLgogICAg5L+d55WZ5omA5pyJ5p2D5YipIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUEFUSDovaG9tZS9yeWFuL3dvcmtzcGFjZS9ub3ZhL25vdmEtYWRtaW4vZGlzdC9mbW9kZS1uZy9lc20yMDIyL2xpYi90ZXh0L2ZtLWFydGljbGUtZWRpdG9yL2ZtLWFydGljbGUtcHJldmlldy9mbS1hcnRpY2xlLXByZXZpZXcuY29tcG9uZW50Lm1qcw==`
|
|
10
|
+
|